diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..80d73cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.o +*.yuv diff --git a/README.md b/README.md index 7153415..622c9c7 100644 --- a/README.md +++ b/README.md @@ -4,35 +4,3 @@ 流媒体监控服务器 一个 demo -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 码云特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 -5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) \ No newline at end of file diff --git a/device/mpp/Makefile.param b/device/mpp/Makefile.param new file mode 100644 index 0000000..c432574 --- /dev/null +++ b/device/mpp/Makefile.param @@ -0,0 +1,207 @@ +# Makefile.param +# Only global variable should be defined here. +# All the variables must be used as "export" and "?=". +# Otherwise, there will be some errors, when Makefile.param is nested. + +# Use this file as the following sample +# ifeq ($(PARAM_FILE), ) +# PARAM_FILE:=../Makefile.param +# include $(PARAM_FILE) +# endif + +# Define the default OS link directory. +export HIWORK_PATH?=/hiwork + +export ARCH=arm +export MPP_BUILD=n + +#Change ISP parameter config mode +#Default "y" is ini config mode, else "n" source code config mode +export ISP_INI_CONFIG=n + +# use HIARCH indicate chip, use libc to choose cross compiler. +export HIARCH?=hi3518e +export LIBC?=uclibc + +# Whether support the debug information. HI_DEBUG or HI_RELEASE +export HIDBG?=HI_RELEASE + +# Whether open -g +#export HIGDB?=y +export HIGDB?=n + +# FPGA board or not +export FPGA?=n + +ifeq ($(HIARCH), ) +$(error HIARCH not defined! Please check!) +endif + +ifeq ($(LIBC), ) +$(error LIBC not defined! Please check!) +endif + +ifeq ($(HIARCH),hi3516a) + export HICHIP?=0x3516A100 + export ARCH_DIR?=hi3516a +endif + +ifeq ($(HIARCH),hi3519) + export HICHIP?=0x3519100 + export ARCH_DIR?=hi3519 +endif + +ifeq ($(HIARCH),hi3518e) + export HICHIP?=0x3518E200 + export ARCH_DIR?=hi3518e +endif + +ifeq ($(HIDBG),HI_DEBUG) + DBG_FLAG=0 +else + DBG_FLAG=0 +endif + + +ifeq ($(HIARCH),hi3536) + export PRODUCT?=NVRDVR +else + export PRODUCT?=IPC +endif + +# use C01 to indicate uclibc, C02 to indicate glibc, C00 to indicate FPGA. +ifeq ($(LIBC),glibc) + export CVER?=.C$(DBG_FLAG)2 +else ifeq ($(FPGA), y) + export CVER?=.C$(DBG_FLAG)0 +else + export CVER?=.C$(DBG_FLAG)1 +endif + +ifeq ($(FPGA),y) + export HI_FPGA:=HI_FPGA + export EXTDRV:=extdrv/$(HIARCH)_fpga +else + export HI_FPGA:=HI_XXXX + export EXTDRV:=extdrv/$(HIARCH) +endif + +# Get the local SDK_ROOT path or RELEASE_ROOT path by PARAM_FILE. +# PARAM_FILE is configed at Makefile before include this file +export PARAM_FILE +export SDK_PATH?=$(shell cd $(shell pwd)/`dirname $(PARAM_FILE)`/..; pwd) +export MPP_PATH?=$(shell cd $(shell pwd)/`dirname $(PARAM_FILE)`; pwd) +export SHELF_ROOT?=$(MPP_PATH)/code/shelf +export DRV_ROOT?=$(SDK_PATH)/drv + +############################################################################## +export KERNEL_NAME="linux-3.4.y" + +ifeq ($(HIARCH), hi3519) + export KERNEL_NAME="linux-3.10.y" +endif + +# Allocated the linux position +ifneq ($(shell ls $(HIWORK_PATH)/osdrv$(HIARCH)$(CVER)), ) + export LINUX_ROOT?=$(HIWORK_PATH)/osdrv$(HIARCH)$(CVER)/opensource/kernel/$(KERNEL_NAME) +else + export LINUX_ROOT?=$(SDK_PATH)/osdrv/opensource/kernel/$(KERNEL_NAME) +endif +############################################################################## + +# Define cross compiler +ifeq ($(LIBC),glibc) + export CROSS_COMPILE?= arm-hisiv400-linux- + export CROSS?= arm-hisiv400-linux- +else + export CROSS_COMPILE?=arm-hisiv300-linux- + export CROSS?=arm-hisiv300-linux- +endif + +export CC:=$(CROSS)gcc +export CPP:=$(CROSS)g++ +export AR:=$(CROSS)ar + +export MPP_CFLAGS:= -Wall +export DRV_CFLAGS:= + +ifeq ($(HIGDB), y) + MPP_CFLAGS += -g +endif + +# Define the object output directory +ifeq ($(MPP_BUILD), y) + REL_DIR=$(SDK_PATH)/mpp/release/$(HIARCH) + SAMPLE_DIR=$(SDK_PATH)/mpp/sample/$(HIARCH) +else + REL_DIR=$(SDK_PATH)/mpp + EXTDRV=extdrv + SAMPLE_DIR=$(SDK_PATH)/mpp/sample +endif + +export REL_INC := $(REL_DIR)/include +export REL_LIB := $(REL_DIR)/lib +export REL_KO := $(REL_DIR)/ko + +# Define the param of audio +export AUDIO_PATH?=$(SDK_PATH)/mpp/component/audio/lib/$(CROSS) + +export AUDIO_LIBA ?= $(REL_LIB)/libVoiceEngine.a\ + $(REL_LIB)/libupvqe.a\ + $(REL_LIB)/libdnvqe.a + +export AUDIO_LIBS ?= $(REL_LIB)/libVoiceEngine.so\ + $(REL_LIB)/libupvqe.so\ + $(REL_LIB)/libdnvqe.so + +# include the audio config file of platform + + +# Define the lib of jpeg codec +export JPEGD_PATH?=$(SDK_PATH)/mpp/component/jpegd +export JPEGD_LIBA:=$(REL_LIB)/libjpeg.a + +export HIMEM_LIBA := $(REL_LIB)/libmem.a + +############################################################################### +# LIB GLOBAL CFLAGS +ifeq ($(HIARCH),hi3516a) + export LIBS_CFLAGS = -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -ffunction-sections + LIBS_CFLAGS += -mno-unaligned-access -fno-aggressive-loop-optimizations -ldl + + export LIBS_LD_CFLAGS = -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 + LIBS_LD_CFLAGS += -mno-unaligned-access -fno-aggressive-loop-optimizations -ldl +endif +ifeq ($(HIARCH),hi3519) + export LIBS_CFLAGS = -ldl + + export LIBS_LD_CFLAGS = -ldl +endif + +# DRV GLOBAL CFLAGS +#DRV_CFLAGS += -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4 +############################################################################### + +#********************* Macro for version management***************************** +VER_X ?= 1 +VER_Y ?= 0 +VER_Z ?= 0 +VER_P ?= 0 +VER_B ?= 10 +MPP_CFLAGS += -DVER_X=$(VER_X) -DVER_Y=$(VER_Y) -DVER_Z=$(VER_Z) -DVER_P=$(VER_P) -DVER_B=$(VER_B) +#******************************************************************************* + +# include the config file of platform +-include $(SDK_PATH)/mpp/configs/config.mk + +ifeq ($(CONFIG_JPEGEDCF), y) + MPP_CFLAGS += -D ENABLE_JPEGEDCF +endif + +ifeq ($(CONFIG_LOWDELAY), y) + MPP_CFLAGS += -DENABLE_LOWDELAY +endif + + + +# End!! diff --git a/device/mpp/component/isp/lib/lib_cmoscfg.a b/device/mpp/component/isp/lib/lib_cmoscfg.a new file mode 100644 index 0000000..e24c417 Binary files /dev/null and b/device/mpp/component/isp/lib/lib_cmoscfg.a differ diff --git a/device/mpp/component/isp/lib/lib_cmoscfg.so b/device/mpp/component/isp/lib/lib_cmoscfg.so new file mode 100644 index 0000000..7da9864 Binary files /dev/null and b/device/mpp/component/isp/lib/lib_cmoscfg.so differ diff --git a/device/mpp/component/isp/lib/libsns_9m034.a b/device/mpp/component/isp/lib/libsns_9m034.a new file mode 100644 index 0000000..3cfaa09 Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_9m034.a differ diff --git a/device/mpp/component/isp/lib/libsns_9m034.so b/device/mpp/component/isp/lib/libsns_9m034.so new file mode 100644 index 0000000..45b55ba Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_9m034.so differ diff --git a/device/mpp/component/isp/lib/libsns_ar0130.a b/device/mpp/component/isp/lib/libsns_ar0130.a new file mode 100644 index 0000000..7e7d0d6 Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_ar0130.a differ diff --git a/device/mpp/component/isp/lib/libsns_ar0130.so b/device/mpp/component/isp/lib/libsns_ar0130.so new file mode 100644 index 0000000..bcb6d05 Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_ar0130.so differ diff --git a/device/mpp/component/isp/lib/libsns_ar0230.a b/device/mpp/component/isp/lib/libsns_ar0230.a new file mode 100644 index 0000000..dcf9f8d Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_ar0230.a differ diff --git a/device/mpp/component/isp/lib/libsns_ar0230.so b/device/mpp/component/isp/lib/libsns_ar0230.so new file mode 100644 index 0000000..9ada9fb Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_ar0230.so differ diff --git a/device/mpp/component/isp/lib/libsns_imx122.a b/device/mpp/component/isp/lib/libsns_imx122.a new file mode 100644 index 0000000..7f1b5c2 Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_imx122.a differ diff --git a/device/mpp/component/isp/lib/libsns_imx122.so b/device/mpp/component/isp/lib/libsns_imx122.so new file mode 100644 index 0000000..7bd3f8f Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_imx122.so differ diff --git a/device/mpp/component/isp/lib/libsns_mn34222.a b/device/mpp/component/isp/lib/libsns_mn34222.a new file mode 100644 index 0000000..fadf095 Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_mn34222.a differ diff --git a/device/mpp/component/isp/lib/libsns_mn34222.so b/device/mpp/component/isp/lib/libsns_mn34222.so new file mode 100644 index 0000000..d953c8b Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_mn34222.so differ diff --git a/device/mpp/component/isp/lib/libsns_ov9712.a b/device/mpp/component/isp/lib/libsns_ov9712.a new file mode 100644 index 0000000..cb61bf2 Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_ov9712.a differ diff --git a/device/mpp/component/isp/lib/libsns_ov9712.so b/device/mpp/component/isp/lib/libsns_ov9712.so new file mode 100644 index 0000000..09f3954 Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_ov9712.so differ diff --git a/device/mpp/component/isp/lib/libsns_ov9752.a b/device/mpp/component/isp/lib/libsns_ov9752.a new file mode 100644 index 0000000..7d0d230 Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_ov9752.a differ diff --git a/device/mpp/component/isp/lib/libsns_ov9752.so b/device/mpp/component/isp/lib/libsns_ov9752.so new file mode 100644 index 0000000..8232617 Binary files /dev/null and b/device/mpp/component/isp/lib/libsns_ov9752.so differ diff --git a/device/mpp/component/isp/sensor/Makefile b/device/mpp/component/isp/sensor/Makefile new file mode 100644 index 0000000..194162e --- /dev/null +++ b/device/mpp/component/isp/sensor/Makefile @@ -0,0 +1,16 @@ + +.PHONY:clean all rel +all: + @echo -e "\e[0;32;1m--Compiling 'sensor'... Configs as follow:\e[0;36;1m" + @echo ---- CROSS=$(CROSS) + @echo ---- HIARCH=$(HIARCH), HICHIP=$(HICHIP), CVER=$(CVER), HIDBG=$(HIDBG) + @echo ---- SDK_PATH=$(SDK_PATH) , PARAM_FILE=$(PARAM_FILE) + @echo ---- LINUX_ROOT=$(LINUX_ROOT) + @echo -e "\e[0m" + @for x in `find ./ -maxdepth 2 -mindepth 2 -name "Makefile" `; \ + do cd `dirname $$x`; if [ $$? ]; then make || exit 1; cd ../; fi; done + +clean: + @for x in `find ./ -maxdepth 2 -mindepth 2 -name "Makefile" `; \ + do cd `dirname $$x`; if [ $$? ]; then make clean; cd ../; fi; done + diff --git a/device/mpp/component/isp/sensor/aptina_9m034/Makefile b/device/mpp/component/isp/sensor/aptina_9m034/Makefile new file mode 100644 index 0000000..d3d45de --- /dev/null +++ b/device/mpp/component/isp/sensor/aptina_9m034/Makefile @@ -0,0 +1,75 @@ +# +# sensor lib Makefile +# + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../../../Makefile.param + include $(PARAM_FILE) +endif + +ISP_PATH := $(SDK_PATH)/mpp/component/isp +EXT_PATH := $(SDK_PATH)/mpp/$(EXTDRV) +3A_PATH := $(ISP_PATH)/3a +LIBPATH = $(ISP_PATH)/lib +OBJPATH = ./obj + +ifeq ($(CONFIG_GPIO_I2C),y) +HI_GPIO_I2C:=HI_GPIO_I2C +else +HI_GPIO_I2C:=HI_GPIO_XXX +endif + +ARFLAGS = rcv +ARFLAGS_SO = $(LIBS_LD_CFLAGS) +ARFLAGS_SO += -shared -fPIC -o +CFLAGS = -Wall -fPIC -D$(HI_FPGA) -D$(HI_GPIO_I2C) +CFLAGS += -O2 +CFLAGS += $(LIBS_CFLAGS) + +ifeq ($(ISP_INI_CONFIG), y) +CFLAGS += -D INIFILE_CONFIG_MODE +endif + +ifeq ($(HIGDB),HI_GDB) +CFLAGS += -g +endif + +ifeq ($(CONFIG_JPEGEDCF), y) + CFLAGS += -D ENABLE_JPEGEDCF +endif +BUS_DIR := $(EXT_PATH)/ssp-sony/ + +ISP_INC := $(ISP_PATH)/include +3A_INC := $(3A_PATH)/include +INC := -I$(BUS_DIR) -I$(REL_INC) -I$(ISP_INC) -I$(3A_INC) + +ifeq ($(CONFIG_GPIO_I2C), y) + INC += -I$(EXT_PATH)/gpio-i2c-ex + INC += -I$(EXT_PATH)/gpio-i2c +else + INC += -I$(EXT_PATH)/i2c + INC += -I$(EXT_PATH)/hi_i2c +endif + +COMPILE = $(CC) $(CFLAGS) $(DFLAGS) -lm + +$(OBJPATH)/%.o: ./%.c + @[ -e $(LIBPATH) ] || mkdir $(LIBPATH) + @[ -e $(OBJPATH) ] || mkdir $(OBJPATH) + @$(COMPILE) -o $@ -c $< $(INC) + +SRCS = $(wildcard ./*.c) +OBJS = $(SRCS:%.c=%.o) +OBJS := $(OBJS:./%=obj/%) + +TARGETLIB := $(LIBPATH)/libsns_9m034.a +TARGETLIB_SO := $(LIBPATH)/libsns_9m034.so + +all:$(TARGETLIB) +$(TARGETLIB):$(OBJS) + @($(AR) $(ARFLAGS) $(TARGETLIB) $(OBJS)) + @($(CC) $(ARFLAGS_SO) $(TARGETLIB_SO) $(OBJS)) + +clean: + @$(RM) -rf $(TARGETLIB) $(OBJS) + @$(RM) -rf $(LIBPATH) $(OBJPATH) diff --git a/device/mpp/component/isp/sensor/aptina_9m034/m034_cmos.c b/device/mpp/component/isp/sensor/aptina_9m034/m034_cmos.c new file mode 100644 index 0000000..be5f7e1 --- /dev/null +++ b/device/mpp/component/isp/sensor/aptina_9m034/m034_cmos.c @@ -0,0 +1,1611 @@ +#if !defined(__M034_CMOS_H_) +#define __M034_CMOS_H_ + +#include +#include +#include +#include "hi_comm_sns.h" +#include "hi_comm_video.h" +#include "hi_sns_ctrl.h" +#include "mpi_isp.h" +#include "mpi_ae.h" +#include "mpi_awb.h" +#include "mpi_af.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define M034_ID 9034 + +/* To change the mode of config. ifndef INIFILE_CONFIG_MODE, quick config mode.*/ +/* else, cmos_cfg.ini file config mode*/ +#ifdef INIFILE_CONFIG_MODE + +extern AE_SENSOR_DEFAULT_S g_AeDft[]; +extern AWB_SENSOR_DEFAULT_S g_AwbDft[]; +extern ISP_CMOS_DEFAULT_S g_IspDft[]; +extern HI_S32 Cmos_LoadINIPara(const HI_CHAR *pcName); +#else + +#endif + +/**************************************************************************** + * local variables * + ****************************************************************************/ + +extern const unsigned int sensor_i2c_addr; +extern unsigned int sensor_addr_byte; +extern unsigned int sensor_data_byte; + +#define EXPOSURE_TIME (0x3012) +#define ANALOG_GAIN (0x30B0) +#define DIGITAL_GAIN (0x305E) +#define FRAME_LINES (0x300A) +#define LINE_LEN_PCK (0x300C) + +#define SENSOR_720P_30FPS_MODE (1) +#define SENSOR_960P_30FPS_MODE (2) + +#define INCREASE_LINES (0) /* make real fps less than stand fps because NVR require*/ +#define FRAME_LINES_720P (750+INCREASE_LINES) +#define FRAME_LINES_960P (990+INCREASE_LINES) +#define LINE_LENGTH_PCK_720P_30FPS (3300) +#define LINE_LENGTH_PCK_960P_30FPS (2500) + +HI_U8 gu8SensorImageMode = SENSOR_720P_30FPS_MODE; +WDR_MODE_E genSensorMode = WDR_MODE_NONE; + +static HI_U32 gu32FullLinesStd = FRAME_LINES_720P; +static HI_U32 gu32FullLines = FRAME_LINES_720P; +static HI_U32 gu32LineLength = LINE_LENGTH_PCK_720P_30FPS; +static HI_BOOL bInit = HI_FALSE; +HI_BOOL bSensorInit = HI_FALSE; + +ISP_SNS_REGS_INFO_S g_stSnsRegsInfo = {0}; +ISP_SNS_REGS_INFO_S g_stPreSnsRegsInfo = {0}; + +#define PATHLEN_MAX 256 +#define CMOS_CFG_INI "9m034_cfg.ini" +static char pcName[PATHLEN_MAX] = "configs/9m034_cfg.ini"; + + +/* AE default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 6; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.03125; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 32 << pstAeSnsDft->u32ISPDgainShift; + + switch(genSensorMode) + { + default: + case WDR_MODE_NONE: /*linear mode*/ + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = g_AeDft[0].u8AeCompensation; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[0].u32MaxIntTimeTarget; + pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[0].u32MinIntTimeTarget; + + pstAeSnsDft->u32MaxAgain = 8192; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = g_AeDft[0].u32MaxAgainTarget; + pstAeSnsDft->u32MinAgainTarget = g_AeDft[0].u32MinAgainTarget; + + pstAeSnsDft->u32MaxDgain = 255; + pstAeSnsDft->u32MinDgain = 32; + pstAeSnsDft->u32MaxDgainTarget = g_AeDft[0].u32MaxDgainTarget; + pstAeSnsDft->u32MinDgainTarget = g_AeDft[0].u32MinDgainTarget; + + pstAeSnsDft->u32ISPDgainShift = g_AeDft[0].u32ISPDgainShift; + pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[0].u32MinISPDgainTarget; + pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[0].u32MaxISPDgainTarget; + break; + + case WDR_MODE_BUILT_IN: + pstAeSnsDft->au8HistThresh[0] = 0x20; + pstAeSnsDft->au8HistThresh[1] = 0x40; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = g_AeDft[1].u8AeCompensation; + + pstAeSnsDft->u32MaxIntTime = 675; + pstAeSnsDft->u32MinIntTime = 128; + pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[1].u32MaxIntTimeTarget; + pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[1].u32MinIntTimeTarget; + + pstAeSnsDft->u32MaxAgain = 8192; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = g_AeDft[1].u32MaxAgainTarget; + pstAeSnsDft->u32MinAgainTarget = g_AeDft[1].u32MinAgainTarget; + + pstAeSnsDft->u32MaxDgain = 255; + pstAeSnsDft->u32MinDgain = 32; + pstAeSnsDft->u32MaxDgainTarget = g_AeDft[1].u32MaxDgainTarget; + pstAeSnsDft->u32MinDgainTarget = g_AeDft[1].u32MinDgainTarget; + + pstAeSnsDft->u32ISPDgainShift = g_AeDft[1].u32ISPDgainShift; + pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[1].u32MinISPDgainTarget; + pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[1].u32MaxISPDgainTarget; + break; + } + return 0; +} + +#else + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 6; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.03125; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + + switch(genSensorMode) + { + default: + case WDR_MODE_NONE: /*linear mode*/ + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x40; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = 2; + + pstAeSnsDft->u32MaxAgain = 8192; /* (8mult)/0.0078125 = 1024 */ + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 255; + pstAeSnsDft->u32MinDgain = 32; + pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgain; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + + pstAeSnsDft->u32MaxISPDgainTarget = 4 << pstAeSnsDft->u32ISPDgainShift; + break; + + case WDR_MODE_BUILT_IN: + pstAeSnsDft->au8HistThresh[0] = 0x20; + pstAeSnsDft->au8HistThresh[1] = 0x40; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x40; + + pstAeSnsDft->u32MaxIntTime = 675; + pstAeSnsDft->u32MinIntTime = 128; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = 2; + + pstAeSnsDft->u32MaxAgain = 8192; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 255; + pstAeSnsDft->u32MinDgain = 32; + pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgain; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + + pstAeSnsDft->u32MaxISPDgainTarget = 32 << pstAeSnsDft->u32ISPDgainShift; + break; + } + return 0; +} + +#endif + +/* the function of sensor set fps */ +static HI_VOID cmos_fps_set(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + switch (genSensorMode) + { + default : + case WDR_MODE_NONE : + if (SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + gu32LineLength = (LINE_LENGTH_PCK_720P_30FPS * 30) / f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + gu32FullLinesStd = FRAME_LINES_720P; + } + else if (SENSOR_960P_30FPS_MODE == gu8SensorImageMode) + { + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + gu32LineLength = (LINE_LENGTH_PCK_960P_30FPS * 30) / f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + gu32FullLinesStd = FRAME_LINES_960P; + } + else + { + printf("Not support! gu8SensorImageMode:%d, f32Fps:%f\n", gu8SensorImageMode, f32Fps); + return; + } + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + break; + case WDR_MODE_BUILT_IN : + if (SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + if ((f32Fps == 30) || (f32Fps == 25)) + { + gu32LineLength = (LINE_LENGTH_PCK_720P_30FPS * 30) / f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + gu32FullLinesStd = FRAME_LINES_720P; + + } + else if (SENSOR_960P_30FPS_MODE == gu8SensorImageMode) + { + if ((f32Fps == 30) && (f32Fps == 25)) + { + gu32LineLength = (LINE_LENGTH_PCK_960P_30FPS * 30) / f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + gu32FullLinesStd = FRAME_LINES_960P; + } + else + { + printf("Not support! gu8SensorImageMode:%d, f32Fps:%f\n", gu8SensorImageMode, f32Fps); + return; + } + + pstAeSnsDft->u32MaxIntTime = 675; + break; + } + + + gu32LineLength = gu32LineLength > 0xFFFF ? 0xFFFF : gu32LineLength; + + //g_stSnsRegsInfo.astI2cData[3].u32Data = gu32FullLinesStd; + //g_stSnsRegsInfo.astI2cData[4].u32Data = gu32LineLength; + + //sensor_write_register(FRAME_LINES, gu32FullLinesStd); + sensor_write_register(LINE_LEN_PCK, gu32LineLength); + + pstAeSnsDft->f32Fps = f32Fps; + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd * f32Fps / 2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + + return; +} + + +static HI_VOID cmos_slow_framerate_set(HI_U32 u32FullLines, + AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + u32FullLines = (u32FullLines > 0xFFFF) ? 0xFFFF : u32FullLines; + gu32FullLines = u32FullLines; + + //g_stSnsRegsInfo.astI2cData[3].u32Data = gu32FullLines; + + sensor_write_register(FRAME_LINES, gu32FullLines); + + pstAeSnsDft->u32MaxIntTime = gu32FullLines - 2; + + return; +} + +/* while isp notify ae to update sensor regs, ae call these funcs. */ +static HI_VOID cmos_inttime_update(HI_U32 u32IntTime) +{ + g_stSnsRegsInfo.astI2cData[0].u32Data = u32IntTime; + + return; +} + +static HI_U32 analog_gain_table[4] = +{ + 1024, 2048, 4096, 8192 +}; + +static HI_VOID cmos_again_calc_table(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb) +{ + int i; + + if((HI_NULL == pu32AgainLin) ||(HI_NULL == pu32AgainDb)) + { + printf("null pointer when get ae sensor gain info value!\n"); + return; + } + + if (*pu32AgainLin >= analog_gain_table[3]) + { + *pu32AgainLin = analog_gain_table[3]; + *pu32AgainDb = 3; + return ; + } + + for (i = 1; i < 4; i++) + { + if (*pu32AgainLin < analog_gain_table[i]) + { + *pu32AgainLin = analog_gain_table[i - 1]; + *pu32AgainDb = i - 1; + break; + } + } + + return; +} + + +static HI_VOID cmos_gains_update(HI_U32 u32Again, HI_U32 u32Dgain) +{ + switch(u32Again) + { + case 0: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1300; + break; + case 1: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1310; + break; + case 2: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1320; + break; + case 3: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1330; + break; + } + + g_stSnsRegsInfo.astI2cData[2].u32Data = u32Dgain; + + return; +} + + +HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default; + pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set; + pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; + pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update; + pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update; + pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table; + + return 0; +} + + +/* AWB default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + HI_U8 i; + + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + pstAwbSnsDft->u16WbRefTemp = g_AwbDft[0].u16WbRefTemp; + + for(i= 0; i < 4; i++) + { + pstAwbSnsDft->au16GainOffset[i] = g_AwbDft[0].au16GainOffset[i]; + } + + for(i= 0; i < 6; i++) + { + pstAwbSnsDft->as32WbPara[i] = g_AwbDft[0].as32WbPara[i]; + } + memcpy(&pstAwbSnsDft->stCcm, &g_AwbDft[0].stCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_AwbDft[0].stAgcTbl, sizeof(AWB_AGC_TABLE_S)); + break; + + case WDR_MODE_BUILT_IN: + pstAwbSnsDft->u16WbRefTemp = g_AwbDft[1].u16WbRefTemp; + for(i= 0; i < 4; i++) + { + pstAwbSnsDft->au16GainOffset[i] = g_AwbDft[1].au16GainOffset[i]; + } + + for(i= 0; i < 6; i++) + { + pstAwbSnsDft->as32WbPara[i] = g_AwbDft[1].as32WbPara[i]; + } + + memcpy(&pstAwbSnsDft->stCcm, &g_AwbDft[1].stCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_AwbDft[1].stAgcTbl, sizeof(AWB_AGC_TABLE_S)); + break; + + } + return 0; +} + +#else + +static AWB_CCM_S g_stAwbCcm = +{ + 5120, + { + 0x01F1,0x80B0,0x8041, + 0x803E,0x0159,0x801B, + 0x0010,0x8094,0x0184, + }, + + 3633, + { + 0x01CE,0x8086,0x8048, + 0x805A,0x0168,0x800E, + 0x0002,0x80A2,0x01A0, + }, + + 2449, + { + 0x020B,0x80A9,0x8062, + 0x8051,0x0169,0x8018, + 0x0017,0x814B,0x0234, + } + +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTableLin = +{ + /* bvalid */ + 1, + + /* saturation */ + {0x80,0x80,0x7C,0x76,0x58,0x4c,0x40,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38} +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTableWDR = +{ + /* bvalid */ + 1, + + /* saturation */ + {0x80,0x80,0x7c,0x76,0x70,0x60,0x50,0x40,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38} +}; + + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + + pstAwbSnsDft->u16WbRefTemp = 5000; + + pstAwbSnsDft->au16GainOffset[0] = 0x1A5; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x187; + + pstAwbSnsDft->as32WbPara[0] = 0x0042; + pstAwbSnsDft->as32WbPara[1] = 0x0013; + pstAwbSnsDft->as32WbPara[2] = -0x00AB; + pstAwbSnsDft->as32WbPara[3] = 0x3318B; + pstAwbSnsDft->as32WbPara[4] = 0x80; + pstAwbSnsDft->as32WbPara[5] = -0x27CEA; + + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcm, sizeof(AWB_CCM_S)); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTableLin, sizeof(AWB_AGC_TABLE_S)); + break; + + case WDR_MODE_BUILT_IN: + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTableWDR, sizeof(AWB_AGC_TABLE_S)); + break; + } + + return 0; +} + +#endif + + +HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default; + + return 0; +} + + +/* ISP default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstDef->stDrc, &g_IspDft[0].stDrc, sizeof(ISP_CMOS_DRC_S)); + memcpy(&pstDef->stNoiseTbl, &g_IspDft[0].stNoiseTbl, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_IspDft[0].stDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_IspDft[0].stRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGamma, &g_IspDft[0].stGamma, sizeof(ISP_CMOS_GAMMA_S)); + memcpy(&pstDef->stGe, &g_IspDft[0].stGe, sizeof(ISP_CMOS_GE_S)); + break; + + case WDR_MODE_2To1_FRAME: + memcpy(&pstDef->stDrc, &g_IspDft[1].stDrc, sizeof(ISP_CMOS_DRC_S)); + memcpy(&pstDef->stNoiseTbl, &g_IspDft[1].stNoiseTbl, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_IspDft[1].stDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_IspDft[1].stRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGamma, &g_IspDft[1].stGamma, sizeof(ISP_CMOS_GAMMA_S)); + memcpy(&pstDef->stGammafe, &g_IspDft[1].stGammafe, sizeof(ISP_CMOS_GAMMAFE_S)); + memcpy(&pstDef->stGe, &g_IspDft[1].stGe, sizeof(ISP_CMOS_GE_S)); + break; + } + pstDef->stSensorMaxResolution.u32MaxWidth = 1280; + pstDef->stSensorMaxResolution.u32MaxHeight = 720; + + return 0; +} + +#else + + + +#define DMNR_CALIB_CARVE_NUM_9M034 (13) +static HI_FLOAT g_coef_calib_9m034[DMNR_CALIB_CARVE_NUM_9M034][HI_ISP_NR_CALIB_COEF_COL] = +{ + {100.000000f, 2.000000f, 0.035900f, 9.163901f}, + {611.000000f, 2.786041f, 0.039199f, 9.662953f}, + {1104.000000f, 3.042969f, 0.042015f, 10.098933f}, + {2317.000000f, 3.364926f, 0.046898f, 11.608693f}, + {4625.000000f, 3.665112f, 0.053912f, 14.938090f}, + {5923.000000f, 3.772542f, 0.056674f, 17.071514f}, + {8068.000000f, 3.906766f, 0.061652f, 20.065725f}, + {9985.000000f, 3.999348f, 0.063942f, 22.888287f}, + {20395.000000f, 4.309524f, 0.062935f, 41.496876f}, + {40067.000000f, 4.602787f, 0.053383f, 77.137268f}, + {49630.000000f, 4.695744f, 0.030656f, 104.676781f}, + {60637.000000f, 4.782738f, 0.000000f, 138.000000f}, + {89225.000000f, 4.950487f, 0.000000f, 171.000000f}, +}; + +static HI_FLOAT g_coef_calib_9m034WDR[DMNR_CALIB_CARVE_NUM_9M034][HI_ISP_NR_CALIB_COEF_COL] = +{ + {2785.000000, 3.444825, 0.061053, 3.400960, }, + {4517.000000, 3.654850, 0.041061, 9.879556, }, + {9736.000000, 3.988381, 0.049405, 8.447605, }, + {24105.000000, 4.382107, 0.065567, 2.961599, }, + {49705.000000, 4.696400, 0.051170, 6.569161, }, + {75952.000000, 4.880539, 0.036218, 11.878284, }, + {82899.000000, 4.918549, 0.034525, 12.647687, }, + {82899.000000, 4.918549, 0.034525, 12.647687, }, + {82899.000000, 4.918549, 0.034525, 12.647687, }, + {82899.000000, 4.918549, 0.034525, 12.647687, }, + {82899.000000, 4.918549, 0.034525, 12.647687, }, + {82899.000000, 4.918549, 0.034525, 12.647687, }, + {82899.000000, 4.918549, 0.034525, 12.647687, }, + +}; + +static ISP_NR_ISO_PARA_TABLE_S g_stNrIsoParaTab[HI_ISP_NR_ISO_LEVEL_MAX] = +{ + //u16Threshold//u8varStrength//u8fixStrength//u8LowFreqSlope + {1750, 256-224, 256-256, 0 }, //100 // // + {1750, 256-224, 256-256, 0 }, //200 // ISO //Thr//var//fix // ISO //u8LowFreqSlope + {1750, 256-224, 256-256, 0 }, //400 //{400, 1400, 80,256}, //{400 , 0 } + {1750, 256-224, 256-256, 8 }, //800 //{800, 1400, 72,256}, //{600 , 2 } + {1750, 256-208, 256-256, 6 }, //1600 //{1600, 1400, 64,256}, //{800 , 8 } + {1750, 256-208, 256-256, 0 }, //3200 //{3200, 1400, 48,230}, //{1000, 12 } + {1750, 256-208, 256-256, 0 }, //6400 //{6400, 1400, 48,210}, //{1600, 6 } + {1750, 256-204, 256-256, 0 }, //12800 //{12000,1400, 32,180}, //{2400, 0 } + {1625, 256-204, 256-256, 0 }, //25600 //{36000,1300, 48,160}, // + {1375, 256-204, 256-256, 0 }, //51200 //{64000,1100, 40,140}, // + {1250, 256-204, 256-256, 0 }, //102400 //{82000,1000, 30,128}, // + {1250, 256-192, 256-256, 0 }, //204800 // // + {1250, 256-192, 256-256, 0 }, //409600 // // + {1250, 256-192, 256-256, 0 }, //819200 // // + {1250, 256-192, 256-256, 0 }, //1638400// // + {1250, 256-192, 256-256, 0 }, //3276800// // +}; + +static ISP_NR_ISO_PARA_TABLE_S g_stNrIsoParaTabWDR[HI_ISP_NR_ISO_LEVEL_MAX] = +{ + //u16Threshold//u8varStrength//u8fixStrength//u8LowFreqSlope + {1500, 256-240, 256-256, 0 }, //100 // // + {1500, 256-240, 256-256, 0 }, //200 // ISO //Thr//var//fix // ISO //u8LowFreqSlope + {1500, 256-240, 256-256, 0 }, //400 //{400, 1200,240,256}, //{400 , 0 } + {1500, 256-220, 256-256, 4 }, //800 //{800, 1200,220,256}, //{600 , 2 } + {1500, 256-200, 256-256, 4 }, //1600 //{1600, 1200,200,256}, //{800 , 4 } + {1500, 256-200, 256-256, 0 }, //3200 //{3200, 1200,200,256}, //{1000, 6 } + {1500, 256-200, 256-256, 0 }, //6400 //{6400, 1200,200,256}, //{1600, 4 } + {1500, 256-200, 256-256, 0 }, //12800 //{12000,1200,200,256}, //{2400, 0 } + {1500, 256-180, 256-256, 0 }, //25600 //{36000,1200,180,256}, // + {1375, 256-180, 256-256, 0 }, //51200 //{64000,1100,180,256}, // + {1375, 256-180, 256-256, 0 }, //102400 //{82000,1100,180,256}, // + {1375, 256-180, 256-256, 0 }, //204800 // // + {1375, 256-180, 256-256, 0 }, //409600 // // + {1375, 256-180, 256-256, 0 }, //819200 // // + {1375, 256-180, 256-256, 0 }, //1638400// // + {1375, 256-180, 256-256, 0 }, //3276800// // +}; + + + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaicLin = +{ + /*For Demosaic*/ + 1, /*bEnable*/ + 12,/*u16VhLimit*/ + 8,/*u16VhOffset*/ + 48, /*u16VhSlope*/ + /*False Color*/ + 1, /*bFcrEnable*/ + {24,24,24,24,24,24,24,24,10, 0, 0, 0, 0, 0, 0, 0}, /*au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]*/ + {24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24}, /*au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]*/ + /*For Ahd*/ + 400, /*u16UuSlope*/ + {512,512,512,512,512,512,512,400,0,0,0,0,0,0,0,0} /*au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaicWDR = +{ + /*For Demosaic*/ + 1, /*bEnable*/ + 24,/*u16VhLimit*/ + 16,/*u16VhOffset*/ + 48, /*u16VhSlope*/ + /*False Color*/ + 1, /*bFcrEnable*/ + {12,12,12,12,12,12,12,12, 5, 0, 0, 0, 0, 0, 0, 0}, /*au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]*/ + {24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24}, /*au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]*/ + /*For Ahd*/ + 400, /*u16UuSlope*/ + {512,512,512,512,512,512,512, 400, 0,0,0,0,0,0,0,0} /*au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_GE_S g_stIspGeLin = +{ + /*For GE*/ + 1, /*bEnable*/ + 7, /*u8Slope*/ + 7, /*u8Sensitivity*/ + 8192, /*u16Threshold*/ + 8192, /*u16SensiThreshold*/ + {1024,1024,1024,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048} /*au16Strength[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_GE_S g_stIspGeWDR = +{ + /*For GE*/ + 1, /*bEnable*/ + 7, /*u8Slope*/ + 7, /*u8Sensitivity*/ + 8192, /*u16Threshold*/ + 8192, /*u16SensiThreshold*/ + {1024,1024,1024,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048} /*au16Strength[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_GAMMAFE_S g_stGammafe = +{ + /* bvalid */ + 1, + + /* gamma_fe0 */ + { + //10,8// + + /*0 , 43008, 46130, 49152, 51200, 52224, 52717, 53210, 53703, 54196, 54689, 55182, 55675, 56168, 56661, 57154, 57647, 58140, 58633, 59127, 59620, 60113, 60606, 61099, 61592, 62085, 62578, 63071, 63564, 64057, 64550, 65043, 65535*/ + + //14,12 + 0,43008,46130,49152,51200,52224,52717,53210,53703,54196,54689,55182,55675,56168,56661,57154,57647,58140,58633,59127,59620,60113,60606,61099,61592,62085,62578,63071,63564,64057,64550,65043,65535 + }, + + /* gamma_fe1 */ + { + //15,13// + 1, 105, 175, 237, 293, 346, 396, 444, 489, 533, 576, 618, 658, 698, 736, 774, + 811, 847, 883, 918, 952, 986, 1019, 1052, 1085, 1116, 1148, 1179, 1210, 1240, 1270, 1300, + 1329, 1358, 1386, 1415, 1443, 1470, 1498, 1525, 1552, 1578, 1605, 1631, 1657, 1683, 1708, 1734, + 1759, 1783, 1808, 1832, 1857, 1881, 1905, 1928, 1952, 1975, 1998, 2021, 2044, 2067, 2089, 2112, + 2134, 2156, 2178, 2200, 2221, 2243, 2264, 2285, 2307, 2327, 2348, 2369, 2390, 2410, 2430, 2451, + 2471, 2491, 2510, 2530, 2550, 2569, 2589, 2608, 2627, 2646, 2665, 2684, 2703, 2722, 2740, 2759, + 2777, 2796, 2814, 2832, 2850, 2868, 2886, 2904, 2921, 2939, 2957, 2974, 2992, 3009, 3026, 3043, + 3060, 3077, 3094, 3111, 3128, 3144, 3161, 3178, 3194, 3211, 3227, 3243, 3260, 3276, 3292, 3308, + 3324, 3340, 3356, 3371, 3387, 3403, 3418, 3434, 3449, 3465, 3480, 3495, 3510, 3526, 3541, 3556, + 3571, 3586, 3601, 3616, 3630, 3645, 3660, 3675, 3689, 3704, 3718, 3733, 3747, 3761, 3776, 3790, + 3804, 3818, 3833, 3847, 3861, 3875, 3889, 3903, 3916, 4103, 4283, 4457, 4625, 4789, 4948, 5103, + 5256, 5405, 5552, 5696, 5839, 5983, 6127, 6270, 6411, 6552, 6692, 6831, 6970, 7109, 7247, 7385, + 7523, 7727, 7932, 8137, 8343, 8550, 8757, 8966, 9176, 9600, 10029, 10464, 10905, 11836, 12789, 13762, + 14752, 15756, 16773, 17799, 18834, 19875, 20922, 21973, 23027, 24083, 25141, 26201, 27262, 28323, 29385, 30448, + 31511, 32574, 33637, 34700, 35764, 36827, 37888, 38950, 40013, 41077, 42140, 43204, 44267, 45330, 46394, 47457, + 48521, 49584, 50648, 51711, 52775, 53838, 54902, 55965, 57028, 58092, 59155, 60219, 61282, 62346, 63409, 64475, + 65535 + } +}; + +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpen = +{ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; //ISO + {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},/* bEnLowLumaShoot */ + {35, 30, 30, 30, 30, 30, 30, 25, 21, 15, 12, 12, 12, 12, 12, 12},/*SharpenUD*/ + {25, 25, 28, 28, 30, 30, 30, 35, 40, 40, 40, 50, 50, 50, 50, 50},/*SharpenD*/ + {10, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 30, 30, 30},/*TextureNoiseThd*/ + {10, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 30, 30, 30},/*EdgeNoiseThd*/ + { 150, 130, 120, 110, 110, 60, 40, 30, 20, 10, 0, 0, 0, 0, 0, 0},/*overshoot*/ + { 160, 160, 160, 160, 200, 200, 200, 200, 200, 220, 255, 255, 255, 255, 255, 255},/*undershoot*/ +}; + +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpenWDR = +{ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; //ISO + { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},/* bEnLowLumaShoot */ + { 40, 45, 50, 55, 50, 45, 40, 40, 40, 40, 43, 50, 50, 50, 50, 50},/*SharpenUD*/ + { 35, 40, 45, 45, 50, 40, 40, 45, 45, 45, 40, 40, 40, 40, 40, 40},/*SharpenD*/ + {10, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 30, 30, 30},/*TextureNoiseThd*/ + {10, 10, 12, 14, 16, 14, 12, 8, 4, 8, 12, 16, 24, 30, 30, 30},/*EdgeNoiseThd*/ + { 50, 50, 60, 60, 60, 60, 60, 70, 70, 80, 80, 80, 80, 80, 80, 80},/*overshoot*/ + {150, 150, 150, 140, 140, 140, 140, 150, 160, 170, 200, 200, 200, 200, 200, 200},/*undershoot*/ +}; + +static ISP_CMOS_UVNR_S g_stIspUVNR = +{ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; //ISO + {1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 22, 22, 22, 22}, /*u8UvnrThreshold*/ + {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2}, /*ColorCast*/ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /*u8UvnrStrength*/ +}; + +static ISP_CMOS_DPC_S g_stCmosDpc = +{ + //0,/*IR_channel*/ + //0,/*IR_position*/ + {0,0,0,0,1,1,2,2,2,3,3,3,3,3,3,3},/*au16Strength[16]*/ + {0,0,0,0,0,0,0,0,0,0x23,0x80,0xD0,0xF0,0xF0,0xF0,0xF0},/*au16BlendRatio[16]*/ +}; + +static ISP_CMOS_DPC_S g_stCmosDpcWDR = +{ + //0,/*IR_channel*/ + //0,/*IR_position*/ + {0,0,0,0,1,1,2,2,2,3,3,3,3,3,3,3},/*au16Strength[16]*/ + {0,0,0,0,0,0,0,0,0,0x23,0x80,0xD0,0xF0,0xF0,0xF0,0xF0},/*au16BlendRatio[16]*/ +}; + +static ISP_CMOS_COMPANDER_S g_stCmosCompander = +{ + 12, + 20, + 64, + 64, + 95, + 2048, + 125, + 32768, + 125, + 32768, + 129, + 32768 +}; + + +static ISP_LSC_CABLI_TABLE_S g_stCmosLscTable[HI_ISP_LSC_LIGHT_NUM] = +{ + //-------------------------------------------- + // single light default + //-------------------------------------------- + //3000K + { + { + 12966290, 12850780, 12557130, 12237540, 11823770, 11369460, 10990480, 10685190, 10548450, 10835680, 11280550, 11860230, 12462200, 13024830, 13465580, 13903610, 14056030, + 12937220, 12807990, 12516270, 12198730, 11787540, 11347100, 10959160, 10655590, 10529200, 10825520, 11247560, 11823770, 12408600, 12980880, 13434230, 13853540, 14038930, + 12836480, 12723260, 12421960, 12109130, 11715740, 11291580, 10917690, 10596880, 10500450, 10754890, 11171350, 11715740, 12315900, 12879460, 13325640, 13754470, 13937200, + 12695270, 12584510, 12315900, 11995840, 11609660, 11214770, 10845870, 10510020, 10434000, 10675300, 11074860, 11574720, 12185850, 12737310, 13203660, 13608490, 13770880, + 12543480, 12408600, 12147370, 11823770, 11482590, 11117530, 10754890, 10424570, 10368370, 10567770, 10959160, 11437070, 12033370, 12543480, 13010150, 13387470, 13544600, + 12355460, 12224580, 11946170, 11668350, 11358270, 11000950, 10626150, 10359070, 10303570, 10452900, 10866290, 11313730, 11860230, 12342250, 12765490, 13158500, 13325640, + 12109130, 11995840, 11751530, 11459780, 11193020, 10856070, 10490910, 10285200, 10203360, 10387040, 10734880, 11160540, 11668350, 12211640, 12612020, 12951740, 13098750, + 11872430, 11751530, 11540000, 11302640, 11053640, 10705010, 10359070, 10203360, 10105080, 10285200, 10596880, 11043060, 11540000, 11995840, 12395270, 12695270, 12836480, + 11692000, 11597990, 11403160, 11193020, 10928030, 10626150, 10312780, 10122810, 10000000, 10221430, 10510020, 10980020, 11414440, 11835900, 12211640, 12489180, 12639650, + 11739570, 11644800, 11448410, 11225680, 10969580, 10645760, 10331240, 10140600, 10043520, 10266900, 10500450, 10969580, 11414440, 11811670, 12173000, 12475680, 12639650, + 11896910, 11799590, 11586350, 11335950, 11085490, 10774980, 10415160, 10212390, 10131690, 10285200, 10548450, 11117530, 11586350, 11995840, 12368700, 12681320, 12822220, + 12083770, 11970950, 11715740, 11471170, 11193020, 10897070, 10510020, 10294380, 10194350, 10340500, 10795140, 11369460, 11751530, 12198730, 12543480, 12879460, 13010150, + 12276600, 12134590, 11872430, 11586350, 11324830, 11000950, 10626150, 10349780, 10266900, 10415160, 11064240, 11516970, 11958550, 12421960, 12779620, 13083900, 13218790, + 12408600, 12263550, 12020830, 11703850, 11403160, 11064240, 10695090, 10415160, 10312780, 10490910, 11182170, 11609660, 12109130, 12570810, 12951740, 13233950, 13371960, + 12543480, 12395270, 12134590, 11811670, 11459780, 11139000, 10754890, 10471870, 10340500, 10596880, 11269530, 11692000, 12237540, 12695270, 13083900, 13371960, 13481310, + 12612020, 12489180, 12185850, 11884650, 11494020, 11193020, 10805240, 10510020, 10349780, 10655590, 11324830, 11775510, 12315900, 12779620, 13158500, 13481310, 13576470, + 12625820, 12502710, 12211640, 11909180, 11494020, 11203880, 10835680, 10510020, 10340500, 10675300, 11335950, 11811670, 12342250, 12836480, 13203660, 13528720, 13624560, + }, + { + 12937060, 12821780, 12560620, 12216980, 11804920, 11369620, 10974580, 10658440, 10502840, 10702480, 11087330, 11624780, 12228520, 12783810, 13254860, 13660340, 13820700, + 12924150, 12771200, 12524180, 12182500, 11772730, 11339760, 10956010, 10632180, 10485830, 10693640, 11049490, 11572830, 12182500, 12758620, 13200820, 13602940, 13761960, + 12834490, 12683640, 12416110, 12114130, 11698280, 11280490, 10909860, 10588720, 10435130, 10623460, 10993210, 11470330, 12080220, 12646480, 13080810, 13475550, 13645940, + 12671230, 12560620, 12298200, 11979650, 11614350, 11202420, 10845900, 10519900, 10401610, 10562810, 10900670, 11349690, 11946490, 12475910, 12937060, 13323040, 13489580, + 12512080, 12368670, 12125470, 11826480, 11470330, 11125430, 10737980, 10435130, 10351720, 10460420, 10782680, 11202420, 11783440, 12298200, 12733530, 13094030, 13241310, + 12286530, 12159620, 11935480, 11635220, 11349690, 11002550, 10614750, 10360000, 10294120, 10368290, 10693640, 11087330, 11572830, 12080220, 12487950, 12847220, 13002010, + 12046510, 11935480, 11698280, 11439930, 11192740, 10845900, 10485830, 10285940, 10212930, 10285940, 10554200, 10928270, 11399650, 11924490, 12309890, 12634150, 12771200, + 11794170, 11687730, 11470330, 11270670, 11002550, 10676010, 10351720, 10196850, 10093530, 10204890, 10418340, 10818710, 11260870, 11730070, 12080220, 12380500, 12548450, + 11624780, 11521350, 11339760, 11154180, 10891510, 10580070, 10285940, 10117190, 10000000, 10133020, 10343450, 10746890, 11154180, 11541890, 11924490, 12193970, 12309890, + 11645680, 11562500, 11389620, 11173430, 10946750, 10606060, 10326950, 10133020, 10038760, 10164840, 10360000, 10746890, 11135000, 11531610, 11869840, 12182500, 12321600, + 11826480, 11708860, 11500890, 11270670, 11021280, 10737980, 10384920, 10212930, 10117190, 10204890, 10401610, 10882350, 11300170, 11719460, 12080220, 12356870, 12463910, + 12001850, 11880730, 11666670, 11429830, 11144580, 10845900, 10494330, 10277780, 10164840, 10253370, 10623460, 11068380, 11460180, 11880730, 12240080, 12548450, 12671230, + 12182500, 12057730, 11826480, 11562500, 11270670, 10956010, 10597380, 10318730, 10229070, 10285940, 10845900, 11231570, 11645680, 12102800, 12463910, 12758620, 12872760, + 12321600, 12205470, 11979650, 11645680, 11359650, 11021280, 10676010, 10393260, 10277780, 10384920, 10956010, 11319930, 11815690, 12274880, 12646480, 12924150, 13041290, + 12475910, 12345090, 12080220, 11762030, 11429830, 11096830, 10737980, 10451980, 10302310, 10477350, 11030660, 11409690, 11913520, 12404210, 12796440, 13080810, 13200820, + 12548450, 12416110, 12136830, 11837290, 11460180, 11154180, 10773710, 10485830, 10318730, 10537020, 11087330, 11470330, 12012990, 12487950, 12885570, 13187370, 13282050, + 12572820, 12439960, 12159620, 11869840, 11460180, 11163790, 10791670, 10502840, 10318730, 10562810, 11106350, 11511110, 12057730, 12536300, 12924150, 13214290, 13295690, + }, + { + 12811880, 12673850, 12370940, 12048420, 11626240, 11174440, 10792330, 10460790, 10343720, 10632700, 11050380, 11615800, 12242190, 12824580, 13326470, 13707630, 13913980, + 12773940, 12624390, 12347330, 12014860, 11584600, 11145560, 10765390, 10443910, 10327220, 10597870, 11022150, 11584600, 12196040, 12786560, 13271790, 13664200, 13869240, + 12673850, 12538760, 12265400, 11937270, 11522710, 11097770, 10720800, 10410300, 10294350, 10537460, 10947550, 11502220, 12104770, 12698720, 13177190, 13549740, 13736730, + 12538760, 12406520, 12150240, 11828150, 11451330, 11050380, 10667770, 10352000, 10261700, 10486220, 10883100, 11390840, 12003710, 12563110, 13044350, 13395450, 13535570, + 12394640, 12277040, 12003710, 11699820, 11350880, 10975400, 10597870, 10286170, 10229250, 10410300, 10774350, 11271780, 11849820, 12394640, 12824580, 13204080, 13381590, + 12219070, 12093460, 11849820, 11553570, 11242400, 10873950, 10511780, 10237340, 10205050, 10327220, 10711920, 11164800, 11689250, 12196040, 12612090, 12991970, 13150410, + 12003710, 11893380, 11647160, 11380830, 11116840, 10765390, 10410300, 10188980, 10141070, 10278000, 10589200, 11040960, 11543260, 12082170, 12478300, 12824580, 12940000, + 11774340, 11657660, 11471630, 11261970, 10984720, 10623970, 10302550, 10149020, 10070040, 10213100, 10503250, 10966100, 11441200, 11937270, 12277040, 12599810, 12761340, + 11647160, 11553570, 11370830, 11174440, 10910620, 10589200, 10302550, 10117280, 10000000, 10188980, 10477730, 10938290, 11370830, 11774340, 12150240, 12454280, 12575320, + 11742290, 11647160, 11451330, 11222900, 10994050, 10658980, 10360290, 10164960, 10085740, 10269840, 10503250, 10938290, 11380830, 11817350, 12173090, 12478300, 12624390, + 11904320, 11806570, 11605380, 11370830, 11116840, 10792330, 10435480, 10261700, 10180960, 10318980, 10571900, 11107300, 11584600, 12014860, 12382780, 12673850, 12799210, + 12082170, 11959330, 11752950, 11512460, 11242400, 10929050, 10554650, 10335460, 10253570, 10385230, 10819400, 11331000, 11785060, 12219070, 12587550, 12862820, 12965930, + 12277040, 12173090, 11915290, 11657660, 11360840, 11031540, 10667770, 10401930, 10318980, 10435480, 11069290, 11502220, 11959330, 12430360, 12799210, 13097170, 13231080, + 12430360, 12323810, 12070900, 11763640, 11471630, 11135970, 10747510, 10477730, 10376900, 10537460, 11193770, 11605380, 12116100, 12587550, 12991970, 13299080, 13437180, + 12563110, 12466280, 12173090, 11882460, 11522710, 11193770, 10819400, 10537460, 10401930, 10650210, 11291450, 11721010, 12265400, 12748770, 13137060, 13423240, 13549740, + 12673850, 12550920, 12242190, 11948290, 11574240, 11242400, 10864820, 10580540, 10435480, 10711920, 11350880, 11763640, 12347330, 12837300, 13217570, 13535570, 13635410, + 12723700, 12575320, 12277040, 11970400, 11584600, 11252170, 10873950, 10606560, 10435480, 10738590, 11380830, 11795810, 12394640, 12888450, 13244630, 13606730, 13707630, + }, + { + 11625240, 11558940, 11407130, 11155960, 10915620, 10647990, 10428820, 10270270, 10133330, 10252950, 10393160, 10742050, 11094890, 11450090, 11737450, 11944990, 12015810, + 11603050, 11537000, 11364490, 11135530, 10896060, 10647990, 10428820, 10235690, 10133330, 10218490, 10375430, 10704230, 11054550, 11428570, 11692310, 11921570, 11992110, + 11558940, 11471700, 11280150, 11074680, 10837790, 10610820, 10410960, 10218490, 10099670, 10184250, 10340140, 10610820, 11014490, 11343280, 11625240, 11875000, 11944990, + 11450090, 11385770, 11217710, 11014490, 10761060, 10555560, 10357750, 10184250, 10082920, 10133330, 10305090, 10555560, 10935250, 11238450, 11515150, 11782950, 11851850, + 11385770, 11301120, 11135530, 10915620, 10723100, 10537260, 10287650, 10150250, 10082920, 10099670, 10235690, 10500860, 10818510, 11115170, 11407130, 11669870, 11760150, + 11259260, 11176470, 11034480, 10837790, 10685410, 10482760, 10270270, 10150250, 10066230, 10082920, 10235690, 10428820, 10723100, 11014490, 11322160, 11558940, 11625240, + 11155960, 11074680, 10915620, 10742050, 10610820, 10410960, 10218490, 10116470, 10066230, 10049590, 10167220, 10357750, 10629370, 10954950, 11259260, 11450090, 11515150, + 11014490, 10935250, 10799290, 10704230, 10519030, 10340140, 10184250, 10116470, 10033000, 10033000, 10116470, 10305090, 10537260, 10857140, 11115170, 11322160, 11364490, + 10935250, 10876560, 10742050, 10647990, 10500860, 10357750, 10218490, 10099670, 10000000, 10049590, 10099670, 10287650, 10519030, 10761060, 10974730, 11155960, 11217710, + 10994580, 10915620, 10799290, 10685410, 10573910, 10410960, 10235690, 10116470, 10066230, 10082920, 10116470, 10322580, 10537260, 10761060, 10954950, 11176470, 11238450, + 11115170, 11034480, 10896060, 10799290, 10666670, 10500860, 10287650, 10235690, 10133330, 10116470, 10133330, 10393160, 10592330, 10857140, 11115170, 11301120, 11385770, + 11238450, 11155960, 11014490, 10876560, 10742050, 10592330, 10357750, 10252950, 10167220, 10150250, 10270270, 10482760, 10666670, 10974730, 11197050, 11407130, 11471700, + 11343280, 11280150, 11115170, 10994580, 10818510, 10629370, 10446740, 10270270, 10184250, 10167220, 10393160, 10555560, 10780140, 11115170, 11343280, 11537000, 11603050, + 11471700, 11364490, 11217710, 11034480, 10876560, 10685410, 10482760, 10322580, 10218490, 10218490, 10464720, 10610820, 10915620, 11176470, 11471700, 11647510, 11692310, + 11580950, 11471700, 11280150, 11115170, 10896060, 10723100, 10519030, 10340140, 10235690, 10270270, 10500860, 10647990, 10974730, 11259260, 11558940, 11760150, 11805830, + 11625240, 11515150, 11343280, 11155960, 10915620, 10742050, 10555560, 10375430, 10252950, 10305090, 10537260, 10666670, 11034480, 11343280, 11603050, 11828790, 11875000, + 11625240, 11537000, 11364490, 11176470, 10954950, 10761060, 10555560, 10393160, 10270270, 10305090, 10555560, 10666670, 11054550, 11364490, 11647510, 11851850, 11921570, + }, + }, + + //D50 + { + { + 13333330, 13201320, 12847970, 12435230, 11940300, 11472280, 11070110, 10801080, 10666670, 10899180, 11396010, 11952190, 12526100, 13071900, 13528750, 13904980, 14117650, + 13274340, 13129100, 12806830, 12396690, 11916580, 11450380, 11049720, 10762330, 10638300, 10879420, 11363640, 11904760, 12486990, 13015180, 13468010, 13856810, 14051520, + 13157890, 13015180, 12711860, 12307690, 11846000, 11385200, 10999080, 10714290, 10582010, 10830320, 11299430, 11811020, 12383900, 12889370, 13348160, 13745700, 13921110, + 13015180, 12861740, 12565440, 12170390, 11741680, 11299430, 10899180, 10628880, 10535560, 10743060, 11204480, 11673150, 12244900, 12752390, 13186810, 13605440, 13777270, + 12793180, 12644890, 12332990, 11988010, 11583010, 11204480, 10781670, 10517090, 10443860, 10619470, 11059910, 11516310, 12060300, 12539190, 12972970, 13348160, 13528750, + 12565440, 12422360, 12108980, 11753180, 11406840, 11029410, 10628880, 10407630, 10344830, 10517090, 10919020, 11374410, 11834320, 12295080, 12711860, 13071900, 13230430, + 12269940, 12121210, 11846000, 11538460, 11214950, 10840110, 10462080, 10309280, 10221460, 10380620, 10752690, 11194030, 11639180, 12121210, 12513030, 12847970, 12987010, + 11964110, 11822660, 11560690, 11320750, 10999080, 10628880, 10309280, 10178120, 10075570, 10256410, 10582010, 11029410, 11461320, 11916580, 12269940, 12565440, 12738850, + 11764710, 11650490, 11439470, 11194030, 10869570, 10535560, 10247650, 10084030, 10000000, 10143700, 10434780, 10948900, 11352890, 11730200, 12096770, 12371130, 12500000, + 11834320, 11730200, 11483250, 11214950, 10938920, 10591350, 10282780, 10109520, 10000000, 10135140, 10425720, 10899180, 11352890, 11741680, 12096770, 12409510, 12578620, + 11988010, 11869440, 11627910, 11342150, 11049720, 10704730, 10353750, 10195410, 10058680, 10178120, 10471200, 11070110, 11527380, 11940300, 12332990, 12618300, 12765960, + 12170390, 12048190, 11753180, 11483250, 11173180, 10830320, 10452960, 10282780, 10092510, 10195410, 10704730, 11288810, 11695910, 12145750, 12500000, 12820510, 12958960, + 12332990, 12207530, 11928430, 11594200, 11278200, 10919020, 10526320, 10291600, 10126580, 10230180, 10948900, 11428570, 11869440, 12320330, 12711860, 13015180, 13143480, + 12474010, 12345680, 12060300, 11695910, 11363640, 10989010, 10619470, 10371650, 10195410, 10318140, 11059910, 11516310, 12024050, 12500000, 12875540, 13186810, 13333330, + 12644890, 12486990, 12170390, 11822660, 11428570, 11049720, 10685660, 10407630, 10221460, 10425720, 11142060, 11594200, 12133470, 12631580, 13015180, 13333330, 13468010, + 12738850, 12578620, 12244900, 11881190, 11483250, 11090570, 10723860, 10452960, 10230180, 10498690, 11183600, 11627910, 12207530, 12711860, 13100440, 13422820, 13544020, + 12765960, 12618300, 12282500, 11892960, 11505270, 11100830, 10743060, 10480350, 10221460, 10507880, 11204480, 11650490, 12244900, 12738850, 13143480, 13468010, 13590030, + }, + { + 13258660, 13111780, 12827590, 12411820, 11912170, 11441120, 11052630, 10831950, 10628570, 10796020, 11175970, 11677130, 12236840, 12752200, 13204870, 13619250, 13821660, + 13218270, 13059180, 12777230, 12376430, 11890410, 11421050, 11024550, 10787080, 10602610, 10778150, 11147260, 11635390, 12191010, 12714840, 13151520, 13548390, 13763210, + 13125000, 12968130, 12665370, 12259890, 11814880, 11351350, 10978080, 10716050, 10559610, 10724880, 11099740, 11532330, 12100370, 12604070, 13046090, 13422680, 13633510, + 12955220, 12814960, 12507210, 12111630, 11698110, 11272730, 10895400, 10628570, 10516960, 10654660, 11015230, 11421050, 11977920, 12447420, 12891090, 13245170, 13422680, + 12727270, 12591880, 12306240, 11955920, 11552800, 11166380, 10787080, 10516960, 10432690, 10533980, 10895400, 11272730, 11772150, 12248350, 12640780, 13020000, 13164810, + 12483220, 12341230, 12055560, 11740310, 11381120, 11005920, 10619900, 10432690, 10341540, 10424340, 10760330, 11128210, 11552800, 12000000, 12376430, 12727270, 12878340, + 12179610, 12044400, 11782810, 11491620, 11185570, 10804980, 10457830, 10333330, 10219780, 10308790, 10593980, 10950380, 11341460, 11804170, 12179610, 12507210, 12616280, + 11836360, 11729730, 11491620, 11262980, 10950380, 10602610, 10300630, 10203760, 10077400, 10179830, 10432690, 10796020, 11175970, 11604280, 11966910, 12225350, 12364670, + 11656220, 11552800, 11341460, 11128210, 10840970, 10508470, 10251970, 10108700, 10000000, 10061820, 10284360, 10716050, 11080850, 11441120, 11782810, 12044400, 12168220, + 11729730, 11625000, 11421050, 11156810, 10877190, 10568180, 10276240, 10124420, 10000000, 10077400, 10292490, 10707240, 11080850, 11471370, 11782810, 12077920, 12202440, + 11890410, 11782810, 11542550, 11282500, 11005920, 10680890, 10349760, 10219780, 10069610, 10100850, 10341540, 10831950, 11253240, 11645800, 12000000, 12283020, 12423660, + 12089140, 11934010, 11698110, 11421050, 11118700, 10787080, 10432690, 10276240, 10108700, 10116550, 10533980, 11015230, 11391080, 11836360, 12168220, 12459330, 12579710, + 12236840, 12122910, 11836360, 11522120, 11224140, 10868110, 10516960, 10284360, 10132300, 10163930, 10733720, 11137730, 11573330, 12000000, 12376430, 12677700, 12802360, + 12411820, 12271440, 11977920, 11645800, 11311900, 10950380, 10585370, 10366240, 10171870, 10219780, 10840970, 11224140, 11719170, 12168220, 12555450, 12865610, 13020000, + 12519230, 12388200, 12089140, 11761520, 11371180, 11015230, 10663390, 10432690, 10211760, 10325140, 10895400, 11302080, 11825610, 12306240, 12690060, 13006990, 13151520, + 12628520, 12471260, 12156860, 11825610, 11411040, 11062020, 10698440, 10466240, 10219780, 10366240, 10950380, 11361260, 11901280, 12388200, 12777230, 13098590, 13245170, + 12653060, 12507210, 12168220, 11857920, 11421050, 11080850, 10724880, 10491540, 10219780, 10391060, 10968830, 11381120, 11934010, 12435530, 12814960, 13138240, 13272170, + }, + { + 13091640, 12961120, 12633630, 12218040, 11732850, 11235950, 10851420, 10577700, 10458570, 10690790, 11120620, 11690650, 12298960, 12833170, 13306040, 13669820, 13874070, + 13039120, 12896830, 12584700, 12172280, 11701170, 11216570, 10833330, 10560520, 10441770, 10673230, 11101620, 11648750, 12252590, 12782690, 13238290, 13598330, 13785790, + 12922470, 12782690, 12487990, 12093020, 11627910, 11158800, 10788380, 10509300, 10400000, 10612240, 11054420, 11576140, 12149530, 12670570, 13118060, 13499480, 13684210, + 12770140, 12645910, 12345680, 11970530, 11535050, 11111110, 10734930, 10466990, 10366830, 10560520, 10989010, 11453740, 12025900, 12536160, 12961120, 13347020, 13513510, + 12621360, 12464050, 12160900, 11828940, 11403510, 11026290, 10620910, 10375100, 10292950, 10458570, 10878660, 11333910, 11861310, 12333970, 12757610, 13118060, 13292430, + 12392750, 12241050, 11959520, 11607140, 11265160, 10906040, 10500810, 10309280, 10244290, 10375100, 10797340, 11216570, 11669660, 12126870, 12524090, 12858560, 13013010, + 12104280, 11981570, 11711710, 11433600, 11101620, 10717230, 10375100, 10236220, 10156250, 10292950, 10638300, 11073250, 11494250, 11981570, 12357410, 12695310, 12820510, + 11818180, 11722270, 11473960, 11245680, 10933560, 10569110, 10244290, 10148320, 10054140, 10188090, 10500810, 10933560, 11363640, 11807450, 12160900, 12464050, 12621360, + 11669660, 11576140, 11393510, 11149230, 10851420, 10526320, 10236220, 10093170, 10000000, 10116730, 10408330, 10887770, 11294530, 11669660, 12025900, 12310610, 12428300, + 11807450, 11690650, 11463840, 11216570, 10942760, 10594950, 10301110, 10140410, 10054140, 10156250, 10450160, 10906040, 11333910, 11743450, 12081780, 12380950, 12500000, + 11959520, 11872150, 11638320, 11343800, 11063830, 10743800, 10391690, 10260460, 10116730, 10212100, 10509300, 11082690, 11524820, 11926610, 12310610, 12609120, 12720160, + 12172280, 12025900, 11775360, 11494250, 11187610, 10842370, 10492330, 10342080, 10164190, 10252370, 10726070, 11274940, 11680140, 12126870, 12487990, 12795280, 12909630, + 12369170, 12229540, 11937560, 11638320, 11304350, 10933560, 10594950, 10358570, 10228170, 10276680, 10961210, 11413520, 11883000, 12333970, 12720160, 13000000, 13118060, + 12500000, 12357410, 12081780, 11754070, 11393510, 11016950, 10673230, 10433390, 10276680, 10383390, 11082690, 11504420, 12037040, 12500000, 12896830, 13238290, 13360740, + 12645910, 12500000, 12206570, 11872150, 11453740, 11082690, 10743800, 10492330, 10301110, 10483870, 11158800, 11576140, 12149530, 12658230, 13026050, 13360740, 13499480, + 12757610, 12596900, 12275730, 11937560, 11494250, 11130140, 10779440, 10509300, 10309280, 10551950, 11187610, 11648750, 12218040, 12732620, 13091640, 13443640, 13598330, + 12795280, 12633630, 12310610, 11959520, 11504420, 11158800, 10797340, 10526320, 10301110, 10586320, 11197240, 11690650, 12241050, 12770140, 13144590, 13485480, 13612570, + }, + { + 11769380, 11699600, 11517510, 11276190, 10983300, 10705240, 10496450, 10367780, 10224520, 10295650, 10459360, 10744100, 11106940, 11384620, 11630650, 11911470, 11935480, + 11769380, 11676530, 11495150, 11233400, 10942700, 10685920, 10477880, 10349650, 10224520, 10277780, 10440920, 10705240, 11065420, 11341000, 11607840, 11863730, 11935480, + 11699600, 11607840, 11406550, 11169810, 10902390, 10647480, 10440920, 10313590, 10171820, 10242210, 10385970, 10647480, 11003720, 11254750, 11539960, 11769380, 11863730, + 11607840, 11495150, 11319310, 11065420, 10842490, 10609320, 10385970, 10277780, 10136990, 10206900, 10349650, 10590340, 10902390, 11169810, 11450680, 11653540, 11746030, + 11495150, 11384620, 11212120, 10983300, 10763640, 10552590, 10349650, 10206900, 10154370, 10171820, 10313590, 10515100, 10783240, 11065420, 11341000, 11562500, 11630650, + 11384620, 11276190, 11086140, 10862390, 10705240, 10477880, 10295650, 10206900, 10119660, 10136990, 10277780, 10440920, 10666670, 10942700, 11212120, 11428570, 11495150, + 11169810, 11106940, 10942700, 10783240, 10609320, 10404220, 10224520, 10171820, 10119660, 10085180, 10206900, 10367780, 10571430, 10862390, 11127820, 11319310, 11384620, + 11044780, 10962960, 10802920, 10705240, 10515100, 10313590, 10171820, 10136990, 10033900, 10050930, 10154370, 10295650, 10515100, 10763640, 10983300, 11148780, 11233400, + 10962960, 10882350, 10763640, 10628370, 10477880, 10313590, 10189330, 10102390, 10033900, 10000000, 10068030, 10277780, 10459360, 10666670, 10882350, 11044780, 11086140, + 11044780, 10942700, 10842490, 10685920, 10552590, 10385970, 10242210, 10136990, 10068030, 10050930, 10085180, 10295650, 10496450, 10666670, 10882350, 11065420, 11127820, + 11127820, 11065420, 10922510, 10783240, 10628370, 10459360, 10259970, 10224520, 10102390, 10068030, 10119660, 10367780, 10533810, 10783240, 11044780, 11233400, 11297710, + 11276190, 11190930, 11003720, 10862390, 10724640, 10515100, 10331590, 10259970, 10119660, 10068030, 10224520, 10440920, 10590340, 10862390, 11127820, 11319310, 11362760, + 11406550, 11319310, 11106940, 10962960, 10783240, 10571430, 10385970, 10277780, 10154370, 10085180, 10331590, 10477880, 10724640, 11003720, 11276190, 11450680, 11495150, + 11539960, 11428570, 11212120, 11024210, 10822670, 10609320, 10440920, 10313590, 10171820, 10119660, 10367780, 10496450, 10802920, 11127820, 11362760, 11562500, 11630650, + 11607840, 11517510, 11297710, 11106940, 10862390, 10647480, 10459360, 10349650, 10189330, 10154370, 10404220, 10552590, 10882350, 11190930, 11428570, 11653540, 11722770, + 11653540, 11539960, 11362760, 11148780, 10902390, 10666670, 10515100, 10385970, 10206900, 10189330, 10422530, 10571430, 10942700, 11233400, 11517510, 11699600, 11769380, + 11676530, 11562500, 11384620, 11169810, 10922510, 10685920, 10515100, 10385970, 10206900, 10206900, 10422530, 10571430, 10962960, 11254750, 11562500, 11722770, 11792830, + }, + }, + + //D65 + { + { + 12674420, 12546760, 12299010, 11961590, 11564990, 11165170, 10859280, 10595380, 10493380, 10647130, 10900000, 11324680, 11752020, 12230010, 12619390, 12937690, 13112780, + 12619390, 12528740, 12264420, 11928860, 11534390, 11165170, 10832300, 10582520, 10468190, 10608270, 10872820, 11266150, 11720430, 12178770, 12582970, 12880350, 13034380, + 12546760, 12421650, 12161790, 11847830, 11473680, 11122450, 10805450, 10531400, 10443110, 10569700, 10818860, 11179490, 11642190, 12060860, 12474960, 12785920, 12937690, + 12439370, 12281690, 12044200, 11736200, 11383810, 11051960, 10765430, 10480770, 10380950, 10493380, 10752160, 11065990, 11503960, 11928860, 12316380, 12674420, 12804700, + 12264420, 12144850, 11896320, 11595750, 11309990, 10996220, 10660150, 10393330, 10344010, 10418160, 10634150, 10954770, 11368970, 11752020, 12161790, 12474960, 12601160, + 12094310, 11961590, 11720430, 11443570, 11179490, 10872820, 10544140, 10319530, 10246770, 10331750, 10582520, 10845770, 11193840, 11580350, 11928860, 12264420, 12403980, + 11880110, 11752020, 11519150, 11280730, 11051960, 10752160, 10418160, 10258820, 10175030, 10258820, 10443110, 10712530, 11037970, 11473680, 11799730, 12094310, 12230010, + 11626670, 11534390, 11324680, 11122450, 10900000, 10569700, 10319530, 10186920, 10080930, 10175030, 10344010, 10621190, 10954770, 11324680, 11611190, 11880110, 12011020, + 11488800, 11383810, 11208230, 11037970, 10765430, 10493380, 10246770, 10092590, 10022990, 10069280, 10246770, 10544140, 10845770, 11150900, 11443570, 11704700, 11799730, + 11564990, 11428570, 11251610, 11024020, 10792080, 10518700, 10270910, 10080930, 10000000, 10069280, 10222740, 10518700, 10832300, 11122450, 11413610, 11689010, 11815720, + 11626670, 11534390, 11324680, 11108280, 10859280, 10595380, 10307330, 10127760, 10022990, 10092590, 10222740, 10634150, 10941030, 11280730, 11595750, 11863950, 11961590, + 11783780, 11673360, 11443570, 11208230, 10968550, 10686270, 10356300, 10175030, 10057670, 10092590, 10405730, 10792080, 11094150, 11428570, 11720430, 11994500, 12111110, + 11928860, 11799730, 11534390, 11295340, 11051960, 10738920, 10418160, 10210770, 10080930, 10139530, 10621190, 10913640, 11222650, 11595750, 11896320, 12161790, 12299010, + 12060860, 11928860, 11673360, 11383810, 11094150, 10792080, 10493380, 10246770, 10104290, 10186920, 10712530, 10968550, 11354170, 11720430, 12060860, 12316380, 12457140, + 12161790, 12044200, 11783780, 11473680, 11150900, 10832300, 10531400, 10283020, 10127760, 10283020, 10778740, 11051960, 11458610, 11831750, 12178770, 12457140, 12546760, + 12247190, 12111110, 11831750, 11549670, 11193840, 10872820, 10569700, 10319530, 10139530, 10331750, 10818860, 11108280, 11503960, 11912570, 12247190, 12528740, 12656020, + 12299010, 12161790, 11847830, 11549670, 11222650, 10900000, 10569700, 10319530, 10139530, 10331750, 10845770, 11122450, 11534390, 11961590, 12281690, 12564840, 12692870, + }, + { + 13184580, 13013010, 12695310, 12322270, 11839710, 11383540, 11045030, 10699590, 10534850, 10638300, 10887770, 11324040, 11839710, 12380950, 12845850, 13251780, 13457560, + 13144590, 12974050, 12658230, 12287330, 11828940, 11383540, 11016950, 10682000, 10509300, 10612240, 10860480, 11294530, 11818180, 12322270, 12782690, 13184580, 13388260, + 13013010, 12858560, 12572530, 12183690, 11775360, 11333910, 10951980, 10629600, 10450160, 10551950, 10806320, 11197240, 11722270, 12206570, 12645910, 13078470, 13265310, + 12871290, 12720160, 12416430, 12070570, 11648750, 11255410, 10887770, 10543390, 10416670, 10492330, 10743800, 11082690, 11576140, 12081780, 12500000, 12909630, 13065330, + 12658230, 12512030, 12252590, 11926610, 11535050, 11177990, 10788380, 10466990, 10366830, 10400000, 10620910, 10933560, 11433600, 11883000, 12287330, 12658230, 12820510, + 12428300, 12310610, 12025900, 11722270, 11403510, 11045030, 10647010, 10375100, 10301110, 10309280, 10517800, 10824310, 11226250, 11638320, 12037040, 12404580, 12560390, + 12172280, 12048190, 11796730, 11524820, 11226250, 10887770, 10517800, 10309280, 10228170, 10220130, 10400000, 10690790, 11054420, 11504420, 11850500, 12195120, 12333970, + 11883000, 11764710, 11555560, 11324040, 11035650, 10690790, 10366830, 10228170, 10077520, 10124610, 10268560, 10577700, 10906040, 11314190, 11648750, 11937560, 12081780, + 11701170, 11617520, 11423550, 11206900, 10924370, 10603590, 10317460, 10116730, 10007700, 10038610, 10180110, 10492330, 10806320, 11149230, 11473960, 11754070, 11883000, + 11754070, 11638320, 11453740, 11216570, 10942760, 10612240, 10317460, 10093170, 10000000, 10046370, 10156250, 10458570, 10779440, 11139670, 11463840, 11743450, 11893870, + 11893870, 11786040, 11555560, 11304350, 11007620, 10699590, 10350320, 10172140, 10046370, 10046370, 10156250, 10560520, 10915200, 11304350, 11648750, 11948530, 12081780, + 12048190, 11937560, 11701170, 11433600, 11120620, 10788380, 10433390, 10228170, 10054140, 10046370, 10350320, 10717230, 11045030, 11453740, 11786040, 12081780, 12206570, + 12218040, 12093020, 11807450, 11524820, 11226250, 10869570, 10509300, 10252370, 10101010, 10093170, 10543390, 10851420, 11216570, 11627910, 12003690, 12287330, 12440190, + 12392750, 12229540, 11970530, 11627910, 11304350, 10933560, 10577700, 10284810, 10132500, 10156250, 10647010, 10924370, 11353710, 11807450, 12160900, 12476010, 12609120, + 12512030, 12369170, 12070570, 11743450, 11373580, 10989010, 10647010, 10358570, 10156250, 10252370, 10734930, 11007620, 11484100, 11926610, 12310610, 12621360, 12757610, + 12596900, 12452110, 12160900, 11818180, 11403510, 11026290, 10673230, 10400000, 10172140, 10292950, 10761590, 11045030, 11555560, 12014790, 12392750, 12695310, 12820510, + 12633630, 12487990, 12206570, 11839710, 11423550, 11045030, 10690790, 10425020, 10164190, 10309280, 10779440, 11054420, 11576140, 12059370, 12440190, 12732620, 12845850, + }, + { + 12908370, 12755910, 12449570, 12078290, 11623320, 11153180, 10773070, 10485440, 10326690, 10493930, 10791010, 11230500, 11792540, 12331110, 12793680, 13184130, 13388430, + 12857140, 12718350, 12401910, 12033430, 11581770, 11143590, 10755190, 10468500, 10310260, 10476960, 10773070, 11201380, 11749770, 12284360, 12743360, 13144020, 13347070, + 12743360, 12619280, 12307690, 11944700, 11520000, 11095890, 10719600, 10418010, 10277560, 10426390, 10719600, 11134020, 11675680, 12180450, 12619280, 13051360, 13238000, + 12643900, 12497590, 12191910, 11835620, 11418500, 11048590, 10675450, 10384620, 10253160, 10368000, 10657890, 11039180, 11540520, 12044610, 12485550, 12869910, 13051360, + 12461540, 12319390, 12033430, 11696750, 11338580, 10973750, 10596890, 10293880, 10228890, 10302070, 10570960, 10927490, 11408450, 11879010, 12272730, 12656250, 12844400, + 12261120, 12123480, 11824820, 11540520, 11230500, 10872480, 10476960, 10253160, 10164710, 10212770, 10485440, 10809010, 11240240, 11675680, 12078290, 12413790, 12582520, + 12022260, 11900830, 11633750, 11368420, 11076920, 10746270, 10384620, 10204720, 10101330, 10156740, 10384620, 10701900, 11086400, 11530250, 11922720, 12249530, 12378220, + 11781820, 11665170, 11448760, 11220780, 10936710, 10596890, 10285710, 10132920, 10000000, 10077760, 10269410, 10614250, 10973750, 11388400, 11728510, 12033430, 12180450, + 11675680, 11571430, 11358460, 11134020, 10845190, 10545160, 10253160, 10077760, 10000000, 10054310, 10228890, 10562350, 10890760, 11259770, 11602510, 11900830, 12033430, + 11739130, 11633750, 11418500, 11191710, 10918280, 10588240, 10293880, 10101330, 10007720, 10093460, 10253160, 10579590, 10927490, 11289200, 11633750, 11933700, 12044610, + 11900830, 11781820, 11540520, 11299040, 11011040, 10693070, 10376300, 10180680, 10077760, 10125000, 10285710, 10701900, 11095890, 11479180, 11824820, 12123480, 12261120, + 12078290, 11944700, 11675680, 11428570, 11143590, 10818030, 10451610, 10261280, 10117100, 10172680, 10485440, 10899920, 11240240, 11654680, 12000000, 12296020, 12425700, + 12249530, 12112150, 11857270, 11540520, 11259770, 10899920, 10536580, 10293880, 10172680, 10204720, 10728480, 11039180, 11448760, 11857270, 12237960, 12545980, 12681020, + 12413790, 12272730, 12000000, 11665170, 11348510, 10973750, 10640390, 10351440, 10220820, 10293880, 10818030, 11143590, 11592130, 12033430, 12413790, 12718350, 12844400, + 12545980, 12413790, 12112150, 11771120, 11398420, 11029790, 10710740, 10418010, 10245060, 10409640, 10899920, 11220780, 11707320, 12169010, 12570320, 12895520, 13012050, + 12668620, 12509650, 12180450, 11857270, 11448760, 11086400, 10737370, 10451610, 10285710, 10460050, 10945950, 11289200, 11792540, 12249530, 12643900, 12972970, 13104150, + 12730850, 12545980, 12214890, 11868130, 11469030, 11114920, 10746270, 10476960, 10302070, 10468500, 10992370, 11308900, 11824820, 12296020, 12668620, 12999000, 13144020, + }, + { + 12126980, 11993720, 11753850, 11471470, 11137030, 10852270, 10581720, 10352300, 10200270, 10241290, 10380430, 10700280, 11104650, 11488720, 11826620, 12126980, 12243590, + 12069510, 11974920, 11735790, 11437130, 11120820, 10821530, 10567080, 10338290, 10186670, 10227580, 10366350, 10655510, 11056440, 11454270, 11790120, 12088610, 12204470, + 12012580, 11900310, 11664120, 11385990, 11072460, 10790960, 10523420, 10310390, 10159570, 10200270, 10324320, 10581720, 10992810, 11352150, 11699850, 11993720, 12107770, + 11900310, 11771960, 11558250, 11301770, 11008650, 10745430, 10480110, 10268820, 10159570, 10173100, 10282640, 10508940, 10898720, 11218800, 11575760, 11863350, 11974920, + 11771960, 11646340, 11437130, 11218800, 10929900, 10700280, 10422920, 10227580, 10146080, 10105820, 10213900, 10437160, 10760560, 11088530, 11437130, 11717790, 11826620, + 11628610, 11523380, 11318520, 11088530, 10883190, 10640670, 10380430, 10200270, 10132630, 10105820, 10213900, 10380430, 10640670, 10945560, 11285080, 11540790, 11664120, + 11454270, 11369050, 11169590, 10961260, 10790960, 10537930, 10310390, 10173100, 10105820, 10052630, 10119210, 10296500, 10537930, 10883190, 11202350, 11454270, 11540790, + 11285080, 11202350, 11024530, 10883190, 10670390, 10451440, 10255030, 10159570, 10039420, 10026250, 10079160, 10241290, 10480110, 10775740, 11040460, 11268440, 11352150, + 11202350, 11120820, 10977010, 10821530, 10625870, 10422920, 10255030, 10119210, 10039420, 10000000, 10039420, 10227580, 10451440, 10685320, 10945560, 11137030, 11235290, + 11301770, 11202350, 11040460, 10867710, 10700280, 10494510, 10310390, 10146080, 10065880, 10039420, 10065880, 10227580, 10422920, 10670390, 10945560, 11185940, 11251840, + 11402980, 11318520, 11153280, 10961260, 10790960, 10581720, 10324320, 10241290, 10119210, 10065880, 10065880, 10310390, 10508940, 10790960, 11088530, 11335310, 11402980, + 11575760, 11454270, 11235290, 11088530, 10883190, 10655510, 10408720, 10282640, 10132630, 10079160, 10200270, 10394560, 10581720, 10929900, 11218800, 11437130, 11558250, + 11699850, 11593320, 11385990, 11169590, 10977010, 10700280, 10480110, 10296500, 10173100, 10092470, 10324320, 10465750, 10715290, 11056440, 11369050, 11593320, 11699850, + 11808350, 11699850, 11506020, 11268440, 11024530, 10760560, 10523420, 10338290, 10213900, 10146080, 10394560, 10508940, 10836880, 11185940, 11488720, 11735790, 11844960, + 11937500, 11808350, 11575760, 11335310, 11072460, 10806220, 10581720, 10394560, 10213900, 10213900, 10451440, 10581720, 10929900, 11285080, 11610940, 11863350, 11974920, + 12012580, 11881800, 11646340, 11402980, 11088530, 10836880, 10611110, 10422920, 10227580, 10241290, 10465750, 10625870, 10992810, 11352150, 11681960, 11937500, 12050470, + 12031500, 11900310, 11664120, 11420030, 11104650, 10852270, 10640670, 10437160, 10227580, 10255030, 10465750, 10640670, 11024530, 11369050, 11699850, 11974920, 12088610, + }, + } +}; + + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + memcpy(&pstDef->stLsc.stLscParaTable[0], &g_stCmosLscTable[0], sizeof(ISP_LSC_CABLI_TABLE_S)*HI_ISP_LSC_LIGHT_NUM); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + + pstDef->stDrc.bEnable = HI_FALSE; + pstDef->stDrc.u8Asymmetry = 0x02; + pstDef->stDrc.u8SecondPole = 0xC0; + pstDef->stDrc.u8Stretch = 0x3C; + pstDef->stDrc.u8LocalMixingBrigtht = 0x2D; + pstDef->stDrc.u8LocalMixingDark = 0x2D; + pstDef->stDrc.u8LocalMixingThres = 0x02; + pstDef->stDrc.u16BrightGainLmt = 0x7F; + pstDef->stDrc.u16DarkGainLmtC = 0x7F; + pstDef->stDrc.u16DarkGainLmtY = 0x7F; + pstDef->stDrc.u8RangeVar = 0x00; + pstDef->stDrc.u8SpatialVar = 0x0A; + + memcpy(&pstDef->stDemosaic, &g_stIspDemosaicLin, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stGe, &g_stIspGeLin, sizeof(ISP_CMOS_GE_S)); + + pstDef->stNoiseTbl.stNrCaliPara.u8CalicoefRow = DMNR_CALIB_CARVE_NUM_9M034; + pstDef->stNoiseTbl.stNrCaliPara.pCalibcoef = (HI_FLOAT (*)[4])g_coef_calib_9m034; + memcpy(&pstDef->stNoiseTbl.stIsoParaTable[0], &g_stNrIsoParaTab[0],sizeof(ISP_NR_ISO_PARA_TABLE_S)*HI_ISP_NR_ISO_LEVEL_MAX); + + + memcpy(&pstDef->stRgbSharpen, &g_stIspRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stUvnr, &g_stIspUVNR, sizeof(ISP_CMOS_UVNR_S)); + memcpy(&pstDef->stDpc, &g_stCmosDpc, sizeof(ISP_CMOS_DPC_S)); + break; + case WDR_MODE_BUILT_IN: + + pstDef->stDrc.bEnable = HI_TRUE; + pstDef->stDrc.u8Asymmetry = 0x01; + pstDef->stDrc.u8SecondPole = 0xC0; + pstDef->stDrc.u8Stretch = 0x3C; + pstDef->stDrc.u8LocalMixingBrigtht = 0x2D; + pstDef->stDrc.u8LocalMixingDark = 0x2D; + pstDef->stDrc.u8LocalMixingThres = 0x02; + pstDef->stDrc.u16BrightGainLmt = 0x7F; + pstDef->stDrc.u16DarkGainLmtC = 0x7F; + pstDef->stDrc.u16DarkGainLmtY = 0x7F; + pstDef->stDrc.u8RangeVar = 0x00; + pstDef->stDrc.u8SpatialVar = 0x0A; + + memcpy(&pstDef->stDemosaic, &g_stIspDemosaicWDR, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stGe, &g_stIspGeWDR, sizeof(ISP_CMOS_GE_S)); + + pstDef->stNoiseTbl.stNrCaliPara.u8CalicoefRow = DMNR_CALIB_CARVE_NUM_9M034; + pstDef->stNoiseTbl.stNrCaliPara.pCalibcoef = (HI_FLOAT (*)[4])g_coef_calib_9m034WDR; + memcpy(&pstDef->stNoiseTbl.stIsoParaTable[0], &g_stNrIsoParaTabWDR[0],sizeof(ISP_NR_ISO_PARA_TABLE_S)*HI_ISP_NR_ISO_LEVEL_MAX); + + memcpy(&pstDef->stGammafe, &g_stGammafe, sizeof(ISP_CMOS_GAMMAFE_S)); + + memcpy(&pstDef->stRgbSharpen, &g_stIspRgbSharpenWDR, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stUvnr, &g_stIspUVNR, sizeof(ISP_CMOS_UVNR_S)); + memcpy(&pstDef->stDpc, &g_stCmosDpcWDR, sizeof(ISP_CMOS_DPC_S)); + memcpy(&pstDef->stCompander, &g_stCmosCompander, sizeof(ISP_CMOS_COMPANDER_S)); + + break; + } + pstDef->stSensorMaxResolution.u32MaxWidth = 1280; + pstDef->stSensorMaxResolution.u32MaxHeight = 720; + + return 0; +} + +#endif + +HI_U32 cmos_get_isp_black_level(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel) +{ + HI_S32 i; + + if (HI_NULL == pstBlackLevel) + { + printf("null pointer when get isp black level value!\n"); + return -1; + } + + /* Don't need to update black level when iso change */ + pstBlackLevel->bUpdate = HI_FALSE; + + switch (genSensorMode) + { + default : + case WDR_MODE_NONE : + for (i=0; i<4; i++) + { + pstBlackLevel->au16BlackLevel[i] = 0xA8; + } + break; + case WDR_MODE_BUILT_IN : + for (i=0; i<4; i++) + { + pstBlackLevel->au16BlackLevel[i] = 0xC0; + } + break; + } + + return 0; +} + + +HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) +{ + HI_U32 u32FullLines_5Fps = FRAME_LINES_720P; + + if (SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + u32FullLines_5Fps = LINE_LENGTH_PCK_720P_30FPS * 30 / 5; + } + else if(SENSOR_960P_30FPS_MODE == gu8SensorImageMode) + { + u32FullLines_5Fps = LINE_LENGTH_PCK_960P_30FPS * 30 / 5; + } + else + { + return; + } + + u32FullLines_5Fps = (u32FullLines_5Fps > 0xFFFF) ? 0xFFFF : u32FullLines_5Fps; + + if (bEnable) /* setup for ISP pixel calibration mode */ + { + sensor_write_register(LINE_LEN_PCK, u32FullLines_5Fps); /* 5fps */ + sensor_write_register(EXPOSURE_TIME, 0x118); /* max exposure time */ + sensor_write_register(ANALOG_GAIN, 0x1300); /* AG, Context A */ + sensor_write_register(DIGITAL_GAIN, 0x0020); /* DG, Context A */ + } + else /* setup for ISP 'normal mode' */ + { + if(SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + sensor_write_register(LINE_LEN_PCK, LINE_LENGTH_PCK_720P_30FPS); + } + else if(SENSOR_960P_30FPS_MODE == gu8SensorImageMode) + { + sensor_write_register(LINE_LEN_PCK, LINE_LENGTH_PCK_960P_30FPS); + } + else + { + } + bInit = HI_FALSE; + } + + return; +} + + +HI_VOID cmos_set_wdr_mode(HI_U8 u8Mode) +{ + bInit = HI_FALSE; + + switch(u8Mode) + { + case WDR_MODE_NONE: + genSensorMode = WDR_MODE_NONE; + + /* Disable DCG */ + sensor_write_register(0x3100, 0x0000); + + /* Disable 1.25x analog gain */ + sensor_write_register(0x3EE4, 0xD208); + + printf("linear mode\n"); + break; + + case WDR_MODE_BUILT_IN: + genSensorMode = WDR_MODE_BUILT_IN; + + /* Disable DCG */ + sensor_write_register(0x3100, 0x001A); + + /* Disable 1.25x analog gain */ + sensor_write_register(0x3EE4, 0xD208); + + printf("WDR mode\n"); + break; + + default: + printf("NOT support this mode!\n"); + return; + break; + } + + return; +} + + +static HI_S32 cmos_set_image_mode(ISP_CMOS_SENSOR_IMAGE_MODE_S *pstSensorImageMode) +{ + HI_U8 u8SensorImageMode = gu8SensorImageMode; + + bInit = HI_FALSE; + + if (HI_NULL == pstSensorImageMode ) + { + printf("null pointer when set image mode\n"); + return -1; + } + + if((pstSensorImageMode->u16Width <= 1280)&&(pstSensorImageMode->u16Height <= 720)) + { + if (pstSensorImageMode->f32Fps <= 30) + { + u8SensorImageMode = SENSOR_720P_30FPS_MODE; + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + + return -1; + } + } + else if((pstSensorImageMode->u16Width <= 1280)&&(pstSensorImageMode->u16Height <= 960)) + { + if (pstSensorImageMode->f32Fps <= 30) + { + u8SensorImageMode = SENSOR_960P_30FPS_MODE; + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + + return -1; + } + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + } + + /* Sensor first init */ + if (HI_FALSE == bSensorInit) + { + gu8SensorImageMode = u8SensorImageMode; + + return 0; + } + + /* Switch SensorImageMode */ + if (u8SensorImageMode == gu8SensorImageMode) + { + /* Don't need to switch SensorImageMode */ + return -1; + } + + gu8SensorImageMode = u8SensorImageMode; + + return 0; + +} + +HI_U32 cmos_get_sns_regs_info(ISP_SNS_REGS_INFO_S *pstSnsRegsInfo) +{ + HI_S32 i; + + if (HI_FALSE == bInit) + { + g_stSnsRegsInfo.enSnsType = ISP_SNS_I2C_TYPE; + g_stSnsRegsInfo.u8Cfg2ValidDelayMax = 2; + g_stSnsRegsInfo.u32RegNum = 3; + + for (i=0; i (PATHLEN_MAX - 30)) + { + printf("Set inifile path is larger PATHLEN_MAX!\n"); + return -1; + } + strncat(pcName, pcPath, strlen(pcPath)); + strncat(pcName, CMOS_CFG_INI, sizeof(CMOS_CFG_INI)); + } + + return 0; + +} + +HI_VOID sensor_global_init() +{ + gu8SensorImageMode = SENSOR_720P_30FPS_MODE; + genSensorMode = WDR_MODE_NONE; + gu32FullLinesStd = FRAME_LINES_720P; + gu32FullLines = FRAME_LINES_720P; + bInit = HI_FALSE; + bSensorInit = HI_FALSE; + + memset(&g_stSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + memset(&g_stPreSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + +#ifdef INIFILE_CONFIG_MODE + HI_S32 s32Ret = HI_SUCCESS; + s32Ret = Cmos_LoadINIPara(pcName); + if (HI_SUCCESS != s32Ret) + { + printf("Cmos_LoadINIPara failed!!!!!!\n"); + } +#else + +#endif + +} + +HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc) +{ + memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S)); + + pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init; + pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit; + pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init; + pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode; + pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode; + + pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default; + pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level; + pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect; + pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info; + + return 0; +} + +/**************************************************************************** + * callback structure * + ****************************************************************************/ + +int sensor_register_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + ISP_SENSOR_REGISTER_S stIspRegister; + AE_SENSOR_REGISTER_S stAeRegister; + AWB_SENSOR_REGISTER_S stAwbRegister; + + cmos_init_sensor_exp_function(&stIspRegister.stSnsExp); + s32Ret = HI_MPI_ISP_SensorRegCallBack(IspDev, M034_ID, &stIspRegister); + if (s32Ret) + { + printf("sensor register callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + cmos_init_ae_exp_function(&stAeRegister.stSnsExp); + s32Ret = HI_MPI_AE_SensorRegCallBack(IspDev, &stLib, M034_ID, &stAeRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + cmos_init_awb_exp_function(&stAwbRegister.stSnsExp); + s32Ret = HI_MPI_AWB_SensorRegCallBack(IspDev, &stLib, M034_ID, &stAwbRegister); + if (s32Ret) + { + printf("sensor register callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_unregister_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + + s32Ret = HI_MPI_ISP_SensorUnRegCallBack(IspDev, M034_ID); + if (s32Ret) + { + printf("sensor unregister callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + s32Ret = HI_MPI_AE_SensorUnRegCallBack(IspDev, &stLib, M034_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + s32Ret = HI_MPI_AWB_SensorUnRegCallBack(IspDev, &stLib, M034_ID); + if (s32Ret) + { + printf("sensor unregister callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/component/isp/sensor/aptina_9m034/m034_sensor_config.h b/device/mpp/component/isp/sensor/aptina_9m034/m034_sensor_config.h new file mode 100644 index 0000000..b5237a5 --- /dev/null +++ b/device/mpp/component/isp/sensor/aptina_9m034/m034_sensor_config.h @@ -0,0 +1,821 @@ + +//9m034 720P 30fps linear +static int sensor_rom_30_lin[] = { + // [Linear Mode 720p 30fps AE=on EMBEDDED=on] +//[Demo Initialization] +//Load = Reset +//[Reset] + 0xFFFE00C8, // wait 8 frames + 0x301A10D9, + 0xFFFE0005, // delay 5ms after sensor reset + 0x301A10D8, +//[Reset]// + 0xFFFE00C8, +//Load = A-1000ERS Rev3 Hidy and linear sequencer load December 16 2010 +//[A-1000ERS Rev3 Hidy and linear sequencer load December 16 2010] +//HiDY sequencer CR 31644 + 0x30888000, //SEQ_CTRL_PORT + 0x30860025, //SEQ_DATA_PORT + 0x30865050, //SEQ_DATA_PORT + 0x30862D26, //SEQ_DATA_PORT + 0x30860828, //SEQ_DATA_PORT + 0x30860D17, //SEQ_DATA_PORT + 0x30860926, //SEQ_DATA_PORT + 0x30860028, //SEQ_DATA_PORT + 0x30860526, //SEQ_DATA_PORT + 0x3086A728, //SEQ_DATA_PORT + 0x30860725, //SEQ_DATA_PORT + 0x30868080, //SEQ_DATA_PORT + 0x30862925, //SEQ_DATA_PORT + 0x30860040, //SEQ_DATA_PORT + 0x30862702, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30862706, //SEQ_DATA_PORT + //0x30888020, //write 0x3088 another time + + 0x30861F17, //SEQ_DATA_PORT + 0x30863626, //SEQ_DATA_PORT + 0x3086A617, //SEQ_DATA_PORT + 0x30860326, //SEQ_DATA_PORT + 0x3086A417, //SEQ_DATA_PORT + 0x30861F28, //SEQ_DATA_PORT + 0x30860526, //SEQ_DATA_PORT + 0x30862028, //SEQ_DATA_PORT + 0x30860425, //SEQ_DATA_PORT + 0x30862020, //SEQ_DATA_PORT + 0x30862700, //SEQ_DATA_PORT + 0x3086171D, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30862017, //SEQ_DATA_PORT + 0x30861028, //SEQ_DATA_PORT + 0x30860519, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x30862706, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x30861741, //SEQ_DATA_PORT + 0x30862660, //SEQ_DATA_PORT + 0x3086175A, //SEQ_DATA_PORT + 0x30862317, //SEQ_DATA_PORT + 0x30861122, //SEQ_DATA_PORT + 0x30861741, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30869027, //SEQ_DATA_PORT + 0x30860026, //SEQ_DATA_PORT + 0x30861828, //SEQ_DATA_PORT + 0x3086002E, //SEQ_DATA_PORT + 0x30862A28, //SEQ_DATA_PORT + 0x3086081C, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867003, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867004, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867005, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867009, //SEQ_DATA_PORT + 0x3086170C, //SEQ_DATA_PORT + 0x30860014, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30860014, //SEQ_DATA_PORT + 0x30860050, //SEQ_DATA_PORT + 0x30860314, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30860314, //SEQ_DATA_PORT + 0x30860050, //SEQ_DATA_PORT + 0x30860414, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30860414, //SEQ_DATA_PORT + 0x30860050, //SEQ_DATA_PORT + 0x30860514, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30862405, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30865001, //SEQ_DATA_PORT + 0x30862550, //SEQ_DATA_PORT + 0x3086502D, //SEQ_DATA_PORT + 0x30862608, //SEQ_DATA_PORT + 0x3086280D, //SEQ_DATA_PORT + 0x30861709, //SEQ_DATA_PORT + 0x30862600, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x308626A7, //SEQ_DATA_PORT + 0x30862807, //SEQ_DATA_PORT + 0x30862580, //SEQ_DATA_PORT + 0x30868029, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30864027, //SEQ_DATA_PORT + 0x30860216, //SEQ_DATA_PORT + 0x30861627, //SEQ_DATA_PORT + 0x30860620, //SEQ_DATA_PORT + 0x30861736, //SEQ_DATA_PORT + 0x308626A6, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x308626A4, //SEQ_DATA_PORT + 0x3086171F, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x30862620, //SEQ_DATA_PORT + 0x30862804, //SEQ_DATA_PORT + 0x30862520, //SEQ_DATA_PORT + 0x30862027, //SEQ_DATA_PORT + 0x30860017, //SEQ_DATA_PORT + 0x30861D25, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30861710, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x30861A17, //SEQ_DATA_PORT + 0x30860327, //SEQ_DATA_PORT + 0x30860617, //SEQ_DATA_PORT + 0x30860317, //SEQ_DATA_PORT + 0x30864126, //SEQ_DATA_PORT + 0x30866017, //SEQ_DATA_PORT + 0x3086AE25, //SEQ_DATA_PORT + 0x30860090, //SEQ_DATA_PORT + 0x30862700, //SEQ_DATA_PORT + 0x30862618, //SEQ_DATA_PORT + 0x30862800, //SEQ_DATA_PORT + 0x30862E2A, //SEQ_DATA_PORT + 0x30862808, //SEQ_DATA_PORT + 0x30861D05, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867009, //SEQ_DATA_PORT + 0x30861720, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30862024, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30865002, //SEQ_DATA_PORT + 0x30862550, //SEQ_DATA_PORT + 0x3086502D, //SEQ_DATA_PORT + 0x30862608, //SEQ_DATA_PORT + 0x3086280D, //SEQ_DATA_PORT + 0x30861709, //SEQ_DATA_PORT + 0x30862600, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x308626A7, //SEQ_DATA_PORT + 0x30862807, //SEQ_DATA_PORT + 0x30862580, //SEQ_DATA_PORT + 0x30868029, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30864027, //SEQ_DATA_PORT + 0x30860216, //SEQ_DATA_PORT + 0x30861627, //SEQ_DATA_PORT + 0x30860617, //SEQ_DATA_PORT + 0x30863626, //SEQ_DATA_PORT + 0x3086A617, //SEQ_DATA_PORT + 0x30860326, //SEQ_DATA_PORT + 0x3086A417, //SEQ_DATA_PORT + 0x30861F28, //SEQ_DATA_PORT + 0x30860526, //SEQ_DATA_PORT + 0x30862028, //SEQ_DATA_PORT + 0x30860425, //SEQ_DATA_PORT + 0x30862020, //SEQ_DATA_PORT + 0x30862700, //SEQ_DATA_PORT + 0x3086171D, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30862021, //SEQ_DATA_PORT + 0x30861710, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x30861B17, //SEQ_DATA_PORT + 0x30860327, //SEQ_DATA_PORT + 0x30860617, //SEQ_DATA_PORT + 0x30860317, //SEQ_DATA_PORT + 0x30864126, //SEQ_DATA_PORT + 0x30866017, //SEQ_DATA_PORT + 0x3086AE25, //SEQ_DATA_PORT + 0x30860090, //SEQ_DATA_PORT + 0x30862700, //SEQ_DATA_PORT + 0x30862618, //SEQ_DATA_PORT + 0x30862800, //SEQ_DATA_PORT + 0x30862E2A, //SEQ_DATA_PORT + 0x30862808, //SEQ_DATA_PORT + 0x30861E17, //SEQ_DATA_PORT + 0x30860A05, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867009, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30862024, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x3086502B, //SEQ_DATA_PORT + 0x3086302C, //SEQ_DATA_PORT + 0x30862C2C, //SEQ_DATA_PORT + 0x30862C00, //SEQ_DATA_PORT + 0x30860225, //SEQ_DATA_PORT linear seq starts + 0x30865050, //SEQ_DATA_PORT + 0x30862D26, //SEQ_DATA_PORT + 0x30860828, //SEQ_DATA_PORT + 0x30860D17, //SEQ_DATA_PORT + 0x30860926, //SEQ_DATA_PORT + 0x30860028, //SEQ_DATA_PORT + 0x30860526, //SEQ_DATA_PORT + 0x3086A728, //SEQ_DATA_PORT + 0x30860725, //SEQ_DATA_PORT + 0x30868080, //SEQ_DATA_PORT + 0x30862917, //SEQ_DATA_PORT + 0x30860525, //SEQ_DATA_PORT + 0x30860040, //SEQ_DATA_PORT + 0x30862702, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30862706, //SEQ_DATA_PORT + 0x30861736, //SEQ_DATA_PORT + 0x308626A6, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x308626A4, //SEQ_DATA_PORT + 0x3086171F, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x30862620, //SEQ_DATA_PORT + 0x30862804, //SEQ_DATA_PORT + 0x30862520, //SEQ_DATA_PORT + 0x30862027, //SEQ_DATA_PORT + 0x30860017, //SEQ_DATA_PORT + 0x30861E25, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30862117, //SEQ_DATA_PORT + 0x30861028, //SEQ_DATA_PORT + 0x3086051B, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x30862706, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x30861747, //SEQ_DATA_PORT + 0x30862660, //SEQ_DATA_PORT + 0x308617AE, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30869027, //SEQ_DATA_PORT + 0x30860026, //SEQ_DATA_PORT + 0x30861828, //SEQ_DATA_PORT + 0x3086002E, //SEQ_DATA_PORT + 0x30862A28, //SEQ_DATA_PORT + 0x3086081E, //SEQ_DATA_PORT + 0x30860831, //SEQ_DATA_PORT + 0x30861440, //SEQ_DATA_PORT + 0x30864014, //SEQ_DATA_PORT + 0x30862020, //SEQ_DATA_PORT + 0x30861410, //SEQ_DATA_PORT + 0x30861034, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30861014, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30864013, //SEQ_DATA_PORT + 0x30861802, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867004, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867003, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867017, //SEQ_DATA_PORT + 0x30862002, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30862002, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30865004, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30862004, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30865022, //SEQ_DATA_PORT + 0x30860314, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30860314, //SEQ_DATA_PORT + 0x30860050, //SEQ_DATA_PORT + 0x30862C2C, //SEQ_DATA_PORT + 0x30862C2C, //SEQ_DATA_PORT + 0x309E018A, //set start address for linear seq + +//[A-1000ERS Rev3 Hidy and linear sequencer load December 16 2010]// + 0xFFFE00C8, +//Load = A-1000ERS Rev3 Optimized settings +//[A-1000ERS Rev3 Optimized settings] + 0x301E00A8, // set datapedestal to 168 + 0x3EDA0F03, //Set vln_dac to 0x3 as recommended by Sergey + 0x3EDEC007, + 0x3ED801EF, // Vrst_low = +1 + 0x3EE2A46B, + //0x3EE0067D, // enable anti eclipse and adjust setting for high conversion gain + 0x3EE0047D, // enable anti eclipse and adjust setting for high conversion gain, decrease vertical line. + 0x3EDC0070, // adjust anti eclipse setting for low conversion gain + 0x30440404, //enable digital row noise correction and cancels TX during column correction + 0x3EE64303, // Helps with column noise at low light + 0x3EE4D208, // enable analog row noise correction + 0x3ED600BD, + //0x3EE68303, //improves low light FPN + + // ADC settings to improve noise performance + // c55300 comment: resolve defect pixel problem. + 0x30E46372, + 0x30E27253, + 0x30E05470, + 0x30E6C4CC, + 0x30E88050, +//[A-1000ERS Rev3 Optimized settings]// + +//[HDR Mode Setup]// + + +//LOAD = Enable Parallel Mode //detect HSSAB board +//[Enable Parallel Mode] + 0x301A10D8, // Disable Streaming and setup parallel + 0x31D00001, // Set to 12 bits +//Load = PLL Enabled 27Mhz to 74.25Mhz +//[PLL Enabled 27Mhz to 74.25Mhz] + 0x302C0002, // VT_SYS_CLK_DIV + 0x302A0004, // VT_PIX_CLK_DIV + 0x302E0002, // PRE_PLL_CLK_DIV + 0x3030002C, // PLL_MULTIPLIER + 0x30B00000, // Default is 0x1300???? + 0xFFFE0064, +//[PLL Enabled 27Mhz to 74.25Mhz]// +//[Enable Parallel Mode]// +//Load = Linear Mode Full Resolution +//[Linear Mode Full Resolution] +//LOAD= Linear Mode Setup +//[Linear Mode Setup] + 0x301A10D8, // stop streaming + 0x30820029, // Set Linear Mode register + +//LOAD = Enable AE and Load Optimized Settings For HDR 16x Mode +//[Enable AE and Load Optimized Settings For Linear Mode] + +//Load = Column Retriggering at start up +//[Column Retriggering at start up] + 0x30B01300, //disable AGS, set Column gain to 1x + 0x30D4E007, //enable double sampling for column correction + 0x30BA0008, // disable auto re-trigger for change in DCG and col gain and enable col corr always + 0x301A10DC, // enable streaming + 0xFFFE00C8, + 0x301A10D8, // disable streaming + 0xFFFE00C8, +//[Column Retriggering at start up]// + + 0x301202A0, // coarse integration time + +//Load = 720p 30fps Setup +//[720p 30fps Setup] + 0x30320000, // digital binning + 0x30020002, // y_addr_start + 0x30040000, // x_addr_start + 0x300602D1, // y_addr_end + 0x300804FF, // x_addr_end + 0x300A02EE, // frame_length_lines + 0x300C0F78, // line_length_pck +//[720p 30fps Setup]// + +//Load= Enable Embedded Data and Stats +//[Enable Embedded Data and Stats] + //0x30641982, //0x30641800 +//[Enable Embedded Data and Stats]// + +//[Disable Embedded Data and Stats] + 0x30641802, + +//remove vertical line, put here can not take effect. Why???? +//[Enable AE and Load Optimized Settings For Linear Mode]// + 0x3100001B, //FIELD_WR=AECTRLREG, 0x001B + 0x3112029F, //FIELD_WR=AEDCGEXPOSUREHIGHREG, 0x029F + 0x3114008C, //FIELD_WR=AEDCGEXPOSURELOWREG, 0x008C + 0x311602C0, //FIELD_WR=AEDCGGAINFACTOR, 0x02C0 + 0x3118005B, //FIELD_WR=AEDCGGAININVREG, 0x005B + 0x31020384, //FIELD_WR=AELUMATARGETREG, 0x0384 + 0x31041000, //FIELD_WR-AEHISTTARGETREG, 0x1000 + 0x31260080, //FIELD_WR=AEALPHAV1REG, 0x0080 + 0x311C03DD, //FIELD_WR=AEMAXEXPOSUREREG, 0x03C0 + 0x311E0002, //FIELD_WR=AEMINEXPOSUREREG, 0x0002 +//[Enable AE and Load Optimized Settings For Linear Mode]// + +//[Disable_AutoExposure] + 0x3100001A, //FIELD_WR=AECTRLREG, 0x001A ???? + + 0x301A10DC, //enable streaming. + + +//[Linear Mode Full Resolution]// + 0xFFFFFFFF // END +}; + + +//9m034 720P 30fps wdr +static int sensor_rom_30_wdr[] = { + // [Linear Mode 720p 30fps AE=on EMBEDDED=on] +//[Demo Initialization] +//Load = Reset +//[Reset] + 0xFFFE00C8, // wait 8 frames + 0x301A10D9, + 0xFFFE0005, // delay 5ms after sensor reset + 0x301A10D8, +//[Reset]// + 0xFFFE00C8, +//Load = A-1000ERS Rev3 Hidy and linear sequencer load December 16 2010 +//[A-1000ERS Rev3 Hidy and linear sequencer load December 16 2010] +//HiDY sequencer CR 31644 + 0x30888000, //SEQ_CTRL_PORT + 0x30860025, //SEQ_DATA_PORT + 0x30865050, //SEQ_DATA_PORT + 0x30862D26, //SEQ_DATA_PORT + 0x30860828, //SEQ_DATA_PORT + 0x30860D17, //SEQ_DATA_PORT + 0x30860926, //SEQ_DATA_PORT + 0x30860028, //SEQ_DATA_PORT + 0x30860526, //SEQ_DATA_PORT + 0x3086A728, //SEQ_DATA_PORT + 0x30860725, //SEQ_DATA_PORT + 0x30868080, //SEQ_DATA_PORT + 0x30862925, //SEQ_DATA_PORT + 0x30860040, //SEQ_DATA_PORT + 0x30862702, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30862706, //SEQ_DATA_PORT + + 0x30888020, //write 0x3088 another time + + 0x30861F17, //SEQ_DATA_PORT + 0x30863626, //SEQ_DATA_PORT + 0x3086A617, //SEQ_DATA_PORT + 0x30860326, //SEQ_DATA_PORT + 0x3086A417, //SEQ_DATA_PORT + 0x30861F28, //SEQ_DATA_PORT + 0x30860526, //SEQ_DATA_PORT + 0x30862028, //SEQ_DATA_PORT + 0x30860425, //SEQ_DATA_PORT + 0x30862020, //SEQ_DATA_PORT + 0x30862700, //SEQ_DATA_PORT + 0x3086171D, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30862017, //SEQ_DATA_PORT + 0x30861028, //SEQ_DATA_PORT + 0x30860519, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x30862706, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x30861741, //SEQ_DATA_PORT + 0x30862660, //SEQ_DATA_PORT + 0x3086175A, //SEQ_DATA_PORT + 0x30862317, //SEQ_DATA_PORT + 0x30861122, //SEQ_DATA_PORT + 0x30861741, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30869027, //SEQ_DATA_PORT + 0x30860026, //SEQ_DATA_PORT + 0x30861828, //SEQ_DATA_PORT + 0x3086002E, //SEQ_DATA_PORT + 0x30862A28, //SEQ_DATA_PORT + 0x3086081C, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867003, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867004, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867005, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867009, //SEQ_DATA_PORT + 0x3086170C, //SEQ_DATA_PORT + 0x30860014, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30860014, //SEQ_DATA_PORT + 0x30860050, //SEQ_DATA_PORT + 0x30860314, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30860314, //SEQ_DATA_PORT + 0x30860050, //SEQ_DATA_PORT + 0x30860414, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30860414, //SEQ_DATA_PORT + 0x30860050, //SEQ_DATA_PORT + 0x30860514, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30862405, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30865001, //SEQ_DATA_PORT + 0x30862550, //SEQ_DATA_PORT + 0x3086502D, //SEQ_DATA_PORT + 0x30862608, //SEQ_DATA_PORT + 0x3086280D, //SEQ_DATA_PORT + 0x30861709, //SEQ_DATA_PORT + 0x30862600, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x308626A7, //SEQ_DATA_PORT + 0x30862807, //SEQ_DATA_PORT + 0x30862580, //SEQ_DATA_PORT + 0x30868029, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30864027, //SEQ_DATA_PORT + 0x30860216, //SEQ_DATA_PORT + 0x30861627, //SEQ_DATA_PORT + 0x30860620, //SEQ_DATA_PORT + 0x30861736, //SEQ_DATA_PORT + 0x308626A6, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x308626A4, //SEQ_DATA_PORT + 0x3086171F, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x30862620, //SEQ_DATA_PORT + 0x30862804, //SEQ_DATA_PORT + 0x30862520, //SEQ_DATA_PORT + 0x30862027, //SEQ_DATA_PORT + 0x30860017, //SEQ_DATA_PORT + 0x30861D25, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30861710, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x30861A17, //SEQ_DATA_PORT + 0x30860327, //SEQ_DATA_PORT + 0x30860617, //SEQ_DATA_PORT + 0x30860317, //SEQ_DATA_PORT + 0x30864126, //SEQ_DATA_PORT + 0x30866017, //SEQ_DATA_PORT + 0x3086AE25, //SEQ_DATA_PORT + 0x30860090, //SEQ_DATA_PORT + 0x30862700, //SEQ_DATA_PORT + 0x30862618, //SEQ_DATA_PORT + 0x30862800, //SEQ_DATA_PORT + 0x30862E2A, //SEQ_DATA_PORT + 0x30862808, //SEQ_DATA_PORT + 0x30861D05, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867009, //SEQ_DATA_PORT + 0x30861720, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30862024, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30865002, //SEQ_DATA_PORT + 0x30862550, //SEQ_DATA_PORT + 0x3086502D, //SEQ_DATA_PORT + 0x30862608, //SEQ_DATA_PORT + 0x3086280D, //SEQ_DATA_PORT + 0x30861709, //SEQ_DATA_PORT + 0x30862600, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x308626A7, //SEQ_DATA_PORT + 0x30862807, //SEQ_DATA_PORT + 0x30862580, //SEQ_DATA_PORT + 0x30868029, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30864027, //SEQ_DATA_PORT + 0x30860216, //SEQ_DATA_PORT + 0x30861627, //SEQ_DATA_PORT + 0x30860617, //SEQ_DATA_PORT + 0x30863626, //SEQ_DATA_PORT + 0x3086A617, //SEQ_DATA_PORT + 0x30860326, //SEQ_DATA_PORT + 0x3086A417, //SEQ_DATA_PORT + 0x30861F28, //SEQ_DATA_PORT + 0x30860526, //SEQ_DATA_PORT + 0x30862028, //SEQ_DATA_PORT + 0x30860425, //SEQ_DATA_PORT + 0x30862020, //SEQ_DATA_PORT + 0x30862700, //SEQ_DATA_PORT + 0x3086171D, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30862021, //SEQ_DATA_PORT + 0x30861710, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x30861B17, //SEQ_DATA_PORT + 0x30860327, //SEQ_DATA_PORT + 0x30860617, //SEQ_DATA_PORT + 0x30860317, //SEQ_DATA_PORT + 0x30864126, //SEQ_DATA_PORT + 0x30866017, //SEQ_DATA_PORT + 0x3086AE25, //SEQ_DATA_PORT + 0x30860090, //SEQ_DATA_PORT + 0x30862700, //SEQ_DATA_PORT + 0x30862618, //SEQ_DATA_PORT + 0x30862800, //SEQ_DATA_PORT + 0x30862E2A, //SEQ_DATA_PORT + 0x30862808, //SEQ_DATA_PORT + 0x30861E17, //SEQ_DATA_PORT + 0x30860A05, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867009, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30862024, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x3086502B, //SEQ_DATA_PORT + 0x3086302C, //SEQ_DATA_PORT + 0x30862C2C, //SEQ_DATA_PORT + 0x30862C00, //SEQ_DATA_PORT + 0x30860225, //SEQ_DATA_PORT linear seq starts + 0x30865050, //SEQ_DATA_PORT + 0x30862D26, //SEQ_DATA_PORT + 0x30860828, //SEQ_DATA_PORT + 0x30860D17, //SEQ_DATA_PORT + 0x30860926, //SEQ_DATA_PORT + 0x30860028, //SEQ_DATA_PORT + 0x30860526, //SEQ_DATA_PORT + 0x3086A728, //SEQ_DATA_PORT + 0x30860725, //SEQ_DATA_PORT + 0x30868080, //SEQ_DATA_PORT + 0x30862917, //SEQ_DATA_PORT + 0x30860525, //SEQ_DATA_PORT + 0x30860040, //SEQ_DATA_PORT + 0x30862702, //SEQ_DATA_PORT + 0x30861616, //SEQ_DATA_PORT + 0x30862706, //SEQ_DATA_PORT + 0x30861736, //SEQ_DATA_PORT + 0x308626A6, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x308626A4, //SEQ_DATA_PORT + 0x3086171F, //SEQ_DATA_PORT + 0x30862805, //SEQ_DATA_PORT + 0x30862620, //SEQ_DATA_PORT + 0x30862804, //SEQ_DATA_PORT + 0x30862520, //SEQ_DATA_PORT + 0x30862027, //SEQ_DATA_PORT + 0x30860017, //SEQ_DATA_PORT + 0x30861E25, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30862117, //SEQ_DATA_PORT + 0x30861028, //SEQ_DATA_PORT + 0x3086051B, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x30862706, //SEQ_DATA_PORT + 0x30861703, //SEQ_DATA_PORT + 0x30861747, //SEQ_DATA_PORT + 0x30862660, //SEQ_DATA_PORT + 0x308617AE, //SEQ_DATA_PORT + 0x30862500, //SEQ_DATA_PORT + 0x30869027, //SEQ_DATA_PORT + 0x30860026, //SEQ_DATA_PORT + 0x30861828, //SEQ_DATA_PORT + 0x3086002E, //SEQ_DATA_PORT + 0x30862A28, //SEQ_DATA_PORT + 0x3086081E, //SEQ_DATA_PORT + 0x30860831, //SEQ_DATA_PORT + 0x30861440, //SEQ_DATA_PORT + 0x30864014, //SEQ_DATA_PORT + 0x30862020, //SEQ_DATA_PORT + 0x30861410, //SEQ_DATA_PORT + 0x30861034, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30861014, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30864013, //SEQ_DATA_PORT + 0x30861802, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867004, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867003, //SEQ_DATA_PORT + 0x30861470, //SEQ_DATA_PORT + 0x30867017, //SEQ_DATA_PORT + 0x30862002, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30862002, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30865004, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30862004, //SEQ_DATA_PORT + 0x30861400, //SEQ_DATA_PORT + 0x30865022, //SEQ_DATA_PORT + 0x30860314, //SEQ_DATA_PORT + 0x30860020, //SEQ_DATA_PORT + 0x30860314, //SEQ_DATA_PORT + 0x30860050, //SEQ_DATA_PORT + 0x30862C2C, //SEQ_DATA_PORT + 0x30862C2C, //SEQ_DATA_PORT + 0x309E018A, //set start address for linear seq +//[A-1000ERS Rev3 Hidy and linear sequencer load December 16 2010]// + + 0xFFFE00C8, +//Load = A-1000ERS Rev3 Optimized settings +//[A-1000ERS Rev3 Optimized settings] + 0x301E00C0, // set datapedestal to 192 to avoid clipping near saturation + 0x3EDA0F03, //Set vln_dac to 0x3 as recommended by Sergey + 0x3EDEC007, + 0x3ED801EF, // Vrst_low = +1 + 0x3EE2A46B, + //0x3EE0067D, // enable anti eclipse and adjust setting for high conversion gain + 0x3EE0047D, // enable anti eclipse and adjust setting for high conversion gain, decrease vertical line. + 0x3EDC0070, // adjust anti eclipse setting for low conversion gain + 0x30440404, //enable digital row noise correction and cancels TX during column correction + 0x3EE64303, // Helps with column noise at low light + 0x3EE4D208, // enable analog row noise correction + 0x3ED600BD, + //0x3EE68303, //improves low light FPN + + // ADC settings to improve noise performance + // c55300 comment: resolve defect pixel problem. + 0x30E46372, + 0x30E27253, + 0x30E05470, + 0x30E6C4CC, + 0x30E88050, +//[A-1000ERS Rev3 Optimized settings]// + +//LOAD = Enable Parallel Mode //detect HSSAB board +//[Enable Parallel Mode] + 0x301A10D8, // Disable Streaming and setup parallel + 0x31D00001, // Set to 12 bits + //Load = PLL Enabled 27Mhz to 74.25Mhz + //[PLL Enabled 27Mhz to 74.25Mhz] + 0x302C0002, // VT_SYS_CLK_DIV + 0x302A0004, // VT_PIX_CLK_DIV + 0x302E0002, // PRE_PLL_CLK_DIV + 0x3030002C, // PLL_MULTIPLIER + 0x30B00000, //???? + 0xFFFE0064, + //[PLL Enabled 27Mhz to 74.25Mhz]// +//[Enable Parallel Mode]// + +//Load = HiDy 16x Mode Full Resolution +//[HiDy 16x Mode Full Resolution] +//Load = HDR Mode Setup +//[HDR Mode Setup] + 0x301A10D8, // stop streaming + 0x30820028, // Set HiDy 16x ratio +//[HDR Mode Setup]// + +//Load = Column Retriggering at start up +//[Column Retriggering at start up] + 0x30B01300, //disable AGS, set Column gain to 1x + 0x30D4E007, //enable double sampling for column correction + 0x30BA0008, // disable auto re-trigger for change in DCG and col gain and enable col corr always + 0x301A10DC, // enable streaming + 0xFFFE00C8, + 0x301A10D8, // disable streaming + 0xFFFE00C8, +//[Column Retriggering at start up]// + + 0x301202A0, // coarse integration time + +//Load = 720p 25fps Setup +//[720p 25fps Setup] + 0x30320000, // digital binning + 0x30020002, // y_addr_start + 0x30040000, // x_addr_start + 0x300602D1, // y_addr_end + //0x300603C1, // y_addr_end + 0x300804FF, // x_addr_end + 0x300A02EE, // frame_length_lines + 0x300C0F78, // line_length_pck +//[720p 30fps Setup]// + +//LOAD = Enable AE and Load Optimized Settings For HDR 16x Mode +//Load= Enable Embedded Data and Stats +//[Enable Embedded Data and Stats] + //0x30641982, //0x30641800, +//[Enable Embedded Data and Stats]// + +//[Disable Embedded Data and Stats] + 0x30641802, + +//[Enable AE and Load Optimized Settings For HDR 16x Mode]// + 0x3100001B, //FIELD_WR=AECTRLREG, 0x001B + 0x3112029F, //FIELD_WR=AEDCGEXPOSUREHIGHREG, 0x029F + 0x3114008C, //FIELD_WR=AEDCGEXPOSURELOWREG, 0x0190 + 0x311602C0, //FIELD_WR=AEDCGGAINFACTOR, 0x02C0 + 0x3118005B, //FIELD_WR=AEDCGGAININVREG, 0x005B + 0x31020708, //FIELD_WR=AELUMATARGETREG, 0x0708 + 0x31041000, //FIELD_WR-AEHISTTARGETREG, 0x1000 + 0x31260064, //FIELD_WR=AEALPHAV1REG, 0x0064 + 0x311C02A0, //FIELD_WR=AEMAXEXPOSUREREG, 0x02A0 + 0x311E0080, //FIELD_WR=AEMINEXPOSUREREG, 0x0080 + + //[2D motion compensation ON] + 0x318A0FA0, // HDR_MC_CTRL1 + 0x31920800, // HDR_MC_CTRL5 + 0x318CC340, // HDR_MC_CTRL2 + 0x318E0320, // HDR_MC_CTRL3 + // [Disable DLO]1: REG=0x3190, 0x0BA0 + 0x31900BA0, // HDR_MC_CTRL4 + +//[Disable_AutoExposure] + 0x3100001A, //FIELD_WR=AECTRLREG, 0x001A + + 0x301A10DC, //enable streaming. + + +//[HiDy 16x Mode Full Resolution]// + 0xFFFFFFFF // END +}; + + + diff --git a/device/mpp/component/isp/sensor/aptina_9m034/m034_sensor_ctl.c b/device/mpp/component/isp/sensor/aptina_9m034/m034_sensor_ctl.c new file mode 100644 index 0000000..d68791e --- /dev/null +++ b/device/mpp/component/isp/sensor/aptina_9m034/m034_sensor_ctl.c @@ -0,0 +1,236 @@ +/****************************************************************************** + + Copyright (C), 2001-2013, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : 9m034_sensor_ctl.c + Version : Initial Draft + Author : Hisilicon BVT ISP group + Created : 2014/10/1 + Description : Aptina ar0330 sensor driver + History : + 1.Date : 2014/10/1 + Author : yy + Modification : Created file + +******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include "m034_sensor_config.h" + +#include "hi_comm_video.h" + +#ifdef HI_GPIO_I2C +#include "gpioi2c_ex.h" +#else +#include "hi_i2c.h" +#endif + +static int g_fd = -1; +static int flag_init = 0; + +const unsigned char sensor_i2c_addr = 0x20; /* I2C Address of 9m034 */ +const unsigned int sensor_addr_byte = 2; +const unsigned int sensor_data_byte = 2; + +extern WDR_MODE_E genSensorMode; +extern HI_U8 gu8SensorImageMode; +extern HI_BOOL bSensorInit; + +int sensor_i2c_init(void) +{ + if(g_fd >= 0) + { + return 0; + } +#ifdef HI_GPIO_I2C + int ret; + + g_fd = open("/dev/gpioi2c_ex", 0); + if(g_fd < 0) + { + printf("Open gpioi2c_ex error!\n"); + return -1; + } +#else + int ret; + + g_fd = open("/dev/i2c-0", O_RDWR); + if(g_fd < 0) + { + printf("Open /dev/i2c-0 error!\n"); + return -1; + } + + ret = ioctl(g_fd, I2C_SLAVE_FORCE, sensor_i2c_addr); + if (ret < 0) + { + printf("CMD_SET_DEV error!\n"); + return ret; + } +#endif + + return 0; +} + +int sensor_i2c_exit(void) +{ + if (g_fd >= 0) + { + close(g_fd); + g_fd = -1; + return 0; + } + return -1; +} + +int sensor_read_register(int addr) +{ + // TODO: + + return 0; +} + +int sensor_write_register(int addr, int data) +{ +#ifdef HI_GPIO_I2C + i2c_data.dev_addr = sensor_i2c_addr; + i2c_data.reg_addr = addr; + i2c_data.addr_byte_num = sensor_addr_byte; + i2c_data.data = data; + i2c_data.data_byte_num = sensor_data_byte; + + ret = ioctl(g_fd, GPIO_I2C_WRITE, &i2c_data); + + if (ret) + { + printf("GPIO-I2C write faild!\n"); + return ret; + } +#else + if(flag_init == 0) + { + + sensor_i2c_init(); + flag_init = 1; + } + + int idx = 0; + int ret; + char buf[8]; + + buf[idx++] = addr & 0xFF; + if (sensor_addr_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_REG, 1); + buf[idx++] = addr >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_REG, 0); + } + + if (ret < 0) + { + printf("CMD_SET_REG_WIDTH error!\n"); + return -1; + } + + buf[idx++] = data; + if (sensor_data_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 1); + buf[idx++] = data >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 0); + } + + if (ret) + { + printf("hi_i2c write faild!\n"); + return -1; + } + + ret = write(g_fd, buf, idx); + if(ret < 0) + { + printf("I2C_WRITE error!\n"); + return -1; + } +#endif + return 0; +} + +static void delay_ms(int ms) { + usleep(ms*1000); +} + +void sensor_prog(int* rom) +{ + int i = 0; + while (1) { + int lookup = rom[i++]; + int addr = (lookup >> 16) & 0xFFFF; + int data = lookup & 0xFFFF; + if (addr == 0xFFFE) { + delay_ms(data); + } else if (addr == 0xFFFF) { + return; + } else { + sensor_write_register(addr, data); + } + } +} + +void sensor_init() +{ + + //sensor_i2c_init(); + + switch(genSensorMode) + { + //720P30 linear + case WDR_MODE_NONE: + sensor_prog(sensor_rom_30_lin); + // sensor_write_register(0x3100, 0x0000); + /* Disable 1.25x analog gain */ + //sensor_write_register(0x3EE4, 0xD208); + bSensorInit = HI_TRUE; + printf("linear mode========================\n"); + break; + + + case WDR_MODE_BUILT_IN: + sensor_prog(sensor_rom_30_wdr); + /* program sensor to wdr mode */ + /* Disable DCG */ + printf("wdr mode========================\n"); + sensor_write_register(0x3100, 0x001A); + /* Disable 1.25x analog gain */ + sensor_write_register(0x3EE4, 0xD208); + bSensorInit = HI_TRUE; + break; + + default: + printf("NOT support this mode!\n"); + return; + break; + + } + +} + +void sensor_exit() +{ + sensor_i2c_exit(); + flag_init = 0; + return; +} + diff --git a/device/mpp/component/isp/sensor/aptina_ar0230/Makefile b/device/mpp/component/isp/sensor/aptina_ar0230/Makefile new file mode 100644 index 0000000..edc4038 --- /dev/null +++ b/device/mpp/component/isp/sensor/aptina_ar0230/Makefile @@ -0,0 +1,75 @@ +# +# sensor lib Makefile +# + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../../../Makefile.param + include $(PARAM_FILE) +endif + +ISP_PATH := $(SDK_PATH)/mpp/component/isp +EXT_PATH := $(SDK_PATH)/mpp/$(EXTDRV) +3A_PATH := $(ISP_PATH)/3a +LIBPATH = $(ISP_PATH)/lib +OBJPATH = ./obj + +ifeq ($(CONFIG_GPIO_I2C),y) +HI_GPIO_I2C:=HI_GPIO_I2C +else +HI_GPIO_I2C:=HI_GPIO_XXX +endif + +ARFLAGS = rcv +ARFLAGS_SO = $(LIBS_LD_CFLAGS) +ARFLAGS_SO += -shared -fPIC -o +CFLAGS = -Wall -fPIC -D$(HI_FPGA) -D$(HI_GPIO_I2C) +CFLAGS += -O2 +CFLAGS += $(LIBS_CFLAGS) + +ifeq ($(ISP_INI_CONFIG), y) +CFLAGS += -D INIFILE_CONFIG_MODE +endif + +ifeq ($(HIGDB),HI_GDB) +CFLAGS += -g +endif + +ifeq ($(CONFIG_JPEGEDCF), y) + CFLAGS += -D ENABLE_JPEGEDCF +endif +BUS_DIR := $(EXT_PATH)/ssp-sony/ + +ISP_INC := $(ISP_PATH)/include +3A_INC := $(3A_PATH)/include +INC := -I$(BUS_DIR) -I$(REL_INC) -I$(ISP_INC) -I$(3A_INC) + +ifeq ($(CONFIG_GPIO_I2C), y) + INC += -I$(EXT_PATH)/gpio-i2c-ex + INC += -I$(EXT_PATH)/gpio-i2c +else + INC += -I$(EXT_PATH)/i2c + INC += -I$(EXT_PATH)/hi_i2c +endif + +COMPILE = $(CC) $(CFLAGS) $(DFLAGS) -lm + +$(OBJPATH)/%.o: ./%.c + @[ -e $(LIBPATH) ] || mkdir $(LIBPATH) + @[ -e $(OBJPATH) ] || mkdir $(OBJPATH) + @$(COMPILE) -o $@ -c $< $(INC) + +SRCS = $(wildcard ./*.c) +OBJS = $(SRCS:%.c=%.o) +OBJS := $(OBJS:./%=obj/%) + +TARGETLIB := $(LIBPATH)/libsns_ar0230.a +TARGETLIB_SO := $(LIBPATH)/libsns_ar0230.so + +all:$(TARGETLIB) +$(TARGETLIB):$(OBJS) + @($(AR) $(ARFLAGS) $(TARGETLIB) $(OBJS)) + @($(CC) $(ARFLAGS_SO) $(TARGETLIB_SO) $(OBJS)) + +clean: + @$(RM) -rf $(TARGETLIB) $(OBJS) + @$(RM) -rf $(LIBPATH) $(OBJPATH) diff --git a/device/mpp/component/isp/sensor/aptina_ar0230/ar0230_cfg.ini b/device/mpp/component/isp/sensor/aptina_ar0230/ar0230_cfg.ini new file mode 100644 index 0000000..d83d222 --- /dev/null +++ b/device/mpp/component/isp/sensor/aptina_ar0230/ar0230_cfg.ini @@ -0,0 +1,147 @@ +[AE] +AEModeNumber = 2 +;AE [Mode 0] for linear +AeCompensation_0 = 0x38 ;linear mode +MaxIntTimeTarget_0 = 65535 +MinIntTimeTarget_0 = 2 +MaxAgainTarget_0 = 12288 +MinAgainTarget_0 = 1024 +MaxDgainTarget_0 = 2046 +MinDgainTarget_0 = 128 +ISPDgainShift_0 = 8 +MinISPDgainTarget_0 = 256 +MaxISPDgainTarget_0 = 1024 +;AE [Mode 1] for Built-in wdr +AeCompensation_1 = 0x38 ;wdr mode +MaxIntTimeTarget_1 = 65535 +MinIntTimeTarget_1 = 2 +MaxAgainTarget_1 = 2048 +MinAgainTarget_1 = 1719 +MaxDgainTarget_1 = 384 +MinDgainTarget_1 = 128 +ISPDgainShift_1 = 8 +MinISPDgainTarget_1 = 256 +MaxISPDgainTarget_1 = 2048 + + + +[AWB] +AWBModeNumber = 1 +;AWB [Mode 0] for linear +HighColorTemp_0 = 6315 ;AWB CCM Matrix +HighCCM_0 = 0x01c6|0x809b|0x802b|0x8035|0x014f|0x801a|0x8002|0x809d|0x019f| +MidColorTemp_0 = 3810 +MidCCM_0 = 0x01d6|0x80af|0x8027|0x803e|0x012e|0x0010|0x8004|0x80c8|0x01cc| +LowColorTemp_0 = 2650 +LowCCM_0 = 0x01c8|0x8076|0x8052|0x8048|0x0154|0x800c|0x8036|0x8101|0x0237| + +WbRefTemp_0 = 5000 +GainOffset_0 = 0x180|0x100|0x100|0x1ca| +WbPara_0 = 37|107|-111|200420|128|-148673| + +SatValid_0 = 1 ;linear mode saturation +Saturation_0 = 0x80|0x80|0x7e|0x72|0x68|0x60|0x58|0x50|0x48|0x40|0x38|0x38|0x38|0x38|0x38|0x38| + +[ISP] +ISPModeNumber = 2 +;ISP [Mode 0] for linear +AgcValid_0 = 1 ;ISP agc default parameter for linear mode +SharpenAltD_0 = 0x3c|0x3c|0x3a|0x36|0x32|0x30|0x2a|0x26|0x22|0x20|0x20|0x20|0x20|0x20|0x20|0x20| +SharpenAltUd_0 = 0x6a|0x6a|0x68|0x60|0x58|0x50|0x40|0x30|0x20|0x10|0x10|0x10|0x10|0x10|0x10|0x10| +SnrThresh_0 = 0x08|0x0a|0x0c|0x10|0x16|0x1b|0x22|0x28|0x2a|0x3a|0x3a|0x3a|0x3a|0x3a|0x3a|0x3a| +DemosaicLumThresh_0 = 0x50|0x50|0x4e|0x49|0x45|0x45|0x40|0x3a|0x30|0x20|0x20|0x20|0x20|0x20|0x20|0x20| +DemosaicNpOffset_0 = 0x00|0x0a|0x12|0x1a|0x20|0x28|0x30|0x32|0x34|0x38|0x38|0x38|0x38|0x38|0x38|0x38| +GeStrength_0 = 0x55|0x55|0x55|0x55|0x55|0x55|0x37|0x37|0x37|0x35|0x35|0x35|0x35|0x35|0x35|0x35| +SharpenRGB_0 = 0x86|0x86|0x84|0x7a|0x60|0x50|0x40|0x30|0x20|0x10|0x10|0x10|0x10|0x10|0x10|0x10| + +WeightValid_0 = 1 ;ISP noise/demosaic weight lut for linear mode +NoiseProfileWeight_0 = 0x0,0x0,0x0,0x0,0x0,0x3,0xC,0x11,0x15,0x17,0x1A,0x1B,0x1D,0x1E,0x1F,0x21,0x22,0x23,0x23,0x24,0x25,0x26,0x26,0x27,0x27,0x28,0x29,0x29,0x2A,0x2A,0x2A,0x2B,0x2B,0x2C,0x2C,0x2C,0x2D,0x2D,0x2E,0x2E,0x2E,0x2E,0x2F,0x2F,0x2F,0x30,0x30,0x30,0x30,0x31,0x31,0x31,0x31,0x32,0x32,0x32,0x32,0x33,0x33,0x33,0x33,0x33,0x34,0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x37,0x37,0x37,0x37,0x37,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, +DemosaicWeight_0 = 0x3,0xC,0x11,0x15,0x17,0x1A,0x1B,0x1D,0x1E,0x1F,0x21,0x22,0x23,0x23,0x24,0x25,0x26,0x26,0x27,0x27,0x28,0x29,0x29,0x2A,0x2A,0x2A,0x2B,0x2B,0x2C,0x2C,0x2C,0x2D,0x2D,0x2E,0x2E,0x2E,0x2E,0x2F,0x2F,0x2F,0x30,0x30,0x30,0x30,0x31,0x31,0x31,0x31,0x32,0x32,0x32,0x32,0x33,0x33,0x33,0x33,0x33,0x34,0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x37,0x37,0x37,0x37,0x37,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, + +demosaicValid_0 = 1 ;ISP demosaic default parameter for linear mode +VhSlope_0 = 0xac +AaSlope_0 = 0xaa +VaSlope_0 = 0xa8 +UuSlope_0 = 0xa0 +SatSlope_0 = 0x5d +AcSlope_0 = 0xa0 +FcSlope_0 = 0x8a +VhThresh_0 = 0x0 +AaThresh_0 = 0x0 +VaThresh_0 = 0x0 +UuThresh_0 = 0x08 +SatThresh_0 = 0x0 +AcThresh_0 = 0x1b3 + +gammaRGBValid_0 = 1 ;gamma for linear mode +gammaRGB0_0 = 0,180,320,426,516,590,660,730,786,844,896,946,994,1040,1090,1130,1170,1210,1248,1296,1336,1372,1416,1452,1486,1516,1546,1580,1616,1652,1678,1714,1742,1776,1798,1830,1862,1886,1912,1940,1968,1992,2010,2038,2062,2090,2114,2134,2158,2178,2202,2222,2246,2266,2282,2300,2324,2344,2360,2372,2390,2406,2422,2438,2458,2478,2494,2510,2526,2546,2562,2582,2598,2614,2630,2648,2660,2670,2682,2698,2710,2724,2736,2752,2764,2780,2792,2808,2820,2836, +gammaRGB1_0 = 2848,2864,2876,2888,2896,2908,2920,2928,2940,2948,2960,2972,2984,2992,3004,3014,3028,3036,3048,3056,3068,3080,3088,3100,3110,3120,3128,3140,3148,3160,3168,3174,3182,3190,3202,3210,3218,3228,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3530,3538,3546,3554,3558,3564,3570,3574,3582,3590,3598,3604,3610,3618,3628,3634,3640,3644,3652, +gammaRGB2_0 = 3656,3664,3670,3678,3688,3696,3700,3708,3712,3716,3722,3730,3736,3740,3748,3752,3756,3760,3766,3774,3778,3786,3790,3800,3808,3812,3816,3824,3830,3832,3842,3846,3850,3854,3858,3862,3864,3870,3874,3878,3882,3888,3894,3900,3908,3912,3918,3924,3928,3934,3940,3946,3952,3958,3966,3974,3978,3982,3986,3990,3994,4002,4006,4010,4018,4022,4032,4038,4046,4050,4056,4062,4072,4076,4084,4090,4095, + +RGBsharpenLutValid_0 = 1 ;ISP RGB sharpening default parameter for linear mode +LutCore_0 = 192 +LutStrength_0 = 127 +LutMagnitude_0 = 6 + +DrcEnable_0 = 0 ;drc default parameter for linear mode +BlackLevel_0 = 0x0 +WhiteLevel_0 = 0x4ff +SlopeMax_0 = 0x30 +SlopeMin_0 = 0x0 +VarianceSpace_0 = 0x4 +VarianceIntensity_0 = 0x1 +;ISP [Mode 1] for Built-in WDR +AgcValid_1 = 1 ;ISP agc default parameter for linear mode +SharpenAltD_1 = 0x40|0x40|0x40|0x40|0x38|0x30|0x28|0x20|0x20|0x20|0x20|0x20|0x20|0x20|0x20|0x20| +SharpenAltUd_1 = 0x60|0x60|0x60|0x60|0x50|0x40|0x30|0x20|0x10|0x10|0x10|0x10|0x10|0x10|0x10|0x10| +SnrThresh_1 = 0x8|0xC|0x10|0x14|0x18|0x20|0x28|0x30|0x30|0x30|0x30|0x30|0x30|0x30|0x30|0x30| +DemosaicLumThresh_1 = 0x50|0x50|0x40|0x40|0x30|0x30|0x20|0x20|0x20|0x20|0x20|0x20|0x20|0x20|0x20|0x20| +DemosaicNpOffset_1 = 0x0|0xa|0x12|0x1a|0x20|0x28|0x30|0x30|0x30|0x30|0x30|0x30|0x30|0x30|0x30|0x30| +GeStrength_1 = 0x55|0x55|0x55|0x55|0x55|0x55|0x37|0x37|0x37|0x37|0x37|0x37|0x37|0x37|0x37|0x37| +SharpenRGB_1 = 0x60|0x60|0x60|0x60|0x50|0x40|0x30|0x20|0x20|0x20|0x20|0x20|0x20|0x20|0x20|0x20| + +WeightValid_1 = 1 ;ISP noise/demosaic weight lut for linear mode +NoiseProfileWeight_1 = 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0xF,0x13,0x15,0x18,0x1A,0x1C,0x1D,0x1E,0x20,0x21,0x22,0x23,0x23,0x24,0x25,0x26,0x26,0x26,0x27,0x28,0x28,0x29,0x29,0x2A,0x2A,0x2B,0x2B,0x2C,0x2C,0x2C,0x2D,0x2D,0x2D,0x2E,0x2E,0x2E,0x2F,0x2F,0x2F,0x2F,0x30,0x30,0x30,0x31,0x31,0x31,0x31,0x31,0x32,0x32,0x32,0x32,0x33,0x33,0x33,0x33,0x33,0x34,0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x37,0x37,0x37,0x37,0x37,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3C,0x3C,0x3C, +DemosaicWeight_1 = 0x0,0x0,0x8,0xF,0x13,0x15,0x18,0x1A,0x1C,0x1D,0x1E,0x20,0x21,0x22,0x23,0x23,0x24,0x25,0x26,0x26,0x26,0x27,0x28,0x28,0x29,0x29,0x2A,0x2A,0x2B,0x2B,0x2C,0x2C,0x2C,0x2D,0x2D,0x2D,0x2E,0x2E,0x2E,0x2F,0x2F,0x2F,0x2F,0x30,0x30,0x30,0x31,0x31,0x31,0x31,0x31,0x32,0x32,0x32,0x32,0x33,0x33,0x33,0x33,0x33,0x34,0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x37,0x37,0x37,0x37,0x37,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3A,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, + +demosaicValid_1 = 1 ;ISP demosaic default parameter for linear mode +VhSlope_1 = 0xdc +AaSlope_1 = 0xc8 +VaSlope_1 = 0xb9 +UuSlope_1 = 0xa8 +SatSlope_1 = 0x5d +AcSlope_1 = 0xa0 +FcSlope_1 = 0x8a +VhThresh_1 = 0x0 +AaThresh_1 = 0x0 +VaThresh_1 = 0x0 +UuThresh_1 = 0x08 +SatThresh_1 = 0x0 +AcThresh_1 = 0x1b3 + +gammaRGBValid_1 = 1 ;gamma for linear mode +gammaRGB0_1 = 0,11,22,33,45,57,70,82,95,109,122,136,151,165,180,195,211,226,241,256,272,288,304,321,337,353,370,387,404,422,439,457,476,494,512,531,549,567,585,603,621,639,658,676,694,713,731,750,769,793,816,839,863,887,910,933,958,983,1008,1033,1059,1084,1109,1133,1157,1180,1204,1228,1252,1277,1301,1326,1348,1366,1387,1410,1432,1453,1475,1496,1518,1542,1565,1586,1607,1628,1648,1669,1689,1711,1730,1751,1771,1793,1815,1835,1854,1871,1889,1908,1928,1947,1965,1983,2003,2023,2040, +gammaRGB1_1 = 2060,2079,2096,2113,2132,2149,2167,2184,2203,2220,2238,2257,2275,2293,2310,2326,2344,2359,2377,2392,2408,2426,2442,2460,2477,2492,2510,2527,2545,2561,2577,2592,2608,2623,2638,2654,2669,2685,2700,2716,2732,2748,2764,2779,2796,2811,2827,2842,2855,2870,2884,2898,2913,2926,2941,2955,2969,2985,2998,3014,3027,3042,3057,3071,3086,3100,3114,3127,3142,3155,3168,3182,3196,3209,3222,3237,3250,3264,3277,3292,3305,3319,3332,3347,3360,3374,3385,3398,3411,3424,3437,3448,3462,3475, +gammaRGB2_1 = 3487,3501,3513,3526,3537,3550,3561,3573,3585,3596,3609,3621,3632,3644,3655,3666,3678,3689,3701,3712,3723,3735,3746,3757,3767,3779,3791,3802,3812,3823,3834,3845,3855,3866,3877,3888,3899,3907,3919,3929,3940,3951,3962,3973,3984,3994,4003,4014,4025,4034,4045,4056,4065,4076,4085,4095 + + + +gammafevalid_1 = 1 ;gammafe0 and gammafe1 for wdr mode +gammafe0_1 = 0,2048,34816,35840,36864,37888,38912,39936,40960,41984,43008,44032,45056,46080,47104,48128,49152,50176,51200,52224,53248,54272,55296,56320,57344,58368,59392,60416,61440,62464,63488,64512,65535 + +gammafe1.0_1 = 0,156,320,495,682,885,1108,1358,1650,1671,1691,1712,1733,1754,1776,1798,1821,1844,1867,1891,1915,1939,1965,1990,2017,2044,2071,2100,2129,2159,2190,2222,2255,2290,2326,2363,2403,2445,2489,2537,2589,2647,2712,2790,2891,3135,3379,3480,3558,3623,3681,3733,3781,3825,3867,3907,3944,3980,4015,4048,4080,4111,4141,4170,4199,4226,4253,4280,4305,4331,4355,4379,4403,4426,4449,4472,4494,4516,4537,4558,4579,4599,4620,4639,4659,4679,4698,4717,4735,4754,4772,4790, +gammafe1.1_1 = 4808,4826,4843,4861,4878,4895,4912,4928,4945,4961,4978,4994,5010,5025,5041,5057,5072,5087,5103,5118,5133,5148,5162,5177,5191,5206,5220,5234,5249,5263,5277,5290,5304,5318,5332,5345,5358,5372,5385,5398,5411,5424,5437,5450,5463,5842,6174,6472,6747,7002,7241,7467,7681,7886,8083,8272,8454,8630,8801,8967,9128,9285,9438,9588,9734,9877,10016,10154,10288,10550,10803,11043,11281,11512,11736,11955,12168,12377,12581,12781,12976,13168,13356,13541,13723,13901,14077, +gammafe1.2_1 = 14250,14420,14588,14753,14916,15076,15235,15392,15546,15699,15850,15999,16146,16292,16436,16578,16719,16859,16997,17134,17269,17404,17537,17668,17799,17928,18057,18184,18310,18435,20282,21977,23531,24974,26328,27608,28824,29984,31097,32167,33199,34196,35163,36101,37014,37901,38768,39613,40440,41249,42040,42816,43577,44325,45058,45779,46488,47186,48533,49856,51144,52398,53620,54815,55981,57123,58240,59336,60410,61466,62502,63520,64522,65507,65535,65535,65535,65535 + +RGBsharpenLutValid_1 = 1 ;ISP RGB sharpening default parameter for linear mode +LutCore_1 = 255 +LutStrength_1 = 127 +LutMagnitude_1 = 8 + +DrcEnable_1 = 1 ;drc default parameter for linear mode +BlackLevel_1 = 0x0 +WhiteLevel_1 = 0xfff +SlopeMax_1 = 0x38 +SlopeMin_1 = 0x0 +VarianceSpace_1 = 0xa +VarianceIntensity_1 = 0x4 diff --git a/device/mpp/component/isp/sensor/aptina_ar0230/ar0230_cmos.c b/device/mpp/component/isp/sensor/aptina_ar0230/ar0230_cmos.c new file mode 100644 index 0000000..51e265d --- /dev/null +++ b/device/mpp/component/isp/sensor/aptina_ar0230/ar0230_cmos.c @@ -0,0 +1,1612 @@ +#if !defined(__AR0230_CMOS_H_) +#define __AR0230_CMOS_H_ + +#include +#include +#include +#include "hi_comm_sns.h" +#include "hi_comm_video.h" +#include "hi_sns_ctrl.h" +#include "mpi_isp.h" +#include "mpi_ae.h" +#include "mpi_awb.h" +#include "mpi_af.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define AR0230_ID 230 + +/* To change the mode of config. ifndef INIFILE_CONFIG_MODE, quick config mode.*/ +/* else, cmos_cfg.ini file config mode*/ +#ifdef INIFILE_CONFIG_MODE + +extern AE_SENSOR_DEFAULT_S g_AeDft[]; +extern AWB_SENSOR_DEFAULT_S g_AwbDft[]; +extern ISP_CMOS_DEFAULT_S g_IspDft[]; +extern HI_S32 Cmos_LoadINIPara(const HI_CHAR *pcName); +#else + +#endif + +/**************************************************************************** + * local variables * + ****************************************************************************/ + +extern const unsigned int sensor_i2c_addr; +extern unsigned int sensor_addr_byte; +extern unsigned int sensor_data_byte; + +#define ANALOG_GAIN (0x3060) +#define DIGITAL_GAIN (0x305E) +#define FRAME_LINES (0x300A) +#define EXPOSURE_TIME (0x3012) +#define LINE_LEN_PCK (0x300C) + +#define SENSOR_2M_1080p30_MODE (1) +#define SENSOR_2M_1080p60_MODE (2) + +#define INCREASE_LINES (1) /* make real fps less than stand fps because NVR require*/ +#define FRAME_LINES_2M_1080p (1125+INCREASE_LINES) + + +// Max integration time for HDR mode: T1 max = min ( 70* 16, FLL*16/17), when ratio=16; +// we use a constant full lines in build-in wdr mode +#define LONG_EXP_SHT_CLIP (FRAME_LINES_2M_1080p*16/17) + +HI_U8 gu8SensorImageMode = SENSOR_2M_1080p30_MODE; +WDR_MODE_E genSensorMode = WDR_MODE_NONE; + +static HI_U32 gu32FullLinesStd = FRAME_LINES_2M_1080p; +static HI_U32 gu32FullLines = FRAME_LINES_2M_1080p; +static HI_BOOL bInit = HI_FALSE; +HI_BOOL bSensorInit = HI_FALSE; + +ISP_SNS_REGS_INFO_S g_stSnsRegsInfo = {0}; +ISP_SNS_REGS_INFO_S g_stPreSnsRegsInfo = {0}; + +#define PATHLEN_MAX 256 +#define CMOS_CFG_INI "ar0230_cfg.ini" +static char pcName[PATHLEN_MAX] = "configs/ar0230_cfg.ini"; + + +/* AE default parameter and function */ +#ifdef INIFILE_CONFIG_MODE +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 0.0078125; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.0078125; + + switch(genSensorMode) + { + case WDR_MODE_NONE: /*linear mode*/ + { + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = g_AeDft[0].u8AeCompensation; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[0].u32MaxIntTimeTarget; + pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[0].u32MinIntTimeTarget; + + pstAeSnsDft->u32MaxAgain = 12288; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = g_AeDft[0].u32MaxAgainTarget; + pstAeSnsDft->u32MinAgainTarget = g_AeDft[0].u32MinAgainTarget; + + pstAeSnsDft->u32MaxDgain = 2046; + pstAeSnsDft->u32MinDgain = 128; + pstAeSnsDft->u32MaxDgainTarget = g_AeDft[0].u32MaxDgainTarget; + pstAeSnsDft->u32MinDgainTarget = g_AeDft[0].u32MinDgainTarget; + + pstAeSnsDft->u32ISPDgainShift = g_AeDft[0].u32ISPDgainShift; + pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[0].u32MinISPDgainTarget; + pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[0].u32MaxISPDgainTarget; + break; + } + case WDR_MODE_BUILT_IN: + { + pstAeSnsDft->au8HistThresh[0] = 0xC; + pstAeSnsDft->au8HistThresh[1] = 0x18; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = g_AeDft[1].u8AeCompensation; + + pstAeSnsDft->u32MaxIntTime = LONG_EXP_SHT_CLIP; + pstAeSnsDft->u32MinIntTime = 32; + pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[1].u32MaxIntTimeTarget; + pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[1].u32MinIntTimeTarget; + + pstAeSnsDft->u32MaxAgain = 2048; + pstAeSnsDft->u32MinAgain = 1719; + pstAeSnsDft->u32MaxAgainTarget = g_AeDft[1].u32MaxAgainTarget; + pstAeSnsDft->u32MinAgainTarget = g_AeDft[1].u32MinAgainTarget; + + pstAeSnsDft->u32MaxDgain = 384; + pstAeSnsDft->u32MinDgain = 128; + pstAeSnsDft->u32MaxDgainTarget = g_AeDft[1].u32MaxDgainTarget; + pstAeSnsDft->u32MinDgainTarget = g_AeDft[1].u32MinDgainTarget; + + pstAeSnsDft->u32ISPDgainShift = g_AeDft[1].u32ISPDgainShift; + pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[1].u32MinISPDgainTarget; + pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[1].u32MaxISPDgainTarget; + + break; + } + + default: + break; + } + return 0; +} + +#else + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 0.0078125; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.0078125; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 4 << pstAeSnsDft->u32ISPDgainShift; + + switch(genSensorMode) + { + case WDR_MODE_NONE: /*linear mode*/ + { + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x38; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = 2; + + pstAeSnsDft->u32MaxAgain = 29030; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 2046; + pstAeSnsDft->u32MinDgain = 128; + pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgain; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + break; + } + case WDR_MODE_BUILT_IN: + { + pstAeSnsDft->au8HistThresh[0] = 0xC; + pstAeSnsDft->au8HistThresh[1] = 0x18; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x38; + + pstAeSnsDft->u32MaxIntTime = LONG_EXP_SHT_CLIP; + pstAeSnsDft->u32MinIntTime = 32; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = 2; + + pstAeSnsDft->u32MaxAgain = 4096; + pstAeSnsDft->u32MinAgain = 1719; + pstAeSnsDft->u32MaxAgainTarget = 8192; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 384; + pstAeSnsDft->u32MinDgain = 128; + pstAeSnsDft->u32MaxDgainTarget = 384; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + pstAeSnsDft->u32MaxISPDgainTarget = 8 << pstAeSnsDft->u32ISPDgainShift; + + break; + } + + default: + break; + } + + return 0; +} + +#endif + +/* the function of sensor set fps */ +static HI_VOID cmos_fps_set(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (WDR_MODE_BUILT_IN == genSensorMode) + { + if (30 == f32Fps) + { + gu32FullLinesStd = FRAME_LINES_2M_1080p; + } + else if (25 == f32Fps) + { + gu32FullLinesStd = FRAME_LINES_2M_1080p * 30 /f32Fps; + } + + pstAeSnsDft->u32MaxIntTime = LONG_EXP_SHT_CLIP; + } + else + { + if (SENSOR_2M_1080p30_MODE == gu8SensorImageMode) + { + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + gu32FullLinesStd = (FRAME_LINES_2M_1080p * 30) / f32Fps; + } + else + { + //printf("Not support Fps: %f\n", f32Fps); + } + } + else if (SENSOR_2M_1080p60_MODE == gu8SensorImageMode) + { + if ((f32Fps <= 60) && (f32Fps >= 0.5)) + { + gu32FullLinesStd = (FRAME_LINES_2M_1080p * 60) / f32Fps; + } + else + { + //printf("Not support Fps: %f\n", f32Fps); + } + } + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + } + + + gu32FullLinesStd = gu32FullLinesStd > 0xFFFF ? 0xFFFF : gu32FullLinesStd; + g_stSnsRegsInfo.astI2cData[3].u32Data = gu32FullLinesStd; + + pstAeSnsDft->f32Fps = f32Fps; + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd * f32Fps / 2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + + return; +} +static HI_VOID cmos_slow_framerate_set(HI_U32 u32FullLines, + AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + u32FullLines = (u32FullLines > 0xFFFF) ? 0xFFFF : u32FullLines; + gu32FullLines = u32FullLines; + sensor_write_register(FRAME_LINES, gu32FullLines); + + pstAeSnsDft->u32MaxIntTime = gu32FullLines - 2; + + return; +} + +/* while isp notify ae to update sensor regs, ae call these funcs. */ +static HI_VOID cmos_inttime_update(HI_U32 u32IntTime) +{ + g_stSnsRegsInfo.astI2cData[0].u32Data = u32IntTime; + + return; +} + +static HI_U32 again_table[51] = +{ + //here 1024 means x1.52 + 1024,1075,1132,1195,1265,1344,1434,1536,1654,1792,1814,1873,1935,2002,2074, + 2150,2233,2322,2419,2524,2639,2765,2903,3056,3226,3415,3629,3871,4147,4466, + 4838,5278,5806,6451,7258,7741,8294,8932,9677,10557,11612,12902,14515,15483,16589, + 17865,19354,21113,23224,25805,29030 +}; + +static HI_VOID cmos_again_calc_table(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb) +{ + int i; + HI_U32 u32InTimes; + + if(!pu32AgainDb || !pu32AgainLin) + { + printf("null pointer when get ae sensor gain info value!\n"); + return; + } + + u32InTimes = *pu32AgainLin; + + if (u32InTimes >= again_table[50]) + { + *pu32AgainLin = again_table[50]; + *pu32AgainDb = 50; + return ; + } + + for(i = 1; i < 51; i++) + { + if(u32InTimes < again_table[i]) + { + *pu32AgainLin = again_table[i - 1]; + *pu32AgainDb = i - 1; + break; + } + + } + + return; +} + +static HI_VOID cmos_gains_update(HI_U32 u32Again, HI_U32 u32Dgain) +{ + static HI_BOOL bHCG = HI_FALSE; + + if(u32Again < 10) + { + if(HI_TRUE == bHCG) + { + g_stSnsRegsInfo.astI2cData[4].u32Data = 0x0000; + g_stSnsRegsInfo.astI2cData[5].u32Data = 0x0B08; + g_stSnsRegsInfo.astI2cData[6].u32Data = 0x1E13; + g_stSnsRegsInfo.astI2cData[7].u32Data = 0x0080; + + if (WDR_MODE_NONE != genSensorMode) + { + g_stSnsRegsInfo.astI2cData[8].u32Data = 0x0480; + g_stSnsRegsInfo.astI2cData[9].u32Data = 0x0480; + } + else + { + g_stSnsRegsInfo.astI2cData[8].u32Data = 0x0080; + g_stSnsRegsInfo.astI2cData[9].u32Data = 0x0080; + g_stSnsRegsInfo.astI2cData[10].u32Data = 0x0080; + g_stSnsRegsInfo.astI2cData[11].u32Data = 0x0080; + } + bHCG = HI_FALSE; + } + + if(u32Again < 5) + { + g_stSnsRegsInfo.astI2cData[1].u32Data = u32Again + 0xb; + } + else + { + //0x10 + (again - 5) * 2 + g_stSnsRegsInfo.astI2cData[1].u32Data = u32Again * 2 + 0x6; + } + } + else + { + if(HI_FALSE == bHCG) + { + g_stSnsRegsInfo.astI2cData[4].u32Data = 0x0004; + g_stSnsRegsInfo.astI2cData[5].u32Data = 0x1C0E; + g_stSnsRegsInfo.astI2cData[6].u32Data = 0x4E39; + g_stSnsRegsInfo.astI2cData[7].u32Data = 0x00B0; + + if (WDR_MODE_NONE != genSensorMode) + { + g_stSnsRegsInfo.astI2cData[8].u32Data = 0x0780; + g_stSnsRegsInfo.astI2cData[9].u32Data = 0x0780; + } + else + { + g_stSnsRegsInfo.astI2cData[8].u32Data = 0xFF80; + g_stSnsRegsInfo.astI2cData[9].u32Data = 0xFF80; + g_stSnsRegsInfo.astI2cData[10].u32Data = 0xFF80; + g_stSnsRegsInfo.astI2cData[11].u32Data = 0xFF80; + } + + bHCG = HI_TRUE; + } + + if(u32Again < 26) + { + g_stSnsRegsInfo.astI2cData[1].u32Data = u32Again - 10; + } + else + { + //0x10 + (again - 26) * 2 + g_stSnsRegsInfo.astI2cData[1].u32Data = u32Again * 2 - 36; + } + } + + g_stSnsRegsInfo.astI2cData[2].u32Data = u32Dgain; + + + return; +} + +HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default; + pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set; + pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; + pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update; + pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update; + pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table; + + return 0; +} + + +/* AWB default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + HI_U8 i; + + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + pstAwbSnsDft->u16WbRefTemp = g_AwbDft[0].u16WbRefTemp; + + for(i= 0; i < 4; i++) + { + pstAwbSnsDft->au16GainOffset[i] = g_AwbDft[0].au16GainOffset[i]; + } + + for(i= 0; i < 6; i++) + { + pstAwbSnsDft->as32WbPara[i] = g_AwbDft[0].as32WbPara[i]; + } + memcpy(&pstAwbSnsDft->stCcm, &g_AwbDft[0].stCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_AwbDft[0].stAgcTbl, sizeof(AWB_AGC_TABLE_S)); + break; + + case WDR_MODE_BUILT_IN: + pstAwbSnsDft->u16WbRefTemp = g_AwbDft[1].u16WbRefTemp; + for(i= 0; i < 4; i++) + { + pstAwbSnsDft->au16GainOffset[i] = g_AwbDft[1].au16GainOffset[i]; + } + + for(i= 0; i < 6; i++) + { + pstAwbSnsDft->as32WbPara[i] = g_AwbDft[1].as32WbPara[i]; + } + + memcpy(&pstAwbSnsDft->stCcm, &g_AwbDft[1].stCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_AwbDft[1].stAgcTbl, sizeof(AWB_AGC_TABLE_S)); + break; + + } + return 0; +} + +#else + +static AWB_CCM_S g_stAwbCcm = +{ + 5050, + { + 0x01EF, 0x80B9, 0x8036, + 0x8048, 0x016A, 0x8022, + 0x000C, 0x809B, 0x018F, + }, + + 3932, + { + 0x01DD, 0x8095, 0x8048, + 0x8065, 0x017E, 0x8019, + 0x8005, 0x8095, 0x019A, + }, + + 2658, + { + 0x020F, 0x80B8, 0x8057, + 0x8058, 0x0173, 0x801B, + 0x000B, 0x8116, 0x020B, + } +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTableLin = +{ + /* bvalid */ + 1, + + /* saturation */ + {0x80,0x80,0x7e,0x72,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x38,0x38,0x38,0x38,0x38} +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTableWDR = +{ + /* bvalid */ + 1, + + /* saturation */ + {0x80,0x80,0x7e,0x72,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x38,0x38,0x38,0x38,0x38} +}; + + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + + pstAwbSnsDft->u16WbRefTemp = 5000; + + pstAwbSnsDft->au16GainOffset[0] = 0x182; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x182; + + pstAwbSnsDft->as32WbPara[0] = -0x0069; + pstAwbSnsDft->as32WbPara[1] = 0x0169; + pstAwbSnsDft->as32WbPara[2] = 0x0; + pstAwbSnsDft->as32WbPara[3] = 0x3247E; + pstAwbSnsDft->as32WbPara[4] = 0x80; + pstAwbSnsDft->as32WbPara[5] = -0x25D51; + + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcm, sizeof(AWB_CCM_S)); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTableLin, sizeof(AWB_AGC_TABLE_S)); + break; + + case WDR_MODE_BUILT_IN: + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTableWDR, sizeof(AWB_AGC_TABLE_S)); + break; + } + + return 0; +} + +#endif + + +HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default; + + return 0; +} + + +/* ISP default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstDef->stDrc, &g_IspDft[0].stDrc, sizeof(ISP_CMOS_DRC_S)); + memcpy(&pstDef->stNoiseTbl, &g_IspDft[0].stNoiseTbl, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_IspDft[0].stDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_IspDft[0].stRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGamma, &g_IspDft[0].stGamma, sizeof(ISP_CMOS_GAMMA_S)); + memcpy(&pstDef->stGe, &g_IspDft[0].stGe, sizeof(ISP_CMOS_GE_S)); + break; + case WDR_MODE_BUILT_IN: + memcpy(&pstDef->stDrc, &g_IspDft[1].stDrc, sizeof(ISP_CMOS_DRC_S)); + + memcpy(&pstDef->stNoiseTbl, &g_IspDft[1].stNoiseTbl, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_IspDft[1].stDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_IspDft[1].stRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGamma, &g_IspDft[1].stGamma, sizeof(ISP_CMOS_GAMMA_S)); + memcpy(&pstDef->stGammafe, &g_IspDft[1].stGammafe, sizeof(ISP_CMOS_GAMMAFE_S)); + memcpy(&pstDef->stGe, &g_IspDft[1].stGe, sizeof(ISP_CMOS_GE_S)); + break; + + } + + pstDef->stSensorMaxResolution.u32MaxWidth = 1920; + pstDef->stSensorMaxResolution.u32MaxHeight = 1080; + + return 0; +} + +#else + + +#define DMNR_CALIB_CARVE_NUM_AR0230 (12) +static HI_FLOAT g_coef_calib_AR0230[DMNR_CALIB_CARVE_NUM_AR0230][HI_ISP_NR_CALIB_COEF_COL] = +{ + {117.000000f, 2.068186f, 0.038048f, 8.539988f, }, + {234.000000f, 2.369216f, 0.038854f, 8.647237f, }, + {338.000000f, 2.528917f, 0.038449f, 8.986108f, }, + {507.000000f, 2.705008f, 0.039314f, 9.173982f, }, + {788.000000f, 2.896526f, 0.042165f, 9.135517f, }, + {945.000000f, 2.975432f, 0.042747f, 9.325232f, }, + {1182.000000f, 3.072618f, 0.044354f, 9.478379f, }, + {1583.000000f, 3.199481f, 0.046800f, 9.752023f, }, + {3135.000000f, 3.496238f, 0.053930f, 11.135441f, }, + {6201.000000f, 3.792462f, 0.063879f, 14.289218f, }, + {9014.000000f, 3.954918f, 0.070638f, 17.333263f, }, + {13598.000000f, 4.133475f, 0.078309f, 22.591230f, }, +}; + +static HI_FLOAT g_coef_calib_AR0230WDR[DMNR_CALIB_CARVE_NUM_AR0230][HI_ISP_NR_CALIB_COEF_COL] = +{ + {303.000000f, 2.481443f, 0.024227f, 13.260330f, }, + {389.000000f, 2.589950f, 0.026167f, 12.662060f, }, + {880.000000f, 2.944483f, 0.024233f, 14.136049f, }, + {1200.000000f, 3.079181f, 0.023359f, 14.992138f, }, + {1594.000000f, 3.202488f, 0.020216f, 18.146648f, }, + {2711.000000f, 3.433130f, 0.000000f, 27.000000f, }, + {5422.000000f, 3.734159f, 0.000000f, 26.000000f, }, + {6786.000000f, 3.831614f, 0.000000f, 26.000000f, }, + {9072.000000f, 3.957703f, 0.000000f, 25.000000f, }, + {9072.000000f, 3.957703f, 0.000000f, 25.000000f, }, + {9072.000000f, 3.957703f, 0.000000f, 25.000000f, }, + {9072.000000f, 3.957703f, 0.000000f, 25.000000f, }, +}; + +static ISP_NR_ISO_PARA_TABLE_S g_stNrIsoParaTab[HI_ISP_NR_ISO_LEVEL_MAX] = +{ + //u16Threshold//u8varStrength//u8fixStrength//u8LowFreqSlope + {1750, 256-224, 256-256, 0 }, //100 // // + {1750, 256-224, 256-256, 0 }, //200 // ISO //Thr//var//fix // ISO //u8LowFreqSlope + {1750, 256-224, 256-256, 0 }, //400 //{400, 1400, 80,256}, //{400 , 0 } + {1750, 256-224, 256-256, 8 }, //800 //{800, 1400, 72,256}, //{600 , 2 } + {1750, 256-208, 256-256, 6 }, //1600 //{1600, 1400, 64,256}, //{800 , 8 } + {1750, 256-208, 256-256, 0 }, //3200 //{3200, 1400, 48,230}, //{1000, 12 } + {1750, 256-208, 256-256, 0 }, //6400 //{6400, 1400, 48,210}, //{1600, 6 } + {1750, 256-204, 256-256, 0 }, //12800 //{12000,1400, 32,180}, //{2400, 0 } + {1625, 256-204, 256-256, 0 }, //25600 //{36000,1300, 48,160}, // + {1375, 256-204, 256-256, 0 }, //51200 //{64000,1100, 40,140}, // + {1250, 256-204, 256-256, 0 }, //102400 //{82000,1000, 30,128}, // + {1250, 256-192, 256-256, 0 }, //204800 // // + {1250, 256-192, 256-256, 0 }, //409600 // // + {1250, 256-192, 256-256, 0 }, //819200 // // + {1250, 256-192, 256-256, 0 }, //1638400// // + {1250, 256-192, 256-256, 0 }, //3276800// // +}; + +static ISP_NR_ISO_PARA_TABLE_S g_stNrIsoParaTabWDR[HI_ISP_NR_ISO_LEVEL_MAX] = +{ + //u16Threshold//u8varStrength//u8fixStrength//u8LowFreqSlope + {1500, 256-240, 256-256, 0 }, //100 // // + {1500, 256-240, 256-256, 0 }, //200 // ISO //Thr//var//fix // ISO //u8LowFreqSlope + {1500, 256-240, 256-256, 0 }, //400 //{400, 1200,240,256}, //{400 , 0 } + {1500, 256-220, 256-256, 4 }, //800 //{800, 1200,220,256}, //{600 , 2 } + {1500, 256-200, 256-256, 4 }, //1600 //{1600, 1200,200,256}, //{800 , 4 } + {1500, 256-200, 256-256, 0 }, //3200 //{3200, 1200,200,256}, //{1000, 6 } + {1500, 256-200, 256-256, 0 }, //6400 //{6400, 1200,200,256}, //{1600, 4 } + {1500, 256-200, 256-256, 0 }, //12800 //{12000,1200,200,256}, //{2400, 0 } + {1500, 256-180, 256-256, 0 }, //25600 //{36000,1200,180,256}, // + {1375, 256-180, 256-256, 0 }, //51200 //{64000,1100,180,256}, // + {1375, 256-180, 256-256, 0 }, //102400 //{82000,1100,180,256}, // + {1375, 256-180, 256-256, 0 }, //204800 // // + {1375, 256-180, 256-256, 0 }, //409600 // // + {1375, 256-180, 256-256, 0 }, //819200 // // + {1375, 256-180, 256-256, 0 }, //1638400// // + {1375, 256-180, 256-256, 0 }, //3276800// // +}; + + + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaicLin = +{ + /*For Demosaic*/ + 1, /*bEnable*/ + 12,/*u16VhLimit*/ + 8,/*u16VhOffset*/ + 48, /*u16VhSlope*/ + /*False Color*/ + 1, /*bFcrEnable*/ + {24,24,24,24,24,24,24,24,10, 0, 0, 0, 0, 0, 0, 0}, /*au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]*/ + {24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24}, /*au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]*/ + /*For Ahd*/ + 400, /*u16UuSlope*/ + {512,512,512,512,512,512,512, 400, 0,0,0,0,0,0,0,0} /*au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaicWDR = +{ + /*For Demosaic*/ + 1, /*bEnable*/ + 24,/*u16VhLimit*/ + 16,/*u16VhOffset*/ + 48, /*u16VhSlope*/ + /*False Color*/ + 1, /*bFcrEnable*/ + {12,12,12,12,12,12,12,12, 5, 0, 0, 0, 0, 0, 0, 0}, /*au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]*/ + {24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24}, /*au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]*/ + /*For Ahd*/ + 400, /*u16UuSlope*/ + {512,512,512,512,512,512,512,400,0,0,0,0,0,0,0,0} /*au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_GE_S g_stIspGeLin = +{ + /*For GE*/ + 1, /*bEnable*/ + 7, /*u8Slope*/ + 7, /*u8Sensitivity*/ + 8192, /*u16Threshold*/ + 8192, /*u16SensiThreshold*/ + {1024,1024,1024,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048} /*au16Strength[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_GE_S g_stIspGeWDR = +{ + /*For GE*/ + 1, /*bEnable*/ + 7, /*u8Slope*/ + 7, /*u8Sensitivity*/ + 8192, /*u16Threshold*/ + 8192, /*u16SensiThreshold*/ + {1024,1024,1024,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048} /*au16Strength[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_GAMMAFE_S g_stGammafe = +{ + /* bvalid */ + 1, + + /* gamma_fe0 */ + { + //10,8// + + /*0 , 43008, 46130, 49152, 51200, 52224, 52717, 53210, 53703, 54196, 54689, 55182, 55675, 56168, 56661, 57154, 57647, 58140, 58633, 59127, 59620, 60113, 60606, 61099, 61592, 62085, 62578, 63071, 63564, 64057, 64550, 65043, 65535*/ + + //14,12 + 0,43008,46130,49152,51200,52224,52717,53210,53703,54196,54689,55182,55675,56168,56661,57154,57647,58140,58633,59127,59620,60113,60606,61099,61592,62085,62578,63071,63564,64057,64550,65043,65535 + }, + + /* gamma_fe1 */ + { + //16,14 + 1, 68, 118, 163, 205, 244, 282, 318, 353, 388, 421, 454, 485, 517, 547, 577, + 607, 636, 665, 693, 721, 748, 776, 802, 829, 855, 881, 907, 932, 957, 982, 1007, + 1031, 1055, 1079, 1103, 1127, 1150, 1173, 1196, 1219, 1241, 1264, 1286, 1309, 1330, 1352, 1374, + 1395, 1417, 1438, 1459, 1480, 1500, 1521, 1542, 1562, 1582, 1603, 1622, 1642, 1662, 1682, 1702, + 1721, 1740, 1760, 1779, 1798, 1817, 1836, 1854, 1873, 1892, 1910, 1928, 1947, 1965, 1983, 2001, + 2019, 2037, 2054, 2072, 2090, 2107, 2125, 2142, 2159, 2177, 2194, 2211, 2228, 2245, 2262, 2278, + 2295, 2312, 2328, 2345, 2361, 2378, 2394, 2410, 2427, 2443, 2459, 2475, 2491, 2507, 2523, 2538, + 2554, 2570, 2585, 2601, 2616, 2632, 2647, 2663, 2678, 2693, 2708, 2723, 2739, 2754, 2769, 2784, + 2799, 2813, 2828, 2843, 2858, 2872, 2887, 2902, 2916, 2931, 2945, 2960, 2974, 2988, 3003, 3017, + 3031, 3045, 3059, 3073, 3087, 3102, 3115, 3129, 3143, 3157, 3171, 3185, 3199, 3212, 3226, 3240, + 3253, 3267, 3280, 3294, 3307, 3321, 3334, 3348, 3361, 3542, 3718, 3889, 4057, 4220, 4381, 4539, + 4694, 4847, 4999, 5149, 5297, 5448, 5599, 5749, 5899, 6048, 6196, 6344, 6492, 6639, 6787, 6934, + 7082, 7300, 7518, 7737, 7957, 8177, 8398, 8620, 8844, 9293, 9747, 10205, 10667, 11640, 12629, 13633, + 14648, 15674, 16708, 17749, 18796, 19846, 20900, 21956, 23014, 24074, 25135, 26196, 27259, 28321, 29384, 30447, + 31510, 32573, 33637, 34700, 35764, 36827, 37888, 38950, 40013, 41077, 42140, 43204, 44267, 45330, 46394, 47457, + 48521, 49584, 50648, 51711, 52775, 53838, 54902, 55965, 57028, 58092, 59155, 60219, 61282, 62346, 63409, 64475, + 65535 + } +}; + +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpen = +{ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; //ISO + {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},/* bEnLowLumaShoot */ + {40, 40, 35, 35, 35, 30, 30, 25, 21, 15, 12, 12, 12, 12, 12, 12},/*SharpenUD*/ + {30, 30, 32, 32, 35, 35, 37, 37, 40, 45, 50, 50, 50, 50, 50, 50},/*SharpenD*/ + {10, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 30, 30, 30},/*TextureNoiseThd*/ + {10, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 30, 30, 30},/*EdgeNoiseThd*/ + { 150, 140, 120, 110, 110, 60, 40, 30, 20, 10, 0, 0, 0, 0, 0, 0},/*overshoot*/ + { 160, 160, 160, 160, 200, 200, 200, 200, 200, 220, 255, 255, 255, 255, 255, 255},/*undershoot*/ +}; + +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpenWDR = +{ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; //ISO + { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},/* bEnLowLumaShoot */ + { 40, 45, 50, 55, 50, 45, 40, 40, 40, 40, 43, 50, 50, 50, 50, 50},/*SharpenUD*/ + { 35, 40, 45, 45, 50, 40, 40, 45, 45, 45, 40, 40, 40, 40, 40, 40},/*SharpenD*/ + {10, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 30, 30, 30},/*TextureNoiseThd*/ + {10, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 30, 30, 30, 30},/*EdgeNoiseThd*/ + { 50, 50, 60, 60, 60, 60, 60, 70, 70, 80, 80, 80, 80, 80, 80, 80},/*overshoot*/ + {150, 150, 150, 140, 140, 140, 140, 150, 160, 170, 200, 200, 200, 200, 200, 200},/*undershoot*/ +}; + +static ISP_CMOS_UVNR_S g_stIspUVNR = +{ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; //ISO + {1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 22, 22, 22, 22}, /*u8UvnrThreshold*/ + {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2}, /*ColorCast*/ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /*u8UvnrStrength*/ +}; + +static ISP_CMOS_DPC_S g_stCmosDpc = +{ + //0,/*IR_channel*/ + //0,/*IR_position*/ + {0,0,0,0,1,1,2,2,2,3,3,3,3,3,3,3},/*au16Strength[16]*/ + {0,0,0,0,0,0,0,0,0,0x23,0x80,0xD0,0xF0,0xF0,0xF0,0xF0},/*au16BlendRatio[16]*/ +}; + +static ISP_CMOS_DPC_S g_stCmosDpcWDR = +{ + //0,/*IR_channel*/ + //0,/*IR_position*/ + {0,0,0,0,1,1,2,2,2,3,3,3,3,3,3,3},/*au16Strength[16]*/ + {0,0,0,0,0,0,0,0,0,0x23,0x80,0xD0,0xF0,0xF0,0xF0,0xF0},/*au16BlendRatio[16]*/ +}; + +static ISP_CMOS_COMPANDER_S g_stCmosCompander = +{ + 12, + 16, + 32, + 512, + 80, + 2048, + 108, + 16384, + 124, + 32768, + 129, + 32768 +}; + + +static ISP_LSC_CABLI_TABLE_S g_stCmosLscTable[HI_ISP_LSC_LIGHT_NUM] = +{ + //-------------------------------------------- + // single light default + //-------------------------------------------- + //3000K + { + { + 12966290, 12850780, 12557130, 12237540, 11823770, 11369460, 10990480, 10685190, 10548450, 10835680, 11280550, 11860230, 12462200, 13024830, 13465580, 13903610, 14056030, + 12937220, 12807990, 12516270, 12198730, 11787540, 11347100, 10959160, 10655590, 10529200, 10825520, 11247560, 11823770, 12408600, 12980880, 13434230, 13853540, 14038930, + 12836480, 12723260, 12421960, 12109130, 11715740, 11291580, 10917690, 10596880, 10500450, 10754890, 11171350, 11715740, 12315900, 12879460, 13325640, 13754470, 13937200, + 12695270, 12584510, 12315900, 11995840, 11609660, 11214770, 10845870, 10510020, 10434000, 10675300, 11074860, 11574720, 12185850, 12737310, 13203660, 13608490, 13770880, + 12543480, 12408600, 12147370, 11823770, 11482590, 11117530, 10754890, 10424570, 10368370, 10567770, 10959160, 11437070, 12033370, 12543480, 13010150, 13387470, 13544600, + 12355460, 12224580, 11946170, 11668350, 11358270, 11000950, 10626150, 10359070, 10303570, 10452900, 10866290, 11313730, 11860230, 12342250, 12765490, 13158500, 13325640, + 12109130, 11995840, 11751530, 11459780, 11193020, 10856070, 10490910, 10285200, 10203360, 10387040, 10734880, 11160540, 11668350, 12211640, 12612020, 12951740, 13098750, + 11872430, 11751530, 11540000, 11302640, 11053640, 10705010, 10359070, 10203360, 10105080, 10285200, 10596880, 11043060, 11540000, 11995840, 12395270, 12695270, 12836480, + 11692000, 11597990, 11403160, 11193020, 10928030, 10626150, 10312780, 10122810, 10000000, 10221430, 10510020, 10980020, 11414440, 11835900, 12211640, 12489180, 12639650, + 11739570, 11644800, 11448410, 11225680, 10969580, 10645760, 10331240, 10140600, 10043520, 10266900, 10500450, 10969580, 11414440, 11811670, 12173000, 12475680, 12639650, + 11896910, 11799590, 11586350, 11335950, 11085490, 10774980, 10415160, 10212390, 10131690, 10285200, 10548450, 11117530, 11586350, 11995840, 12368700, 12681320, 12822220, + 12083770, 11970950, 11715740, 11471170, 11193020, 10897070, 10510020, 10294380, 10194350, 10340500, 10795140, 11369460, 11751530, 12198730, 12543480, 12879460, 13010150, + 12276600, 12134590, 11872430, 11586350, 11324830, 11000950, 10626150, 10349780, 10266900, 10415160, 11064240, 11516970, 11958550, 12421960, 12779620, 13083900, 13218790, + 12408600, 12263550, 12020830, 11703850, 11403160, 11064240, 10695090, 10415160, 10312780, 10490910, 11182170, 11609660, 12109130, 12570810, 12951740, 13233950, 13371960, + 12543480, 12395270, 12134590, 11811670, 11459780, 11139000, 10754890, 10471870, 10340500, 10596880, 11269530, 11692000, 12237540, 12695270, 13083900, 13371960, 13481310, + 12612020, 12489180, 12185850, 11884650, 11494020, 11193020, 10805240, 10510020, 10349780, 10655590, 11324830, 11775510, 12315900, 12779620, 13158500, 13481310, 13576470, + 12625820, 12502710, 12211640, 11909180, 11494020, 11203880, 10835680, 10510020, 10340500, 10675300, 11335950, 11811670, 12342250, 12836480, 13203660, 13528720, 13624560, + }, + { + 12937060, 12821780, 12560620, 12216980, 11804920, 11369620, 10974580, 10658440, 10502840, 10702480, 11087330, 11624780, 12228520, 12783810, 13254860, 13660340, 13820700, + 12924150, 12771200, 12524180, 12182500, 11772730, 11339760, 10956010, 10632180, 10485830, 10693640, 11049490, 11572830, 12182500, 12758620, 13200820, 13602940, 13761960, + 12834490, 12683640, 12416110, 12114130, 11698280, 11280490, 10909860, 10588720, 10435130, 10623460, 10993210, 11470330, 12080220, 12646480, 13080810, 13475550, 13645940, + 12671230, 12560620, 12298200, 11979650, 11614350, 11202420, 10845900, 10519900, 10401610, 10562810, 10900670, 11349690, 11946490, 12475910, 12937060, 13323040, 13489580, + 12512080, 12368670, 12125470, 11826480, 11470330, 11125430, 10737980, 10435130, 10351720, 10460420, 10782680, 11202420, 11783440, 12298200, 12733530, 13094030, 13241310, + 12286530, 12159620, 11935480, 11635220, 11349690, 11002550, 10614750, 10360000, 10294120, 10368290, 10693640, 11087330, 11572830, 12080220, 12487950, 12847220, 13002010, + 12046510, 11935480, 11698280, 11439930, 11192740, 10845900, 10485830, 10285940, 10212930, 10285940, 10554200, 10928270, 11399650, 11924490, 12309890, 12634150, 12771200, + 11794170, 11687730, 11470330, 11270670, 11002550, 10676010, 10351720, 10196850, 10093530, 10204890, 10418340, 10818710, 11260870, 11730070, 12080220, 12380500, 12548450, + 11624780, 11521350, 11339760, 11154180, 10891510, 10580070, 10285940, 10117190, 10000000, 10133020, 10343450, 10746890, 11154180, 11541890, 11924490, 12193970, 12309890, + 11645680, 11562500, 11389620, 11173430, 10946750, 10606060, 10326950, 10133020, 10038760, 10164840, 10360000, 10746890, 11135000, 11531610, 11869840, 12182500, 12321600, + 11826480, 11708860, 11500890, 11270670, 11021280, 10737980, 10384920, 10212930, 10117190, 10204890, 10401610, 10882350, 11300170, 11719460, 12080220, 12356870, 12463910, + 12001850, 11880730, 11666670, 11429830, 11144580, 10845900, 10494330, 10277780, 10164840, 10253370, 10623460, 11068380, 11460180, 11880730, 12240080, 12548450, 12671230, + 12182500, 12057730, 11826480, 11562500, 11270670, 10956010, 10597380, 10318730, 10229070, 10285940, 10845900, 11231570, 11645680, 12102800, 12463910, 12758620, 12872760, + 12321600, 12205470, 11979650, 11645680, 11359650, 11021280, 10676010, 10393260, 10277780, 10384920, 10956010, 11319930, 11815690, 12274880, 12646480, 12924150, 13041290, + 12475910, 12345090, 12080220, 11762030, 11429830, 11096830, 10737980, 10451980, 10302310, 10477350, 11030660, 11409690, 11913520, 12404210, 12796440, 13080810, 13200820, + 12548450, 12416110, 12136830, 11837290, 11460180, 11154180, 10773710, 10485830, 10318730, 10537020, 11087330, 11470330, 12012990, 12487950, 12885570, 13187370, 13282050, + 12572820, 12439960, 12159620, 11869840, 11460180, 11163790, 10791670, 10502840, 10318730, 10562810, 11106350, 11511110, 12057730, 12536300, 12924150, 13214290, 13295690, + }, + { + 12811880, 12673850, 12370940, 12048420, 11626240, 11174440, 10792330, 10460790, 10343720, 10632700, 11050380, 11615800, 12242190, 12824580, 13326470, 13707630, 13913980, + 12773940, 12624390, 12347330, 12014860, 11584600, 11145560, 10765390, 10443910, 10327220, 10597870, 11022150, 11584600, 12196040, 12786560, 13271790, 13664200, 13869240, + 12673850, 12538760, 12265400, 11937270, 11522710, 11097770, 10720800, 10410300, 10294350, 10537460, 10947550, 11502220, 12104770, 12698720, 13177190, 13549740, 13736730, + 12538760, 12406520, 12150240, 11828150, 11451330, 11050380, 10667770, 10352000, 10261700, 10486220, 10883100, 11390840, 12003710, 12563110, 13044350, 13395450, 13535570, + 12394640, 12277040, 12003710, 11699820, 11350880, 10975400, 10597870, 10286170, 10229250, 10410300, 10774350, 11271780, 11849820, 12394640, 12824580, 13204080, 13381590, + 12219070, 12093460, 11849820, 11553570, 11242400, 10873950, 10511780, 10237340, 10205050, 10327220, 10711920, 11164800, 11689250, 12196040, 12612090, 12991970, 13150410, + 12003710, 11893380, 11647160, 11380830, 11116840, 10765390, 10410300, 10188980, 10141070, 10278000, 10589200, 11040960, 11543260, 12082170, 12478300, 12824580, 12940000, + 11774340, 11657660, 11471630, 11261970, 10984720, 10623970, 10302550, 10149020, 10070040, 10213100, 10503250, 10966100, 11441200, 11937270, 12277040, 12599810, 12761340, + 11647160, 11553570, 11370830, 11174440, 10910620, 10589200, 10302550, 10117280, 10000000, 10188980, 10477730, 10938290, 11370830, 11774340, 12150240, 12454280, 12575320, + 11742290, 11647160, 11451330, 11222900, 10994050, 10658980, 10360290, 10164960, 10085740, 10269840, 10503250, 10938290, 11380830, 11817350, 12173090, 12478300, 12624390, + 11904320, 11806570, 11605380, 11370830, 11116840, 10792330, 10435480, 10261700, 10180960, 10318980, 10571900, 11107300, 11584600, 12014860, 12382780, 12673850, 12799210, + 12082170, 11959330, 11752950, 11512460, 11242400, 10929050, 10554650, 10335460, 10253570, 10385230, 10819400, 11331000, 11785060, 12219070, 12587550, 12862820, 12965930, + 12277040, 12173090, 11915290, 11657660, 11360840, 11031540, 10667770, 10401930, 10318980, 10435480, 11069290, 11502220, 11959330, 12430360, 12799210, 13097170, 13231080, + 12430360, 12323810, 12070900, 11763640, 11471630, 11135970, 10747510, 10477730, 10376900, 10537460, 11193770, 11605380, 12116100, 12587550, 12991970, 13299080, 13437180, + 12563110, 12466280, 12173090, 11882460, 11522710, 11193770, 10819400, 10537460, 10401930, 10650210, 11291450, 11721010, 12265400, 12748770, 13137060, 13423240, 13549740, + 12673850, 12550920, 12242190, 11948290, 11574240, 11242400, 10864820, 10580540, 10435480, 10711920, 11350880, 11763640, 12347330, 12837300, 13217570, 13535570, 13635410, + 12723700, 12575320, 12277040, 11970400, 11584600, 11252170, 10873950, 10606560, 10435480, 10738590, 11380830, 11795810, 12394640, 12888450, 13244630, 13606730, 13707630, + }, + { + 11625240, 11558940, 11407130, 11155960, 10915620, 10647990, 10428820, 10270270, 10133330, 10252950, 10393160, 10742050, 11094890, 11450090, 11737450, 11944990, 12015810, + 11603050, 11537000, 11364490, 11135530, 10896060, 10647990, 10428820, 10235690, 10133330, 10218490, 10375430, 10704230, 11054550, 11428570, 11692310, 11921570, 11992110, + 11558940, 11471700, 11280150, 11074680, 10837790, 10610820, 10410960, 10218490, 10099670, 10184250, 10340140, 10610820, 11014490, 11343280, 11625240, 11875000, 11944990, + 11450090, 11385770, 11217710, 11014490, 10761060, 10555560, 10357750, 10184250, 10082920, 10133330, 10305090, 10555560, 10935250, 11238450, 11515150, 11782950, 11851850, + 11385770, 11301120, 11135530, 10915620, 10723100, 10537260, 10287650, 10150250, 10082920, 10099670, 10235690, 10500860, 10818510, 11115170, 11407130, 11669870, 11760150, + 11259260, 11176470, 11034480, 10837790, 10685410, 10482760, 10270270, 10150250, 10066230, 10082920, 10235690, 10428820, 10723100, 11014490, 11322160, 11558940, 11625240, + 11155960, 11074680, 10915620, 10742050, 10610820, 10410960, 10218490, 10116470, 10066230, 10049590, 10167220, 10357750, 10629370, 10954950, 11259260, 11450090, 11515150, + 11014490, 10935250, 10799290, 10704230, 10519030, 10340140, 10184250, 10116470, 10033000, 10033000, 10116470, 10305090, 10537260, 10857140, 11115170, 11322160, 11364490, + 10935250, 10876560, 10742050, 10647990, 10500860, 10357750, 10218490, 10099670, 10000000, 10049590, 10099670, 10287650, 10519030, 10761060, 10974730, 11155960, 11217710, + 10994580, 10915620, 10799290, 10685410, 10573910, 10410960, 10235690, 10116470, 10066230, 10082920, 10116470, 10322580, 10537260, 10761060, 10954950, 11176470, 11238450, + 11115170, 11034480, 10896060, 10799290, 10666670, 10500860, 10287650, 10235690, 10133330, 10116470, 10133330, 10393160, 10592330, 10857140, 11115170, 11301120, 11385770, + 11238450, 11155960, 11014490, 10876560, 10742050, 10592330, 10357750, 10252950, 10167220, 10150250, 10270270, 10482760, 10666670, 10974730, 11197050, 11407130, 11471700, + 11343280, 11280150, 11115170, 10994580, 10818510, 10629370, 10446740, 10270270, 10184250, 10167220, 10393160, 10555560, 10780140, 11115170, 11343280, 11537000, 11603050, + 11471700, 11364490, 11217710, 11034480, 10876560, 10685410, 10482760, 10322580, 10218490, 10218490, 10464720, 10610820, 10915620, 11176470, 11471700, 11647510, 11692310, + 11580950, 11471700, 11280150, 11115170, 10896060, 10723100, 10519030, 10340140, 10235690, 10270270, 10500860, 10647990, 10974730, 11259260, 11558940, 11760150, 11805830, + 11625240, 11515150, 11343280, 11155960, 10915620, 10742050, 10555560, 10375430, 10252950, 10305090, 10537260, 10666670, 11034480, 11343280, 11603050, 11828790, 11875000, + 11625240, 11537000, 11364490, 11176470, 10954950, 10761060, 10555560, 10393160, 10270270, 10305090, 10555560, 10666670, 11054550, 11364490, 11647510, 11851850, 11921570, + }, + }, + + //D50 + { + { + 13333330, 13201320, 12847970, 12435230, 11940300, 11472280, 11070110, 10801080, 10666670, 10899180, 11396010, 11952190, 12526100, 13071900, 13528750, 13904980, 14117650, + 13274340, 13129100, 12806830, 12396690, 11916580, 11450380, 11049720, 10762330, 10638300, 10879420, 11363640, 11904760, 12486990, 13015180, 13468010, 13856810, 14051520, + 13157890, 13015180, 12711860, 12307690, 11846000, 11385200, 10999080, 10714290, 10582010, 10830320, 11299430, 11811020, 12383900, 12889370, 13348160, 13745700, 13921110, + 13015180, 12861740, 12565440, 12170390, 11741680, 11299430, 10899180, 10628880, 10535560, 10743060, 11204480, 11673150, 12244900, 12752390, 13186810, 13605440, 13777270, + 12793180, 12644890, 12332990, 11988010, 11583010, 11204480, 10781670, 10517090, 10443860, 10619470, 11059910, 11516310, 12060300, 12539190, 12972970, 13348160, 13528750, + 12565440, 12422360, 12108980, 11753180, 11406840, 11029410, 10628880, 10407630, 10344830, 10517090, 10919020, 11374410, 11834320, 12295080, 12711860, 13071900, 13230430, + 12269940, 12121210, 11846000, 11538460, 11214950, 10840110, 10462080, 10309280, 10221460, 10380620, 10752690, 11194030, 11639180, 12121210, 12513030, 12847970, 12987010, + 11964110, 11822660, 11560690, 11320750, 10999080, 10628880, 10309280, 10178120, 10075570, 10256410, 10582010, 11029410, 11461320, 11916580, 12269940, 12565440, 12738850, + 11764710, 11650490, 11439470, 11194030, 10869570, 10535560, 10247650, 10084030, 10000000, 10143700, 10434780, 10948900, 11352890, 11730200, 12096770, 12371130, 12500000, + 11834320, 11730200, 11483250, 11214950, 10938920, 10591350, 10282780, 10109520, 10000000, 10135140, 10425720, 10899180, 11352890, 11741680, 12096770, 12409510, 12578620, + 11988010, 11869440, 11627910, 11342150, 11049720, 10704730, 10353750, 10195410, 10058680, 10178120, 10471200, 11070110, 11527380, 11940300, 12332990, 12618300, 12765960, + 12170390, 12048190, 11753180, 11483250, 11173180, 10830320, 10452960, 10282780, 10092510, 10195410, 10704730, 11288810, 11695910, 12145750, 12500000, 12820510, 12958960, + 12332990, 12207530, 11928430, 11594200, 11278200, 10919020, 10526320, 10291600, 10126580, 10230180, 10948900, 11428570, 11869440, 12320330, 12711860, 13015180, 13143480, + 12474010, 12345680, 12060300, 11695910, 11363640, 10989010, 10619470, 10371650, 10195410, 10318140, 11059910, 11516310, 12024050, 12500000, 12875540, 13186810, 13333330, + 12644890, 12486990, 12170390, 11822660, 11428570, 11049720, 10685660, 10407630, 10221460, 10425720, 11142060, 11594200, 12133470, 12631580, 13015180, 13333330, 13468010, + 12738850, 12578620, 12244900, 11881190, 11483250, 11090570, 10723860, 10452960, 10230180, 10498690, 11183600, 11627910, 12207530, 12711860, 13100440, 13422820, 13544020, + 12765960, 12618300, 12282500, 11892960, 11505270, 11100830, 10743060, 10480350, 10221460, 10507880, 11204480, 11650490, 12244900, 12738850, 13143480, 13468010, 13590030, + }, + { + 13258660, 13111780, 12827590, 12411820, 11912170, 11441120, 11052630, 10831950, 10628570, 10796020, 11175970, 11677130, 12236840, 12752200, 13204870, 13619250, 13821660, + 13218270, 13059180, 12777230, 12376430, 11890410, 11421050, 11024550, 10787080, 10602610, 10778150, 11147260, 11635390, 12191010, 12714840, 13151520, 13548390, 13763210, + 13125000, 12968130, 12665370, 12259890, 11814880, 11351350, 10978080, 10716050, 10559610, 10724880, 11099740, 11532330, 12100370, 12604070, 13046090, 13422680, 13633510, + 12955220, 12814960, 12507210, 12111630, 11698110, 11272730, 10895400, 10628570, 10516960, 10654660, 11015230, 11421050, 11977920, 12447420, 12891090, 13245170, 13422680, + 12727270, 12591880, 12306240, 11955920, 11552800, 11166380, 10787080, 10516960, 10432690, 10533980, 10895400, 11272730, 11772150, 12248350, 12640780, 13020000, 13164810, + 12483220, 12341230, 12055560, 11740310, 11381120, 11005920, 10619900, 10432690, 10341540, 10424340, 10760330, 11128210, 11552800, 12000000, 12376430, 12727270, 12878340, + 12179610, 12044400, 11782810, 11491620, 11185570, 10804980, 10457830, 10333330, 10219780, 10308790, 10593980, 10950380, 11341460, 11804170, 12179610, 12507210, 12616280, + 11836360, 11729730, 11491620, 11262980, 10950380, 10602610, 10300630, 10203760, 10077400, 10179830, 10432690, 10796020, 11175970, 11604280, 11966910, 12225350, 12364670, + 11656220, 11552800, 11341460, 11128210, 10840970, 10508470, 10251970, 10108700, 10000000, 10061820, 10284360, 10716050, 11080850, 11441120, 11782810, 12044400, 12168220, + 11729730, 11625000, 11421050, 11156810, 10877190, 10568180, 10276240, 10124420, 10000000, 10077400, 10292490, 10707240, 11080850, 11471370, 11782810, 12077920, 12202440, + 11890410, 11782810, 11542550, 11282500, 11005920, 10680890, 10349760, 10219780, 10069610, 10100850, 10341540, 10831950, 11253240, 11645800, 12000000, 12283020, 12423660, + 12089140, 11934010, 11698110, 11421050, 11118700, 10787080, 10432690, 10276240, 10108700, 10116550, 10533980, 11015230, 11391080, 11836360, 12168220, 12459330, 12579710, + 12236840, 12122910, 11836360, 11522120, 11224140, 10868110, 10516960, 10284360, 10132300, 10163930, 10733720, 11137730, 11573330, 12000000, 12376430, 12677700, 12802360, + 12411820, 12271440, 11977920, 11645800, 11311900, 10950380, 10585370, 10366240, 10171870, 10219780, 10840970, 11224140, 11719170, 12168220, 12555450, 12865610, 13020000, + 12519230, 12388200, 12089140, 11761520, 11371180, 11015230, 10663390, 10432690, 10211760, 10325140, 10895400, 11302080, 11825610, 12306240, 12690060, 13006990, 13151520, + 12628520, 12471260, 12156860, 11825610, 11411040, 11062020, 10698440, 10466240, 10219780, 10366240, 10950380, 11361260, 11901280, 12388200, 12777230, 13098590, 13245170, + 12653060, 12507210, 12168220, 11857920, 11421050, 11080850, 10724880, 10491540, 10219780, 10391060, 10968830, 11381120, 11934010, 12435530, 12814960, 13138240, 13272170, + }, + { + 13091640, 12961120, 12633630, 12218040, 11732850, 11235950, 10851420, 10577700, 10458570, 10690790, 11120620, 11690650, 12298960, 12833170, 13306040, 13669820, 13874070, + 13039120, 12896830, 12584700, 12172280, 11701170, 11216570, 10833330, 10560520, 10441770, 10673230, 11101620, 11648750, 12252590, 12782690, 13238290, 13598330, 13785790, + 12922470, 12782690, 12487990, 12093020, 11627910, 11158800, 10788380, 10509300, 10400000, 10612240, 11054420, 11576140, 12149530, 12670570, 13118060, 13499480, 13684210, + 12770140, 12645910, 12345680, 11970530, 11535050, 11111110, 10734930, 10466990, 10366830, 10560520, 10989010, 11453740, 12025900, 12536160, 12961120, 13347020, 13513510, + 12621360, 12464050, 12160900, 11828940, 11403510, 11026290, 10620910, 10375100, 10292950, 10458570, 10878660, 11333910, 11861310, 12333970, 12757610, 13118060, 13292430, + 12392750, 12241050, 11959520, 11607140, 11265160, 10906040, 10500810, 10309280, 10244290, 10375100, 10797340, 11216570, 11669660, 12126870, 12524090, 12858560, 13013010, + 12104280, 11981570, 11711710, 11433600, 11101620, 10717230, 10375100, 10236220, 10156250, 10292950, 10638300, 11073250, 11494250, 11981570, 12357410, 12695310, 12820510, + 11818180, 11722270, 11473960, 11245680, 10933560, 10569110, 10244290, 10148320, 10054140, 10188090, 10500810, 10933560, 11363640, 11807450, 12160900, 12464050, 12621360, + 11669660, 11576140, 11393510, 11149230, 10851420, 10526320, 10236220, 10093170, 10000000, 10116730, 10408330, 10887770, 11294530, 11669660, 12025900, 12310610, 12428300, + 11807450, 11690650, 11463840, 11216570, 10942760, 10594950, 10301110, 10140410, 10054140, 10156250, 10450160, 10906040, 11333910, 11743450, 12081780, 12380950, 12500000, + 11959520, 11872150, 11638320, 11343800, 11063830, 10743800, 10391690, 10260460, 10116730, 10212100, 10509300, 11082690, 11524820, 11926610, 12310610, 12609120, 12720160, + 12172280, 12025900, 11775360, 11494250, 11187610, 10842370, 10492330, 10342080, 10164190, 10252370, 10726070, 11274940, 11680140, 12126870, 12487990, 12795280, 12909630, + 12369170, 12229540, 11937560, 11638320, 11304350, 10933560, 10594950, 10358570, 10228170, 10276680, 10961210, 11413520, 11883000, 12333970, 12720160, 13000000, 13118060, + 12500000, 12357410, 12081780, 11754070, 11393510, 11016950, 10673230, 10433390, 10276680, 10383390, 11082690, 11504420, 12037040, 12500000, 12896830, 13238290, 13360740, + 12645910, 12500000, 12206570, 11872150, 11453740, 11082690, 10743800, 10492330, 10301110, 10483870, 11158800, 11576140, 12149530, 12658230, 13026050, 13360740, 13499480, + 12757610, 12596900, 12275730, 11937560, 11494250, 11130140, 10779440, 10509300, 10309280, 10551950, 11187610, 11648750, 12218040, 12732620, 13091640, 13443640, 13598330, + 12795280, 12633630, 12310610, 11959520, 11504420, 11158800, 10797340, 10526320, 10301110, 10586320, 11197240, 11690650, 12241050, 12770140, 13144590, 13485480, 13612570, + }, + { + 11769380, 11699600, 11517510, 11276190, 10983300, 10705240, 10496450, 10367780, 10224520, 10295650, 10459360, 10744100, 11106940, 11384620, 11630650, 11911470, 11935480, + 11769380, 11676530, 11495150, 11233400, 10942700, 10685920, 10477880, 10349650, 10224520, 10277780, 10440920, 10705240, 11065420, 11341000, 11607840, 11863730, 11935480, + 11699600, 11607840, 11406550, 11169810, 10902390, 10647480, 10440920, 10313590, 10171820, 10242210, 10385970, 10647480, 11003720, 11254750, 11539960, 11769380, 11863730, + 11607840, 11495150, 11319310, 11065420, 10842490, 10609320, 10385970, 10277780, 10136990, 10206900, 10349650, 10590340, 10902390, 11169810, 11450680, 11653540, 11746030, + 11495150, 11384620, 11212120, 10983300, 10763640, 10552590, 10349650, 10206900, 10154370, 10171820, 10313590, 10515100, 10783240, 11065420, 11341000, 11562500, 11630650, + 11384620, 11276190, 11086140, 10862390, 10705240, 10477880, 10295650, 10206900, 10119660, 10136990, 10277780, 10440920, 10666670, 10942700, 11212120, 11428570, 11495150, + 11169810, 11106940, 10942700, 10783240, 10609320, 10404220, 10224520, 10171820, 10119660, 10085180, 10206900, 10367780, 10571430, 10862390, 11127820, 11319310, 11384620, + 11044780, 10962960, 10802920, 10705240, 10515100, 10313590, 10171820, 10136990, 10033900, 10050930, 10154370, 10295650, 10515100, 10763640, 10983300, 11148780, 11233400, + 10962960, 10882350, 10763640, 10628370, 10477880, 10313590, 10189330, 10102390, 10033900, 10000000, 10068030, 10277780, 10459360, 10666670, 10882350, 11044780, 11086140, + 11044780, 10942700, 10842490, 10685920, 10552590, 10385970, 10242210, 10136990, 10068030, 10050930, 10085180, 10295650, 10496450, 10666670, 10882350, 11065420, 11127820, + 11127820, 11065420, 10922510, 10783240, 10628370, 10459360, 10259970, 10224520, 10102390, 10068030, 10119660, 10367780, 10533810, 10783240, 11044780, 11233400, 11297710, + 11276190, 11190930, 11003720, 10862390, 10724640, 10515100, 10331590, 10259970, 10119660, 10068030, 10224520, 10440920, 10590340, 10862390, 11127820, 11319310, 11362760, + 11406550, 11319310, 11106940, 10962960, 10783240, 10571430, 10385970, 10277780, 10154370, 10085180, 10331590, 10477880, 10724640, 11003720, 11276190, 11450680, 11495150, + 11539960, 11428570, 11212120, 11024210, 10822670, 10609320, 10440920, 10313590, 10171820, 10119660, 10367780, 10496450, 10802920, 11127820, 11362760, 11562500, 11630650, + 11607840, 11517510, 11297710, 11106940, 10862390, 10647480, 10459360, 10349650, 10189330, 10154370, 10404220, 10552590, 10882350, 11190930, 11428570, 11653540, 11722770, + 11653540, 11539960, 11362760, 11148780, 10902390, 10666670, 10515100, 10385970, 10206900, 10189330, 10422530, 10571430, 10942700, 11233400, 11517510, 11699600, 11769380, + 11676530, 11562500, 11384620, 11169810, 10922510, 10685920, 10515100, 10385970, 10206900, 10206900, 10422530, 10571430, 10962960, 11254750, 11562500, 11722770, 11792830, + }, + }, + + //D65 + { + { + 12674420, 12546760, 12299010, 11961590, 11564990, 11165170, 10859280, 10595380, 10493380, 10647130, 10900000, 11324680, 11752020, 12230010, 12619390, 12937690, 13112780, + 12619390, 12528740, 12264420, 11928860, 11534390, 11165170, 10832300, 10582520, 10468190, 10608270, 10872820, 11266150, 11720430, 12178770, 12582970, 12880350, 13034380, + 12546760, 12421650, 12161790, 11847830, 11473680, 11122450, 10805450, 10531400, 10443110, 10569700, 10818860, 11179490, 11642190, 12060860, 12474960, 12785920, 12937690, + 12439370, 12281690, 12044200, 11736200, 11383810, 11051960, 10765430, 10480770, 10380950, 10493380, 10752160, 11065990, 11503960, 11928860, 12316380, 12674420, 12804700, + 12264420, 12144850, 11896320, 11595750, 11309990, 10996220, 10660150, 10393330, 10344010, 10418160, 10634150, 10954770, 11368970, 11752020, 12161790, 12474960, 12601160, + 12094310, 11961590, 11720430, 11443570, 11179490, 10872820, 10544140, 10319530, 10246770, 10331750, 10582520, 10845770, 11193840, 11580350, 11928860, 12264420, 12403980, + 11880110, 11752020, 11519150, 11280730, 11051960, 10752160, 10418160, 10258820, 10175030, 10258820, 10443110, 10712530, 11037970, 11473680, 11799730, 12094310, 12230010, + 11626670, 11534390, 11324680, 11122450, 10900000, 10569700, 10319530, 10186920, 10080930, 10175030, 10344010, 10621190, 10954770, 11324680, 11611190, 11880110, 12011020, + 11488800, 11383810, 11208230, 11037970, 10765430, 10493380, 10246770, 10092590, 10022990, 10069280, 10246770, 10544140, 10845770, 11150900, 11443570, 11704700, 11799730, + 11564990, 11428570, 11251610, 11024020, 10792080, 10518700, 10270910, 10080930, 10000000, 10069280, 10222740, 10518700, 10832300, 11122450, 11413610, 11689010, 11815720, + 11626670, 11534390, 11324680, 11108280, 10859280, 10595380, 10307330, 10127760, 10022990, 10092590, 10222740, 10634150, 10941030, 11280730, 11595750, 11863950, 11961590, + 11783780, 11673360, 11443570, 11208230, 10968550, 10686270, 10356300, 10175030, 10057670, 10092590, 10405730, 10792080, 11094150, 11428570, 11720430, 11994500, 12111110, + 11928860, 11799730, 11534390, 11295340, 11051960, 10738920, 10418160, 10210770, 10080930, 10139530, 10621190, 10913640, 11222650, 11595750, 11896320, 12161790, 12299010, + 12060860, 11928860, 11673360, 11383810, 11094150, 10792080, 10493380, 10246770, 10104290, 10186920, 10712530, 10968550, 11354170, 11720430, 12060860, 12316380, 12457140, + 12161790, 12044200, 11783780, 11473680, 11150900, 10832300, 10531400, 10283020, 10127760, 10283020, 10778740, 11051960, 11458610, 11831750, 12178770, 12457140, 12546760, + 12247190, 12111110, 11831750, 11549670, 11193840, 10872820, 10569700, 10319530, 10139530, 10331750, 10818860, 11108280, 11503960, 11912570, 12247190, 12528740, 12656020, + 12299010, 12161790, 11847830, 11549670, 11222650, 10900000, 10569700, 10319530, 10139530, 10331750, 10845770, 11122450, 11534390, 11961590, 12281690, 12564840, 12692870, + }, + { + 13184580, 13013010, 12695310, 12322270, 11839710, 11383540, 11045030, 10699590, 10534850, 10638300, 10887770, 11324040, 11839710, 12380950, 12845850, 13251780, 13457560, + 13144590, 12974050, 12658230, 12287330, 11828940, 11383540, 11016950, 10682000, 10509300, 10612240, 10860480, 11294530, 11818180, 12322270, 12782690, 13184580, 13388260, + 13013010, 12858560, 12572530, 12183690, 11775360, 11333910, 10951980, 10629600, 10450160, 10551950, 10806320, 11197240, 11722270, 12206570, 12645910, 13078470, 13265310, + 12871290, 12720160, 12416430, 12070570, 11648750, 11255410, 10887770, 10543390, 10416670, 10492330, 10743800, 11082690, 11576140, 12081780, 12500000, 12909630, 13065330, + 12658230, 12512030, 12252590, 11926610, 11535050, 11177990, 10788380, 10466990, 10366830, 10400000, 10620910, 10933560, 11433600, 11883000, 12287330, 12658230, 12820510, + 12428300, 12310610, 12025900, 11722270, 11403510, 11045030, 10647010, 10375100, 10301110, 10309280, 10517800, 10824310, 11226250, 11638320, 12037040, 12404580, 12560390, + 12172280, 12048190, 11796730, 11524820, 11226250, 10887770, 10517800, 10309280, 10228170, 10220130, 10400000, 10690790, 11054420, 11504420, 11850500, 12195120, 12333970, + 11883000, 11764710, 11555560, 11324040, 11035650, 10690790, 10366830, 10228170, 10077520, 10124610, 10268560, 10577700, 10906040, 11314190, 11648750, 11937560, 12081780, + 11701170, 11617520, 11423550, 11206900, 10924370, 10603590, 10317460, 10116730, 10007700, 10038610, 10180110, 10492330, 10806320, 11149230, 11473960, 11754070, 11883000, + 11754070, 11638320, 11453740, 11216570, 10942760, 10612240, 10317460, 10093170, 10000000, 10046370, 10156250, 10458570, 10779440, 11139670, 11463840, 11743450, 11893870, + 11893870, 11786040, 11555560, 11304350, 11007620, 10699590, 10350320, 10172140, 10046370, 10046370, 10156250, 10560520, 10915200, 11304350, 11648750, 11948530, 12081780, + 12048190, 11937560, 11701170, 11433600, 11120620, 10788380, 10433390, 10228170, 10054140, 10046370, 10350320, 10717230, 11045030, 11453740, 11786040, 12081780, 12206570, + 12218040, 12093020, 11807450, 11524820, 11226250, 10869570, 10509300, 10252370, 10101010, 10093170, 10543390, 10851420, 11216570, 11627910, 12003690, 12287330, 12440190, + 12392750, 12229540, 11970530, 11627910, 11304350, 10933560, 10577700, 10284810, 10132500, 10156250, 10647010, 10924370, 11353710, 11807450, 12160900, 12476010, 12609120, + 12512030, 12369170, 12070570, 11743450, 11373580, 10989010, 10647010, 10358570, 10156250, 10252370, 10734930, 11007620, 11484100, 11926610, 12310610, 12621360, 12757610, + 12596900, 12452110, 12160900, 11818180, 11403510, 11026290, 10673230, 10400000, 10172140, 10292950, 10761590, 11045030, 11555560, 12014790, 12392750, 12695310, 12820510, + 12633630, 12487990, 12206570, 11839710, 11423550, 11045030, 10690790, 10425020, 10164190, 10309280, 10779440, 11054420, 11576140, 12059370, 12440190, 12732620, 12845850, + }, + { + 12908370, 12755910, 12449570, 12078290, 11623320, 11153180, 10773070, 10485440, 10326690, 10493930, 10791010, 11230500, 11792540, 12331110, 12793680, 13184130, 13388430, + 12857140, 12718350, 12401910, 12033430, 11581770, 11143590, 10755190, 10468500, 10310260, 10476960, 10773070, 11201380, 11749770, 12284360, 12743360, 13144020, 13347070, + 12743360, 12619280, 12307690, 11944700, 11520000, 11095890, 10719600, 10418010, 10277560, 10426390, 10719600, 11134020, 11675680, 12180450, 12619280, 13051360, 13238000, + 12643900, 12497590, 12191910, 11835620, 11418500, 11048590, 10675450, 10384620, 10253160, 10368000, 10657890, 11039180, 11540520, 12044610, 12485550, 12869910, 13051360, + 12461540, 12319390, 12033430, 11696750, 11338580, 10973750, 10596890, 10293880, 10228890, 10302070, 10570960, 10927490, 11408450, 11879010, 12272730, 12656250, 12844400, + 12261120, 12123480, 11824820, 11540520, 11230500, 10872480, 10476960, 10253160, 10164710, 10212770, 10485440, 10809010, 11240240, 11675680, 12078290, 12413790, 12582520, + 12022260, 11900830, 11633750, 11368420, 11076920, 10746270, 10384620, 10204720, 10101330, 10156740, 10384620, 10701900, 11086400, 11530250, 11922720, 12249530, 12378220, + 11781820, 11665170, 11448760, 11220780, 10936710, 10596890, 10285710, 10132920, 10000000, 10077760, 10269410, 10614250, 10973750, 11388400, 11728510, 12033430, 12180450, + 11675680, 11571430, 11358460, 11134020, 10845190, 10545160, 10253160, 10077760, 10000000, 10054310, 10228890, 10562350, 10890760, 11259770, 11602510, 11900830, 12033430, + 11739130, 11633750, 11418500, 11191710, 10918280, 10588240, 10293880, 10101330, 10007720, 10093460, 10253160, 10579590, 10927490, 11289200, 11633750, 11933700, 12044610, + 11900830, 11781820, 11540520, 11299040, 11011040, 10693070, 10376300, 10180680, 10077760, 10125000, 10285710, 10701900, 11095890, 11479180, 11824820, 12123480, 12261120, + 12078290, 11944700, 11675680, 11428570, 11143590, 10818030, 10451610, 10261280, 10117100, 10172680, 10485440, 10899920, 11240240, 11654680, 12000000, 12296020, 12425700, + 12249530, 12112150, 11857270, 11540520, 11259770, 10899920, 10536580, 10293880, 10172680, 10204720, 10728480, 11039180, 11448760, 11857270, 12237960, 12545980, 12681020, + 12413790, 12272730, 12000000, 11665170, 11348510, 10973750, 10640390, 10351440, 10220820, 10293880, 10818030, 11143590, 11592130, 12033430, 12413790, 12718350, 12844400, + 12545980, 12413790, 12112150, 11771120, 11398420, 11029790, 10710740, 10418010, 10245060, 10409640, 10899920, 11220780, 11707320, 12169010, 12570320, 12895520, 13012050, + 12668620, 12509650, 12180450, 11857270, 11448760, 11086400, 10737370, 10451610, 10285710, 10460050, 10945950, 11289200, 11792540, 12249530, 12643900, 12972970, 13104150, + 12730850, 12545980, 12214890, 11868130, 11469030, 11114920, 10746270, 10476960, 10302070, 10468500, 10992370, 11308900, 11824820, 12296020, 12668620, 12999000, 13144020, + }, + { + 12126980, 11993720, 11753850, 11471470, 11137030, 10852270, 10581720, 10352300, 10200270, 10241290, 10380430, 10700280, 11104650, 11488720, 11826620, 12126980, 12243590, + 12069510, 11974920, 11735790, 11437130, 11120820, 10821530, 10567080, 10338290, 10186670, 10227580, 10366350, 10655510, 11056440, 11454270, 11790120, 12088610, 12204470, + 12012580, 11900310, 11664120, 11385990, 11072460, 10790960, 10523420, 10310390, 10159570, 10200270, 10324320, 10581720, 10992810, 11352150, 11699850, 11993720, 12107770, + 11900310, 11771960, 11558250, 11301770, 11008650, 10745430, 10480110, 10268820, 10159570, 10173100, 10282640, 10508940, 10898720, 11218800, 11575760, 11863350, 11974920, + 11771960, 11646340, 11437130, 11218800, 10929900, 10700280, 10422920, 10227580, 10146080, 10105820, 10213900, 10437160, 10760560, 11088530, 11437130, 11717790, 11826620, + 11628610, 11523380, 11318520, 11088530, 10883190, 10640670, 10380430, 10200270, 10132630, 10105820, 10213900, 10380430, 10640670, 10945560, 11285080, 11540790, 11664120, + 11454270, 11369050, 11169590, 10961260, 10790960, 10537930, 10310390, 10173100, 10105820, 10052630, 10119210, 10296500, 10537930, 10883190, 11202350, 11454270, 11540790, + 11285080, 11202350, 11024530, 10883190, 10670390, 10451440, 10255030, 10159570, 10039420, 10026250, 10079160, 10241290, 10480110, 10775740, 11040460, 11268440, 11352150, + 11202350, 11120820, 10977010, 10821530, 10625870, 10422920, 10255030, 10119210, 10039420, 10000000, 10039420, 10227580, 10451440, 10685320, 10945560, 11137030, 11235290, + 11301770, 11202350, 11040460, 10867710, 10700280, 10494510, 10310390, 10146080, 10065880, 10039420, 10065880, 10227580, 10422920, 10670390, 10945560, 11185940, 11251840, + 11402980, 11318520, 11153280, 10961260, 10790960, 10581720, 10324320, 10241290, 10119210, 10065880, 10065880, 10310390, 10508940, 10790960, 11088530, 11335310, 11402980, + 11575760, 11454270, 11235290, 11088530, 10883190, 10655510, 10408720, 10282640, 10132630, 10079160, 10200270, 10394560, 10581720, 10929900, 11218800, 11437130, 11558250, + 11699850, 11593320, 11385990, 11169590, 10977010, 10700280, 10480110, 10296500, 10173100, 10092470, 10324320, 10465750, 10715290, 11056440, 11369050, 11593320, 11699850, + 11808350, 11699850, 11506020, 11268440, 11024530, 10760560, 10523420, 10338290, 10213900, 10146080, 10394560, 10508940, 10836880, 11185940, 11488720, 11735790, 11844960, + 11937500, 11808350, 11575760, 11335310, 11072460, 10806220, 10581720, 10394560, 10213900, 10213900, 10451440, 10581720, 10929900, 11285080, 11610940, 11863350, 11974920, + 12012580, 11881800, 11646340, 11402980, 11088530, 10836880, 10611110, 10422920, 10227580, 10241290, 10465750, 10625870, 10992810, 11352150, 11681960, 11937500, 12050470, + 12031500, 11900310, 11664120, 11420030, 11104650, 10852270, 10640670, 10437160, 10227580, 10255030, 10465750, 10640670, 11024530, 11369050, 11699850, 11974920, 12088610, + }, + } +}; + + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + memcpy(&pstDef->stLsc.stLscParaTable[0], &g_stCmosLscTable[0], sizeof(ISP_LSC_CABLI_TABLE_S)*HI_ISP_LSC_LIGHT_NUM); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + + pstDef->stDrc.bEnable = HI_FALSE; + pstDef->stDrc.u8Asymmetry = 0x02; + pstDef->stDrc.u8SecondPole = 0xC0; + pstDef->stDrc.u8Stretch = 0x3C; + pstDef->stDrc.u8LocalMixingBrigtht = 0x2D; + pstDef->stDrc.u8LocalMixingDark = 0x2D; + pstDef->stDrc.u8LocalMixingThres = 0x02; + pstDef->stDrc.u16BrightGainLmt = 0x7F; + pstDef->stDrc.u16DarkGainLmtC = 0x7F; + pstDef->stDrc.u16DarkGainLmtY = 0x7F; + pstDef->stDrc.u8RangeVar = 0x00; + pstDef->stDrc.u8SpatialVar = 0x0A; + + memcpy(&pstDef->stDemosaic, &g_stIspDemosaicLin, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stGe, &g_stIspGeLin, sizeof(ISP_CMOS_GE_S)); + + pstDef->stNoiseTbl.stNrCaliPara.u8CalicoefRow = DMNR_CALIB_CARVE_NUM_AR0230; + pstDef->stNoiseTbl.stNrCaliPara.pCalibcoef = (HI_FLOAT (*)[4])g_coef_calib_AR0230; + memcpy(&pstDef->stNoiseTbl.stIsoParaTable[0], &g_stNrIsoParaTab[0],sizeof(ISP_NR_ISO_PARA_TABLE_S)*HI_ISP_NR_ISO_LEVEL_MAX); + + + memcpy(&pstDef->stRgbSharpen, &g_stIspRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stUvnr, &g_stIspUVNR, sizeof(ISP_CMOS_UVNR_S)); + memcpy(&pstDef->stDpc, &g_stCmosDpc, sizeof(ISP_CMOS_DPC_S)); + + break; + case WDR_MODE_BUILT_IN: + + pstDef->stDrc.bEnable = HI_TRUE; + pstDef->stDrc.u8Asymmetry = 0x02; + pstDef->stDrc.u8SecondPole = 0xB4; + pstDef->stDrc.u8Stretch = 0x36; + pstDef->stDrc.u8LocalMixingBrigtht = 0x2D; + pstDef->stDrc.u8LocalMixingDark = 0x2D; + pstDef->stDrc.u8LocalMixingThres = 0x02; + pstDef->stDrc.u16BrightGainLmt = 0x7F; + pstDef->stDrc.u16DarkGainLmtC = 0x7F; + pstDef->stDrc.u16DarkGainLmtY = 0x7F; + pstDef->stDrc.u8RangeVar = 0x00; + pstDef->stDrc.u8SpatialVar = 0x0A; + + memcpy(&pstDef->stDemosaic, &g_stIspDemosaicWDR, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stGe, &g_stIspGeWDR, sizeof(ISP_CMOS_GE_S)); + + pstDef->stNoiseTbl.stNrCaliPara.u8CalicoefRow = DMNR_CALIB_CARVE_NUM_AR0230; + pstDef->stNoiseTbl.stNrCaliPara.pCalibcoef = (HI_FLOAT (*)[4])g_coef_calib_AR0230WDR; + memcpy(&pstDef->stNoiseTbl.stIsoParaTable[0], &g_stNrIsoParaTabWDR[0],sizeof(ISP_NR_ISO_PARA_TABLE_S)*HI_ISP_NR_ISO_LEVEL_MAX); + + memcpy(&pstDef->stGammafe, &g_stGammafe, sizeof(ISP_CMOS_GAMMAFE_S)); + + memcpy(&pstDef->stRgbSharpen, &g_stIspRgbSharpenWDR, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stUvnr, &g_stIspUVNR, sizeof(ISP_CMOS_UVNR_S)); + memcpy(&pstDef->stDpc, &g_stCmosDpcWDR, sizeof(ISP_CMOS_DPC_S)); + memcpy(&pstDef->stCompander, &g_stCmosCompander, sizeof(ISP_CMOS_COMPANDER_S)); + + break; + } + + pstDef->stSensorMaxResolution.u32MaxWidth = 1920; + pstDef->stSensorMaxResolution.u32MaxHeight = 1080; + + return 0; +} + +#endif + +HI_U32 cmos_get_isp_black_level(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel) +{ + HI_S32 i; + + if (HI_NULL == pstBlackLevel) + { + printf("null pointer when get isp black level value!\n"); + return -1; + } + + /* Don't need to update black level when iso change */ + pstBlackLevel->bUpdate = HI_FALSE; + + switch (genSensorMode) + { + default : + case WDR_MODE_NONE : + for (i=0; i<4; i++) + { + pstBlackLevel->au16BlackLevel[i] = 0xA8; + } + break; + case WDR_MODE_BUILT_IN : + for (i=0; i<4; i++) + { + pstBlackLevel->au16BlackLevel[i] = 0xA8; + } + break; + } + + return 0; +} + +HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) +{ + + HI_U32 u32FullLines_5Fps = FRAME_LINES_2M_1080p * 30 / 5; + HI_U32 u32MaxExpTime_5Fps = u32FullLines_5Fps - 2; + + if (WDR_MODE_BUILT_IN == genSensorMode) + { + return; + } + + u32FullLines_5Fps = (u32FullLines_5Fps > 0xFFFF) ? 0xFFFF : u32FullLines_5Fps; + u32MaxExpTime_5Fps = u32FullLines_5Fps - 2; + + if (bEnable) /* setup for ISP pixel calibration mode */ + { + sensor_write_register(FRAME_LINES, u32FullLines_5Fps); /* 5fps */ + sensor_write_register(EXPOSURE_TIME, u32MaxExpTime_5Fps); /* max exposure time */ + sensor_write_register(ANALOG_GAIN, 0x0); /* AG, Context A */ + sensor_write_register(DIGITAL_GAIN, 0x0080); /* DG, Context A */ + } + else /* setup for ISP 'normal mode' */ + { + gu32FullLinesStd = (gu32FullLinesStd > 0xFFFF) ? 0xFFFF : gu32FullLinesStd; + sensor_write_register(FRAME_LINES, gu32FullLinesStd); /* 30fps */ + bInit = HI_FALSE; + } + + return; +} + +HI_VOID cmos_set_wdr_mode(HI_U8 u8Mode) +{ + bInit = HI_FALSE; + + switch(u8Mode) + { + case WDR_MODE_NONE: + genSensorMode = WDR_MODE_NONE; + break; + + case WDR_MODE_BUILT_IN: + genSensorMode = WDR_MODE_BUILT_IN; + break; + + default: + printf("NOT support this mode!\n"); + return; + break; + } + return; +} + + +static HI_S32 cmos_set_image_mode(ISP_CMOS_SENSOR_IMAGE_MODE_S *pstSensorImageMode) +{ + HI_U8 u8SensorImageMode = gu8SensorImageMode; + + bInit = HI_FALSE; + + if (HI_NULL == pstSensorImageMode ) + { + printf("null pointer when set image mode\n"); + return -1; + } + + if((pstSensorImageMode->u16Width <= 1920)&&(pstSensorImageMode->u16Height <= 1080)) + { + if (pstSensorImageMode->f32Fps <= 30) + { + u8SensorImageMode = SENSOR_2M_1080p30_MODE; + } + else + { + u8SensorImageMode = SENSOR_2M_1080p60_MODE; + } + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + } + + /* Sensor first init */ + if (HI_FALSE == bSensorInit) + { + gu8SensorImageMode = u8SensorImageMode; + + return 0; + } + + /* Switch SensorImageMode */ + if (u8SensorImageMode == gu8SensorImageMode) + { + /* Don't need to switch SensorImageMode */ + return -1; + } + + gu8SensorImageMode = u8SensorImageMode; + + return 0; + +} + +HI_U32 cmos_get_sns_regs_info(ISP_SNS_REGS_INFO_S *pstSnsRegsInfo) +{ + + HI_S32 i; + + if (HI_FALSE == bInit) + { + g_stSnsRegsInfo.enSnsType = ISP_SNS_I2C_TYPE; + g_stSnsRegsInfo.u8Cfg2ValidDelayMax = 2; + g_stSnsRegsInfo.u32RegNum = 12; + for (i=0; i < g_stSnsRegsInfo.u32RegNum; i++) + { + g_stSnsRegsInfo.astI2cData[i].bUpdate = HI_TRUE; + g_stSnsRegsInfo.astI2cData[i].u8DevAddr = sensor_i2c_addr; + g_stSnsRegsInfo.astI2cData[i].u32AddrByteNum = sensor_addr_byte; + g_stSnsRegsInfo.astI2cData[i].u32DataByteNum = sensor_data_byte; + } + g_stSnsRegsInfo.astI2cData[0].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[0].u32RegAddr = EXPOSURE_TIME; + g_stSnsRegsInfo.astI2cData[1].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[1].u32RegAddr = ANALOG_GAIN; + g_stSnsRegsInfo.astI2cData[2].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[2].u32RegAddr = DIGITAL_GAIN; + g_stSnsRegsInfo.astI2cData[3].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[3].u32RegAddr = FRAME_LINES; + + // related registers in DCG mode + g_stSnsRegsInfo.astI2cData[4].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[4].u32RegAddr = 0x3100; + g_stSnsRegsInfo.astI2cData[5].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[5].u32RegAddr = 0x3206; + g_stSnsRegsInfo.astI2cData[6].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[6].u32RegAddr = 0x3208; + g_stSnsRegsInfo.astI2cData[7].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[7].u32RegAddr = 0x3202; + if (WDR_MODE_NONE != genSensorMode) + { + g_stSnsRegsInfo.astI2cData[8].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[8].u32RegAddr = 0x3096; + g_stSnsRegsInfo.astI2cData[8].u32Data = 0x480; + g_stSnsRegsInfo.astI2cData[9].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[9].u32RegAddr = 0x3098; + g_stSnsRegsInfo.astI2cData[9].u32Data = 0x480; + g_stSnsRegsInfo.u32RegNum = 10; + } + else + { + g_stSnsRegsInfo.astI2cData[8].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[8].u32RegAddr = 0x3176; + g_stSnsRegsInfo.astI2cData[9].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[9].u32RegAddr = 0x3178; + g_stSnsRegsInfo.astI2cData[10].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[10].u32RegAddr = 0x317A; + g_stSnsRegsInfo.astI2cData[11].u8DelayFrmNum = 0; + g_stSnsRegsInfo.astI2cData[11].u32RegAddr = 0x317C; + } + + + + bInit = HI_TRUE; + } + else + { + for (i=0; i (PATHLEN_MAX - 30)) + { + printf("Set inifile path is larger PATHLEN_MAX!\n"); + return -1; + } + + strncat(pcName, pcPath, strlen(pcPath)); + strncat(pcName, CMOS_CFG_INI, sizeof(CMOS_CFG_INI)); + } + + return 0; +} + +HI_VOID sensor_global_init() +{ + gu8SensorImageMode = SENSOR_2M_1080p30_MODE; + genSensorMode = WDR_MODE_NONE; + gu32FullLinesStd = FRAME_LINES_2M_1080p; + gu32FullLines = FRAME_LINES_2M_1080p; + bInit = HI_FALSE; + bSensorInit = HI_FALSE; + + memset(&g_stSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + memset(&g_stPreSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + +#ifdef INIFILE_CONFIG_MODE + HI_S32 s32Ret = HI_SUCCESS; + s32Ret = Cmos_LoadINIPara(pcName); + if (HI_SUCCESS != s32Ret) + { + printf("Cmos_LoadINIPara failed!!!!!!\n"); + } +#else + +#endif + +} + +HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc) +{ + memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S)); + + pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init; + pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit; + pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init; + pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode; + pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode; + + pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default; + pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level; + pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect; + pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info; + + return 0; +} + +/**************************************************************************** + * callback structure * + ****************************************************************************/ + +int sensor_register_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + ISP_SENSOR_REGISTER_S stIspRegister; + AE_SENSOR_REGISTER_S stAeRegister; + AWB_SENSOR_REGISTER_S stAwbRegister; + + cmos_init_sensor_exp_function(&stIspRegister.stSnsExp); + s32Ret = HI_MPI_ISP_SensorRegCallBack(IspDev, AR0230_ID, &stIspRegister); + if (s32Ret) + { + printf("sensor register callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + cmos_init_ae_exp_function(&stAeRegister.stSnsExp); + s32Ret = HI_MPI_AE_SensorRegCallBack(IspDev, &stLib, AR0230_ID, &stAeRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + cmos_init_awb_exp_function(&stAwbRegister.stSnsExp); + s32Ret = HI_MPI_AWB_SensorRegCallBack(IspDev, &stLib, AR0230_ID, &stAwbRegister); + if (s32Ret) + { + printf("sensor register callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_unregister_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + + s32Ret = HI_MPI_ISP_SensorUnRegCallBack(IspDev, AR0230_ID); + if (s32Ret) + { + printf("sensor unregister callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + s32Ret = HI_MPI_AE_SensorUnRegCallBack(IspDev, &stLib, AR0230_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + s32Ret = HI_MPI_AWB_SensorUnRegCallBack(IspDev, &stLib, AR0230_ID); + if (s32Ret) + { + printf("sensor unregister callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/component/isp/sensor/aptina_ar0230/ar0230_sensor_ctl.c b/device/mpp/component/isp/sensor/aptina_ar0230/ar0230_sensor_ctl.c new file mode 100644 index 0000000..c78d512 --- /dev/null +++ b/device/mpp/component/isp/sensor/aptina_ar0230/ar0230_sensor_ctl.c @@ -0,0 +1,1221 @@ +/****************************************************************************** + + Copyright (C), 2001-2013, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : ar0330_sensor_ctl.c + Version : Initial Draft + Author : Hisilicon BVT ISP group + Created : 2014/10/1 + Description : Aptina ar0330 sensor driver + History : + 1.Date : 2014/10/1 + Author : yy + Modification : Created file + +******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include "hi_comm_video.h" + + +#ifdef HI_GPIO_I2C +#include "gpioi2c_ex.h" +#else +#include "hi_i2c.h" +#endif + +const unsigned char sensor_i2c_addr = 0x20; /* I2C Address of AR0230 */ +const unsigned int sensor_addr_byte = 2; /* ADDR byte of AR0230 */ +const unsigned int sensor_data_byte = 2; /* DATA byte of AR0230 */ +static int g_fd = -1; + +extern HI_U8 gu8SensorImageMode; +extern WDR_MODE_E genSensorMode; +extern HI_BOOL bSensorInit; + +int sensor_i2c_init(void) +{ + if(g_fd >= 0) + { + return 0; + } +#ifdef HI_GPIO_I2C + int ret; + + g_fd = open("/dev/gpioi2c_ex", 0); + if(g_fd < 0) + { + printf("Open gpioi2c_ex error!\n"); + return -1; + } +#else + int ret; + + g_fd = open("/dev/i2c-0", O_RDWR); + if(g_fd < 0) + { + printf("Open /dev/i2c-0 error!\n"); + return -1; + } + + ret = ioctl(g_fd, I2C_SLAVE_FORCE, sensor_i2c_addr); + if (ret < 0) + { + printf("CMD_SET_DEV error!\n"); + return ret; + } +#endif + + return 0; +} + +int sensor_i2c_exit(void) +{ + if (g_fd >= 0) + { + close(g_fd); + g_fd = -1; + return 0; + } + return -1; +} + +int sensor_read_register(int addr) +{ + // TODO: + + return 0; +} + +int sensor_write_register(int addr, int data) +{ +#ifdef HI_GPIO_I2C + i2c_data.dev_addr = sensor_i2c_addr; + i2c_data.reg_addr = addr; + i2c_data.addr_byte_num = sensor_addr_byte; + i2c_data.data = data; + i2c_data.data_byte_num = sensor_data_byte; + + ret = ioctl(g_fd, GPIO_I2C_WRITE, &i2c_data); + + if (ret) + { + printf("GPIO-I2C write faild!\n"); + return ret; + } +#else + int idx = 0; + int ret; + char buf[8]; + + buf[idx++] = addr & 0xFF; + if (sensor_addr_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_REG, 1); + buf[idx++] = addr >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_REG, 0); + } + + if (ret < 0) + { + printf("CMD_SET_REG_WIDTH error!\n"); + return -1; + } + + buf[idx++] = data; + if (sensor_data_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 1); + buf[idx++] = data >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 0); + } + + if (ret) + { + printf("hi_i2c write faild!\n"); + return -1; + } + + ret = write(g_fd, buf, idx); + if(ret < 0) + { + printf("I2C_WRITE error!\n"); + return -1; + } +#endif + + return 0; +} + +static void delay_ms(int ms) { + usleep(ms*1000); +} + +void sensor_prog(int* rom) +{ + int i = 0; + while (1) { + int lookup = rom[i++]; + int addr = (lookup >> 16) & 0xFFFF; + int data = lookup & 0xFFFF; + if (addr == 0xFFFE) { + delay_ms(data); + } else if (addr == 0xFFFF) { + return; + } else { + sensor_write_register(addr, data); + } + } +} + +void sensor_linear_1080p30_init(); +void sensor_linear_1080p60_init(); +void sensor_wdr_1080p30_init(); +void sensor_wdr_1080p60_init(); + + +void sensor_init() +{ + unsigned int cmp_value; + + sensor_i2c_init(); + cmp_value = (gu8SensorImageMode << 4) | genSensorMode; + + switch (cmp_value) + { + case 0x10: + { + sensor_linear_1080p30_init(); + break; + } + case 0x20: + { + sensor_linear_1080p60_init(); + break; + } + case 0x11: + { + sensor_wdr_1080p30_init(); + break; + } + + case 0x21: + { + sensor_wdr_1080p60_init(); + break; + } + default : + { + printf("Not support!\n"); + return ; + } + } + + bSensorInit = HI_TRUE; + + return ; +} + +void sensor_exit() +{ + sensor_i2c_exit(); + + return; +} + +void sensor_linear_1080p30_init() +{ + //[HiSPi Linear 1080p30 - 4 Lane - Sequencer v1.3b - Power Saving Mode] + // Reset + sensor_write_register(0x301A, 0x0001 );// RESET_REGISTER + delay_ms(200); + sensor_write_register(0x301A, 0x10D8 );// RESET_REGISTER + + //LOAD= Linear Mode Sequencer - Rev1.3b + sensor_write_register(0x3088, 0x8242); + sensor_write_register(0x3086, 0x4558); + sensor_write_register(0x3086, 0x729B); + sensor_write_register(0x3086, 0x4A31); + sensor_write_register(0x3086, 0x4342); + sensor_write_register(0x3086, 0x8E03); + sensor_write_register(0x3086, 0x2A14); + sensor_write_register(0x3086, 0x4578); + sensor_write_register(0x3086, 0x7B3D); + sensor_write_register(0x3086, 0xFF3D); + sensor_write_register(0x3086, 0xFF3D); + sensor_write_register(0x3086, 0xEA2A); + sensor_write_register(0x3086, 0x043D); + sensor_write_register(0x3086, 0x102A); + sensor_write_register(0x3086, 0x052A); + sensor_write_register(0x3086, 0x1535); + sensor_write_register(0x3086, 0x2A05); + sensor_write_register(0x3086, 0x3D10); + sensor_write_register(0x3086, 0x4558); + sensor_write_register(0x3086, 0x2A04); + sensor_write_register(0x3086, 0x2A14); + sensor_write_register(0x3086, 0x3DFF); + sensor_write_register(0x3086, 0x3DFF); + sensor_write_register(0x3086, 0x3DEA); + sensor_write_register(0x3086, 0x2A04); + sensor_write_register(0x3086, 0x622A); + sensor_write_register(0x3086, 0x288E); + sensor_write_register(0x3086, 0x0036); + sensor_write_register(0x3086, 0x2A08); + sensor_write_register(0x3086, 0x3D64); + sensor_write_register(0x3086, 0x7A3D); + sensor_write_register(0x3086, 0x0444); + sensor_write_register(0x3086, 0x2C4B); + sensor_write_register(0x3086, 0x8F03); + sensor_write_register(0x3086, 0x430D); + sensor_write_register(0x3086, 0x2D46); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x5F16); + sensor_write_register(0x3086, 0x530D); + sensor_write_register(0x3086, 0x1660); + sensor_write_register(0x3086, 0x3E4C); + sensor_write_register(0x3086, 0x2904); + sensor_write_register(0x3086, 0x2984); + sensor_write_register(0x3086, 0x8E03); + sensor_write_register(0x3086, 0x2AFC); + sensor_write_register(0x3086, 0x5C1D); + sensor_write_register(0x3086, 0x5754); + sensor_write_register(0x3086, 0x495F); + sensor_write_register(0x3086, 0x5305); + sensor_write_register(0x3086, 0x5307); + sensor_write_register(0x3086, 0x4D2B); + sensor_write_register(0x3086, 0xF810); + sensor_write_register(0x3086, 0x164C); + sensor_write_register(0x3086, 0x0955); + sensor_write_register(0x3086, 0x562B); + sensor_write_register(0x3086, 0xB82B); + sensor_write_register(0x3086, 0x984E); + sensor_write_register(0x3086, 0x1129); + sensor_write_register(0x3086, 0x9460); + sensor_write_register(0x3086, 0x5C19); + sensor_write_register(0x3086, 0x5C1B); + sensor_write_register(0x3086, 0x4548); + sensor_write_register(0x3086, 0x4508); + sensor_write_register(0x3086, 0x4588); + sensor_write_register(0x3086, 0x29B6); + sensor_write_register(0x3086, 0x8E01); + sensor_write_register(0x3086, 0x2AF8); + sensor_write_register(0x3086, 0x3E02); + sensor_write_register(0x3086, 0x2AFA); + sensor_write_register(0x3086, 0x3F09); + sensor_write_register(0x3086, 0x5C1B); + sensor_write_register(0x3086, 0x29B2); + sensor_write_register(0x3086, 0x3F0C); + sensor_write_register(0x3086, 0x3E03); + sensor_write_register(0x3086, 0x3E15); + sensor_write_register(0x3086, 0x5C13); + sensor_write_register(0x3086, 0x3F11); + sensor_write_register(0x3086, 0x3E0F); + sensor_write_register(0x3086, 0x5F2B); + sensor_write_register(0x3086, 0x902A); + sensor_write_register(0x3086, 0xF22B); + sensor_write_register(0x3086, 0x803E); + sensor_write_register(0x3086, 0x063F); + sensor_write_register(0x3086, 0x0660); + sensor_write_register(0x3086, 0x29A2); + sensor_write_register(0x3086, 0x29A3); + sensor_write_register(0x3086, 0x5F4D); + sensor_write_register(0x3086, 0x1C2A); + sensor_write_register(0x3086, 0xFA29); + sensor_write_register(0x3086, 0x8345); + sensor_write_register(0x3086, 0xA83E); + sensor_write_register(0x3086, 0x072A); + sensor_write_register(0x3086, 0xFB3E); + sensor_write_register(0x3086, 0x2945); + sensor_write_register(0x3086, 0x8824); + sensor_write_register(0x3086, 0x3E08); + sensor_write_register(0x3086, 0x2AFA); + sensor_write_register(0x3086, 0x5D29); + sensor_write_register(0x3086, 0x9288); + sensor_write_register(0x3086, 0x102B); + sensor_write_register(0x3086, 0x048B); + sensor_write_register(0x3086, 0x1686); + sensor_write_register(0x3086, 0x8D48); + sensor_write_register(0x3086, 0x4D4E); + sensor_write_register(0x3086, 0x2B80); + sensor_write_register(0x3086, 0x4C0B); + sensor_write_register(0x3086, 0x603F); + sensor_write_register(0x3086, 0x302A); + sensor_write_register(0x3086, 0xF23F); + sensor_write_register(0x3086, 0x1029); + sensor_write_register(0x3086, 0x8229); + sensor_write_register(0x3086, 0x8329); + sensor_write_register(0x3086, 0x435C); + sensor_write_register(0x3086, 0x155F); + sensor_write_register(0x3086, 0x4D1C); + sensor_write_register(0x3086, 0x2AFA); + sensor_write_register(0x3086, 0x4558); + sensor_write_register(0x3086, 0x8E00); + sensor_write_register(0x3086, 0x2A98); + sensor_write_register(0x3086, 0x3F0A); + sensor_write_register(0x3086, 0x4A0A); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x0B43); + sensor_write_register(0x3086, 0x168E); + sensor_write_register(0x3086, 0x032A); + sensor_write_register(0x3086, 0x9C45); + sensor_write_register(0x3086, 0x783F); + sensor_write_register(0x3086, 0x072A); + sensor_write_register(0x3086, 0x9D3E); + sensor_write_register(0x3086, 0x305D); + sensor_write_register(0x3086, 0x2944); + sensor_write_register(0x3086, 0x8810); + sensor_write_register(0x3086, 0x2B04); + sensor_write_register(0x3086, 0x530D); + sensor_write_register(0x3086, 0x4558); + sensor_write_register(0x3086, 0x3E08); + sensor_write_register(0x3086, 0x8E01); + sensor_write_register(0x3086, 0x2A98); + sensor_write_register(0x3086, 0x8E00); + sensor_write_register(0x3086, 0x769C); + sensor_write_register(0x3086, 0x779C); + sensor_write_register(0x3086, 0x4644); + sensor_write_register(0x3086, 0x1616); + sensor_write_register(0x3086, 0x907A); + sensor_write_register(0x3086, 0x1244); + sensor_write_register(0x3086, 0x4B18); + sensor_write_register(0x3086, 0x4A04); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x0643); + sensor_write_register(0x3086, 0x1605); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x0743); + sensor_write_register(0x3086, 0x1658); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x5A43); + sensor_write_register(0x3086, 0x1645); + sensor_write_register(0x3086, 0x588E); + sensor_write_register(0x3086, 0x032A); + sensor_write_register(0x3086, 0x9C45); + sensor_write_register(0x3086, 0x787B); + sensor_write_register(0x3086, 0x3F07); + sensor_write_register(0x3086, 0x2A9D); + sensor_write_register(0x3086, 0x530D); + sensor_write_register(0x3086, 0x8B16); + sensor_write_register(0x3086, 0x863E); + sensor_write_register(0x3086, 0x2345); + sensor_write_register(0x3086, 0x5825); + sensor_write_register(0x3086, 0x3E10); + sensor_write_register(0x3086, 0x8E01); + sensor_write_register(0x3086, 0x2A98); + sensor_write_register(0x3086, 0x8E00); + sensor_write_register(0x3086, 0x3E10); + sensor_write_register(0x3086, 0x8D60); + sensor_write_register(0x3086, 0x1244); + sensor_write_register(0x3086, 0x4B2C); + sensor_write_register(0x3086, 0x2C2C); + + //LOAD= AR0230 REV1.2 Optimized Settings + sensor_write_register(0x320C, 0x0180); + sensor_write_register(0x320E, 0x0300); + sensor_write_register(0x3210, 0x0500); + sensor_write_register(0x3204, 0x0B6D); + sensor_write_register(0x30FE, 0x0080); + sensor_write_register(0x3ED8, 0x7B99); + sensor_write_register(0x3EDC, 0x9BA8); + sensor_write_register(0x3EDA, 0x9B9B); + sensor_write_register(0x3092, 0x006F); + sensor_write_register(0x3EEC, 0x1C04); + sensor_write_register(0x30BA, 0x779C); + sensor_write_register(0x3EF6, 0xA70F); + sensor_write_register(0x3044, 0x0410); + sensor_write_register(0x3ED0, 0xFF44); + sensor_write_register(0x3ED4, 0x031F); + sensor_write_register(0x30FE, 0x0080); + sensor_write_register(0x3EE2, 0x8866); + sensor_write_register(0x3EE4, 0x6623); + sensor_write_register(0x3EE6, 0x2263); + sensor_write_register(0x30E0, 0x4283); + + sensor_write_register(0x301A, 0x0058); + sensor_write_register(0x30B0, 0x1118); + sensor_write_register(0x31AC, 0x0C0C); + + //PLL_settings - 4 Lane 12-bit HiSPi Power Saving Mode + //MCLK=27Mhz + sensor_write_register(0x302A, 0x000C); + sensor_write_register(0x302C, 0x0001); + sensor_write_register(0x302E, 0x0004); + sensor_write_register(0x3030, 0x0042); + sensor_write_register(0x3036, 0x000C); + sensor_write_register(0x3038, 0x0002); + + //Sensor output setup + sensor_write_register(0x3002, 0x0000 ); + sensor_write_register(0x3004, 0x0000 ); + sensor_write_register(0x3006, 0x0437); + sensor_write_register(0x3008, 0x0787 ); + sensor_write_register(0x300A, 1351 ); + sensor_write_register(0x300C, 1118 ); + sensor_write_register(0x3012, 1349 ); + sensor_write_register(0x30A2, 0x0001 ); + sensor_write_register(0x30A6, 0x0001); + sensor_write_register(0x3040, 0x0000 ); + + // Linear Mode Setup + sensor_write_register(0x3082, 0x0009 ); + sensor_write_register(0x30BA, 0x769C ); + sensor_write_register(0x31E0, 0x0200 ); + sensor_write_register(0x318C, 0x0000 ); + + //Load= Linear Mode Low Conversion Gain + sensor_write_register(0x3060, 0x000B );// ANALOG_GAIN 1.5x Minimum analog gain for LCG + sensor_write_register(0x3096, 0x0080 ); + sensor_write_register(0x3098, 0x0080 ); + sensor_write_register(0x3206, 0x0B08 ); + sensor_write_register(0x3208, 0x1E13 ); + sensor_write_register(0x3202, 0x0080 ); + sensor_write_register(0x3200, 0x0002 ); + sensor_write_register(0x3100, 0x0000 ); + //Load= Linear Mode High Conversion Gain + + sensor_write_register(0x3200, 0x0000 ); + sensor_write_register(0x31D0, 0x0000 ); + // ALTM Bypassed + sensor_write_register(0x2400, 0x0003 ); + sensor_write_register(0x301E, 0x00A8 ); + sensor_write_register(0x2450, 0x0000 ); + sensor_write_register(0x320A, 0x0080 ); + + sensor_write_register(0x3178, 0xFE80 );// DELTA_DK_ADJUST_RED offset of -2 + sensor_write_register(0x3176, 0xFE80 );// DELTA_DK_ADJUST_GREENR offset of -2 + sensor_write_register(0x317A, 0xFF80 );// DELTA_DK_ADJUST_BLUE offset of -1 + sensor_write_register(0x317C, 0xFF80 );// DELTA_DK_ADJUST_GREENB offset of -1 + + sensor_write_register(0x3064, 0x1802 );//Disable Embedded Data and Stats + sensor_write_register(0x31AE, 0x0304 ); + sensor_write_register(0x31C6, 0x0400 );//HISPI_CONTROL_STATUS: HispiSP + sensor_write_register(0x306E, 0x9210 );//DATAPATH_SELECT[9]=1 VDD_SLVS=1.8V + + sensor_write_register(0x301A, 0x005C );//RESET_REGISTER + delay_ms(33); + + printf("Aptina AR0230 sensor linear 2M-1080p 30fps init success!\n"); +} + + + +void sensor_linear_1080p60_init() +{ + + //[HiSPi Linear 1080p30 - 4 Lane - Sequencer v1.3b - Power Saving Mode] + // Reset + sensor_write_register(0x301A, 0x0001 );// RESET_REGISTER + delay_ms(200); + sensor_write_register(0x301A, 0x10D8 );// RESET_REGISTER + + //LOAD= Linear Mode Sequencer - Rev1.3b + sensor_write_register(0x3088, 0x8242); + sensor_write_register(0x3086, 0x4558); + sensor_write_register(0x3086, 0x729B); + sensor_write_register(0x3086, 0x4A31); + sensor_write_register(0x3086, 0x4342); + sensor_write_register(0x3086, 0x8E03); + sensor_write_register(0x3086, 0x2A14); + sensor_write_register(0x3086, 0x4578); + sensor_write_register(0x3086, 0x7B3D); + sensor_write_register(0x3086, 0xFF3D); + sensor_write_register(0x3086, 0xFF3D); + sensor_write_register(0x3086, 0xEA2A); + sensor_write_register(0x3086, 0x043D); + sensor_write_register(0x3086, 0x102A); + sensor_write_register(0x3086, 0x052A); + sensor_write_register(0x3086, 0x1535); + sensor_write_register(0x3086, 0x2A05); + sensor_write_register(0x3086, 0x3D10); + sensor_write_register(0x3086, 0x4558); + sensor_write_register(0x3086, 0x2A04); + sensor_write_register(0x3086, 0x2A14); + sensor_write_register(0x3086, 0x3DFF); + sensor_write_register(0x3086, 0x3DFF); + sensor_write_register(0x3086, 0x3DEA); + sensor_write_register(0x3086, 0x2A04); + sensor_write_register(0x3086, 0x622A); + sensor_write_register(0x3086, 0x288E); + sensor_write_register(0x3086, 0x0036); + sensor_write_register(0x3086, 0x2A08); + sensor_write_register(0x3086, 0x3D64); + sensor_write_register(0x3086, 0x7A3D); + sensor_write_register(0x3086, 0x0444); + sensor_write_register(0x3086, 0x2C4B); + sensor_write_register(0x3086, 0x8F03); + sensor_write_register(0x3086, 0x430D); + sensor_write_register(0x3086, 0x2D46); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x5F16); + sensor_write_register(0x3086, 0x530D); + sensor_write_register(0x3086, 0x1660); + sensor_write_register(0x3086, 0x3E4C); + sensor_write_register(0x3086, 0x2904); + sensor_write_register(0x3086, 0x2984); + sensor_write_register(0x3086, 0x8E03); + sensor_write_register(0x3086, 0x2AFC); + sensor_write_register(0x3086, 0x5C1D); + sensor_write_register(0x3086, 0x5754); + sensor_write_register(0x3086, 0x495F); + sensor_write_register(0x3086, 0x5305); + sensor_write_register(0x3086, 0x5307); + sensor_write_register(0x3086, 0x4D2B); + sensor_write_register(0x3086, 0xF810); + sensor_write_register(0x3086, 0x164C); + sensor_write_register(0x3086, 0x0955); + sensor_write_register(0x3086, 0x562B); + sensor_write_register(0x3086, 0xB82B); + sensor_write_register(0x3086, 0x984E); + sensor_write_register(0x3086, 0x1129); + sensor_write_register(0x3086, 0x9460); + sensor_write_register(0x3086, 0x5C19); + sensor_write_register(0x3086, 0x5C1B); + sensor_write_register(0x3086, 0x4548); + sensor_write_register(0x3086, 0x4508); + sensor_write_register(0x3086, 0x4588); + sensor_write_register(0x3086, 0x29B6); + sensor_write_register(0x3086, 0x8E01); + sensor_write_register(0x3086, 0x2AF8); + sensor_write_register(0x3086, 0x3E02); + sensor_write_register(0x3086, 0x2AFA); + sensor_write_register(0x3086, 0x3F09); + sensor_write_register(0x3086, 0x5C1B); + sensor_write_register(0x3086, 0x29B2); + sensor_write_register(0x3086, 0x3F0C); + sensor_write_register(0x3086, 0x3E03); + sensor_write_register(0x3086, 0x3E15); + sensor_write_register(0x3086, 0x5C13); + sensor_write_register(0x3086, 0x3F11); + sensor_write_register(0x3086, 0x3E0F); + sensor_write_register(0x3086, 0x5F2B); + sensor_write_register(0x3086, 0x902A); + sensor_write_register(0x3086, 0xF22B); + sensor_write_register(0x3086, 0x803E); + sensor_write_register(0x3086, 0x063F); + sensor_write_register(0x3086, 0x0660); + sensor_write_register(0x3086, 0x29A2); + sensor_write_register(0x3086, 0x29A3); + sensor_write_register(0x3086, 0x5F4D); + sensor_write_register(0x3086, 0x1C2A); + sensor_write_register(0x3086, 0xFA29); + sensor_write_register(0x3086, 0x8345); + sensor_write_register(0x3086, 0xA83E); + sensor_write_register(0x3086, 0x072A); + sensor_write_register(0x3086, 0xFB3E); + sensor_write_register(0x3086, 0x2945); + sensor_write_register(0x3086, 0x8824); + sensor_write_register(0x3086, 0x3E08); + sensor_write_register(0x3086, 0x2AFA); + sensor_write_register(0x3086, 0x5D29); + sensor_write_register(0x3086, 0x9288); + sensor_write_register(0x3086, 0x102B); + sensor_write_register(0x3086, 0x048B); + sensor_write_register(0x3086, 0x1686); + sensor_write_register(0x3086, 0x8D48); + sensor_write_register(0x3086, 0x4D4E); + sensor_write_register(0x3086, 0x2B80); + sensor_write_register(0x3086, 0x4C0B); + sensor_write_register(0x3086, 0x603F); + sensor_write_register(0x3086, 0x302A); + sensor_write_register(0x3086, 0xF23F); + sensor_write_register(0x3086, 0x1029); + sensor_write_register(0x3086, 0x8229); + sensor_write_register(0x3086, 0x8329); + sensor_write_register(0x3086, 0x435C); + sensor_write_register(0x3086, 0x155F); + sensor_write_register(0x3086, 0x4D1C); + sensor_write_register(0x3086, 0x2AFA); + sensor_write_register(0x3086, 0x4558); + sensor_write_register(0x3086, 0x8E00); + sensor_write_register(0x3086, 0x2A98); + sensor_write_register(0x3086, 0x3F0A); + sensor_write_register(0x3086, 0x4A0A); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x0B43); + sensor_write_register(0x3086, 0x168E); + sensor_write_register(0x3086, 0x032A); + sensor_write_register(0x3086, 0x9C45); + sensor_write_register(0x3086, 0x783F); + sensor_write_register(0x3086, 0x072A); + sensor_write_register(0x3086, 0x9D3E); + sensor_write_register(0x3086, 0x305D); + sensor_write_register(0x3086, 0x2944); + sensor_write_register(0x3086, 0x8810); + sensor_write_register(0x3086, 0x2B04); + sensor_write_register(0x3086, 0x530D); + sensor_write_register(0x3086, 0x4558); + sensor_write_register(0x3086, 0x3E08); + sensor_write_register(0x3086, 0x8E01); + sensor_write_register(0x3086, 0x2A98); + sensor_write_register(0x3086, 0x8E00); + sensor_write_register(0x3086, 0x769C); + sensor_write_register(0x3086, 0x779C); + sensor_write_register(0x3086, 0x4644); + sensor_write_register(0x3086, 0x1616); + sensor_write_register(0x3086, 0x907A); + sensor_write_register(0x3086, 0x1244); + sensor_write_register(0x3086, 0x4B18); + sensor_write_register(0x3086, 0x4A04); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x0643); + sensor_write_register(0x3086, 0x1605); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x0743); + sensor_write_register(0x3086, 0x1658); + sensor_write_register(0x3086, 0x4316); + sensor_write_register(0x3086, 0x5A43); + sensor_write_register(0x3086, 0x1645); + sensor_write_register(0x3086, 0x588E); + sensor_write_register(0x3086, 0x032A); + sensor_write_register(0x3086, 0x9C45); + sensor_write_register(0x3086, 0x787B); + sensor_write_register(0x3086, 0x3F07); + sensor_write_register(0x3086, 0x2A9D); + sensor_write_register(0x3086, 0x530D); + sensor_write_register(0x3086, 0x8B16); + sensor_write_register(0x3086, 0x863E); + sensor_write_register(0x3086, 0x2345); + sensor_write_register(0x3086, 0x5825); + sensor_write_register(0x3086, 0x3E10); + sensor_write_register(0x3086, 0x8E01); + sensor_write_register(0x3086, 0x2A98); + sensor_write_register(0x3086, 0x8E00); + sensor_write_register(0x3086, 0x3E10); + sensor_write_register(0x3086, 0x8D60); + sensor_write_register(0x3086, 0x1244); + sensor_write_register(0x3086, 0x4B2C); + sensor_write_register(0x3086, 0x2C2C); + + //LOAD= AR0230 REV1.2 Optimized Settings + sensor_write_register(0x320C, 0x0180); + sensor_write_register(0x320E, 0x0300); + sensor_write_register(0x3210, 0x0500); + sensor_write_register(0x3204, 0x0B6D); + sensor_write_register(0x30FE, 0x0080); + sensor_write_register(0x3ED8, 0x7B99); + sensor_write_register(0x3EDC, 0x9BA8); + sensor_write_register(0x3EDA, 0x9B9B); + sensor_write_register(0x3092, 0x006F); + sensor_write_register(0x3EEC, 0x1C04); + sensor_write_register(0x30BA, 0x779C); + sensor_write_register(0x3EF6, 0xA70F); + sensor_write_register(0x3044, 0x0410); + sensor_write_register(0x3ED0, 0xFF44); + sensor_write_register(0x3ED4, 0x031F); + sensor_write_register(0x30FE, 0x0080); + sensor_write_register(0x3EE2, 0x8866); + sensor_write_register(0x3EE4, 0x6623); + sensor_write_register(0x3EE6, 0x2263); + sensor_write_register(0x30E0, 0x4283); + + sensor_write_register(0x301A, 0x0058); + sensor_write_register(0x30B0, 0x0118); + sensor_write_register(0x31AC, 0x0C0C); + + //PLL_settings - 4 Lane 12-bit HiSPi Power Saving Mode + //MCLK=27Mhz + sensor_write_register(0x302A, 0x0006); + sensor_write_register(0x302C, 0x0001); + sensor_write_register(0x302E, 0x0004); + sensor_write_register(0x3030, 0x0042); + sensor_write_register(0x3036, 0x000C); + sensor_write_register(0x3038, 0x0001); + + //Sensor output setup + sensor_write_register(0x3002, 0x0000 ); + sensor_write_register(0x3004, 0x0000 ); + sensor_write_register(0x3006, 0x0437 ); + sensor_write_register(0x3008, 0x0787 ); + sensor_write_register(0x300A, 1106 ); + sensor_write_register(0x300C, 1118 ); + sensor_write_register(0x3012, 1046 ); + sensor_write_register(0x30A2, 0x0001 ); + sensor_write_register(0x30A6, 0x0001 ); + sensor_write_register(0x3040, 0x0000 ); + + // Linear Mode Setup + sensor_write_register(0x3082, 0x0009 ); + sensor_write_register(0x30BA, 0x769C ); + sensor_write_register(0x31E0, 0x0200 ); + sensor_write_register(0x318C, 0x0000 ); + + //Load= Linear Mode Low Conversion Gain + sensor_write_register(0x3060, 0x000B );// ANALOG_GAIN 1.5x Minimum analog gain for LCG + sensor_write_register(0x3096, 0x0080 ); + sensor_write_register(0x3098, 0x0080 ); + sensor_write_register(0x3206, 0x0B08 ); + sensor_write_register(0x3208, 0x1E13 ); + sensor_write_register(0x3202, 0x0080 ); + sensor_write_register(0x3200, 0x0002 ); + sensor_write_register(0x3100, 0x0000 ); + //Load= Linear Mode High Conversion Gain + + sensor_write_register(0x3200, 0x0000 ); + sensor_write_register(0x31D0, 0x0000 ); + // ALTM Bypassed + sensor_write_register(0x2400, 0x0003 ); + sensor_write_register(0x301E, 0x00A8 ); + sensor_write_register(0x2450, 0x0000 ); + sensor_write_register(0x320A, 0x0080 ); + + sensor_write_register(0x3178, 0xFE80 );// DELTA_DK_ADJUST_RED offset of -2 + sensor_write_register(0x3176, 0xFE80 );// DELTA_DK_ADJUST_GREENR offset of -2 + sensor_write_register(0x317A, 0xFF80 );// DELTA_DK_ADJUST_BLUE offset of -1 + sensor_write_register(0x317C, 0xFF80 );// DELTA_DK_ADJUST_GREENB offset of -1 + + sensor_write_register(0x3064, 0x1802 );//Disable Embedded Data and Stats + sensor_write_register(0x31AE, 0x0304 ); + sensor_write_register(0x31C6, 0x0400 );//HISPI_CONTROL_STATUS: HispiSP + sensor_write_register(0x306E, 0x9210 );//DATAPATH_SELECT[9]=1 VDD_SLVS=1.8V + + sensor_write_register(0x301A, 0x005C );//RESET_REGISTER + delay_ms(33); + + printf("Aptina AR0230 sensor linear 2M-1080p 60fps init success!\n"); + +} + + +void sensor_wdr_1080p30_init() +{ + // ---------------------hdr start------------------------- + + //[HiSPi HDR 1080p30 - 4 Lane_ALTM on] + // Reset + sensor_write_register( 0x301A, 0x0001); // RESET_REGISTER + delay_ms( 200); + sensor_write_register( 0x301A, 0x10D8); // RESET_REGISTER + + + //LOAD = HDR Mode Sequencer - Rev1.2 + + //[HDR Mode Sequencer - Rev1.2] + //$Revision: 40442 $ + sensor_write_register(0x301A, 0x0059 ); + delay_ms( 200); + sensor_write_register(0x3088, 0x8000 ); + sensor_write_register(0x3086, 0x4558 ); + sensor_write_register(0x3086, 0x729B ); + sensor_write_register(0x3086, 0x4A31 ); + sensor_write_register(0x3086, 0x4342 ); + sensor_write_register(0x3086, 0x8E03 ); + sensor_write_register(0x3086, 0x2A14 ); + sensor_write_register(0x3086, 0x4578 ); + sensor_write_register(0x3086, 0x7B3D ); + sensor_write_register(0x3086, 0xFF3D ); + sensor_write_register(0x3086, 0xFF3D ); + sensor_write_register(0x3086, 0xEA2A ); + sensor_write_register(0x3086, 0x043D ); + sensor_write_register(0x3086, 0x102A ); + sensor_write_register(0x3086, 0x052A ); + sensor_write_register(0x3086, 0x1535 ); + sensor_write_register(0x3086, 0x2A05 ); + sensor_write_register(0x3086, 0x3D10 ); + sensor_write_register(0x3086, 0x4558 ); + sensor_write_register(0x3086, 0x2A04 ); + sensor_write_register(0x3086, 0x2A14 ); + sensor_write_register(0x3086, 0x3DFF ); + sensor_write_register(0x3086, 0x3DFF ); + sensor_write_register(0x3086, 0x3DEA ); + sensor_write_register(0x3086, 0x2A04 ); + sensor_write_register(0x3086, 0x622A ); + sensor_write_register(0x3086, 0x288E ); + sensor_write_register(0x3086, 0x0036 ); + sensor_write_register(0x3086, 0x2A08 ); + sensor_write_register(0x3086, 0x3D64 ); + sensor_write_register(0x3086, 0x7A3D ); + sensor_write_register(0x3086, 0x0444 ); + sensor_write_register(0x3086, 0x2C4B ); + sensor_write_register(0x3086, 0x8F00 ); + sensor_write_register(0x3086, 0x430C ); + sensor_write_register(0x3086, 0x2D63 ); + sensor_write_register(0x3086, 0x4316 ); + sensor_write_register(0x3086, 0x8E03 ); + sensor_write_register(0x3086, 0x2AFC ); + sensor_write_register(0x3086, 0x5C1D ); + sensor_write_register(0x3086, 0x5754 ); + sensor_write_register(0x3086, 0x495F ); + sensor_write_register(0x3086, 0x5305 ); + sensor_write_register(0x3086, 0x5307 ); + sensor_write_register(0x3086, 0x4D2B ); + sensor_write_register(0x3086, 0xF810 ); + sensor_write_register(0x3086, 0x164C ); + sensor_write_register(0x3086, 0x0855 ); + sensor_write_register(0x3086, 0x562B ); + sensor_write_register(0x3086, 0xB82B ); + sensor_write_register(0x3086, 0x984E ); + sensor_write_register(0x3086, 0x1129 ); + sensor_write_register(0x3086, 0x0429 ); + sensor_write_register(0x3086, 0x8429 ); + sensor_write_register(0x3086, 0x9460 ); + sensor_write_register(0x3086, 0x5C19 ); + sensor_write_register(0x3086, 0x5C1B ); + sensor_write_register(0x3086, 0x4548 ); + sensor_write_register(0x3086, 0x4508 ); + sensor_write_register(0x3086, 0x4588 ); + sensor_write_register(0x3086, 0x29B6 ); + sensor_write_register(0x3086, 0x8E01 ); + sensor_write_register(0x3086, 0x2AF8 ); + sensor_write_register(0x3086, 0x3E02 ); + sensor_write_register(0x3086, 0x2AFA ); + sensor_write_register(0x3086, 0x3F09 ); + sensor_write_register(0x3086, 0x5C1B ); + sensor_write_register(0x3086, 0x29B2 ); + sensor_write_register(0x3086, 0x3F0C ); + sensor_write_register(0x3086, 0x3E02 ); + sensor_write_register(0x3086, 0x3E13 ); + sensor_write_register(0x3086, 0x5C13 ); + sensor_write_register(0x3086, 0x3F11 ); + sensor_write_register(0x3086, 0x3E0B ); + sensor_write_register(0x3086, 0x5F2B ); + sensor_write_register(0x3086, 0x902A ); + sensor_write_register(0x3086, 0xF22B ); + sensor_write_register(0x3086, 0x803E ); + sensor_write_register(0x3086, 0x043F ); + sensor_write_register(0x3086, 0x0660 ); + sensor_write_register(0x3086, 0x29A2 ); + sensor_write_register(0x3086, 0x29A3 ); + sensor_write_register(0x3086, 0x5F4D ); + sensor_write_register(0x3086, 0x192A ); + sensor_write_register(0x3086, 0xFA29 ); + sensor_write_register(0x3086, 0x8345 ); + sensor_write_register(0x3086, 0xA83E ); + sensor_write_register(0x3086, 0x072A ); + sensor_write_register(0x3086, 0xFB3E ); + sensor_write_register(0x3086, 0x2945 ); + sensor_write_register(0x3086, 0x8821 ); + sensor_write_register(0x3086, 0x3E08 ); + sensor_write_register(0x3086, 0x2AFA ); + sensor_write_register(0x3086, 0x5D29 ); + sensor_write_register(0x3086, 0x9288 ); + sensor_write_register(0x3086, 0x102B ); + sensor_write_register(0x3086, 0x048B ); + sensor_write_register(0x3086, 0x1685 ); + sensor_write_register(0x3086, 0x8D48 ); + sensor_write_register(0x3086, 0x4D4E ); + sensor_write_register(0x3086, 0x2B80 ); + sensor_write_register(0x3086, 0x4C0B ); + sensor_write_register(0x3086, 0x603F ); + sensor_write_register(0x3086, 0x282A ); + sensor_write_register(0x3086, 0xF23F ); + sensor_write_register(0x3086, 0x0F29 ); + sensor_write_register(0x3086, 0x8229 ); + sensor_write_register(0x3086, 0x8329 ); + sensor_write_register(0x3086, 0x435C ); + sensor_write_register(0x3086, 0x155F ); + sensor_write_register(0x3086, 0x4D19 ); + sensor_write_register(0x3086, 0x2AFA ); + sensor_write_register(0x3086, 0x4558 ); + sensor_write_register(0x3086, 0x8E00 ); + sensor_write_register(0x3086, 0x2A98 ); + sensor_write_register(0x3086, 0x3F06 ); + sensor_write_register(0x3086, 0x1244 ); + sensor_write_register(0x3086, 0x4A04 ); + sensor_write_register(0x3086, 0x4316 ); + sensor_write_register(0x3086, 0x0543 ); + sensor_write_register(0x3086, 0x1658 ); + sensor_write_register(0x3086, 0x4316 ); + sensor_write_register(0x3086, 0x5A43 ); + sensor_write_register(0x3086, 0x1606 ); + sensor_write_register(0x3086, 0x4316 ); + sensor_write_register(0x3086, 0x0743 ); + sensor_write_register(0x3086, 0x168E ); + sensor_write_register(0x3086, 0x032A ); + sensor_write_register(0x3086, 0x9C45 ); + sensor_write_register(0x3086, 0x787B ); + sensor_write_register(0x3086, 0x3F07 ); + sensor_write_register(0x3086, 0x2A9D ); + sensor_write_register(0x3086, 0x3E2E ); + sensor_write_register(0x3086, 0x4558 ); + sensor_write_register(0x3086, 0x253E ); + sensor_write_register(0x3086, 0x068E ); + sensor_write_register(0x3086, 0x012A ); + sensor_write_register(0x3086, 0x988E ); + sensor_write_register(0x3086, 0x0012 ); + sensor_write_register(0x3086, 0x444B ); + sensor_write_register(0x3086, 0x0343 ); + sensor_write_register(0x3086, 0x2D46 ); + sensor_write_register(0x3086, 0x4316 ); + sensor_write_register(0x3086, 0xA343 ); + sensor_write_register(0x3086, 0x165D ); + sensor_write_register(0x3086, 0x0D29 ); + sensor_write_register(0x3086, 0x4488 ); + sensor_write_register(0x3086, 0x102B ); + sensor_write_register(0x3086, 0x0453 ); + sensor_write_register(0x3086, 0x0D8B ); + sensor_write_register(0x3086, 0x1685 ); + sensor_write_register(0x3086, 0x448E ); + sensor_write_register(0x3086, 0x032A ); + sensor_write_register(0x3086, 0xFC5C ); + sensor_write_register(0x3086, 0x1D8D ); + sensor_write_register(0x3086, 0x6057 ); + sensor_write_register(0x3086, 0x5449 ); + sensor_write_register(0x3086, 0x5F53 ); + sensor_write_register(0x3086, 0x0553 ); + sensor_write_register(0x3086, 0x074D ); + sensor_write_register(0x3086, 0x2BF8 ); + sensor_write_register(0x3086, 0x1016 ); + sensor_write_register(0x3086, 0x4C08 ); + sensor_write_register(0x3086, 0x5556 ); + sensor_write_register(0x3086, 0x2BB8 ); + sensor_write_register(0x3086, 0x2B98 ); + sensor_write_register(0x3086, 0x4E11 ); + sensor_write_register(0x3086, 0x2904 ); + sensor_write_register(0x3086, 0x2984 ); + sensor_write_register(0x3086, 0x2994 ); + sensor_write_register(0x3086, 0x605C ); + sensor_write_register(0x3086, 0x195C ); + sensor_write_register(0x3086, 0x1B45 ); + sensor_write_register(0x3086, 0x4845 ); + sensor_write_register(0x3086, 0x0845 ); + sensor_write_register(0x3086, 0x8829 ); + sensor_write_register(0x3086, 0xB68E ); + sensor_write_register(0x3086, 0x012A ); + sensor_write_register(0x3086, 0xF83E ); + sensor_write_register(0x3086, 0x022A ); + sensor_write_register(0x3086, 0xFA3F ); + sensor_write_register(0x3086, 0x095C ); + sensor_write_register(0x3086, 0x1B29 ); + sensor_write_register(0x3086, 0xB23F ); + sensor_write_register(0x3086, 0x0C3E ); + sensor_write_register(0x3086, 0x023E ); + sensor_write_register(0x3086, 0x135C ); + sensor_write_register(0x3086, 0x133F ); + sensor_write_register(0x3086, 0x113E ); + sensor_write_register(0x3086, 0x0B5F ); + sensor_write_register(0x3086, 0x2B90 ); + sensor_write_register(0x3086, 0x2AF2 ); + sensor_write_register(0x3086, 0x2B80 ); + sensor_write_register(0x3086, 0x3E04 ); + sensor_write_register(0x3086, 0x3F06 ); + sensor_write_register(0x3086, 0x6029 ); + sensor_write_register(0x3086, 0xA229 ); + sensor_write_register(0x3086, 0xA35F ); + sensor_write_register(0x3086, 0x4D1C ); + sensor_write_register(0x3086, 0x2AFA ); + sensor_write_register(0x3086, 0x2983 ); + sensor_write_register(0x3086, 0x45A8 ); + sensor_write_register(0x3086, 0x3E07 ); + sensor_write_register(0x3086, 0x2AFB ); + sensor_write_register(0x3086, 0x3E29 ); + sensor_write_register(0x3086, 0x4588 ); + sensor_write_register(0x3086, 0x243E ); + sensor_write_register(0x3086, 0x082A ); + sensor_write_register(0x3086, 0xFA5D ); + sensor_write_register(0x3086, 0x2992 ); + sensor_write_register(0x3086, 0x8810 ); + sensor_write_register(0x3086, 0x2B04 ); + sensor_write_register(0x3086, 0x8B16 ); + sensor_write_register(0x3086, 0x868D ); + sensor_write_register(0x3086, 0x484D ); + sensor_write_register(0x3086, 0x4E2B ); + sensor_write_register(0x3086, 0x804C ); + sensor_write_register(0x3086, 0x0B60 ); + sensor_write_register(0x3086, 0x3F28 ); + sensor_write_register(0x3086, 0x2AF2 ); + sensor_write_register(0x3086, 0x3F0F ); + sensor_write_register(0x3086, 0x2982 ); + sensor_write_register(0x3086, 0x2983 ); + sensor_write_register(0x3086, 0x2943 ); + sensor_write_register(0x3086, 0x5C15 ); + sensor_write_register(0x3086, 0x5F4D ); + sensor_write_register(0x3086, 0x1C2A ); + sensor_write_register(0x3086, 0xFA45 ); + sensor_write_register(0x3086, 0x588E ); + sensor_write_register(0x3086, 0x002A ); + sensor_write_register(0x3086, 0x983F ); + sensor_write_register(0x3086, 0x064A ); + sensor_write_register(0x3086, 0x739D ); + sensor_write_register(0x3086, 0x0A43 ); + sensor_write_register(0x3086, 0x160B ); + sensor_write_register(0x3086, 0x4316 ); + sensor_write_register(0x3086, 0x8E03 ); + sensor_write_register(0x3086, 0x2A9C ); + sensor_write_register(0x3086, 0x4578 ); + sensor_write_register(0x3086, 0x3F07 ); + sensor_write_register(0x3086, 0x2A9D ); + sensor_write_register(0x3086, 0x3E12 ); + sensor_write_register(0x3086, 0x4558 ); + sensor_write_register(0x3086, 0x3F04 ); + sensor_write_register(0x3086, 0x8E01 ); + sensor_write_register(0x3086, 0x2A98 ); + sensor_write_register(0x3086, 0x8E00 ); + sensor_write_register(0x3086, 0x9176 ); + sensor_write_register(0x3086, 0x9C77 ); + sensor_write_register(0x3086, 0x9C46 ); + sensor_write_register(0x3086, 0x4416 ); + sensor_write_register(0x3086, 0x1690 ); + sensor_write_register(0x3086, 0x7A12 ); + sensor_write_register(0x3086, 0x444B ); + sensor_write_register(0x3086, 0x4A00 ); + sensor_write_register(0x3086, 0x4316 ); + sensor_write_register(0x3086, 0x6343 ); + sensor_write_register(0x3086, 0x1608 ); + sensor_write_register(0x3086, 0x4316 ); + sensor_write_register(0x3086, 0x5043 ); + sensor_write_register(0x3086, 0x1665 ); + sensor_write_register(0x3086, 0x4316 ); + sensor_write_register(0x3086, 0x6643 ); + sensor_write_register(0x3086, 0x168E ); + sensor_write_register(0x3086, 0x032A ); + sensor_write_register(0x3086, 0x9C45 ); + sensor_write_register(0x3086, 0x783F ); + sensor_write_register(0x3086, 0x072A ); + sensor_write_register(0x3086, 0x9D5D ); + sensor_write_register(0x3086, 0x0C29 ); + sensor_write_register(0x3086, 0x4488 ); + sensor_write_register(0x3086, 0x102B ); + sensor_write_register(0x3086, 0x0453 ); + sensor_write_register(0x3086, 0x0D8B ); + sensor_write_register(0x3086, 0x1686 ); + sensor_write_register(0x3086, 0x3E1F ); + sensor_write_register(0x3086, 0x4558 ); + sensor_write_register(0x3086, 0x283E ); + sensor_write_register(0x3086, 0x068E ); + sensor_write_register(0x3086, 0x012A ); + sensor_write_register(0x3086, 0x988E ); + sensor_write_register(0x3086, 0x008D ); + sensor_write_register(0x3086, 0x6012 ); + sensor_write_register(0x3086, 0x444B ); + sensor_write_register(0x3086, 0x2C2C ); + sensor_write_register(0x3086, 0x2C2C ); + + + //LOAD= AR0230 REV1.2 Optimized Settings + + //[AR0230 REV1.2 Optimized Settings] + //$Revision: 40442 $ + sensor_write_register( 0x2436, 0x000E ); + sensor_write_register( 0x320C, 0x0180 ); + sensor_write_register( 0x320E, 0x0300 ); + sensor_write_register( 0x3210, 0x0500 ); + sensor_write_register( 0x3204, 0x0B6D ); + sensor_write_register( 0x30FE, 0x0080 ); + sensor_write_register( 0x3ED8, 0x7B99 ); + sensor_write_register( 0x3EDC, 0x9BA8 ); + sensor_write_register( 0x3EDA, 0x9B9B ); + sensor_write_register( 0x3092, 0x006F ); + sensor_write_register( 0x3EEC, 0x1C04 ); + sensor_write_register( 0x30BA, 0x779C ); + sensor_write_register( 0x3EF6, 0xA70F ); + sensor_write_register( 0x3044, 0x0410 ); + sensor_write_register( 0x3ED0, 0xFF44 ); + sensor_write_register( 0x3ED4, 0x031F ); + sensor_write_register( 0x30FE, 0x0080 ); + sensor_write_register( 0x3EE2, 0x8866 ); + sensor_write_register( 0x3EE4, 0x6623 ); + sensor_write_register( 0x3EE6, 0x2263 ); + sensor_write_register( 0x30E0, 0x4283 ); + sensor_write_register( 0x30F0, 0x1283 ); + + + sensor_write_register( 0x301A, 0x0058 );//RESET_REGISTER + sensor_write_register( 0x30B0, 0x0118 ); + sensor_write_register( 0x31AC, 0x100C ); + + //PLL_settings - 4 Lane 12-bit HiSPi + //MCLK=27Mhz PCLK=74.25Mhz + sensor_write_register( 0x302A, 0x0006 ); + sensor_write_register( 0x302C, 0x0001 ); + sensor_write_register( 0x302E, 0x0004 ); + sensor_write_register( 0x3030, 0x0042 ); + sensor_write_register( 0x3036, 0x000C ); + sensor_write_register( 0x3038, 0x0001 ); + + + //Sensor output setup + sensor_write_register( 0x3002, 0x0000 ); + sensor_write_register( 0x3004, 0x0000 ); + sensor_write_register( 0x3006, 0x0437 ); + sensor_write_register( 0x3008, 0x0787 ); + sensor_write_register( 0x300A, 0x0465 );//FRAME_LENGTH_LINES 1125 + sensor_write_register( 0x300C, 0x0898 );//LINE_LENGTH_PCK 2200 + sensor_write_register( 0x3012, 0x0416 );//COARSE_INTEGRATION_TIME + sensor_write_register( 0x30A2, 0x0001 ); + sensor_write_register( 0x30A6, 0x0001 ); + sensor_write_register( 0x3040, 0x0000 ); + + //HDR Mode 16x Setup + sensor_write_register( 0x3082, 0x0008 ); + sensor_write_register( 0x31E0, 0x0200 ); + +#if 1 + // ALTM Disabled + sensor_write_register(0x2400, 0x0003); + sensor_write_register(0x301E, 0x00A8); + sensor_write_register(0x2450, 0x0000); + sensor_write_register(0x320A, 0x0080); + sensor_write_register(0x31D0, 0x0001); + +#else + //LOAD= ALTM Enabled + //[ALTM Enabled] + //$Revision: 40442 $ + + sensor_write_register( 0x2420, 0x0000 ); + sensor_write_register( 0x2440, 0x0004 ); + sensor_write_register( 0x2442, 0x0080 ); + sensor_write_register( 0x301E, 0x0000 ); + sensor_write_register( 0x2450, 0x0000 ); + sensor_write_register( 0x320A, 0x0080 ); + sensor_write_register( 0x31D0, 0x0000 ); + sensor_write_register( 0x2400, 0x0002 ); + sensor_write_register( 0x2410, 0x0005 ); + sensor_write_register( 0x2412, 0x002D ); + sensor_write_register( 0x2444, 0xF400 ); + sensor_write_register( 0x2446, 0x0001 ); + sensor_write_register( 0x2438, 0x0010 ); + sensor_write_register( 0x243A, 0x0012 ); + sensor_write_register( 0x243C, 0xFFFF ); + sensor_write_register( 0x243E, 0x0100 ); +#endif + + //LOAD= Motion Compensation On + //[Motion Compensation On] + sensor_write_register( 0x3190, 0x0000 );//DLO disabled + sensor_write_register( 0x318A, 0x0E74 );// + sensor_write_register( 0x318C, 0xC000 );// + sensor_write_register( 0x3192, 0x0400 );// + sensor_write_register( 0x3198, 0x2050 );//modified at 20150407, prev value 0x183c + //LOAD= HDR Mode Low Conversion Gain + //[HDR Mode Low Conversion Gain] + sensor_write_register( 0x3060, 0x000B ); //ANALOG_GAIN 1.5x Minimum analog Gain for LCG + sensor_write_register( 0x3096, 0x0480 ); + sensor_write_register( 0x3098, 0x0480 ); + sensor_write_register( 0x3206, 0x0B08 ); + sensor_write_register( 0x3208, 0x1E13 ); + sensor_write_register( 0x3202, 0x0080 ); + sensor_write_register( 0x3200, 0x0002 ); + sensor_write_register( 0x3100, 0x0000 ); + //LOAD= HDR Mode High Conversion Gain + sensor_write_register( 0x30BA, 0x779C ); + sensor_write_register( 0x318E, 0x0200 ); + sensor_write_register( 0x3064, 0x1802 ); // should be 0x1802 + sensor_write_register( 0x31AE, 0x0304 ); + sensor_write_register( 0x31C6, 0x0400 );//HISPI_CONTROL_STATUS: HispiSP Packetized + sensor_write_register( 0x306E, 0x9210 );//DATAPATH_SELECT[9]=1 VDD_SLVS=1.8V + sensor_write_register( 0x301A, 0x005C );//Start streaming + delay_ms(33); + + // ---------------------hdr end------------------------- + + printf("Aptina AR0230 sensor wdr 2M-1080p 30fps init success!\n"); +} + +void sensor_wdr_1080p60_init() +{ + printf("Aptina AR0230 sensor wdr 2M-1080p 60fps init success!\n"); +} + diff --git a/device/mpp/component/isp/sensor/ar0130/Makefile b/device/mpp/component/isp/sensor/ar0130/Makefile new file mode 100644 index 0000000..d51021f --- /dev/null +++ b/device/mpp/component/isp/sensor/ar0130/Makefile @@ -0,0 +1,75 @@ +# +# sensor lib Makefile +# + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../../../Makefile.param + include $(PARAM_FILE) +endif + +ISP_PATH := $(SDK_PATH)/mpp/component/isp +EXT_PATH := $(SDK_PATH)/mpp/$(EXTDRV) +3A_PATH := $(ISP_PATH)/3a +LIBPATH = $(ISP_PATH)/lib +OBJPATH = ./obj + +ifeq ($(CONFIG_GPIO_I2C),y) +HI_GPIO_I2C:=HI_GPIO_I2C +else +HI_GPIO_I2C:=HI_GPIO_XXX +endif + +ARFLAGS = rcv +ARFLAGS_SO = $(LIBS_LD_CFLAGS) +ARFLAGS_SO += -shared -fPIC -o +CFLAGS = -Wall -fPIC -D$(HI_FPGA) -D$(HI_GPIO_I2C) +CFLAGS += -O2 +CFLAGS += $(LIBS_CFLAGS) + +ifeq ($(ISP_INI_CONFIG), y) +CFLAGS += -D INIFILE_CONFIG_MODE +endif + +ifeq ($(HIGDB),HI_GDB) +CFLAGS += -g +endif + +ifeq ($(CONFIG_JPEGEDCF), y) + CFLAGS += -D ENABLE_JPEGEDCF +endif +BUS_DIR := $(EXT_PATH)/ssp-sony/ + +ISP_INC := $(ISP_PATH)/include +3A_INC := $(3A_PATH)/include +INC := -I$(BUS_DIR) -I$(REL_INC) -I$(ISP_INC) -I$(3A_INC) + +ifeq ($(CONFIG_GPIO_I2C), y) + INC += -I$(EXT_PATH)/gpio-i2c-ex + INC += -I$(EXT_PATH)/gpio-i2c +else + INC += -I$(EXT_PATH)/i2c + INC += -I$(EXT_PATH)/hi_i2c +endif + +COMPILE = $(CC) $(CFLAGS) $(DFLAGS) -lm + +$(OBJPATH)/%.o: ./%.c + @[ -e $(LIBPATH) ] || mkdir $(LIBPATH) + @[ -e $(OBJPATH) ] || mkdir $(OBJPATH) + @$(COMPILE) -o $@ -c $< $(INC) + +SRCS = $(wildcard ./*.c) +OBJS = $(SRCS:%.c=%.o) +OBJS := $(OBJS:./%=obj/%) + +TARGETLIB := $(LIBPATH)/libsns_ar0130.a +TARGETLIB_SO := $(LIBPATH)/libsns_ar0130.so + +all:$(TARGETLIB) +$(TARGETLIB):$(OBJS) + @($(AR) $(ARFLAGS) $(TARGETLIB) $(OBJS)) + @($(CC) $(ARFLAGS_SO) $(TARGETLIB_SO) $(OBJS)) + +clean: + @$(RM) -rf $(TARGETLIB) $(OBJS) + @$(RM) -rf $(LIBPATH) $(OBJPATH) diff --git a/device/mpp/component/isp/sensor/ar0130/ar0130_cmos.c b/device/mpp/component/isp/sensor/ar0130/ar0130_cmos.c new file mode 100644 index 0000000..c0379f4 --- /dev/null +++ b/device/mpp/component/isp/sensor/ar0130/ar0130_cmos.c @@ -0,0 +1,2021 @@ +#if !defined(__AR0130_CMOS_H_) +#define __AR0130_CMOS_H_ + +#include +#include +#include +#include "hi_comm_sns.h" +#include "hi_sns_ctrl.h" +#include "mpi_isp.h" +#include "mpi_ae.h" +#include "mpi_awb.h" +#include "mpi_af.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define AR0130_ID 130 + +/*set Frame End Update Mode 2 with HI_MPI_ISP_SetAEAttr and set this value 1 to avoid flicker in antiflicker mode */ +/*when use Frame End Update Mode 2, the speed of i2c will affect whole system's performance */ +/*increase I2C_DFT_RATE in Hii2c.c to 400000 to increase the speed of i2c */ +#define CMOS_AR0130_ISP_WRITE_SENSOR_ENABLE (1) +/**************************************************************************** + * local variables * + ****************************************************************************/ + +extern const unsigned int sensor_i2c_addr; +extern unsigned int sensor_addr_byte; +extern unsigned int sensor_data_byte; + + +HI_U8 gu8SensorMode = 0; + +/**************************************************************************** + * local variables * + ****************************************************************************/ + + +#define EXPOSURE_TIME (0x3012) +#define ANALOG_GAIN (0x30B0) +#define DIGITAL_GAIN (0x305E) +#define FRAME_LINES (0x300A) +#define LINE_LEN_PCK (0x300C) + +#define SENSOR_720P_30FPS_MODE (1) +#define SENSOR_960P_30FPS_MODE (2) + +#define INCREASE_LINES (0) /* make real fps less than stand fps because NVR require*/ +#define FRAME_LINES_720P (750+INCREASE_LINES) +#define FRAME_LINES_960P (990+INCREASE_LINES) +#define LINE_LENGTH_PCK_720P_30FPS (0x8BA) +#define LINE_LENGTH_PCK_960P_30FPS (2500) + +HI_U8 gu8SensorImageMode = SENSOR_720P_30FPS_MODE; +WDR_MODE_E genSensorMode = WDR_MODE_NONE; + +static HI_U32 gu32FullLinesStd = FRAME_LINES_720P; +static HI_U32 gu32FullLines = FRAME_LINES_720P; +static HI_U32 gu32LineLength = LINE_LENGTH_PCK_720P_30FPS; +static HI_BOOL bInit = HI_FALSE; +HI_BOOL bSensorInit = HI_FALSE; + +ISP_SNS_REGS_INFO_S g_stSnsRegsInfo = {0}; +ISP_SNS_REGS_INFO_S g_stPreSnsRegsInfo = {0}; + +#define PATHLEN_MAX 256 +#define CMOS_CFG_INI "ar0130_cfg.ini" +static char pcName[PATHLEN_MAX] = "configs/ar0130_cfg.ini"; + + +/* AE default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 6; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.03125; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 32 << pstAeSnsDft->u32ISPDgainShift; + + switch(genSensorMode) + { + default: + case WDR_MODE_NONE: /*linear mode*/ + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = g_AeDft[0].u8AeCompensation; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[0].u32MaxIntTimeTarget; + pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[0].u32MinIntTimeTarget; + + pstAeSnsDft->u32MaxAgain = 23088; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = g_AeDft[0].u32MaxAgainTarget; + pstAeSnsDft->u32MinAgainTarget = g_AeDft[0].u32MinAgainTarget; + + pstAeSnsDft->u32MaxDgain = 255; + pstAeSnsDft->u32MinDgain = 32; + pstAeSnsDft->u32MaxDgainTarget = g_AeDft[0].u32MaxDgainTarget; + pstAeSnsDft->u32MinDgainTarget = g_AeDft[0].u32MinDgainTarget; + + pstAeSnsDft->u32ISPDgainShift = g_AeDft[0].u32ISPDgainShift; + pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[0].u32MinISPDgainTarget; + pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[0].u32MaxISPDgainTarget; + break; + + } + return 0; +} + +#else + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 6; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.03125; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 32 << pstAeSnsDft->u32ISPDgainShift; + + switch(genSensorMode) + { + default: + case WDR_MODE_NONE: /*linear mode*/ + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x40; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = 2; + + pstAeSnsDft->u32MaxAgain = 23088; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 255; + pstAeSnsDft->u32MinDgain = 32; + pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgain; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + break; + + } + return 0; +} + +#endif + +/* the function of sensor set fps */ +static HI_VOID cmos_fps_set(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + switch (genSensorMode) + { + default : + case WDR_MODE_NONE : + if (SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + gu32LineLength = (LINE_LENGTH_PCK_720P_30FPS * 30) / f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + gu32FullLinesStd = FRAME_LINES_720P; + } + else if (SENSOR_960P_30FPS_MODE == gu8SensorImageMode) + { + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + gu32LineLength = (LINE_LENGTH_PCK_960P_30FPS * 30) / f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + gu32FullLinesStd = FRAME_LINES_960P; + } + else + { + printf("Not support! gu8SensorImageMode:%d, f32Fps:%f\n", gu8SensorImageMode, f32Fps); + return; + } + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + break; + + } + + + gu32LineLength = gu32LineLength > 0xFFFF ? 0xFFFF : gu32LineLength; + + + sensor_write_register(LINE_LEN_PCK, gu32LineLength); + + pstAeSnsDft->f32Fps = f32Fps; + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd * f32Fps / 2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + + return; +} + + +static HI_VOID cmos_slow_framerate_set(HI_U32 u32FullLines, + AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + u32FullLines = (u32FullLines > 0xFFFF) ? 0xFFFF : u32FullLines; + gu32FullLines = u32FullLines; + + //g_stSnsRegsInfo.astI2cData[3].u32Data = gu32FullLines; + + sensor_write_register(FRAME_LINES, gu32FullLines); + + pstAeSnsDft->u32MaxIntTime = gu32FullLines - 2; + + return; +} + +/* while isp notify ae to update sensor regs, ae call these funcs. */ +static HI_VOID cmos_inttime_update(HI_U32 u32IntTime) +{ + g_stSnsRegsInfo.astI2cData[0].u32Data = u32IntTime; + + return; +} + + +static HI_U32 analog_gain_table[6] = +{ + 1024, 2048, 2886, 5772, 11544, 23088 + +}; + + +static HI_VOID cmos_again_calc_table(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb) +{ + + int i; + + if((HI_NULL == pu32AgainLin) ||(HI_NULL == pu32AgainDb)) + { + printf("null pointer when get ae sensor gain info value!\n"); + return; + } + + if (*pu32AgainLin >= analog_gain_table[5]) + { + *pu32AgainLin = analog_gain_table[5]; + *pu32AgainDb = 5; + return ; + } + + for (i = 1; i < 6; i++) + { + if (*pu32AgainLin < analog_gain_table[i]) + { + *pu32AgainLin = analog_gain_table[i - 1]; + *pu32AgainDb = i - 1; + break; + } + } + + return; + + +} + + +static HI_VOID cmos_gains_update(HI_U32 u32Again, HI_U32 u32Dgain) +{ + + + if(u32Again >= 2) + { + g_stSnsRegsInfo.astI2cData[3].u32Data = 0x0004; + } + else + { + g_stSnsRegsInfo.astI2cData[3].u32Data = 0x0000; + } + + switch(u32Again) + { + case 0: + case 2: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1300; + break; + case 1: + case 3: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1310; + break; + case 4: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1320; + break; + case 5: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1330; + break; + } + + g_stSnsRegsInfo.astI2cData[2].u32Data = u32Dgain; + + + return; +} + + +HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default; + pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set; + pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; + pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update; + pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update; + pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table; + + return 0; +} + + +/* AWB default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + HI_U8 i; + + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + pstAwbSnsDft->u16WbRefTemp = g_AwbDft[0].u16WbRefTemp; + + for(i= 0; i < 4; i++) + { + pstAwbSnsDft->au16GainOffset[i] = g_AwbDft[0].au16GainOffset[i]; + } + + for(i= 0; i < 6; i++) + { + pstAwbSnsDft->as32WbPara[i] = g_AwbDft[0].as32WbPara[i]; + } + memcpy(&pstAwbSnsDft->stCcm, &g_AwbDft[0].stCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_AwbDft[0].stAgcTbl, sizeof(AWB_AGC_TABLE_S)); + break; + + } + return 0; +} + +#else + +static AWB_CCM_S g_stAwbCcm = +{ + 5120, + { + 0x01F1,0x80B0,0x8041, + 0x803E,0x0159,0x801B, + 0x0010,0x8094,0x0184, + }, + + 3633, + { + 0x01CE,0x8086,0x8048, + 0x805A,0x0168,0x800E, + 0x0002,0x80A2,0x01A0, + }, + + 2449, + { + 0x020B,0x80A9,0x8062, + 0x8051,0x0169,0x8018, + 0x0017,0x814B,0x0234, + } + +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTableLin = +{ + /* bvalid */ + 1, + + /* saturation */ + {0x80,0x80,0x7C,0x76,0x58,0x4c,0x40,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38} +}; + + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + + pstAwbSnsDft->u16WbRefTemp = 5000; + + pstAwbSnsDft->au16GainOffset[0] = 0x1A5; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x187; + + pstAwbSnsDft->as32WbPara[0] = 0x0042; + pstAwbSnsDft->as32WbPara[1] = 0x0013; + pstAwbSnsDft->as32WbPara[2] = -0x00AB; + pstAwbSnsDft->as32WbPara[3] = 0x3318B; + pstAwbSnsDft->as32WbPara[4] = 0x80; + pstAwbSnsDft->as32WbPara[5] = -0x27CEA; + + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcm, sizeof(AWB_CCM_S)); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTableLin, sizeof(AWB_AGC_TABLE_S)); + break; + + } + + return 0; +} + +#endif + + +HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default; + + return 0; +} + + +/* ISP default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstDef->stDrc, &g_IspDft[0].stDrc, sizeof(ISP_CMOS_DRC_S)); + memcpy(&pstDef->stNoiseTbl, &g_IspDft[0].stNoiseTbl, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_IspDft[0].stDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_IspDft[0].stRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGamma, &g_IspDft[0].stGamma, sizeof(ISP_CMOS_GAMMA_S)); + memcpy(&pstDef->stGe, &g_IspDft[1].stGe, sizeof(ISP_CMOS_GE_S)); + break; + + } + pstDef->stSensorMaxResolution.u32MaxWidth = 1280; + pstDef->stSensorMaxResolution.u32MaxHeight = 720; + + return 0; +} + +#else + + + +#define DMNR_CALIB_CARVE_NUM_9M034 (13) +static HI_FLOAT g_coef_calib_9m034[DMNR_CALIB_CARVE_NUM_9M034][HI_ISP_NR_CALIB_COEF_COL] = +{ + {100.000000f, 2.000000f, 0.035900f, 9.163901f}, + {611.000000f, 2.786041f, 0.039199f, 9.662953f}, + {1104.000000f, 3.042969f, 0.042015f, 10.098933f}, + {2317.000000f, 3.364926f, 0.046898f, 11.608693f}, + {4625.000000f, 3.665112f, 0.053912f, 14.938090f}, + {5923.000000f, 3.772542f, 0.056674f, 17.071514f}, + {8068.000000f, 3.906766f, 0.061652f, 20.065725f}, + {9985.000000f, 3.999348f, 0.063942f, 22.888287f}, + {20395.000000f, 4.309524f, 0.062935f, 41.496876f}, + {40067.000000f, 4.602787f, 0.053383f, 77.137268f}, + {49630.000000f, 4.695744f, 0.030656f, 104.676781f}, + {60637.000000f, 4.782738f, 0.000000f, 138.000000f}, + {89225.000000f, 4.950487f, 0.000000f, 171.000000f}, +}; + + +static ISP_NR_ISO_PARA_TABLE_S g_stNrIsoParaTab[HI_ISP_NR_ISO_LEVEL_MAX] = +{ + //u16Threshold//u8varStrength//u8fixStrength//u8LowFreqSlope + {1750, 256-224, 256-256, 0 }, //100 // // + {1750, 256-224, 256-256, 0 }, //200 // ISO //Thr//var//fix // ISO //u8LowFreqSlope + {1750, 256-224, 256-256, 0 }, //400 //{400, 1400, 80,256}, //{400 , 0 } + {1750, 256-224, 256-256, 8 }, //800 //{800, 1400, 72,256}, //{600 , 2 } + {1750, 256-208, 256-256, 6 }, //1600 //{1600, 1400, 64,256}, //{800 , 8 } + {1750, 256-208, 256-256, 0 }, //3200 //{3200, 1400, 48,230}, //{1000, 12 } + {1750, 256-208, 256-256, 0 }, //6400 //{6400, 1400, 48,210}, //{1600, 6 } + {1750, 256-204, 256-256, 0 }, //12800 //{12000,1400, 32,180}, //{2400, 0 } + {1625, 256-204, 256-256, 0 }, //25600 //{36000,1300, 48,160}, // + {1375, 256-204, 256-256, 0 }, //51200 //{64000,1100, 40,140}, // + {1250, 256-204, 256-256, 0 }, //102400 //{82000,1000, 30,128}, // + {1250, 256-192, 256-256, 0 }, //204800 // // + {1250, 256-192, 256-256, 0 }, //409600 // // + {1250, 256-192, 256-256, 0 }, //819200 // // + {1250, 256-192, 256-256, 0 }, //1638400// // + {1250, 256-192, 256-256, 0 }, //3276800// // +}; + + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaicLin = +{ + /*For Demosaic*/ + 1, /*bEnable*/ + 12,/*u16VhLimit*/ + 8,/*u16VhOffset*/ + 48, /*u16VhSlope*/ + /*False Color*/ + 1, /*bFcrEnable*/ + {24,24,24,24,24,24,24,24,10, 0, 0, 0, 0, 0, 0, 0}, /*au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]*/ + {24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24}, /*au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]*/ + /*For Ahd*/ + 400, /*u16UuSlope*/ + {512,512,512,512,512,512,512, 400, 0,0,0,0,0,0,0,0} /*au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + + +static ISP_CMOS_GE_S g_stIspGeLin = +{ + /*For GE*/ + 1, /*bEnable*/ + 7, /*u8Slope*/ + 7, /*u8Sensitivity*/ + 8192, /*u16Threshold*/ + 8192, /*u16SensiThreshold*/ + {1024,1024,1024,2048,2048,2048,2048, 2048, 2048,2048,2048,2048,2048,2048,2048,2048} /*au16Strength[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + + + +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpen = +{ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; //ISO + {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},/* bEnLowLumaShoot */ + {37, 30, 28, 28, 26, 26, 24, 22, 20, 18, 15, 12, 12, 12, 12, 12},/*SharpenUD*/ + {25, 25, 28, 28, 35, 35, 40, 40, 50, 50, 31, 31, 31, 31, 31, 31},/*SharpenD*/ + { 10, 10, 12, 14, 16, 18, 19, 20, 22, 24, 26, 28, 28, 28, 28, 28},/*TextureNoiseThd*/ + { 0, 0, 2, 2, 5, 7, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0},/*EdgeNoiseThd*/ + { 150, 130, 120, 110, 110, 60, 40, 30, 20, 10, 0, 0, 0, 0, 0, 0},/*overshoot*/ + { 160, 160, 160, 160, 200, 200, 200, 200, 200, 220, 255, 255, 255, 255, 255, 255},/*undershoot*/ +}; + + +static ISP_CMOS_UVNR_S g_stIspUVNR = +{ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; //ISO + {1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 22, 22, 22, 22}, /*u8UvnrThreshold*/ + {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2}, /*ColorCast*/ + {0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34} /*u8UvnrStrength*/ +}; + +static ISP_CMOS_DPC_S g_stCmosDpc = +{ + //0,/*IR_channel*/ + //0,/*IR_position*/ + {0,0,0,0,1,1,2,2,2,3,3,3,3,3,3,3},/*au16Strength[16]*/ + {0,0,0,0,0,0,0,0,0,0x23,0x80,0xD0,0xF0,0xF0,0xF0,0xF0},/*au16BlendRatio[16]*/ +}; + + +static ISP_LSC_CABLI_TABLE_S g_stCmosLscTable[HI_ISP_LSC_LIGHT_NUM] = +{ + //-------------------------------------------- + // single light default + //-------------------------------------------- + //3000K + { + { + 12966290, 12850780, 12557130, 12237540, 11823770, 11369460, 10990480, 10685190, 10548450, 10835680, 11280550, 11860230, 12462200, 13024830, 13465580, 13903610, 14056030, + 12937220, 12807990, 12516270, 12198730, 11787540, 11347100, 10959160, 10655590, 10529200, 10825520, 11247560, 11823770, 12408600, 12980880, 13434230, 13853540, 14038930, + 12836480, 12723260, 12421960, 12109130, 11715740, 11291580, 10917690, 10596880, 10500450, 10754890, 11171350, 11715740, 12315900, 12879460, 13325640, 13754470, 13937200, + 12695270, 12584510, 12315900, 11995840, 11609660, 11214770, 10845870, 10510020, 10434000, 10675300, 11074860, 11574720, 12185850, 12737310, 13203660, 13608490, 13770880, + 12543480, 12408600, 12147370, 11823770, 11482590, 11117530, 10754890, 10424570, 10368370, 10567770, 10959160, 11437070, 12033370, 12543480, 13010150, 13387470, 13544600, + 12355460, 12224580, 11946170, 11668350, 11358270, 11000950, 10626150, 10359070, 10303570, 10452900, 10866290, 11313730, 11860230, 12342250, 12765490, 13158500, 13325640, + 12109130, 11995840, 11751530, 11459780, 11193020, 10856070, 10490910, 10285200, 10203360, 10387040, 10734880, 11160540, 11668350, 12211640, 12612020, 12951740, 13098750, + 11872430, 11751530, 11540000, 11302640, 11053640, 10705010, 10359070, 10203360, 10105080, 10285200, 10596880, 11043060, 11540000, 11995840, 12395270, 12695270, 12836480, + 11692000, 11597990, 11403160, 11193020, 10928030, 10626150, 10312780, 10122810, 10000000, 10221430, 10510020, 10980020, 11414440, 11835900, 12211640, 12489180, 12639650, + 11739570, 11644800, 11448410, 11225680, 10969580, 10645760, 10331240, 10140600, 10043520, 10266900, 10500450, 10969580, 11414440, 11811670, 12173000, 12475680, 12639650, + 11896910, 11799590, 11586350, 11335950, 11085490, 10774980, 10415160, 10212390, 10131690, 10285200, 10548450, 11117530, 11586350, 11995840, 12368700, 12681320, 12822220, + 12083770, 11970950, 11715740, 11471170, 11193020, 10897070, 10510020, 10294380, 10194350, 10340500, 10795140, 11369460, 11751530, 12198730, 12543480, 12879460, 13010150, + 12276600, 12134590, 11872430, 11586350, 11324830, 11000950, 10626150, 10349780, 10266900, 10415160, 11064240, 11516970, 11958550, 12421960, 12779620, 13083900, 13218790, + 12408600, 12263550, 12020830, 11703850, 11403160, 11064240, 10695090, 10415160, 10312780, 10490910, 11182170, 11609660, 12109130, 12570810, 12951740, 13233950, 13371960, + 12543480, 12395270, 12134590, 11811670, 11459780, 11139000, 10754890, 10471870, 10340500, 10596880, 11269530, 11692000, 12237540, 12695270, 13083900, 13371960, 13481310, + 12612020, 12489180, 12185850, 11884650, 11494020, 11193020, 10805240, 10510020, 10349780, 10655590, 11324830, 11775510, 12315900, 12779620, 13158500, 13481310, 13576470, + 12625820, 12502710, 12211640, 11909180, 11494020, 11203880, 10835680, 10510020, 10340500, 10675300, 11335950, 11811670, 12342250, 12836480, 13203660, 13528720, 13624560, + }, + { + 12937060, 12821780, 12560620, 12216980, 11804920, 11369620, 10974580, 10658440, 10502840, 10702480, 11087330, 11624780, 12228520, 12783810, 13254860, 13660340, 13820700, + 12924150, 12771200, 12524180, 12182500, 11772730, 11339760, 10956010, 10632180, 10485830, 10693640, 11049490, 11572830, 12182500, 12758620, 13200820, 13602940, 13761960, + 12834490, 12683640, 12416110, 12114130, 11698280, 11280490, 10909860, 10588720, 10435130, 10623460, 10993210, 11470330, 12080220, 12646480, 13080810, 13475550, 13645940, + 12671230, 12560620, 12298200, 11979650, 11614350, 11202420, 10845900, 10519900, 10401610, 10562810, 10900670, 11349690, 11946490, 12475910, 12937060, 13323040, 13489580, + 12512080, 12368670, 12125470, 11826480, 11470330, 11125430, 10737980, 10435130, 10351720, 10460420, 10782680, 11202420, 11783440, 12298200, 12733530, 13094030, 13241310, + 12286530, 12159620, 11935480, 11635220, 11349690, 11002550, 10614750, 10360000, 10294120, 10368290, 10693640, 11087330, 11572830, 12080220, 12487950, 12847220, 13002010, + 12046510, 11935480, 11698280, 11439930, 11192740, 10845900, 10485830, 10285940, 10212930, 10285940, 10554200, 10928270, 11399650, 11924490, 12309890, 12634150, 12771200, + 11794170, 11687730, 11470330, 11270670, 11002550, 10676010, 10351720, 10196850, 10093530, 10204890, 10418340, 10818710, 11260870, 11730070, 12080220, 12380500, 12548450, + 11624780, 11521350, 11339760, 11154180, 10891510, 10580070, 10285940, 10117190, 10000000, 10133020, 10343450, 10746890, 11154180, 11541890, 11924490, 12193970, 12309890, + 11645680, 11562500, 11389620, 11173430, 10946750, 10606060, 10326950, 10133020, 10038760, 10164840, 10360000, 10746890, 11135000, 11531610, 11869840, 12182500, 12321600, + 11826480, 11708860, 11500890, 11270670, 11021280, 10737980, 10384920, 10212930, 10117190, 10204890, 10401610, 10882350, 11300170, 11719460, 12080220, 12356870, 12463910, + 12001850, 11880730, 11666670, 11429830, 11144580, 10845900, 10494330, 10277780, 10164840, 10253370, 10623460, 11068380, 11460180, 11880730, 12240080, 12548450, 12671230, + 12182500, 12057730, 11826480, 11562500, 11270670, 10956010, 10597380, 10318730, 10229070, 10285940, 10845900, 11231570, 11645680, 12102800, 12463910, 12758620, 12872760, + 12321600, 12205470, 11979650, 11645680, 11359650, 11021280, 10676010, 10393260, 10277780, 10384920, 10956010, 11319930, 11815690, 12274880, 12646480, 12924150, 13041290, + 12475910, 12345090, 12080220, 11762030, 11429830, 11096830, 10737980, 10451980, 10302310, 10477350, 11030660, 11409690, 11913520, 12404210, 12796440, 13080810, 13200820, + 12548450, 12416110, 12136830, 11837290, 11460180, 11154180, 10773710, 10485830, 10318730, 10537020, 11087330, 11470330, 12012990, 12487950, 12885570, 13187370, 13282050, + 12572820, 12439960, 12159620, 11869840, 11460180, 11163790, 10791670, 10502840, 10318730, 10562810, 11106350, 11511110, 12057730, 12536300, 12924150, 13214290, 13295690, + }, + { + 12811880, 12673850, 12370940, 12048420, 11626240, 11174440, 10792330, 10460790, 10343720, 10632700, 11050380, 11615800, 12242190, 12824580, 13326470, 13707630, 13913980, + 12773940, 12624390, 12347330, 12014860, 11584600, 11145560, 10765390, 10443910, 10327220, 10597870, 11022150, 11584600, 12196040, 12786560, 13271790, 13664200, 13869240, + 12673850, 12538760, 12265400, 11937270, 11522710, 11097770, 10720800, 10410300, 10294350, 10537460, 10947550, 11502220, 12104770, 12698720, 13177190, 13549740, 13736730, + 12538760, 12406520, 12150240, 11828150, 11451330, 11050380, 10667770, 10352000, 10261700, 10486220, 10883100, 11390840, 12003710, 12563110, 13044350, 13395450, 13535570, + 12394640, 12277040, 12003710, 11699820, 11350880, 10975400, 10597870, 10286170, 10229250, 10410300, 10774350, 11271780, 11849820, 12394640, 12824580, 13204080, 13381590, + 12219070, 12093460, 11849820, 11553570, 11242400, 10873950, 10511780, 10237340, 10205050, 10327220, 10711920, 11164800, 11689250, 12196040, 12612090, 12991970, 13150410, + 12003710, 11893380, 11647160, 11380830, 11116840, 10765390, 10410300, 10188980, 10141070, 10278000, 10589200, 11040960, 11543260, 12082170, 12478300, 12824580, 12940000, + 11774340, 11657660, 11471630, 11261970, 10984720, 10623970, 10302550, 10149020, 10070040, 10213100, 10503250, 10966100, 11441200, 11937270, 12277040, 12599810, 12761340, + 11647160, 11553570, 11370830, 11174440, 10910620, 10589200, 10302550, 10117280, 10000000, 10188980, 10477730, 10938290, 11370830, 11774340, 12150240, 12454280, 12575320, + 11742290, 11647160, 11451330, 11222900, 10994050, 10658980, 10360290, 10164960, 10085740, 10269840, 10503250, 10938290, 11380830, 11817350, 12173090, 12478300, 12624390, + 11904320, 11806570, 11605380, 11370830, 11116840, 10792330, 10435480, 10261700, 10180960, 10318980, 10571900, 11107300, 11584600, 12014860, 12382780, 12673850, 12799210, + 12082170, 11959330, 11752950, 11512460, 11242400, 10929050, 10554650, 10335460, 10253570, 10385230, 10819400, 11331000, 11785060, 12219070, 12587550, 12862820, 12965930, + 12277040, 12173090, 11915290, 11657660, 11360840, 11031540, 10667770, 10401930, 10318980, 10435480, 11069290, 11502220, 11959330, 12430360, 12799210, 13097170, 13231080, + 12430360, 12323810, 12070900, 11763640, 11471630, 11135970, 10747510, 10477730, 10376900, 10537460, 11193770, 11605380, 12116100, 12587550, 12991970, 13299080, 13437180, + 12563110, 12466280, 12173090, 11882460, 11522710, 11193770, 10819400, 10537460, 10401930, 10650210, 11291450, 11721010, 12265400, 12748770, 13137060, 13423240, 13549740, + 12673850, 12550920, 12242190, 11948290, 11574240, 11242400, 10864820, 10580540, 10435480, 10711920, 11350880, 11763640, 12347330, 12837300, 13217570, 13535570, 13635410, + 12723700, 12575320, 12277040, 11970400, 11584600, 11252170, 10873950, 10606560, 10435480, 10738590, 11380830, 11795810, 12394640, 12888450, 13244630, 13606730, 13707630, + }, + { + 11625240, 11558940, 11407130, 11155960, 10915620, 10647990, 10428820, 10270270, 10133330, 10252950, 10393160, 10742050, 11094890, 11450090, 11737450, 11944990, 12015810, + 11603050, 11537000, 11364490, 11135530, 10896060, 10647990, 10428820, 10235690, 10133330, 10218490, 10375430, 10704230, 11054550, 11428570, 11692310, 11921570, 11992110, + 11558940, 11471700, 11280150, 11074680, 10837790, 10610820, 10410960, 10218490, 10099670, 10184250, 10340140, 10610820, 11014490, 11343280, 11625240, 11875000, 11944990, + 11450090, 11385770, 11217710, 11014490, 10761060, 10555560, 10357750, 10184250, 10082920, 10133330, 10305090, 10555560, 10935250, 11238450, 11515150, 11782950, 11851850, + 11385770, 11301120, 11135530, 10915620, 10723100, 10537260, 10287650, 10150250, 10082920, 10099670, 10235690, 10500860, 10818510, 11115170, 11407130, 11669870, 11760150, + 11259260, 11176470, 11034480, 10837790, 10685410, 10482760, 10270270, 10150250, 10066230, 10082920, 10235690, 10428820, 10723100, 11014490, 11322160, 11558940, 11625240, + 11155960, 11074680, 10915620, 10742050, 10610820, 10410960, 10218490, 10116470, 10066230, 10049590, 10167220, 10357750, 10629370, 10954950, 11259260, 11450090, 11515150, + 11014490, 10935250, 10799290, 10704230, 10519030, 10340140, 10184250, 10116470, 10033000, 10033000, 10116470, 10305090, 10537260, 10857140, 11115170, 11322160, 11364490, + 10935250, 10876560, 10742050, 10647990, 10500860, 10357750, 10218490, 10099670, 10000000, 10049590, 10099670, 10287650, 10519030, 10761060, 10974730, 11155960, 11217710, + 10994580, 10915620, 10799290, 10685410, 10573910, 10410960, 10235690, 10116470, 10066230, 10082920, 10116470, 10322580, 10537260, 10761060, 10954950, 11176470, 11238450, + 11115170, 11034480, 10896060, 10799290, 10666670, 10500860, 10287650, 10235690, 10133330, 10116470, 10133330, 10393160, 10592330, 10857140, 11115170, 11301120, 11385770, + 11238450, 11155960, 11014490, 10876560, 10742050, 10592330, 10357750, 10252950, 10167220, 10150250, 10270270, 10482760, 10666670, 10974730, 11197050, 11407130, 11471700, + 11343280, 11280150, 11115170, 10994580, 10818510, 10629370, 10446740, 10270270, 10184250, 10167220, 10393160, 10555560, 10780140, 11115170, 11343280, 11537000, 11603050, + 11471700, 11364490, 11217710, 11034480, 10876560, 10685410, 10482760, 10322580, 10218490, 10218490, 10464720, 10610820, 10915620, 11176470, 11471700, 11647510, 11692310, + 11580950, 11471700, 11280150, 11115170, 10896060, 10723100, 10519030, 10340140, 10235690, 10270270, 10500860, 10647990, 10974730, 11259260, 11558940, 11760150, 11805830, + 11625240, 11515150, 11343280, 11155960, 10915620, 10742050, 10555560, 10375430, 10252950, 10305090, 10537260, 10666670, 11034480, 11343280, 11603050, 11828790, 11875000, + 11625240, 11537000, 11364490, 11176470, 10954950, 10761060, 10555560, 10393160, 10270270, 10305090, 10555560, 10666670, 11054550, 11364490, 11647510, 11851850, 11921570, + }, + }, + + //D50 + { + { + 13333330, 13201320, 12847970, 12435230, 11940300, 11472280, 11070110, 10801080, 10666670, 10899180, 11396010, 11952190, 12526100, 13071900, 13528750, 13904980, 14117650, + 13274340, 13129100, 12806830, 12396690, 11916580, 11450380, 11049720, 10762330, 10638300, 10879420, 11363640, 11904760, 12486990, 13015180, 13468010, 13856810, 14051520, + 13157890, 13015180, 12711860, 12307690, 11846000, 11385200, 10999080, 10714290, 10582010, 10830320, 11299430, 11811020, 12383900, 12889370, 13348160, 13745700, 13921110, + 13015180, 12861740, 12565440, 12170390, 11741680, 11299430, 10899180, 10628880, 10535560, 10743060, 11204480, 11673150, 12244900, 12752390, 13186810, 13605440, 13777270, + 12793180, 12644890, 12332990, 11988010, 11583010, 11204480, 10781670, 10517090, 10443860, 10619470, 11059910, 11516310, 12060300, 12539190, 12972970, 13348160, 13528750, + 12565440, 12422360, 12108980, 11753180, 11406840, 11029410, 10628880, 10407630, 10344830, 10517090, 10919020, 11374410, 11834320, 12295080, 12711860, 13071900, 13230430, + 12269940, 12121210, 11846000, 11538460, 11214950, 10840110, 10462080, 10309280, 10221460, 10380620, 10752690, 11194030, 11639180, 12121210, 12513030, 12847970, 12987010, + 11964110, 11822660, 11560690, 11320750, 10999080, 10628880, 10309280, 10178120, 10075570, 10256410, 10582010, 11029410, 11461320, 11916580, 12269940, 12565440, 12738850, + 11764710, 11650490, 11439470, 11194030, 10869570, 10535560, 10247650, 10084030, 10000000, 10143700, 10434780, 10948900, 11352890, 11730200, 12096770, 12371130, 12500000, + 11834320, 11730200, 11483250, 11214950, 10938920, 10591350, 10282780, 10109520, 10000000, 10135140, 10425720, 10899180, 11352890, 11741680, 12096770, 12409510, 12578620, + 11988010, 11869440, 11627910, 11342150, 11049720, 10704730, 10353750, 10195410, 10058680, 10178120, 10471200, 11070110, 11527380, 11940300, 12332990, 12618300, 12765960, + 12170390, 12048190, 11753180, 11483250, 11173180, 10830320, 10452960, 10282780, 10092510, 10195410, 10704730, 11288810, 11695910, 12145750, 12500000, 12820510, 12958960, + 12332990, 12207530, 11928430, 11594200, 11278200, 10919020, 10526320, 10291600, 10126580, 10230180, 10948900, 11428570, 11869440, 12320330, 12711860, 13015180, 13143480, + 12474010, 12345680, 12060300, 11695910, 11363640, 10989010, 10619470, 10371650, 10195410, 10318140, 11059910, 11516310, 12024050, 12500000, 12875540, 13186810, 13333330, + 12644890, 12486990, 12170390, 11822660, 11428570, 11049720, 10685660, 10407630, 10221460, 10425720, 11142060, 11594200, 12133470, 12631580, 13015180, 13333330, 13468010, + 12738850, 12578620, 12244900, 11881190, 11483250, 11090570, 10723860, 10452960, 10230180, 10498690, 11183600, 11627910, 12207530, 12711860, 13100440, 13422820, 13544020, + 12765960, 12618300, 12282500, 11892960, 11505270, 11100830, 10743060, 10480350, 10221460, 10507880, 11204480, 11650490, 12244900, 12738850, 13143480, 13468010, 13590030, + }, + { + 13258660, 13111780, 12827590, 12411820, 11912170, 11441120, 11052630, 10831950, 10628570, 10796020, 11175970, 11677130, 12236840, 12752200, 13204870, 13619250, 13821660, + 13218270, 13059180, 12777230, 12376430, 11890410, 11421050, 11024550, 10787080, 10602610, 10778150, 11147260, 11635390, 12191010, 12714840, 13151520, 13548390, 13763210, + 13125000, 12968130, 12665370, 12259890, 11814880, 11351350, 10978080, 10716050, 10559610, 10724880, 11099740, 11532330, 12100370, 12604070, 13046090, 13422680, 13633510, + 12955220, 12814960, 12507210, 12111630, 11698110, 11272730, 10895400, 10628570, 10516960, 10654660, 11015230, 11421050, 11977920, 12447420, 12891090, 13245170, 13422680, + 12727270, 12591880, 12306240, 11955920, 11552800, 11166380, 10787080, 10516960, 10432690, 10533980, 10895400, 11272730, 11772150, 12248350, 12640780, 13020000, 13164810, + 12483220, 12341230, 12055560, 11740310, 11381120, 11005920, 10619900, 10432690, 10341540, 10424340, 10760330, 11128210, 11552800, 12000000, 12376430, 12727270, 12878340, + 12179610, 12044400, 11782810, 11491620, 11185570, 10804980, 10457830, 10333330, 10219780, 10308790, 10593980, 10950380, 11341460, 11804170, 12179610, 12507210, 12616280, + 11836360, 11729730, 11491620, 11262980, 10950380, 10602610, 10300630, 10203760, 10077400, 10179830, 10432690, 10796020, 11175970, 11604280, 11966910, 12225350, 12364670, + 11656220, 11552800, 11341460, 11128210, 10840970, 10508470, 10251970, 10108700, 10000000, 10061820, 10284360, 10716050, 11080850, 11441120, 11782810, 12044400, 12168220, + 11729730, 11625000, 11421050, 11156810, 10877190, 10568180, 10276240, 10124420, 10000000, 10077400, 10292490, 10707240, 11080850, 11471370, 11782810, 12077920, 12202440, + 11890410, 11782810, 11542550, 11282500, 11005920, 10680890, 10349760, 10219780, 10069610, 10100850, 10341540, 10831950, 11253240, 11645800, 12000000, 12283020, 12423660, + 12089140, 11934010, 11698110, 11421050, 11118700, 10787080, 10432690, 10276240, 10108700, 10116550, 10533980, 11015230, 11391080, 11836360, 12168220, 12459330, 12579710, + 12236840, 12122910, 11836360, 11522120, 11224140, 10868110, 10516960, 10284360, 10132300, 10163930, 10733720, 11137730, 11573330, 12000000, 12376430, 12677700, 12802360, + 12411820, 12271440, 11977920, 11645800, 11311900, 10950380, 10585370, 10366240, 10171870, 10219780, 10840970, 11224140, 11719170, 12168220, 12555450, 12865610, 13020000, + 12519230, 12388200, 12089140, 11761520, 11371180, 11015230, 10663390, 10432690, 10211760, 10325140, 10895400, 11302080, 11825610, 12306240, 12690060, 13006990, 13151520, + 12628520, 12471260, 12156860, 11825610, 11411040, 11062020, 10698440, 10466240, 10219780, 10366240, 10950380, 11361260, 11901280, 12388200, 12777230, 13098590, 13245170, + 12653060, 12507210, 12168220, 11857920, 11421050, 11080850, 10724880, 10491540, 10219780, 10391060, 10968830, 11381120, 11934010, 12435530, 12814960, 13138240, 13272170, + }, + { + 13091640, 12961120, 12633630, 12218040, 11732850, 11235950, 10851420, 10577700, 10458570, 10690790, 11120620, 11690650, 12298960, 12833170, 13306040, 13669820, 13874070, + 13039120, 12896830, 12584700, 12172280, 11701170, 11216570, 10833330, 10560520, 10441770, 10673230, 11101620, 11648750, 12252590, 12782690, 13238290, 13598330, 13785790, + 12922470, 12782690, 12487990, 12093020, 11627910, 11158800, 10788380, 10509300, 10400000, 10612240, 11054420, 11576140, 12149530, 12670570, 13118060, 13499480, 13684210, + 12770140, 12645910, 12345680, 11970530, 11535050, 11111110, 10734930, 10466990, 10366830, 10560520, 10989010, 11453740, 12025900, 12536160, 12961120, 13347020, 13513510, + 12621360, 12464050, 12160900, 11828940, 11403510, 11026290, 10620910, 10375100, 10292950, 10458570, 10878660, 11333910, 11861310, 12333970, 12757610, 13118060, 13292430, + 12392750, 12241050, 11959520, 11607140, 11265160, 10906040, 10500810, 10309280, 10244290, 10375100, 10797340, 11216570, 11669660, 12126870, 12524090, 12858560, 13013010, + 12104280, 11981570, 11711710, 11433600, 11101620, 10717230, 10375100, 10236220, 10156250, 10292950, 10638300, 11073250, 11494250, 11981570, 12357410, 12695310, 12820510, + 11818180, 11722270, 11473960, 11245680, 10933560, 10569110, 10244290, 10148320, 10054140, 10188090, 10500810, 10933560, 11363640, 11807450, 12160900, 12464050, 12621360, + 11669660, 11576140, 11393510, 11149230, 10851420, 10526320, 10236220, 10093170, 10000000, 10116730, 10408330, 10887770, 11294530, 11669660, 12025900, 12310610, 12428300, + 11807450, 11690650, 11463840, 11216570, 10942760, 10594950, 10301110, 10140410, 10054140, 10156250, 10450160, 10906040, 11333910, 11743450, 12081780, 12380950, 12500000, + 11959520, 11872150, 11638320, 11343800, 11063830, 10743800, 10391690, 10260460, 10116730, 10212100, 10509300, 11082690, 11524820, 11926610, 12310610, 12609120, 12720160, + 12172280, 12025900, 11775360, 11494250, 11187610, 10842370, 10492330, 10342080, 10164190, 10252370, 10726070, 11274940, 11680140, 12126870, 12487990, 12795280, 12909630, + 12369170, 12229540, 11937560, 11638320, 11304350, 10933560, 10594950, 10358570, 10228170, 10276680, 10961210, 11413520, 11883000, 12333970, 12720160, 13000000, 13118060, + 12500000, 12357410, 12081780, 11754070, 11393510, 11016950, 10673230, 10433390, 10276680, 10383390, 11082690, 11504420, 12037040, 12500000, 12896830, 13238290, 13360740, + 12645910, 12500000, 12206570, 11872150, 11453740, 11082690, 10743800, 10492330, 10301110, 10483870, 11158800, 11576140, 12149530, 12658230, 13026050, 13360740, 13499480, + 12757610, 12596900, 12275730, 11937560, 11494250, 11130140, 10779440, 10509300, 10309280, 10551950, 11187610, 11648750, 12218040, 12732620, 13091640, 13443640, 13598330, + 12795280, 12633630, 12310610, 11959520, 11504420, 11158800, 10797340, 10526320, 10301110, 10586320, 11197240, 11690650, 12241050, 12770140, 13144590, 13485480, 13612570, + }, + { + 11769380, 11699600, 11517510, 11276190, 10983300, 10705240, 10496450, 10367780, 10224520, 10295650, 10459360, 10744100, 11106940, 11384620, 11630650, 11911470, 11935480, + 11769380, 11676530, 11495150, 11233400, 10942700, 10685920, 10477880, 10349650, 10224520, 10277780, 10440920, 10705240, 11065420, 11341000, 11607840, 11863730, 11935480, + 11699600, 11607840, 11406550, 11169810, 10902390, 10647480, 10440920, 10313590, 10171820, 10242210, 10385970, 10647480, 11003720, 11254750, 11539960, 11769380, 11863730, + 11607840, 11495150, 11319310, 11065420, 10842490, 10609320, 10385970, 10277780, 10136990, 10206900, 10349650, 10590340, 10902390, 11169810, 11450680, 11653540, 11746030, + 11495150, 11384620, 11212120, 10983300, 10763640, 10552590, 10349650, 10206900, 10154370, 10171820, 10313590, 10515100, 10783240, 11065420, 11341000, 11562500, 11630650, + 11384620, 11276190, 11086140, 10862390, 10705240, 10477880, 10295650, 10206900, 10119660, 10136990, 10277780, 10440920, 10666670, 10942700, 11212120, 11428570, 11495150, + 11169810, 11106940, 10942700, 10783240, 10609320, 10404220, 10224520, 10171820, 10119660, 10085180, 10206900, 10367780, 10571430, 10862390, 11127820, 11319310, 11384620, + 11044780, 10962960, 10802920, 10705240, 10515100, 10313590, 10171820, 10136990, 10033900, 10050930, 10154370, 10295650, 10515100, 10763640, 10983300, 11148780, 11233400, + 10962960, 10882350, 10763640, 10628370, 10477880, 10313590, 10189330, 10102390, 10033900, 10000000, 10068030, 10277780, 10459360, 10666670, 10882350, 11044780, 11086140, + 11044780, 10942700, 10842490, 10685920, 10552590, 10385970, 10242210, 10136990, 10068030, 10050930, 10085180, 10295650, 10496450, 10666670, 10882350, 11065420, 11127820, + 11127820, 11065420, 10922510, 10783240, 10628370, 10459360, 10259970, 10224520, 10102390, 10068030, 10119660, 10367780, 10533810, 10783240, 11044780, 11233400, 11297710, + 11276190, 11190930, 11003720, 10862390, 10724640, 10515100, 10331590, 10259970, 10119660, 10068030, 10224520, 10440920, 10590340, 10862390, 11127820, 11319310, 11362760, + 11406550, 11319310, 11106940, 10962960, 10783240, 10571430, 10385970, 10277780, 10154370, 10085180, 10331590, 10477880, 10724640, 11003720, 11276190, 11450680, 11495150, + 11539960, 11428570, 11212120, 11024210, 10822670, 10609320, 10440920, 10313590, 10171820, 10119660, 10367780, 10496450, 10802920, 11127820, 11362760, 11562500, 11630650, + 11607840, 11517510, 11297710, 11106940, 10862390, 10647480, 10459360, 10349650, 10189330, 10154370, 10404220, 10552590, 10882350, 11190930, 11428570, 11653540, 11722770, + 11653540, 11539960, 11362760, 11148780, 10902390, 10666670, 10515100, 10385970, 10206900, 10189330, 10422530, 10571430, 10942700, 11233400, 11517510, 11699600, 11769380, + 11676530, 11562500, 11384620, 11169810, 10922510, 10685920, 10515100, 10385970, 10206900, 10206900, 10422530, 10571430, 10962960, 11254750, 11562500, 11722770, 11792830, + }, + }, + + //D65 + { + { + 12674420, 12546760, 12299010, 11961590, 11564990, 11165170, 10859280, 10595380, 10493380, 10647130, 10900000, 11324680, 11752020, 12230010, 12619390, 12937690, 13112780, + 12619390, 12528740, 12264420, 11928860, 11534390, 11165170, 10832300, 10582520, 10468190, 10608270, 10872820, 11266150, 11720430, 12178770, 12582970, 12880350, 13034380, + 12546760, 12421650, 12161790, 11847830, 11473680, 11122450, 10805450, 10531400, 10443110, 10569700, 10818860, 11179490, 11642190, 12060860, 12474960, 12785920, 12937690, + 12439370, 12281690, 12044200, 11736200, 11383810, 11051960, 10765430, 10480770, 10380950, 10493380, 10752160, 11065990, 11503960, 11928860, 12316380, 12674420, 12804700, + 12264420, 12144850, 11896320, 11595750, 11309990, 10996220, 10660150, 10393330, 10344010, 10418160, 10634150, 10954770, 11368970, 11752020, 12161790, 12474960, 12601160, + 12094310, 11961590, 11720430, 11443570, 11179490, 10872820, 10544140, 10319530, 10246770, 10331750, 10582520, 10845770, 11193840, 11580350, 11928860, 12264420, 12403980, + 11880110, 11752020, 11519150, 11280730, 11051960, 10752160, 10418160, 10258820, 10175030, 10258820, 10443110, 10712530, 11037970, 11473680, 11799730, 12094310, 12230010, + 11626670, 11534390, 11324680, 11122450, 10900000, 10569700, 10319530, 10186920, 10080930, 10175030, 10344010, 10621190, 10954770, 11324680, 11611190, 11880110, 12011020, + 11488800, 11383810, 11208230, 11037970, 10765430, 10493380, 10246770, 10092590, 10022990, 10069280, 10246770, 10544140, 10845770, 11150900, 11443570, 11704700, 11799730, + 11564990, 11428570, 11251610, 11024020, 10792080, 10518700, 10270910, 10080930, 10000000, 10069280, 10222740, 10518700, 10832300, 11122450, 11413610, 11689010, 11815720, + 11626670, 11534390, 11324680, 11108280, 10859280, 10595380, 10307330, 10127760, 10022990, 10092590, 10222740, 10634150, 10941030, 11280730, 11595750, 11863950, 11961590, + 11783780, 11673360, 11443570, 11208230, 10968550, 10686270, 10356300, 10175030, 10057670, 10092590, 10405730, 10792080, 11094150, 11428570, 11720430, 11994500, 12111110, + 11928860, 11799730, 11534390, 11295340, 11051960, 10738920, 10418160, 10210770, 10080930, 10139530, 10621190, 10913640, 11222650, 11595750, 11896320, 12161790, 12299010, + 12060860, 11928860, 11673360, 11383810, 11094150, 10792080, 10493380, 10246770, 10104290, 10186920, 10712530, 10968550, 11354170, 11720430, 12060860, 12316380, 12457140, + 12161790, 12044200, 11783780, 11473680, 11150900, 10832300, 10531400, 10283020, 10127760, 10283020, 10778740, 11051960, 11458610, 11831750, 12178770, 12457140, 12546760, + 12247190, 12111110, 11831750, 11549670, 11193840, 10872820, 10569700, 10319530, 10139530, 10331750, 10818860, 11108280, 11503960, 11912570, 12247190, 12528740, 12656020, + 12299010, 12161790, 11847830, 11549670, 11222650, 10900000, 10569700, 10319530, 10139530, 10331750, 10845770, 11122450, 11534390, 11961590, 12281690, 12564840, 12692870, + }, + { + 13184580, 13013010, 12695310, 12322270, 11839710, 11383540, 11045030, 10699590, 10534850, 10638300, 10887770, 11324040, 11839710, 12380950, 12845850, 13251780, 13457560, + 13144590, 12974050, 12658230, 12287330, 11828940, 11383540, 11016950, 10682000, 10509300, 10612240, 10860480, 11294530, 11818180, 12322270, 12782690, 13184580, 13388260, + 13013010, 12858560, 12572530, 12183690, 11775360, 11333910, 10951980, 10629600, 10450160, 10551950, 10806320, 11197240, 11722270, 12206570, 12645910, 13078470, 13265310, + 12871290, 12720160, 12416430, 12070570, 11648750, 11255410, 10887770, 10543390, 10416670, 10492330, 10743800, 11082690, 11576140, 12081780, 12500000, 12909630, 13065330, + 12658230, 12512030, 12252590, 11926610, 11535050, 11177990, 10788380, 10466990, 10366830, 10400000, 10620910, 10933560, 11433600, 11883000, 12287330, 12658230, 12820510, + 12428300, 12310610, 12025900, 11722270, 11403510, 11045030, 10647010, 10375100, 10301110, 10309280, 10517800, 10824310, 11226250, 11638320, 12037040, 12404580, 12560390, + 12172280, 12048190, 11796730, 11524820, 11226250, 10887770, 10517800, 10309280, 10228170, 10220130, 10400000, 10690790, 11054420, 11504420, 11850500, 12195120, 12333970, + 11883000, 11764710, 11555560, 11324040, 11035650, 10690790, 10366830, 10228170, 10077520, 10124610, 10268560, 10577700, 10906040, 11314190, 11648750, 11937560, 12081780, + 11701170, 11617520, 11423550, 11206900, 10924370, 10603590, 10317460, 10116730, 10007700, 10038610, 10180110, 10492330, 10806320, 11149230, 11473960, 11754070, 11883000, + 11754070, 11638320, 11453740, 11216570, 10942760, 10612240, 10317460, 10093170, 10000000, 10046370, 10156250, 10458570, 10779440, 11139670, 11463840, 11743450, 11893870, + 11893870, 11786040, 11555560, 11304350, 11007620, 10699590, 10350320, 10172140, 10046370, 10046370, 10156250, 10560520, 10915200, 11304350, 11648750, 11948530, 12081780, + 12048190, 11937560, 11701170, 11433600, 11120620, 10788380, 10433390, 10228170, 10054140, 10046370, 10350320, 10717230, 11045030, 11453740, 11786040, 12081780, 12206570, + 12218040, 12093020, 11807450, 11524820, 11226250, 10869570, 10509300, 10252370, 10101010, 10093170, 10543390, 10851420, 11216570, 11627910, 12003690, 12287330, 12440190, + 12392750, 12229540, 11970530, 11627910, 11304350, 10933560, 10577700, 10284810, 10132500, 10156250, 10647010, 10924370, 11353710, 11807450, 12160900, 12476010, 12609120, + 12512030, 12369170, 12070570, 11743450, 11373580, 10989010, 10647010, 10358570, 10156250, 10252370, 10734930, 11007620, 11484100, 11926610, 12310610, 12621360, 12757610, + 12596900, 12452110, 12160900, 11818180, 11403510, 11026290, 10673230, 10400000, 10172140, 10292950, 10761590, 11045030, 11555560, 12014790, 12392750, 12695310, 12820510, + 12633630, 12487990, 12206570, 11839710, 11423550, 11045030, 10690790, 10425020, 10164190, 10309280, 10779440, 11054420, 11576140, 12059370, 12440190, 12732620, 12845850, + }, + { + 12908370, 12755910, 12449570, 12078290, 11623320, 11153180, 10773070, 10485440, 10326690, 10493930, 10791010, 11230500, 11792540, 12331110, 12793680, 13184130, 13388430, + 12857140, 12718350, 12401910, 12033430, 11581770, 11143590, 10755190, 10468500, 10310260, 10476960, 10773070, 11201380, 11749770, 12284360, 12743360, 13144020, 13347070, + 12743360, 12619280, 12307690, 11944700, 11520000, 11095890, 10719600, 10418010, 10277560, 10426390, 10719600, 11134020, 11675680, 12180450, 12619280, 13051360, 13238000, + 12643900, 12497590, 12191910, 11835620, 11418500, 11048590, 10675450, 10384620, 10253160, 10368000, 10657890, 11039180, 11540520, 12044610, 12485550, 12869910, 13051360, + 12461540, 12319390, 12033430, 11696750, 11338580, 10973750, 10596890, 10293880, 10228890, 10302070, 10570960, 10927490, 11408450, 11879010, 12272730, 12656250, 12844400, + 12261120, 12123480, 11824820, 11540520, 11230500, 10872480, 10476960, 10253160, 10164710, 10212770, 10485440, 10809010, 11240240, 11675680, 12078290, 12413790, 12582520, + 12022260, 11900830, 11633750, 11368420, 11076920, 10746270, 10384620, 10204720, 10101330, 10156740, 10384620, 10701900, 11086400, 11530250, 11922720, 12249530, 12378220, + 11781820, 11665170, 11448760, 11220780, 10936710, 10596890, 10285710, 10132920, 10000000, 10077760, 10269410, 10614250, 10973750, 11388400, 11728510, 12033430, 12180450, + 11675680, 11571430, 11358460, 11134020, 10845190, 10545160, 10253160, 10077760, 10000000, 10054310, 10228890, 10562350, 10890760, 11259770, 11602510, 11900830, 12033430, + 11739130, 11633750, 11418500, 11191710, 10918280, 10588240, 10293880, 10101330, 10007720, 10093460, 10253160, 10579590, 10927490, 11289200, 11633750, 11933700, 12044610, + 11900830, 11781820, 11540520, 11299040, 11011040, 10693070, 10376300, 10180680, 10077760, 10125000, 10285710, 10701900, 11095890, 11479180, 11824820, 12123480, 12261120, + 12078290, 11944700, 11675680, 11428570, 11143590, 10818030, 10451610, 10261280, 10117100, 10172680, 10485440, 10899920, 11240240, 11654680, 12000000, 12296020, 12425700, + 12249530, 12112150, 11857270, 11540520, 11259770, 10899920, 10536580, 10293880, 10172680, 10204720, 10728480, 11039180, 11448760, 11857270, 12237960, 12545980, 12681020, + 12413790, 12272730, 12000000, 11665170, 11348510, 10973750, 10640390, 10351440, 10220820, 10293880, 10818030, 11143590, 11592130, 12033430, 12413790, 12718350, 12844400, + 12545980, 12413790, 12112150, 11771120, 11398420, 11029790, 10710740, 10418010, 10245060, 10409640, 10899920, 11220780, 11707320, 12169010, 12570320, 12895520, 13012050, + 12668620, 12509650, 12180450, 11857270, 11448760, 11086400, 10737370, 10451610, 10285710, 10460050, 10945950, 11289200, 11792540, 12249530, 12643900, 12972970, 13104150, + 12730850, 12545980, 12214890, 11868130, 11469030, 11114920, 10746270, 10476960, 10302070, 10468500, 10992370, 11308900, 11824820, 12296020, 12668620, 12999000, 13144020, + }, + { + 12126980, 11993720, 11753850, 11471470, 11137030, 10852270, 10581720, 10352300, 10200270, 10241290, 10380430, 10700280, 11104650, 11488720, 11826620, 12126980, 12243590, + 12069510, 11974920, 11735790, 11437130, 11120820, 10821530, 10567080, 10338290, 10186670, 10227580, 10366350, 10655510, 11056440, 11454270, 11790120, 12088610, 12204470, + 12012580, 11900310, 11664120, 11385990, 11072460, 10790960, 10523420, 10310390, 10159570, 10200270, 10324320, 10581720, 10992810, 11352150, 11699850, 11993720, 12107770, + 11900310, 11771960, 11558250, 11301770, 11008650, 10745430, 10480110, 10268820, 10159570, 10173100, 10282640, 10508940, 10898720, 11218800, 11575760, 11863350, 11974920, + 11771960, 11646340, 11437130, 11218800, 10929900, 10700280, 10422920, 10227580, 10146080, 10105820, 10213900, 10437160, 10760560, 11088530, 11437130, 11717790, 11826620, + 11628610, 11523380, 11318520, 11088530, 10883190, 10640670, 10380430, 10200270, 10132630, 10105820, 10213900, 10380430, 10640670, 10945560, 11285080, 11540790, 11664120, + 11454270, 11369050, 11169590, 10961260, 10790960, 10537930, 10310390, 10173100, 10105820, 10052630, 10119210, 10296500, 10537930, 10883190, 11202350, 11454270, 11540790, + 11285080, 11202350, 11024530, 10883190, 10670390, 10451440, 10255030, 10159570, 10039420, 10026250, 10079160, 10241290, 10480110, 10775740, 11040460, 11268440, 11352150, + 11202350, 11120820, 10977010, 10821530, 10625870, 10422920, 10255030, 10119210, 10039420, 10000000, 10039420, 10227580, 10451440, 10685320, 10945560, 11137030, 11235290, + 11301770, 11202350, 11040460, 10867710, 10700280, 10494510, 10310390, 10146080, 10065880, 10039420, 10065880, 10227580, 10422920, 10670390, 10945560, 11185940, 11251840, + 11402980, 11318520, 11153280, 10961260, 10790960, 10581720, 10324320, 10241290, 10119210, 10065880, 10065880, 10310390, 10508940, 10790960, 11088530, 11335310, 11402980, + 11575760, 11454270, 11235290, 11088530, 10883190, 10655510, 10408720, 10282640, 10132630, 10079160, 10200270, 10394560, 10581720, 10929900, 11218800, 11437130, 11558250, + 11699850, 11593320, 11385990, 11169590, 10977010, 10700280, 10480110, 10296500, 10173100, 10092470, 10324320, 10465750, 10715290, 11056440, 11369050, 11593320, 11699850, + 11808350, 11699850, 11506020, 11268440, 11024530, 10760560, 10523420, 10338290, 10213900, 10146080, 10394560, 10508940, 10836880, 11185940, 11488720, 11735790, 11844960, + 11937500, 11808350, 11575760, 11335310, 11072460, 10806220, 10581720, 10394560, 10213900, 10213900, 10451440, 10581720, 10929900, 11285080, 11610940, 11863350, 11974920, + 12012580, 11881800, 11646340, 11402980, 11088530, 10836880, 10611110, 10422920, 10227580, 10241290, 10465750, 10625870, 10992810, 11352150, 11681960, 11937500, 12050470, + 12031500, 11900310, 11664120, 11420030, 11104650, 10852270, 10640670, 10437160, 10227580, 10255030, 10465750, 10640670, 11024530, 11369050, 11699850, 11974920, 12088610, + }, + } +}; + + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + memcpy(&pstDef->stLsc.stLscParaTable[0], &g_stCmosLscTable[0], sizeof(ISP_LSC_CABLI_TABLE_S)*HI_ISP_LSC_LIGHT_NUM); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + + pstDef->stDrc.bEnable = HI_FALSE; + pstDef->stDrc.u8Asymmetry = 0x02; + pstDef->stDrc.u8SecondPole = 0xC0; + pstDef->stDrc.u8Stretch = 0x3C; + pstDef->stDrc.u8LocalMixingBrigtht = 0x2D; + pstDef->stDrc.u8LocalMixingDark = 0x2D; + pstDef->stDrc.u8LocalMixingThres = 0x02; + pstDef->stDrc.u16BrightGainLmt = 0x7F; + pstDef->stDrc.u16DarkGainLmtC = 0x7F; + pstDef->stDrc.u16DarkGainLmtY = 0x7F; + pstDef->stDrc.u8RangeVar = 0x00; + pstDef->stDrc.u8SpatialVar = 0x0A; + + memcpy(&pstDef->stDemosaic, &g_stIspDemosaicLin, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stGe, &g_stIspGeLin, sizeof(ISP_CMOS_GE_S)); + + pstDef->stNoiseTbl.stNrCaliPara.u8CalicoefRow = DMNR_CALIB_CARVE_NUM_9M034; + pstDef->stNoiseTbl.stNrCaliPara.pCalibcoef = (HI_FLOAT (*)[4])g_coef_calib_9m034; + //memcpy(&pstDef->stNoiseTbl.stNrCommPara, &g_stNrCommPara,sizeof(ISP_NR_COMM_PARA_S)); + memcpy(&pstDef->stNoiseTbl.stIsoParaTable[0], &g_stNrIsoParaTab[0],sizeof(ISP_NR_ISO_PARA_TABLE_S)*HI_ISP_NR_ISO_LEVEL_MAX); + + + memcpy(&pstDef->stRgbSharpen, &g_stIspRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stUvnr, &g_stIspUVNR, sizeof(ISP_CMOS_UVNR_S)); + memcpy(&pstDef->stDpc, &g_stCmosDpc, sizeof(ISP_CMOS_DPC_S)); + break; + + } + pstDef->stSensorMaxResolution.u32MaxWidth = 1280; + pstDef->stSensorMaxResolution.u32MaxHeight = 720; + + return 0; +} + +#endif + +HI_U32 cmos_get_isp_black_level(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel) +{ + HI_S32 i; + + if (HI_NULL == pstBlackLevel) + { + printf("null pointer when get isp black level value!\n"); + return -1; + } + + /* Don't need to update black level when iso change */ + pstBlackLevel->bUpdate = HI_FALSE; + + switch (genSensorMode) + { + default : + case WDR_MODE_NONE : + for (i=0; i<4; i++) + { + pstBlackLevel->au16BlackLevel[i] = 0xC8; + } + break; + + } + + return 0; +} + + +HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) +{ + HI_U32 u32FullLines_5Fps = FRAME_LINES_720P; + + if (SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + u32FullLines_5Fps = LINE_LENGTH_PCK_720P_30FPS * 30 / 5; + } + else if(SENSOR_960P_30FPS_MODE == gu8SensorImageMode) + { + u32FullLines_5Fps = LINE_LENGTH_PCK_960P_30FPS * 30 / 5; + } + else + { + return; + } + + u32FullLines_5Fps = (u32FullLines_5Fps > 0xFFFF) ? 0xFFFF : u32FullLines_5Fps; + + if (bEnable) /* setup for ISP pixel calibration mode */ + { + sensor_write_register(LINE_LEN_PCK, u32FullLines_5Fps); /* 5fps */ + sensor_write_register(EXPOSURE_TIME, 0x118); /* max exposure time */ + sensor_write_register(ANALOG_GAIN, 0x1300); /* AG, Context A */ + sensor_write_register(DIGITAL_GAIN, 0x0020); /* DG, Context A */ + } + else /* setup for ISP 'normal mode' */ + { + if(SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + sensor_write_register(LINE_LEN_PCK, LINE_LENGTH_PCK_720P_30FPS); + } + else if(SENSOR_960P_30FPS_MODE == gu8SensorImageMode) + { + sensor_write_register(LINE_LEN_PCK, LINE_LENGTH_PCK_960P_30FPS); + } + else + { + } + bInit = HI_FALSE; + } + + return; +} + + + + + +HI_VOID cmos_set_wdr_mode(HI_U8 u8Mode) +{ + bInit = HI_FALSE; + + switch(u8Mode) + { + case WDR_MODE_NONE: + genSensorMode = WDR_MODE_NONE; + + /* Disable DCG */ + sensor_write_register(0x3100, 0x0000); + + /* Disable 1.25x analog gain */ + sensor_write_register(0x3EE4, 0xD208); + + printf("linear mode\n"); + break; + + default: + printf("NOT support this mode!\n"); + return; + break; + } + + return; +} + + +static HI_S32 cmos_set_image_mode(ISP_CMOS_SENSOR_IMAGE_MODE_S *pstSensorImageMode) +{ + HI_U8 u8SensorImageMode = gu8SensorImageMode; + + bInit = HI_FALSE; + + if (HI_NULL == pstSensorImageMode ) + { + printf("null pointer when set image mode\n"); + return -1; + } + + if((pstSensorImageMode->u16Width <= 1280)&&(pstSensorImageMode->u16Height <= 720)) + { + if (pstSensorImageMode->f32Fps <= 30) + { + u8SensorImageMode = SENSOR_720P_30FPS_MODE; + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + + return -1; + } + } + else if((pstSensorImageMode->u16Width <= 1280)&&(pstSensorImageMode->u16Height <= 960)) + { + if (pstSensorImageMode->f32Fps <= 30) + { + u8SensorImageMode = SENSOR_960P_30FPS_MODE; + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + + return -1; + } + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + } + + /* Sensor first init */ + if (HI_FALSE == bSensorInit) + { + gu8SensorImageMode = u8SensorImageMode; + + return 0; + } + + /* Switch SensorImageMode */ + if (u8SensorImageMode == gu8SensorImageMode) + { + /* Don't need to switch SensorImageMode */ + return -1; + } + + gu8SensorImageMode = u8SensorImageMode; + + return 0; + +} + +HI_U32 cmos_get_sns_regs_info(ISP_SNS_REGS_INFO_S *pstSnsRegsInfo) +{ + HI_S32 i; + + if (HI_FALSE == bInit) + { + g_stSnsRegsInfo.enSnsType = ISP_SNS_I2C_TYPE; + g_stSnsRegsInfo.u8Cfg2ValidDelayMax = 2; + g_stSnsRegsInfo.u32RegNum = 4; + + for (i=0; i (PATHLEN_MAX - 30)) + { + printf("Set inifile path is larger PATHLEN_MAX!\n"); + return -1; + } + strncat(pcName, pcPath, strlen(pcPath)); + strncat(pcName, CMOS_CFG_INI, sizeof(CMOS_CFG_INI)); + } + + return 0; + +} + +HI_VOID sensor_global_init() +{ + gu8SensorImageMode = SENSOR_720P_30FPS_MODE; + genSensorMode = WDR_MODE_NONE; + gu32FullLinesStd = FRAME_LINES_720P; + gu32FullLines = FRAME_LINES_720P; + bInit = HI_FALSE; + bSensorInit = HI_FALSE; + + memset(&g_stSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + memset(&g_stPreSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + +#ifdef INIFILE_CONFIG_MODE + HI_S32 s32Ret = HI_SUCCESS; + s32Ret = Cmos_LoadINIPara(pcName); + if (HI_SUCCESS != s32Ret) + { + printf("Cmos_LoadINIPara failed!!!!!!\n"); + } +#else + +#endif + +} + +HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc) +{ + memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S)); + + pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init; + pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit; + pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init; + pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode; + pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode; + + pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default; + pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level; + pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect; + pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info; + + return 0; +} + +/**************************************************************************** + * callback structure * + ****************************************************************************/ + +int sensor_register_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + ISP_SENSOR_REGISTER_S stIspRegister; + AE_SENSOR_REGISTER_S stAeRegister; + AWB_SENSOR_REGISTER_S stAwbRegister; + + cmos_init_sensor_exp_function(&stIspRegister.stSnsExp); + s32Ret = HI_MPI_ISP_SensorRegCallBack(IspDev, AR0130_ID, &stIspRegister); + if (s32Ret) + { + printf("sensor register callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + cmos_init_ae_exp_function(&stAeRegister.stSnsExp); + s32Ret = HI_MPI_AE_SensorRegCallBack(IspDev, &stLib, AR0130_ID, &stAeRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + cmos_init_awb_exp_function(&stAwbRegister.stSnsExp); + s32Ret = HI_MPI_AWB_SensorRegCallBack(IspDev, &stLib, AR0130_ID, &stAwbRegister); + if (s32Ret) + { + printf("sensor register callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_unregister_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + + s32Ret = HI_MPI_ISP_SensorUnRegCallBack(IspDev, AR0130_ID); + if (s32Ret) + { + printf("sensor unregister callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + s32Ret = HI_MPI_AE_SensorUnRegCallBack(IspDev, &stLib, AR0130_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + s32Ret = HI_MPI_AWB_SensorUnRegCallBack(IspDev, &stLib, AR0130_ID); + if (s32Ret) + { + printf("sensor unregister callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + + + + + + + + + + + + + + + + + +#if 0 +static AWB_CCM_S g_stAwbCcm = +{ + + 5000, + { + 0x01a2, 0x8080, 0x8022, + 0x8068, 0x0178, 0x8010, + 0x8008, 0x811A, 0x0222 + }, + + 3200, + { + 0x01e0,0x807b,0x8065, + 0x804f,0x0165,0x8016, + 0x001f,0x8126,0x0206 + }, + + 2600, + { + 0x0200, 0x80c3, 0x803D, + 0x8057, 0x015C, 0x8005, + 0x8020, 0x8290, 0x03b0 + } + +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTable = +{ + /* bvalid */ + 1, + + /* saturation */ + {0x80,0x80,0x6C,0x48,0x44,0x40,0x3C,0x38} +}; + +static ISP_CMOS_AGC_TABLE_S g_stIspAgcTable = +{ + /* bvalid */ + 1, + + /* sharpen_alt_d */ + {50,50,45,35,30,30,20,15}, + + /* sharpen_alt_ud */ + {45,45,35,30,25,25,15,10}, + + //snr_thresh + {8,12,18,26,36,46,56,66}, + + /* demosaic_lum_thresh */ + {0x50,0x50,0x40,0x40,0x30,0x30,0x20,0x20}, + + /* demosaic_np_offset */ + {0x0,0xa,0x12,0x1a,0x20,0x28,0x30,0x35}, + + /* ge_strength */ + {0x55,0x55,0x55,0x55,0x55,0x55,0x37,0x37} +}; + +static ISP_CMOS_NOISE_TABLE_S g_stIspNoiseTable = +{ + /* bvalid */ + 1, + + /* nosie_profile_weight_lut */ + {0, 0, 0, 0, 0, 0, 0, 12, 17, 21, 24, 26, 28, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 39, 40, 41, 41, 42, 42, 43, 43, 44, + 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, + 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, + 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 56, 56, 56, + 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, + 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62}, + + /* demosaic_weight_lut */ + {0, 12, 17, 21, 24, 26, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 39, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 46, + 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50, 51, 51, + 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, + 54, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 57, 57, + 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, + 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62} +}; + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaic = +{ + /* bvalid */ + 1, + + /*vh_slope*/ + 220, + + /*aa_slope*/ + 200, + + /*va_slope*/ + 185, + + /*uu_slope*/ + 210, + + /*sat_slope*/ + 93, + + /*ac_slope*/ + 160, + + /*vh_thresh*/ + 0, + + /*aa_thresh*/ + 0, + + /*va_thresh*/ + 0, + + /*uu_thresh*/ + 8, + + /*sat_thresh*/ + 0, + + /*ac_thresh*/ + 0x1b3 +}; + +static ISP_CMOS_GAMMA_S g_stIspGamma = +{ + /* bvalid */ + 1, + +#if 1 + {0 ,120 ,220 ,310 ,390 ,470 ,540 ,610 ,670 ,730 ,786 ,842 ,894 ,944 ,994 ,1050, + 1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568, + 1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907, + 1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184, + 2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422, + 2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570,2583,2596,2609,2621,2634, + 2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825, + 2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001, + 3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165, + 3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318, + 3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463, + 3471,3480,3489,3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600, + 3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730, + 3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855, + 3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974, + 3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095} +#else /*higher contrast*/ + {0 , 54 , 106, 158, 209, 259, 308, 356, 403, 450, 495, 540, 584, 628, 670, 713, + 754 ,795 , 835, 874, 913, 951, 989,1026,1062,1098,1133,1168,1203,1236,1270,1303, + 1335,1367,1398,1429,1460,1490,1520,1549,1578,1607,1635,1663,1690,1717,1744,1770, + 1796,1822,1848,1873,1897,1922,1946,1970,1993,2017,2040,2062,2085,2107,2129,2150, + 2172,2193,2214,2235,2255,2275,2295,2315,2335,2354,2373,2392,2411,2429,2447,2465, + 2483,2501,2519,2536,2553,2570,2587,2603,2620,2636,2652,2668,2684,2700,2715,2731, + 2746,2761,2776,2790,2805,2819,2834,2848,2862,2876,2890,2903,2917,2930,2944,2957, + 2970,2983,2996,3008,3021,3033,3046,3058,3070,3082,3094,3106,3118,3129,3141,3152, + 3164,3175,3186,3197,3208,3219,3230,3240,3251,3262,3272,3282,3293,3303,3313,3323, + 3333,3343,3352,3362,3372,3381,3391,3400,3410,3419,3428,3437,3446,3455,3464,3473, + 3482,3490,3499,3508,3516,3525,3533,3541,3550,3558,3566,3574,3582,3590,3598,3606, + 3614,3621,3629,3637,3644,3652,3660,3667,3674,3682,3689,3696,3703,3711,3718,3725, + 3732,3739,3746,3752,3759,3766,3773,3779,3786,3793,3799,3806,3812,3819,3825,3831, + 3838,3844,3850,3856,3863,3869,3875,3881,3887,3893,3899,3905,3910,3916,3922,3928, + 3933,3939,3945,3950,3956,3962,3967,3973,3978,3983,3989,3994,3999,4005,4010,4015, + 4020,4026,4031,4036,4041,4046,4051,4056,4061,4066,4071,4076,4081,4085,4090,4095,4095} +#endif +}; + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + pstDef->stComm.u8Rggb = 0x1; //1: rggb + pstDef->stComm.u8BalanceFe = 0x1; + + pstDef->stDenoise.u8SinterThresh= 0x23; + pstDef->stDenoise.u8NoiseProfile= 0x1; //0: use default profile table; 1: use calibrated profile lut, the setting for nr0 and nr1 must be correct. + pstDef->stDenoise.u16Nr0 = 0x0; + pstDef->stDenoise.u16Nr1 = 546; + + pstDef->stDrc.u8DrcBlack = 0x00; + pstDef->stDrc.u8DrcVs = 0x04; // variance space + pstDef->stDrc.u8DrcVi = 0x01; // variance intensity + pstDef->stDrc.u8DrcSm = 0x80; // slope max + pstDef->stDrc.u16DrcWl = 0x4FF; // white level + + memcpy(&pstDef->stNoiseTbl, &g_stIspNoiseTable, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stAgcTbl, &g_stIspAgcTable, sizeof(ISP_CMOS_AGC_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_stIspDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stGamma, &g_stIspGamma, sizeof(ISP_CMOS_GAMMA_S)); + + return 0; +} + +HI_U32 cmos_get_isp_black_level(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel) +{ + HI_S32 i; + + if (HI_NULL == pstBlackLevel) + { + printf("null pointer when get isp black level value!\n"); + return -1; + } + + /* Don't need to update black level when iso change */ + pstBlackLevel->bUpdate = HI_FALSE; + + for (i=0; i<4; i++) + { + pstBlackLevel->au16BlackLevel[i] = 0xC8; + } + + return 0; +} + +HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) +{ + if (bEnable) /* setup for ISP pixel calibration mode */ + { + sensor_write_register(0x300C, 0x4D58); //5fps + sensor_write_register(0x3012, 0x05DA); //max exposure lines + sensor_write_register(0x30B0, 0x1300); //AG, Context A + sensor_write_register(0x305E, 0x0020); //DG, Context A + sensor_write_register(0x3100, 0x0000); + sensor_write_register(0x3ee4, 0xd208); + } + else /* setup for ISP 'normal mode' */ + { + sensor_write_register(0x300C, 0xa78); //25fps + sensor_write_register(0x3ee4, 0xd308); + sensor_write_register(0x3100, 0x0004); + } + + return; +} + +HI_VOID cmos_set_wdr_mode(HI_U8 u8Mode) +{ + switch(u8Mode) + { + //sensor mode 0 + case 0: + gu8SensorMode = 0; + // TODO: + break; + //sensor mode 1 + case 1: + gu8SensorMode = 1; + // TODO: + break; + + default: + printf("NOT support this mode!\n"); + return; + break; + } + + return; +} + +static HI_U32 analog_gain_table[6] = +{ + 1024, 2048, 2886, 5772, 11544, 23088 + +}; + + +static HI_VOID cmos_again_calc_table(HI_U32 u32InTimes,AE_SENSOR_GAININFO_S *pstAeSnsGainInfo) +{ + int i; + + if(HI_NULL == pstAeSnsGainInfo) + { + printf("null pointer when get ae sensor gain info value!\n"); + return; + } + + pstAeSnsGainInfo->u32GainDb = 0; + pstAeSnsGainInfo->u32SnsTimes = 1024; + + if (u32InTimes >= analog_gain_table[5]) + { + pstAeSnsGainInfo->u32SnsTimes = analog_gain_table[5]; + pstAeSnsGainInfo->u32GainDb = 5; + return ; + } + + for(i = 1; i < 6; i++) + { + if(u32InTimes < analog_gain_table[i]) + { + + pstAeSnsGainInfo->u32SnsTimes = analog_gain_table[i - 1]; + pstAeSnsGainInfo->u32GainDb = i - 1; + break; + } + + } + + return; +} + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + gu32FullLinesStd = 750; + + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x40; + + pstAeSnsDft->u32LinesPer500ms = 750*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0;//60*256;//50*256; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->u32MaxIntTime = 748; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = 2; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 6; + pstAeSnsDft->u32MaxAgain = 23088; /* 9db + 18db(8) */ + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = 23088; + pstAeSnsDft->u32MinAgainTarget = 1024; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.03125; + pstAeSnsDft->u32MaxDgain = 255; /* (8 - 0.3125) / 0.03125 = 255 */ + pstAeSnsDft->u32MinDgain = 32; + pstAeSnsDft->u32MaxDgainTarget = 255; + pstAeSnsDft->u32MinDgainTarget = 32; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MaxISPDgainTarget = 4 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + + return 0; +} + +static HI_S32 cmos_get_sensor_max_resolution(ISP_CMOS_SENSOR_MAX_RESOLUTION *pstSensorMaxResolution) +{ + if (HI_NULL == pstSensorMaxResolution) + { + printf("null pointer when get sensor max resolution \n"); + return -1; + } + + memset(pstSensorMaxResolution, 0, sizeof(ISP_CMOS_SENSOR_MAX_RESOLUTION)); + + pstSensorMaxResolution->u32MaxWidth = 1280; + pstSensorMaxResolution->u32MaxHeight = 720; + + return 0; +} + + +/* the function of sensor set fps */ +static HI_VOID cmos_fps_set(HI_U8 u8Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + switch(u8Fps) + { + case 30: + // Change the frame rate via changing the vertical blanking + gu32FullLinesStd = 750; + pstAeSnsDft->u32MaxIntTime = 748; + pstAeSnsDft->u32LinesPer500ms = 750 * 30 / 2; + sensor_write_register(0x300c, 0x8ba); + break; + + case 25: + // Change the frame rate via changing the vertical blanking + gu32FullLinesStd = 750; + pstAeSnsDft->u32MaxIntTime = 748; + pstAeSnsDft->u32LinesPer500ms = 750 * 25 / 2; + sensor_write_register(0x300c, 0xa78); + break; + + default: + break; + } + + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + + return; +} + +static HI_VOID cmos_slow_framerate_set(HI_U16 u16FullLines, + AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + sensor_write_register(0x300A, u16FullLines); + + pstAeSnsDft->u32MaxIntTime = u16FullLines - 2; + + return; +} + +static HI_VOID cmos_init_regs_info(HI_VOID) +{ +#if CMOS_AR0130_ISP_WRITE_SENSOR_ENABLE + HI_S32 i; + static HI_BOOL bInit = HI_FALSE; + + if (HI_FALSE == bInit) + { + g_stSnsRegsInfo.enSnsType = ISP_SNS_I2C_TYPE; + g_stSnsRegsInfo.u32RegNum = 4; + for (i=0; i= 2) + { + g_stSnsRegsInfo.astI2cData[3].u32Data = 0x0004; + } + else + { + g_stSnsRegsInfo.astI2cData[3].u32Data = 0x0000; + } + + switch(u32Again) + { + case 0: + case 2: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1300; + break; + case 1: + case 3: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1310; + break; + case 4: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1320; + break; + case 5: + g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1330; + break; + } + + g_stSnsRegsInfo.astI2cData[2].u32Data = u32Dgain; + + HI_MPI_ISP_SnsRegsCfg(&g_stSnsRegsInfo); +#else + if(u32Again >= 2) + { + sensor_write_register(0x3100, 0x0004); + } + else + { + sensor_write_register(0x3100, 0x0000); + } + + switch(u32Again) + { + case 0: + case 2: + sensor_write_register(0x30B0, 0x1300); + break; + case 1: + case 3: + sensor_write_register(0x30B0, 0x1310); + break; + case 4: + sensor_write_register(0x30B0, 0x1320); + break; + case 5: + sensor_write_register(0x30B0, 0x1330); + break; + } + + sensor_write_register(0x305E, u32Dgain); + +#endif + return; +} + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + + pstAwbSnsDft->u16WbRefTemp = 5000; + + pstAwbSnsDft->au16GainOffset[0] = 0x018b; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x01a7; + + pstAwbSnsDft->as32WbPara[0] = 86; + pstAwbSnsDft->as32WbPara[1] = -16; + pstAwbSnsDft->as32WbPara[2] = -182; + pstAwbSnsDft->as32WbPara[3] = 243836; + pstAwbSnsDft->as32WbPara[4] = 128; + pstAwbSnsDft->as32WbPara[5] = -195566; + + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTable, sizeof(AWB_AGC_TABLE_S)); + + return 0; +} + +HI_VOID sensor_global_init() +{ + + gu8SensorMode = 0; + +} + + +/**************************************************************************** + * callback structure * + ****************************************************************************/ +HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc) +{ + memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S)); + + pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init; + pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init; + pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default; + pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level; + pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect; + pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode; + pstSensorExpFunc->pfn_cmos_get_sensor_max_resolution = cmos_get_sensor_max_resolution; + + return 0; +} + +HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default; + pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set; + pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; + pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update; + pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update; + pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table; + + return 0; +} + +HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default; + + return 0; +} + +int sensor_register_callback(void) +{ + HI_S32 s32Ret; + ALG_LIB_S stLib; + ISP_SENSOR_REGISTER_S stIspRegister; + AE_SENSOR_REGISTER_S stAeRegister; + AWB_SENSOR_REGISTER_S stAwbRegister; + + cmos_init_sensor_exp_function(&stIspRegister.stSnsExp); + s32Ret = HI_MPI_ISP_SensorRegCallBack(AR0130_ID, &stIspRegister); + if (s32Ret) + { + printf("sensor register callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AE_LIB_NAME); + cmos_init_ae_exp_function(&stAeRegister.stSnsExp); + s32Ret = HI_MPI_AE_SensorRegCallBack(&stLib, AR0130_ID, &stAeRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AWB_LIB_NAME); + cmos_init_awb_exp_function(&stAwbRegister.stSnsExp); + s32Ret = HI_MPI_AWB_SensorRegCallBack(&stLib, AR0130_ID, &stAwbRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_unregister_callback(void) +{ + HI_S32 s32Ret; + ALG_LIB_S stLib; + + s32Ret = HI_MPI_ISP_SensorUnRegCallBack(AR0130_ID); + if (s32Ret) + { + printf("sensor unregister callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AE_LIB_NAME); + s32Ret = HI_MPI_AE_SensorUnRegCallBack(&stLib, AR0130_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AWB_LIB_NAME); + s32Ret = HI_MPI_AWB_SensorUnRegCallBack(&stLib, AR0130_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + return 0; +} +#endif + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif // __IMX104_CMOS_H_ diff --git a/device/mpp/component/isp/sensor/ar0130/ar0130_sensor_ctl.c b/device/mpp/component/isp/sensor/ar0130/ar0130_sensor_ctl.c new file mode 100644 index 0000000..c70d8fa --- /dev/null +++ b/device/mpp/component/isp/sensor/ar0130/ar0130_sensor_ctl.c @@ -0,0 +1,358 @@ +#include +#include +#include +#include +#include +#include + +#include "hi_comm_video.h" + +#ifdef HI_GPIO_I2C +#include "gpioi2c_ex.h" +#else +#include "hi_i2c.h" +#endif + +static int g_fd = -1; +static int flag_init = 0; + +const unsigned char sensor_i2c_addr = 0x20; /* I2C Address of 9m034 */ +const unsigned int sensor_addr_byte = 2; +const unsigned int sensor_data_byte = 2; + +extern WDR_MODE_E genSensorMode; +extern HI_U8 gu8SensorImageMode; +extern HI_BOOL bSensorInit; + +int sensor_i2c_init(void) +{ + if(g_fd >= 0) + { + return 0; + } +#ifdef HI_GPIO_I2C + int ret; + + g_fd = open("/dev/gpioi2c_ex", 0); + if(g_fd < 0) + { + printf("Open gpioi2c_ex error!\n"); + return -1; + } +#else + int ret; + + g_fd = open("/dev/i2c-0", O_RDWR); + if(g_fd < 0) + { + printf("Open /dev/i2c-0 error!\n"); + return -1; + } + + ret = ioctl(g_fd, I2C_SLAVE_FORCE, sensor_i2c_addr); + if (ret < 0) + { + printf("CMD_SET_DEV error!\n"); + return ret; + } +#endif + + return 0; +} + +int sensor_i2c_exit(void) +{ + if (g_fd >= 0) + { + close(g_fd); + g_fd = -1; + return 0; + } + return -1; +} + +int sensor_read_register(int addr) +{ + // TODO: + + return 0; +} + +int sensor_write_register(int addr, int data) +{ +#ifdef HI_GPIO_I2C + i2c_data.dev_addr = sensor_i2c_addr; + i2c_data.reg_addr = addr; + i2c_data.addr_byte_num = sensor_addr_byte; + i2c_data.data = data; + i2c_data.data_byte_num = sensor_data_byte; + + ret = ioctl(g_fd, GPIO_I2C_WRITE, &i2c_data); + + if (ret) + { + printf("GPIO-I2C write faild!\n"); + return ret; + } +#else + if(flag_init == 0) + { + + sensor_i2c_init(); + flag_init = 1; + } + + int idx = 0; + int ret; + char buf[8]; + + buf[idx++] = addr & 0xFF; + if (sensor_addr_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_REG, 1); + buf[idx++] = addr >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_REG, 0); + } + + if (ret < 0) + { + printf("CMD_SET_REG_WIDTH error!\n"); + return -1; + } + + buf[idx++] = data; + if (sensor_data_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 1); + buf[idx++] = data >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 0); + } + + if (ret) + { + printf("hi_i2c write faild!\n"); + return -1; + } + + ret = write(g_fd, buf, idx); + if(ret < 0) + { + printf("I2C_WRITE error!\n"); + return -1; + } +#endif + return 0; +} + +static void delay_ms(int ms) { + usleep(ms*1000); +} + +void sensor_prog(int* rom) +{ + int i = 0; + while (1) { + int lookup = rom[i++]; + int addr = (lookup >> 16) & 0xFFFF; + int data = lookup & 0xFFFF; + if (addr == 0xFFFE) { + delay_ms(data); + } else if (addr == 0xFFFF) { + return; + } else { + sensor_write_register(addr, data); + } + } +} + + +void sensor_init() +{ +//[720p30] + + sensor_write_register( 0x301A, 0x0001 ); // RESET_REGISTER + delay_ms(200); //ms + sensor_write_register( 0x301A, 0x10D8 ); // RESET_REGISTER + delay_ms(200); //ms + //Linear Mode Setup + //AR0130 Rev1 Linear sequencer load 8-2-2011 + sensor_write_register( 0x3088, 0x8000 );// SEQ_CTRL_PORT + sensor_write_register( 0x3086, 0x0225 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x5050 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2D26 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0828 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0D17 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0926 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0028 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0526 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0xA728 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0725 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x8080 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2917 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0525 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0040 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2702 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1616 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2706 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1736 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x26A6 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1703 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x26A4 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x171F );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2805 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2620 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2804 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2520 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2027 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0017 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1E25 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0020 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2117 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1028 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x051B );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1703 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2706 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1703 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1747 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2660 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x17AE );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2500 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x9027 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0026 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1828 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x002E );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2A28 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x081E );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0831 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1440 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x4014 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2020 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1410 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1034 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1014 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0020 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x4013 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1802 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1470 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x7004 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1470 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x7003 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1470 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x7017 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2002 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2002 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x5004 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2004 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x5022 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0314 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0020 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0314 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x0050 );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2C2C );// SEQ_DATA_PORT + sensor_write_register( 0x3086, 0x2C2C );// SEQ_DATA_PORT + sensor_write_register( 0x309E, 0x0000 );// DCDS_PROG_START_ADDR + sensor_write_register( 0x30E4, 0x6372 );// ADC_BITS_6_7 + sensor_write_register( 0x30E2, 0x7253 );// ADC_BITS_4_5 + sensor_write_register( 0x30E0, 0x5470 );// ADC_BITS_2_3 + sensor_write_register( 0x30E6, 0xC4CC );// ADC_CONFIG1 + sensor_write_register( 0x30E8, 0x8050 );// ADC_CONFIG2 + delay_ms(200); //ms + sensor_write_register( 0x3082, 0x0029 ); // OPERATION_MODE_CTRL + //AR0130 Rev1 Optimized settings + sensor_write_register( 0x301E, 0x00C8); // DATA_PEDESTAL + sensor_write_register( 0x3EDA, 0x0F03); // DAC_LD_14_15 + sensor_write_register( 0x3EDE, 0xC005); // DAC_LD_18_19 + sensor_write_register( 0x3ED8, 0x09EF); // DAC_LD_12_13 + sensor_write_register( 0x3EE2, 0xA46B); // DAC_LD_22_23 + sensor_write_register( 0x3EE0, 0x047D); // DAC_LD_20_21 + sensor_write_register( 0x3EDC, 0x0070); // DAC_LD_16_17 + sensor_write_register( 0x3044, 0x0404); // DARK_CONTROL + sensor_write_register( 0x3EE6, 0x8303); // DAC_LD_26_27 + sensor_write_register( 0x3EE4, 0xD208); // DAC_LD_24_25 + sensor_write_register( 0x3ED6, 0x00BD); // DAC_LD_10_11 + sensor_write_register( 0x30B0, 0x1300); // DIGITAL_TEST + sensor_write_register( 0x30D4, 0xE007); // COLUMN_CORRECTION + sensor_write_register( 0x301A, 0x10DC); // RESET_REGISTER + delay_ms(500 );//ms + sensor_write_register( 0x301A, 0x10D8); // RESET_REGISTER + delay_ms(500); //ms + sensor_write_register( 0x3044, 0x0400); // DARK_CONTROL + + sensor_write_register( 0x3012, 0x02A0); // COARSE_INTEGRATION_TIME + + + //720p 30fps Setup + sensor_write_register( 0x3032, 0x0000); // DIGITAL_BINNING + sensor_write_register( 0x3002, 0x0002); // Y_ADDR_START + sensor_write_register( 0x3004, 0x0000); // X_ADDR_START + sensor_write_register( 0x3006, 0x02D1);//Row End (A) = 721 + sensor_write_register( 0x3008, 0x04FF);//Column End (A) = 1279 + sensor_write_register( 0x300A, 0x02EA);//Frame Lines (A) = 746 + sensor_write_register( 0x300C, 0x08ba); + sensor_write_register( 0x3012, 0x0133);//Coarse_IT_Time (A) = 307 + sensor_write_register( 0x306e, 0x9211);//Coarse_IT_Time (A) = 307 + + + //Enable Parallel Mode + sensor_write_register( 0x301A, 0x10D8); // RESET_REGISTER + sensor_write_register( 0x31D0, 0x0001); // HDR_COMP + + //PLL Enabled 27Mhz to 50Mhz + sensor_write_register( 0x302A, 0x0009 );//VT_PIX_CLK_DIV = 9 + sensor_write_register( 0x302C, 0x0001 );//VT_SYS_CLK_DIV = 1 + sensor_write_register( 0x302E, 0x0003 );//PRE_PLL_CLK_DIV = 3 + sensor_write_register( 0x3030, 0x0032 );//PLL_MULTIPLIER = 50 + sensor_write_register( 0x30B0, 0x1300 ); // DIGITAL_TEST + delay_ms(100); //ms + sensor_write_register( 0x301A, 0x10DC ); // RESET_REGISTER + sensor_write_register( 0x301A, 0x10DC ); // RESET_REGISTER + + //exposure + sensor_write_register( 0x3012, 0x0671 ); // COARSE_INTEGRATION_TIME + sensor_write_register( 0x30B0, 0x1330 ); // DIGITAL_TEST + sensor_write_register( 0x3056, 0x003B ); // GREEN1_GAIN + sensor_write_register( 0x305C, 0x003B ); // GREEN2_GAIN + sensor_write_register( 0x305A, 0x003B ); // RED_GAIN + sensor_write_register( 0x3058, 0x003B ); // BLUE_GAIN + //High Conversion gain + sensor_write_register( 0x3100, 0x0004 ); // AE_CTRL_REG + + + //LOAD= Disable Embedded Data and Stats + sensor_write_register(0x3064, 0x1802); // SMIA_TEST, EMBEDDED_STATS_EN, 0x0000 + sensor_write_register(0x3064, 0x1802); // SMIA_TEST, EMBEDDED_DATA, 0x0000 + + sensor_write_register(0x30BA, 0x0008); //20120502 + + sensor_write_register(0x3EE4, 0xD308); //the default value former is 0xd208 + + sensor_write_register(0x301A, 0x10DC); // RESET_REGISTER + + delay_ms(200); //DELAY= 200 + + + printf("Aptina AR0130 sensor 720P30fps init success!\n"); + +} + +void sensor_exit() +{ + sensor_i2c_exit(); + flag_init = 0; + return; +} + + + diff --git a/device/mpp/component/isp/sensor/hi_cmoscfg/Makefile b/device/mpp/component/isp/sensor/hi_cmoscfg/Makefile new file mode 100644 index 0000000..3037215 --- /dev/null +++ b/device/mpp/component/isp/sensor/hi_cmoscfg/Makefile @@ -0,0 +1,74 @@ +# +# hi_iniparser lib Makefile +# + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../../../Makefile.param + include $(PARAM_FILE) +endif + +ISP_PATH := $(SDK_PATH)/mpp/component/isp +LIBPATH = $(ISP_PATH)/lib +OBJPATH = ./obj + +INI_INC := $(ISP_PATH)/iniparser +3A_PATH := $(ISP_PATH)/include + +ifeq ($(MPP_BUILD), y) +EXT_PATH := $(SDK_PATH)/mpp/$(EXTDRV) +else +EXT_PATH := $(SDK_PATH)/mpp/extdrv +endif + +BUS_DIR := $(EXT_PATH)/pwm + +ARFLAGS = rcv +CFLAGS = -Wall -fPIC + +ifeq ($(ISP_INI_CONFIG), y) +CFLAGS += -D INIFILE_CONFIG_MODE +endif + +ifeq ($(HIGDB),HI_GDB) +CFLAGS += -g +endif + +ifeq ($(CONFIG_JPEGEDCF), y) + CFLAGS += -D ENABLE_JPEGEDCF +endif + +CFLAGS += -O2 +CFLAGS += $(LIBS_CFLAGS) +DFLAGS := -DEXT_REG + +ISP_INC := $(ISP_PATH)/include +3A_INC := $(3A_PATH)/include + +INC := -I$(REL_INC) -I$(ISP_INC) -I$(BUS_DIR) -I$(INI_INC) -I$(3A_INC) +#-I$(SRC_INC) -I$(VREG_INC) -I$(VREG_INC)/arch/$(HIARCH) + +COMPILE = $(CC) $(CFLAGS) $(DFLAGS) -lm + +$(OBJPATH)/%.o: ./%.c + @(echo "compiling $< ...") + @[ -e $(LIBPATH) ] || mkdir $(LIBPATH) + @[ -e $(OBJPATH) ] || mkdir $(OBJPATH) + @($(COMPILE) -o $@ -c $< $(INC)) + +SRCS = $(wildcard ./*.c) +OBJS = $(SRCS:%.c=%.o) +OBJS := $(OBJS:./%=obj/%) + +LIB_A := $(LIBPATH)/lib_cmoscfg.a +LIB_S := $(LIBPATH)/lib_cmoscfg.so + +all:$(OBJS) + @($(AR) $(ARFLAGS) $(LIB_A) $(OBJS)) + @($(CC) $(LIBS_LD_CFLAGS) -shared -fPIC -o $(LIB_S) $(OBJS)) + +clean: + @$(RM) -rf $(LIB_A) $(LIB_S) $(OBJS) + @$(RM) -rf $(LIBPATH) $(OBJPATH) + +show: + @echo "$(QUICK_CONFIG)" \ No newline at end of file diff --git a/device/mpp/component/isp/sensor/hi_cmoscfg/hi_cmos_cfg.c b/device/mpp/component/isp/sensor/hi_cmoscfg/hi_cmos_cfg.c new file mode 100644 index 0000000..e607f06 --- /dev/null +++ b/device/mpp/component/isp/sensor/hi_cmoscfg/hi_cmos_cfg.c @@ -0,0 +1,1283 @@ +#include +#include +#include +#include "hi_comm_sns.h" +#include "hi_ae_comm.h" +#include "hi_awb_comm.h" +#include "iniparser.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +//#define INIFILE_CONFIG_MODE +#ifdef INIFILE_CONFIG_MODE + +#define ModeNumMax 6 +AE_SENSOR_DEFAULT_S g_AeDft[ModeNumMax]; +AWB_SENSOR_DEFAULT_S g_AwbDft[ModeNumMax]; +ISP_CMOS_DEFAULT_S g_IspDft[ModeNumMax]; + +dictionary* g_dictionary = NULL; +static int MAEWeight[256]; +#define ISO_EXPOSURE_LEVEL 16 + + +static int Weight(const char *pcStr) +{ + const char* pszVRBegin = pcStr; + const char* pszVREnd = pszVRBegin; + int Count = 0; + char Temp[20]; + int Mycount = 0; + int Length = strlen(pcStr); + unsigned int re; + int i = 0; + + memset(Temp, 0, 20); + + while((pszVREnd != NULL)) + { + if((Mycount > Length)||(Mycount == Length)) + { + break; + } + while((*pszVREnd != '|')&&(*pszVREnd != '\0')&&(*pszVREnd != ',')) + { + pszVREnd++; + Count++; + Mycount++; + } + memcpy(Temp, pszVRBegin, Count); + + re = (int)strtol(Temp, NULL, 0); + MAEWeight[i] = re; + + memset(Temp, 0, 20); + Count = 0; + pszVREnd++; + pszVRBegin = pszVREnd; + Mycount++; + i++; + } + + return i; +} + + +HI_S32 Cmos_cfg_LoadFile(const HI_CHAR *pcName) +{ + if(NULL != g_dictionary) + { + g_dictionary = NULL; + } + else + { + g_dictionary = iniparser_load(pcName); + if(NULL == g_dictionary) + { + printf("%s ini load failed\n",pcName); + return HI_FAILURE; + } + } + return HI_SUCCESS; +} + +HI_VOID Cmos_cfg_FreeDict() +{ + if(NULL != g_dictionary) + { + iniparser_freedict(g_dictionary); + } + g_dictionary = NULL; +} + +HI_S32 cmos_loadAE_cfg() +{ + HI_U8 i; + HI_S32 s32Temp = 0; + HI_S32 AEModeNumber = 0; + HI_CHAR acTempStr[128]; + + /********************AE:AEModeNumber*******************/ + AEModeNumber = iniparser_getint(g_dictionary, "AE:AEModeNumber", HI_FAILURE); + if (HI_FAILURE == AEModeNumber) + { + printf("AE:AEModeNumber failed\n"); + return HI_FAILURE; + } + + if (AEModeNumber > ModeNumMax) + { + printf("notice : Current AEModeNumber is larger!!!\n"); + return HI_FAILURE; + } + + for (i = 0; i < AEModeNumber; i++) + { + /*AeCompensation*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:AeCompensation_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:AeCompensation_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u8AeCompensation = s32Temp; + + /*MaxIntTimeTarget*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:MaxIntTimeTarget_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:MaxIntTimeTarget_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u32MaxIntTimeTarget = s32Temp; + + /*MinIntTimeTarget*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:MinIntTimeTarget_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:MinIntTimeTarget_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u32MinIntTimeTarget = s32Temp; + + /*MaxAgainTarget*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:MaxAgainTarget_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:MaxAgainTarget_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u32MaxAgainTarget = s32Temp; + + /*MinAgainTarget*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:MinAgainTarget_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:MinAgainTarget_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u32MinAgainTarget = s32Temp; + + /*MaxDgainTarget*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:MaxDgainTarget_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:MaxDgainTarget_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u32MaxDgainTarget = s32Temp; + + /*MinDgainTarget*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:MinDgainTarget_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:MinDgainTarget_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u32MinDgainTarget = s32Temp; + + /*ISPDgainShift*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:ISPDgainShift_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:ISPDgainShift_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u32ISPDgainShift = s32Temp; + + /*MaxISPDgainTarget*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:MaxISPDgainTarget_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:MaxISPDgainTarget_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u32MaxISPDgainTarget = s32Temp; + + /*MinISPDgainTarget*/ + snprintf(acTempStr, sizeof(acTempStr), "AE:MinISPDgainTarget_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:MinISPDgainTarget_%d failed\n", i); + return HI_FAILURE; + } + g_AeDft[i].u32MinISPDgainTarget = s32Temp; + + } + + return HI_SUCCESS; +} + + +HI_S32 cmos_loadAWB_cfg() +{ + HI_U8 i,j; + HI_S32 s32Temp = 0; + HI_S32 AWBModeNumber = 0; + HI_CHAR *pcTempStr = NULL; + HI_CHAR acTempStr[128]; + HI_S32 FindKey = 0; + + /********************AWB:AWBModeNumber*******************/ + AWBModeNumber = iniparser_getint(g_dictionary, "AWB:AWBModeNumber", HI_FAILURE); + if (HI_FAILURE == AWBModeNumber) + { + printf("AWB:AWBModeNumber failed\n"); + return HI_FAILURE; + } + + if (AWBModeNumber > ModeNumMax) + { + printf("notice : Current AWBModeNumber is larger!!!\n"); + return HI_FAILURE; + } + + for (i = 0; i < AWBModeNumber; i++) + { + /* HighColorTemp */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:HighColorTemp_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AWB:HighColorTemp_%d failed\n", i); + return HI_FAILURE; + } + g_AwbDft[i].stCcm.u16HighColorTemp = s32Temp; + + /* HighCCM */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:HighCCM_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("AWB:HighCCM_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < 9; j++) + { + g_AwbDft[i].stCcm.au16HighCCM[j] = MAEWeight[j]; + } + + /* MidColorTemp */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:MidColorTemp_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AWB:MidColorTemp_%d failed\n", i); + return HI_FAILURE; + } + g_AwbDft[i].stCcm.u16MidColorTemp = s32Temp; + + /* MidCCM */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:MidCCM_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("AWB:MidCCM_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < 9; j++) + { + g_AwbDft[i].stCcm.au16MidCCM[j] = MAEWeight[j]; + } + + /* LowColorTemp */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:LowColorTemp_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AWB:LowColorTemp_%d failed\n", i); + return HI_FAILURE; + } + g_AwbDft[i].stCcm.u16LowColorTemp = s32Temp; + + /* LowCCM */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:LowCCM_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("AWB:LowCCM_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < 9; j++) + { + g_AwbDft[i].stCcm.au16LowCCM[j] = MAEWeight[j]; + } + + /* WbRefTemp */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:WbRefTemp_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AWB:WbRefTemp_%d failed\n", i); + return HI_FAILURE; + } + g_AwbDft[i].u16WbRefTemp = s32Temp; + + /* GainOffset */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:GainOffset_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("AWB:GainOffset_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < 4; j++) + { + g_AwbDft[i].au16GainOffset[j] = MAEWeight[j]; + } + + /* WbPara */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:WbPara_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("AWB:WbPara_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < 6; j++) + { + g_AwbDft[i].as32WbPara[j] = MAEWeight[j]; + } + + /* SatValid */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:SatValid_%d", i); + FindKey = 0; + FindKey = iniparser_find_entry(g_dictionary, acTempStr); + if(1 == FindKey) + { + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AWB:SatValid_%d failed\n", i); + return HI_FAILURE; + } + g_AwbDft[i].stAgcTbl.bValid = s32Temp; + + /* Saturation */ + snprintf(acTempStr, sizeof(acTempStr), "AWB:Saturation_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("AWB:Saturation_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0;j < ISO_EXPOSURE_LEVEL; j++) + { + g_AwbDft[i].stAgcTbl.au8Saturation[j] = MAEWeight[j]; + } + + } + + } + + return HI_SUCCESS; +} + + +HI_S32 cmos_loadISP_cfg() +{ + HI_U8 i,j; + HI_S32 s32Temp = 0; + HI_S32 s32Offset = 0; + HI_S32 ISPModeNumber = 0; + HI_CHAR *pcTempStr = NULL; + HI_CHAR acTempStr[128]; + HI_S32 FindKey = 0; + + /********************ISP:ISPModeNumber*******************/ + ISPModeNumber = iniparser_getint(g_dictionary, "ISP:ISPModeNumber", HI_FAILURE); + if (HI_FAILURE == ISPModeNumber) + { + printf("ISP:ISPModeNumber failed\n"); + return HI_FAILURE; + } + + if (ISPModeNumber > ModeNumMax) + { + printf("notice : Current ISPModeNumber is larger!!!\n"); + return HI_FAILURE; + } + + for (i = 0; i < ISPModeNumber; i++) + { + /* AgcValid */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:AgcValid_%d", i); + FindKey = 0; + FindKey = iniparser_find_entry(g_dictionary, acTempStr); + if(1 == FindKey) + { + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:AgcValid_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stAgcTbl.bValid = s32Temp; + + /* SharpenAltD */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:SharpenAltD_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:SharpenAltD_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < ISO_EXPOSURE_LEVEL; j++) + { + g_IspDft[i].stAgcTbl.au8SharpenAltD[j] = MAEWeight[j]; + } + + /* SharpenAltUd */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:SharpenAltUd_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:SharpenAltUd_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < ISO_EXPOSURE_LEVEL; j++) + { + g_IspDft[i].stAgcTbl.au8SharpenAltUd[j] = MAEWeight[j]; + } + + /* SnrThresh */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:SnrThresh_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:SnrThresh_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < ISO_EXPOSURE_LEVEL; j++) + { + g_IspDft[i].stAgcTbl.au8SnrThresh[j] = MAEWeight[j]; + } + + /* DemosaicLumThresh */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:DemosaicLumThresh_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:DemosaicLumThresh_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < ISO_EXPOSURE_LEVEL; j++) + { + g_IspDft[i].stAgcTbl.au8DemosaicLumThresh[j] = MAEWeight[j]; + } + + /* DemosaicNpOffset */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:DemosaicNpOffset_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:DemosaicNpOffset_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < ISO_EXPOSURE_LEVEL; j++) + { + g_IspDft[i].stAgcTbl.au8DemosaicNpOffset[j] = MAEWeight[j]; + } + + /* GeStrength */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:GeStrength_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:GeStrength_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < ISO_EXPOSURE_LEVEL; j++) + { + g_IspDft[i].stAgcTbl.au8GeStrength[j] = MAEWeight[j]; + } + + /* SharpenRGB */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:SharpenRGB_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:SharpenRGB_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < ISO_EXPOSURE_LEVEL; j++) + { + g_IspDft[i].stAgcTbl.au8SharpenRGB[j] = MAEWeight[j]; + } + } + + /* WeightValid */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:WeightValid_%d", i); + FindKey = 0; + FindKey = iniparser_find_entry(g_dictionary, acTempStr); + if(1 == FindKey) + { + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:WeightValid_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stNoiseTbl.bValid = s32Temp; + + /* NoiseProfileWeight */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:NoiseProfileWeight_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:NoiseProfileWeight_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < 128; j++) + { + g_IspDft[i].stNoiseTbl.au8NoiseProfileWeightLut[j] = MAEWeight[j]; + } + + /* DemosaicWeight */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:DemosaicWeight_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:DemosaicWeight_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < 128; j++) + { + g_IspDft[i].stNoiseTbl.au8DemosaicWeightLut[j] = MAEWeight[j]; + } + } + + + /* demosaicValid */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:demosaicValid_%d", i); + FindKey = 0; + FindKey = iniparser_find_entry(g_dictionary, acTempStr); + if(1 == FindKey) + { + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:demosaicValid_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.bValid = s32Temp; + + /* VhSlope */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:VhSlope_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:VhSlope_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u8VhSlope = s32Temp; + + /* AaSlope */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:AaSlope_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:AaSlope_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u8AaSlope = s32Temp; + + /* VaSlope */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:VaSlope_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:VaSlope_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u8VaSlope = s32Temp; + + /* UuSlope */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:UuSlope_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:UuSlope_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u8UuSlope = s32Temp; + + /* SatSlope */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:SatSlope_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:SatSlope_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u8SatSlope = s32Temp; + + /* AcSlope */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:AcSlope_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:AcSlope_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u8AcSlope = s32Temp; + + /* FcSlope */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:FcSlope_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:FcSlope_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u8FcSlope = s32Temp; + + /* VhThresh */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:VhThresh_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:VhThresh_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u16VhThresh = s32Temp; + + /* AaThresh */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:AaThresh_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:AaThresh_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u16AaThresh = s32Temp; + + /* VaThresh */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:VaThresh_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:VaThresh_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u16VaThresh = s32Temp; + + /* UuThresh */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:UuThresh_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:UuThresh_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u16UuThresh = s32Temp; + + /* SatThresh */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:SatThresh_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:SatThresh_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u16SatThresh = s32Temp; + + /* AcThresh */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:AcThresh_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:AcThresh_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDemosaic.u16AcThresh = s32Temp; + + } + + /* gammaRGBValid */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:gammaRGBValid_%d", i); + FindKey = 0; + FindKey = iniparser_find_entry(g_dictionary, acTempStr); + if(1 == FindKey) + { + s32Temp = 0; + s32Offset = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:gammaRGBValid_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stGamma.bValid = s32Temp; + + /* gammaRGB0 */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:gammaRGB0_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:gammaRGB0_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < s32Temp; j++) + { + g_IspDft[i].stGamma.au16Gamma[j] = MAEWeight[j]; + } + s32Offset += s32Temp; + + /* gammaRGB1 */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:gammaRGB1_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:gammaRGB1_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < s32Temp; j++) + { + g_IspDft[i].stGamma.au16Gamma[s32Offset + j] = MAEWeight[j]; + } + s32Offset += s32Temp; + + /* gammaRGB2 */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:gammaRGB2_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:gammaRGB2_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < s32Temp; j++) + { + g_IspDft[i].stGamma.au16Gamma[s32Offset + j] = MAEWeight[j]; + } + } + + /* gammafevalid */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:gammafevalid_%d", i); + FindKey = 0; + FindKey = iniparser_find_entry(g_dictionary, acTempStr); + if(1 == FindKey) + { + s32Temp = 0; + s32Offset = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:gammafevalid_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stGammafe.bValid = s32Temp; + + + /* gammafe0 */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:gammafe0_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if (NULL == pcTempStr) + { + printf("ISP:gammafe0_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = 0; + s32Temp = Weight(pcTempStr); + for (j = 0; j < s32Temp; j++) + { + g_IspDft[i].stGammafe.au16Gammafe0[j] = MAEWeight[j]; + } + + /* gammafe1.0 */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:gammafe1.0_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:gammafe1.0_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < s32Temp; j++) + { + g_IspDft[i].stGammafe.au16Gammafe1[j] = MAEWeight[j]; + } + s32Offset += s32Temp; + + /* gammafe1.1 */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:gammafe1.1_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:gammafe1.1_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < s32Temp; j++) + { + g_IspDft[i].stGammafe.au16Gammafe1[s32Offset + j] = MAEWeight[j]; + } + s32Offset += s32Temp; + + /* gammafe1.2 */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:gammafe1.2_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:gammafe1.2_%d error\n", i); + return HI_FAILURE; + } + + s32Temp = Weight(pcTempStr); + for (j = 0; j < s32Temp; j++) + { + g_IspDft[i].stGammafe.au16Gammafe1[s32Offset + j] = MAEWeight[j]; + } + } + + /* RGBsharpenLutValid */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:RGBsharpenLutValid_%d", i); + FindKey = 0; + FindKey = iniparser_find_entry(g_dictionary, acTempStr); + if(1 == FindKey) + { + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:RGBsharpenLutValid_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stRgbSharpen.bValid = s32Temp; + + /* Core */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:LutCore_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:LutCore_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stRgbSharpen.u8LutCore = s32Temp; + + /* LutStrength */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:LutStrength_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:LutStrength_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stRgbSharpen.u8LutStrength = s32Temp; + + /* LutMagnitude */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:LutMagnitude_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:LutMagnitude_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stRgbSharpen.u8LutMagnitude = s32Temp; + + } + + /* DrcEnable */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:DrcEnable_%d", i); + FindKey = 0; + FindKey = iniparser_find_entry(g_dictionary, acTempStr); + if(1 == FindKey) + { + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:DrcEnable_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDrc.bEnable = s32Temp; + + /* BlackLevel */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:BlackLevel_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:BlackLevel_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDrc.u32BlackLevel = s32Temp; + + /* WhiteLevel */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:WhiteLevel_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:WhiteLevel_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDrc.u32WhiteLevel = s32Temp; + + /* SlopeMax */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:SlopeMax_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:SlopeMax_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDrc.u32SlopeMax = s32Temp; + + /* SlopeMin */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:SlopeMin_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:SlopeMin_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDrc.u32SlopeMin = s32Temp; + + /* VarianceSpace */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:VarianceSpace_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:VarianceSpace_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDrc.u32VarianceSpace = s32Temp; + + /* VarianceIntensity */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:VarianceIntensity_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:VarianceIntensity_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stDrc.u32VarianceIntensity = s32Temp; + + } + + /* ShadingValid */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:ShadingValid_%d", i); + FindKey = 0; + FindKey = iniparser_find_entry(g_dictionary, acTempStr); + if(1 == FindKey) + { + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:ShadingValid_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.bValid = s32Temp; + + /* RCenterX */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:RCenterX_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:RCenterX_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16RCenterX = s32Temp; + + /* RCenterY */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:RCenterY_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:RCenterY_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16RCenterY = s32Temp; + + /* GCenterX */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:GCenterX_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:GCenterX_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16GCenterX = s32Temp; + + /* GCenterY */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:GCenterY_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:GCenterY_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16GCenterY = s32Temp; + + /* BCenterX */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:BCenterX_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:BCenterX_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16BCenterX = s32Temp; + + /* BCenterY */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:BCenterY_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:BCenterY_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16BCenterY = s32Temp; + + /* TblNodeNum */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:TblNodeNum_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:TblNodeNum_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16TblNodeNum = s32Temp; + + /* RShadingTbl */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:RShadingTbl_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:RShadingTbl_%d error\n", i); + return HI_FAILURE; + } + s32Temp = 0; + s32Temp = Weight(pcTempStr); + for (j = 0; j < g_IspDft[i].stShading.u16TblNodeNum; j++) + { + g_IspDft[i].stShading.au16RShadingTbl[j] = MAEWeight[j]; + } + + /* GShadingTbl */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:GShadingTbl_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:GShadingTbl_%d error\n", i); + return HI_FAILURE; + } + s32Temp = 0; + s32Temp = Weight(pcTempStr); + for (j = 0; j < g_IspDft[i].stShading.u16TblNodeNum; j++) + { + g_IspDft[i].stShading.au16GShadingTbl[j] = MAEWeight[j]; + } + + /* BShadingTbl */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:BShadingTbl_%d", i); + pcTempStr = iniparser_getstring(g_dictionary, acTempStr, "-1"); + if(NULL == pcTempStr) + { + printf("ISP:BShadingTbl_%d error\n", i); + return HI_FAILURE; + } + s32Temp = 0; + s32Temp = Weight(pcTempStr); + for (j = 0; j < g_IspDft[i].stShading.u16TblNodeNum; j++) + { + g_IspDft[i].stShading.au16BShadingTbl[j] = MAEWeight[j]; + } + + /* R\G\B offcenter */ + snprintf(acTempStr, sizeof(acTempStr), "ISP:ROffCenter_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:ROffCenter_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16ROffCenter = s32Temp; + + snprintf(acTempStr, sizeof(acTempStr), "ISP:GOffCenter_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:GOffCenter_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16GOffCenter = s32Temp; + + snprintf(acTempStr, sizeof(acTempStr), "ISP:BOffCenter_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_dictionary, acTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("ISP:BOffCenter_%d failed\n", i); + return HI_FAILURE; + } + g_IspDft[i].stShading.u16BOffCenter = s32Temp; + + } + + } + + return HI_SUCCESS; +} + + +HI_S32 Cmos_LoadINIPara(const HI_CHAR *pcName) +{ + HI_S32 s32Ret = HI_SUCCESS; + + if(NULL == pcName) + { + printf("null pointer when get inifile path!!!\n"); + return HI_FAILURE; + } + + s32Ret = Cmos_cfg_LoadFile(pcName); + if (HI_SUCCESS != s32Ret) + { + printf("%s load ini filename failed\n", pcName); + Cmos_cfg_FreeDict(); + return HI_FAILURE; + } + + s32Ret = cmos_loadAE_cfg(); + if (HI_SUCCESS != s32Ret) + { + printf("cmos_loadAE_cfg failed\n"); + Cmos_cfg_FreeDict(); + return HI_FAILURE; + } + + s32Ret = cmos_loadAWB_cfg(); + if (HI_SUCCESS != s32Ret) + { + printf("cmos_loadAWB_cfg failed\n"); + Cmos_cfg_FreeDict(); + return HI_FAILURE; + } + + s32Ret = cmos_loadISP_cfg(); + if (HI_SUCCESS != s32Ret) + { + printf("cmos_loadISP_cfg failed\n"); + Cmos_cfg_FreeDict(); + return HI_FAILURE; + } + + Cmos_cfg_FreeDict(); + + return HI_SUCCESS; +} + +#else + +#endif + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + diff --git a/device/mpp/component/isp/sensor/omnivision_ov9712/Makefile b/device/mpp/component/isp/sensor/omnivision_ov9712/Makefile new file mode 100644 index 0000000..89da126 --- /dev/null +++ b/device/mpp/component/isp/sensor/omnivision_ov9712/Makefile @@ -0,0 +1,75 @@ +# +# sensor lib Makefile +# + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../../../Makefile.param + include $(PARAM_FILE) +endif + +ISP_PATH := $(SDK_PATH)/mpp/component/isp +EXT_PATH := $(SDK_PATH)/mpp/$(EXTDRV) +3A_PATH := $(ISP_PATH)/3a +LIBPATH = $(ISP_PATH)/lib +OBJPATH = ./obj + +ifeq ($(CONFIG_GPIO_I2C),y) +HI_GPIO_I2C:=HI_GPIO_I2C +else +HI_GPIO_I2C:=HI_GPIO_XXX +endif + +ARFLAGS = rcv +ARFLAGS_SO = $(LIBS_LD_CFLAGS) +ARFLAGS_SO += -shared -fPIC -o +CFLAGS = -Wall -fPIC -D$(HI_FPGA) -D$(HI_GPIO_I2C) +CFLAGS += -O2 +CFLAGS += $(LIBS_CFLAGS) + +ifeq ($(ISP_INI_CONFIG), y) +CFLAGS += -D INIFILE_CONFIG_MODE +endif + +ifeq ($(HIGDB),HI_GDB) +CFLAGS += -g +endif + +ifeq ($(CONFIG_JPEGEDCF), y) + CFLAGS += -D ENABLE_JPEGEDCF +endif +BUS_DIR := $(EXT_PATH)/ssp-sony/ + +ISP_INC := $(ISP_PATH)/include +3A_INC := $(3A_PATH)/include +INC := -I$(BUS_DIR) -I$(REL_INC) -I$(ISP_INC) -I$(3A_INC) -I$(ISP_PATH)/iniparser + +ifeq ($(CONFIG_GPIO_I2C), y) + INC += -I$(EXT_PATH)/gpio-i2c-ex + INC += -I$(EXT_PATH)/gpio-i2c +else + INC += -I$(EXT_PATH)/i2c + INC += -I$(EXT_PATH)/hi_i2c +endif + +COMPILE = $(CC) $(CFLAGS) $(DFLAGS) -lm + +$(OBJPATH)/%.o: ./%.c + @[ -e $(LIBPATH) ] || mkdir $(LIBPATH) + @[ -e $(OBJPATH) ] || mkdir $(OBJPATH) + @$(COMPILE) -o $@ -c $< $(INC) + +SRCS = $(wildcard ./*.c) +OBJS = $(SRCS:%.c=%.o) +OBJS := $(OBJS:./%=obj/%) + +TARGETLIB := $(LIBPATH)/libsns_ov9712.a +TARGETLIB_SO := $(LIBPATH)/libsns_ov9712.so + +all:$(TARGETLIB) +$(TARGETLIB):$(OBJS) + @($(AR) $(ARFLAGS) $(TARGETLIB) $(OBJS)) + @($(CC) $(ARFLAGS_SO) $(TARGETLIB_SO) $(OBJS)) + +clean: + @$(RM) -rf $(TARGETLIB) $(OBJS) + @$(RM) -rf $(LIBPATH) $(OBJPATH) diff --git a/device/mpp/component/isp/sensor/omnivision_ov9712/build.sh b/device/mpp/component/isp/sensor/omnivision_ov9712/build.sh new file mode 100644 index 0000000..23d9c29 --- /dev/null +++ b/device/mpp/component/isp/sensor/omnivision_ov9712/build.sh @@ -0,0 +1,3 @@ +make clean;make +cp ../../lib/libsns_ov9712.so /home/x00226337/hi3518e/release_3518E/libs; +echo "cp down!!" diff --git a/device/mpp/component/isp/sensor/omnivision_ov9712/ov9712_cmos.c b/device/mpp/component/isp/sensor/omnivision_ov9712/ov9712_cmos.c new file mode 100644 index 0000000..0c25967 --- /dev/null +++ b/device/mpp/component/isp/sensor/omnivision_ov9712/ov9712_cmos.c @@ -0,0 +1,1123 @@ +#if !defined(__OV9712_CMOS_H_) +#define __OV9712_CMOS_H_ + +#include +#include +#include +#include "hi_comm_sns.h" +#include "hi_comm_video.h" +#include "hi_sns_ctrl.h" +#include "mpi_isp.h" +#include "mpi_ae.h" +#include "mpi_awb.h" +#include "mpi_af.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +#define OV9712_ID 9712 + + +/* To change the mode of config. ifndef INIFILE_CONFIG_MODE, quick config mode.*/ +/* else, cmos_cfg.ini file config mode*/ +#ifdef INIFILE_CONFIG_MODE + +extern AE_SENSOR_DEFAULT_S g_AeDft[]; +extern AWB_SENSOR_DEFAULT_S g_AwbDft[]; +extern ISP_CMOS_DEFAULT_S g_IspDft[]; +extern HI_S32 Cmos_LoadINIPara(const HI_CHAR *pcName); +#else + +#endif + +/**************************************************************************** + * local variables * + ****************************************************************************/ + +extern const unsigned int sensor_i2c_addr; +extern unsigned int sensor_addr_byte; +extern unsigned int sensor_data_byte; + +#define VMAX_ADDR_H (0x2e) +#define VMAX_ADDR_L (0x2d) + +#define SENSOR_720P_30FPS_MODE (1) + +#define INCREASE_LINES (0) /* make real fps less than stand fps because NVR require*/ +#define VMAX_720P30_LINEAR (810+INCREASE_LINES) +#define CMOS_OV9712_SLOW_FRAMERATE_MODE (0) + + + +HI_U8 gu8SensorImageMode = SENSOR_720P_30FPS_MODE; +WDR_MODE_E genSensorMode = WDR_MODE_NONE; + +static HI_U32 gu32FullLinesStd = VMAX_720P30_LINEAR; +static HI_U32 gu32FullLines = VMAX_720P30_LINEAR; + +static HI_BOOL bInit = HI_FALSE; +HI_BOOL bSensorInit = HI_FALSE; +ISP_SNS_REGS_INFO_S g_stSnsRegsInfo = {0}; +ISP_SNS_REGS_INFO_S g_stPreSnsRegsInfo = {0}; +static HI_U8 gu8Fps = 30; + + +/* AE default parameter and function */ +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*25/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x38; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2;//806 + pstAeSnsDft->u32MinIntTime = 1; + pstAeSnsDft->u32MaxIntTimeTarget = pstAeSnsDft->u32MaxIntTime; + pstAeSnsDft->u32MinIntTimeTarget = pstAeSnsDft->u32MinIntTime; + + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_DB; + pstAeSnsDft->stAgainAccu.f32Accuracy = 6; + pstAeSnsDft->u32MaxAgain = 4; /* 1, 2, 4, ... 16 (0~24db, unit is 6db) */ + pstAeSnsDft->u32MinAgain = 0; + pstAeSnsDft->u32MaxAgainTarget = 4; + pstAeSnsDft->u32MinAgainTarget = 0; + + + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.0625; + pstAeSnsDft->u32MaxDgain = 31; /* 1 ~ 31/16, unit is 1/16 */ + pstAeSnsDft->u32MinDgain = 16; + pstAeSnsDft->u32MaxDgainTarget = 32; + pstAeSnsDft->u32MinDgainTarget = 16; + + + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 8 << pstAeSnsDft->u32ISPDgainShift; + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + + return 0; +} + +/* the function of sensor set fps */ +static HI_VOID cmos_fps_set(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + HI_U32 tp = 1692; + HI_U32 u32VblankingLines = 0xFFFF; + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + if(SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + u32VblankingLines = tp * 30 / f32Fps + 3; + } + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + + sensor_write_register(0x2a, u32VblankingLines & 0xfc); + sensor_write_register(0x2b, (u32VblankingLines & 0xff00) >> 8); + + pstAeSnsDft->f32Fps = f32Fps; + pstAeSnsDft->u32MaxIntTime = 806; + gu32FullLinesStd = 810; + gu8Fps = f32Fps; + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd * f32Fps / 2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + + return; +} + +static HI_VOID cmos_slow_framerate_set(HI_U32 u32FullLines, + AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ +#if CMOS_OV9712_SLOW_FRAMERATE_MODE + HI_U32 u32Tp = 50760; /* (0x69c * 30) = 50760*/ + HI_U16 u16SlowFrameRate = (u32FullLines << 8) / gu32FullLinesStd; + u32Tp = (((u32Tp * u16SlowFrameRate) / gu8Fps) >> 8) + 3; + if (u32Tp > 0x2000) /* the register 0x2a adn 0x2b's max value is 0x2000 */ + { + u32Tp = 0x2000; + u16SlowFrameRate = ((gu8Fps * u32Tp) << 8) / 50760; + printf("Warning! The slow_framerate is out of ov9712's range!\n"); + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLines * (gu8Fps << 8) / (2*u16SlowFrameRate); + pstAeSnsDft->u32MaxIntTime = ((gu32FullLines * u16SlowFrameRate) >> 8) - 4; + + g_stSnsRegsInfo.u32RegNum = 5; + g_stSnsRegsInfo.astI2cData[3].u32Data = u32Tp & 0xfc; + g_stSnsRegsInfo.astI2cData[4].u32Data = (u32Tp & 0xff00) >> 8; + +#else + + u32FullLines = (u32FullLines > 0xFFFF) ? 0xFFFF : u32FullLines; + gu32FullLines = u32FullLines; + +//TODO: Ҫ޸ijAEͬ + //sensor_write_register (VMAX_ADDR_H, ((u32FullLines -VMAX_720P30_LINEAR ) & 0xFF00) >> 8); + //sensor_write_register (VMAX_ADDR_L, (u32FullLines -VMAX_720P30_LINEAR ) & 0xFF); + + g_stSnsRegsInfo.astI2cData[3].u32Data = (u32FullLines -VMAX_720P30_LINEAR ) & 0xFF; + g_stSnsRegsInfo.astI2cData[4].u32Data = ((u32FullLines -VMAX_720P30_LINEAR ) & 0xFF00) >> 8; + + pstAeSnsDft->u32MaxIntTime = gu32FullLines - 4; +#endif + return; +} + +/* while isp notify ae to update sensor regs, ae call these funcs. */ +static HI_VOID cmos_inttime_update(HI_U32 u32IntTime) +{ + g_stSnsRegsInfo.astI2cData[0].u32Data = u32IntTime & 0xFF; + g_stSnsRegsInfo.astI2cData[1].u32Data = (u32IntTime >> 8) & 0xFF; + + return; +} + +static HI_VOID cmos_again_calc_table(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb) +{ + + *pu32AgainDb = (*pu32AgainLin >> 3); + + return; +} + +static HI_VOID cmos_dgain_calc_table(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb) +{ + //*pu32AgainLin = (*pu32AgainLin >> 10) << 10; + + return; +} + +static HI_VOID cmos_gains_update(HI_U32 u32Again, HI_U32 u32Dgain) +{ + HI_U8 u8High, u8Low; + switch (u32Again) + { + case 0 : /* 0db, 1 multiplies */ + u8High = 0x00; + break; + case 1 : /* 6db, 2 multiplies */ + u8High = 0x10; + break; + case 2 : /* 12db, 4 multiplies */ + u8High = 0x30; + break; + case 3 : /* 18db, 8 multiplies */ + u8High = 0x70; + break; + case 4 : /* 24db, 16 multiplies */ + u8High = 0xf0; + break; + default: + u8High = 0x00; + break; + } + + u8Low = (u32Dgain - 16) & 0xf; + g_stSnsRegsInfo.astI2cData[2].u32Data = (u8High | u8Low); + + return; +} + +HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default; + pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set; + pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; + pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update; + pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update; + pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table; + pstExpFuncs->pfn_cmos_dgain_calc_table = cmos_dgain_calc_table; + + return 0; +} + + +/* AWB default parameter and function */ +static AWB_CCM_S g_stAwbCcm = +{ +#if 0 + 5120, + { + 0x0208, 0x80d0, 0x8038, + 0x8054, 0x01ae, 0x805a, + 0x000C, 0x80e2, 0x01d6 + }, + + 3633, + { + 0x01eb, 0x8097, 0x8054, + 0x8077, 0x01ce, 0x8057, + 0x0000, 0x8114, 0x0214 + }, + + 2465, + { + 0x01f4, 0x80ad, 0x8047, + 0x8088, 0x01c8, 0x8040, + 0x8023, 0x8211, 0x0334 + } +#endif + 5120, + { + 0x0217, 0x80df, 0x8038, + 0x8042, 0x01a6, 0x8064, + 0x0005, 0x811e, 0x0219 + }, + + 3633, + { + 0x01f2, 0x80a1, 0x8051, + 0x805a, 0x01a3, 0x8049, + 0x8011, 0x8141, 0x0252 + }, + + 2465, + { + 0x01e6, 0x80c6, 0x8020, + 0x806c, 0x014f, 0x001d, + 0x805a, 0x82a1, 0x03fb + } +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTable = +{ + /* bvalid */ + 1, + + /*1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768*/ + /* saturation */ + {0x7a,0x7a,0x78,0x74,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x38,0x38,0x38,0x38,0x38} + +}; + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + + pstAwbSnsDft->u16WbRefTemp = 5120; + pstAwbSnsDft->au16GainOffset[0] = 0x17d; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x170; + pstAwbSnsDft->as32WbPara[0] = 67; + pstAwbSnsDft->as32WbPara[1] = 241; + pstAwbSnsDft->as32WbPara[2] = 53; + pstAwbSnsDft->as32WbPara[3] = 215435; + pstAwbSnsDft->as32WbPara[4] = 128; + pstAwbSnsDft->as32WbPara[5] = -161453; + + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTable, sizeof(AWB_AGC_TABLE_S)); + + return 0; +} + +HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default; + + return 0; +} + +#define DMNR_CALIB_CARVE_NUM_OV9712 11 + +float g_coef_calib_ov9712[DMNR_CALIB_CARVE_NUM_OV9712][4] = +{ + {100.000000f, 2.000000f, 0.038318f, 8.825197f, }, + {200.000000f, 2.301030f, 0.044073f, 8.286962f, }, + {400.000000f, 2.602060f, 0.044098f, 9.092120f, }, + {800.000000f, 2.903090f, 0.047732f, 10.356674f, }, + {1600.000000f, 3.204120f, 0.051677f, 13.629107f, }, + {3300.000000f, 3.518514f, 0.058334f, 19.530838f, }, + {5600.000000f, 3.748188f, 0.072166f, 25.358517f, }, + {7100.000000f, 3.851258f, 0.082855f, 36.527088f, }, + {11300.000000f, 4.053079f, 0.097958f, 43.649172f, }, + {12300.000000f, 4.089905f, 0.097744f, 58.210743f, }, + {24600.000000f, 4.390935f, 0.096482f, 80.523537f, }, +}; + + +static ISP_NR_ISO_PARA_TABLE_S g_stNrIsoParaTab[HI_ISP_NR_ISO_LEVEL_MAX] = +{ + //u16Threshold//u8varStrength//u8fixStrength//u8LowFreqSlope + {1500, 160, 256-256, 0 }, //100 // // + {1500, 120, 256-256, 0 }, //200 // ISO // ISO //u8LowFreqSlope + {1500, 100, 256-256, 0 }, //400 //{400, 1200, 96,256}, //{400 , 0 } + {1750, 80, 256-256, 8 }, //800 //{800, 1400, 80,256}, //{600 , 2 } + {1500, 255, 256-256, 6 }, //1600 //{1600, 1200, 72,256}, //{800 , 8 } + {1500, 255, 256-256, 0 }, //3200 //{3200, 1200, 64,256}, //{1000, 12 } + {1375, 255, 256-256, 0 }, //6400 //{6400, 1100, 56,256}, //{1600, 6 } + {1375, 255, 256-256, 0 }, //12800 //{12000,1100, 48,256}, //{2400, 0 } + {1375, 255, 256-256, 0 }, //25600 //{36000,1100, 48,256}, // + {1375, 255, 256-256, 0 }, //51200 //{64000,1100, 96,256}, // + {1250, 255, 256-256, 0 }, //102400 //{82000,1000,240,256}, // + {1250, 255, 256-256, 0 }, //204800 // // + {1250, 255, 256-256, 0 }, //409600 // // + {1250, 255, 256-256, 0 }, //819200 // // + {1250, 255, 256-256, 0 }, //1638400// // + {1250, 255, 256-256, 0 }, //3276800// // +}; + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaic = +{ + /*For Demosaic*/ + 1, /*bEnable*/ + 24,/*u16VhLimit*/ + 40-24,/*u16VhOffset*/ + 24, /*u16VhSlope*/ + /*False Color*/ + 1, /*bFcrEnable*/ + { 8, 8, 8, 8, 8, 8, 8, 8, 3, 0, 0, 0, 0, 0, 0, 0}, /*au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]*/ + {24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24}, /*au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]*/ + /*For Ahd*/ + 400, /*u16UuSlope*/ + {512,512,512,512,512,512,512, 400, 0,0,0,0,0,0,0,0} /*au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_GE_S g_stIspGe = +{ + /*For GE*/ + 1, /*bEnable*/ + 7, /*u8Slope*/ + 7, /*u8Sensitivity*/ + 8192, /*u16Threshold*/ + 8192, /*u16SensiThreshold*/ + {1024,1024,1024,2048,2048,2048,2048, 2048, 2048,2048,2048,2048,2048,2048,2048,2048} /*au16Strength[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; +#if 0 +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpen = +{ + //{100,200,400,800,1600,3200,6400,12800,25600,51200,102400,204800,409600,819200,1638400,3276800}; + {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},/* enPixSel = ~bEnLowLumaShoot */ + {30, 30, 32, 35, 35, 60, 100, 120, 160, 200, 250, 250, 250, 250, 250, 250},/*maxSharpAmt1 = SharpenUD*16 */ + {80, 80, 100, 140, 180, 200, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250},/*maxEdgeAmt = SharpenD*16 */ + {0, 0, 0, 0, 0, 0, 20, 40, 90, 120, 180, 250, 250, 250, 250, 250},/*sharpThd2 = TextureNoiseThd*4 */ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},/*edgeThd2 = EdgeNoiseThd*4 */ + {255, 220, 200, 160, 120, 80, 30, 20, 0, 0, 0, 0, 0, 0, 0, 0},/*overshootAmt*/ + {255, 255, 220, 200, 160, 130,100, 70, 30, 0, 0, 0, 0, 0, 0, 0},/*undershootAmt*/ +}; +#else +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpen = +{ + //{100,200,400,800,1600,3200,6400,12800,25600,51200,102400,204800,409600,819200,1638400,3276800}; + {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},/* enPixSel = ~bEnLowLumaShoot */ + + {120, 64, 64, 43, 43, 43, 18, 18, 18, 200, 250, 250, 250, 250, 250, 250},/*maxSharpAmt1 = SharpenUD*16 */ + {128, 200, 103, 86, 86, 86, 80, 80, 80, 250, 250, 250, 250, 250, 250, 250},/*maxEdgeAmt = SharpenD*16 */ + + {0, 0, 0, 0, 0, 0, 0, 40, 190, 200, 220, 250, 250, 250, 250, 250},/*sharpThd2 = TextureNoiseThd*4 */ + {0, 0, 0, 0, 0, 0, 0, 60, 140, 0, 0, 0, 0, 0, 0, 0},/*edgeThd2 = EdgeNoiseThd*4 */ + {59, 59, 59, 59, 59, 59, 59, 59, 101, 0, 0, 0, 0, 0, 0, 0},/*overshootAmt*/ + {117, 117, 117, 108, 108, 108, 122, 122, 139, 0, 0, 0, 0, 0, 0, 0},/*undershootAmt*/ +}; + +#endif + +static ISP_CMOS_UVNR_S g_stIspUVNR = +{ + /*ֵ˲лUVNRISOֵ*/ + /*UVNRлֵ˲ISOֵ*/ + /*0.0 -> disable(0.0, 1.0] -> weak(1.0, 2.0] -> normal(2.0, 10.0) -> strong*/ + /*˹˲ı׼*/ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; + {1, 2, 4, 5, 7, 48, 32, 16, 16, 16, 16, 16, 16, 16, 16, 16}, /*UVNRThreshold*/ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2}, /*Coring_lutLimit*/ + {0, 0, 0, 16, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34} /*UVNR_blendRatio*/ +}; + +static ISP_CMOS_DPC_S g_stCmosDpc = +{ + //1,/*IR_channel*/ + //1,/*IR_position*/ + {0,0,0,1,1,1,2,2,2,3,3,3,3,3,3,3},/*au16Strength[16]*/ + {0,0,0,0,0,0,0,0,0x24,0x80,0x80,0x80,0xE5,0xE5,0xE5,0xE5},/*au16BlendRatio[16]*/ +}; + +static ISP_LSC_CABLI_TABLE_S g_stCmosLscTable[HI_ISP_LSC_LIGHT_NUM] = +{ + //-------------------------------------------- + // single light default + //-------------------------------------------- + //3000K + { + { + 11307189, 11185344, 11161290, 11258134, 11406593, 11356673, 11137339, 10812500, 10591836, 10657084, 11019108, 11209503, 11331877, 11307189, 11282608, 11258134, 11209503, + 11282608, 11161290, 11137339, 11282608, 11381578, 11356673, 11161290, 10812500, 10548780, 10657084, 11019108, 11209503, 11331877, 11331877, 11282608, 11258134, 11233766, + 11282608, 11161290, 11137339, 11307189, 11406593, 11381578, 11161290, 10745341, 10484848, 10635245, 11042553, 11185344, 11331877, 11356673, 11282608, 11233766, 11185344, + 11282608, 11161290, 11161290, 11307189, 11381578, 11356673, 11113490, 10701030, 10400801, 10548780, 10995762, 11185344, 11331877, 11356673, 11307189, 11258134, 11233766, + 11282608, 11185344, 11185344, 11307189, 11356673, 11307189, 11089743, 10591836, 10338645, 10442655, 10880503, 11233766, 11331877, 11282608, 11307189, 11233766, 11185344, + 11233766, 11137339, 11137339, 11307189, 11307189, 11258134, 10972515, 10463709, 10196463, 10338645, 10812500, 11137339, 11307189, 11307189, 11282608, 11233766, 11209503, + 11233766, 11137339, 11089743, 11233766, 11356673, 11209503, 10812500, 10338645, 10256916, 10256916, 10657084, 11066098, 11282608, 11282608, 11282608, 11209503, 11161290, + 11233766, 11137339, 11113490, 11209503, 11185344, 11066098, 10701030, 10236686, 10297619, 10136718, 10591836, 10995762, 11233766, 11282608, 11307189, 11185344, 11137339, + 11209503, 11113490, 11066098, 11137339, 11137339, 10972515, 10613496, 10176470, 10000000, 10156555, 10570264, 11019108, 11185344, 11282608, 11258134, 11209503, 11185344, + 11113490, 11019108, 10995762, 11113490, 11089743, 10972515, 10570264, 10196463, 10077669, 10156555, 10570264, 10995762, 11161290, 11258134, 11233766, 11161290, 11161290, + 11185344, 11042553, 10995762, 11113490, 11113490, 10995762, 10679012, 10256916, 10176470, 10236686, 10723140, 10995762, 11233766, 11307189, 11258134, 11161290, 11137339, + 11161290, 11066098, 11066098, 11113490, 11113490, 10995762, 10723140, 10338645, 10256916, 10338645, 10767634, 11089743, 11233766, 11331877, 11258134, 11233766, 11209503, + 11209503, 11113490, 11161290, 11137339, 11113490, 11019108, 10790020, 10400801, 10359281, 10463709, 10880503, 11113490, 11233766, 11406593, 11307189, 11209503, 11185344, + 11233766, 11089743, 11042553, 11137339, 11089743, 11019108, 10835073, 10484848, 10421686, 10527383, 10903361, 11161290, 11282608, 11307189, 11282608, 11258134, 11233766, + 11258134, 11089743, 11066098, 11161290, 11089743, 11042553, 10835073, 10548780, 10463709, 10570264, 10926315, 11209503, 11307189, 11307189, 11282608, 11258134, 11258134, + 11258134, 11089743, 11042553, 11185344, 11089743, 11066098, 10880503, 10613496, 10506072, 10613496, 10949367, 11209503, 11307189, 11331877, 11282608, 11258134, 11282608, + 11258134, 11089743, 11066098, 11185344, 11089743, 11066098, 10903361, 10657084, 10527383, 10613496, 10972515, 11209503, 11307189, 11307189, 11307189, 11258134, 11282608, + }, + { + 12036585, 12140221, 12337499, 12477876, 12493670, 12477876, 12276119, 11792114, 11279999, 11778042, 12306733, 12653846, 12702702, 12702702, 12621483, 12509505, 12509505, + 12007299, 12110429, 12352941, 12477876, 12525380, 12493670, 12260869, 11764004, 11241457, 11736028, 12337499, 12637644, 12719072, 12768434, 12637644, 12541296, 12525380, + 12036585, 12125307, 12337499, 12493670, 12557251, 12509505, 12245657, 11680473, 11152542, 11666666, 12337499, 12637644, 12751937, 12801556, 12702702, 12589285, 12541296, + 12036585, 12155172, 12368421, 12541296, 12541296, 12493670, 12230483, 11557377, 11027932, 11530373, 12291407, 12653846, 12768434, 12851562, 12735483, 12621483, 12557251, + 12036585, 12140221, 12368421, 12525380, 12525380, 12462121, 12080783, 11357882, 10822368, 11344827, 12185185, 12605363, 12784974, 12818181, 12735483, 12653846, 12589285, + 12080783, 12170160, 12352941, 12477876, 12462121, 12368421, 11905910, 11077441, 10578778, 11127395, 11963636, 12493670, 12768434, 12818181, 12735483, 12621483, 12573248, + 12036585, 12140221, 12322097, 12446406, 12509505, 12215346, 11652892, 10763358, 10444444, 10822368, 11750000, 12337499, 12735483, 12784974, 12735483, 12589285, 12541296, + 11992709, 12110429, 12291407, 12337499, 12260869, 12007299, 11331802, 10466595, 10378548, 10544871, 11463414, 12170160, 12573248, 12686375, 12702702, 12557251, 12462121, + 11920289, 12021924, 12215346, 12185185, 12095588, 11778042, 11102362, 10270551, 10000000, 10378548, 11241457, 12080783, 12383939, 12557251, 12573248, 12493670, 12430730, + 11934703, 11992709, 12140221, 12200247, 12080783, 11820359, 11177802, 10378548, 10081716, 10511182, 11384083, 12095588, 12462121, 12557251, 12573248, 12462121, 12383939, + 12007299, 12051282, 12185185, 12230483, 12155172, 11949152, 11410404, 10658747, 10281250, 10786885, 11611764, 12230483, 12525380, 12621483, 12573248, 12493670, 12446406, + 11978155, 12066014, 12291407, 12245657, 12200247, 12007299, 11611764, 10858085, 10522388, 11003344, 11820359, 12352941, 12525380, 12589285, 12589285, 12525380, 12462121, + 11992709, 12110429, 12415094, 12276119, 12230483, 12110429, 11764004, 11065022, 10739934, 11228668, 12036585, 12415094, 12557251, 12702702, 12637644, 12541296, 12509505, + 12051282, 12095588, 12245657, 12230483, 12215346, 12125307, 11834532, 11254275, 10906077, 11370967, 12080783, 12462121, 12621483, 12621483, 12589285, 12573248, 12557251, + 12095588, 12140221, 12230483, 12245657, 12230483, 12155172, 11877256, 11370967, 11040268, 11516919, 12125307, 12557251, 12637644, 12621483, 12573248, 12557251, 12525380, + 12110429, 12155172, 12245657, 12260869, 12230483, 12155172, 11920289, 11423611, 11127395, 11570926, 12170160, 12573248, 12653846, 12621483, 12573248, 12525380, 12525380, + 12110429, 12155172, 12276119, 12245657, 12215346, 12185185, 11949152, 11463414, 11177802, 11598119, 12185185, 12557251, 12637644, 12605363, 12573248, 12541296, 12573248, + }, + { + 11871202, 11973039, 12151741, 12273869, 12304785, 12243107, 12166874, 11700598, 11294797, 11686602, 12273869, 12445859, 12541720, 12557840, 12445859, 12367088, 12351453, + 11871202, 11973039, 12166874, 12304785, 12320302, 12258469, 12136645, 11672640, 11255760, 11658711, 12258469, 12461734, 12541720, 12574002, 12430025, 12382762, 12367088, + 11885644, 11987730, 12182044, 12304785, 12320302, 12273869, 12106567, 11617122, 11178489, 11617122, 12243107, 12445859, 12557840, 12622739, 12461734, 12398477, 12382762, + 11900121, 11987730, 12212500, 12320302, 12351453, 12258469, 12061728, 11494117, 11039548, 11494117, 12197253, 12414231, 12557840, 12622739, 12493606, 12430025, 12414231, + 11885644, 11987730, 12212500, 12304785, 12320302, 12227784, 11929181, 11294797, 10855555, 11294797, 12017220, 12382762, 12541720, 12557840, 12477650, 12445859, 12414231, + 11900121, 11958384, 12151741, 12258469, 12258469, 12076637, 11742788, 11014656, 10562162, 11039548, 11799516, 12273869, 12477650, 12541720, 12477650, 12382762, 12335858, + 11914634, 11973039, 12106567, 12182044, 12243107, 12002457, 11480611, 10712719, 10393617, 10712719, 11548463, 12106567, 12398477, 12461734, 12430025, 12351453, 12320302, + 11900121, 11987730, 12166874, 12166874, 12091584, 11813784, 11216991, 10449197, 10338624, 10426894, 11268742, 11973039, 12304785, 12414231, 12445859, 12351453, 12335858, + 11929181, 12017220, 12136645, 12151741, 12061728, 11714628, 11102272, 10338624, 10000000, 10338624, 11152968, 11900121, 12273869, 12430025, 12430025, 12351453, 12335858, + 11987730, 12046855, 12166874, 12182044, 12091584, 11828087, 11229885, 10426894, 10092975, 10438034, 11255760, 11914634, 12273869, 12398477, 12430025, 12335858, 12227784, + 12017220, 12091584, 12212500, 12243107, 12212500, 11973039, 11494117, 10712719, 10295047, 10665938, 11480611, 12002457, 12289308, 12430025, 12382762, 12335858, 12320302, + 12046855, 12136645, 12289308, 12304785, 12243107, 12136645, 11686602, 10952914, 10516684, 10916201, 11672640, 12166874, 12367088, 12430025, 12398477, 12382762, 12367088, + 12076637, 12166874, 12445859, 12335858, 12335858, 12182044, 11885644, 11178489, 10748074, 11165714, 11900121, 12243107, 12398477, 12493606, 12445859, 12335858, 12289308, + 12106567, 12151741, 12289308, 12320302, 12304785, 12258469, 11973039, 11373690, 10952914, 11360465, 12002457, 12320302, 12445859, 12445859, 12382762, 12335858, 12320302, + 12151741, 12212500, 12320302, 12335858, 12320302, 12289308, 12032019, 11507656, 11077097, 11494117, 12032019, 12398477, 12477650, 12445859, 12414231, 12382762, 12367088, + 12182044, 12243107, 12335858, 12304785, 12335858, 12289308, 12046855, 11589561, 11165714, 11575829, 12076637, 12414231, 12461734, 12445859, 12430025, 12414231, 12382762, + 12197253, 12243107, 12335858, 12304785, 12335858, 12320302, 12091584, 11617122, 11216991, 11589561, 12106567, 12398477, 12445859, 12430025, 12445859, 12430025, 12382762, + }, + { + 12536136, 12503276, 12552631, 12669322, 12686170, 12585751, 12389610, 11850931, 11425149, 11895261, 12585751, 12926829, 13032786, 13015006, 12961956, 12926829, 12926829, + 12536136, 12519685, 12585751, 12686170, 12686170, 12602377, 12357512, 11806930, 11370679, 11865671, 12585751, 12926829, 13032786, 13050615, 12979591, 12926829, 12909336, + 12536136, 12536136, 12619047, 12686170, 12686170, 12585751, 12325581, 11734317, 11276595, 11792336, 12602377, 12891891, 13032786, 13068493, 13015006, 12944369, 12926829, + 12536136, 12552631, 12619047, 12686170, 12686170, 12569169, 12309677, 11605839, 11144859, 11676866, 12503276, 12857142, 13015006, 13086419, 13032786, 12979591, 12944369, + 12536136, 12536136, 12569169, 12686170, 12652519, 12536136, 12183908, 11425149, 10965517, 11493975, 12325581, 12822580, 13032786, 13068493, 13050615, 12997275, 12961956, + 12536136, 12536136, 12536136, 12619047, 12585751, 12389610, 11939924, 11157894, 10671140, 11210340, 12121982, 12736982, 12961956, 13015006, 13032786, 12961956, 12944369, + 12454308, 12470588, 12503276, 12552631, 12619047, 12293814, 11705521, 10828603, 10495049, 10865603, 11836228, 12519685, 12839838, 12979591, 13015006, 12961956, 12926829, + 12470588, 12486910, 12519685, 12486910, 12421875, 12060682, 11397849, 10541436, 10380848, 10611790, 11563636, 12325581, 12771084, 12891891, 12961956, 12874493, 12839838, + 12438070, 12454308, 12503276, 12454308, 12309677, 11939924, 11223529, 10358306, 10000000, 10403489, 11370679, 12230769, 12585751, 12822580, 12874493, 12857142, 12822580, + 12421875, 12421875, 12486910, 12486910, 12357512, 12045454, 11370679, 10460526, 10095238, 10529801, 11480144, 12230769, 12619047, 12788203, 12839838, 12805369, 12805369, + 12519685, 12486910, 12519685, 12519685, 12470588, 12199488, 11648351, 10767494, 10313513, 10779661, 11734317, 12389610, 12736982, 12805369, 12822580, 12822580, 12822580, + 12536136, 12552631, 12635761, 12585751, 12503276, 12325581, 11865671, 11003460, 10576496, 11041666, 11924999, 12552631, 12771084, 12857142, 12839838, 12805369, 12788203, + 12503276, 12552631, 12736982, 12602377, 12569169, 12405721, 12060682, 11276595, 10804077, 11303317, 12137404, 12602377, 12754010, 12891891, 12857142, 12805369, 12771084, + 12519685, 12519685, 12536136, 12585751, 12585751, 12470588, 12168367, 11480144, 11016166, 11452581, 12230769, 12652519, 12839838, 12805369, 12822580, 12822580, 12839838, + 12536136, 12536136, 12552631, 12602377, 12602377, 12536136, 12230769, 11591737, 11157894, 11591737, 12277992, 12736982, 12839838, 12788203, 12822580, 12822580, 12839838, + 12585751, 12569169, 12552631, 12619047, 12619047, 12536136, 12246469, 11648351, 11236749, 11662591, 12309677, 12754010, 12839838, 12805369, 12822580, 12822580, 12857142, + 12602377, 12552631, 12536136, 12602377, 12619047, 12536136, 12277992, 11662591, 11250000, 11705521, 12357512, 12736982, 12839838, 12839838, 12822580, 12805369, 12822580, + }, + }, + { + { + 11307189, 11185344, 11161290, 11258134, 11406593, 11356673, 11137339, 10812500, 10591836, 10657084, 11019108, 11209503, 11331877, 11307189, 11282608, 11258134, 11209503, + 11282608, 11161290, 11137339, 11282608, 11381578, 11356673, 11161290, 10812500, 10548780, 10657084, 11019108, 11209503, 11331877, 11331877, 11282608, 11258134, 11233766, + 11282608, 11161290, 11137339, 11307189, 11406593, 11381578, 11161290, 10745341, 10484848, 10635245, 11042553, 11185344, 11331877, 11356673, 11282608, 11233766, 11185344, + 11282608, 11161290, 11161290, 11307189, 11381578, 11356673, 11113490, 10701030, 10400801, 10548780, 10995762, 11185344, 11331877, 11356673, 11307189, 11258134, 11233766, + 11282608, 11185344, 11185344, 11307189, 11356673, 11307189, 11089743, 10591836, 10338645, 10442655, 10880503, 11233766, 11331877, 11282608, 11307189, 11233766, 11185344, + 11233766, 11137339, 11137339, 11307189, 11307189, 11258134, 10972515, 10463709, 10196463, 10338645, 10812500, 11137339, 11307189, 11307189, 11282608, 11233766, 11209503, + 11233766, 11137339, 11089743, 11233766, 11356673, 11209503, 10812500, 10338645, 10256916, 10256916, 10657084, 11066098, 11282608, 11282608, 11282608, 11209503, 11161290, + 11233766, 11137339, 11113490, 11209503, 11185344, 11066098, 10701030, 10236686, 10297619, 10136718, 10591836, 10995762, 11233766, 11282608, 11307189, 11185344, 11137339, + 11209503, 11113490, 11066098, 11137339, 11137339, 10972515, 10613496, 10176470, 10000000, 10156555, 10570264, 11019108, 11185344, 11282608, 11258134, 11209503, 11185344, + 11113490, 11019108, 10995762, 11113490, 11089743, 10972515, 10570264, 10196463, 10077669, 10156555, 10570264, 10995762, 11161290, 11258134, 11233766, 11161290, 11161290, + 11185344, 11042553, 10995762, 11113490, 11113490, 10995762, 10679012, 10256916, 10176470, 10236686, 10723140, 10995762, 11233766, 11307189, 11258134, 11161290, 11137339, + 11161290, 11066098, 11066098, 11113490, 11113490, 10995762, 10723140, 10338645, 10256916, 10338645, 10767634, 11089743, 11233766, 11331877, 11258134, 11233766, 11209503, + 11209503, 11113490, 11161290, 11137339, 11113490, 11019108, 10790020, 10400801, 10359281, 10463709, 10880503, 11113490, 11233766, 11406593, 11307189, 11209503, 11185344, + 11233766, 11089743, 11042553, 11137339, 11089743, 11019108, 10835073, 10484848, 10421686, 10527383, 10903361, 11161290, 11282608, 11307189, 11282608, 11258134, 11233766, + 11258134, 11089743, 11066098, 11161290, 11089743, 11042553, 10835073, 10548780, 10463709, 10570264, 10926315, 11209503, 11307189, 11307189, 11282608, 11258134, 11258134, + 11258134, 11089743, 11042553, 11185344, 11089743, 11066098, 10880503, 10613496, 10506072, 10613496, 10949367, 11209503, 11307189, 11331877, 11282608, 11258134, 11282608, + 11258134, 11089743, 11066098, 11185344, 11089743, 11066098, 10903361, 10657084, 10527383, 10613496, 10972515, 11209503, 11307189, 11307189, 11307189, 11258134, 11282608, + }, + { + 12036585, 12140221, 12337499, 12477876, 12493670, 12477876, 12276119, 11792114, 11279999, 11778042, 12306733, 12653846, 12702702, 12702702, 12621483, 12509505, 12509505, + 12007299, 12110429, 12352941, 12477876, 12525380, 12493670, 12260869, 11764004, 11241457, 11736028, 12337499, 12637644, 12719072, 12768434, 12637644, 12541296, 12525380, + 12036585, 12125307, 12337499, 12493670, 12557251, 12509505, 12245657, 11680473, 11152542, 11666666, 12337499, 12637644, 12751937, 12801556, 12702702, 12589285, 12541296, + 12036585, 12155172, 12368421, 12541296, 12541296, 12493670, 12230483, 11557377, 11027932, 11530373, 12291407, 12653846, 12768434, 12851562, 12735483, 12621483, 12557251, + 12036585, 12140221, 12368421, 12525380, 12525380, 12462121, 12080783, 11357882, 10822368, 11344827, 12185185, 12605363, 12784974, 12818181, 12735483, 12653846, 12589285, + 12080783, 12170160, 12352941, 12477876, 12462121, 12368421, 11905910, 11077441, 10578778, 11127395, 11963636, 12493670, 12768434, 12818181, 12735483, 12621483, 12573248, + 12036585, 12140221, 12322097, 12446406, 12509505, 12215346, 11652892, 10763358, 10444444, 10822368, 11750000, 12337499, 12735483, 12784974, 12735483, 12589285, 12541296, + 11992709, 12110429, 12291407, 12337499, 12260869, 12007299, 11331802, 10466595, 10378548, 10544871, 11463414, 12170160, 12573248, 12686375, 12702702, 12557251, 12462121, + 11920289, 12021924, 12215346, 12185185, 12095588, 11778042, 11102362, 10270551, 10000000, 10378548, 11241457, 12080783, 12383939, 12557251, 12573248, 12493670, 12430730, + 11934703, 11992709, 12140221, 12200247, 12080783, 11820359, 11177802, 10378548, 10081716, 10511182, 11384083, 12095588, 12462121, 12557251, 12573248, 12462121, 12383939, + 12007299, 12051282, 12185185, 12230483, 12155172, 11949152, 11410404, 10658747, 10281250, 10786885, 11611764, 12230483, 12525380, 12621483, 12573248, 12493670, 12446406, + 11978155, 12066014, 12291407, 12245657, 12200247, 12007299, 11611764, 10858085, 10522388, 11003344, 11820359, 12352941, 12525380, 12589285, 12589285, 12525380, 12462121, + 11992709, 12110429, 12415094, 12276119, 12230483, 12110429, 11764004, 11065022, 10739934, 11228668, 12036585, 12415094, 12557251, 12702702, 12637644, 12541296, 12509505, + 12051282, 12095588, 12245657, 12230483, 12215346, 12125307, 11834532, 11254275, 10906077, 11370967, 12080783, 12462121, 12621483, 12621483, 12589285, 12573248, 12557251, + 12095588, 12140221, 12230483, 12245657, 12230483, 12155172, 11877256, 11370967, 11040268, 11516919, 12125307, 12557251, 12637644, 12621483, 12573248, 12557251, 12525380, + 12110429, 12155172, 12245657, 12260869, 12230483, 12155172, 11920289, 11423611, 11127395, 11570926, 12170160, 12573248, 12653846, 12621483, 12573248, 12525380, 12525380, + 12110429, 12155172, 12276119, 12245657, 12215346, 12185185, 11949152, 11463414, 11177802, 11598119, 12185185, 12557251, 12637644, 12605363, 12573248, 12541296, 12573248, + }, + { + 11871202, 11973039, 12151741, 12273869, 12304785, 12243107, 12166874, 11700598, 11294797, 11686602, 12273869, 12445859, 12541720, 12557840, 12445859, 12367088, 12351453, + 11871202, 11973039, 12166874, 12304785, 12320302, 12258469, 12136645, 11672640, 11255760, 11658711, 12258469, 12461734, 12541720, 12574002, 12430025, 12382762, 12367088, + 11885644, 11987730, 12182044, 12304785, 12320302, 12273869, 12106567, 11617122, 11178489, 11617122, 12243107, 12445859, 12557840, 12622739, 12461734, 12398477, 12382762, + 11900121, 11987730, 12212500, 12320302, 12351453, 12258469, 12061728, 11494117, 11039548, 11494117, 12197253, 12414231, 12557840, 12622739, 12493606, 12430025, 12414231, + 11885644, 11987730, 12212500, 12304785, 12320302, 12227784, 11929181, 11294797, 10855555, 11294797, 12017220, 12382762, 12541720, 12557840, 12477650, 12445859, 12414231, + 11900121, 11958384, 12151741, 12258469, 12258469, 12076637, 11742788, 11014656, 10562162, 11039548, 11799516, 12273869, 12477650, 12541720, 12477650, 12382762, 12335858, + 11914634, 11973039, 12106567, 12182044, 12243107, 12002457, 11480611, 10712719, 10393617, 10712719, 11548463, 12106567, 12398477, 12461734, 12430025, 12351453, 12320302, + 11900121, 11987730, 12166874, 12166874, 12091584, 11813784, 11216991, 10449197, 10338624, 10426894, 11268742, 11973039, 12304785, 12414231, 12445859, 12351453, 12335858, + 11929181, 12017220, 12136645, 12151741, 12061728, 11714628, 11102272, 10338624, 10000000, 10338624, 11152968, 11900121, 12273869, 12430025, 12430025, 12351453, 12335858, + 11987730, 12046855, 12166874, 12182044, 12091584, 11828087, 11229885, 10426894, 10092975, 10438034, 11255760, 11914634, 12273869, 12398477, 12430025, 12335858, 12227784, + 12017220, 12091584, 12212500, 12243107, 12212500, 11973039, 11494117, 10712719, 10295047, 10665938, 11480611, 12002457, 12289308, 12430025, 12382762, 12335858, 12320302, + 12046855, 12136645, 12289308, 12304785, 12243107, 12136645, 11686602, 10952914, 10516684, 10916201, 11672640, 12166874, 12367088, 12430025, 12398477, 12382762, 12367088, + 12076637, 12166874, 12445859, 12335858, 12335858, 12182044, 11885644, 11178489, 10748074, 11165714, 11900121, 12243107, 12398477, 12493606, 12445859, 12335858, 12289308, + 12106567, 12151741, 12289308, 12320302, 12304785, 12258469, 11973039, 11373690, 10952914, 11360465, 12002457, 12320302, 12445859, 12445859, 12382762, 12335858, 12320302, + 12151741, 12212500, 12320302, 12335858, 12320302, 12289308, 12032019, 11507656, 11077097, 11494117, 12032019, 12398477, 12477650, 12445859, 12414231, 12382762, 12367088, + 12182044, 12243107, 12335858, 12304785, 12335858, 12289308, 12046855, 11589561, 11165714, 11575829, 12076637, 12414231, 12461734, 12445859, 12430025, 12414231, 12382762, + 12197253, 12243107, 12335858, 12304785, 12335858, 12320302, 12091584, 11617122, 11216991, 11589561, 12106567, 12398477, 12445859, 12430025, 12445859, 12430025, 12382762, + }, + { + 12536136, 12503276, 12552631, 12669322, 12686170, 12585751, 12389610, 11850931, 11425149, 11895261, 12585751, 12926829, 13032786, 13015006, 12961956, 12926829, 12926829, + 12536136, 12519685, 12585751, 12686170, 12686170, 12602377, 12357512, 11806930, 11370679, 11865671, 12585751, 12926829, 13032786, 13050615, 12979591, 12926829, 12909336, + 12536136, 12536136, 12619047, 12686170, 12686170, 12585751, 12325581, 11734317, 11276595, 11792336, 12602377, 12891891, 13032786, 13068493, 13015006, 12944369, 12926829, + 12536136, 12552631, 12619047, 12686170, 12686170, 12569169, 12309677, 11605839, 11144859, 11676866, 12503276, 12857142, 13015006, 13086419, 13032786, 12979591, 12944369, + 12536136, 12536136, 12569169, 12686170, 12652519, 12536136, 12183908, 11425149, 10965517, 11493975, 12325581, 12822580, 13032786, 13068493, 13050615, 12997275, 12961956, + 12536136, 12536136, 12536136, 12619047, 12585751, 12389610, 11939924, 11157894, 10671140, 11210340, 12121982, 12736982, 12961956, 13015006, 13032786, 12961956, 12944369, + 12454308, 12470588, 12503276, 12552631, 12619047, 12293814, 11705521, 10828603, 10495049, 10865603, 11836228, 12519685, 12839838, 12979591, 13015006, 12961956, 12926829, + 12470588, 12486910, 12519685, 12486910, 12421875, 12060682, 11397849, 10541436, 10380848, 10611790, 11563636, 12325581, 12771084, 12891891, 12961956, 12874493, 12839838, + 12438070, 12454308, 12503276, 12454308, 12309677, 11939924, 11223529, 10358306, 10000000, 10403489, 11370679, 12230769, 12585751, 12822580, 12874493, 12857142, 12822580, + 12421875, 12421875, 12486910, 12486910, 12357512, 12045454, 11370679, 10460526, 10095238, 10529801, 11480144, 12230769, 12619047, 12788203, 12839838, 12805369, 12805369, + 12519685, 12486910, 12519685, 12519685, 12470588, 12199488, 11648351, 10767494, 10313513, 10779661, 11734317, 12389610, 12736982, 12805369, 12822580, 12822580, 12822580, + 12536136, 12552631, 12635761, 12585751, 12503276, 12325581, 11865671, 11003460, 10576496, 11041666, 11924999, 12552631, 12771084, 12857142, 12839838, 12805369, 12788203, + 12503276, 12552631, 12736982, 12602377, 12569169, 12405721, 12060682, 11276595, 10804077, 11303317, 12137404, 12602377, 12754010, 12891891, 12857142, 12805369, 12771084, + 12519685, 12519685, 12536136, 12585751, 12585751, 12470588, 12168367, 11480144, 11016166, 11452581, 12230769, 12652519, 12839838, 12805369, 12822580, 12822580, 12839838, + 12536136, 12536136, 12552631, 12602377, 12602377, 12536136, 12230769, 11591737, 11157894, 11591737, 12277992, 12736982, 12839838, 12788203, 12822580, 12822580, 12839838, + 12585751, 12569169, 12552631, 12619047, 12619047, 12536136, 12246469, 11648351, 11236749, 11662591, 12309677, 12754010, 12839838, 12805369, 12822580, 12822580, 12857142, + 12602377, 12552631, 12536136, 12602377, 12619047, 12536136, 12277992, 11662591, 11250000, 11705521, 12357512, 12736982, 12839838, 12839838, 12822580, 12805369, 12822580, + }, + }, + { + { + 11307189, 11185344, 11161290, 11258134, 11406593, 11356673, 11137339, 10812500, 10591836, 10657084, 11019108, 11209503, 11331877, 11307189, 11282608, 11258134, 11209503, + 11282608, 11161290, 11137339, 11282608, 11381578, 11356673, 11161290, 10812500, 10548780, 10657084, 11019108, 11209503, 11331877, 11331877, 11282608, 11258134, 11233766, + 11282608, 11161290, 11137339, 11307189, 11406593, 11381578, 11161290, 10745341, 10484848, 10635245, 11042553, 11185344, 11331877, 11356673, 11282608, 11233766, 11185344, + 11282608, 11161290, 11161290, 11307189, 11381578, 11356673, 11113490, 10701030, 10400801, 10548780, 10995762, 11185344, 11331877, 11356673, 11307189, 11258134, 11233766, + 11282608, 11185344, 11185344, 11307189, 11356673, 11307189, 11089743, 10591836, 10338645, 10442655, 10880503, 11233766, 11331877, 11282608, 11307189, 11233766, 11185344, + 11233766, 11137339, 11137339, 11307189, 11307189, 11258134, 10972515, 10463709, 10196463, 10338645, 10812500, 11137339, 11307189, 11307189, 11282608, 11233766, 11209503, + 11233766, 11137339, 11089743, 11233766, 11356673, 11209503, 10812500, 10338645, 10256916, 10256916, 10657084, 11066098, 11282608, 11282608, 11282608, 11209503, 11161290, + 11233766, 11137339, 11113490, 11209503, 11185344, 11066098, 10701030, 10236686, 10297619, 10136718, 10591836, 10995762, 11233766, 11282608, 11307189, 11185344, 11137339, + 11209503, 11113490, 11066098, 11137339, 11137339, 10972515, 10613496, 10176470, 10000000, 10156555, 10570264, 11019108, 11185344, 11282608, 11258134, 11209503, 11185344, + 11113490, 11019108, 10995762, 11113490, 11089743, 10972515, 10570264, 10196463, 10077669, 10156555, 10570264, 10995762, 11161290, 11258134, 11233766, 11161290, 11161290, + 11185344, 11042553, 10995762, 11113490, 11113490, 10995762, 10679012, 10256916, 10176470, 10236686, 10723140, 10995762, 11233766, 11307189, 11258134, 11161290, 11137339, + 11161290, 11066098, 11066098, 11113490, 11113490, 10995762, 10723140, 10338645, 10256916, 10338645, 10767634, 11089743, 11233766, 11331877, 11258134, 11233766, 11209503, + 11209503, 11113490, 11161290, 11137339, 11113490, 11019108, 10790020, 10400801, 10359281, 10463709, 10880503, 11113490, 11233766, 11406593, 11307189, 11209503, 11185344, + 11233766, 11089743, 11042553, 11137339, 11089743, 11019108, 10835073, 10484848, 10421686, 10527383, 10903361, 11161290, 11282608, 11307189, 11282608, 11258134, 11233766, + 11258134, 11089743, 11066098, 11161290, 11089743, 11042553, 10835073, 10548780, 10463709, 10570264, 10926315, 11209503, 11307189, 11307189, 11282608, 11258134, 11258134, + 11258134, 11089743, 11042553, 11185344, 11089743, 11066098, 10880503, 10613496, 10506072, 10613496, 10949367, 11209503, 11307189, 11331877, 11282608, 11258134, 11282608, + 11258134, 11089743, 11066098, 11185344, 11089743, 11066098, 10903361, 10657084, 10527383, 10613496, 10972515, 11209503, 11307189, 11307189, 11307189, 11258134, 11282608, + }, + { + 12036585, 12140221, 12337499, 12477876, 12493670, 12477876, 12276119, 11792114, 11279999, 11778042, 12306733, 12653846, 12702702, 12702702, 12621483, 12509505, 12509505, + 12007299, 12110429, 12352941, 12477876, 12525380, 12493670, 12260869, 11764004, 11241457, 11736028, 12337499, 12637644, 12719072, 12768434, 12637644, 12541296, 12525380, + 12036585, 12125307, 12337499, 12493670, 12557251, 12509505, 12245657, 11680473, 11152542, 11666666, 12337499, 12637644, 12751937, 12801556, 12702702, 12589285, 12541296, + 12036585, 12155172, 12368421, 12541296, 12541296, 12493670, 12230483, 11557377, 11027932, 11530373, 12291407, 12653846, 12768434, 12851562, 12735483, 12621483, 12557251, + 12036585, 12140221, 12368421, 12525380, 12525380, 12462121, 12080783, 11357882, 10822368, 11344827, 12185185, 12605363, 12784974, 12818181, 12735483, 12653846, 12589285, + 12080783, 12170160, 12352941, 12477876, 12462121, 12368421, 11905910, 11077441, 10578778, 11127395, 11963636, 12493670, 12768434, 12818181, 12735483, 12621483, 12573248, + 12036585, 12140221, 12322097, 12446406, 12509505, 12215346, 11652892, 10763358, 10444444, 10822368, 11750000, 12337499, 12735483, 12784974, 12735483, 12589285, 12541296, + 11992709, 12110429, 12291407, 12337499, 12260869, 12007299, 11331802, 10466595, 10378548, 10544871, 11463414, 12170160, 12573248, 12686375, 12702702, 12557251, 12462121, + 11920289, 12021924, 12215346, 12185185, 12095588, 11778042, 11102362, 10270551, 10000000, 10378548, 11241457, 12080783, 12383939, 12557251, 12573248, 12493670, 12430730, + 11934703, 11992709, 12140221, 12200247, 12080783, 11820359, 11177802, 10378548, 10081716, 10511182, 11384083, 12095588, 12462121, 12557251, 12573248, 12462121, 12383939, + 12007299, 12051282, 12185185, 12230483, 12155172, 11949152, 11410404, 10658747, 10281250, 10786885, 11611764, 12230483, 12525380, 12621483, 12573248, 12493670, 12446406, + 11978155, 12066014, 12291407, 12245657, 12200247, 12007299, 11611764, 10858085, 10522388, 11003344, 11820359, 12352941, 12525380, 12589285, 12589285, 12525380, 12462121, + 11992709, 12110429, 12415094, 12276119, 12230483, 12110429, 11764004, 11065022, 10739934, 11228668, 12036585, 12415094, 12557251, 12702702, 12637644, 12541296, 12509505, + 12051282, 12095588, 12245657, 12230483, 12215346, 12125307, 11834532, 11254275, 10906077, 11370967, 12080783, 12462121, 12621483, 12621483, 12589285, 12573248, 12557251, + 12095588, 12140221, 12230483, 12245657, 12230483, 12155172, 11877256, 11370967, 11040268, 11516919, 12125307, 12557251, 12637644, 12621483, 12573248, 12557251, 12525380, + 12110429, 12155172, 12245657, 12260869, 12230483, 12155172, 11920289, 11423611, 11127395, 11570926, 12170160, 12573248, 12653846, 12621483, 12573248, 12525380, 12525380, + 12110429, 12155172, 12276119, 12245657, 12215346, 12185185, 11949152, 11463414, 11177802, 11598119, 12185185, 12557251, 12637644, 12605363, 12573248, 12541296, 12573248, + }, + { + 11871202, 11973039, 12151741, 12273869, 12304785, 12243107, 12166874, 11700598, 11294797, 11686602, 12273869, 12445859, 12541720, 12557840, 12445859, 12367088, 12351453, + 11871202, 11973039, 12166874, 12304785, 12320302, 12258469, 12136645, 11672640, 11255760, 11658711, 12258469, 12461734, 12541720, 12574002, 12430025, 12382762, 12367088, + 11885644, 11987730, 12182044, 12304785, 12320302, 12273869, 12106567, 11617122, 11178489, 11617122, 12243107, 12445859, 12557840, 12622739, 12461734, 12398477, 12382762, + 11900121, 11987730, 12212500, 12320302, 12351453, 12258469, 12061728, 11494117, 11039548, 11494117, 12197253, 12414231, 12557840, 12622739, 12493606, 12430025, 12414231, + 11885644, 11987730, 12212500, 12304785, 12320302, 12227784, 11929181, 11294797, 10855555, 11294797, 12017220, 12382762, 12541720, 12557840, 12477650, 12445859, 12414231, + 11900121, 11958384, 12151741, 12258469, 12258469, 12076637, 11742788, 11014656, 10562162, 11039548, 11799516, 12273869, 12477650, 12541720, 12477650, 12382762, 12335858, + 11914634, 11973039, 12106567, 12182044, 12243107, 12002457, 11480611, 10712719, 10393617, 10712719, 11548463, 12106567, 12398477, 12461734, 12430025, 12351453, 12320302, + 11900121, 11987730, 12166874, 12166874, 12091584, 11813784, 11216991, 10449197, 10338624, 10426894, 11268742, 11973039, 12304785, 12414231, 12445859, 12351453, 12335858, + 11929181, 12017220, 12136645, 12151741, 12061728, 11714628, 11102272, 10338624, 10000000, 10338624, 11152968, 11900121, 12273869, 12430025, 12430025, 12351453, 12335858, + 11987730, 12046855, 12166874, 12182044, 12091584, 11828087, 11229885, 10426894, 10092975, 10438034, 11255760, 11914634, 12273869, 12398477, 12430025, 12335858, 12227784, + 12017220, 12091584, 12212500, 12243107, 12212500, 11973039, 11494117, 10712719, 10295047, 10665938, 11480611, 12002457, 12289308, 12430025, 12382762, 12335858, 12320302, + 12046855, 12136645, 12289308, 12304785, 12243107, 12136645, 11686602, 10952914, 10516684, 10916201, 11672640, 12166874, 12367088, 12430025, 12398477, 12382762, 12367088, + 12076637, 12166874, 12445859, 12335858, 12335858, 12182044, 11885644, 11178489, 10748074, 11165714, 11900121, 12243107, 12398477, 12493606, 12445859, 12335858, 12289308, + 12106567, 12151741, 12289308, 12320302, 12304785, 12258469, 11973039, 11373690, 10952914, 11360465, 12002457, 12320302, 12445859, 12445859, 12382762, 12335858, 12320302, + 12151741, 12212500, 12320302, 12335858, 12320302, 12289308, 12032019, 11507656, 11077097, 11494117, 12032019, 12398477, 12477650, 12445859, 12414231, 12382762, 12367088, + 12182044, 12243107, 12335858, 12304785, 12335858, 12289308, 12046855, 11589561, 11165714, 11575829, 12076637, 12414231, 12461734, 12445859, 12430025, 12414231, 12382762, + 12197253, 12243107, 12335858, 12304785, 12335858, 12320302, 12091584, 11617122, 11216991, 11589561, 12106567, 12398477, 12445859, 12430025, 12445859, 12430025, 12382762, + }, + { + 12536136, 12503276, 12552631, 12669322, 12686170, 12585751, 12389610, 11850931, 11425149, 11895261, 12585751, 12926829, 13032786, 13015006, 12961956, 12926829, 12926829, + 12536136, 12519685, 12585751, 12686170, 12686170, 12602377, 12357512, 11806930, 11370679, 11865671, 12585751, 12926829, 13032786, 13050615, 12979591, 12926829, 12909336, + 12536136, 12536136, 12619047, 12686170, 12686170, 12585751, 12325581, 11734317, 11276595, 11792336, 12602377, 12891891, 13032786, 13068493, 13015006, 12944369, 12926829, + 12536136, 12552631, 12619047, 12686170, 12686170, 12569169, 12309677, 11605839, 11144859, 11676866, 12503276, 12857142, 13015006, 13086419, 13032786, 12979591, 12944369, + 12536136, 12536136, 12569169, 12686170, 12652519, 12536136, 12183908, 11425149, 10965517, 11493975, 12325581, 12822580, 13032786, 13068493, 13050615, 12997275, 12961956, + 12536136, 12536136, 12536136, 12619047, 12585751, 12389610, 11939924, 11157894, 10671140, 11210340, 12121982, 12736982, 12961956, 13015006, 13032786, 12961956, 12944369, + 12454308, 12470588, 12503276, 12552631, 12619047, 12293814, 11705521, 10828603, 10495049, 10865603, 11836228, 12519685, 12839838, 12979591, 13015006, 12961956, 12926829, + 12470588, 12486910, 12519685, 12486910, 12421875, 12060682, 11397849, 10541436, 10380848, 10611790, 11563636, 12325581, 12771084, 12891891, 12961956, 12874493, 12839838, + 12438070, 12454308, 12503276, 12454308, 12309677, 11939924, 11223529, 10358306, 10000000, 10403489, 11370679, 12230769, 12585751, 12822580, 12874493, 12857142, 12822580, + 12421875, 12421875, 12486910, 12486910, 12357512, 12045454, 11370679, 10460526, 10095238, 10529801, 11480144, 12230769, 12619047, 12788203, 12839838, 12805369, 12805369, + 12519685, 12486910, 12519685, 12519685, 12470588, 12199488, 11648351, 10767494, 10313513, 10779661, 11734317, 12389610, 12736982, 12805369, 12822580, 12822580, 12822580, + 12536136, 12552631, 12635761, 12585751, 12503276, 12325581, 11865671, 11003460, 10576496, 11041666, 11924999, 12552631, 12771084, 12857142, 12839838, 12805369, 12788203, + 12503276, 12552631, 12736982, 12602377, 12569169, 12405721, 12060682, 11276595, 10804077, 11303317, 12137404, 12602377, 12754010, 12891891, 12857142, 12805369, 12771084, + 12519685, 12519685, 12536136, 12585751, 12585751, 12470588, 12168367, 11480144, 11016166, 11452581, 12230769, 12652519, 12839838, 12805369, 12822580, 12822580, 12839838, + 12536136, 12536136, 12552631, 12602377, 12602377, 12536136, 12230769, 11591737, 11157894, 11591737, 12277992, 12736982, 12839838, 12788203, 12822580, 12822580, 12839838, + 12585751, 12569169, 12552631, 12619047, 12619047, 12536136, 12246469, 11648351, 11236749, 11662591, 12309677, 12754010, 12839838, 12805369, 12822580, 12822580, 12857142, + 12602377, 12552631, 12536136, 12602377, 12619047, 12536136, 12277992, 11662591, 11250000, 11705521, 12357512, 12736982, 12839838, 12839838, 12822580, 12805369, 12822580, + }, + }, +}; + +/*static ISP_CMOS_RGBIR_S g_stCmosRgbir = +{ + { + 1, + 1, + ISP_IRPOS_TYPE_GR, + 0x41, + 4095, + }, + { + 0, + 1, + 1, + OP_TYPE_AUTO, + 0x100, + {269,7,27,-27,293,13,-49,42,255,-295,-271,-253,-37,-125,-60} + } +}; +*/ +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + pstDef->stDrc.bEnable = HI_FALSE; + pstDef->stDrc.u8Asymmetry = 0x02; + pstDef->stDrc.u8SecondPole = 0xC0; + pstDef->stDrc.u8Stretch = 0x3C; + pstDef->stDrc.u8LocalMixingBrigtht = 0x2D; + pstDef->stDrc.u8LocalMixingDark = 0x2D; + pstDef->stDrc.u8LocalMixingThres = 0x02; + pstDef->stDrc.u16BrightGainLmt = 0x7F; + pstDef->stDrc.u16DarkGainLmtC = 0x7F; + pstDef->stDrc.u16DarkGainLmtY = 0x7F; + pstDef->stDrc.u8RangeVar = 0x00; + pstDef->stDrc.u8SpatialVar = 0x0A; + + memcpy(&pstDef->stLsc.stLscParaTable[0], &g_stCmosLscTable[0], sizeof(ISP_LSC_CABLI_TABLE_S)*HI_ISP_LSC_LIGHT_NUM); + + memcpy(&pstDef->stDemosaic, &g_stIspDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_stIspRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGe, &g_stIspGe, sizeof(ISP_CMOS_GE_S)); + // pstDef->stNoiseTbl.u8SensorIndex = HI_ISP_NR_SENSOR_INDEX_OV9712; + pstDef->stNoiseTbl.stNrCaliPara.u8CalicoefRow = DMNR_CALIB_CARVE_NUM_OV9712; + pstDef->stNoiseTbl.stNrCaliPara.pCalibcoef = (HI_FLOAT (*)[4])g_coef_calib_ov9712; + + memcpy(&pstDef->stNoiseTbl.stIsoParaTable[0], &g_stNrIsoParaTab[0],sizeof(ISP_NR_ISO_PARA_TABLE_S)*HI_ISP_NR_ISO_LEVEL_MAX); + + memcpy(&pstDef->stUvnr, &g_stIspUVNR, sizeof(ISP_CMOS_UVNR_S)); + memcpy(&pstDef->stDpc, &g_stCmosDpc, sizeof(ISP_CMOS_DPC_S)); + // memcpy(&pstDef->stRgbir, &g_stCmosRgbir, sizeof(ISP_CMOS_RGBIR_S)); + memcpy(&pstDef->stLsc, &g_stCmosLscTable, sizeof(ISP_LSC_CABLI_TABLE_S)); + + pstDef->stSensorMaxResolution.u32MaxWidth = 1280; + pstDef->stSensorMaxResolution.u32MaxHeight = 720; + + return 0; +} + +HI_U32 cmos_get_isp_black_level(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel) +{ + // HI_S32 i; + + if (HI_NULL == pstBlackLevel) + { + printf("null pointer when get isp black level value!\n"); + return -1; + } + + /* Don't need to update black level when iso change */ + pstBlackLevel->bUpdate = HI_FALSE; + + pstBlackLevel->au16BlackLevel[0] = 0x46; + pstBlackLevel->au16BlackLevel[1] = 0x45; + pstBlackLevel->au16BlackLevel[2] = 0x46; + pstBlackLevel->au16BlackLevel[3] = 0x46; + + + return 0; + +} + +HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) +{ + /* + HI_U32 u32FullLines_5Fps, u32MaxIntTime_5Fps; + + if (WDR_MODE_2To1_LINE == genSensorMode) + { + return; + } + else + { + if(SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + u32FullLines_5Fps = (VMAX_720P30_LINEAR * 30) / 5; + } + } + + u32FullLines_5Fps = (u32FullLines_5Fps > 0xFFFF) ? 0xFFFF : u32FullLines_5Fps; + u32MaxIntTime_5Fps = u32FullLines_5Fps - 2; +*/ + if (bEnable) /* setup for ISP pixel calibration mode */ + { + /* 5 fps */ + sensor_write_register(0x2d, 0xd2); + sensor_write_register(0x2e, 0x0f); + + /* min gain */ + sensor_write_register(0x0, 0x00); + + /* max exposure time*/ + sensor_write_register(0x10, 0xf8); + sensor_write_register(0x16, 0x12); + } + else /* setup for ISP 'normal mode' */ + { + sensor_write_register(0x2d, 0x0); + sensor_write_register(0x2e, 0x0); + + bInit = HI_FALSE; + } + + return; +} + +HI_VOID cmos_set_wdr_mode(HI_U8 u8Mode) +{ + bInit = HI_FALSE; + + switch(u8Mode) + { + case WDR_MODE_NONE: + if (SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + gu32FullLinesStd = VMAX_720P30_LINEAR; + } + genSensorMode = WDR_MODE_NONE; + printf("linear mode\n"); + break; + default: + printf("NOT support this mode!\n"); + return; + break; + } + + return; +} + +HI_U32 cmos_get_sns_regs_info(ISP_SNS_REGS_INFO_S *pstSnsRegsInfo) +{ + HI_S32 i; + + if (HI_FALSE == bInit) + { + g_stSnsRegsInfo.enSnsType = ISP_SNS_I2C_TYPE; + g_stSnsRegsInfo.u8Cfg2ValidDelayMax = 2; + g_stSnsRegsInfo.u32RegNum = 3; + + for (i=0; iu16Width <= 1280) && (pstSensorImageMode->u16Height <= 720)) + { + if (WDR_MODE_NONE == genSensorMode) + { + if (pstSensorImageMode->f32Fps <= 30) + { + u8SensorImageMode = SENSOR_720P_30FPS_MODE; + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps, + genSensorMode); + + return -1; + } + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps, + genSensorMode); + + return -1; + } + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps, + genSensorMode); + + return -1; + } + + /* Sensor first init */ + if (HI_FALSE == bSensorInit) + { + gu8SensorImageMode = u8SensorImageMode; + + return 0; + } + + /* Switch SensorImageMode */ + if (u8SensorImageMode == gu8SensorImageMode) + { + /* Don't need to switch SensorImageMode */ + return -1; + } + + gu8SensorImageMode = u8SensorImageMode; + + return 0; +} + +HI_VOID sensor_global_init() +{ + gu8SensorImageMode = SENSOR_720P_30FPS_MODE; + genSensorMode = WDR_MODE_NONE; + gu32FullLinesStd = VMAX_720P30_LINEAR; + gu32FullLines = VMAX_720P30_LINEAR; + bInit = HI_FALSE; + bSensorInit = HI_FALSE; + + memset(&g_stSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + memset(&g_stPreSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); +} + +HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc) +{ + memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S)); + + pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init; + pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit; + pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init; + pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode; + pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode; + + pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default; + pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level; + pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect; + pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info; + + return 0; +} + +/**************************************************************************** + * callback structure * + ****************************************************************************/ + +int sensor_register_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + ISP_SENSOR_REGISTER_S stIspRegister; + AE_SENSOR_REGISTER_S stAeRegister; + AWB_SENSOR_REGISTER_S stAwbRegister; + + cmos_init_sensor_exp_function(&stIspRegister.stSnsExp); + s32Ret = HI_MPI_ISP_SensorRegCallBack(IspDev, OV9712_ID, &stIspRegister); + if (s32Ret) + { + printf("sensor register callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + cmos_init_ae_exp_function(&stAeRegister.stSnsExp); + s32Ret = HI_MPI_AE_SensorRegCallBack(IspDev, &stLib, OV9712_ID, &stAeRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + cmos_init_awb_exp_function(&stAwbRegister.stSnsExp); + s32Ret = HI_MPI_AWB_SensorRegCallBack(IspDev, &stLib, OV9712_ID, &stAwbRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_unregister_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + + s32Ret = HI_MPI_ISP_SensorUnRegCallBack(IspDev, OV9712_ID); + if (s32Ret) + { + printf("sensor unregister callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + s32Ret = HI_MPI_AE_SensorUnRegCallBack(IspDev, &stLib, OV9712_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + s32Ret = HI_MPI_AWB_SensorUnRegCallBack(IspDev, &stLib, OV9712_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + return 0; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* __MN34220_CMOS_H_ */ diff --git a/device/mpp/component/isp/sensor/omnivision_ov9712/ov9712_sensor_ctl.c b/device/mpp/component/isp/sensor/omnivision_ov9712/ov9712_sensor_ctl.c new file mode 100644 index 0000000..2b1f96a --- /dev/null +++ b/device/mpp/component/isp/sensor/omnivision_ov9712/ov9712_sensor_ctl.c @@ -0,0 +1,310 @@ +#include +#include +#include +#include +#include +#include + +#include "hi_comm_video.h" + +#ifdef HI_GPIO_I2C +#include "gpioi2c_ex.h" +#else +#include "hi_i2c.h" +#endif + +const unsigned char sensor_i2c_addr = 0x60; /* I2C Address of OV9712 */ +const unsigned int sensor_addr_byte = 1; +const unsigned int sensor_data_byte = 1; +static int g_fd = -1; +static int flag_init = 0; + +extern WDR_MODE_E genSensorMode; +extern HI_U8 gu8SensorImageMode; +extern HI_BOOL bSensorInit; + +int sensor_i2c_init(void) +{ + if(g_fd >= 0) + { + return 0; + } +#ifdef HI_GPIO_I2C + int ret; + + g_fd = open("/dev/gpioi2c_ex", 0); + if(g_fd < 0) + { + printf("Open gpioi2c_ex error!\n"); + return -1; + } +#else + int ret; + + g_fd = open("/dev/i2c-0", O_RDWR); + if(g_fd < 0) + { + printf("Open /dev/i2c-0 error!\n"); + return -1; + } + + ret = ioctl(g_fd, I2C_SLAVE_FORCE, sensor_i2c_addr); + if (ret < 0) + { + printf("CMD_SET_DEV error!\n"); + return ret; + } +#endif + + return 0; +} + +int sensor_i2c_exit(void) +{ + if (g_fd >= 0) + { + close(g_fd); + g_fd = -1; + return 0; + } + return -1; +} + +int sensor_read_register(int addr) +{ + // TODO: + + return 0; +} + +int sensor_write_register(int addr, int data) +{ +#ifdef HI_GPIO_I2C + i2c_data.dev_addr = sensor_i2c_addr; + i2c_data.reg_addr = addr; + i2c_data.addr_byte_num = sensor_addr_byte; + i2c_data.data = data; + i2c_data.data_byte_num = sensor_data_byte; + + ret = ioctl(g_fd, GPIO_I2C_WRITE, &i2c_data); + + if (ret) + { + printf("GPIO-I2C write faild!\n"); + return ret; + } +#else + if(flag_init == 0) + { + + sensor_i2c_init(); + flag_init = 1; + } + + int idx = 0; + int ret; + char buf[8]; + + buf[idx++] = addr & 0xFF; + if (sensor_addr_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_REG, 1); + buf[idx++] = addr >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_REG, 0); + } + + if (ret < 0) + { + printf("CMD_SET_REG_WIDTH error!\n"); + return -1; + } + + buf[idx++] = data; + if (sensor_data_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 1); + buf[idx++] = data >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 0); + } + + if (ret) + { + printf("hi_i2c write faild!\n"); + return -1; + } + + ret = write(g_fd, buf, idx); + if(ret < 0) + { + printf("I2C_WRITE error!\n"); + return -1; + } +#endif + return 0; +} + +static void delay_ms(int ms) { + usleep(ms*1000); +} + +void sensor_prog(int* rom) +{ + int i = 0; + while (1) { + int lookup = rom[i++]; + int addr = (lookup >> 16) & 0xFFFF; + int data = lookup & 0xFFFF; + if (addr == 0xFFFE) { + delay_ms(data); + } else if (addr == 0xFFFF) { + return; + } else { + sensor_write_register(addr, data); + } + } +} + +void sensor_linear_720p25_init(); + +#define SENSOR_720P_25FPS_MODE (1) + +void sensor_init() +{ + sensor_i2c_init(); +#if 0 + /* When sensor first init, config all registers */ + if (HI_FALSE == bSensorInit) + { + if(SENSOR_720P_25FPS_MODE == gu8SensorImageMode) + { + sensor_linear_720p25_init(); + } + } + /* When sensor switch mode(linear<->WDR or resolution), config different registers(if possible) */ + else + { + if(SENSOR_720P_25FPS_MODE == gu8SensorImageMode) + { + sensor_linear_720p25_init(); + } + } +#endif + sensor_linear_720p25_init(); + + return ; +} + +void sensor_exit() +{ + sensor_i2c_exit(); + flag_init = 0; + return; +} + +/* 720P30 and 720P25 */ +void sensor_linear_720p25_init() +{ + //Reset + sensor_write_register(0x12, 0x80); + sensor_write_register(0x09, 0x10); + + //Core Settings + sensor_write_register(0x1e, 0x07); + sensor_write_register(0x5f, 0x18); + sensor_write_register(0x69, 0x04); + sensor_write_register(0x65, 0x2a); + sensor_write_register(0x68, 0x0a); + sensor_write_register(0x39, 0x28); + sensor_write_register(0x4d, 0x90); + sensor_write_register(0xc1, 0x80); + sensor_write_register(0x0c, 0x30); + sensor_write_register(0x6d, 0x02); + + //DSP + //sensor_write_register(0x96, 0xf1); + sensor_write_register(0x96, 0x01); + sensor_write_register(0xbc, 0x68); + + //Resolution and Format + sensor_write_register(0x12, 0x00); + sensor_write_register(0x3b, 0x00); + sensor_write_register(0x97, 0x80); + sensor_write_register(0x17, 0x25); + sensor_write_register(0x18, 0xA2); + sensor_write_register(0x19, 0x01); + sensor_write_register(0x1a, 0xCA); + sensor_write_register(0x03, 0x0A); + sensor_write_register(0x32, 0x07); + sensor_write_register(0x98, 0x00); + sensor_write_register(0x99, 0x28); + sensor_write_register(0x9a, 0x00); + sensor_write_register(0x57, 0x00); + sensor_write_register(0x58, 0xB4); + sensor_write_register(0x59, 0xA0); + sensor_write_register(0x4c, 0x13); + sensor_write_register(0x4b, 0x36); + sensor_write_register(0x3d, 0x3c); + sensor_write_register(0x3e, 0x03); + sensor_write_register(0xbd, 0xA0); + sensor_write_register(0xbe, 0xb4); + sensor_write_register(0x37, 0x02); + sensor_write_register(0x60, 0x9d); + + //YAVG + sensor_write_register(0x4e, 0x55); + sensor_write_register(0x4f, 0x55); + sensor_write_register(0x50, 0x55); + sensor_write_register(0x51, 0x55); + sensor_write_register(0x24, 0x55); + sensor_write_register(0x25, 0x40); + sensor_write_register(0x26, 0xa1); + + //Clock + sensor_write_register(0x5c, 0x52); + sensor_write_register(0x5d, 0x00); + sensor_write_register(0x11, 0x01); + sensor_write_register(0x2a, 0x9c); + sensor_write_register(0x2b, 0x06); + sensor_write_register(0x2d, 0x00); + sensor_write_register(0x2e, 0x00); + + //General + sensor_write_register(0x13, 0xA5); + sensor_write_register(0x14, 0x40); + + //Banding + sensor_write_register(0x4a, 0x00); + sensor_write_register(0x49, 0xce); + sensor_write_register(0x22, 0x03); + sensor_write_register(0x09, 0x00); + + //close AE_AWB + sensor_write_register(0x13, 0x80); + sensor_write_register(0x16, 0x00); + sensor_write_register(0x10, 0xf0); + sensor_write_register(0x00, 0x3f); + sensor_write_register(0x38, 0x00); + sensor_write_register(0x01, 0x40); + sensor_write_register(0x02, 0x40); + sensor_write_register(0x05, 0x40); + sensor_write_register(0x06, 0x00); + sensor_write_register(0x07, 0x00); + + //BLC + sensor_write_register(0x41, 0x84); + + bSensorInit = HI_TRUE; + printf("=========================================================\n"); + printf("===ominivision ov9712 sensor 720P30fps(Parallel port) init success!=====\n"); + printf("=========================================================\n"); + + return; +} + + diff --git a/device/mpp/component/isp/sensor/omnivision_ov9752/Makefile b/device/mpp/component/isp/sensor/omnivision_ov9752/Makefile new file mode 100644 index 0000000..a8d4d9c --- /dev/null +++ b/device/mpp/component/isp/sensor/omnivision_ov9752/Makefile @@ -0,0 +1,75 @@ +# +# sensor lib Makefile +# + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../../../Makefile.param + include $(PARAM_FILE) +endif + +ISP_PATH := $(SDK_PATH)/mpp/component/isp +EXT_PATH := $(SDK_PATH)/mpp/$(EXTDRV) +3A_PATH := $(ISP_PATH)/3a +LIBPATH = $(ISP_PATH)/lib +OBJPATH = ./obj + +ifeq ($(CONFIG_GPIO_I2C),y) +HI_GPIO_I2C:=HI_GPIO_I2C +else +HI_GPIO_I2C:=HI_GPIO_XXX +endif + +ARFLAGS = rcv +ARFLAGS_SO = $(LIBS_LD_CFLAGS) +ARFLAGS_SO += -shared -fPIC -o +CFLAGS = -Wall -fPIC -D$(HI_FPGA) -D$(HI_GPIO_I2C) +CFLAGS += -O2 +CFLAGS += $(LIBS_CFLAGS) + +ifeq ($(ISP_INI_CONFIG), y) +CFLAGS += -D INIFILE_CONFIG_MODE +endif + +ifeq ($(HIGDB),HI_GDB) +CFLAGS += -g +endif + +ifeq ($(CONFIG_JPEGEDCF), y) + CFLAGS += -D ENABLE_JPEGEDCF +endif +BUS_DIR := $(EXT_PATH)/ssp-sony/ + +ISP_INC := $(ISP_PATH)/include +3A_INC := $(3A_PATH)/include +INC := -I$(BUS_DIR) -I$(REL_INC) -I$(ISP_INC) -I$(3A_INC) -I$(ISP_PATH)/iniparser + +ifeq ($(CONFIG_GPIO_I2C), y) + INC += -I$(EXT_PATH)/gpio-i2c-ex + INC += -I$(EXT_PATH)/gpio-i2c +else + INC += -I$(EXT_PATH)/i2c + INC += -I$(EXT_PATH)/hi_i2c +endif + +COMPILE = $(CC) $(CFLAGS) $(DFLAGS) -lm + +$(OBJPATH)/%.o: ./%.c + @[ -e $(LIBPATH) ] || mkdir $(LIBPATH) + @[ -e $(OBJPATH) ] || mkdir $(OBJPATH) + @$(COMPILE) -o $@ -c $< $(INC) + +SRCS = $(wildcard ./*.c) +OBJS = $(SRCS:%.c=%.o) +OBJS := $(OBJS:./%=obj/%) + +TARGETLIB := $(LIBPATH)/libsns_ov9752.a +TARGETLIB_SO := $(LIBPATH)/libsns_ov9752.so + +all:$(TARGETLIB) +$(TARGETLIB):$(OBJS) + @($(AR) $(ARFLAGS) $(TARGETLIB) $(OBJS)) + @($(CC) $(ARFLAGS_SO) $(TARGETLIB_SO) $(OBJS)) + +clean: + @$(RM) -rf $(TARGETLIB) $(OBJS) + @$(RM) -rf $(LIBPATH) $(OBJPATH) diff --git a/device/mpp/component/isp/sensor/omnivision_ov9752/ov9752_cmos.c b/device/mpp/component/isp/sensor/omnivision_ov9752/ov9752_cmos.c new file mode 100644 index 0000000..db8e91d --- /dev/null +++ b/device/mpp/component/isp/sensor/omnivision_ov9752/ov9752_cmos.c @@ -0,0 +1,1234 @@ +#if !defined(__OV4682_CMOS_H_) +#define __OV4682_CMOS_H_ + +#include +#include +#include +#include "hi_comm_sns.h" +#include "hi_comm_video.h" +#include "hi_sns_ctrl.h" +#include "mpi_isp.h" +#include "mpi_ae.h" +#include "mpi_awb.h" +#include "mpi_af.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +#define OV9752_ID 9752 + + +/* To change the mode of config. ifndef INIFILE_CONFIG_MODE, quick config mode.*/ +/* else, cmos_cfg.ini file config mode*/ +#ifdef INIFILE_CONFIG_MODE + +extern AE_SENSOR_DEFAULT_S g_AeDft[]; +extern AWB_SENSOR_DEFAULT_S g_AwbDft[]; +extern ISP_CMOS_DEFAULT_S g_IspDft[]; +extern HI_S32 Cmos_LoadINIPara(const HI_CHAR *pcName); +#else + +#endif + +/**************************************************************************** + * local variables * + ****************************************************************************/ + +extern const unsigned int sensor_i2c_addr; +extern unsigned int sensor_addr_byte; +extern unsigned int sensor_data_byte; + +#define LONG_EXPOSURE_ADDR (0x3500) +#define MIDDLE_EXPOSURE_ADDR (0x350a) +#define SHORT_EXPOSURE_ADDR (0x3510) +#define LONG_AGC_ADDR (0x3508) +#define MIDDLE_AGC_ADDR (0x350E) +#define SHORT_AGC_ADDR (0x3514) +#define DC_GAIN_ADDR (0x37c7) +#define VMAX_ADDR_H (0x380E) +#define VMAX_ADDR_L (0x380F) +#define R_DGC_ADDR (0x5032) +#define G_DGC_ADDR (0x5034) +#define B_DGC_ADDR (0x5036) + +#define SENSOR_720P_30FPS_MODE (1) +#define INCREASE_LINES (0) /* make real fps less than stand fps because NVR require*/ +#define VMAX_720P30_LINEAR (988+INCREASE_LINES) /*for fps*/ + +HI_U8 gu8SensorImageMode = SENSOR_720P_30FPS_MODE; +WDR_MODE_E genSensorMode = WDR_MODE_NONE; + +static HI_U32 gu32FullLinesStd = VMAX_720P30_LINEAR; +static HI_U32 gu32FullLines = VMAX_720P30_LINEAR; + +static HI_BOOL bInit = HI_FALSE; +HI_BOOL bSensorInit = HI_FALSE; +ISP_SNS_REGS_INFO_S g_stSnsRegsInfo = {0}; +ISP_SNS_REGS_INFO_S g_stPreSnsRegsInfo = {0}; + +#define PATHLEN_MAX 256 +#define CMOS_CFG_INI "ov9752_cfg.ini" +static char pcName[PATHLEN_MAX] = "configs/ov9752_cfg.ini"; + +/* AE default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 0.1; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stDgainAccu.f32Accuracy = 1; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 8 << pstAeSnsDft->u32ISPDgainShift; + + switch(genSensorMode) + { + default: + case WDR_MODE_NONE: /*linear mode*/ + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = g_AeDft[0].u8AeCompensation; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[0].u32MaxIntTimeTarget; + pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[0].u32MinIntTimeTarget; + + pstAeSnsDft->u32MaxAgain = 16832*2; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = g_AeDft[0].u32MaxAgainTarget; + pstAeSnsDft->u32MinAgainTarget = g_AeDft[0].u32MinAgainTarget; + + pstAeSnsDft->u32MaxDgain = 1024; + pstAeSnsDft->u32MinDgain = 1024; + pstAeSnsDft->u32MaxDgainTarget = g_AeDft[0].u32MaxDgainTarget; + pstAeSnsDft->u32MinDgainTarget = g_AeDft[0].u32MinDgainTarget; + + pstAeSnsDft->u32ISPDgainShift = g_AeDft[0].u32ISPDgainShift; + pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[0].u32MinISPDgainTarget; + pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[0].u32MaxISPDgainTarget; + break; + } + return 0; +} + +#else + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 0.1; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stDgainAccu.f32Accuracy = 1; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 8 << pstAeSnsDft->u32ISPDgainShift; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = pstAeSnsDft->u32MaxIntTime; + pstAeSnsDft->u32MinIntTimeTarget = pstAeSnsDft->u32MinIntTime; + + pstAeSnsDft->u32MaxAgain = 16832*2; /*2.3x DC gain*/ + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 1024; /*big sensor digital gain make over-exposure easy*/ + pstAeSnsDft->u32MinDgain = 1024; + pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgain; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x38; + + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + + return 0; +} +#endif + +/* the function of sensor set fps */ +static HI_VOID cmos_fps_set(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + if(SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + gu32FullLinesStd = (VMAX_720P30_LINEAR * 30) / f32Fps; + } + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + + gu32FullLinesStd = gu32FullLinesStd > 0xFFFF ? 0xFFFF : gu32FullLinesStd; + sensor_write_register (VMAX_ADDR_H, (gu32FullLinesStd & 0xFF00) >> 8); + sensor_write_register (VMAX_ADDR_L, gu32FullLinesStd & 0xFF); + + pstAeSnsDft->f32Fps = f32Fps; + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd * f32Fps / 2; + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 4; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + + return; +} + +static HI_VOID cmos_slow_framerate_set(HI_U32 u32FullLines, + AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + u32FullLines = (u32FullLines > 0xFFFF) ? 0xFFFF : u32FullLines; + gu32FullLines = u32FullLines; + + sensor_write_register (VMAX_ADDR_H, (gu32FullLines & 0xFF00) >> 8); + sensor_write_register (VMAX_ADDR_L, gu32FullLines & 0xFF); + + pstAeSnsDft->u32MaxIntTime = gu32FullLines - 4; + + return; +} + +/* while isp notify ae to update sensor regs, ae call these funcs. */ +static HI_VOID cmos_inttime_update(HI_U32 u32IntTime) +{ + + { + g_stSnsRegsInfo.astI2cData[0].u32Data = u32IntTime >> 12; + g_stSnsRegsInfo.astI2cData[1].u32Data = (u32IntTime & 0xFFF) >> 4; + g_stSnsRegsInfo.astI2cData[2].u32Data = (u32IntTime & 0xF) << 4; + } + + return; +} + +static HI_VOID cmos_again_calc_table(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb) +{ + + *pu32AgainDb = (*pu32AgainLin >> 3); + + return; +} + +static HI_VOID cmos_dgain_calc_table(HI_U32 *pu32DgainLin, HI_U32 *pu32DgainDb) +{ + *pu32DgainDb = *pu32DgainLin; + + return; +} + +static HI_VOID cmos_gains_update(HI_U32 u32Again, HI_U32 u32Dgain) +{ + HI_U32 u32DCGain = (HI_U32)(2.8*128);//DC-gain:2.3X,usually set bigger for tolerance. + + if (u32Again >= u32DCGain) + { + u32Again = (((u32Again << 10)/u32DCGain) >> 3); + u32DCGain = 0x30; //high gain + } + else + { + u32Again = u32Again; + u32DCGain = 0x31; //low gain + } + + g_stSnsRegsInfo.astI2cData[3].u32Data = u32Again >> 8; + g_stSnsRegsInfo.astI2cData[4].u32Data = u32Again & 0xff; + g_stSnsRegsInfo.astI2cData[5].u32Data = u32DCGain; + g_stSnsRegsInfo.astI2cData[6].u32Data = u32Dgain >> 8; + g_stSnsRegsInfo.astI2cData[7].u32Data = u32Dgain & 0xff; + g_stSnsRegsInfo.astI2cData[8].u32Data = u32Dgain >> 8; + g_stSnsRegsInfo.astI2cData[9].u32Data = u32Dgain & 0xff; + g_stSnsRegsInfo.astI2cData[10].u32Data = u32Dgain >> 8; + g_stSnsRegsInfo.astI2cData[11].u32Data = u32Dgain & 0xff; + + return; +} + +HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default; + pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set; + pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; + pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update; + pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update; + pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table; + pstExpFuncs->pfn_cmos_dgain_calc_table = cmos_dgain_calc_table; + + return 0; +} + +/* AWB default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + HI_U8 i; + + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + pstAwbSnsDft->u16WbRefTemp = g_AwbDft[0].u16WbRefTemp; + + for(i= 0; i < 4; i++) + { + pstAwbSnsDft->au16GainOffset[i] = g_AwbDft[0].au16GainOffset[i]; + } + + for(i= 0; i < 6; i++) + { + pstAwbSnsDft->as32WbPara[i] = g_AwbDft[0].as32WbPara[i]; + } + memcpy(&pstAwbSnsDft->stCcm, &g_AwbDft[0].stCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_AwbDft[0].stAgcTbl, sizeof(AWB_AGC_TABLE_S)); + break; + + } + return 0; +} + +#else + +static AWB_CCM_S g_stAwbCcm = +{ + 5120, + { + 0x020B, 0x80D1, 0x803A, + 0x8031, 0x016D, 0x803C, + 0x0013, 0x8105, 0x01F2 + }, + + 3633, + { + 0x01E4, 0x808E, 0x8056, + 0x804C, 0x0190, 0x8044, + 0x0012, 0x8133, 0x0221 + }, + + 2465, + { + 0x01DB, 0x8098, 0x8043, + 0x8087, 0x01BD, 0x8036, + 0x801D, 0x81E2, 0x02FF + } +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTable = +{ + /* bvalid */ + 1, + + /*1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768*/ + /* saturation */ + {0x80,0x80,0x7b,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x38,0x38,0x38,0x38} + +}; + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + pstAwbSnsDft->u16WbRefTemp = 5000; + pstAwbSnsDft->au16GainOffset[0] = 0x1FC; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x18A; + pstAwbSnsDft->as32WbPara[0] = 77; + pstAwbSnsDft->as32WbPara[1] = 41; + pstAwbSnsDft->as32WbPara[2] = -139; + pstAwbSnsDft->as32WbPara[3] = 200695; + pstAwbSnsDft->as32WbPara[4] = 128; + pstAwbSnsDft->as32WbPara[5] = -154119; + + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTable, sizeof(AWB_AGC_TABLE_S)); + + return 0; +} +#endif + +HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default; + + return 0; +} + +/* ISP default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstDef->stDrc, &g_IspDft[0].stDrc, sizeof(ISP_CMOS_DRC_S)); + memcpy(&pstDef->stNoiseTbl, &g_IspDft[0].stNoiseTbl, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_IspDft[0].stDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_IspDft[0].stRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGamma, &g_IspDft[0].stGamma, sizeof(ISP_CMOS_GAMMA_S)); + memcpy(&pstDef->stGe, &g_IspDft[0].stGe, sizeof(ISP_CMOS_GE_S)); + break; + } + pstDef->stSensorMaxResolution.u32MaxWidth = 1280; + pstDef->stSensorMaxResolution.u32MaxHeight = 720; + + return 0; +} + +#else + + +#define DMNR_CALIB_CARVE_NUM_OV9752 12 + +float g_coef_calib_ov9752[DMNR_CALIB_CARVE_NUM_OV9752][4] = +{ + {100.000000f, 2.000000f, 0.037048f, 9.002845f, }, + {204.000000f, 2.309630f, 0.038180f, 9.011998f, }, + {407.000000f, 2.609594f, 0.039593f, 9.160780f, }, + {812.000000f, 2.909556f, 0.042155f, 9.453709f, }, + {1640.000000f, 3.214844f, 0.047406f, 9.905107f, }, + {3223.000000f, 3.508260f, 0.055695f, 11.039407f, }, + {6457.000000f, 3.810031f, 0.068628f, 13.358517f, }, + {10311.000000f, 4.013301f, 0.080570f, 16.527088f, }, + {29899.000000f, 4.475657f, 0.112936f, 25.649172f, }, + {35111.000000f, 4.545443f, 0.092135f, 36.210743f, }, + {50897.000000f, 4.706692f, 0.100546f, 43.523537f, }, + {74403.000000f, 4.871591f, 0.095404f, 60.593433f, }, +}; + +static ISP_NR_ISO_PARA_TABLE_S g_stNrIsoParaTab[HI_ISP_NR_ISO_LEVEL_MAX] = +{ + //u16Threshold//u8varStrength//u8fixStrength//u8LowFreqSlope + {1500, 160, 256-256, 0 }, //100 // // + {1500, 120, 256-256, 0 }, //200 // ISO // ISO //u8LowFreqSlope + {1500, 100, 256-256, 0 }, //400 //{400, 1200, 96,256}, //{400 , 0 } + {1750, 80, 256-256, 8 }, //800 //{800, 1400, 80,256}, //{600 , 2 } + {1500, 255, 256-256, 6 }, //1600 //{1600, 1200, 72,256}, //{800 , 8 } + {1500, 255, 256-256, 0 }, //3200 //{3200, 1200, 64,256}, //{1000, 12 } + {1375, 255, 256-256, 0 }, //6400 //{6400, 1100, 56,256}, //{1600, 6 } + {1375, 255, 256-256, 0 }, //12800 //{12000,1100, 48,256}, //{2400, 0 } + {1375, 255, 256-256, 0 }, //25600 //{36000,1100, 48,256}, // + {1375, 255, 256-256, 0 }, //51200 //{64000,1100, 96,256}, // + {1250, 255, 256-256, 0 }, //102400 //{82000,1000,240,256}, // + {1250, 255, 256-256, 0 }, //204800 // // + {1250, 255, 256-256, 0 }, //409600 // // + {1250, 255, 256-256, 0 }, //819200 // // + {1250, 255, 256-256, 0 }, //1638400// // + {1250, 255, 256-256, 0 }, //3276800// // +}; + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaic = +{ + /*For Demosaic*/ + 1, /*bEnable*/ + 24,/*u16VhLimit*/ + 40-24,/*u16VhOffset*/ + 24, /*u16VhSlope*/ + /*False Color*/ + 1, /*bFcrEnable*/ + { 8, 8, 8, 8, 8, 8, 8, 8, 3, 0, 0, 0, 0, 0, 0, 0}, /*au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]*/ + {24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24}, /*au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]*/ + /*For Ahd*/ + 400, /*u16UuSlope*/ + {512,512,512,512,512,512,512,400,0,0,0,0,0,0,0,0} /*au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_GE_S g_stIspGe = +{ + /*For GE*/ + 0, /*bEnable*/ + 7, /*u8Slope*/ + 7, /*u8Sensitivity*/ + 8192, /*u16Threshold*/ + 8192, /*u16SensiThreshold*/ + {1024,1024,1024,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048} /*au16Strength[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpen = +{ + //{100, 200, 400, 800,1600, 3200,6400,12800,25600,51200,102400,204800,409600,819200,1638400,3276800}; + {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},/* enPixSel = ~bEnLowLumaShoot */ + {64, 62, 60, 55, 50, 45, 30, 50, 90, 160, 210, 250, 250, 250, 250, 250},/*maxSharpAmt1 = SharpenUD*16 */ + {40, 42, 45, 50, 70, 80, 100, 130, 180, 220, 250, 250, 250, 250, 250, 250},/*maxEdgeAmt = SharpenD*16 */ + {0, 0, 0, 0, 0, 0, 20, 40, 90, 120, 180, 250, 250, 250, 250, 250},/*sharpThd2 = TextureNoiseThd*4 */ + {0, 0, 0, 0, 0, 0, 0, 0, 100, 200, 0, 0, 0, 0, 0, 0},/*edgeThd2 = EdgeNoiseThd*4 */ + {120, 105, 90, 85, 80, 60, 55, 10, 0, 0, 0, 0, 0, 0, 0, 0},/*overshootAmt*/ + {160, 150, 130, 100, 90, 76, 66, 45, 30, 0, 0, 0, 0, 0, 0, 0},/*undershootAmt*/ +}; + +static ISP_CMOS_UVNR_S g_stIspUVNR = +{ + /*ֵ˲лUVNRISOֵ*/ + /*UVNRлֵ˲ISOֵ*/ + /*0.0 -> disable(0.0, 1.0] -> weak(1.0, 2.0] -> normal(2.0, 10.0) -> strong*/ + /*˹˲ı׼*/ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; + {1, 2, 4, 5, 7, 48, 32, 16, 16, 16, 16, 16, 16, 16, 16, 16}, /*UVNRThreshold*/ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2}, /*Coring_lutLimit*/ + {0, 0, 0, 16, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34} /*UVNR_blendRatio*/ +}; + +static ISP_CMOS_DPC_S g_stCmosDpc = +{ + //1,/*IR_channel*/ + //1,/*IR_position*/ + {0,0,0,1,1,1,2,2,2,3,3,3,3,3,3,3},/*au16Strength[16]*/ + {0,0,0,0,0,0,0,0,0x24,0x80,0x80,0x80,0xE5,0xE5,0xE5,0xE5},/*au16BlendRatio[16]*/ +}; + +static ISP_LSC_CABLI_TABLE_S g_stCmosLscTable[HI_ISP_LSC_LIGHT_NUM] = +{ + //-------------------------------------------- + // single light default + //-------------------------------------------- + //3000K + { + { + 16890756, 16657458, 16209677, 15541237, 14815724, 13704545, 12562500, 11355932, 10787119, 11271028, 12356557, 13370288, 14188235, 15075000, 15581395, 16080000, 16122994, + 16938202, 16611570, 16166219, 15541237, 14779411, 13673469, 12588726, 11334586, 10748663, 11250000, 12331288, 13311258, 14255319, 15150753, 15541237, 16080000, 16166219, + 16938202, 16657458, 16166219, 15501285, 14743276, 13673469, 12562500, 11292134, 10616197, 11146025, 12206477, 13281938, 14221698, 15075000, 15581395, 15994694, 16253369, + 16938202, 16657458, 16080000, 15421994, 14707317, 13550561, 12356557, 11208178, 10560420, 11064220, 12084168, 13165938, 14154929, 14962779, 15621761, 15994694, 16166219, + 16611570, 16430517, 16037234, 15382653, 14530120, 13550561, 12281059, 11064220, 10432525, 10923913, 11964285, 13080260, 14055944, 14852216, 15461538, 15994694, 16166219, + 16520547, 16385869, 15952380, 15343511, 14460431, 13311258, 12132796, 10904159, 10343053, 10787119, 11800391, 12995689, 14055944, 14743276, 15343511, 15868421, 16080000, + 16430517, 16209677, 15826771, 15265822, 14221698, 13137254, 11893491, 10787119, 10168634, 10616197, 11686046, 12857142, 13926096, 14565217, 15304568, 15703125, 15952380, + 16253369, 16122994, 15662337, 14962779, 14088785, 12995689, 11800391, 10672566, 10016611, 10505226, 11442125, 12588726, 13642533, 14495192, 15150753, 15581395, 15868421, + 16297297, 16080000, 15501285, 14888888, 13926096, 12939914, 11777343, 10578947, 10000000, 10414507, 11377358, 12562500, 13581081, 14391408, 15037406, 15421994, 15744125, + 16166219, 16080000, 15581395, 14888888, 14055944, 12939914, 11846758, 10691489, 10083612, 10468750, 11442125, 12536382, 13642533, 14391408, 15000000, 15421994, 15621761, + 16430517, 16253369, 15662337, 15037406, 14323040, 13108695, 11964285, 10864864, 10185810, 10653710, 11596153, 12721518, 13767123, 14600484, 15075000, 15621761, 15703125, + 16565934, 16385869, 15744125, 15150753, 14323040, 13223684, 12132796, 11043956, 10378657, 10787119, 11800391, 12884615, 13958333, 14671532, 15227272, 15826771, 16037234, + 16750000, 16430517, 15994694, 15304568, 14460431, 13400000, 12256097, 11146025, 10560420, 10943738, 11940594, 13051948, 14055944, 14852216, 15343511, 15785340, 15994694, + 16703601, 16475409, 15994694, 15304568, 14530120, 13489932, 12306122, 11250000, 10634920, 11023765, 12084168, 13165938, 14154929, 14925742, 15541237, 15952380, 16166219, + 16890756, 16703601, 15994694, 15541237, 14635922, 13611738, 12484472, 11398865, 10691489, 11146025, 12181818, 13137254, 14188235, 14962779, 15581395, 16037234, 16209677, + 16938202, 16611570, 16122994, 15662337, 14743276, 13642533, 12536382, 11507633, 10767857, 11166666, 12256097, 13281938, 14255319, 14962779, 15662337, 16037234, 16385869, + 16890756, 16565934, 16209677, 15703125, 14779411, 13642533, 12536382, 11507633, 10845323, 11208178, 12231237, 13340707, 14255319, 14925742, 15744125, 16037234, 16475409, + }, + { + 14250386, 14033485, 13720238, 13381712, 13096590, 12476319, 11881443, 11257631, 10976190, 11425030, 12163588, 12895104, 13479532, 14141104, 14406250, 14681528, 14752000, + 14162826, 13969696, 13740685, 13401162, 13041018, 12459459, 11850899, 11230207, 10950118, 11396786, 12131578, 12859135, 13499267, 14097859, 14406250, 14681528, 14823151, + 14076335, 13906485, 13740685, 13323699, 12949438, 12409152, 11745222, 11148730, 10859835, 11326781, 12036553, 12805555, 13440233, 13948562, 14383775, 14611727, 14775641, + 14012158, 13843843, 13538913, 13171428, 12859135, 12293333, 11612090, 11041916, 10758459, 11189320, 11927554, 12699724, 13304473, 13823088, 14272445, 14565560, 14658187, + 13740685, 13659259, 13440233, 13096590, 12682255, 12099737, 11467661, 10834312, 10597701, 11015531, 11715374, 12510176, 13228120, 13639053, 14033485, 14383775, 14565560, + 13598820, 13519061, 13209169, 12949438, 12527173, 11974025, 11257631, 10658959, 10394588, 10808909, 11525000, 12359249, 13004231, 13479532, 13885542, 14228395, 14339035, + 13381712, 13247126, 13041018, 12682255, 12244355, 11685678, 11055155, 10501138, 10199115, 10597701, 11299019, 12131578, 12823365, 13266187, 13720238, 14012158, 14141104, + 13190271, 13059490, 12823365, 12442645, 12036553, 11496259, 10847058, 10290178, 10021739, 10371203, 11081730, 11850899, 12561307, 13115220, 13519061, 13802395, 13906485, + 13115220, 12985915, 12682255, 12359249, 11881443, 11425030, 10808909, 10221729, 10000000, 10324748, 10989272, 11805377, 12476319, 12967651, 13362318, 13679525, 13781763, + 13228120, 13096590, 12805555, 12476319, 12036553, 11453416, 10911242, 10347923, 10065502, 10429864, 11081730, 11835686, 12544217, 13022598, 13401162, 13699851, 13843843, + 13362318, 13266187, 13004231, 12664835, 12276964, 11700507, 11108433, 10597701, 10221729, 10573394, 11271393, 12115637, 12752420, 13323699, 13618906, 13969696, 14054878, + 13618906, 13538913, 13152639, 12931276, 12493224, 11943005, 11340713, 10796252, 10501138, 10834312, 11525000, 12326203, 12949438, 13499267, 13843843, 14141104, 14228395, + 13948562, 13761194, 13479532, 13133903, 12752420, 12179656, 11525000, 11002386, 10758459, 11041916, 11805377, 12493224, 13190271, 13679525, 14033485, 14361370, 14474097, + 13969696, 13864661, 13618906, 13304473, 12877094, 12342704, 11670886, 11162227, 10847058, 11202916, 11943005, 12752420, 13362318, 13864661, 14228395, 14542586, 14658187, + 14162826, 14054878, 13740685, 13420669, 13022598, 12476319, 11866151, 11299019, 10989272, 11340713, 12083879, 12877094, 13479532, 13969696, 14406250, 14588607, 14799357, + 14316770, 14162826, 13843843, 13558823, 13133903, 12578444, 11927554, 11439205, 11095066, 11410891, 12147562, 12913165, 13598820, 14076335, 14519685, 14658187, 14870967, + 14383775, 14162826, 13906485, 13639053, 13190271, 12595628, 11912144, 11425030, 11175757, 11453416, 12179656, 12913165, 13618906, 14097859, 14588607, 14752000, 14967532, + }, + { + 14228395, 14033485, 13699851, 13401162, 13096590, 12510176, 11881443, 11243902, 10976190, 11425030, 12195767, 12931276, 13538913, 14162826, 14406250, 14704944, 14799357, + 14184615, 13969696, 13720238, 13401162, 13022598, 12459459, 11850899, 11216545, 10950118, 11410891, 12147562, 12877094, 13519061, 14119448, 14406250, 14704944, 14823151, + 14097859, 13885542, 13740685, 13342981, 12967651, 12409152, 11745222, 11148730, 10872641, 11326781, 12036553, 12823365, 13459854, 13990895, 14383775, 14611727, 14752000, + 14012158, 13843843, 13558823, 13171428, 12877094, 12309746, 11612090, 11041916, 10758459, 11189320, 11927554, 12734806, 13285302, 13843843, 14294573, 14565560, 14634920, + 13740685, 13679525, 13440233, 13096590, 12682255, 12115637, 11496259, 10834312, 10597701, 11002386, 11730279, 12527173, 13228120, 13659259, 14054878, 14406250, 14542586, + 13618906, 13519061, 13209169, 12949438, 12510176, 11974025, 11271393, 10658959, 10406320, 10796252, 11525000, 12375838, 13004231, 13499267, 13906485, 14228395, 14383775, + 13381712, 13228120, 13041018, 12682255, 12260638, 11685678, 11055155, 10501138, 10210409, 10585533, 11299019, 12147562, 12823365, 13266187, 13740685, 14012158, 14141104, + 13171428, 13078014, 12823365, 12442645, 12036553, 11481942, 10834312, 10301675, 10021739, 10371203, 11095066, 11850899, 12578444, 13115220, 13519061, 13823088, 13927492, + 13096590, 12985915, 12682255, 12342704, 11881443, 11425030, 10796252, 10221729, 10000000, 10324748, 11002386, 11790281, 12476319, 12967651, 13362318, 13679525, 13823088, + 13228120, 13078014, 12787794, 12476319, 12020860, 11453416, 10924170, 10336322, 10065502, 10406320, 11081730, 11835686, 12544217, 13022598, 13420669, 13720238, 13864661, + 13381712, 13247126, 13022598, 12664835, 12260638, 11685678, 11081730, 10597701, 10233074, 10585533, 11299019, 12115637, 12752420, 13342981, 13639053, 13969696, 14054878, + 13639053, 13519061, 13171428, 12931276, 12493224, 11958495, 11340713, 10783625, 10501138, 10834312, 11525000, 12342704, 12967651, 13519061, 13864661, 14141104, 14250386, + 13969696, 13761194, 13459854, 13133903, 12752420, 12163588, 11525000, 11002386, 10733410, 11055155, 11790281, 12510176, 13190271, 13679525, 14054878, 14361370, 14474097, + 13990895, 13843843, 13598820, 13285302, 12877094, 12342704, 11670886, 11148730, 10847058, 11189320, 11958495, 12752420, 13381712, 13885542, 14206471, 14542586, 14634920, + 14119448, 14054878, 13740685, 13401162, 13004231, 12476319, 11850899, 11285189, 10976190, 11340713, 12099737, 12877094, 13479532, 13990895, 14406250, 14611727, 14775641, + 14272445, 14162826, 13823088, 13538913, 13115220, 12561307, 11927554, 11410891, 11081730, 11425030, 12147562, 12931276, 13578792, 14076335, 14496855, 14681528, 14870967, + 14294573, 14141104, 13885542, 13618906, 13190271, 12578444, 11943005, 11425030, 11162227, 11467661, 12163588, 12931276, 13598820, 14097859, 14565560, 14775641, 14967532, + }, + { + 14389312, 14172932, 13962962, 13610108, 13368794, 12866894, 12240259, 11600000, 11529051, 11855345, 12608695, 13228070, 13809523, 14280303, 14389312, 14612403, 14726562, + 14280303, 14067164, 14014869, 13610108, 13321554, 12779661, 12240259, 11600000, 11493902, 11781250, 12524916, 13135888, 13759124, 14172932, 14444444, 14555984, 14784313, + 14172932, 14067164, 13860294, 13416370, 13135888, 12693602, 12200647, 11493902, 11287425, 11635802, 12401315, 13000000, 13610108, 14119850, 14389312, 14612403, 14784313, + 14119850, 14067164, 13610108, 13321554, 13090277, 12608695, 11930379, 11355421, 11088235, 11564417, 12280130, 12866894, 13464285, 13860294, 14280303, 14555984, 14669260, + 13709090, 13709090, 13464285, 13181818, 12779661, 12280130, 11671826, 11088235, 10833333, 11220238, 11892744, 12693602, 13321554, 13561151, 13911439, 14226415, 14226415, + 13561151, 13512544, 13228070, 12955326, 12566666, 12006369, 11458966, 10833333, 10560224, 10895953, 11671826, 12483443, 13135888, 13416370, 13709090, 14014869, 14014869, + 13321554, 13181818, 13090277, 12779661, 12240259, 11708074, 11120943, 10649717, 10272479, 10619718, 11321321, 12122186, 12779661, 13090277, 13561151, 13709090, 13860294, + 13090277, 13000000, 12736486, 12483443, 12044728, 11458966, 10927536, 10357142, 10053333, 10443213, 11088235, 11818181, 12442244, 13000000, 13274647, 13512544, 13659420, + 12866894, 12779661, 12736486, 12360655, 11855345, 11458966, 10895953, 10385674, 10000000, 10385674, 11023391, 11781250, 12442244, 12866894, 13228070, 13464285, 13464285, + 13135888, 13000000, 12823129, 12442244, 12044728, 11458966, 11023391, 10443213, 10161725, 10501392, 11186943, 11930379, 12651006, 12910958, 13181818, 13464285, 13416370, + 13321554, 13274647, 12955326, 12736486, 12442244, 11671826, 11253731, 10740740, 10414364, 10740740, 11389728, 12161290, 12866894, 13228070, 13512544, 13809523, 13860294, + 13561151, 13464285, 13135888, 12866894, 12566666, 12006369, 11458966, 11055718, 10679886, 11023391, 11744548, 12483443, 13044982, 13512544, 13759124, 14014869, 14067164, + 13962962, 13759124, 13464285, 13274647, 12779661, 12240259, 11708074, 11220238, 10959302, 11287425, 12044728, 12736486, 13321554, 13709090, 14014869, 14226415, 14334600, + 13860294, 13809523, 13709090, 13321554, 12910958, 12524916, 11968253, 11458966, 11120943, 11493902, 12200647, 12866894, 13561151, 13962962, 14172932, 14500000, 14555984, + 14067164, 14067164, 13659420, 13561151, 13044982, 12608695, 12161290, 11564417, 11321321, 11708074, 12401315, 13135888, 13759124, 14119850, 14500000, 14726562, 14842519, + 14334600, 14280303, 13809523, 13709090, 13181818, 12693602, 12240259, 11744548, 11458966, 11855345, 12608695, 13321554, 13809523, 14226415, 14726562, 14784313, 14901185, + 14444444, 14334600, 13860294, 13709090, 13274647, 12736486, 12240259, 11781250, 11529051, 11892744, 12566666, 13368794, 13809523, 14226415, 14842519, 14842519, 15019920, + }, + }, + { + { + 16890756, 16657458, 16209677, 15541237, 14815724, 13704545, 12562500, 11355932, 10787119, 11271028, 12356557, 13370288, 14188235, 15075000, 15581395, 16080000, 16122994, + 16938202, 16611570, 16166219, 15541237, 14779411, 13673469, 12588726, 11334586, 10748663, 11250000, 12331288, 13311258, 14255319, 15150753, 15541237, 16080000, 16166219, + 16938202, 16657458, 16166219, 15501285, 14743276, 13673469, 12562500, 11292134, 10616197, 11146025, 12206477, 13281938, 14221698, 15075000, 15581395, 15994694, 16253369, + 16938202, 16657458, 16080000, 15421994, 14707317, 13550561, 12356557, 11208178, 10560420, 11064220, 12084168, 13165938, 14154929, 14962779, 15621761, 15994694, 16166219, + 16611570, 16430517, 16037234, 15382653, 14530120, 13550561, 12281059, 11064220, 10432525, 10923913, 11964285, 13080260, 14055944, 14852216, 15461538, 15994694, 16166219, + 16520547, 16385869, 15952380, 15343511, 14460431, 13311258, 12132796, 10904159, 10343053, 10787119, 11800391, 12995689, 14055944, 14743276, 15343511, 15868421, 16080000, + 16430517, 16209677, 15826771, 15265822, 14221698, 13137254, 11893491, 10787119, 10168634, 10616197, 11686046, 12857142, 13926096, 14565217, 15304568, 15703125, 15952380, + 16253369, 16122994, 15662337, 14962779, 14088785, 12995689, 11800391, 10672566, 10016611, 10505226, 11442125, 12588726, 13642533, 14495192, 15150753, 15581395, 15868421, + 16297297, 16080000, 15501285, 14888888, 13926096, 12939914, 11777343, 10578947, 10000000, 10414507, 11377358, 12562500, 13581081, 14391408, 15037406, 15421994, 15744125, + 16166219, 16080000, 15581395, 14888888, 14055944, 12939914, 11846758, 10691489, 10083612, 10468750, 11442125, 12536382, 13642533, 14391408, 15000000, 15421994, 15621761, + 16430517, 16253369, 15662337, 15037406, 14323040, 13108695, 11964285, 10864864, 10185810, 10653710, 11596153, 12721518, 13767123, 14600484, 15075000, 15621761, 15703125, + 16565934, 16385869, 15744125, 15150753, 14323040, 13223684, 12132796, 11043956, 10378657, 10787119, 11800391, 12884615, 13958333, 14671532, 15227272, 15826771, 16037234, + 16750000, 16430517, 15994694, 15304568, 14460431, 13400000, 12256097, 11146025, 10560420, 10943738, 11940594, 13051948, 14055944, 14852216, 15343511, 15785340, 15994694, + 16703601, 16475409, 15994694, 15304568, 14530120, 13489932, 12306122, 11250000, 10634920, 11023765, 12084168, 13165938, 14154929, 14925742, 15541237, 15952380, 16166219, + 16890756, 16703601, 15994694, 15541237, 14635922, 13611738, 12484472, 11398865, 10691489, 11146025, 12181818, 13137254, 14188235, 14962779, 15581395, 16037234, 16209677, + 16938202, 16611570, 16122994, 15662337, 14743276, 13642533, 12536382, 11507633, 10767857, 11166666, 12256097, 13281938, 14255319, 14962779, 15662337, 16037234, 16385869, + 16890756, 16565934, 16209677, 15703125, 14779411, 13642533, 12536382, 11507633, 10845323, 11208178, 12231237, 13340707, 14255319, 14925742, 15744125, 16037234, 16475409, + }, + { + 14250386, 14033485, 13720238, 13381712, 13096590, 12476319, 11881443, 11257631, 10976190, 11425030, 12163588, 12895104, 13479532, 14141104, 14406250, 14681528, 14752000, + 14162826, 13969696, 13740685, 13401162, 13041018, 12459459, 11850899, 11230207, 10950118, 11396786, 12131578, 12859135, 13499267, 14097859, 14406250, 14681528, 14823151, + 14076335, 13906485, 13740685, 13323699, 12949438, 12409152, 11745222, 11148730, 10859835, 11326781, 12036553, 12805555, 13440233, 13948562, 14383775, 14611727, 14775641, + 14012158, 13843843, 13538913, 13171428, 12859135, 12293333, 11612090, 11041916, 10758459, 11189320, 11927554, 12699724, 13304473, 13823088, 14272445, 14565560, 14658187, + 13740685, 13659259, 13440233, 13096590, 12682255, 12099737, 11467661, 10834312, 10597701, 11015531, 11715374, 12510176, 13228120, 13639053, 14033485, 14383775, 14565560, + 13598820, 13519061, 13209169, 12949438, 12527173, 11974025, 11257631, 10658959, 10394588, 10808909, 11525000, 12359249, 13004231, 13479532, 13885542, 14228395, 14339035, + 13381712, 13247126, 13041018, 12682255, 12244355, 11685678, 11055155, 10501138, 10199115, 10597701, 11299019, 12131578, 12823365, 13266187, 13720238, 14012158, 14141104, + 13190271, 13059490, 12823365, 12442645, 12036553, 11496259, 10847058, 10290178, 10021739, 10371203, 11081730, 11850899, 12561307, 13115220, 13519061, 13802395, 13906485, + 13115220, 12985915, 12682255, 12359249, 11881443, 11425030, 10808909, 10221729, 10000000, 10324748, 10989272, 11805377, 12476319, 12967651, 13362318, 13679525, 13781763, + 13228120, 13096590, 12805555, 12476319, 12036553, 11453416, 10911242, 10347923, 10065502, 10429864, 11081730, 11835686, 12544217, 13022598, 13401162, 13699851, 13843843, + 13362318, 13266187, 13004231, 12664835, 12276964, 11700507, 11108433, 10597701, 10221729, 10573394, 11271393, 12115637, 12752420, 13323699, 13618906, 13969696, 14054878, + 13618906, 13538913, 13152639, 12931276, 12493224, 11943005, 11340713, 10796252, 10501138, 10834312, 11525000, 12326203, 12949438, 13499267, 13843843, 14141104, 14228395, + 13948562, 13761194, 13479532, 13133903, 12752420, 12179656, 11525000, 11002386, 10758459, 11041916, 11805377, 12493224, 13190271, 13679525, 14033485, 14361370, 14474097, + 13969696, 13864661, 13618906, 13304473, 12877094, 12342704, 11670886, 11162227, 10847058, 11202916, 11943005, 12752420, 13362318, 13864661, 14228395, 14542586, 14658187, + 14162826, 14054878, 13740685, 13420669, 13022598, 12476319, 11866151, 11299019, 10989272, 11340713, 12083879, 12877094, 13479532, 13969696, 14406250, 14588607, 14799357, + 14316770, 14162826, 13843843, 13558823, 13133903, 12578444, 11927554, 11439205, 11095066, 11410891, 12147562, 12913165, 13598820, 14076335, 14519685, 14658187, 14870967, + 14383775, 14162826, 13906485, 13639053, 13190271, 12595628, 11912144, 11425030, 11175757, 11453416, 12179656, 12913165, 13618906, 14097859, 14588607, 14752000, 14967532, + }, + { + 14228395, 14033485, 13699851, 13401162, 13096590, 12510176, 11881443, 11243902, 10976190, 11425030, 12195767, 12931276, 13538913, 14162826, 14406250, 14704944, 14799357, + 14184615, 13969696, 13720238, 13401162, 13022598, 12459459, 11850899, 11216545, 10950118, 11410891, 12147562, 12877094, 13519061, 14119448, 14406250, 14704944, 14823151, + 14097859, 13885542, 13740685, 13342981, 12967651, 12409152, 11745222, 11148730, 10872641, 11326781, 12036553, 12823365, 13459854, 13990895, 14383775, 14611727, 14752000, + 14012158, 13843843, 13558823, 13171428, 12877094, 12309746, 11612090, 11041916, 10758459, 11189320, 11927554, 12734806, 13285302, 13843843, 14294573, 14565560, 14634920, + 13740685, 13679525, 13440233, 13096590, 12682255, 12115637, 11496259, 10834312, 10597701, 11002386, 11730279, 12527173, 13228120, 13659259, 14054878, 14406250, 14542586, + 13618906, 13519061, 13209169, 12949438, 12510176, 11974025, 11271393, 10658959, 10406320, 10796252, 11525000, 12375838, 13004231, 13499267, 13906485, 14228395, 14383775, + 13381712, 13228120, 13041018, 12682255, 12260638, 11685678, 11055155, 10501138, 10210409, 10585533, 11299019, 12147562, 12823365, 13266187, 13740685, 14012158, 14141104, + 13171428, 13078014, 12823365, 12442645, 12036553, 11481942, 10834312, 10301675, 10021739, 10371203, 11095066, 11850899, 12578444, 13115220, 13519061, 13823088, 13927492, + 13096590, 12985915, 12682255, 12342704, 11881443, 11425030, 10796252, 10221729, 10000000, 10324748, 11002386, 11790281, 12476319, 12967651, 13362318, 13679525, 13823088, + 13228120, 13078014, 12787794, 12476319, 12020860, 11453416, 10924170, 10336322, 10065502, 10406320, 11081730, 11835686, 12544217, 13022598, 13420669, 13720238, 13864661, + 13381712, 13247126, 13022598, 12664835, 12260638, 11685678, 11081730, 10597701, 10233074, 10585533, 11299019, 12115637, 12752420, 13342981, 13639053, 13969696, 14054878, + 13639053, 13519061, 13171428, 12931276, 12493224, 11958495, 11340713, 10783625, 10501138, 10834312, 11525000, 12342704, 12967651, 13519061, 13864661, 14141104, 14250386, + 13969696, 13761194, 13459854, 13133903, 12752420, 12163588, 11525000, 11002386, 10733410, 11055155, 11790281, 12510176, 13190271, 13679525, 14054878, 14361370, 14474097, + 13990895, 13843843, 13598820, 13285302, 12877094, 12342704, 11670886, 11148730, 10847058, 11189320, 11958495, 12752420, 13381712, 13885542, 14206471, 14542586, 14634920, + 14119448, 14054878, 13740685, 13401162, 13004231, 12476319, 11850899, 11285189, 10976190, 11340713, 12099737, 12877094, 13479532, 13990895, 14406250, 14611727, 14775641, + 14272445, 14162826, 13823088, 13538913, 13115220, 12561307, 11927554, 11410891, 11081730, 11425030, 12147562, 12931276, 13578792, 14076335, 14496855, 14681528, 14870967, + 14294573, 14141104, 13885542, 13618906, 13190271, 12578444, 11943005, 11425030, 11162227, 11467661, 12163588, 12931276, 13598820, 14097859, 14565560, 14775641, 14967532, + }, + { + 14389312, 14172932, 13962962, 13610108, 13368794, 12866894, 12240259, 11600000, 11529051, 11855345, 12608695, 13228070, 13809523, 14280303, 14389312, 14612403, 14726562, + 14280303, 14067164, 14014869, 13610108, 13321554, 12779661, 12240259, 11600000, 11493902, 11781250, 12524916, 13135888, 13759124, 14172932, 14444444, 14555984, 14784313, + 14172932, 14067164, 13860294, 13416370, 13135888, 12693602, 12200647, 11493902, 11287425, 11635802, 12401315, 13000000, 13610108, 14119850, 14389312, 14612403, 14784313, + 14119850, 14067164, 13610108, 13321554, 13090277, 12608695, 11930379, 11355421, 11088235, 11564417, 12280130, 12866894, 13464285, 13860294, 14280303, 14555984, 14669260, + 13709090, 13709090, 13464285, 13181818, 12779661, 12280130, 11671826, 11088235, 10833333, 11220238, 11892744, 12693602, 13321554, 13561151, 13911439, 14226415, 14226415, + 13561151, 13512544, 13228070, 12955326, 12566666, 12006369, 11458966, 10833333, 10560224, 10895953, 11671826, 12483443, 13135888, 13416370, 13709090, 14014869, 14014869, + 13321554, 13181818, 13090277, 12779661, 12240259, 11708074, 11120943, 10649717, 10272479, 10619718, 11321321, 12122186, 12779661, 13090277, 13561151, 13709090, 13860294, + 13090277, 13000000, 12736486, 12483443, 12044728, 11458966, 10927536, 10357142, 10053333, 10443213, 11088235, 11818181, 12442244, 13000000, 13274647, 13512544, 13659420, + 12866894, 12779661, 12736486, 12360655, 11855345, 11458966, 10895953, 10385674, 10000000, 10385674, 11023391, 11781250, 12442244, 12866894, 13228070, 13464285, 13464285, + 13135888, 13000000, 12823129, 12442244, 12044728, 11458966, 11023391, 10443213, 10161725, 10501392, 11186943, 11930379, 12651006, 12910958, 13181818, 13464285, 13416370, + 13321554, 13274647, 12955326, 12736486, 12442244, 11671826, 11253731, 10740740, 10414364, 10740740, 11389728, 12161290, 12866894, 13228070, 13512544, 13809523, 13860294, + 13561151, 13464285, 13135888, 12866894, 12566666, 12006369, 11458966, 11055718, 10679886, 11023391, 11744548, 12483443, 13044982, 13512544, 13759124, 14014869, 14067164, + 13962962, 13759124, 13464285, 13274647, 12779661, 12240259, 11708074, 11220238, 10959302, 11287425, 12044728, 12736486, 13321554, 13709090, 14014869, 14226415, 14334600, + 13860294, 13809523, 13709090, 13321554, 12910958, 12524916, 11968253, 11458966, 11120943, 11493902, 12200647, 12866894, 13561151, 13962962, 14172932, 14500000, 14555984, + 14067164, 14067164, 13659420, 13561151, 13044982, 12608695, 12161290, 11564417, 11321321, 11708074, 12401315, 13135888, 13759124, 14119850, 14500000, 14726562, 14842519, + 14334600, 14280303, 13809523, 13709090, 13181818, 12693602, 12240259, 11744548, 11458966, 11855345, 12608695, 13321554, 13809523, 14226415, 14726562, 14784313, 14901185, + 14444444, 14334600, 13860294, 13709090, 13274647, 12736486, 12240259, 11781250, 11529051, 11892744, 12566666, 13368794, 13809523, 14226415, 14842519, 14842519, 15019920, + }, + }, + { + { + 16890756, 16657458, 16209677, 15541237, 14815724, 13704545, 12562500, 11355932, 10787119, 11271028, 12356557, 13370288, 14188235, 15075000, 15581395, 16080000, 16122994, + 16938202, 16611570, 16166219, 15541237, 14779411, 13673469, 12588726, 11334586, 10748663, 11250000, 12331288, 13311258, 14255319, 15150753, 15541237, 16080000, 16166219, + 16938202, 16657458, 16166219, 15501285, 14743276, 13673469, 12562500, 11292134, 10616197, 11146025, 12206477, 13281938, 14221698, 15075000, 15581395, 15994694, 16253369, + 16938202, 16657458, 16080000, 15421994, 14707317, 13550561, 12356557, 11208178, 10560420, 11064220, 12084168, 13165938, 14154929, 14962779, 15621761, 15994694, 16166219, + 16611570, 16430517, 16037234, 15382653, 14530120, 13550561, 12281059, 11064220, 10432525, 10923913, 11964285, 13080260, 14055944, 14852216, 15461538, 15994694, 16166219, + 16520547, 16385869, 15952380, 15343511, 14460431, 13311258, 12132796, 10904159, 10343053, 10787119, 11800391, 12995689, 14055944, 14743276, 15343511, 15868421, 16080000, + 16430517, 16209677, 15826771, 15265822, 14221698, 13137254, 11893491, 10787119, 10168634, 10616197, 11686046, 12857142, 13926096, 14565217, 15304568, 15703125, 15952380, + 16253369, 16122994, 15662337, 14962779, 14088785, 12995689, 11800391, 10672566, 10016611, 10505226, 11442125, 12588726, 13642533, 14495192, 15150753, 15581395, 15868421, + 16297297, 16080000, 15501285, 14888888, 13926096, 12939914, 11777343, 10578947, 10000000, 10414507, 11377358, 12562500, 13581081, 14391408, 15037406, 15421994, 15744125, + 16166219, 16080000, 15581395, 14888888, 14055944, 12939914, 11846758, 10691489, 10083612, 10468750, 11442125, 12536382, 13642533, 14391408, 15000000, 15421994, 15621761, + 16430517, 16253369, 15662337, 15037406, 14323040, 13108695, 11964285, 10864864, 10185810, 10653710, 11596153, 12721518, 13767123, 14600484, 15075000, 15621761, 15703125, + 16565934, 16385869, 15744125, 15150753, 14323040, 13223684, 12132796, 11043956, 10378657, 10787119, 11800391, 12884615, 13958333, 14671532, 15227272, 15826771, 16037234, + 16750000, 16430517, 15994694, 15304568, 14460431, 13400000, 12256097, 11146025, 10560420, 10943738, 11940594, 13051948, 14055944, 14852216, 15343511, 15785340, 15994694, + 16703601, 16475409, 15994694, 15304568, 14530120, 13489932, 12306122, 11250000, 10634920, 11023765, 12084168, 13165938, 14154929, 14925742, 15541237, 15952380, 16166219, + 16890756, 16703601, 15994694, 15541237, 14635922, 13611738, 12484472, 11398865, 10691489, 11146025, 12181818, 13137254, 14188235, 14962779, 15581395, 16037234, 16209677, + 16938202, 16611570, 16122994, 15662337, 14743276, 13642533, 12536382, 11507633, 10767857, 11166666, 12256097, 13281938, 14255319, 14962779, 15662337, 16037234, 16385869, + 16890756, 16565934, 16209677, 15703125, 14779411, 13642533, 12536382, 11507633, 10845323, 11208178, 12231237, 13340707, 14255319, 14925742, 15744125, 16037234, 16475409, + }, + { + 14250386, 14033485, 13720238, 13381712, 13096590, 12476319, 11881443, 11257631, 10976190, 11425030, 12163588, 12895104, 13479532, 14141104, 14406250, 14681528, 14752000, + 14162826, 13969696, 13740685, 13401162, 13041018, 12459459, 11850899, 11230207, 10950118, 11396786, 12131578, 12859135, 13499267, 14097859, 14406250, 14681528, 14823151, + 14076335, 13906485, 13740685, 13323699, 12949438, 12409152, 11745222, 11148730, 10859835, 11326781, 12036553, 12805555, 13440233, 13948562, 14383775, 14611727, 14775641, + 14012158, 13843843, 13538913, 13171428, 12859135, 12293333, 11612090, 11041916, 10758459, 11189320, 11927554, 12699724, 13304473, 13823088, 14272445, 14565560, 14658187, + 13740685, 13659259, 13440233, 13096590, 12682255, 12099737, 11467661, 10834312, 10597701, 11015531, 11715374, 12510176, 13228120, 13639053, 14033485, 14383775, 14565560, + 13598820, 13519061, 13209169, 12949438, 12527173, 11974025, 11257631, 10658959, 10394588, 10808909, 11525000, 12359249, 13004231, 13479532, 13885542, 14228395, 14339035, + 13381712, 13247126, 13041018, 12682255, 12244355, 11685678, 11055155, 10501138, 10199115, 10597701, 11299019, 12131578, 12823365, 13266187, 13720238, 14012158, 14141104, + 13190271, 13059490, 12823365, 12442645, 12036553, 11496259, 10847058, 10290178, 10021739, 10371203, 11081730, 11850899, 12561307, 13115220, 13519061, 13802395, 13906485, + 13115220, 12985915, 12682255, 12359249, 11881443, 11425030, 10808909, 10221729, 10000000, 10324748, 10989272, 11805377, 12476319, 12967651, 13362318, 13679525, 13781763, + 13228120, 13096590, 12805555, 12476319, 12036553, 11453416, 10911242, 10347923, 10065502, 10429864, 11081730, 11835686, 12544217, 13022598, 13401162, 13699851, 13843843, + 13362318, 13266187, 13004231, 12664835, 12276964, 11700507, 11108433, 10597701, 10221729, 10573394, 11271393, 12115637, 12752420, 13323699, 13618906, 13969696, 14054878, + 13618906, 13538913, 13152639, 12931276, 12493224, 11943005, 11340713, 10796252, 10501138, 10834312, 11525000, 12326203, 12949438, 13499267, 13843843, 14141104, 14228395, + 13948562, 13761194, 13479532, 13133903, 12752420, 12179656, 11525000, 11002386, 10758459, 11041916, 11805377, 12493224, 13190271, 13679525, 14033485, 14361370, 14474097, + 13969696, 13864661, 13618906, 13304473, 12877094, 12342704, 11670886, 11162227, 10847058, 11202916, 11943005, 12752420, 13362318, 13864661, 14228395, 14542586, 14658187, + 14162826, 14054878, 13740685, 13420669, 13022598, 12476319, 11866151, 11299019, 10989272, 11340713, 12083879, 12877094, 13479532, 13969696, 14406250, 14588607, 14799357, + 14316770, 14162826, 13843843, 13558823, 13133903, 12578444, 11927554, 11439205, 11095066, 11410891, 12147562, 12913165, 13598820, 14076335, 14519685, 14658187, 14870967, + 14383775, 14162826, 13906485, 13639053, 13190271, 12595628, 11912144, 11425030, 11175757, 11453416, 12179656, 12913165, 13618906, 14097859, 14588607, 14752000, 14967532, + }, + { + 14228395, 14033485, 13699851, 13401162, 13096590, 12510176, 11881443, 11243902, 10976190, 11425030, 12195767, 12931276, 13538913, 14162826, 14406250, 14704944, 14799357, + 14184615, 13969696, 13720238, 13401162, 13022598, 12459459, 11850899, 11216545, 10950118, 11410891, 12147562, 12877094, 13519061, 14119448, 14406250, 14704944, 14823151, + 14097859, 13885542, 13740685, 13342981, 12967651, 12409152, 11745222, 11148730, 10872641, 11326781, 12036553, 12823365, 13459854, 13990895, 14383775, 14611727, 14752000, + 14012158, 13843843, 13558823, 13171428, 12877094, 12309746, 11612090, 11041916, 10758459, 11189320, 11927554, 12734806, 13285302, 13843843, 14294573, 14565560, 14634920, + 13740685, 13679525, 13440233, 13096590, 12682255, 12115637, 11496259, 10834312, 10597701, 11002386, 11730279, 12527173, 13228120, 13659259, 14054878, 14406250, 14542586, + 13618906, 13519061, 13209169, 12949438, 12510176, 11974025, 11271393, 10658959, 10406320, 10796252, 11525000, 12375838, 13004231, 13499267, 13906485, 14228395, 14383775, + 13381712, 13228120, 13041018, 12682255, 12260638, 11685678, 11055155, 10501138, 10210409, 10585533, 11299019, 12147562, 12823365, 13266187, 13740685, 14012158, 14141104, + 13171428, 13078014, 12823365, 12442645, 12036553, 11481942, 10834312, 10301675, 10021739, 10371203, 11095066, 11850899, 12578444, 13115220, 13519061, 13823088, 13927492, + 13096590, 12985915, 12682255, 12342704, 11881443, 11425030, 10796252, 10221729, 10000000, 10324748, 11002386, 11790281, 12476319, 12967651, 13362318, 13679525, 13823088, + 13228120, 13078014, 12787794, 12476319, 12020860, 11453416, 10924170, 10336322, 10065502, 10406320, 11081730, 11835686, 12544217, 13022598, 13420669, 13720238, 13864661, + 13381712, 13247126, 13022598, 12664835, 12260638, 11685678, 11081730, 10597701, 10233074, 10585533, 11299019, 12115637, 12752420, 13342981, 13639053, 13969696, 14054878, + 13639053, 13519061, 13171428, 12931276, 12493224, 11958495, 11340713, 10783625, 10501138, 10834312, 11525000, 12342704, 12967651, 13519061, 13864661, 14141104, 14250386, + 13969696, 13761194, 13459854, 13133903, 12752420, 12163588, 11525000, 11002386, 10733410, 11055155, 11790281, 12510176, 13190271, 13679525, 14054878, 14361370, 14474097, + 13990895, 13843843, 13598820, 13285302, 12877094, 12342704, 11670886, 11148730, 10847058, 11189320, 11958495, 12752420, 13381712, 13885542, 14206471, 14542586, 14634920, + 14119448, 14054878, 13740685, 13401162, 13004231, 12476319, 11850899, 11285189, 10976190, 11340713, 12099737, 12877094, 13479532, 13990895, 14406250, 14611727, 14775641, + 14272445, 14162826, 13823088, 13538913, 13115220, 12561307, 11927554, 11410891, 11081730, 11425030, 12147562, 12931276, 13578792, 14076335, 14496855, 14681528, 14870967, + 14294573, 14141104, 13885542, 13618906, 13190271, 12578444, 11943005, 11425030, 11162227, 11467661, 12163588, 12931276, 13598820, 14097859, 14565560, 14775641, 14967532, + }, + { + 14389312, 14172932, 13962962, 13610108, 13368794, 12866894, 12240259, 11600000, 11529051, 11855345, 12608695, 13228070, 13809523, 14280303, 14389312, 14612403, 14726562, + 14280303, 14067164, 14014869, 13610108, 13321554, 12779661, 12240259, 11600000, 11493902, 11781250, 12524916, 13135888, 13759124, 14172932, 14444444, 14555984, 14784313, + 14172932, 14067164, 13860294, 13416370, 13135888, 12693602, 12200647, 11493902, 11287425, 11635802, 12401315, 13000000, 13610108, 14119850, 14389312, 14612403, 14784313, + 14119850, 14067164, 13610108, 13321554, 13090277, 12608695, 11930379, 11355421, 11088235, 11564417, 12280130, 12866894, 13464285, 13860294, 14280303, 14555984, 14669260, + 13709090, 13709090, 13464285, 13181818, 12779661, 12280130, 11671826, 11088235, 10833333, 11220238, 11892744, 12693602, 13321554, 13561151, 13911439, 14226415, 14226415, + 13561151, 13512544, 13228070, 12955326, 12566666, 12006369, 11458966, 10833333, 10560224, 10895953, 11671826, 12483443, 13135888, 13416370, 13709090, 14014869, 14014869, + 13321554, 13181818, 13090277, 12779661, 12240259, 11708074, 11120943, 10649717, 10272479, 10619718, 11321321, 12122186, 12779661, 13090277, 13561151, 13709090, 13860294, + 13090277, 13000000, 12736486, 12483443, 12044728, 11458966, 10927536, 10357142, 10053333, 10443213, 11088235, 11818181, 12442244, 13000000, 13274647, 13512544, 13659420, + 12866894, 12779661, 12736486, 12360655, 11855345, 11458966, 10895953, 10385674, 10000000, 10385674, 11023391, 11781250, 12442244, 12866894, 13228070, 13464285, 13464285, + 13135888, 13000000, 12823129, 12442244, 12044728, 11458966, 11023391, 10443213, 10161725, 10501392, 11186943, 11930379, 12651006, 12910958, 13181818, 13464285, 13416370, + 13321554, 13274647, 12955326, 12736486, 12442244, 11671826, 11253731, 10740740, 10414364, 10740740, 11389728, 12161290, 12866894, 13228070, 13512544, 13809523, 13860294, + 13561151, 13464285, 13135888, 12866894, 12566666, 12006369, 11458966, 11055718, 10679886, 11023391, 11744548, 12483443, 13044982, 13512544, 13759124, 14014869, 14067164, + 13962962, 13759124, 13464285, 13274647, 12779661, 12240259, 11708074, 11220238, 10959302, 11287425, 12044728, 12736486, 13321554, 13709090, 14014869, 14226415, 14334600, + 13860294, 13809523, 13709090, 13321554, 12910958, 12524916, 11968253, 11458966, 11120943, 11493902, 12200647, 12866894, 13561151, 13962962, 14172932, 14500000, 14555984, + 14067164, 14067164, 13659420, 13561151, 13044982, 12608695, 12161290, 11564417, 11321321, 11708074, 12401315, 13135888, 13759124, 14119850, 14500000, 14726562, 14842519, + 14334600, 14280303, 13809523, 13709090, 13181818, 12693602, 12240259, 11744548, 11458966, 11855345, 12608695, 13321554, 13809523, 14226415, 14726562, 14784313, 14901185, + 14444444, 14334600, 13860294, 13709090, 13274647, 12736486, 12240259, 11781250, 11529051, 11892744, 12566666, 13368794, 13809523, 14226415, 14842519, 14842519, 15019920, + }, + }, +}; + +static ISP_CMOS_RGBIR_S g_stCmosRgbir = +{ + 1, /* bValid*/ + + { + 1, + 0,/*0:ISP_CMOS_IRPOS_TYPE_GR; 1:ISP_CMOS_IRPOS_TYPE_GB*/ + 4031, + }, + { + 0, + 1, + 1, + 0,/*0:OP_CMOS_TYPE_AUTO; 1:OP_CMOS_TYPE_MANUL*/ + 0x100, + {266,3,36,8,272,30,15,5,283,-300,-305,-313,-3,-12,-4}/*new method*/ + } +}; + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + pstDef->stDrc.bEnable = HI_FALSE; + pstDef->stDrc.u8Asymmetry = 0x02; + pstDef->stDrc.u8SecondPole = 0xC0; + pstDef->stDrc.u8Stretch = 0x3C; + pstDef->stDrc.u8LocalMixingBrigtht = 0x2D; + pstDef->stDrc.u8LocalMixingDark = 0x2D; + pstDef->stDrc.u8LocalMixingThres = 0x02; + pstDef->stDrc.u16BrightGainLmt = 0x7F; + pstDef->stDrc.u16DarkGainLmtC = 0x7F; + pstDef->stDrc.u16DarkGainLmtY = 0x7F; + pstDef->stDrc.u8RangeVar = 0x00; + pstDef->stDrc.u8SpatialVar = 0x0A; + memcpy(&pstDef->stLsc.stLscParaTable[0], &g_stCmosLscTable[0], sizeof(ISP_LSC_CABLI_TABLE_S)*HI_ISP_LSC_LIGHT_NUM); + + memcpy(&pstDef->stDemosaic, &g_stIspDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_stIspRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGe, &g_stIspGe, sizeof(ISP_CMOS_GE_S)); + + pstDef->stNoiseTbl.stNrCaliPara.pCalibcoef = (HI_FLOAT (*)[4])g_coef_calib_ov9752; + memcpy(&pstDef->stNoiseTbl.stIsoParaTable[0], &g_stNrIsoParaTab[0],sizeof(ISP_NR_ISO_PARA_TABLE_S)*HI_ISP_NR_ISO_LEVEL_MAX); + + memcpy(&pstDef->stUvnr, &g_stIspUVNR, sizeof(ISP_CMOS_UVNR_S)); + memcpy(&pstDef->stDpc, &g_stCmosDpc, sizeof(ISP_CMOS_DPC_S)); + memcpy(&pstDef->stRgbir, &g_stCmosRgbir, sizeof(ISP_CMOS_RGBIR_S)); + //memcpy(&pstDef->stLsc, &g_stCmosLscTable, sizeof(ISP_LSC_CABLI_TABLE_S)); + + pstDef->stSensorMaxResolution.u32MaxWidth = 1280; + pstDef->stSensorMaxResolution.u32MaxHeight = 720; + + return 0; +} +#endif + +HI_U32 cmos_get_isp_black_level(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel) +{ + HI_S32 i; + + if (HI_NULL == pstBlackLevel) + { + printf("null pointer when get isp black level value!\n"); + return -1; + } + + /* Don't need to update black level when iso change */ + pstBlackLevel->bUpdate = HI_FALSE; + + for (i=0; i<4; i++) + { + pstBlackLevel->au16BlackLevel[i] = 0x40; + } + + return 0; + +} + +HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) +{ + HI_U32 u32FullLines_5Fps = 0; + HI_U32 u32MaxIntTime_5Fps = 0; + + if ((WDR_MODE_NONE == genSensorMode) && (SENSOR_720P_30FPS_MODE == gu8SensorImageMode)) + { + u32FullLines_5Fps = (VMAX_720P30_LINEAR * 30) / 5; + } + else + { + return; + } + + u32FullLines_5Fps = (u32FullLines_5Fps > 0xFFFF) ? 0xFFFF : u32FullLines_5Fps; + u32MaxIntTime_5Fps = u32FullLines_5Fps - 2; + + if (bEnable) /* setup for ISP pixel calibration mode */ + { + sensor_write_register(VMAX_ADDR_H, (u32FullLines_5Fps & 0xFF00) >> 8); /* 5fps */ + sensor_write_register(VMAX_ADDR_L, u32FullLines_5Fps & 0xFF); /* 5fps */ + sensor_write_register(LONG_EXPOSURE_ADDR, (u32MaxIntTime_5Fps >> 12)); /* max exposure lines */ + sensor_write_register(LONG_EXPOSURE_ADDR+1, ((u32MaxIntTime_5Fps & 0xFFF)>>4)); /* max exposure lines */ + sensor_write_register(LONG_EXPOSURE_ADDR+2, ((u32MaxIntTime_5Fps & 0xF)<<4)); /* max exposure lines */ + sensor_write_register(LONG_AGC_ADDR, 0x00); /* min AG */ + sensor_write_register(LONG_AGC_ADDR+1, 0x80); /* min AG */ + } + else /* setup for ISP 'normal mode' */ + { + sensor_write_register(VMAX_ADDR_H, (gu32FullLinesStd & 0xFF00) >> 8); + sensor_write_register(VMAX_ADDR_L, gu32FullLinesStd & 0xFF); + + bInit = HI_FALSE; + } + + return; +} + +HI_VOID cmos_set_wdr_mode(HI_U8 u8Mode) +{ + bInit = HI_FALSE; + + switch(u8Mode) + { + case WDR_MODE_NONE: + if (SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + gu32FullLinesStd = VMAX_720P30_LINEAR; + } + genSensorMode = WDR_MODE_NONE; + printf("linear mode\n"); + break; + default: + printf("NOT support this mode!\n"); + return; + break; + } + + return; +} + +HI_U32 cmos_get_sns_regs_info(ISP_SNS_REGS_INFO_S *pstSnsRegsInfo) +{ + HI_S32 i; + + if (HI_FALSE == bInit) + { + g_stSnsRegsInfo.enSnsType = ISP_SNS_I2C_TYPE; + g_stSnsRegsInfo.u8Cfg2ValidDelayMax = 2; + g_stSnsRegsInfo.u32RegNum = 12; + + for (i=0; i (PATHLEN_MAX - 30)) + { + printf("Set inifile path is larger PATHLEN_MAX!\n"); + return -1; + } + strncat(pcName, pcPath, strlen(pcPath)); + strncat(pcName, CMOS_CFG_INI, sizeof(CMOS_CFG_INI)); + } + + return 0; + +} + +static HI_S32 cmos_set_image_mode(ISP_CMOS_SENSOR_IMAGE_MODE_S *pstSensorImageMode) +{ + HI_U8 u8SensorImageMode = gu8SensorImageMode; + + bInit = HI_FALSE; + + if (HI_NULL == pstSensorImageMode ) + { + printf("null pointer when set image mode\n"); + return -1; + } + + if ((pstSensorImageMode->u16Width <= 1280) && (pstSensorImageMode->u16Height <= 720)) + { + if (WDR_MODE_NONE == genSensorMode) + { + if (pstSensorImageMode->f32Fps <= 30) + { + u8SensorImageMode = SENSOR_720P_30FPS_MODE; + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps, + genSensorMode); + + return -1; + } + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps, + genSensorMode); + + return -1; + } + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps, + genSensorMode); + + return -1; + } + + /* Sensor first init */ + if (HI_FALSE == bSensorInit) + { + gu8SensorImageMode = u8SensorImageMode; + + return 0; + } + + /* Switch SensorImageMode */ + if (u8SensorImageMode == gu8SensorImageMode) + { + /* Don't need to switch SensorImageMode */ + return -1; + } + + gu8SensorImageMode = u8SensorImageMode; + + return 0; +} + +HI_VOID sensor_global_init() +{ + gu8SensorImageMode = SENSOR_720P_30FPS_MODE; + genSensorMode = WDR_MODE_NONE; + gu32FullLinesStd = VMAX_720P30_LINEAR; + gu32FullLines = VMAX_720P30_LINEAR; + bInit = HI_FALSE; + bSensorInit = HI_FALSE; + + memset(&g_stSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + memset(&g_stPreSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + +#ifdef INIFILE_CONFIG_MODE + HI_S32 s32Ret = HI_SUCCESS; + s32Ret = Cmos_LoadINIPara(pcName); + if (HI_SUCCESS != s32Ret) + { + printf("Cmos_LoadINIPara failed!!!!!!\n"); + } +#else + +#endif +} + +HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc) +{ + memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S)); + + pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init; + pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit; + pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init; + pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode; + pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode; + + pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default; + pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level; + pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect; + pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info; + + return 0; +} + +/**************************************************************************** + * callback structure * + ****************************************************************************/ + +int sensor_register_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + ISP_SENSOR_REGISTER_S stIspRegister; + AE_SENSOR_REGISTER_S stAeRegister; + AWB_SENSOR_REGISTER_S stAwbRegister; + + cmos_init_sensor_exp_function(&stIspRegister.stSnsExp); + s32Ret = HI_MPI_ISP_SensorRegCallBack(IspDev, OV9752_ID, &stIspRegister); + if (s32Ret) + { + printf("sensor register callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + cmos_init_ae_exp_function(&stAeRegister.stSnsExp); + s32Ret = HI_MPI_AE_SensorRegCallBack(IspDev, &stLib, OV9752_ID, &stAeRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + cmos_init_awb_exp_function(&stAwbRegister.stSnsExp); + s32Ret = HI_MPI_AWB_SensorRegCallBack(IspDev, &stLib, OV9752_ID, &stAwbRegister); + if (s32Ret) + { + printf("sensor register callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_unregister_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + + s32Ret = HI_MPI_ISP_SensorUnRegCallBack(IspDev, OV9752_ID); + if (s32Ret) + { + printf("sensor unregister callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + s32Ret = HI_MPI_AE_SensorUnRegCallBack(IspDev, &stLib, OV9752_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + s32Ret = HI_MPI_AWB_SensorUnRegCallBack(IspDev, &stLib, OV9752_ID); + if (s32Ret) + { + printf("sensor unregister callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* __MN34220_CMOS_H_ */ diff --git a/device/mpp/component/isp/sensor/omnivision_ov9752/ov9752_sensor_ctl.c b/device/mpp/component/isp/sensor/omnivision_ov9752/ov9752_sensor_ctl.c new file mode 100644 index 0000000..4f0cb27 --- /dev/null +++ b/device/mpp/component/isp/sensor/omnivision_ov9752/ov9752_sensor_ctl.c @@ -0,0 +1,461 @@ +#include +#include +#include +#include +#include +#include + +#include "hi_comm_video.h" + +#ifdef HI_GPIO_I2C +#include "gpioi2c_ex.h" +#else +#include "hi_i2c.h" +#endif + +const unsigned char sensor_i2c_addr = 0x42; /* I2C Address of OV4682 */ +const unsigned int sensor_addr_byte = 2; +const unsigned int sensor_data_byte = 1; +static int g_fd = -1; + +extern WDR_MODE_E genSensorMode; +extern HI_U8 gu8SensorImageMode; +extern HI_BOOL bSensorInit; + +int sensor_i2c_init(void) +{ + if(g_fd >= 0) + { + return 0; + } +#ifdef HI_GPIO_I2C + int ret; + + g_fd = open("/dev/gpioi2c_ex", 0); + if(g_fd < 0) + { + printf("Open gpioi2c_ex error!\n"); + return -1; + } +#else + int ret; + + g_fd = open("/dev/i2c-0", O_RDWR); + if(g_fd < 0) + { + printf("Open /dev/i2c-0 error!\n"); + return -1; + } + + ret = ioctl(g_fd, I2C_SLAVE_FORCE, sensor_i2c_addr); + if (ret < 0) + { + printf("CMD_SET_DEV error!\n"); + return ret; + } +#endif + + return 0; +} + +int sensor_i2c_exit(void) +{ + if (g_fd >= 0) + { + close(g_fd); + g_fd = -1; + return 0; + } + return -1; +} + +int sensor_read_register(int addr) +{ + // TODO: + + return 0; +} + +int sensor_write_register(int addr, int data) +{ +#ifdef HI_GPIO_I2C + i2c_data.dev_addr = sensor_i2c_addr; + i2c_data.reg_addr = addr; + i2c_data.addr_byte_num = sensor_addr_byte; + i2c_data.data = data; + i2c_data.data_byte_num = sensor_data_byte; + + ret = ioctl(g_fd, GPIO_I2C_WRITE, &i2c_data); + + if (ret) + { + printf("GPIO-I2C write faild!\n"); + return ret; + } +#else + int idx = 0; + int ret; + char buf[8]; + + buf[idx++] = addr & 0xFF; + if (sensor_addr_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_REG, 1); + buf[idx++] = addr >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_REG, 0); + } + + if (ret < 0) + { + printf("CMD_SET_REG_WIDTH error!\n"); + return -1; + } + + buf[idx++] = data; + if (sensor_data_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 1); + buf[idx++] = data >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 0); + } + + if (ret) + { + printf("hi_i2c write faild!\n"); + return -1; + } + + ret = write(g_fd, buf, idx); + if(ret < 0) + { + printf("I2C_WRITE error!\n"); + return -1; + } +#endif + return 0; +} + +static void delay_ms(int ms) { + usleep(ms*1000); +} + +void sensor_prog(int* rom) +{ + int i = 0; + while (1) { + int lookup = rom[i++]; + int addr = (lookup >> 16) & 0xFFFF; + int data = lookup & 0xFFFF; + if (addr == 0xFFFE) { + delay_ms(data); + } else if (addr == 0xFFFF) { + return; + } else { + sensor_write_register(addr, data); + } + } +} + +void sensor_linear_720p30_init(); + +#define SENSOR_720P_30FPS_MODE (1) + +void sensor_init() +{ + sensor_i2c_init(); + + /* When sensor first init, config all registers */ + if (HI_FALSE == bSensorInit) + { + if(SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + sensor_linear_720p30_init(); + } + } + /* When sensor switch mode(linear<->WDR or resolution), config different registers(if possible) */ + else + { + if(SENSOR_720P_30FPS_MODE == gu8SensorImageMode) + { + sensor_linear_720p30_init(); + } + } + + return ; +} + +void sensor_exit() +{ + sensor_i2c_exit(); + + return; +} + +/* 720P30 and 720P25 */ +void sensor_linear_720p30_init() +{ + /* #!/bin/sh +#MCLK=24MHz +# OV9752 720P 30FPS MIPI 480Mbps 2 lane Test ADC12bits*/ + sensor_write_register (0x0103, 0x01); + sensor_write_register (0x0100, 0x00); + sensor_write_register (0x0300, 0x04); + sensor_write_register (0x0302, 0x78); //#;64 + sensor_write_register (0x0303, 0x03); //#;00 + sensor_write_register (0x0304, 0x03); + sensor_write_register (0x0305, 0x01); + sensor_write_register (0x0306, 0x01); + sensor_write_register (0x030a, 0x00); + sensor_write_register (0x030b, 0x00); + sensor_write_register (0x030d, 0x1e); + sensor_write_register (0x030e, 0x01); + sensor_write_register (0x030f, 0x04); + sensor_write_register (0x0312, 0x01); + sensor_write_register (0x031e, 0x04); + sensor_write_register (0x3000, 0x00); + sensor_write_register (0x3001, 0x00); + sensor_write_register (0x3002, 0x21); + sensor_write_register (0x3005, 0xf0); + sensor_write_register (0x3011, 0x00); + sensor_write_register (0x3016, 0x53); + sensor_write_register (0x3018, 0x32); + sensor_write_register (0x301a, 0xf0); + sensor_write_register (0x301b, 0xf0); + sensor_write_register (0x301c, 0xf0); + sensor_write_register (0x301d, 0xf0); + sensor_write_register (0x301e, 0xf0); + sensor_write_register (0x3022, 0x01); + sensor_write_register (0x3031, 0x0a); + sensor_write_register (0x3032, 0x80); + sensor_write_register (0x303c, 0xff); + sensor_write_register (0x303e, 0xff); + sensor_write_register (0x3040, 0xf0); + sensor_write_register (0x3041, 0x00); + sensor_write_register (0x3042, 0xf0); + sensor_write_register (0x3104, 0x01); + sensor_write_register (0x3106, 0x15); + sensor_write_register (0x3107, 0x01); + sensor_write_register (0x3500, 0x00); + sensor_write_register (0x3501, 0x1d); + sensor_write_register (0x3502, 0x00); + sensor_write_register (0x3503, 0x78);//GAIN/SHUTTER delay config + sensor_write_register (0x3504, 0x03); + sensor_write_register (0x3505, 0x83); + sensor_write_register (0x3508, 0x02); + sensor_write_register (0x3509, 0x80); + sensor_write_register (0x3600, 0x65); + sensor_write_register (0x3601, 0x60); + sensor_write_register (0x3602, 0x22); + sensor_write_register (0x3610, 0xe8); + sensor_write_register (0x3611, 0x56); + sensor_write_register (0x3612, 0x18); + sensor_write_register (0x3613, 0x5a); + sensor_write_register (0x3614, 0x91); + sensor_write_register (0x3615, 0x79); + sensor_write_register (0x3617, 0x57); + sensor_write_register (0x3621, 0x90); + sensor_write_register (0x3622, 0x00); + sensor_write_register (0x3623, 0x00); + sensor_write_register (0x3633, 0x10); + sensor_write_register (0x3634, 0x10); + sensor_write_register (0x3635, 0x14); + sensor_write_register (0x3636, 0x13); + sensor_write_register (0x3650, 0x00); + sensor_write_register (0x3652, 0xff); + sensor_write_register (0x3654, 0x00); + sensor_write_register (0x3653, 0x34); + sensor_write_register (0x3655, 0x20); + sensor_write_register (0x3656, 0xff); + sensor_write_register (0x3657, 0xc4); + sensor_write_register (0x365a, 0xff); + sensor_write_register (0x365b, 0xff); + sensor_write_register (0x365e, 0xff); + sensor_write_register (0x365f, 0x00); + sensor_write_register (0x3668, 0x00); + sensor_write_register (0x366a, 0x07); + sensor_write_register (0x366d, 0x00); + sensor_write_register (0x366e, 0x10); + sensor_write_register (0x3702, 0x1d); + sensor_write_register (0x3703, 0x10); + sensor_write_register (0x3704, 0x14); + sensor_write_register (0x3705, 0x00); + sensor_write_register (0x3706, 0x27); + sensor_write_register (0x3709, 0x24); + sensor_write_register (0x370a, 0x00); + sensor_write_register (0x370b, 0x7d); + sensor_write_register (0x3714, 0x24); + sensor_write_register (0x371a, 0x5e); + sensor_write_register (0x3730, 0x82); + sensor_write_register (0x3733, 0x10); + sensor_write_register (0x373e, 0x18); + sensor_write_register (0x3755, 0x00); + sensor_write_register (0x3758, 0x00); + sensor_write_register (0x375b, 0x13); + sensor_write_register (0x3772, 0x23); + sensor_write_register (0x3773, 0x05); + sensor_write_register (0x3774, 0x16); + sensor_write_register (0x3775, 0x12); + sensor_write_register (0x3776, 0x08); + sensor_write_register (0x37a8, 0x38); + sensor_write_register (0x37b5, 0x36); + sensor_write_register (0x37c2, 0x04); + sensor_write_register (0x37c5, 0x00); + sensor_write_register (0x37c7, 0x30); + sensor_write_register (0x37c8, 0x00); + sensor_write_register (0x37d1, 0x13); + sensor_write_register (0x3800, 0x00); + sensor_write_register (0x3801, 0x00); + sensor_write_register (0x3802, 0x00); + sensor_write_register (0x3803, 0x04); + sensor_write_register (0x3804, 0x05); + sensor_write_register (0x3805, 0x0f); + sensor_write_register (0x3806, 0x02); //#;03 + sensor_write_register (0x3807, 0xdc); //#;cb + sensor_write_register (0x3808, 0x05); + sensor_write_register (0x3809, 0x00); + sensor_write_register (0x380a, 0x02); + sensor_write_register (0x380b, 0xd0); + sensor_write_register (0x380c, 0x06); //#;03 + sensor_write_register (0x380d, 0x53); //#;2a + sensor_write_register (0x380e, 0x03); + sensor_write_register (0x380f, 0xdc); + sensor_write_register (0x3810, 0x00); + sensor_write_register (0x3811, 0x08); + sensor_write_register (0x3812, 0x00); + sensor_write_register (0x3813, 0x04); + sensor_write_register (0x3814, 0x01); + sensor_write_register (0x3815, 0x01); + sensor_write_register (0x3816, 0x00); + sensor_write_register (0x3817, 0x00); + sensor_write_register (0x3818, 0x00); + sensor_write_register (0x3819, 0x00); + sensor_write_register (0x3820, 0x86);//flip V + sensor_write_register (0x3821, 0x46);//flip H + sensor_write_register (0x450b, 0x20); + sensor_write_register (0x3826, 0x00); + sensor_write_register (0x3827, 0x08); + sensor_write_register (0x382a, 0x01); + sensor_write_register (0x382b, 0x01); + sensor_write_register (0x3836, 0x02); + sensor_write_register (0x3838, 0x10); + sensor_write_register (0x3861, 0x00); + sensor_write_register (0x3862, 0x00); + sensor_write_register (0x3863, 0x02); + sensor_write_register (0x3b00, 0x00); + sensor_write_register (0x3c00, 0x89); + sensor_write_register (0x3c01, 0xab); + sensor_write_register (0x3c02, 0x01); + sensor_write_register (0x3c03, 0x00); + sensor_write_register (0x3c04, 0x00); + sensor_write_register (0x3c05, 0x03); + sensor_write_register (0x3c06, 0x00); + sensor_write_register (0x3c07, 0x05); + sensor_write_register (0x3c0c, 0x00); + sensor_write_register (0x3c0d, 0x00); + sensor_write_register (0x3c0e, 0x00); + sensor_write_register (0x3c0f, 0x00); + sensor_write_register (0x3c40, 0x00); + sensor_write_register (0x3c41, 0xa3); + sensor_write_register (0x3c43, 0x7d); + sensor_write_register (0x3c56, 0x80); + sensor_write_register (0x3c80, 0x08); + sensor_write_register (0x3c82, 0x01); + sensor_write_register (0x3c83, 0x61); + sensor_write_register (0x3d85, 0x17); + sensor_write_register (0x3f08, 0x08); + sensor_write_register (0x3f0a, 0x00); + sensor_write_register (0x3f0b, 0x30); + sensor_write_register (0x4000, 0xcd); + sensor_write_register (0x4003, 0x40); + sensor_write_register (0x4009, 0x0d); + sensor_write_register (0x4010, 0xf0); + sensor_write_register (0x4011, 0x70); + sensor_write_register (0x4017, 0x10); + sensor_write_register (0x4040, 0x00); + sensor_write_register (0x4041, 0x00); + sensor_write_register (0x4303, 0x00); + sensor_write_register (0x4307, 0x30); + sensor_write_register (0x4500, 0x30); + sensor_write_register (0x4502, 0x40); + sensor_write_register (0x4503, 0x06); + sensor_write_register (0x4508, 0xaa); + //sensor_write_register (0x450b, 0x20); + sensor_write_register (0x450c, 0x00); + sensor_write_register (0x4600, 0x00); + sensor_write_register (0x4601, 0x80); + sensor_write_register (0x4700, 0x04); + sensor_write_register (0x4704, 0x00); + sensor_write_register (0x4705, 0x04); + sensor_write_register (0x4837, 0x14); + sensor_write_register (0x484a, 0x3f); + sensor_write_register (0x5000, 0x10); + sensor_write_register (0x5001, 0x01); + sensor_write_register (0x5002, 0x28); + sensor_write_register (0x5004, 0x0c); + sensor_write_register (0x5006, 0x0c); + sensor_write_register (0x5007, 0xe0); + sensor_write_register (0x5008, 0x01); + sensor_write_register (0x5009, 0xb0); + sensor_write_register (0x502a, 0x18); + sensor_write_register (0x5901, 0x00); + sensor_write_register (0x5a01, 0x00); + sensor_write_register (0x5a03, 0x00); + sensor_write_register (0x5a04, 0x0c); + sensor_write_register (0x5a05, 0xe0); + sensor_write_register (0x5a06, 0x09); + sensor_write_register (0x5a07, 0xb0); + sensor_write_register (0x5a08, 0x06); + sensor_write_register (0x5e00, 0x00); + sensor_write_register (0x5e10, 0xfc); + + sensor_write_register (0x300f, 0x00); + sensor_write_register (0x3733, 0x10); + sensor_write_register (0x3610, 0xe8); + sensor_write_register (0x3611, 0x56); + sensor_write_register (0x3635, 0x14); + sensor_write_register (0x3636, 0x13); + sensor_write_register (0x3620, 0x84); + sensor_write_register (0x3614, 0x96); + sensor_write_register (0x481f, 0x30); + sensor_write_register (0x3788, 0x00); + sensor_write_register (0x3789, 0x04); + sensor_write_register (0x378a, 0x01); + sensor_write_register (0x378b, 0x60); + sensor_write_register (0x3799, 0x27); //#;;12bits + sensor_write_register (0x300f, 0x00); + sensor_write_register (0x3602, 0x32); + sensor_write_register (0x3706, 0x48); + sensor_write_register (0x370b, 0xfa); + sensor_write_register (0x5000, 0x30); + sensor_write_register (0x502a, 0x14); + sensor_write_register (0x3031, 0x0c); + + //sleep 1 + + //# ADC 12 Bits (MIPI); frame rate * 3/4 + sensor_write_register (0x0100, 0x00); + sensor_write_register (0x300f, 0x00); + sensor_write_register (0x3602, 0x32); + sensor_write_register (0x3706, 0x48); + sensor_write_register (0x370b, 0xfa); + sensor_write_register (0x5000, 0x30); + sensor_write_register (0x502a, 0x14); + sensor_write_register (0x3031, 0x0c); + + sensor_write_register (0x0100, 0x01); + + bSensorInit = HI_TRUE; + printf("=========================================================\n"); + printf("===panasonic ov9752 sensor 720P30fps(MIPI port) init success!=====\n"); + printf("=========================================================\n"); + + return; +} + + diff --git a/device/mpp/component/isp/sensor/panasonic_mn34222/Makefile b/device/mpp/component/isp/sensor/panasonic_mn34222/Makefile new file mode 100644 index 0000000..23fe483 --- /dev/null +++ b/device/mpp/component/isp/sensor/panasonic_mn34222/Makefile @@ -0,0 +1,75 @@ +# +# sensor lib Makefile +# + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../../../Makefile.param + include $(PARAM_FILE) +endif + +ISP_PATH := $(SDK_PATH)/mpp/component/isp +EXT_PATH := $(SDK_PATH)/mpp/$(EXTDRV) +3A_PATH := $(ISP_PATH)/3a +LIBPATH = $(ISP_PATH)/lib +OBJPATH = ./obj + +ifeq ($(CONFIG_GPIO_I2C),y) +HI_GPIO_I2C:=HI_GPIO_I2C +else +HI_GPIO_I2C:=HI_GPIO_XXX +endif + +ARFLAGS = rcv +ARFLAGS_SO = $(LIBS_LD_CFLAGS) +ARFLAGS_SO += -shared -fPIC -o +CFLAGS = -Wall -fPIC -D$(HI_FPGA) -D$(HI_GPIO_I2C) +CFLAGS += -O2 +CFLAGS += $(LIBS_CFLAGS) + +ifeq ($(ISP_INI_CONFIG), y) +CFLAGS += -D INIFILE_CONFIG_MODE +endif + +ifeq ($(HIGDB),HI_GDB) +CFLAGS += -g +endif + +ifeq ($(CONFIG_JPEGEDCF), y) + CFLAGS += -D ENABLE_JPEGEDCF +endif +BUS_DIR := $(EXT_PATH)/ssp-sony/ + +ISP_INC := $(ISP_PATH)/include +3A_INC := $(3A_PATH)/include +INC := -I$(BUS_DIR) -I$(REL_INC) -I$(ISP_INC) -I$(3A_INC) -I$(ISP_PATH)/iniparser + +ifeq ($(CONFIG_GPIO_I2C), y) + INC += -I$(EXT_PATH)/gpio-i2c-ex + INC += -I$(EXT_PATH)/gpio-i2c +else + INC += -I$(EXT_PATH)/i2c + INC += -I$(EXT_PATH)/hi_i2c +endif + +COMPILE = $(CC) $(CFLAGS) $(DFLAGS) -lm + +$(OBJPATH)/%.o: ./%.c + @[ -e $(LIBPATH) ] || mkdir $(LIBPATH) + @[ -e $(OBJPATH) ] || mkdir $(OBJPATH) + @$(COMPILE) -o $@ -c $< $(INC) + +SRCS = $(wildcard ./*.c) +OBJS = $(SRCS:%.c=%.o) +OBJS := $(OBJS:./%=obj/%) + +TARGETLIB := $(LIBPATH)/libsns_mn34222.a +TARGETLIB_SO := $(LIBPATH)/libsns_mn34222.so + +all:$(TARGETLIB) +$(TARGETLIB):$(OBJS) + @($(AR) $(ARFLAGS) $(TARGETLIB) $(OBJS)) + @($(CC) $(ARFLAGS_SO) $(TARGETLIB_SO) $(OBJS)) + +clean: + @$(RM) -rf $(TARGETLIB) $(OBJS) + @$(RM) -rf $(LIBPATH) $(OBJPATH) diff --git a/device/mpp/component/isp/sensor/panasonic_mn34222/mn34222_cmos.c b/device/mpp/component/isp/sensor/panasonic_mn34222/mn34222_cmos.c new file mode 100644 index 0000000..d4f3286 --- /dev/null +++ b/device/mpp/component/isp/sensor/panasonic_mn34222/mn34222_cmos.c @@ -0,0 +1,1066 @@ +#if !defined(__MN34222_CMOS_H_) +#define __MN34222_CMOS_H_ + +#include +#include +#include +#include "hi_comm_sns.h" +#include "hi_comm_video.h" +#include "hi_sns_ctrl.h" +#include "mpi_isp.h" +#include "mpi_ae.h" +#include "mpi_awb.h" +#include "mpi_af.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +#define MN34222_ID 34222 + + +/* To change the mode of config. ifndef INIFILE_CONFIG_MODE, quick config mode.*/ +/* else, cmos_cfg.ini file config mode*/ +#ifdef INIFILE_CONFIG_MODE + +extern AE_SENSOR_DEFAULT_S g_AeDft[]; +extern AWB_SENSOR_DEFAULT_S g_AwbDft[]; +extern ISP_CMOS_DEFAULT_S g_IspDft[]; +extern HI_S32 Cmos_LoadINIPara(const HI_CHAR *pcName); +#else + +#endif + +/**************************************************************************** + * local variables * + ****************************************************************************/ + +extern const unsigned int sensor_i2c_addr; +extern unsigned int sensor_addr_byte; +extern unsigned int sensor_data_byte; + +#define EXPOSURE_ADDR_HHH (0x0220) +#define EXPOSURE_ADDR_H (0x0202) +#define EXPOSURE_ADDR_L (0x0203) +#define SHORT_EXPOSURE_ADDR_H (0x312A) +#define SHORT_EXPOSURE_ADDR_L (0x312B) +#define AGC_ADDR_H (0x0204) +#define AGC_ADDR_L (0x0205) +#define DGC_ADDR_H (0x3108) +#define DGC_ADDR_L (0x3109) +#define VMAX_ADDR_H (0x0340) +#define VMAX_ADDR_L (0x0341) + +#define INCREASE_LINES (1) /* make real fps less than stand fps because NVR require*/ +#define VMAX_1080P30_LINEAR (1125+INCREASE_LINES) + + + +#define SENSOR_1080P_30FPS_MODE (1) + +HI_U8 gu8SensorImageMode = SENSOR_1080P_30FPS_MODE; +WDR_MODE_E genSensorMode = WDR_MODE_NONE; + +static HI_U32 gu32FullLinesStd = VMAX_1080P30_LINEAR; +static HI_BOOL bInit = HI_FALSE; +HI_BOOL bSensorInit = HI_FALSE; + +ISP_SNS_REGS_INFO_S g_stSnsRegsInfo = {0}; +ISP_SNS_REGS_INFO_S g_stPreSnsRegsInfo = {0}; + +#define PATHLEN_MAX 256 +#define CMOS_CFG_INI "mn34222_cfg.ini" +static char pcName[PATHLEN_MAX] = "configs/mn34222_cfg.ini"; + +/* AE default parameter and function */ +#ifdef INIFILE_CONFIG_MODE +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 0.1; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stDgainAccu.f32Accuracy = 1; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 8 << pstAeSnsDft->u32ISPDgainShift; + + switch(genSensorMode) + { + default: + case WDR_MODE_NONE: /*linear mode*/ + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = g_AeDft[0].u8AeCompensation; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[0].u32MaxIntTimeTarget; + pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[0].u32MinIntTimeTarget; + + pstAeSnsDft->u32MaxAgain = 16832*2; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = g_AeDft[0].u32MaxAgainTarget; + pstAeSnsDft->u32MinAgainTarget = g_AeDft[0].u32MinAgainTarget; + + pstAeSnsDft->u32MaxDgain = 1024; + pstAeSnsDft->u32MinDgain = 1024; + pstAeSnsDft->u32MaxDgainTarget = g_AeDft[0].u32MaxDgainTarget; + pstAeSnsDft->u32MinDgainTarget = g_AeDft[0].u32MinDgainTarget; + + pstAeSnsDft->u32ISPDgainShift = g_AeDft[0].u32ISPDgainShift; + pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[0].u32MinISPDgainTarget; + pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[0].u32MaxISPDgainTarget; + break; + } + return 0; +} + +#else + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + memset(&pstAeSnsDft->stAERouteAttr, 0, sizeof(ISP_AE_ROUTE_S)); + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*25/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0.8045; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 0.38; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.38; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 8 << pstAeSnsDft->u32ISPDgainShift; + + if((pstAeSnsDft->f32Fps == 25) || (pstAeSnsDft->f32Fps == 30)) + { + pstAeSnsDft->stIntTimeAccu.f32Offset = 0.8045; + } + else + {} + + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x38; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = 2; + + pstAeSnsDft->u32MaxAgain = 32382; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 32382; + pstAeSnsDft->u32MinDgain = 1024; + pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgain; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + + return 0; +} +#endif + + +/* the function of sensor set fps */ +static HI_VOID cmos_fps_set(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + + + + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + /* In 1080P30fps mode, the VMAX(FullLines) is VMAX_1080P30_LINEAR, + and there are (VMAX_1080P30_LINEAR*30) lines in 1 second, + so in f32Fps mode, VMAX(FullLines) is (VMAX_1080P30_LINEAR*30)/f32Fps */ + gu32FullLinesStd = (VMAX_1080P30_LINEAR * 30) / f32Fps; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0.8045; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + + + gu32FullLinesStd = (gu32FullLinesStd > 0xFFFF) ? 0xFFFF : gu32FullLinesStd; + if(WDR_MODE_NONE == genSensorMode) + { + g_stSnsRegsInfo.astI2cData[7].u32Data = ((gu32FullLinesStd & 0xFF00) >> 8); + g_stSnsRegsInfo.astI2cData[8].u32Data = (gu32FullLinesStd & 0xFF); + } + + pstAeSnsDft->f32Fps = f32Fps; + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd * f32Fps / 2; + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + + + return; +} + +static HI_VOID cmos_slow_framerate_set(HI_U32 u32FullLines, + AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + u32FullLines = (u32FullLines > 0xFFFF) ? 0xFFFF : u32FullLines; + + + g_stSnsRegsInfo.astI2cData[7].u32Data = ((u32FullLines & 0xFF00) >> 8); + g_stSnsRegsInfo.astI2cData[8].u32Data = (u32FullLines & 0xFF); + + + pstAeSnsDft->u32MaxIntTime = u32FullLines - 2; + + return; +} + +/* while isp notify ae to update sensor regs, ae call these funcs. */ +static HI_VOID cmos_inttime_update(HI_U32 u32IntTime) +{ + { + g_stSnsRegsInfo.astI2cData[0].u32Data = ((u32IntTime & 0xFF00) >> 8); + g_stSnsRegsInfo.astI2cData[1].u32Data = (u32IntTime & 0xFF); + } + + return; +} + +static HI_U32 ad_gain_table[81]= +{ + 1024, 1070, 1116, 1166, 1217, 1271, 1327, 1386, 1446, 1511, 1577, 1647, 1719, 1796, 1874, 1958, 2043, + 2135, 2227, 2327, 2428, 2537, 2647, 2766, 2886, 3015, 3146, 3287, 3430, 3583, 3739, 3907, 4077, 4259, + 4444, 4643, 4845, 5062, 5282, 5518, 5758, 6016, 6278, 6558, 6844, 7150, 7461, 7795, 8134, 8498, 8867, + 9264, 9667, 10100,10539, 11010, 11489, 12003, 12526, 13086, 13655, 14266, 14887, 15552, 16229, 16955, + 17693, 18484, 19289, 20151, 21028, 21968, 22925, 23950, 24992, 26110, 27246, 28464, 29703, 31031, 32382 +}; + +static HI_VOID cmos_again_calc_table(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb) +{ + int i; + + if((HI_NULL == pu32AgainLin) ||(HI_NULL == pu32AgainDb)) + { + printf("null pointer when get ae sensor gain info value!\n"); + return; + } + + if (*pu32AgainLin >= ad_gain_table[80]) + { + *pu32AgainLin = ad_gain_table[80]; + *pu32AgainDb = 80; + return ; + } + + for (i = 1; i < 81; i++) + { + if (*pu32AgainLin < ad_gain_table[i]) + { + *pu32AgainLin = ad_gain_table[i - 1]; + *pu32AgainDb = i - 1; + break; + } + } + + return; +} + +static HI_VOID cmos_dgain_calc_table(HI_U32 *pu32DgainLin, HI_U32 *pu32DgainDb) +{ + int i; + + if((HI_NULL == pu32DgainLin) ||(HI_NULL == pu32DgainDb)) + { + printf("null pointer when get ae sensor gain info value!\n"); + return; + } + + if (*pu32DgainLin >= ad_gain_table[80]) + { + *pu32DgainLin = ad_gain_table[80]; + *pu32DgainDb = 80; + return ; + } + + for (i = 1; i < 81; i++) + { + if (*pu32DgainLin < ad_gain_table[i]) + { + *pu32DgainLin = ad_gain_table[i - 1]; + *pu32DgainDb = i - 1; + break; + } + } + + return; +} + +static HI_VOID cmos_gains_update(HI_U32 u32Again, HI_U32 u32Dgain) +{ + HI_U32 u32Tmp_Again = 0x100 + u32Again * 4; + HI_U32 u32Tmp_Dgain = 0x100 + u32Dgain * 4; + + if ((g_stSnsRegsInfo.astI2cData[3].u32Data == ((u32Tmp_Again & 0xFF00) >> 8)) + && (g_stSnsRegsInfo.astI2cData[4].u32Data == (u32Tmp_Again & 0xFF))) + { + g_stSnsRegsInfo.astI2cData[2].u32Data = 0x30; + } + else + { + g_stSnsRegsInfo.astI2cData[2].u32Data = 0x0; + } + + g_stSnsRegsInfo.astI2cData[3].u32Data = ((u32Tmp_Again & 0xFF00) >> 8); + g_stSnsRegsInfo.astI2cData[4].u32Data = (u32Tmp_Again & 0xFF); + + g_stSnsRegsInfo.astI2cData[5].u32Data = ((u32Tmp_Dgain & 0xFF00) >> 8); + g_stSnsRegsInfo.astI2cData[6].u32Data = (u32Tmp_Dgain & 0xFF); + + return; +} + +/* Only used in WDR_MODE_2To1_LINE and WDR_MODE_2To1_FRAME mode */ +static HI_VOID cmos_get_inttime_max(HI_U32 u32Ratio, HI_U32 *pu32IntTimeMax) +{ + if(HI_NULL == pu32IntTimeMax) + { + printf("null pointer when get ae sensor IntTimeMax value!\n"); + return; + } + + return; +} + +HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default; + pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set; + pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; + pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update; + pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update; + pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table; + pstExpFuncs->pfn_cmos_dgain_calc_table = cmos_dgain_calc_table; + pstExpFuncs->pfn_cmos_get_inttime_max = cmos_get_inttime_max; + + return 0; +} + +/* AWB default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + HI_U8 i; + + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + pstAwbSnsDft->u16WbRefTemp = g_AwbDft[0].u16WbRefTemp; + + for(i= 0; i < 4; i++) + { + pstAwbSnsDft->au16GainOffset[i] = g_AwbDft[0].au16GainOffset[i]; + } + + for(i= 0; i < 6; i++) + { + pstAwbSnsDft->as32WbPara[i] = g_AwbDft[0].as32WbPara[i]; + } + memcpy(&pstAwbSnsDft->stCcm, &g_AwbDft[0].stCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_AwbDft[0].stAgcTbl, sizeof(AWB_AGC_TABLE_S)); + break; + + } + return 0; +} + +#else +static AWB_CCM_S g_stAwbCcm = +{ + 5120, + { + 0x0224, 0x80F8, 0x802C, + 0x8052, 0x01C2, 0x8070, + 0x0024, 0x811C, 0x01F8 + }, + + 3633, + { + 0x01F8, 0x80B5, 0x8043, + 0x807D, 0x01E0, 0x8063, + 0x0021, 0x8152, 0x0231 + }, + + 2465, + { + 0x01FB, 0x810C, 0x0011, + 0x807D, 0x0163, 0x001A, + 0x002B, 0x81FF, 0x02D4 + } +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTable = +{ + /* bvalid */ + 1, + + /*1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768*/ + /* saturation */ + {0x7c,0x75,0x6a,0x60,0x58,0x50,0x48,0x40,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38} + +}; + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + pstAwbSnsDft->u16WbRefTemp = 5000; + pstAwbSnsDft->au16GainOffset[0] = 0x23E; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x196; + pstAwbSnsDft->as32WbPara[0] = 55; + pstAwbSnsDft->as32WbPara[1] = 104; + pstAwbSnsDft->as32WbPara[2] = -97; + pstAwbSnsDft->as32WbPara[3] = 201958; + pstAwbSnsDft->as32WbPara[4] = 128; + pstAwbSnsDft->as32WbPara[5] = -152540; + + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTable, sizeof(AWB_AGC_TABLE_S)); + + return 0; +} +#endif + +HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default; + + return 0; +} + + +/* ISP default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstDef->stDrc, &g_IspDft[0].stDrc, sizeof(ISP_CMOS_DRC_S)); + memcpy(&pstDef->stAgcTbl, &g_IspDft[0].stAgcTbl, sizeof(ISP_CMOS_AGC_TABLE_S)); + memcpy(&pstDef->stNoiseTbl, &g_IspDft[0].stNoiseTbl, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_IspDft[0].stDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_IspDft[0].stRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGamma, &g_IspDft[0].stGamma, sizeof(ISP_CMOS_GAMMA_S)); + memcpy(&pstDef->stGe, &g_IspDft[0].stGe, sizeof(ISP_CMOS_GE_S)); + break; + } + pstDef->stSensorMaxResolution.u32MaxWidth = 1280; + pstDef->stSensorMaxResolution.u32MaxHeight = 720; + + return 0; +} + +#else +#define DMNR_CALIB_CARVE_NUM_MN34222 9 + +float g_coef_calib_mn34222[DMNR_CALIB_CARVE_NUM_MN34222][4] = +{ + {100.000000f, 2.000000f, 0.045427f, 7.218652f, }, + {200.000000f, 2.301030f, 0.045937f, 7.593602f, }, + {401.000000f, 2.603144f, 0.048095f, 8.075705f, }, + {800.000000f, 2.903090f, 0.050832f, 9.041181f, }, + {1622.000000f, 3.210051f, 0.057881f, 10.508446f, }, + {3317.000000f, 3.520746f, 0.067995f, 13.242065f, }, + {7466.000000f, 3.873088f, 0.087098f, 18.637381f, }, + {16821.000000f, 4.225852f, 0.117693f, 28.855566f, }, + {44916.000000f, 4.652401f, 0.204691f, 45.572727f, }, +}; + +static ISP_NR_ISO_PARA_TABLE_S g_stNrIsoParaTab[HI_ISP_NR_ISO_LEVEL_MAX] = +{ + //u16Threshold//u8varStrength//u8fixStrength//u8LowFreqSlope + {1500, 160, 256-256, 0 }, //100 // // + {1500, 120, 256-256, 0 }, //200 // ISO // ISO //u8LowFreqSlope + {1500, 100, 256-256, 0 }, //400 //{400, 1200, 96,256}, //{400 , 0 } + {1750, 80, 256-256, 8 }, //800 //{800, 1400, 80,256}, //{600 , 2 } + {1500, 255, 256-256, 6 }, //1600 //{1600, 1200, 72,256}, //{800 , 8 } + {1500, 255, 256-256, 0 }, //3200 //{3200, 1200, 64,256}, //{1000, 12 } + {1375, 255, 256-256, 0 }, //6400 //{6400, 1100, 56,256}, //{1600, 6 } + {1375, 255, 256-256, 0 }, //12800 //{12000,1100, 48,256}, //{2400, 0 } + {1375, 255, 256-256, 0 }, //25600 //{36000,1100, 48,256}, // + {1375, 255, 256-256, 0 }, //51200 //{64000,1100, 96,256}, // + {1250, 255, 256-256, 0 }, //102400 //{82000,1000,240,256}, // + {1250, 255, 256-256, 0 }, //204800 // // + {1250, 255, 256-256, 0 }, //409600 // // + {1250, 255, 256-256, 0 }, //819200 // // + {1250, 255, 256-256, 0 }, //1638400// // + {1250, 255, 256-256, 0 }, //3276800// // +}; + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaic = +{ + /*For Demosaic*/ + 1, /*bEnable*/ + 16,/*u16VhLimit*/ + 8,/*u16VhOffset*/ + 24, /*u16VhSlope*/ + /*False Color*/ + 1, /*bFcrEnable*/ + { 8, 8, 8, 8, 8, 8, 8, 8, 3, 0, 0, 0, 0, 0, 0, 0}, /*au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]*/ + {24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24}, /*au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]*/ + /*For Ahd*/ + 400, /*u16UuSlope*/ + {512,512,512,512,512,512,512, 400, 0,0,0,0,0,0,0,0} /*au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +#if 0 +static ISP_CMOS_GE_S g_stIspGe = +{ + /*For GE*/ + 1, /*bEnable*/ + 7, /*u8Slope*/ + 7, /*u8Sensitivity*/ + 8192, /*u16Threshold*/ + 8192, /*u16SensiThreshold*/ + {1024,1024,1024,2048,2048,2048,2048, 2048, 2048,2048,2048,2048,2048,2048,2048,2048} /*au16Strength[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; +#endif + +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpen = +{ + //{100,200,400,800,1600,3200,6400,12800,25600,51200,102400,204800,409600,819200,1638400,3276800}; + {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},/* enPixSel = ~bEnLowLumaShoot */ + {30, 30, 32, 35, 35, 50, 60, 70, 120, 200, 250, 250, 250, 250, 250, 250},/*maxSharpAmt1 = SharpenUD*16 */ + {80, 80, 65, 50, 120, 160, 180, 200, 220, 250, 250, 250, 250, 250, 250, 250},/*maxEdgeAmt = SharpenD*16 */ + {0, 0, 0, 0, 0, 0, 20, 40, 90, 120, 180, 250, 250, 250, 250, 250},/*sharpThd2 = TextureNoiseThd*4 */ + {0, 0, 0, 0, 0, 0, 0, 0, 100, 200, 0, 0, 0, 0, 0, 0},/*edgeThd2 = EdgeNoiseThd*4 */ + {140, 140, 130, 100, 75, 45, 25, 10, 0, 0, 0, 0, 0, 0, 0, 0},/*overshootAmt*/ + {160, 160, 150, 130, 115, 100,90, 70, 30, 0, 0, 0, 0, 0, 0, 0},/*undershootAmt*/ +}; + +static ISP_CMOS_UVNR_S g_stIspUVNR = +{ + /*ֵ˲лUVNRISOֵ*/ + /*UVNRлֵ˲ISOֵ*/ + /*0.0 -> disable(0.0, 1.0] -> weak(1.0, 2.0] -> normal(2.0, 10.0) -> strong*/ + /*˹˲ı׼*/ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; + {1, 2, 4, 5, 7, 48, 32, 16, 16, 16, 16, 16, 16, 16, 16, 16}, /*UVNRThreshold*/ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2}, /*Coring_lutLimit*/ + {0, 0, 0, 16, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34} /*UVNR_blendRatio*/ +}; + +static ISP_CMOS_DPC_S g_stCmosDpc = +{ + //0,/*IR_channel*/ + //0,/*IR_position*/ + {0,0,0,1,1,1,2,2,2,3,3,3,3,3,3,3},/*au16Strength[16]*/ + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*au16BlendRatio[16]*/ +}; + +static ISP_CMOS_RGBIR_S g_stCmosRgbir = +{ + 1, /* bValid*/ + + { + 1, /* bEnable*/ + 0, /* 0:ISP_CMOS_IRPOS_TYPE_GR; 1:ISP_CMOS_IRPOS_TYPE_GB*/ + 3839, /* OverExpThresh 4095-256*/ + }, + { + 0, + 1, + 1, + 0,/*0:OP_CMOS_TYPE_AUTO; 1:OP_CMOS_TYPE_MANUL*/ + 0x100, + //{397,-8,43,13,377,30,-5,14,357,-364,-351,-309,0,0,0} + {298,0,21,24,280,18,3,12,259,-260,-265,-235,-20,-30,-5} + } +}; + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + pstDef->stDrc.bEnable = HI_FALSE; + pstDef->stDrc.u8Asymmetry = 0x02; + pstDef->stDrc.u8SecondPole = 0xC0; + pstDef->stDrc.u8Stretch = 0x3C; + pstDef->stDrc.u8LocalMixingBrigtht = 0x2D; + pstDef->stDrc.u8LocalMixingDark = 0x2D; + pstDef->stDrc.u8LocalMixingThres = 0x02; + pstDef->stDrc.u16BrightGainLmt = 0x7F; + pstDef->stDrc.u16DarkGainLmtC = 0x7F; + pstDef->stDrc.u16DarkGainLmtY = 0x7F; + pstDef->stDrc.u8RangeVar = 0x00; + pstDef->stDrc.u8SpatialVar = 0x0A; + //memcpy(&pstDef->stLsc.stLscParaTable[0], &g_stCmosLscTable[0], sizeof(ISP_LSC_CABLI_TABLE_S)*HI_ISP_LSC_LIGHT_NUM); + + memcpy(&pstDef->stDemosaic, &g_stIspDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_stIspRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + //memcpy(&pstDef->stGe, &g_stIspGe, sizeof(ISP_CMOS_GE_S)); + //memcpy(&pstDef->stGammafe, &g_stGammafeFSWDR, sizeof(ISP_CMOS_GAMMAFE_S)); + + pstDef->stNoiseTbl.stNrCaliPara.u8CalicoefRow = DMNR_CALIB_CARVE_NUM_MN34222; + pstDef->stNoiseTbl.stNrCaliPara.pCalibcoef = (HI_FLOAT (*)[4])g_coef_calib_mn34222; + //memcpy(&pstDef->stNoiseTbl.stNrCommPara, &g_stNrCommPara,sizeof(ISP_NR_COMM_PARA_S)); + memcpy(&pstDef->stNoiseTbl.stIsoParaTable[0], &g_stNrIsoParaTab[0],sizeof(ISP_NR_ISO_PARA_TABLE_S)*HI_ISP_NR_ISO_LEVEL_MAX); + + memcpy(&pstDef->stUvnr, &g_stIspUVNR, sizeof(ISP_CMOS_UVNR_S)); + memcpy(&pstDef->stDpc, &g_stCmosDpc, sizeof(ISP_CMOS_DPC_S)); + memcpy(&pstDef->stRgbir, &g_stCmosRgbir, sizeof(ISP_CMOS_RGBIR_S)); + //memcpy(&pstDef->stLsc, &g_stCmosLscTable, sizeof(ISP_LSC_CABLI_TABLE_S)); + + pstDef->stSensorMaxResolution.u32MaxWidth = 1920; + pstDef->stSensorMaxResolution.u32MaxHeight = 1080; + + return 0; +} +#endif + +HI_U32 cmos_get_isp_black_level(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel) +{ + HI_S32 i; + + if (HI_NULL == pstBlackLevel) + { + printf("null pointer when get isp black level value!\n"); + return -1; + } + + /* Don't need to update black level when iso change */ + pstBlackLevel->bUpdate = HI_FALSE; + + for (i=0; i<4; i++) + { + pstBlackLevel->au16BlackLevel[i] = 0x100; + } + return 0; + +} + +HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) +{ + HI_U32 u32FullLines_5Fps = 0; + HI_U32 u32MaxIntTime_5Fps = 0; + + + if ((WDR_MODE_NONE == genSensorMode) && (SENSOR_1080P_30FPS_MODE == gu8SensorImageMode)) + { + u32FullLines_5Fps = (VMAX_1080P30_LINEAR * 30) / 5; + } + else + { + return; + } + + u32FullLines_5Fps = (u32FullLines_5Fps > 0xFFFF) ? 0xFFFF : u32FullLines_5Fps; + u32MaxIntTime_5Fps = u32FullLines_5Fps - 2; + + if (bEnable) /* setup for ISP pixel calibration mode */ + { + sensor_write_register(VMAX_ADDR_H, (u32FullLines_5Fps & 0xFF00) >> 8); /* 5fps */ + sensor_write_register(VMAX_ADDR_L, u32FullLines_5Fps & 0xFF); /* 5fps */ + sensor_write_register(EXPOSURE_ADDR_H, (u32MaxIntTime_5Fps & 0xFF00) >> 8); /* max exposure lines */ + sensor_write_register(EXPOSURE_ADDR_L, u32MaxIntTime_5Fps & 0xFF); /* max exposure lines */ + sensor_write_register(AGC_ADDR_H, 0x01); /* min AG */ + sensor_write_register(AGC_ADDR_L, 0x00); /* min AG */ + sensor_write_register(DGC_ADDR_H, 0x01); /* min DG */ + sensor_write_register(DGC_ADDR_L, 0x00); /* min DG */ + } + else /* setup for ISP 'normal mode' */ + { + sensor_write_register(VMAX_ADDR_H, (gu32FullLinesStd & 0xFF00) >> 8); + sensor_write_register(VMAX_ADDR_L, gu32FullLinesStd & 0xFF); + + bInit = HI_FALSE; + } + + return; +} + +HI_VOID cmos_set_wdr_mode(HI_U8 u8Mode) +{ + bInit = HI_FALSE; + + switch(u8Mode) + { + case WDR_MODE_NONE: + if (SENSOR_1080P_30FPS_MODE == gu8SensorImageMode) + { + gu32FullLinesStd = VMAX_1080P30_LINEAR; + } + genSensorMode = WDR_MODE_NONE; + printf("linear mode\n"); + break; + + default: + printf("NOT support this mode!\n"); + return; + break; + } + + return; +} + +int sensor_set_inifile_path(const char *pcPath) +{ + memset(pcName, 0, sizeof(pcName)); + + if (HI_NULL == pcPath) + { + strncat(pcName, "configs/", strlen("configs/")); + strncat(pcName, CMOS_CFG_INI, sizeof(CMOS_CFG_INI)); + } + else + { + if(strlen(pcPath) > (PATHLEN_MAX - 30)) + { + printf("Set inifile path is larger PATHLEN_MAX!\n"); + return -1; + } + strncat(pcName, pcPath, strlen(pcPath)); + strncat(pcName, CMOS_CFG_INI, sizeof(CMOS_CFG_INI)); + } + + return 0; +} + + +HI_U32 cmos_get_sns_regs_info(ISP_SNS_REGS_INFO_S *pstSnsRegsInfo) +{ + HI_S32 i; + + if (HI_FALSE == bInit) + { + g_stSnsRegsInfo.enSnsType = ISP_SNS_I2C_TYPE; + g_stSnsRegsInfo.u8Cfg2ValidDelayMax = 2; + + g_stSnsRegsInfo.u32RegNum = 9; + + for (i=0; iu16Width <= 1920) && (pstSensorImageMode->u16Height <= 1080)) + { + if (pstSensorImageMode->f32Fps <= 30) + { + u8SensorImageMode = SENSOR_1080P_30FPS_MODE; + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps, + genSensorMode); + + return -1; + } + + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps, + genSensorMode); + + return -1; + } + + /* Sensor first init */ + if (HI_FALSE == bSensorInit) + { + gu8SensorImageMode = u8SensorImageMode; + + return 0; + } + + /* Switch SensorImageMode */ + if (u8SensorImageMode == gu8SensorImageMode) + { + /* Don't need to switch SensorImageMode */ + return -1; + } + + gu8SensorImageMode = u8SensorImageMode; + + return 0; +} +HI_VOID sensor_global_init() +{ + gu8SensorImageMode = SENSOR_1080P_30FPS_MODE; + genSensorMode = WDR_MODE_NONE; + gu32FullLinesStd = VMAX_1080P30_LINEAR; + bInit = HI_FALSE; + bSensorInit = HI_FALSE; + + memset(&g_stSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + memset(&g_stPreSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + +#ifdef INIFILE_CONFIG_MODE + HI_S32 s32Ret = HI_SUCCESS; + s32Ret = Cmos_LoadINIPara(pcName); + if (HI_SUCCESS != s32Ret) + { + printf("Cmos_LoadINIPara failed!!!!!!\n"); + } +#else + +#endif +} + +HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc) +{ + memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S)); + + pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init; + pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit; + pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init; + pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode; + pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode; + + pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default; + pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level; + pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect; + pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info; + + return 0; +} + +/**************************************************************************** + * callback structure * + ****************************************************************************/ + +int sensor_register_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + ISP_SENSOR_REGISTER_S stIspRegister; + AE_SENSOR_REGISTER_S stAeRegister; + AWB_SENSOR_REGISTER_S stAwbRegister; + + cmos_init_sensor_exp_function(&stIspRegister.stSnsExp); + s32Ret = HI_MPI_ISP_SensorRegCallBack(IspDev, MN34222_ID, &stIspRegister); + if (s32Ret) + { + printf("sensor register callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + cmos_init_ae_exp_function(&stAeRegister.stSnsExp); + s32Ret = HI_MPI_AE_SensorRegCallBack(IspDev, &stLib, MN34222_ID, &stAeRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + cmos_init_awb_exp_function(&stAwbRegister.stSnsExp); + s32Ret = HI_MPI_AWB_SensorRegCallBack(IspDev, &stLib, MN34222_ID, &stAwbRegister); + if (s32Ret) + { + printf("sensor register callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_unregister_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + + s32Ret = HI_MPI_ISP_SensorUnRegCallBack(IspDev, MN34222_ID); + if (s32Ret) + { + printf("sensor unregister callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + s32Ret = HI_MPI_AE_SensorUnRegCallBack(IspDev, &stLib, MN34222_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + s32Ret = HI_MPI_AWB_SensorUnRegCallBack(IspDev, &stLib, MN34222_ID); + if (s32Ret) + { + printf("sensor unregister callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* __MN34222_CMOS_H_ */ diff --git a/device/mpp/component/isp/sensor/panasonic_mn34222/mn34222_sensor_ctl.c b/device/mpp/component/isp/sensor/panasonic_mn34222/mn34222_sensor_ctl.c new file mode 100644 index 0000000..d59474e --- /dev/null +++ b/device/mpp/component/isp/sensor/panasonic_mn34222/mn34222_sensor_ctl.c @@ -0,0 +1,307 @@ +#include +#include +#include +#include +#include +#include + +#include "hi_comm_video.h" + +#ifdef HI_GPIO_I2C +#include "gpioi2c_ex.h" +#else +#include "hi_i2c.h" +#endif + +const unsigned char sensor_i2c_addr = 0x6c; /* I2C Address of MN34222 */ +const unsigned int sensor_addr_byte = 2; +const unsigned int sensor_data_byte = 1; +static int g_fd = -1; + +extern WDR_MODE_E genSensorMode; +extern HI_U8 gu8SensorImageMode; +extern HI_BOOL bSensorInit; + +int sensor_i2c_init(void) +{ + if(g_fd >= 0) + { + return 0; + } +#ifdef HI_GPIO_I2C + int ret; + + g_fd = open("/dev/gpioi2c_ex", 0); + if(g_fd < 0) + { + printf("Open gpioi2c_ex error!\n"); + return -1; + } +#else + int ret; + + g_fd = open("/dev/i2c-0", O_RDWR); + if(g_fd < 0) + { + printf("Open /dev/i2c-0 error!\n"); + return -1; + } + + ret = ioctl(g_fd, I2C_SLAVE_FORCE, sensor_i2c_addr); + if (ret < 0) + { + printf("CMD_SET_DEV error!\n"); + return ret; + } +#endif + + return 0; +} + +int sensor_i2c_exit(void) +{ + if (g_fd >= 0) + { + close(g_fd); + g_fd = -1; + return 0; + } + return -1; +} + +int sensor_read_register(int addr) +{ + // TODO: + + return 0; +} + +int sensor_write_register(int addr, int data) +{ +#ifdef HI_GPIO_I2C + i2c_data.dev_addr = sensor_i2c_addr; + i2c_data.reg_addr = addr; + i2c_data.addr_byte_num = sensor_addr_byte; + i2c_data.data = data; + i2c_data.data_byte_num = sensor_data_byte; + + ret = ioctl(g_fd, GPIO_I2C_WRITE, &i2c_data); + + if (ret) + { + printf("GPIO-I2C write faild!\n"); + return ret; + } +#else + int idx = 0; + int ret; + char buf[8]; + + buf[idx++] = addr & 0xFF; + if (sensor_addr_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_REG, 1); + buf[idx++] = addr >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_REG, 0); + } + + if (ret < 0) + { + printf("CMD_SET_REG_WIDTH error!\n"); + return -1; + } + + buf[idx++] = data; + if (sensor_data_byte == 2) + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 1); + buf[idx++] = data >> 8; + } + else + { + ret = ioctl(g_fd, I2C_16BIT_DATA, 0); + } + + if (ret) + { + printf("hi_i2c write faild!\n"); + return -1; + } + + ret = write(g_fd, buf, idx); + if(ret < 0) + { + printf("I2C_WRITE error!\n"); + return -1; + } +#endif + return 0; +} + +static void delay_ms(int ms) { + usleep(ms*1000); +} + +void sensor_prog(int* rom) +{ + int i = 0; + while (1) { + int lookup = rom[i++]; + int addr = (lookup >> 16) & 0xFFFF; + int data = lookup & 0xFFFF; + if (addr == 0xFFFE) { + delay_ms(data); + } else if (addr == 0xFFFF) { + return; + } else { + sensor_write_register(addr, data); + } + } +} + +void sensor_linear_1080p30_init(); + +void sensor_init() +{ + sensor_i2c_init(); + + /* When sensor first init, config all registers */ + if (HI_FALSE == bSensorInit) + { + + sensor_linear_1080p30_init(); + } + /* When sensor switch mode(linear<->WDR or resolution), config different registers(if possible) */ + else + { + + sensor_linear_1080p30_init(); + } + + return ; +} + +void sensor_exit() +{ + sensor_i2c_exit(); + + return; +} + +/* 1080P30 and 1080P25 */ +void sensor_linear_1080p30_init() +{ + /*# N340M_S12_P2_FHD_V1125_12b_445MHz_30fps_vM17e_150703_MCLK37_Mst_I2C_d.txt + # VCYCLE:1125 HCYCLE:1100 (@MCLK)*/ + sensor_write_register (0x300E, 0x01); + sensor_write_register (0x300F, 0x00); + sensor_write_register (0x0305, 0x02); + sensor_write_register (0x0307, 0x24); + sensor_write_register (0x3000, 0x00); + sensor_write_register (0x3001, 0x03); + sensor_write_register (0x0112, 0x0C); + sensor_write_register (0x0113, 0x0C); + sensor_write_register (0x3004, 0x01); + sensor_write_register (0x3005, 0x64); + sensor_write_register (0x3008, 0xF1); + sensor_write_register (0x3009, 0x0E);//mipi:bit3=1 lvds:bit3=0 + sensor_write_register (0x300B, 0x00); + sensor_write_register (0x3018, 0x43); + sensor_write_register (0x3019, 0x10); + sensor_write_register (0x301A, 0xB9); + sensor_write_register (0x3000, 0x00); + sensor_write_register (0x3001, 0x53); + sensor_write_register (0x300E, 0x00); + sensor_write_register (0x300F, 0x00); + sensor_write_register (0x0202, 0x04); + sensor_write_register (0x0203, 0x63); + sensor_write_register (0x3036, 0x00); + sensor_write_register (0x3039, 0x2E); + sensor_write_register (0x3058, 0x0F); + sensor_write_register (0x3059, 0xFF); + sensor_write_register (0x305B, 0x00); + sensor_write_register (0x3062, 0x10); + sensor_write_register (0x3063, 0x24); + sensor_write_register (0x306E, 0x0C); + sensor_write_register (0x306F, 0x00); + sensor_write_register (0x3074, 0x01); + sensor_write_register (0x3076, 0x40); + sensor_write_register (0x307C, 0x2C); + sensor_write_register (0x3085, 0x33); + sensor_write_register (0x3088, 0x0E); + sensor_write_register (0x3089, 0x00); + sensor_write_register (0x308B, 0x00); + sensor_write_register (0x308C, 0x06); + sensor_write_register (0x308D, 0x03); + sensor_write_register (0x308E, 0x03); + sensor_write_register (0x308F, 0x06); + sensor_write_register (0x3090, 0x04); + sensor_write_register (0x3094, 0x0B); + sensor_write_register (0x3095, 0x76); + sensor_write_register (0x3098, 0x00); + sensor_write_register (0x3099, 0x00); + sensor_write_register (0x309A, 0x01); + sensor_write_register (0x3104, 0x04); + sensor_write_register (0x3106, 0x00); + sensor_write_register (0x3107, 0xC0); + sensor_write_register (0x3141, 0x40); + sensor_write_register (0x3143, 0x02); + sensor_write_register (0x3144, 0x02); + sensor_write_register (0x3145, 0x02); + sensor_write_register (0x3146, 0x00); + sensor_write_register (0x3147, 0x02); + sensor_write_register (0x314A, 0x01); + sensor_write_register (0x314B, 0x02); + sensor_write_register (0x314C, 0x02); + sensor_write_register (0x314D, 0x02); + sensor_write_register (0x314E, 0x01); + sensor_write_register (0x314F, 0x02); + sensor_write_register (0x3150, 0x02); + sensor_write_register (0x3152, 0x04); + sensor_write_register (0x3153, 0xE3); + sensor_write_register (0x316F, 0xC6); + sensor_write_register (0x3175, 0x80); + sensor_write_register (0x318E, 0x20); + sensor_write_register (0x318F, 0x70); + sensor_write_register (0x3196, 0x08); + sensor_write_register (0x3211, 0x0C); + sensor_write_register (0x323A, 0x80); + sensor_write_register (0x323B, 0x91); + sensor_write_register (0x323D, 0x90); + sensor_write_register (0x3243, 0xD7); + sensor_write_register (0x3246, 0x03); + sensor_write_register (0x3247, 0x27); + sensor_write_register (0x3248, 0x03); + sensor_write_register (0x3249, 0x79); + sensor_write_register (0x324A, 0x30); + sensor_write_register (0x324B, 0x18); + sensor_write_register (0x324C, 0x02); + sensor_write_register (0x3253, 0xDE); + sensor_write_register (0x3258, 0x03); + sensor_write_register (0x3259, 0x17); + sensor_write_register (0x3272, 0x46); + sensor_write_register (0x3280, 0x30); + sensor_write_register (0x3288, 0x01); + sensor_write_register (0x330E, 0x05); + sensor_write_register (0x3310, 0x02); + sensor_write_register (0x3315, 0x1F); + sensor_write_register (0x332C, 0x02); + sensor_write_register (0x3339, 0x02); + sensor_write_register (0x3000, 0x00); + sensor_write_register (0x3001, 0xD3); + sensor_write_register (0x0100, 0x01); + sensor_write_register (0x0101, 0x00); + + printf("===panasonic mn34222 sensor lvds 1ch2lane 1080P30fps linear mode init success!=====\n"); + + bSensorInit = HI_TRUE; + + return; +} + + + + diff --git a/device/mpp/component/isp/sensor/sony_imx122/Makefile b/device/mpp/component/isp/sensor/sony_imx122/Makefile new file mode 100644 index 0000000..38b4406 --- /dev/null +++ b/device/mpp/component/isp/sensor/sony_imx122/Makefile @@ -0,0 +1,57 @@ +# +# sensor lib Makefile +# + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../../../Makefile.param + include $(PARAM_FILE) +endif + +ISP_PATH := $(SDK_PATH)/mpp/component/isp +EXT_PATH := $(SDK_PATH)/mpp/$(EXTDRV) +3A_PATH := $(ISP_PATH)/3a +LIBPATH = $(ISP_PATH)/lib +OBJPATH = ./obj + +ARFLAGS = rcv +ARFLAGS_SO = $(LIBS_LD_CFLAGS) +ARFLAGS_SO += -shared -fPIC -o + +CFLAGS = -Wall +CFLAGS += -O2 -fPIC +CFLAGS += $(LIBS_CFLAGS) + +ifeq ($(HIGDB),HI_GDB) +CFLAGS += -g +endif +ifeq ($(CONFIG_JPEGEDCF), y) + CFLAGS += -D ENABLE_JPEGEDCF +endif +BUS_DIR := $(EXT_PATH)/ssp-sony/ + +ISP_INC := $(ISP_PATH)/include +3A_INC := $(3A_PATH)/include +INC := -I$(BUS_DIR) -I$(REL_INC) -I$(ISP_INC) -I$(3A_INC) + +COMPILE = $(CC) $(CFLAGS) $(DFLAGS) -lm + +$(OBJPATH)/%.o: ./%.c + @[ -e $(LIBPATH) ] || mkdir $(LIBPATH) + @[ -e $(OBJPATH) ] || mkdir $(OBJPATH) + @$(COMPILE) -o $@ -c $< $(INC) + +SRCS = $(wildcard ./*.c) +OBJS = $(SRCS:%.c=%.o) +OBJS := $(OBJS:./%=obj/%) + +TARGETLIB := $(LIBPATH)/libsns_imx122.a +TARGETLIB_SO := $(LIBPATH)/libsns_imx122.so + +all:$(TARGETLIB) +$(TARGETLIB):$(OBJS) + @($(AR) $(ARFLAGS) $(TARGETLIB) $(OBJS)) + @($(CC) $(ARFLAGS_SO) $(TARGETLIB_SO) $(OBJS)) + +clean: + @$(RM) -rf $(TARGETLIB) $(OBJS) + @$(RM) -rf $(LIBPATH) $(OBJPATH) diff --git a/device/mpp/component/isp/sensor/sony_imx122/imx122_cmos.c b/device/mpp/component/isp/sensor/sony_imx122/imx122_cmos.c new file mode 100644 index 0000000..6a2571d --- /dev/null +++ b/device/mpp/component/isp/sensor/sony_imx122/imx122_cmos.c @@ -0,0 +1,1299 @@ +#if !defined(__IMX122_CMOS_H_) +#define __IMX122_CMOS_H_ + +#include +#include +#include +#include "hi_comm_sns.h" +#include "hi_comm_video.h" +#include "hi_sns_ctrl.h" +#include "mpi_isp.h" +#include "mpi_ae.h" +#include "mpi_awb.h" +#include "mpi_af.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define IMX122_ID 122 + + +/* To change the mode of config. ifndef INIFILE_CONFIG_MODE, quick config mode.*/ +/* else, cmos_cfg.ini file config mode*/ +#ifdef INIFILE_CONFIG_MODE + +extern AE_SENSOR_DEFAULT_S g_AeDft[]; +extern AWB_SENSOR_DEFAULT_S g_AwbDft[]; +extern ISP_CMOS_DEFAULT_S g_IspDft[]; +extern HI_S32 Cmos_LoadINIPara(const HI_CHAR *pcName); +#else + +#endif + +/**************************************************************************** + * local variables * + ****************************************************************************/ + +#define SHS1_ADDR (0x208) +#define GAIN_ADDR (0x21E) +#define VMAX_ADDR (0x205) + +#define SENSOR_1080P_30FPS_MODE (1) +#define SENSOR_720P_60FPS_MODE (2) +#define INCREASE_LINES (0) /* make real fps less than stand fps because NVR require*/ +#define VMAX_1080P30 (1125+INCREASE_LINES) +#define VMAX_720P60 (750+INCREASE_LINES) + +HI_U8 gu8SensorImageMode = SENSOR_1080P_30FPS_MODE; +WDR_MODE_E genSensorMode = WDR_MODE_NONE; + +static HI_U32 gu32FullLinesStd = VMAX_1080P30; +static HI_U32 gu32FullLines = VMAX_1080P30; +static HI_BOOL bInit = HI_FALSE; +HI_BOOL bSensorInit = HI_FALSE; + +ISP_SNS_REGS_INFO_S g_stSnsRegsInfo = {0}; +ISP_SNS_REGS_INFO_S g_stPreSnsRegsInfo = {0}; + +#define PATHLEN_MAX 256 +#define CMOS_CFG_INI "imx122_cfg.ini" +static char pcName[PATHLEN_MAX] = "configs/imx122_cfg.ini"; + +/* AE default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 0.1; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.1; + + switch(genSensorMode) + { + default: + case WDR_MODE_NONE: /*linear mode*/ + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = g_AeDft[0].u8AeCompensation; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = g_AeDft[0].u32MaxIntTimeTarget; + pstAeSnsDft->u32MinIntTimeTarget = g_AeDft[0].u32MinIntTimeTarget; + + pstAeSnsDft->u32MaxAgain = 16229; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = g_AeDft[0].u32MaxAgainTarget; + pstAeSnsDft->u32MinAgainTarget = g_AeDft[0].u32MinAgainTarget; + + pstAeSnsDft->u32MaxDgain = 8134; + pstAeSnsDft->u32MinDgain = 1024; + pstAeSnsDft->u32MaxDgainTarget = g_AeDft[0].u32MaxDgainTarget; + pstAeSnsDft->u32MinDgainTarget = g_AeDft[0].u32MinDgainTarget; + + pstAeSnsDft->u32ISPDgainShift = g_AeDft[0].u32ISPDgainShift; + pstAeSnsDft->u32MinISPDgainTarget = g_AeDft[0].u32MinISPDgainTarget; + pstAeSnsDft->u32MaxISPDgainTarget = g_AeDft[0].u32MaxISPDgainTarget; + break; + + } + return 0; +} + +#else + +static HI_S32 cmos_get_ae_default(AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return -1; + } + + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd*30/2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + pstAeSnsDft->u32FlickerFreq = 0; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 0.1; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stDgainAccu.f32Accuracy = 0.1; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 16 << pstAeSnsDft->u32ISPDgainShift; + + switch(genSensorMode) + { + default: + case WDR_MODE_NONE: /*linear mode*/ + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u8AeCompensation = 0x38; + + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = 2; + pstAeSnsDft->u32MaxAgain = 16229; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 8134; + pstAeSnsDft->u32MinDgain = 1024; + pstAeSnsDft->u32MaxDgainTarget = pstAeSnsDft->u32MaxDgain; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + break; + + } + return 0; +} + +#endif + +/* the function of sensor set fps */ +static HI_VOID cmos_fps_set(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (SENSOR_1080P_30FPS_MODE == gu8SensorImageMode) + { + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + gu32FullLinesStd = VMAX_1080P30*30/f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + } + else if (SENSOR_720P_60FPS_MODE == gu8SensorImageMode) + { + if ((f32Fps <= 60) && (f32Fps >= 0.5)) + { + gu32FullLinesStd = VMAX_720P60*60/f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + + } + else + { + printf("Not support! gu8SensorImageMode:%d, f32Fps:%f\n", gu8SensorImageMode, f32Fps); + return; + } + + gu32FullLinesStd = (gu32FullLinesStd > 0xFFFF) ? 0xFFFF : gu32FullLinesStd; + + g_stSnsRegsInfo.astSspData[3].u32Data = (gu32FullLinesStd & 0xFF);/* VMAX[7:0] */ + g_stSnsRegsInfo.astSspData[4].u32Data = ((gu32FullLinesStd & 0xFF00) >> 8);/* VMAX[15:8] */ + + pstAeSnsDft->f32Fps = f32Fps; + pstAeSnsDft->u32LinesPer500ms = gu32FullLinesStd * f32Fps / 2; + pstAeSnsDft->u32MaxIntTime = gu32FullLinesStd - 2; + pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; + + gu32FullLines = gu32FullLinesStd; + + return; +} + +static HI_VOID cmos_slow_framerate_set(HI_U32 u32FullLines, + AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + u32FullLines = (u32FullLines > 0xFFFF) ? 0xFFFF : u32FullLines; + gu32FullLines = u32FullLines; + + g_stSnsRegsInfo.astSspData[3].u32Data = (gu32FullLines & 0xFF); + g_stSnsRegsInfo.astSspData[4].u32Data = ((gu32FullLines & 0xFF00) >> 8); + + pstAeSnsDft->u32MaxIntTime = gu32FullLines - 2; + + return; +} + +/* while isp notify ae to update sensor regs, ae call these funcs. */ +static HI_VOID cmos_inttime_update(HI_U32 u32IntTime) +{ + HI_U32 u32Value = gu32FullLines - u32IntTime; + + g_stSnsRegsInfo.astSspData[0].u32Data = (u32Value & 0xFF); + g_stSnsRegsInfo.astSspData[1].u32Data = ((u32Value & 0xFF00) >> 8); + + return; +} + +static HI_U32 digital_gain_table[61]= +{ + 1024, 1060, 1097, 1136, 1176, 1217, 1260, 1304, 1350, 1397, 1446, 1497, 1550, 1604, 1661, 1719, + 1780, 1842, 1907, 1974, 2043, 2115, 2189, 2266, 2346, 2428, 2514, 2602, 2693, 2788, 2886, 2987, + 3092, 3201, 3314, 3430, 3551, 3675, 3805, 3938, 4077, 4220, 4368, 4522, 4681, 4845, 5015, 5192, + 5374, 5563, 5758, 5961, 6170, 6387, 6611, 6844, 7084, 7333, 7591, 7858, 8134 +}; + + +static HI_U32 analog_gain_table[81] = +{ + 1024 , 1060 , 1097 , 1136 , 1176, 1217 , 1260 , 1304, 1350 , 1397 , 1446 , 1497 , 1550 , 1604 , 1661 , 1719 , + 1780 , 1842 , 1907 , 1974 , 2043, 2115 , 2189 , 2266, 2346 , 2428 , 2514 , 2602 , 2693 , 2788 , 2886 , 2987 , + 3092 , 3201 , 3314 , 3430 , 3551, 3675 , 3805 , 3938, 4077 , 4220 , 4368 , 4522 , 4681 , 4845 , 5015 , 5192 , + 5374 , 5563 , 5758 , 5961 , 6170, 6387 , 6611 , 6844, 7084 , 7333 , 7591 , 7858 , 8134 , 8420 , 8716 , 9022 , + 9339 , 9667 , 10007 , 10359 , 10723, 11099 ,11489 , 11893, 12311 , 12744 , 13192 , 13655 ,14135 ,14632 , 15146 , 15678 , + 16229 + +}; + + +static HI_VOID cmos_again_calc_table(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb) +{ + int i; + + if (*pu32AgainLin >= analog_gain_table[80]) + { + *pu32AgainLin = analog_gain_table[80]; + *pu32AgainDb = 80; + return ; + } + + for (i = 1; i < 81; i++) + { + if (*pu32AgainLin < analog_gain_table[i]) + { + *pu32AgainLin = analog_gain_table[i - 1]; + *pu32AgainDb = i - 1; + break; + } + } + + return; +} + +static HI_VOID cmos_dgain_calc_table(HI_U32 *pu32DgainLin, HI_U32 *pu32DgainDb) +{ + int i; + + if (*pu32DgainLin >= digital_gain_table[60]) + { + *pu32DgainLin = digital_gain_table[60]; + *pu32DgainDb = 60; + return ; + } + + for (i = 1; i < 61; i++) + { + if (*pu32DgainLin < digital_gain_table[i]) + { + *pu32DgainLin = digital_gain_table[i - 1]; + *pu32DgainDb = i - 1; + break; + } + } + + return; +} + +static HI_VOID cmos_gains_update(HI_U32 u32Again, HI_U32 u32Dgain) +{ + + HI_U32 u32Tmp = u32Again + u32Dgain; + u32Tmp = u32Tmp > 0x8C ? 0x8C : u32Tmp; + + g_stSnsRegsInfo.astSspData[2].u32Data = (u32Tmp & 0xFF); + + return; +} + + +HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default; + pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set; + pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; + pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update; + pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update; + pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table; + pstExpFuncs->pfn_cmos_dgain_calc_table = cmos_dgain_calc_table; + + return 0; +} + + +/* AWB default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + HI_U8 i; + + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + pstAwbSnsDft->u16WbRefTemp = g_AwbDft[0].u16WbRefTemp; + + for(i= 0; i < 4; i++) + { + pstAwbSnsDft->au16GainOffset[i] = g_AwbDft[0].au16GainOffset[i]; + } + + for(i= 0; i < 6; i++) + { + pstAwbSnsDft->as32WbPara[i] = g_AwbDft[0].as32WbPara[i]; + } + memcpy(&pstAwbSnsDft->stCcm, &g_AwbDft[0].stCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_AwbDft[0].stAgcTbl, sizeof(AWB_AGC_TABLE_S)); + break; + + } + return 0; +} + +#else + +static AWB_CCM_S g_stAwbCcm = +{ + +/* 5120, + { + 0x020b, 0x80e4, 0x8027, + 0x805e, 0x0182, 0x8054, + 0x0012, 0x80b7, 0x01a5 + }, + 3633, + { + 0x01c9, 0x80a3, 0x8026, + 0x806e, 0x01a1, 0x8033, + 0x0019, 0x80d9, 0x01c0 + }, + 2465, + { + 0x01cb, 0x80c3, 0x8008, + 0x806e, 0x0151, 0x001d, + 0x0022, 0x808f, 0x016d + } +*/ + + 5120, + { + 0x01e0, 0x80c8, 0x8018, + 0x804b, 0x018f, 0x8044, + 0x0019, 0x80d5, 0x01bc + }, + 3633, + { + 0x01cf, 0x80a8, 0x8027, + 0x8072, 0x01a8, 0x8036, + 0x001a, 0x80ed, 0x01d3 + }, + 2465, + { + 0x01ce, 0x80ad, 0x8021, + 0x807c, 0x0192, 0x8016, + 0x0022, 0x80fc, 0x01da + } +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTable = +{ + /* bvalid */ + 1, + + /* saturation */ + {0x82,0x82,0x80,0x7c,0x70,0x69,0x5c,0x5c,0x57,0x57,0x50,0x50,0x58,0x48,0x40,0x38} +}; + +static HI_S32 cmos_get_awb_default(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + + pstAwbSnsDft->u16WbRefTemp = 5000; + + pstAwbSnsDft->au16GainOffset[0] = 0x1c0; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x1e4; + + pstAwbSnsDft->as32WbPara[0] = -40; + pstAwbSnsDft->as32WbPara[1] = 296; + pstAwbSnsDft->as32WbPara[2] = 0; + pstAwbSnsDft->as32WbPara[3] = 169788; + pstAwbSnsDft->as32WbPara[4] = 128; + pstAwbSnsDft->as32WbPara[5] = -119571; + +/* + pstAwbSnsDft->au16GainOffset[0] = 0x1c0; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x1e4; + + pstAwbSnsDft->as32WbPara[0] = 22; + pstAwbSnsDft->as32WbPara[1] = 148; + pstAwbSnsDft->as32WbPara[2] = -86; + pstAwbSnsDft->as32WbPara[3] = 178340; + pstAwbSnsDft->as32WbPara[4] = 128; + pstAwbSnsDft->as32WbPara[5] = -128659; +*/ + + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcm, sizeof(AWB_CCM_S)); + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTable, sizeof(AWB_AGC_TABLE_S)); + + return 0; +} + +#endif + + +HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default; + + return 0; +} + + +/* ISP default parameter and function */ +#ifdef INIFILE_CONFIG_MODE + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + switch (genSensorMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstDef->stDrc, &g_IspDft[0].stDrc, sizeof(ISP_CMOS_DRC_S)); + memcpy(&pstDef->stNoiseTbl, &g_IspDft[0].stNoiseTbl, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_IspDft[0].stDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stRgbSharpen, &g_IspDft[0].stRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stGamma, &g_IspDft[0].stGamma, sizeof(ISP_CMOS_GAMMA_S)); + memcpy(&pstDef->stGe, &g_IspDft[0].stGe, sizeof(ISP_CMOS_GE_S)); + break; + + break; + + } + pstDef->stSensorMaxResolution.u32MaxWidth = 2592; + pstDef->stSensorMaxResolution.u32MaxHeight = 1944; + + return 0; +} + +#else + + + +#define DMNR_CALIB_CARVE_NUM_IMX122 12 + +float g_coef_calib_imx122[DMNR_CALIB_CARVE_NUM_IMX122][4] = +{ + {100.000000f, 2.000000f, 0.037048f, 9.002845f, }, + {204.000000f, 2.309630f, 0.038180f, 9.011998f, }, + {407.000000f, 2.609594f, 0.039593f, 9.160780f, }, + {812.000000f, 2.909556f, 0.042155f, 9.453709f, }, + {1640.000000f, 3.214844f, 0.047406f, 9.905107f, }, + {3223.000000f, 3.508260f, 0.055695f, 11.039407f, }, + {6457.000000f, 3.810031f, 0.068628f, 13.358517f, }, + {10311.000000f, 4.013301f, 0.080570f, 16.527088f, }, + {29899.000000f, 4.475657f, 0.112936f, 25.649172f, }, + {35111.000000f, 4.545443f, 0.092135f, 36.210743f, }, + {50897.000000f, 4.706692f, 0.100546f, 43.523537f, }, + {74403.000000f, 4.871591f, 0.095404f, 60.593433f, }, +}; + + +static ISP_NR_ISO_PARA_TABLE_S g_stNrIsoParaTab[HI_ISP_NR_ISO_LEVEL_MAX] = +{ + //u16Threshold//u8varStrength//u8fixStrength//u8LowFreqSlope + {1500, 256-96, 256-256, 0 }, //100 // // + {1500, 256-96, 256-256, 0 }, //200 // ISO // ISO //u8LowFreqSlope + {1500, 256-96, 256-256, 0 }, //400 //{400, 1200, 96,256}, //{400 , 0 } + {1750, 256-80, 256-256, 2 }, //800 //{800, 1400, 80,256}, //{600 , 2 } + {1500, 256-72, 256-256, 6 }, //1600 //{1600, 1200, 72,256}, //{800 , 8 } + {1500, 256-64, 256-256, 12 }, //3200 //{3200, 1200, 64,256}, //{1000, 12 } + {1375, 256-56, 256-256, 6 }, //6400 //{6400, 1100, 56,256}, //{1600, 6 } + {1375, 256-48, 256-256, 0 }, //12800 //{12000,1100, 48,256}, //{2400, 0 } + {1375, 256-48, 256-256, 0 }, //25600 //{36000,1100, 48,256}, // + {1375, 256-128, 256-128, 0 }, //51200 //{64000,1100, 96,256}, // + {1250, 256-192, 256-256, 0 }, //102400 //{82000,1000,240,256}, // + {1250, 256-224, 256-256, 0 }, //204800 // // + {1250, 256-224, 256-256, 0 }, //409600 // // + {1250, 256-224, 256-256, 0 }, //819200 // // + {1250, 256-240, 256-256, 0 }, //1638400// // + {1250, 256-240, 256-256, 0 }, //3276800// // +}; + + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaic = +{ + /*For Demosaic*/ + 1, /*bEnable*/ + 16,/*u16VhLimit*/ + 8,/*u16VhOffset*/ + 24, /*u16VhSlope*/ + /*False Color*/ + 1, /*bFcrEnable*/ + { 8, 8, 8, 8, 8, 8, 8, 8, 3, 0, 0, 0, 0, 0, 0, 0}, /*au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]*/ + {24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24}, /*au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]*/ + /*For Ahd*/ + 400, /*u16UuSlope*/ + {512,512,512,512,512,512,512, 400, 0,0,0,0,0,0,0,0} /*au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; + +static ISP_CMOS_GE_S g_stIspGe = +{ + /*For GE*/ + 1, /*bEnable*/ + 7, /*u8Slope*/ + 7, /*u8Sensitivity*/ + 8192, /*u16Threshold*/ + 8192, /*u16SensiThreshold*/ + {1024,1024,1024,2048,2048,2048,2048, 2048, 2048,2048,2048,2048,2048,2048,2048,2048} /*au16Strength[ISP_AUTO_ISO_STENGTH_NUM]*/ +}; +static ISP_CMOS_RGBSHARPEN_S g_stIspRgbSharpen = +{ + //{100,200,400,800,1600,3200,6400,12800,25600,51200,102400,204800,409600,819200,1638400,3276800}; + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1},/* enPixSel */ + {40, 45, 45, 50, 50, 55, 55, 60, 60, 70, 80, 90, 110, 120, 120, 120},/*SharpenUD*/ + {20, 20, 30, 45, 30, 35, 35, 40, 50, 60, 70, 90, 110, 120, 120, 120},/*SharpenD*/ + {0, 2, 4, 6, 6, 12, 30, 60, 80, 0, 0, 0, 0, 0, 0, 0},/*NoiseThd*/ + {2, 4, 8, 16, 25, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0},/*EdgeThd2*/ + {220,230, 200,175, 150, 120, 110, 95, 80, 70, 40, 20, 20, 20, 20, 20},/*overshootAmt*/ + {210,220, 190,140, 135, 130, 110, 95, 75, 60, 50, 50, 50, 50, 50, 50},/*undershootAmt*/ +}; + +static ISP_CMOS_UVNR_S g_stIspUVNR = +{ + /*ֵ˲лUVNRISOֵ*/ + /*UVNRлֵ˲ISOֵ*/ + /*0.0 -> disable(0.0, 1.0] -> weak(1.0, 2.0] -> normal(2.0, 10.0) -> strong*/ + /*˹˲ı׼*/ + //{100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800}; + {1, 2, 4, 5, 7, 10, 12, 16, 18, 20, 22, 24, 24, 24, 24, 24}, /*UVNRThreshold*/ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2}, /*Coring_lutLimit*/ + {0, 0, 0, 16, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34} /*UVNR_blendRatio*/ +}; + +static ISP_CMOS_DPC_S g_stCmosDpc = +{ + //0,/*IR_channel*/ + //0,/*IR_position*/ + {0,0,0,1,1,2,2,3,3,3,3,3,3,3,3,3},/*au16Strength[16]*/ + {0,0,0,0,0,0,0,0x30,0x60,0x80,0x80,0x80,0xE5,0xE5,0xE5,0xE5},/*au16BlendRatio[16]*/ +}; + +static ISP_LSC_CABLI_TABLE_S g_stCmosLscTable[HI_ISP_LSC_LIGHT_NUM] = +{ + //-------------------------------------------- + // single light default + //-------------------------------------------- + //3000K + { + { + 12966290, 12850780, 12557130, 12237540, 11823770, 11369460, 10990480, 10685190, 10548450, 10835680, 11280550, 11860230, 12462200, 13024830, 13465580, 13903610, 14056030, + 12937220, 12807990, 12516270, 12198730, 11787540, 11347100, 10959160, 10655590, 10529200, 10825520, 11247560, 11823770, 12408600, 12980880, 13434230, 13853540, 14038930, + 12836480, 12723260, 12421960, 12109130, 11715740, 11291580, 10917690, 10596880, 10500450, 10754890, 11171350, 11715740, 12315900, 12879460, 13325640, 13754470, 13937200, + 12695270, 12584510, 12315900, 11995840, 11609660, 11214770, 10845870, 10510020, 10434000, 10675300, 11074860, 11574720, 12185850, 12737310, 13203660, 13608490, 13770880, + 12543480, 12408600, 12147370, 11823770, 11482590, 11117530, 10754890, 10424570, 10368370, 10567770, 10959160, 11437070, 12033370, 12543480, 13010150, 13387470, 13544600, + 12355460, 12224580, 11946170, 11668350, 11358270, 11000950, 10626150, 10359070, 10303570, 10452900, 10866290, 11313730, 11860230, 12342250, 12765490, 13158500, 13325640, + 12109130, 11995840, 11751530, 11459780, 11193020, 10856070, 10490910, 10285200, 10203360, 10387040, 10734880, 11160540, 11668350, 12211640, 12612020, 12951740, 13098750, + 11872430, 11751530, 11540000, 11302640, 11053640, 10705010, 10359070, 10203360, 10105080, 10285200, 10596880, 11043060, 11540000, 11995840, 12395270, 12695270, 12836480, + 11692000, 11597990, 11403160, 11193020, 10928030, 10626150, 10312780, 10122810, 10000000, 10221430, 10510020, 10980020, 11414440, 11835900, 12211640, 12489180, 12639650, + 11739570, 11644800, 11448410, 11225680, 10969580, 10645760, 10331240, 10140600, 10043520, 10266900, 10500450, 10969580, 11414440, 11811670, 12173000, 12475680, 12639650, + 11896910, 11799590, 11586350, 11335950, 11085490, 10774980, 10415160, 10212390, 10131690, 10285200, 10548450, 11117530, 11586350, 11995840, 12368700, 12681320, 12822220, + 12083770, 11970950, 11715740, 11471170, 11193020, 10897070, 10510020, 10294380, 10194350, 10340500, 10795140, 11369460, 11751530, 12198730, 12543480, 12879460, 13010150, + 12276600, 12134590, 11872430, 11586350, 11324830, 11000950, 10626150, 10349780, 10266900, 10415160, 11064240, 11516970, 11958550, 12421960, 12779620, 13083900, 13218790, + 12408600, 12263550, 12020830, 11703850, 11403160, 11064240, 10695090, 10415160, 10312780, 10490910, 11182170, 11609660, 12109130, 12570810, 12951740, 13233950, 13371960, + 12543480, 12395270, 12134590, 11811670, 11459780, 11139000, 10754890, 10471870, 10340500, 10596880, 11269530, 11692000, 12237540, 12695270, 13083900, 13371960, 13481310, + 12612020, 12489180, 12185850, 11884650, 11494020, 11193020, 10805240, 10510020, 10349780, 10655590, 11324830, 11775510, 12315900, 12779620, 13158500, 13481310, 13576470, + 12625820, 12502710, 12211640, 11909180, 11494020, 11203880, 10835680, 10510020, 10340500, 10675300, 11335950, 11811670, 12342250, 12836480, 13203660, 13528720, 13624560, + }, + { + 12937060, 12821780, 12560620, 12216980, 11804920, 11369620, 10974580, 10658440, 10502840, 10702480, 11087330, 11624780, 12228520, 12783810, 13254860, 13660340, 13820700, + 12924150, 12771200, 12524180, 12182500, 11772730, 11339760, 10956010, 10632180, 10485830, 10693640, 11049490, 11572830, 12182500, 12758620, 13200820, 13602940, 13761960, + 12834490, 12683640, 12416110, 12114130, 11698280, 11280490, 10909860, 10588720, 10435130, 10623460, 10993210, 11470330, 12080220, 12646480, 13080810, 13475550, 13645940, + 12671230, 12560620, 12298200, 11979650, 11614350, 11202420, 10845900, 10519900, 10401610, 10562810, 10900670, 11349690, 11946490, 12475910, 12937060, 13323040, 13489580, + 12512080, 12368670, 12125470, 11826480, 11470330, 11125430, 10737980, 10435130, 10351720, 10460420, 10782680, 11202420, 11783440, 12298200, 12733530, 13094030, 13241310, + 12286530, 12159620, 11935480, 11635220, 11349690, 11002550, 10614750, 10360000, 10294120, 10368290, 10693640, 11087330, 11572830, 12080220, 12487950, 12847220, 13002010, + 12046510, 11935480, 11698280, 11439930, 11192740, 10845900, 10485830, 10285940, 10212930, 10285940, 10554200, 10928270, 11399650, 11924490, 12309890, 12634150, 12771200, + 11794170, 11687730, 11470330, 11270670, 11002550, 10676010, 10351720, 10196850, 10093530, 10204890, 10418340, 10818710, 11260870, 11730070, 12080220, 12380500, 12548450, + 11624780, 11521350, 11339760, 11154180, 10891510, 10580070, 10285940, 10117190, 10000000, 10133020, 10343450, 10746890, 11154180, 11541890, 11924490, 12193970, 12309890, + 11645680, 11562500, 11389620, 11173430, 10946750, 10606060, 10326950, 10133020, 10038760, 10164840, 10360000, 10746890, 11135000, 11531610, 11869840, 12182500, 12321600, + 11826480, 11708860, 11500890, 11270670, 11021280, 10737980, 10384920, 10212930, 10117190, 10204890, 10401610, 10882350, 11300170, 11719460, 12080220, 12356870, 12463910, + 12001850, 11880730, 11666670, 11429830, 11144580, 10845900, 10494330, 10277780, 10164840, 10253370, 10623460, 11068380, 11460180, 11880730, 12240080, 12548450, 12671230, + 12182500, 12057730, 11826480, 11562500, 11270670, 10956010, 10597380, 10318730, 10229070, 10285940, 10845900, 11231570, 11645680, 12102800, 12463910, 12758620, 12872760, + 12321600, 12205470, 11979650, 11645680, 11359650, 11021280, 10676010, 10393260, 10277780, 10384920, 10956010, 11319930, 11815690, 12274880, 12646480, 12924150, 13041290, + 12475910, 12345090, 12080220, 11762030, 11429830, 11096830, 10737980, 10451980, 10302310, 10477350, 11030660, 11409690, 11913520, 12404210, 12796440, 13080810, 13200820, + 12548450, 12416110, 12136830, 11837290, 11460180, 11154180, 10773710, 10485830, 10318730, 10537020, 11087330, 11470330, 12012990, 12487950, 12885570, 13187370, 13282050, + 12572820, 12439960, 12159620, 11869840, 11460180, 11163790, 10791670, 10502840, 10318730, 10562810, 11106350, 11511110, 12057730, 12536300, 12924150, 13214290, 13295690, + }, + { + 12811880, 12673850, 12370940, 12048420, 11626240, 11174440, 10792330, 10460790, 10343720, 10632700, 11050380, 11615800, 12242190, 12824580, 13326470, 13707630, 13913980, + 12773940, 12624390, 12347330, 12014860, 11584600, 11145560, 10765390, 10443910, 10327220, 10597870, 11022150, 11584600, 12196040, 12786560, 13271790, 13664200, 13869240, + 12673850, 12538760, 12265400, 11937270, 11522710, 11097770, 10720800, 10410300, 10294350, 10537460, 10947550, 11502220, 12104770, 12698720, 13177190, 13549740, 13736730, + 12538760, 12406520, 12150240, 11828150, 11451330, 11050380, 10667770, 10352000, 10261700, 10486220, 10883100, 11390840, 12003710, 12563110, 13044350, 13395450, 13535570, + 12394640, 12277040, 12003710, 11699820, 11350880, 10975400, 10597870, 10286170, 10229250, 10410300, 10774350, 11271780, 11849820, 12394640, 12824580, 13204080, 13381590, + 12219070, 12093460, 11849820, 11553570, 11242400, 10873950, 10511780, 10237340, 10205050, 10327220, 10711920, 11164800, 11689250, 12196040, 12612090, 12991970, 13150410, + 12003710, 11893380, 11647160, 11380830, 11116840, 10765390, 10410300, 10188980, 10141070, 10278000, 10589200, 11040960, 11543260, 12082170, 12478300, 12824580, 12940000, + 11774340, 11657660, 11471630, 11261970, 10984720, 10623970, 10302550, 10149020, 10070040, 10213100, 10503250, 10966100, 11441200, 11937270, 12277040, 12599810, 12761340, + 11647160, 11553570, 11370830, 11174440, 10910620, 10589200, 10302550, 10117280, 10000000, 10188980, 10477730, 10938290, 11370830, 11774340, 12150240, 12454280, 12575320, + 11742290, 11647160, 11451330, 11222900, 10994050, 10658980, 10360290, 10164960, 10085740, 10269840, 10503250, 10938290, 11380830, 11817350, 12173090, 12478300, 12624390, + 11904320, 11806570, 11605380, 11370830, 11116840, 10792330, 10435480, 10261700, 10180960, 10318980, 10571900, 11107300, 11584600, 12014860, 12382780, 12673850, 12799210, + 12082170, 11959330, 11752950, 11512460, 11242400, 10929050, 10554650, 10335460, 10253570, 10385230, 10819400, 11331000, 11785060, 12219070, 12587550, 12862820, 12965930, + 12277040, 12173090, 11915290, 11657660, 11360840, 11031540, 10667770, 10401930, 10318980, 10435480, 11069290, 11502220, 11959330, 12430360, 12799210, 13097170, 13231080, + 12430360, 12323810, 12070900, 11763640, 11471630, 11135970, 10747510, 10477730, 10376900, 10537460, 11193770, 11605380, 12116100, 12587550, 12991970, 13299080, 13437180, + 12563110, 12466280, 12173090, 11882460, 11522710, 11193770, 10819400, 10537460, 10401930, 10650210, 11291450, 11721010, 12265400, 12748770, 13137060, 13423240, 13549740, + 12673850, 12550920, 12242190, 11948290, 11574240, 11242400, 10864820, 10580540, 10435480, 10711920, 11350880, 11763640, 12347330, 12837300, 13217570, 13535570, 13635410, + 12723700, 12575320, 12277040, 11970400, 11584600, 11252170, 10873950, 10606560, 10435480, 10738590, 11380830, 11795810, 12394640, 12888450, 13244630, 13606730, 13707630, + }, + { + 11625240, 11558940, 11407130, 11155960, 10915620, 10647990, 10428820, 10270270, 10133330, 10252950, 10393160, 10742050, 11094890, 11450090, 11737450, 11944990, 12015810, + 11603050, 11537000, 11364490, 11135530, 10896060, 10647990, 10428820, 10235690, 10133330, 10218490, 10375430, 10704230, 11054550, 11428570, 11692310, 11921570, 11992110, + 11558940, 11471700, 11280150, 11074680, 10837790, 10610820, 10410960, 10218490, 10099670, 10184250, 10340140, 10610820, 11014490, 11343280, 11625240, 11875000, 11944990, + 11450090, 11385770, 11217710, 11014490, 10761060, 10555560, 10357750, 10184250, 10082920, 10133330, 10305090, 10555560, 10935250, 11238450, 11515150, 11782950, 11851850, + 11385770, 11301120, 11135530, 10915620, 10723100, 10537260, 10287650, 10150250, 10082920, 10099670, 10235690, 10500860, 10818510, 11115170, 11407130, 11669870, 11760150, + 11259260, 11176470, 11034480, 10837790, 10685410, 10482760, 10270270, 10150250, 10066230, 10082920, 10235690, 10428820, 10723100, 11014490, 11322160, 11558940, 11625240, + 11155960, 11074680, 10915620, 10742050, 10610820, 10410960, 10218490, 10116470, 10066230, 10049590, 10167220, 10357750, 10629370, 10954950, 11259260, 11450090, 11515150, + 11014490, 10935250, 10799290, 10704230, 10519030, 10340140, 10184250, 10116470, 10033000, 10033000, 10116470, 10305090, 10537260, 10857140, 11115170, 11322160, 11364490, + 10935250, 10876560, 10742050, 10647990, 10500860, 10357750, 10218490, 10099670, 10000000, 10049590, 10099670, 10287650, 10519030, 10761060, 10974730, 11155960, 11217710, + 10994580, 10915620, 10799290, 10685410, 10573910, 10410960, 10235690, 10116470, 10066230, 10082920, 10116470, 10322580, 10537260, 10761060, 10954950, 11176470, 11238450, + 11115170, 11034480, 10896060, 10799290, 10666670, 10500860, 10287650, 10235690, 10133330, 10116470, 10133330, 10393160, 10592330, 10857140, 11115170, 11301120, 11385770, + 11238450, 11155960, 11014490, 10876560, 10742050, 10592330, 10357750, 10252950, 10167220, 10150250, 10270270, 10482760, 10666670, 10974730, 11197050, 11407130, 11471700, + 11343280, 11280150, 11115170, 10994580, 10818510, 10629370, 10446740, 10270270, 10184250, 10167220, 10393160, 10555560, 10780140, 11115170, 11343280, 11537000, 11603050, + 11471700, 11364490, 11217710, 11034480, 10876560, 10685410, 10482760, 10322580, 10218490, 10218490, 10464720, 10610820, 10915620, 11176470, 11471700, 11647510, 11692310, + 11580950, 11471700, 11280150, 11115170, 10896060, 10723100, 10519030, 10340140, 10235690, 10270270, 10500860, 10647990, 10974730, 11259260, 11558940, 11760150, 11805830, + 11625240, 11515150, 11343280, 11155960, 10915620, 10742050, 10555560, 10375430, 10252950, 10305090, 10537260, 10666670, 11034480, 11343280, 11603050, 11828790, 11875000, + 11625240, 11537000, 11364490, 11176470, 10954950, 10761060, 10555560, 10393160, 10270270, 10305090, 10555560, 10666670, 11054550, 11364490, 11647510, 11851850, 11921570, + }, + }, + + //D50 + { + { + 13333330, 13201320, 12847970, 12435230, 11940300, 11472280, 11070110, 10801080, 10666670, 10899180, 11396010, 11952190, 12526100, 13071900, 13528750, 13904980, 14117650, + 13274340, 13129100, 12806830, 12396690, 11916580, 11450380, 11049720, 10762330, 10638300, 10879420, 11363640, 11904760, 12486990, 13015180, 13468010, 13856810, 14051520, + 13157890, 13015180, 12711860, 12307690, 11846000, 11385200, 10999080, 10714290, 10582010, 10830320, 11299430, 11811020, 12383900, 12889370, 13348160, 13745700, 13921110, + 13015180, 12861740, 12565440, 12170390, 11741680, 11299430, 10899180, 10628880, 10535560, 10743060, 11204480, 11673150, 12244900, 12752390, 13186810, 13605440, 13777270, + 12793180, 12644890, 12332990, 11988010, 11583010, 11204480, 10781670, 10517090, 10443860, 10619470, 11059910, 11516310, 12060300, 12539190, 12972970, 13348160, 13528750, + 12565440, 12422360, 12108980, 11753180, 11406840, 11029410, 10628880, 10407630, 10344830, 10517090, 10919020, 11374410, 11834320, 12295080, 12711860, 13071900, 13230430, + 12269940, 12121210, 11846000, 11538460, 11214950, 10840110, 10462080, 10309280, 10221460, 10380620, 10752690, 11194030, 11639180, 12121210, 12513030, 12847970, 12987010, + 11964110, 11822660, 11560690, 11320750, 10999080, 10628880, 10309280, 10178120, 10075570, 10256410, 10582010, 11029410, 11461320, 11916580, 12269940, 12565440, 12738850, + 11764710, 11650490, 11439470, 11194030, 10869570, 10535560, 10247650, 10084030, 10000000, 10143700, 10434780, 10948900, 11352890, 11730200, 12096770, 12371130, 12500000, + 11834320, 11730200, 11483250, 11214950, 10938920, 10591350, 10282780, 10109520, 10000000, 10135140, 10425720, 10899180, 11352890, 11741680, 12096770, 12409510, 12578620, + 11988010, 11869440, 11627910, 11342150, 11049720, 10704730, 10353750, 10195410, 10058680, 10178120, 10471200, 11070110, 11527380, 11940300, 12332990, 12618300, 12765960, + 12170390, 12048190, 11753180, 11483250, 11173180, 10830320, 10452960, 10282780, 10092510, 10195410, 10704730, 11288810, 11695910, 12145750, 12500000, 12820510, 12958960, + 12332990, 12207530, 11928430, 11594200, 11278200, 10919020, 10526320, 10291600, 10126580, 10230180, 10948900, 11428570, 11869440, 12320330, 12711860, 13015180, 13143480, + 12474010, 12345680, 12060300, 11695910, 11363640, 10989010, 10619470, 10371650, 10195410, 10318140, 11059910, 11516310, 12024050, 12500000, 12875540, 13186810, 13333330, + 12644890, 12486990, 12170390, 11822660, 11428570, 11049720, 10685660, 10407630, 10221460, 10425720, 11142060, 11594200, 12133470, 12631580, 13015180, 13333330, 13468010, + 12738850, 12578620, 12244900, 11881190, 11483250, 11090570, 10723860, 10452960, 10230180, 10498690, 11183600, 11627910, 12207530, 12711860, 13100440, 13422820, 13544020, + 12765960, 12618300, 12282500, 11892960, 11505270, 11100830, 10743060, 10480350, 10221460, 10507880, 11204480, 11650490, 12244900, 12738850, 13143480, 13468010, 13590030, + }, + { + 13258660, 13111780, 12827590, 12411820, 11912170, 11441120, 11052630, 10831950, 10628570, 10796020, 11175970, 11677130, 12236840, 12752200, 13204870, 13619250, 13821660, + 13218270, 13059180, 12777230, 12376430, 11890410, 11421050, 11024550, 10787080, 10602610, 10778150, 11147260, 11635390, 12191010, 12714840, 13151520, 13548390, 13763210, + 13125000, 12968130, 12665370, 12259890, 11814880, 11351350, 10978080, 10716050, 10559610, 10724880, 11099740, 11532330, 12100370, 12604070, 13046090, 13422680, 13633510, + 12955220, 12814960, 12507210, 12111630, 11698110, 11272730, 10895400, 10628570, 10516960, 10654660, 11015230, 11421050, 11977920, 12447420, 12891090, 13245170, 13422680, + 12727270, 12591880, 12306240, 11955920, 11552800, 11166380, 10787080, 10516960, 10432690, 10533980, 10895400, 11272730, 11772150, 12248350, 12640780, 13020000, 13164810, + 12483220, 12341230, 12055560, 11740310, 11381120, 11005920, 10619900, 10432690, 10341540, 10424340, 10760330, 11128210, 11552800, 12000000, 12376430, 12727270, 12878340, + 12179610, 12044400, 11782810, 11491620, 11185570, 10804980, 10457830, 10333330, 10219780, 10308790, 10593980, 10950380, 11341460, 11804170, 12179610, 12507210, 12616280, + 11836360, 11729730, 11491620, 11262980, 10950380, 10602610, 10300630, 10203760, 10077400, 10179830, 10432690, 10796020, 11175970, 11604280, 11966910, 12225350, 12364670, + 11656220, 11552800, 11341460, 11128210, 10840970, 10508470, 10251970, 10108700, 10000000, 10061820, 10284360, 10716050, 11080850, 11441120, 11782810, 12044400, 12168220, + 11729730, 11625000, 11421050, 11156810, 10877190, 10568180, 10276240, 10124420, 10000000, 10077400, 10292490, 10707240, 11080850, 11471370, 11782810, 12077920, 12202440, + 11890410, 11782810, 11542550, 11282500, 11005920, 10680890, 10349760, 10219780, 10069610, 10100850, 10341540, 10831950, 11253240, 11645800, 12000000, 12283020, 12423660, + 12089140, 11934010, 11698110, 11421050, 11118700, 10787080, 10432690, 10276240, 10108700, 10116550, 10533980, 11015230, 11391080, 11836360, 12168220, 12459330, 12579710, + 12236840, 12122910, 11836360, 11522120, 11224140, 10868110, 10516960, 10284360, 10132300, 10163930, 10733720, 11137730, 11573330, 12000000, 12376430, 12677700, 12802360, + 12411820, 12271440, 11977920, 11645800, 11311900, 10950380, 10585370, 10366240, 10171870, 10219780, 10840970, 11224140, 11719170, 12168220, 12555450, 12865610, 13020000, + 12519230, 12388200, 12089140, 11761520, 11371180, 11015230, 10663390, 10432690, 10211760, 10325140, 10895400, 11302080, 11825610, 12306240, 12690060, 13006990, 13151520, + 12628520, 12471260, 12156860, 11825610, 11411040, 11062020, 10698440, 10466240, 10219780, 10366240, 10950380, 11361260, 11901280, 12388200, 12777230, 13098590, 13245170, + 12653060, 12507210, 12168220, 11857920, 11421050, 11080850, 10724880, 10491540, 10219780, 10391060, 10968830, 11381120, 11934010, 12435530, 12814960, 13138240, 13272170, + }, + { + 13091640, 12961120, 12633630, 12218040, 11732850, 11235950, 10851420, 10577700, 10458570, 10690790, 11120620, 11690650, 12298960, 12833170, 13306040, 13669820, 13874070, + 13039120, 12896830, 12584700, 12172280, 11701170, 11216570, 10833330, 10560520, 10441770, 10673230, 11101620, 11648750, 12252590, 12782690, 13238290, 13598330, 13785790, + 12922470, 12782690, 12487990, 12093020, 11627910, 11158800, 10788380, 10509300, 10400000, 10612240, 11054420, 11576140, 12149530, 12670570, 13118060, 13499480, 13684210, + 12770140, 12645910, 12345680, 11970530, 11535050, 11111110, 10734930, 10466990, 10366830, 10560520, 10989010, 11453740, 12025900, 12536160, 12961120, 13347020, 13513510, + 12621360, 12464050, 12160900, 11828940, 11403510, 11026290, 10620910, 10375100, 10292950, 10458570, 10878660, 11333910, 11861310, 12333970, 12757610, 13118060, 13292430, + 12392750, 12241050, 11959520, 11607140, 11265160, 10906040, 10500810, 10309280, 10244290, 10375100, 10797340, 11216570, 11669660, 12126870, 12524090, 12858560, 13013010, + 12104280, 11981570, 11711710, 11433600, 11101620, 10717230, 10375100, 10236220, 10156250, 10292950, 10638300, 11073250, 11494250, 11981570, 12357410, 12695310, 12820510, + 11818180, 11722270, 11473960, 11245680, 10933560, 10569110, 10244290, 10148320, 10054140, 10188090, 10500810, 10933560, 11363640, 11807450, 12160900, 12464050, 12621360, + 11669660, 11576140, 11393510, 11149230, 10851420, 10526320, 10236220, 10093170, 10000000, 10116730, 10408330, 10887770, 11294530, 11669660, 12025900, 12310610, 12428300, + 11807450, 11690650, 11463840, 11216570, 10942760, 10594950, 10301110, 10140410, 10054140, 10156250, 10450160, 10906040, 11333910, 11743450, 12081780, 12380950, 12500000, + 11959520, 11872150, 11638320, 11343800, 11063830, 10743800, 10391690, 10260460, 10116730, 10212100, 10509300, 11082690, 11524820, 11926610, 12310610, 12609120, 12720160, + 12172280, 12025900, 11775360, 11494250, 11187610, 10842370, 10492330, 10342080, 10164190, 10252370, 10726070, 11274940, 11680140, 12126870, 12487990, 12795280, 12909630, + 12369170, 12229540, 11937560, 11638320, 11304350, 10933560, 10594950, 10358570, 10228170, 10276680, 10961210, 11413520, 11883000, 12333970, 12720160, 13000000, 13118060, + 12500000, 12357410, 12081780, 11754070, 11393510, 11016950, 10673230, 10433390, 10276680, 10383390, 11082690, 11504420, 12037040, 12500000, 12896830, 13238290, 13360740, + 12645910, 12500000, 12206570, 11872150, 11453740, 11082690, 10743800, 10492330, 10301110, 10483870, 11158800, 11576140, 12149530, 12658230, 13026050, 13360740, 13499480, + 12757610, 12596900, 12275730, 11937560, 11494250, 11130140, 10779440, 10509300, 10309280, 10551950, 11187610, 11648750, 12218040, 12732620, 13091640, 13443640, 13598330, + 12795280, 12633630, 12310610, 11959520, 11504420, 11158800, 10797340, 10526320, 10301110, 10586320, 11197240, 11690650, 12241050, 12770140, 13144590, 13485480, 13612570, + }, + { + 11769380, 11699600, 11517510, 11276190, 10983300, 10705240, 10496450, 10367780, 10224520, 10295650, 10459360, 10744100, 11106940, 11384620, 11630650, 11911470, 11935480, + 11769380, 11676530, 11495150, 11233400, 10942700, 10685920, 10477880, 10349650, 10224520, 10277780, 10440920, 10705240, 11065420, 11341000, 11607840, 11863730, 11935480, + 11699600, 11607840, 11406550, 11169810, 10902390, 10647480, 10440920, 10313590, 10171820, 10242210, 10385970, 10647480, 11003720, 11254750, 11539960, 11769380, 11863730, + 11607840, 11495150, 11319310, 11065420, 10842490, 10609320, 10385970, 10277780, 10136990, 10206900, 10349650, 10590340, 10902390, 11169810, 11450680, 11653540, 11746030, + 11495150, 11384620, 11212120, 10983300, 10763640, 10552590, 10349650, 10206900, 10154370, 10171820, 10313590, 10515100, 10783240, 11065420, 11341000, 11562500, 11630650, + 11384620, 11276190, 11086140, 10862390, 10705240, 10477880, 10295650, 10206900, 10119660, 10136990, 10277780, 10440920, 10666670, 10942700, 11212120, 11428570, 11495150, + 11169810, 11106940, 10942700, 10783240, 10609320, 10404220, 10224520, 10171820, 10119660, 10085180, 10206900, 10367780, 10571430, 10862390, 11127820, 11319310, 11384620, + 11044780, 10962960, 10802920, 10705240, 10515100, 10313590, 10171820, 10136990, 10033900, 10050930, 10154370, 10295650, 10515100, 10763640, 10983300, 11148780, 11233400, + 10962960, 10882350, 10763640, 10628370, 10477880, 10313590, 10189330, 10102390, 10033900, 10000000, 10068030, 10277780, 10459360, 10666670, 10882350, 11044780, 11086140, + 11044780, 10942700, 10842490, 10685920, 10552590, 10385970, 10242210, 10136990, 10068030, 10050930, 10085180, 10295650, 10496450, 10666670, 10882350, 11065420, 11127820, + 11127820, 11065420, 10922510, 10783240, 10628370, 10459360, 10259970, 10224520, 10102390, 10068030, 10119660, 10367780, 10533810, 10783240, 11044780, 11233400, 11297710, + 11276190, 11190930, 11003720, 10862390, 10724640, 10515100, 10331590, 10259970, 10119660, 10068030, 10224520, 10440920, 10590340, 10862390, 11127820, 11319310, 11362760, + 11406550, 11319310, 11106940, 10962960, 10783240, 10571430, 10385970, 10277780, 10154370, 10085180, 10331590, 10477880, 10724640, 11003720, 11276190, 11450680, 11495150, + 11539960, 11428570, 11212120, 11024210, 10822670, 10609320, 10440920, 10313590, 10171820, 10119660, 10367780, 10496450, 10802920, 11127820, 11362760, 11562500, 11630650, + 11607840, 11517510, 11297710, 11106940, 10862390, 10647480, 10459360, 10349650, 10189330, 10154370, 10404220, 10552590, 10882350, 11190930, 11428570, 11653540, 11722770, + 11653540, 11539960, 11362760, 11148780, 10902390, 10666670, 10515100, 10385970, 10206900, 10189330, 10422530, 10571430, 10942700, 11233400, 11517510, 11699600, 11769380, + 11676530, 11562500, 11384620, 11169810, 10922510, 10685920, 10515100, 10385970, 10206900, 10206900, 10422530, 10571430, 10962960, 11254750, 11562500, 11722770, 11792830, + }, + }, + + //D65 + { + { + 12674420, 12546760, 12299010, 11961590, 11564990, 11165170, 10859280, 10595380, 10493380, 10647130, 10900000, 11324680, 11752020, 12230010, 12619390, 12937690, 13112780, + 12619390, 12528740, 12264420, 11928860, 11534390, 11165170, 10832300, 10582520, 10468190, 10608270, 10872820, 11266150, 11720430, 12178770, 12582970, 12880350, 13034380, + 12546760, 12421650, 12161790, 11847830, 11473680, 11122450, 10805450, 10531400, 10443110, 10569700, 10818860, 11179490, 11642190, 12060860, 12474960, 12785920, 12937690, + 12439370, 12281690, 12044200, 11736200, 11383810, 11051960, 10765430, 10480770, 10380950, 10493380, 10752160, 11065990, 11503960, 11928860, 12316380, 12674420, 12804700, + 12264420, 12144850, 11896320, 11595750, 11309990, 10996220, 10660150, 10393330, 10344010, 10418160, 10634150, 10954770, 11368970, 11752020, 12161790, 12474960, 12601160, + 12094310, 11961590, 11720430, 11443570, 11179490, 10872820, 10544140, 10319530, 10246770, 10331750, 10582520, 10845770, 11193840, 11580350, 11928860, 12264420, 12403980, + 11880110, 11752020, 11519150, 11280730, 11051960, 10752160, 10418160, 10258820, 10175030, 10258820, 10443110, 10712530, 11037970, 11473680, 11799730, 12094310, 12230010, + 11626670, 11534390, 11324680, 11122450, 10900000, 10569700, 10319530, 10186920, 10080930, 10175030, 10344010, 10621190, 10954770, 11324680, 11611190, 11880110, 12011020, + 11488800, 11383810, 11208230, 11037970, 10765430, 10493380, 10246770, 10092590, 10022990, 10069280, 10246770, 10544140, 10845770, 11150900, 11443570, 11704700, 11799730, + 11564990, 11428570, 11251610, 11024020, 10792080, 10518700, 10270910, 10080930, 10000000, 10069280, 10222740, 10518700, 10832300, 11122450, 11413610, 11689010, 11815720, + 11626670, 11534390, 11324680, 11108280, 10859280, 10595380, 10307330, 10127760, 10022990, 10092590, 10222740, 10634150, 10941030, 11280730, 11595750, 11863950, 11961590, + 11783780, 11673360, 11443570, 11208230, 10968550, 10686270, 10356300, 10175030, 10057670, 10092590, 10405730, 10792080, 11094150, 11428570, 11720430, 11994500, 12111110, + 11928860, 11799730, 11534390, 11295340, 11051960, 10738920, 10418160, 10210770, 10080930, 10139530, 10621190, 10913640, 11222650, 11595750, 11896320, 12161790, 12299010, + 12060860, 11928860, 11673360, 11383810, 11094150, 10792080, 10493380, 10246770, 10104290, 10186920, 10712530, 10968550, 11354170, 11720430, 12060860, 12316380, 12457140, + 12161790, 12044200, 11783780, 11473680, 11150900, 10832300, 10531400, 10283020, 10127760, 10283020, 10778740, 11051960, 11458610, 11831750, 12178770, 12457140, 12546760, + 12247190, 12111110, 11831750, 11549670, 11193840, 10872820, 10569700, 10319530, 10139530, 10331750, 10818860, 11108280, 11503960, 11912570, 12247190, 12528740, 12656020, + 12299010, 12161790, 11847830, 11549670, 11222650, 10900000, 10569700, 10319530, 10139530, 10331750, 10845770, 11122450, 11534390, 11961590, 12281690, 12564840, 12692870, + }, + { + 13184580, 13013010, 12695310, 12322270, 11839710, 11383540, 11045030, 10699590, 10534850, 10638300, 10887770, 11324040, 11839710, 12380950, 12845850, 13251780, 13457560, + 13144590, 12974050, 12658230, 12287330, 11828940, 11383540, 11016950, 10682000, 10509300, 10612240, 10860480, 11294530, 11818180, 12322270, 12782690, 13184580, 13388260, + 13013010, 12858560, 12572530, 12183690, 11775360, 11333910, 10951980, 10629600, 10450160, 10551950, 10806320, 11197240, 11722270, 12206570, 12645910, 13078470, 13265310, + 12871290, 12720160, 12416430, 12070570, 11648750, 11255410, 10887770, 10543390, 10416670, 10492330, 10743800, 11082690, 11576140, 12081780, 12500000, 12909630, 13065330, + 12658230, 12512030, 12252590, 11926610, 11535050, 11177990, 10788380, 10466990, 10366830, 10400000, 10620910, 10933560, 11433600, 11883000, 12287330, 12658230, 12820510, + 12428300, 12310610, 12025900, 11722270, 11403510, 11045030, 10647010, 10375100, 10301110, 10309280, 10517800, 10824310, 11226250, 11638320, 12037040, 12404580, 12560390, + 12172280, 12048190, 11796730, 11524820, 11226250, 10887770, 10517800, 10309280, 10228170, 10220130, 10400000, 10690790, 11054420, 11504420, 11850500, 12195120, 12333970, + 11883000, 11764710, 11555560, 11324040, 11035650, 10690790, 10366830, 10228170, 10077520, 10124610, 10268560, 10577700, 10906040, 11314190, 11648750, 11937560, 12081780, + 11701170, 11617520, 11423550, 11206900, 10924370, 10603590, 10317460, 10116730, 10007700, 10038610, 10180110, 10492330, 10806320, 11149230, 11473960, 11754070, 11883000, + 11754070, 11638320, 11453740, 11216570, 10942760, 10612240, 10317460, 10093170, 10000000, 10046370, 10156250, 10458570, 10779440, 11139670, 11463840, 11743450, 11893870, + 11893870, 11786040, 11555560, 11304350, 11007620, 10699590, 10350320, 10172140, 10046370, 10046370, 10156250, 10560520, 10915200, 11304350, 11648750, 11948530, 12081780, + 12048190, 11937560, 11701170, 11433600, 11120620, 10788380, 10433390, 10228170, 10054140, 10046370, 10350320, 10717230, 11045030, 11453740, 11786040, 12081780, 12206570, + 12218040, 12093020, 11807450, 11524820, 11226250, 10869570, 10509300, 10252370, 10101010, 10093170, 10543390, 10851420, 11216570, 11627910, 12003690, 12287330, 12440190, + 12392750, 12229540, 11970530, 11627910, 11304350, 10933560, 10577700, 10284810, 10132500, 10156250, 10647010, 10924370, 11353710, 11807450, 12160900, 12476010, 12609120, + 12512030, 12369170, 12070570, 11743450, 11373580, 10989010, 10647010, 10358570, 10156250, 10252370, 10734930, 11007620, 11484100, 11926610, 12310610, 12621360, 12757610, + 12596900, 12452110, 12160900, 11818180, 11403510, 11026290, 10673230, 10400000, 10172140, 10292950, 10761590, 11045030, 11555560, 12014790, 12392750, 12695310, 12820510, + 12633630, 12487990, 12206570, 11839710, 11423550, 11045030, 10690790, 10425020, 10164190, 10309280, 10779440, 11054420, 11576140, 12059370, 12440190, 12732620, 12845850, + }, + { + 12908370, 12755910, 12449570, 12078290, 11623320, 11153180, 10773070, 10485440, 10326690, 10493930, 10791010, 11230500, 11792540, 12331110, 12793680, 13184130, 13388430, + 12857140, 12718350, 12401910, 12033430, 11581770, 11143590, 10755190, 10468500, 10310260, 10476960, 10773070, 11201380, 11749770, 12284360, 12743360, 13144020, 13347070, + 12743360, 12619280, 12307690, 11944700, 11520000, 11095890, 10719600, 10418010, 10277560, 10426390, 10719600, 11134020, 11675680, 12180450, 12619280, 13051360, 13238000, + 12643900, 12497590, 12191910, 11835620, 11418500, 11048590, 10675450, 10384620, 10253160, 10368000, 10657890, 11039180, 11540520, 12044610, 12485550, 12869910, 13051360, + 12461540, 12319390, 12033430, 11696750, 11338580, 10973750, 10596890, 10293880, 10228890, 10302070, 10570960, 10927490, 11408450, 11879010, 12272730, 12656250, 12844400, + 12261120, 12123480, 11824820, 11540520, 11230500, 10872480, 10476960, 10253160, 10164710, 10212770, 10485440, 10809010, 11240240, 11675680, 12078290, 12413790, 12582520, + 12022260, 11900830, 11633750, 11368420, 11076920, 10746270, 10384620, 10204720, 10101330, 10156740, 10384620, 10701900, 11086400, 11530250, 11922720, 12249530, 12378220, + 11781820, 11665170, 11448760, 11220780, 10936710, 10596890, 10285710, 10132920, 10000000, 10077760, 10269410, 10614250, 10973750, 11388400, 11728510, 12033430, 12180450, + 11675680, 11571430, 11358460, 11134020, 10845190, 10545160, 10253160, 10077760, 10000000, 10054310, 10228890, 10562350, 10890760, 11259770, 11602510, 11900830, 12033430, + 11739130, 11633750, 11418500, 11191710, 10918280, 10588240, 10293880, 10101330, 10007720, 10093460, 10253160, 10579590, 10927490, 11289200, 11633750, 11933700, 12044610, + 11900830, 11781820, 11540520, 11299040, 11011040, 10693070, 10376300, 10180680, 10077760, 10125000, 10285710, 10701900, 11095890, 11479180, 11824820, 12123480, 12261120, + 12078290, 11944700, 11675680, 11428570, 11143590, 10818030, 10451610, 10261280, 10117100, 10172680, 10485440, 10899920, 11240240, 11654680, 12000000, 12296020, 12425700, + 12249530, 12112150, 11857270, 11540520, 11259770, 10899920, 10536580, 10293880, 10172680, 10204720, 10728480, 11039180, 11448760, 11857270, 12237960, 12545980, 12681020, + 12413790, 12272730, 12000000, 11665170, 11348510, 10973750, 10640390, 10351440, 10220820, 10293880, 10818030, 11143590, 11592130, 12033430, 12413790, 12718350, 12844400, + 12545980, 12413790, 12112150, 11771120, 11398420, 11029790, 10710740, 10418010, 10245060, 10409640, 10899920, 11220780, 11707320, 12169010, 12570320, 12895520, 13012050, + 12668620, 12509650, 12180450, 11857270, 11448760, 11086400, 10737370, 10451610, 10285710, 10460050, 10945950, 11289200, 11792540, 12249530, 12643900, 12972970, 13104150, + 12730850, 12545980, 12214890, 11868130, 11469030, 11114920, 10746270, 10476960, 10302070, 10468500, 10992370, 11308900, 11824820, 12296020, 12668620, 12999000, 13144020, + }, + { + 12126980, 11993720, 11753850, 11471470, 11137030, 10852270, 10581720, 10352300, 10200270, 10241290, 10380430, 10700280, 11104650, 11488720, 11826620, 12126980, 12243590, + 12069510, 11974920, 11735790, 11437130, 11120820, 10821530, 10567080, 10338290, 10186670, 10227580, 10366350, 10655510, 11056440, 11454270, 11790120, 12088610, 12204470, + 12012580, 11900310, 11664120, 11385990, 11072460, 10790960, 10523420, 10310390, 10159570, 10200270, 10324320, 10581720, 10992810, 11352150, 11699850, 11993720, 12107770, + 11900310, 11771960, 11558250, 11301770, 11008650, 10745430, 10480110, 10268820, 10159570, 10173100, 10282640, 10508940, 10898720, 11218800, 11575760, 11863350, 11974920, + 11771960, 11646340, 11437130, 11218800, 10929900, 10700280, 10422920, 10227580, 10146080, 10105820, 10213900, 10437160, 10760560, 11088530, 11437130, 11717790, 11826620, + 11628610, 11523380, 11318520, 11088530, 10883190, 10640670, 10380430, 10200270, 10132630, 10105820, 10213900, 10380430, 10640670, 10945560, 11285080, 11540790, 11664120, + 11454270, 11369050, 11169590, 10961260, 10790960, 10537930, 10310390, 10173100, 10105820, 10052630, 10119210, 10296500, 10537930, 10883190, 11202350, 11454270, 11540790, + 11285080, 11202350, 11024530, 10883190, 10670390, 10451440, 10255030, 10159570, 10039420, 10026250, 10079160, 10241290, 10480110, 10775740, 11040460, 11268440, 11352150, + 11202350, 11120820, 10977010, 10821530, 10625870, 10422920, 10255030, 10119210, 10039420, 10000000, 10039420, 10227580, 10451440, 10685320, 10945560, 11137030, 11235290, + 11301770, 11202350, 11040460, 10867710, 10700280, 10494510, 10310390, 10146080, 10065880, 10039420, 10065880, 10227580, 10422920, 10670390, 10945560, 11185940, 11251840, + 11402980, 11318520, 11153280, 10961260, 10790960, 10581720, 10324320, 10241290, 10119210, 10065880, 10065880, 10310390, 10508940, 10790960, 11088530, 11335310, 11402980, + 11575760, 11454270, 11235290, 11088530, 10883190, 10655510, 10408720, 10282640, 10132630, 10079160, 10200270, 10394560, 10581720, 10929900, 11218800, 11437130, 11558250, + 11699850, 11593320, 11385990, 11169590, 10977010, 10700280, 10480110, 10296500, 10173100, 10092470, 10324320, 10465750, 10715290, 11056440, 11369050, 11593320, 11699850, + 11808350, 11699850, 11506020, 11268440, 11024530, 10760560, 10523420, 10338290, 10213900, 10146080, 10394560, 10508940, 10836880, 11185940, 11488720, 11735790, 11844960, + 11937500, 11808350, 11575760, 11335310, 11072460, 10806220, 10581720, 10394560, 10213900, 10213900, 10451440, 10581720, 10929900, 11285080, 11610940, 11863350, 11974920, + 12012580, 11881800, 11646340, 11402980, 11088530, 10836880, 10611110, 10422920, 10227580, 10241290, 10465750, 10625870, 10992810, 11352150, 11681960, 11937500, 12050470, + 12031500, 11900310, 11664120, 11420030, 11104650, 10852270, 10640670, 10437160, 10227580, 10255030, 10465750, 10640670, 11024530, 11369050, 11699850, 11974920, 12088610, + }, + } +}; + + +HI_U32 cmos_get_isp_default(ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + pstDef->stDrc.bEnable = HI_FALSE; + pstDef->stDrc.u8Asymmetry = 0x02; + pstDef->stDrc.u8SecondPole = 0xC0; + pstDef->stDrc.u8Stretch = 0x3C; + pstDef->stDrc.u8LocalMixingBrigtht = 0x2D; + pstDef->stDrc.u8LocalMixingDark = 0x2D; + pstDef->stDrc.u8LocalMixingThres = 0x02; + pstDef->stDrc.u16BrightGainLmt = 0x7F; + pstDef->stDrc.u16DarkGainLmtC = 0x7F; + pstDef->stDrc.u16DarkGainLmtY = 0x7F; + pstDef->stDrc.u8RangeVar = 0x00; + pstDef->stDrc.u8SpatialVar = 0x0A; + + memcpy(&pstDef->stLsc.stLscParaTable[0], &g_stCmosLscTable[0], sizeof(ISP_LSC_CABLI_TABLE_S)*HI_ISP_LSC_LIGHT_NUM); + + memcpy(&pstDef->stDemosaic, &g_stIspDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + + memcpy(&pstDef->stGe, &g_stIspGe, sizeof(ISP_CMOS_GE_S)); + + pstDef->stNoiseTbl.stNrCaliPara.u8CalicoefRow = DMNR_CALIB_CARVE_NUM_IMX122; + pstDef->stNoiseTbl.stNrCaliPara.pCalibcoef = (HI_FLOAT (*)[4])g_coef_calib_imx122; + memcpy(&pstDef->stNoiseTbl.stIsoParaTable[0], &g_stNrIsoParaTab[0],sizeof(ISP_NR_ISO_PARA_TABLE_S)*HI_ISP_NR_ISO_LEVEL_MAX); + + memcpy(&pstDef->stRgbSharpen, &g_stIspRgbSharpen, sizeof(ISP_CMOS_RGBSHARPEN_S)); + memcpy(&pstDef->stUvnr, &g_stIspUVNR, sizeof(ISP_CMOS_UVNR_S)); + memcpy(&pstDef->stDpc, &g_stCmosDpc, sizeof(ISP_CMOS_DPC_S)); + + pstDef->stSensorMaxResolution.u32MaxWidth = 1920; + pstDef->stSensorMaxResolution.u32MaxHeight = 1080; + + return 0; +} + +#endif + +HI_U32 cmos_get_isp_black_level(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel) +{ + if (HI_NULL == pstBlackLevel) + { + printf("null pointer when get isp black level value!\n"); + return -1; + } + + /* Don't need to update black level when iso change */ + pstBlackLevel->bUpdate = HI_FALSE; + + pstBlackLevel->au16BlackLevel[0] = 0xf1; + pstBlackLevel->au16BlackLevel[1] = 0xf0; + pstBlackLevel->au16BlackLevel[2] = 0xf1; + pstBlackLevel->au16BlackLevel[3] = 0xf1; + + return 0; +} + +HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) +{ + HI_U32 u32FullLines_5Fps = VMAX_1080P30; + HI_U32 u32MaxExpTime_5Fps = VMAX_1080P30 - 2; + + if (SENSOR_1080P_30FPS_MODE == gu8SensorImageMode) + { + u32FullLines_5Fps = VMAX_1080P30 * 30 / 5; + } + else if (SENSOR_720P_60FPS_MODE == gu8SensorImageMode) + { + u32FullLines_5Fps = VMAX_720P60 * 60 / 5; + } + else + { + return; + } + + u32FullLines_5Fps = (u32FullLines_5Fps > 0xFFFF) ? 0xFFFF : u32FullLines_5Fps; + u32MaxExpTime_5Fps = 2; + + if (bEnable) /* setup for ISP pixel calibration mode */ + { + sensor_write_register(VMAX_ADDR, u32FullLines_5Fps & 0xFF); + sensor_write_register(VMAX_ADDR + 1, (u32FullLines_5Fps & 0xFF00) >> 8); + sensor_write_register(SHS1_ADDR, u32MaxExpTime_5Fps & 0xFF); /* shutter */ + sensor_write_register(SHS1_ADDR +1, (u32MaxExpTime_5Fps & 0xFF00) >> 8); + sensor_write_register(GAIN_ADDR, 0x00); //gain + } + else /* setup for ISP 'normal mode' */ + { + gu32FullLinesStd = (gu32FullLinesStd > 0xFFFF) ? 0xFFFF : gu32FullLinesStd; + sensor_write_register (VMAX_ADDR, gu32FullLinesStd & 0xFF); + sensor_write_register (VMAX_ADDR + 1, (gu32FullLinesStd & 0xFF00) >> 8); + + bInit = HI_FALSE; + } + + return; +} + +HI_VOID cmos_set_wdr_mode(HI_U8 u8Mode) +{ + bInit = HI_FALSE; + + switch(u8Mode) + { + case WDR_MODE_NONE: + genSensorMode = WDR_MODE_NONE; + printf("linear mode\n"); + break; + + default: + printf("NOT support this mode!\n"); + return; + break; + } + + return; +} + +static HI_S32 cmos_set_image_mode(ISP_CMOS_SENSOR_IMAGE_MODE_S *pstSensorImageMode) +{ + HI_U8 u8SensorImageMode = gu8SensorImageMode; + + bInit = HI_FALSE; + + if (HI_NULL == pstSensorImageMode ) + { + printf("null pointer when set image mode\n"); + return -1; + } + + if((pstSensorImageMode->u16Width <= 1280)&&(pstSensorImageMode->u16Height <= 720)) + { + if (pstSensorImageMode->f32Fps <= 60) + { + u8SensorImageMode = SENSOR_720P_60FPS_MODE; + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + + return -1; + } + } + else if((pstSensorImageMode->u16Width <= 1920)&&(pstSensorImageMode->u16Height <= 1080)) + { + if (pstSensorImageMode->f32Fps <= 30) + { + u8SensorImageMode = SENSOR_1080P_30FPS_MODE; + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + + return -1; + } + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps); + } + + /* Sensor first init */ + if (HI_FALSE == bSensorInit) + { + gu8SensorImageMode = u8SensorImageMode; + + return 0; + } + + /* Switch SensorImageMode */ + if (u8SensorImageMode == gu8SensorImageMode) + { + /* Don't need to switch SensorImageMode */ + return -1; + } + + gu8SensorImageMode = u8SensorImageMode; + + return 0; + +} + + +HI_U32 cmos_get_sns_regs_info(ISP_SNS_REGS_INFO_S *pstSnsRegsInfo) +{ + HI_S32 i; + + if (HI_FALSE == bInit) + { + g_stSnsRegsInfo.enSnsType = ISP_SNS_SSP_TYPE; + g_stSnsRegsInfo.u8Cfg2ValidDelayMax = 2; + g_stSnsRegsInfo.u32RegNum = 5; + + for (i=0; i (PATHLEN_MAX - 30)) + { + printf("Set inifile path is larger PATHLEN_MAX!\n"); + return -1; + } + strncat(pcName, pcPath, strlen(pcPath)); + strncat(pcName, CMOS_CFG_INI, sizeof(CMOS_CFG_INI)); + } + + return 0; +} + +HI_VOID sensor_global_init() +{ + gu8SensorImageMode = SENSOR_1080P_30FPS_MODE; + genSensorMode = WDR_MODE_NONE; + gu32FullLinesStd = VMAX_1080P30; + gu32FullLines = VMAX_1080P30; + bInit = HI_FALSE; + bSensorInit = HI_FALSE; + + memset(&g_stSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + memset(&g_stPreSnsRegsInfo, 0, sizeof(ISP_SNS_REGS_INFO_S)); + +#ifdef INIFILE_CONFIG_MODE + HI_S32 s32Ret = HI_SUCCESS; + s32Ret = Cmos_LoadINIPara(pcName); + if (HI_SUCCESS != s32Ret) + { + printf("Cmos_LoadINIPara failed!!!!!!\n"); + } +#else + +#endif +} + +HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc) +{ + memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S)); + + pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init; + pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit; + pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init; + pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode; + pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode; + + pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default; + pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level; + pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect; + pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info; + + return 0; +} + +/**************************************************************************** + * callback structure * + ****************************************************************************/ + +int sensor_register_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + ISP_SENSOR_REGISTER_S stIspRegister; + AE_SENSOR_REGISTER_S stAeRegister; + AWB_SENSOR_REGISTER_S stAwbRegister; + + cmos_init_sensor_exp_function(&stIspRegister.stSnsExp); + s32Ret = HI_MPI_ISP_SensorRegCallBack(IspDev, IMX122_ID, &stIspRegister); + if (s32Ret) + { + printf("sensor register callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + cmos_init_ae_exp_function(&stAeRegister.stSnsExp); + s32Ret = HI_MPI_AE_SensorRegCallBack(IspDev, &stLib, IMX122_ID, &stAeRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + cmos_init_awb_exp_function(&stAwbRegister.stSnsExp); + s32Ret = HI_MPI_AWB_SensorRegCallBack(IspDev, &stLib, IMX122_ID, &stAwbRegister); + if (s32Ret) + { + printf("sensor register callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_unregister_callback(void) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ALG_LIB_S stLib; + + s32Ret = HI_MPI_ISP_SensorUnRegCallBack(IspDev, IMX122_ID); + if (s32Ret) + { + printf("sensor unregister callback function failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AE_LIB_NAME, sizeof(HI_AE_LIB_NAME)); + s32Ret = HI_MPI_AE_SensorUnRegCallBack(IspDev, &stLib, IMX122_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + stLib.s32Id = 0; + strncpy(stLib.acLibName, HI_AWB_LIB_NAME, sizeof(HI_AWB_LIB_NAME)); + s32Ret = HI_MPI_AWB_SensorUnRegCallBack(IspDev, &stLib, IMX122_ID); + if (s32Ret) + { + printf("sensor unregister callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/component/isp/sensor/sony_imx122/imx122_sensor_ctl.c b/device/mpp/component/isp/sensor/sony_imx122/imx122_sensor_ctl.c new file mode 100644 index 0000000..6baad94 --- /dev/null +++ b/device/mpp/component/isp/sensor/sony_imx122/imx122_sensor_ctl.c @@ -0,0 +1,1861 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : sony122_sensor_ctl.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2011/09/09 + Description : Sony IMX122 sensor driver + History : + 1.Date : 2011/09/09 + Author : MPP + Modification: Created file + +******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include "hi_comm_video.h" + +#include "hi_spi.h" +extern HI_U8 gu8SensorImageMode; +extern HI_BOOL bSensorInit; +static int g_fd = -1; + +int sensor_spi_init(void) +{ + if(g_fd >= 0) + { + return 0; + } + unsigned int value; + int ret = 0; + char file_name[] = "/dev/spidev0.0"; + + g_fd = open(file_name, 0); + if (g_fd < 0) + { + printf("Open %s error!\n",file_name); + return -1; + } + + value = SPI_MODE_3 | SPI_LSB_FIRST;// | SPI_LOOP; + ret = ioctl(g_fd, SPI_IOC_WR_MODE, &value); + if (ret < 0) + { + printf("ioctl SPI_IOC_WR_MODE err, value = %d ret = %d\n", value, ret); + return ret; + } + + value = 8; + ret = ioctl(g_fd, SPI_IOC_WR_BITS_PER_WORD, &value); + if (ret < 0) + { + printf("ioctl SPI_IOC_WR_BITS_PER_WORD err, value = %d ret = %d\n",value, ret); + return ret; + } + + value = 2000000; + ret = ioctl(g_fd, SPI_IOC_WR_MAX_SPEED_HZ, &value); + if (ret < 0) + { + printf("ioctl SPI_IOC_WR_MAX_SPEED_HZ err, value = %d ret = %d\n",value, ret); + return ret; + } + + return 0; +} + +int sensor_spi_exit(void) +{ + if (g_fd >= 0) + { + close(g_fd); + g_fd = -1; + return 0; + } + return -1; +} + +int sensor_write_register(unsigned int addr, unsigned char data) +{ + int ret; + struct spi_ioc_transfer mesg[1]; + unsigned char tx_buf[8] = {0}; + unsigned char rx_buf[8] = {0}; + + tx_buf[0] = (addr & 0xff00) >> 8; + tx_buf[0] &= (~0x80); + tx_buf[1] = addr & 0xff; + tx_buf[2] = data; + + //printf("func:%s tx_buf = %#x, %#x, %#x\n", __func__, tx_buf[0], tx_buf[1], tx_buf[2]); + + memset(mesg, 0, sizeof(mesg)); + mesg[0].tx_buf = (__u32)tx_buf; + mesg[0].len = 3; + mesg[0].rx_buf = (__u32)rx_buf; + mesg[0].cs_change = 1; + + ret = ioctl(g_fd, SPI_IOC_MESSAGE(1), mesg); + if (ret < 0) { + printf("SPI_IOC_MESSAGE error \n"); + return -1; + } + //printf("func:%s ret = %d, rx_buf = %#x, %#x, %#x\n", __func__, ret , rx_buf[0], rx_buf[1], rx_buf[2]); + + return 0; +} + +int sensor_read_register(unsigned int addr) +{ + int ret = 0; + struct spi_ioc_transfer mesg[1]; + unsigned char tx_buf[8] = {0}; + unsigned char rx_buf[8] = {0}; + + tx_buf[0] = (addr & 0xff00) >> 8; + tx_buf[0] |= 0x80; + tx_buf[1] = addr & 0xff; + tx_buf[2] = 0; + + memset(mesg, 0, sizeof(mesg)); + mesg[0].tx_buf = (__u32)tx_buf; + mesg[0].len = 3; + mesg[0].rx_buf = (__u32)rx_buf; + mesg[0].cs_change = 1; + + ret = ioctl(g_fd, SPI_IOC_MESSAGE(1), mesg); + if (ret < 0) { + printf("SPI_IOC_MESSAGE error \n"); + return -1; + } + //printf("func:%s ret = %d, rx_buf = %#x, %#x, %#x\n", __func__, ret , rx_buf[0], rx_buf[1], rx_buf[2]); + + return rx_buf[2]; +} + + +void sensor_prog(int* rom) +{ +} + +void setup_sensor(int isp_mode) +{ +} + +void sensor_init_1080p_30fps(); +void sensor_init_720p_60fps(); + +void sensor_init() +{ + // sequence according to "Flow Power-on to Operation Start(Sensor Master Mode) + + // chip_id = 0x2 + /* 1. sensor spi init */ + sensor_spi_init(); + + if (1 == gu8SensorImageMode) /* SENSOR_1080P_30FPS_MODE */ + { + sensor_init_1080p_30fps(); + bSensorInit = HI_TRUE; + } + else if (2 == gu8SensorImageMode) /* SENSOR_720P_60FPS_MODE */ + { + sensor_init_720p_60fps(); + bSensorInit = HI_TRUE; + } + else + { + printf("Not support this mode\n"); + } + +} + + +void sensor_exit() +{ + sensor_spi_exit(); + + return; +} + + +void sensor_init_720p_30fps() +{ + + sensor_write_register(0x200, 0x31); //sensor_write_register(0x200, 0x01) + sensor_write_register(0x211, 0x00); + sensor_write_register(0x22D, 0x40); + sensor_write_register(0x202, 0x01); + sensor_write_register(0x216, 0xF0); + sensor_write_register(0x217, 0x00); + sensor_write_register(0x214, 0x40); + sensor_write_register(0x215, 0x01); + sensor_write_register(0x218, 0x40); + sensor_write_register(0x219, 0x05); + sensor_write_register(0x2CE, 0x00); + sensor_write_register(0x2CF, 0x00); + sensor_write_register(0x2D0, 0x00); + sensor_write_register(0x29A, 0x4C); + sensor_write_register(0x29B, 0x04); + //sensor_write_register(0x212, 0x82);// sensor_write_register(0x212, 0x80); + sensor_write_register(0x212, 0x80); + + sensor_write_register(0x20F, 0x00); + sensor_write_register(0x20D, 0x00); + sensor_write_register(0x208, 0x00); + sensor_write_register(0x209, 0x00); + sensor_write_register(0x21E, 0x00); + sensor_write_register(0x220, 0x3C); + sensor_write_register(0x221, 0x00); + // sensor_write_register(0x222, 0x01); // sensor_write_register(0x222, 0xC0) + + sensor_write_register(0x222, 0xC0); + + sensor_write_register(0x205, 0xEE); + sensor_write_register(0x206, 0x02); + sensor_write_register(0x203, 0x72); + sensor_write_register(0x204, 0x06); + sensor_write_register(0x23B, 0xE0); + + // master mode start + sensor_write_register(0x22C, 0x00); // sensor_write_register(0x22C, 0x01); + + sensor_write_register(0x201, 0x00); + + sensor_write_register(0x207, 0x00); + + sensor_write_register(0x20A, 0x00); + sensor_write_register(0x20B, 0x00); + sensor_write_register(0x20C, 0x00); + + sensor_write_register(0x20E, 0x00); + sensor_write_register(0x210, 0x00); + sensor_write_register(0x213, 0x40); + sensor_write_register(0x21A, 0xE9); + sensor_write_register(0x21B, 0x02); + sensor_write_register(0x21C, 0x50); + sensor_write_register(0x21D, 0x00); + + sensor_write_register(0x21F, 0x31); + + sensor_write_register(0x223, 0x08); + sensor_write_register(0x224, 0x30); + sensor_write_register(0x225, 0x00); + sensor_write_register(0x226, 0x80); + sensor_write_register(0x227, 0x20); + sensor_write_register(0x228, 0x34); + sensor_write_register(0x229, 0x63); + sensor_write_register(0x22A, 0x00); + sensor_write_register(0x22B, 0x00); + + sensor_write_register(0x22E, 0x00); + sensor_write_register(0x22F, 0x02); + + sensor_write_register(0x230, 0x30); + sensor_write_register(0x231, 0x20); + sensor_write_register(0x232, 0x00); + sensor_write_register(0x233, 0x14); + sensor_write_register(0x234, 0x20); + sensor_write_register(0x235, 0x60); + sensor_write_register(0x236, 0x00); + sensor_write_register(0x237, 0x23); + sensor_write_register(0x238, 0x01); + sensor_write_register(0x239, 0x00); + sensor_write_register(0x23A, 0xA8); + sensor_write_register(0x23B, 0xE0); + sensor_write_register(0x23C, 0x06); + sensor_write_register(0x23D, 0x00); + sensor_write_register(0x23E, 0x10); + sensor_write_register(0x23F, 0x00); + sensor_write_register(0x240, 0x42); + sensor_write_register(0x241, 0x23); + sensor_write_register(0x242, 0x3C); + sensor_write_register(0x243, 0x01); + sensor_write_register(0x244, 0x00); + sensor_write_register(0x245, 0x00); + sensor_write_register(0x246, 0x00); + sensor_write_register(0x247, 0x00); + sensor_write_register(0x248, 0x00); + sensor_write_register(0x249, 0x00); + sensor_write_register(0x24A, 0x00); + sensor_write_register(0x24B, 0x00); + sensor_write_register(0x24C, 0x01); + sensor_write_register(0x24D, 0x00); + sensor_write_register(0x24E, 0x01); + sensor_write_register(0x24F, 0x07); + sensor_write_register(0x250, 0x10); + sensor_write_register(0x251, 0x18); + sensor_write_register(0x252, 0x12); + sensor_write_register(0x253, 0x00); + sensor_write_register(0x254, 0x00); + sensor_write_register(0x255, 0x00); + sensor_write_register(0x256, 0x00); + sensor_write_register(0x257, 0x00); + sensor_write_register(0x258, 0xE0); + sensor_write_register(0x259, 0x01); + sensor_write_register(0x25A, 0xE0); + sensor_write_register(0x25B, 0x01); + sensor_write_register(0x25C, 0x00); + sensor_write_register(0x25D, 0x00); + sensor_write_register(0x25E, 0x00); + sensor_write_register(0x25F, 0x00); + sensor_write_register(0x260, 0x00); + sensor_write_register(0x261, 0x00); + sensor_write_register(0x262, 0x76); + sensor_write_register(0x263, 0x00); + sensor_write_register(0x264, 0x01); + sensor_write_register(0x265, 0x00); + sensor_write_register(0x266, 0x00); + sensor_write_register(0x267, 0x00); + sensor_write_register(0x268, 0x00); + sensor_write_register(0x269, 0x00); + sensor_write_register(0x26A, 0x00); + sensor_write_register(0x26B, 0x00); + sensor_write_register(0x26C, 0x00); + sensor_write_register(0x26D, 0x00); + sensor_write_register(0x26E, 0x00); + sensor_write_register(0x26F, 0x00); + sensor_write_register(0x270, 0x00); + sensor_write_register(0x271, 0x00); + sensor_write_register(0x272, 0x00); + sensor_write_register(0x273, 0x01); + sensor_write_register(0x274, 0x06); + sensor_write_register(0x275, 0x07); + sensor_write_register(0x276, 0x80); + sensor_write_register(0x277, 0x00); + sensor_write_register(0x278, 0x40); + sensor_write_register(0x279, 0x08); + sensor_write_register(0x27A, 0x00); + sensor_write_register(0x27B, 0x00); + sensor_write_register(0x27C, 0x10); + sensor_write_register(0x27D, 0x00); + sensor_write_register(0x27E, 0x00); + sensor_write_register(0x27F, 0x00); + sensor_write_register(0x280, 0x06); + sensor_write_register(0x281, 0x19); + sensor_write_register(0x282, 0x00); + sensor_write_register(0x283, 0x64); + sensor_write_register(0x284, 0x00); + sensor_write_register(0x285, 0x01); + sensor_write_register(0x286, 0x00); + sensor_write_register(0x287, 0x00); + sensor_write_register(0x288, 0x00); + sensor_write_register(0x289, 0x00); + sensor_write_register(0x28A, 0x00); + sensor_write_register(0x28B, 0x00); + sensor_write_register(0x28C, 0x00); + sensor_write_register(0x28D, 0x00); + sensor_write_register(0x28E, 0x00); + sensor_write_register(0x28F, 0x00); + sensor_write_register(0x290, 0x00); + sensor_write_register(0x291, 0x00); + sensor_write_register(0x292, 0x01); + sensor_write_register(0x293, 0x01); + sensor_write_register(0x294, 0x00); + sensor_write_register(0x295, 0xFF); + sensor_write_register(0x296, 0x0F); + sensor_write_register(0x297, 0x00); + sensor_write_register(0x298, 0x26); + sensor_write_register(0x299, 0x02); + + sensor_write_register(0x29A, 0x4C); //new + sensor_write_register(0x29B, 0x04); //new + + sensor_write_register(0x29C, 0x9C); + sensor_write_register(0x29D, 0x01); + sensor_write_register(0x29E, 0x39); + sensor_write_register(0x29F, 0x03); + sensor_write_register(0x2A0, 0x01); + sensor_write_register(0x2A1, 0x05); + sensor_write_register(0x2A2, 0xD0); + sensor_write_register(0x2A3, 0x07); + sensor_write_register(0x2A4, 0x00); + sensor_write_register(0x2A5, 0x02); + sensor_write_register(0x2A6, 0x0B); + sensor_write_register(0x2A7, 0x0F); + sensor_write_register(0x2A8, 0x24); + sensor_write_register(0x2A9, 0x00); + sensor_write_register(0x2AA, 0x28); + sensor_write_register(0x2AB, 0x00); + sensor_write_register(0x2AC, 0xE8); + sensor_write_register(0x2AD, 0x04); + sensor_write_register(0x2AE, 0xEC); + sensor_write_register(0x2AF, 0x04); + sensor_write_register(0x2B0, 0x00); + sensor_write_register(0x2B1, 0x00); + sensor_write_register(0x2B2, 0x03); + sensor_write_register(0x2B3, 0x05); + sensor_write_register(0x2B4, 0x00); + sensor_write_register(0x2B5, 0x0F); + sensor_write_register(0x2B6, 0x10); + sensor_write_register(0x2B7, 0x00); + sensor_write_register(0x2B8, 0x28); + sensor_write_register(0x2B9, 0x00); + sensor_write_register(0x2BA, 0xBF); + sensor_write_register(0x2BB, 0x07); + sensor_write_register(0x2BC, 0xCF); + sensor_write_register(0x2BD, 0x07); + sensor_write_register(0x2BE, 0xCF); + sensor_write_register(0x2BF, 0x07); + sensor_write_register(0x2C0, 0xCF); + sensor_write_register(0x2C1, 0x07); + sensor_write_register(0x2C2, 0xD0); + sensor_write_register(0x2C3, 0x07); + sensor_write_register(0x2C4, 0x01); + sensor_write_register(0x2C5, 0x02); + sensor_write_register(0x2C6, 0x03); + sensor_write_register(0x2C7, 0x04); + sensor_write_register(0x2C8, 0x05); + sensor_write_register(0x2C9, 0x06); + sensor_write_register(0x2CA, 0x07); + sensor_write_register(0x2CB, 0x08); + sensor_write_register(0x2CC, 0x01); + sensor_write_register(0x2CD, 0x03); + + sensor_write_register(0x2D1, 0x00); + sensor_write_register(0x2D2, 0x00); + sensor_write_register(0x2D3, 0x00); + sensor_write_register(0x2D4, 0x00); + sensor_write_register(0x2D5, 0x00); + sensor_write_register(0x2D6, 0x00); + sensor_write_register(0x2D7, 0x00); + sensor_write_register(0x2D8, 0x00); + sensor_write_register(0x2D9, 0x00); + sensor_write_register(0x2DA, 0x00); + sensor_write_register(0x2DB, 0x00); + sensor_write_register(0x2DC, 0x00); + sensor_write_register(0x2DD, 0x00); + sensor_write_register(0x2DE, 0x00); + sensor_write_register(0x2DF, 0x00); + sensor_write_register(0x2E0, 0x00); + sensor_write_register(0x2E1, 0x00); + sensor_write_register(0x2E2, 0x00); + sensor_write_register(0x2E3, 0x00); + sensor_write_register(0x2E4, 0x00); + sensor_write_register(0x2E5, 0x00); + sensor_write_register(0x2E6, 0x00); + sensor_write_register(0x2E7, 0x00); + sensor_write_register(0x2E8, 0x00); + sensor_write_register(0x2E9, 0x00); + sensor_write_register(0x2EA, 0x00); + sensor_write_register(0x2EB, 0x00); + sensor_write_register(0x2EC, 0x00); + sensor_write_register(0x2ED, 0x00); + sensor_write_register(0x2EE, 0x00); + sensor_write_register(0x2EF, 0x00); + sensor_write_register(0x2F0, 0x00); + sensor_write_register(0x2F1, 0x00); + sensor_write_register(0x2F2, 0x00); + sensor_write_register(0x2F3, 0x00); + sensor_write_register(0x2F4, 0x00); + sensor_write_register(0x2F5, 0x00); + sensor_write_register(0x2F6, 0x00); + sensor_write_register(0x2F7, 0x00); + sensor_write_register(0x2F8, 0x00); + sensor_write_register(0x2F9, 0x00); + sensor_write_register(0x2FA, 0x00); + sensor_write_register(0x2FB, 0x00); + sensor_write_register(0x2FC, 0x00); + sensor_write_register(0x2FD, 0x00); + sensor_write_register(0x2FE, 0x00); + sensor_write_register(0x2FF, 0x00); + + // chip_id = 0x3 + + sensor_write_register(0x300, 0x00); + sensor_write_register(0x301, 0x00); + sensor_write_register(0x302, 0x00); + sensor_write_register(0x303, 0x00); + sensor_write_register(0x304, 0x00); + sensor_write_register(0x305, 0x00); + sensor_write_register(0x306, 0x00); + sensor_write_register(0x307, 0xFA); + sensor_write_register(0x308, 0xFA); + sensor_write_register(0x309, 0x41); + sensor_write_register(0x30A, 0x31); + sensor_write_register(0x30B, 0x38); + sensor_write_register(0x30C, 0x04); + sensor_write_register(0x30D, 0x00); + sensor_write_register(0x30E, 0x1A); + sensor_write_register(0x30F, 0x10); + sensor_write_register(0x310, 0x00); + sensor_write_register(0x311, 0x00); + sensor_write_register(0x312, 0x10); + sensor_write_register(0x313, 0x00); + sensor_write_register(0x314, 0x00); + sensor_write_register(0x315, 0x06); + sensor_write_register(0x316, 0x33); + sensor_write_register(0x317, 0x0D); + sensor_write_register(0x318, 0x00); + sensor_write_register(0x319, 0x00); + sensor_write_register(0x31A, 0x00); + sensor_write_register(0x31B, 0x00); + sensor_write_register(0x31C, 0x00); + sensor_write_register(0x31D, 0x00); + sensor_write_register(0x31E, 0x00); + sensor_write_register(0x31F, 0x00); + sensor_write_register(0x320, 0x00); + sensor_write_register(0x321, 0x80); + sensor_write_register(0x322, 0x0C); + sensor_write_register(0x323, 0x00); + sensor_write_register(0x324, 0x00); + sensor_write_register(0x325, 0x00); + sensor_write_register(0x326, 0x00); + sensor_write_register(0x327, 0x00); + sensor_write_register(0x328, 0x05); + sensor_write_register(0x329, 0x80); + sensor_write_register(0x32A, 0x00); + sensor_write_register(0x32B, 0x00); + sensor_write_register(0x32C, 0x04); + sensor_write_register(0x32D, 0x04); + sensor_write_register(0x32E, 0x00); + sensor_write_register(0x32F, 0x00); + sensor_write_register(0x330, 0x9B); + sensor_write_register(0x331, 0x71); + sensor_write_register(0x332, 0x33); + sensor_write_register(0x333, 0x37); + sensor_write_register(0x334, 0xB3); + sensor_write_register(0x335, 0x19); + sensor_write_register(0x336, 0x97); + sensor_write_register(0x337, 0xB1); + sensor_write_register(0x338, 0x19); + sensor_write_register(0x339, 0x01); + sensor_write_register(0x33A, 0x50); + sensor_write_register(0x33B, 0x00); + sensor_write_register(0x33C, 0x35); + sensor_write_register(0x33D, 0xB0); + sensor_write_register(0x33E, 0x03); + sensor_write_register(0x33F, 0xD1); + sensor_write_register(0x340, 0x71); + sensor_write_register(0x341, 0x1D); + sensor_write_register(0x342, 0x00); + sensor_write_register(0x343, 0x00); + sensor_write_register(0x344, 0x00); + sensor_write_register(0x345, 0x00); + sensor_write_register(0x346, 0x02); + sensor_write_register(0x347, 0x30); + sensor_write_register(0x348, 0x00); + sensor_write_register(0x349, 0x00); + sensor_write_register(0x34A, 0x00); + sensor_write_register(0x34B, 0x03); + sensor_write_register(0x34C, 0x00); + sensor_write_register(0x34D, 0x02); + sensor_write_register(0x34E, 0x10); + sensor_write_register(0x34F, 0xA0); + sensor_write_register(0x350, 0x00); + sensor_write_register(0x351, 0x07); + sensor_write_register(0x352, 0x40); + sensor_write_register(0x353, 0x80); + sensor_write_register(0x354, 0x00); + sensor_write_register(0x355, 0x02); + sensor_write_register(0x356, 0x50); + sensor_write_register(0x357, 0x02); + sensor_write_register(0x358, 0x23); + sensor_write_register(0x359, 0xE4); + sensor_write_register(0x35A, 0x45); + sensor_write_register(0x35B, 0x33); + sensor_write_register(0x35C, 0x79); + sensor_write_register(0x35D, 0xD1); + sensor_write_register(0x35E, 0xCC); + sensor_write_register(0x35F, 0x2F); + sensor_write_register(0x360, 0xB6); + sensor_write_register(0x361, 0xA1); + sensor_write_register(0x362, 0x17); + sensor_write_register(0x363, 0xCB); + sensor_write_register(0x364, 0xE8); + sensor_write_register(0x365, 0xC5); + sensor_write_register(0x366, 0x32); + sensor_write_register(0x367, 0xC0); + sensor_write_register(0x368, 0xA8); + sensor_write_register(0x369, 0xC6); + sensor_write_register(0x36A, 0x5E); + sensor_write_register(0x36B, 0x20); + sensor_write_register(0x36C, 0x63); + sensor_write_register(0x36D, 0x0D); + sensor_write_register(0x36E, 0x6D); + sensor_write_register(0x36F, 0x44); + sensor_write_register(0x370, 0xA6); + sensor_write_register(0x371, 0x32); + sensor_write_register(0x372, 0x24); + sensor_write_register(0x373, 0x50); + sensor_write_register(0x374, 0xC4); + sensor_write_register(0x375, 0x2F); + sensor_write_register(0x376, 0xF4); + sensor_write_register(0x377, 0x42); + sensor_write_register(0x378, 0x82); + sensor_write_register(0x379, 0x13); + sensor_write_register(0x37A, 0x90); + sensor_write_register(0x37B, 0x00); + sensor_write_register(0x37C, 0x10); + sensor_write_register(0x37D, 0x8A); + sensor_write_register(0x37E, 0x60); + sensor_write_register(0x37F, 0xC4); + sensor_write_register(0x380, 0x2F); + sensor_write_register(0x381, 0x84); + sensor_write_register(0x382, 0xF1); + sensor_write_register(0x383, 0x0B); + sensor_write_register(0x384, 0xCD); + sensor_write_register(0x385, 0x70); + sensor_write_register(0x386, 0x42); + sensor_write_register(0x387, 0x16); + sensor_write_register(0x388, 0x00); + sensor_write_register(0x389, 0x61); + sensor_write_register(0x38A, 0x0B); + sensor_write_register(0x38B, 0x29); + sensor_write_register(0x38C, 0x74); + sensor_write_register(0x38D, 0x81); + sensor_write_register(0x38E, 0x10); + sensor_write_register(0x38F, 0xBA); + sensor_write_register(0x390, 0x18); + sensor_write_register(0x391, 0x22); + sensor_write_register(0x392, 0x11); + sensor_write_register(0x393, 0xE9); + sensor_write_register(0x394, 0x60); + sensor_write_register(0x395, 0x07); + sensor_write_register(0x396, 0x09); + sensor_write_register(0x397, 0xF6); + sensor_write_register(0x398, 0x40); + sensor_write_register(0x399, 0x02); + sensor_write_register(0x39A, 0x3C); + sensor_write_register(0x39B, 0x00); + sensor_write_register(0x39C, 0x00); + sensor_write_register(0x39D, 0x00); + sensor_write_register(0x39E, 0x00); + sensor_write_register(0x39F, 0x00); + sensor_write_register(0x3A0, 0x80); + sensor_write_register(0x3A1, 0x0B); + sensor_write_register(0x3A2, 0x64); + sensor_write_register(0x3A3, 0x90); + sensor_write_register(0x3A4, 0x8D); + sensor_write_register(0x3A5, 0x6E); + sensor_write_register(0x3A6, 0x98); + sensor_write_register(0x3A7, 0x40); + sensor_write_register(0x3A8, 0x05); + sensor_write_register(0x3A9, 0xD1); + sensor_write_register(0x3AA, 0xA8); + sensor_write_register(0x3AB, 0x86); + sensor_write_register(0x3AC, 0x09); + sensor_write_register(0x3AD, 0x54); + sensor_write_register(0x3AE, 0x10); + sensor_write_register(0x3AF, 0x8D); + sensor_write_register(0x3B0, 0x6A); + sensor_write_register(0x3B1, 0xE8); + sensor_write_register(0x3B2, 0x82); + sensor_write_register(0x3B3, 0x17); + sensor_write_register(0x3B4, 0x1C); + sensor_write_register(0x3B5, 0x60); + sensor_write_register(0x3B6, 0xC1); + sensor_write_register(0x3B7, 0x31); + sensor_write_register(0x3B8, 0xAE); + sensor_write_register(0x3B9, 0xD1); + sensor_write_register(0x3BA, 0x81); + sensor_write_register(0x3BB, 0x16); + sensor_write_register(0x3BC, 0x20); + sensor_write_register(0x3BD, 0x03); + sensor_write_register(0x3BE, 0x1B); + sensor_write_register(0x3BF, 0x24); + sensor_write_register(0x3C0, 0xE0); + sensor_write_register(0x3C1, 0xC1); + sensor_write_register(0x3C2, 0x33); + sensor_write_register(0x3C3, 0xBE); + sensor_write_register(0x3C4, 0x51); + sensor_write_register(0x3C5, 0x82); + sensor_write_register(0x3C6, 0x1E); + sensor_write_register(0x3C7, 0x40); + sensor_write_register(0x3C8, 0x03); + sensor_write_register(0x3C9, 0x1C); + sensor_write_register(0x3CA, 0x34); + sensor_write_register(0x3CB, 0xD0); + sensor_write_register(0x3CC, 0x81); + sensor_write_register(0x3CD, 0x02); + sensor_write_register(0x3CE, 0x16); + sensor_write_register(0x3CF, 0x00); + sensor_write_register(0x3D0, 0x02); + sensor_write_register(0x3D1, 0x04); + sensor_write_register(0x3D2, 0x00); + sensor_write_register(0x3D3, 0x00); + sensor_write_register(0x3D4, 0x00); + sensor_write_register(0x3D5, 0x80); + sensor_write_register(0x3D6, 0x00); + sensor_write_register(0x3D7, 0x00); + sensor_write_register(0x3D8, 0x23); + sensor_write_register(0x3D9, 0x01); + sensor_write_register(0x3DA, 0x03); + sensor_write_register(0x3DB, 0x02); + sensor_write_register(0x3DC, 0x00); + sensor_write_register(0x3DD, 0x00); + sensor_write_register(0x3DE, 0x00); + sensor_write_register(0x3DF, 0x00); + sensor_write_register(0x3E0, 0x22); + sensor_write_register(0x3E1, 0x00); + sensor_write_register(0x3E2, 0x00); + sensor_write_register(0x3E3, 0x00); + sensor_write_register(0x3E4, 0x3F); + sensor_write_register(0x3E5, 0x17); + sensor_write_register(0x3E6, 0x15); + sensor_write_register(0x3E7, 0x00); + sensor_write_register(0x3E8, 0x00); + sensor_write_register(0x3E9, 0x00); + sensor_write_register(0x3EA, 0x00); + sensor_write_register(0x3EB, 0x00); + sensor_write_register(0x3EC, 0x00); + sensor_write_register(0x3ED, 0x00); + sensor_write_register(0x3EE, 0x00); + sensor_write_register(0x3EF, 0x00); + sensor_write_register(0x3F0, 0x00); + sensor_write_register(0x3F1, 0x00); + sensor_write_register(0x3F2, 0x00); + sensor_write_register(0x3F3, 0x00); + sensor_write_register(0x3F4, 0x00); + sensor_write_register(0x3F5, 0x00); + sensor_write_register(0x3F6, 0x00); + sensor_write_register(0x3F7, 0x00); + sensor_write_register(0x3F8, 0x00); + sensor_write_register(0x3F9, 0x00); + sensor_write_register(0x3FA, 0x00); + sensor_write_register(0x3FB, 0x00); + sensor_write_register(0x3FC, 0x00); + sensor_write_register(0x3FD, 0x00); + sensor_write_register(0x3FE, 0x00); + sensor_write_register(0x3FF, 0x00); + + // standby cancel + sensor_write_register(0x200, 0x30); + // XVS,XHS output start + //sensor_write_register(0x229, 0xC0); + + // waiting for image stabilization + usleep(200000); + + printf("-------Sony IMX122 Sensor Initial OK!-------\n"); + +} + + + +void sensor_init_1080p_30fps() +{ + sensor_write_register(0x200, 0x31); + sensor_write_register(0x211, 0x00); + sensor_write_register(0x22D, 0x40); + sensor_write_register(0x202, 0x0F); + sensor_write_register(0x216, 0x3C); + sensor_write_register(0x217, 0x00); + sensor_write_register(0x214, 0x00); + sensor_write_register(0x215, 0x00); + sensor_write_register(0x218, 0xC0); + sensor_write_register(0x219, 0x07); + sensor_write_register(0x2CE, 0x16); + sensor_write_register(0x2CF, 0x82); + sensor_write_register(0x2D0, 0x00); + sensor_write_register(0x29A, 0x26); + sensor_write_register(0x29B, 0x02); + sensor_write_register(0x212, 0x82); + sensor_write_register(0x20F, 0x00); + sensor_write_register(0x20D, 0x00); + sensor_write_register(0x208, 0x00); + sensor_write_register(0x209, 0x00); + sensor_write_register(0x21E, 0x00); + sensor_write_register(0x220, 0xF0); + sensor_write_register(0x221, 0x00); + sensor_write_register(0x222, 0x40); + sensor_write_register(0x205, 0x65); + sensor_write_register(0x206, 0x04); + sensor_write_register(0x203, 0x4C); + sensor_write_register(0x204, 0x04); + sensor_write_register(0x23B, 0xE0); + + // master mode start + sensor_write_register(0x22C, 0x00); + + + sensor_write_register(0x201, 0x00); + + + + sensor_write_register(0x207, 0x00); + + sensor_write_register(0x20A, 0x00); + sensor_write_register(0x20B, 0x00); + sensor_write_register(0x20C, 0x00); + + sensor_write_register(0x20E, 0x00); + + sensor_write_register(0x210, 0x00); + + + sensor_write_register(0x213, 0x40); + + + + sensor_write_register(0x21A, 0xC9); + sensor_write_register(0x21B, 0x04); + sensor_write_register(0x21C, 0x50); + sensor_write_register(0x21D, 0x00); + + sensor_write_register(0x21F, 0x31); + + + sensor_write_register(0x223, 0x08); + sensor_write_register(0x224, 0x30); + sensor_write_register(0x225, 0x00); + sensor_write_register(0x226, 0x80); + sensor_write_register(0x227, 0x20); + sensor_write_register(0x228, 0x34); + sensor_write_register(0x229, 0x63); + sensor_write_register(0x22A, 0x00); + sensor_write_register(0x22B, 0x00); + + + sensor_write_register(0x22E, 0x00); + sensor_write_register(0x22F, 0x02); + + + + sensor_write_register(0x230, 0x30); + sensor_write_register(0x231, 0x20); + sensor_write_register(0x232, 0x00); + sensor_write_register(0x233, 0x14); + sensor_write_register(0x234, 0x20); + sensor_write_register(0x235, 0x60); + sensor_write_register(0x236, 0x00); + sensor_write_register(0x237, 0x23); + sensor_write_register(0x238, 0x01); + sensor_write_register(0x239, 0x00); + sensor_write_register(0x23A, 0xA8); + sensor_write_register(0x23B, 0xE0); + sensor_write_register(0x23C, 0x06); + sensor_write_register(0x23D, 0x00); + sensor_write_register(0x23E, 0x10); + sensor_write_register(0x23F, 0x00); + sensor_write_register(0x240, 0x42); + sensor_write_register(0x241, 0x23); + sensor_write_register(0x242, 0x3C); + sensor_write_register(0x243, 0x01); + sensor_write_register(0x244, 0x00); + sensor_write_register(0x245, 0x00); + sensor_write_register(0x246, 0x00); + sensor_write_register(0x247, 0x00); + sensor_write_register(0x248, 0x00); + sensor_write_register(0x249, 0x00); + sensor_write_register(0x24A, 0x00); + sensor_write_register(0x24B, 0x00); + sensor_write_register(0x24C, 0x01); + sensor_write_register(0x24D, 0x00); + sensor_write_register(0x24E, 0x01); + sensor_write_register(0x24F, 0x47); + sensor_write_register(0x250, 0x10); + sensor_write_register(0x251, 0x18); + sensor_write_register(0x252, 0x12); + sensor_write_register(0x253, 0x00); + sensor_write_register(0x254, 0x00); + sensor_write_register(0x255, 0x00); + sensor_write_register(0x256, 0x00); + sensor_write_register(0x257, 0x00); + sensor_write_register(0x258, 0xE0); + sensor_write_register(0x259, 0x01); + sensor_write_register(0x25A, 0xE0); + sensor_write_register(0x25B, 0x01); + sensor_write_register(0x25C, 0x00); + sensor_write_register(0x25D, 0x00); + sensor_write_register(0x25E, 0x00); + sensor_write_register(0x25F, 0x00); + sensor_write_register(0x260, 0x00); + sensor_write_register(0x261, 0x00); + sensor_write_register(0x262, 0x76); + sensor_write_register(0x263, 0x00); + sensor_write_register(0x264, 0x01); + sensor_write_register(0x265, 0x00); + sensor_write_register(0x266, 0x00); + sensor_write_register(0x267, 0x00); + sensor_write_register(0x268, 0x00); + sensor_write_register(0x269, 0x00); + sensor_write_register(0x26A, 0x00); + sensor_write_register(0x26B, 0x00); + sensor_write_register(0x26C, 0x00); + sensor_write_register(0x26D, 0x00); + sensor_write_register(0x26E, 0x00); + sensor_write_register(0x26F, 0x00); + sensor_write_register(0x270, 0x00); + sensor_write_register(0x271, 0x00); + sensor_write_register(0x272, 0x00); + sensor_write_register(0x273, 0x01); + sensor_write_register(0x274, 0x06); + sensor_write_register(0x275, 0x07); + sensor_write_register(0x276, 0x80); + sensor_write_register(0x277, 0x00); + sensor_write_register(0x278, 0x40); + sensor_write_register(0x279, 0x08); + sensor_write_register(0x27A, 0x00); + sensor_write_register(0x27B, 0x00); + sensor_write_register(0x27C, 0x10); + sensor_write_register(0x27D, 0x00); + sensor_write_register(0x27E, 0x00); + sensor_write_register(0x27F, 0x00); + sensor_write_register(0x280, 0x06); + sensor_write_register(0x281, 0x19); + sensor_write_register(0x282, 0x00); + sensor_write_register(0x283, 0x64); + sensor_write_register(0x284, 0x00); + sensor_write_register(0x285, 0x01); + sensor_write_register(0x286, 0x00); + sensor_write_register(0x287, 0x00); + sensor_write_register(0x288, 0x00); + sensor_write_register(0x289, 0x00); + sensor_write_register(0x28A, 0x00); + sensor_write_register(0x28B, 0x00); + sensor_write_register(0x28C, 0x00); + sensor_write_register(0x28D, 0x00); + sensor_write_register(0x28E, 0x00); + sensor_write_register(0x28F, 0x00); + sensor_write_register(0x290, 0x00); + sensor_write_register(0x291, 0x00); + sensor_write_register(0x292, 0x01); + sensor_write_register(0x293, 0x01); + sensor_write_register(0x294, 0x00); + sensor_write_register(0x295, 0xFF); + sensor_write_register(0x296, 0x0F); + sensor_write_register(0x297, 0x00); + sensor_write_register(0x298, 0x26); + sensor_write_register(0x299, 0x02); + + sensor_write_register(0x29C, 0x9C); + sensor_write_register(0x29D, 0x01); + sensor_write_register(0x29E, 0x39); + sensor_write_register(0x29F, 0x03); + sensor_write_register(0x2A0, 0x01); + sensor_write_register(0x2A1, 0x05); + sensor_write_register(0x2A2, 0xD0); + sensor_write_register(0x2A3, 0x07); + sensor_write_register(0x2A4, 0x00); + sensor_write_register(0x2A5, 0x02); + sensor_write_register(0x2A6, 0x0B); + sensor_write_register(0x2A7, 0x0F); + sensor_write_register(0x2A8, 0x24); + sensor_write_register(0x2A9, 0x00); + sensor_write_register(0x2AA, 0x28); + sensor_write_register(0x2AB, 0x00); + sensor_write_register(0x2AC, 0xE8); + sensor_write_register(0x2AD, 0x04); + sensor_write_register(0x2AE, 0xEC); + sensor_write_register(0x2AF, 0x04); + sensor_write_register(0x2B0, 0x00); + sensor_write_register(0x2B1, 0x00); + sensor_write_register(0x2B2, 0x03); + sensor_write_register(0x2B3, 0x05); + sensor_write_register(0x2B4, 0x00); + sensor_write_register(0x2B5, 0x0F); + sensor_write_register(0x2B6, 0x10); + sensor_write_register(0x2B7, 0x00); + sensor_write_register(0x2B8, 0x28); + sensor_write_register(0x2B9, 0x00); + sensor_write_register(0x2BA, 0xBF); + sensor_write_register(0x2BB, 0x07); + sensor_write_register(0x2BC, 0xCF); + sensor_write_register(0x2BD, 0x07); + sensor_write_register(0x2BE, 0xCF); + sensor_write_register(0x2BF, 0x07); + sensor_write_register(0x2C0, 0xCF); + sensor_write_register(0x2C1, 0x07); + sensor_write_register(0x2C2, 0xD0); + sensor_write_register(0x2C3, 0x07); + sensor_write_register(0x2C4, 0x01); + sensor_write_register(0x2C5, 0x02); + sensor_write_register(0x2C6, 0x03); + sensor_write_register(0x2C7, 0x04); + sensor_write_register(0x2C8, 0x05); + sensor_write_register(0x2C9, 0x06); + sensor_write_register(0x2CA, 0x07); + sensor_write_register(0x2CB, 0x08); + sensor_write_register(0x2CC, 0x01); + sensor_write_register(0x2CD, 0x03); + + sensor_write_register(0x2D1, 0x00); + sensor_write_register(0x2D2, 0x00); + sensor_write_register(0x2D3, 0x00); + sensor_write_register(0x2D4, 0x00); + sensor_write_register(0x2D5, 0x00); + sensor_write_register(0x2D6, 0x00); + sensor_write_register(0x2D7, 0x00); + sensor_write_register(0x2D8, 0x00); + sensor_write_register(0x2D9, 0x00); + sensor_write_register(0x2DA, 0x00); + sensor_write_register(0x2DB, 0x00); + sensor_write_register(0x2DC, 0x00); + sensor_write_register(0x2DD, 0x00); + sensor_write_register(0x2DE, 0x00); + sensor_write_register(0x2DF, 0x00); + sensor_write_register(0x2E0, 0x00); + sensor_write_register(0x2E1, 0x00); + sensor_write_register(0x2E2, 0x00); + sensor_write_register(0x2E3, 0x00); + sensor_write_register(0x2E4, 0x00); + sensor_write_register(0x2E5, 0x00); + sensor_write_register(0x2E6, 0x00); + sensor_write_register(0x2E7, 0x00); + sensor_write_register(0x2E8, 0x00); + sensor_write_register(0x2E9, 0x00); + sensor_write_register(0x2EA, 0x00); + sensor_write_register(0x2EB, 0x00); + sensor_write_register(0x2EC, 0x00); + sensor_write_register(0x2ED, 0x00); + sensor_write_register(0x2EE, 0x00); + sensor_write_register(0x2EF, 0x00); + sensor_write_register(0x2F0, 0x00); + sensor_write_register(0x2F1, 0x00); + sensor_write_register(0x2F2, 0x00); + sensor_write_register(0x2F3, 0x00); + sensor_write_register(0x2F4, 0x00); + sensor_write_register(0x2F5, 0x00); + sensor_write_register(0x2F6, 0x00); + sensor_write_register(0x2F7, 0x00); + sensor_write_register(0x2F8, 0x00); + sensor_write_register(0x2F9, 0x00); + sensor_write_register(0x2FA, 0x00); + sensor_write_register(0x2FB, 0x00); + sensor_write_register(0x2FC, 0x00); + sensor_write_register(0x2FD, 0x00); + sensor_write_register(0x2FE, 0x00); + sensor_write_register(0x2FF, 0x00); + + // chip_id = 0x3 + + sensor_write_register(0x300, 0x00); + sensor_write_register(0x301, 0x00); + sensor_write_register(0x302, 0x00); + sensor_write_register(0x303, 0x00); + sensor_write_register(0x304, 0x00); + sensor_write_register(0x305, 0x00); + sensor_write_register(0x306, 0x00); + sensor_write_register(0x307, 0xFA); + sensor_write_register(0x308, 0xFA); + sensor_write_register(0x309, 0x41); + sensor_write_register(0x30A, 0x31); + sensor_write_register(0x30B, 0x38); + sensor_write_register(0x30C, 0x04); + sensor_write_register(0x30D, 0x00); + sensor_write_register(0x30E, 0x1A); + sensor_write_register(0x30F, 0x10); + sensor_write_register(0x310, 0x00); + sensor_write_register(0x311, 0x00); + sensor_write_register(0x312, 0x10); + sensor_write_register(0x313, 0x00); + sensor_write_register(0x314, 0x00); + sensor_write_register(0x315, 0x06); + sensor_write_register(0x316, 0x33); + sensor_write_register(0x317, 0x0D); + sensor_write_register(0x318, 0x00); + sensor_write_register(0x319, 0x00); + sensor_write_register(0x31A, 0x00); + sensor_write_register(0x31B, 0x00); + sensor_write_register(0x31C, 0x00); + sensor_write_register(0x31D, 0x00); + sensor_write_register(0x31E, 0x00); + sensor_write_register(0x31F, 0x00); + sensor_write_register(0x320, 0x00); + sensor_write_register(0x321, 0x80); + sensor_write_register(0x322, 0x0C); + sensor_write_register(0x323, 0x00); + sensor_write_register(0x324, 0x00); + sensor_write_register(0x325, 0x00); + sensor_write_register(0x326, 0x00); + sensor_write_register(0x327, 0x00); + sensor_write_register(0x328, 0x05); + sensor_write_register(0x329, 0x80); + sensor_write_register(0x32A, 0x00); + sensor_write_register(0x32B, 0x00); + sensor_write_register(0x32C, 0x04); + sensor_write_register(0x32D, 0x04); + sensor_write_register(0x32E, 0x00); + sensor_write_register(0x32F, 0x00); + sensor_write_register(0x330, 0x9B); + sensor_write_register(0x331, 0x71); + sensor_write_register(0x332, 0x33); + sensor_write_register(0x333, 0x37); + sensor_write_register(0x334, 0xB3); + sensor_write_register(0x335, 0x19); + sensor_write_register(0x336, 0x97); + sensor_write_register(0x337, 0xB1); + sensor_write_register(0x338, 0x19); + sensor_write_register(0x339, 0x01); + sensor_write_register(0x33A, 0x50); + sensor_write_register(0x33B, 0x00); + sensor_write_register(0x33C, 0x35); + sensor_write_register(0x33D, 0xB0); + sensor_write_register(0x33E, 0x03); + sensor_write_register(0x33F, 0xD1); + sensor_write_register(0x340, 0x71); + sensor_write_register(0x341, 0x1D); + sensor_write_register(0x342, 0x00); + sensor_write_register(0x343, 0x00); + sensor_write_register(0x344, 0x00); + sensor_write_register(0x345, 0x00); + sensor_write_register(0x346, 0x02); + sensor_write_register(0x347, 0x30); + sensor_write_register(0x348, 0x00); + sensor_write_register(0x349, 0x00); + sensor_write_register(0x34A, 0x00); + sensor_write_register(0x34B, 0x03); + sensor_write_register(0x34C, 0x00); + sensor_write_register(0x34D, 0x02); + sensor_write_register(0x34E, 0x10); + sensor_write_register(0x34F, 0xA0); + sensor_write_register(0x350, 0x00); + sensor_write_register(0x351, 0x07); + sensor_write_register(0x352, 0x40); + sensor_write_register(0x353, 0x80); + sensor_write_register(0x354, 0x00); + sensor_write_register(0x355, 0x02); + sensor_write_register(0x356, 0x50); + sensor_write_register(0x357, 0x02); + sensor_write_register(0x358, 0x23); + sensor_write_register(0x359, 0xE4); + sensor_write_register(0x35A, 0x45); + sensor_write_register(0x35B, 0x33); + sensor_write_register(0x35C, 0x79); + sensor_write_register(0x35D, 0xD1); + sensor_write_register(0x35E, 0xCC); + sensor_write_register(0x35F, 0x2F); + sensor_write_register(0x360, 0xB6); + sensor_write_register(0x361, 0xA1); + sensor_write_register(0x362, 0x17); + sensor_write_register(0x363, 0xCB); + sensor_write_register(0x364, 0xE8); + sensor_write_register(0x365, 0xC5); + sensor_write_register(0x366, 0x32); + sensor_write_register(0x367, 0xC0); + sensor_write_register(0x368, 0xA8); + sensor_write_register(0x369, 0xC6); + sensor_write_register(0x36A, 0x5E); + sensor_write_register(0x36B, 0x20); + sensor_write_register(0x36C, 0x63); + sensor_write_register(0x36D, 0x0D); + sensor_write_register(0x36E, 0x6D); + sensor_write_register(0x36F, 0x44); + sensor_write_register(0x370, 0xA6); + sensor_write_register(0x371, 0x32); + sensor_write_register(0x372, 0x24); + sensor_write_register(0x373, 0x50); + sensor_write_register(0x374, 0xC4); + sensor_write_register(0x375, 0x2F); + sensor_write_register(0x376, 0xF4); + sensor_write_register(0x377, 0x42); + sensor_write_register(0x378, 0x82); + sensor_write_register(0x379, 0x13); + sensor_write_register(0x37A, 0x90); + sensor_write_register(0x37B, 0x00); + sensor_write_register(0x37C, 0x10); + sensor_write_register(0x37D, 0x8A); + sensor_write_register(0x37E, 0x60); + sensor_write_register(0x37F, 0xC4); + sensor_write_register(0x380, 0x2F); + sensor_write_register(0x381, 0x84); + sensor_write_register(0x382, 0xF1); + sensor_write_register(0x383, 0x0B); + sensor_write_register(0x384, 0xCD); + sensor_write_register(0x385, 0x70); + sensor_write_register(0x386, 0x42); + sensor_write_register(0x387, 0x16); + sensor_write_register(0x388, 0x00); + sensor_write_register(0x389, 0x61); + sensor_write_register(0x38A, 0x0B); + sensor_write_register(0x38B, 0x29); + sensor_write_register(0x38C, 0x74); + sensor_write_register(0x38D, 0x81); + sensor_write_register(0x38E, 0x10); + sensor_write_register(0x38F, 0xBA); + sensor_write_register(0x390, 0x18); + sensor_write_register(0x391, 0x22); + sensor_write_register(0x392, 0x11); + sensor_write_register(0x393, 0xE9); + sensor_write_register(0x394, 0x60); + sensor_write_register(0x395, 0x07); + sensor_write_register(0x396, 0x09); + sensor_write_register(0x397, 0xF6); + sensor_write_register(0x398, 0x40); + sensor_write_register(0x399, 0x02); + sensor_write_register(0x39A, 0x3C); + sensor_write_register(0x39B, 0x00); + sensor_write_register(0x39C, 0x00); + sensor_write_register(0x39D, 0x00); + sensor_write_register(0x39E, 0x00); + sensor_write_register(0x39F, 0x00); + sensor_write_register(0x3A0, 0x80); + sensor_write_register(0x3A1, 0x0B); + sensor_write_register(0x3A2, 0x64); + sensor_write_register(0x3A3, 0x90); + sensor_write_register(0x3A4, 0x8D); + sensor_write_register(0x3A5, 0x6E); + sensor_write_register(0x3A6, 0x98); + sensor_write_register(0x3A7, 0x40); + sensor_write_register(0x3A8, 0x05); + sensor_write_register(0x3A9, 0xD1); + sensor_write_register(0x3AA, 0xA8); + sensor_write_register(0x3AB, 0x86); + sensor_write_register(0x3AC, 0x09); + sensor_write_register(0x3AD, 0x54); + sensor_write_register(0x3AE, 0x10); + sensor_write_register(0x3AF, 0x8D); + sensor_write_register(0x3B0, 0x6A); + sensor_write_register(0x3B1, 0xE8); + sensor_write_register(0x3B2, 0x82); + sensor_write_register(0x3B3, 0x17); + sensor_write_register(0x3B4, 0x1C); + sensor_write_register(0x3B5, 0x60); + sensor_write_register(0x3B6, 0xC1); + sensor_write_register(0x3B7, 0x31); + sensor_write_register(0x3B8, 0xAE); + sensor_write_register(0x3B9, 0xD1); + sensor_write_register(0x3BA, 0x81); + sensor_write_register(0x3BB, 0x16); + sensor_write_register(0x3BC, 0x20); + sensor_write_register(0x3BD, 0x03); + sensor_write_register(0x3BE, 0x1B); + sensor_write_register(0x3BF, 0x24); + sensor_write_register(0x3C0, 0xE0); + sensor_write_register(0x3C1, 0xC1); + sensor_write_register(0x3C2, 0x33); + sensor_write_register(0x3C3, 0xBE); + sensor_write_register(0x3C4, 0x51); + sensor_write_register(0x3C5, 0x82); + sensor_write_register(0x3C6, 0x1E); + sensor_write_register(0x3C7, 0x40); + sensor_write_register(0x3C8, 0x03); + sensor_write_register(0x3C9, 0x1C); + sensor_write_register(0x3CA, 0x34); + sensor_write_register(0x3CB, 0xD0); + sensor_write_register(0x3CC, 0x81); + sensor_write_register(0x3CD, 0x02); + sensor_write_register(0x3CE, 0x16); + sensor_write_register(0x3CF, 0x00); + sensor_write_register(0x3D0, 0x02); + sensor_write_register(0x3D1, 0x04); + sensor_write_register(0x3D2, 0x00); + sensor_write_register(0x3D3, 0x00); + sensor_write_register(0x3D4, 0x00); + sensor_write_register(0x3D5, 0x80); + sensor_write_register(0x3D6, 0x00); + sensor_write_register(0x3D7, 0x00); + sensor_write_register(0x3D8, 0x23); + sensor_write_register(0x3D9, 0x01); + sensor_write_register(0x3DA, 0x03); + sensor_write_register(0x3DB, 0x02); + sensor_write_register(0x3DC, 0x00); + sensor_write_register(0x3DD, 0x00); + sensor_write_register(0x3DE, 0x00); + sensor_write_register(0x3DF, 0x00); + sensor_write_register(0x3E0, 0x22); + sensor_write_register(0x3E1, 0x00); + sensor_write_register(0x3E2, 0x00); + sensor_write_register(0x3E3, 0x00); + sensor_write_register(0x3E4, 0x3F); + sensor_write_register(0x3E5, 0x17); + sensor_write_register(0x3E6, 0x15); + sensor_write_register(0x3E7, 0x00); + sensor_write_register(0x3E8, 0x00); + sensor_write_register(0x3E9, 0x00); + sensor_write_register(0x3EA, 0x00); + sensor_write_register(0x3EB, 0x00); + sensor_write_register(0x3EC, 0x00); + sensor_write_register(0x3ED, 0x00); + sensor_write_register(0x3EE, 0x00); + sensor_write_register(0x3EF, 0x00); + sensor_write_register(0x3F0, 0x00); + sensor_write_register(0x3F1, 0x00); + sensor_write_register(0x3F2, 0x00); + sensor_write_register(0x3F3, 0x00); + sensor_write_register(0x3F4, 0x00); + sensor_write_register(0x3F5, 0x00); + sensor_write_register(0x3F6, 0x00); + sensor_write_register(0x3F7, 0x00); + sensor_write_register(0x3F8, 0x00); + sensor_write_register(0x3F9, 0x00); + sensor_write_register(0x3FA, 0x00); + sensor_write_register(0x3FB, 0x00); + sensor_write_register(0x3FC, 0x00); + sensor_write_register(0x3FD, 0x00); + sensor_write_register(0x3FE, 0x00); + sensor_write_register(0x3FF, 0x00); + + // standby cancel +// sensor_write_register(0x200, 0x30); + + // waiting for internal regular stabilization + //usleep(200000); + + + // sensor_write_register(0x226, 0x00); + + // standby cancel + sensor_write_register(0x200, 0x30); + // XVS,XHS output start + //sensor_write_register(0x229, 0xC0); + + // waiting for image stabilization + usleep(200000); + + printf("-------Sony IMX122 Sensor Initial OK!-------\n"); + +} + + + +void sensor_init_720p_60fps() +{ + sensor_write_register(0x200, 0x31); //sensor_write_register(0x200, 0x01) + sensor_write_register(0x211, 0x00); + sensor_write_register(0x22D, 0x40); + sensor_write_register(0x202, 0x01); + sensor_write_register(0x216, 0xF0); + sensor_write_register(0x217, 0x00); + sensor_write_register(0x214, 0x40); + sensor_write_register(0x215, 0x01); + sensor_write_register(0x218, 0x40); + sensor_write_register(0x219, 0x05); + sensor_write_register(0x2CE, 0x00); + sensor_write_register(0x2CF, 0x00); + sensor_write_register(0x2D0, 0x00); + sensor_write_register(0x29A, 0x4C); + sensor_write_register(0x29B, 0x04); + //sensor_write_register(0x212, 0x82);// sensor_write_register(0x212, 0x80); + sensor_write_register(0x212, 0x80); + + sensor_write_register(0x20F, 0x00); + sensor_write_register(0x20D, 0x00); + sensor_write_register(0x208, 0x00); + sensor_write_register(0x209, 0x00); + sensor_write_register(0x21E, 0x00); + sensor_write_register(0x220, 0x3C); + sensor_write_register(0x221, 0x00); + // sensor_write_register(0x222, 0x01); // sensor_write_register(0x222, 0xC0) + + sensor_write_register(0x222, 0xC0); + + sensor_write_register(0x205, 0xEE); + sensor_write_register(0x206, 0x02); + sensor_write_register(0x203, 0x39); + sensor_write_register(0x204, 0x03); + sensor_write_register(0x23B, 0xE0); + + // master mode start + sensor_write_register(0x22C, 0x00); // sensor_write_register(0x22C, 0x01); + + sensor_write_register(0x201, 0x00); + + sensor_write_register(0x207, 0x00); + + sensor_write_register(0x20A, 0x00); + sensor_write_register(0x20B, 0x00); + sensor_write_register(0x20C, 0x00); + + sensor_write_register(0x20E, 0x00); + sensor_write_register(0x210, 0x00); + sensor_write_register(0x213, 0x40); + sensor_write_register(0x21A, 0xE9); + sensor_write_register(0x21B, 0x02); + sensor_write_register(0x21C, 0x50); + sensor_write_register(0x21D, 0x00); + + sensor_write_register(0x21F, 0x31); + + sensor_write_register(0x223, 0x08); + sensor_write_register(0x224, 0x30); + sensor_write_register(0x225, 0x00); + sensor_write_register(0x226, 0x80); + sensor_write_register(0x227, 0x20); + sensor_write_register(0x228, 0x34); + sensor_write_register(0x229, 0x63); + sensor_write_register(0x22A, 0x00); + sensor_write_register(0x22B, 0x00); + + sensor_write_register(0x22E, 0x00); + sensor_write_register(0x22F, 0x02); + + sensor_write_register(0x230, 0x30); + sensor_write_register(0x231, 0x20); + sensor_write_register(0x232, 0x00); + sensor_write_register(0x233, 0x14); + sensor_write_register(0x234, 0x20); + sensor_write_register(0x235, 0x60); + sensor_write_register(0x236, 0x00); + sensor_write_register(0x237, 0x23); + sensor_write_register(0x238, 0x01); + sensor_write_register(0x239, 0x00); + sensor_write_register(0x23A, 0xA8); + sensor_write_register(0x23B, 0xE0); + sensor_write_register(0x23C, 0x06); + sensor_write_register(0x23D, 0x00); + sensor_write_register(0x23E, 0x10); + sensor_write_register(0x23F, 0x00); + sensor_write_register(0x240, 0x42); + sensor_write_register(0x241, 0x23); + sensor_write_register(0x242, 0x3C); + sensor_write_register(0x243, 0x01); + sensor_write_register(0x244, 0x00); + sensor_write_register(0x245, 0x00); + sensor_write_register(0x246, 0x00); + sensor_write_register(0x247, 0x00); + sensor_write_register(0x248, 0x00); + sensor_write_register(0x249, 0x00); + sensor_write_register(0x24A, 0x00); + sensor_write_register(0x24B, 0x00); + sensor_write_register(0x24C, 0x01); + sensor_write_register(0x24D, 0x00); + sensor_write_register(0x24E, 0x01); + sensor_write_register(0x24F, 0x07); + sensor_write_register(0x250, 0x10); + sensor_write_register(0x251, 0x18); + sensor_write_register(0x252, 0x12); + sensor_write_register(0x253, 0x00); + sensor_write_register(0x254, 0x00); + sensor_write_register(0x255, 0x00); + sensor_write_register(0x256, 0x00); + sensor_write_register(0x257, 0x00); + sensor_write_register(0x258, 0xE0); + sensor_write_register(0x259, 0x01); + sensor_write_register(0x25A, 0xE0); + sensor_write_register(0x25B, 0x01); + sensor_write_register(0x25C, 0x00); + sensor_write_register(0x25D, 0x00); + sensor_write_register(0x25E, 0x00); + sensor_write_register(0x25F, 0x00); + sensor_write_register(0x260, 0x00); + sensor_write_register(0x261, 0x00); + sensor_write_register(0x262, 0x76); + sensor_write_register(0x263, 0x00); + sensor_write_register(0x264, 0x01); + sensor_write_register(0x265, 0x00); + sensor_write_register(0x266, 0x00); + sensor_write_register(0x267, 0x00); + sensor_write_register(0x268, 0x00); + sensor_write_register(0x269, 0x00); + sensor_write_register(0x26A, 0x00); + sensor_write_register(0x26B, 0x00); + sensor_write_register(0x26C, 0x00); + sensor_write_register(0x26D, 0x00); + sensor_write_register(0x26E, 0x00); + sensor_write_register(0x26F, 0x00); + sensor_write_register(0x270, 0x00); + sensor_write_register(0x271, 0x00); + sensor_write_register(0x272, 0x00); + sensor_write_register(0x273, 0x01); + sensor_write_register(0x274, 0x06); + sensor_write_register(0x275, 0x07); + sensor_write_register(0x276, 0x80); + sensor_write_register(0x277, 0x00); + sensor_write_register(0x278, 0x40); + sensor_write_register(0x279, 0x08); + sensor_write_register(0x27A, 0x00); + sensor_write_register(0x27B, 0x00); + sensor_write_register(0x27C, 0x10); + sensor_write_register(0x27D, 0x00); + sensor_write_register(0x27E, 0x00); + sensor_write_register(0x27F, 0x00); + sensor_write_register(0x280, 0x06); + sensor_write_register(0x281, 0x19); + sensor_write_register(0x282, 0x00); + sensor_write_register(0x283, 0x64); + sensor_write_register(0x284, 0x00); + sensor_write_register(0x285, 0x01); + sensor_write_register(0x286, 0x00); + sensor_write_register(0x287, 0x00); + sensor_write_register(0x288, 0x00); + sensor_write_register(0x289, 0x00); + sensor_write_register(0x28A, 0x00); + sensor_write_register(0x28B, 0x00); + sensor_write_register(0x28C, 0x00); + sensor_write_register(0x28D, 0x00); + sensor_write_register(0x28E, 0x00); + sensor_write_register(0x28F, 0x00); + sensor_write_register(0x290, 0x00); + sensor_write_register(0x291, 0x00); + sensor_write_register(0x292, 0x01); + sensor_write_register(0x293, 0x01); + sensor_write_register(0x294, 0x00); + sensor_write_register(0x295, 0xFF); + sensor_write_register(0x296, 0x0F); + sensor_write_register(0x297, 0x00); + sensor_write_register(0x298, 0x26); + sensor_write_register(0x299, 0x02); + + sensor_write_register(0x29A, 0x4C); //new + sensor_write_register(0x29B, 0x04); //new + + sensor_write_register(0x29C, 0x9C); + sensor_write_register(0x29D, 0x01); + sensor_write_register(0x29E, 0x39); + sensor_write_register(0x29F, 0x03); + sensor_write_register(0x2A0, 0x01); + sensor_write_register(0x2A1, 0x05); + sensor_write_register(0x2A2, 0xD0); + sensor_write_register(0x2A3, 0x07); + sensor_write_register(0x2A4, 0x00); + sensor_write_register(0x2A5, 0x02); + sensor_write_register(0x2A6, 0x0B); + sensor_write_register(0x2A7, 0x0F); + sensor_write_register(0x2A8, 0x24); + sensor_write_register(0x2A9, 0x00); + sensor_write_register(0x2AA, 0x28); + sensor_write_register(0x2AB, 0x00); + sensor_write_register(0x2AC, 0xE8); + sensor_write_register(0x2AD, 0x04); + sensor_write_register(0x2AE, 0xEC); + sensor_write_register(0x2AF, 0x04); + sensor_write_register(0x2B0, 0x00); + sensor_write_register(0x2B1, 0x00); + sensor_write_register(0x2B2, 0x03); + sensor_write_register(0x2B3, 0x05); + sensor_write_register(0x2B4, 0x00); + sensor_write_register(0x2B5, 0x0F); + sensor_write_register(0x2B6, 0x10); + sensor_write_register(0x2B7, 0x00); + sensor_write_register(0x2B8, 0x28); + sensor_write_register(0x2B9, 0x00); + sensor_write_register(0x2BA, 0xBF); + sensor_write_register(0x2BB, 0x07); + sensor_write_register(0x2BC, 0xCF); + sensor_write_register(0x2BD, 0x07); + sensor_write_register(0x2BE, 0xCF); + sensor_write_register(0x2BF, 0x07); + sensor_write_register(0x2C0, 0xCF); + sensor_write_register(0x2C1, 0x07); + sensor_write_register(0x2C2, 0xD0); + sensor_write_register(0x2C3, 0x07); + sensor_write_register(0x2C4, 0x01); + sensor_write_register(0x2C5, 0x02); + sensor_write_register(0x2C6, 0x03); + sensor_write_register(0x2C7, 0x04); + sensor_write_register(0x2C8, 0x05); + sensor_write_register(0x2C9, 0x06); + sensor_write_register(0x2CA, 0x07); + sensor_write_register(0x2CB, 0x08); + sensor_write_register(0x2CC, 0x01); + sensor_write_register(0x2CD, 0x03); + + sensor_write_register(0x2D1, 0x00); + sensor_write_register(0x2D2, 0x00); + sensor_write_register(0x2D3, 0x00); + sensor_write_register(0x2D4, 0x00); + sensor_write_register(0x2D5, 0x00); + sensor_write_register(0x2D6, 0x00); + sensor_write_register(0x2D7, 0x00); + sensor_write_register(0x2D8, 0x00); + sensor_write_register(0x2D9, 0x00); + sensor_write_register(0x2DA, 0x00); + sensor_write_register(0x2DB, 0x00); + sensor_write_register(0x2DC, 0x00); + sensor_write_register(0x2DD, 0x00); + sensor_write_register(0x2DE, 0x00); + sensor_write_register(0x2DF, 0x00); + sensor_write_register(0x2E0, 0x00); + sensor_write_register(0x2E1, 0x00); + sensor_write_register(0x2E2, 0x00); + sensor_write_register(0x2E3, 0x00); + sensor_write_register(0x2E4, 0x00); + sensor_write_register(0x2E5, 0x00); + sensor_write_register(0x2E6, 0x00); + sensor_write_register(0x2E7, 0x00); + sensor_write_register(0x2E8, 0x00); + sensor_write_register(0x2E9, 0x00); + sensor_write_register(0x2EA, 0x00); + sensor_write_register(0x2EB, 0x00); + sensor_write_register(0x2EC, 0x00); + sensor_write_register(0x2ED, 0x00); + sensor_write_register(0x2EE, 0x00); + sensor_write_register(0x2EF, 0x00); + sensor_write_register(0x2F0, 0x00); + sensor_write_register(0x2F1, 0x00); + sensor_write_register(0x2F2, 0x00); + sensor_write_register(0x2F3, 0x00); + sensor_write_register(0x2F4, 0x00); + sensor_write_register(0x2F5, 0x00); + sensor_write_register(0x2F6, 0x00); + sensor_write_register(0x2F7, 0x00); + sensor_write_register(0x2F8, 0x00); + sensor_write_register(0x2F9, 0x00); + sensor_write_register(0x2FA, 0x00); + sensor_write_register(0x2FB, 0x00); + sensor_write_register(0x2FC, 0x00); + sensor_write_register(0x2FD, 0x00); + sensor_write_register(0x2FE, 0x00); + sensor_write_register(0x2FF, 0x00); + + // chip_id = 0x3 + + sensor_write_register(0x300, 0x00); + sensor_write_register(0x301, 0x00); + sensor_write_register(0x302, 0x00); + sensor_write_register(0x303, 0x00); + sensor_write_register(0x304, 0x00); + sensor_write_register(0x305, 0x00); + sensor_write_register(0x306, 0x00); + sensor_write_register(0x307, 0xFA); + sensor_write_register(0x308, 0xFA); + sensor_write_register(0x309, 0x41); + sensor_write_register(0x30A, 0x31); + sensor_write_register(0x30B, 0x38); + sensor_write_register(0x30C, 0x04); + sensor_write_register(0x30D, 0x00); + sensor_write_register(0x30E, 0x1A); + sensor_write_register(0x30F, 0x10); + sensor_write_register(0x310, 0x00); + sensor_write_register(0x311, 0x00); + sensor_write_register(0x312, 0x10); + sensor_write_register(0x313, 0x00); + sensor_write_register(0x314, 0x00); + sensor_write_register(0x315, 0x06); + sensor_write_register(0x316, 0x33); + sensor_write_register(0x317, 0x0D); + sensor_write_register(0x318, 0x00); + sensor_write_register(0x319, 0x00); + sensor_write_register(0x31A, 0x00); + sensor_write_register(0x31B, 0x00); + sensor_write_register(0x31C, 0x00); + sensor_write_register(0x31D, 0x00); + sensor_write_register(0x31E, 0x00); + sensor_write_register(0x31F, 0x00); + sensor_write_register(0x320, 0x00); + sensor_write_register(0x321, 0x80); + sensor_write_register(0x322, 0x0C); + sensor_write_register(0x323, 0x00); + sensor_write_register(0x324, 0x00); + sensor_write_register(0x325, 0x00); + sensor_write_register(0x326, 0x00); + sensor_write_register(0x327, 0x00); + sensor_write_register(0x328, 0x05); + sensor_write_register(0x329, 0x80); + sensor_write_register(0x32A, 0x00); + sensor_write_register(0x32B, 0x00); + sensor_write_register(0x32C, 0x04); + sensor_write_register(0x32D, 0x04); + sensor_write_register(0x32E, 0x00); + sensor_write_register(0x32F, 0x00); + sensor_write_register(0x330, 0x9B); + sensor_write_register(0x331, 0x71); + sensor_write_register(0x332, 0x33); + sensor_write_register(0x333, 0x37); + sensor_write_register(0x334, 0xB3); + sensor_write_register(0x335, 0x19); + sensor_write_register(0x336, 0x97); + sensor_write_register(0x337, 0xB1); + sensor_write_register(0x338, 0x19); + sensor_write_register(0x339, 0x01); + sensor_write_register(0x33A, 0x50); + sensor_write_register(0x33B, 0x00); + sensor_write_register(0x33C, 0x35); + sensor_write_register(0x33D, 0xB0); + sensor_write_register(0x33E, 0x03); + sensor_write_register(0x33F, 0xD1); + sensor_write_register(0x340, 0x71); + sensor_write_register(0x341, 0x1D); + sensor_write_register(0x342, 0x00); + sensor_write_register(0x343, 0x00); + sensor_write_register(0x344, 0x00); + sensor_write_register(0x345, 0x00); + sensor_write_register(0x346, 0x02); + sensor_write_register(0x347, 0x30); + sensor_write_register(0x348, 0x00); + sensor_write_register(0x349, 0x00); + sensor_write_register(0x34A, 0x00); + sensor_write_register(0x34B, 0x03); + sensor_write_register(0x34C, 0x00); + sensor_write_register(0x34D, 0x02); + sensor_write_register(0x34E, 0x10); + sensor_write_register(0x34F, 0xA0); + sensor_write_register(0x350, 0x00); + sensor_write_register(0x351, 0x07); + sensor_write_register(0x352, 0x40); + sensor_write_register(0x353, 0x80); + sensor_write_register(0x354, 0x00); + sensor_write_register(0x355, 0x02); + sensor_write_register(0x356, 0x50); + sensor_write_register(0x357, 0x02); + sensor_write_register(0x358, 0x23); + sensor_write_register(0x359, 0xE4); + sensor_write_register(0x35A, 0x45); + sensor_write_register(0x35B, 0x33); + sensor_write_register(0x35C, 0x79); + sensor_write_register(0x35D, 0xD1); + sensor_write_register(0x35E, 0xCC); + sensor_write_register(0x35F, 0x2F); + sensor_write_register(0x360, 0xB6); + sensor_write_register(0x361, 0xA1); + sensor_write_register(0x362, 0x17); + sensor_write_register(0x363, 0xCB); + sensor_write_register(0x364, 0xE8); + sensor_write_register(0x365, 0xC5); + sensor_write_register(0x366, 0x32); + sensor_write_register(0x367, 0xC0); + sensor_write_register(0x368, 0xA8); + sensor_write_register(0x369, 0xC6); + sensor_write_register(0x36A, 0x5E); + sensor_write_register(0x36B, 0x20); + sensor_write_register(0x36C, 0x63); + sensor_write_register(0x36D, 0x0D); + sensor_write_register(0x36E, 0x6D); + sensor_write_register(0x36F, 0x44); + sensor_write_register(0x370, 0xA6); + sensor_write_register(0x371, 0x32); + sensor_write_register(0x372, 0x24); + sensor_write_register(0x373, 0x50); + sensor_write_register(0x374, 0xC4); + sensor_write_register(0x375, 0x2F); + sensor_write_register(0x376, 0xF4); + sensor_write_register(0x377, 0x42); + sensor_write_register(0x378, 0x82); + sensor_write_register(0x379, 0x13); + sensor_write_register(0x37A, 0x90); + sensor_write_register(0x37B, 0x00); + sensor_write_register(0x37C, 0x10); + sensor_write_register(0x37D, 0x8A); + sensor_write_register(0x37E, 0x60); + sensor_write_register(0x37F, 0xC4); + sensor_write_register(0x380, 0x2F); + sensor_write_register(0x381, 0x84); + sensor_write_register(0x382, 0xF1); + sensor_write_register(0x383, 0x0B); + sensor_write_register(0x384, 0xCD); + sensor_write_register(0x385, 0x70); + sensor_write_register(0x386, 0x42); + sensor_write_register(0x387, 0x16); + sensor_write_register(0x388, 0x00); + sensor_write_register(0x389, 0x61); + sensor_write_register(0x38A, 0x0B); + sensor_write_register(0x38B, 0x29); + sensor_write_register(0x38C, 0x74); + sensor_write_register(0x38D, 0x81); + sensor_write_register(0x38E, 0x10); + sensor_write_register(0x38F, 0xBA); + sensor_write_register(0x390, 0x18); + sensor_write_register(0x391, 0x22); + sensor_write_register(0x392, 0x11); + sensor_write_register(0x393, 0xE9); + sensor_write_register(0x394, 0x60); + sensor_write_register(0x395, 0x07); + sensor_write_register(0x396, 0x09); + sensor_write_register(0x397, 0xF6); + sensor_write_register(0x398, 0x40); + sensor_write_register(0x399, 0x02); + sensor_write_register(0x39A, 0x3C); + sensor_write_register(0x39B, 0x00); + sensor_write_register(0x39C, 0x00); + sensor_write_register(0x39D, 0x00); + sensor_write_register(0x39E, 0x00); + sensor_write_register(0x39F, 0x00); + sensor_write_register(0x3A0, 0x80); + sensor_write_register(0x3A1, 0x0B); + sensor_write_register(0x3A2, 0x64); + sensor_write_register(0x3A3, 0x90); + sensor_write_register(0x3A4, 0x8D); + sensor_write_register(0x3A5, 0x6E); + sensor_write_register(0x3A6, 0x98); + sensor_write_register(0x3A7, 0x40); + sensor_write_register(0x3A8, 0x05); + sensor_write_register(0x3A9, 0xD1); + sensor_write_register(0x3AA, 0xA8); + sensor_write_register(0x3AB, 0x86); + sensor_write_register(0x3AC, 0x09); + sensor_write_register(0x3AD, 0x54); + sensor_write_register(0x3AE, 0x10); + sensor_write_register(0x3AF, 0x8D); + sensor_write_register(0x3B0, 0x6A); + sensor_write_register(0x3B1, 0xE8); + sensor_write_register(0x3B2, 0x82); + sensor_write_register(0x3B3, 0x17); + sensor_write_register(0x3B4, 0x1C); + sensor_write_register(0x3B5, 0x60); + sensor_write_register(0x3B6, 0xC1); + sensor_write_register(0x3B7, 0x31); + sensor_write_register(0x3B8, 0xAE); + sensor_write_register(0x3B9, 0xD1); + sensor_write_register(0x3BA, 0x81); + sensor_write_register(0x3BB, 0x16); + sensor_write_register(0x3BC, 0x20); + sensor_write_register(0x3BD, 0x03); + sensor_write_register(0x3BE, 0x1B); + sensor_write_register(0x3BF, 0x24); + sensor_write_register(0x3C0, 0xE0); + sensor_write_register(0x3C1, 0xC1); + sensor_write_register(0x3C2, 0x33); + sensor_write_register(0x3C3, 0xBE); + sensor_write_register(0x3C4, 0x51); + sensor_write_register(0x3C5, 0x82); + sensor_write_register(0x3C6, 0x1E); + sensor_write_register(0x3C7, 0x40); + sensor_write_register(0x3C8, 0x03); + sensor_write_register(0x3C9, 0x1C); + sensor_write_register(0x3CA, 0x34); + sensor_write_register(0x3CB, 0xD0); + sensor_write_register(0x3CC, 0x81); + sensor_write_register(0x3CD, 0x02); + sensor_write_register(0x3CE, 0x16); + sensor_write_register(0x3CF, 0x00); + sensor_write_register(0x3D0, 0x02); + sensor_write_register(0x3D1, 0x04); + sensor_write_register(0x3D2, 0x00); + sensor_write_register(0x3D3, 0x00); + sensor_write_register(0x3D4, 0x00); + sensor_write_register(0x3D5, 0x80); + sensor_write_register(0x3D6, 0x00); + sensor_write_register(0x3D7, 0x00); + sensor_write_register(0x3D8, 0x23); + sensor_write_register(0x3D9, 0x01); + sensor_write_register(0x3DA, 0x03); + sensor_write_register(0x3DB, 0x02); + sensor_write_register(0x3DC, 0x00); + sensor_write_register(0x3DD, 0x00); + sensor_write_register(0x3DE, 0x00); + sensor_write_register(0x3DF, 0x00); + sensor_write_register(0x3E0, 0x22); + sensor_write_register(0x3E1, 0x00); + sensor_write_register(0x3E2, 0x00); + sensor_write_register(0x3E3, 0x00); + sensor_write_register(0x3E4, 0x3F); + sensor_write_register(0x3E5, 0x17); + sensor_write_register(0x3E6, 0x15); + sensor_write_register(0x3E7, 0x00); + sensor_write_register(0x3E8, 0x00); + sensor_write_register(0x3E9, 0x00); + sensor_write_register(0x3EA, 0x00); + sensor_write_register(0x3EB, 0x00); + sensor_write_register(0x3EC, 0x00); + sensor_write_register(0x3ED, 0x00); + sensor_write_register(0x3EE, 0x00); + sensor_write_register(0x3EF, 0x00); + sensor_write_register(0x3F0, 0x00); + sensor_write_register(0x3F1, 0x00); + sensor_write_register(0x3F2, 0x00); + sensor_write_register(0x3F3, 0x00); + sensor_write_register(0x3F4, 0x00); + sensor_write_register(0x3F5, 0x00); + sensor_write_register(0x3F6, 0x00); + sensor_write_register(0x3F7, 0x00); + sensor_write_register(0x3F8, 0x00); + sensor_write_register(0x3F9, 0x00); + sensor_write_register(0x3FA, 0x00); + sensor_write_register(0x3FB, 0x00); + sensor_write_register(0x3FC, 0x00); + sensor_write_register(0x3FD, 0x00); + sensor_write_register(0x3FE, 0x00); + sensor_write_register(0x3FF, 0x00); + + // standby cancel + sensor_write_register(0x200, 0x30); + // XVS,XHS output start + //sensor_write_register(0x229, 0xC0); + + // waiting for image stabilization + usleep(200000); + + printf("-------Sony IMX122 Sensor Initial OK!-------\n"); +} diff --git a/device/mpp/extdrv/Makefile b/device/mpp/extdrv/Makefile new file mode 100644 index 0000000..7e70c77 --- /dev/null +++ b/device/mpp/extdrv/Makefile @@ -0,0 +1,27 @@ +# $(ROOT)/mpp/Mafile + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../Makefile.param + include $(PARAM_FILE) +endif + +EXTDRV_KO=$(REL_KO)/extdrv + +.PHONY:clean all rel +all: + @echo -e "\e[0;32;1m--Compiling 'extdrv'... Configs as follow:\e[0;36;1m" + @echo ---- CROSS=$(CROSS) + @echo ---- HIARCH=$(HIARCH), HICHIP=$(HICHIP), CVER=$(CVER), HIDBG=$(HIDBG) + @echo ---- SDK_PATH=$(SDK_PATH) , PARAM_FILE=$(PARAM_FILE) + @echo ---- LINUX_ROOT=$(LINUX_ROOT) + @echo -e "\e[0m" + @mkdir -p $(EXTDRV_KO) + @for x in `find ./ -maxdepth 2 -mindepth 2 -name "Makefile" `; do\ + { cd `dirname $$x`; if [ $$? ]; then make || exit 1; cp *.ko $(EXTDRV_KO); cd ../; fi;}& done; wait + +clean: + @for x in `find ./ -maxdepth 2 -mindepth 2 -name "Makefile" `; do\ + { cd `dirname $$x`; if [ $$? ]; then make clean; cd ../; fi;}& done; wait + @if [ -e $(EXTDRV_KO) ];then rm $(EXTDRV_KO) -fr; fi + @if [ -e $(REL_KO) ];then rmdir --ignore-fail-on-non-empty "$(REL_KO)"; fi + diff --git a/device/mpp/extdrv/adv7179/.adv7179.o.cmd b/device/mpp/extdrv/adv7179/.adv7179.o.cmd new file mode 100644 index 0000000..1b53329 --- /dev/null +++ b/device/mpp/extdrv/adv7179/.adv7179.o.cmd @@ -0,0 +1,568 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/.adv7179.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -DHI_I2C -I/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/../hi_i2c -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DHI_XXXX -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(adv7179)" -D"KBUILD_MODNAME=KBUILD_STR(adv_7179)" -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.o := \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/failslab.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/debug/slab.h) \ + $(wildcard include/config/slab.h) \ + $(wildcard include/config/tracing.h) \ + include/linux/gfp.h \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/sparsemem.h) \ + $(wildcard include/config/compaction.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/typecheck.h \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + include/linux/const.h \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + include/linux/sysinfo.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/seqlock.h \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/math64.h \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/kmemleak.h \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/module.h \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/kmod.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/miscdevice.h \ + include/linux/major.h \ + include/linux/pm.h \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/pm/runtime.h) \ + $(wildcard include/config/pm/clk.h) \ + $(wildcard include/config/pm/generic/domains.h) \ + include/linux/fcntl.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/delay.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/delay.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/fs.h) \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/ima.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/ioctl.h \ + arch/arm/include/generated/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/linux/blk_types.h \ + $(wildcard include/config/blk/dev/integrity.h) \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/bit_spinlock.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/prio_tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/fiemap.h \ + include/linux/shrinker.h \ + include/linux/migrate_mode.h \ + include/linux/quota.h \ + $(wildcard include/config/quota/netlink/interface.h) \ + include/linux/percpu_counter.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/err.h \ + include/linux/magic.h \ + include/linux/poll.h \ + arch/arm/include/generated/asm/poll.h \ + include/asm-generic/poll.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/uaccess.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/unified.h \ + $(wildcard include/config/arm/asm/unified.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irq.h \ + $(wildcard include/config/sparse/irq.h) \ + arch/arm/mach-hi3518ev200/include/mach/irqs.h \ + include/linux/ioport.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/hardirqs.h) \ + $(wildcard include/config/irq/forced/threading.h) \ + $(wildcard include/config/generic/irq/probe.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + $(wildcard include/config/irq/time/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hardirq.h \ + include/linux/irq_cpustat.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + $(wildcard include/config/timerfd.h) \ + include/linux/timerqueue.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/io.h \ + $(wildcard include/config/need/mach/io/h.h) \ + $(wildcard include/config/pcmcia/soc/common.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/isa.h) \ + $(wildcard include/config/pccard.h) \ + include/asm-generic/pci_iomap.h \ + $(wildcard include/config/no/generic/pci/ioport/map.h) \ + $(wildcard include/config/generic/pci/iomap.h) \ + arch/arm/mach-hi3518ev200/include/mach/io.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/exec.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/switch_to.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_info.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_misc.h \ + include/linux/i2c.h \ + $(wildcard include/config/i2c.h) \ + $(wildcard include/config/i2c/boardinfo.h) \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + $(wildcard include/config/sysfs/deprecated.h) \ + include/linux/klist.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/device.h \ + $(wildcard include/config/dmabounce.h) \ + $(wildcard include/config/iommu/api.h) \ + $(wildcard include/config/arch/omap.h) \ + include/linux/pm_wakeup.h \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/no/hz.h) \ + $(wildcard include/config/lockup/detector.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/sched/autogroup.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/fanotify.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/cgroup/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/rcu/boost.h) \ + $(wildcard include/config/compat/brk.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/cfs/bandwidth.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/debug/stack/usage.h) \ + $(wildcard include/config/mm/owner.h) \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/have/cmpxchg/double.h) \ + $(wildcard include/config/have/aligned/struct/page.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mmu/notifier.h) \ + $(wildcard include/config/transparent/hugepage.h) \ + include/linux/auxvec.h \ + arch/arm/include/generated/asm/auxvec.h \ + include/asm-generic/auxvec.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/guard.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/mmu.h \ + $(wildcard include/config/cpu/has/asid.h) \ + arch/arm/include/generated/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/sembuf.h \ + include/linux/signal.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/sigcontext.h \ + arch/arm/include/generated/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + arch/arm/include/generated/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + $(wildcard include/config/user/ns.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/llist.h \ + $(wildcard include/config/arch/have/nmi/safe/cmpxchg.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/linux/uio.h \ + include/linux/of.h \ + $(wildcard include/config/sparc.h) \ + $(wildcard include/config/of/dynamic.h) \ + $(wildcard include/config/of.h) \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.o): diff --git a/device/mpp/extdrv/adv7179/.adv_7179.ko.cmd b/device/mpp/extdrv/adv7179/.adv_7179.ko.cmd new file mode 100644 index 0000000..6905f4d --- /dev/null +++ b/device/mpp/extdrv/adv7179/.adv_7179.ko.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.ko := arm-hisiv300-linux-ld -EL -r -T /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/scripts/module-common.lds --build-id -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.ko /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.o diff --git a/device/mpp/extdrv/adv7179/.adv_7179.mod.o.cmd b/device/mpp/extdrv/adv7179/.adv_7179.mod.o.cmd new file mode 100644 index 0000000..d6494a6 --- /dev/null +++ b/device/mpp/extdrv/adv7179/.adv_7179.mod.o.cmd @@ -0,0 +1,345 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/.adv_7179.mod.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -DHI_I2C -I/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/../hi_i2c -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DHI_XXXX -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(adv_7179.mod)" -D"KBUILD_MODNAME=KBUILD_STR(adv_7179)" -DMODULE -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.o := \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/vermagic.h \ + include/generated/utsrelease.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.mod.o): diff --git a/device/mpp/extdrv/adv7179/.adv_7179.o.cmd b/device/mpp/extdrv/adv7179/.adv_7179.o.cmd new file mode 100644 index 0000000..09db77f --- /dev/null +++ b/device/mpp/extdrv/adv7179/.adv_7179.o.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.o := arm-hisiv300-linux-ld -EL -r -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.o diff --git a/device/mpp/extdrv/adv7179/.tmp_versions/adv_7179.mod b/device/mpp/extdrv/adv7179/.tmp_versions/adv_7179.mod new file mode 100644 index 0000000..6db0513 --- /dev/null +++ b/device/mpp/extdrv/adv7179/.tmp_versions/adv_7179.mod @@ -0,0 +1,2 @@ +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.ko +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv7179.o diff --git a/device/mpp/extdrv/adv7179/Makefile b/device/mpp/extdrv/adv7179/Makefile new file mode 100644 index 0000000..7fcc212 --- /dev/null +++ b/device/mpp/extdrv/adv7179/Makefile @@ -0,0 +1,28 @@ +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +ifeq ($(CONFIG_GPIO_I2C),y) + EXTRA_CFLAGS += -DHI_GPIO_I2C + EXTRA_CFLAGS+=-I$(PWD)/../gpio-i2c +else + EXTRA_CFLAGS += -DHI_I2C + EXTRA_CFLAGS+=-I$(PWD)/../hi_i2c +endif + +EXTRA_CFLAGS += -I$(REL_INC) +EXTRA_CFLAGS += $(DRV_CFLAGS) +EXTRA_CFLAGS += -D$(HI_FPGA) + +obj-m := adv_7179.o +adv_7179-y += adv7179.o + +default: + echo $(LINUX_ROOT) + make -C $(LINUX_ROOT) M=$(PWD) modules + +clean: +# make -C $(LINUX_ROOT) M=$(PWD) clean + @make -C $(LINUX_ROOT) M=$(PWD) clean + diff --git a/device/mpp/extdrv/adv7179/Module.symvers b/device/mpp/extdrv/adv7179/Module.symvers new file mode 100644 index 0000000..e69de29 diff --git a/device/mpp/extdrv/adv7179/README.txt b/device/mpp/extdrv/adv7179/README.txt new file mode 100644 index 0000000..2b418ea --- /dev/null +++ b/device/mpp/extdrv/adv7179/README.txt @@ -0,0 +1,6 @@ +1.Module parameter description + +BT656 PAL:insmod adv_7179.ko norm_mode=0 +BT656 NTSC:insmod adv_7179.ko norm_mode=1 + +BT656 PAL is defualt diff --git a/device/mpp/extdrv/adv7179/adv7179.c b/device/mpp/extdrv/adv7179/adv7179.c new file mode 100644 index 0000000..ac10534 --- /dev/null +++ b/device/mpp/extdrv/adv7179/adv7179.c @@ -0,0 +1,612 @@ +/* extdrv/peripheral/vda/adv7179.c + * + * + * Copyright (c) 2006 Hisilicon Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. + * + * + * History: + * 17-Apr-2006 create this file + * + */ + +#include +#include +#include +// BEGIN: Modified by x00132463, 2010-8-20 15 : 57 : 28 +//#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//#include +#include +#include +#include + +#include +#include +#include +//#include +//#include +#include "adv7179.h" + +#include +#include +#include + +#include + +//#define HI_GPIO_I2C +//#ifdef HI_GPIO_I2C +//#include "gpio_i2c.h" +//#else +//#include "hi_i2c.h" +//#endif + +//#ifdef HI_GPIO_I2C +//#define hi_i2c_write(chip_addr,reg_addr,value) gpio_i2c_write(chip_addr,reg_addr,value) +//#define hi_i2c_read(chip_addr,reg_addr) gpio_i2c_read(chip_addr,reg_addr) +//#else +//#define hi_i2c_write(chip_addr,reg_addr,value) HI_I2C_Write(chip_addr,reg_addr,1,value,1) +//#define hi_i2c_read(chip_addr,reg_addr) HI_I2C_Read(chip_addr,reg_addr,1,1) +//#endif +#define I2C_ADV7179 0x56 +static struct i2c_client* sil_client; +static struct i2c_board_info sil_i2c_info = +{ + I2C_BOARD_INFO("sil9034", I2C_ADV7179), +}; + +unsigned char _hi_i2c_read_byte(unsigned char devaddress, unsigned char address) +{ + unsigned char ret_data = 0xFF; + int ret; + struct i2c_client* client = sil_client; + unsigned char buf[2]; + + buf[0] = address; + ret = i2c_master_recv(client, buf, 1); + if (ret >= 0) + { + ret_data = buf[0]; + } + return ret_data; +} + +int _hi_i2c_write_byte(unsigned char devaddress, unsigned char address, unsigned char data) +{ + int ret; + unsigned char buf[2]; + struct i2c_client* client = sil_client; + + buf[0] = address; + buf[1] = data; + + ret = i2c_master_send(client, buf, 2); + return ret; +} +static int i2c_client_init(void) +{ + struct i2c_adapter* i2c_adap; + + // use i2c1 + i2c_adap = i2c_get_adapter(1); + sil_client = i2c_new_device(i2c_adap, &sil_i2c_info); + + i2c_put_adapter(i2c_adap); + + return 0; +} + +static void i2c_client_exit(void) +{ + i2c_unregister_device(sil_client); +} + +#define I2CReadByte _hi_i2c_read_byte +#define I2CWriteByte _hi_i2c_write_byte + +/* adv7179 i2c slaver address micro-definition. */ + +#define ADV7179_NUM 1 +#define ADV7179_REG_WIDTH 1 +#define ADV7179_DAT_WIDTH 1 + +#define adv7179_NUM_REGISTERS 128 + + + +/* Output filter: S-Video Composite */ + +#define MR050 0x11 +#define MR060 0x14 + + +#define TR0MODE_656 0x08 +#define TR0MODE_601 0x0c + + +#define TR0RST 0x80 + +#define TR1CAPT 0x00 +#define TR1PLAY 0x00 + +static int norm_mode = VIDEO_NORM_PAL; + + +static const unsigned char init_656_NTSC[] = +{ + 0x00, 0x00, /* MR0 */ + 0x01, 0x00, /* MR1 */ + 0x02, 0x00, /* MR2 RTC control: bits 2 and 1 */ + 0x03, 0x00, /* MR3 */ + 0x04, 0x15, /* MR4 */ + 0x05, 0x00, /* Reserved */ + 0x06, 0x00, /* Reserved */ + 0x07, TR0MODE_656, /* TM0 */ + 0x08, TR1CAPT, /* TM1 */ + 0x09, 0x16, /* Fsc0 */ + 0x0a, 0x7c, /* Fsc1 */ + 0x0b, 0xf0, /* Fsc2 */ + 0x0c, 0x21, /* Fsc3 */ + 0x0d, 0x00, /* Subcarrier Phase */ + 0x0e, 0x00, /* Closed Capt. Ext 0 */ + 0x0f, 0x00, /* Closed Capt. Ext 1 */ + 0x10, 0x00, /* Closed Capt. 0 */ + 0x11, 0x00, /* Closed Capt. 1 */ + 0x12, 0x00, /* Pedestal Ctl 0 */ + 0x13, 0x00, /* Pedestal Ctl 1 */ + 0x14, 0x00, /* Pedestal Ctl 2 */ + 0x15, 0x00, /* Pedestal Ctl 3 */ + 0x16, 0x00, /* CGMS_WSS_0 */ + 0x17, 0x00, /* CGMS_WSS_1 */ + 0x18, 0x00, /* CGMS_WSS_2 */ + 0x19, 0x00, /* Teletext Ctl */ +}; + + +static const unsigned char init_656_PAL[] = +{ + 0x00, 0x05, /* MR0, PAL BDGHI */ + 0x01, 0x00, /* MR1 */ + 0x02, 0x00, /* MR2 RTC control: bits 2 and 1 */ + 0x03, 0x00, /* MR3 */ + 0x04, 0x15, /* MR4, RGB OUTPUT */ + 0x05, 0x00, /* Reserved */ + 0x06, 0x00, /* Reserved */ + 0x07, TR0MODE_656, /* TM0 */ + 0x08, TR1CAPT, /* TM1 */ + 0x09, 0xcb, /* Fsc0 */ + 0x0a, 0x8a, /* Fsc1 */ + 0x0b, 0x09, /* Fsc2 */ + 0x0c, 0x2a, /* Fsc3 */ + 0x0d, 0x00, /* Subcarrier Phase */ + 0x0e, 0x00, /* Closed Capt. Ext 0 */ + 0x0f, 0x00, /* Closed Capt. Ext 1 */ + 0x10, 0x00, /* Closed Capt. 0 */ + 0x11, 0x00, /* Closed Capt. 1 */ + 0x12, 0x00, /* Pedestal Ctl 0 */ + 0x13, 0x00, /* Pedestal Ctl 1 */ + 0x14, 0x00, /* Pedestal Ctl 2 */ + 0x15, 0x00, /* Pedestal Ctl 3 */ + 0x16, 0x00, /* CGMS_WSS_0 */ + 0x17, 0x00, /* CGMS_WSS_1 */ + 0x18, 0x00, /* CGMS_WSS_2 */ + 0x19, 0x00, /* Teletext Ctl */ +}; + + + + +static unsigned char init_601_NTSC[] = +{ + 0x00, 0x00, /* MR0 */ + 0x01, 0x00, /* MR1 */ + 0x02, 0x08, /* MR2 RTC control: bits 2 and 1 */ + 0x03, 0x04, /* MR3 */ + 0x04, 0x0C, /* MR4 */ + 0x05, 0x00, /* Reserved */ + 0x06, 0x00, /* Reserved */ + 0x07, TR0MODE_601, /* TM0 */ + 0x08, TR1CAPT, /* TM1 */ + 0x09, 0x16, /* Fsc0 */ + 0x0a, 0x7c, /* Fsc1 */ + 0x0b, 0xf0, /* Fsc2 */ + 0x0c, 0x21, /* Fsc3 */ + 0x0d, 0x00, /* Subcarrier Phase */ + 0x0e, 0x00, /* Closed Capt. Ext 0 */ + 0x0f, 0x00, /* Closed Capt. Ext 1 */ + 0x10, 0x00, /* Closed Capt. 0 */ + 0x11, 0x00, /* Closed Capt. 1 */ + 0x12, 0x00, /* Pedestal Ctl 0 */ + 0x13, 0x00, /* Pedestal Ctl 1 */ + 0x14, 0x00, /* Pedestal Ctl 2 */ + 0x15, 0x00, /* Pedestal Ctl 3 */ + 0x16, 0x00, /* CGMS_WSS_0 */ + 0x17, 0x00, /* CGMS_WSS_1 */ + 0x18, 0x00, /* CGMS_WSS_2 */ + 0x19, 0x00, /* Teletext Ctl */ +}; + + + +static unsigned char init_601_PAL[] = +{ + 0x00, 0x05, /* MR0, PAL BDGHI */ + 0x01, 0x00, /* MR1 */ + 0x02, 0x08, /* MR2 RTC control: bits 2 and 1 */ + 0x03, 0x04, /* MR3 */ + 0x04, 0x1C, /* MR4, RGB OUTPUT */ + 0x05, 0x00, /* Reserved */ + 0x06, 0x00, /* Reserved */ + 0x07, TR0MODE_601, /* TM0 */ + 0x08, TR1CAPT, /* TM1 */ + 0x09, 0xcb, /* Fsc0 */ + 0x0a, 0x8a, /* Fsc1 */ + 0x0b, 0x09, /* Fsc2 */ + 0x0c, 0x2a, /* Fsc3 */ + 0x0d, 0x00, /* Subcarrier Phase */ + 0x0e, 0x00, /* Closed Capt. Ext 0 */ + 0x0f, 0x00, /* Closed Capt. Ext 1 */ + 0x10, 0x00, /* Closed Capt. 0 */ + 0x11, 0x00, /* Closed Capt. 1 */ + 0x12, 0x00, /* Pedestal Ctl 0 */ + 0x13, 0x00, /* Pedestal Ctl 1 */ + 0x14, 0x00, /* Pedestal Ctl 2 */ + 0x15, 0x00, /* Pedestal Ctl 3 */ + 0x16, 0x00, /* CGMS_WSS_0 */ + 0x17, 0x00, /* CGMS_WSS_1 */ + 0x18, 0x00, /* CGMS_WSS_2 */ + 0x19, 0x00, /* Teletext Ctl */ +}; + + + + +static int write_regs(unsigned char* pdevdata, unsigned long datalen) +{ + int i = 0; + + while (i < datalen) + { + I2CWriteByte(I2C_ADV7179, pdevdata[i], pdevdata[i + 1]); + i += 2; + } + return 0; +} + + +/* + * adv7179 initialise routine. + * + * @param vdaccir: adv7179's working mode:0--VIDEO_MODE_CCIR656; 1--VIDEO_MODE_CCIR601 + * @param vdanorm: adv7179's norm mode; + * @param vdamaster: adv7179's slave or master mode; + * + * @return value:0--success; -1--error. + * + */ + +int init_vda(int vdaccir, int vdanorm, int vdamaster) +{ + + if ((vdaccir == VIDEO_MODE_CCIR656) && (vdanorm == VIDEO_NORM_PAL)) + { + if (write_regs((unsigned char*)&init_656_PAL, sizeof(init_656_PAL)) != 0) + { + goto err_out; + } + } + else if ((vdaccir == VIDEO_MODE_CCIR656) && (vdanorm == VIDEO_NORM_NTSC)) + { + if (write_regs((unsigned char*)&init_656_NTSC, sizeof(init_656_NTSC)) != 0) + { + goto err_out; + } + } + else if ((vdaccir == VIDEO_MODE_CCIR601) && (vdanorm == VIDEO_NORM_PAL)) + { + if (vdamaster == VIDEO_MODE_MASTER) + { + init_601_PAL[15] |= VIDEO_MODE_MASTER; + } + else if (vdamaster == VIDEO_MODE_SLAVER) + { + init_601_PAL[15] &= ~VIDEO_MODE_MASTER; + } + + if (write_regs((unsigned char*)&init_601_PAL, sizeof(init_601_PAL)) != 0) + { + goto err_out; + } + } + else if ((vdaccir == VIDEO_MODE_CCIR601) && (vdanorm == VIDEO_NORM_NTSC)) + { + if (vdamaster == VIDEO_MODE_MASTER) + { + init_601_NTSC[15] |= VIDEO_MODE_MASTER; + } + if (vdamaster == VIDEO_MODE_SLAVER) + { + init_601_NTSC[15] &= ~VIDEO_MODE_MASTER; + } + + if (write_regs((unsigned char*)&init_601_NTSC, sizeof(init_601_NTSC)) != 0) + { + goto err_out; + } + } + + if (vdaccir == VIDEO_MODE_CCIR656) + { + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_656 | TR0RST)); + I2CWriteByte(I2C_ADV7179, 0x07, TR0MODE_656); + } + else if (vdaccir == VIDEO_MODE_CCIR601) + { + if (vdamaster == VIDEO_MODE_MASTER) + { + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_601 | TR0RST | VIDEO_MODE_MASTER)); + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_601 | VIDEO_MODE_MASTER)); + } + else + { + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_601 | TR0RST)); + I2CWriteByte(I2C_ADV7179, 0x07, TR0MODE_601); + } + } + + return (0); + +err_out: + printk("err_out\n"); + return -1; +} + +/* + * adv7179 open routine. + * do nothing. + * + */ +int adv7179_open(struct inode* inode, struct file* file) +{ + + return 0; +} + +/* + * adv7179 close routine. + * do nothing. + * + */ +int adv7179_close(struct inode* inode, struct file* file) +{ + + return 0; +} + +/* + * adv7179 ioctl routine. + * @param inode: pointer of the node; + * @param file: pointer of the file; + * + * @param cmd: command from the app: + * ENCODER_SET_NORM(2):set adv7179's work mode. + * + * @param arg:arg from app layer. + * + * @return value:0-- set success; -1-- set error. + * + */ +static long adv7179_ioctl(struct file* file, unsigned int cmd, unsigned long arg) +{ + + switch (cmd) + { + + case ENCODER_SET_NORM: + { + int iarg = (int) arg; + + + switch (iarg) + { + case VIDEO_MODE_656_PAL: + write_regs((unsigned char*)&init_656_PAL, sizeof(init_656_PAL)); + + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_656 | TR0RST)); + I2CWriteByte(I2C_ADV7179, 0x07, TR0MODE_656); + break; + + case VIDEO_MODE_656_NTSC: + write_regs((unsigned char*)&init_656_NTSC, sizeof(init_656_NTSC)); + + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_656 | TR0RST)); + I2CWriteByte(I2C_ADV7179, 0x07, TR0MODE_656); + break; + + case VIDEO_MODE_601_PAL_MASTER: + init_601_PAL[15] |= VIDEO_MODE_MASTER; + write_regs((unsigned char*)&init_601_PAL, sizeof(init_601_PAL)); + + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_601 | TR0RST | VIDEO_MODE_MASTER)); + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_601 | VIDEO_MODE_MASTER)); + break; + + + case VIDEO_MODE_601_NTSC_MASTER: + init_601_NTSC[15] |= VIDEO_MODE_MASTER; + write_regs((unsigned char*)&init_601_NTSC, sizeof(init_601_NTSC)); + + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_601 | TR0RST | VIDEO_MODE_MASTER)); + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_601 | VIDEO_MODE_MASTER)); + break; + + case VIDEO_MODE_601_PAL_SLAVER: + init_601_PAL[15] &= ~VIDEO_MODE_MASTER; + write_regs((unsigned char*)&init_601_PAL, sizeof(init_601_PAL)); + + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_601 | TR0RST)); + I2CWriteByte(I2C_ADV7179, 0x07, TR0MODE_601); + break; + + case VIDEO_MODE_601_NTSC_SLAVER: + init_601_NTSC[15] &= ~VIDEO_MODE_MASTER; + write_regs((unsigned char*)&init_601_NTSC, sizeof(init_601_NTSC)); + + I2CWriteByte(I2C_ADV7179, 0x07, (TR0MODE_601 | TR0RST)); + I2CWriteByte(I2C_ADV7179, 0x07, TR0MODE_601); + break; + + default: + return -1; + + } + + } + break; + + default: + return -1; + } + + return 0; +} + +/* + * The various file operations we support. + */ + +static struct file_operations adv7179_fops = +{ + .owner = THIS_MODULE, + .unlocked_ioctl = adv7179_ioctl, + .open = adv7179_open , + .release = adv7179_close +}; + +static struct miscdevice adv7179_dev = +{ + MISC_DYNAMIC_MINOR, + "adv7179", + &adv7179_fops, +}; + +static int adv7179_device_init(void) +{ + unsigned char regvalue1, regvalue2; + regvalue1 = I2CReadByte(I2C_ADV7179, 0x07); + I2CWriteByte(I2C_ADV7179, 0x07, 0xa5); + regvalue2 = I2CReadByte(I2C_ADV7179, 0x07); + if (regvalue2 != 0xa5) + { + printk("read adv7179 register is %x\n", regvalue2); + printk("check adv7179 error.\n"); + return -EFAULT; + } + I2CWriteByte(I2C_ADV7179, 0x07, regvalue1); + if (norm_mode == VIDEO_NORM_NTSC) + { + if (init_vda(VIDEO_MODE_CCIR656, VIDEO_NORM_NTSC, VIDEO_MODE_MASTER) == 0) + { + return 0; + } + else + { + return -EFAULT; + } + } + else + { + if (init_vda(VIDEO_MODE_CCIR656, VIDEO_NORM_PAL, VIDEO_MODE_MASTER) == 0) + { + return 0; + } + else + { + return -EFAULT; + } + } + +} + +//DECLARE_KCOM_GPIO_I2C(); +static int __init adv7179_init(void) +{ + int ret = 0; + +#if 0 + ret = KCOM_GPIO_I2C_INIT(); + if (ret) + { + printk("GPIO I2C module is not load.\n"); + return -1; + } +#endif + + i2c_client_init(); + + ret = misc_register(&adv7179_dev); + if (ret) + { + //KCOM_GPIO_I2C_EXIT(); + printk("could not register adv7179 devices. \n"); + return -1; + } + if (adv7179_device_init() < 0) + { + misc_deregister(&adv7179_dev); + //KCOM_GPIO_I2C_EXIT(); + printk("adv7179 driver init fail for device init error!\n"); + return -1; + } + + printk("adv7179 driver init successful!\n"); + return ret; +} + +static void __exit adv7179_exit(void) +{ + i2c_client_exit(); + misc_deregister(&adv7179_dev); + //KCOM_GPIO_I2C_EXIT(); + +} + +module_init(adv7179_init); +module_exit(adv7179_exit); + +#ifdef MODULE +//#include +#endif + +module_param(norm_mode, int, S_IRUGO); + +//MODULE_INFO(build, UTS_VERSION); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("hisilicon"); + + diff --git a/device/mpp/extdrv/adv7179/adv7179.h b/device/mpp/extdrv/adv7179/adv7179.h new file mode 100644 index 0000000..7ab4483 --- /dev/null +++ b/device/mpp/extdrv/adv7179/adv7179.h @@ -0,0 +1,42 @@ +/* extdrv/include/adv7179.h for Linux . +* +* +* This file defines ov9653 micro-definitions for user. +* +* History: +* 03-Apr-2006 Start of Hi3510 Digital Camera GPIO control support +* +*/ + +#ifndef _ADV7179_H +#define _ADV7179_H + + +#define ENCODER_SET_NORM 0x02 + + + + +#define VIDEO_MODE_656_PAL 0 +#define VIDEO_MODE_656_NTSC 1 +#define VIDEO_MODE_601_PAL_MASTER 2 +#define VIDEO_MODE_601_NTSC_MASTER 3 +#define VIDEO_MODE_601_PAL_SLAVER 4 +#define VIDEO_MODE_601_NTSC_SLAVER 5 + +#define VIDEO_MODE_CCIR656 0 +#define VIDEO_MODE_CCIR601 1 +#define VIDEO_MODE_LCD 2 + +#define VIDEO_NORM_PAL 0 +#define VIDEO_NORM_NTSC 1 +#define VIDEO_NORM_SUPPORT 2 +#define VIDEO_MODE_SECAM 2 +#define VIDEO_MODE_AUTO 3 + +#define VIDEO_MODE_MASTER 1 +#define VIDEO_MODE_SLAVER 0 + + +#endif + diff --git a/device/mpp/extdrv/adv7179/adv_7179.ko b/device/mpp/extdrv/adv7179/adv_7179.ko new file mode 100644 index 0000000..e1b1680 Binary files /dev/null and b/device/mpp/extdrv/adv7179/adv_7179.ko differ diff --git a/device/mpp/extdrv/adv7179/adv_7179.mod.c b/device/mpp/extdrv/adv7179/adv_7179.mod.c new file mode 100644 index 0000000..147b9f6 --- /dev/null +++ b/device/mpp/extdrv/adv7179/adv_7179.mod.c @@ -0,0 +1,21 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +static const char __module_depends[] +__used +__attribute__((section(".modinfo"))) = +"depends="; + diff --git a/device/mpp/extdrv/adv7179/config.h b/device/mpp/extdrv/adv7179/config.h new file mode 100644 index 0000000..9d1c14f --- /dev/null +++ b/device/mpp/extdrv/adv7179/config.h @@ -0,0 +1,6 @@ +#ifndef _LINUX_CONFIG_H +#define _LINUX_CONFIG_H + +#include + +#endif diff --git a/device/mpp/extdrv/adv7179/gpio_i2c.h b/device/mpp/extdrv/adv7179/gpio_i2c.h new file mode 100644 index 0000000..1b87e46 --- /dev/null +++ b/device/mpp/extdrv/adv7179/gpio_i2c.h @@ -0,0 +1,14 @@ + +#ifndef _GPIO_I2C_H +#define _GPIO_I2C_H + + +#define GPIO_I2C_READ 0x01 +#define GPIO_I2C_WRITE 0x02 + +unsigned char gpio_i2c_read(unsigned char devaddress, unsigned char address); +void gpio_i2c_write(unsigned char devaddress, unsigned char address, unsigned char value); + + +#endif + diff --git a/device/mpp/extdrv/adv7179/modules.order b/device/mpp/extdrv/adv7179/modules.order new file mode 100644 index 0000000..83b6d5e --- /dev/null +++ b/device/mpp/extdrv/adv7179/modules.order @@ -0,0 +1 @@ +kernel//home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/adv7179/adv_7179.ko diff --git a/device/mpp/extdrv/adv7179/video_def.h b/device/mpp/extdrv/adv7179/video_def.h new file mode 100644 index 0000000..3ddba20 --- /dev/null +++ b/device/mpp/extdrv/adv7179/video_def.h @@ -0,0 +1,26 @@ +/* + * include/video_def.h for Linux . + * + * This file defines video_def micro-definitions for user. + * History: + * 10-April-2006 create this file + */ + + +#ifndef _VIDEO_DEF_H +#define _VIDEO_DEF_H + +#define VIDEO_MODE_CCIR656 0 +#define VIDEO_MODE_CCIR601 1 +#define VIDEO_MODE_LCD 2 + +#define VIDEO_NORM_PAL 0 +#define VIDEO_NORM_NTSC 1 +#define VIDEO_NORM_SUPPORT 2 +#define VIDEO_MODE_SECAM 2 +#define VIDEO_MODE_AUTO 3 + +#define VIDEO_MODE_MASTER 1 +#define VIDEO_MODE_SLAVER 0 + +#endif diff --git a/device/mpp/extdrv/piris/.piris.ko.cmd b/device/mpp/extdrv/piris/.piris.ko.cmd new file mode 100644 index 0000000..fba0fca --- /dev/null +++ b/device/mpp/extdrv/piris/.piris.ko.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.ko := arm-hisiv300-linux-ld -EL -r -T /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/scripts/module-common.lds --build-id -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.ko /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.o diff --git a/device/mpp/extdrv/piris/.piris.mod.o.cmd b/device/mpp/extdrv/piris/.piris.mod.o.cmd new file mode 100644 index 0000000..8473af3 --- /dev/null +++ b/device/mpp/extdrv/piris/.piris.mod.o.cmd @@ -0,0 +1,345 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/.piris.mod.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(piris.mod)" -D"KBUILD_MODNAME=KBUILD_STR(piris)" -DMODULE -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.o := \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/vermagic.h \ + include/generated/utsrelease.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.mod.o): diff --git a/device/mpp/extdrv/piris/.piris.o.cmd b/device/mpp/extdrv/piris/.piris.o.cmd new file mode 100644 index 0000000..c6f36ae --- /dev/null +++ b/device/mpp/extdrv/piris/.piris.o.cmd @@ -0,0 +1,440 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/.piris.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(piris)" -D"KBUILD_MODNAME=KBUILD_STR(piris)" -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.o := \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/miscdevice.h \ + include/linux/major.h \ + include/linux/pm.h \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/pm/runtime.h) \ + $(wildcard include/config/pm/clk.h) \ + $(wildcard include/config/pm/generic/domains.h) \ + include/linux/fcntl.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/delay.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/delay.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/fs.h) \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/failslab.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + $(wildcard include/config/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + include/linux/kmemleak.h \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/fs.h \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/ima.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/ioctl.h \ + arch/arm/include/generated/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/linux/blk_types.h \ + $(wildcard include/config/blk/dev/integrity.h) \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/bit_spinlock.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/prio_tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/fiemap.h \ + include/linux/shrinker.h \ + include/linux/migrate_mode.h \ + include/linux/quota.h \ + $(wildcard include/config/quota/netlink/interface.h) \ + include/linux/percpu_counter.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/err.h \ + include/linux/magic.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + $(wildcard include/config/timerfd.h) \ + include/linux/timerqueue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/uaccess.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/unified.h \ + $(wildcard include/config/arm/asm/unified.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/exec.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/switch_to.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_info.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_misc.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/io.h \ + $(wildcard include/config/need/mach/io/h.h) \ + $(wildcard include/config/pcmcia/soc/common.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/isa.h) \ + $(wildcard include/config/pccard.h) \ + include/asm-generic/pci_iomap.h \ + $(wildcard include/config/no/generic/pci/ioport/map.h) \ + $(wildcard include/config/generic/pci/iomap.h) \ + arch/arm/mach-hi3518ev200/include/mach/io.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris_ext.h \ + /home/pub/temp/platform_ipc/mpp/release/hi3518e/include/hi_type.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.o): diff --git a/device/mpp/extdrv/piris/.tmp_versions/piris.mod b/device/mpp/extdrv/piris/.tmp_versions/piris.mod new file mode 100644 index 0000000..9e1bfec --- /dev/null +++ b/device/mpp/extdrv/piris/.tmp_versions/piris.mod @@ -0,0 +1,2 @@ +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.ko +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/piris/piris.o diff --git a/device/mpp/extdrv/piris/Makefile b/device/mpp/extdrv/piris/Makefile new file mode 100644 index 0000000..933ca96 --- /dev/null +++ b/device/mpp/extdrv/piris/Makefile @@ -0,0 +1,19 @@ + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +obj-m := piris.o +hi_pwm-y += piris.o + +EXTRA_CFLAGS += -I$(REL_INC) +EXTRA_CFLAGS += $(DRV_CFLAGS) +default: + $(CC) -g -Wall -o piris_test piris_test.c strfunc.c + @$(MAKE) -C $(LINUX_ROOT) M=$(PWD) modules + @rm -f *.o modules.* *.symvers *.mod.c +clean: + @make -C $(LINUX_ROOT) M=$(PWD) clean + @rm -f piris_test *.bak + diff --git a/device/mpp/extdrv/piris/piris.c b/device/mpp/extdrv/piris/piris.c new file mode 100644 index 0000000..c3b337a --- /dev/null +++ b/device/mpp/extdrv/piris/piris.c @@ -0,0 +1,419 @@ +/* isp/piris.c + * + * Copyright (c) 2006 Hisilicon Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + * History: + * 23-march-2011 create this file + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "piris.h" +#include "piris_ext.h" + + +#define PIRISI_ADRESS_BASE 0x20210000 // Piris use GPIO13 + +void __iomem* reg_pirisI_base_va = 0; + +#define HI_IO_PIRISI_ADDRESS(x) (reg_pirisI_base_va + ((x)-(PIRISI_ADRESS_BASE))) + +#define PIRIS_CFG_REG HI_IO_PIRISI_ADDRESS(PIRISI_ADRESS_BASE + 0x007C) +#define PIRIS_CTRL_REG HI_IO_PIRISI_ADDRESS(PIRISI_ADRESS_BASE + 0x0400) + +#define PIRIS_WRITE_REG(Addr, Value) ((*(volatile unsigned int *)(Addr)) = (Value)) +#define PIRIS_READ_REG(Addr) (*(volatile unsigned int *)(Addr)) + + +#define MAX(a, b) (a > b? a : b) +#define MIN(a, b) (a < b? a : b) +#define MAX_MOTOR_PAHSE 4 +#define MAX_STEPS 92 +#define PIRIS_PPS 100 + +static const unsigned char motor_phase_tbl[MAX_MOTOR_PAHSE] = { 0x0, 0x1, 0x2, 0x3}; + +typedef struct hiPIRIS_DEV +{ + int src_pos; + int dest_pos; + unsigned int pps; + int phase; + const unsigned char* phase_tbl; + struct semaphore sem; + struct timer_list timer; +} PIRIS_DEV; + +static PIRIS_DEV* p_piris_dev; + +DECLARE_COMPLETION(piris_comp); + + +int piris_gpio_update(int* pPirisPos) +{ + p_piris_dev->dest_pos = *pPirisPos; + + p_piris_dev->pps = PIRIS_PPS; + p_piris_dev->pps = MAX(MIN(p_piris_dev->pps, HZ), 1); + p_piris_dev->timer.expires = jiffies + HZ / p_piris_dev->pps; + + /* whether piris timer already at the kerbel timer pending list */ + if (p_piris_dev->timer.entry.next != NULL) + { + return -1; + } + + add_timer(&p_piris_dev->timer); + + return 0; +} + + + +/* first go to the full open iris step, set the full open as origin */ +int piris_origin_set(PIRIS_DATA_S* pstPirisData) +{ + int piris_pos; + + piris_pos = pstPirisData->CurPos; + + piris_gpio_update(&piris_pos); + + // wait for piris origin done + init_completion(&piris_comp); + wait_for_completion(&piris_comp); + + if (pstPirisData->ZeroIsMax == 1) + { + p_piris_dev->src_pos = 0; + p_piris_dev->dest_pos = 0; + } + else + { + p_piris_dev->src_pos = pstPirisData->TotalStep - 1; + p_piris_dev->dest_pos = pstPirisData->TotalStep - 1; + } + + return 0; + +} + + +/* go to the full close iris step */ +int piris_close_set(PIRIS_DATA_S* pstPirisData) +{ + int piris_pos; + + piris_pos = pstPirisData->CurPos; + + piris_gpio_update(&piris_pos); + + // wait for piris origin done + init_completion(&piris_comp); + wait_for_completion(&piris_comp); + + if (pstPirisData->ZeroIsMax == 1) + { + p_piris_dev->src_pos = pstPirisData->TotalStep - 1; + p_piris_dev->dest_pos = pstPirisData->TotalStep - 1; + } + else + { + p_piris_dev->src_pos = 0; + p_piris_dev->dest_pos = 0; + } + + return 0; + +} + + +/* file operation */ + +int piris_open(struct inode* inode, struct file* file) +{ + file->private_data = p_piris_dev; + + return 0 ; + +} + +int piris_close(struct inode* inode, struct file* file) +{ + return 0; +} + +#if 0 +static int PIRIS_DRV_Disable(void) +{ + PIRIS_WRITE_REG(PIRIS_CTRL_REG, 0x1F); + PIRIS_WRITE_REG(PIRIS_CFG_REG, 0x10); + return 0; +} +#endif + +int PIRIS_DRV_Write(unsigned char bits) +{ + switch (bits) + { + case 0: + PIRIS_WRITE_REG(PIRIS_CTRL_REG, 0x1F); + PIRIS_WRITE_REG(PIRIS_CFG_REG , 0x15); + break; + + case 1: + PIRIS_WRITE_REG(PIRIS_CTRL_REG, 0x1F); + PIRIS_WRITE_REG(PIRIS_CFG_REG , 0x16); + break; + + case 2: + PIRIS_WRITE_REG(PIRIS_CTRL_REG, 0x1F); + PIRIS_WRITE_REG(PIRIS_CFG_REG , 0x1A); + break; + + case 3: + PIRIS_WRITE_REG(PIRIS_CTRL_REG, 0x1F); + PIRIS_WRITE_REG(PIRIS_CFG_REG , 0x19); + + break; + + default: + break; + } + + + return 0; +} + + +static long piris_ioctl(struct file* file, unsigned int cmd, unsigned long arg) +{ + int __user* pPirisPos; + PIRIS_DATA_S __user* argp; + PIRIS_STATUS_E __user* pPirisStatus; + PIRIS_DEV* pstPirisDev = (PIRIS_DEV*) file->private_data; + + int err = 0; + + if (_IOC_TYPE(cmd) != PIRIS_IOC_MAGIC) + { + return -ENOTTY; + } + if (_IOC_NR(cmd) > PIRIS_IOC_MAXNR) + { + return -ENOTTY; + } + + if (_IOC_DIR(cmd) & _IOC_READ) + { + err = !access_ok(VERIFY_WRITE, (void __user*)arg, _IOC_SIZE(cmd)); + } + else if (_IOC_DIR(cmd) & _IOC_WRITE) + { + err = !access_ok(VERIFY_READ, (void __user*)arg, _IOC_SIZE(cmd)); + } + + if (err) + { + return -EFAULT; + } + + // lock pstPirisDev + if (down_interruptible(&pstPirisDev->sem)) + { + return -ERESTARTSYS; + } + + switch (cmd) + { + case PIRIS_SET_ACT_ARGS: + pPirisPos = (int __user*)arg; + piris_gpio_update(pPirisPos); + break; + + case PIRIS_SET_ORGIN: + argp = (PIRIS_DATA_S __user*)arg; + piris_origin_set(argp); + break; + + case PIRIS_SET_CLOSE: + argp = (PIRIS_DATA_S __user*)arg; + piris_close_set(argp); + break; + + case PIRIS_GET_STATUS: + pPirisStatus = (PIRIS_STATUS_E __user*)arg; + + if (pstPirisDev->dest_pos != pstPirisDev->src_pos) + { + *pPirisStatus = PIRIS_BUSY; + } + else + { + *pPirisStatus = PIRIS_IDLE; + //PIRIS_DRV_Disable(); + } + break; + + default: /* redundant, as cmd was checked against MAXNR */ + break; + } + + // unlock pstPirisDev + up(&pstPirisDev->sem); + + return 0 ; +} + + +static struct file_operations piris_fops = +{ + .owner = THIS_MODULE, + .unlocked_ioctl = piris_ioctl , + .open = piris_open , + .release = piris_close , +}; + +static struct miscdevice gstPirisDev = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "piris" , + .fops = &piris_fops, +}; + +void piris_timer_cb(unsigned long arg) +{ + int sign = 1; + unsigned char bits; + + PIRIS_DEV* pstPirisDev = (PIRIS_DEV*)arg; + + if (pstPirisDev->src_pos == pstPirisDev->dest_pos) + { + return ; + } + + sign = (pstPirisDev->dest_pos - pstPirisDev->src_pos < 0) ? -1 : 1; + pstPirisDev->src_pos += sign; + + // close iris: 0->1->2->3->0; open iris: 3->2->1->0->3 + pstPirisDev->phase = (pstPirisDev->phase + MAX_MOTOR_PAHSE + sign) % MAX_MOTOR_PAHSE; + bits = pstPirisDev->phase_tbl[pstPirisDev->phase]; + + PIRIS_DRV_Write(bits); + + if (pstPirisDev->dest_pos == pstPirisDev->src_pos) + { + complete(&piris_comp); + } + + pstPirisDev->timer.expires = jiffies + HZ / pstPirisDev->pps; + add_timer(&pstPirisDev->timer); + + //printk("%s, pos :%d @ pps:%d\n", __FUNCTION__, pstPirisDev->src_pos, pstPirisDev->pps); + + return ; +} + + +static int hi_piris_isp_register(void) +{ + ISP_PIRIS_CALLBACK_S stPirisCb = {0}; + + stPirisCb.pfn_piris_gpio_update = (HI_S32 (*)(HI_S32))piris_gpio_update; + if (CKFN_ISP_RegisterPirisCallBack()) + { + CALL_ISP_RegisterPirisCallBack(0, &stPirisCb); + } + else + { + printk("register piris_gpio_write_callback to isp failed, hi_piris init is failed!\n"); + return -1; + } + + return 0; +} + + + +/* module init and exit */ +static int __init piris_init(void) +{ + int ret; + + p_piris_dev = kmalloc(sizeof(PIRIS_DEV), GFP_KERNEL); + + if (!p_piris_dev) + { + return -1; + } + memset(p_piris_dev, 0x0, sizeof(PIRIS_DEV)); + + sema_init(&p_piris_dev->sem, 1); + init_completion(&piris_comp); + + // init timer + init_timer(&p_piris_dev->timer); + p_piris_dev->timer.function = piris_timer_cb; + p_piris_dev->timer.data = (unsigned long)p_piris_dev; + p_piris_dev->timer.expires = jiffies + HZ; /* one second */ + + p_piris_dev->phase_tbl = motor_phase_tbl; + + reg_pirisI_base_va = ioremap_nocache(PIRISI_ADRESS_BASE, 0x10000); + ret = misc_register(&gstPirisDev); + + hi_piris_isp_register(); + + if (ret != 0) + { + printk("register piris device failed with %#x!\n", ret); + return -1; + } + + return 0; +} + +static void __exit piris_exit(void) +{ + del_timer(&p_piris_dev->timer); + kfree(p_piris_dev); + + misc_deregister(&gstPirisDev); + +} + + +module_init(piris_init); +module_exit(piris_exit); + +MODULE_DESCRIPTION("piris driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("hisilicon"); + diff --git a/device/mpp/extdrv/piris/piris.h b/device/mpp/extdrv/piris/piris.h new file mode 100644 index 0000000..9df3703 --- /dev/null +++ b/device/mpp/extdrv/piris/piris.h @@ -0,0 +1,49 @@ +#ifndef __HI_PIRIS_H__ +#define __HI_PIRIS_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#include /* needed for the _IOW etc stuff used later */ + + +typedef enum hiPIRIS_STATUS_E +{ + PIRIS_IDLE = 0, + PIRIS_BUSY, + + PIRIS_BUTT, +} PIRIS_STATUS_E; + + +typedef struct hiPIRIS_DATA_S +{ + unsigned char ZeroIsMax; + unsigned int TotalStep; + int CurPos; +} PIRIS_DATA_S; + + + +#define PIRIS_IOC_MAGIC 'p' + +#define PIRIS_SET_ACT_ARGS _IOW(PIRIS_IOC_MAGIC, 1, int) +#define PIRIS_SET_ORGIN _IOW(PIRIS_IOC_MAGIC, 2, int) +#define PIRIS_SET_CLOSE _IOW(PIRIS_IOC_MAGIC, 3, int) +#define PIRIS_GET_STATUS _IOR(PIRIS_IOC_MAGIC, 5, int) + +#define PIRIS_IOC_MAXNR 5 + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_PIRIS_H__ */ + + diff --git a/device/mpp/extdrv/piris/piris.ko b/device/mpp/extdrv/piris/piris.ko new file mode 100644 index 0000000..5705183 Binary files /dev/null and b/device/mpp/extdrv/piris/piris.ko differ diff --git a/device/mpp/extdrv/piris/piris_ext.h b/device/mpp/extdrv/piris/piris_ext.h new file mode 100644 index 0000000..fa0aaac --- /dev/null +++ b/device/mpp/extdrv/piris/piris_ext.h @@ -0,0 +1,51 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : piris_ext.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2015/01/28 + Description : + History : + 1.Date : 2015/01/28 + Author : h00191408 + Modification: Created file + +******************************************************************************/ +#ifndef __PIRIS_EXT_H__ +#define __PIRIS_EXT_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef struct hiISP_PIRIS_CALLBACK_S +{ + HI_S32 (*pfn_piris_gpio_update)(HI_S32 s32Pos); +} ISP_PIRIS_CALLBACK_S; + +typedef struct hiISP_PIRIS_EXPORT_FUNC_S +{ + HI_S32 (*pfnISPRegisterPirisCallBack) (HI_S32 IspDev, ISP_PIRIS_CALLBACK_S* pstPirisCb); +} ISP_PIRIS_EXPORT_FUNC_S; + +extern ISP_PIRIS_EXPORT_FUNC_S g_stIspPirisExpFunc; + +#define CKFN_ISP_RegisterPirisCallBack()\ + (NULL != g_stIspPirisExpFunc.pfnISPRegisterPirisCallBack) +#define CALL_ISP_RegisterPirisCallBack(IspDev,pstPirisCb)\ + g_stIspPirisExpFunc.pfnISPRegisterPirisCallBack(IspDev,pstPirisCb) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/extdrv/piris/piris_test b/device/mpp/extdrv/piris/piris_test new file mode 100644 index 0000000..5cab878 Binary files /dev/null and b/device/mpp/extdrv/piris/piris_test differ diff --git a/device/mpp/extdrv/piris/piris_test.c b/device/mpp/extdrv/piris/piris_test.c new file mode 100644 index 0000000..c1200d3 --- /dev/null +++ b/device/mpp/extdrv/piris/piris_test.c @@ -0,0 +1,133 @@ + +#include +#include +#include +#include +#include +#include +#include + +#include "strfunc.h" +#include "piris.h" + + +int main(int argc , char* argv[]) +{ + int fd = -1; + int ret = 0; + unsigned int piris_pos; + PIRIS_STATUS_E sta; + int step = 0; + int toclose = 0; + int i = 0; + unsigned int TestSample = 0; + + if (argc < 2) + { + printf("usage: %s \n \n . \n sample: %s a 92\n", argv[0], argv[0]); + return -1; + } + + fd = open("/dev/piris", 0); + if (fd < 0) + { + printf("Open piris error!\n"); + return -1; + } + + + if (*argv[1] == 'a') + { + if (StrToNumber(argv[2], (unsigned int*)&piris_pos)) + { + close(fd); + return 0; + } + ret = ioctl(fd, PIRIS_SET_ACT_ARGS, &piris_pos); + } + else if (*argv[1] == 'o') + { + ret = ioctl(fd, PIRIS_SET_ORGIN, &piris_pos); + } + else if (*argv[1] == 's') + { + ret = ioctl(fd, PIRIS_GET_STATUS, &sta); + + if (sta == PIRIS_BUSY) + { + printf("piris running!!!\n"); + } + else + { + printf("piris idle!!\n"); + } + } + else if (*argv[1] == 't') + { + if (StrToNumber(argv[2], (unsigned int*)&TestSample)) + { + close(fd); + return 0; + } + switch (TestSample) + { + case 0: + i = 0; + step = 0; + toclose = 0; + while (i < 10000) + { + ioctl(fd, PIRIS_GET_STATUS, &sta); + if (sta != PIRIS_BUSY) + { + if (toclose == 1) + { + step = 92; + toclose = 0; + } + else + { + step = 0; + toclose = 1; + } + + piris_pos = step; + ioctl(fd, PIRIS_SET_ACT_ARGS, &piris_pos); + i++; + } + } + break; + case 1: + step = 0; + toclose = 0; + while (step != 92) + { + ioctl(fd, PIRIS_GET_STATUS, &sta); + if (sta != PIRIS_BUSY) + { + if (toclose == 1) + { + step -= 19; + toclose = 0; + } + else + { + step += 20; + toclose = 1; + } + + piris_pos = step; + ioctl(fd, PIRIS_SET_ACT_ARGS, &piris_pos); + } + } + break; + + default: + break; + } + } + + close(fd); + + return ret; +} diff --git a/device/mpp/extdrv/piris/strfunc.c b/device/mpp/extdrv/piris/strfunc.c new file mode 100644 index 0000000..bdf04a1 --- /dev/null +++ b/device/mpp/extdrv/piris/strfunc.c @@ -0,0 +1,174 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : String functions + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#include +#include +#include "strfunc.h" + +static int atoul(char* str, unsigned int* pulValue); +static int atoulx(char* str, unsigned int* pulValue); + + +/***************************************************************************** + Prototype : StrToNumber + Description : 10/16 ַתΪ޷֡ + Input args : IN CHAR *str + 10ַ, ܷ + 16ַ, ǰ׺0x. ABCDE + + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ + +int StrToNumber(char* str , unsigned int* pulValue) +{ + /*жǷ16Ƶַ*/ + if ( *str == '0' && (*(str + 1) == 'x' || *(str + 1) == 'X') ) + { + if (*(str + 2) == '\0') + { + return -1; + } + else + { + return atoulx(str + 2, pulValue); + } + } + else + { + return atoul(str, pulValue); + } +} + +/***************************************************************************** + Prototype : atoul + Description : 10ַתΪ޷֡ + Input args : IN CHAR *str 10ַ + ܷ + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +static int atoul(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + + while (*str) + { + unsigned char ch = toupper(*str); + + if (isdigit(ch)) + { + /*ֵ֧0xFFFFFFFF(4294967295), + X * 10 + (*str)-48 <= 4294967295 + ԣ X = 429496729 */ + if ((ulResult < 429496729) || ((ulResult == 429496729) && (*str < '6'))) + { + ulResult = ulResult * 10 + (*str) - 48; + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + *pulValue = ulResult; + return 0; +} + + + +/***************************************************************************** + Prototype : atoulx + Description : 16ַתΪ޷֡16ַǰ׺0x + Input args : IN CHAR *str 16ַ, ǰ׺0x. ABCDE + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : toupper + isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +#define ASC2NUM(ch) (ch - '0') +#define HEXASC2NUM(ch) (ch - 'A' + 10) + +int atoulx(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + unsigned char ch; + + while (*str) + { + ch = toupper(*str); + if (isdigit(ch) || ((ch >= 'A') && (ch <= 'F' ))) + { + if (ulResult < 0x10000000) + { + ulResult = (ulResult << 4) + ((ch <= '9') ? (ASC2NUM(ch)) : (HEXASC2NUM(ch))); + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + + *pulValue = ulResult; + return 0; +} + + + diff --git a/device/mpp/extdrv/piris/strfunc.h b/device/mpp/extdrv/piris/strfunc.h new file mode 100644 index 0000000..9ef32f2 --- /dev/null +++ b/device/mpp/extdrv/piris/strfunc.h @@ -0,0 +1,44 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : strfunc.c header file + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#ifndef __STRFUNC_H__ +#define __STRFUNC_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define STRFMT_ADDR32 "%#010lX" +#define STRFMT_ADDR32_2 "0x%08lX" + +extern int StrToNumber(char* str , unsigned int* ulValue); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __STRFUNC_H__ */ diff --git a/device/mpp/extdrv/pwm/.pwm.ko.cmd b/device/mpp/extdrv/pwm/.pwm.ko.cmd new file mode 100644 index 0000000..5f6b276 --- /dev/null +++ b/device/mpp/extdrv/pwm/.pwm.ko.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.ko := arm-hisiv300-linux-ld -EL -r -T /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/scripts/module-common.lds --build-id -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.ko /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.o diff --git a/device/mpp/extdrv/pwm/.pwm.mod.o.cmd b/device/mpp/extdrv/pwm/.pwm.mod.o.cmd new file mode 100644 index 0000000..ea02902 --- /dev/null +++ b/device/mpp/extdrv/pwm/.pwm.mod.o.cmd @@ -0,0 +1,345 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/.pwm.mod.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(pwm.mod)" -D"KBUILD_MODNAME=KBUILD_STR(pwm)" -DMODULE -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.o := \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/vermagic.h \ + include/generated/utsrelease.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.mod.o): diff --git a/device/mpp/extdrv/pwm/.pwm.o.cmd b/device/mpp/extdrv/pwm/.pwm.o.cmd new file mode 100644 index 0000000..d64e538 --- /dev/null +++ b/device/mpp/extdrv/pwm/.pwm.o.cmd @@ -0,0 +1,445 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/.pwm.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(pwm)" -D"KBUILD_MODNAME=KBUILD_STR(pwm)" -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.o := \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/fcntl.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/delay.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/delay.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/fs.h) \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/failslab.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + $(wildcard include/config/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + include/linux/kmemleak.h \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/fs.h \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/ima.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/ioctl.h \ + arch/arm/include/generated/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/linux/blk_types.h \ + $(wildcard include/config/blk/dev/integrity.h) \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/bit_spinlock.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/prio_tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/fiemap.h \ + include/linux/shrinker.h \ + include/linux/migrate_mode.h \ + include/linux/quota.h \ + $(wildcard include/config/quota/netlink/interface.h) \ + include/linux/percpu_counter.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/err.h \ + include/linux/magic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/uaccess.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/unified.h \ + $(wildcard include/config/arm/asm/unified.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/exec.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/switch_to.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_info.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_misc.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/io.h \ + $(wildcard include/config/need/mach/io/h.h) \ + $(wildcard include/config/pcmcia/soc/common.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/isa.h) \ + $(wildcard include/config/pccard.h) \ + include/asm-generic/pci_iomap.h \ + $(wildcard include/config/no/generic/pci/ioport/map.h) \ + $(wildcard include/config/generic/pci/iomap.h) \ + arch/arm/mach-hi3518ev200/include/mach/io.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.h \ + /home/pub/temp/platform_ipc/mpp/release/hi3518e/include/himedia.h \ + include/linux/major.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + $(wildcard include/config/sysfs/deprecated.h) \ + include/linux/ioport.h \ + include/linux/klist.h \ + include/linux/pm.h \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/pm/runtime.h) \ + $(wildcard include/config/pm/clk.h) \ + $(wildcard include/config/pm/generic/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/device.h \ + $(wildcard include/config/dmabounce.h) \ + $(wildcard include/config/iommu/api.h) \ + $(wildcard include/config/arch/omap.h) \ + include/linux/pm_wakeup.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.o): diff --git a/device/mpp/extdrv/pwm/.tmp_versions/pwm.mod b/device/mpp/extdrv/pwm/.tmp_versions/pwm.mod new file mode 100644 index 0000000..c3c2c9d --- /dev/null +++ b/device/mpp/extdrv/pwm/.tmp_versions/pwm.mod @@ -0,0 +1,2 @@ +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.ko +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/pwm/pwm.o diff --git a/device/mpp/extdrv/pwm/Makefile b/device/mpp/extdrv/pwm/Makefile new file mode 100644 index 0000000..c9a6060 --- /dev/null +++ b/device/mpp/extdrv/pwm/Makefile @@ -0,0 +1,20 @@ + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +obj-m := pwm.o +hi_pwm-y += pwm.o + +EXTRA_CFLAGS += -I$(REL_INC) +EXTRA_CFLAGS += $(DRV_CFLAGS) +default: + $(CC) -g -Wall -o pwm_write pwm_write.c strfunc.c + $(CC) -g -Wall -o pwm_test pwm_test.c strfunc.c + @$(MAKE) -C $(LINUX_ROOT) M=$(PWD) modules + @rm -f *.o modules.* *.symvers *.mod.c +clean: + @make -C $(LINUX_ROOT) M=$(PWD) clean + @rm -f pwm_write pwm_test *.bak + diff --git a/device/mpp/extdrv/pwm/pwm.c b/device/mpp/extdrv/pwm/pwm.c new file mode 100644 index 0000000..40b2dc8 --- /dev/null +++ b/device/mpp/extdrv/pwm/pwm.c @@ -0,0 +1,441 @@ +/* extdrv/interface/pwm.c + * + * Copyright (c) 2006 Hisilicon Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + * History: + * 23-march-2011 create this file + */ + +#include +#include +#ifndef CONFIG_HISI_SNAPSHOT_BOOT +#include +#endif +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "pwm.h" +#ifdef CONFIG_HISI_SNAPSHOT_BOOT +#include "himedia.h" +#endif + + +#define PWMI_ADRESS_BASE 0x20130000 + +void __iomem* reg_pwmI_base_va = 0; + + +#define HI_IO_PWMI_ADDRESS(x) (reg_pwmI_base_va + ((x)-(PWMI_ADRESS_BASE))) + + + +//PWMI +#define PWM0_CFG_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0000) +#define PWM0_CFG_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0004) +#define PWM0_CFG_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0008) +#define PWM0_CTRL_REG HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x000C) +#define PWM0_STATE_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0010) +#define PWM0_STATE_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0014) +#define PWM0_STATE_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0018) + +#define PWM1_CFG_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0020) +#define PWM1_CFG_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0024) +#define PWM1_CFG_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0028) +#define PWM1_CTRL_REG HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x002C) +#define PWM1_STATE_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0030) +#define PWM1_STATE_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0034) +#define PWM1_STATE_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0038) + +#define PWM2_CFG_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0040) +#define PWM2_CFG_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0044) +#define PWM2_CFG_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0048) +#define PWM2_CTRL_REG HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x004C) +#define PWM2_STATE_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0050) +#define PWM2_STATE_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0054) +#define PWM2_STATE_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0058) + +#define PWM3_CFG_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0060) +#define PWM3_CFG_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0064) +#define PWM3_CFG_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0068) +#define PWM3_CTRL_REG HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x006C) +#define PWM3_STATE_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0070) +#define PWM3_STATE_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0074) +#define PWM3_STATE_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x0078) + +#define PWM4_CFG_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1000) +#define PWM4_CFG_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1004) +#define PWM4_CFG_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1008) +#define PWM4_CTRL_REG HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x100C) +#define PWM4_STATE_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1010) +#define PWM4_STATE_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1014) +#define PWM4_STATE_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1018) + +#define PWM5_CFG_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1020) +#define PWM5_CFG_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1024) +#define PWM5_CFG_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1028) +#define PWM5_CTRL_REG HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x102C) +#define PWM5_STATE_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1030) +#define PWM5_STATE_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1034) +#define PWM5_STATE_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1038) + +#define PWM6_CFG_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1040) +#define PWM6_CFG_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1044) +#define PWM6_CFG_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1048) +#define PWM6_CTRL_REG HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x104C) +#define PWM6_STATE_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1050) +#define PWM6_STATE_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1054) +#define PWM6_STATE_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1058) + +#define PWM7_CFG_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1060) +#define PWM7_CFG_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1064) +#define PWM7_CFG_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1068) +#define PWM7_CTRL_REG HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x106C) +#define PWM7_STATE_REG0 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1070) +#define PWM7_STATE_REG1 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1074) +#define PWM7_STATE_REG2 HI_IO_PWMI_ADDRESS(PWMI_ADRESS_BASE + 0x1078) + + + +#define PWM_WRITE_REG(Addr, Value) ((*(volatile unsigned int *)(Addr)) = (Value)) +#define PWM_READ_REG(Addr) (*(volatile unsigned int *)(Addr)) + +//PWM +#define PWM_NUM_MAX 0x08 +#define PWM_ENABLE 0x01 +#define PWM_DISABLE 0x00 + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT +#define DEV_NAME "pwm" +static struct himedia_device s_stPwmDevice; +#endif + +static int PWM_DRV_Disable(unsigned char pwm_num) +{ + if (pwm_num >= PWM_NUM_MAX) + { + printk("The pwm number is big than the max value!\n"); + return -1; + } + switch (pwm_num) + { + case 0: + PWM_WRITE_REG(PWM0_CTRL_REG, PWM_DISABLE); + break; + case 1: + PWM_WRITE_REG(PWM1_CTRL_REG, PWM_DISABLE); + break; + case 2: + PWM_WRITE_REG(PWM2_CTRL_REG, PWM_DISABLE); + break; + case 3: + PWM_WRITE_REG(PWM3_CTRL_REG, PWM_DISABLE); + break; + case 4: + PWM_WRITE_REG(PWM4_CTRL_REG, PWM_DISABLE); + break; + case 5: + PWM_WRITE_REG(PWM5_CTRL_REG, PWM_DISABLE); + break; + case 6: + PWM_WRITE_REG(PWM6_CTRL_REG, PWM_DISABLE); + break; + case 7: + PWM_WRITE_REG(PWM7_CTRL_REG, PWM_DISABLE); + break; + default: + break; + } + + return 0; +} + + +int PWM_DRV_Write(unsigned char pwm_num, unsigned short duty, unsigned short period, unsigned char enable) +{ + if (pwm_num >= PWM_NUM_MAX) + { + printk("The pwm number is big than the max value!\n"); + return -1; + } + if (enable) + { + + switch (pwm_num) + { + case 0: + PWM_WRITE_REG(PWM0_CTRL_REG, PWM_DISABLE); + + PWM_WRITE_REG(PWM0_CFG_REG0, period); + PWM_WRITE_REG(PWM0_CFG_REG1, duty); + PWM_WRITE_REG(PWM0_CFG_REG2, 10); //pwm output number + + PWM_WRITE_REG(PWM0_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output; + //printk("The PWMI0 state %x\n",PWM_READ_REG(PWM0_STATE_REG)); + break; + + case 1: + PWM_WRITE_REG(PWM1_CTRL_REG, PWM_DISABLE); + + PWM_WRITE_REG(PWM1_CFG_REG0, period); + PWM_WRITE_REG(PWM1_CFG_REG1, duty); + PWM_WRITE_REG(PWM1_CFG_REG2, 10); //pwm output number + + PWM_WRITE_REG(PWM1_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output; + //printk("The PWMI1 state %x\n",PWM_READ_REG(PWM1_STATE_REG)); + break; + + case 2: + PWM_WRITE_REG(PWM2_CTRL_REG, PWM_DISABLE); + + PWM_WRITE_REG(PWM2_CFG_REG0, period); + PWM_WRITE_REG(PWM2_CFG_REG1, duty); + PWM_WRITE_REG(PWM2_CFG_REG2, 10); //pwm output number + + PWM_WRITE_REG(PWM2_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output; + //printk("The PWMI2 state %x\n",PWM_READ_REG(PWM2_STATE_REG)); + break; + + case 3: + PWM_WRITE_REG(PWM3_CTRL_REG, PWM_DISABLE); + + PWM_WRITE_REG(PWM3_CFG_REG0, period); + PWM_WRITE_REG(PWM3_CFG_REG1, duty); + PWM_WRITE_REG(PWM3_CFG_REG2, 10); //pwm output number + + PWM_WRITE_REG(PWM3_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output; + //printk("The PWMI3 state %x\n",PWM_READ_REG(PWM3_STATE_REG)); + break; + + case 4: + PWM_WRITE_REG(PWM4_CTRL_REG, PWM_DISABLE); + + PWM_WRITE_REG(PWM4_CFG_REG0, period); + PWM_WRITE_REG(PWM4_CFG_REG1, duty); + PWM_WRITE_REG(PWM4_CFG_REG2, 10); //pwm output number + + PWM_WRITE_REG(PWM4_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output; + //printk("The PWMI4 state %x\n",PWM_READ_REG(PWM4_STATE_REG)); + break; + + case 5: + PWM_WRITE_REG(PWM5_CTRL_REG, PWM_DISABLE); + + PWM_WRITE_REG(PWM5_CFG_REG0, period); + PWM_WRITE_REG(PWM5_CFG_REG1, duty); + PWM_WRITE_REG(PWM5_CFG_REG2, 10); //pwm output number + + PWM_WRITE_REG(PWM5_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output; + //printk("The PWMI5 state %x\n",PWM_READ_REG(PWM5_STATE_REG)); + break; + + case 6: + PWM_WRITE_REG(PWM6_CTRL_REG, PWM_DISABLE); + + PWM_WRITE_REG(PWM6_CFG_REG0, period); + PWM_WRITE_REG(PWM6_CFG_REG1, duty); + PWM_WRITE_REG(PWM6_CFG_REG2, 10); //pwm output number + + PWM_WRITE_REG(PWM6_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output; + //printk("The PWMI6 state %x\n",PWM_READ_REG(PWM6_STATE_REG)); + break; + + case 7: + PWM_WRITE_REG(PWM7_CTRL_REG, PWM_DISABLE); + + PWM_WRITE_REG(PWM7_CFG_REG0, period); + PWM_WRITE_REG(PWM7_CFG_REG1, duty); + PWM_WRITE_REG(PWM7_CFG_REG2, 10); //pwm output number + + PWM_WRITE_REG(PWM7_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output; + //printk("The PWMI7 state %x\n",PWM_READ_REG(PWM7_STATE_REG)); + break; + + default: + PWM_WRITE_REG(PWM0_CTRL_REG, PWM_DISABLE); + + PWM_WRITE_REG(PWM0_CFG_REG0, period); + PWM_WRITE_REG(PWM0_CFG_REG1, duty); + PWM_WRITE_REG(PWM0_CFG_REG2, 10); //pwm output number + + PWM_WRITE_REG(PWM0_CTRL_REG, (1 << 2 | PWM_ENABLE)); // keep the pwm always output; + //printk("The PWMII0 state %x\n",PWM_READ_REG(PWM0_STATE_REG)); + break; + } + } + else + { + PWM_DRV_Disable(pwm_num); + } + + + return 0; +} + +/* file operation */ + +int PWM_Open(struct inode* inode, struct file* file) +{ + return 0 ; + +} + +int PWM_Close(struct inode* inode, struct file* file) +{ + return 0; +} + +static long PWM_Ioctl(struct file* file, unsigned int cmd, unsigned long arg) +{ + PWM_DATA_S __user* argp = (PWM_DATA_S __user*)arg; + + unsigned char PwmNum; + unsigned int Duty; + unsigned int Period; + unsigned char enable; + + switch (cmd) + { + case PWM_CMD_WRITE: + { + PwmNum = argp->pwm_num; + Duty = argp->duty; + Period = argp->period; + enable = argp->enable; + + PWM_DRV_Write(PwmNum, Duty, Period, enable); + break; + } + + case PWM_CMD_READ: + { + break; + } + + default: + { + printk("invalid ioctl command!\n"); + return -ENOIOCTLCMD; + } + } + + return 0 ; +} + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT +static int PWM_freeze(struct himedia_device* pdev) +{ + printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__); + return 0; +} + +static int PWM_restore(struct himedia_device* pdev) +{ + printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__); + return 0; +} +#endif + +static struct file_operations pwm_fops = +{ + .owner = THIS_MODULE, + .unlocked_ioctl = PWM_Ioctl , + .open = PWM_Open , + .release = PWM_Close , +}; + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT +struct himedia_ops stPwmDrvOps = +{ + .pm_freeze = PWM_freeze, + .pm_restore = PWM_restore +}; +#else +static struct miscdevice pwm_dev = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "pwm" , + .fops = &pwm_fops, +}; +#endif + +/* module init and exit */ + +static int __init pwm_init(void) +{ + int ret; + + reg_pwmI_base_va = (void __iomem*)IO_ADDRESS(PWMI_ADRESS_BASE); + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT + snprintf(s_stPwmDevice.devfs_name, sizeof(s_stPwmDevice.devfs_name), DEV_NAME); + + s_stPwmDevice.minor = HIMEDIA_DYNAMIC_MINOR; + s_stPwmDevice.fops = &pwm_fops; + s_stPwmDevice.drvops = &stPwmDrvOps; + s_stPwmDevice.owner = THIS_MODULE; + + ret = himedia_register(&s_stPwmDevice); + if (ret) + { + printk("register i2c device failed with %#x!\n", ret); + return -1; + } +#else + ret = misc_register(&pwm_dev); + if (ret != 0) + { + printk("register i2c device failed with %#x!\n", ret); + return -1; + } +#endif + + return 0; +} + +static void __exit pwm_exit(void) +{ + int i; + + for (i = 0; i < PWM_NUM_MAX; i++) + { + PWM_DRV_Disable(i); + } + + reg_pwmI_base_va = NULL; + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT + himedia_unregister(&s_stPwmDevice); +#else + misc_deregister(&pwm_dev); +#endif +} + + +module_init(pwm_init); +module_exit(pwm_exit); + +MODULE_DESCRIPTION("PWM Driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Hisilicon"); + diff --git a/device/mpp/extdrv/pwm/pwm.h b/device/mpp/extdrv/pwm/pwm.h new file mode 100644 index 0000000..7b277f6 --- /dev/null +++ b/device/mpp/extdrv/pwm/pwm.h @@ -0,0 +1,38 @@ +#ifndef __HI_PWM_H__ +#define __HI_PWM_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + + +typedef struct hiPWM_DATA_S +{ + unsigned char pwm_num; //0:PWM0,1:PWM1,2:PWM2,3:PWMII0,4:PWMII1,5:PWMII2 + unsigned int duty; + unsigned int period; + unsigned char enable; + +} PWM_DATA_S; + +#define PWM_CMD_WRITE 0x01 +#define PWM_CMD_READ 0x03 + + +int PWM_DRV_Write(unsigned char pwm_num, unsigned short duty, unsigned short period, unsigned char enable); +//unsigned int PWM_DRV_Read(unsigned int reg_addr); + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_PWM_H__ */ + + diff --git a/device/mpp/extdrv/pwm/pwm.ko b/device/mpp/extdrv/pwm/pwm.ko new file mode 100644 index 0000000..a6d9c29 Binary files /dev/null and b/device/mpp/extdrv/pwm/pwm.ko differ diff --git a/device/mpp/extdrv/pwm/pwm_test b/device/mpp/extdrv/pwm/pwm_test new file mode 100644 index 0000000..6f6758c Binary files /dev/null and b/device/mpp/extdrv/pwm/pwm_test differ diff --git a/device/mpp/extdrv/pwm/pwm_test.c b/device/mpp/extdrv/pwm/pwm_test.c new file mode 100644 index 0000000..4a26b36 --- /dev/null +++ b/device/mpp/extdrv/pwm/pwm_test.c @@ -0,0 +1,90 @@ + +#include +#include +#include +#include +#include +#include +#include + +#include "strfunc.h" +#include "pwm.h" + + +int main(int argc , char* argv[]) +{ + int fd = -1; + int ret = 0; + int i = 0; + unsigned int PwmDirector; + unsigned int Period; + PWM_DATA_S stPwmData; + + if (argc < 3) + { + printf("usage: %s sample: %s 0x56 0x0 0x28\n", argv[0], argv[0]); + return -1; + } + + fd = open("/dev/pwm", 0); + if (fd < 0) + { + printf("Open pwm error!\n"); + return -1; + } + + if (StrToNumber(argv[1], &PwmDirector)) + { + close(fd); + return 0; + } + + if (StrToNumber(argv[2], &Period)) + { + close(fd); + return 0; + } + + printf("PWM_Director:0x%4x; Period:0x%4x.\n", PwmDirector, Period); + stPwmData.pwm_num = 0; + stPwmData.period = 1000; + stPwmData.enable = 1; + + if (PwmDirector == 0) + { + stPwmData.duty = Period; + } + else + { + stPwmData.duty = 1; + } + + //for(i = 0;i < Period;i++) + while (i < 10) + { + /* + if(PwmDirector == 0) + { + stPwmData.duty--; + } + else + { + stPwmData.duty++; + } + */ + stPwmData.duty = 420; + ret = ioctl(fd, PWM_CMD_WRITE, &stPwmData); + printf("ret :%d\n", ret); + usleep(66000); + stPwmData.duty = 610; + ret = ioctl(fd, PWM_CMD_WRITE, &stPwmData); + printf("ret :%d\n", ret); + usleep(66000); + i++; + } + + //printf("device_addr:0x%2x; reg_addr:0x%2x; reg_value:0x%2x.\n", device_addr, reg_addr, reg_value); + close(fd); + + return 0; +} diff --git a/device/mpp/extdrv/pwm/pwm_write b/device/mpp/extdrv/pwm/pwm_write new file mode 100644 index 0000000..ca48731 Binary files /dev/null and b/device/mpp/extdrv/pwm/pwm_write differ diff --git a/device/mpp/extdrv/pwm/pwm_write.c b/device/mpp/extdrv/pwm/pwm_write.c new file mode 100644 index 0000000..ea1ba82 --- /dev/null +++ b/device/mpp/extdrv/pwm/pwm_write.c @@ -0,0 +1,79 @@ + +#include +#include +#include +#include +#include +#include +#include + +#include "strfunc.h" +#include "pwm.h" + + +int main(int argc , char* argv[]) +{ + int fd = -1; + int ret = 0; + + unsigned int PwmNum; + unsigned int Duty; + unsigned int Period; + unsigned int enable; + + PWM_DATA_S stPwmData; + + + if (argc < 5) + { + printf("usage: %s . sample: %s 0x56 0x0 0x28\n", argv[0], argv[0]); + return -1; + } + + fd = open("/dev/pwm", 0); + if (fd < 0) + { + printf("Open pwm error!\n"); + return -1; + } + + if (StrToNumber(argv[1], &PwmNum)) + { + close(fd); + return 0; + } + + if (StrToNumber(argv[2], &Duty)) + { + close(fd); + return 0; + } + + if (StrToNumber(argv[3], &Period)) + { + close(fd); + return 0; + } + + if (StrToNumber(argv[4], &enable)) + { + close(fd); + return 0; + } + + printf("PWM_NUM:0x%4x; Duty:0x%4x; Period:0x%4x;enable:0x%4x.\n", PwmNum, Duty, Period, enable); + + stPwmData.pwm_num = PwmNum; + stPwmData.duty = Duty; + stPwmData.period = Period; + stPwmData.enable = enable; + + ret = ioctl(fd, PWM_CMD_WRITE, &stPwmData); + printf("ret :%d\n", ret); + + //printf("device_addr:0x%2x; reg_addr:0x%2x; reg_value:0x%2x.\n", device_addr, reg_addr, reg_value); + + close(fd); + + return 0; +} diff --git a/device/mpp/extdrv/pwm/strfunc.c b/device/mpp/extdrv/pwm/strfunc.c new file mode 100644 index 0000000..3d90f79 --- /dev/null +++ b/device/mpp/extdrv/pwm/strfunc.c @@ -0,0 +1,172 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : String functions + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#include +#include +#include "strfunc.h" + +static int atoul(char* str, unsigned int* pulValue); +static int atoulx(char* str, unsigned int* pulValue); + + +/***************************************************************************** + Prototype : StrToNumber + Description : 10/16 ַתΪ޷֡ + Input args : IN CHAR *str + 10ַ, ܷ + 16ַ, ǰ׺0x. ABCDE + + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ + +int StrToNumber(char* str , unsigned int* pulValue) +{ + /*жǷ16Ƶַ*/ + if ( *str == '0' && (*(str + 1) == 'x' || *(str + 1) == 'X') ) + { + if (*(str + 2) == '\0') + { + return -1; + } + else + { + return atoulx(str + 2, pulValue); + } + } + else + { + return atoul(str, pulValue); + } +} + +/***************************************************************************** + Prototype : atoul + Description : 10ַתΪ޷֡ + Input args : IN CHAR *str 10ַ + ܷ + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +static int atoul(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + + while (*str) + { + if (isdigit((int)*str)) + { + /*ֵ֧0xFFFFFFFF(4294967295), + X * 10 + (*str)-48 <= 4294967295 + ԣ X = 429496729 */ + if ((ulResult < 429496729) || ((ulResult == 429496729) && (*str < '6'))) + { + ulResult = ulResult * 10 + (*str) - 48; + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + *pulValue = ulResult; + return 0; +} + + + +/***************************************************************************** + Prototype : atoulx + Description : 16ַתΪ޷֡16ַǰ׺0x + Input args : IN CHAR *str 16ַ, ǰ׺0x. ABCDE + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : toupper + isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +#define ASC2NUM(ch) (ch - '0') +#define HEXASC2NUM(ch) (ch - 'A' + 10) + +int atoulx(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + unsigned char ch; + + while (*str) + { + ch = toupper(*str); + if (isdigit(ch) || ((ch >= 'A') && (ch <= 'F' ))) + { + if (ulResult < 0x10000000) + { + ulResult = (ulResult << 4) + ((ch <= '9') ? (ASC2NUM(ch)) : (HEXASC2NUM(ch))); + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + + *pulValue = ulResult; + return 0; +} + + + diff --git a/device/mpp/extdrv/pwm/strfunc.h b/device/mpp/extdrv/pwm/strfunc.h new file mode 100644 index 0000000..9ef32f2 --- /dev/null +++ b/device/mpp/extdrv/pwm/strfunc.h @@ -0,0 +1,44 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : strfunc.c header file + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#ifndef __STRFUNC_H__ +#define __STRFUNC_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define STRFMT_ADDR32 "%#010lX" +#define STRFMT_ADDR32_2 "0x%08lX" + +extern int StrToNumber(char* str , unsigned int* ulValue); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __STRFUNC_H__ */ diff --git a/device/mpp/extdrv/sensor_i2c/.sensor_i2c.ko.cmd b/device/mpp/extdrv/sensor_i2c/.sensor_i2c.ko.cmd new file mode 100644 index 0000000..3d73c84 --- /dev/null +++ b/device/mpp/extdrv/sensor_i2c/.sensor_i2c.ko.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.ko := arm-hisiv300-linux-ld -EL -r -T /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/scripts/module-common.lds --build-id -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.ko /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.o diff --git a/device/mpp/extdrv/sensor_i2c/.sensor_i2c.mod.o.cmd b/device/mpp/extdrv/sensor_i2c/.sensor_i2c.mod.o.cmd new file mode 100644 index 0000000..d58c386 --- /dev/null +++ b/device/mpp/extdrv/sensor_i2c/.sensor_i2c.mod.o.cmd @@ -0,0 +1,345 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/.sensor_i2c.mod.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(sensor_i2c.mod)" -D"KBUILD_MODNAME=KBUILD_STR(sensor_i2c)" -DMODULE -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.o := \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/vermagic.h \ + include/generated/utsrelease.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.mod.o): diff --git a/device/mpp/extdrv/sensor_i2c/.sensor_i2c.o.cmd b/device/mpp/extdrv/sensor_i2c/.sensor_i2c.o.cmd new file mode 100644 index 0000000..d37c50b --- /dev/null +++ b/device/mpp/extdrv/sensor_i2c/.sensor_i2c.o.cmd @@ -0,0 +1,504 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/.sensor_i2c.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(sensor_i2c)" -D"KBUILD_MODNAME=KBUILD_STR(sensor_i2c)" -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.o := \ + include/linux/init.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/hotplug.h) \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/failslab.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + $(wildcard include/config/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + include/linux/kmemleak.h \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/io.h \ + $(wildcard include/config/need/mach/io/h.h) \ + $(wildcard include/config/pcmcia/soc/common.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/isa.h) \ + $(wildcard include/config/pccard.h) \ + include/asm-generic/pci_iomap.h \ + $(wildcard include/config/no/generic/pci/ioport/map.h) \ + $(wildcard include/config/generic/pci/iomap.h) \ + arch/arm/mach-hi3518ev200/include/mach/io.h \ + include/linux/i2c.h \ + $(wildcard include/config/i2c.h) \ + $(wildcard include/config/i2c/boardinfo.h) \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + $(wildcard include/config/sysfs/deprecated.h) \ + include/linux/ioport.h \ + include/linux/klist.h \ + include/linux/pm.h \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/pm/runtime.h) \ + $(wildcard include/config/pm/clk.h) \ + $(wildcard include/config/pm/generic/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/device.h \ + $(wildcard include/config/dmabounce.h) \ + $(wildcard include/config/iommu/api.h) \ + $(wildcard include/config/arch/omap.h) \ + include/linux/pm_wakeup.h \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/no/hz.h) \ + $(wildcard include/config/lockup/detector.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/sched/autogroup.h) \ + $(wildcard include/config/virt/cpu/accounting.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/fanotify.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/cgroup/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/rcu/boost.h) \ + $(wildcard include/config/compat/brk.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/irq/time/accounting.h) \ + $(wildcard include/config/proc/fs.h) \ + $(wildcard include/config/cfs/bandwidth.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/debug/stack/usage.h) \ + $(wildcard include/config/mm/owner.h) \ + include/linux/capability.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/have/cmpxchg/double.h) \ + $(wildcard include/config/have/aligned/struct/page.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mmu/notifier.h) \ + $(wildcard include/config/transparent/hugepage.h) \ + include/linux/auxvec.h \ + arch/arm/include/generated/asm/auxvec.h \ + include/asm-generic/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/guard.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/mmu.h \ + $(wildcard include/config/cpu/has/asid.h) \ + arch/arm/include/generated/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/sembuf.h \ + include/linux/signal.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/sigcontext.h \ + arch/arm/include/generated/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/pid.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + include/linux/rculist.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + arch/arm/include/generated/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + $(wildcard include/config/timerfd.h) \ + include/linux/timerqueue.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/user/ns.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/llist.h \ + $(wildcard include/config/arch/have/nmi/safe/cmpxchg.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/linux/uio.h \ + include/linux/of.h \ + $(wildcard include/config/sparc.h) \ + $(wildcard include/config/of/dynamic.h) \ + $(wildcard include/config/of.h) \ + include/linux/delay.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/delay.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/isp_ext.h \ + /home/pub/temp/platform_ipc/mpp/release/hi3518e/include/hi_type.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.o): diff --git a/device/mpp/extdrv/sensor_i2c/.tmp_versions/sensor_i2c.mod b/device/mpp/extdrv/sensor_i2c/.tmp_versions/sensor_i2c.mod new file mode 100644 index 0000000..2e29df6 --- /dev/null +++ b/device/mpp/extdrv/sensor_i2c/.tmp_versions/sensor_i2c.mod @@ -0,0 +1,2 @@ +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.ko +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.o diff --git a/device/mpp/extdrv/sensor_i2c/Makefile b/device/mpp/extdrv/sensor_i2c/Makefile new file mode 100644 index 0000000..94f19bf --- /dev/null +++ b/device/mpp/extdrv/sensor_i2c/Makefile @@ -0,0 +1,15 @@ +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +obj-m := sensor_i2c.o +hi_sensor_i2c-y := sensor_i2c.o + +EXTRA_CFLAGS += -I$(REL_INC) +EXTRA_CFLAGS += $(DRV_CFLAGS) +all: + make -C $(LINUX_ROOT) M=$(PWD) modules + +clean: + @make -C $(LINUX_ROOT) M=$(PWD) clean diff --git a/device/mpp/extdrv/sensor_i2c/Module.symvers b/device/mpp/extdrv/sensor_i2c/Module.symvers new file mode 100644 index 0000000..e69de29 diff --git a/device/mpp/extdrv/sensor_i2c/isp_ext.h b/device/mpp/extdrv/sensor_i2c/isp_ext.h new file mode 100644 index 0000000..1743419 --- /dev/null +++ b/device/mpp/extdrv/sensor_i2c/isp_ext.h @@ -0,0 +1,62 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : isp_ext.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/07/17 + Description : + History : + 1.Date : 2013/07/17 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __ISP_EXT_H__ +#define __ISP_EXT_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef enum hiISP_BUS_TYPE_E +{ + ISP_BUS_TYPE_I2C = 0, + ISP_BUS_TYPE_SSP, + + ISP_BUS_TYPE_BUTT, +} ISP_BUS_TYPE_E; + +typedef struct hiISP_BUS_CALLBACK_S +{ + HI_S32 (*pfnISPWriteI2CData) (HI_U8 u8DevAddr, HI_U32 u32RegAddr, + HI_U32 u32RegAddrByteNum, HI_U32 u32Data, HI_U32 u32DataByteNum); + HI_S32 (*pfnISPWriteSSPData) (HI_U32 u32DevAddr, HI_U32 u32DevAddrByteNum, + HI_U32 u32RegAddr, HI_U32 u32RegAddrByteNum, HI_U32 u32Data, HI_U32 u32DataByteNum); +} ISP_BUS_CALLBACK_S; + +typedef struct hiISP_EXPORT_FUNC_S +{ + HI_S32 (*pfnISPRegisterBusCallBack) (HI_S32 IspDev, ISP_BUS_TYPE_E enType, ISP_BUS_CALLBACK_S* pstBusCb); +} ISP_EXPORT_FUNC_S; + +extern ISP_EXPORT_FUNC_S g_stIspExpFunc; + +#define CKFN_ISP_RegisterBusCallBack()\ + (NULL != g_stIspExpFunc.pfnISPRegisterBusCallBack) +#define CALL_ISP_RegisterBusCallBack(IspDev,enType,pstBusCb)\ + g_stIspExpFunc.pfnISPRegisterBusCallBack(IspDev,enType,pstBusCb) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/extdrv/sensor_i2c/modules.order b/device/mpp/extdrv/sensor_i2c/modules.order new file mode 100644 index 0000000..844b7bf --- /dev/null +++ b/device/mpp/extdrv/sensor_i2c/modules.order @@ -0,0 +1 @@ +kernel//home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_i2c/sensor_i2c.ko diff --git a/device/mpp/extdrv/sensor_i2c/sensor_i2c.c b/device/mpp/extdrv/sensor_i2c/sensor_i2c.c new file mode 100644 index 0000000..5176aa4 --- /dev/null +++ b/device/mpp/extdrv/sensor_i2c/sensor_i2c.c @@ -0,0 +1,149 @@ +#include +#include +#include +#include +#include +#include + +#include +#include "isp_ext.h" + +static struct i2c_board_info hi_info = +{ + I2C_BOARD_INFO("sensor_i2c", 0x6c), +}; + +static struct i2c_client* sensor_client; + +int hi_i2c_read(unsigned char dev_addr, unsigned int reg_addr, + unsigned int reg_addr_num, unsigned int data_byte_num); + +int hi_sensor_i2c_write(unsigned char dev_addr, + unsigned int reg_addr, unsigned int reg_addr_num, + unsigned int data, unsigned int data_byte_num) +{ + unsigned char tmp_buf[8]; + int ret = 0; + int idx = 0; + struct i2c_client* client = sensor_client; + + sensor_client->addr = dev_addr; + + /* reg_addr config */ + tmp_buf[idx++] = reg_addr; + if (reg_addr_num == 2) + { + client->flags |= I2C_M_16BIT_REG; + tmp_buf[idx++] = (reg_addr >> 8); + } + else + { + client->flags &= ~I2C_M_16BIT_REG; + } + + /* data config */ + tmp_buf[idx++] = data; + if (data_byte_num == 2) + { + client->flags |= I2C_M_16BIT_DATA; + tmp_buf[idx++] = data >> 8; + } + else + { + client->flags &= ~I2C_M_16BIT_DATA; + } + + ret = i2c_master_send(client, tmp_buf, idx); + + return ret; +} + +int hi_i2c_read(unsigned char dev_addr, unsigned int reg_addr, + unsigned int reg_addr_num, unsigned int data_byte_num) +{ + unsigned char tmp_buf[8]; + int ret = 0; + int ret_data = 0xFF; + int idx = 0; + struct i2c_client* client = sensor_client; + + sensor_client->addr = dev_addr; + + /* reg_addr config */ + tmp_buf[idx++] = reg_addr; + if (reg_addr_num == 2) + { + client->flags |= I2C_M_16BIT_REG; + tmp_buf[idx++] = reg_addr >> 8; + } + else + { + client->flags &= ~I2C_M_16BIT_REG; + } + + /* data config */ + if (data_byte_num == 2) + { + client->flags |= I2C_M_16BIT_DATA; + } + else + { + client->flags &= ~I2C_M_16BIT_DATA; + } + + ret = i2c_master_recv(client, tmp_buf, idx); + if (ret >= 0) + { + if (data_byte_num == 2) + { + ret_data = tmp_buf[0] | (tmp_buf[1] << 8); + } + else + { + ret_data = tmp_buf[0]; + } + } + + return ret_data; +} + +static int hi_dev_isp_register(void) +{ + ISP_BUS_CALLBACK_S stBusCb = {0}; + + stBusCb.pfnISPWriteI2CData = hi_sensor_i2c_write; + if (CKFN_ISP_RegisterBusCallBack()) + { + CALL_ISP_RegisterBusCallBack(0, ISP_BUS_TYPE_I2C, &stBusCb); + } + else + { + printk("register i2c_write_callback to isp failed, hi_i2c init is failed!\n"); + return -1; + } + + return 0; +} + +static int hi_dev_init(void) +{ + struct i2c_adapter* i2c_adap; + + // use i2c0 + i2c_adap = i2c_get_adapter(0); + sensor_client = i2c_new_device(i2c_adap, &hi_info); + + i2c_put_adapter(i2c_adap); + hi_dev_isp_register(); + + return 0; +} + +static void hi_dev_exit(void) +{ + i2c_unregister_device(sensor_client); +} + +module_init(hi_dev_init); +module_exit(hi_dev_exit); +MODULE_LICENSE("GPL"); diff --git a/device/mpp/extdrv/sensor_i2c/sensor_i2c.ko b/device/mpp/extdrv/sensor_i2c/sensor_i2c.ko new file mode 100644 index 0000000..1b15e1e Binary files /dev/null and b/device/mpp/extdrv/sensor_i2c/sensor_i2c.ko differ diff --git a/device/mpp/extdrv/sensor_i2c/sensor_i2c.mod.c b/device/mpp/extdrv/sensor_i2c/sensor_i2c.mod.c new file mode 100644 index 0000000..147b9f6 --- /dev/null +++ b/device/mpp/extdrv/sensor_i2c/sensor_i2c.mod.c @@ -0,0 +1,21 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +static const char __module_depends[] +__used +__attribute__((section(".modinfo"))) = +"depends="; + diff --git a/device/mpp/extdrv/sensor_spi/.sensor_spi.ko.cmd b/device/mpp/extdrv/sensor_spi/.sensor_spi.ko.cmd new file mode 100644 index 0000000..3de0c8d --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/.sensor_spi.ko.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.ko := arm-hisiv300-linux-ld -EL -r -T /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/scripts/module-common.lds --build-id -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.ko /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.o diff --git a/device/mpp/extdrv/sensor_spi/.sensor_spi.mod.o.cmd b/device/mpp/extdrv/sensor_spi/.sensor_spi.mod.o.cmd new file mode 100644 index 0000000..e886a21 --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/.sensor_spi.mod.o.cmd @@ -0,0 +1,345 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/.sensor_spi.mod.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(sensor_spi.mod)" -D"KBUILD_MODNAME=KBUILD_STR(sensor_spi)" -DMODULE -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.o := \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/vermagic.h \ + include/generated/utsrelease.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.mod.o): diff --git a/device/mpp/extdrv/sensor_spi/.sensor_spi.o.cmd b/device/mpp/extdrv/sensor_spi/.sensor_spi.o.cmd new file mode 100644 index 0000000..fdf0c6d --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/.sensor_spi.o.cmd @@ -0,0 +1,530 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/.sensor_spi.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(sensor_spi)" -D"KBUILD_MODNAME=KBUILD_STR(sensor_spi)" -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.o := \ + include/linux/init.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/hotplug.h) \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/ioctl.h \ + arch/arm/include/generated/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/linux/fs.h \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/ima.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/blk_types.h \ + $(wildcard include/config/blk/dev/integrity.h) \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/bit_spinlock.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/prio_tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/fiemap.h \ + include/linux/shrinker.h \ + include/linux/migrate_mode.h \ + include/linux/quota.h \ + $(wildcard include/config/quota/netlink/interface.h) \ + include/linux/percpu_counter.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/fcntl.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/err.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + $(wildcard include/config/sysfs/deprecated.h) \ + include/linux/ioport.h \ + include/linux/klist.h \ + include/linux/pm.h \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/pm/runtime.h) \ + $(wildcard include/config/pm/clk.h) \ + $(wildcard include/config/pm/generic/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/device.h \ + $(wildcard include/config/dmabounce.h) \ + $(wildcard include/config/iommu/api.h) \ + $(wildcard include/config/arch/omap.h) \ + include/linux/pm_wakeup.h \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/failslab.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + $(wildcard include/config/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + include/linux/kmemleak.h \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/compat.h \ + $(wildcard include/config/arch/want/old/compat/ipc.h) \ + include/linux/delay.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/delay.h \ + include/linux/spi/spi.h \ + $(wildcard include/config/spi.h) \ + include/linux/mod_devicetable.h \ + include/linux/kthread.h \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/no/hz.h) \ + $(wildcard include/config/lockup/detector.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/sched/autogroup.h) \ + $(wildcard include/config/virt/cpu/accounting.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/fanotify.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/cgroup/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/rcu/boost.h) \ + $(wildcard include/config/compat/brk.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/irq/time/accounting.h) \ + $(wildcard include/config/proc/fs.h) \ + $(wildcard include/config/cfs/bandwidth.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/debug/stack/usage.h) \ + $(wildcard include/config/mm/owner.h) \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/have/cmpxchg/double.h) \ + $(wildcard include/config/have/aligned/struct/page.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mmu/notifier.h) \ + $(wildcard include/config/transparent/hugepage.h) \ + include/linux/auxvec.h \ + arch/arm/include/generated/asm/auxvec.h \ + include/asm-generic/auxvec.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/guard.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/mmu.h \ + $(wildcard include/config/cpu/has/asid.h) \ + arch/arm/include/generated/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/sembuf.h \ + include/linux/signal.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/sigcontext.h \ + arch/arm/include/generated/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + arch/arm/include/generated/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + $(wildcard include/config/timerfd.h) \ + include/linux/timerqueue.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + $(wildcard include/config/user/ns.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/llist.h \ + $(wildcard include/config/arch/have/nmi/safe/cmpxchg.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/linux/uio.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/uaccess.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/unified.h \ + $(wildcard include/config/arm/asm/unified.h) \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/isp_ext.h \ + /home/pub/temp/platform_ipc/mpp/release/hi3518e/include/hi_type.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.o): diff --git a/device/mpp/extdrv/sensor_spi/.tmp_versions/sensor_spi.mod b/device/mpp/extdrv/sensor_spi/.tmp_versions/sensor_spi.mod new file mode 100644 index 0000000..4a09b2a --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/.tmp_versions/sensor_spi.mod @@ -0,0 +1,2 @@ +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.ko +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.o diff --git a/device/mpp/extdrv/sensor_spi/Makefile b/device/mpp/extdrv/sensor_spi/Makefile new file mode 100644 index 0000000..1a7dbc3 --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/Makefile @@ -0,0 +1,16 @@ +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +obj-m := sensor_spi.o + +hi_sensor_spi-y := sensor_spi.o + +EXTRA_CFLAGS += -I$(REL_INC) +EXTRA_CFLAGS += $(DRV_CFLAGS) +all: + make -C $(LINUX_ROOT) M=$(PWD) modules + +clean: + @make -C $(LINUX_ROOT) M=$(PWD) clean diff --git a/device/mpp/extdrv/sensor_spi/Module.symvers b/device/mpp/extdrv/sensor_spi/Module.symvers new file mode 100644 index 0000000..e69de29 diff --git a/device/mpp/extdrv/sensor_spi/isp_ext.h b/device/mpp/extdrv/sensor_spi/isp_ext.h new file mode 100644 index 0000000..1743419 --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/isp_ext.h @@ -0,0 +1,62 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : isp_ext.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/07/17 + Description : + History : + 1.Date : 2013/07/17 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __ISP_EXT_H__ +#define __ISP_EXT_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef enum hiISP_BUS_TYPE_E +{ + ISP_BUS_TYPE_I2C = 0, + ISP_BUS_TYPE_SSP, + + ISP_BUS_TYPE_BUTT, +} ISP_BUS_TYPE_E; + +typedef struct hiISP_BUS_CALLBACK_S +{ + HI_S32 (*pfnISPWriteI2CData) (HI_U8 u8DevAddr, HI_U32 u32RegAddr, + HI_U32 u32RegAddrByteNum, HI_U32 u32Data, HI_U32 u32DataByteNum); + HI_S32 (*pfnISPWriteSSPData) (HI_U32 u32DevAddr, HI_U32 u32DevAddrByteNum, + HI_U32 u32RegAddr, HI_U32 u32RegAddrByteNum, HI_U32 u32Data, HI_U32 u32DataByteNum); +} ISP_BUS_CALLBACK_S; + +typedef struct hiISP_EXPORT_FUNC_S +{ + HI_S32 (*pfnISPRegisterBusCallBack) (HI_S32 IspDev, ISP_BUS_TYPE_E enType, ISP_BUS_CALLBACK_S* pstBusCb); +} ISP_EXPORT_FUNC_S; + +extern ISP_EXPORT_FUNC_S g_stIspExpFunc; + +#define CKFN_ISP_RegisterBusCallBack()\ + (NULL != g_stIspExpFunc.pfnISPRegisterBusCallBack) +#define CALL_ISP_RegisterBusCallBack(IspDev,enType,pstBusCb)\ + g_stIspExpFunc.pfnISPRegisterBusCallBack(IspDev,enType,pstBusCb) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/extdrv/sensor_spi/modules.order b/device/mpp/extdrv/sensor_spi/modules.order new file mode 100644 index 0000000..ebc1af5 --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/modules.order @@ -0,0 +1 @@ +kernel//home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/sensor_spi/sensor_spi.ko diff --git a/device/mpp/extdrv/sensor_spi/sensor_spi.c b/device/mpp/extdrv/sensor_spi/sensor_spi.c new file mode 100644 index 0000000..80c4eae --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/sensor_spi.c @@ -0,0 +1,310 @@ +/* + * Simple synchronous userspace interface to SPI devices + * + * Copyright (C) 2006 SWAPP + * Andrea Paterniani + * Copyright (C) 2007 David Brownell (simplification, cleanup) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "isp_ext.h" + +static unsigned bus_num = 0; +static unsigned csn = 0; +static char* sensor = ""; + +module_param(bus_num, uint, S_IRUGO); +MODULE_PARM_DESC(bus_num, "spi bus number"); + +module_param(csn, uint, S_IRUGO); +MODULE_PARM_DESC(csn, "chip select number"); + +/* some sensor has special dev addr */ +module_param(sensor, charp, S_IRUGO); +MODULE_PARM_DESC(sensor, "sensor name"); + + +struct spi_master* hi_master; +struct spi_device* hi_spi; +extern struct bus_type spi_bus_type; + + +#define SPI_MSG_NUM 20 +typedef struct hi_spi_message_s +{ + struct spi_transfer t; + struct spi_message m; + unsigned char buf[8]; +} spi_message_s; + +typedef struct hi_spi_message_info_s +{ + int msg_idx; + spi_message_s spi_msg_array[SPI_MSG_NUM]; +} spi_message_info_s; + +static spi_message_info_s g_spi_msg = {0}; + + +/***************************************************************** +This function will be called in interrupt route. +So use spi_async, can't call spi_sync here. +*****************************************************************/ +int ssp_write_alt(unsigned int addr1, unsigned int addr1bytenum, + unsigned int addr2, unsigned int addr2bytenum, + unsigned int data , unsigned int databytenum) +{ + struct spi_master* master = hi_master; + struct spi_device* spi = hi_spi; + struct spi_transfer* t; + struct spi_message* m; + unsigned char* buf; + int status = 0; + unsigned long flags; + int buf_idx = 0; + int idx = g_spi_msg.msg_idx; + + g_spi_msg.msg_idx++; + if (g_spi_msg.msg_idx > SPI_MSG_NUM - 1) + { + g_spi_msg.msg_idx = 0; + } + + buf = g_spi_msg.spi_msg_array[idx].buf; + t = &g_spi_msg.spi_msg_array[idx].t; + m = &g_spi_msg.spi_msg_array[idx].m; + + /* check spi_message is or no finish */ + spin_lock_irqsave(&master->queue_lock, flags); + if (m->state != NULL) + { + spin_unlock_irqrestore(&master->queue_lock, flags); + dev_err(&spi->dev, "%s, %s, %d line: spi_message no finish!\n", __FILE__, __func__, __LINE__); + return -EFAULT; + } + spin_unlock_irqrestore(&master->queue_lock, flags); + + spi->mode = SPI_MODE_3 | SPI_LSB_FIRST; + + memset(buf, 0, sizeof(g_spi_msg.spi_msg_array[idx].buf)); + + if (strcmp(sensor, "imx117")) + { + buf[buf_idx++] = addr1 & (~0x80); + } + else + { + /* imx117 has different dev addr format */ + buf[buf_idx++] = addr1; + } + + if (2 == addr2bytenum) + { + buf[buf_idx++] = addr2 >> 8; + } + buf[buf_idx++] = addr2; + + if (2 == databytenum) + { + buf[buf_idx++] = data >> 8; + } + buf[buf_idx++] = data; + + t->tx_buf = buf; + t->rx_buf = buf; + t->len = buf_idx; + t->cs_change = 1; + t->speed_hz = 2000000; + t->bits_per_word = 8; + + spi_message_init(m); + spi_message_add_tail(t, m); + m->state = m; + status = spi_async(spi, m); + if (status) + { + dev_err(&spi->dev, "%s: spi_async() error!\n", __func__); + status = -EFAULT; + } + + return status; +} + +int hi_ssp_write(unsigned int addr1, unsigned int addr1bytenum, + unsigned int addr2, unsigned int addr2bytenum, + unsigned int data , unsigned int databytenum) +{ + if ((addr1bytenum > 1) || (addr2bytenum > 2) || (databytenum > 2)) + { + printk("addr1_num: %d, addr2_num: %d, data_num: %d, bit_width not support now.\n", + addr1bytenum, addr2bytenum, databytenum); + return -1; + } + +#if 0 + printk("addr1: 0x%x, addr1_num: %d, addr2: 0x%x, addr2_num: %d, data: 0x%x, data_num: %d.\n", + addr1, addr1bytenum, addr2, addr2bytenum, data, databytenum); +#endif + return ssp_write_alt(addr1, addr1bytenum, addr2, addr2bytenum, data, databytenum); +} + +/***************************************************************** +This function can't be called in interrupt route because spi_sync will +schedule out. +*****************************************************************/ +int ssp_read_alt(unsigned char devaddr, unsigned char addr, unsigned char* data) +{ + struct spi_master* master = hi_master; + struct spi_device* spi = hi_spi; + int status = 0; + unsigned long flags; + static struct spi_transfer t; + static struct spi_message m; + static unsigned char buf[8]; + int buf_idx = 0; + + /* check spi_message is or no finish */ + spin_lock_irqsave(&master->queue_lock, flags); + if (m.state != NULL) + { + spin_unlock_irqrestore(&master->queue_lock, flags); + dev_err(&spi->dev, "\n**********%s, %s, %d line: spi_message no finish!*********\n", __FILE__, __func__, __LINE__); + return -EFAULT; + } + spin_unlock_irqrestore(&master->queue_lock, flags); + + spi->mode = SPI_MODE_3 | SPI_LSB_FIRST; + + memset(buf, 0, sizeof(buf)); + buf[buf_idx++] = devaddr | 0x80; + + buf[buf_idx++] = addr; + buf[buf_idx++] = 0; + + t.tx_buf = buf; + t.rx_buf = buf; + t.len = buf_idx; + t.cs_change = 1; + t.speed_hz = 2000000; + t.bits_per_word = 8; + + spi_message_init(&m); + spi_message_add_tail(&t, &m); + m.state = &m; + status = spi_sync(spi, &m); + if (status) + { + dev_err(&spi->dev, "%s: spi_async() error!\n", __func__); + status = -EFAULT; + } + + *data = buf[2]; + + printk("func:%s rx_buf = %#x, %#x, %#x\n", __func__, buf[0], buf[1], buf[2]); + return status; +} + +#if 0 +static void ssp_test(void) +{ + unsigned char data; + ssp_write_alt(0x2, 1, 0x14, 1, 0x34, 1); + // wait spi write finish + msleep(1); + ssp_read_alt(0x2, 0x14, &data); +} +#endif + +static int __init sensor_spi_dev_init(void) +{ + int status = 0; + struct spi_master* master; + struct device* dev; + char spi_name[128] = {0}; + + ISP_BUS_CALLBACK_S stBusCb = {0}; + stBusCb.pfnISPWriteSSPData = hi_ssp_write; + if (CKFN_ISP_RegisterBusCallBack()) + { + CALL_ISP_RegisterBusCallBack(0, ISP_BUS_TYPE_SSP, &stBusCb); + } + else + { + printk("register ssp_write_callback to isp failed, ssp init is failed!\n"); + return -1; + } + + master = spi_busnum_to_master(bus_num); + if (master) + { + hi_master = master; + snprintf(spi_name, sizeof(spi_name), "%s.%u", dev_name(&master->dev), csn); + dev = bus_find_device_by_name(&spi_bus_type, NULL, spi_name); + if (dev == NULL) + { + dev_err(NULL, "chipselect %d has not been used\n", csn); + status = -ENXIO; + goto end1; + } + + hi_spi = to_spi_device(dev); + if (hi_spi == NULL) + { + dev_err(dev, "to_spi_device() error!\n"); + status = -ENXIO; + goto end1; + } + } + else + { + dev_err(NULL, "spi_busnum_to_master() error!\n"); + status = -ENXIO; + goto end0; + } + + //ssp_test(); +end1: + put_device(dev); +end0: + return status; +} + +static void __exit sensor_spi_dev_exit(void) +{ + printk("%s, %s, %d line\n", __FILE__, __func__, __LINE__); +} + +module_init(sensor_spi_dev_init); +module_exit(sensor_spi_dev_exit); + +MODULE_AUTHOR("BVT OSDRV"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("sensor spidev"); diff --git a/device/mpp/extdrv/sensor_spi/sensor_spi.h b/device/mpp/extdrv/sensor_spi/sensor_spi.h new file mode 100644 index 0000000..03e3bbc --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/sensor_spi.h @@ -0,0 +1,5 @@ +#ifndef __SENSOR_SPI_H__ +#define __SENSOR_SPI_H__ +int ssp_write_alt(unsigned char devaddr, unsigned char addr, unsigned char data); +int ssp_read_alt(unsigned char devaddr, unsigned char addr, unsigned char* data); +#endif diff --git a/device/mpp/extdrv/sensor_spi/sensor_spi.ko b/device/mpp/extdrv/sensor_spi/sensor_spi.ko new file mode 100644 index 0000000..8b8c343 Binary files /dev/null and b/device/mpp/extdrv/sensor_spi/sensor_spi.ko differ diff --git a/device/mpp/extdrv/sensor_spi/sensor_spi.mod.c b/device/mpp/extdrv/sensor_spi/sensor_spi.mod.c new file mode 100644 index 0000000..147b9f6 --- /dev/null +++ b/device/mpp/extdrv/sensor_spi/sensor_spi.mod.c @@ -0,0 +1,21 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +static const char __module_depends[] +__used +__attribute__((section(".modinfo"))) = +"depends="; + diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.ko.cmd b/device/mpp/extdrv/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.ko.cmd new file mode 100644 index 0000000..e9b2629 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.ko.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.ko := arm-hisiv300-linux-ld -EL -r -T /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/scripts/module-common.lds --build-id -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.ko /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.o diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.mod.o.cmd b/device/mpp/extdrv/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.mod.o.cmd new file mode 100644 index 0000000..d05d146 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.mod.o.cmd @@ -0,0 +1,345 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.mod.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ssp_ili9341v_6bit.mod)" -D"KBUILD_MODNAME=KBUILD_STR(ssp_ili9341v_6bit)" -DMODULE -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.o := \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/vermagic.h \ + include/generated/utsrelease.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.o): diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.o.cmd b/device/mpp/extdrv/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.o.cmd new file mode 100644 index 0000000..dc21a4f --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.o.cmd @@ -0,0 +1,525 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/.ssp_ili9341v_6bit.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ssp_ili9341v_6bit)" -D"KBUILD_MODNAME=KBUILD_STR(ssp_ili9341v_6bit)" -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.o := \ + include/linux/kernel.h \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + include/linux/sysinfo.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + $(wildcard include/config/smp.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + include/linux/version.h \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/fcntl.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/mm.h \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/transparent/hugepage.h) \ + $(wildcard include/config/ksm.h) \ + $(wildcard include/config/proc/fs.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/hugetlbfs.h) \ + include/linux/prio_tree.h \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/have/cmpxchg/double.h) \ + $(wildcard include/config/have/aligned/struct/page.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + arch/arm/include/generated/asm/auxvec.h \ + include/asm-generic/auxvec.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/guard.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/mmu.h \ + $(wildcard include/config/cpu/has/asid.h) \ + include/linux/range.h \ + include/linux/bit_spinlock.h \ + include/linux/shrinker.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable.h \ + $(wildcard include/config/highpte.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/proc-fns.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue-proc.h \ + $(wildcard include/config/cpu/arm610.h) \ + $(wildcard include/config/cpu/arm7tdmi.h) \ + $(wildcard include/config/cpu/arm710.h) \ + $(wildcard include/config/cpu/arm720t.h) \ + $(wildcard include/config/cpu/arm740t.h) \ + $(wildcard include/config/cpu/arm9tdmi.h) \ + $(wildcard include/config/cpu/arm920t.h) \ + $(wildcard include/config/cpu/arm922t.h) \ + $(wildcard include/config/cpu/arm925t.h) \ + $(wildcard include/config/cpu/arm926t.h) \ + $(wildcard include/config/cpu/arm940t.h) \ + $(wildcard include/config/cpu/arm946e.h) \ + $(wildcard include/config/cpu/arm1020.h) \ + $(wildcard include/config/cpu/arm1020e.h) \ + $(wildcard include/config/cpu/arm1022.h) \ + $(wildcard include/config/cpu/arm1026.h) \ + $(wildcard include/config/cpu/mohawk.h) \ + $(wildcard include/config/cpu/feroceon.h) \ + $(wildcard include/config/cpu/v6k.h) \ + $(wildcard include/config/cpu/v7.h) \ + include/asm-generic/pgtable-nopud.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-hwdef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-hwdef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/s390.h) \ + include/linux/huge_mm.h \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/linux/vm_event_item.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/failslab.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + $(wildcard include/config/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + include/linux/kmemleak.h \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/fs.h \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/ima.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/ioctl.h \ + arch/arm/include/generated/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/linux/blk_types.h \ + $(wildcard include/config/blk/dev/integrity.h) \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/fiemap.h \ + include/linux/migrate_mode.h \ + include/linux/quota.h \ + $(wildcard include/config/quota/netlink/interface.h) \ + include/linux/percpu_counter.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/err.h \ + include/linux/magic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/uaccess.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/unified.h \ + $(wildcard include/config/arm/asm/unified.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/io.h \ + $(wildcard include/config/need/mach/io/h.h) \ + $(wildcard include/config/pcmcia/soc/common.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/isa.h) \ + $(wildcard include/config/pccard.h) \ + include/asm-generic/pci_iomap.h \ + $(wildcard include/config/no/generic/pci/ioport/map.h) \ + $(wildcard include/config/generic/pci/iomap.h) \ + arch/arm/mach-hi3518ev200/include/mach/io.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/exec.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/switch_to.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_info.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_misc.h \ + include/linux/miscdevice.h \ + include/linux/major.h \ + include/linux/pm.h \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/pm/runtime.h) \ + $(wildcard include/config/pm/clk.h) \ + $(wildcard include/config/pm/generic/domains.h) \ + include/linux/delay.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/delay.h \ + include/linux/poll.h \ + arch/arm/include/generated/asm/poll.h \ + include/asm-generic/poll.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irq.h \ + $(wildcard include/config/sparse/irq.h) \ + arch/arm/mach-hi3518ev200/include/mach/irqs.h \ + include/linux/ioport.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/hardirqs.h) \ + $(wildcard include/config/irq/forced/threading.h) \ + $(wildcard include/config/generic/irq/probe.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + $(wildcard include/config/irq/time/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hardirq.h \ + include/linux/irq_cpustat.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + $(wildcard include/config/timerfd.h) \ + include/linux/timerqueue.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/hi_ssp.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.o): diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/.tmp_versions/ssp_ili9341v_6bit.mod b/device/mpp/extdrv/ssp-ili9341v-6bit/.tmp_versions/ssp_ili9341v_6bit.mod new file mode 100644 index 0000000..1f320b5 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/.tmp_versions/ssp_ili9341v_6bit.mod @@ -0,0 +1,2 @@ +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.ko +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.o diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/Makefile b/device/mpp/extdrv/ssp-ili9341v-6bit/Makefile new file mode 100644 index 0000000..d9dc4e5 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/Makefile @@ -0,0 +1,22 @@ + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +obj-m := ssp_ili9341v_6bit.o +ssp-y += hi_ssp.o + +EXTRA_CFLAGS += -I$(REL_INC) +EXTRA_CFLAGS += $(DRV_CFLAGS) + +default: + + make -C $(LINUX_ROOT) M=$(PWD) modules + + + + +clean: + make -C $(LINUX_ROOT) M=$(PWD) clean + rm -f lcd_write_cmd lcd_write_cmd16 lcd_write_dat diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/Module.symvers b/device/mpp/extdrv/ssp-ili9341v-6bit/Module.symvers new file mode 100644 index 0000000..e69de29 diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/hi_ssp.h b/device/mpp/extdrv/ssp-ili9341v-6bit/hi_ssp.h new file mode 100644 index 0000000..6ea6992 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/hi_ssp.h @@ -0,0 +1,28 @@ +/* + * extdrv/include/hi_ssp.h for Linux . + * + * History: + * 2006-4-11 create this file + */ + +#ifndef __HI_SSP_H__ +#define __HI_SSP_H__ + +#define SSP_LCD_READ_ALT 0x1 +#define SSP_LCD_WRITE_CMD 0X3 +#define SSP_LCD_WRITE_DAT 0X5 +#define SSP_LCD_WRITE_CMD16 0X7 + +int hi_ssp_set_frameform(unsigned char framemode, unsigned char spo, unsigned char sph, unsigned char datawidth); +int hi_ssp_readdata(void); +void hi_ssp_writedata(unsigned short data); + +void hi_ssp_enable(void); +void hi_ssp_disable(void); + +int hi_ssp_set_serialclock(unsigned char, unsigned char); + +void spi_write_a9byte(unsigned char cmd_dat, unsigned char dat); + +#endif + diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/modules.order b/device/mpp/extdrv/ssp-ili9341v-6bit/modules.order new file mode 100644 index 0000000..30fb27f --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/modules.order @@ -0,0 +1 @@ +kernel//home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9341v-6bit/ssp_ili9341v_6bit.ko diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/ssp_ili9341v_6bit.c b/device/mpp/extdrv/ssp-ili9341v-6bit/ssp_ili9341v_6bit.c new file mode 100644 index 0000000..7416534 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/ssp_ili9341v_6bit.c @@ -0,0 +1,542 @@ +/* extdrv/interface/ssp/hi_ssp.c + * + * Copyright (c) 2006 Hisilicon Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + * History: + * 21-April-2006 create this file + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + + +#include "hi_ssp.h" + +#define ssp_readw(addr,ret) (ret =(*(volatile unsigned int *)(addr))) +#define ssp_writew(addr,value) ((*(volatile unsigned int *)(addr)) = (value)) + +#define HI_REG_READ(addr,ret) (ret =(*(volatile unsigned int *)(addr))) +#define HI_REG_WRITE(addr,value) ((*(volatile unsigned int *)(addr)) = (value)) + +#define SSP_BASE 0x200E0000 +#define SSP_SIZE 0x10000 // 64KB +#define SSP_INT 65 // Interrupt No. + +void __iomem* reg_ssp_base_va; +#define IO_ADDRESS_VERIFY(x) (reg_ssp_base_va + ((x)-(SSP_BASE))) + +/* SSP register definition .*/ +#define SSP_CR0 IO_ADDRESS_VERIFY(SSP_BASE + 0x00) +#define SSP_CR1 IO_ADDRESS_VERIFY(SSP_BASE + 0x04) +#define SSP_DR IO_ADDRESS_VERIFY(SSP_BASE + 0x08) +#define SSP_SR IO_ADDRESS_VERIFY(SSP_BASE + 0x0C) +#define SSP_CPSR IO_ADDRESS_VERIFY(SSP_BASE + 0x10) +#define SSP_IMSC IO_ADDRESS_VERIFY(SSP_BASE + 0x14) +#define SSP_RIS IO_ADDRESS_VERIFY(SSP_BASE + 0x18) +#define SSP_MIS IO_ADDRESS_VERIFY(SSP_BASE + 0x1C) +#define SSP_ICR IO_ADDRESS_VERIFY(SSP_BASE + 0x20) +#define SSP_DMACR IO_ADDRESS_VERIFY(SSP_BASE + 0x24) + + + + +void hi_ssp_writeOnly(int bWriteOnly) +{ + int ret = 0; + + bWriteOnly = 0; + + ssp_readw(SSP_CR1, ret); + + if (bWriteOnly) + { + ret = ret | (0x1 << 5); + } + else + { + ret = ret & (~(0x1 << 5)); + } + + ssp_writew(SSP_CR1, ret); +} + + +void hi_ssp_enable(void) +{ + int ret = 0; + ssp_readw(SSP_CR1, ret); + ret = (ret & 0xFFFD) | 0x2; + + ret = ret | (0x1 << 4); /* big/little end, 1: little, 0: big */ + + ret = ret | (0x1 << 15); /* wait en */ + + ssp_writew(SSP_CR1, ret); + + hi_ssp_writeOnly(0); +} + + +void hi_ssp_disable(void) +{ + int ret = 0; + ssp_readw(SSP_CR1, ret); + ret = ret & (~(0x1 << 1)); + ssp_writew(SSP_CR1, ret); +} + +int hi_ssp_set_frameform(unsigned char framemode, unsigned char spo, unsigned char sph, unsigned char datawidth) +{ + int ret = 0; + ssp_readw(SSP_CR0, ret); + if (framemode > 3) + { + printk("set frame parameter err.\n"); + return -1; + } + ret = (ret & 0xFFCF) | (framemode << 4); + if ((ret & 0x30) == 0) + { + if (spo > 1) + { + printk("set spo parameter err.\n"); + return -1; + } + if (sph > 1) + { + printk("set sph parameter err.\n"); + return -1; + } + ret = (ret & 0xFF3F) | (sph << 7) | (spo << 6); + } + if ((datawidth > 16) || (datawidth < 4)) + { + printk("set datawidth parameter err.\n"); + return -1; + } + ret = (ret & 0xFFF0) | (datawidth - 1); + ssp_writew(SSP_CR0, ret); + return 0; +} + + +int hi_ssp_set_serialclock(unsigned char scr, unsigned char cpsdvsr) +{ + int ret = 0; + ssp_readw(SSP_CR0, ret); + ret = (ret & 0xFF) | (scr << 8); + ssp_writew(SSP_CR0, ret); + if ((cpsdvsr & 0x1)) + { + printk("set cpsdvsr parameter err.\n"); + return -1; + } + ssp_writew(SSP_CPSR, cpsdvsr); + return 0; +} + +int hi_ssp_alt_mode_set(int enable) +{ + int ret = 0; + + ssp_readw(SSP_CR1, ret); + if (enable) + { + ret = ret & (~0x40); + } + else + { + ret = (ret & 0xFF) | 0x40; + } + ssp_writew(SSP_CR1, ret); + + return 0; +} + + +void hi_ssp_writedata(unsigned short sdata) +{ + ssp_writew(SSP_DR, sdata); + udelay(2); +} + +int hi_ssp_readdata(void) +{ + int ret = 0; + ssp_readw(SSP_DR, ret); + return ret; +} + + +static void spi_enable(void) +{ + HI_REG_WRITE(SSP_CR1, 0x42); +} + +static void spi_disable(void) +{ + HI_REG_WRITE(SSP_CR1, 0x40); +} + + +int hi_ssp_lcd_init_cfg(void) +{ + unsigned char framemode = 0; + unsigned char spo = 1; + unsigned char sph = 1; + unsigned char datawidth = 9; + +#ifdef HI_FPGA + unsigned char scr = 1; + unsigned char cpsdvsr = 2; +#else + unsigned char scr = 8; + unsigned char cpsdvsr = 8; +#endif + + spi_disable(); + + hi_ssp_set_frameform(framemode, spo, sph, datawidth); + + hi_ssp_set_serialclock(scr, cpsdvsr); + + hi_ssp_alt_mode_set(1); + + hi_ssp_enable(); + + return 0; +} + +void spi_write_a9byte(unsigned char cmd_dat, unsigned char dat) +{ + unsigned short spi_data = 0; + + if (cmd_dat) + { + spi_data = 1 << 8; + } + else + { + spi_data = 0 << 8; + } + + spi_data = spi_data | dat; + spi_enable(); + //hi_ssp_writedata(spi_data); + ssp_writew(SSP_DR, spi_data); + printk("spi_data:0x%x\n", spi_data); + msleep(10); + spi_disable(); +} + +void spi_write_a16byte(unsigned short spi_dat) +{ + spi_enable(); + //hi_ssp_writedata(spi_data); + ssp_writew(SSP_DR, spi_dat); + printk("spi_data:0x%x\n", spi_dat); + msleep(10); + spi_disable(); +} + +void ssp_write_dat(unsigned char dat) +{ + spi_write_a9byte(1, dat); +} + +void ssp_write_cmd(unsigned char dat) +{ + spi_write_a9byte(0, dat); +} + +long ssp_lcd_ioctl(struct file* file, unsigned int cmd, unsigned long arg) +{ + unsigned char val; + unsigned short val_16; + + switch (cmd) + { + case SSP_LCD_READ_ALT: + + break; + + case SSP_LCD_WRITE_CMD: + val = *(unsigned int*)arg; + spi_write_a9byte(0, val); + //printk("SSP_LCD_WRITE_CMD!\n"); + break; + + case SSP_LCD_WRITE_DAT: + val = *(unsigned int*)arg; + spi_write_a9byte(1, val); + break; + + case SSP_LCD_WRITE_CMD16: + val_16 = *(unsigned int*)arg; + spi_write_a16byte(val_16); + break; + + default: + { + printk("Kernel: No such ssp command %#x!\n", cmd); + return -1; + } + } + + return 0; +} + +int ssp_lcd_open(struct inode* inode, struct file* file) +{ + return 0; +} +int ssp_lcd_close(struct inode* inode, struct file* file) +{ + return 0; +} + + +static struct file_operations ssp_lcd_fops = +{ + .owner = THIS_MODULE, + .unlocked_ioctl = ssp_lcd_ioctl, + .open = ssp_lcd_open, + .release = ssp_lcd_close +}; + + +static struct miscdevice ssp_lcd_dev = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "ssp_lcd", + .fops = &ssp_lcd_fops, +}; + + + +void lcd_ili9341_init_vertical_serial(void) +{ + /*spi_9bit_setting*/ + unsigned char framemode = 0; + unsigned char spo = 1; + unsigned char sph = 1; + unsigned char datawidth = 9; +#ifdef HI_FPGA + unsigned char scr = 1; + unsigned char cpsdvsr = 2; +#else + unsigned char scr = 8; + unsigned char cpsdvsr = 8; +#endif + spi_disable(); + hi_ssp_set_frameform(framemode, spo, sph, datawidth); + hi_ssp_set_serialclock(scr, cpsdvsr); + hi_ssp_alt_mode_set(1); + hi_ssp_enable(); + //ssp_write_cmd(0x01);//software reset + + ssp_write_cmd(0xCF); //power control + ssp_write_dat(0x00); + //ssp_write_dat(0xCB); + ssp_write_dat(0x8B); + ssp_write_dat(0X30); + + ssp_write_cmd(0xED); //power on sequence control޸ĬֵûЧ + ssp_write_dat(0x64); + ssp_write_dat(0x03); + ssp_write_dat(0X12); + ssp_write_dat(0X81); + + ssp_write_cmd(0xE8); //Drive timing control + ssp_write_dat(0x85); + ssp_write_dat(0x10); + ssp_write_dat(0x7A); + + ssp_write_cmd(0xCB); + ssp_write_dat(0x39); + ssp_write_dat(0x2C); + ssp_write_dat(0x00); + ssp_write_dat(0x34); + ssp_write_dat(0x02); + + ssp_write_cmd(0xF7); //Pump ratio control + ssp_write_dat(0x20); + + ssp_write_cmd(0xEA); + ssp_write_dat(0x00); + ssp_write_dat(0x00); + + ssp_write_cmd(0xC0); //Power control + ssp_write_dat(0x21); //VRH[5:0] + + ssp_write_cmd(0xC1); //Power control + ssp_write_dat(0x11); //SAP[2:0];BT[3:0] + + ssp_write_cmd(0xC5); //VCM control + //ssp_write_dat(0x3F); + ssp_write_dat(0x00); + //ssp_write_dat(0x3C); + ssp_write_dat(0x24); + + ssp_write_cmd(0xC7); //VCM control2 + ssp_write_dat(0XAF); + + ssp_write_cmd(0x36); // Memory Access Control ޸RGB/BGR + ssp_write_dat(0x08); + + ssp_write_cmd(0x3A); + ssp_write_dat(0x55); + + ssp_write_cmd(0xB1); //ILI9341 FRAME RATE + ssp_write_dat(0x00); + // ssp_write_dat(0x1B); + //ssp_write_dat(0x1C); //68֡ + ssp_write_dat(0x12); //106֡ + + ssp_write_cmd(0xB6); // Display Function Control Ըıʾ + ssp_write_dat(0x0A); + ssp_write_dat(0xA2); + + /////////////////RGB REGIST//////// + ssp_write_cmd(0xB0); //RGB Interface Signal Control + //ssp_write_dat(0x6C); + ssp_write_dat(0xCC); + + ssp_write_cmd(0xF6); + ssp_write_dat(0x01); + //ssp_write_dat(0x00); + ssp_write_dat(0x10); + //ssp_write_dat(0x06); //16bit + ssp_write_dat(0x07); //6bit + /////////////////////////////////// + + ssp_write_cmd(0xF2); // 3Gamma Function Disable + ssp_write_dat(0x00); + + ssp_write_cmd(0x26); //Gamma curve selected + ssp_write_dat(0x01); + + ssp_write_cmd(0xE0); //Set Gamma + ssp_write_dat(0x0F); + ssp_write_dat(0x15); + ssp_write_dat(0x1C); + ssp_write_dat(0x1B); + ssp_write_dat(0x08); + ssp_write_dat(0x0F); + ssp_write_dat(0x48); + ssp_write_dat(0xB8); + ssp_write_dat(0x34); + ssp_write_dat(0x00); + ssp_write_dat(0x0F); + ssp_write_dat(0x01); + ssp_write_dat(0x0F); + ssp_write_dat(0x0C); + ssp_write_dat(0x00); + + ssp_write_cmd(0XE1); //Set Gamma + ssp_write_dat(0x00); + ssp_write_dat(0x2A); + ssp_write_dat(0x24); + ssp_write_dat(0x07); + ssp_write_dat(0x10); + ssp_write_dat(0x07); + ssp_write_dat(0x38); + ssp_write_dat(0x47); + ssp_write_dat(0x4B); + ssp_write_dat(0x0F); + ssp_write_dat(0x10); + ssp_write_dat(0x0E); + ssp_write_dat(0x30); + ssp_write_dat(0x33); + ssp_write_dat(0x0F); + + ssp_write_cmd(0x11); //Exit Sleep + msleep(120); + ssp_write_cmd(0x29); +} + + + + + + +static int __init hi_ssp_lcd_init(void) +{ + int ret; + + reg_ssp_base_va = ioremap_nocache((unsigned long)SSP_BASE, (unsigned long)SSP_SIZE); + if (!reg_ssp_base_va) + { + printk("Kernel: ioremap ssp base failed!\n"); + return -ENOMEM; + } + + ret = misc_register(&ssp_lcd_dev); + if (0 != ret) + { + printk("Kernel: register ssp_0 device failed!\n"); + return -1; + } + printk("lcd is ili9341_vertical_serial\n"); + lcd_ili9341_init_vertical_serial(); + printk("Kernel: ssp_lcd initial ok!\n"); + + return 0; + +} + +static void __exit hi_ssp_lcd_exit(void) +{ + + hi_ssp_disable(); + + iounmap((void*)reg_ssp_base_va); + + misc_deregister(&ssp_lcd_dev); +} + + + +module_init(hi_ssp_lcd_init); +module_exit(hi_ssp_lcd_exit); + +MODULE_LICENSE("GPL"); + diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/ssp_ili9341v_6bit.ko b/device/mpp/extdrv/ssp-ili9341v-6bit/ssp_ili9341v_6bit.ko new file mode 100644 index 0000000..afb7bb4 Binary files /dev/null and b/device/mpp/extdrv/ssp-ili9341v-6bit/ssp_ili9341v_6bit.ko differ diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.c b/device/mpp/extdrv/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.c new file mode 100644 index 0000000..147b9f6 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/ssp_ili9341v_6bit.mod.c @@ -0,0 +1,21 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +static const char __module_depends[] +__used +__attribute__((section(".modinfo"))) = +"depends="; + diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/strfunc.c b/device/mpp/extdrv/ssp-ili9341v-6bit/strfunc.c new file mode 100644 index 0000000..3d90f79 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/strfunc.c @@ -0,0 +1,172 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : String functions + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#include +#include +#include "strfunc.h" + +static int atoul(char* str, unsigned int* pulValue); +static int atoulx(char* str, unsigned int* pulValue); + + +/***************************************************************************** + Prototype : StrToNumber + Description : 10/16 ַתΪ޷֡ + Input args : IN CHAR *str + 10ַ, ܷ + 16ַ, ǰ׺0x. ABCDE + + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ + +int StrToNumber(char* str , unsigned int* pulValue) +{ + /*жǷ16Ƶַ*/ + if ( *str == '0' && (*(str + 1) == 'x' || *(str + 1) == 'X') ) + { + if (*(str + 2) == '\0') + { + return -1; + } + else + { + return atoulx(str + 2, pulValue); + } + } + else + { + return atoul(str, pulValue); + } +} + +/***************************************************************************** + Prototype : atoul + Description : 10ַתΪ޷֡ + Input args : IN CHAR *str 10ַ + ܷ + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +static int atoul(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + + while (*str) + { + if (isdigit((int)*str)) + { + /*ֵ֧0xFFFFFFFF(4294967295), + X * 10 + (*str)-48 <= 4294967295 + ԣ X = 429496729 */ + if ((ulResult < 429496729) || ((ulResult == 429496729) && (*str < '6'))) + { + ulResult = ulResult * 10 + (*str) - 48; + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + *pulValue = ulResult; + return 0; +} + + + +/***************************************************************************** + Prototype : atoulx + Description : 16ַתΪ޷֡16ַǰ׺0x + Input args : IN CHAR *str 16ַ, ǰ׺0x. ABCDE + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : toupper + isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +#define ASC2NUM(ch) (ch - '0') +#define HEXASC2NUM(ch) (ch - 'A' + 10) + +int atoulx(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + unsigned char ch; + + while (*str) + { + ch = toupper(*str); + if (isdigit(ch) || ((ch >= 'A') && (ch <= 'F' ))) + { + if (ulResult < 0x10000000) + { + ulResult = (ulResult << 4) + ((ch <= '9') ? (ASC2NUM(ch)) : (HEXASC2NUM(ch))); + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + + *pulValue = ulResult; + return 0; +} + + + diff --git a/device/mpp/extdrv/ssp-ili9341v-6bit/strfunc.h b/device/mpp/extdrv/ssp-ili9341v-6bit/strfunc.h new file mode 100644 index 0000000..9ef32f2 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9341v-6bit/strfunc.h @@ -0,0 +1,44 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : strfunc.c header file + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#ifndef __STRFUNC_H__ +#define __STRFUNC_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define STRFMT_ADDR32 "%#010lX" +#define STRFMT_ADDR32_2 "0x%08lX" + +extern int StrToNumber(char* str , unsigned int* ulValue); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __STRFUNC_H__ */ diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.ko.cmd b/device/mpp/extdrv/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.ko.cmd new file mode 100644 index 0000000..1873c47 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.ko.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.ko := arm-hisiv300-linux-ld -EL -r -T /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/scripts/module-common.lds --build-id -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.ko /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.o diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.mod.o.cmd b/device/mpp/extdrv/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.mod.o.cmd new file mode 100644 index 0000000..c79dc9b --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.mod.o.cmd @@ -0,0 +1,345 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.mod.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ssp_ili9342h_6bit.mod)" -D"KBUILD_MODNAME=KBUILD_STR(ssp_ili9342h_6bit)" -DMODULE -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.o := \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/vermagic.h \ + include/generated/utsrelease.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.o): diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.o.cmd b/device/mpp/extdrv/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.o.cmd new file mode 100644 index 0000000..6c32b12 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.o.cmd @@ -0,0 +1,525 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/.ssp_ili9342h_6bit.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ssp_ili9342h_6bit)" -D"KBUILD_MODNAME=KBUILD_STR(ssp_ili9342h_6bit)" -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.o := \ + include/linux/kernel.h \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + include/linux/sysinfo.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + $(wildcard include/config/smp.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + include/linux/version.h \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/fcntl.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/mm.h \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/transparent/hugepage.h) \ + $(wildcard include/config/ksm.h) \ + $(wildcard include/config/proc/fs.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/hugetlbfs.h) \ + include/linux/prio_tree.h \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/have/cmpxchg/double.h) \ + $(wildcard include/config/have/aligned/struct/page.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + arch/arm/include/generated/asm/auxvec.h \ + include/asm-generic/auxvec.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/guard.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/mmu.h \ + $(wildcard include/config/cpu/has/asid.h) \ + include/linux/range.h \ + include/linux/bit_spinlock.h \ + include/linux/shrinker.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable.h \ + $(wildcard include/config/highpte.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/proc-fns.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue-proc.h \ + $(wildcard include/config/cpu/arm610.h) \ + $(wildcard include/config/cpu/arm7tdmi.h) \ + $(wildcard include/config/cpu/arm710.h) \ + $(wildcard include/config/cpu/arm720t.h) \ + $(wildcard include/config/cpu/arm740t.h) \ + $(wildcard include/config/cpu/arm9tdmi.h) \ + $(wildcard include/config/cpu/arm920t.h) \ + $(wildcard include/config/cpu/arm922t.h) \ + $(wildcard include/config/cpu/arm925t.h) \ + $(wildcard include/config/cpu/arm926t.h) \ + $(wildcard include/config/cpu/arm940t.h) \ + $(wildcard include/config/cpu/arm946e.h) \ + $(wildcard include/config/cpu/arm1020.h) \ + $(wildcard include/config/cpu/arm1020e.h) \ + $(wildcard include/config/cpu/arm1022.h) \ + $(wildcard include/config/cpu/arm1026.h) \ + $(wildcard include/config/cpu/mohawk.h) \ + $(wildcard include/config/cpu/feroceon.h) \ + $(wildcard include/config/cpu/v6k.h) \ + $(wildcard include/config/cpu/v7.h) \ + include/asm-generic/pgtable-nopud.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-hwdef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-hwdef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/s390.h) \ + include/linux/huge_mm.h \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/linux/vm_event_item.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/failslab.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + $(wildcard include/config/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + include/linux/kmemleak.h \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/fs.h \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/ima.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/ioctl.h \ + arch/arm/include/generated/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/linux/blk_types.h \ + $(wildcard include/config/blk/dev/integrity.h) \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/fiemap.h \ + include/linux/migrate_mode.h \ + include/linux/quota.h \ + $(wildcard include/config/quota/netlink/interface.h) \ + include/linux/percpu_counter.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/err.h \ + include/linux/magic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/uaccess.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/unified.h \ + $(wildcard include/config/arm/asm/unified.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/io.h \ + $(wildcard include/config/need/mach/io/h.h) \ + $(wildcard include/config/pcmcia/soc/common.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/isa.h) \ + $(wildcard include/config/pccard.h) \ + include/asm-generic/pci_iomap.h \ + $(wildcard include/config/no/generic/pci/ioport/map.h) \ + $(wildcard include/config/generic/pci/iomap.h) \ + arch/arm/mach-hi3518ev200/include/mach/io.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/exec.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/switch_to.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_info.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_misc.h \ + include/linux/miscdevice.h \ + include/linux/major.h \ + include/linux/pm.h \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/pm/runtime.h) \ + $(wildcard include/config/pm/clk.h) \ + $(wildcard include/config/pm/generic/domains.h) \ + include/linux/delay.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/delay.h \ + include/linux/poll.h \ + arch/arm/include/generated/asm/poll.h \ + include/asm-generic/poll.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irq.h \ + $(wildcard include/config/sparse/irq.h) \ + arch/arm/mach-hi3518ev200/include/mach/irqs.h \ + include/linux/ioport.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/hardirqs.h) \ + $(wildcard include/config/irq/forced/threading.h) \ + $(wildcard include/config/generic/irq/probe.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + $(wildcard include/config/irq/time/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hardirq.h \ + include/linux/irq_cpustat.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + $(wildcard include/config/timerfd.h) \ + include/linux/timerqueue.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/hi_ssp.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.o): diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/.tmp_versions/ssp_ili9342h_6bit.mod b/device/mpp/extdrv/ssp-ili9342h-6bit/.tmp_versions/ssp_ili9342h_6bit.mod new file mode 100644 index 0000000..45e4a64 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/.tmp_versions/ssp_ili9342h_6bit.mod @@ -0,0 +1,2 @@ +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.ko +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.o diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/Makefile b/device/mpp/extdrv/ssp-ili9342h-6bit/Makefile new file mode 100644 index 0000000..5083208 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/Makefile @@ -0,0 +1,23 @@ + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +obj-m := ssp_ili9342h_6bit.o +ssp-y += hi_ssp.o + +EXTRA_CFLAGS += -I$(REL_INC) +EXTRA_CFLAGS += $(DRV_CFLAGS) + +default: + + + make -C $(LINUX_ROOT) M=$(PWD) modules + + + + +clean: + make -C $(LINUX_ROOT) M=$(PWD) clean + rm -f lcd_write_cmd lcd_write_cmd16 lcd_write_dat diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/Module.symvers b/device/mpp/extdrv/ssp-ili9342h-6bit/Module.symvers new file mode 100644 index 0000000..e69de29 diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/hi_ssp.h b/device/mpp/extdrv/ssp-ili9342h-6bit/hi_ssp.h new file mode 100644 index 0000000..6ea6992 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/hi_ssp.h @@ -0,0 +1,28 @@ +/* + * extdrv/include/hi_ssp.h for Linux . + * + * History: + * 2006-4-11 create this file + */ + +#ifndef __HI_SSP_H__ +#define __HI_SSP_H__ + +#define SSP_LCD_READ_ALT 0x1 +#define SSP_LCD_WRITE_CMD 0X3 +#define SSP_LCD_WRITE_DAT 0X5 +#define SSP_LCD_WRITE_CMD16 0X7 + +int hi_ssp_set_frameform(unsigned char framemode, unsigned char spo, unsigned char sph, unsigned char datawidth); +int hi_ssp_readdata(void); +void hi_ssp_writedata(unsigned short data); + +void hi_ssp_enable(void); +void hi_ssp_disable(void); + +int hi_ssp_set_serialclock(unsigned char, unsigned char); + +void spi_write_a9byte(unsigned char cmd_dat, unsigned char dat); + +#endif + diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/modules.order b/device/mpp/extdrv/ssp-ili9342h-6bit/modules.order new file mode 100644 index 0000000..cdd57c7 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/modules.order @@ -0,0 +1 @@ +kernel//home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ili9342h-6bit/ssp_ili9342h_6bit.ko diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/ssp_ili9342h_6bit.c b/device/mpp/extdrv/ssp-ili9342h-6bit/ssp_ili9342h_6bit.c new file mode 100644 index 0000000..4eb495b --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/ssp_ili9342h_6bit.c @@ -0,0 +1,525 @@ +/* extdrv/interface/ssp/hi_ssp.c + * + * Copyright (c) 2006 Hisilicon Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + * History: + * 21-April-2006 create this file + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + + +#include "hi_ssp.h" + +#define ssp_readw(addr,ret) (ret =(*(volatile unsigned int *)(addr))) +#define ssp_writew(addr,value) ((*(volatile unsigned int *)(addr)) = (value)) + +#define HI_REG_READ(addr,ret) (ret =(*(volatile unsigned int *)(addr))) +#define HI_REG_WRITE(addr,value) ((*(volatile unsigned int *)(addr)) = (value)) + +#define SSP_BASE 0x200E0000 +#define SSP_SIZE 0x10000 // 64KB +#define SSP_INT 65 // Interrupt No. + +void __iomem* reg_ssp_base_va; +#define IO_ADDRESS_VERIFY(x) (reg_ssp_base_va + ((x)-(SSP_BASE))) + +/* SSP register definition .*/ +#define SSP_CR0 IO_ADDRESS_VERIFY(SSP_BASE + 0x00) +#define SSP_CR1 IO_ADDRESS_VERIFY(SSP_BASE + 0x04) +#define SSP_DR IO_ADDRESS_VERIFY(SSP_BASE + 0x08) +#define SSP_SR IO_ADDRESS_VERIFY(SSP_BASE + 0x0C) +#define SSP_CPSR IO_ADDRESS_VERIFY(SSP_BASE + 0x10) +#define SSP_IMSC IO_ADDRESS_VERIFY(SSP_BASE + 0x14) +#define SSP_RIS IO_ADDRESS_VERIFY(SSP_BASE + 0x18) +#define SSP_MIS IO_ADDRESS_VERIFY(SSP_BASE + 0x1C) +#define SSP_ICR IO_ADDRESS_VERIFY(SSP_BASE + 0x20) +#define SSP_DMACR IO_ADDRESS_VERIFY(SSP_BASE + 0x24) + + + + +void hi_ssp_writeOnly(int bWriteOnly) +{ + int ret = 0; + + bWriteOnly = 0; + + ssp_readw(SSP_CR1, ret); + + if (bWriteOnly) + { + ret = ret | (0x1 << 5); + } + else + { + ret = ret & (~(0x1 << 5)); + } + + ssp_writew(SSP_CR1, ret); +} + + +void hi_ssp_enable(void) +{ + int ret = 0; + ssp_readw(SSP_CR1, ret); + ret = (ret & 0xFFFD) | 0x2; + + ret = ret | (0x1 << 4); /* big/little end, 1: little, 0: big */ + + ret = ret | (0x1 << 15); /* wait en */ + + ssp_writew(SSP_CR1, ret); + + hi_ssp_writeOnly(0); +} + + +void hi_ssp_disable(void) +{ + int ret = 0; + ssp_readw(SSP_CR1, ret); + ret = ret & (~(0x1 << 1)); + ssp_writew(SSP_CR1, ret); +} + +int hi_ssp_set_frameform(unsigned char framemode, unsigned char spo, unsigned char sph, unsigned char datawidth) +{ + int ret = 0; + ssp_readw(SSP_CR0, ret); + if (framemode > 3) + { + printk("set frame parameter err.\n"); + return -1; + } + ret = (ret & 0xFFCF) | (framemode << 4); + if ((ret & 0x30) == 0) + { + if (spo > 1) + { + printk("set spo parameter err.\n"); + return -1; + } + if (sph > 1) + { + printk("set sph parameter err.\n"); + return -1; + } + ret = (ret & 0xFF3F) | (sph << 7) | (spo << 6); + } + if ((datawidth > 16) || (datawidth < 4)) + { + printk("set datawidth parameter err.\n"); + return -1; + } + ret = (ret & 0xFFF0) | (datawidth - 1); + ssp_writew(SSP_CR0, ret); + return 0; +} + + +int hi_ssp_set_serialclock(unsigned char scr, unsigned char cpsdvsr) +{ + int ret = 0; + ssp_readw(SSP_CR0, ret); + ret = (ret & 0xFF) | (scr << 8); + ssp_writew(SSP_CR0, ret); + if ((cpsdvsr & 0x1)) + { + printk("set cpsdvsr parameter err.\n"); + return -1; + } + ssp_writew(SSP_CPSR, cpsdvsr); + return 0; +} + +int hi_ssp_alt_mode_set(int enable) +{ + int ret = 0; + + ssp_readw(SSP_CR1, ret); + if (enable) + { + ret = ret & (~0x40); + } + else + { + ret = (ret & 0xFF) | 0x40; + } + ssp_writew(SSP_CR1, ret); + + return 0; +} + + +void hi_ssp_writedata(unsigned short sdata) +{ + ssp_writew(SSP_DR, sdata); + udelay(2); +} + +int hi_ssp_readdata(void) +{ + int ret = 0; + ssp_readw(SSP_DR, ret); + return ret; +} + + +static void spi_enable(void) +{ + HI_REG_WRITE(SSP_CR1, 0x42); +} + +static void spi_disable(void) +{ + HI_REG_WRITE(SSP_CR1, 0x40); +} + + +int hi_ssp_lcd_init_cfg(void) +{ + unsigned char framemode = 0; + unsigned char spo = 1; + unsigned char sph = 1; + unsigned char datawidth = 9; + +#ifdef HI_FPGA + unsigned char scr = 1; + unsigned char cpsdvsr = 2; +#else + unsigned char scr = 8; + unsigned char cpsdvsr = 8; +#endif + + spi_disable(); + + hi_ssp_set_frameform(framemode, spo, sph, datawidth); + + hi_ssp_set_serialclock(scr, cpsdvsr); + + hi_ssp_alt_mode_set(1); + + hi_ssp_enable(); + + return 0; +} + +void spi_write_a9byte(unsigned char cmd_dat, unsigned char dat) +{ + unsigned short spi_data = 0; + + if (cmd_dat) + { + spi_data = 1 << 8; + } + else + { + spi_data = 0 << 8; + } + + spi_data = spi_data | dat; + spi_enable(); + //hi_ssp_writedata(spi_data); + ssp_writew(SSP_DR, spi_data); + printk("spi_data:0x%x\n", spi_data); + msleep(10); + spi_disable(); +} + +void spi_write_a16byte(unsigned short spi_dat) +{ + spi_enable(); + //hi_ssp_writedata(spi_data); + ssp_writew(SSP_DR, spi_dat); + printk("spi_data:0x%x\n", spi_dat); + msleep(10); + spi_disable(); +} + +void ssp_write_dat(unsigned char dat) +{ + spi_write_a9byte(1, dat); +} + +void ssp_write_cmd(unsigned char dat) +{ + spi_write_a9byte(0, dat); +} + +long ssp_lcd_ioctl(struct file* file, unsigned int cmd, unsigned long arg) +{ + unsigned char val; + unsigned short val_16; + + switch (cmd) + { + case SSP_LCD_READ_ALT: + + break; + + case SSP_LCD_WRITE_CMD: + val = *(unsigned int*)arg; + spi_write_a9byte(0, val); + //printk("SSP_LCD_WRITE_CMD!\n"); + break; + + case SSP_LCD_WRITE_DAT: + val = *(unsigned int*)arg; + spi_write_a9byte(1, val); + break; + + case SSP_LCD_WRITE_CMD16: + val_16 = *(unsigned int*)arg; + spi_write_a16byte(val_16); + break; + + default: + { + printk("Kernel: No such ssp command %#x!\n", cmd); + return -1; + } + } + + return 0; +} + +int ssp_lcd_open(struct inode* inode, struct file* file) +{ + return 0; +} +int ssp_lcd_close(struct inode* inode, struct file* file) +{ + return 0; +} + + +static struct file_operations ssp_lcd_fops = +{ + .owner = THIS_MODULE, + .unlocked_ioctl = ssp_lcd_ioctl, + .open = ssp_lcd_open, + .release = ssp_lcd_close +}; + + +static struct miscdevice ssp_lcd_dev = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "ssp_lcd", + .fops = &ssp_lcd_fops, +}; + +void lcd_ili9342c_init_horizontal_all(void) +{ + /*spi_9bit_setting*/ + unsigned char framemode = 0; + unsigned char spo = 1; + unsigned char sph = 1; + unsigned char datawidth = 9; +#ifdef HI_FPGA + unsigned char scr = 1; + unsigned char cpsdvsr = 2; +#else + unsigned char scr = 8; + unsigned char cpsdvsr = 8; +#endif + spi_disable(); + hi_ssp_set_frameform(framemode, spo, sph, datawidth); + hi_ssp_set_serialclock(scr, cpsdvsr); + hi_ssp_alt_mode_set(1); + hi_ssp_enable(); + ssp_write_cmd(0xC8); //Set EXTC + ssp_write_dat(0xFF); + ssp_write_dat(0x93); + ssp_write_dat(0x42); + + ssp_write_cmd(0xB6); + ssp_write_dat(0x0a); + ssp_write_dat(0xE0);//SS GS + + ssp_write_cmd(0x36); //Memory Access Control + ssp_write_dat(0xc8); //MY,MX,MV,ML,BGR,MH c8 + + ssp_write_cmd(0xC0); //Power Control 1 + ssp_write_dat(0x12); //VRH[5:0] + ssp_write_dat(0x10); //VC[3:0] + + ssp_write_cmd(0xC1); //Power Control 2 + ssp_write_dat(0x35); //SAP[2:0],BT[3:0] + + ssp_write_cmd(0xC5); //VCOM + ssp_write_dat(0XE8); //C8++ + + ssp_write_cmd(0xB1); + ssp_write_dat(0x00); + ssp_write_dat(0x1C); + + ssp_write_cmd(0xB4); + ssp_write_dat(0x02); + + + + //*****************GAMMA***************** + ssp_write_cmd(0xE0); + ssp_write_dat(0x00); + ssp_write_dat(0x05); + ssp_write_dat(0x05); + ssp_write_dat(0x05); + ssp_write_dat(0x13); + ssp_write_dat(0x0A); + ssp_write_dat(0x30); + ssp_write_dat(0x9A); + ssp_write_dat(0x43); + ssp_write_dat(0x08); + ssp_write_dat(0x0F); + ssp_write_dat(0x0B); + ssp_write_dat(0x16); + ssp_write_dat(0x1A); + ssp_write_dat(0x0F); + + + ssp_write_cmd(0xE1); + ssp_write_dat(0x00); + ssp_write_dat(0x25); + ssp_write_dat(0x29); + ssp_write_dat(0x04); + ssp_write_dat(0x11); + ssp_write_dat(0x07); + ssp_write_dat(0x3D); + ssp_write_dat(0x57); + ssp_write_dat(0x4F); + ssp_write_dat(0x05); + ssp_write_dat(0x0C); + ssp_write_dat(0x0A); + ssp_write_dat(0x3A); + ssp_write_dat(0x3A); + ssp_write_dat(0x0F); + + //*************RGB interface set************** + ssp_write_cmd(0x3A); //Pixel Format Set + ssp_write_dat(0x66); //18BIT 55 16bit + + ssp_write_cmd(0xB0); //˼ĴҪصDENDOCLKHSYNCVSYNCļԣ˵кܴϵ,ԼиICؽе. + ssp_write_dat(0xEC);//40,42,60,62,ccC0˷ӳOKPCLKʱûϺ,صģôҵΪ½. + + ssp_write_cmd(0x0c); + ssp_write_dat(0x00); + ssp_write_dat(0xd5); + + ssp_write_cmd(0xF6);//˼ĴRGBģʽVSYNCģʽӿڣѡ1618BIT . + ssp_write_dat(0x01);//01 + ssp_write_dat(0x10); + ssp_write_dat(0x07);//08 + + ssp_write_cmd(0xB5);//˼Ĵ޸LCDݵĵһλʲôRGBѡ + ssp_write_dat(0x02); + ssp_write_dat(0x02); + ssp_write_dat(0x0a); + ssp_write_dat(0x12);//HBPһλѡRGBһλ + + //********Window(/ַ)**************** + ssp_write_cmd(0x2A); //320 + ssp_write_dat(0x00); + ssp_write_dat(0x00); + ssp_write_dat(0x01); + ssp_write_dat(0x3F); + + ssp_write_cmd(0x2B); //240 + ssp_write_dat(0x00); + ssp_write_dat(0x00); + ssp_write_dat(0x00); + ssp_write_dat(0xEF); + //****************************** + ssp_write_cmd(0x11);//Exit Sleep + msleep(120); + ssp_write_cmd(0x29);//Display On + ssp_write_cmd(0x2c); + +} + + + +static int __init hi_ssp_lcd_init(void) +{ + int ret; + + reg_ssp_base_va = ioremap_nocache((unsigned long)SSP_BASE, (unsigned long)SSP_SIZE); + if (!reg_ssp_base_va) + { + printk("Kernel: ioremap ssp base failed!\n"); + return -ENOMEM; + } + + ret = misc_register(&ssp_lcd_dev); + if (0 != ret) + { + printk("Kernel: register ssp_0 device failed!\n"); + return -1; + } + + printk("lcd is ili9342 horizontal!\n"); + lcd_ili9342c_init_horizontal_all(); + printk("Kernel: ssp_lcd initial ok!\n"); + + return 0; + +} + +static void __exit hi_ssp_lcd_exit(void) +{ + + hi_ssp_disable(); + + iounmap((void*)reg_ssp_base_va); + + misc_deregister(&ssp_lcd_dev); +} + + + +module_init(hi_ssp_lcd_init); +module_exit(hi_ssp_lcd_exit); + +MODULE_LICENSE("GPL"); + diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/ssp_ili9342h_6bit.ko b/device/mpp/extdrv/ssp-ili9342h-6bit/ssp_ili9342h_6bit.ko new file mode 100644 index 0000000..e01fffd Binary files /dev/null and b/device/mpp/extdrv/ssp-ili9342h-6bit/ssp_ili9342h_6bit.ko differ diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.c b/device/mpp/extdrv/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.c new file mode 100644 index 0000000..147b9f6 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/ssp_ili9342h_6bit.mod.c @@ -0,0 +1,21 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +static const char __module_depends[] +__used +__attribute__((section(".modinfo"))) = +"depends="; + diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/strfunc.c b/device/mpp/extdrv/ssp-ili9342h-6bit/strfunc.c new file mode 100644 index 0000000..3d90f79 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/strfunc.c @@ -0,0 +1,172 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : String functions + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#include +#include +#include "strfunc.h" + +static int atoul(char* str, unsigned int* pulValue); +static int atoulx(char* str, unsigned int* pulValue); + + +/***************************************************************************** + Prototype : StrToNumber + Description : 10/16 ַתΪ޷֡ + Input args : IN CHAR *str + 10ַ, ܷ + 16ַ, ǰ׺0x. ABCDE + + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ + +int StrToNumber(char* str , unsigned int* pulValue) +{ + /*жǷ16Ƶַ*/ + if ( *str == '0' && (*(str + 1) == 'x' || *(str + 1) == 'X') ) + { + if (*(str + 2) == '\0') + { + return -1; + } + else + { + return atoulx(str + 2, pulValue); + } + } + else + { + return atoul(str, pulValue); + } +} + +/***************************************************************************** + Prototype : atoul + Description : 10ַתΪ޷֡ + Input args : IN CHAR *str 10ַ + ܷ + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +static int atoul(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + + while (*str) + { + if (isdigit((int)*str)) + { + /*ֵ֧0xFFFFFFFF(4294967295), + X * 10 + (*str)-48 <= 4294967295 + ԣ X = 429496729 */ + if ((ulResult < 429496729) || ((ulResult == 429496729) && (*str < '6'))) + { + ulResult = ulResult * 10 + (*str) - 48; + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + *pulValue = ulResult; + return 0; +} + + + +/***************************************************************************** + Prototype : atoulx + Description : 16ַתΪ޷֡16ַǰ׺0x + Input args : IN CHAR *str 16ַ, ǰ׺0x. ABCDE + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : toupper + isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +#define ASC2NUM(ch) (ch - '0') +#define HEXASC2NUM(ch) (ch - 'A' + 10) + +int atoulx(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + unsigned char ch; + + while (*str) + { + ch = toupper(*str); + if (isdigit(ch) || ((ch >= 'A') && (ch <= 'F' ))) + { + if (ulResult < 0x10000000) + { + ulResult = (ulResult << 4) + ((ch <= '9') ? (ASC2NUM(ch)) : (HEXASC2NUM(ch))); + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + + *pulValue = ulResult; + return 0; +} + + + diff --git a/device/mpp/extdrv/ssp-ili9342h-6bit/strfunc.h b/device/mpp/extdrv/ssp-ili9342h-6bit/strfunc.h new file mode 100644 index 0000000..9ef32f2 --- /dev/null +++ b/device/mpp/extdrv/ssp-ili9342h-6bit/strfunc.h @@ -0,0 +1,44 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : strfunc.c header file + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#ifndef __STRFUNC_H__ +#define __STRFUNC_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define STRFMT_ADDR32 "%#010lX" +#define STRFMT_ADDR32_2 "0x%08lX" + +extern int StrToNumber(char* str , unsigned int* ulValue); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __STRFUNC_H__ */ diff --git a/device/mpp/extdrv/ssp-ota5182/.ssp_ota5182.ko.cmd b/device/mpp/extdrv/ssp-ota5182/.ssp_ota5182.ko.cmd new file mode 100644 index 0000000..0165b0c --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/.ssp_ota5182.ko.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.ko := arm-hisiv300-linux-ld -EL -r -T /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/scripts/module-common.lds --build-id -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.ko /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.o diff --git a/device/mpp/extdrv/ssp-ota5182/.ssp_ota5182.mod.o.cmd b/device/mpp/extdrv/ssp-ota5182/.ssp_ota5182.mod.o.cmd new file mode 100644 index 0000000..26ff03d --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/.ssp_ota5182.mod.o.cmd @@ -0,0 +1,345 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/.ssp_ota5182.mod.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ssp_ota5182.mod)" -D"KBUILD_MODNAME=KBUILD_STR(ssp_ota5182)" -DMODULE -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.o := \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/vermagic.h \ + include/generated/utsrelease.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.mod.o): diff --git a/device/mpp/extdrv/ssp-ota5182/.ssp_ota5182.o.cmd b/device/mpp/extdrv/ssp-ota5182/.ssp_ota5182.o.cmd new file mode 100644 index 0000000..38f8cd1 --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/.ssp_ota5182.o.cmd @@ -0,0 +1,525 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/.ssp_ota5182.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ssp_ota5182)" -D"KBUILD_MODNAME=KBUILD_STR(ssp_ota5182)" -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.o := \ + include/linux/kernel.h \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + include/linux/sysinfo.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + $(wildcard include/config/smp.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + include/linux/version.h \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/fcntl.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/mm.h \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/transparent/hugepage.h) \ + $(wildcard include/config/ksm.h) \ + $(wildcard include/config/proc/fs.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/hugetlbfs.h) \ + include/linux/prio_tree.h \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/have/cmpxchg/double.h) \ + $(wildcard include/config/have/aligned/struct/page.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + arch/arm/include/generated/asm/auxvec.h \ + include/asm-generic/auxvec.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/guard.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/mmu.h \ + $(wildcard include/config/cpu/has/asid.h) \ + include/linux/range.h \ + include/linux/bit_spinlock.h \ + include/linux/shrinker.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable.h \ + $(wildcard include/config/highpte.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/proc-fns.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue-proc.h \ + $(wildcard include/config/cpu/arm610.h) \ + $(wildcard include/config/cpu/arm7tdmi.h) \ + $(wildcard include/config/cpu/arm710.h) \ + $(wildcard include/config/cpu/arm720t.h) \ + $(wildcard include/config/cpu/arm740t.h) \ + $(wildcard include/config/cpu/arm9tdmi.h) \ + $(wildcard include/config/cpu/arm920t.h) \ + $(wildcard include/config/cpu/arm922t.h) \ + $(wildcard include/config/cpu/arm925t.h) \ + $(wildcard include/config/cpu/arm926t.h) \ + $(wildcard include/config/cpu/arm940t.h) \ + $(wildcard include/config/cpu/arm946e.h) \ + $(wildcard include/config/cpu/arm1020.h) \ + $(wildcard include/config/cpu/arm1020e.h) \ + $(wildcard include/config/cpu/arm1022.h) \ + $(wildcard include/config/cpu/arm1026.h) \ + $(wildcard include/config/cpu/mohawk.h) \ + $(wildcard include/config/cpu/feroceon.h) \ + $(wildcard include/config/cpu/v6k.h) \ + $(wildcard include/config/cpu/v7.h) \ + include/asm-generic/pgtable-nopud.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-hwdef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-hwdef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/s390.h) \ + include/linux/huge_mm.h \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/linux/vm_event_item.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/failslab.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + $(wildcard include/config/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + include/linux/kmemleak.h \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/fs.h \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/ima.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/ioctl.h \ + arch/arm/include/generated/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/linux/blk_types.h \ + $(wildcard include/config/blk/dev/integrity.h) \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/fiemap.h \ + include/linux/migrate_mode.h \ + include/linux/quota.h \ + $(wildcard include/config/quota/netlink/interface.h) \ + include/linux/percpu_counter.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/err.h \ + include/linux/magic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/uaccess.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/unified.h \ + $(wildcard include/config/arm/asm/unified.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/io.h \ + $(wildcard include/config/need/mach/io/h.h) \ + $(wildcard include/config/pcmcia/soc/common.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/isa.h) \ + $(wildcard include/config/pccard.h) \ + include/asm-generic/pci_iomap.h \ + $(wildcard include/config/no/generic/pci/ioport/map.h) \ + $(wildcard include/config/generic/pci/iomap.h) \ + arch/arm/mach-hi3518ev200/include/mach/io.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/exec.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/switch_to.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_info.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_misc.h \ + include/linux/miscdevice.h \ + include/linux/major.h \ + include/linux/pm.h \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/pm/runtime.h) \ + $(wildcard include/config/pm/clk.h) \ + $(wildcard include/config/pm/generic/domains.h) \ + include/linux/delay.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/delay.h \ + include/linux/poll.h \ + arch/arm/include/generated/asm/poll.h \ + include/asm-generic/poll.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irq.h \ + $(wildcard include/config/sparse/irq.h) \ + arch/arm/mach-hi3518ev200/include/mach/irqs.h \ + include/linux/ioport.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/hardirqs.h) \ + $(wildcard include/config/irq/forced/threading.h) \ + $(wildcard include/config/generic/irq/probe.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + $(wildcard include/config/irq/time/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hardirq.h \ + include/linux/irq_cpustat.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + $(wildcard include/config/timerfd.h) \ + include/linux/timerqueue.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/hi_ssp.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.o): diff --git a/device/mpp/extdrv/ssp-ota5182/.tmp_versions/ssp_ota5182.mod b/device/mpp/extdrv/ssp-ota5182/.tmp_versions/ssp_ota5182.mod new file mode 100644 index 0000000..d132423 --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/.tmp_versions/ssp_ota5182.mod @@ -0,0 +1,2 @@ +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.ko +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.o diff --git a/device/mpp/extdrv/ssp-ota5182/Makefile b/device/mpp/extdrv/ssp-ota5182/Makefile new file mode 100644 index 0000000..4979096 --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/Makefile @@ -0,0 +1,23 @@ + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +obj-m := ssp_ota5182.o +ssp-y += hi_ssp.o + +EXTRA_CFLAGS += -I$(REL_INC) +EXTRA_CFLAGS += $(DRV_CFLAGS) + +default: + + + make -C $(LINUX_ROOT) M=$(PWD) modules + + + + +clean: + make -C $(LINUX_ROOT) M=$(PWD) clean + rm -f lcd_write_cmd lcd_write_cmd16 lcd_write_dat \ No newline at end of file diff --git a/device/mpp/extdrv/ssp-ota5182/Module.symvers b/device/mpp/extdrv/ssp-ota5182/Module.symvers new file mode 100644 index 0000000..e69de29 diff --git a/device/mpp/extdrv/ssp-ota5182/hi_ssp.h b/device/mpp/extdrv/ssp-ota5182/hi_ssp.h new file mode 100644 index 0000000..6ea6992 --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/hi_ssp.h @@ -0,0 +1,28 @@ +/* + * extdrv/include/hi_ssp.h for Linux . + * + * History: + * 2006-4-11 create this file + */ + +#ifndef __HI_SSP_H__ +#define __HI_SSP_H__ + +#define SSP_LCD_READ_ALT 0x1 +#define SSP_LCD_WRITE_CMD 0X3 +#define SSP_LCD_WRITE_DAT 0X5 +#define SSP_LCD_WRITE_CMD16 0X7 + +int hi_ssp_set_frameform(unsigned char framemode, unsigned char spo, unsigned char sph, unsigned char datawidth); +int hi_ssp_readdata(void); +void hi_ssp_writedata(unsigned short data); + +void hi_ssp_enable(void); +void hi_ssp_disable(void); + +int hi_ssp_set_serialclock(unsigned char, unsigned char); + +void spi_write_a9byte(unsigned char cmd_dat, unsigned char dat); + +#endif + diff --git a/device/mpp/extdrv/ssp-ota5182/modules.order b/device/mpp/extdrv/ssp-ota5182/modules.order new file mode 100644 index 0000000..1e101cb --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/modules.order @@ -0,0 +1 @@ +kernel//home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/ssp-ota5182/ssp_ota5182.ko diff --git a/device/mpp/extdrv/ssp-ota5182/ssp_ota5182.c b/device/mpp/extdrv/ssp-ota5182/ssp_ota5182.c new file mode 100644 index 0000000..a26b8f4 --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/ssp_ota5182.c @@ -0,0 +1,444 @@ +/* extdrv/interface/ssp/hi_ssp.c + * + * Copyright (c) 2006 Hisilicon Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; + * + * History: + * 21-April-2006 create this file + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + + +#include "hi_ssp.h" + +#define ssp_readw(addr,ret) (ret =(*(volatile unsigned int *)(addr))) +#define ssp_writew(addr,value) ((*(volatile unsigned int *)(addr)) = (value)) + +#define HI_REG_READ(addr,ret) (ret =(*(volatile unsigned int *)(addr))) +#define HI_REG_WRITE(addr,value) ((*(volatile unsigned int *)(addr)) = (value)) + +#define SSP_BASE 0x200E0000 +#define SSP_SIZE 0x10000 // 64KB +#define SSP_INT 65 // Interrupt No. + +void __iomem* reg_ssp_base_va; +#define IO_ADDRESS_VERIFY(x) (reg_ssp_base_va + ((x)-(SSP_BASE))) + +/* SSP register definition .*/ +#define SSP_CR0 IO_ADDRESS_VERIFY(SSP_BASE + 0x00) +#define SSP_CR1 IO_ADDRESS_VERIFY(SSP_BASE + 0x04) +#define SSP_DR IO_ADDRESS_VERIFY(SSP_BASE + 0x08) +#define SSP_SR IO_ADDRESS_VERIFY(SSP_BASE + 0x0C) +#define SSP_CPSR IO_ADDRESS_VERIFY(SSP_BASE + 0x10) +#define SSP_IMSC IO_ADDRESS_VERIFY(SSP_BASE + 0x14) +#define SSP_RIS IO_ADDRESS_VERIFY(SSP_BASE + 0x18) +#define SSP_MIS IO_ADDRESS_VERIFY(SSP_BASE + 0x1C) +#define SSP_ICR IO_ADDRESS_VERIFY(SSP_BASE + 0x20) +#define SSP_DMACR IO_ADDRESS_VERIFY(SSP_BASE + 0x24) + + + + +void hi_ssp_writeOnly(int bWriteOnly) +{ + int ret = 0; + + bWriteOnly = 0; + + ssp_readw(SSP_CR1, ret); + + if (bWriteOnly) + { + ret = ret | (0x1 << 5); + } + else + { + ret = ret & (~(0x1 << 5)); + } + + ssp_writew(SSP_CR1, ret); +} + + +void hi_ssp_enable(void) +{ + int ret = 0; + ssp_readw(SSP_CR1, ret); + ret = (ret & 0xFFFD) | 0x2; + + ret = ret | (0x1 << 4); /* big/little end, 1: little, 0: big */ + + ret = ret | (0x1 << 15); /* wait en */ + + ssp_writew(SSP_CR1, ret); + + hi_ssp_writeOnly(0); +} + + +void hi_ssp_disable(void) +{ + int ret = 0; + ssp_readw(SSP_CR1, ret); + ret = ret & (~(0x1 << 1)); + ssp_writew(SSP_CR1, ret); +} + +int hi_ssp_set_frameform(unsigned char framemode, unsigned char spo, unsigned char sph, unsigned char datawidth) +{ + int ret = 0; + ssp_readw(SSP_CR0, ret); + if (framemode > 3) + { + printk("set frame parameter err.\n"); + return -1; + } + ret = (ret & 0xFFCF) | (framemode << 4); + if ((ret & 0x30) == 0) + { + if (spo > 1) + { + printk("set spo parameter err.\n"); + return -1; + } + if (sph > 1) + { + printk("set sph parameter err.\n"); + return -1; + } + ret = (ret & 0xFF3F) | (sph << 7) | (spo << 6); + } + if ((datawidth > 16) || (datawidth < 4)) + { + printk("set datawidth parameter err.\n"); + return -1; + } + ret = (ret & 0xFFF0) | (datawidth - 1); + ssp_writew(SSP_CR0, ret); + return 0; +} + + +int hi_ssp_set_serialclock(unsigned char scr, unsigned char cpsdvsr) +{ + int ret = 0; + ssp_readw(SSP_CR0, ret); + ret = (ret & 0xFF) | (scr << 8); + ssp_writew(SSP_CR0, ret); + if ((cpsdvsr & 0x1)) + { + printk("set cpsdvsr parameter err.\n"); + return -1; + } + ssp_writew(SSP_CPSR, cpsdvsr); + return 0; +} + +int hi_ssp_alt_mode_set(int enable) +{ + int ret = 0; + + ssp_readw(SSP_CR1, ret); + if (enable) + { + ret = ret & (~0x40); + } + else + { + ret = (ret & 0xFF) | 0x40; + } + ssp_writew(SSP_CR1, ret); + + return 0; +} + + +void hi_ssp_writedata(unsigned short sdata) +{ + ssp_writew(SSP_DR, sdata); + udelay(2); +} + +int hi_ssp_readdata(void) +{ + int ret = 0; + ssp_readw(SSP_DR, ret); + return ret; +} + + +static void spi_enable(void) +{ + HI_REG_WRITE(SSP_CR1, 0x42); +} + +static void spi_disable(void) +{ + HI_REG_WRITE(SSP_CR1, 0x40); +} + + +int hi_ssp_lcd_init_cfg(void) +{ + unsigned char framemode = 0; + unsigned char spo = 1; + unsigned char sph = 1; + unsigned char datawidth = 9; + +#ifdef HI_FPGA + unsigned char scr = 1; + unsigned char cpsdvsr = 2; +#else + unsigned char scr = 8; + unsigned char cpsdvsr = 8; +#endif + + spi_disable(); + + hi_ssp_set_frameform(framemode, spo, sph, datawidth); + + hi_ssp_set_serialclock(scr, cpsdvsr); + + hi_ssp_alt_mode_set(1); + + hi_ssp_enable(); + + return 0; +} + +void spi_write_a9byte(unsigned char cmd_dat, unsigned char dat) +{ + unsigned short spi_data = 0; + + if (cmd_dat) + { + spi_data = 1 << 8; + } + else + { + spi_data = 0 << 8; + } + + spi_data = spi_data | dat; + spi_enable(); + //hi_ssp_writedata(spi_data); + ssp_writew(SSP_DR, spi_data); + printk("spi_data:0x%x\n", spi_data); + msleep(10); + spi_disable(); +} + +void spi_write_a16byte(unsigned short spi_dat) +{ + spi_enable(); + //hi_ssp_writedata(spi_data); + ssp_writew(SSP_DR, spi_dat); + printk("spi_data:0x%x\n", spi_dat); + msleep(10); + spi_disable(); +} + +void ssp_write_dat(unsigned char dat) +{ + spi_write_a9byte(1, dat); +} + +void ssp_write_cmd(unsigned char dat) +{ + spi_write_a9byte(0, dat); +} + +long ssp_lcd_ioctl(struct file* file, unsigned int cmd, unsigned long arg) +{ + unsigned char val; + unsigned short val_16; + + switch (cmd) + { + case SSP_LCD_READ_ALT: + + break; + + case SSP_LCD_WRITE_CMD: + val = *(unsigned int*)arg; + spi_write_a9byte(0, val); + //printk("SSP_LCD_WRITE_CMD!\n"); + break; + + case SSP_LCD_WRITE_DAT: + val = *(unsigned int*)arg; + spi_write_a9byte(1, val); + break; + + case SSP_LCD_WRITE_CMD16: + val_16 = *(unsigned int*)arg; + spi_write_a16byte(val_16); + break; + + default: + { + printk("Kernel: No such ssp command %#x!\n", cmd); + return -1; + } + } + + return 0; +} + +int ssp_lcd_open(struct inode* inode, struct file* file) +{ + return 0; +} +int ssp_lcd_close(struct inode* inode, struct file* file) +{ + return 0; +} + + +static struct file_operations ssp_lcd_fops = +{ + .owner = THIS_MODULE, + .unlocked_ioctl = ssp_lcd_ioctl, + .open = ssp_lcd_open, + .release = ssp_lcd_close +}; + + +static struct miscdevice ssp_lcd_dev = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "ssp_lcd", + .fops = &ssp_lcd_fops, +}; + + + + + +void lcd_ota5182_init(void) +{ + /*spi_16bit_setting*/ + unsigned char framemode = 0; + unsigned char spo = 1; + unsigned char sph = 1; + unsigned char datawidth = 16; +#ifdef HI_FPGA + unsigned char scr = 1; + unsigned char cpsdvsr = 2; +#else + unsigned char scr = 8; + unsigned char cpsdvsr = 8; +#endif + spi_disable(); + hi_ssp_set_frameform(framemode, spo, sph, datawidth); + hi_ssp_set_serialclock(scr, cpsdvsr); + hi_ssp_alt_mode_set(1); + hi_ssp_enable(); + + /*LCD ILI9341 VERTICAL SETTING*/ + //ssp_write_cmd(0x01);//software reset + + spi_write_a16byte(0x000f); + spi_write_a16byte(0x0005); + msleep(10); + spi_write_a16byte(0x000f); + spi_write_a16byte(0x0005); + msleep(10); + spi_write_a16byte(0x000f); + spi_write_a16byte(0x5000); + msleep(10); + //spi_write_a16byte(0x10E4); + spi_write_a16byte(0x1004);//ʱ + spi_write_a16byte(0x3008); + spi_write_a16byte(0x7040);//brightness + spi_write_a16byte(0xA000); + spi_write_a16byte(0xC003); + spi_write_a16byte(0xE013); + spi_write_a16byte(0x6001);//УƵѡ + msleep(100); +} + + + +static int __init hi_ssp_lcd_init(void) +{ + int ret; + + reg_ssp_base_va = ioremap_nocache((unsigned long)SSP_BASE, (unsigned long)SSP_SIZE); + if (!reg_ssp_base_va) + { + printk("Kernel: ioremap ssp base failed!\n"); + return -ENOMEM; + } + + ret = misc_register(&ssp_lcd_dev); + if (0 != ret) + { + printk("Kernel: register ssp_0 device failed!\n"); + return -1; + } + printk("lcd is 0ta5182\n"); + lcd_ota5182_init(); + printk("Kernel: ssp_lcd initial ok!\n"); + + return 0; + +} + +static void __exit hi_ssp_lcd_exit(void) +{ + + hi_ssp_disable(); + + iounmap((void*)reg_ssp_base_va); + + misc_deregister(&ssp_lcd_dev); +} + + + + +module_init(hi_ssp_lcd_init); +module_exit(hi_ssp_lcd_exit); + +MODULE_LICENSE("GPL"); + diff --git a/device/mpp/extdrv/ssp-ota5182/ssp_ota5182.ko b/device/mpp/extdrv/ssp-ota5182/ssp_ota5182.ko new file mode 100644 index 0000000..2e47b5c Binary files /dev/null and b/device/mpp/extdrv/ssp-ota5182/ssp_ota5182.ko differ diff --git a/device/mpp/extdrv/ssp-ota5182/ssp_ota5182.mod.c b/device/mpp/extdrv/ssp-ota5182/ssp_ota5182.mod.c new file mode 100644 index 0000000..147b9f6 --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/ssp_ota5182.mod.c @@ -0,0 +1,21 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +static const char __module_depends[] +__used +__attribute__((section(".modinfo"))) = +"depends="; + diff --git a/device/mpp/extdrv/ssp-ota5182/strfunc.c b/device/mpp/extdrv/ssp-ota5182/strfunc.c new file mode 100644 index 0000000..3d90f79 --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/strfunc.c @@ -0,0 +1,172 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : String functions + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#include +#include +#include "strfunc.h" + +static int atoul(char* str, unsigned int* pulValue); +static int atoulx(char* str, unsigned int* pulValue); + + +/***************************************************************************** + Prototype : StrToNumber + Description : 10/16 ַתΪ޷֡ + Input args : IN CHAR *str + 10ַ, ܷ + 16ַ, ǰ׺0x. ABCDE + + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ + +int StrToNumber(char* str , unsigned int* pulValue) +{ + /*жǷ16Ƶַ*/ + if ( *str == '0' && (*(str + 1) == 'x' || *(str + 1) == 'X') ) + { + if (*(str + 2) == '\0') + { + return -1; + } + else + { + return atoulx(str + 2, pulValue); + } + } + else + { + return atoul(str, pulValue); + } +} + +/***************************************************************************** + Prototype : atoul + Description : 10ַתΪ޷֡ + Input args : IN CHAR *str 10ַ + ܷ + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +static int atoul(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + + while (*str) + { + if (isdigit((int)*str)) + { + /*ֵ֧0xFFFFFFFF(4294967295), + X * 10 + (*str)-48 <= 4294967295 + ԣ X = 429496729 */ + if ((ulResult < 429496729) || ((ulResult == 429496729) && (*str < '6'))) + { + ulResult = ulResult * 10 + (*str) - 48; + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + *pulValue = ulResult; + return 0; +} + + + +/***************************************************************************** + Prototype : atoulx + Description : 16ַתΪ޷֡16ַǰ׺0x + Input args : IN CHAR *str 16ַ, ǰ׺0x. ABCDE + Output args : U32* pulValue, ת + Return value : HI_RET HI_SUCCESS תɹ + HI_FAILURE תʧ + Calls : toupper + isdigit + + Called By : + + History : + 1.Date : 2005710 + Author : t41030 + Modification : Created function +*****************************************************************************/ +#define ASC2NUM(ch) (ch - '0') +#define HEXASC2NUM(ch) (ch - 'A' + 10) + +int atoulx(char* str, unsigned int* pulValue) +{ + unsigned int ulResult = 0; + unsigned char ch; + + while (*str) + { + ch = toupper(*str); + if (isdigit(ch) || ((ch >= 'A') && (ch <= 'F' ))) + { + if (ulResult < 0x10000000) + { + ulResult = (ulResult << 4) + ((ch <= '9') ? (ASC2NUM(ch)) : (HEXASC2NUM(ch))); + } + else + { + *pulValue = ulResult; + return -1; + } + } + else + { + *pulValue = ulResult; + return -1; + } + str++; + } + + *pulValue = ulResult; + return 0; +} + + + diff --git a/device/mpp/extdrv/ssp-ota5182/strfunc.h b/device/mpp/extdrv/ssp-ota5182/strfunc.h new file mode 100644 index 0000000..9ef32f2 --- /dev/null +++ b/device/mpp/extdrv/ssp-ota5182/strfunc.h @@ -0,0 +1,44 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : strfunc.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2005/7/27 + Last Modified : + Description : strfunc.c header file + Function List : + History : + 1.Date : 2005/7/27 + Author : T41030 + Modification: Created file + +******************************************************************************/ + +#ifndef __STRFUNC_H__ +#define __STRFUNC_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define STRFMT_ADDR32 "%#010lX" +#define STRFMT_ADDR32_2 "0x%08lX" + +extern int StrToNumber(char* str , unsigned int* ulValue); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __STRFUNC_H__ */ diff --git a/device/mpp/extdrv/tlv320aic31/.tlv320aic31.o.cmd b/device/mpp/extdrv/tlv320aic31/.tlv320aic31.o.cmd new file mode 100644 index 0000000..984604c --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/.tlv320aic31.o.cmd @@ -0,0 +1,623 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/.tlv320aic31.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -DHI_I2C -I/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/../hi_i2c -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DHI_XXXX -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(tlv320aic31)" -D"KBUILD_MODNAME=KBUILD_STR(tlv_320aic31)" -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.o := \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + include/linux/kernel.h \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + include/linux/sysinfo.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + $(wildcard include/config/smp.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + include/linux/version.h \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/fcntl.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/mm.h \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/transparent/hugepage.h) \ + $(wildcard include/config/ksm.h) \ + $(wildcard include/config/proc/fs.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/hugetlbfs.h) \ + include/linux/prio_tree.h \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/have/cmpxchg/double.h) \ + $(wildcard include/config/have/aligned/struct/page.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + arch/arm/include/generated/asm/auxvec.h \ + include/asm-generic/auxvec.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/guard.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/mmu.h \ + $(wildcard include/config/cpu/has/asid.h) \ + include/linux/range.h \ + include/linux/bit_spinlock.h \ + include/linux/shrinker.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable.h \ + $(wildcard include/config/highpte.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/proc-fns.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue-proc.h \ + $(wildcard include/config/cpu/arm610.h) \ + $(wildcard include/config/cpu/arm7tdmi.h) \ + $(wildcard include/config/cpu/arm710.h) \ + $(wildcard include/config/cpu/arm720t.h) \ + $(wildcard include/config/cpu/arm740t.h) \ + $(wildcard include/config/cpu/arm9tdmi.h) \ + $(wildcard include/config/cpu/arm920t.h) \ + $(wildcard include/config/cpu/arm922t.h) \ + $(wildcard include/config/cpu/arm925t.h) \ + $(wildcard include/config/cpu/arm926t.h) \ + $(wildcard include/config/cpu/arm940t.h) \ + $(wildcard include/config/cpu/arm946e.h) \ + $(wildcard include/config/cpu/arm1020.h) \ + $(wildcard include/config/cpu/arm1020e.h) \ + $(wildcard include/config/cpu/arm1022.h) \ + $(wildcard include/config/cpu/arm1026.h) \ + $(wildcard include/config/cpu/mohawk.h) \ + $(wildcard include/config/cpu/feroceon.h) \ + $(wildcard include/config/cpu/v6k.h) \ + $(wildcard include/config/cpu/v7.h) \ + include/asm-generic/pgtable-nopud.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-hwdef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-hwdef.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/s390.h) \ + include/linux/huge_mm.h \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/linux/vm_event_item.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/failslab.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + $(wildcard include/config/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + include/linux/kmemleak.h \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/fs.h \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/ima.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/ioctl.h \ + arch/arm/include/generated/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + include/linux/blk_types.h \ + $(wildcard include/config/blk/dev/integrity.h) \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/rculist.h \ + include/linux/rculist_bl.h \ + include/linux/list_bl.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + include/linux/semaphore.h \ + include/linux/fiemap.h \ + include/linux/migrate_mode.h \ + include/linux/quota.h \ + $(wildcard include/config/quota/netlink/interface.h) \ + include/linux/percpu_counter.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/err.h \ + include/linux/magic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/uaccess.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/unified.h \ + $(wildcard include/config/arm/asm/unified.h) \ + arch/arm/mach-hi3518ev200/include/mach/hardware.h \ + arch/arm/mach-hi3518ev200/include/mach/platform.h \ + arch/arm/mach-hi3518ev200/include/mach/io.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/io.h \ + $(wildcard include/config/need/mach/io/h.h) \ + $(wildcard include/config/pcmcia/soc/common.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/isa.h) \ + $(wildcard include/config/pccard.h) \ + include/asm-generic/pci_iomap.h \ + $(wildcard include/config/no/generic/pci/ioport/map.h) \ + $(wildcard include/config/generic/pci/iomap.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/exec.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/switch_to.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_info.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/system_misc.h \ + include/linux/delay.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/delay.h \ + include/linux/poll.h \ + arch/arm/include/generated/asm/poll.h \ + include/asm-generic/poll.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irq.h \ + $(wildcard include/config/sparse/irq.h) \ + arch/arm/mach-hi3518ev200/include/mach/irqs.h \ + include/linux/ioport.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/hardirqs.h) \ + $(wildcard include/config/irq/forced/threading.h) \ + $(wildcard include/config/generic/irq/probe.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + $(wildcard include/config/irq/time/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hardirq.h \ + include/linux/irq_cpustat.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + $(wildcard include/config/timerfd.h) \ + include/linux/timerqueue.h \ + include/linux/reboot.h \ + arch/arm/include/generated/asm/emergency-restart.h \ + include/asm-generic/emergency-restart.h \ + include/linux/i2c.h \ + $(wildcard include/config/i2c.h) \ + $(wildcard include/config/i2c/boardinfo.h) \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + $(wildcard include/config/sysfs/deprecated.h) \ + include/linux/klist.h \ + include/linux/pm.h \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/pm/runtime.h) \ + $(wildcard include/config/pm/clk.h) \ + $(wildcard include/config/pm/generic/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/device.h \ + $(wildcard include/config/dmabounce.h) \ + $(wildcard include/config/iommu/api.h) \ + $(wildcard include/config/arch/omap.h) \ + include/linux/pm_wakeup.h \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/no/hz.h) \ + $(wildcard include/config/lockup/detector.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/sched/autogroup.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/fanotify.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/cgroup/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/rcu/boost.h) \ + $(wildcard include/config/compat/brk.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/cfs/bandwidth.h) \ + $(wildcard include/config/debug/stack/usage.h) \ + arch/arm/include/generated/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/sembuf.h \ + include/linux/signal.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/sigcontext.h \ + arch/arm/include/generated/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + arch/arm/include/generated/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + $(wildcard include/config/user/ns.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/llist.h \ + $(wildcard include/config/arch/have/nmi/safe/cmpxchg.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/linux/uio.h \ + include/linux/of.h \ + $(wildcard include/config/sparc.h) \ + $(wildcard include/config/of/dynamic.h) \ + $(wildcard include/config/of.h) \ + include/linux/i2c-dev.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.h \ + /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31_def.h \ + /home/pub/temp/platform_ipc/mpp/release/hi3518e/include/himedia.h \ + include/linux/major.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.o): diff --git a/device/mpp/extdrv/tlv320aic31/.tlv_320aic31.ko.cmd b/device/mpp/extdrv/tlv320aic31/.tlv_320aic31.ko.cmd new file mode 100644 index 0000000..e4963fe --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/.tlv_320aic31.ko.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.ko := arm-hisiv300-linux-ld -EL -r -T /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/scripts/module-common.lds --build-id -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.ko /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.o diff --git a/device/mpp/extdrv/tlv320aic31/.tlv_320aic31.mod.o.cmd b/device/mpp/extdrv/tlv320aic31/.tlv_320aic31.mod.o.cmd new file mode 100644 index 0000000..a798db9 --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/.tlv_320aic31.mod.o.cmd @@ -0,0 +1,345 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.o := arm-hisiv300-linux-gcc -Wp,-MD,/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/.tlv_320aic31.mod.o.d -nostdinc -isystem /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/../lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include -I/home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include -Iarch/arm/include/generated -Iinclude -include /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-hi3518ev200/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -marm -fno-dwarf2-cfi-asm -fno-aggressive-loop-optimizations -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -DHI_I2C -I/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/../hi_i2c -I/home/pub/temp/platform_ipc/mpp/release/hi3518e/include -DHI_XXXX -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(tlv_320aic31.mod)" -D"KBUILD_MODNAME=KBUILD_STR(tlv_320aic31)" -DMODULE -c -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.c + +source_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.o := /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.c + +deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.o := \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/sysfs.h) \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/debug/set/module/ronx.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/arch/dma/addr/t/64bit.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/types.h \ + include/asm-generic/int-ll64.h \ + arch/arm/include/generated/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/sparse/rcu/pointer.h) \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/posix_types.h \ + include/asm-generic/posix_types.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/const.h \ + include/linux/stat.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/atomic/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + $(wildcard include/config/compaction.h) \ + include/linux/sysinfo.h \ + /opt/hisi-linux/x86-arm/arm-hisiv300-linux/lib/gcc/arm-hisiv300-linux-uclibcgnueabi/4.8.3/include/stdarg.h \ + include/linux/linkage.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/linkage.h \ + include/linux/bitops.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bitops.h \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + include/linux/typecheck.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/irqflags.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/ptrace.h \ + $(wildcard include/config/cpu/endian/be8.h) \ + $(wildcard include/config/arm/thumb.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hwcap.h \ + include/asm-generic/bitops/non-atomic.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/arch_hweight.h \ + include/asm-generic/bitops/const_hweight.h \ + include/asm-generic/bitops/lock.h \ + include/asm-generic/bitops/le.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/swab.h \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/ext2-atomic-setbit.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/printk.h \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + include/linux/dynamic_debug.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/div64.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/compiler.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/thumb2/kernel.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + $(wildcard include/config/arm/lpae.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cache.h \ + $(wildcard include/config/arm/l1/cache/shift.h) \ + $(wildcard include/config/aeabi.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + $(wildcard include/config/debug/lock/alloc.h) \ + include/linux/preempt.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/preempt/count.h) \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/thread_info.h \ + $(wildcard include/config/arm/thumbee.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/fpstate.h \ + $(wildcard include/config/vfpv3.h) \ + $(wildcard include/config/iwmmxt.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/domain.h \ + $(wildcard include/config/io/36.h) \ + $(wildcard include/config/cpu/use/domains.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/barrier.h \ + $(wildcard include/config/cpu/32v6k.h) \ + $(wildcard include/config/cpu/xsc3.h) \ + $(wildcard include/config/cpu/fa526.h) \ + $(wildcard include/config/arch/has/barriers.h) \ + $(wildcard include/config/arm/dma/mem/bufferable.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/outercache.h \ + $(wildcard include/config/outer/cache/sync.h) \ + $(wildcard include/config/outer/cache.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/memory.h \ + $(wildcard include/config/need/mach/memory/h.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/highmem.h) \ + $(wildcard include/config/dram/size.h) \ + $(wildcard include/config/dram/base.h) \ + $(wildcard include/config/have/tcm.h) \ + $(wildcard include/config/arm/patch/phys/virt.h) \ + $(wildcard include/config/phys/offset.h) \ + $(wildcard include/config/hisi/snapshot/boot.h) \ + arch/arm/include/generated/asm/sizes.h \ + include/asm-generic/sizes.h \ + arch/arm/mach-hi3518ev200/include/mach/memory.h \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/linux/stringify.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + include/linux/spinlock_types_up.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/prove/rcu.h) \ + include/linux/rwlock_types.h \ + include/linux/spinlock_up.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/processor.h \ + $(wildcard include/config/have/hw/breakpoint.h) \ + $(wildcard include/config/arm/errata/754327.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/hw_breakpoint.h \ + include/linux/rwlock.h \ + include/linux/spinlock_api_up.h \ + include/linux/atomic.h \ + $(wildcard include/config/arch/has/atomic/or.h) \ + $(wildcard include/config/generic/atomic64.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/atomic.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/cmpxchg.h \ + $(wildcard include/config/cpu/sa1100.h) \ + $(wildcard include/config/cpu/sa110.h) \ + $(wildcard include/config/cpu/v6.h) \ + include/asm-generic/cmpxchg-local.h \ + include/asm-generic/cmpxchg.h \ + include/asm-generic/atomic-long.h \ + include/asm-generic/atomic64.h \ + include/linux/math64.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/pm/sleep.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/have/memblock/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/no/bootmem.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/have/memoryless/nodes.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/have/memblock/node.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/have/arch/pfn/valid.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/current.h \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/string.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/generated/bounds.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/page.h \ + $(wildcard include/config/cpu/copy/v3.h) \ + $(wildcard include/config/cpu/copy/v4wt.h) \ + $(wildcard include/config/cpu/copy/v4wb.h) \ + $(wildcard include/config/cpu/copy/feroceon.h) \ + $(wildcard include/config/cpu/copy/fa.h) \ + $(wildcard include/config/cpu/xscale.h) \ + $(wildcard include/config/cpu/copy/v6.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/glue.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/pgtable-2level-types.h \ + include/asm-generic/getorder.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/memory/hotremove.h) \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + arch/arm/include/generated/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + $(wildcard include/config/have/arch/mutex/cpu/relax.h) \ + include/linux/mutex-debug.h \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + include/linux/rwsem-spinlock.h \ + include/linux/srcu.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/rcu/torture/test.h) \ + $(wildcard include/config/tree/rcu.h) \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/rcu/trace.h) \ + $(wildcard include/config/preempt/rcu.h) \ + $(wildcard include/config/tiny/rcu.h) \ + $(wildcard include/config/tiny/preempt/rcu.h) \ + $(wildcard include/config/debug/objects/rcu/head.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/preempt/rt.h) \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bug.h \ + include/linux/completion.h \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + include/linux/rcutiny.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + $(wildcard include/config/sched/book.h) \ + $(wildcard include/config/use/percpu/numa/node/id.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + include/linux/percpu.h \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/pfn.h \ + arch/arm/include/generated/asm/percpu.h \ + include/asm-generic/percpu.h \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/topology.h \ + $(wildcard include/config/arm/cpu/topology.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + $(wildcard include/config/debug/vm.h) \ + $(wildcard include/config/debug/virtual.h) \ + include/linux/workqueue.h \ + $(wildcard include/config/debug/objects/work.h) \ + $(wildcard include/config/freezer.h) \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + include/linux/param.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/param.h \ + $(wildcard include/config/hz.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/timex.h \ + arch/arm/mach-hi3518ev200/include/mach/timex.h \ + include/linux/sysctl.h \ + $(wildcard include/config/sysctl.h) \ + include/linux/rbtree.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/elf.h \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/user.h \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kobject_ns.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/static_key.h \ + include/linux/jump_label.h \ + $(wildcard include/config/jump/label.h) \ + include/linux/export.h \ + $(wildcard include/config/symbol/prefix.h) \ + $(wildcard include/config/modversions.h) \ + /home/pub/osdrv/hi3518e/hi3518eV200_OSDRV_V1.0.1.0.B010_20150822-133543/opensource/kernel/linux-3.4.y/arch/arm/include/asm/module.h \ + $(wildcard include/config/arm/unwind.h) \ + include/linux/vermagic.h \ + include/generated/utsrelease.h \ + +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.o: $(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.o) + +$(deps_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.mod.o): diff --git a/device/mpp/extdrv/tlv320aic31/.tlv_320aic31.o.cmd b/device/mpp/extdrv/tlv320aic31/.tlv_320aic31.o.cmd new file mode 100644 index 0000000..860ca54 --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/.tlv_320aic31.o.cmd @@ -0,0 +1 @@ +cmd_/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.o := arm-hisiv300-linux-ld -EL -r -o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.o /home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.o diff --git a/device/mpp/extdrv/tlv320aic31/.tmp_versions/tlv_320aic31.mod b/device/mpp/extdrv/tlv320aic31/.tmp_versions/tlv_320aic31.mod new file mode 100644 index 0000000..ee0cbbc --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/.tmp_versions/tlv_320aic31.mod @@ -0,0 +1,2 @@ +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.ko +/home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv320aic31.o diff --git a/device/mpp/extdrv/tlv320aic31/Makefile b/device/mpp/extdrv/tlv320aic31/Makefile new file mode 100644 index 0000000..1d7fd4e --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/Makefile @@ -0,0 +1,27 @@ + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +obj-m := tlv_320aic31.o +tlv_320aic31-y += tlv320aic31.o + +ifeq ($(CONFIG_GPIO_I2C),y) + EXTRA_CFLAGS += -DHI_GPIO_I2C + EXTRA_CFLAGS+=-I$(PWD)/../gpio-i2c-ex +else + EXTRA_CFLAGS += -DHI_I2C + EXTRA_CFLAGS+=-I$(PWD)/../hi_i2c +endif + +EXTRA_CFLAGS += -I$(REL_INC) +EXTRA_CFLAGS += $(DRV_CFLAGS) +EXTRA_CFLAGS += -D$(HI_FPGA) + + +default: + @make -C $(LINUX_ROOT) M=$(PWD) modules + +clean: + @make -C $(LINUX_ROOT) M=$(PWD) clean diff --git a/device/mpp/extdrv/tlv320aic31/Module.symvers b/device/mpp/extdrv/tlv320aic31/Module.symvers new file mode 100644 index 0000000..e69de29 diff --git a/device/mpp/extdrv/tlv320aic31/modules.order b/device/mpp/extdrv/tlv320aic31/modules.order new file mode 100644 index 0000000..b056e60 --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/modules.order @@ -0,0 +1 @@ +kernel//home/pub/temp/platform_ipc/mpp/extdrv/hi3518e/tlv320aic31/tlv_320aic31.ko diff --git a/device/mpp/extdrv/tlv320aic31/tlv320aic31.c b/device/mpp/extdrv/tlv320aic31/tlv320aic31.c new file mode 100644 index 0000000..eadf8b1 --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/tlv320aic31.c @@ -0,0 +1,849 @@ +/* + * + * Copyright (c) 2006 Hisilicon Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * History: + * 10-April-2006 create this file + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#ifndef CONFIG_HISI_SNAPSHOT_BOOT +#include +#endif +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "tlv320aic31.h" +#include "tlv320aic31_def.h" + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT +#include "himedia.h" +#endif + +#define CHIP_NUM 1 +#define DEV_NAME "tlv320aic31" +#define DEBUG_LEVEL 1 +#define DPRINTK(level,fmt,args...) do{ if(level < DEBUG_LEVEL)\ + printk(KERN_INFO "%s [%s ,%d]: " fmt "\n",DEV_NAME,__FUNCTION__,__LINE__,##args);\ + }while(0) + +unsigned int IIC_device_addr[CHIP_NUM] = {0x30}; + +static struct i2c_board_info hi_info = +{ + I2C_BOARD_INFO("tlv320aic31", 0x30), +}; + +static struct i2c_client* tlv_client; + + +static unsigned int open_cnt = 0; +static int chip_count = 1; + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT +static struct himedia_device s_stTlv320aic31Device; +#endif + +static int tlv320aic31_device_init(unsigned int num); + +int tlv320aic31_write(unsigned char chip_addr, unsigned char reg_addr, unsigned char value) +{ + int ret; + unsigned char buf[2]; + struct i2c_client* client = tlv_client; + + buf[0] = reg_addr; + buf[1] = value; + + ret = i2c_master_send(client, buf, 2); + return ret; +} + +int tlv320aic31_read(unsigned char chip_addr, unsigned char reg_addr) +{ + int ret_data = 0xFF; + int ret; + struct i2c_client* client = tlv_client; + unsigned char buf[2]; + + buf[0] = reg_addr; + ret = i2c_master_recv(client, buf, 1); + if (ret >= 0) + { + ret_data = buf[0]; + } + return ret_data; +} + +void tlv320aic31_reg_dump(unsigned int reg_num) +{ + unsigned int i = 0; + for (i = 0; i < reg_num; i++) + { + printk("reg%d =%x,", i, tlv320aic31_read(IIC_device_addr[0], i)); + if ((i + 1) % 8 == 0) + { + printk("\n"); + } + } +} +void soft_reset(unsigned int chip_num) +{ + /*soft reset*/ + tlv320aic31_write(IIC_device_addr[chip_num], 0x1, 0x80); + msleep(10); + /*CLKDIV_IN uses MCLK*/ + tlv320aic31_write(IIC_device_addr[chip_num], 102, 0x32); + +#if 1 + /*PLL disable and select Q value*/ + tlv320aic31_write(IIC_device_addr[chip_num], 3, 0x10); +#else + /*PLL enable */ + tlv320aic31_write(IIC_device_addr[chip_num], 3, 0x82);/* P=2 */ + tlv320aic31_write(IIC_device_addr[chip_num], 4, 0x1c);/* J=28 */ + tlv320aic31_write(IIC_device_addr[chip_num], 5, 0x2c); + tlv320aic31_write(IIC_device_addr[chip_num], 6, 0x8);/* reg 5 and 6 set D=2818*/ + tlv320aic31_write(IIC_device_addr[chip_num], 11, 0x1);/* R=1 */ +#endif + /*left and right DAC open*/ + tlv320aic31_write(IIC_device_addr[chip_num], 7, 0xa);/* FSref = 48 kHz */ + + /*sample*/ + tlv320aic31_write(IIC_device_addr[chip_num], 2, 0xaa);/* FS = FSref/6 */ + + /*ctrl mode*/ + tlv320aic31_write(IIC_device_addr[chip_num], 8, 0xf0);/* master mode */ + + /*Audio Serial Data Interface Control*/ + tlv320aic31_write(IIC_device_addr[chip_num], 9, 0x7);/* I2S mode,16bit */ + + /*Audio Codec Digital Filter Control Register*/ + tlv320aic31_write(IIC_device_addr[chip_num], 12, 0x50); + + //tlv320aic31_write(IIC_device_addr[chip_num], 25, 0x0); + tlv320aic31_write(IIC_device_addr[chip_num], 25, 0x40); + tlv320aic31_write(IIC_device_addr[chip_num], 17, 0xf); + tlv320aic31_write(IIC_device_addr[chip_num], 18, 0xf0); + + tlv320aic31_write(IIC_device_addr[chip_num], 15, 0x0); + tlv320aic31_write(IIC_device_addr[chip_num], 16, 0x0); + //tlv320aic31_write(IIC_device_addr[chip_num], 19, 0x7c); + //tlv320aic31_write(IIC_device_addr[chip_num], 22, 0x7c); + + tlv320aic31_write(IIC_device_addr[chip_num], 19, 0x04); + tlv320aic31_write(IIC_device_addr[chip_num], 22, 0x04); + tlv320aic31_write(IIC_device_addr[chip_num], 28, 0x0); + tlv320aic31_write(IIC_device_addr[chip_num], 31, 0x0); + + /*out ac-coupled*/ + tlv320aic31_write(IIC_device_addr[chip_num], 14, 0x80); + + /*left and right DAC power on*/ + tlv320aic31_write(IIC_device_addr[chip_num], 37, 0xc0); + + /*out common-mode voltage*/ + //tlv320aic31_write(IIC_device_addr[chip_num], 40, 0x80);DTS2014123002762 + + /*out path select*/ + tlv320aic31_write(IIC_device_addr[chip_num], 41, 0x1); + + /*out path select DTS2014123002762 ʱ2sΪ200ms*/ + tlv320aic31_write(IIC_device_addr[chip_num], 42, 0x78); + + /*left DAC not muted*/ + tlv320aic31_write(IIC_device_addr[chip_num], 43, 0x0); + + /*right DAC not muted*/ + tlv320aic31_write(IIC_device_addr[chip_num], 44, 0x0); + + tlv320aic31_write(IIC_device_addr[chip_num], 47, 0x80); + + /*HPLOUT is not muted*/ + //tlv320aic31_write(IIC_device_addr[chip_num], 51, 0x04); + + tlv320aic31_write(IIC_device_addr[chip_num], 64, 0x80); + /*HPROUT is not muted*/ + //tlv320aic31_write(IIC_device_addr[chip_num], 65, 0x9f); + + /*out short circuit protection*/ + tlv320aic31_write(IIC_device_addr[chip_num], 38, 0x3e); + +} + +/* + * device open. set counter + */ +static int tlv320aic31_open(struct inode* inode, struct file* file) +{ + if (0 == open_cnt++) + { + return 0; + } + return -1 ; +} + +/* + * Close device, Do nothing! + */ +static int tlv320aic31_close(struct inode* inode , struct file* file) +{ + open_cnt--; + return 0; +} + +//static int tlv320aic31_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) +static long tlv320aic31_ioctl(struct file* file, unsigned int cmd, unsigned long arg) +{ + unsigned int __user* argp = (unsigned int __user*)arg; + unsigned int chip_num; + Audio_Ctrl temp; + Audio_Ctrl* audio_ctrl; + Codec_Datapath_Setup_Ctrl codec_datapath_setup_ctrl; + DAC_OUTPUT_SWIT_CTRL dac_output_swit_ctrl; + DAC_POWER_CTRL dac_power_ctrl; + In1_Adc_Ctrl in1_adc_ctrl ; + In2_Adc_Ctrl_Sample in2_adc_ctrl_sample ; + Adc_Pga_Dac_Gain_Ctrl adc_pga_dac_gain_ctrl; + Line_Hpcom_Out_Ctrl line_hpcom_out_ctrl; + Serial_Int_Ctrl serial_int_ctrl; + Serial_Data_Offset_Ctrl serial_data_offset_ctrl; + Ctrl_Mode ctrl_mode; + + if (argp != NULL) + { + if (copy_from_user(&temp, argp, sizeof(Audio_Ctrl))) + { + return -EFAULT; + } + } + audio_ctrl = (Audio_Ctrl*)(&temp); + chip_num = audio_ctrl->chip_num; + switch (cmd) + { + case IN2LR_2_LEFT_ADC_CTRL: + in2_adc_ctrl_sample.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 17); + in2_adc_ctrl_sample.bit.in2l_adc_input_level_sample = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 17, in2_adc_ctrl_sample.b8); + break; + case IN2LR_2_RIGTH_ADC_CTRL: + in2_adc_ctrl_sample.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 18); + in2_adc_ctrl_sample.bit.in2r_adc_input_level_sample = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 18, in2_adc_ctrl_sample.b8); + + break; + case IN1L_2_LEFT_ADC_CTRL: + in1_adc_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 19); + in1_adc_ctrl.bit.in1_adc_input_level = audio_ctrl->input_level; + in1_adc_ctrl.bit.adc_ch_power_ctrl = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 19, in1_adc_ctrl.b8); + break; + case IN1R_2_RIGHT_ADC_CTRL: + in1_adc_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 22); + in1_adc_ctrl.bit.in1_adc_input_level = audio_ctrl->input_level; + in1_adc_ctrl.bit.adc_ch_power_ctrl = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 22, in1_adc_ctrl.b8); + break; + case PGAL_2_HPLOUT_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 46); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 46, adc_pga_dac_gain_ctrl.b8); + break; + case DACL1_2_HPLOUT_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 47); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 47, adc_pga_dac_gain_ctrl.b8); + break; + case HPLOUT_OUTPUT_LEVEL_CTRL: + line_hpcom_out_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 51); + line_hpcom_out_ctrl.bit.if_mute = audio_ctrl->if_mute_route; + line_hpcom_out_ctrl.bit.output_level = audio_ctrl->input_level; + line_hpcom_out_ctrl.bit.power_status = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 51, line_hpcom_out_ctrl.b8); + break; + case PGAL_2_HPLCOM_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 53); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 53, adc_pga_dac_gain_ctrl.b8); + break; + case DACL1_2_HPLCOM_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 54); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 54, adc_pga_dac_gain_ctrl.b8); + break; + case HPLCOM_OUTPUT_LEVEL_CTRL: + line_hpcom_out_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 58); + line_hpcom_out_ctrl.bit.if_mute = audio_ctrl->if_mute_route; + line_hpcom_out_ctrl.bit.output_level = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 58, line_hpcom_out_ctrl.b8); + break; + case PGAR_2_HPROUT_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 63); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 63, adc_pga_dac_gain_ctrl.b8); + break; + case DACR1_2_HPROUT_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 64); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 64, adc_pga_dac_gain_ctrl.b8); + break; + case HPROUT_OUTPUT_LEVEL_CTRL: + line_hpcom_out_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 65); + line_hpcom_out_ctrl.bit.if_mute = audio_ctrl->if_mute_route; + line_hpcom_out_ctrl.bit.output_level = audio_ctrl->input_level; + line_hpcom_out_ctrl.bit.power_status = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 65, line_hpcom_out_ctrl.b8); + break; + case PGAR_2_HPRCOM_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 70); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 70, adc_pga_dac_gain_ctrl.b8); + break; + case DACR1_2_HPRCOM_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 71); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 71, adc_pga_dac_gain_ctrl.b8); + break; + case HPRCOM_OUTPUT_LEVEL_CTRL: + line_hpcom_out_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 72); + line_hpcom_out_ctrl.bit.if_mute = audio_ctrl->if_mute_route; + line_hpcom_out_ctrl.bit.output_level = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 72, line_hpcom_out_ctrl.b8); + break; + case PGAL_2_LEFT_LOP_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 81); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 81, adc_pga_dac_gain_ctrl.b8); + break; + case DACL1_2_LEFT_LOP_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 82); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 82, adc_pga_dac_gain_ctrl.b8); + break; + case LEFT_LOP_OUTPUT_LEVEL_CTRL: + line_hpcom_out_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 86); + line_hpcom_out_ctrl.bit.if_mute = audio_ctrl->if_mute_route; + line_hpcom_out_ctrl.bit.output_level = audio_ctrl->input_level; + line_hpcom_out_ctrl.bit.power_status = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 86, line_hpcom_out_ctrl.b8); + break; + case PGAR_2_RIGHT_LOP_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 91); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 91, adc_pga_dac_gain_ctrl.b8); + break; + case DACR1_2_RIGHT_LOP_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 92); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 92, adc_pga_dac_gain_ctrl.b8); + break; + case RIGHT_LOP_OUTPUT_LEVEL_CTRL: + line_hpcom_out_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 93); + line_hpcom_out_ctrl.bit.if_mute = audio_ctrl->if_mute_route; + line_hpcom_out_ctrl.bit.output_level = audio_ctrl->input_level; + line_hpcom_out_ctrl.bit.power_status = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 93, line_hpcom_out_ctrl.b8); + break; + case SET_ADC_SAMPLE: + in2_adc_ctrl_sample.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 2); + in2_adc_ctrl_sample.bit.in2l_adc_input_level_sample = audio_ctrl->sample; + tlv320aic31_write(IIC_device_addr[chip_num], 2, in2_adc_ctrl_sample.b8); + break; + case SET_DAC_SAMPLE: + in2_adc_ctrl_sample.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 2); + in2_adc_ctrl_sample.bit.in2r_adc_input_level_sample = audio_ctrl->sample; + tlv320aic31_write(IIC_device_addr[chip_num], 2, in2_adc_ctrl_sample.b8); + //printk("set SET_DAC_SAMPLE,audio_ctrl->sample=%x\n",audio_ctrl->sample); + break; + case SET_DATA_LENGTH: + serial_int_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 9);; + serial_int_ctrl.bit.data_length = audio_ctrl->data_length; + //tlv320aic31_write(IIC_device_addr[chip_num],9,serial_int_ctrl.b8); + break; + case SET_TRANSFER_MODE: + serial_int_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 9); + serial_int_ctrl.bit.transfer_mode = audio_ctrl->trans_mode; + tlv320aic31_write(IIC_device_addr[chip_num], 9, serial_int_ctrl.b8); + break; + case SET_CTRL_MODE: + //tlv320aic31_write(IIC_device_addr[chip_num],0x1,0x80); + //udelay(50); + ctrl_mode.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 8); + ctrl_mode.bit.bit_clock_dic_ctrl = audio_ctrl->ctrl_mode; + ctrl_mode.bit.work_clock_dic_ctrl = audio_ctrl->ctrl_mode; + ctrl_mode.bit.bit_work_dri_ctrl = audio_ctrl->ctrl_mode; + tlv320aic31_write(IIC_device_addr[chip_num], 8, ctrl_mode.b8); +#if 0 + /* ʱ */ + if (1 == audio_ctrl->ctrl_mode + || (AC31_SET_48K_SAMPLERATE != audio_ctrl->sample && AC31_SET_44_1K_SAMPLERATE != audio_ctrl->sample)) + { + /* aic31ģʽ߲ʲΪ44.1K/48KHZ£ʹⲿ12.288MHZľΪMCLK벢ڲʱ */ + if ((1 == audio_ctrl->if_44100hz_series)) + { + /*Ϊ44.1KHZϵеIJ */ + tlv320aic31_write(IIC_device_addr[chip_num], 3, 0x81); /* P=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 4, 0x1c); /* J=7 */ + tlv320aic31_write(IIC_device_addr[chip_num], 5, 0x36); /* reg 5 and 6 set D=3500*/ + tlv320aic31_write(IIC_device_addr[chip_num], 6, 0xb0); + codec_datapath_setup_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 7); + codec_datapath_setup_ctrl.b8 |= 0x80; /* FSref = 44.1 kHz */ + tlv320aic31_write(IIC_device_addr[chip_num], 7, codec_datapath_setup_ctrl.b8); + tlv320aic31_write(IIC_device_addr[chip_num], 11, 0x1); /* R=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 101, 0x0); + tlv320aic31_write(IIC_device_addr[chip_num], 102, 0xc2); + } + else + { + /*Ϊ44.1KHZϵеIJ */ + tlv320aic31_write(IIC_device_addr[chip_num], 3, 0x81); /* P=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 4, 0x20); /* J=8 */ + tlv320aic31_write(IIC_device_addr[chip_num], 5, 0x0); /* reg 5 and 6 set D=0000*/ + tlv320aic31_write(IIC_device_addr[chip_num], 6, 0x0); + codec_datapath_setup_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 7); + codec_datapath_setup_ctrl.b8 &= 0x7f; /* FSref = 48 kHz */ + tlv320aic31_write(IIC_device_addr[chip_num], 7, codec_datapath_setup_ctrl.b8); + tlv320aic31_write(IIC_device_addr[chip_num], 11, 0x1); /* R=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 101, 0x0); + tlv320aic31_write(IIC_device_addr[chip_num], 102, 0xc2); + } + } + else + { + /* aic31ģʽҲΪ44.1K/48KHZ£BCLKڲʱ */ + tlv320aic31_write(IIC_device_addr[chip_num], 102, 0x22); /* uses PLLCLK and BCLK */ + codec_datapath_setup_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 7); + if ((1 == audio_ctrl->if_44100hz_series)) + { + codec_datapath_setup_ctrl.b8 |= 0x80; /* FSref = 44.1 kHz */ + } + else + { + codec_datapath_setup_ctrl.b8 &= 0x7f; /* FSref = 48 kHz */ + } + tlv320aic31_write(IIC_device_addr[chip_num], 7, codec_datapath_setup_ctrl.b8); + + tlv320aic31_write(IIC_device_addr[chip_num], 3, 0x81); /* P=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 4, 32 << 2); /* set PLL J to 32 */ + tlv320aic31_write(IIC_device_addr[chip_num], 5, 0x0); /* reg 5 and 6 set D=0000*/ + tlv320aic31_write(IIC_device_addr[chip_num], 6, 0x0); + tlv320aic31_write(IIC_device_addr[chip_num], 101, 0x0); /* CODEC_CLKIN uses PLLDIV_OUT */ + tlv320aic31_write(IIC_device_addr[chip_num], 11, 0x2); /* R = 2 */ + } +#else + /* ʱ */ + /* aic31,aiaoṩmclk */ + switch (audio_ctrl->sampleRate) + { + case 8000: + case 16000: + case 32000: + { + /*Ϊ32KHZϵеIJ */ + tlv320aic31_write(IIC_device_addr[chip_num], 3, 0x81); /* P=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 4, 0x30); /* J=12 */ + tlv320aic31_write(IIC_device_addr[chip_num], 5, 0x0); /* reg 5 and 6 set D=0000*/ + tlv320aic31_write(IIC_device_addr[chip_num], 6, 0x0); + codec_datapath_setup_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 7); + codec_datapath_setup_ctrl.b8 &= 0x7f; /* FSref = 48 kHz */ + tlv320aic31_write(IIC_device_addr[chip_num], 7, codec_datapath_setup_ctrl.b8); + tlv320aic31_write(IIC_device_addr[chip_num], 11, 0x1); /* R=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 101, 0x0); + tlv320aic31_write(IIC_device_addr[chip_num], 102, 0xc2); + } + break; + case 12000: + case 24000: + case 48000: + { + /*Ϊ48KHZϵеIJ */ + tlv320aic31_write(IIC_device_addr[chip_num], 3, 0x81); /* P=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 4, 0x20); /* J=8 */ + tlv320aic31_write(IIC_device_addr[chip_num], 5, 0x0); /* reg 5 and 6 set D=0000*/ + tlv320aic31_write(IIC_device_addr[chip_num], 6, 0x0); + codec_datapath_setup_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 7); + codec_datapath_setup_ctrl.b8 &= 0x7f; /* FSref = 48 kHz */ + tlv320aic31_write(IIC_device_addr[chip_num], 7, codec_datapath_setup_ctrl.b8); + tlv320aic31_write(IIC_device_addr[chip_num], 11, 0x1); /* R=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 101, 0x0); + tlv320aic31_write(IIC_device_addr[chip_num], 102, 0xc2); + } + break; + case 11025: + case 22050: + case 44100: + { + /*Ϊ44.1KHZϵеIJ */ + tlv320aic31_write(IIC_device_addr[chip_num], 3, 0x81); /* P=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 4, 0x20); /* J=7 */ + tlv320aic31_write(IIC_device_addr[chip_num], 5, 0x00); /* reg 5 and 6 set D=0000*/ + tlv320aic31_write(IIC_device_addr[chip_num], 6, 0x00); + codec_datapath_setup_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 7); + codec_datapath_setup_ctrl.b8 |= 0x80; /* FSref = 44.1 kHz */ + tlv320aic31_write(IIC_device_addr[chip_num], 7, codec_datapath_setup_ctrl.b8); + tlv320aic31_write(IIC_device_addr[chip_num], 11, 0x1); /* R=1 */ + tlv320aic31_write(IIC_device_addr[chip_num], 101, 0x0); + tlv320aic31_write(IIC_device_addr[chip_num], 102, 0xc2); + } + break; + + default: + printk("aic31 unsupport sampleRate %d\n", audio_ctrl->sampleRate); + return -1; + } + +#endif + break; + case LEFT_DAC_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 43); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 43, adc_pga_dac_gain_ctrl.b8); + break; + case RIGHT_DAC_VOL_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 44); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 44, adc_pga_dac_gain_ctrl.b8); + break; + case LEFT_DAC_POWER_SETUP: + codec_datapath_setup_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 7); + codec_datapath_setup_ctrl.bit.left_dac_datapath_ctrl = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 7, codec_datapath_setup_ctrl.b8); + dac_power_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 37); + dac_power_ctrl.bit.left_dac_power_ctrl = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 37, dac_power_ctrl.b8); + break; + case RIGHT_DAC_POWER_SETUP: + codec_datapath_setup_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 7); + codec_datapath_setup_ctrl.bit.right_dac_datapath_ctrl = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 7, codec_datapath_setup_ctrl.b8); + dac_power_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 37); + dac_power_ctrl.bit.right_dac_power_ctrl = audio_ctrl->if_powerup; + tlv320aic31_write(IIC_device_addr[chip_num], 37, dac_power_ctrl.b8); + break; + case DAC_OUT_SWITCH_CTRL: + dac_output_swit_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 41); + dac_output_swit_ctrl.bit.left_dac_swi_ctrl = audio_ctrl->dac_path; + dac_output_swit_ctrl.bit.right_dac_swi_ctrl = audio_ctrl->dac_path; + tlv320aic31_write(IIC_device_addr[chip_num], 41, dac_output_swit_ctrl.b8); + break; + case LEFT_ADC_PGA_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 15); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 15, adc_pga_dac_gain_ctrl.b8); + break; + case RIGHT_ADC_PGA_CTRL: + adc_pga_dac_gain_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 16); + adc_pga_dac_gain_ctrl.bit.if_mute_route = audio_ctrl->if_mute_route; + adc_pga_dac_gain_ctrl.bit.input_vol_level_ctrl = audio_ctrl->input_level; + tlv320aic31_write(IIC_device_addr[chip_num], 16, adc_pga_dac_gain_ctrl.b8); + break; + case SET_SERIAL_DATA_OFFSET: + serial_data_offset_ctrl.b8 = tlv320aic31_read(IIC_device_addr[chip_num], 10); + serial_data_offset_ctrl.bit.serial_data_offset = audio_ctrl->data_offset; + tlv320aic31_write(IIC_device_addr[chip_num], 10, serial_data_offset_ctrl.b8); + break; + case SOFT_RESET: + //printk("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "invalid attribute"); + soft_reset(chip_num); + break; + case TLV320AIC31_REG_DUMP: + tlv320aic31_reg_dump(102); + break; + default: + break; + } + return 0; +} + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT +static int tlv320aic31_freeze(struct himedia_device* pdev) +{ + printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__); + return 0; +} + +static int tlv320aic31_restore(struct himedia_device* pdev) +{ + int i; + + for (i = 0; i < chip_count; i++) + { + if (tlv320aic31_device_init(i) < 0) + { + printk(KERN_ALERT "%s %d, tlv320aic31 device init fail!\n", __FUNCTION__, __LINE__); + return -1; + } + } + printk(KERN_ALERT "%s %d\n", __FUNCTION__, __LINE__); + return 0; +} +#endif + +/* + * The various file operations we support. + */ + +static struct file_operations tlv320aic31_fops = +{ + .owner = THIS_MODULE, + .unlocked_ioctl = tlv320aic31_ioctl, + .open = tlv320aic31_open, + .release = tlv320aic31_close +}; + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT +struct himedia_ops stTlv320aic31DrvOps = +{ + .pm_freeze = tlv320aic31_freeze, + .pm_restore = tlv320aic31_restore +}; +#else +static struct miscdevice tlv320aic31_dev = +{ + MISC_DYNAMIC_MINOR, + DEV_NAME, + &tlv320aic31_fops, +}; +#endif + +static int set_chip_count(const char* val, const struct kernel_param* kp) +{ + int ret; + int chip_count; + + ret = kstrtoint(val, 10, &chip_count); + if (ret < 0) + { + return -EINVAL; + } + + if (chip_count < 0 || chip_count > CHIP_NUM) + { + printk("chip_count%d err. \n", chip_count); + return -EINVAL; + } + return 0; +} + +static struct kernel_param_ops alv320_para_ops = +{ + .set = set_chip_count, +}; + +#if 0 +module_param(chip_count, int, 0); +#else +module_param_cb(chip_count, &alv320_para_ops, &chip_count, 0644); + +#endif +MODULE_PARM_DESC(chip_count, "the num we device uses the tlv320aic31,default 1"); + +static int tlv320aic31_reboot(struct notifier_block* self, unsigned long data, void* pdata) +{ + unsigned int i; + + for (i = 0; i < chip_count; i++) + { + /* HPLOUT is mute */ + tlv320aic31_write(IIC_device_addr[i], 51, 0x04); + + /* HPROUT is mute */ + tlv320aic31_write(IIC_device_addr[i], 65, 0x04); + } + + printk("Func:%s, line:%d######\n", __FUNCTION__, __LINE__); + return 0; +} + +static struct notifier_block tlv320aic31_reboot_notifier = +{ + .notifier_call = tlv320aic31_reboot, +}; + +static int tlv320aic31_device_init(unsigned int num) +{ + /* inite codec configs.*/ + unsigned char temp = 0; + temp = tlv320aic31_read(IIC_device_addr[num], 0x2); + tlv320aic31_write(IIC_device_addr[0], 0x2, 0xaa); + if ( tlv320aic31_read(IIC_device_addr[num], 0x2) != 0xaa) + { + DPRINTK(0, "init aic31(%d) error", num); + return -1; + } + tlv320aic31_write(IIC_device_addr[num], 0x2, temp); + + soft_reset(num); + + /* עreboot֪ͨ */ + register_reboot_notifier(&tlv320aic31_reboot_notifier); + + return 0; +} + +static int tlv320aic31_device_exit(unsigned int num) +{ + /* HPLOUT is mute */ + tlv320aic31_write(IIC_device_addr[num], 51, 0x04); + + /* HPROUT is mute */ + tlv320aic31_write(IIC_device_addr[num], 65, 0x04); + + return 0; +} + +static int i2c_client_init(void) +{ + struct i2c_adapter* i2c_adap; + + // use i2c2 + i2c_adap = i2c_get_adapter(2); + tlv_client = i2c_new_device(i2c_adap, &hi_info); + + i2c_put_adapter(i2c_adap); + + return 0; +} + +static void i2c_client_exit(void) +{ + i2c_unregister_device(tlv_client); +} + +static int __init tlv320aic31_init(void) +{ + unsigned int i, ret; + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT + snprintf(s_stTlv320aic31Device.devfs_name, sizeof(s_stTlv320aic31Device.devfs_name), DEV_NAME); + + s_stTlv320aic31Device.minor = HIMEDIA_DYNAMIC_MINOR; + s_stTlv320aic31Device.fops = &tlv320aic31_fops; + s_stTlv320aic31Device.drvops = &stTlv320aic31DrvOps; + s_stTlv320aic31Device.owner = THIS_MODULE; + + ret = himedia_register(&s_stTlv320aic31Device); + if (ret) + { + DPRINTK(0, "could not register tlv320aic31 device"); + return -1; + } +#else + ret = misc_register(&tlv320aic31_dev); + if (ret) + { + DPRINTK(0, "could not register tlv320aic31 device"); + return -1; + } +#endif + + i2c_client_init(); + for (i = 0; i < chip_count; i++) + { + if (tlv320aic31_device_init(i) < 0) + { + goto init_fail; + } + } + DPRINTK(1, "tlv320aic31 driver init successful!"); + printk("load tlv320aic31.ko for Hi3518e ok!\n"); + return ret; +init_fail: +#ifdef CONFIG_HISI_SNAPSHOT_BOOT + himedia_unregister(&s_stTlv320aic31Device); +#else + misc_deregister(&tlv320aic31_dev); +#endif + DPRINTK(0, "tlv320aic31 device init fail,deregister it!"); + return -1; +} + +static void __exit tlv320aic31_exit(void) +{ + unsigned int i; + + for (i = 0; i < chip_count; i++) + { + tlv320aic31_device_exit(i); + } + + unregister_reboot_notifier(&tlv320aic31_reboot_notifier); + +#ifdef CONFIG_HISI_SNAPSHOT_BOOT + himedia_unregister(&s_stTlv320aic31Device); +#else + misc_deregister(&tlv320aic31_dev); +#endif + + i2c_client_exit(); + + DPRINTK(1, "deregister tlv320aic31"); + printk("rmmod tlv320aic31.ko for Hi3518e ok!\n"); +} + +module_init(tlv320aic31_init); +module_exit(tlv320aic31_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Hisilicon"); + diff --git a/device/mpp/extdrv/tlv320aic31/tlv320aic31.h b/device/mpp/extdrv/tlv320aic31/tlv320aic31.h new file mode 100644 index 0000000..5cb9a73 --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/tlv320aic31.h @@ -0,0 +1,119 @@ +/* + * extdrv/peripheral/ada/tlv320.h for Linux . + * + * History: + * 10-April-2006 create this file + */ + +#ifndef _INC_TLV320AIC31 +#define _INC_TLV320AIC31 + +#define IN2LR_2_LEFT_ADC_CTRL 0x0 +#define IN2LR_2_RIGTH_ADC_CTRL 0x1 +#define IN1L_2_LEFT_ADC_CTRL 0x2 +#define IN1R_2_RIGHT_ADC_CTRL 0x3 +#define PGAL_2_HPLOUT_VOL_CTRL 0x4 +#define PGAR_2_HPLOUT_VOL_CTRL 0x5 +#define DACL1_2_HPLOUT_VOL_CTRL 0x6 +#define DACR1_2_HPLOUT_VOL_CTRL 0x7 +#define HPLOUT_OUTPUT_LEVEL_CTRL 0x8 +#define PGAL_2_HPLCOM_VOL_CTRL 0x9 +#define PGAR_2_HPLCOM_VOL_CTRL 0xa +#define DACL1_2_HPLCOM_VOL_CTRL 0xb +#define DACR1_2_HPLCOM_VOL_CTRL 0xc +#define HPLCOM_OUTPUT_LEVEL_CTRL 0xd +#define PGAR_2_HPROUT_VOL_CTRL 0xf +#define DACR1_2_HPROUT_VOL_CTRL 0x10 +#define HPROUT_OUTPUT_LEVEL_CTRL 0x11 +#define PGAR_2_HPRCOM_VOL_CTRL 0x12 +#define DACR1_2_HPRCOM_VOL_CTRL 0X13 +#define HPRCOM_OUTPUT_LEVEL_CTRL 0x14 +#define PGAL_2_LEFT_LOP_VOL_CTRL 0x15 +#define DACL1_2_LEFT_LOP_VOL_CTRL 0x16 +#define LEFT_LOP_OUTPUT_LEVEL_CTRL 0x17 +#define PGAR_2_RIGHT_LOP_VOL_CTRL 0x18 +#define DACR1_2_RIGHT_LOP_VOL_CTRL 0x19 +#define RIGHT_LOP_OUTPUT_LEVEL_CTRL 0x20 +#define SET_ADC_SAMPLE 0x21 +#define SET_DAC_SAMPLE 0x22 +#define SET_DATA_LENGTH 0x23 +#define SET_CTRL_MODE 0x24 +#define LEFT_DAC_VOL_CTRL 0x25 +#define RIGHT_DAC_VOL_CTRL 0x26 +#define LEFT_DAC_POWER_SETUP 0x27 +#define RIGHT_DAC_POWER_SETUP 0x28 +#define DAC_OUT_SWITCH_CTRL 0x29 +#define LEFT_ADC_PGA_CTRL 0x30 +#define RIGHT_ADC_PGA_CTRL 0x31 +#define TLV320AIC31_REG_DUMP 0x32 +#define SOFT_RESET 0x33 +#define SET_TRANSFER_MODE 0x34 +#define SET_SERIAL_DATA_OFFSET 0X35 + +/* +0: ADC Fs = Fsref/1 48 44 +1: ADC Fs = Fsref/1.5 32 +2: ADC Fs = Fsref/2 24 22 +3: ADC Fs = Fsref/2.5 20 +4: ADC Fs = Fsref/3 16 +5: ADC Fs = Fsref/3.5 13.7 +6: ADC Fs = Fsref/4 12 11 +7: ADC Fs = Fsref/4.5 10.6 +8: ADC Fs = Fsref/5 9.6 +9: ADC Fs = Fsref/5.5 +a: ADC Fs = Fsref / 6 8 +*/ +#define AC31_SET_8K_SAMPLERATE 0xa +#define AC31_SET_12K_SAMPLERATE 0x6 +#define AC31_SET_16K_SAMPLERATE 0x4 +#define AC31_SET_24K_SAMPLERATE 0x2 +#define AC31_SET_32K_SAMPLERATE 0x1 +#define AC31_SET_48K_SAMPLERATE 0x0 + +#define AC31_SET_11_025K_SAMPLERATE 0x6 +#define AC31_SET_22_05K_SAMPLERATE 0x2 +#define AC31_SET_44_1K_SAMPLERATE 0x0 + +#define AC31_SET_SLAVE_MODE 0 +#define AC31_SET_MASTER_MODE 1 + +#define AC31_SET_16BIT_WIDTH 0 +#define AC31_SET_20BIT_WIDTH 1 +#define AC31_SET_24BIT_WIDTH 2 +#define AC31_SET_32BIT_WIDTH 3 + + + + +typedef enum Audio_In_ +{ + IN1L = 0, + IN1R = 1, + IN2L = 2, + IN2R = 3, +} Audio_In; +typedef enum Audio_Out_ +{ + LINE_OUT_R = 0, + LINE_OUT_L, + HPL, + HPR, +} Audio_Out; +typedef struct +{ + unsigned int chip_num: 3; + unsigned int audio_in_out: 2; + unsigned int if_mute_route: 1; + unsigned int if_powerup: 1; + unsigned int input_level: 7; + unsigned int sample: 4; + unsigned int if_44100hz_series: 1; + unsigned int data_length: 2; + unsigned int ctrl_mode: 1; + unsigned int dac_path: 2; + unsigned int trans_mode: 2; + unsigned int reserved : 6; + unsigned int data_offset: 8; + unsigned int sampleRate; +} Audio_Ctrl; +#endif diff --git a/device/mpp/extdrv/tlv320aic31/tlv320aic31_def.h b/device/mpp/extdrv/tlv320aic31/tlv320aic31_def.h new file mode 100644 index 0000000..775cd95 --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/tlv320aic31_def.h @@ -0,0 +1,114 @@ +#ifndef _INC_TLV320AIC31_DEF +#define _INC_TLV320AIC31_DEF + + +typedef union +{ + struct + { + unsigned char reserved2 : 4; + unsigned char bit_work_dri_ctrl: 1; + unsigned char reserved1: 1; + unsigned char work_clock_dic_ctrl: 1; + unsigned char bit_clock_dic_ctrl: 1; + } bit; + unsigned char b8; +} Ctrl_Mode; + +typedef union +{ + struct + { + unsigned char input_vol_level_ctrl: 7; + unsigned char if_mute_route: 1; + } bit; + unsigned char b8; +} Adc_Pga_Dac_Gain_Ctrl; + +typedef union +{ + struct + { + unsigned char in2r_adc_input_level_sample: 4; + unsigned char in2l_adc_input_level_sample: 4; + } bit; + unsigned char b8; +} In2_Adc_Ctrl_Sample; + +typedef union +{ + struct + { + unsigned adc_pga_step_ctrl: 2; + unsigned adc_ch_power_ctrl: 1; + unsigned char in1_adc_input_level: 4; + unsigned char mode: 1; + } bit; + unsigned char b8; +} In1_Adc_Ctrl; + +typedef union +{ + struct + { + unsigned char reserved: 4; + unsigned char data_length: 2; + unsigned char transfer_mode: 2; + } bit; + unsigned char b8; +} Serial_Int_Ctrl; + +typedef union +{ + struct + { + unsigned char power_status: 1; + unsigned char vol_ctrl_status: 1; + unsigned char power_down_ctrl: 1; + unsigned char if_mute: 1; + unsigned char output_level: 4; + } bit; + unsigned char b8; +} Line_Hpcom_Out_Ctrl; +typedef union +{ + struct + { + unsigned char reserved1: 1; + unsigned char right_dac_datapath_ctrl: 2; + unsigned char left_dac_datapath_ctrl: 2; + unsigned char reserved2: 3; + } bit; + unsigned char b8; +} Codec_Datapath_Setup_Ctrl; +typedef union +{ + struct + { + unsigned char reserved: 6; + unsigned char right_dac_power_ctrl: 1; + unsigned char left_dac_power_ctrl: 1; + } bit; + unsigned char b8; +} DAC_POWER_CTRL; +typedef union +{ + struct + { + unsigned char reserved: 4; + unsigned char right_dac_swi_ctrl: 2; + unsigned char left_dac_swi_ctrl: 2; + } bit; + unsigned char b8; +} DAC_OUTPUT_SWIT_CTRL; + +typedef union +{ + struct + { + unsigned char serial_data_offset: 8; + } bit; + unsigned char b8; +} Serial_Data_Offset_Ctrl; +#endif + diff --git a/device/mpp/extdrv/tlv320aic31/tlv_320aic31.ko b/device/mpp/extdrv/tlv320aic31/tlv_320aic31.ko new file mode 100644 index 0000000..7f59be9 Binary files /dev/null and b/device/mpp/extdrv/tlv320aic31/tlv_320aic31.ko differ diff --git a/device/mpp/extdrv/tlv320aic31/tlv_320aic31.mod.c b/device/mpp/extdrv/tlv320aic31/tlv_320aic31.mod.c new file mode 100644 index 0000000..147b9f6 --- /dev/null +++ b/device/mpp/extdrv/tlv320aic31/tlv_320aic31.mod.c @@ -0,0 +1,21 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +static const char __module_depends[] +__used +__attribute__((section(".modinfo"))) = +"depends="; + diff --git a/device/mpp/include/acodec.h b/device/mpp/include/acodec.h new file mode 100644 index 0000000..044f0c7 --- /dev/null +++ b/device/mpp/include/acodec.h @@ -0,0 +1,244 @@ +#ifndef _ACODEC_H_ +#define _ACODEC_H_ + +#define IOC_TYPE_ACODEC 'A' + +typedef enum hiACODEC_FS_E { + ACODEC_FS_48000 = 0x1a, + ACODEC_FS_24000 = 0x19, + ACODEC_FS_12000 = 0x18, + + ACODEC_FS_44100 = 0x1a, + ACODEC_FS_22050 = 0x19, + ACODEC_FS_11025 = 0x18, + + ACODEC_FS_32000 = 0x1a, + ACODEC_FS_16000 = 0x19, + ACODEC_FS_8000 = 0x18, + + ACODEC_FS_BUTT = 0x1b, +} ACODEC_FS_E; + +typedef enum hiACODEC_MIXER_E { + /*select IN or IN_D*/ + ACODEC_MIXER_IN = 0x3, + ACODEC_MIXER_IN_D = 0x4, + ACODEC_MIXER_BUTT, +} ACODEC_MIXER_E; + + +typedef struct { + /*volume control, 0x00~0x7e, 0x7F:mute*/ + unsigned int vol_ctrl; + /*adc/dac mute control, 1:mute, 0:unmute*/ + unsigned int vol_ctrl_mute; +} ACODEC_VOL_CTRL; + +typedef enum hiACODEC_IOCTL_E { + IOC_NR_SOFT_RESET_CTRL = 0x0, + IOC_NR_POWER_DOWN_CTRL, + /****************************************************************************************** + The input volume range is [-87, +86]. Both the analog gain and digital gain are adjusted. + A larger value indicates higher volume. + For example, the value 86 indicates the maximum volume of 86 dB, + and the value -87 indicates the minimum volume (muted status). + The volume adjustment takes effect simultaneously in the audio-left and audio-right channels. + The recommended volume range is [+10, +56]. + Within this range, the noises are lowest because only the analog gain is adjusted, + and the voice quality can be guaranteed. + *******************************************************************************************/ + IOC_NR_SET_INPUT_VOL , + /******************************************************************************************* + The output volume range is [-121, +6]. A larger value indicates higher volume. + For example, the value 6 indicates the maximum volume of 6 dB, + and the value -121 indicates the minimum volume (muted status). + The volume adjustment takes effect simultaneously in the audio-left and audio-right channels. + The digital gain is adjusted by calling this interface. + It is recommended that a small value is assigned to avoid noises. + *******************************************************************************************/ + IOC_NR_SET_OUTPUT_VOL, + IOC_NR_GET_INPUT_VOL, + IOC_NR_GET_OUTPUT_VOL, + /***********************/ + IOC_NR_SET_I2S1_FS, + IOC_NR_SET_MIXER_MIC, + IOC_NR_SEL_DAC_CLK, + IOC_NR_SEL_ANA_MCLK, + IOC_NR_SET_GAIN_MICL, + IOC_NR_SET_GAIN_MICR, + IOC_NR_SET_DACL_VOL, + IOC_NR_SET_DACR_VOL, + IOC_NR_SET_ADCL_VOL, + IOC_NR_SET_ADCR_VOL, + IOC_NR_SET_MICL_MUTE, + IOC_NR_SET_MICR_MUTE, + IOC_NR_SET_DACL_MUTE, + IOC_NR_SET_DACR_MUTE, + IOC_NR_DAC_SOFT_MUTE, + IOC_NR_DAC_SOFT_UNMUTE, + + IOC_NR_GET_GAIN_MICL, + IOC_NR_GET_GAIN_MICR, + IOC_NR_GET_DACL_VOL, + IOC_NR_GET_DACR_VOL, + IOC_NR_GET_ADCL_VOL, + IOC_NR_GET_ADCR_VOL, + + IOC_NR_SET_PD_DACL, + IOC_NR_SET_PD_DACR, + IOC_NR_SET_PD_ADCL, + IOC_NR_SET_PD_ADCR, + + IOC_NR_DACL_SEL_TRACK, + IOC_NR_DACR_SEL_TRACK, + IOC_NR_ADCL_SEL_TRACK, + IOC_NR_ADCR_SEL_TRACK, + IOC_NR_SET_DAC_DE_EMPHASIS, + IOC_NR_SET_ADC_HP_FILTER, + IOC_NR_DAC_POP_FREE, + IOC_NR_DAC_SOFT_MUTE_RATE, + + IOC_NR_DAC_SEL_I2S, + IOC_NR_ADC_SEL_I2S, + IOC_NR_SET_I2S1_DATAWIDTH, + IOC_NR_SET_I2S2_DATAWIDTH, + IOC_NR_SET_I2S2_FS, + IOC_NR_SET_DACR2DACL_VOL, + IOC_NR_SET_DACL2DACR_VOL, + IOC_NR_SET_ADCR2DACL_VOL, + IOC_NR_SET_ADCL2DACR_VOL, + IOC_NR_SET_ADCR2DACR_VOL, + IOC_NR_SET_ADCL2DACL_VOL, +} ACODEC_IOCTL_E; + +/*reset the audio code to the default config*/ +#define ACODEC_SOFT_RESET_CTRL \ + _IO(IOC_TYPE_ACODEC, IOC_NR_SOFT_RESET_CTRL) +#define ACODEC_POWER_DOWN_CTRL \ + _IO(IOC_TYPE_ACODEC, IOC_NR_POWER_DOWN_CTRL) +/*ACODEC_FS_E*/ +#define ACODEC_SET_I2S1_FS \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_I2S1_FS, unsigned int) +/*select the micpga's input,micin or linein, (ACODEC_MIXER_E)*/ +#define ACODEC_SET_MIXER_MIC \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_MIXER_MIC, unsigned int) +/*analog part input volume control(left channel 0~0x1f)*/ +#define ACODEC_SET_GAIN_MICL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_GAIN_MICL, unsigned int) +/*analog part input volume control(right channel 0~0x1f)*/ +#define ACODEC_SET_GAIN_MICR \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_GAIN_MICR, unsigned int) +/*Output volume control(left channel) ACODEC_VOL_CTRL*/ +#define ACODEC_SET_DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACL_VOL, ACODEC_VOL_CTRL) +/*Output volume control(right channel) ACODEC_VOL_CTRL*/ +#define ACODEC_SET_DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACR_VOL, ACODEC_VOL_CTRL) +/*Input volume control(left channel) ACODEC_VOL_CTRL*/ +#define ACODEC_SET_ADCL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCL_VOL, ACODEC_VOL_CTRL) +/*Input volume control(right channel) ACODEC_VOL_CTRL*/ +#define ACODEC_SET_ADCR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCR_VOL, ACODEC_VOL_CTRL) +/*Input mute control(left channel), 1:mute, 0:unmute*/ +#define ACODEC_SET_MICL_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_MICL_MUTE, unsigned int) +/*Input mute control(right channel), 1:mute, 0:unmute*/ +#define ACODEC_SET_MICR_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_MICR_MUTE, unsigned int) +/*Output mute control(left channel), 1:mute, 0:unmute*/ +#define ACODEC_SET_DACL_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACL_MUTE, unsigned int) +/*Output mute control(right channel), 1:mute, 0:unmute*/ +#define ACODEC_SET_DACR_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACR_MUTE, unsigned int) +/*Audio Fade Out Control, 1:on, 0:off*/ +#define ACODEC_DAC_SOFT_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_SOFT_MUTE, unsigned int) +/*Audio Fade In Control, 1:on, 0:off*/ +#define ACODEC_DAC_SOFT_UNMUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_SOFT_UNMUTE, unsigned int) + +#define ACODEC_GET_GAIN_MICL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_GAIN_MICL, unsigned int) +#define ACODEC_GET_GAIN_MICR \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_GAIN_MICR, unsigned int) +#define ACODEC_GET_DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_DACL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_GET_DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_DACR_VOL, ACODEC_VOL_CTRL) +#define ACODEC_GET_ADCL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_ADCL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_GET_ADCR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_ADCR_VOL, ACODEC_VOL_CTRL) + +/*set adcl power, 0: power up, 1: power down*/ +#define ACODEC_SET_PD_DACL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_PD_DACL, unsigned int) +/*set adcr power, 0: power up, 1: power down*/ +#define ACODEC_SET_PD_DACR \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_PD_DACR, unsigned int) +/*set adcl power, 0: power up, 1: power down*/ +#define ACODEC_SET_PD_ADCL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_PD_ADCL, unsigned int) +/*set adcr power, 0: power up, 1: power down*/ +#define ACODEC_SET_PD_ADCR \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_PD_ADCR, unsigned int) + +/* Don't need to set, the driver will set a default value */ +/*clock of dac and adc is reverse or obverse*/ +#define ACODEC_SEL_DAC_CLK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SEL_DAC_CLK, unsigned int) +/*clock of analog part and digital part is reverse or obverse*/ +#define ACODEC_SEL_ANA_MCLK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SEL_ANA_MCLK, unsigned int) +#define ACODEC_DACL_SEL_TRACK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DACL_SEL_TRACK, unsigned int) +#define ACODEC_DACR_SEL_TRACK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DACR_SEL_TRACK, unsigned int) +#define ACODEC_ADCL_SEL_TRACK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_ADCL_SEL_TRACK, unsigned int) +#define ACODEC_ADCR_SEL_TRACK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_ADCR_SEL_TRACK, unsigned int) +#define ACODEC_SET_DAC_DE_EMPHASIS \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DAC_DE_EMPHASIS, unsigned int) +#define ACODEC_SET_ADC_HP_FILTER \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADC_HP_FILTER, unsigned int) +#define ACODEC_DAC_POP_FREE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_POP_FREE, unsigned int) +#define ACODEC_DAC_SOFT_MUTE_RATE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_SOFT_MUTE_RATE, unsigned int) +#define ACODEC_SET_INPUT_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_INPUT_VOL, unsigned int) +#define ACODEC_SET_OUTPUT_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_OUTPUT_VOL, unsigned int) +#define ACODEC_GET_INPUT_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_INPUT_VOL, unsigned int) +#define ACODEC_GET_OUTPUT_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_OUTPUT_VOL, unsigned int) + +/* Reserved ioctl cmd */ +#define ACODEC_DAC_SEL_I2S \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_SEL_I2S, unsigned int) +#define ACODEC_ADC_SEL_I2S \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_ADC_SEL_I2S, unsigned int) +#define ACODEC_SET_I2S1_DATAWIDTH \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_I2S1_DATAWIDTH, unsigned int) +#define ACODEC_SET_I2S2_DATAWIDTH \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_I2S2_DATAWIDTH, unsigned int) +#define ACODEC_SET_I2S2_FS \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_I2S2_FS, unsigned int) +#define ACODEC_SET_DACR2DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACR2DACL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_DACL2DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACL2DACR_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_ADCL2DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCL2DACL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_ADCR2DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCR2DACL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_ADCL2DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCL2DACR_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_ADCR2DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCR2DACR_VOL, ACODEC_VOL_CTRL) + +#endif /* End of #ifndef _ACODEC_H_ */ diff --git a/device/mpp/include/dictionary.h b/device/mpp/include/dictionary.h new file mode 100644 index 0000000..58e9569 --- /dev/null +++ b/device/mpp/include/dictionary.h @@ -0,0 +1,276 @@ + +/*-------------------------------------------------------------------------*/ +/** + @file dictionary.h + @author N. Devillard + @date Aug 2000 + @version + @brief Implements a dictionary for string variables. + + This module implements a simple dictionary object, i.e. a list + of string/string associations. This object is useful to store e.g. + informations retrieved from a configuration file (ini files). +*/ +/*--------------------------------------------------------------------------*/ + +/* + + + + +*/ + +#ifndef _DICTIONARY_H_ +#define _DICTIONARY_H_ + +/*--------------------------------------------------------------------------- + Includes + ---------------------------------------------------------------------------*/ + +#include +#include +#include +#if HI_OS_TYPE == HI_OS_LINUX +#include +#endif + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + + +/*--------------------------------------------------------------------------- + New types + ---------------------------------------------------------------------------*/ + + +/*-------------------------------------------------------------------------*/ +/** + @brief Dictionary object + + This object contains a list of string/string associations. Each + association is identified by a unique string key. Looking up values + in the dictionary is speeded up by the use of a (hopefully collision-free) + hash function. + */ +/*-------------------------------------------------------------------------*/ +/** "CL_" is comment line's the head of name*/ +#define CL_NSBC 1 /** 1,No space before comment; example:|;comment*/ +#define CL_AKLR 2 /** 2,At the key line's right; example:|key = value ;commnet*/ +#define CL_CLINE 3 /** 3,Line of commnet which at the key line's behind; example;| ;comment*/ +#define CL_SLINE 4 /** 4,Space Line; example;|\r\n*/ + +typedef struct _dictionary_ { + int n ; /** Number of entries in dictionary */ + int size ; /** Storage size of entries*/ + char ** val ; /** List of string values */ + char ** key ; /** List of string keys */ + unsigned * hash ; /** List of hash values for keys */ + + /*2006/03/11 blair add : save comment and space Line*/ + int commN; /** Number of comment in dictionary */ + int commSize; /** Storage size of comment*/ + char ** comment; /** List of string comment and space Line*/ + unsigned * commHash; /** List of hash values for keys ,signed the comment line is the key has the comment */ + unsigned char * commPlace; /** remember the comment at where the key keyhash signed. + 0,the line has no comment; + 1,no space before comment; + 2,at the key line's right; + 3,Line of commnet or at the key line's behind; + 4,Space Line;*/ +} dictionary ; + + +/*--------------------------------------------------------------------------- + Function prototypes + ---------------------------------------------------------------------------*/ +void * mem_double(void * ptr, int size); +/*-------------------------------------------------------------------------*/ +/** + @brief Compute the hash key for a string. + @param key Character string to use for key. + @return 1 unsigned int on at least 32 bits. + + This hash function has been taken from an Article in Dr Dobbs Journal. + This is normally a collision-free function, distributing keys evenly. + The key is stored anyway in the struct so that collision can be avoided + by comparing the key itself in last resort. + */ +/*--------------------------------------------------------------------------*/ +unsigned dictionary_hash(const char * key); + +/*-------------------------------------------------------------------------*/ +/** + @brief Create a new dictionary object. + @param size Optional initial size of the dictionary. + @return 1 newly allocated dictionary objet. + + This function allocates a new dictionary object of given size and returns + it. If you do not know in advance (roughly) the number of entries in the + dictionary, give size=0. + */ +/*--------------------------------------------------------------------------*/ +dictionary * dictionary_new(int size); + +/*-------------------------------------------------------------------------*/ +/** + @brief Delete a dictionary object + @param d dictionary object to deallocate. + @return void + + Deallocate a dictionary object and all memory associated to it. + */ +/*--------------------------------------------------------------------------*/ +void dictionary_del(dictionary * vd); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get a value from a dictionary. + @param d dictionary object to search. + @param key Key to look for in the dictionary. + @param def Default value to return if key not found. + @return 1 pointer to internally allocated character string. + + This function locates a key in a dictionary and returns a pointer to its + value, or the passed 'def' pointer if no such key can be found in + dictionary. The returned character pointer points to data internal to the + dictionary object, you should not try to free it or modify it. + */ +/*--------------------------------------------------------------------------*/ +char * dictionary_get(const dictionary * d, const char * key, char * def); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Get a value from a dictionary, as a char. + @param d dictionary object to search. + @param key Key to look for in the dictionary. + @param def Default value for the key if not found. + @return char + + This function locates a key in a dictionary using dictionary_get, + and returns the first char of the found string. + */ +/*--------------------------------------------------------------------------*/ +char dictionary_getchar(const dictionary * d, const char * key, const char def) ; + +/*-------------------------------------------------------------------------*/ +/** + @brief Get a value from a dictionary, as an int. + @param d dictionary object to search. + @param key Key to look for in the dictionary. + @param def Default value for the key if not found. + @return int + + This function locates a key in a dictionary using dictionary_get, + and applies atoi on it to return an int. If the value cannot be found + in the dictionary, the default is returned. + */ +/*--------------------------------------------------------------------------*/ +int dictionary_getint(const dictionary * d, const char * key, const int def); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get a value from a dictionary, as a double. + @param d dictionary object to search. + @param key Key to look for in the dictionary. + @param def Default value for the key if not found. + @return double + + This function locates a key in a dictionary using dictionary_get, + and applies atof on it to return a double. If the value cannot be found + in the dictionary, the default is returned. + */ +/*--------------------------------------------------------------------------*/ +double dictionary_getdouble(const dictionary * d, const char * key, const double def); + +/*-------------------------------------------------------------------------*/ +/** + @brief Set a value in a dictionary. + @param d dictionary object to modify. + @param key Key to modify or add. + @param val Value to add. + @return void + + If the given key is found in the dictionary, the associated value is + replaced by the provided one. If the key cannot be found in the + dictionary, it is added to it. + + It is Ok to provide a NULL value for val, but NULL values for the dictionary + or the key are considered as errors: the function will return immediately + in such a case. + + Notice that if you dictionary_set a variable to NULL, a call to + dictionary_get will return a NULL value: the variable will be found, and + its value (NULL) is returned. In other words, setting the variable + content to NULL is equivalent to deleting the variable from the + dictionary. It is not possible (in this implementation) to have a key in + the dictionary without value. + */ +/*--------------------------------------------------------------------------*/ +int dictionary_set(const dictionary * vd, const char * key, const char * val); +int dictionary_add(dictionary * d, const char * key, const char * val); +/*-------------------------------------------------------------------------*/ +/** + @brief Delete a key in a dictionary + @param d dictionary object to modify. + @param key Key to remove. + @return void + + This function deletes a key in a dictionary. Nothing is done if the + key cannot be found. + */ +/*--------------------------------------------------------------------------*/ +void dictionary_unset(dictionary * d, const char * key); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Set a key in a dictionary, providing an int. + @param d Dictionary to update. + @param key Key to modify or add + @param val Integer value to store (will be stored as a string). + @return void + + This helper function calls dictionary_set() with the provided integer + converted to a string using %d. + */ +/*--------------------------------------------------------------------------*/ +int dictionary_setint(const dictionary * d, const char * key, const int val); + +/*-------------------------------------------------------------------------*/ +/** + @brief Set a key in a dictionary, providing a double. + @param d Dictionary to update. + @param key Key to modify or add + @param val Double value to store (will be stored as a string). + @return void + + This helper function calls dictionary_set() with the provided double + converted to a string using %g. + */ +/*--------------------------------------------------------------------------*/ +int dictionary_setdouble(const dictionary * d, const char * key, const double val); + +/*-------------------------------------------------------------------------*/ +/** + @brief Dump a dictionary to an opened file pointer. + @param d Dictionary to dump + @param f Opened file pointer. + @return void + + Dumps a dictionary onto an opened file pointer. Key pairs are printed out + as @c [Key]=[Value], one per line. It is Ok to provide stdout or stderr as + output file pointers. + */ +/*--------------------------------------------------------------------------*/ +void dictionary_dump(dictionary * d, FILE * out); +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif diff --git a/device/mpp/include/hi_ae_comm.h b/device/mpp/include/hi_ae_comm.h new file mode 100644 index 0000000..959c25d --- /dev/null +++ b/device/mpp/include/hi_ae_comm.h @@ -0,0 +1,181 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_ae_comm.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/18 + Description : + History : + 1.Date : 2012/12/18 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __HI_AE_COMM_H__ +#define __HI_AE_COMM_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define HI_AE_LIB_NAME "hisi_ae_lib" + +/************************** ae ctrl cmd **************************************/ +typedef enum hiAE_CTRL_CMD_E +{ + AE_DEBUG_ATTR_SET, + AE_DEBUG_ATTR_GET, + + AE_CTRL_BUTT, +} AE_CTRL_CMD_E; + +typedef struct hiAE_DBG_ATTR_S +{ + HI_U32 u32MaxIntTime; + HI_U32 u32MinIntTime; + HI_U32 u32MaxAgain; + HI_U32 u32MinAgain; + HI_U32 u32MaxDgain; + HI_U32 u32MinDgain; + HI_U32 u32MaxIspDgain; + HI_U32 u32MinIspDgain; + HI_U32 u32MaxSysGain; + HI_U32 u32MinSysGain; + HI_U32 u32Compensation; + HI_U32 u32EVBias; + HI_BOOL bManualExposureEn; + HI_BOOL bManualTimeEn; + HI_BOOL bManualAgainEn; + HI_BOOL bManualDgainEn; + HI_BOOL bManualIspDgainEn; + HI_U32 u32ManualExposureLines; + HI_U32 u32ManualAgain; + HI_U32 u32ManualDgain; + HI_U32 u32ManualIspDgain; + HI_U32 au32AeWeights[255]; +}AE_DBG_ATTR_S; + +typedef struct hiAE_DBG_STATUS_S +{ + HI_U32 u32FrmNumBgn; + HI_U32 u32FullLines; + HI_U32 u32IntTime; + HI_U32 u32Again; + HI_U32 u32Dgain; + HI_U32 u32IspDgain; + HI_U32 u32IrisFNOLin; + HI_U64 u64Exposure; + HI_U32 u32Increment; + HI_S32 s32HistError; + HI_S32 s32HistOriAverage; + HI_S32 s32LumaOffset; + HI_U32 u32Iso; +}AE_DBG_STATUS_S; + +/************************** sensor's interface to ae *********************/ + +/* eg: 0.35db, enAccuType=AE_ACCURACY_DB, f32Accuracy=0.35 +* and the multiply of 0.35db is power(10, (0.35/20)) +* eg: 1/16, 2/16, 3/16 multiplies, enAccuType=AE_ACCURACY_LINEAR, f32Accuracy=0.0625 +* eg: 1,2,4,8,16 multiplies, enAccuType=AE_ACCURACY_DB, f32Accuracy=6 +*/ +typedef enum hiAE_ACCURACY_E +{ + AE_ACCURACY_DB = 0, + AE_ACCURACY_LINEAR, + AE_ACCURACY_TABLE, + + AE_ACCURACY_BUTT, +} AE_ACCURACY_E; + +typedef struct hiAE_ACCURACY_S +{ + AE_ACCURACY_E enAccuType; + float f32Accuracy; + float f32Offset; +} AE_ACCURACY_S; + +typedef struct hiAE_SENSOR_DEFAULT_S +{ + HI_U8 au8HistThresh[4]; + HI_U8 u8AeCompensation; + + HI_U32 u32LinesPer500ms; + HI_U32 u32FlickerFreq; + HI_FLOAT f32Fps; + HI_U32 u32InitExposure; + + HI_U32 u32FullLinesStd; + HI_U32 u32MaxIntTime; /* unit is line */ + HI_U32 u32MinIntTime; + HI_U32 u32MaxIntTimeTarget; + HI_U32 u32MinIntTimeTarget; + AE_ACCURACY_S stIntTimeAccu; + + HI_U32 u32MaxAgain; + HI_U32 u32MinAgain; + HI_U32 u32MaxAgainTarget; + HI_U32 u32MinAgainTarget; + AE_ACCURACY_S stAgainAccu; + + HI_U32 u32MaxDgain; + HI_U32 u32MinDgain; + HI_U32 u32MaxDgainTarget; + HI_U32 u32MinDgainTarget; + AE_ACCURACY_S stDgainAccu; + + HI_U32 u32MaxISPDgainTarget; + HI_U32 u32MinISPDgainTarget; + HI_U32 u32ISPDgainShift; + + ISP_AE_ROUTE_S stAERouteAttr; + HI_BOOL bAERouteExValid; + ISP_AE_ROUTE_EX_S stAERouteAttrEx; + + HI_U8 u16ManRatioEnable; + HI_U32 u32Ratio; + + ISP_IRIS_TYPE_E enIrisType; + ISP_PIRIS_ATTR_S stPirisAttr; +} AE_SENSOR_DEFAULT_S; + + +typedef struct hiAE_SENSOR_EXP_FUNC_S +{ + HI_S32(*pfn_cmos_get_ae_default)(AE_SENSOR_DEFAULT_S *pstAeSnsDft); + + /* the function of sensor set fps */ + HI_VOID(*pfn_cmos_fps_set)(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft); + HI_VOID(*pfn_cmos_slow_framerate_set)(HI_U32 u32FullLines, AE_SENSOR_DEFAULT_S *pstAeSnsDft); + + /* while isp notify ae to update sensor regs, ae call these funcs. */ + HI_VOID(*pfn_cmos_inttime_update)(HI_U32 u32IntTime); + HI_VOID(*pfn_cmos_gains_update)(HI_U32 u32Again, HI_U32 u32Dgain); + + HI_VOID (*pfn_cmos_again_calc_table)(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb); + HI_VOID (*pfn_cmos_dgain_calc_table)(HI_U32 *pu32DgainLin, HI_U32 *pu32DgainDb); + + HI_VOID (*pfn_cmos_get_inttime_max)(HI_U32 u32Ratio, HI_U32 *pu32IntTimeMax); + +} AE_SENSOR_EXP_FUNC_S; + +typedef struct hiAE_SENSOR_REGISTER_S +{ + AE_SENSOR_EXP_FUNC_S stSnsExp; +} AE_SENSOR_REGISTER_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/include/hi_af_comm.h b/device/mpp/include/hi_af_comm.h new file mode 100644 index 0000000..a2d0686 --- /dev/null +++ b/device/mpp/include/hi_af_comm.h @@ -0,0 +1,36 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_af_comm.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/20 + Description : + History : + 1.Date : 2012/12/20 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __HI_AF_COMM_H__ +#define __HI_AF_COMM_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define HI_AF_LIB_NAME "hisi_af_lib" + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/include/hi_awb_comm.h b/device/mpp/include/hi_awb_comm.h new file mode 100644 index 0000000..54d3967 --- /dev/null +++ b/device/mpp/include/hi_awb_comm.h @@ -0,0 +1,169 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_awb_comm.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/19 + Description : + History : + 1.Date : 2012/12/19 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __HI_AWB_COMM_H__ +#define __HI_AWB_COMM_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define HI_AWB_LIB_NAME "hisi_awb_lib" + +/************************** isp ctrl cmd *************************************/ +typedef enum hiAWB_CTRL_CMD_E +{ + AWB_SATURATION_SET, + AWB_SATURATION_GET, + + AWB_DEBUG_ATTR_SET, + AWB_DEBUG_ATTR_GET, + + AWB_CTRL_BUTT, +} AWB_CTRL_CMD_E; + +typedef struct hiAWB_DBG_ATTR_S +{ + HI_U16 u16WhiteLevel; + HI_U16 u16BlackLevel; + HI_U16 u16CrMax; + HI_U16 u16CrMin; + HI_U16 u16CbMax; + HI_U16 u16CbMin; + HI_U16 u16CrHigh; + HI_U16 u16CrLow; + HI_U16 u16CbHigh; + HI_U16 u16CbLow; + HI_U16 u16RawWhiteLevel; + HI_U16 u16RawBlackLevel; + HI_U16 u16RawCrMax; + HI_U16 u16RawCrMin; + HI_U16 u16RawCbMax; + HI_U16 u16RawCbMin; + HI_U16 u16RawCrHigh; + HI_U16 u16RawCrLow; + HI_U16 u16RawCbHigh; + HI_U16 u16RawCbLow; + + HI_U16 u16WDRMode; + HI_U16 u16Enable; + HI_U16 u16ManualEnable; + HI_U16 u16Zone; + HI_U16 u16HighTemp; + HI_U16 u16LowTemp; + HI_U16 u16RefTemp; + HI_U16 u16RgainBase; + HI_U16 u16GgainBase; + HI_U16 u16BgainBase; + HI_S32 s32p1; + HI_S32 s32p2; + HI_S32 s32q; + HI_S32 s32a; + HI_S32 s32c; + + HI_U16 u16ManSatEnable; + HI_U16 u16SatTarget; +} AWB_DBG_ATTR_S; + +typedef struct hiAWB_ZONE_DBG_S +{ + HI_U16 u16Sum; + HI_U16 u16Rg; + HI_U16 u16Bg; + HI_U16 u16CountAll; + HI_U16 u16CountMin; + HI_U16 u16CountMax; + HI_U16 u16RawRAvg; + HI_U16 u16RawGAvg; + HI_U16 u16RawBAvg; + HI_U16 u16TK; + HI_U16 u16Weight; + HI_S16 s16Shift; +}AWB_ZONE_DBG_S; + +typedef struct hiAWB_DBG_STATUS_S +{ + HI_U32 u32FrmNumBgn; + HI_U32 u32GlobalSum; + HI_U16 u16GlobalRgSta; + HI_U16 u16GlobalBgSta; + HI_U16 u16GlobalCountAll; + HI_U16 u16GlobalCountMin; + HI_U16 u16GlobalCountMax; + HI_U16 u16GlobalRAvg; + HI_U16 u16GlobalGAvg; + HI_U16 u16GlobalBAvg; + HI_U16 u16TK; + HI_U16 u16Rgain; + HI_U16 u16Ggain; + HI_U16 u16Bgain; + HI_U16 au16CCM[9]; + + HI_U32 au32HistInfo[256]; + AWB_ZONE_DBG_S astZoneDebug[255]; + + HI_U32 u32FrmNumEnd; +} AWB_DBG_STATUS_S; + +/************************** sensor's interface to awb *********************/ +typedef struct hiAWB_CCM_S +{ + HI_U16 u16HighColorTemp; /* D50 lighting source is recommended */ + HI_U16 au16HighCCM[9]; + HI_U16 u16MidColorTemp; /* D32 lighting source is recommended */ + HI_U16 au16MidCCM[9]; + HI_U16 u16LowColorTemp; /* A lighting source is recommended */ + HI_U16 au16LowCCM[9]; +}AWB_CCM_S; + +typedef struct hiAWB_AGC_TABLE_S +{ + HI_BOOL bValid; + + HI_U8 au8Saturation[16]; /* adjust saturation, different iso with different saturation */ +} AWB_AGC_TABLE_S; + +typedef struct hiAWB_SENSOR_DEFAULT_S +{ + HI_U16 u16WbRefTemp; /* reference color temperature for WB */ + HI_U16 au16GainOffset[4]; /* gain offset for white balance */ + HI_S32 as32WbPara[6]; /* parameter for wb curve,p1,p2,q1,a1,b1,c1 */ + + AWB_AGC_TABLE_S stAgcTbl; + AWB_CCM_S stCcm; +} AWB_SENSOR_DEFAULT_S; + +typedef struct hiAWB_SENSOR_EXP_FUNC_S +{ + HI_S32(*pfn_cmos_get_awb_default)(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft); +} AWB_SENSOR_EXP_FUNC_S; + +typedef struct hiAWB_SENSOR_REGISTER_S +{ + AWB_SENSOR_EXP_FUNC_S stSnsExp; +} AWB_SENSOR_REGISTER_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/include/hi_comm_3a.h b/device/mpp/include/hi_comm_3a.h new file mode 100644 index 0000000..a8db789 --- /dev/null +++ b/device/mpp/include/hi_comm_3a.h @@ -0,0 +1,388 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_3a.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/18 + Description : + History : + 1.Date : 2012/12/18 + Author : n00168968 + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_COMM_3A_H__ +#define __HI_COMM_3A_H__ + +#include "hi_common.h" +#include "hi_comm_isp.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define IS_LINEAR_MODE(mode) (WDR_MODE_NONE == (mode)) +#define IS_WDR_MODE(mode) ((!IS_LINEAR_MODE(mode)) && ((mode) < WDR_MODE_BUTT)) +#define IS_BUILT_IN_WDR_MODE(mode) (WDR_MODE_BUILT_IN == (mode)) +#define IS_FS_WDR_MODE(mode) ((!IS_LINEAR_MODE(mode))&& (!IS_BUILT_IN_WDR_MODE(mode)) && ((mode) < WDR_MODE_BUTT)) +#define IS_2to1_WDR_MODE(mode) ((WDR_MODE_2To1_FRAME == (mode)) || (WDR_MODE_2To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_2To1_LINE == (mode))) +#define IS_3to1_WDR_MODE(mode) ((WDR_MODE_3To1_FRAME == (mode)) || (WDR_MODE_3To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_3To1_LINE == (mode))) +#define IS_4to1_WDR_MODE(mode) ((WDR_MODE_4To1_FRAME == (mode)) || (WDR_MODE_4To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_4To1_LINE == (mode))) +#define IS_FULL_WDR_MODE(mode) ((WDR_MODE_2To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_3To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_4To1_FRAME_FULL_RATE == (mode))) +#define IS_HALF_WDR_MODE(mode) ((WDR_MODE_2To1_FRAME == (mode)) || (WDR_MODE_3To1_FRAME == (mode)) || (WDR_MODE_4To1_FRAME == (mode))) +#define IS_LINE_WDR_MODE(mode) ((WDR_MODE_2To1_LINE == (mode)) || (WDR_MODE_3To1_LINE == (mode)) || (WDR_MODE_4To1_LINE == (mode))) + +#define MAX_REGISTER_ALG_LIB_NUM 2 + +typedef enum hiISP_ALG_MOD_E +{ + ISP_ALG_AE = 0, + ISP_ALG_AF, + ISP_ALG_AWB, + //ISP_ALG_ANTIFOG, + ISP_ALG_BLC, + ISP_ALG_DP, + ISP_ALG_DRC, + ISP_ALG_DEMOSAIC, + ISP_ALG_GAMMA, + ISP_ALG_GAMMAFE, + ISP_ALG_GE, + //ISP_ALG_NEW_ANTIFOG, + ISP_ALG_NR, + ISP_ALG_SHARPEN, + ISP_ALG_SHADING, + ISP_ALG_FrameWDR, + ISP_ALG_FPN, + ISP_ALG_DEHAZE, + ISP_ALG_ACM, + ISP_ALG_CAC, + ISP_ALG_CSC, + ISP_ALG_COMPANDER, + ISP_ALG_UVNR, + ISP_ALG_LSC, + ISP_ALG_RGBIR, + ISP_ALG_COMM, + ISP_ALG_BUTT, +} ISP_ALG_MOD_E; + +typedef enum hiISP_CTRL_CMD_E +{ + ISP_WDR_MODE_SET = 8000, + ISP_PROC_WRITE, + + ISP_AE_FPS_BASE_SET, + + ISP_AWB_ISO_SET, /* set iso, change saturation when iso change */ + ISP_CHANGE_IMAGE_MODE_SET, + ISP_DCFINFO_GET, + ISP_AWB_INTTIME_SET, + + ISP_CTRL_CMD_BUTT, +} ISP_CTRL_CMD_E; + +typedef struct hiISP_CTRL_PROC_WRITE_S +{ + HI_CHAR *pcProcBuff; + HI_U32 u32BuffLen; + HI_U32 u32WriteLen; /* The len count should contain '\0'. */ +} ISP_CTRL_PROC_WRITE_S; + +/******************************** AE *************************************/ +/* the init param of ae alg */ +typedef struct hiISP_AE_PARAM_S +{ + SENSOR_ID SensorId; + HI_U8 u8WDRMode; + HI_FLOAT f32Fps; + + HI_S32 s32Rsv; +} ISP_AE_PARAM_S; + +/* the statistics of ae alg */ +typedef struct hiISP_AE_STAT_1_S +{ + HI_U8 au8MeteringHistThresh[4]; + HI_U16 au16MeteringHist[4]; +} ISP_AE_STAT_1_S; + +typedef struct hiISP_AE_STAT_2_S +{ + HI_U8 au8MeteringHistThresh[4]; + HI_U16 au16MeteringMemArrary[AE_ZONE_ROW][AE_ZONE_COLUMN][5]; +} ISP_AE_STAT_2_S; + +typedef struct hiISP_AE_STAT_3_S +{ + HI_U32 u32PixelCount; + HI_U32 u32PixelWeight; + HI_U32 au32HistogramMemArray[256]; +} ISP_AE_STAT_3_S; + +typedef struct hiISP_AE_STAT_4_S +{ + HI_U16 u16GlobalAvgR; + HI_U16 u16GlobalAvgGr; + HI_U16 u16GlobalAvgGb; + HI_U16 u16GlobalAvgB; +} ISP_AE_STAT_4_S; + +typedef struct hiISP_AE_STAT_5_S +{ + HI_U16 au16ZoneAvg[AE_ZONE_ROW][AE_ZONE_COLUMN][4]; +} ISP_AE_STAT_5_S; + + +typedef struct hiISP_AE_INFO_S +{ + HI_U32 u32FrameCnt; /* the counting of frame */ + + ISP_AE_STAT_1_S *pstAeStat1; /* not support */ + ISP_AE_STAT_2_S *pstAeStat2; /* not support */ + ISP_AE_STAT_3_S *pstAeStat3; + ISP_AE_STAT_4_S *pstAeStat4; + ISP_AE_STAT_5_S *pstAeStat5; +} ISP_AE_INFO_S; + +typedef struct hiISP_AE_STAT_ATTR_S +{ + HI_BOOL bChange; + + HI_U8 au8MeteringHistThresh[4]; + HI_U8 au8WeightTable[AE_ZONE_ROW][AE_ZONE_COLUMN]; +} ISP_AE_STAT_ATTR_S; + +/* the final calculate of ae alg */ +typedef struct hiISP_AE_RESULT_S +{ + HI_U32 u32IntTime[4]; + HI_U32 u32IspDgain; + HI_U32 u32Iso; + HI_U8 u8AERunInterval; + + HI_BOOL bPirisValid; + HI_S32 s32PirisPos; + HI_U32 u32PirisGain; + + ISP_AE_STAT_ATTR_S stStatAttr; +} ISP_AE_RESULT_S; + +typedef struct hiISP_AE_EXP_FUNC_S +{ + HI_S32 (*pfn_ae_init)(HI_S32 s32Handle, const ISP_AE_PARAM_S *pstAeParam); + HI_S32 (*pfn_ae_run)(HI_S32 s32Handle, + const ISP_AE_INFO_S *pstAeInfo, + ISP_AE_RESULT_S *pstAeResult, + HI_S32 s32Rsv + ); + HI_S32 (*pfn_ae_ctrl)(HI_S32 s32Handle, HI_U32 u32Cmd, HI_VOID *pValue); + HI_S32 (*pfn_ae_exit)(HI_S32 s32Handle); +} ISP_AE_EXP_FUNC_S; + +typedef struct hiISP_AE_REGISTER_S +{ + ISP_AE_EXP_FUNC_S stAeExpFunc; +} ISP_AE_REGISTER_S; + +/******************************** AWB *************************************/ + +/* the init param of awb alg */ +typedef struct hiISP_AWB_PARAM_S +{ + SENSOR_ID SensorId; + HI_U8 u8WDRMode; + + HI_S32 s32Rsv; +} ISP_AWB_PARAM_S; + +/* the statistics of awb alg */ +typedef struct hiISP_AWB_STAT_1_S +{ + HI_U16 u16MeteringAwbRg; + HI_U16 u16MeteringAwbBg; + HI_U32 u32MeteringAwbSum; +} ISP_AWB_STAT_1_S; + +typedef struct hiISP_AWB_STAT_2_S +{ + HI_U16 au16MeteringMemArrayRg[255]; + HI_U16 au16MeteringMemArrayBg[255]; + HI_U16 au16MeteringMemArraySum[255]; +} ISP_AWB_STAT_2_S; + +typedef struct hiISP_AWB_STAT_3_S +{ + HI_U16 u16MeteringAwbAvgR; + HI_U16 u16MeteringAwbAvgG; + HI_U16 u16MeteringAwbAvgB; + HI_U16 u16MeteringAwbCountAll; + HI_U16 u16MeteringAwbCountMin; + HI_U16 u16MeteringAwbCountMax; +} ISP_AWB_STAT_3_S; + +typedef struct hiISP_AWB_STAT_4_S +{ + HI_U16 au16MeteringMemArrayAvgR[255]; + HI_U16 au16MeteringMemArrayAvgG[255]; + HI_U16 au16MeteringMemArrayAvgB[255]; + HI_U16 au16MeteringMemArrayCountAll[255]; + HI_U16 au16MeteringMemArrayCountMin[255]; + HI_U16 au16MeteringMemArrayCountMax[255]; +} ISP_AWB_STAT_4_S; + +typedef struct hiISP_AWB_INFO_S +{ + HI_U32 u32FrameCnt; + + ISP_AWB_STAT_1_S *pstAwbStat1; + ISP_AWB_STAT_2_S *pstAwbStat2; + ISP_AWB_STAT_3_S *pstAwbStat3; + ISP_AWB_STAT_4_S *pstAwbStat4; +} ISP_AWB_INFO_S; + +/* the statistics's attr of awb alg */ +typedef struct hiISP_AWB_STAT_ATTR_S +{ + HI_BOOL bChange; + + HI_U16 u16MeteringWhiteLevelAwb; + HI_U16 u16MeteringBlackLevelAwb; + HI_U16 u16MeteringCrRefMaxAwb; + HI_U16 u16MeteringCbRefMaxAwb; + HI_U16 u16MeteringCrRefMinAwb; + HI_U16 u16MeteringCbRefMinAwb; + HI_U16 u16MeteringCrRefHighAwb; + HI_U16 u16MeteringCrRefLowAwb; + HI_U16 u16MeteringCbRefHighAwb; + HI_U16 u16MeteringCbRefLowAwb; +} ISP_AWB_STAT_ATTR_S; + +typedef struct hiISP_AWB_RAW_STAT_ATTR_S +{ + HI_BOOL bChange; + HI_BOOL bAboveWhiteLevelClip; + HI_BOOL bBelowBlackLevelClip; + + HI_U16 u16MeteringWhiteLevelAwb; + HI_U16 u16MeteringBlackLevelAwb; + HI_U16 u16MeteringCrRefMaxAwb; + HI_U16 u16MeteringCbRefMaxAwb; + HI_U16 u16MeteringCrRefMinAwb; + HI_U16 u16MeteringCbRefMinAwb; + HI_U16 u16MeteringCrRefHighAwb; + HI_U16 u16MeteringCrRefLowAwb; + HI_U16 u16MeteringCbRefHighAwb; + HI_U16 u16MeteringCbRefLowAwb; +} ISP_AWB_RAW_STAT_ATTR_S; + + +/* the final calculate of awb alg */ +typedef struct hiISP_AWB_RESULT_S +{ + HI_U32 au32WhiteBalanceGain[4]; + HI_U16 au16ColorMatrix[9]; + + ISP_AWB_STAT_ATTR_S stStatAttr; + ISP_AWB_RAW_STAT_ATTR_S stRawStatAttr; +} ISP_AWB_RESULT_S; + +typedef struct hiISP_AWB_EXP_FUNC_S +{ + HI_S32 (*pfn_awb_init)(HI_S32 s32Handle, const ISP_AWB_PARAM_S *pstAwbParam); + HI_S32 (*pfn_awb_run)(HI_S32 s32Handle, + const ISP_AWB_INFO_S *pstAwbInfo, + ISP_AWB_RESULT_S *pstAwbResult, + HI_S32 s32Rsv + ); + HI_S32 (*pfn_awb_ctrl)(HI_S32 s32Handle, HI_U32 u32Cmd, HI_VOID *pValue); + HI_S32 (*pfn_awb_exit)(HI_S32 s32Handle); +} ISP_AWB_EXP_FUNC_S; + +typedef struct hiISP_AWB_REGISTER_S +{ + ISP_AWB_EXP_FUNC_S stAwbExpFunc; +} ISP_AWB_REGISTER_S; + +/******************************** AF *************************************/ + +/* the init param of af alg */ +typedef struct hiISP_AF_PARAM_S +{ + SENSOR_ID SensorId; + HI_U8 u8WDRMode; + + HI_S32 s32Rsv; +} ISP_AF_PARAM_S; + +/* the statistics of af alg */ +typedef struct hiISP_AF_ZONE_S +{ + HI_U16 u16v1; + HI_U16 u16h1; + HI_U16 u16v2; + HI_U16 u16h2; + HI_U16 u16y; +} ISP_AF_ZONE_S; +typedef struct hiISP_AF_STAT_S +{ + ISP_AF_ZONE_S stZoneMetrics[AF_ZONE_ROW][AF_ZONE_COLUMN]; /*RO, The zoned measure of contrast*/ +} ISP_AF_STAT_S; + +typedef struct hiISP_AF_INFO_S +{ + HI_U32 u32FrameCnt; + + ISP_AF_STAT_S *stAfStat; +} ISP_AF_INFO_S; + +/* the final calculate of af alg */ +typedef struct hiISP_AF_RESULT_S +{ + HI_S32 s32Rsv; +} ISP_AF_RESULT_S; + +typedef struct hiISP_AF_EXP_FUNC_S +{ + HI_S32 (*pfn_af_init)(HI_S32 s32Handle, const ISP_AF_PARAM_S *pstAfParam); + HI_S32 (*pfn_af_run)(HI_S32 s32Handle, + const ISP_AF_INFO_S *pstAfInfo, + ISP_AF_RESULT_S *pstAfResult, + HI_S32 s32Rsv + ); + HI_S32 (*pfn_af_ctrl)(HI_S32 s32Handle, HI_U32 u32Cmd, HI_VOID *pValue); + HI_S32 (*pfn_af_exit)(HI_S32 s32Handle); +} ISP_AF_EXP_FUNC_S; + +typedef struct hiISP_AF_REGISTER_S +{ + ISP_AF_EXP_FUNC_S stAfExpFunc; +} ISP_AF_REGISTER_S; + +typedef struct hiALG_LIB_S +{ + HI_S32 s32Id; + HI_CHAR acLibName[20]; +} ALG_LIB_S; + +typedef struct hiISP_BIND_ATTR_S +{ + SENSOR_ID SensorId; + ALG_LIB_S stAeLib; + ALG_LIB_S stAfLib; + ALG_LIB_S stAwbLib; +} ISP_BIND_ATTR_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__HI_COMM_SNS_H__ */ + diff --git a/device/mpp/include/hi_comm_adec.h b/device/mpp/include/hi_comm_adec.h new file mode 100644 index 0000000..15bf179 --- /dev/null +++ b/device/mpp/include/hi_comm_adec.h @@ -0,0 +1,162 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_adec.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2006/12/15 + Last Modified : + Description : + Function List : + History : + 1.Date : 2006/12/15 + Author : z50825 + Modification : Created file + 2.Date : 2007/5/10 + Author : z50825 + Modification : add err code +******************************************************************************/ + + +#ifndef __HI_COMM_ADEC_H__ +#define __HI_COMM_ADEC_H__ + + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_aio.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef struct hiADEC_ATTR_G711_S +{ + HI_U32 resv; +}ADEC_ATTR_G711_S; + +typedef struct hiADEC_ATTR_G726_S +{ + G726_BPS_E enG726bps; +}ADEC_ATTR_G726_S; + +typedef struct hiADEC_ATTR_ADPCM_S +{ + ADPCM_TYPE_E enADPCMType; +}ADEC_ATTR_ADPCM_S; + +typedef struct hiADEC_ATTR_LPCM_S +{ + HI_U32 resv; +}ADEC_ATTR_LPCM_S; + +typedef enum hiADEC_MODE_E +{ + ADEC_MODE_PACK = 0,/*require input is valid dec pack(a + complete frame encode result), + e.g.the stream get from AENC is a + valid dec pack, the stream know actually + pack len from file is also a dec pack. + this mode is high-performative*/ + ADEC_MODE_STREAM ,/*input is stream,low-performative, + if you couldn't find out whether a stream is + vaild dec pack,you could use + this mode*/ + ADEC_MODE_BUTT +}ADEC_MODE_E; + +typedef struct hiADEC_CH_ATTR_S +{ + PAYLOAD_TYPE_E enType; + HI_U32 u32BufSize; /*buf size[2~MAX_AUDIO_FRAME_NUM]*/ + ADEC_MODE_E enMode; /*decode mode*/ + HI_VOID *pValue; +}ADEC_CHN_ATTR_S; + +typedef struct hiADEC_DECODER_S +{ + PAYLOAD_TYPE_E enType; + HI_CHAR aszName[16]; + HI_S32 (*pfnOpenDecoder)(HI_VOID *pDecoderAttr, HI_VOID **ppDecoder); /*struct ppDecoder is packed by user,user malloc and free memory for this struct */ + HI_S32 (*pfnDecodeFrm)(HI_VOID *pDecoder, HI_U8 **pu8Inbuf,HI_S32 *ps32LeftByte, + HI_U16 *pu16Outbuf,HI_U32 *pu32OutLen,HI_U32 *pu32Chns); + HI_S32 (*pfnGetFrmInfo)(HI_VOID *pDecoder, HI_VOID *pInfo); + HI_S32 (*pfnCloseDecoder)(HI_VOID *pDecoder); + HI_S32 (*pfnResetDecoder)(HI_VOID *pDecoder); +} ADEC_DECODER_S; + +typedef enum hiEN_ADEC_ERR_CODE_E +{ + ADEC_ERR_DECODER_ERR = 64, + ADEC_ERR_BUF_LACK, + ADEC_ERR_VOICE_DEC_TYPE, + ADEC_ERR_VOICE_DEC_FRAMESIZE, + ADEC_ERR_VOICE_DEC_FRAMETYPE, + ADEC_ERR_VOICE_INVALID_DEVICE, + ADEC_ERR_VOICE_INVALID_INBUF, + ADEC_ERR_VOICE_INVALID_OUTBUF, + ADEC_ERR_VOICE_TRANS_DEVICE, + ADEC_ERR_VOICE_TRANS_TYPE, + +} EN_ADEC_ERR_CODE_E; + + +/* invlalid device ID */ +#define HI_ERR_ADEC_INVALID_DEVID HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_ADEC_INVALID_CHNID HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_ADEC_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_ADEC_EXIST HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* channel unexists */ +#define HI_ERR_ADEC_UNEXIST HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_ADEC_NULL_PTR HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_ADEC_NOT_CONFIG HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_ADEC_NOT_SUPPORT HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_ADEC_NOT_PERM HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_ADEC_NOMEM HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_ADEC_NOBUF HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_ADEC_BUF_EMPTY HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_ADEC_BUF_FULL HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_ADEC_SYS_NOTREADY HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/* decoder internal err */ +#define HI_ERR_ADEC_DECODER_ERR HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_DECODER_ERR) +/* input buffer not enough to decode one frame */ +#define HI_ERR_ADEC_BUF_LACK HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_BUF_LACK) + + + +#define HI_ERR_ADEC_DEC_TYPE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_DEC_TYPE) +#define HI_ERR_ADEC_DEC_FRAMESIZE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_DEC_FRAMESIZE) +#define HI_ERR_ADEC_DEC_FRAMETYPE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_DEC_FRAMETYPE) +#define HI_ERR_ADEC_INVALID_DEVICE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_INVALID_DEVICE) +#define HI_ERR_ADEC_INVALID_INBUF HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_INVALID_INBUF) +#define HI_ERR_ADEC_INVALID_OUTBUF HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_INVALID_OUTBUF) +#define HI_ERR_ADEC_TRANS_DEVICE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_TRANS_DEVICE) +#define HI_ERR_ADEC_TRANS_TYPE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_TRANS_TYPE) + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif/* End of #ifndef __HI_COMM_ADEC_H__*/ + diff --git a/device/mpp/include/hi_comm_aenc.h b/device/mpp/include/hi_comm_aenc.h new file mode 100644 index 0000000..0de55d6 --- /dev/null +++ b/device/mpp/include/hi_comm_aenc.h @@ -0,0 +1,125 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_aenc.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2006/12/15 + Last Modified : + Description : + Function List : + History : + 1.Date : 2006/12/15 + Author : z50825 + Modification : Created file + 2.Date : 2007/5/10 + Author : z50825 + Modification : add err code +******************************************************************************/ + + +#ifndef __HI_COMM_AENC_H__ +#define __HI_COMM_AENC_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_aio.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef struct hiAENC_ATTR_G711_S +{ + HI_U32 resv; /*reserve item*/ +}AENC_ATTR_G711_S; + +typedef struct hiAENC_ATTR_G726_S +{ + G726_BPS_E enG726bps; +}AENC_ATTR_G726_S; + +typedef struct hiAENC_ATTR_ADPCM_S +{ + ADPCM_TYPE_E enADPCMType; +}AENC_ATTR_ADPCM_S; + +typedef struct hiAENC_ATTR_LPCM_S +{ + HI_U32 resv; /*reserve item*/ +}AENC_ATTR_LPCM_S; + +typedef struct hiAENC_ENCODER_S +{ + PAYLOAD_TYPE_E enType; + HI_U32 u32MaxFrmLen; + HI_CHAR aszName[16]; /* encoder type,be used to print proc information */ + HI_S32 (*pfnOpenEncoder)(HI_VOID *pEncoderAttr, HI_VOID **ppEncoder); /* pEncoder is the handle to control the encoder */ + HI_S32 (*pfnEncodeFrm)(HI_VOID *pEncoder, const AUDIO_FRAME_S *pstData, + HI_U8 *pu8Outbuf,HI_U32 *pu32OutLen); + HI_S32 (*pfnCloseEncoder)(HI_VOID *pEncoder); +} AENC_ENCODER_S; + +typedef struct hiAENC_CHN_ATTR_S +{ + PAYLOAD_TYPE_E enType; /*payload type ()*/ + HI_U32 u32PtNumPerFrm; + HI_U32 u32BufSize; /*buf size [2~MAX_AUDIO_FRAME_NUM]*/ + HI_VOID *pValue; /*point to attribute of definite audio encoder*/ +}AENC_CHN_ATTR_S; + +typedef enum hiEN_AENC_ERR_CODE_E +{ + AENC_ERR_ENCODER_ERR = 64 , + AENC_ERR_VQEW_ERR = 65 , + +} EN_AENC_ERR_CODE_E; + + +/* invlalid device ID */ +#define HI_ERR_AENC_INVALID_DEVID HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_AENC_INVALID_CHNID HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_AENC_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_AENC_EXIST HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* channel unexists */ +#define HI_ERR_AENC_UNEXIST HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_AENC_NULL_PTR HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_AENC_NOT_CONFIG HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_AENC_NOT_SUPPORT HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change static attribute */ +#define HI_ERR_AENC_NOT_PERM HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_AENC_NOMEM HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_AENC_NOBUF HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_AENC_BUF_EMPTY HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_AENC_BUF_FULL HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_AENC_SYS_NOTREADY HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/* encoder internal err */ +#define HI_ERR_AENC_ENCODER_ERR HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, AENC_ERR_ENCODER_ERR) +/* vqe internal err */ +#define HI_ERR_AENC_VQEW_ERR HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, AENC_ERR_VQEW_ERR) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif/* End of #ifndef __HI_COMM_AENC_H__*/ + diff --git a/device/mpp/include/hi_comm_ai.h b/device/mpp/include/hi_comm_ai.h new file mode 100644 index 0000000..6104c41 --- /dev/null +++ b/device/mpp/include/hi_comm_ai.h @@ -0,0 +1,36 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_ai.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ + + +#ifndef __HI_COMM_AI_H__ +#define __HI_COMM_AI_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_AI_H__ */ + diff --git a/device/mpp/include/hi_comm_aio.h b/device/mpp/include/hi_comm_aio.h new file mode 100644 index 0000000..009f972 --- /dev/null +++ b/device/mpp/include/hi_comm_aio.h @@ -0,0 +1,483 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_aio.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ + + +#ifndef __HI_COMM_AIO_H__ +#define __HI_COMM_AIO_H__ + +#include "hi_common.h" +#include "hi_errno.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +#define MAX_AUDIO_FRAME_NUM 50 /*max count of audio frame in Buffer */ +#define MAX_AUDIO_POINT_BYTES 4 /*max bytes of one sample point(now 32bit max)*/ + +#define MAX_VOICE_POINT_NUM 480 /*max sample per frame for voice encode */ + +#define MAX_AUDIO_POINT_NUM 2048 /*max sample per frame for all encoder(aacplus:2048)*/ +#define MAX_AO_POINT_NUM 4096 /* from h3support 4096 framelen*/ +#define MIN_AUDIO_POINT_NUM 80 /*min sample per frame*/ +#define MAX_AI_POINT_NUM 2048 /*max sample per frame for all encoder(aacplus:2048)*/ + +/*max length of audio frame by bytes, one frame contain many sample point */ +#define MAX_AUDIO_FRAME_LEN (MAX_AUDIO_POINT_BYTES*MAX_AO_POINT_NUM) + +/*max length of audio stream by bytes */ +#define MAX_AUDIO_STREAM_LEN MAX_AUDIO_FRAME_LEN + +#define MAX_AI_USRFRM_DEPTH 30 /*max depth of user frame buf */ + +/*The VQE EQ Band num.*/ +#define VQE_EQ_BAND_NUM 10 + + +typedef enum hiAUDIO_SAMPLE_RATE_E +{ + AUDIO_SAMPLE_RATE_8000 = 8000, /* 8K samplerate*/ + AUDIO_SAMPLE_RATE_12000 = 12000, /* 12K samplerate*/ + AUDIO_SAMPLE_RATE_11025 = 11025, /* 11.025K samplerate*/ + AUDIO_SAMPLE_RATE_16000 = 16000, /* 16K samplerate*/ + AUDIO_SAMPLE_RATE_22050 = 22050, /* 22.050K samplerate*/ + AUDIO_SAMPLE_RATE_24000 = 24000, /* 24K samplerate*/ + AUDIO_SAMPLE_RATE_32000 = 32000, /* 32K samplerate*/ + AUDIO_SAMPLE_RATE_44100 = 44100, /* 44.1K samplerate*/ + AUDIO_SAMPLE_RATE_48000 = 48000, /* 48K samplerate*/ + AUDIO_SAMPLE_RATE_BUTT, +} AUDIO_SAMPLE_RATE_E; + +typedef enum hiAUDIO_BIT_WIDTH_E +{ + AUDIO_BIT_WIDTH_8 = 0, /* 8bit width */ + AUDIO_BIT_WIDTH_16 = 1, /* 16bit width*/ + AUDIO_BIT_WIDTH_24 = 2, /* 24bit width*/ + AUDIO_BIT_WIDTH_BUTT, +} AUDIO_BIT_WIDTH_E; + +typedef enum hiAIO_MODE_E +{ + AIO_MODE_I2S_MASTER = 0, /* AIO I2S master mode */ + AIO_MODE_I2S_SLAVE, /* AIO I2S slave mode */ + AIO_MODE_PCM_SLAVE_STD, /* AIO PCM slave standard mode */ + AIO_MODE_PCM_SLAVE_NSTD, /* AIO PCM slave non-standard mode */ + AIO_MODE_PCM_MASTER_STD, /* AIO PCM master standard mode */ + AIO_MODE_PCM_MASTER_NSTD, /* AIO PCM master non-standard mode */ + AIO_MODE_BUTT +} AIO_MODE_E; + +typedef enum hiAIO_SOUND_MODE_E +{ + AUDIO_SOUND_MODE_MONO =0,/*mono*/ + AUDIO_SOUND_MODE_STEREO =1,/*stereo*/ + AUDIO_SOUND_MODE_BUTT +} AUDIO_SOUND_MODE_E; + +/* +An example of the packing scheme for G726-32 codewords is as shown, and bit A3 is the least significant bit of the first codeword: +RTP G726-32: +0 1 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +|B B B B|A A A A|D D D D|C C C C| ... +|0 1 2 3|0 1 2 3|0 1 2 3|0 1 2 3| ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + +MEDIA G726-32: +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +|A A A A|B B B B|C C C C|D D D D| ... +|3 2 1 0|3 2 1 0|3 2 1 0|3 2 1 0| ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +*/ +typedef enum hiG726_BPS_E +{ + G726_16K = 0, /* G726 16kbps, see RFC3551.txt 4.5.4 G726-16 */ + G726_24K, /* G726 24kbps, see RFC3551.txt 4.5.4 G726-24 */ + G726_32K, /* G726 32kbps, see RFC3551.txt 4.5.4 G726-32 */ + G726_40K, /* G726 40kbps, see RFC3551.txt 4.5.4 G726-40 */ + MEDIA_G726_16K, /* G726 16kbps for ASF ... */ + MEDIA_G726_24K, /* G726 24kbps for ASF ... */ + MEDIA_G726_32K, /* G726 32kbps for ASF ... */ + MEDIA_G726_40K, /* G726 40kbps for ASF ... */ + G726_BUTT, +} G726_BPS_E; + +typedef enum hiADPCM_TYPE_E +{ + /* see DVI4 diiffers in three respects from the IMA ADPCM at RFC3551.txt 4.5.1 DVI4 */ + + ADPCM_TYPE_DVI4 = 0, /* 32kbps ADPCM(DVI4) for RTP */ + ADPCM_TYPE_IMA, /* 32kbps ADPCM(IMA),NOTICE:point num must be 161/241/321/481 */ + ADPCM_TYPE_ORG_DVI4, + ADPCM_TYPE_BUTT, +} ADPCM_TYPE_E; + +#define AI_EXPAND 0x01 +#define AI_CUT 0x02 + +typedef struct hiAIO_ATTR_S +{ + AUDIO_SAMPLE_RATE_E enSamplerate; /* sample rate */ + AUDIO_BIT_WIDTH_E enBitwidth; /* bitwidth */ + AIO_MODE_E enWorkmode; /* master or slave mode */ + AUDIO_SOUND_MODE_E enSoundmode; /* momo or steror */ + HI_U32 u32EXFlag; /* expand 8bit to 16bit,use AI_EXPAND(only valid for AI 8bit) */ + HI_U32 u32FrmNum; /* frame num in buf[2,MAX_AUDIO_FRAME_NUM] */ + HI_U32 u32PtNumPerFrm; /* point num per frame (80/160/240/320/480/1024/2048) + (ADPCM IMA should add 1 point, AMR only support 160) */ + HI_U32 u32ChnCnt; /* channle number on FS, valid value:1/2/4/8 */ + HI_U32 u32ClkSel; /* 0: AI and AO clock is separate + 1: AI and AO clock is inseparate, AI use AO's clock + */ +} AIO_ATTR_S; + +typedef struct hiAI_CHN_PARAM_S +{ + HI_U32 u32UsrFrmDepth; +} AI_CHN_PARAM_S; + +typedef struct hiAUDIO_FRAME_S +{ + AUDIO_BIT_WIDTH_E enBitwidth; /*audio frame bitwidth*/ + AUDIO_SOUND_MODE_E enSoundmode; /*audio frame momo or stereo mode*/ + HI_VOID *pVirAddr[2]; + HI_U32 u32PhyAddr[2]; + HI_U64 u64TimeStamp; /*audio frame timestamp*/ + HI_U32 u32Seq; /*audio frame seq*/ + HI_U32 u32Len; /*data lenth per channel in frame*/ + HI_U32 u32PoolId[2]; +} AUDIO_FRAME_S; + +typedef struct hiAEC_FRAME_S +{ + AUDIO_FRAME_S stRefFrame; /* AEC reference audio frame */ + HI_BOOL bValid; /* whether frame is valid */ + HI_BOOL bSysBind; /* whether is sysbind */ +} AEC_FRAME_S; + +typedef struct hiAUDIO_FRAME_COMBINE_S +{ + AUDIO_FRAME_S stFrm; /* audio frame */ + AEC_FRAME_S stRefFrm; /* AEC reference audio frame */ +} AUDIO_FRAME_COMBINE_S; + +typedef struct hiAUDIO_FRAME_INFO_S +{ + AUDIO_FRAME_S *pstFrame;/*frame ptr*/ + HI_U32 u32Id; /*frame id*/ +} AUDIO_FRAME_INFO_S; + +typedef struct hiAUDIO_STREAM_S +{ + HI_U8 *pStream; /* the virtual address of stream */ + HI_U32 u32PhyAddr; /* the physics address of stream */ + HI_U32 u32Len; /* stream lenth, by bytes */ + HI_U64 u64TimeStamp; /* frame time stamp*/ + HI_U32 u32Seq; /* frame seq,if stream is not a valid frame,u32Seq is 0*/ +} AUDIO_STREAM_S; + +typedef struct hiAUDIO_RESAMPLE_ATTR_S +{ + HI_U32 u32InPointNum; /* input point number of frame */ + AUDIO_SAMPLE_RATE_E enInSampleRate; /* input sample rate */ + AUDIO_SAMPLE_RATE_E enOutSampleRate; /* output sample rate */ +} AUDIO_RESAMPLE_ATTR_S; + +typedef struct hiAO_CHN_STATE_S +{ + HI_U32 u32ChnTotalNum; /* total number of channel buffer */ + HI_U32 u32ChnFreeNum; /* free number of channel buffer */ + HI_U32 u32ChnBusyNum; /* busy number of channel buffer */ +} AO_CHN_STATE_S; + +typedef struct hiAIO_RESMP_INFO_S +{ + HI_BOOL bReSmpEnable; /* resample enable or disable */ + AUDIO_RESAMPLE_ATTR_S stResmpAttr; +} AIO_RESMP_INFO_S; + +typedef enum hiAUDIO_TRACK_MODE_E +{ + AUDIO_TRACK_NORMAL = 0, + AUDIO_TRACK_BOTH_LEFT = 1, + AUDIO_TRACK_BOTH_RIGHT = 2, + AUDIO_TRACK_EXCHANGE = 3, + AUDIO_TRACK_MIX = 4, + AUDIO_TRACK_LEFT_MUTE = 5, + AUDIO_TRACK_RIGHT_MUTE = 6, + AUDIO_TRACK_BOTH_MUTE = 7, + + AUDIO_TRACK_BUTT +} AUDIO_TRACK_MODE_E; + +typedef enum hiAUDIO_CLKDIR_E +{ + AUDIO_CLKDIR_RISE = 0, + AUDIO_CLKDIR_FALL = 1, + + AUDIO_CLKDIR_BUTT +} AUDIO_CLKDIR_E; + +typedef enum hiAUDIO_FADE_RATE_E +{ + AUDIO_FADE_RATE_1 = 0, + AUDIO_FADE_RATE_2 = 1, + AUDIO_FADE_RATE_4 = 2, + AUDIO_FADE_RATE_8 = 3, + AUDIO_FADE_RATE_16 = 4, + AUDIO_FADE_RATE_32 = 5, + AUDIO_FADE_RATE_64 = 6, + AUDIO_FADE_RATE_128 = 7, + + AUDIO_FADE_RATE_BUTT +} AUDIO_FADE_RATE_E; + +typedef struct hiAUDIO_FADE_S +{ + HI_BOOL bFade; + AUDIO_FADE_RATE_E enFadeInRate; + AUDIO_FADE_RATE_E enFadeOutRate; +} AUDIO_FADE_S; +typedef enum hiAUDIO_AEC_MODE_E +{ + AUDIO_AEC_MODE_CLOSE = 0, + AUDIO_AEC_MODE_OPEN = 1, + + AUDIO_AEC_MODE_BUTT +} AUDIO_AEC_MODE_E; + +/**Defines the configure parameters of AGC.*/ +typedef struct hiAUDIO_AGC_CONFIG_S +{ + HI_BOOL bUsrMode; /* mode 0: auto?mode 1: manual.*/ + + HI_S8 s8TargetLevel; /* target voltage level, range: [-40, -1]dB */ + HI_S8 s8NoiseFloor; /* noise floor, range: [-65, -20]dB */ + HI_S8 s8MaxGain; /* max gain, range: [0, 30]dB */ + HI_S8 s8AdjustSpeed; /* adjustable speed, range: [0, 10]dB/s */ + + HI_S8 s8ImproveSNR; /* switch for improving SNR, range: [0:close, 1:upper limit 3dB, 2:upper limit 6dB] */ + HI_S8 s8UseHighPassFilt; /* switch for using high pass filt, range: [0:close, 1:80Hz, 2:120Hz, 3:150:Hz, 4:300Hz: 5:500Hz] */ + HI_S8 s8OutputMode; /* output mode, mute when lower than noise floor, range: [0:close, 1:open] */ + HI_S16 s16NoiseSupSwitch; /* switch for noise suppression, range: [0:close, 1:open] */ + + + HI_S32 s32Reserved; +} AUDIO_AGC_CONFIG_S; + +/**Defines the configure parameters of AEC.*/ +typedef struct hiAI_AEC_CONFIG_S +{ + HI_BOOL bUsrMode; + HI_S8 s8CngMode; /* cosy-noisy mode:0 close,1 open, default 1*/ + HI_S32 s32Reserved; +} AI_AEC_CONFIG_S; + +/**Defines the configure parameters of ANR.*/ +typedef struct hiAUDIO_ANR_CONFIG_S +{ + HI_BOOL bUsrMode; /* mode 0: auto?mode 1: manual.*/ + + HI_S16 s16NrIntensity; /* noise reduce intensity, range: [0, 25] */ + HI_S16 s16NoiseDbThr; /* noise threshold, range: [30, 60] */ + HI_S8 s8SpProSwitch; /* switch for music probe, range: [0:close, 1:open] */ + + HI_S32 s32Reserved; +} AUDIO_ANR_CONFIG_S; + +/**Defines the configure parameters of HPF.*/ +typedef enum hiAUDIO_HPF_FREQ_E +{ + AUDIO_HPF_FREQ_80 = 80, /* 80Hz */ + AUDIO_HPF_FREQ_120 = 120, /* 120Hz */ + AUDIO_HPF_FREQ_150 = 150, /* 150Hz */ + AUDIO_HPF_FREQ_BUTT, +} AUDIO_HPF_FREQ_E; + +typedef struct hiAUDIO_HPF_CONFIG_S +{ + HI_BOOL bUsrMode; /* mode 0: auto mode 1: mannual.*/ + AUDIO_HPF_FREQ_E enHpfFreq; /*freq to be processed*/ +} AUDIO_HPF_CONFIG_S; + +typedef struct hiAI_RNR_CONFIG_S +{ + HI_BOOL bUsrMode; /* mode 0: auto?mode 1: mannual.*/ + + HI_S32 s32NrMode; /*mode 0: floor noise; 1:ambient noise */ + + HI_S32 s32MaxNrLevel; /*max NR level range:[2,20]dB*/ + + HI_S32 s32NoiseThresh; /*noise threshold, range:[-80, -20]*/ +} AI_RNR_CONFIG_S; + +typedef struct hiAUDIO_EQ_CONFIG_S +{ + HI_S8 s8GaindB[VQE_EQ_BAND_NUM]; /*EQ band, include 100,200,250,350,500,800,1.2k,2.5k,4k,8k in turn, range:[-100, 20]*/ + HI_S32 s32Reserved; +} AUDIO_EQ_CONFIG_S; + + +/**Defines the configure parameters of UPVQE work state.*/ +typedef enum hiVQE_WORKSTATE_E +{ + VQE_WORKSTATE_COMMON = 0, /* common environment, Applicable to the family of voice calls. */ + VQE_WORKSTATE_MUSIC = 1, /* music environment , Applicable to the family of music environment. */ + VQE_WORKSTATE_NOISY = 2, /* noisy environment , Applicable to the noisy voice calls. */ +} VQE_WORKSTATE_E; + +/**Defines the configure parameters of VQE.*/ +typedef struct hiAI_VQE_CONFIG_S +{ + HI_S32 bHpfOpen; + HI_S32 bAecOpen; + HI_S32 bAnrOpen; + HI_S32 bRnrOpen; + HI_S32 bAgcOpen; + HI_S32 bEqOpen; + + HI_S32 s32WorkSampleRate; /* Sample Rate8KHz/16KHzdefault: 8KHz*/ + HI_S32 s32FrameSample; /* VQE frame length 80-4096 */ + VQE_WORKSTATE_E enWorkstate; + + + AUDIO_HPF_CONFIG_S stHpfCfg; + AI_AEC_CONFIG_S stAecCfg; + AUDIO_ANR_CONFIG_S stAnrCfg; + AI_RNR_CONFIG_S stRnrCfg; + AUDIO_AGC_CONFIG_S stAgcCfg; + AUDIO_EQ_CONFIG_S stEqCfg; +} AI_VQE_CONFIG_S; + +typedef struct hiAO_VQE_CONFIG_S +{ + HI_S32 bHpfOpen; + HI_S32 bAnrOpen; /*Anr and Rnr can't enable at the same time,Anr used in voice noise reducing*/ + HI_S32 bAgcOpen; + HI_S32 bEqOpen; + + HI_S32 s32WorkSampleRate; /* Sample Rate8KHz/16KHz/48KHzdefault: 8KHz*/ + HI_S32 s32FrameSample; /* VQE frame length 80-4096 */ + VQE_WORKSTATE_E enWorkstate; + + AUDIO_HPF_CONFIG_S stHpfCfg; + AUDIO_ANR_CONFIG_S stAnrCfg; + AUDIO_AGC_CONFIG_S stAgcCfg; + AUDIO_EQ_CONFIG_S stEqCfg; +} AO_VQE_CONFIG_S; + + +typedef struct hiAI_VQE_INFO_S +{ + HI_BOOL bVqeEnable; /* vqe enable or disable */ + AI_VQE_CONFIG_S stAiVqeCfg; +} AI_VQE_INFO_S; + +typedef struct hiAO_VQE_INFO_S +{ + HI_BOOL bVqeEnable; /* vqe enable or disable */ + AO_VQE_CONFIG_S stAoVqeCfg; +} AO_VQE_INFO_S; + +/**Defines the state of inner codec.*/ +typedef struct hiAI_INNER_CODEC_STATE_S +{ + HI_BOOL bMicInl; + HI_BOOL bMicInr; +} AI_INNER_CODEC_STATE_S; + +/*Defines the configure parameters of AI saving file.*/ +typedef struct hiAUDIO_SAVE_FILE_INFO_S +{ + HI_BOOL bCfg; + HI_CHAR aFilePath[256]; + HI_CHAR aFileName[256]; + HI_U32 u32FileSize; /*in KB*/ +} AUDIO_SAVE_FILE_INFO_S; + + +/* invlalid device ID */ +#define HI_ERR_AI_INVALID_DEVID HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_AI_INVALID_CHNID HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_AI_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* using a NULL point */ +#define HI_ERR_AI_NULL_PTR HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_AI_NOT_CONFIG HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_AI_NOT_SUPPORT HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_AI_NOT_PERM HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* the devide is not enabled */ +#define HI_ERR_AI_NOT_ENABLED HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* failure caused by malloc memory */ +#define HI_ERR_AI_NOMEM HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_AI_NOBUF HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_AI_BUF_EMPTY HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_AI_BUF_FULL HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_AI_SYS_NOTREADY HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + +#define HI_ERR_AI_BUSY HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/* invlalid device ID */ +#define HI_ERR_AO_INVALID_DEVID HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_AO_INVALID_CHNID HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_AO_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* using a NULL point */ +#define HI_ERR_AO_NULL_PTR HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_AO_NOT_CONFIG HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_AO_NOT_SUPPORT HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_AO_NOT_PERM HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* the devide is not enabled */ +#define HI_ERR_AO_NOT_ENABLED HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* failure caused by malloc memory */ +#define HI_ERR_AO_NOMEM HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_AO_NOBUF HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_AO_BUF_EMPTY HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_AO_BUF_FULL HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_AO_SYS_NOTREADY HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + +#define HI_ERR_AO_BUSY HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_AI_H__ */ + diff --git a/device/mpp/include/hi_comm_ao.h b/device/mpp/include/hi_comm_ao.h new file mode 100644 index 0000000..9e9fe06 --- /dev/null +++ b/device/mpp/include/hi_comm_ao.h @@ -0,0 +1,37 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_ao.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ + + +#ifndef __HI_COMM_AO_H__ +#define __HI_COMM_AO_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_AO_H__ */ + diff --git a/device/mpp/include/hi_comm_fisheye.h b/device/mpp/include/hi_comm_fisheye.h new file mode 100644 index 0000000..ef468b1 --- /dev/null +++ b/device/mpp/include/hi_comm_fisheye.h @@ -0,0 +1,65 @@ +/****************************************************************************** + + Copyright (C), 2013-2033, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_fisheye.h + Version : + Author : Hisilicon Hi35xx MPP Team + Created : 2015/06/15 + Last Modified : + Description : common struct definition for FISHEYE + Function List : + History : +******************************************************************************/ +#ifndef __HI_COMM_FISHEYE_H__ +#define __HI_COMM_FISHEYE_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" + +#define MAKE_DWORD(high,low) (((low)&0x0000ffff)|((high)<<16)) +#define HIGH_WORD(x) (((x)&0xffff0000)>>16) +#define LOW_WORD(x) ((x)&0x0000ffff) + +/* failure caused by malloc buffer */ +#define HI_ERR_FISHEYE_NOBUF HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +#define HI_ERR_FISHEYE_BUF_EMPTY HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +#define HI_ERR_FISHEYE_NULL_PTR HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_FISHEYE_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_FISHEYE_BUF_FULL HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +#define HI_ERR_FISHEYE_SYS_NOTREADY HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_FISHEYE_NOT_SUPPORT HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_FISHEYE_NOT_PERMITTED HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) + +typedef HI_S32 FISHEYE_HANDLE; + +typedef struct hiFISHEYE_TASK_ATTR_S +{ + VIDEO_FRAME_INFO_S stImgIn; /* input picture */ + VIDEO_FRAME_INFO_S stImgOut; /* output picture */ + HI_U32 au32privateData[4]; /* task's private data */ + HI_U32 reserved; /* save current picture's state while debug */ +} FISHEYE_TASK_ATTR_S; + +typedef struct hiFISHEYE_ADD_PMF_S +{ + HI_S32 as32PMFCoef[9]; +} FISHEYE_ADD_PMF_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_FISHEYE_H__ */ diff --git a/device/mpp/include/hi_comm_isp.h b/device/mpp/include/hi_comm_isp.h new file mode 100644 index 0000000..bfb527a --- /dev/null +++ b/device/mpp/include/hi_comm_isp.h @@ -0,0 +1,1364 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_isp.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2010/12/20 + Description : + History : + 1.Date : 2010/12/20 + Author : x00100808 + Modification: Created file + + 2.Date : 2014/04/24 + Author : y00246723 + Modification : Add ACM structure define + +******************************************************************************/ + +#ifndef __HI_COMM_ISP_H__ +#define __HI_COMM_ISP_H__ + +#include "hi_type.h" +#include "hi_errno.h" +#include "hi_common.h" +#include "hi_isp_debug.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +/**************************************************************************** + * MACRO DEFINITION * + ****************************************************************************/ + +#define VREG_MAX_NUM (16) + +#define AE_ZONE_ROW (15) +#define AE_ZONE_COLUMN (17) +#define AWB_ZONE_ROW (15) +#define AWB_ZONE_COLUMN (17) +#define AF_ZONE_ROW (15) +#define AF_ZONE_COLUMN (17) +#define LIGHTSOURCE_NUM (4) + +#define STATIC_DP_COUNT_MAX (2048) +#define GAMMA_NODE_NUM (257) +#define GAMMA_FE0_NODE_NUM (33) +#define GAMMA_FE1_NODE_NUM (257) +#define SHADING_MASH_NUM (289) + +#define DEFOG_ZONE_ROW (16) +#define DEFOG_ZONE_COLUMN (15) +#define DEFOG_ZONE_NUM (240) +#define DEFOG_MAX_ZONE_NUM (256) + +#define ISP_AUTO_ISO_STENGTH_NUM (16) + +#define ISP_MAX_SNS_REGS (16) +#define ISP_MAX_DEV_NUM (1) + +#define ISP_CAC_MAX_LUT_SIZE (64) + +#define RGBIR_MATRIX_NUM (15) + +#define AI_MAX_STEP_FNO_NUM (1024) + +/**************************************************************************** + * GENERAL STRUCTURES * + ****************************************************************************/ + +typedef enum hiISP_ERR_CODE_E +{ + ERR_ISP_NOT_INIT = 0x40, + ERR_ISP_MEM_NOT_INIT = 0x41, + ERR_ISP_ATTR_NOT_CFG = 0x42, + ERR_ISP_SNS_UNREGISTER = 0x43, + ERR_ISP_INVALID_ADDR = 0x44, + ERR_ISP_NOMEM = 0x45, +} ISP_ERR_CODE_E; + +#define HI_ERR_ISP_NULL_PTR HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_ISP_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_ISP_NOT_SUPPORT HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) + +#define HI_ERR_ISP_NOT_INIT HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_NOT_INIT) +#define HI_ERR_ISP_MEM_NOT_INIT HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_MEM_NOT_INIT) +#define HI_ERR_ISP_ATTR_NOT_CFG HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_ATTR_NOT_CFG) +#define HI_ERR_ISP_SNS_UNREGISTER HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_SNS_UNREGISTER) +#define HI_ERR_ISP_INVALID_ADDR HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_INVALID_ADDR) +#define HI_ERR_ISP_NOMEM HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_NOMEM) + + +typedef enum hiISP_OP_TYPE_E +{ + OP_TYPE_AUTO = 0, + OP_TYPE_MANUAL = 1, + OP_TYPE_BUTT +} ISP_OP_TYPE_E; + +typedef enum hiISP_STATE_E +{ + ISP_STATE_INIT = 0, + ISP_STATE_SUCCESS = 1, + ISP_STATE_TIMEOUT = 2, + ISP_STATE_BUTT +} ISP_STATUS_E; + +typedef enum hiISP_BAYER_FORMAT_E +{ + BAYER_RGGB = 0, + BAYER_GRBG = 1, + BAYER_GBRG = 2, + BAYER_BGGR = 3, + BAYER_BUTT +} ISP_BAYER_FORMAT_E; + +typedef struct hiISP_PUB_ATTR_S +{ + RECT_S stWndRect; /* RW. */ + HI_FLOAT f32FrameRate; /* RW. */ + ISP_BAYER_FORMAT_E enBayer; /* RW. */ +} ISP_PUB_ATTR_S; + +typedef enum hiISP_FMW_STATE_E +{ + ISP_FMW_STATE_RUN = 0, + ISP_FMW_STATE_FREEZE, + ISP_FMW_STATE_BUTT +} ISP_FMW_STATE_E; + +typedef struct hiISP_WDR_MODE_S +{ + WDR_MODE_E enWDRMode; +} ISP_WDR_MODE_S; + +typedef union hiISP_MODULE_CTRL_U +{ + HI_U32 u32Key; + struct + { + HI_U32 bitBypassVideoTest : 1 ; /* [0] */ + HI_U32 bitBypassBalanceFe : 1 ; /* [1] */ + HI_U32 bitBypassISPDGain : 1 ; /* [2] */ + HI_U32 bitBypassGammaFe : 1 ; /* [3] */ + HI_U32 bitBypassCrosstalkR : 1 ; /* [4] */ + HI_U32 bitBypassDPC : 1 ; /* [5] */ + HI_U32 bitBypassNR : 1 ; /* [6] */ + HI_U32 bitBypassDehaze : 1 ; /* [7] */ + HI_U32 bitBypassWBGain : 1 ; /* [8] */ + HI_U32 bitBypassShading : 1 ; /* [9] */ + HI_U32 bitBypassACM : 1 ; /* [10] */ + HI_U32 bitBypassDRC : 1 ; /* [11] */ + HI_U32 bitBypassDemosaic : 1 ; /* [12] */ + HI_U32 bitBypassColorMatrix: 1 ; /* [13] */ + HI_U32 bitBypassGamma : 1 ; /* [14] */ + HI_U32 bitBypassFSWDR : 1 ; /* [15] */ + HI_U32 bitGammaFePosition : 1 ; /* [16] */ + HI_U32 bit2Rsv3 : 2 ; /* [17:18] */ + HI_U32 bitBypassCsConv : 1 ; /* [19] */ + HI_U32 bit2Rsv4 : 2 ; /* [20:21] */ + HI_U32 bitBypassSharpen : 1 ; /* [22] */ + HI_U32 bitBypassUVNR : 1 ; /* [23] */ + HI_U32 bitChnSwitch : 1 ; /* [24] */ + HI_U32 bit2BypassMode : 2 ; /* [25:26] */ + HI_U32 bitBypassRGBIR : 1 ; /* [27] */ + HI_U32 bitBypassAll : 1 ; /* [28] */ + HI_U32 bit5Rsv5 : 3 ; /* [29:31] */ + }; +}ISP_MODULE_CTRL_U; + + +typedef enum hiISP_COMBINE_MODE_E +{ + FS_WDR_COMBINE_SHORT_FIRST = 0, /* Short exposure data is used when combining */ + FS_WDR_COMBINE_LONG_FIRST = 1, /* Long exposure data is used when combining */ + FS_WDR_COMBINE_BUTT +} ISP_COMBINE_MODE_E; +typedef struct hiISP_WDR_FS_ATTR_S +{ + HI_BOOL bMotionComp; /* RW, HI_TRUE: enable motion compensation; HI_FLASE: disable motion compensation*/ + HI_U16 u16ShortThresh; /* RW, Range: [0x0, 0xFFF]. Data above this threshold will be taken from short exposure only. + This value is normally not changed and should be left at the default value */ + HI_U16 u16LongThresh; /* RW, Range: [0x0, u16ShortThresh]. Data below this threshold will be taken from long exposure only. + This value is normally not changed and should be left at the default value */ + ISP_COMBINE_MODE_E enFSWDRComMode; + + ISP_OP_TYPE_E enExpRatioType; /* RW, OP_TYPE_AUTO: The ExpRatio used in ISP is generated by firmware; OP_TYPE_MANUAL: The ExpRatio used in ISP is set by u32ExpRatio */ + HI_U32 u32ExpRatio; /* RW, Range: [0x40, 0x400]. u32ExpRatio is quotient of long exposure time / short exposure time. + Format: unsigned 6.6-bit floating-point. Only valid when enExpRatioType is OP_TYPE_MANUAL */ +} ISP_WDR_FS_ATTR_S; + + +typedef struct hiISP_DRC_MANUAL_ATTR_S +{ + HI_U8 u8Strength; /* RW, Range: [0, 0xFF]. Strength of dynamic range compression. + Higher values lead to higher differential gain between shadows and highlights. */ +} ISP_DRC_MANUAL_ATTR_S; +typedef struct hiISP_DRC_AUTO_ATTR_S +{ + HI_U8 u8Strength; /* RO, Range: [0, 0xFF]. It is the base strength. The strength used in ISP is generated by firmware. + In linear mode, strength = f1(u8Strength, histogram, ISO) + In sensor WDR mode: strength = f2(u8Strength, histogram, ISO) + In 2to1 WDR mode: strength = f3(ExpRatio, ISO) */ +} ISP_DRC_AUTO_ATTR_S; + +typedef struct hiISP_DRC_ATTR_S +{ + HI_BOOL bEnable; + + HI_U8 u8SpatialVar; /*RW, Range: [0, 0xF].Controls the frequency of the spatial filter */ + HI_U8 u8RangeVar; /*RW, Range: [0, 0xF].Controls the frequency of the range filter*/ + + HI_U8 u8Asymmetry; /*RW, Range: [0x1,0x1E].The parameter0 of DRC tone mapping curve*/ + HI_U8 u8SecondPole; /*RW, Range: [0x96,0xD2].The parameter1 of DRC tone mapping curve*/ + HI_U8 u8Stretch; /*RW, Range: [0x1E,0x3C].The parameter2 of DRC tone mapping curve*/ + + HI_U8 u8LocalMixingBrigtht; /*RW, Range: [0x20,0x80]. Controls the gain of the details where the value of the area is greater than a certain threshold value */ + HI_U8 u8LocalMixingDark; /*RW, Range: [0x20,0x60]. Controls the gain of the details where the value of the area is smaller than a certain threshold value*/ + HI_U8 u8LocalMixingThres; /*RW, Range: [0x2,0xA].The threshold used to distinguish light and dark areas */ + + HI_U16 u16DarkGainLmtY; /*RW, Range: [0x840B,0x8771].Restricts the dark luminance gain*/ + HI_U16 u16DarkGainLmtC; /*RW, Range: [0x840B,0x8771].Restricts the dark chroma gain*/ + HI_U16 u16BrightGainLmt; /*RW, Range: [0xB,0x2D1].Restricts the bright luminance gain*/ + + ISP_OP_TYPE_E enOpType; + ISP_DRC_MANUAL_ATTR_S stManual; + ISP_DRC_AUTO_ATTR_S stAuto; +} ISP_DRC_ATTR_S; + +typedef enum hiISP_STATIC_DP_TYPE_E{ + ISP_STATIC_DP_BRIGHT = 0x0, + ISP_STATIC_DP_DARK, + ISP_STATIC_DP_BUTT +} ISP_STATIC_DP_TYPE_E; + + +typedef struct hiISP_DP_STATIC_CALIBRATE_S +{ + HI_BOOL bEnable; /* not support */ + HI_BOOL bEnableDetect; /* RW. Set 'HI_TRUE'to start static defect-pixel calibration, and firmware will set 'HI_FALSE' when finished. */ + + ISP_STATIC_DP_TYPE_E enStaticDPType; /* Select static bright/dark defect-pixel calibration. */ + HI_U8 u8StartThresh; /* RW, Range: [1, 0xFF]. Start threshold for static defect-pixel calibraiton.Default Value:31(0x1f).. */ + HI_U16 u16CountMax; /* RW, Range: [0, 0x3FF]. Limit of max number of static defect-pixel calibraiton.Default Value:256(0x100). */ + HI_U16 u16CountMin; /* RW, Range: [0, u16CountMax]. Limit of min number of static defect-pixel calibraiton.Default Value:64(0x40). */ + HI_U16 u16TimeLimit; /* RW, Range: [0x0, 0x640].Time limit for static defect-pixel calibraiton, in frame number.Default Value:1600(0x640). */ + + HI_U32 au32Table[STATIC_DP_COUNT_MAX]; /* RO, Static defect-pixel calibraiton table,the first 12 bits represents the X coordinate of the defect pixel, the second 12 bits represent the Y coordinate of the defect pixel. */ + HI_U8 u8FinishThresh; /* RO, Range: [0, 0xFF]. Finish threshold for static defect-pixel calibraiton. */ + HI_U16 u16Count; /* RO, Range: [0, 0x3FF]. Finish number for static defect-pixel calibraiton. */ + ISP_STATUS_E enStatus; /* RO, Status of static defect-pixel calibraiton.Default Value:0(0x0). */ +} ISP_DP_STATIC_CALIBRATE_S; + +typedef struct hiISP_DP_STATIC_ATTR_S +{ + HI_BOOL bEnable; /* RW. Enable/disable the static defect-pixel module.Default Value:1(0x1). */ + HI_U16 u16BrightCount; /* RW, When used as input(W), indicate the number of static bright defect pixels; As output(R),indicate the number of static bright and dark defect pixels */ + HI_U16 u16DarkCount; /* RW, When used as input(W), indicate the number of static dark defect pixels; As output(R), invalid value 0 */ + HI_U32 au32BrightTable[STATIC_DP_COUNT_MAX]; /* RW, Range: [0x0, 0x3FFFFF],the first 12 bits represents the X coordinate of the defect pixel, the second 12 bits represent the Y coordinate of the defect pixel + Notice : When used as input(W), indicate static bright defect pixels table; As output(R), indicate static bright and dark defect pixels table */ + HI_U32 au32DarkTable[STATIC_DP_COUNT_MAX]; /* RW, Range: [0x0, 0x3FFFFF],the first 12 bits represents the X coordinate of the defect pixel, the second 12 bits represent the Y coordinate of the defect pixel + Notice : When used as input(W), indicate static dark defect pixels table; As output(R), invalid value */ + HI_BOOL bShow; /*RW,highlight static defect pixel,default value:0x0*/ +} ISP_DP_STATIC_ATTR_S; + +typedef struct hiISP_DP_DYNAMIC_MANUAL_ATTR_S +{ + HI_U16 u16Slope; /* RW, Range: [0x0, 0x3] */ + HI_U16 u16Thresh; /* not support */ + HI_U16 u16LineThresh; /* not support */ + HI_U16 u16HpThresh; /* not support */ + HI_U16 u16BlendRatio; /* RW, Range: [0x0, 0x100] */ +} ISP_DP_DYNAMIC_MANUAL_ATTR_S; + +typedef struct hiISP_DP_DYNAMIC_AUTO_ATTR_S +{ + HI_U16 au16Slope[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range: [0x0, 0x3] */ + HI_U16 u16Thresh; /* not support */ + HI_U16 u16LineThresh; /* not support */ + HI_U16 u16HpThresh; /* not support */ + HI_U16 au16BlendRatio[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range: [0x0, 0x100] */ +} ISP_DP_DYNAMIC_AUTO_ATTR_S; + +typedef struct hiISP_DP_DYNAMIC_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_DP_DYNAMIC_MANUAL_ATTR_S stManual; + ISP_DP_DYNAMIC_AUTO_ATTR_S stAuto; +} ISP_DP_DYNAMIC_ATTR_S; +typedef struct hiISP_DIS_ATTR_S +{ + HI_BOOL bEnable; +} ISP_DIS_ATTR_S; + + + +typedef struct hiISP_SHADING_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + HI_U32 au32RGain[SHADING_MASH_NUM]; + HI_U32 au32GrGain[SHADING_MASH_NUM]; + HI_U32 au32GbGain[SHADING_MASH_NUM]; + HI_U32 au32BGain[SHADING_MASH_NUM]; +} ISP_SHADING_ATTR_S; + +typedef enum hiISP_IRPOS_TYPE_E +{ + ISP_IRPOS_TYPE_GR = 0x0, + ISP_IRPOS_TYPE_GB, + ISP_IRPOS_TYPE_BUTT +}ISP_IRPOS_TYPE_E; + +typedef struct hiISP_RGBIR_ATTR_S +{ + HI_BOOL bEnable; /*RW, Range: [false, true] Rgbir moudle enable */ + ISP_IRPOS_TYPE_E enIrPosType; /*RW, Range: [0, 1] Rgbir moudle ir position: 0 Gr, 1 Gb */ + HI_U16 u16OverExpThresh; /*RW, Range: [0,4095] Rgbir moudle over exposure threshold*/ +}ISP_RGBIR_ATTR_S; + +typedef struct hiISP_RGBIR_CTRL_S +{ + HI_BOOL bIrOutEn; /*RW, Range: [false, true] Rgbir moudle output ir image enable */ + HI_BOOL bIrFilterEn; /*RW, Range: [false, true] Rgbir moudle noise filter enable */ + HI_BOOL bRemovelEn; /*RW, Range: [false, true] Rgbir moudle removel ir enable */ + ISP_OP_TYPE_E enCompType; /*RW, Range: [false, true] Rgbir moudle after removel ir, compensation type 0:auto,1:manul */ + HI_U16 u16ManuGain; /*RW, Range: [256,1023] Rgbir moudle after removel ir, manul-compensation gain,2bit integer,8bit decimal */ + HI_S16 as16ScaleCoef[RGBIR_MATRIX_NUM]; /*RW, Range: [-512,511] Rgbir moudle removel ir translate matrix,bit9:signed bit,bit8:integer bit,bit7_0:decimal bit*/ +}ISP_RGBIR_CTRL_S; + +typedef struct hiISP_NR_MANUAL_ATTR_S +{ + HI_U8 u8Strength; //not support + HI_U8 u8VarStrength; + HI_U8 u8FixStrength; + HI_U8 u8LowFreqSlope; + HI_U16 u16Threshold; /*Range: [0x0,0xFFF]*/ +} ISP_NR_MANUAL_ATTR_S; + +typedef struct hiISP_NR_AUTO_ATTR_S +{ + HI_U8 au8Strength[ISP_AUTO_ISO_STENGTH_NUM]; //not support + HI_U8 au8FixStrength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8VarStrength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8LowFreqSlope[ISP_AUTO_ISO_STENGTH_NUM]; /*Range: [0x0,0x10]*/ + HI_U16 au16Threshold[ISP_AUTO_ISO_STENGTH_NUM]; /*Range: [0x0,0xFFF]*/ +} ISP_NR_AUTO_ATTR_S; + +typedef struct hiISP_NR_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_NR_MANUAL_ATTR_S stManual; + ISP_NR_AUTO_ATTR_S stAuto; +} ISP_NR_ATTR_S; + +typedef enum hiISP_GAMMA_CURVE_TYPE_E +{ + ISP_GAMMA_CURVE_DEFAULT = 0x0, /* default Gamma curve */ + ISP_GAMMA_CURVE_SRGB, + ISP_GAMMA_CURVE_USER_DEFINE, /* user defined Gamma curve, Gamma Table must be correct */ + ISP_GAMMA_CURVE_BUTT +} ISP_GAMMA_CURVE_TYPE_E; +typedef struct hiISP_GAMMA_ATTR_S +{ + HI_BOOL bEnable; + + ISP_GAMMA_CURVE_TYPE_E enCurveType; + HI_U16 u16Table[GAMMA_NODE_NUM]; +} ISP_GAMMA_ATTR_S; + +typedef struct hiISP_GAMMAFE_ATTR_S +{ + HI_BOOL bEnable; + + HI_U16 u16Table[GAMMA_FE0_NODE_NUM + GAMMA_FE1_NODE_NUM]; /* only for WDR sensor mode */ +} ISP_GAMMAFE_ATTR_S; + +typedef struct hiISP_SHARPEN_MANUAL_ATTR_S +{ + HI_BOOL bEnLowLumaShoot; + HI_U8 u8SharpenD; //Sharpen strength of Edge, range [0: 255], equal to maxEdgeAmt in fw. + HI_U8 u8SharpenUd; //Sharpen strength of detail, range [0: 255], equal to maxSharpAmt1 in fw + HI_U8 u8OverShoot; // range [0: 255] + HI_U8 u8UnderShoot; // range [0: 255] + HI_U8 u8TextureNoiseThd; // range [0: 255] + HI_U8 u8EdgeNoiseThd; // range [0: 255] + +} ISP_SHARPEN_MANUAL_ATTR_S; +typedef struct hiISP_SHARPEN_AUTO_ATTR_S +{ + HI_BOOL abEnLowLumaShoot [ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8SharpenD [ISP_AUTO_ISO_STENGTH_NUM]; //Sharpen strength of Edge, range [0: 255], equal to maxEdgeAmt in fw. + HI_U8 au8SharpenUd [ISP_AUTO_ISO_STENGTH_NUM]; //Sharpen strength of detail, range [0: 255], equal to maxSharpAmt1 in fw + HI_U8 au8OverShoot [ISP_AUTO_ISO_STENGTH_NUM]; // range [0: 255] + HI_U8 au8UnderShoot[ISP_AUTO_ISO_STENGTH_NUM]; // range [0: 255] + HI_U8 au8TextureNoiseThd[ISP_AUTO_ISO_STENGTH_NUM]; // range [0: 255] + HI_U8 au8EdgeNoiseThd[ISP_AUTO_ISO_STENGTH_NUM]; // range [0: 255] +} ISP_SHARPEN_AUTO_ATTR_S; + +typedef struct hiISP_SHARPEN_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_SHARPEN_MANUAL_ATTR_S stManual; + ISP_SHARPEN_AUTO_ATTR_S stAuto; +} ISP_SHARPEN_ATTR_S; + +typedef struct hiISP_UVNR_MANUAL_ATTR_S +{ + HI_U8 u8ColorCast; /* RW, Range:[0, 3]. equal to coring limit in fw */ + HI_U8 u8UvnrThreshold; /* RW, Range:[0, 64]. */ + HI_U8 u8UvnrStrength; /* RW, Range:[0, 34]. */ //0: Med & UVNR all close; 1: Med open, UVNR close; 2---34oMed Close, UNVR open; +} ISP_UVNR_MANUAL_ATTR_S; + +typedef struct hiISP_UVNR_AUTO_ATTR_S +{ + HI_U8 au8ColorCast[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range:[0, 64]. */ + HI_U8 au8UvnrThreshold[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range:[0, 64]. */ + HI_U8 au8UvnrStrength[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range:[0, 34]. */ +} ISP_UVNR_AUTO_ATTR_S; + +typedef struct hiISP_UVNR_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_UVNR_MANUAL_ATTR_S stManual; + ISP_UVNR_AUTO_ATTR_S stAuto; +} ISP_UVNR_ATTR_S; +/*Crosstalk Removal*/ +typedef struct hiISP_CR_ATTR_S +{ + HI_BOOL bEnable; + HI_U16 au16Strength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U16 u16Threshold; + HI_U8 u8Slope; + HI_U8 u8Sensitivity; + HI_U16 u16SensiThreshold; +}ISP_CR_ATTR_S; + +typedef struct hiISP_ANTI_FALSECOLOR_MANUAL_S +{ + HI_U8 u8Strength; + HI_U8 u8Threshold; +} ISP_ANTI_FALSECOLOR_MANUAL_S; + +typedef struct hiISP_ANTI_FALSECOLOR_AUTO_ATTR_S +{ + HI_U8 au8Strength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8Threshold[ISP_AUTO_ISO_STENGTH_NUM]; +} ISP_ANTI_FALSECOLOR_AUTO_ATTR_S; + +typedef struct hiISP_ANTI_FALSECOLOR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_ANTI_FALSECOLOR_MANUAL_S stManual; + ISP_ANTI_FALSECOLOR_AUTO_ATTR_S stAuto; +} ISP_ANTI_FALSECOLOR_S; + +typedef enum hiISP_DEMOSAIC_CFG_E +{ + ISP_DEMOSAIC_CFG_DEFAULT = 0, + ISP_DEMOSAIC_CFG_VH, + ISP_DEMOSAIC_CFG_AA, + ISP_DEMOSAIC_CFG_VA, + ISP_DEMOSAIC_CFG_UU, + + ISP_DEMOSAIC_CFG_BUTT, +} ISP_DEMOSAIC_CFG_E; + +typedef struct hiISP_DEMOSAIC_ATTR_S +{ + HI_U16 u16VhSlope; /* RW,Range: [0x0, 0xFF] */ + HI_U16 u16AaSlope; /* not support */ + HI_U16 u16VaSlope; /* not support */ + HI_U16 u16UuSlope; /* RW,Range: [0x0, 0x3FF] */ + HI_U8 u8VhLimit; /* RW,Range: [0x0, 0xFF] */ + HI_U8 u8VhOffset; /* RW,Range: [0x0, 0xFF] */ + HI_U16 u16VhThresh; /* not support */ + HI_U16 u16AaThresh; /* not support */ + HI_U16 u16VaThresh; /* not support */ + HI_U16 u16UuThresh; /* not support */ + ISP_DEMOSAIC_CFG_E enCfgType; /* not support*/ + HI_U16 au16LumThresh[ISP_AUTO_ISO_STENGTH_NUM]; /* NOT SUPPORT */ + HI_U16 au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range:[0x0, 0x3FF] */ +}ISP_DEMOSAIC_ATTR_S; + +typedef struct hiISP_BLACK_LEVEL_S +{ + HI_U16 au16BlackLevel[4]; /* RW, Range: [0x0, 0xFFF]*/ +} ISP_BLACK_LEVEL_S; + +/* FPN */ +typedef enum hiISP_FPN_TYPE_E +{ + ISP_FPN_TYPE_FRAME = 0, + ISP_FPN_TYPE_LINE = 1, + ISP_FPN_TYPE_BUTT +}ISP_FPN_TYPE_E; + +typedef struct hiISP_FPN_FRAME_INFO_S +{ + HI_U32 u32Iso; /* FPN CALIBRATE ISO */ + HI_U32 u32Offset; /* FPN frame u32Offset (agv pixel value) */ + HI_U32 u32FrmSize; /* FPN frame size (exactly frm size or compress len) */ + VIDEO_FRAME_INFO_S stFpnFrame; /* FPN frame info, 8bpp,10bpp,12bpp,16bpp. Compression or not */ +}ISP_FPN_FRAME_INFO_S; + +typedef struct hiISP_FPN_CALIBRATE_ATTR_S +{ + HI_U32 u32Threshold; /* pix value > threshold means defective pixel, [1, 0xFFF] */ + HI_U32 u32FrameNum; /* value is 2^N, range: [1, 16] */ + ISP_FPN_TYPE_E enFpnType; /* frame mode or line mode */ + ISP_FPN_FRAME_INFO_S stFpnCaliFrame; +}ISP_FPN_CALIBRATE_ATTR_S; + +typedef struct hiISP_FPN_MANUAL_ATTR_S +{ + HI_U32 u32Strength; /* gain, RW fp 4.8 */ +}ISP_FPN_MANUAL_ATTR_S; + +typedef struct hiISP_FPN_AUTO_ATTR_S +{ + HI_U32 u32Strength; /* gain, RO fp 4.8 */ +}ISP_FPN_AUTO_ATTR_S; + +typedef struct hiISP_FPN_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; /* manual or auto mode */ + ISP_FPN_TYPE_E enFpnType; /* frame mode or line mode */ + ISP_FPN_FRAME_INFO_S stFpnFrmInfo; /* input in correction mode. */ + ISP_FPN_MANUAL_ATTR_S stManual; + ISP_FPN_AUTO_ATTR_S stAuto; +}ISP_FPN_ATTR_S; + +typedef struct hiISP_BLC_ATTR_S +{ + HI_BOOL bEnable; + + HI_U32 u32ROffset; /* WO, R component */ + HI_U32 u32GROffset; /* WO, GR component */ + HI_U32 u32BOffset; /* WO, B component */ + HI_U32 u32GBOffset; /* WO, GB component */ +}ISP_BLC_ATTR_S; + +/* DeFog */ +typedef struct hiISP_DEFOG_MANUAL_ATTR_S +{ + HI_U8 u8strength; +}ISP_DEFOG_MANUAL_ATTR_S; + +typedef struct hiISP_DEFOG_AUTO_ATTR_S +{ + HI_U8 u8strength; +}ISP_DEFOG_AUTO_ATTR_S; + +typedef struct hiISP_DEFOG_ATTR_S +{ + HI_BOOL bEnable; + HI_U8 u8HorizontalBlock; /* RW,Range: [0x1, 0x10] */ + HI_U8 u8VerticalBlock; /* RW,Range: [0x1, 0xF] */ + ISP_OP_TYPE_E enOpType; + ISP_DEFOG_MANUAL_ATTR_S stManual; + ISP_DEFOG_AUTO_ATTR_S stAuto; +}ISP_DEFOG_ATTR_S; + +/********************** ACM **************************************/ + +typedef enum hiISP_ACM_MODE_E +{ + ISP_ACM_MODE_BLUE = 0, + ISP_ACM_MODE_GREEN , + ISP_ACM_MODE_BG , + ISP_ACM_MODE_SKIN , + ISP_ACM_MODE_VIVID , + ISP_ACM_MODE_BUTT + +} ISP_ACM_MODE_E; + +typedef struct +{ + HI_BOOL bEnable ; + HI_BOOL bDemoEnable ;/*0-debug closed; 1-debug open, the left screen is original video and the right screen is ACM-processed video*/ + ISP_ACM_MODE_E enMode ; + HI_U32 u32Stretch ; /*input data Clip range: 0-Y 64-940, C 64-960; 1-Y 0-1023, C 0-1023*/ + HI_U32 u32ClipRange ; /*output data Clip range: 0-Y 64-940, C 64-960; 1-Y 0-1023, C 0-1023*/ + HI_U32 u32AcmClipOrWrap; /*0-wrap around; 1-clip*/ + HI_U32 u32CbcrThr ; /* [0,255]*/ + HI_U32 u32GainLuma ; /* [0,512]*/ + HI_U32 u32GainHue ; /* [0,512]*/ + HI_U32 u32GainSat ; /* [0,512]*/ +} +ISP_ACM_ATTR_S; + +#define ACM_Y_NUM 5 +#define ACM_H_NUM 29 +#define ACM_S_NUM 7 + +typedef struct hi_ISP_ACM_LUT_S +{ + HI_S16 as16Y[ACM_Y_NUM][ACM_S_NUM][ACM_H_NUM]; /**< */ + HI_S16 as16H[ACM_Y_NUM][ACM_S_NUM][ACM_H_NUM]; /**< */ + HI_S16 as16S[ACM_Y_NUM][ACM_S_NUM][ACM_H_NUM]; /**< */ +}ISP_ACM_LUT_S; + +typedef struct hi_ISP_ACM_COEF_S +{ + ISP_ACM_LUT_S stLut; + ISP_ACM_MODE_E enMode; +}ISP_ACM_COEF_S; + +typedef struct hiISP_INNER_STATE_INFO_S +{ + HI_U32 u32DRCStrengthActual; + HI_U32 u32NRStrengthActual; /*not support*/ + HI_U32 u32SharpenStrengthDActual; + HI_U32 u32SharpenStrengthUdActual; + HI_U32 u32SharpenStrengthRGBActual; /*not support*/ + HI_U32 u32DefogStrengthActual; + + HI_BOOL bWDRSwitchFinish; /*not support*/ + HI_BOOL bResSwitchFinish; /*not support*/ +} ISP_INNER_STATE_INFO_S; + + +typedef enum hiISP_AE_SWITCH_E +{ + ISP_AE_AFTER_STATIC_WB = 0 , + ISP_AE_FROM_SENSOR_CHANNEL_1 , /*not support*/ + ISP_AE_AFTER_SHADING , /*not support*/ + ISP_AE_AFTER_GAMMA_FE , /*not support*/ + ISP_AE_AFTER_DRC , + ISP_AE_FROM_SENSOR_CHANNEL_2 , /*not support*/ + ISP_AE_AFTER_WDR_STITCH , /*not support*/ + ISP_AE_AFTER_BLC_CHANNEL_2 , /*not support*/ + ISP_AE_AFTER_DG , + ISP_AE_SWITCH_BUTT +} ISP_AE_SWITCH_E; + + +typedef enum hiISP_AE_HIST_SWITCH_E +{ + ISP_AE_HIST_SAME_AS_AE = 0, + ISP_AE_HIST_FROM_SENSOR_CHANNEL_1 , + ISP_AE_HIST_AFTER_SHADING , + ISP_AE_HIST_AFTER_GAMMA_FE , + ISP_AE_HIST_AFTER_DRC , + ISP_AE_HIST_FROM_SENSOR_CHANNEL_2 , + ISP_AE_HIST_AFTER_WDR_STITCH , + ISP_AE_HIST_AFTER_BLC_CHANNEL_2, + ISP_AE_HIST_SWITCH_BUTT +} ISP_AE_HIST_SWITCH_E; + + +/* config of statistics structs */ +typedef struct hiISP_AE_STATISTICS_CFG_S +{ + HI_U8 au8HistThresh[4]; /*RW, Histogram threshold for bin 0/1 1/2 2/3 3/4 boundary, Range: [0x0, 0xFF]*/ + ISP_AE_SWITCH_E enAESwitch; /*RW, The position of AE statistics module in ISP pipeline, 3518EV200 AE statistics here include Global 256 bins histogram, Global average and zone average */ + /* 0 = After DG; 1 = After static WB */ + /* 2 = After DRC; */ + + ISP_AE_HIST_SWITCH_E enHistSwitch; /*RW, The position of Global 256 bins histogram in ISP pipeline*/ + /* 0 = Same as AE; 1 = Immediately from sensor, channel 1 (for WDR modes); */ + /* 2 = After shading; 3 = After Gamma FE; */ + /* 4 = After DRC; 5 = Immediately from sensor, channel 2 (for WDR modes); */ + /* 6 = After WDR stitch; 7 = After BLC, channel 2 (for WDR modes);*/ + + ISP_AE_SWITCH_E enAESumSwitch; /*RW, The position of Global average and zone average in ISP pipeline*/ + /* 0 = After static WB; 1 = Immediately from sensor, channel 1 (for WDR modes); */ + /* 2 = After shading; 3 = After Gamma FE; */ + /* 4 = After DRC; 5 = Immediately from sensor, channel 2 (for WDR modes); */ + /* 6 = After WDR stitch; 7 = After BLC, channel 2 (for WDR modes);*/ +} ISP_AE_STATISTICS_CFG_S; + +typedef struct hiISP_WB_STATISTICS_CFG_PARA_S +{ + HI_U16 u16WhiteLevel; /*RW, Upper limit of valid data for white region, Range: [0x0, 0xFFF] for Bayer statistics, [0x0, 0x3FF] for RGB statistics*/ + HI_U16 u16BlackLevel; /*RW, Lower limit of valid data for white region, Range: [0x0, u16WhiteLevel]. for Bayer statistics, bitwidth is 12, for RGB statistics, bitwidth is 10*/ + HI_U16 u16CbMax; /*RW, Maximum value of B/G for white region, Range: [0x0,0xFFF]*/ + HI_U16 u16CbMin; /*RW, Minimum value of B/G for white region, Range: [0x0, u16CbMax]*/ + HI_U16 u16CrMax; /*RW, Maximum value of R/G for white region, Range: [0x0, 0xFFF]*/ + HI_U16 u16CrMin; /*RW, Minimum value of R/G for white region, Range: [0x0, u16CrMax]*/ + HI_U16 u16CbHigh; /*RW, hexagon limit, Range: [u16CbMin, u16CbMax], Axis is [u16CrMax, u16CbHigh]*/ + HI_U16 u16CbLow; /*RW, hexagon limit, Range: [u16CbMin, u16CbMax], Axis is [u16CrMin, u16CbLow]*/ + HI_U16 u16CrHigh; /*RW, hexagon limit, Range: [u16CrMin, u16CrMax], Axis is [u16CrHigh, u16CbMax]*/ + HI_U16 u16CrLow; /*RW, hexagon limit, Range: [u16CrMin, u16CrMax], Axis is [u16CrLow, u16CbMin]*/ +} ISP_WB_STATISTICS_CFG_PARA_S; +typedef struct hiISP_WB_STATISTICS_CFG_S +{ + ISP_WB_STATISTICS_CFG_PARA_S stBayerCfg; + ISP_WB_STATISTICS_CFG_PARA_S stRGBCfg; /*Hi3518EV200 does't support RGB Statistics*/ +} ISP_WB_STATISTICS_CFG_S; + +typedef enum hiISP_AF_PEAK_MODE_E +{ + ISP_AF_STA_NORM = 0, /* use every value of the block statistic*/ + ISP_AF_STA_PEAK , /* use the maximum value in one line of the block statistic*/ + ISP_AF_STA_BUTT +}ISP_AF_PEAK_MODE_E; + +typedef enum hiISP_AF_SQU_MODE_E +{ + ISP_AF_STA_SUM_NORM = 0, /* statistic value accumlate*/ + ISP_AF_STA_SUM_SQU , /* statistic value square then accumlate*/ + ISP_AF_STA_SUM_BUTT +}ISP_AF_SQU_MODE_E; + +typedef enum hiISP_AF_STATISTICS_POS_E +{ + ISP_AF_STATISTICS_YUV = 0, + ISP_AF_STATISTICS_RAW , + ISP_AF_STATISTICS_BUTT + +}ISP_AF_STATISTICS_POS_E; + +typedef struct hiISP_AF_CFG_S +{ + HI_BOOL bEnable; /* RW, Range: [0,1]. AF enable. */ + HI_U16 u16Hwnd; /* RW, Range: [1, 17]. AF statistic window horizontal block. */ + HI_U16 u16Vwnd; /* RW, Range: [1, 15]. AF statistic window veritical block. */ + HI_U16 u16Hsize; /* RW, Range: [0x0, 0xFFF]. AF image wide. */ + HI_U16 u16Vsize; /* RW, Range: [0x0, 0xFFF]. AF image hight. */ + ISP_AF_PEAK_MODE_E enPeakMode; /* RW, Range: [0,1]. AF peak value statistic mode. */ + ISP_AF_SQU_MODE_E enSquMode; /* RW, Range: [0,1]. AF statistic square accumulate. */ + ISP_AF_STATISTICS_POS_E enStatisticsPos; /* RW, Range: [0,1]. AF statistic position, it can be set to yuv or raw */ +}ISP_AF_CFG_S; + +typedef struct hiISP_AF_H_PARAM_S +{ + HI_BOOL abIIREn[3]; /* RW, Range: [0, 1]. IIR enable. */ + HI_S16 as16IIRGain[7]; /* RW, Range: gain0:[0,255]; others:[-511, 511]. IIR gain. */ + HI_U16 au16IIRShift[4]; /* RW, Range: [0x0, 0xF]. IIR shift. */ + HI_U16 u16IIRThd; /* RW, Range: [0x0, 0x7FF]. IIR threshold. */ +}ISP_AF_H_PARAM_S; + +typedef struct hiISP_AF_V_PARAM_S +{ + HI_S16 as16FIRH[5]; /* RW, Range: [-31, 31]. FIR gain. */ + HI_U16 u16FIRThd; /* RW, Range: [0x0, 0x7FF]. FIR threshold. */ +}ISP_AF_V_PARAM_S; + +typedef struct hiISP_AF_FV_PARAM_S +{ + HI_U16 u16AccShiftY; /* RW, Range: [0x0, 0xF]. luminance Y statistic shift. */ + HI_U16 au16AccShiftH[2]; /* RW, Range: [0x0, 0xF]. IIR statistic shift. */ + HI_U16 au16AccShiftV[2]; /* RW, Range: [0x0, 0xF]. FIR statistic shift. */ +}ISP_AF_FV_PARAM_S; + +typedef struct hiISP_FOCUS_STATISTICS_CFG_S +{ + ISP_AF_CFG_S stConfig; + ISP_AF_H_PARAM_S stHParam_IIR0; + ISP_AF_H_PARAM_S stHParam_IIR1; + ISP_AF_V_PARAM_S stVParam_FIR0; + ISP_AF_V_PARAM_S stVParam_FIR1; + ISP_AF_FV_PARAM_S stFVParam; +} ISP_FOCUS_STATISTICS_CFG_S; + +typedef union hiISP_STATISTICS_CTRL_U +{ + HI_U32 u32Key; + struct + { + HI_U32 bit1AeStat1 : 1 ; /* [0] */ /* not support */ + HI_U32 bit1AeStat2 : 1 ; /* [1] */ /* not support */ + HI_U32 bit1AeStat3 : 1 ; /* [2] */ + HI_U32 bit1AeStat4 : 1 ; /* [3] */ + HI_U32 bit1AeStat5 : 1 ; /* [4] */ + HI_U32 bit1AwbStat1 : 1 ; /* [5] */ + HI_U32 bit1AwbStat2 : 1 ; /* [6] */ + HI_U32 bit1AwbStat3 : 1 ; /* [7] */ + HI_U32 bit1AwbStat4 : 1 ; /* [8] */ + HI_U32 bit1AfStat : 1 ; /* [9] */ + HI_U32 bit22Rsv : 22; /* [10:31] */ + }; +}ISP_STATISTICS_CTRL_U; + +typedef struct hiISP_STATISTICS_CFG_S +{ + ISP_STATISTICS_CTRL_U unKey; + ISP_AE_STATISTICS_CFG_S stAECfg; + ISP_WB_STATISTICS_CFG_S stWBCfg; + ISP_FOCUS_STATISTICS_CFG_S stFocusCfg; +} ISP_STATISTICS_CFG_S; + +/* statistics structs */ +typedef struct hiISP_AE_STATISTICS_S +{ + HI_U16 au16Hist5Value[5]; /*RO, Global 5 bins histogram, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneHist5Value[AE_ZONE_ROW][AE_ZONE_COLUMN][5]; /*RO, Zone 5 bins histogram,Range: [0x0, 0xFFFF]*/ + HI_U32 au32Hist256Value[256]; /*RO, Global 256 bins histogram,Range: [0x0, 0xFFFFFFFF]*/ + HI_U16 au16GlobalAvg[4]; /*RO, Global average value, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneAvg[AE_ZONE_ROW][AE_ZONE_COLUMN][4]; /*RO, Zone average value, Range: [0x0, 0xFFFF]*/ +}ISP_AE_STATISTICS_S; + +typedef struct hiISP_WB_BAYER_STATISTICS_S +{ + HI_U16 u16GlobalR; /*RO, Global WB output Average R, Range: [0x0, 0xFFFF]*/ + HI_U16 u16GlobalG; /*RO, Global WB output Average G, Range: [0x0, 0xFFFF]*/ + HI_U16 u16GlobalB; /*RO, Global WB output Average B, Range: [0x0, 0xFFFF]*/ + HI_U16 u16CountAll; /*RO, normalized number of Gray points, Range: [0x0, 0xFFFF]*/ + HI_U16 u16CountMin; /*RO, normalized number of pixels under BlackLevel, Range: [0x0, 0xFFFF]*/ + HI_U16 u16CountMax; /*RO, normalized number of pixels above Whitelevel, Range: [0x0, 0xFFFF], u16CountAll + u16CountMin + u16CountMax = 0xFFFF*/ + + HI_U16 au16ZoneAvgR[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone Average R, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneAvgG[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone Average G, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneAvgB[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone Average B, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneCountAll[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, normalized number of Gray points, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneCountMin[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, normalized number of pixels under BlackLevel, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneCountMax[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, normalized number of pixels above Whitelevel, Range: [0x0, 0xFFFF]*/ +} ISP_WB_BAYER_STATISTICS_INFO_S; + +typedef struct hiISP_WB_RGB_STATISTICS_S +{ + HI_U16 u16GlobalGR; /*RO, Global WB output G/R, 4.8-bit fix-point, Range: [0x0, 0xFFF]*/ + HI_U16 u16GlobalGB; /*RO, Global WB output G/B, 4.8-bit fix-point, Range: [0x0, 0xFFF]*/ + HI_U32 u32GlobalSum; /*RO, Global WB output population*/ + + HI_U16 au16ZoneGR[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone WB output G/R, 4.8-bit fix-point, Range: [0x0, 0xFFF]*/ + HI_U16 au16ZoneGB[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone WB output G/B, 4.8-bit fix-point, Range: [0x0, 0xFFF]*/ + HI_U32 au32ZoneSum[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone WB output population*/ +} ISP_WB_RGB_STATISTICS_INFO_S; + +typedef struct hiISP_WB_STATISTICS_S +{ + ISP_WB_BAYER_STATISTICS_INFO_S stBayerStatistics; + ISP_WB_RGB_STATISTICS_INFO_S stRGBStatistics; /* Hi3518EV200 does't support RGB Statistics */ +} ISP_WB_STATISTICS_S; + +// TODO: need to check +typedef struct hiISP_FOCUS_ZONE_S +{ + HI_U16 u16v1; + HI_U16 u16h1; + HI_U16 u16v2; + HI_U16 u16h2; + HI_U16 u16y; +} ISP_FOCUS_ZONE_S; +typedef struct hiISP_FOCUS_STATISTICS_S +{ + ISP_FOCUS_ZONE_S stZoneMetrics[AF_ZONE_ROW][AF_ZONE_COLUMN]; /*RO, The zoned measure of contrast*/ +} ISP_FOCUS_STATISTICS_S; + +typedef struct hiISP_STATISTICS_S +{ + ISP_AE_STATISTICS_S stAEStat; + ISP_WB_STATISTICS_S stWBStat; + ISP_FOCUS_STATISTICS_S stFocusStat; +} ISP_STATISTICS_S; + + +/*ISP debug information*/ +typedef struct hiISP_DEBUG_INFO_S +{ + HI_BOOL bDebugEn; /*RW, 1:enable debug, 0:disable debug*/ + HI_U32 u32PhyAddr; /*RW, phy address of debug info */ + HI_U32 u32Depth; /*RW, depth of debug info */ +} ISP_DEBUG_INFO_S; + +typedef struct hiISP_DBG_ATTR_S +{ + HI_U32 u32Rsv; /* need to add member */ +} ISP_DBG_ATTR_S; + +typedef struct hiISP_DBG_STATUS_S +{ + HI_U32 u32FrmNumBgn; + HI_U32 u32Rsv; /* need to add member */ + HI_U32 u32FrmNumEnd; +} ISP_DBG_STATUS_S; + +typedef enum hiISP_SNS_TYPE_E +{ + ISP_SNS_I2C_TYPE = 0, + ISP_SNS_SSP_TYPE, + + ISP_SNS_TYPE_BUTT, +} ISP_SNS_TYPE_E; + +typedef struct hiISP_I2C_DATA_S +{ + HI_BOOL bUpdate; + HI_U8 u8DelayFrmNum; + + HI_U8 u8DevAddr; + HI_U32 u32RegAddr; + HI_U32 u32AddrByteNum; + HI_U32 u32Data; + HI_U32 u32DataByteNum; +} ISP_I2C_DATA_S; + +typedef struct hiISP_SSP_DATA_S +{ + HI_BOOL bUpdate; + HI_U8 u8DelayFrmNum; + + HI_U32 u32DevAddr; + HI_U32 u32DevAddrByteNum; + HI_U32 u32RegAddr; + HI_U32 u32RegAddrByteNum; + HI_U32 u32Data; + HI_U32 u32DataByteNum; +} ISP_SSP_DATA_S; + +typedef struct hiISP_SNS_REGS_INFO_S +{ + ISP_SNS_TYPE_E enSnsType; + HI_U32 u32RegNum; + HI_U8 u8Cfg2ValidDelayMax; + + union + { + ISP_I2C_DATA_S astI2cData[ISP_MAX_SNS_REGS]; + ISP_SSP_DATA_S astSspData[ISP_MAX_SNS_REGS]; + }; +} ISP_SNS_REGS_INFO_S; + +typedef struct hiISP_VD_INFO_S +{ + HI_U32 u32Reserved; /*RO, Range: [0x0, 0xFFFFFFFF] */ +}ISP_VD_INFO_S; + + +typedef struct hiISP_REG_ATTR_S +{ + HI_U32 u32IspRegAddr; + HI_U32 u32IspRegSize; + HI_U32 u32IspExtRegAddr; + HI_U32 u32IspExtRegSize; + HI_U32 u32AeExtRegAddr; + HI_U32 u32AeExtRegSize; + HI_U32 u32AwbExtRegAddr; + HI_U32 u32AwbExtRegSize; +} ISP_REG_ATTR_S; + + +/******************************************************/ +/********************* AI structs ************************/ + +typedef enum hiISP_IRIS_TYPE_E +{ + ISP_IRIS_DC_TYPE = 0, + ISP_IRIS_P_TYPE, + + ISP_IRIS_TYPE_BUTT, +} ISP_IRIS_TYPE_E; + +typedef enum hiISP_IRIS_F_NO_E +{ + ISP_IRIS_F_NO_32_0 = 0, + ISP_IRIS_F_NO_22_0, + ISP_IRIS_F_NO_16_0, + ISP_IRIS_F_NO_11_0, + ISP_IRIS_F_NO_8_0, + ISP_IRIS_F_NO_5_6, + ISP_IRIS_F_NO_4_0, + ISP_IRIS_F_NO_2_8, + ISP_IRIS_F_NO_2_0, + ISP_IRIS_F_NO_1_4, + ISP_IRIS_F_NO_1_0, + + ISP_IRIS_F_NO_BUTT, +} ISP_IRIS_F_NO_E; + +typedef struct hiISP_DCIRIS_ATTR_S +{ + HI_S32 s32Kp; /*RW, Range:[0, 100000], the proportional gain of PID algorithm, default value is 7000 */ + HI_S32 s32Ki; /*RW, Range:[0, 1000], the integral gain of PID algorithm, default value is 100 */ + HI_S32 s32Kd; /*RW, Range:[0, 100000], the derivative gain of PID algorithm, default value is 3000 */ + HI_U32 u32MinPwmDuty; /*RW, Range:[0, 1000], which is the min pwm duty for dciris control */ + HI_U32 u32MaxPwmDuty; /*RW, Range:[0, 1000], which is the max pwm duty for dciris control */ + HI_U32 u32OpenPwmDuty; /*RW, Range:[0, 1000], which is the open pwm duty for dciris control */ +} ISP_DCIRIS_ATTR_S; + +typedef struct hiISP_PIRIS_ATTR_S +{ + HI_BOOL bStepFNOTableChange; /*WO, Step-F number mapping table change or not */ + HI_BOOL bZeroIsMax; /*RW, Step 0 corresponds to max aperture or not, it's related to the specific iris */ + HI_U16 u16TotalStep; /*RW, Range:[1, 1024], Total steps of Piris's aperture, it's related to the specific iris */ + HI_U16 u16StepCount; /*RW, Range:[1, 1024], Used steps of Piris's aperture. when Piris's aperture is too small, the F number precision is not enough, + so not all the steps can be used. It's related to the specific iris*/ + HI_U16 au16StepFNOTable[AI_MAX_STEP_FNO_NUM]; /*RW, Range:[0, 1024], Step-F number mapping table. F1.0 is expressed as 1024, F32 is expressed as 1, it's related to the specific iris*/ + ISP_IRIS_F_NO_E enMaxIrisFNOTarget; /*RW, Range:[F32.0, F1.0], Max F number of Piris's aperture, it's related to the specific iris */ + ISP_IRIS_F_NO_E enMinIrisFNOTarget; /*RW, Range:[F32.0, F1.0], Min F number of Piris's aperture, it's related to the specific iris */ +} ISP_PIRIS_ATTR_S; + + +typedef struct hiISP_MI_ATTR_S +{ + HI_U32 u32HoldValue; /*RW, Range: [0x0, 0x3E8], iris hold value for DC-iris*/ + ISP_IRIS_F_NO_E enIrisFNO; /*RW, the F number of P-iris*/ +} ISP_MI_ATTR_S; + +typedef enum hiISP_IRIS_STATUS_E +{ + ISP_IRIS_KEEP = 0, /* In this mode can set the MI holdvalue */ + ISP_IRIS_OPEN = 1, /* Open Iris to the max */ + ISP_IRIS_CLOSE = 2, /* Close Iris to the min */ + ISP_IRIS_BUTT +} ISP_IRIS_STATUS_E; + +typedef struct hiISP_IRIS_ATTR_S +{ + HI_BOOL bEnable; /* iris enable/disable */ + ISP_OP_TYPE_E enOpType; /* auto iris or manual iris */ + ISP_IRIS_TYPE_E enIrisType; /* DC-iris or P-iris */ + ISP_IRIS_STATUS_E enIrisStatus; /*RW, status of Iris*/ + ISP_MI_ATTR_S stMIAttr; +} ISP_IRIS_ATTR_S; + + +/******************************************************/ +/********************* AE structs ************************/ +typedef enum hiISP_AE_MODE_E +{ + AE_MODE_SLOW_SHUTTER = 0, + AE_MODE_FIX_FRAME_RATE = 1, + AE_MODE_BUTT +} ISP_AE_MODE_E; + +typedef enum hiISP_AE_STRATEGY_E +{ + AE_EXP_HIGHLIGHT_PRIOR = 0, + AE_EXP_LOWLIGHT_PRIOR = 1, + AE_STRATEGY_MODE_BUTT +} ISP_AE_STRATEGY_E; + +typedef struct hiISP_AE_RANGE_S +{ + HI_U32 u32Max; + HI_U32 u32Min; +} ISP_AE_RANGE_S; + +typedef struct hiISP_AE_DELAY_S +{ + HI_U16 u16BlackDelayFrame; /*RW, Range: [0x0, 0xFFFF], AE black delay frame count*/ + HI_U16 u16WhiteDelayFrame; /*RW, Range: [0x0, 0xFFFF], AE white delay frame count*/ +} ISP_AE_DELAY_S; + +typedef enum hiISP_ANTIFLICKER_MODE_E +{ + /* The epxosure time is fixed to be the multiplies of 1/(2*frequency) sec, + * it may lead to over exposure in the high-luminance environments. */ + ISP_ANTIFLICKER_NORMAL_MODE = 0x0, + + /* The anti flicker may be closed to avoid over exposure in the high-luminance environments. */ + ISP_ANTIFLICKER_AUTO_MODE = 0x1, + + ISP_ANTIFLICKER_MODE_BUTT +}ISP_ANTIFLICKER_MODE_E; + +typedef struct hiISP_ANTIFLICKER_S +{ + HI_BOOL bEnable; + HI_U8 u8Frequency; /*RW, Range: usually this value is 50 or 60 which is the frequency of the AC power supply*/ + ISP_ANTIFLICKER_MODE_E enMode; +} ISP_ANTIFLICKER_S; + +typedef struct hiISP_SUBFLICKER_S +{ + HI_BOOL bEnable; + + /* RW, Range: [0x0, 0x64], if subflicker mode enable, current luma is less than AE compensation plus LumaDiff, + AE will keep min antiflicker shutter time(for example: 1/100s or 1/120s) to avoid flicker. while current luma is + larger than AE compensation plus the LumaDiff, AE will reduce shutter time to avoid over-exposure and introduce + flicker in the pircture */ + HI_U8 u8LumaDiff; +} ISP_SUBFLICKER_S; + +typedef struct hiISP_AE_ATTR_S +{ + /* base parameter */ + ISP_AE_RANGE_S stExpTimeRange; /*RW, sensor exposure time (unit: us ), Range: [0x0, 0xFFFFFFFF], it's related to the specific sensor */ + ISP_AE_RANGE_S stAGainRange; /*RW, sensor analog gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor */ + ISP_AE_RANGE_S stDGainRange; /*RW, sensor digital gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor */ + ISP_AE_RANGE_S stISPDGainRange; /*RW, ISP digital gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the ISP digital gain range */ + ISP_AE_RANGE_S stSysGainRange; /*RW, system gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor and ISP Dgain range */ + HI_U32 u32GainThreshold; /*RW, Gain threshold for slow shutter mode (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF] */ + + HI_U8 u8Speed; /*RW, Range: [0x0, 0xFF], AE adjust step*/ + HI_U8 u8Tolerance; /*RW, Range: [0x0, 0xFF], AE adjust tolerance*/ + HI_U8 u8Compensation; /*RW, Range: [0x0, 0xFF], AE compensation*/ + HI_U16 u16EVBias; /*RW, Range: [0x0, 0xFFFF], AE EV bias*/ + ISP_AE_STRATEGY_E enAEStrategyMode; /*RW, Support Highlight prior or Lowlight prior*/ + HI_U16 u16HistRatioSlope; /*RW, Range: [0x0, 0xFFFF], AE hist ratio slope*/ + HI_U8 u8MaxHistOffset; /*RW, Range: [0x0, 0xFF], Max hist offset*/ + + ISP_AE_MODE_E enAEMode; /*RW, AE mode(slow shutter/fix framerate)(onvif)*/ + ISP_ANTIFLICKER_S stAntiflicker; + ISP_SUBFLICKER_S stSubflicker; + ISP_AE_DELAY_S stAEDelayAttr; + + HI_BOOL bManualExpValue; /*RW, manual exposure value or not*/ + HI_U32 u32ExpValue; /*RW, Range: (0x0, 0xFFFFFFFF], manual exposure value */ + + /*AE weighting table*/ + HI_U8 au8Weight[AE_ZONE_ROW][AE_ZONE_COLUMN]; /*Range : [0, 0xF]*/ +} ISP_AE_ATTR_S; + +typedef struct hiISP_ME_ATTR_S +{ + ISP_OP_TYPE_E enExpTimeOpType; + ISP_OP_TYPE_E enAGainOpType; + ISP_OP_TYPE_E enDGainOpType; + ISP_OP_TYPE_E enISPDGainOpType; + + HI_U32 u32ExpTime; /*RW, sensor exposure time (unit: us ), Range: [0x0, 0xFFFFFFFF], it's related to the specific sensor */ + HI_U32 u32AGain; /*RW, sensor analog gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor */ + HI_U32 u32DGain; /*RW, sensor digital gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor */ + HI_U32 u32ISPDGain; /*RW, ISP digital gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the ISP digital gain range */ +} ISP_ME_ATTR_S; + +typedef struct hiISP_EXPOSURE_ATTR_S +{ + HI_BOOL bByPass; + ISP_OP_TYPE_E enOpType; + HI_U8 u8AERunInterval; /*RW, Range: [0x1, 0xFF], set the AE run interval*/ + HI_BOOL bHistStatAdjust; /*RW, HI_TRUE: 256 bin histogram statistic config will adjust when large red or blue area detected. + HI_FALSE: 256 bin histogram statistic config will not change */ + HI_BOOL bAERouteExValid; /*RW, use extend AE route or not */ + ISP_ME_ATTR_S stManual; + ISP_AE_ATTR_S stAuto; +} ISP_EXPOSURE_ATTR_S; + + +#define ISP_AE_ROUTE_MAX_NODES 16 +typedef struct hiISP_AE_ROUTE_NODE_S +{ + HI_U32 u32IntTime; /*RW, sensor exposure time (unit: us ), Range: (0x0, 0x1FFFFF], it's related to the specific sensor */ + HI_U32 u32SysGain; /*RW, system gain (unit: times, 10bit precision), Range : [0x400, 0x1FFFFFFF], it's related to the specific sensor and ISP Dgain range */ + ISP_IRIS_F_NO_E enIrisFNO; /*RW, the F number of the iris's aperture, Range:[F32.0, F1.0], only support for Piris */ +} ISP_AE_ROUTE_NODE_S; + +typedef struct hiISP_AE_ROUTE_S +{ + HI_U32 u32TotalNum; /*RW, Range: [0x0, 0x10], total node number of AE route */ + ISP_AE_ROUTE_NODE_S astRouteNode[ISP_AE_ROUTE_MAX_NODES]; +} ISP_AE_ROUTE_S; + +#define ISP_AE_ROUTE_EX_MAX_NODES 16 +typedef struct hiISP_AE_ROUTE_EX_NODE_S +{ + HI_U32 u32IntTime; /*RW, sensor exposure time (unit: us ), Range: (0x0, 0x1FFFFF], it's related to the specific sensor */ + HI_U32 u32Again; /*RW, sensor analog gain (unit: times, 10bit precision), Range : [0x400, 0x1FFFFF], it's related to the specific sensor*/ + HI_U32 u32Dgain; /*RW, sensor digital gain (unit: times, 10bit precision), Range : [0x400, 0x1FFFFF], it's related to the specific sensor*/ + HI_U32 u32IspDgain; /*RW, ISP digital gain (unit: times, 10bit precision), Range : [0x400, 0x1FFFFF] */ + ISP_IRIS_F_NO_E enIrisFNO; /*RW, the F number of the iris's aperture, Range:[F32.0, F1.0], only support for Piris */ +} ISP_AE_ROUTE_EX_NODE_S; + +typedef struct hiISP_AE_ROUTE_EX_S +{ + HI_U32 u32TotalNum; /*RW, Range: [0x0, 0x10], total node number of extend AE route */ + ISP_AE_ROUTE_EX_NODE_S astRouteExNode[ISP_AE_ROUTE_EX_MAX_NODES]; +} ISP_AE_ROUTE_EX_S; + + +typedef struct hiISP_EXP_INFO_S +{ + HI_U32 u32ExpTime; /* RO, Range: (0x0, 0xFFFFFFFF] */ + HI_U32 u32AGain; /* RO, Range: [0x400, 0xFFFFFFFF] */ + HI_U32 u32DGain; /* RO, Range: [0x400, 0xFFFFFFFF] */ + HI_U32 u32ISPDGain; /* RO, Range: [0x400, 0xFFFFFFFF] */ + HI_U32 u32Exposure; /* RO, Range: [0x40, 0xFFFFFFFF] */ + HI_BOOL bExposureIsMAX; /* RO, Range: [0x0, 0x1]*/ + HI_S16 s16HistError; /* RO, Range: [-0x8000, 0x7FFF]*/ + HI_U32 u32AE_Hist256Value[256]; /* RO, 256 bins histogram */ + HI_U16 u16AE_Hist5Value[5]; /* not support */ + HI_U8 u8AveLum; /* RO, Range: [0x0, 0xFF]*/ + HI_U32 u32LinesPer500ms; /* RO, Range: [0x0, 0xFFFFFFFF], exposure lines per 500ms */ + HI_U32 u32PirisFNO; /* RO, Range: [0x0, 0x400] */ + HI_U32 u32Fps; /* RO, actual fps */ + ISP_AE_ROUTE_S stAERoute; /* RO, Actual AE route */ + ISP_AE_ROUTE_EX_S stAERouteEx; /* RO, Actual AE route_ex */ + HI_U16 u16RgbirGain; /* RO, Range: [0x0, 0x3ff]*/ +}ISP_EXP_INFO_S; + + +/********************* AWB structs ************************/ +typedef enum hiISP_AWB_ALG_TYPE_E +{ + AWB_ALG_LOWCOST = 0, + AWB_ALG_ADVANCE = 1, + AWB_ALG_BUTT +} ISP_AWB_ALG_TYPE_E; + +typedef struct hiISP_AWB_CT_LIMIT_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + + HI_U16 u16HighRgLimit; /*RW, Range:[0x0, 0xFFF], in Manual Mode, user define the Max Rgain of High Color Temperature*/ + HI_U16 u16HighBgLimit; /*RW, Range:[0x0, 0xFFF], in Manual Mode, user define the Min Bgain of High Color Temperature*/ + HI_U16 u16LowRgLimit; /*RW, Range:[0x0, 0xFFF], in Manual Mode, user define the Min Rgain of Low Color Temperature*/ + HI_U16 u16LowBgLimit; /*RW, Range:[0x0, 0xFFF], in Manual Mode, user define the Max Bgain of Low Color Temperature*/ +} ISP_AWB_CT_LIMIT_ATTR_S; + +typedef struct hiISP_AWB_IN_OUT_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + HI_BOOL bOutdoorStatus; /*in Auto mode, this is RO, in Manual mode, this is WO*/ + HI_U32 u32OutThresh; /*shutter time(in us) to judge indoor or outdoor */ + HI_U16 u16LowStart; /*5000K is recommend*/ + HI_U16 u16LowStop; /*4500K is recommend, should be smaller than u8LowStart*/ + HI_U16 u16HighStart; /*6500K is recommend, shoule be larger than u8LowStart*/ + HI_U16 u16HighStop; /*8000K is recommend, should be larger than u8HighStart*/ + HI_BOOL bGreenEnhanceEn; /*If this is enabled, Green channel will be enhanced based on the ratio of green plant*/ +} ISP_AWB_IN_OUT_ATTR_S; + +typedef struct hiISP_AWB_LIGHTSOURCE_INFO_S +{ + HI_U16 u16WhiteRgain; /*G/R of White points at this light source*/ + HI_U16 u16WhiteBgain; /*G/B of White points at this light source*/ + HI_U16 u16ExpQuant; /*shutter time * again * dgain >> 4, Not support Now*/ + HI_U8 u8LightStatus; /*RW, 0: idle 1:add light source 2:delete sensitive color */ + HI_U8 u8Radius; /*Radius of light source*/ +} ISP_AWB_EXTRA_LIGHTSOURCE_INFO_S; + +typedef struct hiISP_AWB_ATTR_EX_S +{ + HI_U8 u8Tolerance; /*RW, Range:[0x0, 0xFF], AWB adjust tolerance*/ + HI_U8 u8ZoneRadius; /*RW, Range:[0x0, 0xFF], radius of AWB blocks*/ + HI_U16 u16CurveLLimit; /*RW, Range:[0x0, 0x100], Left limit of AWB Curve, recomend for indoor 0xE0, outdoor 0xE0*/ + HI_U16 u16CurveRLimit; /*RW, Range:[0x100, 0xFFF], Right Limit of AWB Curve,recomend for indoor 0x130, outdoor 0x120*/ + + HI_BOOL bExtraLightEn; /*Enable special light source function*/ + ISP_AWB_EXTRA_LIGHTSOURCE_INFO_S stLightInfo[4]; + ISP_AWB_IN_OUT_ATTR_S stInOrOut; +} ISP_AWB_ATTR_EX_S; + +typedef struct hiISP_AWB_ATTR_S +{ + HI_BOOL bEnable; /*If AWB is disabled, static wb gain will be used, otherwise awb gain will be used*/ + + HI_U16 u16RefColorTemp; /*Calibration Information*/ + HI_U16 au16StaticWB[4]; /*Calibration Information*/ + HI_S32 as32CurvePara[6]; /*Calibration Information*/ + + ISP_AWB_ALG_TYPE_E enAlgType; + + HI_U8 u8RGStrength; /*RW, AWB Strength of R Channel, Range: [0x0, 0xFF]*/ + HI_U8 u8BGStrength; /*RW, AWB Strength of B Channel, Range: [0x0, 0xFF]*/ + HI_U16 u16Speed; /*RW, Convergence speed of AWB, Range:[0x0, 0xFFF] */ + HI_U16 u16ZoneSel; /*RW, A value of 0 or 0xFF means global AWB, A value between 0 and 0xFF means zoned AWB */ + HI_U16 u16HighColorTemp; /*RW, AWB max temperature, Recommended: [8500, 10000] */ + HI_U16 u16LowColorTemp; /*RW, AWB min temperature, Range: [0x0, u8HighColorTemp), Recommended: [2000, 2500] */ + ISP_AWB_CT_LIMIT_ATTR_S stCTLimit; + HI_BOOL bShiftLimitEn; /*If the statistic information is out of range, it should be project*/ + HI_U8 u8ShiftLimit; + HI_BOOL bGainNormEn; +} ISP_AWB_ATTR_S; + +typedef struct hiISP_MWB_ATTR_S +{ + HI_U16 u16Rgain; /*RW, Multiplier for R color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Grgain; /*RW, Multiplier for Gr color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Gbgain; /*RW, Multiplier for Gb color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Bgain; /*RW, Multiplier for B color channel, Range: [0x0, 0xFFF]*/ +} ISP_MWB_ATTR_S; + +typedef struct hiISP_WB_ATTR_S +{ + HI_BOOL bByPass; + ISP_OP_TYPE_E enOpType; + ISP_MWB_ATTR_S stManual; + ISP_AWB_ATTR_S stAuto; +} ISP_WB_ATTR_S; + +typedef struct hiISP_COLORMATRIX_MANUAL_S +{ + HI_U16 au16CCM[9]; /*RW, Range: [0x0, 0xFFFF]*/ +} ISP_COLORMATRIX_MANUAL_S; + +typedef struct hiISP_COLORMATRIX_AUTO_S +{ HI_U16 u16HighColorTemp; /*RW, Range: <=10000*/ + HI_U16 au16HighCCM[9]; /*RW, Range: [0x0, 0xFFFF]*/ + HI_U16 u16MidColorTemp; /*RW, the MidColorTemp should be at least 400 smaller than HighColorTemp*/ + HI_U16 au16MidCCM[9]; /*RW, Range: [0x0, 0xFFFF]*/ + HI_U16 u16LowColorTemp; /*RW, the LowColorTemp should be at least 400 smaller than u16MidColorTemp, >= 2000*/ + HI_U16 au16LowCCM[9]; /*RW, Range: [0x0, 0xFFFF]*/ +} ISP_COLORMATRIX_AUTO_S; + +typedef struct hiISP_COLORMATRIX_ATTR_S +{ + ISP_OP_TYPE_E enOpType; + ISP_COLORMATRIX_MANUAL_S stManual; + ISP_COLORMATRIX_AUTO_S stAuto; +}ISP_COLORMATRIX_ATTR_S; + +typedef struct hiISP_SATURATION_MANUAL_S +{ + HI_U8 u8Saturation; /*RW, Range: [0, 0xFF] */ +} ISP_SATURATION_MANUAL_S; + +typedef struct hiISP_SATURATION_AUTO_S +{ + HI_U8 au8Sat[ISP_AUTO_ISO_STENGTH_NUM]; /*RW, Range: [0, 0xFF], should be decreased based on ISO increase */ +} ISP_SATURATION_AUTO_S; + +typedef struct hiISP_SATURATION_ATTR_S +{ + ISP_OP_TYPE_E enOpType; + ISP_SATURATION_MANUAL_S stManual; + ISP_SATURATION_AUTO_S stAuto; +}ISP_SATURATION_ATTR_S; + +typedef struct hiISP_COLOR_TONE_ATTR_S +{ + HI_U16 u16RedCastGain; /*RW, R channel gain after CCM*/ + HI_U16 u16GreenCastGain; /*RW, G channel gain after CCM*/ + HI_U16 u16BlueCastGain; /*RW, B channel gain after CCM*/ +} ISP_COLOR_TONE_ATTR_S; + +typedef struct hiISP_WB_INFO_S +{ + HI_U16 u16Rgain; /*RO, AWB result of R color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Grgain; /*RO, AWB result of Gr color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Gbgain; /*RO, AWB result of Gb color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Bgain; /*RO, AWB result of B color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Saturation; /*RO, Current saturation, Range:[0x0, 0xFF]*/ + HI_U16 u16ColorTemp; /*RO, Detect color temperature, maybe out of color cemeprature range*/ + HI_U16 au16CCM[9]; /*RO, Current color correction matrix*/ +}ISP_WB_INFO_S; + + +/********************* AF structs ************************/ +typedef struct hiISP_AF_ATTR_S +{ + HI_S32 s32DistanceMax; /* the focuse range */ + HI_S32 s32DistanceMin; + + /* weighting table */ + HI_U8 u8Weight[AF_ZONE_ROW][AF_ZONE_COLUMN]; +} ISP_AF_ATTR_S; +typedef struct hiISP_MF_ATTR_S +{ + HI_S32 s32DefaultSpeed; /* 1,default speed(unit:m/s).(onvif)*/ +} ISP_MF_ATTR_S; +typedef struct hiISP_FOCUS_ATTR_S +{ + ISP_OP_TYPE_E enOpType; + ISP_MF_ATTR_S stManual; + ISP_AF_ATTR_S stAuto; +} ISP_FOCUS_ATTR_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* __HI_COMM_ISP_H__ */ + diff --git a/device/mpp/include/hi_comm_ive.h b/device/mpp/include/hi_comm_ive.h new file mode 100644 index 0000000..2ecee11 --- /dev/null +++ b/device/mpp/include/hi_comm_ive.h @@ -0,0 +1,352 @@ +/****************************************************************************** + + Copyright (C), 2001-2014, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_ive.h + Version : Initial Draft + Author : Hisilicon multimedia software (IVE) group + Created : 2011/05/16 + Description : + History : + 1.Date : 2011/05/16 + Author : + Modification: Created file + + 2.Date : 2013/07/01~2014/08/08 + Author : + Modification: Add MPI function +******************************************************************************/ +#ifndef _HI_COMM_IVE_H_ +#define _HI_COMM_IVE_H_ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif + +#include "hi_type.h" +#include "hi_errno.h" + +/*-----------------------------------------------* + * The fixed-point data type, will be used to * + * represent float data in hardware calculations.* + *-----------------------------------------------*/ + +/*--u8bit----------------------------------------*/ +typedef unsigned char HI_U0Q8; +typedef unsigned char HI_U1Q7; +typedef unsigned char HI_U5Q3; + +/*--u16bit---------------------------------------*/ +typedef unsigned short HI_U0Q16; +typedef unsigned short HI_U4Q12; +typedef unsigned short HI_U6Q10; +typedef unsigned short HI_U8Q8; +typedef unsigned short HI_U9Q7; +typedef unsigned short HI_U12Q4; +typedef unsigned short HI_U14Q2; +typedef unsigned short HI_U5Q11; +/*--s16bit---------------------------------------*/ +typedef short HI_S9Q7; +typedef short HI_S14Q2; +typedef short HI_S1Q15; + +/*--u32bit---------------------------------------*/ +typedef unsigned int HI_U22Q10; +typedef unsigned int HI_U25Q7; +typedef unsigned int HI_U21Q11; + +/*--s32bit---------------------------------------*/ +typedef int HI_S25Q7; +typedef int HI_S16Q16; + +/*-----------------------------------------------* + * The fixed-point data type combine with flag_bits.* + *-----------------------------------------------*/ + +/*8bits unsigned integer,4bits decimal fraction,4bits flag_bits*/ +typedef unsigned short HI_U8Q4F4; + +/*float*/ +typedef float HI_FLOAT; +/*double*/ +typedef double HI_DOUBLE; + +/* +* Type of the IVE_IMAGE_S data. +* Aded by tanbing 2013-7-22 +*/ +typedef enum hiIVE_IMAGE_TYPE_E +{ + IVE_IMAGE_TYPE_U8C1 = 0x0, + IVE_IMAGE_TYPE_S8C1 = 0x1, + + IVE_IMAGE_TYPE_YUV420SP = 0x2, /*YUV420 SemiPlanar*/ + IVE_IMAGE_TYPE_YUV422SP = 0x3, /*YUV422 SemiPlanar*/ + IVE_IMAGE_TYPE_YUV420P = 0x4, /*YUV420 Planar */ + IVE_IMAGE_TYPE_YUV422P = 0x5, /*YUV422 planar */ + + IVE_IMAGE_TYPE_S8C2_PACKAGE = 0x6, + IVE_IMAGE_TYPE_S8C2_PLANAR = 0x7, + + IVE_IMAGE_TYPE_S16C1 = 0x8, + IVE_IMAGE_TYPE_U16C1 = 0x9, + + IVE_IMAGE_TYPE_U8C3_PACKAGE = 0xa, + IVE_IMAGE_TYPE_U8C3_PLANAR = 0xb, + + IVE_IMAGE_TYPE_S32C1 = 0xc, + IVE_IMAGE_TYPE_U32C1 = 0xd, + + IVE_IMAGE_TYPE_S64C1 = 0xe, + IVE_IMAGE_TYPE_U64C1 = 0xf, + + IVE_IMAGE_TYPE_BUTT + +}IVE_IMAGE_TYPE_E; + +/* +* Definition of the IVE_IMAGE_S. +* Added by Tan Bing, 2013-7-22. +*/ +typedef struct hiIVE_IMAGE_S +{ + IVE_IMAGE_TYPE_E enType; + + HI_U32 u32PhyAddr[3]; + HI_U8 *pu8VirAddr[3]; + + HI_U16 u16Stride[3]; + HI_U16 u16Width; + HI_U16 u16Height; + + HI_U16 u16Reserved; /*Can be used such as elemSize*/ +}IVE_IMAGE_S; + +typedef IVE_IMAGE_S IVE_SRC_IMAGE_S; +typedef IVE_IMAGE_S IVE_DST_IMAGE_S; + +/* +* Definition of the IVE_MEM_INFO_S.This struct special purpose for input or ouput, such as Hist, CCL, ShiTomasi. +* Added by Chen Quanfu, 2013-7-23. +*/ +typedef struct hiIVE_MEM_INFO_S +{ + HI_U32 u32PhyAddr; + HI_U8 *pu8VirAddr; + HI_U32 u32Size; +}IVE_MEM_INFO_S; +typedef IVE_MEM_INFO_S IVE_SRC_MEM_INFO_S; +typedef IVE_MEM_INFO_S IVE_DST_MEM_INFO_S; + +/* +*Data struct ,created by Chen Quanfu 2013-07-19 +*/ +typedef struct hiIVE_DATA_S +{ + HI_U32 u32PhyAddr; /*Physical address of the data*/ + HI_U8 *pu8VirAddr; + + HI_U16 u16Stride; /*2D data stride by byte*/ + HI_U16 u16Width; /*2D data width by byte*/ + HI_U16 u16Height; /*2D data height*/ + + HI_U16 u16Reserved; +}IVE_DATA_S; +typedef IVE_DATA_S IVE_SRC_DATA_S; +typedef IVE_DATA_S IVE_DST_DATA_S; + +/* +* Definition of the union of IVE_8BIT_U. +* Added by Tan Bing, 2013-7-22. +*/ +typedef union hiIVE_8BIT_U +{ + HI_S8 s8Val; + HI_U8 u8Val; +}IVE_8BIT_U; + +/* +* Definition of u16 point +*/ +typedef struct hiIVE_POINT_U16_S +{ + HI_U16 u16X; + HI_U16 u16Y; +}IVE_POINT_U16_S; + +/* +* Definition of s16 point +*/ +typedef struct hiIVE_POINT_S16_S +{ + HI_U16 s16X; + HI_U16 s16Y; +}IVE_POINT_S16_S; + +/* +*Float point represented by Fixed-point SQ25.7 +*/ +typedef struct hiIVE_POINT_S25Q7_S +{ + HI_S25Q7 s25q7X; /*X coordinate*/ + HI_S25Q7 s25q7Y; /*Y coordinate*/ +}IVE_POINT_S25Q7_S; + +/* +* Definition of rect +*/ +typedef struct hiIVE_RECT_U16_S +{ + HI_U16 u16X; + HI_U16 u16Y; + HI_U16 u16Width; + HI_U16 u16Height; +}IVE_RECT_U16_S; + +typedef struct hiIVE_LOOK_UP_TABLE_S +{ + IVE_MEM_INFO_S stTable; + HI_U16 u16ElemNum; /*LUT's elements number*/ + + HI_U8 u8TabInPreci; + HI_U8 u8TabOutNorm; + + HI_S32 s32TabInLower; /*LUT's original input lower limit*/ + HI_S32 s32TabInUpper; /*LUT's original input upper limit*/ +}IVE_LOOK_UP_TABLE_S; + + +typedef enum hiEN_IVE_ERR_CODE_E +{ + ERR_IVE_SYS_TIMEOUT = 0x40, /* IVE process timeout */ + ERR_IVE_QUERY_TIMEOUT = 0x41, /* IVE query timeout */ + ERR_IVE_OPEN_FILE = 0x42, /* IVE open file error */ + ERR_IVE_READ_FILE = 0x43, /* IVE read file error */ + ERR_IVE_WRITE_FILE = 0x44, /* IVE write file error */ + + ERR_IVE_BUTT +}EN_IVE_ERR_CODE_E; + +typedef enum hiEN_FD_ERR_CODE_E +{ + ERR_FD_SYS_TIMEOUT = 0x40, /* FD process timeout */ + ERR_FD_CFG = 0x41, /* FD configuration error */ + ERR_FD_FACE_NUM_OVER = 0x42, /* FD candidate face number over*/ + ERR_FD_OPEN_FILE = 0x43, /* FD open file error */ + ERR_FD_READ_FILE = 0x44, /* FD read file error */ + ERR_FD_WRITE_FILE = 0x45, /* FD write file error */ + + ERR_FD_BUTT +}EN_FD_ERR_CODE_E; + +/************************************************IVE error code ***********************************/ +/*Invalid device ID*/ +#define HI_ERR_IVE_INVALID_DEVID HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/*Invalid channel ID*/ +#define HI_ERR_IVE_INVALID_CHNID HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/*At least one parameter is illegal. For example, an illegal enumeration value exists.*/ +#define HI_ERR_IVE_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/*The channel exists.*/ +#define HI_ERR_IVE_EXIST HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*The UN exists.*/ +#define HI_ERR_IVE_UNEXIST HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/*A null point is used.*/ +#define HI_ERR_IVE_NULL_PTR HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/*Try to enable or initialize the system, device, or channel before configuring attributes.*/ +#define HI_ERR_IVE_NOT_CONFIG HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/*The operation is not supported currently.*/ +#define HI_ERR_IVE_NOT_SURPPORT HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/*The operation, changing static attributes for example, is not permitted.*/ +#define HI_ERR_IVE_NOT_PERM HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/*A failure caused by the malloc memory occurs.*/ +#define HI_ERR_IVE_NOMEM HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/*A failure caused by the malloc buffer occurs.*/ +#define HI_ERR_IVE_NOBUF HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/*The buffer is empty.*/ +#define HI_ERR_IVE_BUF_EMPTY HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/*No buffer is provided for storing new data.*/ +#define HI_ERR_IVE_BUF_FULL HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/*The system is not ready because it may be not initialized or loaded. + *The error code is returned when a device file fails to be opened. */ +#define HI_ERR_IVE_NOTREADY HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + +/*The source address or target address is incorrect during the operations such as calling copy_from_user or copy_to_user.*/ +#define HI_ERR_IVE_BADADDR HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) +/*The resource is busy during the operations such as destroying a VENC channel without deregistering it.*/ +#define HI_ERR_IVE_BUSY HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/*IVE process timeout: 0xA01D8040*/ +#define HI_ERR_IVE_SYS_TIMEOUT HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_SYS_TIMEOUT) +/*IVE query timeout: 0xA01D8041*/ +#define HI_ERR_IVE_QUERY_TIMEOUT HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_QUERY_TIMEOUT) +/*IVE open file error: 0xA01D8042*/ +#define HI_ERR_IVE_OPEN_FILE HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_OPEN_FILE) +/*IVE read file error: 0xA01D8043*/ +#define HI_ERR_IVE_READ_FILE HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_READ_FILE) +/*IVE read file error: 0xA01D8044*/ +#define HI_ERR_IVE_WRITE_FILE HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_WRITE_FILE) + +/************************************************FD error code ***********************************/ +/*Invalid device ID*/ +#define HI_ERR_FD_INVALID_DEVID HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/*Invalid channel ID*/ +#define HI_ERR_FD_INVALID_CHNID HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/*At least one parameter is illegal. For example, an illegal enumeration value exists.*/ +#define HI_ERR_FD_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/*The channel exists.*/ +#define HI_ERR_FD_EXIST HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*The UN exists.*/ +#define HI_ERR_FD_UNEXIST HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/*A null point is used.*/ +#define HI_ERR_FD_NULL_PTR HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/*Try to enable or initialize the system, device, or channel before configuring attributes.*/ +#define HI_ERR_FD_NOT_CONFIG HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/*The operation is not supported currently.*/ +#define HI_ERR_FD_NOT_SURPPORT HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/*The operation, changing static attributes for example, is not permitted.*/ +#define HI_ERR_FD_NOT_PERM HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/*A failure caused by the malloc memory occurs.*/ +#define HI_ERR_FD_NOMEM HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/*A failure caused by the malloc buffer occurs.*/ +#define HI_ERR_FD_NOBUF HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/*The buffer is empty.*/ +#define HI_ERR_FD_BUF_EMPTY HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/*No buffer is provided for storing new data.*/ +#define HI_ERR_FD_BUF_FULL HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/*The system is not ready because it may be not initialized or loaded. + *The error code is returned when a device file fails to be opened. */ +#define HI_ERR_FD_NOTREADY HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/*The source address or target address is incorrect during the operations such as calling copy_from_user or copy_to_user.*/ +#define HI_ERR_FD_BADADDR HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) +/*The resource is busy during the operations such as destroying a VENC channel without deregistering it.*/ +#define HI_ERR_FD_BUSY HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +/*FD process timeout: 0xA02F8040*/ +#define HI_ERR_FD_SYS_TIMEOUT HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_SYS_TIMEOUT) +/*FD configuration error: 0xA02F8041*/ +#define HI_ERR_FD_CFG HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_CFG) +/*FD candidate face number over: 0xA02F8042*/ +#define HI_ERR_FD_FACE_NUM_OVER HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_FACE_NUM_OVER) +/*FD open file error: 0xA02F8043*/ +#define HI_ERR_FD_OPEN_FILE HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_OPEN_FILE) +/*FD read file error: 0xA02F8044*/ +#define HI_ERR_FD_READ_FILE HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_READ_FILE) +/*FD read file error: 0xA02F8045*/ +#define HI_ERR_FD_WRITE_FILE HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_WRITE_FILE) + +/************************************************ODT error code ***********************************/ +/*ODT exist: 0xA0308004*/ +#define HI_ERR_ODT_EXIST HI_DEF_ERR(HI_ID_ODT, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*ODT the system is not ready because it may be not initialized: 0xA0308010*/ +#define HI_ERR_ODT_NOTREADY HI_DEF_ERR(HI_ID_ODT, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/*ODT busy: 0xA0308012*/ +#define HI_ERR_ODT_BUSY HI_DEF_ERR(HI_ID_ODT, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif +#endif/*__HI_COMM_IVE_H__*/ + diff --git a/device/mpp/include/hi_comm_pciv.h b/device/mpp/include/hi_comm_pciv.h new file mode 100644 index 0000000..22b9ae9 --- /dev/null +++ b/device/mpp/include/hi_comm_pciv.h @@ -0,0 +1,277 @@ + +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_pciv.h + Version : Initial Draft + Author : Hisilicon multimedia software pciv + Created : 2008/06/04 + Last Modified : + Description : common struct definition for PCIV + Function List : + History : + +******************************************************************************/ + +#ifndef __HI_COMM_PCIV_H__ +#define __HI_COMM_PCIV_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" +#include "hi_comm_vdec.h" +#include "hi_comm_vpss.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +typedef HI_S32 PCIV_CHN; + +#define PCIV_MAX_BUF_NUM 16 /* pciv channel max buffer number */ +#define PCIV_MAX_CHIPNUM 32 /* max pciv device number which can join in the system */ + +#define MAKE_DWORD(high,low) (((low)&0x0000ffff)|((high)<<16)) +#define HIGH_WORD(x) (((x)&0xffff0000)>>16) +#define LOW_WORD(x) ((x)&0x0000ffff) + +/* vi object struct */ +typedef struct hiPCIV_VIDEVICE_S +{ + VI_DEV viDev; /* vi device number */ + VI_CHN viChn; /* vi channel number */ +} PCIV_VIDEVICE_S; + +/* vo object struct */ +typedef struct hiPCIV_VODEVICE_S +{ + VO_DEV voDev; /* vo device number */ + VO_CHN voChn; /* vo channel number */ +} PCIV_VODEVICE_S; + +/* vdec object struct */ +typedef struct hiPCIV_VDECDEVICE_S +{ + VDEC_CHN vdecChn; /* vedc channel number */ +} PCIV_VDECDEVICE_S; + +/* vpss object struct */ +typedef struct hiPCIV_VPSSDEVICE_S +{ + VPSS_GRP vpssGrp; /* vpss group number */ + VPSS_CHN vpssChn; /* vpss channel number */ +} PCIV_VPSSDEVICE_S; + +/* bind type for pciv */ +typedef enum hiPCIV_BIND_TYPE_E +{ + PCIV_BIND_VI = 0, + PCIV_BIND_VO = 1, + PCIV_BIND_VDEC = 2, + PCIV_BIND_VPSS = 3, + PCIV_BIND_BUTT +} PCIV_BIND_TYPE_E; + +/* bind object struct for pciv */ +typedef struct hiPCI_BIND_OBJ_S +{ + HI_BOOL bVpssSend; + PCIV_BIND_TYPE_E enType; /* bind type for pciv */ + union + { + PCIV_VIDEVICE_S viDevice; + PCIV_VODEVICE_S voDevice; + PCIV_VDECDEVICE_S vdecDevice; + PCIV_VPSSDEVICE_S vpssDevice; + } unAttachObj; +} PCIV_BIND_OBJ_S; + +/* remote pciv object */ +typedef struct hiPCIV_REMOTE_OBJ_S +{ + HI_S32 s32ChipId; /* remote pciv device Id number */ + PCIV_CHN pcivChn; /* pciv channel number of remote pciv device */ +} PCIV_REMOTE_OBJ_S; + +/* attribution of target picture */ +typedef struct hiPCIV_PIC_ATTR_S +{ + HI_U32 u32Width; /* pciture width of pciv channel */ + HI_U32 u32Height; /* picture height of pciv channel */ + HI_U32 u32Stride[3]; /* pciture stride of pciv channel */ + VIDEO_FIELD_E u32Field; /* video frame field type of pciv channel */ + PIXEL_FORMAT_E enPixelFormat; /* pixel format of pciture of pciv channel */ +} PCIV_PIC_ATTR_S; + + +/* attribution of pciv chn */ +typedef struct hiPCIV_ATTR_S +{ + PCIV_PIC_ATTR_S stPicAttr; /* picture attibute */ + HI_S32 s32BufChip; /* The chip id which buffer is belong to */ + HI_U32 u32BlkSize; /* vb size of receiver for preview */ + HI_U32 u32Count; /* lenght of address list */ + HI_U32 u32PhyAddr[PCIV_MAX_BUF_NUM]; /* address list for picture move */ + PCIV_REMOTE_OBJ_S stRemoteObj; /* remote pciv object */ +} PCIV_ATTR_S; + +/* max count of video buffer block for pci window */ +#define PCIV_MAX_VBCOUNT 8 + +/* mpp video buffer config for pci window */ +typedef struct hiPCIV_WINVBCFG_S +{ + HI_U32 u32PoolCount; /* total number of video buffer pool */ + HI_U32 u32BlkSize[PCIV_MAX_VBCOUNT]; /* size of video buffer pool */ + HI_U32 u32BlkCount[PCIV_MAX_VBCOUNT]; /* number of video buffer pool */ +} PCIV_WINVBCFG_S; + +typedef struct hiPCIV_BASEWINDOW_S +{ + HI_S32 s32ChipId; /* pciv device number */ + HI_U32 u32NpWinBase; /* non-prefetch window pcie base address */ + HI_U32 u32PfWinBase; /* prefetch window pcie base address */ + HI_U32 u32CfgWinBase; /* config window pcie base address */ + HI_U32 u32PfAHBAddr; /* prefetch window AHB base address */ +} PCIV_BASEWINDOW_S; + +#define PCIV_MAX_DMABLK 128 +typedef struct hiPCIV_DMA_BLOCK_S +{ + HI_U32 u32SrcAddr; /* source address of dma task */ + HI_U32 u32DstAddr; /* destination address of dma task */ + HI_U32 u32BlkSize; /* data block size of dma task */ +} PCIV_DMA_BLOCK_S; + +typedef struct hiPCIV_DMA_TASK_S +{ + HI_U32 u32Count; /* total dma task number */ + HI_BOOL bRead; /* dam task is read or write data */ + PCIV_DMA_BLOCK_S *pBlock; +} PCIV_DMA_TASK_S; + + +/* + * Message port used in pciv_drvadp, you can't use it in your application. + */ +#define PCIV_MSGPORT_KERNEL 80 + + +/* + * You should not use follow mocros, they will be deleted ! + */ +#define PCIV_MSGPORT_MAXPORT 100 +#define PCIV_MSGPORT_TIME 79 +#define PCIV_MSGPORT_USERCMD 81 +#define PCIV_MSGPORT_USERNOTIFY2HOST 82 +#define PCIV_MSGPORT_USERNOTIFY2SLAVE 83 +#define PCIV_MSGPORT_USERNOTIFY2HOST_VDEC 84 +#define PCIV_MSGPORT_USERNOTIFY2SLAVE_VDEC 85 +#define PCIV_MAXVO_BIND 4 +/*----------------------------------------*/ + +typedef enum hiPCIV_FILTER_TYPE_E +{ + PCIV_FILTER_TYPE_NORM, + PCIV_FILTER_TYPE_EX, + PCIV_FILTER_TYPE_EX2, + + PCIV_FILTER_TYPE_BUTT +} PCIV_FILTER_TYPE_E; + +typedef enum hiPCIV_PIC_FIELD_E +{ + PCIV_FIELD_TOP, + PCIV_FIELD_BOTTOM, + PCIV_FIELD_BOTH, + + PCIV_FIELD_BUTT +} PCIV_PIC_FIELD_E; + +/* + * configuration of pre-process before sending source picture whth PCI + * item in this structrue have default value when sys init + */ +typedef struct hiPCIV_PREPROC_CFG_S +{ + PCIV_PIC_FIELD_E enFieldSel; /* pictrue field select */ + PCIV_FILTER_TYPE_E enFilterType; /* filter group type */ +} PCIV_PREPROC_CFG_S; + + +#if 0 +/* Synchronize the time and PTS. The host is base. */ +typedef struct hiPCIV_TIME_SYNC_S +{ + struct timeval stSysTime; /* The current system time */ + HI_U64 u64PtsBase; /* The media PTS */ + HI_U32 u32ReqTagId; +} PCIV_TIME_SYNC_S; +#endif + +/* invlalid channel ID */ +#define HI_ERR_PCIV_INVALID_CHNID HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_PCIV_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_PCIV_EXIST HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* channel exists */ +#define HI_ERR_PCIV_UNEXIST HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_PCIV_NULL_PTR HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_PCIV_NOT_CONFIG HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_PCIV_NOT_SUPPORT HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_PCIV_NOT_PERM HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_PCIV_NOMEM HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_PCIV_NOBUF HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_PCIV_BUF_EMPTY HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_PCIV_BUF_FULL HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_PCIV_SYS_NOTREADY HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/* One DMA task is working, wait a minute */ +#define HI_ERR_PCIV_BUSY HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_PCIV_TIMEOUT HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUTT+1) + +#define PCIV_TRACE(level, fmt...)\ +do{ \ + HI_TRACE(level, HI_ID_PCIV,"[Func]:%s [Line]:%d [Info]:", __FUNCTION__, __LINE__);\ + HI_TRACE(level,HI_ID_PCIV,##fmt);\ +}while(0) + +#define PCIV_CHECK_CHNID(ChnID)\ +do{\ + if(((ChnID) < 0) || ((ChnID) >= PCIV_MAX_CHN_NUM))\ + {\ + PCIV_TRACE(HI_DBG_ERR, "invalid chn id:%d \n", ChnID);\ + return HI_ERR_PCIV_INVALID_CHNID;\ + }\ +}while(0) + +#define PCIV_CHECK_PTR(ptr)\ +do{\ + if(NULL == (ptr))\ + {\ + return HI_ERR_PCIV_NULL_PTR;\ + }\ +}while(0) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ +#endif /* __HI_COMM_PCIV_H__ */ + diff --git a/device/mpp/include/hi_comm_rc.h b/device/mpp/include/hi_comm_rc.h new file mode 100644 index 0000000..c503344 --- /dev/null +++ b/device/mpp/include/hi_comm_rc.h @@ -0,0 +1,324 @@ +/****************************************************************************** + + Copyright (C), 2001-2012, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_rc.h + Version : + Author : Hisilicon Hi35xx MPP Team + Created : 2006/11/24 + Last Modified : + Description : common struct definition for Rate control + Function List : + History : +******************************************************************************/ +#ifndef __HI_COMM_RC_H__ +#define __HI_COMM_RC_H__ + +#include "hi_defines.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +typedef HI_U32 HI_FR32; + +typedef enum hiVENC_RC_MODE_E +{ + VENC_RC_MODE_H264CBR = 1, + VENC_RC_MODE_H264VBR, + VENC_RC_MODE_H264ABR, + VENC_RC_MODE_H264FIXQP, + + VENC_RC_MODE_MJPEGCBR, + VENC_RC_MODE_MJPEGVBR, + VENC_RC_MODE_MJPEGABR, + VENC_RC_MODE_MJPEGFIXQP, + + VENC_RC_MODE_MPEG4CBR, + VENC_RC_MODE_MPEG4VBR, + VENC_RC_MODE_MPEG4ABR, + VENC_RC_MODE_MPEG4FIXQP, + + VENC_RC_MODE_H265CBR, + VENC_RC_MODE_H265VBR, + VENC_RC_MODE_H265FIXQP, + + VENC_RC_MODE_BUTT, + +}VENC_RC_MODE_E; + + +typedef struct hiVENC_ATTR_H264_FIXQP_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32IQp; /* qp of the i frame */ + HI_U32 u32PQp; /* qp of the p frame */ +} VENC_ATTR_H264_FIXQP_S; + +typedef struct hiVENC_ATTR_H264_CBR_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32BitRate; /* average bitrate */ + HI_U32 u32FluctuateLevel; /* level [0..5].scope of bitrate fluctuate. 1-5: 10%-50%. 0: SDK optimized, recommended; */ +} VENC_ATTR_H264_CBR_S; + +typedef struct hiVENC_ATTR_H264_VBR_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32MaxBitRate; /* the max bitrate */ + HI_U32 u32MaxQp; /* the max qp */ + HI_U32 u32MinQp; /* the min qp */ +}VENC_ATTR_H264_VBR_S; + +typedef struct hiVENC_ATTR_H264_ABR_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32AvgBitRate; /* average bitrate */ + HI_U32 u32MaxBitRate; /* the max bitrate */ +}VENC_ATTR_H264_ABR_S; + +typedef struct hiVENC_ATTR_H264_CBR_S VENC_ATTR_H265_CBR_S; +typedef struct hiVENC_ATTR_H264_VBR_S VENC_ATTR_H265_VBR_S; +typedef struct hiVENC_ATTR_H264_FIXQP_S VENC_ATTR_H265_FIXQP_S; + + + +typedef struct hiVENC_ATTR_MPEG4_FIXQP_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32IQp; /* qp of the i frame */ + HI_U32 u32PQp; /* qp of the p frame */ +}VENC_ATTR_MPEG4_FIXQP_S; + +typedef struct hiVENC_ATTR_MPEG4_CBR_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32BitRate; /* average bitrate */ + HI_U32 u32FluctuateLevel; /* level [0..5].scope of bitrate fluctuate. 1-5: 10%-50%. 0: SDK optimized, recommended; */ +}VENC_ATTR_MPEG4_CBR_S; + +typedef struct hiVENC_ATTR_MPEG4_VBR_S +{ + HI_U32 u32Gop; /* the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32MaxBitRate; /* the max bitrate */ + HI_U32 u32MaxQp; /* the max qp */ + HI_U32 u32MinQp; /* the min qp */ +}VENC_ATTR_MPEG4_VBR_S; + +typedef struct hiVENC_ATTR_MJPEG_FIXQP_S +{ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate; /* the target frame rate of the venc chnnel */ + HI_U32 u32Qfactor; /* image quality :[1,99]*/ +}VENC_ATTR_MJPEG_FIXQP_S; + +typedef struct hiVENC_ATTR_MJPEG_CBR_S +{ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32BitRate; /* average bitrate */ + HI_U32 u32FluctuateLevel; /* level [0..5].scope of bitrate fluctuate. 1-5: 10%-50%. 0: SDK optimized, recommended; */ +} VENC_ATTR_MJPEG_CBR_S; + +typedef struct hiVENC_ATTR_MJPEG_VBR_S +{ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate; /* the target frame rate of the venc chnnel */ + HI_U32 u32MaxBitRate; /* max bitrate */ + HI_U32 u32MaxQfactor; /* max image quailty allowed */ + HI_U32 u32MinQfactor; /* min image quality allowed */ +}VENC_ATTR_MJPEG_VBR_S; + +typedef struct hiVENC_RC_ATTR_S +{ + VENC_RC_MODE_E enRcMode; /*the type of rc*/ + union + { + VENC_ATTR_H264_CBR_S stAttrH264Cbr; + VENC_ATTR_H264_VBR_S stAttrH264Vbr; + VENC_ATTR_H264_FIXQP_S stAttrH264FixQp; + VENC_ATTR_H264_ABR_S stAttrH264Abr; + + VENC_ATTR_MPEG4_CBR_S stAttrMpeg4Cbr; + VENC_ATTR_MPEG4_FIXQP_S stAttrMpeg4FixQp; + VENC_ATTR_MPEG4_VBR_S stAttrMpeg4Vbr; + + VENC_ATTR_MJPEG_CBR_S stAttrMjpegeCbr; + VENC_ATTR_MJPEG_FIXQP_S stAttrMjpegeFixQp; + VENC_ATTR_MJPEG_VBR_S stAttrMjpegeVbr; + + VENC_ATTR_H265_CBR_S stAttrH265Cbr; + VENC_ATTR_H265_VBR_S stAttrH265Vbr; + VENC_ATTR_H265_FIXQP_S stAttrH265FixQp; + }; + HI_VOID* pRcAttr ; /*the rc attribute which could be specified by user*/ + +}VENC_RC_ATTR_S; + +typedef enum hiRC_SUPERFRM_MODE_E +{ + SUPERFRM_NONE, /* sdk don't care super frame */ + SUPERFRM_DISCARD, /* the super frame is discarded */ + SUPERFRM_REENCODE, /* the super frame is re-encode */ + SUPERFRM_BUTT +}VENC_SUPERFRM_MODE_E; + +typedef struct hiVENC_PARAM_H264_CBR_S +{ + HI_U32 u32MinIprop; /* the min ratio of i frame and p frame */ + HI_U32 u32MaxIprop; /* the max ratio of i frame and p frame */ + HI_U32 u32MaxQp; /* the max QP value */ + HI_U32 u32MinQp; /* the min QP value */ + HI_S32 s32IPQPDelta; /* the qp difference between the i frame and the before gop avarage qp; == Qp(P) - Qp(I) */ + HI_S32 s32QualityLevel; /* quality of picture [1, 5] */ + HI_S32 s32MaxReEncodeTimes; /* max number of re-encode times [0, 3]*/ + HI_U32 u32MinIQp; /* min qp for i frame */ +}VENC_PARAM_H264_CBR_S; + +typedef struct hiVENC_PARAM_H264_VBR_S +{ + HI_S32 s32IPQPDelta; /* the qp difference between the i frame and the before gop avarage qp; == Qp(P) - Qp(I) */ + HI_S32 s32ChangePos; /* Indicates the ratio of the current bit rate to the maximum + bit rate when the QP value starts to be adjusted */ + HI_U32 u32MinIprop; /* the min ratio of i frame and p frame */ + HI_U32 u32MaxIprop; /* the max ratio of i frame and p frame */ + HI_U32 u32MinIQP; /* min qp for i frame */ +}VENC_PARAM_H264_VBR_S; + + + +typedef struct hiVENC_PARAM_MJPEG_CBR_S +{ + HI_U32 u32MaxQfactor; /* the max Qfactor value*/ + HI_U32 u32MinQfactor; /* the min Qfactor value */ + HI_U32 u32RQRatio[RC_RQRATIO_SIZE]; /* the rate stabilization weight, + 100-u32RQRatio[i] is the sequence quality stabilization weight */ + +}VENC_PARAM_MJPEG_CBR_S; + +typedef struct hiVENC_PARAM_MJPEG_VBR_S +{ + HI_S32 s32DeltaQfactor; /* Indicates the maximum change of Qfactor values of frames + when the picture quality changes */ + HI_S32 s32ChangePos; /* Indicates the ratio of the current bit rate to the maximum + bit rate when the Qfactor value starts to be adjusted */ +}VENC_PARAM_MJPEG_VBR_S; + +typedef struct hiVENC_PARAM_MPEG4_CBR_S +{ + HI_U32 u32MinIprop; /* the min ratio of i frame and p frame*/ + HI_U32 u32MaxIprop; /* the max ratio of i frame and p frame */ + + HI_U32 u32MaxQp; /* the max QP value*/ + HI_U32 u32MinQp; /* the min QP value */ + HI_U32 u32MaxPPDeltaQp; /* the max qp value difference between two successive P frame */ + HI_U32 u32MaxIPDeltaQp; /* the max qp value difference between p frame and the next i frame */ + HI_S32 s32IPQPDelta; /* the qp difference between the i frame and the before gop avarage qp*/ + + HI_U32 u32RQRatio[RC_RQRATIO_SIZE]; /* the rate stabilization weight, + 100-u32RQRatio[i] is the sequence quality stabilization weight */ +}VENC_PARAM_MPEG4_CBR_S; + +typedef struct hiVENC_PARAM_MPEG4_VBR_S +{ + HI_S32 s32IPQPDelta; /* the qp difference between the i frame and the before gop avarage qp*/ + + HI_S32 s32ChangePos; /* Indicates the ratio of the current bit rate to the maximum + bit rate when the QP value starts to be adjusted */ + + HI_U32 u32MinIprop; /* the min ratio of i frame and p frame */ + HI_U32 u32MaxIprop; /* the max ratio of i frame and p frame */ +}VENC_PARAM_MPEG4_VBR_S; + +typedef struct hiVENC_PARAM_H264_CBR_S VENC_PARAM_H265_CBR_S; +typedef struct hiVENC_PARAM_H264_VBR_S VENC_PARAM_H265_VBR_S; + + +typedef struct hiVENC_RC_PARAM_S +{ + HI_U32 u32ThrdI[RC_TEXTURE_THR_SIZE]; /* just useful for h264/h265 and mpeg4 for now */ + HI_U32 u32ThrdP[RC_TEXTURE_THR_SIZE]; + HI_U32 u32RowQpDelta; + union + { + VENC_PARAM_H264_CBR_S stParamH264Cbr; + VENC_PARAM_H264_VBR_S stParamH264VBR; + VENC_PARAM_MJPEG_CBR_S stParamMjpegCbr; + VENC_PARAM_MJPEG_VBR_S stParamMjpegVbr; + VENC_PARAM_MPEG4_CBR_S stParamMpeg4Cbr; + VENC_PARAM_MPEG4_VBR_S stParamMpeg4Vbr; + VENC_PARAM_H265_CBR_S stParamH265Cbr; + VENC_PARAM_H265_VBR_S stParamH265Vbr; + }; + + HI_VOID* pRcParam; /*RC parameter which could be specified by usrer*/ +}VENC_RC_PARAM_S; + + + +typedef enum hiVENC_FRAMELOST_MODE_E +{ + FRMLOST_NORMAL, /*normal mode*/ + FRMLOST_PSKIP, /*pskip*/ + FRMLOST_BUTT, +}VENC_FRAMELOST_MODE_E; + +typedef struct hiVENC_PARAM_FRAMELOST_S +{ + HI_BOOL bFrmLostOpen; /* Indicates whether to discard frames to ensure + stable bit rate when the instant bit rate is exceeded */ + HI_U32 u32FrmLostBpsThr; /* the instant bit rate threshold */ + VENC_FRAMELOST_MODE_E enFrmLostMode; /*frame lost strategy*/ + HI_U32 u32EncFrmGaps; /*the gap of frame lost*/ +}VENC_PARAM_FRAMELOST_S; + + +typedef struct hiVENC_SUPERFRAME_CFG_S +{ + VENC_SUPERFRM_MODE_E enSuperFrmMode; /* Indicates the mode of processing the super frame,[SUPERFRM_NONE,SUPERFRM_DISCARD,SUPERFRM_REENCODE]*/ + HI_U32 u32SuperIFrmBitsThr; /* Indicate the threshold of the super I frame + for enabling the super frame processing mode */ + HI_U32 u32SuperPFrmBitsThr; /* Indicate the threshold of the super P frame */ + HI_U32 u32SuperBFrmBitsThr; /* Indicate the threshold of the super B frame */ +}VENC_SUPERFRAME_CFG_S; + +typedef enum hiVENC_RC_PRIORITY_E +{ + VENC_RC_PRIORITY_BITRATE_FIRST = 1, + VENC_RC_PRIORITY_FRAMEBITS_FIRST, + + VENC_RC_PRIORITY_BUTT, +} VENC_RC_PRIORITY_E; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_RC_H__ */ diff --git a/device/mpp/include/hi_comm_region.h b/device/mpp/include/hi_comm_region.h new file mode 100644 index 0000000..66532da --- /dev/null +++ b/device/mpp/include/hi_comm_region.h @@ -0,0 +1,287 @@ +/****************************************************************************** +* +* Copyright (C), 2001-2011, Huawei Tech. Co., Ltd. +* +******************************************************************************* +* File Name : hi_comm_region.h +* Version : Initial Draft +* Author : j00169368 +* Created : 2010/12/13 +* Last Modified : +* Description : include RGN struct , Marco and Error information +* Function List : +* +* +* History: +* +* 1. Date : 2010/12/13 +* Author : j00169368 +* Modification : Created file +* +******************************************************************************/ + + +#ifndef __HI_COMM_REGION_H__ +#define __HI_COMM_REGION_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_errno.h" +#include "hi_defines.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + + + + +typedef HI_U32 RGN_HANDLE; + +/* type of video regions */ +typedef enum hiRGN_TYPE_E +{ + OVERLAY_RGN = 0, /* video overlay region */ + COVER_RGN, + COVEREX_RGN, + OVERLAYEX_RGN, + RGN_BUTT +} RGN_TYPE_E; + +typedef enum hiINVERT_COLOR_MODE_E +{ + LESSTHAN_LUM_THRESH = 0, /* the lum of the video is less than the lum threshold which is set by u32LumThresh */ + MORETHAN_LUM_THRESH, /* the lum of the video is more than the lum threshold which is set by u32LumThresh */ + INVERT_COLOR_BUTT +}INVERT_COLOR_MODE_E; + +typedef struct hiOVERLAY_QP_INFO_S +{ + HI_BOOL bAbsQp; + HI_S32 s32Qp; + HI_BOOL bQpDisable; +}OVERLAY_QP_INFO_S; + +typedef struct hiOVERLAY_INVERT_COLOR_S +{ + SIZE_S stInvColArea; //It must be multipe of 16 but not more than 64. + HI_U32 u32LumThresh; //The threshold to decide whether invert the OSD's color or not. + INVERT_COLOR_MODE_E enChgMod; + HI_BOOL bInvColEn; //The switch of inverting color. +}OVERLAY_INVERT_COLOR_S; + +typedef struct hiOVERLAY_ATTR_S +{ + /* bitmap pixel format,now only support ARGB1555 or ARGB4444 */ + PIXEL_FORMAT_E enPixelFmt; + + /* background color, pixel format depends on "enPixelFmt" */ + HI_U32 u32BgColor; + + /* region size,W:[4,4096],align:2,H:[4,4096],align:2 */ + SIZE_S stSize; +}OVERLAY_ATTR_S; + +typedef struct hiOVERLAY_CHN_ATTR_S +{ + /* X:[0,4096],align:4,Y:[0,4096],align:4 */ + POINT_S stPoint; + + /* background an foreground transparence when pixel format is ARGB1555 + * the pixel format is ARGB1555,when the alpha bit is 1 this alpha is value! + * range:[0,128] + */ + HI_U32 u32FgAlpha; + + /* background an foreground transparence when pixel format is ARGB1555 + * the pixel format is ARGB1555,when the alpha bit is 0 this alpha is value! + * range:[0,128] + */ + HI_U32 u32BgAlpha; + + HI_U32 u32Layer; /* OVERLAY region layer range:[0,7]*/ + + OVERLAY_QP_INFO_S stQpInfo; + + OVERLAY_INVERT_COLOR_S stInvertColor; +}OVERLAY_CHN_ATTR_S; + +typedef enum hiRGN_AREA_TYPE_E +{ + AREA_RECT = 0, + AREA_QUAD_RANGLE, + AREA_BUTT +} RGN_AREA_TYPE_E; + +typedef struct hiRGN_QUADRANGLE_S +{ + HI_BOOL bSolid; /* whether solid or dashed quadrangle */ + HI_U32 u32Thick; /* Line Width of quadrangle, valid when dashed quadrangle */ + POINT_S stPoint[4]; /* points of quadrilateral */ +} RGN_QUADRANGLE_S; + +typedef struct hiCOVER_CHN_ATTR_S +{ + RGN_AREA_TYPE_E enCoverType; /* rect or arbitary quadrilateral COVER */ + union + { + RECT_S stRect; /* config of rect */ + RGN_QUADRANGLE_S stQuadRangle; /* config of arbitary quadrilateral COVER */ + }; + HI_U32 u32Color; + HI_U32 u32Layer; /* COVER region layer */ +}COVER_CHN_ATTR_S; + +typedef struct hiCOVEREX_CHN_ATTR_S +{ + RGN_AREA_TYPE_E enCoverType; /* rect or arbitary quadrilateral COVER */ + union + { + RECT_S stRect; /* config of rect */ + RGN_QUADRANGLE_S stQuadRangle; /* config of arbitary quadrilateral COVER */ + }; + HI_U32 u32Color; + HI_U32 u32Layer; /* COVEREX region layer range:[0,7] */ +}COVEREX_CHN_ATTR_S; + +typedef struct hiOVERLAYEX_COMM_ATTR_S +{ + PIXEL_FORMAT_E enPixelFmt; + + /* background color, pixel format depends on "enPixelFmt" */ + HI_U32 u32BgColor; + + /* region size,W:[4,1920],align:2,H:[4,1080],align:2 */ + SIZE_S stSize; +}OVERLAYEX_ATTR_S; + +typedef struct hiOVERLAYEX_CHN_ATTR_S +{ + /* X:[0,4096],align:4,Y:[0,4636],align:4 */ + POINT_S stPoint; + + /* background an foreground transparence when pixel format is ARGB1555 + * the pixel format is ARGB1555,when the alpha bit is 1 this alpha is value! + * range:[0,255] + */ + HI_U32 u32FgAlpha; + + /* background an foreground transparence when pixel format is ARGB1555 + * the pixel format is ARGB1555,when the alpha bit is 0 this alpha is value! + * range:[0,255] + */ + HI_U32 u32BgAlpha; + + HI_U32 u32Layer; /* OVERLAYEX region layer range:[0,15]*/ +}OVERLAYEX_CHN_ATTR_S; + +typedef union hiRGN_ATTR_U +{ + OVERLAY_ATTR_S stOverlay; /* attribute of overlay region */ + OVERLAYEX_ATTR_S stOverlayEx; /* attribute of overlayex region */ +} RGN_ATTR_U; + +typedef union hiRGN_CHN_ATTR_U +{ + OVERLAY_CHN_ATTR_S stOverlayChn; /* attribute of overlay region */ + COVER_CHN_ATTR_S stCoverChn; /* attribute of cover region */ + COVEREX_CHN_ATTR_S stCoverExChn; /* attribute of coverex region */ + OVERLAYEX_CHN_ATTR_S stOverlayExChn; /* attribute of overlayex region */ +} RGN_CHN_ATTR_U; + +/* attribute of a region */ +typedef struct hiRGN_ATTR_S +{ + RGN_TYPE_E enType; /* region type */ + RGN_ATTR_U unAttr; /* region attribute */ +} RGN_ATTR_S; + +/* attribute of a region */ +typedef struct hiRGN_CHN_ATTR_S +{ + HI_BOOL bShow; + RGN_TYPE_E enType; /* region type */ + RGN_CHN_ATTR_U unChnAttr; /* region attribute */ +} RGN_CHN_ATTR_S; + + + +#define RGN_MAX_BMP_UPDATE_NUM 16 + +typedef struct hiRGN_BMP_UPDATE_S +{ + POINT_S stPoint; + BITMAP_S stBmp; + HI_U32 u32Stride; +} RGN_BMP_UPDATE_S; + +typedef struct hiRGN_BMP_UPDATE_CFG_S +{ + HI_U32 u32BmpCnt; + RGN_BMP_UPDATE_S astBmpUpdate[RGN_MAX_BMP_UPDATE_NUM]; +} RGN_BMP_UPDATE_CFG_S; + +typedef struct hiRGN_CANVAS_INFO_S +{ + HI_U32 u32PhyAddr; + HI_U32 u32VirtAddr; + SIZE_S stSize; + HI_U32 u32Stride; + PIXEL_FORMAT_E enPixelFmt; +} RGN_CANVAS_INFO_S; + +/* PingPong buffer change when set attr, it needs to remap memory in mpi interface */ +#define HI_NOTICE_RGN_BUFFER_CHANGE HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_NOTICE, HI_SUCCESS) + +/* invlalid device ID */ +#define HI_ERR_RGN_INVALID_DEVID HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_RGN_INVALID_CHNID HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_RGN_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_RGN_EXIST HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*UN exist*/ +#define HI_ERR_RGN_UNEXIST HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_RGN_NULL_PTR HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_RGN_NOT_CONFIG HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_RGN_NOT_SUPPORT HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_RGN_NOT_PERM HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_RGN_NOMEM HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_RGN_NOBUF HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_RGN_BUF_EMPTY HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_RGN_BUF_FULL HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* bad address, eg. used for copy_from_user & copy_to_user */ +#define HI_ERR_RGN_BADADDR HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) +/* resource is busy, eg. destroy a venc chn without unregistering it */ +#define HI_ERR_RGN_BUSY HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/* System is not ready,maybe not initialed or loaded. + * Returning the error code when opening a device file failed. + */ +#define HI_ERR_RGN_NOTREADY HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __HI_COMM_REGION_H__ */ + + + diff --git a/device/mpp/include/hi_comm_sns.h b/device/mpp/include/hi_comm_sns.h new file mode 100644 index 0000000..f94e5ca --- /dev/null +++ b/device/mpp/include/hi_comm_sns.h @@ -0,0 +1,321 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_sns.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2011/01/05 + Description : + History : + 1.Date : 2011/01/05 + Author : x00100808 + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_COMM_SNS_H__ +#define __HI_COMM_SNS_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_isp.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef struct hiISP_CMOS_BLACK_LEVEL_S +{ + HI_BOOL bUpdate; + + HI_U16 au16BlackLevel[4]; +} ISP_CMOS_BLACK_LEVEL_S; + + +#define HI_ISP_NR_CALIB_COEF_COL (4) +#define HI_ISP_NR_PARA_LUT_COUNT (6) +#define HI_ISP_NR_ISO_LEVEL_MAX (16) +#define HI_ISP_LSC_LIGHT_NUM (3) +#define RGBIR_MATRIX_NUM (15) + +typedef struct hiISP_NR_CABLI_PARA_S +{ + HI_U8 u8CalicoefRow; + HI_FLOAT (*pCalibcoef)[HI_ISP_NR_CALIB_COEF_COL]; +}ISP_NR_CABLI_PARA_S; + +typedef struct hiISP_NR_ISO_PARA_TABLE_S +{ + + HI_U16 u16Threshold; + HI_U16 u8varStrength; + HI_U16 u8fixStrength; + HI_U8 u8LowFreqSlope; +}ISP_NR_ISO_PARA_TABLE_S; + +typedef struct hiISP_CMOS_NOISE_TABLE_S +{ + /*noise reduction calibration para*/ + ISP_NR_CABLI_PARA_S stNrCaliPara; + /*noise reduction iso para*/ + ISP_NR_ISO_PARA_TABLE_S stIsoParaTable[HI_ISP_NR_ISO_LEVEL_MAX]; +} ISP_CMOS_NOISE_TABLE_S; + +typedef struct hiISP_CMOS_COMPANDER_S +{ + + HI_U32 u32BitDepthIn; + HI_U32 u32BitDepthOut; + HI_U32 u32X0; + HI_U32 u32Y0; + HI_U32 u32X1; + HI_U32 u32Y1; + HI_U32 u32X2; + HI_U32 u32Y2; + HI_U32 u32X3; + HI_U32 u32Y3; + HI_U32 u32Xmax; + HI_U32 u32Ymax; + +}ISP_CMOS_COMPANDER_S; + +typedef struct hiISP_CMOS_DEMOSAIC_S +{ + /*For Demosaic*/ + HI_BOOL bEnable; + HI_U8 u8VhLimit; /* RW,Range: [0x0, 0xFF] */ + HI_U8 u8VhOffset; /* RW,Range: [0x0, 0xFF] */ + HI_U16 u16VhSlope; /* RW,Range: [0x0, 0xFF] */ + /*False Color*/ + HI_BOOL bFcrEnable; + HI_U8 au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]; + /*For Ahd*/ + HI_U16 u16UuSlope; + HI_U16 au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]; +} ISP_CMOS_DEMOSAIC_S; + +#define HI_ISP_SHARPEN_PARA_NUM (3) + +typedef struct hiISP_CMOS_RGBSHARPEN_S +{ + HI_BOOL abEnPixSel[ISP_AUTO_ISO_STENGTH_NUM]; + + HI_U8 au8MaxSharpAmt1[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8MaxEdgeAmt[ISP_AUTO_ISO_STENGTH_NUM]; + + HI_U8 au8SharpThd2[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8EdgeThd2[ISP_AUTO_ISO_STENGTH_NUM]; + + HI_U8 au8OvershootAmt[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8UndershootAmt[ISP_AUTO_ISO_STENGTH_NUM]; +} ISP_CMOS_RGBSHARPEN_S; + +typedef struct hiISP_CMOS_DRC_S +{ + HI_BOOL bEnable; + + HI_U8 u8SpatialVar; + HI_U8 u8RangeVar; + + HI_U8 u8Asymmetry; + HI_U8 u8SecondPole; + HI_U8 u8Stretch; + + HI_U8 u8LocalMixingBrigtht; + HI_U8 u8LocalMixingDark; + HI_U8 u8LocalMixingThres; + + HI_U16 u16DarkGainLmtY; + HI_U16 u16DarkGainLmtC; + HI_U16 u16BrightGainLmt; +} ISP_CMOS_DRC_S; + + +#define GAMMA_FE0_LUT_SIZE 33 +#define GAMMA_FE1_LUT_SIZE 257 +typedef struct hiISP_CMOS_GAMMAFE_S +{ + HI_BOOL bValid; /* wdr sensor should set */ + + HI_U16 au16Gammafe0[GAMMA_FE0_LUT_SIZE]; + HI_U16 au16Gammafe1[GAMMA_FE1_LUT_SIZE]; +} ISP_CMOS_GAMMAFE_S; + +#define CMOS_SHADING_TABLE_NODE_NUMBER_MAX (129) +typedef struct hiISP_CMOS_SHADING_S +{ + HI_BOOL bValid; + + HI_U16 u16RCenterX; + HI_U16 u16RCenterY; + HI_U16 u16GCenterX; + HI_U16 u16GCenterY; + HI_U16 u16BCenterX; + HI_U16 u16BCenterY; + + HI_U16 au16RShadingTbl[CMOS_SHADING_TABLE_NODE_NUMBER_MAX]; + HI_U16 au16GShadingTbl[CMOS_SHADING_TABLE_NODE_NUMBER_MAX]; + HI_U16 au16BShadingTbl[CMOS_SHADING_TABLE_NODE_NUMBER_MAX]; + + HI_U16 u16ROffCenter; + HI_U16 u16GOffCenter; + HI_U16 u16BOffCenter; + + HI_U16 u16TblNodeNum; +} ISP_CMOS_SHADING_S; + +#define GAMMA_NODE_NUMBER 257 +typedef struct hiISP_CMOS_GAMMA_S +{ + HI_BOOL bValid; + + HI_U16 au16Gamma[GAMMA_NODE_NUMBER]; +} ISP_CMOS_GAMMA_S; + +#define HI_ISP_UVNR_SIGMA_PRECISION (1) +typedef struct hiISP_CMOS_UVNR_S +{ + HI_S32 UVNR_lutSigma [ISP_AUTO_ISO_STENGTH_NUM]; + HI_S8 Coring_lutLimit [ISP_AUTO_ISO_STENGTH_NUM]; + HI_S8 UVNR_blendRatio [ISP_AUTO_ISO_STENGTH_NUM]; + +} ISP_CMOS_UVNR_S; + +typedef struct hiISP_CMOS_SENSOR_MAX_RESOLUTION_S +{ + HI_U32 u32MaxWidth; + HI_U32 u32MaxHeight; +}ISP_CMOS_SENSOR_MAX_RESOLUTION_S; + +typedef struct hiISP_CMOS_DPC_S +{ + //HI_U8 u8IRChannel;// 1 yes;0 no + //HI_U8 u8IRPosition;//0:Gb,1:Gr + HI_U16 au16Slope[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U16 au16BlendRatio[ISP_AUTO_ISO_STENGTH_NUM]; +} ISP_CMOS_DPC_S; + +#define HI_ISP_LSC_GRID_POINTS (289) +typedef struct hiISP_LSC_CABLI_TABLE_S +{ + HI_U32 au32R_Gain[HI_ISP_LSC_GRID_POINTS]; + HI_U32 au32Gr_Gain[HI_ISP_LSC_GRID_POINTS]; + HI_U32 au32Gb_Gain[HI_ISP_LSC_GRID_POINTS]; + HI_U32 au32B_Gain[HI_ISP_LSC_GRID_POINTS]; +}ISP_LSC_CABLI_TABLE_S; + +typedef struct hiISP_CMOS_LSC_S +{ + ISP_LSC_CABLI_TABLE_S stLscParaTable[HI_ISP_LSC_LIGHT_NUM]; +}ISP_CMOS_LSC_S; + +typedef enum hiISP_CMOS_IRPOS_TYPE_E +{ + ISP_CMOS_IRPOS_TYPE_GR = 0x0, + ISP_CMOS_IRPOS_TYPE_GB, + ISP_CMOS_IRPOS_TYPE_BUTT +}ISP_CMOS_IRPOS_TYPE_E; + +typedef enum hiISP_CMOS_OP_TYPE_E +{ + OP_CMOS_TYPE_AUTO = 0, + OP_CMOS_TYPE_MANUAL = 1, + OP_CMOS_TYPE_BUTT +} ISP_CMOS_OP_TYPE_E; + +typedef struct hiISP_CMOS_RGBIR_ATTR_S +{ + HI_BOOL bEnable; /*RW, Range: [false, true] Rgbir moudle enable */ + ISP_CMOS_IRPOS_TYPE_E enIrPosType; /*RW, Range: [0, 1] Rgbir moudle ir position: 0 Gr, 1 Gb */ + HI_U16 u16OverExpThresh; /*RW, Range: [0,4095] Rgbir moudle over exposure threshold*/ +}ISP_CMOS_RGBIR_ATTR_S; + +typedef struct hiISP_CMOS_RGBIR_CTRL_S +{ + HI_BOOL bIrOutEn; /*RW, Range: [false, true] Rgbir moudle output ir image enable */ + HI_BOOL bIrFilterEn; /*RW, Range: [false, true] Rgbir moudle noise filter enable */ + HI_BOOL bRemovelEn; /*RW, Range: [false, true] Rgbir moudle removel ir enable */ + ISP_CMOS_OP_TYPE_E enCompType; /*RW, Range: [false, true] Rgbir moudle after removel ir, compensation type 0:auto,1:manul */ + HI_U16 u16ManuGain; /*RW, Range: [256,1023] Rgbir moudle after removel ir, manul-compensation gain,2bit integer,8bit decimal */ + HI_S16 as16ScaleCoef[RGBIR_MATRIX_NUM]; /*RW, Range: [-512,511] Rgbir moudle removel ir translate matrix,bit9:signed bit,bit8:integer bit,bit7_0:decimal bit*/ +}ISP_CMOS_RGBIR_CTRL_S; + +typedef struct hiISP_CMOS_RGBIR_S +{ + HI_BOOL bValid; /* if bValid is false, below paramter is not setted in xxx_cmos.c*/ + ISP_CMOS_RGBIR_ATTR_S stRgbirAttr; + ISP_CMOS_RGBIR_CTRL_S stRgbirCtrl; +}ISP_CMOS_RGBIR_S; + +typedef struct hiISP_CMOS_GE_S +{ + HI_BOOL bEnable; + HI_U8 u8Slope; + HI_U8 u8Sensitivity; + HI_U16 u16Threshold; + HI_U16 u16SensiThreshold; + HI_U16 au16Strength[ISP_AUTO_ISO_STENGTH_NUM]; +}ISP_CMOS_GE_S; + + +typedef struct hiISP_CMOS_DEFAULT_S +{ + ISP_CMOS_DRC_S stDrc; + ISP_CMOS_NOISE_TABLE_S stNoiseTbl; + ISP_CMOS_DEMOSAIC_S stDemosaic; + ISP_CMOS_GAMMAFE_S stGammafe; + ISP_CMOS_GAMMA_S stGamma; + ISP_CMOS_RGBSHARPEN_S stRgbSharpen; + ISP_CMOS_UVNR_S stUvnr; + ISP_CMOS_DPC_S stDpc; + ISP_CMOS_LSC_S stLsc; + ISP_CMOS_RGBIR_S stRgbir; + ISP_CMOS_GE_S stGe; + ISP_CMOS_COMPANDER_S stCompander; + + ISP_CMOS_SENSOR_MAX_RESOLUTION_S stSensorMaxResolution; +} ISP_CMOS_DEFAULT_S; + +typedef struct hiISP_CMOS_SENSOR_IMAGE_MODE_S +{ + HI_U16 u16Width; + HI_U16 u16Height; + HI_FLOAT f32Fps; +}ISP_CMOS_SENSOR_IMAGE_MODE_S; + +typedef struct hiISP_SENSOR_EXP_FUNC_S +{ + HI_VOID(*pfn_cmos_sensor_init)(HI_VOID); + HI_VOID(*pfn_cmos_sensor_exit)(HI_VOID); + HI_VOID(*pfn_cmos_sensor_global_init)(HI_VOID); + HI_S32(*pfn_cmos_set_image_mode)(ISP_CMOS_SENSOR_IMAGE_MODE_S *pstSensorImageMode); + HI_VOID(*pfn_cmos_set_wdr_mode)(HI_U8 u8Mode); + + /* the algs get data which is associated with sensor, except 3a */ + HI_U32(*pfn_cmos_get_isp_default)(ISP_CMOS_DEFAULT_S *pstDef); + HI_U32(*pfn_cmos_get_isp_black_level)(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel); + HI_U32(*pfn_cmos_get_sns_reg_info)(ISP_SNS_REGS_INFO_S *pstSnsRegsInfo); + + /* the function of sensor set pixel detect */ + HI_VOID(*pfn_cmos_set_pixel_detect)(HI_BOOL bEnable); +} ISP_SENSOR_EXP_FUNC_S; + +typedef struct hiISP_SENSOR_REGISTER_S +{ + ISP_SENSOR_EXP_FUNC_S stSnsExp; +} ISP_SENSOR_REGISTER_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__HI_COMM_SNS_H__ */ + diff --git a/device/mpp/include/hi_comm_sys.h b/device/mpp/include/hi_comm_sys.h new file mode 100644 index 0000000..0111edd --- /dev/null +++ b/device/mpp/include/hi_comm_sys.h @@ -0,0 +1,75 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi3511_sys.h +Version : Initial Draft +Author : Hi3511 MPP Team +Created : 2007/1/30 +Last Modified : +Description : Hi3511 chip specific configure data structure +Function List : +History : + 1.Date : 2007/1/30 + Author : c42025 + Modification: Created file + + 2.Date : 2007/11/30 + Author : c42025 + Modification: modify according review comments + + 3.Date : 2008/03/03 + Author : c42025 + Modification: modify HI_TRACE_SYS + + 4.Date : 2008/03/05 + Author : c42025 + Modification: modify 'HI_LOG_LEVEL_ERROR' to 'EN_ERR_LEVEL_ERROR' + +******************************************************************************/ +#ifndef __HI_COMM_SYS_H__ +#define __HI_COMM_SYS_H__ + +#include "hi_type.h" +#include "hi_errno.h" +#include "hi_debug.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +#define HI_TRACE_SYS(level, fmt...) HI_TRACE(level, HI_ID_SYS,##fmt) +typedef struct hiMPP_SYS_CONF_S +{ + /* stride of picture buffer must be aligned with this value. + * you can choose a value from 1 to 1024, and it must be multiple of 16. + */ + HI_U32 u32AlignWidth; + +} MPP_SYS_CONF_S; + +typedef struct hiSYS_VIRMEM_INFO_S +{ + HI_U32 u32PhyAddr; + HI_BOOL bCached; +} SYS_VIRMEM_INFO_S; + + +#define HI_ERR_SYS_NULL_PTR HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_SYS_NOTREADY HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_SYS_NOT_PERM HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +#define HI_ERR_SYS_NOMEM HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_SYS_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_SYS_BUSY HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_SYS_NOT_SUPPORT HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_SYS_H__ */ + diff --git a/device/mpp/include/hi_comm_vb.h b/device/mpp/include/hi_comm_vb.h new file mode 100644 index 0000000..26e02d9 --- /dev/null +++ b/device/mpp/include/hi_comm_vb.h @@ -0,0 +1,150 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_common.h +Version : Initial Draft +Author : Hi3511 MPP Team +Created : 2006/11/09 +Last Modified : +Description : The common data type defination for VB module. +Function List : +History : + 1.Date : 2006/11/03 + Author : c42025 + Modification: Created file + + 2.Date : 2007/11/30 + Author : c42025 + Modification: modify according review comments + + 3.Date : 2008/06/18 + Author : c42025 + Modification: add VB_UID_PCIV + + 4.Date : 2008/10/31 + Author : z44949 + Modification : Translate the chinese comment + + 5.Date : 2008/10/31 + Author : p00123320 + Modification : change commentary of u32MaxPoolCnt in VB_CONF_S +******************************************************************************/ +#ifndef __HI_COMM_VB_H__ +#define __HI_COMM_VB_H__ + +#include "hi_type.h" +#include "hi_errno.h" +#include "hi_debug.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define VB_MAX_POOLS 256 +#define VB_MAX_COMM_POOLS 16 +#define VB_MAX_MOD_COMM_POOLS 16 + + +/* user ID for VB */ +#define VB_MAX_USER 23 + +typedef enum hiVB_UID_E +{ + VB_UID_VIU = 0, + VB_UID_VOU = 1, + VB_UID_VGS = 2, + VB_UID_VENC = 3, + VB_UID_VDEC = 4, + VB_UID_VDA = 5, + VB_UID_H264E = 6, + VB_UID_JPEGE = 7, + VB_UID_MPEG4E = 8, + VB_UID_H264D = 9, + VB_UID_JPEGD = 10, + VB_UID_MPEG4D = 11, + VB_UID_VPSS = 12, + VB_UID_GRP = 13, + VB_UID_MPI = 14, + VB_UID_PCIV = 15, + VB_UID_AI = 16, + VB_UID_AENC = 17, + VB_UID_RC = 18, + VB_UID_VFMW = 19, + VB_UID_USER = 20, + VB_UID_H265E = 21, + VB_UID_FISHEYE = 22, + VB_UID_BUTT + +} VB_UID_E; + +#define VB_INVALID_POOLID (-1UL) +#define VB_INVALID_HANDLE (-1UL) + +/* Generall common pool use this owner id, module common pool use VB_UID as owner id */ +#define POOL_OWNER_COMMON -1 + +/* Private pool use this owner id */ +#define POOL_OWNER_PRIVATE -2 + +typedef enum hiPOOL_TYPE_E +{ + POOL_TYPE_COMMON = 0, + POOL_TYPE_PRIVATE = 1, + POOL_TYPE_MODULE_COMMON = 2, + POOL_TYPE_BUTT +} POOL_TYPE_E; + +typedef HI_U32 VB_POOL; +typedef HI_U32 VB_BLK; + +#define RESERVE_MMZ_NAME "window" + +typedef struct hiVB_CONF_S +{ + HI_U32 u32MaxPoolCnt; /* max count of pools, (0,VB_MAX_POOLS] */ + struct hiVB_CPOOL_S + { + HI_U32 u32BlkSize; + HI_U32 u32BlkCnt; + HI_CHAR acMmzName[MAX_MMZ_NAME_LEN]; + }astCommPool[VB_MAX_COMM_POOLS]; +} VB_CONF_S; + +typedef struct hiVB_POOL_STATUS_S +{ + HI_U32 bIsCommPool; + HI_U32 u32BlkCnt; + HI_U32 u32FreeBlkCnt; +}VB_POOL_STATUS_S; + +#define VB_SUPPLEMENT_JPEG_MASK 0x1 + +typedef struct hiVB_SUPPLEMENT_CONF_S +{ + HI_U32 u32SupplementConf; +}VB_SUPPLEMENT_CONF_S; + + +#define HI_ERR_VB_NULL_PTR HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VB_NOMEM HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_VB_NOBUF HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +#define HI_ERR_VB_UNEXIST HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +#define HI_ERR_VB_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VB_NOTREADY HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VB_BUSY HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_VB_NOT_PERM HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) + +#define HI_ERR_VB_2MPOOLS HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_BUTT + 1) + +#define HI_TRACE_VB(level,fmt...) HI_TRACE(level, HI_ID_VB,##fmt) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_VB_H_ */ + diff --git a/device/mpp/include/hi_comm_vda.h b/device/mpp/include/hi_comm_vda.h new file mode 100644 index 0000000..c9a1999 --- /dev/null +++ b/device/mpp/include/hi_comm_vda.h @@ -0,0 +1,288 @@ +/****************************************************************************** +* +* Copyright (C), 2001-2011, Huawei Tech. Co., Ltd. +* +******************************************************************************* +* File Name : hi_comm_vda.h +* Version : Initial Draft +* Author : j00169368,l64467 +* Created : 2011/1/7 +* Last Modified : +* Description : include VDA struct , Marco and Error information +* Function List : +* +* +* History: +* +* 1. Date : 2011/1/7 +* Author : j00169368,l64467 +* Modification : Created file +* +******************************************************************************/ + +#ifndef __HI_COMM_VDA_H__ +#define __HI_COMM_VDA_H__ + +#include "hi_type.h" +#include "hi_debug.h" +#include "hi_comm_video.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_defines.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +/*Motion Region Data*/ +typedef struct hiVDA_OBJ_S +{ + HI_U16 u16Left; + HI_U16 u16Top; + HI_U16 u16Right; + HI_U16 u16Bottom; +}VDA_OBJ_S; + +/*reference pictrue mode*/ +typedef enum hiVDA_REF_MODE_E +{ + VDA_REF_MODE_DYNAMIC = 0, /*reference pictrue dynamic*/ + VDA_REF_MODE_STATIC, /*reference pictrue static*/ + VDA_REF_MODE_USER, /*reference pictrue user*/ + VDA_REF_MODE_BUTT /*reserve*/ +}VDA_REF_MODE_E; + +/*VDA algorithm*/ +typedef enum hiVDA_ALG_E +{ + VDA_ALG_BG = 0, /*base on background pictrue*/ + VDA_ALG_REF, /*base on reference pictrue*/ + VDA_ALG_BUTT +}VDA_ALG_E; + +/*MB size*/ +typedef enum hiVDA_MB_SIZE_E +{ + VDA_MB_8PIXEL, /* 8*8 */ + VDA_MB_16PIXEL, /* 16*16 */ + VDA_MB_BUTT +}VDA_MB_SIZE_E; + +/*SAD bits*/ +typedef enum hiVDA_MB_SADBITS_E +{ + VDA_MB_SAD_8BIT = 0, /*SAD precision 8bits*/ + VDA_MB_SAD_16BIT, /*SAD precision 16bits*/ + VDA_MB_SAD_BUTT /*reserve*/ +} VDA_MB_SADBITS_E; + + +/*OD region attribute*/ +typedef struct hiVDA_OD_RGN_ATTR_S +{ + /*static attribute*/ + RECT_S stRect; /*region rect + *X:[0,VDA_MAX_WIDTH),align:16 + *Y:[0,VDA_MAX_HEIGHT) + *W:[16,VDA_MAX_WIDTH],align:16 + *H:[16,VDA_MAX_HEIGHT],align:16 + *X+W <= chunnel wight + *Y+H <= chunnel height + */ + + /*dynamic attribute*/ + HI_U32 u32SadTh; /*SAD threshold,range:[0,4080]*/ + HI_U32 u32AreaTh; /*alarm area threshold,range:[0,100]*/ + HI_U32 u32OccCntTh; /*alarm frame count threshold,range:[1,256]*/ + HI_U32 u32UnOccCntTh; /*The max uncover count,range:[0,256]*/ +}VDA_OD_RGN_ATTR_S; + +/*MD attribute*/ +typedef struct hiVDA_MD_ATTR_S +{ + /*static attribute*/ + VDA_ALG_E enVdaAlg; /*arithmetic*/ + VDA_MB_SIZE_E enMbSize; /*MB size*/ + VDA_MB_SADBITS_E enMbSadBits; /*MB SAD size*/ + VDA_REF_MODE_E enRefMode; /*reference picture mode*/ + HI_U32 u32MdBufNum; /*Result buffer number,range:[1,16]*/ + + /*dynamic attribute*/ + HI_U32 u32VdaIntvl; /*VDA interval,range:[0,256]*/ + + HI_U32 u32BgUpSrcWgt; /*the source picture weight, + *back ground updata totle weight 256, + *range:[1,255],recommendatory value:128 + */ + + HI_U32 u32SadTh; /*SAD threshold,range:[0,4080],recommendatory value:100*/ + HI_U32 u32ObjNumMax; /*max OBJ number,range:[1,128]*/ +}VDA_MD_ATTR_S; + + +#define VDA_OD_RGN_NUM_MAX 4 + +/*OD attribute*/ +typedef struct hiVDA_OD_ATTR_S +{ + HI_U32 u32RgnNum; /*region number*/ + VDA_OD_RGN_ATTR_S astOdRgnAttr[VDA_OD_RGN_NUM_MAX]; /*region attribute*/ + + /*static attribute*/ + VDA_ALG_E enVdaAlg; /*arithmetic*/ + VDA_MB_SIZE_E enMbSize; /*MB size*/ + VDA_MB_SADBITS_E enMbSadBits; /*MB SAD size*/ + VDA_REF_MODE_E enRefMode; /*reference picture mode*/ + + /*dynamic attribute*/ + HI_U32 u32VdaIntvl; /*VDA interval,[0,256]*/ + HI_U32 u32BgUpSrcWgt; /*back ground updata totle weight 256,the source picture weight,[1,255]*/ + + +}VDA_OD_ATTR_S; + + +/*work mode*/ +typedef enum hiVDA_WORK_MODE_E +{ + VDA_WORK_MODE_MD = 0, /*motion detection*/ + VDA_WORK_MODE_OD, /*Occlusion detection*/ + VDA_WORK_MODE_BUTT +}VDA_WORK_MODE_E; + + +/*work mode attribute*/ +typedef union hiVDA_WORK_MODE_ATTR_U +{ + VDA_MD_ATTR_S stMdAttr; /*MD attribute*/ + VDA_OD_ATTR_S stOdAttr; /*OD attribute*/ +}VDA_WORK_MODE_ATTR_U; + + +/*VDA CHN attribute*/ +typedef struct hiVDA_CHN_ATTR_S +{ + VDA_WORK_MODE_E enWorkMode; /*work mode*/ + VDA_WORK_MODE_ATTR_U unAttr; /*work mode attribute*/ + HI_U32 u32Width; /*the width of CHNL,[16,VDA_MAX_WIDTH]*/ + HI_U32 u32Height; /*the height of CHNL,[16,VDA_MAX_HEIGHT]*/ +}VDA_CHN_ATTR_S; + + +/*MB SAD data*/ +typedef struct hiVDA_MB_SAD_DATA_S +{ + HI_VOID *pAddr; /*address*/ + HI_U32 u32Stride; /*stride*/ + VDA_MB_SADBITS_E enMbSadBits; /*the MB SAD size*/ +}VDA_MB_SAD_DATA_S; + +/*OBJ data*/ +typedef struct hiVDA_OBJ_DATA_S +{ + HI_U32 u32ObjNum; /*OBJ number*/ + VDA_OBJ_S *pstAddr; /*OBJ data address*/ + + HI_U32 u32IndexOfMaxObj; /*index of max OBJ*/ + HI_U32 u32SizeOfMaxObj; /*size of max OBJ*/ + HI_U32 u32SizeOfTotalObj; /*total size of all OBJ*/ +}VDA_OBJ_DATA_S; + + +/*MD data*/ +typedef struct hiVDA_MD_DATA_S +{ + HI_BOOL bMbSadValid; /*SAD data is valid?*/ + VDA_MB_SAD_DATA_S stMbSadData; /*MB SAD data*/ + + HI_BOOL bObjValid; /*OBJ data is valid?*/ + VDA_OBJ_DATA_S stObjData; /*OBJ data*/ + + HI_BOOL bPelsNumValid; /*alarm pixel number data is valid?*/ + HI_U32 u32AlarmPixCnt;/*motion pix of picture*/ +}VDA_MD_DATA_S; + + +/*OD data*/ +typedef struct hiVDA_OD_DATA_S +{ + HI_U32 u32RgnNum; /*region number*/ + HI_BOOL abRgnAlarm[VDA_OD_RGN_NUM_MAX]; /*HI_TRUE:alarm*/ +}VDA_OD_DATA_S; + + + +typedef union hiVDA_DATA_U +{ + VDA_MD_DATA_S stMdData; /*MD data*/ + VDA_OD_DATA_S stOdData; /*OD data*/ +}VDA_DATA_U; + + +/*VDA data*/ +typedef struct hiVDA_DATA_S +{ + VDA_WORK_MODE_E enWorkMode; /*work mode*/ + VDA_DATA_U unData; /*VDA data*/ + VDA_MB_SIZE_E enMbSize; /*MB size*/ + HI_U32 u32MbWidth; /*VDA channle width in MB*/ + HI_U32 u32MbHeight; /*VDA channle height in MB*/ + HI_U64 u64Pts; /*time*/ +}VDA_DATA_S; + + +/*chnnel state*/ +typedef struct hiVDA_CHN_STAT_S +{ + HI_BOOL bStartRecvPic; /*start receive picture*/ + HI_U32 u32LeftPic; /*left picture*/ + HI_U32 u32LeftRst; /*left data*/ +}VDA_CHN_STAT_S; + +/* invlalid device ID */ +#define HI_ERR_VDA_INVALID_DEVID HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_VDA_INVALID_CHNID HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_VDA_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_VDA_EXIST HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*UN exist*/ +#define HI_ERR_VDA_UNEXIST HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_VDA_NULL_PTR HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_VDA_NOT_CONFIG HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_VDA_NOT_SUPPORT HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_VDA_NOT_PERM HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_VDA_NOMEM HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_VDA_NOBUF HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_VDA_BUF_EMPTY HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_VDA_BUF_FULL HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* bad address, eg. used for copy_from_user & copy_to_user */ +#define HI_ERR_VDA_BADADDR HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) +/* resource is busy, eg. destroy a venc chn without unregistering it */ +#define HI_ERR_VDA_BUSY HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/* System is not ready,maybe not initialed or loaded. + * Returning the error code when opening a device file failed. + */ +#define HI_ERR_VDA_NOTREADY HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + + +#endif /* End of #ifndef __HI_COMM_VDA_H__ */ diff --git a/device/mpp/include/hi_comm_vdec.h b/device/mpp/include/hi_comm_vdec.h new file mode 100644 index 0000000..833cbbf --- /dev/null +++ b/device/mpp/include/hi_comm_vdec.h @@ -0,0 +1,256 @@ +/****************************************************************************** + + Copyright (C), 2013, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_vdec.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/08 + Description : Common Def Of video decode + History : + 1.Date : 2013/05/08 + Author : l00226816 + Modification: Created file +******************************************************************************/ + + +#ifndef __HI_COMM_VDEC_H__ +#define __HI_COMM_VDEC_H__ +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" +#include "hi_defines.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/*vdec channel attr(user interface)*/ + +#define HI_IO_BLOCK HI_TRUE +#define HI_IO_NOBLOCK HI_FALSE + + +typedef struct hiVDEC_CHN_LUM_S +{ + HI_U64 u64LumPixSum; /* Luma sum of current frame */ + HI_U32 u32LumPixAverage; /* Luma average of current frame */ + HI_U64 u64Pts; /* PTS of current frame ?? */ +} VDEC_CHN_LUM_S; + + +typedef enum hiVIDEO_MODE_E +{ + VIDEO_MODE_STREAM = 0, /*send by stream*/ + VIDEO_MODE_FRAME , /*send by frame*/ + VIDEO_MODE_BUTT +}VIDEO_MODE_E; + + +typedef struct hiVDEC_ATTR_JPEG_S +{ + VIDEO_MODE_E enMode; /* video stream mode select */ +}VDEC_ATTR_JPEG_S,*PTR_VDEC_ATTR_JPEG_S; + + +typedef struct hiVDEC_ATTR_VIDEO_S +{ + HI_U32 u32RefFrameNum; /*ref pic num [1,16]*/ + VIDEO_MODE_E enMode; /*send by stream or by frame*/ + HI_S32 s32SupportBFrame; /*enable chnl to support BFrame decode, 0: disable support BFrame decode,1: enable support BFrame*/ +}VDEC_ATTR_VIDEO_S,*PTR_VDEC_ATTR_VIDEO_S; + + +typedef struct hiVDEC_CHN_ATTR_S +{ + PAYLOAD_TYPE_E enType; /* video type to be decoded */ + HI_U32 u32BufSize ; /* stream buf size(Byte) */ + HI_U32 u32Priority ; /* priority */ + HI_U32 u32PicWidth ; /* max pic width */ + HI_U32 u32PicHeight ; /* max pic height */ + union + { + VDEC_ATTR_JPEG_S stVdecJpegAttr; /* structure with jpeg or mjpeg type */ + VDEC_ATTR_VIDEO_S stVdecVideoAttr; /* structure with video ( h264/mpeg4) */ + }; +}VDEC_CHN_ATTR_S; + + +typedef struct hiVDEC_STREAM_S +{ + HI_U8* pu8Addr; /* stream address */ + HI_U32 u32Len; /* stream len */ + HI_U64 u64PTS; /* time stamp */ + HI_BOOL bEndOfFrame; /* is the end of a frame */ + HI_BOOL bEndOfStream; /* is the end of all stream */ +}VDEC_STREAM_S; + +typedef struct hiVDEC_USERDATA_S{ + HI_U8* pu8Addr; /* userdata data vir address */ + HI_U32 u32PhyAddr; /* userdata data phy address */ + HI_U32 u32Len; /* userdata data len */ + HI_BOOL bValid; /* is valid? */ +}VDEC_USERDATA_S; + + +typedef struct hi_VDEC_DECODE_ERROR_S +{ + HI_S32 s32FormatErr; /* format error. eg: do not support filed */ + HI_S32 s32PicSizeErrSet; /* picture width or height is larger than chnnel width or height*/ + HI_S32 s32StreamUnsprt; /* unsupport the stream specification */ + HI_S32 s32PackErr; /* stream package error */ + HI_S32 s32PrtclNumErrSet; /* protocol num is not enough. eg: slice, pps, sps */ + HI_S32 s32RefErrSet; /* refrence num is not enough */ + HI_S32 s32PicBufSizeErrSet; /* the buffer size of picture is not enough */ +}VDEC_DECODE_ERROR_S; + + +typedef struct hiVDEC_CHN_STAT_S +{ + PAYLOAD_TYPE_E enType; /* video type to be decoded */ + HI_U32 u32LeftStreamBytes; /* left stream bytes waiting for decode */ + HI_U32 u32LeftStreamFrames; /* left frames waiting for decode,only valid for H264D_MODE_FRAME */ + HI_U32 u32LeftPics; /* pics waiting for output */ + HI_BOOL bStartRecvStream; /* had started recv stream? */ + HI_U32 u32RecvStreamFrames; /* how many frames of stream has been received. valid when send by frame. */ + HI_U32 u32DecodeStreamFrames; /* how many frames of stream has been decoded. valid when send by frame. */ + VDEC_DECODE_ERROR_S stVdecDecErr; /* information about decode error */ +}VDEC_CHN_STAT_S; + +/* + * static parameter: must set after stop sending stream and all stream is decoded. + * dynamic parameter: can be set at any time. + */ +typedef struct hiVDEC_CHN_PARAM_S +{ + HI_S32 s32ChanErrThr; /* threshold for stream error process, 0: discard with any error, 100 : keep data with any error */ + HI_S32 s32ChanStrmOFThr; /* threshold for stream overflow, 0~ , 0: nothing to do when stream is overflow */ + HI_S32 s32DecMode; /* decode mode , 0: deocde IPB frames, 1: only decode I frame & P frame , 2: only decode I frame */ + HI_S32 s32DecOrderOutput; /* frames output order ,0: the same with display order , 1: the same width decoder order */ + VIDEO_FORMAT_E enVideoFormat; + COMPRESS_MODE_E enCompressMode; +}VDEC_CHN_PARAM_S; + +typedef struct hiVDEC_PRTCL_PARAM_S +{ + HI_S32 s32MaxSliceNum; /* max slice num support */ + HI_S32 s32MaxSpsNum; /* max sps num support */ + HI_S32 s32MaxPpsNum; /* max pps num support */ + HI_S32 s32DisplayFrameNum; /* display frame num */ +}VDEC_PRTCL_PARAM_S; + + +//structure & varibale for jpegd decoder lib +/*********************************************************************************************************/ +/* stream packet for jpeg */ +typedef struct hiJPEGD_STREAM_PACKET_S +{ + HI_U32 PhyAddr[2]; + HI_VOID* VirAddr[2]; + HI_U32 Length[2]; + HI_U64 Pts; + HI_U32 Index; + +} USR_STREAM_PACKET_S; + +/* description structure for memory record */ +typedef struct hiUSR_MEM_DESC_S +{ + HI_U32 u32PhyAddr; + HI_U32 u32Length; +} USR_MEM_DESC_S; + +typedef enum hiJPEGD_DECODE_ERROR_E +{ + JPEGD_ERR_NONE = 0, + JPEGD_ERR_STREAM, + JPEGD_ERR_PIC_SIZE, + JPEGD_ERR_PICBUF_SIZE, + JPEGD_ERR_FORMAT, + VIDEO_ERR_BULL +}JPEGD_DECODE_ERROR_E; + + +typedef enum hiVDEC_JPG_COLOR_FMT_E +{ + JPG_COLOR_FMT_YCBCR400, /*YUV400*/ + JPG_COLOR_FMT_YCBCR420 = 3, /*YUV420*/ + JPG_COLOR_FMT_YCBCR422BHP, /*YUV 422 2x1*/ + JPG_COLOR_FMT_YCBCR422BVP, /*YUV 422 1x2*/ + JPG_COLOR_FMT_YCBCR444, /*YUV 444*/ + JPG_COLOR_FMT_BUTT +} VDEC_JPG_COLOR_FMT_E; + +typedef struct +{ + VDEC_JPG_COLOR_FMT_E enFmt; /* YUV format */ + + HI_S32 s32IsFrameValid; + HI_U64 u64LuPixSum; + HI_U64 Pts; + HI_S32 s32IsSemiPlanar; + + HI_S32 s32YWidth; + HI_S32 s32YHeight; + + HI_S32 s32LumaPhyAddr; + HI_S32 s32LumaStride; + + HI_S32 s32CbPhyAddr; /* semi-planar: this variable is PhyAddr of interlaced chroma; planar: this variable is PhyAddr of Cb */ + HI_S32 s32CrPhyAddr; /* semi-planar: this variable is not value ; planar: this variable is PhyAddr of Cr */ + HI_S32 s32ChromStride; + HI_S32 s32ChromCrStride; +} VDEC_FRAME_DESC_S; + +/************************************************************************************************************************/ + +/* invlalid channel ID */ +#define HI_ERR_VDEC_INVALID_CHNID HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_VDEC_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_VDEC_EXIST HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* using a NULL point */ +#define HI_ERR_VDEC_NULL_PTR HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_VDEC_NOT_CONFIG HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_VDEC_NOT_SURPPORT HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_VDEC_NOT_PERM HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* the channle is not existed */ +#define HI_ERR_VDEC_UNEXIST HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* failure caused by malloc memory */ +#define HI_ERR_VDEC_NOMEM HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_VDEC_NOBUF HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_VDEC_BUF_EMPTY HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_VDEC_BUF_FULL HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_VDEC_SYS_NOTREADY HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/*system busy*/ +#define HI_ERR_VDEC_BUSY HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/* bad address, eg. used for copy_from_user & copy_to_user */ +#define HI_ERR_VDEC_BADADDR HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) + + + + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_VDEC_H__ */ + diff --git a/device/mpp/include/hi_comm_venc.h b/device/mpp/include/hi_comm_venc.h new file mode 100644 index 0000000..a5dd370 --- /dev/null +++ b/device/mpp/include/hi_comm_venc.h @@ -0,0 +1,696 @@ +/****************************************************************************** + + Copyright (C), 2001-2012, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_venc.h + Version : + Author : Hisilicon Hi35xx MPP Team + Created : 2006/11/24 + Last Modified : + Description : common struct definition for VENC + Function List : + History : +******************************************************************************/ +#ifndef __HI_COMM_VENC_H__ +#define __HI_COMM_VENC_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" +#include "hi_comm_rc.h" + + + +/* invlalid channel ID */ +#define HI_ERR_VENC_INVALID_CHNID HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_VENC_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_VENC_EXIST HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* channel exists */ +#define HI_ERR_VENC_UNEXIST HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_VENC_NULL_PTR HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_VENC_NOT_CONFIG HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_VENC_NOT_SUPPORT HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_VENC_NOT_PERM HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_VENC_NOMEM HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_VENC_NOBUF HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_VENC_BUF_EMPTY HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_VENC_BUF_FULL HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_VENC_SYS_NOTREADY HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/* system is busy*/ +#define HI_ERR_VENC_BUSY HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + + +/*the nalu type of H264E*/ +typedef enum hiH264E_NALU_TYPE_E +{ + H264E_NALU_PSLICE = 1, /*PSLICE types*/ + H264E_NALU_ISLICE = 5, /*ISLICE types*/ + H264E_NALU_SEI = 6, /*SEI types*/ + H264E_NALU_SPS = 7, /*SPS types*/ + H264E_NALU_PPS = 8, /*PPS types*/ + H264E_NALU_IPSLICE = 9, + H264E_NALU_BUTT +} H264E_NALU_TYPE_E; + +/*the nalu type of H265E*/ +typedef enum hiH265E_NALU_TYPE_E +{ + H265E_NALU_PSLICE = 1, /*P SLICE types*/ + H265E_NALU_ISLICE = 19, /*I SLICE types*/ + H265E_NALU_VPS = 32, /*VPS types*/ + H265E_NALU_SPS = 33, /*SPS types*/ + H265E_NALU_PPS = 34, /*PPS types*/ + H265E_NALU_SEI = 39, /*SEI types*/ + + H265E_NALU_BUTT +} H265E_NALU_TYPE_E; + +/*the reference type of H264E slice*/ +typedef enum hiH264E_REFSLICE_TYPE_E +{ + H264E_REFSLICE_FOR_1X = 1, /*Reference slice for H264E_REF_MODE_1X*/ + H264E_REFSLICE_FOR_2X = 2, /*Reference slice for H264E_REF_MODE_2X*/ + H264E_REFSLICE_FOR_4X = 5, /*Reference slice for H264E_REF_MODE_4X*/ + H264E_REFSLICE_FOR_BUTT /* slice not for reference*/ +} H264E_REFSLICE_TYPE_E; + +/*the pack type of JPEGE*/ +typedef enum hiJPEGE_PACK_TYPE_E +{ + JPEGE_PACK_ECS = 5, /*ECS types*/ + JPEGE_PACK_APP = 6, /*APP types*/ + JPEGE_PACK_VDO = 7, /*VDO types*/ + JPEGE_PACK_PIC = 8, /*PIC types*/ + JPEGE_PACK_BUTT +} JPEGE_PACK_TYPE_E; + +/*the pack type of MPEG4*/ +typedef enum hiMPEG4E_PACK_TYPE_E +{ + MPEG4E_PACK_VOP_P = 1, /*P VOP packet types*/ + MPEG4E_PACK_VOP_I = 5, /*I VOP packet types*/ + MPEG4E_PACK_VOS = 6, /*VOS types*/ + MPEG4E_PACK_VO = 7, /*VO types*/ + MPEG4E_PACK_VOL = 8, /*VOL types*/ + MPEG4E_PACK_GVOP = 9 /*GROUP of vop types */ +} MPEG4E_PACK_TYPE_E; + +/*the data type of VENC*/ +typedef union hiVENC_DATA_TYPE_U +{ + H264E_NALU_TYPE_E enH264EType; /*H264E NALU types*/ + JPEGE_PACK_TYPE_E enJPEGEType; /*JPEGE pack types*/ + MPEG4E_PACK_TYPE_E enMPEG4EType; /*MPEG4E pack types*/ + H265E_NALU_TYPE_E enH265EType; /*H264E NALU types*/ +}VENC_DATA_TYPE_U; + +typedef struct hiVENC_PACK_INFO_S +{ + VENC_DATA_TYPE_U u32PackType; + HI_U32 u32PackOffset; + HI_U32 u32PackLength; +}VENC_PACK_INFO_S; + + +typedef struct hiVENC_PACK_S +{ + HI_U32 u32PhyAddr; /*the physics address of stream*/ + HI_U8 *pu8Addr; /*the virtual address of stream*/ + HI_U32 u32Len; /*the length of stream*/ + + HI_U64 u64PTS; /*PTS*/ + HI_BOOL bFrameEnd; /*frame end*/ + + VENC_DATA_TYPE_U DataType; /*the type of stream*/ + HI_U32 u32Offset; + + HI_U32 u32DataNum; + VENC_PACK_INFO_S stPackInfo[8]; +}VENC_PACK_S; + +typedef enum hiH264E_REF_TYPE_E +{ + BASE_IDRSLICE = 0, //the Idr frame at Base layer + BASE_PSLICE_REFBYBASE, //the P frame at Base layer, referenced by other frames at Base layer + BASE_PSLICE_REFBYENHANCE, //the P frame at Base layer, referenced by other frames at Enhance layer + ENHANCE_PSLICE_REFBYENHANCE, //the P frame at Enhance layer, referenced by other frames at Enhance layer + ENHANCE_PSLICE_NOTFORREF, //the P frame at Enhance layer ,not referenced + ENHANCE_PSLICE_BUTT +} H264E_REF_TYPE_E; + +typedef enum hiH264E_REF_TYPE_E H265E_REF_TYPE_E; + +typedef struct hiVENC_STREAM_INFO_H264_S +{ + HI_U32 u32PicBytesNum; /* the coded picture stream byte number */ + HI_U32 u32PSkipMbNum; /* the skip macroblock num */ + HI_U32 u32IpcmMbNum; /* the ipcm macroblock num */ + HI_U32 u32Inter16x8MbNum; /* the inter16x8 macroblock num */ + HI_U32 u32Inter16x16MbNum; /* the inter16x16 macroblock num */ + HI_U32 u32Inter8x16MbNum; /* the inter8x16 macroblock num */ + HI_U32 u32Inter8x8MbNum; /* the inter8x8 macroblock num */ + HI_U32 u32Intra16MbNum; /* the intra16x16 macroblock num */ + HI_U32 u32Intra8MbNum; /* the intra8x8 macroblock num */ + HI_U32 u32Intra4MbNum; /* the inter4x4 macroblock num */ + + H264E_REFSLICE_TYPE_E enRefSliceType; /*the reference type of H264E slice*/ + H264E_REF_TYPE_E enRefType; /*Type of encoded frames in advanced frame skipping reference mode*/ + HI_U32 u32UpdateAttrCnt; /*Number of times that channel attributes or parameters (including RC parameters) are set*/ + HI_U32 u32StartQp; /*StartQP Value*/ +}VENC_STREAM_INFO_H264_S; + +typedef struct hiVENC_STREAM_INFO_H265_S +{ + HI_U32 u32PicBytesNum; /* the coded picture stream byte number */ + HI_U32 u32Inter64x64CuNum; /* the num */ + HI_U32 u32Inter32x32CuNum; + HI_U32 u32Inter16x16CuNum; + HI_U32 u32Inter8x8CuNum; + HI_U32 u32Intra32x32CuNum; + HI_U32 u32Intra16x16CuNum; + HI_U32 u32Intra8x8CuNum; + HI_U32 u32Intra4x4CuNum; + H265E_REF_TYPE_E enRefType; /*Type of encoded frames in advanced frame skipping reference mode*/ + HI_U32 u32UpdateAttrCnt; /*Number of times that channel attributes or parameters (including RC parameters) are set*/ + HI_U32 u32StartQp; /*StartQP Value*/ +}VENC_STREAM_INFO_H265_S; + +typedef struct hiVENC_STREAM_INFO_JPEG_S +{ + HI_U32 u32PicBytesNum; /* the coded picture stream byte number */ + HI_U32 u32UpdateAttrCnt; /*Number of times that channel attributes or parameters (including RC parameters) are set*/ + HI_U32 u32Qfactor; /* image quality */ +}VENC_STREAM_INFO_JPEG_S; + +typedef struct hiVENC_STREAM_INFO_MPEG4_S +{ + HI_U32 u32PicBytesNum; /* the coded picture stream byte number */ + HI_U32 u32UpdateAttrCnt; /*Number of times that channel attributes or parameters (including RC parameters) are set*/ +}VENC_STREAM_INFO_MPEG4_S; + +typedef struct hiVENC_STREAM_S +{ + VENC_PACK_S *pstPack; /*stream pack attribute*/ + HI_U32 u32PackCount; /*the pack number of one frame stream*/ + HI_U32 u32Seq; /*the list number of stream*/ + + union + { + VENC_STREAM_INFO_H264_S stH264Info; /*the stream info of h264*/ + VENC_STREAM_INFO_JPEG_S stJpegInfo; /*the stream info of jpeg*/ + VENC_STREAM_INFO_MPEG4_S stMpeg4Info; /*the stream info of mpeg4*/ + VENC_STREAM_INFO_H265_S stH265Info; /*the stream info of h265*/ + }; +}VENC_STREAM_S; + +typedef struct hiVENC_ATTR_H264_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + + HI_U32 u32BufSize; /*stream buffer size*/ + HI_U32 u32Profile; /*0: baseline; 1:MP; 2:HP; 3: SVC-T [0,3]; */ + HI_BOOL bByFrame; /*get stream mode is slice mode or frame mode*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ + + HI_U32 u32BFrameNum; /* 0: not support B frame; >=1: number of B frames */ + HI_U32 u32RefNum; /* 0: default; number of refrence frame*/ + +}VENC_ATTR_H264_S; + +typedef struct hiVENC_ATTR_H265_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + + HI_U32 u32BufSize; /*stream buffer size*/ + HI_U32 u32Profile; /*0: MP */ + HI_BOOL bByFrame; /*get stream mode is slice mode or frame mode*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ + + HI_U32 u32BFrameNum; /* 0: not support B frame; >=1: number of B frames */ + HI_U32 u32RefNum; /* 0: default; number of refrence frame*/ +}VENC_ATTR_H265_S; + +typedef struct hiVENC_ATTR_MJPEG_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + HI_U32 u32BufSize; /*stream buffer size*/ + HI_BOOL bByFrame; /*get stream mode is field mode or frame mode*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ + +}VENC_ATTR_MJPEG_S; + +typedef struct hiVENC_ATTR_JPEG_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + HI_U32 u32BufSize; /*stream buffer size*/ + HI_BOOL bByFrame; /*get stream mode is field mode or frame mode*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ + HI_BOOL bSupportDCF; /*support dcf*/ + +}VENC_ATTR_JPEG_S; + +/* attribute of MPEG4*/ +typedef struct hiVENC_ATTR_MPEG4_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + + HI_U32 u32BufSize; /*buffer size*/ + HI_BOOL bByFrame; /*get stream mode is pack or frame*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ +}VENC_ATTR_MPEG4_S; + +typedef struct hiVENC_ATTR_S +{ + PAYLOAD_TYPE_E enType; /*the type of payload*/ + union + { + VENC_ATTR_H264_S stAttrH264e; /*attributes of h264*/ + VENC_ATTR_MJPEG_S stAttrMjpeg; /*attributes of mjpeg*/ + VENC_ATTR_JPEG_S stAttrJpeg; /*attributes of jpeg*/ + VENC_ATTR_MPEG4_S stAttrMpeg4; /*attributes of mpeg4*/ + VENC_ATTR_H265_S stAttrH265e; /*attributes of h265*/ + }; +}VENC_ATTR_S; + +typedef struct hiVENC_CHN_ATTR_S +{ + VENC_ATTR_S stVeAttr; /*the attribute of video encoder*/ + VENC_RC_ATTR_S stRcAttr; /*the attribute of rate ctrl*/ +}VENC_CHN_ATTR_S; + +typedef struct hiVENC_CHN_STAT_S +{ + HI_U32 u32LeftPics; /*left picture number */ + HI_U32 u32LeftStreamBytes; /*left stream bytes*/ + HI_U32 u32LeftStreamFrames; /*left stream frames*/ + HI_U32 u32CurPacks; /*pack number of current frame*/ + HI_U32 u32LeftRecvPics; /*Number of frames to be received. This member is valid after HI_MPI_VENC_StartRecvPicEx is called.*/ + HI_U32 u32LeftEncPics; /*Number of frames to be encoded. This member is valid after HI_MPI_VENC_StartRecvPicEx is called.*/ +}VENC_CHN_STAT_S; + + + +typedef struct hiVENC_PARAM_H264_SLICE_SPLIT_S +{ + HI_BOOL bSplitEnable; /*slice split enable, HI_TRUE:enable, HI_FALSE:diable, default value:HI_FALSE*/ + HI_U32 u32SplitMode; /*0:bit number, 1:mb line number, >=2:no meaning*/ + HI_U32 u32SliceSize; /*when the splitmode is 0, this value presents the bitsnum of one slice average, + when the splitmode is 1, this value presents the mb num of one slice*/ +} VENC_PARAM_H264_SLICE_SPLIT_S; + +typedef struct hiVENC_PARAM_H264_INTER_PRED_S +{ + /* search window */ + HI_U32 u32HWSize; /* size of horizontal search window. + default value: differ with the picture size */ + HI_U32 u32VWSize; /* size of vertical search window. + default value: differ with the picture size */ + + /* inter pred, one of the following 4 kinds of inter prediction mode must be enable */ + HI_BOOL bInter16x16PredEn; /*default: HI_TRUE, enable 16x16 prediction*/ + HI_BOOL bInter16x8PredEn; /*default: HI_TRUE*/ + HI_BOOL bInter8x16PredEn; /*default: HI_TRUE*/ + HI_BOOL bInter8x8PredEn; /*default: HI_TRUE*/ + HI_BOOL bExtedgeEn; /*default: HI_TRUE*/ +} VENC_PARAM_H264_INTER_PRED_S; + +typedef struct hiVENC_PARAM_H264_INTRA_PRED_S +{ + /* intra pred, one of following 2 kinds of intra pred mode must be enable */ + HI_BOOL bIntra16x16PredEn; /*default: HI_TRUE, enable 16x16 intra prediction*/ + HI_BOOL bIntraNxNPredEn; /*default: HI_TRUE, enable 4x4 and/or 8x8 prediction + Notes: this value must work with IntraTransMode*/ + HI_U32 constrained_intra_pred_flag; /*default: HI_FALSE, see the H.264 protocol*/ + HI_BOOL bIpcmEn; /*default: HI_TRUE, enable ipcm*/ +}VENC_PARAM_H264_INTRA_PRED_S; + +typedef struct hiVENC_PARAM_H264_TRANS_S +{ + HI_U32 u32IntraTransMode; /* 0: trans4x4, trans8x8; 1: trans4x4, 2: trans8x8 */ + HI_U32 u32InterTransMode; /* 0: trans4x4, trans8x8; 1: trans4x4, 2: trans8x8 */ + + HI_BOOL bScalingListValid; /* default: HI_FALSE */ + /* Notes: Enable IntraScalingList8X8 and InterScalingList8X8 while bScalingListValid is HI_TRUE */ + HI_U8 InterScalingList8X8[64]; + HI_U8 IntraScalingList8X8[64]; + + HI_S32 chroma_qp_index_offset; /* [-12,12],default value: 0*/ +}VENC_PARAM_H264_TRANS_S; + +typedef struct hiVENC_PARAM_H264_ENTROPY_S +{ + HI_U32 u32EntropyEncModeI; /* 0:cavlc, 1:cabac */ + HI_U32 u32EntropyEncModeP; /* 0:cavlc, 1:cabac */ + HI_U32 cabac_stuff_en; /* default: 0*/ + HI_U32 Cabac_init_idc; /* 0~2 */ +}VENC_PARAM_H264_ENTROPY_S; + +typedef struct hiVENC_PARAM_H264_POC_S +{ + HI_U32 pic_order_cnt_type; /* default value: 2. {0,1,2} */ + +}VENC_PARAM_H264_POC_S; + +typedef struct hiVENC_PARAM_H264_DBLK_S +{ + HI_U32 disable_deblocking_filter_idc; /* default value: 0. {0,1,2} */ + HI_S32 slice_alpha_c0_offset_div2; /* default value: 5. [-6,+6] */ + HI_S32 slice_beta_offset_div2; /* default value: 5. [-6,+6] */ +}VENC_PARAM_H264_DBLK_S; + + + +typedef struct hiVENC_PARAM_H264_VUI_TIME_INFO_S +{ + HI_U8 timing_info_present_flag; /* default value: 0. If 1, timing info belows will be encoded into vui. {0,1} */ + HI_U8 fixed_frame_rate_flag; /* default value: n/a. {0,1} */ + HI_U32 num_units_in_tick; /* default value: n/a. > 0. */ + HI_U32 time_scale; /* default value: n/a. > 0. */ + +}VENC_PARAM_VUI_H264_TIME_INFO_S; + +typedef struct hiVENC_PARAM_VUI_ASPECT_RATIO_S +{ + HI_U8 aspect_ratio_info_present_flag; /* default value: 0. If 1, aspectratio info belows will be encoded into vui. {0,1} */ + HI_U8 aspect_ratio_idc; /* default value: n/a. [0,255],17~254 is reserved. */ + HI_U8 overscan_info_present_flag; /* default value: 0,just be 0.If 1, oversacan info belows will be encoded into vui. {0,1} */ + HI_U8 overscan_appropriate_flag; /* default value: n/a. */ + HI_U16 sar_width; /* default value: n/a. sar_width and sar_height shall be relatively prime. */ + HI_U16 sar_height ; /* default value: n/a. */ +}VENC_PARAM_VUI_ASPECT_RATIO_S; + + +typedef struct hiVENC_PARAM_VUI_VIDEO_SIGNAL_S +{ + HI_U8 video_signal_type_present_flag ; /* default value: 0. If 1, video singnal info will be encoded into vui. {0,1} */ + HI_U8 video_format ; /* default value: n/a. >= 0. */ + HI_U8 video_full_range_flag; /* default value: n/a. {0,1}. */ + HI_U8 colour_description_present_flag ; /* default value: n/a. {0,1} */ + HI_U8 colour_primaries ; /* default value: n/a. [0,255],0/9~255 is reserved */ + HI_U8 transfer_characteristics; /* default value: n/a. [0,255],0/13~255 is reserved */ + HI_U8 matrix_coefficients; /* default value: n/a. [0,255],9~255 is reserved */ +}VENC_PARAM_VUI_VIDEO_SIGNAL_S; + + + +typedef struct hiVENC_PARAM_H264_VUI_S +{ + VENC_PARAM_VUI_ASPECT_RATIO_S stVuiAspectRatio; + VENC_PARAM_VUI_H264_TIME_INFO_S stVuiTimeInfo; + VENC_PARAM_VUI_VIDEO_SIGNAL_S stVuiVideoSignal; +}VENC_PARAM_H264_VUI_S; + + +typedef struct hiVENC_PARAM_JPEG_S +{ + HI_U32 u32Qfactor; /*image quality :[1,99]*/ + + HI_U8 u8YQt[64]; /* y qt value */ + HI_U8 u8CbQt[64]; /* cb qt value */ + HI_U8 u8CrQt[64]; /* cr qt value */ + + HI_U32 u32MCUPerECS; /*default value: 0, MCU number of one ECS*/ +} VENC_PARAM_JPEG_S; + +typedef struct hiVENC_PARAM_MJPEG_S +{ + HI_U8 u8YQt[64]; /* y qt value */ + HI_U8 u8CbQt[64]; /* cb qt value */ + HI_U8 u8CrQt[64]; /* cr qt value */ + + HI_U32 u32MCUPerECS; /*default value: 0, MCU number of one ECS*/ +} VENC_PARAM_MJPEG_S; + + + +/* ROI struct */ +typedef struct hiVENC_ROI_CFG_S +{ + HI_U32 u32Index; /* Index of an ROI. The system supports indexes ranging from 0 to 7 */ + HI_BOOL bEnable; /* Whether to enable this ROI */ + HI_BOOL bAbsQp; /* QP mode of an ROI.HI_FALSE: relative QP.HI_TURE: absolute QP.*/ + HI_S32 s32Qp; /* QP value. */ + RECT_S stRect; /* Region of an ROI*/ +}VENC_ROI_CFG_S; + + +typedef struct hiVENC_ROIBG_FRAME_RATE_S +{ + HI_S32 s32SrcFrmRate; /* Input frame rate of Roi backgroud*/ + HI_S32 s32DstFrmRate; /* Output frame rate of Roi backgroud */ +}VENC_ROIBG_FRAME_RATE_S; + + +typedef struct hiVENC_COLOR2GREY_S +{ + HI_BOOL bColor2Grey; /* Whether to enable Color2Grey.*/ +}VENC_COLOR2GREY_S; + +typedef struct hiVENC_CROP_CFG_S +{ + HI_BOOL bEnable; /* Crop region enable */ + RECT_S stRect; /* Crop region, note: s32X must be multi of 16 */ +}VENC_CROP_CFG_S; + + +typedef struct hiVENC_FRAME_RATE_S +{ + HI_S32 s32SrcFrmRate; /* Input frame rate of a channel*/ + HI_S32 s32DstFrmRate; /* Output frame rate of a channel*/ +} VENC_FRAME_RATE_S; + +typedef struct hiVENC_PARAM_REF_S +{ + HI_U32 u32Base; /*Base layer period*/ + HI_U32 u32Enhance; /*Enhance layer period*/ + HI_BOOL bEnablePred; /*Whether some frames at the base layer are referenced by other frames at the base layer. When bEnablePred is HI_FALSE, all frames at the base layer reference IDR frames.*/ +} VENC_PARAM_REF_S; + + +typedef enum hiH264E_IDR_PIC_ID_MODE_E +{ + H264E_IDR_PIC_ID_MODE_AUTO = 0, /*auto mode */ + H264E_IDR_PIC_ID_MODE_USR, /*user mode */ + H264E_IDR_PIC_ID_MODE_BUTT, +}H264E_IDR_PIC_ID_MODE_E; + +typedef struct hiVENC_H264_IDRPICID_CFG_S +{ + H264E_IDR_PIC_ID_MODE_E enH264eIdrPicIdMode; /*the mode of idr_pic_id that is set*/ + HI_U32 u32H264eIdrPicId; /*idr_pic_id value*/ +} VENC_H264_IDRPICID_CFG_S; + +/* Jpeg snap mode */ +typedef enum hiVENC_JPEG_SNAP_MODE_E +{ + JPEG_SNAP_ALL = 0, /* Jpeg channel snap all the pictures when started. */ + JPEG_SNAP_FLASH = 1, /* Jpeg channel snap the flashed pictures when started. */ + JPEG_SNAP_BUTT, + +}VENC_JPEG_SNAP_MODE_E; + +typedef struct hiVENC_RECV_PIC_PARAM_S +{ + HI_S32 s32RecvPicNum; /*Number of frames received and encoded by the encoding channel*/ +} VENC_RECV_PIC_PARAM_S; + +typedef struct hiVENC_STREAM_BUF_INFO_S +{ + HI_U32 u32PhyAddr; + HI_VOID *pUserAddr; + HI_U32 u32BufSize; +} VENC_STREAM_BUF_INFO_S; + + +typedef struct hiVENC_PARAM_H265_SLICE_SPLIT_S +{ + HI_BOOL bSplitEnable; /* default value: HI_FALSE, means no slice split*/ + HI_U32 u32SplitMode; /* 0: by bits number; 1: by lcu line number*/ + HI_U32 u32SliceSize; /* when splitmode is 0, this value presents bits number, + when splitmode is 1, this value presents lcu line number */ + HI_U32 loop_filter_across_slices_enabled_flag; +} VENC_PARAM_H265_SLICE_SPLIT_S; + +typedef struct hiVENC_PARAM_H265_INTER_PRED_S +{ + /* search window */ + HI_U32 u32HWSize; /* size of horizontal search window. + default value: differ with the picture size */ + HI_U32 u32VWSize; /* size of vertical search window. + default value: differ with the picture size */ + + /* inter pred, one of the following 4 kinds of inter prediction mode must be enable */ + HI_BOOL bInter16x16PredEn; /*default: HI_TRUE, enable 16x16 prediction*/ + HI_BOOL bInter16x8PredEn; /*default: HI_TRUE*/ + HI_BOOL bInter8x16PredEn; /*default: HI_TRUE*/ + HI_BOOL bInter8x8PredEn; /*default: HI_TRUE*/ + HI_BOOL bExtedgeEn; /*default: HI_TRUE*/ +} VENC_PARAM_H265_INTER_PRED_S; + +typedef struct hiVENC_PARAM_H265_INTRA_PRED_S +{ + /* intra pred, one of following 2 kinds of intra pred mode must be enable */ + HI_BOOL bIntra16x16PredEn; /*default: HI_TRUE, enable 16x16 intra prediction*/ + HI_BOOL bIntraNxNPredEn; /*default: HI_TRUE, enable 4x4 and/or 8x8 prediction + Notes: this value must work with IntraTransMode*/ + HI_U32 constrained_intra_pred_flag; /*default: HI_FALSE, see the H.264 protocol*/ + HI_U32 pcm_enabled_flag; /*default: HI_TRUE, enable ipcm*/ +}VENC_PARAM_H265_INTRA_PRED_S; + +typedef struct hiVENC_PARAM_H265_PU_S +{ + HI_BOOL bPu32x32En; /*default: HI_TRUE */ + HI_BOOL bPu16x16En; /*default: HI_TRUE */ + HI_BOOL bPu8x8En; /*default: HI_TRUE */ + HI_BOOL bPu4x4En; /*default: HI_TRUE */ + + // intra pred + HI_U32 constrained_intra_pred_flag; /*default: HI_FALSE*/ + HI_U32 strong_intra_smoothing_enabled_flag; + HI_U32 pcm_enabled_flag; /*default: HI_FALSE, enable ipcm*/ + HI_U32 pcm_loop_filter_disabled_flag; + + // inter pred + HI_U32 u32MaxNumMergeCand; + +}VENC_PARAM_H265_PU_S; + + +typedef struct hiVENC_PARAM_H265_TRANS_S +{ + HI_U32 transquant_bypass_enabled_flag; + HI_U32 transform_skip_enabled_flag; + HI_S32 cb_qp_offset; + HI_S32 cr_qp_offset; +} VENC_PARAM_H265_TRANS_S; + +typedef struct hiVENC_PARAM_H265_ENTROPY_S +{ + HI_U32 cabac_init_flag; /* default: 0*/ +}VENC_PARAM_H265_ENTROPY_S; + +typedef struct hiVENC_PARAM_H265_DBLK_S +{ + HI_U32 slice_deblocking_filter_disabled_flag; /* default value: 0. {0,1} */ + HI_S32 slice_beta_offset_div2; /* default value: 5. [-6,+6] */ + HI_S32 slice_tc_offset_div2; /* default value: 5. [-6,+6] */ +}VENC_PARAM_H265_DBLK_S; + +typedef struct hiVENC_PARAM_H265_SAO_S +{ + HI_U32 slice_sao_luma_flag; + HI_U32 slice_sao_chroma_flag; +}VENC_PARAM_H265_SAO_S; + + +typedef struct hiVENC_PARAM_H265_TIMING_S +{ + HI_S32 timing_info_present_flag; /* default value: 0. If 1, timing info belows will be encoded into vui. {0,1} */ + HI_S32 num_units_in_tick; /* default value: n/a. > 0. */ + HI_S32 time_scale; /* default value: n/a. > 0. */ + HI_U32 num_ticks_poc_diff_one; +}VENC_PARAM_H265_TIMING_S; + +typedef struct hiVENC_PARAM_INTRA_REFRESH_S +{ + HI_BOOL bRefreshEnable; + HI_BOOL bISliceEnable; + HI_U32 u32RefreshLineNum; + HI_U32 u32ReqIQp; +}VENC_PARAM_INTRA_REFRESH_S; + +typedef enum hiVENC_MODTYPE_S +{ + MODTYPE_VENC = 1, + MODTYPE_H264E, + MODTYPE_H265E, + MODTYPE_JPEGE, + MODTYPE_BUTT +} VENC_MODTYPE_S; + +typedef struct hiVENC_MOD_H264E_S +{ + HI_U32 u32OneStreamBuffer; + HI_U32 u32H264eVBSource; + HI_U32 u32H264eRcnEqualRef; + HI_U32 u32H264eMiniBufMode; +} VENC_MOD_H264E_S; + +typedef struct hiVENC_MOD_H265E_S +{ + HI_U32 u32OneStreamBuffer; + HI_U32 u32H265eMiniBufMode; +} VENC_MOD_H265E_S; + +typedef struct hiVENC_MOD_JPEGE_S +{ + HI_U32 u32OneStreamBuffer; + HI_U32 u32JpegeMiniBufMode; + +} VENC_MOD_JPEGE_S; + + +typedef struct hiVENC_MOD_VENC_S +{ + HI_U32 u32VencBufferCache; +} VENC_MOD_VENC_S; + + +typedef struct hiVENC_MODPARAM_S +{ + VENC_MODTYPE_S enVencModType; + union + { + VENC_MOD_VENC_S stVencMod; + VENC_MOD_H264E_S stH264eMod; + VENC_MOD_H265E_S stH265eMod; + VENC_MOD_JPEGE_S stJpegeMod; + }; +} VENC_MODPARAM_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_VENC_H__ */ diff --git a/device/mpp/include/hi_comm_vgs.h b/device/mpp/include/hi_comm_vgs.h new file mode 100644 index 0000000..cbe969a --- /dev/null +++ b/device/mpp/include/hi_comm_vgs.h @@ -0,0 +1,102 @@ +/****************************************************************************** + + Copyright (C), 2013-2033, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_vgs.h + Version : + Author : Hisilicon Hi35xx MPP Team + Created : 2013/07/24 + Last Modified : + Description : common struct definition for VGS + Function List : + History : +******************************************************************************/ +#ifndef __HI_COMM_VGS_H__ +#define __HI_COMM_VGS_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" + +/* failure caused by malloc buffer */ +#define HI_ERR_VGS_NOBUF HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +#define HI_ERR_VGS_BUF_EMPTY HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +#define HI_ERR_VGS_NULL_PTR HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VGS_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VGS_BUF_FULL HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +#define HI_ERR_VGS_SYS_NOTREADY HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VGS_NOT_SUPPORT HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_VGS_NOT_PERMITTED HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) + +typedef HI_S32 VGS_HANDLE; + +typedef struct hiVGS_TASK_ATTR_S +{ + VIDEO_FRAME_INFO_S stImgIn; /* input picture */ + VIDEO_FRAME_INFO_S stImgOut; /* output picture */ + HI_U32 au32privateData[4]; /* task's private data */ + HI_U32 reserved; /* save current picture's state while debug */ +} VGS_TASK_ATTR_S; + +typedef struct hiVGS_DRAW_LINE_S +{ + POINT_S stStartPoint; /* line start point */ + POINT_S stEndPoint; /* line end point */ + + HI_U32 u32Thick; /* width of line */ + HI_U32 u32Color; /* color of line */ +} VGS_DRAW_LINE_S; + +typedef enum hiVGS_COVER_TYPE_E +{ + COVER_RECT = 0, /* retangle cover */ + COVER_QUAD_RANGLE, /* quadrangle cover */ + COVER_BUTT +} VGS_COVER_TYPE_E; + +typedef struct hiVGS_QUADRANGLE_COVER_S +{ + HI_BOOL bSolid; /* solid or hollow */ + HI_U32 u32Thick; /* The thick of the hollow quadrangle */ + POINT_S stPoint[4]; /* four points of the quadrangle */ +} VGS_QUADRANGLE_COVER_S; + +typedef struct hiVGS_ADD_COVER_S +{ + VGS_COVER_TYPE_E enCoverType; /* the cover type */ + union + { + RECT_S stDstRect; /* the rectangle attribute */ + VGS_QUADRANGLE_COVER_S stQuadRangle; /* the quadrangle attribute */ + }; + + HI_U32 u32Color; /* color of cover */ +} VGS_ADD_COVER_S; + +typedef struct hiVGS_ADD_OSD_S +{ + RECT_S stRect; /* start point, width and height of osd */ + HI_U32 u32BgColor; /* background color of osd */ + PIXEL_FORMAT_E enPixelFmt; /* pixel format of osd */ + HI_U32 u32PhyAddr; /* physical address of osd */ + HI_U32 u32Stride; /* stride of osd */ + HI_U32 u32BgAlpha; /* background alpha of osd */ + HI_U32 u32FgAlpha; /* foreground alpha of osd */ +} VGS_ADD_OSD_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_VGS_H__ */ diff --git a/device/mpp/include/hi_comm_vi.h b/device/mpp/include/hi_comm_vi.h new file mode 100644 index 0000000..28baa1e --- /dev/null +++ b/device/mpp/include/hi_comm_vi.h @@ -0,0 +1,556 @@ +/****************************************************************************** + +Copyright (C), 2004-2020, Hisilicon Tech. Co., Ltd. + +****************************************************************************** +File Name : hi_comm_vi.h +Version : Initial Draft +Author : Hisilicon multimedia software group +Created : 2009/3/9 +Last Modified : +Description : +Function List : +History : +1.Date : 2010/11/16 + Author : p00123320/w54723/n168968 + Modification: Created file + +2.Date : 2011/06/16 + Author : w54723/l00181524/c00186004 + Modification: Created file + + +******************************************************************************/ + +#ifndef __HI_COMM_VI_H__ +#define __HI_COMM_VI_H__ + +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +#define VI_INVALID_FRMRATE (-1UL) +#define VIU_MAX_USER_FRAME_DEPTH 8 + +typedef enum hiEN_VIU_ERR_CODE_E +{ + ERR_VI_FAILED_NOTENABLE = 64, /* device or channel not enable*/ + ERR_VI_FAILED_NOTDISABLE, /* device not disable*/ + ERR_VI_FAILED_CHNOTDISABLE, /* channel not disable*/ + ERR_VI_CFG_TIMEOUT, /* config timeout*/ + ERR_VI_NORM_UNMATCH, /* video norm of ADC and VIU is unmatch*/ + ERR_VI_INVALID_WAYID, /* invlalid way ID */ + ERR_VI_INVALID_PHYCHNID, /* invalid phychn id*/ + ERR_VI_FAILED_NOTBIND, /* device or channel not bind */ + ERR_VI_FAILED_BINDED, /* device or channel not unbind */ +} EN_VIU_ERR_CODE_E; + +#define HI_ERR_VI_INVALID_PARA HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VI_INVALID_DEVID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +#define HI_ERR_VI_INVALID_CHNID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +#define HI_ERR_VI_INVALID_NULL_PTR HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VI_FAILED_NOTCONFIG HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +#define HI_ERR_VI_SYS_NOTREADY HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VI_BUF_EMPTY HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +#define HI_ERR_VI_BUF_FULL HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +#define HI_ERR_VI_NOMEM HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_VI_NOT_SUPPORT HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_VI_BUSY HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_VI_NOT_PERM HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) + +#define HI_ERR_VI_FAILED_NOTENABLE HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_NOTENABLE)/* 0xA0108040*/ +#define HI_ERR_VI_FAILED_NOTDISABLE HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_NOTDISABLE)/* 0xA0108041*/ +#define HI_ERR_VI_FAILED_CHNOTDISABLE HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_CHNOTDISABLE)/* 0xA0108042*/ +#define HI_ERR_VI_CFG_TIMEOUT HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_CFG_TIMEOUT)/* 0xA0108043*/ +#define HI_ERR_VI_NORM_UNMATCH HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_NORM_UNMATCH)/* 0xA0108044*/ +#define HI_ERR_VI_INVALID_WAYID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_INVALID_WAYID)/* 0xA0108045*/ +#define HI_ERR_VI_INVALID_PHYCHNID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_INVALID_PHYCHNID)/* 0xA0108046*/ +#define HI_ERR_VI_FAILED_NOTBIND HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_NOTBIND)/* 0xA0108047*/ +#define HI_ERR_VI_FAILED_BINDED HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_BINDED)/* 0xA0108048*/ + + +/*get the subchn index by main chn */ +#define SUBCHN(ViChn) (ViChn + 16) + +/* define cascade chn */ +#define VI_CAS_CHN_1 32 +#define VI_CAS_CHN_2 33 + + +/* interface mode of video input */ +typedef enum hiVI_INTF_MODE_E +{ + VI_MODE_BT656 = 0, /* ITU-R BT.656 YUV4:2:2 */ + VI_MODE_BT601, /* ITU-R BT.601 YUV4:2:2 */ + VI_MODE_DIGITAL_CAMERA, /* digatal camera mode */ + VI_MODE_BT1120_STANDARD, /* BT.1120 progressive mode */ + VI_MODE_BT1120_INTERLEAVED, /* BT.1120 interstage mode */ + VI_MODE_MIPI, /*MIPI mode*/ + VI_MODE_LVDS, + VI_MODE_HISPI, + + VI_MODE_BUTT +} VI_INTF_MODE_E; + + +/* Input mode */ +typedef enum hiVI_INPUT_MODE_E +{ + VI_INPUT_MODE_BT656 = 0, /* ITU-R BT.656 YUV4:2:2 */ + VI_INPUT_MODE_BT601, /* ITU-R BT.601 YUV4:2:2 */ + VI_INPUT_MODE_DIGITAL_CAMERA, /* digatal camera mode */ + VI_INPUT_MODE_INTERLEAVED, + VI_INPUT_MODE_MIPI, /*MIPI mode*/ + VI_INPUT_MODE_LVDS, + VI_INPUT_MODE_HISPI, + + VI_INPUT_MODE_BUTT +} VI_INPUT_MODE_E; + +typedef enum hiVI_WORK_MODE_E +{ + VI_WORK_MODE_1Multiplex = 0, /* 1 Multiplex mode */ + VI_WORK_MODE_2Multiplex, /* 2 Multiplex mode */ + VI_WORK_MODE_4Multiplex, /* 4 Multiplex mode */ + + VI_WORK_MODE_BUTT +} VI_WORK_MODE_E; + + + +/* whether an input picture is interlaced or progressive */ +typedef enum hiVI_SCAN_MODE_E +{ + VI_SCAN_INTERLACED = 0, + VI_SCAN_PROGRESSIVE, + + VI_SCAN_BUTT, +} VI_SCAN_MODE_E; + +typedef enum hiVI_DATA_YUV_SEQ_E +{ + /*The input sequence of the second component(only contains u and v) in BT.1120 mode */ + VI_INPUT_DATA_VUVU = 0, + VI_INPUT_DATA_UVUV, + + /* The input sequence for yuv */ + VI_INPUT_DATA_UYVY = 0, + VI_INPUT_DATA_VYUY, + VI_INPUT_DATA_YUYV, + VI_INPUT_DATA_YVYU, + + VI_DATA_YUV_BUTT +} VI_DATA_YUV_SEQ_E; + +typedef enum hiVI_CLK_EDGE_E +{ + VI_CLK_EDGE_SINGLE_UP = 0, /* single-edge mode and in rising edge */ + VI_CLK_EDGE_SINGLE_DOWN, /* single-edge mode and in falling edge */ + //VI_CLK_EDGE_DOUBLE , /* Double edge mode */ + + VI_CLK_EDGE_BUTT +} VI_CLK_EDGE_E; + +typedef enum hiVI_COMP_MODE_E +{ + VI_COMP_MODE_SINGLE = 0, /* in single component mode */ + VI_COMP_MODE_DOUBLE = 1, /* in double component mode */ + VI_COMP_MODE_BUTT, +}VI_COMP_MODE_E; + +/* Y/C composite or separation mode */ +typedef enum hiVI_COMBINE_MODE_E +{ + VI_COMBINE_COMPOSITE = 0, /* Composite mode */ + VI_COMBINE_SEPARATE, /* Separate mode */ + VI_COMBINE_BUTT, +} VI_COMBINE_MODE_E; + +/* Attribute of the vertical synchronization signal */ +typedef enum hiVI_VSYNC_E +{ + VI_VSYNC_FIELD = 0, /* Field/toggle mode:a signal reversal means a new frame or a field */ + VI_VSYNC_PULSE, /* Pusle/effective mode:a pusle or an effective signal means a new frame or a field */ +} VI_VSYNC_E; + +/* Polarity of the vertical synchronization signal */ +typedef enum hiVI_VSYNC_NEG_E +{ + VI_VSYNC_NEG_HIGH = 0, /*if VIU_VSYNC_E = VIU_VSYNC_FIELD,then the vertical synchronization signal of even field is high-level, + if VIU_VSYNC_E = VIU_VSYNC_PULSE,then the vertical synchronization pulse is positive pulse.*/ + VI_VSYNC_NEG_LOW /*if VIU_VSYNC_E = VIU_VSYNC_FIELD,then the vertical synchronization signal of even field is low-level, + if VIU_VSYNC_E = VIU_VSYNC_PULSE,then the vertical synchronization pulse is negative pulse.*/ +} VI_VSYNC_NEG_E; + +/* Attribute of the horizontal synchronization signal */ +typedef enum hiVI_HSYNC_E +{ + VI_HSYNC_VALID_SINGNAL = 0, /* the horizontal synchronization is valid signal mode */ + VI_HSYNC_PULSE, /* the horizontal synchronization is pulse mode, a new pulse means the beginning of a new line */ +} VI_HSYNC_E; + +/* Polarity of the horizontal synchronization signal */ +typedef enum hiVI_HSYNC_NEG_E +{ + VI_HSYNC_NEG_HIGH = 0, /*if VI_HSYNC_E = VI_HSYNC_VALID_SINGNAL,then the valid horizontal synchronization signal is high-level; + if VI_HSYNC_E = VI_HSYNC_PULSE,then the horizontal synchronization pulse is positive pulse */ + VI_HSYNC_NEG_LOW /*if VI_HSYNC_E = VI_HSYNC_VALID_SINGNAL,then the valid horizontal synchronization signal is low-level; + if VI_HSYNC_E = VI_HSYNC_PULSE,then the horizontal synchronization pulse is negative pulse */ +} VI_HSYNC_NEG_E; + +/* Attribute of the valid vertical synchronization signal */ +typedef enum hiVI_VSYNC_VALID_E +{ + VI_VSYNC_NORM_PULSE = 0, /* the vertical synchronization is pusle mode, a pusle means a new frame or field */ + VI_VSYNC_VALID_SINGAL, /* the vertical synchronization is effective mode, a effective signal means a new frame or field */ +} VI_VSYNC_VALID_E; + +/* Polarity of the valid vertical synchronization signal */ +typedef enum hiVI_VSYNC_VALID_NEG_E +{ + VI_VSYNC_VALID_NEG_HIGH = 0, /*if VI_VSYNC_VALID_E = VI_VSYNC_NORM_PULSE,a positive pulse means vertical synchronization pulse; + if VI_VSYNC_VALID_E = VI_VSYNC_VALID_SINGAL,the valid vertical synchronization signal is high-level */ + VI_VSYNC_VALID_NEG_LOW /*if VI_VSYNC_VALID_E = VI_VSYNC_NORM_PULSE,a negative pulse means vertical synchronization pulse; + if VI_VSYNC_VALID_E = VI_VSYNC_VALID_SINGAL,the valid vertical synchronization signal is low-level */ +} VI_VSYNC_VALID_NEG_E; + + + +/* Blank information of the input timing */ +typedef struct hiVI_TIMING_BLANK_S +{ + HI_U32 u32HsyncHfb ; /* Horizontal front blanking width */ + HI_U32 u32HsyncAct ; /* Horizontal effetive width */ + HI_U32 u32HsyncHbb ; /* Horizontal back blanking width */ + HI_U32 u32VsyncVfb ; /* Vertical front blanking height of one frame or odd-field frame picture */ + HI_U32 u32VsyncVact ; /* Vertical effetive width of one frame or odd-field frame picture */ + HI_U32 u32VsyncVbb ; /* Vertical back blanking height of one frame or odd-field frame picture */ + HI_U32 u32VsyncVbfb ; /* Even-field vertical front blanking height when input mode is interlace (invalid when progressive input mode) */ + HI_U32 u32VsyncVbact ; /* Even-field vertical effetive width when input mode is interlace (invalid when progressive input mode) */ + HI_U32 u32VsyncVbbb ; /* Even-field vertical back blanking height when input mode is interlace (invalid when progressive input mode) */ +}VI_TIMING_BLANK_S; + +/* synchronization information about the BT.601 or DC timing */ +typedef struct hiVI_SYNC_CFG_S +{ + VI_VSYNC_E enVsync; + VI_VSYNC_NEG_E enVsyncNeg; + VI_HSYNC_E enHsync; + VI_HSYNC_NEG_E enHsyncNeg; + VI_VSYNC_VALID_E enVsyncValid; + VI_VSYNC_VALID_NEG_E enVsyncValidNeg; + VI_TIMING_BLANK_S stTimingBlank; +} VI_SYNC_CFG_S; + +/* the highest bit of the BT.656 timing reference code*/ +typedef enum hiBT656_FIXCODE_E +{ + BT656_FIXCODE_1 = 0, /* The highest bit of the EAV/SAV data over the BT.656 protocol is always 1.*/ + BT656_FIXCODE_0 /* The highest bit of the EAV/SAV data over the BT.656 protocol is always 0.*/ +}BT656_FIXCODE_E; + +/* Polarity of the field indicator bit (F) of the BT.656 timing reference code */ +typedef enum hiBT656_FIELD_POLAR_E +{ + BT656_FIELD_POLAR_STD = 0, /* the standard BT.656 mode,the first filed F=0,the second filed F=1*/ + BT656_FIELD_POLAR_NSTD /* the non-standard BT.656 mode,the first filed F=1,the second filed F=0*/ +}BT656_FIELD_POLAR_E; + +typedef struct hiVI_BT656_SYNC_CFG_S +{ + BT656_FIXCODE_E enFixCode; + BT656_FIELD_POLAR_E enFieldPolar; +}VI_BT656_SYNC_CFG_S; + +typedef enum hiVI_VBI_LOCAL_E +{ + VI_VBI_LOCAL_ODD_FRONT = 0, + VI_VBI_LOCAL_ODD_END, + VI_VBI_LOCAL_EVEN_FRONT, + VI_VBI_LOCAL_EVEN_END, + VI_VBI_LOCAL_BUTT +} VI_VBI_LOCAL_E; + +typedef struct hiVI_VBI_ATTR_S +{ + VI_VBI_LOCAL_E enLocal; /* location of VBI */ + HI_S32 s32X; /* horizontal original position of the VBI data */ + HI_S32 s32Y; /* vertical original position of the VBI data */ + HI_U32 u32Len; /* length of VBI data, by word(4 Bytes) */ +} VI_VBI_ATTR_S; + +typedef enum hiVI_DATA_TYPE_E +{ + VI_DATA_TYPE_YUV = 0, + VI_DATA_TYPE_RGB = 1, + VI_DATA_TYPE_BUTT +} VI_DATA_TYPE_E; + +typedef enum hiVI_DATA_PATH_E +{ + VI_PATH_BYPASS = 0, /* ISP bypass */ + VI_PATH_ISP = 1, /* ISP enable */ + VI_PATH_RAW = 2, /* Capture raw data, for debug */ + VI_PATH_BUTT +}VI_DATA_PATH_E; + +/* the extended attributes of VI device */ +typedef struct hiVI_DEV_ATTR_EX_S +{ + VI_INPUT_MODE_E enInputMode; /* Input mode */ + VI_WORK_MODE_E enWorkMode; /*1-, 2-, or 4-channel multiplexed work mode */ + + VI_COMBINE_MODE_E enCombineMode; /* Y/C composite or separation mode */ + VI_COMP_MODE_E enCompMode; /* Component mode (single-component or dual-component) */ + VI_CLK_EDGE_E enClkEdge; /* Clock edge mode (sampling on the rising or falling edge) */ + + HI_U32 au32CompMask[2]; /* Component mask */ + + VI_SCAN_MODE_E enScanMode; /* Input scanning mode (progressive or interlaced) */ + HI_S32 s32AdChnId[4]; /* AD channel ID. Typically, the default value -1 is recommended */ + + VI_DATA_YUV_SEQ_E enDataSeq; /* Input data sequence (only the YUV format is supported) */ + VI_SYNC_CFG_S stSynCfg; /* Sync timing. This member must be configured in BT.601 mode or DC mode */ + + VI_BT656_SYNC_CFG_S stBT656SynCfg; /* Sync timing. This member must be configured in BT.656 mode */ + + VI_DATA_PATH_E enDataPath; /* ISP enable or bypass */ + VI_DATA_TYPE_E enInputDataType; /* RGB: CSC-709 or CSC-601, PT YUV444 disable; YUV: default yuv CSC coef PT YUV444 enable. */ + + HI_BOOL bDataRev; /* Data reverse */ + + RECT_S stDevRect; /* Dev capture rect */ +} VI_DEV_ATTR_EX_S; + +/* the attributes of a VI device */ +typedef struct hiVI_DEV_ATTR_S +{ + VI_INTF_MODE_E enIntfMode; /* Interface mode */ + VI_WORK_MODE_E enWorkMode; /*1-, 2-, or 4-channel multiplexed work mode */ + + HI_U32 au32CompMask[2]; /* Component mask */ + VI_SCAN_MODE_E enScanMode; /* Input scanning mode (progressive or interlaced) */ + HI_S32 s32AdChnId[4]; /* AD channel ID. Typically, the default value -1 is recommended */ + + /* The below members must be configured in BT.601 mode or DC mode and are invalid in other modes */ + VI_DATA_YUV_SEQ_E enDataSeq; /* Input data sequence (only the YUV format is supported) */ + VI_SYNC_CFG_S stSynCfg; /* Sync timing. This member must be configured in BT.601 mode or DC mode */ + + VI_DATA_PATH_E enDataPath; /* ISP enable or bypass */ + VI_DATA_TYPE_E enInputDataType; /* RGB: CSC-709 or CSC-601, PT YUV444 disable; YUV: default yuv CSC coef PT YUV444 enable. */ + + HI_BOOL bDataRev; /* Data reverse */ + + RECT_S stDevRect; /* Dev capture rect */ +} VI_DEV_ATTR_S; + + +typedef struct hiVI_CHN_BIND_ATTR_S +{ + VI_DEV ViDev; + VI_WAY ViWay; +} VI_CHN_BIND_ATTR_S; + + +/* the attributes of a VI way */ +typedef struct hiVI_WAY_ATTR_S +{ + HI_S32 s32AdChnId; +} VI_WAY_ATTR_S; + + +/* captrue selection of video input */ +typedef enum hiVI_CAPSEL_E +{ + VI_CAPSEL_TOP = 0, /* top field */ + VI_CAPSEL_BOTTOM, /* bottom field */ + VI_CAPSEL_BOTH, /* top and bottom field */ + VI_CAPSEL_BUTT +} VI_CAPSEL_E; + + +/* the attributes of a VI channel */ +typedef struct hiVI_CHN_ATTR_S +{ + RECT_S stCapRect; /* the capture rect (corresponding to the size of the picture captured by a VI device). + For primary channels, the stCapRect's u32Width and u32Height are static attributes. That is, + the value of them can be changed only after primary and secondary channels are disabled. + For secondary channels, stCapRect is an invalid attribute */ + SIZE_S stDestSize; /* Target picture size. + For primary channels, stDestSize must be equal to stCapRect's u32Width and u32Height, + because primary channel doesn't have scale capability. Additionally, it is a static + attribute, That is, the value of stDestSize can be changed only after primary and + secondary channels are disabled. + For secondary channels, stDestSize is a dynamic attribute */ + + VI_CAPSEL_E enCapSel; /* Frame/field select. It is used only in interlaced mode. + For primary channels, enCapSel is a static attribute */ + PIXEL_FORMAT_E enPixFormat; /* Pixel storage format. Only the formats semi-planar420 and semi-planar422 are supported */ + + COMPRESS_MODE_E enCompressMode; /* 256B Segment compress or no compress. */ + + HI_BOOL bMirror; /* Whether to mirror */ + HI_BOOL bFlip; /* Whether to flip */ + HI_S32 s32SrcFrameRate; /* Source frame rate. The value -1 indicates that the frame rate is not controlled */ + HI_S32 s32DstFrameRate; /* Target frame rate. The value -1 indicates that the frame rate is not controlled */ +} VI_CHN_ATTR_S; + + +typedef struct hiVI_CHN_STAT_S +{ + HI_BOOL bEnable; /* Whether this channel is enabled */ + HI_U32 u32IntCnt; /* The video frame interrupt count */ + HI_U32 u32FrmRate; /* current frame rate */ + HI_U32 u32LostInt; /* The interrupt is received but nobody care */ + HI_U32 u32VbFail; /* Video buffer malloc failure */ + HI_U32 u32PicWidth; /* curren pic width */ + HI_U32 u32PicHeight; /* current pic height */ +} VI_CHN_STAT_S; + +typedef enum hi_VI_USERPIC_MODE_E +{ + VI_USERPIC_MODE_PIC = 0, /* YUV picture */ + VI_USERPIC_MODE_BGC, /* Background picture only with a color */ + VI_USERPIC_MODE_BUTT, +} VI_USERPIC_MODE_E; + +typedef struct hiVI_USERPIC_BGC_S +{ + HI_U32 u32BgColor; +} VI_USERPIC_BGC_S; + +typedef struct hiVI_USERPIC_ATTR_S +{ + HI_BOOL bPub; /* Whether the user picture information is shared by all VI devices and channels*/ + VI_USERPIC_MODE_E enUsrPicMode; /* User picture mode */ + union + { + VIDEO_FRAME_INFO_S stUsrPicFrm; /* Information about a YUV picture */ + VI_USERPIC_BGC_S stUsrPicBg; /* Information about a background picture only with a color */ + }unUsrPic; +} VI_USERPIC_ATTR_S; + +typedef enum hiVI_FLASH_MODE_E +{ + VI_FLASH_ONCE = 0, /* Flash one time */ + VI_FLASH_FREQ = 1, /* Flash frequently */ + VI_FLASH_MODE_BUTT +}VI_FLASH_MODE_E; + +typedef struct hiVI_FlASH_CONFIG_S +{ + VI_FLASH_MODE_E enFlashMode; /* Flash one time, flash frequently*/ + + HI_U32 u32StartTime; /* Flash start timeunit: sensor pix clk.*/ + HI_U32 u32Duration; /* Flash high duration, unit: sensor pix clk.*/ + HI_U32 u32CapFrmIndex; /* Set which vframe will be bFlashed after flashing, default is 0. */ + HI_U32 u32Interval; /* Flash frequently interval, unit: frame*/ +}VI_FLASH_CONFIG_S; + +typedef struct hiVI_EXT_CHN_ATTR_S +{ + VI_CHN s32BindChn; /* The channel num which extend channel will bind to*/ + SIZE_S stDestSize; /* Target size*/ + + HI_S32 s32SrcFrameRate; /* Source frame rate. The value -1 indicates that the frame rate is not controlled */ + HI_S32 s32DstFrameRate; /* Target frame rate. The value -1 indicates that the frame rate is not controlled */ + PIXEL_FORMAT_E enPixFormat; /* Pixel storage format. Only the formats semi-planar420 and semi-planar422 are supported */ + COMPRESS_MODE_E enCompressMode; +}VI_EXT_CHN_ATTR_S; + + +typedef struct hiVI_LDC_ATTR_S +{ + HI_BOOL bEnable; /* Whether LDC is enbale */ + LDC_ATTR_S stAttr; /* LDC Attribute */ +}VI_LDC_ATTR_S; + +typedef struct hiVI_CHN_LUM_S +{ + HI_U32 u32Lum; /* Luma sum of current frame */ + HI_U64 u64Pts; /* PTS of current frame */ +} VI_CHN_LUM_S; + +typedef enum hiVI_CSC_TYPE_E +{ + VI_CSC_TYPE_601 = 0, /* CSC Type: 601 */ + VI_CSC_TYPE_709, /* CSC Type: 709 */ + VI_CSC_TYPE_BUTT, +} VI_CSC_TYPE_E; + +typedef struct hiVI_CSC_ATTR_S +{ + VI_CSC_TYPE_E enViCscType; /* 601 or 709 */ + HI_U32 u32LumaVal; /* Luminance: [0 ~ 100] */ + HI_U32 u32ContrVal; /* Contrast: [0 ~ 100] */ + HI_U32 u32HueVal; /* Hue: [0 ~ 100] */ + HI_U32 u32SatuVal; /* Satuature: [0 ~ 100] */ +} VI_CSC_ATTR_S; + +typedef enum hiVI_RAW_READ_MODE_E +{ + READ_MODE_CYCLE = 0x0, /* read raw data cycle. */ + READ_MODE_LAST_FRAME, /* read the last frame repeatly. */ + READ_MODE_ONECE, /* stop reading when data end. */ + + READ_MODE_BUTT +}VI_RAW_READ_MODE_E; + +typedef struct hiVI_RAW_FRAME_INFO_S +{ + HI_U32 u32PoolId; + HI_U32 u32PhyAddr; + HI_VOID *pVirAddr; +}VI_RAW_FRAME_INFO_S; + +#define RAW_READ_MAX_FRAME_NUM 30 +typedef struct +{ + VIDEO_FRAME_INFO_S stFrame; +}VI_RAW_DATA_INFO_S; + +typedef struct hiVI_DCI_PARAM_S +{ + HI_BOOL bEnable; + HI_U32 u32BlackGain; /*u32BlackGain : [0, 63]*/ + HI_U32 u32ContrastGain; /*u32ContrastGain : [0, 63]*/ + HI_U32 u32LightGain; /*u32LightGain : [0, 63]*/ +} VI_DCI_PARAM_S; + +typedef struct hiVI_ISP_WDR_ATTR_S +{ + WDR_MODE_E enWDRMode; + HI_BOOL bCompress; +}VI_WDR_ATTR_S; + +typedef enum hiVI_DUMP_TYPE_E +{ + VI_DUMP_TYPE_RAW = 0, + VI_DUMP_TYPE_IR = 1, + VI_DUMP_TYPE_YUV = 2, + VI_DUMP_TYPE_RGB = 3, + VI_DUMP_TYPE_BUTT +}VI_DUMP_TYPE_E; + +typedef struct hiVI_DUMP_ATTR_S +{ + VI_DUMP_TYPE_E enDumpType; +}VI_DUMP_ATTR_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* End of #ifndef__HI_COMM_VIDEO_IN_H__ */ + + diff --git a/device/mpp/include/hi_comm_video.h b/device/mpp/include/hi_comm_video.h new file mode 100644 index 0000000..afe0ea0 --- /dev/null +++ b/device/mpp/include/hi_comm_video.h @@ -0,0 +1,445 @@ +/******************************************************************************* + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_video.h + Version : Initial Draft + Author : c42025 + Created : 2006/11/09 + Description : + History : + 1.Date : 2006/11/03 + Author : c42025 + Modification: Created file + + 2.Date : 2007/12/11 + Author : c42025 + Modification: delelte all about digital watermark + + 3.Date : 2008/10/31 + Author : z44949 + Modification: Translate the chinese comment +******************************************************************************/ + +#ifndef __HI_COMM_VIDEO_H__ +#define __HI_COMM_VIDEO_H__ + +#include "hi_type.h" +#include "hi_defines.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define FISHEYE_MAX_REGION_NUM 4 +#define FISHEYE_MAX_OFFSET 127 +#define FISHEYE_MAX_PAN_VALUE 360 +#define FISHEYE_MAX_TILT_VALUE 360 +#define FISHEYE_MAX_ZOOM_VALUE 4095 +#define FISHEYE_MIN_ZOOM_VALUE 1 +#define FISHEYE_MIN_OUT_WIDTH 960 +#define FISHEYE_MIN_OUT_HEIGHT 360 +#define FISHEYE_MAX_OUT_WIDTH 4608 +#define FISHEYE_MAX_OUT_HEIGHT 3456 + + +typedef struct hiPOINT_S +{ + HI_S32 s32X; + HI_S32 s32Y; +} POINT_S; + +typedef struct hiSIZE_S +{ + HI_U32 u32Width; + HI_U32 u32Height; +} SIZE_S; + +typedef struct hiRECT_S +{ + HI_S32 s32X; + HI_S32 s32Y; + HI_U32 u32Width; + HI_U32 u32Height; +} RECT_S; + +typedef enum hiPIC_SIZE_E +{ + PIC_QCIF = 0, + PIC_CIF, + PIC_2CIF, + PIC_HD1, + PIC_D1, + PIC_960H, + + PIC_QVGA, /* 320 * 240 */ + PIC_VGA, /* 640 * 480 */ + PIC_XGA, /* 1024 * 768 */ + PIC_SXGA, /* 1400 * 1050 */ + PIC_UXGA, /* 1600 * 1200 */ + PIC_QXGA, /* 2048 * 1536 */ + + PIC_WVGA, /* 854 * 480 */ + PIC_WSXGA, /* 1680 * 1050 */ + PIC_WUXGA, /* 1920 * 1200 */ + PIC_WQXGA, /* 2560 * 1600 */ + + PIC_HD720, /* 1280 * 720 */ + PIC_HD1080, /* 1920 * 1080 */ + PIC_2304x1296, /* 3M:2304 * 1296 */ + PIC_2592x1520, /* 4M:2592 * 1520 */ + PIC_5M, /* 2592 * 1944 */ + PIC_UHD4K, /* 3840 * 2160 */ + + PIC_BUTT +} PIC_SIZE_E; + +typedef enum hiVIDEO_NORM_E +{ + VIDEO_ENCODING_MODE_PAL = 0, + VIDEO_ENCODING_MODE_NTSC, + VIDEO_ENCODING_MODE_AUTO, + VIDEO_ENCODING_MODE_BUTT +} VIDEO_NORM_E; + +typedef enum hiVIDEO_CONTROL_MODE_E +{ + VIDEO_CONTROL_MODE_SLAVER = 0, + VIDEO_CONTROL_MODE_MASTER, + VIDEO_CONTROL_MODE_BUTT +} VIDEO_CONTROL_MODE_E; + +/* we ONLY define picture format used, all unused will be deleted!*/ +typedef enum hiPIXEL_FORMAT_E +{ + PIXEL_FORMAT_RGB_1BPP = 0, + PIXEL_FORMAT_RGB_2BPP, + PIXEL_FORMAT_RGB_4BPP, + PIXEL_FORMAT_RGB_8BPP, + PIXEL_FORMAT_RGB_444, + + PIXEL_FORMAT_RGB_4444, + PIXEL_FORMAT_RGB_555, + PIXEL_FORMAT_RGB_565, + PIXEL_FORMAT_RGB_1555, + + /* 9 reserved */ + PIXEL_FORMAT_RGB_888, + PIXEL_FORMAT_RGB_8888, + + PIXEL_FORMAT_RGB_PLANAR_888, + PIXEL_FORMAT_RGB_BAYER_8BPP, + PIXEL_FORMAT_RGB_BAYER_10BPP, + PIXEL_FORMAT_RGB_BAYER_12BPP, + PIXEL_FORMAT_RGB_BAYER_14BPP, + + PIXEL_FORMAT_RGB_BAYER, /* 16 bpp */ + + PIXEL_FORMAT_YUV_A422, + PIXEL_FORMAT_YUV_A444, + + PIXEL_FORMAT_YUV_PLANAR_422, + PIXEL_FORMAT_YUV_PLANAR_420, + + PIXEL_FORMAT_YUV_PLANAR_444, + + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + PIXEL_FORMAT_YUV_SEMIPLANAR_420, + PIXEL_FORMAT_YUV_SEMIPLANAR_444, + + PIXEL_FORMAT_UYVY_PACKAGE_422, + PIXEL_FORMAT_YUYV_PACKAGE_422, + PIXEL_FORMAT_VYUY_PACKAGE_422, + PIXEL_FORMAT_YCbCr_PLANAR, + + PIXEL_FORMAT_SINGLE, + + PIXEL_FORMAT_BUTT +} PIXEL_FORMAT_E; + +typedef struct hiVIDEO_VBI_INFO_S +{ + HI_U32 au32Data[VIU_MAX_VBI_LEN]; + HI_U32 u32Len; +} VIDEO_VBI_INFO_S; + +typedef enum hiVIDEO_FIELD_E +{ + VIDEO_FIELD_TOP = 0x1, /* even field */ + VIDEO_FIELD_BOTTOM = 0x2, /* odd field */ + VIDEO_FIELD_INTERLACED = 0x3, /* two interlaced fields */ + VIDEO_FIELD_FRAME = 0x4, /* frame */ + + VIDEO_FIELD_BUTT +} VIDEO_FIELD_E; + +typedef enum hiVIDEO_FORMAT_E +{ + VIDEO_FORMAT_LINEAR = 0x0, /* nature video line */ + VIDEO_FORMAT_TILE = 0x1, /* tile cell: 256pixel x 16line, default tile mode */ + VIDEO_FORMAT_TILE64 = 0x2, /* tile cell: 64pixel x 16line */ + + VIDEO_FORMAT_BUTT +} VIDEO_FORMAT_E; + +typedef enum hiCOMPRESS_MODE_E +{ + COMPRESS_MODE_NONE = 0x0, /* no compress */ + COMPRESS_MODE_SEG = 0x1, /* compress unit is 256 bytes as a segment, default seg mode */ + COMPRESS_MODE_SEG128 = 0x2, /* compress unit is 128 bytes as a segment */ + COMPRESS_MODE_LINE = 0x3, /* compress unit is the whole line */ + COMPRESS_MODE_FRAME = 0x4, /* compress unit is the whole frame */ + + COMPRESS_MODE_BUTT +} COMPRESS_MODE_E; + +typedef enum hiVIDEO_DISPLAY_MODE_E +{ + VIDEO_DISPLAY_MODE_PREVIEW = 0x0, + VIDEO_DISPLAY_MODE_PLAYBACK = 0x1, + + VIDEO_DISPLAY_MODE_BUTT +} VIDEO_DISPLAY_MODE_E; + + +#define DCF_DRSCRIPTION_LENGTH 32 +#define DCF_CAPTURE_TIME_LENGTH 20 + +typedef struct hiISP_DCF_INFO_S +{ + HI_U8 au8ImageDescription[DCF_DRSCRIPTION_LENGTH]; /*Describes image*/ + HI_U8 au8Make[DCF_DRSCRIPTION_LENGTH]; /*Shows manufacturer of digital cameras*/ + HI_U8 au8Model[DCF_DRSCRIPTION_LENGTH]; /*Shows model number of digital cameras*/ + HI_U8 au8Software[DCF_DRSCRIPTION_LENGTH]; /*Shows firmware (internal software of digital cameras) version number*/ + + HI_U16 u16ISOSpeedRatings; /*CCD sensitivity equivalent to Ag-Hr film speedrate*/ + HI_U32 u32FNumber; /*The actual F-number (F-stop) of lens when the image was taken*/ + HI_U32 u32MaxApertureValue; /*Maximum aperture value of lens.*/ + HI_U32 u32ExposureTime; /*Exposure time (reciprocal of shutter speed).*/ + HI_U32 u32ExposureBiasValue; /*Exposure bias (compensation) value of taking picture*/ + HI_U8 u8ExposureProgram; /*Exposure program that the camera used when image was taken. '1' means manual control, '2' + program normal, '3' aperture priority, '4' shutter priority, '5' program creative (slow program), + '6' program action(high-speed program), '7' portrait mode, '8' landscape mode*/ + HI_U8 u8MeteringMode; /*Exposure metering method. '0' means unknown, '1' average, '2' center weighted average, '3' + spot, '4' multi-spot, '5' multi-segment, '6' partial, '255' other*/ + HI_U8 u8LightSource; /*Light source, actually this means white balance setting. '0' means unknown, '1' daylight, '2' + fluorescent, '3' tungsten, '10' flash, '17' standard light A, '18' standard light B, '19' standard light + C, '20' D55, '21' D65, '22' D75, '255' other*/ + HI_U32 u32FocalLength; /*Focal length of lens used to take image. Unit is millimeter*/ + HI_U8 u8SceneType; /*Indicates the type of scene. Value '0x01' means that the image was directly photographed.*/ + HI_U8 u8CustomRendered; /*Indicates the use of special processing on image data, such as rendering geared to output. + 0 = Normal process 1 = Custom process */ + HI_U8 u8ExposureMode; /*Indicates the exposure mode set when the image was shot. + 0 = Auto exposure,1 = Manual exposure, 2 = Auto bracket*/ + HI_U8 u8WhiteBalance; /* Indicates the white balance mode set when the image was shot. + 0 = Auto white balance ,1 = Manual white balance */ + HI_U8 u8FocalLengthIn35mmFilm; /*Indicates the equivalent focal length assuming a 35mm film camera, in mm*/ + HI_U8 u8SceneCaptureType; /*Indicates the type of scene that was shot. 0 = Standard,1 = Landscape,2 = Portrait,3 = Night scene. */ + HI_U8 u8GainControl; /*Indicates the degree of overall image gain adjustment. 0 = None,1 = Low gain up,2 = High gain up,3 = Low gain down,4 = High gain down. */ + HI_U8 u8Contrast; /*Indicates the direction of contrast processing applied by the camera when the image was shot. + 0 = Normal,1 = Soft,2 = Hard */ + HI_U8 u8Saturation; /*Indicates the direction of saturation processing applied by the camera when the image was shot. + 0 = Normal,1 = Low saturation,2 = High saturation*/ + HI_U8 u8Sharpness; /*Indicates the direction of sharpness processing applied by the camera when the image was shot. + 0 = Normal,1 = Soft,2 = Hard .*/ +} ISP_DCF_INFO_S; + +typedef struct hiJPEG_DCF_S +{ + HI_U8 au8CaptureTime[DCF_CAPTURE_TIME_LENGTH]; /*The date and time when the picture data was generated*/ + HI_U8 bFlash; /*whether the picture is captured when a flash lamp is on*/ + HI_U32 u32DigitalZoomRatio; /*Indicates the digital zoom ratio when the image was shot. + If the numerator of the recorded value is 0, this indicates that digital zoom was not used.*/ + ISP_DCF_INFO_S stIspDCFInfo; + +} JPEG_DCF_S; + +typedef enum hiFRAME_FLASH_TYPE_E +{ + FRAME_FLASH_OFF = 0, + FRAME_FLASH_ON = 1, + FRAME_FLASH_BUTT, +} FRAME_FLASH_TYPE_E; + +typedef struct hiVIDEO_SUPPLEMENT_S +{ + FRAME_FLASH_TYPE_E enFlashType; + HI_U32 u32JpegDcfPhyAddr; + HI_VOID* pJpegDcfVirAddr; + +} VIDEO_SUPPLEMENT_S; + +typedef struct hiVIDEO_FRAME_S +{ + HI_U32 u32Width; + HI_U32 u32Height; + VIDEO_FIELD_E u32Field; + PIXEL_FORMAT_E enPixelFormat; + + VIDEO_FORMAT_E enVideoFormat; + COMPRESS_MODE_E enCompressMode; + + HI_U32 u32PhyAddr[3]; + HI_VOID* pVirAddr[3]; + HI_U32 u32Stride[3]; + + HI_U32 u32HeaderPhyAddr[3]; + HI_VOID* pHeaderVirAddr[3]; + HI_U32 u32HeaderStride[3]; + + HI_S16 s16OffsetTop; /* top offset of show area */ + HI_S16 s16OffsetBottom; /* bottom offset of show area */ + HI_S16 s16OffsetLeft; /* left offset of show area */ + HI_S16 s16OffsetRight; /* right offset of show area */ + + HI_U64 u64pts; + HI_U32 u32TimeRef; + + HI_U32 u32PrivateData; + VIDEO_SUPPLEMENT_S stSupplement; +} VIDEO_FRAME_S; + +typedef struct hiVIDEO_FRAME_INFO_S +{ + VIDEO_FRAME_S stVFrame; + HI_U32 u32PoolId; +} VIDEO_FRAME_INFO_S; + +typedef struct hiBITMAP_S +{ + PIXEL_FORMAT_E enPixelFormat; /* Bitmap's pixel format */ + HI_U32 u32Width; /* Bitmap's width */ + HI_U32 u32Height; /* Bitmap's height */ + HI_VOID* pData; /* Address of Bitmap's data */ +} BITMAP_S; + +/* VI Mix-Capture info. */ +typedef struct hiVI_MIXCAP_STAT_S +{ + HI_BOOL bMixCapMode; /* In mix-capture mode or not. */ + HI_BOOL bHasDownScale; /* VI Frame is downscaled or not. */ +} VI_MIXCAP_STAT_S; + +/* VI output frame info. */ +typedef struct hiVI_FRAME_INFO_S +{ + VI_MIXCAP_STAT_S stMixCapState; /* VI Mix-Capture info. */ + VIDEO_FRAME_INFO_S stViFrmInfo; /* Video frame info. */ +} VI_FRAME_INFO_S; + +typedef enum hiLDC_VIEW_TYPE_E +{ + LDC_VIEW_TYPE_ALL = 0, /* View scale all but x and y independtly, this will keep both x and y axis ,but corner maybe lost*/ + LDC_VIEW_TYPE_CROP = 1, /* Not use view scale, this will lost some side and corner */ + + LDC_VIEW_TYPE_BUTT, +} LDC_VIEW_TYPE_E; + +typedef struct hiLDC_ATTR_S +{ + LDC_VIEW_TYPE_E enViewType; + HI_S32 s32CenterXOffset; /* Horizontal offset of the image distortion center relative to image center. [-28,28]. */ + HI_S32 s32CenterYOffset; /* Vertical offset of the image distortion center relative to image center. [-14,14]. */ + HI_S32 s32Ratio; /* Distortion ratio. [0, 511]. */ +} LDC_ATTR_S; + +typedef enum hiWDR_MODE_E +{ + WDR_MODE_NONE = 0, + WDR_MODE_BUILT_IN, + + WDR_MODE_2To1_LINE, + WDR_MODE_2To1_FRAME, + WDR_MODE_2To1_FRAME_FULL_RATE, + + WDR_MODE_3To1_LINE, + WDR_MODE_3To1_FRAME, + WDR_MODE_3To1_FRAME_FULL_RATE, + + WDR_MODE_4To1_LINE, + WDR_MODE_4To1_FRAME, + WDR_MODE_4To1_FRAME_FULL_RATE, + + WDR_MODE_BUTT, +} WDR_MODE_E; + +//typedef enum hiFISHEYE_DIVISION_MODE_E +//{ +// FISHEYE_180_MODE_UP = 0, +// FISHEYE_180_MODE_LEFT = 1, +// FISHEYE_180_MODE_DOWN = 2, +// FISHEYE_180_MODE_RIGHT = 3, +// FISHEYE_180_MODE_BUTT +//}FISHEYE_DIVISION_MODE_E; + + +typedef enum hiFISHEYE_MOUNT_MODE_E +{ + + FISHEYE_DESKTOP_MOUNT = 0, /* desktop mount mode */ + FISHEYE_CEILING_MOUNT = 1, /* ceiling mount mode */ + FISHEYE_WALL_MOUNT = 2, /* wall mount mode */ + + FISHEYE_MOUNT_MODE_BUTT +}FISHEYE_MOUNT_MODE_E; + + +typedef enum hiFISHEYE_VIEW_MODE_E +{ + FISHEYE_VIEW_360_PANORAMA = 0, /* 360 panorama mode of fisheye correction */ + FISHEYE_VIEW_180_PANORAMA = 1, /* 180 panorama mode of fisheye correction */ + FISHEYE_VIEW_NORMAL = 2, /* normal mode of fisheye correction */ + FISHEYE_NO_TRANSFORMATION = 3, /* no fisheye correction */ + + FISHEYE_VIEW_MODE_BUTT +}FISHEYE_VIEW_MODE_E; + +typedef struct hiFISHEYE_REGION_ATTR_S +{ + FISHEYE_VIEW_MODE_E enViewMode; /* fisheye view mode */ + HI_U32 u32InRadius; /* inner radius of fisheye correction region [0, u32OutRadius) */ + HI_U32 u32OutRadius; /* out radius of fisheye correction region [1, max(width/2 of input picture, height/2 of input picture)] */ + HI_U32 u32Pan; /* [0, 360] */ + HI_U32 u32Tilt; /* [0, 360] */ + HI_U32 u32HorZoom; /* [1, 4095] */ + HI_U32 u32VerZoom; /* [1, 4095] */ + RECT_S stOutRect; /* output image info after fisheye correction range of width [960, 4608], + rang of height [360, 3456], rang of x [0, 4608), rang of y [0, 3456) */ +}FISHEYE_REGION_ATTR_S; + + +typedef struct hiFISHEYE_ATTR_S +{ + HI_BOOL bEnable; /* whether enable fisheye correction or not */ + HI_BOOL bLMF; /* whether fisheye len's LMF coefficient is from user config or from default linear config */ + HI_BOOL bBgColor; /* whether use background color or not */ + HI_U32 u32BgColor; /* the background color ARGB8888 [0, 0xFFFFFF] */ + + HI_S32 s32HorOffset; /* the horizontal offset between image center and physical center of len [-127, 127] */ + HI_S32 s32VerOffset; /* the vertical offset between image center and physical center of len [-127, 127] */ + + HI_U32 u32TrapezoidCoef; /* strength coefficient of trapezoid correction */ + + FISHEYE_MOUNT_MODE_E enMountMode; /* fisheye mount mode */ + + HI_U32 u32RegionNum; /* fisheye correction region number [1, FISHEYE_MAX_REGION_NUM] */ + FISHEYE_REGION_ATTR_S astFisheyeRegionAttr[FISHEYE_MAX_REGION_NUM];/* attribution of fisheye correction region */ +}FISHEYE_ATTR_S; + + +typedef struct hiFISHEYE_CONFIG_S +{ + HI_U16 au16LMFCoef[128]; /* LMF coefficient of fisheye len */ +}FISHEYE_CONFIG_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* _HI_COMM_VIDEO_H_ */ + diff --git a/device/mpp/include/hi_comm_vo.h b/device/mpp/include/hi_comm_vo.h new file mode 100644 index 0000000..fb0f885 --- /dev/null +++ b/device/mpp/include/hi_comm_vo.h @@ -0,0 +1,434 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_vo.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/03/18 + Description : + History : + 1.Date : 2009/03/18 + Author : x00100808 + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_COMM_VO_H__ +#define __HI_COMM_VO_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_video.h" + +#define VO_DEF_CHN_BUF_LEN 8 +#define VO_DEF_DISP_BUF_LEN 5 +#define VO_DEF_VIRT_BUF_LEN 3 + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef enum hiEN_VOU_ERR_CODE_E +{ + EN_ERR_VO_DEV_NOT_CONFIG = 0x40, + EN_ERR_VO_DEV_NOT_ENABLE = 0x41, + EN_ERR_VO_DEV_HAS_ENABLED = 0x42, + EN_ERR_VO_DEV_HAS_BINDED = 0x43, + EN_ERR_VO_DEV_NOT_BINDED = 0x44, + + ERR_VO_NOT_ENABLE = 0x45, + ERR_VO_NOT_DISABLE = 0x46, + ERR_VO_NOT_CONFIG = 0x47, + + ERR_VO_CHN_NOT_DISABLE = 0x48, + ERR_VO_CHN_NOT_ENABLE = 0x49, + ERR_VO_CHN_NOT_CONFIG = 0x4a, + ERR_VO_CHN_NOT_ALLOC = 0x4b, + + ERR_VO_CCD_INVALID_PAT = 0x4c, + ERR_VO_CCD_INVALID_POS = 0x4d, + + ERR_VO_WAIT_TIMEOUT = 0x4e, + ERR_VO_INVALID_VFRAME = 0x4f, + ERR_VO_INVALID_RECT_PARA = 0x50, + ERR_VO_SETBEGIN_ALREADY = 0x51, + ERR_VO_SETBEGIN_NOTYET = 0x52, + ERR_VO_SETEND_ALREADY = 0x53, + ERR_VO_SETEND_NOTYET = 0x54, + + ERR_VO_GRP_INVALID_ID = 0x55, + ERR_VO_GRP_NOT_CREATE = 0x56, + ERR_VO_GRP_HAS_CREATED = 0x57, + ERR_VO_GRP_NOT_DESTROY = 0x58, + ERR_VO_GRP_CHN_FULL = 0x59, + ERR_VO_GRP_CHN_EMPTY = 0x5a, + ERR_VO_GRP_CHN_NOT_EMPTY = 0x5b, + ERR_VO_GRP_INVALID_SYN_MODE = 0x5c, + ERR_VO_GRP_INVALID_BASE_PTS = 0x5d, + ERR_VO_GRP_NOT_START = 0x5e, + ERR_VO_GRP_NOT_STOP = 0x5f, + ERR_VO_GRP_INVALID_FRMRATE = 0x60, + ERR_VO_GRP_CHN_HAS_REG = 0x61, + ERR_VO_GRP_CHN_NOT_REG = 0x62, + ERR_VO_GRP_CHN_NOT_UNREG = 0x63, + ERR_VO_GRP_BASE_NOT_CFG = 0x64, + + ERR_GFX_NOT_DISABLE = 0x65, + ERR_GFX_NOT_BIND = 0x66, + ERR_GFX_NOT_UNBIND = 0x67, + ERR_GFX_INVALID_ID = 0x68, + + ERR_VO_WBC_NOT_DISABLE = 0x69, + ERR_VO_WBC_NOT_CONFIG = 0x6a, + + ERR_VO_CHN_AREA_OVERLAP = 0x6b, + + EN_ERR_INVALID_WBCID = 0x6c, + EN_ERR_INVALID_LAYERID = 0x6d, + EN_ERR_VO_VIDEO_HAS_BINDED = 0x6e, + EN_ERR_VO_VIDEO_NOT_BINDED = 0x6f, + ERR_VO_WBC_HAS_BIND = 0x70, + ERR_VO_WBC_HAS_CONFIG = 0x71, + ERR_VO_WBC_NOT_BIND = 0x72, + + /* new added */ + ERR_VO_BUTT + +}EN_VOU_ERR_CODE_E; + +/* System define error code */ +#define HI_ERR_VO_BUSY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_VO_NO_MEM HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_VO_NULL_PTR HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VO_SYS_NOTREADY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VO_INVALID_DEVID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +#define HI_ERR_VO_INVALID_CHNID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +#define HI_ERR_VO_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VO_NOT_SUPPORT HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_VO_NOT_PERMIT HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +#define HI_ERR_VO_INVALID_WBCID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_WBCID) +#define HI_ERR_VO_INVALID_LAYERID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_LAYERID) + + +/* device relative error code */ +#define HI_ERR_VO_DEV_NOT_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_NOT_CONFIG) +#define HI_ERR_VO_DEV_NOT_ENABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_NOT_ENABLE) +#define HI_ERR_VO_DEV_HAS_ENABLED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_HAS_ENABLED) +#define HI_ERR_VO_DEV_HAS_BINDED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_HAS_BINDED) +#define HI_ERR_VO_DEV_NOT_BINDED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_NOT_BINDED) + +/* video relative error code */ +#define HI_ERR_VO_VIDEO_NOT_ENABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_NOT_ENABLE) +#define HI_ERR_VO_VIDEO_NOT_DISABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_NOT_DISABLE) +#define HI_ERR_VO_VIDEO_NOT_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_NOT_CONFIG) +#define HI_ERR_VO_VIDEO_HAS_BINDED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_VIDEO_HAS_BINDED) +#define HI_ERR_VO_VIDEO_NOT_BINDED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_VIDEO_NOT_BINDED) + +/*wbc error code*/ +#define HI_ERR_VO_WBC_NOT_DISABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_NOT_DISABLE) +#define HI_ERR_VO_WBC_NOT_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_NOT_CONFIG) +#define HI_ERR_VO_WBC_HAS_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_HAS_CONFIG) +#define HI_ERR_VO_WBC_NOT_BIND HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_NOT_BIND) +#define HI_ERR_VO_WBC_HAS_BIND HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_HAS_BIND) + +/* channel relative error code */ +#define HI_ERR_VO_CHN_NOT_DISABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_DISABLE) +#define HI_ERR_VO_CHN_NOT_ENABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_ENABLE) +#define HI_ERR_VO_CHN_NOT_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_CONFIG) +#define HI_ERR_VO_CHN_NOT_ALLOC HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_ALLOC) +#define HI_ERR_VO_CHN_AREA_OVERLAP HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_AREA_OVERLAP) + + +/* cascade relatvie error code */ +#define HI_ERR_VO_INVALID_PATTERN HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CCD_INVALID_PAT) +#define HI_ERR_VO_INVALID_POSITION HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CCD_INVALID_POS) + +/* misc */ +#define HI_ERR_VO_WAIT_TIMEOUT HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WAIT_TIMEOUT) +#define HI_ERR_VO_INVALID_VFRAME HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_INVALID_VFRAME) +#define HI_ERR_VO_INVALID_RECT_PARA HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_INVALID_RECT_PARA) +#define HI_ERR_VO_SETBEGIN_ALREADY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETBEGIN_ALREADY) +#define HI_ERR_VO_SETBEGIN_NOTYET HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETBEGIN_NOTYET) +#define HI_ERR_VO_SETEND_ALREADY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETEND_ALREADY) +#define HI_ERR_VO_SETEND_NOTYET HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETEND_NOTYET) + +/* sync group relative error code */ +#define HI_ERR_VO_GRP_INVALID_ID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_ID) +#define HI_ERR_VO_GRP_NOT_CREATE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_CREATE) +#define HI_ERR_VO_GRP_HAS_CREATED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_HAS_CREATED) +#define HI_ERR_VO_GRP_NOT_DESTROY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_DESTROY) +#define HI_ERR_VO_GRP_CHN_FULL HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_FULL) +#define HI_ERR_VO_GRP_CHN_EMPTY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_EMPTY) +#define HI_ERR_VO_GRP_CHN_NOT_EMPTY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_NOT_EMPTY) +#define HI_ERR_VO_GRP_INVALID_SYN_MODE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_SYN_MODE) +#define HI_ERR_VO_GRP_INVALID_BASE_PTS HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_BASE_PTS) +#define HI_ERR_VO_GRP_NOT_START HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_START) +#define HI_ERR_VO_GRP_NOT_STOP HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_STOP) +#define HI_ERR_VO_GRP_INVALID_FRMRATE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_FRMRATE) +#define HI_ERR_VO_GRP_CHN_HAS_REG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_HAS_REG) +#define HI_ERR_VO_GRP_CHN_NOT_REG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_NOT_REG) +#define HI_ERR_VO_GRP_CHN_NOT_UNREG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_NOT_UNREG) +#define HI_ERR_VO_GRP_BASE_NOT_CFG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_BASE_NOT_CFG) + + +/* graphics relative error code */ +#define HI_ERR_VO_GFX_NOT_DISABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_NOT_DISABLE) +#define HI_ERR_VO_GFX_NOT_BIND HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_NOT_BIND) +#define HI_ERR_VO_GFX_NOT_UNBIND HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_NOT_UNBIND) +#define HI_ERR_VO_GFX_INVALID_ID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_INVALID_ID) + +/* vo inteface type */ +#define VO_INTF_CVBS (0x01L<<0) +#define VO_INTF_YPBPR (0x01L<<1) +#define VO_INTF_VGA (0x01L<<2) +#define VO_INTF_BT656 (0x01L<<3) +#define VO_INTF_BT1120 (0x01L<<4) +#define VO_INTF_HDMI (0x01L<<5) +#define VO_INTF_LCD (0x01L<<6) +#define VO_INTF_BT656_H (0x01L<<7) +#define VO_INTF_BT656_L (0x01L<<8) +#define VO_INTF_LCD_6BIT (0x01L<<9) +#define VO_INTF_LCD_8BIT (0x01L<<10) +#define VO_INTF_LCD_16BIT (0x01L<<11) + + + + + + +#define VO_DEFAULT_CHN -1 /* use vo buffer as pip buffer */ + +/***************************************************************************** + * 3520 ADDed + *****************************************************************************/ +typedef HI_S32 VO_INTF_TYPE_E; + + + +typedef enum hiVO_INTF_SYNC_E +{ + VO_OUTPUT_PAL = 0, + VO_OUTPUT_NTSC, + + VO_OUTPUT_1080P24, + VO_OUTPUT_1080P25, + VO_OUTPUT_1080P30, + + VO_OUTPUT_720P50, + VO_OUTPUT_720P60, + VO_OUTPUT_1080I50, + VO_OUTPUT_1080I60, + VO_OUTPUT_1080P50, + VO_OUTPUT_1080P60, + + VO_OUTPUT_576P50, + VO_OUTPUT_480P60, + + VO_OUTPUT_800x600_60, /* VESA 800 x 600 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1024x768_60, /* VESA 1024 x 768 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1280x1024_60, /* VESA 1280 x 1024 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1366x768_60, /* VESA 1366 x 768 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1440x900_60, /* VESA 1440 x 900 at 60 Hz (non-interlaced) CVT Compliant */ + VO_OUTPUT_1280x800_60, /* 1280*800@60Hz VGA@60Hz*/ + VO_OUTPUT_1600x1200_60, /* VESA 1600 x 1200 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1680x1050_60, /* VESA 1680 x 1050 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1920x1200_60, /* VESA 1920 x 1600 at 60 Hz (non-interlaced) CVT (Reduced Blanking)*/ + VO_OUTPUT_640x480_60, /* VESA 640 x 480 at 60 Hz (non-interlaced) CVT */ + VO_OUTPUT_960H_PAL, /* ITU-R BT.1302 960 x 576 at 50 Hz (interlaced)*/ + VO_OUTPUT_960H_NTSC, /* ITU-R BT.1302 960 x 480 at 60 Hz (interlaced)*/ + VO_OUTPUT_320X240_60, /* For ota5182 at 60 Hz (8bit) */ + VO_OUTPUT_320X240_50, /* For ili9342 at 50 Hz (6bit) */ + VO_OUTPUT_240X320_50, /* For ili9341 at 50 Hz (6bit) */ + VO_OUTPUT_240X320_60, /* For ili9341 at 60 Hz (16bit) */ + VO_OUTPUT_USER, + VO_OUTPUT_BUTT + +} VO_INTF_SYNC_E; + +typedef enum hiVO_DISPLAY_FIELD_E +{ + VO_FIELD_TOP, /* top field*/ + VO_FIELD_BOTTOM, /* bottom field*/ + VO_FIELD_BOTH, /* top and bottom field*/ + VO_FIELD_BUTT +} VO_DISPLAY_FIELD_E; + +typedef enum hiVOU_ZOOM_IN_E +{ + VOU_ZOOM_IN_RECT = 0, /* zoom in by rect */ + VOU_ZOOM_IN_RATIO, /* zoom in by ratio */ + VOU_ZOOM_IN_BUTT +} VOU_ZOOM_IN_E; + +typedef enum hiVO_CSC_MATRIX_E +{ + VO_CSC_MATRIX_IDENTITY = 0, + + VO_CSC_MATRIX_BT601_TO_BT709, + VO_CSC_MATRIX_BT709_TO_BT601, + + VO_CSC_MATRIX_BT601_TO_RGB_PC, + VO_CSC_MATRIX_BT709_TO_RGB_PC, + + VO_CSC_MATRIX_RGB_TO_BT601_PC, + VO_CSC_MATRIX_RGB_TO_BT709_PC, + + VO_CSC_MATRIX_BUTT +} VO_CSC_MATRIX_E; + +typedef struct hiVO_CHN_ATTR_S +{ + HI_U32 u32Priority; /* video out overlay pri */ + RECT_S stRect; /* rect of video out chn */ + HI_BOOL bDeflicker; /* deflicker or not */ +}VO_CHN_ATTR_S; + +typedef struct hiVO_BORDER_S +{ + HI_BOOL bBorderEn; /*do Frame or not*/ + BORDER_S stBorder; +}VO_BORDER_S; + + +typedef struct hiVO_QUERY_STATUS_S +{ + HI_U32 u32ChnBufUsed; /* channel buffer that been occupied */ +} VO_QUERY_STATUS_S; + +typedef struct tagVO_SYNC_INFO_S +{ + HI_BOOL bSynm; /* sync mode(0:timing,as BT.656; 1:signal,as LCD) */ + HI_BOOL bIop; /* interlaced or progressive display(0:i; 1:p) */ + HI_U8 u8Intfb; /* interlace bit width while output */ + + HI_U16 u16Vact ; /* vertical active area */ + HI_U16 u16Vbb; /* vertical back blank porch */ + HI_U16 u16Vfb; /* vertical front blank porch */ + + HI_U16 u16Hact; /* herizontal active area */ + HI_U16 u16Hbb; /* herizontal back blank porch */ + HI_U16 u16Hfb; /* herizontal front blank porch */ + HI_U16 u16Hmid; /* bottom herizontal active area */ + + HI_U16 u16Bvact; /* bottom vertical active area */ + HI_U16 u16Bvbb; /* bottom vertical back blank porch */ + HI_U16 u16Bvfb; /* bottom vertical front blank porch */ + + HI_U16 u16Hpw; /* horizontal pulse width */ + HI_U16 u16Vpw; /* vertical pulse width */ + + HI_BOOL bIdv; /* inverse data valid of output */ + HI_BOOL bIhs; /* inverse horizontal synch signal */ + HI_BOOL bIvs; /* inverse vertical synch signal */ + +} VO_SYNC_INFO_S; + +typedef struct hiVO_PUB_ATTR_S +{ + HI_U32 u32BgColor; /* Background color of a device, in RGB format. */ + VO_INTF_TYPE_E enIntfType; /* Type of a VO interface */ + VO_INTF_SYNC_E enIntfSync; /* Type of a VO interface timing */ + VO_SYNC_INFO_S stSyncInfo; /* Information about VO interface timings */ +} VO_PUB_ATTR_S; + + + +typedef struct hiVO_CHN_VFRAME_TIMEOUT_S +{ + VIDEO_FRAME_INFO_S stVFrame; + HI_S32 s32MilliSec; +} VO_CHN_VFRAME_TIMEOUT_S; + +typedef struct hiVO_SCREEN_VFRAME_TIMEOUT_S +{ + VIDEO_FRAME_INFO_S stVFrame; + HI_S32 s32MilliSec; +} VO_SCREEN_VFRAME_TIMEOUT_S; + +typedef struct hiVO_USR_SEND_TIMEOUT_S +{ + VIDEO_FRAME_INFO_S stVFrame; + HI_S32 s32MilliSec; +} VO_USR_SEND_TIMEOUT_S; + + +typedef enum hiVO_PART_MODE_E +{ + VO_PART_MODE_SINGLE = 0, /* single partition, which use software to make multi-picture in one hardware cell */ + VO_PART_MODE_MULTI = 1, /* muliti partition, each partition is a hardware cell */ + VO_PART_MODE_BUTT + +} VO_PART_MODE_E; + +typedef struct hiVO_VIDEO_LAYER_ATTR_S +{ + RECT_S stDispRect; /* Display resolution */ + SIZE_S stImageSize; /* Canvas size of the video layer */ + HI_U32 u32DispFrmRt; /* Display frame rate */ + PIXEL_FORMAT_E enPixFormat; /* Pixel format of the video layer */ + HI_BOOL bDoubleFrame; /* Whether to double frames */ + HI_BOOL bClusterMode; /* Whether to take Cluster way to use memory*/ +} VO_VIDEO_LAYER_ATTR_S; + +typedef enum hiVOU_LAYER_DDR_E +{ + VOU_LAYER_DDR0 = 0, + VOU_LAYER_DDR1 = 1, + VOU_LAYER_DDR_BUTT +}VOU_LAYER_DDR_E; + +typedef struct hiVO_ZOOM_RATIO_S +{ + HI_U32 u32XRatio; + HI_U32 u32YRatio; + HI_U32 u32WRatio; + HI_U32 u32HRatio; +} VO_ZOOM_RATIO_S; + +typedef struct hiVO_ZOOM_ATTR_S +{ + VOU_ZOOM_IN_E enZoomType; /* choose the type of zoom in */ + union + { + RECT_S stZoomRect; /* zoom in by rect */ + VO_ZOOM_RATIO_S stZoomRatio; /* zoom in by ratio */ + }; +} VO_ZOOM_ATTR_S; + +typedef struct hiVO_CSC_S +{ + VO_CSC_MATRIX_E enCscMatrix; + HI_U32 u32Luma; /* luminance: 0 ~ 100 default: 50 */ + HI_U32 u32Contrast; /* contrast : 0 ~ 100 default: 50 */ + HI_U32 u32Hue; /* hue : 0 ~ 100 default: 50 */ + HI_U32 u32Satuature; /* satuature: 0 ~ 100 default: 50 */ +} VO_CSC_S; + + +typedef struct hiVO_REGION_INFO_S +{ + RECT_S *pstRegion; /*region attribute*/ + HI_U32 u32RegionNum; /*count of the region*/ +}VO_REGION_INFO_S; + +typedef struct hiVO_REGION_LUMA_S +{ + VO_REGION_INFO_S stRegionInfo; /*Information of the region*/ + HI_U32* pu32LumaData; /*Luma data of the region*/ + HI_S32 s32MilliSec; /*time parameter.less than 0 means waiting until get the luma data, + equal to 0 means get the luma data no matter whether it can or not, + more than 0 means waiting how long the time parameter it is*/ +}VO_REGION_LUMA_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_VO_H__ */ + diff --git a/device/mpp/include/hi_comm_vpss.h b/device/mpp/include/hi_comm_vpss.h new file mode 100644 index 0000000..f471cf6 --- /dev/null +++ b/device/mpp/include/hi_comm_vpss.h @@ -0,0 +1,405 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_vpss.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : + Last Modified : + Description : common struct definition for vpss + Function List : + History : + 1.Date : 20130508 + Author : l00183122 + Modification: Create + + +******************************************************************************/ + +#ifndef __HI_COMM_VPSS_H__ +#define __HI_COMM_VPSS_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" + +#define HI_ERR_VPSS_NULL_PTR HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VPSS_NOTREADY HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VPSS_INVALID_DEVID HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +#define HI_ERR_VPSS_INVALID_CHNID HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +#define HI_ERR_VPSS_EXIST HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +#define HI_ERR_VPSS_UNEXIST HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +#define HI_ERR_VPSS_NOT_SUPPORT HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_VPSS_NOT_PERM HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +#define HI_ERR_VPSS_NOMEM HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_VPSS_NOBUF HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +#define HI_ERR_VPSS_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VPSS_BUSY HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_VPSS_BUF_EMPTY HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) + + +typedef HI_S32 VPSS_GRP; +typedef HI_S32 VPSS_CHN; + +#define VPSS_INVALID_FRMRATE (-1UL) +#define VPSS_CHN0 0 +#define VPSS_CHN1 1 +#define VPSS_CHN2 2 +#define VPSS_CHN3 3 +#define VPSS_INVALID_CHN -1 + +/*Define de-interlace mode*/ +typedef enum hiVPSS_DIE_MODE_E +{ + VPSS_DIE_MODE_AUTO = 0, + VPSS_DIE_MODE_NODIE = 1, + VPSS_DIE_MODE_DIE = 2, + VPSS_DIE_MODE_BUTT +}VPSS_DIE_MODE_E; + +/*Define attributes of vpss channel*/ +typedef struct hiVPSS_CHN_ATTR_S +{ + HI_BOOL bSpEn; /*Sharpen enable*/ + HI_BOOL bBorderEn; /*Frame enable*/ + HI_BOOL bMirror; /*mirror enable*/ + HI_BOOL bFlip; /*flip enable*/ + HI_S32 s32SrcFrameRate; /* source frame rate */ + HI_S32 s32DstFrameRate; /* dest frame rate */ + BORDER_S stBorder; +}VPSS_CHN_ATTR_S; + +typedef struct hiVPSS_GRP_PARAM_S +{ + HI_U32 u32Contrast; /*strength of dymanic contrast improve*/ + + HI_S32 s32GlobalStrength; /*strength of whole 3DNR*/ + HI_S32 s32IeStrength; /*strength of image enhance*/ + HI_S32 s32YSFStrength; /*strength of space filter*/ + HI_S32 s32YTFStrength; /*strength of time filter*/ + HI_S32 s32CSFStrength; /*strength of chroma filter*/ + HI_S32 s32CTFStrength; /*strength of chroma filter*/ + HI_S32 s32MotionLimen; /*limen for motion*/ +}VPSS_GRP_PARAM_S; + +typedef struct +{ + /* Strength of spatial-domain filtering for Chroma. */ + HI_U8 Chroma_SF_Strength; /* [0,255] */ + /* Strength of time-domain filtering for Chroma. */ + HI_U8 Chroma_TF_Strength; /* [0, 32]: */ + + /* Whether IE is processed in post step, 0: the first step, 1: the last step */ + HI_U16 IE_PostFlag; /* [0, 1] */ + + /* Texture/Edge enhancement strength. + IES indicates the strength of texture/edge enhancement (IE) */ + HI_U16 IE_Strength; /* [0, 63] */ + + /* Motion detection threshold. + This parameter determines the sensitivity of the motion detection unit to + the pixel luminance variance. + A larger value indicates lower sensitivity to the pixel luminance variance. + To be specific, implements spatial-domain filtering on the pixel whose + luminance variance exceeds the threshold and the filtering strength is determined + by Luma_SF_Strength, + and implements time-domain filtering on the pixel + whose luminance variance is less than or equal to the threshold and the filtering + strength is determined by Luma_TF_Strength. */ + HI_U16 Luma_MotionThresh; /* [0,511] */ + + /* Strength of spatial-domain filtering for moving area Luma. */ + HI_U8 Luma_SF_MoveArea; /* [0,255] */ + /* Strength of spatial-domain filtering for Still Area Luma */ + HI_U8 Luma_SF_StillArea; /* [0, 64] */ + /* Strength of time-domain filtering for Luma. */ + HI_U8 Luma_TF_Strength; /* [0,15] */ + /* Strength of Desand */ + HI_U8 DeSand_Strength; /* [0, 8], default 0 */ +} VPSS_GRP_PARAM_V2_S; + +typedef VPSS_GRP_PARAM_V2_S tVppNRsEx; + + +typedef struct hiVPSS_NR_PARAM_V1_S +{ + HI_S32 s32YPKStr; /* [ 0 .. 63 ] */ + + HI_S32 s32YSFStr; /* [ 0 .. 200 ] */ + HI_S32 s32YTFStr; /* [ 0 .. 128 ] */ + + HI_S32 s32TFStrMax /* [ 0 .. 15 ] */; + + HI_S32 s32YSmthStr; /* [ 0 .. 200 ] */ + HI_S32 s32YSmthRat; /* [ 0 .. 32 ] */ + + HI_S32 s32YSFStrDlt; /* [ -128 .. 127 ] */ + HI_S32 s32YTFStrDlt; /* [ -64 .. 63 ] */ + HI_S32 s32YTFStrDl; /* [ 0 .. 31 ] */ + + HI_S32 s32YSFBriRat; /* [ 0 .. 64 ] */ + + HI_S32 s32CSFStr; /* [ 0 .. 80 ] */ + HI_S32 s32CTFstr; /* [ 0 .. 32 ] */ + +} VPSS_NR_PARAM_V1_S; + + +typedef union hiVPSS_NR_PARAM_U +{ + VPSS_NR_PARAM_V1_S stNRParam_V1; +}VPSS_NR_PARAM_U; + +typedef struct hiVPSS_GRP_VPPNRS_S +{ + int tss, sfc, tfc; + int sfs, tfs, mdz, ies; + +}VPSS_GRP_VPPNRS_S; + +typedef struct hiVPSS_GRP_VPPNRZ_S +{ + int SFS, SFS1, SPS1,SPT1, TFP1,TFR1,SBF1, MDDZ, MAAT, SFC; + int TFS, SFS2, SPS2,SPT2, TFP2,TFR2,SBF2, MATH, MATW, TFC; + +}VPSS_GRP_VPPNRZ_S; + +typedef struct hiVPSS_GRP_VPPNRX_S +{ + int StStrength, StProSpati, StProTempo, StBaseFreq; + int TFS, TFP, TFQ, TFR, SHP, MDDZ, MATH; + +}VPSS_GRP_VPPNRX_S; + +typedef struct hiVPSS_GRP_LEVEL2_PARAM_S +{ + VPSS_GRP_VPPNRS_S *pNrS; + VPSS_GRP_VPPNRZ_S *pNrZ; + VPSS_GRP_VPPNRX_S *pNrX; +}VPSS_GRP_LEVEL2_PARAM_S; + +typedef struct hiVPSS_GRP_VPPNRXCORE_S +{ + HI_U8 SBS ; + HI_U8 SDS , _reserved_b_ : 6; + HI_U8 SBF:2; + + HI_U8 MiBaTFP; + HI_U8 MiDaTFP; + + HI_U8 HiBaTFP; + HI_U8 HiDaTFP, _reserved_B_[3]; + + HI_U16 MDDZ : 7; + HI_U16 TFP : 6, _reserved_b0_ : 1; + HI_U16 MaTFP : 2; + + HI_U16 TFR : 5; + HI_U16 TFS : 4; + + HI_U16 SHP : 7; + HI_U16 MaTFR : 5; + + HI_U16 MaTFS : 4; + HI_U16 MaSHP : 7; +} VPSS_GRP_VPPNRXCORE_S; + +typedef struct hiVPSS_GRP_VPPNRXEX_S +{ + HI_U32 ISO; + + VPSS_GRP_VPPNRXCORE_S stUnit[3]; + + HI_U8 SFC; + HI_U8 PostSBS; + HI_U8 PostSDS; + HI_U8 PostSHP; + + HI_U8 PostROW : 5, _reserved_b1_ : 3; + HI_U8 PostSFS : 4, _reserved_b2_ : 1; + HI_U8 MATW : 3; + HI_U16 MATH : 9; + HI_U16 MABW : 1; + HI_U16 TFC : 6; +}VPSS_GRP_VPPNRXEX_S; + +/////////////////////////////////////////////////////////// +/* NR B interface */ +typedef struct +{ + int ISO; + + HI_U8 SFC, TFC, _reserved_B_[3]; + + HI_U8 SHPi, SBSi,SBTi, SDSi,SDTi, MDZi; + HI_U8 SHPj, SBSj,SBTj, SDSj,SDTj, MDZj; + HI_U8 SHPk, SBSk,SBTk, SDSk,SDTk; + + HI_U16 SBFi : 2, SBFj : 2, SBFk : 2, MATH : 10; + HI_U16 TFSi : 4, TFSj : 4, TFSk : 4, PSFS : 4; + HI_U16 TFRi : 5, TFRj : 5, TFRk : 5, Post : 1; +} VPSS_GRP_VPPNRBCORE_S; +typedef VPSS_GRP_VPPNRBCORE_S tVppNRbCore; + +typedef struct +{ + VPSS_GRP_VPPNRBCORE_S iNRb; + + HI_U8 MDAF : 3, PostROW : 5; + HI_U8 MATW : 2, ExTfThr : 5; + HI_U8 MABW : 1, TextThr; + HI_U8 MTFS; + +} VPSS_GRP_VPPNRBEX_S; +typedef VPSS_GRP_VPPNRBEX_S tVppNRbEx; +/////////////////////////////////////////////////////////// + +/*Define coordinate mode*/ +typedef enum hiVPSS_CROP_COORDINATE_E +{ + VPSS_CROP_RATIO_COOR = 0, /*Ratio coordinate*/ + VPSS_CROP_ABS_COOR /*Absolute coordinate*/ +}VPSS_CROP_COORDINATE_E; + +/*Define attributes of CLIP function*/ +typedef struct hiVPSS_CROP_INFO_S +{ + HI_BOOL bEnable; /*CROP enable*/ + VPSS_CROP_COORDINATE_E enCropCoordinate; /*Coordinate mode of the crop start point*/ + RECT_S stCropRect; /*CROP rectangular*/ +}VPSS_CROP_INFO_S; + +typedef struct hiVPSS_LDC_ATTR_S +{ + HI_BOOL bEnable; /* Whether LDC is enbale */ + LDC_ATTR_S stAttr; /* LDC Attribute */ +}VPSS_LDC_ATTR_S; + +/*Define attributes of vpss GROUP*/ +typedef struct hiVPSS_GRP_ATTR_S +{ + /*statistic attributes*/ + HI_U32 u32MaxW; /*MAX width of the group*/ + HI_U32 u32MaxH; /*MAX height of the group*/ + PIXEL_FORMAT_E enPixFmt; /*Pixel format*/ + + HI_BOOL bIeEn; /*Image enhance enable*/ + HI_BOOL bDciEn; /*Dynamic contrast Improve enable*/ + HI_BOOL bNrEn; /*Noise reduce enable*/ + HI_BOOL bHistEn; /*Hist enable*/ + VPSS_DIE_MODE_E enDieMode; /*De-interlace enable*/ +}VPSS_GRP_ATTR_S; + +/*Define vpss channel's work mode*/ +typedef enum hiVPSS_CHN_MODE_E +{ + VPSS_CHN_MODE_AUTO = 0, /*Auto mode*/ + VPSS_CHN_MODE_USER =1 /*User mode*/ +}VPSS_CHN_MODE_E; + +/*Define attributes of vpss channel's work mode*/ +typedef struct hiVPSS_CHN_MODE_S +{ + VPSS_CHN_MODE_E enChnMode; /*Vpss channel's work mode*/ + HI_U32 u32Width; /*Width of target image*/ + HI_U32 u32Height; /*Height of target image*/ + HI_BOOL bDouble; /*Field-frame transferonly valid for VPSS_PRE0_CHN*/ + PIXEL_FORMAT_E enPixelFormat;/*Pixel format of target image*/ + COMPRESS_MODE_E enCompressMode; /*Compression mode of the output*/ + +}VPSS_CHN_MODE_S; + +typedef struct hiVPSS_FRAME_TIMEOUT_S +{ + VIDEO_FRAME_INFO_S stVideoFrame; + HI_S32 s32MilliSec; +}VPSS_FRAME_TIMEOUT_S; + +typedef struct hiVPSS_GET_GRP_FRAME_S +{ + HI_U32 u32FrameIndex; /*reserved*/ + VIDEO_FRAME_INFO_S *pstVideoFrame; +}VPSS_GET_GRP_FRAME_S; + +/*Define detailed params for channel image process*/ +typedef struct hiVPSS_CHN_PARAM_S +{ + HI_U32 u32SpStrength; +} VPSS_CHN_PARAM_S; + +/*Define vpss frame control info*/ +typedef struct hiVPSS_FRAME_RATE_S +{ + HI_S32 s32SrcFrmRate; /* Input frame rate of a group*/ + HI_S32 s32DstFrmRate; /* Output frame rate of a channel group */ +} VPSS_FRAME_RATE_S; + +/*Define attributes of vpss extend channel*/ +typedef struct hiVPSS_EXT_CHN_ATTR_S +{ + VPSS_CHN s32BindChn; /*channel bind to*/ + HI_U32 u32Width; /*Width of target image*/ + HI_U32 u32Height; /*Height of target image*/ + HI_S32 s32SrcFrameRate; /*Frame rate of source*/ + HI_S32 s32DstFrameRate; /*Frame rate of extend chn input&output*/ + PIXEL_FORMAT_E enPixelFormat; /*Pixel format of target image*/ + COMPRESS_MODE_E enCompressMode; /*Compression mode of the output*/ +}VPSS_EXT_CHN_ATTR_S; + +typedef struct hiVPSS_REGION_INFO_S +{ + RECT_S *pstRegion; /*region attribute*/ + HI_U32 u32RegionNum; /*count of the region*/ +}VPSS_REGION_INFO_S; + +typedef struct hiVPSS_GET_REGION_LUMA_S +{ + VPSS_REGION_INFO_S stRegionInfo; /*Information of the region*/ + HI_U32* pu32LumaData; /*Luma data of the region*/ + HI_S32 s32MilliSec; /*time parameter.less than 0 means waiting until get the luma data, + equal to 0 means get the luma data no matter whether it can or not, + more than 0 means waiting how long the time parameter it is*/ +}VPSS_GET_REGION_LUMA_S; + + +typedef enum hiVPSS_COVER_TYPE_E +{ + VPSS_AREA_RECT = 0, + VPSS_AREA_QUAD_RANGLE, + VPSS_AREA_BUTT +} VPSS_COVER_TYPE_E; + +typedef enum hiVPSS_REF_SEL_MODE_E +{ + VPSS_REF_FROM_RFR = 0, /*reference frame from the rfr frame */ + VPSS_REF_FROM_CHN0 = 1, /*reference frame from the CHN0 */ + VPSS_REF_CLASSIC_MODE = 2, /* c00321909 ģʽ*/ + VPSS_REF_FROM_BUTT + +}VPSS_REF_SEL_MODE_E; + +typedef struct hiVPSS_LOW_DELAY_INFO_S +{ + HI_BOOL bEnable; + HI_U32 u32LineCnt; + +}VPSS_LOW_DELAY_INFO_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ +#endif /* __HI_COMM_VPSS_H__ */ + + diff --git a/device/mpp/include/hi_common.h b/device/mpp/include/hi_common.h new file mode 100644 index 0000000..757136c --- /dev/null +++ b/device/mpp/include/hi_common.h @@ -0,0 +1,358 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_common.h +Version : Initial Draft +Author : Hi3511 MPP Team +Created : 2006/11/09 +Last Modified : +Description : The common defination +Function List : +History : + 1.Date : 2009/03/03 + Author : z44949 + Modification: Created file +2.Date : 2009/07/01 + Author : z44949 + Modification: Move MPP_VER_PRIX to hi_defines.h +3.Date : 2009/08/13 + Author : y45339 + Modification: add some proc define + +4.Date : 2010/11/03 + Author : z44949 + Modification: Remove some unnecessary typedef + +******************************************************************************/ +#ifndef __HI_COMMON_H__ +#define __HI_COMMON_H__ + +#include "hi_type.h" +#include "hi_math.h" +#include "hi_defines.h" +#include "hi_comm_video.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +#ifndef VER_X + #define VER_X 1 +#endif + +#ifndef VER_Y + #define VER_Y 0 +#endif + +#ifndef VER_Z + #define VER_Z 0 +#endif + +#ifndef VER_P + #define VER_P 0 +#endif + +#ifndef VER_B + #define VER_B 0 +#endif + +#ifdef HI_DEBUG + #define VER_D " Debug" +#else + #define VER_D " Release" +#endif + +#define __MK_VERSION(x,y,z,p,b) #x"."#y"."#z"."#p" B0"#b +#define MK_VERSION(x,y,z,p,b) __MK_VERSION(x,y,z,p,b) +#define MPP_VERSION CHIP_NAME MPP_VER_PRIX MK_VERSION(VER_X,VER_Y,VER_Z,VER_P,VER_B) VER_D + +#define VERSION_NAME_MAXLEN 64 +typedef struct hiMPP_VERSION_S +{ + HI_CHAR aVersion[VERSION_NAME_MAXLEN]; +} MPP_VERSION_S; + +typedef struct hiCROP_INFO_S +{ + HI_BOOL bEnable; + RECT_S stRect; +} CROP_INFO_S; + +typedef enum hiROTATE_E +{ + ROTATE_NONE = 0, + ROTATE_90 = 1, + ROTATE_180 = 2, + ROTATE_270 = 3, + ROTATE_BUTT +} ROTATE_E; + +typedef struct hiBORDER_S +{ + HI_U32 u32TopWidth; + HI_U32 u32BottomWidth; + HI_U32 u32LeftWidth; + HI_U32 u32RightWidth; + HI_U32 u32Color; +} BORDER_S; + +typedef HI_S32 AI_CHN; +typedef HI_S32 AO_CHN; +typedef HI_S32 AENC_CHN; +typedef HI_S32 ADEC_CHN; +typedef HI_S32 AUDIO_DEV; +typedef HI_S32 AVENC_CHN; +typedef HI_S32 VI_DEV; +typedef HI_S32 VI_WAY; +typedef HI_S32 VI_CHN; +typedef HI_S32 VO_DEV; +typedef HI_S32 VO_LAYER; +typedef HI_S32 VO_CHN; +typedef HI_S32 VO_WBC; +typedef HI_S32 GRAPHIC_LAYER; +typedef HI_S32 VENC_CHN; +typedef HI_S32 VDEC_CHN; +typedef HI_S32 VENC_GRP; +typedef HI_S32 VO_GRP; +typedef HI_S32 VDA_CHN; +typedef HI_S32 IVE_HANDLE; +typedef HI_S32 CLS_HANDLE; +typedef HI_S32 FD_CHN; +typedef HI_S32 MD_CHN; +typedef HI_S32 ISP_DEV; +typedef HI_S32 SENSOR_ID; + + + +#define HI_INVALID_CHN (-1) +#define HI_INVALID_WAY (-1) +#define HI_INVALID_LAYER (-1) +#define HI_INVALID_DEV (-1) +#define HI_INVALID_HANDLE (-1) +#define HI_INVALID_VALUE (-1) +#define HI_INVALID_TYPE (-1) + +typedef enum hiMOD_ID_E +{ + HI_ID_CMPI = 0, + HI_ID_VB = 1, + HI_ID_SYS = 2, + HI_ID_RGN = 3, + HI_ID_CHNL = 4, + HI_ID_VDEC = 5, + HI_ID_GROUP = 6, + HI_ID_VPSS = 7, + HI_ID_VENC = 8, + HI_ID_VDA = 9, + HI_ID_H264E = 10, + HI_ID_JPEGE = 11, + HI_ID_MPEG4E = 12, + HI_ID_H264D = 13, + HI_ID_JPEGD = 14, + HI_ID_VOU = 15, + HI_ID_VIU = 16, + HI_ID_DSU = 17, + HI_ID_VALG = 18, + HI_ID_RC = 19, + HI_ID_AIO = 20, + HI_ID_AI = 21, + HI_ID_AO = 22, + HI_ID_AENC = 23, + HI_ID_ADEC = 24, + HI_ID_AVENC = 25, + HI_ID_PCIV = 26, + HI_ID_PCIVFMW = 27, + HI_ID_ISP = 28, + HI_ID_IVE = 29, + + HI_ID_DCCM = 31, + HI_ID_DCCS = 32, + HI_ID_PROC = 33, + HI_ID_LOG = 34, + HI_ID_MST_LOG = 35, + HI_ID_VD = 36, + + HI_ID_VCMP = 38, + HI_ID_FB = 39, + HI_ID_HDMI = 40, + HI_ID_VOIE = 41, + HI_ID_TDE = 42, + HI_ID_USR = 43, + HI_ID_VEDU = 44, + HI_ID_VGS = 45, + HI_ID_H265E = 46, + HI_ID_FD = 47, + HI_ID_ODT = 48, //Object detection trace + HI_ID_VQA = 49, //Video quality analysis + HI_ID_LPR = 50, // License Plate Recognition + HI_ID_FISHEYE = 51, + + HI_ID_BUTT, +} MOD_ID_E; + +typedef struct hiMPP_CHN_S +{ + MOD_ID_E enModId; + HI_S32 s32DevId; + HI_S32 s32ChnId; +} MPP_CHN_S; + + +typedef enum hiPROFILE_TYPE_E +{ + PROFILE_1080P_30 = 0, + PROFILE_3M_30, + PROFILE_1080P_60, + PROFILE_5M_30, + PROFILE_BUTT, +} PROFILE_TYPE_E; + +#define MPP_MOD_VIU "vi" +#define MPP_MOD_VOU "vo" +#define MPP_MOD_HDMI "hdmi" +#define MPP_MOD_DSU "dsu" +#define MPP_MOD_VGS "vgs" +#define MPP_MOD_FISHEYE "fisheye" + +#define MPP_MOD_CHNL "chnl" +#define MPP_MOD_VENC "venc" +#define MPP_MOD_GRP "grp" +#define MPP_MOD_VDA "vda" +#define MPP_MOD_VPSS "vpss" +#define MPP_MOD_RGN "rgn" +#define MPP_MOD_IVE "ive" +#define MPP_MOD_FD "fd" + +#define MPP_MOD_H264E "h264e" +#define MPP_MOD_H265E "h265e" +#define MPP_MOD_JPEGE "jpege" +#define MPP_MOD_MPEG4E "mpeg4e" + +#define MPP_MOD_VDEC "vdec" +#define MPP_MOD_H264D "h264d" +#define MPP_MOD_JPEGD "jpegd" + +#define MPP_MOD_AI "ai" +#define MPP_MOD_AO "ao" +#define MPP_MOD_AENC "aenc" +#define MPP_MOD_ADEC "adec" +#define MPP_MOD_AIO "aio" +#define MPP_MOD_ACODEC "acodec" + +#define MPP_MOD_VB "vb" +#define MPP_MOD_SYS "sys" +#define MPP_MOD_CMPI "cmpi" + +#define MPP_MOD_PCIV "pciv" +#define MPP_MOD_PCIVFMW "pcivfmw" + +#define MPP_MOD_PROC "proc" +#define MPP_MOD_LOG "logmpp" +#define MPP_MOD_MST_LOG "mstlog" + +#define MPP_MOD_DCCM "dccm" +#define MPP_MOD_DCCS "dccs" + +#define MPP_MOD_VCMP "vcmp" +#define MPP_MOD_FB "fb" + +#define MPP_MOD_RC "rc" + +#define MPP_MOD_VOIE "voie" + +#define MPP_MOD_TDE "tde" +#define MPP_MOD_ISP "isp" +#define MPP_MOD_USR "usr" + +/* We just coyp this value of payload type from RTP/RTSP definition */ +typedef enum +{ + PT_PCMU = 0, + PT_1016 = 1, + PT_G721 = 2, + PT_GSM = 3, + PT_G723 = 4, + PT_DVI4_8K = 5, + PT_DVI4_16K = 6, + PT_LPC = 7, + PT_PCMA = 8, + PT_G722 = 9, + PT_S16BE_STEREO = 10, + PT_S16BE_MONO = 11, + PT_QCELP = 12, + PT_CN = 13, + PT_MPEGAUDIO = 14, + PT_G728 = 15, + PT_DVI4_3 = 16, + PT_DVI4_4 = 17, + PT_G729 = 18, + PT_G711A = 19, + PT_G711U = 20, + PT_G726 = 21, + PT_G729A = 22, + PT_LPCM = 23, + PT_CelB = 25, + PT_JPEG = 26, + PT_CUSM = 27, + PT_NV = 28, + PT_PICW = 29, + PT_CPV = 30, + PT_H261 = 31, + PT_MPEGVIDEO = 32, + PT_MPEG2TS = 33, + PT_H263 = 34, + PT_SPEG = 35, + PT_MPEG2VIDEO = 36, + PT_AAC = 37, + PT_WMA9STD = 38, + PT_HEAAC = 39, + PT_PCM_VOICE = 40, + PT_PCM_AUDIO = 41, + PT_AACLC = 42, + PT_MP3 = 43, + PT_ADPCMA = 49, + PT_AEC = 50, + PT_X_LD = 95, + PT_H264 = 96, + PT_D_GSM_HR = 200, + PT_D_GSM_EFR = 201, + PT_D_L8 = 202, + PT_D_RED = 203, + PT_D_VDVI = 204, + PT_D_BT656 = 220, + PT_D_H263_1998 = 221, + PT_D_MP1S = 222, + PT_D_MP2P = 223, + PT_D_BMPEG = 224, + PT_MP4VIDEO = 230, + PT_MP4AUDIO = 237, + PT_VC1 = 238, + PT_JVC_ASF = 255, + PT_D_AVI = 256, + PT_DIVX3 = 257, + PT_AVS = 258, + PT_REAL8 = 259, + PT_REAL9 = 260, + PT_VP6 = 261, + PT_VP6F = 262, + PT_VP6A = 263, + PT_SORENSON = 264, + PT_H265 = 265, + PT_MAX = 266, + /* add by hisilicon */ + PT_AMR = 1001, + PT_MJPEG = 1002, + PT_AMRWB = 1003, + PT_BUTT +} PAYLOAD_TYPE_E; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* _HI_COMMON_H_ */ + diff --git a/device/mpp/include/hi_debug.h b/device/mpp/include/hi_debug.h new file mode 100644 index 0000000..03a77b1 --- /dev/null +++ b/device/mpp/include/hi_debug.h @@ -0,0 +1,147 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_debug.h +Version : Initial Draft +Author : Hisilicon multimedia software group +Created : 2006/12/09 +Last Modified : +Description : all struct and maro definition for debug +Function List : +History : + 1.Date : 2006/11/03 + Author : c42025 + Modification: Created file + +2.Date : 2008/03/03 + Author : c42025 + Modification: 1. mv definition LOG_ERRLEVEL_E to here form file "hi_errno.h", + but it will be obsolete in next version. + 2. add new macro definition for debug levle. + 3. change macro defintion HI_TRACE + +3.Date : 2008/03/05 + Author : c42025 + Modification: Change the definition of LOG_ERRLEVEL_E + +4.Date : 2008/10/31 + Author : z44949 + Modification: Delete the definition of LOG_ERRLEVEL_E + +5.Date : 2010/11/03 + Author : z44949 + Modification: Remove some unnecessary typedef + +******************************************************************************/ +#ifndef __HI_DEBUG_H__ +#define __HI_DEBUG_H__ + +#ifndef __KERNEL__ +#include +#endif + +#include "hi_type.h" +#include "hi_common.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#define _EX__FILE_LINE(fxx,lxx) "[File]:"fxx"\n[Line]:"#lxx"\n[Info]:" +#define EX__FILE_LINE(fxx,lxx) _EX__FILE_LINE(fxx,lxx) +#define __FILE_LINE__ EX__FILE_LINE(__FILE__, __LINE__) + +#define HI_DBG_EMERG 0 /* system is unusable */ +#define HI_DBG_ALERT 1 /* action must be taken immediately */ +#define HI_DBG_CRIT 2 /* critical conditions */ +#define HI_DBG_ERR 3 /* error conditions */ +#define HI_DBG_WARN 4 /* warning conditions */ +#define HI_DBG_NOTICE 5 /* normal but significant condition */ +#define HI_DBG_INFO 6 /* informational */ +#define HI_DBG_DEBUG 7 /* debug-level messages */ + +typedef struct hiLOG_LEVEL_CONF_S +{ + MOD_ID_E enModId; + HI_S32 s32Level; + HI_CHAR cModName[16]; +} LOG_LEVEL_CONF_S; + +#ifndef __KERNEL__ +/****************************************************************************** +** For User Mode : HI_PRINT, HI_ASSERT, HI_TRACE +******************************************************************************/ + +#define HI_PRINT printf + +/* #ifdef HI_DEBUG */ +#if 1 + /* Using samples: HI_ASSERT(x>y); */ + #define HI_ASSERT(expr) \ + do{ \ + if (!(expr)) { \ + printf("\nASSERT failed at:\n"\ + " >File name: %s\n" \ + " >Function : %s\n" \ + " >Line No. : %d\n" \ + " >Condition: %s\n", \ + __FILE__,__FUNCTION__, __LINE__, #expr);\ + _exit(-1);\ + } \ + }while(0) + + /* Using samples: + ** HI_TRACE(HI_DBG_DEBUG, HI_ID_CMPI, "Test %d, %s\n", 12, "Test"); + **/ + #define HI_TRACE(level, enModId, fmt...) fprintf(stderr,##fmt) +#else + #define HI_ASSERT(expr) + #define HI_TRACE(level, enModId, fmt...) +#endif + +#else +/****************************************************************************** +** For Linux Kernel : HI_PRINT, HI_ASSERT, HI_TRACE +******************************************************************************/ + +#define HI_PRINT printk + +extern HI_S32 HI_ChkLogLevel(HI_S32 s32Levle, MOD_ID_E enModId); +asmlinkage int HI_LOG(HI_S32 level, MOD_ID_E enModId,const char *fmt, ...); + +/* #ifdef HI_DEBUG */ +#if 1 + /* Using samples: HI_ASSERT(x>y); */ + #define HI_ASSERT(expr) \ + do{ \ + if (!(expr)) { \ + panic("\nASSERT failed at:\n" \ + " >File name: %s\n" \ + " >Function : %s\n" \ + " >Line No. : %d\n" \ + " >Condition: %s\n", \ + __FILE__,__FUNCTION__, __LINE__, #expr);\ + } \ + }while(0) + + /* Using samples: + ** HI_TRACE(HI_DBG_DEBUG, HI_ID_CMPI, "Test %d, %s\n", 12, "Test"); + **/ + #define HI_TRACE HI_LOG +#else + #define HI_ASSERT(expr) + #define HI_TRACE(level, enModId, fmt...) +#endif + +#endif /* end of __KERNEL__ */ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_DEBUG_H__ */ + diff --git a/device/mpp/include/hi_defines.h b/device/mpp/include/hi_defines.h new file mode 100644 index 0000000..bdbd79b --- /dev/null +++ b/device/mpp/include/hi_defines.h @@ -0,0 +1,303 @@ +/****************************************************************************** + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_defines.h +Version : Initial Draft +Author : Hisilicon multimedia software group +Created : 2005/4/23 +Last Modified : +Description : The common data type defination +Function List : +History : +******************************************************************************/ +#ifndef __HI_DEFINES_H__ +#define __HI_DEFINES_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + + +#define HI3516A_V100 0x3516A100 +#define HI3516D_V100 0x3516D100 +#define HI3518E_V200 0x3518E200 + + +#define HI35xx_Vxxx 0x35000000 + +#ifndef HICHIP + #define HICHIP HI3518E_V200 +#endif + +#if HICHIP==HI3516A_V100 + #define CHIP_NAME "Hi3516A" + #define MPP_VER_PRIX "_MPP_V" +#elif HICHIP==HI3518E_V200 + #define CHIP_NAME "Hi3518EV200" + #define MPP_VER_PRIX "_MPP_V" +#elif HICHIP==HI35xx_Vxxx + #error HuHu, I am an dummy chip +#else + #error HICHIP define may be error +#endif + +#define LINE_LEN_BIT 5 +#define LINE_LEN (1<>= LINE_LEN_BIT; + end = addr + len*LINE_LEN; + + while(addr != end) + { + asm("mcr p15, 0, %0, c7, c6, 1"::"r"(addr)); + addr += LINE_LEN; + } + return; +} + +static inline void FlushDcache(unsigned long addr, unsigned long len) +{ + unsigned long end; + + //TODO: cacheˢҪд + return ; + + addr &= LINE_BASE_MASK; + len >>= LINE_LEN_BIT; + end = addr + len*LINE_LEN; + + while(addr != end) + { + asm("mcr p15, 0, %0, c7, c10, 1"::"r"(addr)); + addr += LINE_LEN; + } + return; +} + +#define DEFAULT_ALIGN 16 +#define MAX_MMZ_NAME_LEN 16 + +#define MAX_NODE_NUM 16 + +/* For VDA */ +#define VDA_MAX_NODE_NUM 32 +#define VDA_MAX_INTERNAL 256 +#define VDA_CHN_NUM_MAX 32 +#define VDA_MAX_WIDTH 960 +#define VDA_MAX_HEIGHT 960 +#define VDA_MIN_WIDTH 32 +#define VDA_MIN_HEIGHT 32 + +/* For VENC */ +#define VENC_MAX_NAME_LEN 16 +#define VENC_MAX_CHN_NUM 16 +#define VENC_MAX_GRP_NUM 16 +#define H264E_MAX_WIDTH 1920 +#define H264E_MAX_HEIGHT 1920 +#define H264E_MIN_WIDTH 160 +#define H264E_MIN_HEIGHT 64 +#define H265E_MAX_WIDTH 2592 +#define H265E_MAX_HEIGHT 2592 +#define H265E_MIN_WIDTH 128 +#define H265E_MIN_HEIGHT 128 +#define JPEGE_MAX_WIDTH 8192 +#define JPEGE_MAX_HEIGHT 8192 +#define JPEGE_MIN_WIDTH 64 +#define JPEGE_MIN_HEIGHT 64 +#define VENC_MAX_ROI_NUM 8 /* ֧8ROI */ +#define H264E_MIN_HW_INDEX 0 +#define H264E_MAX_HW_INDEX 11 +#define H264E_MIN_VW_INDEX 0 +#define H264E_MAX_VW_INDEX 3 + + + + +/* For RC */ +#define RC_TEXTURE_THR_SIZE 12 +#define RC_RQRATIO_SIZE 8 + + +/* For VDEC, hi3516a not support */ +#define VDEC_MAX_CHN_NUM 0 + +/* For Region */ +/* For Region */ +#define RGN_MIN_WIDTH 2 +#define RGN_MIN_HEIGHT 2 +#define RGN_MAX_WIDTH 2592 +#define RGN_MAX_HEIGHT 2592 +#define RGN_ALIGN 2 + +#define RGN_HANDLE_MAX 1024 + +#define COVER_MAX_NUM_VI 0 +#define COVEREX_MAX_NUM_VI 16 +#define OVERLAY_MAX_NUM_VI 0 +#define OVERLAYEX_MAX_NUM_VI 16 + +#define OVERLAY_MAX_NUM_VENC 8 + +#define COVER_MAX_NUM_VPSS 8 +#define COVEREX_MAX_NUM_VPSS 8 +#define OVERLAY_MAX_NUM_VPSS 1 +#define OVERLAYEX_MAX_NUM_VPSS 8 + +#define OVERLAYEX_MAX_NUM_VGS 1 +#define COVER_MAX_NUM_VGS 1 + + +#define COVEREX_MAX_NUM_VO 1 +#define OVERLAYEX_MAX_NUM_VO 1 + +#define OVERLAYEX_MAX_NUM_PCIV 0 + +/* number of channle and device on video input unit of chip + * Note! VIU_MAX_CHN_NUM is NOT equal to VIU_MAX_DEV_NUM + * multiplied by VIU_MAX_CHN_NUM, because all VI devices + * can't work at mode of 4 channles at the same time. + */ +#define VIU_MAX_DEV_NUM 1 +#define VIU_MAX_WAY_NUM_PER_DEV 1 +#define VIU_MAX_CHN_NUM_PER_DEV 1 +#define VIU_MAX_PHYCHN_NUM 1 +#define VIU_MAX_RAWCHN_NUM 1 /* raw data chn, DVR/NVR: 0 */ +#define VIU_EXT_CHN_START VIU_MAX_PHYCHN_NUM +#define VIU_MAX_EXT_CHN_NUM 16 +#define VIU_MAX_EXTCHN_BIND_PER_CHN 8 + +#define VIU_MAX_CHN_NUM (VIU_MAX_PHYCHN_NUM + VIU_MAX_EXT_CHN_NUM) +#define VIU_MAX_UFLIST_NUM (VIU_MAX_CHN_NUM + VIU_MAX_RAWCHN_NUM) + +#define VIU_CHNID_DEV_FACTOR 2 + +/* 3516aּ֧궨ЩϢֻΪ˱ͨ */ +#define VIU_MAX_CAS_CHN_NUM 2 +#define VIU_SUB_CHN_START 16 /* ͨʼ*/ +#define VIU_CAS_CHN_START 32 /* 弶ͨʼ*/ + +/* max number of VBI region*/ +#define VIU_MAX_VBI_NUM 2 +/* max length of one VBI region (by word) */ +#define VIU_MAX_VBI_LEN 8 + +#define VO_MIN_CHN_WIDTH 32 /* channel minimal width */ +#define VO_MIN_CHN_HEIGHT 32 /* channel minimal height */ + +#define VO_MAX_ZOOM_RATIO 1000 /* max zoom ratio, 1000 means 100% scale */ + +#define VO_MAX_DEV_NUM 1 /* max dev num */ +#define VO_MAX_LAYER_NUM 1 /* max layer num */ +#define PIP_MAX_CHN_NUM 8 +#define VHD_MAX_CHN_NUM 8 /* max VHD chn num */ +#define VO_MAX_CHN_NUM VHD_MAX_CHN_NUM /* max chn num */ +#define VO_MAX_LAYER_IN_DEV 1 /* max layer num of each dev */ +#define VO_MIN_CHN_LINE 2 + + +#define VO_MAX_GFX_LAYER_PER_DEV 1 +#define VO_MAX_GRAPHICS_LAYER_NUM 1 +#define MDDRC_ZONE_MAX_NUM 32 + +#define VO_MAX_PRIORITY 2 +#define VO_MIN_TOLERATE 1 /* min play toleration 1ms */ +#define VO_MAX_TOLERATE 100000 /* max play toleration 100s */ + +#define AI_DEV_MAX_NUM 1 +#define AO_DEV_MIN_NUM 0 +#define AO_DEV_MAX_NUM 1 +#define AIO_MAX_NUM 1 +#define AIO_MAX_CHN_NUM 16 +#define AENC_MAX_CHN_NUM 32 +#define ADEC_MAX_CHN_NUM 32 + +/* For VPSS */ +#define VPSS_MAX_GRP_NUM 32 + +#define VPSS_MAX_PHY_CHN_NUM 4 +#define VPSS_MAX_EXT_CHN_NUM 8 +#define VPSS_MAX_CHN_NUM (VPSS_MAX_PHY_CHN_NUM + VPSS_MAX_EXT_CHN_NUM) + +/* For pciv, hi3516a not support */ +#define PCIV_MAX_CHN_NUM 0 /* max pciv channel number in each pciv device */ + + +/* VB size calculate for compressed frame. + [param input] + w: width + h: height + fmt: pixel format, 0: SP420, 1: SP422 + z: compress mode, 0: no compress, 1: default compress + [param output] + size: vb blk size + */ +#define VB_W_ALIGN 16 +#define VB_H_ALIGN 2 +#define VB_HEADER_STRIDE 16 +#define VB_ALIGN(x, a) ((a) * (((x) + (a) - 1) / (a))) + +#define VB_PIC_Y_HEADER_SIZE(Width, Height, size)\ + do{\ + size = VB_HEADER_STRIDE * (Height);\ + }while(0) + +#define VB_PIC_HEADER_SIZE(Width, Height, Type, size)\ + do{\ + if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == Type || PIXEL_FORMAT_RGB_BAYER == Type )\ + {\ + size = VB_HEADER_STRIDE * (Height) * 2;\ + }\ + else if(PIXEL_FORMAT_YUV_SEMIPLANAR_420 == Type)\ + {\ + size = (VB_HEADER_STRIDE * (Height) * 3) >> 1;\ + }\ + else if(PIXEL_FORMAT_SINGLE == Type)\ + {\ + size = VB_HEADER_STRIDE * (Height);\ + }\ + }while(0) + +#define VB_PIC_BLK_SIZE(Width, Height, Type, size)\ + do{\ + unsigned int u32AlignWidth;\ + unsigned int u32AlignHeight;\ + unsigned int u32HeadSize;\ + u32AlignWidth = VB_ALIGN(Width, 16);\ + u32AlignHeight= VB_ALIGN(Height, 2);\ + u32HeadSize = VB_HEADER_STRIDE * u32AlignHeight;/* compress header stride 16 */\ + if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == Type)\ + {\ + size = (u32AlignWidth * u32AlignHeight + u32HeadSize) * 2;\ + }\ + else if (PIXEL_FORMAT_SINGLE == Type)\ + {\ + size = (u32AlignWidth * u32AlignHeight + u32HeadSize);\ + }\ + else\ + {\ + size = ((u32AlignWidth * u32AlignHeight + u32HeadSize) * 3) >> 1;\ + }\ + }while(0) + +#define VIU_GET_RAW_CHN(ViDev, RawChn)\ + do{\ + RawChn = VIU_MAX_CHN_NUM + ViDev;\ + }while(0) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_DEFINES_H__ */ + diff --git a/device/mpp/include/hi_errno.h b/device/mpp/include/hi_errno.h new file mode 100644 index 0000000..8ab3aa0 --- /dev/null +++ b/device/mpp/include/hi_errno.h @@ -0,0 +1,131 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_common.h +Version : Initial Draft +Author : Hi3511 MPP Team +Created : 2006/11/09 +Last Modified : +Description : define the format of error code +Function List : +History : + 1.Date : 2007/02/14 + Author : c42025 + Modification: Created file + + 2.Date : 2007/12/11 + Author : c42025 + Modification: add some MOD_ID for several modules + + 3.Date : 2008/02/03 + Author : c42025 + Modification: reoorder MOD_ID to cleanup modules at specified order + + 4.Date : 2008/03/01 + Author : c42025 + Modification: move LOG_ERRLEVEL_E to hi_debug.h, and add new definion + ERR_LEVLE_E, we should use this enumeration in our error code. + + 5.Date : 2008/04/30 + Author : c42025 + Modification: delete two error code "EN_ERR_NOCHN" and "EN_ERR_NODEV". + +******************************************************************************/ +#ifndef __HI_ERRNO_H__ +#define __HI_ERRNO_H__ + +#include "hi_debug.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +/* 1010 0000b + * VTOP use APPID from 0~31 + * so, hisilicon use APPID based on 32 + */ +#define HI_ERR_APPID (0x80000000L + 0x20000000L) + +typedef enum hiERR_LEVEL_E +{ + EN_ERR_LEVEL_DEBUG = 0, /* debug-level */ + EN_ERR_LEVEL_INFO, /* informational */ + EN_ERR_LEVEL_NOTICE, /* normal but significant condition */ + EN_ERR_LEVEL_WARNING, /* warning conditions */ + EN_ERR_LEVEL_ERROR, /* error conditions */ + EN_ERR_LEVEL_CRIT, /* critical conditions */ + EN_ERR_LEVEL_ALERT, /* action must be taken immediately */ + EN_ERR_LEVEL_FATAL, /* just for compatibility with previous version */ + EN_ERR_LEVEL_BUTT +}ERR_LEVEL_E; + + +/****************************************************************************** +|----------------------------------------------------------------| +| 1 | APP_ID | MOD_ID | ERR_LEVEL | ERR_ID | +|----------------------------------------------------------------| +|<--><--7bits----><----8bits---><--3bits---><------13bits------->| +******************************************************************************/ + +#define HI_DEF_ERR( module, level, errid) \ + ((HI_S32)( (HI_ERR_APPID) | ((module) << 16 ) | ((level)<<13) | (errid) )) + +/* NOTE! the following defined all common error code, +** all module must reserved 0~63 for their common error code +*/ +typedef enum hiEN_ERR_CODE_E +{ + EN_ERR_INVALID_DEVID = 1, /* invlalid device ID */ + EN_ERR_INVALID_CHNID = 2, /* invlalid channel ID */ + EN_ERR_ILLEGAL_PARAM = 3, /* at lease one parameter is illagal + * eg, an illegal enumeration value */ + EN_ERR_EXIST = 4, /* resource exists */ + EN_ERR_UNEXIST = 5, /* resource unexists */ + + EN_ERR_NULL_PTR = 6, /* using a NULL point */ + + EN_ERR_NOT_CONFIG = 7, /* try to enable or initialize system, device + ** or channel, before configing attribute */ + + EN_ERR_NOT_SUPPORT = 8, /* operation or type is not supported by NOW */ + EN_ERR_NOT_PERM = 9, /* operation is not permitted + ** eg, try to change static attribute */ + + EN_ERR_NOMEM = 12,/* failure caused by malloc memory */ + EN_ERR_NOBUF = 13,/* failure caused by malloc buffer */ + + EN_ERR_BUF_EMPTY = 14,/* no data in buffer */ + EN_ERR_BUF_FULL = 15,/* no buffer for new data */ + + EN_ERR_SYS_NOTREADY = 16,/* System is not ready,maybe not initialed or + ** loaded. Returning the error code when opening + ** a device file failed. */ + + EN_ERR_BADADDR = 17,/* bad address, + ** eg. used for copy_from_user & copy_to_user */ + + EN_ERR_BUSY = 18,/* resource is busy, + ** eg. destroy a venc chn without unregister it */ + + EN_ERR_BUTT = 63,/* maxium code, private error code of all modules + ** must be greater than it */ +}EN_ERR_CODE_E; + + +/* +** following is an example for defining error code of VDA module +** #define HI_ERR_MD_INVALID_CHNID HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +** +*/ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_ERRNO_H__ */ + diff --git a/device/mpp/include/hi_i2c.h b/device/mpp/include/hi_i2c.h new file mode 100644 index 0000000..a7def0e --- /dev/null +++ b/device/mpp/include/hi_i2c.h @@ -0,0 +1,43 @@ +#ifndef _HI_I2C_H +#define _HI_I2C_H + + + +/* /dev/i2c-X ioctl commands. The ioctl's parameter is always an + * unsigned long, except for: + * - I2C_FUNCS, takes pointer to an unsigned long + * - I2C_RDWR, takes pointer to struct i2c_rdwr_ioctl_data + * - I2C_SMBUS, takes pointer to struct i2c_smbus_ioctl_data + */ +#define I2C_RETRIES 0x0701 /* number of times a device address should + be polled when not acknowledging */ +#define I2C_TIMEOUT 0x0702 /* set timeout in units of 10 ms */ + +/* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses + * are NOT supported! (due to code brokenness) + */ +#define I2C_SLAVE 0x0703 /* Use this slave address */ +#define I2C_SLAVE_FORCE 0x0706 /* Use this slave address, even if it + is already in use by a driver! */ +#define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */ + +#define I2C_FUNCS 0x0705 /* Get the adapter functionality mask */ + +#define I2C_RDWR 0x0707 /* Combined R/W transfer (one STOP only) */ + +#define I2C_PEC 0x0708 /* != 0 to use PEC with SMBus */ +#define I2C_SMBUS 0x0720 /* SMBus transfer */ +#define I2C_16BIT_REG 0x0709 /* 16BIT REG WIDTH */ +#define I2C_16BIT_DATA 0x070a /* 16BIT DATA WIDTH */ + +typedef struct hiI2C_DATA_S +{ + unsigned char dev_addr; + unsigned int reg_addr; + unsigned int addr_byte_num; + unsigned int data; + unsigned int data_byte_num; +}I2C_DATA_S; + +#endif + diff --git a/device/mpp/include/hi_io.h b/device/mpp/include/hi_io.h new file mode 100644 index 0000000..c5e6e68 --- /dev/null +++ b/device/mpp/include/hi_io.h @@ -0,0 +1,78 @@ +#ifndef __HI_IO_H__ +#define __HI_IO_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* user and kernel are different. */ +HI_U8 IO_READ8(HI_U32 u32Addr); +HI_S32 IO_WRITE8(HI_U32 u32Addr, HI_U32 u32Value); +HI_U16 IO_READ16(HI_U32 u32Addr); +HI_S32 IO_WRITE16(HI_U32 u32Addr, HI_U32 u32Value); +HI_U32 IO_READ32(HI_U32 u32Addr); +HI_S32 IO_WRITE32(HI_U32 u32Addr, HI_U32 u32Value); +HI_U32 ISP_Mmap(void); +HI_U32 ISP_Munmap(void); +HI_U32 ISP_GetExtRegAddr(void); +//HI_VOID HI_RegSetBitEx(unsigned long value, unsigned long offset, +// unsigned long length, unsigned long addr); +//HI_VOID HI_RegRead(unsigned long *pvalue, unsigned long addr); + +static __inline HI_VOID HI_RegWrite32(unsigned long value, unsigned long mask, + HI_U32 addr) +{ + unsigned long t; + + t = readl(addr); + t &= ~mask; + t |= value & mask; + writel(t, addr); +} + +static __inline HI_VOID HI_RegSetBitEx(unsigned long value, unsigned long offset, + unsigned long length, unsigned long addr) +{ + unsigned long mask; + mask = ((1 << length) - 1) << offset; + value = value << offset; + HI_RegWrite32(value, mask, addr); +} + +static __inline HI_VOID HI_RegRead(unsigned long *pvalue, unsigned long addr) +{ + *pvalue = readl(addr); +} + +#define REG_ACCESS_WIDTH 0 // 1: 16bit 2: 8bit +#define EXT_REG_BASE 0x10200 +#define ISP_REG_BASE_ADDR 0x205a0000 + +#define EXT_REG_BASE_ISP 0x8000 +#define EXT_REG_BASE_VIU 0x8400 +#define EXT_REG_BASE_VPP 0x8600 +#define EXT_REG_BASE_VEDU 0x8800 +#define EXT_REG_BASE_VOU 0x8A00 + +/* Dynamic bus access functions, 4 byte align access */ +//TODO: allocate dev addr (such as ISP_REG_BASE_ADDR) according to devId. +#define __IO_CALC_ADDRESS_DYNAMIC(BASE, OFFSET) ((HI_U32)(((BASE >= EXT_REG_BASE)? 0 : ISP_REG_BASE_ADDR) + ((((BASE >= EXT_REG_BASE)? (BASE - EXT_REG_BASE) : BASE) + OFFSET)< lowThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_TRUNC = 0x1, /*srcVal <= lowThr, dstVal = srcVal; srcVal > lowThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_TO_MINVAL = 0x2, /*srcVal <= lowThr, dstVal = minVal; srcVal > lowThr, dstVal = srcVal.*/ + + IVE_THRESH_MODE_MIN_MID_MAX = 0x3, /*srcVal <= lowThr, dstVal = minVal; lowThr < srcVal <= highThr, dstVal = midVal; srcVal > highThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_ORI_MID_MAX = 0x4, /*srcVal <= lowThr, dstVal = srcVal; lowThr < srcVal <= highThr, dstVal = midVal; srcVal > highThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_MIN_MID_ORI = 0x5, /*srcVal <= lowThr, dstVal = minVal; lowThr < srcVal <= highThr, dstVal = midVal; srcVal > highThr, dstVal = srcVal.*/ + IVE_THRESH_MODE_MIN_ORI_MAX = 0x6, /*srcVal <= lowThr, dstVal = minVal; lowThr < srcVal <= highThr, dstVal = srcVal; srcVal > highThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_ORI_MID_ORI = 0x7, /*srcVal <= lowThr, dstVal = srcVal; lowThr < srcVal <= highThr, dstVal = midVal; srcVal > highThr, dstVal = srcVal.*/ + + IVE_THRESH_MODE_BUTT +}IVE_THRESH_MODE_E; + +/* +* Thresh control parameters. +* Modified by Tan Bing, 2013-7-22 +*/ +typedef struct hiIVE_THRESH_CTRL_S +{ + IVE_THRESH_MODE_E enMode; + HI_U8 u8LowThr; /*user-defined threshold, 0<=u8LowThr<=255 */ + HI_U8 u8HighThr; /*user-defined threshold, if enMode0' and 'label = ArrayIndex+1'*/ +}IVE_CCBLOB_S; + +/* +*CCL control struct +*/ +typedef struct hiIVE_CCL_CTRL_S +{ + HI_U16 u16InitAreaThr; /*Init threshold of region area*/ + HI_U16 u16Step; /*Increase area step for once*/ +}IVE_CCL_CTRL_S; + +/* +*GMM control struct +*/ +typedef struct hiIVE_GMM_CTRL_S +{ + HI_U22Q10 u22q10NoiseVar; /*Initial noise Variance*/ + HI_U22Q10 u22q10MaxVar; /*Max Variance*/ + HI_U22Q10 u22q10MinVar; /*Min Variance*/ + HI_U0Q16 u0q16LearnRate; /*Learning rate*/ + HI_U0Q16 u0q16BgRatio; /*Background ratio*/ + HI_U8Q8 u8q8VarThr; /*Variance Threshold*/ + HI_U0Q16 u0q16InitWeight; /*Initial Weight*/ + HI_U8 u8ModelNum; /*Model number: 3 or 5*/ +}IVE_GMM_CTRL_S; + +/* +*CannyHysEdge control struct +*/ +typedef struct hiIVE_CANNY_HYS_EDGE_CTRL_S +{ + IVE_MEM_INFO_S stMem; + HI_U16 u16LowThr; + HI_U16 u16HighThr; + HI_S8 as8Mask[25]; +} IVE_CANNY_HYS_EDGE_CTRL_S; + +/* +*Canny stack size struct +*/ +typedef struct hiIVE_CANNY_STACK_SIZE_S +{ + HI_U32 u32StackSize; /*Stack size for output*/ + HI_U8 u8Reserved[12]; /*For 16 byte align*/ +}IVE_CANNY_STACK_SIZE_S; + +/* +*LBP compare mode +*/ +typedef enum hiIVE_LBP_CMP_MODE_E +{ + IVE_LBP_CMP_MODE_NORMAL = 0x0, /* P(x)-P(center)>= un8BitThr.s8Val, s(x)=1; else s(x)=0; */ + IVE_LBP_CMP_MODE_ABS = 0x1, /* Abs(P(x)-P(center))>=un8BitThr.u8Val, s(x)=1; else s(x)=0; */ + + IVE_LBP_CMP_MODE_BUTT +}IVE_LBP_CMP_MODE_E; + +/* +*LBP control struct +*/ +typedef struct hiIVE_LBP_CTRL_S +{ + IVE_LBP_CMP_MODE_E enMode; + IVE_8BIT_U un8BitThr; +}IVE_LBP_CTRL_S; + +/* +*Type of the GradientFilter output format +*/ +typedef enum hiIVE_NORM_GRAD_OUT_CTRL_E +{ + IVE_NORM_GRAD_OUT_CTRL_HOR_AND_VER = 0x0, + IVE_NORM_GRAD_OUT_CTRL_HOR = 0x1, + IVE_NORM_GRAD_OUT_CTRL_VER = 0x2, + IVE_NORM_GRAD_OUT_CTRL_COMBINE = 0x3, + + IVE_NORM_GRAD_OUT_CTRL_BUTT +}IVE_NORM_GRAD_OUT_CTRL_E; + +/* +*GradientFilter control parameters +*/ +typedef struct hiIVE_NORM_GRAD_CTRL_S +{ + IVE_NORM_GRAD_OUT_CTRL_E enOutCtrl; + HI_S8 as8Mask[25]; + HI_U8 u8Norm; +}IVE_NORM_GRAD_CTRL_S; + +/* +* LKOpticalFlow movement +*/ +typedef struct hiIVE_MV_S9Q7_S +{ + HI_S32 s32Status; /*Result of tracking: 0-success; -1-failure*/ + HI_S9Q7 s9q7Dx; /*X-direction component of the movement*/ + HI_S9Q7 s9q7Dy; /*Y-direction component of the movement*/ +}IVE_MV_S9Q7_S; + +typedef struct hiIVE_LK_OPTICAL_FLOW_CTRL_S +{ + HI_U16 u16CornerNum; /*Number of the feature points,<200*/ + HI_U0Q8 u0q8MinEigThr; /*Minimum eigenvalue threshold*/ + HI_U8 u8IterCount; /*Maximum iteration times*/ + HI_U0Q8 u0q8Epsilon; /*Threshold of iteration for dx^2 + dy^2 < u0q8Epsilon */ +}IVE_LK_OPTICAL_FLOW_CTRL_S; + +typedef struct hiIVE_ST_MAX_EIG_S +{ + HI_U16 u16MaxEig; /*Shi-Tomasi second step output MaxEig*/ + HI_U8 u8Reserved[14]; /*For 16 byte align*/ +}IVE_ST_MAX_EIG_S; + +/* +*ShiTomasi control parameters +*/ +typedef struct hiIVE_ST_CANDI_CORNER_CTRL_S +{ + IVE_MEM_INFO_S stMem; + HI_U0Q8 u0q8QualityLevel; +}IVE_ST_CANDI_CORNER_CTRL_S; + +typedef struct hiIVE_ST_CORNER_INFO_S +{ + HI_U16 u16CornerNum; + IVE_POINT_U16_S astCorner[IVE_ST_MAX_CORNER_NUM]; +}IVE_ST_CORNER_INFO_S; + +typedef struct hiIVE_ST_CORNER_CTRL_S +{ + HI_U16 u16MaxCornerNum; + HI_U16 u16MinDist; +}IVE_ST_CORNER_CTRL_S; + +/* +* GradFg mode enum +*/ +typedef enum hiIVE_GRAD_FG_MODE_E +{ + IVE_GRAD_FG_MODE_USE_CUR_GRAD = 0x0, + IVE_GRAD_FG_MODE_FIND_MIN_GRAD = 0x1, + + IVE_GRAD_FG_MODE_BUTT +}IVE_GRAD_FG_MODE_E; + +/* +* GradFg ctrl struct +*/ +typedef struct hiIVE_GRAD_FG_CTRL_S +{ + IVE_GRAD_FG_MODE_E enMode; /*Calculation mode*/ + HI_U16 u16EdwFactor; /*Edge width adjustment factor (range: 500 to 2000; default: 1000)*/ + HI_U8 u8CrlCoefThr; /*Gradient vector correlation coefficient threshold (ranges: 50 to 100; default: 80)*/ + HI_U8 u8MagCrlThr; /*Gradient amplitude threshold (range: 0 to 20; default: 4)*/ + HI_U8 u8MinMagDiff; /*Gradient magnitude difference threshold (range: 2 to 8; default: 2)*/ + HI_U8 u8NoiseVal; /*Gradient amplitude noise threshold (range: 1 to 8; default: 1)*/ + HI_U8 u8EdwDark; /*Black pixels enable flag (range: 0 (no), 1 (yes); default: 1)*/ +}IVE_GRAD_FG_CTRL_S; + +typedef struct hiIVE_CANDI_BG_PIX_S +{ + HI_U8Q4F4 u8q4f4Mean; /*Candidate background grays value */ + HI_U16 u16StartTime; /*Candidate Background start time */ + HI_U16 u16SumAccessTime; /*Candidate Background cumulative access time */ + HI_U16 u16ShortKeepTime; /*Candidate background short hold time*/ + HI_U8 u8ChgCond; /*Time condition for candidate background into the changing state*/ + HI_U8 u8PotenBgLife; /*Potential background cumulative access time */ +}IVE_CANDI_BG_PIX_S; + +typedef struct hiIVE_WORK_BG_PIX_S +{ + HI_U8Q4F4 u8q4f4Mean; /*0# background grays value */ + HI_U16 u16AccTime; /*Background cumulative access time */ + HI_U8 u8PreGray; /*Gray value of last pixel */ + HI_U5Q3 u5q3DiffThr; /*Differential threshold */ + HI_U8 u8AccFlag; /*Background access flag */ + HI_U8 u8BgGray[3]; /*1# ~ 3# background grays value */ +}IVE_WORK_BG_PIX_S; + +typedef struct hiIVE_BG_LIFE_S +{ + HI_U8 u8WorkBgLife[3]; /*1# ~ 3# background vitality */ + HI_U8 u8CandiBgLife; /*Candidate background vitality */ +}IVE_BG_LIFE_S; + +typedef struct hiIVE_BG_MODEL_PIX_S +{ + IVE_WORK_BG_PIX_S stWorkBgPixel; /*Working background */ + IVE_CANDI_BG_PIX_S stCandiPixel; /*Candidate background */ + IVE_BG_LIFE_S stBgLife; /*Background vitality */ +}IVE_BG_MODEL_PIX_S; + +typedef struct hiIVE_FG_STAT_DATA_S +{ + HI_U32 u32PixNum; + HI_U32 u32SumLum; + HI_U8 u8Reserved[8]; +}IVE_FG_STAT_DATA_S; + +typedef struct hiIVE_BG_STAT_DATA_S +{ + HI_U32 u32PixNum; + HI_U32 u32SumLum; + HI_U8 u8Reserved[8]; +}IVE_BG_STAT_DATA_S; + +typedef struct hiIVE_MATCH_BG_MODEL_CTRL_S +{ + HI_U32 u32CurFrmNum; /*Current frame timestamp, in frame units */ + HI_U32 u32PreFrmNum; /*Previous frame timestamp, in frame units */ + HI_U16 u16TimeThr; /*Potential background replacement time threshold (range: 2 to 100 frames; default: 20) */ + + HI_U8 u8DiffThrCrlCoef; /*Correlation coefficients between differential threshold and gray value (range: 0 to 5; default: 0) */ + HI_U8 u8DiffMaxThr; /*Maximum of background differential threshold (range: 3 to 15; default: 6) */ + HI_U8 u8DiffMinThr; /*Minimum of background differential threshold (range: 3 to 15; default: 4) */ + HI_U8 u8DiffThrInc; /*Dynamic Background differential threshold increment (range: 0 to 6; default: 0) */ + HI_U8 u8FastLearnRate; /*Quick background learning rate (range: 0 to 4; default: 2) */ + HI_U8 u8DetChgRegion; /*Whether to detect change region (range: 0 (no), 1 (yes); default: 0) */ +}IVE_MATCH_BG_MODEL_CTRL_S; + +typedef struct hiIVE_UPDATE_BG_MODEL_CTRL_S +{ + HI_U32 u32CurFrmNum; /*Current frame timestamp, in frame units */ + HI_U32 u32PreChkTime; /*The last time when background status is checked */ + HI_U32 u32FrmChkPeriod; /*Background status checking period (range: 0 to 2000 frames; default: 50) */ + + HI_U32 u32InitMinTime; /*Background initialization shortest time (range: 20 to 6000 frames; default: 100)*/ + HI_U32 u32StyBgMinBlendTime; /*Steady background integration shortest time (range: 20 to 6000 frames; default: 200)*/ + HI_U32 u32StyBgMaxBlendTime; /*Steady background integration longest time (range: 20 to 40000 frames; default: 1500)*/ + HI_U32 u32DynBgMinBlendTime; /*Dynamic background integration shortest time (range: 0 to 6000 frames; default: 0)*/ + HI_U32 u32StaticDetMinTime; /*Still detection shortest time (range: 20 to 6000 frames; default: 80)*/ + HI_U16 u16FgMaxFadeTime; /*Foreground disappearing longest time (range: 1 to 255 seconds; default: 15)*/ + HI_U16 u16BgMaxFadeTime; /*Background disappearing longest time (range: 1 to 255 seconds ; default: 60)*/ + + HI_U8 u8StyBgAccTimeRateThr; /*Steady background access time ratio threshold (range: 10 to 100; default: 80)*/ + HI_U8 u8ChgBgAccTimeRateThr; /*Change background access time ratio threshold (range: 10 to 100; default: 60)*/ + HI_U8 u8DynBgAccTimeThr; /*Dynamic background access time ratio threshold (range: 0 to 50; default: 0)*/ + HI_U8 u8DynBgDepth; /*Dynamic background depth (range: 0 to 3; default: 3)*/ + HI_U8 u8BgEffStaRateThr; /*Background state time ratio threshold when initializing (range: 90 to 100; default: 90)*/ + + HI_U8 u8AcceBgLearn; /*Whether to accelerate background learning (range: 0 (no), 1 (yes); default: 0)*/ + HI_U8 u8DetChgRegion; /*Whether to detect change region (range: 0 (no), 1 (yes); default: 0)*/ +} IVE_UPDATE_BG_MODEL_CTRL_S; + + +typedef enum hiIVE_ANN_MLP_ACTIV_FUNC_E +{ + IVE_ANN_MLP_ACTIV_FUNC_IDENTITY = 0x0, + IVE_ANN_MLP_ACTIV_FUNC_SIGMOID_SYM = 0x1, + IVE_ANN_MLP_ACTIV_FUNC_GAUSSIAN = 0x2, + + IVE_ANN_MLP_ACTIV_FUNC_BUTT +}IVE_ANN_MLP_ACTIV_FUNC_E; + +typedef struct hiIVE_ANN_MLP_MODEL_S +{ + IVE_ANN_MLP_ACTIV_FUNC_E enActivFunc; + IVE_MEM_INFO_S stWeight; + HI_U32 u32TotalWeightSize; + + HI_U16 au16LayerCount[8]; /*8 layers, including input and output layer, every layerCount<=256*/ + HI_U16 u16MaxCount; /*MaxCount<=256*/ + HI_U8 u8LayerNum; /*2 u16Thr, dstVal = maxVal.*/ + HI_U8 u8MinVal; /*Min value*/ + HI_U8 u8MaxVal; /*Max value*/ +}IVE_SAD_CTRL_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif +#endif/*_HI_IVE_H_*/ \ No newline at end of file diff --git a/device/mpp/include/hi_math.h b/device/mpp/include/hi_math.h new file mode 100644 index 0000000..2b3e3a7 --- /dev/null +++ b/device/mpp/include/hi_math.h @@ -0,0 +1,292 @@ +/****************************************************************************** + + Copyright (C), 2009-2019, Huawei Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_math.h + Version : Initial Draft + Author : c55300 + Created : 2009/04/09 + Last Modified : + Description : mathematical functions. + Function List : + History : + 1.Date : 2009/04/09 + Author : c55300 + Modification: Created file + + 2.Date : 2009/05/04 + Author : c55300 + Modification: Add ENDIAN and VALUE_BETWEEN. + + 3.Date : 2009/05/21 + Author : c55300 + Modification: Add macro of FRACTION operation and CMP. + +******************************************************************************/ +#ifndef __HI_MATH_H__ +#define __HI_MATH_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/****************************************************************************** +** ABS(x) absolute value of x +** SIGN(x) sign of x +** CMP(x,y) 0 if x==y; 1 if x>y; -1 if x= 0 ? (x) : (-(x)) ) +#define SIGN(x) ( (x) >= 0 ? 1 : -1 ) +#define CMP(x,y) (((x) == (y)) ? 0 : (((x) > (y)) ? 1 : -1)) + +/****************************************************************************** +** MAX2(x,y) maximum of x and y +** MIN2(x,y) minimum of x and y +** MAX3(x,y,z) maximum of x, y and z +** MIN3(x,y,z) minimun of x, y and z +** MEDIAN(x,y,z) median of x,y,z +** MEAN2(x,y) mean of x,y +******************************************************************************/ +#define MAX2(x,y) ( (x)>(y) ? (x):(y) ) +#define MIN2(x,y) ( (x)<(y) ? (x):(y) ) +#define MAX3(x,y,z) ( (x)>(y) ? MAX2(x,z) : MAX2(y,z) ) +#define MIN3(x,y,z) ( (x)<(y) ? MIN2(x,z) : MIN2(y,z) ) +#define MEDIAN(x,y,z) (((x)+(y)+(z) - MAX3(x,y,z)) - MIN3(x,y,z) ) +#define MEAN2(x,y) (((x)+(y)) >> 1 ) + +/****************************************************************************** +** CLIP3(x,min,max) clip x within [min,max] +** WRAP_MAX(x,max,min) wrap to min if x equal max +** WRAP_MIN(x,min,max) wrap to max if x equal min +** VALUE_BETWEEN(x,min.max) True if x is between [min,max] inclusively. +******************************************************************************/ +#define CLIP3(x,min,max) ( (x)< (min) ? (min) : ((x)>(max)?(max):(x)) ) +#define WRAP_MAX(x,max,min) ( (x)>=(max) ? (min) : (x) ) +#define WRAP_MIN(x,min,max) ( (x)<=(min) ? (max) : (x) ) +#define VALUE_BETWEEN(x,min,max) (((x)>=(min)) && ((x) <= (max))) + +/****************************************************************************** +** MULTI_OF_2_POWER(x,a) whether x is multiple of a(a must be power of 2) +** CEILING_2_POWER(x,a) ceiling x to multiple of a(a must be power of 2) +** FLOOR_2_POWER(x,a) floor x to multiple of a(a must be power of 2) +** HIALIGN(x, a) align x to multiple of a +** +** Example: +** CEILING_2_POWER(5,4) = 8 +** FLOOR_2_POWER(5,4) = 4 +******************************************************************************/ +#define MULTI_OF_2_POWER(x,a) (!((x) & ((a) - 1) ) ) +#define CEILING_2_POWER(x,a) ( ((x) + ((a) - 1) ) & ( ~((a) - 1) ) ) +#define FLOOR_2_POWER(x,a) ( (x) & (~((a) - 1) ) ) +#define HIALIGN(x, a) ((a) * (((x) + (a) - 1) / (a))) +#define HICEILING(x, a) (((x)+(a)-1)/(a)) + +/****************************************************************************** +** Get the span between two unsinged number, such as +** SPAN(HI_U32, 100, 200) is 200 - 100 = 100 +** SPAN(HI_U32, 200, 100) is 0xFFFFFFFF - 200 + 100 +** SPAN(HI_U64, 200, 100) is 0xFFFFFFFFFFFFFFFF - 200 + 100 +******************************************************************************/ +#define SPAN(type, begin, end)\ +({ \ + type b = (begin); \ + type e = (end); \ + (type)((b >= e) ? (b - e) : (b + ((~((type)0))-e))); \ +}) + +/****************************************************************************** +** ENDIAN32(x,y) little endian <---> big endian +** IS_LITTLE_END() whether the system is little end mode +******************************************************************************/ +#define ENDIAN32( x ) \ + ( ( (x) << 24 ) | \ + ( ( (x) & 0x0000ff00 ) << 8 ) | \ + ( ( (x) & 0x00ff0000 ) >> 8 ) | \ + ( ( (x) >> 24 ) & 0x000000ff ) ) + +__inline static HI_BOOL IS_LITTLE_END(void) +{ + union unEND_TEST_U + { + HI_CHAR cTest[4]; + HI_U32 u32Test; + } unEndTest; + + unEndTest.cTest[0] = 0x01; + unEndTest.cTest[1] = 0x02; + unEndTest.cTest[2] = 0x03; + unEndTest.cTest[3] = 0x04; + + return (unEndTest.u32Test > 0x01020304) ? (HI_TRUE) : (HI_FALSE); +} + + +/****************************************************************************** +** FRACTION32(de,nu) fraction: nu(minator) / de(nominator). +** NUMERATOR32(x) of x(x is fraction) +** DENOMINATOR32(x) Denominator of x(x is fraction) + +** represent fraction in 32 bit. LSB 16 is numerator, MSB 16 is denominator +** It is integer if denominator is 0. +******************************************************************************/ +#define FRACTION32(de,nu) ( ((de) << 16) | (nu) ) +#define NUMERATOR32(x) ( (x) & 0xffff) +#define DENOMINATOR32(x) ( (x) >> 16 ) + +/****************************************************************************** +** RGB(r,g,b) assemble the r,g,b to 24bit color +** RGB_R(c) get RED from 24bit color +** RGB_G(c) get GREEN from 24bit color +** RGB_B(c) get BLUE from 24bit color +******************************************************************************/ +#define RGB(r,g,b) ((((r) & 0xff) << 16) | (((g) & 0xff) << 8) | ((b) & 0xff)) +#define RGB_R(c) ( ((c) & 0xff0000) >> 16) +#define RGB_G(c) ( ((c) & 0xff00) >> 8) +#define RGB_B(c) ( (c) & 0xff) + +/****************************************************************************** +** YUV(y,u,v) assemble the y,u,v to 24bit color +** YUV_Y(c) get Y from 24bit color +** YUV_U(c) get U from 24bit color +** YUV_V(c) get V from 24bit color +******************************************************************************/ +#define YUV(y,u,v) ((((y) & 0xff) << 16) | (((u) & 0xff) << 8) | ((v) & 0xff)) +#define YUV_Y(c) ( ((c) & 0xff0000) >> 16) +#define YUV_U(c) ( ((c) & 0xff00) >> 8) +#define YUV_V(c) ( (c) & 0xff) + +/****************************************************************************** +** Rgb2Yc(r, g, b, *y, *u, *u) convert r,g,b to y,u,v +** Rgb2Yuv(rgb, *yuv) convert rgb to yuv +******************************************************************************/ +__inline static HI_VOID Rgb2Yc(HI_U8 r, HI_U8 g, HI_U8 b, HI_U8 * py, HI_U8 * pcb, HI_U8 * pcr) +{ + /* Y */ + *py = (HI_U8)(((r*66+g*129+b*25) >> 8) + 16); + + /* Cb */ + *pcb = (HI_U8)((((b*112-r*38)-g*74) >> 8) + 128); + + /* Cr */ + *pcr = (HI_U8)((((r*112-g*94)-b*18) >> 8) + 128); +} + +__inline static HI_U32 Rgb2Yuv(HI_U32 u32Rgb) +{ + HI_U8 y,u,v; + + Rgb2Yc(RGB_R(u32Rgb), RGB_G(u32Rgb), RGB_B(u32Rgb), &y, &u, &v); + + return YUV(y,u,v); +} + +/****************************************************************************** +** GetYCFromRGB(rgb, *y, *cbcr) convert rgb to yyyy, uvuv, +******************************************************************************/ +__inline static HI_VOID GetYCFromRGB(HI_U32 rgb, HI_U32 * pY, HI_U32 * pC) +{ + HI_U8 y, cb, cr; + HI_U32 color_y, color_c, tmp; + + Rgb2Yc(RGB_R(rgb), RGB_G(rgb), RGB_B(rgb), &y, &cb, &cr); + + tmp = y & 0xFF; + color_y = (tmp<<24) + (tmp<<16) + (tmp<<8) + tmp; + + tmp = cb & 0xFF; + color_c = (tmp<<24) + (tmp<<8); + + tmp = cr & 0xFF; + color_c = color_c + (tmp<<16) + tmp; + + *pY = color_y; + *pC = color_c; +} + +/******************************************************************************* +** FpsControl Useing Sample: +** FPS_CTRL_S g_stFpsCtrl; +** +** Take 12 frame uniform in 25. +** InitFps(&g_stFpsCtrl, 25, 12); +** +** { +** if(FpsControl(&g_stFpsCtrl)) printf("Yes, this frmae should be token"); +** } +** +*******************************************************************************/ +typedef struct hiFPS_CTRL_S +{ + HI_U32 u32Ffps; /* Full frame rate */ + HI_U32 u32Tfps; /* Target frame rate */ + HI_U32 u32FrmKey; /* update key frame */ +} FPS_CTRL_S; + +__inline static HI_VOID InitFps(FPS_CTRL_S *pFrmCtrl, HI_U32 u32FullFps, + HI_U32 u32TagFps) +{ + pFrmCtrl->u32Ffps = u32FullFps; + pFrmCtrl->u32Tfps = u32TagFps; + pFrmCtrl->u32FrmKey = 0; +} + +__inline static HI_BOOL FpsControl(FPS_CTRL_S *pFrmCtrl) +{ + HI_BOOL bReturn = HI_FALSE; + + pFrmCtrl->u32FrmKey += pFrmCtrl->u32Tfps; + if (pFrmCtrl->u32FrmKey >= pFrmCtrl->u32Ffps) + { + pFrmCtrl->u32FrmKey -= pFrmCtrl->u32Ffps; + bReturn = HI_TRUE; + } + + return bReturn; +} + +/******************************************************************************* +** GetSysTimeBySec +** GetSysTimeByUsec +*******************************************************************************/ +#ifdef __KERNEL__ + #include +#else + #include +#endif +__inline static HI_U32 GetSysTimeBySec(void) +{ + struct timeval stTime; + #ifdef __KERNEL__ + do_gettimeofday(&stTime); + #else + gettimeofday(&stTime, NULL); + #endif + return stTime.tv_sec; +} + +__inline static HI_U64 GetSysTimeByUsec(void) +{ + struct timeval stTime; + #ifdef __KERNEL__ + do_gettimeofday(&stTime); + #else + gettimeofday(&stTime, NULL); + #endif + return (stTime.tv_sec * 1000000LLU) + stTime.tv_usec; +} + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __HI_MATH_H__ */ + diff --git a/device/mpp/include/hi_md.h b/device/mpp/include/hi_md.h new file mode 100644 index 0000000..d719e38 --- /dev/null +++ b/device/mpp/include/hi_md.h @@ -0,0 +1,56 @@ +/****************************************************************************** + + Copyright (C), 2001-2014, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_md.h + Version : Initial Draft + Author : Hisilicon multimedia software (IVE) group + Created : 2014/11/10 + Description : + History : + 1.Date : 2014/11/10 + Author : c00211359 + Modification: Created file +******************************************************************************/ +#ifndef _HI_MD_H_ +#define _HI_MD_H_ + +#include "hi_ive.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif +/* +* Definition md algorithm mode +*/ +typedef enum hiMD_ALG_MODE_E +{ + MD_ALG_MODE_BG = 0x0,/*Base on background image*/ + MD_ALG_MODE_REF = 0x1,/*Base on reference image*/ + + MD_ALG_MODE_BUTT +}MD_ALG_MODE_E; +/* +* Definition of md attribute +*/ +typedef struct hiMD_ATTR_S +{ + MD_ALG_MODE_E enAlgMode; /*Md algorithm mode*/ + IVE_SAD_MODE_E enSadMode; /*Sad mode*/ + HI_U16 u16Width; /*Image width*/ + HI_U16 u16Height; /*Image height*/ + HI_U16 u16SadThr; /*Sad thresh*/ + IVE_CCL_CTRL_S stCclCtrl; /*Ccl ctrl*/ + IVE_ADD_CTRL_S stAddCtrl; /*Add ctrl*/ +}MD_ATTR_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif + +#endif/*_HI_MD_H_*/ \ No newline at end of file diff --git a/device/mpp/include/hi_mipi.h b/device/mpp/include/hi_mipi.h new file mode 100644 index 0000000..95a8ffb --- /dev/null +++ b/device/mpp/include/hi_mipi.h @@ -0,0 +1,256 @@ +#ifndef __HI_MIPI__ +#define __HI_MIPI__ + +#include "hi_type.h" + +typedef unsigned int MIPI_PHY; +typedef unsigned int COMBO_LINK; + +#define LVDS_MIN_WIDTH 32 +#define LVDS_MIN_HEIGHT 32 + +#define COMBO_MAX_LINK_NUM 2 /* hi3518ev200 has 1 links, For compatibility of Hi3516A, use 2 */ +#define COMBO_MAX_LANE_NUM 8 +#define LANE_NUM_PER_LINK 4 /* one link has 4 lanes */ + + +#define MIPI_LANE_NUM COMBO_MAX_LANE_NUM /* hi3518ev200 support 1 link mipi only, For compatibility of Hi3516A, use 2*/ +#define LVDS_LANE_NUM COMBO_MAX_LANE_NUM /* hi3518ev200 has 1 links, so has 4 lanes. For compatibility of Hi3516A, use 8 */ + + +#define WDR_VC_NUM 4 +#define SYNC_CODE_NUM 4 + +/* int mask */ +#define COMBO_LINK_INT_DEF (0x00200000) +#define COMBO_LINK_INT_MASK (0x300000) +//~(COMBO_LINK_INT_DEF) /* 0: enable int */ + +#define MIPI_INT1_INT_DEF (0x1000fff0) +//#define MIPI_INT1_MASK ~(MIPI_INT1_INT_DEF) /* 0: enable int */ + +#define MIPI_INT2_INT_DEF (0xf000) +//#define MIPI_INT2_MASK ~(MIPI_INT2_INT_DEF) /* 0: enable int */ + +#define MIPI_INT_MASK 0x0 + +//#define HI_MIPI_REG_DEBUG +//#define HI_MIPI_DEBUG +#ifdef HI_MIPI_DEBUG + +#define HI_MSG(x...) \ +do { \ + printk("%s->%d: ", __FUNCTION__, __LINE__); \ + printk(x); \ + printk("\n"); \ +} while (0) +#else + +#define HI_MSG(args...) do { } while (0) +#endif + +#define HI_ERR(x...) \ +do { \ + printk(KERN_ALERT "%s(%d): ", __FUNCTION__, __LINE__); \ + printk(KERN_ALERT x); \ + printk(KERN_ALERT "\n"); \ +} while (0) + + +typedef enum +{ + MIPI_VC0_NO_MATCH = 0x1 << 4, /*VC0ͨ֡ʼ֡ƥ*/ + MIPI_VC1_NO_MATCH = 0x1 << 5, /*VC1ͨ֡ʼ֡ƥ*/ + MIPI_VC2_NO_MATCH = 0x1 << 6, /*VC2ͨ֡ʼ֡ƥ*/ + MIPI_VC3_NO_MATCH = 0x1 << 7, /*VC3ͨ֡ʼ֡ƥ*/ + + MIPI_VC0_ORDER_ERR = 0x1 << 8, /*VC0֡*/ + MIPI_VC1_ORDER_ERR = 0x1 << 9, /*VC1֡*/ + MIPI_VC2_ORDER_ERR = 0x1 << 10, /*VC2֡*/ + MIPI_VC3_ORDER_ERR = 0x1 << 11, /*VC3֡*/ + + MIPI_VC0_FRAME_CRC = 0x1 << 12, /*һ֡УVC0ͨһCRC*/ + MIPI_VC1_FRAME_CRC = 0x1 << 13, /*һ֡УVC1ͨһCRC*/ + MIPI_VC2_FRAME_CRC = 0x1 << 14, /*һ֡УVC2ͨһCRC*/ + MIPI_VC3_FRAME_CRC = 0x1 << 15, /*һ֡УVC3ͨһCRC*/ + + MIPI_HEADER_ERR = 0x1 << 28, /*Header2ECC޷*/ +}MIPI_INT_ERR; + +typedef enum +{ + MIPI_VC0_INVALID_DT = 0x1 << 12, /*VC0ͨͲ֧*/ + MIPI_VC1_INVALID_DT = 0x1 << 13, /*VC1ͨͲ֧*/ + MIPI_VC2_INVALID_DT = 0x1 << 14, /*VC2ͨͲ֧*/ + MIPI_VC3_INVALID_DT = 0x1 << 15, /*VC3ͨͲ֧*/ +}MIPI_INT2_ERR; + +typedef enum +{ + MIPI_ESC_CLK = 0x1 << 0, /*MIPIģʽʱLink 0 clock lane escapeж״̬*/ + MIPI_ESC_D0 = 0x1 << 1, /*data lane 0 escapeж״̬*/ + MIPI_ESC_D1 = 0x1 << 2, /*data lane 1 escapeж״̬*/ + MIPI_ESC_D2 = 0x1 << 3, /*data lane 2 escapeж״̬*/ + MIPI_ESC_D3 = 0x1 << 4, /*data lane 3 escapeж״̬*/ + + MIPI_TIMEOUT_CLK = 0x1 << 8, /*clock lane FSM timeout ж״̬*/ + MIPI_TIMEOUT_D0 = 0x1 << 9, /*data lane 0 FSM timeout ж״̬*/ + MIPI_TIMEOUT_D1 = 0x1 << 10, /*data lane 1 FSM timeout ж״̬*/ + MIPI_TIMEOUT_D2 = 0x1 << 11, /*data lane 2 FSM timeout ж״̬*/ + MIPI_TIMEOUT_D3 = 0x1 << 12, /*data lane 3 FSM timeout ж״̬*/ + + MIPI_VSYNC_ERR = 0x1 << 21, /* LVDSģʽLink 0 lane ֡ͬźvsyncЧͬж״̬*/ +}LINK_INT_STAT; + +typedef enum +{ + LANE0_SYNC_ERR = 0x1, + LANE1_SYNC_ERR = 0x2, + LANE2_SYNC_ERR = 0x4, + LANE3_SYNC_ERR = 0x8, + LANE4_SYNC_ERR = 0x10, + LANE5_SYNC_ERR = 0x20, + LANE6_SYNC_ERR = 0x40, + LANE7_SYNC_ERR = 0x80, + + PHY0_LINE_SYNC_ERR = 0x100, + PHY0_FRAME_SYNC_ERR = 0x200, + PHY1_LINE_SYNC_ERR = 0x400, + PHY1_FRAME_SYNC_ERR = 0x800, + LINK_SYNC_ERR = 0x3F0000, /* link/֡ź޷ж״̬джҪlink*/ +}LVDS_SYNC_INTR_ERR; + +typedef enum +{ + OUTPUT_DATA_WIDTH_2BIT=0, + OUTPUT_DATA_WIDTH_4BIT, + OUTPUT_DATA_WIDTH_8BIT, + OUTPUT_DATA_WIDTH_BUTT +}output_data_width; + +typedef enum +{ + CLK_UP_EDGE=0, + CLK_DOWN_EDGE, + CLK_EDGE_BUTT +}clk_edge; + +typedef enum +{ + OUTPUT_NORM_MSB=0, + OUTPUT_REVERSE_MSB, + OUTPUT_MSB_BUTT +}output_msb; + +typedef enum +{ + INPUT_MODE_MIPI = 0x0, /* mipi */ + INPUT_MODE_SUBLVDS = 0x1, /* SUB_LVDS */ + INPUT_MODE_LVDS = 0x2, /* LVDS */ + INPUT_MODE_HISPI = 0x3, /* HISPI */ + INPUT_MODE_CMOS_18V = 0x4, /* CMOS 1.8V */ + INPUT_MODE_CMOS_33V = 0x5, /* CMOS 3.3V */ + INPUT_MODE_BT1120 = 0x6, /* CMOS 3.3V */ + INPUT_MODE_BYPASS = 0x7, /* MIPI Bypass */ + + INPUT_MODE_BUTT +}input_mode_t; + +typedef enum +{ + WORK_MODE_LVDS = 0x0, + WORK_MODE_MIPI = 0x1, + WORK_MODE_CMOS_18V = 0x2, + WORK_MODE_CMOS_33V = 0x4, + WORK_MODE_BT1120 = 0x4, + WORK_MODE_BUTT +}work_mode_t; + +typedef struct +{ + unsigned int width; + unsigned int height; +}img_size_t; + +typedef enum +{ + HI_WDR_MODE_NONE = 0x0, + HI_WDR_MODE_2F = 0x1, + HI_WDR_MODE_3F = 0x2, + HI_WDR_MODE_4F = 0x3, + HI_WDR_MODE_DOL_2F = 0x4, + HI_WDR_MODE_DOL_3F = 0x5, + HI_WDR_MODE_DOL_4F = 0x6, + HI_WDR_MODE_BUTT +}wdr_mode_e; + +typedef enum +{ + LVDS_ENDIAN_LITTLE = 0x0, + LVDS_ENDIAN_BIG = 0x1, + LVDS_ENDIAN_BUTT +}lvds_bit_endian; + +typedef enum +{ + LVDS_SYNC_MODE_SOL = 0, /* sensor SOL, EOL, SOF, EOF */ + LVDS_SYNC_MODE_SAV, /* SAV, EAV */ + LVDS_SYNC_MODE_BUTT +}lvds_sync_mode_e; + +typedef enum +{ + RAW_DATA_8BIT = 1, + RAW_DATA_10BIT, + RAW_DATA_12BIT, + RAW_DATA_14BIT, + RAW_DATA_BUTT +}raw_data_type_e; + +typedef struct +{ + img_size_t img_size; /* oringnal sensor input image size */ + wdr_mode_e wdr_mode; /* WDR mode */ + lvds_sync_mode_e sync_mode; /* sync mode: SOL, SAV */ + raw_data_type_e raw_data_type; /* raw data type: 8/10/12/14 bit */ + lvds_bit_endian data_endian; /* data endian: little/big */ + lvds_bit_endian sync_code_endian; /* sync code endian: little/big */ + short lane_id[LVDS_LANE_NUM]; /* lane_id: -1 - disable */ + + /* each vc has 4 params, sync_code[i]: + sync_mode is SYNC_MODE_SOL: SOL, EOL, SOF, EOF + sync_mode is SYNC_MODE_SAV: valid sav, valid eav, invalid sav, invalid eav */ + unsigned short sync_code[LVDS_LANE_NUM][WDR_VC_NUM][SYNC_CODE_NUM]; +}lvds_dev_attr_t; + +typedef struct +{ + raw_data_type_e raw_data_type; /* raw data type: 8/10/12/14 bit */ + short lane_id[MIPI_LANE_NUM]; /* lane_id: -1 - disable */ +}mipi_dev_attr_t; + +typedef struct +{ + input_mode_t input_mode; /* input mode: MIPI/LVDS/SUBLVDS/HISPI/DC */ + + union + { + mipi_dev_attr_t mipi_attr; + lvds_dev_attr_t lvds_attr; + }; +}combo_dev_attr_t; + + +#define HI_MIPI_IOC_MAGIC 'm' + +/* init data lane, input mode, data type */ +#define HI_MIPI_SET_DEV_ATTR _IOW(HI_MIPI_IOC_MAGIC, 0x01, combo_dev_attr_t) + +/* output clk edge */ +#define HI_MIPI_SET_OUTPUT_CLK_EDGE _IOW(HI_MIPI_IOC_MAGIC, 0x02, HI_BOOL) + +/* output data msb */ +#define HI_MIPI_SET_OUTPUT_MSB _IOW(HI_MIPI_IOC_MAGIC, 0x03, HI_BOOL) + +#endif + diff --git a/device/mpp/include/hi_sns_ctrl.h b/device/mpp/include/hi_sns_ctrl.h new file mode 100644 index 0000000..837e322 --- /dev/null +++ b/device/mpp/include/hi_sns_ctrl.h @@ -0,0 +1,47 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_sns_ctrl.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2011/01/10 + Description : + History : + 1.Date : 2011/01/10 + Author : x00100808 + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_SNS_CTRL_H__ +#define __HI_SNS_CTRL_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +void sensor_init(); +void sensor_exit(); + +void sensor_prog(int *rom); +int sensor_write_register(int addr, int data); +int sensor_read_register(int addr); +int sensor_write_register_bit(int addr, int data, int mask); +int sensor_register_callback(void); +int sensor_unregister_callback(void); +int sensor_set_inifile_path(const HI_CHAR *pcPath); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* __HI_SNS_CTRL_H__ */ + diff --git a/device/mpp/include/hi_spi.h b/device/mpp/include/hi_spi.h new file mode 100644 index 0000000..be6a0cd --- /dev/null +++ b/device/mpp/include/hi_spi.h @@ -0,0 +1,113 @@ +#ifndef __HI_SPI_H__ +#define __HI_SPI_H__ + +typedef unsigned long long __u64; +typedef unsigned int __u32; +typedef unsigned short __u16; +typedef unsigned char __u8; + +/* User space versions of kernel symbols for SPI clocking modes, + * matching + */ + +#define SPI_CPHA 0x01 +#define SPI_CPOL 0x02 + +#define SPI_MODE_0 (0|0) +#define SPI_MODE_1 (0|SPI_CPHA) +#define SPI_MODE_2 (SPI_CPOL|0) +#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) + +#define SPI_CS_HIGH 0x04 +#define SPI_LSB_FIRST 0x08 +#define SPI_3WIRE 0x10 +#define SPI_LOOP 0x20 +#define SPI_NO_CS 0x40 +#define SPI_READY 0x80 + +/*---------------------------------------------------------------------------*/ + +/* IOCTL commands */ + +#define SPI_IOC_MAGIC 'k' + +/** + * struct spi_ioc_transfer - describes a single SPI transfer + * @tx_buf: Holds pointer to userspace buffer with transmit data, or null. + * If no data is provided, zeroes are shifted out. + * @rx_buf: Holds pointer to userspace buffer for receive data, or null. + * @len: Length of tx and rx buffers, in bytes. + * @speed_hz: Temporary override of the device's bitrate. + * @bits_per_word: Temporary override of the device's wordsize. + * @delay_usecs: If nonzero, how long to delay after the last bit transfer + * before optionally deselecting the device before the next transfer. + * @cs_change: True to deselect device before starting the next transfer. + * + * This structure is mapped directly to the kernel spi_transfer structure; + * the fields have the same meanings, except of course that the pointers + * are in a different address space (and may be of different sizes in some + * cases, such as 32-bit i386 userspace over a 64-bit x86_64 kernel). + * Zero-initialize the structure, including currently unused fields, to + * accommodate potential future updates. + * + * SPI_IOC_MESSAGE gives userspace the equivalent of kernel spi_sync(). + * Pass it an array of related transfers, they'll execute together. + * Each transfer may be half duplex (either direction) or full duplex. + * + * struct spi_ioc_transfer mesg[4]; + * ... + * status = ioctl(fd, SPI_IOC_MESSAGE(4), mesg); + * + * So for example one transfer might send a nine bit command (right aligned + * in a 16-bit word), the next could read a block of 8-bit data before + * terminating that command by temporarily deselecting the chip; the next + * could send a different nine bit command (re-selecting the chip), and the + * last transfer might write some register values. + */ +struct spi_ioc_transfer { + __u64 tx_buf; + __u64 rx_buf; + + __u32 len; + __u32 speed_hz; + + __u16 delay_usecs; + __u8 bits_per_word; + __u8 cs_change; + __u32 pad; + + /* If the contents of 'struct spi_ioc_transfer' ever change + * incompatibly, then the ioctl number (currently 0) must change; + * ioctls with constant size fields get a bit more in the way of + * error checking than ones (like this) where that field varies. + * + * NOTE: struct layout is the same in 64bit and 32bit userspace. + */ +}; + +/* not all platforms use or _IOC_TYPECHECK() ... */ +#define SPI_MSGSIZE(N) \ + ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \ + ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) +#define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) + + +/* Read / Write of SPI mode (SPI_MODE_0..SPI_MODE_3) */ +#define SPI_IOC_RD_MODE _IOR(SPI_IOC_MAGIC, 1, __u8) +#define SPI_IOC_WR_MODE _IOW(SPI_IOC_MAGIC, 1, __u8) + +/* Read / Write SPI bit justification */ +#define SPI_IOC_RD_LSB_FIRST _IOR(SPI_IOC_MAGIC, 2, __u8) +#define SPI_IOC_WR_LSB_FIRST _IOW(SPI_IOC_MAGIC, 2, __u8) + +/* Read / Write SPI device word length (1..N) */ +#define SPI_IOC_RD_BITS_PER_WORD _IOR(SPI_IOC_MAGIC, 3, __u8) +#define SPI_IOC_WR_BITS_PER_WORD _IOW(SPI_IOC_MAGIC, 3, __u8) + +/* Read / Write SPI device default max speed hz */ +#define SPI_IOC_RD_MAX_SPEED_HZ _IOR(SPI_IOC_MAGIC, 4, __u32) +#define SPI_IOC_WR_MAX_SPEED_HZ _IOW(SPI_IOC_MAGIC, 4, __u32) + + + +#endif /* __HI_SPI_H__ */ diff --git a/device/mpp/include/hi_tde_api.h b/device/mpp/include/hi_tde_api.h new file mode 100644 index 0000000..9ad3e79 --- /dev/null +++ b/device/mpp/include/hi_tde_api.h @@ -0,0 +1,392 @@ +/***************************************************************************** +* Copyright 2006 - 2050, Hisilicon Tech. Co., Ltd. +* ALL RIGHTS RESERVED +* FileName: hi_api_tde.h +* Description:TDE2 API define +* +* History: +* Version Date Author DefectNum Description +* +*****************************************************************************/ + +#ifndef _HI_API_TDE2_H_ +#define _HI_API_TDE2_H_ + +#ifdef __cplusplus + #if __cplusplus +extern "C" { + #endif /* __cplusplus */ +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_tde_type.h" + +#define HI_TDE_Open HI_TDE2_Open +#define HI_TDE_Close HI_TDE2_Close +#define HI_TDE_BeginJob HI_TDE2_BeginJob + +/****************************************************************************/ +/* TDE2 API define */ +/****************************************************************************/ + +/***************************************************************************** +* Function: HI_TDE2_Open +* Description: Opens the TDE device +* Input: None +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_Open(HI_VOID); + +/***************************************************************************** +* Function: HI_TDE2_Close +* Description: Closes the TDE device +* Input: None +* Output: None +* Return: None +* Others: None +*****************************************************************************/ +HI_VOID HI_TDE2_Close(HI_VOID); + +/***************************************************************************** +* Function: HI_TDE2_BeginJob +* Description: Creates a TDE job, get a TDE2 job handle +* Input: None +* Output: None +* Return: tde handle / Error code +* Others: None +*****************************************************************************/ +TDE_HANDLE HI_TDE2_BeginJob(HI_VOID); + +/***************************************************************************** +* Function: HI_TDE2_EndJob +* Description: Submits a TDE2 job +* Input: s32Handle: job handle +* bSync: if synchronous +* bBlock: if blocked +* u32TimeOut: timeout value(in 10ms) +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_EndJob(TDE_HANDLE s32Handle, HI_BOOL bSync, HI_BOOL bBlock, HI_U32 u32TimeOut); + +/***************************************************************************** +* Function: HI_TDE2_CancelJob +* Description: Cancels a specific TDE job, only successful before calling EndJob +* Input: s32Handle: job handle +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_CancelJob(TDE_HANDLE s32Handle); + +/***************************************************************************** +* Function: HI_TDE2_WaitForDone +* Description: Waits for a submitted job to finish +* Input: s32Handle: job handle +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_WaitForDone(TDE_HANDLE s32Handle); + +/***************************************************************************** +* Function: HI_TDE2_WaitAllDone +* Description: Waits for all submitted jobs to finish +* Input: None +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_WaitAllDone(HI_VOID); + + +/***************************************************************************** +* Function: HI_TDE2_Reset +* Description: Reset tde +* Input: None +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_Reset(HI_VOID); + +/***************************************************************************** +* Function: HI_TDE2_QuickCopy +* Description: Just quick copy, the size of source region and destination region should be the same, so is the color format +* Input: s32Handle: job handle +* pSrc: the source picture information +* pstSrcRect: the source picture operation region +* pDst: the destination picture information +* pstDstRect: the destination picture operation region +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_QuickCopy(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstSrc, TDE2_RECT_S *pstSrcRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect); + +/***************************************************************************** +* Function: HI_TDE2_QuickFill +* Description: Quick fill +* Input: s32Handle: job handle +* pDst: the destination picture information +* pstDstRect: the destination picture operation region +* u32FillData: the color value,its format should be the same to the destination picture +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_QuickFill(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect, + HI_U32 u32FillData); + +/***************************************************************************** +* Function: HI_TDE2_QuickResize +* Description: Adds the raster bitmap scaling operation to a TDE job +* Input: s32Handle: job handle +* pSrc: the source picture information +* pstSrcRect: the source picture operation region +* pDst: the destination picture information +* pstDstRect: the destination picture operation region +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_QuickResize(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstSrc, TDE2_RECT_S *pstSrcRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect); + +/***************************************************************************** +* Function: HI_TDE2_QuickFlicker +* Description: Adds the anti-flicker operation to a TDE job +* Input: s32Handle: job handle +* pSrc: the source picture information +* pstSrcRect: the source picture operation region +* pDst: the destination picture information +* pstDstRect: the destination picture operation region +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_QuickDeflicker(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstSrc, TDE2_RECT_S *pstSrcRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect); + +/***************************************************************************** +* Function: HI_TDE2_Blit +* Description: Adds the transfer operation with additional functions performed on + the raster bitmap to a TDE task +* Input: s32Handle: job handle +* pstBackGround: the background picture information +* pstBackGroundRect: the background picture operation region +* pstForeGround: the foreground picture information +* pstForeGroundRect: the foreground picture operation region +* pstDst: the destination picture information +* pstDstRect: the destination picture operation region +* pOpt: operation parameter settings +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_Bitblit(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstBackGround, TDE2_RECT_S *pstBackGroundRect, + TDE2_SURFACE_S* pstForeGround, TDE2_RECT_S *pstForeGroundRect, TDE2_SURFACE_S* pstDst, + TDE2_RECT_S *pstDstRect, TDE2_OPT_S* pstOpt); + +/***************************************************************************** +* Function: HI_TDE2_SolidDraw +* Description: Adds the filling operation with additional functions performed on + the raster bitmap to a TDE task +* Input: s32Handle: job handle +* pstForeGround: the foreground picture information +* pstForeGroundRect: the source picture operation region +* pstDst: the background picture information +* pstDstRect: the destination picture operation region +* pstFillColor: the color value +* pstOpt: operation parameter settings +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_SolidDraw(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstForeGround, TDE2_RECT_S *pstForeGroundRect, + TDE2_SURFACE_S *pstDst, + TDE2_RECT_S *pstDstRect, TDE2_FILLCOLOR_S *pstFillColor, + TDE2_OPT_S *pstOpt); + +/***************************************************************************** +* Function: HI_TDE2_MbBlit +* Description: Adds the transfer operation with additional functions performed on + the macroblock bitmap to a TDE task +* Input: s32Handle: job handle +* pstMB: Surface of the macroblock +* pstDst: Operating region of the macroblock +* pstDstRect: the destination picture operation region +* pstMbOpt: operation parameter settings +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_MbBlit(TDE_HANDLE s32Handle, TDE2_MB_S* pstMB, TDE2_RECT_S *pstMbRect, TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect, + TDE2_MBOPT_S* pstMbOpt); + +/***************************************************************************** +* Function: HI_TDE2_BitmapMaskRop +* Description: Adds the mask raster operation (ROP) operation performed + on the raster bitmap to a TDE task. +* Input: s32Handle: job handle +* pstBackGround: the background picture information +* pstBackGroundRect: the background picture operation region +* pstForeGround: the foreground picture information +* pstForeGroundRect: the source picture operation region +* pstMask: mask picture information +* pstMaskRect: operating region of the mask picture +* pstDst: the destination picture information +* pstDstRect: the destination picture operation region +* enRopCode_Color: ROP operation code of the color component +* enRopCode_Alpha: ROP operation code of the alpha component +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_BitmapMaskRop(TDE_HANDLE s32Handle, + TDE2_SURFACE_S* pstBackGround, TDE2_RECT_S *pstBackGroundRect, + TDE2_SURFACE_S* pstForeGround, TDE2_RECT_S *pstForeGroundRect, + TDE2_SURFACE_S* pstMask, TDE2_RECT_S *pstMaskRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect, + TDE2_ROP_CODE_E enRopCode_Color, TDE2_ROP_CODE_E enRopCode_Alpha); + +/***************************************************************************** +* Function: HI_TDE2_BitmapMaskBlend +* Description: Adds the mask blending operation performed on the raster + bitmap to a TDE task +* Input: s32Handle: job handle +* pstBackGround: the background picture information +* pstBackGroundRect: the background picture operation region +* pstForeGround: the foreground picture information +* pstForeGroundRect: the foreground picture operation region +* pstMask: mask picture information +* pstMaskRect: operating region of the mask picture +* pstDst: the destination picture information +* pstDstRect: the destination picture operation region +* u8Alpha: global alpha value during alpha blending +* enBlendMode: alpha blending mode +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_BitmapMaskBlend(TDE_HANDLE s32Handle, + TDE2_SURFACE_S* pstBackGround, TDE2_RECT_S *pstBackGroundRect, + TDE2_SURFACE_S* pstForeGround, TDE2_RECT_S *pstForeGroundRect, + TDE2_SURFACE_S* pstMask, TDE2_RECT_S *pstMaskRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect, + HI_U8 u8Alpha, TDE2_ALUCMD_E enBlendMode); + + + +/***************************************************************************** +* Function: HI_TDE2_SetDeflickerLevel +* Description: To set the anti-flicker level +* Input: enDeflickerLevel: anti-flicker level +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_SetDeflickerLevel(TDE_DEFLICKER_LEVEL_E enDeflickerLevel); + +/***************************************************************************** +* Function: HI_TDE2_GetDeflickerLevel +* Description: To get the anti-flicker level +* Input: pDeflickerLevel: to save the anti-flicker level +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_GetDeflickerLevel(TDE_DEFLICKER_LEVEL_E *pDeflickerLevel); + +/***************************************************************************** +* Function: HI_TDE2_SetAlphaThresholdValue +* Description: To set the anti-flicker level +* Input: u8ThresholdValue: Alpha threshold +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_SetAlphaThresholdValue(HI_U8 u8ThresholdValue); + +/***************************************************************************** +* Function: HI_TDE2_GetAlphaThresholdValue +* Description: To get the anti-flicker level +* Input: pu8ThresholdValue: to save the alpha threshold +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_GetAlphaThresholdValue(HI_U8 *pu8ThresholdValue); + +/***************************************************************************** +* Function: HI_TDE2_GetAlphaThresholdValue +* Description: To enable or disable alpha judgment +* Input: bEnAlphaThreshold: whether to enable alpha judgment +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_SetAlphaThresholdState(HI_BOOL bEnAlphaThreshold); + +/***************************************************************************** +* Function: HI_TDE2_GetAlphaThresholdState +* Description: To get alpha judgment state +* Input: p_bEnAlphaThreshold: To save the alpha judgment state +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_GetAlphaThresholdState(HI_BOOL * p_bEnAlphaThreshold); + +/***************************************************************************** +* Function: HI_TDE2_PatternFill +* Description: Pattern fill +Input: s32Handle: job handle +* pstBackGround: the background picture information +* pstBackGroundRect: the background picture operation region +* pstForeGround: the foreground picture information +* pstForeGroundRect: the foreground picture operation region +* pstDst: the destination picture information +* pstDstRect: the destination picture operation region +* pstOpt: operation parameter settings +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_PatternFill(TDE_HANDLE s32Handle, TDE2_SURFACE_S *pstBackGround, + TDE2_RECT_S *pstBackGroundRect, TDE2_SURFACE_S *pstForeGround, + TDE2_RECT_S *pstForeGroundRect, TDE2_SURFACE_S *pstDst, + TDE2_RECT_S *pstDstRect, TDE2_PATTERN_FILL_OPT_S *pstOpt); + +/***************************************************************************** +* Function: HI_TDE2_EnableRegionDeflicker +* Description: To enable or disable the regional anti-flicker function +* Input: bRegionDeflicker: enable flag +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_EnableRegionDeflicker(HI_BOOL bRegionDeflicker); +/***************************************************************************** +* Function: HI_TDE2_MultiBlending +* Description: multi blend surface by surface list +* Input: s32Handle: job handle + pstSurfaceList: composed surface list +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_MultiBlending(TDE_HANDLE s32Handle, TDE_SURFACE_LIST_S *pstSurfaceList); + + +#ifdef __cplusplus + #if __cplusplus +} + #endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif /* _HI_API_TDE2_H_ */ diff --git a/device/mpp/include/hi_tde_errcode.h b/device/mpp/include/hi_tde_errcode.h new file mode 100644 index 0000000..c27b064 --- /dev/null +++ b/device/mpp/include/hi_tde_errcode.h @@ -0,0 +1,55 @@ +/****************************************************************************** + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + File Name : tde_errcode.h +Version : Initial Draft +Author : Hisilicon multimedia software group +Created : 2005/4/23 +Last Modified : +Description : err code define +Function List : +History : May modify the code to errcode.h FOR hi3110 + ******************************************************************************/ +#ifndef __TDE_ERRCODE_H__ +#define __TDE_ERRCODE_H__ + +//#include "hi_debug.h" +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +//#define HI_ID_TDE 100 +/* tde start err no. */ +#define HI_ERR_TDE_BASE ((HI_S32)( ((0x80UL + 0x20UL)<<24) | (100 << 16 ) | (4 << 13) | 1 )) + +enum +{ + HI_ERR_TDE_DEV_NOT_OPEN = HI_ERR_TDE_BASE, /**< tde device not open yet */ + HI_ERR_TDE_DEV_OPEN_FAILED, /**< open tde device failed */ + HI_ERR_TDE_NULL_PTR, /**< input parameters contain null ptr */ + HI_ERR_TDE_NO_MEM, /**< malloc failed */ + HI_ERR_TDE_INVALID_HANDLE, /**< invalid job handle */ + HI_ERR_TDE_INVALID_PARA, /**< invalid parameter */ + HI_ERR_TDE_NOT_ALIGNED, /**< aligned error for position, stride, width */ + HI_ERR_TDE_MINIFICATION, /**< invalid minification */ + HI_ERR_TDE_CLIP_AREA, /**< clip area and operation area have no intersection */ + HI_ERR_TDE_JOB_TIMEOUT, /**< blocked job wait timeout */ + HI_ERR_TDE_UNSUPPORTED_OPERATION, /**< unsupported operation */ + HI_ERR_TDE_QUERY_TIMEOUT, /**< query time out */ + HI_ERR_TDE_INTERRUPT /**< blocked job was interrupted */ +}; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __TDE_ERRCODE_H__*/ + + diff --git a/device/mpp/include/hi_tde_type.h b/device/mpp/include/hi_tde_type.h new file mode 100644 index 0000000..edf62ec --- /dev/null +++ b/device/mpp/include/hi_tde_type.h @@ -0,0 +1,511 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Huawei Tech. Co., Ltd. + + ****************************************************************************** + File Name : tde_type.h +Version : Initial Draft +Author : w54130 +Created : 2007/5/21 +Last Modified : +Description : TDE public type +Function List : +History : +1.Date : 2007/5/21 +Author : w54130 +Modification: Created file + + ******************************************************************************/ +#ifndef __TDE_TYPE_H__ +#define __TDE_TYPE_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include "hi_tde_errcode.h" + +/****************************************************************************/ +/* TDE2 types define */ +/****************************************************************************/ +/** TDE handle */ +typedef HI_S32 TDE_HANDLE; + +/** TDE callback */ +typedef HI_VOID (* TDE_FUNC_CB) (HI_VOID *pParaml, HI_VOID *pParamr); + + +/* color format */ +typedef enum hiTDE2_COLOR_FMT_E +{ + TDE2_COLOR_FMT_RGB444 = 0, /**< RGB444 format */ + TDE2_COLOR_FMT_BGR444, /**< BGR444 format */ + TDE2_COLOR_FMT_RGB555, /**< RGB555 format */ + TDE2_COLOR_FMT_BGR555, /**< BGR555 format */ + TDE2_COLOR_FMT_RGB565, /**< RGB565 format */ + TDE2_COLOR_FMT_BGR565, /**< BGR565 format */ + TDE2_COLOR_FMT_RGB888, /**< RGB888 format */ + TDE2_COLOR_FMT_BGR888, /**< BGR888 format */ + TDE2_COLOR_FMT_ARGB4444, /**< ARGB4444 format */ + TDE2_COLOR_FMT_ABGR4444, /**< ABGR4444 format */ + TDE2_COLOR_FMT_RGBA4444, /**< RGBA4444 format */ + TDE2_COLOR_FMT_BGRA4444, /**< BGRA4444 format */ + TDE2_COLOR_FMT_ARGB1555, /**< ARGB1555 format */ + TDE2_COLOR_FMT_ABGR1555, /**< ABGR1555 format */ + TDE2_COLOR_FMT_RGBA1555, /**< RGBA1555 format */ + TDE2_COLOR_FMT_BGRA1555, /**< BGRA1555 format */ + TDE2_COLOR_FMT_ARGB8565, /**< ARGB8565 format */ + TDE2_COLOR_FMT_ABGR8565, /**< ABGR8565 format */ + TDE2_COLOR_FMT_RGBA8565, /**< RGBA8565 format */ + TDE2_COLOR_FMT_BGRA8565, /**< BGRA8565 format */ + TDE2_COLOR_FMT_ARGB8888, /**< ARGB8888 format */ + TDE2_COLOR_FMT_ABGR8888, /**< ABGR8888 format */ + TDE2_COLOR_FMT_RGBA8888, /**< RGBA8888 format */ + TDE2_COLOR_FMT_BGRA8888, /**< BGRA8888 format */ + TDE2_COLOR_FMT_RABG8888, /**= (EXT_REG_BASE)) ? 0 : ISP_REG_BASE) + (BASE)) + +#define IORD_32DIRECT(BASE) IO_READ32(__IO_CALC_ADDRESS_DYNAMIC(BASE)) +#define IORD_16DIRECT(BASE) IO_READ16(__IO_CALC_ADDRESS_DYNAMIC(BASE)) +#define IORD_8DIRECT(BASE) IO_READ8(__IO_CALC_ADDRESS_DYNAMIC(BASE)) + +#define IOWR_32DIRECT(BASE, DATA) IO_WRITE32(__IO_CALC_ADDRESS_DYNAMIC(BASE), (DATA)) +#define IOWR_16DIRECT(BASE, DATA) IO_WRITE16(__IO_CALC_ADDRESS_DYNAMIC(BASE), (DATA)) +#define IOWR_8DIRECT(BASE, DATA) IO_WRITE8(__IO_CALC_ADDRESS_DYNAMIC(BASE), (DATA)) +/*--------------------------------------------------------------------------------------*/ +/* direct write or read ISP regs */ +#define IORD_32DIRECT_ISP_REG(BASE) IO_READ32(ISP_REG_BASE + (BASE)) +#define IORD_16DIRECT_ISP_REG(BASE) IO_READ16(ISP_REG_BASE + (BASE)) +#define IORD_8DIRECT_ISP_REG(BASE) IO_READ8(ISP_REG_BASE + (BASE)) + +#define IOWR_32DIRECT_ISP_REG(BASE, DATA) IO_WRITE32((ISP_REG_BASE + (BASE)), (DATA)) +#define IOWR_16DIRECT_ISP_REG(BASE, DATA) IO_WRITE16((ISP_REG_BASE + (BASE)), (DATA)) +#define IOWR_8DIRECT_ISP_REG(BASE, DATA) IO_WRITE8((ISP_REG_BASE + (BASE)), (DATA)) +/*--------------------------------------------------------------------------------------*/ + +/* write or read vi reg */ +HI_U32 IO_READ32_VI(HI_U32 u32Addr); +HI_S32 IO_WRITE32_VI(HI_U32 u32Addr, HI_U32 u32Value); + +#define __IO_CALC_ADDRESS_DYNAMIC_VI(BASE) (HI_U32)((VI_REG_BASE) + (BASE)) +#define IORD_32DIRECT_VI(BASE) IO_READ32_VI(__IO_CALC_ADDRESS_DYNAMIC_VI(BASE)) +#define IOWR_32DIRECT_VI(BASE, DATA) IO_WRITE32_VI(__IO_CALC_ADDRESS_DYNAMIC_VI(BASE), (DATA)) +/*--------------------------------------------------------------------------------------*/ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/include/hifb.h b/device/mpp/include/hifb.h new file mode 100644 index 0000000..bb601d3 --- /dev/null +++ b/device/mpp/include/hifb.h @@ -0,0 +1,356 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hifb.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : + Description : + History : + 1.Date : 2009/03/12 + Author : + Modification: Created file +******************************************************************************/ + + +#ifndef __HIFB_H__ +#define __HIFB_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include +/*************************** Structure Definition ****************************/ + +#define IOC_TYPE_HIFB 'F' +/** To obtain the colorkey of an overlay layer */ +#define FBIOGET_COLORKEY_HIFB _IOR(IOC_TYPE_HIFB, 90, HIFB_COLORKEY_S) +/** To set the colorkey of an overlay layer */ +#define FBIOPUT_COLORKEY_HIFB _IOW(IOC_TYPE_HIFB, 91, HIFB_COLORKEY_S) +/** To get the alpha of an overlay layer */ +#define FBIOGET_ALPHA_HIFB _IOR(IOC_TYPE_HIFB, 92, HIFB_ALPHA_S) +/** To set the alpha of an overlay layer */ +#define FBIOPUT_ALPHA_HIFB _IOW(IOC_TYPE_HIFB, 93, HIFB_ALPHA_S) +/** To get the origin of an overlay layer on the screen */ +#define FBIOGET_SCREEN_ORIGIN_HIFB _IOR(IOC_TYPE_HIFB, 94, HIFB_POINT_S) +/** To set the origin of an overlay layer on the screen */ +#define FBIOPUT_SCREEN_ORIGIN_HIFB _IOW(IOC_TYPE_HIFB, 95, HIFB_POINT_S) +/** To obtain the anti-flicker setting of an overlay layer */ +#define FBIOGET_DEFLICKER_HIFB _IOR(IOC_TYPE_HIFB, 98, HIFB_DEFLICKER_S) +/** To set the anti-flicker setting of an overlay layer */ +#define FBIOPUT_DEFLICKER_HIFB _IOW(IOC_TYPE_HIFB, 99, HIFB_DEFLICKER_S) +/** To wait for the vertical blanking region of an overlay layer */ +#define FBIOGET_VBLANK_HIFB _IO(IOC_TYPE_HIFB, 100) +/** To set the display state of an overlay layer */ +#define FBIOPUT_SHOW_HIFB _IOW(IOC_TYPE_HIFB, 101, HI_BOOL) +/** To obtain the display state of an overlay layer */ +#define FBIOGET_SHOW_HIFB _IOR(IOC_TYPE_HIFB, 102, HI_BOOL) +/** to obtain the capability of an overlay layer */ +#define FBIOGET_CAPABILITY_HIFB _IOR(IOC_TYPE_HIFB, 103, HIFB_CAPABILITY_S) +/** set the screen output size */ +#define FBIOPUT_SCREENSIZE _IOW(IOC_TYPE_HIFB, 130, HIFB_SIZE_S*) +/** get the screen output size */ +#define FBIOGET_SCREENSIZE _IOR(IOC_TYPE_HIFB, 131, HIFB_SIZE_S*) + +/** To display multiple surfaces in turn and set the alpha and colorkey attributes */ +#define FBIOFLIP_SURFACE _IOW(IOC_TYPE_HIFB, 132, HIFB_SURFACEEX_S) + +/**To set the compression function status of an overlay layer*/ +#define FBIOPUT_COMPRESSION_HIFB _IOW(IOC_TYPE_HIFB, 133, HI_BOOL) +/**To obtain the compression function status of an overlay layer*/ +#define FBIOGET_COMPRESSION_HIFB _IOR(IOC_TYPE_HIFB, 134, HI_BOOL) + + +typedef struct +{ + HI_U32 u32Width; + HI_U32 u32Height; +}HIFB_SIZE_S; + +static inline HI_U8 hifb_rgb(const struct fb_bitfield* pBit, HI_S32 color) +{ + return ((HI_U8)((((HI_U32)color)>>pBit->offset) << (8-pBit->length)) + + ((HI_U8)(((HI_U32)(color)>>pBit->offset) << (8-pBit->length)) >> pBit->length)); +} + +static inline HI_S32 hifb_color2key(const struct fb_var_screeninfo* pVar, HI_S32 color) +{ + if (pVar->bits_per_pixel <= 8) + { + return color; + } + else + { + HI_U8 r, g, b; + r = hifb_rgb(&pVar->red, color); + g = hifb_rgb(&pVar->green, color); + b = hifb_rgb(&pVar->blue, color); + return (r<<16) + (g<<8) + b; + } +} + +typedef struct +{ + HI_BOOL bKeyEnable; /* colorkey enable flag */ + HI_U32 u32Key; /* colorkey value, maybe contains alpha */ +}HIFB_COLORKEY_S; + +typedef struct +{ + HI_S32 x; + HI_S32 y; + HI_S32 w; + HI_S32 h; +} HIFB_RECT; + +typedef struct +{ + HI_S32 s32XPos; /**< horizontal position */ + HI_S32 s32YPos; /**< vertical position */ +}HIFB_POINT_S; + +typedef struct hiHIFB_DEFLICKER_S +{ + HI_U32 u32HDfLevel; /**< horizontal deflicker level */ + HI_U32 u32VDfLevel; /**< vertical deflicker level */ + HI_U8 *pu8HDfCoef; /**< horizontal deflicker coefficient */ + HI_U8 *pu8VDfCoef; /**< vertical deflicker coefficient */ +}HIFB_DEFLICKER_S; + +/** Alpha info */ +typedef struct +{ + HI_BOOL bAlphaEnable; /**< alpha enable flag */ + HI_BOOL bAlphaChannel; /**< alpha channel enable flag */ + HI_U8 u8Alpha0; /**< alpha0 value, used in ARGB1555 */ + HI_U8 u8Alpha1; /**< alpha1 value, used in ARGB1555 */ + HI_U8 u8GlobalAlpha; /**< global alpha value */ + HI_U8 u8Reserved; +}HIFB_ALPHA_S; + +typedef enum +{ + HIFB_FMT_RGB565 = 0, + HIFB_FMT_RGB888, /**< RGB888 24bpp */ + + HIFB_FMT_KRGB444, /**< RGB444 16bpp */ + HIFB_FMT_KRGB555, /**< RGB555 16bpp */ + HIFB_FMT_KRGB888, /**< RGB888 32bpp */ + + HIFB_FMT_ARGB4444, /**< ARGB4444 */ + HIFB_FMT_ARGB1555, /**< ARGB1555 */ + HIFB_FMT_ARGB8888, /**< ARGB8888 */ + HIFB_FMT_ARGB8565, /**< ARGB8565 */ + + HIFB_FMT_RGBA4444, /**< ARGB4444 */ + HIFB_FMT_RGBA5551, /**< RGBA5551 */ + HIFB_FMT_RGBA5658, /**< RGBA5658 */ + HIFB_FMT_RGBA8888, /**< RGBA8888 */ + + HIFB_FMT_BGR565, /**< BGR565 */ + HIFB_FMT_BGR888, /**< BGR888 */ + HIFB_FMT_ABGR4444, /**< ABGR4444 */ + HIFB_FMT_ABGR1555, /**< ABGR1555 */ + HIFB_FMT_ABGR8888, /**< ABGR8888 */ + HIFB_FMT_ABGR8565, /**< ABGR8565 */ + HIFB_FMT_KBGR444, /**< BGR444 16bpp */ + HIFB_FMT_KBGR555, /**< BGR555 16bpp */ + HIFB_FMT_KBGR888, /**< BGR888 32bpp */ + + HIFB_FMT_1BPP, /**< clut1 */ + HIFB_FMT_2BPP, /**< clut2 */ + HIFB_FMT_4BPP, /**< clut4 */ + HIFB_FMT_8BPP, /**< clut8 */ + HIFB_FMT_ACLUT44, /**< AClUT44*/ + HIFB_FMT_ACLUT88, /**< ACLUT88 */ + HIFB_FMT_PUYVY, /**< UYVY */ + HIFB_FMT_PYUYV, /**< YUYV */ + HIFB_FMT_PYVYU, /**< YVYU */ + HIFB_FMT_YUV888, /**< YUV888 */ + HIFB_FMT_AYUV8888, /**< AYUV8888 */ + HIFB_FMT_YUVA8888, /**< YUVA8888 */ + HIFB_FMT_BUTT +}HIFB_COLOR_FMT_E; + +typedef struct +{ + HI_BOOL bKeyRgb; + HI_BOOL bKeyAlpha; /**< whether support colorkey alpha */ + HI_BOOL bGlobalAlpha; /**< whether support global alpha */ + HI_BOOL bCmap; /**< whether support color map */ + HI_BOOL bHasCmapReg; /**< whether has color map register*/ + HI_BOOL bColFmt[HIFB_FMT_BUTT]; /**< support which color format */ + HI_BOOL bVoScale; /**< support vo scale*/ + HI_BOOL bLayerSupported; /**< whether support a certain layer, for example:x5 HD support HIFB_SD_0 not support HIFB_SD_1*/ + HI_U32 u32MaxWidth; /**< the max pixels per line */ + HI_U32 u32MaxHeight; /**< the max lines */ + HI_U32 u32MinWidth; /**< the min pixels per line */ + HI_U32 u32MinHeight; /**< the min lines */ + HI_U32 u32VDefLevel; /**< vertical deflicker level, 0 means vertical deflicker is unsupported */ + HI_U32 u32HDefLevel; /**< horizontal deflicker level, 0 means horizontal deflicker is unsupported */ + HI_BOOL bDcmp; + HI_BOOL bPreMul; +}HIFB_CAPABILITY_S; + +/*refresh mode*/ +typedef enum +{ + HIFB_LAYER_BUF_DOUBLE = 0x0, /**< 2 display buf in fb */ + HIFB_LAYER_BUF_ONE = 0x1, /**< 1 display buf in fb */ + HIFB_LAYER_BUF_NONE = 0x2, /**< no display buf in fb,the buf user refreshed will be directly set to VO*/ + HIFB_LAYER_BUF_DOUBLE_IMMEDIATE=0x3, /**< 2 display buf in fb, each refresh will be displayed*/ + HIFB_LAYER_BUF_BUTT +} HIFB_LAYER_BUF_E; + +/* surface info */ +typedef struct +{ + HI_U32 u32PhyAddr; /**< start physical address */ + HI_U32 u32Width; /**< width pixels */ + HI_U32 u32Height; /**< height pixels */ + HI_U32 u32Pitch; /**< line pixels */ + HIFB_COLOR_FMT_E enFmt; /**< color format */ +}HIFB_SURFACE_S; + +typedef struct +{ + HI_U32 u32PhyAddr; + HIFB_ALPHA_S stAlpha; + HIFB_COLORKEY_S stColorkey; +}HIFB_SURFACEEX_S; + +/* refresh surface info */ +typedef struct +{ + HIFB_SURFACE_S stCanvas; + HIFB_RECT UpdateRect; /* refresh region*/ +}HIFB_BUFFER_S; + +/* cursor info */ +typedef struct +{ + HIFB_SURFACE_S stCursor; + HIFB_POINT_S stHotPos; +} HIFB_CURSOR_S; + +/* DDR detect zone info */ +typedef struct +{ + HI_U32 u32StartSection; + HI_U32 u32ZoneNums; +} HIFB_DDRZONE_S; + +/* crusor handle */ +/* Attention:surface in cursor will be released by user*/ +#define FBIOPUT_CURSOR_INFO _IOW(IOC_TYPE_HIFB, 104, HIFB_CURSOR_S *) +#define FBIOGET_CURSOR_INFO _IOW(IOC_TYPE_HIFB, 105, HIFB_CURSOR_S *) + +#define FBIOPUT_CURSOR_STATE _IOW(IOC_TYPE_HIFB, 106, HI_BOOL *) +#define FBIOGET_CURSOR_STATE _IOW(IOC_TYPE_HIFB, 107, HI_BOOL *) + +#define FBIOPUT_CURSOR_POS _IOW(IOC_TYPE_HIFB, 108, HIFB_POINT_S *) +#define FBIOGET_CURSOR_POS _IOR(IOC_TYPE_HIFB, 109, HIFB_POINT_S *) + +#define FBIOPUT_CURSOR_COLORKEY _IOR(IOC_TYPE_HIFB, 110, HIFB_COLORKEY_S *) +#define FBIOGET_CURSOR_COLORKEY _IOW(IOC_TYPE_HIFB, 111, HIFB_COLORKEY_S *) +#define FBIOPUT_CURSOR_ALPHA _IOR(IOC_TYPE_HIFB, 112, HIFB_ALPHA_S *) +#define FBIOGET_CURSOR_ALPHA _IOW(IOC_TYPE_HIFB, 113, HIFB_ALPHA_S *) + +/** cursor will be separated from attached layer automatically if you attach cursor to another layer,that means +cursor can be attached to only one layer at any time*/ +#define FBIOPUT_CURSOR_ATTCHCURSOR _IOW(IOC_TYPE_HIFB, 114, HI_U32 *) +#define FBIOPUT_CURSOR_DETACHCURSOR _IOW(IOC_TYPE_HIFB, 115, HI_U32 *) + +/**antiflicker level*/ +/**Auto means fb will choose a appropriate antiflicker level automatically according to the color info of map*/ +typedef enum +{ + HIFB_LAYER_ANTIFLICKER_NONE = 0x0, /**< no antiflicker*/ + HIFB_LAYER_ANTIFLICKER_LOW = 0x1, /**< low level*/ + HIFB_LAYER_ANTIFLICKER_MIDDLE = 0x2,/**< middle level*/ + HIFB_LAYER_ANTIFLICKER_HIGH = 0x3, /**< high level*/ + HIFB_LAYER_ANTIFLICKER_AUTO = 0x4, /**< auto*/ + HIFB_LAYER_ANTIFLICKER_BUTT +}HIFB_LAYER_ANTIFLICKER_LEVEL_E; + +/* MIRROR mode */ +typedef enum +{ + HIFB_MIRROR_NONE = 0x0, + HIFB_MIRROR_HORIZONTAL = 0x1, + HIFB_MIRROR_VERTICAL = 0x2, + HIFB_MIRROR_BOTH= 0x3, + HIFB_MIRROR_BUTT +}HIFB_MIRROR_MODE_E; + +/*layer info maskbit*/ +typedef enum +{ + HIFB_LAYERMASK_BUFMODE = 0x1, /**< BUFMODE bitmask */ + HIFB_LAYERMASK_ANTIFLICKER_MODE = 0x2, /**< ANTIFLICKER_MODE bitmask */ + HIFB_LAYERMASK_POS = 0x4, /**< the position bitmask */ + HIFB_LAYERMASK_CANVASSIZE = 0x8, /**< canvassize bitmask */ + HIFB_LAYERMASK_DISPSIZE = 0x10, /**< displaysize bitmask */ + HIFB_LAYERMASK_SCREENSIZE = 0x20, /**< screensize bitmask */ + HIFB_LAYERMASK_BMUL = 0x40, /**< pre-mult bitmask */ + HIFB_LAYERMASK_BUTT +}HIFB_LAYER_INFO_MASKBIT; + +/**layer info*/ +typedef struct +{ + HIFB_LAYER_BUF_E BufMode; + HIFB_LAYER_ANTIFLICKER_LEVEL_E eAntiflickerLevel; + HI_S32 s32XPos; /**< the x pos of origion point in screen */ + HI_S32 s32YPos; /**< the y pos of origion point in screen */ + HI_S32 u32CanvasWidth; /**< the width of canvas buffer */ + HI_S32 u32CanvasHeight; /**< the height of canvas buffer */ + HI_U32 u32DisplayWidth; /**< the width of display buf in fb.for 0 buf ,there is no display buf in fb, so it's effectless*/ + HI_U32 u32DisplayHeight; /**< the height of display buf in fb. */ + HI_U32 u32ScreenWidth; /**< the width of screen */ + HI_U32 u32ScreenHeight; /**< the height of screen */ + HI_BOOL bPreMul; /**< The data drawed in buf is premul data or not*/ + HI_U32 u32Mask; /**< param modify mask bit*/ +}HIFB_LAYER_INFO_S; + +/** To set the layer information */ +#define FBIOPUT_LAYER_INFO _IOW(IOC_TYPE_HIFB, 120, HIFB_LAYER_INFO_S*) +/** To get the layer information */ +#define FBIOGET_LAYER_INFO _IOR(IOC_TYPE_HIFB, 121, HIFB_LAYER_INFO_S*) +/** To get canvas buf */ +#define FBIOGET_CANVAS_BUFFER _IOR(IOC_TYPE_HIFB, 123, HIFB_BUFFER_S*) +/** To refresh the displayed contents in extended mode */ +#define FBIO_REFRESH _IOW(IOC_TYPE_HIFB, 124, HIFB_BUFFER_S*) + +/**sync refresh*/ +#define FBIO_WAITFOR_FREFRESH_DONE _IO(IOC_TYPE_HIFB, 125) + +/* To set the mirror mode */ +#define FBIOPUT_MIRROR_MODE _IOW(IOC_TYPE_HIFB, 126, HIFB_MIRROR_MODE_E*) +/* To get the mirror mode */ +#define FBIOGET_MIRROR_MODE _IOW(IOC_TYPE_HIFB, 127, HIFB_MIRROR_MODE_E*) + + +/**To set the DDR detect zone of an overlay layer*/ +#define FBIOPUT_MDDRDETECT_HIFB _IOW(IOC_TYPE_HIFB, 135, HIFB_DDRZONE_S*) +/**To get the DDR detect zone of an overlay layer*/ +#define FBIOGET_MDDRDETECT_HIFB _IOW(IOC_TYPE_HIFB, 136, HIFB_DDRZONE_S*) + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __HIFB_H__ */ + diff --git a/device/mpp/include/himedia.h b/device/mpp/include/himedia.h new file mode 100644 index 0000000..d265333 --- /dev/null +++ b/device/mpp/include/himedia.h @@ -0,0 +1,83 @@ +#ifndef _LINUX_HIMEDIA_DEVICE_H_ +#define _LINUX_HIMEDIA_DEVICE_H_ + +#include +#include +#include + +#define HIMEDIA_DEVICE_MAJOR 218 +#define HIMEDIA_DYNAMIC_MINOR 255 + +struct himedia_device; + +struct himedia_ops { + //pm methos + int (*pm_prepare)(struct himedia_device *); + void (*pm_complete)(struct himedia_device *); + + int (*pm_suspend)(struct himedia_device *); + int (*pm_resume)(struct himedia_device *); + + int (*pm_freeze)(struct himedia_device *); + int (*pm_thaw)(struct himedia_device *); + int (*pm_poweroff)(struct himedia_device *); + int (*pm_restore)(struct himedia_device *); + + int (*pm_suspend_late)(struct himedia_device *); + int (*pm_resume_early)(struct himedia_device *); + int (*pm_freeze_late)(struct himedia_device *); + int (*pm_thaw_early)(struct himedia_device *); + int (*pm_poweroff_late)(struct himedia_device *); + int (*pm_restore_early)(struct himedia_device *); + + int (*pm_suspend_noirq)(struct himedia_device *); + int (*pm_resume_noirq)(struct himedia_device *); + + int (*pm_freeze_noirq)(struct himedia_device *); + int (*pm_thaw_noirq)(struct himedia_device *); + int (*pm_poweroff_noirq)(struct himedia_device *); + int (*pm_restore_noirq)(struct himedia_device *); +}; + +struct himedia_driver{ + struct device_driver driver; + struct himedia_ops *ops; + char name[1]; +}; + +#define to_himedia_driver(drv) \ + container_of((drv), struct himedia_driver, driver) + +struct himedia_device { + struct list_head list; + +#define MAX_LEN 32 + char devfs_name[MAX_LEN]; + + int minor; + + struct device device; + + struct module *owner; + + const struct file_operations *fops; + + struct himedia_ops *drvops; + + /*for internal use*/ + struct himedia_driver *driver; +}; + + +#define to_himedia_device(dev) \ + container_of((dev), struct himedia_device, device) + +int himedia_register(struct himedia_device *pdev); + +int himedia_unregister(struct himedia_device *pdev); + +#define MODULE_ALIAS_HIMEDIA(minor) \ + MODULE_ALIAS("himedia-char-major-" __stringify(HIMEDIA_DEVICE_MAJOR) \ + "-" __stringify(minor)) + +#endif /*_LINUX_HIMEDIA_DEVICE_H_*/ diff --git a/device/mpp/include/iniparser.h b/device/mpp/include/iniparser.h new file mode 100644 index 0000000..61b6a5c --- /dev/null +++ b/device/mpp/include/iniparser.h @@ -0,0 +1,341 @@ + +/*-------------------------------------------------------------------------*/ +/** + @file iniparser.h + @author N. Devillard + @date Mar 2000 + @version + @brief Parser for ini files. +*/ +/*--------------------------------------------------------------------------*/ + +/* + + + + +*/ +/* + + + + +ʹ˵ +ʹøÿʱ + 1.עⲻҪͬһЩ + 2.secдʱȷ[]ͬһг֡ + 3.secǰ˿ոϷ⣬һַᵼsecʶ + 4.ȷkeyֵͬһУָkeyʶ쳣 + 5.ֵ˫ʼֵȷı˫źַ + ԣűҲΪַһ֡˫ʼַ + ȷĽűҲΪַһ֡Ϊ˱쳣벻Ҫʹ + ˫ţһҪʹãԵŻ˫Ŵ档 + 6.벻Ҫʹ'\r','\n','[',']',';''"',ַЩַ + ֲԤ쳣 + 7.ֵвҪ';'Ϊ';'עͷڵģ';'ַ + ΪעͣһҪʹã''档 + 8. ڱдע͵ʱעⲻҪӢ';'ĵ''죬ע͵ģ + ĵע͡ + +*/ +#ifndef _INIPARSER_H_ +#define _INIPARSER_H_ + +/*--------------------------------------------------------------------------- + Includes + ---------------------------------------------------------------------------*/ + +#include +#include +#include +/*#include +*/ +/* + * The following #include is necessary on many Unixes but not Linux. + * It is not needed for Windows platforms. + * Uncomment it if needed. + */ + + +#include "dictionary.h" +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#define KVCSIZE 512 /*KEY and VALUE and COMMENT'size is 512*/ + + +int iniparser_add_entry( + dictionary * d, + const char * sec, + const char * key, + const char * val);/*20060311 blair modify : Ӽ¼*/ + +/*-------------------------------------------------------------------------*/ +/** + @brief Get number of sections in a dictionary + @param d Dictionary to examine + @return int Number of sections found in dictionary + + This function returns the number of sections found in a dictionary. + The test to recognize sections is done on the string stored in the + dictionary: a section name is given as "section" whereas a key is + stored as "section:key", thus the test looks for entries that do not + contain a colon. + + This clearly fails in the case a section name contains a colon, but + this should simply be avoided. + + This function returns -1 in case of error. + */ +/*--------------------------------------------------------------------------*/ + +int iniparser_getnsec(const dictionary * d); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Get name for section n in a dictionary. + @param d Dictionary to examine + @param n Section number (from 0 to nsec-1). + @return Pointer to char string + + This function locates the n-th section in a dictionary and returns + its name as a pointer to a string statically allocated inside the + dictionary. Do not free or modify the returned string! + + This function returns NULL in case of error. + */ +/*--------------------------------------------------------------------------*/ + +char * iniparser_getsecname(const dictionary * d, const int n); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Save a dictionary to a loadable ini file + @param d Dictionary to dump + @param f Opened file pointer to dump to + @return void + + This function dumps a given dictionary into a loadable ini file. + It is Ok to specify @c stderr or @c stdout as output files. + */ +/*--------------------------------------------------------------------------*/ + +void iniparser_dump_ini(const dictionary * d, FILE * f); + +/*-------------------------------------------------------------------------*/ +/** + @brief Dump a dictionary to an opened file pointer. + @param d Dictionary to dump. + @param f Opened file pointer to dump to. + @return void + + This function prints out the contents of a dictionary, one element by + line, onto the provided file pointer. It is OK to specify @c stderr + or @c stdout as output files. This function is meant for debugging + purposes mostly. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_dump(dictionary * d, FILE * f); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key, return NULL if not found + @param d Dictionary to search + @param key Key string to look for + @return pointer to statically allocated character string, or NULL. + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + NULL is returned. + The returned char pointer is pointing to a string allocated in + the dictionary, do not free or modify it. + + This function is only provided for backwards compatibility with + previous versions of iniparser. It is recommended to use + iniparser_getstring() instead. + */ +/*--------------------------------------------------------------------------*/ +char * iniparser_getstr(const dictionary * d, const char * key); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key + @param d Dictionary to search + @param key Key string to look for + @param def Default value to return if key not found. + @return pointer to statically allocated character string + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + the pointer passed as 'def' is returned. + The returned char pointer is pointing to a string allocated in + the dictionary, do not free or modify it. + */ +/*--------------------------------------------------------------------------*/ +char * iniparser_getstring(const dictionary * d, const char * key, char * def); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key, convert to an int + @param d Dictionary to search + @param key Key string to look for + @param notfound Value to return in case of error + @return integer + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + the notfound value is returned. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_getint(const dictionary * d, const char * key, const int notfound); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key, convert to a double + @param d Dictionary to search + @param key Key string to look for + @param notfound Value to return in case of error + @return double + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + the notfound value is returned. + */ +/*--------------------------------------------------------------------------*/ +double iniparser_getdouble(const dictionary * d, const char * key, const double notfound); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key, convert to a boolean + @param d Dictionary to search + @param key Key string to look for + @param notfound Value to return in case of error + @return integer + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + the notfound value is returned. + + A true boolean is found if one of the following is matched: + + - A string starting with 'y' + - A string starting with 'Y' + - A string starting with 't' + - A string starting with 'T' + - A string starting with '1' + + A false boolean is found if one of the following is matched: + + - A string starting with 'n' + - A string starting with 'N' + - A string starting with 'f' + - A string starting with 'F' + - A string starting with '0' + + The notfound value returned if no boolean is identified, does not + necessarily have to be 0 or 1. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_getboolean(const dictionary * d, const char * key, const int notfound); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Set an entry in a dictionary. + @param ini Dictionary to modify. + @param entry Entry to modify (entry name) + @param val New value to associate to the entry. + @return int 0 if Ok, -1 otherwise. + + If the given entry can be found in the dictionary, it is modified to + contain the provided value. If it cannot be found, -1 is returned. + It is Ok to set val to NULL. + */ +/*--------------------------------------------------------------------------*/ + +int iniparser_setstr(const dictionary * ini, const char * entry, const char * val); + +/*-------------------------------------------------------------------------*/ +/** + @brief Delete an entry in a dictionary + @param ini Dictionary to modify + @param entry Entry to delete (entry name) + @return void + + If the given entry can be found, it is deleted from the dictionary. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_unset(dictionary * ini, const char * entry); + +/*-------------------------------------------------------------------------*/ +/** + @brief Finds out if a given entry exists in a dictionary + @param ini Dictionary to search + @param entry Name of the entry to look for + @return integer 1 if entry exists, 0 otherwise + + Finds out if a given entry exists in the dictionary. Since sections + are stored as keys with NULL associated values, this is the only way + of querying for the presence of sections in a dictionary. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_find_entry(const dictionary * ini, const char * entry) ; + +/*-------------------------------------------------------------------------*/ +/** + @brief Parse an ini file and return an allocated dictionary object + @param ininame Name of the ini file to read. + @return Pointer to newly allocated dictionary + + This is the parser for ini files. This function is called, providing + the name of the file to be read. It returns a dictionary object that + should not be accessed directly, but through accessor functions + instead. + + The returned dictionary must be freed using iniparser_freedict(). + + */ +/*--------------------------------------------------------------------------*/ +dictionary * iniparser_load(const char * ininame); + + +/*2006/03/11 blair add : save comment and space Line*/ +int iniparser_add_comment( + dictionary *d, + const char *sec, + const char *key, + const char *comment, + const unsigned char place); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Free all memory associated to an ini dictionary + @param d Dictionary to free + @return void + + Free all memory associated to an ini dictionary. + It is mandatory to call this function before the dictionary object + gets out of the current context. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_freedict(dictionary * d); + +int iniparser_sec_getNLowLever(const dictionary * d,const char* UperLever); +char* iniparser_sec_getLowLever(const dictionary * d,const char* UpLever, int n); +void iniparser_mem_printf(const dictionary * d); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif + diff --git a/device/mpp/include/ivs_md.h b/device/mpp/include/ivs_md.h new file mode 100644 index 0000000..c24f171 --- /dev/null +++ b/device/mpp/include/ivs_md.h @@ -0,0 +1,164 @@ +/****************************************************************************** + + Copyright (C), 2001-2014, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : ivs_md.h + Version : Initial Draft + Author : Hisilicon multimedia software (IVE) group + Created : 2014/11/10 + Description : + History : + 1.Date : 2014/11/10 + Author : c00211359 + Modification: Created file +******************************************************************************/ + +#ifndef _HI_IVS_MD_H_ +#define _HI_IVS_MD_H_ + +#include "hi_md.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/***************************************************************************** +* Prototype : HI_IVS_MD_Init +* Description : Motion Detection(MD) initialization. +* Parameters : HI_VOID. +* +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_Init(HI_VOID); + +/***************************************************************************** +* Prototype : HI_IVS_MD_Exit +* Description : Motion Detection(MD) exit. +* Parameters : HI_VOID. +* +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_Exit(HI_VOID); + +/***************************************************************************** +* Prototype : HI_IVS_MD_CreateChn +* Description : Create Motion Detection(MD) Chn. +* Parameters : MD_CHN MdChn Md chn. +* MD_ATTR_S *pstMdAttr Md attribute parameters +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_CreateChn(MD_CHN MdChn,MD_ATTR_S *pstMdAttr); + +/***************************************************************************** +* Prototype : HI_IVS_MD_DestroyChn +* Description : Destroy Motion Detection(MD) chn. +* Parameters : MD_CHN MdChn Md chn that would be destroy. +* +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_DestroyChn(MD_CHN MdChn); + +/***************************************************************************** +* Prototype : HI_IVS_MD_SetChnAttr +* Description : Set Motion Detection(MD) chn attribute. +* Parameters : MD_CHN MdChn Md chn. +* MD_ATTR_S *pstMdAttr Md attribute parameters +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2015/04/10 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_SetChnAttr(MD_CHN MdChn,MD_ATTR_S *pstMdAttr); + +/***************************************************************************** +* Prototype : HI_IVS_MD_GetChnAttr +* Description : Get Motion Detection(MD) chn attribute. +* Parameters : MD_CHN MdChn Md chn. +* MD_ATTR_S *pstMdAttr Md attribute parameters +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2015/04/10 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_GetChnAttr(MD_CHN MdChn,MD_ATTR_S *pstMdAttr); + +/***************************************************************************** +* Prototype : HI_IVS_MD_GetBg +* Description : Get Motion Detection(MD) background image. +* Parameters : MD_CHN MdChn Md chn. +* IVE_DST_IMAGE_S *pstBg Output background image +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_GetBg(MD_CHN MdChn,IVE_DST_IMAGE_S *pstBg); + +/***************************************************************************** +* Prototype : HI_IVS_MD_Process +* Description : Motion Detection(MD) process. +* Parameters : MD_CHN MdChn Md chn. +* IVE_SRC_IMAGE_S *pstCur Current image +* IVE_SRC_IMAGE_S *pstRef Reference image +* IVE_DST_MEM_INFO_S *pstBlob Output blob +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_Process(MD_CHN MdChn,IVE_SRC_IMAGE_S *pstCur, + IVE_SRC_IMAGE_S *pstRef,IVE_DST_MEM_INFO_S *pstBlob); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif +#endif/*_HI_IVS_MD_H_*/ \ No newline at end of file diff --git a/device/mpp/include/list.h b/device/mpp/include/list.h new file mode 100644 index 0000000..8bf3653 --- /dev/null +++ b/device/mpp/include/list.h @@ -0,0 +1,149 @@ +/* + * Copyright (c) HighPoint Technologies, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/dev/hptrr/list.h,v 1.2.2.1.4.1 2010/06/14 02:09:06 kensmith Exp $ + */ +/* + * $Id: list.h,v 1.6 2006/10/31 06:25:28 gmm Exp $ + * Copyright (C) 2004-2005 HighPoint Technologies, Inc. All rights reserved. + */ +#ifndef _HPT_LIST_H_ +#define _HPT_LIST_H_ + +#ifndef _LINUX_LIST_H + +#ifndef HPT_INLINE +#define HPT_INLINE __inline +#endif + +typedef unsigned long HPT_UPTR; + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define INIT_LIST_HEAD(ptr) do { (ptr)->next = (ptr); (ptr)->prev = (ptr); } while (0) + +static HPT_INLINE void __list_add(struct list_head * _new, struct list_head * prev, struct list_head * next) +{ + next->prev = _new; + _new->next = next; + _new->prev = prev; + prev->next = _new; +} + +static HPT_INLINE void list_add(struct list_head *_new, struct list_head *head) +{ + __list_add(_new, head, head->next); +} + +static HPT_INLINE void list_add_tail(struct list_head *_new, struct list_head *head) +{ + __list_add(_new, head->prev, head); +} + +static HPT_INLINE void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +static HPT_INLINE void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +static HPT_INLINE void list_del_init(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + INIT_LIST_HEAD(entry); +} + +static inline void list_move(struct list_head *list, struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add(list, head); +} + +static inline void list_move_tail(struct list_head *list, + struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add_tail(list, head); +} + +static HPT_INLINE int list_empty(struct list_head *head) +{ + return head->next == head; +} + +static HPT_INLINE void __list_splice(struct list_head *list, + struct list_head *head) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + struct list_head *at = head->next; + + first->prev = head; + head->next = first; + + last->next = at; + at->prev = last; +} + +static HPT_INLINE void list_splice(struct list_head *list, struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head); +} + +static HPT_INLINE void list_splice_init(struct list_head *list, struct list_head *head) +{ + if (!list_empty(list)) { + __list_splice(list, head); + INIT_LIST_HEAD(list); + } +} + +/*#define list_entry(ptr, type, member) \ + ((type *)((char *)(ptr)-(HPT_UPTR)(&((type *)0)->member))) */ +#define list_entry(ptr, type, member) \ + ((type *)((unsigned long)(ptr)-((unsigned long)(&((type *)1)->member) - 1))) + +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +#define get_first_item(attached, type, member) \ + ((type *)((char *)((attached)->next)-(HPT_UPTR)(&((type *)0)->member))) + +#endif + +#endif diff --git a/device/mpp/include/mpi_adec.h b/device/mpp/include/mpi_adec.h new file mode 100644 index 0000000..615b742 --- /dev/null +++ b/device/mpp/include/mpi_adec.h @@ -0,0 +1,53 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : ai.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/6/15 + Description : + History : + 1.Date : 2009/6/19 + Author : p00123320 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_ADEC_H__ +#define __MPI_ADEC_H__ + +#include "hi_common.h" +#include "hi_comm_aio.h" +#include "hi_comm_adec.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_ADEC_CreateChn(ADEC_CHN AdChn, ADEC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_ADEC_DestroyChn(ADEC_CHN AdChn); + +HI_S32 HI_MPI_ADEC_SendStream(ADEC_CHN AdChn, const AUDIO_STREAM_S *pstStream, HI_BOOL bBlock); + +HI_S32 HI_MPI_ADEC_ClearChnBuf(ADEC_CHN AdChn); + +HI_S32 HI_MPI_ADEC_RegeisterDecoder(HI_S32 *ps32Handle, ADEC_DECODER_S *pstDecoder); +HI_S32 HI_MPI_ADEC_UnRegisterDecoder(HI_S32 s32Handle); + +HI_S32 HI_MPI_ADEC_GetFrame(ADEC_CHN AdChn, AUDIO_FRAME_INFO_S *pstFrmInfo, HI_BOOL bBlock); +HI_S32 HI_MPI_ADEC_ReleaseFrame(ADEC_CHN AdChn, AUDIO_FRAME_INFO_S *pstFrmInfo); +HI_S32 HI_MPI_ADEC_SendEndOfStream(ADEC_CHN AdChn, HI_BOOL bInstant); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_ADEC_H__ */ + diff --git a/device/mpp/include/mpi_ae.h b/device/mpp/include/mpi_ae.h new file mode 100644 index 0000000..2900b0c --- /dev/null +++ b/device/mpp/include/mpi_ae.h @@ -0,0 +1,71 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_ae.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2014/04/01 + Description : + History : + 1.Date : 2014/04/01 + Author : h00191408 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_AE_H__ +#define __MPI_AE_H__ + +#include "hi_comm_isp.h" +#include "hi_comm_3a.h" +#include "hi_ae_comm.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +/* The interface of ae lib register to isp. */ +HI_S32 HI_MPI_AE_Register(ISP_DEV IspDev, ALG_LIB_S *pstAeLib); +HI_S32 HI_MPI_AE_UnRegister(ISP_DEV IspDev, ALG_LIB_S *pstAeLib); + +/* The callback function of sensor register to ae lib. */ +HI_S32 HI_MPI_AE_SensorRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAeLib, SENSOR_ID SensorId, + AE_SENSOR_REGISTER_S *pstRegister); +HI_S32 HI_MPI_AE_SensorUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAeLib, SENSOR_ID SensorId); + +HI_S32 HI_MPI_ISP_SetExposureAttr(ISP_DEV IspDev, const ISP_EXPOSURE_ATTR_S *pstExpAttr); +HI_S32 HI_MPI_ISP_GetExposureAttr(ISP_DEV IspDev, ISP_EXPOSURE_ATTR_S *pstExpAttr); + +HI_S32 HI_MPI_ISP_SetAERouteAttr(ISP_DEV IspDev, const ISP_AE_ROUTE_S *pstAERouteAttr); +HI_S32 HI_MPI_ISP_GetAERouteAttr(ISP_DEV IspDev, ISP_AE_ROUTE_S *pstAERouteAttr); + +HI_S32 HI_MPI_ISP_QueryExposureInfo(ISP_DEV IspDev, ISP_EXP_INFO_S *pstExpInfo); + +HI_S32 HI_MPI_ISP_SetIrisAttr(ISP_DEV IspDev, const ISP_IRIS_ATTR_S *pstIrisAttr); +HI_S32 HI_MPI_ISP_GetIrisAttr(ISP_DEV IspDev, ISP_IRIS_ATTR_S *pstIrisAttr); + +HI_S32 HI_MPI_ISP_SetDcirisAttr(ISP_DEV IspDev, const ISP_DCIRIS_ATTR_S *pstDcirisAttr); +HI_S32 HI_MPI_ISP_GetDcirisAttr(ISP_DEV IspDev, ISP_DCIRIS_ATTR_S *pstDcirisAttr); + +HI_S32 HI_MPI_ISP_SetPirisAttr(ISP_DEV IspDev, const ISP_PIRIS_ATTR_S *pstPirisAttr); +HI_S32 HI_MPI_ISP_GetPirisAttr(ISP_DEV IspDev, ISP_PIRIS_ATTR_S *pstPirisAttr); + +HI_S32 HI_MPI_ISP_SetAERouteAttrEx(ISP_DEV IspDev, const ISP_AE_ROUTE_EX_S *pstAERouteAttrEx); +HI_S32 HI_MPI_ISP_GetAERouteAttrEx(ISP_DEV IspDev, ISP_AE_ROUTE_EX_S *pstAERouteAttrEx); + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif + + diff --git a/device/mpp/include/mpi_aenc.h b/device/mpp/include/mpi_aenc.h new file mode 100644 index 0000000..2c7cced --- /dev/null +++ b/device/mpp/include/mpi_aenc.h @@ -0,0 +1,55 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : ai.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/6/15 + Description : + History : + 1.Date : 2009/6/15 + Author : p00123320 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_AENC_H__ +#define __MPI_AENC_H__ + +#include "hi_common.h" +#include "hi_comm_aio.h" +#include "hi_comm_aenc.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +#define AENC_ADAPT_MAGIC 0Xfcfcfcfc + +HI_S32 HI_MPI_AENC_CreateChn(AENC_CHN AeChn, const AENC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_AENC_DestroyChn(AENC_CHN AeChn); + +HI_S32 HI_MPI_AENC_SendFrame(AENC_CHN AeChn, const AUDIO_FRAME_S *pstFrm, const AEC_FRAME_S *pstAecFrm); + +HI_S32 HI_MPI_AENC_GetStream(AENC_CHN AeChn, AUDIO_STREAM_S *pstStream, HI_S32 s32MilliSec); +HI_S32 HI_MPI_AENC_ReleaseStream(AENC_CHN AeChn, const AUDIO_STREAM_S *pstStream); + +HI_S32 HI_MPI_AENC_GetFd(AENC_CHN AeChn); + +HI_S32 HI_MPI_AENC_RegeisterEncoder(HI_S32 *ps32Handle, AENC_ENCODER_S *pstEncoder); +HI_S32 HI_MPI_AENC_UnRegisterEncoder(HI_S32 s32Handle); + +HI_S32 HI_MPI_AENC_SaveFile(AENC_CHN AeChn, AUDIO_SAVE_FILE_INFO_S *pstSaveFileInfo); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_AENC_H__ */ + diff --git a/device/mpp/include/mpi_af.h b/device/mpp/include/mpi_af.h new file mode 100644 index 0000000..296d596 --- /dev/null +++ b/device/mpp/include/mpi_af.h @@ -0,0 +1,60 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_af.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/19 + Description : + History : + 1.Date : 2012/12/19 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_AF_H__ +#define __MPI_AF_H__ + +#include "hi_comm_isp.h" +#include "hi_comm_3a.h" +#include "hi_af_comm.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/* The interface of af lib register to isp. */ +HI_S32 HI_MPI_AF_Register(ISP_DEV IspDev, ALG_LIB_S *pstAfLib); +HI_S32 HI_MPI_AF_UnRegister(ISP_DEV IspDev, ALG_LIB_S *pstAfLib); + +#if 0 +/* The callback function of sensor register to af lib. */ +HI_S32 hi_af_sensor_register_cb(ALG_LIB_S *pstAfLib, SENSOR_ID SensorId, + CMOS_ISP_AF_DEFAULT_S *pstSnsDft, SENSOR_AF_EXP_FUNC_S *pstSnsExp); +#endif + +/* The new awb lib is compatible with the old mpi interface. */ +HI_S32 HI_MPI_ISP_SetFocusType(ISP_DEV IspDev, ISP_OP_TYPE_E enFocusType); //not support yet +HI_S32 HI_MPI_ISP_GetFocusType(ISP_DEV IspDev, ISP_OP_TYPE_E *penFocusType); //not support yet + +HI_S32 HI_MPI_ISP_SetAFAttr(ISP_DEV IspDev, const ISP_AF_ATTR_S *pstAFAttr); //not support yet +HI_S32 HI_MPI_ISP_GetAFAttr(ISP_DEV IspDev, ISP_AF_ATTR_S *pstAFAttr); //not support yet + +HI_S32 HI_MPI_ISP_SetMFAttr(ISP_DEV IspDev, const ISP_MF_ATTR_S *pstMFAttr); //not support yet +HI_S32 HI_MPI_ISP_GetMFAttr(ISP_DEV IspDev, ISP_MF_ATTR_S *pstMFAttr); //not support yet + +HI_S32 HI_MPI_ISP_ManualFocusMove(ISP_DEV IspDev, HI_S32 s32MoveSteps); //not support yet + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif + diff --git a/device/mpp/include/mpi_ai.h b/device/mpp/include/mpi_ai.h new file mode 100644 index 0000000..41c4cdf --- /dev/null +++ b/device/mpp/include/mpi_ai.h @@ -0,0 +1,75 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_ai.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_AI_H__ +#define __MPI_AI_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_aio.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_AI_SetPubAttr(AUDIO_DEV AudioDevId, const AIO_ATTR_S *pstAttr); +HI_S32 HI_MPI_AI_GetPubAttr(AUDIO_DEV AudioDevId, AIO_ATTR_S *pstAttr); + +HI_S32 HI_MPI_AI_Enable(AUDIO_DEV AudioDevId); +HI_S32 HI_MPI_AI_Disable(AUDIO_DEV AudioDevId); + +HI_S32 HI_MPI_AI_EnableChn(AUDIO_DEV AudioDevId, AI_CHN AiChn); +HI_S32 HI_MPI_AI_DisableChn(AUDIO_DEV AudioDevId, AI_CHN AiChn); + +HI_S32 HI_MPI_AI_GetFrame(AUDIO_DEV AudioDevId, AI_CHN AiChn, AUDIO_FRAME_S *pstFrm, AEC_FRAME_S *pstAecFrm, HI_S32 s32MilliSec); +HI_S32 HI_MPI_AI_ReleaseFrame(AUDIO_DEV AudioDevId, AI_CHN AiChn, AUDIO_FRAME_S *pstFrm, AEC_FRAME_S *pstAecFrm); + +HI_S32 HI_MPI_AI_SetChnParam(AUDIO_DEV AudioDevId, AI_CHN AiChn, AI_CHN_PARAM_S *pstChnParam); +HI_S32 HI_MPI_AI_GetChnParam(AUDIO_DEV AudioDevId, AI_CHN AiChn, AI_CHN_PARAM_S *pstChnParam); + +HI_S32 HI_MPI_AI_SetVqeAttr(AUDIO_DEV AiDevId, AI_CHN AiChn, AUDIO_DEV AoDevId, AO_CHN AoChn, AI_VQE_CONFIG_S *pstVqeConfig); +HI_S32 HI_MPI_AI_GetVqeAttr(AUDIO_DEV AiDevId, AI_CHN AiChn, AI_VQE_CONFIG_S *pstVqeConfig); +HI_S32 HI_MPI_AI_EnableVqe(AUDIO_DEV AiDevId, AI_CHN AiChn); +HI_S32 HI_MPI_AI_DisableVqe(AUDIO_DEV AiDevId, AI_CHN AiChn); + +HI_S32 HI_MPI_AI_EnableReSmp(AUDIO_DEV AudioDevId, AI_CHN AiChn, AUDIO_SAMPLE_RATE_E enOutSampleRate); +HI_S32 HI_MPI_AI_DisableReSmp(AUDIO_DEV AudioDevId, AI_CHN AiChn); + +HI_S32 HI_MPI_AI_SetTrackMode(AUDIO_DEV AudioDevId, AUDIO_TRACK_MODE_E enTrackMode); +HI_S32 HI_MPI_AI_GetTrackMode(AUDIO_DEV AudioDevId, AUDIO_TRACK_MODE_E *penTrackMode); +HI_S32 HI_MPI_AI_SaveFile(AUDIO_DEV AudioDevId, AI_CHN AiChn, AUDIO_SAVE_FILE_INFO_S *pstSaveFileInfo); + +HI_S32 HI_MPI_AI_ClrPubAttr(AUDIO_DEV AudioDevId); + +HI_S32 HI_MPI_AI_GetFd(AUDIO_DEV AudioDevId, AI_CHN AiChn); + +HI_S32 HI_MPI_AI_SetVqeVolume(AUDIO_DEV AudioDevId, AI_CHN AiChn, HI_S32 s32VolumeDb); +HI_S32 HI_MPI_AI_GetVqeVolume(AUDIO_DEV AudioDevId, AI_CHN AiChn, HI_S32 *ps32VolumeDb); + +HI_S32 HI_MPI_AI_EnableAecRefFrame(AUDIO_DEV AiDevId, AI_CHN AiChn, AUDIO_DEV AoDevId, AO_CHN AoChn); +HI_S32 HI_MPI_AI_DisableAecRefFrame(AUDIO_DEV AiDevId, AI_CHN AiChn); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_AI_H__ */ + diff --git a/device/mpp/include/mpi_ao.h b/device/mpp/include/mpi_ao.h new file mode 100644 index 0000000..c5a1c1e --- /dev/null +++ b/device/mpp/include/mpi_ao.h @@ -0,0 +1,73 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_ao.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_AO_H__ +#define __MPI_AO_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_aio.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_AO_SetPubAttr(AUDIO_DEV AudioDevId, const AIO_ATTR_S *pstAttr); +HI_S32 HI_MPI_AO_GetPubAttr(AUDIO_DEV AudioDevId, AIO_ATTR_S *pstAttr); + +HI_S32 HI_MPI_AO_Enable(AUDIO_DEV AudioDevId); +HI_S32 HI_MPI_AO_Disable(AUDIO_DEV AudioDevId); + +HI_S32 HI_MPI_AO_EnableChn(AUDIO_DEV AudioDevId, AO_CHN AoChn); +HI_S32 HI_MPI_AO_DisableChn(AUDIO_DEV AudioDevId, AO_CHN AoChn); + +HI_S32 HI_MPI_AO_SendFrame(AUDIO_DEV AudioDevId, AO_CHN AoChn, const AUDIO_FRAME_S *pstData, HI_S32 s32MilliSec); + +HI_S32 HI_MPI_AO_EnableReSmp(AUDIO_DEV AudioDevId, AO_CHN AoChn, AUDIO_SAMPLE_RATE_E enInSampleRate); +HI_S32 HI_MPI_AO_DisableReSmp(AUDIO_DEV AudioDevId, AO_CHN AoChn); + +HI_S32 HI_MPI_AO_ClearChnBuf(AUDIO_DEV AudioDevId ,AO_CHN AoChn); +HI_S32 HI_MPI_AO_QueryChnStat(AUDIO_DEV AudioDevId ,AO_CHN AoChn, AO_CHN_STATE_S *pstStatus); + +HI_S32 HI_MPI_AO_PauseChn(AUDIO_DEV AudioDevId, AO_CHN AoChn); +HI_S32 HI_MPI_AO_ResumeChn(AUDIO_DEV AudioDevId, AO_CHN AoChn); + +HI_S32 HI_MPI_AO_SetVolume(AUDIO_DEV AudioDevId, HI_S32 s32VolumeDb); +HI_S32 HI_MPI_AO_GetVolume(AUDIO_DEV AudioDevId, HI_S32 *ps32VolumeDb); + +HI_S32 HI_MPI_AO_SetMute(AUDIO_DEV AudioDevId, HI_BOOL bEnable, AUDIO_FADE_S *pstFade); +HI_S32 HI_MPI_AO_GetMute(AUDIO_DEV AudioDevId, HI_BOOL *pbEnable, AUDIO_FADE_S *pstFade); + +HI_S32 HI_MPI_AO_SetTrackMode(AUDIO_DEV AudioDevId, AUDIO_TRACK_MODE_E enTrackMode); +HI_S32 HI_MPI_AO_GetTrackMode(AUDIO_DEV AudioDevId, AUDIO_TRACK_MODE_E *penTrackMode); + +HI_S32 HI_MPI_AO_GetFd(AUDIO_DEV AudioDevId, AO_CHN AoChn); + +HI_S32 HI_MPI_AO_ClrPubAttr(AUDIO_DEV AudioDevId); +HI_S32 HI_MPI_AO_SetVqeAttr(AUDIO_DEV AudioDevId, AO_CHN AoChn, AO_VQE_CONFIG_S *pstVqeConfig); +HI_S32 HI_MPI_AO_GetVqeAttr(AUDIO_DEV AudioDevId, AO_CHN AoChn, AO_VQE_CONFIG_S *pstVqeConfig); +HI_S32 HI_MPI_AO_EnableVqe(AUDIO_DEV AudioDevId, AO_CHN AoChn); +HI_S32 HI_MPI_AO_DisableVqe(AUDIO_DEV AudioDevId, AO_CHN AoChn); +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_AO_H__ */ + diff --git a/device/mpp/include/mpi_awb.h b/device/mpp/include/mpi_awb.h new file mode 100644 index 0000000..606b67f --- /dev/null +++ b/device/mpp/include/mpi_awb.h @@ -0,0 +1,67 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_awb.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/19 + Description : + History : + 1.Date : 2012/12/19 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_AWB_H__ +#define __MPI_AWB_H__ + +#include "hi_comm_isp.h" +#include "hi_comm_3a.h" +#include "hi_awb_comm.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/* The interface of awb lib register to isp. */ +HI_S32 HI_MPI_AWB_Register(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib); +HI_S32 HI_MPI_AWB_UnRegister(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib); + +/* The callback function of sensor register to awb lib. */ +HI_S32 HI_MPI_AWB_SensorRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib, SENSOR_ID SensorId, + AWB_SENSOR_REGISTER_S *pstRegister); +HI_S32 HI_MPI_AWB_SensorUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib, SENSOR_ID SensorId); + +HI_S32 HI_MPI_ISP_AWBLibRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAWBLib, + ISP_AWB_REGISTER_S *pstRegister); + + +HI_S32 HI_MPI_ISP_SetWBAttr(ISP_DEV IspDev, const ISP_WB_ATTR_S *pstWBAttr); +HI_S32 HI_MPI_ISP_GetWBAttr(ISP_DEV IspDev, ISP_WB_ATTR_S *pstWBAttr); + +HI_S32 HI_MPI_ISP_SetAWBAttrEx(ISP_DEV IspDev, ISP_AWB_ATTR_EX_S *pstAWBAttrEx); +HI_S32 HI_MPI_ISP_GetAWBAttrEx(ISP_DEV IspDev, ISP_AWB_ATTR_EX_S *pstAWBAttrEx); + +HI_S32 HI_MPI_ISP_SetCCMAttr(ISP_DEV IspDev, const ISP_COLORMATRIX_ATTR_S *pstCCMAttr); +HI_S32 HI_MPI_ISP_GetCCMAttr(ISP_DEV IspDev, ISP_COLORMATRIX_ATTR_S *pstCCMAttr); + +HI_S32 HI_MPI_ISP_SetSaturationAttr(ISP_DEV IspDev, const ISP_SATURATION_ATTR_S *pstSatAttr); +HI_S32 HI_MPI_ISP_GetSaturationAttr(ISP_DEV IspDev, ISP_SATURATION_ATTR_S *pstSatAttr); + +HI_S32 HI_MPI_ISP_SetColorToneAttr(ISP_DEV IspDev, const ISP_COLOR_TONE_ATTR_S *pstCTAttr); +HI_S32 HI_MPI_ISP_GetColorToneAttr(ISP_DEV IspDev, ISP_COLOR_TONE_ATTR_S *pstCTAttr); + +HI_S32 HI_MPI_ISP_QueryWBInfo(ISP_DEV IspDev, ISP_WB_INFO_S *pstWBInfo); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif + diff --git a/device/mpp/include/mpi_fisheye.h b/device/mpp/include/mpi_fisheye.h new file mode 100644 index 0000000..f65a10c --- /dev/null +++ b/device/mpp/include/mpi_fisheye.h @@ -0,0 +1,140 @@ +/****************************************************************************** + + Copyright (C), 2013-2033, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_fisheye.h + Version : Initial Draft + Author : Hisilicon Hi35xx MPP Team + Created : 20115/06/29 + Last Modified : + Description : mpi functions declaration + Function List : + History : +******************************************************************************/ +#ifndef __MPI_FISHEYE_H__ +#define __MPI_FISHEYE_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_fisheye.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_BeginJob + Description : Begin a fisheye job,then add task into the job,fisheye will finish all the task in the job. + Input : FISHEYE_HANDLE *phHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 20115/06/29 + Author : c00191088 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_FISHEYE_BeginJob(FISHEYE_HANDLE *phHandle); + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_EndJob + Description : End a job,all tasks in the job will be submmitted to fisheye + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 20115/06/29 + Author : c00191088 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_FISHEYE_EndJob(FISHEYE_HANDLE hHandle); + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_CancelJob + Description : Cancel a job ,then all tasks in the job will not be submmitted to fisheye + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 20115/06/29 + Author : c00191088 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_FISHEYE_CancelJob(FISHEYE_HANDLE hHandle); + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_AddScaleTask + Description : Add a task to a fisheye job + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 20115/06/29 + Author : c00191088 + Modification : Created function +<$/> +*****************************************************************************/ + HI_S32 HI_MPI_FISHEYE_AddCorrectionTask(FISHEYE_HANDLE hHandle, FISHEYE_TASK_ATTR_S *pstTask, const FISHEYE_ATTR_S *pstFisheyeAttr); + + + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_AddDrawLineTask + Description : add a draw line task into a job + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_FISHEYE_AddLdcTask(FISHEYE_HANDLE hHandle, FISHEYE_TASK_ATTR_S * pstTask, LDC_ATTR_S * pstFisheyeAddLdc); + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_AddCoverTask + Description : add a draw point task into a job + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ + HI_S32 HI_MPI_FISHEYE_AddPmfTask(FISHEYE_HANDLE hHandle, FISHEYE_TASK_ATTR_S *pstTask, FISHEYE_ADD_PMF_S *pstFisheyeAddPmf); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_FISHEYE_H__ */ + diff --git a/device/mpp/include/mpi_isp.h b/device/mpp/include/mpi_isp.h new file mode 100644 index 0000000..496b70d --- /dev/null +++ b/device/mpp/include/mpi_isp.h @@ -0,0 +1,162 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_isp.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2010/12/20 + Description : + History : + 1.Date : 2010/12/20 + Author : x00100808 + Modification: Created file + +******************************************************************************/ + +#ifndef __MPI_ISP_H__ +#define __MPI_ISP_H__ + +#include "hi_comm_isp.h" +#include "hi_comm_sns.h" +#include "hi_comm_3a.h" +#include "hi_comm_video.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/* Firmware Main Operation */ +HI_S32 HI_MPI_ISP_Init(ISP_DEV IspDev); +HI_S32 HI_MPI_ISP_MemInit(ISP_DEV IspDev); +HI_S32 HI_MPI_ISP_Run(ISP_DEV IspDev); +HI_S32 HI_MPI_ISP_Exit(ISP_DEV IspDev); + +HI_S32 HI_MPI_ISP_SensorRegCallBack(ISP_DEV IspDev, SENSOR_ID SensorId, ISP_SENSOR_REGISTER_S *pstRegister); +HI_S32 HI_MPI_ISP_SensorUnRegCallBack(ISP_DEV IspDev, SENSOR_ID SensorId); + +/* if have registered multy libs, set bind attr to appoint the active lib. */ +HI_S32 HI_MPI_ISP_SetBindAttr(ISP_DEV IspDev, const ISP_BIND_ATTR_S *pstBindAttr); +HI_S32 HI_MPI_ISP_GetBindAttr(ISP_DEV IspDev, ISP_BIND_ATTR_S *pstBindAttr); +HI_S32 HI_MPI_ISP_AELibRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAeLib, + ISP_AE_REGISTER_S *pstRegister); +HI_S32 HI_MPI_ISP_AWBLibRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib, + ISP_AWB_REGISTER_S *pstRegister); +HI_S32 HI_MPI_ISP_AFLibRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAfLib, + ISP_AF_REGISTER_S *pstRegister); +HI_S32 HI_MPI_ISP_AELibUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAeLib); +HI_S32 HI_MPI_ISP_AWBLibUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib); +HI_S32 HI_MPI_ISP_AFLibUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAfLib); + +HI_S32 HI_MPI_ISP_SetPubAttr(ISP_DEV IspDev, const ISP_PUB_ATTR_S *pstPubAttr); +HI_S32 HI_MPI_ISP_GetPubAttr(ISP_DEV IspDev, ISP_PUB_ATTR_S *pstPubAttr); + +HI_S32 HI_MPI_ISP_SetFMWState(ISP_DEV IspDev, const ISP_FMW_STATE_E enState); +HI_S32 HI_MPI_ISP_GetFMWState(ISP_DEV IspDev, ISP_FMW_STATE_E *penState); + +HI_S32 HI_MPI_ISP_SetWDRMode(ISP_DEV IspDev, const ISP_WDR_MODE_S *pstWDRMode); +HI_S32 HI_MPI_ISP_GetWDRMode(ISP_DEV IspDev, ISP_WDR_MODE_S *pstWDRMode); + +HI_S32 HI_MPI_ISP_SetModuleControl(ISP_DEV IspDev, const ISP_MODULE_CTRL_U *punModCtrl); +HI_S32 HI_MPI_ISP_GetModuleControl(ISP_DEV IspDev, ISP_MODULE_CTRL_U *punModCtrl); + +/* General Function Settings */ +HI_S32 HI_MPI_ISP_SetDRCAttr(ISP_DEV IspDev, const ISP_DRC_ATTR_S *pstDRC); +HI_S32 HI_MPI_ISP_GetDRCAttr(ISP_DEV IspDev, ISP_DRC_ATTR_S *pstDRC); + +HI_S32 HI_MPI_ISP_SetFSWDRAttr(ISP_DEV IspDev, const ISP_WDR_FS_ATTR_S *pstFSWDRAttr); +HI_S32 HI_MPI_ISP_GetFSWDRAttr(ISP_DEV IspDev, ISP_WDR_FS_ATTR_S *pstFSWDRAttr); + +HI_S32 HI_MPI_ISP_SetDPCalibrate(ISP_DEV IspDev, const ISP_DP_STATIC_CALIBRATE_S *pstDPCalibrate); +HI_S32 HI_MPI_ISP_GetDPCalibrate(ISP_DEV IspDev, ISP_DP_STATIC_CALIBRATE_S *pstDPCalibrate); + +HI_S32 HI_MPI_ISP_SetDPStaticAttr(ISP_DEV IspDev, const ISP_DP_STATIC_ATTR_S *pstDPStaticAttr); +HI_S32 HI_MPI_ISP_GetDPStaticAttr(ISP_DEV IspDev, ISP_DP_STATIC_ATTR_S *pstDPStaticAttr); +HI_S32 HI_MPI_ISP_SetDPDynamicAttr(ISP_DEV IspDev, const ISP_DP_DYNAMIC_ATTR_S *pstDPDynamicAttr); +HI_S32 HI_MPI_ISP_GetDPDynamicAttr(ISP_DEV IspDev, ISP_DP_DYNAMIC_ATTR_S *pstDPDynamicAttr); + +HI_S32 HI_MPI_ISP_SetDISAttr(ISP_DEV IspDev, const ISP_DIS_ATTR_S *pstDISAttr); +HI_S32 HI_MPI_ISP_GetDISAttr(ISP_DEV IspDev, ISP_DIS_ATTR_S *pstDISAttr); + +HI_S32 HI_MPI_ISP_SetMeshShadingAttr(ISP_DEV IspDev, const ISP_SHADING_ATTR_S *pstShadingAttr); +HI_S32 HI_MPI_ISP_GetMeshShadingAttr(ISP_DEV IspDev, ISP_SHADING_ATTR_S *pstShadingAttr); + +HI_S32 HI_MPI_ISP_SetNRAttr(ISP_DEV IspDev, const ISP_NR_ATTR_S *pstNRAttr); +HI_S32 HI_MPI_ISP_GetNRAttr(ISP_DEV IspDev, ISP_NR_ATTR_S *pstNRAttr); + +HI_S32 HI_MPI_ISP_SetGammaAttr(ISP_DEV IspDev, const ISP_GAMMA_ATTR_S *pstGammaAttr); +HI_S32 HI_MPI_ISP_GetGammaAttr(ISP_DEV IspDev, ISP_GAMMA_ATTR_S *pstGammaAttr); + +HI_S32 HI_MPI_ISP_SetGammaFEAttr(ISP_DEV IspDev, const ISP_GAMMAFE_ATTR_S *pstGammaFEAttr); +HI_S32 HI_MPI_ISP_GetGammaFEAttr(ISP_DEV IspDev, ISP_GAMMAFE_ATTR_S *pstGammaFEAttr); + +HI_S32 HI_MPI_ISP_SetSharpenAttr(ISP_DEV IspDev, const ISP_SHARPEN_ATTR_S *pstSharpenAttr); +HI_S32 HI_MPI_ISP_GetSharpenAttr(ISP_DEV IspDev, ISP_SHARPEN_ATTR_S *pstSharpenAttr); + +HI_S32 HI_MPI_ISP_SetUVNRAttr(ISP_DEV IspDev, ISP_UVNR_ATTR_S *pstUvnrAttr); +HI_S32 HI_MPI_ISP_GetUVNRAttr(ISP_DEV IspDev, ISP_UVNR_ATTR_S *pstUvnrAttr); + +HI_S32 HI_MPI_ISP_SetCrosstalkAttr(ISP_DEV IspDev, const ISP_CR_ATTR_S *pstCRAttr); +HI_S32 HI_MPI_ISP_GetCrosstalkAttr(ISP_DEV IspDev, ISP_CR_ATTR_S *pstCRAttr); + +HI_S32 HI_MPI_ISP_SetAntiFalseColorAttr(ISP_DEV IspDev, const ISP_ANTI_FALSECOLOR_S *pstAntiFC); +HI_S32 HI_MPI_ISP_GetAntiFalseColorAttr(ISP_DEV IspDev, ISP_ANTI_FALSECOLOR_S *pstAntiFC); + +HI_S32 HI_MPI_ISP_SetDemosaicAttr(ISP_DEV IspDev, const ISP_DEMOSAIC_ATTR_S *pstDemosaicAttr); +HI_S32 HI_MPI_ISP_GetDemosaicAttr(ISP_DEV IspDev, ISP_DEMOSAIC_ATTR_S *pstDemosaicAttr); + +HI_S32 HI_MPI_ISP_SetBlackLevelAttr(ISP_DEV IspDev, const ISP_BLACK_LEVEL_S *pstBlackLevel); +HI_S32 HI_MPI_ISP_GetBlackLevelAttr(ISP_DEV IspDev, ISP_BLACK_LEVEL_S *pstBlackLevel); + +/* block, return fpn frame when this is function is called. */ +HI_S32 HI_MPI_ISP_FPNCalibrate(ISP_DEV IspDev, ISP_FPN_CALIBRATE_ATTR_S *pstCalibrateAttr); +HI_S32 HI_MPI_ISP_SetFPNAttr(ISP_DEV IspDev, const ISP_FPN_ATTR_S *pstFPNAttr); +HI_S32 HI_MPI_ISP_GetFPNAttr(ISP_DEV IspDev, ISP_FPN_ATTR_S *pstFPNAttr); + +HI_S32 HI_MPI_ISP_SetDeFogAttr(ISP_DEV IspDev, const ISP_DEFOG_ATTR_S *pstDefogAttr); +HI_S32 HI_MPI_ISP_GetDeFogAttr(ISP_DEV IspDev, ISP_DEFOG_ATTR_S *pstDefogAttr); + +HI_S32 HI_MPI_ISP_SetDCFInfo(const ISP_DCF_INFO_S *pstIspDCF); +HI_S32 HI_MPI_ISP_GetDCFInfo(ISP_DCF_INFO_S *pstIspDCF); + +HI_S32 HI_MPI_ISP_SetAcmAttr(ISP_DEV IspDev, ISP_ACM_ATTR_S *pstAcmAttr); +HI_S32 HI_MPI_ISP_GetAcmAttr(ISP_DEV IspDev, ISP_ACM_ATTR_S *pstAcmAttr); + +HI_S32 HI_MPI_ISP_SetAcmCoeff(ISP_DEV IspDev, ISP_ACM_LUT_S *pstAcmCoef, ISP_ACM_MODE_E enMode); +HI_S32 HI_MPI_ISP_GetAcmCoeff(ISP_DEV IspDev, ISP_ACM_LUT_S *pstAcmCoef, ISP_ACM_MODE_E enMode); + +HI_S32 HI_MPI_ISP_SetRgbirAttr(ISP_DEV IspDev, ISP_RGBIR_ATTR_S *pstRgbirAttr); +HI_S32 HI_MPI_ISP_GetRgbirAttr(ISP_DEV IspDev, ISP_RGBIR_ATTR_S *pstRgbirAttr); +HI_S32 HI_MPI_ISP_SetRgbirCtrl(ISP_DEV IspDev, ISP_RGBIR_CTRL_S *pstRgbirCtrl); +HI_S32 HI_MPI_ISP_GetRgbirCtrl(ISP_DEV IspDev, ISP_RGBIR_CTRL_S *pstRgbirCtrl); + +HI_S32 HI_MPI_ISP_QueryInnerStateInfo(ISP_DEV IspDev, ISP_INNER_STATE_INFO_S *pstInnerStateInfo); + +HI_S32 HI_MPI_ISP_SetStatisticsConfig(ISP_DEV IspDev, const ISP_STATISTICS_CFG_S *pstStatCfg); +HI_S32 HI_MPI_ISP_GetStatisticsConfig(ISP_DEV IspDev, ISP_STATISTICS_CFG_S *pstStatCfg); +HI_S32 HI_MPI_ISP_GetStatistics(ISP_DEV IspDev, ISP_STATISTICS_S *pstStat); + +HI_S32 HI_MPI_ISP_SetRegister(ISP_DEV IspDev, HI_U32 u32Addr, HI_U32 u32Value); +HI_S32 HI_MPI_ISP_GetRegister(ISP_DEV IspDev, HI_U32 u32Addr, HI_U32 *pu32Value); + +HI_S32 HI_MPI_ISP_SnsRegsCfg(ISP_DEV IspDev, ISP_SNS_REGS_INFO_S *pstSnsRegsInfo); + +HI_S32 HI_MPI_ISP_GetVDTimeOut(ISP_DEV IspDev, ISP_VD_INFO_S *pstIspVdInfo, HI_U32 u32MilliSec); + +HI_S32 HI_MPI_ISP_GetISPRegAttr(ISP_DEV IspDev, ISP_REG_ATTR_S * pstIspRegAttr); + +HI_S32 HI_MPI_ISP_SetDebug(ISP_DEV IspDev, const ISP_DEBUG_INFO_S * pstIspDebug); +HI_S32 HI_MPI_ISP_GetDebug(ISP_DEV IspDev, ISP_DEBUG_INFO_S * pstIspDebug); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__MPI_ISP_H__ */ + diff --git a/device/mpp/include/mpi_ive.h b/device/mpp/include/mpi_ive.h new file mode 100644 index 0000000..a17ebcd --- /dev/null +++ b/device/mpp/include/mpi_ive.h @@ -0,0 +1,1047 @@ +/****************************************************************************** + + Copyright (C), 2001-2014, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_ive.h + Version : Initial Draft + Author : Hisilicon multimedia software (IVE) group + Created : 2011/05/16 + Description : + History : + 1.Date : 2011/05/16 + Author : j00169368 + Modification: Created file + + 2.Date : 2013/07/01~2014/08/08 + Author : t00228657\c00211359\c00206215 + Modification: Add MPI function +******************************************************************************/ +#ifndef _HI_MPI_IVE_H_ +#define _HI_MPI_IVE_H_ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include "hi_ive.h" + +/***************************************************************************** +* Prototype : HI_MPI_IVE_DMA +* Description : Direct memory access (DMA): +* 1.Direct memory copy; +* 2. Copy with interval bytes; +* 3. Memset using 3 bytes; +* 4. Memset using 8 bytes; +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task. +* IVE_DATA_S *pstSrc Input source data.The input data is treated as U8C1 data. +* IVE_DATA_S *pstDst Output result data. +* IVE_DMA_CTRL_S *pstDmaCtrl DMA control parameter. +* HI_BOOL bInstant Flag indicating whether to generate an interrupt. +* If the output result blocks the next operation, +* set bInstant to HI_TRUE. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 32x1 pixels to 1920x1080 pixels. +* The stride must be 16-byte-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Data : 2013-07-19 +* Author : Chen Quanfu +* Modification : Modify parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_DMA(IVE_HANDLE *pIveHandle, IVE_DATA_S *pstSrc, + IVE_DST_DATA_S *pstDst, IVE_DMA_CTRL_S *pstDmaCtrl,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Filter +* Description : 5x5 template filter. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. +* The U8C1,SP420 and SP422 input formats are supported. +* IVE_DST_IMAGE_S *pstDst Output result, of same type with the input. +* IVE_FILTER_CTRL_S *pstFltCtrl Control parameters of filter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified function parameters + +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Filter(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_FILTER_CTRL_S *pstFltCtrl,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_CSC +* Description : YUV2RGB\YUV2HSV\YUV2LAB\RGB2YUV color space conversion are supported. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data: +* 1. SP420\SP422 type for YUV2RGB\YUV2HSV\YUV2LAB; +* 2. U8C3_PACKAGE\U8C3_PLANAR type for RGB2YUV; +* IVE_DST_IMAGE_S *pstDst Output result: +* 1. U8C3_PACKAGE\U8C3_PLANAR typed for YUV2RGB\YUV2HSV\YUV2LAB; +* 2. SP420\SP422 type for RGB2YUV; +* IVE_CSC_CTRL_S *pstCscCtrl Control parameters for CSC +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-08-09 +* Author : Tan Bing +* Modification : Modified function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_CSC(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_CSC_CTRL_S *pstCscCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_FILTER_AND_CSC +* Description : Only support YUV2RGB color space conversion. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task. +* IVE_SRC_IMAGE_S *pstSrc Input source data.Only SP420\SP422 type are supported. +* IVE_DST_IMAGE_S *pstDst Output result.Only U8C3_PACKAGE\U8C3_PLANAR are supported. +* IVE_FILTER_AND_CSC_CTRL_S *pstFltCscCtrl Control parameters. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-08-09 +* Author : Tan Bing +* Modification : Modified function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_FilterAndCSC(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_FILTER_AND_CSC_CTRL_S *pstFltCscCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Sobel +* Description : SOBEL is used to extract the gradient information. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only the U8C1 input image is supported. +* IVE_DST_IMAGE_S *pstDstH The (horizontal) result of input image filtered by the input mask; +* IVE_DST_IMAGE_S *pstDstV The (vertical) result of input image filtered by the transposed mask; +* IVE_SOBEL_CTRL_S *pstSobelCtrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 1. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified function parameters +* +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Sobel(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDstH, IVE_DST_IMAGE_S *pstDstV, + IVE_SOBEL_CTRL_S *pstSobelCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_MagAndAng +* Description : MagAndAng is used to extract the edge information. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_INFO_S *pstSrc Input source data. Only the U8C1 input format is supported. +* IVE_MEM_INFO_S *pstDstMag Output magnitude. +* IVE_MEM_INFO_S *pstDstAng Output angle. +* If the output mode is set to magnitude only, +* this item can be set to null. +* IVE_MAG_AND_ANG_CTRL_S *pstMagAndAngCtrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-17 +* Author : Chen Quanfu +* Modification : Modified function and control parameter name +* 3. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified function parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_MagAndAng(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDstMag, IVE_DST_IMAGE_S *pstDstAng, + IVE_MAG_AND_ANG_CTRL_S *pstMagAndAngCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Dilate +* Description : 5x5 template dilate. Only the U8C1 binary image input is supported.Or else the result is not expected. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input binary image, which consists of 0 or 255; +* IVE_DST_IMAGE_S *pstDst Output result. +* IVE_DILATE_CTRL_S *pstDilateCtrl Control parameters. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* The input value, output value, and mask value must be 0 or 255. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Dilate(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_DILATE_CTRL_S *pstDilateCtrl,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Erode +* Parameters : 5x5 template erode. Only the U8C1 binary image input is supported.Or else the result is not correct. +* Input : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input binary image, which consists of 0 or 255; +* IVE_DST_IMAGE_S *pstDst Output result. +* IVE_ERODE_CTRL_S *pstErodeCtrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* The input value, output value, and mask value must be 0 or 255. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Erode(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_ERODE_CTRL_S *pstErodeCtrl,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Thresh +* Description : Thresh operation to the input image. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_THRESH_CTRL_S *pstThrCtrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-23 +* Author : Tan Bing +* Modification : Modification +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Thresh(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_THRESH_CTRL_S *pstThrCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_And +* Description : Binary images' And operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 The input source1. Only U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 The input source2.Only U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result of " src1 & src2 ". +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_And(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Sub +* Description : Two gray images' Sub operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 Minuend of the input source.Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 Subtrahend of the input source.Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result of src1 minus src2 +* IVE_SUB_CTRL_S *pstSubCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-08-09 +* Author : Tan Bing +* Modification : Modified function parameter +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Sub(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, IVE_SUB_CTRL_S *pstSubCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Or +* Description : Two binary images' Or operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 Input source1. Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 Input source2. Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result src1 or src2 +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-08-09 +* Author : Tan Bing +* Modification : Modified function parameter +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Or(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_INTEG +* Description : Calculate the input gray image's integral image. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data.Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result.Can be U32C1 or U64C1, relied on the control parameter. +* IVE_INTEG_CTRL_S *pstIntegCtrl Integ Control +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* The pixel can be 32bit or 64 bit relied on the control parameter. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-03-18 +* Author : Tan Bing +* Modification : Modified function +* 3. Date : 2013-07-15 +* Author : Chen Quanfu +* Modification : Modified function +* Spec : Modify IVE_INTEG_OUT_FMT_E to IVE_INTEG_CTRL_S +* 4. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Integ(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_INTEG_CTRL_S *pstIntegCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Hist +* Description : Calculate the input gray image's histogram. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only the U8C1 input format is supported. +* IVE_DST_MEM_INFO_S *pstDst Output result. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Hist(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_MEM_INFO_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Thresh_S16 +* Description : S16 image's THRESH operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data.Only the S16 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result. +* IVE_THRESH_S16_CTRL_S *pstThrS16Ctrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data must be 2-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-05-16 +* Author : Tan bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Thresh_S16(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_THRESH_S16_CTRL_S *pstThrS16Ctrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Thresh_U16 +* Description : U16 image's THRESH operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only the U16 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_THRESH_U16_CTRL_S *pstThrU16Ctrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data must be 2-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-05-16 +* Author : Tan bing +* Modification : Created function +* 2. Date : 2013-08-07 +* Author : Chen Quanfu +* Modification : Implement function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Thresh_U16(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_THRESH_U16_CTRL_S *pstThrU16Ctrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_16BitTo8Bit +* Description : Scale the input 16bit data to the output 8bit data. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data.Only U16C1\S16C1 input is supported. +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_16BITTO8BIT_CTRL_S *pst16BitTo8BitCtrl control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data must be 2-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_16BitTo8Bit(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_16BIT_TO_8BIT_CTRL_S *pst16BitTo8BitCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_OrdStatFilter +* Description : Order Statistic Filter. It can be used as median\max\min value filter. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only U8C1 input is supported +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_ORD_STAT_FILTER_CTRL_S *pstOrdStatFltCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_OrdStatFilter(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_ORD_STAT_FILTER_CTRL_S *pstOrdStatFltCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Map +* Description : Map a image to another through a lookup table. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source. Only the U8C1 input format is supported. +* IVE_SRC_MEM_INFO_S *pstMap Input lookup table. Must be an U8 array of size 256. +* IVE_DST_IMAGE_S *pstDst Output result. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-17 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Map(IVE_HANDLE *pIveHandle,IVE_SRC_IMAGE_S *pstSrc, + IVE_SRC_MEM_INFO_S *pstMap, IVE_DST_IMAGE_S *pstDst,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_EqualizeHist +* Description : Enhance the input image's contrast through histogram equalization. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source.Only U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result. +* IVE_EQUALIZEHIST_CTRL_S *pstEqualizeHistCtrl EqualizeHist control parameter. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of map data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-07-17 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_EqualizeHist(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_EQUALIZE_HIST_CTRL_S *pstEqualizeHistCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Add +* Description : Two gray images' Add operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 Augend of the input source.Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 Addend of the input source.Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result of src1 plus src2 +* IVE_ADD_CTRL_S *pstAddCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2013-07-17 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Add(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, IVE_ADD_CTRL_S *pstAddCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Xor +* Description : Two binary images' Xor operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 The input source1.Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 The input source2. +* IVE_DST_IMAGE_S *pstDst Output result +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2013-07-17 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Xor(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_NCC +* Description : Calculate two gray images' NCC (Normalized Cross Correlation). +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 Input source1. Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 Input source2. Must be of the same typesize of source1. +* IVE_DST_MEM_INFO_S *pstDst Output result +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-16 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_NCC(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_MEM_INFO_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_CCL +* Description : Connected Component Labeling. Only 8-Connected method is supported. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_IMAGE_S *pstSrcDst Input source +* IVE_MEM_INFO_S *pstBlob Output result of detected region; +* IVE_CCL_CTRL_S *pstCclCtrl CCL control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x640 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-1 +* Author : Cheng Jianmin +* Modification : Created function +*****************************************************************************/ +HI_S32 HI_MPI_IVE_CCL(IVE_HANDLE *pIveHandle, IVE_IMAGE_S *pstSrcDst, + IVE_DST_MEM_INFO_S *pstBlob, IVE_CCL_CTRL_S *pstCclCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_GMM +* Description : Separate foreground and background using GMM(Gaussian Mixture Model) method; +* Gray or RGB GMM are supported. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source. Only support U8C1 or U8C3_PACKAGE input. +* IVE_DST_IMAGE_S *pstFg Output foreground (Binary) image. +* IVE_DST_IMAGE_S *pstBg Output background image. Of the sampe type of pstSrc. +* IVE_MEM_INFO_S *pstModel Model data. +* IVE_GMM_CTRL_S *pstGmmCtrl Control parameter. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x576 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-07 +* Author : Cheng Jianmin +* Modification : Created function +*****************************************************************************/ +HI_S32 HI_MPI_IVE_GMM(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstFg, + IVE_DST_IMAGE_S *pstBg, IVE_MEM_INFO_S *pstModel, IVE_GMM_CTRL_S *pstGmmCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_CannyHysEdge +* Description : The first part of canny Edge detection. Including step: gradient calculation, +* magnitude and angle calculation, hysteresis threshold, NMS(Non-Maximum Suppression) +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source. Only the U8C1 input format is supported +* IVE_DST_IMAGE_S *pstEdge Output result. +* IVE_DST_MEM_INFO_S *pstStack OutPut stack for CannyEdge +* IVE_CANNY_HYS_EDGE_CTRL_S *pstCannyHysEdgeCtrl Control parameter. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. . +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_CannyHysEdge(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstEdge, + IVE_DST_MEM_INFO_S *pstStack, IVE_CANNY_HYS_EDGE_CTRL_S *pstCannyHysEdgeCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_CannyEdge +* Description : The second part of canny Edge detection: trace strong edge by weak edge. +* Parameters : IVE_IMAGE_S *pstEdge Input and Output source. Only the U8C1 format is supported +* IVE_MEM_INFO_S *pstStack stack for CannyEdge +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_CannyEdge(IVE_IMAGE_S *pstEdge, IVE_MEM_INFO_S *pstStack); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_LBP +* Description : LBP calculation using the original method and a extensional method. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source.Only the U8C1 inpu format is supported. +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_LBP_CTRL_S *pstLbpCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-09-22 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_LBP(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_LBP_CTRL_S *pstLbpCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_NormGrad +* Description : Gradient calculation and the output is normalized to S8. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data +* IVE_DST_IMAGE_S *pstDstH The (horizontal) result of input image filtered by the input mask; +* IVE_DST_IMAGE_S *pstDstV The (vertical) result of input image filtered by the transposed mask; +* IVE_DST_IMAGE_S *pstDstHV Output the horizontal and vertical component in single image in package format. +* IVE_NORM_GRAD_CTRL_S *pstNormGradCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_NormGrad(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDstH, IVE_DST_IMAGE_S *pstDstV, IVE_DST_IMAGE_S *pstDstHV, + IVE_NORM_GRAD_CTRL_S *pstNormGradCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_LKOpticalFlow +* Description : Calculate LK-Optical Flow in single-layer of the pyramid. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrcPre Pre-frame input source.Must be U8C1 image +* IVE_SRC_IMAGE_S *pstSrcCur Cur-frame input source.Same sizetype with pstPreSrc. +* IVE_SRC_MEM_INFO_S *pstPoint Intresting points coordinates in the cur-layer +* for LKOpticalFlow tracking. +* IVE_MEM_INFO_S *pstMv Accumlative movements of the interesting points in pre-layers +* or init 0s for the first-layer as input. init 0s . +* Movements of the interesting points being tracked in cur-layer +* as output. +* IVE_LKOPTICALFLOW_CTRL_S *pstLkOptiFlowCtrl Control parameters. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x576 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-23 +* Author : Cheng Jianmin +* Modification : Created function +****************************************************************************/ +HI_S32 HI_MPI_IVE_LKOpticalFlow(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrcPre, IVE_SRC_IMAGE_S *pstSrcCur, + IVE_SRC_MEM_INFO_S *pstPoint, IVE_MEM_INFO_S *pstMv, IVE_LK_OPTICAL_FLOW_CTRL_S *pstLkOptiFlowCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_STCandiCorner +* Description : The first part of corners detection using Shi-Tomasi-like method: calculate candidate corners. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data +* IVE_DST_IMAGE_S *pstCandiCorner Output result of eig +* IVE_ST_CANDI_CORNER_CTRL_S *pstStCandiCornerCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x576 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-09-16 +* Author : Cheng Jianmin +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_STCandiCorner(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstCandiCorner, + IVE_ST_CANDI_CORNER_CTRL_S *pstStCandiCornerCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_STCorner +* Description : The second part of corners detection using Shi-Tomasi-like method: select corners by certain rules. +* IVE_SRC_IMAGE_S *pstCandiCorner Input source data +* IVE_DST_MEM_INFO_S *pstCorner Output result of Corner +* IVE_ST_CORNER_CTRL_S *pstStCornerCtrl Control parameter +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x576 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-09-16 +* Author : Cheng Jianmin +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_STCorner(IVE_SRC_IMAGE_S * pstCandiCorner, IVE_DST_MEM_INFO_S *pstCorner, + IVE_ST_CORNER_CTRL_S *pstStCornerCtrl); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_GradFg +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstBgDiffFg Background subtraction foreground image +* IVE_SRC_IMAGE_S *pstCurGrad Current gradient image, both horizontally and vertically +* graded in accordance with [xyxyxy ...] format +* IVE_SRC_IMAGE_S *pstBgGrad Background gradient image +* IVE_DST_IMAGE_S *pstGradFg Gradient foreground image +* IVE_GRAD_FG_CTRL_S *pstGradFgCtrl Gradient calculation parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-10-29 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_GradFg(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstBgDiffFg, IVE_SRC_IMAGE_S *pstCurGrad, + IVE_SRC_IMAGE_S *pstBgGrad, IVE_DST_IMAGE_S *pstGradFg, IVE_GRAD_FG_CTRL_S *pstGradFgCtrl, HI_BOOL bInstant); + + +/***************************************************************************** +* Prototype : HI_MPI_IVE_MatchBgModel +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstCurImg Current grayscale image +* IVE_DATA_S *pstBgModel Background model data +* IVE_IMAGE_S *pstFgFlag Foreground status image +* IVE_DST_IMAGE_S *pstBgDiffFg Foreground image obtained by background matching, +* the background pixel value is 0, the foreground pixel +* value is the gray difference value +* IVE_DST_IMAGE_S *pstFrmDiffFg Foreground image obtained by interframe difference, +* the background pixel value is 0, the foreground pixel +* value is the gray difference value +* IVE_DST_MEM_INFO_S *pstStatData result status data +* IVE_MATCH_BG_MODEL_CTRL_S *pstMatchBgModelCtrl Background matching parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. + +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-10-29 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_MatchBgModel(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstCurImg, IVE_DATA_S *pstBgModel, + IVE_IMAGE_S *pstFgFlag, IVE_DST_IMAGE_S *pstBgDiffFg, IVE_DST_IMAGE_S *pstFrmDiffFg, IVE_DST_MEM_INFO_S *pstStatData, + IVE_MATCH_BG_MODEL_CTRL_S *pstMatchBgModelCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_UpdateBgModel +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_DATA_S *pstBgModel Background model data +* IVE_IMAGE_S *pstFgFlag Foreground status image +* IVE_DST_IMAGE_S *pstBgImg Background grayscale image +* IVE_DST_IMAGE_S *pstChgStaImg Change state life image, for still detection +* IVE_DST_IMAGE_S *pstChgStaFg Change state grayscale image, for still detection +* IVE_DST_IMAGE_S *pstChgStaLife Change state foreground image, for still detection +* IVE_DST_MEM_INFO_S *pstStatData result status data +* IVE_UPDATE_BG_MODEL_CTRL_S *pstUpdateBgModelCtrl Background update parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-10-29 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_UpdateBgModel(IVE_HANDLE *pIveHandle, IVE_DATA_S *pstBgModel, IVE_IMAGE_S *pstFgFlag, + IVE_DST_IMAGE_S *pstBgImg, IVE_DST_IMAGE_S *pstChgStaImg, IVE_DST_IMAGE_S *pstChgStaFg, IVE_DST_IMAGE_S *pstChgStaLife, + IVE_DST_MEM_INFO_S *pstStatData, IVE_UPDATE_BG_MODEL_CTRL_S *pstUpdateBgModelCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_ANN_MLP_LoadModel +* Description : Load ANN_MLP model data from ".bin" file. +* Parameters : HI_CHAR *pchFileName ANN_MLP model file name, must be ".bin" file. +* IVE_ANN_MLP_MODEL_S *pstAnnMlpModel ANN_MLP model data. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014-05-13 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_ANN_MLP_LoadModel(const HI_CHAR *pchFileName, IVE_ANN_MLP_MODEL_S *pstAnnMlpModel); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_ANN_MLP_UnloadModel +* Description : Unload ANN_MLP model data. +* Parameters : IVE_ANN_MLP_MODEL_S *pstAnnMlpModel ANN_MLP model data. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014-05-13 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_VOID HI_MPI_IVE_ANN_MLP_UnloadModel(IVE_ANN_MLP_MODEL_S *pstAnnMlpModel); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_ANN_MLP_Predict +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_MEM_INFO_S *pstSrc Input sample +* IVE_SRC_MEM_INFO_S *pstActivFuncTable Look-up talbe for active function +* IVE_ANN_MLP_MODEL_S *pstAnnMlpModel ANN_MLP model +* IVE_DST_MEM_INFO_S *pstDst Output layer +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-11-28 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_ANN_MLP_Predict(IVE_HANDLE *pIveHandle, IVE_SRC_MEM_INFO_S *pstSrc, + IVE_LOOK_UP_TABLE_S *pstActivFuncTab, IVE_ANN_MLP_MODEL_S *pstAnnMlpModel, + IVE_DST_MEM_INFO_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_SVM_LoadModel +* Description : Load SVM model data from ".bin" file. +* Parameters : HI_CHAR *pchFileName SVM model file name, must be ".bin" file. +* IVE_SVM_MODEL_S *pstSvmModel SVM model data. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014-05-13 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_SVM_LoadModel(const HI_CHAR *pchFileName, IVE_SVM_MODEL_S *pstSvmModel); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_SVM_UnloadModel +* Description : Unload SVM model data. +* Parameters : IVE_SVM_MODEL_S *pstSvmModel SVM model data. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014-05-13 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_VOID HI_MPI_IVE_SVM_UnloadModel(IVE_SVM_MODEL_S *pstSvmModel); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_SVM_Predict +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_MEM_INFO_S *pstSrc Input sample +* IVE_SRC_MEM_INFO_S *pstKernelTable Look-up talbe for active function +* IVE_SVM_MODEL_S *pstSvmModel SVM model +* IVE_DST_MEM_INFO_S *pstDstVote Output Votes' array of each class +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-11-28 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_SVM_Predict(IVE_HANDLE *pIveHandle, IVE_SRC_MEM_INFO_S *pstSrc, + IVE_LOOK_UP_TABLE_S *pstKernelTab, IVE_SVM_MODEL_S *pstSvmModel, + IVE_DST_MEM_INFO_S *pstDstVote, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_SAD +* Description : Sum of absolute differences. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 The input source1.Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 The input source2.Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstSad Output result of sad value.Only the U8C1/U16C1 format is supported. +* IVE_DST_IMAGE_S *pstThr Output result of thresh.Only the U8C1 format is supported. +* IVE_SAD_CTRL_S *pstSadCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* Not support in hi3516a +* History: +* +* 1. Date : 2014-08-28 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_SAD(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstSad,IVE_DST_IMAGE_S *pstThr, + IVE_SAD_CTRL_S *pstSadCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Query +* Description : This API is used to query the status of a called function by using the returned IveHandle of the function. + In block mode, the system waits until the function that is being queried is called. + In non-block mode, the current status is queried and no action is taken. +* Parameters : IVE_HANDLE IveHandle IveHandle of a called function. It is entered by users. +* HI_BOOL *pbFinish Returned status +* HI_BOOL bBlock Flag indicating the block mode or non-block mode +* HI_BOOL *pbFinish +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Query(IVE_HANDLE IveHandle, HI_BOOL *pbFinish, HI_BOOL bBlock); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif +#endif/*__MPI_IVE_H__*/ diff --git a/device/mpp/include/mpi_pciv.h b/device/mpp/include/mpi_pciv.h new file mode 100644 index 0000000..24ddf1a --- /dev/null +++ b/device/mpp/include/mpi_pciv.h @@ -0,0 +1,250 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_pciv.h + Version : Initial Draft + Author : Hisilicon Hi3511 MPP Team + Created : 2009/06/23 + Last Modified : + Description : mpi functions declaration + Function List : + History : + 1.Date : 2009/06/23 + Author : z44949 + Modification: Create +******************************************************************************/ +#ifndef __MPI_PCIV_H__ +#define __MPI_PCIV_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_pciv.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/***************************************************************************** + Description : Create and initialize the pciv channel. + Input : pcivChn ** The pciv channel id between [0, PCIV_MAX_CHN_NUM) + pPcivAttr ** The attribute of pciv channel + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Destroy +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Create(PCIV_CHN pcivChn, PCIV_ATTR_S *pPcivAttr); + +/***************************************************************************** + Description : Destroy the pciv channel + Input : pcivChn ** The pciv channel id + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Create +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Destroy(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Set the attribute of pciv channel + Input : pcivChn ** The pciv channel id + pPcivAttr ** The attribute of pciv channel + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_GetAttr +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_SetAttr(PCIV_CHN pcivChn, PCIV_ATTR_S *pPcivAttr); + +/***************************************************************************** + Description : Get the attribute of pciv channel + Input : pcivChn ** The pciv channel id + Output : pPcivAttr ** The attribute of pciv channel + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_SetAttr +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_GetAttr(PCIV_CHN pcivChn, PCIV_ATTR_S *pPcivAttr); + + +/***************************************************************************** + Description : Start to send or receive video frame + Input : pcivChn ** The pciv channel id + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Stop +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Start(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Stop send or receive video frame + Input : pcivChn ** The pciv channel id + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Start +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Stop(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Create a series of dma task + Input : pTask ** The task list to create + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : None +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_DmaTask(PCIV_DMA_TASK_S *pTask); + +/***************************************************************************** + Description : Alloc 'u32BlkSize' bytes memory and give the physical address + The memory used by PCI must be located within the PCI window, + So you should call this function to alloc it. + Input : u32BlkSize ** The size of each memory block + u32BlkCnt ** The count of memory block + Output : u32PhyAddr ** The physical address of the memory + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Free +*****************************************************************************/ +HI_U32 HI_MPI_PCIV_Malloc(HI_U32 u32BlkSize, HI_U32 u32BlkCnt, HI_U32 u32PhyAddr[]); +HI_S32 HI_MPI_PCIV_Free(HI_U32 u32BlkCnt, HI_U32 u32PhyAddr[]); + +HI_U32 HI_MPI_PCIV_MallocChnBuffer(PCIV_CHN pcivChn, HI_U32 u32BlkSize, HI_U32 u32BlkCnt, HI_U32 u32PhyAddr[]); +HI_S32 HI_MPI_PCIV_FreeChnBuffer(PCIV_CHN pcivChn, HI_U32 u32BlkCnt); + + +/***************************************************************************** + Description : Get the board ID of this board + Input : None + Output : None + Return Value : The board ID if success + HI_FAILURE or HI_ERR_PCIV_SYS_NOTREADY if failure + + See Also : HI_MPI_PCIV_GetBaseWindow +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_GetLocalId(HI_VOID); + +/***************************************************************************** + Description : Enum all the connected chip.Call this function as follow. + { + HI_S32 s32ChipID[PCIV_MAX_CHIPNUM], i, s32Ret; + + s32Ret = HI_MPI_PCIV_EnumChip(s32ChipID); + HI_ASSERT(HI_SUCCESS == s32Ret); + + for(i=0; iu32NpWinBase, + pBase->u32PfWinBase, + pBase->u32CfgWinBase + On Slave pBase->u32PfAHBAddr + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_GetLocalId +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_GetBaseWindow(HI_S32 s32ChipId, PCIV_BASEWINDOW_S *pBase); + +/***************************************************************************** + Description : Only on the slave chip, you need to create some VB Pool. + Those pool will bee created on the PCI Window Zone. + Input : pCfg.u32PoolCount ** The total number of pool want to create + pCfg.u32BlkSize[] ** The size of each VB block + pCfg.u32BlkCount[]** The number of each VB block + + Output : None + Return Value : HI_SUCCESS if success. + HI_ERR_PCIV_SYS_NOTREADY + HI_ERR_PCIV_NULL_PTR + HI_ERR_PCIV_NOMEM + HI_ERR_PCIV_BUSY + HI_ERR_PCIV_NOT_SUPPORT + HI_FAILURE + + See Also : HI_MPI_PCIV_GetLocalId +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_WinVbCreate(PCIV_WINVBCFG_S *pCfg); + +/***************************************************************************** + Description : Destroy the pools which's size is equal to the pCfg.u32BlkSize[] + Input : pCfg.u32PoolCount ** The total number of pool want to destroy + pCfg.u32BlkSize[] ** The size of each VB block + pCfg.u32BlkCount[]** Don't care this parament + + Output : None + Return Value : HI_SUCCESS if success. + HI_ERR_PCIV_SYS_NOTREADY + HI_ERR_PCIV_NOT_SUPPORT + HI_FAILURE + + See Also : HI_MPI_PCIV_GetLocalId +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_WinVbDestroy(HI_VOID); + +/***************************************************************************** + Description : Show the image in VO device from PCI + Input : pcivChn ** The pciv channel id + Output : None + Return Value : +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Show(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Hide the image in VO device from PCI + Input : pcivChn ** The pciv channel id + Output : None + Return Value : +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Hide(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Get and Set pre-processing parameter, e.g. filter coef. + Input : pcivChn ** The pciv channel id + Output : None + Return Value : +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_GetPreProcCfg(PCIV_CHN pcivChn, PCIV_PREPROC_CFG_S *pstCfg); +HI_S32 HI_MPI_PCIV_SetPreProcCfg(PCIV_CHN pcivChn, PCIV_PREPROC_CFG_S *pstCfg); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_VENC_H__ */ + diff --git a/device/mpp/include/mpi_region.h b/device/mpp/include/mpi_region.h new file mode 100644 index 0000000..d4eb934 --- /dev/null +++ b/device/mpp/include/mpi_region.h @@ -0,0 +1,56 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_region.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/07 + Description : + History : + 1.Date : 2013/05/07 + Author : c00191088 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_REGION_H__ +#define __MPI_REGION_H__ + +#include "hi_comm_region.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +HI_S32 HI_MPI_RGN_Create(RGN_HANDLE Handle, const RGN_ATTR_S *pstRegion); +HI_S32 HI_MPI_RGN_Destroy(RGN_HANDLE Handle); + +HI_S32 HI_MPI_RGN_GetAttr(RGN_HANDLE Handle, RGN_ATTR_S *pstRegion); +HI_S32 HI_MPI_RGN_SetAttr(RGN_HANDLE Handle, const RGN_ATTR_S *pstRegion); + +HI_S32 HI_MPI_RGN_SetBitMap(RGN_HANDLE Handle, const BITMAP_S *pstBitmap); + +HI_S32 HI_MPI_RGN_AttachToChn(RGN_HANDLE Handle, const MPP_CHN_S *pstChn, const RGN_CHN_ATTR_S *pstChnAttr); +HI_S32 HI_MPI_RGN_DetachFromChn(RGN_HANDLE Handle, const MPP_CHN_S *pstChn); + +HI_S32 HI_MPI_RGN_SetDisplayAttr(RGN_HANDLE Handle, const MPP_CHN_S *pstChn, const RGN_CHN_ATTR_S *pstChnAttr); +HI_S32 HI_MPI_RGN_GetDisplayAttr(RGN_HANDLE Handle, const MPP_CHN_S *pstChn, RGN_CHN_ATTR_S *pstChnAttr); + +HI_S32 HI_MPI_RGN_SetAttachField(RGN_HANDLE Handle, VIDEO_FIELD_E enAttachField); +HI_S32 HI_MPI_RGN_GetAttachField(RGN_HANDLE Handle, VIDEO_FIELD_E *penAttachField); + +HI_S32 HI_MPI_RGN_GetCanvasInfo(RGN_HANDLE Handle, RGN_CANVAS_INFO_S *pstCanvasInfo); +HI_S32 HI_MPI_RGN_UpdateCanvas(RGN_HANDLE Handle); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __MPI_REGION_H__ */ + diff --git a/device/mpp/include/mpi_sys.h b/device/mpp/include/mpi_sys.h new file mode 100644 index 0000000..5fc4715 --- /dev/null +++ b/device/mpp/include/mpi_sys.h @@ -0,0 +1,108 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_sys.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2007/1/31 + Description : + History : + 1.Date : 2006/1/31 + Author : c42025 + Modification: Created file + + 2.Date : 2008/03/03 + Author : c42025 + Modification: add a new funtion "HI_MPI_SYS_GetVersion" + +******************************************************************************/ +#ifndef __MPI_SYS_H__ +#define __MPI_SYS_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_sys.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +HI_S32 HI_MPI_SYS_Init(); +HI_S32 HI_MPI_SYS_Exit(); + +HI_S32 HI_MPI_SYS_SetConf(const MPP_SYS_CONF_S* pstSysConf); +HI_S32 HI_MPI_SYS_GetConf(MPP_SYS_CONF_S* pstSysConf); + +HI_S32 HI_MPI_SYS_Bind(MPP_CHN_S* pstSrcChn, MPP_CHN_S* pstDestChn); +HI_S32 HI_MPI_SYS_UnBind(MPP_CHN_S* pstSrcChn, MPP_CHN_S* pstDestChn); +HI_S32 HI_MPI_SYS_GetBindbyDest(MPP_CHN_S* pstDestChn, MPP_CHN_S* pstSrcChn); + +HI_S32 HI_MPI_SYS_GetVersion(MPP_VERSION_S* pstVersion); + +/* +** u64Base is the global PTS of the system. +** ADVICE: +** 1. Better to call HI_MPI_SYS_GetCurPts on the host board to get u64Base. +** 2. When os start up, call HI_MPI_SYS_InitPtsBase to set the init PTS. +** 3. When media bussines is running, synchronize the PTS one time per minute +** by calling HI_MPI_SYS_SyncPts. +*/ +HI_S32 HI_MPI_SYS_GetCurPts(HI_U64* pu64CurPts); +HI_S32 HI_MPI_SYS_InitPtsBase(HI_U64 u64PtsBase); +HI_S32 HI_MPI_SYS_SyncPts(HI_U64 u64PtsBase); + +/* alloc mmz memory in user context */ +HI_S32 HI_MPI_SYS_MmzAlloc(HI_U32* pu32PhyAddr, HI_VOID** ppVirtAddr, + const HI_CHAR* strMmb, const HI_CHAR* strZone, HI_U32 u32Len); + +/* alloc mmz memory with cache */ +HI_S32 HI_MPI_SYS_MmzAlloc_Cached(HI_U32* pu32PhyAddr, HI_VOID** ppVitAddr, + const HI_CHAR* pstrMmb, const HI_CHAR* pstrZone, HI_U32 u32Len); + +/* free mmz memory in user context */ +HI_S32 HI_MPI_SYS_MmzFree(HI_U32 u32PhyAddr, HI_VOID* pVirtAddr); + +/* fulsh cache */ +HI_S32 HI_MPI_SYS_MmzFlushCache(HI_U32 u32PhyAddr, HI_VOID* pVitAddr, HI_U32 u32Size); + +/* +** Call the mmap function to map physical address to virtual address +** The system function mmap is too complicated, so we packge it. +*/ +HI_VOID* HI_MPI_SYS_Mmap(HI_U32 u32PhyAddr, HI_U32 u32Size); +HI_S32 HI_MPI_SYS_Munmap(HI_VOID* pVirAddr, HI_U32 u32Size); + +/* +** Access the physical address. +** You can use this function to access memory address or register address. +*/ +HI_S32 HI_MPI_SYS_SetReg(HI_U32 u32Addr, HI_U32 u32Value); +HI_S32 HI_MPI_SYS_GetReg(HI_U32 u32Addr, HI_U32* pu32Value); + +HI_S32 HI_MPI_SYS_SetMemConf(MPP_CHN_S* pstMppChn, const HI_CHAR* pcMmzName); +HI_S32 HI_MPI_SYS_GetMemConf(MPP_CHN_S* pstMppChn, HI_CHAR* pcMmzName); + +/* Close all the FD which is used by sys module */ +HI_S32 HI_MPI_SYS_CloseFd(HI_VOID); + +/* Get VI VPSS work mode, 0: offline, >0: online */ +HI_S32 HI_MPI_SYS_GetViVpssMode(HI_U32* pu32Mode); + +/* media profile setting, for low power */ +HI_S32 HI_MPI_SYS_SetProfile(PROFILE_TYPE_E enProfile); + +/* Get virtual meminfo according to virtual addr, should be in one process */ +HI_S32 HI_MPI_SYS_GetVirMemInfo(const void* pVitAddr, SYS_VIRMEM_INFO_S* pstMemInfo); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__MPI_SYS_H__ */ + diff --git a/device/mpp/include/mpi_vb.h b/device/mpp/include/mpi_vb.h new file mode 100644 index 0000000..a6c4277 --- /dev/null +++ b/device/mpp/include/mpi_vb.h @@ -0,0 +1,63 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vb.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2007/10/15 + Description : + History : + 1.Date : 2007/10/15 + Author : c42025 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_VB_H__ +#define __MPI_VB_H__ + +#include "hi_comm_vb.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +VB_POOL HI_MPI_VB_CreatePool(HI_U32 u32BlkSize,HI_U32 u32BlkCnt,const HI_CHAR *pcMmzName); +HI_S32 HI_MPI_VB_DestroyPool(VB_POOL Pool); + +VB_BLK HI_MPI_VB_GetBlock(VB_POOL Pool, HI_U32 u32BlkSize,const HI_CHAR *pcMmzName); +HI_S32 HI_MPI_VB_ReleaseBlock(VB_BLK Block); + +HI_U32 HI_MPI_VB_Handle2PhysAddr(VB_BLK Block); +VB_POOL HI_MPI_VB_Handle2PoolId(VB_BLK Block); + +HI_S32 HI_MPI_VB_GetSupplementAddr(VB_BLK Block, VIDEO_SUPPLEMENT_S *pstSupplement); + + +HI_S32 HI_MPI_VB_Init(HI_VOID); +HI_S32 HI_MPI_VB_Exit(HI_VOID); +HI_S32 HI_MPI_VB_SetConf(const VB_CONF_S *pstVbConf); +HI_S32 HI_MPI_VB_GetConf(VB_CONF_S *pstVbConf); + +HI_S32 HI_MPI_VB_MmapPool(VB_POOL Pool); +HI_S32 HI_MPI_VB_MunmapPool(VB_POOL Pool); + +HI_S32 HI_MPI_VB_GetBlkVirAddr(VB_POOL Pool, HI_U32 u32PhyAddr, HI_VOID **ppVirAddr); + +HI_S32 HI_MPI_VB_InitModCommPool(VB_UID_E enVbUid); +HI_S32 HI_MPI_VB_ExitModCommPool(VB_UID_E enVbUid); + +HI_S32 HI_MPI_VB_SetModPoolConf(VB_UID_E enVbUid, const VB_CONF_S *pstVbConf); +HI_S32 HI_MPI_VB_GetModPoolConf(VB_UID_E enVbUid, VB_CONF_S *pstVbConf); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__MPI_VI_H__ */ + diff --git a/device/mpp/include/mpi_vda.h b/device/mpp/include/mpi_vda.h new file mode 100644 index 0000000..9f7255c --- /dev/null +++ b/device/mpp/include/mpi_vda.h @@ -0,0 +1,58 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vda.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/09 + Description : + History : + 1.Date : 2013/05/09 + Author : x00100808 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_VDA_H__ +#define __MPI_VDA_H__ + +#include "hi_comm_vda.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +HI_S32 HI_MPI_VDA_CreateChn(VDA_CHN VdaChn, const VDA_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VDA_DestroyChn(VDA_CHN VdaChn); + +HI_S32 HI_MPI_VDA_GetChnAttr(VDA_CHN VdaChn, VDA_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VDA_SetChnAttr(VDA_CHN VdaChn, const VDA_CHN_ATTR_S *pstAttr); + +HI_S32 HI_MPI_VDA_StartRecvPic(VDA_CHN VdaChn); +HI_S32 HI_MPI_VDA_StopRecvPic(VDA_CHN VdaChn); + +HI_S32 HI_MPI_VDA_GetData(VDA_CHN VdaChn, VDA_DATA_S *pstVdaData, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VDA_ReleaseData(VDA_CHN VdaChn, const VDA_DATA_S* pstVdaData); + +HI_S32 HI_MPI_VDA_ResetOdRegion(VDA_CHN VdaChn, HI_S32 s32RgnIndex); + +HI_S32 HI_MPI_VDA_Query(VDA_CHN VdaChn, VDA_CHN_STAT_S *pstChnStat); + +HI_S32 HI_MPI_VDA_GetFd(VDA_CHN VdaChn); + +HI_S32 HI_MPI_VDA_UpdateRef(VDA_CHN VdaChn, const VIDEO_FRAME_INFO_S *pstRefFrame); + +HI_S32 HI_MPI_VDA_SendPic(VDA_CHN VdaChn, const VIDEO_FRAME_INFO_S *pstUserFrame, HI_S32 s32MilliSec); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __MPI_VDA_H__ */ + diff --git a/device/mpp/include/mpi_vdec.h b/device/mpp/include/mpi_vdec.h new file mode 100644 index 0000000..1010918 --- /dev/null +++ b/device/mpp/include/mpi_vdec.h @@ -0,0 +1,84 @@ +/****************************************************************************** + + Copyright (C), 2013, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vdec.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/08 + Description : MPP Programe Interface for video decode + History : + 1.Date : 2013/05/08 + Author : l00226816 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_VDEC_H__ +#define __MPI_VDEC_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_vdec.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +HI_S32 HI_MPI_VDEC_CreateChn(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VDEC_DestroyChn(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_GetChnAttr(VDEC_CHN VdChn, VDEC_CHN_ATTR_S *pstAttr); + +HI_S32 HI_MPI_VDEC_StartRecvStream(VDEC_CHN VdChn); +HI_S32 HI_MPI_VDEC_StopRecvStream(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_Query(VDEC_CHN VdChn,VDEC_CHN_STAT_S *pstStat); + +HI_S32 HI_MPI_VDEC_GetFd(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_ResetChn(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_SetChnParam(VDEC_CHN VdChn, VDEC_CHN_PARAM_S* pstParam); +HI_S32 HI_MPI_VDEC_GetChnParam(VDEC_CHN VdChn, VDEC_CHN_PARAM_S* pstParam); + +HI_S32 HI_MPI_VDEC_SetProtocolParam(VDEC_CHN VdChn,VDEC_PRTCL_PARAM_S *pstParam); +HI_S32 HI_MPI_VDEC_GetProtocolParam(VDEC_CHN VdChn,VDEC_PRTCL_PARAM_S *pstParam); + +/* s32MilliSec: -1 is block 0 is no blockother positive number is timeout */ +HI_S32 HI_MPI_VDEC_SendStream(VDEC_CHN VdChn, const VDEC_STREAM_S *pstStream, HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VDEC_GetImage(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstFrameInfo,HI_S32 s32MilliSec); +HI_S32 HI_MPI_VDEC_ReleaseImage(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstFrameInfo); + +HI_S32 HI_MPI_VDEC_GetUserData(VDEC_CHN VdChn, VDEC_USERDATA_S *pstUserData, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VDEC_ReleaseUserData(VDEC_CHN VdChn, VDEC_USERDATA_S *pstUserData); + +HI_S32 HI_MPI_VDEC_SetRotate(VDEC_CHN VdChn, ROTATE_E enRotate); +HI_S32 HI_MPI_VDEC_GetRotate(VDEC_CHN VdChn, ROTATE_E *penRotate); + +HI_S32 HI_MPI_VDEC_GetChnLuma(VDEC_CHN VdChn, VDEC_CHN_LUM_S *pstLuma); + +HI_S32 HI_MPI_VDEC_SetUserPic(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstUsrPic); +HI_S32 HI_MPI_VDEC_EnableUserPic(VDEC_CHN VdChn, HI_BOOL bInstant); +HI_S32 HI_MPI_VDEC_DisableUserPic(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_SetDisplayMode(VDEC_CHN VdChn, VIDEO_DISPLAY_MODE_E enDisplayMode); +HI_S32 HI_MPI_VDEC_GetDisplayMode(VDEC_CHN VdChn, VIDEO_DISPLAY_MODE_E *penDisplayMode); + +HI_S32 HI_MPI_VDEC_SetChnVBCnt(VDEC_CHN VdChn, HI_U32 u32BlkCnt); +HI_S32 HI_MPI_VDEC_GetChnVBCnt(VDEC_CHN VdChn, HI_U32 *pu32BlkCnt); + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __MPI_VDEC_H__ */ + diff --git a/device/mpp/include/mpi_venc.h b/device/mpp/include/mpi_venc.h new file mode 100644 index 0000000..69fd6ca --- /dev/null +++ b/device/mpp/include/mpi_venc.h @@ -0,0 +1,170 @@ +/****************************************************************************** + + Copyright (C), 2001-2012, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_venc.h + Version : Initial Draft + Author : Hisilicon Hi35xx MPP Team + Created : 2006/11/22 + Last Modified : + Description : mpi functions declaration + Function List : + History : +******************************************************************************/ +#ifndef __MPI_VENC_H__ +#define __MPI_VENC_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_venc.h" +#include "hi_comm_vb.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_VENC_CreateChn(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VENC_DestroyChn(VENC_CHN VeChn); +HI_S32 HI_MPI_VENC_SetChnlPriority(VENC_CHN VeChn, HI_U32 u32Priority); +HI_S32 HI_MPI_VENC_GetChnlPriority(VENC_CHN VeChn, HI_U32 *pu32Priority); +HI_S32 HI_MPI_VENC_ResetChn(VENC_CHN VeChn); + +HI_S32 HI_MPI_VENC_StartRecvPic(VENC_CHN VeChn); +HI_S32 HI_MPI_VENC_StartRecvPicEx(VENC_CHN VeChn, VENC_RECV_PIC_PARAM_S *pstRecvParam); +HI_S32 HI_MPI_VENC_StopRecvPic(VENC_CHN VeChn); + +HI_S32 HI_MPI_VENC_Query(VENC_CHN VeChn, VENC_CHN_STAT_S *pstStat); + +HI_S32 HI_MPI_VENC_SetChnAttr(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VENC_GetChnAttr(VENC_CHN VeChn, VENC_CHN_ATTR_S *pstAttr); +/*-1:bolck 0:nonblock >0 : overtime */ +HI_S32 HI_MPI_VENC_GetStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VENC_ReleaseStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream); + +HI_S32 HI_MPI_VENC_InsertUserData(VENC_CHN VeChn, HI_U8 *pu8Data, HI_U32 u32Len); +/*-1:bolck 0:nonblock >0 : overtime */ +HI_S32 HI_MPI_VENC_SendFrame(VENC_CHN VeChn, VIDEO_FRAME_INFO_S *pstFrame ,HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VENC_SetMaxStreamCnt(VENC_CHN VeChn, HI_U32 u32MaxStrmCnt); +HI_S32 HI_MPI_VENC_GetMaxStreamCnt(VENC_CHN VeChn, HI_U32 *pu32MaxStrmCnt); + +HI_S32 HI_MPI_VENC_RequestIDR(VENC_CHN VeChn,HI_BOOL bInstant); + +HI_S32 HI_MPI_VENC_GetFd(VENC_CHN VeChn); +HI_S32 HI_MPI_VENC_CloseFd(VENC_CHN VeChn); + + +HI_S32 HI_MPI_VENC_SetRoiCfg(VENC_CHN VeChn, VENC_ROI_CFG_S *pstVencRoiCfg); +HI_S32 HI_MPI_VENC_GetRoiCfg(VENC_CHN VeChn, HI_U32 u32Index, VENC_ROI_CFG_S *pstVencRoiCfg); + +HI_S32 HI_MPI_VENC_SetRoiBgFrameRate(VENC_CHN VeChn, const VENC_ROIBG_FRAME_RATE_S *pstRoiBgFrmRate); +HI_S32 HI_MPI_VENC_GetRoiBgFrameRate(VENC_CHN VeChn, VENC_ROIBG_FRAME_RATE_S *pstRoiBgFrmRate); + +HI_S32 HI_MPI_VENC_SetH264SliceSplit(VENC_CHN VeChn, const VENC_PARAM_H264_SLICE_SPLIT_S *pstSliceSplit); +HI_S32 HI_MPI_VENC_GetH264SliceSplit(VENC_CHN VeChn, VENC_PARAM_H264_SLICE_SPLIT_S *pstSliceSplit); + +HI_S32 HI_MPI_VENC_SetH264InterPred(VENC_CHN VeChn, const VENC_PARAM_H264_INTER_PRED_S *pstH264InterPred); +HI_S32 HI_MPI_VENC_GetH264InterPred(VENC_CHN VeChn, VENC_PARAM_H264_INTER_PRED_S *pstH264InterPred); + +HI_S32 HI_MPI_VENC_SetH264IntraPred(VENC_CHN VeChn, const VENC_PARAM_H264_INTRA_PRED_S *pstH264InterPred); +HI_S32 HI_MPI_VENC_GetH264IntraPred(VENC_CHN VeChn, VENC_PARAM_H264_INTRA_PRED_S *pstH264InterPred); + +HI_S32 HI_MPI_VENC_SetH264Trans(VENC_CHN VeChn, const VENC_PARAM_H264_TRANS_S *pstH264Trans); +HI_S32 HI_MPI_VENC_GetH264Trans(VENC_CHN VeChn, VENC_PARAM_H264_TRANS_S *pstH264Trans); + +HI_S32 HI_MPI_VENC_SetH264Entropy(VENC_CHN VeChn, const VENC_PARAM_H264_ENTROPY_S *pstH264EntropyEnc); +HI_S32 HI_MPI_VENC_GetH264Entropy(VENC_CHN VeChn, VENC_PARAM_H264_ENTROPY_S *pstH264EntropyEnc); + +HI_S32 HI_MPI_VENC_SetH264Poc(VENC_CHN VeChn, const VENC_PARAM_H264_POC_S *pstH264Poc); +HI_S32 HI_MPI_VENC_GetH264Poc(VENC_CHN VeChn, VENC_PARAM_H264_POC_S *pstH264Poc); + +HI_S32 HI_MPI_VENC_SetH264Dblk(VENC_CHN VeChn, const VENC_PARAM_H264_DBLK_S *pstH264Dblk); +HI_S32 HI_MPI_VENC_GetH264Dblk(VENC_CHN VeChn, VENC_PARAM_H264_DBLK_S *pstH264Dblk); + +HI_S32 HI_MPI_VENC_SetH264Vui(VENC_CHN VeChn, const VENC_PARAM_H264_VUI_S *pstH264Vui); +HI_S32 HI_MPI_VENC_GetH264Vui(VENC_CHN VeChn, VENC_PARAM_H264_VUI_S *pstH264Vui); + +HI_S32 HI_MPI_VENC_SetJpegParam(VENC_CHN VeChn, const VENC_PARAM_JPEG_S *pstJpegParam); +HI_S32 HI_MPI_VENC_GetJpegParam(VENC_CHN VeChn, VENC_PARAM_JPEG_S *pstJpegParam); + + +HI_S32 HI_MPI_VENC_SetMjpegParam(VENC_CHN VeChn, const VENC_PARAM_MJPEG_S *pstMjpegParam); +HI_S32 HI_MPI_VENC_GetMjpegParam(VENC_CHN VeChn, VENC_PARAM_MJPEG_S *pstMjpegParam); + +HI_S32 HI_MPI_VENC_SetFrameRate(VENC_CHN VeChn, const VENC_FRAME_RATE_S *pstFrameRate); +HI_S32 HI_MPI_VENC_GetFrameRate(VENC_CHN VeChn, VENC_FRAME_RATE_S *pstFrameRate); + +HI_S32 HI_MPI_VENC_GetRcParam(VENC_CHN VeChn, VENC_RC_PARAM_S *pstRcParam); +HI_S32 HI_MPI_VENC_SetRcParam(VENC_CHN VeChn, const VENC_RC_PARAM_S *pstRcParam); + + +HI_S32 HI_MPI_VENC_SetRefParam(VENC_CHN VeChn, const VENC_PARAM_REF_S *pstRefParam); +HI_S32 HI_MPI_VENC_GetRefParam(VENC_CHN VeChn, VENC_PARAM_REF_S *pstRefParam); + +HI_S32 HI_MPI_VENC_SetColor2Grey(VENC_CHN VeChn, const VENC_COLOR2GREY_S *pstChnColor2Grey); +HI_S32 HI_MPI_VENC_GetColor2Grey(VENC_CHN VeChn, VENC_COLOR2GREY_S *pstChnColor2Grey); + +HI_S32 HI_MPI_VENC_SetCrop(VENC_CHN VeChn, const VENC_CROP_CFG_S *pstCropCfg); +HI_S32 HI_MPI_VENC_GetCrop(VENC_CHN VeChn, VENC_CROP_CFG_S *pstCropCfg); + +HI_S32 HI_MPI_VENC_SetJpegSnapMode(VENC_CHN VeChn, VENC_JPEG_SNAP_MODE_E enJpegSnapMode); +HI_S32 HI_MPI_VENC_GetJpegSnapMode(VENC_CHN VeChn, VENC_JPEG_SNAP_MODE_E *penJpegSnapMode); + +HI_S32 HI_MPI_VENC_EnableIDR(VENC_CHN VeChn, HI_BOOL bEnableIDR); + +HI_S32 HI_MPI_VENC_SetH264IdrPicId( VENC_CHN VeChn, VENC_H264_IDRPICID_CFG_S* pstH264eIdrPicIdCfg ); +HI_S32 HI_MPI_VENC_GetH264IdrPicId( VENC_CHN VeChn, VENC_H264_IDRPICID_CFG_S* pstH264eIdrPicIdCfg ); + +HI_S32 HI_MPI_VENC_GetStreamBufInfo(VENC_CHN VeChn, VENC_STREAM_BUF_INFO_S *pstStreamBufInfo); + + +HI_S32 HI_MPI_VENC_SetRcPriority(VENC_CHN VeChn, VENC_RC_PRIORITY_E enRcPriority); +HI_S32 HI_MPI_VENC_GetRcPriority(VENC_CHN VeChn, VENC_RC_PRIORITY_E *penRcPriority); + + +HI_S32 HI_MPI_VENC_SetH265SliceSplit(VENC_CHN VeChn, const VENC_PARAM_H265_SLICE_SPLIT_S *pstSliceSplit); +HI_S32 HI_MPI_VENC_GetH265SliceSplit(VENC_CHN VeChn, VENC_PARAM_H265_SLICE_SPLIT_S *pstSliceSplit); + + +HI_S32 HI_MPI_VENC_SetH265PredUnit(VENC_CHN VeChn, const VENC_PARAM_H265_PU_S *pstPredUnit); +HI_S32 HI_MPI_VENC_GetH265PredUnit(VENC_CHN VeChn, VENC_PARAM_H265_PU_S *pstPredUnit); + + +HI_S32 HI_MPI_VENC_SetH265Trans(VENC_CHN VeChn, const VENC_PARAM_H265_TRANS_S *pstH265Trans); +HI_S32 HI_MPI_VENC_GetH265Trans(VENC_CHN VeChn, VENC_PARAM_H265_TRANS_S *pstH265Trans); + +HI_S32 HI_MPI_VENC_SetH265Entropy(VENC_CHN VeChn, const VENC_PARAM_H265_ENTROPY_S *pstH265Entropy); +HI_S32 HI_MPI_VENC_GetH265Entropy(VENC_CHN VeChn, VENC_PARAM_H265_ENTROPY_S *pstH265Entropy); + +HI_S32 HI_MPI_VENC_SetH265Dblk(VENC_CHN VeChn, const VENC_PARAM_H265_DBLK_S *pstH265Dblk); +HI_S32 HI_MPI_VENC_GetH265Dblk(VENC_CHN VeChn, VENC_PARAM_H265_DBLK_S *pstH265Dblk); +HI_S32 HI_MPI_VENC_SetH265Sao(VENC_CHN VeChn, const VENC_PARAM_H265_SAO_S *pstH265Sao); +HI_S32 HI_MPI_VENC_GetH265Sao(VENC_CHN VeChn, VENC_PARAM_H265_SAO_S *pstH265Sao); + + +HI_S32 HI_MPI_VENC_SetH265Timing(VENC_CHN VeChn, const VENC_PARAM_H265_TIMING_S *pstH265Timing); +HI_S32 HI_MPI_VENC_GetH265Timing(VENC_CHN VeChn, VENC_PARAM_H265_TIMING_S *pstH265Timing); + +HI_S32 HI_MPI_VENC_SetFrameLostStrategy(VENC_CHN VeChn, const VENC_PARAM_FRAMELOST_S *pstFrmLostParam); +HI_S32 HI_MPI_VENC_GetFrameLostStrategy(VENC_CHN VeChn, VENC_PARAM_FRAMELOST_S *pstFrmLostParam); + + +HI_S32 HI_MPI_VENC_SetSuperFrameCfg(VENC_CHN VeChn, const VENC_SUPERFRAME_CFG_S *pstSuperFrmParam); +HI_S32 HI_MPI_VENC_GetSuperFrameCfg(VENC_CHN VeChn,VENC_SUPERFRAME_CFG_S *pstSuperFrmParam); + +HI_S32 HI_MPI_VENC_SetIntraRefresh(VENC_CHN VeChn, VENC_PARAM_INTRA_REFRESH_S *pstIntraRefresh); +HI_S32 HI_MPI_VENC_GetIntraRefresh(VENC_CHN VeChn, VENC_PARAM_INTRA_REFRESH_S *pstIntraRefresh); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_VENC_H__ */ + diff --git a/device/mpp/include/mpi_vgs.h b/device/mpp/include/mpi_vgs.h new file mode 100644 index 0000000..61084a9 --- /dev/null +++ b/device/mpp/include/mpi_vgs.h @@ -0,0 +1,205 @@ +/****************************************************************************** + + Copyright (C), 2013-2033, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vgs.h + Version : Initial Draft + Author : Hisilicon Hi35xx MPP Team + Created : 2013/07/24 + Last Modified : + Description : mpi functions declaration + Function List : + History : +******************************************************************************/ +#ifndef __MPI_VGS_H__ +#define __MPI_VGS_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_vgs.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/***************************************************************************** + Prototype : HI_MPI_VGS_BeginJob + Description : Begin a vgs job,then add task into the job,vgs will finish all the task in the job. + Input : VGS_HANDLE *phHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2013/07/24 + Author : z00183560 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_BeginJob(VGS_HANDLE *phHandle); + +/***************************************************************************** + Prototype : HI_MPI_VGS_EndJob + Description : End a job,all tasks in the job will be submmitted to vgs + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2013/07/24 + Author : z00183560 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_EndJob(VGS_HANDLE hHandle); + +/***************************************************************************** + Prototype : HI_MPI_VGS_CancelJob + Description : Cancel a job ,then all tasks in the job will not be submmitted to vgs + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2013/07/24 + Author : z00183560 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_CancelJob(VGS_HANDLE hHandle); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddScaleTask + Description : Add a task to a vgs job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2013/07/24 + Author : z00183560 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddScaleTask(VGS_HANDLE hHandle, VGS_TASK_ATTR_S *pstTask); + + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddDrawLineTask + Description : add a draw line task into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddDrawLineTask(VGS_HANDLE hHandle, VGS_TASK_ATTR_S *pstTask, VGS_DRAW_LINE_S *pstVgsDrawLine); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddCoverTask + Description : add a draw point task into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddCoverTask(VGS_HANDLE hHandle, VGS_TASK_ATTR_S *pstTask, VGS_ADD_COVER_S *pstVgsAddCover); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddOsdTask + Description : add a draw point task into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddOsdTask(VGS_HANDLE hHandle, VGS_TASK_ATTR_S *pstTask, VGS_ADD_OSD_S *pstVgsAddOsd); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddDrawLineTaskArray + Description : add draw line tasks into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddDrawLineTaskArray(VGS_HANDLE hHandle, VGS_TASK_ATTR_S * pstTask, VGS_DRAW_LINE_S astVgsDrawLine[], HI_U32 u32ArraySize); +/***************************************************************************** + Prototype : HI_MPI_VGS_AddCoverTaskArray + Description : add cover tasks into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddCoverTaskArray(VGS_HANDLE hHandle, VGS_TASK_ATTR_S * pstTask, VGS_ADD_COVER_S astVgsAddCover[], HI_U32 u32ArraySize); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddOsdTaskArray + Description : add osd tasks into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddOsdTaskArray(VGS_HANDLE hHandle, VGS_TASK_ATTR_S * pstTask, VGS_ADD_OSD_S astVgsAddOsd[], HI_U32 u32ArraySize); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_VGS_H__ */ + diff --git a/device/mpp/include/mpi_vi.h b/device/mpp/include/mpi_vi.h new file mode 100644 index 0000000..4819d30 --- /dev/null +++ b/device/mpp/include/mpi_vi.h @@ -0,0 +1,118 @@ +/****************************************************************************** + + Copyright (C), 2013-2030, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vi.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/08 + Description : + History : + 1.Date : 2013/05/08 + Author : + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_VI_H__ +#define __MPI_VI_H__ + +#include "hi_comm_vi.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_VI_SetDevAttr(VI_DEV ViDev, const VI_DEV_ATTR_S *pstDevAttr); +HI_S32 HI_MPI_VI_GetDevAttr(VI_DEV ViDev, VI_DEV_ATTR_S *pstDevAttr); + +HI_S32 HI_MPI_VI_EnableDev(VI_DEV ViDev); +HI_S32 HI_MPI_VI_DisableDev(VI_DEV ViDev); + +HI_S32 HI_MPI_VI_SetChnAttr(VI_CHN ViChn, const VI_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VI_GetChnAttr(VI_CHN ViChn, VI_CHN_ATTR_S *pstAttr); + +HI_S32 HI_MPI_VI_EnableChn(VI_CHN ViChn); +HI_S32 HI_MPI_VI_DisableChn(VI_CHN ViChn); + +HI_S32 HI_MPI_VI_GetFrame(VI_CHN ViChn, VIDEO_FRAME_INFO_S *pstFrameInfo, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VI_ReleaseFrame(VI_CHN ViChn, VIDEO_FRAME_INFO_S *pstFrameInfo); +HI_S32 HI_MPI_VI_SetFrameDepth(VI_CHN ViChn, HI_U32 u32Depth); +HI_S32 HI_MPI_VI_GetFrameDepth(VI_CHN ViChn, HI_U32 *pu32Depth); + +HI_S32 HI_MPI_VI_SetUserPic(VI_CHN ViChn, VI_USERPIC_ATTR_S *pstUsrPic); +HI_S32 HI_MPI_VI_EnableUserPic(VI_CHN ViChn); +HI_S32 HI_MPI_VI_DisableUserPic(VI_CHN ViChn); + +/* Normally, these functions are not necessary in typical business */ +HI_S32 HI_MPI_VI_BindChn(VI_CHN ViChn, const VI_CHN_BIND_ATTR_S *pstChnBindAttr); +HI_S32 HI_MPI_VI_UnBindChn(VI_CHN ViChn); +HI_S32 HI_MPI_VI_GetChnBind(VI_CHN ViChn, VI_CHN_BIND_ATTR_S *pstChnBindAttr); + +HI_S32 HI_MPI_VI_SetDevAttrEx(VI_DEV ViDev, const VI_DEV_ATTR_EX_S *pstDevAttrEx); +HI_S32 HI_MPI_VI_GetDevAttrEx(VI_DEV ViDev, VI_DEV_ATTR_EX_S *pstDevAttrEx); + +HI_S32 HI_MPI_VI_GetFd(VI_CHN ViChn); + +HI_S32 HI_MPI_VI_Query(VI_CHN ViChn, VI_CHN_STAT_S *pstStat); + +HI_S32 HI_MPI_VI_EnableChnInterrupt(VI_CHN ViChn); +HI_S32 HI_MPI_VI_DisableChnInterrupt(VI_CHN ViChn); + +HI_S32 HI_MPI_VI_SetFlashConfig(VI_DEV ViDev, const VI_FLASH_CONFIG_S *pstFlashConfig); +HI_S32 HI_MPI_VI_GetFlashConfig(VI_DEV ViDev, VI_FLASH_CONFIG_S *pstFlashConfig); +HI_S32 HI_MPI_VI_TriggerFlash(VI_DEV ViDev, HI_BOOL bEnable); + +HI_S32 HI_MPI_VI_SetExtChnAttr(VI_CHN ViChn, const VI_EXT_CHN_ATTR_S *pstExtChnAttr); +HI_S32 HI_MPI_VI_GetExtChnAttr(VI_CHN ViChn, VI_EXT_CHN_ATTR_S *pstExtChnAttr); + +HI_S32 HI_MPI_VI_SetExtChnCrop(VI_CHN ViChn, const CROP_INFO_S *pstExtChnCrop); +HI_S32 HI_MPI_VI_GetExtChnCrop(VI_CHN ViChn, CROP_INFO_S *pstExtChnCrop); + +HI_S32 HI_MPI_VI_SetLDCAttr(VI_CHN ViChn, const VI_LDC_ATTR_S *pstLDCAttr); +HI_S32 HI_MPI_VI_GetLDCAttr(VI_CHN ViChn, VI_LDC_ATTR_S *pstLDCAttr); + +HI_S32 HI_MPI_VI_SetCSCAttr(VI_DEV ViDev, const VI_CSC_ATTR_S *pstCSCAttr); +HI_S32 HI_MPI_VI_GetCSCAttr(VI_DEV ViDev, VI_CSC_ATTR_S *pstCSCAttr); + +HI_S32 HI_MPI_VI_SetRotate(VI_CHN ViChn, const ROTATE_E enRotate); +HI_S32 HI_MPI_VI_GetRotate(VI_CHN ViChn, ROTATE_E *penRotate); + +HI_S32 HI_MPI_VI_GetChnLuma(VI_CHN ViChn, VI_CHN_LUM_S *pstLuma); + +HI_S32 HI_MPI_VI_SetWDRAttr(VI_DEV ViDev, const VI_WDR_ATTR_S *pstWDRAttr); +HI_S32 HI_MPI_VI_GetWDRAttr(VI_DEV ViDev, VI_WDR_ATTR_S *pstWDRAttr); + +HI_S32 HI_MPI_VI_SetFisheyeDevConfig(VI_DEV ViDev, const FISHEYE_CONFIG_S *pstFisheyeConfig); +HI_S32 HI_MPI_VI_GetFisheyeDevConfig(VI_DEV ViDev, FISHEYE_CONFIG_S *pstFisheyeConfig); + +HI_S32 HI_MPI_VI_SetFisheyeAttr(VI_CHN ViChn, const FISHEYE_ATTR_S *pstFisheyeAttr); +HI_S32 HI_MPI_VI_GetFisheyeAttr(VI_CHN ViChn, FISHEYE_ATTR_S *pstFisheyeAttr); + +HI_S32 HI_MPI_VI_SetDevDumpAttr(VI_DEV ViDev, const VI_DUMP_ATTR_S *pstDumpAttr); +HI_S32 HI_MPI_VI_GetDevDumpAttr(VI_DEV ViDev, VI_DUMP_ATTR_S *pstDumpAttr); + +HI_S32 HI_MPI_VI_EnableBayerDump(VI_DEV ViDev); +HI_S32 HI_MPI_VI_DisableBayerDump(VI_DEV ViDev); + +HI_S32 HI_MPI_VI_EnableBayerRead(VI_DEV ViDev); +HI_S32 HI_MPI_VI_DisableBayerRead(VI_DEV ViDev); +HI_S32 HI_MPI_VI_SendBayerData(VI_DEV ViDev, const VI_RAW_DATA_INFO_S *pstRawData, HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VI_SetDCIParam(VI_DEV ViDev, const VI_DCI_PARAM_S *pstDciParam); +HI_S32 HI_MPI_VI_GetDCIParam(VI_DEV ViDev, VI_DCI_PARAM_S *pstDciParam); + +HI_S32 HI_MPI_VI_CloseFd(HI_VOID); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /*__MPI_VI_H__ */ + diff --git a/device/mpp/include/mpi_vo.h b/device/mpp/include/mpi_vo.h new file mode 100644 index 0000000..c1afb01 --- /dev/null +++ b/device/mpp/include/mpi_vo.h @@ -0,0 +1,128 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vo.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/08 + Description : + History : + 1.Date : 2013/05/08 + Author : d00224772 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_VO_H__ +#define __MPI_VO_H__ + +#include "hi_comm_vo.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +/* Device Settings */ + +HI_S32 HI_MPI_VO_Enable (VO_DEV VoDev); +HI_S32 HI_MPI_VO_Disable(VO_DEV VoDev); + +HI_S32 HI_MPI_VO_SetPubAttr(VO_DEV VoDev, const VO_PUB_ATTR_S *pstPubAttr); +HI_S32 HI_MPI_VO_GetPubAttr(VO_DEV VoDev, VO_PUB_ATTR_S *pstPubAttr); + +HI_S32 HI_MPI_VO_CloseFd(HI_VOID); + +/* Video Settings */ + +HI_S32 HI_MPI_VO_EnableVideoLayer (VO_LAYER VoLayer); +HI_S32 HI_MPI_VO_DisableVideoLayer(VO_LAYER VoLayer); + +HI_S32 HI_MPI_VO_SetVideoLayerAttr(VO_LAYER VoLayer, const VO_VIDEO_LAYER_ATTR_S *pstLayerAttr); +HI_S32 HI_MPI_VO_GetVideoLayerAttr(VO_LAYER VoLayer, VO_VIDEO_LAYER_ATTR_S *pstLayerAttr); + +HI_S32 HI_MPI_VO_SetVideoLayerPriority(VO_LAYER VoLayer, HI_U32 u32Priority); +HI_S32 HI_MPI_VO_GetVideoLayerPriority(VO_LAYER VoLayer, HI_U32 *pu32Priority); + +HI_S32 HI_MPI_VO_SetVideoLayerCSC(VO_LAYER VoLayer, const VO_CSC_S *pstVideoCSC); +HI_S32 HI_MPI_VO_GetVideoLayerCSC(VO_LAYER VoLayer, VO_CSC_S *pstVideoCSC); + +HI_S32 HI_MPI_VO_SetVideoLayerPartitionMode(VO_LAYER VoLayer, VO_PART_MODE_E enPartMode); +HI_S32 HI_MPI_VO_GetVideoLayerPartitionMode(VO_LAYER VoLayer, VO_PART_MODE_E *penPartMode); + +HI_S32 HI_MPI_VO_SetAttrBegin(VO_LAYER VoLayer); +HI_S32 HI_MPI_VO_SetAttrEnd (VO_LAYER VoLayer); + +HI_S32 HI_MPI_VO_SetPlayToleration(VO_LAYER VoLayer, HI_U32 u32Toleration); +HI_S32 HI_MPI_VO_GetPlayToleration(VO_LAYER VoLayer, HI_U32 *pu32Toleration); + +HI_S32 HI_MPI_VO_GetScreenFrame (VO_LAYER VoLayer, VIDEO_FRAME_INFO_S *pstVFrame, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VO_ReleaseScreenFrame(VO_LAYER VoLayer, VIDEO_FRAME_INFO_S *pstVFrame); + +HI_S32 HI_MPI_VO_SetDispBufLen(VO_LAYER VoLayer, HI_U32 u32BufLen); +HI_S32 HI_MPI_VO_GetDispBufLen(VO_LAYER VoLayer, HI_U32 *pu32BufLen); + +/* General Operation of Channel */ + +HI_S32 HI_MPI_VO_EnableChn (VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_DisableChn(VO_LAYER VoLayer, VO_CHN VoChn); + +HI_S32 HI_MPI_VO_SetChnAttr(VO_LAYER VoLayer, VO_CHN VoChn, const VO_CHN_ATTR_S *pstChnAttr); +HI_S32 HI_MPI_VO_GetChnAttr(VO_LAYER VoLayer, VO_CHN VoChn, VO_CHN_ATTR_S *pstChnAttr); + +HI_S32 HI_MPI_VO_SetChnField(VO_LAYER VoLayer, VO_CHN VoChn, const VO_DISPLAY_FIELD_E enField); +HI_S32 HI_MPI_VO_GetChnField(VO_LAYER VoLayer, VO_CHN VoChn, VO_DISPLAY_FIELD_E *pField); + +HI_S32 HI_MPI_VO_SetChnFrameRate(VO_LAYER VoLayer, VO_CHN VoChn, HI_S32 s32ChnFrmRate); +HI_S32 HI_MPI_VO_GetChnFrameRate(VO_LAYER VoLayer, VO_CHN VoChn, HI_S32 *ps32ChnFrmRate); + +HI_S32 HI_MPI_VO_GetChnFrame(VO_LAYER VoLayer, VO_CHN VoChn, VIDEO_FRAME_INFO_S *pstFrame, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VO_ReleaseChnFrame(VO_LAYER VoLayer, VO_CHN VoChn, const VIDEO_FRAME_INFO_S *pstFrame); + +HI_S32 HI_MPI_VO_PauseChn (VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_ResumeChn(VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_StepChn(VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_RefreshChn( VO_LAYER VoLayer, VO_CHN VoChn); + +HI_S32 HI_MPI_VO_ShowChn(VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_HideChn(VO_LAYER VoLayer, VO_CHN VoChn); + +HI_S32 HI_MPI_VO_SetZoomInWindow(VO_LAYER VoLayer, VO_CHN VoChn, const VO_ZOOM_ATTR_S *pstZoomAttr); +HI_S32 HI_MPI_VO_GetZoomInWindow(VO_LAYER VoLayer, VO_CHN VoChn, VO_ZOOM_ATTR_S *pstZoomAttr); + +HI_S32 HI_MPI_VO_GetChnPts (VO_LAYER VoLayer, VO_CHN VoChn, HI_U64 *pu64ChnPts); +HI_S32 HI_MPI_VO_QueryChnStat(VO_LAYER VoLayer, VO_CHN VoChn, VO_QUERY_STATUS_S *pstStatus); + +HI_S32 HI_MPI_VO_SendFrame(VO_LAYER VoLayer, VO_CHN VoChn, VIDEO_FRAME_INFO_S *pstVFrame, HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VO_ClearChnBuffer(VO_LAYER VoLayer, VO_CHN VoChn, HI_BOOL bClrAll); + +HI_S32 HI_MPI_VO_SetChnBorder(VO_LAYER VoLayer, VO_CHN VoChn, const VO_BORDER_S *pstBorder); +HI_S32 HI_MPI_VO_GetChnBorder(VO_LAYER VoLayer, VO_CHN VoChn, VO_BORDER_S *pstBorder); + +HI_S32 HI_MPI_VO_SetChnReceiveThreshold(VO_LAYER VoLayer, VO_CHN VoChn, HI_U32 u32Threshold); +HI_S32 HI_MPI_VO_GetChnReceiveThreshold(VO_LAYER VoLayer, VO_CHN VoChn, HI_U32 *pu32Threshold); + +HI_S32 HI_MPI_VO_GetChnRegionLuma(VO_LAYER VoLayer, VO_CHN VoChn, VO_REGION_INFO_S *pstRegionInfo, + HI_U32 *pu32LumaData, HI_S32 s32MilliSec); +/* GraphicLayer setting */ + + +HI_S32 HI_MPI_VO_SetGraphicLayerCSC(GRAPHIC_LAYER GraphicLayer, const VO_CSC_S *pstCSC); +HI_S32 HI_MPI_VO_GetGraphicLayerCSC(GRAPHIC_LAYER GraphicLayer, VO_CSC_S *pstCSC); + +HI_S32 HI_MPI_VO_SetDevFrameRate(VO_DEV VoDev, HI_U32 u32FrameRate); +HI_S32 HI_MPI_VO_GetDevFrameRate(VO_DEV VoDev, HI_U32 *pu32FrameRate); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /*__MPI_VO_H__ */ + diff --git a/device/mpp/include/mpi_vpss.h b/device/mpp/include/mpi_vpss.h new file mode 100644 index 0000000..04e78fb --- /dev/null +++ b/device/mpp/include/mpi_vpss.h @@ -0,0 +1,137 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vpss.h + Version : Initial Draft + Author : + Created : + Last Modified : + Description : mpi functions declaration + Function List : + History : + 1.Date : 20130508 + Author : l00183122 + Modification: Create +******************************************************************************/ +#ifndef __MPI_VPSS_H__ +#define __MPI_VPSS_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_vpss.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/* Group Settings */ +HI_S32 HI_MPI_VPSS_CreateGrp(VPSS_GRP VpssGrp, VPSS_GRP_ATTR_S *pstGrpAttr); +HI_S32 HI_MPI_VPSS_DestroyGrp(VPSS_GRP VpssGrp); + +HI_S32 HI_MPI_VPSS_StartGrp(VPSS_GRP VpssGrp); +HI_S32 HI_MPI_VPSS_StopGrp(VPSS_GRP VpssGrp); + +HI_S32 HI_MPI_VPSS_ResetGrp(VPSS_GRP VpssGrp); + +HI_S32 HI_MPI_VPSS_GetGrpAttr(VPSS_GRP VpssGrp, VPSS_GRP_ATTR_S *pstGrpAttr); +HI_S32 HI_MPI_VPSS_SetGrpAttr(VPSS_GRP VpssGrp, VPSS_GRP_ATTR_S *pstGrpAttr); + +HI_S32 HI_MPI_VPSS_SetGrpParam(VPSS_GRP VpssGrp, VPSS_GRP_PARAM_S *pstVpssParam); +HI_S32 HI_MPI_VPSS_GetGrpParam(VPSS_GRP VpssGrp, VPSS_GRP_PARAM_S *pstVpssParam); + +HI_S32 HI_MPI_VPSS_SetGrpParamV2(VPSS_GRP VpssGrp, VPSS_GRP_PARAM_V2_S *pstVpssParamV2); +HI_S32 HI_MPI_VPSS_GetGrpParamV2(VPSS_GRP VpssGrp, VPSS_GRP_PARAM_V2_S *pstVpssParamV2); + +HI_S32 HI_MPI_VPSS_SetGrpDelay(VPSS_GRP VpssGrp, HI_U32 u32Delay); +HI_S32 HI_MPI_VPSS_GetGrpDelay(VPSS_GRP VpssGrp, HI_U32 *pu32Delay); + +HI_S32 HI_MPI_VPSS_SetGrpFrameRate(VPSS_GRP VpssGrp, VPSS_FRAME_RATE_S *pstVpssFrameRate); +HI_S32 HI_MPI_VPSS_GetGrpFrameRate(VPSS_GRP VpssGrp, VPSS_FRAME_RATE_S *pstVpssFrameRate); + +HI_S32 HI_MPI_VPSS_SetGrpCrop(VPSS_GRP VpssGrp, VPSS_CROP_INFO_S *pstCropInfo); +HI_S32 HI_MPI_VPSS_GetGrpCrop(VPSS_GRP VpssGrp, VPSS_CROP_INFO_S *pstCropInfo); + +HI_S32 HI_MPI_VPSS_SetRefSelect(VPSS_GRP VpssGrp, const VPSS_REF_SEL_MODE_E enRefSelMode); +HI_S32 HI_MPI_VPSS_GetRefSelect(VPSS_GRP VpssGrp, VPSS_REF_SEL_MODE_E *penRefSelMode); + +HI_S32 HI_MPI_VPSS_SendFrame(VPSS_GRP VpssGrp, VIDEO_FRAME_INFO_S *pstVideoFrame, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VPSS_GetGrpFrame(VPSS_GRP VpssGrp, VIDEO_FRAME_INFO_S *pstVideoFrame, HI_U32 u32FrameIndex); +HI_S32 HI_MPI_VPSS_ReleaseGrpFrame(VPSS_GRP VpssGrp, VIDEO_FRAME_INFO_S *pstVideoFrame); + +HI_S32 HI_MPI_VPSS_EnableBackupFrame(VPSS_GRP VpssGrp); +HI_S32 HI_MPI_VPSS_DisableBackupFrame(VPSS_GRP VpssGrp); + + +/* Chn Settings */ + +HI_S32 HI_MPI_VPSS_EnableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn); +HI_S32 HI_MPI_VPSS_DisableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn); + +HI_S32 HI_MPI_VPSS_SetChnMode(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_MODE_S *pstVpssMode); +HI_S32 HI_MPI_VPSS_GetChnMode(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_MODE_S *pstVpssMode); + +HI_S32 HI_MPI_VPSS_GetChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_ATTR_S *pstChnAttr); +HI_S32 HI_MPI_VPSS_SetChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_ATTR_S *pstChnAttr); + +HI_S32 HI_MPI_VPSS_SetChnParam(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_PARAM_S *pstChnSpParam); +HI_S32 HI_MPI_VPSS_GetChnParam(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_PARAM_S *pstChnSpParam); + +HI_S32 HI_MPI_VPSS_SetDepth(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, HI_U32 u32Depth); +HI_S32 HI_MPI_VPSS_GetDepth(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, HI_U32 *pu32Depth); + +HI_S32 HI_MPI_VPSS_GetChnFrame(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, + VIDEO_FRAME_INFO_S *pstVideoFrame, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VPSS_ReleaseChnFrame(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VIDEO_FRAME_INFO_S *pstVideoFrame); + +HI_S32 HI_MPI_VPSS_SetChnNR(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, HI_BOOL bEnable); +HI_S32 HI_MPI_VPSS_GetChnNR(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, HI_BOOL *pbEnable); + +HI_S32 HI_MPI_VPSS_SetChnCrop(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CROP_INFO_S *pstCropInfo); +HI_S32 HI_MPI_VPSS_GetChnCrop(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CROP_INFO_S *pstCropInfo); + +HI_S32 HI_MPI_VPSS_SetChnCover(VPSS_GRP VpssGrp,VPSS_CHN VpssChn, HI_U32 u32CoverMask); +HI_S32 HI_MPI_VPSS_GetChnCover(VPSS_GRP VpssGrp,VPSS_CHN VpssChn, HI_U32 *pu32CoverMask); + +HI_S32 HI_MPI_VPSS_SetChnOverlay(VPSS_GRP VpssGrp,VPSS_CHN VpssChn, HI_U32 u32OverlayMask); +HI_S32 HI_MPI_VPSS_GetChnOverlay(VPSS_GRP VpssGrp,VPSS_CHN VpssChn, HI_U32 *pu32OverlayMask); + +HI_S32 HI_MPI_VPSS_SetLDCAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const VPSS_LDC_ATTR_S *pstLDCAttr); +HI_S32 HI_MPI_VPSS_GetLDCAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_LDC_ATTR_S *pstLDCAttr); + +HI_S32 HI_MPI_VPSS_SetFisheyeConfig(VPSS_GRP VpssGrp, const FISHEYE_CONFIG_S *pstFisheyeConfig); +HI_S32 HI_MPI_VPSS_GetFisheyeConfig(VPSS_GRP VpssGrp, FISHEYE_CONFIG_S *pstFisheyeConfig); + +HI_S32 HI_MPI_VPSS_SetFisheyeAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const FISHEYE_ATTR_S *pstFisheyeAttr); +HI_S32 HI_MPI_VPSS_GetFisheyeAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, FISHEYE_ATTR_S *pstFisheyeAttr); + +HI_S32 HI_MPI_VPSS_SetRotate(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, ROTATE_E enRotate); +HI_S32 HI_MPI_VPSS_GetRotate(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, ROTATE_E *penRotate); + +HI_S32 HI_MPI_VPSS_GetRegionLuma(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_REGION_INFO_S *pstRegionInfo, + HI_U32 *pu32LumaData,HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VPSS_SetLowDelayAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_LOW_DELAY_INFO_S *pstLowDelayInfo); +HI_S32 HI_MPI_VPSS_GetLowDelayAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_LOW_DELAY_INFO_S *pstLowDelayInfo); + + +/* ExtChn Settings */ +HI_S32 HI_MPI_VPSS_SetExtChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_EXT_CHN_ATTR_S *pstExtChnAttr); +HI_S32 HI_MPI_VPSS_GetExtChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_EXT_CHN_ATTR_S *pstExtChnAttr); + +HI_S32 HI_MPI_VPSS_SetExtChnCrop(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const VPSS_CROP_INFO_S *pstCropInfo); +HI_S32 HI_MPI_VPSS_GetExtChnCrop(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CROP_INFO_S *pstCropInfo); + +HI_S32 HI_MPI_VPSS_SetNRParam(VPSS_GRP VpssGrp, VPSS_NR_PARAM_U *punNrParam); +HI_S32 HI_MPI_VPSS_GetNRParam(VPSS_GRP VpssGrp, VPSS_NR_PARAM_U *punNrParam); +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_VPSS_H__ */ + diff --git a/device/mpp/include/strlib.h b/device/mpp/include/strlib.h new file mode 100644 index 0000000..d47430c --- /dev/null +++ b/device/mpp/include/strlib.h @@ -0,0 +1,123 @@ + +/*-------------------------------------------------------------------------*/ +/** + @file strlib.h + @author N. Devillard + @date Jan 2001 + @version + @brief Various string handling routines to complement the C lib. + + This modules adds a few complementary string routines usually missing + in the standard C library. +*/ +/*--------------------------------------------------------------------------*/ + +/* + + + + +*/ + +#ifndef _STRLIB_H_ +#define _STRLIB_H_ + +/*--------------------------------------------------------------------------- + Includes + ---------------------------------------------------------------------------*/ + +#include +#include + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/*--------------------------------------------------------------------------- + Function codes + ---------------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------------*/ +/** + @brief Convert a string to lowercase. + @param s String to convert. + @return ptr to statically allocated string. + + This function returns a pointer to a statically allocated string + containing a lowercased version of the input string. Do not free + or modify the returned string! Since the returned string is statically + allocated, it will be modified at each function call (not re-entrant). + */ +/*--------------------------------------------------------------------------*/ +char * strlwc(const char * s); + +/*-------------------------------------------------------------------------*/ +/** + @brief Convert a string to uppercase. + @param s String to convert. + @return ptr to statically allocated string. + + This function returns a pointer to a statically allocated string + containing an uppercased version of the input string. Do not free + or modify the returned string! Since the returned string is statically + allocated, it will be modified at each function call (not re-entrant). + */ +/*--------------------------------------------------------------------------*/ +char * strupc(char * s); + +/*-------------------------------------------------------------------------*/ +/** + @brief Skip blanks until the first non-blank character. + @param s String to parse. + @return Pointer to char inside given string. + + This function returns a pointer to the first non-blank character in the + given string. + */ +/*--------------------------------------------------------------------------*/ +char * strskp(char * s); + +/*-------------------------------------------------------------------------*/ +/** + @brief Remove blanks at the end of a string. + @param s String to parse. + @return ptr to statically allocated string. + + This function returns a pointer to a statically allocated string, + which is identical to the input string, except that all blank + characters at the end of the string have been removed. + Do not free or modify the returned string! Since the returned string + is statically allocated, it will be modified at each function call + (not re-entrant). + */ +/*--------------------------------------------------------------------------*/ +char * strcrop(char * s); + +/*-------------------------------------------------------------------------*/ +/** + @brief Remove blanks at the beginning and the end of a string. + @param s String to parse. + @return ptr to statically allocated string. + + This function returns a pointer to a statically allocated string, + which is identical to the input string, except that all blank + characters at the end and the beg. of the string have been removed. + Do not free or modify the returned string! Since the returned string + is statically allocated, it will be modified at each function call + (not re-entrant). + */ +/*--------------------------------------------------------------------------*/ +char * strstrip(char * s) ; + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif diff --git a/device/mpp/ko/acodec.ko b/device/mpp/ko/acodec.ko new file mode 100644 index 0000000..c87bd1c Binary files /dev/null and b/device/mpp/ko/acodec.ko differ diff --git a/device/mpp/ko/clkcfg_hi3518e.sh b/device/mpp/ko/clkcfg_hi3518e.sh new file mode 100644 index 0000000..84e90da --- /dev/null +++ b/device/mpp/ko/clkcfg_hi3518e.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +# This is a sample, you should rewrite it according to your chip # +# clock will be closed at uboot, so you needn't call it! + +clk_close() +{ + # Below clock operation is all from Hi3516A, you should modify by datasheet! + echo "clock close operation done!" +} + +# open module clock while you need it! +clk_cfg() +{ + himm 0x2003002c 0xc4003; # VICAP, ISP unreset & clock enable, Sensor clock enable, clk reverse + himm 0x20030034 0x64ff4; # 6bit LCD + #himm 0x20030034 0x164ff4; # 8bit LCD + #himm 0x20030034 0xff4 # bt656 + + himm 0x20030040 0x2000; # AVC unreset, code also config + himm 0x20030048 0x2; # VPSS unreset, code also config + himm 0x20030058 0x2; # TDE unreset + himm 0x2003005c 0x2; #VGS + himm 0x20030060 0x2; # JPGE unreset + #himm 0x20030068 0x02000000; # LCD 27M:0x04000000, 13.5M:0x02000000 + himm 0x2003006c 0xa; # IVE/HASH unreset + himm 0x2003007c 0x2; # Cipher + himm 0x200300d4 0x7; # GZIP + himm 0x200300d8 0x2a; # DDRTEfuseDMA + + himm 0x2003008c 0x2; # AIO unreset and clock enable,m/f/bclk config in code. + himm 0x20030100 0x20; # RSA + himm 0x20030104 0x0; # AVC-148.5M VGS-148.5M VPSS-99M + + + # USB not set + # SDIO not set + # SFC not set + # NAND not set + # RTC use external clk + # PWM not set #(PERI_CRG38)himm 0x20030038 0x2 + # DMAC not set #(PERI_CRG56)himm 0x200300E0 0x2 + # SPI not set + # I2C not set + # SENSE CLK not set + # WDG not set + + echo "clock configure operation done!" +} + +#clk_close +clk_cfg diff --git a/device/mpp/ko/extdrv/adv_7179.ko b/device/mpp/ko/extdrv/adv_7179.ko new file mode 100644 index 0000000..e1b1680 Binary files /dev/null and b/device/mpp/ko/extdrv/adv_7179.ko differ diff --git a/device/mpp/ko/extdrv/piris.ko b/device/mpp/ko/extdrv/piris.ko new file mode 100644 index 0000000..5705183 Binary files /dev/null and b/device/mpp/ko/extdrv/piris.ko differ diff --git a/device/mpp/ko/extdrv/pwm.ko b/device/mpp/ko/extdrv/pwm.ko new file mode 100644 index 0000000..a6d9c29 Binary files /dev/null and b/device/mpp/ko/extdrv/pwm.ko differ diff --git a/device/mpp/ko/extdrv/sensor_i2c.ko b/device/mpp/ko/extdrv/sensor_i2c.ko new file mode 100644 index 0000000..1b15e1e Binary files /dev/null and b/device/mpp/ko/extdrv/sensor_i2c.ko differ diff --git a/device/mpp/ko/extdrv/sensor_spi.ko b/device/mpp/ko/extdrv/sensor_spi.ko new file mode 100644 index 0000000..8b8c343 Binary files /dev/null and b/device/mpp/ko/extdrv/sensor_spi.ko differ diff --git a/device/mpp/ko/extdrv/ssp_ili9341v_6bit.ko b/device/mpp/ko/extdrv/ssp_ili9341v_6bit.ko new file mode 100644 index 0000000..afb7bb4 Binary files /dev/null and b/device/mpp/ko/extdrv/ssp_ili9341v_6bit.ko differ diff --git a/device/mpp/ko/extdrv/ssp_ili9342h_6bit.ko b/device/mpp/ko/extdrv/ssp_ili9342h_6bit.ko new file mode 100644 index 0000000..e01fffd Binary files /dev/null and b/device/mpp/ko/extdrv/ssp_ili9342h_6bit.ko differ diff --git a/device/mpp/ko/extdrv/ssp_ota5182.ko b/device/mpp/ko/extdrv/ssp_ota5182.ko new file mode 100644 index 0000000..2e47b5c Binary files /dev/null and b/device/mpp/ko/extdrv/ssp_ota5182.ko differ diff --git a/device/mpp/ko/extdrv/tlv_320aic31.ko b/device/mpp/ko/extdrv/tlv_320aic31.ko new file mode 100644 index 0000000..7f59be9 Binary files /dev/null and b/device/mpp/ko/extdrv/tlv_320aic31.ko differ diff --git a/device/mpp/ko/hi3518e_adec.ko b/device/mpp/ko/hi3518e_adec.ko new file mode 100644 index 0000000..d66c699 Binary files /dev/null and b/device/mpp/ko/hi3518e_adec.ko differ diff --git a/device/mpp/ko/hi3518e_aenc.ko b/device/mpp/ko/hi3518e_aenc.ko new file mode 100644 index 0000000..bd6fcfd Binary files /dev/null and b/device/mpp/ko/hi3518e_aenc.ko differ diff --git a/device/mpp/ko/hi3518e_ai.ko b/device/mpp/ko/hi3518e_ai.ko new file mode 100644 index 0000000..3bf7ae8 Binary files /dev/null and b/device/mpp/ko/hi3518e_ai.ko differ diff --git a/device/mpp/ko/hi3518e_aio.ko b/device/mpp/ko/hi3518e_aio.ko new file mode 100644 index 0000000..7ebb642 Binary files /dev/null and b/device/mpp/ko/hi3518e_aio.ko differ diff --git a/device/mpp/ko/hi3518e_ao.ko b/device/mpp/ko/hi3518e_ao.ko new file mode 100644 index 0000000..55accae Binary files /dev/null and b/device/mpp/ko/hi3518e_ao.ko differ diff --git a/device/mpp/ko/hi3518e_base.ko b/device/mpp/ko/hi3518e_base.ko new file mode 100644 index 0000000..91464f9 Binary files /dev/null and b/device/mpp/ko/hi3518e_base.ko differ diff --git a/device/mpp/ko/hi3518e_chnl.ko b/device/mpp/ko/hi3518e_chnl.ko new file mode 100644 index 0000000..114f198 Binary files /dev/null and b/device/mpp/ko/hi3518e_chnl.ko differ diff --git a/device/mpp/ko/hi3518e_h264e.ko b/device/mpp/ko/hi3518e_h264e.ko new file mode 100644 index 0000000..617a93b Binary files /dev/null and b/device/mpp/ko/hi3518e_h264e.ko differ diff --git a/device/mpp/ko/hi3518e_isp.ko b/device/mpp/ko/hi3518e_isp.ko new file mode 100644 index 0000000..d8d5520 Binary files /dev/null and b/device/mpp/ko/hi3518e_isp.ko differ diff --git a/device/mpp/ko/hi3518e_ive.ko b/device/mpp/ko/hi3518e_ive.ko new file mode 100644 index 0000000..6006040 Binary files /dev/null and b/device/mpp/ko/hi3518e_ive.ko differ diff --git a/device/mpp/ko/hi3518e_jpege.ko b/device/mpp/ko/hi3518e_jpege.ko new file mode 100644 index 0000000..628f6b7 Binary files /dev/null and b/device/mpp/ko/hi3518e_jpege.ko differ diff --git a/device/mpp/ko/hi3518e_rc.ko b/device/mpp/ko/hi3518e_rc.ko new file mode 100644 index 0000000..9414acd Binary files /dev/null and b/device/mpp/ko/hi3518e_rc.ko differ diff --git a/device/mpp/ko/hi3518e_region.ko b/device/mpp/ko/hi3518e_region.ko new file mode 100644 index 0000000..6e07ce0 Binary files /dev/null and b/device/mpp/ko/hi3518e_region.ko differ diff --git a/device/mpp/ko/hi3518e_sys.ko b/device/mpp/ko/hi3518e_sys.ko new file mode 100644 index 0000000..f7c6b31 Binary files /dev/null and b/device/mpp/ko/hi3518e_sys.ko differ diff --git a/device/mpp/ko/hi3518e_tde.ko b/device/mpp/ko/hi3518e_tde.ko new file mode 100644 index 0000000..c5324e0 Binary files /dev/null and b/device/mpp/ko/hi3518e_tde.ko differ diff --git a/device/mpp/ko/hi3518e_venc.ko b/device/mpp/ko/hi3518e_venc.ko new file mode 100644 index 0000000..a3aa2ad Binary files /dev/null and b/device/mpp/ko/hi3518e_venc.ko differ diff --git a/device/mpp/ko/hi3518e_vgs.ko b/device/mpp/ko/hi3518e_vgs.ko new file mode 100644 index 0000000..dcaf8e0 Binary files /dev/null and b/device/mpp/ko/hi3518e_vgs.ko differ diff --git a/device/mpp/ko/hi3518e_viu.ko b/device/mpp/ko/hi3518e_viu.ko new file mode 100644 index 0000000..ca5f32c Binary files /dev/null and b/device/mpp/ko/hi3518e_viu.ko differ diff --git a/device/mpp/ko/hi3518e_vou.ko b/device/mpp/ko/hi3518e_vou.ko new file mode 100644 index 0000000..84f8822 Binary files /dev/null and b/device/mpp/ko/hi3518e_vou.ko differ diff --git a/device/mpp/ko/hi3518e_vpss.ko b/device/mpp/ko/hi3518e_vpss.ko new file mode 100644 index 0000000..ff1fafd Binary files /dev/null and b/device/mpp/ko/hi3518e_vpss.ko differ diff --git a/device/mpp/ko/hi_cipher.ko b/device/mpp/ko/hi_cipher.ko new file mode 100644 index 0000000..c2deac9 Binary files /dev/null and b/device/mpp/ko/hi_cipher.ko differ diff --git a/device/mpp/ko/hi_media.ko b/device/mpp/ko/hi_media.ko new file mode 100644 index 0000000..0707acb Binary files /dev/null and b/device/mpp/ko/hi_media.ko differ diff --git a/device/mpp/ko/hi_mipi.ko b/device/mpp/ko/hi_mipi.ko new file mode 100644 index 0000000..bb454d8 Binary files /dev/null and b/device/mpp/ko/hi_mipi.ko differ diff --git a/device/mpp/ko/hi_rtc.ko b/device/mpp/ko/hi_rtc.ko new file mode 100644 index 0000000..0a59131 Binary files /dev/null and b/device/mpp/ko/hi_rtc.ko differ diff --git a/device/mpp/ko/hifb.ko b/device/mpp/ko/hifb.ko new file mode 100644 index 0000000..bd445ef Binary files /dev/null and b/device/mpp/ko/hifb.ko differ diff --git a/device/mpp/ko/hiuser.ko b/device/mpp/ko/hiuser.ko new file mode 100644 index 0000000..8c24d7c Binary files /dev/null and b/device/mpp/ko/hiuser.ko differ diff --git a/device/mpp/ko/hn_config.sh b/device/mpp/ko/hn_config.sh new file mode 100644 index 0000000..cabb40a --- /dev/null +++ b/device/mpp/ko/hn_config.sh @@ -0,0 +1,167 @@ +#!/bin/sh + +####################Variables Definition########################## + +insert_sns() +{ + case $SNS_TYPE in + ar0130|9m034) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + #cmos pinmux + himm 0x200f007c 0x1; # VI_DATA13 + himm 0x200f0080 0x1; # VI_DATA10 + himm 0x200f0084 0x1; # VI_DATA12 + himm 0x200f0088 0x1; # VI_DATA11 + himm 0x200f008c 0x2; # VI_VS + himm 0x200f0090 0x2; # VI_HS + himm 0x200f0094 0x1; # VI_DATA9 + + himm 0x2003002c 0xb4001; # sensor unreset, clk 27MHz, VI 99MHz + ;; + ar0230) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xb4001; # sensor unreset, clk 27MHz, VI 99MHz + ;; + imx222) + himm 0x200f0040 0x1 # SPI0_SCLK + himm 0x200f0044 0x1 # SPI0_SDO + himm 0x200f0048 0x1 # SPI0_SDI + himm 0x200f004c 0x1 # SPI0_CSN + + #cmos pinmux + himm 0x200f007c 0x1; # VI_DATA13 + himm 0x200f0080 0x1; # VI_DATA10 + himm 0x200f0084 0x1; # VI_DATA12 + himm 0x200f0088 0x1; # VI_DATA11 + himm 0x200f008c 0x2; # VI_VS + himm 0x200f0090 0x2; # VI_HS + himm 0x200f0094 0x1; # VI_DATA9 + + himm 0x2003002c 0x94001; # sensor unreset, clk 37.125MHz, VI 99MHz + + insmod extdrv/sensor_spi.ko; + ;; + ov9712) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + #cmos pinmux + himm 0x200f007c 0x1; # VI_DATA13 + himm 0x200f0080 0x1; # VI_DATA10 + himm 0x200f0084 0x1; # VI_DATA12 + himm 0x200f0088 0x1; # VI_DATA11 + himm 0x200f008c 0x2; # VI_VS + himm 0x200f0090 0x2; # VI_HS + himm 0x200f0094 0x1; # VI_DATA9 + + himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz + ;; + + ov9752) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz + ;; + mn34220) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz + ;; + mn34222) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0x94001; # sensor unreset, clk 37.125MHz, VI 99MHz + ;; + + ar0330) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xc4007; # sensor unreset, clk 24MHz, VI 99MHz + himm 0x20680024 0x0; + himm 0x20681010 0x11; + himm 0x20681014 0x3210; + himm 0x20681030 0x1; + ;; + ov4682) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz + ;; + bt1120) + himm 0x200f0008 0x4; # VI_VS + himm 0x200f000c 0x4; # VI_HS + himm 0x200f007c 0x1; # VI_DATA13 + himm 0x200f0080 0x1; # VI_DATA10 + himm 0x200f0084 0x1; # VI_DATA12 + himm 0x200f0088 0x1; # VI_DATA11 + himm 0x200f008c 0x1; # VI_DATA15 + himm 0x200f0090 0x1; # VI_DATA14 + himm 0x200f0094 0x1; # VI_DATA9 + + himm 0x2003002c 0x94003; # sensor unreset, clk 24MHz, VI 99MHz + ;; + + *) + echo "xxxx Invalid sensor type $SNS_TYPE xxxx" + report_error;; + esac +} + +remove_sns() +{ + rmmod ssp &> /dev/null + rmmod sensor_spi &> /dev/null + +} + +sys_restore() +{ + #################################################### + pinmux_hi3518e.sh -net > /dev/null + clkcfg_hi3518e.sh > /dev/null + + # system configuration + sysctl_hi3518e.sh $b_arg_online > /dev/null + insert_sns; +} + +######################parse arg################################### +b_arg_sensor=0 +b_arg_online=1 +b_arg_restore=0 + +for arg in $@ +do + if [ $b_arg_sensor -eq 1 ] ; then + b_arg_sensor=0 + SNS_TYPE=$arg; + fi + + case $arg in + "-sensor") + b_arg_sensor=1; + ;; + "-restore") + b_arg_restore=1; + ;; + "-offline") + b_arg_online=0; + ;; + esac +done +#######################parse arg end######################## + +#######################Action############################### +if [ $b_arg_restore -eq 1 ]; then + sys_restore; +fi + diff --git a/device/mpp/ko/load3518e b/device/mpp/ko/load3518e new file mode 100644 index 0000000..d3d82eb --- /dev/null +++ b/device/mpp/ko/load3518e @@ -0,0 +1,410 @@ +#!/bin/sh +# Useage: ./load3518e [ -r|-i|-a ] [ sensor ] +# -r : rmmod all modules +# -i : insmod all modules +# default : rmmod all moules and then insmod them +# + + +# imx222 9m034 ov9752 ar0230 ar0130 ov9712 mn34222 + + + +####################Variables Definition########################## + + +SNS_TYPE=ar0130 # sensor type + +mem_total=64; # 64M, total mem +mem_start=0x80000000; # phy mem start + +os_mem_size=43; # 43M, os mem +mmz_start=0x82b00000; # mmz start addr +mmz_size=16M; # 32M, mmz size + + +################################################################## + +report_error() +{ + echo "******* Error: There's something wrong, please check! *****" + exit 1 +} + +insert_audio() +{ + insmod acodec.ko + insmod hi3518e_aio.ko + insmod hi3518e_ai.ko + insmod hi3518e_ao.ko + insmod hi3518e_aenc.ko + insmod hi3518e_adec.ko + #insmod extdrv/tlv_320aic31.ko + echo "insert audio" +} + +remove_audio() +{ + rmmod tlv_320aic31.ko + rmmod hi3518e_adec + rmmod hi3518e_aenc + rmmod hi3518e_ao + rmmod hi3518e_ai + rmmod hi3518e_aio + rmmod acodec + echo "remove audio" +} + +insert_sns() +{ + case $SNS_TYPE in + ar0130|9m034) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + #cmos pinmux + himm 0x200f007c 0x1; # VI_DATA13 + himm 0x200f0080 0x1; # VI_DATA10 + himm 0x200f0084 0x1; # VI_DATA12 + himm 0x200f0088 0x1; # VI_DATA11 + himm 0x200f008c 0x2; # VI_VS + himm 0x200f0090 0x2; # VI_HS + himm 0x200f0094 0x1; # VI_DATA9 + + himm 0x2003002c 0xb4001; # sensor unreset, clk 27MHz, VI 99MHz + ;; + ar0230) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xb4001; # sensor unreset, clk 27MHz, VI 99MHz + ;; + imx222) + himm 0x200f0040 0x1 # SPI0_SCLK + himm 0x200f0044 0x1 # SPI0_SDO + himm 0x200f0048 0x1 # SPI0_SDI + himm 0x200f004c 0x1 # SPI0_CSN + + #cmos pinmux + himm 0x200f007c 0x1; # VI_DATA13 + himm 0x200f0080 0x1; # VI_DATA10 + himm 0x200f0084 0x1; # VI_DATA12 + himm 0x200f0088 0x1; # VI_DATA11 + himm 0x200f008c 0x2; # VI_VS + himm 0x200f0090 0x2; # VI_HS + himm 0x200f0094 0x1; # VI_DATA9 + + himm 0x2003002c 0x94001; # sensor unreset, clk 37.125MHz, VI 99MHz + + insmod extdrv/sensor_spi.ko; + ;; + ov9712) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + #cmos pinmux + himm 0x200f007c 0x1; # VI_DATA13 + himm 0x200f0080 0x1; # VI_DATA10 + himm 0x200f0084 0x1; # VI_DATA12 + himm 0x200f0088 0x1; # VI_DATA11 + himm 0x200f008c 0x2; # VI_VS + himm 0x200f0090 0x2; # VI_HS + himm 0x200f0094 0x1; # VI_DATA9 + + himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz + ;; + + ov9752) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz + ;; + mn34220) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz + ;; + mn34222) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0x94001; # sensor unreset, clk 37.125MHz, VI 99MHz + ;; + + ar0330) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xc4007; # sensor unreset, clk 24MHz, VI 99MHz + himm 0x20680024 0x0; + himm 0x20681010 0x11; + himm 0x20681014 0x3210; + himm 0x20681030 0x1; + ;; + ov4682) + himm 0x200f0040 0x2; # I2C0_SCL + himm 0x200f0044 0x2; # I2C0_SDA + + himm 0x2003002c 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz + ;; + bt1120) + himm 0x200f0008 0x4; # VI_VS + himm 0x200f000c 0x4; # VI_HS + himm 0x200f007c 0x1; # VI_DATA13 + himm 0x200f0080 0x1; # VI_DATA10 + himm 0x200f0084 0x1; # VI_DATA12 + himm 0x200f0088 0x1; # VI_DATA11 + himm 0x200f008c 0x1; # VI_DATA15 + himm 0x200f0090 0x1; # VI_DATA14 + himm 0x200f0094 0x1; # VI_DATA9 + + himm 0x2003002c 0x94003; # sensor unreset, clk 24MHz, VI 99MHz + ;; + + *) + echo "xxxx Invalid sensor type $SNS_TYPE xxxx" + report_error;; + esac +} + +remove_sns() +{ + rmmod sensor_spi &> /dev/null + rmmod sensor_i2c &> /dev/null +} + +sys_config() +{ + # pinmux configuration + #sh ./pinmux_hi3518e.sh -vo BT656 > /dev/null + #sh ./pinmux_hi3518e.sh -vo LCD > /dev/null + sh ./pinmux_hi3518e.sh -net > /dev/null + + # clock configuration + sh clkcfg_hi3518e.sh > /dev/null + + # system configuration + sh sysctl_hi3518e.sh $b_arg_online > /dev/null +} + +insert_ko() +{ + # sys config + sys_config; + + # driver load + insmod mmz.ko mmz=anonymous,0,$mmz_start,$mmz_size anony=1 || report_error + insmod hi_media.ko + insmod hi3518e_base.ko + + insmod hi3518e_sys.ko vi_vpss_online=$b_arg_online sensor=$SNS_TYPE + + insmod hi3518e_tde.ko + insmod hi3518e_region.ko + insmod hi3518e_vgs.ko + + insmod hi3518e_isp.ko + insmod hi3518e_viu.ko detect_err_frame=10; + insmod hi3518e_vpss.ko rfr_frame_comp=1; + insmod hi3518e_vou.ko + #insmod hi3518e_vou.ko transparentTransmit=1 #enable transparentTransmit + insmod hifb.ko video="hifb:vram0_size:1620" # default pal + + insmod hi3518e_rc.ko + insmod hi3518e_venc.ko + insmod hi3518e_chnl.ko + insmod hi3518e_h264e.ko + insmod hi3518e_jpege.ko + insmod hi3518e_ive.ko + + insmod extdrv/sensor_i2c.ko + echo "==== Your input Sensor type is $SNS_TYPE ====" + insmod extdrv/pwm.ko + insmod extdrv/piris.ko + + #insert_sns > /dev/null + insert_sns + insert_audio + + insmod hi_mipi.ko + echo "==== Your input Sensor type is $SNS_TYPE ====" +} + +remove_ko() +{ + remove_audio + remove_sns + + rmmod pwm + + rmmod hi3518e_ive + + rmmod hi3518e_rc + rmmod hi3518e_jpege + rmmod hi3518e_h264e + rmmod hi3518e_chnl + rmmod hi3518e_venc + + rmmod hifb + rmmod hi3518e_vou + rmmod hi3518e_vpss + rmmod hi3518e_viu + rmmod hi_mipi + + rmmod hi3518e_vgs + rmmod hi3518e_region + rmmod hi3518e_tde + + rmmod piris + rmmod hi3518e_isp + rmmod hi3518e_sys + rmmod hi3518e_base + rmmod hi_media + rmmod mmz +} + +sys_restore() +{ + #################################################### + pinmux_hi3518e.sh -net > /dev/null + clkcfg_hi3518e.sh > /dev/null + + # system configuration + sysctl_hi3518e.sh $b_arg_online > /dev/null + insert_sns; +} + +load_usage() +{ + echo "Usage: ./load3518e [-option] [sensor_name]" + echo "options:" + echo " -i insert modules" + echo " -r remove modules" + echo " -a remove modules first, then insert modules" + echo " -sensor sensor_name config sensor type [default: ar0230]" + echo " -osmem os_mem_size config os mem size [unit: M, default: 32]" + echo " -total_mem_size config total mem size [unit: M, default: 64]" + echo " -offline vi/vpss offline" + echo " -h help information" + echo -e "Available sensors: imx222 9m034 ov9752 ar0230 ar0130 ov9712 mn34222" + echo -e "notes: osmem option can't be used when mmz zone partition is enable\n\n" + echo -e "for example online: ./load3518e -a -sensor ar0230 -osmem 32 -total 64\n" + echo -e " offline: ./load3518e -a -sensor ar0230 -osmem 32 -total 64 -offline\n" +} + +calc_mmz_info() +{ + mmz_start=`echo "$mem_start $os_mem_size" | + awk 'BEGIN { temp = 0; } + { + temp = $1/1024/1024 + $2; + } + END { printf("0x%x00000\n", temp); }'` + + mmz_size=`echo "$mem_total $os_mem_size" | + awk 'BEGIN { temp = 0; } + { + temp = $1 - $2; + } + END { printf("%dM\n", temp); }'` + echo "mmz_start: $mmz_start, mmz_size: $mmz_size" +} + + +######################parse arg################################### +b_arg_os_mem=0 +b_arg_total_mem=0 +b_arg_sensor=0 +b_arg_insmod=0 +b_arg_remove=0 +b_arg_online=1 +b_arg_restore=0 + +for arg in $@ +do + if [ $b_arg_total_mem -eq 1 ]; then + b_arg_total_mem=0; + mem_total=$arg; + + if [ -z $mem_total ]; then + echo "[error] mem_total is null" + exit; + fi + fi + + if [ $b_arg_os_mem -eq 1 ] ; then + b_arg_os_mem=0; + os_mem_size=$arg; + + if [ -z $os_mem_size ]; then + echo "[error] os_mem_size is null" + exit; + fi + fi + + if [ $b_arg_sensor -eq 1 ] ; then + b_arg_sensor=0 + SNS_TYPE=$arg; + fi + + case $arg in + "-i") + b_arg_insmod=1; + ;; + "-r") + b_arg_remove=1; + ;; + "-a") + b_arg_insmod=1; + b_arg_remove=1; + ;; + "-h") + load_usage; + ;; + "-sensor") + b_arg_sensor=1; + ;; + "-osmem") + b_arg_os_mem=1; + ;; + "-total") + b_arg_total_mem=1; + ;; + "-restore") + b_arg_restore=1; + ;; + "-offline") + b_arg_online=0; + ;; + esac +done +#######################parse arg end######################## + +if [ $os_mem_size -ge $mem_total ] ; then + echo "[err] os_mem[$os_mem_size], over total_mem[$mem_total]" + exit; +fi + +calc_mmz_info; + +#######################Action############################### + +if [ $# -lt 1 ]; then + load_usage; + exit 0; +fi + +if [ $b_arg_remove -eq 1 ]; then + remove_ko; +fi + +if [ $b_arg_insmod -eq 1 ]; then + insert_ko; +fi + +if [ $b_arg_restore -eq 1 ]; then + sys_restore; +fi + diff --git a/device/mpp/ko/mmz.ko b/device/mpp/ko/mmz.ko new file mode 100644 index 0000000..92ea2d2 Binary files /dev/null and b/device/mpp/ko/mmz.ko differ diff --git a/device/mpp/ko/pinmux_hi3518e.sh b/device/mpp/ko/pinmux_hi3518e.sh new file mode 100644 index 0000000..b46d7dc --- /dev/null +++ b/device/mpp/ko/pinmux_hi3518e.sh @@ -0,0 +1,189 @@ +#!/bin/sh + +# This is a sample, you should rewrite it according to your chip # + +# You can configure your pinmux for the application here! + +#VICAP default setting is VIU +vicap_pin_mux() +{ + himm 0x200f0000 0x00000001 # 0: GPIO0_4 1: SENSOR_CLK + himm 0x200f0004 0x00000000 # 0: SENSOR_RSTN 1: GPIO0_5 + himm 0x200f0008 0x00000001 # 0: GPIO0_6 1FLASH_TRIG 2: SFC_EMMC_BOOT_MODE 3SPI1_CSN1 4:VI_VS + himm 0x200f000c 0x00000001 # 0GPIO0_7 1SHUTTER_TRIG 2SFC_DEVICE_MODE 4: VI_HS +} + +#SPI1 -> LCD +spi1_pim_mux() +{ + himm 0x200f0050 0x1 # 001SPI1_SCLK + himm 0x200f0054 0x1 # 001SPI1_SDO + himm 0x200f0058 0x1 # 001SPI1_SDI + himm 0x200f005c 0x1 # 001SPI1_CSN0 +} + +#I2C0 -> sensor +i2c0_pin_mux() +{ + himm 0x200f0040 0x00000002 # 0: GPIO3_3 1:spi0_sclk 2:i2c0_scl + himm 0x200f0044 0x00000002 # 0: GPIO3_4 1:spi0_sdo 2:i2c0_sda +} + +#I2C1 -> 7179 +i2c1_pin_mux() +{ + himm 0x200f0050 0x00000002 # 010I2C1_SCL + himm 0x200f0054 0x00000002 # 010I2C1_SDA +} + +i2c2_pin_mux() +{ + himm 0x200f0060 0x1; # i2c2_sda + himm 0x200f0064 0x1; # i2c2_scl +} + +#BT656 +vo_output_mode() +{ + echo "------vo_output_mode------" + #pinmux + himm 0x200f0010 0x00000003 # 3VO_CLK & 0: GPIO2_0 & 1: RMII_CLK + himm 0x200f0014 0x00000000 # 3VO_VS & 0: GPIO2_1 & 1: RMII_TX_EN & 4: SDIO1_CARD_DETECT + himm 0x200f0018 0x00000003 # 3VO_DATA5 & 0: GPIO2_2 & 1: RMII_TXD0 & 4: SDIO1_CWPR + himm 0x200f001c 0x00000000 # 3VO_DE & 0: GPIO2_3 & 1: RMII_TXD1 & 4: SDIO1_CDATA1 + himm 0x200f0020 0x00000003 # 3VO_DATA7 & 0: GPIO2_4 & 1: RMII_RX_DV & 4: SDIO1_CDATA0 + himm 0x200f0024 0x00000003 # 3VO_DATA2 & 0: GPIO2_5 & 1: RMII_RXD0 & 4: SDIO1_CDATA3 + himm 0x200f0028 0x00000003 # 3VO_DATA3 & 0: GPIO2_6 & 1: RMII_RXD1 & 4: SDIO1_CCMD + himm 0x200f002c 0x00000000 # 3VO_HS & 0: GPIO2_7 & 1: EPHY_RST & 2: BOOT_SEL & 4: SDIO1_CARD_POWER_EN + himm 0x200f0030 0x00000003 # 3VO_DATA0 & 0: GPIO0_3 & 1: SPI1_CSN1 + himm 0x200f0034 0x00000003 # 3VO_DATA1 & 0: GPIO3_0 & 1: EPHY_CLK & 4: SDIO1_CDATA2 + himm 0x200f0038 0x00000003 # 3: VO_DATA6 & 0: GPIO3_1 & 1: MDCK & 2BOOTROM_SEL + himm 0x200f003c 0x00000003 # 3VO_DATA4 & 0: GPIO3_2 & 1: MDIO + + #VDP drive capability config + himm 0x200f0810 0xd0; # VO_CLK + himm 0x200f0830 0x90; # VO_DATA0 + himm 0x200f0834 0xd0; # VO_DATA1 + himm 0x200f0824 0x90; # VO_DATA2 + himm 0x200f0828 0x90; # VO_DATA3 + himm 0x200f083c 0x90; # VO_DATA4 + himm 0x200f0818 0x90; # VO_DATA5 + himm 0x200f0838 0x90; # VO_DATA6 + himm 0x200f0820 0x90; # VO_DATA7 +} + +#RMII +net_rmii_mode() +{ + echo "------net_rmii_mode------" + himm 0x200f002c 0x00000001; # 1: EPHY_RST & 0: GPIO2_7 & 2: BOOT_SEL & 3VO_HS & 4: SDIO1_CARD_POWER_EN + himm 0x200f0034 0x00000001; # 1: EPHY_CLK & 0: GPIO3_0 & 3VO_DATA1 & 4: SDIO1_CDATA2 + # + himm 0x200f0010 0x00000001; # 1: RMII_CLK & 0: GPIO2_0 & 3VO_CLK + himm 0x200f0014 0x00000001; # 1: RMII_TX_EN & 0: GPIO2_1 & 3VO_VS & 4: SDIO1_CARD_DETECT + himm 0x200f0018 0x00000001; # 1: RMII_TXD0 & 0: GPIO2_2 & 3VO_DATA5 & 4: SDIO1_CWPR + himm 0x200f001c 0x00000001; # 1: RMII_TXD1 & 0: GPIO2_3 & 3VO_DE & 4: SDIO1_CDATA1 + himm 0x200f0020 0x00000001; # 1: RMII_RX_DV & 0: GPIO2_4 & 3VO_DATA7 & 4: SDIO1_CDATA + himm 0x200f0024 0x00000001; # 1: RMII_RXD0 & 0: GPIO2_5 & 3VO_DATA2 & 4: SDIO1_CDATA3 + himm 0x200f0028 0x00000001; # 1: RMII_RXD1 & 0: GPIO2_6 & 3VO_DATA3 & 4: SDIO1_CCMD + # + himm 0x200f0038 0x00000001; # 1: MDCK & 0: GPIO3_1 & 2BOOTROM_SEL & 3: VO_DATA6 + himm 0x200f003c 0x00000001; # 1: MDIO & 0: GPIO3_2 & 3VO_DATA4 + + #ephy drive capability config + himm 0x200f0810 0xd0; # RMII_CLK + himm 0x200f0814 0xa0; # RMII_TX_EN + himm 0x200f0818 0xa0; # RMII_TXD0 + himm 0x200f081c 0xa0; # RMII_TXD1 + himm 0x200f0820 0xb0; # RMII_RX_DV + himm 0x200f0824 0xb0; # RMII_RXD0 + himm 0x200f0828 0xb0; # RMII_RXD1 + himm 0x200f082c 0xb0; # EPHY_RST + himm 0x200f0834 0xd0; # EPHY_CLK + himm 0x200f0838 0x90; # MDCK + himm 0x200f083c 0xa0; # MDIO +} + + + +######################parse arg################################### +b_arg_vo=0 +b_arg_net=0 + +for arg in $@ +do + if [ $b_arg_vo -eq 1 ] ; then + vo_type=$arg; + fi + case $arg in + "-vo") + b_arg_vo=1; + ;; + "-net") + b_arg_net=1; + ;; + esac +done +#######################parse arg end######################## + +#######################Action############################### +if [ $b_arg_vo -eq 1 ]; then + case $vo_type in + "BT656") + echo "===========VO TYPE BT656============"; + i2c1_pin_mux; #i2c1 -> 7179 + vo_output_mode; #vo output pin mux + himm 0x20030034 0xff4; #vo BT656 CRG + insmod extdrv/adv_7179.ko; + ;; + "LCD") + echo "============VO TYPE LCD============="; + spi1_pim_mux; #spi1 -> LCD + vo_output_mode; #vo output pin mux + himm 0x200f0014 0x00000003 # 3VO_VS & 0: GPIO2_1 & 1: RMII_TX_EN & 4: SDIO1_CARD_DETECT + himm 0x200f002c 0x00000003 # 3VO_HS & 0: GPIO2_7 & 1: EPHY_RST & 2: BOOT_SEL & 4: SDIO1_CARD_POWER_EN + himm 0x200f001c 0x00000003 # 3VO_DE & 0: GPIO2_3 & 1: RMII_TXD1 & 4: SDIO1_CDATA1 + himm 0x20030034 0x64ff4; # vo LCD CRG + insmod extdrv/ssp_ili9342h_6bit.ko; + ;; + esac +fi + +if [ $b_arg_net -eq 1 ]; then + echo "==============NET MODE================"; + net_rmii_mode; +fi + + +i2s_pin_mux() +{ + # pin_mux with GPIO1 + #himm 0x200f007c 0x3; # i2s_bclk_tx + #himm 0x200f0080 0x3; # i2s_sd_tx + #himm 0x200f0084 0x3; # i2s_mclk + #himm 0x200f0088 0x3; # i2s_ws_tx + #himm 0x200f008c 0x3; # i2s_ws_rx + #himm 0x200f0090 0x3; # i2s_bclk_rx + #himm 0x200f0094 0x3; # i2s_sd_rx + + # pin_mux with UART1 + himm 0x200f00bc 0x2; # i2s_sd_tx + himm 0x200f00c0 0x2; # i2s_ws_tx + himm 0x200f00c4 0x2; # i2s_mclk + himm 0x200f00c8 0x2; # i2s_sd_rx + himm 0x200f00d0 0x2; # i2s_bclk_tx + + # pin_mux with JTAG + #himm 0x200f00d4 0x3; # i2s_mclk + #himm 0x200f00d8 0x3; # i2s_ws_tx + #himm 0x200f00dc 0x3; # i2s_sd_tx + #himm 0x200f00e0 0x3; # i2s_sd_rx + #himm 0x200f00e4 0x3; # i2s_bclk_tx +} + + +#i2c0_pin_mux; +#i2c2_pin_mux +vicap_pin_mux; +#i2s_pin_mux; +#vo_bt656_mode; diff --git a/device/mpp/ko/sysctl_hi3518e.sh b/device/mpp/ko/sysctl_hi3518e.sh new file mode 100644 index 0000000..2bce7ce --- /dev/null +++ b/device/mpp/ko/sysctl_hi3518e.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +# This is a sample, you should rewrite it according to your chip # + +# mddrc pri&timeout setting + +######################################################################################### +# param $1=1 --- online +# param $1=0 --- offline + +vi_vpss_online_config() +{ + # -------------vi vpss online open + if [ $b_vpss_online -eq 1 ]; then + echo "==============vi_vpss_online=============="; + himm 0x20120004 0x40001000; # online, SPI1 CS0; [12]-ive + #pri config + himm 0x20120058 0x26666401 # each module 4bitvedu ddrt_md ive aio jpge tde vicap vdp + himm 0x2012005c 0x66666103 # each module 4bitsfc_nand sfc_nor nfc sdio1 sdio0 a7 vpss vgs + himm 0x20120060 0x66266666 # each module 4bitreserve reserve avc usb cipher dma2 dma1 gsf + #timeout config + himm 0x20120064 0x00000011 # each module 4bitvedu ddrt_md ive aio jpge tde vicap vdp + himm 0x20120068 0x00000010 # each module 4bitsfc_nand sfc_nor nfc sdio1 sdio0 a7 vpss vgs + himm 0x2012006c 0x00000000 # each module 4bitreserve reserve avc usb cipher dma2 dma1 gsf + else + echo "==============vi_vpss_offline=============="; + himm 0x20120004 0x1000; # offline, mipi SPI1 CS0; [12]-ive + # pri config + himm 0x20120058 0x26666400 # each module 4bitvedu ddrt_md ive aio jpge tde vicap vdp + himm 0x2012005c 0x66666123 # each module 4bitsfc_nand sfc_nor nfc sdio1 sdio0 a7 vpss vgs + himm 0x20120060 0x66266666 # each module 4bitreserve reserve avc usb cipher dma2 dma1 gsf + # timeout config + himm 0x20120064 0x00000011 # each module 4bitvedu ddrt_md ive aio jpge tde vicap vdp + himm 0x20120068 0x00000000 # each module 4bitsfc_nand sfc_nor nfc sdio1 sdio0 a7 vpss vgs + himm 0x2012006c 0x00000000 # each module 4bitreserve reserve avc usb cipher dma2 dma1 gsf + fi +} +######################################################################################### +# mddrc pri&timeout setting +mddrc_pri_tmout_setting() +{ + #дȼ + himm 0x201100c0 0x76543210 # ports0 + himm 0x201100c4 0x76543210 # ports1 + himm 0x201100c8 0x76543210 # ports2 + himm 0x201100cc 0x76543210 # ports3 + himm 0x201100d0 0x76543210 # ports4 + himm 0x201100d4 0x76543210 # ports5 + himm 0x201100d8 0x76543210 # ports6 + + #ȼ + himm 0x20110100 0x76543210 # ports0 + himm 0x20110104 0x76543210 # ports1 + himm 0x20110108 0x76543210 # ports2 + himm 0x2011010c 0x76543210 # ports3 + himm 0x20110110 0x76543210 # ports4 + himm 0x20110114 0x76543210 # ports5 + himm 0x20110118 0x76543210 # ports6 + + #дtimeout + himm 0x20110140 0x08040200 # ports0 + himm 0x20110144 0x08040100 # ports1 + himm 0x20110148 0x08040200 # ports2 + himm 0x2011014c 0x08040200 # ports3 + himm 0x20110150 0x08040200 # ports4 + himm 0x20110154 0x08040200 # ports5 + himm 0x20110158 0x08040200 # ports6 + + #timeout + himm 0x20110180 0x08040200 # ports0 + himm 0x20110184 0x08040200 # ports1 + himm 0x20110188 0x08040200 # ports2 + himm 0x2011018c 0x08040200 # ports3 + himm 0x20110190 0x08040200 # ports4 + himm 0x20110194 0x08040200 # ports5 + himm 0x20110198 0x08040200 # ports6 + + #map mode + himm 0x20110040 0x01001000 # ports0 + himm 0x20110044 0x01001000 # ports1 + himm 0x20110048 0x01001000 # ports2 + himm 0x2011004c 0x01001000 # ports3 + himm 0x20110050 0x01001000 # ports4 + himm 0x20110054 0x01001000 # ports5 + himm 0x20110058 0x01001000 # ports6 +} + + + +himm 0x201200E0 0xd # internal codecAIO MCLK out, CODEC AIO TX MCLK +#himm 0x201200E0 0xe # external codec: AIC31AIO MCLK out, CODEC AIO TX MCLK + + +echo "++++++++++++++++++++++++++++++++++++++++++++++" +b_vpss_online=1 + +if [ $# -ge 1 ]; then + b_vpss_online=$1 +fi + +vi_vpss_online_config; +mddrc_pri_tmout_setting; + +# outstanding +cfg_outstanding() +{ + himm 0x20580010 0x00003030 # VICAP outstanding[r12:15, w4:7] + himm 0x205c0034 0x00000003 # VDP outstanding + himm 0x20600314 0x00000033 # VPSS outstanding[r0:3, w4:7] + #himm 0x20610844 0x00444010 # TDE w:[24:21];r:[20:17];r[16:13] + himm 0x206200A4 0x3 # AVC + himm 0x206600A4 0x3 # JPEG +} + +# ive utili +himm 0x206A0000 0x2 # Open utili statistic +himm 0x206A0080 0x11E1A300 # Utili peri,default 0x11E1A300 cycle + diff --git a/device/mpp/lib/libVoiceEngine.a b/device/mpp/lib/libVoiceEngine.a new file mode 100644 index 0000000..4db9c5e Binary files /dev/null and b/device/mpp/lib/libVoiceEngine.a differ diff --git a/device/mpp/lib/libVoiceEngine.so b/device/mpp/lib/libVoiceEngine.so new file mode 100644 index 0000000..648bcff Binary files /dev/null and b/device/mpp/lib/libVoiceEngine.so differ diff --git a/device/mpp/lib/lib_cmoscfg.a b/device/mpp/lib/lib_cmoscfg.a new file mode 100644 index 0000000..87ba317 Binary files /dev/null and b/device/mpp/lib/lib_cmoscfg.a differ diff --git a/device/mpp/lib/lib_cmoscfg.so b/device/mpp/lib/lib_cmoscfg.so new file mode 100644 index 0000000..7b23236 Binary files /dev/null and b/device/mpp/lib/lib_cmoscfg.so differ diff --git a/device/mpp/lib/lib_hiae.a b/device/mpp/lib/lib_hiae.a new file mode 100644 index 0000000..8c167a9 Binary files /dev/null and b/device/mpp/lib/lib_hiae.a differ diff --git a/device/mpp/lib/lib_hiae.so b/device/mpp/lib/lib_hiae.so new file mode 100644 index 0000000..7f5fb51 Binary files /dev/null and b/device/mpp/lib/lib_hiae.so differ diff --git a/device/mpp/lib/lib_hiaf.a b/device/mpp/lib/lib_hiaf.a new file mode 100644 index 0000000..26b8f13 Binary files /dev/null and b/device/mpp/lib/lib_hiaf.a differ diff --git a/device/mpp/lib/lib_hiaf.so b/device/mpp/lib/lib_hiaf.so new file mode 100644 index 0000000..97d0596 Binary files /dev/null and b/device/mpp/lib/lib_hiaf.so differ diff --git a/device/mpp/lib/lib_hiawb.a b/device/mpp/lib/lib_hiawb.a new file mode 100644 index 0000000..16eebc7 Binary files /dev/null and b/device/mpp/lib/lib_hiawb.a differ diff --git a/device/mpp/lib/lib_hiawb.so b/device/mpp/lib/lib_hiawb.so new file mode 100644 index 0000000..07aebb3 Binary files /dev/null and b/device/mpp/lib/lib_hiawb.so differ diff --git a/device/mpp/lib/lib_hidefog.a b/device/mpp/lib/lib_hidefog.a new file mode 100644 index 0000000..500ae97 Binary files /dev/null and b/device/mpp/lib/lib_hidefog.a differ diff --git a/device/mpp/lib/lib_hidefog.so b/device/mpp/lib/lib_hidefog.so new file mode 100644 index 0000000..5bcf567 Binary files /dev/null and b/device/mpp/lib/lib_hidefog.so differ diff --git a/device/mpp/lib/lib_iniparser.a b/device/mpp/lib/lib_iniparser.a new file mode 100644 index 0000000..4a35cf6 Binary files /dev/null and b/device/mpp/lib/lib_iniparser.a differ diff --git a/device/mpp/lib/lib_iniparser.so b/device/mpp/lib/lib_iniparser.so new file mode 100644 index 0000000..458be32 Binary files /dev/null and b/device/mpp/lib/lib_iniparser.so differ diff --git a/device/mpp/lib/libdnvqe.a b/device/mpp/lib/libdnvqe.a new file mode 100644 index 0000000..4afd8b7 Binary files /dev/null and b/device/mpp/lib/libdnvqe.a differ diff --git a/device/mpp/lib/libdnvqe.so b/device/mpp/lib/libdnvqe.so new file mode 100644 index 0000000..bb2f773 Binary files /dev/null and b/device/mpp/lib/libdnvqe.so differ diff --git a/device/mpp/lib/libhive_AEC.so b/device/mpp/lib/libhive_AEC.so new file mode 100644 index 0000000..1030cc1 Binary files /dev/null and b/device/mpp/lib/libhive_AEC.so differ diff --git a/device/mpp/lib/libhive_AGC.so b/device/mpp/lib/libhive_AGC.so new file mode 100644 index 0000000..87cfef6 Binary files /dev/null and b/device/mpp/lib/libhive_AGC.so differ diff --git a/device/mpp/lib/libhive_ANR.so b/device/mpp/lib/libhive_ANR.so new file mode 100644 index 0000000..d975306 Binary files /dev/null and b/device/mpp/lib/libhive_ANR.so differ diff --git a/device/mpp/lib/libhive_EQ.so b/device/mpp/lib/libhive_EQ.so new file mode 100644 index 0000000..e1a1a9a Binary files /dev/null and b/device/mpp/lib/libhive_EQ.so differ diff --git a/device/mpp/lib/libhive_GAIN.so b/device/mpp/lib/libhive_GAIN.so new file mode 100644 index 0000000..d878023 Binary files /dev/null and b/device/mpp/lib/libhive_GAIN.so differ diff --git a/device/mpp/lib/libhive_HPF.so b/device/mpp/lib/libhive_HPF.so new file mode 100644 index 0000000..34b1231 Binary files /dev/null and b/device/mpp/lib/libhive_HPF.so differ diff --git a/device/mpp/lib/libhive_MBC.so b/device/mpp/lib/libhive_MBC.so new file mode 100644 index 0000000..6922c48 Binary files /dev/null and b/device/mpp/lib/libhive_MBC.so differ diff --git a/device/mpp/lib/libhive_RES.so b/device/mpp/lib/libhive_RES.so new file mode 100644 index 0000000..7601895 Binary files /dev/null and b/device/mpp/lib/libhive_RES.so differ diff --git a/device/mpp/lib/libhive_RNR.so b/device/mpp/lib/libhive_RNR.so new file mode 100644 index 0000000..1a1ca2e Binary files /dev/null and b/device/mpp/lib/libhive_RNR.so differ diff --git a/device/mpp/lib/libhive_common.so b/device/mpp/lib/libhive_common.so new file mode 100644 index 0000000..02aa239 Binary files /dev/null and b/device/mpp/lib/libhive_common.so differ diff --git a/device/mpp/lib/libisp.a b/device/mpp/lib/libisp.a new file mode 100644 index 0000000..d21adb1 Binary files /dev/null and b/device/mpp/lib/libisp.a differ diff --git a/device/mpp/lib/libisp.so b/device/mpp/lib/libisp.so new file mode 100644 index 0000000..cfdbc6e Binary files /dev/null and b/device/mpp/lib/libisp.so differ diff --git a/device/mpp/lib/libive.a b/device/mpp/lib/libive.a new file mode 100644 index 0000000..6a0c310 Binary files /dev/null and b/device/mpp/lib/libive.a differ diff --git a/device/mpp/lib/libive.so b/device/mpp/lib/libive.so new file mode 100644 index 0000000..6a4e111 Binary files /dev/null and b/device/mpp/lib/libive.so differ diff --git a/device/mpp/lib/libmd.a b/device/mpp/lib/libmd.a new file mode 100644 index 0000000..051fdde Binary files /dev/null and b/device/mpp/lib/libmd.a differ diff --git a/device/mpp/lib/libmd.so b/device/mpp/lib/libmd.so new file mode 100644 index 0000000..42e7564 Binary files /dev/null and b/device/mpp/lib/libmd.so differ diff --git a/device/mpp/lib/libmpi.a b/device/mpp/lib/libmpi.a new file mode 100644 index 0000000..30103cf Binary files /dev/null and b/device/mpp/lib/libmpi.a differ diff --git a/device/mpp/lib/libmpi.so b/device/mpp/lib/libmpi.so new file mode 100644 index 0000000..e039567 Binary files /dev/null and b/device/mpp/lib/libmpi.so differ diff --git a/device/mpp/lib/libslice_trans.so b/device/mpp/lib/libslice_trans.so new file mode 100644 index 0000000..fce6273 Binary files /dev/null and b/device/mpp/lib/libslice_trans.so differ diff --git a/device/mpp/lib/libsns_9m034.a b/device/mpp/lib/libsns_9m034.a new file mode 100644 index 0000000..d169bac Binary files /dev/null and b/device/mpp/lib/libsns_9m034.a differ diff --git a/device/mpp/lib/libsns_9m034.so b/device/mpp/lib/libsns_9m034.so new file mode 100644 index 0000000..b14de35 Binary files /dev/null and b/device/mpp/lib/libsns_9m034.so differ diff --git a/device/mpp/lib/libsns_ar0130.a b/device/mpp/lib/libsns_ar0130.a new file mode 100644 index 0000000..692d1ab Binary files /dev/null and b/device/mpp/lib/libsns_ar0130.a differ diff --git a/device/mpp/lib/libsns_ar0130.so b/device/mpp/lib/libsns_ar0130.so new file mode 100644 index 0000000..03e73b2 Binary files /dev/null and b/device/mpp/lib/libsns_ar0130.so differ diff --git a/device/mpp/lib/libsns_ar0230.a b/device/mpp/lib/libsns_ar0230.a new file mode 100644 index 0000000..0cfaac9 Binary files /dev/null and b/device/mpp/lib/libsns_ar0230.a differ diff --git a/device/mpp/lib/libsns_ar0230.so b/device/mpp/lib/libsns_ar0230.so new file mode 100644 index 0000000..e28240b Binary files /dev/null and b/device/mpp/lib/libsns_ar0230.so differ diff --git a/device/mpp/lib/libsns_imx122.a b/device/mpp/lib/libsns_imx122.a new file mode 100644 index 0000000..e2f7137 Binary files /dev/null and b/device/mpp/lib/libsns_imx122.a differ diff --git a/device/mpp/lib/libsns_imx122.so b/device/mpp/lib/libsns_imx122.so new file mode 100644 index 0000000..69f6391 Binary files /dev/null and b/device/mpp/lib/libsns_imx122.so differ diff --git a/device/mpp/lib/libsns_mn34222.a b/device/mpp/lib/libsns_mn34222.a new file mode 100644 index 0000000..65c032b Binary files /dev/null and b/device/mpp/lib/libsns_mn34222.a differ diff --git a/device/mpp/lib/libsns_mn34222.so b/device/mpp/lib/libsns_mn34222.so new file mode 100644 index 0000000..fe6280b Binary files /dev/null and b/device/mpp/lib/libsns_mn34222.so differ diff --git a/device/mpp/lib/libsns_ov9712.a b/device/mpp/lib/libsns_ov9712.a new file mode 100644 index 0000000..e84e481 Binary files /dev/null and b/device/mpp/lib/libsns_ov9712.a differ diff --git a/device/mpp/lib/libsns_ov9712.so b/device/mpp/lib/libsns_ov9712.so new file mode 100644 index 0000000..7f33cc6 Binary files /dev/null and b/device/mpp/lib/libsns_ov9712.so differ diff --git a/device/mpp/lib/libsns_ov9752.a b/device/mpp/lib/libsns_ov9752.a new file mode 100644 index 0000000..faa97d0 Binary files /dev/null and b/device/mpp/lib/libsns_ov9752.a differ diff --git a/device/mpp/lib/libsns_ov9752.so b/device/mpp/lib/libsns_ov9752.so new file mode 100644 index 0000000..8d85b7b Binary files /dev/null and b/device/mpp/lib/libsns_ov9752.so differ diff --git a/device/mpp/lib/libtde.a b/device/mpp/lib/libtde.a new file mode 100644 index 0000000..e71b52c Binary files /dev/null and b/device/mpp/lib/libtde.a differ diff --git a/device/mpp/lib/libtde.so b/device/mpp/lib/libtde.so new file mode 100644 index 0000000..399c559 Binary files /dev/null and b/device/mpp/lib/libtde.so differ diff --git a/device/mpp/lib/libupvqe.a b/device/mpp/lib/libupvqe.a new file mode 100644 index 0000000..39ca0e3 Binary files /dev/null and b/device/mpp/lib/libupvqe.a differ diff --git a/device/mpp/lib/libupvqe.so b/device/mpp/lib/libupvqe.so new file mode 100644 index 0000000..3accca9 Binary files /dev/null and b/device/mpp/lib/libupvqe.so differ diff --git a/device/mpp/sample/Makefile b/device/mpp/sample/Makefile new file mode 100644 index 0000000..fe92e96 --- /dev/null +++ b/device/mpp/sample/Makefile @@ -0,0 +1,28 @@ +rel: + @cd hifb; make + @cd vio; make + @cd venc; make + @cd region; make + @cd audio; make + @cd tde; make + @cd ive; make + @cd scene_auto; make + +clean: + @cd hifb; make clean + @cd vio; make clean + @cd venc; make clean + @cd region; make clean + @cd audio; make clean + @cd tde; make clean + @cd ive; make clean + @cd scene_auto; make clean + +cleanall: + @cd hifb; make clean; make cleanstream + @cd vio; make clean; make cleanstream + @cd venc; make clean; make cleanstream + @cd region; make clean; make cleanstream + @cd audio; make clean; make cleanstream + @cd tde; make clean + @cd ive; make clean diff --git a/device/mpp/sample/Makefile.param b/device/mpp/sample/Makefile.param new file mode 100644 index 0000000..2a70992 --- /dev/null +++ b/device/mpp/sample/Makefile.param @@ -0,0 +1,148 @@ +# Hisilicon Hi3518 sample Makefile.param + +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../../Makefile.param + include $(PARAM_FILE) +endif + +ifeq ($(WDR),) +WDR :=n +endif + + +################# select sensor type for your sample #################### + +#SENSOR_TYPE ?= APTINA_9M034_DC_720P_30FPS + +#SENSOR_TYPE ?= SONY_IMX122_DC_1080P_30FPS +#SENSOR_TYPE ?= SONY_IMX122_DC_720P_30FPS + +SENSOR_TYPE ?= APTINA_AR0130_DC_720P_30FPS + +#SENSOR_TYPE ?= APTINA_AR0230_HISPI_1080P_30FPS + +########################################################################## + +SENSOR_LIBS := $(REL_LIB)/libisp.a + +ifeq ($(SENSOR_TYPE), APTINA_AR0130_DC_720P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_ar0130.a +endif + +ifeq ($(SENSOR_TYPE), APTINA_AR0130_DC_960P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_ar0130.a +endif + +ifeq ($(SENSOR_TYPE), APTINA_9M034_DC_720P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_9m034.a +endif + +ifeq ($(SENSOR_TYPE), APTINA_9M034_DC_960P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_9m034.a +endif + +ifeq ($(SENSOR_TYPE), SONY_IMX122_DC_1080P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_imx122.a +endif + +ifeq ($(SENSOR_TYPE), SONY_IMX122_DC_720P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_imx122.a +endif + +ifeq ($(SENSOR_TYPE), APTINA_MT9P006_DC_1080P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_mt9p006.a +endif + +ifeq ($(SENSOR_TYPE), PANASONIC_MN34220_SUBLVDS_1080P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_mn34220.a +endif + +ifeq ($(SENSOR_TYPE), OMNIVISION_OV4682_MIPI_1080P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_ov4682.a +endif + +ifeq ($(SENSOR_TYPE), OMNIVISION_OV4682_MIPI_720P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_ov4682.a +endif + +ifeq ($(SENSOR_TYPE), APTINA_AR0230_HISPI_1080P_30FPS) + SENSOR_LIBS += $(REL_LIB)/libsns_ar0230.a +endif + +#iniparser +SENSOR_LIBS += $(REL_LIB)/lib_cmoscfg.a +SENSOR_LIBS += $(REL_LIB)/lib_iniparser.a +######################################################################### + +COMMON_DIR:=$(PWD)/../common + +INC_FLAGS := -I$(COMMON_DIR) +INC_FLAGS += -I$(REL_INC) +INC_FLAGS += -I$(SDK_PATH)/mpp/component/acodec + +ifeq ($(MPP_BUILD), y) + INC_FLAGS += -I$(SDK_PATH)/mpp/$(EXTDRV)/tw2865 + INC_FLAGS += -I$(SDK_PATH)/mpp/$(EXTDRV)/tlv320aic31 +else + INC_FLAGS += -I$(SDK_PATH)/mpp/extdrv/tw2865 + INC_FLAGS += -I$(SDK_PATH)/mpp/$(EXTDRV)/tlv320aic31 +endif + +ISP_VERSION := ISP_V2 +SENSOR_LIBS += $(REL_LIB)/lib_hiae.a +SENSOR_LIBS += $(REL_LIB)/lib_hiawb.a +SENSOR_LIBS += $(REL_LIB)/lib_hiaf.a + +SENSOR_LIBS += $(REL_LIB)/lib_hidefog.a + +MPI_LIBS := $(REL_LIB)/libmpi.a +MPI_LIBS += $(REL_LIB)/libive.a +MPI_LIBS += $(REL_LIB)/libmd.a + +CFLAGS := -Wall -g $(INC_FLAGS) -D$(HIARCH) -DHICHIP=$(HICHIP) -DSENSOR_TYPE=$(SENSOR_TYPE) -D$(HIDBG) -D$(HI_FPGA) -lpthread -lm -ldl -D$(ISP_VERSION) + +ifeq ($(SENSOR_TYPE), PANASONIC_MN34220_SUBLVDS_1080P_30FPS) + CFLAGS += -DHI_MIPI_ENABLE +endif + +ifeq ($(SENSOR_TYPE), PANASONIC_MN34220_MIPI_1080P_30FPS) + CFLAGS += -DHI_MIPI_ENABLE +endif + +ifeq ($(SENSOR_TYPE), OMNIVISION_OV4682_MIPI_1080P_30FPS) + CFLAGS += -DHI_MIPI_ENABLE +endif + +ifeq ($(SENSOR_TYPE), OMNIVISION_OV4682_MIPI_720P_30FPS) + CFLAGS += -DHI_MIPI_ENABLE +endif + +################ select audio codec type for your sample ################ +ACODEC_TYPE ?= ACODEC_TYPE_INNER +#external acodec +#ACODEC_TYPE ?= ACODEC_TYPE_AK7756 +#ACODEC_TYPE ?= ACODEC_TYPE_TLV320AIC31 + +ifeq ($(ACODEC_TYPE), ACODEC_TYPE_INNER) + CFLAGS += -DHI_ACODEC_TYPE_INNER +endif + +ifeq ($(ACODEC_TYPE), ACODEC_TYPE_AK7756) + CFLAGS += -DHI_ACODEC_TYPE_AK7756 +endif + +ifeq ($(ACODEC_TYPE), ACODEC_TYPE_TLV320AIC31) + CFLAGS += -DHI_ACODEC_TYPE_TLV320AIC31 +endif +######################################################################### + +CFLAGS += $(LIBS_CFLAGS) +CFLAGS += -DLCD_ILI9342 + +COMM_SRC := $(wildcard $(COMMON_DIR)/*.c) + +#DEL_SRC := $(COMMON_DIR)/sample_comm_audio.c +#COMM_SRC := $(filter-out $(DEL_SRC), $(COMM_SRC)) + +COMM_OBJ := $(COMM_SRC:%.c=%.o) + diff --git a/device/mpp/sample/audio/Makefile b/device/mpp/sample/audio/Makefile new file mode 100644 index 0000000..da4536b --- /dev/null +++ b/device/mpp/sample/audio/Makefile @@ -0,0 +1,36 @@ +# Hisilicon Hi3516 sample Makefile + +include ../Makefile.param +#ifeq ($(SAMPLE_PARAM_FILE), ) +# SAMPLE_PARAM_FILE:=../Makefile.param +# include $(SAMPLE_PARAM_FILE) +#endif + +# target source +SRC := $(wildcard *.c) +OBJ := $(SRC:%.c=%.o) + +TARGET := $(OBJ:%.o=%) +.PHONY : clean all + +all: $(TARGET) + + +MPI_LIBS += $(REL_LIB)/libmpi.a +MPI_LIBS += $(REL_LIB)/libive.a + + +$(TARGET):%:%.o $(COMM_OBJ) + $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(SENSOR_LIBS) + +clean: + @rm -f $(TARGET) + @rm -f $(OBJ) + @rm -f $(COMM_OBJ) + +cleanstream: + @rm -f *.raw + @rm -f *.adpcm + @rm -f *.g726 + @rm -f *.g711a + @rm -f *.g711u diff --git a/device/mpp/sample/audio/inner_codec_readme.txt b/device/mpp/sample/audio/inner_codec_readme.txt new file mode 100644 index 0000000..5fc73a6 --- /dev/null +++ b/device/mpp/sample/audio/inner_codec_readme.txt @@ -0,0 +1,12 @@ +To disable the mute circuit about inner_codec, please configure the pin of GPIO as follows: + +1.demo board +himm 0x200f0078 0x0 +himm 0x201A0400 0xF +himm 0x201A03FC 0xF + + +2.socket board +himm 0x200f0078 0x0 +himm 0x20140400 0xF +himm 0x201403FC 0xF \ No newline at end of file diff --git a/device/mpp/sample/audio/sample_audio b/device/mpp/sample/audio/sample_audio new file mode 100644 index 0000000..234b3dc Binary files /dev/null and b/device/mpp/sample/audio/sample_audio differ diff --git a/device/mpp/sample/audio/sample_audio.c b/device/mpp/sample/audio/sample_audio.c new file mode 100644 index 0000000..7aa1767 --- /dev/null +++ b/device/mpp/sample/audio/sample_audio.c @@ -0,0 +1,864 @@ +/****************************************************************************** + A simple program of Hisilicon mpp audio input/output/encoder/decoder implementation. + Copyright (C), 2010-2021, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2013-7 Created +******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" +#include "acodec.h" +#include "tlv320aic31.h" + + +static PAYLOAD_TYPE_E gs_enPayloadType = PT_ADPCMA; + +//static HI_BOOL gs_bMicIn = HI_FALSE; + +static HI_BOOL gs_bAioReSample = HI_FALSE; +static HI_BOOL gs_bUserGetMode = HI_FALSE; +static HI_BOOL gs_bAoVolumeCtrl = HI_TRUE; +static AUDIO_SAMPLE_RATE_E enInSampleRate = AUDIO_SAMPLE_RATE_BUTT; +static AUDIO_SAMPLE_RATE_E enOutSampleRate = AUDIO_SAMPLE_RATE_BUTT; +static HI_U32 u32AencPtNumPerFrm = 0; + +#define SAMPLE_DBG(s32Ret)\ +do{\ + printf("s32Ret=%#x,fuc:%s,line:%d\n", s32Ret, __FUNCTION__, __LINE__);\ +}while(0) + +/****************************************************************************** +* function : PT Number to String +******************************************************************************/ +static char* SAMPLE_AUDIO_Pt2Str(PAYLOAD_TYPE_E enType) +{ + if (PT_G711A == enType) + { + return "g711a"; + } + else if (PT_G711U == enType) + { + return "g711u"; + } + else if (PT_ADPCMA == enType) + { + return "adpcm"; + } + else if (PT_G726 == enType) + { + return "g726"; + } + else if (PT_LPCM == enType) + { + return "pcm"; + } + else + { + return "data"; + } +} + +/****************************************************************************** +* function : Open Aenc File +******************************************************************************/ +static FILE * SAMPLE_AUDIO_OpenAencFile(AENC_CHN AeChn, PAYLOAD_TYPE_E enType) +{ + FILE* pfd; + HI_CHAR aszFileName[FILE_NAME_LEN]; + + /* create file for save stream*/ + snprintf(aszFileName, FILE_NAME_LEN, "audio_chn%d.%s", AeChn, SAMPLE_AUDIO_Pt2Str(enType)); + pfd = fopen(aszFileName, "w+"); + if (NULL == pfd) + { + printf("%s: open file %s failed\n", __FUNCTION__, aszFileName); + return NULL; + } + printf("open stream file:\"%s\" for aenc ok\n", aszFileName); + return pfd; +} + +/****************************************************************************** +* function : Open Adec File +******************************************************************************/ +static FILE *SAMPLE_AUDIO_OpenAdecFile(ADEC_CHN AdChn, PAYLOAD_TYPE_E enType) +{ + FILE* pfd; + HI_CHAR aszFileName[FILE_NAME_LEN]; + + /* create file for save stream*/ + snprintf(aszFileName, FILE_NAME_LEN ,"audio_chn%d.%s", AdChn, SAMPLE_AUDIO_Pt2Str(enType)); + pfd = fopen(aszFileName, "rb"); + if (NULL == pfd) + { + printf("%s: open file %s failed\n", __FUNCTION__, aszFileName); + return NULL; + } + printf("open stream file:\"%s\" for adec ok\n", aszFileName); + return pfd; +} + + +/****************************************************************************** +* function : file -> Adec -> Ao +******************************************************************************/ +HI_S32 SAMPLE_AUDIO_AdecAo(HI_VOID) +{ + HI_S32 s32Ret; + AUDIO_DEV AoDev = SAMPLE_AUDIO_AO_DEV; + AO_CHN AoChn = 0; + ADEC_CHN AdChn = 0; + HI_S32 s32AoChnCnt; + FILE* pfd = NULL; + AIO_ATTR_S stAioAttr; + +#ifdef HI_ACODEC_TYPE_TLV320AIC31 + stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000; + stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; + stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER; + stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; + stAioAttr.u32EXFlag = 0; + stAioAttr.u32FrmNum = 30; + stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; + stAioAttr.u32ChnCnt = 1; + stAioAttr.u32ClkSel = 1; +#else + stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000; + stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; + stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER; + stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; + stAioAttr.u32EXFlag = 0; + stAioAttr.u32FrmNum = 30; + stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; + stAioAttr.u32ChnCnt = 1; + stAioAttr.u32ClkSel = 0; +#endif + + gs_bAioReSample = HI_FALSE; + enInSampleRate = AUDIO_SAMPLE_RATE_BUTT; + enOutSampleRate = AUDIO_SAMPLE_RATE_BUTT; + + s32Ret = SAMPLE_COMM_AUDIO_CfgAcodec(&stAioAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + s32Ret = SAMPLE_COMM_AUDIO_StartAdec(AdChn, gs_enPayloadType); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + s32AoChnCnt = stAioAttr.u32ChnCnt; + s32Ret = SAMPLE_COMM_AUDIO_StartAo(AoDev, s32AoChnCnt, &stAioAttr, enInSampleRate, gs_bAioReSample); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + s32Ret = SAMPLE_COMM_AUDIO_AoBindAdec(AoDev, AoChn, AdChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + pfd = SAMPLE_AUDIO_OpenAdecFile(AdChn, gs_enPayloadType); + if (!pfd) + { + SAMPLE_DBG(HI_FAILURE); + return HI_FAILURE; + } + s32Ret = SAMPLE_COMM_AUDIO_CreatTrdFileAdec(AdChn, pfd); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + printf("bind adec:%d to ao(%d,%d) ok \n", AdChn, AoDev, AoChn); + + printf("\nplease press twice ENTER to exit this sample\n"); + getchar(); + getchar(); + + s32Ret = SAMPLE_COMM_AUDIO_DestoryTrdFileAdec(AdChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + s32Ret = SAMPLE_COMM_AUDIO_StopAo(AoDev, s32AoChnCnt, gs_bAioReSample); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + s32Ret = SAMPLE_COMM_AUDIO_StopAdec(AdChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + s32Ret = SAMPLE_COMM_AUDIO_AoUnbindAdec(AoDev, AoChn, AdChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Ai -> Aenc -> file +* -> Adec -> Ao +******************************************************************************/ +HI_S32 SAMPLE_AUDIO_AiAenc(HI_VOID) +{ + HI_S32 i, s32Ret; + AUDIO_DEV AiDev = SAMPLE_AUDIO_AI_DEV; + AI_CHN AiChn; + AUDIO_DEV AoDev = SAMPLE_AUDIO_AO_DEV; + AO_CHN AoChn = 0; + ADEC_CHN AdChn = 0; + HI_S32 s32AiChnCnt; + HI_S32 s32AoChnCnt; + HI_S32 s32AencChnCnt; + AENC_CHN AeChn; + HI_BOOL bSendAdec = HI_TRUE; + FILE *pfd = NULL; + AIO_ATTR_S stAioAttr; + +#ifdef HI_ACODEC_TYPE_TLV320AIC31 + stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000; + stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; + stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER; + stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; + stAioAttr.u32EXFlag = 0; + stAioAttr.u32FrmNum = 30; + stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; + stAioAttr.u32ChnCnt = 1; + stAioAttr.u32ClkSel = 1; +#else + stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000; + stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; + stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER; + stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; + stAioAttr.u32EXFlag = 0; + stAioAttr.u32FrmNum = 30; + stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; + stAioAttr.u32ChnCnt = 1; + stAioAttr.u32ClkSel = 0; +#endif + gs_bAioReSample = HI_FALSE; + enInSampleRate = AUDIO_SAMPLE_RATE_BUTT; + enOutSampleRate = AUDIO_SAMPLE_RATE_BUTT; + u32AencPtNumPerFrm = stAioAttr.u32PtNumPerFrm; + + /******************************************** + step 1: config audio codec + ********************************************/ + s32Ret = SAMPLE_COMM_AUDIO_CfgAcodec(&stAioAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + /******************************************** + step 2: start Ai + ********************************************/ + s32AiChnCnt = stAioAttr.u32ChnCnt; + s32Ret = SAMPLE_COMM_AUDIO_StartAi(AiDev, s32AiChnCnt, &stAioAttr, enOutSampleRate, gs_bAioReSample, NULL); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + /******************************************** + step 3: start Aenc + ********************************************/ + s32AencChnCnt = 1; + s32Ret = SAMPLE_COMM_AUDIO_StartAenc(s32AencChnCnt, u32AencPtNumPerFrm, gs_enPayloadType); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + /******************************************** + step 4: Aenc bind Ai Chn + ********************************************/ + for (i=0; i Ao(with fade in/out and volume adjust) +******************************************************************************/ +HI_S32 SAMPLE_AUDIO_AiAo(HI_VOID) +{ + HI_S32 s32Ret; + HI_S32 s32AiChnCnt; + HI_S32 s32AoChnCnt; + AUDIO_DEV AiDev = SAMPLE_AUDIO_AI_DEV; + AI_CHN AiChn = 0; + AUDIO_DEV AoDev = SAMPLE_AUDIO_AO_DEV; + AO_CHN AoChn = 0; + AIO_ATTR_S stAioAttr; + +#ifdef HI_ACODEC_TYPE_TLV320AIC31 + stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000; + stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; + stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER; + stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; + stAioAttr.u32EXFlag = 0; + stAioAttr.u32FrmNum = 30; + stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; + stAioAttr.u32ChnCnt = 1; + stAioAttr.u32ClkSel = 1; +#else // inner acodec + stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000; + stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; + stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER; + stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; + stAioAttr.u32EXFlag = 0; + stAioAttr.u32FrmNum = 30; + stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; + stAioAttr.u32ChnCnt = 1; + stAioAttr.u32ClkSel = 0; +#endif + /* config ao resample attr if needed */ + if (HI_TRUE == gs_bAioReSample) + { + stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_32000; + stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM * 4; + + /* ai 32k -> 8k */ + enOutSampleRate = AUDIO_SAMPLE_RATE_8000; + + /* ao 8k -> 32k */ + enInSampleRate = AUDIO_SAMPLE_RATE_8000; + } + else + { + enInSampleRate = AUDIO_SAMPLE_RATE_BUTT; + enOutSampleRate = AUDIO_SAMPLE_RATE_BUTT; + } + + /* resample and anr should be user get mode */ + gs_bUserGetMode = (HI_TRUE == gs_bAioReSample) ? HI_TRUE : HI_FALSE; + + /* config audio codec */ + s32Ret = SAMPLE_COMM_AUDIO_CfgAcodec(&stAioAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + /* enable AI channle */ + s32AiChnCnt = stAioAttr.u32ChnCnt; + s32Ret = SAMPLE_COMM_AUDIO_StartAi(AiDev, s32AiChnCnt, &stAioAttr, enOutSampleRate, gs_bAioReSample, NULL); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + /* enable AO channle */ + s32AoChnCnt = stAioAttr.u32ChnCnt; + s32Ret = SAMPLE_COMM_AUDIO_StartAo(AoDev, s32AoChnCnt, &stAioAttr, enInSampleRate, gs_bAioReSample); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + /* bind AI to AO channle */ + if (HI_TRUE == gs_bUserGetMode) + { + s32Ret = SAMPLE_COMM_AUDIO_CreatTrdAiAo(AiDev, AiChn, AoDev, AoChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + } + else + { + s32Ret = SAMPLE_COMM_AUDIO_AoBindAi(AiDev, AiChn, AoDev, AoChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + } + printf("ai(%d,%d) bind to ao(%d,%d) ok\n", AiDev, AiChn, AoDev, AoChn); + + if(HI_TRUE == gs_bAoVolumeCtrl) + { + s32Ret = SAMPLE_COMM_AUDIO_CreatTrdAoVolCtrl(AoDev); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + } + + printf("\nplease press twice ENTER to exit this sample\n"); + getchar(); + getchar(); + + if(HI_TRUE == gs_bAoVolumeCtrl) + { + s32Ret = SAMPLE_COMM_AUDIO_DestoryTrdAoVolCtrl(AoDev); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + } + + if (HI_TRUE == gs_bUserGetMode) + { + s32Ret = SAMPLE_COMM_AUDIO_DestoryTrdAi(AiDev, AiChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + } + else + { + s32Ret = SAMPLE_COMM_AUDIO_AoUnbindAi(AiDev, AiChn, AoDev, AoChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + } + + s32Ret = SAMPLE_COMM_AUDIO_StopAi(AiDev, s32AiChnCnt, gs_bAioReSample, HI_FALSE); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + s32Ret = SAMPLE_COMM_AUDIO_StopAo(AoDev, s32AoChnCnt, gs_bAioReSample); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + + +/****************************************************************************** +* function : Ai -> Ao +******************************************************************************/ +HI_S32 SAMPLE_AUDIO_AiVqeProcessAo(HI_VOID) +{ + HI_S32 i, s32Ret; + AUDIO_DEV AiDev = SAMPLE_AUDIO_AI_DEV; + AUDIO_DEV AoDev = SAMPLE_AUDIO_AO_DEV; + HI_S32 s32AiChnCnt; + HI_S32 s32AoChnCnt; + AIO_ATTR_S stAioAttr; + AI_VQE_CONFIG_S stAiVqeAttr; + +#ifdef HI_ACODEC_TYPE_TLV320AIC31 + stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000; + stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; + stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER; + stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; + stAioAttr.u32EXFlag = 0; + stAioAttr.u32FrmNum = 30; + stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; + stAioAttr.u32ChnCnt = 1; + stAioAttr.u32ClkSel = 1; +#else + stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000; + stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16; + stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER; + stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO; + stAioAttr.u32EXFlag = 0; + stAioAttr.u32FrmNum = 30; + stAioAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM; + stAioAttr.u32ChnCnt = 1; + stAioAttr.u32ClkSel = 0; +#endif + gs_bAioReSample = HI_FALSE; + enInSampleRate = AUDIO_SAMPLE_RATE_BUTT; + enOutSampleRate = AUDIO_SAMPLE_RATE_BUTT; + + stAiVqeAttr.s32WorkSampleRate = AUDIO_SAMPLE_RATE_8000; + stAiVqeAttr.s32FrameSample = SAMPLE_AUDIO_PTNUMPERFRM; + stAiVqeAttr.enWorkstate = VQE_WORKSTATE_COMMON; + stAiVqeAttr.bAecOpen = HI_TRUE; + stAiVqeAttr.stAecCfg.bUsrMode = HI_FALSE; + stAiVqeAttr.stAecCfg.s8CngMode = AUDIO_AEC_MODE_CLOSE; + stAiVqeAttr.bAgcOpen = HI_TRUE; + stAiVqeAttr.stAgcCfg.bUsrMode = HI_FALSE; + stAiVqeAttr.bAnrOpen = HI_TRUE; + stAiVqeAttr.stAnrCfg.bUsrMode = HI_FALSE; + stAiVqeAttr.bHpfOpen = HI_TRUE; + stAiVqeAttr.stHpfCfg.enHpfFreq = AUDIO_HPF_FREQ_150; + stAiVqeAttr.bRnrOpen = HI_FALSE; + stAiVqeAttr.bEqOpen = HI_FALSE; + + /******************************************** + step 1: config audio codec + ********************************************/ + s32Ret = SAMPLE_COMM_AUDIO_CfgAcodec(&stAioAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + /******************************************** + step 2: start Ai + ********************************************/ + s32AiChnCnt = stAioAttr.u32ChnCnt; + s32Ret = SAMPLE_COMM_AUDIO_StartAi(AiDev, s32AiChnCnt, &stAioAttr, enOutSampleRate, gs_bAioReSample, &stAiVqeAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + /******************************************** + step 3: start Ao + ********************************************/ + s32AoChnCnt = stAioAttr.u32ChnCnt; + s32Ret = SAMPLE_COMM_AUDIO_StartAo(AoDev, s32AoChnCnt, &stAioAttr, enInSampleRate, gs_bAioReSample); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_DBG(s32Ret); + return HI_FAILURE; + } + + /******************************************** + step 4: Ao bind Ai Chn + ********************************************/ + for (i=0; i +#include +#include +#include +#include "loadbmp.h" + +OSD_COMP_INFO s_OSDCompInfo[OSD_COLOR_FMT_BUTT] = {{0, 4, 4, 4}, /*RGB444*/ + {4, 4, 4, 4}, /*ARGB4444*/ + {0, 5, 5, 5}, /*RGB555*/ + {0, 5, 6, 5}, /*RGB565*/ + {1, 5, 5, 5}, /*ARGB1555*/ + {0, 0, 0, 0}, /*RESERVED*/ + {0, 8, 8, 8}, /*RGB888*/ + {8, 8, 8, 8} /*ARGB8888*/ + }; +inline HI_U16 OSD_MAKECOLOR_U16(HI_U8 r, HI_U8 g, HI_U8 b, OSD_COMP_INFO compinfo) +{ + HI_U8 r1, g1, b1; + HI_U16 pixel = 0; + HI_U32 tmp = 15; + + r1 = g1 = b1 = 0; + r1 = r >> (8 - compinfo.rlen); + g1 = g >> (8 - compinfo.glen); + b1 = b >> (8 - compinfo.blen); + while(compinfo.alen) + { + pixel |= (1 << tmp); + tmp --; + compinfo.alen--; + } + + pixel |= (r1 | (g1 << compinfo.blen) | (b1 << (compinfo.blen + compinfo.glen))); + return pixel; +} + +HI_S32 GetBmpInfo(const char *filename, OSD_BITMAPFILEHEADER *pBmpFileHeader +,OSD_BITMAPINFO *pBmpInfo) +{ + FILE *pFile; + + HI_U16 bfType; + + if(NULL == filename) + { + printf("OSD_LoadBMP: filename=NULL\n"); + return -1; + } + + if( (pFile = fopen((char *)filename, "rb")) == NULL) + { + printf("Open file faild:%s!\n", filename); + return -1; + } + + (void)fread(&bfType, 1, sizeof(bfType), pFile); + if(bfType != 0x4d42) + { + printf("not bitmap file\n"); + fclose(pFile); + return -1; + } + + (void)fread(pBmpFileHeader, 1, sizeof(OSD_BITMAPFILEHEADER), pFile); + (void)fread(pBmpInfo, 1, sizeof(OSD_BITMAPINFO), pFile); + fclose(pFile); + + return 0; +} + +int LoadBMP(const char *filename, OSD_LOGO_T *pVideoLogo) +{ + FILE *pFile; + HI_U16 i,j; + + HI_U32 w,h; + HI_U16 Bpp; + HI_U16 dstBpp; + + OSD_BITMAPFILEHEADER bmpFileHeader; + OSD_BITMAPINFO bmpInfo; + + HI_U8 *pOrigBMPBuf; + HI_U8 *pRGBBuf; + HI_U32 stride; + + if(NULL == filename) + { + printf("OSD_LoadBMP: filename=NULL\n"); + return -1; + } + + if(GetBmpInfo(filename,&bmpFileHeader,&bmpInfo)<0) + { + return -1; + } + + Bpp = bmpInfo.bmiHeader.biBitCount/8; + if(Bpp < 2) + { + /* only support 1555.8888 888 bitmap */ + printf("bitmap format not supported!\n"); + return -1; + } + + if(bmpInfo.bmiHeader.biCompression != 0) + { + printf("not support compressed bitmap file!\n"); + return -1; + } + + if(bmpInfo.bmiHeader.biHeight < 0) + { + printf("bmpInfo.bmiHeader.biHeight < 0\n"); + return -1; + } + + if( (pFile = fopen((char *)filename, "rb")) == NULL) + { + printf("Open file faild:%s!\n", filename); + return -1; + } + + pVideoLogo->width = (HI_U16)bmpInfo.bmiHeader.biWidth; + pVideoLogo->height = (HI_U16)((bmpInfo.bmiHeader.biHeight>0)?bmpInfo.bmiHeader.biHeight:(-bmpInfo.bmiHeader.biHeight)); + w = pVideoLogo->width; + h = pVideoLogo->height; + + stride = w*Bpp; +#if 1 + if(stride%4) + { + stride = (stride & 0xfffc) + 4; + } +#endif + /* RGB8888 or RGB1555 */ + pOrigBMPBuf = (HI_U8 *)malloc(h*stride); + if(NULL == pOrigBMPBuf) + { + printf("not enough memory to malloc!\n"); + fclose(pFile); + return -1; + } + + pRGBBuf = pVideoLogo->pRGBBuffer; + + fseek(pFile, bmpFileHeader.bfOffBits, 0); + if(fread(pOrigBMPBuf, 1, h*stride, pFile) != (h*stride) ) + { + printf("fread error!line:%d\n",__LINE__); + perror("fread:"); + } + + if(Bpp > 2) + { + dstBpp = 4; + } + else + { + dstBpp = 2; + } + + if(0 == pVideoLogo->stride) + { + pVideoLogo->stride = pVideoLogo->width * dstBpp; + } + + for(i=0; istride + j*dstBpp, pOrigBMPBuf + ((h-1)-i)*stride+j*Bpp, Bpp); + + if(dstBpp == 4) + { + //*(pRGBBuf + i*pVideoLogo->stride + j*dstbpp + 3) = random()&0xff; /*alpha*/ + *(pRGBBuf + i*pVideoLogo->stride + j*dstBpp + 3) = 0x80; /*alpha*/ + } + } + + } + + free(pOrigBMPBuf); + pOrigBMPBuf = NULL; + + fclose(pFile); + return 0; +} + +int LoadBMPEx(const char *filename, OSD_LOGO_T *pVideoLogo, OSD_COLOR_FMT_E enFmt) +{ + FILE *pFile; + HI_U16 i,j; + + HI_U32 w,h; + HI_U16 Bpp; + + OSD_BITMAPFILEHEADER bmpFileHeader; + OSD_BITMAPINFO bmpInfo; + + HI_U8 *pOrigBMPBuf; + HI_U8 *pRGBBuf; + HI_U32 stride; + HI_U8 r, g, b; + HI_U8 *pStart; + HI_U16 *pDst; + + if(NULL == filename) + { + printf("OSD_LoadBMP: filename=NULL\n"); + return -1; + } + + if(GetBmpInfo(filename,&bmpFileHeader,&bmpInfo)<0) + { + return -1; + } + + Bpp = bmpInfo.bmiHeader.biBitCount/8; + if(Bpp < 2) + { + /* only support 1555.8888 888 bitmap */ + printf("bitmap format not supported!\n"); + return -1; + } + + if(bmpInfo.bmiHeader.biCompression != 0) + { + printf("not support compressed bitmap file!\n"); + return -1; + } + + if(bmpInfo.bmiHeader.biHeight < 0) + { + printf("bmpInfo.bmiHeader.biHeight < 0\n"); + return -1; + } + + if( (pFile = fopen((char *)filename, "rb")) == NULL) + { + printf("Open file faild:%s!\n", filename); + return -1; + } + + pVideoLogo->width = (HI_U16)bmpInfo.bmiHeader.biWidth; + pVideoLogo->height = (HI_U16)((bmpInfo.bmiHeader.biHeight>0)?bmpInfo.bmiHeader.biHeight:(-bmpInfo.bmiHeader.biHeight)); + w = pVideoLogo->width; + h = pVideoLogo->height; + + stride = w*Bpp; +#if 1 + if(stride%4) + { + stride = (stride&0xfffc) + 4; + } +#endif + + /* RGB8888 or RGB1555 */ + pOrigBMPBuf = (HI_U8 *)malloc(h*stride); + if(NULL == pOrigBMPBuf) + { + printf("not enough memory to malloc!\n"); + fclose(pFile); + return -1; + } + + pRGBBuf = pVideoLogo->pRGBBuffer; + + fseek(pFile, bmpFileHeader.bfOffBits, 0); + if(fread(pOrigBMPBuf, 1, h*stride, pFile) != (h*stride) ) + { + printf("fread (%d*%d)error!line:%d\n",h,stride,__LINE__); + perror("fread:"); + } + + if(enFmt >= OSD_COLOR_FMT_RGB888) + { + pVideoLogo->stride = pVideoLogo->width * 4; + } + else + { + pVideoLogo->stride = pVideoLogo->width * 2; + } + + for(i=0; istride + j*2); + r = *(pStart); + g = *(pStart + 1); + b = *(pStart + 2); + *pDst = OSD_MAKECOLOR_U16(r, g, b, s_OSDCompInfo[enFmt]); + break; + + case OSD_COLOR_FMT_RGB888: + case OSD_COLOR_FMT_RGB8888: + memcpy(pRGBBuf + i*pVideoLogo->stride + j*4, pOrigBMPBuf + ((h-1)-i)*stride+j*Bpp, Bpp); + *(pRGBBuf + i*pVideoLogo->stride + j*4 + 3) = 0xff; /*alpha*/ + break; + + default: + printf("file(%s), line(%d), no such format!\n", __FILE__, __LINE__); + break; + } + } + else if((Bpp == 2)||(Bpp == 4))/*..............*/ + { + memcpy(pRGBBuf + i*pVideoLogo->stride + j*Bpp, pOrigBMPBuf + ((h-1)-i)*stride+j*Bpp, Bpp); + } + + } + + } + + free(pOrigBMPBuf); + pOrigBMPBuf = NULL; + + fclose(pFile); + return 0; +} + + +int LoadBMPCanvas(const char *filename, OSD_LOGO_T *pVideoLogo, OSD_COLOR_FMT_E enFmt) +{ + FILE *pFile; + HI_U16 i,j; + + HI_U32 w,h; + HI_U16 Bpp; + + OSD_BITMAPFILEHEADER bmpFileHeader; + OSD_BITMAPINFO bmpInfo; + + HI_U8 *pOrigBMPBuf; + HI_U8 *pRGBBuf; + HI_U32 stride; + HI_U8 r, g, b; + HI_U8 *pStart; + HI_U16 *pDst; + + if(NULL == filename) + { + printf("OSD_LoadBMP: filename=NULL\n"); + return -1; + } + + if(GetBmpInfo(filename,&bmpFileHeader,&bmpInfo)<0) + { + return -1; + } + + Bpp = bmpInfo.bmiHeader.biBitCount/8; + if(Bpp < 2) + { + /* only support 1555.8888 888 bitmap */ + printf("bitmap format not supported!\n"); + return -1; + } + + if(bmpInfo.bmiHeader.biCompression != 0) + { + printf("not support compressed bitmap file!\n"); + return -1; + } + + if(bmpInfo.bmiHeader.biHeight < 0) + { + printf("bmpInfo.bmiHeader.biHeight < 0\n"); + return -1; + } + + if( (pFile = fopen((char *)filename, "rb")) == NULL) + { + printf("Open file faild:%s!\n", filename); + return -1; + } + + w = (HI_U16)bmpInfo.bmiHeader.biWidth; + h = (HI_U16)((bmpInfo.bmiHeader.biHeight>0)?bmpInfo.bmiHeader.biHeight:(-bmpInfo.bmiHeader.biHeight)); + + stride = w*Bpp; + +#if 1 + if(stride%4) + { + stride = (stride&0xfffc) + 4; + } +#endif + + /* RGB8888 or RGB1555 */ + pOrigBMPBuf = (HI_U8 *)malloc(h*stride); + if(NULL == pOrigBMPBuf) + { + printf("not enough memory to malloc!\n"); + fclose(pFile); + return -1; + } + + pRGBBuf = pVideoLogo->pRGBBuffer; + + if(stride > pVideoLogo->stride) + { + printf("Bitmap's stride(%d) is bigger than canvas's stide(%d). Load bitmap error!\n", stride, pVideoLogo->stride); + return -1; + } + + if(h > pVideoLogo->height) + { + printf("Bitmap's height(%d) is bigger than canvas's height(%d). Load bitmap error!\n", h, pVideoLogo->height); + return -1; + } + + if(w > pVideoLogo->width) + { + printf("Bitmap's width(%d) is bigger than canvas's width(%d). Load bitmap error!\n", w, pVideoLogo->width); + return -1; + } + + fseek(pFile, bmpFileHeader.bfOffBits, 0); + if(fread(pOrigBMPBuf, 1, h*stride, pFile) != (h*stride) ) + { + printf("fread (%d*%d)error!line:%d\n",h,stride,__LINE__); + perror("fread:"); + } + + for(i=0; istride + j*2); + r = *(pStart); + g = *(pStart + 1); + b = *(pStart + 2); + //printf("Func: %s, line:%d, Bpp: %d, bmp stride: %d, Canvas stride: %d, h:%d, w:%d.\n", + // __FUNCTION__, __LINE__, Bpp, stride, pVideoLogo->stride, i, j); + *pDst = OSD_MAKECOLOR_U16(r, g, b, s_OSDCompInfo[enFmt]); + + break; + + case OSD_COLOR_FMT_RGB888: + case OSD_COLOR_FMT_RGB8888: + memcpy(pRGBBuf + i*pVideoLogo->stride + j*4, pOrigBMPBuf + ((h-1)-i)*stride+j*Bpp, Bpp); + *(pRGBBuf + i*pVideoLogo->stride + j*4 + 3) = 0xff; /*alpha*/ + break; + + default: + printf("file(%s), line(%d), no such format!\n", __FILE__, __LINE__); + break; + } + } + else if((Bpp == 2)||(Bpp == 4))/*..............*/ + { + memcpy(pRGBBuf + i*pVideoLogo->stride + j*Bpp, pOrigBMPBuf + ((h-1)-i)*stride+j*Bpp, Bpp); + } + + } + + } + + free(pOrigBMPBuf); + pOrigBMPBuf = NULL; + + fclose(pFile); + return 0; +} + +char * GetExtName(char * filename) +{ + char *pret = NULL; + HI_U32 fnLen; + + if(NULL == filename) + { + printf("filename can't be null!"); + return NULL; + } + + fnLen = strlen(filename); + while(fnLen) + { + pret = filename + fnLen; + if(*pret == '.') + { return (pret + 1); } + + fnLen--; + } + + return pret; +} + + +int LoadImage(const char *filename, OSD_LOGO_T *pVideoLogo) +{ + char * ext = GetExtName((char *)filename); + + if(strcmp(ext, "bmp") == 0) + { + if(0 != LoadBMP(filename, pVideoLogo)) + { + printf("OSD_LoadBMP error!\n"); + return -1; + } + } + else + { + printf("not supported image file!\n"); + return -1; + } + + return 0; +} + +int LoadImageEx(const char *filename, OSD_LOGO_T *pVideoLogo, OSD_COLOR_FMT_E enFmt) +{ + char * ext = GetExtName((char *)filename); + + if(strcmp(ext, "bmp") == 0) + { + if(0 != LoadBMPEx(filename, pVideoLogo, enFmt)) + { + printf("OSD_LoadBMP error!\n"); + return -1; + } + } + else + { + printf("not supported image file!\n"); + return -1; + } + + return 0; +} + + +int LoadCanvasEx(const char *filename, OSD_LOGO_T *pVideoLogo, OSD_COLOR_FMT_E enFmt) +{ + char * ext = GetExtName((char *)filename); + + if(strcmp(ext, "bmp") == 0) + { + if(0 != LoadBMPCanvas(filename, pVideoLogo, enFmt)) + { + printf("OSD_LoadBMP error!\n"); + return -1; + } + } + else + { + printf("not supported image file!\n"); + return -1; + } + + return 0; +} + + +HI_S32 LoadBitMap2Surface(const HI_CHAR *pszFileName, const OSD_SURFACE_S *pstSurface, HI_U8 *pu8Virt) +{ + OSD_LOGO_T stLogo; + stLogo.stride = pstSurface->u16Stride; + stLogo.pRGBBuffer = pu8Virt; + + return LoadImage(pszFileName, &stLogo); +} + +HI_S32 CreateSurfaceByBitMap(const HI_CHAR *pszFileName, OSD_SURFACE_S *pstSurface, HI_U8 *pu8Virt) +{ + OSD_LOGO_T stLogo; + stLogo.pRGBBuffer = pu8Virt; + if(LoadImageEx(pszFileName, &stLogo, pstSurface->enColorFmt) < 0) + { + printf("load bmp error!\n"); + return -1; + } + + pstSurface->u16Height = stLogo.height; + pstSurface->u16Width = stLogo.width; + pstSurface->u16Stride = stLogo.stride; + + return 0; +} + + +HI_S32 CreateSurfaceByCanvas(const HI_CHAR *pszFileName, OSD_SURFACE_S *pstSurface, HI_U8 *pu8Virt, HI_U32 u32Width, HI_U32 u32Height, HI_U32 u32Stride) +{ + OSD_LOGO_T stLogo; + stLogo.pRGBBuffer = pu8Virt; + stLogo.width = u32Width; + stLogo.height = u32Height; + stLogo.stride = u32Stride; + if(LoadCanvasEx(pszFileName, &stLogo, pstSurface->enColorFmt) < 0) + { + printf("load bmp error!\n"); + return -1; + } + + pstSurface->u16Height = u32Height; + pstSurface->u16Width = u32Width; + pstSurface->u16Stride = u32Stride; + + return 0; +} + + diff --git a/device/mpp/sample/common/loadbmp.h b/device/mpp/sample/common/loadbmp.h new file mode 100644 index 0000000..cfb10bd --- /dev/null +++ b/device/mpp/sample/common/loadbmp.h @@ -0,0 +1,107 @@ +#ifndef __LOAD_BMP_H__ +#define __LOAD_BMP_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +/* the color format OSD supported */ +typedef enum hiOSD_COLOR_FMT_E +{ + OSD_COLOR_FMT_RGB444 = 0, + OSD_COLOR_FMT_RGB4444 = 1, + OSD_COLOR_FMT_RGB555 = 2, + OSD_COLOR_FMT_RGB565 = 3, + OSD_COLOR_FMT_RGB1555 = 4, + OSD_COLOR_FMT_RGB888 = 6, + OSD_COLOR_FMT_RGB8888 = 7, + OSD_COLOR_FMT_BUTT +}OSD_COLOR_FMT_E; + +typedef struct hiOSD_RGB_S +{ + HI_U8 u8B; + HI_U8 u8G; + HI_U8 u8R; + HI_U8 u8Reserved; +}OSD_RGB_S; + +typedef struct hiOSD_SURFACE_S +{ + OSD_COLOR_FMT_E enColorFmt; /* color format */ + HI_U8 *pu8PhyAddr; /* physical address */ + HI_U16 u16Height; /* operation height */ + HI_U16 u16Width; /* operation width */ + HI_U16 u16Stride; /* surface stride */ + HI_U16 u16Reserved; +}OSD_SURFACE_S; + +typedef struct tag_OSD_Logo +{ + HI_U32 width; /* out */ + HI_U32 height; /* out */ + HI_U32 stride; /* in */ + HI_U8 * pRGBBuffer; /* in/out */ +}OSD_LOGO_T; + +typedef struct tag_OSD_BITMAPINFOHEADER{ + HI_U16 biSize; + HI_U32 biWidth; + HI_S32 biHeight; + HI_U16 biPlanes; + HI_U16 biBitCount; + HI_U32 biCompression; + HI_U32 biSizeImage; + HI_U32 biXPelsPerMeter; + HI_U32 biYPelsPerMeter; + HI_U32 biClrUsed; + HI_U32 biClrImportant; +} OSD_BITMAPINFOHEADER; + +typedef struct tag_OSD_BITMAPFILEHEADER { + HI_U32 bfSize; + HI_U16 bfReserved1; + HI_U16 bfReserved2; + HI_U32 bfOffBits; +} OSD_BITMAPFILEHEADER; + +typedef struct tag_OSD_RGBQUAD { + HI_U8 rgbBlue; + HI_U8 rgbGreen; + HI_U8 rgbRed; + HI_U8 rgbReserved; +} OSD_RGBQUAD; + +typedef struct tag_OSD_BITMAPINFO { + OSD_BITMAPINFOHEADER bmiHeader; + OSD_RGBQUAD bmiColors[1]; +} OSD_BITMAPINFO; + +typedef struct hiOSD_COMPONENT_INFO_S{ + + int alen; + int rlen; + int glen; + int blen; +}OSD_COMP_INFO; + +HI_S32 LoadImage(const HI_CHAR *filename, OSD_LOGO_T *pVideoLogo); +HI_S32 LoadBitMap2Surface(const HI_CHAR *pszFileName, const OSD_SURFACE_S *pstSurface, HI_U8 *pu8Virt); +HI_S32 CreateSurfaceByBitMap(const HI_CHAR *pszFileName, OSD_SURFACE_S *pstSurface, HI_U8 *pu8Virt); +HI_S32 CreateSurfaceByCanvas(const HI_CHAR *pszFileName, OSD_SURFACE_S *pstSurface, HI_U8 *pu8Virt, HI_U32 u32Width, HI_U32 u32Height, HI_U32 u32Stride); +HI_S32 GetBmpInfo(const HI_CHAR *filename, OSD_BITMAPFILEHEADER *pBmpFileHeader,OSD_BITMAPINFO *pBmpInfo); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __LOAD_BMP_H__*/ + diff --git a/device/mpp/sample/common/sample_comm.h b/device/mpp/sample/common/sample_comm.h new file mode 100644 index 0000000..9515f20 --- /dev/null +++ b/device/mpp/sample/common/sample_comm.h @@ -0,0 +1,400 @@ +/****************************************************************************** + Hisilicon Hi35xx sample programs head file. + + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-2 Created +******************************************************************************/ + +#ifndef __SAMPLE_COMM_H__ +#define __SAMPLE_COMM_H__ + +#include "hi_common.h" +#include "hi_comm_sys.h" +#include "hi_comm_vb.h" +#include "hi_comm_isp.h" +#include "hi_comm_vi.h" +#include "hi_comm_vo.h" +#include "hi_comm_venc.h" +#include "hi_comm_vpss.h" +#include "hi_comm_vdec.h" +#include "hi_comm_region.h" +#include "hi_comm_adec.h" +#include "hi_comm_aenc.h" +#include "hi_comm_ai.h" +#include "hi_comm_ao.h" +#include "hi_comm_aio.h" +#include "hi_defines.h" + +#include "mpi_sys.h" +#include "mpi_vb.h" +#include "mpi_vi.h" +#include "mpi_vo.h" +#include "mpi_venc.h" +#include "mpi_vpss.h" +#include "mpi_vdec.h" +#include "mpi_region.h" +#include "mpi_adec.h" +#include "mpi_aenc.h" +#include "mpi_ai.h" +#include "mpi_ao.h" +#include "mpi_isp.h" +#include "mpi_ae.h" +#include "mpi_awb.h" +#include "mpi_af.h" +#include "hi_vreg.h" +#include "hi_sns_ctrl.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/******************************************************* + macro define +*******************************************************/ +#define FILE_NAME_LEN 128 +#define ALIGN_UP(x, a) ((x+a-1)&(~(a-1))) +#define ALIGN_BACK(x, a) ((a) * (((x) / (a)))) +#define SAMPLE_SYS_ALIGN_WIDTH 64 +#define CHECK_CHN_RET(express,Chn,name)\ + do{\ + HI_S32 Ret;\ + Ret = express;\ + if (HI_SUCCESS != Ret)\ + {\ + printf("\033[0;31m%s chn %d failed at %s: LINE: %d with %#x!\033[0;39m\n", name, Chn, __FUNCTION__, __LINE__, Ret);\ + fflush(stdout);\ + return Ret;\ + }\ + }while(0) + +#define CHECK_RET(express,name)\ + do{\ + HI_S32 Ret;\ + Ret = express;\ + if (HI_SUCCESS != Ret)\ + {\ + printf("\033[0;31m%s failed at %s: LINE: %d with %#x!\033[0;39m\n", name, __FUNCTION__, __LINE__, Ret);\ + return Ret;\ + }\ + }while(0) +#define SAMPLE_PIXEL_FORMAT PIXEL_FORMAT_YUV_SEMIPLANAR_420 + +#define TW2865_FILE "/dev/tw2865dev" +#define TW2960_FILE "/dev/tw2960dev" +#define TLV320_FILE "/dev/tlv320aic31" + + +#if (HICHIP == HI3518E_V200) +#define SAMPLE_VO_DEV_DSD1 0 +#define SAMPLE_VO_DEV_DSD0 SAMPLE_VO_DEV_DSD1 +#else +#error HICHIP define may be error +#endif + +/*** for init global parameter ***/ +#define SAMPLE_ENABLE 1 +#define SAMPLE_DISABLE 0 +#define SAMPLE_NOUSE -1 + +#define SENSOR_HEIGHT 1080 +#define SENSOR_WIDTH 1920 + +#define SAMPLE_AUDIO_AI_DEV 0 +#define SAMPLE_AUDIO_AO_DEV 0 +#define SAMPLE_AUDIO_PTNUMPERFRM 320 + +#define VI_MST_NOTPASS_WITH_VALUE_RETURN(s32TempRet) \ +do{\ + NOT_PASS(s32TempRet);\ + VIMST_ExitMpp();\ + return s32TempRet;\ +}while(0) + +#define VI_PAUSE() do {\ + printf("---------------press any key to exit!---------------\n");\ + getchar();\ + } while (0) + + +#define SAMPLE_PRT(fmt...) \ + do {\ + printf("[%s]-%d: ", __FUNCTION__, __LINE__);\ + printf(fmt);\ + }while(0) + +#define CHECK_NULL_PTR(ptr)\ + do{\ + if(NULL == ptr)\ + {\ + printf("func:%s,line:%d, NULL pointer\n",__FUNCTION__,__LINE__);\ + return HI_FAILURE;\ + }\ + }while(0) + +#ifdef LCD_ILI9341 +#define INTF_LCD VO_INTF_LCD_6BIT +#define SYNC_LCD VO_OUTPUT_240X320_50; +#define WIDTH_LCD 240 +#define HEIGHT_LCD 320 +#endif + +#ifdef LCD_ILI9342 +#define INTF_LCD VO_INTF_LCD_6BIT +#define SYNC_LCD VO_OUTPUT_320X240_50 +#define WIDTH_LCD 320 +#define HEIGHT_LCD 240 +#endif + +#ifdef LCD_OTA5182 +#define INTF_LCD VO_INTF_LCD_8BIT +#define SYNC_LCD VO_OUTPUT_320X240_60 +#define WIDTH_LCD 320 +#define HEIGHT_LCD 240 +#endif + +/******************************************************* + enum define +*******************************************************/ + +typedef enum sample_ispcfg_opt_e +{ + CFG_OPT_NONE = 0, + CFG_OPT_SAVE = 1, + CFG_OPT_LOAD = 2, + CFG_OPT_BUTT +}SAMPLE_CFG_OPT_E; + +typedef enum sample_vi_mode_e +{ + APTINA_AR0130_DC_720P_30FPS = 0, + APTINA_9M034_DC_720P_30FPS, + APTINA_AR0230_HISPI_1080P_30FPS, + SONY_IMX122_DC_1080P_30FPS, + SONY_IMX122_DC_720P_30FPS, + SAMPLE_VI_MODE_1_D1, + SAMPLE_VI_MODE_BT1120_720P, + SAMPLE_VI_MODE_BT1120_1080P, +}SAMPLE_VI_MODE_E; + +typedef enum +{ + VI_DEV_BT656_D1_1MUX = 0, + VI_DEV_BT656_D1_4MUX, + VI_DEV_BT656_960H_1MUX, + VI_DEV_BT656_960H_4MUX, + VI_DEV_720P_HD_1MUX, + VI_DEV_1080P_HD_1MUX, + VI_DEV_BUTT +}SAMPLE_VI_DEV_TYPE_E; + +typedef enum sample_vi_chn_set_e +{ + VI_CHN_SET_NORMAL = 0, /* mirror, flip close */ + VI_CHN_SET_MIRROR, /* open MIRROR */ + VI_CHN_SET_FLIP, /* open filp */ + VI_CHN_SET_FLIP_MIRROR /* mirror, flip */ +}SAMPLE_VI_CHN_SET_E; + +typedef enum sample_vo_mode_e +{ + VO_MODE_1MUX = 0, + VO_MODE_2MUX = 1, + VO_MODE_BUTT +}SAMPLE_VO_MODE_E; + +typedef enum sample_rc_e +{ + SAMPLE_RC_CBR = 0, + SAMPLE_RC_VBR, + SAMPLE_RC_FIXQP +}SAMPLE_RC_E; + +typedef enum sample_rgn_change_type_e +{ + RGN_CHANGE_TYPE_FGALPHA = 0, + RGN_CHANGE_TYPE_BGALPHA, + RGN_CHANGE_TYPE_LAYER +}SAMPLE_RGN_CHANGE_TYPE_EN; + + +/******************************************************* + structure define +*******************************************************/ +typedef struct sample_vi_param_s +{ + HI_S32 s32ViDevCnt; // VI Dev Total Count + HI_S32 s32ViDevInterval; // Vi Dev Interval + HI_S32 s32ViChnCnt; // Vi Chn Total Count + HI_S32 s32ViChnInterval; // VI Chn Interval +}SAMPLE_VI_PARAM_S; + +typedef struct sample_video_loss_s +{ + HI_BOOL bStart; + pthread_t Pid; + SAMPLE_VI_MODE_E enViMode; +} SAMPLE_VIDEO_LOSS_S; + + +typedef struct sample_vi_frame_info_s +{ + VB_BLK VbBlk; + VIDEO_FRAME_INFO_S stVideoFrame; + HI_U32 u32FrmSize; +}SAMPLE_VI_FRAME_INFO_S; + + +typedef struct sample_venc_getstream_s +{ + HI_BOOL bThreadStart; + HI_S32 s32Cnt; +}SAMPLE_VENC_GETSTREAM_PARA_S; + +typedef struct sample_vi_config_s +{ + SAMPLE_VI_MODE_E enViMode; + VIDEO_NORM_E enNorm; /*DC: VIDEO_ENCODING_MODE_AUTO */ + ROTATE_E enRotate; + SAMPLE_VI_CHN_SET_E enViChnSet; + WDR_MODE_E enWDRMode; +}SAMPLE_VI_CONFIG_S; + + +/******************************************************* + function announce +*******************************************************/ +HI_S32 SAMPLE_COMM_SYS_GetPicSize(VIDEO_NORM_E enNorm, PIC_SIZE_E enPicSize, SIZE_S *pstSize); +HI_U32 SAMPLE_COMM_SYS_CalcPicVbBlkSize(VIDEO_NORM_E enNorm, PIC_SIZE_E enPicSize, PIXEL_FORMAT_E enPixFmt, HI_U32 u32AlignWidth); +HI_U32 VI_COMM_SYS_CalcPicVbBlkSize(VIDEO_NORM_E enNorm,HI_U32 u32Width ,HI_U32 u32Height, PIXEL_FORMAT_E enPixFmt, HI_U32 u32AlignWidth); +HI_S32 SAMPLE_COMM_SYS_MemConfig(HI_VOID); +HI_VOID SAMPLE_COMM_SYS_Exit(void); +HI_S32 SAMPLE_COMM_SYS_Init(VB_CONF_S *pstVbConf); +HI_S32 SAMPLE_COMM_SYS_Payload2FilePostfix(PAYLOAD_TYPE_E enPayload, HI_CHAR* szFilePostfix); + +HI_S32 SAMPLE_COMM_ISP_Init(WDR_MODE_E enWDRMode); +HI_VOID SAMPLE_COMM_ISP_Stop(void); +HI_S32 SAMPLE_COMM_ISP_Run(void); +HI_S32 SAMPLE_COMM_ISP_ChangeSensorMode(HI_U8 u8Mode); + +HI_S32 SAMPLE_COMM_VI_GetSizeBySensor(PIC_SIZE_E *penSize); +HI_S32 SAMPLE_COMM_VI_Mode2Param(SAMPLE_VI_MODE_E enViMode, SAMPLE_VI_PARAM_S *pstViParam); +HI_S32 SAMPLE_COMM_VI_Mode2Size(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm, SIZE_S *pstSize); +VI_DEV SAMPLE_COMM_VI_GetDev(SAMPLE_VI_MODE_E enViMode, VI_CHN ViChn); +HI_S32 SAMPLE_COMM_VI_StartDev(VI_DEV ViDev, SAMPLE_VI_MODE_E enViMode); +HI_S32 SAMPLE_COMM_VI_StartChn(VI_CHN ViChn, RECT_S *pstCapRect, SIZE_S *pstTarSize, SAMPLE_VI_CONFIG_S* pstViConfig); +HI_S32 SAMPLE_COMM_VI_StartBT656(SAMPLE_VI_CONFIG_S* pstViConfig); +HI_S32 SAMPLE_COMM_VI_StopBT656(SAMPLE_VI_MODE_E enViMode); +HI_S32 SAMPLE_COMM_VI_BindVpss(SAMPLE_VI_MODE_E enViMode); +HI_S32 SAMPLE_COMM_VI_UnBindVpss(SAMPLE_VI_MODE_E enViMode); +HI_S32 SAMPLE_COMM_VI_BindVenc(SAMPLE_VI_MODE_E enViMode); +HI_S32 SAMPLE_COMM_VI_StartMIPI(SAMPLE_VI_CONFIG_S* pstViConfig); +HI_S32 SAMPLE_COMM_VI_UnBindVenc(SAMPLE_VI_MODE_E enViMode); +HI_S32 SAMPLE_COMM_VI_MemConfig(SAMPLE_VI_MODE_E enViMode); +HI_S32 SAMPLE_COMM_VI_GetVFrameFromYUV(FILE *pYUVFile, HI_U32 u32Width, HI_U32 u32Height,HI_U32 u32Stride, VIDEO_FRAME_INFO_S *pstVFrameInfo); +HI_S32 SAMPLE_COMM_VI_ChangeCapSize(VI_CHN ViChn, HI_U32 u32CapWidth, HI_U32 u32CapHeight,HI_U32 u32Width, HI_U32 u32Height); +HI_S32 SAMPLE_COMM_VI_StartVi(SAMPLE_VI_CONFIG_S* pstViConfig); +HI_S32 SAMPLE_COMM_VI_StopVi(SAMPLE_VI_CONFIG_S* pstViConfig); +HI_S32 SAMPLE_COMM_VI_SwitchResParam( SAMPLE_VI_CONFIG_S* pstViConfig, + ISP_PUB_ATTR_S *pstPubAttr, + RECT_S *pstCapRect ); + + +HI_S32 SAMPLE_COMM_VI_StartMIPI_BT1120(SAMPLE_VI_MODE_E enViMode); + +HI_S32 SAMPLE_COMM_VI_FPN_CALIBRATE_CONFIG(const char* fpn_file, /* fpn file name */ + ISP_FPN_TYPE_E enFpnType, /* line/frame */ + PIXEL_FORMAT_E enPixelFormat, + COMPRESS_MODE_E enCompressMode, + HI_U32 u32FrmNum, + HI_U32 u32Threshold); + +HI_S32 SAMPLE_COMM_VI_CORRECTION_CONFIG(const char* fpn_file, /* fpn file_name */ + ISP_FPN_TYPE_E enFpnType, /* line/frame */ + ISP_OP_TYPE_E enOpType, /* auto/manual */ + HI_U32 u32Strength, /* strength */ + PIXEL_FORMAT_E enPixelFormat); + +HI_S32 SAMPLE_COMM_VPSS_MemConfig(); +HI_S32 SAMPLE_COMM_VPSS_Start(HI_S32 s32GrpCnt, SIZE_S *pstSize, HI_S32 s32ChnCnt,VPSS_GRP_ATTR_S *pstVpssGrpAttr); +HI_S32 SAMPLE_COMM_VPSS_Stop(HI_S32 s32GrpCnt, HI_S32 s32ChnCnt) ; +HI_S32 SAMPLE_COMM_VPSS_StartGroup(VPSS_GRP VpssGrp, VPSS_GRP_ATTR_S *pstVpssGrpAttr); +HI_S32 SAMPLE_COMM_VPSS_EnableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, + VPSS_CHN_ATTR_S *pstVpssChnAttr, + VPSS_CHN_MODE_S *pstVpssChnMode, + VPSS_EXT_CHN_ATTR_S *pstVpssExtChnAttr); +HI_S32 SAMPLE_COMM_VPSS_StopGroup(VPSS_GRP VpssGrp); +HI_S32 SAMPLE_COMM_VPSS_DisableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn); + +HI_S32 SAMPLE_COMM_VO_GetWH(VO_INTF_SYNC_E enIntfSync, HI_U32 *pu32W,HI_U32 *pu32H, HI_U32 *pu32Frm); +HI_S32 SAMPLE_COMM_VO_MemConfig(VO_DEV VoDev, HI_CHAR *pcMmzName); +HI_S32 SAMPLE_COMM_VO_StartDev(VO_DEV VoDev, VO_PUB_ATTR_S *pstPubAttr); +HI_S32 SAMPLE_COMM_VO_StopDev(VO_DEV VoDev); +HI_S32 SAMPLE_COMM_VO_StartLayer(VO_LAYER VoLayer,const VO_VIDEO_LAYER_ATTR_S *pstLayerAttr, HI_BOOL bVgsBypass); +HI_S32 SAMPLE_COMM_VO_StopLayer(VO_LAYER VoLayer); +HI_S32 SAMPLE_COMM_VO_StartChn(VO_LAYER VoLayer, SAMPLE_VO_MODE_E enMode); +HI_S32 SAMPLE_COMM_VO_StopChn(VO_LAYER VoLayer, SAMPLE_VO_MODE_E enMode); +HI_S32 SAMPLE_COMM_VO_BindVpss(VO_LAYER VoLayer,VO_CHN VoChn,VPSS_GRP VpssGrp,VPSS_CHN VpssChn); +HI_S32 SAMPLE_COMM_VO_UnBindVpss(VO_LAYER VoLayer,VO_CHN VoChn,VPSS_GRP VpssGrp,VPSS_CHN VpssChn); +HI_S32 SAMPLE_COMM_VO_BindVi(VO_LAYER VoLayer, VO_CHN VoChn, VI_CHN ViChn); +HI_S32 SAMPLE_COMM_VO_UnBindVi(VO_LAYER VoLayer, VO_CHN VoChn); + +HI_S32 SAMPLE_COMM_VENC_MemConfig(HI_VOID); +HI_S32 SAMPLE_COMM_VENC_Start(VENC_CHN VencChn, PAYLOAD_TYPE_E enType, VIDEO_NORM_E enNorm, PIC_SIZE_E enSize, SAMPLE_RC_E enRcMode,HI_U32 u32Profile); +HI_S32 SAMPLE_COMM_VENC_Stop(VENC_CHN VencChn); +HI_S32 SAMPLE_COMM_VENC_SnapStart(VENC_CHN VencChn, SIZE_S *pstSize); +HI_S32 SAMPLE_COMM_VENC_SnapProcess(VENC_CHN VencChn); +HI_S32 SAMPLE_COMM_VENC_SnapStop(VENC_CHN VencChn); +HI_S32 SAMPLE_COMM_VENC_StartGetStream(HI_S32 s32Cnt); +HI_S32 SAMPLE_COMM_VENC_StopGetStream(); +HI_S32 SAMPLE_COMM_VENC_BindVpss(VENC_CHN VencChn,VPSS_GRP VpssGrp,VPSS_CHN VpssChn); +HI_S32 SAMPLE_COMM_VENC_UnBindVpss(VENC_CHN VencChn,VPSS_GRP VpssGrp,VPSS_CHN VpssChn); +HI_S32 SAMPLE_COMM_VENC_StartGetStream_Svc_t(HI_S32 s32Cnt); + + +HI_S32 SAMPLE_COMM_VDA_MdStart(VDA_CHN VdaChn, HI_U32 u32Chn, SIZE_S *pstSize); +HI_S32 SAMPLE_COMM_VDA_OdStart(VDA_CHN VdaChn, HI_U32 u32Chn, SIZE_S *pstSize); +HI_VOID SAMPLE_COMM_VDA_MdStop(VDA_CHN VdaChn, HI_U32 u32Chn); +HI_VOID SAMPLE_COMM_VDA_OdStop(VDA_CHN VdaChn, HI_U32 u32Chn); + +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdAiAo(AUDIO_DEV AiDev, AI_CHN AiChn, AUDIO_DEV AoDev, AO_CHN AoChn); +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdAiAenc(AUDIO_DEV AiDev, AI_CHN AiChn, AENC_CHN AeChn); +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdAencAdec(AENC_CHN AeChn, ADEC_CHN AdChn, FILE *pAecFd); +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdFileAdec(ADEC_CHN AdChn, FILE *pAdcFd); +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdAoVolCtrl(AUDIO_DEV AoDev); +HI_S32 SAMPLE_COMM_AUDIO_DestoryTrdAi(AUDIO_DEV AiDev, AI_CHN AiChn); +HI_S32 SAMPLE_COMM_AUDIO_DestoryTrdAencAdec(AENC_CHN AeChn); +HI_S32 SAMPLE_COMM_AUDIO_DestoryTrdFileAdec(ADEC_CHN AdChn); +HI_S32 SAMPLE_COMM_AUDIO_DestoryTrdAoVolCtrl(AUDIO_DEV AoDev); +HI_S32 SAMPLE_COMM_AUDIO_DestoryAllTrd(); +HI_S32 SAMPLE_COMM_AUDIO_AoBindAdec(AUDIO_DEV AoDev, AO_CHN AoChn, ADEC_CHN AdChn); +HI_S32 SAMPLE_COMM_AUDIO_AoUnbindAdec(AUDIO_DEV AoDev, AO_CHN AoChn, ADEC_CHN AdChn); +HI_S32 SAMPLE_COMM_AUDIO_AoBindAi(AUDIO_DEV AiDev, AI_CHN AiChn, AUDIO_DEV AoDev, AO_CHN AoChn); +HI_S32 SAMPLE_COMM_AUDIO_AoUnbindAi(AUDIO_DEV AiDev, AI_CHN AiChn, AUDIO_DEV AoDev, AO_CHN AoChn); +HI_S32 SAMPLE_COMM_AUDIO_AencBindAi(AUDIO_DEV AiDev, AI_CHN AiChn, AENC_CHN AeChn); +HI_S32 SAMPLE_COMM_AUDIO_AencUnbindAi(AUDIO_DEV AiDev, AI_CHN AiChn, AENC_CHN AeChn); +HI_S32 SAMPLE_COMM_AUDIO_CfgAcodec(AIO_ATTR_S *pstAioAttr); +HI_S32 SAMPLE_COMM_AUDIO_DisableAcodec(); +HI_S32 SAMPLE_COMM_AUDIO_StartAi(AUDIO_DEV AiDevId, HI_S32 s32AiChnCnt, + AIO_ATTR_S *pstAioAttr, AUDIO_SAMPLE_RATE_E enOutSampleRate, HI_BOOL bResampleEn, AI_VQE_CONFIG_S *pstAiVqeAttr); +HI_S32 SAMPLE_COMM_AUDIO_StopAi(AUDIO_DEV AiDevId, HI_S32 s32AiChnCnt, HI_BOOL bResampleEn, HI_BOOL bVqeEn); +HI_S32 SAMPLE_COMM_AUDIO_StartAo(AUDIO_DEV AoDevId, HI_S32 s32AoChnCnt, + AIO_ATTR_S *pstAioAttr, AUDIO_SAMPLE_RATE_E enInSampleRate, HI_BOOL bResampleEn); +HI_S32 SAMPLE_COMM_AUDIO_StopAo(AUDIO_DEV AoDevId, HI_S32 s32AoChnCnt, HI_BOOL bResampleEn); +HI_S32 SAMPLE_COMM_AUDIO_StartAenc(HI_S32 s32AencChnCnt, HI_U32 u32AencPtNumPerFrm, PAYLOAD_TYPE_E enType); +HI_S32 SAMPLE_COMM_AUDIO_StopAenc(HI_S32 s32AencChnCnt); +HI_S32 SAMPLE_COMM_AUDIO_StartAdec(ADEC_CHN AdChn, PAYLOAD_TYPE_E enType); +HI_S32 SAMPLE_COMM_AUDIO_StopAdec(ADEC_CHN AdChn); +HI_VOID SAMPLE_COMM_SYS_Exit(void); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + + +#endif /* End of #ifndef __SAMPLE_COMMON_H__ */ diff --git a/device/mpp/sample/common/sample_comm_audio.c b/device/mpp/sample/common/sample_comm_audio.c new file mode 100644 index 0000000..951563e --- /dev/null +++ b/device/mpp/sample/common/sample_comm_audio.c @@ -0,0 +1,1545 @@ +/****************************************************************************** + A simple program of Hisilicon HI3516 audio input/output/encoder/decoder implementation. + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-2 Created +******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" +#include "acodec.h" +#ifdef HI_ACODEC_TYPE_TLV320AIC31 +#include "tlv320aic31.h" +#endif + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define ACODEC_FILE "/dev/acodec" + +#define AUDIO_ADPCM_TYPE ADPCM_TYPE_DVI4/* ADPCM_TYPE_IMA, ADPCM_TYPE_DVI4*/ +#define G726_BPS MEDIA_G726_40K /* MEDIA_G726_16K, MEDIA_G726_24K ... */ + +typedef struct tagSAMPLE_AENC_S +{ + HI_BOOL bStart; + pthread_t stAencPid; + HI_S32 AeChn; + HI_S32 AdChn; + FILE *pfd; + HI_BOOL bSendAdChn; +} SAMPLE_AENC_S; + +typedef struct tagSAMPLE_AI_S +{ + HI_BOOL bStart; + HI_S32 AiDev; + HI_S32 AiChn; + HI_S32 AencChn; + HI_S32 AoDev; + HI_S32 AoChn; + HI_BOOL bSendAenc; + HI_BOOL bSendAo; + pthread_t stAiPid; +} SAMPLE_AI_S; + +typedef struct tagSAMPLE_ADEC_S +{ + HI_BOOL bStart; + HI_S32 AdChn; + FILE *pfd; + pthread_t stAdPid; +} SAMPLE_ADEC_S; + +typedef struct tagSAMPLE_AO_S +{ + AUDIO_DEV AoDev; + HI_BOOL bStart; + pthread_t stAoPid; +}SAMPLE_AO_S; + +static SAMPLE_AI_S gs_stSampleAi[AI_DEV_MAX_NUM*AIO_MAX_CHN_NUM]; +static SAMPLE_AENC_S gs_stSampleAenc[AENC_MAX_CHN_NUM]; +static SAMPLE_ADEC_S gs_stSampleAdec[ADEC_MAX_CHN_NUM]; +static SAMPLE_AO_S gs_stSampleAo[AO_DEV_MAX_NUM]; + +#ifdef HI_ACODEC_TYPE_TLV320AIC31 +HI_S32 SAMPLE_Tlv320_CfgAudio(AIO_MODE_E enWorkmode, AUDIO_SAMPLE_RATE_E enSample) +{ + HI_S32 sample; + HI_S32 vol = 0x100; + Audio_Ctrl audio_ctrl; + int s_fdTlv = -1; + HI_BOOL bPCMmode = HI_FALSE; + HI_BOOL bMaster = HI_TRUE; + HI_BOOL bPCMStd = HI_FALSE; + + + HI_BOOL b44100HzSeries = HI_FALSE; + + if (AUDIO_SAMPLE_RATE_8000 == enSample) + { + sample = AC31_SET_8K_SAMPLERATE; + } + else if (AUDIO_SAMPLE_RATE_12000 == enSample) + { + sample = AC31_SET_12K_SAMPLERATE; + } + else if (AUDIO_SAMPLE_RATE_11025 == enSample) + { + b44100HzSeries = HI_TRUE; + sample = AC31_SET_11_025K_SAMPLERATE; + } + else if (AUDIO_SAMPLE_RATE_16000 == enSample) + { + sample = AC31_SET_16K_SAMPLERATE; + } + else if (AUDIO_SAMPLE_RATE_22050 == enSample) + { + b44100HzSeries = HI_TRUE; + sample = AC31_SET_22_05K_SAMPLERATE; + } + else if (AUDIO_SAMPLE_RATE_24000 == enSample) + { + sample = AC31_SET_24K_SAMPLERATE; + } + else if (AUDIO_SAMPLE_RATE_32000 == enSample) + { + sample = AC31_SET_32K_SAMPLERATE; + } + else if (AUDIO_SAMPLE_RATE_44100 == enSample) + { + b44100HzSeries = HI_TRUE; + sample = AC31_SET_44_1K_SAMPLERATE; + } + else if (AUDIO_SAMPLE_RATE_48000 == enSample) + { + sample = AC31_SET_48K_SAMPLERATE; + } + else + { + printf("SAMPLE_Tlv320_CfgAudio(), not support enSample:%d\n",enSample); + return -1; + } + + if(AIO_MODE_I2S_MASTER == enWorkmode) + { + bPCMmode = HI_FALSE; + bMaster = HI_FALSE; + } + else if(AIO_MODE_I2S_SLAVE == enWorkmode) + { + bPCMmode = HI_FALSE; + bMaster = HI_TRUE; + } + else if((AIO_MODE_PCM_MASTER_NSTD == enWorkmode)||(AIO_MODE_PCM_MASTER_STD == enWorkmode)) + { + bPCMmode = HI_TRUE; + bMaster = HI_FALSE; + } + else if((AIO_MODE_PCM_SLAVE_NSTD == enWorkmode)||(AIO_MODE_PCM_SLAVE_STD == enWorkmode)) + { + bPCMmode = HI_TRUE; + bMaster = HI_TRUE; + } + else + { + printf("SAMPLE_Tlv320_CfgAudio(), not support workmode:%d\n\n",enWorkmode); + } + + s_fdTlv = open(TLV320_FILE,O_RDWR); + if (s_fdTlv < 0) + { + printf("can't open tlv320,%s\n", TLV320_FILE); + return -1; + } + + audio_ctrl.chip_num = 0; + if (ioctl(s_fdTlv,SOFT_RESET,&audio_ctrl)) + { + printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "tlv320aic31 reset failed"); + } + + + audio_ctrl.ctrl_mode = bMaster; + audio_ctrl.if_44100hz_series = b44100HzSeries; + audio_ctrl.sample = sample; + audio_ctrl.sampleRate = (HI_U32)enSample; + ioctl(s_fdTlv,SET_CTRL_MODE,&audio_ctrl); + + /* set transfer mode 0:I2S 1:PCM */ + audio_ctrl.trans_mode = bPCMmode; + if (ioctl(s_fdTlv,SET_TRANSFER_MODE,&audio_ctrl)) + { + printf("set tlv320aic31 trans_mode err\n"); + close(s_fdTlv); + return -1; + } + + /*set sample of DAC and ADC */ + if (ioctl(s_fdTlv,SET_DAC_SAMPLE,&audio_ctrl)) + { + printf("ioctl err1\n"); + close(s_fdTlv); + return -1; + } + + if (ioctl(s_fdTlv,SET_ADC_SAMPLE,&audio_ctrl)) + { + printf("ioctl err2\n"); + close(s_fdTlv); + return -1; + } + + /*set volume control of left and right DAC */ + audio_ctrl.if_mute_route = 0; + audio_ctrl.input_level = 0; + ioctl(s_fdTlv,LEFT_DAC_VOL_CTRL,&audio_ctrl); + ioctl(s_fdTlv,RIGHT_DAC_VOL_CTRL,&audio_ctrl); + + /*Right/Left DAC Datapath Control */ + audio_ctrl.if_powerup = 1;/*Left/Right DAC datapath plays left/right channel input data*/ + ioctl(s_fdTlv,LEFT_DAC_POWER_SETUP,&audio_ctrl); + if ((AIO_MODE_I2S_MASTER != enWorkmode) && (AIO_MODE_I2S_SLAVE != enWorkmode)) + { + audio_ctrl.if_powerup = 0; + } + ioctl(s_fdTlv,RIGHT_DAC_POWER_SETUP,&audio_ctrl); + + /* config PCM standard mode and nonstandard mode */ + if ((AIO_MODE_PCM_MASTER_STD == enWorkmode)||(AIO_MODE_PCM_SLAVE_STD == enWorkmode)) + { + bPCMStd = HI_TRUE; + audio_ctrl.data_offset = 2; + ioctl(s_fdTlv,SET_SERIAL_DATA_OFFSET,&audio_ctrl); + } + else if ((AIO_MODE_PCM_MASTER_NSTD == enWorkmode)||(AIO_MODE_PCM_SLAVE_NSTD == enWorkmode)) + { + bPCMStd = HI_FALSE; + audio_ctrl.data_offset = bPCMStd; + ioctl(s_fdTlv,SET_SERIAL_DATA_OFFSET,&audio_ctrl); + } + else + {;} + + /* (0:16bit 1:20bit 2:24bit 3:32bit) */ + audio_ctrl.data_length = 0; + ioctl(s_fdTlv,SET_DATA_LENGTH,&audio_ctrl); + + /*DACL1 TO LEFT_LOP/RIGHT_LOP VOLUME CONTROL 82 92*/ + audio_ctrl.if_mute_route = 1;/* route*/ + audio_ctrl.input_level = vol; /*level control*/ + ioctl(s_fdTlv,DACL1_2_LEFT_LOP_VOL_CTRL,&audio_ctrl); + ioctl(s_fdTlv,DACR1_2_RIGHT_LOP_VOL_CTRL,&audio_ctrl); + + /* LEFT_LOP/RIGHT_LOP OUTPUT LEVEL CONTROL 86 93*/ + audio_ctrl.if_mute_route = 1; + audio_ctrl.if_powerup = 1; + audio_ctrl.input_level = 0; + ioctl(s_fdTlv,LEFT_LOP_OUTPUT_LEVEL_CTRL,&audio_ctrl); + ioctl(s_fdTlv,RIGHT_LOP_OUTPUT_LEVEL_CTRL,&audio_ctrl); + + /* LEFT/RIGHT ADC PGA GAIN CONTROL 15 16*/ + audio_ctrl.if_mute_route =0; + audio_ctrl.input_level = 0; + ioctl(s_fdTlv,LEFT_ADC_PGA_CTRL,&audio_ctrl); + ioctl(s_fdTlv,RIGHT_ADC_PGA_CTRL,&audio_ctrl); + + /*INT2L TO LEFT/RIGTH ADCCONTROL 17 18*/ + audio_ctrl.input_level = 0; + ioctl(s_fdTlv,IN2LR_2_LEFT_ADC_CTRL,&audio_ctrl); + ioctl(s_fdTlv,IN2LR_2_RIGTH_ADC_CTRL,&audio_ctrl); + + /*IN1L_2_LEFT/RIGTH_ADC_CTRL 19 22*/ + /*audio_ctrl.input_level = 0xf; + audio_ctrl.if_powerup = 1; + printf("audio_ctrl.input_level=0x%x,audio_ctrl.if_powerup=0x%x\n",audio_ctrl.input_level,audio_ctrl.if_powerup); + if (ioctl(s_fdTlv,IN1L_2_LEFT_ADC_CTRL,&audio_ctrl)==0) + perror("ioctl err\n"); + getchar(); + printf("audio_ctrl.input_level=0x%x,audio_ctrl.if_powerup=0x%x\n",audio_ctrl.input_level,audio_ctrl.if_powerup); + ioctl(s_fdTlv,IN1R_2_RIGHT_ADC_CTRL,&audio_ctrl); + getchar(); + printf("set 19 22\n");*/ + + audio_ctrl.if_mute_route = 1; + audio_ctrl.input_level = 9; + audio_ctrl.if_powerup = 1; + ioctl(s_fdTlv,HPLOUT_OUTPUT_LEVEL_CTRL,&audio_ctrl); + ioctl(s_fdTlv,HPROUT_OUTPUT_LEVEL_CTRL,&audio_ctrl); + + close(s_fdTlv); + printf("Set aic31 ok: bMaster = %d, enWorkmode = %d, enSamplerate = %d\n", + bMaster, enWorkmode, enSample); + return 0; + } + + +HI_S32 SAMPLE_Tlv320_Disable() +{ + Audio_Ctrl audio_ctrl; + int s_fdTlv = -1; + HI_S32 s32Ret; + + s_fdTlv = open(TLV320_FILE,O_RDWR); + if (s_fdTlv < 0) + { + printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "can't open /dev/tlv320aic31"); + return HI_FAILURE; + } + + /* reset transfer mode 0:I2S 1:PCM */ + audio_ctrl.chip_num = 0; + s32Ret = ioctl(s_fdTlv, SOFT_RESET, &audio_ctrl); + if (HI_SUCCESS != s32Ret) + { + printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "tlv320aic31 reset failed"); + } + close(s_fdTlv); + + return s32Ret; +} +#endif // end HI_ACODEC_TYPE_TLV320AIC31 + + +HI_S32 SAMPLE_INNER_CODEC_CfgAudio(AUDIO_SAMPLE_RATE_E enSample) +{ + HI_S32 fdAcodec = -1; + HI_S32 ret = HI_SUCCESS; + unsigned int i2s_fs_sel = 0; + int iAcodecInputVol = 0; + ACODEC_MIXER_E input_mode = 0; + + fdAcodec = open(ACODEC_FILE, O_RDWR); + if (fdAcodec < 0) + { + printf("%s: can't open Acodec,%s\n", __FUNCTION__, ACODEC_FILE); + return HI_FAILURE; + } + if(ioctl(fdAcodec, ACODEC_SOFT_RESET_CTRL)) + { + printf("Reset audio codec error\n"); + } + + if ((AUDIO_SAMPLE_RATE_8000 == enSample) + || (AUDIO_SAMPLE_RATE_11025 == enSample) + || (AUDIO_SAMPLE_RATE_12000 == enSample)) + { + i2s_fs_sel = 0x18; + } + else if ((AUDIO_SAMPLE_RATE_16000 == enSample) + || (AUDIO_SAMPLE_RATE_22050 == enSample) + || (AUDIO_SAMPLE_RATE_24000 == enSample)) + { + i2s_fs_sel = 0x19; + } + else if ((AUDIO_SAMPLE_RATE_32000 == enSample) + || (AUDIO_SAMPLE_RATE_44100 == enSample) + || (AUDIO_SAMPLE_RATE_48000 == enSample)) + { + i2s_fs_sel = 0x1a; + } + else + { + printf("%s: not support enSample:%d\n", __FUNCTION__, enSample); + ret = HI_FAILURE; + } + + if (ioctl(fdAcodec, ACODEC_SET_I2S1_FS, &i2s_fs_sel)) + { + printf("%s: set acodec sample rate failed\n", __FUNCTION__); + ret = HI_FAILURE; + } + + //select IN or IN_Difference + input_mode = ACODEC_MIXER_IN; + if (ioctl(fdAcodec, ACODEC_SET_MIXER_MIC, &input_mode)) + { + printf("%s: select acodec input_mode failed\n", __FUNCTION__); + ret = HI_FAILURE; + } + + + if (0) /* should be 1 when micin */ + { + /****************************************************************************************** + The input volume range is [-87, +86]. Both the analog gain and digital gain are adjusted. + A larger value indicates higher volume. + For example, the value 86 indicates the maximum volume of 86 dB, + and the value -87 indicates the minimum volume (muted status). + The volume adjustment takes effect simultaneously in the audio-left and audio-right channels. + The recommended volume range is [+10, +56]. + Within this range, the noises are lowest because only the analog gain is adjusted, + and the voice quality can be guaranteed. + *******************************************************************************************/ + iAcodecInputVol = 30; + if (ioctl(fdAcodec, ACODEC_SET_INPUT_VOL, &iAcodecInputVol)) + { + printf("%s: set acodec micin volume failed\n", __FUNCTION__); + return HI_FAILURE; + } + + } + + close(fdAcodec); + return ret; +} + + +/* config codec */ +HI_S32 SAMPLE_COMM_AUDIO_CfgAcodec(AIO_ATTR_S *pstAioAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_BOOL bCodecCfg = HI_FALSE; + + #ifdef HI_ACODEC_TYPE_INNER + /*** INNER AUDIO CODEC ***/ + s32Ret = SAMPLE_INNER_CODEC_CfgAudio(pstAioAttr->enSamplerate); + if (HI_SUCCESS != s32Ret) + { + printf("%s:SAMPLE_INNER_CODEC_CfgAudio failed\n", __FUNCTION__); + return s32Ret; + } + + bCodecCfg = HI_TRUE; + #endif + +#ifdef HI_ACODEC_TYPE_TLV320AIC31 + /*** ACODEC_TYPE_TLV320 ***/ + s32Ret = SAMPLE_Tlv320_CfgAudio(pstAioAttr->enWorkmode, pstAioAttr->enSamplerate); + if (HI_SUCCESS != s32Ret) + { + printf("%s: SAMPLE_Tlv320_CfgAudio failed\n", __FUNCTION__); + return s32Ret; + } + bCodecCfg = HI_TRUE; +#endif + + if (!bCodecCfg) + { + printf("Can not find the right codec.\n"); + return HI_FALSE; + } + return HI_SUCCESS; +} + +/****************************************************************************** +* function : get frame from Ai, send it to Aenc or Ao +******************************************************************************/ +void *SAMPLE_COMM_AUDIO_AiProc(void *parg) +{ + HI_S32 s32Ret; + HI_S32 AiFd; + SAMPLE_AI_S *pstAiCtl = (SAMPLE_AI_S *)parg; + AUDIO_FRAME_S stFrame; + AEC_FRAME_S stAecFrm; + fd_set read_fds; + struct timeval TimeoutVal; + AI_CHN_PARAM_S stAiChnPara; + + s32Ret = HI_MPI_AI_GetChnParam(pstAiCtl->AiDev, pstAiCtl->AiChn, &stAiChnPara); + if (HI_SUCCESS != s32Ret) + { + printf("%s: Get ai chn param failed\n", __FUNCTION__); + return NULL; + } + + stAiChnPara.u32UsrFrmDepth = 30; + + s32Ret = HI_MPI_AI_SetChnParam(pstAiCtl->AiDev, pstAiCtl->AiChn, &stAiChnPara); + if (HI_SUCCESS != s32Ret) + { + printf("%s: set ai chn param failed\n", __FUNCTION__); + return NULL; + } + + FD_ZERO(&read_fds); + AiFd = HI_MPI_AI_GetFd(pstAiCtl->AiDev, pstAiCtl->AiChn); + FD_SET(AiFd,&read_fds); + + while (pstAiCtl->bStart) + { + TimeoutVal.tv_sec = 1; + TimeoutVal.tv_usec = 0; + + FD_ZERO(&read_fds); + FD_SET(AiFd,&read_fds); + + s32Ret = select(AiFd+1, &read_fds, NULL, NULL, &TimeoutVal); + if (s32Ret < 0) + { + break; + } + else if (0 == s32Ret) + { + printf("%s: get ai frame select time out\n", __FUNCTION__); + break; + } + + if (FD_ISSET(AiFd, &read_fds)) + { + /* get frame from ai chn */ + memset(&stAecFrm, 0, sizeof(AEC_FRAME_S)); + s32Ret = HI_MPI_AI_GetFrame(pstAiCtl->AiDev, pstAiCtl->AiChn, &stFrame, &stAecFrm, HI_FALSE); + if (HI_SUCCESS != s32Ret ) + { + #if 0 + printf("%s: HI_MPI_AI_GetFrame(%d, %d), failed with %#x!\n",\ + __FUNCTION__, pstAiCtl->AiDev, pstAiCtl->AiChn, s32Ret); + pstAiCtl->bStart = HI_FALSE; + return NULL; + #else + continue; + #endif + } + + /* send frame to encoder */ + if (HI_TRUE == pstAiCtl->bSendAenc) + { + s32Ret = HI_MPI_AENC_SendFrame(pstAiCtl->AencChn, &stFrame, &stAecFrm); + if (HI_SUCCESS != s32Ret ) + { + printf("%s: HI_MPI_AENC_SendFrame(%d), failed with %#x!\n",\ + __FUNCTION__, pstAiCtl->AencChn, s32Ret); + pstAiCtl->bStart = HI_FALSE; + return NULL; + } + } + + /* send frame to ao */ + if (HI_TRUE == pstAiCtl->bSendAo) + { + s32Ret = HI_MPI_AO_SendFrame(pstAiCtl->AoDev, pstAiCtl->AoChn, &stFrame, 1000); + if (HI_SUCCESS != s32Ret ) + { + printf("%s: HI_MPI_AO_SendFrame(%d, %d), failed with %#x!\n",\ + __FUNCTION__, pstAiCtl->AoDev, pstAiCtl->AoChn, s32Ret); + pstAiCtl->bStart = HI_FALSE; + return NULL; + } + + } + + /* finally you must release the stream */ + s32Ret = HI_MPI_AI_ReleaseFrame(pstAiCtl->AiDev, pstAiCtl->AiChn, &stFrame, &stAecFrm); + if (HI_SUCCESS != s32Ret ) + { + printf("%s: HI_MPI_AI_ReleaseFrame(%d, %d), failed with %#x!\n",\ + __FUNCTION__, pstAiCtl->AiDev, pstAiCtl->AiChn, s32Ret); + pstAiCtl->bStart = HI_FALSE; + return NULL; + } + + } + } + + pstAiCtl->bStart = HI_FALSE; + return NULL; +} + +/****************************************************************************** +* function : get stream from Aenc, send it to Adec & save it to file +******************************************************************************/ +void *SAMPLE_COMM_AUDIO_AencProc(void *parg) +{ + HI_S32 s32Ret; + HI_S32 AencFd; + SAMPLE_AENC_S *pstAencCtl = (SAMPLE_AENC_S *)parg; + AUDIO_STREAM_S stStream; + fd_set read_fds; + struct timeval TimeoutVal; + + FD_ZERO(&read_fds); + AencFd = HI_MPI_AENC_GetFd(pstAencCtl->AeChn); + FD_SET(AencFd, &read_fds); + + while (pstAencCtl->bStart) + { + TimeoutVal.tv_sec = 1; + TimeoutVal.tv_usec = 0; + + FD_ZERO(&read_fds); + FD_SET(AencFd,&read_fds); + + s32Ret = select(AencFd+1, &read_fds, NULL, NULL, &TimeoutVal); + if (s32Ret < 0) + { + break; + } + else if (0 == s32Ret) + { + printf("%s: get aenc stream select time out\n", __FUNCTION__); + break; + } + + if (FD_ISSET(AencFd, &read_fds)) + { + /* get stream from aenc chn */ + s32Ret = HI_MPI_AENC_GetStream(pstAencCtl->AeChn, &stStream, HI_FALSE); + if (HI_SUCCESS != s32Ret ) + { + printf("%s: HI_MPI_AENC_GetStream(%d), failed with %#x!\n",\ + __FUNCTION__, pstAencCtl->AeChn, s32Ret); + pstAencCtl->bStart = HI_FALSE; + return NULL; + } + + /* send stream to decoder and play for testing */ + if (HI_TRUE == pstAencCtl->bSendAdChn) + { + s32Ret = HI_MPI_ADEC_SendStream(pstAencCtl->AdChn, &stStream, HI_TRUE); + if (HI_SUCCESS != s32Ret ) + { + printf("%s: HI_MPI_ADEC_SendStream(%d), failed with %#x!\n",\ + __FUNCTION__, pstAencCtl->AdChn, s32Ret); + pstAencCtl->bStart = HI_FALSE; + return NULL; + } + } + + /* save audio stream to file */ + fwrite(stStream.pStream,1,stStream.u32Len, pstAencCtl->pfd); + fflush(pstAencCtl->pfd); + + /* finally you must release the stream */ + s32Ret = HI_MPI_AENC_ReleaseStream(pstAencCtl->AeChn, &stStream); + if (HI_SUCCESS != s32Ret ) + { + printf("%s: HI_MPI_AENC_ReleaseStream(%d), failed with %#x!\n",\ + __FUNCTION__, pstAencCtl->AeChn, s32Ret); + pstAencCtl->bStart = HI_FALSE; + return NULL; + } + } + } + + fclose(pstAencCtl->pfd); + pstAencCtl->bStart = HI_FALSE; + return NULL; +} + +/****************************************************************************** +* function : get stream from file, and send it to Adec +******************************************************************************/ +void *SAMPLE_COMM_AUDIO_AdecProc(void *parg) +{ + HI_S32 s32Ret; + AUDIO_STREAM_S stAudioStream; + HI_U32 u32Len = 640; + HI_U32 u32ReadLen; + HI_S32 s32AdecChn; + HI_U8 *pu8AudioStream = NULL; + SAMPLE_ADEC_S *pstAdecCtl = (SAMPLE_ADEC_S *)parg; + FILE *pfd = pstAdecCtl->pfd; + s32AdecChn = pstAdecCtl->AdChn; + + pu8AudioStream = (HI_U8*)malloc(sizeof(HI_U8)*MAX_AUDIO_STREAM_LEN); + if (NULL == pu8AudioStream) + { + printf("%s: malloc failed!\n", __FUNCTION__); + return NULL; + } + + while (HI_TRUE == pstAdecCtl->bStart) + { + /* read from file */ + stAudioStream.pStream = pu8AudioStream; + u32ReadLen = fread(stAudioStream.pStream, 1, u32Len, pfd); + if (u32ReadLen <= 0) + { + s32Ret = HI_MPI_ADEC_SendEndOfStream(s32AdecChn, HI_FALSE); + if (HI_SUCCESS != s32Ret) + { + printf("%s: HI_MPI_ADEC_SendEndOfStream failed!\n", __FUNCTION__); + } + fseek(pfd, 0, SEEK_SET);/*read file again*/ + continue; + } + + /* here only demo adec streaming sending mode, but pack sending mode is commended */ + stAudioStream.u32Len = u32ReadLen; + s32Ret = HI_MPI_ADEC_SendStream(s32AdecChn, &stAudioStream, HI_TRUE); + if(HI_SUCCESS != s32Ret) + { + printf("%s: HI_MPI_ADEC_SendStream(%d) failed with %#x!\n",\ + __FUNCTION__, s32AdecChn, s32Ret); + break; + } + } + + free(pu8AudioStream); + pu8AudioStream = NULL; + fclose(pfd); + pstAdecCtl->bStart = HI_FALSE; + return NULL; +} + +/****************************************************************************** +* function : set ao volume +******************************************************************************/ +void *SAMPLE_COMM_AUDIO_AoVolProc(void *parg) +{ + HI_S32 s32Ret; + HI_S32 s32Volume; + AUDIO_DEV AoDev; + AUDIO_FADE_S stFade; + SAMPLE_AO_S *pstAoCtl = (SAMPLE_AO_S *)parg; + AoDev = pstAoCtl->AoDev; + + while(pstAoCtl->bStart) + { + for(s32Volume = 0; s32Volume <=6; s32Volume++) + { + s32Ret = HI_MPI_AO_SetVolume( AoDev, s32Volume); + if(HI_SUCCESS != s32Ret) + { + printf("%s: HI_MPI_AO_SetVolume(%d), failed with %#x!\n",\ + __FUNCTION__, AoDev, s32Ret); + } + printf("\rset volume %d ", s32Volume); + fflush(stdout); + sleep(2); + } + + for(s32Volume = 5; s32Volume >=-15; s32Volume--) + { + s32Ret = HI_MPI_AO_SetVolume( AoDev, s32Volume); + if(HI_SUCCESS != s32Ret) + { + printf("%s: HI_MPI_AO_SetVolume(%d), failed with %#x!\n",\ + __FUNCTION__, AoDev, s32Ret); + } + printf("\rset volume %d ", s32Volume); + fflush(stdout); + sleep(2); + } + + for (s32Volume = -14; s32Volume <= 0; s32Volume++) + { + s32Ret = HI_MPI_AO_SetVolume( AoDev, s32Volume); + if(HI_SUCCESS != s32Ret) + { + printf("%s: HI_MPI_AO_SetVolume(%d), failed with %#x!\n",\ + __FUNCTION__, AoDev, s32Ret); + } + printf("\rset volume %d ", s32Volume); + fflush(stdout); + sleep(2); + } + + stFade.bFade = HI_TRUE; + stFade.enFadeInRate = AUDIO_FADE_RATE_128; + stFade.enFadeOutRate = AUDIO_FADE_RATE_128; + + s32Ret = HI_MPI_AO_SetMute(AoDev, HI_TRUE, &stFade); + if(HI_SUCCESS != s32Ret) + { + printf("%s: HI_MPI_AO_SetVolume(%d), failed with %#x!\n",\ + __FUNCTION__, AoDev, s32Ret); + } + printf("\rset Ao mute "); + fflush(stdout); + sleep(2); + + s32Ret = HI_MPI_AO_SetMute(AoDev, HI_FALSE, NULL); + if(HI_SUCCESS != s32Ret) + { + printf("%s: HI_MPI_AO_SetVolume(%d), failed with %#x!\n",\ + __FUNCTION__, AoDev, s32Ret); + } + printf("\rset Ao unmute "); + fflush(stdout); + sleep(2); + } + return NULL; +} + +/****************************************************************************** +* function : Create the thread to get frame from ai and send to ao +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdAiAo(AUDIO_DEV AiDev, AI_CHN AiChn, AUDIO_DEV AoDev, AO_CHN AoChn) +{ + SAMPLE_AI_S *pstAi = NULL; + + pstAi = &gs_stSampleAi[AiDev*AIO_MAX_CHN_NUM + AiChn]; + pstAi->bSendAenc = HI_FALSE; + pstAi->bSendAo = HI_TRUE; + pstAi->bStart= HI_TRUE; + pstAi->AiDev = AiDev; + pstAi->AiChn = AiChn; + pstAi->AoDev = AoDev; + pstAi->AoChn = AoChn; + + pthread_create(&pstAi->stAiPid, 0, SAMPLE_COMM_AUDIO_AiProc, pstAi); + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Create the thread to get frame from ai and send to aenc +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdAiAenc(AUDIO_DEV AiDev, AI_CHN AiChn, AENC_CHN AeChn) +{ + SAMPLE_AI_S *pstAi = NULL; + + pstAi = &gs_stSampleAi[AiDev*AIO_MAX_CHN_NUM + AiChn]; + pstAi->bSendAenc = HI_TRUE; + pstAi->bSendAo = HI_FALSE; + pstAi->bStart= HI_TRUE; + pstAi->AiDev = AiDev; + pstAi->AiChn = AiChn; + pstAi->AencChn = AeChn; + pthread_create(&pstAi->stAiPid, 0, SAMPLE_COMM_AUDIO_AiProc, pstAi); + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Create the thread to get stream from aenc and send to adec +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdAencAdec(AENC_CHN AeChn, ADEC_CHN AdChn, FILE *pAecFd) +{ + SAMPLE_AENC_S *pstAenc = NULL; + + if (NULL == pAecFd) + { + return HI_FAILURE; + } + + pstAenc = &gs_stSampleAenc[AeChn]; + pstAenc->AeChn = AeChn; + pstAenc->AdChn = AdChn; + pstAenc->bSendAdChn = HI_TRUE; + pstAenc->pfd = pAecFd; + pstAenc->bStart = HI_TRUE; + pthread_create(&pstAenc->stAencPid, 0, SAMPLE_COMM_AUDIO_AencProc, pstAenc); + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Create the thread to get stream from file and send to adec +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdFileAdec(ADEC_CHN AdChn, FILE *pAdcFd) +{ + SAMPLE_ADEC_S *pstAdec = NULL; + + if (NULL == pAdcFd) + { + return HI_FAILURE; + } + + pstAdec = &gs_stSampleAdec[AdChn]; + pstAdec->AdChn = AdChn; + pstAdec->pfd = pAdcFd; + pstAdec->bStart = HI_TRUE; + pthread_create(&pstAdec->stAdPid, 0, SAMPLE_COMM_AUDIO_AdecProc, pstAdec); + + return HI_SUCCESS; +} + + +/****************************************************************************** +* function : Create the thread to set Ao volume +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_CreatTrdAoVolCtrl(AUDIO_DEV AoDev) +{ + SAMPLE_AO_S *pstAoCtl = NULL; + + pstAoCtl = &gs_stSampleAo[AoDev]; + pstAoCtl->AoDev = AoDev; + pstAoCtl->bStart = HI_TRUE; + pthread_create(&pstAoCtl->stAoPid, 0, SAMPLE_COMM_AUDIO_AoVolProc, pstAoCtl); + + return HI_SUCCESS; +} + + +/****************************************************************************** +* function : Destory the thread to get frame from ai and send to ao or aenc +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_DestoryTrdAi(AUDIO_DEV AiDev, AI_CHN AiChn) +{ + SAMPLE_AI_S *pstAi = NULL; + + pstAi = &gs_stSampleAi[AiDev*AIO_MAX_CHN_NUM + AiChn]; + if (pstAi->bStart) + { + pstAi->bStart = HI_FALSE; + //pthread_cancel(pstAi->stAiPid); + pthread_join(pstAi->stAiPid, 0); + } + + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Destory the thread to get stream from aenc and send to adec +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_DestoryTrdAencAdec(AENC_CHN AeChn) +{ + SAMPLE_AENC_S *pstAenc = NULL; + + pstAenc = &gs_stSampleAenc[AeChn]; + if (pstAenc->bStart) + { + pstAenc->bStart = HI_FALSE; + //pthread_cancel(pstAenc->stAencPid); + pthread_join(pstAenc->stAencPid, 0); + } + + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Destory the thread to get stream from file and send to adec +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_DestoryTrdFileAdec(ADEC_CHN AdChn) +{ + SAMPLE_ADEC_S *pstAdec = NULL; + + pstAdec = &gs_stSampleAdec[AdChn]; + if (pstAdec->bStart) + { + pstAdec->bStart = HI_FALSE; + //pthread_cancel(pstAdec->stAdPid); + pthread_join(pstAdec->stAdPid, 0); + } + + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Destory the thread to set Ao volume +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_DestoryTrdAoVolCtrl(AUDIO_DEV AoDev) +{ + SAMPLE_AO_S* pstAoCtl = NULL; + + pstAoCtl = &gs_stSampleAo[AoDev]; + if (pstAoCtl->bStart) + { + pstAoCtl->bStart = HI_FALSE; + pthread_cancel(pstAoCtl->stAoPid); + pthread_join(pstAoCtl->stAoPid, 0); + } + + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Ao bind Adec +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_AoBindAdec(AUDIO_DEV AoDev, AO_CHN AoChn, ADEC_CHN AdChn) +{ + MPP_CHN_S stSrcChn,stDestChn; + + stSrcChn.enModId = HI_ID_ADEC; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = AdChn; + stDestChn.enModId = HI_ID_AO; + stDestChn.s32DevId = AoDev; + stDestChn.s32ChnId = AoChn; + + return HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); +} + +/****************************************************************************** +* function : Ao unbind Adec +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_AoUnbindAdec(AUDIO_DEV AoDev, AO_CHN AoChn, ADEC_CHN AdChn) +{ + MPP_CHN_S stSrcChn,stDestChn; + + stSrcChn.enModId = HI_ID_ADEC; + stSrcChn.s32ChnId = AdChn; + stSrcChn.s32DevId = 0; + stDestChn.enModId = HI_ID_AO; + stDestChn.s32DevId = AoDev; + stDestChn.s32ChnId = AoChn; + + return HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn); +} + +/****************************************************************************** +* function : Ao bind Ai +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_AoBindAi(AUDIO_DEV AiDev, AI_CHN AiChn, AUDIO_DEV AoDev, AO_CHN AoChn) +{ + MPP_CHN_S stSrcChn,stDestChn; + + stSrcChn.enModId = HI_ID_AI; + stSrcChn.s32ChnId = AiChn; + stSrcChn.s32DevId = AiDev; + stDestChn.enModId = HI_ID_AO; + stDestChn.s32DevId = AoDev; + stDestChn.s32ChnId = AoChn; + + return HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); +} + +/****************************************************************************** +* function : Ao unbind Ai +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_AoUnbindAi(AUDIO_DEV AiDev, AI_CHN AiChn, AUDIO_DEV AoDev, AO_CHN AoChn) +{ + MPP_CHN_S stSrcChn,stDestChn; + + stSrcChn.enModId = HI_ID_AI; + stSrcChn.s32ChnId = AiChn; + stSrcChn.s32DevId = AiDev; + stDestChn.enModId = HI_ID_AO; + stDestChn.s32DevId = AoDev; + stDestChn.s32ChnId = AoChn; + + return HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn); +} + +/****************************************************************************** +* function : Aenc bind Ai +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_AencBindAi(AUDIO_DEV AiDev, AI_CHN AiChn, AENC_CHN AeChn) +{ + MPP_CHN_S stSrcChn,stDestChn; + + stSrcChn.enModId = HI_ID_AI; + stSrcChn.s32DevId = AiDev; + stSrcChn.s32ChnId = AiChn; + stDestChn.enModId = HI_ID_AENC; + stDestChn.s32DevId = 0; + stDestChn.s32ChnId = AeChn; + + return HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); +} + +/****************************************************************************** +* function : Aenc unbind Ai +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_AencUnbindAi(AUDIO_DEV AiDev, AI_CHN AiChn, AENC_CHN AeChn) +{ + MPP_CHN_S stSrcChn,stDestChn; + + stSrcChn.enModId = HI_ID_AI; + stSrcChn.s32DevId = AiDev; + stSrcChn.s32ChnId = AiChn; + stDestChn.enModId = HI_ID_AENC; + stDestChn.s32DevId = 0; + stDestChn.s32ChnId = AeChn; + + return HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn); +} + +#if 0 +/****************************************************************************** +* function : Acodec config [ s32Samplerate(0:8k, 1:16k ) ] +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_CfgAcodec(AUDIO_SAMPLE_RATE_E enSample, HI_BOOL bMicIn) +{ + HI_S32 fdAcodec = -1; + ACODEC_CTRL stAudioctrl = {0}; + + fdAcodec = open(ACODEC_FILE,O_RDWR); + if (fdAcodec < 0) + { + printf("%s: can't open acodec,%s\n", __FUNCTION__, ACODEC_FILE); + return HI_FAILURE; + } + + if ((AUDIO_SAMPLE_RATE_8000 == enSample) + || (AUDIO_SAMPLE_RATE_11025 == enSample) + || (AUDIO_SAMPLE_RATE_12000 == enSample)) + { + stAudioctrl.i2s_fs_sel = 0x18; + } + else if ((AUDIO_SAMPLE_RATE_16000 == enSample) + || (AUDIO_SAMPLE_RATE_22050 == enSample) + || (AUDIO_SAMPLE_RATE_24000 == enSample)) + { + stAudioctrl.i2s_fs_sel = 0x19; + } + else if ((AUDIO_SAMPLE_RATE_32000 == enSample) + || (AUDIO_SAMPLE_RATE_44100 == enSample) + || (AUDIO_SAMPLE_RATE_48000 == enSample)) + { + stAudioctrl.i2s_fs_sel = 0x1a; + } + else + { + printf("%s: not support enSample:%d\n", __FUNCTION__, enSample); + return HI_FAILURE; + } + + if (ioctl(fdAcodec, ACODEC_SET_I2S1_FS, &stAudioctrl)) + { + printf("%s: set acodec sample rate failed\n", __FUNCTION__); + return HI_FAILURE; + } + + if (HI_TRUE == bMicIn) + { + stAudioctrl.mixer_mic_ctrl = ACODEC_MIXER_MICIN; + if (ioctl(fdAcodec, ACODEC_SET_MIXER_MIC, &stAudioctrl)) + { + printf("%s: set acodec micin failed\n", __FUNCTION__); + return HI_FAILURE; + } + + /* set volume plus (0~0x1f,default 0) */ + stAudioctrl.gain_mic = 0; + if (ioctl(fdAcodec, ACODEC_SET_GAIN_MICL, &stAudioctrl)) + { + printf("%s: set acodec micin volume failed\n", __FUNCTION__); + return HI_FAILURE; + } + if (ioctl(fdAcodec, ACODEC_SET_GAIN_MICR, &stAudioctrl)) + { + printf("%s: set acodec micin volume failed\n", __FUNCTION__); + return HI_FAILURE; + } + } + close(fdAcodec); + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Disable Tlv320 +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_DisableAcodec() +{ + return SAMPLE_COMM_AUDIO_CfgAcodec(AUDIO_SAMPLE_RATE_48000, HI_FALSE); +} + +#endif + +/****************************************************************************** +* function : Start Ai +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_StartAi(AUDIO_DEV AiDevId, HI_S32 s32AiChnCnt, + AIO_ATTR_S *pstAioAttr, AUDIO_SAMPLE_RATE_E enOutSampleRate, HI_BOOL bResampleEn, AI_VQE_CONFIG_S *pstAiVqeAttr) +{ + HI_S32 i; + HI_S32 s32Ret; + + s32Ret = HI_MPI_AI_SetPubAttr(AiDevId, pstAioAttr); + if (s32Ret) + { + printf("%s: HI_MPI_AI_SetPubAttr(%d) failed with %#x\n", __FUNCTION__, AiDevId, s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_AI_Enable(AiDevId); + if (s32Ret) + { + printf("%s: HI_MPI_AI_Enable(%d) failed with %#x\n", __FUNCTION__, AiDevId, s32Ret); + return s32Ret; + } + + for (i=0; ienSoundmode + 1)); + if (s32Ret) + { + printf("%s: HI_MPI_AI_EnableChn(%d,%d) failed with %#x\n", __FUNCTION__, AiDevId, i, s32Ret); + return s32Ret; + } + + if (HI_TRUE == bResampleEn) + { + s32Ret = HI_MPI_AI_EnableReSmp(AiDevId, i, enOutSampleRate); + if (s32Ret) + { + printf("%s: HI_MPI_AI_EnableReSmp(%d,%d) failed with %#x\n", __FUNCTION__, AiDevId, i, s32Ret); + return s32Ret; + } + } + + if (NULL != pstAiVqeAttr) + { + s32Ret = HI_MPI_AI_SetVqeAttr(AiDevId, i, SAMPLE_AUDIO_AO_DEV, i, pstAiVqeAttr); + if (s32Ret) + { + printf("%s: HI_MPI_AI_SetVqeAttr(%d,%d) failed with %#x\n", __FUNCTION__, AiDevId, i, s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_AI_EnableVqe(AiDevId, i); + if (s32Ret) + { + printf("%s: HI_MPI_AI_EnableVqe(%d,%d) failed with %#x\n", __FUNCTION__, AiDevId, i, s32Ret); + return s32Ret; + } + } + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Stop Ai +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_StopAi(AUDIO_DEV AiDevId, HI_S32 s32AiChnCnt, + HI_BOOL bResampleEn, HI_BOOL bVqeEn) +{ + HI_S32 i; + HI_S32 s32Ret; + + for (i=0; ienSoundmode + 1)); + if (HI_SUCCESS != s32Ret) + { + printf("%s: HI_MPI_AO_EnableChn(%d) failed with %#x!\n", __FUNCTION__, i, s32Ret); + return HI_FAILURE; + } + + if (HI_TRUE == bResampleEn) + { + s32Ret = HI_MPI_AO_DisableReSmp(AoDevId, i); + s32Ret |= HI_MPI_AO_EnableReSmp(AoDevId, i, enInSampleRate); + if (HI_SUCCESS != s32Ret) + { + printf("%s: HI_MPI_AO_EnableReSmp(%d,%d) failed with %#x!\n", __FUNCTION__, AoDevId, i, s32Ret); + return HI_FAILURE; + } + } + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : Stop Ao +******************************************************************************/ +HI_S32 SAMPLE_COMM_AUDIO_StopAo(AUDIO_DEV AoDevId, HI_S32 s32AoChnCnt, HI_BOOL bResampleEn) +{ + HI_S32 i; + HI_S32 s32Ret; + + for (i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "sample_comm.h" + +static pthread_t gs_IspPid = 0; +static HI_BOOL gbIspInited = HI_FALSE; + + +/****************************************************************************** +* funciton : ISP init +******************************************************************************/ +HI_S32 SAMPLE_COMM_ISP_Init(WDR_MODE_E enWDRMode) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + ISP_PUB_ATTR_S stPubAttr; + ALG_LIB_S stLib; + +#if 0 + /* 0. set cmos iniparser file path */ + s32Ret = sensor_set_inifile_path("configs/"); + if (s32Ret != HI_SUCCESS) + { + printf("%s: set cmos iniparser file path failed with %#x!\n", \ + __FUNCTION__, s32Ret); + return s32Ret; + } +#endif + + /* 1. sensor register callback */ + s32Ret = sensor_register_callback(); + if (s32Ret != HI_SUCCESS) + { + printf("%s: sensor_register_callback failed with %#x!\n", \ + __FUNCTION__, s32Ret); + return s32Ret; + } + + /* 2. register hisi ae lib */ + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AE_LIB_NAME); + s32Ret = HI_MPI_AE_Register(IspDev, &stLib); + if (s32Ret != HI_SUCCESS) + { + printf("%s: HI_MPI_AE_Register failed!\n", __FUNCTION__); + return s32Ret; + } + + /* 3. register hisi awb lib */ + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AWB_LIB_NAME); + s32Ret = HI_MPI_AWB_Register(IspDev, &stLib); + if (s32Ret != HI_SUCCESS) + { + printf("%s: HI_MPI_AWB_Register failed!\n", __FUNCTION__); + return s32Ret; + } + + /* 4. register hisi af lib */ + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AF_LIB_NAME); + s32Ret = HI_MPI_AF_Register(IspDev, &stLib); + if (s32Ret != HI_SUCCESS) + { + printf("%s: HI_MPI_AF_Register failed!\n", __FUNCTION__); + return s32Ret; + } + + /* 5. isp mem init */ + s32Ret = HI_MPI_ISP_MemInit(IspDev); + if (s32Ret != HI_SUCCESS) + { + printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__); + return s32Ret; + } + + /* 6. isp set WDR mode */ + ISP_WDR_MODE_S stWdrMode; + stWdrMode.enWDRMode = enWDRMode; + s32Ret = HI_MPI_ISP_SetWDRMode(0, &stWdrMode); + if (HI_SUCCESS != s32Ret) + { + printf("start ISP WDR failed!\n"); + return s32Ret; + } + + /* 7. isp set pub attributes */ + /* note : different sensor, different ISP_PUB_ATTR_S define. + if the sensor you used is different, you can change + ISP_PUB_ATTR_S definition */ + + switch(SENSOR_TYPE) + { + case APTINA_9M034_DC_720P_30FPS: + case APTINA_AR0130_DC_720P_30FPS: + stPubAttr.enBayer = BAYER_GRBG; + stPubAttr.f32FrameRate = 30; + stPubAttr.stWndRect.s32X = 0; + stPubAttr.stWndRect.s32Y = 0; + stPubAttr.stWndRect.u32Width = 1280; + stPubAttr.stWndRect.u32Height = 720; + break; + + case SONY_IMX122_DC_1080P_30FPS: + stPubAttr.enBayer = BAYER_RGGB; + stPubAttr.f32FrameRate = 30; + stPubAttr.stWndRect.s32X = 200; + stPubAttr.stWndRect.s32Y = 20; + stPubAttr.stWndRect.u32Width = 1920; + stPubAttr.stWndRect.u32Height = 1080; + break; + + case SONY_IMX122_DC_720P_30FPS: + stPubAttr.enBayer = BAYER_RGGB; + stPubAttr.f32FrameRate = 30; + stPubAttr.stWndRect.s32X = 200; + stPubAttr.stWndRect.s32Y = 20; + stPubAttr.stWndRect.u32Width = 1280; + stPubAttr.stWndRect.u32Height = 720; + break; + + case APTINA_AR0230_HISPI_1080P_30FPS: + stPubAttr.enBayer = BAYER_GRBG; + stPubAttr.f32FrameRate = 30; + stPubAttr.stWndRect.s32X = 0; + stPubAttr.stWndRect.s32Y = 0; + stPubAttr.stWndRect.u32Width = 1920; + stPubAttr.stWndRect.u32Height = 1080; + break; + + default: + stPubAttr.enBayer = BAYER_GRBG; + stPubAttr.f32FrameRate = 30; + stPubAttr.stWndRect.s32X = 0; + stPubAttr.stWndRect.s32Y = 0; + stPubAttr.stWndRect.u32Width = 1920; + stPubAttr.stWndRect.u32Height = 1080; + break; + } + + s32Ret = HI_MPI_ISP_SetPubAttr(IspDev, &stPubAttr); + if (s32Ret != HI_SUCCESS) + { + printf("%s: HI_MPI_ISP_SetPubAttr failed with %#x!\n", __FUNCTION__, s32Ret); + return s32Ret; + } + + /* 8. isp init */ + s32Ret = HI_MPI_ISP_Init(IspDev); + if (s32Ret != HI_SUCCESS) + { + printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__); + return s32Ret; + } + + gbIspInited = HI_TRUE; + + return HI_SUCCESS; +} + +HI_VOID* Test_ISP_Run(HI_VOID *param) +{ + ISP_DEV IspDev = 0; + HI_MPI_ISP_Run(IspDev); + + return HI_NULL; +} + +/****************************************************************************** +* funciton : ISP Run +******************************************************************************/ +HI_S32 SAMPLE_COMM_ISP_Run() +{ +#if 1 + if (0 != pthread_create(&gs_IspPid, 0, (void* (*)(void*))Test_ISP_Run, NULL)) + { + printf("%s: create isp running thread failed!\n", __FUNCTION__); + return HI_FAILURE; + } +#else + /* configure thread priority */ + if (1) + { + #include + + pthread_attr_t attr; + struct sched_param param; + int newprio = 50; + + pthread_attr_init(&attr); + + if (1) + { + int policy = 0; + int min, max; + + pthread_attr_getschedpolicy(&attr, &policy); + printf("-->default thread use policy is %d --<\n", policy); + + pthread_attr_setschedpolicy(&attr, SCHED_RR); + pthread_attr_getschedpolicy(&attr, &policy); + printf("-->current thread use policy is %d --<\n", policy); + + switch (policy) + { + case SCHED_FIFO: + printf("-->current thread use policy is SCHED_FIFO --<\n"); + break; + + case SCHED_RR: + printf("-->current thread use policy is SCHED_RR --<\n"); + break; + + case SCHED_OTHER: + printf("-->current thread use policy is SCHED_OTHER --<\n"); + break; + + default: + printf("-->current thread use policy is UNKNOW --<\n"); + break; + } + + min = sched_get_priority_min(policy); + max = sched_get_priority_max(policy); + + printf("-->current thread policy priority range (%d ~ %d) --<\n", min, max); + } + + pthread_attr_getschedparam(&attr, ¶m); + + printf("-->default isp thread priority is %d , next be %d --<\n", param.sched_priority, newprio); + param.sched_priority = newprio; + pthread_attr_setschedparam(&attr, ¶m); + + if (0 != pthread_create(&gs_IspPid, &attr, (void* (*)(void*))HI_MPI_ISP_Run, NULL)) + { + printf("%s: create isp running thread failed!\n", __FUNCTION__); + return HI_FAILURE; + } + + pthread_attr_destroy(&attr); + } +#endif + + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : change between linear and wdr mode +******************************************************************************/ +HI_S32 SAMPLE_COMM_ISP_ChangeSensorMode(HI_U8 u8Mode) +{ + ISP_DEV IspDev = 0; + HI_S32 s32Ret; + + ISP_WDR_MODE_S stWDRMode; + stWDRMode.enWDRMode = u8Mode; + s32Ret = HI_MPI_ISP_SetWDRMode(IspDev, &stWDRMode); + if (s32Ret != HI_SUCCESS) + { + printf("%s: HI_MPI_ISP_SetWDRMode failed with %#x!\n", + __FUNCTION__, s32Ret); + return s32Ret; + } + + return HI_SUCCESS; +} + + +/****************************************************************************** +* funciton : stop ISP, and stop isp thread +******************************************************************************/ +HI_VOID SAMPLE_COMM_ISP_Stop() +{ + ISP_DEV IspDev = 0; + + if (!gbIspInited) + { + return; + } + + HI_MPI_ISP_Exit(IspDev); + if (gs_IspPid) + { + pthread_join(gs_IspPid, 0); + gs_IspPid = 0; + } + gbIspInited = HI_FALSE; + return; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + diff --git a/device/mpp/sample/common/sample_comm_ive.c b/device/mpp/sample/common/sample_comm_ive.c new file mode 100644 index 0000000..e649d02 --- /dev/null +++ b/device/mpp/sample/common/sample_comm_ive.c @@ -0,0 +1,1405 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_ive.h" +#include "hi_comm_vgs.h" +#include "hi_comm_vi.h" +#include "hi_comm_vo.h" + +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_vi.h" +#include "mpi_vo.h" + +#include "mpi_ive.h" +#include "mpi_vgs.h" + +#include "sample_comm_ive.h" + +static HI_BOOL bMpiInit = HI_FALSE; + +HI_U16 SAMPLE_COMM_IVE_CalcStride(HI_U16 u16Width, HI_U8 u8Align) +{ + return (u16Width + (u8Align - u16Width%u8Align)%u8Align); +} + +static HI_S32 SAMPLE_IVE_MPI_Init(HI_VOID) +{ + HI_S32 s32Ret; + VB_CONF_S struVbConf; + MPP_SYS_CONF_S struSysConf; + + HI_MPI_SYS_Exit(); + HI_MPI_VB_Exit(); + + memset(&struVbConf,0,sizeof(VB_CONF_S)); + struVbConf.u32MaxPoolCnt = 128; + struVbConf.astCommPool[0].u32BlkSize = 1920*1080*3/2; + struVbConf.astCommPool[0].u32BlkCnt = 4; + s32Ret = HI_MPI_VB_SetConf(&struVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VB_SetConf fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + s32Ret = HI_MPI_VB_Init(); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VB_Init fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + struSysConf.u32AlignWidth = 64; + s32Ret = HI_MPI_SYS_SetConf(&struSysConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetConf fail,Error(%#x)\n",s32Ret); + (HI_VOID)HI_MPI_VB_Exit(); + return s32Ret; + } + + s32Ret = HI_MPI_SYS_Init(); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_Init fail,Error(%#x)\n",s32Ret); + (HI_VOID)HI_MPI_VB_Exit(); + return s32Ret; + } + + return HI_SUCCESS; +} + + +HI_VOID SAMPLE_COMM_IVE_CheckIveMpiInit(HI_VOID) +{ + if(HI_FALSE == bMpiInit) + { + if (SAMPLE_IVE_MPI_Init()) + { + SAMPLE_PRT("Ive mpi init failed!\n"); + exit(-1); + } + bMpiInit = HI_TRUE; + } +} +HI_S32 SAMPLE_COMM_IVE_IveMpiExit(HI_VOID) +{ + bMpiInit = HI_FALSE; + if (HI_MPI_SYS_Exit()) + { + SAMPLE_PRT("Sys exit failed!\n"); + return HI_FAILURE; + } + + if (HI_MPI_VB_Exit()) + { + SAMPLE_PRT("Vb exit failed!\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_COMM_VGS_AddDrawRectJob(VGS_HANDLE VgsHandle, IVE_IMAGE_S *pstSrc, IVE_IMAGE_S *pstDst, + RECT_S *pstRect, HI_U16 u16RectNum) +{ + HI_S32 s32Ret = HI_SUCCESS; + VGS_TASK_ATTR_S stVgsTask; + VGS_ADD_COVER_S stVgsCover; + HI_U16 i; + + memset(&stVgsTask, 0, sizeof(VGS_TASK_ATTR_S)); + + stVgsTask.stImgIn.stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVgsTask.stImgIn.stVFrame.enCompressMode = COMPRESS_MODE_NONE; + stVgsTask.stImgIn.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR; + stVgsTask.stImgIn.stVFrame.u32Field = VIDEO_FIELD_FRAME; + stVgsTask.stImgIn.stVFrame.u32Width = pstSrc->u16Width; + stVgsTask.stImgIn.stVFrame.u32Height = pstSrc->u16Height; + stVgsTask.stImgIn.stVFrame.u32PhyAddr[0] = pstSrc->u32PhyAddr[0]; + + stVgsTask.stImgIn.stVFrame.u32PhyAddr[1] = pstSrc->u32PhyAddr[1]; + stVgsTask.stImgIn.stVFrame.pVirAddr[0] = pstSrc->pu8VirAddr[0]; + stVgsTask.stImgIn.stVFrame.pVirAddr[1] = pstSrc->pu8VirAddr[1]; + + stVgsTask.stImgIn.stVFrame.u32Stride[0] = pstSrc->u16Stride[0]; + stVgsTask.stImgIn.stVFrame.u32Stride[1] = pstSrc->u16Stride[1]; + stVgsTask.stImgIn.stVFrame.u64pts = 12; + stVgsTask.stImgIn.stVFrame.u32TimeRef = 24; + + stVgsTask.stImgOut.stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVgsTask.stImgOut.stVFrame.enCompressMode = COMPRESS_MODE_NONE; + stVgsTask.stImgOut.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR; + stVgsTask.stImgOut.stVFrame.u32Field = VIDEO_FIELD_FRAME; + stVgsTask.stImgOut.stVFrame.u32Width = pstDst->u16Width; + stVgsTask.stImgOut.stVFrame.u32Height = pstDst->u16Height; + stVgsTask.stImgOut.stVFrame.u32PhyAddr[0] = pstDst->u32PhyAddr[0]; + + stVgsTask.stImgOut.stVFrame.u32PhyAddr[1] = pstDst->u32PhyAddr[1]; + stVgsTask.stImgOut.stVFrame.pVirAddr[0] = pstDst->pu8VirAddr[0]; + stVgsTask.stImgOut.stVFrame.pVirAddr[1] = pstDst->pu8VirAddr[1]; + + stVgsTask.stImgOut.stVFrame.u32Stride[0] = pstDst->u16Stride[0]; + stVgsTask.stImgOut.stVFrame.u32Stride[1] = pstDst->u16Stride[1]; + stVgsTask.stImgOut.stVFrame.u64pts = 12; + stVgsTask.stImgOut.stVFrame.u32TimeRef = 24; + + stVgsCover.enCoverType = COVER_RECT; + for(i = 0; i < u16RectNum;i++) + { + stVgsCover.stDstRect.s32X = (pstRect[i].s32X / 2) * 2; + stVgsCover.stDstRect.s32Y = (pstRect[i].s32Y / 2) * 2; + stVgsCover.stDstRect.u32Width = (pstRect[i].u32Width / 2) * 2; + stVgsCover.stDstRect.u32Height = (pstRect[i].u32Height / 2) * 2; + stVgsCover.u32Color = 0x0000FF00; + if(stVgsCover.stDstRect.s32X + stVgsCover.stDstRect.u32Width < stVgsTask.stImgOut.stVFrame.u32Width + && stVgsCover.stDstRect.s32Y + stVgsCover.stDstRect.u32Height < stVgsTask.stImgOut.stVFrame.u32Height) + { + s32Ret = HI_MPI_VGS_AddCoverTask(VgsHandle,&stVgsTask,&stVgsCover); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VGS_AddCoverTask fail,Error(%#x)\n",s32Ret); + HI_MPI_VGS_CancelJob(VgsHandle); + return s32Ret; + } + } + + } + + return s32Ret; +} + +HI_S32 SAMPLE_COMM_VGS_FillRect(VIDEO_FRAME_INFO_S *pstFrmInfo, SAMPLE_RECT_ARRAY_S *pstRect,HI_U32 u32Color) +{ + VGS_HANDLE VgsHandle; + HI_S32 s32Ret = HI_SUCCESS; + HI_U16 i; + VGS_TASK_ATTR_S stVgsTask; + VGS_ADD_COVER_S stVgsAddCover; + + if(0 == pstRect->u16Num) + { + return s32Ret; + } + s32Ret = HI_MPI_VGS_BeginJob(&VgsHandle); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Vgs begin job fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + + memcpy(&stVgsTask.stImgIn,pstFrmInfo,sizeof(VIDEO_FRAME_INFO_S)); + memcpy(&stVgsTask.stImgOut,pstFrmInfo,sizeof(VIDEO_FRAME_INFO_S)); + + stVgsAddCover.enCoverType = COVER_QUAD_RANGLE; + stVgsAddCover.u32Color = u32Color; + for(i = 0;i < pstRect->u16Num;i++) + { + stVgsAddCover.stQuadRangle.bSolid = HI_FALSE; + stVgsAddCover.stQuadRangle.u32Thick = 2; + memcpy(stVgsAddCover.stQuadRangle.stPoint,pstRect->astRect[i].astPoint,sizeof(pstRect->astRect[i].astPoint)); + s32Ret = HI_MPI_VGS_AddCoverTask(VgsHandle, &stVgsTask, &stVgsAddCover); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VGS_AddCoverTask fail,Error(%#x)\n",s32Ret); + HI_MPI_VGS_CancelJob(VgsHandle); + return s32Ret; + } + + } + + s32Ret = HI_MPI_VGS_EndJob(VgsHandle); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VGS_EndJob fail,Error(%#x)\n",s32Ret); + HI_MPI_VGS_CancelJob(VgsHandle); + return s32Ret; + } + return s32Ret; + +} + +HI_S32 SAMPLE_COMM_IVE_ReadFile(IVE_IMAGE_S *pstImg, FILE *pFp) +{ + HI_U16 y; + HI_U8 *pU8; + HI_U16 height; + HI_U16 width; + HI_U16 loop; + + (HI_VOID)fgetc(pFp); + if (feof(pFp)) + { + SAMPLE_PRT("end of file!\n"); + fseek(pFp, 0 , SEEK_SET); + } + else + { + fseek(pFp, -1 , SEEK_CUR); + } + + height = pstImg->u16Height; + width = pstImg->u16Width; + + switch(pstImg->enType) + { + case IVE_IMAGE_TYPE_U8C1: + { + pU8 = pstImg->pu8VirAddr[0]; + for (y = 0; y < height; y++) + { + if ( 1 != fread(pU8,width,1,pFp)) + { + SAMPLE_PRT("Read file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0]; + } + } + break; + case IVE_IMAGE_TYPE_YUV420SP: + { + pU8 = pstImg->pu8VirAddr[0]; + for (y = 0; y < height; y++) + { + if ( 1 != fread(pU8,width,1,pFp)) + { + SAMPLE_PRT("Read file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0]; + } + + pU8 = pstImg->pu8VirAddr[1]; + for (y = 0; y < height/2; y++) + { + if ( 1 != fread(pU8,width,1,pFp)) + { + SAMPLE_PRT("Read file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[1]; + } + } + break; + case IVE_IMAGE_TYPE_YUV422SP: + { + pU8 = pstImg->pu8VirAddr[0]; + for (y = 0; y < height; y++) + { + if ( 1 != fread(pU8,width,1,pFp)) + { + SAMPLE_PRT("Read file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0]; + } + + pU8 = pstImg->pu8VirAddr[1]; + for (y = 0; y < height; y++) + { + if ( 1 != fread(pU8,width,1,pFp)) + { + SAMPLE_PRT("Read file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[1]; + } + } + break; + case IVE_IMAGE_TYPE_U8C3_PACKAGE: + { + pU8 = pstImg->pu8VirAddr[0]; + for (y = 0; y < height; y++) + { + if ( 1 != fread(pU8,width * 3,1,pFp)) + { + SAMPLE_PRT("Read file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0] * 3; + } + + } + break; + case IVE_IMAGE_TYPE_U8C3_PLANAR: + { + for (loop = 0; loop < 3; loop++) + { + pU8 = pstImg->pu8VirAddr[loop]; + for (y = 0; y < height; y++) + { + if ( 1 != fread(pU8,width,1,pFp)) + { + SAMPLE_PRT("Read file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[loop]; + } + } + + } + break; + case IVE_IMAGE_TYPE_S16C1: + case IVE_IMAGE_TYPE_U16C1: + { + pU8 = pstImg->pu8VirAddr[0]; + for( y = 0; y < height; y++ ) + { + if( sizeof(HI_U16) != fread(pU8, width, sizeof(HI_U16), pFp) ) + { + SAMPLE_PRT("Read file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0] * 2; + } + } + break; + default: + break; + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_COMM_IVE_WriteFile(IVE_IMAGE_S *pstImg, FILE *pFp) +{ + HI_U16 y; + HI_U8 *pU8; + HI_U16 height; + HI_U16 width; + + height = pstImg->u16Height; + width = pstImg->u16Width; + + switch(pstImg->enType) + { + case IVE_IMAGE_TYPE_U8C1: + case IVE_IMAGE_TYPE_S8C1: + { + pU8 = pstImg->pu8VirAddr[0]; + for (y = 0; y < height; y++) + { + if ( 1 != fwrite(pU8,width,1,pFp)) + { + SAMPLE_PRT("Write file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0]; + } + } + break; + case IVE_IMAGE_TYPE_YUV420SP: + { + pU8 = pstImg->pu8VirAddr[0]; + for (y = 0; y < height; y++) + { + if ( width != fwrite(pU8,1,width,pFp)) + { + SAMPLE_PRT("Write file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0]; + } + + pU8 = pstImg->pu8VirAddr[1]; + for (y = 0; y < height/2; y++) + { + if ( width != fwrite(pU8,1,width,pFp)) + { + SAMPLE_PRT("Write file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[1]; + } + } + break; + case IVE_IMAGE_TYPE_YUV422SP: + { + pU8 = pstImg->pu8VirAddr[0]; + for (y = 0; y < height; y++) + { + if ( width != fwrite(pU8,1,width,pFp)) + { + SAMPLE_PRT("Write file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0]; + } + + pU8 = pstImg->pu8VirAddr[1]; + for (y = 0; y < height; y++) + { + if ( width != fwrite(pU8,1,width,pFp)) + { + SAMPLE_PRT("Write file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[1]; + } + } + break; + #if 0 + case IVE_IMAGE_TYPE_U8C3_PACKAGE: + { + pU8 = image->pu8VirAddr[0]; + for (y = 0; y < height; y++) + { + if ( 1 != fread(pU8,width * 3,1,fp)) + { + printf("read file error,line:%d\n",__LINE__); + return HI_FAILURE; + } + + pU8 += image->u16Stride[0] * 3; + } + + } + break; + case IVE_IMAGE_TYPE_U8C3_PLANAR: + { + for (HI_U16 loop = 0; loop < 3; loop++) + { + pU8 = image->pu8VirAddr[loop]; + for (y = 0; y < height; y++) + { + if ( 1 != fread(pU8,width,1,fp)) + { + printf("read file error,line:%d\n",__LINE__); + return HI_FAILURE; + } + + pU8 += image->u16Stride[loop]; + } + } + + } + break; + #endif + case IVE_IMAGE_TYPE_S16C1: + case IVE_IMAGE_TYPE_U16C1: + { + pU8 = pstImg->pu8VirAddr[0]; + for( y = 0; y < height; y++ ) + { + if( sizeof(HI_U16) != fwrite(pU8, width, sizeof(HI_U16), pFp) ) + { + SAMPLE_PRT("Write file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0] * 2; + } + } + break; + case IVE_IMAGE_TYPE_U32C1: + { + + pU8 = pstImg->pu8VirAddr[0]; + for( y = 0; y < height; y++ ) + { + if( width != fwrite(pU8, sizeof(HI_U32), width, pFp) ) + { + SAMPLE_PRT("Write file fail\n"); + return HI_FAILURE; + } + + pU8 += pstImg->u16Stride[0] * 4; + } + break; + } + + default: + break; + } + + return HI_SUCCESS; +} + +HI_VOID SAMPLE_COMM_IVE_BlobToRect(IVE_CCBLOB_S *pstBlob, SAMPLE_RECT_ARRAY_S *pstRect, + HI_U16 u16RectMaxNum,HI_U16 u16AreaThrStep, + HI_U16 u16SrcWidth, HI_U16 u16SrcHeight, + HI_U16 u16DstWidth,HI_U16 u16DstHeight) +{ + HI_U16 u16Num; + HI_U16 i,j,k; + HI_U16 u16Thr= 0; + HI_BOOL bValid; + + if(pstBlob->u8RegionNum > u16RectMaxNum) + { + + u16Thr = pstBlob->u16CurAreaThr; + do + { + u16Num = 0; + u16Thr += u16AreaThrStep; + for(i = 0;i < 254;i++) + { + if(pstBlob->astRegion[i].u32Area > u16Thr) + { + u16Num++; + } + } + }while(u16Num > u16RectMaxNum); + + } + + u16Num = 0; + + for(i = 0;i < 254;i++) + { + if(pstBlob->astRegion[i].u32Area > u16Thr) + { + + pstRect->astRect[u16Num].astPoint[0].s32X = (HI_U16)((HI_FLOAT)pstBlob->astRegion[i].u16Left / (HI_FLOAT)u16SrcWidth * (HI_FLOAT)u16DstWidth) & (~1) ; + pstRect->astRect[u16Num].astPoint[0].s32Y = (HI_U16)((HI_FLOAT)pstBlob->astRegion[i].u16Top / (HI_FLOAT)u16SrcHeight * (HI_FLOAT)u16DstHeight) & (~1); + + pstRect->astRect[u16Num].astPoint[1].s32X = (HI_U16)((HI_FLOAT)pstBlob->astRegion[i].u16Right/ (HI_FLOAT)u16SrcWidth * (HI_FLOAT)u16DstWidth) & (~1); + pstRect->astRect[u16Num].astPoint[1].s32Y = (HI_U16)((HI_FLOAT)pstBlob->astRegion[i].u16Top / (HI_FLOAT)u16SrcHeight * (HI_FLOAT)u16DstHeight) & (~1); + + pstRect->astRect[u16Num].astPoint[2].s32X = (HI_U16)((HI_FLOAT)pstBlob->astRegion[i].u16Right / (HI_FLOAT)u16SrcWidth * (HI_FLOAT)u16DstWidth) & (~1); + pstRect->astRect[u16Num].astPoint[2].s32Y = (HI_U16)((HI_FLOAT)pstBlob->astRegion[i].u16Bottom / (HI_FLOAT)u16SrcHeight * (HI_FLOAT)u16DstHeight) & (~1); + + pstRect->astRect[u16Num].astPoint[3].s32X = (HI_U16)((HI_FLOAT)pstBlob->astRegion[i].u16Left / (HI_FLOAT)u16SrcWidth * (HI_FLOAT)u16DstWidth) & (~1); + pstRect->astRect[u16Num].astPoint[3].s32Y = (HI_U16)((HI_FLOAT)pstBlob->astRegion[i].u16Bottom / (HI_FLOAT)u16SrcHeight * (HI_FLOAT)u16DstHeight) & (~1); + + bValid = HI_TRUE; + for(j = 0; j < 3;j++) + { + for (k = j + 1; k < 4;k++) + { + if ((pstRect->astRect[u16Num].astPoint[j].s32X == pstRect->astRect[u16Num].astPoint[k].s32X) + &&(pstRect->astRect[u16Num].astPoint[j].s32Y == pstRect->astRect[u16Num].astPoint[k].s32Y)) + { + bValid = HI_FALSE; + break; + } + + } + } + if (HI_TRUE == bValid) + { + u16Num++; + } + } + } + + pstRect->u16Num = u16Num; +} +/***************************************************************************** +* function : set vpss group attribute. +*****************************************************************************/ +static HI_VOID SAMPLE_COMM_IVE_VpssGrpAttr(HI_U32 u32VpssGrpCnt, VPSS_GRP_ATTR_S *pstVpssGrpAttr, SIZE_S *pstSize) +{ + HI_U32 i; + + memset(pstVpssGrpAttr, 0, sizeof(VPSS_GRP_ATTR_S)); + + for(i=0; ienDieMode = VPSS_DIE_MODE_NODIE; + pstVpssGrpAttr->bIeEn = HI_FALSE; + pstVpssGrpAttr->bDciEn = HI_FALSE; + pstVpssGrpAttr->bNrEn = HI_TRUE; + //pstVpssGrpAttr->bEsEn = HI_FALSE; + pstVpssGrpAttr->bHistEn = HI_FALSE; + pstVpssGrpAttr->enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + pstVpssGrpAttr->u32MaxW = ALIGN_UP(pstSize->u32Width, 16); + pstVpssGrpAttr->u32MaxH = ALIGN_UP(pstSize->u32Height, 16); + } +} + +/***************************************************************************** +* function : start vpss. VPSS chn with frame +*****************************************************************************/ +static HI_S32 SAMPLE_COMM_IVE_VpssStart(HI_S32 s32VpssGrpCnt, SIZE_S astSize[], +VPSS_CHN aVpssChn[], HI_S32 s32VpssChnCnt, VPSS_GRP_ATTR_S *pstVpssGrpAttr) +{ + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stGrpAttr = {0}; + //VPSS_CHN_ATTR_S stChnAttr = {0}; + VPSS_GRP_PARAM_S stVpssParam = {0}; + VPSS_CHN_MODE_S stVpssChnMode = {0}; + VPSS_FRAME_RATE_S stVpssFrmRate = {30, 30}; + + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i, j; + HI_U32 u32Depth = 3; + + HI_ASSERT(s32VpssGrpCnt>0); + HI_ASSERT(s32VpssChnCnt>0); + + /*** Set Vpss Grp Attr ***/ + if(NULL == pstVpssGrpAttr) + { + stGrpAttr.u32MaxW = astSize[0].u32Width; + stGrpAttr.u32MaxH = astSize[0].u32Height; + stGrpAttr.bIeEn = HI_FALSE; + stGrpAttr.bNrEn = HI_TRUE; + stGrpAttr.bHistEn = HI_FALSE; + stGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT; + } + else + { + memcpy(&stGrpAttr,pstVpssGrpAttr,sizeof(VPSS_GRP_ATTR_S)); + } + + + for(i=0; ienPicSize; + VI_EXT_CHN_ATTR_S stExtChnAttr; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + SAMPLE_VI_CONFIG_S *pstViConfig = &(pstViVoConfig->stViConfig); + VENC_CHN VencChn = 0; + HI_U32 u32ViDepth = 4; + VI_CHN_ATTR_S stChnAttr; + HI_U32 u32VpssGrpCnt = 1; + VPSS_CHN aVpssChn[2] = {VPSS_CHN0, VPSS_CHN3}; + VPSS_GRP_ATTR_S stVpssGrpAttr; + SIZE_S astSize[2]; + + memset(&stVbConf,0,sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(pstViVoConfig->enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 3; + + if (HI_TRUE == bOpenViExt) + { + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(pstViVoConfig->enNorm,PIC_CIF, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 3; + } + // mpp system init. + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_Init fail,Error(%#x)\n", s32Ret); + goto END_720P_0; + } + + if (HI_TRUE == bOpenVi) + { + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VI_StartVi fail,Error(%#x)\n",s32Ret); + goto END_720P_0; + } + s32Ret = HI_MPI_VI_SetFrameDepth(ViChn,u32ViDepth); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_SetFrameDepth fail,ViChn(%d),Error(%#x)\n",ViChn,s32Ret); + goto END_720P_1; + } + s32Ret = HI_MPI_VI_GetChnAttr(ViChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_GetChnAttr fail,ViChn(%d),Error(%#x)\n",ViChn,s32Ret); + goto END_720P_1; + } + //Set Vi frame rate,because vi from BT1120 is 720P@30 + stChnAttr.s32SrcFrameRate = 3; + stChnAttr.s32DstFrameRate = 1; + s32Ret = HI_MPI_VI_SetChnAttr(ViChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_SetChnAttr,ViChn(%d),Error(%#x)\n",ViChn,s32Ret); + goto END_720P_1; + } + + } + + //Open vi ext chn + if (HI_TRUE == bOpenViExt) + { + stExtChnAttr.enPixFormat = SAMPLE_PIXEL_FORMAT; + stExtChnAttr.s32BindChn = ViChn; + stExtChnAttr.stDestSize.u32Width = 352; + stExtChnAttr.stDestSize.u32Height = 288; + stExtChnAttr.s32DstFrameRate = -1; + stExtChnAttr.s32SrcFrameRate = -1; + stExtChnAttr.enCompressMode = COMPRESS_MODE_NONE; + + s32Ret = HI_MPI_VI_SetExtChnAttr(ViExtChn, &stExtChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_SetExtChnAttr fail,ViChn(%d),Error(%#x)\n",ViExtChn,s32Ret); + goto END_720P_1; + } + s32Ret = HI_MPI_VI_EnableChn(ViExtChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_EnableChn fail,ViChn(%d),Error(%#x)\n",ViExtChn,s32Ret); + goto END_720P_1; + } + s32Ret = HI_MPI_VI_SetFrameDepth(ViExtChn,u32ViDepth); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_SetFrameDepth fail,ViChn(%d),Error(%#x)\n",ViExtChn,s32Ret); + goto END_720P_1; + } + + } + //Open vo + if (HI_TRUE == bOpenVo) + { + s32Ret = SAMPLE_COMM_SYS_GetPicSize(pstViVoConfig->enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize fail,Error(%#x)\n",s32Ret); + goto END_720P_2; + } + stVoPubAttr.enIntfType = pstViVoConfig->enVoIntfType; + //hi3518e Vo only suppurt pal + //if(VO_INTF_BT1120 == pstViVoConfig->enVoIntfType) + //{ + // stVoPubAttr.enIntfSync = /*VO_OUTPUT_720P60*/VO_OUTPUT_1080P30; + //} + // if(SAMPLE_VI_MODE_BT1120_1080P == pstViVoConfig->stViConfig.enViMode) + // { + // stVoPubAttr.enIntfSync = VO_OUTPUT_1080P30; + // } + //else if(SAMPLE_VI_MODE_BT1120_720P == pstViVoConfig->stViConfig.enViMode) + // { + // stVoPubAttr.enIntfSync = VO_OUTPUT_720P60; + // } + // else + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + } + stVoPubAttr.u32BgColor = 0x000000ff; + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDevLayer fail,VoDev(%d),Error(%#x)!\n",VoDev,s32Ret); + goto END_720P_2; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + memcpy(&stLayerAttr.stImageSize,&stSize,sizeof(stSize)); + + stLayerAttr.u32DispFrmRt = 60 ; + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + if((stVoPubAttr.enIntfSync == VO_OUTPUT_720P60) || (stVoPubAttr.enIntfSync == VO_OUTPUT_1080P30)) + { + stLayerAttr.stDispRect.u32Width = stSize.u32Width; + stLayerAttr.stDispRect.u32Height = stSize.u32Height; + } + else if(stVoPubAttr.enIntfSync == VO_OUTPUT_PAL) + { + stLayerAttr.stDispRect.u32Width = 720; + stLayerAttr.stDispRect.u32Height = 576; + } + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartLayer fail,VoLayer(%d),Error(%#x)\n",VoLayer,s32Ret); + goto END_720P_3; + } + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, enVoMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn fail,VoDev(%d),Error(%#x)\n",VoDev,s32Ret); + goto END_720P_4; + } + } + + if (HI_TRUE == bOpenVenc) + { + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, PT_H264, pstViVoConfig->enNorm, enPicSize, SAMPLE_RC_CBR,0); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_VENC_Start fail,VencChn(%d),Error(%#x)\n",VencChn,s32Ret); + goto END_720P_5; + } + s32Ret = SAMPLE_COMM_VENC_StartGetStream(1); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VENC_StartGetStream fail,Error(%#x)\n",s32Ret); + goto END_720P_6; + } + } + if (HI_TRUE == bOpenVpss) + { + s32Ret = SAMPLE_COMM_SYS_GetPicSize(pstViVoConfig->enNorm, enPicSize, &astSize[0]); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize fail,Error(%#x)\n",s32Ret); + goto END_720P_6; + } + astSize[1].u32Width = 352; + astSize[1].u32Height = 288; + SAMPLE_COMM_IVE_VpssGrpAttr(u32VpssGrpCnt, &stVpssGrpAttr, &stSize); + s32Ret = SAMPLE_COMM_IVE_VpssStart(u32VpssGrpCnt, astSize, aVpssChn, u32VpssChnNum, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_VpssStart fail,Error(%#x)\n",s32Ret); + goto END_720P_6; + } + + } + return s32Ret; + +//END_720P_7: + //if (HI_TRUE == bOpenVpss) + //{ + // SAMPLE_COMM_IVE_StopVpss(u32VpssGrpCnt,u32VpssChnNum); + //} + +END_720P_6: + if (HI_TRUE == bOpenVenc) + { + SAMPLE_COMM_VENC_Stop(VencChn); + } +END_720P_5: + if (HI_TRUE == bOpenVo) + { + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); + } +END_720P_4: + if (HI_TRUE == bOpenVo) + { + SAMPLE_COMM_VO_StopLayer(VoLayer); + } +END_720P_3: + if (HI_TRUE == bOpenVo) + { + SAMPLE_COMM_VO_StopDev(VoDev); + } +END_720P_2: + if(HI_TRUE == bOpenViExt) + { + (HI_VOID)HI_MPI_VI_DisableChn(ViExtChn); + } +END_720P_1: + if (HI_TRUE == bOpenVi) + { + SAMPLE_COMM_VI_StopVi(pstViConfig); + } +END_720P_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} +/****************************************************************************** +* function : Stop BT1120 720P vi/vo/venc +******************************************************************************/ +HI_VOID SAMPLE_COMM_IVE_BT1120_720P_Stop(SAMPLE_IVE_VI_VO_CONFIG_S *pstViVoConfig, + HI_BOOL bOpenVi,HI_BOOL bOpenViExt,HI_BOOL bOpenVo,HI_BOOL bOpenVenc,HI_BOOL bOpenVpss,HI_U32 u32VpssChnNum) +{ + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0; + VO_LAYER VoLayer = 0; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + VI_CHN ViExtChn = 1; + VENC_CHN VencChn = 0; + HI_U32 u32VpssGrpCnt = 1; + + if (HI_TRUE == bOpenVpss) + { + SAMPLE_COMM_IVE_StopVpss(u32VpssGrpCnt,u32VpssChnNum); + } + if (HI_TRUE == bOpenVenc) + { + SAMPLE_COMM_VENC_StopGetStream(); + SAMPLE_COMM_VENC_Stop(VencChn); + } + //Close vo + if (HI_TRUE == bOpenVo ) + { + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); + SAMPLE_COMM_VO_StopLayer(VoLayer); + SAMPLE_COMM_VO_StopDev(VoDev); + } + //Close vi ext chn + if(HI_TRUE == bOpenViExt) + { + (HI_VOID)HI_MPI_VI_DisableChn(ViExtChn); + } + //Close vi + if (HI_TRUE == bOpenVi) + { + SAMPLE_COMM_VI_StopVi(&(pstViVoConfig->stViConfig)); + } + //Close sys + SAMPLE_COMM_SYS_Exit(); +} + + +/****************************************************************************** +* function : Create ive image +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_CreateImage(IVE_IMAGE_S *pstImg,IVE_IMAGE_TYPE_E enType,HI_U16 u16Width,HI_U16 u16Height) +{ + HI_U32 u32Size = 0; + HI_S32 s32Ret; + if (NULL == pstImg) + { + SAMPLE_PRT("pstImg is null\n"); + return HI_FAILURE; + } + + pstImg->enType = enType; + pstImg->u16Width = u16Width; + pstImg->u16Height = u16Height; + pstImg->u16Stride[0] = SAMPLE_COMM_IVE_CalcStride(pstImg->u16Width,IVE_ALIGN); + + switch(enType) + { + case IVE_IMAGE_TYPE_U8C1: + case IVE_IMAGE_TYPE_S8C1: + { + u32Size = pstImg->u16Stride[0] * pstImg->u16Height; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + } + break; + case IVE_IMAGE_TYPE_YUV420SP: + { + u32Size = pstImg->u16Stride[0] * pstImg->u16Height * 3 / 2; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + pstImg->u16Stride[1] = pstImg->u16Stride[0]; + pstImg->u32PhyAddr[1] = pstImg->u32PhyAddr[0] + pstImg->u16Stride[0] * pstImg->u16Height; + pstImg->pu8VirAddr[1] = pstImg->pu8VirAddr[0] + pstImg->u16Stride[0] * pstImg->u16Height; + + } + break; + case IVE_IMAGE_TYPE_YUV422SP: + { + u32Size = pstImg->u16Stride[0] * pstImg->u16Height * 2; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + pstImg->u16Stride[1] = pstImg->u16Stride[0]; + pstImg->u32PhyAddr[1] = pstImg->u32PhyAddr[0] + pstImg->u16Stride[0] * pstImg->u16Height; + pstImg->pu8VirAddr[1] = pstImg->pu8VirAddr[0] + pstImg->u16Stride[0] * pstImg->u16Height; + + } + break; + case IVE_IMAGE_TYPE_YUV420P: + break; + case IVE_IMAGE_TYPE_YUV422P: + break; + case IVE_IMAGE_TYPE_S8C2_PACKAGE: + break; + case IVE_IMAGE_TYPE_S8C2_PLANAR: + break; + case IVE_IMAGE_TYPE_S16C1: + case IVE_IMAGE_TYPE_U16C1: + { + + u32Size = pstImg->u16Stride[0] * pstImg->u16Height * sizeof(HI_U16); + s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + } + break; + case IVE_IMAGE_TYPE_U8C3_PACKAGE: + { + u32Size = pstImg->u16Stride[0] * pstImg->u16Height * 3; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + pstImg->pu8VirAddr[1] = pstImg->pu8VirAddr[0] +1; + pstImg->pu8VirAddr[2] = pstImg->pu8VirAddr[1] + 1; + pstImg->u32PhyAddr[1] = pstImg->u32PhyAddr[0] + 1; + pstImg->u32PhyAddr[2] = pstImg->u32PhyAddr[1] + 1; + pstImg->u16Stride[1] = pstImg->u16Stride[0]; + pstImg->u16Stride[2] = pstImg->u16Stride[0]; + } + break; + case IVE_IMAGE_TYPE_U8C3_PLANAR: + break; + case IVE_IMAGE_TYPE_S32C1: + case IVE_IMAGE_TYPE_U32C1: + { + u32Size = pstImg->u16Stride[0] * pstImg->u16Height * sizeof(HI_U32); + s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + } + break; + case IVE_IMAGE_TYPE_S64C1: + case IVE_IMAGE_TYPE_U64C1: + { + + u32Size = pstImg->u16Stride[0] * pstImg->u16Height * sizeof(HI_U64); + s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + } + break; + default: + break; + + } + + return HI_SUCCESS; +} +/****************************************************************************** +* function : Create memory info +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_CreateMemInfo(IVE_MEM_INFO_S*pstMemInfo,HI_U32 u32Size) +{ + HI_S32 s32Ret; + + if (NULL == pstMemInfo) + { + SAMPLE_PRT("pstMemInfo is null\n"); + return HI_FAILURE; + } + pstMemInfo->u32Size = u32Size; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstMemInfo->u32PhyAddr, (void**)&pstMemInfo->pu8VirAddr, NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} +/****************************************************************************** +* function : Create ive image by cached +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_CreateImageByCached(IVE_IMAGE_S *pstImg, + IVE_IMAGE_TYPE_E enType,HI_U16 u16Width,HI_U16 u16Height) +{ + HI_U32 u32Size = 0; + HI_S32 s32Ret; + if (NULL == pstImg) + { + SAMPLE_PRT("pstImg is null\n"); + return HI_FAILURE; + } + + pstImg->enType = enType; + pstImg->u16Width = u16Width; + pstImg->u16Height = u16Height; + pstImg->u16Stride[0] = SAMPLE_COMM_IVE_CalcStride(pstImg->u16Width,IVE_ALIGN); + + switch(enType) + { + case IVE_IMAGE_TYPE_U8C1: + case IVE_IMAGE_TYPE_S8C1: + { + u32Size = pstImg->u16Stride[0] * pstImg->u16Height; + s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + } + break; + case IVE_IMAGE_TYPE_YUV420SP: + break; + case IVE_IMAGE_TYPE_YUV422SP: + break; + case IVE_IMAGE_TYPE_YUV420P: + break; + case IVE_IMAGE_TYPE_YUV422P: + break; + case IVE_IMAGE_TYPE_S8C2_PACKAGE: + break; + case IVE_IMAGE_TYPE_S8C2_PLANAR: + break; + case IVE_IMAGE_TYPE_S16C1: + case IVE_IMAGE_TYPE_U16C1: + { + + u32Size = pstImg->u16Stride[0] * pstImg->u16Height * sizeof(HI_U16); + s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + } + break; + case IVE_IMAGE_TYPE_U8C3_PACKAGE: + break; + case IVE_IMAGE_TYPE_U8C3_PLANAR: + break; + case IVE_IMAGE_TYPE_S32C1: + case IVE_IMAGE_TYPE_U32C1: + { + u32Size = pstImg->u16Stride[0] * pstImg->u16Height * sizeof(HI_U32); + s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + } + break; + case IVE_IMAGE_TYPE_S64C1: + case IVE_IMAGE_TYPE_U64C1: + { + + u32Size = pstImg->u16Stride[0] * pstImg->u16Height * sizeof(HI_U64); + s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + } + break; + default: + break; + + } + + return HI_SUCCESS; + +} +/****************************************************************************** +* function : Dma frame info to ive image +******************************************************************************/ +HI_S32 SAMPLE_COMM_DmaImage(VIDEO_FRAME_INFO_S *pstFrameInfo,IVE_DST_IMAGE_S *pstDst,HI_BOOL bInstant) +{ + HI_S32 s32Ret; + IVE_HANDLE hIveHandle; + IVE_SRC_DATA_S stSrcData; + IVE_DST_DATA_S stDstData; + IVE_DMA_CTRL_S stCtrl = {IVE_DMA_MODE_DIRECT_COPY,0}; + HI_BOOL bFinish = HI_FALSE; + HI_BOOL bBlock = HI_TRUE; + + //fill src + stSrcData.pu8VirAddr = (HI_U8*)pstFrameInfo->stVFrame.pVirAddr[0]; + stSrcData.u32PhyAddr = pstFrameInfo->stVFrame.u32PhyAddr[0]; + stSrcData.u16Width = (HI_U16)pstFrameInfo->stVFrame.u32Width; + stSrcData.u16Height = (HI_U16)pstFrameInfo->stVFrame.u32Height; + stSrcData.u16Stride = (HI_U16)pstFrameInfo->stVFrame.u32Stride[0]; + + //fill dst + stDstData.pu8VirAddr = pstDst->pu8VirAddr[0]; + stDstData.u32PhyAddr = pstDst->u32PhyAddr[0]; + stDstData.u16Width = pstDst->u16Width; + stDstData.u16Height = pstDst->u16Height; + stDstData.u16Stride = pstDst->u16Stride[0]; + + s32Ret = HI_MPI_IVE_DMA(&hIveHandle,&stSrcData,&stDstData,&stCtrl,bInstant); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_IVE_DMA fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + + if (HI_TRUE == bInstant) + { + s32Ret = HI_MPI_IVE_Query(hIveHandle,&bFinish,bBlock); + while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret) + { + usleep(100); + s32Ret = HI_MPI_IVE_Query(hIveHandle,&bFinish,bBlock); + } + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_IVE_Query fail,Error(%#x)\n",s32Ret); + return s32Ret; + } + } + + return HI_SUCCESS; +} + + diff --git a/device/mpp/sample/common/sample_comm_ive.h b/device/mpp/sample/common/sample_comm_ive.h new file mode 100644 index 0000000..0f31b7c --- /dev/null +++ b/device/mpp/sample/common/sample_comm_ive.h @@ -0,0 +1,178 @@ +#ifndef __SAMPLE_COMM_IVE_H__ +#define __SAMPLE_COMM_IVE_H__ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +#include "hi_common.h" +#include "hi_debug.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_ive.h" +#include "hi_comm_vi.h" +#include "hi_comm_vo.h" +#include "hi_comm_vgs.h" + +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_ive.h" +#include "sample_comm.h" + +#define VIDEO_WIDTH 352 +#define VIDEO_HEIGHT 288 +#define IVE_ALIGN 16 +#define IVE_CHAR_CALW 8 +#define IVE_CHAR_CALH 8 +#define IVE_CHAR_NUM (IVE_CHAR_CALW *IVE_CHAR_CALH) +#define IVE_FILE_NAME_LEN 256 + +#define SAMPLE_ALIGN_BACK(x, a) ((a) * (((x) / (a)))) +#define SAMPLE_CHECK_EXPR_RET(expr, ret, fmt...)\ +do\ +{\ + if(expr)\ + {\ + SAMPLE_PRT(fmt);\ + return (ret);\ + }\ +}while(0) +#define SAMPLE_CHECK_EXPR_GOTO(expr, label, fmt...)\ +do\ +{\ + if(expr)\ + {\ + SAMPLE_PRT(fmt);\ + goto label;\ + }\ +}while(0) + +typedef struct hiSAMPLE_IVE_VI_VO_CONFIG_S +{ + SAMPLE_VI_CONFIG_S stViConfig; + VO_INTF_TYPE_E enVoIntfType; + VIDEO_NORM_E enNorm; + PIC_SIZE_E enPicSize; +}SAMPLE_IVE_VI_VO_CONFIG_S; + +typedef struct hiSAMPLE_IVE_RECT_S +{ + POINT_S astPoint[4]; +}SAMPLE_IVE_RECT_S; + +typedef struct hiSAMPLE_RECT_ARRAY_S +{ + HI_U16 u16Num; + SAMPLE_IVE_RECT_S astRect[50]; +}SAMPLE_RECT_ARRAY_S; + +typedef struct hiIVE_LINEAR_DATA_S +{ + HI_S32 s32LinearNum; + HI_S32 s32ThreshNum; + POINT_S *pstLinearPoint; +}IVE_LINEAR_DATA_S; + + +//free mmz +#define IVE_MMZ_FREE(phy,vir)\ +do{\ + if ((0 != (phy)) && (NULL != (vir)))\ + {\ + HI_MPI_SYS_MmzFree((phy),(vir));\ + (phy) = 0;\ + (vir) = NULL;\ + }\ +}while(0) + +#define IVE_CLOSE_FILE(fp)\ +do{\ + if (NULL != (fp))\ + {\ + fclose((fp));\ + (fp) = NULL;\ + }\ +}while(0) + +#define SAMPLE_VI_PAUSE()\ +do {\ + printf("---------------press any key to exit!---------------\n");\ + getchar();\ +} while (0) +/****************************************************************************** +* function : Mpi init +******************************************************************************/ +HI_VOID SAMPLE_COMM_IVE_CheckIveMpiInit(HI_VOID); +/****************************************************************************** +* function : Mpi exit +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_IveMpiExit(HI_VOID); +/****************************************************************************** +* function :VGS Add draw rect job +******************************************************************************/ +HI_S32 SAMPLE_COMM_VGS_AddDrawRectJob(VGS_HANDLE VgsHandle, IVE_IMAGE_S *pstSrc, IVE_IMAGE_S *pstDst, + RECT_S *pstRect, HI_U16 u16RectNum); +/****************************************************************************** +* function : Call vgs to fill rect +******************************************************************************/ +HI_S32 SAMPLE_COMM_VGS_FillRect(VIDEO_FRAME_INFO_S *pstFrmInfo, SAMPLE_RECT_ARRAY_S *pstRect,HI_U32 u32Color); +/****************************************************************************** +* function :Read file +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_ReadFile(IVE_IMAGE_S *pstImg, FILE *pFp); +/****************************************************************************** +* function :Write file +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_WriteFile(IVE_IMAGE_S *pstImg, FILE *pFp); +/****************************************************************************** +* function :Calc stride +******************************************************************************/ +HI_U16 SAMPLE_COMM_IVE_CalcStride(HI_U16 u16Width, HI_U8 u8Align); +/****************************************************************************** +* function : Start BT1120 720P vi/vo/venc +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_BT1120_720P_PreView(SAMPLE_IVE_VI_VO_CONFIG_S *pstViVoConfig, + HI_BOOL bOpenVi,HI_BOOL bOpenViExt,HI_BOOL bOpenVo,HI_BOOL bOpenVenc,HI_BOOL bOpenVpss,HI_U32 u32VpssChnNum); +/****************************************************************************** +* function : Stop BT1120 720P vi/vo/venc +******************************************************************************/ +HI_VOID SAMPLE_COMM_IVE_BT1120_720P_Stop(SAMPLE_IVE_VI_VO_CONFIG_S *pstViVoConfig, + HI_BOOL bOpenVi,HI_BOOL bOpenViExt,HI_BOOL bOpenVo,HI_BOOL bOpenVenc,HI_BOOL bOpenVpss,HI_U32 u32VpssChnNum); +/****************************************************************************** +* function : Copy blob to rect +******************************************************************************/ +HI_VOID SAMPLE_COMM_IVE_BlobToRect(IVE_CCBLOB_S *pstBlob, SAMPLE_RECT_ARRAY_S *pstRect, + HI_U16 u16RectMaxNum,HI_U16 u16AreaThrStep, + HI_U16 u16SrcWidth, HI_U16 u16SrcHeight, + HI_U16 u16DstWidth,HI_U16 u16DstHeight); +/****************************************************************************** +* function : Create ive image +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_CreateImage(IVE_IMAGE_S *pstImg,IVE_IMAGE_TYPE_E enType, + HI_U16 u16Width,HI_U16 u16Height); +/****************************************************************************** +* function : Create memory info +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_CreateMemInfo(IVE_MEM_INFO_S*pstMemInfo,HI_U32 u32Size); +/****************************************************************************** +* function : Create ive image by cached +******************************************************************************/ +HI_S32 SAMPLE_COMM_IVE_CreateImageByCached(IVE_IMAGE_S *pstImg, + IVE_IMAGE_TYPE_E enType,HI_U16 u16Width,HI_U16 u16Height); +/****************************************************************************** +* function : Dma frame info to ive image +******************************************************************************/ +HI_S32 SAMPLE_COMM_DmaImage(VIDEO_FRAME_INFO_S *pstFrameInfo,IVE_DST_IMAGE_S *pstDst,HI_BOOL bInstant); + +#endif + + diff --git a/device/mpp/sample/common/sample_comm_sys.c b/device/mpp/sample/common/sample_comm_sys.c new file mode 100644 index 0000000..5430d83 --- /dev/null +++ b/device/mpp/sample/common/sample_comm_sys.c @@ -0,0 +1,416 @@ +/****************************************************************************** + Some simple Hisilicon Hi3531 system functions. + + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-2 Created +******************************************************************************/ +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" + +/****************************************************************************** +* function : get picture size(w*h), according Norm and enPicSize +******************************************************************************/ +HI_S32 SAMPLE_COMM_SYS_GetPicSize(VIDEO_NORM_E enNorm, PIC_SIZE_E enPicSize, SIZE_S *pstSize) +{ + switch (enPicSize) + { + case PIC_QCIF: + pstSize->u32Width = 176; + pstSize->u32Height = (VIDEO_ENCODING_MODE_PAL==enNorm)?144:120; + break; + case PIC_CIF: + pstSize->u32Width = 352; + pstSize->u32Height = (VIDEO_ENCODING_MODE_PAL==enNorm)?288:240; + break; + case PIC_D1: + pstSize->u32Width = 720; + pstSize->u32Height = (VIDEO_ENCODING_MODE_PAL==enNorm)?576:480; + break; + case PIC_960H: + pstSize->u32Width = 960; + pstSize->u32Height = (VIDEO_ENCODING_MODE_PAL==enNorm)?576:480; + break; + case PIC_2CIF: + pstSize->u32Width = 360; + pstSize->u32Height = (VIDEO_ENCODING_MODE_PAL==enNorm)?576:480; + break; + case PIC_QVGA: /* 320 * 240 */ + pstSize->u32Width = 320; + pstSize->u32Height = 240; + break; + case PIC_VGA: /* 640 * 480 */ + pstSize->u32Width = 640; + pstSize->u32Height = 480; + break; + case PIC_XGA: /* 1024 * 768 */ + pstSize->u32Width = 1024; + pstSize->u32Height = 768; + break; + case PIC_SXGA: /* 1400 * 1050 */ + pstSize->u32Width = 1400; + pstSize->u32Height = 1050; + break; + case PIC_UXGA: /* 1600 * 1200 */ + pstSize->u32Width = 1600; + pstSize->u32Height = 1200; + break; + case PIC_QXGA: /* 2048 * 1536 */ + pstSize->u32Width = 2048; + pstSize->u32Height = 1536; + break; + case PIC_WVGA: /* 854 * 480 */ + pstSize->u32Width = 854; + pstSize->u32Height = 480; + break; + case PIC_WSXGA: /* 1680 * 1050 */ + pstSize->u32Width = 1680; + pstSize->u32Height = 1050; + break; + case PIC_WUXGA: /* 1920 * 1200 */ + pstSize->u32Width = 1920; + pstSize->u32Height = 1200; + break; + case PIC_WQXGA: /* 2560 * 1600 */ + pstSize->u32Width = 2560; + pstSize->u32Height = 1600; + break; + case PIC_HD720: /* 1280 * 720 */ + pstSize->u32Width = 1280; + pstSize->u32Height = 720; + break; + case PIC_HD1080: /* 1920 * 1080 */ + pstSize->u32Width = 1920; + pstSize->u32Height = 1080; + break; + case PIC_5M: /* 2592 * 1944 */ + pstSize->u32Width = 2592; + pstSize->u32Height = 1944; + break; + + default: + return HI_FAILURE; + } + return HI_SUCCESS; +} + +/****************************************************************************** +* function : calculate VB Block size of Histogram. +******************************************************************************/ +HI_U32 SAMPLE_COMM_SYS_CalcHistVbBlkSize(VIDEO_NORM_E enNorm, PIC_SIZE_E enPicSize, SIZE_S *pstHistBlkSize, HI_U32 u32AlignWidth) +{ + HI_S32 s32Ret; + SIZE_S stPicSize; + + s32Ret = SAMPLE_COMM_SYS_GetPicSize(enNorm, enPicSize, &stPicSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("get picture size[%d] failed!\n", enPicSize); + return HI_FAILURE; + } + + SAMPLE_PRT("stPicSize.u32Width%d,pstHistBlkSize->u32Width%d\n,stPicSize.u32Height%d,pstHistBlkSize->u32Height%d\n", + stPicSize.u32Width,pstHistBlkSize->u32Width, + stPicSize.u32Height,pstHistBlkSize->u32Height ); + return (CEILING_2_POWER(44, u32AlignWidth)*CEILING_2_POWER(44, u32AlignWidth)*16*4); + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : calculate VB Block size of picture. +******************************************************************************/ +HI_U32 SAMPLE_COMM_SYS_CalcPicVbBlkSize(VIDEO_NORM_E enNorm, PIC_SIZE_E enPicSize, PIXEL_FORMAT_E enPixFmt, HI_U32 u32AlignWidth) +{ + HI_S32 s32Ret = HI_FAILURE; + SIZE_S stSize; + HI_U32 u32VbSize; + HI_U32 u32HeaderSize; + + s32Ret = SAMPLE_COMM_SYS_GetPicSize(enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("get picture size[%d] failed!\n", enPicSize); + return HI_FAILURE; + } + + if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 != enPixFmt && PIXEL_FORMAT_YUV_SEMIPLANAR_420 != enPixFmt) + { + SAMPLE_PRT("pixel format[%d] input failed!\n", enPixFmt); + return HI_FAILURE; + } + + if (16!=u32AlignWidth && 32!=u32AlignWidth && 64!=u32AlignWidth) + { + SAMPLE_PRT("system align width[%d] input failed!\n",\ + u32AlignWidth); + return HI_FAILURE; + } + //SAMPLE_PRT("w:%d, u32AlignWidth:%d\n", CEILING_2_POWER(stSize.u32Width,u32AlignWidth), u32AlignWidth); + u32VbSize = (CEILING_2_POWER(stSize.u32Width, u32AlignWidth) * \ + CEILING_2_POWER(stSize.u32Height,u32AlignWidth) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == enPixFmt)?2:1.5)); + + VB_PIC_HEADER_SIZE(stSize.u32Width, stSize.u32Height, enPixFmt, u32HeaderSize); + u32VbSize += u32HeaderSize; + + return u32VbSize; +} + +/****************************************************************************** +* function : calculate VB Block size of picture. +******************************************************************************/ +HI_U32 VI_COMM_SYS_CalcPicVbBlkSize(VIDEO_NORM_E enNorm,HI_U32 u32Width ,HI_U32 u32Height, PIXEL_FORMAT_E enPixFmt, HI_U32 u32AlignWidth) +{ + SIZE_S stSize; + + stSize.u32Width = u32Width; + stSize.u32Height = u32Height; + + if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 != enPixFmt && PIXEL_FORMAT_YUV_SEMIPLANAR_420 != enPixFmt) + { + SAMPLE_PRT("pixel format[%d] input failed!\n", enPixFmt); + return HI_FAILURE; + } + + if (16!=u32AlignWidth && 32!=u32AlignWidth && 64!=u32AlignWidth) + { + SAMPLE_PRT("system align width[%d] input failed!\n",\ + u32AlignWidth); + return HI_FAILURE; + } + //SAMPLE_PRT("w:%d, u32AlignWidth:%d\n", CEILING_2_POWER(stSize.u32Width,u32AlignWidth), u32AlignWidth); + return (CEILING_2_POWER(stSize.u32Width, u32AlignWidth) * \ + CEILING_2_POWER(stSize.u32Height,u32AlignWidth) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == enPixFmt)?2:1.5)); +} + + + +/****************************************************************************** +* function : Set system memory location +******************************************************************************/ +HI_S32 SAMPLE_COMM_SYS_MemConfig(HI_VOID) +{ + HI_S32 i = 0; + HI_S32 s32Ret = HI_SUCCESS; + + HI_CHAR * pcMmzName; + MPP_CHN_S stMppChnVI; + MPP_CHN_S stMppChnVO; + MPP_CHN_S stMppChnVPSS; + MPP_CHN_S stMppChnGRP; + MPP_CHN_S stMppChnVENC; + MPP_CHN_S stMppChnVDEC; + + /*VI,VDECͨΪ32*/ + for(i=0;i<32;i++) + { + stMppChnVI.enModId = HI_ID_VIU; + stMppChnVI.s32DevId = 0; + stMppChnVI.s32ChnId = i; + + stMppChnVDEC.enModId = HI_ID_VDEC; + stMppChnVDEC.s32DevId = 0; + stMppChnVDEC.s32ChnId = i; + + if(0 == (i%2)) + { + pcMmzName = NULL; + } + else + { + pcMmzName = "ddr1"; + } + + /*vi*/ + s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVI,pcMmzName); + if (s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetMemConf ERR !\n"); + return HI_FAILURE; + } + + /*vdec*/ + s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVDEC,pcMmzName); + if (s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetMemConf ERR !\n"); + return HI_FAILURE; + } + + } + + /*the max chn number of vpss,grp,venc is 64*/ + for(i=0;i<64;i++) + { + stMppChnVPSS.enModId = HI_ID_VPSS; + stMppChnVPSS.s32DevId = i; + stMppChnVPSS.s32ChnId = 0; + + stMppChnGRP.enModId = HI_ID_GROUP; + stMppChnGRP.s32DevId = i; + stMppChnGRP.s32ChnId = 0; + + stMppChnVENC.enModId = HI_ID_VENC; + stMppChnVENC.s32DevId = 0; + stMppChnVENC.s32ChnId = i; + + if(0 == (i%2)) + { + pcMmzName = NULL; + } + else + { + pcMmzName = "ddr1"; + } + + /*vpss*/ + s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVPSS,pcMmzName); + if (s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetMemConf ERR !\n"); + return HI_FAILURE; + } + + /*grp*/ + s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnGRP,pcMmzName); + if (s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetMemConf ERR !\n"); + return HI_FAILURE; + } + + /*venc*/ + s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVENC,pcMmzName); + if (s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetMemConf ERR !\n"); + return HI_FAILURE; + } + + } + + /*config memory for vo*/ + stMppChnVO.enModId = HI_ID_VOU; + stMppChnVO.s32DevId = 0; + stMppChnVO.s32ChnId = 0; + s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVO,"ddr1"); + if (s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetMemConf ERR !\n"); + return HI_FAILURE; + } + + return s32Ret; +} + +/****************************************************************************** +* function : vb init & MPI system init +******************************************************************************/ +HI_S32 SAMPLE_COMM_SYS_Init(VB_CONF_S *pstVbConf) +{ + MPP_SYS_CONF_S stSysConf = {0}; + HI_S32 s32Ret = HI_FAILURE; + + HI_MPI_SYS_Exit(); + HI_MPI_VB_Exit(); + + if (NULL == pstVbConf) + { + SAMPLE_PRT("input parameter is null, it is invaild!\n"); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VB_SetConf(pstVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VB_SetConf failed!\n"); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VB_Init(); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VB_Init failed!\n"); + return HI_FAILURE; + } + + stSysConf.u32AlignWidth = SAMPLE_SYS_ALIGN_WIDTH; + s32Ret = HI_MPI_SYS_SetConf(&stSysConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetConf failed\n"); + return HI_FAILURE; + } + + s32Ret = HI_MPI_SYS_Init(); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_Init failed!\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : vb init & MPI system init +******************************************************************************/ +HI_S32 SAMPLE_COMM_SYS_Payload2FilePostfix(PAYLOAD_TYPE_E enPayload, HI_CHAR* szFilePostfix) +{ + if (PT_H264 == enPayload) + { + strcpy(szFilePostfix, ".h264"); + } + else if (PT_JPEG == enPayload) + { + strcpy(szFilePostfix, ".jpg"); + } + else if (PT_MJPEG == enPayload) + { + strcpy(szFilePostfix, ".mjp"); + } + else + { + SAMPLE_PRT("payload type err!\n"); + return HI_FAILURE; + } + return HI_SUCCESS; +} + +/****************************************************************************** +* function : vb exit & MPI system exit +******************************************************************************/ +HI_VOID SAMPLE_COMM_SYS_Exit(void) +{ + HI_MPI_SYS_Exit(); + HI_MPI_VB_Exit(); + return; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ diff --git a/device/mpp/sample/common/sample_comm_venc.c b/device/mpp/sample/common/sample_comm_venc.c new file mode 100644 index 0000000..356f478 --- /dev/null +++ b/device/mpp/sample/common/sample_comm_venc.c @@ -0,0 +1,1675 @@ +/****************************************************************************** + Some simple Hisilicon Hi3531 video encode functions. + + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-2 Created +******************************************************************************/ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" + +const HI_U8 g_SOI[2] = {0xFF, 0xD8}; +const HI_U8 g_EOI[2] = {0xFF, 0xD9}; +static pthread_t gs_VencPid; +static SAMPLE_VENC_GETSTREAM_PARA_S gs_stPara; +static HI_S32 gs_s32SnapCnt = 0; + +/****************************************************************************** +* function : Set venc memory location +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_MemConfig(HI_VOID) +{ + HI_S32 i = 0; + HI_S32 s32Ret; + + HI_CHAR * pcMmzName; + MPP_CHN_S stMppChnVENC; + + /* group, venc max chn is 64*/ + for(i=0;i<64;i++) + { + + stMppChnVENC.enModId = HI_ID_VENC; + stMppChnVENC.s32DevId = 0; + stMppChnVENC.s32ChnId = i; + + + pcMmzName = NULL; + + + + /*venc*/ + s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVENC,pcMmzName); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetMemConf with %#x!\n", s32Ret); + return HI_FAILURE; + } + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* function : venc bind vpss +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_BindVpss(VENC_CHN VeChn,VPSS_GRP VpssGrp,VPSS_CHN VpssChn) +{ + HI_S32 s32Ret = HI_SUCCESS; + MPP_CHN_S stSrcChn; + MPP_CHN_S stDestChn; + + stSrcChn.enModId = HI_ID_VPSS; + stSrcChn.s32DevId = VpssGrp; + stSrcChn.s32ChnId = VpssChn; + + stDestChn.enModId = HI_ID_VENC; + stDestChn.s32DevId = 0; + stDestChn.s32ChnId = VeChn; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + return s32Ret; +} + +/****************************************************************************** +* function : venc unbind vpss +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_UnBindVpss(VENC_CHN VeChn,VPSS_GRP VpssGrp,VPSS_CHN VpssChn) +{ + HI_S32 s32Ret = HI_SUCCESS; + MPP_CHN_S stSrcChn; + MPP_CHN_S stDestChn; + + stSrcChn.enModId = HI_ID_VPSS; + stSrcChn.s32DevId = VpssGrp; + stSrcChn.s32ChnId = VpssChn; + + stDestChn.enModId = HI_ID_VENC; + stDestChn.s32DevId = 0; + stDestChn.s32ChnId = VeChn; + + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + return s32Ret; +} + + +/****************************************************************************** +* function : venc bind vo +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_BindVo(VO_DEV VoDev,VO_CHN VoChn,VENC_CHN VeChn) +{ + HI_S32 s32Ret = HI_SUCCESS; + MPP_CHN_S stSrcChn; + MPP_CHN_S stDestChn; + + stSrcChn.enModId = HI_ID_VOU; + stSrcChn.s32DevId = VoDev; + stSrcChn.s32ChnId = VoChn; + + stDestChn.enModId = HI_ID_VENC; + stDestChn.s32DevId = 0; + stDestChn.s32ChnId = VeChn; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + return s32Ret; +} + +/****************************************************************************** +* function : venc unbind vo +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_UnBindVo(VENC_CHN GrpChn,VO_DEV VoDev,VO_CHN VoChn) +{ + HI_S32 s32Ret = HI_SUCCESS; + MPP_CHN_S stSrcChn; + MPP_CHN_S stDestChn; + + stSrcChn.enModId = HI_ID_VOU; + stSrcChn.s32DevId = VoDev; + stSrcChn.s32ChnId = VoChn; + + stDestChn.enModId = HI_ID_VENC; + stDestChn.s32DevId = 0; + stDestChn.s32ChnId = GrpChn; + + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + return s32Ret; +} + + +/****************************************************************************** +* function : vdec bind venc +******************************************************************************/ +HI_S32 SAMPLE_COMM_VDEC_BindVenc(VDEC_CHN VdChn,VENC_CHN VeChn) +{ + HI_S32 s32Ret = HI_SUCCESS; + MPP_CHN_S stSrcChn; + MPP_CHN_S stDestChn; + + stSrcChn.enModId = HI_ID_VDEC; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = VdChn; + + stDestChn.enModId = HI_ID_VENC; + stDestChn.s32DevId = 0; + stDestChn.s32ChnId = VeChn; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + return s32Ret; +} + +/****************************************************************************** +* function : venc unbind vo +******************************************************************************/ +HI_S32 SAMPLE_COMM_VDEC_UnBindVenc(VDEC_CHN VdChn,VENC_CHN VeChn) +{ + HI_S32 s32Ret = HI_SUCCESS; + MPP_CHN_S stSrcChn; + MPP_CHN_S stDestChn; + + stSrcChn.enModId = HI_ID_VDEC; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = VdChn; + + stDestChn.enModId = HI_ID_VENC; + stDestChn.s32DevId = 0; + stDestChn.s32ChnId = VeChn; + + + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + return s32Ret; +} + + +/****************************************************************************** +* funciton : get file postfix according palyload_type. +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_GetFilePostfix(PAYLOAD_TYPE_E enPayload, char *szFilePostfix) +{ + if (PT_H264 == enPayload) + { + strcpy(szFilePostfix, ".h264"); + } + else if (PT_H265 == enPayload) + { + strcpy(szFilePostfix, ".h265"); + } + else if (PT_JPEG == enPayload) + { + strcpy(szFilePostfix, ".jpg"); + } + else if (PT_MJPEG == enPayload) + { + strcpy(szFilePostfix, ".mjp"); + } + else if (PT_MP4VIDEO == enPayload) + { + strcpy(szFilePostfix, ".mp4"); + } + else + { + SAMPLE_PRT("payload type err!\n"); + return HI_FAILURE; + } + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : save mjpeg stream. +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SaveMJpeg(FILE* fpMJpegFile, VENC_STREAM_S *pstStream) +{ + VENC_PACK_S* pstData; + HI_U32 i; + + //fwrite(g_SOI, 1, sizeof(g_SOI), fpJpegFile); //in Hi3531, user needn't write SOI! + + for (i = 0; i < pstStream->u32PackCount; i++) + { + pstData = &pstStream->pstPack[i]; + fwrite(pstData->pu8Addr+pstData->u32Offset, pstData->u32Len-pstData->u32Offset, 1, fpMJpegFile); + fflush(fpMJpegFile); + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : save jpeg stream. +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SaveJpeg(FILE* fpJpegFile, VENC_STREAM_S *pstStream) +{ + VENC_PACK_S* pstData; + HI_U32 i; + + for (i = 0; i < pstStream->u32PackCount; i++) + { + pstData = &pstStream->pstPack[i]; + fwrite(pstData->pu8Addr+pstData->u32Offset, pstData->u32Len-pstData->u32Offset, 1, fpJpegFile); + fflush(fpJpegFile); + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : save H264 stream +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SaveH264(FILE* fpH264File, VENC_STREAM_S *pstStream) +{ + HI_S32 i; + + + for (i = 0; i < pstStream->u32PackCount; i++) + { + fwrite(pstStream->pstPack[i].pu8Addr+pstStream->pstPack[i].u32Offset, + pstStream->pstPack[i].u32Len-pstStream->pstPack[i].u32Offset, 1, fpH264File); + + fflush(fpH264File); + } + + + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : save H265 stream +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SaveH265(FILE* fpH265File, VENC_STREAM_S *pstStream) +{ + HI_S32 i; + + for (i = 0; i < pstStream->u32PackCount; i++) + { + fwrite(pstStream->pstPack[i].pu8Addr+pstStream->pstPack[i].u32Offset, + pstStream->pstPack[i].u32Len-pstStream->pstPack[i].u32Offset, 1, fpH265File); + + fflush(fpH265File); + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : save jpeg stream +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SaveJPEG(FILE *fpJpegFile, VENC_STREAM_S *pstStream) +{ + VENC_PACK_S* pstData; + HI_U32 i; + + for (i = 0; i < pstStream->u32PackCount; i++) + { + pstData = &pstStream->pstPack[i]; + fwrite(pstData->pu8Addr+pstData->u32Offset, pstData->u32Len-pstData->u32Offset, 1, fpJpegFile); + fflush(fpJpegFile); + } + + return HI_SUCCESS; +} +/****************************************************************************** +* funciton : save snap stream +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SaveSnap(VENC_STREAM_S *pstStream) +{ + char acFile[128] = {0}; + FILE *pFile; + HI_S32 s32Ret; + + sprintf(acFile, "snap_%d.jpg", gs_s32SnapCnt); + pFile = fopen(acFile, "wb"); + if (pFile == NULL) + { + SAMPLE_PRT("open file err\n"); + return HI_FAILURE; + } + s32Ret = SAMPLE_COMM_VENC_SaveJPEG(pFile, pstStream); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("save snap picture failed!\n"); + return HI_FAILURE; + } + fclose(pFile); + gs_s32SnapCnt++; + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : save stream +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SaveStream(PAYLOAD_TYPE_E enType,FILE *pFd, VENC_STREAM_S *pstStream) +{ + HI_S32 s32Ret; + + if (PT_H264 == enType) + { + s32Ret = SAMPLE_COMM_VENC_SaveH264(pFd, pstStream); + } + else if (PT_MJPEG == enType) + { + s32Ret = SAMPLE_COMM_VENC_SaveMJpeg(pFd, pstStream); + } + else if (PT_H265 == enType) + { + s32Ret = SAMPLE_COMM_VENC_SaveH265(pFd, pstStream); + } + else + { + return HI_FAILURE; + } + return s32Ret; +} + +/****************************************************************************** +* funciton : Start venc stream mode (h264, mjpeg) +* note : rate control parameter need adjust, according your case. +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_Start(VENC_CHN VencChn, PAYLOAD_TYPE_E enType, VIDEO_NORM_E enNorm, PIC_SIZE_E enSize, SAMPLE_RC_E enRcMode,HI_U32 u32Profile) +{ + HI_S32 s32Ret; + VENC_CHN_ATTR_S stVencChnAttr; + VENC_ATTR_H264_S stH264Attr; + VENC_ATTR_H264_CBR_S stH264Cbr; + VENC_ATTR_H264_VBR_S stH264Vbr; + VENC_ATTR_H264_FIXQP_S stH264FixQp; + VENC_ATTR_H265_S stH265Attr; + VENC_ATTR_H265_CBR_S stH265Cbr; + VENC_ATTR_H265_VBR_S stH265Vbr; + VENC_ATTR_H265_FIXQP_S stH265FixQp; + VENC_ATTR_MJPEG_S stMjpegAttr; + VENC_ATTR_MJPEG_FIXQP_S stMjpegeFixQp; + VENC_ATTR_JPEG_S stJpegAttr; + SIZE_S stPicSize; + + s32Ret = SAMPLE_COMM_SYS_GetPicSize(enNorm, enSize, &stPicSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Get picture size failed!\n"); + return HI_FAILURE; + } + + /****************************************** + step 1: Create Venc Channel + ******************************************/ + stVencChnAttr.stVeAttr.enType = enType; + switch(enType) + { + case PT_H264: + { + stH264Attr.u32MaxPicWidth = stPicSize.u32Width; + stH264Attr.u32MaxPicHeight = stPicSize.u32Height; + stH264Attr.u32PicWidth = stPicSize.u32Width;/*the picture width*/ + stH264Attr.u32PicHeight = stPicSize.u32Height;/*the picture height*/ + stH264Attr.u32BufSize = stPicSize.u32Width * stPicSize.u32Height * 2;/*stream buffer size*/ + stH264Attr.u32Profile = u32Profile;/*0: baseline; 1:MP; 2:HP; 3:svc_t */ + stH264Attr.bByFrame = HI_TRUE;/*get stream mode is slice mode or frame mode?*/ + stH264Attr.u32BFrameNum = 0;/* 0: not support B frame; >=1: number of B frames */ + stH264Attr.u32RefNum = 1;/* 0: default; number of refrence frame*/ + memcpy(&stVencChnAttr.stVeAttr.stAttrH264e, &stH264Attr, sizeof(VENC_ATTR_H264_S)); + + if(SAMPLE_RC_CBR == enRcMode) + { + stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR; + stH264Cbr.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH264Cbr.u32StatTime = 1; /* stream rate statics time(s) */ + stH264Cbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;/* input (vi) frame rate */ + stH264Cbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;/* target frame rate */ + + switch (enSize) + { + case PIC_QCIF: + stH264Cbr.u32BitRate = 256; /* average bit rate */ + break; + case PIC_QVGA: /* 320 * 240 */ + case PIC_CIF: + + stH264Cbr.u32BitRate = 512; + break; + + case PIC_D1: + case PIC_VGA: /* 640 * 480 */ + stH264Cbr.u32BitRate = 1024*2; + break; + case PIC_HD720: /* 1280 * 720 */ + stH264Cbr.u32BitRate = 1024*2; + break; + case PIC_HD1080: /* 1920 * 1080 */ + stH264Cbr.u32BitRate = 1024*4; + break; + case PIC_5M: /* 2592 * 1944 */ + stH264Cbr.u32BitRate = 1024*8; + break; + default : + stH264Cbr.u32BitRate = 1024*4; + break; + } + + stH264Cbr.u32FluctuateLevel = 0; /* average bit rate */ + memcpy(&stVencChnAttr.stRcAttr.stAttrH264Cbr, &stH264Cbr, sizeof(VENC_ATTR_H264_CBR_S)); + } + else if (SAMPLE_RC_FIXQP == enRcMode) + { + stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264FIXQP; + stH264FixQp.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH264FixQp.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH264FixQp.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH264FixQp.u32IQp = 20; + stH264FixQp.u32PQp = 23; + memcpy(&stVencChnAttr.stRcAttr.stAttrH264FixQp, &stH264FixQp,sizeof(VENC_ATTR_H264_FIXQP_S)); + } + else if (SAMPLE_RC_VBR == enRcMode) + { + stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264VBR; + stH264Vbr.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH264Vbr.u32StatTime = 1; + stH264Vbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH264Vbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH264Vbr.u32MinQp = 10; + stH264Vbr.u32MaxQp = 40; + switch (enSize) + { + case PIC_QCIF: + stH264Vbr.u32MaxBitRate= 256*3; /* average bit rate */ + break; + case PIC_QVGA: /* 320 * 240 */ + case PIC_CIF: + stH264Vbr.u32MaxBitRate = 512*3; + break; + case PIC_D1: + case PIC_VGA: /* 640 * 480 */ + stH264Vbr.u32MaxBitRate = 1024*2; + break; + case PIC_HD720: /* 1280 * 720 */ + stH264Vbr.u32MaxBitRate = 1024*3; + break; + case PIC_HD1080: /* 1920 * 1080 */ + stH264Vbr.u32MaxBitRate = 1024*6; + break; + case PIC_5M: /* 2592 * 1944 */ + stH264Vbr.u32MaxBitRate = 1024*8; + break; + default : + stH264Vbr.u32MaxBitRate = 1024*4; + break; + } + memcpy(&stVencChnAttr.stRcAttr.stAttrH264Vbr, &stH264Vbr, sizeof(VENC_ATTR_H264_VBR_S)); + } + else + { + return HI_FAILURE; + } + } + break; + + case PT_MJPEG: + { + stMjpegAttr.u32MaxPicWidth = stPicSize.u32Width; + stMjpegAttr.u32MaxPicHeight = stPicSize.u32Height; + stMjpegAttr.u32PicWidth = stPicSize.u32Width; + stMjpegAttr.u32PicHeight = stPicSize.u32Height; + stMjpegAttr.u32BufSize = stPicSize.u32Width * stPicSize.u32Height * 2; + stMjpegAttr.bByFrame = HI_TRUE; /*get stream mode is field mode or frame mode*/ + memcpy(&stVencChnAttr.stVeAttr.stAttrMjpeg, &stMjpegAttr, sizeof(VENC_ATTR_MJPEG_S)); + + if(SAMPLE_RC_FIXQP == enRcMode) + { + stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_MJPEGFIXQP; + stMjpegeFixQp.u32Qfactor = 90; + stMjpegeFixQp.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stMjpegeFixQp.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + memcpy(&stVencChnAttr.stRcAttr.stAttrMjpegeFixQp, &stMjpegeFixQp, + sizeof(VENC_ATTR_MJPEG_FIXQP_S)); + } + else if (SAMPLE_RC_CBR == enRcMode) + { + stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_MJPEGCBR; + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32StatTime = 1; + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32FluctuateLevel = 0; + switch (enSize) + { + case PIC_QCIF: + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32BitRate = 384*3; /* average bit rate */ + break; + case PIC_QVGA: /* 320 * 240 */ + case PIC_CIF: + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32BitRate = 768*3; + break; + case PIC_D1: + case PIC_VGA: /* 640 * 480 */ + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32BitRate = 1024*3*3; + break; + case PIC_HD720: /* 1280 * 720 */ + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32BitRate = 1024*5*3; + break; + case PIC_HD1080: /* 1920 * 1080 */ + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32BitRate = 1024*10*3; + break; + case PIC_5M: /* 2592 * 1944 */ + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32BitRate = 1024*10*3; + break; + default : + stVencChnAttr.stRcAttr.stAttrMjpegeCbr.u32BitRate = 1024*10*3; + break; + } + } + else if (SAMPLE_RC_VBR == enRcMode) + { + stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_MJPEGVBR; + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32StatTime = 1; + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL == enNorm)?25:30; + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.fr32DstFrmRate = 5; + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32MinQfactor = 50; + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32MaxQfactor = 95; + switch (enSize) + { + case PIC_QCIF: + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32MaxBitRate= 256*3; /* average bit rate */ + break; + case PIC_QVGA: /* 320 * 240 */ + case PIC_CIF: + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32MaxBitRate = 512*3; + break; + case PIC_D1: + case PIC_VGA: /* 640 * 480 */ + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32MaxBitRate = 1024*2*3; + break; + case PIC_HD720: /* 1280 * 720 */ + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32MaxBitRate = 1024*3*3; + break; + case PIC_HD1080: /* 1920 * 1080 */ + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32MaxBitRate = 1024*6*3; + break; + case PIC_5M: /* 2592 * 1944 */ + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32MaxBitRate = 1024*12*3; + break; + default : + stVencChnAttr.stRcAttr.stAttrMjpegeVbr.u32MaxBitRate = 1024*4*3; + break; + } + } + else + { + SAMPLE_PRT("cann't support other mode in this version!\n"); + + return HI_FAILURE; + } + } + break; + + case PT_JPEG: + stJpegAttr.u32PicWidth = stPicSize.u32Width; + stJpegAttr.u32PicHeight = stPicSize.u32Height; + stJpegAttr.u32MaxPicWidth = stPicSize.u32Width; + stJpegAttr.u32MaxPicHeight = stPicSize.u32Height; + stJpegAttr.u32BufSize = stPicSize.u32Width * stPicSize.u32Height * 2; + stJpegAttr.bByFrame = HI_TRUE;/*get stream mode is field mode or frame mode*/ + stJpegAttr.bSupportDCF = HI_FALSE; + memcpy(&stVencChnAttr.stVeAttr.stAttrJpeg, &stJpegAttr, sizeof(VENC_ATTR_JPEG_S)); + break; + + case PT_H265: + { + stH265Attr.u32MaxPicWidth = stPicSize.u32Width; + stH265Attr.u32MaxPicHeight = stPicSize.u32Height; + stH265Attr.u32PicWidth = stPicSize.u32Width;/*the picture width*/ + stH265Attr.u32PicHeight = stPicSize.u32Height;/*the picture height*/ + stH265Attr.u32BufSize = stPicSize.u32Width * stPicSize.u32Height * 2;/*stream buffer size*/ + if(u32Profile >=1) + stH265Attr.u32Profile = 0;/*0:MP; */ + else + stH265Attr.u32Profile = u32Profile;/*0:MP*/ + stH265Attr.bByFrame = HI_TRUE;/*get stream mode is slice mode or frame mode?*/ + stH265Attr.u32BFrameNum = 0;/* 0: not support B frame; >=1: number of B frames */ + stH265Attr.u32RefNum = 1;/* 0: default; number of refrence frame*/ + memcpy(&stVencChnAttr.stVeAttr.stAttrH265e, &stH265Attr, sizeof(VENC_ATTR_H265_S)); + + if(SAMPLE_RC_CBR == enRcMode) + { + stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265CBR; + stH265Cbr.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH265Cbr.u32StatTime = 1; /* stream rate statics time(s) */ + stH265Cbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;/* input (vi) frame rate */ + stH265Cbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30;/* target frame rate */ + switch (enSize) + { + case PIC_QCIF: + stH265Cbr.u32BitRate = 256; /* average bit rate */ + break; + case PIC_QVGA: /* 320 * 240 */ + case PIC_CIF: + + stH265Cbr.u32BitRate = 512; + break; + + case PIC_D1: + case PIC_VGA: /* 640 * 480 */ + stH265Cbr.u32BitRate = 1024*2; + break; + case PIC_HD720: /* 1280 * 720 */ + stH265Cbr.u32BitRate = 1024*3; + break; + case PIC_HD1080: /* 1920 * 1080 */ + stH265Cbr.u32BitRate = 1024*4; + break; + case PIC_5M: /* 2592 * 1944 */ + stH265Cbr.u32BitRate = 1024*8; + break; + default : + stH265Cbr.u32BitRate = 1024*4; + break; + } + + stH265Cbr.u32FluctuateLevel = 0; /* average bit rate */ + memcpy(&stVencChnAttr.stRcAttr.stAttrH265Cbr, &stH265Cbr, sizeof(VENC_ATTR_H265_CBR_S)); + } + else if (SAMPLE_RC_FIXQP == enRcMode) + { + stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265FIXQP; + stH265FixQp.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH265FixQp.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH265FixQp.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH265FixQp.u32IQp = 20; + stH265FixQp.u32PQp = 23; + memcpy(&stVencChnAttr.stRcAttr.stAttrH265FixQp, &stH265FixQp,sizeof(VENC_ATTR_H265_FIXQP_S)); + } + else if (SAMPLE_RC_VBR == enRcMode) + { + stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265VBR; + stH265Vbr.u32Gop = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH265Vbr.u32StatTime = 1; + stH265Vbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH265Vbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== enNorm)?25:30; + stH265Vbr.u32MinQp = 10; + stH265Vbr.u32MaxQp = 40; + switch (enSize) + { + case PIC_QCIF: + stH265Vbr.u32MaxBitRate= 256*3; /* average bit rate */ + break; + case PIC_QVGA: /* 320 * 240 */ + case PIC_CIF: + stH265Vbr.u32MaxBitRate = 512*3; + break; + case PIC_D1: + case PIC_VGA: /* 640 * 480 */ + stH265Vbr.u32MaxBitRate = 1024*2; + break; + case PIC_HD720: /* 1280 * 720 */ + stH265Vbr.u32MaxBitRate = 1024*3; + break; + case PIC_HD1080: /* 1920 * 1080 */ + stH265Vbr.u32MaxBitRate = 1024*6; + break; + case PIC_5M: /* 2592 * 1944 */ + stH265Vbr.u32MaxBitRate = 1024*8; + break; + default : + stH265Vbr.u32MaxBitRate = 1024*4; + break; + } + memcpy(&stVencChnAttr.stRcAttr.stAttrH265Vbr, &stH265Vbr, sizeof(VENC_ATTR_H265_VBR_S)); + } + else + { + return HI_FAILURE; + } + } + break; + default: + return HI_ERR_VENC_NOT_SUPPORT; + } + + s32Ret = HI_MPI_VENC_CreateChn(VencChn, &stVencChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_CreateChn [%d] faild with %#x!\n",\ + VencChn, s32Ret); + return s32Ret; + } + + /****************************************** + step 2: Start Recv Venc Pictures + ******************************************/ + s32Ret = HI_MPI_VENC_StartRecvPic(VencChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_StartRecvPic faild with%#x!\n", s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; + +} + +/****************************************************************************** +* funciton : Stop venc ( stream mode -- H264, MJPEG ) +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_Stop(VENC_CHN VencChn) +{ + HI_S32 s32Ret; + + /****************************************** + step 1: Stop Recv Pictures + ******************************************/ + s32Ret = HI_MPI_VENC_StopRecvPic(VencChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_StopRecvPic vechn[%d] failed with %#x!\n",\ + VencChn, s32Ret); + return HI_FAILURE; + } + + /****************************************** + step 2: Distroy Venc Channel + ******************************************/ + s32Ret = HI_MPI_VENC_DestroyChn(VencChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_DestroyChn vechn[%d] failed with %#x!\n",\ + VencChn, s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : Start snap +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SnapStart(VENC_CHN VencChn, SIZE_S *pstSize) +{ + HI_S32 s32Ret; + VENC_CHN_ATTR_S stVencChnAttr; + VENC_ATTR_JPEG_S stJpegAttr; + + /****************************************** + step 1: Create Venc Channel + ******************************************/ + stVencChnAttr.stVeAttr.enType = PT_JPEG; + + stJpegAttr.u32MaxPicWidth = pstSize->u32Width; + stJpegAttr.u32MaxPicHeight = pstSize->u32Height; + stJpegAttr.u32PicWidth = pstSize->u32Width; + stJpegAttr.u32PicHeight = pstSize->u32Height; + stJpegAttr.u32BufSize = pstSize->u32Width * pstSize->u32Height * 2; + stJpegAttr.bByFrame = HI_TRUE;/*get stream mode is field mode or frame mode*/ + stJpegAttr.bSupportDCF = HI_FALSE; + memcpy(&stVencChnAttr.stVeAttr.stAttrJpeg, &stJpegAttr, sizeof(VENC_ATTR_JPEG_S)); + + s32Ret = HI_MPI_VENC_CreateChn(VencChn, &stVencChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_CreateChn [%d] faild with %#x!\n",\ + VencChn, s32Ret); + return s32Ret; + } + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : Stop snap +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SnapStop(VENC_CHN VencChn) +{ + HI_S32 s32Ret; + + s32Ret = HI_MPI_VENC_StopRecvPic(VencChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_StopRecvPic vechn[%d] failed with %#x!\n", VencChn, s32Ret); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VENC_DestroyChn(VencChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_DestroyChn vechn[%d] failed with %#x!\n", VencChn, s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : snap process +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_SnapProcess (VENC_CHN VencChn) +{ + struct timeval TimeoutVal; + fd_set read_fds; + HI_S32 s32VencFd; + HI_S32 s32VencStreamFd; + VENC_CHN_STAT_S stStat; + VENC_STREAM_S stStream; + HI_S32 s32Ret; + VENC_RECV_PIC_PARAM_S stRecvParam; + printf("press any key to snap one pic\n"); + //getchar(); + + /****************************************** + step 2: Start Recv Venc Pictures + ******************************************/ + stRecvParam.s32RecvPicNum = 1; + s32Ret = HI_MPI_VENC_StartRecvPicEx(VencChn,&stRecvParam); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_StartRecvPic faild with%#x!\n", s32Ret); + return HI_FAILURE; + } + /****************************************** + step 3: recv picture + ******************************************/ + s32VencFd = HI_MPI_VENC_GetFd(VencChn); + s32VencStreamFd = HI_MPI_VENC_GetFd(0); + if (s32VencFd < 0) + { + SAMPLE_PRT("HI_MPI_VENC_GetFd faild with%#x!\n", s32VencFd); + return HI_FAILURE; + } + + printf("\r\nsnap venc picture is %d fd is %d stream %d fd is %d\r\n",VencChn,s32VencFd,0,s32VencStreamFd); + FD_ZERO(&read_fds); + FD_SET(s32VencFd, &read_fds); + FD_SET(s32VencStreamFd, &read_fds); + + TimeoutVal.tv_sec = 2; + TimeoutVal.tv_usec = 0; + s32Ret = select(s32VencFd + 1, &read_fds, NULL, NULL, &TimeoutVal); + if (s32Ret < 0) + { + SAMPLE_PRT("snap select failed!\n"); + return HI_FAILURE; + } + else if (0 == s32Ret) + { + printf("select timeout \r\n"); + return HI_FAILURE; + } + else + { + if (FD_ISSET(s32VencFd, &read_fds)) + { + printf("venc picture \r\n"); + s32Ret = HI_MPI_VENC_Query(VencChn, &stStat); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VENC_Query failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + /******************************************************* + suggest to check both u32CurPacks and u32LeftStreamFrames at the same time,for example: + if(0 == stStat.u32CurPacks || 0 == stStat.u32LeftStreamFrames) + { + SAMPLE_PRT("NOTE: Current frame is NULL!\n"); + return HI_SUCCESS; + } + *******************************************************/ + if(0 == stStat.u32CurPacks) + { + SAMPLE_PRT("NOTE: Current frame is NULL!\n"); + return HI_SUCCESS; + } + printf("recieve %d packs %d %d\r\n",stStat.u32CurPacks,stStat.u32LeftRecvPics,stStat.u32LeftStreamFrames); + stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks); + if (NULL == stStream.pstPack) + { + SAMPLE_PRT("malloc memory failed!\n"); + return HI_FAILURE; + } + + stStream.u32PackCount = stStat.u32CurPacks; + s32Ret = HI_MPI_VENC_GetStream(VencChn, &stStream, -1); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", s32Ret); + free(stStream.pstPack); + stStream.pstPack = NULL; + return HI_FAILURE; + } + + /*s32Ret = SAMPLE_COMM_VENC_SaveSnap(&stStream); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", s32Ret); + free(stStream.pstPack); + stStream.pstPack = NULL; + return HI_FAILURE; + }*/ + + s32Ret = HI_MPI_VENC_ReleaseStream(VencChn, &stStream); + if (s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_ReleaseStream failed with %#x!\n", s32Ret); + free(stStream.pstPack); + stStream.pstPack = NULL; + return HI_FAILURE; + } + + free(stStream.pstPack); + stStream.pstPack = NULL; + } + + if(FD_ISSET(s32VencStreamFd,&read_fds)) { + printf("venc stream \r\n"); + s32Ret = HI_MPI_VENC_Query(0, &stStat); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VENC_Query failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + /******************************************************* + suggest to check both u32CurPacks and u32LeftStreamFrames at the same time,for example: + if(0 == stStat.u32CurPacks || 0 == stStat.u32LeftStreamFrames) + { + SAMPLE_PRT("NOTE: Current frame is NULL!\n"); + return HI_SUCCESS; + } + *******************************************************/ + + if(0 == stStat.u32CurPacks) + { + SAMPLE_PRT("NOTE: Current frame is NULL!\n"); + return HI_SUCCESS; + } + printf("recieve %d packs %d %d\r\n",stStat.u32CurPacks,stStat.u32LeftRecvPics,stStat.u32LeftStreamFrames); + stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks); + if (NULL == stStream.pstPack) + { + SAMPLE_PRT("malloc memory failed!\n"); + return HI_FAILURE; + } + /* + stStream.u32PackCount = stStat.u32CurPacks; + s32Ret = HI_MPI_VENC_GetStream(0, &stStream, -1); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", s32Ret); + free(stStream.pstPack); + stStream.pstPack = NULL; + return HI_FAILURE; + } + s32Ret = HI_MPI_VENC_ReleaseStream(0, &stStream); + if (s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_ReleaseStream failed with %#x!\n", s32Ret); + free(stStream.pstPack); + stStream.pstPack = NULL; + return HI_FAILURE; + } + + free(stStream.pstPack); + stStream.pstPack = NULL;*/ + } + } + /****************************************** + step 4: stop recv picture + ******************************************/ + s32Ret = HI_MPI_VENC_StopRecvPic(VencChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VENC_StopRecvPic failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : get stream from each channels and save them +******************************************************************************/ +HI_VOID* SAMPLE_COMM_VENC_GetVencStreamProc(HI_VOID *p) +{ + HI_S32 i; + HI_S32 s32ChnTotal; + VENC_CHN_ATTR_S stVencChnAttr; + SAMPLE_VENC_GETSTREAM_PARA_S *pstPara; + HI_S32 maxfd = 0; + struct timeval TimeoutVal; + fd_set read_fds; + HI_S32 VencFd[VENC_MAX_CHN_NUM]; + HI_CHAR aszFileName[VENC_MAX_CHN_NUM][64]; + FILE *pFile[VENC_MAX_CHN_NUM]; + char szFilePostfix[10]; + VENC_CHN_STAT_S stStat; + VENC_STREAM_S stStream; + + HI_S32 s32Ret; + VENC_CHN VencChn; + printf("venc stream chn is %d\r\n",VencChn); + PAYLOAD_TYPE_E enPayLoadType[VENC_MAX_CHN_NUM]; + + pstPara = (SAMPLE_VENC_GETSTREAM_PARA_S*)p; + s32ChnTotal = pstPara->s32Cnt; + printf("input count is %d\r\n",pstPara->s32Cnt); + /****************************************** + step 1: check & prepare save-file & venc-fd + ******************************************/ + if (s32ChnTotal >= VENC_MAX_CHN_NUM) + { + SAMPLE_PRT("input count invaild\n"); + return NULL; + } + for (i = 0; i < s32ChnTotal; i++) + { + /* decide the stream file name, and open file to save stream */ + VencChn = i; + s32Ret = HI_MPI_VENC_GetChnAttr(VencChn, &stVencChnAttr); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VENC_GetChnAttr chn[%d] failed with %#x!\n", \ + VencChn, s32Ret); + return NULL; + } + enPayLoadType[i] = stVencChnAttr.stVeAttr.enType; + + s32Ret = SAMPLE_COMM_VENC_GetFilePostfix(enPayLoadType[i], szFilePostfix); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_VENC_GetFilePostfix [%d] failed with %#x!\n", \ + stVencChnAttr.stVeAttr.enType, s32Ret); + return NULL; + } + sprintf(aszFileName[i], "stream_chn%d%s", i, szFilePostfix); + pFile[i] = fopen(aszFileName[i], "wb"); + if (!pFile[i]) + { + SAMPLE_PRT("open file[%s] failed!\n", + aszFileName[i]); + return NULL; + } + + /* Set Venc Fd. */ + VencFd[i] = HI_MPI_VENC_GetFd(i); + printf("venc fd %d %d",i,VencFd[i]); + if (VencFd[i] < 0) + { + SAMPLE_PRT("HI_MPI_VENC_GetFd failed with %#x!\n", + VencFd[i]); + return NULL; + } + if (maxfd <= VencFd[i]) + { + maxfd = VencFd[i]; + } + } + + /****************************************** + step 2: Start to get streams of each channel. + ******************************************/ + while (HI_TRUE == pstPara->bThreadStart) + { + FD_ZERO(&read_fds); + for (i = 0; i < s32ChnTotal; i++) + { + FD_SET(VencFd[i], &read_fds); + } + + TimeoutVal.tv_sec = 2; + TimeoutVal.tv_usec = 0; + s32Ret = select(maxfd + 1, &read_fds, NULL, NULL, &TimeoutVal); + if (s32Ret < 0) + { + SAMPLE_PRT("select failed!\n"); + break; + } + else if (s32Ret == 0) + { + SAMPLE_PRT("get venc stream time out, exit thread\n"); + continue; + } + else + { + for (i = 0; i < s32ChnTotal; i++) + { + if (FD_ISSET(VencFd[i], &read_fds)) + { + /******************************************************* + step 2.1 : query how many packs in one-frame stream. + *******************************************************/ + memset(&stStream, 0, sizeof(stStream)); + s32Ret = HI_MPI_VENC_Query(i, &stStat); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_Query chn[%d] failed with %#x!\n", i, s32Ret); + break; + } + /******************************************************* + step 2.2 :suggest to check both u32CurPacks and u32LeftStreamFrames at the same time,for example: + if(0 == stStat.u32CurPacks || 0 == stStat.u32LeftStreamFrames) + { + SAMPLE_PRT("NOTE: Current frame is NULL!\n"); + continue; + } + *******************************************************/ + if(0 == stStat.u32CurPacks) + { + SAMPLE_PRT("NOTE: Current frame is NULL!\n"); + continue; + } + /******************************************************* + step 2.3 : malloc corresponding number of pack nodes. + *******************************************************/ + stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks); + if (NULL == stStream.pstPack) + { + SAMPLE_PRT("malloc stream pack failed!\n"); + break; + } + + /******************************************************* + step 2.4 : call mpi to get one-frame stream + *******************************************************/ + stStream.u32PackCount = stStat.u32CurPacks; + s32Ret = HI_MPI_VENC_GetStream(i, &stStream, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + free(stStream.pstPack); + stStream.pstPack = NULL; + SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", \ + s32Ret); + break; + } + + /******************************************************* + step 2.5 : save frame to file + *******************************************************/ + s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i], &stStream); + if (HI_SUCCESS != s32Ret) + { + free(stStream.pstPack); + stStream.pstPack = NULL; + SAMPLE_PRT("save stream failed!\n"); + break; + } + /******************************************************* + step 2.6 : release stream + *******************************************************/ + s32Ret = HI_MPI_VENC_ReleaseStream(i, &stStream); + if (HI_SUCCESS != s32Ret) + { + free(stStream.pstPack); + stStream.pstPack = NULL; + break; + } + /******************************************************* + step 2.7 : free pack nodes + *******************************************************/ + free(stStream.pstPack); + stStream.pstPack = NULL; + } + } + } + } + + /******************************************************* + * step 3 : close save-file + *******************************************************/ + for (i = 0; i < s32ChnTotal; i++) + { + fclose(pFile[i]); + } + + return NULL; +} + + + +/****************************************************************************** +* funciton : get svc_t stream from h264 channels and save them +******************************************************************************/ +HI_VOID *SAMPLE_COMM_VENC_GetVencStreamProc_Svc_t(void *p) +{ + HI_S32 i=0; + HI_S32 s32Cnt=0; + HI_S32 s32ChnTotal; + VENC_CHN_ATTR_S stVencChnAttr; + SAMPLE_VENC_GETSTREAM_PARA_S *pstPara; + HI_S32 maxfd = 0; + struct timeval TimeoutVal; + fd_set read_fds; + HI_S32 VencFd[VENC_MAX_CHN_NUM]; + HI_CHAR aszFileName[VENC_MAX_CHN_NUM][64]; + FILE *pFile[VENC_MAX_CHN_NUM]; + char szFilePostfix[10]; + VENC_CHN_STAT_S stStat; + VENC_STREAM_S stStream; + HI_S32 s32Ret; + VENC_CHN VencChn; + PAYLOAD_TYPE_E enPayLoadType[VENC_MAX_CHN_NUM]; + + pstPara = (SAMPLE_VENC_GETSTREAM_PARA_S*)p; + s32ChnTotal = pstPara->s32Cnt; + + /****************************************** + step 1: check & prepare save-file & venc-fd + ******************************************/ + if (s32ChnTotal >= VENC_MAX_CHN_NUM) + { + SAMPLE_PRT("input count invaild\n"); + return NULL; + } + for (i = 0; i < s32ChnTotal; i++) + { + /* decide the stream file name, and open file to save stream */ + VencChn = i; + s32Ret = HI_MPI_VENC_GetChnAttr(VencChn, &stVencChnAttr); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VENC_GetChnAttr chn[%d] failed with %#x!\n", \ + VencChn, s32Ret); + return NULL; + } + enPayLoadType[i] = stVencChnAttr.stVeAttr.enType; + + s32Ret = SAMPLE_COMM_VENC_GetFilePostfix(enPayLoadType[i], szFilePostfix); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_VENC_GetFilePostfix [%d] failed with %#x!\n", \ + stVencChnAttr.stVeAttr.enType, s32Ret); + return NULL; + } + for(s32Cnt =0; s32Cnt<3; s32Cnt++) + { + sprintf(aszFileName[i+s32Cnt], "Tid%d%s", i+s32Cnt, szFilePostfix); + pFile[i+s32Cnt] = fopen(aszFileName[i+s32Cnt], "wb"); + + if (!pFile[i+s32Cnt]) + { + SAMPLE_PRT("open file[%s] failed!\n", + aszFileName[i+s32Cnt]); + return NULL; + } + } + + /* Set Venc Fd. */ + VencFd[i] = HI_MPI_VENC_GetFd(i); + if (VencFd[i] < 0) + { + SAMPLE_PRT("HI_MPI_VENC_GetFd failed with %#x!\n", + VencFd[i]); + return NULL; + } + if (maxfd <= VencFd[i]) + { + maxfd = VencFd[i]; + } + } + + /****************************************** + step 2: Start to get streams of each channel. + ******************************************/ + while (HI_TRUE == pstPara->bThreadStart) + { + FD_ZERO(&read_fds); + for (i = 0; i < s32ChnTotal; i++) + { + FD_SET(VencFd[i], &read_fds); + } + + TimeoutVal.tv_sec = 2; + TimeoutVal.tv_usec = 0; + s32Ret = select(maxfd + 1, &read_fds, NULL, NULL, &TimeoutVal); + if (s32Ret < 0) + { + SAMPLE_PRT("select failed!\n"); + break; + } + else if (s32Ret == 0) + { + SAMPLE_PRT("get venc stream time out, exit thread\n"); + continue; + } + else + { + for (i = 0; i < s32ChnTotal; i++) + { + if (FD_ISSET(VencFd[i], &read_fds)) + { + /******************************************************* + step 2.1 : query how many packs in one-frame stream. + *******************************************************/ + memset(&stStream, 0, sizeof(stStream)); + s32Ret = HI_MPI_VENC_Query(i, &stStat); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_Query chn[%d] failed with %#x!\n", i, s32Ret); + break; + } + + /******************************************************* + step 2.2 :suggest to check both u32CurPacks and u32LeftStreamFrames at the same time,for example: + if(0 == stStat.u32CurPacks || 0 == stStat.u32LeftStreamFrames) + { + SAMPLE_PRT("NOTE: Current frame is NULL!\n"); + continue; + } + *******************************************************/ + if(0 == stStat.u32CurPacks) + { + SAMPLE_PRT("NOTE: Current frame is NULL!\n"); + continue; + } + /******************************************************* + step 2.3 : malloc corresponding number of pack nodes. + *******************************************************/ + stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks); + if (NULL == stStream.pstPack) + { + SAMPLE_PRT("malloc stream pack failed!\n"); + break; + } + + /******************************************************* + step 2.4 : call mpi to get one-frame stream + *******************************************************/ + stStream.u32PackCount = stStat.u32CurPacks; + s32Ret = HI_MPI_VENC_GetStream(i, &stStream, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + free(stStream.pstPack); + stStream.pstPack = NULL; + SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", \ + s32Ret); + break; + } + + /******************************************************* + step 2.5 : save frame to file + *******************************************************/ +#if 1 + for(s32Cnt=0;s32Cnt<3;s32Cnt++) + { + + switch(s32Cnt) + { + case 0: + if(BASE_IDRSLICE == stStream.stH264Info.enRefType || + BASE_PSLICE_REFBYBASE == stStream.stH264Info.enRefType) + { + s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i+s32Cnt], &stStream); + } + break; + + case 1: + if(BASE_IDRSLICE == stStream.stH264Info.enRefType || + BASE_PSLICE_REFBYBASE == stStream.stH264Info.enRefType || + BASE_PSLICE_REFBYENHANCE== stStream.stH264Info.enRefType) + { + s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i+s32Cnt], &stStream); + } + break; + + case 2: + s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i+s32Cnt], &stStream); + break; + } + + + if (HI_SUCCESS != s32Ret) + { + free(stStream.pstPack); + stStream.pstPack = NULL; + SAMPLE_PRT("save stream failed!\n"); + break; + } + } +#else + + for(s32Cnt=0;s32Cnt<3;s32Cnt++) + { + if(s32Cnt == 0) + { + if (NULL != pFile[i+s32Cnt]) + { + if(BASE_IDRSLICE == stStream.stH264Info.enRefType || + BASE_PSLICE_REFBYBASE == stStream.stH264Info.enRefType) + { + s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i+s32Cnt], &stStream); + } + + } + + } + else if(s32Cnt == 1) + { + if (NULL != pFile[i+s32Cnt]) + { + if(BASE_IDRSLICE == stStream.stH264Info.enRefType || + BASE_PSLICE_REFBYBASE == stStream.stH264Info.enRefType|| + BASE_PSLICE_REFBYENHANCE== stStream.stH264Info.enRefType) + { + s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i+s32Cnt], &stStream); + } + + } + + } + else + { + if (NULL != pFile[i+s32Cnt]) + { + s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i+s32Cnt], &stStream); + } + + } + } + if (HI_SUCCESS != s32Ret) + { + free(stStream.pstPack); + stStream.pstPack = NULL; + SAMPLE_PRT("save stream failed!\n"); + break; + } +#endif + /******************************************************* + step 2.6 : release stream + *******************************************************/ + s32Ret = HI_MPI_VENC_ReleaseStream(i, &stStream); + if (HI_SUCCESS != s32Ret) + { + free(stStream.pstPack); + stStream.pstPack = NULL; + break; + } + /******************************************************* + step 2.7 : free pack nodes + *******************************************************/ + free(stStream.pstPack); + stStream.pstPack = NULL; + } + } + } + } + + /******************************************************* + step 3 : close save-file + *******************************************************/ + for (i = 0; i < s32ChnTotal; i++) + { + for (s32Cnt = 0; s32Cnt < 3; s32Cnt++) + { + if (pFile[i+s32Cnt]) + { + fclose(pFile[i+s32Cnt]); + } + } + } + + return NULL; +} + +/****************************************************************************** +* funciton : start get venc stream process thread +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_StartGetStream(HI_S32 s32Cnt) +{ + gs_stPara.bThreadStart = HI_TRUE; + gs_stPara.s32Cnt = s32Cnt; + + return pthread_create(&gs_VencPid, 0, SAMPLE_COMM_VENC_GetVencStreamProc, (HI_VOID*)&gs_stPara); +} + +/****************************************************************************** +* funciton : start get venc svc-t stream process thread +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_StartGetStream_Svc_t(HI_S32 s32Cnt) +{ + gs_stPara.bThreadStart = HI_TRUE; + gs_stPara.s32Cnt = s32Cnt; + + return pthread_create(&gs_VencPid, 0, SAMPLE_COMM_VENC_GetVencStreamProc_Svc_t, (HI_VOID*)&gs_stPara); +} + + + +/****************************************************************************** +* funciton : stop get venc stream process. +******************************************************************************/ +HI_S32 SAMPLE_COMM_VENC_StopGetStream() +{ + if (HI_TRUE == gs_stPara.bThreadStart) + { + gs_stPara.bThreadStart = HI_FALSE; + pthread_join(gs_VencPid, 0); + } + return HI_SUCCESS; +} + + +HI_VOID SAMPLE_COMM_VENC_ReadOneFrame( FILE * fp, HI_U8 * pY, HI_U8 * pU, HI_U8 * pV, + HI_U32 width, HI_U32 height, HI_U32 stride, HI_U32 stride2) +{ + HI_U8 * pDst; + + HI_U32 u32Row; + + + pDst = pY; + for ( u32Row = 0; u32Row < height; u32Row++ ) + { + fread( pDst, width, 1, fp ); + pDst += stride; + } + + pDst = pU; + for ( u32Row = 0; u32Row < height/2; u32Row++ ) + { + fread( pDst, width/2, 1, fp ); + pDst += stride2; + } + + pDst = pV; + for ( u32Row = 0; u32Row < height/2; u32Row++ ) + { + fread( pDst, width/2, 1, fp ); + pDst += stride2; + } + +} + +HI_S32 SAMPLE_COMM_VENC_PlanToSemi(HI_U8 *pY, HI_S32 yStride, + HI_U8 *pU, HI_S32 uStride, + HI_U8 *pV, HI_S32 vStride, + HI_S32 picWidth, HI_S32 picHeight) +{ + HI_S32 i; + HI_U8* pTmpU, *ptu; + HI_U8* pTmpV, *ptv; + + HI_S32 s32HafW = uStride >>1 ; + HI_S32 s32HafH = picHeight >>1 ; + HI_S32 s32Size = s32HafW*s32HafH; + + pTmpU = malloc( s32Size ); ptu = pTmpU; + pTmpV = malloc( s32Size ); ptv = pTmpV; + if((pTmpU==HI_NULL)||(pTmpV==HI_NULL)) + { + printf("malloc buf failed\n"); + return HI_FAILURE; + } + + memcpy(pTmpU,pU,s32Size); + memcpy(pTmpV,pV,s32Size); + + for(i = 0;i>1;i++) + { + *pU++ = *pTmpV++; + *pU++ = *pTmpU++; + + } + for(i = 0;i>1;i++) + { + *pV++ = *pTmpV++; + *pV++ = *pTmpU++; + } + + free( ptu ); + free( ptv ); + + return HI_SUCCESS; +} + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ diff --git a/device/mpp/sample/common/sample_comm_vi.c b/device/mpp/sample/common/sample_comm_vi.c new file mode 100644 index 0000000..152774d --- /dev/null +++ b/device/mpp/sample/common/sample_comm_vi.c @@ -0,0 +1,3099 @@ +/****************************************************************************** + Some simple Hisilicon HI3531 video input functions. + + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-8 Created +******************************************************************************/ +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hi_mipi.h" + +#include "hi_common.h" +#include "sample_comm.h" + +VI_DEV_ATTR_S DEV_ATTR_BT656D1_1MUX = +{ + /* interface mode */ + VI_MODE_BT656, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFF000000, 0x0}, + /* progessive or interleaving */ + VI_SCAN_INTERLACED, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_YVYU, + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_FIELD, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + {0, 0, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 0, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0} + }, + /* ISP bypass */ + VI_PATH_BYPASS, + /* input data type */ + VI_DATA_TYPE_YUV, + /* bReverse */ + HI_FALSE, + /* DEV CROP */ + {0, 0, 1920, 1080} +}; + +/* BT1120 1080I?? */ +VI_DEV_ATTR_S DEV_ATTR_BT1120_1080I_1MUX = +{ + /* interface mode */ + VI_MODE_BT1120_STANDARD, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFF000000, 0xFF0000}, + /* progessive or interleaving */ + VI_SCAN_INTERLACED, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_UVUV, + + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_NORM_PULSE,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + { + 0, 0, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 0, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0 + } + }, + /* ISP bypass */ + VI_PATH_BYPASS, + /* input data type */ + VI_DATA_TYPE_YUV, + /* bReverse */ + HI_FALSE, + /* DEV CROP */ + {0, 0, 1920, 1080} +}; + +/* BT1120 1080p */ +VI_DEV_ATTR_S DEV_ATTR_BT1120_1080P_BASE = +{ + /* interface mode */ + VI_MODE_BT1120_STANDARD, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFF000000, 0xFF0000}, + /* progessive or interleaving */ + VI_SCAN_PROGRESSIVE, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_UVUV, + + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_NORM_PULSE,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + { + 0, 0, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 0, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0 + } + }, + /* ISP bypass */ + VI_PATH_BYPASS, + /* input data type */ + VI_DATA_TYPE_YUV, + /* bReverse */ + HI_FALSE, + /* DEV CROP */ + {0, 0, 1920, 1080} +}; + + +/* BT1120 720P */ +VI_DEV_ATTR_S DEV_ATTR_BT1120_720P_BASE = +/* classical timing 3:7441 BT1120 720P@60fps*/ +{ + /* interface mode */ + VI_MODE_BT1120_STANDARD, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFF000000, 0xFF0000}, + /* progessive or interleaving */ + VI_SCAN_PROGRESSIVE, + //VI_SCAN_INTERLACED, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_UVUV, + + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_NORM_PULSE,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + { + 0, 1280, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 720, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0 + } + }, + /* ISP bypass */ + VI_PATH_BYPASS, + /* input data type */ + VI_DATA_TYPE_YUV, + /* bReverse */ + HI_FALSE, + /* DEV CROP */ + {0, 0, 1280, 720} +}; + + +/*imx122 DC 12bit*/ +VI_DEV_ATTR_S DEV_ATTR_IMX122_DC_1080P_BASE = +{ + /* interface mode */ + VI_MODE_DIGITAL_CAMERA, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFFF0000, 0x0}, + /* progessive or interleaving */ + VI_SCAN_PROGRESSIVE, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_YUYV, + + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + {0, 1920, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 1080, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0} + }, + /* use interior ISP */ + VI_PATH_ISP, + /* input data type */ + VI_DATA_TYPE_RGB, + /* bRevert */ + HI_FALSE, + /* stDevRect */ + {200, 20, 1920, 1080} +}; + +/*imx122 DC 12bit*/ +VI_DEV_ATTR_S DEV_ATTR_IMX122_DC_720P_BASE = +{ + /* interface mode */ + VI_MODE_DIGITAL_CAMERA, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFFF0000, 0x0}, + /* progessive or interleaving */ + VI_SCAN_PROGRESSIVE, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_YUYV, + + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + {0, 1280, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 720, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0} + }, + /* use interior ISP */ + VI_PATH_ISP, + /* input data type */ + VI_DATA_TYPE_RGB, + /* bRevert */ + HI_FALSE, + /* stDevRect */ + {200, 20, 1280, 720} +}; + +/*9M034 DC 12bit720P@30fps*/ +VI_DEV_ATTR_S DEV_ATTR_9M034_DC_720P_BASE = +{ + /*ӿģʽ*/ + VI_MODE_DIGITAL_CAMERA, + /*124·ģʽ*/ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFFF0000, 0x0}, + /*or*/ + VI_SCAN_PROGRESSIVE, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, ֧YUVʽ*/ + VI_INPUT_DATA_YUYV, + + /*ͬϢӦregֲ, --bt1120ʱЧ*/ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_LOW, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH, + + /*timingϢӦregֲ*/ + /*hsync_hfb hsync_act hsync_hhb*/ + {370, 1280, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 6, 720, 6, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0} + }, + /*ʹڲISP*/ + VI_PATH_ISP, + /**/ + VI_DATA_TYPE_RGB, + /* Data Reverse */ + HI_FALSE, + {0, 0, 1280, 720} +}; + + +/*mt9p006 DC 12bit*/ +VI_DEV_ATTR_S DEV_ATTR_MT9P006_DC_1080P = +{ + /* interface mode */ + VI_MODE_DIGITAL_CAMERA, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFFF00000, 0x0}, + /* progessive or interleaving */ + VI_SCAN_PROGRESSIVE, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_YUYV, + + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + {0, 1920, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 1080, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0} + }, + /* use interior ISP */ + VI_PATH_ISP, + /* input data type */ + VI_DATA_TYPE_RGB +}; + +VI_DEV_ATTR_S DEV_ATTR_LVDS_BASE = +{ + /* interface mode */ + VI_MODE_LVDS, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFFF00000, 0x0}, + /* progessive or interleaving */ + VI_SCAN_PROGRESSIVE, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_YUYV, + + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_LOW, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + {0, 1280, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 720, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0} + }, + /* use interior ISP */ + VI_PATH_ISP, + /* input data type */ + VI_DATA_TYPE_RGB, + /* bRever */ + HI_FALSE, + /* DEV CROP */ + {0, 0, 1920, 1080} +}; + +VI_DEV_ATTR_S DEV_ATTR_HISPI_BASE = +{ + /* interface mode */ + VI_MODE_HISPI, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFFF00000, 0x0}, + /* progessive or interleaving */ + VI_SCAN_PROGRESSIVE, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_YUYV, + + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_LOW, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + {0, 1280, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 720, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0} + }, + /* use interior ISP */ + VI_PATH_ISP, + /* input data type */ + VI_DATA_TYPE_RGB, + /* bRever */ + HI_FALSE, + /* DEV CROP */ + {0, 0, 1920, 1080} +}; + + +VI_DEV_ATTR_S DEV_ATTR_MIPI_BASE = +{ + /* interface mode */ + VI_MODE_MIPI, + /* multiplex mode */ + VI_WORK_MODE_1Multiplex, + /* r_mask g_mask b_mask*/ + {0xFFF00000, 0x0}, + /* progessive or interleaving */ + VI_SCAN_PROGRESSIVE, + /*AdChnId*/ + {-1, -1, -1, -1}, + /*enDataSeq, only support yuv*/ + VI_INPUT_DATA_YUYV, + + /* synchronization information */ + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_LOW, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + {0, 1280, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 720, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0} + }, + /* use interior ISP */ + VI_PATH_ISP, + /* input data type */ + VI_DATA_TYPE_RGB, + /* bRever */ + HI_FALSE, + /* DEV CROP */ + {0, 0, 1920, 1080} +}; + + +combo_dev_attr_t LVDS_4lane_SENSOR_IMX136_12BIT_1080_NOWDR_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_LVDS, + { + .lvds_attr = { + .img_size = {1920, 1080}, + HI_WDR_MODE_NONE, + LVDS_SYNC_MODE_SAV, + RAW_DATA_12BIT, + LVDS_ENDIAN_BIG, + LVDS_ENDIAN_BIG, + .lane_id = {0, 1, 2, 3, -1, -1, -1, -1}, + .sync_code = { + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}} + + } + } + } +}; + +combo_dev_attr_t SUBLVDS_4lane_SENSOR_MN34220_12BIT_1080_NOWDR_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_SUBLVDS, + + { + .lvds_attr = { + .img_size = {1920, 1080}, + HI_WDR_MODE_NONE, + LVDS_SYNC_MODE_SOL, + RAW_DATA_12BIT, + LVDS_ENDIAN_BIG, + LVDS_ENDIAN_BIG, + .lane_id = {0, 2, -1, -1, 1, 3, -1, -1}, + .sync_code = { + {{0x002, 0x003, 0x000, 0x001}, //PHY0_lane0 + {0x202, 0x203, 0x200, 0x201}, + {0x102, 0x103, 0x100, 0x101}, + {0x302, 0x303, 0x300, 0x301}}, + + {{0x006, 0x007, 0x004, 0x005}, //PHY0_lane1 + {0x206, 0x207, 0x204, 0x205}, + {0x106, 0x107, 0x104, 0x105}, + {0x306, 0x307, 0x304, 0x305}}, + + {{0x00a, 0x00b, 0x008, 0x009}, //PHY0_lane2 + {0x20a, 0x20b, 0x208, 0x209}, + {0x10a, 0x10b, 0x108, 0x109}, + {0x30a, 0x30b, 0x308, 0x309}}, + + {{0x00a, 0x00b, 0x008, 0x009}, //PHY0_lane3 INPUT_MODE_LVDS + {0x20a, 0x20b, 0x208, 0x209}, + {0x10a, 0x10b, 0x108, 0x109}, + {0x30a, 0x30b, 0x308, 0x309}}, + + {{0x012, 0x013, 0x010, 0x011},//PHY1_lane0 + {0x212, 0x213, 0x210, 0x211}, + {0x112, 0x113, 0x110, 0x111}, + {0x312, 0x313, 0x310, 0x311}}, + + {{0x016, 0x017, 0x014, 0x015}, //PHY1_lane1 + {0x216, 0x217, 0x214, 0x215}, + {0x116, 0x117, 0x114, 0x115}, + {0x316, 0x317, 0x314, 0x315}}, + + {{0x01a, 0x01b, 0x018, 0x019}, //PHY1_lane2 + {0x21a, 0x21b, 0x218, 0x219}, + {0x11a, 0x11b, 0x118, 0x119}, + {0x31a, 0x31b, 0x318, 0x319}}, + + {{0x01a, 0x01b, 0x018, 0x019}, //PHY1_lane3 + {0x21a, 0x21b, 0x218, 0x219}, + {0x11a, 0x11b, 0x118, 0x119}, + {0x31a, 0x31b, 0x318, 0x319}} + } + } + } +}; + +combo_dev_attr_t SUBLVDS_4lane_SENSOR_MN34220_12BIT_1080_2WDR1_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_SUBLVDS, + + { + .lvds_attr = { + .img_size = {1920, 1108}, + HI_WDR_MODE_2F, + LVDS_SYNC_MODE_SOL, + RAW_DATA_12BIT, + LVDS_ENDIAN_BIG, + LVDS_ENDIAN_BIG, + .lane_id = {0, 2, -1, -1, 1, 3, -1, -1}, + .sync_code = { + {{0x002, 0x003, 0x000, 0x001}, //PHY0_lane0 + {0x202, 0x203, 0x200, 0x201}, + {0x102, 0x103, 0x100, 0x101}, + {0x302, 0x303, 0x300, 0x301}}, + + {{0x006, 0x007, 0x004, 0x005}, //PHY0_lane1 + {0x206, 0x207, 0x204, 0x205}, + {0x106, 0x107, 0x104, 0x105}, + {0x306, 0x307, 0x304, 0x305}}, + + {{0x00a, 0x00b, 0x008, 0x009}, //PHY0_lane2 + {0x20a, 0x20b, 0x208, 0x209}, + {0x10a, 0x10b, 0x108, 0x109}, + {0x30a, 0x30b, 0x308, 0x309}}, + + {{0x00a, 0x00b, 0x008, 0x009}, //PHY0_lane3 INPUT_MODE_LVDS + {0x20a, 0x20b, 0x208, 0x209}, + {0x10a, 0x10b, 0x108, 0x109}, + {0x30a, 0x30b, 0x308, 0x309}}, + + {{0x012, 0x013, 0x010, 0x011},//PHY1_lane0 + {0x212, 0x213, 0x210, 0x211}, + {0x112, 0x113, 0x110, 0x111}, + {0x312, 0x313, 0x310, 0x311}}, + + {{0x016, 0x017, 0x014, 0x015}, //PHY1_lane1 + {0x216, 0x217, 0x214, 0x215}, + {0x116, 0x117, 0x114, 0x115}, + {0x316, 0x317, 0x314, 0x315}}, + + {{0x01a, 0x01b, 0x018, 0x019}, //PHY1_lane2 + {0x21a, 0x21b, 0x218, 0x219}, + {0x11a, 0x11b, 0x118, 0x119}, + {0x31a, 0x31b, 0x318, 0x319}}, + + {{0x01a, 0x01b, 0x018, 0x019}, //PHY1_lane3 + {0x21a, 0x21b, 0x218, 0x219}, + {0x11a, 0x11b, 0x118, 0x119}, + {0x31a, 0x31b, 0x318, 0x319}} + } + } + } +}; + +combo_dev_attr_t SUBLVDS_4lane_SENSOR_MN34220_12BIT_720_NOWDR_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_SUBLVDS, + + { + .lvds_attr = { + .img_size = {1280, 720}, + HI_WDR_MODE_NONE, + LVDS_SYNC_MODE_SOL, + RAW_DATA_12BIT, + LVDS_ENDIAN_BIG, + LVDS_ENDIAN_BIG, + .lane_id = {0, 2, -1, -1, 1, 3, -1, -1}, + .sync_code = { + {{0x002, 0x003, 0x000, 0x001}, //PHY0_lane0 + {0x202, 0x203, 0x200, 0x201}, + {0x102, 0x103, 0x100, 0x101}, + {0x302, 0x303, 0x300, 0x301}}, + + {{0x006, 0x007, 0x004, 0x005}, //PHY0_lane1 + {0x206, 0x207, 0x204, 0x205}, + {0x106, 0x107, 0x104, 0x105}, + {0x306, 0x307, 0x304, 0x305}}, + + {{0x00a, 0x00b, 0x008, 0x009}, //PHY0_lane2 + {0x20a, 0x20b, 0x208, 0x209}, + {0x10a, 0x10b, 0x108, 0x109}, + {0x30a, 0x30b, 0x308, 0x309}}, + + {{0x00a, 0x00b, 0x008, 0x009}, //PHY0_lane3 INPUT_MODE_LVDS + {0x20a, 0x20b, 0x208, 0x209}, + {0x10a, 0x10b, 0x108, 0x109}, + {0x30a, 0x30b, 0x308, 0x309}}, + + {{0x012, 0x013, 0x010, 0x011},//PHY1_lane0 + {0x212, 0x213, 0x210, 0x211}, + {0x112, 0x113, 0x110, 0x111}, + {0x312, 0x313, 0x310, 0x311}}, + + {{0x016, 0x017, 0x014, 0x015}, //PHY1_lane1 + {0x216, 0x217, 0x214, 0x215}, + {0x116, 0x117, 0x114, 0x115}, + {0x316, 0x317, 0x314, 0x315}}, + + {{0x01a, 0x01b, 0x018, 0x019}, //PHY1_lane2 + {0x21a, 0x21b, 0x218, 0x219}, + {0x11a, 0x11b, 0x118, 0x119}, + {0x31a, 0x31b, 0x318, 0x319}}, + + {{0x01a, 0x01b, 0x018, 0x019}, //PHY1_lane3 + {0x21a, 0x21b, 0x218, 0x219}, + {0x11a, 0x11b, 0x118, 0x119}, + {0x31a, 0x31b, 0x318, 0x319}} + } + } + } +}; + +combo_dev_attr_t SUBLVDS_4lane_SENSOR_MN34220_12BIT_720_2WDR1_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_SUBLVDS, + + { + .lvds_attr = { + .img_size = {1280, 720}, + HI_WDR_MODE_2F, + LVDS_SYNC_MODE_SOL, + RAW_DATA_12BIT, + LVDS_ENDIAN_BIG, + LVDS_ENDIAN_BIG, + .lane_id = {0, 2, -1, -1, 1, 3, -1, -1}, + .sync_code = { + {{0x002, 0x003, 0x000, 0x001}, //PHY0_lane0 + {0x202, 0x203, 0x200, 0x201}, + {0x102, 0x103, 0x100, 0x101}, + {0x302, 0x303, 0x300, 0x301}}, + + {{0x006, 0x007, 0x004, 0x005}, //PHY0_lane1 + {0x206, 0x207, 0x204, 0x205}, + {0x106, 0x107, 0x104, 0x105}, + {0x306, 0x307, 0x304, 0x305}}, + + {{0x00a, 0x00b, 0x008, 0x009}, //PHY0_lane2 + {0x20a, 0x20b, 0x208, 0x209}, + {0x10a, 0x10b, 0x108, 0x109}, + {0x30a, 0x30b, 0x308, 0x309}}, + + {{0x00a, 0x00b, 0x008, 0x009}, //PHY0_lane3 INPUT_MODE_LVDS + {0x20a, 0x20b, 0x208, 0x209}, + {0x10a, 0x10b, 0x108, 0x109}, + {0x30a, 0x30b, 0x308, 0x309}}, + + {{0x012, 0x013, 0x010, 0x011},//PHY1_lane0 + {0x212, 0x213, 0x210, 0x211}, + {0x112, 0x113, 0x110, 0x111}, + {0x312, 0x313, 0x310, 0x311}}, + + {{0x016, 0x017, 0x014, 0x015}, //PHY1_lane1 + {0x216, 0x217, 0x214, 0x215}, + {0x116, 0x117, 0x114, 0x115}, + {0x316, 0x317, 0x314, 0x315}}, + + {{0x01a, 0x01b, 0x018, 0x019}, //PHY1_lane2 + {0x21a, 0x21b, 0x218, 0x219}, + {0x11a, 0x11b, 0x118, 0x119}, + {0x31a, 0x31b, 0x318, 0x319}}, + + {{0x01a, 0x01b, 0x018, 0x019}, //PHY1_lane3 + {0x21a, 0x21b, 0x218, 0x219}, + {0x11a, 0x11b, 0x118, 0x119}, + {0x31a, 0x31b, 0x318, 0x319}} + } + } + } +}; + + +combo_dev_attr_t LVDS_4lane_SENSOR_IMX178_12BIT_5M_NOWDR_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_LVDS, + { + .lvds_attr = { + .img_size = {2592, 1944}, + HI_WDR_MODE_NONE, + LVDS_SYNC_MODE_SAV, + RAW_DATA_12BIT, + LVDS_ENDIAN_BIG, + LVDS_ENDIAN_BIG, + .lane_id = {0, 1, 2, 3, -1, -1, -1, -1}, + .sync_code = { + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}} + } + } + } +}; + +combo_dev_attr_t LVDS_4lane_SENSOR_IMX178_12BIT_1080p_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_LVDS, + { + .lvds_attr = { + .img_size = {1920, 1080}, + HI_WDR_MODE_NONE, + LVDS_SYNC_MODE_SAV, + RAW_DATA_12BIT, + LVDS_ENDIAN_BIG, + LVDS_ENDIAN_BIG, + .lane_id = {0, 1, 2, 3, -1, -1, -1, -1}, + .sync_code = { + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}}, + + {{0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}, + {0xab0, 0xb60, 0x800, 0x9d0}} + } + } + } +}; + + +combo_dev_attr_t MIPI_CMOS3V3_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_CMOS_33V, + { + + } +}; + +combo_dev_attr_t MIPI_4lane_SENSOR_MN34220_MIPI_12BIT_ATTR = +{ + .input_mode = INPUT_MODE_MIPI, + { + .mipi_attr = + { + RAW_DATA_12BIT, + {0, 1, 2, 3, -1, -1, -1, -1} + } + } + +}; + +combo_dev_attr_t MIPI_BT1120_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_BT1120, + { + + } +}; + + +combo_dev_attr_t MIPI_4lane_SENSOR_OV4682_10BIT_ATTR = +{ + .input_mode = INPUT_MODE_MIPI, + { + .mipi_attr = + { + RAW_DATA_10BIT, + // İsensor + {0, 1, 2, 3, -1, -1, -1, -1} + // İǰsensor + //{1, 0, 2, 3, -1, -1, -1, -1} + } + } + +}; + +combo_dev_attr_t HISPI_4lane_SENSOR_AR0230_12BIT_ATTR = +{ + /* input mode */ + .input_mode = INPUT_MODE_HISPI, + { + .lvds_attr = + { + .img_size = {1920, 1080}, + HI_WDR_MODE_NONE, + LVDS_SYNC_MODE_SOL, + RAW_DATA_12BIT, + LVDS_ENDIAN_LITTLE, + LVDS_ENDIAN_LITTLE, + .lane_id = {0, 1, 2, 3, -1, -1, -1, -1}, + .sync_code = + { + {{0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}}, + + {{0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}}, + + {{0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}}, + + {{0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}}, + + {{0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}}, + + {{0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}}, + + {{0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}}, + + {{0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}, + {0x003, 0x007, 0x001, 0x005}} + } + } + } +}; + + + + +VI_CHN_ATTR_S CHN_ATTR_1920x1080_422 = +/*ͨ2:1920x1080@xxfps ʽ422*/ +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 1920, 1080}, + /* dest_w dest_h */ + {1920, 1080 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + +VI_CHN_ATTR_S CHN_ATTR_860x540_422 = +{ + /*crop_x crop_y crop_w crop_h*/ + {0, 0, 860, 540}, + /* dest_w dest_h */ + {860, 540 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + + +VI_CHN_ATTR_S CHN_ATTR_1280x720_422 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 1280, 720 }, + /* dest_w dest_h */ + {1280, 720 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + +VI_CHN_ATTR_S CHN_ATTR_640x360_422 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 640, 360}, + /* dest_w dest_h */ + {640, 360 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + + +VI_CHN_ATTR_S CHN_ATTR_1280x720_420 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 1280, 720}, + /* dest_w dest_h */ + {1280, 720 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_420, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + + +VI_CHN_ATTR_S CHN_ATTR_720x576_422 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 720, 576 }, + /* dest_w dest_h */ + {720, 576 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + +VI_CHN_ATTR_S CHN_ATTR_720x576_420 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 720, 576}, + /* dest_w dest_h */ + {720, 576}, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_420, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + +VI_CHN_ATTR_S CHN_ATTR_360x288_422 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 360, 288 }, + /* dest_w dest_h */ + {360, 288 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + +VI_CHN_ATTR_S CHN_ATTR_360x288_420 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 360, 288}, + /* dest_w dest_h */ + {360, 288}, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_420, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + +VI_CHN_ATTR_S CHN_ATTR_16x16_422 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 16, 16 }, + /* dest_w dest_h */ + {16, 16 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + +VI_CHN_ATTR_S CHN_ATTR_960x576_422 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 960, 576 }, + /* dest_w dest_h */ + {960, 576 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + +VI_CHN_ATTR_S CHN_ATTR_480x288_422 = +{ + /* crop_x crop_y crop_w crop_h */ + {0, 0, 480, 288}, + /* dest_w dest_h */ + {480, 288 }, + /*enCapSel*/ + VI_CAPSEL_BOTH, + /* channel pixel format */ + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + /*bMirr bFlip bChromaResample*/ + 0, 0, 0, + /*s32SrcFrameRate s32DstFrameRate*/ + -1, -1 +}; + +VI_DEV g_as32ViDev[VIU_MAX_DEV_NUM]; +VI_CHN g_as32MaxChn[VIU_MAX_CHN_NUM]; +VI_CHN g_as32SubChn[VIU_MAX_CHN_NUM]; + +HI_S32 SAMPLE_TW2865_CfgV(VIDEO_NORM_E enVideoMode,VI_WORK_MODE_E enWorkMode) +{ +#if 0 + int fd, i; + int video_mode; + tw2865_video_norm stVideoMode; + tw2865_work_mode work_mode; + + int chip_cnt = 4; + + fd = open(TW2865_FILE, O_RDWR); + if (fd < 0) + { + SAMPLE_PRT("open 2865 (%s) fail\n", TW2865_FILE); + return -1; + } + + video_mode = (VIDEO_ENCODING_MODE_PAL == enVideoMode) ? TW2865_PAL : TW2865_NTSC ; + + for (i=0; is32ViDevCnt = 1; + pstViParam->s32ViDevInterval = 1; + pstViParam->s32ViChnCnt = 1; + pstViParam->s32ViChnInterval = 1; + break; + } + return HI_SUCCESS; +} + +/***************************************************************************** +* function : get vi parameter, according to vi type +*****************************************************************************/ +HI_S32 SAMPLE_COMM_VI_ADStart(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm) +{ + VI_WORK_MODE_E enWorkMode; + HI_S32 s32Ret; + + switch (enViMode) + { + case SAMPLE_VI_MODE_1_D1: + enWorkMode = VI_WORK_MODE_1Multiplex; + s32Ret = SAMPLE_TW2865_CfgV(enNorm, enWorkMode); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_TW2865_CfgV failed with %#x!\n",\ + s32Ret); + return HI_FAILURE; + } + break; + + /* use 7601 without drv */ + case SAMPLE_VI_MODE_BT1120_720P: + case SAMPLE_VI_MODE_BT1120_1080P: + break; + + default: + SAMPLE_PRT("AD not support!\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + + + +/***************************************************************************** +* function : get vi parameter, according to vi type +*****************************************************************************/ +HI_S32 SAMPLE_COMM_VI_Mode2Size(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm, SIZE_S *pstSize) +{ + switch (enViMode) + { + case SAMPLE_VI_MODE_1_D1: + pstSize->u32Width = 720; + pstSize->u32Height = (VIDEO_ENCODING_MODE_PAL==enNorm)?576:480; + break; + + case SAMPLE_VI_MODE_BT1120_1080P: + pstSize->u32Width = 1920; + pstSize->u32Height = 1080; + break; + + case SAMPLE_VI_MODE_BT1120_720P: + pstSize->u32Width = 1280; + pstSize->u32Height = 720; + break; + + default: + SAMPLE_PRT("vi mode invaild!\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +/***************************************************************************** +* function : Get Vi Dev No. according to Vi_Chn No. +*****************************************************************************/ +VI_DEV SAMPLE_COMM_VI_GetDev(SAMPLE_VI_MODE_E enViMode, VI_CHN ViChn) +{ + HI_S32 s32Ret, s32ChnPerDev; + SAMPLE_VI_PARAM_S stViParam; + + s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam); + if (HI_SUCCESS !=s32Ret) + { + SAMPLE_PRT("vi get param failed!\n"); + return (VI_DEV)-1; + } + + s32ChnPerDev = stViParam.s32ViChnCnt / stViParam.s32ViDevCnt; + return (VI_DEV)(ViChn /stViParam.s32ViChnInterval / s32ChnPerDev * stViParam.s32ViDevInterval); +} + +/****************************************************************************** +* function : Set vi system memory location +******************************************************************************/ +HI_S32 SAMPLE_COMM_VI_MemConfig(SAMPLE_VI_MODE_E enViMode) +{ + HI_CHAR * pcMmzName; + MPP_CHN_S stMppChnVI; + SAMPLE_VI_PARAM_S stViParam; + VI_DEV ViDev; + VI_CHN ViChn; + + HI_S32 i, s32Ret; + + s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam); + if (HI_SUCCESS !=s32Ret) + { + SAMPLE_PRT("vi get param failed!\n"); + return HI_FAILURE; + } + + for(i=0; ienViChnSet; + enRotate = pstViConfig->enRotate; + } + + /* step 5: config & start vicap dev */ + memcpy(&stChnAttr.stCapRect, pstCapRect, sizeof(RECT_S)); + stChnAttr.enCapSel = VI_CAPSEL_BOTH; + /* to show scale. this is a sample only, we want to show dist_size = D1 only */ + stChnAttr.stDestSize.u32Width = pstTarSize->u32Width; + stChnAttr.stDestSize.u32Height = pstTarSize->u32Height; + stChnAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; /* sp420 or sp422 */ + + stChnAttr.bMirror = HI_FALSE; + stChnAttr.bFlip = HI_FALSE; + + switch(enViChnSet) + { + case VI_CHN_SET_MIRROR: + stChnAttr.bMirror = HI_TRUE; + break; + + case VI_CHN_SET_FLIP: + stChnAttr.bFlip = HI_TRUE; + break; + + case VI_CHN_SET_FLIP_MIRROR: + stChnAttr.bMirror = HI_TRUE; + stChnAttr.bFlip = HI_TRUE; + break; + + default: + break; + } + + stChnAttr.s32SrcFrameRate = -1; + stChnAttr.s32DstFrameRate = -1; + stChnAttr.enCompressMode = COMPRESS_MODE_NONE; + + s32Ret = HI_MPI_VI_SetChnAttr(ViChn, &stChnAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + if(ROTATE_NONE != enRotate) + { + s32Ret = HI_MPI_VI_SetRotate(ViChn, enRotate); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VI_SetRotate failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + } + + s32Ret = HI_MPI_VI_EnableChn(ViChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +/***************************************************************************** +* function : star vi according to product type +*****************************************************************************/ +HI_S32 SAMPLE_COMM_VI_StartBT656(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + HI_S32 i, s32Ret = HI_SUCCESS; + VI_DEV ViDev; + VI_CHN ViChn; + HI_U32 u32DevNum = 1; + HI_U32 u32ChnNum = 1; + SIZE_S stTargetSize; + RECT_S stCapRect; + SAMPLE_VI_MODE_E enViMode; + + if(!pstViConfig) + { + SAMPLE_PRT("%s: null ptr\n", __FUNCTION__); + return HI_FAILURE; + } + enViMode = pstViConfig->enViMode; + + /****************************************** + step 1: mipi configure + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartMIPI_BT1120(enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("%s: MIPI init failed!\n", __FUNCTION__); + return HI_FAILURE; + } + + for (i = 0; i < u32DevNum; i++) + { + ViDev = i; + s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("%s: start vi dev[%d] failed!\n", __FUNCTION__, i); + return HI_FAILURE; + } + } + + /****************************************************** + * Step 2: config & start vicap chn (max 1) + ******************************************************/ + for (i = 0; i < u32ChnNum; i++) + { + ViChn = i; + + stCapRect.s32X = 0; + stCapRect.s32Y = 0; + switch (enViMode) + { + case SAMPLE_VI_MODE_BT1120_720P: + stCapRect.u32Width = 1280; + stCapRect.u32Height = 720; + break; + + case SAMPLE_VI_MODE_BT1120_1080P: + stCapRect.u32Width = 1920; + stCapRect.u32Height = 1080; + break; + + default: + stCapRect.u32Width = 1920; + stCapRect.u32Height = 1080; + break; + } + + stTargetSize.u32Width = stCapRect.u32Width; + stTargetSize.u32Height = stCapRect.u32Height; + + s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_COMM_ISP_Stop(); + return HI_FAILURE; + } + } + + return s32Ret; +} + +/***************************************************************************** +* function : stop vi accroding to product type +*****************************************************************************/ +HI_S32 SAMPLE_COMM_VI_StopBT656(SAMPLE_VI_MODE_E enViMode) +{ + VI_DEV ViDev; + VI_CHN ViChn; + HI_S32 i; + HI_S32 s32Ret; + SAMPLE_VI_PARAM_S stViParam; + + /*** get parameter from Sample_Vi_Mode ***/ + s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam); + if (HI_SUCCESS !=s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VI_Mode2Param failed!\n"); + return HI_FAILURE; + } + + /*** Stop VI Chn ***/ + for(i=0;ienWDRMode); + + if ( pstViConfig->enViMode == APTINA_AR0230_HISPI_1080P_30FPS ) + { + pstcomboDevAttr = &HISPI_4lane_SENSOR_AR0230_12BIT_ATTR; + } + + if ( (pstViConfig->enViMode == APTINA_9M034_DC_720P_30FPS) + || (pstViConfig->enViMode == APTINA_AR0130_DC_720P_30FPS) + || (pstViConfig->enViMode == SONY_IMX122_DC_1080P_30FPS) + || (pstViConfig->enViMode == SONY_IMX122_DC_720P_30FPS) ) + { + pstcomboDevAttr = &MIPI_CMOS3V3_ATTR; + } + + if (NULL == pstcomboDevAttr) + { + printf("Func %s() Line[%d], unsupported enViMode: %d\n", __FUNCTION__, __LINE__, pstViConfig->enViMode); + close(fd); + return HI_FAILURE; + } + + if (ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr)) + { + printf("set mipi attr failed\n"); + close(fd); + return -1; + } + close(fd); + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_COMM_VI_StartIspAndVi(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + HI_S32 i, s32Ret = HI_SUCCESS; + VI_DEV ViDev; + VI_CHN ViChn; + HI_U32 u32DevNum = 1; + HI_U32 u32ChnNum = 1; + SIZE_S stTargetSize; + RECT_S stCapRect; + SAMPLE_VI_MODE_E enViMode; + + if(!pstViConfig) + { + SAMPLE_PRT("%s: null ptr\n", __FUNCTION__); + return HI_FAILURE; + } + enViMode = pstViConfig->enViMode; + + /****************************************** + step 1: mipi configure + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartMIPI(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("%s: MIPI init failed!\n", __FUNCTION__); + return HI_FAILURE; + } + + /****************************************** + step 2: configure sensor and ISP (include WDR mode). + note: you can jump over this step, if you do not use Hi3516A interal isp. + ******************************************/ + s32Ret = SAMPLE_COMM_ISP_Init(pstViConfig->enWDRMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("%s: Sensor init failed!\n", __FUNCTION__); + return HI_FAILURE; + } + + /****************************************** + step 3: run isp thread + note: you can jump over this step, if you do not use Hi3516A interal isp. + ******************************************/ + s32Ret = SAMPLE_COMM_ISP_Run(); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("%s: ISP init failed!\n", __FUNCTION__); + /* disable videv */ + return HI_FAILURE; + } + + /****************************************************** + step 4 : config & start vicap dev + ******************************************************/ + for (i = 0; i < u32DevNum; i++) + { + ViDev = i; + s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("%s: start vi dev[%d] failed!\n", __FUNCTION__, i); + return HI_FAILURE; + } + } + + /****************************************************** + * Step 5: config & start vicap chn (max 1) + ******************************************************/ + for (i = 0; i < u32ChnNum; i++) + { + ViChn = i; + + stCapRect.s32X = 0; + stCapRect.s32Y = 0; + switch (enViMode) + { + case APTINA_9M034_DC_720P_30FPS: + case APTINA_AR0130_DC_720P_30FPS: + case SONY_IMX122_DC_720P_30FPS: + stCapRect.u32Width = 1280; + stCapRect.u32Height = 720; + break; + + case SONY_IMX122_DC_1080P_30FPS: + case APTINA_AR0230_HISPI_1080P_30FPS: + stCapRect.u32Width = 1920; + stCapRect.u32Height = 1080; + break; + + default: + stCapRect.u32Width = 1920; + stCapRect.u32Height = 1080; + break; + } + + stTargetSize.u32Width = stCapRect.u32Width; + stTargetSize.u32Height = stCapRect.u32Height; + + s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_COMM_ISP_Stop(); + return HI_FAILURE; + } + } + + return s32Ret; +} + +HI_S32 SAMPLE_COMM_VI_StopIsp(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + VI_DEV ViDev; + VI_CHN ViChn; + HI_S32 i; + HI_S32 s32Ret; + HI_U32 u32DevNum = 1; + HI_U32 u32ChnNum = 1; + + if(!pstViConfig) + { + SAMPLE_PRT("%s: null ptr\n", __FUNCTION__); + return HI_FAILURE; + } + + /*** Stop VI Chn ***/ + for(i=0;i < u32ChnNum; i++) + { + /* Stop vi phy-chn */ + ViChn = i; + s32Ret = HI_MPI_VI_DisableChn(ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_DisableChn failed with %#x\n",s32Ret); + return HI_FAILURE; + } + } + + /*** Stop VI Dev ***/ + for(i=0; i < u32DevNum; i++) + { + ViDev = i; + s32Ret = HI_MPI_VI_DisableDev(ViDev); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_DisableDev failed with %#x\n", s32Ret); + return HI_FAILURE; + } + } + + SAMPLE_COMM_ISP_Stop(); + return HI_SUCCESS; +} + +HI_S32 SAMPLE_COMM_VI_StartVi(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + HI_S32 s32Ret = HI_SUCCESS; + SAMPLE_VI_MODE_E enViMode; + + if(!pstViConfig) + { + SAMPLE_PRT("%s: null ptr\n", __FUNCTION__); + return HI_FAILURE; + } + + enViMode = pstViConfig->enViMode; + if(!IsSensorInput(enViMode)) + { + s32Ret = SAMPLE_COMM_VI_StartBT656(pstViConfig); + } + else + { + s32Ret = SAMPLE_COMM_VI_StartIspAndVi(pstViConfig); + } + + + return s32Ret; +} + +HI_S32 SAMPLE_COMM_VI_StopVi(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + HI_S32 s32Ret = HI_SUCCESS; + SAMPLE_VI_MODE_E enViMode; + + if(!pstViConfig) + { + SAMPLE_PRT("%s: null ptr\n", __FUNCTION__); + return HI_FAILURE; + } + enViMode = pstViConfig->enViMode; + + if(!IsSensorInput(enViMode)) + { + s32Ret = SAMPLE_COMM_VI_StopBT656(enViMode); + } + else + { + s32Ret = SAMPLE_COMM_VI_StopIsp(pstViConfig); + } + + return s32Ret; +} + +HI_S32 SAMPLE_COMM_VI_SwitchResParam( SAMPLE_VI_CONFIG_S* pstViConfig, + ISP_PUB_ATTR_S *pstPubAttr, + RECT_S *pstCapRect ) +{ + CHECK_NULL_PTR(pstViConfig); + CHECK_NULL_PTR(pstPubAttr); + CHECK_NULL_PTR(pstCapRect); + if (SONY_IMX122_DC_1080P_30FPS == pstViConfig->enViMode) + { + pstViConfig->enViMode = SONY_IMX122_DC_720P_30FPS; + pstPubAttr->stWndRect.u32Width = 1280; + pstPubAttr->stWndRect.u32Height = 720; + pstPubAttr->f32FrameRate = 30; + + pstCapRect->s32X = 0; + pstCapRect->s32Y = 0; + pstCapRect->u32Width = 1280; + pstCapRect->u32Height = 720; + } + else if (SONY_IMX122_DC_720P_30FPS == pstViConfig->enViMode) + { + pstViConfig->enViMode = SONY_IMX122_DC_1080P_30FPS; + pstPubAttr->stWndRect.u32Width = 1920; + pstPubAttr->stWndRect.u32Height = 1080; + pstPubAttr->f32FrameRate = 30; + + pstCapRect->s32X = 0; + pstCapRect->s32Y = 0; + pstCapRect->u32Width = 1920; + pstCapRect->u32Height = 1080; + } + else + { + SAMPLE_PRT("This sensor type is not surpport!"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +/***************************************************************************** +* function : Vi chn unbind vpss group +*****************************************************************************/ +HI_S32 SAMPLE_COMM_VI_UnBindVpss(SAMPLE_VI_MODE_E enViMode) +{ + HI_S32 i, j, s32Ret; + VPSS_GRP VpssGrp; + MPP_CHN_S stSrcChn; + MPP_CHN_S stDestChn; + SAMPLE_VI_PARAM_S stViParam; + VI_DEV ViDev; + VI_CHN ViChn; + + s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam); + if (HI_SUCCESS !=s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VI_Mode2Param failed!\n"); + return HI_FAILURE; + } + + VpssGrp = 0; + for (i=0; i>1 ; + HI_S32 s32HafH = picHeight >>1 ; + HI_S32 s32Size = s32HafW*s32HafH; + + pTmpU = malloc( s32Size ); + if (NULL == pTmpU) + { + printf("Func: %s() Line[%d], malloc failed\n", __FUNCTION__, __LINE__); + return HI_FAILURE; + } + pTmpV = malloc( s32Size ); + if (NULL == pTmpV) + { + printf("Func: %s() Line[%d], malloc failed\n", __FUNCTION__, __LINE__); + return HI_FAILURE; + } + ptu = pTmpU; + ptv = pTmpV; + + memcpy(pTmpU,pU,s32Size); + memcpy(pTmpV,pV,s32Size); + + for(i = 0;i>1;i++) + { + *pU++ = *pTmpV++; + *pU++ = *pTmpU++; + + } + for(i = 0;i>1;i++) + { + *pV++ = *pTmpV++; + *pV++ = *pTmpU++; + } + + free( ptu ); + free( ptv ); + + return HI_SUCCESS; +} + +int SAMPLE_COMM_VI_ExitMpp( int s32poolId) +{ + if(s32poolId<0) + { + if (HI_MPI_SYS_Exit()) + { + printf("sys exit fail\n"); + return -1; + } + + if (HI_MPI_VB_Exit()) + { + printf("vb exit fail\n"); + return -1; + } + return -1; + } + + return 0; +} + + +/****************************************************************************** +* function : Get from YUV +******************************************************************************/ +HI_S32 SAMPLE_COMM_VI_GetVFrameFromYUV(FILE *pYUVFile, HI_U32 u32Width, HI_U32 u32Height,HI_U32 u32Stride, VIDEO_FRAME_INFO_S *pstVFrameInfo) +{ + HI_U32 u32LStride; + HI_U32 u32CStride; + HI_U32 u32LumaSize; + HI_U32 u32ChrmSize; + HI_U32 u32Size; + VB_BLK VbBlk; + HI_U32 u32PhyAddr; + HI_U8 *pVirAddr; + + u32LStride = u32Stride; + u32CStride = u32Stride; + + u32LumaSize = (u32LStride * u32Height); + u32ChrmSize = (u32CStride * u32Height) >> 2;/* YUV 420 */ + u32Size = u32LumaSize + (u32ChrmSize << 1); + + /* alloc video buffer block ---------------------------------------------------------- */ + VbBlk = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, u32Size, NULL); + if (VB_INVALID_HANDLE == VbBlk) + { + SAMPLE_PRT("HI_MPI_VB_GetBlock err! size:%d\n",u32Size); + return -1; + } + u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk); + if (0 == u32PhyAddr) + { + return -1; + } + + pVirAddr = (HI_U8 *) HI_MPI_SYS_Mmap(u32PhyAddr, u32Size); + if (NULL == pVirAddr) + { + return -1; + } + + pstVFrameInfo->u32PoolId = HI_MPI_VB_Handle2PoolId(VbBlk); + if (VB_INVALID_POOLID == pstVFrameInfo->u32PoolId) + { + return -1; + } + SAMPLE_PRT("pool id :%d, phyAddr:%x,virAddr:%x\n" ,pstVFrameInfo->u32PoolId,u32PhyAddr,(int)pVirAddr); + + pstVFrameInfo->stVFrame.u32PhyAddr[0] = u32PhyAddr; + pstVFrameInfo->stVFrame.u32PhyAddr[1] = pstVFrameInfo->stVFrame.u32PhyAddr[0] + u32LumaSize; + pstVFrameInfo->stVFrame.u32PhyAddr[2] = pstVFrameInfo->stVFrame.u32PhyAddr[1] + u32ChrmSize; + + pstVFrameInfo->stVFrame.pVirAddr[0] = pVirAddr; + pstVFrameInfo->stVFrame.pVirAddr[1] = pstVFrameInfo->stVFrame.pVirAddr[0] + u32LumaSize; + pstVFrameInfo->stVFrame.pVirAddr[2] = pstVFrameInfo->stVFrame.pVirAddr[1] + u32ChrmSize; + + pstVFrameInfo->stVFrame.u32Width = u32Width; + pstVFrameInfo->stVFrame.u32Height = u32Height; + pstVFrameInfo->stVFrame.u32Stride[0] = u32LStride; + pstVFrameInfo->stVFrame.u32Stride[1] = u32CStride; + pstVFrameInfo->stVFrame.u32Stride[2] = u32CStride; + pstVFrameInfo->stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + pstVFrameInfo->stVFrame.u32Field = VIDEO_FIELD_INTERLACED;/* Intelaced D1,otherwise VIDEO_FIELD_FRAME */ + + /* read Y U V data from file to the addr ----------------------------------------------*/ + SAMPLE_COMM_VI_ReadFrame(pYUVFile, pstVFrameInfo->stVFrame.pVirAddr[0], + pstVFrameInfo->stVFrame.pVirAddr[1], pstVFrameInfo->stVFrame.pVirAddr[2], + pstVFrameInfo->stVFrame.u32Width, pstVFrameInfo->stVFrame.u32Height, + pstVFrameInfo->stVFrame.u32Stride[0], pstVFrameInfo->stVFrame.u32Stride[1] >> 1 ); + + /* convert planar YUV420 to sem-planar YUV420 -----------------------------------------*/ + SAMPLE_COMM_VI_PlanToSemi(pstVFrameInfo->stVFrame.pVirAddr[0], pstVFrameInfo->stVFrame.u32Stride[0], + pstVFrameInfo->stVFrame.pVirAddr[1], pstVFrameInfo->stVFrame.u32Stride[1], + pstVFrameInfo->stVFrame.pVirAddr[2], pstVFrameInfo->stVFrame.u32Stride[1], + pstVFrameInfo->stVFrame.u32Width, pstVFrameInfo->stVFrame.u32Height); + + HI_MPI_SYS_Mmap(u32PhyAddr, u32Size); + return 0; +} + +HI_S32 SAMPLE_COMM_VI_ChangeCapSize(VI_CHN ViChn, HI_U32 u32CapWidth, HI_U32 u32CapHeight,HI_U32 u32Width, HI_U32 u32Height) +{ + VI_CHN_ATTR_S stChnAttr; + HI_S32 S32Ret = HI_SUCCESS; + S32Ret = HI_MPI_VI_GetChnAttr(ViChn, &stChnAttr); + if(HI_SUCCESS!= S32Ret) + { + SAMPLE_PRT( "HI_MPI_VI_GetChnAttr failed\n"); + } + stChnAttr.stCapRect.u32Width = u32CapWidth; + stChnAttr.stCapRect.u32Height = u32CapHeight; + stChnAttr.stDestSize.u32Width = u32Width; + stChnAttr.stDestSize.u32Height = u32Height; + + S32Ret = HI_MPI_VI_SetChnAttr(ViChn, &stChnAttr); + if(HI_SUCCESS!= S32Ret) + { + SAMPLE_PRT( "HI_MPI_VI_SetChnAttr failed\n"); + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_COMM_VI_GetVBFromPool(HI_U32 u32Width, + HI_U32 u32Height, + HI_U32 u32Stride, + VIDEO_FIELD_E u32Field, + SAMPLE_VI_FRAME_INFO_S *pstVMstFrameInfo) +{ + HI_U32 u32CStride; + HI_U32 u32LumaSize; + HI_U32 u32ChrmSize; + HI_U32 u32Size; + VB_BLK VbBlk; + HI_U32 u32PhyAddr; + HI_VOID *pVirAddr = NULL; + VIDEO_FRAME_INFO_S *pstVFrameInfo = &pstVMstFrameInfo->stVideoFrame; + + u32CStride = u32Width; + u32LumaSize = u32Stride * u32Height; + if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == pstVFrameInfo->stVFrame.enPixelFormat) + { + u32ChrmSize = (u32CStride * u32Height) >> 1;/* YUV 422 */ + } + else if ((PIXEL_FORMAT_RGB_BAYER == pstVFrameInfo->stVFrame.enPixelFormat) + ||(PIXEL_FORMAT_RGB_BAYER_12BPP == pstVFrameInfo->stVFrame.enPixelFormat) + ||(PIXEL_FORMAT_RGB_BAYER_10BPP == pstVFrameInfo->stVFrame.enPixelFormat) + ||(PIXEL_FORMAT_RGB_BAYER_8BPP == pstVFrameInfo->stVFrame.enPixelFormat)) + { + u32ChrmSize = 0; + } + else + { + u32ChrmSize = (u32CStride * u32Height) >> 2;/* YUV 420 */ + } + u32Size = u32LumaSize + (u32ChrmSize << 1); + + printf("===============u32Size: %d\n", u32Size); + pstVMstFrameInfo->u32FrmSize = u32Size; + /* alloc video buffer block ---------------------------------------------------------- */ + VbBlk = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, u32Size, HI_NULL); + if (VB_INVALID_HANDLE == VbBlk) + { + printf("HI_MPI_VB_GetBlock err! size:%d\n",u32Size); + return HI_FAILURE; + } + pstVMstFrameInfo->VbBlk = VbBlk; + + printf("VbBlk: 0x%x\n", VbBlk); + + u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk); + if (0 == u32PhyAddr) + { + printf("HI_MPI_VB_Handle2PhysAddr err!\n"); + return HI_FAILURE; + } + + pstVFrameInfo->u32PoolId = HI_MPI_VB_Handle2PoolId(VbBlk); + if (VB_INVALID_POOLID == pstVFrameInfo->u32PoolId) + { + SAMPLE_COMM_VI_ExitMpp(pstVFrameInfo->u32PoolId); + return -1; + } + + pstVFrameInfo->stVFrame.u32PhyAddr[0] = u32PhyAddr; + pstVFrameInfo->stVFrame.u32PhyAddr[1] = pstVFrameInfo->stVFrame.u32PhyAddr[0] + u32LumaSize; + pstVFrameInfo->stVFrame.u32PhyAddr[2] = pstVFrameInfo->stVFrame.u32PhyAddr[1] + u32ChrmSize; + + pstVFrameInfo->stVFrame.pVirAddr[0] = pVirAddr; + pstVFrameInfo->stVFrame.pVirAddr[1] = pstVFrameInfo->stVFrame.pVirAddr[0] + u32LumaSize; + pstVFrameInfo->stVFrame.pVirAddr[2] = pstVFrameInfo->stVFrame.pVirAddr[1] + u32ChrmSize; + + pstVFrameInfo->stVFrame.u32Width = u32Width; + pstVFrameInfo->stVFrame.u32Height = u32Height; + pstVFrameInfo->stVFrame.u32Stride[0] = u32Stride; + pstVFrameInfo->stVFrame.u32Stride[1] = u32Stride; + pstVFrameInfo->stVFrame.u32Stride[2] = u32Stride; + pstVFrameInfo->stVFrame.u32Field = u32Field; + + return HI_SUCCESS; +} + + + +void SAMPLE_COMM_VI_SaveFpnData(ISP_FPN_FRAME_INFO_S *pVBuf, + HI_U32 u32FpnMode, + HI_U32 u32Nbit, + FILE *pfd) +{ + HI_U8* pU8VBufVirt_Y; + HI_U32 phy_addr,size; + HI_U8* pUserPageAddr[2]; + HI_BOOL bCompress; + + size = (pVBuf->stFpnFrame.stVFrame.u32Stride[0]) * (pVBuf->stFpnFrame.stVFrame.u32Height); + printf("pVBuf->u32Stride[0]: %d, size: %d\n", pVBuf->stFpnFrame.stVFrame.u32Stride[0], size); + phy_addr = pVBuf->stFpnFrame.stVFrame.u32PhyAddr[0]; + + pUserPageAddr[0] = (HI_U8 *) HI_MPI_SYS_Mmap(phy_addr, size); + if (NULL == pUserPageAddr[0]) + { + printf("HI_MPI_SYS_Mmap null\n"); + return; + } + + pU8VBufVirt_Y = (HI_U8*)pUserPageAddr[0]; + + /* save Y ----------------------------------------------------------------*/ + fprintf(stderr, "saving......Raw data......u32Stride[0]: %d, width: %d, height: %d\n" + , pVBuf->stFpnFrame.stVFrame.u32Stride[0] + , pVBuf->stFpnFrame.stVFrame.u32Width + , pVBuf->stFpnFrame.stVFrame.u32Height); + //fprintf(stderr, "phy Addr: 0x%x\n", pVBuf->stFpnFrame.stVFrame.u32PhyAddr[0]); + fflush(stderr); + + fwrite(pU8VBufVirt_Y, pVBuf->u32FrmSize, 1, pfd); + + /* save offset */ + fwrite(&pVBuf->u32Offset, 4, 1, pfd); + + /* save compress flag */ + bCompress = (COMPRESS_MODE_LINE == pVBuf->stFpnFrame.stVFrame.enCompressMode); + fwrite(&bCompress, 4, 1, pfd); + + /* save fpn frame size */ + fwrite(&pVBuf->u32FrmSize, 4, 1, pfd); + + /* save ISO */ + fwrite(&pVBuf->u32Iso, 4, 1, pfd); + fflush(pfd); + + //fprintf(stderr, "done u32TimeRef: %d!\n", pVBuf->stFpnFrame.stVFrame.u32TimeRef); + fflush(stderr); + + HI_MPI_SYS_Munmap(pUserPageAddr[0], size); +} + + +HI_S32 SAMPLE_COMM_VI_ReleaseVBToPool(SAMPLE_VI_FRAME_INFO_S *pstVMstFrameInfo) +{ + HI_S32 s32Ret = HI_SUCCESS; + + s32Ret = HI_MPI_VB_ReleaseBlock(pstVMstFrameInfo->VbBlk); + return s32Ret; +} + + +HI_S32 SAMPLE_COMM_VI_FPN_CALIBRATE_CONFIG(const char* fpn_file, /* fpn file name */ + ISP_FPN_TYPE_E enFpnType, /* line/frame */ + PIXEL_FORMAT_E enPixelFormat, + COMPRESS_MODE_E enCompressMode, + HI_U32 u32FrmNum, + HI_U32 u32Threshold) +{ + VI_CHN ViChn = 0; + VI_CHN_ATTR_S stTempChnAttr; + ISP_FPN_CALIBRATE_ATTR_S stFpnCalAttr; + HI_U32 u32Stride; + SAMPLE_VI_FRAME_INFO_S stVMstFrame = {0}; + HI_U32 u32Height; + HI_S32 s32Ret = HI_SUCCESS; + + ISP_DEV IspDev = 0; + FILE* pFile; + char fileName[256] = {0}; + + s32Ret = HI_MPI_VI_GetChnAttr(ViChn, &stTempChnAttr); + if(HI_SUCCESS != s32Ret) + { + printf("get vi chn attr failed!"); + return HI_FAILURE; + } + + /* alloc 16bit/pixel memory */ + u32Stride = ALIGN_BACK(stTempChnAttr.stCapRect.u32Width * 2, 16); + printf("u32Stride: %d\n", u32Stride); + stVMstFrame.stVideoFrame.stVFrame.enPixelFormat = enPixelFormat; + stVMstFrame.stVideoFrame.stVFrame.enCompressMode = COMPRESS_MODE_NONE; + + u32Height = stTempChnAttr.stCapRect.u32Height; + + if (ISP_FPN_TYPE_LINE == enFpnType) + { + u32Height = 1; + } + + s32Ret = SAMPLE_COMM_VI_GetVBFromPool(stTempChnAttr.stCapRect.u32Width, + u32Height, + u32Stride, + VIDEO_FIELD_FRAME, + &stVMstFrame); + if(HI_SUCCESS != s32Ret) + { + printf("alloc mem failed!"); + return HI_FAILURE; + } + + printf("==========let isp fly ====================\n"); + + s32Ret = HI_MPI_VI_SetChnAttr(ViChn, &stTempChnAttr); + if(HI_SUCCESS != s32Ret) + { + printf("set vi chn attr failed!"); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VI_EnableChn(ViChn); + if(HI_SUCCESS != s32Ret) + { + printf("enable vi chn failed!"); + return HI_FAILURE; + } + + printf("\n please turn off camera aperture!\n"); + VI_PAUSE(); + printf("\nhit any key ,start calibrate!\n"); + VI_PAUSE(); + + s32Ret = HI_MPI_VI_DisableChn(ViChn); + if(HI_SUCCESS != s32Ret) + { + printf("disable vi chn failed!"); + return HI_FAILURE; + } + + stFpnCalAttr.u32FrameNum = u32FrmNum; + stFpnCalAttr.u32Threshold = u32Threshold; + stFpnCalAttr.enFpnType = enFpnType; + memcpy(&stFpnCalAttr.stFpnCaliFrame.stFpnFrame, + &stVMstFrame.stVideoFrame, + sizeof(VIDEO_FRAME_INFO_S)); + + stFpnCalAttr.stFpnCaliFrame.stFpnFrame.stVFrame.enCompressMode = enCompressMode; + + stFpnCalAttr.stFpnCaliFrame.u32Offset = 0; + + s32Ret = HI_MPI_ISP_FPNCalibrate(IspDev, &stFpnCalAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_FPNCalibrate err: 0x%x\n", s32Ret); + return s32Ret; + } + //printf("out stVMstFrame.stVideoFrame.stVFrame.u32Stride[0]: %d\n", stVMstFrame.stVideoFrame.stVFrame.u32Stride[0]); + /* save RAW data */ + snprintf(fileName, sizeof(fileName), "./%s_%d_%d_%dbit.raw", fpn_file, stTempChnAttr.stDestSize.u32Width, + stTempChnAttr.stDestSize.u32Height,16); + printf("\nafter calibrate, offset =0x%x,ISO = %d\n",stFpnCalAttr.stFpnCaliFrame.u32Offset, + stFpnCalAttr.stFpnCaliFrame.u32Iso); + + s32Ret = HI_MPI_VI_EnableChn(ViChn); + if(HI_SUCCESS != s32Ret) + { + printf("enable vi chn failed!"); + return HI_FAILURE; + } + + printf("\nhit any key,save dark frame file: %s!\n", fileName); + VI_PAUSE(); + + pFile = fopen(fileName, "wb"); + if (NULL == pFile) + { + printf("open file %s err!\n",fileName); + return -1; + } + else + { + HI_U32 u32FpnBitWidth = 10; + + SAMPLE_COMM_VI_SaveFpnData(&stFpnCalAttr.stFpnCaliFrame, enFpnType, u32FpnBitWidth, pFile); + fclose(pFile); + } + printf("\nsaved dark frame\n"); + + s32Ret = SAMPLE_COMM_VI_ReleaseVBToPool(&stVMstFrame); + if (HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_ReleaseVBToPool err: 0x%x\n", s32Ret); + } + + printf("\nhit any key,start read dark frame\n"); + VI_PAUSE(); + + return HI_SUCCESS; +} + +HI_VOID SAMPLE_COMM_VI_ReadOneFpnFrame(FILE * fp, + HI_U8 *pY, + HI_U32 width, HI_U32 height, + HI_U32 stride, + PIXEL_FORMAT_E enPixelFormat, + HI_U32 *pu32Offset, + HI_U32 *pu32FrmSize, + COMPRESS_MODE_E *penCompressMode, + HI_U32 *pu32Iso) +{ + HI_U8* pDst; + HI_U32 u32FrmSize; + HI_BOOL bCompress; + HI_S32 s32Ret; + + /***************************************************************** + raw file storage layout: + /////////////////////////////////////////////////// + |-------------------------------------------------| + |-------------------------------------------------| + |-------------------------------------------------| + |-------------------------------------------------| + |-------------------------------------------------| + |-------------------------------------------------| + |-------------------|------|------|------|--------| + offset comp size u32iso + ****************************************************************/ + + /* seek end of file */ + s32Ret = fseek(fp, -4, SEEK_END); + if (0 != s32Ret) + { + printf("Func: %s(), line: [%d], get iso failed: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + return; + } + /* get calibrate ISO */ + fread(pu32Iso, 4, 1, fp); + + /* get fpn frame size */ + s32Ret = fseek(fp, -8, SEEK_END); + if (0 != s32Ret) + { + printf("Func: %s(), line: [%d], get frame size failed: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + return; + } + fread(&u32FrmSize, 4, 1, fp); + *pu32FrmSize = u32FrmSize; + + /* get fpn frame compress flag */ + s32Ret = fseek(fp, -12, SEEK_END); + if (0 != s32Ret) + { + printf("Func: %s(), line: [%d], get compress flag failed: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + return; + } + fread(&bCompress, 4, 1, fp); + + if (bCompress) + { + *penCompressMode = COMPRESS_MODE_LINE; + } + else + { + *penCompressMode = COMPRESS_MODE_NONE; + } + + /* get fpn offset */ + s32Ret = fseek(fp, -16, SEEK_END); + if (0 != s32Ret) + { + printf("Func: %s(), line: [%d], get fpn offset failed: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + return; + } + fread(pu32Offset, 4, 1, fp); + + /* back to begin of file */ + fseek(fp, 0L, SEEK_SET); + pDst = pY; + fread(pDst, 1, u32FrmSize, fp); + +} + + + + + + + +HI_S32 SAMPLE_COMM_VI_GetFPNFrame_FromRaw(FILE *pRawFile, + HI_U32 u32Width, HI_U32 u32Height, + SAMPLE_VI_FRAME_INFO_S *pstVMstFrameInfo, + HI_U32 *pu32Offset, + HI_U32 *pu32Iso) +{ + HI_U32 u32LStride; + HI_U32 u32CStride; + HI_U32 u32LumaSize = 0; + HI_U32 u32ChrmSize = 0; + HI_U32 u32Size; + VB_BLK VbBlk; + HI_U32 u32PhyAddr; + HI_U8 *pVirAddr; + HI_U32 u32Stride; + HI_S32 s32Ret; + VIDEO_FRAME_INFO_S *pstVFrameInfo = &pstVMstFrameInfo->stVideoFrame; + COMPRESS_MODE_E enCompressMode = COMPRESS_MODE_NONE; + + if (PIXEL_FORMAT_RGB_BAYER == pstVFrameInfo->stVFrame.enPixelFormat) + { + u32Stride = ALIGN_BACK(u32Width*2, 16); + } + else if (PIXEL_FORMAT_RGB_BAYER_10BPP == pstVFrameInfo->stVFrame.enPixelFormat) + { + u32Stride = (u32Width * 10 + 127) / 128 * 128 / 8; + } + else if (PIXEL_FORMAT_RGB_BAYER_8BPP == pstVFrameInfo->stVFrame.enPixelFormat) + { + u32Stride = (u32Width * 8 + 127) / 128 * 128 / 8; + } + else + { + printf("Func: %s() Line[%d], unsupported pixel format: %d\n", + __FUNCTION__, __LINE__, pstVFrameInfo->stVFrame.enPixelFormat); + return HI_FAILURE; + } + + u32LStride = u32Stride; + u32CStride = u32Stride; + + //////////////////////////////////////////////////////// + /* seek end of file */ + s32Ret = fseek(pRawFile, -8, SEEK_END); + if (0 != s32Ret) + { + printf("Func: %s(), line: [%d], get frame size failed: %s\n", __FUNCTION__, __LINE__, strerror(errno)); + return HI_FAILURE; + } + /* get fpn frame size */ + fread(&u32Size, 1, 4, pRawFile); + /* back to begin of file */ + fseek(pRawFile, 0L, SEEK_SET); + //////////////////////////////////////////////////////// + + //printf("frm_size: %d\n", u32Size); + + /* alloc video buffer block ---------------------------------------------------------- */ + VbBlk = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, u32Size, HI_NULL); + if (VB_INVALID_HANDLE == VbBlk) + + { + printf("HI_MPI_VB_GetBlock err! size:%d\n",u32Size); + SAMPLE_COMM_VI_ExitMpp(VbBlk); + return HI_FAILURE; + } + pstVMstFrameInfo->VbBlk = VbBlk; + + u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk); + if (0 == u32PhyAddr) + { + printf("HI_MPI_VB_Handle2PhysAddr err!\n"); + SAMPLE_COMM_VI_ExitMpp(u32PhyAddr); + return HI_FAILURE; + } + pVirAddr = (HI_U8 *) HI_MPI_SYS_Mmap(u32PhyAddr, u32Size); + if (NULL == pVirAddr) + { + printf("HI_MPI_SYS_Mmap err!\n"); + SAMPLE_COMM_VI_ExitMpp((HI_S32)pVirAddr); + return HI_FAILURE; + } + + pstVFrameInfo->u32PoolId = HI_MPI_VB_Handle2PoolId(VbBlk); + if (VB_INVALID_POOLID == pstVFrameInfo->u32PoolId) + { + SAMPLE_COMM_VI_ExitMpp(pstVFrameInfo->u32PoolId); + return -1; + } + + pstVFrameInfo->stVFrame.u32PhyAddr[0] = u32PhyAddr; + pstVFrameInfo->stVFrame.u32PhyAddr[1] = pstVFrameInfo->stVFrame.u32PhyAddr[0] + u32LumaSize; + pstVFrameInfo->stVFrame.u32PhyAddr[2] = pstVFrameInfo->stVFrame.u32PhyAddr[1] + u32ChrmSize; + + pstVFrameInfo->stVFrame.pVirAddr[0] = pVirAddr; + pstVFrameInfo->stVFrame.pVirAddr[1] = pstVFrameInfo->stVFrame.pVirAddr[0] + u32LumaSize; + pstVFrameInfo->stVFrame.pVirAddr[2] = pstVFrameInfo->stVFrame.pVirAddr[1] + u32ChrmSize; + + pstVFrameInfo->stVFrame.u32Width = u32Width; + pstVFrameInfo->stVFrame.u32Height = u32Height; + pstVFrameInfo->stVFrame.u32Stride[0] = u32LStride; + pstVFrameInfo->stVFrame.u32Stride[1] = u32CStride; + pstVFrameInfo->stVFrame.u32Stride[2] = u32CStride; + pstVFrameInfo->stVFrame.u32Field = VIDEO_FIELD_FRAME; + + if(1 == u32Height) + { + SAMPLE_COMM_VI_ReadOneFpnFrame(pRawFile, pstVFrameInfo->stVFrame.pVirAddr[0], + pstVFrameInfo->stVFrame.u32Width, + 1, + pstVFrameInfo->stVFrame.u32Stride[0], + pstVFrameInfo->stVFrame.enPixelFormat, + pu32Offset, + &pstVMstFrameInfo->u32FrmSize, + &enCompressMode, + pu32Iso); + } + else + { + SAMPLE_COMM_VI_ReadOneFpnFrame(pRawFile, pstVFrameInfo->stVFrame.pVirAddr[0], + pstVFrameInfo->stVFrame.u32Width, + pstVFrameInfo->stVFrame.u32Height, + pstVFrameInfo->stVFrame.u32Stride[0], + pstVFrameInfo->stVFrame.enPixelFormat, + pu32Offset, + &pstVMstFrameInfo->u32FrmSize, + &enCompressMode, + pu32Iso); + } + + pstVFrameInfo->stVFrame.enCompressMode = enCompressMode; + //printf("pstVFrameInfo->stVFrame.enCompressMode: %d\n", pstVFrameInfo->stVFrame.enCompressMode); + + HI_MPI_SYS_Munmap(pVirAddr, u32Size); + return 0; +} + + + +HI_S32 SAMPLE_COMM_VI_ReadOneRawFile(const char* file_name, + HI_U32 u32Width, HI_U32 u32Height, + SAMPLE_VI_FRAME_INFO_S *pstVMstFrameInfo, + HI_U32 *u32Offset, + HI_U32 *pu32Iso) +{ + FILE *pfd; + HI_S32 s32Ret = HI_SUCCESS; + + /* open YUV file */ + printf("open dark frame file: %s. \n", file_name); + pfd = fopen(file_name, "rb"); + if (!pfd) + { + printf("open file -> %s fail \n", file_name); + return HI_FAILURE; + } + + /* read frame information from YUV file */ + s32Ret = SAMPLE_COMM_VI_GetFPNFrame_FromRaw(pfd, u32Width, u32Height, pstVMstFrameInfo, u32Offset, pu32Iso); + + fclose(pfd); + return s32Ret; +} + + +HI_S32 SAMPLE_COMM_VI_CORRECTION_CONFIG(const char* fpn_file, /* fpn file name */ + ISP_FPN_TYPE_E enFpnType, /* line/frame */ + ISP_OP_TYPE_E enOpType, /* auto/manual */ + HI_U32 u32Strength, /* strength */ + PIXEL_FORMAT_E enPixelFormat) +{ + VI_CHN ViChn = 0; + VI_CHN_ATTR_S stTempChnAttr; + ISP_FPN_ATTR_S stFPNAttr; + SAMPLE_VI_FRAME_INFO_S stVMstFrame = {0}; + ISP_DEV IspDev = 0; + ISP_FPN_FRAME_INFO_S *pstFpnFrmInfo; + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32Iso; + + s32Ret = HI_MPI_VI_GetChnAttr(ViChn, &stTempChnAttr); + if(HI_SUCCESS != s32Ret) + { + printf("get vi chn attr failed!"); + return HI_FAILURE; + } + + stVMstFrame.stVideoFrame.stVFrame.enPixelFormat = enPixelFormat; + stVMstFrame.stVideoFrame.stVFrame.enCompressMode = COMPRESS_MODE_NONE; + pstFpnFrmInfo = &stFPNAttr.stFpnFrmInfo; + + s32Ret = SAMPLE_COMM_VI_ReadOneRawFile(fpn_file, + stTempChnAttr.stDestSize.u32Width, + stTempChnAttr.stDestSize.u32Height, + &stVMstFrame, + &pstFpnFrmInfo->u32Offset, + &u32Iso); + + if(HI_SUCCESS != s32Ret) + { + printf("read raw file failed!"); + return HI_FAILURE; + } + + pstFpnFrmInfo->u32FrmSize = stVMstFrame.u32FrmSize; + memcpy(&pstFpnFrmInfo->stFpnFrame, + &stVMstFrame.stVideoFrame, + sizeof(VIDEO_FRAME_INFO_S)); + + stFPNAttr.bEnable = HI_TRUE; + stFPNAttr.enOpType = enOpType; + + printf("\nread u32Offset = 0x%x, u32iso = %d\n", stFPNAttr.stFpnFrmInfo.u32Offset ,u32Iso); + printf("hit any key,start correction\n"); + VI_PAUSE(); + + memcpy(&stFPNAttr.stFpnFrmInfo.stFpnFrame, + &stVMstFrame.stVideoFrame, + sizeof(VIDEO_FRAME_INFO_S)); + stFPNAttr.enFpnType = enFpnType; + stFPNAttr.stFpnFrmInfo.u32Iso = u32Iso; + stFPNAttr.stManual.u32Strength = u32Strength; + + s32Ret = HI_MPI_ISP_SetFPNAttr(IspDev, &stFPNAttr); + if(HI_SUCCESS != s32Ret) + { + printf("fpn correction fail 0x%x\n", s32Ret); + return HI_FAILURE; + } + + VI_PAUSE(); + + s32Ret = SAMPLE_COMM_VI_ReleaseVBToPool(&stVMstFrame); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_ReleaseVBToPool fail 0x%x\n", s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : Get enSize by diffrent sensor +******************************************************************************/ +HI_S32 SAMPLE_COMM_VI_GetSizeBySensor(PIC_SIZE_E *penSize) +{ + HI_S32 s32Ret = HI_SUCCESS; + SAMPLE_VI_MODE_E enMode = SENSOR_TYPE; + + if (!penSize) + { + return HI_FAILURE; + } + + switch (enMode) + { + case APTINA_AR0130_DC_720P_30FPS: + case APTINA_9M034_DC_720P_30FPS: + case SONY_IMX122_DC_720P_30FPS: + *penSize = PIC_HD720; + break; + case APTINA_AR0230_HISPI_1080P_30FPS: + case SONY_IMX122_DC_1080P_30FPS: + *penSize = PIC_HD1080; + break; + + default: + break; + } + + return s32Ret; +} + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ diff --git a/device/mpp/sample/common/sample_comm_vo.c b/device/mpp/sample/common/sample_comm_vo.c new file mode 100644 index 0000000..a00e29c --- /dev/null +++ b/device/mpp/sample/common/sample_comm_vo.c @@ -0,0 +1,347 @@ +/****************************************************************************** + Some simple Hisilicon Hi3531 video output functions. + + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-2 Created +******************************************************************************/ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" + + +HI_S32 SAMPLE_COMM_VO_GetWH(VO_INTF_SYNC_E enIntfSync, HI_U32 *pu32W,HI_U32 *pu32H, HI_U32 *pu32Frm) +{ + switch (enIntfSync) + { + case VO_OUTPUT_PAL : *pu32W = 720; *pu32H = 576; *pu32Frm = 25; break; + case VO_OUTPUT_NTSC : *pu32W = 720; *pu32H = 480; *pu32Frm = 30; break; + case VO_OUTPUT_576P50 : *pu32W = 720; *pu32H = 576; *pu32Frm = 50; break; + case VO_OUTPUT_480P60 : *pu32W = 720; *pu32H = 480; *pu32Frm = 60; break; + case VO_OUTPUT_800x600_60: *pu32W = 800; *pu32H = 600; *pu32Frm = 60; break; + case VO_OUTPUT_720P50 : *pu32W = 1280; *pu32H = 720; *pu32Frm = 50; break; + case VO_OUTPUT_720P60 : *pu32W = 1280; *pu32H = 720; *pu32Frm = 60; break; + case VO_OUTPUT_1080I50 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 50; break; + case VO_OUTPUT_1080I60 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 60; break; + case VO_OUTPUT_1080P24 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 24; break; + case VO_OUTPUT_1080P25 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 25; break; + case VO_OUTPUT_1080P30 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 30; break; + case VO_OUTPUT_1080P50 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 50; break; + case VO_OUTPUT_1080P60 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 60; break; + case VO_OUTPUT_1024x768_60: *pu32W = 1024; *pu32H = 768; *pu32Frm = 60; break; + case VO_OUTPUT_1280x1024_60: *pu32W = 1280; *pu32H = 1024; *pu32Frm = 60; break; + case VO_OUTPUT_1366x768_60: *pu32W = 1366; *pu32H = 768; *pu32Frm = 60; break; + case VO_OUTPUT_1440x900_60: *pu32W = 1440; *pu32H = 900; *pu32Frm = 60; break; + case VO_OUTPUT_1280x800_60: *pu32W = 1280; *pu32H = 800; *pu32Frm = 60; break; + case VO_OUTPUT_1600x1200_60: *pu32W = 1600; *pu32H = 1200; *pu32Frm = 60; break; + case VO_OUTPUT_1680x1050_60: *pu32W = 1680; *pu32H = 1050; *pu32Frm = 60; break; + case VO_OUTPUT_1920x1200_60: *pu32W = 1920; *pu32H = 1200; *pu32Frm = 60; break; + case VO_OUTPUT_320X240_60: *pu32W = 320; *pu32H = 240; *pu32Frm = 30; break; + case VO_OUTPUT_320X240_50: *pu32W = 320; *pu32H = 240; *pu32Frm = 50; break; + case VO_OUTPUT_240X320_50: *pu32W = 240; *pu32H = 320; *pu32Frm = 50; break; + case VO_OUTPUT_USER : *pu32W = 720; *pu32H = 576; *pu32Frm = 25; break; + default: + SAMPLE_PRT("vo enIntfSync not support!\n"); + return HI_FAILURE; + } + return HI_SUCCESS; +} + + +/****************************************************************************** +* function : Set system memory location +******************************************************************************/ +HI_S32 SAMPLE_COMM_VO_MemConfig(VO_DEV VoDev, HI_CHAR *pcMmzName) +{ + HI_S32 s32Ret = HI_SUCCESS; + MPP_CHN_S stMppChnVO; + + /* config vo dev */ + stMppChnVO.enModId = HI_ID_VOU; + stMppChnVO.s32DevId = VoDev; + stMppChnVO.s32ChnId = 0; + s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVO, pcMmzName); + if (s32Ret) + { + SAMPLE_PRT("HI_MPI_SYS_SetMemConf ERR !\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_COMM_VO_StartDev(VO_DEV VoDev, VO_PUB_ATTR_S *pstPubAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + //printf("-----------------dev:%d\n", VoDev); + s32Ret = HI_MPI_VO_SetPubAttr(VoDev, pstPubAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VO_Enable(VoDev); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + return s32Ret; +} + +HI_S32 SAMPLE_COMM_VO_StopDev(VO_DEV VoDev) +{ + HI_S32 s32Ret = HI_SUCCESS; + + s32Ret = HI_MPI_VO_Disable(VoDev); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + return s32Ret; +} + +HI_S32 SAMPLE_COMM_VO_StartLayer(VO_LAYER VoLayer,const VO_VIDEO_LAYER_ATTR_S *pstLayerAttr, HI_BOOL bVgsBypass) +{ + HI_S32 s32Ret = HI_SUCCESS; + + if (!bVgsBypass) + { + s32Ret = HI_MPI_VO_SetDispBufLen(VoLayer, 3); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + } + s32Ret = HI_MPI_VO_SetVideoLayerAttr(VoLayer, pstLayerAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VO_EnableVideoLayer(VoLayer); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + return s32Ret; +} + +HI_S32 SAMPLE_COMM_VO_StopLayer(VO_LAYER VoLayer) +{ + HI_S32 s32Ret = HI_SUCCESS; + + s32Ret = HI_MPI_VO_DisableVideoLayer(VoLayer); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + return s32Ret; +} + +HI_S32 SAMPLE_COMM_VO_StartChn(VO_LAYER VoLayer, SAMPLE_VO_MODE_E enMode) +{ + HI_S32 i; + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32WndNum = 0; + HI_U32 u32Square = 0; + HI_U32 u32Width = 0; + HI_U32 u32Height = 0; + VO_CHN_ATTR_S stChnAttr; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + + switch (enMode) + { + case VO_MODE_1MUX: + u32WndNum = 1; + u32Square = 1; + break; + case VO_MODE_2MUX: + u32WndNum = 2; + u32Square = 2; + break; + default: + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VO_GetVideoLayerAttr(VoLayer, &stLayerAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + u32Width = stLayerAttr.stImageSize.u32Width; + u32Height = stLayerAttr.stImageSize.u32Height; + printf("u32Width:%d, u32Square:%d\n", u32Width, u32Square); + for (i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" + +/****************************************************************************** +* function : Set vpss system memory location +******************************************************************************/ +HI_S32 SAMPLE_COMM_VPSS_MemConfig() +{ + HI_CHAR * pcMmzName; + MPP_CHN_S stMppChnVpss; + HI_S32 s32Ret, i; + + /*vpss group max is 64, not need config vpss chn.*/ + for(i=0;i<64;i++) + { + stMppChnVpss.enModId = HI_ID_VPSS; + stMppChnVpss.s32DevId = i; + stMppChnVpss.s32ChnId = 0; + + if(0 == (i%2)) + { + pcMmzName = NULL; + } + else + { + pcMmzName = "ddr1"; + } + + /*vpss*/ + s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVpss, pcMmzName); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Vpss HI_MPI_SYS_SetMemConf ERR !\n"); + return HI_FAILURE; + } + } + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_COMM_VPSS_StartGroup(VPSS_GRP VpssGrp, VPSS_GRP_ATTR_S *pstVpssGrpAttr) +{ + HI_S32 s32Ret; + VPSS_GRP_PARAM_S stVpssParam; + + if (VpssGrp < 0 || VpssGrp > VPSS_MAX_GRP_NUM) + { + printf("VpssGrp%d is out of rang. \n", VpssGrp); + return HI_FAILURE; + } + + if (HI_NULL == pstVpssGrpAttr) + { + printf("null ptr,line%d. \n", __LINE__); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VPSS_CreateGrp(VpssGrp, pstVpssGrpAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VPSS_CreateGrp failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + /*** set vpss param ***/ + s32Ret = HI_MPI_VPSS_GetGrpParam(VpssGrp, &stVpssParam); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + + s32Ret = HI_MPI_VPSS_SetGrpParam(VpssGrp, &stVpssParam); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VPSS_StartGrp(VpssGrp); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VPSS_StartGrp failed with %#x\n", s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_COMM_VPSS_EnableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, + VPSS_CHN_ATTR_S *pstVpssChnAttr, + VPSS_CHN_MODE_S *pstVpssChnMode, + VPSS_EXT_CHN_ATTR_S *pstVpssExtChnAttr) +{ + HI_S32 s32Ret; + + if (VpssGrp < 0 || VpssGrp > VPSS_MAX_GRP_NUM) + { + printf("VpssGrp%d is out of rang[0,%d]. \n", VpssGrp, VPSS_MAX_GRP_NUM); + return HI_FAILURE; + } + + if (VpssChn < 0 || VpssChn > VPSS_MAX_CHN_NUM) + { + printf("VpssChn%d is out of rang[0,%d]. \n", VpssChn, VPSS_MAX_CHN_NUM); + return HI_FAILURE; + } + + if (HI_NULL == pstVpssChnAttr && HI_NULL == pstVpssExtChnAttr) + { + printf("null ptr,line%d. \n", __LINE__); + return HI_FAILURE; + } + + if (VpssChn < VPSS_MAX_PHY_CHN_NUM) + { + s32Ret = HI_MPI_VPSS_SetChnAttr(VpssGrp, VpssChn, pstVpssChnAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VPSS_SetChnAttr failed with %#x\n", s32Ret); + return HI_FAILURE; + } + } + else + { + s32Ret = HI_MPI_VPSS_SetExtChnAttr(VpssGrp, VpssChn, pstVpssExtChnAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("%s failed with %#x\n", __FUNCTION__, s32Ret); + return HI_FAILURE; + } + } + + if (VpssChn < VPSS_MAX_PHY_CHN_NUM && HI_NULL != pstVpssChnMode) + { + s32Ret = HI_MPI_VPSS_SetChnMode(VpssGrp, VpssChn, pstVpssChnMode); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("%s failed with %#x\n", __FUNCTION__, s32Ret); + return HI_FAILURE; + } + } + + s32Ret = HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_VPSS_EnableChn failed with %#x\n", s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_COMM_VPSS_StopGroup(VPSS_GRP VpssGrp) +{ + HI_S32 s32Ret; + + if (VpssGrp < 0 || VpssGrp > VPSS_MAX_GRP_NUM) + { + printf("VpssGrp%d is out of rang[0,%d]. \n", VpssGrp, VPSS_MAX_GRP_NUM); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VPSS_StopGrp(VpssGrp); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("%s failed with %#x\n", __FUNCTION__, s32Ret); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VPSS_DestroyGrp(VpssGrp); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("%s failed with %#x\n", __FUNCTION__, s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_COMM_VPSS_DisableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn) +{ + HI_S32 s32Ret; + + if (VpssGrp < 0 || VpssGrp > VPSS_MAX_GRP_NUM) + { + printf("VpssGrp%d is out of rang[0,%d]. \n", VpssGrp, VPSS_MAX_GRP_NUM); + return HI_FAILURE; + } + + if (VpssChn < 0 || VpssChn > VPSS_MAX_CHN_NUM) + { + printf("VpssChn%d is out of rang[0,%d]. \n", VpssChn, VPSS_MAX_CHN_NUM); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VPSS_DisableChn(VpssGrp, VpssChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("%s failed with %#x\n", __FUNCTION__, s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + + + +/***************************************************************************** +* function : start vpss. VPSS chn with frame +*****************************************************************************/ +HI_S32 SAMPLE_COMM_VPSS_Start(HI_S32 s32GrpCnt, SIZE_S *pstSize, HI_S32 s32ChnCnt,VPSS_GRP_ATTR_S *pstVpssGrpAttr) +{ + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stGrpAttr = {0}; + VPSS_CHN_ATTR_S stChnAttr = {0}; + VPSS_GRP_PARAM_S stVpssParam = {0}; + HI_S32 s32Ret; + HI_S32 i, j; + + /*** Set Vpss Grp Attr ***/ + + if(NULL == pstVpssGrpAttr) + { + stGrpAttr.u32MaxW = pstSize->u32Width; + stGrpAttr.u32MaxH = pstSize->u32Height; + stGrpAttr.bIeEn = HI_FALSE; + stGrpAttr.bNrEn = HI_TRUE; + stGrpAttr.bHistEn = HI_FALSE; + stGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT; + } + else + { + memcpy(&stGrpAttr,pstVpssGrpAttr,sizeof(VPSS_GRP_ATTR_S)); + } + + + for(i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" + +#include +#include "hifb.h" +#include "loadbmp.h" +#include "hi_tde_api.h" +#include "hi_tde_type.h" +#include "hi_tde_errcode.h" + + +static VO_DEV VoDev = SAMPLE_VO_DEV_DSD0; +static HI_CHAR gs_cExitFlag = 0; +VO_INTF_TYPE_E g_enVoIntfType = VO_INTF_BT656; + +static struct fb_bitfield s_r16 = {10, 5, 0}; +static struct fb_bitfield s_g16 = {5, 5, 0}; +static struct fb_bitfield s_b16 = {0, 5, 0}; +static struct fb_bitfield s_a16 = {15, 1, 0}; + +#define WIDTH_720 720 +#define HEIGHT_576 576 + +#define SAMPLE_IMAGE_WIDTH 300 +#define SAMPLE_IMAGE_HEIGHT 150 +#define SAMPLE_IMAGE_NUM 20 +#define HIFB_RED_1555 0xFC00 + +#define GRAPHICS_LAYER_G0 0 + +#define SAMPLE_IMAGE1_PATH "./res/%d.bmp" + +typedef struct hiPTHREAD_HIFB_SAMPLE +{ + HI_S32 fd; + HI_S32 layer; + HI_S32 ctrlkey; +} PTHREAD_HIFB_SAMPLE_INFO; + +HI_S32 SAMPLE_HIFB_LoadBmp(const char* filename, HI_U8* pAddr) +{ + OSD_SURFACE_S Surface; + OSD_BITMAPFILEHEADER bmpFileHeader; + OSD_BITMAPINFO bmpInfo; + + if (GetBmpInfo(filename, &bmpFileHeader, &bmpInfo) < 0) + { + SAMPLE_PRT("GetBmpInfo err!\n"); + return HI_FAILURE; + } + + Surface.enColorFmt = OSD_COLOR_FMT_RGB1555; + + CreateSurfaceByBitMap(filename, &Surface, pAddr); + + return HI_SUCCESS; +} + +HI_VOID* SAMPLE_HIFB_PANDISPLAY(void* pData) +{ + HI_S32 i, x, y, s32Ret; + TDE_HANDLE s32Handle; + struct fb_fix_screeninfo fix; + struct fb_var_screeninfo var; + HI_U32 u32FixScreenStride = 0; + HI_U8* pShowScreen; + HI_U8* pHideScreen; + HI_U32 u32HideScreenPhy = 0; + HI_U16* pShowLine; + HI_U16* ptemp = NULL; + HIFB_ALPHA_S stAlpha; + HIFB_POINT_S stPoint = {0, 0}; + HI_CHAR file[12] = "/dev/fb0"; + + HI_CHAR image_name[128]; + HI_U8* pDst = NULL; + HI_BOOL bShow; + PTHREAD_HIFB_SAMPLE_INFO* pstInfo; + HIFB_COLORKEY_S stColorKey; + TDE2_RECT_S stSrcRect, stDstRect; + TDE2_SURFACE_S stSrc, stDst; + HI_U32 Phyaddr; + HI_VOID* Viraddr; + HI_U32 u32Width; + HI_U32 u32Height; + + if (VO_INTF_BT656 == g_enVoIntfType) + { + u32Width = WIDTH_720; + u32Height = HEIGHT_576; + } + else + { + u32Width = WIDTH_LCD; + u32Height = HEIGHT_LCD; + } + + if (HI_NULL == pData) + { + return HI_NULL; + } + pstInfo = (PTHREAD_HIFB_SAMPLE_INFO*)pData; + switch (pstInfo->layer) + { + case GRAPHICS_LAYER_G0 : + strcpy(file, "/dev/fb0"); + break; + default: + strcpy(file, "/dev/fb0"); + break; + } + + /* 1. open framebuffer device overlay 0 */ + pstInfo->fd = open(file, O_RDWR, 0); + if (pstInfo->fd < 0) + { + SAMPLE_PRT("open %s failed!\n", file); + return HI_NULL; + } + + bShow = HI_FALSE; + if (ioctl(pstInfo->fd, FBIOPUT_SHOW_HIFB, &bShow) < 0) + { + SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n"); + return HI_NULL; + } + /* 2. set the screen original position */ + switch (pstInfo->layer) + { + case GRAPHICS_LAYER_G0: + { + stPoint.s32XPos = 0; + stPoint.s32YPos = 0; + } + break; + default: + break; + } + + if (ioctl(pstInfo->fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0) + { + SAMPLE_PRT("set screen original show position failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + + /* 3. get the variable screen info */ + if (ioctl(pstInfo->fd, FBIOGET_VSCREENINFO, &var) < 0) + { + SAMPLE_PRT("Get variable screen info failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + + /* 4. modify the variable screen info + the screen size: IMAGE_WIDTH*IMAGE_HEIGHT + the virtual screen size: VIR_SCREEN_WIDTH*VIR_SCREEN_HEIGHT + (which equals to VIR_SCREEN_WIDTH*(IMAGE_HEIGHT*2)) + the pixel format: ARGB1555 + */ + usleep(4 * 1000 * 1000); + switch (pstInfo->layer) + { + case GRAPHICS_LAYER_G0: + { + var.xres_virtual = u32Width; + var.yres_virtual = u32Height * 2; + var.xres = u32Width; + var.yres = u32Height; + } + break; + default: + break; + } + + var.transp = s_a16; + var.red = s_r16; + var.green = s_g16; + var.blue = s_b16; + var.bits_per_pixel = 16; + var.activate = FB_ACTIVATE_NOW; + + /* 5. set the variable screeninfo */ + if (ioctl(pstInfo->fd, FBIOPUT_VSCREENINFO, &var) < 0) + { + SAMPLE_PRT("Put variable screen info failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + + /* 6. get the fix screen info */ + if (ioctl(pstInfo->fd, FBIOGET_FSCREENINFO, &fix) < 0) + { + SAMPLE_PRT("Get fix screen info failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + u32FixScreenStride = fix.line_length; /*fix screen stride*/ + + /* 7. map the physical video memory for user use */ + pShowScreen = mmap(HI_NULL, fix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, pstInfo->fd, 0); + if (MAP_FAILED == pShowScreen) + { + SAMPLE_PRT("mmap framebuffer failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + + memset(pShowScreen, 0x00, fix.smem_len); + + /* time to play*/ + bShow = HI_TRUE; + if (ioctl(pstInfo->fd, FBIOPUT_SHOW_HIFB, &bShow) < 0) + { + SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n"); + munmap(pShowScreen, fix.smem_len); + close(pstInfo->fd); + return HI_NULL; + } + + if (GRAPHICS_LAYER_G0 == pstInfo->layer) + { + for (i = 0; i < 1; i++) + { + if (i % 2) + { + var.yoffset = var.yres; + } + else + { + var.yoffset = 0; + } + ptemp = (HI_U16*)(pShowScreen + var.yres * u32FixScreenStride * (i % 2)); + for (y = 10; y < 200; y++) + { + for (x = 10; x < 200; x++) + { + *(ptemp + y * var.xres + x) = HIFB_RED_1555; + } + } + SAMPLE_PRT("expected: the red box will appear!\n"); + sleep(2); + stAlpha.bAlphaEnable = HI_TRUE; + stAlpha.u8Alpha0 = 0x0; + stAlpha.u8Alpha1 = 0x0; + if (ioctl(pstInfo->fd, FBIOPUT_ALPHA_HIFB, &stAlpha) < 0) + { + SAMPLE_PRT("Set alpha failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + SAMPLE_PRT("expected: after set alpha = 0, the red box will disappear!\n"); + sleep(2); + + stAlpha.u8Alpha0 = 0; + stAlpha.u8Alpha1 = 0xFF; + if (ioctl(pstInfo->fd, FBIOPUT_ALPHA_HIFB, &stAlpha) < 0) + { + SAMPLE_PRT("Set alpha failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + SAMPLE_PRT("expected:after set set alpha = 0xFF, the red box will appear again!\n"); + sleep(2); + + SAMPLE_PRT("expected: the red box will erased by colorkey!\n"); + stColorKey.bKeyEnable = HI_TRUE; + stColorKey.u32Key = HIFB_RED_1555; + s32Ret = ioctl(pstInfo->fd, FBIOPUT_COLORKEY_HIFB, &stColorKey); + if (s32Ret < 0) + { + SAMPLE_PRT("FBIOPUT_COLORKEY_HIFB failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + sleep(2); + SAMPLE_PRT("expected: the red box will appear again!\n"); + stColorKey.bKeyEnable = HI_FALSE; + s32Ret = ioctl(pstInfo->fd, FBIOPUT_COLORKEY_HIFB, &stColorKey); + if (s32Ret < 0) + { + SAMPLE_PRT("FBIOPUT_COLORKEY_HIFB failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + sleep(2); + } + } + + /* show bitmap */ + switch (pstInfo->ctrlkey) + { + case 2: + { + /*change bmp*/ + if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&Phyaddr, ((void**)&Viraddr), + NULL, NULL, SAMPLE_IMAGE_WIDTH * SAMPLE_IMAGE_HEIGHT * 2)) + { + SAMPLE_PRT("allocate memory (maxW*maxH*2 bytes) failed\n"); + close(pstInfo->fd); + return HI_NULL; + } + + s32Ret = HI_TDE2_Open(); + if (s32Ret < 0) + { + SAMPLE_PRT("HI_TDE2_Open failed :%d!\n", s32Ret); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + close(pstInfo->fd); + return HI_NULL; + } + + SAMPLE_PRT("expected:two red line!\n"); + for (i = 0; i < SAMPLE_IMAGE_NUM; i++) + { + if ('q' == gs_cExitFlag) + { + printf("process exit...\n"); + break; + } + /* step1: draw two red line*/ + if (i % 2) + { + var.yoffset = var.yres; + } + else + { + var.yoffset = 0; + } + + pHideScreen = pShowScreen + (u32FixScreenStride * var.yres) * (i % 2); + memset(pHideScreen, 0x00, u32FixScreenStride * var.yres); + u32HideScreenPhy = fix.smem_start + (i % 2) * u32FixScreenStride * var.yres; + + pShowLine = (HI_U16*)pHideScreen; + for (y = (u32Height / 2 - 2); y < (u32Height / 2 + 2); y++) + { + for (x = 0; x < u32Width; x++) + { + *(pShowLine + y * var.xres + x) = HIFB_RED_1555; + } + } + for (y = 0; y < u32Height; y++) + { + for (x = (u32Width / 2 - 2); x < (u32Width / 2 + 2); x++) + { + *(pShowLine + y * var.xres + x) = HIFB_RED_1555; + } + } + + if (ioctl(pstInfo->fd, FBIOPAN_DISPLAY, &var) < 0) + { + SAMPLE_PRT("FBIOPAN_DISPLAY failed!\n"); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + close(pstInfo->fd); + return HI_NULL; + } + + /* step2: draw gui picture*/ + sprintf(image_name, SAMPLE_IMAGE1_PATH, i % 2); + pDst = (HI_U8*)Viraddr; + SAMPLE_HIFB_LoadBmp(image_name, pDst); + + /* 0. open tde */ + stSrcRect.s32Xpos = 0; + stSrcRect.s32Ypos = 0; + stSrcRect.u32Height = SAMPLE_IMAGE_HEIGHT; + stSrcRect.u32Width = SAMPLE_IMAGE_WIDTH; + stDstRect.s32Xpos = 0; + stDstRect.s32Ypos = 0; + stDstRect.u32Height = stSrcRect.u32Height; + stDstRect.u32Width = stSrcRect.u32Width; + + stDst.enColorFmt = TDE2_COLOR_FMT_ARGB1555; + stDst.u32Width = u32Width; + stDst.u32Height = u32Height; + stDst.u32Stride = u32FixScreenStride; + stDst.u32PhyAddr = u32HideScreenPhy; + + stSrc.enColorFmt = TDE2_COLOR_FMT_ARGB1555; + stSrc.u32Width = SAMPLE_IMAGE_WIDTH; + stSrc.u32Height = SAMPLE_IMAGE_HEIGHT; + stSrc.u32Stride = 2 * SAMPLE_IMAGE_WIDTH; + stSrc.u32PhyAddr = Phyaddr; + stSrc.bAlphaExt1555 = HI_TRUE; + stSrc.bAlphaMax255 = HI_TRUE; + stSrc.u8Alpha0 = 0XFF; + stSrc.u8Alpha1 = 0XFF; + + /* 1. start job */ + s32Handle = HI_TDE2_BeginJob(); + if (HI_ERR_TDE_INVALID_HANDLE == s32Handle) + { + SAMPLE_PRT("start job failed!\n"); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + close(pstInfo->fd); + return HI_NULL; + } + + s32Ret = HI_TDE2_QuickCopy(s32Handle, &stSrc, &stSrcRect, &stDst, &stDstRect); + if (s32Ret < 0) + { + SAMPLE_PRT("HI_TDE2_QuickCopy:%d failed,ret=0x%x!\n", __LINE__, s32Ret); + HI_TDE2_CancelJob(s32Handle); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + close(pstInfo->fd); + return HI_NULL; + } + + /* 3. submit job */ + s32Ret = HI_TDE2_EndJob(s32Handle, HI_FALSE, HI_TRUE, 10); + if (s32Ret < 0) + { + SAMPLE_PRT("Line:%d,HI_TDE2_EndJob failed,ret=0x%x!\n", __LINE__, s32Ret); + HI_TDE2_CancelJob(s32Handle); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + close(pstInfo->fd); + return HI_NULL; + } + + if (ioctl(pstInfo->fd, FBIOPAN_DISPLAY, &var) < 0) + { + SAMPLE_PRT("FBIOPAN_DISPLAY failed!\n"); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + close(pstInfo->fd); + return HI_NULL; + } + sleep(1); + + } + HI_TDE2_Close(); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + } + break; + default: + { + } + } + + /* unmap the physical memory */ + munmap(pShowScreen, fix.smem_len); + bShow = HI_FALSE; + if (ioctl(pstInfo->fd, FBIOPUT_SHOW_HIFB, &bShow) < 0) + { + SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + close(pstInfo->fd); + return HI_NULL; +} + +HI_VOID* SAMPLE_HIFB_REFRESH(void* pData) +{ + HI_S32 s32Ret = HI_SUCCESS; + HIFB_LAYER_INFO_S stLayerInfo = {0}; + HIFB_BUFFER_S stCanvasBuf; + HI_U16* pBuf; + HI_U8* pDst = NULL; + HI_U32 x; + HI_U32 y; + HI_U32 i; + HI_CHAR image_name[128]; + HI_BOOL bShow; + HIFB_POINT_S stPoint = {0}; + struct fb_var_screeninfo stVarInfo; + HI_CHAR file[12] = "/dev/fb0"; + HI_U32 maxW; + HI_U32 maxH; + PTHREAD_HIFB_SAMPLE_INFO* pstInfo; + HIFB_COLORKEY_S stColorKey; + TDE2_RECT_S stSrcRect, stDstRect; + TDE2_SURFACE_S stSrc, stDst; + HI_U32 Phyaddr; + HI_VOID* Viraddr; + TDE_HANDLE s32Handle; + + if (HI_NULL == pData) + { + return HI_NULL; + } + pstInfo = (PTHREAD_HIFB_SAMPLE_INFO*)pData; + + switch (pstInfo->layer) + { + case GRAPHICS_LAYER_G0: + strcpy(file, "/dev/fb0"); + break; + default: + strcpy(file, "/dev/fb0"); + break; + } + + /* 1. open framebuffer device overlay 0 */ + pstInfo->fd = open(file, O_RDWR, 0); + if (pstInfo->fd < 0) + { + SAMPLE_PRT("open %s failed!\n", file); + return HI_NULL; + } + /*all layer surport colorkey*/ + stColorKey.bKeyEnable = HI_TRUE; + stColorKey.u32Key = 0x0; + if (ioctl(pstInfo->fd, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0) + { + SAMPLE_PRT("FBIOPUT_COLORKEY_HIFB!\n"); + close(pstInfo->fd); + return HI_NULL; + } + s32Ret = ioctl(pstInfo->fd, FBIOGET_VSCREENINFO, &stVarInfo); + if (s32Ret < 0) + { + SAMPLE_PRT("GET_VSCREENINFO failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + + if (ioctl(pstInfo->fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0) + { + SAMPLE_PRT("set screen original show position failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + + if (VO_INTF_BT656== g_enVoIntfType) + { + maxW = WIDTH_720; + maxH = HEIGHT_576; + } + else + { + maxW = WIDTH_LCD; + maxH = HEIGHT_LCD; + } + + stVarInfo.transp = s_a16; + stVarInfo.red = s_r16; + stVarInfo.green = s_g16; + stVarInfo.blue = s_b16; + stVarInfo.bits_per_pixel = 16; + stVarInfo.activate = FB_ACTIVATE_NOW; + stVarInfo.xres = stVarInfo.xres_virtual = maxW; + stVarInfo.yres = stVarInfo.yres_virtual = maxH; + s32Ret = ioctl(pstInfo->fd, FBIOPUT_VSCREENINFO, &stVarInfo); + if (s32Ret < 0) + { + SAMPLE_PRT("PUT_VSCREENINFO failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + switch (pstInfo->ctrlkey) + { + case 0 : + { + stLayerInfo.BufMode = HIFB_LAYER_BUF_ONE; + stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE; + break; + } + + case 1 : + { + stLayerInfo.BufMode = HIFB_LAYER_BUF_DOUBLE; + stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE; + break; + } + + default: + { + stLayerInfo.BufMode = HIFB_LAYER_BUF_NONE; + stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE; + } + } + s32Ret = ioctl(pstInfo->fd, FBIOPUT_LAYER_INFO, &stLayerInfo); + if (s32Ret < 0) + { + SAMPLE_PRT("PUT_LAYER_INFO failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + bShow = HI_TRUE; + if (ioctl(pstInfo->fd, FBIOPUT_SHOW_HIFB, &bShow) < 0) + { + SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n"); + close(pstInfo->fd); + return HI_NULL; + } + + if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&(stCanvasBuf.stCanvas.u32PhyAddr), ((void**)&pBuf), + NULL, NULL, maxW * maxH * 2)) + { + SAMPLE_PRT("allocate memory (maxW*maxH*2 bytes) failed\n"); + close(pstInfo->fd); + return HI_NULL; + } + stCanvasBuf.stCanvas.u32Height = maxH; + stCanvasBuf.stCanvas.u32Width = maxW; + stCanvasBuf.stCanvas.u32Pitch = maxW * 2; + stCanvasBuf.stCanvas.enFmt = HIFB_FMT_ARGB1555; + memset(pBuf, 0x00, stCanvasBuf.stCanvas.u32Pitch * stCanvasBuf.stCanvas.u32Height); + + /*change bmp*/ + if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&Phyaddr, ((void**)&Viraddr), + NULL, NULL, SAMPLE_IMAGE_WIDTH * SAMPLE_IMAGE_HEIGHT * 2)) + { + SAMPLE_PRT("allocate memory failed\n"); + HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf); + close(pstInfo->fd); + return HI_NULL; + } + + s32Ret = HI_TDE2_Open(); + if (s32Ret < 0) + { + SAMPLE_PRT("HI_TDE2_Open failed :%d!\n", s32Ret); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf); + close(pstInfo->fd); + return HI_NULL; + } + + SAMPLE_PRT("expected:two red line!\n"); + /*time to play*/ + for (i = 0; i < SAMPLE_IMAGE_NUM; i++) + { + if ('q' == gs_cExitFlag) + { + printf("process exit...\n"); + break; + } + + for (y = (maxH / 2 - 2); y < (maxH / 2 + 2); y++) + { + for (x = 0; x < maxW; x++) + { + *(pBuf + y * maxW + x) = HIFB_RED_1555; + } + } + for (y = 0; y < maxH; y++) + { + for (x = (maxW / 2 - 2); x < (maxW / 2 + 2); x++) + { + *(pBuf + y * maxW + x) = HIFB_RED_1555; + } + } + + stCanvasBuf.UpdateRect.x = 0; + stCanvasBuf.UpdateRect.y = 0; + stCanvasBuf.UpdateRect.w = maxW; + stCanvasBuf.UpdateRect.h = maxH; + s32Ret = ioctl(pstInfo->fd, FBIO_REFRESH, &stCanvasBuf); + if (s32Ret < 0) + { + SAMPLE_PRT("REFRESH failed!\n"); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf); + close(pstInfo->fd); + return HI_NULL; + } + sleep(2); + + sprintf(image_name, SAMPLE_IMAGE1_PATH, i % 2); + pDst = (HI_U8*)Viraddr; + SAMPLE_HIFB_LoadBmp(image_name, pDst); + + /* 0. open tde */ + stSrcRect.s32Xpos = 0; + stSrcRect.s32Ypos = 0; + stSrcRect.u32Height = SAMPLE_IMAGE_HEIGHT; + stSrcRect.u32Width = SAMPLE_IMAGE_WIDTH; + stDstRect.s32Xpos = 0; + stDstRect.s32Ypos = 0; + stDstRect.u32Height = stSrcRect.u32Width; + stDstRect.u32Width = stSrcRect.u32Width; + + stDst.enColorFmt = TDE2_COLOR_FMT_ARGB1555; + stDst.u32Width = maxW; + stDst.u32Height = maxH; + stDst.u32Stride = maxW * 2; + stDst.u32PhyAddr = stCanvasBuf.stCanvas.u32PhyAddr; + + stSrc.enColorFmt = TDE2_COLOR_FMT_ARGB1555; + stSrc.u32Width = SAMPLE_IMAGE_WIDTH; + stSrc.u32Height = SAMPLE_IMAGE_HEIGHT; + stSrc.u32Stride = 2 * SAMPLE_IMAGE_WIDTH; + stSrc.u32PhyAddr = Phyaddr; + stSrc.bAlphaExt1555 = HI_TRUE; + stSrc.bAlphaMax255 = HI_TRUE; + stSrc.u8Alpha0 = 0XFF; + stSrc.u8Alpha1 = 0XFF; + + /* 1. start job */ + s32Handle = HI_TDE2_BeginJob(); + if (HI_ERR_TDE_INVALID_HANDLE == s32Handle) + { + SAMPLE_PRT("start job failed!\n"); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf); + close(pstInfo->fd); + return HI_NULL; + } + + s32Ret = HI_TDE2_QuickCopy(s32Handle, &stSrc, &stSrcRect, &stDst, &stDstRect); + if (s32Ret < 0) + { + SAMPLE_PRT("HI_TDE2_QuickCopy:%d failed,ret=0x%x!\n", __LINE__, s32Ret); + HI_TDE2_CancelJob(s32Handle); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf); + close(pstInfo->fd); + return HI_NULL; + } + + /* 3. submit job */ + s32Ret = HI_TDE2_EndJob(s32Handle, HI_FALSE, HI_TRUE, 10); + if (s32Ret < 0) + { + SAMPLE_PRT("Line:%d,HI_TDE2_EndJob failed,ret=0x%x!\n", __LINE__, s32Ret); + HI_TDE2_CancelJob(s32Handle); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf); + close(pstInfo->fd); + return HI_NULL; + } + + stCanvasBuf.UpdateRect.x = 0; + stCanvasBuf.UpdateRect.y = 0; + stCanvasBuf.UpdateRect.w = maxW; + stCanvasBuf.UpdateRect.h = maxH; + s32Ret = ioctl(pstInfo->fd, FBIO_REFRESH, &stCanvasBuf); + if (s32Ret < 0) + { + SAMPLE_PRT("REFRESH failed!\n"); + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf); + close(pstInfo->fd); + return HI_NULL; + } + + sleep(2); + } + + HI_MPI_SYS_MmzFree(Phyaddr, Viraddr); + HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf); + close(pstInfo->fd); + + return HI_NULL; +} + +HI_VOID SAMPLE_HIFB_HandleSig(HI_S32 signo) +{ + if (SIGINT == signo || SIGTSTP == signo) + { + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram exit abnormally!\033[0;39m\n"); + } + + exit(0); +} + +HI_VOID SAMPLE_HIFB_Usage1(HI_CHAR* sPrgNm) +{ + printf("Usage : %s \n", sPrgNm); + printf("intf:\n"); + printf("\t 0) vo BT656 output, default.\n"); + printf("\t 1) vo LCD output.\n"); + + return; +} + +HI_VOID SAMPLE_HIFB_Usage2(HI_VOID) +{ + printf("\n\n/************************************/\n"); + printf("please choose the case which you want to run:\n"); + printf("\t0: ARGB1555 standard mode\n"); + printf("\t1: ARGB1555 BUF_DOUBLE mode\n"); + printf("\t2: ARGB1555 BUF_ONE mode\n"); + printf("\t3: ARGB1555 BUF_NONE mode\n"); + printf("\tq: quit the whole sample\n"); + printf("sample command:"); + + return; +} + +HI_S32 SAMPLE_HIFB_StandardMode(HI_VOID) +{ + HI_S32 s32Ret = HI_SUCCESS; + pthread_t phifb0 = -1; + PTHREAD_HIFB_SAMPLE_INFO stInfo0; + HI_U32 u32PicWidth; + HI_U32 u32PicHeight; + SIZE_S stSize; + + VO_LAYER VoLayer = 0; + VO_PUB_ATTR_S stPubAttr; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + HI_U32 u32VoFrmRate; + + VB_CONF_S stVbConf; + HI_U32 u32BlkSize; + + /****************************************** + step 1: init variable + ******************************************/ + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + if (VO_INTF_BT656 == g_enVoIntfType) + { + u32PicWidth = WIDTH_720; + u32PicHeight = HEIGHT_576; + } + else + { + u32PicWidth = WIDTH_LCD; + u32PicHeight = HEIGHT_LCD; + } + + u32BlkSize = CEILING_2_POWER(u32PicWidth, SAMPLE_SYS_ALIGN_WIDTH)\ + * CEILING_2_POWER(u32PicHeight, SAMPLE_SYS_ALIGN_WIDTH) * 2; + + stVbConf.u32MaxPoolCnt = 128; + + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 6; + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_NoneBufMode_0; + } + + /****************************************** + step 3: start vo dev. + *****************************************/ + if (VO_INTF_BT656 == g_enVoIntfType) + { + stPubAttr.enIntfSync = VO_OUTPUT_PAL; + stPubAttr.enIntfType = g_enVoIntfType; + stPubAttr.u32BgColor = 0x0000FF; + } + else + { + stPubAttr.enIntfSync = SYNC_LCD; + stPubAttr.enIntfType = g_enVoIntfType; + stPubAttr.u32BgColor = 0x0000FF; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync, &stSize.u32Width, \ + &stSize.u32Height, &u32VoFrmRate); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("get vo wh failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_NoneBufMode_0; + } + memcpy(&stLayerAttr.stImageSize, &stSize, sizeof(stSize)); + + stLayerAttr.u32DispFrmRt = 30 ; + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + stLayerAttr.stDispRect.u32Width = stSize.u32Width; + stLayerAttr.stDispRect.u32Height = stSize.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_NoneBufMode_0; + } + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_NoneBufMode_1; + } + + /****************************************** + step 4: start hifb. + *****************************************/ + stInfo0.layer = 0; + stInfo0.fd = -1; + stInfo0.ctrlkey = 2; + pthread_create(&phifb0, 0, SAMPLE_HIFB_PANDISPLAY, (void*)(&stInfo0)); + + while (1) + { + + HI_CHAR ch; + + printf("press 'q' to exit this sample.\n"); + ch = (char)getchar(); + getchar(); + if ('q' == ch) + { + gs_cExitFlag = ch; + break; + } + else + { + printf("input invaild! please try again.\n"); + } + } + if (-1 != phifb0) + { + pthread_join(phifb0, 0); + } + + SAMPLE_COMM_VO_StopLayer(VoLayer); +SAMPLE_HIFB_NoneBufMode_1: + SAMPLE_COMM_VO_StopDev(VoDev); +SAMPLE_HIFB_NoneBufMode_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +HI_S32 SAMPLE_HIFB_DoubleBufMode(HI_VOID) +{ + HI_S32 s32Ret = HI_SUCCESS; + pthread_t phifb0 = -1; + + PTHREAD_HIFB_SAMPLE_INFO stInfo0; + HI_U32 u32PicWidth; + HI_U32 u32PicHeight; + SIZE_S stSize; + + VO_LAYER VoLayer = 0; + VO_PUB_ATTR_S stPubAttr; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + HI_U32 u32VoFrmRate; + + VB_CONF_S stVbConf; + HI_U32 u32BlkSize; + + /****************************************** + step 1: init variable + ******************************************/ + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + if (VO_INTF_BT656 == g_enVoIntfType) + { + u32PicWidth = WIDTH_720; + u32PicHeight = HEIGHT_576; + } + else + { + u32PicWidth = WIDTH_LCD; + u32PicHeight = HEIGHT_LCD; + } + + u32BlkSize = CEILING_2_POWER(u32PicWidth, SAMPLE_SYS_ALIGN_WIDTH)\ + * CEILING_2_POWER(u32PicHeight, SAMPLE_SYS_ALIGN_WIDTH) * 2; + + stVbConf.u32MaxPoolCnt = 128; + + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 6; + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_DoubleBufMode_0; + } + + /****************************************** + step 3: start vo dev. + *****************************************/ + if (VO_INTF_BT656 == g_enVoIntfType) + { + stPubAttr.enIntfSync = VO_OUTPUT_PAL; + stPubAttr.enIntfType = g_enVoIntfType; + stPubAttr.u32BgColor = 0x0000FF; + } + else + { + stPubAttr.enIntfSync = SYNC_LCD; + stPubAttr.enIntfType = g_enVoIntfType; + stPubAttr.u32BgColor = 0x0000FF; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync, &stSize.u32Width, \ + &stSize.u32Height, &u32VoFrmRate); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("get vo wh failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_DoubleBufMode_0; + } + memcpy(&stLayerAttr.stImageSize, &stSize, sizeof(stSize)); + + stLayerAttr.u32DispFrmRt = 30 ; + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + stLayerAttr.stDispRect.u32Width = stSize.u32Width; + stLayerAttr.stDispRect.u32Height = stSize.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_DoubleBufMode_0; + } + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_DoubleBufMode_1; + } + + /****************************************** + step 4: start hifb. + *****************************************/ + stInfo0.layer = 0; + stInfo0.fd = -1; + stInfo0.ctrlkey = 1; + pthread_create(&phifb0, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0)); + + while (1) + { + HI_CHAR ch; + + printf("press 'q' to exit this sample.\n"); + ch = (char)getchar(); + getchar(); + if ('q' == ch) + { + gs_cExitFlag = ch; + break; + } + else + { + printf("input invaild! please try again.\n"); + } + } + if (-1 != phifb0) + { + pthread_join(phifb0, 0); + } + + SAMPLE_COMM_VO_StopLayer(VoLayer); +SAMPLE_HIFB_DoubleBufMode_1: + HI_MPI_VO_Disable(VoDev); +SAMPLE_HIFB_DoubleBufMode_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +HI_S32 SAMPLE_HIFB_OneBufMode(HI_VOID) +{ + HI_S32 s32Ret = HI_SUCCESS; + pthread_t phifb0 = -1; + + PTHREAD_HIFB_SAMPLE_INFO stInfo0; + HI_U32 u32PicWidth; + HI_U32 u32PicHeight; + SIZE_S stSize; + + VO_LAYER VoLayer = 0; + VO_PUB_ATTR_S stPubAttr; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + HI_U32 u32VoFrmRate; + + VB_CONF_S stVbConf; + HI_U32 u32BlkSize; + + /****************************************** + step 1: init variable + ******************************************/ + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + if (VO_INTF_BT656 == g_enVoIntfType) + { + u32PicWidth = WIDTH_720; + u32PicHeight = HEIGHT_576; + } + else + { + u32PicWidth = WIDTH_LCD; + u32PicHeight = HEIGHT_LCD; + } + + u32BlkSize = CEILING_2_POWER(u32PicWidth, SAMPLE_SYS_ALIGN_WIDTH)\ + * CEILING_2_POWER(u32PicHeight, SAMPLE_SYS_ALIGN_WIDTH) * 2; + + stVbConf.u32MaxPoolCnt = 128; + + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 6; + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_OneBufMode_0; + } + + /****************************************** + step 3: start vo dev. + *****************************************/ + if (VO_INTF_BT656 == g_enVoIntfType) + { + stPubAttr.enIntfSync = VO_OUTPUT_PAL; + stPubAttr.enIntfType = g_enVoIntfType; + stPubAttr.u32BgColor = 0x0000FF; + } + else + { + stPubAttr.enIntfSync = SYNC_LCD; + stPubAttr.enIntfType = g_enVoIntfType; + stPubAttr.u32BgColor = 0x0000FF; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync, &stSize.u32Width, \ + &stSize.u32Height, &u32VoFrmRate); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("get vo wh failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_OneBufMode_0; + } + memcpy(&stLayerAttr.stImageSize, &stSize, sizeof(stSize)); + + stLayerAttr.u32DispFrmRt = 30 ; + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + stLayerAttr.stDispRect.u32Width = stSize.u32Width; + stLayerAttr.stDispRect.u32Height = stSize.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_OneBufMode_0; + } + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_OneBufMode_1; + } + + /****************************************** + step 4: start hifb. + *****************************************/ + stInfo0.layer = 0; + stInfo0.fd = -1; + stInfo0.ctrlkey = 0; + pthread_create(&phifb0, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0)); + + while (1) + { + HI_CHAR ch; + + printf("press 'q' to exit this sample.\n"); + ch = (char)getchar(); + getchar(); + if ('q' == ch) + { + gs_cExitFlag = ch; + break; + } + else + { + printf("input invaild! please try again.\n"); + } + } + if (-1 != phifb0) + { + pthread_join(phifb0, 0); + } + + + SAMPLE_COMM_VO_StopLayer(VoLayer); +SAMPLE_HIFB_OneBufMode_1: + HI_MPI_VO_Disable(VoDev); +SAMPLE_HIFB_OneBufMode_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +HI_S32 SAMPLE_HIFB_NoneBufMode(HI_VOID) +{ + HI_S32 s32Ret = HI_SUCCESS; + pthread_t phifb0 = -1; + + PTHREAD_HIFB_SAMPLE_INFO stInfo0; + HI_U32 u32PicWidth; + HI_U32 u32PicHeight; + SIZE_S stSize; + + VO_LAYER VoLayer = 0; + VO_PUB_ATTR_S stPubAttr; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + HI_U32 u32VoFrmRate; + + VB_CONF_S stVbConf; + HI_U32 u32BlkSize; + + /****************************************** + step 1: init variable + ******************************************/ + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + if (VO_INTF_BT656 == g_enVoIntfType) + { + u32PicWidth = WIDTH_720; + u32PicHeight = HEIGHT_576; + } + else + { + u32PicWidth = WIDTH_LCD; + u32PicHeight = HEIGHT_LCD; + } + + u32BlkSize = CEILING_2_POWER(u32PicWidth, SAMPLE_SYS_ALIGN_WIDTH)\ + * CEILING_2_POWER(u32PicHeight, SAMPLE_SYS_ALIGN_WIDTH) * 2; + + stVbConf.u32MaxPoolCnt = 128; + + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 6; + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_NoneBufMode_0; + } + + /****************************************** + step 3: start vo dev. + *****************************************/ + if (VO_INTF_BT656 == g_enVoIntfType) + { + stPubAttr.enIntfSync = VO_OUTPUT_PAL; + stPubAttr.enIntfType = g_enVoIntfType; + stPubAttr.u32BgColor = 0x0000FF; + } + else + { + stPubAttr.enIntfSync = SYNC_LCD; + stPubAttr.enIntfType = g_enVoIntfType; + stPubAttr.u32BgColor = 0x0000FF; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync, &stSize.u32Width, \ + &stSize.u32Height, &u32VoFrmRate); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("get vo wh failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_NoneBufMode_0; + } + memcpy(&stLayerAttr.stImageSize, &stSize, sizeof(stSize)); + + stLayerAttr.u32DispFrmRt = 30 ; + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + stLayerAttr.stDispRect.u32Width = stSize.u32Width; + stLayerAttr.stDispRect.u32Height = stSize.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_NoneBufMode_0; + } + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret); + goto SAMPLE_HIFB_NoneBufMode_1; + } + + /****************************************** + step 4: start hifb. + *****************************************/ + stInfo0.layer = 0; + stInfo0.fd = -1; + stInfo0.ctrlkey = 3; + pthread_create(&phifb0, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0)); + + while (1) + { + HI_CHAR ch; + + printf("press 'q' to exit this sample.\n"); + ch = (char)getchar(); + getchar(); + if ('q' == ch) + { + gs_cExitFlag = ch; + break; + } + else + { + printf("input invaild! please try again.\n"); + } + } + if (-1 != phifb0) + { + pthread_join(phifb0, 0); + } + + SAMPLE_COMM_VO_StopLayer(VoLayer); +SAMPLE_HIFB_NoneBufMode_1: + HI_MPI_VO_Disable(VoDev); +SAMPLE_HIFB_NoneBufMode_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +int main(int argc, char* argv[]) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_CHAR ch; + HI_BOOL bExit = HI_FALSE; + + if ( (argc < 2) || (1 != strlen(argv[1]))) + { + SAMPLE_HIFB_Usage1(argv[0]); + return HI_FAILURE; + } + signal(SIGINT, SAMPLE_HIFB_HandleSig); + signal(SIGTERM, SAMPLE_HIFB_HandleSig); + if ((argc > 1) && *argv[1] == '1') /* '0': VO_INTF_CVBS, else: BT1120 */ + { + g_enVoIntfType = INTF_LCD; + } + + /****************************************** + 1 choose the case + ******************************************/ + while (1) + { + SAMPLE_HIFB_Usage2(); + gs_cExitFlag = 0; + ch = (char)getchar(); + getchar(); + switch (ch) + { + case '0': + { + SAMPLE_HIFB_StandardMode(); + break; + } + case '1': + { + SAMPLE_HIFB_DoubleBufMode(); + break; + } + case '2': + { + SAMPLE_HIFB_OneBufMode(); + break; + } + case '3': + { + SAMPLE_HIFB_NoneBufMode(); + break; + } + case 'q': + case 'Q': + { + bExit = HI_TRUE; + break; + } + + default : + { + printf("input invaild! please try again.\n"); + break; + } + } + + if (bExit) + { + break; + } + } + + return s32Ret; +} + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/22 b/device/mpp/sample/hisi_rtsp_demo-master/22 new file mode 100644 index 0000000..e69de29 diff --git a/device/mpp/sample/hisi_rtsp_demo-master/Makefile b/device/mpp/sample/hisi_rtsp_demo-master/Makefile new file mode 100644 index 0000000..8654555 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/Makefile @@ -0,0 +1,37 @@ +# Hisilicon Hi3516 sample Makefile + +include ../Makefile.param +#ifeq ($(SAMPLE_PARAM_FILE), ) +# SAMPLE_PARAM_FILE:=../Makefile.param +# include $(SAMPLE_PARAM_FILE) +#endif +curdir = $(shell pwd) + +SENSOR_LIBS += $(curdir)/rtsp_lib/librtsp.a +CFLAGS += -I$(curdir)/rtsp_lib/ +CFLAGS += -I$(curdir)/include/ + +# target source +SRC := $(wildcard *.c) +OBJ := $(SRC:%.c=%.o) + +TARGET := $(OBJ:%.o=%) +.PHONY : clean all + + + +all: $(TARGET) + @cd rtsp_lib; make +$(TARGET):%:%.o $(COMM_OBJ) + $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(SENSOR_LIBS) $(INCFLAGS) + +clean: + @rm -f $(TARGET) + @rm -f $(OBJ) + @rm -f $(COMM_OBJ) + +cleanstream: + @rm -f *.h264 + @rm -f *.jpg + @rm -f *.mjp + @rm -f *.mp4 diff --git a/device/mpp/sample/hisi_rtsp_demo-master/README.md b/device/mpp/sample/hisi_rtsp_demo-master/README.md new file mode 100644 index 0000000..d62edd0 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/README.md @@ -0,0 +1,15 @@ +# hisi_rtsd +sample of rtsp hisi3516cv200 + +cd mpp/sample + +git clone https://github.com/1658988725/hisi_rtsp_demo.git + +cd hisi_rtsp_demo/rtsp_lib + +//first create rtsp.a +make + +cd .. +//create sample_venc_rtsp +make diff --git a/device/mpp/sample/hisi_rtsp_demo-master/calcy_vpsschndump b/device/mpp/sample/hisi_rtsp_demo-master/calcy_vpsschndump new file mode 100644 index 0000000..5f3da97 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/calcy_vpsschndump differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/calcy_vpsschndump.c b/device/mpp/sample/hisi_rtsp_demo-master/calcy_vpsschndump.c new file mode 100644 index 0000000..7a826ec --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/calcy_vpsschndump.c @@ -0,0 +1,662 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_vpss.h" +#include "mpi_vpss.h" +#include "mpi_vgs.h" + +#define MAX_FRM_WIDTH 2048 + +#define VALUE_BETWEEN(x,min,max) (((x)>=(min)) && ((x) <= (max))) + +char pFrameData[307200]; + +typedef struct hiDUMP_MEMBUF_S +{ + VB_BLK hBlock; + VB_POOL hPool; + HI_U32 u32PoolId; + + HI_U32 u32PhyAddr; + HI_U8* pVirAddr; + HI_S32 s32Mdev; +} DUMP_MEMBUF_S; + +static HI_S32 s_s32MemDev = -1; +static HI_U32 u32VpssDepthFlag = 0; +static HI_U32 u32SignalFlag = 0; + +static VPSS_GRP VpssGrp = 0; +static VPSS_CHN VpssChn = 0; +static HI_U32 u32OrigDepth = 0; +static VIDEO_FRAME_INFO_S stFrame; + +static VB_POOL hPool = VB_INVALID_POOLID; +static DUMP_MEMBUF_S stMem = {0}; +static VGS_HANDLE hHandle = -1; +static HI_U32 u32BlkSize = 0; + +static HI_CHAR* pUserPageAddr[2] = {HI_NULL,HI_NULL}; +static HI_U32 u32Size = 0; + +static FILE* pfd = HI_NULL; + +static int cw = 200; +static int ch = 200; + + +static int cXb = 0x00; +static int cYb = 0x00; + + +#define MEM_DEV_OPEN() \ + do {\ + if (s_s32MemDev <= 0)\ + {\ + s_s32MemDev = open("/dev/mem", O_CREAT|O_RDWR|O_SYNC);\ + if (s_s32MemDev < 0)\ + {\ + perror("Open dev/mem error");\ + return -1;\ + }\ + }\ + }while(0) + +#define MEM_DEV_CLOSE() \ + do {\ + HI_S32 s32Ret;\ + if (s_s32MemDev > 0)\ + {\ + s32Ret = close(s_s32MemDev);\ + if(HI_SUCCESS != s32Ret)\ + {\ + perror("Close mem/dev Fail");\ + return s32Ret;\ + }\ + s_s32MemDev = -1;\ + }\ + }while(0) + +/*When saving a file,sp420 will be denoted by p420 and sp422 will be denoted by p422 in the name of the file */ +#define PIXEL_FORMAT_YUV_SEMIPLANAR_420 0 +#define PIXEL_FORMAT_YUV_SEMIPLANAR_422 1 +#define PIXEL_FORMAT_YUV_400 2 +void sample_yuv_dump(VIDEO_FRAME_S* pVBuf, FILE* pfd) +{ + unsigned int w, h; + char* pVBufVirt_Y; + char* pVBufVirt_C; + char* pMemContent; + unsigned char TmpBuff[MAX_FRM_WIDTH]; //If this value is too small and the image is big, this memory may not be enough + HI_U32 phy_addr; + PIXEL_FORMAT_E enPixelFormat = pVBuf->enPixelFormat; + HI_U32 u32UvHeight;/*When the storage format is a planar format, this variable is used to keep the height of the UV component */ + printf("enPixelFormat = %d\n",enPixelFormat); + if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat) + { + printf("enPixelFormat1 = %d\n",enPixelFormat); + u32Size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 3 / 2; + u32UvHeight = pVBuf->u32Height / 2; + } + else if(PIXEL_FORMAT_YUV_SEMIPLANAR_422 == enPixelFormat) + { + printf("enPixelFormat2 = %d\n",enPixelFormat); + u32Size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 2; + u32UvHeight = pVBuf->u32Height; + } + else if(PIXEL_FORMAT_YUV_400 == enPixelFormat) + { + printf("enPixelFormat2 = %d\n",enPixelFormat); + u32Size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + u32UvHeight = pVBuf->u32Height; + } + + phy_addr = pVBuf->u32PhyAddr[0]; + + //printf("phy_addr:%x, size:%d\n", phy_addr, size); + pUserPageAddr[0] = (HI_CHAR*) HI_MPI_SYS_Mmap(phy_addr, u32Size); + if (HI_NULL == pUserPageAddr[0]) + { + return; + } + //printf("stride: %d,%d\n",pVBuf->u32Stride[0],pVBuf->u32Stride[1] ); + + pVBufVirt_Y = pUserPageAddr[0]; + pVBufVirt_C = pVBufVirt_Y + (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + + /* save Y ----------------------------------------------------------------*/ + fprintf(stderr, "saving......Y......"); + fflush(stderr); + for (h = 0; h < pVBuf->u32Height; h++) + { + pMemContent = pVBufVirt_Y + h * pVBuf->u32Stride[0]; + fwrite(pMemContent, pVBuf->u32Width, 1, pfd); + } + + if(PIXEL_FORMAT_YUV_400 != enPixelFormat) + { + fflush(pfd); + /* save U ----------------------------------------------------------------*/ + fprintf(stderr, "U......"); + fflush(stderr); + + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + pMemContent += 1; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + + /* save V ----------------------------------------------------------------*/ + fprintf(stderr, "V......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + } + fflush(pfd); + + fprintf(stderr, "done %d!\n", pVBuf->u32TimeRef); + fflush(stderr); + + HI_MPI_SYS_Munmap(pUserPageAddr[0], u32Size); + pUserPageAddr[0] = HI_NULL; +} + +//ÿ250msĶƬ + +#define N250 8 +#define EYE_OPEN 1 +#define EYE_CLOSE 2 +#define EYE_NULL 3 + +unsigned char eyeStatus[11*N250]; +unsigned char eyeStatus_bak[11*N250]; + +/* + գ״̬,״̬ + 111 111 222 222 222 111 111 111.... + 500ms - 750ms - 500ms + + + ¼ 1.5 - 2s + 111 111 222 222 222 222 222 222 222 111 111 111.... + + 500ms - 1750ms - 500ms + +*/ + +void PhotoCtl() +{ + int count = 0; + int i; + for(i=0;i< 7*N250;i++) + { + if(eyeStatus[i] == EYE_NULL)count ++; + } + //500msϵNULL ΪЧ + if(count > 2*N250) return; + + //жգ + + +} + +void AddCalcToList(unsigned char flag) +{ + memcpy(eyeStatus,eyeStatus_bak,sizeof(eyeStatus_bak)); + eyeStatus[0] = flag; + memcpy(eyeStatus+1,eyeStatus_bak,sizeof(eyeStatus_bak)-1); +} + + + +#define OPEN_Y_MIN 60 +#define OPEN_Y_MAX 80 + +#define CLOSE_Y_MIN 40 +#define CLOSE_Y_MIN 70 + + + +long get_timestamp() +{ + struct timeval tv_date; + + /* gettimeofday() could return an error, and should be tested. However, the + * only possible error, according to 'man', is EFAULT, which can not happen + * here, since tv is a local variable. */ + gettimeofday( &tv_date, NULL ); + return( (long ) tv_date.tv_sec * 1000000 + (long ) tv_date.tv_usec ); +} + +int nCalcCount = 0; +long preTime = 0; + +/*When saving a file,sp420 will be denoted by p420 and sp422 will be denoted by p422 in the name of the file */ +void calc_yuv_dump_y(VIDEO_FRAME_S* pVBuf) +{ + unsigned int h; + char* pVBufVirt_Y; + char* pVBufVirt_C; + char* pMemContent; + unsigned char TmpBuff[MAX_FRM_WIDTH]; //If this value is too small and the image is big, this memory may not be enough + HI_U32 phy_addr; + PIXEL_FORMAT_E enPixelFormat = pVBuf->enPixelFormat; + HI_U32 u32UvHeight;/*When the storage format is a planar format, this variable is used to keep the height of the UV component */ + + if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat) + { + u32Size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 3 / 2; + u32UvHeight = pVBuf->u32Height / 2; + } + else if(PIXEL_FORMAT_YUV_SEMIPLANAR_422 == enPixelFormat) + { + u32Size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 2; + u32UvHeight = pVBuf->u32Height; + } + else if(PIXEL_FORMAT_YUV_400 == enPixelFormat) + { + u32Size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + u32UvHeight = pVBuf->u32Height; + } + + phy_addr = pVBuf->u32PhyAddr[0]; + + //printf("phy_addr:%x, size:%d\n", phy_addr, size); + pUserPageAddr[0] = (HI_CHAR*) HI_MPI_SYS_Mmap(phy_addr, u32Size); + if (HI_NULL == pUserPageAddr[0]) + { + return; + } + //printf("stride: %d,%d\n",pVBuf->u32Stride[0],pVBuf->u32Stride[1] ); + + pVBufVirt_Y = pUserPageAddr[0]; + pVBufVirt_C = pVBufVirt_Y + (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + + //Get Y data. + //640*480ͼ. + //char chFrameTmp[640*480]; + int ex = 0 ; + if(pVBuf->u32Height == 480 && pVBuf->u32Width == 640) + { + //ȡYݣһһеcopy + for (h = 0; h < pVBuf->u32Height; h++) + { + pMemContent = pVBufVirt_Y + h * pVBuf->u32Stride[0]; + memcpy(pFrameData+ex, pMemContent,pVBuf->u32Width); + ex += pVBuf->u32Width; + } + + //ͼĵw=cw h=chYֵ + //Ȼȡƽֵ. + + int xcb = cXb; + int ycb = cYb; + + int xce = xcb + cw; + int yce = ycb + ch; + + int x =0,y = 0; + unsigned long avg = 0,index = 0; + for(x = xcb;x <= xce;x++) + for(y = ycb;y <= yce;y++) + { + avg += pFrameData[y*640+x]; + index ++; + } + avg = (avg/index); +#if 0 + nCalcCount ++; + if(nCalcCount%100 == 0) + { + nCalcCount = 0; + long nowTime = get_timestamp(); + printf("%d \n",nowTime - preTime); + preTime = nowTime; + printf("avg y :%d\n",avg); + } +#endif + printf("avg y :%d\n",avg); + //Calc Y avg.. + } + HI_MPI_SYS_Munmap(pUserPageAddr[0], u32Size); + pUserPageAddr[0] = HI_NULL; +} + + +HI_S32 VPSS_Restore(VPSS_GRP VpssGrp, VPSS_CHN VpssChn) +{ + + if(VB_INVALID_POOLID != stFrame.u32PoolId) + { + HI_MPI_VPSS_ReleaseChnFrame(VpssGrp, VpssChn, &stFrame); + stFrame.u32PoolId = VB_INVALID_POOLID; + } + if(-1 != hHandle) + { + HI_MPI_VGS_CancelJob(hHandle); + hHandle = -1; + } + if(HI_NULL != stMem.pVirAddr) + { + HI_MPI_SYS_Munmap((HI_VOID*)stMem.pVirAddr, u32BlkSize ); + stMem.u32PhyAddr = HI_NULL; + } + if(VB_INVALID_POOLID != stMem.hPool) + { + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + stMem.hPool = VB_INVALID_POOLID; + } + + if (VB_INVALID_POOLID != hPool) + { + HI_MPI_VB_DestroyPool( hPool ); + hPool = VB_INVALID_POOLID; + } + + if(HI_NULL != pUserPageAddr[0]) + { + HI_MPI_SYS_Munmap(pUserPageAddr[0], u32Size); + pUserPageAddr[0] = HI_NULL; + } + + if(u32VpssDepthFlag) + { + if (HI_MPI_VPSS_SetDepth(VpssGrp, VpssChn, u32OrigDepth) != HI_SUCCESS) + { + printf("set depth error!!!\n"); + } + u32VpssDepthFlag = 0; + } + MEM_DEV_CLOSE(); + return HI_SUCCESS; +} + +void VPSS_Chn_Dump_HandleSig(HI_S32 signo) +{ + if(u32SignalFlag) + { + exit(-1); + } + + if (SIGINT == signo || SIGTERM == signo) + { + u32SignalFlag++; + VPSS_Restore(VpssGrp, VpssChn); + u32SignalFlag--; + printf("\033[0;31mprogram termination abnormally!\033[0;39m\n"); + } + exit(-1); +} + + +HI_VOID* SAMPLE_MISC_VpssDump(VPSS_GRP Grp, VPSS_CHN Chn ) +{ + //HI_CHAR szYuvName[128]; + //HI_CHAR szPixFrm[10]; + HI_U32 u32Depth = 2; + HI_S32 s32MilliSec = 200; + HI_S32 s32Times = 10; + HI_BOOL bSendToVgs = HI_FALSE; + VIDEO_FRAME_INFO_S stFrmInfo; + VGS_TASK_ATTR_S stTask; + HI_U32 u32LumaSize = 0; + HI_U32 u32ChrmSize = 0; + HI_U32 u32PicLStride = 0; + HI_U32 u32PicCStride = 0; + HI_U32 u32Width = 0; + HI_U32 u32Height = 0; + HI_S32 i = 0; + HI_S32 s32Ret; + + if (HI_MPI_VPSS_GetDepth(Grp, Chn, &u32OrigDepth) != HI_SUCCESS) + { + printf("get depth error!!!\n"); + return (HI_VOID*) - 1; + } + + if (HI_MPI_VPSS_SetDepth(Grp, Chn, u32Depth) != HI_SUCCESS) + { + printf("set depth error!!!\n"); + VPSS_Restore(Grp, Chn); + return (HI_VOID*) - 1; + } + u32VpssDepthFlag = 1; + + + /* get frame */ + while (1) + { + if (HI_MPI_VPSS_GetChnFrame(Grp, Chn, &stFrame, s32MilliSec) != HI_SUCCESS) + { + printf("Get frame fail \n"); + usleep(1000); + continue; + } + + bSendToVgs = ((stFrame.stVFrame.enCompressMode > 0) || (stFrame.stVFrame.enVideoFormat > 0)); + + if (bSendToVgs) + { + u32PicLStride = stFrame.stVFrame.u32Stride[0]; + u32PicCStride = stFrame.stVFrame.u32Stride[0]; + u32LumaSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height; + u32Width = stFrame.stVFrame.u32Width; + u32Height = stFrame.stVFrame.u32Height; + + if(PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat) + { + u32BlkSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height * 3 >> 1; + u32ChrmSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height >> 2; + } + else if(PIXEL_FORMAT_YUV_SEMIPLANAR_422 == stFrame.stVFrame.enPixelFormat) + { + u32BlkSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height * 2; + u32ChrmSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height >> 1; + } + else if(PIXEL_FORMAT_YUV_400 == stFrame.stVFrame.enPixelFormat) + { + u32BlkSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height; + u32ChrmSize = 0; + } + else + { + printf("Unsupported pixelformat %d\n",stFrame.stVFrame.enPixelFormat); + VPSS_Restore(Grp, Chn); + return (HI_VOID*) - 1; + } + + /*create comm vb pool*/ + hPool = HI_MPI_VB_CreatePool( u32BlkSize, 1, HI_NULL); + if (hPool == VB_INVALID_POOLID) + { + printf("HI_MPI_VB_CreatePool failed! \n"); + VPSS_Restore(Grp, Chn); + return (HI_VOID*) - 1; + } + stMem.hPool = hPool; + + while ((stMem.hBlock = HI_MPI_VB_GetBlock(stMem.hPool, u32BlkSize, HI_NULL)) == VB_INVALID_HANDLE) + { + ; + } + stMem.u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(stMem.hBlock); + + stMem.pVirAddr = (HI_U8*) HI_MPI_SYS_Mmap( stMem.u32PhyAddr, u32BlkSize ); + if (stMem.pVirAddr == HI_NULL) + { + printf("Mem dev may not open\n"); + VPSS_Restore(Grp, Chn); + return (HI_VOID*) - 1; + } + + memset(&stFrmInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S)); + stFrmInfo.stVFrame.u32PhyAddr[0] = stMem.u32PhyAddr; + stFrmInfo.stVFrame.u32PhyAddr[1] = stFrmInfo.stVFrame.u32PhyAddr[0] + u32LumaSize; + stFrmInfo.stVFrame.u32PhyAddr[2] = stFrmInfo.stVFrame.u32PhyAddr[1] + u32ChrmSize; + + stFrmInfo.stVFrame.pVirAddr[0] = stMem.pVirAddr; + stFrmInfo.stVFrame.pVirAddr[1] = (HI_U8*) stFrmInfo.stVFrame.pVirAddr[0] + u32LumaSize; + stFrmInfo.stVFrame.pVirAddr[2] = (HI_U8*) stFrmInfo.stVFrame.pVirAddr[1] + u32ChrmSize; + + stFrmInfo.stVFrame.u32Width = u32Width; + stFrmInfo.stVFrame.u32Height = u32Height; + stFrmInfo.stVFrame.u32Stride[0] = u32PicLStride; + stFrmInfo.stVFrame.u32Stride[1] = u32PicCStride; + stFrmInfo.stVFrame.u32Stride[2] = u32PicCStride; + + stFrmInfo.stVFrame.enCompressMode = COMPRESS_MODE_NONE; + stFrmInfo.stVFrame.enPixelFormat = stFrame.stVFrame.enPixelFormat; + stFrmInfo.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR; + + stFrmInfo.stVFrame.u64pts = (i * 40); + stFrmInfo.stVFrame.u32TimeRef = (i * 2); + + stFrmInfo.u32PoolId = hPool; + + s32Ret = HI_MPI_VGS_BeginJob(&hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_BeginJob failed\n"); + hHandle = -1; + VPSS_Restore(Grp, Chn); + return (HI_VOID*) - 1; + } + memcpy(&stTask.stImgIn, &stFrame.stVFrame, sizeof(VIDEO_FRAME_INFO_S)); + memcpy(&stTask.stImgOut , &stFrmInfo, sizeof(VIDEO_FRAME_INFO_S)); + s32Ret = HI_MPI_VGS_AddScaleTask(hHandle, &stTask); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_AddScaleTask failed\n"); + VPSS_Restore(Grp, Chn); + return (HI_VOID*) - 1; + } + + s32Ret = HI_MPI_VGS_EndJob(hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_EndJob failed\n"); + VPSS_Restore(Grp, Chn); + return (HI_VOID*) - 1; + } + hHandle = -1; + /* save VO frame to file */ + //sample_yuv_dump(&stFrmInfo.stVFrame, pfd); + calc_yuv_dump_y(&stFrmInfo.stVFrame); + + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + + stMem.hPool = VB_INVALID_POOLID; + hHandle = -1; + if(HI_NULL != stMem.pVirAddr) + { + HI_MPI_SYS_Munmap((HI_VOID*)stMem.pVirAddr, u32BlkSize ); + stMem.u32PhyAddr = HI_NULL; + } + if (hPool != VB_INVALID_POOLID) + { + HI_MPI_VB_DestroyPool( hPool ); + hPool = VB_INVALID_POOLID; + } + + } + else + { + //sample_yuv_dump(&stFrame.stVFrame, pfd); + calc_yuv_dump_y(&stFrmInfo.stVFrame); + } + + //printf("Get VpssGrp %d frame %d!!\n", Grp, u32Cnt); + /* release frame after using */ + HI_MPI_VPSS_ReleaseChnFrame(Grp, Chn, &stFrame); + stFrame.u32PoolId = VB_INVALID_POOLID; + } + VPSS_Restore(Grp, Chn); + return (HI_VOID*)0; +} + +HI_S32 main(int argc, char* argv[]) +{ +#if 0 + if (argc == 3) + { + cw = atoi(argv[1]); + ch = atoi(argv[2]); + } + if( cw < 0 || cw > 640) cw = 200; + if( ch < 0 || ch > 480) ch = 200; + + printf("calc w = %d,h = %d\n",cw,ch); +#endif + + if (argc == 3) + { + cXb = atoi(argv[1]); + cXb = atoi(argv[2]); + } + + if(argc == 5) + { + cXb = atoi(argv[1]); + cXb = atoi(argv[2]); + cw = atoi(argv[3]); + ch = atoi(argv[4]); + } + + printf("calc point(%d,%d),w = %d,h = %d\n",cXb,cYb,cw,ch); + + + VpssGrp = 0; + VpssChn = 1; + u32VpssDepthFlag = 0; + u32SignalFlag = 0; + pUserPageAddr[0] = HI_NULL; + stFrame.u32PoolId = VB_INVALID_POOLID; + u32OrigDepth = 0; + hPool = VB_INVALID_POOLID; + hHandle = -1; + u32BlkSize = 0; + u32Size = 0; + //pfd = HI_NULL; + + signal(SIGINT, VPSS_Chn_Dump_HandleSig); + signal(SIGTERM, VPSS_Chn_Dump_HandleSig); + + + MEM_DEV_OPEN(); + + SAMPLE_MISC_VpssDump(VpssGrp, VpssChn); + + MEM_DEV_CLOSE(); + + return HI_SUCCESS; +} diff --git a/device/mpp/sample/hisi_rtsp_demo-master/geiflash.sh b/device/mpp/sample/hisi_rtsp_demo-master/geiflash.sh new file mode 100644 index 0000000..98dac89 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/geiflash.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +Partion="/dev/mtdblock0 /dev/mtdblock1 /dev/mtdblock2" +IMGFILE=16M.bin +if [ -e $IMGFILE ]; then + echo "Delete the old Image file" + rm $IMGFILE +fi + +for child in $Partion +do + if [ -e $child ]; then + echo "Append Partion $child" + cat $child >> $IMGFILE + fi +done + +if [ -e $IMGFILE ]; then + echo "Check the Iamge file" + echo `ls -alh $IMGFILE` +fi diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/acodec.h b/device/mpp/sample/hisi_rtsp_demo-master/include/acodec.h new file mode 100644 index 0000000..044f0c7 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/acodec.h @@ -0,0 +1,244 @@ +#ifndef _ACODEC_H_ +#define _ACODEC_H_ + +#define IOC_TYPE_ACODEC 'A' + +typedef enum hiACODEC_FS_E { + ACODEC_FS_48000 = 0x1a, + ACODEC_FS_24000 = 0x19, + ACODEC_FS_12000 = 0x18, + + ACODEC_FS_44100 = 0x1a, + ACODEC_FS_22050 = 0x19, + ACODEC_FS_11025 = 0x18, + + ACODEC_FS_32000 = 0x1a, + ACODEC_FS_16000 = 0x19, + ACODEC_FS_8000 = 0x18, + + ACODEC_FS_BUTT = 0x1b, +} ACODEC_FS_E; + +typedef enum hiACODEC_MIXER_E { + /*select IN or IN_D*/ + ACODEC_MIXER_IN = 0x3, + ACODEC_MIXER_IN_D = 0x4, + ACODEC_MIXER_BUTT, +} ACODEC_MIXER_E; + + +typedef struct { + /*volume control, 0x00~0x7e, 0x7F:mute*/ + unsigned int vol_ctrl; + /*adc/dac mute control, 1:mute, 0:unmute*/ + unsigned int vol_ctrl_mute; +} ACODEC_VOL_CTRL; + +typedef enum hiACODEC_IOCTL_E { + IOC_NR_SOFT_RESET_CTRL = 0x0, + IOC_NR_POWER_DOWN_CTRL, + /****************************************************************************************** + The input volume range is [-87, +86]. Both the analog gain and digital gain are adjusted. + A larger value indicates higher volume. + For example, the value 86 indicates the maximum volume of 86 dB, + and the value -87 indicates the minimum volume (muted status). + The volume adjustment takes effect simultaneously in the audio-left and audio-right channels. + The recommended volume range is [+10, +56]. + Within this range, the noises are lowest because only the analog gain is adjusted, + and the voice quality can be guaranteed. + *******************************************************************************************/ + IOC_NR_SET_INPUT_VOL , + /******************************************************************************************* + The output volume range is [-121, +6]. A larger value indicates higher volume. + For example, the value 6 indicates the maximum volume of 6 dB, + and the value -121 indicates the minimum volume (muted status). + The volume adjustment takes effect simultaneously in the audio-left and audio-right channels. + The digital gain is adjusted by calling this interface. + It is recommended that a small value is assigned to avoid noises. + *******************************************************************************************/ + IOC_NR_SET_OUTPUT_VOL, + IOC_NR_GET_INPUT_VOL, + IOC_NR_GET_OUTPUT_VOL, + /***********************/ + IOC_NR_SET_I2S1_FS, + IOC_NR_SET_MIXER_MIC, + IOC_NR_SEL_DAC_CLK, + IOC_NR_SEL_ANA_MCLK, + IOC_NR_SET_GAIN_MICL, + IOC_NR_SET_GAIN_MICR, + IOC_NR_SET_DACL_VOL, + IOC_NR_SET_DACR_VOL, + IOC_NR_SET_ADCL_VOL, + IOC_NR_SET_ADCR_VOL, + IOC_NR_SET_MICL_MUTE, + IOC_NR_SET_MICR_MUTE, + IOC_NR_SET_DACL_MUTE, + IOC_NR_SET_DACR_MUTE, + IOC_NR_DAC_SOFT_MUTE, + IOC_NR_DAC_SOFT_UNMUTE, + + IOC_NR_GET_GAIN_MICL, + IOC_NR_GET_GAIN_MICR, + IOC_NR_GET_DACL_VOL, + IOC_NR_GET_DACR_VOL, + IOC_NR_GET_ADCL_VOL, + IOC_NR_GET_ADCR_VOL, + + IOC_NR_SET_PD_DACL, + IOC_NR_SET_PD_DACR, + IOC_NR_SET_PD_ADCL, + IOC_NR_SET_PD_ADCR, + + IOC_NR_DACL_SEL_TRACK, + IOC_NR_DACR_SEL_TRACK, + IOC_NR_ADCL_SEL_TRACK, + IOC_NR_ADCR_SEL_TRACK, + IOC_NR_SET_DAC_DE_EMPHASIS, + IOC_NR_SET_ADC_HP_FILTER, + IOC_NR_DAC_POP_FREE, + IOC_NR_DAC_SOFT_MUTE_RATE, + + IOC_NR_DAC_SEL_I2S, + IOC_NR_ADC_SEL_I2S, + IOC_NR_SET_I2S1_DATAWIDTH, + IOC_NR_SET_I2S2_DATAWIDTH, + IOC_NR_SET_I2S2_FS, + IOC_NR_SET_DACR2DACL_VOL, + IOC_NR_SET_DACL2DACR_VOL, + IOC_NR_SET_ADCR2DACL_VOL, + IOC_NR_SET_ADCL2DACR_VOL, + IOC_NR_SET_ADCR2DACR_VOL, + IOC_NR_SET_ADCL2DACL_VOL, +} ACODEC_IOCTL_E; + +/*reset the audio code to the default config*/ +#define ACODEC_SOFT_RESET_CTRL \ + _IO(IOC_TYPE_ACODEC, IOC_NR_SOFT_RESET_CTRL) +#define ACODEC_POWER_DOWN_CTRL \ + _IO(IOC_TYPE_ACODEC, IOC_NR_POWER_DOWN_CTRL) +/*ACODEC_FS_E*/ +#define ACODEC_SET_I2S1_FS \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_I2S1_FS, unsigned int) +/*select the micpga's input,micin or linein, (ACODEC_MIXER_E)*/ +#define ACODEC_SET_MIXER_MIC \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_MIXER_MIC, unsigned int) +/*analog part input volume control(left channel 0~0x1f)*/ +#define ACODEC_SET_GAIN_MICL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_GAIN_MICL, unsigned int) +/*analog part input volume control(right channel 0~0x1f)*/ +#define ACODEC_SET_GAIN_MICR \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_GAIN_MICR, unsigned int) +/*Output volume control(left channel) ACODEC_VOL_CTRL*/ +#define ACODEC_SET_DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACL_VOL, ACODEC_VOL_CTRL) +/*Output volume control(right channel) ACODEC_VOL_CTRL*/ +#define ACODEC_SET_DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACR_VOL, ACODEC_VOL_CTRL) +/*Input volume control(left channel) ACODEC_VOL_CTRL*/ +#define ACODEC_SET_ADCL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCL_VOL, ACODEC_VOL_CTRL) +/*Input volume control(right channel) ACODEC_VOL_CTRL*/ +#define ACODEC_SET_ADCR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCR_VOL, ACODEC_VOL_CTRL) +/*Input mute control(left channel), 1:mute, 0:unmute*/ +#define ACODEC_SET_MICL_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_MICL_MUTE, unsigned int) +/*Input mute control(right channel), 1:mute, 0:unmute*/ +#define ACODEC_SET_MICR_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_MICR_MUTE, unsigned int) +/*Output mute control(left channel), 1:mute, 0:unmute*/ +#define ACODEC_SET_DACL_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACL_MUTE, unsigned int) +/*Output mute control(right channel), 1:mute, 0:unmute*/ +#define ACODEC_SET_DACR_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACR_MUTE, unsigned int) +/*Audio Fade Out Control, 1:on, 0:off*/ +#define ACODEC_DAC_SOFT_MUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_SOFT_MUTE, unsigned int) +/*Audio Fade In Control, 1:on, 0:off*/ +#define ACODEC_DAC_SOFT_UNMUTE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_SOFT_UNMUTE, unsigned int) + +#define ACODEC_GET_GAIN_MICL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_GAIN_MICL, unsigned int) +#define ACODEC_GET_GAIN_MICR \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_GAIN_MICR, unsigned int) +#define ACODEC_GET_DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_DACL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_GET_DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_DACR_VOL, ACODEC_VOL_CTRL) +#define ACODEC_GET_ADCL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_ADCL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_GET_ADCR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_ADCR_VOL, ACODEC_VOL_CTRL) + +/*set adcl power, 0: power up, 1: power down*/ +#define ACODEC_SET_PD_DACL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_PD_DACL, unsigned int) +/*set adcr power, 0: power up, 1: power down*/ +#define ACODEC_SET_PD_DACR \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_PD_DACR, unsigned int) +/*set adcl power, 0: power up, 1: power down*/ +#define ACODEC_SET_PD_ADCL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_PD_ADCL, unsigned int) +/*set adcr power, 0: power up, 1: power down*/ +#define ACODEC_SET_PD_ADCR \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_PD_ADCR, unsigned int) + +/* Don't need to set, the driver will set a default value */ +/*clock of dac and adc is reverse or obverse*/ +#define ACODEC_SEL_DAC_CLK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SEL_DAC_CLK, unsigned int) +/*clock of analog part and digital part is reverse or obverse*/ +#define ACODEC_SEL_ANA_MCLK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SEL_ANA_MCLK, unsigned int) +#define ACODEC_DACL_SEL_TRACK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DACL_SEL_TRACK, unsigned int) +#define ACODEC_DACR_SEL_TRACK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DACR_SEL_TRACK, unsigned int) +#define ACODEC_ADCL_SEL_TRACK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_ADCL_SEL_TRACK, unsigned int) +#define ACODEC_ADCR_SEL_TRACK \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_ADCR_SEL_TRACK, unsigned int) +#define ACODEC_SET_DAC_DE_EMPHASIS \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DAC_DE_EMPHASIS, unsigned int) +#define ACODEC_SET_ADC_HP_FILTER \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADC_HP_FILTER, unsigned int) +#define ACODEC_DAC_POP_FREE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_POP_FREE, unsigned int) +#define ACODEC_DAC_SOFT_MUTE_RATE \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_SOFT_MUTE_RATE, unsigned int) +#define ACODEC_SET_INPUT_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_INPUT_VOL, unsigned int) +#define ACODEC_SET_OUTPUT_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_OUTPUT_VOL, unsigned int) +#define ACODEC_GET_INPUT_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_INPUT_VOL, unsigned int) +#define ACODEC_GET_OUTPUT_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_GET_OUTPUT_VOL, unsigned int) + +/* Reserved ioctl cmd */ +#define ACODEC_DAC_SEL_I2S \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_DAC_SEL_I2S, unsigned int) +#define ACODEC_ADC_SEL_I2S \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_ADC_SEL_I2S, unsigned int) +#define ACODEC_SET_I2S1_DATAWIDTH \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_I2S1_DATAWIDTH, unsigned int) +#define ACODEC_SET_I2S2_DATAWIDTH \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_I2S2_DATAWIDTH, unsigned int) +#define ACODEC_SET_I2S2_FS \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_I2S2_FS, unsigned int) +#define ACODEC_SET_DACR2DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACR2DACL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_DACL2DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_DACL2DACR_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_ADCL2DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCL2DACL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_ADCR2DACL_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCR2DACL_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_ADCL2DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCL2DACR_VOL, ACODEC_VOL_CTRL) +#define ACODEC_SET_ADCR2DACR_VOL \ + _IOWR(IOC_TYPE_ACODEC, IOC_NR_SET_ADCR2DACR_VOL, ACODEC_VOL_CTRL) + +#endif /* End of #ifndef _ACODEC_H_ */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/dictionary.h b/device/mpp/sample/hisi_rtsp_demo-master/include/dictionary.h new file mode 100644 index 0000000..58e9569 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/dictionary.h @@ -0,0 +1,276 @@ + +/*-------------------------------------------------------------------------*/ +/** + @file dictionary.h + @author N. Devillard + @date Aug 2000 + @version + @brief Implements a dictionary for string variables. + + This module implements a simple dictionary object, i.e. a list + of string/string associations. This object is useful to store e.g. + informations retrieved from a configuration file (ini files). +*/ +/*--------------------------------------------------------------------------*/ + +/* + + + + +*/ + +#ifndef _DICTIONARY_H_ +#define _DICTIONARY_H_ + +/*--------------------------------------------------------------------------- + Includes + ---------------------------------------------------------------------------*/ + +#include +#include +#include +#if HI_OS_TYPE == HI_OS_LINUX +#include +#endif + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + + +/*--------------------------------------------------------------------------- + New types + ---------------------------------------------------------------------------*/ + + +/*-------------------------------------------------------------------------*/ +/** + @brief Dictionary object + + This object contains a list of string/string associations. Each + association is identified by a unique string key. Looking up values + in the dictionary is speeded up by the use of a (hopefully collision-free) + hash function. + */ +/*-------------------------------------------------------------------------*/ +/** "CL_" is comment line's the head of name*/ +#define CL_NSBC 1 /** 1,No space before comment; example:|;comment*/ +#define CL_AKLR 2 /** 2,At the key line's right; example:|key = value ;commnet*/ +#define CL_CLINE 3 /** 3,Line of commnet which at the key line's behind; example;| ;comment*/ +#define CL_SLINE 4 /** 4,Space Line; example;|\r\n*/ + +typedef struct _dictionary_ { + int n ; /** Number of entries in dictionary */ + int size ; /** Storage size of entries*/ + char ** val ; /** List of string values */ + char ** key ; /** List of string keys */ + unsigned * hash ; /** List of hash values for keys */ + + /*2006/03/11 blair add : save comment and space Line*/ + int commN; /** Number of comment in dictionary */ + int commSize; /** Storage size of comment*/ + char ** comment; /** List of string comment and space Line*/ + unsigned * commHash; /** List of hash values for keys ,signed the comment line is the key has the comment */ + unsigned char * commPlace; /** remember the comment at where the key keyhash signed. + 0,the line has no comment; + 1,no space before comment; + 2,at the key line's right; + 3,Line of commnet or at the key line's behind; + 4,Space Line;*/ +} dictionary ; + + +/*--------------------------------------------------------------------------- + Function prototypes + ---------------------------------------------------------------------------*/ +void * mem_double(void * ptr, int size); +/*-------------------------------------------------------------------------*/ +/** + @brief Compute the hash key for a string. + @param key Character string to use for key. + @return 1 unsigned int on at least 32 bits. + + This hash function has been taken from an Article in Dr Dobbs Journal. + This is normally a collision-free function, distributing keys evenly. + The key is stored anyway in the struct so that collision can be avoided + by comparing the key itself in last resort. + */ +/*--------------------------------------------------------------------------*/ +unsigned dictionary_hash(const char * key); + +/*-------------------------------------------------------------------------*/ +/** + @brief Create a new dictionary object. + @param size Optional initial size of the dictionary. + @return 1 newly allocated dictionary objet. + + This function allocates a new dictionary object of given size and returns + it. If you do not know in advance (roughly) the number of entries in the + dictionary, give size=0. + */ +/*--------------------------------------------------------------------------*/ +dictionary * dictionary_new(int size); + +/*-------------------------------------------------------------------------*/ +/** + @brief Delete a dictionary object + @param d dictionary object to deallocate. + @return void + + Deallocate a dictionary object and all memory associated to it. + */ +/*--------------------------------------------------------------------------*/ +void dictionary_del(dictionary * vd); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get a value from a dictionary. + @param d dictionary object to search. + @param key Key to look for in the dictionary. + @param def Default value to return if key not found. + @return 1 pointer to internally allocated character string. + + This function locates a key in a dictionary and returns a pointer to its + value, or the passed 'def' pointer if no such key can be found in + dictionary. The returned character pointer points to data internal to the + dictionary object, you should not try to free it or modify it. + */ +/*--------------------------------------------------------------------------*/ +char * dictionary_get(const dictionary * d, const char * key, char * def); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Get a value from a dictionary, as a char. + @param d dictionary object to search. + @param key Key to look for in the dictionary. + @param def Default value for the key if not found. + @return char + + This function locates a key in a dictionary using dictionary_get, + and returns the first char of the found string. + */ +/*--------------------------------------------------------------------------*/ +char dictionary_getchar(const dictionary * d, const char * key, const char def) ; + +/*-------------------------------------------------------------------------*/ +/** + @brief Get a value from a dictionary, as an int. + @param d dictionary object to search. + @param key Key to look for in the dictionary. + @param def Default value for the key if not found. + @return int + + This function locates a key in a dictionary using dictionary_get, + and applies atoi on it to return an int. If the value cannot be found + in the dictionary, the default is returned. + */ +/*--------------------------------------------------------------------------*/ +int dictionary_getint(const dictionary * d, const char * key, const int def); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get a value from a dictionary, as a double. + @param d dictionary object to search. + @param key Key to look for in the dictionary. + @param def Default value for the key if not found. + @return double + + This function locates a key in a dictionary using dictionary_get, + and applies atof on it to return a double. If the value cannot be found + in the dictionary, the default is returned. + */ +/*--------------------------------------------------------------------------*/ +double dictionary_getdouble(const dictionary * d, const char * key, const double def); + +/*-------------------------------------------------------------------------*/ +/** + @brief Set a value in a dictionary. + @param d dictionary object to modify. + @param key Key to modify or add. + @param val Value to add. + @return void + + If the given key is found in the dictionary, the associated value is + replaced by the provided one. If the key cannot be found in the + dictionary, it is added to it. + + It is Ok to provide a NULL value for val, but NULL values for the dictionary + or the key are considered as errors: the function will return immediately + in such a case. + + Notice that if you dictionary_set a variable to NULL, a call to + dictionary_get will return a NULL value: the variable will be found, and + its value (NULL) is returned. In other words, setting the variable + content to NULL is equivalent to deleting the variable from the + dictionary. It is not possible (in this implementation) to have a key in + the dictionary without value. + */ +/*--------------------------------------------------------------------------*/ +int dictionary_set(const dictionary * vd, const char * key, const char * val); +int dictionary_add(dictionary * d, const char * key, const char * val); +/*-------------------------------------------------------------------------*/ +/** + @brief Delete a key in a dictionary + @param d dictionary object to modify. + @param key Key to remove. + @return void + + This function deletes a key in a dictionary. Nothing is done if the + key cannot be found. + */ +/*--------------------------------------------------------------------------*/ +void dictionary_unset(dictionary * d, const char * key); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Set a key in a dictionary, providing an int. + @param d Dictionary to update. + @param key Key to modify or add + @param val Integer value to store (will be stored as a string). + @return void + + This helper function calls dictionary_set() with the provided integer + converted to a string using %d. + */ +/*--------------------------------------------------------------------------*/ +int dictionary_setint(const dictionary * d, const char * key, const int val); + +/*-------------------------------------------------------------------------*/ +/** + @brief Set a key in a dictionary, providing a double. + @param d Dictionary to update. + @param key Key to modify or add + @param val Double value to store (will be stored as a string). + @return void + + This helper function calls dictionary_set() with the provided double + converted to a string using %g. + */ +/*--------------------------------------------------------------------------*/ +int dictionary_setdouble(const dictionary * d, const char * key, const double val); + +/*-------------------------------------------------------------------------*/ +/** + @brief Dump a dictionary to an opened file pointer. + @param d Dictionary to dump + @param f Opened file pointer. + @return void + + Dumps a dictionary onto an opened file pointer. Key pairs are printed out + as @c [Key]=[Value], one per line. It is Ok to provide stdout or stderr as + output file pointers. + */ +/*--------------------------------------------------------------------------*/ +void dictionary_dump(dictionary * d, FILE * out); +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_ae_comm.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_ae_comm.h new file mode 100644 index 0000000..959c25d --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_ae_comm.h @@ -0,0 +1,181 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_ae_comm.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/18 + Description : + History : + 1.Date : 2012/12/18 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __HI_AE_COMM_H__ +#define __HI_AE_COMM_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define HI_AE_LIB_NAME "hisi_ae_lib" + +/************************** ae ctrl cmd **************************************/ +typedef enum hiAE_CTRL_CMD_E +{ + AE_DEBUG_ATTR_SET, + AE_DEBUG_ATTR_GET, + + AE_CTRL_BUTT, +} AE_CTRL_CMD_E; + +typedef struct hiAE_DBG_ATTR_S +{ + HI_U32 u32MaxIntTime; + HI_U32 u32MinIntTime; + HI_U32 u32MaxAgain; + HI_U32 u32MinAgain; + HI_U32 u32MaxDgain; + HI_U32 u32MinDgain; + HI_U32 u32MaxIspDgain; + HI_U32 u32MinIspDgain; + HI_U32 u32MaxSysGain; + HI_U32 u32MinSysGain; + HI_U32 u32Compensation; + HI_U32 u32EVBias; + HI_BOOL bManualExposureEn; + HI_BOOL bManualTimeEn; + HI_BOOL bManualAgainEn; + HI_BOOL bManualDgainEn; + HI_BOOL bManualIspDgainEn; + HI_U32 u32ManualExposureLines; + HI_U32 u32ManualAgain; + HI_U32 u32ManualDgain; + HI_U32 u32ManualIspDgain; + HI_U32 au32AeWeights[255]; +}AE_DBG_ATTR_S; + +typedef struct hiAE_DBG_STATUS_S +{ + HI_U32 u32FrmNumBgn; + HI_U32 u32FullLines; + HI_U32 u32IntTime; + HI_U32 u32Again; + HI_U32 u32Dgain; + HI_U32 u32IspDgain; + HI_U32 u32IrisFNOLin; + HI_U64 u64Exposure; + HI_U32 u32Increment; + HI_S32 s32HistError; + HI_S32 s32HistOriAverage; + HI_S32 s32LumaOffset; + HI_U32 u32Iso; +}AE_DBG_STATUS_S; + +/************************** sensor's interface to ae *********************/ + +/* eg: 0.35db, enAccuType=AE_ACCURACY_DB, f32Accuracy=0.35 +* and the multiply of 0.35db is power(10, (0.35/20)) +* eg: 1/16, 2/16, 3/16 multiplies, enAccuType=AE_ACCURACY_LINEAR, f32Accuracy=0.0625 +* eg: 1,2,4,8,16 multiplies, enAccuType=AE_ACCURACY_DB, f32Accuracy=6 +*/ +typedef enum hiAE_ACCURACY_E +{ + AE_ACCURACY_DB = 0, + AE_ACCURACY_LINEAR, + AE_ACCURACY_TABLE, + + AE_ACCURACY_BUTT, +} AE_ACCURACY_E; + +typedef struct hiAE_ACCURACY_S +{ + AE_ACCURACY_E enAccuType; + float f32Accuracy; + float f32Offset; +} AE_ACCURACY_S; + +typedef struct hiAE_SENSOR_DEFAULT_S +{ + HI_U8 au8HistThresh[4]; + HI_U8 u8AeCompensation; + + HI_U32 u32LinesPer500ms; + HI_U32 u32FlickerFreq; + HI_FLOAT f32Fps; + HI_U32 u32InitExposure; + + HI_U32 u32FullLinesStd; + HI_U32 u32MaxIntTime; /* unit is line */ + HI_U32 u32MinIntTime; + HI_U32 u32MaxIntTimeTarget; + HI_U32 u32MinIntTimeTarget; + AE_ACCURACY_S stIntTimeAccu; + + HI_U32 u32MaxAgain; + HI_U32 u32MinAgain; + HI_U32 u32MaxAgainTarget; + HI_U32 u32MinAgainTarget; + AE_ACCURACY_S stAgainAccu; + + HI_U32 u32MaxDgain; + HI_U32 u32MinDgain; + HI_U32 u32MaxDgainTarget; + HI_U32 u32MinDgainTarget; + AE_ACCURACY_S stDgainAccu; + + HI_U32 u32MaxISPDgainTarget; + HI_U32 u32MinISPDgainTarget; + HI_U32 u32ISPDgainShift; + + ISP_AE_ROUTE_S stAERouteAttr; + HI_BOOL bAERouteExValid; + ISP_AE_ROUTE_EX_S stAERouteAttrEx; + + HI_U8 u16ManRatioEnable; + HI_U32 u32Ratio; + + ISP_IRIS_TYPE_E enIrisType; + ISP_PIRIS_ATTR_S stPirisAttr; +} AE_SENSOR_DEFAULT_S; + + +typedef struct hiAE_SENSOR_EXP_FUNC_S +{ + HI_S32(*pfn_cmos_get_ae_default)(AE_SENSOR_DEFAULT_S *pstAeSnsDft); + + /* the function of sensor set fps */ + HI_VOID(*pfn_cmos_fps_set)(HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft); + HI_VOID(*pfn_cmos_slow_framerate_set)(HI_U32 u32FullLines, AE_SENSOR_DEFAULT_S *pstAeSnsDft); + + /* while isp notify ae to update sensor regs, ae call these funcs. */ + HI_VOID(*pfn_cmos_inttime_update)(HI_U32 u32IntTime); + HI_VOID(*pfn_cmos_gains_update)(HI_U32 u32Again, HI_U32 u32Dgain); + + HI_VOID (*pfn_cmos_again_calc_table)(HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb); + HI_VOID (*pfn_cmos_dgain_calc_table)(HI_U32 *pu32DgainLin, HI_U32 *pu32DgainDb); + + HI_VOID (*pfn_cmos_get_inttime_max)(HI_U32 u32Ratio, HI_U32 *pu32IntTimeMax); + +} AE_SENSOR_EXP_FUNC_S; + +typedef struct hiAE_SENSOR_REGISTER_S +{ + AE_SENSOR_EXP_FUNC_S stSnsExp; +} AE_SENSOR_REGISTER_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_af_comm.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_af_comm.h new file mode 100644 index 0000000..a2d0686 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_af_comm.h @@ -0,0 +1,36 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_af_comm.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/20 + Description : + History : + 1.Date : 2012/12/20 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __HI_AF_COMM_H__ +#define __HI_AF_COMM_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define HI_AF_LIB_NAME "hisi_af_lib" + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_awb_comm.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_awb_comm.h new file mode 100644 index 0000000..54d3967 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_awb_comm.h @@ -0,0 +1,169 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_awb_comm.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/19 + Description : + History : + 1.Date : 2012/12/19 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __HI_AWB_COMM_H__ +#define __HI_AWB_COMM_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define HI_AWB_LIB_NAME "hisi_awb_lib" + +/************************** isp ctrl cmd *************************************/ +typedef enum hiAWB_CTRL_CMD_E +{ + AWB_SATURATION_SET, + AWB_SATURATION_GET, + + AWB_DEBUG_ATTR_SET, + AWB_DEBUG_ATTR_GET, + + AWB_CTRL_BUTT, +} AWB_CTRL_CMD_E; + +typedef struct hiAWB_DBG_ATTR_S +{ + HI_U16 u16WhiteLevel; + HI_U16 u16BlackLevel; + HI_U16 u16CrMax; + HI_U16 u16CrMin; + HI_U16 u16CbMax; + HI_U16 u16CbMin; + HI_U16 u16CrHigh; + HI_U16 u16CrLow; + HI_U16 u16CbHigh; + HI_U16 u16CbLow; + HI_U16 u16RawWhiteLevel; + HI_U16 u16RawBlackLevel; + HI_U16 u16RawCrMax; + HI_U16 u16RawCrMin; + HI_U16 u16RawCbMax; + HI_U16 u16RawCbMin; + HI_U16 u16RawCrHigh; + HI_U16 u16RawCrLow; + HI_U16 u16RawCbHigh; + HI_U16 u16RawCbLow; + + HI_U16 u16WDRMode; + HI_U16 u16Enable; + HI_U16 u16ManualEnable; + HI_U16 u16Zone; + HI_U16 u16HighTemp; + HI_U16 u16LowTemp; + HI_U16 u16RefTemp; + HI_U16 u16RgainBase; + HI_U16 u16GgainBase; + HI_U16 u16BgainBase; + HI_S32 s32p1; + HI_S32 s32p2; + HI_S32 s32q; + HI_S32 s32a; + HI_S32 s32c; + + HI_U16 u16ManSatEnable; + HI_U16 u16SatTarget; +} AWB_DBG_ATTR_S; + +typedef struct hiAWB_ZONE_DBG_S +{ + HI_U16 u16Sum; + HI_U16 u16Rg; + HI_U16 u16Bg; + HI_U16 u16CountAll; + HI_U16 u16CountMin; + HI_U16 u16CountMax; + HI_U16 u16RawRAvg; + HI_U16 u16RawGAvg; + HI_U16 u16RawBAvg; + HI_U16 u16TK; + HI_U16 u16Weight; + HI_S16 s16Shift; +}AWB_ZONE_DBG_S; + +typedef struct hiAWB_DBG_STATUS_S +{ + HI_U32 u32FrmNumBgn; + HI_U32 u32GlobalSum; + HI_U16 u16GlobalRgSta; + HI_U16 u16GlobalBgSta; + HI_U16 u16GlobalCountAll; + HI_U16 u16GlobalCountMin; + HI_U16 u16GlobalCountMax; + HI_U16 u16GlobalRAvg; + HI_U16 u16GlobalGAvg; + HI_U16 u16GlobalBAvg; + HI_U16 u16TK; + HI_U16 u16Rgain; + HI_U16 u16Ggain; + HI_U16 u16Bgain; + HI_U16 au16CCM[9]; + + HI_U32 au32HistInfo[256]; + AWB_ZONE_DBG_S astZoneDebug[255]; + + HI_U32 u32FrmNumEnd; +} AWB_DBG_STATUS_S; + +/************************** sensor's interface to awb *********************/ +typedef struct hiAWB_CCM_S +{ + HI_U16 u16HighColorTemp; /* D50 lighting source is recommended */ + HI_U16 au16HighCCM[9]; + HI_U16 u16MidColorTemp; /* D32 lighting source is recommended */ + HI_U16 au16MidCCM[9]; + HI_U16 u16LowColorTemp; /* A lighting source is recommended */ + HI_U16 au16LowCCM[9]; +}AWB_CCM_S; + +typedef struct hiAWB_AGC_TABLE_S +{ + HI_BOOL bValid; + + HI_U8 au8Saturation[16]; /* adjust saturation, different iso with different saturation */ +} AWB_AGC_TABLE_S; + +typedef struct hiAWB_SENSOR_DEFAULT_S +{ + HI_U16 u16WbRefTemp; /* reference color temperature for WB */ + HI_U16 au16GainOffset[4]; /* gain offset for white balance */ + HI_S32 as32WbPara[6]; /* parameter for wb curve,p1,p2,q1,a1,b1,c1 */ + + AWB_AGC_TABLE_S stAgcTbl; + AWB_CCM_S stCcm; +} AWB_SENSOR_DEFAULT_S; + +typedef struct hiAWB_SENSOR_EXP_FUNC_S +{ + HI_S32(*pfn_cmos_get_awb_default)(AWB_SENSOR_DEFAULT_S *pstAwbSnsDft); +} AWB_SENSOR_EXP_FUNC_S; + +typedef struct hiAWB_SENSOR_REGISTER_S +{ + AWB_SENSOR_EXP_FUNC_S stSnsExp; +} AWB_SENSOR_REGISTER_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_3a.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_3a.h new file mode 100644 index 0000000..a8db789 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_3a.h @@ -0,0 +1,388 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_3a.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/18 + Description : + History : + 1.Date : 2012/12/18 + Author : n00168968 + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_COMM_3A_H__ +#define __HI_COMM_3A_H__ + +#include "hi_common.h" +#include "hi_comm_isp.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define IS_LINEAR_MODE(mode) (WDR_MODE_NONE == (mode)) +#define IS_WDR_MODE(mode) ((!IS_LINEAR_MODE(mode)) && ((mode) < WDR_MODE_BUTT)) +#define IS_BUILT_IN_WDR_MODE(mode) (WDR_MODE_BUILT_IN == (mode)) +#define IS_FS_WDR_MODE(mode) ((!IS_LINEAR_MODE(mode))&& (!IS_BUILT_IN_WDR_MODE(mode)) && ((mode) < WDR_MODE_BUTT)) +#define IS_2to1_WDR_MODE(mode) ((WDR_MODE_2To1_FRAME == (mode)) || (WDR_MODE_2To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_2To1_LINE == (mode))) +#define IS_3to1_WDR_MODE(mode) ((WDR_MODE_3To1_FRAME == (mode)) || (WDR_MODE_3To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_3To1_LINE == (mode))) +#define IS_4to1_WDR_MODE(mode) ((WDR_MODE_4To1_FRAME == (mode)) || (WDR_MODE_4To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_4To1_LINE == (mode))) +#define IS_FULL_WDR_MODE(mode) ((WDR_MODE_2To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_3To1_FRAME_FULL_RATE == (mode)) || (WDR_MODE_4To1_FRAME_FULL_RATE == (mode))) +#define IS_HALF_WDR_MODE(mode) ((WDR_MODE_2To1_FRAME == (mode)) || (WDR_MODE_3To1_FRAME == (mode)) || (WDR_MODE_4To1_FRAME == (mode))) +#define IS_LINE_WDR_MODE(mode) ((WDR_MODE_2To1_LINE == (mode)) || (WDR_MODE_3To1_LINE == (mode)) || (WDR_MODE_4To1_LINE == (mode))) + +#define MAX_REGISTER_ALG_LIB_NUM 2 + +typedef enum hiISP_ALG_MOD_E +{ + ISP_ALG_AE = 0, + ISP_ALG_AF, + ISP_ALG_AWB, + //ISP_ALG_ANTIFOG, + ISP_ALG_BLC, + ISP_ALG_DP, + ISP_ALG_DRC, + ISP_ALG_DEMOSAIC, + ISP_ALG_GAMMA, + ISP_ALG_GAMMAFE, + ISP_ALG_GE, + //ISP_ALG_NEW_ANTIFOG, + ISP_ALG_NR, + ISP_ALG_SHARPEN, + ISP_ALG_SHADING, + ISP_ALG_FrameWDR, + ISP_ALG_FPN, + ISP_ALG_DEHAZE, + ISP_ALG_ACM, + ISP_ALG_CAC, + ISP_ALG_CSC, + ISP_ALG_COMPANDER, + ISP_ALG_UVNR, + ISP_ALG_LSC, + ISP_ALG_RGBIR, + ISP_ALG_COMM, + ISP_ALG_BUTT, +} ISP_ALG_MOD_E; + +typedef enum hiISP_CTRL_CMD_E +{ + ISP_WDR_MODE_SET = 8000, + ISP_PROC_WRITE, + + ISP_AE_FPS_BASE_SET, + + ISP_AWB_ISO_SET, /* set iso, change saturation when iso change */ + ISP_CHANGE_IMAGE_MODE_SET, + ISP_DCFINFO_GET, + ISP_AWB_INTTIME_SET, + + ISP_CTRL_CMD_BUTT, +} ISP_CTRL_CMD_E; + +typedef struct hiISP_CTRL_PROC_WRITE_S +{ + HI_CHAR *pcProcBuff; + HI_U32 u32BuffLen; + HI_U32 u32WriteLen; /* The len count should contain '\0'. */ +} ISP_CTRL_PROC_WRITE_S; + +/******************************** AE *************************************/ +/* the init param of ae alg */ +typedef struct hiISP_AE_PARAM_S +{ + SENSOR_ID SensorId; + HI_U8 u8WDRMode; + HI_FLOAT f32Fps; + + HI_S32 s32Rsv; +} ISP_AE_PARAM_S; + +/* the statistics of ae alg */ +typedef struct hiISP_AE_STAT_1_S +{ + HI_U8 au8MeteringHistThresh[4]; + HI_U16 au16MeteringHist[4]; +} ISP_AE_STAT_1_S; + +typedef struct hiISP_AE_STAT_2_S +{ + HI_U8 au8MeteringHistThresh[4]; + HI_U16 au16MeteringMemArrary[AE_ZONE_ROW][AE_ZONE_COLUMN][5]; +} ISP_AE_STAT_2_S; + +typedef struct hiISP_AE_STAT_3_S +{ + HI_U32 u32PixelCount; + HI_U32 u32PixelWeight; + HI_U32 au32HistogramMemArray[256]; +} ISP_AE_STAT_3_S; + +typedef struct hiISP_AE_STAT_4_S +{ + HI_U16 u16GlobalAvgR; + HI_U16 u16GlobalAvgGr; + HI_U16 u16GlobalAvgGb; + HI_U16 u16GlobalAvgB; +} ISP_AE_STAT_4_S; + +typedef struct hiISP_AE_STAT_5_S +{ + HI_U16 au16ZoneAvg[AE_ZONE_ROW][AE_ZONE_COLUMN][4]; +} ISP_AE_STAT_5_S; + + +typedef struct hiISP_AE_INFO_S +{ + HI_U32 u32FrameCnt; /* the counting of frame */ + + ISP_AE_STAT_1_S *pstAeStat1; /* not support */ + ISP_AE_STAT_2_S *pstAeStat2; /* not support */ + ISP_AE_STAT_3_S *pstAeStat3; + ISP_AE_STAT_4_S *pstAeStat4; + ISP_AE_STAT_5_S *pstAeStat5; +} ISP_AE_INFO_S; + +typedef struct hiISP_AE_STAT_ATTR_S +{ + HI_BOOL bChange; + + HI_U8 au8MeteringHistThresh[4]; + HI_U8 au8WeightTable[AE_ZONE_ROW][AE_ZONE_COLUMN]; +} ISP_AE_STAT_ATTR_S; + +/* the final calculate of ae alg */ +typedef struct hiISP_AE_RESULT_S +{ + HI_U32 u32IntTime[4]; + HI_U32 u32IspDgain; + HI_U32 u32Iso; + HI_U8 u8AERunInterval; + + HI_BOOL bPirisValid; + HI_S32 s32PirisPos; + HI_U32 u32PirisGain; + + ISP_AE_STAT_ATTR_S stStatAttr; +} ISP_AE_RESULT_S; + +typedef struct hiISP_AE_EXP_FUNC_S +{ + HI_S32 (*pfn_ae_init)(HI_S32 s32Handle, const ISP_AE_PARAM_S *pstAeParam); + HI_S32 (*pfn_ae_run)(HI_S32 s32Handle, + const ISP_AE_INFO_S *pstAeInfo, + ISP_AE_RESULT_S *pstAeResult, + HI_S32 s32Rsv + ); + HI_S32 (*pfn_ae_ctrl)(HI_S32 s32Handle, HI_U32 u32Cmd, HI_VOID *pValue); + HI_S32 (*pfn_ae_exit)(HI_S32 s32Handle); +} ISP_AE_EXP_FUNC_S; + +typedef struct hiISP_AE_REGISTER_S +{ + ISP_AE_EXP_FUNC_S stAeExpFunc; +} ISP_AE_REGISTER_S; + +/******************************** AWB *************************************/ + +/* the init param of awb alg */ +typedef struct hiISP_AWB_PARAM_S +{ + SENSOR_ID SensorId; + HI_U8 u8WDRMode; + + HI_S32 s32Rsv; +} ISP_AWB_PARAM_S; + +/* the statistics of awb alg */ +typedef struct hiISP_AWB_STAT_1_S +{ + HI_U16 u16MeteringAwbRg; + HI_U16 u16MeteringAwbBg; + HI_U32 u32MeteringAwbSum; +} ISP_AWB_STAT_1_S; + +typedef struct hiISP_AWB_STAT_2_S +{ + HI_U16 au16MeteringMemArrayRg[255]; + HI_U16 au16MeteringMemArrayBg[255]; + HI_U16 au16MeteringMemArraySum[255]; +} ISP_AWB_STAT_2_S; + +typedef struct hiISP_AWB_STAT_3_S +{ + HI_U16 u16MeteringAwbAvgR; + HI_U16 u16MeteringAwbAvgG; + HI_U16 u16MeteringAwbAvgB; + HI_U16 u16MeteringAwbCountAll; + HI_U16 u16MeteringAwbCountMin; + HI_U16 u16MeteringAwbCountMax; +} ISP_AWB_STAT_3_S; + +typedef struct hiISP_AWB_STAT_4_S +{ + HI_U16 au16MeteringMemArrayAvgR[255]; + HI_U16 au16MeteringMemArrayAvgG[255]; + HI_U16 au16MeteringMemArrayAvgB[255]; + HI_U16 au16MeteringMemArrayCountAll[255]; + HI_U16 au16MeteringMemArrayCountMin[255]; + HI_U16 au16MeteringMemArrayCountMax[255]; +} ISP_AWB_STAT_4_S; + +typedef struct hiISP_AWB_INFO_S +{ + HI_U32 u32FrameCnt; + + ISP_AWB_STAT_1_S *pstAwbStat1; + ISP_AWB_STAT_2_S *pstAwbStat2; + ISP_AWB_STAT_3_S *pstAwbStat3; + ISP_AWB_STAT_4_S *pstAwbStat4; +} ISP_AWB_INFO_S; + +/* the statistics's attr of awb alg */ +typedef struct hiISP_AWB_STAT_ATTR_S +{ + HI_BOOL bChange; + + HI_U16 u16MeteringWhiteLevelAwb; + HI_U16 u16MeteringBlackLevelAwb; + HI_U16 u16MeteringCrRefMaxAwb; + HI_U16 u16MeteringCbRefMaxAwb; + HI_U16 u16MeteringCrRefMinAwb; + HI_U16 u16MeteringCbRefMinAwb; + HI_U16 u16MeteringCrRefHighAwb; + HI_U16 u16MeteringCrRefLowAwb; + HI_U16 u16MeteringCbRefHighAwb; + HI_U16 u16MeteringCbRefLowAwb; +} ISP_AWB_STAT_ATTR_S; + +typedef struct hiISP_AWB_RAW_STAT_ATTR_S +{ + HI_BOOL bChange; + HI_BOOL bAboveWhiteLevelClip; + HI_BOOL bBelowBlackLevelClip; + + HI_U16 u16MeteringWhiteLevelAwb; + HI_U16 u16MeteringBlackLevelAwb; + HI_U16 u16MeteringCrRefMaxAwb; + HI_U16 u16MeteringCbRefMaxAwb; + HI_U16 u16MeteringCrRefMinAwb; + HI_U16 u16MeteringCbRefMinAwb; + HI_U16 u16MeteringCrRefHighAwb; + HI_U16 u16MeteringCrRefLowAwb; + HI_U16 u16MeteringCbRefHighAwb; + HI_U16 u16MeteringCbRefLowAwb; +} ISP_AWB_RAW_STAT_ATTR_S; + + +/* the final calculate of awb alg */ +typedef struct hiISP_AWB_RESULT_S +{ + HI_U32 au32WhiteBalanceGain[4]; + HI_U16 au16ColorMatrix[9]; + + ISP_AWB_STAT_ATTR_S stStatAttr; + ISP_AWB_RAW_STAT_ATTR_S stRawStatAttr; +} ISP_AWB_RESULT_S; + +typedef struct hiISP_AWB_EXP_FUNC_S +{ + HI_S32 (*pfn_awb_init)(HI_S32 s32Handle, const ISP_AWB_PARAM_S *pstAwbParam); + HI_S32 (*pfn_awb_run)(HI_S32 s32Handle, + const ISP_AWB_INFO_S *pstAwbInfo, + ISP_AWB_RESULT_S *pstAwbResult, + HI_S32 s32Rsv + ); + HI_S32 (*pfn_awb_ctrl)(HI_S32 s32Handle, HI_U32 u32Cmd, HI_VOID *pValue); + HI_S32 (*pfn_awb_exit)(HI_S32 s32Handle); +} ISP_AWB_EXP_FUNC_S; + +typedef struct hiISP_AWB_REGISTER_S +{ + ISP_AWB_EXP_FUNC_S stAwbExpFunc; +} ISP_AWB_REGISTER_S; + +/******************************** AF *************************************/ + +/* the init param of af alg */ +typedef struct hiISP_AF_PARAM_S +{ + SENSOR_ID SensorId; + HI_U8 u8WDRMode; + + HI_S32 s32Rsv; +} ISP_AF_PARAM_S; + +/* the statistics of af alg */ +typedef struct hiISP_AF_ZONE_S +{ + HI_U16 u16v1; + HI_U16 u16h1; + HI_U16 u16v2; + HI_U16 u16h2; + HI_U16 u16y; +} ISP_AF_ZONE_S; +typedef struct hiISP_AF_STAT_S +{ + ISP_AF_ZONE_S stZoneMetrics[AF_ZONE_ROW][AF_ZONE_COLUMN]; /*RO, The zoned measure of contrast*/ +} ISP_AF_STAT_S; + +typedef struct hiISP_AF_INFO_S +{ + HI_U32 u32FrameCnt; + + ISP_AF_STAT_S *stAfStat; +} ISP_AF_INFO_S; + +/* the final calculate of af alg */ +typedef struct hiISP_AF_RESULT_S +{ + HI_S32 s32Rsv; +} ISP_AF_RESULT_S; + +typedef struct hiISP_AF_EXP_FUNC_S +{ + HI_S32 (*pfn_af_init)(HI_S32 s32Handle, const ISP_AF_PARAM_S *pstAfParam); + HI_S32 (*pfn_af_run)(HI_S32 s32Handle, + const ISP_AF_INFO_S *pstAfInfo, + ISP_AF_RESULT_S *pstAfResult, + HI_S32 s32Rsv + ); + HI_S32 (*pfn_af_ctrl)(HI_S32 s32Handle, HI_U32 u32Cmd, HI_VOID *pValue); + HI_S32 (*pfn_af_exit)(HI_S32 s32Handle); +} ISP_AF_EXP_FUNC_S; + +typedef struct hiISP_AF_REGISTER_S +{ + ISP_AF_EXP_FUNC_S stAfExpFunc; +} ISP_AF_REGISTER_S; + +typedef struct hiALG_LIB_S +{ + HI_S32 s32Id; + HI_CHAR acLibName[20]; +} ALG_LIB_S; + +typedef struct hiISP_BIND_ATTR_S +{ + SENSOR_ID SensorId; + ALG_LIB_S stAeLib; + ALG_LIB_S stAfLib; + ALG_LIB_S stAwbLib; +} ISP_BIND_ATTR_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__HI_COMM_SNS_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_adec.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_adec.h new file mode 100644 index 0000000..15bf179 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_adec.h @@ -0,0 +1,162 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_adec.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2006/12/15 + Last Modified : + Description : + Function List : + History : + 1.Date : 2006/12/15 + Author : z50825 + Modification : Created file + 2.Date : 2007/5/10 + Author : z50825 + Modification : add err code +******************************************************************************/ + + +#ifndef __HI_COMM_ADEC_H__ +#define __HI_COMM_ADEC_H__ + + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_aio.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef struct hiADEC_ATTR_G711_S +{ + HI_U32 resv; +}ADEC_ATTR_G711_S; + +typedef struct hiADEC_ATTR_G726_S +{ + G726_BPS_E enG726bps; +}ADEC_ATTR_G726_S; + +typedef struct hiADEC_ATTR_ADPCM_S +{ + ADPCM_TYPE_E enADPCMType; +}ADEC_ATTR_ADPCM_S; + +typedef struct hiADEC_ATTR_LPCM_S +{ + HI_U32 resv; +}ADEC_ATTR_LPCM_S; + +typedef enum hiADEC_MODE_E +{ + ADEC_MODE_PACK = 0,/*require input is valid dec pack(a + complete frame encode result), + e.g.the stream get from AENC is a + valid dec pack, the stream know actually + pack len from file is also a dec pack. + this mode is high-performative*/ + ADEC_MODE_STREAM ,/*input is stream,low-performative, + if you couldn't find out whether a stream is + vaild dec pack,you could use + this mode*/ + ADEC_MODE_BUTT +}ADEC_MODE_E; + +typedef struct hiADEC_CH_ATTR_S +{ + PAYLOAD_TYPE_E enType; + HI_U32 u32BufSize; /*buf size[2~MAX_AUDIO_FRAME_NUM]*/ + ADEC_MODE_E enMode; /*decode mode*/ + HI_VOID *pValue; +}ADEC_CHN_ATTR_S; + +typedef struct hiADEC_DECODER_S +{ + PAYLOAD_TYPE_E enType; + HI_CHAR aszName[16]; + HI_S32 (*pfnOpenDecoder)(HI_VOID *pDecoderAttr, HI_VOID **ppDecoder); /*struct ppDecoder is packed by user,user malloc and free memory for this struct */ + HI_S32 (*pfnDecodeFrm)(HI_VOID *pDecoder, HI_U8 **pu8Inbuf,HI_S32 *ps32LeftByte, + HI_U16 *pu16Outbuf,HI_U32 *pu32OutLen,HI_U32 *pu32Chns); + HI_S32 (*pfnGetFrmInfo)(HI_VOID *pDecoder, HI_VOID *pInfo); + HI_S32 (*pfnCloseDecoder)(HI_VOID *pDecoder); + HI_S32 (*pfnResetDecoder)(HI_VOID *pDecoder); +} ADEC_DECODER_S; + +typedef enum hiEN_ADEC_ERR_CODE_E +{ + ADEC_ERR_DECODER_ERR = 64, + ADEC_ERR_BUF_LACK, + ADEC_ERR_VOICE_DEC_TYPE, + ADEC_ERR_VOICE_DEC_FRAMESIZE, + ADEC_ERR_VOICE_DEC_FRAMETYPE, + ADEC_ERR_VOICE_INVALID_DEVICE, + ADEC_ERR_VOICE_INVALID_INBUF, + ADEC_ERR_VOICE_INVALID_OUTBUF, + ADEC_ERR_VOICE_TRANS_DEVICE, + ADEC_ERR_VOICE_TRANS_TYPE, + +} EN_ADEC_ERR_CODE_E; + + +/* invlalid device ID */ +#define HI_ERR_ADEC_INVALID_DEVID HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_ADEC_INVALID_CHNID HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_ADEC_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_ADEC_EXIST HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* channel unexists */ +#define HI_ERR_ADEC_UNEXIST HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_ADEC_NULL_PTR HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_ADEC_NOT_CONFIG HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_ADEC_NOT_SUPPORT HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_ADEC_NOT_PERM HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_ADEC_NOMEM HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_ADEC_NOBUF HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_ADEC_BUF_EMPTY HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_ADEC_BUF_FULL HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_ADEC_SYS_NOTREADY HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/* decoder internal err */ +#define HI_ERR_ADEC_DECODER_ERR HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_DECODER_ERR) +/* input buffer not enough to decode one frame */ +#define HI_ERR_ADEC_BUF_LACK HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_BUF_LACK) + + + +#define HI_ERR_ADEC_DEC_TYPE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_DEC_TYPE) +#define HI_ERR_ADEC_DEC_FRAMESIZE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_DEC_FRAMESIZE) +#define HI_ERR_ADEC_DEC_FRAMETYPE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_DEC_FRAMETYPE) +#define HI_ERR_ADEC_INVALID_DEVICE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_INVALID_DEVICE) +#define HI_ERR_ADEC_INVALID_INBUF HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_INVALID_INBUF) +#define HI_ERR_ADEC_INVALID_OUTBUF HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_INVALID_OUTBUF) +#define HI_ERR_ADEC_TRANS_DEVICE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_TRANS_DEVICE) +#define HI_ERR_ADEC_TRANS_TYPE HI_DEF_ERR(HI_ID_ADEC, EN_ERR_LEVEL_ERROR, ADEC_ERR_VOICE_TRANS_TYPE) + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif/* End of #ifndef __HI_COMM_ADEC_H__*/ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_aenc.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_aenc.h new file mode 100644 index 0000000..0de55d6 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_aenc.h @@ -0,0 +1,125 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_aenc.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2006/12/15 + Last Modified : + Description : + Function List : + History : + 1.Date : 2006/12/15 + Author : z50825 + Modification : Created file + 2.Date : 2007/5/10 + Author : z50825 + Modification : add err code +******************************************************************************/ + + +#ifndef __HI_COMM_AENC_H__ +#define __HI_COMM_AENC_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_aio.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef struct hiAENC_ATTR_G711_S +{ + HI_U32 resv; /*reserve item*/ +}AENC_ATTR_G711_S; + +typedef struct hiAENC_ATTR_G726_S +{ + G726_BPS_E enG726bps; +}AENC_ATTR_G726_S; + +typedef struct hiAENC_ATTR_ADPCM_S +{ + ADPCM_TYPE_E enADPCMType; +}AENC_ATTR_ADPCM_S; + +typedef struct hiAENC_ATTR_LPCM_S +{ + HI_U32 resv; /*reserve item*/ +}AENC_ATTR_LPCM_S; + +typedef struct hiAENC_ENCODER_S +{ + PAYLOAD_TYPE_E enType; + HI_U32 u32MaxFrmLen; + HI_CHAR aszName[16]; /* encoder type,be used to print proc information */ + HI_S32 (*pfnOpenEncoder)(HI_VOID *pEncoderAttr, HI_VOID **ppEncoder); /* pEncoder is the handle to control the encoder */ + HI_S32 (*pfnEncodeFrm)(HI_VOID *pEncoder, const AUDIO_FRAME_S *pstData, + HI_U8 *pu8Outbuf,HI_U32 *pu32OutLen); + HI_S32 (*pfnCloseEncoder)(HI_VOID *pEncoder); +} AENC_ENCODER_S; + +typedef struct hiAENC_CHN_ATTR_S +{ + PAYLOAD_TYPE_E enType; /*payload type ()*/ + HI_U32 u32PtNumPerFrm; + HI_U32 u32BufSize; /*buf size [2~MAX_AUDIO_FRAME_NUM]*/ + HI_VOID *pValue; /*point to attribute of definite audio encoder*/ +}AENC_CHN_ATTR_S; + +typedef enum hiEN_AENC_ERR_CODE_E +{ + AENC_ERR_ENCODER_ERR = 64 , + AENC_ERR_VQEW_ERR = 65 , + +} EN_AENC_ERR_CODE_E; + + +/* invlalid device ID */ +#define HI_ERR_AENC_INVALID_DEVID HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_AENC_INVALID_CHNID HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_AENC_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_AENC_EXIST HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* channel unexists */ +#define HI_ERR_AENC_UNEXIST HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_AENC_NULL_PTR HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_AENC_NOT_CONFIG HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_AENC_NOT_SUPPORT HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change static attribute */ +#define HI_ERR_AENC_NOT_PERM HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_AENC_NOMEM HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_AENC_NOBUF HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_AENC_BUF_EMPTY HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_AENC_BUF_FULL HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_AENC_SYS_NOTREADY HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/* encoder internal err */ +#define HI_ERR_AENC_ENCODER_ERR HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, AENC_ERR_ENCODER_ERR) +/* vqe internal err */ +#define HI_ERR_AENC_VQEW_ERR HI_DEF_ERR(HI_ID_AENC, EN_ERR_LEVEL_ERROR, AENC_ERR_VQEW_ERR) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif/* End of #ifndef __HI_COMM_AENC_H__*/ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_ai.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_ai.h new file mode 100644 index 0000000..6104c41 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_ai.h @@ -0,0 +1,36 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_ai.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ + + +#ifndef __HI_COMM_AI_H__ +#define __HI_COMM_AI_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_AI_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_aio.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_aio.h new file mode 100644 index 0000000..009f972 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_aio.h @@ -0,0 +1,483 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_aio.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ + + +#ifndef __HI_COMM_AIO_H__ +#define __HI_COMM_AIO_H__ + +#include "hi_common.h" +#include "hi_errno.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +#define MAX_AUDIO_FRAME_NUM 50 /*max count of audio frame in Buffer */ +#define MAX_AUDIO_POINT_BYTES 4 /*max bytes of one sample point(now 32bit max)*/ + +#define MAX_VOICE_POINT_NUM 480 /*max sample per frame for voice encode */ + +#define MAX_AUDIO_POINT_NUM 2048 /*max sample per frame for all encoder(aacplus:2048)*/ +#define MAX_AO_POINT_NUM 4096 /* from h3support 4096 framelen*/ +#define MIN_AUDIO_POINT_NUM 80 /*min sample per frame*/ +#define MAX_AI_POINT_NUM 2048 /*max sample per frame for all encoder(aacplus:2048)*/ + +/*max length of audio frame by bytes, one frame contain many sample point */ +#define MAX_AUDIO_FRAME_LEN (MAX_AUDIO_POINT_BYTES*MAX_AO_POINT_NUM) + +/*max length of audio stream by bytes */ +#define MAX_AUDIO_STREAM_LEN MAX_AUDIO_FRAME_LEN + +#define MAX_AI_USRFRM_DEPTH 30 /*max depth of user frame buf */ + +/*The VQE EQ Band num.*/ +#define VQE_EQ_BAND_NUM 10 + + +typedef enum hiAUDIO_SAMPLE_RATE_E +{ + AUDIO_SAMPLE_RATE_8000 = 8000, /* 8K samplerate*/ + AUDIO_SAMPLE_RATE_12000 = 12000, /* 12K samplerate*/ + AUDIO_SAMPLE_RATE_11025 = 11025, /* 11.025K samplerate*/ + AUDIO_SAMPLE_RATE_16000 = 16000, /* 16K samplerate*/ + AUDIO_SAMPLE_RATE_22050 = 22050, /* 22.050K samplerate*/ + AUDIO_SAMPLE_RATE_24000 = 24000, /* 24K samplerate*/ + AUDIO_SAMPLE_RATE_32000 = 32000, /* 32K samplerate*/ + AUDIO_SAMPLE_RATE_44100 = 44100, /* 44.1K samplerate*/ + AUDIO_SAMPLE_RATE_48000 = 48000, /* 48K samplerate*/ + AUDIO_SAMPLE_RATE_BUTT, +} AUDIO_SAMPLE_RATE_E; + +typedef enum hiAUDIO_BIT_WIDTH_E +{ + AUDIO_BIT_WIDTH_8 = 0, /* 8bit width */ + AUDIO_BIT_WIDTH_16 = 1, /* 16bit width*/ + AUDIO_BIT_WIDTH_24 = 2, /* 24bit width*/ + AUDIO_BIT_WIDTH_BUTT, +} AUDIO_BIT_WIDTH_E; + +typedef enum hiAIO_MODE_E +{ + AIO_MODE_I2S_MASTER = 0, /* AIO I2S master mode */ + AIO_MODE_I2S_SLAVE, /* AIO I2S slave mode */ + AIO_MODE_PCM_SLAVE_STD, /* AIO PCM slave standard mode */ + AIO_MODE_PCM_SLAVE_NSTD, /* AIO PCM slave non-standard mode */ + AIO_MODE_PCM_MASTER_STD, /* AIO PCM master standard mode */ + AIO_MODE_PCM_MASTER_NSTD, /* AIO PCM master non-standard mode */ + AIO_MODE_BUTT +} AIO_MODE_E; + +typedef enum hiAIO_SOUND_MODE_E +{ + AUDIO_SOUND_MODE_MONO =0,/*mono*/ + AUDIO_SOUND_MODE_STEREO =1,/*stereo*/ + AUDIO_SOUND_MODE_BUTT +} AUDIO_SOUND_MODE_E; + +/* +An example of the packing scheme for G726-32 codewords is as shown, and bit A3 is the least significant bit of the first codeword: +RTP G726-32: +0 1 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +|B B B B|A A A A|D D D D|C C C C| ... +|0 1 2 3|0 1 2 3|0 1 2 3|0 1 2 3| ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + +MEDIA G726-32: +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +|A A A A|B B B B|C C C C|D D D D| ... +|3 2 1 0|3 2 1 0|3 2 1 0|3 2 1 0| ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +*/ +typedef enum hiG726_BPS_E +{ + G726_16K = 0, /* G726 16kbps, see RFC3551.txt 4.5.4 G726-16 */ + G726_24K, /* G726 24kbps, see RFC3551.txt 4.5.4 G726-24 */ + G726_32K, /* G726 32kbps, see RFC3551.txt 4.5.4 G726-32 */ + G726_40K, /* G726 40kbps, see RFC3551.txt 4.5.4 G726-40 */ + MEDIA_G726_16K, /* G726 16kbps for ASF ... */ + MEDIA_G726_24K, /* G726 24kbps for ASF ... */ + MEDIA_G726_32K, /* G726 32kbps for ASF ... */ + MEDIA_G726_40K, /* G726 40kbps for ASF ... */ + G726_BUTT, +} G726_BPS_E; + +typedef enum hiADPCM_TYPE_E +{ + /* see DVI4 diiffers in three respects from the IMA ADPCM at RFC3551.txt 4.5.1 DVI4 */ + + ADPCM_TYPE_DVI4 = 0, /* 32kbps ADPCM(DVI4) for RTP */ + ADPCM_TYPE_IMA, /* 32kbps ADPCM(IMA),NOTICE:point num must be 161/241/321/481 */ + ADPCM_TYPE_ORG_DVI4, + ADPCM_TYPE_BUTT, +} ADPCM_TYPE_E; + +#define AI_EXPAND 0x01 +#define AI_CUT 0x02 + +typedef struct hiAIO_ATTR_S +{ + AUDIO_SAMPLE_RATE_E enSamplerate; /* sample rate */ + AUDIO_BIT_WIDTH_E enBitwidth; /* bitwidth */ + AIO_MODE_E enWorkmode; /* master or slave mode */ + AUDIO_SOUND_MODE_E enSoundmode; /* momo or steror */ + HI_U32 u32EXFlag; /* expand 8bit to 16bit,use AI_EXPAND(only valid for AI 8bit) */ + HI_U32 u32FrmNum; /* frame num in buf[2,MAX_AUDIO_FRAME_NUM] */ + HI_U32 u32PtNumPerFrm; /* point num per frame (80/160/240/320/480/1024/2048) + (ADPCM IMA should add 1 point, AMR only support 160) */ + HI_U32 u32ChnCnt; /* channle number on FS, valid value:1/2/4/8 */ + HI_U32 u32ClkSel; /* 0: AI and AO clock is separate + 1: AI and AO clock is inseparate, AI use AO's clock + */ +} AIO_ATTR_S; + +typedef struct hiAI_CHN_PARAM_S +{ + HI_U32 u32UsrFrmDepth; +} AI_CHN_PARAM_S; + +typedef struct hiAUDIO_FRAME_S +{ + AUDIO_BIT_WIDTH_E enBitwidth; /*audio frame bitwidth*/ + AUDIO_SOUND_MODE_E enSoundmode; /*audio frame momo or stereo mode*/ + HI_VOID *pVirAddr[2]; + HI_U32 u32PhyAddr[2]; + HI_U64 u64TimeStamp; /*audio frame timestamp*/ + HI_U32 u32Seq; /*audio frame seq*/ + HI_U32 u32Len; /*data lenth per channel in frame*/ + HI_U32 u32PoolId[2]; +} AUDIO_FRAME_S; + +typedef struct hiAEC_FRAME_S +{ + AUDIO_FRAME_S stRefFrame; /* AEC reference audio frame */ + HI_BOOL bValid; /* whether frame is valid */ + HI_BOOL bSysBind; /* whether is sysbind */ +} AEC_FRAME_S; + +typedef struct hiAUDIO_FRAME_COMBINE_S +{ + AUDIO_FRAME_S stFrm; /* audio frame */ + AEC_FRAME_S stRefFrm; /* AEC reference audio frame */ +} AUDIO_FRAME_COMBINE_S; + +typedef struct hiAUDIO_FRAME_INFO_S +{ + AUDIO_FRAME_S *pstFrame;/*frame ptr*/ + HI_U32 u32Id; /*frame id*/ +} AUDIO_FRAME_INFO_S; + +typedef struct hiAUDIO_STREAM_S +{ + HI_U8 *pStream; /* the virtual address of stream */ + HI_U32 u32PhyAddr; /* the physics address of stream */ + HI_U32 u32Len; /* stream lenth, by bytes */ + HI_U64 u64TimeStamp; /* frame time stamp*/ + HI_U32 u32Seq; /* frame seq,if stream is not a valid frame,u32Seq is 0*/ +} AUDIO_STREAM_S; + +typedef struct hiAUDIO_RESAMPLE_ATTR_S +{ + HI_U32 u32InPointNum; /* input point number of frame */ + AUDIO_SAMPLE_RATE_E enInSampleRate; /* input sample rate */ + AUDIO_SAMPLE_RATE_E enOutSampleRate; /* output sample rate */ +} AUDIO_RESAMPLE_ATTR_S; + +typedef struct hiAO_CHN_STATE_S +{ + HI_U32 u32ChnTotalNum; /* total number of channel buffer */ + HI_U32 u32ChnFreeNum; /* free number of channel buffer */ + HI_U32 u32ChnBusyNum; /* busy number of channel buffer */ +} AO_CHN_STATE_S; + +typedef struct hiAIO_RESMP_INFO_S +{ + HI_BOOL bReSmpEnable; /* resample enable or disable */ + AUDIO_RESAMPLE_ATTR_S stResmpAttr; +} AIO_RESMP_INFO_S; + +typedef enum hiAUDIO_TRACK_MODE_E +{ + AUDIO_TRACK_NORMAL = 0, + AUDIO_TRACK_BOTH_LEFT = 1, + AUDIO_TRACK_BOTH_RIGHT = 2, + AUDIO_TRACK_EXCHANGE = 3, + AUDIO_TRACK_MIX = 4, + AUDIO_TRACK_LEFT_MUTE = 5, + AUDIO_TRACK_RIGHT_MUTE = 6, + AUDIO_TRACK_BOTH_MUTE = 7, + + AUDIO_TRACK_BUTT +} AUDIO_TRACK_MODE_E; + +typedef enum hiAUDIO_CLKDIR_E +{ + AUDIO_CLKDIR_RISE = 0, + AUDIO_CLKDIR_FALL = 1, + + AUDIO_CLKDIR_BUTT +} AUDIO_CLKDIR_E; + +typedef enum hiAUDIO_FADE_RATE_E +{ + AUDIO_FADE_RATE_1 = 0, + AUDIO_FADE_RATE_2 = 1, + AUDIO_FADE_RATE_4 = 2, + AUDIO_FADE_RATE_8 = 3, + AUDIO_FADE_RATE_16 = 4, + AUDIO_FADE_RATE_32 = 5, + AUDIO_FADE_RATE_64 = 6, + AUDIO_FADE_RATE_128 = 7, + + AUDIO_FADE_RATE_BUTT +} AUDIO_FADE_RATE_E; + +typedef struct hiAUDIO_FADE_S +{ + HI_BOOL bFade; + AUDIO_FADE_RATE_E enFadeInRate; + AUDIO_FADE_RATE_E enFadeOutRate; +} AUDIO_FADE_S; +typedef enum hiAUDIO_AEC_MODE_E +{ + AUDIO_AEC_MODE_CLOSE = 0, + AUDIO_AEC_MODE_OPEN = 1, + + AUDIO_AEC_MODE_BUTT +} AUDIO_AEC_MODE_E; + +/**Defines the configure parameters of AGC.*/ +typedef struct hiAUDIO_AGC_CONFIG_S +{ + HI_BOOL bUsrMode; /* mode 0: auto?mode 1: manual.*/ + + HI_S8 s8TargetLevel; /* target voltage level, range: [-40, -1]dB */ + HI_S8 s8NoiseFloor; /* noise floor, range: [-65, -20]dB */ + HI_S8 s8MaxGain; /* max gain, range: [0, 30]dB */ + HI_S8 s8AdjustSpeed; /* adjustable speed, range: [0, 10]dB/s */ + + HI_S8 s8ImproveSNR; /* switch for improving SNR, range: [0:close, 1:upper limit 3dB, 2:upper limit 6dB] */ + HI_S8 s8UseHighPassFilt; /* switch for using high pass filt, range: [0:close, 1:80Hz, 2:120Hz, 3:150:Hz, 4:300Hz: 5:500Hz] */ + HI_S8 s8OutputMode; /* output mode, mute when lower than noise floor, range: [0:close, 1:open] */ + HI_S16 s16NoiseSupSwitch; /* switch for noise suppression, range: [0:close, 1:open] */ + + + HI_S32 s32Reserved; +} AUDIO_AGC_CONFIG_S; + +/**Defines the configure parameters of AEC.*/ +typedef struct hiAI_AEC_CONFIG_S +{ + HI_BOOL bUsrMode; + HI_S8 s8CngMode; /* cosy-noisy mode:0 close,1 open, default 1*/ + HI_S32 s32Reserved; +} AI_AEC_CONFIG_S; + +/**Defines the configure parameters of ANR.*/ +typedef struct hiAUDIO_ANR_CONFIG_S +{ + HI_BOOL bUsrMode; /* mode 0: auto?mode 1: manual.*/ + + HI_S16 s16NrIntensity; /* noise reduce intensity, range: [0, 25] */ + HI_S16 s16NoiseDbThr; /* noise threshold, range: [30, 60] */ + HI_S8 s8SpProSwitch; /* switch for music probe, range: [0:close, 1:open] */ + + HI_S32 s32Reserved; +} AUDIO_ANR_CONFIG_S; + +/**Defines the configure parameters of HPF.*/ +typedef enum hiAUDIO_HPF_FREQ_E +{ + AUDIO_HPF_FREQ_80 = 80, /* 80Hz */ + AUDIO_HPF_FREQ_120 = 120, /* 120Hz */ + AUDIO_HPF_FREQ_150 = 150, /* 150Hz */ + AUDIO_HPF_FREQ_BUTT, +} AUDIO_HPF_FREQ_E; + +typedef struct hiAUDIO_HPF_CONFIG_S +{ + HI_BOOL bUsrMode; /* mode 0: auto mode 1: mannual.*/ + AUDIO_HPF_FREQ_E enHpfFreq; /*freq to be processed*/ +} AUDIO_HPF_CONFIG_S; + +typedef struct hiAI_RNR_CONFIG_S +{ + HI_BOOL bUsrMode; /* mode 0: auto?mode 1: mannual.*/ + + HI_S32 s32NrMode; /*mode 0: floor noise; 1:ambient noise */ + + HI_S32 s32MaxNrLevel; /*max NR level range:[2,20]dB*/ + + HI_S32 s32NoiseThresh; /*noise threshold, range:[-80, -20]*/ +} AI_RNR_CONFIG_S; + +typedef struct hiAUDIO_EQ_CONFIG_S +{ + HI_S8 s8GaindB[VQE_EQ_BAND_NUM]; /*EQ band, include 100,200,250,350,500,800,1.2k,2.5k,4k,8k in turn, range:[-100, 20]*/ + HI_S32 s32Reserved; +} AUDIO_EQ_CONFIG_S; + + +/**Defines the configure parameters of UPVQE work state.*/ +typedef enum hiVQE_WORKSTATE_E +{ + VQE_WORKSTATE_COMMON = 0, /* common environment, Applicable to the family of voice calls. */ + VQE_WORKSTATE_MUSIC = 1, /* music environment , Applicable to the family of music environment. */ + VQE_WORKSTATE_NOISY = 2, /* noisy environment , Applicable to the noisy voice calls. */ +} VQE_WORKSTATE_E; + +/**Defines the configure parameters of VQE.*/ +typedef struct hiAI_VQE_CONFIG_S +{ + HI_S32 bHpfOpen; + HI_S32 bAecOpen; + HI_S32 bAnrOpen; + HI_S32 bRnrOpen; + HI_S32 bAgcOpen; + HI_S32 bEqOpen; + + HI_S32 s32WorkSampleRate; /* Sample Rate8KHz/16KHzdefault: 8KHz*/ + HI_S32 s32FrameSample; /* VQE frame length 80-4096 */ + VQE_WORKSTATE_E enWorkstate; + + + AUDIO_HPF_CONFIG_S stHpfCfg; + AI_AEC_CONFIG_S stAecCfg; + AUDIO_ANR_CONFIG_S stAnrCfg; + AI_RNR_CONFIG_S stRnrCfg; + AUDIO_AGC_CONFIG_S stAgcCfg; + AUDIO_EQ_CONFIG_S stEqCfg; +} AI_VQE_CONFIG_S; + +typedef struct hiAO_VQE_CONFIG_S +{ + HI_S32 bHpfOpen; + HI_S32 bAnrOpen; /*Anr and Rnr can't enable at the same time,Anr used in voice noise reducing*/ + HI_S32 bAgcOpen; + HI_S32 bEqOpen; + + HI_S32 s32WorkSampleRate; /* Sample Rate8KHz/16KHz/48KHzdefault: 8KHz*/ + HI_S32 s32FrameSample; /* VQE frame length 80-4096 */ + VQE_WORKSTATE_E enWorkstate; + + AUDIO_HPF_CONFIG_S stHpfCfg; + AUDIO_ANR_CONFIG_S stAnrCfg; + AUDIO_AGC_CONFIG_S stAgcCfg; + AUDIO_EQ_CONFIG_S stEqCfg; +} AO_VQE_CONFIG_S; + + +typedef struct hiAI_VQE_INFO_S +{ + HI_BOOL bVqeEnable; /* vqe enable or disable */ + AI_VQE_CONFIG_S stAiVqeCfg; +} AI_VQE_INFO_S; + +typedef struct hiAO_VQE_INFO_S +{ + HI_BOOL bVqeEnable; /* vqe enable or disable */ + AO_VQE_CONFIG_S stAoVqeCfg; +} AO_VQE_INFO_S; + +/**Defines the state of inner codec.*/ +typedef struct hiAI_INNER_CODEC_STATE_S +{ + HI_BOOL bMicInl; + HI_BOOL bMicInr; +} AI_INNER_CODEC_STATE_S; + +/*Defines the configure parameters of AI saving file.*/ +typedef struct hiAUDIO_SAVE_FILE_INFO_S +{ + HI_BOOL bCfg; + HI_CHAR aFilePath[256]; + HI_CHAR aFileName[256]; + HI_U32 u32FileSize; /*in KB*/ +} AUDIO_SAVE_FILE_INFO_S; + + +/* invlalid device ID */ +#define HI_ERR_AI_INVALID_DEVID HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_AI_INVALID_CHNID HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_AI_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* using a NULL point */ +#define HI_ERR_AI_NULL_PTR HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_AI_NOT_CONFIG HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_AI_NOT_SUPPORT HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_AI_NOT_PERM HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* the devide is not enabled */ +#define HI_ERR_AI_NOT_ENABLED HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* failure caused by malloc memory */ +#define HI_ERR_AI_NOMEM HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_AI_NOBUF HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_AI_BUF_EMPTY HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_AI_BUF_FULL HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_AI_SYS_NOTREADY HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + +#define HI_ERR_AI_BUSY HI_DEF_ERR(HI_ID_AI, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/* invlalid device ID */ +#define HI_ERR_AO_INVALID_DEVID HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_AO_INVALID_CHNID HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_AO_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* using a NULL point */ +#define HI_ERR_AO_NULL_PTR HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_AO_NOT_CONFIG HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_AO_NOT_SUPPORT HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_AO_NOT_PERM HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* the devide is not enabled */ +#define HI_ERR_AO_NOT_ENABLED HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* failure caused by malloc memory */ +#define HI_ERR_AO_NOMEM HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_AO_NOBUF HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_AO_BUF_EMPTY HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_AO_BUF_FULL HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_AO_SYS_NOTREADY HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + +#define HI_ERR_AO_BUSY HI_DEF_ERR(HI_ID_AO, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_AI_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_ao.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_ao.h new file mode 100644 index 0000000..9e9fe06 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_ao.h @@ -0,0 +1,37 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_ao.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ + + +#ifndef __HI_COMM_AO_H__ +#define __HI_COMM_AO_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_AO_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_fisheye.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_fisheye.h new file mode 100644 index 0000000..ef468b1 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_fisheye.h @@ -0,0 +1,65 @@ +/****************************************************************************** + + Copyright (C), 2013-2033, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_fisheye.h + Version : + Author : Hisilicon Hi35xx MPP Team + Created : 2015/06/15 + Last Modified : + Description : common struct definition for FISHEYE + Function List : + History : +******************************************************************************/ +#ifndef __HI_COMM_FISHEYE_H__ +#define __HI_COMM_FISHEYE_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" + +#define MAKE_DWORD(high,low) (((low)&0x0000ffff)|((high)<<16)) +#define HIGH_WORD(x) (((x)&0xffff0000)>>16) +#define LOW_WORD(x) ((x)&0x0000ffff) + +/* failure caused by malloc buffer */ +#define HI_ERR_FISHEYE_NOBUF HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +#define HI_ERR_FISHEYE_BUF_EMPTY HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +#define HI_ERR_FISHEYE_NULL_PTR HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_FISHEYE_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_FISHEYE_BUF_FULL HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +#define HI_ERR_FISHEYE_SYS_NOTREADY HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_FISHEYE_NOT_SUPPORT HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_FISHEYE_NOT_PERMITTED HI_DEF_ERR(HI_ID_FISHEYE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) + +typedef HI_S32 FISHEYE_HANDLE; + +typedef struct hiFISHEYE_TASK_ATTR_S +{ + VIDEO_FRAME_INFO_S stImgIn; /* input picture */ + VIDEO_FRAME_INFO_S stImgOut; /* output picture */ + HI_U32 au32privateData[4]; /* task's private data */ + HI_U32 reserved; /* save current picture's state while debug */ +} FISHEYE_TASK_ATTR_S; + +typedef struct hiFISHEYE_ADD_PMF_S +{ + HI_S32 as32PMFCoef[9]; +} FISHEYE_ADD_PMF_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_FISHEYE_H__ */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_isp.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_isp.h new file mode 100644 index 0000000..bfb527a --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_isp.h @@ -0,0 +1,1364 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_isp.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2010/12/20 + Description : + History : + 1.Date : 2010/12/20 + Author : x00100808 + Modification: Created file + + 2.Date : 2014/04/24 + Author : y00246723 + Modification : Add ACM structure define + +******************************************************************************/ + +#ifndef __HI_COMM_ISP_H__ +#define __HI_COMM_ISP_H__ + +#include "hi_type.h" +#include "hi_errno.h" +#include "hi_common.h" +#include "hi_isp_debug.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +/**************************************************************************** + * MACRO DEFINITION * + ****************************************************************************/ + +#define VREG_MAX_NUM (16) + +#define AE_ZONE_ROW (15) +#define AE_ZONE_COLUMN (17) +#define AWB_ZONE_ROW (15) +#define AWB_ZONE_COLUMN (17) +#define AF_ZONE_ROW (15) +#define AF_ZONE_COLUMN (17) +#define LIGHTSOURCE_NUM (4) + +#define STATIC_DP_COUNT_MAX (2048) +#define GAMMA_NODE_NUM (257) +#define GAMMA_FE0_NODE_NUM (33) +#define GAMMA_FE1_NODE_NUM (257) +#define SHADING_MASH_NUM (289) + +#define DEFOG_ZONE_ROW (16) +#define DEFOG_ZONE_COLUMN (15) +#define DEFOG_ZONE_NUM (240) +#define DEFOG_MAX_ZONE_NUM (256) + +#define ISP_AUTO_ISO_STENGTH_NUM (16) + +#define ISP_MAX_SNS_REGS (16) +#define ISP_MAX_DEV_NUM (1) + +#define ISP_CAC_MAX_LUT_SIZE (64) + +#define RGBIR_MATRIX_NUM (15) + +#define AI_MAX_STEP_FNO_NUM (1024) + +/**************************************************************************** + * GENERAL STRUCTURES * + ****************************************************************************/ + +typedef enum hiISP_ERR_CODE_E +{ + ERR_ISP_NOT_INIT = 0x40, + ERR_ISP_MEM_NOT_INIT = 0x41, + ERR_ISP_ATTR_NOT_CFG = 0x42, + ERR_ISP_SNS_UNREGISTER = 0x43, + ERR_ISP_INVALID_ADDR = 0x44, + ERR_ISP_NOMEM = 0x45, +} ISP_ERR_CODE_E; + +#define HI_ERR_ISP_NULL_PTR HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_ISP_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_ISP_NOT_SUPPORT HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) + +#define HI_ERR_ISP_NOT_INIT HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_NOT_INIT) +#define HI_ERR_ISP_MEM_NOT_INIT HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_MEM_NOT_INIT) +#define HI_ERR_ISP_ATTR_NOT_CFG HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_ATTR_NOT_CFG) +#define HI_ERR_ISP_SNS_UNREGISTER HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_SNS_UNREGISTER) +#define HI_ERR_ISP_INVALID_ADDR HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_INVALID_ADDR) +#define HI_ERR_ISP_NOMEM HI_DEF_ERR(HI_ID_ISP, EN_ERR_LEVEL_ERROR, ERR_ISP_NOMEM) + + +typedef enum hiISP_OP_TYPE_E +{ + OP_TYPE_AUTO = 0, + OP_TYPE_MANUAL = 1, + OP_TYPE_BUTT +} ISP_OP_TYPE_E; + +typedef enum hiISP_STATE_E +{ + ISP_STATE_INIT = 0, + ISP_STATE_SUCCESS = 1, + ISP_STATE_TIMEOUT = 2, + ISP_STATE_BUTT +} ISP_STATUS_E; + +typedef enum hiISP_BAYER_FORMAT_E +{ + BAYER_RGGB = 0, + BAYER_GRBG = 1, + BAYER_GBRG = 2, + BAYER_BGGR = 3, + BAYER_BUTT +} ISP_BAYER_FORMAT_E; + +typedef struct hiISP_PUB_ATTR_S +{ + RECT_S stWndRect; /* RW. */ + HI_FLOAT f32FrameRate; /* RW. */ + ISP_BAYER_FORMAT_E enBayer; /* RW. */ +} ISP_PUB_ATTR_S; + +typedef enum hiISP_FMW_STATE_E +{ + ISP_FMW_STATE_RUN = 0, + ISP_FMW_STATE_FREEZE, + ISP_FMW_STATE_BUTT +} ISP_FMW_STATE_E; + +typedef struct hiISP_WDR_MODE_S +{ + WDR_MODE_E enWDRMode; +} ISP_WDR_MODE_S; + +typedef union hiISP_MODULE_CTRL_U +{ + HI_U32 u32Key; + struct + { + HI_U32 bitBypassVideoTest : 1 ; /* [0] */ + HI_U32 bitBypassBalanceFe : 1 ; /* [1] */ + HI_U32 bitBypassISPDGain : 1 ; /* [2] */ + HI_U32 bitBypassGammaFe : 1 ; /* [3] */ + HI_U32 bitBypassCrosstalkR : 1 ; /* [4] */ + HI_U32 bitBypassDPC : 1 ; /* [5] */ + HI_U32 bitBypassNR : 1 ; /* [6] */ + HI_U32 bitBypassDehaze : 1 ; /* [7] */ + HI_U32 bitBypassWBGain : 1 ; /* [8] */ + HI_U32 bitBypassShading : 1 ; /* [9] */ + HI_U32 bitBypassACM : 1 ; /* [10] */ + HI_U32 bitBypassDRC : 1 ; /* [11] */ + HI_U32 bitBypassDemosaic : 1 ; /* [12] */ + HI_U32 bitBypassColorMatrix: 1 ; /* [13] */ + HI_U32 bitBypassGamma : 1 ; /* [14] */ + HI_U32 bitBypassFSWDR : 1 ; /* [15] */ + HI_U32 bitGammaFePosition : 1 ; /* [16] */ + HI_U32 bit2Rsv3 : 2 ; /* [17:18] */ + HI_U32 bitBypassCsConv : 1 ; /* [19] */ + HI_U32 bit2Rsv4 : 2 ; /* [20:21] */ + HI_U32 bitBypassSharpen : 1 ; /* [22] */ + HI_U32 bitBypassUVNR : 1 ; /* [23] */ + HI_U32 bitChnSwitch : 1 ; /* [24] */ + HI_U32 bit2BypassMode : 2 ; /* [25:26] */ + HI_U32 bitBypassRGBIR : 1 ; /* [27] */ + HI_U32 bitBypassAll : 1 ; /* [28] */ + HI_U32 bit5Rsv5 : 3 ; /* [29:31] */ + }; +}ISP_MODULE_CTRL_U; + + +typedef enum hiISP_COMBINE_MODE_E +{ + FS_WDR_COMBINE_SHORT_FIRST = 0, /* Short exposure data is used when combining */ + FS_WDR_COMBINE_LONG_FIRST = 1, /* Long exposure data is used when combining */ + FS_WDR_COMBINE_BUTT +} ISP_COMBINE_MODE_E; +typedef struct hiISP_WDR_FS_ATTR_S +{ + HI_BOOL bMotionComp; /* RW, HI_TRUE: enable motion compensation; HI_FLASE: disable motion compensation*/ + HI_U16 u16ShortThresh; /* RW, Range: [0x0, 0xFFF]. Data above this threshold will be taken from short exposure only. + This value is normally not changed and should be left at the default value */ + HI_U16 u16LongThresh; /* RW, Range: [0x0, u16ShortThresh]. Data below this threshold will be taken from long exposure only. + This value is normally not changed and should be left at the default value */ + ISP_COMBINE_MODE_E enFSWDRComMode; + + ISP_OP_TYPE_E enExpRatioType; /* RW, OP_TYPE_AUTO: The ExpRatio used in ISP is generated by firmware; OP_TYPE_MANUAL: The ExpRatio used in ISP is set by u32ExpRatio */ + HI_U32 u32ExpRatio; /* RW, Range: [0x40, 0x400]. u32ExpRatio is quotient of long exposure time / short exposure time. + Format: unsigned 6.6-bit floating-point. Only valid when enExpRatioType is OP_TYPE_MANUAL */ +} ISP_WDR_FS_ATTR_S; + + +typedef struct hiISP_DRC_MANUAL_ATTR_S +{ + HI_U8 u8Strength; /* RW, Range: [0, 0xFF]. Strength of dynamic range compression. + Higher values lead to higher differential gain between shadows and highlights. */ +} ISP_DRC_MANUAL_ATTR_S; +typedef struct hiISP_DRC_AUTO_ATTR_S +{ + HI_U8 u8Strength; /* RO, Range: [0, 0xFF]. It is the base strength. The strength used in ISP is generated by firmware. + In linear mode, strength = f1(u8Strength, histogram, ISO) + In sensor WDR mode: strength = f2(u8Strength, histogram, ISO) + In 2to1 WDR mode: strength = f3(ExpRatio, ISO) */ +} ISP_DRC_AUTO_ATTR_S; + +typedef struct hiISP_DRC_ATTR_S +{ + HI_BOOL bEnable; + + HI_U8 u8SpatialVar; /*RW, Range: [0, 0xF].Controls the frequency of the spatial filter */ + HI_U8 u8RangeVar; /*RW, Range: [0, 0xF].Controls the frequency of the range filter*/ + + HI_U8 u8Asymmetry; /*RW, Range: [0x1,0x1E].The parameter0 of DRC tone mapping curve*/ + HI_U8 u8SecondPole; /*RW, Range: [0x96,0xD2].The parameter1 of DRC tone mapping curve*/ + HI_U8 u8Stretch; /*RW, Range: [0x1E,0x3C].The parameter2 of DRC tone mapping curve*/ + + HI_U8 u8LocalMixingBrigtht; /*RW, Range: [0x20,0x80]. Controls the gain of the details where the value of the area is greater than a certain threshold value */ + HI_U8 u8LocalMixingDark; /*RW, Range: [0x20,0x60]. Controls the gain of the details where the value of the area is smaller than a certain threshold value*/ + HI_U8 u8LocalMixingThres; /*RW, Range: [0x2,0xA].The threshold used to distinguish light and dark areas */ + + HI_U16 u16DarkGainLmtY; /*RW, Range: [0x840B,0x8771].Restricts the dark luminance gain*/ + HI_U16 u16DarkGainLmtC; /*RW, Range: [0x840B,0x8771].Restricts the dark chroma gain*/ + HI_U16 u16BrightGainLmt; /*RW, Range: [0xB,0x2D1].Restricts the bright luminance gain*/ + + ISP_OP_TYPE_E enOpType; + ISP_DRC_MANUAL_ATTR_S stManual; + ISP_DRC_AUTO_ATTR_S stAuto; +} ISP_DRC_ATTR_S; + +typedef enum hiISP_STATIC_DP_TYPE_E{ + ISP_STATIC_DP_BRIGHT = 0x0, + ISP_STATIC_DP_DARK, + ISP_STATIC_DP_BUTT +} ISP_STATIC_DP_TYPE_E; + + +typedef struct hiISP_DP_STATIC_CALIBRATE_S +{ + HI_BOOL bEnable; /* not support */ + HI_BOOL bEnableDetect; /* RW. Set 'HI_TRUE'to start static defect-pixel calibration, and firmware will set 'HI_FALSE' when finished. */ + + ISP_STATIC_DP_TYPE_E enStaticDPType; /* Select static bright/dark defect-pixel calibration. */ + HI_U8 u8StartThresh; /* RW, Range: [1, 0xFF]. Start threshold for static defect-pixel calibraiton.Default Value:31(0x1f).. */ + HI_U16 u16CountMax; /* RW, Range: [0, 0x3FF]. Limit of max number of static defect-pixel calibraiton.Default Value:256(0x100). */ + HI_U16 u16CountMin; /* RW, Range: [0, u16CountMax]. Limit of min number of static defect-pixel calibraiton.Default Value:64(0x40). */ + HI_U16 u16TimeLimit; /* RW, Range: [0x0, 0x640].Time limit for static defect-pixel calibraiton, in frame number.Default Value:1600(0x640). */ + + HI_U32 au32Table[STATIC_DP_COUNT_MAX]; /* RO, Static defect-pixel calibraiton table,the first 12 bits represents the X coordinate of the defect pixel, the second 12 bits represent the Y coordinate of the defect pixel. */ + HI_U8 u8FinishThresh; /* RO, Range: [0, 0xFF]. Finish threshold for static defect-pixel calibraiton. */ + HI_U16 u16Count; /* RO, Range: [0, 0x3FF]. Finish number for static defect-pixel calibraiton. */ + ISP_STATUS_E enStatus; /* RO, Status of static defect-pixel calibraiton.Default Value:0(0x0). */ +} ISP_DP_STATIC_CALIBRATE_S; + +typedef struct hiISP_DP_STATIC_ATTR_S +{ + HI_BOOL bEnable; /* RW. Enable/disable the static defect-pixel module.Default Value:1(0x1). */ + HI_U16 u16BrightCount; /* RW, When used as input(W), indicate the number of static bright defect pixels; As output(R),indicate the number of static bright and dark defect pixels */ + HI_U16 u16DarkCount; /* RW, When used as input(W), indicate the number of static dark defect pixels; As output(R), invalid value 0 */ + HI_U32 au32BrightTable[STATIC_DP_COUNT_MAX]; /* RW, Range: [0x0, 0x3FFFFF],the first 12 bits represents the X coordinate of the defect pixel, the second 12 bits represent the Y coordinate of the defect pixel + Notice : When used as input(W), indicate static bright defect pixels table; As output(R), indicate static bright and dark defect pixels table */ + HI_U32 au32DarkTable[STATIC_DP_COUNT_MAX]; /* RW, Range: [0x0, 0x3FFFFF],the first 12 bits represents the X coordinate of the defect pixel, the second 12 bits represent the Y coordinate of the defect pixel + Notice : When used as input(W), indicate static dark defect pixels table; As output(R), invalid value */ + HI_BOOL bShow; /*RW,highlight static defect pixel,default value:0x0*/ +} ISP_DP_STATIC_ATTR_S; + +typedef struct hiISP_DP_DYNAMIC_MANUAL_ATTR_S +{ + HI_U16 u16Slope; /* RW, Range: [0x0, 0x3] */ + HI_U16 u16Thresh; /* not support */ + HI_U16 u16LineThresh; /* not support */ + HI_U16 u16HpThresh; /* not support */ + HI_U16 u16BlendRatio; /* RW, Range: [0x0, 0x100] */ +} ISP_DP_DYNAMIC_MANUAL_ATTR_S; + +typedef struct hiISP_DP_DYNAMIC_AUTO_ATTR_S +{ + HI_U16 au16Slope[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range: [0x0, 0x3] */ + HI_U16 u16Thresh; /* not support */ + HI_U16 u16LineThresh; /* not support */ + HI_U16 u16HpThresh; /* not support */ + HI_U16 au16BlendRatio[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range: [0x0, 0x100] */ +} ISP_DP_DYNAMIC_AUTO_ATTR_S; + +typedef struct hiISP_DP_DYNAMIC_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_DP_DYNAMIC_MANUAL_ATTR_S stManual; + ISP_DP_DYNAMIC_AUTO_ATTR_S stAuto; +} ISP_DP_DYNAMIC_ATTR_S; +typedef struct hiISP_DIS_ATTR_S +{ + HI_BOOL bEnable; +} ISP_DIS_ATTR_S; + + + +typedef struct hiISP_SHADING_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + HI_U32 au32RGain[SHADING_MASH_NUM]; + HI_U32 au32GrGain[SHADING_MASH_NUM]; + HI_U32 au32GbGain[SHADING_MASH_NUM]; + HI_U32 au32BGain[SHADING_MASH_NUM]; +} ISP_SHADING_ATTR_S; + +typedef enum hiISP_IRPOS_TYPE_E +{ + ISP_IRPOS_TYPE_GR = 0x0, + ISP_IRPOS_TYPE_GB, + ISP_IRPOS_TYPE_BUTT +}ISP_IRPOS_TYPE_E; + +typedef struct hiISP_RGBIR_ATTR_S +{ + HI_BOOL bEnable; /*RW, Range: [false, true] Rgbir moudle enable */ + ISP_IRPOS_TYPE_E enIrPosType; /*RW, Range: [0, 1] Rgbir moudle ir position: 0 Gr, 1 Gb */ + HI_U16 u16OverExpThresh; /*RW, Range: [0,4095] Rgbir moudle over exposure threshold*/ +}ISP_RGBIR_ATTR_S; + +typedef struct hiISP_RGBIR_CTRL_S +{ + HI_BOOL bIrOutEn; /*RW, Range: [false, true] Rgbir moudle output ir image enable */ + HI_BOOL bIrFilterEn; /*RW, Range: [false, true] Rgbir moudle noise filter enable */ + HI_BOOL bRemovelEn; /*RW, Range: [false, true] Rgbir moudle removel ir enable */ + ISP_OP_TYPE_E enCompType; /*RW, Range: [false, true] Rgbir moudle after removel ir, compensation type 0:auto,1:manul */ + HI_U16 u16ManuGain; /*RW, Range: [256,1023] Rgbir moudle after removel ir, manul-compensation gain,2bit integer,8bit decimal */ + HI_S16 as16ScaleCoef[RGBIR_MATRIX_NUM]; /*RW, Range: [-512,511] Rgbir moudle removel ir translate matrix,bit9:signed bit,bit8:integer bit,bit7_0:decimal bit*/ +}ISP_RGBIR_CTRL_S; + +typedef struct hiISP_NR_MANUAL_ATTR_S +{ + HI_U8 u8Strength; //not support + HI_U8 u8VarStrength; + HI_U8 u8FixStrength; + HI_U8 u8LowFreqSlope; + HI_U16 u16Threshold; /*Range: [0x0,0xFFF]*/ +} ISP_NR_MANUAL_ATTR_S; + +typedef struct hiISP_NR_AUTO_ATTR_S +{ + HI_U8 au8Strength[ISP_AUTO_ISO_STENGTH_NUM]; //not support + HI_U8 au8FixStrength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8VarStrength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8LowFreqSlope[ISP_AUTO_ISO_STENGTH_NUM]; /*Range: [0x0,0x10]*/ + HI_U16 au16Threshold[ISP_AUTO_ISO_STENGTH_NUM]; /*Range: [0x0,0xFFF]*/ +} ISP_NR_AUTO_ATTR_S; + +typedef struct hiISP_NR_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_NR_MANUAL_ATTR_S stManual; + ISP_NR_AUTO_ATTR_S stAuto; +} ISP_NR_ATTR_S; + +typedef enum hiISP_GAMMA_CURVE_TYPE_E +{ + ISP_GAMMA_CURVE_DEFAULT = 0x0, /* default Gamma curve */ + ISP_GAMMA_CURVE_SRGB, + ISP_GAMMA_CURVE_USER_DEFINE, /* user defined Gamma curve, Gamma Table must be correct */ + ISP_GAMMA_CURVE_BUTT +} ISP_GAMMA_CURVE_TYPE_E; +typedef struct hiISP_GAMMA_ATTR_S +{ + HI_BOOL bEnable; + + ISP_GAMMA_CURVE_TYPE_E enCurveType; + HI_U16 u16Table[GAMMA_NODE_NUM]; +} ISP_GAMMA_ATTR_S; + +typedef struct hiISP_GAMMAFE_ATTR_S +{ + HI_BOOL bEnable; + + HI_U16 u16Table[GAMMA_FE0_NODE_NUM + GAMMA_FE1_NODE_NUM]; /* only for WDR sensor mode */ +} ISP_GAMMAFE_ATTR_S; + +typedef struct hiISP_SHARPEN_MANUAL_ATTR_S +{ + HI_BOOL bEnLowLumaShoot; + HI_U8 u8SharpenD; //Sharpen strength of Edge, range [0: 255], equal to maxEdgeAmt in fw. + HI_U8 u8SharpenUd; //Sharpen strength of detail, range [0: 255], equal to maxSharpAmt1 in fw + HI_U8 u8OverShoot; // range [0: 255] + HI_U8 u8UnderShoot; // range [0: 255] + HI_U8 u8TextureNoiseThd; // range [0: 255] + HI_U8 u8EdgeNoiseThd; // range [0: 255] + +} ISP_SHARPEN_MANUAL_ATTR_S; +typedef struct hiISP_SHARPEN_AUTO_ATTR_S +{ + HI_BOOL abEnLowLumaShoot [ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8SharpenD [ISP_AUTO_ISO_STENGTH_NUM]; //Sharpen strength of Edge, range [0: 255], equal to maxEdgeAmt in fw. + HI_U8 au8SharpenUd [ISP_AUTO_ISO_STENGTH_NUM]; //Sharpen strength of detail, range [0: 255], equal to maxSharpAmt1 in fw + HI_U8 au8OverShoot [ISP_AUTO_ISO_STENGTH_NUM]; // range [0: 255] + HI_U8 au8UnderShoot[ISP_AUTO_ISO_STENGTH_NUM]; // range [0: 255] + HI_U8 au8TextureNoiseThd[ISP_AUTO_ISO_STENGTH_NUM]; // range [0: 255] + HI_U8 au8EdgeNoiseThd[ISP_AUTO_ISO_STENGTH_NUM]; // range [0: 255] +} ISP_SHARPEN_AUTO_ATTR_S; + +typedef struct hiISP_SHARPEN_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_SHARPEN_MANUAL_ATTR_S stManual; + ISP_SHARPEN_AUTO_ATTR_S stAuto; +} ISP_SHARPEN_ATTR_S; + +typedef struct hiISP_UVNR_MANUAL_ATTR_S +{ + HI_U8 u8ColorCast; /* RW, Range:[0, 3]. equal to coring limit in fw */ + HI_U8 u8UvnrThreshold; /* RW, Range:[0, 64]. */ + HI_U8 u8UvnrStrength; /* RW, Range:[0, 34]. */ //0: Med & UVNR all close; 1: Med open, UVNR close; 2---34oMed Close, UNVR open; +} ISP_UVNR_MANUAL_ATTR_S; + +typedef struct hiISP_UVNR_AUTO_ATTR_S +{ + HI_U8 au8ColorCast[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range:[0, 64]. */ + HI_U8 au8UvnrThreshold[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range:[0, 64]. */ + HI_U8 au8UvnrStrength[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range:[0, 34]. */ +} ISP_UVNR_AUTO_ATTR_S; + +typedef struct hiISP_UVNR_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_UVNR_MANUAL_ATTR_S stManual; + ISP_UVNR_AUTO_ATTR_S stAuto; +} ISP_UVNR_ATTR_S; +/*Crosstalk Removal*/ +typedef struct hiISP_CR_ATTR_S +{ + HI_BOOL bEnable; + HI_U16 au16Strength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U16 u16Threshold; + HI_U8 u8Slope; + HI_U8 u8Sensitivity; + HI_U16 u16SensiThreshold; +}ISP_CR_ATTR_S; + +typedef struct hiISP_ANTI_FALSECOLOR_MANUAL_S +{ + HI_U8 u8Strength; + HI_U8 u8Threshold; +} ISP_ANTI_FALSECOLOR_MANUAL_S; + +typedef struct hiISP_ANTI_FALSECOLOR_AUTO_ATTR_S +{ + HI_U8 au8Strength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8Threshold[ISP_AUTO_ISO_STENGTH_NUM]; +} ISP_ANTI_FALSECOLOR_AUTO_ATTR_S; + +typedef struct hiISP_ANTI_FALSECOLOR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + ISP_ANTI_FALSECOLOR_MANUAL_S stManual; + ISP_ANTI_FALSECOLOR_AUTO_ATTR_S stAuto; +} ISP_ANTI_FALSECOLOR_S; + +typedef enum hiISP_DEMOSAIC_CFG_E +{ + ISP_DEMOSAIC_CFG_DEFAULT = 0, + ISP_DEMOSAIC_CFG_VH, + ISP_DEMOSAIC_CFG_AA, + ISP_DEMOSAIC_CFG_VA, + ISP_DEMOSAIC_CFG_UU, + + ISP_DEMOSAIC_CFG_BUTT, +} ISP_DEMOSAIC_CFG_E; + +typedef struct hiISP_DEMOSAIC_ATTR_S +{ + HI_U16 u16VhSlope; /* RW,Range: [0x0, 0xFF] */ + HI_U16 u16AaSlope; /* not support */ + HI_U16 u16VaSlope; /* not support */ + HI_U16 u16UuSlope; /* RW,Range: [0x0, 0x3FF] */ + HI_U8 u8VhLimit; /* RW,Range: [0x0, 0xFF] */ + HI_U8 u8VhOffset; /* RW,Range: [0x0, 0xFF] */ + HI_U16 u16VhThresh; /* not support */ + HI_U16 u16AaThresh; /* not support */ + HI_U16 u16VaThresh; /* not support */ + HI_U16 u16UuThresh; /* not support */ + ISP_DEMOSAIC_CFG_E enCfgType; /* not support*/ + HI_U16 au16LumThresh[ISP_AUTO_ISO_STENGTH_NUM]; /* NOT SUPPORT */ + HI_U16 au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]; /* RW, Range:[0x0, 0x3FF] */ +}ISP_DEMOSAIC_ATTR_S; + +typedef struct hiISP_BLACK_LEVEL_S +{ + HI_U16 au16BlackLevel[4]; /* RW, Range: [0x0, 0xFFF]*/ +} ISP_BLACK_LEVEL_S; + +/* FPN */ +typedef enum hiISP_FPN_TYPE_E +{ + ISP_FPN_TYPE_FRAME = 0, + ISP_FPN_TYPE_LINE = 1, + ISP_FPN_TYPE_BUTT +}ISP_FPN_TYPE_E; + +typedef struct hiISP_FPN_FRAME_INFO_S +{ + HI_U32 u32Iso; /* FPN CALIBRATE ISO */ + HI_U32 u32Offset; /* FPN frame u32Offset (agv pixel value) */ + HI_U32 u32FrmSize; /* FPN frame size (exactly frm size or compress len) */ + VIDEO_FRAME_INFO_S stFpnFrame; /* FPN frame info, 8bpp,10bpp,12bpp,16bpp. Compression or not */ +}ISP_FPN_FRAME_INFO_S; + +typedef struct hiISP_FPN_CALIBRATE_ATTR_S +{ + HI_U32 u32Threshold; /* pix value > threshold means defective pixel, [1, 0xFFF] */ + HI_U32 u32FrameNum; /* value is 2^N, range: [1, 16] */ + ISP_FPN_TYPE_E enFpnType; /* frame mode or line mode */ + ISP_FPN_FRAME_INFO_S stFpnCaliFrame; +}ISP_FPN_CALIBRATE_ATTR_S; + +typedef struct hiISP_FPN_MANUAL_ATTR_S +{ + HI_U32 u32Strength; /* gain, RW fp 4.8 */ +}ISP_FPN_MANUAL_ATTR_S; + +typedef struct hiISP_FPN_AUTO_ATTR_S +{ + HI_U32 u32Strength; /* gain, RO fp 4.8 */ +}ISP_FPN_AUTO_ATTR_S; + +typedef struct hiISP_FPN_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; /* manual or auto mode */ + ISP_FPN_TYPE_E enFpnType; /* frame mode or line mode */ + ISP_FPN_FRAME_INFO_S stFpnFrmInfo; /* input in correction mode. */ + ISP_FPN_MANUAL_ATTR_S stManual; + ISP_FPN_AUTO_ATTR_S stAuto; +}ISP_FPN_ATTR_S; + +typedef struct hiISP_BLC_ATTR_S +{ + HI_BOOL bEnable; + + HI_U32 u32ROffset; /* WO, R component */ + HI_U32 u32GROffset; /* WO, GR component */ + HI_U32 u32BOffset; /* WO, B component */ + HI_U32 u32GBOffset; /* WO, GB component */ +}ISP_BLC_ATTR_S; + +/* DeFog */ +typedef struct hiISP_DEFOG_MANUAL_ATTR_S +{ + HI_U8 u8strength; +}ISP_DEFOG_MANUAL_ATTR_S; + +typedef struct hiISP_DEFOG_AUTO_ATTR_S +{ + HI_U8 u8strength; +}ISP_DEFOG_AUTO_ATTR_S; + +typedef struct hiISP_DEFOG_ATTR_S +{ + HI_BOOL bEnable; + HI_U8 u8HorizontalBlock; /* RW,Range: [0x1, 0x10] */ + HI_U8 u8VerticalBlock; /* RW,Range: [0x1, 0xF] */ + ISP_OP_TYPE_E enOpType; + ISP_DEFOG_MANUAL_ATTR_S stManual; + ISP_DEFOG_AUTO_ATTR_S stAuto; +}ISP_DEFOG_ATTR_S; + +/********************** ACM **************************************/ + +typedef enum hiISP_ACM_MODE_E +{ + ISP_ACM_MODE_BLUE = 0, + ISP_ACM_MODE_GREEN , + ISP_ACM_MODE_BG , + ISP_ACM_MODE_SKIN , + ISP_ACM_MODE_VIVID , + ISP_ACM_MODE_BUTT + +} ISP_ACM_MODE_E; + +typedef struct +{ + HI_BOOL bEnable ; + HI_BOOL bDemoEnable ;/*0-debug closed; 1-debug open, the left screen is original video and the right screen is ACM-processed video*/ + ISP_ACM_MODE_E enMode ; + HI_U32 u32Stretch ; /*input data Clip range: 0-Y 64-940, C 64-960; 1-Y 0-1023, C 0-1023*/ + HI_U32 u32ClipRange ; /*output data Clip range: 0-Y 64-940, C 64-960; 1-Y 0-1023, C 0-1023*/ + HI_U32 u32AcmClipOrWrap; /*0-wrap around; 1-clip*/ + HI_U32 u32CbcrThr ; /* [0,255]*/ + HI_U32 u32GainLuma ; /* [0,512]*/ + HI_U32 u32GainHue ; /* [0,512]*/ + HI_U32 u32GainSat ; /* [0,512]*/ +} +ISP_ACM_ATTR_S; + +#define ACM_Y_NUM 5 +#define ACM_H_NUM 29 +#define ACM_S_NUM 7 + +typedef struct hi_ISP_ACM_LUT_S +{ + HI_S16 as16Y[ACM_Y_NUM][ACM_S_NUM][ACM_H_NUM]; /**< */ + HI_S16 as16H[ACM_Y_NUM][ACM_S_NUM][ACM_H_NUM]; /**< */ + HI_S16 as16S[ACM_Y_NUM][ACM_S_NUM][ACM_H_NUM]; /**< */ +}ISP_ACM_LUT_S; + +typedef struct hi_ISP_ACM_COEF_S +{ + ISP_ACM_LUT_S stLut; + ISP_ACM_MODE_E enMode; +}ISP_ACM_COEF_S; + +typedef struct hiISP_INNER_STATE_INFO_S +{ + HI_U32 u32DRCStrengthActual; + HI_U32 u32NRStrengthActual; /*not support*/ + HI_U32 u32SharpenStrengthDActual; + HI_U32 u32SharpenStrengthUdActual; + HI_U32 u32SharpenStrengthRGBActual; /*not support*/ + HI_U32 u32DefogStrengthActual; + + HI_BOOL bWDRSwitchFinish; /*not support*/ + HI_BOOL bResSwitchFinish; /*not support*/ +} ISP_INNER_STATE_INFO_S; + + +typedef enum hiISP_AE_SWITCH_E +{ + ISP_AE_AFTER_STATIC_WB = 0 , + ISP_AE_FROM_SENSOR_CHANNEL_1 , /*not support*/ + ISP_AE_AFTER_SHADING , /*not support*/ + ISP_AE_AFTER_GAMMA_FE , /*not support*/ + ISP_AE_AFTER_DRC , + ISP_AE_FROM_SENSOR_CHANNEL_2 , /*not support*/ + ISP_AE_AFTER_WDR_STITCH , /*not support*/ + ISP_AE_AFTER_BLC_CHANNEL_2 , /*not support*/ + ISP_AE_AFTER_DG , + ISP_AE_SWITCH_BUTT +} ISP_AE_SWITCH_E; + + +typedef enum hiISP_AE_HIST_SWITCH_E +{ + ISP_AE_HIST_SAME_AS_AE = 0, + ISP_AE_HIST_FROM_SENSOR_CHANNEL_1 , + ISP_AE_HIST_AFTER_SHADING , + ISP_AE_HIST_AFTER_GAMMA_FE , + ISP_AE_HIST_AFTER_DRC , + ISP_AE_HIST_FROM_SENSOR_CHANNEL_2 , + ISP_AE_HIST_AFTER_WDR_STITCH , + ISP_AE_HIST_AFTER_BLC_CHANNEL_2, + ISP_AE_HIST_SWITCH_BUTT +} ISP_AE_HIST_SWITCH_E; + + +/* config of statistics structs */ +typedef struct hiISP_AE_STATISTICS_CFG_S +{ + HI_U8 au8HistThresh[4]; /*RW, Histogram threshold for bin 0/1 1/2 2/3 3/4 boundary, Range: [0x0, 0xFF]*/ + ISP_AE_SWITCH_E enAESwitch; /*RW, The position of AE statistics module in ISP pipeline, 3518EV200 AE statistics here include Global 256 bins histogram, Global average and zone average */ + /* 0 = After DG; 1 = After static WB */ + /* 2 = After DRC; */ + + ISP_AE_HIST_SWITCH_E enHistSwitch; /*RW, The position of Global 256 bins histogram in ISP pipeline*/ + /* 0 = Same as AE; 1 = Immediately from sensor, channel 1 (for WDR modes); */ + /* 2 = After shading; 3 = After Gamma FE; */ + /* 4 = After DRC; 5 = Immediately from sensor, channel 2 (for WDR modes); */ + /* 6 = After WDR stitch; 7 = After BLC, channel 2 (for WDR modes);*/ + + ISP_AE_SWITCH_E enAESumSwitch; /*RW, The position of Global average and zone average in ISP pipeline*/ + /* 0 = After static WB; 1 = Immediately from sensor, channel 1 (for WDR modes); */ + /* 2 = After shading; 3 = After Gamma FE; */ + /* 4 = After DRC; 5 = Immediately from sensor, channel 2 (for WDR modes); */ + /* 6 = After WDR stitch; 7 = After BLC, channel 2 (for WDR modes);*/ +} ISP_AE_STATISTICS_CFG_S; + +typedef struct hiISP_WB_STATISTICS_CFG_PARA_S +{ + HI_U16 u16WhiteLevel; /*RW, Upper limit of valid data for white region, Range: [0x0, 0xFFF] for Bayer statistics, [0x0, 0x3FF] for RGB statistics*/ + HI_U16 u16BlackLevel; /*RW, Lower limit of valid data for white region, Range: [0x0, u16WhiteLevel]. for Bayer statistics, bitwidth is 12, for RGB statistics, bitwidth is 10*/ + HI_U16 u16CbMax; /*RW, Maximum value of B/G for white region, Range: [0x0,0xFFF]*/ + HI_U16 u16CbMin; /*RW, Minimum value of B/G for white region, Range: [0x0, u16CbMax]*/ + HI_U16 u16CrMax; /*RW, Maximum value of R/G for white region, Range: [0x0, 0xFFF]*/ + HI_U16 u16CrMin; /*RW, Minimum value of R/G for white region, Range: [0x0, u16CrMax]*/ + HI_U16 u16CbHigh; /*RW, hexagon limit, Range: [u16CbMin, u16CbMax], Axis is [u16CrMax, u16CbHigh]*/ + HI_U16 u16CbLow; /*RW, hexagon limit, Range: [u16CbMin, u16CbMax], Axis is [u16CrMin, u16CbLow]*/ + HI_U16 u16CrHigh; /*RW, hexagon limit, Range: [u16CrMin, u16CrMax], Axis is [u16CrHigh, u16CbMax]*/ + HI_U16 u16CrLow; /*RW, hexagon limit, Range: [u16CrMin, u16CrMax], Axis is [u16CrLow, u16CbMin]*/ +} ISP_WB_STATISTICS_CFG_PARA_S; +typedef struct hiISP_WB_STATISTICS_CFG_S +{ + ISP_WB_STATISTICS_CFG_PARA_S stBayerCfg; + ISP_WB_STATISTICS_CFG_PARA_S stRGBCfg; /*Hi3518EV200 does't support RGB Statistics*/ +} ISP_WB_STATISTICS_CFG_S; + +typedef enum hiISP_AF_PEAK_MODE_E +{ + ISP_AF_STA_NORM = 0, /* use every value of the block statistic*/ + ISP_AF_STA_PEAK , /* use the maximum value in one line of the block statistic*/ + ISP_AF_STA_BUTT +}ISP_AF_PEAK_MODE_E; + +typedef enum hiISP_AF_SQU_MODE_E +{ + ISP_AF_STA_SUM_NORM = 0, /* statistic value accumlate*/ + ISP_AF_STA_SUM_SQU , /* statistic value square then accumlate*/ + ISP_AF_STA_SUM_BUTT +}ISP_AF_SQU_MODE_E; + +typedef enum hiISP_AF_STATISTICS_POS_E +{ + ISP_AF_STATISTICS_YUV = 0, + ISP_AF_STATISTICS_RAW , + ISP_AF_STATISTICS_BUTT + +}ISP_AF_STATISTICS_POS_E; + +typedef struct hiISP_AF_CFG_S +{ + HI_BOOL bEnable; /* RW, Range: [0,1]. AF enable. */ + HI_U16 u16Hwnd; /* RW, Range: [1, 17]. AF statistic window horizontal block. */ + HI_U16 u16Vwnd; /* RW, Range: [1, 15]. AF statistic window veritical block. */ + HI_U16 u16Hsize; /* RW, Range: [0x0, 0xFFF]. AF image wide. */ + HI_U16 u16Vsize; /* RW, Range: [0x0, 0xFFF]. AF image hight. */ + ISP_AF_PEAK_MODE_E enPeakMode; /* RW, Range: [0,1]. AF peak value statistic mode. */ + ISP_AF_SQU_MODE_E enSquMode; /* RW, Range: [0,1]. AF statistic square accumulate. */ + ISP_AF_STATISTICS_POS_E enStatisticsPos; /* RW, Range: [0,1]. AF statistic position, it can be set to yuv or raw */ +}ISP_AF_CFG_S; + +typedef struct hiISP_AF_H_PARAM_S +{ + HI_BOOL abIIREn[3]; /* RW, Range: [0, 1]. IIR enable. */ + HI_S16 as16IIRGain[7]; /* RW, Range: gain0:[0,255]; others:[-511, 511]. IIR gain. */ + HI_U16 au16IIRShift[4]; /* RW, Range: [0x0, 0xF]. IIR shift. */ + HI_U16 u16IIRThd; /* RW, Range: [0x0, 0x7FF]. IIR threshold. */ +}ISP_AF_H_PARAM_S; + +typedef struct hiISP_AF_V_PARAM_S +{ + HI_S16 as16FIRH[5]; /* RW, Range: [-31, 31]. FIR gain. */ + HI_U16 u16FIRThd; /* RW, Range: [0x0, 0x7FF]. FIR threshold. */ +}ISP_AF_V_PARAM_S; + +typedef struct hiISP_AF_FV_PARAM_S +{ + HI_U16 u16AccShiftY; /* RW, Range: [0x0, 0xF]. luminance Y statistic shift. */ + HI_U16 au16AccShiftH[2]; /* RW, Range: [0x0, 0xF]. IIR statistic shift. */ + HI_U16 au16AccShiftV[2]; /* RW, Range: [0x0, 0xF]. FIR statistic shift. */ +}ISP_AF_FV_PARAM_S; + +typedef struct hiISP_FOCUS_STATISTICS_CFG_S +{ + ISP_AF_CFG_S stConfig; + ISP_AF_H_PARAM_S stHParam_IIR0; + ISP_AF_H_PARAM_S stHParam_IIR1; + ISP_AF_V_PARAM_S stVParam_FIR0; + ISP_AF_V_PARAM_S stVParam_FIR1; + ISP_AF_FV_PARAM_S stFVParam; +} ISP_FOCUS_STATISTICS_CFG_S; + +typedef union hiISP_STATISTICS_CTRL_U +{ + HI_U32 u32Key; + struct + { + HI_U32 bit1AeStat1 : 1 ; /* [0] */ /* not support */ + HI_U32 bit1AeStat2 : 1 ; /* [1] */ /* not support */ + HI_U32 bit1AeStat3 : 1 ; /* [2] */ + HI_U32 bit1AeStat4 : 1 ; /* [3] */ + HI_U32 bit1AeStat5 : 1 ; /* [4] */ + HI_U32 bit1AwbStat1 : 1 ; /* [5] */ + HI_U32 bit1AwbStat2 : 1 ; /* [6] */ + HI_U32 bit1AwbStat3 : 1 ; /* [7] */ + HI_U32 bit1AwbStat4 : 1 ; /* [8] */ + HI_U32 bit1AfStat : 1 ; /* [9] */ + HI_U32 bit22Rsv : 22; /* [10:31] */ + }; +}ISP_STATISTICS_CTRL_U; + +typedef struct hiISP_STATISTICS_CFG_S +{ + ISP_STATISTICS_CTRL_U unKey; + ISP_AE_STATISTICS_CFG_S stAECfg; + ISP_WB_STATISTICS_CFG_S stWBCfg; + ISP_FOCUS_STATISTICS_CFG_S stFocusCfg; +} ISP_STATISTICS_CFG_S; + +/* statistics structs */ +typedef struct hiISP_AE_STATISTICS_S +{ + HI_U16 au16Hist5Value[5]; /*RO, Global 5 bins histogram, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneHist5Value[AE_ZONE_ROW][AE_ZONE_COLUMN][5]; /*RO, Zone 5 bins histogram,Range: [0x0, 0xFFFF]*/ + HI_U32 au32Hist256Value[256]; /*RO, Global 256 bins histogram,Range: [0x0, 0xFFFFFFFF]*/ + HI_U16 au16GlobalAvg[4]; /*RO, Global average value, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneAvg[AE_ZONE_ROW][AE_ZONE_COLUMN][4]; /*RO, Zone average value, Range: [0x0, 0xFFFF]*/ +}ISP_AE_STATISTICS_S; + +typedef struct hiISP_WB_BAYER_STATISTICS_S +{ + HI_U16 u16GlobalR; /*RO, Global WB output Average R, Range: [0x0, 0xFFFF]*/ + HI_U16 u16GlobalG; /*RO, Global WB output Average G, Range: [0x0, 0xFFFF]*/ + HI_U16 u16GlobalB; /*RO, Global WB output Average B, Range: [0x0, 0xFFFF]*/ + HI_U16 u16CountAll; /*RO, normalized number of Gray points, Range: [0x0, 0xFFFF]*/ + HI_U16 u16CountMin; /*RO, normalized number of pixels under BlackLevel, Range: [0x0, 0xFFFF]*/ + HI_U16 u16CountMax; /*RO, normalized number of pixels above Whitelevel, Range: [0x0, 0xFFFF], u16CountAll + u16CountMin + u16CountMax = 0xFFFF*/ + + HI_U16 au16ZoneAvgR[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone Average R, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneAvgG[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone Average G, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneAvgB[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone Average B, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneCountAll[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, normalized number of Gray points, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneCountMin[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, normalized number of pixels under BlackLevel, Range: [0x0, 0xFFFF]*/ + HI_U16 au16ZoneCountMax[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, normalized number of pixels above Whitelevel, Range: [0x0, 0xFFFF]*/ +} ISP_WB_BAYER_STATISTICS_INFO_S; + +typedef struct hiISP_WB_RGB_STATISTICS_S +{ + HI_U16 u16GlobalGR; /*RO, Global WB output G/R, 4.8-bit fix-point, Range: [0x0, 0xFFF]*/ + HI_U16 u16GlobalGB; /*RO, Global WB output G/B, 4.8-bit fix-point, Range: [0x0, 0xFFF]*/ + HI_U32 u32GlobalSum; /*RO, Global WB output population*/ + + HI_U16 au16ZoneGR[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone WB output G/R, 4.8-bit fix-point, Range: [0x0, 0xFFF]*/ + HI_U16 au16ZoneGB[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone WB output G/B, 4.8-bit fix-point, Range: [0x0, 0xFFF]*/ + HI_U32 au32ZoneSum[AWB_ZONE_ROW][AWB_ZONE_COLUMN]; /*RO, Zone WB output population*/ +} ISP_WB_RGB_STATISTICS_INFO_S; + +typedef struct hiISP_WB_STATISTICS_S +{ + ISP_WB_BAYER_STATISTICS_INFO_S stBayerStatistics; + ISP_WB_RGB_STATISTICS_INFO_S stRGBStatistics; /* Hi3518EV200 does't support RGB Statistics */ +} ISP_WB_STATISTICS_S; + +// TODO: need to check +typedef struct hiISP_FOCUS_ZONE_S +{ + HI_U16 u16v1; + HI_U16 u16h1; + HI_U16 u16v2; + HI_U16 u16h2; + HI_U16 u16y; +} ISP_FOCUS_ZONE_S; +typedef struct hiISP_FOCUS_STATISTICS_S +{ + ISP_FOCUS_ZONE_S stZoneMetrics[AF_ZONE_ROW][AF_ZONE_COLUMN]; /*RO, The zoned measure of contrast*/ +} ISP_FOCUS_STATISTICS_S; + +typedef struct hiISP_STATISTICS_S +{ + ISP_AE_STATISTICS_S stAEStat; + ISP_WB_STATISTICS_S stWBStat; + ISP_FOCUS_STATISTICS_S stFocusStat; +} ISP_STATISTICS_S; + + +/*ISP debug information*/ +typedef struct hiISP_DEBUG_INFO_S +{ + HI_BOOL bDebugEn; /*RW, 1:enable debug, 0:disable debug*/ + HI_U32 u32PhyAddr; /*RW, phy address of debug info */ + HI_U32 u32Depth; /*RW, depth of debug info */ +} ISP_DEBUG_INFO_S; + +typedef struct hiISP_DBG_ATTR_S +{ + HI_U32 u32Rsv; /* need to add member */ +} ISP_DBG_ATTR_S; + +typedef struct hiISP_DBG_STATUS_S +{ + HI_U32 u32FrmNumBgn; + HI_U32 u32Rsv; /* need to add member */ + HI_U32 u32FrmNumEnd; +} ISP_DBG_STATUS_S; + +typedef enum hiISP_SNS_TYPE_E +{ + ISP_SNS_I2C_TYPE = 0, + ISP_SNS_SSP_TYPE, + + ISP_SNS_TYPE_BUTT, +} ISP_SNS_TYPE_E; + +typedef struct hiISP_I2C_DATA_S +{ + HI_BOOL bUpdate; + HI_U8 u8DelayFrmNum; + + HI_U8 u8DevAddr; + HI_U32 u32RegAddr; + HI_U32 u32AddrByteNum; + HI_U32 u32Data; + HI_U32 u32DataByteNum; +} ISP_I2C_DATA_S; + +typedef struct hiISP_SSP_DATA_S +{ + HI_BOOL bUpdate; + HI_U8 u8DelayFrmNum; + + HI_U32 u32DevAddr; + HI_U32 u32DevAddrByteNum; + HI_U32 u32RegAddr; + HI_U32 u32RegAddrByteNum; + HI_U32 u32Data; + HI_U32 u32DataByteNum; +} ISP_SSP_DATA_S; + +typedef struct hiISP_SNS_REGS_INFO_S +{ + ISP_SNS_TYPE_E enSnsType; + HI_U32 u32RegNum; + HI_U8 u8Cfg2ValidDelayMax; + + union + { + ISP_I2C_DATA_S astI2cData[ISP_MAX_SNS_REGS]; + ISP_SSP_DATA_S astSspData[ISP_MAX_SNS_REGS]; + }; +} ISP_SNS_REGS_INFO_S; + +typedef struct hiISP_VD_INFO_S +{ + HI_U32 u32Reserved; /*RO, Range: [0x0, 0xFFFFFFFF] */ +}ISP_VD_INFO_S; + + +typedef struct hiISP_REG_ATTR_S +{ + HI_U32 u32IspRegAddr; + HI_U32 u32IspRegSize; + HI_U32 u32IspExtRegAddr; + HI_U32 u32IspExtRegSize; + HI_U32 u32AeExtRegAddr; + HI_U32 u32AeExtRegSize; + HI_U32 u32AwbExtRegAddr; + HI_U32 u32AwbExtRegSize; +} ISP_REG_ATTR_S; + + +/******************************************************/ +/********************* AI structs ************************/ + +typedef enum hiISP_IRIS_TYPE_E +{ + ISP_IRIS_DC_TYPE = 0, + ISP_IRIS_P_TYPE, + + ISP_IRIS_TYPE_BUTT, +} ISP_IRIS_TYPE_E; + +typedef enum hiISP_IRIS_F_NO_E +{ + ISP_IRIS_F_NO_32_0 = 0, + ISP_IRIS_F_NO_22_0, + ISP_IRIS_F_NO_16_0, + ISP_IRIS_F_NO_11_0, + ISP_IRIS_F_NO_8_0, + ISP_IRIS_F_NO_5_6, + ISP_IRIS_F_NO_4_0, + ISP_IRIS_F_NO_2_8, + ISP_IRIS_F_NO_2_0, + ISP_IRIS_F_NO_1_4, + ISP_IRIS_F_NO_1_0, + + ISP_IRIS_F_NO_BUTT, +} ISP_IRIS_F_NO_E; + +typedef struct hiISP_DCIRIS_ATTR_S +{ + HI_S32 s32Kp; /*RW, Range:[0, 100000], the proportional gain of PID algorithm, default value is 7000 */ + HI_S32 s32Ki; /*RW, Range:[0, 1000], the integral gain of PID algorithm, default value is 100 */ + HI_S32 s32Kd; /*RW, Range:[0, 100000], the derivative gain of PID algorithm, default value is 3000 */ + HI_U32 u32MinPwmDuty; /*RW, Range:[0, 1000], which is the min pwm duty for dciris control */ + HI_U32 u32MaxPwmDuty; /*RW, Range:[0, 1000], which is the max pwm duty for dciris control */ + HI_U32 u32OpenPwmDuty; /*RW, Range:[0, 1000], which is the open pwm duty for dciris control */ +} ISP_DCIRIS_ATTR_S; + +typedef struct hiISP_PIRIS_ATTR_S +{ + HI_BOOL bStepFNOTableChange; /*WO, Step-F number mapping table change or not */ + HI_BOOL bZeroIsMax; /*RW, Step 0 corresponds to max aperture or not, it's related to the specific iris */ + HI_U16 u16TotalStep; /*RW, Range:[1, 1024], Total steps of Piris's aperture, it's related to the specific iris */ + HI_U16 u16StepCount; /*RW, Range:[1, 1024], Used steps of Piris's aperture. when Piris's aperture is too small, the F number precision is not enough, + so not all the steps can be used. It's related to the specific iris*/ + HI_U16 au16StepFNOTable[AI_MAX_STEP_FNO_NUM]; /*RW, Range:[0, 1024], Step-F number mapping table. F1.0 is expressed as 1024, F32 is expressed as 1, it's related to the specific iris*/ + ISP_IRIS_F_NO_E enMaxIrisFNOTarget; /*RW, Range:[F32.0, F1.0], Max F number of Piris's aperture, it's related to the specific iris */ + ISP_IRIS_F_NO_E enMinIrisFNOTarget; /*RW, Range:[F32.0, F1.0], Min F number of Piris's aperture, it's related to the specific iris */ +} ISP_PIRIS_ATTR_S; + + +typedef struct hiISP_MI_ATTR_S +{ + HI_U32 u32HoldValue; /*RW, Range: [0x0, 0x3E8], iris hold value for DC-iris*/ + ISP_IRIS_F_NO_E enIrisFNO; /*RW, the F number of P-iris*/ +} ISP_MI_ATTR_S; + +typedef enum hiISP_IRIS_STATUS_E +{ + ISP_IRIS_KEEP = 0, /* In this mode can set the MI holdvalue */ + ISP_IRIS_OPEN = 1, /* Open Iris to the max */ + ISP_IRIS_CLOSE = 2, /* Close Iris to the min */ + ISP_IRIS_BUTT +} ISP_IRIS_STATUS_E; + +typedef struct hiISP_IRIS_ATTR_S +{ + HI_BOOL bEnable; /* iris enable/disable */ + ISP_OP_TYPE_E enOpType; /* auto iris or manual iris */ + ISP_IRIS_TYPE_E enIrisType; /* DC-iris or P-iris */ + ISP_IRIS_STATUS_E enIrisStatus; /*RW, status of Iris*/ + ISP_MI_ATTR_S stMIAttr; +} ISP_IRIS_ATTR_S; + + +/******************************************************/ +/********************* AE structs ************************/ +typedef enum hiISP_AE_MODE_E +{ + AE_MODE_SLOW_SHUTTER = 0, + AE_MODE_FIX_FRAME_RATE = 1, + AE_MODE_BUTT +} ISP_AE_MODE_E; + +typedef enum hiISP_AE_STRATEGY_E +{ + AE_EXP_HIGHLIGHT_PRIOR = 0, + AE_EXP_LOWLIGHT_PRIOR = 1, + AE_STRATEGY_MODE_BUTT +} ISP_AE_STRATEGY_E; + +typedef struct hiISP_AE_RANGE_S +{ + HI_U32 u32Max; + HI_U32 u32Min; +} ISP_AE_RANGE_S; + +typedef struct hiISP_AE_DELAY_S +{ + HI_U16 u16BlackDelayFrame; /*RW, Range: [0x0, 0xFFFF], AE black delay frame count*/ + HI_U16 u16WhiteDelayFrame; /*RW, Range: [0x0, 0xFFFF], AE white delay frame count*/ +} ISP_AE_DELAY_S; + +typedef enum hiISP_ANTIFLICKER_MODE_E +{ + /* The epxosure time is fixed to be the multiplies of 1/(2*frequency) sec, + * it may lead to over exposure in the high-luminance environments. */ + ISP_ANTIFLICKER_NORMAL_MODE = 0x0, + + /* The anti flicker may be closed to avoid over exposure in the high-luminance environments. */ + ISP_ANTIFLICKER_AUTO_MODE = 0x1, + + ISP_ANTIFLICKER_MODE_BUTT +}ISP_ANTIFLICKER_MODE_E; + +typedef struct hiISP_ANTIFLICKER_S +{ + HI_BOOL bEnable; + HI_U8 u8Frequency; /*RW, Range: usually this value is 50 or 60 which is the frequency of the AC power supply*/ + ISP_ANTIFLICKER_MODE_E enMode; +} ISP_ANTIFLICKER_S; + +typedef struct hiISP_SUBFLICKER_S +{ + HI_BOOL bEnable; + + /* RW, Range: [0x0, 0x64], if subflicker mode enable, current luma is less than AE compensation plus LumaDiff, + AE will keep min antiflicker shutter time(for example: 1/100s or 1/120s) to avoid flicker. while current luma is + larger than AE compensation plus the LumaDiff, AE will reduce shutter time to avoid over-exposure and introduce + flicker in the pircture */ + HI_U8 u8LumaDiff; +} ISP_SUBFLICKER_S; + +typedef struct hiISP_AE_ATTR_S +{ + /* base parameter */ + ISP_AE_RANGE_S stExpTimeRange; /*RW, sensor exposure time (unit: us ), Range: [0x0, 0xFFFFFFFF], it's related to the specific sensor */ + ISP_AE_RANGE_S stAGainRange; /*RW, sensor analog gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor */ + ISP_AE_RANGE_S stDGainRange; /*RW, sensor digital gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor */ + ISP_AE_RANGE_S stISPDGainRange; /*RW, ISP digital gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the ISP digital gain range */ + ISP_AE_RANGE_S stSysGainRange; /*RW, system gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor and ISP Dgain range */ + HI_U32 u32GainThreshold; /*RW, Gain threshold for slow shutter mode (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF] */ + + HI_U8 u8Speed; /*RW, Range: [0x0, 0xFF], AE adjust step*/ + HI_U8 u8Tolerance; /*RW, Range: [0x0, 0xFF], AE adjust tolerance*/ + HI_U8 u8Compensation; /*RW, Range: [0x0, 0xFF], AE compensation*/ + HI_U16 u16EVBias; /*RW, Range: [0x0, 0xFFFF], AE EV bias*/ + ISP_AE_STRATEGY_E enAEStrategyMode; /*RW, Support Highlight prior or Lowlight prior*/ + HI_U16 u16HistRatioSlope; /*RW, Range: [0x0, 0xFFFF], AE hist ratio slope*/ + HI_U8 u8MaxHistOffset; /*RW, Range: [0x0, 0xFF], Max hist offset*/ + + ISP_AE_MODE_E enAEMode; /*RW, AE mode(slow shutter/fix framerate)(onvif)*/ + ISP_ANTIFLICKER_S stAntiflicker; + ISP_SUBFLICKER_S stSubflicker; + ISP_AE_DELAY_S stAEDelayAttr; + + HI_BOOL bManualExpValue; /*RW, manual exposure value or not*/ + HI_U32 u32ExpValue; /*RW, Range: (0x0, 0xFFFFFFFF], manual exposure value */ + + /*AE weighting table*/ + HI_U8 au8Weight[AE_ZONE_ROW][AE_ZONE_COLUMN]; /*Range : [0, 0xF]*/ +} ISP_AE_ATTR_S; + +typedef struct hiISP_ME_ATTR_S +{ + ISP_OP_TYPE_E enExpTimeOpType; + ISP_OP_TYPE_E enAGainOpType; + ISP_OP_TYPE_E enDGainOpType; + ISP_OP_TYPE_E enISPDGainOpType; + + HI_U32 u32ExpTime; /*RW, sensor exposure time (unit: us ), Range: [0x0, 0xFFFFFFFF], it's related to the specific sensor */ + HI_U32 u32AGain; /*RW, sensor analog gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor */ + HI_U32 u32DGain; /*RW, sensor digital gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the specific sensor */ + HI_U32 u32ISPDGain; /*RW, ISP digital gain (unit: times, 10bit precision), Range : [0x400, 0xFFFFFFFF], it's related to the ISP digital gain range */ +} ISP_ME_ATTR_S; + +typedef struct hiISP_EXPOSURE_ATTR_S +{ + HI_BOOL bByPass; + ISP_OP_TYPE_E enOpType; + HI_U8 u8AERunInterval; /*RW, Range: [0x1, 0xFF], set the AE run interval*/ + HI_BOOL bHistStatAdjust; /*RW, HI_TRUE: 256 bin histogram statistic config will adjust when large red or blue area detected. + HI_FALSE: 256 bin histogram statistic config will not change */ + HI_BOOL bAERouteExValid; /*RW, use extend AE route or not */ + ISP_ME_ATTR_S stManual; + ISP_AE_ATTR_S stAuto; +} ISP_EXPOSURE_ATTR_S; + + +#define ISP_AE_ROUTE_MAX_NODES 16 +typedef struct hiISP_AE_ROUTE_NODE_S +{ + HI_U32 u32IntTime; /*RW, sensor exposure time (unit: us ), Range: (0x0, 0x1FFFFF], it's related to the specific sensor */ + HI_U32 u32SysGain; /*RW, system gain (unit: times, 10bit precision), Range : [0x400, 0x1FFFFFFF], it's related to the specific sensor and ISP Dgain range */ + ISP_IRIS_F_NO_E enIrisFNO; /*RW, the F number of the iris's aperture, Range:[F32.0, F1.0], only support for Piris */ +} ISP_AE_ROUTE_NODE_S; + +typedef struct hiISP_AE_ROUTE_S +{ + HI_U32 u32TotalNum; /*RW, Range: [0x0, 0x10], total node number of AE route */ + ISP_AE_ROUTE_NODE_S astRouteNode[ISP_AE_ROUTE_MAX_NODES]; +} ISP_AE_ROUTE_S; + +#define ISP_AE_ROUTE_EX_MAX_NODES 16 +typedef struct hiISP_AE_ROUTE_EX_NODE_S +{ + HI_U32 u32IntTime; /*RW, sensor exposure time (unit: us ), Range: (0x0, 0x1FFFFF], it's related to the specific sensor */ + HI_U32 u32Again; /*RW, sensor analog gain (unit: times, 10bit precision), Range : [0x400, 0x1FFFFF], it's related to the specific sensor*/ + HI_U32 u32Dgain; /*RW, sensor digital gain (unit: times, 10bit precision), Range : [0x400, 0x1FFFFF], it's related to the specific sensor*/ + HI_U32 u32IspDgain; /*RW, ISP digital gain (unit: times, 10bit precision), Range : [0x400, 0x1FFFFF] */ + ISP_IRIS_F_NO_E enIrisFNO; /*RW, the F number of the iris's aperture, Range:[F32.0, F1.0], only support for Piris */ +} ISP_AE_ROUTE_EX_NODE_S; + +typedef struct hiISP_AE_ROUTE_EX_S +{ + HI_U32 u32TotalNum; /*RW, Range: [0x0, 0x10], total node number of extend AE route */ + ISP_AE_ROUTE_EX_NODE_S astRouteExNode[ISP_AE_ROUTE_EX_MAX_NODES]; +} ISP_AE_ROUTE_EX_S; + + +typedef struct hiISP_EXP_INFO_S +{ + HI_U32 u32ExpTime; /* RO, Range: (0x0, 0xFFFFFFFF] */ + HI_U32 u32AGain; /* RO, Range: [0x400, 0xFFFFFFFF] */ + HI_U32 u32DGain; /* RO, Range: [0x400, 0xFFFFFFFF] */ + HI_U32 u32ISPDGain; /* RO, Range: [0x400, 0xFFFFFFFF] */ + HI_U32 u32Exposure; /* RO, Range: [0x40, 0xFFFFFFFF] */ + HI_BOOL bExposureIsMAX; /* RO, Range: [0x0, 0x1]*/ + HI_S16 s16HistError; /* RO, Range: [-0x8000, 0x7FFF]*/ + HI_U32 u32AE_Hist256Value[256]; /* RO, 256 bins histogram */ + HI_U16 u16AE_Hist5Value[5]; /* not support */ + HI_U8 u8AveLum; /* RO, Range: [0x0, 0xFF]*/ + HI_U32 u32LinesPer500ms; /* RO, Range: [0x0, 0xFFFFFFFF], exposure lines per 500ms */ + HI_U32 u32PirisFNO; /* RO, Range: [0x0, 0x400] */ + HI_U32 u32Fps; /* RO, actual fps */ + ISP_AE_ROUTE_S stAERoute; /* RO, Actual AE route */ + ISP_AE_ROUTE_EX_S stAERouteEx; /* RO, Actual AE route_ex */ + HI_U16 u16RgbirGain; /* RO, Range: [0x0, 0x3ff]*/ +}ISP_EXP_INFO_S; + + +/********************* AWB structs ************************/ +typedef enum hiISP_AWB_ALG_TYPE_E +{ + AWB_ALG_LOWCOST = 0, + AWB_ALG_ADVANCE = 1, + AWB_ALG_BUTT +} ISP_AWB_ALG_TYPE_E; + +typedef struct hiISP_AWB_CT_LIMIT_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + + HI_U16 u16HighRgLimit; /*RW, Range:[0x0, 0xFFF], in Manual Mode, user define the Max Rgain of High Color Temperature*/ + HI_U16 u16HighBgLimit; /*RW, Range:[0x0, 0xFFF], in Manual Mode, user define the Min Bgain of High Color Temperature*/ + HI_U16 u16LowRgLimit; /*RW, Range:[0x0, 0xFFF], in Manual Mode, user define the Min Rgain of Low Color Temperature*/ + HI_U16 u16LowBgLimit; /*RW, Range:[0x0, 0xFFF], in Manual Mode, user define the Max Bgain of Low Color Temperature*/ +} ISP_AWB_CT_LIMIT_ATTR_S; + +typedef struct hiISP_AWB_IN_OUT_ATTR_S +{ + HI_BOOL bEnable; + ISP_OP_TYPE_E enOpType; + HI_BOOL bOutdoorStatus; /*in Auto mode, this is RO, in Manual mode, this is WO*/ + HI_U32 u32OutThresh; /*shutter time(in us) to judge indoor or outdoor */ + HI_U16 u16LowStart; /*5000K is recommend*/ + HI_U16 u16LowStop; /*4500K is recommend, should be smaller than u8LowStart*/ + HI_U16 u16HighStart; /*6500K is recommend, shoule be larger than u8LowStart*/ + HI_U16 u16HighStop; /*8000K is recommend, should be larger than u8HighStart*/ + HI_BOOL bGreenEnhanceEn; /*If this is enabled, Green channel will be enhanced based on the ratio of green plant*/ +} ISP_AWB_IN_OUT_ATTR_S; + +typedef struct hiISP_AWB_LIGHTSOURCE_INFO_S +{ + HI_U16 u16WhiteRgain; /*G/R of White points at this light source*/ + HI_U16 u16WhiteBgain; /*G/B of White points at this light source*/ + HI_U16 u16ExpQuant; /*shutter time * again * dgain >> 4, Not support Now*/ + HI_U8 u8LightStatus; /*RW, 0: idle 1:add light source 2:delete sensitive color */ + HI_U8 u8Radius; /*Radius of light source*/ +} ISP_AWB_EXTRA_LIGHTSOURCE_INFO_S; + +typedef struct hiISP_AWB_ATTR_EX_S +{ + HI_U8 u8Tolerance; /*RW, Range:[0x0, 0xFF], AWB adjust tolerance*/ + HI_U8 u8ZoneRadius; /*RW, Range:[0x0, 0xFF], radius of AWB blocks*/ + HI_U16 u16CurveLLimit; /*RW, Range:[0x0, 0x100], Left limit of AWB Curve, recomend for indoor 0xE0, outdoor 0xE0*/ + HI_U16 u16CurveRLimit; /*RW, Range:[0x100, 0xFFF], Right Limit of AWB Curve,recomend for indoor 0x130, outdoor 0x120*/ + + HI_BOOL bExtraLightEn; /*Enable special light source function*/ + ISP_AWB_EXTRA_LIGHTSOURCE_INFO_S stLightInfo[4]; + ISP_AWB_IN_OUT_ATTR_S stInOrOut; +} ISP_AWB_ATTR_EX_S; + +typedef struct hiISP_AWB_ATTR_S +{ + HI_BOOL bEnable; /*If AWB is disabled, static wb gain will be used, otherwise awb gain will be used*/ + + HI_U16 u16RefColorTemp; /*Calibration Information*/ + HI_U16 au16StaticWB[4]; /*Calibration Information*/ + HI_S32 as32CurvePara[6]; /*Calibration Information*/ + + ISP_AWB_ALG_TYPE_E enAlgType; + + HI_U8 u8RGStrength; /*RW, AWB Strength of R Channel, Range: [0x0, 0xFF]*/ + HI_U8 u8BGStrength; /*RW, AWB Strength of B Channel, Range: [0x0, 0xFF]*/ + HI_U16 u16Speed; /*RW, Convergence speed of AWB, Range:[0x0, 0xFFF] */ + HI_U16 u16ZoneSel; /*RW, A value of 0 or 0xFF means global AWB, A value between 0 and 0xFF means zoned AWB */ + HI_U16 u16HighColorTemp; /*RW, AWB max temperature, Recommended: [8500, 10000] */ + HI_U16 u16LowColorTemp; /*RW, AWB min temperature, Range: [0x0, u8HighColorTemp), Recommended: [2000, 2500] */ + ISP_AWB_CT_LIMIT_ATTR_S stCTLimit; + HI_BOOL bShiftLimitEn; /*If the statistic information is out of range, it should be project*/ + HI_U8 u8ShiftLimit; + HI_BOOL bGainNormEn; +} ISP_AWB_ATTR_S; + +typedef struct hiISP_MWB_ATTR_S +{ + HI_U16 u16Rgain; /*RW, Multiplier for R color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Grgain; /*RW, Multiplier for Gr color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Gbgain; /*RW, Multiplier for Gb color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Bgain; /*RW, Multiplier for B color channel, Range: [0x0, 0xFFF]*/ +} ISP_MWB_ATTR_S; + +typedef struct hiISP_WB_ATTR_S +{ + HI_BOOL bByPass; + ISP_OP_TYPE_E enOpType; + ISP_MWB_ATTR_S stManual; + ISP_AWB_ATTR_S stAuto; +} ISP_WB_ATTR_S; + +typedef struct hiISP_COLORMATRIX_MANUAL_S +{ + HI_U16 au16CCM[9]; /*RW, Range: [0x0, 0xFFFF]*/ +} ISP_COLORMATRIX_MANUAL_S; + +typedef struct hiISP_COLORMATRIX_AUTO_S +{ HI_U16 u16HighColorTemp; /*RW, Range: <=10000*/ + HI_U16 au16HighCCM[9]; /*RW, Range: [0x0, 0xFFFF]*/ + HI_U16 u16MidColorTemp; /*RW, the MidColorTemp should be at least 400 smaller than HighColorTemp*/ + HI_U16 au16MidCCM[9]; /*RW, Range: [0x0, 0xFFFF]*/ + HI_U16 u16LowColorTemp; /*RW, the LowColorTemp should be at least 400 smaller than u16MidColorTemp, >= 2000*/ + HI_U16 au16LowCCM[9]; /*RW, Range: [0x0, 0xFFFF]*/ +} ISP_COLORMATRIX_AUTO_S; + +typedef struct hiISP_COLORMATRIX_ATTR_S +{ + ISP_OP_TYPE_E enOpType; + ISP_COLORMATRIX_MANUAL_S stManual; + ISP_COLORMATRIX_AUTO_S stAuto; +}ISP_COLORMATRIX_ATTR_S; + +typedef struct hiISP_SATURATION_MANUAL_S +{ + HI_U8 u8Saturation; /*RW, Range: [0, 0xFF] */ +} ISP_SATURATION_MANUAL_S; + +typedef struct hiISP_SATURATION_AUTO_S +{ + HI_U8 au8Sat[ISP_AUTO_ISO_STENGTH_NUM]; /*RW, Range: [0, 0xFF], should be decreased based on ISO increase */ +} ISP_SATURATION_AUTO_S; + +typedef struct hiISP_SATURATION_ATTR_S +{ + ISP_OP_TYPE_E enOpType; + ISP_SATURATION_MANUAL_S stManual; + ISP_SATURATION_AUTO_S stAuto; +}ISP_SATURATION_ATTR_S; + +typedef struct hiISP_COLOR_TONE_ATTR_S +{ + HI_U16 u16RedCastGain; /*RW, R channel gain after CCM*/ + HI_U16 u16GreenCastGain; /*RW, G channel gain after CCM*/ + HI_U16 u16BlueCastGain; /*RW, B channel gain after CCM*/ +} ISP_COLOR_TONE_ATTR_S; + +typedef struct hiISP_WB_INFO_S +{ + HI_U16 u16Rgain; /*RO, AWB result of R color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Grgain; /*RO, AWB result of Gr color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Gbgain; /*RO, AWB result of Gb color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Bgain; /*RO, AWB result of B color channel, Range: [0x0, 0xFFF]*/ + HI_U16 u16Saturation; /*RO, Current saturation, Range:[0x0, 0xFF]*/ + HI_U16 u16ColorTemp; /*RO, Detect color temperature, maybe out of color cemeprature range*/ + HI_U16 au16CCM[9]; /*RO, Current color correction matrix*/ +}ISP_WB_INFO_S; + + +/********************* AF structs ************************/ +typedef struct hiISP_AF_ATTR_S +{ + HI_S32 s32DistanceMax; /* the focuse range */ + HI_S32 s32DistanceMin; + + /* weighting table */ + HI_U8 u8Weight[AF_ZONE_ROW][AF_ZONE_COLUMN]; +} ISP_AF_ATTR_S; +typedef struct hiISP_MF_ATTR_S +{ + HI_S32 s32DefaultSpeed; /* 1,default speed(unit:m/s).(onvif)*/ +} ISP_MF_ATTR_S; +typedef struct hiISP_FOCUS_ATTR_S +{ + ISP_OP_TYPE_E enOpType; + ISP_MF_ATTR_S stManual; + ISP_AF_ATTR_S stAuto; +} ISP_FOCUS_ATTR_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* __HI_COMM_ISP_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_ive.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_ive.h new file mode 100644 index 0000000..2ecee11 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_ive.h @@ -0,0 +1,352 @@ +/****************************************************************************** + + Copyright (C), 2001-2014, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_ive.h + Version : Initial Draft + Author : Hisilicon multimedia software (IVE) group + Created : 2011/05/16 + Description : + History : + 1.Date : 2011/05/16 + Author : + Modification: Created file + + 2.Date : 2013/07/01~2014/08/08 + Author : + Modification: Add MPI function +******************************************************************************/ +#ifndef _HI_COMM_IVE_H_ +#define _HI_COMM_IVE_H_ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif + +#include "hi_type.h" +#include "hi_errno.h" + +/*-----------------------------------------------* + * The fixed-point data type, will be used to * + * represent float data in hardware calculations.* + *-----------------------------------------------*/ + +/*--u8bit----------------------------------------*/ +typedef unsigned char HI_U0Q8; +typedef unsigned char HI_U1Q7; +typedef unsigned char HI_U5Q3; + +/*--u16bit---------------------------------------*/ +typedef unsigned short HI_U0Q16; +typedef unsigned short HI_U4Q12; +typedef unsigned short HI_U6Q10; +typedef unsigned short HI_U8Q8; +typedef unsigned short HI_U9Q7; +typedef unsigned short HI_U12Q4; +typedef unsigned short HI_U14Q2; +typedef unsigned short HI_U5Q11; +/*--s16bit---------------------------------------*/ +typedef short HI_S9Q7; +typedef short HI_S14Q2; +typedef short HI_S1Q15; + +/*--u32bit---------------------------------------*/ +typedef unsigned int HI_U22Q10; +typedef unsigned int HI_U25Q7; +typedef unsigned int HI_U21Q11; + +/*--s32bit---------------------------------------*/ +typedef int HI_S25Q7; +typedef int HI_S16Q16; + +/*-----------------------------------------------* + * The fixed-point data type combine with flag_bits.* + *-----------------------------------------------*/ + +/*8bits unsigned integer,4bits decimal fraction,4bits flag_bits*/ +typedef unsigned short HI_U8Q4F4; + +/*float*/ +typedef float HI_FLOAT; +/*double*/ +typedef double HI_DOUBLE; + +/* +* Type of the IVE_IMAGE_S data. +* Aded by tanbing 2013-7-22 +*/ +typedef enum hiIVE_IMAGE_TYPE_E +{ + IVE_IMAGE_TYPE_U8C1 = 0x0, + IVE_IMAGE_TYPE_S8C1 = 0x1, + + IVE_IMAGE_TYPE_YUV420SP = 0x2, /*YUV420 SemiPlanar*/ + IVE_IMAGE_TYPE_YUV422SP = 0x3, /*YUV422 SemiPlanar*/ + IVE_IMAGE_TYPE_YUV420P = 0x4, /*YUV420 Planar */ + IVE_IMAGE_TYPE_YUV422P = 0x5, /*YUV422 planar */ + + IVE_IMAGE_TYPE_S8C2_PACKAGE = 0x6, + IVE_IMAGE_TYPE_S8C2_PLANAR = 0x7, + + IVE_IMAGE_TYPE_S16C1 = 0x8, + IVE_IMAGE_TYPE_U16C1 = 0x9, + + IVE_IMAGE_TYPE_U8C3_PACKAGE = 0xa, + IVE_IMAGE_TYPE_U8C3_PLANAR = 0xb, + + IVE_IMAGE_TYPE_S32C1 = 0xc, + IVE_IMAGE_TYPE_U32C1 = 0xd, + + IVE_IMAGE_TYPE_S64C1 = 0xe, + IVE_IMAGE_TYPE_U64C1 = 0xf, + + IVE_IMAGE_TYPE_BUTT + +}IVE_IMAGE_TYPE_E; + +/* +* Definition of the IVE_IMAGE_S. +* Added by Tan Bing, 2013-7-22. +*/ +typedef struct hiIVE_IMAGE_S +{ + IVE_IMAGE_TYPE_E enType; + + HI_U32 u32PhyAddr[3]; + HI_U8 *pu8VirAddr[3]; + + HI_U16 u16Stride[3]; + HI_U16 u16Width; + HI_U16 u16Height; + + HI_U16 u16Reserved; /*Can be used such as elemSize*/ +}IVE_IMAGE_S; + +typedef IVE_IMAGE_S IVE_SRC_IMAGE_S; +typedef IVE_IMAGE_S IVE_DST_IMAGE_S; + +/* +* Definition of the IVE_MEM_INFO_S.This struct special purpose for input or ouput, such as Hist, CCL, ShiTomasi. +* Added by Chen Quanfu, 2013-7-23. +*/ +typedef struct hiIVE_MEM_INFO_S +{ + HI_U32 u32PhyAddr; + HI_U8 *pu8VirAddr; + HI_U32 u32Size; +}IVE_MEM_INFO_S; +typedef IVE_MEM_INFO_S IVE_SRC_MEM_INFO_S; +typedef IVE_MEM_INFO_S IVE_DST_MEM_INFO_S; + +/* +*Data struct ,created by Chen Quanfu 2013-07-19 +*/ +typedef struct hiIVE_DATA_S +{ + HI_U32 u32PhyAddr; /*Physical address of the data*/ + HI_U8 *pu8VirAddr; + + HI_U16 u16Stride; /*2D data stride by byte*/ + HI_U16 u16Width; /*2D data width by byte*/ + HI_U16 u16Height; /*2D data height*/ + + HI_U16 u16Reserved; +}IVE_DATA_S; +typedef IVE_DATA_S IVE_SRC_DATA_S; +typedef IVE_DATA_S IVE_DST_DATA_S; + +/* +* Definition of the union of IVE_8BIT_U. +* Added by Tan Bing, 2013-7-22. +*/ +typedef union hiIVE_8BIT_U +{ + HI_S8 s8Val; + HI_U8 u8Val; +}IVE_8BIT_U; + +/* +* Definition of u16 point +*/ +typedef struct hiIVE_POINT_U16_S +{ + HI_U16 u16X; + HI_U16 u16Y; +}IVE_POINT_U16_S; + +/* +* Definition of s16 point +*/ +typedef struct hiIVE_POINT_S16_S +{ + HI_U16 s16X; + HI_U16 s16Y; +}IVE_POINT_S16_S; + +/* +*Float point represented by Fixed-point SQ25.7 +*/ +typedef struct hiIVE_POINT_S25Q7_S +{ + HI_S25Q7 s25q7X; /*X coordinate*/ + HI_S25Q7 s25q7Y; /*Y coordinate*/ +}IVE_POINT_S25Q7_S; + +/* +* Definition of rect +*/ +typedef struct hiIVE_RECT_U16_S +{ + HI_U16 u16X; + HI_U16 u16Y; + HI_U16 u16Width; + HI_U16 u16Height; +}IVE_RECT_U16_S; + +typedef struct hiIVE_LOOK_UP_TABLE_S +{ + IVE_MEM_INFO_S stTable; + HI_U16 u16ElemNum; /*LUT's elements number*/ + + HI_U8 u8TabInPreci; + HI_U8 u8TabOutNorm; + + HI_S32 s32TabInLower; /*LUT's original input lower limit*/ + HI_S32 s32TabInUpper; /*LUT's original input upper limit*/ +}IVE_LOOK_UP_TABLE_S; + + +typedef enum hiEN_IVE_ERR_CODE_E +{ + ERR_IVE_SYS_TIMEOUT = 0x40, /* IVE process timeout */ + ERR_IVE_QUERY_TIMEOUT = 0x41, /* IVE query timeout */ + ERR_IVE_OPEN_FILE = 0x42, /* IVE open file error */ + ERR_IVE_READ_FILE = 0x43, /* IVE read file error */ + ERR_IVE_WRITE_FILE = 0x44, /* IVE write file error */ + + ERR_IVE_BUTT +}EN_IVE_ERR_CODE_E; + +typedef enum hiEN_FD_ERR_CODE_E +{ + ERR_FD_SYS_TIMEOUT = 0x40, /* FD process timeout */ + ERR_FD_CFG = 0x41, /* FD configuration error */ + ERR_FD_FACE_NUM_OVER = 0x42, /* FD candidate face number over*/ + ERR_FD_OPEN_FILE = 0x43, /* FD open file error */ + ERR_FD_READ_FILE = 0x44, /* FD read file error */ + ERR_FD_WRITE_FILE = 0x45, /* FD write file error */ + + ERR_FD_BUTT +}EN_FD_ERR_CODE_E; + +/************************************************IVE error code ***********************************/ +/*Invalid device ID*/ +#define HI_ERR_IVE_INVALID_DEVID HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/*Invalid channel ID*/ +#define HI_ERR_IVE_INVALID_CHNID HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/*At least one parameter is illegal. For example, an illegal enumeration value exists.*/ +#define HI_ERR_IVE_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/*The channel exists.*/ +#define HI_ERR_IVE_EXIST HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*The UN exists.*/ +#define HI_ERR_IVE_UNEXIST HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/*A null point is used.*/ +#define HI_ERR_IVE_NULL_PTR HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/*Try to enable or initialize the system, device, or channel before configuring attributes.*/ +#define HI_ERR_IVE_NOT_CONFIG HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/*The operation is not supported currently.*/ +#define HI_ERR_IVE_NOT_SURPPORT HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/*The operation, changing static attributes for example, is not permitted.*/ +#define HI_ERR_IVE_NOT_PERM HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/*A failure caused by the malloc memory occurs.*/ +#define HI_ERR_IVE_NOMEM HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/*A failure caused by the malloc buffer occurs.*/ +#define HI_ERR_IVE_NOBUF HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/*The buffer is empty.*/ +#define HI_ERR_IVE_BUF_EMPTY HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/*No buffer is provided for storing new data.*/ +#define HI_ERR_IVE_BUF_FULL HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/*The system is not ready because it may be not initialized or loaded. + *The error code is returned when a device file fails to be opened. */ +#define HI_ERR_IVE_NOTREADY HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + +/*The source address or target address is incorrect during the operations such as calling copy_from_user or copy_to_user.*/ +#define HI_ERR_IVE_BADADDR HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) +/*The resource is busy during the operations such as destroying a VENC channel without deregistering it.*/ +#define HI_ERR_IVE_BUSY HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/*IVE process timeout: 0xA01D8040*/ +#define HI_ERR_IVE_SYS_TIMEOUT HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_SYS_TIMEOUT) +/*IVE query timeout: 0xA01D8041*/ +#define HI_ERR_IVE_QUERY_TIMEOUT HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_QUERY_TIMEOUT) +/*IVE open file error: 0xA01D8042*/ +#define HI_ERR_IVE_OPEN_FILE HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_OPEN_FILE) +/*IVE read file error: 0xA01D8043*/ +#define HI_ERR_IVE_READ_FILE HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_READ_FILE) +/*IVE read file error: 0xA01D8044*/ +#define HI_ERR_IVE_WRITE_FILE HI_DEF_ERR(HI_ID_IVE, EN_ERR_LEVEL_ERROR, ERR_IVE_WRITE_FILE) + +/************************************************FD error code ***********************************/ +/*Invalid device ID*/ +#define HI_ERR_FD_INVALID_DEVID HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/*Invalid channel ID*/ +#define HI_ERR_FD_INVALID_CHNID HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/*At least one parameter is illegal. For example, an illegal enumeration value exists.*/ +#define HI_ERR_FD_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/*The channel exists.*/ +#define HI_ERR_FD_EXIST HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*The UN exists.*/ +#define HI_ERR_FD_UNEXIST HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/*A null point is used.*/ +#define HI_ERR_FD_NULL_PTR HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/*Try to enable or initialize the system, device, or channel before configuring attributes.*/ +#define HI_ERR_FD_NOT_CONFIG HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/*The operation is not supported currently.*/ +#define HI_ERR_FD_NOT_SURPPORT HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/*The operation, changing static attributes for example, is not permitted.*/ +#define HI_ERR_FD_NOT_PERM HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/*A failure caused by the malloc memory occurs.*/ +#define HI_ERR_FD_NOMEM HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/*A failure caused by the malloc buffer occurs.*/ +#define HI_ERR_FD_NOBUF HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/*The buffer is empty.*/ +#define HI_ERR_FD_BUF_EMPTY HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/*No buffer is provided for storing new data.*/ +#define HI_ERR_FD_BUF_FULL HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/*The system is not ready because it may be not initialized or loaded. + *The error code is returned when a device file fails to be opened. */ +#define HI_ERR_FD_NOTREADY HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/*The source address or target address is incorrect during the operations such as calling copy_from_user or copy_to_user.*/ +#define HI_ERR_FD_BADADDR HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) +/*The resource is busy during the operations such as destroying a VENC channel without deregistering it.*/ +#define HI_ERR_FD_BUSY HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +/*FD process timeout: 0xA02F8040*/ +#define HI_ERR_FD_SYS_TIMEOUT HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_SYS_TIMEOUT) +/*FD configuration error: 0xA02F8041*/ +#define HI_ERR_FD_CFG HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_CFG) +/*FD candidate face number over: 0xA02F8042*/ +#define HI_ERR_FD_FACE_NUM_OVER HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_FACE_NUM_OVER) +/*FD open file error: 0xA02F8043*/ +#define HI_ERR_FD_OPEN_FILE HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_OPEN_FILE) +/*FD read file error: 0xA02F8044*/ +#define HI_ERR_FD_READ_FILE HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_READ_FILE) +/*FD read file error: 0xA02F8045*/ +#define HI_ERR_FD_WRITE_FILE HI_DEF_ERR(HI_ID_FD, EN_ERR_LEVEL_ERROR, ERR_FD_WRITE_FILE) + +/************************************************ODT error code ***********************************/ +/*ODT exist: 0xA0308004*/ +#define HI_ERR_ODT_EXIST HI_DEF_ERR(HI_ID_ODT, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*ODT the system is not ready because it may be not initialized: 0xA0308010*/ +#define HI_ERR_ODT_NOTREADY HI_DEF_ERR(HI_ID_ODT, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/*ODT busy: 0xA0308012*/ +#define HI_ERR_ODT_BUSY HI_DEF_ERR(HI_ID_ODT, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif +#endif/*__HI_COMM_IVE_H__*/ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_pciv.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_pciv.h new file mode 100644 index 0000000..22b9ae9 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_pciv.h @@ -0,0 +1,277 @@ + +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_pciv.h + Version : Initial Draft + Author : Hisilicon multimedia software pciv + Created : 2008/06/04 + Last Modified : + Description : common struct definition for PCIV + Function List : + History : + +******************************************************************************/ + +#ifndef __HI_COMM_PCIV_H__ +#define __HI_COMM_PCIV_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" +#include "hi_comm_vdec.h" +#include "hi_comm_vpss.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +typedef HI_S32 PCIV_CHN; + +#define PCIV_MAX_BUF_NUM 16 /* pciv channel max buffer number */ +#define PCIV_MAX_CHIPNUM 32 /* max pciv device number which can join in the system */ + +#define MAKE_DWORD(high,low) (((low)&0x0000ffff)|((high)<<16)) +#define HIGH_WORD(x) (((x)&0xffff0000)>>16) +#define LOW_WORD(x) ((x)&0x0000ffff) + +/* vi object struct */ +typedef struct hiPCIV_VIDEVICE_S +{ + VI_DEV viDev; /* vi device number */ + VI_CHN viChn; /* vi channel number */ +} PCIV_VIDEVICE_S; + +/* vo object struct */ +typedef struct hiPCIV_VODEVICE_S +{ + VO_DEV voDev; /* vo device number */ + VO_CHN voChn; /* vo channel number */ +} PCIV_VODEVICE_S; + +/* vdec object struct */ +typedef struct hiPCIV_VDECDEVICE_S +{ + VDEC_CHN vdecChn; /* vedc channel number */ +} PCIV_VDECDEVICE_S; + +/* vpss object struct */ +typedef struct hiPCIV_VPSSDEVICE_S +{ + VPSS_GRP vpssGrp; /* vpss group number */ + VPSS_CHN vpssChn; /* vpss channel number */ +} PCIV_VPSSDEVICE_S; + +/* bind type for pciv */ +typedef enum hiPCIV_BIND_TYPE_E +{ + PCIV_BIND_VI = 0, + PCIV_BIND_VO = 1, + PCIV_BIND_VDEC = 2, + PCIV_BIND_VPSS = 3, + PCIV_BIND_BUTT +} PCIV_BIND_TYPE_E; + +/* bind object struct for pciv */ +typedef struct hiPCI_BIND_OBJ_S +{ + HI_BOOL bVpssSend; + PCIV_BIND_TYPE_E enType; /* bind type for pciv */ + union + { + PCIV_VIDEVICE_S viDevice; + PCIV_VODEVICE_S voDevice; + PCIV_VDECDEVICE_S vdecDevice; + PCIV_VPSSDEVICE_S vpssDevice; + } unAttachObj; +} PCIV_BIND_OBJ_S; + +/* remote pciv object */ +typedef struct hiPCIV_REMOTE_OBJ_S +{ + HI_S32 s32ChipId; /* remote pciv device Id number */ + PCIV_CHN pcivChn; /* pciv channel number of remote pciv device */ +} PCIV_REMOTE_OBJ_S; + +/* attribution of target picture */ +typedef struct hiPCIV_PIC_ATTR_S +{ + HI_U32 u32Width; /* pciture width of pciv channel */ + HI_U32 u32Height; /* picture height of pciv channel */ + HI_U32 u32Stride[3]; /* pciture stride of pciv channel */ + VIDEO_FIELD_E u32Field; /* video frame field type of pciv channel */ + PIXEL_FORMAT_E enPixelFormat; /* pixel format of pciture of pciv channel */ +} PCIV_PIC_ATTR_S; + + +/* attribution of pciv chn */ +typedef struct hiPCIV_ATTR_S +{ + PCIV_PIC_ATTR_S stPicAttr; /* picture attibute */ + HI_S32 s32BufChip; /* The chip id which buffer is belong to */ + HI_U32 u32BlkSize; /* vb size of receiver for preview */ + HI_U32 u32Count; /* lenght of address list */ + HI_U32 u32PhyAddr[PCIV_MAX_BUF_NUM]; /* address list for picture move */ + PCIV_REMOTE_OBJ_S stRemoteObj; /* remote pciv object */ +} PCIV_ATTR_S; + +/* max count of video buffer block for pci window */ +#define PCIV_MAX_VBCOUNT 8 + +/* mpp video buffer config for pci window */ +typedef struct hiPCIV_WINVBCFG_S +{ + HI_U32 u32PoolCount; /* total number of video buffer pool */ + HI_U32 u32BlkSize[PCIV_MAX_VBCOUNT]; /* size of video buffer pool */ + HI_U32 u32BlkCount[PCIV_MAX_VBCOUNT]; /* number of video buffer pool */ +} PCIV_WINVBCFG_S; + +typedef struct hiPCIV_BASEWINDOW_S +{ + HI_S32 s32ChipId; /* pciv device number */ + HI_U32 u32NpWinBase; /* non-prefetch window pcie base address */ + HI_U32 u32PfWinBase; /* prefetch window pcie base address */ + HI_U32 u32CfgWinBase; /* config window pcie base address */ + HI_U32 u32PfAHBAddr; /* prefetch window AHB base address */ +} PCIV_BASEWINDOW_S; + +#define PCIV_MAX_DMABLK 128 +typedef struct hiPCIV_DMA_BLOCK_S +{ + HI_U32 u32SrcAddr; /* source address of dma task */ + HI_U32 u32DstAddr; /* destination address of dma task */ + HI_U32 u32BlkSize; /* data block size of dma task */ +} PCIV_DMA_BLOCK_S; + +typedef struct hiPCIV_DMA_TASK_S +{ + HI_U32 u32Count; /* total dma task number */ + HI_BOOL bRead; /* dam task is read or write data */ + PCIV_DMA_BLOCK_S *pBlock; +} PCIV_DMA_TASK_S; + + +/* + * Message port used in pciv_drvadp, you can't use it in your application. + */ +#define PCIV_MSGPORT_KERNEL 80 + + +/* + * You should not use follow mocros, they will be deleted ! + */ +#define PCIV_MSGPORT_MAXPORT 100 +#define PCIV_MSGPORT_TIME 79 +#define PCIV_MSGPORT_USERCMD 81 +#define PCIV_MSGPORT_USERNOTIFY2HOST 82 +#define PCIV_MSGPORT_USERNOTIFY2SLAVE 83 +#define PCIV_MSGPORT_USERNOTIFY2HOST_VDEC 84 +#define PCIV_MSGPORT_USERNOTIFY2SLAVE_VDEC 85 +#define PCIV_MAXVO_BIND 4 +/*----------------------------------------*/ + +typedef enum hiPCIV_FILTER_TYPE_E +{ + PCIV_FILTER_TYPE_NORM, + PCIV_FILTER_TYPE_EX, + PCIV_FILTER_TYPE_EX2, + + PCIV_FILTER_TYPE_BUTT +} PCIV_FILTER_TYPE_E; + +typedef enum hiPCIV_PIC_FIELD_E +{ + PCIV_FIELD_TOP, + PCIV_FIELD_BOTTOM, + PCIV_FIELD_BOTH, + + PCIV_FIELD_BUTT +} PCIV_PIC_FIELD_E; + +/* + * configuration of pre-process before sending source picture whth PCI + * item in this structrue have default value when sys init + */ +typedef struct hiPCIV_PREPROC_CFG_S +{ + PCIV_PIC_FIELD_E enFieldSel; /* pictrue field select */ + PCIV_FILTER_TYPE_E enFilterType; /* filter group type */ +} PCIV_PREPROC_CFG_S; + + +#if 0 +/* Synchronize the time and PTS. The host is base. */ +typedef struct hiPCIV_TIME_SYNC_S +{ + struct timeval stSysTime; /* The current system time */ + HI_U64 u64PtsBase; /* The media PTS */ + HI_U32 u32ReqTagId; +} PCIV_TIME_SYNC_S; +#endif + +/* invlalid channel ID */ +#define HI_ERR_PCIV_INVALID_CHNID HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_PCIV_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_PCIV_EXIST HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* channel exists */ +#define HI_ERR_PCIV_UNEXIST HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_PCIV_NULL_PTR HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_PCIV_NOT_CONFIG HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_PCIV_NOT_SUPPORT HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_PCIV_NOT_PERM HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_PCIV_NOMEM HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_PCIV_NOBUF HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_PCIV_BUF_EMPTY HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_PCIV_BUF_FULL HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_PCIV_SYS_NOTREADY HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/* One DMA task is working, wait a minute */ +#define HI_ERR_PCIV_BUSY HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_PCIV_TIMEOUT HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUTT+1) + +#define PCIV_TRACE(level, fmt...)\ +do{ \ + HI_TRACE(level, HI_ID_PCIV,"[Func]:%s [Line]:%d [Info]:", __FUNCTION__, __LINE__);\ + HI_TRACE(level,HI_ID_PCIV,##fmt);\ +}while(0) + +#define PCIV_CHECK_CHNID(ChnID)\ +do{\ + if(((ChnID) < 0) || ((ChnID) >= PCIV_MAX_CHN_NUM))\ + {\ + PCIV_TRACE(HI_DBG_ERR, "invalid chn id:%d \n", ChnID);\ + return HI_ERR_PCIV_INVALID_CHNID;\ + }\ +}while(0) + +#define PCIV_CHECK_PTR(ptr)\ +do{\ + if(NULL == (ptr))\ + {\ + return HI_ERR_PCIV_NULL_PTR;\ + }\ +}while(0) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ +#endif /* __HI_COMM_PCIV_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_rc.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_rc.h new file mode 100644 index 0000000..c503344 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_rc.h @@ -0,0 +1,324 @@ +/****************************************************************************** + + Copyright (C), 2001-2012, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_rc.h + Version : + Author : Hisilicon Hi35xx MPP Team + Created : 2006/11/24 + Last Modified : + Description : common struct definition for Rate control + Function List : + History : +******************************************************************************/ +#ifndef __HI_COMM_RC_H__ +#define __HI_COMM_RC_H__ + +#include "hi_defines.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +typedef HI_U32 HI_FR32; + +typedef enum hiVENC_RC_MODE_E +{ + VENC_RC_MODE_H264CBR = 1, + VENC_RC_MODE_H264VBR, + VENC_RC_MODE_H264ABR, + VENC_RC_MODE_H264FIXQP, + + VENC_RC_MODE_MJPEGCBR, + VENC_RC_MODE_MJPEGVBR, + VENC_RC_MODE_MJPEGABR, + VENC_RC_MODE_MJPEGFIXQP, + + VENC_RC_MODE_MPEG4CBR, + VENC_RC_MODE_MPEG4VBR, + VENC_RC_MODE_MPEG4ABR, + VENC_RC_MODE_MPEG4FIXQP, + + VENC_RC_MODE_H265CBR, + VENC_RC_MODE_H265VBR, + VENC_RC_MODE_H265FIXQP, + + VENC_RC_MODE_BUTT, + +}VENC_RC_MODE_E; + + +typedef struct hiVENC_ATTR_H264_FIXQP_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32IQp; /* qp of the i frame */ + HI_U32 u32PQp; /* qp of the p frame */ +} VENC_ATTR_H264_FIXQP_S; + +typedef struct hiVENC_ATTR_H264_CBR_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32BitRate; /* average bitrate */ + HI_U32 u32FluctuateLevel; /* level [0..5].scope of bitrate fluctuate. 1-5: 10%-50%. 0: SDK optimized, recommended; */ +} VENC_ATTR_H264_CBR_S; + +typedef struct hiVENC_ATTR_H264_VBR_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32MaxBitRate; /* the max bitrate */ + HI_U32 u32MaxQp; /* the max qp */ + HI_U32 u32MinQp; /* the min qp */ +}VENC_ATTR_H264_VBR_S; + +typedef struct hiVENC_ATTR_H264_ABR_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32AvgBitRate; /* average bitrate */ + HI_U32 u32MaxBitRate; /* the max bitrate */ +}VENC_ATTR_H264_ABR_S; + +typedef struct hiVENC_ATTR_H264_CBR_S VENC_ATTR_H265_CBR_S; +typedef struct hiVENC_ATTR_H264_VBR_S VENC_ATTR_H265_VBR_S; +typedef struct hiVENC_ATTR_H264_FIXQP_S VENC_ATTR_H265_FIXQP_S; + + + +typedef struct hiVENC_ATTR_MPEG4_FIXQP_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32IQp; /* qp of the i frame */ + HI_U32 u32PQp; /* qp of the p frame */ +}VENC_ATTR_MPEG4_FIXQP_S; + +typedef struct hiVENC_ATTR_MPEG4_CBR_S +{ + HI_U32 u32Gop; /*the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32BitRate; /* average bitrate */ + HI_U32 u32FluctuateLevel; /* level [0..5].scope of bitrate fluctuate. 1-5: 10%-50%. 0: SDK optimized, recommended; */ +}VENC_ATTR_MPEG4_CBR_S; + +typedef struct hiVENC_ATTR_MPEG4_VBR_S +{ + HI_U32 u32Gop; /* the interval of ISLICE. */ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32MaxBitRate; /* the max bitrate */ + HI_U32 u32MaxQp; /* the max qp */ + HI_U32 u32MinQp; /* the min qp */ +}VENC_ATTR_MPEG4_VBR_S; + +typedef struct hiVENC_ATTR_MJPEG_FIXQP_S +{ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate; /* the target frame rate of the venc chnnel */ + HI_U32 u32Qfactor; /* image quality :[1,99]*/ +}VENC_ATTR_MJPEG_FIXQP_S; + +typedef struct hiVENC_ATTR_MJPEG_CBR_S +{ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate ; /* the target frame rate of the venc chnnel */ + HI_U32 u32BitRate; /* average bitrate */ + HI_U32 u32FluctuateLevel; /* level [0..5].scope of bitrate fluctuate. 1-5: 10%-50%. 0: SDK optimized, recommended; */ +} VENC_ATTR_MJPEG_CBR_S; + +typedef struct hiVENC_ATTR_MJPEG_VBR_S +{ + HI_U32 u32StatTime; /* the rate statistic time, the unit is senconds(s) */ + HI_U32 u32SrcFrmRate; /* the input frame rate of the venc chnnel */ + HI_FR32 fr32DstFrmRate; /* the target frame rate of the venc chnnel */ + HI_U32 u32MaxBitRate; /* max bitrate */ + HI_U32 u32MaxQfactor; /* max image quailty allowed */ + HI_U32 u32MinQfactor; /* min image quality allowed */ +}VENC_ATTR_MJPEG_VBR_S; + +typedef struct hiVENC_RC_ATTR_S +{ + VENC_RC_MODE_E enRcMode; /*the type of rc*/ + union + { + VENC_ATTR_H264_CBR_S stAttrH264Cbr; + VENC_ATTR_H264_VBR_S stAttrH264Vbr; + VENC_ATTR_H264_FIXQP_S stAttrH264FixQp; + VENC_ATTR_H264_ABR_S stAttrH264Abr; + + VENC_ATTR_MPEG4_CBR_S stAttrMpeg4Cbr; + VENC_ATTR_MPEG4_FIXQP_S stAttrMpeg4FixQp; + VENC_ATTR_MPEG4_VBR_S stAttrMpeg4Vbr; + + VENC_ATTR_MJPEG_CBR_S stAttrMjpegeCbr; + VENC_ATTR_MJPEG_FIXQP_S stAttrMjpegeFixQp; + VENC_ATTR_MJPEG_VBR_S stAttrMjpegeVbr; + + VENC_ATTR_H265_CBR_S stAttrH265Cbr; + VENC_ATTR_H265_VBR_S stAttrH265Vbr; + VENC_ATTR_H265_FIXQP_S stAttrH265FixQp; + }; + HI_VOID* pRcAttr ; /*the rc attribute which could be specified by user*/ + +}VENC_RC_ATTR_S; + +typedef enum hiRC_SUPERFRM_MODE_E +{ + SUPERFRM_NONE, /* sdk don't care super frame */ + SUPERFRM_DISCARD, /* the super frame is discarded */ + SUPERFRM_REENCODE, /* the super frame is re-encode */ + SUPERFRM_BUTT +}VENC_SUPERFRM_MODE_E; + +typedef struct hiVENC_PARAM_H264_CBR_S +{ + HI_U32 u32MinIprop; /* the min ratio of i frame and p frame */ + HI_U32 u32MaxIprop; /* the max ratio of i frame and p frame */ + HI_U32 u32MaxQp; /* the max QP value */ + HI_U32 u32MinQp; /* the min QP value */ + HI_S32 s32IPQPDelta; /* the qp difference between the i frame and the before gop avarage qp; == Qp(P) - Qp(I) */ + HI_S32 s32QualityLevel; /* quality of picture [1, 5] */ + HI_S32 s32MaxReEncodeTimes; /* max number of re-encode times [0, 3]*/ + HI_U32 u32MinIQp; /* min qp for i frame */ +}VENC_PARAM_H264_CBR_S; + +typedef struct hiVENC_PARAM_H264_VBR_S +{ + HI_S32 s32IPQPDelta; /* the qp difference between the i frame and the before gop avarage qp; == Qp(P) - Qp(I) */ + HI_S32 s32ChangePos; /* Indicates the ratio of the current bit rate to the maximum + bit rate when the QP value starts to be adjusted */ + HI_U32 u32MinIprop; /* the min ratio of i frame and p frame */ + HI_U32 u32MaxIprop; /* the max ratio of i frame and p frame */ + HI_U32 u32MinIQP; /* min qp for i frame */ +}VENC_PARAM_H264_VBR_S; + + + +typedef struct hiVENC_PARAM_MJPEG_CBR_S +{ + HI_U32 u32MaxQfactor; /* the max Qfactor value*/ + HI_U32 u32MinQfactor; /* the min Qfactor value */ + HI_U32 u32RQRatio[RC_RQRATIO_SIZE]; /* the rate stabilization weight, + 100-u32RQRatio[i] is the sequence quality stabilization weight */ + +}VENC_PARAM_MJPEG_CBR_S; + +typedef struct hiVENC_PARAM_MJPEG_VBR_S +{ + HI_S32 s32DeltaQfactor; /* Indicates the maximum change of Qfactor values of frames + when the picture quality changes */ + HI_S32 s32ChangePos; /* Indicates the ratio of the current bit rate to the maximum + bit rate when the Qfactor value starts to be adjusted */ +}VENC_PARAM_MJPEG_VBR_S; + +typedef struct hiVENC_PARAM_MPEG4_CBR_S +{ + HI_U32 u32MinIprop; /* the min ratio of i frame and p frame*/ + HI_U32 u32MaxIprop; /* the max ratio of i frame and p frame */ + + HI_U32 u32MaxQp; /* the max QP value*/ + HI_U32 u32MinQp; /* the min QP value */ + HI_U32 u32MaxPPDeltaQp; /* the max qp value difference between two successive P frame */ + HI_U32 u32MaxIPDeltaQp; /* the max qp value difference between p frame and the next i frame */ + HI_S32 s32IPQPDelta; /* the qp difference between the i frame and the before gop avarage qp*/ + + HI_U32 u32RQRatio[RC_RQRATIO_SIZE]; /* the rate stabilization weight, + 100-u32RQRatio[i] is the sequence quality stabilization weight */ +}VENC_PARAM_MPEG4_CBR_S; + +typedef struct hiVENC_PARAM_MPEG4_VBR_S +{ + HI_S32 s32IPQPDelta; /* the qp difference between the i frame and the before gop avarage qp*/ + + HI_S32 s32ChangePos; /* Indicates the ratio of the current bit rate to the maximum + bit rate when the QP value starts to be adjusted */ + + HI_U32 u32MinIprop; /* the min ratio of i frame and p frame */ + HI_U32 u32MaxIprop; /* the max ratio of i frame and p frame */ +}VENC_PARAM_MPEG4_VBR_S; + +typedef struct hiVENC_PARAM_H264_CBR_S VENC_PARAM_H265_CBR_S; +typedef struct hiVENC_PARAM_H264_VBR_S VENC_PARAM_H265_VBR_S; + + +typedef struct hiVENC_RC_PARAM_S +{ + HI_U32 u32ThrdI[RC_TEXTURE_THR_SIZE]; /* just useful for h264/h265 and mpeg4 for now */ + HI_U32 u32ThrdP[RC_TEXTURE_THR_SIZE]; + HI_U32 u32RowQpDelta; + union + { + VENC_PARAM_H264_CBR_S stParamH264Cbr; + VENC_PARAM_H264_VBR_S stParamH264VBR; + VENC_PARAM_MJPEG_CBR_S stParamMjpegCbr; + VENC_PARAM_MJPEG_VBR_S stParamMjpegVbr; + VENC_PARAM_MPEG4_CBR_S stParamMpeg4Cbr; + VENC_PARAM_MPEG4_VBR_S stParamMpeg4Vbr; + VENC_PARAM_H265_CBR_S stParamH265Cbr; + VENC_PARAM_H265_VBR_S stParamH265Vbr; + }; + + HI_VOID* pRcParam; /*RC parameter which could be specified by usrer*/ +}VENC_RC_PARAM_S; + + + +typedef enum hiVENC_FRAMELOST_MODE_E +{ + FRMLOST_NORMAL, /*normal mode*/ + FRMLOST_PSKIP, /*pskip*/ + FRMLOST_BUTT, +}VENC_FRAMELOST_MODE_E; + +typedef struct hiVENC_PARAM_FRAMELOST_S +{ + HI_BOOL bFrmLostOpen; /* Indicates whether to discard frames to ensure + stable bit rate when the instant bit rate is exceeded */ + HI_U32 u32FrmLostBpsThr; /* the instant bit rate threshold */ + VENC_FRAMELOST_MODE_E enFrmLostMode; /*frame lost strategy*/ + HI_U32 u32EncFrmGaps; /*the gap of frame lost*/ +}VENC_PARAM_FRAMELOST_S; + + +typedef struct hiVENC_SUPERFRAME_CFG_S +{ + VENC_SUPERFRM_MODE_E enSuperFrmMode; /* Indicates the mode of processing the super frame,[SUPERFRM_NONE,SUPERFRM_DISCARD,SUPERFRM_REENCODE]*/ + HI_U32 u32SuperIFrmBitsThr; /* Indicate the threshold of the super I frame + for enabling the super frame processing mode */ + HI_U32 u32SuperPFrmBitsThr; /* Indicate the threshold of the super P frame */ + HI_U32 u32SuperBFrmBitsThr; /* Indicate the threshold of the super B frame */ +}VENC_SUPERFRAME_CFG_S; + +typedef enum hiVENC_RC_PRIORITY_E +{ + VENC_RC_PRIORITY_BITRATE_FIRST = 1, + VENC_RC_PRIORITY_FRAMEBITS_FIRST, + + VENC_RC_PRIORITY_BUTT, +} VENC_RC_PRIORITY_E; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_RC_H__ */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_region.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_region.h new file mode 100644 index 0000000..66532da --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_region.h @@ -0,0 +1,287 @@ +/****************************************************************************** +* +* Copyright (C), 2001-2011, Huawei Tech. Co., Ltd. +* +******************************************************************************* +* File Name : hi_comm_region.h +* Version : Initial Draft +* Author : j00169368 +* Created : 2010/12/13 +* Last Modified : +* Description : include RGN struct , Marco and Error information +* Function List : +* +* +* History: +* +* 1. Date : 2010/12/13 +* Author : j00169368 +* Modification : Created file +* +******************************************************************************/ + + +#ifndef __HI_COMM_REGION_H__ +#define __HI_COMM_REGION_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_errno.h" +#include "hi_defines.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + + + + +typedef HI_U32 RGN_HANDLE; + +/* type of video regions */ +typedef enum hiRGN_TYPE_E +{ + OVERLAY_RGN = 0, /* video overlay region */ + COVER_RGN, + COVEREX_RGN, + OVERLAYEX_RGN, + RGN_BUTT +} RGN_TYPE_E; + +typedef enum hiINVERT_COLOR_MODE_E +{ + LESSTHAN_LUM_THRESH = 0, /* the lum of the video is less than the lum threshold which is set by u32LumThresh */ + MORETHAN_LUM_THRESH, /* the lum of the video is more than the lum threshold which is set by u32LumThresh */ + INVERT_COLOR_BUTT +}INVERT_COLOR_MODE_E; + +typedef struct hiOVERLAY_QP_INFO_S +{ + HI_BOOL bAbsQp; + HI_S32 s32Qp; + HI_BOOL bQpDisable; +}OVERLAY_QP_INFO_S; + +typedef struct hiOVERLAY_INVERT_COLOR_S +{ + SIZE_S stInvColArea; //It must be multipe of 16 but not more than 64. + HI_U32 u32LumThresh; //The threshold to decide whether invert the OSD's color or not. + INVERT_COLOR_MODE_E enChgMod; + HI_BOOL bInvColEn; //The switch of inverting color. +}OVERLAY_INVERT_COLOR_S; + +typedef struct hiOVERLAY_ATTR_S +{ + /* bitmap pixel format,now only support ARGB1555 or ARGB4444 */ + PIXEL_FORMAT_E enPixelFmt; + + /* background color, pixel format depends on "enPixelFmt" */ + HI_U32 u32BgColor; + + /* region size,W:[4,4096],align:2,H:[4,4096],align:2 */ + SIZE_S stSize; +}OVERLAY_ATTR_S; + +typedef struct hiOVERLAY_CHN_ATTR_S +{ + /* X:[0,4096],align:4,Y:[0,4096],align:4 */ + POINT_S stPoint; + + /* background an foreground transparence when pixel format is ARGB1555 + * the pixel format is ARGB1555,when the alpha bit is 1 this alpha is value! + * range:[0,128] + */ + HI_U32 u32FgAlpha; + + /* background an foreground transparence when pixel format is ARGB1555 + * the pixel format is ARGB1555,when the alpha bit is 0 this alpha is value! + * range:[0,128] + */ + HI_U32 u32BgAlpha; + + HI_U32 u32Layer; /* OVERLAY region layer range:[0,7]*/ + + OVERLAY_QP_INFO_S stQpInfo; + + OVERLAY_INVERT_COLOR_S stInvertColor; +}OVERLAY_CHN_ATTR_S; + +typedef enum hiRGN_AREA_TYPE_E +{ + AREA_RECT = 0, + AREA_QUAD_RANGLE, + AREA_BUTT +} RGN_AREA_TYPE_E; + +typedef struct hiRGN_QUADRANGLE_S +{ + HI_BOOL bSolid; /* whether solid or dashed quadrangle */ + HI_U32 u32Thick; /* Line Width of quadrangle, valid when dashed quadrangle */ + POINT_S stPoint[4]; /* points of quadrilateral */ +} RGN_QUADRANGLE_S; + +typedef struct hiCOVER_CHN_ATTR_S +{ + RGN_AREA_TYPE_E enCoverType; /* rect or arbitary quadrilateral COVER */ + union + { + RECT_S stRect; /* config of rect */ + RGN_QUADRANGLE_S stQuadRangle; /* config of arbitary quadrilateral COVER */ + }; + HI_U32 u32Color; + HI_U32 u32Layer; /* COVER region layer */ +}COVER_CHN_ATTR_S; + +typedef struct hiCOVEREX_CHN_ATTR_S +{ + RGN_AREA_TYPE_E enCoverType; /* rect or arbitary quadrilateral COVER */ + union + { + RECT_S stRect; /* config of rect */ + RGN_QUADRANGLE_S stQuadRangle; /* config of arbitary quadrilateral COVER */ + }; + HI_U32 u32Color; + HI_U32 u32Layer; /* COVEREX region layer range:[0,7] */ +}COVEREX_CHN_ATTR_S; + +typedef struct hiOVERLAYEX_COMM_ATTR_S +{ + PIXEL_FORMAT_E enPixelFmt; + + /* background color, pixel format depends on "enPixelFmt" */ + HI_U32 u32BgColor; + + /* region size,W:[4,1920],align:2,H:[4,1080],align:2 */ + SIZE_S stSize; +}OVERLAYEX_ATTR_S; + +typedef struct hiOVERLAYEX_CHN_ATTR_S +{ + /* X:[0,4096],align:4,Y:[0,4636],align:4 */ + POINT_S stPoint; + + /* background an foreground transparence when pixel format is ARGB1555 + * the pixel format is ARGB1555,when the alpha bit is 1 this alpha is value! + * range:[0,255] + */ + HI_U32 u32FgAlpha; + + /* background an foreground transparence when pixel format is ARGB1555 + * the pixel format is ARGB1555,when the alpha bit is 0 this alpha is value! + * range:[0,255] + */ + HI_U32 u32BgAlpha; + + HI_U32 u32Layer; /* OVERLAYEX region layer range:[0,15]*/ +}OVERLAYEX_CHN_ATTR_S; + +typedef union hiRGN_ATTR_U +{ + OVERLAY_ATTR_S stOverlay; /* attribute of overlay region */ + OVERLAYEX_ATTR_S stOverlayEx; /* attribute of overlayex region */ +} RGN_ATTR_U; + +typedef union hiRGN_CHN_ATTR_U +{ + OVERLAY_CHN_ATTR_S stOverlayChn; /* attribute of overlay region */ + COVER_CHN_ATTR_S stCoverChn; /* attribute of cover region */ + COVEREX_CHN_ATTR_S stCoverExChn; /* attribute of coverex region */ + OVERLAYEX_CHN_ATTR_S stOverlayExChn; /* attribute of overlayex region */ +} RGN_CHN_ATTR_U; + +/* attribute of a region */ +typedef struct hiRGN_ATTR_S +{ + RGN_TYPE_E enType; /* region type */ + RGN_ATTR_U unAttr; /* region attribute */ +} RGN_ATTR_S; + +/* attribute of a region */ +typedef struct hiRGN_CHN_ATTR_S +{ + HI_BOOL bShow; + RGN_TYPE_E enType; /* region type */ + RGN_CHN_ATTR_U unChnAttr; /* region attribute */ +} RGN_CHN_ATTR_S; + + + +#define RGN_MAX_BMP_UPDATE_NUM 16 + +typedef struct hiRGN_BMP_UPDATE_S +{ + POINT_S stPoint; + BITMAP_S stBmp; + HI_U32 u32Stride; +} RGN_BMP_UPDATE_S; + +typedef struct hiRGN_BMP_UPDATE_CFG_S +{ + HI_U32 u32BmpCnt; + RGN_BMP_UPDATE_S astBmpUpdate[RGN_MAX_BMP_UPDATE_NUM]; +} RGN_BMP_UPDATE_CFG_S; + +typedef struct hiRGN_CANVAS_INFO_S +{ + HI_U32 u32PhyAddr; + HI_U32 u32VirtAddr; + SIZE_S stSize; + HI_U32 u32Stride; + PIXEL_FORMAT_E enPixelFmt; +} RGN_CANVAS_INFO_S; + +/* PingPong buffer change when set attr, it needs to remap memory in mpi interface */ +#define HI_NOTICE_RGN_BUFFER_CHANGE HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_NOTICE, HI_SUCCESS) + +/* invlalid device ID */ +#define HI_ERR_RGN_INVALID_DEVID HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_RGN_INVALID_CHNID HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_RGN_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_RGN_EXIST HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*UN exist*/ +#define HI_ERR_RGN_UNEXIST HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_RGN_NULL_PTR HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_RGN_NOT_CONFIG HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_RGN_NOT_SUPPORT HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_RGN_NOT_PERM HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_RGN_NOMEM HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_RGN_NOBUF HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_RGN_BUF_EMPTY HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_RGN_BUF_FULL HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* bad address, eg. used for copy_from_user & copy_to_user */ +#define HI_ERR_RGN_BADADDR HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) +/* resource is busy, eg. destroy a venc chn without unregistering it */ +#define HI_ERR_RGN_BUSY HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/* System is not ready,maybe not initialed or loaded. + * Returning the error code when opening a device file failed. + */ +#define HI_ERR_RGN_NOTREADY HI_DEF_ERR(HI_ID_RGN, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __HI_COMM_REGION_H__ */ + + + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_sns.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_sns.h new file mode 100644 index 0000000..f94e5ca --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_sns.h @@ -0,0 +1,321 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_sns.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2011/01/05 + Description : + History : + 1.Date : 2011/01/05 + Author : x00100808 + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_COMM_SNS_H__ +#define __HI_COMM_SNS_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_isp.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef struct hiISP_CMOS_BLACK_LEVEL_S +{ + HI_BOOL bUpdate; + + HI_U16 au16BlackLevel[4]; +} ISP_CMOS_BLACK_LEVEL_S; + + +#define HI_ISP_NR_CALIB_COEF_COL (4) +#define HI_ISP_NR_PARA_LUT_COUNT (6) +#define HI_ISP_NR_ISO_LEVEL_MAX (16) +#define HI_ISP_LSC_LIGHT_NUM (3) +#define RGBIR_MATRIX_NUM (15) + +typedef struct hiISP_NR_CABLI_PARA_S +{ + HI_U8 u8CalicoefRow; + HI_FLOAT (*pCalibcoef)[HI_ISP_NR_CALIB_COEF_COL]; +}ISP_NR_CABLI_PARA_S; + +typedef struct hiISP_NR_ISO_PARA_TABLE_S +{ + + HI_U16 u16Threshold; + HI_U16 u8varStrength; + HI_U16 u8fixStrength; + HI_U8 u8LowFreqSlope; +}ISP_NR_ISO_PARA_TABLE_S; + +typedef struct hiISP_CMOS_NOISE_TABLE_S +{ + /*noise reduction calibration para*/ + ISP_NR_CABLI_PARA_S stNrCaliPara; + /*noise reduction iso para*/ + ISP_NR_ISO_PARA_TABLE_S stIsoParaTable[HI_ISP_NR_ISO_LEVEL_MAX]; +} ISP_CMOS_NOISE_TABLE_S; + +typedef struct hiISP_CMOS_COMPANDER_S +{ + + HI_U32 u32BitDepthIn; + HI_U32 u32BitDepthOut; + HI_U32 u32X0; + HI_U32 u32Y0; + HI_U32 u32X1; + HI_U32 u32Y1; + HI_U32 u32X2; + HI_U32 u32Y2; + HI_U32 u32X3; + HI_U32 u32Y3; + HI_U32 u32Xmax; + HI_U32 u32Ymax; + +}ISP_CMOS_COMPANDER_S; + +typedef struct hiISP_CMOS_DEMOSAIC_S +{ + /*For Demosaic*/ + HI_BOOL bEnable; + HI_U8 u8VhLimit; /* RW,Range: [0x0, 0xFF] */ + HI_U8 u8VhOffset; /* RW,Range: [0x0, 0xFF] */ + HI_U16 u16VhSlope; /* RW,Range: [0x0, 0xFF] */ + /*False Color*/ + HI_BOOL bFcrEnable; + HI_U8 au8FcrStrength[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8FcrThreshold[ISP_AUTO_ISO_STENGTH_NUM]; + /*For Ahd*/ + HI_U16 u16UuSlope; + HI_U16 au16NpOffset[ISP_AUTO_ISO_STENGTH_NUM]; +} ISP_CMOS_DEMOSAIC_S; + +#define HI_ISP_SHARPEN_PARA_NUM (3) + +typedef struct hiISP_CMOS_RGBSHARPEN_S +{ + HI_BOOL abEnPixSel[ISP_AUTO_ISO_STENGTH_NUM]; + + HI_U8 au8MaxSharpAmt1[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8MaxEdgeAmt[ISP_AUTO_ISO_STENGTH_NUM]; + + HI_U8 au8SharpThd2[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8EdgeThd2[ISP_AUTO_ISO_STENGTH_NUM]; + + HI_U8 au8OvershootAmt[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U8 au8UndershootAmt[ISP_AUTO_ISO_STENGTH_NUM]; +} ISP_CMOS_RGBSHARPEN_S; + +typedef struct hiISP_CMOS_DRC_S +{ + HI_BOOL bEnable; + + HI_U8 u8SpatialVar; + HI_U8 u8RangeVar; + + HI_U8 u8Asymmetry; + HI_U8 u8SecondPole; + HI_U8 u8Stretch; + + HI_U8 u8LocalMixingBrigtht; + HI_U8 u8LocalMixingDark; + HI_U8 u8LocalMixingThres; + + HI_U16 u16DarkGainLmtY; + HI_U16 u16DarkGainLmtC; + HI_U16 u16BrightGainLmt; +} ISP_CMOS_DRC_S; + + +#define GAMMA_FE0_LUT_SIZE 33 +#define GAMMA_FE1_LUT_SIZE 257 +typedef struct hiISP_CMOS_GAMMAFE_S +{ + HI_BOOL bValid; /* wdr sensor should set */ + + HI_U16 au16Gammafe0[GAMMA_FE0_LUT_SIZE]; + HI_U16 au16Gammafe1[GAMMA_FE1_LUT_SIZE]; +} ISP_CMOS_GAMMAFE_S; + +#define CMOS_SHADING_TABLE_NODE_NUMBER_MAX (129) +typedef struct hiISP_CMOS_SHADING_S +{ + HI_BOOL bValid; + + HI_U16 u16RCenterX; + HI_U16 u16RCenterY; + HI_U16 u16GCenterX; + HI_U16 u16GCenterY; + HI_U16 u16BCenterX; + HI_U16 u16BCenterY; + + HI_U16 au16RShadingTbl[CMOS_SHADING_TABLE_NODE_NUMBER_MAX]; + HI_U16 au16GShadingTbl[CMOS_SHADING_TABLE_NODE_NUMBER_MAX]; + HI_U16 au16BShadingTbl[CMOS_SHADING_TABLE_NODE_NUMBER_MAX]; + + HI_U16 u16ROffCenter; + HI_U16 u16GOffCenter; + HI_U16 u16BOffCenter; + + HI_U16 u16TblNodeNum; +} ISP_CMOS_SHADING_S; + +#define GAMMA_NODE_NUMBER 257 +typedef struct hiISP_CMOS_GAMMA_S +{ + HI_BOOL bValid; + + HI_U16 au16Gamma[GAMMA_NODE_NUMBER]; +} ISP_CMOS_GAMMA_S; + +#define HI_ISP_UVNR_SIGMA_PRECISION (1) +typedef struct hiISP_CMOS_UVNR_S +{ + HI_S32 UVNR_lutSigma [ISP_AUTO_ISO_STENGTH_NUM]; + HI_S8 Coring_lutLimit [ISP_AUTO_ISO_STENGTH_NUM]; + HI_S8 UVNR_blendRatio [ISP_AUTO_ISO_STENGTH_NUM]; + +} ISP_CMOS_UVNR_S; + +typedef struct hiISP_CMOS_SENSOR_MAX_RESOLUTION_S +{ + HI_U32 u32MaxWidth; + HI_U32 u32MaxHeight; +}ISP_CMOS_SENSOR_MAX_RESOLUTION_S; + +typedef struct hiISP_CMOS_DPC_S +{ + //HI_U8 u8IRChannel;// 1 yes;0 no + //HI_U8 u8IRPosition;//0:Gb,1:Gr + HI_U16 au16Slope[ISP_AUTO_ISO_STENGTH_NUM]; + HI_U16 au16BlendRatio[ISP_AUTO_ISO_STENGTH_NUM]; +} ISP_CMOS_DPC_S; + +#define HI_ISP_LSC_GRID_POINTS (289) +typedef struct hiISP_LSC_CABLI_TABLE_S +{ + HI_U32 au32R_Gain[HI_ISP_LSC_GRID_POINTS]; + HI_U32 au32Gr_Gain[HI_ISP_LSC_GRID_POINTS]; + HI_U32 au32Gb_Gain[HI_ISP_LSC_GRID_POINTS]; + HI_U32 au32B_Gain[HI_ISP_LSC_GRID_POINTS]; +}ISP_LSC_CABLI_TABLE_S; + +typedef struct hiISP_CMOS_LSC_S +{ + ISP_LSC_CABLI_TABLE_S stLscParaTable[HI_ISP_LSC_LIGHT_NUM]; +}ISP_CMOS_LSC_S; + +typedef enum hiISP_CMOS_IRPOS_TYPE_E +{ + ISP_CMOS_IRPOS_TYPE_GR = 0x0, + ISP_CMOS_IRPOS_TYPE_GB, + ISP_CMOS_IRPOS_TYPE_BUTT +}ISP_CMOS_IRPOS_TYPE_E; + +typedef enum hiISP_CMOS_OP_TYPE_E +{ + OP_CMOS_TYPE_AUTO = 0, + OP_CMOS_TYPE_MANUAL = 1, + OP_CMOS_TYPE_BUTT +} ISP_CMOS_OP_TYPE_E; + +typedef struct hiISP_CMOS_RGBIR_ATTR_S +{ + HI_BOOL bEnable; /*RW, Range: [false, true] Rgbir moudle enable */ + ISP_CMOS_IRPOS_TYPE_E enIrPosType; /*RW, Range: [0, 1] Rgbir moudle ir position: 0 Gr, 1 Gb */ + HI_U16 u16OverExpThresh; /*RW, Range: [0,4095] Rgbir moudle over exposure threshold*/ +}ISP_CMOS_RGBIR_ATTR_S; + +typedef struct hiISP_CMOS_RGBIR_CTRL_S +{ + HI_BOOL bIrOutEn; /*RW, Range: [false, true] Rgbir moudle output ir image enable */ + HI_BOOL bIrFilterEn; /*RW, Range: [false, true] Rgbir moudle noise filter enable */ + HI_BOOL bRemovelEn; /*RW, Range: [false, true] Rgbir moudle removel ir enable */ + ISP_CMOS_OP_TYPE_E enCompType; /*RW, Range: [false, true] Rgbir moudle after removel ir, compensation type 0:auto,1:manul */ + HI_U16 u16ManuGain; /*RW, Range: [256,1023] Rgbir moudle after removel ir, manul-compensation gain,2bit integer,8bit decimal */ + HI_S16 as16ScaleCoef[RGBIR_MATRIX_NUM]; /*RW, Range: [-512,511] Rgbir moudle removel ir translate matrix,bit9:signed bit,bit8:integer bit,bit7_0:decimal bit*/ +}ISP_CMOS_RGBIR_CTRL_S; + +typedef struct hiISP_CMOS_RGBIR_S +{ + HI_BOOL bValid; /* if bValid is false, below paramter is not setted in xxx_cmos.c*/ + ISP_CMOS_RGBIR_ATTR_S stRgbirAttr; + ISP_CMOS_RGBIR_CTRL_S stRgbirCtrl; +}ISP_CMOS_RGBIR_S; + +typedef struct hiISP_CMOS_GE_S +{ + HI_BOOL bEnable; + HI_U8 u8Slope; + HI_U8 u8Sensitivity; + HI_U16 u16Threshold; + HI_U16 u16SensiThreshold; + HI_U16 au16Strength[ISP_AUTO_ISO_STENGTH_NUM]; +}ISP_CMOS_GE_S; + + +typedef struct hiISP_CMOS_DEFAULT_S +{ + ISP_CMOS_DRC_S stDrc; + ISP_CMOS_NOISE_TABLE_S stNoiseTbl; + ISP_CMOS_DEMOSAIC_S stDemosaic; + ISP_CMOS_GAMMAFE_S stGammafe; + ISP_CMOS_GAMMA_S stGamma; + ISP_CMOS_RGBSHARPEN_S stRgbSharpen; + ISP_CMOS_UVNR_S stUvnr; + ISP_CMOS_DPC_S stDpc; + ISP_CMOS_LSC_S stLsc; + ISP_CMOS_RGBIR_S stRgbir; + ISP_CMOS_GE_S stGe; + ISP_CMOS_COMPANDER_S stCompander; + + ISP_CMOS_SENSOR_MAX_RESOLUTION_S stSensorMaxResolution; +} ISP_CMOS_DEFAULT_S; + +typedef struct hiISP_CMOS_SENSOR_IMAGE_MODE_S +{ + HI_U16 u16Width; + HI_U16 u16Height; + HI_FLOAT f32Fps; +}ISP_CMOS_SENSOR_IMAGE_MODE_S; + +typedef struct hiISP_SENSOR_EXP_FUNC_S +{ + HI_VOID(*pfn_cmos_sensor_init)(HI_VOID); + HI_VOID(*pfn_cmos_sensor_exit)(HI_VOID); + HI_VOID(*pfn_cmos_sensor_global_init)(HI_VOID); + HI_S32(*pfn_cmos_set_image_mode)(ISP_CMOS_SENSOR_IMAGE_MODE_S *pstSensorImageMode); + HI_VOID(*pfn_cmos_set_wdr_mode)(HI_U8 u8Mode); + + /* the algs get data which is associated with sensor, except 3a */ + HI_U32(*pfn_cmos_get_isp_default)(ISP_CMOS_DEFAULT_S *pstDef); + HI_U32(*pfn_cmos_get_isp_black_level)(ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel); + HI_U32(*pfn_cmos_get_sns_reg_info)(ISP_SNS_REGS_INFO_S *pstSnsRegsInfo); + + /* the function of sensor set pixel detect */ + HI_VOID(*pfn_cmos_set_pixel_detect)(HI_BOOL bEnable); +} ISP_SENSOR_EXP_FUNC_S; + +typedef struct hiISP_SENSOR_REGISTER_S +{ + ISP_SENSOR_EXP_FUNC_S stSnsExp; +} ISP_SENSOR_REGISTER_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__HI_COMM_SNS_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_sys.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_sys.h new file mode 100644 index 0000000..0111edd --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_sys.h @@ -0,0 +1,75 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi3511_sys.h +Version : Initial Draft +Author : Hi3511 MPP Team +Created : 2007/1/30 +Last Modified : +Description : Hi3511 chip specific configure data structure +Function List : +History : + 1.Date : 2007/1/30 + Author : c42025 + Modification: Created file + + 2.Date : 2007/11/30 + Author : c42025 + Modification: modify according review comments + + 3.Date : 2008/03/03 + Author : c42025 + Modification: modify HI_TRACE_SYS + + 4.Date : 2008/03/05 + Author : c42025 + Modification: modify 'HI_LOG_LEVEL_ERROR' to 'EN_ERR_LEVEL_ERROR' + +******************************************************************************/ +#ifndef __HI_COMM_SYS_H__ +#define __HI_COMM_SYS_H__ + +#include "hi_type.h" +#include "hi_errno.h" +#include "hi_debug.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +#define HI_TRACE_SYS(level, fmt...) HI_TRACE(level, HI_ID_SYS,##fmt) +typedef struct hiMPP_SYS_CONF_S +{ + /* stride of picture buffer must be aligned with this value. + * you can choose a value from 1 to 1024, and it must be multiple of 16. + */ + HI_U32 u32AlignWidth; + +} MPP_SYS_CONF_S; + +typedef struct hiSYS_VIRMEM_INFO_S +{ + HI_U32 u32PhyAddr; + HI_BOOL bCached; +} SYS_VIRMEM_INFO_S; + + +#define HI_ERR_SYS_NULL_PTR HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_SYS_NOTREADY HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_SYS_NOT_PERM HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +#define HI_ERR_SYS_NOMEM HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_SYS_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_SYS_BUSY HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_SYS_NOT_SUPPORT HI_DEF_ERR(HI_ID_SYS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_SYS_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vb.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vb.h new file mode 100644 index 0000000..26e02d9 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vb.h @@ -0,0 +1,150 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_common.h +Version : Initial Draft +Author : Hi3511 MPP Team +Created : 2006/11/09 +Last Modified : +Description : The common data type defination for VB module. +Function List : +History : + 1.Date : 2006/11/03 + Author : c42025 + Modification: Created file + + 2.Date : 2007/11/30 + Author : c42025 + Modification: modify according review comments + + 3.Date : 2008/06/18 + Author : c42025 + Modification: add VB_UID_PCIV + + 4.Date : 2008/10/31 + Author : z44949 + Modification : Translate the chinese comment + + 5.Date : 2008/10/31 + Author : p00123320 + Modification : change commentary of u32MaxPoolCnt in VB_CONF_S +******************************************************************************/ +#ifndef __HI_COMM_VB_H__ +#define __HI_COMM_VB_H__ + +#include "hi_type.h" +#include "hi_errno.h" +#include "hi_debug.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#define VB_MAX_POOLS 256 +#define VB_MAX_COMM_POOLS 16 +#define VB_MAX_MOD_COMM_POOLS 16 + + +/* user ID for VB */ +#define VB_MAX_USER 23 + +typedef enum hiVB_UID_E +{ + VB_UID_VIU = 0, + VB_UID_VOU = 1, + VB_UID_VGS = 2, + VB_UID_VENC = 3, + VB_UID_VDEC = 4, + VB_UID_VDA = 5, + VB_UID_H264E = 6, + VB_UID_JPEGE = 7, + VB_UID_MPEG4E = 8, + VB_UID_H264D = 9, + VB_UID_JPEGD = 10, + VB_UID_MPEG4D = 11, + VB_UID_VPSS = 12, + VB_UID_GRP = 13, + VB_UID_MPI = 14, + VB_UID_PCIV = 15, + VB_UID_AI = 16, + VB_UID_AENC = 17, + VB_UID_RC = 18, + VB_UID_VFMW = 19, + VB_UID_USER = 20, + VB_UID_H265E = 21, + VB_UID_FISHEYE = 22, + VB_UID_BUTT + +} VB_UID_E; + +#define VB_INVALID_POOLID (-1UL) +#define VB_INVALID_HANDLE (-1UL) + +/* Generall common pool use this owner id, module common pool use VB_UID as owner id */ +#define POOL_OWNER_COMMON -1 + +/* Private pool use this owner id */ +#define POOL_OWNER_PRIVATE -2 + +typedef enum hiPOOL_TYPE_E +{ + POOL_TYPE_COMMON = 0, + POOL_TYPE_PRIVATE = 1, + POOL_TYPE_MODULE_COMMON = 2, + POOL_TYPE_BUTT +} POOL_TYPE_E; + +typedef HI_U32 VB_POOL; +typedef HI_U32 VB_BLK; + +#define RESERVE_MMZ_NAME "window" + +typedef struct hiVB_CONF_S +{ + HI_U32 u32MaxPoolCnt; /* max count of pools, (0,VB_MAX_POOLS] */ + struct hiVB_CPOOL_S + { + HI_U32 u32BlkSize; + HI_U32 u32BlkCnt; + HI_CHAR acMmzName[MAX_MMZ_NAME_LEN]; + }astCommPool[VB_MAX_COMM_POOLS]; +} VB_CONF_S; + +typedef struct hiVB_POOL_STATUS_S +{ + HI_U32 bIsCommPool; + HI_U32 u32BlkCnt; + HI_U32 u32FreeBlkCnt; +}VB_POOL_STATUS_S; + +#define VB_SUPPLEMENT_JPEG_MASK 0x1 + +typedef struct hiVB_SUPPLEMENT_CONF_S +{ + HI_U32 u32SupplementConf; +}VB_SUPPLEMENT_CONF_S; + + +#define HI_ERR_VB_NULL_PTR HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VB_NOMEM HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_VB_NOBUF HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +#define HI_ERR_VB_UNEXIST HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +#define HI_ERR_VB_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VB_NOTREADY HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VB_BUSY HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_VB_NOT_PERM HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) + +#define HI_ERR_VB_2MPOOLS HI_DEF_ERR(HI_ID_VB, EN_ERR_LEVEL_ERROR, EN_ERR_BUTT + 1) + +#define HI_TRACE_VB(level,fmt...) HI_TRACE(level, HI_ID_VB,##fmt) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_VB_H_ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vda.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vda.h new file mode 100644 index 0000000..c9a1999 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vda.h @@ -0,0 +1,288 @@ +/****************************************************************************** +* +* Copyright (C), 2001-2011, Huawei Tech. Co., Ltd. +* +******************************************************************************* +* File Name : hi_comm_vda.h +* Version : Initial Draft +* Author : j00169368,l64467 +* Created : 2011/1/7 +* Last Modified : +* Description : include VDA struct , Marco and Error information +* Function List : +* +* +* History: +* +* 1. Date : 2011/1/7 +* Author : j00169368,l64467 +* Modification : Created file +* +******************************************************************************/ + +#ifndef __HI_COMM_VDA_H__ +#define __HI_COMM_VDA_H__ + +#include "hi_type.h" +#include "hi_debug.h" +#include "hi_comm_video.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_defines.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +/*Motion Region Data*/ +typedef struct hiVDA_OBJ_S +{ + HI_U16 u16Left; + HI_U16 u16Top; + HI_U16 u16Right; + HI_U16 u16Bottom; +}VDA_OBJ_S; + +/*reference pictrue mode*/ +typedef enum hiVDA_REF_MODE_E +{ + VDA_REF_MODE_DYNAMIC = 0, /*reference pictrue dynamic*/ + VDA_REF_MODE_STATIC, /*reference pictrue static*/ + VDA_REF_MODE_USER, /*reference pictrue user*/ + VDA_REF_MODE_BUTT /*reserve*/ +}VDA_REF_MODE_E; + +/*VDA algorithm*/ +typedef enum hiVDA_ALG_E +{ + VDA_ALG_BG = 0, /*base on background pictrue*/ + VDA_ALG_REF, /*base on reference pictrue*/ + VDA_ALG_BUTT +}VDA_ALG_E; + +/*MB size*/ +typedef enum hiVDA_MB_SIZE_E +{ + VDA_MB_8PIXEL, /* 8*8 */ + VDA_MB_16PIXEL, /* 16*16 */ + VDA_MB_BUTT +}VDA_MB_SIZE_E; + +/*SAD bits*/ +typedef enum hiVDA_MB_SADBITS_E +{ + VDA_MB_SAD_8BIT = 0, /*SAD precision 8bits*/ + VDA_MB_SAD_16BIT, /*SAD precision 16bits*/ + VDA_MB_SAD_BUTT /*reserve*/ +} VDA_MB_SADBITS_E; + + +/*OD region attribute*/ +typedef struct hiVDA_OD_RGN_ATTR_S +{ + /*static attribute*/ + RECT_S stRect; /*region rect + *X:[0,VDA_MAX_WIDTH),align:16 + *Y:[0,VDA_MAX_HEIGHT) + *W:[16,VDA_MAX_WIDTH],align:16 + *H:[16,VDA_MAX_HEIGHT],align:16 + *X+W <= chunnel wight + *Y+H <= chunnel height + */ + + /*dynamic attribute*/ + HI_U32 u32SadTh; /*SAD threshold,range:[0,4080]*/ + HI_U32 u32AreaTh; /*alarm area threshold,range:[0,100]*/ + HI_U32 u32OccCntTh; /*alarm frame count threshold,range:[1,256]*/ + HI_U32 u32UnOccCntTh; /*The max uncover count,range:[0,256]*/ +}VDA_OD_RGN_ATTR_S; + +/*MD attribute*/ +typedef struct hiVDA_MD_ATTR_S +{ + /*static attribute*/ + VDA_ALG_E enVdaAlg; /*arithmetic*/ + VDA_MB_SIZE_E enMbSize; /*MB size*/ + VDA_MB_SADBITS_E enMbSadBits; /*MB SAD size*/ + VDA_REF_MODE_E enRefMode; /*reference picture mode*/ + HI_U32 u32MdBufNum; /*Result buffer number,range:[1,16]*/ + + /*dynamic attribute*/ + HI_U32 u32VdaIntvl; /*VDA interval,range:[0,256]*/ + + HI_U32 u32BgUpSrcWgt; /*the source picture weight, + *back ground updata totle weight 256, + *range:[1,255],recommendatory value:128 + */ + + HI_U32 u32SadTh; /*SAD threshold,range:[0,4080],recommendatory value:100*/ + HI_U32 u32ObjNumMax; /*max OBJ number,range:[1,128]*/ +}VDA_MD_ATTR_S; + + +#define VDA_OD_RGN_NUM_MAX 4 + +/*OD attribute*/ +typedef struct hiVDA_OD_ATTR_S +{ + HI_U32 u32RgnNum; /*region number*/ + VDA_OD_RGN_ATTR_S astOdRgnAttr[VDA_OD_RGN_NUM_MAX]; /*region attribute*/ + + /*static attribute*/ + VDA_ALG_E enVdaAlg; /*arithmetic*/ + VDA_MB_SIZE_E enMbSize; /*MB size*/ + VDA_MB_SADBITS_E enMbSadBits; /*MB SAD size*/ + VDA_REF_MODE_E enRefMode; /*reference picture mode*/ + + /*dynamic attribute*/ + HI_U32 u32VdaIntvl; /*VDA interval,[0,256]*/ + HI_U32 u32BgUpSrcWgt; /*back ground updata totle weight 256,the source picture weight,[1,255]*/ + + +}VDA_OD_ATTR_S; + + +/*work mode*/ +typedef enum hiVDA_WORK_MODE_E +{ + VDA_WORK_MODE_MD = 0, /*motion detection*/ + VDA_WORK_MODE_OD, /*Occlusion detection*/ + VDA_WORK_MODE_BUTT +}VDA_WORK_MODE_E; + + +/*work mode attribute*/ +typedef union hiVDA_WORK_MODE_ATTR_U +{ + VDA_MD_ATTR_S stMdAttr; /*MD attribute*/ + VDA_OD_ATTR_S stOdAttr; /*OD attribute*/ +}VDA_WORK_MODE_ATTR_U; + + +/*VDA CHN attribute*/ +typedef struct hiVDA_CHN_ATTR_S +{ + VDA_WORK_MODE_E enWorkMode; /*work mode*/ + VDA_WORK_MODE_ATTR_U unAttr; /*work mode attribute*/ + HI_U32 u32Width; /*the width of CHNL,[16,VDA_MAX_WIDTH]*/ + HI_U32 u32Height; /*the height of CHNL,[16,VDA_MAX_HEIGHT]*/ +}VDA_CHN_ATTR_S; + + +/*MB SAD data*/ +typedef struct hiVDA_MB_SAD_DATA_S +{ + HI_VOID *pAddr; /*address*/ + HI_U32 u32Stride; /*stride*/ + VDA_MB_SADBITS_E enMbSadBits; /*the MB SAD size*/ +}VDA_MB_SAD_DATA_S; + +/*OBJ data*/ +typedef struct hiVDA_OBJ_DATA_S +{ + HI_U32 u32ObjNum; /*OBJ number*/ + VDA_OBJ_S *pstAddr; /*OBJ data address*/ + + HI_U32 u32IndexOfMaxObj; /*index of max OBJ*/ + HI_U32 u32SizeOfMaxObj; /*size of max OBJ*/ + HI_U32 u32SizeOfTotalObj; /*total size of all OBJ*/ +}VDA_OBJ_DATA_S; + + +/*MD data*/ +typedef struct hiVDA_MD_DATA_S +{ + HI_BOOL bMbSadValid; /*SAD data is valid?*/ + VDA_MB_SAD_DATA_S stMbSadData; /*MB SAD data*/ + + HI_BOOL bObjValid; /*OBJ data is valid?*/ + VDA_OBJ_DATA_S stObjData; /*OBJ data*/ + + HI_BOOL bPelsNumValid; /*alarm pixel number data is valid?*/ + HI_U32 u32AlarmPixCnt;/*motion pix of picture*/ +}VDA_MD_DATA_S; + + +/*OD data*/ +typedef struct hiVDA_OD_DATA_S +{ + HI_U32 u32RgnNum; /*region number*/ + HI_BOOL abRgnAlarm[VDA_OD_RGN_NUM_MAX]; /*HI_TRUE:alarm*/ +}VDA_OD_DATA_S; + + + +typedef union hiVDA_DATA_U +{ + VDA_MD_DATA_S stMdData; /*MD data*/ + VDA_OD_DATA_S stOdData; /*OD data*/ +}VDA_DATA_U; + + +/*VDA data*/ +typedef struct hiVDA_DATA_S +{ + VDA_WORK_MODE_E enWorkMode; /*work mode*/ + VDA_DATA_U unData; /*VDA data*/ + VDA_MB_SIZE_E enMbSize; /*MB size*/ + HI_U32 u32MbWidth; /*VDA channle width in MB*/ + HI_U32 u32MbHeight; /*VDA channle height in MB*/ + HI_U64 u64Pts; /*time*/ +}VDA_DATA_S; + + +/*chnnel state*/ +typedef struct hiVDA_CHN_STAT_S +{ + HI_BOOL bStartRecvPic; /*start receive picture*/ + HI_U32 u32LeftPic; /*left picture*/ + HI_U32 u32LeftRst; /*left data*/ +}VDA_CHN_STAT_S; + +/* invlalid device ID */ +#define HI_ERR_VDA_INVALID_DEVID HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +/* invlalid channel ID */ +#define HI_ERR_VDA_INVALID_CHNID HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_VDA_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_VDA_EXIST HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/*UN exist*/ +#define HI_ERR_VDA_UNEXIST HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_VDA_NULL_PTR HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_VDA_NOT_CONFIG HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_VDA_NOT_SUPPORT HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_VDA_NOT_PERM HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_VDA_NOMEM HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_VDA_NOBUF HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_VDA_BUF_EMPTY HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_VDA_BUF_FULL HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* bad address, eg. used for copy_from_user & copy_to_user */ +#define HI_ERR_VDA_BADADDR HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) +/* resource is busy, eg. destroy a venc chn without unregistering it */ +#define HI_ERR_VDA_BUSY HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/* System is not ready,maybe not initialed or loaded. + * Returning the error code when opening a device file failed. + */ +#define HI_ERR_VDA_NOTREADY HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + + +#endif /* End of #ifndef __HI_COMM_VDA_H__ */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vdec.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vdec.h new file mode 100644 index 0000000..833cbbf --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vdec.h @@ -0,0 +1,256 @@ +/****************************************************************************** + + Copyright (C), 2013, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_vdec.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/08 + Description : Common Def Of video decode + History : + 1.Date : 2013/05/08 + Author : l00226816 + Modification: Created file +******************************************************************************/ + + +#ifndef __HI_COMM_VDEC_H__ +#define __HI_COMM_VDEC_H__ +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" +#include "hi_defines.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/*vdec channel attr(user interface)*/ + +#define HI_IO_BLOCK HI_TRUE +#define HI_IO_NOBLOCK HI_FALSE + + +typedef struct hiVDEC_CHN_LUM_S +{ + HI_U64 u64LumPixSum; /* Luma sum of current frame */ + HI_U32 u32LumPixAverage; /* Luma average of current frame */ + HI_U64 u64Pts; /* PTS of current frame ?? */ +} VDEC_CHN_LUM_S; + + +typedef enum hiVIDEO_MODE_E +{ + VIDEO_MODE_STREAM = 0, /*send by stream*/ + VIDEO_MODE_FRAME , /*send by frame*/ + VIDEO_MODE_BUTT +}VIDEO_MODE_E; + + +typedef struct hiVDEC_ATTR_JPEG_S +{ + VIDEO_MODE_E enMode; /* video stream mode select */ +}VDEC_ATTR_JPEG_S,*PTR_VDEC_ATTR_JPEG_S; + + +typedef struct hiVDEC_ATTR_VIDEO_S +{ + HI_U32 u32RefFrameNum; /*ref pic num [1,16]*/ + VIDEO_MODE_E enMode; /*send by stream or by frame*/ + HI_S32 s32SupportBFrame; /*enable chnl to support BFrame decode, 0: disable support BFrame decode,1: enable support BFrame*/ +}VDEC_ATTR_VIDEO_S,*PTR_VDEC_ATTR_VIDEO_S; + + +typedef struct hiVDEC_CHN_ATTR_S +{ + PAYLOAD_TYPE_E enType; /* video type to be decoded */ + HI_U32 u32BufSize ; /* stream buf size(Byte) */ + HI_U32 u32Priority ; /* priority */ + HI_U32 u32PicWidth ; /* max pic width */ + HI_U32 u32PicHeight ; /* max pic height */ + union + { + VDEC_ATTR_JPEG_S stVdecJpegAttr; /* structure with jpeg or mjpeg type */ + VDEC_ATTR_VIDEO_S stVdecVideoAttr; /* structure with video ( h264/mpeg4) */ + }; +}VDEC_CHN_ATTR_S; + + +typedef struct hiVDEC_STREAM_S +{ + HI_U8* pu8Addr; /* stream address */ + HI_U32 u32Len; /* stream len */ + HI_U64 u64PTS; /* time stamp */ + HI_BOOL bEndOfFrame; /* is the end of a frame */ + HI_BOOL bEndOfStream; /* is the end of all stream */ +}VDEC_STREAM_S; + +typedef struct hiVDEC_USERDATA_S{ + HI_U8* pu8Addr; /* userdata data vir address */ + HI_U32 u32PhyAddr; /* userdata data phy address */ + HI_U32 u32Len; /* userdata data len */ + HI_BOOL bValid; /* is valid? */ +}VDEC_USERDATA_S; + + +typedef struct hi_VDEC_DECODE_ERROR_S +{ + HI_S32 s32FormatErr; /* format error. eg: do not support filed */ + HI_S32 s32PicSizeErrSet; /* picture width or height is larger than chnnel width or height*/ + HI_S32 s32StreamUnsprt; /* unsupport the stream specification */ + HI_S32 s32PackErr; /* stream package error */ + HI_S32 s32PrtclNumErrSet; /* protocol num is not enough. eg: slice, pps, sps */ + HI_S32 s32RefErrSet; /* refrence num is not enough */ + HI_S32 s32PicBufSizeErrSet; /* the buffer size of picture is not enough */ +}VDEC_DECODE_ERROR_S; + + +typedef struct hiVDEC_CHN_STAT_S +{ + PAYLOAD_TYPE_E enType; /* video type to be decoded */ + HI_U32 u32LeftStreamBytes; /* left stream bytes waiting for decode */ + HI_U32 u32LeftStreamFrames; /* left frames waiting for decode,only valid for H264D_MODE_FRAME */ + HI_U32 u32LeftPics; /* pics waiting for output */ + HI_BOOL bStartRecvStream; /* had started recv stream? */ + HI_U32 u32RecvStreamFrames; /* how many frames of stream has been received. valid when send by frame. */ + HI_U32 u32DecodeStreamFrames; /* how many frames of stream has been decoded. valid when send by frame. */ + VDEC_DECODE_ERROR_S stVdecDecErr; /* information about decode error */ +}VDEC_CHN_STAT_S; + +/* + * static parameter: must set after stop sending stream and all stream is decoded. + * dynamic parameter: can be set at any time. + */ +typedef struct hiVDEC_CHN_PARAM_S +{ + HI_S32 s32ChanErrThr; /* threshold for stream error process, 0: discard with any error, 100 : keep data with any error */ + HI_S32 s32ChanStrmOFThr; /* threshold for stream overflow, 0~ , 0: nothing to do when stream is overflow */ + HI_S32 s32DecMode; /* decode mode , 0: deocde IPB frames, 1: only decode I frame & P frame , 2: only decode I frame */ + HI_S32 s32DecOrderOutput; /* frames output order ,0: the same with display order , 1: the same width decoder order */ + VIDEO_FORMAT_E enVideoFormat; + COMPRESS_MODE_E enCompressMode; +}VDEC_CHN_PARAM_S; + +typedef struct hiVDEC_PRTCL_PARAM_S +{ + HI_S32 s32MaxSliceNum; /* max slice num support */ + HI_S32 s32MaxSpsNum; /* max sps num support */ + HI_S32 s32MaxPpsNum; /* max pps num support */ + HI_S32 s32DisplayFrameNum; /* display frame num */ +}VDEC_PRTCL_PARAM_S; + + +//structure & varibale for jpegd decoder lib +/*********************************************************************************************************/ +/* stream packet for jpeg */ +typedef struct hiJPEGD_STREAM_PACKET_S +{ + HI_U32 PhyAddr[2]; + HI_VOID* VirAddr[2]; + HI_U32 Length[2]; + HI_U64 Pts; + HI_U32 Index; + +} USR_STREAM_PACKET_S; + +/* description structure for memory record */ +typedef struct hiUSR_MEM_DESC_S +{ + HI_U32 u32PhyAddr; + HI_U32 u32Length; +} USR_MEM_DESC_S; + +typedef enum hiJPEGD_DECODE_ERROR_E +{ + JPEGD_ERR_NONE = 0, + JPEGD_ERR_STREAM, + JPEGD_ERR_PIC_SIZE, + JPEGD_ERR_PICBUF_SIZE, + JPEGD_ERR_FORMAT, + VIDEO_ERR_BULL +}JPEGD_DECODE_ERROR_E; + + +typedef enum hiVDEC_JPG_COLOR_FMT_E +{ + JPG_COLOR_FMT_YCBCR400, /*YUV400*/ + JPG_COLOR_FMT_YCBCR420 = 3, /*YUV420*/ + JPG_COLOR_FMT_YCBCR422BHP, /*YUV 422 2x1*/ + JPG_COLOR_FMT_YCBCR422BVP, /*YUV 422 1x2*/ + JPG_COLOR_FMT_YCBCR444, /*YUV 444*/ + JPG_COLOR_FMT_BUTT +} VDEC_JPG_COLOR_FMT_E; + +typedef struct +{ + VDEC_JPG_COLOR_FMT_E enFmt; /* YUV format */ + + HI_S32 s32IsFrameValid; + HI_U64 u64LuPixSum; + HI_U64 Pts; + HI_S32 s32IsSemiPlanar; + + HI_S32 s32YWidth; + HI_S32 s32YHeight; + + HI_S32 s32LumaPhyAddr; + HI_S32 s32LumaStride; + + HI_S32 s32CbPhyAddr; /* semi-planar: this variable is PhyAddr of interlaced chroma; planar: this variable is PhyAddr of Cb */ + HI_S32 s32CrPhyAddr; /* semi-planar: this variable is not value ; planar: this variable is PhyAddr of Cr */ + HI_S32 s32ChromStride; + HI_S32 s32ChromCrStride; +} VDEC_FRAME_DESC_S; + +/************************************************************************************************************************/ + +/* invlalid channel ID */ +#define HI_ERR_VDEC_INVALID_CHNID HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_VDEC_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_VDEC_EXIST HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* using a NULL point */ +#define HI_ERR_VDEC_NULL_PTR HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_VDEC_NOT_CONFIG HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_VDEC_NOT_SURPPORT HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_VDEC_NOT_PERM HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* the channle is not existed */ +#define HI_ERR_VDEC_UNEXIST HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* failure caused by malloc memory */ +#define HI_ERR_VDEC_NOMEM HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_VDEC_NOBUF HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_VDEC_BUF_EMPTY HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_VDEC_BUF_FULL HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_VDEC_SYS_NOTREADY HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/*system busy*/ +#define HI_ERR_VDEC_BUSY HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + +/* bad address, eg. used for copy_from_user & copy_to_user */ +#define HI_ERR_VDEC_BADADDR HI_DEF_ERR(HI_ID_VDEC, EN_ERR_LEVEL_ERROR, EN_ERR_BADADDR) + + + + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_VDEC_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_venc.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_venc.h new file mode 100644 index 0000000..a5dd370 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_venc.h @@ -0,0 +1,696 @@ +/****************************************************************************** + + Copyright (C), 2001-2012, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_venc.h + Version : + Author : Hisilicon Hi35xx MPP Team + Created : 2006/11/24 + Last Modified : + Description : common struct definition for VENC + Function List : + History : +******************************************************************************/ +#ifndef __HI_COMM_VENC_H__ +#define __HI_COMM_VENC_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" +#include "hi_comm_rc.h" + + + +/* invlalid channel ID */ +#define HI_ERR_VENC_INVALID_CHNID HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +/* at lease one parameter is illagal ,eg, an illegal enumeration value */ +#define HI_ERR_VENC_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +/* channel exists */ +#define HI_ERR_VENC_EXIST HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +/* channel exists */ +#define HI_ERR_VENC_UNEXIST HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +/* using a NULL point */ +#define HI_ERR_VENC_NULL_PTR HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +/* try to enable or initialize system,device or channel, before configing attribute */ +#define HI_ERR_VENC_NOT_CONFIG HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +/* operation is not supported by NOW */ +#define HI_ERR_VENC_NOT_SUPPORT HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +/* operation is not permitted ,eg, try to change stati attribute */ +#define HI_ERR_VENC_NOT_PERM HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +/* failure caused by malloc memory */ +#define HI_ERR_VENC_NOMEM HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +/* failure caused by malloc buffer */ +#define HI_ERR_VENC_NOBUF HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +/* no data in buffer */ +#define HI_ERR_VENC_BUF_EMPTY HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +/* no buffer for new data */ +#define HI_ERR_VENC_BUF_FULL HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +/* system is not ready,had not initialed or loaded*/ +#define HI_ERR_VENC_SYS_NOTREADY HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +/* system is busy*/ +#define HI_ERR_VENC_BUSY HI_DEF_ERR(HI_ID_VENC, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) + + +/*the nalu type of H264E*/ +typedef enum hiH264E_NALU_TYPE_E +{ + H264E_NALU_PSLICE = 1, /*PSLICE types*/ + H264E_NALU_ISLICE = 5, /*ISLICE types*/ + H264E_NALU_SEI = 6, /*SEI types*/ + H264E_NALU_SPS = 7, /*SPS types*/ + H264E_NALU_PPS = 8, /*PPS types*/ + H264E_NALU_IPSLICE = 9, + H264E_NALU_BUTT +} H264E_NALU_TYPE_E; + +/*the nalu type of H265E*/ +typedef enum hiH265E_NALU_TYPE_E +{ + H265E_NALU_PSLICE = 1, /*P SLICE types*/ + H265E_NALU_ISLICE = 19, /*I SLICE types*/ + H265E_NALU_VPS = 32, /*VPS types*/ + H265E_NALU_SPS = 33, /*SPS types*/ + H265E_NALU_PPS = 34, /*PPS types*/ + H265E_NALU_SEI = 39, /*SEI types*/ + + H265E_NALU_BUTT +} H265E_NALU_TYPE_E; + +/*the reference type of H264E slice*/ +typedef enum hiH264E_REFSLICE_TYPE_E +{ + H264E_REFSLICE_FOR_1X = 1, /*Reference slice for H264E_REF_MODE_1X*/ + H264E_REFSLICE_FOR_2X = 2, /*Reference slice for H264E_REF_MODE_2X*/ + H264E_REFSLICE_FOR_4X = 5, /*Reference slice for H264E_REF_MODE_4X*/ + H264E_REFSLICE_FOR_BUTT /* slice not for reference*/ +} H264E_REFSLICE_TYPE_E; + +/*the pack type of JPEGE*/ +typedef enum hiJPEGE_PACK_TYPE_E +{ + JPEGE_PACK_ECS = 5, /*ECS types*/ + JPEGE_PACK_APP = 6, /*APP types*/ + JPEGE_PACK_VDO = 7, /*VDO types*/ + JPEGE_PACK_PIC = 8, /*PIC types*/ + JPEGE_PACK_BUTT +} JPEGE_PACK_TYPE_E; + +/*the pack type of MPEG4*/ +typedef enum hiMPEG4E_PACK_TYPE_E +{ + MPEG4E_PACK_VOP_P = 1, /*P VOP packet types*/ + MPEG4E_PACK_VOP_I = 5, /*I VOP packet types*/ + MPEG4E_PACK_VOS = 6, /*VOS types*/ + MPEG4E_PACK_VO = 7, /*VO types*/ + MPEG4E_PACK_VOL = 8, /*VOL types*/ + MPEG4E_PACK_GVOP = 9 /*GROUP of vop types */ +} MPEG4E_PACK_TYPE_E; + +/*the data type of VENC*/ +typedef union hiVENC_DATA_TYPE_U +{ + H264E_NALU_TYPE_E enH264EType; /*H264E NALU types*/ + JPEGE_PACK_TYPE_E enJPEGEType; /*JPEGE pack types*/ + MPEG4E_PACK_TYPE_E enMPEG4EType; /*MPEG4E pack types*/ + H265E_NALU_TYPE_E enH265EType; /*H264E NALU types*/ +}VENC_DATA_TYPE_U; + +typedef struct hiVENC_PACK_INFO_S +{ + VENC_DATA_TYPE_U u32PackType; + HI_U32 u32PackOffset; + HI_U32 u32PackLength; +}VENC_PACK_INFO_S; + + +typedef struct hiVENC_PACK_S +{ + HI_U32 u32PhyAddr; /*the physics address of stream*/ + HI_U8 *pu8Addr; /*the virtual address of stream*/ + HI_U32 u32Len; /*the length of stream*/ + + HI_U64 u64PTS; /*PTS*/ + HI_BOOL bFrameEnd; /*frame end*/ + + VENC_DATA_TYPE_U DataType; /*the type of stream*/ + HI_U32 u32Offset; + + HI_U32 u32DataNum; + VENC_PACK_INFO_S stPackInfo[8]; +}VENC_PACK_S; + +typedef enum hiH264E_REF_TYPE_E +{ + BASE_IDRSLICE = 0, //the Idr frame at Base layer + BASE_PSLICE_REFBYBASE, //the P frame at Base layer, referenced by other frames at Base layer + BASE_PSLICE_REFBYENHANCE, //the P frame at Base layer, referenced by other frames at Enhance layer + ENHANCE_PSLICE_REFBYENHANCE, //the P frame at Enhance layer, referenced by other frames at Enhance layer + ENHANCE_PSLICE_NOTFORREF, //the P frame at Enhance layer ,not referenced + ENHANCE_PSLICE_BUTT +} H264E_REF_TYPE_E; + +typedef enum hiH264E_REF_TYPE_E H265E_REF_TYPE_E; + +typedef struct hiVENC_STREAM_INFO_H264_S +{ + HI_U32 u32PicBytesNum; /* the coded picture stream byte number */ + HI_U32 u32PSkipMbNum; /* the skip macroblock num */ + HI_U32 u32IpcmMbNum; /* the ipcm macroblock num */ + HI_U32 u32Inter16x8MbNum; /* the inter16x8 macroblock num */ + HI_U32 u32Inter16x16MbNum; /* the inter16x16 macroblock num */ + HI_U32 u32Inter8x16MbNum; /* the inter8x16 macroblock num */ + HI_U32 u32Inter8x8MbNum; /* the inter8x8 macroblock num */ + HI_U32 u32Intra16MbNum; /* the intra16x16 macroblock num */ + HI_U32 u32Intra8MbNum; /* the intra8x8 macroblock num */ + HI_U32 u32Intra4MbNum; /* the inter4x4 macroblock num */ + + H264E_REFSLICE_TYPE_E enRefSliceType; /*the reference type of H264E slice*/ + H264E_REF_TYPE_E enRefType; /*Type of encoded frames in advanced frame skipping reference mode*/ + HI_U32 u32UpdateAttrCnt; /*Number of times that channel attributes or parameters (including RC parameters) are set*/ + HI_U32 u32StartQp; /*StartQP Value*/ +}VENC_STREAM_INFO_H264_S; + +typedef struct hiVENC_STREAM_INFO_H265_S +{ + HI_U32 u32PicBytesNum; /* the coded picture stream byte number */ + HI_U32 u32Inter64x64CuNum; /* the num */ + HI_U32 u32Inter32x32CuNum; + HI_U32 u32Inter16x16CuNum; + HI_U32 u32Inter8x8CuNum; + HI_U32 u32Intra32x32CuNum; + HI_U32 u32Intra16x16CuNum; + HI_U32 u32Intra8x8CuNum; + HI_U32 u32Intra4x4CuNum; + H265E_REF_TYPE_E enRefType; /*Type of encoded frames in advanced frame skipping reference mode*/ + HI_U32 u32UpdateAttrCnt; /*Number of times that channel attributes or parameters (including RC parameters) are set*/ + HI_U32 u32StartQp; /*StartQP Value*/ +}VENC_STREAM_INFO_H265_S; + +typedef struct hiVENC_STREAM_INFO_JPEG_S +{ + HI_U32 u32PicBytesNum; /* the coded picture stream byte number */ + HI_U32 u32UpdateAttrCnt; /*Number of times that channel attributes or parameters (including RC parameters) are set*/ + HI_U32 u32Qfactor; /* image quality */ +}VENC_STREAM_INFO_JPEG_S; + +typedef struct hiVENC_STREAM_INFO_MPEG4_S +{ + HI_U32 u32PicBytesNum; /* the coded picture stream byte number */ + HI_U32 u32UpdateAttrCnt; /*Number of times that channel attributes or parameters (including RC parameters) are set*/ +}VENC_STREAM_INFO_MPEG4_S; + +typedef struct hiVENC_STREAM_S +{ + VENC_PACK_S *pstPack; /*stream pack attribute*/ + HI_U32 u32PackCount; /*the pack number of one frame stream*/ + HI_U32 u32Seq; /*the list number of stream*/ + + union + { + VENC_STREAM_INFO_H264_S stH264Info; /*the stream info of h264*/ + VENC_STREAM_INFO_JPEG_S stJpegInfo; /*the stream info of jpeg*/ + VENC_STREAM_INFO_MPEG4_S stMpeg4Info; /*the stream info of mpeg4*/ + VENC_STREAM_INFO_H265_S stH265Info; /*the stream info of h265*/ + }; +}VENC_STREAM_S; + +typedef struct hiVENC_ATTR_H264_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + + HI_U32 u32BufSize; /*stream buffer size*/ + HI_U32 u32Profile; /*0: baseline; 1:MP; 2:HP; 3: SVC-T [0,3]; */ + HI_BOOL bByFrame; /*get stream mode is slice mode or frame mode*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ + + HI_U32 u32BFrameNum; /* 0: not support B frame; >=1: number of B frames */ + HI_U32 u32RefNum; /* 0: default; number of refrence frame*/ + +}VENC_ATTR_H264_S; + +typedef struct hiVENC_ATTR_H265_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + + HI_U32 u32BufSize; /*stream buffer size*/ + HI_U32 u32Profile; /*0: MP */ + HI_BOOL bByFrame; /*get stream mode is slice mode or frame mode*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ + + HI_U32 u32BFrameNum; /* 0: not support B frame; >=1: number of B frames */ + HI_U32 u32RefNum; /* 0: default; number of refrence frame*/ +}VENC_ATTR_H265_S; + +typedef struct hiVENC_ATTR_MJPEG_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + HI_U32 u32BufSize; /*stream buffer size*/ + HI_BOOL bByFrame; /*get stream mode is field mode or frame mode*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ + +}VENC_ATTR_MJPEG_S; + +typedef struct hiVENC_ATTR_JPEG_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + HI_U32 u32BufSize; /*stream buffer size*/ + HI_BOOL bByFrame; /*get stream mode is field mode or frame mode*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ + HI_BOOL bSupportDCF; /*support dcf*/ + +}VENC_ATTR_JPEG_S; + +/* attribute of MPEG4*/ +typedef struct hiVENC_ATTR_MPEG4_S +{ + HI_U32 u32MaxPicWidth; /*maximum width of a picture to be encoded, in pixel*/ + HI_U32 u32MaxPicHeight; /*maximum height of a picture to be encoded, in pixel*/ + + HI_U32 u32BufSize; /*buffer size*/ + HI_BOOL bByFrame; /*get stream mode is pack or frame*/ + + + HI_U32 u32PicWidth; /*width of a picture to be encoded, in pixel*/ + HI_U32 u32PicHeight; /*height of a picture to be encoded, in pixel*/ +}VENC_ATTR_MPEG4_S; + +typedef struct hiVENC_ATTR_S +{ + PAYLOAD_TYPE_E enType; /*the type of payload*/ + union + { + VENC_ATTR_H264_S stAttrH264e; /*attributes of h264*/ + VENC_ATTR_MJPEG_S stAttrMjpeg; /*attributes of mjpeg*/ + VENC_ATTR_JPEG_S stAttrJpeg; /*attributes of jpeg*/ + VENC_ATTR_MPEG4_S stAttrMpeg4; /*attributes of mpeg4*/ + VENC_ATTR_H265_S stAttrH265e; /*attributes of h265*/ + }; +}VENC_ATTR_S; + +typedef struct hiVENC_CHN_ATTR_S +{ + VENC_ATTR_S stVeAttr; /*the attribute of video encoder*/ + VENC_RC_ATTR_S stRcAttr; /*the attribute of rate ctrl*/ +}VENC_CHN_ATTR_S; + +typedef struct hiVENC_CHN_STAT_S +{ + HI_U32 u32LeftPics; /*left picture number */ + HI_U32 u32LeftStreamBytes; /*left stream bytes*/ + HI_U32 u32LeftStreamFrames; /*left stream frames*/ + HI_U32 u32CurPacks; /*pack number of current frame*/ + HI_U32 u32LeftRecvPics; /*Number of frames to be received. This member is valid after HI_MPI_VENC_StartRecvPicEx is called.*/ + HI_U32 u32LeftEncPics; /*Number of frames to be encoded. This member is valid after HI_MPI_VENC_StartRecvPicEx is called.*/ +}VENC_CHN_STAT_S; + + + +typedef struct hiVENC_PARAM_H264_SLICE_SPLIT_S +{ + HI_BOOL bSplitEnable; /*slice split enable, HI_TRUE:enable, HI_FALSE:diable, default value:HI_FALSE*/ + HI_U32 u32SplitMode; /*0:bit number, 1:mb line number, >=2:no meaning*/ + HI_U32 u32SliceSize; /*when the splitmode is 0, this value presents the bitsnum of one slice average, + when the splitmode is 1, this value presents the mb num of one slice*/ +} VENC_PARAM_H264_SLICE_SPLIT_S; + +typedef struct hiVENC_PARAM_H264_INTER_PRED_S +{ + /* search window */ + HI_U32 u32HWSize; /* size of horizontal search window. + default value: differ with the picture size */ + HI_U32 u32VWSize; /* size of vertical search window. + default value: differ with the picture size */ + + /* inter pred, one of the following 4 kinds of inter prediction mode must be enable */ + HI_BOOL bInter16x16PredEn; /*default: HI_TRUE, enable 16x16 prediction*/ + HI_BOOL bInter16x8PredEn; /*default: HI_TRUE*/ + HI_BOOL bInter8x16PredEn; /*default: HI_TRUE*/ + HI_BOOL bInter8x8PredEn; /*default: HI_TRUE*/ + HI_BOOL bExtedgeEn; /*default: HI_TRUE*/ +} VENC_PARAM_H264_INTER_PRED_S; + +typedef struct hiVENC_PARAM_H264_INTRA_PRED_S +{ + /* intra pred, one of following 2 kinds of intra pred mode must be enable */ + HI_BOOL bIntra16x16PredEn; /*default: HI_TRUE, enable 16x16 intra prediction*/ + HI_BOOL bIntraNxNPredEn; /*default: HI_TRUE, enable 4x4 and/or 8x8 prediction + Notes: this value must work with IntraTransMode*/ + HI_U32 constrained_intra_pred_flag; /*default: HI_FALSE, see the H.264 protocol*/ + HI_BOOL bIpcmEn; /*default: HI_TRUE, enable ipcm*/ +}VENC_PARAM_H264_INTRA_PRED_S; + +typedef struct hiVENC_PARAM_H264_TRANS_S +{ + HI_U32 u32IntraTransMode; /* 0: trans4x4, trans8x8; 1: trans4x4, 2: trans8x8 */ + HI_U32 u32InterTransMode; /* 0: trans4x4, trans8x8; 1: trans4x4, 2: trans8x8 */ + + HI_BOOL bScalingListValid; /* default: HI_FALSE */ + /* Notes: Enable IntraScalingList8X8 and InterScalingList8X8 while bScalingListValid is HI_TRUE */ + HI_U8 InterScalingList8X8[64]; + HI_U8 IntraScalingList8X8[64]; + + HI_S32 chroma_qp_index_offset; /* [-12,12],default value: 0*/ +}VENC_PARAM_H264_TRANS_S; + +typedef struct hiVENC_PARAM_H264_ENTROPY_S +{ + HI_U32 u32EntropyEncModeI; /* 0:cavlc, 1:cabac */ + HI_U32 u32EntropyEncModeP; /* 0:cavlc, 1:cabac */ + HI_U32 cabac_stuff_en; /* default: 0*/ + HI_U32 Cabac_init_idc; /* 0~2 */ +}VENC_PARAM_H264_ENTROPY_S; + +typedef struct hiVENC_PARAM_H264_POC_S +{ + HI_U32 pic_order_cnt_type; /* default value: 2. {0,1,2} */ + +}VENC_PARAM_H264_POC_S; + +typedef struct hiVENC_PARAM_H264_DBLK_S +{ + HI_U32 disable_deblocking_filter_idc; /* default value: 0. {0,1,2} */ + HI_S32 slice_alpha_c0_offset_div2; /* default value: 5. [-6,+6] */ + HI_S32 slice_beta_offset_div2; /* default value: 5. [-6,+6] */ +}VENC_PARAM_H264_DBLK_S; + + + +typedef struct hiVENC_PARAM_H264_VUI_TIME_INFO_S +{ + HI_U8 timing_info_present_flag; /* default value: 0. If 1, timing info belows will be encoded into vui. {0,1} */ + HI_U8 fixed_frame_rate_flag; /* default value: n/a. {0,1} */ + HI_U32 num_units_in_tick; /* default value: n/a. > 0. */ + HI_U32 time_scale; /* default value: n/a. > 0. */ + +}VENC_PARAM_VUI_H264_TIME_INFO_S; + +typedef struct hiVENC_PARAM_VUI_ASPECT_RATIO_S +{ + HI_U8 aspect_ratio_info_present_flag; /* default value: 0. If 1, aspectratio info belows will be encoded into vui. {0,1} */ + HI_U8 aspect_ratio_idc; /* default value: n/a. [0,255],17~254 is reserved. */ + HI_U8 overscan_info_present_flag; /* default value: 0,just be 0.If 1, oversacan info belows will be encoded into vui. {0,1} */ + HI_U8 overscan_appropriate_flag; /* default value: n/a. */ + HI_U16 sar_width; /* default value: n/a. sar_width and sar_height shall be relatively prime. */ + HI_U16 sar_height ; /* default value: n/a. */ +}VENC_PARAM_VUI_ASPECT_RATIO_S; + + +typedef struct hiVENC_PARAM_VUI_VIDEO_SIGNAL_S +{ + HI_U8 video_signal_type_present_flag ; /* default value: 0. If 1, video singnal info will be encoded into vui. {0,1} */ + HI_U8 video_format ; /* default value: n/a. >= 0. */ + HI_U8 video_full_range_flag; /* default value: n/a. {0,1}. */ + HI_U8 colour_description_present_flag ; /* default value: n/a. {0,1} */ + HI_U8 colour_primaries ; /* default value: n/a. [0,255],0/9~255 is reserved */ + HI_U8 transfer_characteristics; /* default value: n/a. [0,255],0/13~255 is reserved */ + HI_U8 matrix_coefficients; /* default value: n/a. [0,255],9~255 is reserved */ +}VENC_PARAM_VUI_VIDEO_SIGNAL_S; + + + +typedef struct hiVENC_PARAM_H264_VUI_S +{ + VENC_PARAM_VUI_ASPECT_RATIO_S stVuiAspectRatio; + VENC_PARAM_VUI_H264_TIME_INFO_S stVuiTimeInfo; + VENC_PARAM_VUI_VIDEO_SIGNAL_S stVuiVideoSignal; +}VENC_PARAM_H264_VUI_S; + + +typedef struct hiVENC_PARAM_JPEG_S +{ + HI_U32 u32Qfactor; /*image quality :[1,99]*/ + + HI_U8 u8YQt[64]; /* y qt value */ + HI_U8 u8CbQt[64]; /* cb qt value */ + HI_U8 u8CrQt[64]; /* cr qt value */ + + HI_U32 u32MCUPerECS; /*default value: 0, MCU number of one ECS*/ +} VENC_PARAM_JPEG_S; + +typedef struct hiVENC_PARAM_MJPEG_S +{ + HI_U8 u8YQt[64]; /* y qt value */ + HI_U8 u8CbQt[64]; /* cb qt value */ + HI_U8 u8CrQt[64]; /* cr qt value */ + + HI_U32 u32MCUPerECS; /*default value: 0, MCU number of one ECS*/ +} VENC_PARAM_MJPEG_S; + + + +/* ROI struct */ +typedef struct hiVENC_ROI_CFG_S +{ + HI_U32 u32Index; /* Index of an ROI. The system supports indexes ranging from 0 to 7 */ + HI_BOOL bEnable; /* Whether to enable this ROI */ + HI_BOOL bAbsQp; /* QP mode of an ROI.HI_FALSE: relative QP.HI_TURE: absolute QP.*/ + HI_S32 s32Qp; /* QP value. */ + RECT_S stRect; /* Region of an ROI*/ +}VENC_ROI_CFG_S; + + +typedef struct hiVENC_ROIBG_FRAME_RATE_S +{ + HI_S32 s32SrcFrmRate; /* Input frame rate of Roi backgroud*/ + HI_S32 s32DstFrmRate; /* Output frame rate of Roi backgroud */ +}VENC_ROIBG_FRAME_RATE_S; + + +typedef struct hiVENC_COLOR2GREY_S +{ + HI_BOOL bColor2Grey; /* Whether to enable Color2Grey.*/ +}VENC_COLOR2GREY_S; + +typedef struct hiVENC_CROP_CFG_S +{ + HI_BOOL bEnable; /* Crop region enable */ + RECT_S stRect; /* Crop region, note: s32X must be multi of 16 */ +}VENC_CROP_CFG_S; + + +typedef struct hiVENC_FRAME_RATE_S +{ + HI_S32 s32SrcFrmRate; /* Input frame rate of a channel*/ + HI_S32 s32DstFrmRate; /* Output frame rate of a channel*/ +} VENC_FRAME_RATE_S; + +typedef struct hiVENC_PARAM_REF_S +{ + HI_U32 u32Base; /*Base layer period*/ + HI_U32 u32Enhance; /*Enhance layer period*/ + HI_BOOL bEnablePred; /*Whether some frames at the base layer are referenced by other frames at the base layer. When bEnablePred is HI_FALSE, all frames at the base layer reference IDR frames.*/ +} VENC_PARAM_REF_S; + + +typedef enum hiH264E_IDR_PIC_ID_MODE_E +{ + H264E_IDR_PIC_ID_MODE_AUTO = 0, /*auto mode */ + H264E_IDR_PIC_ID_MODE_USR, /*user mode */ + H264E_IDR_PIC_ID_MODE_BUTT, +}H264E_IDR_PIC_ID_MODE_E; + +typedef struct hiVENC_H264_IDRPICID_CFG_S +{ + H264E_IDR_PIC_ID_MODE_E enH264eIdrPicIdMode; /*the mode of idr_pic_id that is set*/ + HI_U32 u32H264eIdrPicId; /*idr_pic_id value*/ +} VENC_H264_IDRPICID_CFG_S; + +/* Jpeg snap mode */ +typedef enum hiVENC_JPEG_SNAP_MODE_E +{ + JPEG_SNAP_ALL = 0, /* Jpeg channel snap all the pictures when started. */ + JPEG_SNAP_FLASH = 1, /* Jpeg channel snap the flashed pictures when started. */ + JPEG_SNAP_BUTT, + +}VENC_JPEG_SNAP_MODE_E; + +typedef struct hiVENC_RECV_PIC_PARAM_S +{ + HI_S32 s32RecvPicNum; /*Number of frames received and encoded by the encoding channel*/ +} VENC_RECV_PIC_PARAM_S; + +typedef struct hiVENC_STREAM_BUF_INFO_S +{ + HI_U32 u32PhyAddr; + HI_VOID *pUserAddr; + HI_U32 u32BufSize; +} VENC_STREAM_BUF_INFO_S; + + +typedef struct hiVENC_PARAM_H265_SLICE_SPLIT_S +{ + HI_BOOL bSplitEnable; /* default value: HI_FALSE, means no slice split*/ + HI_U32 u32SplitMode; /* 0: by bits number; 1: by lcu line number*/ + HI_U32 u32SliceSize; /* when splitmode is 0, this value presents bits number, + when splitmode is 1, this value presents lcu line number */ + HI_U32 loop_filter_across_slices_enabled_flag; +} VENC_PARAM_H265_SLICE_SPLIT_S; + +typedef struct hiVENC_PARAM_H265_INTER_PRED_S +{ + /* search window */ + HI_U32 u32HWSize; /* size of horizontal search window. + default value: differ with the picture size */ + HI_U32 u32VWSize; /* size of vertical search window. + default value: differ with the picture size */ + + /* inter pred, one of the following 4 kinds of inter prediction mode must be enable */ + HI_BOOL bInter16x16PredEn; /*default: HI_TRUE, enable 16x16 prediction*/ + HI_BOOL bInter16x8PredEn; /*default: HI_TRUE*/ + HI_BOOL bInter8x16PredEn; /*default: HI_TRUE*/ + HI_BOOL bInter8x8PredEn; /*default: HI_TRUE*/ + HI_BOOL bExtedgeEn; /*default: HI_TRUE*/ +} VENC_PARAM_H265_INTER_PRED_S; + +typedef struct hiVENC_PARAM_H265_INTRA_PRED_S +{ + /* intra pred, one of following 2 kinds of intra pred mode must be enable */ + HI_BOOL bIntra16x16PredEn; /*default: HI_TRUE, enable 16x16 intra prediction*/ + HI_BOOL bIntraNxNPredEn; /*default: HI_TRUE, enable 4x4 and/or 8x8 prediction + Notes: this value must work with IntraTransMode*/ + HI_U32 constrained_intra_pred_flag; /*default: HI_FALSE, see the H.264 protocol*/ + HI_U32 pcm_enabled_flag; /*default: HI_TRUE, enable ipcm*/ +}VENC_PARAM_H265_INTRA_PRED_S; + +typedef struct hiVENC_PARAM_H265_PU_S +{ + HI_BOOL bPu32x32En; /*default: HI_TRUE */ + HI_BOOL bPu16x16En; /*default: HI_TRUE */ + HI_BOOL bPu8x8En; /*default: HI_TRUE */ + HI_BOOL bPu4x4En; /*default: HI_TRUE */ + + // intra pred + HI_U32 constrained_intra_pred_flag; /*default: HI_FALSE*/ + HI_U32 strong_intra_smoothing_enabled_flag; + HI_U32 pcm_enabled_flag; /*default: HI_FALSE, enable ipcm*/ + HI_U32 pcm_loop_filter_disabled_flag; + + // inter pred + HI_U32 u32MaxNumMergeCand; + +}VENC_PARAM_H265_PU_S; + + +typedef struct hiVENC_PARAM_H265_TRANS_S +{ + HI_U32 transquant_bypass_enabled_flag; + HI_U32 transform_skip_enabled_flag; + HI_S32 cb_qp_offset; + HI_S32 cr_qp_offset; +} VENC_PARAM_H265_TRANS_S; + +typedef struct hiVENC_PARAM_H265_ENTROPY_S +{ + HI_U32 cabac_init_flag; /* default: 0*/ +}VENC_PARAM_H265_ENTROPY_S; + +typedef struct hiVENC_PARAM_H265_DBLK_S +{ + HI_U32 slice_deblocking_filter_disabled_flag; /* default value: 0. {0,1} */ + HI_S32 slice_beta_offset_div2; /* default value: 5. [-6,+6] */ + HI_S32 slice_tc_offset_div2; /* default value: 5. [-6,+6] */ +}VENC_PARAM_H265_DBLK_S; + +typedef struct hiVENC_PARAM_H265_SAO_S +{ + HI_U32 slice_sao_luma_flag; + HI_U32 slice_sao_chroma_flag; +}VENC_PARAM_H265_SAO_S; + + +typedef struct hiVENC_PARAM_H265_TIMING_S +{ + HI_S32 timing_info_present_flag; /* default value: 0. If 1, timing info belows will be encoded into vui. {0,1} */ + HI_S32 num_units_in_tick; /* default value: n/a. > 0. */ + HI_S32 time_scale; /* default value: n/a. > 0. */ + HI_U32 num_ticks_poc_diff_one; +}VENC_PARAM_H265_TIMING_S; + +typedef struct hiVENC_PARAM_INTRA_REFRESH_S +{ + HI_BOOL bRefreshEnable; + HI_BOOL bISliceEnable; + HI_U32 u32RefreshLineNum; + HI_U32 u32ReqIQp; +}VENC_PARAM_INTRA_REFRESH_S; + +typedef enum hiVENC_MODTYPE_S +{ + MODTYPE_VENC = 1, + MODTYPE_H264E, + MODTYPE_H265E, + MODTYPE_JPEGE, + MODTYPE_BUTT +} VENC_MODTYPE_S; + +typedef struct hiVENC_MOD_H264E_S +{ + HI_U32 u32OneStreamBuffer; + HI_U32 u32H264eVBSource; + HI_U32 u32H264eRcnEqualRef; + HI_U32 u32H264eMiniBufMode; +} VENC_MOD_H264E_S; + +typedef struct hiVENC_MOD_H265E_S +{ + HI_U32 u32OneStreamBuffer; + HI_U32 u32H265eMiniBufMode; +} VENC_MOD_H265E_S; + +typedef struct hiVENC_MOD_JPEGE_S +{ + HI_U32 u32OneStreamBuffer; + HI_U32 u32JpegeMiniBufMode; + +} VENC_MOD_JPEGE_S; + + +typedef struct hiVENC_MOD_VENC_S +{ + HI_U32 u32VencBufferCache; +} VENC_MOD_VENC_S; + + +typedef struct hiVENC_MODPARAM_S +{ + VENC_MODTYPE_S enVencModType; + union + { + VENC_MOD_VENC_S stVencMod; + VENC_MOD_H264E_S stH264eMod; + VENC_MOD_H265E_S stH265eMod; + VENC_MOD_JPEGE_S stJpegeMod; + }; +} VENC_MODPARAM_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_VENC_H__ */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vgs.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vgs.h new file mode 100644 index 0000000..cbe969a --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vgs.h @@ -0,0 +1,102 @@ +/****************************************************************************** + + Copyright (C), 2013-2033, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_vgs.h + Version : + Author : Hisilicon Hi35xx MPP Team + Created : 2013/07/24 + Last Modified : + Description : common struct definition for VGS + Function List : + History : +******************************************************************************/ +#ifndef __HI_COMM_VGS_H__ +#define __HI_COMM_VGS_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" + +/* failure caused by malloc buffer */ +#define HI_ERR_VGS_NOBUF HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +#define HI_ERR_VGS_BUF_EMPTY HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +#define HI_ERR_VGS_NULL_PTR HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VGS_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VGS_BUF_FULL HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +#define HI_ERR_VGS_SYS_NOTREADY HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VGS_NOT_SUPPORT HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_VGS_NOT_PERMITTED HI_DEF_ERR(HI_ID_VGS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) + +typedef HI_S32 VGS_HANDLE; + +typedef struct hiVGS_TASK_ATTR_S +{ + VIDEO_FRAME_INFO_S stImgIn; /* input picture */ + VIDEO_FRAME_INFO_S stImgOut; /* output picture */ + HI_U32 au32privateData[4]; /* task's private data */ + HI_U32 reserved; /* save current picture's state while debug */ +} VGS_TASK_ATTR_S; + +typedef struct hiVGS_DRAW_LINE_S +{ + POINT_S stStartPoint; /* line start point */ + POINT_S stEndPoint; /* line end point */ + + HI_U32 u32Thick; /* width of line */ + HI_U32 u32Color; /* color of line */ +} VGS_DRAW_LINE_S; + +typedef enum hiVGS_COVER_TYPE_E +{ + COVER_RECT = 0, /* retangle cover */ + COVER_QUAD_RANGLE, /* quadrangle cover */ + COVER_BUTT +} VGS_COVER_TYPE_E; + +typedef struct hiVGS_QUADRANGLE_COVER_S +{ + HI_BOOL bSolid; /* solid or hollow */ + HI_U32 u32Thick; /* The thick of the hollow quadrangle */ + POINT_S stPoint[4]; /* four points of the quadrangle */ +} VGS_QUADRANGLE_COVER_S; + +typedef struct hiVGS_ADD_COVER_S +{ + VGS_COVER_TYPE_E enCoverType; /* the cover type */ + union + { + RECT_S stDstRect; /* the rectangle attribute */ + VGS_QUADRANGLE_COVER_S stQuadRangle; /* the quadrangle attribute */ + }; + + HI_U32 u32Color; /* color of cover */ +} VGS_ADD_COVER_S; + +typedef struct hiVGS_ADD_OSD_S +{ + RECT_S stRect; /* start point, width and height of osd */ + HI_U32 u32BgColor; /* background color of osd */ + PIXEL_FORMAT_E enPixelFmt; /* pixel format of osd */ + HI_U32 u32PhyAddr; /* physical address of osd */ + HI_U32 u32Stride; /* stride of osd */ + HI_U32 u32BgAlpha; /* background alpha of osd */ + HI_U32 u32FgAlpha; /* foreground alpha of osd */ +} VGS_ADD_OSD_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_COMM_VGS_H__ */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vi.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vi.h new file mode 100644 index 0000000..28baa1e --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vi.h @@ -0,0 +1,556 @@ +/****************************************************************************** + +Copyright (C), 2004-2020, Hisilicon Tech. Co., Ltd. + +****************************************************************************** +File Name : hi_comm_vi.h +Version : Initial Draft +Author : Hisilicon multimedia software group +Created : 2009/3/9 +Last Modified : +Description : +Function List : +History : +1.Date : 2010/11/16 + Author : p00123320/w54723/n168968 + Modification: Created file + +2.Date : 2011/06/16 + Author : w54723/l00181524/c00186004 + Modification: Created file + + +******************************************************************************/ + +#ifndef __HI_COMM_VI_H__ +#define __HI_COMM_VI_H__ + +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +#define VI_INVALID_FRMRATE (-1UL) +#define VIU_MAX_USER_FRAME_DEPTH 8 + +typedef enum hiEN_VIU_ERR_CODE_E +{ + ERR_VI_FAILED_NOTENABLE = 64, /* device or channel not enable*/ + ERR_VI_FAILED_NOTDISABLE, /* device not disable*/ + ERR_VI_FAILED_CHNOTDISABLE, /* channel not disable*/ + ERR_VI_CFG_TIMEOUT, /* config timeout*/ + ERR_VI_NORM_UNMATCH, /* video norm of ADC and VIU is unmatch*/ + ERR_VI_INVALID_WAYID, /* invlalid way ID */ + ERR_VI_INVALID_PHYCHNID, /* invalid phychn id*/ + ERR_VI_FAILED_NOTBIND, /* device or channel not bind */ + ERR_VI_FAILED_BINDED, /* device or channel not unbind */ +} EN_VIU_ERR_CODE_E; + +#define HI_ERR_VI_INVALID_PARA HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VI_INVALID_DEVID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +#define HI_ERR_VI_INVALID_CHNID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +#define HI_ERR_VI_INVALID_NULL_PTR HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VI_FAILED_NOTCONFIG HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) +#define HI_ERR_VI_SYS_NOTREADY HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VI_BUF_EMPTY HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) +#define HI_ERR_VI_BUF_FULL HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) +#define HI_ERR_VI_NOMEM HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_VI_NOT_SUPPORT HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_VI_BUSY HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_VI_NOT_PERM HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) + +#define HI_ERR_VI_FAILED_NOTENABLE HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_NOTENABLE)/* 0xA0108040*/ +#define HI_ERR_VI_FAILED_NOTDISABLE HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_NOTDISABLE)/* 0xA0108041*/ +#define HI_ERR_VI_FAILED_CHNOTDISABLE HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_CHNOTDISABLE)/* 0xA0108042*/ +#define HI_ERR_VI_CFG_TIMEOUT HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_CFG_TIMEOUT)/* 0xA0108043*/ +#define HI_ERR_VI_NORM_UNMATCH HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_NORM_UNMATCH)/* 0xA0108044*/ +#define HI_ERR_VI_INVALID_WAYID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_INVALID_WAYID)/* 0xA0108045*/ +#define HI_ERR_VI_INVALID_PHYCHNID HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_INVALID_PHYCHNID)/* 0xA0108046*/ +#define HI_ERR_VI_FAILED_NOTBIND HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_NOTBIND)/* 0xA0108047*/ +#define HI_ERR_VI_FAILED_BINDED HI_DEF_ERR(HI_ID_VIU, EN_ERR_LEVEL_ERROR, ERR_VI_FAILED_BINDED)/* 0xA0108048*/ + + +/*get the subchn index by main chn */ +#define SUBCHN(ViChn) (ViChn + 16) + +/* define cascade chn */ +#define VI_CAS_CHN_1 32 +#define VI_CAS_CHN_2 33 + + +/* interface mode of video input */ +typedef enum hiVI_INTF_MODE_E +{ + VI_MODE_BT656 = 0, /* ITU-R BT.656 YUV4:2:2 */ + VI_MODE_BT601, /* ITU-R BT.601 YUV4:2:2 */ + VI_MODE_DIGITAL_CAMERA, /* digatal camera mode */ + VI_MODE_BT1120_STANDARD, /* BT.1120 progressive mode */ + VI_MODE_BT1120_INTERLEAVED, /* BT.1120 interstage mode */ + VI_MODE_MIPI, /*MIPI mode*/ + VI_MODE_LVDS, + VI_MODE_HISPI, + + VI_MODE_BUTT +} VI_INTF_MODE_E; + + +/* Input mode */ +typedef enum hiVI_INPUT_MODE_E +{ + VI_INPUT_MODE_BT656 = 0, /* ITU-R BT.656 YUV4:2:2 */ + VI_INPUT_MODE_BT601, /* ITU-R BT.601 YUV4:2:2 */ + VI_INPUT_MODE_DIGITAL_CAMERA, /* digatal camera mode */ + VI_INPUT_MODE_INTERLEAVED, + VI_INPUT_MODE_MIPI, /*MIPI mode*/ + VI_INPUT_MODE_LVDS, + VI_INPUT_MODE_HISPI, + + VI_INPUT_MODE_BUTT +} VI_INPUT_MODE_E; + +typedef enum hiVI_WORK_MODE_E +{ + VI_WORK_MODE_1Multiplex = 0, /* 1 Multiplex mode */ + VI_WORK_MODE_2Multiplex, /* 2 Multiplex mode */ + VI_WORK_MODE_4Multiplex, /* 4 Multiplex mode */ + + VI_WORK_MODE_BUTT +} VI_WORK_MODE_E; + + + +/* whether an input picture is interlaced or progressive */ +typedef enum hiVI_SCAN_MODE_E +{ + VI_SCAN_INTERLACED = 0, + VI_SCAN_PROGRESSIVE, + + VI_SCAN_BUTT, +} VI_SCAN_MODE_E; + +typedef enum hiVI_DATA_YUV_SEQ_E +{ + /*The input sequence of the second component(only contains u and v) in BT.1120 mode */ + VI_INPUT_DATA_VUVU = 0, + VI_INPUT_DATA_UVUV, + + /* The input sequence for yuv */ + VI_INPUT_DATA_UYVY = 0, + VI_INPUT_DATA_VYUY, + VI_INPUT_DATA_YUYV, + VI_INPUT_DATA_YVYU, + + VI_DATA_YUV_BUTT +} VI_DATA_YUV_SEQ_E; + +typedef enum hiVI_CLK_EDGE_E +{ + VI_CLK_EDGE_SINGLE_UP = 0, /* single-edge mode and in rising edge */ + VI_CLK_EDGE_SINGLE_DOWN, /* single-edge mode and in falling edge */ + //VI_CLK_EDGE_DOUBLE , /* Double edge mode */ + + VI_CLK_EDGE_BUTT +} VI_CLK_EDGE_E; + +typedef enum hiVI_COMP_MODE_E +{ + VI_COMP_MODE_SINGLE = 0, /* in single component mode */ + VI_COMP_MODE_DOUBLE = 1, /* in double component mode */ + VI_COMP_MODE_BUTT, +}VI_COMP_MODE_E; + +/* Y/C composite or separation mode */ +typedef enum hiVI_COMBINE_MODE_E +{ + VI_COMBINE_COMPOSITE = 0, /* Composite mode */ + VI_COMBINE_SEPARATE, /* Separate mode */ + VI_COMBINE_BUTT, +} VI_COMBINE_MODE_E; + +/* Attribute of the vertical synchronization signal */ +typedef enum hiVI_VSYNC_E +{ + VI_VSYNC_FIELD = 0, /* Field/toggle mode:a signal reversal means a new frame or a field */ + VI_VSYNC_PULSE, /* Pusle/effective mode:a pusle or an effective signal means a new frame or a field */ +} VI_VSYNC_E; + +/* Polarity of the vertical synchronization signal */ +typedef enum hiVI_VSYNC_NEG_E +{ + VI_VSYNC_NEG_HIGH = 0, /*if VIU_VSYNC_E = VIU_VSYNC_FIELD,then the vertical synchronization signal of even field is high-level, + if VIU_VSYNC_E = VIU_VSYNC_PULSE,then the vertical synchronization pulse is positive pulse.*/ + VI_VSYNC_NEG_LOW /*if VIU_VSYNC_E = VIU_VSYNC_FIELD,then the vertical synchronization signal of even field is low-level, + if VIU_VSYNC_E = VIU_VSYNC_PULSE,then the vertical synchronization pulse is negative pulse.*/ +} VI_VSYNC_NEG_E; + +/* Attribute of the horizontal synchronization signal */ +typedef enum hiVI_HSYNC_E +{ + VI_HSYNC_VALID_SINGNAL = 0, /* the horizontal synchronization is valid signal mode */ + VI_HSYNC_PULSE, /* the horizontal synchronization is pulse mode, a new pulse means the beginning of a new line */ +} VI_HSYNC_E; + +/* Polarity of the horizontal synchronization signal */ +typedef enum hiVI_HSYNC_NEG_E +{ + VI_HSYNC_NEG_HIGH = 0, /*if VI_HSYNC_E = VI_HSYNC_VALID_SINGNAL,then the valid horizontal synchronization signal is high-level; + if VI_HSYNC_E = VI_HSYNC_PULSE,then the horizontal synchronization pulse is positive pulse */ + VI_HSYNC_NEG_LOW /*if VI_HSYNC_E = VI_HSYNC_VALID_SINGNAL,then the valid horizontal synchronization signal is low-level; + if VI_HSYNC_E = VI_HSYNC_PULSE,then the horizontal synchronization pulse is negative pulse */ +} VI_HSYNC_NEG_E; + +/* Attribute of the valid vertical synchronization signal */ +typedef enum hiVI_VSYNC_VALID_E +{ + VI_VSYNC_NORM_PULSE = 0, /* the vertical synchronization is pusle mode, a pusle means a new frame or field */ + VI_VSYNC_VALID_SINGAL, /* the vertical synchronization is effective mode, a effective signal means a new frame or field */ +} VI_VSYNC_VALID_E; + +/* Polarity of the valid vertical synchronization signal */ +typedef enum hiVI_VSYNC_VALID_NEG_E +{ + VI_VSYNC_VALID_NEG_HIGH = 0, /*if VI_VSYNC_VALID_E = VI_VSYNC_NORM_PULSE,a positive pulse means vertical synchronization pulse; + if VI_VSYNC_VALID_E = VI_VSYNC_VALID_SINGAL,the valid vertical synchronization signal is high-level */ + VI_VSYNC_VALID_NEG_LOW /*if VI_VSYNC_VALID_E = VI_VSYNC_NORM_PULSE,a negative pulse means vertical synchronization pulse; + if VI_VSYNC_VALID_E = VI_VSYNC_VALID_SINGAL,the valid vertical synchronization signal is low-level */ +} VI_VSYNC_VALID_NEG_E; + + + +/* Blank information of the input timing */ +typedef struct hiVI_TIMING_BLANK_S +{ + HI_U32 u32HsyncHfb ; /* Horizontal front blanking width */ + HI_U32 u32HsyncAct ; /* Horizontal effetive width */ + HI_U32 u32HsyncHbb ; /* Horizontal back blanking width */ + HI_U32 u32VsyncVfb ; /* Vertical front blanking height of one frame or odd-field frame picture */ + HI_U32 u32VsyncVact ; /* Vertical effetive width of one frame or odd-field frame picture */ + HI_U32 u32VsyncVbb ; /* Vertical back blanking height of one frame or odd-field frame picture */ + HI_U32 u32VsyncVbfb ; /* Even-field vertical front blanking height when input mode is interlace (invalid when progressive input mode) */ + HI_U32 u32VsyncVbact ; /* Even-field vertical effetive width when input mode is interlace (invalid when progressive input mode) */ + HI_U32 u32VsyncVbbb ; /* Even-field vertical back blanking height when input mode is interlace (invalid when progressive input mode) */ +}VI_TIMING_BLANK_S; + +/* synchronization information about the BT.601 or DC timing */ +typedef struct hiVI_SYNC_CFG_S +{ + VI_VSYNC_E enVsync; + VI_VSYNC_NEG_E enVsyncNeg; + VI_HSYNC_E enHsync; + VI_HSYNC_NEG_E enHsyncNeg; + VI_VSYNC_VALID_E enVsyncValid; + VI_VSYNC_VALID_NEG_E enVsyncValidNeg; + VI_TIMING_BLANK_S stTimingBlank; +} VI_SYNC_CFG_S; + +/* the highest bit of the BT.656 timing reference code*/ +typedef enum hiBT656_FIXCODE_E +{ + BT656_FIXCODE_1 = 0, /* The highest bit of the EAV/SAV data over the BT.656 protocol is always 1.*/ + BT656_FIXCODE_0 /* The highest bit of the EAV/SAV data over the BT.656 protocol is always 0.*/ +}BT656_FIXCODE_E; + +/* Polarity of the field indicator bit (F) of the BT.656 timing reference code */ +typedef enum hiBT656_FIELD_POLAR_E +{ + BT656_FIELD_POLAR_STD = 0, /* the standard BT.656 mode,the first filed F=0,the second filed F=1*/ + BT656_FIELD_POLAR_NSTD /* the non-standard BT.656 mode,the first filed F=1,the second filed F=0*/ +}BT656_FIELD_POLAR_E; + +typedef struct hiVI_BT656_SYNC_CFG_S +{ + BT656_FIXCODE_E enFixCode; + BT656_FIELD_POLAR_E enFieldPolar; +}VI_BT656_SYNC_CFG_S; + +typedef enum hiVI_VBI_LOCAL_E +{ + VI_VBI_LOCAL_ODD_FRONT = 0, + VI_VBI_LOCAL_ODD_END, + VI_VBI_LOCAL_EVEN_FRONT, + VI_VBI_LOCAL_EVEN_END, + VI_VBI_LOCAL_BUTT +} VI_VBI_LOCAL_E; + +typedef struct hiVI_VBI_ATTR_S +{ + VI_VBI_LOCAL_E enLocal; /* location of VBI */ + HI_S32 s32X; /* horizontal original position of the VBI data */ + HI_S32 s32Y; /* vertical original position of the VBI data */ + HI_U32 u32Len; /* length of VBI data, by word(4 Bytes) */ +} VI_VBI_ATTR_S; + +typedef enum hiVI_DATA_TYPE_E +{ + VI_DATA_TYPE_YUV = 0, + VI_DATA_TYPE_RGB = 1, + VI_DATA_TYPE_BUTT +} VI_DATA_TYPE_E; + +typedef enum hiVI_DATA_PATH_E +{ + VI_PATH_BYPASS = 0, /* ISP bypass */ + VI_PATH_ISP = 1, /* ISP enable */ + VI_PATH_RAW = 2, /* Capture raw data, for debug */ + VI_PATH_BUTT +}VI_DATA_PATH_E; + +/* the extended attributes of VI device */ +typedef struct hiVI_DEV_ATTR_EX_S +{ + VI_INPUT_MODE_E enInputMode; /* Input mode */ + VI_WORK_MODE_E enWorkMode; /*1-, 2-, or 4-channel multiplexed work mode */ + + VI_COMBINE_MODE_E enCombineMode; /* Y/C composite or separation mode */ + VI_COMP_MODE_E enCompMode; /* Component mode (single-component or dual-component) */ + VI_CLK_EDGE_E enClkEdge; /* Clock edge mode (sampling on the rising or falling edge) */ + + HI_U32 au32CompMask[2]; /* Component mask */ + + VI_SCAN_MODE_E enScanMode; /* Input scanning mode (progressive or interlaced) */ + HI_S32 s32AdChnId[4]; /* AD channel ID. Typically, the default value -1 is recommended */ + + VI_DATA_YUV_SEQ_E enDataSeq; /* Input data sequence (only the YUV format is supported) */ + VI_SYNC_CFG_S stSynCfg; /* Sync timing. This member must be configured in BT.601 mode or DC mode */ + + VI_BT656_SYNC_CFG_S stBT656SynCfg; /* Sync timing. This member must be configured in BT.656 mode */ + + VI_DATA_PATH_E enDataPath; /* ISP enable or bypass */ + VI_DATA_TYPE_E enInputDataType; /* RGB: CSC-709 or CSC-601, PT YUV444 disable; YUV: default yuv CSC coef PT YUV444 enable. */ + + HI_BOOL bDataRev; /* Data reverse */ + + RECT_S stDevRect; /* Dev capture rect */ +} VI_DEV_ATTR_EX_S; + +/* the attributes of a VI device */ +typedef struct hiVI_DEV_ATTR_S +{ + VI_INTF_MODE_E enIntfMode; /* Interface mode */ + VI_WORK_MODE_E enWorkMode; /*1-, 2-, or 4-channel multiplexed work mode */ + + HI_U32 au32CompMask[2]; /* Component mask */ + VI_SCAN_MODE_E enScanMode; /* Input scanning mode (progressive or interlaced) */ + HI_S32 s32AdChnId[4]; /* AD channel ID. Typically, the default value -1 is recommended */ + + /* The below members must be configured in BT.601 mode or DC mode and are invalid in other modes */ + VI_DATA_YUV_SEQ_E enDataSeq; /* Input data sequence (only the YUV format is supported) */ + VI_SYNC_CFG_S stSynCfg; /* Sync timing. This member must be configured in BT.601 mode or DC mode */ + + VI_DATA_PATH_E enDataPath; /* ISP enable or bypass */ + VI_DATA_TYPE_E enInputDataType; /* RGB: CSC-709 or CSC-601, PT YUV444 disable; YUV: default yuv CSC coef PT YUV444 enable. */ + + HI_BOOL bDataRev; /* Data reverse */ + + RECT_S stDevRect; /* Dev capture rect */ +} VI_DEV_ATTR_S; + + +typedef struct hiVI_CHN_BIND_ATTR_S +{ + VI_DEV ViDev; + VI_WAY ViWay; +} VI_CHN_BIND_ATTR_S; + + +/* the attributes of a VI way */ +typedef struct hiVI_WAY_ATTR_S +{ + HI_S32 s32AdChnId; +} VI_WAY_ATTR_S; + + +/* captrue selection of video input */ +typedef enum hiVI_CAPSEL_E +{ + VI_CAPSEL_TOP = 0, /* top field */ + VI_CAPSEL_BOTTOM, /* bottom field */ + VI_CAPSEL_BOTH, /* top and bottom field */ + VI_CAPSEL_BUTT +} VI_CAPSEL_E; + + +/* the attributes of a VI channel */ +typedef struct hiVI_CHN_ATTR_S +{ + RECT_S stCapRect; /* the capture rect (corresponding to the size of the picture captured by a VI device). + For primary channels, the stCapRect's u32Width and u32Height are static attributes. That is, + the value of them can be changed only after primary and secondary channels are disabled. + For secondary channels, stCapRect is an invalid attribute */ + SIZE_S stDestSize; /* Target picture size. + For primary channels, stDestSize must be equal to stCapRect's u32Width and u32Height, + because primary channel doesn't have scale capability. Additionally, it is a static + attribute, That is, the value of stDestSize can be changed only after primary and + secondary channels are disabled. + For secondary channels, stDestSize is a dynamic attribute */ + + VI_CAPSEL_E enCapSel; /* Frame/field select. It is used only in interlaced mode. + For primary channels, enCapSel is a static attribute */ + PIXEL_FORMAT_E enPixFormat; /* Pixel storage format. Only the formats semi-planar420 and semi-planar422 are supported */ + + COMPRESS_MODE_E enCompressMode; /* 256B Segment compress or no compress. */ + + HI_BOOL bMirror; /* Whether to mirror */ + HI_BOOL bFlip; /* Whether to flip */ + HI_S32 s32SrcFrameRate; /* Source frame rate. The value -1 indicates that the frame rate is not controlled */ + HI_S32 s32DstFrameRate; /* Target frame rate. The value -1 indicates that the frame rate is not controlled */ +} VI_CHN_ATTR_S; + + +typedef struct hiVI_CHN_STAT_S +{ + HI_BOOL bEnable; /* Whether this channel is enabled */ + HI_U32 u32IntCnt; /* The video frame interrupt count */ + HI_U32 u32FrmRate; /* current frame rate */ + HI_U32 u32LostInt; /* The interrupt is received but nobody care */ + HI_U32 u32VbFail; /* Video buffer malloc failure */ + HI_U32 u32PicWidth; /* curren pic width */ + HI_U32 u32PicHeight; /* current pic height */ +} VI_CHN_STAT_S; + +typedef enum hi_VI_USERPIC_MODE_E +{ + VI_USERPIC_MODE_PIC = 0, /* YUV picture */ + VI_USERPIC_MODE_BGC, /* Background picture only with a color */ + VI_USERPIC_MODE_BUTT, +} VI_USERPIC_MODE_E; + +typedef struct hiVI_USERPIC_BGC_S +{ + HI_U32 u32BgColor; +} VI_USERPIC_BGC_S; + +typedef struct hiVI_USERPIC_ATTR_S +{ + HI_BOOL bPub; /* Whether the user picture information is shared by all VI devices and channels*/ + VI_USERPIC_MODE_E enUsrPicMode; /* User picture mode */ + union + { + VIDEO_FRAME_INFO_S stUsrPicFrm; /* Information about a YUV picture */ + VI_USERPIC_BGC_S stUsrPicBg; /* Information about a background picture only with a color */ + }unUsrPic; +} VI_USERPIC_ATTR_S; + +typedef enum hiVI_FLASH_MODE_E +{ + VI_FLASH_ONCE = 0, /* Flash one time */ + VI_FLASH_FREQ = 1, /* Flash frequently */ + VI_FLASH_MODE_BUTT +}VI_FLASH_MODE_E; + +typedef struct hiVI_FlASH_CONFIG_S +{ + VI_FLASH_MODE_E enFlashMode; /* Flash one time, flash frequently*/ + + HI_U32 u32StartTime; /* Flash start timeunit: sensor pix clk.*/ + HI_U32 u32Duration; /* Flash high duration, unit: sensor pix clk.*/ + HI_U32 u32CapFrmIndex; /* Set which vframe will be bFlashed after flashing, default is 0. */ + HI_U32 u32Interval; /* Flash frequently interval, unit: frame*/ +}VI_FLASH_CONFIG_S; + +typedef struct hiVI_EXT_CHN_ATTR_S +{ + VI_CHN s32BindChn; /* The channel num which extend channel will bind to*/ + SIZE_S stDestSize; /* Target size*/ + + HI_S32 s32SrcFrameRate; /* Source frame rate. The value -1 indicates that the frame rate is not controlled */ + HI_S32 s32DstFrameRate; /* Target frame rate. The value -1 indicates that the frame rate is not controlled */ + PIXEL_FORMAT_E enPixFormat; /* Pixel storage format. Only the formats semi-planar420 and semi-planar422 are supported */ + COMPRESS_MODE_E enCompressMode; +}VI_EXT_CHN_ATTR_S; + + +typedef struct hiVI_LDC_ATTR_S +{ + HI_BOOL bEnable; /* Whether LDC is enbale */ + LDC_ATTR_S stAttr; /* LDC Attribute */ +}VI_LDC_ATTR_S; + +typedef struct hiVI_CHN_LUM_S +{ + HI_U32 u32Lum; /* Luma sum of current frame */ + HI_U64 u64Pts; /* PTS of current frame */ +} VI_CHN_LUM_S; + +typedef enum hiVI_CSC_TYPE_E +{ + VI_CSC_TYPE_601 = 0, /* CSC Type: 601 */ + VI_CSC_TYPE_709, /* CSC Type: 709 */ + VI_CSC_TYPE_BUTT, +} VI_CSC_TYPE_E; + +typedef struct hiVI_CSC_ATTR_S +{ + VI_CSC_TYPE_E enViCscType; /* 601 or 709 */ + HI_U32 u32LumaVal; /* Luminance: [0 ~ 100] */ + HI_U32 u32ContrVal; /* Contrast: [0 ~ 100] */ + HI_U32 u32HueVal; /* Hue: [0 ~ 100] */ + HI_U32 u32SatuVal; /* Satuature: [0 ~ 100] */ +} VI_CSC_ATTR_S; + +typedef enum hiVI_RAW_READ_MODE_E +{ + READ_MODE_CYCLE = 0x0, /* read raw data cycle. */ + READ_MODE_LAST_FRAME, /* read the last frame repeatly. */ + READ_MODE_ONECE, /* stop reading when data end. */ + + READ_MODE_BUTT +}VI_RAW_READ_MODE_E; + +typedef struct hiVI_RAW_FRAME_INFO_S +{ + HI_U32 u32PoolId; + HI_U32 u32PhyAddr; + HI_VOID *pVirAddr; +}VI_RAW_FRAME_INFO_S; + +#define RAW_READ_MAX_FRAME_NUM 30 +typedef struct +{ + VIDEO_FRAME_INFO_S stFrame; +}VI_RAW_DATA_INFO_S; + +typedef struct hiVI_DCI_PARAM_S +{ + HI_BOOL bEnable; + HI_U32 u32BlackGain; /*u32BlackGain : [0, 63]*/ + HI_U32 u32ContrastGain; /*u32ContrastGain : [0, 63]*/ + HI_U32 u32LightGain; /*u32LightGain : [0, 63]*/ +} VI_DCI_PARAM_S; + +typedef struct hiVI_ISP_WDR_ATTR_S +{ + WDR_MODE_E enWDRMode; + HI_BOOL bCompress; +}VI_WDR_ATTR_S; + +typedef enum hiVI_DUMP_TYPE_E +{ + VI_DUMP_TYPE_RAW = 0, + VI_DUMP_TYPE_IR = 1, + VI_DUMP_TYPE_YUV = 2, + VI_DUMP_TYPE_RGB = 3, + VI_DUMP_TYPE_BUTT +}VI_DUMP_TYPE_E; + +typedef struct hiVI_DUMP_ATTR_S +{ + VI_DUMP_TYPE_E enDumpType; +}VI_DUMP_ATTR_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* End of #ifndef__HI_COMM_VIDEO_IN_H__ */ + + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_video.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_video.h new file mode 100644 index 0000000..afe0ea0 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_video.h @@ -0,0 +1,445 @@ +/******************************************************************************* + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_video.h + Version : Initial Draft + Author : c42025 + Created : 2006/11/09 + Description : + History : + 1.Date : 2006/11/03 + Author : c42025 + Modification: Created file + + 2.Date : 2007/12/11 + Author : c42025 + Modification: delelte all about digital watermark + + 3.Date : 2008/10/31 + Author : z44949 + Modification: Translate the chinese comment +******************************************************************************/ + +#ifndef __HI_COMM_VIDEO_H__ +#define __HI_COMM_VIDEO_H__ + +#include "hi_type.h" +#include "hi_defines.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define FISHEYE_MAX_REGION_NUM 4 +#define FISHEYE_MAX_OFFSET 127 +#define FISHEYE_MAX_PAN_VALUE 360 +#define FISHEYE_MAX_TILT_VALUE 360 +#define FISHEYE_MAX_ZOOM_VALUE 4095 +#define FISHEYE_MIN_ZOOM_VALUE 1 +#define FISHEYE_MIN_OUT_WIDTH 960 +#define FISHEYE_MIN_OUT_HEIGHT 360 +#define FISHEYE_MAX_OUT_WIDTH 4608 +#define FISHEYE_MAX_OUT_HEIGHT 3456 + + +typedef struct hiPOINT_S +{ + HI_S32 s32X; + HI_S32 s32Y; +} POINT_S; + +typedef struct hiSIZE_S +{ + HI_U32 u32Width; + HI_U32 u32Height; +} SIZE_S; + +typedef struct hiRECT_S +{ + HI_S32 s32X; + HI_S32 s32Y; + HI_U32 u32Width; + HI_U32 u32Height; +} RECT_S; + +typedef enum hiPIC_SIZE_E +{ + PIC_QCIF = 0, + PIC_CIF, + PIC_2CIF, + PIC_HD1, + PIC_D1, + PIC_960H, + + PIC_QVGA, /* 320 * 240 */ + PIC_VGA, /* 640 * 480 */ + PIC_XGA, /* 1024 * 768 */ + PIC_SXGA, /* 1400 * 1050 */ + PIC_UXGA, /* 1600 * 1200 */ + PIC_QXGA, /* 2048 * 1536 */ + + PIC_WVGA, /* 854 * 480 */ + PIC_WSXGA, /* 1680 * 1050 */ + PIC_WUXGA, /* 1920 * 1200 */ + PIC_WQXGA, /* 2560 * 1600 */ + + PIC_HD720, /* 1280 * 720 */ + PIC_HD1080, /* 1920 * 1080 */ + PIC_2304x1296, /* 3M:2304 * 1296 */ + PIC_2592x1520, /* 4M:2592 * 1520 */ + PIC_5M, /* 2592 * 1944 */ + PIC_UHD4K, /* 3840 * 2160 */ + + PIC_BUTT +} PIC_SIZE_E; + +typedef enum hiVIDEO_NORM_E +{ + VIDEO_ENCODING_MODE_PAL = 0, + VIDEO_ENCODING_MODE_NTSC, + VIDEO_ENCODING_MODE_AUTO, + VIDEO_ENCODING_MODE_BUTT +} VIDEO_NORM_E; + +typedef enum hiVIDEO_CONTROL_MODE_E +{ + VIDEO_CONTROL_MODE_SLAVER = 0, + VIDEO_CONTROL_MODE_MASTER, + VIDEO_CONTROL_MODE_BUTT +} VIDEO_CONTROL_MODE_E; + +/* we ONLY define picture format used, all unused will be deleted!*/ +typedef enum hiPIXEL_FORMAT_E +{ + PIXEL_FORMAT_RGB_1BPP = 0, + PIXEL_FORMAT_RGB_2BPP, + PIXEL_FORMAT_RGB_4BPP, + PIXEL_FORMAT_RGB_8BPP, + PIXEL_FORMAT_RGB_444, + + PIXEL_FORMAT_RGB_4444, + PIXEL_FORMAT_RGB_555, + PIXEL_FORMAT_RGB_565, + PIXEL_FORMAT_RGB_1555, + + /* 9 reserved */ + PIXEL_FORMAT_RGB_888, + PIXEL_FORMAT_RGB_8888, + + PIXEL_FORMAT_RGB_PLANAR_888, + PIXEL_FORMAT_RGB_BAYER_8BPP, + PIXEL_FORMAT_RGB_BAYER_10BPP, + PIXEL_FORMAT_RGB_BAYER_12BPP, + PIXEL_FORMAT_RGB_BAYER_14BPP, + + PIXEL_FORMAT_RGB_BAYER, /* 16 bpp */ + + PIXEL_FORMAT_YUV_A422, + PIXEL_FORMAT_YUV_A444, + + PIXEL_FORMAT_YUV_PLANAR_422, + PIXEL_FORMAT_YUV_PLANAR_420, + + PIXEL_FORMAT_YUV_PLANAR_444, + + PIXEL_FORMAT_YUV_SEMIPLANAR_422, + PIXEL_FORMAT_YUV_SEMIPLANAR_420, + PIXEL_FORMAT_YUV_SEMIPLANAR_444, + + PIXEL_FORMAT_UYVY_PACKAGE_422, + PIXEL_FORMAT_YUYV_PACKAGE_422, + PIXEL_FORMAT_VYUY_PACKAGE_422, + PIXEL_FORMAT_YCbCr_PLANAR, + + PIXEL_FORMAT_SINGLE, + + PIXEL_FORMAT_BUTT +} PIXEL_FORMAT_E; + +typedef struct hiVIDEO_VBI_INFO_S +{ + HI_U32 au32Data[VIU_MAX_VBI_LEN]; + HI_U32 u32Len; +} VIDEO_VBI_INFO_S; + +typedef enum hiVIDEO_FIELD_E +{ + VIDEO_FIELD_TOP = 0x1, /* even field */ + VIDEO_FIELD_BOTTOM = 0x2, /* odd field */ + VIDEO_FIELD_INTERLACED = 0x3, /* two interlaced fields */ + VIDEO_FIELD_FRAME = 0x4, /* frame */ + + VIDEO_FIELD_BUTT +} VIDEO_FIELD_E; + +typedef enum hiVIDEO_FORMAT_E +{ + VIDEO_FORMAT_LINEAR = 0x0, /* nature video line */ + VIDEO_FORMAT_TILE = 0x1, /* tile cell: 256pixel x 16line, default tile mode */ + VIDEO_FORMAT_TILE64 = 0x2, /* tile cell: 64pixel x 16line */ + + VIDEO_FORMAT_BUTT +} VIDEO_FORMAT_E; + +typedef enum hiCOMPRESS_MODE_E +{ + COMPRESS_MODE_NONE = 0x0, /* no compress */ + COMPRESS_MODE_SEG = 0x1, /* compress unit is 256 bytes as a segment, default seg mode */ + COMPRESS_MODE_SEG128 = 0x2, /* compress unit is 128 bytes as a segment */ + COMPRESS_MODE_LINE = 0x3, /* compress unit is the whole line */ + COMPRESS_MODE_FRAME = 0x4, /* compress unit is the whole frame */ + + COMPRESS_MODE_BUTT +} COMPRESS_MODE_E; + +typedef enum hiVIDEO_DISPLAY_MODE_E +{ + VIDEO_DISPLAY_MODE_PREVIEW = 0x0, + VIDEO_DISPLAY_MODE_PLAYBACK = 0x1, + + VIDEO_DISPLAY_MODE_BUTT +} VIDEO_DISPLAY_MODE_E; + + +#define DCF_DRSCRIPTION_LENGTH 32 +#define DCF_CAPTURE_TIME_LENGTH 20 + +typedef struct hiISP_DCF_INFO_S +{ + HI_U8 au8ImageDescription[DCF_DRSCRIPTION_LENGTH]; /*Describes image*/ + HI_U8 au8Make[DCF_DRSCRIPTION_LENGTH]; /*Shows manufacturer of digital cameras*/ + HI_U8 au8Model[DCF_DRSCRIPTION_LENGTH]; /*Shows model number of digital cameras*/ + HI_U8 au8Software[DCF_DRSCRIPTION_LENGTH]; /*Shows firmware (internal software of digital cameras) version number*/ + + HI_U16 u16ISOSpeedRatings; /*CCD sensitivity equivalent to Ag-Hr film speedrate*/ + HI_U32 u32FNumber; /*The actual F-number (F-stop) of lens when the image was taken*/ + HI_U32 u32MaxApertureValue; /*Maximum aperture value of lens.*/ + HI_U32 u32ExposureTime; /*Exposure time (reciprocal of shutter speed).*/ + HI_U32 u32ExposureBiasValue; /*Exposure bias (compensation) value of taking picture*/ + HI_U8 u8ExposureProgram; /*Exposure program that the camera used when image was taken. '1' means manual control, '2' + program normal, '3' aperture priority, '4' shutter priority, '5' program creative (slow program), + '6' program action(high-speed program), '7' portrait mode, '8' landscape mode*/ + HI_U8 u8MeteringMode; /*Exposure metering method. '0' means unknown, '1' average, '2' center weighted average, '3' + spot, '4' multi-spot, '5' multi-segment, '6' partial, '255' other*/ + HI_U8 u8LightSource; /*Light source, actually this means white balance setting. '0' means unknown, '1' daylight, '2' + fluorescent, '3' tungsten, '10' flash, '17' standard light A, '18' standard light B, '19' standard light + C, '20' D55, '21' D65, '22' D75, '255' other*/ + HI_U32 u32FocalLength; /*Focal length of lens used to take image. Unit is millimeter*/ + HI_U8 u8SceneType; /*Indicates the type of scene. Value '0x01' means that the image was directly photographed.*/ + HI_U8 u8CustomRendered; /*Indicates the use of special processing on image data, such as rendering geared to output. + 0 = Normal process 1 = Custom process */ + HI_U8 u8ExposureMode; /*Indicates the exposure mode set when the image was shot. + 0 = Auto exposure,1 = Manual exposure, 2 = Auto bracket*/ + HI_U8 u8WhiteBalance; /* Indicates the white balance mode set when the image was shot. + 0 = Auto white balance ,1 = Manual white balance */ + HI_U8 u8FocalLengthIn35mmFilm; /*Indicates the equivalent focal length assuming a 35mm film camera, in mm*/ + HI_U8 u8SceneCaptureType; /*Indicates the type of scene that was shot. 0 = Standard,1 = Landscape,2 = Portrait,3 = Night scene. */ + HI_U8 u8GainControl; /*Indicates the degree of overall image gain adjustment. 0 = None,1 = Low gain up,2 = High gain up,3 = Low gain down,4 = High gain down. */ + HI_U8 u8Contrast; /*Indicates the direction of contrast processing applied by the camera when the image was shot. + 0 = Normal,1 = Soft,2 = Hard */ + HI_U8 u8Saturation; /*Indicates the direction of saturation processing applied by the camera when the image was shot. + 0 = Normal,1 = Low saturation,2 = High saturation*/ + HI_U8 u8Sharpness; /*Indicates the direction of sharpness processing applied by the camera when the image was shot. + 0 = Normal,1 = Soft,2 = Hard .*/ +} ISP_DCF_INFO_S; + +typedef struct hiJPEG_DCF_S +{ + HI_U8 au8CaptureTime[DCF_CAPTURE_TIME_LENGTH]; /*The date and time when the picture data was generated*/ + HI_U8 bFlash; /*whether the picture is captured when a flash lamp is on*/ + HI_U32 u32DigitalZoomRatio; /*Indicates the digital zoom ratio when the image was shot. + If the numerator of the recorded value is 0, this indicates that digital zoom was not used.*/ + ISP_DCF_INFO_S stIspDCFInfo; + +} JPEG_DCF_S; + +typedef enum hiFRAME_FLASH_TYPE_E +{ + FRAME_FLASH_OFF = 0, + FRAME_FLASH_ON = 1, + FRAME_FLASH_BUTT, +} FRAME_FLASH_TYPE_E; + +typedef struct hiVIDEO_SUPPLEMENT_S +{ + FRAME_FLASH_TYPE_E enFlashType; + HI_U32 u32JpegDcfPhyAddr; + HI_VOID* pJpegDcfVirAddr; + +} VIDEO_SUPPLEMENT_S; + +typedef struct hiVIDEO_FRAME_S +{ + HI_U32 u32Width; + HI_U32 u32Height; + VIDEO_FIELD_E u32Field; + PIXEL_FORMAT_E enPixelFormat; + + VIDEO_FORMAT_E enVideoFormat; + COMPRESS_MODE_E enCompressMode; + + HI_U32 u32PhyAddr[3]; + HI_VOID* pVirAddr[3]; + HI_U32 u32Stride[3]; + + HI_U32 u32HeaderPhyAddr[3]; + HI_VOID* pHeaderVirAddr[3]; + HI_U32 u32HeaderStride[3]; + + HI_S16 s16OffsetTop; /* top offset of show area */ + HI_S16 s16OffsetBottom; /* bottom offset of show area */ + HI_S16 s16OffsetLeft; /* left offset of show area */ + HI_S16 s16OffsetRight; /* right offset of show area */ + + HI_U64 u64pts; + HI_U32 u32TimeRef; + + HI_U32 u32PrivateData; + VIDEO_SUPPLEMENT_S stSupplement; +} VIDEO_FRAME_S; + +typedef struct hiVIDEO_FRAME_INFO_S +{ + VIDEO_FRAME_S stVFrame; + HI_U32 u32PoolId; +} VIDEO_FRAME_INFO_S; + +typedef struct hiBITMAP_S +{ + PIXEL_FORMAT_E enPixelFormat; /* Bitmap's pixel format */ + HI_U32 u32Width; /* Bitmap's width */ + HI_U32 u32Height; /* Bitmap's height */ + HI_VOID* pData; /* Address of Bitmap's data */ +} BITMAP_S; + +/* VI Mix-Capture info. */ +typedef struct hiVI_MIXCAP_STAT_S +{ + HI_BOOL bMixCapMode; /* In mix-capture mode or not. */ + HI_BOOL bHasDownScale; /* VI Frame is downscaled or not. */ +} VI_MIXCAP_STAT_S; + +/* VI output frame info. */ +typedef struct hiVI_FRAME_INFO_S +{ + VI_MIXCAP_STAT_S stMixCapState; /* VI Mix-Capture info. */ + VIDEO_FRAME_INFO_S stViFrmInfo; /* Video frame info. */ +} VI_FRAME_INFO_S; + +typedef enum hiLDC_VIEW_TYPE_E +{ + LDC_VIEW_TYPE_ALL = 0, /* View scale all but x and y independtly, this will keep both x and y axis ,but corner maybe lost*/ + LDC_VIEW_TYPE_CROP = 1, /* Not use view scale, this will lost some side and corner */ + + LDC_VIEW_TYPE_BUTT, +} LDC_VIEW_TYPE_E; + +typedef struct hiLDC_ATTR_S +{ + LDC_VIEW_TYPE_E enViewType; + HI_S32 s32CenterXOffset; /* Horizontal offset of the image distortion center relative to image center. [-28,28]. */ + HI_S32 s32CenterYOffset; /* Vertical offset of the image distortion center relative to image center. [-14,14]. */ + HI_S32 s32Ratio; /* Distortion ratio. [0, 511]. */ +} LDC_ATTR_S; + +typedef enum hiWDR_MODE_E +{ + WDR_MODE_NONE = 0, + WDR_MODE_BUILT_IN, + + WDR_MODE_2To1_LINE, + WDR_MODE_2To1_FRAME, + WDR_MODE_2To1_FRAME_FULL_RATE, + + WDR_MODE_3To1_LINE, + WDR_MODE_3To1_FRAME, + WDR_MODE_3To1_FRAME_FULL_RATE, + + WDR_MODE_4To1_LINE, + WDR_MODE_4To1_FRAME, + WDR_MODE_4To1_FRAME_FULL_RATE, + + WDR_MODE_BUTT, +} WDR_MODE_E; + +//typedef enum hiFISHEYE_DIVISION_MODE_E +//{ +// FISHEYE_180_MODE_UP = 0, +// FISHEYE_180_MODE_LEFT = 1, +// FISHEYE_180_MODE_DOWN = 2, +// FISHEYE_180_MODE_RIGHT = 3, +// FISHEYE_180_MODE_BUTT +//}FISHEYE_DIVISION_MODE_E; + + +typedef enum hiFISHEYE_MOUNT_MODE_E +{ + + FISHEYE_DESKTOP_MOUNT = 0, /* desktop mount mode */ + FISHEYE_CEILING_MOUNT = 1, /* ceiling mount mode */ + FISHEYE_WALL_MOUNT = 2, /* wall mount mode */ + + FISHEYE_MOUNT_MODE_BUTT +}FISHEYE_MOUNT_MODE_E; + + +typedef enum hiFISHEYE_VIEW_MODE_E +{ + FISHEYE_VIEW_360_PANORAMA = 0, /* 360 panorama mode of fisheye correction */ + FISHEYE_VIEW_180_PANORAMA = 1, /* 180 panorama mode of fisheye correction */ + FISHEYE_VIEW_NORMAL = 2, /* normal mode of fisheye correction */ + FISHEYE_NO_TRANSFORMATION = 3, /* no fisheye correction */ + + FISHEYE_VIEW_MODE_BUTT +}FISHEYE_VIEW_MODE_E; + +typedef struct hiFISHEYE_REGION_ATTR_S +{ + FISHEYE_VIEW_MODE_E enViewMode; /* fisheye view mode */ + HI_U32 u32InRadius; /* inner radius of fisheye correction region [0, u32OutRadius) */ + HI_U32 u32OutRadius; /* out radius of fisheye correction region [1, max(width/2 of input picture, height/2 of input picture)] */ + HI_U32 u32Pan; /* [0, 360] */ + HI_U32 u32Tilt; /* [0, 360] */ + HI_U32 u32HorZoom; /* [1, 4095] */ + HI_U32 u32VerZoom; /* [1, 4095] */ + RECT_S stOutRect; /* output image info after fisheye correction range of width [960, 4608], + rang of height [360, 3456], rang of x [0, 4608), rang of y [0, 3456) */ +}FISHEYE_REGION_ATTR_S; + + +typedef struct hiFISHEYE_ATTR_S +{ + HI_BOOL bEnable; /* whether enable fisheye correction or not */ + HI_BOOL bLMF; /* whether fisheye len's LMF coefficient is from user config or from default linear config */ + HI_BOOL bBgColor; /* whether use background color or not */ + HI_U32 u32BgColor; /* the background color ARGB8888 [0, 0xFFFFFF] */ + + HI_S32 s32HorOffset; /* the horizontal offset between image center and physical center of len [-127, 127] */ + HI_S32 s32VerOffset; /* the vertical offset between image center and physical center of len [-127, 127] */ + + HI_U32 u32TrapezoidCoef; /* strength coefficient of trapezoid correction */ + + FISHEYE_MOUNT_MODE_E enMountMode; /* fisheye mount mode */ + + HI_U32 u32RegionNum; /* fisheye correction region number [1, FISHEYE_MAX_REGION_NUM] */ + FISHEYE_REGION_ATTR_S astFisheyeRegionAttr[FISHEYE_MAX_REGION_NUM];/* attribution of fisheye correction region */ +}FISHEYE_ATTR_S; + + +typedef struct hiFISHEYE_CONFIG_S +{ + HI_U16 au16LMFCoef[128]; /* LMF coefficient of fisheye len */ +}FISHEYE_CONFIG_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* _HI_COMM_VIDEO_H_ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vo.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vo.h new file mode 100644 index 0000000..fb0f885 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vo.h @@ -0,0 +1,434 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_vo.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/03/18 + Description : + History : + 1.Date : 2009/03/18 + Author : x00100808 + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_COMM_VO_H__ +#define __HI_COMM_VO_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_video.h" + +#define VO_DEF_CHN_BUF_LEN 8 +#define VO_DEF_DISP_BUF_LEN 5 +#define VO_DEF_VIRT_BUF_LEN 3 + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef enum hiEN_VOU_ERR_CODE_E +{ + EN_ERR_VO_DEV_NOT_CONFIG = 0x40, + EN_ERR_VO_DEV_NOT_ENABLE = 0x41, + EN_ERR_VO_DEV_HAS_ENABLED = 0x42, + EN_ERR_VO_DEV_HAS_BINDED = 0x43, + EN_ERR_VO_DEV_NOT_BINDED = 0x44, + + ERR_VO_NOT_ENABLE = 0x45, + ERR_VO_NOT_DISABLE = 0x46, + ERR_VO_NOT_CONFIG = 0x47, + + ERR_VO_CHN_NOT_DISABLE = 0x48, + ERR_VO_CHN_NOT_ENABLE = 0x49, + ERR_VO_CHN_NOT_CONFIG = 0x4a, + ERR_VO_CHN_NOT_ALLOC = 0x4b, + + ERR_VO_CCD_INVALID_PAT = 0x4c, + ERR_VO_CCD_INVALID_POS = 0x4d, + + ERR_VO_WAIT_TIMEOUT = 0x4e, + ERR_VO_INVALID_VFRAME = 0x4f, + ERR_VO_INVALID_RECT_PARA = 0x50, + ERR_VO_SETBEGIN_ALREADY = 0x51, + ERR_VO_SETBEGIN_NOTYET = 0x52, + ERR_VO_SETEND_ALREADY = 0x53, + ERR_VO_SETEND_NOTYET = 0x54, + + ERR_VO_GRP_INVALID_ID = 0x55, + ERR_VO_GRP_NOT_CREATE = 0x56, + ERR_VO_GRP_HAS_CREATED = 0x57, + ERR_VO_GRP_NOT_DESTROY = 0x58, + ERR_VO_GRP_CHN_FULL = 0x59, + ERR_VO_GRP_CHN_EMPTY = 0x5a, + ERR_VO_GRP_CHN_NOT_EMPTY = 0x5b, + ERR_VO_GRP_INVALID_SYN_MODE = 0x5c, + ERR_VO_GRP_INVALID_BASE_PTS = 0x5d, + ERR_VO_GRP_NOT_START = 0x5e, + ERR_VO_GRP_NOT_STOP = 0x5f, + ERR_VO_GRP_INVALID_FRMRATE = 0x60, + ERR_VO_GRP_CHN_HAS_REG = 0x61, + ERR_VO_GRP_CHN_NOT_REG = 0x62, + ERR_VO_GRP_CHN_NOT_UNREG = 0x63, + ERR_VO_GRP_BASE_NOT_CFG = 0x64, + + ERR_GFX_NOT_DISABLE = 0x65, + ERR_GFX_NOT_BIND = 0x66, + ERR_GFX_NOT_UNBIND = 0x67, + ERR_GFX_INVALID_ID = 0x68, + + ERR_VO_WBC_NOT_DISABLE = 0x69, + ERR_VO_WBC_NOT_CONFIG = 0x6a, + + ERR_VO_CHN_AREA_OVERLAP = 0x6b, + + EN_ERR_INVALID_WBCID = 0x6c, + EN_ERR_INVALID_LAYERID = 0x6d, + EN_ERR_VO_VIDEO_HAS_BINDED = 0x6e, + EN_ERR_VO_VIDEO_NOT_BINDED = 0x6f, + ERR_VO_WBC_HAS_BIND = 0x70, + ERR_VO_WBC_HAS_CONFIG = 0x71, + ERR_VO_WBC_NOT_BIND = 0x72, + + /* new added */ + ERR_VO_BUTT + +}EN_VOU_ERR_CODE_E; + +/* System define error code */ +#define HI_ERR_VO_BUSY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_VO_NO_MEM HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_VO_NULL_PTR HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VO_SYS_NOTREADY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VO_INVALID_DEVID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +#define HI_ERR_VO_INVALID_CHNID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +#define HI_ERR_VO_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VO_NOT_SUPPORT HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_VO_NOT_PERMIT HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +#define HI_ERR_VO_INVALID_WBCID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_WBCID) +#define HI_ERR_VO_INVALID_LAYERID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_LAYERID) + + +/* device relative error code */ +#define HI_ERR_VO_DEV_NOT_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_NOT_CONFIG) +#define HI_ERR_VO_DEV_NOT_ENABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_NOT_ENABLE) +#define HI_ERR_VO_DEV_HAS_ENABLED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_HAS_ENABLED) +#define HI_ERR_VO_DEV_HAS_BINDED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_HAS_BINDED) +#define HI_ERR_VO_DEV_NOT_BINDED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_DEV_NOT_BINDED) + +/* video relative error code */ +#define HI_ERR_VO_VIDEO_NOT_ENABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_NOT_ENABLE) +#define HI_ERR_VO_VIDEO_NOT_DISABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_NOT_DISABLE) +#define HI_ERR_VO_VIDEO_NOT_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_NOT_CONFIG) +#define HI_ERR_VO_VIDEO_HAS_BINDED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_VIDEO_HAS_BINDED) +#define HI_ERR_VO_VIDEO_NOT_BINDED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, EN_ERR_VO_VIDEO_NOT_BINDED) + +/*wbc error code*/ +#define HI_ERR_VO_WBC_NOT_DISABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_NOT_DISABLE) +#define HI_ERR_VO_WBC_NOT_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_NOT_CONFIG) +#define HI_ERR_VO_WBC_HAS_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_HAS_CONFIG) +#define HI_ERR_VO_WBC_NOT_BIND HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_NOT_BIND) +#define HI_ERR_VO_WBC_HAS_BIND HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WBC_HAS_BIND) + +/* channel relative error code */ +#define HI_ERR_VO_CHN_NOT_DISABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_DISABLE) +#define HI_ERR_VO_CHN_NOT_ENABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_ENABLE) +#define HI_ERR_VO_CHN_NOT_CONFIG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_CONFIG) +#define HI_ERR_VO_CHN_NOT_ALLOC HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_NOT_ALLOC) +#define HI_ERR_VO_CHN_AREA_OVERLAP HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CHN_AREA_OVERLAP) + + +/* cascade relatvie error code */ +#define HI_ERR_VO_INVALID_PATTERN HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CCD_INVALID_PAT) +#define HI_ERR_VO_INVALID_POSITION HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_CCD_INVALID_POS) + +/* misc */ +#define HI_ERR_VO_WAIT_TIMEOUT HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_WAIT_TIMEOUT) +#define HI_ERR_VO_INVALID_VFRAME HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_INVALID_VFRAME) +#define HI_ERR_VO_INVALID_RECT_PARA HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_INVALID_RECT_PARA) +#define HI_ERR_VO_SETBEGIN_ALREADY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETBEGIN_ALREADY) +#define HI_ERR_VO_SETBEGIN_NOTYET HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETBEGIN_NOTYET) +#define HI_ERR_VO_SETEND_ALREADY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETEND_ALREADY) +#define HI_ERR_VO_SETEND_NOTYET HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_SETEND_NOTYET) + +/* sync group relative error code */ +#define HI_ERR_VO_GRP_INVALID_ID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_ID) +#define HI_ERR_VO_GRP_NOT_CREATE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_CREATE) +#define HI_ERR_VO_GRP_HAS_CREATED HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_HAS_CREATED) +#define HI_ERR_VO_GRP_NOT_DESTROY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_DESTROY) +#define HI_ERR_VO_GRP_CHN_FULL HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_FULL) +#define HI_ERR_VO_GRP_CHN_EMPTY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_EMPTY) +#define HI_ERR_VO_GRP_CHN_NOT_EMPTY HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_NOT_EMPTY) +#define HI_ERR_VO_GRP_INVALID_SYN_MODE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_SYN_MODE) +#define HI_ERR_VO_GRP_INVALID_BASE_PTS HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_BASE_PTS) +#define HI_ERR_VO_GRP_NOT_START HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_START) +#define HI_ERR_VO_GRP_NOT_STOP HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_NOT_STOP) +#define HI_ERR_VO_GRP_INVALID_FRMRATE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_INVALID_FRMRATE) +#define HI_ERR_VO_GRP_CHN_HAS_REG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_HAS_REG) +#define HI_ERR_VO_GRP_CHN_NOT_REG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_NOT_REG) +#define HI_ERR_VO_GRP_CHN_NOT_UNREG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_CHN_NOT_UNREG) +#define HI_ERR_VO_GRP_BASE_NOT_CFG HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_VO_GRP_BASE_NOT_CFG) + + +/* graphics relative error code */ +#define HI_ERR_VO_GFX_NOT_DISABLE HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_NOT_DISABLE) +#define HI_ERR_VO_GFX_NOT_BIND HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_NOT_BIND) +#define HI_ERR_VO_GFX_NOT_UNBIND HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_NOT_UNBIND) +#define HI_ERR_VO_GFX_INVALID_ID HI_DEF_ERR(HI_ID_VOU, EN_ERR_LEVEL_ERROR, ERR_GFX_INVALID_ID) + +/* vo inteface type */ +#define VO_INTF_CVBS (0x01L<<0) +#define VO_INTF_YPBPR (0x01L<<1) +#define VO_INTF_VGA (0x01L<<2) +#define VO_INTF_BT656 (0x01L<<3) +#define VO_INTF_BT1120 (0x01L<<4) +#define VO_INTF_HDMI (0x01L<<5) +#define VO_INTF_LCD (0x01L<<6) +#define VO_INTF_BT656_H (0x01L<<7) +#define VO_INTF_BT656_L (0x01L<<8) +#define VO_INTF_LCD_6BIT (0x01L<<9) +#define VO_INTF_LCD_8BIT (0x01L<<10) +#define VO_INTF_LCD_16BIT (0x01L<<11) + + + + + + +#define VO_DEFAULT_CHN -1 /* use vo buffer as pip buffer */ + +/***************************************************************************** + * 3520 ADDed + *****************************************************************************/ +typedef HI_S32 VO_INTF_TYPE_E; + + + +typedef enum hiVO_INTF_SYNC_E +{ + VO_OUTPUT_PAL = 0, + VO_OUTPUT_NTSC, + + VO_OUTPUT_1080P24, + VO_OUTPUT_1080P25, + VO_OUTPUT_1080P30, + + VO_OUTPUT_720P50, + VO_OUTPUT_720P60, + VO_OUTPUT_1080I50, + VO_OUTPUT_1080I60, + VO_OUTPUT_1080P50, + VO_OUTPUT_1080P60, + + VO_OUTPUT_576P50, + VO_OUTPUT_480P60, + + VO_OUTPUT_800x600_60, /* VESA 800 x 600 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1024x768_60, /* VESA 1024 x 768 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1280x1024_60, /* VESA 1280 x 1024 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1366x768_60, /* VESA 1366 x 768 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1440x900_60, /* VESA 1440 x 900 at 60 Hz (non-interlaced) CVT Compliant */ + VO_OUTPUT_1280x800_60, /* 1280*800@60Hz VGA@60Hz*/ + VO_OUTPUT_1600x1200_60, /* VESA 1600 x 1200 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1680x1050_60, /* VESA 1680 x 1050 at 60 Hz (non-interlaced) */ + VO_OUTPUT_1920x1200_60, /* VESA 1920 x 1600 at 60 Hz (non-interlaced) CVT (Reduced Blanking)*/ + VO_OUTPUT_640x480_60, /* VESA 640 x 480 at 60 Hz (non-interlaced) CVT */ + VO_OUTPUT_960H_PAL, /* ITU-R BT.1302 960 x 576 at 50 Hz (interlaced)*/ + VO_OUTPUT_960H_NTSC, /* ITU-R BT.1302 960 x 480 at 60 Hz (interlaced)*/ + VO_OUTPUT_320X240_60, /* For ota5182 at 60 Hz (8bit) */ + VO_OUTPUT_320X240_50, /* For ili9342 at 50 Hz (6bit) */ + VO_OUTPUT_240X320_50, /* For ili9341 at 50 Hz (6bit) */ + VO_OUTPUT_240X320_60, /* For ili9341 at 60 Hz (16bit) */ + VO_OUTPUT_USER, + VO_OUTPUT_BUTT + +} VO_INTF_SYNC_E; + +typedef enum hiVO_DISPLAY_FIELD_E +{ + VO_FIELD_TOP, /* top field*/ + VO_FIELD_BOTTOM, /* bottom field*/ + VO_FIELD_BOTH, /* top and bottom field*/ + VO_FIELD_BUTT +} VO_DISPLAY_FIELD_E; + +typedef enum hiVOU_ZOOM_IN_E +{ + VOU_ZOOM_IN_RECT = 0, /* zoom in by rect */ + VOU_ZOOM_IN_RATIO, /* zoom in by ratio */ + VOU_ZOOM_IN_BUTT +} VOU_ZOOM_IN_E; + +typedef enum hiVO_CSC_MATRIX_E +{ + VO_CSC_MATRIX_IDENTITY = 0, + + VO_CSC_MATRIX_BT601_TO_BT709, + VO_CSC_MATRIX_BT709_TO_BT601, + + VO_CSC_MATRIX_BT601_TO_RGB_PC, + VO_CSC_MATRIX_BT709_TO_RGB_PC, + + VO_CSC_MATRIX_RGB_TO_BT601_PC, + VO_CSC_MATRIX_RGB_TO_BT709_PC, + + VO_CSC_MATRIX_BUTT +} VO_CSC_MATRIX_E; + +typedef struct hiVO_CHN_ATTR_S +{ + HI_U32 u32Priority; /* video out overlay pri */ + RECT_S stRect; /* rect of video out chn */ + HI_BOOL bDeflicker; /* deflicker or not */ +}VO_CHN_ATTR_S; + +typedef struct hiVO_BORDER_S +{ + HI_BOOL bBorderEn; /*do Frame or not*/ + BORDER_S stBorder; +}VO_BORDER_S; + + +typedef struct hiVO_QUERY_STATUS_S +{ + HI_U32 u32ChnBufUsed; /* channel buffer that been occupied */ +} VO_QUERY_STATUS_S; + +typedef struct tagVO_SYNC_INFO_S +{ + HI_BOOL bSynm; /* sync mode(0:timing,as BT.656; 1:signal,as LCD) */ + HI_BOOL bIop; /* interlaced or progressive display(0:i; 1:p) */ + HI_U8 u8Intfb; /* interlace bit width while output */ + + HI_U16 u16Vact ; /* vertical active area */ + HI_U16 u16Vbb; /* vertical back blank porch */ + HI_U16 u16Vfb; /* vertical front blank porch */ + + HI_U16 u16Hact; /* herizontal active area */ + HI_U16 u16Hbb; /* herizontal back blank porch */ + HI_U16 u16Hfb; /* herizontal front blank porch */ + HI_U16 u16Hmid; /* bottom herizontal active area */ + + HI_U16 u16Bvact; /* bottom vertical active area */ + HI_U16 u16Bvbb; /* bottom vertical back blank porch */ + HI_U16 u16Bvfb; /* bottom vertical front blank porch */ + + HI_U16 u16Hpw; /* horizontal pulse width */ + HI_U16 u16Vpw; /* vertical pulse width */ + + HI_BOOL bIdv; /* inverse data valid of output */ + HI_BOOL bIhs; /* inverse horizontal synch signal */ + HI_BOOL bIvs; /* inverse vertical synch signal */ + +} VO_SYNC_INFO_S; + +typedef struct hiVO_PUB_ATTR_S +{ + HI_U32 u32BgColor; /* Background color of a device, in RGB format. */ + VO_INTF_TYPE_E enIntfType; /* Type of a VO interface */ + VO_INTF_SYNC_E enIntfSync; /* Type of a VO interface timing */ + VO_SYNC_INFO_S stSyncInfo; /* Information about VO interface timings */ +} VO_PUB_ATTR_S; + + + +typedef struct hiVO_CHN_VFRAME_TIMEOUT_S +{ + VIDEO_FRAME_INFO_S stVFrame; + HI_S32 s32MilliSec; +} VO_CHN_VFRAME_TIMEOUT_S; + +typedef struct hiVO_SCREEN_VFRAME_TIMEOUT_S +{ + VIDEO_FRAME_INFO_S stVFrame; + HI_S32 s32MilliSec; +} VO_SCREEN_VFRAME_TIMEOUT_S; + +typedef struct hiVO_USR_SEND_TIMEOUT_S +{ + VIDEO_FRAME_INFO_S stVFrame; + HI_S32 s32MilliSec; +} VO_USR_SEND_TIMEOUT_S; + + +typedef enum hiVO_PART_MODE_E +{ + VO_PART_MODE_SINGLE = 0, /* single partition, which use software to make multi-picture in one hardware cell */ + VO_PART_MODE_MULTI = 1, /* muliti partition, each partition is a hardware cell */ + VO_PART_MODE_BUTT + +} VO_PART_MODE_E; + +typedef struct hiVO_VIDEO_LAYER_ATTR_S +{ + RECT_S stDispRect; /* Display resolution */ + SIZE_S stImageSize; /* Canvas size of the video layer */ + HI_U32 u32DispFrmRt; /* Display frame rate */ + PIXEL_FORMAT_E enPixFormat; /* Pixel format of the video layer */ + HI_BOOL bDoubleFrame; /* Whether to double frames */ + HI_BOOL bClusterMode; /* Whether to take Cluster way to use memory*/ +} VO_VIDEO_LAYER_ATTR_S; + +typedef enum hiVOU_LAYER_DDR_E +{ + VOU_LAYER_DDR0 = 0, + VOU_LAYER_DDR1 = 1, + VOU_LAYER_DDR_BUTT +}VOU_LAYER_DDR_E; + +typedef struct hiVO_ZOOM_RATIO_S +{ + HI_U32 u32XRatio; + HI_U32 u32YRatio; + HI_U32 u32WRatio; + HI_U32 u32HRatio; +} VO_ZOOM_RATIO_S; + +typedef struct hiVO_ZOOM_ATTR_S +{ + VOU_ZOOM_IN_E enZoomType; /* choose the type of zoom in */ + union + { + RECT_S stZoomRect; /* zoom in by rect */ + VO_ZOOM_RATIO_S stZoomRatio; /* zoom in by ratio */ + }; +} VO_ZOOM_ATTR_S; + +typedef struct hiVO_CSC_S +{ + VO_CSC_MATRIX_E enCscMatrix; + HI_U32 u32Luma; /* luminance: 0 ~ 100 default: 50 */ + HI_U32 u32Contrast; /* contrast : 0 ~ 100 default: 50 */ + HI_U32 u32Hue; /* hue : 0 ~ 100 default: 50 */ + HI_U32 u32Satuature; /* satuature: 0 ~ 100 default: 50 */ +} VO_CSC_S; + + +typedef struct hiVO_REGION_INFO_S +{ + RECT_S *pstRegion; /*region attribute*/ + HI_U32 u32RegionNum; /*count of the region*/ +}VO_REGION_INFO_S; + +typedef struct hiVO_REGION_LUMA_S +{ + VO_REGION_INFO_S stRegionInfo; /*Information of the region*/ + HI_U32* pu32LumaData; /*Luma data of the region*/ + HI_S32 s32MilliSec; /*time parameter.less than 0 means waiting until get the luma data, + equal to 0 means get the luma data no matter whether it can or not, + more than 0 means waiting how long the time parameter it is*/ +}VO_REGION_LUMA_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __HI_COMM_VO_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vpss.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vpss.h new file mode 100644 index 0000000..f471cf6 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_comm_vpss.h @@ -0,0 +1,405 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_vpss.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : + Last Modified : + Description : common struct definition for vpss + Function List : + History : + 1.Date : 20130508 + Author : l00183122 + Modification: Create + + +******************************************************************************/ + +#ifndef __HI_COMM_VPSS_H__ +#define __HI_COMM_VPSS_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_errno.h" +#include "hi_comm_video.h" + +#define HI_ERR_VPSS_NULL_PTR HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) +#define HI_ERR_VPSS_NOTREADY HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) +#define HI_ERR_VPSS_INVALID_DEVID HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) +#define HI_ERR_VPSS_INVALID_CHNID HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +#define HI_ERR_VPSS_EXIST HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST) +#define HI_ERR_VPSS_UNEXIST HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST) +#define HI_ERR_VPSS_NOT_SUPPORT HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) +#define HI_ERR_VPSS_NOT_PERM HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) +#define HI_ERR_VPSS_NOMEM HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) +#define HI_ERR_VPSS_NOBUF HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF) +#define HI_ERR_VPSS_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) +#define HI_ERR_VPSS_BUSY HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) +#define HI_ERR_VPSS_BUF_EMPTY HI_DEF_ERR(HI_ID_VPSS, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) + + +typedef HI_S32 VPSS_GRP; +typedef HI_S32 VPSS_CHN; + +#define VPSS_INVALID_FRMRATE (-1UL) +#define VPSS_CHN0 0 +#define VPSS_CHN1 1 +#define VPSS_CHN2 2 +#define VPSS_CHN3 3 +#define VPSS_INVALID_CHN -1 + +/*Define de-interlace mode*/ +typedef enum hiVPSS_DIE_MODE_E +{ + VPSS_DIE_MODE_AUTO = 0, + VPSS_DIE_MODE_NODIE = 1, + VPSS_DIE_MODE_DIE = 2, + VPSS_DIE_MODE_BUTT +}VPSS_DIE_MODE_E; + +/*Define attributes of vpss channel*/ +typedef struct hiVPSS_CHN_ATTR_S +{ + HI_BOOL bSpEn; /*Sharpen enable*/ + HI_BOOL bBorderEn; /*Frame enable*/ + HI_BOOL bMirror; /*mirror enable*/ + HI_BOOL bFlip; /*flip enable*/ + HI_S32 s32SrcFrameRate; /* source frame rate */ + HI_S32 s32DstFrameRate; /* dest frame rate */ + BORDER_S stBorder; +}VPSS_CHN_ATTR_S; + +typedef struct hiVPSS_GRP_PARAM_S +{ + HI_U32 u32Contrast; /*strength of dymanic contrast improve*/ + + HI_S32 s32GlobalStrength; /*strength of whole 3DNR*/ + HI_S32 s32IeStrength; /*strength of image enhance*/ + HI_S32 s32YSFStrength; /*strength of space filter*/ + HI_S32 s32YTFStrength; /*strength of time filter*/ + HI_S32 s32CSFStrength; /*strength of chroma filter*/ + HI_S32 s32CTFStrength; /*strength of chroma filter*/ + HI_S32 s32MotionLimen; /*limen for motion*/ +}VPSS_GRP_PARAM_S; + +typedef struct +{ + /* Strength of spatial-domain filtering for Chroma. */ + HI_U8 Chroma_SF_Strength; /* [0,255] */ + /* Strength of time-domain filtering for Chroma. */ + HI_U8 Chroma_TF_Strength; /* [0, 32]: */ + + /* Whether IE is processed in post step, 0: the first step, 1: the last step */ + HI_U16 IE_PostFlag; /* [0, 1] */ + + /* Texture/Edge enhancement strength. + IES indicates the strength of texture/edge enhancement (IE) */ + HI_U16 IE_Strength; /* [0, 63] */ + + /* Motion detection threshold. + This parameter determines the sensitivity of the motion detection unit to + the pixel luminance variance. + A larger value indicates lower sensitivity to the pixel luminance variance. + To be specific, implements spatial-domain filtering on the pixel whose + luminance variance exceeds the threshold and the filtering strength is determined + by Luma_SF_Strength, + and implements time-domain filtering on the pixel + whose luminance variance is less than or equal to the threshold and the filtering + strength is determined by Luma_TF_Strength. */ + HI_U16 Luma_MotionThresh; /* [0,511] */ + + /* Strength of spatial-domain filtering for moving area Luma. */ + HI_U8 Luma_SF_MoveArea; /* [0,255] */ + /* Strength of spatial-domain filtering for Still Area Luma */ + HI_U8 Luma_SF_StillArea; /* [0, 64] */ + /* Strength of time-domain filtering for Luma. */ + HI_U8 Luma_TF_Strength; /* [0,15] */ + /* Strength of Desand */ + HI_U8 DeSand_Strength; /* [0, 8], default 0 */ +} VPSS_GRP_PARAM_V2_S; + +typedef VPSS_GRP_PARAM_V2_S tVppNRsEx; + + +typedef struct hiVPSS_NR_PARAM_V1_S +{ + HI_S32 s32YPKStr; /* [ 0 .. 63 ] */ + + HI_S32 s32YSFStr; /* [ 0 .. 200 ] */ + HI_S32 s32YTFStr; /* [ 0 .. 128 ] */ + + HI_S32 s32TFStrMax /* [ 0 .. 15 ] */; + + HI_S32 s32YSmthStr; /* [ 0 .. 200 ] */ + HI_S32 s32YSmthRat; /* [ 0 .. 32 ] */ + + HI_S32 s32YSFStrDlt; /* [ -128 .. 127 ] */ + HI_S32 s32YTFStrDlt; /* [ -64 .. 63 ] */ + HI_S32 s32YTFStrDl; /* [ 0 .. 31 ] */ + + HI_S32 s32YSFBriRat; /* [ 0 .. 64 ] */ + + HI_S32 s32CSFStr; /* [ 0 .. 80 ] */ + HI_S32 s32CTFstr; /* [ 0 .. 32 ] */ + +} VPSS_NR_PARAM_V1_S; + + +typedef union hiVPSS_NR_PARAM_U +{ + VPSS_NR_PARAM_V1_S stNRParam_V1; +}VPSS_NR_PARAM_U; + +typedef struct hiVPSS_GRP_VPPNRS_S +{ + int tss, sfc, tfc; + int sfs, tfs, mdz, ies; + +}VPSS_GRP_VPPNRS_S; + +typedef struct hiVPSS_GRP_VPPNRZ_S +{ + int SFS, SFS1, SPS1,SPT1, TFP1,TFR1,SBF1, MDDZ, MAAT, SFC; + int TFS, SFS2, SPS2,SPT2, TFP2,TFR2,SBF2, MATH, MATW, TFC; + +}VPSS_GRP_VPPNRZ_S; + +typedef struct hiVPSS_GRP_VPPNRX_S +{ + int StStrength, StProSpati, StProTempo, StBaseFreq; + int TFS, TFP, TFQ, TFR, SHP, MDDZ, MATH; + +}VPSS_GRP_VPPNRX_S; + +typedef struct hiVPSS_GRP_LEVEL2_PARAM_S +{ + VPSS_GRP_VPPNRS_S *pNrS; + VPSS_GRP_VPPNRZ_S *pNrZ; + VPSS_GRP_VPPNRX_S *pNrX; +}VPSS_GRP_LEVEL2_PARAM_S; + +typedef struct hiVPSS_GRP_VPPNRXCORE_S +{ + HI_U8 SBS ; + HI_U8 SDS , _reserved_b_ : 6; + HI_U8 SBF:2; + + HI_U8 MiBaTFP; + HI_U8 MiDaTFP; + + HI_U8 HiBaTFP; + HI_U8 HiDaTFP, _reserved_B_[3]; + + HI_U16 MDDZ : 7; + HI_U16 TFP : 6, _reserved_b0_ : 1; + HI_U16 MaTFP : 2; + + HI_U16 TFR : 5; + HI_U16 TFS : 4; + + HI_U16 SHP : 7; + HI_U16 MaTFR : 5; + + HI_U16 MaTFS : 4; + HI_U16 MaSHP : 7; +} VPSS_GRP_VPPNRXCORE_S; + +typedef struct hiVPSS_GRP_VPPNRXEX_S +{ + HI_U32 ISO; + + VPSS_GRP_VPPNRXCORE_S stUnit[3]; + + HI_U8 SFC; + HI_U8 PostSBS; + HI_U8 PostSDS; + HI_U8 PostSHP; + + HI_U8 PostROW : 5, _reserved_b1_ : 3; + HI_U8 PostSFS : 4, _reserved_b2_ : 1; + HI_U8 MATW : 3; + HI_U16 MATH : 9; + HI_U16 MABW : 1; + HI_U16 TFC : 6; +}VPSS_GRP_VPPNRXEX_S; + +/////////////////////////////////////////////////////////// +/* NR B interface */ +typedef struct +{ + int ISO; + + HI_U8 SFC, TFC, _reserved_B_[3]; + + HI_U8 SHPi, SBSi,SBTi, SDSi,SDTi, MDZi; + HI_U8 SHPj, SBSj,SBTj, SDSj,SDTj, MDZj; + HI_U8 SHPk, SBSk,SBTk, SDSk,SDTk; + + HI_U16 SBFi : 2, SBFj : 2, SBFk : 2, MATH : 10; + HI_U16 TFSi : 4, TFSj : 4, TFSk : 4, PSFS : 4; + HI_U16 TFRi : 5, TFRj : 5, TFRk : 5, Post : 1; +} VPSS_GRP_VPPNRBCORE_S; +typedef VPSS_GRP_VPPNRBCORE_S tVppNRbCore; + +typedef struct +{ + VPSS_GRP_VPPNRBCORE_S iNRb; + + HI_U8 MDAF : 3, PostROW : 5; + HI_U8 MATW : 2, ExTfThr : 5; + HI_U8 MABW : 1, TextThr; + HI_U8 MTFS; + +} VPSS_GRP_VPPNRBEX_S; +typedef VPSS_GRP_VPPNRBEX_S tVppNRbEx; +/////////////////////////////////////////////////////////// + +/*Define coordinate mode*/ +typedef enum hiVPSS_CROP_COORDINATE_E +{ + VPSS_CROP_RATIO_COOR = 0, /*Ratio coordinate*/ + VPSS_CROP_ABS_COOR /*Absolute coordinate*/ +}VPSS_CROP_COORDINATE_E; + +/*Define attributes of CLIP function*/ +typedef struct hiVPSS_CROP_INFO_S +{ + HI_BOOL bEnable; /*CROP enable*/ + VPSS_CROP_COORDINATE_E enCropCoordinate; /*Coordinate mode of the crop start point*/ + RECT_S stCropRect; /*CROP rectangular*/ +}VPSS_CROP_INFO_S; + +typedef struct hiVPSS_LDC_ATTR_S +{ + HI_BOOL bEnable; /* Whether LDC is enbale */ + LDC_ATTR_S stAttr; /* LDC Attribute */ +}VPSS_LDC_ATTR_S; + +/*Define attributes of vpss GROUP*/ +typedef struct hiVPSS_GRP_ATTR_S +{ + /*statistic attributes*/ + HI_U32 u32MaxW; /*MAX width of the group*/ + HI_U32 u32MaxH; /*MAX height of the group*/ + PIXEL_FORMAT_E enPixFmt; /*Pixel format*/ + + HI_BOOL bIeEn; /*Image enhance enable*/ + HI_BOOL bDciEn; /*Dynamic contrast Improve enable*/ + HI_BOOL bNrEn; /*Noise reduce enable*/ + HI_BOOL bHistEn; /*Hist enable*/ + VPSS_DIE_MODE_E enDieMode; /*De-interlace enable*/ +}VPSS_GRP_ATTR_S; + +/*Define vpss channel's work mode*/ +typedef enum hiVPSS_CHN_MODE_E +{ + VPSS_CHN_MODE_AUTO = 0, /*Auto mode*/ + VPSS_CHN_MODE_USER =1 /*User mode*/ +}VPSS_CHN_MODE_E; + +/*Define attributes of vpss channel's work mode*/ +typedef struct hiVPSS_CHN_MODE_S +{ + VPSS_CHN_MODE_E enChnMode; /*Vpss channel's work mode*/ + HI_U32 u32Width; /*Width of target image*/ + HI_U32 u32Height; /*Height of target image*/ + HI_BOOL bDouble; /*Field-frame transferonly valid for VPSS_PRE0_CHN*/ + PIXEL_FORMAT_E enPixelFormat;/*Pixel format of target image*/ + COMPRESS_MODE_E enCompressMode; /*Compression mode of the output*/ + +}VPSS_CHN_MODE_S; + +typedef struct hiVPSS_FRAME_TIMEOUT_S +{ + VIDEO_FRAME_INFO_S stVideoFrame; + HI_S32 s32MilliSec; +}VPSS_FRAME_TIMEOUT_S; + +typedef struct hiVPSS_GET_GRP_FRAME_S +{ + HI_U32 u32FrameIndex; /*reserved*/ + VIDEO_FRAME_INFO_S *pstVideoFrame; +}VPSS_GET_GRP_FRAME_S; + +/*Define detailed params for channel image process*/ +typedef struct hiVPSS_CHN_PARAM_S +{ + HI_U32 u32SpStrength; +} VPSS_CHN_PARAM_S; + +/*Define vpss frame control info*/ +typedef struct hiVPSS_FRAME_RATE_S +{ + HI_S32 s32SrcFrmRate; /* Input frame rate of a group*/ + HI_S32 s32DstFrmRate; /* Output frame rate of a channel group */ +} VPSS_FRAME_RATE_S; + +/*Define attributes of vpss extend channel*/ +typedef struct hiVPSS_EXT_CHN_ATTR_S +{ + VPSS_CHN s32BindChn; /*channel bind to*/ + HI_U32 u32Width; /*Width of target image*/ + HI_U32 u32Height; /*Height of target image*/ + HI_S32 s32SrcFrameRate; /*Frame rate of source*/ + HI_S32 s32DstFrameRate; /*Frame rate of extend chn input&output*/ + PIXEL_FORMAT_E enPixelFormat; /*Pixel format of target image*/ + COMPRESS_MODE_E enCompressMode; /*Compression mode of the output*/ +}VPSS_EXT_CHN_ATTR_S; + +typedef struct hiVPSS_REGION_INFO_S +{ + RECT_S *pstRegion; /*region attribute*/ + HI_U32 u32RegionNum; /*count of the region*/ +}VPSS_REGION_INFO_S; + +typedef struct hiVPSS_GET_REGION_LUMA_S +{ + VPSS_REGION_INFO_S stRegionInfo; /*Information of the region*/ + HI_U32* pu32LumaData; /*Luma data of the region*/ + HI_S32 s32MilliSec; /*time parameter.less than 0 means waiting until get the luma data, + equal to 0 means get the luma data no matter whether it can or not, + more than 0 means waiting how long the time parameter it is*/ +}VPSS_GET_REGION_LUMA_S; + + +typedef enum hiVPSS_COVER_TYPE_E +{ + VPSS_AREA_RECT = 0, + VPSS_AREA_QUAD_RANGLE, + VPSS_AREA_BUTT +} VPSS_COVER_TYPE_E; + +typedef enum hiVPSS_REF_SEL_MODE_E +{ + VPSS_REF_FROM_RFR = 0, /*reference frame from the rfr frame */ + VPSS_REF_FROM_CHN0 = 1, /*reference frame from the CHN0 */ + VPSS_REF_CLASSIC_MODE = 2, /* c00321909 ģʽ*/ + VPSS_REF_FROM_BUTT + +}VPSS_REF_SEL_MODE_E; + +typedef struct hiVPSS_LOW_DELAY_INFO_S +{ + HI_BOOL bEnable; + HI_U32 u32LineCnt; + +}VPSS_LOW_DELAY_INFO_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ +#endif /* __HI_COMM_VPSS_H__ */ + + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_common.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_common.h new file mode 100644 index 0000000..757136c --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_common.h @@ -0,0 +1,358 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_common.h +Version : Initial Draft +Author : Hi3511 MPP Team +Created : 2006/11/09 +Last Modified : +Description : The common defination +Function List : +History : + 1.Date : 2009/03/03 + Author : z44949 + Modification: Created file +2.Date : 2009/07/01 + Author : z44949 + Modification: Move MPP_VER_PRIX to hi_defines.h +3.Date : 2009/08/13 + Author : y45339 + Modification: add some proc define + +4.Date : 2010/11/03 + Author : z44949 + Modification: Remove some unnecessary typedef + +******************************************************************************/ +#ifndef __HI_COMMON_H__ +#define __HI_COMMON_H__ + +#include "hi_type.h" +#include "hi_math.h" +#include "hi_defines.h" +#include "hi_comm_video.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +#ifndef VER_X + #define VER_X 1 +#endif + +#ifndef VER_Y + #define VER_Y 0 +#endif + +#ifndef VER_Z + #define VER_Z 0 +#endif + +#ifndef VER_P + #define VER_P 0 +#endif + +#ifndef VER_B + #define VER_B 0 +#endif + +#ifdef HI_DEBUG + #define VER_D " Debug" +#else + #define VER_D " Release" +#endif + +#define __MK_VERSION(x,y,z,p,b) #x"."#y"."#z"."#p" B0"#b +#define MK_VERSION(x,y,z,p,b) __MK_VERSION(x,y,z,p,b) +#define MPP_VERSION CHIP_NAME MPP_VER_PRIX MK_VERSION(VER_X,VER_Y,VER_Z,VER_P,VER_B) VER_D + +#define VERSION_NAME_MAXLEN 64 +typedef struct hiMPP_VERSION_S +{ + HI_CHAR aVersion[VERSION_NAME_MAXLEN]; +} MPP_VERSION_S; + +typedef struct hiCROP_INFO_S +{ + HI_BOOL bEnable; + RECT_S stRect; +} CROP_INFO_S; + +typedef enum hiROTATE_E +{ + ROTATE_NONE = 0, + ROTATE_90 = 1, + ROTATE_180 = 2, + ROTATE_270 = 3, + ROTATE_BUTT +} ROTATE_E; + +typedef struct hiBORDER_S +{ + HI_U32 u32TopWidth; + HI_U32 u32BottomWidth; + HI_U32 u32LeftWidth; + HI_U32 u32RightWidth; + HI_U32 u32Color; +} BORDER_S; + +typedef HI_S32 AI_CHN; +typedef HI_S32 AO_CHN; +typedef HI_S32 AENC_CHN; +typedef HI_S32 ADEC_CHN; +typedef HI_S32 AUDIO_DEV; +typedef HI_S32 AVENC_CHN; +typedef HI_S32 VI_DEV; +typedef HI_S32 VI_WAY; +typedef HI_S32 VI_CHN; +typedef HI_S32 VO_DEV; +typedef HI_S32 VO_LAYER; +typedef HI_S32 VO_CHN; +typedef HI_S32 VO_WBC; +typedef HI_S32 GRAPHIC_LAYER; +typedef HI_S32 VENC_CHN; +typedef HI_S32 VDEC_CHN; +typedef HI_S32 VENC_GRP; +typedef HI_S32 VO_GRP; +typedef HI_S32 VDA_CHN; +typedef HI_S32 IVE_HANDLE; +typedef HI_S32 CLS_HANDLE; +typedef HI_S32 FD_CHN; +typedef HI_S32 MD_CHN; +typedef HI_S32 ISP_DEV; +typedef HI_S32 SENSOR_ID; + + + +#define HI_INVALID_CHN (-1) +#define HI_INVALID_WAY (-1) +#define HI_INVALID_LAYER (-1) +#define HI_INVALID_DEV (-1) +#define HI_INVALID_HANDLE (-1) +#define HI_INVALID_VALUE (-1) +#define HI_INVALID_TYPE (-1) + +typedef enum hiMOD_ID_E +{ + HI_ID_CMPI = 0, + HI_ID_VB = 1, + HI_ID_SYS = 2, + HI_ID_RGN = 3, + HI_ID_CHNL = 4, + HI_ID_VDEC = 5, + HI_ID_GROUP = 6, + HI_ID_VPSS = 7, + HI_ID_VENC = 8, + HI_ID_VDA = 9, + HI_ID_H264E = 10, + HI_ID_JPEGE = 11, + HI_ID_MPEG4E = 12, + HI_ID_H264D = 13, + HI_ID_JPEGD = 14, + HI_ID_VOU = 15, + HI_ID_VIU = 16, + HI_ID_DSU = 17, + HI_ID_VALG = 18, + HI_ID_RC = 19, + HI_ID_AIO = 20, + HI_ID_AI = 21, + HI_ID_AO = 22, + HI_ID_AENC = 23, + HI_ID_ADEC = 24, + HI_ID_AVENC = 25, + HI_ID_PCIV = 26, + HI_ID_PCIVFMW = 27, + HI_ID_ISP = 28, + HI_ID_IVE = 29, + + HI_ID_DCCM = 31, + HI_ID_DCCS = 32, + HI_ID_PROC = 33, + HI_ID_LOG = 34, + HI_ID_MST_LOG = 35, + HI_ID_VD = 36, + + HI_ID_VCMP = 38, + HI_ID_FB = 39, + HI_ID_HDMI = 40, + HI_ID_VOIE = 41, + HI_ID_TDE = 42, + HI_ID_USR = 43, + HI_ID_VEDU = 44, + HI_ID_VGS = 45, + HI_ID_H265E = 46, + HI_ID_FD = 47, + HI_ID_ODT = 48, //Object detection trace + HI_ID_VQA = 49, //Video quality analysis + HI_ID_LPR = 50, // License Plate Recognition + HI_ID_FISHEYE = 51, + + HI_ID_BUTT, +} MOD_ID_E; + +typedef struct hiMPP_CHN_S +{ + MOD_ID_E enModId; + HI_S32 s32DevId; + HI_S32 s32ChnId; +} MPP_CHN_S; + + +typedef enum hiPROFILE_TYPE_E +{ + PROFILE_1080P_30 = 0, + PROFILE_3M_30, + PROFILE_1080P_60, + PROFILE_5M_30, + PROFILE_BUTT, +} PROFILE_TYPE_E; + +#define MPP_MOD_VIU "vi" +#define MPP_MOD_VOU "vo" +#define MPP_MOD_HDMI "hdmi" +#define MPP_MOD_DSU "dsu" +#define MPP_MOD_VGS "vgs" +#define MPP_MOD_FISHEYE "fisheye" + +#define MPP_MOD_CHNL "chnl" +#define MPP_MOD_VENC "venc" +#define MPP_MOD_GRP "grp" +#define MPP_MOD_VDA "vda" +#define MPP_MOD_VPSS "vpss" +#define MPP_MOD_RGN "rgn" +#define MPP_MOD_IVE "ive" +#define MPP_MOD_FD "fd" + +#define MPP_MOD_H264E "h264e" +#define MPP_MOD_H265E "h265e" +#define MPP_MOD_JPEGE "jpege" +#define MPP_MOD_MPEG4E "mpeg4e" + +#define MPP_MOD_VDEC "vdec" +#define MPP_MOD_H264D "h264d" +#define MPP_MOD_JPEGD "jpegd" + +#define MPP_MOD_AI "ai" +#define MPP_MOD_AO "ao" +#define MPP_MOD_AENC "aenc" +#define MPP_MOD_ADEC "adec" +#define MPP_MOD_AIO "aio" +#define MPP_MOD_ACODEC "acodec" + +#define MPP_MOD_VB "vb" +#define MPP_MOD_SYS "sys" +#define MPP_MOD_CMPI "cmpi" + +#define MPP_MOD_PCIV "pciv" +#define MPP_MOD_PCIVFMW "pcivfmw" + +#define MPP_MOD_PROC "proc" +#define MPP_MOD_LOG "logmpp" +#define MPP_MOD_MST_LOG "mstlog" + +#define MPP_MOD_DCCM "dccm" +#define MPP_MOD_DCCS "dccs" + +#define MPP_MOD_VCMP "vcmp" +#define MPP_MOD_FB "fb" + +#define MPP_MOD_RC "rc" + +#define MPP_MOD_VOIE "voie" + +#define MPP_MOD_TDE "tde" +#define MPP_MOD_ISP "isp" +#define MPP_MOD_USR "usr" + +/* We just coyp this value of payload type from RTP/RTSP definition */ +typedef enum +{ + PT_PCMU = 0, + PT_1016 = 1, + PT_G721 = 2, + PT_GSM = 3, + PT_G723 = 4, + PT_DVI4_8K = 5, + PT_DVI4_16K = 6, + PT_LPC = 7, + PT_PCMA = 8, + PT_G722 = 9, + PT_S16BE_STEREO = 10, + PT_S16BE_MONO = 11, + PT_QCELP = 12, + PT_CN = 13, + PT_MPEGAUDIO = 14, + PT_G728 = 15, + PT_DVI4_3 = 16, + PT_DVI4_4 = 17, + PT_G729 = 18, + PT_G711A = 19, + PT_G711U = 20, + PT_G726 = 21, + PT_G729A = 22, + PT_LPCM = 23, + PT_CelB = 25, + PT_JPEG = 26, + PT_CUSM = 27, + PT_NV = 28, + PT_PICW = 29, + PT_CPV = 30, + PT_H261 = 31, + PT_MPEGVIDEO = 32, + PT_MPEG2TS = 33, + PT_H263 = 34, + PT_SPEG = 35, + PT_MPEG2VIDEO = 36, + PT_AAC = 37, + PT_WMA9STD = 38, + PT_HEAAC = 39, + PT_PCM_VOICE = 40, + PT_PCM_AUDIO = 41, + PT_AACLC = 42, + PT_MP3 = 43, + PT_ADPCMA = 49, + PT_AEC = 50, + PT_X_LD = 95, + PT_H264 = 96, + PT_D_GSM_HR = 200, + PT_D_GSM_EFR = 201, + PT_D_L8 = 202, + PT_D_RED = 203, + PT_D_VDVI = 204, + PT_D_BT656 = 220, + PT_D_H263_1998 = 221, + PT_D_MP1S = 222, + PT_D_MP2P = 223, + PT_D_BMPEG = 224, + PT_MP4VIDEO = 230, + PT_MP4AUDIO = 237, + PT_VC1 = 238, + PT_JVC_ASF = 255, + PT_D_AVI = 256, + PT_DIVX3 = 257, + PT_AVS = 258, + PT_REAL8 = 259, + PT_REAL9 = 260, + PT_VP6 = 261, + PT_VP6F = 262, + PT_VP6A = 263, + PT_SORENSON = 264, + PT_H265 = 265, + PT_MAX = 266, + /* add by hisilicon */ + PT_AMR = 1001, + PT_MJPEG = 1002, + PT_AMRWB = 1003, + PT_BUTT +} PAYLOAD_TYPE_E; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* _HI_COMMON_H_ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_debug.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_debug.h new file mode 100644 index 0000000..03a77b1 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_debug.h @@ -0,0 +1,147 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_debug.h +Version : Initial Draft +Author : Hisilicon multimedia software group +Created : 2006/12/09 +Last Modified : +Description : all struct and maro definition for debug +Function List : +History : + 1.Date : 2006/11/03 + Author : c42025 + Modification: Created file + +2.Date : 2008/03/03 + Author : c42025 + Modification: 1. mv definition LOG_ERRLEVEL_E to here form file "hi_errno.h", + but it will be obsolete in next version. + 2. add new macro definition for debug levle. + 3. change macro defintion HI_TRACE + +3.Date : 2008/03/05 + Author : c42025 + Modification: Change the definition of LOG_ERRLEVEL_E + +4.Date : 2008/10/31 + Author : z44949 + Modification: Delete the definition of LOG_ERRLEVEL_E + +5.Date : 2010/11/03 + Author : z44949 + Modification: Remove some unnecessary typedef + +******************************************************************************/ +#ifndef __HI_DEBUG_H__ +#define __HI_DEBUG_H__ + +#ifndef __KERNEL__ +#include +#endif + +#include "hi_type.h" +#include "hi_common.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#define _EX__FILE_LINE(fxx,lxx) "[File]:"fxx"\n[Line]:"#lxx"\n[Info]:" +#define EX__FILE_LINE(fxx,lxx) _EX__FILE_LINE(fxx,lxx) +#define __FILE_LINE__ EX__FILE_LINE(__FILE__, __LINE__) + +#define HI_DBG_EMERG 0 /* system is unusable */ +#define HI_DBG_ALERT 1 /* action must be taken immediately */ +#define HI_DBG_CRIT 2 /* critical conditions */ +#define HI_DBG_ERR 3 /* error conditions */ +#define HI_DBG_WARN 4 /* warning conditions */ +#define HI_DBG_NOTICE 5 /* normal but significant condition */ +#define HI_DBG_INFO 6 /* informational */ +#define HI_DBG_DEBUG 7 /* debug-level messages */ + +typedef struct hiLOG_LEVEL_CONF_S +{ + MOD_ID_E enModId; + HI_S32 s32Level; + HI_CHAR cModName[16]; +} LOG_LEVEL_CONF_S; + +#ifndef __KERNEL__ +/****************************************************************************** +** For User Mode : HI_PRINT, HI_ASSERT, HI_TRACE +******************************************************************************/ + +#define HI_PRINT printf + +/* #ifdef HI_DEBUG */ +#if 1 + /* Using samples: HI_ASSERT(x>y); */ + #define HI_ASSERT(expr) \ + do{ \ + if (!(expr)) { \ + printf("\nASSERT failed at:\n"\ + " >File name: %s\n" \ + " >Function : %s\n" \ + " >Line No. : %d\n" \ + " >Condition: %s\n", \ + __FILE__,__FUNCTION__, __LINE__, #expr);\ + _exit(-1);\ + } \ + }while(0) + + /* Using samples: + ** HI_TRACE(HI_DBG_DEBUG, HI_ID_CMPI, "Test %d, %s\n", 12, "Test"); + **/ + #define HI_TRACE(level, enModId, fmt...) fprintf(stderr,##fmt) +#else + #define HI_ASSERT(expr) + #define HI_TRACE(level, enModId, fmt...) +#endif + +#else +/****************************************************************************** +** For Linux Kernel : HI_PRINT, HI_ASSERT, HI_TRACE +******************************************************************************/ + +#define HI_PRINT printk + +extern HI_S32 HI_ChkLogLevel(HI_S32 s32Levle, MOD_ID_E enModId); +asmlinkage int HI_LOG(HI_S32 level, MOD_ID_E enModId,const char *fmt, ...); + +/* #ifdef HI_DEBUG */ +#if 1 + /* Using samples: HI_ASSERT(x>y); */ + #define HI_ASSERT(expr) \ + do{ \ + if (!(expr)) { \ + panic("\nASSERT failed at:\n" \ + " >File name: %s\n" \ + " >Function : %s\n" \ + " >Line No. : %d\n" \ + " >Condition: %s\n", \ + __FILE__,__FUNCTION__, __LINE__, #expr);\ + } \ + }while(0) + + /* Using samples: + ** HI_TRACE(HI_DBG_DEBUG, HI_ID_CMPI, "Test %d, %s\n", 12, "Test"); + **/ + #define HI_TRACE HI_LOG +#else + #define HI_ASSERT(expr) + #define HI_TRACE(level, enModId, fmt...) +#endif + +#endif /* end of __KERNEL__ */ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_DEBUG_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_defines.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_defines.h new file mode 100644 index 0000000..bdbd79b --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_defines.h @@ -0,0 +1,303 @@ +/****************************************************************************** + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_defines.h +Version : Initial Draft +Author : Hisilicon multimedia software group +Created : 2005/4/23 +Last Modified : +Description : The common data type defination +Function List : +History : +******************************************************************************/ +#ifndef __HI_DEFINES_H__ +#define __HI_DEFINES_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + + +#define HI3516A_V100 0x3516A100 +#define HI3516D_V100 0x3516D100 +#define HI3518E_V200 0x3518E200 + + +#define HI35xx_Vxxx 0x35000000 + +#ifndef HICHIP + #define HICHIP HI3518E_V200 +#endif + +#if HICHIP==HI3516A_V100 + #define CHIP_NAME "Hi3516A" + #define MPP_VER_PRIX "_MPP_V" +#elif HICHIP==HI3518E_V200 + #define CHIP_NAME "Hi3518EV200" + #define MPP_VER_PRIX "_MPP_V" +#elif HICHIP==HI35xx_Vxxx + #error HuHu, I am an dummy chip +#else + #error HICHIP define may be error +#endif + +#define LINE_LEN_BIT 5 +#define LINE_LEN (1<>= LINE_LEN_BIT; + end = addr + len*LINE_LEN; + + while(addr != end) + { + asm("mcr p15, 0, %0, c7, c6, 1"::"r"(addr)); + addr += LINE_LEN; + } + return; +} + +static inline void FlushDcache(unsigned long addr, unsigned long len) +{ + unsigned long end; + + //TODO: cacheˢҪд + return ; + + addr &= LINE_BASE_MASK; + len >>= LINE_LEN_BIT; + end = addr + len*LINE_LEN; + + while(addr != end) + { + asm("mcr p15, 0, %0, c7, c10, 1"::"r"(addr)); + addr += LINE_LEN; + } + return; +} + +#define DEFAULT_ALIGN 16 +#define MAX_MMZ_NAME_LEN 16 + +#define MAX_NODE_NUM 16 + +/* For VDA */ +#define VDA_MAX_NODE_NUM 32 +#define VDA_MAX_INTERNAL 256 +#define VDA_CHN_NUM_MAX 32 +#define VDA_MAX_WIDTH 960 +#define VDA_MAX_HEIGHT 960 +#define VDA_MIN_WIDTH 32 +#define VDA_MIN_HEIGHT 32 + +/* For VENC */ +#define VENC_MAX_NAME_LEN 16 +#define VENC_MAX_CHN_NUM 16 +#define VENC_MAX_GRP_NUM 16 +#define H264E_MAX_WIDTH 1920 +#define H264E_MAX_HEIGHT 1920 +#define H264E_MIN_WIDTH 160 +#define H264E_MIN_HEIGHT 64 +#define H265E_MAX_WIDTH 2592 +#define H265E_MAX_HEIGHT 2592 +#define H265E_MIN_WIDTH 128 +#define H265E_MIN_HEIGHT 128 +#define JPEGE_MAX_WIDTH 8192 +#define JPEGE_MAX_HEIGHT 8192 +#define JPEGE_MIN_WIDTH 64 +#define JPEGE_MIN_HEIGHT 64 +#define VENC_MAX_ROI_NUM 8 /* ֧8ROI */ +#define H264E_MIN_HW_INDEX 0 +#define H264E_MAX_HW_INDEX 11 +#define H264E_MIN_VW_INDEX 0 +#define H264E_MAX_VW_INDEX 3 + + + + +/* For RC */ +#define RC_TEXTURE_THR_SIZE 12 +#define RC_RQRATIO_SIZE 8 + + +/* For VDEC, hi3516a not support */ +#define VDEC_MAX_CHN_NUM 0 + +/* For Region */ +/* For Region */ +#define RGN_MIN_WIDTH 2 +#define RGN_MIN_HEIGHT 2 +#define RGN_MAX_WIDTH 2592 +#define RGN_MAX_HEIGHT 2592 +#define RGN_ALIGN 2 + +#define RGN_HANDLE_MAX 1024 + +#define COVER_MAX_NUM_VI 0 +#define COVEREX_MAX_NUM_VI 16 +#define OVERLAY_MAX_NUM_VI 0 +#define OVERLAYEX_MAX_NUM_VI 16 + +#define OVERLAY_MAX_NUM_VENC 8 + +#define COVER_MAX_NUM_VPSS 8 +#define COVEREX_MAX_NUM_VPSS 8 +#define OVERLAY_MAX_NUM_VPSS 1 +#define OVERLAYEX_MAX_NUM_VPSS 8 + +#define OVERLAYEX_MAX_NUM_VGS 1 +#define COVER_MAX_NUM_VGS 1 + + +#define COVEREX_MAX_NUM_VO 1 +#define OVERLAYEX_MAX_NUM_VO 1 + +#define OVERLAYEX_MAX_NUM_PCIV 0 + +/* number of channle and device on video input unit of chip + * Note! VIU_MAX_CHN_NUM is NOT equal to VIU_MAX_DEV_NUM + * multiplied by VIU_MAX_CHN_NUM, because all VI devices + * can't work at mode of 4 channles at the same time. + */ +#define VIU_MAX_DEV_NUM 1 +#define VIU_MAX_WAY_NUM_PER_DEV 1 +#define VIU_MAX_CHN_NUM_PER_DEV 1 +#define VIU_MAX_PHYCHN_NUM 1 +#define VIU_MAX_RAWCHN_NUM 1 /* raw data chn, DVR/NVR: 0 */ +#define VIU_EXT_CHN_START VIU_MAX_PHYCHN_NUM +#define VIU_MAX_EXT_CHN_NUM 16 +#define VIU_MAX_EXTCHN_BIND_PER_CHN 8 + +#define VIU_MAX_CHN_NUM (VIU_MAX_PHYCHN_NUM + VIU_MAX_EXT_CHN_NUM) +#define VIU_MAX_UFLIST_NUM (VIU_MAX_CHN_NUM + VIU_MAX_RAWCHN_NUM) + +#define VIU_CHNID_DEV_FACTOR 2 + +/* 3516aּ֧궨ЩϢֻΪ˱ͨ */ +#define VIU_MAX_CAS_CHN_NUM 2 +#define VIU_SUB_CHN_START 16 /* ͨʼ*/ +#define VIU_CAS_CHN_START 32 /* 弶ͨʼ*/ + +/* max number of VBI region*/ +#define VIU_MAX_VBI_NUM 2 +/* max length of one VBI region (by word) */ +#define VIU_MAX_VBI_LEN 8 + +#define VO_MIN_CHN_WIDTH 32 /* channel minimal width */ +#define VO_MIN_CHN_HEIGHT 32 /* channel minimal height */ + +#define VO_MAX_ZOOM_RATIO 1000 /* max zoom ratio, 1000 means 100% scale */ + +#define VO_MAX_DEV_NUM 1 /* max dev num */ +#define VO_MAX_LAYER_NUM 1 /* max layer num */ +#define PIP_MAX_CHN_NUM 8 +#define VHD_MAX_CHN_NUM 8 /* max VHD chn num */ +#define VO_MAX_CHN_NUM VHD_MAX_CHN_NUM /* max chn num */ +#define VO_MAX_LAYER_IN_DEV 1 /* max layer num of each dev */ +#define VO_MIN_CHN_LINE 2 + + +#define VO_MAX_GFX_LAYER_PER_DEV 1 +#define VO_MAX_GRAPHICS_LAYER_NUM 1 +#define MDDRC_ZONE_MAX_NUM 32 + +#define VO_MAX_PRIORITY 2 +#define VO_MIN_TOLERATE 1 /* min play toleration 1ms */ +#define VO_MAX_TOLERATE 100000 /* max play toleration 100s */ + +#define AI_DEV_MAX_NUM 1 +#define AO_DEV_MIN_NUM 0 +#define AO_DEV_MAX_NUM 1 +#define AIO_MAX_NUM 1 +#define AIO_MAX_CHN_NUM 16 +#define AENC_MAX_CHN_NUM 32 +#define ADEC_MAX_CHN_NUM 32 + +/* For VPSS */ +#define VPSS_MAX_GRP_NUM 32 + +#define VPSS_MAX_PHY_CHN_NUM 4 +#define VPSS_MAX_EXT_CHN_NUM 8 +#define VPSS_MAX_CHN_NUM (VPSS_MAX_PHY_CHN_NUM + VPSS_MAX_EXT_CHN_NUM) + +/* For pciv, hi3516a not support */ +#define PCIV_MAX_CHN_NUM 0 /* max pciv channel number in each pciv device */ + + +/* VB size calculate for compressed frame. + [param input] + w: width + h: height + fmt: pixel format, 0: SP420, 1: SP422 + z: compress mode, 0: no compress, 1: default compress + [param output] + size: vb blk size + */ +#define VB_W_ALIGN 16 +#define VB_H_ALIGN 2 +#define VB_HEADER_STRIDE 16 +#define VB_ALIGN(x, a) ((a) * (((x) + (a) - 1) / (a))) + +#define VB_PIC_Y_HEADER_SIZE(Width, Height, size)\ + do{\ + size = VB_HEADER_STRIDE * (Height);\ + }while(0) + +#define VB_PIC_HEADER_SIZE(Width, Height, Type, size)\ + do{\ + if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == Type || PIXEL_FORMAT_RGB_BAYER == Type )\ + {\ + size = VB_HEADER_STRIDE * (Height) * 2;\ + }\ + else if(PIXEL_FORMAT_YUV_SEMIPLANAR_420 == Type)\ + {\ + size = (VB_HEADER_STRIDE * (Height) * 3) >> 1;\ + }\ + else if(PIXEL_FORMAT_SINGLE == Type)\ + {\ + size = VB_HEADER_STRIDE * (Height);\ + }\ + }while(0) + +#define VB_PIC_BLK_SIZE(Width, Height, Type, size)\ + do{\ + unsigned int u32AlignWidth;\ + unsigned int u32AlignHeight;\ + unsigned int u32HeadSize;\ + u32AlignWidth = VB_ALIGN(Width, 16);\ + u32AlignHeight= VB_ALIGN(Height, 2);\ + u32HeadSize = VB_HEADER_STRIDE * u32AlignHeight;/* compress header stride 16 */\ + if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == Type)\ + {\ + size = (u32AlignWidth * u32AlignHeight + u32HeadSize) * 2;\ + }\ + else if (PIXEL_FORMAT_SINGLE == Type)\ + {\ + size = (u32AlignWidth * u32AlignHeight + u32HeadSize);\ + }\ + else\ + {\ + size = ((u32AlignWidth * u32AlignHeight + u32HeadSize) * 3) >> 1;\ + }\ + }while(0) + +#define VIU_GET_RAW_CHN(ViDev, RawChn)\ + do{\ + RawChn = VIU_MAX_CHN_NUM + ViDev;\ + }while(0) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_DEFINES_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_errno.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_errno.h new file mode 100644 index 0000000..8ab3aa0 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_errno.h @@ -0,0 +1,131 @@ +/****************************************************************************** +Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. +****************************************************************************** +File Name : hi_common.h +Version : Initial Draft +Author : Hi3511 MPP Team +Created : 2006/11/09 +Last Modified : +Description : define the format of error code +Function List : +History : + 1.Date : 2007/02/14 + Author : c42025 + Modification: Created file + + 2.Date : 2007/12/11 + Author : c42025 + Modification: add some MOD_ID for several modules + + 3.Date : 2008/02/03 + Author : c42025 + Modification: reoorder MOD_ID to cleanup modules at specified order + + 4.Date : 2008/03/01 + Author : c42025 + Modification: move LOG_ERRLEVEL_E to hi_debug.h, and add new definion + ERR_LEVLE_E, we should use this enumeration in our error code. + + 5.Date : 2008/04/30 + Author : c42025 + Modification: delete two error code "EN_ERR_NOCHN" and "EN_ERR_NODEV". + +******************************************************************************/ +#ifndef __HI_ERRNO_H__ +#define __HI_ERRNO_H__ + +#include "hi_debug.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +/* 1010 0000b + * VTOP use APPID from 0~31 + * so, hisilicon use APPID based on 32 + */ +#define HI_ERR_APPID (0x80000000L + 0x20000000L) + +typedef enum hiERR_LEVEL_E +{ + EN_ERR_LEVEL_DEBUG = 0, /* debug-level */ + EN_ERR_LEVEL_INFO, /* informational */ + EN_ERR_LEVEL_NOTICE, /* normal but significant condition */ + EN_ERR_LEVEL_WARNING, /* warning conditions */ + EN_ERR_LEVEL_ERROR, /* error conditions */ + EN_ERR_LEVEL_CRIT, /* critical conditions */ + EN_ERR_LEVEL_ALERT, /* action must be taken immediately */ + EN_ERR_LEVEL_FATAL, /* just for compatibility with previous version */ + EN_ERR_LEVEL_BUTT +}ERR_LEVEL_E; + + +/****************************************************************************** +|----------------------------------------------------------------| +| 1 | APP_ID | MOD_ID | ERR_LEVEL | ERR_ID | +|----------------------------------------------------------------| +|<--><--7bits----><----8bits---><--3bits---><------13bits------->| +******************************************************************************/ + +#define HI_DEF_ERR( module, level, errid) \ + ((HI_S32)( (HI_ERR_APPID) | ((module) << 16 ) | ((level)<<13) | (errid) )) + +/* NOTE! the following defined all common error code, +** all module must reserved 0~63 for their common error code +*/ +typedef enum hiEN_ERR_CODE_E +{ + EN_ERR_INVALID_DEVID = 1, /* invlalid device ID */ + EN_ERR_INVALID_CHNID = 2, /* invlalid channel ID */ + EN_ERR_ILLEGAL_PARAM = 3, /* at lease one parameter is illagal + * eg, an illegal enumeration value */ + EN_ERR_EXIST = 4, /* resource exists */ + EN_ERR_UNEXIST = 5, /* resource unexists */ + + EN_ERR_NULL_PTR = 6, /* using a NULL point */ + + EN_ERR_NOT_CONFIG = 7, /* try to enable or initialize system, device + ** or channel, before configing attribute */ + + EN_ERR_NOT_SUPPORT = 8, /* operation or type is not supported by NOW */ + EN_ERR_NOT_PERM = 9, /* operation is not permitted + ** eg, try to change static attribute */ + + EN_ERR_NOMEM = 12,/* failure caused by malloc memory */ + EN_ERR_NOBUF = 13,/* failure caused by malloc buffer */ + + EN_ERR_BUF_EMPTY = 14,/* no data in buffer */ + EN_ERR_BUF_FULL = 15,/* no buffer for new data */ + + EN_ERR_SYS_NOTREADY = 16,/* System is not ready,maybe not initialed or + ** loaded. Returning the error code when opening + ** a device file failed. */ + + EN_ERR_BADADDR = 17,/* bad address, + ** eg. used for copy_from_user & copy_to_user */ + + EN_ERR_BUSY = 18,/* resource is busy, + ** eg. destroy a venc chn without unregister it */ + + EN_ERR_BUTT = 63,/* maxium code, private error code of all modules + ** must be greater than it */ +}EN_ERR_CODE_E; + + +/* +** following is an example for defining error code of VDA module +** #define HI_ERR_MD_INVALID_CHNID HI_DEF_ERR(HI_ID_VDA, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) +** +*/ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __HI_ERRNO_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_i2c.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_i2c.h new file mode 100644 index 0000000..a7def0e --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_i2c.h @@ -0,0 +1,43 @@ +#ifndef _HI_I2C_H +#define _HI_I2C_H + + + +/* /dev/i2c-X ioctl commands. The ioctl's parameter is always an + * unsigned long, except for: + * - I2C_FUNCS, takes pointer to an unsigned long + * - I2C_RDWR, takes pointer to struct i2c_rdwr_ioctl_data + * - I2C_SMBUS, takes pointer to struct i2c_smbus_ioctl_data + */ +#define I2C_RETRIES 0x0701 /* number of times a device address should + be polled when not acknowledging */ +#define I2C_TIMEOUT 0x0702 /* set timeout in units of 10 ms */ + +/* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses + * are NOT supported! (due to code brokenness) + */ +#define I2C_SLAVE 0x0703 /* Use this slave address */ +#define I2C_SLAVE_FORCE 0x0706 /* Use this slave address, even if it + is already in use by a driver! */ +#define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */ + +#define I2C_FUNCS 0x0705 /* Get the adapter functionality mask */ + +#define I2C_RDWR 0x0707 /* Combined R/W transfer (one STOP only) */ + +#define I2C_PEC 0x0708 /* != 0 to use PEC with SMBus */ +#define I2C_SMBUS 0x0720 /* SMBus transfer */ +#define I2C_16BIT_REG 0x0709 /* 16BIT REG WIDTH */ +#define I2C_16BIT_DATA 0x070a /* 16BIT DATA WIDTH */ + +typedef struct hiI2C_DATA_S +{ + unsigned char dev_addr; + unsigned int reg_addr; + unsigned int addr_byte_num; + unsigned int data; + unsigned int data_byte_num; +}I2C_DATA_S; + +#endif + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_io.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_io.h new file mode 100644 index 0000000..c5e6e68 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_io.h @@ -0,0 +1,78 @@ +#ifndef __HI_IO_H__ +#define __HI_IO_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* user and kernel are different. */ +HI_U8 IO_READ8(HI_U32 u32Addr); +HI_S32 IO_WRITE8(HI_U32 u32Addr, HI_U32 u32Value); +HI_U16 IO_READ16(HI_U32 u32Addr); +HI_S32 IO_WRITE16(HI_U32 u32Addr, HI_U32 u32Value); +HI_U32 IO_READ32(HI_U32 u32Addr); +HI_S32 IO_WRITE32(HI_U32 u32Addr, HI_U32 u32Value); +HI_U32 ISP_Mmap(void); +HI_U32 ISP_Munmap(void); +HI_U32 ISP_GetExtRegAddr(void); +//HI_VOID HI_RegSetBitEx(unsigned long value, unsigned long offset, +// unsigned long length, unsigned long addr); +//HI_VOID HI_RegRead(unsigned long *pvalue, unsigned long addr); + +static __inline HI_VOID HI_RegWrite32(unsigned long value, unsigned long mask, + HI_U32 addr) +{ + unsigned long t; + + t = readl(addr); + t &= ~mask; + t |= value & mask; + writel(t, addr); +} + +static __inline HI_VOID HI_RegSetBitEx(unsigned long value, unsigned long offset, + unsigned long length, unsigned long addr) +{ + unsigned long mask; + mask = ((1 << length) - 1) << offset; + value = value << offset; + HI_RegWrite32(value, mask, addr); +} + +static __inline HI_VOID HI_RegRead(unsigned long *pvalue, unsigned long addr) +{ + *pvalue = readl(addr); +} + +#define REG_ACCESS_WIDTH 0 // 1: 16bit 2: 8bit +#define EXT_REG_BASE 0x10200 +#define ISP_REG_BASE_ADDR 0x205a0000 + +#define EXT_REG_BASE_ISP 0x8000 +#define EXT_REG_BASE_VIU 0x8400 +#define EXT_REG_BASE_VPP 0x8600 +#define EXT_REG_BASE_VEDU 0x8800 +#define EXT_REG_BASE_VOU 0x8A00 + +/* Dynamic bus access functions, 4 byte align access */ +//TODO: allocate dev addr (such as ISP_REG_BASE_ADDR) according to devId. +#define __IO_CALC_ADDRESS_DYNAMIC(BASE, OFFSET) ((HI_U32)(((BASE >= EXT_REG_BASE)? 0 : ISP_REG_BASE_ADDR) + ((((BASE >= EXT_REG_BASE)? (BASE - EXT_REG_BASE) : BASE) + OFFSET)< lowThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_TRUNC = 0x1, /*srcVal <= lowThr, dstVal = srcVal; srcVal > lowThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_TO_MINVAL = 0x2, /*srcVal <= lowThr, dstVal = minVal; srcVal > lowThr, dstVal = srcVal.*/ + + IVE_THRESH_MODE_MIN_MID_MAX = 0x3, /*srcVal <= lowThr, dstVal = minVal; lowThr < srcVal <= highThr, dstVal = midVal; srcVal > highThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_ORI_MID_MAX = 0x4, /*srcVal <= lowThr, dstVal = srcVal; lowThr < srcVal <= highThr, dstVal = midVal; srcVal > highThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_MIN_MID_ORI = 0x5, /*srcVal <= lowThr, dstVal = minVal; lowThr < srcVal <= highThr, dstVal = midVal; srcVal > highThr, dstVal = srcVal.*/ + IVE_THRESH_MODE_MIN_ORI_MAX = 0x6, /*srcVal <= lowThr, dstVal = minVal; lowThr < srcVal <= highThr, dstVal = srcVal; srcVal > highThr, dstVal = maxVal.*/ + IVE_THRESH_MODE_ORI_MID_ORI = 0x7, /*srcVal <= lowThr, dstVal = srcVal; lowThr < srcVal <= highThr, dstVal = midVal; srcVal > highThr, dstVal = srcVal.*/ + + IVE_THRESH_MODE_BUTT +}IVE_THRESH_MODE_E; + +/* +* Thresh control parameters. +* Modified by Tan Bing, 2013-7-22 +*/ +typedef struct hiIVE_THRESH_CTRL_S +{ + IVE_THRESH_MODE_E enMode; + HI_U8 u8LowThr; /*user-defined threshold, 0<=u8LowThr<=255 */ + HI_U8 u8HighThr; /*user-defined threshold, if enMode0' and 'label = ArrayIndex+1'*/ +}IVE_CCBLOB_S; + +/* +*CCL control struct +*/ +typedef struct hiIVE_CCL_CTRL_S +{ + HI_U16 u16InitAreaThr; /*Init threshold of region area*/ + HI_U16 u16Step; /*Increase area step for once*/ +}IVE_CCL_CTRL_S; + +/* +*GMM control struct +*/ +typedef struct hiIVE_GMM_CTRL_S +{ + HI_U22Q10 u22q10NoiseVar; /*Initial noise Variance*/ + HI_U22Q10 u22q10MaxVar; /*Max Variance*/ + HI_U22Q10 u22q10MinVar; /*Min Variance*/ + HI_U0Q16 u0q16LearnRate; /*Learning rate*/ + HI_U0Q16 u0q16BgRatio; /*Background ratio*/ + HI_U8Q8 u8q8VarThr; /*Variance Threshold*/ + HI_U0Q16 u0q16InitWeight; /*Initial Weight*/ + HI_U8 u8ModelNum; /*Model number: 3 or 5*/ +}IVE_GMM_CTRL_S; + +/* +*CannyHysEdge control struct +*/ +typedef struct hiIVE_CANNY_HYS_EDGE_CTRL_S +{ + IVE_MEM_INFO_S stMem; + HI_U16 u16LowThr; + HI_U16 u16HighThr; + HI_S8 as8Mask[25]; +} IVE_CANNY_HYS_EDGE_CTRL_S; + +/* +*Canny stack size struct +*/ +typedef struct hiIVE_CANNY_STACK_SIZE_S +{ + HI_U32 u32StackSize; /*Stack size for output*/ + HI_U8 u8Reserved[12]; /*For 16 byte align*/ +}IVE_CANNY_STACK_SIZE_S; + +/* +*LBP compare mode +*/ +typedef enum hiIVE_LBP_CMP_MODE_E +{ + IVE_LBP_CMP_MODE_NORMAL = 0x0, /* P(x)-P(center)>= un8BitThr.s8Val, s(x)=1; else s(x)=0; */ + IVE_LBP_CMP_MODE_ABS = 0x1, /* Abs(P(x)-P(center))>=un8BitThr.u8Val, s(x)=1; else s(x)=0; */ + + IVE_LBP_CMP_MODE_BUTT +}IVE_LBP_CMP_MODE_E; + +/* +*LBP control struct +*/ +typedef struct hiIVE_LBP_CTRL_S +{ + IVE_LBP_CMP_MODE_E enMode; + IVE_8BIT_U un8BitThr; +}IVE_LBP_CTRL_S; + +/* +*Type of the GradientFilter output format +*/ +typedef enum hiIVE_NORM_GRAD_OUT_CTRL_E +{ + IVE_NORM_GRAD_OUT_CTRL_HOR_AND_VER = 0x0, + IVE_NORM_GRAD_OUT_CTRL_HOR = 0x1, + IVE_NORM_GRAD_OUT_CTRL_VER = 0x2, + IVE_NORM_GRAD_OUT_CTRL_COMBINE = 0x3, + + IVE_NORM_GRAD_OUT_CTRL_BUTT +}IVE_NORM_GRAD_OUT_CTRL_E; + +/* +*GradientFilter control parameters +*/ +typedef struct hiIVE_NORM_GRAD_CTRL_S +{ + IVE_NORM_GRAD_OUT_CTRL_E enOutCtrl; + HI_S8 as8Mask[25]; + HI_U8 u8Norm; +}IVE_NORM_GRAD_CTRL_S; + +/* +* LKOpticalFlow movement +*/ +typedef struct hiIVE_MV_S9Q7_S +{ + HI_S32 s32Status; /*Result of tracking: 0-success; -1-failure*/ + HI_S9Q7 s9q7Dx; /*X-direction component of the movement*/ + HI_S9Q7 s9q7Dy; /*Y-direction component of the movement*/ +}IVE_MV_S9Q7_S; + +typedef struct hiIVE_LK_OPTICAL_FLOW_CTRL_S +{ + HI_U16 u16CornerNum; /*Number of the feature points,<200*/ + HI_U0Q8 u0q8MinEigThr; /*Minimum eigenvalue threshold*/ + HI_U8 u8IterCount; /*Maximum iteration times*/ + HI_U0Q8 u0q8Epsilon; /*Threshold of iteration for dx^2 + dy^2 < u0q8Epsilon */ +}IVE_LK_OPTICAL_FLOW_CTRL_S; + +typedef struct hiIVE_ST_MAX_EIG_S +{ + HI_U16 u16MaxEig; /*Shi-Tomasi second step output MaxEig*/ + HI_U8 u8Reserved[14]; /*For 16 byte align*/ +}IVE_ST_MAX_EIG_S; + +/* +*ShiTomasi control parameters +*/ +typedef struct hiIVE_ST_CANDI_CORNER_CTRL_S +{ + IVE_MEM_INFO_S stMem; + HI_U0Q8 u0q8QualityLevel; +}IVE_ST_CANDI_CORNER_CTRL_S; + +typedef struct hiIVE_ST_CORNER_INFO_S +{ + HI_U16 u16CornerNum; + IVE_POINT_U16_S astCorner[IVE_ST_MAX_CORNER_NUM]; +}IVE_ST_CORNER_INFO_S; + +typedef struct hiIVE_ST_CORNER_CTRL_S +{ + HI_U16 u16MaxCornerNum; + HI_U16 u16MinDist; +}IVE_ST_CORNER_CTRL_S; + +/* +* GradFg mode enum +*/ +typedef enum hiIVE_GRAD_FG_MODE_E +{ + IVE_GRAD_FG_MODE_USE_CUR_GRAD = 0x0, + IVE_GRAD_FG_MODE_FIND_MIN_GRAD = 0x1, + + IVE_GRAD_FG_MODE_BUTT +}IVE_GRAD_FG_MODE_E; + +/* +* GradFg ctrl struct +*/ +typedef struct hiIVE_GRAD_FG_CTRL_S +{ + IVE_GRAD_FG_MODE_E enMode; /*Calculation mode*/ + HI_U16 u16EdwFactor; /*Edge width adjustment factor (range: 500 to 2000; default: 1000)*/ + HI_U8 u8CrlCoefThr; /*Gradient vector correlation coefficient threshold (ranges: 50 to 100; default: 80)*/ + HI_U8 u8MagCrlThr; /*Gradient amplitude threshold (range: 0 to 20; default: 4)*/ + HI_U8 u8MinMagDiff; /*Gradient magnitude difference threshold (range: 2 to 8; default: 2)*/ + HI_U8 u8NoiseVal; /*Gradient amplitude noise threshold (range: 1 to 8; default: 1)*/ + HI_U8 u8EdwDark; /*Black pixels enable flag (range: 0 (no), 1 (yes); default: 1)*/ +}IVE_GRAD_FG_CTRL_S; + +typedef struct hiIVE_CANDI_BG_PIX_S +{ + HI_U8Q4F4 u8q4f4Mean; /*Candidate background grays value */ + HI_U16 u16StartTime; /*Candidate Background start time */ + HI_U16 u16SumAccessTime; /*Candidate Background cumulative access time */ + HI_U16 u16ShortKeepTime; /*Candidate background short hold time*/ + HI_U8 u8ChgCond; /*Time condition for candidate background into the changing state*/ + HI_U8 u8PotenBgLife; /*Potential background cumulative access time */ +}IVE_CANDI_BG_PIX_S; + +typedef struct hiIVE_WORK_BG_PIX_S +{ + HI_U8Q4F4 u8q4f4Mean; /*0# background grays value */ + HI_U16 u16AccTime; /*Background cumulative access time */ + HI_U8 u8PreGray; /*Gray value of last pixel */ + HI_U5Q3 u5q3DiffThr; /*Differential threshold */ + HI_U8 u8AccFlag; /*Background access flag */ + HI_U8 u8BgGray[3]; /*1# ~ 3# background grays value */ +}IVE_WORK_BG_PIX_S; + +typedef struct hiIVE_BG_LIFE_S +{ + HI_U8 u8WorkBgLife[3]; /*1# ~ 3# background vitality */ + HI_U8 u8CandiBgLife; /*Candidate background vitality */ +}IVE_BG_LIFE_S; + +typedef struct hiIVE_BG_MODEL_PIX_S +{ + IVE_WORK_BG_PIX_S stWorkBgPixel; /*Working background */ + IVE_CANDI_BG_PIX_S stCandiPixel; /*Candidate background */ + IVE_BG_LIFE_S stBgLife; /*Background vitality */ +}IVE_BG_MODEL_PIX_S; + +typedef struct hiIVE_FG_STAT_DATA_S +{ + HI_U32 u32PixNum; + HI_U32 u32SumLum; + HI_U8 u8Reserved[8]; +}IVE_FG_STAT_DATA_S; + +typedef struct hiIVE_BG_STAT_DATA_S +{ + HI_U32 u32PixNum; + HI_U32 u32SumLum; + HI_U8 u8Reserved[8]; +}IVE_BG_STAT_DATA_S; + +typedef struct hiIVE_MATCH_BG_MODEL_CTRL_S +{ + HI_U32 u32CurFrmNum; /*Current frame timestamp, in frame units */ + HI_U32 u32PreFrmNum; /*Previous frame timestamp, in frame units */ + HI_U16 u16TimeThr; /*Potential background replacement time threshold (range: 2 to 100 frames; default: 20) */ + + HI_U8 u8DiffThrCrlCoef; /*Correlation coefficients between differential threshold and gray value (range: 0 to 5; default: 0) */ + HI_U8 u8DiffMaxThr; /*Maximum of background differential threshold (range: 3 to 15; default: 6) */ + HI_U8 u8DiffMinThr; /*Minimum of background differential threshold (range: 3 to 15; default: 4) */ + HI_U8 u8DiffThrInc; /*Dynamic Background differential threshold increment (range: 0 to 6; default: 0) */ + HI_U8 u8FastLearnRate; /*Quick background learning rate (range: 0 to 4; default: 2) */ + HI_U8 u8DetChgRegion; /*Whether to detect change region (range: 0 (no), 1 (yes); default: 0) */ +}IVE_MATCH_BG_MODEL_CTRL_S; + +typedef struct hiIVE_UPDATE_BG_MODEL_CTRL_S +{ + HI_U32 u32CurFrmNum; /*Current frame timestamp, in frame units */ + HI_U32 u32PreChkTime; /*The last time when background status is checked */ + HI_U32 u32FrmChkPeriod; /*Background status checking period (range: 0 to 2000 frames; default: 50) */ + + HI_U32 u32InitMinTime; /*Background initialization shortest time (range: 20 to 6000 frames; default: 100)*/ + HI_U32 u32StyBgMinBlendTime; /*Steady background integration shortest time (range: 20 to 6000 frames; default: 200)*/ + HI_U32 u32StyBgMaxBlendTime; /*Steady background integration longest time (range: 20 to 40000 frames; default: 1500)*/ + HI_U32 u32DynBgMinBlendTime; /*Dynamic background integration shortest time (range: 0 to 6000 frames; default: 0)*/ + HI_U32 u32StaticDetMinTime; /*Still detection shortest time (range: 20 to 6000 frames; default: 80)*/ + HI_U16 u16FgMaxFadeTime; /*Foreground disappearing longest time (range: 1 to 255 seconds; default: 15)*/ + HI_U16 u16BgMaxFadeTime; /*Background disappearing longest time (range: 1 to 255 seconds ; default: 60)*/ + + HI_U8 u8StyBgAccTimeRateThr; /*Steady background access time ratio threshold (range: 10 to 100; default: 80)*/ + HI_U8 u8ChgBgAccTimeRateThr; /*Change background access time ratio threshold (range: 10 to 100; default: 60)*/ + HI_U8 u8DynBgAccTimeThr; /*Dynamic background access time ratio threshold (range: 0 to 50; default: 0)*/ + HI_U8 u8DynBgDepth; /*Dynamic background depth (range: 0 to 3; default: 3)*/ + HI_U8 u8BgEffStaRateThr; /*Background state time ratio threshold when initializing (range: 90 to 100; default: 90)*/ + + HI_U8 u8AcceBgLearn; /*Whether to accelerate background learning (range: 0 (no), 1 (yes); default: 0)*/ + HI_U8 u8DetChgRegion; /*Whether to detect change region (range: 0 (no), 1 (yes); default: 0)*/ +} IVE_UPDATE_BG_MODEL_CTRL_S; + + +typedef enum hiIVE_ANN_MLP_ACTIV_FUNC_E +{ + IVE_ANN_MLP_ACTIV_FUNC_IDENTITY = 0x0, + IVE_ANN_MLP_ACTIV_FUNC_SIGMOID_SYM = 0x1, + IVE_ANN_MLP_ACTIV_FUNC_GAUSSIAN = 0x2, + + IVE_ANN_MLP_ACTIV_FUNC_BUTT +}IVE_ANN_MLP_ACTIV_FUNC_E; + +typedef struct hiIVE_ANN_MLP_MODEL_S +{ + IVE_ANN_MLP_ACTIV_FUNC_E enActivFunc; + IVE_MEM_INFO_S stWeight; + HI_U32 u32TotalWeightSize; + + HI_U16 au16LayerCount[8]; /*8 layers, including input and output layer, every layerCount<=256*/ + HI_U16 u16MaxCount; /*MaxCount<=256*/ + HI_U8 u8LayerNum; /*2 u16Thr, dstVal = maxVal.*/ + HI_U8 u8MinVal; /*Min value*/ + HI_U8 u8MaxVal; /*Max value*/ +}IVE_SAD_CTRL_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif +#endif/*_HI_IVE_H_*/ \ No newline at end of file diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_math.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_math.h new file mode 100644 index 0000000..2b3e3a7 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_math.h @@ -0,0 +1,292 @@ +/****************************************************************************** + + Copyright (C), 2009-2019, Huawei Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_math.h + Version : Initial Draft + Author : c55300 + Created : 2009/04/09 + Last Modified : + Description : mathematical functions. + Function List : + History : + 1.Date : 2009/04/09 + Author : c55300 + Modification: Created file + + 2.Date : 2009/05/04 + Author : c55300 + Modification: Add ENDIAN and VALUE_BETWEEN. + + 3.Date : 2009/05/21 + Author : c55300 + Modification: Add macro of FRACTION operation and CMP. + +******************************************************************************/ +#ifndef __HI_MATH_H__ +#define __HI_MATH_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/****************************************************************************** +** ABS(x) absolute value of x +** SIGN(x) sign of x +** CMP(x,y) 0 if x==y; 1 if x>y; -1 if x= 0 ? (x) : (-(x)) ) +#define SIGN(x) ( (x) >= 0 ? 1 : -1 ) +#define CMP(x,y) (((x) == (y)) ? 0 : (((x) > (y)) ? 1 : -1)) + +/****************************************************************************** +** MAX2(x,y) maximum of x and y +** MIN2(x,y) minimum of x and y +** MAX3(x,y,z) maximum of x, y and z +** MIN3(x,y,z) minimun of x, y and z +** MEDIAN(x,y,z) median of x,y,z +** MEAN2(x,y) mean of x,y +******************************************************************************/ +#define MAX2(x,y) ( (x)>(y) ? (x):(y) ) +#define MIN2(x,y) ( (x)<(y) ? (x):(y) ) +#define MAX3(x,y,z) ( (x)>(y) ? MAX2(x,z) : MAX2(y,z) ) +#define MIN3(x,y,z) ( (x)<(y) ? MIN2(x,z) : MIN2(y,z) ) +#define MEDIAN(x,y,z) (((x)+(y)+(z) - MAX3(x,y,z)) - MIN3(x,y,z) ) +#define MEAN2(x,y) (((x)+(y)) >> 1 ) + +/****************************************************************************** +** CLIP3(x,min,max) clip x within [min,max] +** WRAP_MAX(x,max,min) wrap to min if x equal max +** WRAP_MIN(x,min,max) wrap to max if x equal min +** VALUE_BETWEEN(x,min.max) True if x is between [min,max] inclusively. +******************************************************************************/ +#define CLIP3(x,min,max) ( (x)< (min) ? (min) : ((x)>(max)?(max):(x)) ) +#define WRAP_MAX(x,max,min) ( (x)>=(max) ? (min) : (x) ) +#define WRAP_MIN(x,min,max) ( (x)<=(min) ? (max) : (x) ) +#define VALUE_BETWEEN(x,min,max) (((x)>=(min)) && ((x) <= (max))) + +/****************************************************************************** +** MULTI_OF_2_POWER(x,a) whether x is multiple of a(a must be power of 2) +** CEILING_2_POWER(x,a) ceiling x to multiple of a(a must be power of 2) +** FLOOR_2_POWER(x,a) floor x to multiple of a(a must be power of 2) +** HIALIGN(x, a) align x to multiple of a +** +** Example: +** CEILING_2_POWER(5,4) = 8 +** FLOOR_2_POWER(5,4) = 4 +******************************************************************************/ +#define MULTI_OF_2_POWER(x,a) (!((x) & ((a) - 1) ) ) +#define CEILING_2_POWER(x,a) ( ((x) + ((a) - 1) ) & ( ~((a) - 1) ) ) +#define FLOOR_2_POWER(x,a) ( (x) & (~((a) - 1) ) ) +#define HIALIGN(x, a) ((a) * (((x) + (a) - 1) / (a))) +#define HICEILING(x, a) (((x)+(a)-1)/(a)) + +/****************************************************************************** +** Get the span between two unsinged number, such as +** SPAN(HI_U32, 100, 200) is 200 - 100 = 100 +** SPAN(HI_U32, 200, 100) is 0xFFFFFFFF - 200 + 100 +** SPAN(HI_U64, 200, 100) is 0xFFFFFFFFFFFFFFFF - 200 + 100 +******************************************************************************/ +#define SPAN(type, begin, end)\ +({ \ + type b = (begin); \ + type e = (end); \ + (type)((b >= e) ? (b - e) : (b + ((~((type)0))-e))); \ +}) + +/****************************************************************************** +** ENDIAN32(x,y) little endian <---> big endian +** IS_LITTLE_END() whether the system is little end mode +******************************************************************************/ +#define ENDIAN32( x ) \ + ( ( (x) << 24 ) | \ + ( ( (x) & 0x0000ff00 ) << 8 ) | \ + ( ( (x) & 0x00ff0000 ) >> 8 ) | \ + ( ( (x) >> 24 ) & 0x000000ff ) ) + +__inline static HI_BOOL IS_LITTLE_END(void) +{ + union unEND_TEST_U + { + HI_CHAR cTest[4]; + HI_U32 u32Test; + } unEndTest; + + unEndTest.cTest[0] = 0x01; + unEndTest.cTest[1] = 0x02; + unEndTest.cTest[2] = 0x03; + unEndTest.cTest[3] = 0x04; + + return (unEndTest.u32Test > 0x01020304) ? (HI_TRUE) : (HI_FALSE); +} + + +/****************************************************************************** +** FRACTION32(de,nu) fraction: nu(minator) / de(nominator). +** NUMERATOR32(x) of x(x is fraction) +** DENOMINATOR32(x) Denominator of x(x is fraction) + +** represent fraction in 32 bit. LSB 16 is numerator, MSB 16 is denominator +** It is integer if denominator is 0. +******************************************************************************/ +#define FRACTION32(de,nu) ( ((de) << 16) | (nu) ) +#define NUMERATOR32(x) ( (x) & 0xffff) +#define DENOMINATOR32(x) ( (x) >> 16 ) + +/****************************************************************************** +** RGB(r,g,b) assemble the r,g,b to 24bit color +** RGB_R(c) get RED from 24bit color +** RGB_G(c) get GREEN from 24bit color +** RGB_B(c) get BLUE from 24bit color +******************************************************************************/ +#define RGB(r,g,b) ((((r) & 0xff) << 16) | (((g) & 0xff) << 8) | ((b) & 0xff)) +#define RGB_R(c) ( ((c) & 0xff0000) >> 16) +#define RGB_G(c) ( ((c) & 0xff00) >> 8) +#define RGB_B(c) ( (c) & 0xff) + +/****************************************************************************** +** YUV(y,u,v) assemble the y,u,v to 24bit color +** YUV_Y(c) get Y from 24bit color +** YUV_U(c) get U from 24bit color +** YUV_V(c) get V from 24bit color +******************************************************************************/ +#define YUV(y,u,v) ((((y) & 0xff) << 16) | (((u) & 0xff) << 8) | ((v) & 0xff)) +#define YUV_Y(c) ( ((c) & 0xff0000) >> 16) +#define YUV_U(c) ( ((c) & 0xff00) >> 8) +#define YUV_V(c) ( (c) & 0xff) + +/****************************************************************************** +** Rgb2Yc(r, g, b, *y, *u, *u) convert r,g,b to y,u,v +** Rgb2Yuv(rgb, *yuv) convert rgb to yuv +******************************************************************************/ +__inline static HI_VOID Rgb2Yc(HI_U8 r, HI_U8 g, HI_U8 b, HI_U8 * py, HI_U8 * pcb, HI_U8 * pcr) +{ + /* Y */ + *py = (HI_U8)(((r*66+g*129+b*25) >> 8) + 16); + + /* Cb */ + *pcb = (HI_U8)((((b*112-r*38)-g*74) >> 8) + 128); + + /* Cr */ + *pcr = (HI_U8)((((r*112-g*94)-b*18) >> 8) + 128); +} + +__inline static HI_U32 Rgb2Yuv(HI_U32 u32Rgb) +{ + HI_U8 y,u,v; + + Rgb2Yc(RGB_R(u32Rgb), RGB_G(u32Rgb), RGB_B(u32Rgb), &y, &u, &v); + + return YUV(y,u,v); +} + +/****************************************************************************** +** GetYCFromRGB(rgb, *y, *cbcr) convert rgb to yyyy, uvuv, +******************************************************************************/ +__inline static HI_VOID GetYCFromRGB(HI_U32 rgb, HI_U32 * pY, HI_U32 * pC) +{ + HI_U8 y, cb, cr; + HI_U32 color_y, color_c, tmp; + + Rgb2Yc(RGB_R(rgb), RGB_G(rgb), RGB_B(rgb), &y, &cb, &cr); + + tmp = y & 0xFF; + color_y = (tmp<<24) + (tmp<<16) + (tmp<<8) + tmp; + + tmp = cb & 0xFF; + color_c = (tmp<<24) + (tmp<<8); + + tmp = cr & 0xFF; + color_c = color_c + (tmp<<16) + tmp; + + *pY = color_y; + *pC = color_c; +} + +/******************************************************************************* +** FpsControl Useing Sample: +** FPS_CTRL_S g_stFpsCtrl; +** +** Take 12 frame uniform in 25. +** InitFps(&g_stFpsCtrl, 25, 12); +** +** { +** if(FpsControl(&g_stFpsCtrl)) printf("Yes, this frmae should be token"); +** } +** +*******************************************************************************/ +typedef struct hiFPS_CTRL_S +{ + HI_U32 u32Ffps; /* Full frame rate */ + HI_U32 u32Tfps; /* Target frame rate */ + HI_U32 u32FrmKey; /* update key frame */ +} FPS_CTRL_S; + +__inline static HI_VOID InitFps(FPS_CTRL_S *pFrmCtrl, HI_U32 u32FullFps, + HI_U32 u32TagFps) +{ + pFrmCtrl->u32Ffps = u32FullFps; + pFrmCtrl->u32Tfps = u32TagFps; + pFrmCtrl->u32FrmKey = 0; +} + +__inline static HI_BOOL FpsControl(FPS_CTRL_S *pFrmCtrl) +{ + HI_BOOL bReturn = HI_FALSE; + + pFrmCtrl->u32FrmKey += pFrmCtrl->u32Tfps; + if (pFrmCtrl->u32FrmKey >= pFrmCtrl->u32Ffps) + { + pFrmCtrl->u32FrmKey -= pFrmCtrl->u32Ffps; + bReturn = HI_TRUE; + } + + return bReturn; +} + +/******************************************************************************* +** GetSysTimeBySec +** GetSysTimeByUsec +*******************************************************************************/ +#ifdef __KERNEL__ + #include +#else + #include +#endif +__inline static HI_U32 GetSysTimeBySec(void) +{ + struct timeval stTime; + #ifdef __KERNEL__ + do_gettimeofday(&stTime); + #else + gettimeofday(&stTime, NULL); + #endif + return stTime.tv_sec; +} + +__inline static HI_U64 GetSysTimeByUsec(void) +{ + struct timeval stTime; + #ifdef __KERNEL__ + do_gettimeofday(&stTime); + #else + gettimeofday(&stTime, NULL); + #endif + return (stTime.tv_sec * 1000000LLU) + stTime.tv_usec; +} + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __HI_MATH_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_md.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_md.h new file mode 100644 index 0000000..d719e38 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_md.h @@ -0,0 +1,56 @@ +/****************************************************************************** + + Copyright (C), 2001-2014, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_md.h + Version : Initial Draft + Author : Hisilicon multimedia software (IVE) group + Created : 2014/11/10 + Description : + History : + 1.Date : 2014/11/10 + Author : c00211359 + Modification: Created file +******************************************************************************/ +#ifndef _HI_MD_H_ +#define _HI_MD_H_ + +#include "hi_ive.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif +/* +* Definition md algorithm mode +*/ +typedef enum hiMD_ALG_MODE_E +{ + MD_ALG_MODE_BG = 0x0,/*Base on background image*/ + MD_ALG_MODE_REF = 0x1,/*Base on reference image*/ + + MD_ALG_MODE_BUTT +}MD_ALG_MODE_E; +/* +* Definition of md attribute +*/ +typedef struct hiMD_ATTR_S +{ + MD_ALG_MODE_E enAlgMode; /*Md algorithm mode*/ + IVE_SAD_MODE_E enSadMode; /*Sad mode*/ + HI_U16 u16Width; /*Image width*/ + HI_U16 u16Height; /*Image height*/ + HI_U16 u16SadThr; /*Sad thresh*/ + IVE_CCL_CTRL_S stCclCtrl; /*Ccl ctrl*/ + IVE_ADD_CTRL_S stAddCtrl; /*Add ctrl*/ +}MD_ATTR_S; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif + +#endif/*_HI_MD_H_*/ \ No newline at end of file diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_mipi.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_mipi.h new file mode 100644 index 0000000..95a8ffb --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_mipi.h @@ -0,0 +1,256 @@ +#ifndef __HI_MIPI__ +#define __HI_MIPI__ + +#include "hi_type.h" + +typedef unsigned int MIPI_PHY; +typedef unsigned int COMBO_LINK; + +#define LVDS_MIN_WIDTH 32 +#define LVDS_MIN_HEIGHT 32 + +#define COMBO_MAX_LINK_NUM 2 /* hi3518ev200 has 1 links, For compatibility of Hi3516A, use 2 */ +#define COMBO_MAX_LANE_NUM 8 +#define LANE_NUM_PER_LINK 4 /* one link has 4 lanes */ + + +#define MIPI_LANE_NUM COMBO_MAX_LANE_NUM /* hi3518ev200 support 1 link mipi only, For compatibility of Hi3516A, use 2*/ +#define LVDS_LANE_NUM COMBO_MAX_LANE_NUM /* hi3518ev200 has 1 links, so has 4 lanes. For compatibility of Hi3516A, use 8 */ + + +#define WDR_VC_NUM 4 +#define SYNC_CODE_NUM 4 + +/* int mask */ +#define COMBO_LINK_INT_DEF (0x00200000) +#define COMBO_LINK_INT_MASK (0x300000) +//~(COMBO_LINK_INT_DEF) /* 0: enable int */ + +#define MIPI_INT1_INT_DEF (0x1000fff0) +//#define MIPI_INT1_MASK ~(MIPI_INT1_INT_DEF) /* 0: enable int */ + +#define MIPI_INT2_INT_DEF (0xf000) +//#define MIPI_INT2_MASK ~(MIPI_INT2_INT_DEF) /* 0: enable int */ + +#define MIPI_INT_MASK 0x0 + +//#define HI_MIPI_REG_DEBUG +//#define HI_MIPI_DEBUG +#ifdef HI_MIPI_DEBUG + +#define HI_MSG(x...) \ +do { \ + printk("%s->%d: ", __FUNCTION__, __LINE__); \ + printk(x); \ + printk("\n"); \ +} while (0) +#else + +#define HI_MSG(args...) do { } while (0) +#endif + +#define HI_ERR(x...) \ +do { \ + printk(KERN_ALERT "%s(%d): ", __FUNCTION__, __LINE__); \ + printk(KERN_ALERT x); \ + printk(KERN_ALERT "\n"); \ +} while (0) + + +typedef enum +{ + MIPI_VC0_NO_MATCH = 0x1 << 4, /*VC0ͨ֡ʼ֡ƥ*/ + MIPI_VC1_NO_MATCH = 0x1 << 5, /*VC1ͨ֡ʼ֡ƥ*/ + MIPI_VC2_NO_MATCH = 0x1 << 6, /*VC2ͨ֡ʼ֡ƥ*/ + MIPI_VC3_NO_MATCH = 0x1 << 7, /*VC3ͨ֡ʼ֡ƥ*/ + + MIPI_VC0_ORDER_ERR = 0x1 << 8, /*VC0֡*/ + MIPI_VC1_ORDER_ERR = 0x1 << 9, /*VC1֡*/ + MIPI_VC2_ORDER_ERR = 0x1 << 10, /*VC2֡*/ + MIPI_VC3_ORDER_ERR = 0x1 << 11, /*VC3֡*/ + + MIPI_VC0_FRAME_CRC = 0x1 << 12, /*һ֡УVC0ͨһCRC*/ + MIPI_VC1_FRAME_CRC = 0x1 << 13, /*һ֡УVC1ͨһCRC*/ + MIPI_VC2_FRAME_CRC = 0x1 << 14, /*һ֡УVC2ͨһCRC*/ + MIPI_VC3_FRAME_CRC = 0x1 << 15, /*һ֡УVC3ͨһCRC*/ + + MIPI_HEADER_ERR = 0x1 << 28, /*Header2ECC޷*/ +}MIPI_INT_ERR; + +typedef enum +{ + MIPI_VC0_INVALID_DT = 0x1 << 12, /*VC0ͨͲ֧*/ + MIPI_VC1_INVALID_DT = 0x1 << 13, /*VC1ͨͲ֧*/ + MIPI_VC2_INVALID_DT = 0x1 << 14, /*VC2ͨͲ֧*/ + MIPI_VC3_INVALID_DT = 0x1 << 15, /*VC3ͨͲ֧*/ +}MIPI_INT2_ERR; + +typedef enum +{ + MIPI_ESC_CLK = 0x1 << 0, /*MIPIģʽʱLink 0 clock lane escapeж״̬*/ + MIPI_ESC_D0 = 0x1 << 1, /*data lane 0 escapeж״̬*/ + MIPI_ESC_D1 = 0x1 << 2, /*data lane 1 escapeж״̬*/ + MIPI_ESC_D2 = 0x1 << 3, /*data lane 2 escapeж״̬*/ + MIPI_ESC_D3 = 0x1 << 4, /*data lane 3 escapeж״̬*/ + + MIPI_TIMEOUT_CLK = 0x1 << 8, /*clock lane FSM timeout ж״̬*/ + MIPI_TIMEOUT_D0 = 0x1 << 9, /*data lane 0 FSM timeout ж״̬*/ + MIPI_TIMEOUT_D1 = 0x1 << 10, /*data lane 1 FSM timeout ж״̬*/ + MIPI_TIMEOUT_D2 = 0x1 << 11, /*data lane 2 FSM timeout ж״̬*/ + MIPI_TIMEOUT_D3 = 0x1 << 12, /*data lane 3 FSM timeout ж״̬*/ + + MIPI_VSYNC_ERR = 0x1 << 21, /* LVDSģʽLink 0 lane ֡ͬźvsyncЧͬж״̬*/ +}LINK_INT_STAT; + +typedef enum +{ + LANE0_SYNC_ERR = 0x1, + LANE1_SYNC_ERR = 0x2, + LANE2_SYNC_ERR = 0x4, + LANE3_SYNC_ERR = 0x8, + LANE4_SYNC_ERR = 0x10, + LANE5_SYNC_ERR = 0x20, + LANE6_SYNC_ERR = 0x40, + LANE7_SYNC_ERR = 0x80, + + PHY0_LINE_SYNC_ERR = 0x100, + PHY0_FRAME_SYNC_ERR = 0x200, + PHY1_LINE_SYNC_ERR = 0x400, + PHY1_FRAME_SYNC_ERR = 0x800, + LINK_SYNC_ERR = 0x3F0000, /* link/֡ź޷ж״̬джҪlink*/ +}LVDS_SYNC_INTR_ERR; + +typedef enum +{ + OUTPUT_DATA_WIDTH_2BIT=0, + OUTPUT_DATA_WIDTH_4BIT, + OUTPUT_DATA_WIDTH_8BIT, + OUTPUT_DATA_WIDTH_BUTT +}output_data_width; + +typedef enum +{ + CLK_UP_EDGE=0, + CLK_DOWN_EDGE, + CLK_EDGE_BUTT +}clk_edge; + +typedef enum +{ + OUTPUT_NORM_MSB=0, + OUTPUT_REVERSE_MSB, + OUTPUT_MSB_BUTT +}output_msb; + +typedef enum +{ + INPUT_MODE_MIPI = 0x0, /* mipi */ + INPUT_MODE_SUBLVDS = 0x1, /* SUB_LVDS */ + INPUT_MODE_LVDS = 0x2, /* LVDS */ + INPUT_MODE_HISPI = 0x3, /* HISPI */ + INPUT_MODE_CMOS_18V = 0x4, /* CMOS 1.8V */ + INPUT_MODE_CMOS_33V = 0x5, /* CMOS 3.3V */ + INPUT_MODE_BT1120 = 0x6, /* CMOS 3.3V */ + INPUT_MODE_BYPASS = 0x7, /* MIPI Bypass */ + + INPUT_MODE_BUTT +}input_mode_t; + +typedef enum +{ + WORK_MODE_LVDS = 0x0, + WORK_MODE_MIPI = 0x1, + WORK_MODE_CMOS_18V = 0x2, + WORK_MODE_CMOS_33V = 0x4, + WORK_MODE_BT1120 = 0x4, + WORK_MODE_BUTT +}work_mode_t; + +typedef struct +{ + unsigned int width; + unsigned int height; +}img_size_t; + +typedef enum +{ + HI_WDR_MODE_NONE = 0x0, + HI_WDR_MODE_2F = 0x1, + HI_WDR_MODE_3F = 0x2, + HI_WDR_MODE_4F = 0x3, + HI_WDR_MODE_DOL_2F = 0x4, + HI_WDR_MODE_DOL_3F = 0x5, + HI_WDR_MODE_DOL_4F = 0x6, + HI_WDR_MODE_BUTT +}wdr_mode_e; + +typedef enum +{ + LVDS_ENDIAN_LITTLE = 0x0, + LVDS_ENDIAN_BIG = 0x1, + LVDS_ENDIAN_BUTT +}lvds_bit_endian; + +typedef enum +{ + LVDS_SYNC_MODE_SOL = 0, /* sensor SOL, EOL, SOF, EOF */ + LVDS_SYNC_MODE_SAV, /* SAV, EAV */ + LVDS_SYNC_MODE_BUTT +}lvds_sync_mode_e; + +typedef enum +{ + RAW_DATA_8BIT = 1, + RAW_DATA_10BIT, + RAW_DATA_12BIT, + RAW_DATA_14BIT, + RAW_DATA_BUTT +}raw_data_type_e; + +typedef struct +{ + img_size_t img_size; /* oringnal sensor input image size */ + wdr_mode_e wdr_mode; /* WDR mode */ + lvds_sync_mode_e sync_mode; /* sync mode: SOL, SAV */ + raw_data_type_e raw_data_type; /* raw data type: 8/10/12/14 bit */ + lvds_bit_endian data_endian; /* data endian: little/big */ + lvds_bit_endian sync_code_endian; /* sync code endian: little/big */ + short lane_id[LVDS_LANE_NUM]; /* lane_id: -1 - disable */ + + /* each vc has 4 params, sync_code[i]: + sync_mode is SYNC_MODE_SOL: SOL, EOL, SOF, EOF + sync_mode is SYNC_MODE_SAV: valid sav, valid eav, invalid sav, invalid eav */ + unsigned short sync_code[LVDS_LANE_NUM][WDR_VC_NUM][SYNC_CODE_NUM]; +}lvds_dev_attr_t; + +typedef struct +{ + raw_data_type_e raw_data_type; /* raw data type: 8/10/12/14 bit */ + short lane_id[MIPI_LANE_NUM]; /* lane_id: -1 - disable */ +}mipi_dev_attr_t; + +typedef struct +{ + input_mode_t input_mode; /* input mode: MIPI/LVDS/SUBLVDS/HISPI/DC */ + + union + { + mipi_dev_attr_t mipi_attr; + lvds_dev_attr_t lvds_attr; + }; +}combo_dev_attr_t; + + +#define HI_MIPI_IOC_MAGIC 'm' + +/* init data lane, input mode, data type */ +#define HI_MIPI_SET_DEV_ATTR _IOW(HI_MIPI_IOC_MAGIC, 0x01, combo_dev_attr_t) + +/* output clk edge */ +#define HI_MIPI_SET_OUTPUT_CLK_EDGE _IOW(HI_MIPI_IOC_MAGIC, 0x02, HI_BOOL) + +/* output data msb */ +#define HI_MIPI_SET_OUTPUT_MSB _IOW(HI_MIPI_IOC_MAGIC, 0x03, HI_BOOL) + +#endif + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_sns_ctrl.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_sns_ctrl.h new file mode 100644 index 0000000..837e322 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_sns_ctrl.h @@ -0,0 +1,47 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_sns_ctrl.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2011/01/10 + Description : + History : + 1.Date : 2011/01/10 + Author : x00100808 + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_SNS_CTRL_H__ +#define __HI_SNS_CTRL_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +void sensor_init(); +void sensor_exit(); + +void sensor_prog(int *rom); +int sensor_write_register(int addr, int data); +int sensor_read_register(int addr); +int sensor_write_register_bit(int addr, int data, int mask); +int sensor_register_callback(void); +int sensor_unregister_callback(void); +int sensor_set_inifile_path(const HI_CHAR *pcPath); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* __HI_SNS_CTRL_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_spi.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_spi.h new file mode 100644 index 0000000..be6a0cd --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_spi.h @@ -0,0 +1,113 @@ +#ifndef __HI_SPI_H__ +#define __HI_SPI_H__ + +typedef unsigned long long __u64; +typedef unsigned int __u32; +typedef unsigned short __u16; +typedef unsigned char __u8; + +/* User space versions of kernel symbols for SPI clocking modes, + * matching + */ + +#define SPI_CPHA 0x01 +#define SPI_CPOL 0x02 + +#define SPI_MODE_0 (0|0) +#define SPI_MODE_1 (0|SPI_CPHA) +#define SPI_MODE_2 (SPI_CPOL|0) +#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) + +#define SPI_CS_HIGH 0x04 +#define SPI_LSB_FIRST 0x08 +#define SPI_3WIRE 0x10 +#define SPI_LOOP 0x20 +#define SPI_NO_CS 0x40 +#define SPI_READY 0x80 + +/*---------------------------------------------------------------------------*/ + +/* IOCTL commands */ + +#define SPI_IOC_MAGIC 'k' + +/** + * struct spi_ioc_transfer - describes a single SPI transfer + * @tx_buf: Holds pointer to userspace buffer with transmit data, or null. + * If no data is provided, zeroes are shifted out. + * @rx_buf: Holds pointer to userspace buffer for receive data, or null. + * @len: Length of tx and rx buffers, in bytes. + * @speed_hz: Temporary override of the device's bitrate. + * @bits_per_word: Temporary override of the device's wordsize. + * @delay_usecs: If nonzero, how long to delay after the last bit transfer + * before optionally deselecting the device before the next transfer. + * @cs_change: True to deselect device before starting the next transfer. + * + * This structure is mapped directly to the kernel spi_transfer structure; + * the fields have the same meanings, except of course that the pointers + * are in a different address space (and may be of different sizes in some + * cases, such as 32-bit i386 userspace over a 64-bit x86_64 kernel). + * Zero-initialize the structure, including currently unused fields, to + * accommodate potential future updates. + * + * SPI_IOC_MESSAGE gives userspace the equivalent of kernel spi_sync(). + * Pass it an array of related transfers, they'll execute together. + * Each transfer may be half duplex (either direction) or full duplex. + * + * struct spi_ioc_transfer mesg[4]; + * ... + * status = ioctl(fd, SPI_IOC_MESSAGE(4), mesg); + * + * So for example one transfer might send a nine bit command (right aligned + * in a 16-bit word), the next could read a block of 8-bit data before + * terminating that command by temporarily deselecting the chip; the next + * could send a different nine bit command (re-selecting the chip), and the + * last transfer might write some register values. + */ +struct spi_ioc_transfer { + __u64 tx_buf; + __u64 rx_buf; + + __u32 len; + __u32 speed_hz; + + __u16 delay_usecs; + __u8 bits_per_word; + __u8 cs_change; + __u32 pad; + + /* If the contents of 'struct spi_ioc_transfer' ever change + * incompatibly, then the ioctl number (currently 0) must change; + * ioctls with constant size fields get a bit more in the way of + * error checking than ones (like this) where that field varies. + * + * NOTE: struct layout is the same in 64bit and 32bit userspace. + */ +}; + +/* not all platforms use or _IOC_TYPECHECK() ... */ +#define SPI_MSGSIZE(N) \ + ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \ + ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) +#define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) + + +/* Read / Write of SPI mode (SPI_MODE_0..SPI_MODE_3) */ +#define SPI_IOC_RD_MODE _IOR(SPI_IOC_MAGIC, 1, __u8) +#define SPI_IOC_WR_MODE _IOW(SPI_IOC_MAGIC, 1, __u8) + +/* Read / Write SPI bit justification */ +#define SPI_IOC_RD_LSB_FIRST _IOR(SPI_IOC_MAGIC, 2, __u8) +#define SPI_IOC_WR_LSB_FIRST _IOW(SPI_IOC_MAGIC, 2, __u8) + +/* Read / Write SPI device word length (1..N) */ +#define SPI_IOC_RD_BITS_PER_WORD _IOR(SPI_IOC_MAGIC, 3, __u8) +#define SPI_IOC_WR_BITS_PER_WORD _IOW(SPI_IOC_MAGIC, 3, __u8) + +/* Read / Write SPI device default max speed hz */ +#define SPI_IOC_RD_MAX_SPEED_HZ _IOR(SPI_IOC_MAGIC, 4, __u32) +#define SPI_IOC_WR_MAX_SPEED_HZ _IOW(SPI_IOC_MAGIC, 4, __u32) + + + +#endif /* __HI_SPI_H__ */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_tde_api.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_tde_api.h new file mode 100644 index 0000000..9ad3e79 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_tde_api.h @@ -0,0 +1,392 @@ +/***************************************************************************** +* Copyright 2006 - 2050, Hisilicon Tech. Co., Ltd. +* ALL RIGHTS RESERVED +* FileName: hi_api_tde.h +* Description:TDE2 API define +* +* History: +* Version Date Author DefectNum Description +* +*****************************************************************************/ + +#ifndef _HI_API_TDE2_H_ +#define _HI_API_TDE2_H_ + +#ifdef __cplusplus + #if __cplusplus +extern "C" { + #endif /* __cplusplus */ +#endif /* __cplusplus */ + +#include "hi_type.h" +#include "hi_tde_type.h" + +#define HI_TDE_Open HI_TDE2_Open +#define HI_TDE_Close HI_TDE2_Close +#define HI_TDE_BeginJob HI_TDE2_BeginJob + +/****************************************************************************/ +/* TDE2 API define */ +/****************************************************************************/ + +/***************************************************************************** +* Function: HI_TDE2_Open +* Description: Opens the TDE device +* Input: None +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_Open(HI_VOID); + +/***************************************************************************** +* Function: HI_TDE2_Close +* Description: Closes the TDE device +* Input: None +* Output: None +* Return: None +* Others: None +*****************************************************************************/ +HI_VOID HI_TDE2_Close(HI_VOID); + +/***************************************************************************** +* Function: HI_TDE2_BeginJob +* Description: Creates a TDE job, get a TDE2 job handle +* Input: None +* Output: None +* Return: tde handle / Error code +* Others: None +*****************************************************************************/ +TDE_HANDLE HI_TDE2_BeginJob(HI_VOID); + +/***************************************************************************** +* Function: HI_TDE2_EndJob +* Description: Submits a TDE2 job +* Input: s32Handle: job handle +* bSync: if synchronous +* bBlock: if blocked +* u32TimeOut: timeout value(in 10ms) +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_EndJob(TDE_HANDLE s32Handle, HI_BOOL bSync, HI_BOOL bBlock, HI_U32 u32TimeOut); + +/***************************************************************************** +* Function: HI_TDE2_CancelJob +* Description: Cancels a specific TDE job, only successful before calling EndJob +* Input: s32Handle: job handle +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_CancelJob(TDE_HANDLE s32Handle); + +/***************************************************************************** +* Function: HI_TDE2_WaitForDone +* Description: Waits for a submitted job to finish +* Input: s32Handle: job handle +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_WaitForDone(TDE_HANDLE s32Handle); + +/***************************************************************************** +* Function: HI_TDE2_WaitAllDone +* Description: Waits for all submitted jobs to finish +* Input: None +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_WaitAllDone(HI_VOID); + + +/***************************************************************************** +* Function: HI_TDE2_Reset +* Description: Reset tde +* Input: None +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_Reset(HI_VOID); + +/***************************************************************************** +* Function: HI_TDE2_QuickCopy +* Description: Just quick copy, the size of source region and destination region should be the same, so is the color format +* Input: s32Handle: job handle +* pSrc: the source picture information +* pstSrcRect: the source picture operation region +* pDst: the destination picture information +* pstDstRect: the destination picture operation region +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_QuickCopy(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstSrc, TDE2_RECT_S *pstSrcRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect); + +/***************************************************************************** +* Function: HI_TDE2_QuickFill +* Description: Quick fill +* Input: s32Handle: job handle +* pDst: the destination picture information +* pstDstRect: the destination picture operation region +* u32FillData: the color value,its format should be the same to the destination picture +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_QuickFill(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect, + HI_U32 u32FillData); + +/***************************************************************************** +* Function: HI_TDE2_QuickResize +* Description: Adds the raster bitmap scaling operation to a TDE job +* Input: s32Handle: job handle +* pSrc: the source picture information +* pstSrcRect: the source picture operation region +* pDst: the destination picture information +* pstDstRect: the destination picture operation region +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_QuickResize(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstSrc, TDE2_RECT_S *pstSrcRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect); + +/***************************************************************************** +* Function: HI_TDE2_QuickFlicker +* Description: Adds the anti-flicker operation to a TDE job +* Input: s32Handle: job handle +* pSrc: the source picture information +* pstSrcRect: the source picture operation region +* pDst: the destination picture information +* pstDstRect: the destination picture operation region +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_QuickDeflicker(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstSrc, TDE2_RECT_S *pstSrcRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect); + +/***************************************************************************** +* Function: HI_TDE2_Blit +* Description: Adds the transfer operation with additional functions performed on + the raster bitmap to a TDE task +* Input: s32Handle: job handle +* pstBackGround: the background picture information +* pstBackGroundRect: the background picture operation region +* pstForeGround: the foreground picture information +* pstForeGroundRect: the foreground picture operation region +* pstDst: the destination picture information +* pstDstRect: the destination picture operation region +* pOpt: operation parameter settings +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_Bitblit(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstBackGround, TDE2_RECT_S *pstBackGroundRect, + TDE2_SURFACE_S* pstForeGround, TDE2_RECT_S *pstForeGroundRect, TDE2_SURFACE_S* pstDst, + TDE2_RECT_S *pstDstRect, TDE2_OPT_S* pstOpt); + +/***************************************************************************** +* Function: HI_TDE2_SolidDraw +* Description: Adds the filling operation with additional functions performed on + the raster bitmap to a TDE task +* Input: s32Handle: job handle +* pstForeGround: the foreground picture information +* pstForeGroundRect: the source picture operation region +* pstDst: the background picture information +* pstDstRect: the destination picture operation region +* pstFillColor: the color value +* pstOpt: operation parameter settings +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_SolidDraw(TDE_HANDLE s32Handle, TDE2_SURFACE_S* pstForeGround, TDE2_RECT_S *pstForeGroundRect, + TDE2_SURFACE_S *pstDst, + TDE2_RECT_S *pstDstRect, TDE2_FILLCOLOR_S *pstFillColor, + TDE2_OPT_S *pstOpt); + +/***************************************************************************** +* Function: HI_TDE2_MbBlit +* Description: Adds the transfer operation with additional functions performed on + the macroblock bitmap to a TDE task +* Input: s32Handle: job handle +* pstMB: Surface of the macroblock +* pstDst: Operating region of the macroblock +* pstDstRect: the destination picture operation region +* pstMbOpt: operation parameter settings +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_MbBlit(TDE_HANDLE s32Handle, TDE2_MB_S* pstMB, TDE2_RECT_S *pstMbRect, TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect, + TDE2_MBOPT_S* pstMbOpt); + +/***************************************************************************** +* Function: HI_TDE2_BitmapMaskRop +* Description: Adds the mask raster operation (ROP) operation performed + on the raster bitmap to a TDE task. +* Input: s32Handle: job handle +* pstBackGround: the background picture information +* pstBackGroundRect: the background picture operation region +* pstForeGround: the foreground picture information +* pstForeGroundRect: the source picture operation region +* pstMask: mask picture information +* pstMaskRect: operating region of the mask picture +* pstDst: the destination picture information +* pstDstRect: the destination picture operation region +* enRopCode_Color: ROP operation code of the color component +* enRopCode_Alpha: ROP operation code of the alpha component +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_BitmapMaskRop(TDE_HANDLE s32Handle, + TDE2_SURFACE_S* pstBackGround, TDE2_RECT_S *pstBackGroundRect, + TDE2_SURFACE_S* pstForeGround, TDE2_RECT_S *pstForeGroundRect, + TDE2_SURFACE_S* pstMask, TDE2_RECT_S *pstMaskRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect, + TDE2_ROP_CODE_E enRopCode_Color, TDE2_ROP_CODE_E enRopCode_Alpha); + +/***************************************************************************** +* Function: HI_TDE2_BitmapMaskBlend +* Description: Adds the mask blending operation performed on the raster + bitmap to a TDE task +* Input: s32Handle: job handle +* pstBackGround: the background picture information +* pstBackGroundRect: the background picture operation region +* pstForeGround: the foreground picture information +* pstForeGroundRect: the foreground picture operation region +* pstMask: mask picture information +* pstMaskRect: operating region of the mask picture +* pstDst: the destination picture information +* pstDstRect: the destination picture operation region +* u8Alpha: global alpha value during alpha blending +* enBlendMode: alpha blending mode +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_BitmapMaskBlend(TDE_HANDLE s32Handle, + TDE2_SURFACE_S* pstBackGround, TDE2_RECT_S *pstBackGroundRect, + TDE2_SURFACE_S* pstForeGround, TDE2_RECT_S *pstForeGroundRect, + TDE2_SURFACE_S* pstMask, TDE2_RECT_S *pstMaskRect, + TDE2_SURFACE_S* pstDst, TDE2_RECT_S *pstDstRect, + HI_U8 u8Alpha, TDE2_ALUCMD_E enBlendMode); + + + +/***************************************************************************** +* Function: HI_TDE2_SetDeflickerLevel +* Description: To set the anti-flicker level +* Input: enDeflickerLevel: anti-flicker level +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_SetDeflickerLevel(TDE_DEFLICKER_LEVEL_E enDeflickerLevel); + +/***************************************************************************** +* Function: HI_TDE2_GetDeflickerLevel +* Description: To get the anti-flicker level +* Input: pDeflickerLevel: to save the anti-flicker level +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_GetDeflickerLevel(TDE_DEFLICKER_LEVEL_E *pDeflickerLevel); + +/***************************************************************************** +* Function: HI_TDE2_SetAlphaThresholdValue +* Description: To set the anti-flicker level +* Input: u8ThresholdValue: Alpha threshold +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_SetAlphaThresholdValue(HI_U8 u8ThresholdValue); + +/***************************************************************************** +* Function: HI_TDE2_GetAlphaThresholdValue +* Description: To get the anti-flicker level +* Input: pu8ThresholdValue: to save the alpha threshold +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_GetAlphaThresholdValue(HI_U8 *pu8ThresholdValue); + +/***************************************************************************** +* Function: HI_TDE2_GetAlphaThresholdValue +* Description: To enable or disable alpha judgment +* Input: bEnAlphaThreshold: whether to enable alpha judgment +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_SetAlphaThresholdState(HI_BOOL bEnAlphaThreshold); + +/***************************************************************************** +* Function: HI_TDE2_GetAlphaThresholdState +* Description: To get alpha judgment state +* Input: p_bEnAlphaThreshold: To save the alpha judgment state +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_GetAlphaThresholdState(HI_BOOL * p_bEnAlphaThreshold); + +/***************************************************************************** +* Function: HI_TDE2_PatternFill +* Description: Pattern fill +Input: s32Handle: job handle +* pstBackGround: the background picture information +* pstBackGroundRect: the background picture operation region +* pstForeGround: the foreground picture information +* pstForeGroundRect: the foreground picture operation region +* pstDst: the destination picture information +* pstDstRect: the destination picture operation region +* pstOpt: operation parameter settings +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_PatternFill(TDE_HANDLE s32Handle, TDE2_SURFACE_S *pstBackGround, + TDE2_RECT_S *pstBackGroundRect, TDE2_SURFACE_S *pstForeGround, + TDE2_RECT_S *pstForeGroundRect, TDE2_SURFACE_S *pstDst, + TDE2_RECT_S *pstDstRect, TDE2_PATTERN_FILL_OPT_S *pstOpt); + +/***************************************************************************** +* Function: HI_TDE2_EnableRegionDeflicker +* Description: To enable or disable the regional anti-flicker function +* Input: bRegionDeflicker: enable flag +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_EnableRegionDeflicker(HI_BOOL bRegionDeflicker); +/***************************************************************************** +* Function: HI_TDE2_MultiBlending +* Description: multi blend surface by surface list +* Input: s32Handle: job handle + pstSurfaceList: composed surface list +* Output: None +* Return: Success / Error code +* Others: None +*****************************************************************************/ +HI_S32 HI_TDE2_MultiBlending(TDE_HANDLE s32Handle, TDE_SURFACE_LIST_S *pstSurfaceList); + + +#ifdef __cplusplus + #if __cplusplus +} + #endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif /* _HI_API_TDE2_H_ */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_tde_errcode.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_tde_errcode.h new file mode 100644 index 0000000..c27b064 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_tde_errcode.h @@ -0,0 +1,55 @@ +/****************************************************************************** + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + File Name : tde_errcode.h +Version : Initial Draft +Author : Hisilicon multimedia software group +Created : 2005/4/23 +Last Modified : +Description : err code define +Function List : +History : May modify the code to errcode.h FOR hi3110 + ******************************************************************************/ +#ifndef __TDE_ERRCODE_H__ +#define __TDE_ERRCODE_H__ + +//#include "hi_debug.h" +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +//#define HI_ID_TDE 100 +/* tde start err no. */ +#define HI_ERR_TDE_BASE ((HI_S32)( ((0x80UL + 0x20UL)<<24) | (100 << 16 ) | (4 << 13) | 1 )) + +enum +{ + HI_ERR_TDE_DEV_NOT_OPEN = HI_ERR_TDE_BASE, /**< tde device not open yet */ + HI_ERR_TDE_DEV_OPEN_FAILED, /**< open tde device failed */ + HI_ERR_TDE_NULL_PTR, /**< input parameters contain null ptr */ + HI_ERR_TDE_NO_MEM, /**< malloc failed */ + HI_ERR_TDE_INVALID_HANDLE, /**< invalid job handle */ + HI_ERR_TDE_INVALID_PARA, /**< invalid parameter */ + HI_ERR_TDE_NOT_ALIGNED, /**< aligned error for position, stride, width */ + HI_ERR_TDE_MINIFICATION, /**< invalid minification */ + HI_ERR_TDE_CLIP_AREA, /**< clip area and operation area have no intersection */ + HI_ERR_TDE_JOB_TIMEOUT, /**< blocked job wait timeout */ + HI_ERR_TDE_UNSUPPORTED_OPERATION, /**< unsupported operation */ + HI_ERR_TDE_QUERY_TIMEOUT, /**< query time out */ + HI_ERR_TDE_INTERRUPT /**< blocked job was interrupted */ +}; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __TDE_ERRCODE_H__*/ + + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hi_tde_type.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_tde_type.h new file mode 100644 index 0000000..edf62ec --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hi_tde_type.h @@ -0,0 +1,511 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Huawei Tech. Co., Ltd. + + ****************************************************************************** + File Name : tde_type.h +Version : Initial Draft +Author : w54130 +Created : 2007/5/21 +Last Modified : +Description : TDE public type +Function List : +History : +1.Date : 2007/5/21 +Author : w54130 +Modification: Created file + + ******************************************************************************/ +#ifndef __TDE_TYPE_H__ +#define __TDE_TYPE_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include "hi_tde_errcode.h" + +/****************************************************************************/ +/* TDE2 types define */ +/****************************************************************************/ +/** TDE handle */ +typedef HI_S32 TDE_HANDLE; + +/** TDE callback */ +typedef HI_VOID (* TDE_FUNC_CB) (HI_VOID *pParaml, HI_VOID *pParamr); + + +/* color format */ +typedef enum hiTDE2_COLOR_FMT_E +{ + TDE2_COLOR_FMT_RGB444 = 0, /**< RGB444 format */ + TDE2_COLOR_FMT_BGR444, /**< BGR444 format */ + TDE2_COLOR_FMT_RGB555, /**< RGB555 format */ + TDE2_COLOR_FMT_BGR555, /**< BGR555 format */ + TDE2_COLOR_FMT_RGB565, /**< RGB565 format */ + TDE2_COLOR_FMT_BGR565, /**< BGR565 format */ + TDE2_COLOR_FMT_RGB888, /**< RGB888 format */ + TDE2_COLOR_FMT_BGR888, /**< BGR888 format */ + TDE2_COLOR_FMT_ARGB4444, /**< ARGB4444 format */ + TDE2_COLOR_FMT_ABGR4444, /**< ABGR4444 format */ + TDE2_COLOR_FMT_RGBA4444, /**< RGBA4444 format */ + TDE2_COLOR_FMT_BGRA4444, /**< BGRA4444 format */ + TDE2_COLOR_FMT_ARGB1555, /**< ARGB1555 format */ + TDE2_COLOR_FMT_ABGR1555, /**< ABGR1555 format */ + TDE2_COLOR_FMT_RGBA1555, /**< RGBA1555 format */ + TDE2_COLOR_FMT_BGRA1555, /**< BGRA1555 format */ + TDE2_COLOR_FMT_ARGB8565, /**< ARGB8565 format */ + TDE2_COLOR_FMT_ABGR8565, /**< ABGR8565 format */ + TDE2_COLOR_FMT_RGBA8565, /**< RGBA8565 format */ + TDE2_COLOR_FMT_BGRA8565, /**< BGRA8565 format */ + TDE2_COLOR_FMT_ARGB8888, /**< ARGB8888 format */ + TDE2_COLOR_FMT_ABGR8888, /**< ABGR8888 format */ + TDE2_COLOR_FMT_RGBA8888, /**< RGBA8888 format */ + TDE2_COLOR_FMT_BGRA8888, /**< BGRA8888 format */ + TDE2_COLOR_FMT_RABG8888, /**= (EXT_REG_BASE)) ? 0 : ISP_REG_BASE) + (BASE)) + +#define IORD_32DIRECT(BASE) IO_READ32(__IO_CALC_ADDRESS_DYNAMIC(BASE)) +#define IORD_16DIRECT(BASE) IO_READ16(__IO_CALC_ADDRESS_DYNAMIC(BASE)) +#define IORD_8DIRECT(BASE) IO_READ8(__IO_CALC_ADDRESS_DYNAMIC(BASE)) + +#define IOWR_32DIRECT(BASE, DATA) IO_WRITE32(__IO_CALC_ADDRESS_DYNAMIC(BASE), (DATA)) +#define IOWR_16DIRECT(BASE, DATA) IO_WRITE16(__IO_CALC_ADDRESS_DYNAMIC(BASE), (DATA)) +#define IOWR_8DIRECT(BASE, DATA) IO_WRITE8(__IO_CALC_ADDRESS_DYNAMIC(BASE), (DATA)) +/*--------------------------------------------------------------------------------------*/ +/* direct write or read ISP regs */ +#define IORD_32DIRECT_ISP_REG(BASE) IO_READ32(ISP_REG_BASE + (BASE)) +#define IORD_16DIRECT_ISP_REG(BASE) IO_READ16(ISP_REG_BASE + (BASE)) +#define IORD_8DIRECT_ISP_REG(BASE) IO_READ8(ISP_REG_BASE + (BASE)) + +#define IOWR_32DIRECT_ISP_REG(BASE, DATA) IO_WRITE32((ISP_REG_BASE + (BASE)), (DATA)) +#define IOWR_16DIRECT_ISP_REG(BASE, DATA) IO_WRITE16((ISP_REG_BASE + (BASE)), (DATA)) +#define IOWR_8DIRECT_ISP_REG(BASE, DATA) IO_WRITE8((ISP_REG_BASE + (BASE)), (DATA)) +/*--------------------------------------------------------------------------------------*/ + +/* write or read vi reg */ +HI_U32 IO_READ32_VI(HI_U32 u32Addr); +HI_S32 IO_WRITE32_VI(HI_U32 u32Addr, HI_U32 u32Value); + +#define __IO_CALC_ADDRESS_DYNAMIC_VI(BASE) (HI_U32)((VI_REG_BASE) + (BASE)) +#define IORD_32DIRECT_VI(BASE) IO_READ32_VI(__IO_CALC_ADDRESS_DYNAMIC_VI(BASE)) +#define IOWR_32DIRECT_VI(BASE, DATA) IO_WRITE32_VI(__IO_CALC_ADDRESS_DYNAMIC_VI(BASE), (DATA)) +/*--------------------------------------------------------------------------------------*/ + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/hifb.h b/device/mpp/sample/hisi_rtsp_demo-master/include/hifb.h new file mode 100644 index 0000000..bb601d3 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/hifb.h @@ -0,0 +1,356 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hifb.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : + Description : + History : + 1.Date : 2009/03/12 + Author : + Modification: Created file +******************************************************************************/ + + +#ifndef __HIFB_H__ +#define __HIFB_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#include "hi_type.h" +#include +/*************************** Structure Definition ****************************/ + +#define IOC_TYPE_HIFB 'F' +/** To obtain the colorkey of an overlay layer */ +#define FBIOGET_COLORKEY_HIFB _IOR(IOC_TYPE_HIFB, 90, HIFB_COLORKEY_S) +/** To set the colorkey of an overlay layer */ +#define FBIOPUT_COLORKEY_HIFB _IOW(IOC_TYPE_HIFB, 91, HIFB_COLORKEY_S) +/** To get the alpha of an overlay layer */ +#define FBIOGET_ALPHA_HIFB _IOR(IOC_TYPE_HIFB, 92, HIFB_ALPHA_S) +/** To set the alpha of an overlay layer */ +#define FBIOPUT_ALPHA_HIFB _IOW(IOC_TYPE_HIFB, 93, HIFB_ALPHA_S) +/** To get the origin of an overlay layer on the screen */ +#define FBIOGET_SCREEN_ORIGIN_HIFB _IOR(IOC_TYPE_HIFB, 94, HIFB_POINT_S) +/** To set the origin of an overlay layer on the screen */ +#define FBIOPUT_SCREEN_ORIGIN_HIFB _IOW(IOC_TYPE_HIFB, 95, HIFB_POINT_S) +/** To obtain the anti-flicker setting of an overlay layer */ +#define FBIOGET_DEFLICKER_HIFB _IOR(IOC_TYPE_HIFB, 98, HIFB_DEFLICKER_S) +/** To set the anti-flicker setting of an overlay layer */ +#define FBIOPUT_DEFLICKER_HIFB _IOW(IOC_TYPE_HIFB, 99, HIFB_DEFLICKER_S) +/** To wait for the vertical blanking region of an overlay layer */ +#define FBIOGET_VBLANK_HIFB _IO(IOC_TYPE_HIFB, 100) +/** To set the display state of an overlay layer */ +#define FBIOPUT_SHOW_HIFB _IOW(IOC_TYPE_HIFB, 101, HI_BOOL) +/** To obtain the display state of an overlay layer */ +#define FBIOGET_SHOW_HIFB _IOR(IOC_TYPE_HIFB, 102, HI_BOOL) +/** to obtain the capability of an overlay layer */ +#define FBIOGET_CAPABILITY_HIFB _IOR(IOC_TYPE_HIFB, 103, HIFB_CAPABILITY_S) +/** set the screen output size */ +#define FBIOPUT_SCREENSIZE _IOW(IOC_TYPE_HIFB, 130, HIFB_SIZE_S*) +/** get the screen output size */ +#define FBIOGET_SCREENSIZE _IOR(IOC_TYPE_HIFB, 131, HIFB_SIZE_S*) + +/** To display multiple surfaces in turn and set the alpha and colorkey attributes */ +#define FBIOFLIP_SURFACE _IOW(IOC_TYPE_HIFB, 132, HIFB_SURFACEEX_S) + +/**To set the compression function status of an overlay layer*/ +#define FBIOPUT_COMPRESSION_HIFB _IOW(IOC_TYPE_HIFB, 133, HI_BOOL) +/**To obtain the compression function status of an overlay layer*/ +#define FBIOGET_COMPRESSION_HIFB _IOR(IOC_TYPE_HIFB, 134, HI_BOOL) + + +typedef struct +{ + HI_U32 u32Width; + HI_U32 u32Height; +}HIFB_SIZE_S; + +static inline HI_U8 hifb_rgb(const struct fb_bitfield* pBit, HI_S32 color) +{ + return ((HI_U8)((((HI_U32)color)>>pBit->offset) << (8-pBit->length)) + + ((HI_U8)(((HI_U32)(color)>>pBit->offset) << (8-pBit->length)) >> pBit->length)); +} + +static inline HI_S32 hifb_color2key(const struct fb_var_screeninfo* pVar, HI_S32 color) +{ + if (pVar->bits_per_pixel <= 8) + { + return color; + } + else + { + HI_U8 r, g, b; + r = hifb_rgb(&pVar->red, color); + g = hifb_rgb(&pVar->green, color); + b = hifb_rgb(&pVar->blue, color); + return (r<<16) + (g<<8) + b; + } +} + +typedef struct +{ + HI_BOOL bKeyEnable; /* colorkey enable flag */ + HI_U32 u32Key; /* colorkey value, maybe contains alpha */ +}HIFB_COLORKEY_S; + +typedef struct +{ + HI_S32 x; + HI_S32 y; + HI_S32 w; + HI_S32 h; +} HIFB_RECT; + +typedef struct +{ + HI_S32 s32XPos; /**< horizontal position */ + HI_S32 s32YPos; /**< vertical position */ +}HIFB_POINT_S; + +typedef struct hiHIFB_DEFLICKER_S +{ + HI_U32 u32HDfLevel; /**< horizontal deflicker level */ + HI_U32 u32VDfLevel; /**< vertical deflicker level */ + HI_U8 *pu8HDfCoef; /**< horizontal deflicker coefficient */ + HI_U8 *pu8VDfCoef; /**< vertical deflicker coefficient */ +}HIFB_DEFLICKER_S; + +/** Alpha info */ +typedef struct +{ + HI_BOOL bAlphaEnable; /**< alpha enable flag */ + HI_BOOL bAlphaChannel; /**< alpha channel enable flag */ + HI_U8 u8Alpha0; /**< alpha0 value, used in ARGB1555 */ + HI_U8 u8Alpha1; /**< alpha1 value, used in ARGB1555 */ + HI_U8 u8GlobalAlpha; /**< global alpha value */ + HI_U8 u8Reserved; +}HIFB_ALPHA_S; + +typedef enum +{ + HIFB_FMT_RGB565 = 0, + HIFB_FMT_RGB888, /**< RGB888 24bpp */ + + HIFB_FMT_KRGB444, /**< RGB444 16bpp */ + HIFB_FMT_KRGB555, /**< RGB555 16bpp */ + HIFB_FMT_KRGB888, /**< RGB888 32bpp */ + + HIFB_FMT_ARGB4444, /**< ARGB4444 */ + HIFB_FMT_ARGB1555, /**< ARGB1555 */ + HIFB_FMT_ARGB8888, /**< ARGB8888 */ + HIFB_FMT_ARGB8565, /**< ARGB8565 */ + + HIFB_FMT_RGBA4444, /**< ARGB4444 */ + HIFB_FMT_RGBA5551, /**< RGBA5551 */ + HIFB_FMT_RGBA5658, /**< RGBA5658 */ + HIFB_FMT_RGBA8888, /**< RGBA8888 */ + + HIFB_FMT_BGR565, /**< BGR565 */ + HIFB_FMT_BGR888, /**< BGR888 */ + HIFB_FMT_ABGR4444, /**< ABGR4444 */ + HIFB_FMT_ABGR1555, /**< ABGR1555 */ + HIFB_FMT_ABGR8888, /**< ABGR8888 */ + HIFB_FMT_ABGR8565, /**< ABGR8565 */ + HIFB_FMT_KBGR444, /**< BGR444 16bpp */ + HIFB_FMT_KBGR555, /**< BGR555 16bpp */ + HIFB_FMT_KBGR888, /**< BGR888 32bpp */ + + HIFB_FMT_1BPP, /**< clut1 */ + HIFB_FMT_2BPP, /**< clut2 */ + HIFB_FMT_4BPP, /**< clut4 */ + HIFB_FMT_8BPP, /**< clut8 */ + HIFB_FMT_ACLUT44, /**< AClUT44*/ + HIFB_FMT_ACLUT88, /**< ACLUT88 */ + HIFB_FMT_PUYVY, /**< UYVY */ + HIFB_FMT_PYUYV, /**< YUYV */ + HIFB_FMT_PYVYU, /**< YVYU */ + HIFB_FMT_YUV888, /**< YUV888 */ + HIFB_FMT_AYUV8888, /**< AYUV8888 */ + HIFB_FMT_YUVA8888, /**< YUVA8888 */ + HIFB_FMT_BUTT +}HIFB_COLOR_FMT_E; + +typedef struct +{ + HI_BOOL bKeyRgb; + HI_BOOL bKeyAlpha; /**< whether support colorkey alpha */ + HI_BOOL bGlobalAlpha; /**< whether support global alpha */ + HI_BOOL bCmap; /**< whether support color map */ + HI_BOOL bHasCmapReg; /**< whether has color map register*/ + HI_BOOL bColFmt[HIFB_FMT_BUTT]; /**< support which color format */ + HI_BOOL bVoScale; /**< support vo scale*/ + HI_BOOL bLayerSupported; /**< whether support a certain layer, for example:x5 HD support HIFB_SD_0 not support HIFB_SD_1*/ + HI_U32 u32MaxWidth; /**< the max pixels per line */ + HI_U32 u32MaxHeight; /**< the max lines */ + HI_U32 u32MinWidth; /**< the min pixels per line */ + HI_U32 u32MinHeight; /**< the min lines */ + HI_U32 u32VDefLevel; /**< vertical deflicker level, 0 means vertical deflicker is unsupported */ + HI_U32 u32HDefLevel; /**< horizontal deflicker level, 0 means horizontal deflicker is unsupported */ + HI_BOOL bDcmp; + HI_BOOL bPreMul; +}HIFB_CAPABILITY_S; + +/*refresh mode*/ +typedef enum +{ + HIFB_LAYER_BUF_DOUBLE = 0x0, /**< 2 display buf in fb */ + HIFB_LAYER_BUF_ONE = 0x1, /**< 1 display buf in fb */ + HIFB_LAYER_BUF_NONE = 0x2, /**< no display buf in fb,the buf user refreshed will be directly set to VO*/ + HIFB_LAYER_BUF_DOUBLE_IMMEDIATE=0x3, /**< 2 display buf in fb, each refresh will be displayed*/ + HIFB_LAYER_BUF_BUTT +} HIFB_LAYER_BUF_E; + +/* surface info */ +typedef struct +{ + HI_U32 u32PhyAddr; /**< start physical address */ + HI_U32 u32Width; /**< width pixels */ + HI_U32 u32Height; /**< height pixels */ + HI_U32 u32Pitch; /**< line pixels */ + HIFB_COLOR_FMT_E enFmt; /**< color format */ +}HIFB_SURFACE_S; + +typedef struct +{ + HI_U32 u32PhyAddr; + HIFB_ALPHA_S stAlpha; + HIFB_COLORKEY_S stColorkey; +}HIFB_SURFACEEX_S; + +/* refresh surface info */ +typedef struct +{ + HIFB_SURFACE_S stCanvas; + HIFB_RECT UpdateRect; /* refresh region*/ +}HIFB_BUFFER_S; + +/* cursor info */ +typedef struct +{ + HIFB_SURFACE_S stCursor; + HIFB_POINT_S stHotPos; +} HIFB_CURSOR_S; + +/* DDR detect zone info */ +typedef struct +{ + HI_U32 u32StartSection; + HI_U32 u32ZoneNums; +} HIFB_DDRZONE_S; + +/* crusor handle */ +/* Attention:surface in cursor will be released by user*/ +#define FBIOPUT_CURSOR_INFO _IOW(IOC_TYPE_HIFB, 104, HIFB_CURSOR_S *) +#define FBIOGET_CURSOR_INFO _IOW(IOC_TYPE_HIFB, 105, HIFB_CURSOR_S *) + +#define FBIOPUT_CURSOR_STATE _IOW(IOC_TYPE_HIFB, 106, HI_BOOL *) +#define FBIOGET_CURSOR_STATE _IOW(IOC_TYPE_HIFB, 107, HI_BOOL *) + +#define FBIOPUT_CURSOR_POS _IOW(IOC_TYPE_HIFB, 108, HIFB_POINT_S *) +#define FBIOGET_CURSOR_POS _IOR(IOC_TYPE_HIFB, 109, HIFB_POINT_S *) + +#define FBIOPUT_CURSOR_COLORKEY _IOR(IOC_TYPE_HIFB, 110, HIFB_COLORKEY_S *) +#define FBIOGET_CURSOR_COLORKEY _IOW(IOC_TYPE_HIFB, 111, HIFB_COLORKEY_S *) +#define FBIOPUT_CURSOR_ALPHA _IOR(IOC_TYPE_HIFB, 112, HIFB_ALPHA_S *) +#define FBIOGET_CURSOR_ALPHA _IOW(IOC_TYPE_HIFB, 113, HIFB_ALPHA_S *) + +/** cursor will be separated from attached layer automatically if you attach cursor to another layer,that means +cursor can be attached to only one layer at any time*/ +#define FBIOPUT_CURSOR_ATTCHCURSOR _IOW(IOC_TYPE_HIFB, 114, HI_U32 *) +#define FBIOPUT_CURSOR_DETACHCURSOR _IOW(IOC_TYPE_HIFB, 115, HI_U32 *) + +/**antiflicker level*/ +/**Auto means fb will choose a appropriate antiflicker level automatically according to the color info of map*/ +typedef enum +{ + HIFB_LAYER_ANTIFLICKER_NONE = 0x0, /**< no antiflicker*/ + HIFB_LAYER_ANTIFLICKER_LOW = 0x1, /**< low level*/ + HIFB_LAYER_ANTIFLICKER_MIDDLE = 0x2,/**< middle level*/ + HIFB_LAYER_ANTIFLICKER_HIGH = 0x3, /**< high level*/ + HIFB_LAYER_ANTIFLICKER_AUTO = 0x4, /**< auto*/ + HIFB_LAYER_ANTIFLICKER_BUTT +}HIFB_LAYER_ANTIFLICKER_LEVEL_E; + +/* MIRROR mode */ +typedef enum +{ + HIFB_MIRROR_NONE = 0x0, + HIFB_MIRROR_HORIZONTAL = 0x1, + HIFB_MIRROR_VERTICAL = 0x2, + HIFB_MIRROR_BOTH= 0x3, + HIFB_MIRROR_BUTT +}HIFB_MIRROR_MODE_E; + +/*layer info maskbit*/ +typedef enum +{ + HIFB_LAYERMASK_BUFMODE = 0x1, /**< BUFMODE bitmask */ + HIFB_LAYERMASK_ANTIFLICKER_MODE = 0x2, /**< ANTIFLICKER_MODE bitmask */ + HIFB_LAYERMASK_POS = 0x4, /**< the position bitmask */ + HIFB_LAYERMASK_CANVASSIZE = 0x8, /**< canvassize bitmask */ + HIFB_LAYERMASK_DISPSIZE = 0x10, /**< displaysize bitmask */ + HIFB_LAYERMASK_SCREENSIZE = 0x20, /**< screensize bitmask */ + HIFB_LAYERMASK_BMUL = 0x40, /**< pre-mult bitmask */ + HIFB_LAYERMASK_BUTT +}HIFB_LAYER_INFO_MASKBIT; + +/**layer info*/ +typedef struct +{ + HIFB_LAYER_BUF_E BufMode; + HIFB_LAYER_ANTIFLICKER_LEVEL_E eAntiflickerLevel; + HI_S32 s32XPos; /**< the x pos of origion point in screen */ + HI_S32 s32YPos; /**< the y pos of origion point in screen */ + HI_S32 u32CanvasWidth; /**< the width of canvas buffer */ + HI_S32 u32CanvasHeight; /**< the height of canvas buffer */ + HI_U32 u32DisplayWidth; /**< the width of display buf in fb.for 0 buf ,there is no display buf in fb, so it's effectless*/ + HI_U32 u32DisplayHeight; /**< the height of display buf in fb. */ + HI_U32 u32ScreenWidth; /**< the width of screen */ + HI_U32 u32ScreenHeight; /**< the height of screen */ + HI_BOOL bPreMul; /**< The data drawed in buf is premul data or not*/ + HI_U32 u32Mask; /**< param modify mask bit*/ +}HIFB_LAYER_INFO_S; + +/** To set the layer information */ +#define FBIOPUT_LAYER_INFO _IOW(IOC_TYPE_HIFB, 120, HIFB_LAYER_INFO_S*) +/** To get the layer information */ +#define FBIOGET_LAYER_INFO _IOR(IOC_TYPE_HIFB, 121, HIFB_LAYER_INFO_S*) +/** To get canvas buf */ +#define FBIOGET_CANVAS_BUFFER _IOR(IOC_TYPE_HIFB, 123, HIFB_BUFFER_S*) +/** To refresh the displayed contents in extended mode */ +#define FBIO_REFRESH _IOW(IOC_TYPE_HIFB, 124, HIFB_BUFFER_S*) + +/**sync refresh*/ +#define FBIO_WAITFOR_FREFRESH_DONE _IO(IOC_TYPE_HIFB, 125) + +/* To set the mirror mode */ +#define FBIOPUT_MIRROR_MODE _IOW(IOC_TYPE_HIFB, 126, HIFB_MIRROR_MODE_E*) +/* To get the mirror mode */ +#define FBIOGET_MIRROR_MODE _IOW(IOC_TYPE_HIFB, 127, HIFB_MIRROR_MODE_E*) + + +/**To set the DDR detect zone of an overlay layer*/ +#define FBIOPUT_MDDRDETECT_HIFB _IOW(IOC_TYPE_HIFB, 135, HIFB_DDRZONE_S*) +/**To get the DDR detect zone of an overlay layer*/ +#define FBIOGET_MDDRDETECT_HIFB _IOW(IOC_TYPE_HIFB, 136, HIFB_DDRZONE_S*) + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif /* __HIFB_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/himedia.h b/device/mpp/sample/hisi_rtsp_demo-master/include/himedia.h new file mode 100644 index 0000000..d265333 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/himedia.h @@ -0,0 +1,83 @@ +#ifndef _LINUX_HIMEDIA_DEVICE_H_ +#define _LINUX_HIMEDIA_DEVICE_H_ + +#include +#include +#include + +#define HIMEDIA_DEVICE_MAJOR 218 +#define HIMEDIA_DYNAMIC_MINOR 255 + +struct himedia_device; + +struct himedia_ops { + //pm methos + int (*pm_prepare)(struct himedia_device *); + void (*pm_complete)(struct himedia_device *); + + int (*pm_suspend)(struct himedia_device *); + int (*pm_resume)(struct himedia_device *); + + int (*pm_freeze)(struct himedia_device *); + int (*pm_thaw)(struct himedia_device *); + int (*pm_poweroff)(struct himedia_device *); + int (*pm_restore)(struct himedia_device *); + + int (*pm_suspend_late)(struct himedia_device *); + int (*pm_resume_early)(struct himedia_device *); + int (*pm_freeze_late)(struct himedia_device *); + int (*pm_thaw_early)(struct himedia_device *); + int (*pm_poweroff_late)(struct himedia_device *); + int (*pm_restore_early)(struct himedia_device *); + + int (*pm_suspend_noirq)(struct himedia_device *); + int (*pm_resume_noirq)(struct himedia_device *); + + int (*pm_freeze_noirq)(struct himedia_device *); + int (*pm_thaw_noirq)(struct himedia_device *); + int (*pm_poweroff_noirq)(struct himedia_device *); + int (*pm_restore_noirq)(struct himedia_device *); +}; + +struct himedia_driver{ + struct device_driver driver; + struct himedia_ops *ops; + char name[1]; +}; + +#define to_himedia_driver(drv) \ + container_of((drv), struct himedia_driver, driver) + +struct himedia_device { + struct list_head list; + +#define MAX_LEN 32 + char devfs_name[MAX_LEN]; + + int minor; + + struct device device; + + struct module *owner; + + const struct file_operations *fops; + + struct himedia_ops *drvops; + + /*for internal use*/ + struct himedia_driver *driver; +}; + + +#define to_himedia_device(dev) \ + container_of((dev), struct himedia_device, device) + +int himedia_register(struct himedia_device *pdev); + +int himedia_unregister(struct himedia_device *pdev); + +#define MODULE_ALIAS_HIMEDIA(minor) \ + MODULE_ALIAS("himedia-char-major-" __stringify(HIMEDIA_DEVICE_MAJOR) \ + "-" __stringify(minor)) + +#endif /*_LINUX_HIMEDIA_DEVICE_H_*/ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/iniparser.h b/device/mpp/sample/hisi_rtsp_demo-master/include/iniparser.h new file mode 100644 index 0000000..61b6a5c --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/iniparser.h @@ -0,0 +1,341 @@ + +/*-------------------------------------------------------------------------*/ +/** + @file iniparser.h + @author N. Devillard + @date Mar 2000 + @version + @brief Parser for ini files. +*/ +/*--------------------------------------------------------------------------*/ + +/* + + + + +*/ +/* + + + + +ʹ˵ +ʹøÿʱ + 1.עⲻҪͬһЩ + 2.secдʱȷ[]ͬһг֡ + 3.secǰ˿ոϷ⣬һַᵼsecʶ + 4.ȷkeyֵͬһУָkeyʶ쳣 + 5.ֵ˫ʼֵȷı˫źַ + ԣűҲΪַһ֡˫ʼַ + ȷĽűҲΪַһ֡Ϊ˱쳣벻Ҫʹ + ˫ţһҪʹãԵŻ˫Ŵ档 + 6.벻Ҫʹ'\r','\n','[',']',';''"',ַЩַ + ֲԤ쳣 + 7.ֵвҪ';'Ϊ';'עͷڵģ';'ַ + ΪעͣһҪʹã''档 + 8. ڱдע͵ʱעⲻҪӢ';'ĵ''죬ע͵ģ + ĵע͡ + +*/ +#ifndef _INIPARSER_H_ +#define _INIPARSER_H_ + +/*--------------------------------------------------------------------------- + Includes + ---------------------------------------------------------------------------*/ + +#include +#include +#include +/*#include +*/ +/* + * The following #include is necessary on many Unixes but not Linux. + * It is not needed for Windows platforms. + * Uncomment it if needed. + */ + + +#include "dictionary.h" +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#define KVCSIZE 512 /*KEY and VALUE and COMMENT'size is 512*/ + + +int iniparser_add_entry( + dictionary * d, + const char * sec, + const char * key, + const char * val);/*20060311 blair modify : Ӽ¼*/ + +/*-------------------------------------------------------------------------*/ +/** + @brief Get number of sections in a dictionary + @param d Dictionary to examine + @return int Number of sections found in dictionary + + This function returns the number of sections found in a dictionary. + The test to recognize sections is done on the string stored in the + dictionary: a section name is given as "section" whereas a key is + stored as "section:key", thus the test looks for entries that do not + contain a colon. + + This clearly fails in the case a section name contains a colon, but + this should simply be avoided. + + This function returns -1 in case of error. + */ +/*--------------------------------------------------------------------------*/ + +int iniparser_getnsec(const dictionary * d); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Get name for section n in a dictionary. + @param d Dictionary to examine + @param n Section number (from 0 to nsec-1). + @return Pointer to char string + + This function locates the n-th section in a dictionary and returns + its name as a pointer to a string statically allocated inside the + dictionary. Do not free or modify the returned string! + + This function returns NULL in case of error. + */ +/*--------------------------------------------------------------------------*/ + +char * iniparser_getsecname(const dictionary * d, const int n); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Save a dictionary to a loadable ini file + @param d Dictionary to dump + @param f Opened file pointer to dump to + @return void + + This function dumps a given dictionary into a loadable ini file. + It is Ok to specify @c stderr or @c stdout as output files. + */ +/*--------------------------------------------------------------------------*/ + +void iniparser_dump_ini(const dictionary * d, FILE * f); + +/*-------------------------------------------------------------------------*/ +/** + @brief Dump a dictionary to an opened file pointer. + @param d Dictionary to dump. + @param f Opened file pointer to dump to. + @return void + + This function prints out the contents of a dictionary, one element by + line, onto the provided file pointer. It is OK to specify @c stderr + or @c stdout as output files. This function is meant for debugging + purposes mostly. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_dump(dictionary * d, FILE * f); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key, return NULL if not found + @param d Dictionary to search + @param key Key string to look for + @return pointer to statically allocated character string, or NULL. + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + NULL is returned. + The returned char pointer is pointing to a string allocated in + the dictionary, do not free or modify it. + + This function is only provided for backwards compatibility with + previous versions of iniparser. It is recommended to use + iniparser_getstring() instead. + */ +/*--------------------------------------------------------------------------*/ +char * iniparser_getstr(const dictionary * d, const char * key); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key + @param d Dictionary to search + @param key Key string to look for + @param def Default value to return if key not found. + @return pointer to statically allocated character string + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + the pointer passed as 'def' is returned. + The returned char pointer is pointing to a string allocated in + the dictionary, do not free or modify it. + */ +/*--------------------------------------------------------------------------*/ +char * iniparser_getstring(const dictionary * d, const char * key, char * def); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key, convert to an int + @param d Dictionary to search + @param key Key string to look for + @param notfound Value to return in case of error + @return integer + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + the notfound value is returned. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_getint(const dictionary * d, const char * key, const int notfound); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key, convert to a double + @param d Dictionary to search + @param key Key string to look for + @param notfound Value to return in case of error + @return double + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + the notfound value is returned. + */ +/*--------------------------------------------------------------------------*/ +double iniparser_getdouble(const dictionary * d, const char * key, const double notfound); + +/*-------------------------------------------------------------------------*/ +/** + @brief Get the string associated to a key, convert to a boolean + @param d Dictionary to search + @param key Key string to look for + @param notfound Value to return in case of error + @return integer + + This function queries a dictionary for a key. A key as read from an + ini file is given as "section:key". If the key cannot be found, + the notfound value is returned. + + A true boolean is found if one of the following is matched: + + - A string starting with 'y' + - A string starting with 'Y' + - A string starting with 't' + - A string starting with 'T' + - A string starting with '1' + + A false boolean is found if one of the following is matched: + + - A string starting with 'n' + - A string starting with 'N' + - A string starting with 'f' + - A string starting with 'F' + - A string starting with '0' + + The notfound value returned if no boolean is identified, does not + necessarily have to be 0 or 1. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_getboolean(const dictionary * d, const char * key, const int notfound); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Set an entry in a dictionary. + @param ini Dictionary to modify. + @param entry Entry to modify (entry name) + @param val New value to associate to the entry. + @return int 0 if Ok, -1 otherwise. + + If the given entry can be found in the dictionary, it is modified to + contain the provided value. If it cannot be found, -1 is returned. + It is Ok to set val to NULL. + */ +/*--------------------------------------------------------------------------*/ + +int iniparser_setstr(const dictionary * ini, const char * entry, const char * val); + +/*-------------------------------------------------------------------------*/ +/** + @brief Delete an entry in a dictionary + @param ini Dictionary to modify + @param entry Entry to delete (entry name) + @return void + + If the given entry can be found, it is deleted from the dictionary. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_unset(dictionary * ini, const char * entry); + +/*-------------------------------------------------------------------------*/ +/** + @brief Finds out if a given entry exists in a dictionary + @param ini Dictionary to search + @param entry Name of the entry to look for + @return integer 1 if entry exists, 0 otherwise + + Finds out if a given entry exists in the dictionary. Since sections + are stored as keys with NULL associated values, this is the only way + of querying for the presence of sections in a dictionary. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_find_entry(const dictionary * ini, const char * entry) ; + +/*-------------------------------------------------------------------------*/ +/** + @brief Parse an ini file and return an allocated dictionary object + @param ininame Name of the ini file to read. + @return Pointer to newly allocated dictionary + + This is the parser for ini files. This function is called, providing + the name of the file to be read. It returns a dictionary object that + should not be accessed directly, but through accessor functions + instead. + + The returned dictionary must be freed using iniparser_freedict(). + + */ +/*--------------------------------------------------------------------------*/ +dictionary * iniparser_load(const char * ininame); + + +/*2006/03/11 blair add : save comment and space Line*/ +int iniparser_add_comment( + dictionary *d, + const char *sec, + const char *key, + const char *comment, + const unsigned char place); + + +/*-------------------------------------------------------------------------*/ +/** + @brief Free all memory associated to an ini dictionary + @param d Dictionary to free + @return void + + Free all memory associated to an ini dictionary. + It is mandatory to call this function before the dictionary object + gets out of the current context. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_freedict(dictionary * d); + +int iniparser_sec_getNLowLever(const dictionary * d,const char* UperLever); +char* iniparser_sec_getLowLever(const dictionary * d,const char* UpLever, int n); +void iniparser_mem_printf(const dictionary * d); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/ivs_md.h b/device/mpp/sample/hisi_rtsp_demo-master/include/ivs_md.h new file mode 100644 index 0000000..c24f171 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/ivs_md.h @@ -0,0 +1,164 @@ +/****************************************************************************** + + Copyright (C), 2001-2014, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : ivs_md.h + Version : Initial Draft + Author : Hisilicon multimedia software (IVE) group + Created : 2014/11/10 + Description : + History : + 1.Date : 2014/11/10 + Author : c00211359 + Modification: Created file +******************************************************************************/ + +#ifndef _HI_IVS_MD_H_ +#define _HI_IVS_MD_H_ + +#include "hi_md.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/***************************************************************************** +* Prototype : HI_IVS_MD_Init +* Description : Motion Detection(MD) initialization. +* Parameters : HI_VOID. +* +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_Init(HI_VOID); + +/***************************************************************************** +* Prototype : HI_IVS_MD_Exit +* Description : Motion Detection(MD) exit. +* Parameters : HI_VOID. +* +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_Exit(HI_VOID); + +/***************************************************************************** +* Prototype : HI_IVS_MD_CreateChn +* Description : Create Motion Detection(MD) Chn. +* Parameters : MD_CHN MdChn Md chn. +* MD_ATTR_S *pstMdAttr Md attribute parameters +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_CreateChn(MD_CHN MdChn,MD_ATTR_S *pstMdAttr); + +/***************************************************************************** +* Prototype : HI_IVS_MD_DestroyChn +* Description : Destroy Motion Detection(MD) chn. +* Parameters : MD_CHN MdChn Md chn that would be destroy. +* +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_DestroyChn(MD_CHN MdChn); + +/***************************************************************************** +* Prototype : HI_IVS_MD_SetChnAttr +* Description : Set Motion Detection(MD) chn attribute. +* Parameters : MD_CHN MdChn Md chn. +* MD_ATTR_S *pstMdAttr Md attribute parameters +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2015/04/10 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_SetChnAttr(MD_CHN MdChn,MD_ATTR_S *pstMdAttr); + +/***************************************************************************** +* Prototype : HI_IVS_MD_GetChnAttr +* Description : Get Motion Detection(MD) chn attribute. +* Parameters : MD_CHN MdChn Md chn. +* MD_ATTR_S *pstMdAttr Md attribute parameters +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2015/04/10 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_GetChnAttr(MD_CHN MdChn,MD_ATTR_S *pstMdAttr); + +/***************************************************************************** +* Prototype : HI_IVS_MD_GetBg +* Description : Get Motion Detection(MD) background image. +* Parameters : MD_CHN MdChn Md chn. +* IVE_DST_IMAGE_S *pstBg Output background image +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_GetBg(MD_CHN MdChn,IVE_DST_IMAGE_S *pstBg); + +/***************************************************************************** +* Prototype : HI_IVS_MD_Process +* Description : Motion Detection(MD) process. +* Parameters : MD_CHN MdChn Md chn. +* IVE_SRC_IMAGE_S *pstCur Current image +* IVE_SRC_IMAGE_S *pstRef Reference image +* IVE_DST_MEM_INFO_S *pstBlob Output blob +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014/11/11 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_IVS_MD_Process(MD_CHN MdChn,IVE_SRC_IMAGE_S *pstCur, + IVE_SRC_IMAGE_S *pstRef,IVE_DST_MEM_INFO_S *pstBlob); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif +#endif/*_HI_IVS_MD_H_*/ \ No newline at end of file diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/list.h b/device/mpp/sample/hisi_rtsp_demo-master/include/list.h new file mode 100644 index 0000000..8bf3653 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/list.h @@ -0,0 +1,149 @@ +/* + * Copyright (c) HighPoint Technologies, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/dev/hptrr/list.h,v 1.2.2.1.4.1 2010/06/14 02:09:06 kensmith Exp $ + */ +/* + * $Id: list.h,v 1.6 2006/10/31 06:25:28 gmm Exp $ + * Copyright (C) 2004-2005 HighPoint Technologies, Inc. All rights reserved. + */ +#ifndef _HPT_LIST_H_ +#define _HPT_LIST_H_ + +#ifndef _LINUX_LIST_H + +#ifndef HPT_INLINE +#define HPT_INLINE __inline +#endif + +typedef unsigned long HPT_UPTR; + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define INIT_LIST_HEAD(ptr) do { (ptr)->next = (ptr); (ptr)->prev = (ptr); } while (0) + +static HPT_INLINE void __list_add(struct list_head * _new, struct list_head * prev, struct list_head * next) +{ + next->prev = _new; + _new->next = next; + _new->prev = prev; + prev->next = _new; +} + +static HPT_INLINE void list_add(struct list_head *_new, struct list_head *head) +{ + __list_add(_new, head, head->next); +} + +static HPT_INLINE void list_add_tail(struct list_head *_new, struct list_head *head) +{ + __list_add(_new, head->prev, head); +} + +static HPT_INLINE void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +static HPT_INLINE void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); +} + +static HPT_INLINE void list_del_init(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + INIT_LIST_HEAD(entry); +} + +static inline void list_move(struct list_head *list, struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add(list, head); +} + +static inline void list_move_tail(struct list_head *list, + struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add_tail(list, head); +} + +static HPT_INLINE int list_empty(struct list_head *head) +{ + return head->next == head; +} + +static HPT_INLINE void __list_splice(struct list_head *list, + struct list_head *head) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + struct list_head *at = head->next; + + first->prev = head; + head->next = first; + + last->next = at; + at->prev = last; +} + +static HPT_INLINE void list_splice(struct list_head *list, struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head); +} + +static HPT_INLINE void list_splice_init(struct list_head *list, struct list_head *head) +{ + if (!list_empty(list)) { + __list_splice(list, head); + INIT_LIST_HEAD(list); + } +} + +/*#define list_entry(ptr, type, member) \ + ((type *)((char *)(ptr)-(HPT_UPTR)(&((type *)0)->member))) */ +#define list_entry(ptr, type, member) \ + ((type *)((unsigned long)(ptr)-((unsigned long)(&((type *)1)->member) - 1))) + +#define list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +#define get_first_item(attached, type, member) \ + ((type *)((char *)((attached)->next)-(HPT_UPTR)(&((type *)0)->member))) + +#endif + +#endif diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_adec.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_adec.h new file mode 100644 index 0000000..615b742 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_adec.h @@ -0,0 +1,53 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : ai.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/6/15 + Description : + History : + 1.Date : 2009/6/19 + Author : p00123320 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_ADEC_H__ +#define __MPI_ADEC_H__ + +#include "hi_common.h" +#include "hi_comm_aio.h" +#include "hi_comm_adec.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_ADEC_CreateChn(ADEC_CHN AdChn, ADEC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_ADEC_DestroyChn(ADEC_CHN AdChn); + +HI_S32 HI_MPI_ADEC_SendStream(ADEC_CHN AdChn, const AUDIO_STREAM_S *pstStream, HI_BOOL bBlock); + +HI_S32 HI_MPI_ADEC_ClearChnBuf(ADEC_CHN AdChn); + +HI_S32 HI_MPI_ADEC_RegeisterDecoder(HI_S32 *ps32Handle, ADEC_DECODER_S *pstDecoder); +HI_S32 HI_MPI_ADEC_UnRegisterDecoder(HI_S32 s32Handle); + +HI_S32 HI_MPI_ADEC_GetFrame(ADEC_CHN AdChn, AUDIO_FRAME_INFO_S *pstFrmInfo, HI_BOOL bBlock); +HI_S32 HI_MPI_ADEC_ReleaseFrame(ADEC_CHN AdChn, AUDIO_FRAME_INFO_S *pstFrmInfo); +HI_S32 HI_MPI_ADEC_SendEndOfStream(ADEC_CHN AdChn, HI_BOOL bInstant); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_ADEC_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ae.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ae.h new file mode 100644 index 0000000..2900b0c --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ae.h @@ -0,0 +1,71 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_ae.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2014/04/01 + Description : + History : + 1.Date : 2014/04/01 + Author : h00191408 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_AE_H__ +#define __MPI_AE_H__ + +#include "hi_comm_isp.h" +#include "hi_comm_3a.h" +#include "hi_ae_comm.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +/* The interface of ae lib register to isp. */ +HI_S32 HI_MPI_AE_Register(ISP_DEV IspDev, ALG_LIB_S *pstAeLib); +HI_S32 HI_MPI_AE_UnRegister(ISP_DEV IspDev, ALG_LIB_S *pstAeLib); + +/* The callback function of sensor register to ae lib. */ +HI_S32 HI_MPI_AE_SensorRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAeLib, SENSOR_ID SensorId, + AE_SENSOR_REGISTER_S *pstRegister); +HI_S32 HI_MPI_AE_SensorUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAeLib, SENSOR_ID SensorId); + +HI_S32 HI_MPI_ISP_SetExposureAttr(ISP_DEV IspDev, const ISP_EXPOSURE_ATTR_S *pstExpAttr); +HI_S32 HI_MPI_ISP_GetExposureAttr(ISP_DEV IspDev, ISP_EXPOSURE_ATTR_S *pstExpAttr); + +HI_S32 HI_MPI_ISP_SetAERouteAttr(ISP_DEV IspDev, const ISP_AE_ROUTE_S *pstAERouteAttr); +HI_S32 HI_MPI_ISP_GetAERouteAttr(ISP_DEV IspDev, ISP_AE_ROUTE_S *pstAERouteAttr); + +HI_S32 HI_MPI_ISP_QueryExposureInfo(ISP_DEV IspDev, ISP_EXP_INFO_S *pstExpInfo); + +HI_S32 HI_MPI_ISP_SetIrisAttr(ISP_DEV IspDev, const ISP_IRIS_ATTR_S *pstIrisAttr); +HI_S32 HI_MPI_ISP_GetIrisAttr(ISP_DEV IspDev, ISP_IRIS_ATTR_S *pstIrisAttr); + +HI_S32 HI_MPI_ISP_SetDcirisAttr(ISP_DEV IspDev, const ISP_DCIRIS_ATTR_S *pstDcirisAttr); +HI_S32 HI_MPI_ISP_GetDcirisAttr(ISP_DEV IspDev, ISP_DCIRIS_ATTR_S *pstDcirisAttr); + +HI_S32 HI_MPI_ISP_SetPirisAttr(ISP_DEV IspDev, const ISP_PIRIS_ATTR_S *pstPirisAttr); +HI_S32 HI_MPI_ISP_GetPirisAttr(ISP_DEV IspDev, ISP_PIRIS_ATTR_S *pstPirisAttr); + +HI_S32 HI_MPI_ISP_SetAERouteAttrEx(ISP_DEV IspDev, const ISP_AE_ROUTE_EX_S *pstAERouteAttrEx); +HI_S32 HI_MPI_ISP_GetAERouteAttrEx(ISP_DEV IspDev, ISP_AE_ROUTE_EX_S *pstAERouteAttrEx); + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif + + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_aenc.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_aenc.h new file mode 100644 index 0000000..2c7cced --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_aenc.h @@ -0,0 +1,55 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : ai.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/6/15 + Description : + History : + 1.Date : 2009/6/15 + Author : p00123320 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_AENC_H__ +#define __MPI_AENC_H__ + +#include "hi_common.h" +#include "hi_comm_aio.h" +#include "hi_comm_aenc.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +#define AENC_ADAPT_MAGIC 0Xfcfcfcfc + +HI_S32 HI_MPI_AENC_CreateChn(AENC_CHN AeChn, const AENC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_AENC_DestroyChn(AENC_CHN AeChn); + +HI_S32 HI_MPI_AENC_SendFrame(AENC_CHN AeChn, const AUDIO_FRAME_S *pstFrm, const AEC_FRAME_S *pstAecFrm); + +HI_S32 HI_MPI_AENC_GetStream(AENC_CHN AeChn, AUDIO_STREAM_S *pstStream, HI_S32 s32MilliSec); +HI_S32 HI_MPI_AENC_ReleaseStream(AENC_CHN AeChn, const AUDIO_STREAM_S *pstStream); + +HI_S32 HI_MPI_AENC_GetFd(AENC_CHN AeChn); + +HI_S32 HI_MPI_AENC_RegeisterEncoder(HI_S32 *ps32Handle, AENC_ENCODER_S *pstEncoder); +HI_S32 HI_MPI_AENC_UnRegisterEncoder(HI_S32 s32Handle); + +HI_S32 HI_MPI_AENC_SaveFile(AENC_CHN AeChn, AUDIO_SAVE_FILE_INFO_S *pstSaveFileInfo); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_AENC_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_af.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_af.h new file mode 100644 index 0000000..296d596 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_af.h @@ -0,0 +1,60 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_af.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/19 + Description : + History : + 1.Date : 2012/12/19 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_AF_H__ +#define __MPI_AF_H__ + +#include "hi_comm_isp.h" +#include "hi_comm_3a.h" +#include "hi_af_comm.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/* The interface of af lib register to isp. */ +HI_S32 HI_MPI_AF_Register(ISP_DEV IspDev, ALG_LIB_S *pstAfLib); +HI_S32 HI_MPI_AF_UnRegister(ISP_DEV IspDev, ALG_LIB_S *pstAfLib); + +#if 0 +/* The callback function of sensor register to af lib. */ +HI_S32 hi_af_sensor_register_cb(ALG_LIB_S *pstAfLib, SENSOR_ID SensorId, + CMOS_ISP_AF_DEFAULT_S *pstSnsDft, SENSOR_AF_EXP_FUNC_S *pstSnsExp); +#endif + +/* The new awb lib is compatible with the old mpi interface. */ +HI_S32 HI_MPI_ISP_SetFocusType(ISP_DEV IspDev, ISP_OP_TYPE_E enFocusType); //not support yet +HI_S32 HI_MPI_ISP_GetFocusType(ISP_DEV IspDev, ISP_OP_TYPE_E *penFocusType); //not support yet + +HI_S32 HI_MPI_ISP_SetAFAttr(ISP_DEV IspDev, const ISP_AF_ATTR_S *pstAFAttr); //not support yet +HI_S32 HI_MPI_ISP_GetAFAttr(ISP_DEV IspDev, ISP_AF_ATTR_S *pstAFAttr); //not support yet + +HI_S32 HI_MPI_ISP_SetMFAttr(ISP_DEV IspDev, const ISP_MF_ATTR_S *pstMFAttr); //not support yet +HI_S32 HI_MPI_ISP_GetMFAttr(ISP_DEV IspDev, ISP_MF_ATTR_S *pstMFAttr); //not support yet + +HI_S32 HI_MPI_ISP_ManualFocusMove(ISP_DEV IspDev, HI_S32 s32MoveSteps); //not support yet + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ai.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ai.h new file mode 100644 index 0000000..41c4cdf --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ai.h @@ -0,0 +1,75 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_ai.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_AI_H__ +#define __MPI_AI_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_aio.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_AI_SetPubAttr(AUDIO_DEV AudioDevId, const AIO_ATTR_S *pstAttr); +HI_S32 HI_MPI_AI_GetPubAttr(AUDIO_DEV AudioDevId, AIO_ATTR_S *pstAttr); + +HI_S32 HI_MPI_AI_Enable(AUDIO_DEV AudioDevId); +HI_S32 HI_MPI_AI_Disable(AUDIO_DEV AudioDevId); + +HI_S32 HI_MPI_AI_EnableChn(AUDIO_DEV AudioDevId, AI_CHN AiChn); +HI_S32 HI_MPI_AI_DisableChn(AUDIO_DEV AudioDevId, AI_CHN AiChn); + +HI_S32 HI_MPI_AI_GetFrame(AUDIO_DEV AudioDevId, AI_CHN AiChn, AUDIO_FRAME_S *pstFrm, AEC_FRAME_S *pstAecFrm, HI_S32 s32MilliSec); +HI_S32 HI_MPI_AI_ReleaseFrame(AUDIO_DEV AudioDevId, AI_CHN AiChn, AUDIO_FRAME_S *pstFrm, AEC_FRAME_S *pstAecFrm); + +HI_S32 HI_MPI_AI_SetChnParam(AUDIO_DEV AudioDevId, AI_CHN AiChn, AI_CHN_PARAM_S *pstChnParam); +HI_S32 HI_MPI_AI_GetChnParam(AUDIO_DEV AudioDevId, AI_CHN AiChn, AI_CHN_PARAM_S *pstChnParam); + +HI_S32 HI_MPI_AI_SetVqeAttr(AUDIO_DEV AiDevId, AI_CHN AiChn, AUDIO_DEV AoDevId, AO_CHN AoChn, AI_VQE_CONFIG_S *pstVqeConfig); +HI_S32 HI_MPI_AI_GetVqeAttr(AUDIO_DEV AiDevId, AI_CHN AiChn, AI_VQE_CONFIG_S *pstVqeConfig); +HI_S32 HI_MPI_AI_EnableVqe(AUDIO_DEV AiDevId, AI_CHN AiChn); +HI_S32 HI_MPI_AI_DisableVqe(AUDIO_DEV AiDevId, AI_CHN AiChn); + +HI_S32 HI_MPI_AI_EnableReSmp(AUDIO_DEV AudioDevId, AI_CHN AiChn, AUDIO_SAMPLE_RATE_E enOutSampleRate); +HI_S32 HI_MPI_AI_DisableReSmp(AUDIO_DEV AudioDevId, AI_CHN AiChn); + +HI_S32 HI_MPI_AI_SetTrackMode(AUDIO_DEV AudioDevId, AUDIO_TRACK_MODE_E enTrackMode); +HI_S32 HI_MPI_AI_GetTrackMode(AUDIO_DEV AudioDevId, AUDIO_TRACK_MODE_E *penTrackMode); +HI_S32 HI_MPI_AI_SaveFile(AUDIO_DEV AudioDevId, AI_CHN AiChn, AUDIO_SAVE_FILE_INFO_S *pstSaveFileInfo); + +HI_S32 HI_MPI_AI_ClrPubAttr(AUDIO_DEV AudioDevId); + +HI_S32 HI_MPI_AI_GetFd(AUDIO_DEV AudioDevId, AI_CHN AiChn); + +HI_S32 HI_MPI_AI_SetVqeVolume(AUDIO_DEV AudioDevId, AI_CHN AiChn, HI_S32 s32VolumeDb); +HI_S32 HI_MPI_AI_GetVqeVolume(AUDIO_DEV AudioDevId, AI_CHN AiChn, HI_S32 *ps32VolumeDb); + +HI_S32 HI_MPI_AI_EnableAecRefFrame(AUDIO_DEV AiDevId, AI_CHN AiChn, AUDIO_DEV AoDevId, AO_CHN AoChn); +HI_S32 HI_MPI_AI_DisableAecRefFrame(AUDIO_DEV AiDevId, AI_CHN AiChn); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_AI_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ao.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ao.h new file mode 100644 index 0000000..c5a1c1e --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ao.h @@ -0,0 +1,73 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_ao.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2009/5/5 + Description : + History : + 1.Date : 2009/5/5 + Author : p00123320 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_AO_H__ +#define __MPI_AO_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_aio.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_AO_SetPubAttr(AUDIO_DEV AudioDevId, const AIO_ATTR_S *pstAttr); +HI_S32 HI_MPI_AO_GetPubAttr(AUDIO_DEV AudioDevId, AIO_ATTR_S *pstAttr); + +HI_S32 HI_MPI_AO_Enable(AUDIO_DEV AudioDevId); +HI_S32 HI_MPI_AO_Disable(AUDIO_DEV AudioDevId); + +HI_S32 HI_MPI_AO_EnableChn(AUDIO_DEV AudioDevId, AO_CHN AoChn); +HI_S32 HI_MPI_AO_DisableChn(AUDIO_DEV AudioDevId, AO_CHN AoChn); + +HI_S32 HI_MPI_AO_SendFrame(AUDIO_DEV AudioDevId, AO_CHN AoChn, const AUDIO_FRAME_S *pstData, HI_S32 s32MilliSec); + +HI_S32 HI_MPI_AO_EnableReSmp(AUDIO_DEV AudioDevId, AO_CHN AoChn, AUDIO_SAMPLE_RATE_E enInSampleRate); +HI_S32 HI_MPI_AO_DisableReSmp(AUDIO_DEV AudioDevId, AO_CHN AoChn); + +HI_S32 HI_MPI_AO_ClearChnBuf(AUDIO_DEV AudioDevId ,AO_CHN AoChn); +HI_S32 HI_MPI_AO_QueryChnStat(AUDIO_DEV AudioDevId ,AO_CHN AoChn, AO_CHN_STATE_S *pstStatus); + +HI_S32 HI_MPI_AO_PauseChn(AUDIO_DEV AudioDevId, AO_CHN AoChn); +HI_S32 HI_MPI_AO_ResumeChn(AUDIO_DEV AudioDevId, AO_CHN AoChn); + +HI_S32 HI_MPI_AO_SetVolume(AUDIO_DEV AudioDevId, HI_S32 s32VolumeDb); +HI_S32 HI_MPI_AO_GetVolume(AUDIO_DEV AudioDevId, HI_S32 *ps32VolumeDb); + +HI_S32 HI_MPI_AO_SetMute(AUDIO_DEV AudioDevId, HI_BOOL bEnable, AUDIO_FADE_S *pstFade); +HI_S32 HI_MPI_AO_GetMute(AUDIO_DEV AudioDevId, HI_BOOL *pbEnable, AUDIO_FADE_S *pstFade); + +HI_S32 HI_MPI_AO_SetTrackMode(AUDIO_DEV AudioDevId, AUDIO_TRACK_MODE_E enTrackMode); +HI_S32 HI_MPI_AO_GetTrackMode(AUDIO_DEV AudioDevId, AUDIO_TRACK_MODE_E *penTrackMode); + +HI_S32 HI_MPI_AO_GetFd(AUDIO_DEV AudioDevId, AO_CHN AoChn); + +HI_S32 HI_MPI_AO_ClrPubAttr(AUDIO_DEV AudioDevId); +HI_S32 HI_MPI_AO_SetVqeAttr(AUDIO_DEV AudioDevId, AO_CHN AoChn, AO_VQE_CONFIG_S *pstVqeConfig); +HI_S32 HI_MPI_AO_GetVqeAttr(AUDIO_DEV AudioDevId, AO_CHN AoChn, AO_VQE_CONFIG_S *pstVqeConfig); +HI_S32 HI_MPI_AO_EnableVqe(AUDIO_DEV AudioDevId, AO_CHN AoChn); +HI_S32 HI_MPI_AO_DisableVqe(AUDIO_DEV AudioDevId, AO_CHN AoChn); +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_AO_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_awb.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_awb.h new file mode 100644 index 0000000..606b67f --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_awb.h @@ -0,0 +1,67 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_awb.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/12/19 + Description : + History : + 1.Date : 2012/12/19 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_AWB_H__ +#define __MPI_AWB_H__ + +#include "hi_comm_isp.h" +#include "hi_comm_3a.h" +#include "hi_awb_comm.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/* The interface of awb lib register to isp. */ +HI_S32 HI_MPI_AWB_Register(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib); +HI_S32 HI_MPI_AWB_UnRegister(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib); + +/* The callback function of sensor register to awb lib. */ +HI_S32 HI_MPI_AWB_SensorRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib, SENSOR_ID SensorId, + AWB_SENSOR_REGISTER_S *pstRegister); +HI_S32 HI_MPI_AWB_SensorUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib, SENSOR_ID SensorId); + +HI_S32 HI_MPI_ISP_AWBLibRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAWBLib, + ISP_AWB_REGISTER_S *pstRegister); + + +HI_S32 HI_MPI_ISP_SetWBAttr(ISP_DEV IspDev, const ISP_WB_ATTR_S *pstWBAttr); +HI_S32 HI_MPI_ISP_GetWBAttr(ISP_DEV IspDev, ISP_WB_ATTR_S *pstWBAttr); + +HI_S32 HI_MPI_ISP_SetAWBAttrEx(ISP_DEV IspDev, ISP_AWB_ATTR_EX_S *pstAWBAttrEx); +HI_S32 HI_MPI_ISP_GetAWBAttrEx(ISP_DEV IspDev, ISP_AWB_ATTR_EX_S *pstAWBAttrEx); + +HI_S32 HI_MPI_ISP_SetCCMAttr(ISP_DEV IspDev, const ISP_COLORMATRIX_ATTR_S *pstCCMAttr); +HI_S32 HI_MPI_ISP_GetCCMAttr(ISP_DEV IspDev, ISP_COLORMATRIX_ATTR_S *pstCCMAttr); + +HI_S32 HI_MPI_ISP_SetSaturationAttr(ISP_DEV IspDev, const ISP_SATURATION_ATTR_S *pstSatAttr); +HI_S32 HI_MPI_ISP_GetSaturationAttr(ISP_DEV IspDev, ISP_SATURATION_ATTR_S *pstSatAttr); + +HI_S32 HI_MPI_ISP_SetColorToneAttr(ISP_DEV IspDev, const ISP_COLOR_TONE_ATTR_S *pstCTAttr); +HI_S32 HI_MPI_ISP_GetColorToneAttr(ISP_DEV IspDev, ISP_COLOR_TONE_ATTR_S *pstCTAttr); + +HI_S32 HI_MPI_ISP_QueryWBInfo(ISP_DEV IspDev, ISP_WB_INFO_S *pstWBInfo); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_fisheye.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_fisheye.h new file mode 100644 index 0000000..f65a10c --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_fisheye.h @@ -0,0 +1,140 @@ +/****************************************************************************** + + Copyright (C), 2013-2033, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_fisheye.h + Version : Initial Draft + Author : Hisilicon Hi35xx MPP Team + Created : 20115/06/29 + Last Modified : + Description : mpi functions declaration + Function List : + History : +******************************************************************************/ +#ifndef __MPI_FISHEYE_H__ +#define __MPI_FISHEYE_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_fisheye.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_BeginJob + Description : Begin a fisheye job,then add task into the job,fisheye will finish all the task in the job. + Input : FISHEYE_HANDLE *phHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 20115/06/29 + Author : c00191088 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_FISHEYE_BeginJob(FISHEYE_HANDLE *phHandle); + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_EndJob + Description : End a job,all tasks in the job will be submmitted to fisheye + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 20115/06/29 + Author : c00191088 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_FISHEYE_EndJob(FISHEYE_HANDLE hHandle); + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_CancelJob + Description : Cancel a job ,then all tasks in the job will not be submmitted to fisheye + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 20115/06/29 + Author : c00191088 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_FISHEYE_CancelJob(FISHEYE_HANDLE hHandle); + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_AddScaleTask + Description : Add a task to a fisheye job + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 20115/06/29 + Author : c00191088 + Modification : Created function +<$/> +*****************************************************************************/ + HI_S32 HI_MPI_FISHEYE_AddCorrectionTask(FISHEYE_HANDLE hHandle, FISHEYE_TASK_ATTR_S *pstTask, const FISHEYE_ATTR_S *pstFisheyeAttr); + + + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_AddDrawLineTask + Description : add a draw line task into a job + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_FISHEYE_AddLdcTask(FISHEYE_HANDLE hHandle, FISHEYE_TASK_ATTR_S * pstTask, LDC_ATTR_S * pstFisheyeAddLdc); + +/***************************************************************************** + Prototype : HI_MPI_FISHEYE_AddCoverTask + Description : add a draw point task into a job + Input : FISHEYE_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ + HI_S32 HI_MPI_FISHEYE_AddPmfTask(FISHEYE_HANDLE hHandle, FISHEYE_TASK_ATTR_S *pstTask, FISHEYE_ADD_PMF_S *pstFisheyeAddPmf); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_FISHEYE_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_isp.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_isp.h new file mode 100644 index 0000000..496b70d --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_isp.h @@ -0,0 +1,162 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_isp.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2010/12/20 + Description : + History : + 1.Date : 2010/12/20 + Author : x00100808 + Modification: Created file + +******************************************************************************/ + +#ifndef __MPI_ISP_H__ +#define __MPI_ISP_H__ + +#include "hi_comm_isp.h" +#include "hi_comm_sns.h" +#include "hi_comm_3a.h" +#include "hi_comm_video.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +/* Firmware Main Operation */ +HI_S32 HI_MPI_ISP_Init(ISP_DEV IspDev); +HI_S32 HI_MPI_ISP_MemInit(ISP_DEV IspDev); +HI_S32 HI_MPI_ISP_Run(ISP_DEV IspDev); +HI_S32 HI_MPI_ISP_Exit(ISP_DEV IspDev); + +HI_S32 HI_MPI_ISP_SensorRegCallBack(ISP_DEV IspDev, SENSOR_ID SensorId, ISP_SENSOR_REGISTER_S *pstRegister); +HI_S32 HI_MPI_ISP_SensorUnRegCallBack(ISP_DEV IspDev, SENSOR_ID SensorId); + +/* if have registered multy libs, set bind attr to appoint the active lib. */ +HI_S32 HI_MPI_ISP_SetBindAttr(ISP_DEV IspDev, const ISP_BIND_ATTR_S *pstBindAttr); +HI_S32 HI_MPI_ISP_GetBindAttr(ISP_DEV IspDev, ISP_BIND_ATTR_S *pstBindAttr); +HI_S32 HI_MPI_ISP_AELibRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAeLib, + ISP_AE_REGISTER_S *pstRegister); +HI_S32 HI_MPI_ISP_AWBLibRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib, + ISP_AWB_REGISTER_S *pstRegister); +HI_S32 HI_MPI_ISP_AFLibRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAfLib, + ISP_AF_REGISTER_S *pstRegister); +HI_S32 HI_MPI_ISP_AELibUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAeLib); +HI_S32 HI_MPI_ISP_AWBLibUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAwbLib); +HI_S32 HI_MPI_ISP_AFLibUnRegCallBack(ISP_DEV IspDev, ALG_LIB_S *pstAfLib); + +HI_S32 HI_MPI_ISP_SetPubAttr(ISP_DEV IspDev, const ISP_PUB_ATTR_S *pstPubAttr); +HI_S32 HI_MPI_ISP_GetPubAttr(ISP_DEV IspDev, ISP_PUB_ATTR_S *pstPubAttr); + +HI_S32 HI_MPI_ISP_SetFMWState(ISP_DEV IspDev, const ISP_FMW_STATE_E enState); +HI_S32 HI_MPI_ISP_GetFMWState(ISP_DEV IspDev, ISP_FMW_STATE_E *penState); + +HI_S32 HI_MPI_ISP_SetWDRMode(ISP_DEV IspDev, const ISP_WDR_MODE_S *pstWDRMode); +HI_S32 HI_MPI_ISP_GetWDRMode(ISP_DEV IspDev, ISP_WDR_MODE_S *pstWDRMode); + +HI_S32 HI_MPI_ISP_SetModuleControl(ISP_DEV IspDev, const ISP_MODULE_CTRL_U *punModCtrl); +HI_S32 HI_MPI_ISP_GetModuleControl(ISP_DEV IspDev, ISP_MODULE_CTRL_U *punModCtrl); + +/* General Function Settings */ +HI_S32 HI_MPI_ISP_SetDRCAttr(ISP_DEV IspDev, const ISP_DRC_ATTR_S *pstDRC); +HI_S32 HI_MPI_ISP_GetDRCAttr(ISP_DEV IspDev, ISP_DRC_ATTR_S *pstDRC); + +HI_S32 HI_MPI_ISP_SetFSWDRAttr(ISP_DEV IspDev, const ISP_WDR_FS_ATTR_S *pstFSWDRAttr); +HI_S32 HI_MPI_ISP_GetFSWDRAttr(ISP_DEV IspDev, ISP_WDR_FS_ATTR_S *pstFSWDRAttr); + +HI_S32 HI_MPI_ISP_SetDPCalibrate(ISP_DEV IspDev, const ISP_DP_STATIC_CALIBRATE_S *pstDPCalibrate); +HI_S32 HI_MPI_ISP_GetDPCalibrate(ISP_DEV IspDev, ISP_DP_STATIC_CALIBRATE_S *pstDPCalibrate); + +HI_S32 HI_MPI_ISP_SetDPStaticAttr(ISP_DEV IspDev, const ISP_DP_STATIC_ATTR_S *pstDPStaticAttr); +HI_S32 HI_MPI_ISP_GetDPStaticAttr(ISP_DEV IspDev, ISP_DP_STATIC_ATTR_S *pstDPStaticAttr); +HI_S32 HI_MPI_ISP_SetDPDynamicAttr(ISP_DEV IspDev, const ISP_DP_DYNAMIC_ATTR_S *pstDPDynamicAttr); +HI_S32 HI_MPI_ISP_GetDPDynamicAttr(ISP_DEV IspDev, ISP_DP_DYNAMIC_ATTR_S *pstDPDynamicAttr); + +HI_S32 HI_MPI_ISP_SetDISAttr(ISP_DEV IspDev, const ISP_DIS_ATTR_S *pstDISAttr); +HI_S32 HI_MPI_ISP_GetDISAttr(ISP_DEV IspDev, ISP_DIS_ATTR_S *pstDISAttr); + +HI_S32 HI_MPI_ISP_SetMeshShadingAttr(ISP_DEV IspDev, const ISP_SHADING_ATTR_S *pstShadingAttr); +HI_S32 HI_MPI_ISP_GetMeshShadingAttr(ISP_DEV IspDev, ISP_SHADING_ATTR_S *pstShadingAttr); + +HI_S32 HI_MPI_ISP_SetNRAttr(ISP_DEV IspDev, const ISP_NR_ATTR_S *pstNRAttr); +HI_S32 HI_MPI_ISP_GetNRAttr(ISP_DEV IspDev, ISP_NR_ATTR_S *pstNRAttr); + +HI_S32 HI_MPI_ISP_SetGammaAttr(ISP_DEV IspDev, const ISP_GAMMA_ATTR_S *pstGammaAttr); +HI_S32 HI_MPI_ISP_GetGammaAttr(ISP_DEV IspDev, ISP_GAMMA_ATTR_S *pstGammaAttr); + +HI_S32 HI_MPI_ISP_SetGammaFEAttr(ISP_DEV IspDev, const ISP_GAMMAFE_ATTR_S *pstGammaFEAttr); +HI_S32 HI_MPI_ISP_GetGammaFEAttr(ISP_DEV IspDev, ISP_GAMMAFE_ATTR_S *pstGammaFEAttr); + +HI_S32 HI_MPI_ISP_SetSharpenAttr(ISP_DEV IspDev, const ISP_SHARPEN_ATTR_S *pstSharpenAttr); +HI_S32 HI_MPI_ISP_GetSharpenAttr(ISP_DEV IspDev, ISP_SHARPEN_ATTR_S *pstSharpenAttr); + +HI_S32 HI_MPI_ISP_SetUVNRAttr(ISP_DEV IspDev, ISP_UVNR_ATTR_S *pstUvnrAttr); +HI_S32 HI_MPI_ISP_GetUVNRAttr(ISP_DEV IspDev, ISP_UVNR_ATTR_S *pstUvnrAttr); + +HI_S32 HI_MPI_ISP_SetCrosstalkAttr(ISP_DEV IspDev, const ISP_CR_ATTR_S *pstCRAttr); +HI_S32 HI_MPI_ISP_GetCrosstalkAttr(ISP_DEV IspDev, ISP_CR_ATTR_S *pstCRAttr); + +HI_S32 HI_MPI_ISP_SetAntiFalseColorAttr(ISP_DEV IspDev, const ISP_ANTI_FALSECOLOR_S *pstAntiFC); +HI_S32 HI_MPI_ISP_GetAntiFalseColorAttr(ISP_DEV IspDev, ISP_ANTI_FALSECOLOR_S *pstAntiFC); + +HI_S32 HI_MPI_ISP_SetDemosaicAttr(ISP_DEV IspDev, const ISP_DEMOSAIC_ATTR_S *pstDemosaicAttr); +HI_S32 HI_MPI_ISP_GetDemosaicAttr(ISP_DEV IspDev, ISP_DEMOSAIC_ATTR_S *pstDemosaicAttr); + +HI_S32 HI_MPI_ISP_SetBlackLevelAttr(ISP_DEV IspDev, const ISP_BLACK_LEVEL_S *pstBlackLevel); +HI_S32 HI_MPI_ISP_GetBlackLevelAttr(ISP_DEV IspDev, ISP_BLACK_LEVEL_S *pstBlackLevel); + +/* block, return fpn frame when this is function is called. */ +HI_S32 HI_MPI_ISP_FPNCalibrate(ISP_DEV IspDev, ISP_FPN_CALIBRATE_ATTR_S *pstCalibrateAttr); +HI_S32 HI_MPI_ISP_SetFPNAttr(ISP_DEV IspDev, const ISP_FPN_ATTR_S *pstFPNAttr); +HI_S32 HI_MPI_ISP_GetFPNAttr(ISP_DEV IspDev, ISP_FPN_ATTR_S *pstFPNAttr); + +HI_S32 HI_MPI_ISP_SetDeFogAttr(ISP_DEV IspDev, const ISP_DEFOG_ATTR_S *pstDefogAttr); +HI_S32 HI_MPI_ISP_GetDeFogAttr(ISP_DEV IspDev, ISP_DEFOG_ATTR_S *pstDefogAttr); + +HI_S32 HI_MPI_ISP_SetDCFInfo(const ISP_DCF_INFO_S *pstIspDCF); +HI_S32 HI_MPI_ISP_GetDCFInfo(ISP_DCF_INFO_S *pstIspDCF); + +HI_S32 HI_MPI_ISP_SetAcmAttr(ISP_DEV IspDev, ISP_ACM_ATTR_S *pstAcmAttr); +HI_S32 HI_MPI_ISP_GetAcmAttr(ISP_DEV IspDev, ISP_ACM_ATTR_S *pstAcmAttr); + +HI_S32 HI_MPI_ISP_SetAcmCoeff(ISP_DEV IspDev, ISP_ACM_LUT_S *pstAcmCoef, ISP_ACM_MODE_E enMode); +HI_S32 HI_MPI_ISP_GetAcmCoeff(ISP_DEV IspDev, ISP_ACM_LUT_S *pstAcmCoef, ISP_ACM_MODE_E enMode); + +HI_S32 HI_MPI_ISP_SetRgbirAttr(ISP_DEV IspDev, ISP_RGBIR_ATTR_S *pstRgbirAttr); +HI_S32 HI_MPI_ISP_GetRgbirAttr(ISP_DEV IspDev, ISP_RGBIR_ATTR_S *pstRgbirAttr); +HI_S32 HI_MPI_ISP_SetRgbirCtrl(ISP_DEV IspDev, ISP_RGBIR_CTRL_S *pstRgbirCtrl); +HI_S32 HI_MPI_ISP_GetRgbirCtrl(ISP_DEV IspDev, ISP_RGBIR_CTRL_S *pstRgbirCtrl); + +HI_S32 HI_MPI_ISP_QueryInnerStateInfo(ISP_DEV IspDev, ISP_INNER_STATE_INFO_S *pstInnerStateInfo); + +HI_S32 HI_MPI_ISP_SetStatisticsConfig(ISP_DEV IspDev, const ISP_STATISTICS_CFG_S *pstStatCfg); +HI_S32 HI_MPI_ISP_GetStatisticsConfig(ISP_DEV IspDev, ISP_STATISTICS_CFG_S *pstStatCfg); +HI_S32 HI_MPI_ISP_GetStatistics(ISP_DEV IspDev, ISP_STATISTICS_S *pstStat); + +HI_S32 HI_MPI_ISP_SetRegister(ISP_DEV IspDev, HI_U32 u32Addr, HI_U32 u32Value); +HI_S32 HI_MPI_ISP_GetRegister(ISP_DEV IspDev, HI_U32 u32Addr, HI_U32 *pu32Value); + +HI_S32 HI_MPI_ISP_SnsRegsCfg(ISP_DEV IspDev, ISP_SNS_REGS_INFO_S *pstSnsRegsInfo); + +HI_S32 HI_MPI_ISP_GetVDTimeOut(ISP_DEV IspDev, ISP_VD_INFO_S *pstIspVdInfo, HI_U32 u32MilliSec); + +HI_S32 HI_MPI_ISP_GetISPRegAttr(ISP_DEV IspDev, ISP_REG_ATTR_S * pstIspRegAttr); + +HI_S32 HI_MPI_ISP_SetDebug(ISP_DEV IspDev, const ISP_DEBUG_INFO_S * pstIspDebug); +HI_S32 HI_MPI_ISP_GetDebug(ISP_DEV IspDev, ISP_DEBUG_INFO_S * pstIspDebug); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__MPI_ISP_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ive.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ive.h new file mode 100644 index 0000000..a17ebcd --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_ive.h @@ -0,0 +1,1047 @@ +/****************************************************************************** + + Copyright (C), 2001-2014, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_comm_ive.h + Version : Initial Draft + Author : Hisilicon multimedia software (IVE) group + Created : 2011/05/16 + Description : + History : + 1.Date : 2011/05/16 + Author : j00169368 + Modification: Created file + + 2.Date : 2013/07/01~2014/08/08 + Author : t00228657\c00211359\c00206215 + Modification: Add MPI function +******************************************************************************/ +#ifndef _HI_MPI_IVE_H_ +#define _HI_MPI_IVE_H_ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include "hi_ive.h" + +/***************************************************************************** +* Prototype : HI_MPI_IVE_DMA +* Description : Direct memory access (DMA): +* 1.Direct memory copy; +* 2. Copy with interval bytes; +* 3. Memset using 3 bytes; +* 4. Memset using 8 bytes; +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task. +* IVE_DATA_S *pstSrc Input source data.The input data is treated as U8C1 data. +* IVE_DATA_S *pstDst Output result data. +* IVE_DMA_CTRL_S *pstDmaCtrl DMA control parameter. +* HI_BOOL bInstant Flag indicating whether to generate an interrupt. +* If the output result blocks the next operation, +* set bInstant to HI_TRUE. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 32x1 pixels to 1920x1080 pixels. +* The stride must be 16-byte-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Data : 2013-07-19 +* Author : Chen Quanfu +* Modification : Modify parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_DMA(IVE_HANDLE *pIveHandle, IVE_DATA_S *pstSrc, + IVE_DST_DATA_S *pstDst, IVE_DMA_CTRL_S *pstDmaCtrl,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Filter +* Description : 5x5 template filter. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. +* The U8C1,SP420 and SP422 input formats are supported. +* IVE_DST_IMAGE_S *pstDst Output result, of same type with the input. +* IVE_FILTER_CTRL_S *pstFltCtrl Control parameters of filter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified function parameters + +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Filter(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_FILTER_CTRL_S *pstFltCtrl,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_CSC +* Description : YUV2RGB\YUV2HSV\YUV2LAB\RGB2YUV color space conversion are supported. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data: +* 1. SP420\SP422 type for YUV2RGB\YUV2HSV\YUV2LAB; +* 2. U8C3_PACKAGE\U8C3_PLANAR type for RGB2YUV; +* IVE_DST_IMAGE_S *pstDst Output result: +* 1. U8C3_PACKAGE\U8C3_PLANAR typed for YUV2RGB\YUV2HSV\YUV2LAB; +* 2. SP420\SP422 type for RGB2YUV; +* IVE_CSC_CTRL_S *pstCscCtrl Control parameters for CSC +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-08-09 +* Author : Tan Bing +* Modification : Modified function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_CSC(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_CSC_CTRL_S *pstCscCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_FILTER_AND_CSC +* Description : Only support YUV2RGB color space conversion. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task. +* IVE_SRC_IMAGE_S *pstSrc Input source data.Only SP420\SP422 type are supported. +* IVE_DST_IMAGE_S *pstDst Output result.Only U8C3_PACKAGE\U8C3_PLANAR are supported. +* IVE_FILTER_AND_CSC_CTRL_S *pstFltCscCtrl Control parameters. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-08-09 +* Author : Tan Bing +* Modification : Modified function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_FilterAndCSC(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_FILTER_AND_CSC_CTRL_S *pstFltCscCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Sobel +* Description : SOBEL is used to extract the gradient information. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only the U8C1 input image is supported. +* IVE_DST_IMAGE_S *pstDstH The (horizontal) result of input image filtered by the input mask; +* IVE_DST_IMAGE_S *pstDstV The (vertical) result of input image filtered by the transposed mask; +* IVE_SOBEL_CTRL_S *pstSobelCtrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 1. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified function parameters +* +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Sobel(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDstH, IVE_DST_IMAGE_S *pstDstV, + IVE_SOBEL_CTRL_S *pstSobelCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_MagAndAng +* Description : MagAndAng is used to extract the edge information. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_INFO_S *pstSrc Input source data. Only the U8C1 input format is supported. +* IVE_MEM_INFO_S *pstDstMag Output magnitude. +* IVE_MEM_INFO_S *pstDstAng Output angle. +* If the output mode is set to magnitude only, +* this item can be set to null. +* IVE_MAG_AND_ANG_CTRL_S *pstMagAndAngCtrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-17 +* Author : Chen Quanfu +* Modification : Modified function and control parameter name +* 3. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified function parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_MagAndAng(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDstMag, IVE_DST_IMAGE_S *pstDstAng, + IVE_MAG_AND_ANG_CTRL_S *pstMagAndAngCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Dilate +* Description : 5x5 template dilate. Only the U8C1 binary image input is supported.Or else the result is not expected. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input binary image, which consists of 0 or 255; +* IVE_DST_IMAGE_S *pstDst Output result. +* IVE_DILATE_CTRL_S *pstDilateCtrl Control parameters. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* The input value, output value, and mask value must be 0 or 255. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Dilate(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_DILATE_CTRL_S *pstDilateCtrl,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Erode +* Parameters : 5x5 template erode. Only the U8C1 binary image input is supported.Or else the result is not correct. +* Input : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input binary image, which consists of 0 or 255; +* IVE_DST_IMAGE_S *pstDst Output result. +* IVE_ERODE_CTRL_S *pstErodeCtrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* The input value, output value, and mask value must be 0 or 255. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Erode(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_ERODE_CTRL_S *pstErodeCtrl,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Thresh +* Description : Thresh operation to the input image. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_THRESH_CTRL_S *pstThrCtrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-07-23 +* Author : Tan Bing +* Modification : Modification +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Thresh(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_THRESH_CTRL_S *pstThrCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_And +* Description : Binary images' And operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 The input source1. Only U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 The input source2.Only U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result of " src1 & src2 ". +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_And(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Sub +* Description : Two gray images' Sub operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 Minuend of the input source.Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 Subtrahend of the input source.Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result of src1 minus src2 +* IVE_SUB_CTRL_S *pstSubCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-08-09 +* Author : Tan Bing +* Modification : Modified function parameter +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Sub(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, IVE_SUB_CTRL_S *pstSubCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Or +* Description : Two binary images' Or operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 Input source1. Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 Input source2. Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result src1 or src2 +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-08-09 +* Author : Tan Bing +* Modification : Modified function parameter +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Or(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_INTEG +* Description : Calculate the input gray image's integral image. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data.Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result.Can be U32C1 or U64C1, relied on the control parameter. +* IVE_INTEG_CTRL_S *pstIntegCtrl Integ Control +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* The pixel can be 32bit or 64 bit relied on the control parameter. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* 2. Date : 2013-03-18 +* Author : Tan Bing +* Modification : Modified function +* 3. Date : 2013-07-15 +* Author : Chen Quanfu +* Modification : Modified function +* Spec : Modify IVE_INTEG_OUT_FMT_E to IVE_INTEG_CTRL_S +* 4. Date : 2013-07-23 +* Author : Chen Quanfu +* Modification : Modified parameters +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Integ(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_INTEG_CTRL_S *pstIntegCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Hist +* Description : Calculate the input gray image's histogram. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only the U8C1 input format is supported. +* IVE_DST_MEM_INFO_S *pstDst Output result. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Hist(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_MEM_INFO_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Thresh_S16 +* Description : S16 image's THRESH operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data.Only the S16 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result. +* IVE_THRESH_S16_CTRL_S *pstThrS16Ctrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data must be 2-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-05-16 +* Author : Tan bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Thresh_S16(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_THRESH_S16_CTRL_S *pstThrS16Ctrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Thresh_U16 +* Description : U16 image's THRESH operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only the U16 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_THRESH_U16_CTRL_S *pstThrU16Ctrl Control parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data must be 2-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-05-16 +* Author : Tan bing +* Modification : Created function +* 2. Date : 2013-08-07 +* Author : Chen Quanfu +* Modification : Implement function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Thresh_U16(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_THRESH_U16_CTRL_S *pstThrU16Ctrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_16BitTo8Bit +* Description : Scale the input 16bit data to the output 8bit data. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data.Only U16C1\S16C1 input is supported. +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_16BITTO8BIT_CTRL_S *pst16BitTo8BitCtrl control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data must be 2-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_16BitTo8Bit(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_16BIT_TO_8BIT_CTRL_S *pst16BitTo8BitCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_OrdStatFilter +* Description : Order Statistic Filter. It can be used as median\max\min value filter. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data. Only U8C1 input is supported +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_ORD_STAT_FILTER_CTRL_S *pstOrdStatFltCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_OrdStatFilter(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_ORD_STAT_FILTER_CTRL_S *pstOrdStatFltCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Map +* Description : Map a image to another through a lookup table. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source. Only the U8C1 input format is supported. +* IVE_SRC_MEM_INFO_S *pstMap Input lookup table. Must be an U8 array of size 256. +* IVE_DST_IMAGE_S *pstDst Output result. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-17 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Map(IVE_HANDLE *pIveHandle,IVE_SRC_IMAGE_S *pstSrc, + IVE_SRC_MEM_INFO_S *pstMap, IVE_DST_IMAGE_S *pstDst,HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_EqualizeHist +* Description : Enhance the input image's contrast through histogram equalization. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source.Only U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result. +* IVE_EQUALIZEHIST_CTRL_S *pstEqualizeHistCtrl EqualizeHist control parameter. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The physical addresses of map data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-07-17 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_EqualizeHist(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_EQUALIZE_HIST_CTRL_S *pstEqualizeHistCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Add +* Description : Two gray images' Add operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 Augend of the input source.Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 Addend of the input source.Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstDst Output result of src1 plus src2 +* IVE_ADD_CTRL_S *pstAddCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2013-07-17 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Add(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, IVE_ADD_CTRL_S *pstAddCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Xor +* Description : Two binary images' Xor operation. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 The input source1.Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 The input source2. +* IVE_DST_IMAGE_S *pstDst Output result +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* History: +* +* 1. Date : 2013-07-17 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Xor(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_NCC +* Description : Calculate two gray images' NCC (Normalized Cross Correlation). +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 Input source1. Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 Input source2. Must be of the same typesize of source1. +* IVE_DST_MEM_INFO_S *pstDst Output result +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-16 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_NCC(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_MEM_INFO_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_CCL +* Description : Connected Component Labeling. Only 8-Connected method is supported. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_IMAGE_S *pstSrcDst Input source +* IVE_MEM_INFO_S *pstBlob Output result of detected region; +* IVE_CCL_CTRL_S *pstCclCtrl CCL control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x640 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-1 +* Author : Cheng Jianmin +* Modification : Created function +*****************************************************************************/ +HI_S32 HI_MPI_IVE_CCL(IVE_HANDLE *pIveHandle, IVE_IMAGE_S *pstSrcDst, + IVE_DST_MEM_INFO_S *pstBlob, IVE_CCL_CTRL_S *pstCclCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_GMM +* Description : Separate foreground and background using GMM(Gaussian Mixture Model) method; +* Gray or RGB GMM are supported. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source. Only support U8C1 or U8C3_PACKAGE input. +* IVE_DST_IMAGE_S *pstFg Output foreground (Binary) image. +* IVE_DST_IMAGE_S *pstBg Output background image. Of the sampe type of pstSrc. +* IVE_MEM_INFO_S *pstModel Model data. +* IVE_GMM_CTRL_S *pstGmmCtrl Control parameter. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x576 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-07 +* Author : Cheng Jianmin +* Modification : Created function +*****************************************************************************/ +HI_S32 HI_MPI_IVE_GMM(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstFg, + IVE_DST_IMAGE_S *pstBg, IVE_MEM_INFO_S *pstModel, IVE_GMM_CTRL_S *pstGmmCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_CannyHysEdge +* Description : The first part of canny Edge detection. Including step: gradient calculation, +* magnitude and angle calculation, hysteresis threshold, NMS(Non-Maximum Suppression) +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source. Only the U8C1 input format is supported +* IVE_DST_IMAGE_S *pstEdge Output result. +* IVE_DST_MEM_INFO_S *pstStack OutPut stack for CannyEdge +* IVE_CANNY_HYS_EDGE_CTRL_S *pstCannyHysEdgeCtrl Control parameter. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. . +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_CannyHysEdge(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstEdge, + IVE_DST_MEM_INFO_S *pstStack, IVE_CANNY_HYS_EDGE_CTRL_S *pstCannyHysEdgeCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_CannyEdge +* Description : The second part of canny Edge detection: trace strong edge by weak edge. +* Parameters : IVE_IMAGE_S *pstEdge Input and Output source. Only the U8C1 format is supported +* IVE_MEM_INFO_S *pstStack stack for CannyEdge +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_CannyEdge(IVE_IMAGE_S *pstEdge, IVE_MEM_INFO_S *pstStack); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_LBP +* Description : LBP calculation using the original method and a extensional method. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source.Only the U8C1 inpu format is supported. +* IVE_DST_IMAGE_S *pstDst Output result +* IVE_LBP_CTRL_S *pstLbpCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-09-22 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_LBP(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDst, IVE_LBP_CTRL_S *pstLbpCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_NormGrad +* Description : Gradient calculation and the output is normalized to S8. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data +* IVE_DST_IMAGE_S *pstDstH The (horizontal) result of input image filtered by the input mask; +* IVE_DST_IMAGE_S *pstDstV The (vertical) result of input image filtered by the transposed mask; +* IVE_DST_IMAGE_S *pstDstHV Output the horizontal and vertical component in single image in package format. +* IVE_NORM_GRAD_CTRL_S *pstNormGradCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1024 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-12 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_NormGrad(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, + IVE_DST_IMAGE_S *pstDstH, IVE_DST_IMAGE_S *pstDstV, IVE_DST_IMAGE_S *pstDstHV, + IVE_NORM_GRAD_CTRL_S *pstNormGradCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_LKOpticalFlow +* Description : Calculate LK-Optical Flow in single-layer of the pyramid. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrcPre Pre-frame input source.Must be U8C1 image +* IVE_SRC_IMAGE_S *pstSrcCur Cur-frame input source.Same sizetype with pstPreSrc. +* IVE_SRC_MEM_INFO_S *pstPoint Intresting points coordinates in the cur-layer +* for LKOpticalFlow tracking. +* IVE_MEM_INFO_S *pstMv Accumlative movements of the interesting points in pre-layers +* or init 0s for the first-layer as input. init 0s . +* Movements of the interesting points being tracked in cur-layer +* as output. +* IVE_LKOPTICALFLOW_CTRL_S *pstLkOptiFlowCtrl Control parameters. +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x576 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-08-23 +* Author : Cheng Jianmin +* Modification : Created function +****************************************************************************/ +HI_S32 HI_MPI_IVE_LKOpticalFlow(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrcPre, IVE_SRC_IMAGE_S *pstSrcCur, + IVE_SRC_MEM_INFO_S *pstPoint, IVE_MEM_INFO_S *pstMv, IVE_LK_OPTICAL_FLOW_CTRL_S *pstLkOptiFlowCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_STCandiCorner +* Description : The first part of corners detection using Shi-Tomasi-like method: calculate candidate corners. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc Input source data +* IVE_DST_IMAGE_S *pstCandiCorner Output result of eig +* IVE_ST_CANDI_CORNER_CTRL_S *pstStCandiCornerCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x576 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-09-16 +* Author : Cheng Jianmin +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_STCandiCorner(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc, IVE_DST_IMAGE_S *pstCandiCorner, + IVE_ST_CANDI_CORNER_CTRL_S *pstStCandiCornerCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_STCorner +* Description : The second part of corners detection using Shi-Tomasi-like method: select corners by certain rules. +* IVE_SRC_IMAGE_S *pstCandiCorner Input source data +* IVE_DST_MEM_INFO_S *pstCorner Output result of Corner +* IVE_ST_CORNER_CTRL_S *pstStCornerCtrl Control parameter +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 720x576 pixels. +* The physical addresses of the input data and output data must be 16-byte-aligned. +* The stride must be 16-pixel-aligned. +* History: +* +* 1. Date : 2013-09-16 +* Author : Cheng Jianmin +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_STCorner(IVE_SRC_IMAGE_S * pstCandiCorner, IVE_DST_MEM_INFO_S *pstCorner, + IVE_ST_CORNER_CTRL_S *pstStCornerCtrl); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_GradFg +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstBgDiffFg Background subtraction foreground image +* IVE_SRC_IMAGE_S *pstCurGrad Current gradient image, both horizontally and vertically +* graded in accordance with [xyxyxy ...] format +* IVE_SRC_IMAGE_S *pstBgGrad Background gradient image +* IVE_DST_IMAGE_S *pstGradFg Gradient foreground image +* IVE_GRAD_FG_CTRL_S *pstGradFgCtrl Gradient calculation parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-10-29 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_GradFg(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstBgDiffFg, IVE_SRC_IMAGE_S *pstCurGrad, + IVE_SRC_IMAGE_S *pstBgGrad, IVE_DST_IMAGE_S *pstGradFg, IVE_GRAD_FG_CTRL_S *pstGradFgCtrl, HI_BOOL bInstant); + + +/***************************************************************************** +* Prototype : HI_MPI_IVE_MatchBgModel +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstCurImg Current grayscale image +* IVE_DATA_S *pstBgModel Background model data +* IVE_IMAGE_S *pstFgFlag Foreground status image +* IVE_DST_IMAGE_S *pstBgDiffFg Foreground image obtained by background matching, +* the background pixel value is 0, the foreground pixel +* value is the gray difference value +* IVE_DST_IMAGE_S *pstFrmDiffFg Foreground image obtained by interframe difference, +* the background pixel value is 0, the foreground pixel +* value is the gray difference value +* IVE_DST_MEM_INFO_S *pstStatData result status data +* IVE_MATCH_BG_MODEL_CTRL_S *pstMatchBgModelCtrl Background matching parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. + +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-10-29 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_MatchBgModel(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstCurImg, IVE_DATA_S *pstBgModel, + IVE_IMAGE_S *pstFgFlag, IVE_DST_IMAGE_S *pstBgDiffFg, IVE_DST_IMAGE_S *pstFrmDiffFg, IVE_DST_MEM_INFO_S *pstStatData, + IVE_MATCH_BG_MODEL_CTRL_S *pstMatchBgModelCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_UpdateBgModel +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_DATA_S *pstBgModel Background model data +* IVE_IMAGE_S *pstFgFlag Foreground status image +* IVE_DST_IMAGE_S *pstBgImg Background grayscale image +* IVE_DST_IMAGE_S *pstChgStaImg Change state life image, for still detection +* IVE_DST_IMAGE_S *pstChgStaFg Change state grayscale image, for still detection +* IVE_DST_IMAGE_S *pstChgStaLife Change state foreground image, for still detection +* IVE_DST_MEM_INFO_S *pstStatData result status data +* IVE_UPDATE_BG_MODEL_CTRL_S *pstUpdateBgModelCtrl Background update parameters +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-10-29 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_UpdateBgModel(IVE_HANDLE *pIveHandle, IVE_DATA_S *pstBgModel, IVE_IMAGE_S *pstFgFlag, + IVE_DST_IMAGE_S *pstBgImg, IVE_DST_IMAGE_S *pstChgStaImg, IVE_DST_IMAGE_S *pstChgStaFg, IVE_DST_IMAGE_S *pstChgStaLife, + IVE_DST_MEM_INFO_S *pstStatData, IVE_UPDATE_BG_MODEL_CTRL_S *pstUpdateBgModelCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_ANN_MLP_LoadModel +* Description : Load ANN_MLP model data from ".bin" file. +* Parameters : HI_CHAR *pchFileName ANN_MLP model file name, must be ".bin" file. +* IVE_ANN_MLP_MODEL_S *pstAnnMlpModel ANN_MLP model data. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014-05-13 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_ANN_MLP_LoadModel(const HI_CHAR *pchFileName, IVE_ANN_MLP_MODEL_S *pstAnnMlpModel); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_ANN_MLP_UnloadModel +* Description : Unload ANN_MLP model data. +* Parameters : IVE_ANN_MLP_MODEL_S *pstAnnMlpModel ANN_MLP model data. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014-05-13 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_VOID HI_MPI_IVE_ANN_MLP_UnloadModel(IVE_ANN_MLP_MODEL_S *pstAnnMlpModel); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_ANN_MLP_Predict +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_MEM_INFO_S *pstSrc Input sample +* IVE_SRC_MEM_INFO_S *pstActivFuncTable Look-up talbe for active function +* IVE_ANN_MLP_MODEL_S *pstAnnMlpModel ANN_MLP model +* IVE_DST_MEM_INFO_S *pstDst Output layer +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-11-28 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_ANN_MLP_Predict(IVE_HANDLE *pIveHandle, IVE_SRC_MEM_INFO_S *pstSrc, + IVE_LOOK_UP_TABLE_S *pstActivFuncTab, IVE_ANN_MLP_MODEL_S *pstAnnMlpModel, + IVE_DST_MEM_INFO_S *pstDst, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_SVM_LoadModel +* Description : Load SVM model data from ".bin" file. +* Parameters : HI_CHAR *pchFileName SVM model file name, must be ".bin" file. +* IVE_SVM_MODEL_S *pstSvmModel SVM model data. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014-05-13 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_SVM_LoadModel(const HI_CHAR *pchFileName, IVE_SVM_MODEL_S *pstSvmModel); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_SVM_UnloadModel +* Description : Unload SVM model data. +* Parameters : IVE_SVM_MODEL_S *pstSvmModel SVM model data. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2014-05-13 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_VOID HI_MPI_IVE_SVM_UnloadModel(IVE_SVM_MODEL_S *pstSvmModel); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_SVM_Predict +* Description : +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_MEM_INFO_S *pstSrc Input sample +* IVE_SRC_MEM_INFO_S *pstKernelTable Look-up talbe for active function +* IVE_SVM_MODEL_S *pstSvmModel SVM model +* IVE_DST_MEM_INFO_S *pstDstVote Output Votes' array of each class +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2013-11-28 +* Author : Tan Bing +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_SVM_Predict(IVE_HANDLE *pIveHandle, IVE_SRC_MEM_INFO_S *pstSrc, + IVE_LOOK_UP_TABLE_S *pstKernelTab, IVE_SVM_MODEL_S *pstSvmModel, + IVE_DST_MEM_INFO_S *pstDstVote, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_SAD +* Description : Sum of absolute differences. +* Parameters : IVE_HANDLE *pIveHandle Returned handle ID of a task +* IVE_SRC_IMAGE_S *pstSrc1 The input source1.Only the U8C1 input format is supported. +* IVE_SRC_IMAGE_S *pstSrc2 The input source2.Only the U8C1 input format is supported. +* IVE_DST_IMAGE_S *pstSad Output result of sad value.Only the U8C1/U16C1 format is supported. +* IVE_DST_IMAGE_S *pstThr Output result of thresh.Only the U8C1 format is supported. +* IVE_SAD_CTRL_S *pstSadCtrl Control parameter +* HI_BOOL bInstant For details, see HI_MPI_IVE_DMA. +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : The size of the input data ranges from 64x64 pixels to 1920x1080 pixels. +* The stride must be 16-pixel-aligned. +* The types, widths, heights of two input sources must be the same. +* Not support in hi3516a +* History: +* +* 1. Date : 2014-08-28 +* Author : Chen Quanfu +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_SAD(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc1, + IVE_SRC_IMAGE_S *pstSrc2, IVE_DST_IMAGE_S *pstSad,IVE_DST_IMAGE_S *pstThr, + IVE_SAD_CTRL_S *pstSadCtrl, HI_BOOL bInstant); + +/***************************************************************************** +* Prototype : HI_MPI_IVE_Query +* Description : This API is used to query the status of a called function by using the returned IveHandle of the function. + In block mode, the system waits until the function that is being queried is called. + In non-block mode, the current status is queried and no action is taken. +* Parameters : IVE_HANDLE IveHandle IveHandle of a called function. It is entered by users. +* HI_BOOL *pbFinish Returned status +* HI_BOOL bBlock Flag indicating the block mode or non-block mode +* HI_BOOL *pbFinish +* Return Value : HI_SUCCESS: Success;Error codes: Failure. +* Spec : +* History: +* +* 1. Date : 2011-05-16 +* Author : Jiang Xiaohua (employee ID: 00169368) +* Modification : Created function +* +*****************************************************************************/ +HI_S32 HI_MPI_IVE_Query(IVE_HANDLE IveHandle, HI_BOOL *pbFinish, HI_BOOL bBlock); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif +#endif/*__MPI_IVE_H__*/ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_pciv.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_pciv.h new file mode 100644 index 0000000..24ddf1a --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_pciv.h @@ -0,0 +1,250 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_pciv.h + Version : Initial Draft + Author : Hisilicon Hi3511 MPP Team + Created : 2009/06/23 + Last Modified : + Description : mpi functions declaration + Function List : + History : + 1.Date : 2009/06/23 + Author : z44949 + Modification: Create +******************************************************************************/ +#ifndef __MPI_PCIV_H__ +#define __MPI_PCIV_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_pciv.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/***************************************************************************** + Description : Create and initialize the pciv channel. + Input : pcivChn ** The pciv channel id between [0, PCIV_MAX_CHN_NUM) + pPcivAttr ** The attribute of pciv channel + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Destroy +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Create(PCIV_CHN pcivChn, PCIV_ATTR_S *pPcivAttr); + +/***************************************************************************** + Description : Destroy the pciv channel + Input : pcivChn ** The pciv channel id + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Create +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Destroy(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Set the attribute of pciv channel + Input : pcivChn ** The pciv channel id + pPcivAttr ** The attribute of pciv channel + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_GetAttr +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_SetAttr(PCIV_CHN pcivChn, PCIV_ATTR_S *pPcivAttr); + +/***************************************************************************** + Description : Get the attribute of pciv channel + Input : pcivChn ** The pciv channel id + Output : pPcivAttr ** The attribute of pciv channel + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_SetAttr +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_GetAttr(PCIV_CHN pcivChn, PCIV_ATTR_S *pPcivAttr); + + +/***************************************************************************** + Description : Start to send or receive video frame + Input : pcivChn ** The pciv channel id + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Stop +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Start(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Stop send or receive video frame + Input : pcivChn ** The pciv channel id + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Start +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Stop(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Create a series of dma task + Input : pTask ** The task list to create + Output : None + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : None +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_DmaTask(PCIV_DMA_TASK_S *pTask); + +/***************************************************************************** + Description : Alloc 'u32BlkSize' bytes memory and give the physical address + The memory used by PCI must be located within the PCI window, + So you should call this function to alloc it. + Input : u32BlkSize ** The size of each memory block + u32BlkCnt ** The count of memory block + Output : u32PhyAddr ** The physical address of the memory + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_Free +*****************************************************************************/ +HI_U32 HI_MPI_PCIV_Malloc(HI_U32 u32BlkSize, HI_U32 u32BlkCnt, HI_U32 u32PhyAddr[]); +HI_S32 HI_MPI_PCIV_Free(HI_U32 u32BlkCnt, HI_U32 u32PhyAddr[]); + +HI_U32 HI_MPI_PCIV_MallocChnBuffer(PCIV_CHN pcivChn, HI_U32 u32BlkSize, HI_U32 u32BlkCnt, HI_U32 u32PhyAddr[]); +HI_S32 HI_MPI_PCIV_FreeChnBuffer(PCIV_CHN pcivChn, HI_U32 u32BlkCnt); + + +/***************************************************************************** + Description : Get the board ID of this board + Input : None + Output : None + Return Value : The board ID if success + HI_FAILURE or HI_ERR_PCIV_SYS_NOTREADY if failure + + See Also : HI_MPI_PCIV_GetBaseWindow +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_GetLocalId(HI_VOID); + +/***************************************************************************** + Description : Enum all the connected chip.Call this function as follow. + { + HI_S32 s32ChipID[PCIV_MAX_CHIPNUM], i, s32Ret; + + s32Ret = HI_MPI_PCIV_EnumChip(s32ChipID); + HI_ASSERT(HI_SUCCESS == s32Ret); + + for(i=0; iu32NpWinBase, + pBase->u32PfWinBase, + pBase->u32CfgWinBase + On Slave pBase->u32PfAHBAddr + Return Value : HI_SUCCESS if success. + HI_FAILURE if failure + + See Also : HI_MPI_PCIV_GetLocalId +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_GetBaseWindow(HI_S32 s32ChipId, PCIV_BASEWINDOW_S *pBase); + +/***************************************************************************** + Description : Only on the slave chip, you need to create some VB Pool. + Those pool will bee created on the PCI Window Zone. + Input : pCfg.u32PoolCount ** The total number of pool want to create + pCfg.u32BlkSize[] ** The size of each VB block + pCfg.u32BlkCount[]** The number of each VB block + + Output : None + Return Value : HI_SUCCESS if success. + HI_ERR_PCIV_SYS_NOTREADY + HI_ERR_PCIV_NULL_PTR + HI_ERR_PCIV_NOMEM + HI_ERR_PCIV_BUSY + HI_ERR_PCIV_NOT_SUPPORT + HI_FAILURE + + See Also : HI_MPI_PCIV_GetLocalId +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_WinVbCreate(PCIV_WINVBCFG_S *pCfg); + +/***************************************************************************** + Description : Destroy the pools which's size is equal to the pCfg.u32BlkSize[] + Input : pCfg.u32PoolCount ** The total number of pool want to destroy + pCfg.u32BlkSize[] ** The size of each VB block + pCfg.u32BlkCount[]** Don't care this parament + + Output : None + Return Value : HI_SUCCESS if success. + HI_ERR_PCIV_SYS_NOTREADY + HI_ERR_PCIV_NOT_SUPPORT + HI_FAILURE + + See Also : HI_MPI_PCIV_GetLocalId +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_WinVbDestroy(HI_VOID); + +/***************************************************************************** + Description : Show the image in VO device from PCI + Input : pcivChn ** The pciv channel id + Output : None + Return Value : +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Show(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Hide the image in VO device from PCI + Input : pcivChn ** The pciv channel id + Output : None + Return Value : +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_Hide(PCIV_CHN pcivChn); + +/***************************************************************************** + Description : Get and Set pre-processing parameter, e.g. filter coef. + Input : pcivChn ** The pciv channel id + Output : None + Return Value : +*****************************************************************************/ +HI_S32 HI_MPI_PCIV_GetPreProcCfg(PCIV_CHN pcivChn, PCIV_PREPROC_CFG_S *pstCfg); +HI_S32 HI_MPI_PCIV_SetPreProcCfg(PCIV_CHN pcivChn, PCIV_PREPROC_CFG_S *pstCfg); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_VENC_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_region.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_region.h new file mode 100644 index 0000000..d4eb934 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_region.h @@ -0,0 +1,56 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_region.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/07 + Description : + History : + 1.Date : 2013/05/07 + Author : c00191088 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_REGION_H__ +#define __MPI_REGION_H__ + +#include "hi_comm_region.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +HI_S32 HI_MPI_RGN_Create(RGN_HANDLE Handle, const RGN_ATTR_S *pstRegion); +HI_S32 HI_MPI_RGN_Destroy(RGN_HANDLE Handle); + +HI_S32 HI_MPI_RGN_GetAttr(RGN_HANDLE Handle, RGN_ATTR_S *pstRegion); +HI_S32 HI_MPI_RGN_SetAttr(RGN_HANDLE Handle, const RGN_ATTR_S *pstRegion); + +HI_S32 HI_MPI_RGN_SetBitMap(RGN_HANDLE Handle, const BITMAP_S *pstBitmap); + +HI_S32 HI_MPI_RGN_AttachToChn(RGN_HANDLE Handle, const MPP_CHN_S *pstChn, const RGN_CHN_ATTR_S *pstChnAttr); +HI_S32 HI_MPI_RGN_DetachFromChn(RGN_HANDLE Handle, const MPP_CHN_S *pstChn); + +HI_S32 HI_MPI_RGN_SetDisplayAttr(RGN_HANDLE Handle, const MPP_CHN_S *pstChn, const RGN_CHN_ATTR_S *pstChnAttr); +HI_S32 HI_MPI_RGN_GetDisplayAttr(RGN_HANDLE Handle, const MPP_CHN_S *pstChn, RGN_CHN_ATTR_S *pstChnAttr); + +HI_S32 HI_MPI_RGN_SetAttachField(RGN_HANDLE Handle, VIDEO_FIELD_E enAttachField); +HI_S32 HI_MPI_RGN_GetAttachField(RGN_HANDLE Handle, VIDEO_FIELD_E *penAttachField); + +HI_S32 HI_MPI_RGN_GetCanvasInfo(RGN_HANDLE Handle, RGN_CANVAS_INFO_S *pstCanvasInfo); +HI_S32 HI_MPI_RGN_UpdateCanvas(RGN_HANDLE Handle); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __MPI_REGION_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_sys.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_sys.h new file mode 100644 index 0000000..5fc4715 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_sys.h @@ -0,0 +1,108 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_sys.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2007/1/31 + Description : + History : + 1.Date : 2006/1/31 + Author : c42025 + Modification: Created file + + 2.Date : 2008/03/03 + Author : c42025 + Modification: add a new funtion "HI_MPI_SYS_GetVersion" + +******************************************************************************/ +#ifndef __MPI_SYS_H__ +#define __MPI_SYS_H__ + +#include "hi_type.h" +#include "hi_common.h" +#include "hi_comm_sys.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +HI_S32 HI_MPI_SYS_Init(); +HI_S32 HI_MPI_SYS_Exit(); + +HI_S32 HI_MPI_SYS_SetConf(const MPP_SYS_CONF_S* pstSysConf); +HI_S32 HI_MPI_SYS_GetConf(MPP_SYS_CONF_S* pstSysConf); + +HI_S32 HI_MPI_SYS_Bind(MPP_CHN_S* pstSrcChn, MPP_CHN_S* pstDestChn); +HI_S32 HI_MPI_SYS_UnBind(MPP_CHN_S* pstSrcChn, MPP_CHN_S* pstDestChn); +HI_S32 HI_MPI_SYS_GetBindbyDest(MPP_CHN_S* pstDestChn, MPP_CHN_S* pstSrcChn); + +HI_S32 HI_MPI_SYS_GetVersion(MPP_VERSION_S* pstVersion); + +/* +** u64Base is the global PTS of the system. +** ADVICE: +** 1. Better to call HI_MPI_SYS_GetCurPts on the host board to get u64Base. +** 2. When os start up, call HI_MPI_SYS_InitPtsBase to set the init PTS. +** 3. When media bussines is running, synchronize the PTS one time per minute +** by calling HI_MPI_SYS_SyncPts. +*/ +HI_S32 HI_MPI_SYS_GetCurPts(HI_U64* pu64CurPts); +HI_S32 HI_MPI_SYS_InitPtsBase(HI_U64 u64PtsBase); +HI_S32 HI_MPI_SYS_SyncPts(HI_U64 u64PtsBase); + +/* alloc mmz memory in user context */ +HI_S32 HI_MPI_SYS_MmzAlloc(HI_U32* pu32PhyAddr, HI_VOID** ppVirtAddr, + const HI_CHAR* strMmb, const HI_CHAR* strZone, HI_U32 u32Len); + +/* alloc mmz memory with cache */ +HI_S32 HI_MPI_SYS_MmzAlloc_Cached(HI_U32* pu32PhyAddr, HI_VOID** ppVitAddr, + const HI_CHAR* pstrMmb, const HI_CHAR* pstrZone, HI_U32 u32Len); + +/* free mmz memory in user context */ +HI_S32 HI_MPI_SYS_MmzFree(HI_U32 u32PhyAddr, HI_VOID* pVirtAddr); + +/* fulsh cache */ +HI_S32 HI_MPI_SYS_MmzFlushCache(HI_U32 u32PhyAddr, HI_VOID* pVitAddr, HI_U32 u32Size); + +/* +** Call the mmap function to map physical address to virtual address +** The system function mmap is too complicated, so we packge it. +*/ +HI_VOID* HI_MPI_SYS_Mmap(HI_U32 u32PhyAddr, HI_U32 u32Size); +HI_S32 HI_MPI_SYS_Munmap(HI_VOID* pVirAddr, HI_U32 u32Size); + +/* +** Access the physical address. +** You can use this function to access memory address or register address. +*/ +HI_S32 HI_MPI_SYS_SetReg(HI_U32 u32Addr, HI_U32 u32Value); +HI_S32 HI_MPI_SYS_GetReg(HI_U32 u32Addr, HI_U32* pu32Value); + +HI_S32 HI_MPI_SYS_SetMemConf(MPP_CHN_S* pstMppChn, const HI_CHAR* pcMmzName); +HI_S32 HI_MPI_SYS_GetMemConf(MPP_CHN_S* pstMppChn, HI_CHAR* pcMmzName); + +/* Close all the FD which is used by sys module */ +HI_S32 HI_MPI_SYS_CloseFd(HI_VOID); + +/* Get VI VPSS work mode, 0: offline, >0: online */ +HI_S32 HI_MPI_SYS_GetViVpssMode(HI_U32* pu32Mode); + +/* media profile setting, for low power */ +HI_S32 HI_MPI_SYS_SetProfile(PROFILE_TYPE_E enProfile); + +/* Get virtual meminfo according to virtual addr, should be in one process */ +HI_S32 HI_MPI_SYS_GetVirMemInfo(const void* pVitAddr, SYS_VIRMEM_INFO_S* pstMemInfo); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__MPI_SYS_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vb.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vb.h new file mode 100644 index 0000000..a6c4277 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vb.h @@ -0,0 +1,63 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vb.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2007/10/15 + Description : + History : + 1.Date : 2007/10/15 + Author : c42025 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_VB_H__ +#define __MPI_VB_H__ + +#include "hi_comm_vb.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +VB_POOL HI_MPI_VB_CreatePool(HI_U32 u32BlkSize,HI_U32 u32BlkCnt,const HI_CHAR *pcMmzName); +HI_S32 HI_MPI_VB_DestroyPool(VB_POOL Pool); + +VB_BLK HI_MPI_VB_GetBlock(VB_POOL Pool, HI_U32 u32BlkSize,const HI_CHAR *pcMmzName); +HI_S32 HI_MPI_VB_ReleaseBlock(VB_BLK Block); + +HI_U32 HI_MPI_VB_Handle2PhysAddr(VB_BLK Block); +VB_POOL HI_MPI_VB_Handle2PoolId(VB_BLK Block); + +HI_S32 HI_MPI_VB_GetSupplementAddr(VB_BLK Block, VIDEO_SUPPLEMENT_S *pstSupplement); + + +HI_S32 HI_MPI_VB_Init(HI_VOID); +HI_S32 HI_MPI_VB_Exit(HI_VOID); +HI_S32 HI_MPI_VB_SetConf(const VB_CONF_S *pstVbConf); +HI_S32 HI_MPI_VB_GetConf(VB_CONF_S *pstVbConf); + +HI_S32 HI_MPI_VB_MmapPool(VB_POOL Pool); +HI_S32 HI_MPI_VB_MunmapPool(VB_POOL Pool); + +HI_S32 HI_MPI_VB_GetBlkVirAddr(VB_POOL Pool, HI_U32 u32PhyAddr, HI_VOID **ppVirAddr); + +HI_S32 HI_MPI_VB_InitModCommPool(VB_UID_E enVbUid); +HI_S32 HI_MPI_VB_ExitModCommPool(VB_UID_E enVbUid); + +HI_S32 HI_MPI_VB_SetModPoolConf(VB_UID_E enVbUid, const VB_CONF_S *pstVbConf); +HI_S32 HI_MPI_VB_GetModPoolConf(VB_UID_E enVbUid, VB_CONF_S *pstVbConf); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /*__MPI_VI_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vda.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vda.h new file mode 100644 index 0000000..9f7255c --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vda.h @@ -0,0 +1,58 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vda.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/09 + Description : + History : + 1.Date : 2013/05/09 + Author : x00100808 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_VDA_H__ +#define __MPI_VDA_H__ + +#include "hi_comm_vda.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +HI_S32 HI_MPI_VDA_CreateChn(VDA_CHN VdaChn, const VDA_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VDA_DestroyChn(VDA_CHN VdaChn); + +HI_S32 HI_MPI_VDA_GetChnAttr(VDA_CHN VdaChn, VDA_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VDA_SetChnAttr(VDA_CHN VdaChn, const VDA_CHN_ATTR_S *pstAttr); + +HI_S32 HI_MPI_VDA_StartRecvPic(VDA_CHN VdaChn); +HI_S32 HI_MPI_VDA_StopRecvPic(VDA_CHN VdaChn); + +HI_S32 HI_MPI_VDA_GetData(VDA_CHN VdaChn, VDA_DATA_S *pstVdaData, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VDA_ReleaseData(VDA_CHN VdaChn, const VDA_DATA_S* pstVdaData); + +HI_S32 HI_MPI_VDA_ResetOdRegion(VDA_CHN VdaChn, HI_S32 s32RgnIndex); + +HI_S32 HI_MPI_VDA_Query(VDA_CHN VdaChn, VDA_CHN_STAT_S *pstChnStat); + +HI_S32 HI_MPI_VDA_GetFd(VDA_CHN VdaChn); + +HI_S32 HI_MPI_VDA_UpdateRef(VDA_CHN VdaChn, const VIDEO_FRAME_INFO_S *pstRefFrame); + +HI_S32 HI_MPI_VDA_SendPic(VDA_CHN VdaChn, const VIDEO_FRAME_INFO_S *pstUserFrame, HI_S32 s32MilliSec); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __MPI_VDA_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vdec.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vdec.h new file mode 100644 index 0000000..1010918 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vdec.h @@ -0,0 +1,84 @@ +/****************************************************************************** + + Copyright (C), 2013, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vdec.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/08 + Description : MPP Programe Interface for video decode + History : + 1.Date : 2013/05/08 + Author : l00226816 + Modification: Created file +******************************************************************************/ +#ifndef __MPI_VDEC_H__ +#define __MPI_VDEC_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_vdec.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +HI_S32 HI_MPI_VDEC_CreateChn(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VDEC_DestroyChn(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_GetChnAttr(VDEC_CHN VdChn, VDEC_CHN_ATTR_S *pstAttr); + +HI_S32 HI_MPI_VDEC_StartRecvStream(VDEC_CHN VdChn); +HI_S32 HI_MPI_VDEC_StopRecvStream(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_Query(VDEC_CHN VdChn,VDEC_CHN_STAT_S *pstStat); + +HI_S32 HI_MPI_VDEC_GetFd(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_ResetChn(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_SetChnParam(VDEC_CHN VdChn, VDEC_CHN_PARAM_S* pstParam); +HI_S32 HI_MPI_VDEC_GetChnParam(VDEC_CHN VdChn, VDEC_CHN_PARAM_S* pstParam); + +HI_S32 HI_MPI_VDEC_SetProtocolParam(VDEC_CHN VdChn,VDEC_PRTCL_PARAM_S *pstParam); +HI_S32 HI_MPI_VDEC_GetProtocolParam(VDEC_CHN VdChn,VDEC_PRTCL_PARAM_S *pstParam); + +/* s32MilliSec: -1 is block 0 is no blockother positive number is timeout */ +HI_S32 HI_MPI_VDEC_SendStream(VDEC_CHN VdChn, const VDEC_STREAM_S *pstStream, HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VDEC_GetImage(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstFrameInfo,HI_S32 s32MilliSec); +HI_S32 HI_MPI_VDEC_ReleaseImage(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstFrameInfo); + +HI_S32 HI_MPI_VDEC_GetUserData(VDEC_CHN VdChn, VDEC_USERDATA_S *pstUserData, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VDEC_ReleaseUserData(VDEC_CHN VdChn, VDEC_USERDATA_S *pstUserData); + +HI_S32 HI_MPI_VDEC_SetRotate(VDEC_CHN VdChn, ROTATE_E enRotate); +HI_S32 HI_MPI_VDEC_GetRotate(VDEC_CHN VdChn, ROTATE_E *penRotate); + +HI_S32 HI_MPI_VDEC_GetChnLuma(VDEC_CHN VdChn, VDEC_CHN_LUM_S *pstLuma); + +HI_S32 HI_MPI_VDEC_SetUserPic(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstUsrPic); +HI_S32 HI_MPI_VDEC_EnableUserPic(VDEC_CHN VdChn, HI_BOOL bInstant); +HI_S32 HI_MPI_VDEC_DisableUserPic(VDEC_CHN VdChn); + +HI_S32 HI_MPI_VDEC_SetDisplayMode(VDEC_CHN VdChn, VIDEO_DISPLAY_MODE_E enDisplayMode); +HI_S32 HI_MPI_VDEC_GetDisplayMode(VDEC_CHN VdChn, VIDEO_DISPLAY_MODE_E *penDisplayMode); + +HI_S32 HI_MPI_VDEC_SetChnVBCnt(VDEC_CHN VdChn, HI_U32 u32BlkCnt); +HI_S32 HI_MPI_VDEC_GetChnVBCnt(VDEC_CHN VdChn, HI_U32 *pu32BlkCnt); + + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* End of #ifndef __MPI_VDEC_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_venc.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_venc.h new file mode 100644 index 0000000..69fd6ca --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_venc.h @@ -0,0 +1,170 @@ +/****************************************************************************** + + Copyright (C), 2001-2012, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_venc.h + Version : Initial Draft + Author : Hisilicon Hi35xx MPP Team + Created : 2006/11/22 + Last Modified : + Description : mpi functions declaration + Function List : + History : +******************************************************************************/ +#ifndef __MPI_VENC_H__ +#define __MPI_VENC_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_venc.h" +#include "hi_comm_vb.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_VENC_CreateChn(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VENC_DestroyChn(VENC_CHN VeChn); +HI_S32 HI_MPI_VENC_SetChnlPriority(VENC_CHN VeChn, HI_U32 u32Priority); +HI_S32 HI_MPI_VENC_GetChnlPriority(VENC_CHN VeChn, HI_U32 *pu32Priority); +HI_S32 HI_MPI_VENC_ResetChn(VENC_CHN VeChn); + +HI_S32 HI_MPI_VENC_StartRecvPic(VENC_CHN VeChn); +HI_S32 HI_MPI_VENC_StartRecvPicEx(VENC_CHN VeChn, VENC_RECV_PIC_PARAM_S *pstRecvParam); +HI_S32 HI_MPI_VENC_StopRecvPic(VENC_CHN VeChn); + +HI_S32 HI_MPI_VENC_Query(VENC_CHN VeChn, VENC_CHN_STAT_S *pstStat); + +HI_S32 HI_MPI_VENC_SetChnAttr(VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VENC_GetChnAttr(VENC_CHN VeChn, VENC_CHN_ATTR_S *pstAttr); +/*-1:bolck 0:nonblock >0 : overtime */ +HI_S32 HI_MPI_VENC_GetStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VENC_ReleaseStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream); + +HI_S32 HI_MPI_VENC_InsertUserData(VENC_CHN VeChn, HI_U8 *pu8Data, HI_U32 u32Len); +/*-1:bolck 0:nonblock >0 : overtime */ +HI_S32 HI_MPI_VENC_SendFrame(VENC_CHN VeChn, VIDEO_FRAME_INFO_S *pstFrame ,HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VENC_SetMaxStreamCnt(VENC_CHN VeChn, HI_U32 u32MaxStrmCnt); +HI_S32 HI_MPI_VENC_GetMaxStreamCnt(VENC_CHN VeChn, HI_U32 *pu32MaxStrmCnt); + +HI_S32 HI_MPI_VENC_RequestIDR(VENC_CHN VeChn,HI_BOOL bInstant); + +HI_S32 HI_MPI_VENC_GetFd(VENC_CHN VeChn); +HI_S32 HI_MPI_VENC_CloseFd(VENC_CHN VeChn); + + +HI_S32 HI_MPI_VENC_SetRoiCfg(VENC_CHN VeChn, VENC_ROI_CFG_S *pstVencRoiCfg); +HI_S32 HI_MPI_VENC_GetRoiCfg(VENC_CHN VeChn, HI_U32 u32Index, VENC_ROI_CFG_S *pstVencRoiCfg); + +HI_S32 HI_MPI_VENC_SetRoiBgFrameRate(VENC_CHN VeChn, const VENC_ROIBG_FRAME_RATE_S *pstRoiBgFrmRate); +HI_S32 HI_MPI_VENC_GetRoiBgFrameRate(VENC_CHN VeChn, VENC_ROIBG_FRAME_RATE_S *pstRoiBgFrmRate); + +HI_S32 HI_MPI_VENC_SetH264SliceSplit(VENC_CHN VeChn, const VENC_PARAM_H264_SLICE_SPLIT_S *pstSliceSplit); +HI_S32 HI_MPI_VENC_GetH264SliceSplit(VENC_CHN VeChn, VENC_PARAM_H264_SLICE_SPLIT_S *pstSliceSplit); + +HI_S32 HI_MPI_VENC_SetH264InterPred(VENC_CHN VeChn, const VENC_PARAM_H264_INTER_PRED_S *pstH264InterPred); +HI_S32 HI_MPI_VENC_GetH264InterPred(VENC_CHN VeChn, VENC_PARAM_H264_INTER_PRED_S *pstH264InterPred); + +HI_S32 HI_MPI_VENC_SetH264IntraPred(VENC_CHN VeChn, const VENC_PARAM_H264_INTRA_PRED_S *pstH264InterPred); +HI_S32 HI_MPI_VENC_GetH264IntraPred(VENC_CHN VeChn, VENC_PARAM_H264_INTRA_PRED_S *pstH264InterPred); + +HI_S32 HI_MPI_VENC_SetH264Trans(VENC_CHN VeChn, const VENC_PARAM_H264_TRANS_S *pstH264Trans); +HI_S32 HI_MPI_VENC_GetH264Trans(VENC_CHN VeChn, VENC_PARAM_H264_TRANS_S *pstH264Trans); + +HI_S32 HI_MPI_VENC_SetH264Entropy(VENC_CHN VeChn, const VENC_PARAM_H264_ENTROPY_S *pstH264EntropyEnc); +HI_S32 HI_MPI_VENC_GetH264Entropy(VENC_CHN VeChn, VENC_PARAM_H264_ENTROPY_S *pstH264EntropyEnc); + +HI_S32 HI_MPI_VENC_SetH264Poc(VENC_CHN VeChn, const VENC_PARAM_H264_POC_S *pstH264Poc); +HI_S32 HI_MPI_VENC_GetH264Poc(VENC_CHN VeChn, VENC_PARAM_H264_POC_S *pstH264Poc); + +HI_S32 HI_MPI_VENC_SetH264Dblk(VENC_CHN VeChn, const VENC_PARAM_H264_DBLK_S *pstH264Dblk); +HI_S32 HI_MPI_VENC_GetH264Dblk(VENC_CHN VeChn, VENC_PARAM_H264_DBLK_S *pstH264Dblk); + +HI_S32 HI_MPI_VENC_SetH264Vui(VENC_CHN VeChn, const VENC_PARAM_H264_VUI_S *pstH264Vui); +HI_S32 HI_MPI_VENC_GetH264Vui(VENC_CHN VeChn, VENC_PARAM_H264_VUI_S *pstH264Vui); + +HI_S32 HI_MPI_VENC_SetJpegParam(VENC_CHN VeChn, const VENC_PARAM_JPEG_S *pstJpegParam); +HI_S32 HI_MPI_VENC_GetJpegParam(VENC_CHN VeChn, VENC_PARAM_JPEG_S *pstJpegParam); + + +HI_S32 HI_MPI_VENC_SetMjpegParam(VENC_CHN VeChn, const VENC_PARAM_MJPEG_S *pstMjpegParam); +HI_S32 HI_MPI_VENC_GetMjpegParam(VENC_CHN VeChn, VENC_PARAM_MJPEG_S *pstMjpegParam); + +HI_S32 HI_MPI_VENC_SetFrameRate(VENC_CHN VeChn, const VENC_FRAME_RATE_S *pstFrameRate); +HI_S32 HI_MPI_VENC_GetFrameRate(VENC_CHN VeChn, VENC_FRAME_RATE_S *pstFrameRate); + +HI_S32 HI_MPI_VENC_GetRcParam(VENC_CHN VeChn, VENC_RC_PARAM_S *pstRcParam); +HI_S32 HI_MPI_VENC_SetRcParam(VENC_CHN VeChn, const VENC_RC_PARAM_S *pstRcParam); + + +HI_S32 HI_MPI_VENC_SetRefParam(VENC_CHN VeChn, const VENC_PARAM_REF_S *pstRefParam); +HI_S32 HI_MPI_VENC_GetRefParam(VENC_CHN VeChn, VENC_PARAM_REF_S *pstRefParam); + +HI_S32 HI_MPI_VENC_SetColor2Grey(VENC_CHN VeChn, const VENC_COLOR2GREY_S *pstChnColor2Grey); +HI_S32 HI_MPI_VENC_GetColor2Grey(VENC_CHN VeChn, VENC_COLOR2GREY_S *pstChnColor2Grey); + +HI_S32 HI_MPI_VENC_SetCrop(VENC_CHN VeChn, const VENC_CROP_CFG_S *pstCropCfg); +HI_S32 HI_MPI_VENC_GetCrop(VENC_CHN VeChn, VENC_CROP_CFG_S *pstCropCfg); + +HI_S32 HI_MPI_VENC_SetJpegSnapMode(VENC_CHN VeChn, VENC_JPEG_SNAP_MODE_E enJpegSnapMode); +HI_S32 HI_MPI_VENC_GetJpegSnapMode(VENC_CHN VeChn, VENC_JPEG_SNAP_MODE_E *penJpegSnapMode); + +HI_S32 HI_MPI_VENC_EnableIDR(VENC_CHN VeChn, HI_BOOL bEnableIDR); + +HI_S32 HI_MPI_VENC_SetH264IdrPicId( VENC_CHN VeChn, VENC_H264_IDRPICID_CFG_S* pstH264eIdrPicIdCfg ); +HI_S32 HI_MPI_VENC_GetH264IdrPicId( VENC_CHN VeChn, VENC_H264_IDRPICID_CFG_S* pstH264eIdrPicIdCfg ); + +HI_S32 HI_MPI_VENC_GetStreamBufInfo(VENC_CHN VeChn, VENC_STREAM_BUF_INFO_S *pstStreamBufInfo); + + +HI_S32 HI_MPI_VENC_SetRcPriority(VENC_CHN VeChn, VENC_RC_PRIORITY_E enRcPriority); +HI_S32 HI_MPI_VENC_GetRcPriority(VENC_CHN VeChn, VENC_RC_PRIORITY_E *penRcPriority); + + +HI_S32 HI_MPI_VENC_SetH265SliceSplit(VENC_CHN VeChn, const VENC_PARAM_H265_SLICE_SPLIT_S *pstSliceSplit); +HI_S32 HI_MPI_VENC_GetH265SliceSplit(VENC_CHN VeChn, VENC_PARAM_H265_SLICE_SPLIT_S *pstSliceSplit); + + +HI_S32 HI_MPI_VENC_SetH265PredUnit(VENC_CHN VeChn, const VENC_PARAM_H265_PU_S *pstPredUnit); +HI_S32 HI_MPI_VENC_GetH265PredUnit(VENC_CHN VeChn, VENC_PARAM_H265_PU_S *pstPredUnit); + + +HI_S32 HI_MPI_VENC_SetH265Trans(VENC_CHN VeChn, const VENC_PARAM_H265_TRANS_S *pstH265Trans); +HI_S32 HI_MPI_VENC_GetH265Trans(VENC_CHN VeChn, VENC_PARAM_H265_TRANS_S *pstH265Trans); + +HI_S32 HI_MPI_VENC_SetH265Entropy(VENC_CHN VeChn, const VENC_PARAM_H265_ENTROPY_S *pstH265Entropy); +HI_S32 HI_MPI_VENC_GetH265Entropy(VENC_CHN VeChn, VENC_PARAM_H265_ENTROPY_S *pstH265Entropy); + +HI_S32 HI_MPI_VENC_SetH265Dblk(VENC_CHN VeChn, const VENC_PARAM_H265_DBLK_S *pstH265Dblk); +HI_S32 HI_MPI_VENC_GetH265Dblk(VENC_CHN VeChn, VENC_PARAM_H265_DBLK_S *pstH265Dblk); +HI_S32 HI_MPI_VENC_SetH265Sao(VENC_CHN VeChn, const VENC_PARAM_H265_SAO_S *pstH265Sao); +HI_S32 HI_MPI_VENC_GetH265Sao(VENC_CHN VeChn, VENC_PARAM_H265_SAO_S *pstH265Sao); + + +HI_S32 HI_MPI_VENC_SetH265Timing(VENC_CHN VeChn, const VENC_PARAM_H265_TIMING_S *pstH265Timing); +HI_S32 HI_MPI_VENC_GetH265Timing(VENC_CHN VeChn, VENC_PARAM_H265_TIMING_S *pstH265Timing); + +HI_S32 HI_MPI_VENC_SetFrameLostStrategy(VENC_CHN VeChn, const VENC_PARAM_FRAMELOST_S *pstFrmLostParam); +HI_S32 HI_MPI_VENC_GetFrameLostStrategy(VENC_CHN VeChn, VENC_PARAM_FRAMELOST_S *pstFrmLostParam); + + +HI_S32 HI_MPI_VENC_SetSuperFrameCfg(VENC_CHN VeChn, const VENC_SUPERFRAME_CFG_S *pstSuperFrmParam); +HI_S32 HI_MPI_VENC_GetSuperFrameCfg(VENC_CHN VeChn,VENC_SUPERFRAME_CFG_S *pstSuperFrmParam); + +HI_S32 HI_MPI_VENC_SetIntraRefresh(VENC_CHN VeChn, VENC_PARAM_INTRA_REFRESH_S *pstIntraRefresh); +HI_S32 HI_MPI_VENC_GetIntraRefresh(VENC_CHN VeChn, VENC_PARAM_INTRA_REFRESH_S *pstIntraRefresh); + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_VENC_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vgs.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vgs.h new file mode 100644 index 0000000..61084a9 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vgs.h @@ -0,0 +1,205 @@ +/****************************************************************************** + + Copyright (C), 2013-2033, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vgs.h + Version : Initial Draft + Author : Hisilicon Hi35xx MPP Team + Created : 2013/07/24 + Last Modified : + Description : mpi functions declaration + Function List : + History : +******************************************************************************/ +#ifndef __MPI_VGS_H__ +#define __MPI_VGS_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_vgs.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/***************************************************************************** + Prototype : HI_MPI_VGS_BeginJob + Description : Begin a vgs job,then add task into the job,vgs will finish all the task in the job. + Input : VGS_HANDLE *phHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2013/07/24 + Author : z00183560 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_BeginJob(VGS_HANDLE *phHandle); + +/***************************************************************************** + Prototype : HI_MPI_VGS_EndJob + Description : End a job,all tasks in the job will be submmitted to vgs + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2013/07/24 + Author : z00183560 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_EndJob(VGS_HANDLE hHandle); + +/***************************************************************************** + Prototype : HI_MPI_VGS_CancelJob + Description : Cancel a job ,then all tasks in the job will not be submmitted to vgs + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2013/07/24 + Author : z00183560 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_CancelJob(VGS_HANDLE hHandle); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddScaleTask + Description : Add a task to a vgs job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2013/07/24 + Author : z00183560 + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddScaleTask(VGS_HANDLE hHandle, VGS_TASK_ATTR_S *pstTask); + + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddDrawLineTask + Description : add a draw line task into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddDrawLineTask(VGS_HANDLE hHandle, VGS_TASK_ATTR_S *pstTask, VGS_DRAW_LINE_S *pstVgsDrawLine); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddCoverTask + Description : add a draw point task into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddCoverTask(VGS_HANDLE hHandle, VGS_TASK_ATTR_S *pstTask, VGS_ADD_COVER_S *pstVgsAddCover); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddOsdTask + Description : add a draw point task into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddOsdTask(VGS_HANDLE hHandle, VGS_TASK_ATTR_S *pstTask, VGS_ADD_OSD_S *pstVgsAddOsd); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddDrawLineTaskArray + Description : add draw line tasks into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddDrawLineTaskArray(VGS_HANDLE hHandle, VGS_TASK_ATTR_S * pstTask, VGS_DRAW_LINE_S astVgsDrawLine[], HI_U32 u32ArraySize); +/***************************************************************************** + Prototype : HI_MPI_VGS_AddCoverTaskArray + Description : add cover tasks into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddCoverTaskArray(VGS_HANDLE hHandle, VGS_TASK_ATTR_S * pstTask, VGS_ADD_COVER_S astVgsAddCover[], HI_U32 u32ArraySize); + +/***************************************************************************** + Prototype : HI_MPI_VGS_AddOsdTaskArray + Description : add osd tasks into a job + Input : VGS_HANDLE hHandle + Output : None + Return Value : + Calls : + Called By : + + History : + 1.Date : 2014/01/27 + Author : + Modification : Created function +<$/> +*****************************************************************************/ +HI_S32 HI_MPI_VGS_AddOsdTaskArray(VGS_HANDLE hHandle, VGS_TASK_ATTR_S * pstTask, VGS_ADD_OSD_S astVgsAddOsd[], HI_U32 u32ArraySize); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_VGS_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vi.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vi.h new file mode 100644 index 0000000..4819d30 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vi.h @@ -0,0 +1,118 @@ +/****************************************************************************** + + Copyright (C), 2013-2030, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vi.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/08 + Description : + History : + 1.Date : 2013/05/08 + Author : + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_VI_H__ +#define __MPI_VI_H__ + +#include "hi_comm_vi.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +HI_S32 HI_MPI_VI_SetDevAttr(VI_DEV ViDev, const VI_DEV_ATTR_S *pstDevAttr); +HI_S32 HI_MPI_VI_GetDevAttr(VI_DEV ViDev, VI_DEV_ATTR_S *pstDevAttr); + +HI_S32 HI_MPI_VI_EnableDev(VI_DEV ViDev); +HI_S32 HI_MPI_VI_DisableDev(VI_DEV ViDev); + +HI_S32 HI_MPI_VI_SetChnAttr(VI_CHN ViChn, const VI_CHN_ATTR_S *pstAttr); +HI_S32 HI_MPI_VI_GetChnAttr(VI_CHN ViChn, VI_CHN_ATTR_S *pstAttr); + +HI_S32 HI_MPI_VI_EnableChn(VI_CHN ViChn); +HI_S32 HI_MPI_VI_DisableChn(VI_CHN ViChn); + +HI_S32 HI_MPI_VI_GetFrame(VI_CHN ViChn, VIDEO_FRAME_INFO_S *pstFrameInfo, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VI_ReleaseFrame(VI_CHN ViChn, VIDEO_FRAME_INFO_S *pstFrameInfo); +HI_S32 HI_MPI_VI_SetFrameDepth(VI_CHN ViChn, HI_U32 u32Depth); +HI_S32 HI_MPI_VI_GetFrameDepth(VI_CHN ViChn, HI_U32 *pu32Depth); + +HI_S32 HI_MPI_VI_SetUserPic(VI_CHN ViChn, VI_USERPIC_ATTR_S *pstUsrPic); +HI_S32 HI_MPI_VI_EnableUserPic(VI_CHN ViChn); +HI_S32 HI_MPI_VI_DisableUserPic(VI_CHN ViChn); + +/* Normally, these functions are not necessary in typical business */ +HI_S32 HI_MPI_VI_BindChn(VI_CHN ViChn, const VI_CHN_BIND_ATTR_S *pstChnBindAttr); +HI_S32 HI_MPI_VI_UnBindChn(VI_CHN ViChn); +HI_S32 HI_MPI_VI_GetChnBind(VI_CHN ViChn, VI_CHN_BIND_ATTR_S *pstChnBindAttr); + +HI_S32 HI_MPI_VI_SetDevAttrEx(VI_DEV ViDev, const VI_DEV_ATTR_EX_S *pstDevAttrEx); +HI_S32 HI_MPI_VI_GetDevAttrEx(VI_DEV ViDev, VI_DEV_ATTR_EX_S *pstDevAttrEx); + +HI_S32 HI_MPI_VI_GetFd(VI_CHN ViChn); + +HI_S32 HI_MPI_VI_Query(VI_CHN ViChn, VI_CHN_STAT_S *pstStat); + +HI_S32 HI_MPI_VI_EnableChnInterrupt(VI_CHN ViChn); +HI_S32 HI_MPI_VI_DisableChnInterrupt(VI_CHN ViChn); + +HI_S32 HI_MPI_VI_SetFlashConfig(VI_DEV ViDev, const VI_FLASH_CONFIG_S *pstFlashConfig); +HI_S32 HI_MPI_VI_GetFlashConfig(VI_DEV ViDev, VI_FLASH_CONFIG_S *pstFlashConfig); +HI_S32 HI_MPI_VI_TriggerFlash(VI_DEV ViDev, HI_BOOL bEnable); + +HI_S32 HI_MPI_VI_SetExtChnAttr(VI_CHN ViChn, const VI_EXT_CHN_ATTR_S *pstExtChnAttr); +HI_S32 HI_MPI_VI_GetExtChnAttr(VI_CHN ViChn, VI_EXT_CHN_ATTR_S *pstExtChnAttr); + +HI_S32 HI_MPI_VI_SetExtChnCrop(VI_CHN ViChn, const CROP_INFO_S *pstExtChnCrop); +HI_S32 HI_MPI_VI_GetExtChnCrop(VI_CHN ViChn, CROP_INFO_S *pstExtChnCrop); + +HI_S32 HI_MPI_VI_SetLDCAttr(VI_CHN ViChn, const VI_LDC_ATTR_S *pstLDCAttr); +HI_S32 HI_MPI_VI_GetLDCAttr(VI_CHN ViChn, VI_LDC_ATTR_S *pstLDCAttr); + +HI_S32 HI_MPI_VI_SetCSCAttr(VI_DEV ViDev, const VI_CSC_ATTR_S *pstCSCAttr); +HI_S32 HI_MPI_VI_GetCSCAttr(VI_DEV ViDev, VI_CSC_ATTR_S *pstCSCAttr); + +HI_S32 HI_MPI_VI_SetRotate(VI_CHN ViChn, const ROTATE_E enRotate); +HI_S32 HI_MPI_VI_GetRotate(VI_CHN ViChn, ROTATE_E *penRotate); + +HI_S32 HI_MPI_VI_GetChnLuma(VI_CHN ViChn, VI_CHN_LUM_S *pstLuma); + +HI_S32 HI_MPI_VI_SetWDRAttr(VI_DEV ViDev, const VI_WDR_ATTR_S *pstWDRAttr); +HI_S32 HI_MPI_VI_GetWDRAttr(VI_DEV ViDev, VI_WDR_ATTR_S *pstWDRAttr); + +HI_S32 HI_MPI_VI_SetFisheyeDevConfig(VI_DEV ViDev, const FISHEYE_CONFIG_S *pstFisheyeConfig); +HI_S32 HI_MPI_VI_GetFisheyeDevConfig(VI_DEV ViDev, FISHEYE_CONFIG_S *pstFisheyeConfig); + +HI_S32 HI_MPI_VI_SetFisheyeAttr(VI_CHN ViChn, const FISHEYE_ATTR_S *pstFisheyeAttr); +HI_S32 HI_MPI_VI_GetFisheyeAttr(VI_CHN ViChn, FISHEYE_ATTR_S *pstFisheyeAttr); + +HI_S32 HI_MPI_VI_SetDevDumpAttr(VI_DEV ViDev, const VI_DUMP_ATTR_S *pstDumpAttr); +HI_S32 HI_MPI_VI_GetDevDumpAttr(VI_DEV ViDev, VI_DUMP_ATTR_S *pstDumpAttr); + +HI_S32 HI_MPI_VI_EnableBayerDump(VI_DEV ViDev); +HI_S32 HI_MPI_VI_DisableBayerDump(VI_DEV ViDev); + +HI_S32 HI_MPI_VI_EnableBayerRead(VI_DEV ViDev); +HI_S32 HI_MPI_VI_DisableBayerRead(VI_DEV ViDev); +HI_S32 HI_MPI_VI_SendBayerData(VI_DEV ViDev, const VI_RAW_DATA_INFO_S *pstRawData, HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VI_SetDCIParam(VI_DEV ViDev, const VI_DCI_PARAM_S *pstDciParam); +HI_S32 HI_MPI_VI_GetDCIParam(VI_DEV ViDev, VI_DCI_PARAM_S *pstDciParam); + +HI_S32 HI_MPI_VI_CloseFd(HI_VOID); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /*__MPI_VI_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vo.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vo.h new file mode 100644 index 0000000..c1afb01 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vo.h @@ -0,0 +1,128 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vo.h + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2013/05/08 + Description : + History : + 1.Date : 2013/05/08 + Author : d00224772 + Modification: Created file + +******************************************************************************/ +#ifndef __MPI_VO_H__ +#define __MPI_VO_H__ + +#include "hi_comm_vo.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" +{ +#endif +#endif /* __cplusplus */ + +/* Device Settings */ + +HI_S32 HI_MPI_VO_Enable (VO_DEV VoDev); +HI_S32 HI_MPI_VO_Disable(VO_DEV VoDev); + +HI_S32 HI_MPI_VO_SetPubAttr(VO_DEV VoDev, const VO_PUB_ATTR_S *pstPubAttr); +HI_S32 HI_MPI_VO_GetPubAttr(VO_DEV VoDev, VO_PUB_ATTR_S *pstPubAttr); + +HI_S32 HI_MPI_VO_CloseFd(HI_VOID); + +/* Video Settings */ + +HI_S32 HI_MPI_VO_EnableVideoLayer (VO_LAYER VoLayer); +HI_S32 HI_MPI_VO_DisableVideoLayer(VO_LAYER VoLayer); + +HI_S32 HI_MPI_VO_SetVideoLayerAttr(VO_LAYER VoLayer, const VO_VIDEO_LAYER_ATTR_S *pstLayerAttr); +HI_S32 HI_MPI_VO_GetVideoLayerAttr(VO_LAYER VoLayer, VO_VIDEO_LAYER_ATTR_S *pstLayerAttr); + +HI_S32 HI_MPI_VO_SetVideoLayerPriority(VO_LAYER VoLayer, HI_U32 u32Priority); +HI_S32 HI_MPI_VO_GetVideoLayerPriority(VO_LAYER VoLayer, HI_U32 *pu32Priority); + +HI_S32 HI_MPI_VO_SetVideoLayerCSC(VO_LAYER VoLayer, const VO_CSC_S *pstVideoCSC); +HI_S32 HI_MPI_VO_GetVideoLayerCSC(VO_LAYER VoLayer, VO_CSC_S *pstVideoCSC); + +HI_S32 HI_MPI_VO_SetVideoLayerPartitionMode(VO_LAYER VoLayer, VO_PART_MODE_E enPartMode); +HI_S32 HI_MPI_VO_GetVideoLayerPartitionMode(VO_LAYER VoLayer, VO_PART_MODE_E *penPartMode); + +HI_S32 HI_MPI_VO_SetAttrBegin(VO_LAYER VoLayer); +HI_S32 HI_MPI_VO_SetAttrEnd (VO_LAYER VoLayer); + +HI_S32 HI_MPI_VO_SetPlayToleration(VO_LAYER VoLayer, HI_U32 u32Toleration); +HI_S32 HI_MPI_VO_GetPlayToleration(VO_LAYER VoLayer, HI_U32 *pu32Toleration); + +HI_S32 HI_MPI_VO_GetScreenFrame (VO_LAYER VoLayer, VIDEO_FRAME_INFO_S *pstVFrame, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VO_ReleaseScreenFrame(VO_LAYER VoLayer, VIDEO_FRAME_INFO_S *pstVFrame); + +HI_S32 HI_MPI_VO_SetDispBufLen(VO_LAYER VoLayer, HI_U32 u32BufLen); +HI_S32 HI_MPI_VO_GetDispBufLen(VO_LAYER VoLayer, HI_U32 *pu32BufLen); + +/* General Operation of Channel */ + +HI_S32 HI_MPI_VO_EnableChn (VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_DisableChn(VO_LAYER VoLayer, VO_CHN VoChn); + +HI_S32 HI_MPI_VO_SetChnAttr(VO_LAYER VoLayer, VO_CHN VoChn, const VO_CHN_ATTR_S *pstChnAttr); +HI_S32 HI_MPI_VO_GetChnAttr(VO_LAYER VoLayer, VO_CHN VoChn, VO_CHN_ATTR_S *pstChnAttr); + +HI_S32 HI_MPI_VO_SetChnField(VO_LAYER VoLayer, VO_CHN VoChn, const VO_DISPLAY_FIELD_E enField); +HI_S32 HI_MPI_VO_GetChnField(VO_LAYER VoLayer, VO_CHN VoChn, VO_DISPLAY_FIELD_E *pField); + +HI_S32 HI_MPI_VO_SetChnFrameRate(VO_LAYER VoLayer, VO_CHN VoChn, HI_S32 s32ChnFrmRate); +HI_S32 HI_MPI_VO_GetChnFrameRate(VO_LAYER VoLayer, VO_CHN VoChn, HI_S32 *ps32ChnFrmRate); + +HI_S32 HI_MPI_VO_GetChnFrame(VO_LAYER VoLayer, VO_CHN VoChn, VIDEO_FRAME_INFO_S *pstFrame, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VO_ReleaseChnFrame(VO_LAYER VoLayer, VO_CHN VoChn, const VIDEO_FRAME_INFO_S *pstFrame); + +HI_S32 HI_MPI_VO_PauseChn (VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_ResumeChn(VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_StepChn(VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_RefreshChn( VO_LAYER VoLayer, VO_CHN VoChn); + +HI_S32 HI_MPI_VO_ShowChn(VO_LAYER VoLayer, VO_CHN VoChn); +HI_S32 HI_MPI_VO_HideChn(VO_LAYER VoLayer, VO_CHN VoChn); + +HI_S32 HI_MPI_VO_SetZoomInWindow(VO_LAYER VoLayer, VO_CHN VoChn, const VO_ZOOM_ATTR_S *pstZoomAttr); +HI_S32 HI_MPI_VO_GetZoomInWindow(VO_LAYER VoLayer, VO_CHN VoChn, VO_ZOOM_ATTR_S *pstZoomAttr); + +HI_S32 HI_MPI_VO_GetChnPts (VO_LAYER VoLayer, VO_CHN VoChn, HI_U64 *pu64ChnPts); +HI_S32 HI_MPI_VO_QueryChnStat(VO_LAYER VoLayer, VO_CHN VoChn, VO_QUERY_STATUS_S *pstStatus); + +HI_S32 HI_MPI_VO_SendFrame(VO_LAYER VoLayer, VO_CHN VoChn, VIDEO_FRAME_INFO_S *pstVFrame, HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VO_ClearChnBuffer(VO_LAYER VoLayer, VO_CHN VoChn, HI_BOOL bClrAll); + +HI_S32 HI_MPI_VO_SetChnBorder(VO_LAYER VoLayer, VO_CHN VoChn, const VO_BORDER_S *pstBorder); +HI_S32 HI_MPI_VO_GetChnBorder(VO_LAYER VoLayer, VO_CHN VoChn, VO_BORDER_S *pstBorder); + +HI_S32 HI_MPI_VO_SetChnReceiveThreshold(VO_LAYER VoLayer, VO_CHN VoChn, HI_U32 u32Threshold); +HI_S32 HI_MPI_VO_GetChnReceiveThreshold(VO_LAYER VoLayer, VO_CHN VoChn, HI_U32 *pu32Threshold); + +HI_S32 HI_MPI_VO_GetChnRegionLuma(VO_LAYER VoLayer, VO_CHN VoChn, VO_REGION_INFO_S *pstRegionInfo, + HI_U32 *pu32LumaData, HI_S32 s32MilliSec); +/* GraphicLayer setting */ + + +HI_S32 HI_MPI_VO_SetGraphicLayerCSC(GRAPHIC_LAYER GraphicLayer, const VO_CSC_S *pstCSC); +HI_S32 HI_MPI_VO_GetGraphicLayerCSC(GRAPHIC_LAYER GraphicLayer, VO_CSC_S *pstCSC); + +HI_S32 HI_MPI_VO_SetDevFrameRate(VO_DEV VoDev, HI_U32 u32FrameRate); +HI_S32 HI_MPI_VO_GetDevFrameRate(VO_DEV VoDev, HI_U32 *pu32FrameRate); + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /*__MPI_VO_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vpss.h b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vpss.h new file mode 100644 index 0000000..04e78fb --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/mpi_vpss.h @@ -0,0 +1,137 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : mpi_vpss.h + Version : Initial Draft + Author : + Created : + Last Modified : + Description : mpi functions declaration + Function List : + History : + 1.Date : 20130508 + Author : l00183122 + Modification: Create +******************************************************************************/ +#ifndef __MPI_VPSS_H__ +#define __MPI_VPSS_H__ + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_vpss.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/* Group Settings */ +HI_S32 HI_MPI_VPSS_CreateGrp(VPSS_GRP VpssGrp, VPSS_GRP_ATTR_S *pstGrpAttr); +HI_S32 HI_MPI_VPSS_DestroyGrp(VPSS_GRP VpssGrp); + +HI_S32 HI_MPI_VPSS_StartGrp(VPSS_GRP VpssGrp); +HI_S32 HI_MPI_VPSS_StopGrp(VPSS_GRP VpssGrp); + +HI_S32 HI_MPI_VPSS_ResetGrp(VPSS_GRP VpssGrp); + +HI_S32 HI_MPI_VPSS_GetGrpAttr(VPSS_GRP VpssGrp, VPSS_GRP_ATTR_S *pstGrpAttr); +HI_S32 HI_MPI_VPSS_SetGrpAttr(VPSS_GRP VpssGrp, VPSS_GRP_ATTR_S *pstGrpAttr); + +HI_S32 HI_MPI_VPSS_SetGrpParam(VPSS_GRP VpssGrp, VPSS_GRP_PARAM_S *pstVpssParam); +HI_S32 HI_MPI_VPSS_GetGrpParam(VPSS_GRP VpssGrp, VPSS_GRP_PARAM_S *pstVpssParam); + +HI_S32 HI_MPI_VPSS_SetGrpParamV2(VPSS_GRP VpssGrp, VPSS_GRP_PARAM_V2_S *pstVpssParamV2); +HI_S32 HI_MPI_VPSS_GetGrpParamV2(VPSS_GRP VpssGrp, VPSS_GRP_PARAM_V2_S *pstVpssParamV2); + +HI_S32 HI_MPI_VPSS_SetGrpDelay(VPSS_GRP VpssGrp, HI_U32 u32Delay); +HI_S32 HI_MPI_VPSS_GetGrpDelay(VPSS_GRP VpssGrp, HI_U32 *pu32Delay); + +HI_S32 HI_MPI_VPSS_SetGrpFrameRate(VPSS_GRP VpssGrp, VPSS_FRAME_RATE_S *pstVpssFrameRate); +HI_S32 HI_MPI_VPSS_GetGrpFrameRate(VPSS_GRP VpssGrp, VPSS_FRAME_RATE_S *pstVpssFrameRate); + +HI_S32 HI_MPI_VPSS_SetGrpCrop(VPSS_GRP VpssGrp, VPSS_CROP_INFO_S *pstCropInfo); +HI_S32 HI_MPI_VPSS_GetGrpCrop(VPSS_GRP VpssGrp, VPSS_CROP_INFO_S *pstCropInfo); + +HI_S32 HI_MPI_VPSS_SetRefSelect(VPSS_GRP VpssGrp, const VPSS_REF_SEL_MODE_E enRefSelMode); +HI_S32 HI_MPI_VPSS_GetRefSelect(VPSS_GRP VpssGrp, VPSS_REF_SEL_MODE_E *penRefSelMode); + +HI_S32 HI_MPI_VPSS_SendFrame(VPSS_GRP VpssGrp, VIDEO_FRAME_INFO_S *pstVideoFrame, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VPSS_GetGrpFrame(VPSS_GRP VpssGrp, VIDEO_FRAME_INFO_S *pstVideoFrame, HI_U32 u32FrameIndex); +HI_S32 HI_MPI_VPSS_ReleaseGrpFrame(VPSS_GRP VpssGrp, VIDEO_FRAME_INFO_S *pstVideoFrame); + +HI_S32 HI_MPI_VPSS_EnableBackupFrame(VPSS_GRP VpssGrp); +HI_S32 HI_MPI_VPSS_DisableBackupFrame(VPSS_GRP VpssGrp); + + +/* Chn Settings */ + +HI_S32 HI_MPI_VPSS_EnableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn); +HI_S32 HI_MPI_VPSS_DisableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn); + +HI_S32 HI_MPI_VPSS_SetChnMode(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_MODE_S *pstVpssMode); +HI_S32 HI_MPI_VPSS_GetChnMode(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_MODE_S *pstVpssMode); + +HI_S32 HI_MPI_VPSS_GetChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_ATTR_S *pstChnAttr); +HI_S32 HI_MPI_VPSS_SetChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_ATTR_S *pstChnAttr); + +HI_S32 HI_MPI_VPSS_SetChnParam(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_PARAM_S *pstChnSpParam); +HI_S32 HI_MPI_VPSS_GetChnParam(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CHN_PARAM_S *pstChnSpParam); + +HI_S32 HI_MPI_VPSS_SetDepth(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, HI_U32 u32Depth); +HI_S32 HI_MPI_VPSS_GetDepth(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, HI_U32 *pu32Depth); + +HI_S32 HI_MPI_VPSS_GetChnFrame(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, + VIDEO_FRAME_INFO_S *pstVideoFrame, HI_S32 s32MilliSec); +HI_S32 HI_MPI_VPSS_ReleaseChnFrame(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VIDEO_FRAME_INFO_S *pstVideoFrame); + +HI_S32 HI_MPI_VPSS_SetChnNR(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, HI_BOOL bEnable); +HI_S32 HI_MPI_VPSS_GetChnNR(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, HI_BOOL *pbEnable); + +HI_S32 HI_MPI_VPSS_SetChnCrop(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CROP_INFO_S *pstCropInfo); +HI_S32 HI_MPI_VPSS_GetChnCrop(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CROP_INFO_S *pstCropInfo); + +HI_S32 HI_MPI_VPSS_SetChnCover(VPSS_GRP VpssGrp,VPSS_CHN VpssChn, HI_U32 u32CoverMask); +HI_S32 HI_MPI_VPSS_GetChnCover(VPSS_GRP VpssGrp,VPSS_CHN VpssChn, HI_U32 *pu32CoverMask); + +HI_S32 HI_MPI_VPSS_SetChnOverlay(VPSS_GRP VpssGrp,VPSS_CHN VpssChn, HI_U32 u32OverlayMask); +HI_S32 HI_MPI_VPSS_GetChnOverlay(VPSS_GRP VpssGrp,VPSS_CHN VpssChn, HI_U32 *pu32OverlayMask); + +HI_S32 HI_MPI_VPSS_SetLDCAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const VPSS_LDC_ATTR_S *pstLDCAttr); +HI_S32 HI_MPI_VPSS_GetLDCAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_LDC_ATTR_S *pstLDCAttr); + +HI_S32 HI_MPI_VPSS_SetFisheyeConfig(VPSS_GRP VpssGrp, const FISHEYE_CONFIG_S *pstFisheyeConfig); +HI_S32 HI_MPI_VPSS_GetFisheyeConfig(VPSS_GRP VpssGrp, FISHEYE_CONFIG_S *pstFisheyeConfig); + +HI_S32 HI_MPI_VPSS_SetFisheyeAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const FISHEYE_ATTR_S *pstFisheyeAttr); +HI_S32 HI_MPI_VPSS_GetFisheyeAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, FISHEYE_ATTR_S *pstFisheyeAttr); + +HI_S32 HI_MPI_VPSS_SetRotate(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, ROTATE_E enRotate); +HI_S32 HI_MPI_VPSS_GetRotate(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, ROTATE_E *penRotate); + +HI_S32 HI_MPI_VPSS_GetRegionLuma(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_REGION_INFO_S *pstRegionInfo, + HI_U32 *pu32LumaData,HI_S32 s32MilliSec); + +HI_S32 HI_MPI_VPSS_SetLowDelayAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_LOW_DELAY_INFO_S *pstLowDelayInfo); +HI_S32 HI_MPI_VPSS_GetLowDelayAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_LOW_DELAY_INFO_S *pstLowDelayInfo); + + +/* ExtChn Settings */ +HI_S32 HI_MPI_VPSS_SetExtChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_EXT_CHN_ATTR_S *pstExtChnAttr); +HI_S32 HI_MPI_VPSS_GetExtChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_EXT_CHN_ATTR_S *pstExtChnAttr); + +HI_S32 HI_MPI_VPSS_SetExtChnCrop(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const VPSS_CROP_INFO_S *pstCropInfo); +HI_S32 HI_MPI_VPSS_GetExtChnCrop(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VPSS_CROP_INFO_S *pstCropInfo); + +HI_S32 HI_MPI_VPSS_SetNRParam(VPSS_GRP VpssGrp, VPSS_NR_PARAM_U *punNrParam); +HI_S32 HI_MPI_VPSS_GetNRParam(VPSS_GRP VpssGrp, VPSS_NR_PARAM_U *punNrParam); +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* __MPI_VPSS_H__ */ + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/include/strlib.h b/device/mpp/sample/hisi_rtsp_demo-master/include/strlib.h new file mode 100644 index 0000000..d47430c --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/include/strlib.h @@ -0,0 +1,123 @@ + +/*-------------------------------------------------------------------------*/ +/** + @file strlib.h + @author N. Devillard + @date Jan 2001 + @version + @brief Various string handling routines to complement the C lib. + + This modules adds a few complementary string routines usually missing + in the standard C library. +*/ +/*--------------------------------------------------------------------------*/ + +/* + + + + +*/ + +#ifndef _STRLIB_H_ +#define _STRLIB_H_ + +/*--------------------------------------------------------------------------- + Includes + ---------------------------------------------------------------------------*/ + +#include +#include + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +/*--------------------------------------------------------------------------- + Function codes + ---------------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------------*/ +/** + @brief Convert a string to lowercase. + @param s String to convert. + @return ptr to statically allocated string. + + This function returns a pointer to a statically allocated string + containing a lowercased version of the input string. Do not free + or modify the returned string! Since the returned string is statically + allocated, it will be modified at each function call (not re-entrant). + */ +/*--------------------------------------------------------------------------*/ +char * strlwc(const char * s); + +/*-------------------------------------------------------------------------*/ +/** + @brief Convert a string to uppercase. + @param s String to convert. + @return ptr to statically allocated string. + + This function returns a pointer to a statically allocated string + containing an uppercased version of the input string. Do not free + or modify the returned string! Since the returned string is statically + allocated, it will be modified at each function call (not re-entrant). + */ +/*--------------------------------------------------------------------------*/ +char * strupc(char * s); + +/*-------------------------------------------------------------------------*/ +/** + @brief Skip blanks until the first non-blank character. + @param s String to parse. + @return Pointer to char inside given string. + + This function returns a pointer to the first non-blank character in the + given string. + */ +/*--------------------------------------------------------------------------*/ +char * strskp(char * s); + +/*-------------------------------------------------------------------------*/ +/** + @brief Remove blanks at the end of a string. + @param s String to parse. + @return ptr to statically allocated string. + + This function returns a pointer to a statically allocated string, + which is identical to the input string, except that all blank + characters at the end of the string have been removed. + Do not free or modify the returned string! Since the returned string + is statically allocated, it will be modified at each function call + (not re-entrant). + */ +/*--------------------------------------------------------------------------*/ +char * strcrop(char * s); + +/*-------------------------------------------------------------------------*/ +/** + @brief Remove blanks at the beginning and the end of a string. + @param s String to parse. + @return ptr to statically allocated string. + + This function returns a pointer to a statically allocated string, + which is identical to the input string, except that all blank + characters at the end and the beg. of the string have been removed. + Do not free or modify the returned string! Since the returned string + is statically allocated, it will be modified at each function call + (not re-entrant). + */ +/*--------------------------------------------------------------------------*/ +char * strstrip(char * s) ; + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + + +#endif diff --git a/device/mpp/sample/hisi_rtsp_demo-master/key b/device/mpp/sample/hisi_rtsp_demo-master/key new file mode 100644 index 0000000..6cba6c8 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/key differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/key.c b/device/mpp/sample/hisi_rtsp_demo-master/key.c new file mode 100644 index 0000000..ed06f9f --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/key.c @@ -0,0 +1,214 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_vpss.h" +#include "mpi_vpss.h" +#include "mpi_vgs.h" + + + +void CS(unsigned char flag) +{ + if(flag == 0) + //system("himm 0x2016040 0xFF"); + HI_MPI_SYS_SetReg(0x20160040,0x00); + else + // system("himm 0x2016040 0x00"); + HI_MPI_SYS_SetReg(0x20160040,0xFF); +} + +void DATA(unsigned char flag) +{ + //printf("%d \n",flag); + + if(flag == 0) + //system("himm 0x2016080 0xFF"); + HI_MPI_SYS_SetReg(0x20160080,0x00); + else + //system("himm 0x2016080 0x00"); + HI_MPI_SYS_SetReg(0x20160080,0xFF); +} + + +int set_gpio_mode(unsigned int reg,int nIndex,int mode) +{ + //ֻ趨GPIO_DIRֵ. + if((reg & 0x0400) != 0x0400) + return -1; + + unsigned int nValue; + if(HI_SUCCESS == HI_MPI_SYS_GetReg(reg,&nValue)) + { + if(mode == 1) + { + nValue |= (0x01< File Name: comm.h + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Sunday, December 20, 2015 AM07:37:50 CST + ************************************************************************/ + +#ifndef __COMM_H__ +#define __COMM_H__ + +#include + +#define dbg(fmt, ...) do {printf("[DEBUG %s:%d:%s] " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);} while(0) +#define info(fmt, ...) do {printf("[INFO %s:%d:%s] " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);} while(0) +#define warn(fmt, ...) do {printf("[WARN %s:%d:%s] " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);} while(0) +#define err(fmt, ...) do {printf("[ERROR %s:%d:%s] " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);} while(0) + +#ifdef __WIN32__ +#define FD_SETSIZE 1024 +//#include +#include +#define usleep(x) Sleep((x)/1000) +#define snprintf _snprintf +#endif + +#ifdef __LINUX__ +#include +#include +#include +#include +#include +#include +#include +#endif + +#endif + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/librtsp.a b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/librtsp.a new file mode 100644 index 0000000..e2c76c4 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/librtsp.a differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/queue.h b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/queue.h new file mode 100644 index 0000000..daf4553 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/queue.h @@ -0,0 +1,574 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +/* + * This file defines five types of data structures: singly-linked lists, + * lists, simple queues, tail queues, and circular queues. + * + * A singly-linked list is headed by a single forward pointer. The + * elements are singly linked for minimum space and pointer manipulation + * overhead at the expense of O(n) removal for arbitrary elements. New + * elements can be added to the list after an existing element or at the + * head of the list. Elements being removed from the head of the list + * should use the explicit macro for this purpose for optimum + * efficiency. A singly-linked list may only be traversed in the forward + * direction. Singly-linked lists are ideal for applications with large + * datasets and few or no removals or for implementing a LIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A simple queue is headed by a pair of pointers, one the head of the + * list and the other to the tail of the list. The elements are singly + * linked to save space, so elements can only be removed from the + * head of the list. New elements can be added to the list after + * an existing element, at the head of the list, or at the end of the + * list. A simple queue may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * A circle queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the list. + * A circle queue may be traversed in either direction, but has a more + * complex end of list detection. + * + * For details on the use of these macros, see the queue(3) manual page. + */ + +/* + * List definitions. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ +#define LIST_INIT(head) do { \ + (head)->lh_first = NULL; \ +} while (/*CONSTCOND*/0) + +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ + (listelm)->field.le_next->field.le_prev = \ + &(elm)->field.le_next; \ + (listelm)->field.le_next = (elm); \ + (elm)->field.le_prev = &(listelm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + (elm)->field.le_next = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &(elm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define LIST_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.le_next = (head)->lh_first) != NULL) \ + (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ + (head)->lh_first = (elm); \ + (elm)->field.le_prev = &(head)->lh_first; \ +} while (/*CONSTCOND*/0) + +#define LIST_REMOVE(elm, field) do { \ + if ((elm)->field.le_next != NULL) \ + (elm)->field.le_next->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = (elm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = ((head)->lh_first); \ + (var); \ + (var) = ((var)->field.le_next)) + +/* + * List access methods. + */ +#define LIST_EMPTY(head) ((head)->lh_first == NULL) +#define LIST_FIRST(head) ((head)->lh_first) +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + + +/* + * Singly-linked List definitions. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#define SLIST_INIT(head) do { \ + (head)->slh_first = NULL; \ +} while (/*CONSTCOND*/0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define SLIST_REMOVE_HEAD(head, field) do { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} while (/*CONSTCOND*/0) + +#define SLIST_REMOVE(head, elm, type, field) do { \ + if ((head)->slh_first == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = (head)->slh_first; \ + while(curelm->field.sle_next != (elm)) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = \ + curelm->field.sle_next->field.sle_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define SLIST_FOREACH(var, head, field) \ + for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) + +/* + * Singly-linked List access methods. + */ +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) +#define SLIST_FIRST(head) ((head)->slh_first) +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + + +/* + * Singly-linked Tail queue declarations. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first; /* first element */ \ + struct type **stqh_last; /* addr of last next element */ \ +} + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_INIT(head) do { \ + (head)->stqh_first = NULL; \ + (head)->stqh_last = &(head)->stqh_first; \ +} while (/*CONSTCOND*/0) + +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (head)->stqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.stqe_next = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &(elm)->field.stqe_next; \ +} while (/*CONSTCOND*/0) + +#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (listelm)->field.stqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \ + (head)->stqh_last = &(head)->stqh_first; \ +} while (/*CONSTCOND*/0) + +#define STAILQ_REMOVE(head, elm, type, field) do { \ + if ((head)->stqh_first == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->stqh_first; \ + while (curelm->field.stqe_next != (elm)) \ + curelm = curelm->field.stqe_next; \ + if ((curelm->field.stqe_next = \ + curelm->field.stqe_next->field.stqe_next) == NULL) \ + (head)->stqh_last = &(curelm)->field.stqe_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define STAILQ_FOREACH(var, head, field) \ + for ((var) = ((head)->stqh_first); \ + (var); \ + (var) = ((var)->field.stqe_next)) + +#define STAILQ_CONCAT(head1, head2) do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + +/* + * Singly-linked Tail queue access methods. + */ +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) +#define STAILQ_FIRST(head) ((head)->stqh_first) +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + + +/* + * Simple queue definitions. + */ +#define SIMPLEQ_HEAD(name, type) \ +struct name { \ + struct type *sqh_first; /* first element */ \ + struct type **sqh_last; /* addr of last next element */ \ +} + +#define SIMPLEQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).sqh_first } + +#define SIMPLEQ_ENTRY(type) \ +struct { \ + struct type *sqe_next; /* next element */ \ +} + +/* + * Simple queue functions. + */ +#define SIMPLEQ_INIT(head) do { \ + (head)->sqh_first = NULL; \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (head)->sqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.sqe_next = NULL; \ + *(head)->sqh_last = (elm); \ + (head)->sqh_last = &(elm)->field.sqe_next; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (listelm)->field.sqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ + if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_REMOVE(head, elm, type, field) do { \ + if ((head)->sqh_first == (elm)) { \ + SIMPLEQ_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->sqh_first; \ + while (curelm->field.sqe_next != (elm)) \ + curelm = curelm->field.sqe_next; \ + if ((curelm->field.sqe_next = \ + curelm->field.sqe_next->field.sqe_next) == NULL) \ + (head)->sqh_last = &(curelm)->field.sqe_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_FOREACH(var, head, field) \ + for ((var) = ((head)->sqh_first); \ + (var); \ + (var) = ((var)->field.sqe_next)) + +/* + * Simple queue access methods. + */ +#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL) +#define SIMPLEQ_FIRST(head) ((head)->sqh_first) +#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) + + +/* + * Tail queue definitions. + */ +#define _TAILQ_HEAD(name, type, qual) \ +struct name { \ + qual type *tqh_first; /* first element */ \ + qual type *qual *tqh_last; /* addr of last next element */ \ +} +#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,) + +#define TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } + +#define _TAILQ_ENTRY(type, qual) \ +struct { \ + qual type *tqe_next; /* next element */ \ + qual type *qual *tqe_prev; /* address of previous next element */\ +} +#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,) + +/* + * Tail queue functions. + */ +#define TAILQ_INIT(head) do { \ + (head)->tqh_first = NULL; \ + (head)->tqh_last = &(head)->tqh_first; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ + (head)->tqh_first->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.tqe_next = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ + (elm)->field.tqe_next->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_REMOVE(head, elm, field) do { \ + if (((elm)->field.tqe_next) != NULL) \ + (elm)->field.tqe_next->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = ((head)->tqh_first); \ + (var); \ + (var) = ((var)->field.tqe_next)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ + (var); \ + (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) + +#define TAILQ_CONCAT(head1, head2, field) do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + +/* + * Tail queue access methods. + */ +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) +#define TAILQ_FIRST(head) ((head)->tqh_first) +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + + +/* + * Circular queue definitions. + */ +#define CIRCLEQ_HEAD(name, type) \ +struct name { \ + struct type *cqh_first; /* first element */ \ + struct type *cqh_last; /* last element */ \ +} + +#define CIRCLEQ_HEAD_INITIALIZER(head) \ + { (void *)&head, (void *)&head } + +#define CIRCLEQ_ENTRY(type) \ +struct { \ + struct type *cqe_next; /* next element */ \ + struct type *cqe_prev; /* previous element */ \ +} + +/* + * Circular queue functions. + */ +#define CIRCLEQ_INIT(head) do { \ + (head)->cqh_first = (void *)(head); \ + (head)->cqh_last = (void *)(head); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ + (elm)->field.cqe_prev = (listelm); \ + if ((listelm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (listelm)->field.cqe_next->field.cqe_prev = (elm); \ + (listelm)->field.cqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm); \ + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ + if ((listelm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (listelm)->field.cqe_prev->field.cqe_next = (elm); \ + (listelm)->field.cqe_prev = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.cqe_next = (head)->cqh_first; \ + (elm)->field.cqe_prev = (void *)(head); \ + if ((head)->cqh_last == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (head)->cqh_first->field.cqe_prev = (elm); \ + (head)->cqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.cqe_next = (void *)(head); \ + (elm)->field.cqe_prev = (head)->cqh_last; \ + if ((head)->cqh_first == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (head)->cqh_last->field.cqe_next = (elm); \ + (head)->cqh_last = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_REMOVE(head, elm, field) do { \ + if ((elm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm)->field.cqe_prev; \ + else \ + (elm)->field.cqe_next->field.cqe_prev = \ + (elm)->field.cqe_prev; \ + if ((elm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm)->field.cqe_next; \ + else \ + (elm)->field.cqe_prev->field.cqe_next = \ + (elm)->field.cqe_next; \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_FOREACH(var, head, field) \ + for ((var) = ((head)->cqh_first); \ + (var) != (const void *)(head); \ + (var) = ((var)->field.cqe_next)) + +#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ + for ((var) = ((head)->cqh_last); \ + (var) != (const void *)(head); \ + (var) = ((var)->field.cqe_prev)) + +/* + * Circular queue access methods. + */ +#define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) +#define CIRCLEQ_FIRST(head) ((head)->cqh_first) +#define CIRCLEQ_LAST(head) ((head)->cqh_last) +#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) +#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) + +#define CIRCLEQ_LOOP_NEXT(head, elm, field) \ + (((elm)->field.cqe_next == (void *)(head)) \ + ? ((head)->cqh_first) \ + : (elm->field.cqe_next)) +#define CIRCLEQ_LOOP_PREV(head, elm, field) \ + (((elm)->field.cqe_prev == (void *)(head)) \ + ? ((head)->cqh_last) \ + : (elm->field.cqe_prev)) + +#endif /* sys/queue.h */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtp_enc.c b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtp_enc.c new file mode 100644 index 0000000..71851ba --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtp_enc.c @@ -0,0 +1,287 @@ +/************************************************************************* + > File Name: rtp_enc.c + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Saturday, December 19, 2015 PM09:16:04 CST + ************************************************************************/ + +#include +#include +#include + +#include "comm.h" +#include "rtp_enc.h" + +struct rtphdr +{ +#ifdef __BIG_ENDIAN__ + uint16_t v:2; + uint16_t p:1; + uint16_t x:1; + uint16_t cc:4; + uint16_t m:1; + uint16_t pt:7; +#else + uint16_t cc:4; + uint16_t x:1; + uint16_t p:1; + uint16_t v:2; + uint16_t pt:7; + uint16_t m:1; +#endif + uint16_t seq; + uint32_t ts; + uint32_t ssrc; +}; + +#define RTPHDR_SIZE (12) + +int rtp_enc_h264 (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]) +{ + int count = 0; + uint8_t nalhdr; + uint32_t rtp_ts; + + if (!e || !frame || len <= 0 || !packets || !pktsizs) + return -1; + + //drop 0001 + if (frame[0] == 0 && frame[1] == 0 && frame[2] == 1) { + frame += 3; + len -= 3; + } + if (frame[0] == 0 && frame[1] == 0 && frame[2] == 0 && frame[3] == 1) { + frame += 4; + len -= 4; + } + + nalhdr = frame[0]; + rtp_ts = (uint32_t)(ts * e->sample_rate / 1000000); + + while (len > 0 && packets[count] && pktsizs[count] > RTPHDR_SIZE) { + struct rtphdr *hdr = (struct rtphdr*)packets[count]; + int pktsiz = pktsizs[count]; + hdr->v = 2; + hdr->p = 0; + hdr->x = 0; + hdr->cc = 0; + hdr->m = 0; + hdr->pt = e->pt; + hdr->seq = htons(e->seq++); + hdr->ts = htonl(rtp_ts); + hdr->ssrc = htonl(e->ssrc); + + if (count == 0 && len <= pktsiz - RTPHDR_SIZE) { + hdr->m = 1; + memcpy(packets[count] + RTPHDR_SIZE, frame, len); + pktsizs[count] = RTPHDR_SIZE + len; + frame += len; + len -= len; + } else { + int mark = 0; + if (count == 0) { + frame ++; //drop nalu header + len --; + } else if (len <= pktsiz - RTPHDR_SIZE - 2) { + mark = 1; + } + hdr->m = mark; + + packets[count][RTPHDR_SIZE + 0] = (nalhdr & 0xe0) | 28;//FU-A + packets[count][RTPHDR_SIZE + 1] = (nalhdr & 0x1f);//FU-A + if (count == 0) { + packets[count][RTPHDR_SIZE + 1] |= 0x80; //S + } + + if (mark) { + packets[count][RTPHDR_SIZE + 1] |= 0x40; //E + memcpy(packets[count] + RTPHDR_SIZE + 2, frame, len); + pktsizs[count] = RTPHDR_SIZE + 2 + len; + frame += len; + len -= len; + } else { + memcpy(packets[count] + RTPHDR_SIZE + 2, frame, pktsiz - RTPHDR_SIZE - 2); + pktsizs[count] = pktsiz; + frame += pktsiz - RTPHDR_SIZE - 2; + len -= pktsiz - RTPHDR_SIZE - 2; + } + } + count ++; + } + return count; +} + +int rtp_enc_h265 (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]) +{ + int count = 0; + uint8_t nalhdr[2]; + uint32_t rtp_ts; + + if (!e || !frame || len <= 0 || !packets || !pktsizs) + return -1; + + //drop 0001 + if (frame[0] == 0 && frame[1] == 0 && frame[2] == 1) { + frame += 3; + len -= 3; + } + if (frame[0] == 0 && frame[1] == 0 && frame[2] == 0 && frame[3] == 1) { + frame += 4; + len -= 4; + } + + nalhdr[0] = frame[0]; + nalhdr[1] = frame[1]; + rtp_ts = (uint32_t)(ts * e->sample_rate / 1000000); + + while (len > 0 && packets[count] && pktsizs[count] > RTPHDR_SIZE) { + struct rtphdr *hdr = (struct rtphdr*)packets[count]; + int pktsiz = pktsizs[count]; + hdr->v = 2; + hdr->p = 0; + hdr->x = 0; + hdr->cc = 0; + hdr->m = 0; + hdr->pt = e->pt; + hdr->seq = htons(e->seq++); + hdr->ts = htonl(rtp_ts); + hdr->ssrc = htonl(e->ssrc); + + if (count == 0 && len <= pktsiz - RTPHDR_SIZE) { + hdr->m = 1; + memcpy(packets[count] + RTPHDR_SIZE, frame, len); + pktsizs[count] = RTPHDR_SIZE + len; + frame += len; + len -= len; + } else { + int mark = 0; + if (count == 0) { + frame += 2; //drop nalu header + len -= 2; + } else if (len <= pktsiz - RTPHDR_SIZE - 3) { + mark = 1; + } + hdr->m = mark; + + packets[count][RTPHDR_SIZE + 0] = (nalhdr[0] & 0x81) | (49 << 1);//FU-A + packets[count][RTPHDR_SIZE + 1] = (nalhdr[1]); + packets[count][RTPHDR_SIZE + 2] = ((nalhdr[0] >> 1) & 0x3f);//FU-A + if (count == 0) { + packets[count][RTPHDR_SIZE + 2] |= 0x80; //S + } + + if (mark) { + packets[count][RTPHDR_SIZE + 2] |= 0x40; //E + memcpy(packets[count] + RTPHDR_SIZE + 3, frame, len); + pktsizs[count] = RTPHDR_SIZE + 3 + len; + frame += len; + len -= len; + } else { + memcpy(packets[count] + RTPHDR_SIZE + 3, frame, pktsiz - RTPHDR_SIZE - 3); + pktsizs[count] = pktsiz; + frame += pktsiz - RTPHDR_SIZE - 3; + len -= pktsiz - RTPHDR_SIZE - 3; + } + } + count ++; + } + return count; +} + +int rtp_enc_aac (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]) +{ + int count = 0; + uint32_t rtp_ts; + uint32_t au_len; + + if (!e || !frame || len <= 0 || !packets || !pktsizs) + return -1; + + //drop fff + if (frame[0] == 0xff && (frame[1] & 0xf0) == 0xf0) { + frame += 7; + len -= 7; + } + + rtp_ts = (uint32_t)(ts * e->sample_rate / 1000000); + au_len = len; + + while (len > 0 && packets[count] && pktsizs[count] > RTPHDR_SIZE + 4) { + struct rtphdr *hdr = (struct rtphdr*)packets[count]; + int pktsiz = pktsizs[count]; + hdr->v = 2; + hdr->p = 0; + hdr->x = 0; + hdr->cc = 0; + hdr->m = 0; + hdr->pt = e->pt; + hdr->seq = htons(e->seq++); + hdr->ts = htonl(rtp_ts); + hdr->ssrc = htonl(e->ssrc); + + packets[count][RTPHDR_SIZE+0] = 0x00; + packets[count][RTPHDR_SIZE+1] = 0x10; + packets[count][RTPHDR_SIZE+2] = au_len >> 5; + packets[count][RTPHDR_SIZE+3] = (au_len & 0x1f) << 3; + + if (len <= pktsiz - RTPHDR_SIZE - 4) { + hdr->m = 1; + memcpy(packets[count] + RTPHDR_SIZE + 4, frame, len); + pktsizs[count] = RTPHDR_SIZE + 4 + len; + frame += len; + len -= len; + } else { + memcpy(packets[count] + RTPHDR_SIZE + 4, frame, pktsiz - RTPHDR_SIZE - 4); + pktsizs[count] = pktsiz; + frame += pktsiz - RTPHDR_SIZE - 4; + len -= pktsiz - RTPHDR_SIZE - 4; + } + count ++; + } + + return count; +} + +int rtp_enc_g711 (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]) +{ + int count = 0; + uint32_t rtp_ts; + + if (!e || !frame || len <= 0 || !packets || !pktsizs) + return -1; + + rtp_ts = (uint32_t)(ts * e->sample_rate / 1000000); + while (len > 0 && packets[count] && pktsizs[count] > RTPHDR_SIZE) { + struct rtphdr *hdr = (struct rtphdr*)packets[count]; + int pktsiz = pktsizs[count]; + hdr->v = 2; + hdr->p = 0; + hdr->x = 0; + hdr->cc = 0; + hdr->m = (e->seq == 0); + hdr->pt = e->pt; + hdr->seq = htons(e->seq++); + hdr->ts = htonl(rtp_ts); + hdr->ssrc = htonl(e->ssrc); + + if (len <= pktsiz - RTPHDR_SIZE) { + memcpy(packets[count] + RTPHDR_SIZE, frame, len); + pktsizs[count] = RTPHDR_SIZE + len; + frame += len; + len -= len; + } else { + memcpy(packets[count] + RTPHDR_SIZE, frame, pktsiz - RTPHDR_SIZE); + pktsizs[count] = pktsiz; + frame += pktsiz - RTPHDR_SIZE; + len -= pktsiz - RTPHDR_SIZE; + } + count ++; + } + + return count; +} + +int rtp_enc_g726 (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]) +{ + return rtp_enc_g711(e, frame, len, ts, packets, pktsizs); +} diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtp_enc.h b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtp_enc.h new file mode 100644 index 0000000..05138b4 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtp_enc.h @@ -0,0 +1,35 @@ +/************************************************************************* + > File Name: rtp_enc.h + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Saturday, December 19, 2015 PM08:27:54 CST + ************************************************************************/ + +#ifndef __RTP_ENC_H__ +#define __RTP_ENC_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct __rtp_enc +{ + uint8_t pt; + uint16_t seq; + uint32_t ssrc; + uint32_t sample_rate; +} rtp_enc; + +int rtp_enc_h264 (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]); +int rtp_enc_h265 (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]); +int rtp_enc_aac (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]); +int rtp_enc_g711 (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]); +int rtp_enc_g726 (rtp_enc *e, const uint8_t *frame, int len, uint64_t ts, uint8_t *packets[], int pktsizs[]); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_demo.c b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_demo.c new file mode 100644 index 0000000..1830e01 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_demo.c @@ -0,0 +1,2043 @@ +/************************************************************************* + > File Name: rtsp_demo.c + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Monday, November 23, 2015 AM12:34:09 CST + ************************************************************************/ + +#include +#include +#include +#include +#include + + +#include "comm.h" +#include "rtsp_demo.h" +#include "rtsp_msg.h" +#include "rtp_enc.h" +#include "queue.h" +#include "stream_queue.h" +#include "utils.h" + +//TODO LIST 20160529 +//support authentication + +#ifdef __WIN32__ +#define MSG_DONTWAIT 0 +#define SK_EAGAIN (WSAEWOULDBLOCK) +#define SK_EINTR (WSAEINTR) +typedef int SOCKLEN; +#endif + +#ifdef __LINUX__ +#define SOCKET_ERROR (-1) +#define INVALID_SOCKET (-1) +#define SK_EAGAIN (EAGAIN) +#define SK_EINTR (EINTR) +#define closesocket(x) close(x) +typedef int SOCKET; +typedef socklen_t SOCKLEN; +#endif + +static int sk_errno (void) +{ +#ifdef __WIN32__ + return WSAGetLastError(); +#endif +#ifdef __LINUX__ + return (errno); +#endif +} + +static const char *sk_strerror (int err) +{ +#ifdef __WIN32__ + static char serr_code_buf[24]; + sprintf(serr_code_buf, "WSAE-%d", err); + return serr_code_buf; +#endif +#ifdef __LINUX__ + return strerror(err); +#endif +} + +struct rtsp_session; +struct rtsp_client_connection; +TAILQ_HEAD(rtsp_session_queue_head, rtsp_session); +TAILQ_HEAD(rtsp_client_connection_queue_head, rtsp_client_connection); + +struct rtsp_session +{ + char path[64]; + int vcodec_id; + int acodec_id; + + union { + struct codec_data_h264 h264; + struct codec_data_h265 h265; + } vcodec_data; + + union { + struct codec_data_g726 g726; + struct codec_data_aac aac; + } acodec_data; + + rtp_enc vrtpe; + rtp_enc artpe; + struct stream_queue *vstreamq; + struct stream_queue *astreamq; + + uint64_t video_ntptime_of_zero_ts; + uint64_t audio_ntptime_of_zero_ts; + + struct rtsp_demo *demo; + struct rtsp_client_connection_queue_head connections_qhead; + TAILQ_ENTRY(rtsp_session) demo_entry; +}; + +struct rtp_connection +{ + int is_over_tcp; + SOCKET tcp_sockfd; //if is_over_tcp=1. rtsp socket + int tcp_interleaved[2];//if is_over_tcp=1. [0] is rtp interleaved, [1] is rtcp interleaved + SOCKET udp_sockfd[2]; //if is_over_tcp=0. [0] is rtp socket, [1] is rtcp socket + uint16_t udp_localport[2]; //if is_over_tcp=0. [0] is rtp local port, [1] is rtcp local port + uint16_t udp_peerport[2]; //if is_over_tcp=0. [0] is rtp peer port, [1] is rtcp peer port + struct in_addr peer_addr; //peer ipv4 addr + int streamq_index; + uint32_t ssrc; + uint32_t rtcp_packet_count; + uint32_t rtcp_octet_count; + uint64_t rtcp_last_ts; +}; + +#define RTSP_CC_STATE_INIT 0 +#define RTSP_CC_STATE_READY 1 +#define RTSP_CC_STATE_PLAYING 2 +#define RTSP_CC_STATE_RECORDING 3 + +struct rtsp_client_connection +{ + int state; //session state +#define RTSP_CC_STATE_INIT 0 +#define RTSP_CC_STATE_READY 1 +#define RTSP_CC_STATE_PLAYING 2 +#define RTSP_CC_STATE_RECORDING 3 + + SOCKET sockfd; //rtsp client socket + struct in_addr peer_addr; //peer ipv4 addr + unsigned long session_id; //session id + + char reqbuf[1024]; + int reqlen; + + struct rtp_connection *vrtp; + struct rtp_connection *artp; + + struct rtsp_demo *demo; + struct rtsp_session *session; + TAILQ_ENTRY(rtsp_client_connection) demo_entry; + TAILQ_ENTRY(rtsp_client_connection) session_entry; +}; + +struct rtsp_demo +{ + SOCKET sockfd; //rtsp server socket 0:invalid + struct rtsp_session_queue_head sessions_qhead; + struct rtsp_client_connection_queue_head connections_qhead; +}; + +static struct rtsp_demo *__alloc_demo (void) +{ + struct rtsp_demo *d = (struct rtsp_demo*) calloc(1, sizeof(struct rtsp_demo)); + if (NULL == d) { + err("alloc memory for rtsp_demo failed\n"); + return NULL; + } + TAILQ_INIT(&d->sessions_qhead); + TAILQ_INIT(&d->connections_qhead); + return d; +} + +static void __free_demo (struct rtsp_demo *d) +{ + if (d) { + free(d); + } +} + +static struct rtsp_session *__alloc_session (struct rtsp_demo *d) +{ + struct rtsp_session *s = (struct rtsp_session*) calloc(1, sizeof(struct rtsp_session)); + if (NULL == s) { + err("alloc memory for rtsp_session failed\n"); + return NULL; + } + + s->demo = d; + TAILQ_INIT(&s->connections_qhead); + TAILQ_INSERT_TAIL(&d->sessions_qhead, s, demo_entry); + return s; +} + +static void __free_session (struct rtsp_session *s) +{ + if (s) { + struct rtsp_demo *d = s->demo; + TAILQ_REMOVE(&d->sessions_qhead, s, demo_entry); + free(s); + } +} + +static struct rtsp_client_connection *__alloc_client_connection (struct rtsp_demo *d) +{ + struct rtsp_client_connection *cc = (struct rtsp_client_connection*) calloc(1, sizeof(struct rtsp_client_connection)); + if (NULL == cc) { + err("alloc memory for rtsp_session failed\n"); + return NULL; + } + + cc->demo = d; + TAILQ_INSERT_TAIL(&d->connections_qhead, cc, demo_entry); + return cc; +} + +static void __free_client_connection (struct rtsp_client_connection *cc) +{ + if (cc) { + struct rtsp_demo *d = cc->demo; + TAILQ_REMOVE(&d->connections_qhead, cc, demo_entry); + free(cc); + } +} + +static void __client_connection_bind_session (struct rtsp_client_connection *cc, struct rtsp_session *s) +{ + if (cc->session == NULL) { + cc->session = s; + TAILQ_INSERT_TAIL(&s->connections_qhead, cc, session_entry); + } +} + +static void __client_connection_unbind_session (struct rtsp_client_connection *cc) +{ + struct rtsp_session *s = cc->session; + if (s) { + TAILQ_REMOVE(&s->connections_qhead, cc, session_entry); + cc->session = NULL; + } +} + +rtsp_demo_handle rtsp_new_demo (int port) +{ + struct rtsp_demo *d = NULL; + struct sockaddr_in inaddr; + SOCKET sockfd; + int ret; + +#ifdef __WIN32__ + WSADATA ws; + WSAStartup(MAKEWORD(2,2), &ws); +#endif + + d = __alloc_demo(); + if (NULL == d) { + return NULL; + } + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd == INVALID_SOCKET) { + err("create socket failed : %s\n", sk_strerror(sk_errno())); + __free_demo(d); + return NULL; + } + + if (port <= 0) + port = 554; + + memset(&inaddr, 0, sizeof(inaddr)); + inaddr.sin_family = AF_INET; + inaddr.sin_addr.s_addr = htonl(INADDR_ANY); + inaddr.sin_port = htons(port); + ret = bind(sockfd, (struct sockaddr*)&inaddr, sizeof(inaddr)); + if (ret == SOCKET_ERROR) { + err("bind socket to address failed : %s\n", sk_strerror(sk_errno())); + closesocket(sockfd); + __free_demo(d); + return NULL; + } + + ret = listen(sockfd, 128); //XXX + if (ret == SOCKET_ERROR) { + err("listen socket failed : %s\n", sk_strerror(sk_errno())); + closesocket(sockfd); + __free_demo(d); + return NULL; + } + + d->sockfd = sockfd; + + info("rtsp server demo starting on port %d\n", port); + return (rtsp_demo_handle)d; +} + +#ifdef __WIN32__ +#include +#endif +#ifdef __LINUX__ +#include +#include +#endif + +static int rtsp_set_client_socket (SOCKET sockfd) +{ + int ret; + +#ifdef __WIN32__ + unsigned long nonblocked = 1; + int sndbufsiz = 1024 * 512; + int keepalive = 1; + struct tcp_keepalive alive_in, alive_out; + unsigned long alive_retlen; + struct linger ling; + + ret = ioctlsocket(sockfd, FIONBIO, &nonblocked); + if (ret == SOCKET_ERROR) { + warn("ioctlsocket FIONBIO failed: %s\n", sk_strerror(sk_errno())); + } + + ret = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char*)&sndbufsiz, sizeof(sndbufsiz)); + if (ret == SOCKET_ERROR) { + warn("setsockopt SO_SNDBUF failed: %s\n", sk_strerror(sk_errno())); + } + + ret = setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const char*)&keepalive, sizeof(keepalive)); + if (ret == SOCKET_ERROR) { + warn("setsockopt setsockopt SO_KEEPALIVE failed: %s\n", sk_strerror(sk_errno())); + } + + alive_in.onoff = TRUE; + alive_in.keepalivetime = 60000; + alive_in.keepaliveinterval = 30000; + ret = WSAIoctl(sockfd, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in), + &alive_out, sizeof(alive_out), &alive_retlen, NULL, NULL); + if (ret == SOCKET_ERROR) { + warn("WSAIoctl SIO_KEEPALIVE_VALS failed: %s\n", sk_strerror(sk_errno())); + } + + memset(&ling, 0, sizeof(ling)); + ling.l_onoff = 1; + ling.l_linger = 0; + ret = setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (const char*)&ling, sizeof(ling)); //resolve too many TCP CLOSE_WAIT + if (ret == SOCKET_ERROR) { + warn("setsockopt SO_LINGER failed: %s\n", sk_strerror(sk_errno())); + } +#endif + +#ifdef __LINUX__ + int sndbufsiz = 1024 * 512; + int keepalive = 1; + int keepidle = 60; + int keepinterval = 3; + int keepcount = 5; + struct linger ling; + + ret = fcntl(sockfd, F_GETFL, 0); + if (ret < 0) { + warn("fcntl F_GETFL failed: %s\n", strerror(errno)); + } else { + ret |= O_NONBLOCK; + ret = fcntl(sockfd, F_SETFL, ret); + if (ret < 0) { + warn("fcntl F_SETFL failed: %s\n", strerror(errno)); + } + } + + ret = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char*)&sndbufsiz, sizeof(sndbufsiz)); + if (ret == SOCKET_ERROR) { + warn("setsockopt SO_SNDBUF failed: %s\n", sk_strerror(sk_errno())); + } + + ret = setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const char*)&keepalive, sizeof(keepalive)); + if (ret == SOCKET_ERROR) { + warn("setsockopt SO_KEEPALIVE failed: %s\n", sk_strerror(sk_errno())); + } + + ret = setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (const char*)&keepidle, sizeof(keepidle)); + if (ret == SOCKET_ERROR) { + warn("setsockopt TCP_KEEPIDLE failed: %s\n", sk_strerror(sk_errno())); + } + + ret = setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (const char*)&keepinterval, sizeof(keepinterval)); + if (ret == SOCKET_ERROR) { + warn("setsockopt TCP_KEEPINTVL failed: %s\n", sk_strerror(sk_errno())); + } + + ret = setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (const char*)&keepcount, sizeof(keepcount)); + if (ret == SOCKET_ERROR) { + warn("setsockopt TCP_KEEPCNT failed: %s\n", sk_strerror(sk_errno())); + } + + memset(&ling, 0, sizeof(ling)); + ling.l_onoff = 1; + ling.l_linger = 0; + ret = setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (const char*)&ling, sizeof(ling)); //resolve too many TCP CLOSE_WAIT + if (ret == SOCKET_ERROR) { + warn("setsockopt SO_LINGER failed: %s\n", sk_strerror(sk_errno())); + } +#endif + return 0; +} + +static struct rtsp_client_connection *rtsp_new_client_connection (struct rtsp_demo *d) +{ + struct rtsp_client_connection *cc = NULL; + struct sockaddr_in inaddr; + SOCKET sockfd; + SOCKLEN addrlen = sizeof(inaddr); + + sockfd = accept(d->sockfd, (struct sockaddr*)&inaddr, &addrlen); + if (sockfd == INVALID_SOCKET) { + err("accept failed : %s\n", sk_strerror(sk_errno())); + return NULL; + } + + rtsp_set_client_socket(sockfd);//XXX DEBUG + + info("new rtsp client %s:%u comming\n", + inet_ntoa(inaddr.sin_addr), ntohs(inaddr.sin_port)); + + cc = __alloc_client_connection(d); + if (cc == NULL) { + closesocket(sockfd); + return NULL; + } + + cc->state = RTSP_CC_STATE_INIT; + cc->sockfd = sockfd; + cc->peer_addr = inaddr.sin_addr; + + return cc; +} + +static void rtsp_del_rtp_connection(struct rtsp_client_connection *cc, int isaudio); +static void rtsp_del_client_connection (struct rtsp_client_connection *cc) +{ + if (cc) { + info("delete client %d from %s\n", cc->sockfd, inet_ntoa(cc->peer_addr)); + __client_connection_unbind_session(cc); + rtsp_del_rtp_connection(cc, 0); + rtsp_del_rtp_connection(cc, 1); + closesocket(cc->sockfd); + __free_client_connection(cc); + } +} + +static int rtsp_path_match (const char *main_path, const char *full_path) +{ + char path0[64] = {0}; + char path1[64] = {0}; + + strncpy(path0, main_path, sizeof(path0) - 2); + strncpy(path1, full_path, sizeof(path1) - 2); + + if (path0[strlen(path0) - 1] != '/') + strcat(path0, "/"); + if (path1[strlen(path1) - 1] != '/') + strcat(path1, "/"); + + if (strncmp(path0, path1, strlen(path0))) + return 0; + return 1; +} + +rtsp_session_handle rtsp_new_session (rtsp_demo_handle demo, const char *path) +{ + struct rtsp_demo *d = (struct rtsp_demo*)demo; + struct rtsp_session *s = NULL; + + if (!d || !path || strlen(path) == 0) { + err("param invalid\n"); + goto fail; + } + + TAILQ_FOREACH(s, &d->sessions_qhead, demo_entry) { + if (rtsp_path_match(s->path, path) || rtsp_path_match(path, s->path)) { + err("path:%s (%s) is exist!!!\n", s->path, path); + goto fail; + } + } + + s = __alloc_session(d); + if (NULL == s) { + goto fail; + } + + strncpy(s->path, path, sizeof(s->path) - 1); + s->vcodec_id = RTSP_CODEC_ID_NONE; + s->acodec_id = RTSP_CODEC_ID_NONE; + + dbg("add session path: %s\n", s->path); + return (rtsp_session_handle)s; +fail: + if (s) { + free(s); + } + return NULL; +} + +rtsp_demo_handle create_rtsp_demo(int port) +{ + return rtsp_new_demo(port); +} + + +rtsp_session_handle create_rtsp_session(rtsp_demo_handle demo, const char *path) +{ + rtsp_session_handle session; + session = rtsp_new_session(demo,path); + + rtsp_set_video(session, RTSP_CODEC_ID_VIDEO_H264, NULL, 0); + //rtsp_set_audio(session, RTSP_CODEC_ID_AUDIO_G711A, NULL, 0); + + return session; +} + + +#define RTP_MAX_PKTSIZ ((1500-42)/4*4) +#define VRTP_MAX_NBPKTS (300) +#define ARTP_MAX_NBPKTS (10) +#define VRTP_PT_ID (96) +#define ARTP_PT_ID (97) +#define VRTSP_SUBPATH "track1" +#define ARTSP_SUBPATH "track2" + +int rtsp_set_video (rtsp_session_handle session, int codec_id, const uint8_t *codec_data, int data_len) +{ + struct rtsp_session *s = (struct rtsp_session*)session; + if (!s || (s->vcodec_id != RTSP_CODEC_ID_NONE && s->vcodec_id != codec_id)) + return -1; + + switch (codec_id) { + case RTSP_CODEC_ID_VIDEO_H264: + case RTSP_CODEC_ID_VIDEO_H265: + break; + default: + err("not supported codec_id %d for video\n", codec_id); + return -1; + } + + s->vcodec_id = codec_id; + s->vrtpe.pt = VRTP_PT_ID; + s->vrtpe.seq = 0; + s->vrtpe.ssrc = 0; + s->vrtpe.sample_rate = 90000; + memset(&s->vcodec_data, 0, sizeof(s->vcodec_data)); + + if (codec_data && data_len > 0) { + switch (codec_id) { + case RTSP_CODEC_ID_VIDEO_H264: + if (rtsp_codec_data_parse_from_user_h264(codec_data, data_len, &s->vcodec_data.h264) <= 0) { + warn("parse codec_data failed\n"); + break; + } + break; + case RTSP_CODEC_ID_VIDEO_H265: + if (rtsp_codec_data_parse_from_user_h265(codec_data, data_len, &s->vcodec_data.h265) <= 0) { + warn("parse codec_data failed\n"); + break; + } + break; + } + } + + if (!s->vstreamq) { + s->vstreamq = streamq_alloc(RTP_MAX_PKTSIZ, VRTP_MAX_NBPKTS * 2 + 1); + if (!s->vstreamq) { + err("alloc memory for video rtp queue failed\n"); + s->vcodec_id = RTSP_CODEC_ID_NONE; + return -1; + } + } + + return 0; +} + +int rtsp_set_audio (rtsp_session_handle session, int codec_id, const uint8_t *codec_data, int data_len) +{ + struct rtsp_session *s = (struct rtsp_session*)session; + if (!s || (s->acodec_id != RTSP_CODEC_ID_NONE && s->acodec_id != codec_id)) + return -1; + + switch (codec_id) { + case RTSP_CODEC_ID_AUDIO_G711A: + case RTSP_CODEC_ID_AUDIO_G711U: + case RTSP_CODEC_ID_AUDIO_G726: + case RTSP_CODEC_ID_AUDIO_AAC: + break; + default: + err("not supported codec_id %d for audio\n", codec_id); + return -1; + } + + s->acodec_id = codec_id; + s->artpe.pt = ARTP_PT_ID; + s->artpe.seq = 0; + s->artpe.ssrc = 0; + s->artpe.sample_rate = 8000; + memset(&s->acodec_data, 0, sizeof(s->acodec_data)); + + if (codec_data && data_len > 0) { + switch (codec_id) { + case RTSP_CODEC_ID_AUDIO_G726: + if (rtsp_codec_data_parse_from_user_g726(codec_data, data_len, &s->acodec_data.g726) <= 0) { + warn("parse codec_data failed\n"); + break; + } + break; + case RTSP_CODEC_ID_AUDIO_AAC: + if (rtsp_codec_data_parse_from_user_aac(codec_data, data_len, &s->acodec_data.aac) <= 0) { + warn("parse codec_data failed\n"); + break; + } + s->artpe.sample_rate = s->acodec_data.aac.sample_rate; + break; + } + } + + if (!s->astreamq) { + s->astreamq = streamq_alloc(RTP_MAX_PKTSIZ, ARTP_MAX_NBPKTS * 2 + 1); + if (!s->astreamq) { + err("alloc memory for audio rtp queue failed\n"); + s->acodec_id = RTSP_CODEC_ID_NONE; + return -1; + } + } + + return 0; +} + +void rtsp_del_session (rtsp_session_handle session) +{ + struct rtsp_session *s = (struct rtsp_session*)session; + if (s) { + struct rtsp_client_connection *cc; + while ((cc = TAILQ_FIRST(&s->connections_qhead))) { + rtsp_del_client_connection(cc); + } + dbg("del session path: %s\n", s->path); + if (s->vstreamq) + streamq_free(s->vstreamq); + if (s->astreamq) + streamq_free(s->astreamq); + __free_session(s); + } +} + +void rtsp_del_demo (rtsp_demo_handle demo) +{ + struct rtsp_demo *d = (struct rtsp_demo*)demo; + if (d) { + struct rtsp_session *s; + struct rtsp_client_connection *cc; + + while ((cc = TAILQ_FIRST(&d->connections_qhead))) { + rtsp_del_client_connection(cc); + } + while ((s = TAILQ_FIRST(&d->sessions_qhead))) { + rtsp_del_session(s); + } + + closesocket(d->sockfd); + __free_demo(d); + } +} + +static int build_simple_sdp (struct rtsp_session *s, const char *uri, char *sdpbuf, int maxlen) +{ + char *p = sdpbuf; + + p += sprintf(p, "v=0\r\n"); + p += sprintf(p, "o=- 0 0 IN IP4 0.0.0.0\r\n"); + p += sprintf(p, "s=rtsp_demo\r\n"); + p += sprintf(p, "t=0 0\r\n"); + p += sprintf(p, "a=control:%s\r\n", uri ? uri : "*"); + p += sprintf(p, "a=range:npt=0-\r\n"); + + if (s->vcodec_id != RTSP_CODEC_ID_NONE) { + switch (s->vcodec_id) { + case RTSP_CODEC_ID_VIDEO_H264: + p += rtsp_build_sdp_media_attr_h264(VRTP_PT_ID, s->vrtpe.sample_rate, &s->vcodec_data.h264, p, maxlen - (p - sdpbuf)); + break; + case RTSP_CODEC_ID_VIDEO_H265: + p += rtsp_build_sdp_media_attr_h265(VRTP_PT_ID, s->vrtpe.sample_rate, &s->vcodec_data.h265, p, maxlen - (p - sdpbuf)); + break; + } + if (uri) + p += sprintf(p, "a=control:%s/%s\r\n", uri, VRTSP_SUBPATH); + else + p += sprintf(p, "a=control:%s\r\n", VRTSP_SUBPATH); + } + + if (s->acodec_id != RTSP_CODEC_ID_NONE) { + switch (s->acodec_id) { + case RTSP_CODEC_ID_AUDIO_G711A: + p += rtsp_build_sdp_media_attr_g711a(ARTP_PT_ID, s->artpe.sample_rate, p, maxlen - (p - sdpbuf)); + break; + case RTSP_CODEC_ID_AUDIO_G711U: + p += rtsp_build_sdp_media_attr_g711u(ARTP_PT_ID, s->artpe.sample_rate, p, maxlen - (p - sdpbuf)); + break; + case RTSP_CODEC_ID_AUDIO_G726: + p += rtsp_build_sdp_media_attr_g726(ARTP_PT_ID, s->artpe.sample_rate, &s->acodec_data.g726, p, maxlen - (p - sdpbuf)); + break; + case RTSP_CODEC_ID_AUDIO_AAC: + p += rtsp_build_sdp_media_attr_aac(ARTP_PT_ID, s->artpe.sample_rate, &s->acodec_data.aac, p, maxlen - (p - sdpbuf)); + break; + } + if (uri) + p += sprintf(p, "a=control:%s/%s\r\n", uri, ARTSP_SUBPATH); + else + p += sprintf(p, "a=control:%s\r\n", ARTSP_SUBPATH); + } + + return (p - sdpbuf); +} + +static int rtsp_handle_OPTIONS(struct rtsp_client_connection *cc, const rtsp_msg_s *reqmsg, rtsp_msg_s *resmsg) +{ +// struct rtsp_demo *d = cc->demo; +// struct rtsp_session *s = cc->session; + uint32_t public_ = 0; + dbg("\n"); + public_ |= RTSP_MSG_PUBLIC_OPTIONS; + public_ |= RTSP_MSG_PUBLIC_DESCRIBE; + public_ |= RTSP_MSG_PUBLIC_SETUP; + public_ |= RTSP_MSG_PUBLIC_PAUSE; + public_ |= RTSP_MSG_PUBLIC_PLAY; + public_ |= RTSP_MSG_PUBLIC_TEARDOWN; + rtsp_msg_set_public(resmsg, public_); + return 0; +} + +static int rtsp_handle_DESCRIBE(struct rtsp_client_connection *cc, const rtsp_msg_s *reqmsg, rtsp_msg_s *resmsg) +{ +// struct rtsp_demo *d = cc->demo; + struct rtsp_session *s = cc->session; + char sdpbuf[1024] = ""; + int sdplen = 0; + uint32_t accept = 0; + const rtsp_msg_uri_s *puri = &reqmsg->hdrs.startline.reqline.uri; + char uri[128] = ""; + + dbg("\n"); + if (rtsp_msg_get_accept(reqmsg, &accept) < 0 && !(accept & RTSP_MSG_ACCEPT_SDP)) { + rtsp_msg_set_response(resmsg, 406); + warn("client not support accept SDP\n"); + return 0; + } + + //build uri + if (puri->scheme == RTSP_MSG_URI_SCHEME_RTSPU) + strcat(uri, "rtspu://"); + else + strcat(uri, "rtsp://"); + strcat(uri, puri->ipaddr); + if (puri->port != 0) + sprintf(uri + strlen(uri), ":%u", puri->port); + strcat(uri, s->path); + + sdplen = build_simple_sdp(s, uri, sdpbuf, sizeof(sdpbuf)); + + rtsp_msg_set_content_type(resmsg, RTSP_MSG_CONTENT_TYPE_SDP); + rtsp_msg_set_content_length(resmsg, sdplen); + resmsg->body.body = rtsp_mem_dup(sdpbuf, sdplen); + return 0; +} + +static unsigned long __rtp_gen_ssrc(void) +{ + static unsigned long ssrc = 0x22345678; + return ssrc++; +} + +static int __rtp_udp_local_setup (struct rtp_connection *rtp) +{ + int i, ret; + + for (i = 65536/4*3/2*2; i < 65536; i += 2) { + SOCKET rtpsock, rtcpsock; + struct sockaddr_in inaddr; + uint16_t port; + + rtpsock = socket(AF_INET, SOCK_DGRAM, 0); + if (rtpsock == INVALID_SOCKET) { + err("create rtp socket failed: %s\n", sk_strerror(sk_errno())); + return -1; + } + + rtcpsock = socket(AF_INET, SOCK_DGRAM, 0); + if (rtcpsock == INVALID_SOCKET) { + err("create rtcp socket failed: %s\n", sk_strerror(sk_errno())); + closesocket(rtpsock); + return -1; + } + + port = i; + memset(&inaddr, 0, sizeof(inaddr)); + inaddr.sin_family = AF_INET; + inaddr.sin_addr.s_addr = htonl(INADDR_ANY); + inaddr.sin_port = htons(port); + ret = bind(rtpsock, (struct sockaddr*)&inaddr, sizeof(inaddr)); + if (ret == SOCKET_ERROR) { + closesocket(rtpsock); + closesocket(rtcpsock); + continue; + } + + port = i + 1; + memset(&inaddr, 0, sizeof(inaddr)); + inaddr.sin_family = AF_INET; + inaddr.sin_addr.s_addr = htonl(INADDR_ANY); + inaddr.sin_port = htons(port); + ret = bind(rtcpsock, (struct sockaddr*)&inaddr, sizeof(inaddr)); + if (ret == SOCKET_ERROR) { + closesocket(rtpsock); + closesocket(rtcpsock); + continue; + } + +#ifdef __WIN32__ + { + unsigned long nonblocked = 1; + ret = ioctlsocket(rtpsock, FIONBIO, &nonblocked); + if (ret == SOCKET_ERROR) { + warn("ioctlsocket FIONBIO failed: %s\n", sk_strerror(sk_errno())); + } + ret = ioctlsocket(rtcpsock, FIONBIO, &nonblocked); + if (ret == SOCKET_ERROR) { + warn("ioctlsocket FIONBIO failed: %s\n", sk_strerror(sk_errno())); + } + } +#endif +#ifdef __LINUX__ + ret = fcntl(rtpsock, F_GETFL, 0); + if (ret < 0) { + warn("fcntl F_GETFL failed: %s\n", strerror(errno)); + } else { + ret |= O_NONBLOCK; + ret = fcntl(rtpsock, F_SETFL, ret); + if (ret < 0) { + warn("fcntl F_SETFL failed: %s\n", strerror(errno)); + } + } + ret = fcntl(rtcpsock, F_GETFL, 0); + if (ret < 0) { + warn("fcntl F_GETFL failed: %s\n", strerror(errno)); + } else { + ret |= O_NONBLOCK; + ret = fcntl(rtcpsock, F_SETFL, ret); + if (ret < 0) { + warn("fcntl F_SETFL failed: %s\n", strerror(errno)); + } + } +#endif + rtp->is_over_tcp = 0; + rtp->udp_sockfd[0] = rtpsock; + rtp->udp_sockfd[1] = rtcpsock; + rtp->udp_localport[0] = i; + rtp->udp_localport[1] = i + 1; + + return 0; + } + + err("not found free local port for rtp/rtcp\n"); + return -1; +} + +static int rtsp_new_rtp_connection(struct rtsp_client_connection *cc, int isaudio, int istcp, int peer_port, int peer_interleaved) +{ + struct rtp_connection *rtp; + struct in_addr peer_addr = cc->peer_addr; + + rtp = (struct rtp_connection*) calloc(1, sizeof(struct rtp_connection)); + if (rtp == NULL) { + err("alloc mem for rtp session failed: %s\n", strerror(errno)); + return -1; + } + + rtp->is_over_tcp = !!istcp; + rtp->peer_addr = peer_addr; + rtp->ssrc = __rtp_gen_ssrc(); + + if (istcp) { + rtp->tcp_sockfd = cc->sockfd; + rtp->tcp_interleaved[0] = peer_interleaved; + rtp->tcp_interleaved[1] = peer_interleaved + 1; + info("new rtp over tcp for %s ssrc:%08x peer_addr:%s interleaved:%u-%u\n", + (isaudio ? "audio" : "video"), + rtp->ssrc, + inet_ntoa(peer_addr), + rtp->tcp_interleaved[0], rtp->tcp_interleaved[1]); + } else { + if (__rtp_udp_local_setup(rtp) < 0) { + free(rtp); + return -1; + } + rtp->udp_peerport[0] = peer_port; + rtp->udp_peerport[1] = peer_port + 1; + info("new rtp over udp for %s ssrc:%08x local_port:%u-%u peer_addr:%s peer_port:%u-%u\n", + (isaudio ? "audio" : "video"), + rtp->ssrc, + rtp->udp_localport[0], rtp->udp_localport[1], + inet_ntoa(peer_addr), + rtp->udp_peerport[0], rtp->udp_peerport[1]); + } + + if (isaudio) { + cc->artp = rtp; + } else { + cc->vrtp = rtp; + } + + return 0; +} + +static void rtsp_del_rtp_connection(struct rtsp_client_connection *cc, int isaudio) +{ + struct rtp_connection *rtp; + + if (isaudio) { + rtp = cc->artp; + cc->artp = NULL; + } else { + rtp = cc->vrtp; + cc->vrtp = NULL; + } + + if (rtp) { + if (!(rtp->is_over_tcp)) { + closesocket(rtp->udp_sockfd[0]); + closesocket(rtp->udp_sockfd[1]); + } + free(rtp); + } +} + +static int rtsp_handle_SETUP(struct rtsp_client_connection *cc, const rtsp_msg_s *reqmsg, rtsp_msg_s *resmsg) +{ +// struct rtsp_demo *d = cc->demo; + struct rtsp_session *s = cc->session; + struct rtp_connection *rtp = NULL; + int istcp = 0, isaudio = 0; + char vpath[64] = ""; + char apath[64] = ""; + int ret; + + dbg("\n"); + + if (!reqmsg->hdrs.transport) { + rtsp_msg_set_response(resmsg, 461); + warn("rtsp no transport err\n"); + return 0; + } + + if (reqmsg->hdrs.transport->type == RTSP_MSG_TRANSPORT_TYPE_RTP_AVP_TCP) { + istcp = 1; + if (!(reqmsg->hdrs.transport->flags & RTSP_MSG_TRANSPORT_FLAG_INTERLEAVED)) { + warn("rtsp no interleaved err\n"); + rtsp_msg_set_response(resmsg, 461); + return 0; + } + } else { + if (!(reqmsg->hdrs.transport->flags & RTSP_MSG_TRANSPORT_FLAG_CLIENT_PORT)) { + warn("rtsp no client_port err\n"); + rtsp_msg_set_response(resmsg, 461); + return 0; + } + } + + snprintf(vpath, sizeof(vpath) - 1, "%s/%s", s->path, VRTSP_SUBPATH); + snprintf(apath, sizeof(vpath) - 1, "%s/%s", s->path, ARTSP_SUBPATH); + if (s->vcodec_id != RTSP_CODEC_ID_NONE && rtsp_path_match(vpath, reqmsg->hdrs.startline.reqline.uri.abspath)) { + isaudio = 0; + } else if (s->acodec_id != RTSP_CODEC_ID_NONE && rtsp_path_match(apath, reqmsg->hdrs.startline.reqline.uri.abspath)) { + isaudio = 1; + } else { + warn("rtsp urlpath:%s err\n", reqmsg->hdrs.startline.reqline.uri.abspath); + rtsp_msg_set_response(resmsg, 461); + return 0; + } + + rtsp_del_rtp_connection(cc, isaudio); + + ret = rtsp_new_rtp_connection(cc, isaudio, istcp, reqmsg->hdrs.transport->client_port, reqmsg->hdrs.transport->interleaved); + if (ret < 0) { + rtsp_msg_set_response(resmsg, 500); + return 0; + } + + rtp = isaudio ? cc->artp : cc->vrtp; + + if (istcp) { + rtsp_msg_set_transport_tcp(resmsg, rtp->ssrc, rtp->tcp_interleaved[0]); + } else { + rtsp_msg_set_transport_udp(resmsg, rtp->ssrc, rtp->udp_peerport[0], rtp->udp_localport[0]); + } + + if (cc->state == RTSP_CC_STATE_PLAYING) { + rtp->streamq_index = streamq_tail((isaudio ? s->astreamq : s->vstreamq)); + } + + if (cc->state == RTSP_CC_STATE_INIT) { + cc->state = RTSP_CC_STATE_READY; + cc->session_id = rtsp_msg_gen_session_id(); + rtsp_msg_set_session(resmsg, cc->session_id); + } + + return 0; +} + +static int rtsp_handle_PAUSE(struct rtsp_client_connection *cc, const rtsp_msg_s *reqmsg, rtsp_msg_s *resmsg) +{ +// struct rtsp_demo *d = cc->demo; +// struct rtsp_session *s = cc->session; + + dbg("\n"); + if (cc->state != RTSP_CC_STATE_READY && cc->state != RTSP_CC_STATE_PLAYING) + { + rtsp_msg_set_response(resmsg, 455); + warn("rtsp status err\n"); + return 0; + } + + if (cc->state != RTSP_CC_STATE_READY) + cc->state = RTSP_CC_STATE_READY; + return 0; +} + +static int rtsp_handle_PLAY(struct rtsp_client_connection *cc, const rtsp_msg_s *reqmsg, rtsp_msg_s *resmsg) +{ +// struct rtsp_demo *d = cc->demo; + struct rtsp_session *s = cc->session; + + dbg("\n"); + if (cc->state != RTSP_CC_STATE_READY && cc->state != RTSP_CC_STATE_PLAYING) + { + rtsp_msg_set_response(resmsg, 455); + warn("rtsp status err\n"); + return 0; + } + + if (cc->state != RTSP_CC_STATE_PLAYING) { + if (cc->vrtp && s->vstreamq) + cc->vrtp->streamq_index = streamq_tail(s->vstreamq); + if (cc->artp && s->astreamq) + cc->artp->streamq_index = streamq_tail(s->astreamq); + cc->state = RTSP_CC_STATE_PLAYING; + } + return 0; +} + +static int rtsp_handle_TEARDOWN(struct rtsp_client_connection *cc, const rtsp_msg_s *reqmsg, rtsp_msg_s *resmsg) +{ +// struct rtsp_demo *d = cc->demo; + struct rtsp_session *s = cc->session; + char vpath[64] = ""; + char apath[64] = ""; + dbg("\n"); + + snprintf(vpath, sizeof(vpath) - 1, "%s/%s", s->path, VRTSP_SUBPATH); + snprintf(apath, sizeof(vpath) - 1, "%s/%s", s->path, ARTSP_SUBPATH); + + if (rtsp_path_match(vpath, reqmsg->hdrs.startline.reqline.uri.abspath)) { + rtsp_del_rtp_connection(cc, 0); + } else if (rtsp_path_match(apath, reqmsg->hdrs.startline.reqline.uri.abspath)) { + rtsp_del_rtp_connection(cc, 1); + } else { + rtsp_del_rtp_connection(cc, 0); + rtsp_del_rtp_connection(cc, 1); + } + if (!cc->vrtp && !cc->artp) { + cc->state = RTSP_CC_STATE_INIT; + } + return 0; +} + +/* +rtsp rtsp +*/ +static int rtsp_process_request(struct rtsp_client_connection *cc, const rtsp_msg_s *reqmsg, rtsp_msg_s *resmsg) +{ + struct rtsp_demo *d = cc->demo; + struct rtsp_session *s = cc->session; + const char *path = reqmsg->hdrs.startline.reqline.uri.abspath; + uint32_t cseq = 0, session = 0; + + rtsp_msg_set_response(resmsg, 200); + rtsp_msg_set_date(resmsg, NULL); + rtsp_msg_set_server(resmsg, "rtsp_demo"); + + if (rtsp_msg_get_cseq(reqmsg, &cseq) < 0) { + rtsp_msg_set_response(resmsg, 400); + warn("No CSeq field\n"); + return 0; + } + rtsp_msg_set_cseq(resmsg, cseq); + + if (cc->state != RTSP_CC_STATE_INIT) { + if (rtsp_msg_get_session(reqmsg, &session) < 0 || session != cc->session_id) { + warn("Invalid Session field\n"); + rtsp_msg_set_response(resmsg, 454); + return 0; + } + rtsp_msg_set_session(resmsg, session); + } + + if (s) { + if (rtsp_path_match(s->path, path) == 0) { // /live/chn0 + warn("path is not matched %s (old:%s)\n", path, s->path); + rtsp_msg_set_response(resmsg, 451); + return 0; + } + } else if (reqmsg->hdrs.startline.reqline.method != RTSP_MSG_METHOD_OPTIONS) { + TAILQ_FOREACH(s, &d->sessions_qhead, demo_entry) { + if (rtsp_path_match(s->path, path)) { + break; + } + } + if (NULL == s) { + warn("Not found session path: %s\n", path); + rtsp_msg_set_response(resmsg, 454); + return 0; + } + __client_connection_bind_session(cc, s); + } + + switch (reqmsg->hdrs.startline.reqline.method) { + case RTSP_MSG_METHOD_OPTIONS: + return rtsp_handle_OPTIONS(cc, reqmsg, resmsg); + case RTSP_MSG_METHOD_DESCRIBE: + return rtsp_handle_DESCRIBE(cc, reqmsg, resmsg); + case RTSP_MSG_METHOD_SETUP: + return rtsp_handle_SETUP(cc, reqmsg, resmsg); + case RTSP_MSG_METHOD_PAUSE: + return rtsp_handle_PAUSE(cc, reqmsg, resmsg); + case RTSP_MSG_METHOD_PLAY: + return rtsp_handle_PLAY(cc, reqmsg, resmsg); + case RTSP_MSG_METHOD_TEARDOWN: + return rtsp_handle_TEARDOWN(cc, reqmsg, resmsg); + default: + break; + } + + rtsp_msg_set_response(resmsg, 501); + return 0; +} + +static int rtsp_recv_msg(struct rtsp_client_connection *cc, rtsp_msg_s *msg) +{ + int ret; + + if (sizeof(cc->reqbuf) - cc->reqlen - 1 > 0) { + ret = recv(cc->sockfd, cc->reqbuf + cc->reqlen, sizeof(cc->reqbuf) - cc->reqlen - 1, MSG_DONTWAIT); + if (ret == 0) { + dbg("peer closed\n"); + return -1; + } + if (ret == SOCKET_ERROR) { + if (sk_errno() != SK_EAGAIN && sk_errno() != SK_EINTR) { + err("recv data failed: %s\n", sk_strerror(sk_errno())); + return -1; + } + ret = 0; + } + cc->reqlen += ret; + cc->reqbuf[cc->reqlen] = 0; + } + + if (cc->reqlen == 0) { + return 0; + } + + ret = rtsp_msg_parse_from_array(msg, cc->reqbuf, cc->reqlen); + if (ret < 0) { + err("Invalid frame\n"); + return -1; + } + if (ret == 0) { + return 0; + } + + //dbg("recv %d bytes rtsp message from %s\n", ret, inet_ntoa(cc->peer_addr)); + + memmove(cc->reqbuf, cc->reqbuf + ret, cc->reqlen - ret); + cc->reqlen -= ret; + return ret; +} + +static int rtsp_send_msg(struct rtsp_client_connection *cc, rtsp_msg_s *msg) +{ + char szbuf[1024] = ""; + int ret = rtsp_msg_build_to_array(msg, szbuf, sizeof(szbuf)); + if (ret < 0) { + err("rtsp_msg_build_to_array failed\n"); + return -1; + } + + ret = send(cc->sockfd, szbuf, ret, 0); + if (ret == SOCKET_ERROR) { + err("rtsp response send failed: %s\n", sk_strerror(sk_errno())); + return -1; + } + + //dbg("sent %d bytes rtsp message to %s\n", ret, inet_ntoa(cc->peer_addr)); + return ret; +} + +static int rtsp_recv_rtp_over_udp (struct rtsp_client_connection *cc, int isaudio) +{ + struct rtp_connection *rtp = isaudio ? cc->artp : cc->vrtp; + struct sockaddr_in inaddr; + SOCKLEN addrlen = sizeof(inaddr); + char szbuf[128]; + int len; + + len = recvfrom(rtp->udp_sockfd[0], szbuf, sizeof(szbuf), MSG_DONTWAIT, (struct sockaddr*)&inaddr, &addrlen); + if (len == SOCKET_ERROR) { + if (sk_errno() != SK_EAGAIN && sk_errno() != SK_EINTR) { + warn("rtp over udp recv failed: %s\n", sk_strerror(sk_errno())); + return -1; + } + return 0; + } + + //dbg("rtp over udp recv %d bytes from %s\n", len, inet_ntoa(rtp->peer_addr)); + + if (rtp->udp_peerport[0] != ntohs(inaddr.sin_port)) { + info("rtp over udp peer %s port change %u to %u\n", inet_ntoa(rtp->peer_addr), + rtp->udp_peerport[0], ntohs(inaddr.sin_port)); + rtp->udp_peerport[0] = ntohs(inaddr.sin_port); + } + + //TODO process rtp frame + return len; +} + +static int rtsp_recv_rtcp_over_udp (struct rtsp_client_connection *cc, int isaudio) +{ + struct rtp_connection *rtp = isaudio ? cc->artp : cc->vrtp; + struct sockaddr_in inaddr; + SOCKLEN addrlen = sizeof(inaddr); + char szbuf[128]; + int len; + + len = recvfrom(rtp->udp_sockfd[1], szbuf, sizeof(szbuf), MSG_DONTWAIT, (struct sockaddr*)&inaddr, &addrlen); + if (len == SOCKET_ERROR) { + if (sk_errno() != SK_EAGAIN && sk_errno() != SK_EINTR) { + warn("rtcp over udp recv failed: %s\n", sk_strerror(sk_errno())); + return -1; + } + return 0; + } + + //dbg("rtcp over udp recv %d bytes from %s\n", len, inet_ntoa(rtp->peer_addr)); + + if (rtp->udp_peerport[1] != ntohs(inaddr.sin_port)) { + info("rtcp over udp peer %s port change %u to %u\n", inet_ntoa(rtp->peer_addr), + rtp->udp_peerport[1], ntohs(inaddr.sin_port)); + rtp->udp_peerport[1] = ntohs(inaddr.sin_port); + } + + //TODO process rtcp frame + return len; +} + +static int rtp_tx_data (struct rtp_connection *c, const uint8_t *data, int size) +{ + if (c->is_over_tcp) { + SOCKET sockfd = c->tcp_sockfd; + int ret = -1; +#if 0 //XXX + uint8_t szbuf[RTP_MAX_PKTSIZ + 4]; + sockfd = c->tcp_sockfd; + szbuf[0] = '$'; + szbuf[1] = c->tcp_interleaved[0]; + *((uint16_t*)&szbuf[2]) = htons(size); + memcpy(szbuf + 4, data, size); + data = szbuf; + size += 4; +#else + uint8_t szbuf[4]; + sockfd = c->tcp_sockfd; + szbuf[0] = '$'; + szbuf[1] = c->tcp_interleaved[0]; + *((uint16_t*)&szbuf[2]) = htons(size); + ret = send(sockfd, (const char*)szbuf, 4, 0); + if (ret == SOCKET_ERROR) { + if (sk_errno() != SK_EAGAIN && sk_errno() != SK_EINTR) { + warn("rtp over tcp send interlaced frame to %s failed: %s\n", + inet_ntoa(c->peer_addr), sk_strerror(sk_errno())); + return -1; + } + return 0; + } +#endif + ret = send(sockfd, (const char*)data, size, 0); + if (ret == SOCKET_ERROR) { + if (sk_errno() != SK_EAGAIN && sk_errno() != SK_EINTR) { + warn("rtp over tcp send %d bytes to %s failed: %s\n", size, inet_ntoa(c->peer_addr), sk_strerror(sk_errno())); + return -1; + } + return 0; + } + } else { + struct sockaddr_in inaddr; + SOCKET sockfd = c->udp_sockfd[0]; + int ret = -1; + + memset(&inaddr, 0, sizeof(inaddr)); + inaddr.sin_family = AF_INET; + inaddr.sin_addr = c->peer_addr; + inaddr.sin_port = htons(c->udp_peerport[0]); + + ret = sendto(sockfd, (const char*)data, size, 0, (struct sockaddr*)&inaddr, sizeof(inaddr)); + if (ret == SOCKET_ERROR) { + if (sk_errno() != SK_EAGAIN && sk_errno() != SK_EINTR) { + warn("rtp over udp send %d bytes to %s failed: %s\n", size, inet_ntoa(c->peer_addr), sk_strerror(sk_errno())); + return -1; + } + return 0; + } + } + return size; +} + +static int rtsp_tx_video_packet (struct rtsp_client_connection *cc) +{ +// struct rtsp_demo *d = cc->demo; + struct rtsp_session *s = cc->session; + struct stream_queue *q = s->vstreamq; + struct rtp_connection *rtp = cc->vrtp; + uint8_t *ppacket = NULL; + int *ppktlen = NULL; + int count = 0; + + /*dbg("index=%d head=%d tail=%d used=%d\n", + rtp->streamq_index, + streamq_head(q), + streamq_tail(q), + streamq_inused(q, rtp->streamq_index));*/ + + while (streamq_inused(q, rtp->streamq_index) > 0) { + streamq_query(q, rtp->streamq_index, (char**)&ppacket, &ppktlen); + + if (*ppktlen > 0) { + *((uint32_t*)(&ppacket[8])) = htonl(rtp->ssrc); //modify ssrc + if (rtp_tx_data(rtp, ppacket, *ppktlen) != *ppktlen) { + break; + } + + rtp->rtcp_packet_count ++; + rtp->rtcp_octet_count += *ppktlen - 12;//XXX + } + rtp->streamq_index = streamq_next(q, rtp->streamq_index); + count ++; + } + + return count; +} + +static int rtsp_tx_audio_packet (struct rtsp_client_connection *cc) +{ +// struct rtsp_demo *d = cc->demo; + struct rtsp_session *s = cc->session; + struct stream_queue *q = s->astreamq; + struct rtp_connection *rtp = cc->artp; + uint8_t *ppacket = NULL; + int *ppktlen = NULL; + int count = 0; + + while (streamq_inused(q, rtp->streamq_index) > 0) { + streamq_query(q, rtp->streamq_index, (char**)&ppacket, &ppktlen); + + if (*ppktlen > 0) { + *((uint32_t*)(&ppacket[8])) = htonl(rtp->ssrc); //modify ssrc + if (rtp_tx_data(rtp, ppacket, *ppktlen) != *ppktlen) { + break; + } + + rtp->rtcp_packet_count ++; + rtp->rtcp_octet_count += *ppktlen - 12;//XXX + } + rtp->streamq_index = streamq_next(q, rtp->streamq_index); + count ++; + } + + return count; +} + +int rtsp_do_event (rtsp_demo_handle demo) +{ + struct rtsp_demo *d = (struct rtsp_demo*)demo; + struct rtsp_client_connection *cc = NULL; + struct timeval tv; + fd_set rfds; + fd_set wfds; + SOCKET maxfd; + int ret; + + if (NULL == d) { + return -1; + } + + FD_ZERO(&rfds); + FD_ZERO(&wfds); + + FD_SET(d->sockfd, &rfds); + + maxfd = d->sockfd; + TAILQ_FOREACH(cc, &d->connections_qhead, demo_entry) { + struct rtsp_session *s = cc->session; + struct rtp_connection *vrtp = cc->vrtp; + struct rtp_connection *artp = cc->artp; + + FD_SET(cc->sockfd, &rfds); + if (cc->sockfd > maxfd) + maxfd = cc->sockfd; + + if (cc->state != RTSP_CC_STATE_PLAYING) + continue; + + if (vrtp && streamq_inused(s->vstreamq, vrtp->streamq_index) > 0) { + //add video rtp sock to wfds + if (vrtp->is_over_tcp) { + FD_SET(vrtp->tcp_sockfd, &wfds); + if (vrtp->tcp_sockfd > maxfd) + maxfd = vrtp->tcp_sockfd; + } else { + FD_SET(vrtp->udp_sockfd[0], &wfds); + if (vrtp->udp_sockfd[0] > maxfd) + maxfd = vrtp->udp_sockfd[0]; + } + } + + if (artp && streamq_inused(s->astreamq, artp->streamq_index) > 0) { + //add audio rtp sock to wfds + if (artp->is_over_tcp) { + FD_SET(artp->tcp_sockfd, &wfds); + if (artp->tcp_sockfd > maxfd) + maxfd = artp->tcp_sockfd; + } else { + FD_SET(artp->udp_sockfd[0], &wfds); + if (artp->udp_sockfd[0] > maxfd) + maxfd = artp->udp_sockfd[0]; + } + } + + if (vrtp && (!vrtp->is_over_tcp)) { + //add video rtcp sock to rfds + FD_SET(vrtp->udp_sockfd[0], &rfds); + FD_SET(vrtp->udp_sockfd[1], &rfds); + if (vrtp->udp_sockfd[0] > maxfd) + maxfd = vrtp->udp_sockfd[0]; + if (vrtp->udp_sockfd[1] > maxfd) + maxfd = vrtp->udp_sockfd[1]; + } + + if (artp && (!artp->is_over_tcp)) { + //add audio rtcp sock to rfds + FD_SET(artp->udp_sockfd[0], &rfds); + FD_SET(artp->udp_sockfd[1], &rfds); + if (artp->udp_sockfd[0] > maxfd) + maxfd = artp->udp_sockfd[0]; + if (artp->udp_sockfd[1] > maxfd) + maxfd = artp->udp_sockfd[1]; + } + } + + memset(&tv, 0, sizeof(tv)); + tv.tv_sec = 0; + tv.tv_usec = 0; + + //rtp rtcp ķ ռ + ret = select(maxfd + 1, &rfds, &wfds, NULL, &tv); + if (ret < 0) { + err("select failed : %s\n", strerror(errno)); + return -1; + } + if (ret == 0) { + return 0; + } + + if (FD_ISSET(d->sockfd, &rfds)) { + //new client_connection + rtsp_new_client_connection(d); + } + + cc = TAILQ_FIRST(&d->connections_qhead); //NOTE do not use TAILQ_FOREACH + while (cc) {//rtsp_client_connection + struct rtsp_client_connection *cc1 = cc; + struct rtsp_session *s = cc1->session; //ӵrtsp session + struct rtp_connection *vrtp = cc1->vrtp;//ӵrtp session Ƶ + struct rtp_connection *artp = cc1->artp; + cc = TAILQ_NEXT(cc, demo_entry);//һrtsp_client_connection + + if (FD_ISSET(cc1->sockfd, &rfds)) { + do { + rtsp_msg_s reqmsg, resmsg; + rtsp_msg_init(&reqmsg); + rtsp_msg_init(&resmsg); + + ret = rtsp_recv_msg(cc1, &reqmsg); + if (ret == 0) + break; + if (ret < 0) { + rtsp_del_client_connection(cc1); + cc1 = NULL; + break; + } + + if (reqmsg.type == RTSP_MSG_TYPE_INTERLEAVED) { + //TODO process RTCP over TCP frame + rtsp_msg_free(&reqmsg); + continue; + } + + if (reqmsg.type != RTSP_MSG_TYPE_REQUEST) { + err("not request frame.\n"); + rtsp_msg_free(&reqmsg); + continue; + } + + ret = rtsp_process_request(cc1, &reqmsg, &resmsg); + if (ret < 0) { + err("request internal err\n"); + } else { + rtsp_send_msg(cc1, &resmsg); + } + + rtsp_msg_free(&reqmsg); + rtsp_msg_free(&resmsg); + } while (cc1); + + if (cc1 == NULL) + continue; + } + + if (cc1->state != RTSP_CC_STATE_PLAYING) + continue; + + if (vrtp && streamq_inused(s->vstreamq, vrtp->streamq_index) > 0) { + //send rtp video packet + if (vrtp->is_over_tcp && FD_ISSET(vrtp->tcp_sockfd, &wfds)) { + rtsp_tx_video_packet(cc1); + //printf("v");fflush(stdout); + } else if ((!vrtp->is_over_tcp) && FD_ISSET(vrtp->udp_sockfd[0], &wfds)) { + rtsp_tx_video_packet(cc1); + //printf("v");fflush(stdout); + } + } + + if (artp && streamq_inused(s->astreamq, artp->streamq_index) > 0) { + //send rtp audio packet + if (artp->is_over_tcp && FD_ISSET(artp->tcp_sockfd, &wfds)) { + rtsp_tx_audio_packet(cc1); + //printf("a");fflush(stdout); + } else if (0 == artp->is_over_tcp && FD_ISSET(artp->udp_sockfd[0], &wfds)) { + rtsp_tx_audio_packet(cc1); + //printf("a");fflush(stdout); + } + } + + if (vrtp && (!vrtp->is_over_tcp)) { + //process video rtcp socket + if (FD_ISSET(vrtp->udp_sockfd[0], &rfds)) { + rtsp_recv_rtp_over_udp(cc1, 0); + } + if (FD_ISSET(vrtp->udp_sockfd[1], &rfds)) { + rtsp_recv_rtcp_over_udp(cc1, 0); + } + } + if (artp && (!artp->is_over_tcp)) { + //process audio rtcp socket + if (FD_ISSET(artp->udp_sockfd[0], &rfds)) { + rtsp_recv_rtp_over_udp(cc1, 1); + } + if (FD_ISSET(artp->udp_sockfd[1], &rfds)) { + rtsp_recv_rtcp_over_udp(cc1, 1); + } + } + } + + return 1; +} + +static int rtcp_try_tx_sr (struct rtp_connection *c, uint64_t ntptime_of_zero_ts, uint64_t ts, uint32_t sample_rate); + +int rtsp_tx_video (rtsp_session_handle session, const uint8_t *frame, int len, uint64_t ts) +{ + struct rtsp_session *s = (struct rtsp_session*) session; + struct stream_queue *q = NULL; + struct rtsp_client_connection *cc = NULL; + uint8_t *packets[VRTP_MAX_NBPKTS+1] = {NULL}; + int pktsizs[VRTP_MAX_NBPKTS+1] = {0}; + int *pktlens[VRTP_MAX_NBPKTS] = {NULL}; + int i, index, count, start; + + if (!s || !frame || s->vcodec_id == RTSP_CODEC_ID_NONE) + return -1; + + //get free buffer + q = s->vstreamq; + index = streamq_tail(q); + for (i = 0; i < VRTP_MAX_NBPKTS; i++) { + if (streamq_next(q, index) == streamq_head(q)) + streamq_pop(q); + streamq_query(q, index, (char**)&packets[i], &pktlens[i]); + pktsizs[i] = RTP_MAX_PKTSIZ; + index = streamq_next(q, index); + } + packets[i] = NULL; + pktsizs[i] = 0; + + //move all slow rtp connections streamq_index to queue tail + TAILQ_FOREACH(cc, &s->connections_qhead, session_entry) { + struct rtp_connection *rtp = cc->vrtp; + if (cc->state != RTSP_CC_STATE_PLAYING || !rtp) + continue; + if (!streamq_inused(q, rtp->streamq_index) && rtp->streamq_index != streamq_tail(q)) { + rtp->streamq_index = streamq_head(q); + warn("client %s will lost video packet\n", inet_ntoa(cc->peer_addr)); + } + } + + switch (s->vcodec_id) { + case RTSP_CODEC_ID_VIDEO_H264: + if (s->vcodec_data.h264.pps_len == 0 || s->vcodec_data.h264.pps_len == 0) { + if (rtsp_codec_data_parse_from_frame_h264(frame, len, &s->vcodec_data.h264) < 0) { + warn("rtsp_codec_data_parse_from_frame_h264 failed\n"); + } else { +// dbg("rtsp_codec_data_parse_from_frame_h264 sps:%u pps:%u success\n", +// s->vcodec_data.h264.sps_len, s->vcodec_data.h264.pps_len); + } + } + break; + case RTSP_CODEC_ID_VIDEO_H265: + if (s->vcodec_data.h265.pps_len == 0 || s->vcodec_data.h265.pps_len == 0 || s->vcodec_data.h265.vps_len == 0) { + if (rtsp_codec_data_parse_from_frame_h265(frame, len, &s->vcodec_data.h265) < 0) { + warn("rtsp_codec_data_parse_from_frame_h265 failed\n"); + } else { +// dbg("rtsp_codec_data_parse_from_frame_h265 vps:%u sps:%u pps:%u success\n", +// s->vcodec_data.h265.vps, s->vcodec_data.h265.sps_len, s->vcodec_data.h265.pps_len); + } + } + break; + } + + start = 0; + count = 0; + while (start < len && packets[count] && pktsizs[count] > 0) { + const uint8_t *p = NULL; + int size = 0; + int ret; + + p = rtsp_find_h264_h265_nalu(frame + start, len - start, &size); + if (!p) { + warn("not found nal header\n"); + break; + } + //dbg("size:%d\n", size); + + switch (s->vcodec_id) { + case RTSP_CODEC_ID_VIDEO_H264: + ret = rtp_enc_h264(&s->vrtpe, p, size, ts, &packets[count], &pktsizs[count]); + if (ret <= 0) { + err("rtp_enc_h264 ret = %d\n", ret); + return -1; + } + break; + case RTSP_CODEC_ID_VIDEO_H265: + ret = rtp_enc_h265(&s->vrtpe, p, size, ts, &packets[count], &pktsizs[count]); + if (ret <= 0) { + err("rtp_enc_h265 ret = %d\n", ret); + return -1; + } + break; + } + + count += ret; + start = p - frame + size; + } + + for (i = 0; i < count; i++) { + *pktlens[i] = pktsizs[i]; + streamq_push(q); + } + + //first send + TAILQ_FOREACH(cc, &s->connections_qhead, session_entry) { + struct rtp_connection *rtp = cc->vrtp; + if (cc->state != RTSP_CC_STATE_PLAYING || !rtp) + continue; + + rtcp_try_tx_sr(rtp, s->video_ntptime_of_zero_ts, ts, s->vrtpe.sample_rate); + rtsp_tx_video_packet(cc); + } + + return len; +} + +int rtsp_sever_tx_video (rtsp_demo_handle demo,rtsp_session_handle session, const uint8_t *frame, int len, uint64_t ts) +{ + struct rtsp_session *s = (struct rtsp_session*) session; + struct stream_queue *q = NULL; + struct rtsp_client_connection *cc = NULL; + uint8_t *packets[VRTP_MAX_NBPKTS+1] = {NULL}; + int pktsizs[VRTP_MAX_NBPKTS+1] = {0}; + int *pktlens[VRTP_MAX_NBPKTS] = {NULL}; + int i, index, count, start; + + if (!s || !frame || s->vcodec_id == RTSP_CODEC_ID_NONE) + return -1; + + //get free buffer + q = s->vstreamq; + index = streamq_tail(q); + for (i = 0; i < VRTP_MAX_NBPKTS; i++) { + if (streamq_next(q, index) == streamq_head(q)) + streamq_pop(q); + streamq_query(q, index, (char**)&packets[i], &pktlens[i]); + pktsizs[i] = RTP_MAX_PKTSIZ; + index = streamq_next(q, index); + } + packets[i] = NULL; + pktsizs[i] = 0; + + //move all slow rtp connections streamq_index to queue tail + TAILQ_FOREACH(cc, &s->connections_qhead, session_entry) { + struct rtp_connection *rtp = cc->vrtp; + if (cc->state != RTSP_CC_STATE_PLAYING || !rtp) + continue; + if (!streamq_inused(q, rtp->streamq_index) && rtp->streamq_index != streamq_tail(q)) { + rtp->streamq_index = streamq_head(q); + warn("client %s will lost video packet\n", inet_ntoa(cc->peer_addr)); + } + } + + switch (s->vcodec_id) { + case RTSP_CODEC_ID_VIDEO_H264: + if (s->vcodec_data.h264.pps_len == 0 || s->vcodec_data.h264.pps_len == 0) { + if (rtsp_codec_data_parse_from_frame_h264(frame, len, &s->vcodec_data.h264) < 0) { + warn("rtsp_codec_data_parse_from_frame_h264 failed\n"); + } else { +// dbg("rtsp_codec_data_parse_from_frame_h264 sps:%u pps:%u success\n", +// s->vcodec_data.h264.sps_len, s->vcodec_data.h264.pps_len); + } + } + break; + case RTSP_CODEC_ID_VIDEO_H265: + if (s->vcodec_data.h265.pps_len == 0 || s->vcodec_data.h265.pps_len == 0 || s->vcodec_data.h265.vps_len == 0) { + if (rtsp_codec_data_parse_from_frame_h265(frame, len, &s->vcodec_data.h265) < 0) { + warn("rtsp_codec_data_parse_from_frame_h265 failed\n"); + } else { +// dbg("rtsp_codec_data_parse_from_frame_h265 vps:%u sps:%u pps:%u success\n", +// s->vcodec_data.h265.vps, s->vcodec_data.h265.sps_len, s->vcodec_data.h265.pps_len); + } + } + break; + } + + start = 0; + count = 0; + while (start < len && packets[count] && pktsizs[count] > 0) { + const uint8_t *p = NULL; + int size = 0; + int ret; + + p = rtsp_find_h264_h265_nalu(frame + start, len - start, &size); + if (!p) { + warn("not found nal header\n"); + break; + } + //dbg("size:%d\n", size); + + switch (s->vcodec_id) { + case RTSP_CODEC_ID_VIDEO_H264: + ret = rtp_enc_h264(&s->vrtpe, p, size, ts, &packets[count], &pktsizs[count]); + if (ret <= 0) { + err("rtp_enc_h264 ret = %d\n", ret); + return -1; + } + break; + case RTSP_CODEC_ID_VIDEO_H265: + ret = rtp_enc_h265(&s->vrtpe, p, size, ts, &packets[count], &pktsizs[count]); + if (ret <= 0) { + err("rtp_enc_h265 ret = %d\n", ret); + return -1; + } + break; + } + + count += ret; + start = p - frame + size; + } + + for (i = 0; i < count; i++) { + *pktlens[i] = pktsizs[i]; + streamq_push(q); + } + + //first send + TAILQ_FOREACH(cc, &s->connections_qhead, session_entry) { + struct rtp_connection *rtp = cc->vrtp; + if (cc->state != RTSP_CC_STATE_PLAYING || !rtp) + continue; + + rtcp_try_tx_sr(rtp, s->video_ntptime_of_zero_ts, ts, s->vrtpe.sample_rate); + rtsp_tx_video_packet(cc); + } + + rtsp_do_event(demo); + + return len; +} + +int rtsp_tx_audio (rtsp_session_handle session, const uint8_t *frame, int len, uint64_t ts) +{ + struct rtsp_session *s = (struct rtsp_session*) session; + struct stream_queue *q = NULL; + struct rtsp_client_connection *cc = NULL; + uint8_t *packets[ARTP_MAX_NBPKTS+1] = {NULL}; + int pktsizs[ARTP_MAX_NBPKTS+1] = {0}; + int *pktlens[ARTP_MAX_NBPKTS] = {NULL}; + int i, index, count; + + if (!s || !frame || s->acodec_id == RTSP_CODEC_ID_NONE) + return -1; + + //get free buffer + q = s->astreamq; + index = streamq_tail(q); + for (i = 0; i < ARTP_MAX_NBPKTS; i++) { + if (streamq_next(q, index) == streamq_head(q)) + streamq_pop(q); + streamq_query(q, index, (char**)&packets[i], &pktlens[i]); + pktsizs[i] = RTP_MAX_PKTSIZ; + index = streamq_next(q, index); + } + packets[i] = NULL; + pktsizs[i] = 0; + + //move all slow rtp connections streamq_index to queue tail + TAILQ_FOREACH(cc, &s->connections_qhead, session_entry) { + struct rtp_connection *rtp = cc->artp; + if (cc->state != RTSP_CC_STATE_PLAYING || !rtp) + continue; + if (!streamq_inused(q, rtp->streamq_index) && rtp->streamq_index != streamq_tail(q)) { + rtp->streamq_index = streamq_head(q); + warn("client %s will lost audio packet\n", inet_ntoa(cc->peer_addr)); + } + } + + switch (s->acodec_id) { + case RTSP_CODEC_ID_AUDIO_G711A: + case RTSP_CODEC_ID_AUDIO_G711U: + count = rtp_enc_g711(&s->artpe, frame, len, ts, packets, pktsizs); + if (count <= 0) { + err("rtp_enc_g711 ret = %d\n", count); + return -1; + } + break; + case RTSP_CODEC_ID_AUDIO_G726: + count = rtp_enc_g726(&s->artpe, frame, len, ts, packets, pktsizs); + if (count <= 0) { + err("rtp_enc_g726 ret = %d\n", count); + return -1; + } + break; + case RTSP_CODEC_ID_AUDIO_AAC: + if (s->acodec_data.aac.audio_specific_config_len == 0) { + if (rtsp_codec_data_parse_from_frame_aac(frame, len, &s->acodec_data.aac) < 0) { +// warn("rtsp_codec_data_parse_from_frame_aac failed\n"); + } else { +// dbg("rtsp_codec_data_parse_from_frame_aac success\n"); + s->artpe.sample_rate = s->acodec_data.aac.sample_rate; + } + } + count = rtp_enc_aac(&s->artpe, frame, len, ts, packets, pktsizs); + if (count <= 0) { + err("rtp_enc_aac ret = %d\n", count); + return -1; + } + break; + } + + for (i = 0; i < count; i++) { + *pktlens[i] = pktsizs[i]; + streamq_push(q); + } + + //first send + TAILQ_FOREACH(cc, &s->connections_qhead, session_entry) { + struct rtp_connection *rtp = cc->artp; + if (cc->state != RTSP_CC_STATE_PLAYING || !rtp) + continue; + + rtcp_try_tx_sr(rtp, s->audio_ntptime_of_zero_ts, ts, s->artpe.sample_rate); + rtsp_tx_audio_packet(cc); + } + + return len; +} + +//return us from system running +uint64_t rtsp_get_reltime (void) +{ +#ifdef __WIN32__ + return (timeGetTime() * 1000ULL); +#endif +#ifdef __LINUX__ + struct timespec tp; + clock_gettime(CLOCK_MONOTONIC, &tp); + return (tp.tv_sec * 1000000ULL + tp.tv_nsec / 1000ULL); +#endif +} + +//return us from 1970/1/1 00:00:00 +static uint64_t rtsp_get_abstime (void) +{ +#ifdef __WIN32__ + FILETIME ft; + uint64_t t; + GetSystemTimeAsFileTime(&ft); + t = (uint64_t)ft.dwHighDateTime << 32 | ft.dwLowDateTime; + return t / 10 - 11644473600000000ULL; +#endif +#ifdef __LINUX__ + struct timeval tv; + gettimeofday(&tv, NULL); + return (tv.tv_sec * 1000000ULL + tv.tv_usec); +#endif +} + +//return us from 1900/1/1 00:00:00 +uint64_t rtsp_get_ntptime (void) +{ +#define NTP_OFFSET_US (2208988800000000ULL) + return (rtsp_get_abstime() + NTP_OFFSET_US); +} + +int rtsp_sync_video_ts (rtsp_session_handle session, uint64_t ts, uint64_t ntptime) +{ + struct rtsp_session *s = (struct rtsp_session*) session; + + if (!s || s->vcodec_id == RTSP_CODEC_ID_NONE) + return -1; + + s->video_ntptime_of_zero_ts = ntptime - ts; //XXX + return 0; +} + +int rtsp_sync_audio_ts (rtsp_session_handle session, uint64_t ts, uint64_t ntptime) +{ + struct rtsp_session *s = (struct rtsp_session*) session; + + if (!s || s->acodec_id == RTSP_CODEC_ID_NONE) + return -1; + + s->audio_ntptime_of_zero_ts = ntptime - ts; //XXX + return 0; +} + +struct rtcp_sr { +#ifdef __BIG_ENDIAN__ + uint16_t pt:8; + uint16_t v:2; + uint16_t p:1; + uint16_t rc:5; +#else + uint16_t rc:5; + uint16_t p:1; + uint16_t v:2; + uint16_t pt:8; +#endif + uint16_t length; + uint32_t ssrc; + uint32_t ntpts_msw; + uint32_t ntpts_lsw; + uint32_t rtp_ts; + uint32_t packet_count; + uint32_t octet_count; +}; + +static int rtcp_try_tx_sr (struct rtp_connection *c, uint64_t ntptime_of_zero_ts, uint64_t ts, uint32_t sample_rate) +{ + struct rtcp_sr sr = {0}; + uint32_t ntpts_msw = 0; + uint32_t ntpts_lsw = 0; + uint32_t rtp_ts = 0; + int size = sizeof(sr); + + if (c->rtcp_last_ts && ts < c->rtcp_last_ts + 5000000ULL) { + return 0; + } + + ntpts_msw = (uint32_t)((ntptime_of_zero_ts + ts) / 1000000ULL); + ntpts_lsw = (uint32_t)(((ntptime_of_zero_ts + ts) % 1000000ULL) * (1ULL << 32) / 1000000ULL); + rtp_ts = (uint32_t)(ts * sample_rate / 1000000ULL); + + sr.v = 2; + sr.p = 0; + sr.rc = 0; + sr.pt = 200; + sr.length = htons(size / 4 - 1); + sr.ssrc = htonl(c->ssrc); + sr.ntpts_msw = htonl(ntpts_msw); + sr.ntpts_lsw = htonl(ntpts_lsw); + sr.rtp_ts = htonl(rtp_ts); + sr.packet_count = htonl(c->rtcp_packet_count); + sr.octet_count = htonl(c->rtcp_octet_count); + + if (c->is_over_tcp) { + SOCKET sockfd = c->tcp_sockfd; + int ret = -1; + uint8_t szbuf[4 + sizeof(struct rtcp_sr)]; + + sockfd = c->tcp_sockfd; + szbuf[0] = '$'; + szbuf[1] = c->tcp_interleaved[1]; + *((uint16_t*)&szbuf[2]) = htons(size); + memcpy(&szbuf[4], &sr, size); + + ret = send(sockfd, (const char*)szbuf, sizeof(szbuf), 0); + if (ret == SOCKET_ERROR) { + if (sk_errno() != SK_EAGAIN && sk_errno() != SK_EINTR) { + warn("rtcp over tcp send frame to %s failed: %s\n", inet_ntoa(c->peer_addr), sk_strerror(sk_errno())); + return -1; + } + return 0; + } + } else { + struct sockaddr_in inaddr; + SOCKET sockfd = c->udp_sockfd[1]; + int ret = -1; + + memset(&inaddr, 0, sizeof(inaddr)); + inaddr.sin_family = AF_INET; + inaddr.sin_addr = c->peer_addr; + inaddr.sin_port = htons(c->udp_peerport[1]); + + ret = sendto(sockfd, (const char*)&sr, size, 0, (struct sockaddr*)&inaddr, sizeof(inaddr)); + if (ret == SOCKET_ERROR) { + if (sk_errno() != SK_EAGAIN && sk_errno() != SK_EINTR) { + warn("rtcp over udp send %d bytes to %s failed: %s\n", size, inet_ntoa(c->peer_addr), sk_strerror(sk_errno())); + return -1; + } + return 0; + } + } + + c->rtcp_last_ts = ts; + return size; +} diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_demo.h b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_demo.h new file mode 100644 index 0000000..047cc5d --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_demo.h @@ -0,0 +1,59 @@ +/************************************************************************* + > File Name: rtsp_demo.h + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Monday, November 23, 2015 AM12:22:43 CST + ************************************************************************/ + +#ifndef __RTSP_DEMO_H__ +#define __RTSP_DEMO_H__ +/* + * a simple RTSP server demo + * RTP over UDP/TCP H264/G711a + * */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum rtsp_codec_id { + RTSP_CODEC_ID_NONE = 0, + RTSP_CODEC_ID_VIDEO_H264 = 0x0001, /*codec_data is SPS + PPS frames*/ + RTSP_CODEC_ID_VIDEO_H265, /*codec_data is VPS + SPS + PPS frames*/ + RTSP_CODEC_ID_VIDEO_MPEG4, /*now not support*/ + RTSP_CODEC_ID_AUDIO_G711A = 0x4001, /*codec_data is NULL*/ + RTSP_CODEC_ID_AUDIO_G711U, /*codec_data is NULL*/ + RTSP_CODEC_ID_AUDIO_G726, /*codec_data is bitrate (int)*/ + RTSP_CODEC_ID_AUDIO_AAC, /*codec_data is audio specific config (2bytes). frame type is ADTS*/ +}; + +typedef void * rtsp_demo_handle; +typedef void * rtsp_session_handle; + +rtsp_demo_handle rtsp_new_demo (int port); +rtsp_demo_handle create_rtsp_demo(int port); +int rtsp_do_event (rtsp_demo_handle demo); +rtsp_session_handle rtsp_new_session (rtsp_demo_handle demo, const char *path); +rtsp_session_handle create_rtsp_session(rtsp_demo_handle demo, const char *path); +int rtsp_set_video (rtsp_session_handle session, int codec_id, const uint8_t *codec_data, int data_len); + + +int rtsp_set_audio (rtsp_session_handle session, int codec_id, const uint8_t *codec_data, int data_len); + +int rtsp_sever_tx_video (rtsp_demo_handle demo,rtsp_session_handle session, const uint8_t *frame, int len, uint64_t ts); +int rtsp_tx_video (rtsp_session_handle session, const uint8_t *frame, int len, uint64_t ts); +int rtsp_tx_audio (rtsp_session_handle session, const uint8_t *frame, int len, uint64_t ts); +void rtsp_del_session (rtsp_session_handle session); +void rtsp_del_demo (rtsp_demo_handle demo); + +uint64_t rtsp_get_reltime (void); +uint64_t rtsp_get_ntptime (void); +int rtsp_sync_video_ts (rtsp_session_handle session, uint64_t ts, uint64_t ntptime); +int rtsp_sync_audio_ts (rtsp_session_handle session, uint64_t ts, uint64_t ntptime); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_msg.c b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_msg.c new file mode 100644 index 0000000..e8b52c3 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_msg.c @@ -0,0 +1,1311 @@ +/************************************************************************* + > File Name: rtsp_msg.c + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Friday, December 11, 2015 AM05:02:48 CST + ************************************************************************/ + +#include +#include +#include +#include +#include + +#include "comm.h" +#include "rtsp_msg.h" + + +void *rtsp_mem_alloc (int size) +{ + if (size > 0) + return calloc(1, size); + return NULL; +} + +void rtsp_mem_free (void *ptr) +{ + if (ptr) + free(ptr); +} + +void *rtsp_mem_dup (const void *ptr, int size) +{ + void *ptr1 = calloc(1, size); + if (ptr1 && ptr) + memcpy(ptr1, ptr, size); + return ptr1; +} + +char *rtsp_str_dup (const char *str) +{ + int len = strlen(str); + char *str1 = (char*) calloc(1, len + 1); + if (str1 && str) + memcpy(str1, str, len); + return str1; +} + +#define ARRAY_SIZE(_arr) (sizeof(_arr)/sizeof(_arr[0])) + +typedef struct __rtsp_msg_int2str_tbl_s +{ + int intval; + int strsiz; + const char *strval; +} rtsp_msg_int2str_tbl_s; + +static const char *rtsp_msg_int2str (const rtsp_msg_int2str_tbl_s *tbl, int num, int intval) +{ + int i; + for (i = 0; i < num; i++) { + if (intval == tbl[i].intval) + return tbl[i].strval; + } + return tbl[num-1].strval; +} + +static int rtsp_msg_str2int (const rtsp_msg_int2str_tbl_s *tbl, int num, const char *str) +{ + int i; + for (i = 0; i < num; i++) { + if (strncmp(tbl[i].strval, str, tbl[i].strsiz) == 0) + return tbl[i].intval; + } + return tbl[num-1].intval; +} + +static const rtsp_msg_int2str_tbl_s rtsp_msg_method_tbl[] = { + { RTSP_MSG_METHOD_OPTIONS, 7, "OPTIONS", }, + { RTSP_MSG_METHOD_DESCRIBE, 8, "DESCRIBE", }, + { RTSP_MSG_METHOD_SETUP, 5, "SETUP", }, + { RTSP_MSG_METHOD_PLAY, 4, "PLAY", }, + { RTSP_MSG_METHOD_RECORD, 6, "RECORD", }, + { RTSP_MSG_METHOD_PAUSE, 5, "PAUSE", }, + { RTSP_MSG_METHOD_TEARDOWN, 8, "TEARDOWN", }, + { RTSP_MSG_METHOD_ANNOUNCE, 8, "ANNOUNCE", }, + { RTSP_MSG_METHOD_SET_PARAMETER, 13, "SET_PARAMETER", }, + { RTSP_MSG_METHOD_GET_PARAMETER, 13, "GET_PARAMETER", }, + { RTSP_MSG_METHOD_REDIRECT, 8, "REDIRECT", }, + { RTSP_MSG_METHOD_BUTT, 0, "", }, +}; + +static const rtsp_msg_int2str_tbl_s rtsp_msg_uri_scheme_tbl[] = { + {RTSP_MSG_URI_SCHEME_RTSPU, 6, "rtspu:"}, + {RTSP_MSG_URI_SCHEME_RTSP, 5, "rtsp:"}, + {RTSP_MSG_URI_SCHEME_BUTT, 0, ""}, +}; + +static const rtsp_msg_int2str_tbl_s rtsp_msg_version_tbl[] = { + {RTSP_MSG_VERSION_1_0, 8, "RTSP/1.0"}, + {RTSP_MSG_VERSION_BUTT, 0, ""}, +}; + +static const rtsp_msg_int2str_tbl_s rtsp_msg_status_code_tbl[] = { + {100, 0, "Continue"}, + {200, 0, "OK"}, + {201, 0, "Created"}, + {250, 0, "Low on Storage Space"}, + {300, 0, "Multiple Choices"}, + {301, 0, "Moved Permanently"}, + {302, 0, "Moved Temporarily"}, + {303, 0, "See Other"}, + {305, 0, "Use Proxy"}, + {400, 0, "Bad Request"}, + {401, 0, "Unauthorized"}, + {402, 0, "Payment Required"}, + {403, 0, "Forbidden"}, + {404, 0, "Not Found"}, + {405, 0, "Method Not Allowed"}, + {406, 0, "Not Acceptable"}, + {407, 0, "Proxy Authentication Required"}, + {408, 0, "Request Timeout"}, + {410, 0, "Gone"}, + {411, 0, "Length Required"}, + {412, 0, "Precondition Failed"}, + {413, 0, "Request Entity Too Large"}, + {414, 0, "Request-URI Too Long"}, + {415, 0, "Unsupported Media Type"}, + {451, 0, "Invalid parameter"}, + {452, 0, "Illegal Conference Identifier"}, + {453, 0, "Not Enough Bandwidth"}, + {454, 0, "Session Not Found"}, + {455, 0, "Method Not Valid In This State"}, + {456, 0, "Header Field Not Valid"}, + {457, 0, "Invalid Range"}, + {458, 0, "Parameter Is Read-Only"}, + {459, 0, "Aggregate Operation Not Allowed"}, + {460, 0, "Only Aggregate Operation Allowed"}, + {461, 0, "Unsupported Transport"}, + {462, 0, "Destination Unreachable"}, + {500, 0, "Internal Server Error"}, + {501, 0, "Not Implemented"}, + {502, 0, "Bad Gateway"}, + {503, 0, "Service Unavailable"}, + {504, 0, "Gateway Timeout"}, + {505, 0, "RTSP Version Not Supported"}, + {551, 0, "Option not support"}, +}; + +static const rtsp_msg_int2str_tbl_s rtsp_msg_transport_type_tbl[] = { + {RTSP_MSG_TRANSPORT_TYPE_RTP_AVP_TCP, 11, "RTP/AVP/TCP"}, + {RTSP_MSG_TRANSPORT_TYPE_RTP_AVP, 7, "RTP/AVP"}, + {RTSP_MSG_TRANSPORT_TYPE_BUTT, 0, ""}, +}; + +static const rtsp_msg_int2str_tbl_s rtsp_msg_content_type_tbl[] = { + {RTSP_MSG_CONTENT_TYPE_SDP, 15, "application/sdp"}, + {RTSP_MSG_CONTENT_TYPE_RTSL, 16, "application/rtsl"}, + {RTSP_MSG_CONTENT_TYPE_MHEG, 16, "application/mheg"}, + {RTSP_MSG_CONTENT_TYPE_BUTT, 0, ""}, +}; + +static int rtsp_msg_parse_uri (const char *line, rtsp_msg_uri_s *uri) +{ + const char *p = line, *q; + unsigned int tmp; + + uri->scheme = (rtsp_msg_uri_scheme_e) rtsp_msg_str2int(rtsp_msg_uri_scheme_tbl, + ARRAY_SIZE(rtsp_msg_uri_scheme_tbl), line); + if (uri->scheme == RTSP_MSG_URI_SCHEME_BUTT) { + err("parse scheme failed. line: %s\n", line); + return -1; + } + uri->port = 0; //default + uri->ipaddr[0] = 0; + uri->abspath[0] = 0; + + while (islower(*p) || *p == ':') p++; + if (*p != '/' || *(p+1) != '/') { + err("parse ip failed. line: %s\n", line); + return -1; + } + p += 2; + + q = p; + while (isgraph(*q) && *q != ':' && *q != '/') q++; + if (*q == ':') { + if (sscanf(q + 1, "%u", &tmp) != 1) { + err("parse uri port failed. line: %s\n", line); + return -1; + } + uri->port = tmp; + } + tmp = q - p; + if (tmp > sizeof(uri->ipaddr) - 1) + tmp = sizeof(uri->ipaddr) - 1; + memcpy(uri->ipaddr, p, tmp); + uri->ipaddr[tmp] = 0; + + while (isgraph(*q) && *q != '/') q++; + if (*q != '/') + return (q - line); + + p = q; + while (isgraph(*q)) q++; + tmp = q - p; + if (tmp > sizeof(uri->abspath) - 1) + tmp = sizeof(uri->abspath) - 1; + memcpy(uri->abspath, p, tmp); + uri->abspath[tmp] = 0; + + return (q - line); +} + +static int rtsp_msg_build_uri (const rtsp_msg_uri_s *uri, char *line, int size) +{ + if (uri->port) + snprintf(line, size, "%s//%s:%u%s", + rtsp_msg_int2str(rtsp_msg_uri_scheme_tbl, + ARRAY_SIZE(rtsp_msg_uri_scheme_tbl), uri->scheme), + uri->ipaddr, uri->port, uri->abspath); + else + snprintf(line, size, "%s//%s%s", + rtsp_msg_int2str(rtsp_msg_uri_scheme_tbl, + ARRAY_SIZE(rtsp_msg_uri_scheme_tbl), uri->scheme), + uri->ipaddr, uri->abspath); + return strlen(line); +} + +//return 0. if success +static int rtsp_msg_parse_startline (rtsp_msg_s *msg, const char *line) +{ + const char *p = line; + int ret; + ret = rtsp_msg_str2int(rtsp_msg_method_tbl, + ARRAY_SIZE(rtsp_msg_method_tbl), p); + if (ret != RTSP_MSG_METHOD_BUTT) { + msg->type = RTSP_MSG_TYPE_REQUEST; + msg->hdrs.startline.reqline.method = (rtsp_msg_method_e) ret; + while (isgraph(*p)) p++; p++; //next field + ret = rtsp_msg_parse_uri(p, &msg->hdrs.startline.reqline.uri); + if (ret <= 0) + return -1; + while (isgraph(*p)) p++; p++; //next field + ret = rtsp_msg_str2int(rtsp_msg_version_tbl, + ARRAY_SIZE(rtsp_msg_version_tbl), p); + if (ret == RTSP_MSG_VERSION_BUTT) { + err("parse version failed. line: %s\n", line); + return -1; + } + return 0; + } + + ret = rtsp_msg_str2int(rtsp_msg_version_tbl, + ARRAY_SIZE(rtsp_msg_version_tbl), p); + if (ret != RTSP_MSG_VERSION_BUTT) { + msg->type = RTSP_MSG_TYPE_RESPONSE; + msg->hdrs.startline.resline.version = (rtsp_msg_version_e) ret; + while (isgraph(*p)) p++; p++; //next field + if (sscanf(p, "%d", &ret) != 1) { + err("parse status-code failed. line: %s\n", line); + return -1; + } + msg->hdrs.startline.resline.status_code = ret; + return 0; + } + + if (*p != '$') { + err("parse startline failed: %s\n", line); + return -1; + } + + msg->type = RTSP_MSG_TYPE_INTERLEAVED; + msg->hdrs.startline.interline.channel = *((uint8_t*)(p+1)); + msg->hdrs.startline.interline.length = *((uint16_t*)(p+2)); //XXX + msg->hdrs.startline.interline.reserved = 0; + return 0; +} + +static int rtsp_msg_build_startline (const rtsp_msg_s *msg, char *line, int size) +{ + char *p = line; + int ret; + + if (msg->type == RTSP_MSG_TYPE_REQUEST) { + snprintf(line, size, "%s ", + rtsp_msg_int2str(rtsp_msg_method_tbl, + ARRAY_SIZE(rtsp_msg_method_tbl), + msg->hdrs.startline.reqline.method)); + ret = strlen(p); + p += ret; + size -= ret; + if (size <= 1) + return (p - line); + + ret = rtsp_msg_build_uri(&msg->hdrs.startline.reqline.uri, + p, size); + p += ret; + size -= ret; + if (size <= 1) + return (p - line); + + snprintf(p, size, " %s\r\n", + rtsp_msg_int2str(rtsp_msg_version_tbl, + ARRAY_SIZE(rtsp_msg_version_tbl), + msg->hdrs.startline.reqline.version)); + p += strlen(p); + return (p - line); + } + + if (msg->type == RTSP_MSG_TYPE_RESPONSE) { + snprintf(p, size, "%s %u %s\r\n", + rtsp_msg_int2str(rtsp_msg_version_tbl, + ARRAY_SIZE(rtsp_msg_version_tbl), + msg->hdrs.startline.resline.version), + msg->hdrs.startline.resline.status_code, + rtsp_msg_int2str(rtsp_msg_status_code_tbl, + ARRAY_SIZE(rtsp_msg_status_code_tbl), + msg->hdrs.startline.resline.status_code)); + return strlen(p); + } + + return 0; +} + +//Transport +static int rtsp_msg_parse_transport (rtsp_msg_s *msg, const char *line) +{ + rtsp_msg_hdr_s *hdrs = &msg->hdrs; + const char *p; + unsigned int tmp; + + if (hdrs->transport) { + rtsp_mem_free(hdrs->transport); + hdrs->transport = NULL; + } + + hdrs->transport = (rtsp_msg_transport_s *) rtsp_mem_alloc(sizeof(rtsp_msg_transport_s)); + if (!hdrs->transport) { + err("rtsp_mem_alloc for %s failed\n", "rtsp_msg_transport_s"); + return -1; + } + + p = strstr(line, "RTP/AVP"); + if (!p) { + err("parse transport failed. line: %s\n", line); + rtsp_mem_free(hdrs->transport); + hdrs->transport = NULL; + return -1; + } + hdrs->transport->type = (rtsp_msg_transport_type_e) rtsp_msg_str2int( + rtsp_msg_transport_type_tbl, + ARRAY_SIZE(rtsp_msg_transport_type_tbl), p); + + if ((p=strstr(line, "ssrc="))) { + if (sscanf(p, "ssrc=%X", &tmp) == 1) { + hdrs->transport->flags |= RTSP_MSG_TRANSPORT_FLAG_SSRC; + hdrs->transport->ssrc = tmp; + } + } + + if ((p=strstr(line, "unicast"))) { + hdrs->transport->flags |= RTSP_MSG_TRANSPORT_FLAG_UNICAST; + } + if ((p=strstr(line, "multicast"))) { + hdrs->transport->flags |= RTSP_MSG_TRANSPORT_FLAG_MULTICAST; + } + + if ((p=strstr(line, "client_port="))) { + if (sscanf(p, "client_port=%u-%*u", &tmp) == 1) { + hdrs->transport->flags |= RTSP_MSG_TRANSPORT_FLAG_CLIENT_PORT; + hdrs->transport->client_port = tmp; + } + } + + if ((p=strstr(line, "server_port="))) { + if (sscanf(p, "server_port=%u-%*u", &tmp) == 1) { + hdrs->transport->flags |= RTSP_MSG_TRANSPORT_FLAG_SERVER_PORT; + hdrs->transport->server_port = tmp; + } + } + + if ((p=strstr(line, "interleaved="))) { + if (sscanf(p, "interleaved=%u-%*u", &tmp) == 1) { + hdrs->transport->flags |= RTSP_MSG_TRANSPORT_FLAG_INTERLEAVED; + hdrs->transport->interleaved = tmp; + } + } + return 0; +} + +static int rtsp_msg_build_transport (const rtsp_msg_s *msg, char *line, int size) +{ + const rtsp_msg_hdr_s *hdrs = &msg->hdrs; + if (hdrs->transport) { + char *p = line; + int len; + snprintf(p, size, "Transport: %s", rtsp_msg_int2str(rtsp_msg_transport_type_tbl, + ARRAY_SIZE(rtsp_msg_transport_type_tbl), hdrs->transport->type)); +#define TRANSPORT_BUILD_STEP() \ + len = strlen(p); \ + p += len; \ + size -= len; \ + if (size <= 1) { \ + return (p - line); \ + } + TRANSPORT_BUILD_STEP(); + + if (hdrs->transport->flags & RTSP_MSG_TRANSPORT_FLAG_SSRC) { + snprintf(p, size, ";ssrc=%08X", hdrs->transport->ssrc); + TRANSPORT_BUILD_STEP(); + } + + if (hdrs->transport->flags & RTSP_MSG_TRANSPORT_FLAG_MULTICAST) { + snprintf(p, size, ";multicast"); + TRANSPORT_BUILD_STEP(); + } else if (hdrs->transport->flags & RTSP_MSG_TRANSPORT_FLAG_UNICAST) { + snprintf(p, size, ";unicast"); + TRANSPORT_BUILD_STEP(); + } + + if (hdrs->transport->flags & RTSP_MSG_TRANSPORT_FLAG_CLIENT_PORT) { + snprintf(p, size, ";client_port=%u-%u", + hdrs->transport->client_port, + hdrs->transport->client_port + 1); + TRANSPORT_BUILD_STEP(); + } + + if (hdrs->transport->flags & RTSP_MSG_TRANSPORT_FLAG_SERVER_PORT) { + snprintf(p, size, ";server_port=%u-%u", + hdrs->transport->server_port, + hdrs->transport->server_port + 1); + TRANSPORT_BUILD_STEP(); + } + + if (hdrs->transport->flags & RTSP_MSG_TRANSPORT_FLAG_INTERLEAVED) { + snprintf(p, size, ";interleaved=%u-%u", + hdrs->transport->interleaved, + hdrs->transport->interleaved + 1); + TRANSPORT_BUILD_STEP(); + } + + snprintf(p, size, "\r\n"); + TRANSPORT_BUILD_STEP(); + return (p - line); + } + return 0; +} + +//Range +static int rtsp_msg_parse_range (rtsp_msg_s *msg, const char *line) +{ + return 0;//TODO +} + +static int rtsp_msg_build_range (const rtsp_msg_s *msg, char *line, int size) +{ + return 0;//TODO +} + +//Authorization +static int rtsp_msg_parse_authorization (rtsp_msg_s *msg, const char *line) +{ + return 0;//TODO +} + +static int rtsp_msg_build_authorization (const rtsp_msg_s *msg, char *line, int size) +{ + return 0;//TODO +} + +//RTP-Info +static int rtsp_msg_parse_rtp_info (rtsp_msg_s *msg, const char *line) +{ + return 0;//TODO +} + +static int rtsp_msg_build_rtp_info (const rtsp_msg_s *msg, char *line, int size) +{ + return 0;//TODO +} + +//link CSeq/Session int +#define DEFINE_PARSE_BUILD_LINK_CSEQ(_name, _type, _param, _fmt) \ +static int rtsp_msg_parse_##_name (rtsp_msg_s *msg, const char *line) \ +{ \ + rtsp_msg_hdr_s *hdrs = &msg->hdrs; \ + if (hdrs->_name) { \ + rtsp_mem_free(hdrs->_name); \ + hdrs->_name = NULL; \ + } \ + hdrs->_name = (_type*)rtsp_mem_alloc(sizeof(_type)); \ + if (!hdrs->_name) { \ + err("rtsp_mem_alloc for %s failed\n", #_type); \ + return -1; \ + } \ + if (sscanf(line, _fmt, &hdrs->_name->_param) != 1) { \ + rtsp_mem_free(hdrs->_name); \ + hdrs->_name = NULL; \ + err("parse %s failed. line: %s\n", #_name, line); \ + return -1; \ + } \ + return 0; \ +} \ +static int rtsp_msg_build_##_name (const rtsp_msg_s *msg, char *line, int size) \ +{ \ + if (msg->hdrs._name) { \ + snprintf(line, size, _fmt "\r\n", msg->hdrs._name->_param); \ + return strlen(line); \ + } \ + return 0; \ +} + +DEFINE_PARSE_BUILD_LINK_CSEQ(cseq, rtsp_msg_cseq_s, cseq, "CSeq: %u") +DEFINE_PARSE_BUILD_LINK_CSEQ(session, rtsp_msg_session_s, session, "Session: %08X") +DEFINE_PARSE_BUILD_LINK_CSEQ(content_length, rtsp_msg_content_length_s, length, "Content-Length: %u") + +//link Server/User-Agent char[] +#define DEFINE_PARSE_BUILD_LINK_SERVER(_name, _type, _param, _fmt) \ +static int rtsp_msg_parse_##_name (rtsp_msg_s *msg, const char *line) \ +{ \ + rtsp_msg_hdr_s *hdrs = &msg->hdrs; \ + const char *p = line; \ + unsigned int tmp = 0; \ + if (hdrs->_name) { \ + rtsp_mem_free(hdrs->_name); \ + hdrs->_name = NULL; \ + } \ + hdrs->_name = (_type*)rtsp_mem_alloc(sizeof(_type)); \ + if (!hdrs->_name) { \ + err("rtsp_mem_alloc for %s failed\n", #_type); \ + return -1; \ + } \ + while (isgraph(*p) && *p != ':') p++; \ + if (*p != ':') { \ + rtsp_mem_free(hdrs->_name); \ + hdrs->_name = NULL; \ + err("parse %s failed. line: %s\n", #_name, line); \ + return -1; \ + } \ + p++; \ + while (*p == ' ') p++; \ + while (isprint(*p) && tmp < sizeof(hdrs->_name->_param) - 1) { \ + hdrs->_name->_param[tmp++] = *p++; \ + } \ + hdrs->_name->_param[tmp] = 0; \ + return 0; \ +} \ +static int rtsp_msg_build_##_name (const rtsp_msg_s *msg, char *line, int size) \ +{ \ + if (msg->hdrs._name) { \ + snprintf(line, size, _fmt "\r\n", msg->hdrs._name->_param); \ + return strlen(line); \ + } \ + return 0; \ +} + +DEFINE_PARSE_BUILD_LINK_SERVER(server, rtsp_msg_server_s, server, "Server: %s") +DEFINE_PARSE_BUILD_LINK_SERVER(user_agent, rtsp_msg_user_agent_s, user_agent, "User-Agent: %s") +DEFINE_PARSE_BUILD_LINK_SERVER(date, rtsp_msg_date_s, http_date, "Date: %s") + +//link Content-Type +#define DEFINE_PARSE_BUILD_LINK_CONTENT_TYPE(_name, _type, _param, _fmt, _tbl) \ +static int rtsp_msg_parse_##_name (rtsp_msg_s *msg, const char *line) \ +{ \ + rtsp_msg_hdr_s *hdrs = &msg->hdrs; \ + const char *p = line; \ + int num = ARRAY_SIZE(_tbl); \ + int i = 0; \ + if (hdrs->_name) { \ + rtsp_mem_free(hdrs->_name); \ + hdrs->_name = NULL; \ + } \ + hdrs->_name = (_type*)rtsp_mem_alloc(sizeof(_type)); \ + if (!hdrs->_name) { \ + err("rtsp_mem_alloc for %s failed\n", #_type); \ + return -1; \ + } \ + while (isgraph(*p) && *p != ':') p++; \ + if (*p != ':') { \ + rtsp_mem_free(hdrs->_name); \ + hdrs->_name = NULL; \ + err("parse %s failed. line: %s\n", #_name, line); \ + return -1; \ + } \ + p++; \ + while (*p == ' ') p++; \ + for (i = 0; i < num; i++) { \ + if (_tbl[i].strsiz && strstr(p, _tbl[i].strval)) { \ + *((int*)&hdrs->_name->_param) = _tbl[i].intval; \ + return 0; \ + } \ + } \ + rtsp_mem_free(hdrs->_name); \ + hdrs->_name = NULL; \ + return -1; \ +} \ +static int rtsp_msg_build_##_name (const rtsp_msg_s *msg, char *line, int size) \ +{ \ + if (msg->hdrs._name) { \ + int i, num = ARRAY_SIZE(_tbl); \ + for (i = 0; i < num; i++) { \ + if ((int)msg->hdrs._name->_param == _tbl[i].intval) { \ + snprintf(line, size, _fmt "\r\n", _tbl[i].strval); \ + return strlen(line); \ + } \ + } \ + return 0; \ + } \ + return 0; \ +} + +DEFINE_PARSE_BUILD_LINK_CONTENT_TYPE(content_type, rtsp_msg_content_type_s, type, "Content-Type: %s", rtsp_msg_content_type_tbl) + +//link Public/Accept +#define DEFINE_PARSE_BUILD_LINK_PUBLIC(_name, _type, _param, _fmt, _tbl) \ +static int rtsp_msg_parse_##_name (rtsp_msg_s *msg, const char *line) \ +{ \ + rtsp_msg_hdr_s *hdrs = &msg->hdrs; \ + const char *p = line; \ + int num = ARRAY_SIZE(_tbl); \ + int i = 0; \ + if (hdrs->_name) { \ + rtsp_mem_free(hdrs->_name); \ + hdrs->_name = NULL; \ + } \ + hdrs->_name = (_type*)rtsp_mem_alloc(sizeof(_type)); \ + if (!hdrs->_name) { \ + err("rtsp_mem_alloc for %s failed\n", #_type); \ + return -1; \ + } \ + while (isgraph(*p) && *p != ':') p++; \ + if (*p != ':') { \ + rtsp_mem_free(hdrs->_name); \ + hdrs->_name = NULL; \ + err("parse %s failed. line: %s\n", #_name, line); \ + return -1; \ + } \ + p++; \ + while (*p == ' ') p++; \ + for (i = 0; i < num; i++) { \ + if (_tbl[i].strsiz && strstr(p, _tbl[i].strval)) \ + hdrs->_name->_param |= 1 << _tbl[i].intval; \ + } \ + return 0; \ +} \ +static int rtsp_msg_build_##_name (const rtsp_msg_s *msg, char *line, int size) \ +{ \ + if (msg->hdrs._name) { \ + char *p = line; \ + int len, i, flag = 0; \ + int num = ARRAY_SIZE(_tbl); \ + snprintf(p, size, _fmt, ""); \ + len = strlen(p); \ + p += len; \ + size -= len; \ + if (size <= 1) { \ + return (p - line); \ + } \ + for (i = 0; i < num; i++) { \ + if (msg->hdrs._name->_param & (1 << _tbl[i].intval)) { \ + if (flag) { \ + snprintf(p, size, ", %s", _tbl[i].strval); \ + } else { \ + snprintf(p, size, "%s", _tbl[i].strval); \ + flag = 1; \ + } \ + len = strlen(p); \ + p += len; \ + size -= len; \ + if (size <= 1) { \ + return (p - line); \ + } \ + } \ + } \ + snprintf(p, size, "\r\n"); \ + len = strlen(p); \ + p += len; \ + return (p - line); \ + } \ + return 0; \ +} + +DEFINE_PARSE_BUILD_LINK_PUBLIC(public_, rtsp_msg_public_s, public_, "Public: %s", rtsp_msg_method_tbl) +DEFINE_PARSE_BUILD_LINK_PUBLIC(accept, rtsp_msg_accept_s, accept, "Accept: %s", rtsp_msg_content_type_tbl) + +typedef int (*rtsp_msg_line_parser) (rtsp_msg_s *msg, const char *line); +typedef struct __rtsp_msg_str2parser_tbl_s +{ + int strsiz; + const char *strval; + rtsp_msg_line_parser parser; +} rtsp_msg_str2parser_tbl_s; + +static const rtsp_msg_str2parser_tbl_s rtsp_msg_hdr_line_parse_tbl[] = { + {6, "CSeq: ", rtsp_msg_parse_cseq}, + {6, "Date: ", rtsp_msg_parse_date}, + {9, "Session: ", rtsp_msg_parse_session}, + {11, "Transport: ", rtsp_msg_parse_transport}, + {7, "Range: ", rtsp_msg_parse_range}, + {8, "Accept: ", rtsp_msg_parse_accept}, + {15, "Authorization: ", rtsp_msg_parse_authorization}, + {12, "User-Agent: ", rtsp_msg_parse_user_agent}, + {8, "Public: ", rtsp_msg_parse_public_}, + {10, "RTP-Info: ", rtsp_msg_parse_rtp_info}, + {8, "Server: ", rtsp_msg_parse_server}, + {14, "Content-Type: ", rtsp_msg_parse_content_type}, + {16, "Content-Length: ", rtsp_msg_parse_content_length}, +}; + +static rtsp_msg_line_parser rtsp_msg_str2parser (const char *line) +{ + const rtsp_msg_str2parser_tbl_s *tbl = rtsp_msg_hdr_line_parse_tbl; + int num = ARRAY_SIZE(rtsp_msg_hdr_line_parse_tbl); + int i; + + for (i = 0; i < num; i++) { + if (strncmp(tbl[i].strval, line, tbl[i].strsiz) == 0) + return tbl[i].parser; + } + return NULL; +} + +//@start: data +//@line: store current line (has \0. but no \r\n) +//@maxlen: line max size +//@return: non-NULL is next line pointer. NULL has no next line +static const char *rtsp_msg_hdr_next_line (const char *start, char *line, int maxlen) +{ + const char *p = start; + + while (*p && *p != '\r' && *p != '\n') p++; + if (*p != '\r' || *(p+1) != '\n') + return NULL; + + if (line && maxlen > 0) { + maxlen --; + if (maxlen > p - start) + maxlen = p - start; + memcpy(line, start, maxlen); + line[maxlen] = '\0'; + } + + return (p + 2); +} + +int rtsp_msg_init (rtsp_msg_s *msg) +{ + if (msg) + memset(msg, 0, sizeof(rtsp_msg_s)); + return 0; +} + +//free all msg elements. not free msg +void rtsp_msg_free (rtsp_msg_s *msg) +{ + if (msg->hdrs.cseq) + rtsp_mem_free(msg->hdrs.cseq); + if (msg->hdrs.date) + rtsp_mem_free(msg->hdrs.date); + if (msg->hdrs.session) + rtsp_mem_free(msg->hdrs.session); + if (msg->hdrs.transport) + rtsp_mem_free(msg->hdrs.transport); + if (msg->hdrs.range) + rtsp_mem_free(msg->hdrs.range); + + if (msg->hdrs.accept) + rtsp_mem_free(msg->hdrs.accept); + //TODO free authorization + if (msg->hdrs.user_agent) + rtsp_mem_free(msg->hdrs.user_agent); + + if (msg->hdrs.public_) + rtsp_mem_free(msg->hdrs.public_); + //TODO free rtp-info + if (msg->hdrs.server) + rtsp_mem_free(msg->hdrs.server); + + if (msg->hdrs.content_type) + rtsp_mem_free(msg->hdrs.content_type); + if (msg->hdrs.content_length) + rtsp_mem_free(msg->hdrs.content_length); + + if (msg->body.body) + rtsp_mem_free(msg->body.body); + + memset(msg, 0, sizeof(rtsp_msg_s)); +} + +uint32_t rtsp_msg_gen_session_id (void) +{ + static uint32_t session_id = 0x12345678; + return session_id++; //FIXME +} + +//return frame real size. when frame is completed +//return 0. when frame size is not enough +//return -1. when frame is invalid +int rtsp_msg_frame_size (const void *data, int size) +{ + const char *frame = (const char *)data; + const char *p; + int hdrlen = 0, content_len = 0; + + //check first + p = strstr(frame, "\r\n"); + if (!p || size < p - frame + 2) { + if (size > 256) + return -1; //first line is too large + return 0; + } + + //check headers + p = strstr(frame, "\r\n\r\n"); + if (!p || size < p - frame + 4) { + if (size > 1024) + return -1; //headers is too large + return 0; + } + hdrlen = p - frame + 4; + + //get content-length + p = frame; + while ((p = rtsp_msg_hdr_next_line(p, NULL, 0))) { + if (strncmp(p, "\r\n", 2) == 0) + break; //header end + if (strncmp(p, "Content-Length", 14) == 0) { + if (sscanf(p, "Content-Length: %d", &content_len) != 1) { + err("parse Content-Length failed. line: %s", p); + return -1; + } + } + } + + if (size < hdrlen + content_len) + return 0; + return (hdrlen + content_len); +} + +//return data's bytes which is parsed. when success +//return 0. when data is not enough +//return -1. when data is invalid +int rtsp_msg_parse_from_array (rtsp_msg_s *msg, const void *data, int size) +{ + const char *frame = (const char *)data; + const char *p = frame; + char line[256]; + int ret; + + memset(msg, 0, sizeof(rtsp_msg_s)); + + //interleaved frame + if (frame[0] == '$') { + uint16_t interlen = *((uint16_t*)(p+2)); + interlen = ntohs(interlen); + if (size < interlen + 4) + return 0; + msg->type = RTSP_MSG_TYPE_INTERLEAVED; + msg->hdrs.startline.interline.channel = *((uint8_t*)(p+1)); + msg->hdrs.startline.interline.length = interlen; + msg->body.body = rtsp_mem_dup((const char*)data + 4, interlen); + return (interlen + 4); + } + + dbg("\n%s", frame); + + ret = rtsp_msg_frame_size(data, size); + if (ret <= 0) + return ret; + size = ret; + + p = rtsp_msg_hdr_next_line(p, line, sizeof(line)); + if (!p) { + return -1; + } + + ret = rtsp_msg_parse_startline(msg, line); + if (ret < 0) + return -1; + + while ((p = rtsp_msg_hdr_next_line(p, line, sizeof(line)))) { + rtsp_msg_line_parser parser; + + if (strlen(line) == 0) + break; + parser = rtsp_msg_str2parser(line); + if (!parser) { + warn("unknown line: %s\n", line); + continue; + } + + ret = (*parser) (msg, line); + if (ret < 0) { + err("parse failed. line: %s\n", line); + break; + } + } + if (!p || strlen(line)) { + //dbg("p = %p len = %lu\n", p, strlen(line)); + rtsp_msg_free(msg); + return -1; + } + + if (msg->hdrs.content_length) { + msg->body.body = rtsp_mem_dup(p, msg->hdrs.content_length->length); + if (!msg->body.body) { + err("set body failed\n"); + rtsp_msg_free(msg); + return -1; + } + } + + //debug + ret = p - frame; + if (msg->hdrs.content_length) + ret += msg->hdrs.content_length->length; + if (ret != size) { + warn("frame size is %d. but real used %d\n", size, ret); + } + + return size; +} + +//return data's bytes which is used. when success +//return -1. when failed +int rtsp_msg_build_to_array (const rtsp_msg_s *msg, void *data, int size) +{ + char *frame = (char *)data; + char *p = frame; + int len; + + //interleaved frame + if (msg->type == RTSP_MSG_TYPE_INTERLEAVED) { + uint8_t hdr[4]; + uint16_t interlen = msg->hdrs.startline.interline.length; + hdr[0] = '$'; + hdr[1] = msg->hdrs.startline.interline.channel; + *((uint16_t*)(&hdr[2])) = htons(interlen); + if (size > 4 + interlen) + size = interlen + 4; + memcpy(data, hdr, 4); + if (msg->body.body) + memcpy((char*)data + 4, msg->body.body, size - 4); + return size; + } + +#define MSG_BUILD_STEP() \ + do { \ + if (len < 0) \ + return -1; \ + p += len; \ + size -= len; \ + if (size <= 1) \ + return (p - frame); \ + } while(0) + + len = rtsp_msg_build_startline(msg, p, size);; + MSG_BUILD_STEP(); + +#define MSG_BUILD_LINE(_name) \ + do { \ + if (msg->hdrs._name) { \ + len = rtsp_msg_build_##_name(msg, p, size); \ + MSG_BUILD_STEP(); \ + } \ + } while(0) + + MSG_BUILD_LINE(cseq); + MSG_BUILD_LINE(date); + MSG_BUILD_LINE(session); + MSG_BUILD_LINE(transport); + MSG_BUILD_LINE(range); + + MSG_BUILD_LINE(accept); + MSG_BUILD_LINE(authorization); + MSG_BUILD_LINE(user_agent); + + MSG_BUILD_LINE(public_); + MSG_BUILD_LINE(rtp_info); + MSG_BUILD_LINE(server); + + MSG_BUILD_LINE(content_type); + MSG_BUILD_LINE(content_length); + + snprintf(p, size, "\r\n"); + len = strlen(p); + MSG_BUILD_STEP(); + + if (msg->hdrs.content_length) { + len = msg->hdrs.content_length->length; + if (len > size) + len = size; + memcpy(p, msg->body.body, len); + p += len; + //size -= len; + } + + dbg("\n%s", frame); + return (p - frame); +} + +int rtsp_msg_set_request (rtsp_msg_s *msg, rtsp_msg_method_e mt, const char *ipaddr, const char *abspath) +{ + msg->type = RTSP_MSG_TYPE_REQUEST; + msg->hdrs.startline.reqline.method = mt; + msg->hdrs.startline.reqline.uri.scheme = RTSP_MSG_URI_SCHEME_RTSP; + strncpy(msg->hdrs.startline.reqline.uri.ipaddr, ipaddr, + sizeof(msg->hdrs.startline.reqline.uri.ipaddr) - 1); + strncpy(msg->hdrs.startline.reqline.uri.abspath, abspath, + sizeof(msg->hdrs.startline.reqline.uri.abspath) - 1); + msg->hdrs.startline.reqline.version = RTSP_MSG_VERSION_1_0; + return 0; +} + +int rtsp_msg_set_response (rtsp_msg_s *msg, int status_code) +{ + msg->type = RTSP_MSG_TYPE_RESPONSE; + msg->hdrs.startline.resline.version = RTSP_MSG_VERSION_1_0; + msg->hdrs.startline.resline.status_code = status_code; + return 0; +} + +int rtsp_msg_get_cseq (const rtsp_msg_s *msg, uint32_t *cseq) +{ + if (!msg->hdrs.cseq) + return -1; + if (cseq) + *cseq = msg->hdrs.cseq->cseq; + return 0; +} + +int rtsp_msg_set_cseq (rtsp_msg_s *msg, uint32_t cseq) +{ + if (!msg->hdrs.cseq) + msg->hdrs.cseq = (rtsp_msg_cseq_s*) rtsp_mem_alloc(sizeof(rtsp_msg_cseq_s)); + if (!msg->hdrs.cseq) + return -1; + msg->hdrs.cseq->cseq = cseq; + return 0; +} + +int rtsp_msg_get_session (const rtsp_msg_s *msg, uint32_t *session) +{ + if (!msg->hdrs.session) + return -1; + if (session) + *session = msg->hdrs.session->session; + return 0; +} + +int rtsp_msg_set_session (rtsp_msg_s *msg, uint32_t session) +{ + if (!msg->hdrs.session) + msg->hdrs.session = (rtsp_msg_session_s*) rtsp_mem_alloc(sizeof(rtsp_msg_session_s)); + if (!msg->hdrs.session) + return -1; + msg->hdrs.session->session = session; + return 0; +} + +int rtsp_msg_get_date (const rtsp_msg_s *msg, char *date, int len) +{ + if (!msg->hdrs.date) + return -1; + if (date) + strncpy(date, msg->hdrs.date->http_date, len - 1); + return 0; +} + +int rtsp_msg_set_date (rtsp_msg_s *msg, const char *date) +{ + if (!msg->hdrs.date) + msg->hdrs.date = (rtsp_msg_date_s*) rtsp_mem_alloc(sizeof(rtsp_msg_date_s)); + if (!msg->hdrs.date) + return -1; + if (date) { + strncpy(msg->hdrs.date->http_date, date, sizeof(msg->hdrs.date->http_date) - 1); + } else { + time_t t = time(NULL); + char *p; + strncpy(msg->hdrs.date->http_date, ctime(&t), + sizeof(msg->hdrs.date->http_date) - 1); + p = msg->hdrs.date->http_date; + while (isprint(*p)) p++; + *p = 0; + } + return 0; +} + +int rtsp_msg_set_transport_udp (rtsp_msg_s *msg, uint32_t ssrc, int client_port, int server_port) +{ + if (!msg->hdrs.transport) + msg->hdrs.transport = (rtsp_msg_transport_s*) rtsp_mem_alloc(sizeof(rtsp_msg_transport_s)); + if (!msg->hdrs.transport) + return -1; + msg->hdrs.transport->type = RTSP_MSG_TRANSPORT_TYPE_RTP_AVP; + msg->hdrs.transport->flags |= RTSP_MSG_TRANSPORT_FLAG_SSRC | RTSP_MSG_TRANSPORT_FLAG_UNICAST; + msg->hdrs.transport->ssrc = ssrc; + if (client_port >= 0) { + msg->hdrs.transport->flags |= RTSP_MSG_TRANSPORT_FLAG_CLIENT_PORT; + msg->hdrs.transport->client_port = client_port; + } + if (server_port >= 0) { + msg->hdrs.transport->flags |= RTSP_MSG_TRANSPORT_FLAG_SERVER_PORT; + msg->hdrs.transport->server_port = server_port; + } + return 0; +} + +int rtsp_msg_set_transport_tcp (rtsp_msg_s *msg, uint32_t ssrc, int interleaved) +{ + if (!msg->hdrs.transport) + msg->hdrs.transport = (rtsp_msg_transport_s*) rtsp_mem_alloc(sizeof(rtsp_msg_transport_s)); + if (!msg->hdrs.transport) + return -1; + msg->hdrs.transport->type = RTSP_MSG_TRANSPORT_TYPE_RTP_AVP_TCP; + msg->hdrs.transport->flags |= RTSP_MSG_TRANSPORT_FLAG_SSRC; + msg->hdrs.transport->ssrc = ssrc; + if (interleaved >= 0) { + msg->hdrs.transport->flags |= RTSP_MSG_TRANSPORT_FLAG_INTERLEAVED; + msg->hdrs.transport->interleaved = interleaved; + } + return 0; +} + +int rtsp_msg_get_accept (const rtsp_msg_s *msg, uint32_t *accept) +{ + if (!msg->hdrs.accept) + return -1; + if (accept) + *accept = msg->hdrs.accept->accept; + return 0; +} + +int rtsp_msg_set_accept (rtsp_msg_s *msg, uint32_t accept) +{ + if (!msg->hdrs.accept) + msg->hdrs.accept = (rtsp_msg_accept_s*) rtsp_mem_alloc(sizeof(rtsp_msg_accept_s)); + if (!msg->hdrs.accept) + return -1; + msg->hdrs.accept->accept = accept; + return 0; +} + +int rtsp_msg_get_user_agent (const rtsp_msg_s *msg, char *user_agent, int len) +{ + if (!msg->hdrs.user_agent) + return -1; + if (user_agent) + strncpy(user_agent, msg->hdrs.user_agent->user_agent, len - 1); + return 0; +} + +int rtsp_msg_set_user_agent (rtsp_msg_s *msg, const char *user_agent) +{ + if (!msg->hdrs.user_agent) + msg->hdrs.user_agent = (rtsp_msg_user_agent_s*) rtsp_mem_alloc(sizeof(rtsp_msg_user_agent_s)); + if (!msg->hdrs.user_agent) + return -1; + if (user_agent) { + strncpy(msg->hdrs.user_agent->user_agent, user_agent, sizeof(msg->hdrs.user_agent->user_agent) - 1); + } else { + strncpy(msg->hdrs.user_agent->user_agent, "rtsp_msg_user_agent", + sizeof(msg->hdrs.user_agent->user_agent) - 1); + } + return 0; +} + +int rtsp_msg_get_public (const rtsp_msg_s *msg, uint32_t *public_) +{ + if (!msg->hdrs.public_) + return -1; + if (public_) + *public_ = msg->hdrs.public_->public_; + return 0; +} + +int rtsp_msg_set_public (rtsp_msg_s *msg, uint32_t public_) +{ + if (!msg->hdrs.public_) + msg->hdrs.public_ = (rtsp_msg_public_s*) rtsp_mem_alloc(sizeof(rtsp_msg_public_s)); + if (!msg->hdrs.public_) + return -1; + msg->hdrs.public_->public_ = public_; + return 0; +} + +int rtsp_msg_get_server (const rtsp_msg_s *msg, char *server, int len) +{ + if (!msg->hdrs.server) + return -1; + if (server) + strncpy(server, msg->hdrs.server->server, len - 1); + return 0; +} + +int rtsp_msg_set_server (rtsp_msg_s *msg, const char *server) +{ + if (!msg->hdrs.server) + msg->hdrs.server = (rtsp_msg_server_s*) rtsp_mem_alloc(sizeof(rtsp_msg_server_s)); + if (!msg->hdrs.server) + return -1; + if (server) { + strncpy(msg->hdrs.server->server, server, sizeof(msg->hdrs.server->server) - 1); + } else { + strncpy(msg->hdrs.server->server, "rtsp_msg_server", + sizeof(msg->hdrs.server->server) - 1); + } + return 0; +} + +int rtsp_msg_get_content_type (const rtsp_msg_s *msg, int *type) +{ + if (!msg->hdrs.content_type) + return -1; + if (type) + *type = msg->hdrs.content_type->type; + return 0; +} + +int rtsp_msg_set_content_type (rtsp_msg_s *msg, int type) +{ + if (!msg->hdrs.content_type) + msg->hdrs.content_type = (rtsp_msg_content_type_s*) rtsp_mem_alloc(sizeof(rtsp_msg_content_type_s)); + if (!msg->hdrs.content_type) + return -1; + msg->hdrs.content_type->type = (rtsp_msg_content_type_e) type; + return 0; +} + +int rtsp_msg_get_content_length (const rtsp_msg_s *msg, int *length) +{ + if (!msg->hdrs.content_length) + return -1; + if (length) + *length = msg->hdrs.content_length->length; + return 0; +} + +int rtsp_msg_set_content_length (rtsp_msg_s *msg, int length) +{ + if (!msg->hdrs.content_length) + msg->hdrs.content_length = (rtsp_msg_content_length_s*) rtsp_mem_alloc(sizeof(rtsp_msg_content_length_s)); + if (!msg->hdrs.content_length) + return -1; + msg->hdrs.content_length->length = length; + return 0; +} + +#if 0 +#include +int main(int argc, char *argv[]) +{ + const char *file = "rtsp.log"; + int fd; + char srcbuf[1024]; + char dstbuf[1024]; + int srclen, dstlen; + int ret; + rtsp_msg_s msg; + + rtsp_msg_init(&msg); + + if (argc > 1) + file = argv[1]; + + fd = open(file, O_RDONLY); + if (fd < 0) { + perror("open failed"); + return -1; + } + + srclen = 0; + do { + ret = rtsp_msg_parse_from_array(&msg, srcbuf, srclen); + if (ret < 0) { + printf(">>>>>>>>>>1\n"); + break; + } + if (ret == 0) { + ret = read(fd, srcbuf + srclen, sizeof(srcbuf) - srclen); + if (ret <= 0) { + printf(">>>>>>>>>>>2\n"); + break; + } + srclen += ret; + continue; + } + + printf("ret = %d\n", ret); + memmove(srcbuf, srcbuf + ret, srclen - ret); + srclen -= ret; + + ret = rtsp_msg_build_to_array(&msg, dstbuf, sizeof(dstbuf)); + if (ret <= 0) { + printf(">>>>>>>>>>3\n"); + break; + } + printf("ret = %d\n", ret); + fwrite(dstbuf, ret, 1, stderr); + rtsp_msg_free(&msg); + } while (srclen || ret > 0); + srcbuf[srclen] = 0; + printf("srclen = %d\n%s", srclen, srcbuf); + + close(fd); + return 0; +} +#endif + + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_msg.h b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_msg.h new file mode 100644 index 0000000..05608a4 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/rtsp_msg.h @@ -0,0 +1,343 @@ +/************************************************************************* + > File Name: rtsp_msg.h + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Friday, December 11, 2015 AM03:31:53 CST + ************************************************************************/ + +#ifndef __RTSP_MSG_H__ +#define __RTSP_MSG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +//RTSP/1.0 Message Parse/Build + +typedef enum __rtsp_msg_type_e +{ + RTSP_MSG_TYPE_REQUEST = 0, + RTSP_MSG_TYPE_RESPONSE, + RTSP_MSG_TYPE_INTERLEAVED, + RTSP_MSG_TYPE_BUTT, +} rtsp_msg_type_e; + +typedef enum __rtsp_msg_method_e +{ + RTSP_MSG_METHOD_OPTIONS = 0, + RTSP_MSG_METHOD_DESCRIBE, + RTSP_MSG_METHOD_SETUP, + RTSP_MSG_METHOD_PLAY, + RTSP_MSG_METHOD_RECORD, + RTSP_MSG_METHOD_PAUSE, + RTSP_MSG_METHOD_TEARDOWN, + RTSP_MSG_METHOD_ANNOUNCE, + RTSP_MSG_METHOD_SET_PARAMETER, + RTSP_MSG_METHOD_GET_PARAMETER, + RTSP_MSG_METHOD_REDIRECT, + RTSP_MSG_METHOD_BUTT, +} rtsp_msg_method_e; + +typedef enum __rtsp_msg_uri_scheme_e +{ + RTSP_MSG_URI_SCHEME_RTSP = 0, + RTSP_MSG_URI_SCHEME_RTSPU, + RTSP_MSG_URI_SCHEME_BUTT, +} rtsp_msg_uri_scheme_e; + +typedef struct __rtsp_msg_uri_s +{ + rtsp_msg_uri_scheme_e scheme; + uint16_t port; + char ipaddr[32]; + char abspath[64]; +} rtsp_msg_uri_s; + +typedef enum __rtsp_msg_version_e +{ + RTSP_MSG_VERSION_1_0 = 0, + RTSP_MSG_VERSION_BUTT, +} rtsp_msg_version_e; + +typedef struct __rtsp_msg_request_line_s +{ + rtsp_msg_method_e method; + rtsp_msg_uri_s uri; + rtsp_msg_version_e version; +} rtsp_msg_request_line_s; + +typedef struct __rtsp_msg_response_line_s +{ + rtsp_msg_version_e version; + uint32_t status_code; +} rtsp_msg_response_line_s; + +typedef struct __rtsp_msg_interleaved_line_s +{ + uint8_t channel; + uint16_t length; + uint8_t reserved; +} rtsp_msg_interleaved_line_s; + +//CSeq g req. all +typedef struct __rtsp_msg_cseq_s +{ + uint32_t cseq; +} rtsp_msg_cseq_s; + +//Date g opt. all +typedef struct __rtsp_msg_date_s +{ + char http_date[32]; +} rtsp_msg_date_s; + +//Session Rr req. all but SETUP,OPTIONS +typedef struct __rtsp_msg_session_s +{ + uint32_t session; +} rtsp_msg_session_s; + +typedef enum __rtsp_msg_transport_type_e +{ + RTSP_MSG_TRANSPORT_TYPE_RTP_AVP = 0, //RTPoverUDP + RTSP_MSG_TRANSPORT_TYPE_RTP_AVP_TCP, //RTPoverTCP + RTSP_MSG_TRANSPORT_TYPE_BUTT, +} rtsp_msg_transport_type_e; + +//Transport Rr req. SETUP +typedef struct __rtsp_msg_transport_s +{ + rtsp_msg_transport_type_e type; + uint32_t flags; +#define RTSP_MSG_TRANSPORT_FLAG_SSRC (1<<0) +#define RTSP_MSG_TRANSPORT_FLAG_UNICAST (1<<1) +#define RTSP_MSG_TRANSPORT_FLAG_MULTICAST (1<<2) +#define RTSP_MSG_TRANSPORT_FLAG_CLIENT_PORT (1<<3) +#define RTSP_MSG_TRANSPORT_FLAG_SERVER_PORT (1<<4) +#define RTSP_MSG_TRANSPORT_FLAG_INTERLEAVED (1<<5) + uint32_t ssrc; + uint16_t client_port;//rtcp is rtp + 1 + uint16_t server_port; + uint8_t interleaved; +} rtsp_msg_transport_s; + +typedef enum __rtsp_msg_time_type_e +{ + RTSP_MSG_TIME_TYPE_SMPTE = 0, + RTSP_MSG_TIME_TYPE_NPT, + RTSP_MSG_TIME_TYPE_UTC, + RTSP_MSG_TIME_TYPE_BUTT, +} rtsp_msg_time_type_e; + +typedef struct __rtsp_msg_time_smpte_s +{ + //10:07:33:05.01 + uint32_t seconds; //10*3600 + 07*60 + 33 + uint32_t subframes; //05*100 + 01 +} rtsp_msg_time_smpte_s; + +typedef struct __rtsp_msg_time_npt_s +{ + //123.45 + uint32_t secords; //123 + uint32_t usecords; //45 +} rtsp_msg_time_npt_s; + +typedef struct __rtsp_msg_time_utc_s +{ + //19961108T142730.25Z + uint32_t secords; //1996/11/08 14:27:30 - 1900/1/1 0:0:0 + uint32_t usecords; //25 +} rtsp_msg_time_utc_s; + +//Range Rr opt. PLAY,PAUSE,RECORD +typedef struct __rtsp_msg_range_s +{ + rtsp_msg_time_type_e type; + union __start_u { + rtsp_msg_time_smpte_s smpte; + rtsp_msg_time_npt_s npt; + rtsp_msg_time_utc_s utc; + } start; + union __end_u { + rtsp_msg_time_smpte_s smpte; + rtsp_msg_time_npt_s npt; + rtsp_msg_time_utc_s utc; + } end; +} rtsp_msg_range_s; + +typedef enum __rtsp_msg_content_type_e +{ + RTSP_MSG_CONTENT_TYPE_SDP = 0, + RTSP_MSG_CONTENT_TYPE_RTSL, + RTSP_MSG_CONTENT_TYPE_MHEG, + RTSP_MSG_CONTENT_TYPE_BUTT, +} rtsp_msg_content_type_e; + +//Accept R opt. entity +typedef struct __rtsp_msg_accept_s +{ + uint32_t accept; +#define RTSP_MSG_ACCEPT_SDP (1< File Name: stream_queue.c + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Sunday, May 22, 2016 PM10:25:44 CST + ************************************************************************/ + +#include + +#include "comm.h" +#include "stream_queue.h" + +struct stream_queue *streamq_alloc (int pktsiz, int nbpkts) +{ + struct stream_queue *q; + + if (pktsiz <= 0 || nbpkts <= 0) + return NULL; + + q = (struct stream_queue*) calloc(1, sizeof(struct stream_queue) + pktsiz * nbpkts + sizeof(int) * nbpkts); + if (!q) { + err("alloc memory failed for stream_queue\n"); + return NULL; + } + + q->pktsiz = pktsiz; + q->nbpkts = nbpkts; + q->pktlen = (int*)(((char*)q) + sizeof(struct stream_queue)); + q->buf = (char*)(((char*)q) + sizeof(struct stream_queue) + sizeof(int) * nbpkts); + + return q; +} + +int streamq_query (struct stream_queue *q, int index, char **ppacket, int **ppktlen) +{ + if (!q || index >= q->nbpkts) + return -1; + if (ppacket) + *ppacket = q->buf + index * q->pktsiz; + if (ppktlen) + *ppktlen = &q->pktlen[index]; + return 0; +} + +int streamq_inused (struct stream_queue *q, int index) +{ + if (!q) + return -1; + if ((q->head <= index && index < q->tail) || (q->head > q->tail && (index >= q->head || index < q->tail))) + return 1; + return 0; +} + +int streamq_next (struct stream_queue *q, int index) +{ + if (!q) + return -1; + + index = (index + 1) % q->nbpkts; + return index; +} + +int streamq_head (struct stream_queue *q) +{ + if (!q) + return -1; + return q->head; +} + +int streamq_tail (struct stream_queue *q) +{ + if (!q) + return -1; + return q->tail; +} + +int streamq_push (struct stream_queue *q) +{ + if (!q) + return -1; + if ((q->tail + 1) % q->nbpkts == q->head) + return -1; + q->tail = (q->tail + 1) % q->nbpkts; + return q->tail; +} + +int streamq_pop (struct stream_queue *q) +{ + if (!q) + return -1; + if (q->head == q->tail) + return -1; + q->head = (q->head + 1) % q->nbpkts; + return q->head; +} + +void streamq_free (struct stream_queue *q) +{ + if (q) { + free(q); + } +} + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/stream_queue.h b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/stream_queue.h new file mode 100644 index 0000000..1f9aa38 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/stream_queue.h @@ -0,0 +1,38 @@ +/************************************************************************* + > File Name: stream_queue.h + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Sunday, May 22, 2016 PM09:35:22 CST + ************************************************************************/ + +#ifndef __STREAM_QUEUE_H__ +#define __STREAM_QUEUE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct stream_queue { + int pktsiz; + int nbpkts; + int head; + int tail; + int *pktlen; + char *buf; +}; + +struct stream_queue *streamq_alloc (int pktsiz, int nbpkts); +int streamq_query (struct stream_queue *q, int index, char **ppacket, int **ppktlen); +int streamq_inused (struct stream_queue *q, int index); +int streamq_next (struct stream_queue *q, int index); +int streamq_head (struct stream_queue *q); +int streamq_tail (struct stream_queue *q); +int streamq_push (struct stream_queue *q); +int streamq_pop (struct stream_queue *q); +void streamq_free (struct stream_queue *q); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/test.c b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/test.c new file mode 100644 index 0000000..b840e34 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/test.c @@ -0,0 +1,308 @@ +/************************************************************************* + > File Name: test.c + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Saturday, December 12, 2015 PM03:19:12 CST + ************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "comm.h" +#include "rtsp_demo.h" + +#include + +static int flag_run = 1; + +static void sig_proc(int signo) +{ + flag_run = 0; +} + +static int get_next_video_frame (FILE *fp, uint8_t **buff, int *size) +{ + uint8_t szbuf[1024]; + int szlen = 0; + int ret; + if (!(*buff)) { + *buff = (uint8_t*)malloc(2*1024*1024); + if (!(*buff)) + return -1; + } + + *size = 0; + + while ((ret = fread(szbuf + szlen, 1, sizeof(szbuf) - szlen, fp)) > 0) { + int i = 3; + szlen += ret; + while (i < szlen - 3 && !(szbuf[i] == 0 && szbuf[i+1] == 0 && (szbuf[i+2] == 1 || (szbuf[i+2] == 0 && szbuf[i+3] == 1)))) i++; + memcpy(*buff + *size, szbuf, i); + *size += i; + memmove(szbuf, szbuf + i, szlen - i); + szlen -= i; + if (szlen > 3) { + //printf("szlen %d\n", szlen); + fseek(fp, -szlen, SEEK_CUR); + break; + } + } + if (ret > 0) + return *size; + return 0; +} + +static int get_next_audio_frame (FILE *fp, uint8_t **buff, int *size) +{ + int ret; +#define AUDIO_FRAME_SIZE 320 + if (!(*buff)) { + *buff = (uint8_t*)malloc(AUDIO_FRAME_SIZE); + if (!(*buff)) + return -1; + } + + ret = fread(*buff, 1, AUDIO_FRAME_SIZE, fp); + if (ret > 0) { + *size = ret; + return ret; + } + return 0; +} + +#define MAX_SESSION_NUM 64 +#define DEMO_CFG_FILE "demo.cfg" + +struct demo_cfg +{ + int session_count; + struct { + char path[64]; + char video_file[64]; + char audio_file[64]; + } session_cfg[MAX_SESSION_NUM]; +}; + +static int load_cfg(struct demo_cfg *cfg, const char *cfg_file) +{ +//cfgline: path=%s video=%s audio=%s + FILE *fp = fopen(cfg_file, "r"); + char line[256]; + int count = 0; + + if (!fp) { + fprintf(stderr, "open %s failed\n", cfg_file); + return -1; + } + + memset(cfg, 0, sizeof(*cfg)); + while (fgets(line, sizeof(line) - 1, fp)) { + const char *p; + memset(&cfg->session_cfg[count], 0, sizeof(cfg->session_cfg[count])); + + if (line[0] == '#') + continue; + + p = strstr(line, "path="); + if (!p) + continue; + if (sscanf(p, "path=%s", cfg->session_cfg[count].path) != 1) + continue; + if ((p = strstr(line, "video="))) { + if (sscanf(p, "video=%s", cfg->session_cfg[count].video_file) != 1) { + fprintf(stderr, "parse video file failed %s\n", p); + } + } + if ((p = strstr(line, "audio="))) { + if (sscanf(p, "audio=%s", cfg->session_cfg[count].audio_file) != 1) { + fprintf(stderr, "parse audio file failed %s\n", p); + } + } + if (strlen(cfg->session_cfg[count].video_file) || strlen(cfg->session_cfg[count].audio_file)) { + count ++; + } else { + fprintf(stderr, "parse line %s failed\n", line); + } + } + cfg->session_count = count; +/* +path=/live/chn0 video=BarbieGirl.h264 audio=BarbieGirl.alaw +path=/live/chn1 video=BarbieGirl.h264 +path=/live/chn2 audio=BarbieGirl.alaw +*/ + printf("cfg->session_count:%d\n",cfg->session_count);//3 + fclose(fp); + return count; +} + +int main(int argc, char *argv[]) +{ + const char *cfg_file = DEMO_CFG_FILE; + struct demo_cfg cfg; + FILE *fp[MAX_SESSION_NUM][2] = {{NULL}}; + rtsp_demo_handle demo; + rtsp_session_handle session[MAX_SESSION_NUM] = {NULL}; + int session_count = 0; + uint8_t *vbuf = NULL; + uint8_t *abuf = NULL; + uint64_t ts = 0; + int vsize = 0, asize = 0; + int ret, ch; + + if (argc > 1) + cfg_file = argv[1]; + + ret = load_cfg(&cfg, cfg_file); + if (ret < 0) { + fprintf(stderr, "Usage: %s [CFG_FILE]\n", argv[0]); + getchar(); + return 0; + } + + //rtsp_demo usage: + //rtsp_new_demo + //rtsp_new_session ½? + //rtsp_set_video + //rtsp_set_audio + //while(1){ + // rtsp_tx_video + // rtsp_tx_audio + // rtsp_do_event + //} + //rtsp_del_session + //rtsp_del_demo + + demo = rtsp_new_demo(8554);//rtsp sever socket + if (NULL == demo) { + printf("rtsp_new_demo failed\n"); + return 0; + } + + session_count = cfg.session_count;//3rtsp server session fp[ch][0] 64 + + for (ch = 0; ch < session_count; ch++) { + if (strlen(cfg.session_cfg[ch].video_file)) { + fp[ch][0] = fopen(cfg.session_cfg[ch].video_file, "rb");//Ƶļ + if (!fp[ch][0]) { + fprintf(stderr, "open %s failed\n", cfg.session_cfg[ch].video_file); + } + } + + //fp[ch][1] :Ƶļľ + if (strlen(cfg.session_cfg[ch].audio_file)) { + fp[ch][1] = fopen(cfg.session_cfg[ch].audio_file, "rb"); + if (!fp[ch][1]) { + fprintf(stderr, "open %s failed\n", cfg.session_cfg[ch].audio_file); + } + } + + if (fp[ch][0] == NULL && fp[ch][1] == NULL) + continue; + + session[ch] = rtsp_new_session(demo, cfg.session_cfg[ch].path);//Ӧrtsp session + if (NULL == session[ch]) { + printf("rtsp_new_session failed\n"); + continue; + } + + if (fp[ch][0]) {//ǰ·ƵԴ + rtsp_set_video(session[ch], RTSP_CODEC_ID_VIDEO_H264, NULL, 0); + rtsp_sync_video_ts(session[ch], rtsp_get_reltime(), rtsp_get_ntptime()); + } + if (fp[ch][1]) {//ǰ·ƵԴ + rtsp_set_audio(session[ch], RTSP_CODEC_ID_AUDIO_G711A, NULL, 0); + rtsp_sync_audio_ts(session[ch], rtsp_get_reltime(), rtsp_get_ntptime()); + } + + printf("==========> rtsp://127.0.0.1:8554%s for %s %s <===========\n", cfg.session_cfg[ch].path, + fp[ch][0] ? cfg.session_cfg[ch].video_file : "", + fp[ch][1] ? cfg.session_cfg[ch].audio_file : ""); + } + + ts = rtsp_get_reltime(); + signal(SIGINT, sig_proc); + while (flag_run) { + uint8_t type = 0; + + for (ch = 0; ch < session_count; ch++) {//3Դ + if (fp[ch][0]) { + read_video_again: + ret = get_next_video_frame(fp[ch][0], &vbuf, &vsize); + if (ret < 0) { + fprintf(stderr, "get_next_video_frame failed\n"); + flag_run = 0; + break; + } + if (ret == 0) { + fseek(fp[ch][0], 0, SEEK_SET); + if (fp[ch][1]) + fseek(fp[ch][1], 0, SEEK_SET); + goto read_video_again; + } + + if (session[ch])//1Դsession + rtsp_tx_video(session[ch], vbuf, vsize, ts);//2rtsp_client_connect + + type = 0; + if (vbuf[0] == 0 && vbuf[1] == 0 && vbuf[2] == 1) { + type = vbuf[3] & 0x1f; + } + if (vbuf[0] == 0 && vbuf[1] == 0 && vbuf[2] == 0 && vbuf[3] == 1) { + type = vbuf[4] & 0x1f; + } + if (type != 5 && type != 1) + goto read_video_again; + } + + if (fp[ch][1]) { + ret = get_next_audio_frame(fp[ch][1], &abuf, &asize); + if (ret < 0) { + fprintf(stderr, "get_next_audio_frame failed\n"); + break; + } + if (ret == 0) { + fseek(fp[ch][1], 0, SEEK_SET); + if (fp[ch][0]) + fseek(fp[ch][0], 0, SEEK_SET); + continue; + } + if (session[ch]) + rtsp_tx_audio(session[ch], abuf, asize, ts); + } + } + + do { + ret = rtsp_do_event(demo);// + if (ret > 0) + continue; + if (ret < 0) + break; + usleep(20000); + } while (rtsp_get_reltime() - ts < 1000000 / 25); + if (ret < 0) + break; + ts += 1000000 / 25; + printf(".");fflush(stdout);//printfʾ + } + + free(vbuf); + free(abuf); + + for (ch = 0; ch < session_count; ch++) { + if (fp[ch][0]) + fclose(fp[ch][0]); + if (fp[ch][1]) + fclose(fp[ch][1]); + if (session[ch]) + rtsp_del_session(session[ch]); + } + + rtsp_del_demo(demo); + printf("Exit.\n"); + getchar(); + return 0; +} diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/utils.c b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/utils.c new file mode 100644 index 0000000..b318904 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/utils.c @@ -0,0 +1,455 @@ +/************************************************************************* + > File Name: utils.c + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Sunday, May 22, 2016 PM09:35:22 CST + ************************************************************************/ + +#include +#include "comm.h" +#include "utils.h" + +/***************************************************************************** +* b64_encode: Stolen from VLC's http.c. +* Simplified by Michael. +* Fixed edge cases and made it work from data (vs. strings) by Ryan. +*****************************************************************************/ +static char *base64_encode (char *out, int out_size, const uint8_t *in, int in_size) +{ + static const char b64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + char *ret, *dst; + unsigned i_bits = 0; + int i_shift = 0; + int bytes_remaining = in_size; + +#define __UINT_MAX (~0lu) +#define __BASE64_SIZE(x) (((x)+2) / 3 * 4 + 1) +#define __RB32(x) \ + (((uint32_t)((const uint8_t*)(x))[0] << 24) | \ + (((const uint8_t*)(x))[1] << 16) | \ + (((const uint8_t*)(x))[2] << 8) | \ + ((const uint8_t*)(x))[3]) + if (in_size >= __UINT_MAX / 4 || + out_size < __BASE64_SIZE(in_size)) + return NULL; + ret = dst = out; + while (bytes_remaining > 3) { + i_bits = __RB32(in); + in += 3; bytes_remaining -= 3; + *dst++ = b64[ i_bits>>26 ]; + *dst++ = b64[(i_bits>>20) & 0x3F]; + *dst++ = b64[(i_bits>>14) & 0x3F]; + *dst++ = b64[(i_bits>>8 ) & 0x3F]; + } + i_bits = 0; + while (bytes_remaining) { + i_bits = (i_bits << 8) + *in++; + bytes_remaining--; + i_shift += 8; + } + while (i_shift > 0) { + *dst++ = b64[(i_bits << 6 >> i_shift) & 0x3f]; + i_shift -= 6; + } + while ((dst - ret) & 3) + *dst++ = '='; + *dst = '\0'; + + return ret; +} + +const uint8_t *rtsp_find_h264_h265_nalu (const uint8_t *buff, int len, int *size) +{ + const uint8_t *s = NULL; + while (len >= 3) { + if (buff[0] == 0 && buff[1] == 0 && buff[2] == 1) { + if (!s) { + if (len < 4) + return NULL; + s = buff; + } else { + *size = (buff - s); + return s; + } + buff += 3; + len -= 3; + continue; + } + if (len >= 4 && buff[0] == 0 && buff[1] == 0 && buff[2] == 0 && buff[3] == 1) { + if (!s) { + if (len < 5) + return NULL; + s = buff; + } else { + *size = (buff - s); + return s; + } + buff += 4; + len -= 4; + continue; + } + buff ++; + len --; + } + if (!s) + return NULL; + *size = (buff - s + len); + return s; + +} + +const uint8_t *rtsp_find_aac_adts (const uint8_t *buff, int len, int *size) +{ + const uint8_t *s = buff; + while (len > 2) { + if (s[0] == 0xff && (s[1] & 0xf0) == 0xf0) { + break; + } + buff ++; + len --; + } + + if (len <= 2) + return NULL; + + //aac_frame_length + *size = 0; + *size |= (s[3] & 3) << 11; + *size |= (s[4] << 3); + *size |= (s[5] >> 5); + + if (*size > len) + return NULL; + + return s; +} + +int rtsp_codec_data_parse_from_user_h264 (const uint8_t *codec_data, int data_len, struct codec_data_h264 *pst_codec_data) +{ + const uint8_t *s = codec_data; + const uint8_t *frame = NULL; + int len = data_len; + int size = 0; + int ret = 0; + + while (len > 3) { + uint8_t type = 0; + if (pst_codec_data->sps_len > 0 && pst_codec_data->pps_len > 0) { + break; + } + + frame = rtsp_find_h264_h265_nalu(s, len, &size); + if (!frame) { + break; + } + + len = len - (frame - s + size); + s = frame + size; + + if (frame[2] == 0) { + frame += 4; //drop 0001 + size -= 4; + } else { + frame += 3; //drop 001 + size -= 3; + } + + type = frame[0] & 0x1f; + if (type == 7) { + dbg("sps %d\n", size); + if (size > (int)sizeof(pst_codec_data->sps)) + size = sizeof(pst_codec_data->sps); + memcpy(pst_codec_data->sps, frame, size); + pst_codec_data->sps_len = size; + ret ++; + } + if (type == 8) { + dbg("pps %d\n", size); + if (size > (int)sizeof(pst_codec_data->pps)) + size = sizeof(pst_codec_data->pps); + memcpy(pst_codec_data->pps, frame, size); + pst_codec_data->pps_len = size; + ret ++; + } + } + + return (ret >= 2 ? 1 : 0); +} + +int rtsp_codec_data_parse_from_user_h265 (const uint8_t *codec_data, int data_len, struct codec_data_h265 *pst_codec_data) +{ + const uint8_t *s = codec_data; + const uint8_t *frame = NULL; + int len = data_len; + int size = 0; + int ret = 0; + + while (len > 3) { + uint8_t type = 0; + if (pst_codec_data->vps_len > 0 && pst_codec_data->sps_len > 0 && pst_codec_data->pps_len > 0) { + break; + } + + frame = rtsp_find_h264_h265_nalu(s, len, &size); + if (!frame) { + break; + } + + len = len - (frame - s + size); + s = frame + size; + + if (frame[2] == 0) { + frame += 4; //drop 0001 + size -= 4; + } else { + frame += 3; //drop 001 + size -= 3; + } + + type = (frame[0] >> 1) & 0x3f; + if (type == 32) { + dbg("vps %d\n", size); + if (size > (int)sizeof(pst_codec_data->vps)) + size = sizeof(pst_codec_data->vps); + memcpy(pst_codec_data->vps, frame, size); + pst_codec_data->vps_len = size; + ret ++; + } + if (type == 33) { + dbg("sps %d\n", size); + if (size > (int)sizeof(pst_codec_data->sps)) + size = sizeof(pst_codec_data->sps); + memcpy(pst_codec_data->sps, frame, size); + pst_codec_data->sps_len = size; + ret ++; + } + if (type == 34) { + dbg("pps %d\n", size); + if (size > (int)sizeof(pst_codec_data->pps)) + size = sizeof(pst_codec_data->pps); + memcpy(pst_codec_data->pps, frame, size); + pst_codec_data->pps_len = size; + ret ++; + } + } + + return (ret >= 3 ? 1 : 0); +} + +int rtsp_codec_data_parse_from_user_g726 (const uint8_t *codec_data, int data_len, struct codec_data_g726 *pst_codec_data) +{ + int bit_rate; + + if (data_len != sizeof(bit_rate)) { + err("bit rate invalid\n"); + return -1; + } + + bit_rate = *((int*)codec_data); + + switch (bit_rate) { + case 16000: + case 24000: + case 32000: + case 40000: + break; + default: + err("bit rate invalid\n"); + return -1; + } + + pst_codec_data->bit_rate = bit_rate; + return 1; +} + +int rtsp_codec_data_parse_from_user_aac (const uint8_t *codec_data, int data_len, struct codec_data_aac *pst_codec_data) +{ + int sample_rate_index, channels; + const uint32_t sample_rate_tbl[16] = {96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0}; + if (data_len != 2) { + err("audio specific config invalid\n"); + return -1; + } + + sample_rate_index = ((codec_data[0] & 0x7) << 1) | (codec_data[1] >> 7); + channels = (codec_data[1] >> 3) & 0x0f; + + if (sample_rate_index > 12 && channels > 7) { + err("audio specific config invalid\n"); + return -1; + } + + memcpy(pst_codec_data->audio_specific_config, codec_data, data_len); + pst_codec_data->audio_specific_config_len = data_len; + pst_codec_data->sample_rate = sample_rate_tbl[sample_rate_index]; + pst_codec_data->channels = (channels == 7) ? 8 : channels; + dbg("config=%02X%02X sample_rate=%d channels=%d\n", + pst_codec_data->audio_specific_config[0], pst_codec_data->audio_specific_config[1], + sample_rate_tbl[sample_rate_index], channels); + + return 1; +} + +int rtsp_codec_data_parse_from_frame_h264 (const uint8_t *frame, int len, struct codec_data_h264 *pst_codec_data) +{ + return rtsp_codec_data_parse_from_user_h264(frame, len, pst_codec_data); +} + +int rtsp_codec_data_parse_from_frame_h265 (const uint8_t *frame, int len, struct codec_data_h265 *pst_codec_data) +{ + return rtsp_codec_data_parse_from_user_h265(frame, len, pst_codec_data); +} + +int rtsp_codec_data_parse_from_frame_aac (const uint8_t *frame, int len, struct codec_data_aac *pst_codec_data) +{ + int profile, sample_rate_index, channels; + const uint32_t sample_rate_tbl[16] = {96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0}; + int size = 0; + + if (pst_codec_data->audio_specific_config_len > 0) + return 0; + + frame = rtsp_find_aac_adts(frame, len, &size); + if (!frame) { + err("find adts header failed\n"); + return -1; + } + + profile = frame[2] >> 6; + sample_rate_index = (frame[2] >> 2) & 0x0f; + channels = ((frame[2] & 0x1) << 1) | (frame[3] >> 6); + + if (sample_rate_index > 12 && channels > 7) { + err("audio specific config invalid\n"); + return -1; + } + + pst_codec_data->audio_specific_config[0] = ((profile + 1) << 3) | ((sample_rate_index >> 1) & 0x7); + pst_codec_data->audio_specific_config[1] = ((sample_rate_index & 0x1) << 7) | (channels << 3); + pst_codec_data->audio_specific_config_len = 2; + pst_codec_data->sample_rate = sample_rate_tbl[sample_rate_index]; + pst_codec_data->channels = (channels == 7) ? 8 : channels; + dbg("config=%02X%02X sample_rate=%d channels=%d\n", + pst_codec_data->audio_specific_config[0], pst_codec_data->audio_specific_config[1], + sample_rate_tbl[sample_rate_index], channels); + + return 1; +} + +int rtsp_build_sdp_media_attr_h264 (int pt, int sample_rate, const struct codec_data_h264 *pst_codec_data, char *sdpbuf, int maxlen) +{ + char *p = sdpbuf; +// dbg("\n"); + + p += sprintf(p, "m=video 0 RTP/AVP %d\r\n", pt); + p += sprintf(p, "c=IN IP4 0.0.0.0\r\n"); + p += sprintf(p, "a=rtpmap:%d H264/%d\r\n", pt, sample_rate); + if (pst_codec_data->sps_len > 0 && pst_codec_data->pps_len > 0) { + const uint8_t *sps = pst_codec_data->sps; + const uint8_t *pps = pst_codec_data->pps; + int sps_len = pst_codec_data->sps_len; + int pps_len = pst_codec_data->pps_len; + p += sprintf(p, "a=fmtp:%d packetization-mode=1;sprop-parameter-sets=", pt); + base64_encode(p, (maxlen - (p - sdpbuf)), sps, sps_len); + p += strlen(p); + p += sprintf(p, ","); + base64_encode(p, (maxlen - (p - sdpbuf)), pps, pps_len); + p += strlen(p); + p += sprintf(p, "\r\n"); + } else { + p += sprintf(p, "a=fmtp:%d packetization-mode=1\r\n", pt); + } + + return (p - sdpbuf); +} + +int rtsp_build_sdp_media_attr_h265 (int pt, int sample_rate, const struct codec_data_h265 *pst_codec_data, char *sdpbuf, int maxlen) +{ + char *p = sdpbuf; +// dbg("\n"); + + p += sprintf(p, "m=video 0 RTP/AVP %d\r\n", pt); + p += sprintf(p, "c=IN IP4 0.0.0.0\r\n"); + p += sprintf(p, "a=rtpmap:%d H265/%d\r\n", pt, sample_rate); + if (pst_codec_data->vps_len > 0 && pst_codec_data->sps_len > 0 && pst_codec_data->pps_len > 0) { + const uint8_t *vps = pst_codec_data->vps; + const uint8_t *sps = pst_codec_data->sps; + const uint8_t *pps = pst_codec_data->pps; + int vps_len = pst_codec_data->vps_len; + int sps_len = pst_codec_data->sps_len; + int pps_len = pst_codec_data->pps_len; + + p += sprintf(p, "a=fmtp:%d", pt); + p += sprintf(p, " sprop-vps="); + base64_encode(p, (maxlen - (p - sdpbuf)), vps, vps_len); + p += strlen(p); + p += sprintf(p, ";sprop-sps="); + base64_encode(p, (maxlen - (p - sdpbuf)), sps, sps_len); + p += strlen(p); + p += sprintf(p, ";sprop-pps="); + base64_encode(p, (maxlen - (p - sdpbuf)), pps, pps_len); + p += strlen(p); + p += sprintf(p, "\r\n"); + } + + return (p - sdpbuf); +} + +int rtsp_build_sdp_media_attr_g711a (int pt, int sample_rate, char *sdpbuf, int maxlen) +{ + char *p = sdpbuf; +// dbg("\n"); + + p += sprintf(p, "m=audio 0 RTP/AVP %d\r\n", pt); + p += sprintf(p, "c=IN IP4 0.0.0.0\r\n"); + p += sprintf(p, "a=rtpmap:%d PCMA/%d/1\r\n", pt, sample_rate); + + return (p - sdpbuf); +} + +int rtsp_build_sdp_media_attr_g711u (int pt, int sample_rate, char *sdpbuf, int maxlen) +{ + char *p = sdpbuf; +// dbg("\n"); + + p += sprintf(p, "m=audio 0 RTP/AVP %d\r\n", pt); + p += sprintf(p, "c=IN IP4 0.0.0.0\r\n"); + p += sprintf(p, "a=rtpmap:%d PCMU/%d/1\r\n", pt, sample_rate); + + return (p - sdpbuf); +} + +int rtsp_build_sdp_media_attr_g726 (int pt, int sample_rate, const struct codec_data_g726 *pst_codec_data, char *sdpbuf, int maxlen) +{ + char *p = sdpbuf; +// dbg("\n"); + + p += sprintf(p, "m=audio 0 RTP/AVP %d\r\n", pt); + p += sprintf(p, "c=IN IP4 0.0.0.0\r\n"); + p += sprintf(p, "a=rtpmap:%d G726-%d/%d/1\r\n", pt, + pst_codec_data->bit_rate ? pst_codec_data->bit_rate / 1000 : 32, + sample_rate); + + return (p - sdpbuf); +} + +int rtsp_build_sdp_media_attr_aac (int pt, int sample_rate, const struct codec_data_aac *pst_codec_data, char *sdpbuf, int maxlen) +{ + char *p = sdpbuf; +// dbg("\n"); + + p += sprintf(p, "m=audio 0 RTP/AVP %d\r\n", pt); + p += sprintf(p, "c=IN IP4 0.0.0.0\r\n"); + p += sprintf(p, "a=rtpmap:%d MPEG4-GENERIC/%d/%d\r\n", pt, + pst_codec_data->sample_rate ? pst_codec_data->sample_rate : 44100, + pst_codec_data->channels ? pst_codec_data->channels : 2); + + if (pst_codec_data->audio_specific_config_len == 2) { + p += sprintf(p, "a=fmtp:%d profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=%02X%02X\r\n", + pt, pst_codec_data->audio_specific_config[0], pst_codec_data->audio_specific_config[1]); + } else { + p += sprintf(p, "a=fmtp:%d profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3\r\n", pt); + } + return (p - sdpbuf); +} diff --git a/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/utils.h b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/utils.h new file mode 100644 index 0000000..ea21c82 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/rtsp_lib/utils.h @@ -0,0 +1,65 @@ +/************************************************************************* + > File Name: utils.h + > Author: bxq + > Mail: 544177215@qq.com + > Created Time: Sunday, May 22, 2016 PM09:35:22 CST + ************************************************************************/ + +#ifndef __UTILS_H__ +#define __UTILS_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct codec_data_h264 { + uint8_t sps[64]; //no nal leader code 001 + uint8_t pps[64]; + uint32_t sps_len; + uint32_t pps_len; +}; + +struct codec_data_h265 { + uint8_t vps[64]; + uint8_t sps[64]; + uint8_t pps[64]; + uint32_t vps_len; + uint32_t sps_len; + uint32_t pps_len; +}; + +struct codec_data_g726 { + uint32_t bit_rate; +}; + +struct codec_data_aac { + uint8_t audio_specific_config[64]; + uint32_t audio_specific_config_len; + uint32_t sample_rate; + uint32_t channels; +}; + +const uint8_t *rtsp_find_h264_h265_nalu (const uint8_t *buff, int len, int *size); + +int rtsp_codec_data_parse_from_user_h264 (const uint8_t *codec_data, int data_len, struct codec_data_h264 *pst_codec_data); +int rtsp_codec_data_parse_from_user_h265 (const uint8_t *codec_data, int data_len, struct codec_data_h265 *pst_codec_data); +int rtsp_codec_data_parse_from_user_g726 (const uint8_t *codec_data, int data_len, struct codec_data_g726 *pst_codec_data); +int rtsp_codec_data_parse_from_user_aac (const uint8_t *codec_data, int data_len, struct codec_data_aac *pst_codec_data); + +int rtsp_codec_data_parse_from_frame_h264 (const uint8_t *frame, int len, struct codec_data_h264 *pst_codec_data); +int rtsp_codec_data_parse_from_frame_h265 (const uint8_t *frame, int len, struct codec_data_h265 *pst_codec_data); +int rtsp_codec_data_parse_from_frame_aac (const uint8_t *frame, int len, struct codec_data_aac *pst_codec_data); + +int rtsp_build_sdp_media_attr_h264 (int pt, int sample_rate, const struct codec_data_h264 *pst_codec_data, char *sdpbuf, int maxlen); +int rtsp_build_sdp_media_attr_h265 (int pt, int sample_rate, const struct codec_data_h265 *pst_codec_data, char *sdpbuf, int maxlen); +int rtsp_build_sdp_media_attr_g711a (int pt, int sample_rate, char *sdpbuf, int maxlen); +int rtsp_build_sdp_media_attr_g711u (int pt, int sample_rate, char *sdpbuf, int maxlen); +int rtsp_build_sdp_media_attr_g726 (int pt, int sample_rate, const struct codec_data_g726 *pst_codec_data, char *sdpbuf, int maxlen); +int rtsp_build_sdp_media_attr_aac (int pt, int sample_rate, const struct codec_data_aac *pst_codec_data, char *sdpbuf, int maxlen); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/device/mpp/sample/hisi_rtsp_demo-master/sample_venc_rtsp b/device/mpp/sample/hisi_rtsp_demo-master/sample_venc_rtsp new file mode 100644 index 0000000..6899137 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/sample_venc_rtsp differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/sample_venc_rtsp.c b/device/mpp/sample/hisi_rtsp_demo-master/sample_venc_rtsp.c new file mode 100644 index 0000000..5723c82 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/sample_venc_rtsp.c @@ -0,0 +1,792 @@ +/****************************************************************************** + A simple program of Hisilicon HI3531 video encode implementation. + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-2 Created +******************************************************************************/ +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" +#include "rtsp_demo.h" +#include "comm.h" + +#include "loadbmp.h" +#define hi3518ev200 + +int w = 100; +int h = 100; + +VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_NTSC; + +#ifdef hi3518ev201 + +HI_U32 g_u32BlkCnt = 4; +#endif + +#ifdef hi3518ev200 + +HI_U32 g_u32BlkCnt = 4; + +#endif + +#ifdef hi3516cv200 + +HI_U32 g_u32BlkCnt = 10; + +#endif + +typedef struct calc_config +{ + unsigned int x; + unsigned int y; + unsigned int w; + unsigned int h; +}CALC_CONFIG; + +CALC_CONFIG g_config; + +static pthread_t VencPid; + +rtsp_demo_handle g_rtsplive = NULL; +rtsp_session_handle session= NULL; + +/****************************************************************************** +* function : to process abnormal case +******************************************************************************/ +void SAMPLE_VENC_HandleSig(HI_S32 signo) +{ + if (SIGINT == signo || SIGTERM == signo) + { + SAMPLE_COMM_ISP_Stop(); + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram termination abnormally!\033[0;39m\n"); + } + + if(session) + rtsp_del_session(session); + if(g_rtsplive) + rtsp_del_demo(g_rtsplive); + exit(-1); +} + +/****************************************************************************** +* function : to process abnormal case - the case of stream venc +******************************************************************************/ +void SAMPLE_VENC_StreamHandleSig(HI_S32 signo) +{ + + if (SIGINT == signo || SIGTSTP == signo) + { + SAMPLE_COMM_ISP_Stop(); + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram exit abnormally!\033[0;39m\n"); + } + + exit(0); +} + + +/****************************************************************************** +* funciton : get stream from each channels and save them +******************************************************************************/ +HI_VOID* VENC_GetVencStreamProc(HI_VOID *p) +{ + HI_S32 s32Ret = 0; + static int s_LivevencChn = 0,s_LivevencFd=0; + static int s_maxFd = 0; + + fd_set read_fds; + VENC_STREAM_S stVStream; + VENC_CHN_STAT_S stStat; + + s_LivevencChn = 1; + s_LivevencFd = HI_MPI_VENC_GetFd(s_LivevencChn); + s_maxFd = s_maxFd > s_LivevencFd ? s_maxFd:s_LivevencFd; + s_maxFd = s_maxFd+1; + + + //struct sched_param param; + struct timeval TimeoutVal; + VENC_PACK_S *pstPack = NULL; + pstPack = (VENC_PACK_S *)malloc(sizeof(VENC_PACK_S) * 128); + if (NULL == pstPack) + { + pstPack = NULL; + return -1; + } + int i; + + unsigned char* pStremData = NULL; + int nSize = 0; + + while(1) + { + FD_ZERO( &read_fds ); + FD_SET( s_LivevencFd, &read_fds); + + TimeoutVal.tv_sec = 2; + TimeoutVal.tv_usec = 0; + s32Ret = select( s_maxFd, &read_fds, NULL, NULL, &TimeoutVal ); + if (s32Ret <= 0) + { + printf("%s select failed!\n",__FUNCTION__); + sleep(1); + continue; + } + + //Live stream + if (FD_ISSET( s_LivevencFd, &read_fds )) + { + s32Ret = HI_MPI_VENC_Query( s_LivevencChn, &stStat ); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_Query chn[%d] failed with %#x!\n", s_LivevencChn, s32Ret); + continue; + } + + stVStream.pstPack = pstPack; + stVStream.u32PackCount = stStat.u32CurPacks; + s32Ret = HI_MPI_VENC_GetStream( s_LivevencChn, &stVStream, HI_TRUE ); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetStream .. failed with %#x!\n", s32Ret); + continue; + } + + + for (i = 0; i < stVStream.u32PackCount; i++) + { + //ʱȥSEI֡ + if(stVStream.pstPack[i].DataType.enH264EType == H264E_NALU_SEI) continue; + + pStremData = (unsigned char*)stVStream.pstPack[i].pu8Addr+stVStream.pstPack[i].u32Offset; + nSize = stVStream.pstPack[i].u32Len-stVStream.pstPack[i].u32Offset; + + if(g_rtsplive) + { + rtsp_sever_tx_video(g_rtsplive,session,pStremData,nSize,stVStream.pstPack[i].u64PTS); + } + } + + s32Ret = HI_MPI_VENC_ReleaseStream(s_LivevencChn, &stVStream); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_ReleaseStream chn[%d] .. failed with %#x!\n", s_LivevencChn, s32Ret); + stVStream.pstPack = NULL; + continue; + } + } + } + + if(pstPack) free(pstPack); + return NULL; +} + + +int OSD_Handle_Init( RGN_HANDLE RgnHandle, VENC_GRP RgnVencChn) +{ + HI_S32 s32Ret = HI_FAILURE; + RGN_ATTR_S stRgnAttr; + MPP_CHN_S stChn; + VENC_GRP VencGrp; + RGN_CHN_ATTR_S stChnAttr; + + /****************************************** + * step 1: create overlay regions + *****************************************/ + stRgnAttr.enType = OVERLAY_RGN; //region type. + stRgnAttr.unAttr.stOverlay.enPixelFmt = PIXEL_FORMAT_RGB_1555; //format. + stRgnAttr.unAttr.stOverlay.stSize.u32Width = g_config.w; + stRgnAttr.unAttr.stOverlay.stSize.u32Height = g_config.h; + stRgnAttr.unAttr.stOverlay.u32BgColor = 30; + + s32Ret = HI_MPI_RGN_Create(RgnHandle, &stRgnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_Create (%d) failed with %#x!\n", RgnHandle, s32Ret); + return HI_FAILURE; + } + SAMPLE_PRT("create handle:%d success!\n", RgnHandle); + + /*********************************************************** + * step 2: attach created region handle to venc channel. + **********************************************************/ + VencGrp = RgnVencChn; + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = 0;//0; + stChn.s32ChnId = RgnVencChn; + memset(&stChnAttr, 0, sizeof(stChnAttr)); + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAY_RGN; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = g_config.x; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = g_config.y; + stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 50; + stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 128; + stChnAttr.unChnAttr.stOverlayChn.u32Layer = 1; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = HI_FALSE; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp = 0; + s32Ret = HI_MPI_RGN_AttachToChn(RgnHandle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_AttachToChn (%d to %d) failed with %#x!\n", RgnHandle, VencGrp, s32Ret); + return HI_FAILURE; + } + return HI_SUCCESS; +} + +/****************************************************************************** +* function : H.264@1080p@30fps+H.264@VGA@30fps +******************************************************************************/ +HI_S32 SAMPLE_VENC_1080P_CLASSIC(HI_VOID) +{ + PAYLOAD_TYPE_E enPayLoad[3]= {PT_H264, PT_H264,PT_H264}; + PIC_SIZE_E enSize[3] = {PIC_HD1080, PIC_VGA,PIC_QVGA}; + HI_U32 u32Profile = 0; + + VB_CONF_S stVbConf; + SAMPLE_VI_CONFIG_S stViConfig = {0}; + + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + + VENC_CHN VencChn; + SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; + + HI_S32 s32ChnNum=0; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + //char c; + + + /****************************************** + step 1: init sys variable + ******************************************/ + memset(&stVbConf,0,sizeof(VB_CONF_S)); + + SAMPLE_COMM_VI_GetSizeBySensor(&enSize[0]); + if (PIC_HD1080 == enSize[0]) + { + enSize[1] = PIC_VGA; + s32ChnNum = 2; + } + else if (PIC_HD720 == enSize[0]) + { + enSize[1] = PIC_VGA; + enSize[2] = PIC_QVGA; + s32ChnNum = 3; + } + else + { + printf("not support this sensor\n"); + return HI_FAILURE; + } +#ifdef hi3518ev201 + s32ChnNum = 1; +#endif + printf("s32ChnNum = %d\n",s32ChnNum); + + stVbConf.u32MaxPoolCnt = 128; + + /*video buffer*/ + if(s32ChnNum >= 1) + { + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = g_u32BlkCnt; + } + if(s32ChnNum >= 2) + { + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt =g_u32BlkCnt; + } + if(s32ChnNum >= 3) + { + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[2], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[2].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[2].u32BlkCnt = g_u32BlkCnt; + } + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_VENC_1080P_CLASSIC_0; + } + + /****************************************** + step 3: start vi dev & chn to capture + ******************************************/ + stViConfig.enViMode = SENSOR_TYPE; + stViConfig.enRotate = ROTATE_NONE; + stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; + stViConfig.enViChnSet = VI_CHN_SET_NORMAL; + stViConfig.enWDRMode = WDR_MODE_NONE; + s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + + /****************************************** + step 4: start vpss and vi bind vpss + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + if(s32ChnNum >= 1) + { + VpssGrp = 0; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_2; + } + + s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Vi bind Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_3; + } + + VpssChn = 0; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; + memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + } + + if(s32ChnNum >= 2) + { + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[1], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + VpssChn = 1; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + } + + + if(s32ChnNum >= 3) + { + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[2], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + VpssChn = 2; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + } + /****************************************** + step 5: start stream venc + ******************************************/ + enRcMode = SAMPLE_RC_CBR; + + /*** enSize[0] **/ + if(s32ChnNum >= 1) + { + VpssGrp = 0; + VpssChn = 0; + VencChn = 0; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[0],\ + gs_enNorm, enSize[0], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + } + + /*** enSize[1] **/ + if(s32ChnNum >= 2) + { + VpssChn = 1; + VencChn = 1; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[1], \ + gs_enNorm, enSize[1], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + } + /*** enSize[2] **/ + if(s32ChnNum >= 3) + { + VpssChn = 2; + VencChn = 2; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[2], \ + gs_enNorm, enSize[2], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + } + /****************************************** + step 6: stream venc process -- get stream, then save it to file. + ******************************************/ + + pthread_create(&VencPid, 0, VENC_GetVencStreamProc, NULL); + + //Create osd + OSD_Handle_Init(1,1); + + +#if 0 + s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } +#endif + printf("please press twice ENTER to exit this sample\n"); + + return 0; + + /****************************************** + step 7: exit process + ******************************************/ + SAMPLE_COMM_VENC_StopGetStream(); + +END_VENC_1080P_CLASSIC_5: + + VpssGrp = 0; + switch(s32ChnNum) + { + case 3: + VpssChn = 2; + VencChn = 2; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + case 2: + VpssChn = 1; + VencChn = 1; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + case 1: + VpssChn = 0; + VencChn = 0; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + break; + + } + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); + +END_VENC_1080P_CLASSIC_4: //vpss stop + + VpssGrp = 0; + switch(s32ChnNum) + { + case 3: + VpssChn = 2; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + case 2: + VpssChn = 1; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + case 1: + VpssChn = 0; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + break; + + } + +END_VENC_1080P_CLASSIC_3: //vpss stop + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_1080P_CLASSIC_2: //vpss stop + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_VENC_1080P_CLASSIC_1: //vi stop + SAMPLE_COMM_VI_StopVi(&stViConfig); +END_VENC_1080P_CLASSIC_0: //system exit + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +void WriteConfig(unsigned int x,unsigned int y,unsigned int w,unsigned int h) +{ + //system("rm -rf /home/config"); + //FILE *fp = fopen("/home/config", "wb"); + g_config.x = x; + g_config.y = y; + g_config.w = w; + g_config.h = h; + //fwrite(&g_config,sizeof(CALC_CONFIG),1,fp); + //fflush(fp); + //fclose(fp); +} + +int GetConfig() +{ + printf("%s %d \n",__FUNCTION__,__LINE__); + + if (0 == access("/home/config", F_OK)) + { + printf("%s %d \n",__FUNCTION__,__LINE__); + FILE *fp = fopen("/home/config", "r"); + if (fp == NULL) { + goto Configdefault; + } + printf("%s %d \n",__FUNCTION__,__LINE__); + fread(&g_config, sizeof(CALC_CONFIG), 1, fp); + fclose(fp); + } + else + goto Configdefault; + + + if(g_config.x > 640 || (g_config.x + g_config.w) > 640) + goto Configdefault; + + if(g_config.y > 480 || (g_config.y + g_config.h) > 480) + goto Configdefault; + + if(g_config.w == 0 || g_config.h == 0 ) + goto Configdefault; + + return 0; + +Configdefault: + printf("%s %d \n",__FUNCTION__,__LINE__); + WriteConfig(0,0,0,0); + return -1; +} + +void init_isp(void) +{ + ISP_DEV IspDev = 0; + ISP_EXPOSURE_ATTR_S stExpAttr; + HI_MPI_ISP_GetExposureAttr(IspDev, &stExpAttr); + + stExpAttr.stAuto.stAGainRange.u32Min = 1024; + stExpAttr.stAuto.stAGainRange.u32Max= 4096; + + stExpAttr.stAuto.stDGainRange.u32Min = 1024; + stExpAttr.stAuto.stDGainRange.u32Max = 2048; + + stExpAttr.stAuto.stISPDGainRange.u32Min = 1024; + stExpAttr.stAuto.stISPDGainRange.u32Max = 2048; + + stExpAttr.stAuto.stSysGainRange.u32Min = 1024; + stExpAttr.stAuto.stSysGainRange.u32Max = 8192; + + stExpAttr.stAuto.u16EVBias = 900; + + HI_MPI_ISP_SetExposureAttr(IspDev, &stExpAttr); +} +/****************************************************************************** +* function : main() +* Description : video venc sample +******************************************************************************/ +int main(int argc, char *argv[]) +{ + HI_S32 s32Ret = 0; + signal(SIGINT, SAMPLE_VENC_HandleSig); + signal(SIGTERM, SAMPLE_VENC_HandleSig); + + GetConfig(); + + printf("%d,%d,%d,%d\n",g_config.x,g_config.y,g_config.w,g_config.h); + + + g_rtsplive = create_rtsp_demo(5544); + session= create_rtsp_session(g_rtsplive,"/live.sdp"); + + + s32Ret = SAMPLE_VENC_1080P_CLASSIC(); + init_isp(); + + + int x = 0; + + MPP_CHN_S stChn; + RGN_CHN_ATTR_S stChnAttr; + + char chCmd[256]; + int flag = 0; + +#if 0 + system("killall -9 calcy_vpsschndump"); + sprintf(chCmd,"/home/calcy_vpsschndump %d %d %d %d &",g_config.x,g_config.y,g_config.w,g_config.h); + printf("%s\n",chCmd); + system(chCmd); +#endif + + while(1) + { + flag = 0; + /* + switch(getchar()) + { + case 'w': + if(g_config.y >= 2) + g_config.y -=2; + + flag = 1; + break; + case 'a': + if(g_config.x >= 2) + g_config.x -=2; + flag = 1; + break; + case 'd': + flag = 1; + if(g_config.x <= 640-g_config.w) + g_config.x +=2; + break; + case 's': + flag = 1; + if(g_config.y <= 480-g_config.h) + g_config.y +=2; + break; + case 'k': + printf("killall calcy_vpsschndump\n"); + WriteConfig(g_config.x,g_config.y,g_config.w,g_config.h); + system("killall -9 calcy_vpsschndump"); + sprintf(chCmd,"/home/calcy_vpsschndump %d %d %d %d &",g_config.x,g_config.y,g_config.w,g_config.h); + printf("%s\n",chCmd); + system(chCmd); + break; + default: + flag = 0; + continue; + + }*/ + if(flag == 0 ) + continue; + + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = 0;//0; + stChn.s32ChnId = 1; + + s32Ret = HI_MPI_RGN_GetDisplayAttr(1,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_GetDisplayAttr failed with %#x!\n",s32Ret); + continue; + //return HI_FAILURE; + } + + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = g_config.x; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = g_config.y; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(1,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_SetDisplayAttr failed with %#x!\n", s32Ret); + continue; + //return HI_FAILURE; + } + printf("stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X:%d \n",stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X); + //sleep(1); + } + exit(s32Ret); +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/sample_venc_rtsp.c~ b/device/mpp/sample/hisi_rtsp_demo-master/sample_venc_rtsp.c~ new file mode 100644 index 0000000..f916a68 --- /dev/null +++ b/device/mpp/sample/hisi_rtsp_demo-master/sample_venc_rtsp.c~ @@ -0,0 +1,791 @@ +/****************************************************************************** + A simple program of Hisilicon HI3531 video encode implementation. + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-2 Created +******************************************************************************/ +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" +#include "rtsp_demo.h" +#include "comm.h" + +#include "loadbmp.h" +#define hi3518ev200 + +int w = 100; +int h = 100; + +VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_NTSC; + +#ifdef hi3518ev201 + +HI_U32 g_u32BlkCnt = 4; +#endif + +#ifdef hi3518ev200 + +HI_U32 g_u32BlkCnt = 4; + +#endif + +#ifdef hi3516cv200 + +HI_U32 g_u32BlkCnt = 10; + +#endif + +typedef struct calc_config +{ + unsigned int x; + unsigned int y; + unsigned int w; + unsigned int h; +}CALC_CONFIG; + +CALC_CONFIG g_config; + +static pthread_t VencPid; + +rtsp_demo_handle g_rtsplive = NULL; +rtsp_session_handle session= NULL; + +/****************************************************************************** +* function : to process abnormal case +******************************************************************************/ +void SAMPLE_VENC_HandleSig(HI_S32 signo) +{ + if (SIGINT == signo || SIGTERM == signo) + { + SAMPLE_COMM_ISP_Stop(); + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram termination abnormally!\033[0;39m\n"); + } + + if(session) + rtsp_del_session(session); + if(g_rtsplive) + rtsp_del_demo(g_rtsplive); + exit(-1); +} + +/****************************************************************************** +* function : to process abnormal case - the case of stream venc +******************************************************************************/ +void SAMPLE_VENC_StreamHandleSig(HI_S32 signo) +{ + + if (SIGINT == signo || SIGTSTP == signo) + { + SAMPLE_COMM_ISP_Stop(); + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram exit abnormally!\033[0;39m\n"); + } + + exit(0); +} + + +/****************************************************************************** +* funciton : get stream from each channels and save them +******************************************************************************/ +HI_VOID* VENC_GetVencStreamProc(HI_VOID *p) +{ + HI_S32 s32Ret = 0; + static int s_LivevencChn = 0,s_LivevencFd=0; + static int s_maxFd = 0; + + fd_set read_fds; + VENC_STREAM_S stVStream; + VENC_CHN_STAT_S stStat; + + s_LivevencChn = 1; + s_LivevencFd = HI_MPI_VENC_GetFd(s_LivevencChn); + s_maxFd = s_maxFd > s_LivevencFd ? s_maxFd:s_LivevencFd; + s_maxFd = s_maxFd+1; + + + //struct sched_param param; + struct timeval TimeoutVal; + VENC_PACK_S *pstPack = NULL; + pstPack = (VENC_PACK_S *)malloc(sizeof(VENC_PACK_S) * 128); + if (NULL == pstPack) + { + pstPack = NULL; + return -1; + } + int i; + + unsigned char* pStremData = NULL; + int nSize = 0; + + while(1) + { + FD_ZERO( &read_fds ); + FD_SET( s_LivevencFd, &read_fds); + + TimeoutVal.tv_sec = 2; + TimeoutVal.tv_usec = 0; + s32Ret = select( s_maxFd, &read_fds, NULL, NULL, &TimeoutVal ); + if (s32Ret <= 0) + { + printf("%s select failed!\n",__FUNCTION__); + sleep(1); + continue; + } + + //Live stream + if (FD_ISSET( s_LivevencFd, &read_fds )) + { + s32Ret = HI_MPI_VENC_Query( s_LivevencChn, &stStat ); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_Query chn[%d] failed with %#x!\n", s_LivevencChn, s32Ret); + continue; + } + + stVStream.pstPack = pstPack; + stVStream.u32PackCount = stStat.u32CurPacks; + s32Ret = HI_MPI_VENC_GetStream( s_LivevencChn, &stVStream, HI_TRUE ); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetStream .. failed with %#x!\n", s32Ret); + continue; + } + + + for (i = 0; i < stVStream.u32PackCount; i++) + { + //ʱȥSEI֡ + if(stVStream.pstPack[i].DataType.enH264EType == H264E_NALU_SEI) continue; + + pStremData = (unsigned char*)stVStream.pstPack[i].pu8Addr+stVStream.pstPack[i].u32Offset; + nSize = stVStream.pstPack[i].u32Len-stVStream.pstPack[i].u32Offset; + + if(g_rtsplive) + { + rtsp_sever_tx_video(g_rtsplive,session,pStremData,nSize,stVStream.pstPack[i].u64PTS); + } + } + + s32Ret = HI_MPI_VENC_ReleaseStream(s_LivevencChn, &stVStream); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_ReleaseStream chn[%d] .. failed with %#x!\n", s_LivevencChn, s32Ret); + stVStream.pstPack = NULL; + continue; + } + } + } + + if(pstPack) free(pstPack); + return NULL; +} + + +int OSD_Handle_Init( RGN_HANDLE RgnHandle, VENC_GRP RgnVencChn) +{ + HI_S32 s32Ret = HI_FAILURE; + RGN_ATTR_S stRgnAttr; + MPP_CHN_S stChn; + VENC_GRP VencGrp; + RGN_CHN_ATTR_S stChnAttr; + + /****************************************** + * step 1: create overlay regions + *****************************************/ + stRgnAttr.enType = OVERLAY_RGN; //region type. + stRgnAttr.unAttr.stOverlay.enPixelFmt = PIXEL_FORMAT_RGB_1555; //format. + stRgnAttr.unAttr.stOverlay.stSize.u32Width = g_config.w; + stRgnAttr.unAttr.stOverlay.stSize.u32Height = g_config.h; + stRgnAttr.unAttr.stOverlay.u32BgColor = 30; + + s32Ret = HI_MPI_RGN_Create(RgnHandle, &stRgnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_Create (%d) failed with %#x!\n", RgnHandle, s32Ret); + return HI_FAILURE; + } + SAMPLE_PRT("create handle:%d success!\n", RgnHandle); + + /*********************************************************** + * step 2: attach created region handle to venc channel. + **********************************************************/ + VencGrp = RgnVencChn; + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = 0;//0; + stChn.s32ChnId = RgnVencChn; + memset(&stChnAttr, 0, sizeof(stChnAttr)); + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAY_RGN; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = g_config.x; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = g_config.y; + stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 50; + stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 128; + stChnAttr.unChnAttr.stOverlayChn.u32Layer = 1; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = HI_FALSE; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp = 0; + s32Ret = HI_MPI_RGN_AttachToChn(RgnHandle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_AttachToChn (%d to %d) failed with %#x!\n", RgnHandle, VencGrp, s32Ret); + return HI_FAILURE; + } + return HI_SUCCESS; +} + +/****************************************************************************** +* function : H.264@1080p@30fps+H.264@VGA@30fps +******************************************************************************/ +HI_S32 SAMPLE_VENC_1080P_CLASSIC(HI_VOID) +{ + PAYLOAD_TYPE_E enPayLoad[3]= {PT_H264, PT_H264,PT_H264}; + PIC_SIZE_E enSize[3] = {PIC_HD1080, PIC_VGA,PIC_QVGA}; + HI_U32 u32Profile = 0; + + VB_CONF_S stVbConf; + SAMPLE_VI_CONFIG_S stViConfig = {0}; + + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + + VENC_CHN VencChn; + SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; + + HI_S32 s32ChnNum=0; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + //char c; + + + /****************************************** + step 1: init sys variable + ******************************************/ + memset(&stVbConf,0,sizeof(VB_CONF_S)); + + SAMPLE_COMM_VI_GetSizeBySensor(&enSize[0]); + if (PIC_HD1080 == enSize[0]) + { + enSize[1] = PIC_VGA; + s32ChnNum = 2; + } + else if (PIC_HD720 == enSize[0]) + { + enSize[1] = PIC_VGA; + enSize[2] = PIC_QVGA; + s32ChnNum = 3; + } + else + { + printf("not support this sensor\n"); + return HI_FAILURE; + } +#ifdef hi3518ev201 + s32ChnNum = 1; +#endif + printf("s32ChnNum = %d\n",s32ChnNum); + + stVbConf.u32MaxPoolCnt = 128; + + /*video buffer*/ + if(s32ChnNum >= 1) + { + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = g_u32BlkCnt; + } + if(s32ChnNum >= 2) + { + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt =g_u32BlkCnt; + } + if(s32ChnNum >= 3) + { + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[2], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[2].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[2].u32BlkCnt = g_u32BlkCnt; + } + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_VENC_1080P_CLASSIC_0; + } + + /****************************************** + step 3: start vi dev & chn to capture + ******************************************/ + stViConfig.enViMode = SENSOR_TYPE; + stViConfig.enRotate = ROTATE_NONE; + stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; + stViConfig.enViChnSet = VI_CHN_SET_NORMAL; + stViConfig.enWDRMode = WDR_MODE_NONE; + s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + + /****************************************** + step 4: start vpss and vi bind vpss + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + if(s32ChnNum >= 1) + { + VpssGrp = 0; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_2; + } + + s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Vi bind Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_3; + } + + VpssChn = 0; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; + memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + } + + if(s32ChnNum >= 2) + { + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[1], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + VpssChn = 1; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + } + + + if(s32ChnNum >= 3) + { + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[2], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + VpssChn = 2; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + } + /****************************************** + step 5: start stream venc + ******************************************/ + enRcMode = SAMPLE_RC_CBR; + + /*** enSize[0] **/ + if(s32ChnNum >= 1) + { + VpssGrp = 0; + VpssChn = 0; + VencChn = 0; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[0],\ + gs_enNorm, enSize[0], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + } + + /*** enSize[1] **/ + if(s32ChnNum >= 2) + { + VpssChn = 1; + VencChn = 1; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[1], \ + gs_enNorm, enSize[1], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + } + /*** enSize[2] **/ + if(s32ChnNum >= 3) + { + VpssChn = 2; + VencChn = 2; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[2], \ + gs_enNorm, enSize[2], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + } + /****************************************** + step 6: stream venc process -- get stream, then save it to file. + ******************************************/ + + pthread_create(&VencPid, 0, VENC_GetVencStreamProc, NULL); + + //Create osd + OSD_Handle_Init(1,1); + + +#if 0 + s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } +#endif + printf("please press twice ENTER to exit this sample\n"); + + return 0; + + /****************************************** + step 7: exit process + ******************************************/ + SAMPLE_COMM_VENC_StopGetStream(); + +END_VENC_1080P_CLASSIC_5: + + VpssGrp = 0; + switch(s32ChnNum) + { + case 3: + VpssChn = 2; + VencChn = 2; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + case 2: + VpssChn = 1; + VencChn = 1; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + case 1: + VpssChn = 0; + VencChn = 0; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + break; + + } + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); + +END_VENC_1080P_CLASSIC_4: //vpss stop + + VpssGrp = 0; + switch(s32ChnNum) + { + case 3: + VpssChn = 2; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + case 2: + VpssChn = 1; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + case 1: + VpssChn = 0; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + break; + + } + +END_VENC_1080P_CLASSIC_3: //vpss stop + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_1080P_CLASSIC_2: //vpss stop + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_VENC_1080P_CLASSIC_1: //vi stop + SAMPLE_COMM_VI_StopVi(&stViConfig); +END_VENC_1080P_CLASSIC_0: //system exit + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +void WriteConfig(unsigned int x,unsigned int y,unsigned int w,unsigned int h) +{ + //system("rm -rf /home/config"); + //FILE *fp = fopen("/home/config", "wb"); + g_config.x = x; + g_config.y = y; + g_config.w = w; + g_config.h = h; + //fwrite(&g_config,sizeof(CALC_CONFIG),1,fp); + //fflush(fp); + //fclose(fp); +} + +int GetConfig() +{ + printf("%s %d \n",__FUNCTION__,__LINE__); + + if (0 == access("/home/config", F_OK)) + { + printf("%s %d \n",__FUNCTION__,__LINE__); + FILE *fp = fopen("/home/config", "r"); + if (fp == NULL) { + goto Configdefault; + } + printf("%s %d \n",__FUNCTION__,__LINE__); + fread(&g_config, sizeof(CALC_CONFIG), 1, fp); + fclose(fp); + } + else + goto Configdefault; + + + if(g_config.x > 640 || (g_config.x + g_config.w) > 640) + goto Configdefault; + + if(g_config.y > 480 || (g_config.y + g_config.h) > 480) + goto Configdefault; + + if(g_config.w == 0 || g_config.h == 0 ) + goto Configdefault; + + return 0; + +Configdefault: + printf("%s %d \n",__FUNCTION__,__LINE__); + WriteConfig(0,0,0,0); + return -1; +} + +void init_isp(void) +{ + ISP_DEV IspDev = 0; + ISP_EXPOSURE_ATTR_S stExpAttr; + HI_MPI_ISP_GetExposureAttr(IspDev, &stExpAttr); + + stExpAttr.stAuto.stAGainRange.u32Min = 1024; + stExpAttr.stAuto.stAGainRange.u32Max= 4096; + + stExpAttr.stAuto.stDGainRange.u32Min = 1024; + stExpAttr.stAuto.stDGainRange.u32Max = 2048; + + stExpAttr.stAuto.stISPDGainRange.u32Min = 1024; + stExpAttr.stAuto.stISPDGainRange.u32Max = 2048; + + stExpAttr.stAuto.stSysGainRange.u32Min = 1024; + stExpAttr.stAuto.stSysGainRange.u32Max = 8192; + + stExpAttr.stAuto.u16EVBias = 900; + + HI_MPI_ISP_SetExposureAttr(IspDev, &stExpAttr); +} +/****************************************************************************** +* function : main() +* Description : video venc sample +******************************************************************************/ +int main(int argc, char *argv[]) +{ + HI_S32 s32Ret = 0; + signal(SIGINT, SAMPLE_VENC_HandleSig); + signal(SIGTERM, SAMPLE_VENC_HandleSig); + + GetConfig(); + + printf("%d,%d,%d,%d\n",g_config.x,g_config.y,g_config.w,g_config.h); + + + g_rtsplive = create_rtsp_demo(554); + session= create_rtsp_session(g_rtsplive,"/live.sdp"); + + + s32Ret = SAMPLE_VENC_1080P_CLASSIC(); + init_isp(); + + + int x = 0; + + MPP_CHN_S stChn; + RGN_CHN_ATTR_S stChnAttr; + + char chCmd[256]; + int flag = 0; + +#if 0 + system("killall -9 calcy_vpsschndump"); + sprintf(chCmd,"/home/calcy_vpsschndump %d %d %d %d &",g_config.x,g_config.y,g_config.w,g_config.h); + printf("%s\n",chCmd); + system(chCmd); +#endif + + while(1) + { + flag = 0; + switch(getchar()) + { + case 'w': + if(g_config.y >= 2) + g_config.y -=2; + + flag = 1; + break; + case 'a': + if(g_config.x >= 2) + g_config.x -=2; + flag = 1; + break; + case 'd': + flag = 1; + if(g_config.x <= 640-g_config.w) + g_config.x +=2; + break; + case 's': + flag = 1; + if(g_config.y <= 480-g_config.h) + g_config.y +=2; + break; + case 'k': + printf("killall calcy_vpsschndump\n"); + WriteConfig(g_config.x,g_config.y,g_config.w,g_config.h); + system("killall -9 calcy_vpsschndump"); + sprintf(chCmd,"/home/calcy_vpsschndump %d %d %d %d &",g_config.x,g_config.y,g_config.w,g_config.h); + printf("%s\n",chCmd); + system(chCmd); + break; + default: + flag = 0; + continue; + + } + if(flag == 0 ) + continue; + + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = 0;//0; + stChn.s32ChnId = 1; + + s32Ret = HI_MPI_RGN_GetDisplayAttr(1,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_GetDisplayAttr failed with %#x!\n",s32Ret); + continue; + //return HI_FAILURE; + } + + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = g_config.x; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = g_config.y; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(1,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_SetDisplayAttr failed with %#x!\n", s32Ret); + continue; + //return HI_FAILURE; + } + printf("stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X:%d \n",stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X); + //sleep(1); + } + exit(s32Ret); +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.IAB b/device/mpp/sample/hisi_rtsp_demo-master/si/si.IAB new file mode 100644 index 0000000..c4a49e0 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.IAB differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.IAD b/device/mpp/sample/hisi_rtsp_demo-master/si/si.IAD new file mode 100644 index 0000000..f9fefb2 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.IAD differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.IMB b/device/mpp/sample/hisi_rtsp_demo-master/si/si.IMB new file mode 100644 index 0000000..7c64351 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.IMB differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.IMD b/device/mpp/sample/hisi_rtsp_demo-master/si/si.IMD new file mode 100644 index 0000000..579bf54 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.IMD differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.PFI b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PFI new file mode 100644 index 0000000..68d5dde Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PFI differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.PO b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PO new file mode 100644 index 0000000..b1bb875 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PO differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.PR b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PR new file mode 100644 index 0000000..8289598 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PR differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.PRI b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PRI new file mode 100644 index 0000000..454c8c9 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PRI differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.PS b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PS new file mode 100644 index 0000000..f62b807 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.PS differ diff --git a/device/mpp/sample/hisi_rtsp_demo-master/si/si.WK3 b/device/mpp/sample/hisi_rtsp_demo-master/si/si.WK3 new file mode 100644 index 0000000..63ee8c6 Binary files /dev/null and b/device/mpp/sample/hisi_rtsp_demo-master/si/si.WK3 differ diff --git a/device/mpp/sample/ive/Makefile b/device/mpp/sample/ive/Makefile new file mode 100644 index 0000000..65f6b87 --- /dev/null +++ b/device/mpp/sample/ive/Makefile @@ -0,0 +1,41 @@ +# Hisilicon Hi3516 sample Makefile + +include ../Makefile.param +#ifeq ($(SAMPLE_PARAM_FILE), ) +# SAMPLE_PARAM_FILE:=../Makefile.param +# include $(SAMPLE_PARAM_FILE) +#endif + + +# target source +INC := ./sample/ +SRC := $(wildcard *.c) +IVE_SAMPLE_SRC := $(wildcard sample/*.c) +OBJ := $(SRC:%.c=%.o) +IVE_SAMPLE_OBJ := $(IVE_SAMPLE_SRC:%.c=%.o) +TARGET := $(OBJ:%.o=%) +.PHONY : clean all + +all: $(TARGET) + + +#MPI_LIBS += $(REL_LIB)/libmpi.a +#MPI_LIBS += $(REL_LIB)/libhdmi.a + + +$(TARGET):%:%.o $(COMM_OBJ) $(IVE_SAMPLE_OBJ) + $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ -I$(INC) $(MPI_LIBS) $(AUDIO_LIBA) $(SENSOR_LIBS) $(HVD_LIBS) $(MPI_LIBS) + +clean: + @echo "$(CFLAGS)" + @echo "$(IVE_SAMPLE_OBJ)" + @rm -f $(TARGET) + @echo $(OBJ) + @rm -f $(OBJ) + @rm -f $(COMM_OBJ) + @rm -f $(IVE_SAMPLE_OBJ) +cleanstream: + @rm -f *.h264 + @rm -f *.jpg + @rm -f *.mjp + @rm -f *.mp4 diff --git a/device/mpp/sample/ive/data/input/ann/ann_char_rec.bin b/device/mpp/sample/ive/data/input/ann/ann_char_rec.bin new file mode 100644 index 0000000..873872b Binary files /dev/null and b/device/mpp/sample/ive/data/input/ann/ann_char_rec.bin differ diff --git a/device/mpp/sample/ive/data/input/platelocation/car_0.bgr b/device/mpp/sample/ive/data/input/platelocation/car_0.bgr new file mode 100644 index 0000000..0a3e96d --- /dev/null +++ b/device/mpp/sample/ive/data/input/platelocation/car_0.bgr @@ -0,0 +1,3 @@ +()-,-1&'+"#'+-.,..35624578<86?:79OHKUELUBKTCNB3;G;ALBHE>C=7<605"#'()-+,0*+/ "&689,..356./0./3117C?EJFL?;A;6DJDHKEJLFKRKPLFKLFKTNSSMRTNSRLQKGLEFJRSWVW[UVZWX\PX\TZ]UX\ZUZ\UZb_a\[]]\^`^`bacfcejbdmdglcfjadphjucjzkosdfoccoffsmnwrtvqspkmpkmkfhplkqmlxtsuqpwsrpppoookkkppp|||}||x~xty|x~~{}tvwlll|||||||||yyy~~~~~}}{yy~~{yy~|~zv{}|~}|~~~~{zy}wz}}~x~hz|l~t}y|}y}~}{xvwuzxxvv~tutututustsuvtuuvvwwzr|pz}w~}}|x~x~~sz|~|}~z~|}{}{uutsyxut}{y}zs}zzx|t}yxxtzwu}{zxxwvz||q{r}n|t~~}}|{~{z}}}~{}{}uw}vy}vy~wz|ux|xxvrqplkvrqwsrxyqrststqrxgjyhoukqsnsjfkoinnfmg_fd[brjqiahe`ea]ba]bc_db^c`^`WZYb__fZ`iU\jQ[XQXXRWPKMOJKJEFVSUVORRBIN;DN=HPAIJ>DJ@FE>C<6;GAF*+/'(,./3*+/,-1156.32166489@CG46;CAGA?E=;ADBHECIIEJHDIGCHD@EHDIKGLOKPQMRPLRPLQNLPJKOOPTRSWNOSVW[SZ]UY]XUZYRW`U[dac]\^a`ba`bedfifhlcflbeh_bpgjtknrbil\`l_aqggtjjnhitoqtoqwrt~y{snpqlmwrstopwrsvprxxxvvvooolllxxx~{}|~~{}|y{}upr|~~}~}~||||||~~~}}}}}~||~~|zz|~{ttt||}nvu}{y}x}{}{}y~ecjzuy|x~~}{{yywzxxvv~ttssrtsvusrwwvvwwxxy{u|ovnumtovw~x{|~y}|u|yy{|Ý~}~~ur}pmyv~|{v|x|x~yzv|~wzz{}s}q~wvwxvwvzy|{xt}~}y~}~~~}vy}|}zqt~zy|xw|xw}yx{zwxqrstprqryhk|jqxnt~x}jchpjomel|jbitlshahf`ec]bc]be_dd^cb^aYTWe]`bV\dT\cQYXQXXRWVQS^YZUPQTQSRKNXHOR?HVEPRCKTHNMCIYRWBA>DB@FFCIFBGGCHFBGHDIIDJOKPPLQOJOOKPPLQPOSOPTPQUSTXXY]WX\TY\VW[XSX\TZfX^`\^^\^bacRQSSRTQNPibepilhadicfkdgzjqseisgineerjjuopqlnuprtoqxsutoqtopwrspjkz{xstlllbbbrrrtttzzzzwy{xz~{}|~{~}z}}w{totz||wx~}|zyyyy}}}}}}|||zzz~~~|zz}~z|utxrqs|~}~~iomvyjgk}w{zv~}|z|z~|xvxvt~q}zyvvsyv}|||xyuuvvxyz~zuzuzuzx|z~{w{ns~u|~wũ~||~|z|z{y|z}{{{{xz~~~x~yxxwxy|x{{~~|}~|}{|y|tw{~~{z|{~}~zy|{{|tu{klopyzradxelymsxrwpjotjpodlpemnckmaig\dhafe^cd]be^cd]bd[abWZdX_bU]_SZdWa_X_]W\KFHQLMSNOWTVJCFUELYFOTDNN?GK?ELBH=6;938:49"#'-.2015()-$%)',-*0/5:;056/47:>B228>>DGHNDDJCCIBAECBFBAE>=AFEINNRNMQJJMKJNNNQPOSKLPKLPXY]WX\RSWTW\ZY\\UZcV\eU\b]_\[]bacUTVdcea^`d]`mfih`djbflehwjooaeujlqhiqmlqlmqlnsnptoqxsusnptoqwrtojlz||wyzzztttuuuwwwzzz}{z~||~~{yx{wxxqtz}z}{~}zuv}|||||||||||zz{yyrvz}}}|y|~~y{{y|l}klwwxvt~}{yzxltjmuku}srzm}yzuwszvzzxv~}|{zxz{}~}y|vwx{z{y|{}}~{}zv~}w{~}~z~z}y~z{{{{{{{~vwxx~wxy}|z{|||~|}yzrv}vzqu|}yxyutyuttpoyklrs{|opuvxfijrxkqkdiibgqgmrgovksshpqfndZbjafe^cd]be^cd^bf\bbQXfW]f[b_Wa`Xd^W^^X]MHJ]XYSNOPNPMFIWGNUBKRALL=EJ>DRHNE>CGAFF@E"()-./3()-,-1)./(0/2;;/8829<:>B;;A77=65;IIO==CGFJHGKGFJEDHGFJONRNMQJIMKJNPOSPOSKLPJKOYZ^TVZRSWVVZ]X^`X^fX^hU\`[]XWY_^`_^`a`b[Y[e`bhceeabhcelgiwiowlotikpkjrnlqlmsnpsnptoqwrtrlnxsuytvojlnik}xzzzzoooxxx{{{zzz}{{}}ywwzuvwzy|wzvy{~{~yrs}{z~{{{~~~|zz~~}}~~}}|~qy{yyy|{}|~wyy|~x{}|~{}}}}|~}~w{|uvutqozzxyw~|{y|zxtyuzvwszv{{vu~{zyy|~z||z|vyy{y{xzz}~z|t}~~~~}{w}|~zy}z|}z~{|{{{yz}}|yy~x~x}w~xy~}}zz{w}~~z~|~~|}yzvzz~txvzx|rnmrnmyut{wvuqptuopzjk{klpqqt~hp|ntpinqjo{ntyltwjrpcki\dxjrkagh^dg]cg]ch]dk^dzdltdlh]g`Zc^\fZSZVPU^Y[LGH[VWLIKUNQ^NUVCLSBMM>FJ>DNDJ>7<@:?=7<)*.)*.()-'(-:;?288#-+088099;BE7C?CHKNS@DI?BGIHLJIMHGKGFJJJNLLPNMQLLPIHLQPTOOSWWZVVYUUYSSWVWZWVZ^Z_b[aeW]iX_c^`XXZbacihja_bgehlgigbdd_agbdmhjn`glbenhhniisonsnovqsuprtoqwrtpkm|v|{vzzuzidhf`fpppqqqwww}}}zzz|zz~||~~~||yww{}|y|x{y|{~w}zqt}wx~zzz}}}pppzzz~~yww}{||}|~tzy~}y~~|~~~suz~y~}~~|~~|{gcwvtvwwzzywuowmiqghofoyjzvr{mwszuywwu}{|y|z~}}|}}||{zz{{{uwvxprp}z~~}yx~x{}yv{|z{|{{{{yzz|w~x~x}w~xy{~||w|z~}}{~{|~}}{|y}x|}||yutzwvzwvyvuststrsxhisdezilhqzlrumrtlqxkqpdltfonbinbjrfmlbhh^dg]cf]cg^dl_eoZbn]fdZd^Yd^^i]V][UZc^`UPQ]YYPMOZSVYIPYGOWFPSDLJ>EQHNKDID>CCA8BF7BC;?AEHLJNS=?G88;C9=B@356/12(*,35613443399976898::9=99?9;C;?CCFJHLM@DEJGIOLNROQSPRPMONNSKNSMLRLLRSQW][_WRTVNWZR]^Va^X]Z\]^`a_abY[\`bbWb`[cbbdd```glkmrqmhifablgiqkpslskgmvrwxuwpnnrppxstpklz{wrsupqrppvxxjppnvutzyxxxxz{ru}svx{|~~z}~wz|ux{}}y|{~z}y~{vxytu~}~~~~~~|~~xzz~xrx{~xxt~w~sw~{~|{z{y{z~ziwep~lzvyuztz|y}w{s}{{{|{}|z~x}{|z~|~}}}z~|~~z~~~z}zzwzv{rn{w}~~z{|}{~ys}z~}}y~}|vx|y|mywx}y~}z{wz{~{vw~xy~{}y~uxz}{xzvtw}xxzxxwwwwyyrttztuxzzrsuopxstrmnvottnr}sywlrxioyltxlrofikeflghvnobZ[f`ae`aiggc_`aYYldeg^ae]bf[a`WZ^WZ^WZ]XZYWY[UXVPRTMPUNQRKNNGJXSUPKMMHJOJLD?A8:;8:;.0179:5788::0229;<;=>=>B==FHGM@AEFHIIJKGEE<::><46779:6895786;:387489:>?=@D;>CA@IBBHDEIDFHHJKMKKKIIWUUMKKPNN[Z^LMSMMSNNTAEJYZ_[TZh`kaWg[R`\T`SUVRTUUWX^`a^`aQ\Z[cb^``aaajonotsjefgbchcemglohojfluqvurtussvttzuvsno{vw}xyytuusstvvjpojrqlrqvvvxtxytyvrw}{x}u{u{x~x~{}z}z~}|zz~||~~~~|~}|y{z}}}~yxq|x~~~~|||~}}~z{|xzvxtxt}y|smuoys{u~xx|}{{{{|wx}{|z~|~~{}mo~}}|zzzyvutpzx~{|x}~~z|~~}~}}~x~||~}z}}vtwhyx|z~}}~||~}~~xyz|}z|zwy|~}~~|~|~{xz}|~xz{qstystvxxpquoppkl{vw|ztytnrwmswjp|nvu{ynqtlmoij}uulddb]\jfegediedf_\mcci\^hZ^jY\dY\aX[aXZ\UXYTVRKN^WZVORZSV[TWJCFPKMRMOQLNQLNKFH),-13479:68:79<=BA2870776;<;?B7:@A@ICCICEICEFKMNIIIIHHQOOPNNPNNTRVKIOIHNUU[QTYWX^]U^`Xd`Vg`WfbYd\_`_`aZ\]ddf[]^T^]\cbdffeeeaeehlkqlmkfgnikqkopiopnsuqvnkmvtsuttvssuqrrnosnoupqtqqmnnqwvryxw}|zzzyx~}zyx~yv|}{w}~s{xxy{{}yuwy|||~~yxx~|||~|y{~{vwsnp}x|}~}{}~}~|{{{|y|}x|}yxutpxt{wqlqkwq|v~xxx|yyy{|~ux}{{z~|~}|~d~f~~}~z~xxyzw~|ttm}||}~{{}}}~}|~~~~z~|~{~}z|}qptdxy}}}~}}~|}~}{~|}wy{}}~z~{~~z|{z|{|~~y}|x~xwzyztux|vw~uv~vvxsssnnytvzupuslqwmsukqyjruglynqumntlnwoongce`]jgcec`hebia_k`agZ\iX\iVZfZ]eY\bX[`W\ZTXQJNaZ\]VZWPS[UYPJLMHJQLNSNPQLNNIK*/016749<9=BGKQ;>C+89+69D>CI@F?@D@?DFEHDCGFDIJHL=GGDKKRUVPMOSMPRHNQGNOIPPPVSW\PSZWR^WS_YT__\e^[b`]`^[]dacfceheg[]^[_`dfgdbdfcflilommonmommljjspqorropqnqrqrtjmnswxmrsqrsyxzrmoxsuiggsqqwvvyxx}{{~x~{~y~{vpvztuz|~wzx|{{y}~{~z}}}|zzz~~vvv~|{{||zz|||{|||uw~qvu|~~}{||rx|yyww|zqyzowpvpxrvptrsroo{vz{z}wzsw|q}qsuzy{y||w}xw}y~z~~nq}~~~}{z{vu|w|w|~{yu||~~{x{{|sk|~||~}st}}{||z{|~~}}~}~}}}|||ux}x~~{z{~{v}ytv{}}yz~~z}y|y{y{tv|~|~xzy{}~wqr}~}~~xy~xz|zzyxyvxxwuq}zu}y|vrxpl|uqtmotmpvotsmrrjqwjrxktyltwjryltulonfgmghgcc_]]dabhaef]bg[`aTZk\chX\fVZgW^fX`J>GcOYYIQ^R[RUZNVZQX[^WZMFIOHKNFJPHL045,01/268;@HJRBFEIDCGGFJIHLHRREJKDHITQSZUWk]ecW_[TZYV\RVZST\VR^WS_ROX]Zc_]c_\^daclikb_adac]abchieijbdeefgjhkhffommussjhh{yypnpjikrqsrqsrprtwxostsuv|{}uprrmoqoorppwuuwuuwuuz|{|wrt}wstz||~{uz|w|}xz|~|}}~{w{{yy}|z||||}~|~|~~~w~|xyw~|x}{zz~ty~{}sy{ow~oupwqxt|wrorqxr|vzy}wzsxzpy|mquvy|}~uztzx~y{yx~{~{~qt~y}|}~zzyz~|x~z}~y}~{zvx|}~~{xzzt|~}|~|~|}{{~}z}|{y{zrxz||~|~}~|}{|x{zu|z{v}}{r~|}{vw}}vywzz}{}y{{}|}{uv{|}xy}xy{yyzzzyxxwvrqniplgysn}tpztptnosmnqjorkprjqwkqxlrymswkqymsrilldeicdkfg`^^dbbhbfh^dfZ`\PVdV\jY]kZ^hX_UFNOALdQZUDMYOWJJPBINKRU\WYPKMMHJHDFGBD489/34259>BFFHP;GK"99+=>?:@B;@GFJDCGGFJFEIJIMJIMIQQEJKAEFTRTYVX[KS[JV[NYVOYTR[UV^\Xe^Zeb_hVTZ\Z``]_b_adacb_ab_a^efemmcij`decgheghmkkommomma__qoopoqigiooqrqsutvstuqst|{}olnytvtoqsqqrppwuuwuuwuuzuw{}~y{{}xsu~yz{|}|~x~|}xz}~{{}|~~w~{s~{y}|~}}}x}|~}|}{xzz~|wyy~t|xz~|w|~qztxrxr|v|kxhxtyy{u|v|vzsz{t|~rtxtx{~~tvx}{z~zz~y}{~{~~~vzy{}~~}{y|}v|y|~~~t{twwz{~}yzy|~}v|~}~|~{z}zw~xr{|t}uxz||||}~|}{|~}u~xyu|~|q{t}|}|x{vw}~ytv|~x{{~|tvy{wx{|~xyz{{||zzyyyzxturmwsnxrm~uqzsotnosmnslowpu{tywkqxlrymswkqymsmdfmefmghhcd_]]caaibgj`fl`fpdji[alZ^n]aeU\o`hbT_bRZ]OWVMTPOU>CH>CFXSUQLNSMONHJJEG1348:;<=A@?ECBK5CF#==2GHGGJD>CFGKBCGMNR?@DEGKCEINSVLOSDGKQPTTOUTCMYGR_P[ZR\YV^UR[ZVa[WadbiYW^]\`_\^c`bc`bdacd`b_gg_jj]ggbjjhmnfjkmkkommjhhkiiussxtvmhjmikrmotprqoqsqsqnplikxvxmkktrryww{yy|zzxstupq}~}xyxst{yy|zz|~wuw}{xz|~|~{xzzxz|z||~~y}u}{zzvpq~}x}|{|zxyw}~|uwwzzz~{s~{zz~}||{v~x|xxpmwgjtd|wsp{u|vzt|v|v{ty~v{zzwz|{}y}||{|{|}~z{|}yzs|uz|~{}z{y~pusxy~w|tzxz|~~yx{|{}y}}y|~}{z|xs~vpyxyz{|{|}~|}{|}}{s}|{z~z{uzxm{|||ju~~{|yz|}}~|~|~tvz|}~}~ytu|vw}xy}{{|zzwtpxupvrm{up|soysnwrquporknpilkdjwloxmpynqwloynqvnotlmlfgjffdbbljjg`ei_enbhocifX^m\`m\`\LTgX`cU`eX`YMUSMTSQWNPULOSIFHEBDMJLJGIHEG366;>>=>B77=87@0<@(AA0DEEGKHBGGJNVVZUUYHIMLMQHIMILRJMRFFLLLRSQWYHT`MZ^N[[R][VaTO[ZW`YV_WU[TSW^]a[XZb_afdfpmodacbjjbmmeoolttbghdhiljjqookiiljjtrrpilvorunqngjslosmoytv|vxoln~{}wsuxvv{yy}{{xvv|zzxst{vw|wxxst{vwzxx~||~{}{~y~|~{xz~{}}z||~z~v~|~~xstyy}~xvu~}}{zrpo{}vwu|y{|~xzz}~v||}~~pqh~y{}~uzuws|rnufbl\towrxrysztztysys}vz{zvt{s|x|}~{}z{xxyzyz{{wxwxwxxzwxxxxx}wu{||~vzx}{y~tytyy~||}}{}}~}}|~}}~wv~}}|||{yt{~zzyy{|{|z{{|xzz~{~w}r|v{}{}|{{vuzykwr}sx|}yy}}~vw~~xz}{~}~~~yqr|vwyz|}~~wtpwtozvq{up}tp{upxspxsr|vwyruvorynqynqvknxmpvkntlmqijmghmhicaakiif_de[al`fdX^rdjiX\udhjZacT\`R]_U][T[YRYQNTLKQMMQJGIKHJPMOLIKMJL)(*/.020486<96?29=0AC4DEKJNPMRGLOPSW;>BDGKQTXFIMPPUNNTGHMLLRXX^]MZXGTREQVOZPMXXXbVR\eci^]acbfdcd]Z\fcejgigdfebdellpxxu||`efdhigjjigghffqoohffpnnpgjwnqwnqqhkvmpypstmpnhjpkmzwyvuwuss|zz{yyvtt{yy{wv}|~zyuqpyut~|||||~}}|{{z|utv|{}{}z~s~{vvv~}~~~z~}~~|y{~|x}|{wvz~y}}tul|y}wtzorzow|msxilrdvpvqwqwqxrxrxrys}v{~~t{yo~qzr}yxyx|{}z|xzyzxzwxxvxvvuyxxvuuuxzyv||y{vzv{x|}xzwz{~~y~x}y||}~~|}~}~}~{~}~|~zz~~~~~{t}~}z{{{{vxvxvwvxuv~x~{|v|pzp{w}vzz{{upp}uw|s|||~}}z{rmnz|}~}{|yz|}{vwz{yz||{|wtpwtoyup{up}tp{upxsqxtpxsrxrsxqt}rtwlnynpynpvkmoghoghnhhmhicaafddhaff\bg[adX^qcijY]r`dhX^^OW\NY[T[XTZURWTPVPLROLQQPRNMOLKMGFH@?A435879;:>86<96??=C;DG1<>?9;@:?<5<7/9:8>GHL=>B@AEFGKNMQKHJFCENLRHHNDFNDMZLUbLUbRZhV_lW_pYbsVao^dscap`Zf\Yb`Z`hafdacgij]abdfggdfkdglcfgchlbhmcibildknokpngjvorpjlwpspilnrmqtvttt~yz{ruzqtwpsvqsroqrppqrp|}{vvvvvxzy}yzzuttvxvyzvy|utus}}}zzztttxxx||||~}z|{}~yyyysxx}~|y{~~}~|zrw~|||||~~~~ttt~yz~{}~w~{~~|zy~yzwrzz}tyzz}tzqvryjwqvqprproslpkpjplmqrqrqrturvnrosswtxyu~~p|tspyt|yyw}yh{fr}t{svrus|vwyxpxp{}y{zx~~|}y|xv}wuvtyw{y}xqx|~{w~~{~}}~}~~}|}w~~zx{yv~u}}p~~r}y~xwzovxw}lv|s|uvpyqwszju|mu|mrvjx|pw{owz~rzrxrurtqxrzqzn{p|qynyn{rtvvvvptt|wrvttrutu{x{jhh~wz}{}~}ru||~z|~z{wqryzyzyzw}x|wyz||pp{pn|ttxpptpnxtsvrq{lp{lprbf{lp{lpoijojkoijqijodfjabjdejdejdejdeiddlaceZ]g\^bWZbWZ_Y^YUZ^Z_VRVVRWVRWTPUTPUHGKPPTHKO724>9;@:?;4;7/986<@AE89=EFJ<=A76:NKMMJLNLRNNTLNVEP^OZhNYgP[hS^lZbsWarTbpajwilwhfq^[d_X_f_db_aacdZ^_^`agdfibelbfeafi_ekag_fiX_bjfkqjmslotmpunqkdg~prvztvfhhtrrxorxorwpsvqsvsuvttttrxywrrrutvxw{txyrvutzwtztx~ywxw|}}yyyyyy{{{~~}~y{z|{}~yyzyx|w{yyuss}}}}xyy|||}}z|~~~~z|yt{|}|zzxxx}~zwws~~|}{wxv}~||zw~{~}{~v{z}zxxzy|s{ori{~u~rzho`uot~nrqopmolpjpjppqpqmnnpxyuwoqrstuvxxrw|szko|lxs{xrpwszxtv~vyuvt}w{sy~vxp{s}{|v{w{w{~}|wx~}|yzxvwuyw{y}{|vq{~{}}|y{~|}|z~~v~|tzy|||~yys~rxv~zxwvwmw}|xztx~tx~my{rzsvpw~qxr|w~xryl{yw|qy}rztyrupvurqupxqzpynzoyn{pxotwvvvpurz}tu~qrrpw}v~}~{~y|x{~{{||}}{}xy{uv}~z{yst|vwyzyzw}wzy{~vv|zzzrryqqxxzrrptyjnl]azjn{lpsmnqlmrlmrjkndfk`bldeldelcdldemefjadcZ]f]`d[^bY\\V[SOT`\aZV[XTYVRVTPVUQVLJNNNRHKO724>9;@:?A:AD8=@9@D>B=<@CBF?>BEBGQNPQNPKIOVV\WYaOZhZesJUcLWeP[i\bqU]lZdq_jtUZccdnc`id]dg`eebdSUVZ^_bdepmod]`jadgchsioukqelocjmlhmohkqjmngjslowps~su|hkypqy~~tuvxpszqt}vyspr}{{tuswxvrrr}|~vuyruzwz{puuwzy}||~||~||yww~||}{{|~~y{ytvzuwwto}|yr{t~~~~z{~~z{wyzx}~sprqnp}{yy|zz}~~~|{tyw|~|~}xw|}}~upritul{}tq~ruypxprorpqrnplpostutunopqvwxunzj~yivf|ts}}otzlyi~~{ws{yxxy|zzz~x~vzzxz{|x|twy|}}}||}zzuspnxv~|ztw{}}{{y{z|rty{|z~wzzzzzyy{||zy|}y|~y{|}{xuxwwzzxxyw{|ttxtzx}{{}{z|}t~vz~u{ytrurxs{wv{rw{tzupvkx~sx~spvlu{pwvxwxwktjxsn~lvvpqsqxrylx~kyl~qzsv|sywyqxp}txozorpsvtvxtolu~t{}yps|vxz}|||{{}}~xy|}~{||}yz}~{|rkpunqz{zut|wtojixpp|rrtt~pqzkovgkptximyjnsmnlghkefphimbdncencencenceodfnbdpjka[\\WXhbcb\]^X\WSX\X][W\VRXVRWUQVSOTMLPKLPILP613@:D@FGCHGCHD@EEAFKGLNLNPMOTRXPPVOQYNXcYanJS^IQ^NWcacqOTaSZeKS^JOY\_fa^gg`gg`elikfhi_cddfflike^ag^ahdjf\bndjahk^ehqmrohkpilsloohkqjmwpp|knystmutinmunqvy}pmosqqttruvtwww~|{xx|~||}zyyuvv||{|{|z{~uprz|~y{{vxwxr|}yw~w~|||}{}|}{}|zz{}{}{}~|{}}~}}~yzy~|{~}~}~{z{{{xz~{}uzwp{|tq}|n~rzpzpwrrqoppqoqrtrsrsopqrtvzur|lz~xq|lzqsr|p|}|qmxv||}{zyz}xwywy~xy}tzq{svzyzzy|}|~||{zyuspnxv}{}{}~|zvz~~~}zzy}{|||}~}~~~y{{}}|~}yz~||zyw~w~w~z~||}}{}|~|z|~{~{~~~|{|yyvxyxyxxzxzvxmnwcluayn{pwvwyxxxw{x~yxv}xxvr}qsmztwpv~m|r|wnzvo|wqwlx~sx~slrgu{pttwxttnyovpq~lsronq~lvn~n}m}n}np|tzsunx~wxyv~sxxxwwrvy{~}~~}xuw}~usuor{~z}~zzss}qqxxvvz{|}|}~|||}vpqqkl||z{tnswrt}~wrs{wv{xtupozrr~qqrsqrptptrvyjn|lpmghmhiicdrjkrgilacncencencej_apfhrmlkfdfa`c^]^YX]Y[XTY\X][W\VRWUQVUQVTPUTSWOPTILP724>8:=7<=6=80:?;AEAFIEJIEJLHMPLQMJLHEGHFLYY_FHPKS\RXbIRZHNXKS[^]jPN\Z\gZ_hdfn^]fb_hhahhafgdfY[\\`aeghkhjqjmulo{w|youpfllsv\cfnjorlnohktmpqjmwps{uvruxstnywoutxqtypsyru|wynkmommstryzx||||{}zy}}w~x}vqv{|{|{|{|}~zvxqlnvqs|~~y{zzt~~x}y~|~~}{{}~}}}~mnjz|z|}}}~z}}{{~~~x}{}}~||~twuuxvz~~|v}x}{zxzxprph}{sq||nrzpzpvqtqsrqrprrtrsrspqrsrs|txpy|txp{qsrz}n{xu}~wuyuxvwysvqwvuv{ww~vwyuv}qwnzptv~u}uw{u~x|xywyxxvtromvtvtvt}y~|z|w|u}~{|~~{z|yx{y|z}{}z|zxz}}xz|}~}zxzyyyzz~z~w||~y|zz|~{~{~|zzxvt}}|z~|}yvt|zoynu}n|{v|svv{}s|wtst~wwt{jy}ms{v~mzq}vytotly~uy~vlphx}tp}up}un{sv{|uotnrosquoxn|mqq}n~pwp}vzt~x|vuvwuywxx|wx~|||vsu}}~~||}xx~~{{zzz{z{|}~||~xyxrswqrz{}wxxsxxuwywwvtsyxtxsryqqstrsstquximn_czko~nrsmnpklicdoghtikrgipcepcepcej]_sfh_[[d`_b^]hdc`\[^\^YUZ\X][W\WSXVRWVRWUQVRQUNOSILP825?;<@:?A:A?9AHBHGAFD>CJDJMGLNINNJMJHKJHNTUZJKSKPTKMSMRVLOUPTY\WcQLZXZcXZdccl\Zbb_ig`gf_difh_`abfggijhegd]`pgjpkptkqxotcjlX_bkhlvosohkwpsunqqknuqquw{vvoyxs{y|ux}twzsv|wyyuvzxxzzyy{yrqqrrs{y|v|x}|tx~~{|{|{|~xy~|~{}~x{{}gbd{zu}|vy~z|zz{yyzxx}{{~xyz|y{}}}{|}z|}~}}~~}}{v|qvsx~uyvn}zq~|tpqu{o{ps~msrvtsrprtvpqqqqrssqqw~st|r|r~t~s~p~q{txt~y}tq}xwu}wzvwtstqtvr~x{wnzfzss|qwnzprt|r|swys{txtxtwvuturpmpnnkomzw{zzzuzv{{y~}|zz|yy{y|z}{{yzwvwy{{|}}~{yx}x}w}w~z{}x~}yzx|}}}z~~}|~z{yvu}||y|{xvzow}rwkv|lv{jtrrrxynwququtv~m~s|px{kr}tzq{q~wwqx}t{wrxninew|suzq|tty~zzqxquoxq|rppsrpo{t|vzt|xzv{|ptt|p}qqt{zs~}z|z|xsvy||~}xy~~{{|}|||||||ztuyz{uvyz}wxvsv~}~vvttsowsrummxystst~qtwhltei{lpquvopqlmtopwopqfhodfoceoceocej^`oce^\Web^_\XWTPZXSa]_[V[]X]\X\XSXVQVWRWUQVGFJHILJLP>4:@8>;6;><@>=@BBFDEH::>DEHJJNJJNGGOJIPNKTOKTSLVJPURJRWPWOOUXMUZV[NPUKOSUX\]`e^_ckglgdhd_d`\ab^ceeihgkiejlfklfkphmnhjdhgali^hkeirnhpqkqslquloulowqnwv}vswqojeax{tmsyrwxqvyqw{tw|xw|xwzvu}|wrr}xws~~zzz|z|xz|wx|{{|}}y{{yzz~}|{~|~y{xxx}}}z{{xxx~}}}z{~~~|||zz~~~~~v||}{|xyw~{w}y~r~|q|xmzppyjrzpr}hv|ppynyyvwqskpk~mi|kootso}mghZutfnk]~p|o}ryqmwfxpwpvpw}nqzjwnxdvkz|lrjxzvx|yqyvrurswtyswmy~kss~s{rxq{voyrivddr`upvrursqwvvuxqun~}worwtzvzvxst{~zz||zyy|x}z||{xywyxzy{vxvxwx}z}z{w|v}w||~~~~~}|v}|vvxy~~||}}}}}}~}}zxwxxw|vytyv~{vxstwttt~pp~~n~tzqzr~lyutmlaq_zwupztvivuxw}y~usxox}t}yxyp|~u{|sz|s}|nq|qzoutt{owooyyzs~w{u{y~w~~pqtvvwwt~x~|zwv}{}}}{~|}}z~~}xyz{~}|}}xyyzvw{qryy~}unn|||qqxqqsqpnji}uu}rrstussxuuz{tmnwnovloyoryorvknujntjmh`ckcfldgiadc[^[VS]XT^YV[VSZURf\_cX^bV\`U[WLR[RXTSWSRVVUVSSSQPQ<6;C@E?C?@DPPVLLRLJPOKQRKRNMQZJQ[QWPRVWQVFBG_`dVW[VW[\^b__cb^cd`dc_db^cWSXffjdcgrnslfklfktjpqlmjomkvsmvzns|gbklioqkprknuknvqpuqotonytsgbarno{xzroqspr|y{~|||{~zywsr|{uqpzwo~zuxrm}}zztvuxyz~zz~~z||vxx|zzy|z}|~|~}{{|||}}}~~~|||}{{~||}}~~|zz~||~z{y~z}{{~{~}}zss|x}yv~uu|yp~xppzlrerh|syt|zo{opqprosnpmocsbk{jrozzlxxjtseqtu{js}ls}lzsvos}lzrv}nxooxdoxdp{quxsqsmw{vv}zruossrr}mxo{pss~s{rxqz|xy~xuowquqqokjypxoypzq}tvzy{vxyxzx~y||zxyz~z}z~z{zyzxyxyxyxxxyxz}z}z{w|v}wyy{}}{~x|v{u|~}z||zxzv|z{wtxt}~p}q{|l~qvyixywxsylxfxruowurzp{x{vy~x{w}{wx}tw|sx|~ty{r}v{}trq|r|srsz~rv{luy{hn}{~ryy|wvx|vxuwu|}r{}~wz~rv~}uuxx|~uw~{}z|{|~xzwrqxx}}zzyoovv{yykiiwrsnhh{stwloxnpvknshkrgjpgjjcfg`ckdgjcfjcfgba_ZY`[Z^YXe`_e\_e[a_U[^TZaW]PINONRLKOWVXZZZTTT??E=?D7:?=>BPPVHHNMKRPLRTLT\SU\JNaWZQUVVTV[W\WVZONRZY]YX\edhd`ed`eiejhdiYUZgfj]\`rnslfklfkrhnqlmkpnhspbkofktvs|tpvtmrsnptmptopuoqwrsxrt{uwpnnstsrsrqqqyzz{yyzvu{wvwsr{wv}~yz}}zz|}~yzywwtuu{}}|~~~~~~~z}~|~z|{{{|||}}}zzz~~~|zz}}}}x{y~|tqs|y}|rzyo}{q}}nzmzpxpoygrxmrzpssvwqskomolnsrsrtqwzkyykzzl~ptvq{jr|kwpyrzsoyiq|lnxgs~jozfq}qv{rtvpw{vt{vp~tm~qo{noymyq}stt~t{sysu~w~w{uvpysvstretczq{rzqxo|svxvxwv{x}z|~~y||z~xyzz}z}z{zyzwywxvwwxxyzz}z}z{w|v}wzz|||}{y}~~z|}|xywut~xpzuyzx|xn{xx~}o~prtvmvewppziuuq|uz{}}}{z}xuzq}ysxouzq{ww~wywo|uzxpt}qzr{s}pr|t~v{|lyyfz}ms}pwunxm{wxwwxwvxw~~r|~~vz~{~xmp~}|}}|}{|}~vxwwzyrjjww~~~vvpnmsonwoo}sstt{yymkkwrsjde{stxmpxmpujmqfiqfinehslolehjcfhadf_bd^_a[\_YZ]WXd^_aX\h^dh^d^SYbX^\UZUTXQPTVUWZZZSSS02:79B:F?@EDEICDHFGKGHLLLPNOSGHLNMQTPVRLR_PTaIN[PSW[]WZ[ONRUTXSRV[Z^[Z^__c`\aXTYsottpuWSXhgkcbfd`elfkmglrhnojkdiggrobkoinwut}usytqvwrtvrtsrrrppsrrusr{zz{yywuu}}vttxvvtrr{wv}yx{z}yx}yxy~~x~|w{z|{|wx|}}wy|zzvvvuwwz||zzz}}}~z}~y||~|~~|||||~~~}}}|||{{{~||}{{~}~~~~{{}}}~|zy{fkb}xypzxp~v~~p~qvlwnr|kw}rt|rxxturtlpoqlnutsrq~nx}nz}nqq~pwnr|kxqyrs}l}upr}mivcr~jzrssu{pwzqvztqxskxpgwljvjoyl}u|rvv}uztzw~quypzsyqxrwqzvurxxzxwwvvzqyxxwur}x~y~z~{|tq}z~{zyyy}x}z||{xy|z{z|{{z{y|{}z}zzv}w|vxy|{{}wz}{{uz}w~z~~z~~{t|w}zm~lxwvqxrw}rx~jyztsm{z{~s~tv}rz~rtqzismupr~rsvxywu~}zx}y{wtypuzqw|sww|t|t{uynyzs|qu|u}uv{{m~~nswvuw|}~|vvxyzyxw{o~}|}~~tz}~|~~vv|qs{|{|xy|~zzwwxxtt~vv{yx|{|tt|rr}qqvttsqqzuvvpq|tuzorzorxmpvkntilsjmjcfohkf_bc\_d]`icdgaba[\]XX`Z[]W\`Y^\VZ]V[WPU^X]TSWRQUONPWWWPPP46>36>22:@>GA=F?>D;<@=>BEFJJKOGHLHJKHJJSRTYVX[WXeORuX]dWYPYWU\[ONRWSXb^c^Z_c_da]b^Z`ZV[`\ac_d_[`hhlpossotnhmmglsioqlmlqoepmfospu~tr{rrxwrxvtvytvprtpqsqstpprrtvolltpoxsrvrq|xvxtr{wv|xwqmlwsr}yx}y|~x~z|yx}||}zyx~~~}}yyy}}}~~||{~z}||~|~}}~~~|||}}}||||||}}~||}~|~|x{yv{r{yy{{{n{oq~hums}muzpqrprnrprnpqponq~ny~ox}n|p{{m{zlu}lvot~myrq{jwpozjtovn}utsv{qx|pz~xwx~znyor|pys|tuwx|u{wt~qt}syrys{uzxuwvzwyyxyvxu{y}z{zzytr~~zy~{~{~yyy~z}z}z|{yz~}{zzzzy|{zy}z|y}y|v|vxy|{~z~|vys~x~x|~~y{}wuoxun~luv}{ztvz||xrys~x{uzu{tuxl}{p}}q{rs~lwrvuwuuszwr|nmsgrymtypy~u{wx}ttypww|t~{sxrw~mztxrzpt{ty}r}||nwxyx}sw~}~}w|uz}yz}y}x}v}y|}~yz{}~suz|~zvvz{{}||}|ww~ttvvxppzxw}|yqq{qq|ppusspnntopystvnoxmpvlnujmtilwlopgjlehlehe^aaZ]kdgh`dhadc\_WPS^WZ^V[aZ_aZ_\UZZSXXRWXW[[Z^_^`VVVKKK=JDAGFHKGGKFGKKKPIJNLOPNNPQOQRNPWRTpRWrQW]NQS[YKWUURWe_dOIN`Z_c]bb]b^Z`c`ca\ad`chchifkdafeafjdininqhnlghimkfqnfosrvst|ttyurwtsuvsuqtxqswruzmotjmr}wvur{yzvyxvnl{wvuqp|xw~zyzuut{qt{t~{uvtutt~~~{{{|zz~xy~||xyyz||}||~~|}z}~y||~|~~~|||}}}~~{yy}zzxwwrpp~~~zzz~~yzx~}|wv~~w{toqkx{t{{|px}m|xrt~nw|s{y{zvwpqpsqrtvm}loousxpx}ny~orw~u{tgq_s}lyrr~mjwgfsciwetnysvtwry~sw|smvlr~vuytvkqfqvjw~ux{v|xv}ot}r{qzst}qs}pr|p{{{yzzy{z}y~y}wyx~{xyvwstwxwxwvyx|y~yy}zxwuwvwy~{|y}z~{{y~|yzwzvysyzyzz|w~|yyz}wz{w{u}w{{{{{}{~y|l{izxvvppuxtswvzt{s~v{qx}t}sysvz||yt~vy}tr|kn~ltvhlrmq|h{prw|hu{jzv{wy~uy~uzwww|t}vyr}q{rsnwrxp~uz}t~xzsvyx{x}~{yx~{}y{{{z{{zyyy|v~~y}tu}~{}{~|vy|~~ywy~~y|~zxw}|}|xx{pr~}wxz{~wyxxvqpxx~tt||zz|yx~xxzss~ttssrppsrrupqtnovopqgjvknzorpeizoraY\lfhjcfqjmohkg_bf_djchhafkdirkp_X]a[`]W\a[`]W\ZUZYVZURVUTUSRRSRS:3>GALA9DG=INBNIBLC@GOJQMJNQNPMMOLOSPMRSJPRIO]V\gU_cRZ\PWXSUWSV`W]`X]g`eb[`d^c_\___`cbaibdj]_p`cp_cobenadpgjngjmijeccwuv_^_iiikkksrs~||ztuzsttvtuvutvttvsrtrsttqqxvuyvv|zytrqssnxvutrr{xz}xxvr~z|zv~{v~||~||~||vtt}{{~~~z{|}|}~yzw~}{yw~}u|{|zz|xyz{z{z{{z|||~~}|{}~y}}v}yzzww}~{|}~~{w}ry}ry}rxyox|posgs|lwpr}j}zt}s|{}u{tvtspo|owws~tzpv{ltzhqwer|suos}ms}muowruuvv{uvpukwqnxhmvis{pt|r}u~vrznbn`uwwvt}psvzjzsv}nzp|~o}|nt}sr~ukzqqwm~tv{|{x{x{x{xzv}xz~v~v|vzxxwxwststqpwvxwzxxvr~s|}|{vtt}rxwur~z~xalYwp{w{w}yuq{{xxwx{|}}|}w~tuxxyzzzy|zxx|xwwwwwuttqrtvtvvspooosuyzsnyszs|syrwsswvxxv|~w~yz}t~urnk~kq~lzt{}uy~uy~uz~xx|wy}zz}t~~uzyq|zr|t|pr{jyusrvqwp{p{q~tzoznwuzxstvvyz|w~v~v|uzs{sx||xruux}~rqq~}}{|}~~}wutywuswx|z||~}wuuuw{}~vx~wy~xxxqqyytt~ppuurrxrstoppklpklqlmpmnfeghfhkikgfhonofdfiegqjmpgjodghbgmgllfkhbga\`g]`f[^cY\i_b`VY^TWaRY[MS]RX[PTYQVHBMSMXA9DB8DA5ATLV>9BNJPLHMOLNTSUGJNTMRZNTTIO_T[[JU\MU\OWXQTYRU\RXbV\[SX^W\b\``]_^__daag_`nacpbdraevgktgkmehgbdgeecaaommsqqqoomlljjjtqq{uv|tuuwttvttvttvtsutsutrr|zz{yyxvv~||kihzyt}{z{yysprwuv~yyzvu{wv~zy~zyzxx}}~~~||yww~~|}}~}xy{|||v~}ywv~}v~~~}xyytu}}z||{}}}~~|{~y}{~~qxu}x~}~{v}v|}s||r|{qw{p}ux|u}vusyxv~sxzsxuvswwxyp{q}rvxx{nxot~nt~ns}mt~nupxxm}lvrqkgt^t~nlvfmviu}ru}sztz~ruxmfm`~wxp{~nx{kut~qt~nzry}nzyk|ykxvxzp~vn}ut|t{~~||z|z|z|x|w{v|t|t{uztxtutttvw{{xwyxwvkynwx{zv~tzx}{wtwsuo{{uq{{wwxx}}~|wxs~}svxxxzsw{}rwv~w|xxxxxk{iwuoostuwwvtsuvsux|rovqzt}u~w{xjuluqxv{z}w{~t~twswuzv{u}twyty~uz~xy}xzyz}ttwnz{r|zr~{s|pt~mvrrruqwpx~mzntzi~szvvtvwrsuv}tvv}t{rvxz|~torvz}~~}~~}~}z|}~}||~}{z~y}}{{|oqtv|~{}~zrrxsr}uu}rr||vvxyqrxx~rr{vwzuv{|top{|wtv{z|dcehgilkmmlnjfhgdfldhtjmk`cf`egaf_Y^ichgafe\_h\`dY\bWZdY\\QTfV]cSZ]QWaU[XNT>8CBIMCOTHTMEOE@ID@FJFKLIKRPROLPTKQ]NU[LR_RXXHSYLT\OW[QTZSVbW]aV\RHN`Y^`Z_b]a_]]c^_jbcj_afY[fW[o`di_bd^`b_ab``geeqoo~~{yxvwvkmmuuuxstzrs~sutrttrttrttsutsuvtt}{{~~|zz~||pnn}{z}|{xz~{}~z|{~{z~zyywwxvv}}{yy~||}~~yz|}~~w}|{x~}v|{y~~|}z||~~~{}}z||z||~yx~yx|wv~}{|z|zz|~{||{|s|zrzwo{xptxmw~ywqt~mzwwuytqyl}s|{v{uzxywt}sy}quzkmrcqweu{gv}mt~nt~ns}mt~nt~nqtrqqmlxds}mlvfmvixuxvx}ru|ovwjoj_t~yk{~n{~ntrxq{kw|pzzl~|nxw{uzryrzz|z|z|z{yy}w|x|w{v|t|t{uwrwtutstww|x{xzw{xyvrutwvwwwowmyw}x~x|v~v{s|zv~~{yw{x}{|}{~y{u|r{{u{p|pwqyhx~v~w|xxxwxtp{xrpttxx|~rspruyimxuvq{u{szsongwftgtktnw}svx~t~t|xvuws|vxysytytz~xy}w}|yvqtk{|s|zr}{s|pwptpoornt~mu{jx~msyhsyh}ryuxsxvqqst{s}tv~vv|xznuvuqrvx}~~}}~~|}|}}~wyy{~~}}~}z~~vx~{}{}{}uw~{sszutyyvvvv}pqwxtvssww||z{zuvz{ojkwrspmoonp\[]jikmlnmlnkhjgdfmhjmfiiadhbgich^X]hbgichd[^h]`cX[f\^eZ]\QTiY`fV]_SYdX^[QWLFQGALJBMF8C?9D=5@NDPQEQJBLRMVMIOQMROLNDACNINQFL_MTZIPcSZ^T]^T\^T\`UXdY\pbh_QWh\bcX^b[`e^chcde^ajadh_bnegj`cbZ]kgimkmkmnnlnroqsprpmoroqjikjonqssuttxrsyqrsrttsurqstsua`bvtt|zz~||zxxxvv}}|~}y~|{vw}~ojk}~yww~||zxxvttwrs~}~z{{|||||yzzwww}~~|}~~~zy~{~~}|~|{|z}xyxxx}}}xzu}}wywr~y||v}xy~ts|oq|krynsxoz~sxznqs{uztyv|xvuynx|p}u}ssyh|tnxhr|lt~ns}mq|ml}pn~oyvo|lr~lt~nq{ku~qu}ru}sqzorylxvkvlvn~r}p{~nrt|ow~oxr}{m}pw|ss{tvytxn}uw|y}wx|vrvpuys|z|x|x{vzr{s|s}mvqwsxtyw|wzu{v{v{vsxrwtwuv|zryn}~xyu|x|~~}x|w~yz}w|rxzyzz}~}}}}|}|zxzz{|~usstvx|x{vyqxqzt~z~vr~y{x~p{r{r|s|szs|v~xyro}ktnysyszuy~ux{vv~ttxpw|tz{rz{ry~ovouqsszvwpx~mzox~mxwzt{uxteucxxypvtw{}~|ztsp|p}~|z{z||~yz}~~rv~{}}yyy{}}~~uwz|{}yywwxx|}}~vw{|~rr~rr~ttupqrmnupqytupklwtvedfihjedfihjonpkhjifhhegjhjdbdd^djdje_dpjonhm\SVk`c]RUbWZ[PSbWZfV][KRZNTbV\TJP@:E@:E@8CB8DF:FMEOGBKGCIHDHNKMSQSYV[ZQW\LSgX^dW]^V`aV^aV^aWZgY]l\cbRYhY_eY_dZ`f^cjchibglejkdjhagphktnqkiknnpjoprqvuqvsotlhmokpjikotslpovttvrrtnosrtttvsrtvuwwuu|zz}{{~||}{{{yy~~{|~z~{{}xz}}{{~||{yywuuussxvv}xy~}xy~yzzxx}}{vw}}~~~}~vts|{{vu}|~}~~z~}~}}}|||yzvpr}}||~xy|ssxnr{nv~rx}stvmzwym~~p}qx~v{v{~zz}uz~s|t{p{qzrnxhr|lr|ls}ms}pizmjxluttqr}mt~nr|lu~qu}ru}sv{pt|nwxl{vk{qut|oy|l{~nsw{lt~}ozm{n~wxxyzz|q~vy|{y~||zz~x|x|w|x}u~v}v|nztxsurxu{u{u}w}w}wsytytyvw~w~oo{itp}{zw~}|~z~zz{{y{wz~wxr~~~~~|v{rr{jxq|{ysxt{xxrxs{uwozs~v|v{zn|zptoztys{u{u}w~wysurusvryqysytx}ux}tt|rs|rzvx{r{~uy~ovntptt~z{tu{jzozowwyr{uzto~l{x~|{{t~t~rqq}qzvq}wxy{~~}y~z{~|~}~~{{}}{{{|oq{}|~~~~sutvvx{}yywwyy~xywxxxwxttssuuwrssnotopupqojkxuwdceqprkjl^]_nmoojlkhjhginpqbded^chbhd^ce_djdif]`j_beZ]_TWcX[g\_hX_fV]bV\eY_ZPV93>=7B@8CJ@LMAMRJTGBKNJPVRWXUWVUWQSWWPUXLR\QW^TZ^V`_W^aV^eV[fY]iY`fV]gY_i\be[ag]clbhoekg`eunskdif_b`\^backnojopnnrqmrnjonjornssrumrqpppwqrztutsuutvtrtrqsfegsqqyww~||}}~~}{{{w|{}y{}xzz{~}}}{{|zzxvvxvvxvv{||}{|}~{||}~|wx~}|~~y{{{z}|}}~}}||||{w~{~~zzzyyy{|v~yv|wjoj}|{~y|~xvxrqvmt{qzv|xsvm}zym~pqzwytzuy~uwzq}vw{pz~rx}nx~ppzjs}mt~ns}mr|oiynhvjsrvut~nt~nuou~qu}ru}sytx|pvznt{nzsvu}p~qz}mrv{l~~p}|n}wjxkvypw~w|}q{smzr|z~xz~x{yz~x|z{w{vzzr{szt{lq{kztzt{wwqzt}w}w}wrxpvputu|x|vur|{om~{|z}xy|yywr~~|}~}~}~~|~qu{jxv~uzs~w}xsm~yvpyqwpwp||l||ny|q{k}wysysysxn{svpuqsqm}kyqyqw~qx~rx}ts|rv~tvt}z}tx~nunp~lrrtpr|kw}lzo}ru|q|u|uxr~z|{~z|z||~vsywxz|~~xvuz||yyy}y{{}{}}z|y{wwwwxztutuxyvwtt~rr}ssupqxstz{pklpklurthgiutvxwycbdbacnikjgiYZ[Y\]]abgafgafe_dc]bkejcZ]bWZg\_k`cf\^`UXcSZZJQ^RXVJP^TZ60:>8CE=@JFISPSNHLQJNNILLHLLNQUXYMJLSOQQNTUQWSPVSSYSUZZXbYQ\WLVaU]_W]dZ]g^`f^ahbeifhdabibgjchk`fk_elaghade`bqnpnln]]_dcegghkjmxwyhgjonomomvwutusyzxuutvttxvvxvu}}zxw~z{|wx{vwyz}xy}|zxx~{|}z{}~~~}}zz~~}{{|||~~|}top}~~||~~~}|||~~~yz~~~||}~|~}~~}~~|x~|y|wztwq|tr{txqxpxnxmymp~}r{}r}v{w{v{twpdna}yu}r|vy}qswk}~rz{ouyju{lxpxps}mr}no{nq~pvttpsovpvps}mupt~ovqq~mo{krovstqxpxq{pzo}pxrys|t|q}qoe{xp}vyvxvyxv~tzwywyt{v}}{~tuyywt}y~wx{onnby}u{t}w}y}zvvszw{v~y{~vi|kyzyyv{~y~~{}y{y{zyxwxyxzz~wytq~ru~v|two{svnzpurpursuyqv~wysxtunzvovoyryqystzouzq{wytzu{vups}nyp{rxqtom{iz|tzst}lxqzyz~{~{z|z~z}yyz~y~x~yzz{~w|y|ysw|x{}}z|y}y{~wxxzwyvxz|xzwysuy{vxytv|uxwnqrv}nrxmnsikh^_vln|rstlmnlljhhlikjglmjohahkdkd]dibimfmi_dj_bg^ad]`_Z\f`cfY_]QWZNT^RX_SY?ABFEHQPROKMNIKOJLLJLJNORVWSPRNIKRNTXTZ_]cXX^VY^XWae]gk`j`U]f_d\SVh_bjcfhcegdffcegafg`edZ`g]cpdjrknxsujgifegwvxutvqprkjlsrtihjnnnpqomnlrsq}~|yzxxvvzxxxvv}{{zxxz{ytuz{~yz~yz{vw}}xvv}}}{{}}~}{{}}||{yyxxx~~}~~~}}}yvx~|~z|~|wx~yz}|{xt}}~||yz|}}~~xy~~syx~~x|w~}~~y|wztwq|tq|txpxoxmwkym~o~}n|p|s{tzt|txrdm`|t|pysxry}q|~r{{ouyjv{lxpxps}mr}mp|pjwikxhrnrnr|luot~noyiwqwrrpp}mxurourt~mvnypzo~qyszt}uy~ow|mwvltqivwn}xwvur{nupzvvq{wytx~s}zxwwrstuur}yw{o|wwky|sxrztxszu|wzt|wzu~yz{zvnp~~|t~tywt{~wyt~{{x{w}x|xxxvxxx}x{vxzzus{q~v~vvo}v~mwnzqqsrrtx{xztzv{tnxgt~mvovoyr|t~x~{wv}u}t|tyqwnypxqvpftb{tzs{t{tz~~xyt{|xzzz|z~z~z~x~xzzz}u|~}~~~~}~{{}}{|xyxz}vxwyxz}oqxzy{{}wptx{~ossw~rtvx|~zprshjumnmkkkiikhjkglokqhahibie^e^W^hbhi_ei^ae\_^WZVQS_X[fZ`aU[^RXcV\dX^OSTEGHWZ[>=?HEGLGIMLNMQRZ^_RPRYSUQMSUQWLJPHHNY\a^]g_Walai`V\kdie\_i`cf_bd_a_\^dacgafe_db\`f[bnaglehtoqoln\[]jikpoqonpmlnqprlkmnnnstrqrpstr{|zyzxuttkiinllyxxvuu|wxxst~zz~yz|wx|wx|zzxvv~~|zzwwttyyywwrrr~~}}~|}~||yyywww|~wtv|~~{}}}{|{|~{xtsqq~~{|zuv~yz~}~z||~x{x{twq|tq|txpxoxmznxl~~o||nz~o{szvxs|u{txtu~qyvvrv|pszm|~ry{otyjv{lxpxps}mr}myyzyxuxtp~lwquooyiq{kvpyttrtqzxvs}zr~lt}lypzo|qxszt{u{py}nu{yn}~tytuswuyzs}lysyrztzt~zwtutttpquru~qvzn}sxznvztyrwsxsq|lyt{v|wzt}x~y}zwy}tvy{{w{u}u{z|q|x{u|xyu{v{v{xxxvxxx}wzt~uvywsx}nx~v{vzroyhyp|qvtrr~otwwxqnzhp~lvounzvovoyr}u}uz{}y{sxpu|m~vw~o~s|twqxqwqvq{tzs}v|u{z|w{|wxzy|x~x~xzxzx{x{x{x}|}}gp~vtwt|{yy~upq|}~qs{z{y{{|~|wz{uv|tuuwqdf{movxxz|~wyxqtvmpvmpwlouy|~{prtv~sutikxpqrppqooifhjfkokqmfmleljcj`Y`d]dkagmbekbekdglgif`ce[abX^bW^bX^`V\?EF>BCOQREDFJJLIFHHHJ@DE>CDGGIYVXUQWVRXRPVEEKUX]POX`Y`g\dbX^ibemdgf]`e^ae`b^[]fceeafhbgoglkeilbhjcftoqolna`bjiknmonmomlnrprpnpppppqonomuvttustuszvu~zyxtswsrtpo}xy|wx~yz|wx}xy|}~~~~}}~~uunbbww~||ttt~~{|}~|}~||zzz~{}}~}}}|~|}||~|xzxx|zz|vw~{|ztv~}~{~|}~x{x{twq|tq|tvpvovmwmvl{lz|lx~myq{uuq|v{uurxuvtxts}pszmz~ry{otyjv{lxpxps}mr}mr~rivhivfkygp~lnxht~nuot~nytvswt}zwtxur~lr~lwpyp|pwqxsztxpu|mw~|s~~ux~st~rur{r{rulul{r}wy}y~{~}vwpqwtt}pw{oy{oxz~r}wxuyttoup{v}xyt|w~xz|zy}~vxwyzwxtytxr|t}x|v|xyu}w}w~x{xyx|xy{u|t{}q~~rt|puzkxwysyq~w{tzsxr|mr|mtpxg{r|uzt}yxqr|k{vovoyr{rxp~xztzu}sx}nsxizpy~o{q~s{rxqtnys{tzsoyht~m{}w|v{vt~qx{tvxyyx{x{xzwzw{x{x{x{yszspl}~~|z{|}{|}{zy~~}}uyx|~yz|tuz|tvsusuvxxzrtvy{svy|uxmbe}rtwywlnynpxmosklommljjkhjnjptpvmfmjcjlel^W^b[bf\bk`cnehd]`c^`_Z\c\ac\ahafb\aXQV;?@@BC@@BRRTMJLHEGHJKKPQY^_RTUTQSWSYXTZUSYVV\UX]WW]^W^bX^_VYkdgi`cg^af_bfacdbdfdffbgfbgkeje^cnglxqtojlmjlkjlmlnpprqprqprrqsrqsrrropnpqorsqxywrsqsnmtnnwrqwrqwrq{vw~yz|wx|wx|wx{vwzxx}}~||~~~||}}~~~||{|z{|wx~~~}|~zz|||{|~zy{}}}}}~}xy|}}~~||~|||~|y~||}|x~z}y|wztwr}ur}mq}ktlulsjz~ky|lu|kwqyvsq|xzvutqqq}qs}pu~qt}pv}pvznsxiuzkw~oyqr|lq|l}}zyyvhvd|vpzjysq{kbl\|wxuvrsptqsptpr~lunq{jzspuptor}mw~ost}rztwtupvmwnulwmwmho`xys|w}qruvvsws{wymz}rw~qu~qyus}pr}m}xr|w|w|x}x{~{~{{~}|~wywwyy|z~{w|m{qzr{u|v~xzz}~|yw{sy~o{~oxuvxx~sn{u|x}turyyit}nrv~mwvouoqmunt~mzsxqq{j~wxot|lryjszmv}py~o|rvuzkx|~o|p{qypwpyrzszswp{t{z~xzw}npxyxyzy|yyxyxxwyxwvy{u}~z}}enu`ppz~rsq}~|wuxx}pr|vwxpqz|wyxzwy|~}wy|qtvy~zqtyps}rtwy{przoqxmozrswuurppolnsotmiokdkkdkg`gd]dd]dlbhshklcfkdge`ba\^d^c_Z_b\a`Z_UOT==?FDFEACKGIGADJHJHLLJPQPXXQTUPNPYU[ZV\XV\WW]WZ_[Zaa[`dZ`^VXc]^i`ckbekdglgilikgdfdcgdcgjdib\amfjvorqlnnkmmlnpoqsrtsrtsrtrrtrrtrrrqrpyzxopnyzxqrpxsprmjytq{ws}xu|wxytuztvzuvzuv{vwxvv|zz~||~~|rr~~||~~~~}}~|~|}zxxzzzxuw|~zz|{|yvr~~~xzz{}xy~~}|y}|{|t{xyyz}y|vys~vmxps}mq|jr}jvmvlx~ky~kvjyqxrql|x|xq~putr~rsrt~qt}pw~qu|otxjv{lw~oxpr|lp{ko{otsxuo}kftbwqvps}mhrbzuvstqrourspvrsptnu~mztssptor|ls}ms}r}sysxur}mt~nvozsyrxrv~mvunsmzvo~pstyvyu~v|~rv}pu|o|xvsvuvr{v{v|zu|w}xz|~|~{{yxz|vzwyvx{{~{v|qyp|t}v{~~~~{vvxz}mwwww{{vr|v{uy{uwtyxrs~ytn{wvounyrvovnzt~ir|gqxiszjv}q{}ny|mvmpa|r~r{pzqwpxrzszswpzsz|}wznrvxxyzyzyyxyxxwyxwvz|v~{mabi{~~~yy}~vpq|}y{suuwvxsuy{tv|nrz}vyx{|ux|stxz}rttik~suumnvtthffebdlhmokqmfmibig`gngntmtoekpehnehhbdfacd`b_]a[Z^XV[WVZ`^bHDFGBDB;>TLORHKMJLIMNIQQOWWPTUPOQVRXWSYQOUTTZWZ_VW[]W\bY\d\]a[\f^`lcfjcfhdfjfhecedcgdcgfbhe_dkfjqjmuprtqshgimlnsrtsrtsrttrttrttttklj{|ztusxywlmk~{{tqzw~||zuvxstzuv|wx~yzzxxxvvxvv}{{|zzzut||~~}}~~~~~}~}~}|~~}}~~yz|yu|}}~~~~~ywv|~~yz~}vtt~z}y|r}up{sephron|jl{ftmwpx~kx~kukumvrtrwvxvcrdqstsr|os}pvrv|ptyjw|mxpx~pq{kozjr~ruttq{wo}k{uovpvppzj{vwturwtvso|lusvrwp{uxwurq~nr~nr|l||n{zl|pv}ns~nq|lu~rvqwswrxtrziypxqwqvrpqrszwyuz~r|{uxtwt{zwrwr{v}x|wzu|wz~~{{xwy{tzpvy~z}r}s}|vz||v~v}~{wwyv~wwww{zvzvso{uxr|ttwvsuv{rzsxr{wwpunxrxqyr}us|hr{gt}kryjryj{~ouxiz}n{~oxts}r}rzp{rzszswpzs|{|zx|quvxwyxyzywxwxvwwxuvz|v~ժtհvw}~wytx{~yz{|{}rt|~uw|npvx~nrswujmzsvxqtyqrvx|rt|qs}rt|turppkiiolnlhmgcikdkqjqlelkdklelmcimbekbeg`cfacdacbae^]aZY]WVZXW[KDGF>AJADSILQEHOMOJNOIRRRZZPTUVUWVRYVSZYW]WV\VW\TSV]X]d[^kced`_d\^i`dd\`d`bfdfjhjdcgdbffafkejmgltnqvqspmojikqprrqspqrqqsssustustthig{}{qsqrtrqsqoieuojzv}vr~xtyts{|}~{|}xy{vw{yy}zz|zzzxx~}wwzz}||||~}}~|{uv~yz~}~~~~~~wyyz|}}|{z}}~}}{|y{p{rozq^i`splzhixctmzsujylvmvpvsrqvtsrdsfprvuo|ns}pwsv|ptzkv|mzqypr{lozks~rtrtqm{hq~lirbpyipzjxrwrwturrpzxywsptstsrotnr}kiyhn~mspuouo~~p||mszrs~mwszwv~sovlqyov}rwnu}ltnwquqttqryvwsx{o}wzvp~oxwwqwqytyuyuz~z~~||{tzq~sz{yp}v}w|~|}~yv~u||pzywx}vzvzvpm|wys}urrqsu|t{swpxryuxqunxpxqt}loyft}ht}iv~mt{lv}n|}osvs{rtt}r{q}tzszszs|u~|||zyuxpuz|wxxxxywxwxvwwxuu{~١~|}xz}z{y~~|}{zrv~~~~wyrtsuwikugiy{pt~ptvy~vy{uwvnouv|psvx|qstmnommkijmjlninqlsmgmf_fnhnjcjjdjkafqgjkaehadfacb_a^`d\]aYZ^dfj^_cBCE=>@@BCIIKKLMCHHDHIQVWPSTIKLLNORTXVVZXRWcZ_`SY^UUaWYeY_oak`S^dS]_Q[`Y`a`debdd^aj^dqflg^d~v{g`etqsjgiolnxuwfcejnmmsrmsrpvtntslsrgsqjtshonmsrrxwupq||yuuxsswrs{uv~wx}|}wyz{|||sssuuu~zzzwrs~z||}}suuzxx~~|~~~vpqqzuqwz{z~|}|}}~}x}yrpssqqrpuquqwpvo}t}vzxr~upwowwvwwtsxtyusrkxhp~mvpzt|pqrvwirsessgzxpyxnxxluyjw|mwynwzou|ps}pp~pknkpmsc{hy~d{iruptprrrtstuvuvuusto}r|qzwt}pyu~v{tx{ox~q|trsutsq|ywrtswv|t}p|w{{|wxxutuvyuxmpmqivowrn~lyv|z{{z}uxhyj|z{txtwv|~~|wz|rut{tzt~yt|}mxzt{uwswrzt~v{rr}qw~mxqzvvqsntptpzvzqu|kzyox~lu|kt|ku}lu|nv}pw}ru{lzp{pvustzs}r{q~s|swo|vxy{ssuszw{y|xzvvuutvvuvz}~}o{Q|zu{xz~rvyko~twrvx|}z{suwwwwzz~rrww}rtwlntv|stuopzuvwop{prykmwlnplqlhmpjounsh`ejcfe^bnikgdhffglgiiddhcdjeffabb``[^^XZ[SUV]__RVWDCE>=?IHJFEGBACIIKOQRCDEWVXWVXGJKPVYVW[[UZbX^_QWh^^`UW`TZhZe]O[n]hl_jc]dcbfhegg`cn`fl`frhng]caZ_qnpgdfnkmpmoxuwuzykqpmsroutntsmtsitrkwthnmmsrtyx}xyupqvqrzuvxstyzz{~{}xzxzzzzwww|||~~~{|||yzz~wy}{{|zz~~}|}}}}{rsvvvz{{}~|~~~|||zzz~~~}w}xvsropprptptpwpwp~v}wxvswn}wryvxvvvuvsvtsrn{jq~nuooziy|m~~p~~owwiyyktth{xpzyo{}qosdy~oy}qv~qs|os}pq~pmojnh~lkoh~lUlYnrmqqrrtsrvwxwwvxuxsvv{xxtzv~vy{}uqrtsrqyvs~nrqyx|yu~q|v}w{~z}|t~tvwwrxlhgmgys~}y}~|~tvfxg}|x{tytwvz~~|{xtxwlr~szs|v{wu}~nuyt{vxuxtxr~vzpry~moxg{uyutpp~lqnvryu{rynz{p{p{pu}lv~mv|pv~px~rw~oyq|qttr||lvwg{~n|qtttu}u|t|~wyyv{x{wxtusvtxxvxwz|~{k{q}s~~~z{wx}z~z~vzvzy{||{{zz~~wwuw|qs|qs{prvpq|vwyqrynp~qswlnuqvkglslqqjog]cy|d]`wrtkhjhegojklghkfgmhid_`^\\_^`dfgTVW\`aPTUJIKRQSUTVMLNBACQOQIGIVSUVSUc`bVUWPUXUW[ZUZ`V\_PV]UUf^_]SYncmocowitaWa`]c^]a`\^c]`ugmj^dpflndjslqolntqsnkmnkmlik`edu{zpvulrqlrqlrqksrnvuionnsruwwz{rmnupqxstytu~wxztu|tuz|y{xx}}}www}}}}xzzzy{yxz}}}|||~~~}~tv~{||~}}}yyy|~}}}~}rzss~t}~~~y|~~|~}w}yy~|}w~xxsropppntpvrwpwpz}xwvs~vp~xryvvvvvuvuvrprn{mq~pyus|oy{pt||pttix{{oywozyp}tio`xpxsv~qt}pr|orqopfxh[m\gzik~mlnnrnrstuvrqmnsrutzw|wwwyxyuyv{sx|pw~v}tqrtsrqvss~nts}|u~qztu|o{|t}svwys}owlefpkyu{~~~~x{w|z{}yzl|k|y{w~v{t{v|~y{|yytvymrt|t{uxt~oxyi{~nv~r{v{v{uys{t}srw}lmwfztwrvptnxr{uztyp{px|qzoxnwnv~mw~pw~qx~sxs}u{s~r}rr}~n{~n|p}r~svu~tv|~squq|~yy|vxtxtywzxxy}xz}bnvghVuz|}yz~}~uu{{z{zx|z}w{w{~y}|~||zzzzzzvx}~su~sutv{tuz{}uvshjrtzoqrnsnjozsxvotpfl}twkehqjmlfhebdhcde`ad_`kfgb^^a^^__a^]_PRRX\]TYZOMOLKMMKMMLNNMORNPYTVMJLLIKRQSRTULTVRUY[W\]V[[OURJJ`XY`U[g\fj^jk`jXOYfdj`ae^Y[kbevhnthnpflndjmfkliklikdbdkhjb_alqptzyqwvntsntsqwvmsrputnrrqssuuuxstytuytuzuvzuv{vxzuvyz{|z|wx|||yyy}}}~~~|||zzz~~uvvyxx|||ttt|}}|zz{xz~||~|x}{z|{~|{~~}~xz|}xst}~{~~{}}}{|zzzzstr}~|~~~~}~v}zy}twu~~~}}xz}}{w~xtowqr~npntpvrwpwp}{xu~tr}uu{o{uuxuvvvututn}omzln|mnwjqzm{}qv}}pxxluff[vwnw{pzsgo_uor|ot}pu~rr|orqm{krr~}nnm~lk}losnrrswxrqmnrptszv|wtv}t{vvttsysu|oxrysytqrtsrqurzsrq~pt~qu~qysovi{}t}svwu~qzzltlorqnwt}z|{yw}yxt||x|x|yz{susr{vy}ux}tv}y|w~w}trtwwysxtz{kwzj{ovzq|v{v|vwzpyszpp{ixtsqq{ju~m{txzswnyp}uxoypypunt~mu~qvrxuzt{u|tzp|pq~o|ozozqzpyv}y{~{v}y||zvuqvtyx{|zU{;m}>zZ[qyz~~}~yww{|~vyv{sw~w{y}{x|y}{}}}zz||{{||tvz|~su~sutvzrsyzzrstv~suvooplqlhmxqvrkprhnodgtjnrknlgikfhhcde`ac^_fabb]^idea^`dceeij[`aQXX?BCACDFJJIKLGJKPKMNHJNJLUUW]`aNSTLRUNRV]Z_[TYaX^d_^d^_b\`cZdaWcf^hfbka`f`aefacnehk]cocimcipflmfkifhmjlc`broqurtputmsrionpvuzoutmsrstuuuuuttrpp~snowrszuvwrs}xy~}wx||yzyqryyysss|||}||}}}|zz~~~{{{wxx~~|zy}~~~~~yzzuv~||z||x~}{|}~|~~~yyy|}}~wxvx~v~n~owzxwwzsytr}mm}ksotpvoxpwsxupyoozr{vzvyvxvwuutsesgnynmympxmrzpvx{zpvulxwmwwmuxosynxslwgp{kn|nrqtsq{nu~ruqroq}mr~oq}mrqlpqustqrpoj|ktswvxuxs~s{|pzstroquv}w~x|u}w}wrststs}z{vo|nq~pt~qvrxr|v{vus|rr}szw~qsleikjutop{zww|z~|{~~|uxrsmxrztwsz|wvur{u|}{zvrwqxszs}|potuq}kusv}pznzqyrztzt~vxs}zozqypmllqygzo{qzozps{ju}lzqv~myowovpuovsxufqe|w}wytw~ow|m}p~q}r}twp~uuuxx|}yy{~ztztlzhzy~l~snfu~vzz{~~|{|||}~uy}~y}{}||~~{{uuy{vx|qs|qs{prynpzoq|qs}vwwxwrsrnsrnsunstmrvlrrgjwlownqwpsgcemhilghmhijefd_`d_`_X[USU]`aW]^S\\>DEEKLFMMGMNEKLNLNYVXQQSQVWIOPGQPKTWNTW\[_^X^cY_`[Z_YZ]V[d[ee[gb[e`^g]^d^_cd_alcfpbhsgmj`fndjkdiifholnnkmolnnkmuzyjpoZ`_`feoutputprrvvvxvvytutno|}wrsvqr{vwzuvwvu}{{~yz|}~{|~~~wwwz}}lnny{{|~~~~~~wyyxzz{}}xz~xy|{~z}}}|~yz{vw}~}|~{~~~|||uuu|||qqqwxv~|}}~{|zwzgvxo~{wwwqztnyipnrnrnwpxqwtvtpyorzs{}w}xvzvys~tttttwyuup|orzns{pz{q}|qu}}rxwmvwmrxoqynpzmmzjn{kl~po~pprr|pt~ps}ms~ms}moyir}mtposqustrspoj|keudaq`p}mq|l|}qy|pu}pqqnrptzwzv|zvzvqrtrtsq~nwrrqtsxuxtw~q}w~zwvu~txyvutxivqu{norsmq|vwvv{z||}xv|~z|}}v|vzxtsr}mp{kwqxu{yvs{qr}kwntrvtu}tnvtt|rv~mwp|uysys}uwtzw}lwrm{yppus}p}ptz{twpxqxrs}lunsmt~qzvjthvsxsxrzqyq|oynv}lyp}vxrw~uz}|zzz|v~wzvnn~fytzto}k}zy~yqlk~~z{~~}zuy}~~z~|}}~||vv}}vvz|tv{}}rt|qs~prvx{prxpqztuvpqokpokp{tyvotsioxjnrhjrhkjcfohkfabgbclghidec^_`[\e^a`]_[]^T\\R]]9DD?JJ@KK?JJEPPLLNKLMPRTIRRR]]IVVNVZOVYWW[a\ab[`]YX]XY\V[bZdc[fb^g_`h]`e_aehcemdgpbhqekh^dlbhkdijgiifhifhsprwtvqvutzyv|{djilrqotswwwxvvytuxstupp}xy{vwupq|wx|wxvttxvv~yzz|||||||zzzxzzwyy~{}}ljjytu{|||||glkoqqrmoqlm~z}~~}|}}}}{{}~}~~~~~}}}kqpzw~~~~~}|{}||}}}}~wh]}lnzwwyqxrq{kqosoxtwpvpvttts~tv~w{}v}xvzvzvyvwvuruq|rq|rt|rt|r|}t~|t}|zrxvnxypqyopznlykl}ln~mlpm~pm|nt~pr|pu|mu|mu|mqxiszkp{kswquoprssrnojzijzijwgitdy}qy}qr|oo~pi}ngzkyuyu_h[|u~qppsrtsspzun{mn{mpzms|o~xu|o|x~z{z|{o~pkqbwtbjmonqlrtypssvxyz{{wx{~~w|uzs}vzs}wxwxuvqt}mr}lmzl{wwu~ot|k{p|ov{tuxwrutt}rypvpy|t|suzt}qpyh}vlzhywnortrptwyrzsyroyhwpsprno}nyxivjroxswrzu}u~szorziyrzr~lwun~~}{x~zxwy|zq|tvoz~{~`ugfnrlm~~rt~}~}~xz|}{|}|z~|ux~y}z~vzz~}yyvv||ww~su|~~vxuwrtwy|rtskl{uvzuvokpokplejmfkndjvhlvhlrgjjadkehjefe`aidelghe`a_Z[iaddac\^_R[[NZZKJ?LKERQJLMILMMSUMWVDRRGWWMY[OVYVX\\X]PIN]XXa\^b\abZc`Xc`]f^^e[^c\_chbekadn`fk_eh^dmcingljgigdfjhjkhjmkmmrqkqpflkflkkqpswvzxxywwvqrystyrr{xx~xztno{vw|wxxvvssszuv}xy||zzz{{{nnnooozzzosr~z~y}|x}|{vv~zztwwz~~rln}wz~|~z{}|~|}{|~~}}|}~}~~}}~|}||}}|jonx|r}{xwzruoxrrprnxtwqt~nuruv{{zz~~yzvzvytwtvvvqtozpr}su}su}s{}tyypvulutlyxpwyppyoq{oo|on~nrtmrm}pm|nurq{nv|mx~ny~o}szpoyiwzrussttusppn}mqojvfal\xrzrr|nn~ni}mfxit~pyvbl_}t~qnorqtsvswqwus~qozmu~q}wv}p|xy~u|{}}jzlem^uthpqtnrmrpulppuxxxzy|z}~}~}{|uyr{tzsxrvsyvzu|vv|nesf{wxv}q{px~qwwtuuzvutvxovvo|~w~vxz{x{~vvqqqqp~psrpp~vtnxrzto|irlurson{m{zjvjp}mvsyt}wyuwzx|p|j|zz}|{|ry}{~vvyvuyr|u{uz|lTWn{|~~|}skl~{}z~|w|vpty~||~unq~}z~{~w{uwzz||}}zzvvznpvxy{uwtv~prrt~suvnoupqnjkokpokpnglnglpgmj^awjnrhkrilqhkfabd_`nhipklhcd^XYbY\[XYZ\]X_`ZffPKPSNSNJOEFJJJOLLRJNSLSXPY]JOTHMPKZXKTTPTUVUW^Y[c^ae_e`Z_a[`YSXaSXk`db[_e`be]`pehh]cbX^lbhpflncjgfhggiilmhoognonppnnnussqppokkkgguqtwtvomowxystvvvv|zzyww|xxztu~xz|vw|vw~xyyzz{}zzussmkk|zzsmo|~x{z}w{zlp~{z|~w{z{}}~~~{|{|~~~{|{|~z|}~~|}}~~~w|w~~}|PJgauqy{|vxrvpuweog`lahuhssyu|}~}yz|yzuxrwqvp~sr~tr}sv~tv~tt~tnyofoeV_Uu|rv}spyogsilzpo}rrvzqw~ou{lx~ozqt}purwsvsr|ooymtrvtiugjuhq{nt|mowh~wu~nxpyp~tuksjzptlspqovtonp~prrvuxxututwsu~qs|ot|pr|oxtywwuywxuu}sgzktwqrmnonkpmrrvuwvuxswx~ux{vzzzzzvtrrm~myzstrrxw}~xukpayz}{|zwxtwwwyv~w}ww~nyq~x~x|vzqwnv|sys|v}v~w~xvvt~q{r{s}sv~r}}orx{wqwqwqxszwpyl~~zxu|v~yv|nyy{|zy}ynwz}nxu~{{~{{{{zzvt}|}}{Տs섴~}|}|}ux|~z|{}|~}z{~~~~~wxuu|zy|zywtstrqsusu~oqwyuwsutv}prvnoxpqystqlnojlqhkrikrgjohkmfipilmgjngjqlmdbbfdd_]]ecc]Z\[Y^XUZfce^[[daaHFJJIMMMQLKOLKOPPVFJOMVZQZ^NRWMRUMYYISSQUVXVXeacgafRLQb\ae_dc]b^PTl`dc]_f`be^ajadmcipflpfloekqflkjlqstjnos{{pxxrttpppsqqwuuhcdrlmtqszwyutvy{|swxyyy}~~~||z{|uv{|~yz~yz}xz~yz~zz~||uss}}x{~|z}~~~|~ypzx|wyy||}~~~~|zz~}}yst}~}}}|~}{s~~~z||~cVkՃ~ցz~w~xzsytvzy|wzp{qr~r}||w{zwxvysxrwsvuvuvv~tv~tq|rqtxwfoerzpowmpyokvllzokyngwlv{lv|lw|mx}nzoxturt~qq{nwt{xwsvrltgr{nyuv}novg~vu|mw~ovm~tukwm{qulj{fyuvutstuxuurrozw}zxtvrt}pu~qv~rwsxvxvxvxvxvi|mpropnmpoptpuuvwwxv|vy|{~x{w{x}x~xxxzyyznotuwxz{yxz~tsxiyz~}}uw|{|~mwg}wzy{u{rs{jz~u~ys|v|v|v}wvtqr|rzr}s~tss}}ontemxgu~nt~nu~nwq{xr|o}|z~{z{xp}u}x|~~|u|x~{v|u{y}{}|~{zyxr|oxvzy~uˌsZ|~wxy{wwwtttz|~sv}~~~}}}~~||~~}}~|{~|{{yx~|}|rurupsuxtw}oquwzqrtmnwqr|wxojlvprqhkrilmbengjrknqjmohklfhgbciggiggjhhfddhegdcg_^bjgi`[\_YZ;EGBILFJMIKOJIMTSYDHMPY]FOSKOTMQUKXXJSSORS]Z\\UXZTYnhm^X]\V[c]bbWZkadfbdfceidflehmfkrlqwpuvotuns[]^lnobfghlmhpphjjiiipnntrrmhiztuurttqstsuvxyquvxzzz{}xy{|}xy}xyyz~yz~xz~||~~zxx~~~||~wzz}x{z}|uyuhl|~swys~|~www~||~~~}}}|wz{~}y}}}~~~~zh]]ogqvts{{u|u{u~xzvysyz|~zzvur{qz~r}z{{yzxxxvwrvqts~ts~tt|rt|rs}tsv~zynvlxvmvlkvlo}rm{pgwltxlvznx|pvzox{pxturt~qnxkt~qxvwsxtyupyl{v}nqxizrszk~vwn|rxnvlyoxofydwvttsttuxs{v}x{v~yxtxtxtyuxtwsxvxvxvxvxvj{mk}lllljomtvsursttxv~xx~y{v|x{x}x|x}xxxwxywxvwwxwx{z~~xuzry|{}rt}|}hrb}w}w}wztv~mmud~|s|ys|v|v{u|vurqr|rzr}s|rstu{pu{lx}nzq{q{s|x}wt~{~z~{{{{syq~u{||zy{}|~|~z{t|w~x~y~x}|}zwrzrwu|{mwzwh~{}~}wxz|sss~~~~~~wz~}~~}vx{||}wytvyy~~~~~|{vtssvsvptuxsv{pr{tuxrssnoliiollrmozuw{ruzqtwlolehslotmpnfjkdgkfgsqqljjljjeccfcecbf`^bhege`ae_`@NPIVXBJMGIMPNRLKQMQV?HLKTXNRWLOSKUUMSTSUV\XZ\UXa[`^X]e_d`Z_a[`g^ad\_cac^_`heglgijchlejnglvotwpugkltxyhlmdijjoplnnjjjnllsqqytutnosprqnprqstvwswxxzzsuusss{yyz|~~~||~}|}{{|zz{yy~||~||~~x|~}{~x{wz|~}y{txzpxwzwww{|{zz{}}yyyzzz~~~xxx}|{||]Vdoox}{{|~xz}t|wxtvt{~}wv|~~||{xyvxvxtwvwuvxvxvsvn~tyz|}oxnqzpnwms~tkynm{pl|qvznw{ow{ovznvznt}purvs}zxuurysztztxru|mv}nu|mt{lryj{rwmzpzpzpxosokhppppqr}w{uxrztztyuyuyu{w{wwswuywwuxvywork}lnnmlrpuursppppvt|wuzpwqzvywwvyv{v|v|vutz{yzxyvw}~{zz|vvyz~uusuqsop|{xpxphscupvqxsyt{x}txo|ys|v|v{u|v~trss|ryq}szptrs|~o{~o|~o{~o|}o{q|y|yyv~{~{zw~xz{|t|~||y~~~~{{}zzy{|~~~~|}y}vzx{zzV}wx~|~xqt|x{~~~yyy|~yzxy{vw~|}~y{wyy{wywy}}||||||zxx}|}{z{yxwuttwsvpswzps|tuwqrzuvxvvnllpoormoXSUsjmlcfrgjmfig`cf_blehlehkfgomma__jhhjhh]Z\_^b_^bhegd_`b\]3DF5BDCLOHKOOPTCCIY]bJSWOX\JNSJMQPZZQVWUUWWRTZPSa[`b\b`Z`_Y^lfke]`ibeeeg_cddceebdhbgjchlfklfklfk_deqvwbfgeijimnjkkrrrussnll|wxwqrurtqnptsuwyzuyzv|{vxxwyyzxx}}~~|zz}{{}{{zxx}{{}{{~~~||x{z|zsv~z~rmoxz{v|{z~}}wwwx~}xyy{{{~~~|~~v|~}{|}~|~t[]^miy}~}yt|rvry~}|{|}}||yy}{||{}~vywxyz|zywm{pm}rrun|qpyonwmhsio}ro}rm}ry}rvzovzolpex|qvrururwtxtxuzuv~qysxru|ow~oxpszku|mv}nvmyoyo{qzpxopmkinmi}juu~w|uyuo{tytzv{w{wzvyuwuywxvywzxwwwvvtwstptrrppnqoqq{wu|s{uzwvvvusrvsxsztutrsxyxyl~mmnxyzy{v{uvzuzuusqslnqsopxuztzpv}no|lurrovsurypvowfyp~u{uztzt{u}wvrrq}s}u}s~tsrrr}|n~p~~pq|~owtzw~{|y{xwt|wz}~y{|}z}z{}~{y}|~~}~wmilru؀_xy|wy~~~~vw}xy{~||~}{}|~yytt{{}}zxw|zy}{zywvrurusvruruzrsqklz{utsqppvuuojlwrtypssjmshklehibeibelehngjlgh\ZZ_]]jhhhff\Y[^]acbffceidegab;HJEPRLSVLOSHLPHHN\`e3<@GPTQUZQTXOWWQVWWUWWQTYPSa[`c]ba[`b\`e_dibea`b`cd^bdbdecbdgdihdikhlminplq\ddmrsbghbdelnonnnhhhgeeiggvqrnhiwtvtqssrtprsrvxuzxv{zy{{{{{yyytttppptttwwwzzzyyy}{{xvvsqqwuu~||}}~wzzsv}{twxsuzy{v|{{z{uww{x}|xzz~z||{{{~~|~y}~~~~~~}yutokehgos{y~uqyns}r{}}~~|~}~}z}vwtu{y{ypul}rm}rp}rnyoozpqzpp{qn|qn|ql|quyntxmvzonrgw{pvrururururvrz~ry}q{s|t}uyqryjyqryjw~ovmyoyoxnxnwomlihfgf}gpt}q{pzs|ht}ixrxtzvxtwswsxvxvxvxvxvtvwvxwsowswrupsnqooovsu~vzuywvvrssrsrwqwrrqwxxyyzhzhvxzyytxr~t}v{wutmokopqpoxsxrzp|rrospp}msospksbv~mxov~mxovpwq{u|v|vurrq|r|tuuuqqs}p|o{mts{xzx~{~{|~~~y}v{s}}~|xw~}~zjWNQW~cr~~z~y|~~~}uv||z~x|}|~ww{{~}{yxqon{yxrutwtwrutw}xyztuvqrtqqrno{vx~y{{rusjmvknnhjlehlehlehngjmhivttfddfddljjkhj^]aonrfcehcde_`;@DFKOINQKPSCFJGGMPTYHQUGPTNRWILPLTTTXXYVX\UXdY\e_dgafgaff`djdi]XZWVX[_`Zbbbghggihdijfknjoplqrnseppemmflloqrwvxsssqqqtrr|zz|}ztuwtvurttsunpqquvrxwy~}w}||||xxxqqqnnnsssxxxzzzzzzzxxwuuxvvyww{yyyruzsv}vyx{|vxzuwzuwzz|y~}z~}~~|wx}}}uzyx~}}|zz|~~|~~~~}~|~}~iw{W~F~]|rdRTXag83@_ULBCUB>?QwnYzgxyg|wpvj{qq{nxh{rh{rdzn`}kb}jlnnkivcgznf{li~oilmpf|hbxef{hg}je{gg|ik~im~is}iu|iy|iv{lu}lq|gpiojvosmqjtnwoplmmrovn{p~qqml~hoktp{~|v[eUzs{t~su|su~x~xyst~nt~hujsmohpgr~fukxluiuixly}w~|x{t~~{vw~}~uwuwvx}~vw~wwww||zz}}~~zyzyvyvywzvyvysv~vw~z{|~|~zv|x|xwszvvkm{stzstytuytu}vx|uvrklrklxqrpqpsusvrqwoovhi{llpegk`brfhqfhtijZ\]Z\]\[]]Z\^Y[\Z\]\^bac^\^`_a^`a^``_aaeeekiiide\hf^jhZhfYhfTfc`edeeejjjiiinnnlllkmmikkhjjjllnpptmnrmnvqrooommmpqnrvqtxsw{vouqsxsuuuwwwooorrr{{{yvryutupqojltoqxsuz{|}z{z{}xyxuw{xz}z||~}z|wvxxwy{z|xwytvv||||zz}}}}|~~~}xwy~}~yz}~~z{}~z}{~}}~|~~||zz~~xxx~|{~|z|vzvt}sktjvvoxnpyoqxs|~z|lsn|~rzsv~ts}qvsvq}xvwuvturspqqurwswtv}~}~swqumqjnptprprlnk~mnpustpm}lqrstnqemXq_j|kr~nv}ngyhbtcrsqrk}ln{kn{kroo|lp}mwtlykjwihuhrqq~puruqq~np}mwtm{oo}rk|oj}nh~liolytc\ubl@}LNBeebbF9XRLN@@\]ZROW<9i`x͒ܙxbz~g{xpykvk~uj}th{rh{re{oalclnowsyfzmh}nmsg}jlodzgawdcyfdzge{hg}jk~im~it}iv|iz|iwyjv}lq|hm}fk}fohpirkunvormklvsr~jx~mqrnokqntpbl\{uv}ny|px~vxryst}iulsnpjvmxlvkvjvjtivk{yz~yz}{}xyz}~~y{y{~{|~}}~wwuu|rrvvvv|wvwrq|{~}{zw{uy|z~sww{wywyxy}~yzz{{}{{~xy{}{}zx}z|y{xzw~z|qsxy{uvupq}xyxrspjksmn}wxtnostrtusxtsyqqyklzlmxmoymoujlrfhqfhSXYWXZ^`aZWY]Z\XWYZY[`^`^]_feg_ab^``accccchffe`a`gfbih_ig[fdWcaaedfffhhhlllgggmmmkmmikkhjjmoolnnrmnpjlsqqvvvwwwnqovzuw{vw{vrvqqtqvvv|||vvvyyy{xt}yxzuvwqstoqrmowrs{uv|vx{|}~|xz}rnpzwy|~{z||{}~~z||suu~||sss}|~~~}yxzzy{~}|{z}~{}twu~}}~|~}}}~~}yz|vz}tr{qktjt~tnwmluk{|y{u|wmtou|wwxwvwuurup|wxwwvvuutp}onrl~qlpsursj~kmqptkoh~lmqoqprmoi|knputtqonqrsunrend|jj|ko|lozigyhbtck}li{jgyhp}mp}mmzjo|ln{ktqq~nnzjiuekxhjwgk{jpoqqpppoo}qrugxkgzkh~lfnlvu|axkgc`gg[.hmedtpvvnnq{uvL@WYd|~qZf|xoymwi|sh{rlvlvkuepgpj~knjvni}plrouawdh~klojmh~kjmh~kh~kk~im~it}iv|iz|iuyjzor|hqilhl|fpivounslpljh|xozfw~mtxrtnuovpoyiztw~ow|px|ͽuowqxpuom}lm~jytuvmvlvmtjukx|v}|z}~xz}~~z~z|}}|zxxww}qq~rrxll}uuzzxx||}}z~y}{qu{lprtxz~vw~vwz{}}z{z{xzvxyy{y{ytrymkzyvx|}{uvupq~yz{uvystmghvpqwqrqonroo}xwwoo{pp}rrzrs{sttlmphinfgRVWTXYdefZX[ZWYZY[ZXZ\[]gfhXWY`bc`bbacchhhfddgbc`aafhhfkjdji`gfikkooodddooommmhhhkmmikkkmmmoolnnvqrtrrxwwsttrttjomrwvsutqtsstrturvvv|||~~~wwwtttwvrzxwwuutqs{xzvsuwuuyww~}}~||zxxpprxwyutvvuw}|~{z|yxz{z|~}~}}}}zzz}|~~~}vuwxwy~~~zy}~}}|~}{{~~|{{z|~~~|wy~~vwu~{~z~|z|||}cee|}~z||vxzpqzpltjs|roxnktj|}jrkrzskslmuot|vvu{yurt~nxsxwwvvuzy~}txqvnroqwxuvvxstrtmoqsoqpruwxzqsqotpsppppqknd~lhmj|km}lq|lhzidvehzjhzii{jlyip}mo|lmzjo|lvso}kqlvrwrjxfrqqpn~mpopolzpuzhxlfxkjpgpltw}xg{syunmvX2xvrhniXYhmkjvbuonNA][iwupsdRf{zi~vg|sk~uj|tlvk~ulvgrhqklk|gq}ilslrou`vckng}jjmknlnjmknk~im~it}iv|iz|ivvh|ps|hrin~gjzcm}frksln~gojj~g}nzfwnx|vtntnuo}wuo~wwr{u|xҽys{uwquoztzxy{tvxvv}pvowovoumt~mvztswr}~}z{~}xyyz{||qs{}~}~z|~|xx||uji{oo||zz}}||zzw{z~z~x|z|xzz{~xz~~~yzz{xz}oqwx||{{}qqww{{zoq}uvsmnojkrmnxrs}wxuop}wxzyxsrzy~uvzrrummxpqwopsklphiphiSXYTXXUYZVYZZY[WVXZY[^]_YXZQPR[]^dff`bb___dbbhcdljjeeehhidjhgkjghhjjjjjjlllgggllljllikkhjjhjjmoorppvttqqqrstputntqpwsmrpnqovtrvtswwwsssrrrtttxxxxws}zy|zzwtv|~yvxwuu|yyzxxyxx}|~zy{{y|yxz}|~|{}||||{}~~{z|zy{~||zxxxvv~~~~|{}xxx~||}}}}~|~|xw}{xs~z|}~~~yx{}|~}~~~~~~}~twu~}tuq||zz{~{}w{{u|zrmvlmvloxnnwmnwmvumvlr|qu~tvuqzpvur|purs~ns~nxuyvzw|y|yrvnsostv{|fxgtttuuvrsqsqsqstvqssqwttrmmsuoqgmimj|konp}mi{jk}lgyhj|kj|jn{kp}myvgtdhuen|jrlohm}fpipinpuvopl~mqrvyv{iyni{oh}nf}nl~sw}x[xYjpciC37}R idL1U0yo -:jM'50ak|)zGOdutk}vlxj}tk~uk~uh{risdojsnom~iq}ipwkqjpkng}jjmloknlomploi|gl}hs|hv|i{}jyyk|orzfp}grjtmwptmzsyrl}ffzcwrnzft~mywtlsk{sͽzuoztxr{xzv}|vyswq}xeshgujxww}rkueuo}whrbvp}}|~|wx|~|~tv{}z||~~|zz{wxwxz{|||||{y}z~|oqynpsklyz}wx}xy~xy}~{}zlnyz~pqxyzlm}opttvx~vw|vwytu{uvtno~xyxrs}wx~|tt{{zyupojfdqklqkld^_f`alfgMUUPUVTXYWYZUWXWVXYXZ\[]`_aWVXZ\]dffbdddddhff\XXjgghhhdeechg[`_bcckkkfffeeedddpppjllikkkmmfhhnppxvvsttnppqvuotslsrnvumrqnootrruqrvvvrrrxxxtttzzz|}y~~~~yxz{z|vuw{{{xxxzzz{{{z|}wyzy{|}|~~}yyyvvvywwwuu}}}~~~}}}|{}~~~{yy}}~~|{zy}|{}}xy}}{||}z{}~|{}~zvu~yzy}}{vxww|}orptwusvtuvtyzv{~~~{{{u|yz}{|v|yt|toxnu~toxnnwmnwm|{u~tt|syxt}svut~rxuwrytzvzv{v{wzvnrottxuwz{tustpqrtrsprprprprqssqvprnnlrqooh~lh~lk|ll~mm}lk}lewffxgfxghzjp}msp{xlyio|lqmskrjumn~gskpqwxrsopl~mivniuojyqhyni}pjrl}ru}xW~p2@[Sg.E?qylCLAMЈbX8zj5>:l@YŸ[^2 1i8Zfqtq{myk~uj|tk~uj}tiscnfnklm~iq}ibvidyjg|mknh~kg}jh~kg}jdzgf|ig}jj}hj{fluaqwdy{hzykzzju{hq}go|fiybn~grk}vyriybj|evoq}iun|wvmululwnģ|xrwq|v{ytr{{}|yw}yss}mvpys{v}|rup~su~tw}rnwjvrvrjtgoxl}swr~{|~~}~~z||~z|y{}}~|wx{|vwxy|~{{zpp}}}}y}x|w{}ptz~|oq~~~z{yz{||}wywy~{~twvyy{z|xyztu}~}xyztt|vw}wxwqrvpq{oovv|ttsnmkhghhglfgnhihbcicdkefLTTRWXX]^W[\SUVYXZZZ\\[]^]_bacbdeceebddiiihffhcdiiihiidhgfkj]cbeggnnniiipppmmmrrrjllikklnngiiprrqqqrqqprruzyntspxwrzyrwvuuuzuvytuwwwssszzztttyyy{|x}~|{{{wvxvuwutvzzzsss{{{xxx{{{|~~yz|y{|yxz|{}~}~|~~~~~~~~~~|{}~~}|~~~}{{urt~yyy~xyrpp{x|~xuq~{}|}~~~wwxx~|}{}~z{|||~~~x{xs{tmrzplukpyopyomwknxlpznr|pq{ousvuvturupxszvzvzvyuxtquv{ʷ{|vul|kpotrtrprprproqqssqvpplpnpomlk}lk}li|kl~lj|kk}lbtc`ragyhhzimzjp}mvszwmzjvrshshzpm~csik~mtvprmok~mlyqiuojyqizph|ng{no|rn~wL|}FJ6[[Urhmg=3sjnZihBhal+uJ'M]j-N^be|kwj}ti|sk~ulvisbma}jmnqmumkrh}ng|mjmh~kf|if|icyf]s`cyfg}jh{fdu`js_pvcz|izzlxyiw|ir}hr}gpin~gn~g|vopiqislumuoxsit`vmulxp~{uuoq{kxsvvmlrsrsxw|vt~nuot~nysv}qvttvp~rus}xu}rrzorzoltilti|{|zx{}|~y{}x~}}|zxy}~z{yzxy||yy{{xxzzz}y|x{}uxwz~qs~vw{st~xy|vw|tu}twy|svy|{~twz}vx}}~xrs|wx|wxztt~xyystxrs}wxtu}ppsjjokjihghigkfgmhiojkojknijU\\PWWPTUTWXXZ[\[]]\^^]_cbdmlniklgiigiiaaakjjlhijnmfiihmlcihfnmeffijjhhhoooqqqpppjllikkjllillnqqwvvoqqnrqx}|ntsoxwq{zrwvxvw}wy{uwzyyvvvwvvuuuuuu{{xz{yxxxyxzwvxzz{zzzuuu{||zzz~~~{x|}~z|zxz}{}vyy~~~~|zz~~}}}~~|{|~||~wuu|zz{{{}~}{{wyy||{z|lmmvtt}}yxvv~~~}~~}~{{{|z~{v~yst}sktjoxnnxmwvoympzns}qwtoymvuvttruqwtzvzvyuytzvsvy~wvxxtsttsqoqproqqrqstrtoplpopomllnlngzij|kj|khzil~mk}lk}lfxgp}mrorom{ko}kpgqgzpm~cqglnvxstprj}llzrmysl{sizqj|pi|qn|qk}uJ|{DzAUYMZ`]~g'{mB9z>jWIq7odjIYFnuUaagdplezpfzoi|rktnwhreo`{iklrntmlrj~pkojlg|ih}jf{hdyfjnilg}jmjwru}oy|i}{m{}mw|is}iukpipjwp}jzczsvoslwouovq\hTvnulvuo}wvpuos}lurxxmnqtkkxwxrwrvqpzj{uw~rwursstvt{vxtszonukrzozvuzs}~}|~|~|~{}|~z|zz}{vwwx~~}~uw~|}||{|{|y|~y{}wy~}x{tv|~~vw|}{|~xyz{wzuxz}{}xzwzx{uxrtwy{|ztu|}ytu{uvztutnouopystwxwxyppyvunpn`daojlpklnijvqr}xy[[]STU[[]\[]ZY[ZY[\[]]_`^`a[^_Y^_egghjj_aaeggkmmfmlionjpnommqnnsppmjjnkkrootqqqppmmmikklqpippjtsqttkqpmwuv|{rwvwz~tx|utz}v}}qy|qx|}zvwytutpqtnpprr|~~xzzuwwuwwwvv|zzxvv~|||zz|z~{{z~{|v{{}{lhi{{{nnnwww~~~}}|~}}}|}{zurq~||vtt}}}xxx~~~}||~~|yz{}}uvyz{}~}uyxw~~wnsq{~}~|z{v~zzvwxts~mvowpgq`oyhu~nu|nrzos}q|}bmctvqvi|qovw{xuzwvsvsvvvxy}ostxsxptrtm|nrtstsutstrpnkifehhnptvqqyzl{noppqmni{jmnhuekvflwgozj|jvdr~isirhp~fpdupqorrtupsl{sixpixphwogvnlznkdqhR{R,kLtJ=BDMn6[rH|"2pQ +Cq#Rc\re{pg{lg}lh~mi~ni~mlqknnog{hj}jmmupuotns}lozigvdsrcvcxxfyfi|jn{ismnxgu~mszinxft}ls~lsnrnwurqwuwu{yrorotnumvmvm~ss|guj|pxmhtdhvhn~pptpvqvuwuvqrnmporqurxuyvxvsssstuqrssss}~{~|zywpmkidbw{tzzoq|}~|}}~|||}}}~~zy~~~yyxxy|y~x{x|x|y~x|wpsqnpyvx{xz|y{{}xz|}yzyzxst|vwvpqzstxz~suww}}utvvyzss{|ztuztvxrs{tvwqr}wx{uvqkluopxxzzvpoqonmpnopqping`drjpxqu}v|QPRXXZPOQXWY\[]gfh_^`\^__abZ^_Z_`egggii_aadfffhhgonjpolqppnnsnoqooqooommsqqtrrrppmllkmmmsrltslwursspvujrqqwvsvvux|swzvuxzuy}sy{qv}{{~||sqqsqq}}hjjuwwvxxvxxvxxwuuywwwuu~|||zzy{|}y{|{|}|~~{~x||}{{{{{{ttt{{{vtt~~zz~~}||zyxvu|zz}~|~~vwy~wxw|{~ynpy{}~|{~{}|~~~}}|{yy}|~y}v}|~yvr~wxtvwst|kjrafn]jraqyhu|nu|mr|ns}qxygrhnxnn~smugynvyurvs|yq{nvtn{mvx˼exih{lnrrvosquvvz{rrststsrroljnmd}chhlmstoouvpqprmnl~mhzij|kerbhscjtdmxhytkveo{gp|irhp~fqes}olykn|msuqukzqixpixphwogvnmympdrfN{t[/iIwS:FMm:\uV:`ehp\fZa0s*+s [ud|ph|lh~lh~limimlppqpqj~ji|igzgr|ks}ls}ls}lq{jlygzvvuttg{hi|hnzho{iisbt~moyhnxhwpvqtponq~psrvuwvzyurpltnvnvnvnumq|iwo{sxpzxyzuxquqwqwuwtvprljnmssvtwvzvzxrsqrvvk}lmnn}oz|zwxvzxwxts}|vt~~}~~{t|}z|~|}}~{|zz||zzxxx|}x|x|x|uzsx}}|xzwrtxop}uvyz{|z{wxwyuwxx~~{qqwwuv|ppyzsmnztuztt}wx|vw{|yzxrs|vwzzuuytspnmmomlnnslqpinwpurkptmr^]_YXZpoqihj\[]QPRTSUZ\\`bcZ^_\bbbddeggbdd`bafhhckjflkhmlmlkpklmkkqootrrtrrrpponnmooopqlrqtyxu}|zzzputnvuqwvrttruwttyvtxysxv}zsvzxx}}ywwwuuvxxxzzwyyvxxvxx{yy|zz|zz~|||zz}|xz{z|}~|~vzttt}}}{{{trr{y|{~zxw{yx|zy|zz}}}}{{~~}~}uv~{stxu}~~}~}~}}{tu}|~|zz}}w|{~~~}y~z~zy|v{{{{}~~|~~{z{wwniq`owfjraqyhw{mu|ms|pt}pusnxnpyotxgzngqdnxkt~qs}pwtvulprvrvosososorpsorpsm~psrpoj}jnmf~ff~fmnopk~kmnstrshzii{jhzhfxgerbfscgtdfsco|lhvfnzfo{gr~ip~frhvtsstttvl}pjzphxmhxmhxmgwllymn|eq}fMztc6[CЀK8h?Lm|a artzV`Sۂ#V}nu.o(WXgQbhtj|nh~limimimlpopopg{hh|ij~kt~ms}ls}ls}ls}llxfn|jm}knng{hg{hnxgnxgdn]unoxhluhxtvstsrsvuxwrqtrxwwttotnvnxnxn~zgteerayw}yxzuyqwqwuwtvopjinmssttwvwvzxrsmnxxgyhmnp~pxywpqorpoxtsw|{~y~~~ttxki|wx~~||zz{mqqwx|x|x|uzrw|ux~{}~{}~{}{xzyuwxrs~xy||{||}zoq|~wy||vvuuwx{ooz{}wx|vwztv}wxztuyz}wxsmnqkl|wvtqpqrpqqqslquns{tyslqrkpRQSXWYLKMLKMQPRcbdedfZ\]acdY]^^cdeghgijfhiZ\]lnodllglnjmomjlqlnsqqnllpnnsqqpnnjjjputotsnsrqwvntsmllsxwsyxotsvwwsturtuurtzuw~~y{uuulll{{{y{{vxxxzzwyywyyywwzxx|zz~||}{{yxz}|~~|~|{}{|wy|}y{vvv}}}{zzqml|xw~}{zzxwxvu{yx~{yysqqtrr~||~~|||{yyyz||~||{{{|}~{rt}{zy}v}|w|{w|{y~}|{||{}v}{}~yvx|y{}}|}y|{|xzoio^tzhkq`syhv|kw}lv}nt}pq{os|pvuz}ntsxĺT^Qlviyvvst~qt~q´ptlprvj}norsvqtpsm}pvuqpk~kj~jjje}eopklgzgfxgturscuddvegyhdveiwgjwgkxhcp`iufhuep|jq}jq}hp}gsir{qwxssiwkj{mjzngwlhwmhxmgwmk{nezdj}iM~]9ſN@ъT5lRCgn1\{KnM(Zz%OJf5|'aRY* +jiFY{LN~n|itnqkoloknknmojvdjzhi}jhmemtmvowoxqun[eTgratnrntntyirziozhk{ii{ijollroqzv~tttsmyl`m_wwyytuwvsq{x||vynxh~v{tr~pn}npssvvzsxxzrtoplklkjnknmpn~ql|oz|ewfmnpqo}oxwvzzxspp{wvhba~~|tqqv{x~~z}~~~yy||}z~w|y|z}{~{vzz}|wz}x{~{}}~wuuwpqvwy|w{sv|~zrszyzz||zzzz{{}wx}~|}~xy}wx{uv|vvxrs}wxyst|{trq|{zvumhgwqrunsslqpinrkptlrNa`O`_M^][ggR_^[baX^\]__^^]d`aighaeifknijn\^bonrffimmpkimhgkjimilminoionlrosyvhmka_afce{x{urtqnprpt}}}}}|{ppoytuvoptnoxst}~yzzyyzyywvv|}~x}|t{ztzypvutvv|~~~~~yyyyyy{||x||z~}|w{zqut~||zxy|}{ww{|y{zstxyy~~~}~~~~~}{z~|{~~}}xyw~|~~y~~}~~~q~{wrsyz|}~~{}}}}~~vtsprpz~~}~}|}{v{yvwrxu~|v|t}ywwsy{uwwsuwq{{ouygw~ku|gt~hwlxqooezhf{hk}knxkpzms}pxut~q~z{w~{yxo~pk{mmqososnrrvstqrmooqprl~qhzmnrj}lnnmmq{kq{krzjtzktxiszkoyimzjonhzigyhhxghvfkxhlxhlxhmxhmxhnzhtljvbn~qbqej{om~ql|om{mtto~pl}olpotl}tl~w_TXgrqg9"xdgc]9=LCMX[j@Nl8]ƑIFNIFUreovipntostvwyvvrqh|if{hdlbnanopspzuzszqx~mxowpuoqomo`kgmk}kr~lw~mrwkv|qt|tq|tn{sz}twxvuvrwryqwsvvxwt{t~vx|uxqqmtowrwsxtyuyvpmtpfwbjzeqqrrppnnwxj|kgyhRdSdverssr}zuzzroxx{}~}~}~yz|}{{}~}y}y{{xzwwyxzvxy{yzxvuorouwwqlovzz}rtupq|vw{|z{~xy}wx}~|}~xy|vwystwqrxrs{uv{uvwsrrnm|{zvuzvu{wwxsumglkellipsoxNdaL^]ScbO]\P^]Zba\baegga``hffgefejmcfjefj`_cposfgjlmqjkodeibcg\acbghntsionnuplqowtv}z|zwyoln~{}vy{tu~xwzttyz}wxvpqnij~xz~xyzxx{yyxxxz||x}|t|{rxwu{zuww{}}wwwyyyxxxxxxxxx~v{z{v{zw|{y~}|||vvv|wxytu|}{}xyxxx~~~|||~}~}~}~~{|z}||}z~zwsyxzvw~}||}zzt~v{zvww{~~~~~{y~wt|tvrxxtxyuvwsvvjuxhw}jw}jt~fsiwpqqrupsklu~rs}pr|o~zzw}y~z}zzyuyosptrvmqnpoqnpoqprnshzmk~ok~mllk~kpzjpzjqzjmteptfpzjmwgkxhl{jfxgdveewfhyhmzjozjozjp{kp{ko{itllxdm~qevim~qj{nj|osrkxjn}onqlpnrs}tvxmXNgpZ>wpMNO6+**&@;0"}|v&}xhfnlQ(op%{z%zykj ut$yyf^K[{toxlvptprrszyvrrrlmjmip_j[jpquuwt{t{qypvnvornpnmndnhnlltnwnxrw}sustwrw}wxywrvpvpxpvquwwvu}v~w}v~wz{{vzuzu{v{wokplhydm}hrrppppi|igzgj|khzh_q`fxgturq|w}x}tqvwyz}yz~y}~xrs}~{|{|{{w~{yzvzwyy{~||zxw~xzzvsuu{wzps~zuv}~yst}~~z{yz|}|~~xz|vwyz|vw}wxztvztvxttrnmyutvrqmihplktoqmglkgmomrroxJ\[L^]VfeR`_WbcW_^W][Z_^bddghhffhehmdglnntecijel_chhkpfjo`chcfktz|puyjoppvuovsnsqpmo{xzvsuznqz|xx|}~uvz{wx|tu}wxxvvzxxxxxwyyuzypxwlrqsyxy{{}{{{xxxyyz}sxwmrq~tyxfkjzzz~~~~yz{|~z|z{{{{}}}yyy}}~}uvt~||~~{{{www}vxxz||}|~|r~|}}}}|~}~}~v~|~{w}|~~v}vrtpwxtxxttvrzznrufw}lv|is|gr~i|wyyoropn~lssq~pn{m|{~vr}z~wxsvquospttxj}nlnoqoqproqnsk}pj}nlnj~kj~kl{jnzjs~nkvejrcp|llxhhxghzigxhmnmnn~mq~ns~ns~np}mp}mqmuoo~im~pizlpshykj{mvusrpqrux|oqt|q{~tq}ta}JS;zoAwDyCyJ|nOrFr9o4s.}hFpLu6m2|hH~oJsOxOx=ueMv\}\z]{UsXxXy]]a\~_^hm~p{nztxsust{}rrtrnplpiqblamorstsrytzsxrwpxrtprpppfninpprntnxuwttuuwty|w|vxwtvnvmtm~smrvyzx}{v|wyt|w|w~z|y{xzwyvyvxwmkljfydi|gttooooh{hexej|kewfj|kewfnorq}t|yt~trusz{|{}~}~{|zz{|z{vpq~}|x{w||vyxzxz|~~~y{{w}y|psxzy{~tvzrs{|yzz{xyyz~~yz}wx|vwztuztuzttzttyutuqptpo{wvsonuqpqlnmhjnjnnlrroxRdcScbTa`HTTVbb\dd^cdfjlbghcghgln`chilqijpeekihmaglmrwkqvtx}ekplqusx{mrspvvmsqdigroqxuw|y{plnvntzru~yz~{uu{st{{{stvooxxzstxvvzxxzzzsuumrqowvoutsyxuwwxzzturwxvwxvyzx}~|vywz~z~}{{{|||{{{{{{~~yz|}wy~vwyyy~~~~|{~~{yyyww~||~||z{yvwu{|zrsq}{{~|||{}ywz}}~|||zz~{|~}|x}|y~zzyy~}~}~|}}ovo{{pqmwxtvxtstpyym{~osyhsygs|htksppqswi{jlyivup|nivhp}ovtwsvr||{vwtwqunrququk~ooqprnpproqk}pk}pk~omoi}jg{hj|kk|kn}luqytopk|khziizjfyhnpk~mi|kn~mp}mp}mo|lo|lo|jqko~im~pl}otwgxjl}oq~pjwiixjhykh{lk~on~or|mrrfrazczVmYpXoVmdpgoctPhKiSm`n_l[n[lhogpisfpZycjsrwruuzwzswoswxrruvxywxxqk}n~s{uxqtrsqosssupumvqzs}nsmpqrwtztxsuqvrwrtrrrmqloqqrprosqtttutwuwzvw{ru~tswlth~rnvpurutvutwtvturqnspururvsurspro^q\dwbi|gfydk~ivvmmoollgzgnndvepqmnk}lrpyzqywo{vqvs{yz~~~~v}|vw~{|ystxz}~~|xtso~vyy{xz|~twuprr}sxrw|zty|stzrsyzyzwopxpq{|{|~z{~xyztuwqrystystystxtsvrquqpplkqmlplkqlmlgiokpihlqouK[ZVcbYgf]ii[dd]ee[cc]fe_gggmn`jlbjrjqxjnvbembbk\fmW_fXah]emdmtnsxptymrupuvu{ztyxjgidacjgi|y{roqmrusxyryxfljnvsxrs}qtvx{or~rt|tuxvv|zzzzzy{{uzyqyxu{zsyx{}}uww{|zz{yuvuxyw|}{}~y~}w|{tyxx}|x}|{{{|||{{{www{|}~ztu|tu{pr~vwxxx|||~|{~~}~~}{{~~|}{xywrsqxyw}}~~~zy{~||~~zzz|||~{~z~}|{{vvv}~|{{x}~pvtkpn}~}~}~zrsoxzvvwspqmutjy{pqvgtzis|htlp~p^qbpthykqznstrsstk{moqzvwtkxjn}owzptlptxtxnrmomonpoqoqmrj|oj}nvxfzgpqlnmpnprrtrf}kf{ifyhh{jh{jh{jexggyhhzijzilyiizil|kjzhhydhydj|kl~mnoj|kk}lrqvum|nj{mtxjq\}ha{hd~ijs`nhmchlqkpkqoqpqlsnycufw`t_sbsmvjtkvlymxhugrdxl|p|vy|{|w~utxvuswtpf}e~iztytwuxwxuvxyxypupwryrzt|b}ilqtwttvsyvxvxvwu{wzxuvrstustnnproqorptl~psypv{ruuqvmvpzs{szrvpqprqprponf|dbyanlrproqopnomf{dkih}gh}gh}gj}jttttk~kmmpql~ml~mopcudp~nuznyzpzvwszxzw~~}}~~x~}~yz|}}wx~y{w||wxy|y{xzwy}}~wzxhjjy|w{vz|~{}xz~vw}wx}wxyz}wxuopztuyst{uv}wx{z~}qmlmihtpowsrplkkfgurs`_cnmqIWVM[ZR^^\ffV``dknfmpajm^il]hjesudrxmyoyrzow~n{q|iu{vspv}oswotwsx{puvtyx{xzyvxzwyurtc`benqdnnkvtjurkvswrswyvx|rtzpr~wwtrrwuuwwwvxxrwvowvjpolrquwwsuuuvtz{v}~y|}y|}yz}zx~|v{zuzyx}|x}|www{{{|||zzzxxxzuvz{yst|~}~uuuwwwzzz|||~}}}~||~uvt}{{}|~~}{{}}}}w|{z|||zy~}|}~|kpn||rsoz{wvwsrrnywowymtyjtyjs{jtntvvzptl}noxkpqssn}olzlkzl||xurhugkzlqth{lk~orvtxquprproqoqoqmrj|oj}ntvh|jmpjqlrnrprmob|jb{iczhe{igzif|jdzhgzihzijzijzil{jl|kl{ik|ggwbmmk~kk~kmmoolzlmzlixjk|ni|mb}kVg\k_l_mbootototptpuw|y}u}p{kxfw^{Z}h}myezh|nlh}i~`emv}|~nvqyt|qzqyf{e~azhztxvztwvwvuxuwvryv}pwryt{s|pwotstttvvvvvvyw{w|xxwttuvrvprmrmroqnrtxyzpvlvmyr|r{qunpoplnopnqwy{~qqmnnnmmmmmm`xbg~he|fe|fe|fi|iyyk~kk~klll~mhzipqwxi{jn~mvznyzp~{s~xs{w{~}}{|z{|}|w|||~{wxy|tv{}{}|zy}~dff}w}}u|zu{wywyuwy{{}~|vx|vx~~zz|vxztusmntno{uvuopmihmihxtswsrsonokjsonnjiplobbckjoQ_^R^^VbbXbbV^^[beV]`^ik^km[ikgwzbu|izgw~cpxgs{erzanwbow^ksgt|mszru}z~{puvrvwtqsroqurtsprpmomrvsyyovulsprywxqruwrtrtuw{prussvttwwwvxxqvugonlrqhnmz||xzzturwxtxyuyzv||y|{x}|vzzuzyx}|x}|~~~|||xxxtttxxxwrs|}{uvy{xyttt|||{yxzxw}{z~zxx~{|z~}}}{{}{{}{{}{{}~~nsr}xzz}~yxts}|rvtz}lqotyw}~zvwsxyuvwsttpzxpvwnwzouzkt|ktnqupwgyliwkszonqrunqdugizlzw|xurivhm|nrurvptswuyrvprnpmooqoqmrj|oj}nrtklmphqjrntmrko`~jb~kc}kf|jj}ljni~ll~nk~ml~mn~mmnl~nmmnldwbk~kllmmqqrrivho|nm|nm~ptxkq_n]nbr`mepp|r~p|q}p|t~u}s~p}kzat]|Y|l~sxcwloomnkpsq}t{v~o{lxq}o|sjym|kxjxjxszuxwxwyyxwxpxu}pwpvsxnzovmtpssttvsvwvyw{wzv{wxvturvoultkrlrptpszxywuvpvkvmyq{qzouoqorlmmonpuvxzppllmmmmmmmm^t^g~hg~hg~hg~hnnnnuuk~knnj|khzimnstl~mn~mu|ox|p~{s~xq{w}|~~}wx|vw}~yz}~}~~{||w{{~zzwz||{}{}rpotvv{xzzz}{sxv|vyuwtvz|xzwy|vw|vwz{z{|vwystkefgab{uvztuvrqxtsxtrvrqwsruqpurnplkkjiedfjikKXXIVVQZ[V\^T\^ZadX`e\fkcpsfvzh|Wntezau|asz_pwaqxcsz[ls_px`qxfmuqu}vzw|v|~z|pmotqsvtvuuxttvwxxnpntvtvwtvuwtv~rt~tuxuuxuvzzzvxxtxwmttlrqotsy{{suursoxzs{|wz|vyzuw{vw{{vzyuyxx||z}|zzz{||yyyvvv~~~xtuz|}tvzst~~~}}~|}|~|{urr~}}yzxxyw~zww||yz{|}}rwv}}~tvw~y}|Ȫwytxzuprmuwsuwrwvmxzox{ptzku|kupx}qwqvn{o{wrurtruruk|n|xz{}yyuvtxsw}~wzqsoqlnoqoqmqj|nj|nprnnlpisktksntkr_ldmgnh~lkporkqprnpopnpqspqqqtsexdlli}jj~krqssut|~x{vzpy`lymvonopno|o{o|m{sqe[{r|vuqutuy}zt{ows{r~utr~stvsvsxkvdwoxrwswuwvvstqywmsoupulxjtjqnrtuqusvtvvvxtyrxtwuqqounumsmtntswrvywzwwypvkvlylwmvrwrsrtkojnhlhmbfjjnnnnkkllmm[p[g}gkkjjkjnntsmlnnoottsum~nhyij{ko~nu|ox|p}|r}xq{w|~~}|z{{uvyz{|{|~~z{~}|ytrvy~~roouwvxyz~z|y{zzyrx|qsz{wyz|yzxy|vw|vw~xyz{|vwzstxqrunp|uv{tuvqpupowrqwsryutwsruqoplkjhhijijikWZcPT^PT`V[iRZgU^aWbc\kn[qv_x_|]z`{[sy[qvdy|gtl|VntTqtVwwaq}dn|ir~owt|t|v~w}||||yww|vwtttxxxvvvrrrpppzvw{vvrmn{vwvqrwttnomvwu]^\pqoy{ytvty{ywxuyzwtwuuyvx{yy}yz}|orp~||zvw}~z{}vwzww~{{~|||zz}}}hjjyzzsuulmmtvvxzz{}}}~yzz|vxx~}~tus~z{{|~~~{|xxyz~x}|{Õz~yvxu~rurdmat~qqznvpt|moxhtos}nztyx~~wzttvuxw{z|zw|yytt{oqoqsrqopntqp~nuu}zkzevdxardrhrjqpqopqpqqpozyntjpmunvfohny}rvrtrtstlnlltsyv{zktitcmancrr|r{r{wwus~sr}tp_fnx|ywrsvs|xw|w~w~xyw~rvrxoulvjulvmvmvkululumusyro~xmwjtktktjtpunqrspprpspuptsmpjqirntotquswpvptnrqunrotospqpqqqpoqqnplnmojlklnnnnnnoonnpmr}gs~ht~jzru~nqzlyur|nnwjs}ou~sxvt}rowmt}rv}sz~rz~s|}t~|t~y~}{vw~xz~}~~~{}xx}}xw||y|y|~ru|~uwwyvxz|wyy}y~|sy~u{|uz{yz|{z|y|zzx{}{y{|x{}zxxuztu~xyyzyzyz}rrtt{{ttwwpqwxrsttuuxxsmnojkoijliijjjSU_QV_IMXW]jRZhT\_Xcc_nqav{YryYv}OlsToway}\pvdwzep~l|[rxVtvZ|{cuiwmyis|nxoz~ovvpvuwxxzxx{uvtttyyyzzzssspppvqr|wxwrs{|upqvrsxywvwu|}{}~|stropnqrpvwustrqtruxv{~|x{yz}{rus{yy{uv~xy~vw~~}}}{{zzzhjj{}}z||uwwu{zz~y~}|~|{{~~z||v{z|~~trrxyw{}}}~}~|||}}}~~|vwx}~|}{z}|~z~}y~||tztire||s|ocl_unuonxhuounys}yvvo~ppstwutrqrqq~pn{munxovmslystouutty}tzmti|kwyqsqspop}mq~nwtn{kqp`zh`|igufxcvfuhuluottvsstsuttsji_z`pumqnwowishopwnsrutuoplmonomnjkjjqjtgqcpbpnvqwnvu{t|rzrzrzu}u|p}hkiyx~zxxuq}v~~x~x~w}x~v|rwpvrxltislvlvlvlvlvlvowrx{zgxcxlvjtjtjtjtglqtnonnpnpnpnmmmpipgpkpkpmqosnsosswswquptprqpqpqpnmrqnplnmojljlnnnnnnoonnpmt}hvjynu}lt{lt}pvrt~pmvixtv~trzpwurzpv~txuz~rz~s|}t~|t~y{}|x}{z|||~xz~}}||{tw|~suwyuw|~{~y||sv{~}~ussz{y|x|z}~~z{zvyzvwxt{uv{uv~xz~xz~xzzzznnxx~rrvvqrstrrrszlmh^^ojjmghfabtrrwuu[_e[ahMRZZ`jLU_Y`bbkkitxarxXltVnvVqx]uzkatv`ps`kwlz`uzYvw[{zaw~bt|brz]jsjw|r}nvvpvvxzztrr~yztttxxxxxxrrrrrr|xx}wxsmnrlm{uvwrsrsqz{ywxvwxvopnrsqkljqqotusnomy|zvywrustwuy|zwzxzxx}~uopxy~||~~}}zzznpp~{}}uxxw}|nutv|{w}|}}~~uvv{}}}}}zxx{|}~|~~{~~~|xy~~x~}|~}|}{~}~|{ywvrpo~|{~{}|vrhqdireqzmhqdqzmt}phqdqzmr{os|os}pjtg`n`gvhnqrqp}oq~pmzlkxjt|kwkr{geq]tln|gsqqqx|wzovmovxz|susuqqononyxl|kopiogpjtjxhxkwmwowrvuwtststtrqutvvpunspvnvkshpmtnuqtptproppoooljkjjplthqdpfrptpvrysytzszrzrzs{s{o{jlp~u}}~|zytq~t~v~x~x~yzw}twptv|goipnvnvnvnvnvnvowqv|{plynvltnvltltazftwmnnnpnpn|zppmpiphpininkok~ol~qmqswvzosptprqpqpqpjjtsnplnmoknknnnnnnnoonnpmxlymwlpxgnufnwjpylvrireyuwunvlv~towmrzpu}rz~rz~s|}t~|t~y~wys}~v||}z{zy~y~~~y{~y{|~|~zzww||~~zz{vx|~}vytvxzvx|z}vmpwz|vwvttwxv|x|z{x{x~{w{zvyzv}|x|vvwqr~xx~xx~xxxxuiiznn|ppss}mn|jkrsqrwijtiinfgmghfabrlnsrq]bd\bfMSXU]cPYbZbbgnnjuycpv_py_qyax~i~i{iwzeqsZcpkwaty\uu\{xdy|btxk{^lrgszkwyqwvtyx{}}tttvtttttuuussspppvvv~xywrswqrztuupqvwumnlxywwxvrsquxvz}{twusvt{~|x{ywzxuxvsvty|zz}{vvv~yz|}|vw}{{zxx~||yww|zzxxxvxxsuu|~~~{y~syxzw}|~~~~~~}{{~}~yzxz{wwxtyz}~~}}~}{yyvww{xw|{~}~|{ywv~}}}|}vuzwy|y{}xvu|{{t{nv}prxkrxkqzmwsfobs|os|oqzmu~q{x{ztum|nq~pq~ptrvutsv~mylmvbep\nyeo{grppnvyuytyqssuy{vxvxvwopj|kyzlnqrrvmtkrhqkvktmtotqrrtqorotqsptqsrosmqovlsksfnemgnlqorlojlmnqorotrosoulsepfpmrkorwrurvrvrvrvsxuzs|eyj{tu|vytylpqvw|uzmwkur{x~v|v|u{v|tzsxovzltmwnvnvnvnvnvnvpvtxrpzt|snuntovntmtbzfuxopoorprpcvclmmpjognininkok~omrptj}nh{li|mnrqsqpqpqph}gutppnnoonnnnpnpnpnqopnqmym{ovlyp}uu~qnwjr{nt}pt}pxvnvlrzpnvlowms{pz~rz~s|}t~|t~y}|y~|~~~}~{}|~}zzxxuuxsu{}}vywz~}vy{~y}zory|z{{}{{{uv|}{~z|y~{~{~zxtyxt||x|vwsmn~xy}wx}wxss{oovjj{oo~rr~no{ijyzrs{mnqee{strjkxrslghmhiSYWRZZSZ\S\`[gi^cd\`aeinbkrhq{boyg{hyjw{jvxforemwfpxasw[rq[wrdyxhwyjxzbmqiswmuxtyxqwvrttxzzwwwwwwxxxtttvvvxxx{uvypqwxz{}uvztuwxvnomxywtustuspsqqtrnqouwurusz}{xzxsvtruswzx{~|tvv{{{{vw~~|||zz}}pppqssy{{}~{~~{y~y~v|{~~~zzz~yz~xy}~xwy~~~~~~~vxzz~xvu{~|~}~~yxw{yx}~|{|zz|z}~|ywv}|yv}vs{z}|vv~qrylpwjw~qw~tv~ss{pszpt|rv~ts|pvrxutspqsrutts}|utzpszg|qlwckvcq~jp~lspuwvysxqsnpqsuwwyprruwysvj}lpqqtezhf~lgnlqlonpmonomjpkrnsookifjlhlhmgojpgqhpfnkrjnilinoommpnqooqnsnpiqdlkna~e~e{hqrptotototpunvhyjwoxmrx|zotrxqwtymtqxrwuyuwqurxrxtzrxsykpu|wpxqwqwqwpvpvmspux{omzszqptqtptpsnrjmlonommpnsrfzgi}jmplpkpinjomqnrnsrvquj}nlpnrprqpqpsrf{etsnnmmoooooopnqnqnroroto|pymvkv~mxps|onwjt}pt}pyuu}sltjs{qwuxv{x|tz~s{|s~|t|w{}~|~~z~x|w~z|{uuyz}vx}~|wx}~}}}zz~~wwww{vx}z||{~z}{~wy~ukm~svz|yzwxy{~xyzxxpqo}zvzwskhzsp~{|yuttp|zv{uv|vw~xy~xy~xy|||||pp|pp|ppxhiqrpqqrrsuu{prqhinghnhirnoSZUS]XR[YS]\Wcc_dc]bbdhmfkrjnyenx\krTdf_lngorjpqdhtfowdqu\rpZtqetqcom_iiipsqv{vz}~prrwyy|~~xzzwwwwwwyyyxxxxxx}wx|tuvnowx|tu{uvopn|}{rrp}~|otrlqoqvtqvtx{ywzxwzxvywwzxwzxqssvxxonnwrs~||~~{yysqqwyyy{{|~~}|~~yzzqtt~|~~z|||~~wyyz|||vwz{z{z|~}~z}wvx|}y{}~zy}|~{z~zy~~}{z|}}syxxuw~~}~}z{y}~|}~|}{z}{z~}{z}|{~|vqlqp|y|x}wwxv~w{ovznx|puymz~rt|pt|przoxuwtwtv}ps|oq{nr|oq~prqq~po|nn{mo|np{io{gmxdhxcdt_m}hq|jrntutwtxrtprrtsuuw]sa`xfrwqxaxfkoopj|kwxsutuopmnnol~ml~mrooklhplokjgehhkfjejhobncnelgndkhlillmmlpmqnrrnrhihlgmimb}c{{i~gnmoppppppqqrnritnvsyps{zx{ruortwuwwyx{y{wxvxtxpvpvpvpvqw|qupviqmvrxrvrvqvqvnsmrtvolzrzosttututustlompopoopnppe{hh~klplplpjojomqnrnsj}nnrptnrptqsrqrqpog|fonrppnqoqnqnqnqnqnqnqnsnznxlvkv~mv}nt|pqzmv~rvrzvu}sqyowuv~txvyvz~ry}r{|s}u~x~~|}~}xz~~||yyzz{}~||yv|~~yx~}~~~yzx~z}}zyvzwtnkzvr|yu~xx{uv|vw~xy~xyuuttxxxx|lmnouvoptfg{ooxkmrhjphirlmpjkT\VVaYV`ZU`]Xec_dc`bcdcidfneeqbhq`or^ingorjophlmjluhovcps[om[tnbpkgolhnlknoqsxvvznpp{}}z~puttttuuuxxxvvvxpq~su{pruwzoqvnoyzxhig~}opnuvttxvrwulqoptrtxvvywuxvtwuy|zwzxvywrxwxzz~~}{{wuu|~~z||{}}|~~|}}~}|vvuxvv|~~xyy{}}opqz{yzy{}{}}|{~}}y~{poq}}}~|||{z}~}||zyx|wrw~}~wxv{|znom|zy}|~wl|zs}xu|~|{{z~rrvjtxlrvjuymrxnpxorzppxnqyoqynu}ptzmoxkoylo}np}op}omzlkxjp|nn|jeu`cs^k~inlgzenzhr~lprttqurttvrtsuqsjohnntrxjpnrophxgqpjziwtqpnnpnl~ml~mojnhk~eqjpikgefgjgkglinbnclblcka|hhlhllmklnmontrophiildjkjghtskjomppnpnpnpopnrltqw{~vwvvqtnriltwswtvvw{|wxvxtxpvpvntouqw|}txpvksnvpxpvpvqvqvnsnqg~htp{szorrttuuttsrmojnmnnnqorri~ljllnnnnnhmhlimlpl~qdwhgzklpnrnroqpopooni~hh}gpnnlnlpnpnrnsnsnsnsnunvjv~jwlypw~ot~pt~pxtwsvrt|ru}sxvywwuqynz~r{t|}tw{z}{~~}}|}}{{{}}~~~||yy|||~~}~|~|zw}}vvyyxxzzyz{yyxyw~{w}vs}tq}tqupm|x~{wz{}wxz{yz}wxznnxllwwyypqopvwstqrymmwjlvhjsllvnokefW`WZd^[e_[gb[je_dbacebageendcodep_ko_imdlohnnjllgirhnteqr\nk]rmkupnrnpqqrqsurwurw~~~nppoqqsvvnrqwwwxxxxxxsss~vw~su}rt~su~tvwxz{zpqpwxwstrrsrryvipmu{ymsqu{xsvtuxvwzxwzyx|zx{ysxwvxxzzzvuuxvv}}}{{}}sqq|{{{|||~}}~~}||~}wxz{xsty}|w{zvzyvzz|zuv}z|~}}~{w|uruuqtwvx~~~}}|~|yzzvvv|}}~}{z}zxxvwpv~}|zy~}~~~y|}|~z{~}zsqvjvznrvjrwkoukovlsyqqzoqwoowluynrzmqzmozmozmm{mp~pp}pmzmo|osrrpg|fnmlmg|flxfn|jp}oqsqusuvxsuqsorkpkrgoksltmrqpyxvsivfzuqoo}mononmnnhtmysoiojjgcdeheidhhkdocndmckc}ihkijkkkjmkpnrpsqxxtukmkjqpnmompnononononpoopouqvlomnrqnni|ih|ivwtuuvqqopvwvxvyqwqwntpvsyyv~x~szpyrwqururvrvoskmsstozrwlonqpssrrqqmnh}ji~kllk|jk~kinknknmnmoeje|ie{ii|mi{n^qbbufj}nmqmqloomnmtryy|{qmmiliqnqnsnsntnsmtmumt|it|iyp}uxqu}qxtyvxs{vowmwvxvt|syxt}r{t|v{|uw}~{zwu}zw~}}~~}xy~}}}}~~~~~~{|{{v}}xw}|x~wu~{xwtxu|tp}vs{x|yuz{z{}wx}wx~xyxy~rsymnwxvwstssstrrtu|ppuhjylnzoqvnojcdV_gW`gS]b]hialkcej``g`chein`ek_fiajmdknglogkofimijjqrrmonmooeggsssonnpnnmkkwtuust{yyqppsqqxwwvuuvxxwyyuwwuww}wx~vw~rt}rtvxvxxvzxwzvuxvuxqps}zvxty{vuxs|~ytuqtuquvr~vwsuxsx{yz{y~~zuw||}|}|}}~xst~z{|wx~z{z|z{}yxx{zz~~~~}~~z{{|}~y~x|wxzzz~yyyx||y|z}}{{~y{}w~z{}|w{zwww{|}|}}}~}ky}}z{w}zqwtpspusq}yxzwsssnvuquwr||xt{tlzokzoizoi|pi}qknnqnqjmjmpskojmlmkkjljninglkpmsnrprprrrpprrrrsrtsqqnnr~np|lXeU^k[gtd]l`ld~li}lj|kqzhjt_hv_g}dccddbdbcigiilij~kj~kk~kgzgdwdpjoilihkejfjuksgperisjojwqxrokminlnmnmnmnmlmqtsvqrpok~iop}~stuvuvqrmnnostwxturvtxuxtxw{lxqztyuvspys~t{txsusrpnloks~jwlx~kt}lv~mwnv~mu~mp}im|gi{fh{fg|fg|flklkmkkjh}gg|ig{hcuenrk}ph{lgzkfyjh{li|mgwirxntzpsxopwmoulp|kiveevbrplimpp~ru~ryt{|rzzqpxoqypuwyzsvw~xz~v}w}u~uy{fqlv~zt{wv{xyzy|w|x}~~~}~{}}}|}z|uv{}z{y{ytuy{vxrrtq~|wtxu}srrlm~xy{uv|vw}wx|txrjn|tx~w{ytp{vq}xs}xstok|vrylnxkm}prtgivjlR^hUaiQ_eVdfXhg^cf`beadhbgj[be`fjbhidiicfggiihhihhhjjjnnnkkkdddpnnnllpnnnll}{{qoo{yyywwussywwywwvxxsuuuwwuww|}smn}vwxywyuw|{~}{z~qptmlp|}{wxv{|zz{yxyw{|x}~z}|wxtxzv{|zz{y{}||||||}~{vw|~|vv{|~xyz|z{wxrt}{{}}~|}{||~z~z|||xxxvw{zz{{yv~~xx{~tyw~|{~{{u~|}z~x}|||}}}}}y~w~{yx~~~|xfxwyz{x|uzxlom^_]}|srnrqmijfvvrvwsnvoiznjznhzng{oh|pimkomqlpquh~lnrvyilmnmnhnkqgmjpjpkomomomno~nsrsrsrsrsrpnq}mo|lco_fsclyi]l`lc~li~lk}lrzjnwckzce|cabacbfbfhkijjik~kk~kk~kh{hfyfpjpjljfjcjeisirhtmk{crjnmgffellnmklklklklklllmpsvtuqpmkklvwqrqrrspqopopsttuttqtqvrvrwrverlvsyuvsruoxounsorpomj}hj{fnzft}iuzhs{jt|kt|ks{jrzip|hn|hk|gj}hi~hi~hkjkjlji~hf{ej~kmnfyhptnsk~oh{lexifyjh{lizlrwnqvm_d[ineuzqupn{kjxftromm~pp~r{x~wu~|tyzyzq{u{r~yx~yz~x~z~~v|~shojt|r{xqxuw|zy{x|~|~|}{|~y{~~|}|}|}~~~|~~sutvtvtvxz~||z{~y{xzuvtv~tvtvrsz{|vwxrs|vwz{~w|}unsyrw|uzxspwsnvrmwsnrniwpmm`bzmo|oqwjl{npL\eQahM_eM`aNb`afhbcg[^b^ae]be`gggkjhjhfgfa`_jffghhhhhnnnlmmiiihffljjpnnrpp}{{rppommsqqxvv{yy}|{z||vxxz||prruwwyxx{xx|xyz{yz|vwzy}}|}|wvzwvzxzwvwu|}{yzxyzvwxttuq{|xzzv{|x|~|z{y~z||uzz|z|z||}{|{|~ztu}xy~xyxz~yzyz{}xwwyxw~||~~~~z|yz{|~~{{u~x}v|}}{{}}}|||xxxx{|{~|}|~~|{~y~~~~~}{~v{z{x~{vawuwxz~v{ylqolom}~|z{wstpxyuvwsuvrquokxnhxngxniyng|ph}nh~omse{li~pi~plrimilwxijbzhd|jiojphne}kg}kj|kk}lk}lopopoppqqrnponn~mj{jn~mn~m`lblg~lj}lp|ls{jr{gm|fd|dad_f`fbfkmijefk~kk~kk~ki|ih|hokojljhifihiujshyqfx_nhyxnmjhljmlklklklklklkljmoruvtsrpklpqnoopqrqrststprprptltjrkrkshodogpmuotmprnrlpkplnlljfydhydjvblxcmwbpxgowfowfowfpxgo{fm|gl}gj}hi~hi~hkjkjkjg|fcxbopqrmotxuzswnrh{lj}nptruv{rv{rzv~z~xv~~{wzsyw}ww{vz|v|~tz|spwrs~{pyvrzvx}{v}xvz}~{~{|~}}~~{||}~~~}z|xz{}smnrlmyzxzvwvx|~vxtvuvyz~xy}wx~xy~xy~w|y~yrw|uz|uz|wtzvqwsnxtoxtowqn~suvkm}rtrgizoqMT_T]eR[aQ[]R]\_bcdce^`adii_deV[Zijfihdjhdplikfciggmjjpnnmkkpnncaaljjpnnpnnpnnpnnnijupqupqvqr{vw{}}}qssoqqtvvhkkxzzz{{yxx|xyzwwvuyutxwvzwvztswwvwvvw}}~wwwxyvxyuxyuz{w{|x}~z~}|zy~yz{zz{z{z{}xyz{{||~~ztuytuz{|zz~wqrzuv~}~}|||}|~|~~}~{vuzwr{}szt{|}}}~~ww}zz{{|w~v}xx{~~{zxvt{yz|}}~|~|}v{z|~~w~wuu|||xxxxh|s|{~v{ysxvotsuywqvprwqrvqotnqsmptojxmjxmhxmhynizoi|mh{lnrh{lexij}nlpexgk~lvwpqtzmsjpioe}ke}kg}kg}kj}lmnopopopopqrpprqqprqtsrqcle~lk}ln}ls}mv|kv~mpjf~f`g^h`g`glqgke~fk~kk~kk~kj}jk~kmkmklkkkkkmkt}hp|fxqas\g{d`zbgjilikgihkhkhkhkhkhkjmlopqsrtrh|ieyfdxeh|iklmnqrpqopmnqtirfphqhra}j]{h]yfcliqemg{hi}jgzhfyfeyfcwdcxegzgjxgpzipxgr|kr|kq{jisboyitotpsroononononomoqsxyuvrswyz~|z~}tw~}y{w{w~|zzyv~v{|qvtktrqzwq|ysxvtxruvr||vyzqrxtp{xs|yt|xx}{rytvz|~yzq}~~~~|}{||}{|}~}~|}~z|xzuw}rtwy~xy|vw~xzvw~vwvxtwy|z}vyxzwqr~xyztu}wxz{}v{zsxyrw{tyzsxzuryupxtovrmyupvqnxloynptik|qsshjoiv`\fgbk]Z_^]^_]`b`c``b_`b_cd`dcfeaed`f`]hc`mfcihgmlliggqooiggb``iggpnnsqqkiiwuuvpqwqrystztuzst{}}tvvtvvxzzx~ovusyxwzzx{zuvvutx|{yx|yx|~~rrrxxxxywz{wz{wstpxyu}~z~|{~}|vw|vyy|}{|||~xzyz|~~|vw{vwz{zzzzvvz{z{|}|}z|z}u}~tyyywx|}}~~|||yx~x~x~x~vx|~~zy}{z~}{wv~~}~uss|~~||}}}~qvtqvtlsp|lvnmvlu~srwmnqhsvmmxnlynixmiynizoizmj{nk|ofvjj{nizmj{nizlhzhh{hj~jgm]uce}ke}kf~ld~ljpimk~mlomomonprttvqsopopy{stnoe~li~ll}lq{ktzkx{lszlo}kfkak]i^g^~egkafcgmmmmnnlll~lkimllkk~ioln|gqxcmxbm}fexae{cc}elnlmfhghgjhkgjgjhkjmorkne|fbwanlg{heyf]q^g{hh|ig{hklklmnophlamftamdrcofo_{h`~kit[|hioknezfcwdfzgbvcgzgmmtotmxquokwehub~ysxtyuusrrppqrppppqrtustrsstrtz~}{~{v{rv{rtypotkiqfu~qt~qhuegucjtjgpiptnwup|wrzvrw|zotrs|yqzws~{tyxpsqrsozztuuoszvr}zt}zw~{z~|v}xt~xz||{rpp~~~|ohk~}~ztu|vwyst}~|}~~}~wyz|tvuwz{xrszuvystzwx~yxyyxx~}}~~z{|vw{|{|yzzsxwpuyrwwpuzsx~yvzvqxtoxtoyuptolwopvopohixqrsklPAOYLX^Q[dY_h]`e_`cbaYYYWYY\b`jllbbab`_^ZZidcpkknhjojkjefsnoqklommqoopnnsqqkii|}vpqxrsystuopwqrvxxprrnppikkikkisqiusnzxrzxu|{w}|tsw~}xw{zy}{z~qprsrtzy{|{}{|zwxtxyu{|xuvr{z~}~yzvyz|~{|~z{ytuyzz|}~z{}~{||~yzz{|}z{~wy}vwzz}yx|}{|}}}{|~tzv|yyzy{z~~~}}}x}|~}}{~|znsqovsktqw~jwpjvloxnkpgxypx{roxnmxnlzohyngwlhylhzli{nhylj{ngwlhzlhykgxjgziloc{i\tbbzhc{if~lgogogmh~li|kczgg~llpjnqunqmnmntuqrnni~lj}lp|lv|mx{lvvhqxik|ib~hZhYf[}e^h^~fa}g\ybllk~kllmmi|if|jillmo~mq~lnxfos`kt`kyefydf|fZv_\xaZv_chdjejinjpkpinglehb|ed{ekjdwbbvcxypqmng{hqrj~ki}jstrskp`pdueuaraqiqjso{l|l~kut{z{vy{z|y{ytnp|j|}wspsp{zopmooqoqoqmonqoqlmi}jh{j`td`re_rc_rc`rd^qb`sdbseglckpgpulpulkpgglcqynluhjudfsclxpjqmorntqmzqnyrorwvv{zs{zowvp|zputnpppqonmittnmtqv~x~t{x{~v}xs}w}~}|zz}|}|vx~{|yz~~}~wyz|tvxzvx~su{st}uvz{|}swxsz{v}}ryzryzvz{}~|}yzzz~xyxqvvptwpuunswpuxspvrmxtowsnvrntolwop|tttlmvnoxpqdXff[ge[eg_diadhcde`a\\\]]]_aahjjY[\dcdfcewstpkmnijmhikfgsnomhixvvnllpnnpnnommpklxop{st}uvxpqyqrrttqssoqqgiinppkxvixvjxvn{yr}{yzy}qptutxyx|xw{tsupoq~utu{z|bca~klhoplqrnstp|{~}yzz}{}~~yz~~~zuvxy{}~}}vzywyywop~xz{}xx}|{|}xy}syw}w}yzz~~}|~}{}~yyyuzy|}{|}~|otrjqnhropzwcshm~qp{nszozdh]oxnoxnjxmlynk{pjxmjxmivliwlhvkftiiwljxll{mhxgfxge}kYq_d|jd|jd|jb~kc}kf~le{i]sa^tbe{inr_ucosh~lh|kh|kmolnk~nk}ln|lr|lx|myykxxlrwkiyh]yeRzaS}d[h]gbi_gYv_mmfxf`s`\o\_r_fkhmmmplt~mw~mvxlsllkikSoXb~gglkplqgllqqvqvlqhmehb|ef}grqwxuvi}j~}~turswxlqmmfxcuasjpvqomtu}rzrxy{}|y|}|}{yvo}khvdftbiwemzjkxh]m\ewfcvedwfgzigzigzih{jgzidxebvc`sb^qb]ob\o`[n_Zm^^qb_rc`qcjoflqhpulotkkpgflbv|qjrghrfiscnunmtopqmtqmwnkwpmrwvsxwpxwnvuozxrvwsuustrsrnvuqszwr}zjspjqn{~uyz}}z{~~}}~~~~~~~}~wyz|~y{uwwy}uv~yzwuuuyzpuuy}~v{|ptuuxy~xy{|xrs}wx{|xqvvptwpuunsvotvqnuqlyupuqltpltoltno}wxrlmvpqmgha\h\Wbeaib`ea_afbc\YYb``__`ceegiiVY]deiffjhglgchnhinhioijtnofabjggnllkiiommtrrroovop|uvyrswppslmlnntuurtty{zsuulzxcurjzwjxujvtrzz|{uuywvzzz~vuyrqurptqrv{zrsq{|xwxtxzv|z}}}|uvzz{|wx}}wx{||wx||v{zz{{~{|zrs{{|~{|}yw}~|}~~~|tyv{yy|{|{|~z{~zy|~xy|}}xy~~~~~~www~{{|y}oyvs|w}psoznqxnmndvxnoxnoxmnxojynizoivmhulgtjlyogtkjwln|qo}qkznooewhe|lWn^gng~mf}lbla|kiqd}kuyvztysxWo]rvjolokoh|kh}lj~mnnp}ms}m|p}}n{|prwkevfYuaMt]Oza]j\hcnemlreyfmnsswwxxjqjqhzjmzkqxjuzj|lvzopmpkqyrxntytzz}~}}}~~}~|}vwkllmosgzU}h\o`t^plrYtbNo[W}hHt]Pp`Rn_Yrcbxi`ufYm_Zpa\pb`nacobbk_bo^fsahuddp_jxfercbob`ob_pc]pb^qccvhcvgdwhdxibuf`taaubbud_rc^qc_qc`rdase^qbbtfgwijoflqhotknrjineikcy}uhoejsgkufksmntntsqxtqyomzrpotsputltsluts~|swwvwxsrsyxtyxtqyvp{xrzw|w|zz|{~yz~~}~~wyz|uwxmo}xzxy~yz}~}tqu|~uqv{wy|vw|~{uv}wx|vw{swxptxquvoswptztqxsnyuovqlsniuolsmn}wxvpqrlmslm\\cUV[XZ\\__UWW`a_\^[_a_bcadecddc_^`fdfgfhgfhgfhkcdnefvmnsklldejefpnnqooqoomkkiggtsuljlrprnlnljlhfha^`pnpnkmhehiopkttkttkttmuuv|}pstvz{w{|w||svwpqu{rwr~w~sqm~u{vr{urytrrn}}yzzwxxuwwt|}tss~~z{}~}|~||}z}}~{||}~~yzz{}}~xwwuttzyy}~|z}}~z}|{}~~yzzz{{}~~~}|}|~z|zz}}~~~~~~{~~}~~rtot}pp|nl{nj~odykjvrmvrlrosur~|}nxfznwv~^ngZ{k{sjteovrq{o}cqnymyutuescvtxu}zz}u}vq}}zpu~v|zq|xrtcsdWeVdsdhrdkwgfuckxflzhdxe`zf]ldjxrYe]fpjhpjetg\k\gtgbm_luhjvi^qc^sdexjbwhbug`tei{mPdUfzlawgdqjbmigqmisoajfdli`gdhmjgkhproikhfg`jnelqefnahrdendgpgcnebpf`pf`ofcshasg^sf\te^te\o^_rabud_rabudetcgscgscgscfrbcl`di`glclqhlqhlqhrom}zxzwusomspmqlm}xxysuwrrvpqztumoonsrowvjusgtrrwusxvvywuvt|zy~}x|zfjhwywy|zvzxw{zz}}|}yvty|~~z{~|}|}~~~~}qsxzyz{|{||tu|~|~uwvw{|}~|||uwwqrzsu~xyzvuywvyywwzxtxvuvvwww|ttwooxnkznjymi{pk}qmzolupqvqrpklupqrno^^d`aeWYZVXXZ\\VXV^_]bcaab`_`^bca`_aedfgfhihjkjlphiwopiabkdejcdfab}{{jhhqooiggqoosrtwvx~}onponpc`bwtv{xzzwynstowwowwrzzztyzvwxsvvxxzwyzvwxuvzw}~iuwltvwuu~}|}{vzyrzxrzwuxwx{y~wzxy|z}yzxxx~ussxyxzz|||yy{x{v~}}xwz{y~}~xzz}z||x}|{|xz{{{mmm|||z}}~z|y|w|uxvvv|||}~}~}y~}}~z||{|~rqpusr~}~~|~||}{{|zz|xwtqqqug}n^yikwtpwtnsqstr|}n{xtuysnz~yxyWkYmosu|~sudwnk}vq|hzsp{ta|llwa|ipwzeuggvhixjaqc_n`Tg^Xjccqibmcfmbcj]]iS_jU\iY]h]Yg\T]Z]gd`ifajgYb`UcWXgYo|nisfenahrbcn\]gVitbctbVmZarkbrkbpj`mghsm_mal{merdbl_hqdeobdrdbrddrdbrdcqc`pbhvhXhZ`n`csehnjgmkhljhnleigdjhfkijomgjhopnijhghanofilcgnahqdjqjgmhhnjhrleqkeqkcrjeujasf_te]tecve^q`]p__ra_sahscisciscisckueoxkx}tmrilphlqhlrhqonxvuwutpnmnlkuopyzystxrstmnytuqssnsrjrqgrphuspuspuspsquvtuvtxzxy|ztwuxzxwzxv{y|~y~|tx~~~~}wx}~|}ztu}~}x{|~}uvz{|}wxvx|rtwy|~y{|~yzz{{uvztu|vw|vw}vv}yxzvuxyvvutxxzz}}~~}xwxljvihtgezml~qo}qotppsnojefojkpklUT[^_cQSTdef`bbcdbab`jkiXYW_`^decdcebbdgfhihjkjlqfhsuvkmpdfi^`nijvtthffmkkgeeqoopoqwvxgfhnmo}|~xuwvsunkmpmoqnpotukssfnniqqv~~qvwwsuuru|}ywyzvxuvz}syposs{zxx~zyyzxv{yr{xr{wmrp}y~|uzx{yyvwwsuu}wxz||~zz}xw}z~zu{vuxsrz{}~{}}|~~wyy|}|~~~~||||~z||ux{}~{|}y}}}~~~~|{~{~}{z|}~y||~}~}{{}z|}}{|z}~|~|rrorkpbyjc}mnwtqvtpsqtrrwrqyyu}vt|ut|u{|z`q[ylYtjSkcSjbYrf_xlc}oXscVs_VqaXte^xhOk[NiYOjXWq]Xt`Xs^Ws^Xs^LdQYo]^ucf}kayg]ofZjcZic]mf[jdTf]f{n`yi\ta^ve[t_boalxj]j\erd^k]Tc[Xgaanfjumfnd`gY]hTakZcpbalabog_ebW^[^ebbifahd`mafrdfpcgqdjsffo`gn\]dSpwfbo]ataTjbUiadun]ngt|`nb\k]`m_XbUgpcktggqdfrdgqdfrdhrefqdkuhepc[eXal_hkfjljffdgjgiighjhinllqolomqrpmnllhclmgjkbhmbipbjnhgnhfmhirlfpjcnherjjxparfasf_tehykctfbse`qc]n`hreireirejsfgpcirejoflrhjpflqhnrjsqpvtswutrporposmnytuxrtrmnsnozwwsuunsrnvuepn]jhovsrvupvtuvtuusqtrnqoy|zx{yvywrusv{y||~}{}xz~|}|}|vw}wx~~x{wyz{|}~vw~vw~suvx}uwxmovnoxrsz{|vxzzzst{qq|||vu{wvyutuu|rrxoozy~yxthfsfduhf|olrp~rqupqsnojefmhipklZ^b[^bFKLX]\NSRY[Y]^\]^\]^\ghfdecfega`bihjhgigfhlactik}rtrgij`bupqrppljjdbbgeehffsrttsusrtmln~tqsnkmqnpqnproqnstnvvmuulttpxxswxwpsz|y||uxwx|z~}|{wrsrrrw|{s{zrzysyxu{zrxwmrrrxw|{{uzy|}{zzwv{|zu{z}|xzz|~~|~~xzzz~~~~{{{{}y|z}|{}|}{~x{|~}~~~~}~~}~}}~|~z{}~}}~|tpo~z}~}|{|zyqttxqwd{liru{xx{yxywvrqsnmtxsmunowpjrkfngbneaviauj^ph_ngcrlcvm`th_wi_vh]wg\ue\td]sdMfVSiZ\qc^sa]ra^ra]ra^rao~mdsbetcftdftd^ldVc^^jd[hb^jdVd\cuhasg_sd\r`Yq`bpaivh[hZfsegtfmztgrpakedlegodltipzihrc_k_dogcoihpmipmfmjholholithdrdfpcireztpuivyjqrd^aR[fV`q`UldWnf_vnWmdK]VXi\bqcbpbcm`hqdfobhqdhqdenagpcirehqdgpcgpdluhcl_nmiqnmjfejfeokjnmlinlkpnknlopnlmknlhkhclmeilbhncfgclnlehf^dbeliksogqko{sdrgbsfbsf\n_^pbbse_qcZk]irelseipcjqdlsfipdlqhmrijoflqhnsjopnmolpqotvtxzw{zzxwwywwyxxzxxutttvvqvujrqkvtp}{pwtpxtotrrustwuy|z|}x{yx{yy|zvyww|zz~z}z}~~~zy~|{z{z{{|~{~vxz{}~~yzwx|}vxz|y{uwyzsmnxrsyz|}xpq{oo{{ww~xx|wvwwvvvv|wvxtsuiixjlvw~pqqr|ppvqrwrsqlmpklrmnX\a]beTYZ_edPVUjmk\][]^\]^\bcaab`cbda`bZY[bacihjuhjregzmowjltgiqlmsqqsqqzxxusstrrrqskjlkjlonpqprpmoroqyvxpnppmofkljrrywlttnrsunqyrux{zsvyruvw{w}yx|vw~roq~yyyuzyqyxs{zu}|xltrw}v~}yyyswvy|||ytuuqr{{y|~|{~yxzt~}~|}z}}~|~~}}{}}y~suu}wxwxwrttttlll{twy|vywuw}}~z}~~}|~}~zvuyut~~~{yx~yzx{||}~~~}}}}}}}uvv~~~pzt{z~x}{zzzxxx{{{~~~~}mkj~}~}orptmqezki}nvywxywxtt{tt{rrrsoipjgmhmsnxvhoflqjilgmmiaofaog^pd_re]tecvifxkduhbtg_pc\n``oaaqcbqcaqcbqcprdmo`km_kn_lo`dkdnxrksncmgdmgenhcoddrf_na]qb\s`enb]gZZdWhreisfhplenkflhhojipjksigq`jsfgridnh`jhejhchfW\Zgljbgednbhre^gZ`i\fm`uymwwkpnchj_hqdetf\xn[skYphVkcYogSdWftfboaeobfobluhkrekrejqdkreipcipcipcipcmsflsfmlh{wvkgfplkpljomlfkiqvtqtrkljpqoqligd`nkflmdhkbfeammkhig]`^hljkpnlsnktndogeshcqebocZg\lzngtidrfksheka}lrgpvkek`lqhkpgmrikpginejkiijh_`^strtuspqqhjjvxx|}}yzzbddputmutjuskxvoxupwtovsuzxtwutwu|}ehfx{yz}{v{yw|zv{yvqr~~}r{}jyfwvsu~z~~z{{|~z{}~|~{~~zrsxy~suzoqy{xz{}vxwx{uvyz|vw~xywop}optt~ttvv}uuvvxx|{{zyut}qp~pqrszllstymmqlmxstqlmvqrtopY]b]beUZ[bgfTZY]`^XYWghf_`^efdghfbaca`bpoqnmohgitfhwikwikykmykmrmnpnnnllnllwuuussljlmlnfegmlnlkmqnproqvsuurttqslqremmqyyrzzowwnrsvorngjunqyruxpttuyv|nmqp|~qx{spr|~{y|uyzqyys{{s}}r||lvvt~~wv|{suuommqrr~w|zpwrtzs~{|z|{|~~}xzzu{zwzz}xy~|||ttt{~uxzyx~~}~z~}~{{~z{|~~}xsr|wv{|zvxx~~~z}{{}z|}pmowuu{z~}~~z}}~~~}}}|y|zy|{zut}yxxyurtpsl|nj{liyklmkomlzvu{rr{oovtsmpnknlpsqdfedfbzyoonfwsnrlitkhgnifohbpharf`sgcsferfcpddpdcpdepdfobdpbfpceqcfpczqdwnaul_wnavnamoijpkjplflhflhhlhekdenc_l`\n`]pagpcbk^aj\hqdgpckqokqpipmkqlhohltifocjrhdnhdmj^iggjhdge]`^mpnlomjsgfpc[dWcj]ruimqeoqeppdprfhregwiRjbVme_vn]skXjc^obgvhmzldnagpcjsfireiregpchqdenagpdgpdgpdnwjjsfpokZVU|xwpljplkqongljotrehflmkpqotkllgdhfbjjdlmdurrwrsigg___eefcfelomkqlhpifpifqgbqd\j^iwkesgcqelqfhlaw{pjnctxlei^kpglphkpglqhkpggjhsvtptrgjhorprvuy~}uzyrwvx~|qutikkuzyiqpjtrjvtmxunwtovsuzxrxvy|zvywy|z|}v{ypuschf~vdtn}o~~yzz~yz~{||}}~z}}}~yz{|tvz|~xzy{vx}uv|vwyz{|{|srvv{{xxwwww|wv~yx~zyzxw|oq{mp|np{mosuzmp|wxrmnqlmvqrrmnSY^V]`S[[ZbaV^]becab`lmkefdcdbefdbacdbdfegjikkjlugixjlugizlnwikrlmmkkljjpnnnllgeefegtsuonprqsrqsroqroqurtxuwurtnstdllkssmuunvvotuzuw}xz{vx{vxupruvzxntonrmy{nuxwtu{}xwyuyzqyyr{{jvvzsr~~q}}|~~y~oxwsuuyyy{v|yu|ykuo~{|z|{~~|~~{}}vxxu{zx}|~zzogh{{{|||}x{~uxzorz|~~~~~{{~z{|~}|~zy~}||~~|}~~x}|wuuvsu}yvx~}yww{v~}}~y}~}||w~~}|{~}~}{{wn{muufqdq|oq|nwts|xwyts|qq~rrusrlomjmkgjhlomlqlrvkoqhmkflhdqlhkniinifphbrgasecndclbbkafndfoegpehncgnciodhodiodvqdxrern`pk]pl^rsmcgbjnijnhjnhjmhjleekdal`^ma]pafnbdm`enaktgr{nuywruumrpafd\c^\d]ai_hpgbjh^fe`jjfiggjhlompsqgjhmujr{ndk^muhquilpdimblmcprhepdarfayq\qiYnfevo]mfaqdetfmzloylnwjjrfhrehrefpcisfisfhqdhqdhqdjtgfpchiefdcjhgmkjljimnlhmkmrp}~ijhfgetllqlkd^[olgiidrnmtnonijeccjjjhhhjmkknlmrnfmfirhepfblchsifpfepfnrjlofilcjmduxogjajpflqhkpglqhotklomgjhuwusvtfhfv{zntsqxwryxw}|rwvoqqz~gonitrhusmxunwtmvsu|yv{yx{yz}{~}~y~|v{y~iZzRtc6f|Bq~}~zyux~}~~~}~}x|{}{|}~tv|~y{tvtvz{uopxrsystyst~wxzz{rr{ssupotonyppxsr~{ztsrnlk{oq{mo{mo{moqs|npZVVmhiqlmtopnijSY^W^aU^]SYY[baY\[bcaefdcdbcdbhigdcefdgfdghgigfhtgivhkuhjylnzmoqkllijqmnqnonklmllpprpoqsstnnorrturttrtxtvyvxurtlqrgnnipqmttlrssxyxuvzxzzvxurtxtvssw|rxljooy{ouxuqvz~zy}uwzrx{rz|py|pz}us~t|~~y~}u||prruwwtyx{qzxq|v{|~|}z~}|~~~|~~z~w||||xrsyyywwx{{{{||~~~|~}{~y|~|}|~~zy~yz{}~}}{z~}~~{~}}~t{zsqqoln~~|{{}}~~|~|~~~~{}|ywsdma}hqdxsu{owutwsr}uu~rrrttqploljljjnllomnrmlujltknpjhjfiidllklnjhpidsiarhdmcbj`ckagofgoegoelpeimblpekpekodqqdutgnm`mm_mm_xxr^_[lmhlmilmilmipnijlfdmdanc`pcdl`bk_fobirebl_[_\]``_cbdjfpvrowpjqifmfbkhksrdlohljcgekomuxviljgncai\dj^nsgik_z}qhncfj`lqfgsg]pcRe]`rjask_ohRbZXfZ\j\am_gpdltgireesegseeqcgseerdftegsfftfiuhftehlgmolkmkkljfhfdheinlmrplom_`^mnltlnvoo^YVnkfjjdpljrlmojkc_`qoonnnmmmlomntoeleiqjfqhdoefqhdofepgnrjuxqpsklogtwomphjngmriinelqhpumpvt}sxvafddjglrqpwvmsrsyxqwvqvusuu}hpokvtjvtlwtlwtnvsnurousqtrvywrtr~z~}uzx}}{G~Ouʝ}{yx|zy}~|}x|~wz}~|~smn~~{}|~~suuwy{|tusmn{|{uv|vw|uvzqqohh~zyxtt|xw{wvxsr{z~|{wxvwno{mort|np~pr|oqkfghcdqlmsnolhiV\cU[`\`eY]^SVWcbecbddddeeecdb_`]iiigggiiieeehhgywxihhgeerppomnrkltklxjlvjlqjkmmmgrpjusitrepnhsqmtsosrpqqutsvttxvvutttrreddkjjtsszsv|vx~vzy|~wzuqs{uw~wtv}y{xxr}}v}}wvut~~}wwxqstuyz{yy}}{}|~|}}w|zu{vtw}~~}yz|||xyw{}{|~{{zy~~|y{yuxxrwv}w|{|}|}|}z{wtt}||||}~}}~}}||~}}}~{zw||}~|}~}~~|||{yyx|z}|~|~~~|zzyrspz{x~~~~{vyy}svt}|zy{zehf~~gjg}~qtqusryts{ss}qqyklrkkmjipnmrsqorpmpnptqrtqspnxsr}uu{tsihgbhdjrnhpkbng]la`pdcsf_ob\l^_o``oaYcV^gZgobjmfnphrrkolfmjdkigijhijhijiijiijijlkjnjaeainjimjhmehmdhncfm`fm`ak`fpg`jabmd]h_^i`\c^fmhdjilrqcghdlickhfmjdigejhljhyvtolkpnlrnlnlgimaej]cm`erddtfardcugh{lVk]Wm_^icdjg_c`ilioomkojnwjjqdvxlrrfspecl_bj]aj]dm`mviiqifngekffkfjjjjjjiljmpnZ][nqojmklomqmlpkjkgflmjlkklkkonnlmmllllmmjnmjonqvt^d_u|ujsofokirnfokfpkzwuxvtz~{kqnv{xlpmjnilpkjnfjpflrgosnmpkorplnnmnolmmjnliljmqowywrvtqwty}jrnw|ltqz}uzxotsuxxwwyxvwwvv|{{~~}Ul۔rTv~yyvz{}}~z{xy{}}}||uqu}~}y~y{vxuw|~|~yzwqr}wx|vw~xyxyxxxxyy}wv|{~xt~yvzy~||rmnupqpfhxoq~rt|prxjlvgjxjl|npykmX^e[^c_ch^bcXZ[bbfdbddddeeedecbb^hhhgggdddeeegggwwweeegggooo```rlnvjlxjlvjllefeeehoniqplrrgonkqpntrnsrorrsqqvpqrppsqqvttjhhqooxvvtoqqlnsnpwrsxsuwrtvqsrmoytvxsurrlyzqwwq{yxywv{z|zy{wyzswxpuvy{||{}y~vwvxz}v}xs~vz|}~~|}}}}{|z~}~}xyw}~|{~|tyxqvuw|{|}|}|}z{zxx}}}}}}}}~~{|~}}~|{~}{|}{|z~}iiiyyy{vw~|~{|z~~~svt}|}xwmih|}psqnqo{~|russqpvqpxpp{oo|novnnrnmqonusrrsqorpnrpqrpsnnspnvrpummhfecigajgdkh^jd]leargbtf_qc]n`^m__o`]gZ_h[dk^gkfeeabc_ihdmjfjihhhfijhghfghfghfgjhilj`cajmkgjhhlfhmchldfm`fm`dmcitj]h^]h^^i_`ka\c^bid\c`flkbghalibjheliejhejhnlkyutuqplhgtpokhdosglsf`j]XeWdse_pbbse\p`Zo`cwhcmginlcfdjmkkljqupqzmjrdik_ppdqodenaaj]`j\fobirehpffngfkghniimjimjnqoknl_b`jmkfighjhokjnihkgfmnlkkklllmmmllllllkmminminm`ecmsnpwpktqgpmfolbkhbkhtsrwutx|zpwtotrnqojnilpkjofhmdnthosnmqlnqolnnmoohjimpnehfknltwutwuv{yx}{nsqinlpus|~|{zy{wvx~{yy}}w|}x}~Sf]zQs}|}|x~~~|~|~{|~yzz{wy}||~|~}}z|y{wy~suy{z|wxtno}wx|vw|vw}~yyww|ttww}|{vsnkton~||~~upq{|xpqxz{prxjlvhjxjl|npzlnTZaW[`^af\^_[]^dbfdceeeedddefddeaddddddkkkaaaiiiqqq```mmmzzzkkktnowknxjlvjltnorrrlppkqpmpplqpmpppqrqrrtsrsqqupqrppusszxxsqqwuuxvvtqstqssprwtvxuwuprpkmnik{vxvqsxxrnofxxr~}wvxzy{x~~y{||~|x~|wutxprr{~z~x|y{}~~~|wxnnnz{y}~|}~||}{}~|{~|v|ztyx|||}|}|}}{{}{{~}}}}}}}~~{{|{~}~|}{sus}{{tyw~~}}}}~~|u~~uxvzxw{zx{yx{yx{ywzxqtrsqptontll{oo|novnnwrpvrpqonnommnlmnlmnlonlrnlsnmqkjihghplfolbif]hbbpgdrfdrfapb_n`bnb`l`_j^_g\ck`djediddhcghdkjfhjhghfhigghfghfghfcfdgjhbdblomgjhfjdfjeflbflafm`hpfgrhYdZ[f\^i_`kaZc[_fb`gdekjcih`kh_jgblhdkhejhijhomltrqhfeljijienrfkrebl_XeWfugapbdse^oabuf]rdismchf`cajnlkljcgbhrehqdhl`ssgsqfena]fY^gZjsfaj]fpedoeenfhnijmkjmkqtrlnmcfdhkifihdgelhgjedmihopnkkknnnkkklllmllkmmkpohmlafdntnovogrofrncnk^jg[fcssqvutmsqiroinlknljnilpkjpfdj`ntjosmmqlnrmlnonoppsqmpnpsqlommpnjmkqvttywuzx|rwu|}~srt~}zxx~||}{{~~}zȀlPojk{{rmnz}z}}}z{}~vx}~{}}~{xzxztvvx{}xzyzztuyz|vw}wx~wwukkwooww~yx~xstolwrq{yyxvvxrswrs|vwxrt|}|qszlnxjlzlnzlnzlnTW_X[`^af_bc_^`dcgedffffdddfgeefb______kkkjjjfffppp[[[nnnooopppupqunowjltikrmnrrrsrrpqqpoopqqqpprqqurrwrsvqrvqrqoosqqxvvwuuywwrppvuw|{}xwyyxzxwyvqsupr~y{~y{zuwzztpqhzzt{}|tsuptux|}|~ww{|~|~}~~|}yyy}~|~~~~}z}{z~~x}|z~|}|}|}}{{~~~~}}}}}}}~~~}~wuu{||~}~|{~tywx}{~~opn}}}}w~~~}}z~z}{ywv}xwwsrsvtxzxmpnlomsvttrqupoummymm~pqwoozutwsrtppronnpmmkjnkjnllnlkplkpkjjkimurdoldmj`jdhrlcnfepf`l`_i^bk_bl`bj_bj_fncgnlelichgiljijhgigdgeehffigfigfigjmkjmkcfdpsqhkifjefjdfjcglbflafoehsijuk^i_`ka_j`YaZ_g`lsnkspdji]kg^ifckhdkhdkhgighjhtus_a_kljab^lpdfm`bl^]j\apbdqcjxim|njzl[m_U_Yejhadblomghfkojirfenaosgprfnobena\eX\eXluh]fYdpddoegohfnggmhgmhpvqkqlbhcflghniknlokjlgfnjiopnikklnnhjjjllkmmkmminmjonhljntolsldolgrogqnhspozwmomhmkW_\bkhpusopnjnilpkkpgaf]oujosmmqknrmmpnnqompnpsqnqolomnqoorptwuqtruxvpsqjmkx~y|~|~}z|trrzxx}}~~||z~ue؀Mi~zx~|~{}}}}~~~~|}|~|~}y{sno|wxuw{pr|~z|~z{~xyz{z{||{qq{ss}}zy{v{vsxtrwuupnnqoonllzuvlfg|stzoqzln{mo{moykmzlnZ\dVY^aag[Z\`]_baedceeeefffefd^_[YYYdddmmmiiigggfffgggnnnppprrrqlmulmvlntklrnoppptopsopuopsoptopwqrxqrwqrxrsvqrsqqpnnuss|zznllrpp{xz~pmowtvyvxxrtrmo{vx~xzuprssmopgzztnminlktrqzy{}|~swxw|}uz{x{~~|}z{w{|{{~~~rpp~~|{|z}~|y~}}v{z~|}|}}}~}~~xy|~|~}~~{~{}{zzzy|}|{~v}t~zz~~|{x{yzxw|wvxtsgjhx{ypsqpsqorptrqsnmrjjznn~pqwmmvnnsnmuqptrqrpoplknlknlkljimkjpkjvywmvseolajgRYTkrlfngV_Vnwmkthfkcemcemcfndltjdmj`iffmjhmkdhfdgefigehfehfehfhkijmkhljiljlnllomhlggkffjd]bYch_clb\g]epf^i_kvlalbYbXckdlsnhpjhol`nj_mi\gdajgdkhhmkjommqobgeimk^b]hl`dk^ak^`m__n`]gZOXL\i[`n`^l^nvqbgeknliljmnl^b]boaak^ovisxlmmaena\fXirefobcl_bnbbpdWbXfngekfdjeiqjckdemfgohgphlomsonrmlrnmmnlhjjrssgiifhhikkijjhmlinmkpniojjrjftpkzv^mhetpbplmspiol`jggpmosqwxvimhimhineglcntiotjnrlmqkmqlmpnknllomlommpnnpnqtrtwuwzxuxvrus{~|txsqtrjjj|~}{{yww|zz~||uz{~of^ÊjWwv|zvuwzzyzz||||}|}}~}~|}~uw~}y{z}rtyzyzz{tvuw|~z|y{yzyzyzzz{||tu|pp|rrxppxx{vu~x{vswrqmkkkiirrruss|vwytu|vwyqrykmzlnzlnzlnzlnWYaWW]UU[\Y[c`bdcg`_afffeeefgejkgkkkaaakkkhhhhhhiiiggguuuqqqeeepllqllvjlunoqooqppxnpxopxnpxnpxop{oqtvtlmuopxrsxtuussxvv{yy|zz{zztnpytvoiktoqysuzuw~y{}xz{}vvpstk||v|{wrpowutzy{yxz|~{v{|r{{vy}yy}}}~w{|u{{u}|y}}~~}}~{yy~~}~|wzxw|{w|{y~}w|{}}~~~}}}{z~}~|~~}~~||~~}}xywzzz|~nuntnutxy~}|||v{zlqp~x|wrq{wvknluxvrusrusqtrtrptontllznn|no}qqummrmlxrrupptpornmrnmrpnnomopnspotxvcmjcrn`liW]Zlqodjf[b[{x}zjmchlcelbai__h^]igaljemlgmlekjchfchfchfchfchffkifigehfcfdfigehfgjhfjefjeae_ejaendkvlepfbmcdoebmc]f\dncdleelghpj`okZgc]lhajgbkhipmipmkrognkkrow}xnrfztbl`^k]apbfm`^gZ_h[epcan`rytejhmpnehfkljptoWfXcpbiqdorfkmaena]fYktgfnbdm``pa`qcWeYcndenffnghoicjdfngjqkipjdgemihojirnmvwuglkmsrekjdjhhmlhmlinminminlkqlhphftplyucqmguqguqmurdol`khhroruspqohlfimhjnfhndnthlrgmrimqkmqlmqllpnlpnlpnlommpnpsqxyw{|zzzxuvtzzxvzuyzxwuu~{xz~~|zz~~~||}}xfE~=|EEJ=pw}|}~{vx}~{z~|{yzyy|~~z}~|zy}{yusvxtvy{uw}uvvpq|vwz{}~z{zzyy~vv~~~zwrozutxvvxvvwwwxxxtrrvpqztuxpqykmzlnzlnzlnzlnXV_\]c`^d`]_jdfdaf]\^hhhjjjdechjfkkkcccgggfffiiiiiifffttttttiiipllrllslltnotrrvtt|oqzmozln{np}pr}pruwtikwopxrsvqrrpp}}sqqzxx{vwz|pgiumpy|{}nikuprxsukfhuuotulzztyxtusr}{zyxzsrt{}~txyw|}qyytyzx}{{x{v{|s{zw~}{~|~~~{{{~x{yz~y~}|{y~}~~}}}{|{~}~sqq|||}zwyyut~}}z}}jopvrx{~~sxv~|}~~~~|~}~zxprpqtrrusqtrorprppvqpxpp|pp|no{oovll~vvytstpotpotnmrnmtrqpqopsqqonpusfqneso^if`fdlomfjeae`ormlpgllfjkfimgcjc`ha^ki]ki_jhdllfnnfkibgebgechfchffkigjhfigiljiljbfdfjgfhgdhdcgaehcaj`grhepfdoe`ka`kaak_fof_g`bjcjplaplUd`_mi_jgbkhenlfolfolhqnenkkrmZ^Rhobdnaan``oalpdjqdhqdisfbl_lsninl]`^figghfoto^m_erdgpchoblnbenabl^jsfenadn`apbardXfZgrhfngdledoeambfrgnyomxnlomqmlnihb^]nomkpojongljejiinlinlinminmjomiojgng[jf_nj^miaplcrnispali^lhepmehfnomfjdjnhjofjpfmshntimrjmrimqkmqlnpnnpnnpnknllomprpxyw{|z{|z{|z{{w|}{}}|~z|~~}}}{{}{{qnp~~~wYn{WNExf|~~{|~zuv}~wrq~}|{}}{}|~}{}}uu~|}||xzz|z|y{uwxyz{{uvyst~xy|}|ppxnnxpp}uuzut{vpkhton~||}{{nnnzzzusssqqzuvwqrykmzlnzlnzlnzlnZ[b__eecj\[\eac`^c\]_gggghhefdfgdgggjjjffffffjjjmmmjjjqqqlllqqqommrlmtlmpklvttyyy{mo{mozln|np~prqssvtikxpqvpqtpqeddywxutszwxytvxko~sv|osynq~qu~z|xsu~z|~y{{vxxwrxxp|{vxwt{yx}||{{|x|}rxxpxxryyv{~wzww}}|x~{~~~~~~{||~~}|{zzyzx{|zy~}~~~}}}y~~zy}|~}~}}~yvxzyostysy{|{}{~~}~y|}~{ztvtqtruxvsvtpsqronuqpyqq{ppzlm~rrtjiwv|uurnluqoupoupotrqpqootrtsrkpnhspank_lhkmmjjihieijflngnpjkjdijdejdcjcdmf]ki\ig_mkdlkiqqfmj`gcahddkgbieekhkonjnlosqlpn_cafhhehfdhccgabgaktjYdZblbdoeaka]g]enchrf_h_dkdjql_pkSb]\jf_jf`lhdnidmiclidljenjRYTjnbgn`eobesd\j\cg[|tkqdhpdeob_gaejhdgegkiijhoto[j\\i[iqegmakocbj^iqefobdmaenabqdbseWeY`ocbmddlegridodepggsh[f]dgejgfkgfkgfnollqphnmflkeljhnmhnminminmmsqekfgnh]kg`njdrn_micqmlwtdpmcqmfqnjmkqqobfbjnhkpgmrilrgsxnoujlqhmqkmqlnqonqonqoknllomprpwwvyyx{|zwywrtrwwswutzxxyuvz}}{|~~|zz}||~z|wz{zz{y|mnrgowq{st{}|~zx}z|wu~{{qs}~z|y{xzz|~{x|}ur~|y{vxy{xzz{z{{|{|ww~utxxww{vu}xszur~}}}ywwqqqvuutrr|wxztuyknylnylnylnylnLWZU`c]hjS]`U_bS\\VbaT^^_ghcefighecc\ZZeeedfffjiqprqorjilihjmlnurturtrnqpmoqmp|xz~rlmmhiqlmupqokgtpmsplrnknlgonpprunosuwzoosrqsyrsrklslmrklwqqsssvuuvvvuuuwxwtvsz{x{yyzxx|{}wx{vx|ux|y|}y|quvswx{vz|vz}}|}|~wxx}~~}|}}~}~|}~~~~uuu}~~~wxy~yzxywz}}~~~~|}|}|~|}|vwwqrxstz{~~vvv[evjfypxk|yc|{zwswp~|~~x|y~}{}{{z}yxwzxtvtwzxsvty|zss}rrvvysrsmmxp|vksodml`uvjilbqpjppkpoknkjeddkomhmkinlfolenkhmjgkfeidfjefjecje^ld_ld_me_me_meo}yZebbmjdmjgnknrlbe^eiabf^mpijoghqjfoibkebjg_fecjcbhbfjdce_de_bhbahabibckdhoh^e^lojlnijlhfhdlnjkuhss[j\\m_Yk]_ja_jb_ic_ic^ffaifcia^f\iqfhqfdm`_`]nqnbgdfmikqnkwt]lhftpakhbjgbkibmieokgliknkhhfjrndkhhokdkhdkgclhcmienjclhclh]gbagbelgjqlelf\c^ifeollnmhpojnngqvnjphimgejdloklomiljjmkwzx`cajmk_m_fsffsfftflzln|v\kgetonyvltqlrptxsjnhjoflrgoujvzuosnlpknrmmqlmqlmqlmqllpklpkqrnzsr{wvuvtpvskuryrrwsrqonqsqptsuyvu{ys|zw~y~y{xz~{v|t~vzlyotq}}tttz||}~~}~|~x{~~}}|yzz{z|wy}{y}yw}xzylnxyyz|||xyyytuyzy{y{{tuztuz{|vw|vw}}~|zz~||ywwxuuzwwvqrxstxttuqrkiinllqoppnnvtuNZ\XdfamoR^`T`b\ffkuuYee_hh_abmhjhffecciiieggdihihjfeglkmqprnmomjlliksprqnpqnpurtnllqooussywwvttommzxwvtsrpoommpoqqrvrswxy}klprprqlmxstytuytutoprrrrrrsssrrrrrrrusyzx~||zxx{z|vw{z{xy}vw{tuyuvzvxx}~vxyuwxxz{zx~|{|{}|z|yyy~z||}}}||xxx{{{{{{|~~|~~}{}}}~}~{z|}|~}|~~yzx}|zxx{yyxst~~cvmCxGjmw|s}}|{yy}{~|{z{y~zy}yxx{yvywvxvsvtvyw}ss{ppwxytsokjztkyshrod__Sqsglpdoojooionjtrqwutknlgljhmkhnldmjflhfjeeidfjdfjddjd]ld]ld^me^me^mejxt\hdbmjdljfnjjnibe\eh_eh_nqhlqhephfqiblfbki`iecjcbibfjdjlffhbcgaahacjcdjdgng^e^oplopljkgijflmiisfmzl_l^[l^[l^^i_^ia^hb^hb^gd^gcbib^f\jrgdlacl_jmkehfgljholgnkXeaO]Ykvs`kh`jfckhbmjbkhfmjjomlomsxvinlotrkpnjomiqnbkh`if`ifajgajgahccjefmhdkfbidikiqrplojlnhimdsynntihlgfjdmqlmqlmpnlnlsvtcfdjljcpb_l^`m_dqchugp}w]kgjuritqgpmiolswrjnhlqhinedj_cgbhlgptorvposnmqlmqlmqllpklpkqrnxppwsrstrovskvsytsqmlssqosqpustxsv}zp|zwtyzvw{z|||~}o~sgOv^So~}z|xz~}z~}}|zz}{{~{uv}~~z|~~tu{{vwuw|~}uv~xy||||~~z{y{y{|vx~xyyst|vx|vw}}zxx{yy|zz{yyytuzuvwrsvqrtoptrrqqqmmmooolllkkk`lnWce\hjWceVbdYbbWaaR^^^ff^_`kfhljjommkkkdffejidcea`bjikonpsrttqsnkmnkmqnpnkmsprwuuvttommwutnllmjinlkvtrwutrpomnopquqrvwx|jkoqprvqrztvsnowqrrrrrrrqqqrrrpppvwuvwuzzzxxxzy{vuyz|tuyvx|qrvtuyxz{|~uxxwyzz|}|z|{~}utv|||zzz|~~prr|~~{}}}}{yyxuu}{{www|~~~}~~{z|yzx~~}~|{~ˆI;{ˑg{{w}y}}}~}|ywv}{z~}{wvtwuvywvxvvxvvyw|ttvnn{zxtsnkjsqgtshrqeil`txlpthqriooinmjrqmtrqmnlikjglkfnkfljdjeeidfjddhddhdbhd]ld]ld^me^me^meeso^igdolbkifmjinedh]fk_hmahlaek``k`aldblgcngbkhbjcbibdkdghbdf`imgbib`g`bjbdldahauuqnokjkgjjfkkgbl_bl_^k]]l^[l^^j_^i_^ja`jd`if`jddjdai_god`g\\dX_b`mrphljcjfajghspcnkfolajgbifckh^ifenkjqngnkgljkqolqo{~kpnlqodkhmtq`gdcifdjhfljbjd^e`elgcjefmhhmkswujpkkpjhpfpvkjpehmcjnhkojimhrusmpnnqofigiljeob`j]`j]eobfpc`lfbmjlurgpmgnkhmkuytlpklpjineflahlgjninrmtxsnrmmqlmqlmqllpklpkqrnxppvrquvtovskvs}xwqmlvwunsqovstytt{xp{yxpuvtuyy{|z~}~`~_^MI{}~z}y|~xy~|}{{~~}{{y{~}}~~||zz~y{wy}wxxrs{{{z||~z{y{y{~xyz{yst}wx~xz~||}}xvv~~zxxytuzuvytuxstojkvttkkkmmmkkkkkkppp`lnQ]_coqWceP\^ckk\eedmm]cda_ag`ciggljjjjjdffhmlmlnjikonpnmolkmroqqnpjgipmoifhxuwutvutvqpr}}tsuuuuvvvvvwuuuwwxpqtrswqrvtuymnropqxvvusswuuywwywwtttrrrrrrooojjj~}yzxz{|wyyzxzvtx~}posvuytswvtx|{}xvyzy{zy{zy{|zxw{yxzqprxxx|~~xzzy{{~~~~uuu{}}~|~~~z||~}~~}}}}~~~|{{z~}~~~~{{{}|~~xxxtcphdgёY|{z{w~|~~|~~~z}{~zxw~}|xw}|sxvw|zv{yw|zuzx{vuqmk~}trqlmkoqgruisuipsgrvjrvjmnejkbllfonjpoklmiilgimhgmhelgdiddhcfjedhceidcid^me]ld]ld]ld^meaoiamffrkblfelghmdfj_imbhlahladj_`kb_j`cnfeoieohbjcajceleae_ae_fkeahaahaahacjcahaimhosnhlgimhhlgaj]\fYam_]k]^m_ama`kb`kdcnfbmfblfemfclbbl`isgktghmkgljcjg`jf\dbU_\]fcelibhfbgedig_khcliajg^gddlimpnkmkorpnqosvthnkpwtcjgfmjdkhgoldkfhojgnicjehoj`gdjrn`gbltnktjkqf`gZfkbinequnrvqtwunqojmkhkiiljisfnxkjtgfpcfpcjrldmjlspiomhmkknlwzxmqlimgnrltypjnihlghlgfjekojmqlmqlmqllpkmqlpqmzrrvrrstrovslwt{wvnlkrtrntqnvsu{vpwtq|zypuvyz}}{|y~}zІϛha͎s~y~|~||}~~~yz{stz||~yzz{y{y{|vxyzz{}wxz{z{|wx{|~xzytuxstztv~yzmhivttooopppnnngggpppS_aR^`\hjXdfNZ\_gg\ddbll`deebdlehiggmkkppp`bbafekjlqprpoqkjlkjltqsjgiolntqsliktqspoputvwvxyxzonovvvuuurrrzzy~~~rswpquprvpquijniklzxx~~trrrootrrtttsssrrrlllrrr~zy~}w|{qwvxuwwqvzy}wvz}|uuxxw{}|~~}|{}wvx}|~zy}{z|zy{|||~~~xzzwyyqssvuutttjjjyyy{}}|~~y{{{}}~|}{|{{||}yxz}|~yxw~~|||||{{{~EPOqKfz~}z|~}~~zxx|zzrttswr|}{}{zxvuyutolk~t{xszwnvsszw{wvurqsrqpqolnloujksfnsglqekocmqemndfg]mlgnnhpokllfjlfhlfgoggnggkfeidfjefjefjecid`og[jb\kc_nfaph`oganf`mdcnfemfsynswjhl`hl`gk^ltfbnb^j^aldald_hc_jb[b[W_Xahacgaahabibbibbibbibgngosnquphlgmqlae`fobenacm`^k]`m_`l`coccndcnfcmgdnhaldalbamadqehugejhdkh^fccmjmxu^fc`gddigehfehefig`ifdol`khepmdollpnhkigjhnqotwumqoLQOpushmkjomkpnfmhfmhcje]d_`gb]daryv_faowphqgouimthjpdlrglpkjnhwzxorpknlknlknlireR[Nbk^cl_gpcmsnlspjommpnmomoomjmklomlpknrlosmbfahlgmqljnilpkmqlosnkojmqlcgb{|x|ttwsrrsqmtqjurwsrnnlmpnltplurz{mtqozxp{ytyzuwx{}nxlw|su{|z{~~~~{}y|~||}~|~~~yz~}~uwqklc^_{{{y{{z{yzz|xz}wx|vw|vwyst}~~xyvpqxrs~xyyzupqwrsytu|wxsno|zzwwwrrrkkk\\\vvvT`bR^`Q]_[giS_abjj_ff_gg_cdfbdkdgiggljjuuu]__djhhgijikjiklkmonppmonkmwtvtqspmoqoqrswhimhjnoptstxoqroqrmopvxyprsnosrswrswrswnnrjlmrrryyyrssmmmuvvtttuuuvvvvvvrrrvpotrqy~t{zxuwyrw~zzv{{|y{|y{|y{zvx|~{yxw{{z|{z|zzz~z||uwwhjjy{{suu~y{{sss}}}~~z{y}||}}~{z|{z|v{y}}~P\mg]ʟu}|~~||~~x~|~~x|w~}~}{z}{zv}zqxumtqqxuzxwsrqnpnkomkpnnwkirfjtfjpcknblpdqsgvwmpqhooimngllgmlgklgknignggkfdhccgbbfadhcekf\kc[jb^me^me^me`nganf`mfdogdleZ`U`dXlodlpdlpdmtgan`_k_`kaald_jb\jbYe\ZaZbhbaibcjcbibahabibahabibflgflgcidmsn`gbgnacl_cl_`j]`m_`m_an`bna`la[f^bmealdalbal`iui`m_fmjgnk_healidsoelidigfigijhjhgjkiclifqnesoapldsolmkfgeghfqrpeecbecfigjljiljgjhdigahcfmhbhd^e`ahc`fdlpnY_Zntmhpfovipwhnuhjpemrijnhtwunpnknljnljmkdk^v}plsfjqdipchnjnsqlomrsqusrtsrnppkmlkojlpknrkw{vswrosnmqlptomqlkojosnqupjnixyu{sswsrstrnurjurusrlnlswultqgrontoz~p{yozxtyzy{|orp{}zb{fӆNzz|}z{}~~~~~~}}{{}}}~z{|}{}z|z|}|||qt|uv^XY}{{{{{y{{z{zzy{xz{||}~{|ztu}xy{uvvpq{vw{uvtopupqupq{vwytu}{{ssspppkkkdddpppP\^S_aR^`\hjZfhejkdijZbb]abidfkdghffjhhttt_aaglkkjljikmlnlkmnmosprpmoroqolnqnpkjl~cdhvw{uvzoptmopnpqnppmopuwxstxuvzxy}wx|qrvoqrtttzzzuuuwwwqqqrrrtttuuuxxxwww|wv{yxryxu}|urtxrw{w|}y~{w|{x||}z||z|~zxz|~}{zx|wvxyxz~~~wwwwyyz||{}}{}}z||wyyxzz|||zzz}}}}|zz{{}vuwyxz~|~{ynppvxxp-p_>k~~x}|~~~~~}|zyzs|yjspfoljspwxvqsqknljomjron{odsdisfgpchpblpdrthuwkrsjpqhmmgpnenoekoeioeinegkfeideid]a\bfacid`og\kc^me`ogbqi^ocaodbpddoddnclsflqbnsdin_gl]dk\]j\`m_cndepfdog\iaZe]Ye\aibbibahabibcjcbibcjcbibhnimsndjeoup`facj]cj\_h[`j]bl_`l^]j\`l`_j`VaY_jb_ld_mb_macqeZi[bifdnkcli[ie[iebgeadbbcakihlhgkjiajgXc`[ieaokYjfjkibcafgepqoghffigiljjmkehfcfd^ca`gbelg_faahcahcfhfmnl]_[oqkdh_ipdnufmtglsfkoglpjptrknlknljmkhljfm`ipckreipcgnagkforppqnxvuwrqvtsnppkmmknllpklplrvqosnnrlnrmmqlmqlkojosnuytmqlqrnyqqwsrstrnurjurusrjlj|qzwlvtpvqx|r}{ozxrwxz|}orq}~wpnvvz{{yy~~{~|yww~~~|~}x|vyw{{yst||~||{yyz{{y{{z{z{xzvxz{{|{|{|tnoxpq}tu{stz{{|wqrxstxttqlm~yz}{{ttttttrrroootttS^`T^`U`c\fiWbedijeij\ab]`ajegkdgiffiggonnhiihlknmolkmonpjikkiknkmmjlolnolnvsukjlosxbejmpvquyhkpnqupsworwdfjmptstxjkoppuxx}mnrqstuuuwwwvvvtttuuurrrqqppppttttuu~ttusqu|{v}|pmownsz}w{}w|~y|z}xz|wy|~x{|~{y~|{{z|yxz|{{wxx{~~~~~{}}u{z~put~v{z|||}}}|}}|z|y}{{||~~|||{~t}zy}u}r~{uvv}~~~~smbiQd>~Pm~~~|{{~txs~|~pnmu~{w}ltrgpmlurttsstrkoljpmkqnp}rbqdgtfhreiqdmrenqeqshqrhpqhooipngnngmogildinfehchkfjnhlpkilgdjd`ng_nfaoh`nf`nf]nc`oebpeblchoffk^hl]cgXej[jn_ho`\h[an`amaepfepg\iaXd\[f^aibbibaibaibajbbibfmfeleipknupbiddkfV]Xch\ag[^gZ_j]al_`k^[hZ`l`_k_VaW[f]`ld_mb^k`Yg[`naelibliXda[gdWd`gljjjhmkjigfjffjhgbliR]ZXfbVfbTfajkiab`fgelnlmnlnpnaeccgegjheigchecjdfnh^f`aicahcjifqnnihdssm]_Vfn_pwinthlrfjpezvnqojmkknliljgjhfmajqdipbjpdjpdgkfnnlrqpzyxnkjqpomopmppnqpmrmmqlotnmqllpjnrmmrlmqlosnkojdhcjnhoplwppwsrtvtouskurstrhkit|ypzwpvqv}zp|zq|zqvwxz{}~{{xv}x|mmrRvu~}{~~~||y|}xuu|}~~||~{}}{x|v~~~wuuvvv{|{z{{z{z{wytv|vwztv{uv~xyztuyqrxpqumnwpq{sttopwrs|vxrmnrnoqpprssuvvrsswxx^_`__`^_```a`abbcdddfecegceidfkdgmdglcgf`cidfqlnmlnmlnnkmjfhnikmjlmlnlkmkjlttvtsuprtgklotvoxw`ghnoptrtrsttsurstoqrnrsnrrsxximnpstuuuuuurrrsssqqqqtirwoquq{~uy}svykn|xy}||ussyvv}~{vw{}}xy{vxytu~wx{|}xy~~~zy{yxz~{}|~z|}|||||xxxwwwyzzzyy{||~~|zz~|}~~|~|~}|wuwmkmyxz{z{|zz~tzy~}xyw}||~iDr~L}1^yZujv~|yxv}|~}|~}~}}{{vt|{v|{z~}wzx|yytwwszyuyyt~tuxnpulmwnpukm^b_ktmhqgishhrfjthltgnwjoshmpgnnhnljppmlmj^c`ejgvjj_swkpvjjtgfodmpoknkdliiqlbkhSpgXphaohgidrlhrmeokahh\hi^fm^fo]cm]al\boa_na_nafmfemfeleahaahaWkbWoeXkb`mejrkovobgecgf\`_kpnhmkah``h__g\fobiqddna_h\`j]`j]ZdWcmabjcajcbjcbkcbjbcjgcjgemjgolYa^figefdgedjhgiedljhfmjbjgemjfnkkspklj`a_higjkighfbif]eb`heemjhqmfmhfj_inbik`kj_kj_nkfllgikejmgglflqimrjmrjkphmqkmqlopnopnmnlmnlhhfjogkpglrgkrelsfmnjlmkpsqswuelioxuguqhuqhureuqbupjqniolejipsrpqoknlnqompnhkilomorporpprprsqqrpqrporpjmkswuvzxv}xx~iqp~rzzt~~v~{~xw}{|zz{yd|WhIIqp}|}{z|~~{|tvuwyz|~~xy{|zzzyqry{z{x~{~~~}}{{{yzzrrr~uw~vyz|wytv|vwwqrztuzz{uv{qpvvuuxnnvvvjjww}rrwoomookpomsrelku|{^]_^]_^]__^``^`bbdedffcefceidfkdgnehogjvqsvrtliknmopoqmjllgirnpifhlkmlkmihjsrtsrtnprfjkpuvrwx`hhpoqtsumlnrqssrtoqrmqrmqrostostkopssssssrrrsssqqqtxm{}v~|x|}sx{~uxsjl|xy{{{ywwxst{vw|}z||wx{vwytu|}vxystyyy~}|~wtv}z|}xzwrt||||||{{{|||zzz|||uuuzzzrpp{yy~|x|{}~~|~}}~~}~u{znTq_yg}qvy~|y{~~qy~~~}|pxvu~pxwoutz~vxx~|{xwvtrqvvt{yx|uvsklwopxpptmnbecpwrfnghqgmwkjthhqdenainempgppjomlnnljmklqodigyzpopdrvjpxkmwjdnbgjh`cacjggnkenkTsjXog]keimhrmjtnhpmekj_hj^ho`ho`bl\cn^_l^`l_]k`dkdelefmfahaahaUjbWoeVh_ameaha^e^digdig\b`inldiggngcka`h_cl_hqddna`j]bl^ak^`j]bl`bjcbjcbjcbjcbjcelieliholpwtgnkfigefdgedgedfbbplkinlptrafdmqootrjljbdbghfjkiijh`gd]fcajgdmjhqnipkimagk_ik_kk_lj_khciicgidgkegkemqlkojnrnnrmmqllpknomlmkpqokljghflpjlqhlqhmtglsfopllnlorprwuiqmmurlzvkyudsobsodtphqnjrnimlqtrorpmpnnqompnlomnqopsqotrorpnrpnqoqrporpnqo|}wzxryts|yiqpzs|{xt}w~tzyy~wst{{kYZ[ar~~}~xz|z|~y{xz~}~|~y{|}|qswy|y||~~~}}}|~wy{}y{tv|qs~xyz{~xy{|{uvvvxxxx~ttvvwkkyyuiivjjzrrkmmkpomsrinnrzyZY[ZY[ZY[[Z\]\^b`bddfgdffceidfkdgkdgnhjfbdecenmolkmqprtqstoqwrtmjlrqspoqkjlrqspprknojlmnrsmrsiqqpoqpoqkjlmlnonprtuptuptukopnrsptuoooooorrrsssqqq}~vvyruxvquvmptuuvnnnrvvqut{xxqkltop{vwz{{vwzuvtop}uvz||vwssspoq|{}}z||~zzzzzzsss}}}|||}}}~~{yy~~}{{|||~|x|{tzy}y}|vvv~}xyw~{{{~{|z~~u{z~~}r{n{yux{z{xu~~~~~~|r}{owvy~uzyvxvrvsprporpxzxztvoijupqvpqrmngljjtnbmehsllwmhthisffncjnemoinpjkmkmnlnpnmrp`gdrujlpdmsft}pnylfrfehfY\[ahedkhdmjYrjXnf]iclpjrokqniomekkafh\in_ipabm\aj]ak__j`]k`ahaelehphahaahaVj`[ofQaY_iaag`cf`bgeejh^b`ejh_dbipiflfckack`fobcmabl`ak_ak_bl`ak_bjcbjcbjcbjcbjcbifdkhholdkhgnkfigefdgedgedb^]qmlinlmrp_ecinlchfjjhfgeghfhhfijhahe_he`ifdnjlurnupimagk_ik_kk_lj_jh`fg^gjabg]di`kojmpkosneidjninrmstrstrrrpkljmnllpjlpjlqhlrglsemmimnlsuswzxfkiszwozwkyucrnetpfwsktqmtqkronsqqtrqtrnqompnorpnqonqompnorpsvttwuwzxsvtptr{~|x{ylpnnupqxupvuy~~zzs~|w~lrq|qwtcccs|dwhh}f{dy~|}||~~t|{x{|~|~}~z|z|vxxz|}~~|~|~vx{}{ruy||y||~~~}}}~~~z|{np~suvxwy|vwz{z{yz|vv~tt~ttvvxx{qqzzvvvv|pp~rrzrrgiimoomrqjppnvuYXZYXZYXZZY[\Z\a`bdcehegfceidfkdgrmookmmkmnopmopmlnfegmjlplnytvroqvuwonpqprsrtmlnihjlopuyzknpmrsonplkmpoqnmopoqoqrmqrmqreijuyznrsuuuuuurrrsssqqq}usqstqrtulpqjqqlusltsput}~ohiwrsupq}xy{vwzuvwrsz{~suwqr|||{z|{z|zwygdf|~sss{{{yyywwwlll}}}{{{}}}zzz}}}~||{yywuuzzz}{||z~x~}z~~}||}{~{}}yzx~}{}~tzy~~}q~}xwuzt~~~}}{~vywlon}}v~}tzyw|{rwvottotsotslqpsxwuttmjjpoourronncjg^gdjsmmxpkukiujirfhsfkrkkoilmihigknlqvtmurlroqvkkpdmuhs~petfdrfimhhlggnignihrl[oh\mf^icmqlnminmgjlfhjahlanrfouhfm`dm`ak_aj``kcahaelekrkahaahaXh_^nfQ^Uaf`fg`ff`bfdchf^cadig\a_flhfmfelddlack``j^ak__i]cma_i]bk`bjcbjcbjcbjcbjcdkhfmjkroeliipmfigefdfdcigf_[Zqmlmomcfdfiglnlfighigijhfgeefdghfkrohqnenkenkmvsszuhl`hl`ik_kk_lj_kiafg^gjaejaejadkfnsqmrpfjihmkjpnmpnqtrqtrjmksvtnrmmqklpintjrxntsopnmopnvzxjpnqwtjurlvtdrnfuqkzvitqmvsnurnsqpusputlqolqolqokpninlorpnqolqoipmhnkorprusz}{svtx|rxwu{zxs~||flkyrrr|xzuypy{{}|~}|}}z|wyxz|~|~}~{}y{{~z||~|}}~{{|~}}~||}}|zzwyylnvxwywy~xy|vw}wx}wx|vwvv}ssvvzz|rrssttznnvjjttwwfffmoomrqmrqoutYXZXWYXWYXWY[Z\bacedfgdfhegidfhbdebdhgimnoeijbfgihjgfhifhlgipkmqnpsrtjikrqssrtpoqsoqnmooqrimnimnrqsmlnnmolkmvuwoqrjnonrsrvwy}~{llllllqqqsssrrrwsrvttxwwtuvqstpxwerpiurput~yz}uv~wrsvqrytu}xyz{xmoztu{{{tsuwvxvrtzwyz|}xzyyyzzzwww~~~zzz}}}yyyoootrr~~~~}}|||}~z~~~txw}~|~~{}}opnuvt}|~~x{y}kokj~wd~lċ}}|}{y|z~zy{{{}y{~|rus{~|{u~s{ztzyw|{sxwkrqirqdjigpolsrpsslmmhlkz{{knn_gf^jfhtplysfsldqhgrhjsiipiiojkojfig_dbchfmtqhqnpwlbj]isfiykfxifuikoimqkksliqjbne_nh`nhbkfmqlvvsficfjdilbloenrfnrfcj]dj_emcfngdle]d]dlddkdcjccjc]jbcogT\Uef`ie`ge`chfchfejhejhchfdjdcidgnfhpfemcclbbkaaj`R[Q^g]bkadle`hbbjdbjbbjcdkhgnkkroovsfljhkiefdhfefdca]\a]\nqojmkwzxmpnknljkihigijhijhcdbpxtlurfoldmjenkcjegk_gk_ik_kk_lj_jj_bcYqujgmbfla`hbfmjipmgnklspgmjknllommpnlomorpmqlmqlmqkotjv{r|{wwsrpnmpqopsqsxvirolvslxun|xq}itqitqktqnurotrpwtkrojqnnurkromrporporpnurhqnfpmknltwufigmpnuxvx~y|rwvpvtv{|nzxrzyrxwyt|x{{|uz~y{~~~z}{}}||{|wx}y|z|}~}yz|}~vwy{{yyxvv~~z|su{npxzwyxz|vw|vwuopwqr{uvwwuu|rr|rrvv{oo|pp}qqwwttzppnllpppnpplqplqp_^`^]_\[]ZY[\\^bacedfgdffceidfkfhmlnfhigjkglmhlmlkmlkmqnpqlnlgiliklkmonpqprnmopoqtrtpnpz|}qstkopvtvwvxonpmlnvuwlnofjkgklfjkfjkfjkrrrnnnqqqppptttxsuwrttqsqprtsuv}{|x{~yz|tuxstxstxstwrsz{~yzyzvx~xy|||wvxtqsroqzuw|~~~~vvv}}}{{{~~~{{{{{{}}}|zzx}~~~~~~~~~~xzzz||~~|~~}|~~~rsq}|nvtZo}‰~|{|z||w~u~w~v|{y~}tzyituiuudopfrrgrrntsjonhmltyxjpooywlwugro\hb_lcdqifpffqjhokjpjinmjom`echolhqnpyvqzofpcgvhhzlbvggxkkoieidiqjgohhsk`leenhfmhhnimrlbgbdjejnhinfdh]`aWbf[di^emfeledkf^e^dkddkdbjbbjbajbeog[`Zhgakfajfaafdafdchfdhf`fd`ecjpkgmhhnhdlbblabk``j_jshclb`i^aib^f_dle`hackdcjgdkhgnkaheaheiljcdbigfigfnjitpopqolmktusnommnljkihigijhkljklj^ebajgdmj`ifajgahcgk_gk_ik_kk_lj_kj`hi_oshioeglbeliejjinnjpomsrjpobgeafdmrprwulqompnmqlmqlkoiglbpokuqprpoppnrsqmqognknxunyvdrniwsesoeolcnkjqnlsplspkromtqpwtmtqinlorpnrpkspernfupuxvvxv{~|}~wzxx|w}~{}}wxxw{|x|{zyuzywxxwdm|~~|vw}~|~z{{|xpq{}}~~z{~|{||zzz{}wx~yz{}z|y{y{}rt|vw|vwyz~xy|vwvvyyxx{{xx|pp}qquu{{}qqyooqooqppnppnpplqpfega`b\[]^]__^`bacedfgdffceidfkfhgijdhiejkemmbjjlkmmlnqnpvqsxtvsprnnppoqpoqmlnonppkm~{}zxzsuvsuvyxzrprtsupoq{z|xz{rvwrvwquvvz{x|}vvvpppqqqrrrrrr|uz|v{xstqprpoqxyytzyy~x|{|wx~wx~yz|wx|wx}xy{|~vwvx|vw|{}~}wtv}z|~y{z|{{{}}}}}}ttt~~~||||||~~t|{t}|}}}}xzz~}~~~~}z|~||~xyw~~}~~}}yxvrq~vwurp݈PZơs}x~}}z~~z}~vrzysyxw|{rxwjxvlzxkywsm{zltshpohonmutjrqkvvkxveso]kh^lf_ngcpigrjjplipnjpmkpnryvnurlurjurmwkhsfhwih{lbxiewiotjlrhgpffoeozpdjegmhgmhekfflgahcdjehohinfgh^gh^`dYcf^dga`fbiojahaahaahabhbbhbbjcdkdef`njeshepjebgebgedigchf_db_dbpusjpkfmfbicbicaib`ha]e_emghpi^f_^f_fnh^f^dlefmjelignkbiffmjnqo_`^dbajhgmihpljnomlmkopnmnllmkjkihigijhfgemnl`gd`if`if^gd]fcahcgk_gk_ik_kk_lj_gg[ik_jnbel_el_gnkbjidll^fedmljqpkpneihlqonsqinlmpnmpnmqlkoiimgjgcpkjqlkqonopniljipmovsjurkvsbplbpl_mi_jggpmjpmhqnjtqktqmvslurnurstrntrktqguqixtx{ywzxsvty|ztwuz~y}~~|~~|wz~|~}~vpq}}}y{txx{z~~~}~~{}~|~xkmqs}~yzz{yz~{{z|}~{|z|{~~~~{|~~zz~yzxztvuw|~|~uw|vw|vw}wxwqr}wxuu{{yyzpp{qq~rrwkkuiitt{oo|rrxstrpppppnppnppYXZ]\^`_a_^a`_acacfegfcehegidffbd`efbghafgfoogppkjlihjlikqlnnikqnprprrprqoqrprnlnqlnsprxvxsrtrtuutvkjlmlnrqsvuwtvxostswxnrsx|}quvnnnlllqqqvvvnnnyqx|v|yswzvxwvxzyyyzzx{{z}}|yy{uv{|pkl{vwz{~yz{|}vwwx}wx{{{xxz~}xuwtqs~y{~xz|||{||uvv|||~~~~}}z~zt}y}~wwwxxx|~~yzxz{y~~||~xyw|}z~~w~}y~{v|{~~tus~~|}wmju`XҪi}{|uztz||~~w|{{|{~y||yvu}|v|{x}|szyky{n}}iwzVefUdfjusgrpgrpiushtrjvvgsscpndrnbpjcrlfrkgslirljpnloomqokqoW`]lwteolfodgtfjzlfxjezk`tfkpgglcdmcclbuuknijlhejeglgejedkidmgfnflpkhjakmdde\bf]fjd_e`jpmaha`g`ahaahaaha`g`ahaggbolfsjfqjfbgechffljfkhafbchgpuslrmdlebibaib`ha_g`^f_goh^f_^f_^f_iqj\d]emffmjbifcjgbjgcjgnro]^\fdbfdcjfejfdghfkljkljmnllmkjkihigijhjkiijhcigckhajg_hd\ebbhdgk_gk_ik_jk_lj_fg[mochm`dj^ah\emjdnlbjigqoiqqmutlsqholnuremjlspmoompnmqlptnoslqnkoiinkjywvqsppsqjroqyvjspdpm`okftpgtphtqjspfolfoljspirobkhenkszwrtrotrnxuiwsfxtvywtvtvxvz}{txvw|xvzxtvv|}~x|}wz|}~|xw}zzusy}~~}||}{z{~z{{}{{{x~|v|xytryv~|}{||}{}vxuwwyvxvx|vw|vwyz~uu{{~ttuuvv~sswkkwlltt~ssyppzwwqppppppppnppZXX^\\`^^caa`^^hbdd]`snpfcefdfegh]ffcllennptvkopmjlkhjmjlqnpqnptnosmnwrrsnnvpqwqrvnrxrtwrttqsusuttvpoqhgipoqzy{wwwsutsvwquvuz}ty|zy|jiktsuxvyqpr{uwytuxwvyyyxxxyxzvuxyxztsu}|~wvvyxw~yx|tt{wv{yxz{}xy|}z|}z|}{{}}|~~|~|y{ryzt{|t{{rzzu|}}}}~~~uwwvzzx||~~{v}|s{z|}~y~osruzx}~xyzz|~~~|vrs|||~~}}{~z|~uzx}~oml~|}}{{{}wxrgYhPb֫}||~~}}|z~lqp~}|{txr}zt|nxus}znvtsvvpvunutlvtnwvjrqiqpkrrjrqfnmr~|jwuesnbplesmiunotrkqnosqpsqpqnqmlnmkijiswunrpgnihrgr{oqymuznag[koflqhvzqsypu{r^WTmheljfdc_ggcgkffkfgkedi`ci^dj``f_^e_bibbibahaelecjc_f_\c\bib_jeS`[\iecojbnkcmjpwtfkimpjllfjhadfa|wsimh[le_lfbjcaibaibdle]e^[c\_g`aibaib_g`bjceihchfdigbgechfrvlZ_Rfh\ll`ki^dbYac^ikfklhkljkkkjkijkijkiijhijhfhffhffhffhfghffhdgjagjahlagk_jmanpdoshembfpggsjbnmfrsdoreqseprakllmoorrlnnhkkpsqptorvpmqlptorvqlqomqompntustrqpsqhtqguq^nj`snjtqktqktqiroiro~r{xgpmajgr|ymwtoyvl{wo~zl}yvywqtr}y}pyvv|zx~v|{v|{y}w|{wxx|}}xxy|x~mnxyw{}x}||}xvvgqpzstt~{{}~uw~z{}||||}rtvxvx}~wxtuu|zz{turttvzuv|wx}wxzuv~yz{utwqp~xxvpoyrrzvuz{{nppmppprrnpp`[\a\]b]^ided^`hadf_bqlnhegedfacdbhi\abkpq_bcijkjhjifhkhjolnqnpuoprlmytuqklwrsxrswpsvqsqnptrtvtvvuwtsuihjnmovuwxvvsrrwxypstux|vx|edfonptsuwvxqprystxsttrrvvvxxxxwy|{}tsurqs}|~yyyyut}uuuu~wwzwv}wx~yz~~uwxvxywvx{z|~{}}z|vz|v{|x}~x}~x}~}}}~~~xzzsttz||}{||y||w}||sxwz~}~~}zz~{y~||}z{ytus~}ztuvpq{}}|||yzx{|xz}{twuzzx~}usr~~~}}}||||||{{{}soqwrel^qoэ̇z||~||y~}z{|zr~r|q|ymxunzvozxnxttvvqwvovupvumutksrowvmvtksrksrp{yjwuetpesodrlfsklqomrpknlfigpqoqmlmkjnombecjmkipkckd`h^rxnrvjfj^fodhpfhpfhpfdlbd_\gd`ljfvuqlmigkfgkfgkeejabh]ci^bib_f_bibbibbibflf`g`_f_`g`fmfitqgvr[je[iecqmkvsryvgljjlfjlflndeidxrohmh\qi]mf^f_`hbckddledleckd`haaibbjb`ha`hbbhfgljafdchfgljnshbfZfh\hh\ki^ppertomoijlhjljjlijkijkijkiijhijhghfghfghfghfghfghdgicgjahlafj^fj^lnboshhpfepfhum_ljdppfrqcondpp_jijkpoqrprrlomqtrquplpkmqlrvqtxskpnqvtsus}~opnmpnguqftpx_plbrnktqktqktqirpirplurjspoxuiroenks}znwtozwm{wo~zq|twuqtr|qxux~|w|{uzyvzyx|{rrr}}}x~quxzz}v}s|x|w~~wz{|}~z{}{{z{{{yz|~vx~xy|}{|vxvx}rtvx{|rrr{yywxxzruzuv{vw|wxupqz{yts{wv{wvupoxsrzvuzzzpoosrrxxx{{{d^_d]^f`akded^`gbdhdfljlgegedfacd`bdYZ[jjlkhjtprifhifhlikpmoqnpuopvno|tusklzrswqrvqrwrtpnprstsuvzy{poqwvxpoqzy{wttvqrzvxolnxx|y{}|~mlntsuutvsrtyz{|zzzxxxwvx~~rqsqprzy{zyy|wvxxtt}ttupo~yzywwqqqyyywyzxz{yxzxxz~{}|~x||w{|x{|z~uxy{{{}}}~~~~y{{xzz~~vvwuttpqq~}}xzz}{}w{v~{z~z~~~~}~|{wx}{{{tusvxt{~z}{knly|z{yx}|~{yx~~|||||||~zlptm_Kf{}}}x~}z{y}~pxx~q{|}ezut|u~{rzxrzxnwtqxurttsttnrqovuktsqvuqwvrwvmsrlqpmwukvtispitqgsmhrjnqoqtr|}rusqmlnllopnqtriljflgfmfei`synnrfimbdmcgpfdmccmcYbXkhdgd`kkgyzvkojgkfgkfgkeglcbh\_eZ`g``g`bibbibbibfmf\d\_f_cjcelejspepmZebepmgroispipmfkiimgkoioriekfplielg\sk]oh]g_`hbckdbjdfngdlebjcaib`hb`hb^f_afdinlafdchfejhntihl`eg[il`gg[hi]lofikejjgjjfjjijkijkijkiijhijhghfghfghfghfghfghegicgichlbfj`hl`mocoshkshfpffskgtr`lmp||^jkfrrhrrjlmnpplpmiljosnptpkojosnosnswrqvtmtqmrpjmkssqrusitqhvrp{drnbtpmtqmtqmtqmtpmtppwtlspourmtqjqnu|xnxtpzwl{wp~zty|zsvtw|zryvw}{tzyqwvtzxw|{pppvvv~yqu}z|wzlrox}~~~|~{|~~~~rzy|~z|tw~~vv}~wxwx{st{st}vw|}wuuzuvwxxzsuwrsvqrzuv|wx}xywppyqq{{zrr|stzuttssdddmllyyyvuug^_j]_ndfk_af]^hadkfhlikdcecefeghgdfkginhknfirjmlginikqlnupruprvop{stwpptlm{stsmnroqvuwpprsvwnrspoqnmovuwnmo}|~xrsztuwrtuqsxsxsquhgisrttsutsutsu|vwqlmsqqyyyyyyxuw|~vrtvrtzwyxvv~uvyyzz{{wrq~yzvttxxx{{{vxyxz{xwyvuw~{}|~~|~zz|}{}zwzwwwxxx~~~yyyooo~~~z{}}{x|~~~}}~|}|{}|~}~|~}wxvstr~||~|{sss{{{x~wOl{Hw6r.nRYnvr}}}~~u{|~xyy|o~t|qzwt~zqzwlurpwttttrttputsxwoutmsrekjionjpokqpmutkvtjurhsphtniulqrpqtrjmkgljqvttpoqonjki_b`cfddjehnjhlfwzqmndkpdfoektjfodirhluk~zlmiehcvzukqlekfekfelefnd^f\ZbWcjcbibbibbibbibhnhY`Y_f_cjc_f_`hehrn`ifbkhgpmltqjomdigelefngjoffmhkieclf[sk^sj`kcaibaib`hackd^f_bjcaib`haaib\d]agbhnhekfcidagb_eZ_fYfj^gi]ml`ik_ilckndikeijfijfjkgjkgjkgijfijfghfghfghfghfghfghfghdgicgjahmamqfqsgoshjrgfqgq~vm{whuserperpdqnmxvkmnlnnhkihlfptonrmosnswrlpkuytsyvipmrwukpnknlrusitqjtqkyufuqetpmtqmtqmtqmtqmtqlspmtqholmtqjqnryvqxus|ynyvm|wu{~|wzx{~y}lur{~vxxwxy}tvvw}rv{}y{vy~pytz~|{|~y{}~zwy~}~~}}}}}y~sxwxxx~}||}|tu|}}rt}~vw{|}uvxy{||}zuv~xy~vv}uv~uvzuvxst~yz|wxwrsxppzz~~yy}uuzssxstmijlfgc``c^_gZ\fXZstl^`k]_ibeifhgfhacdafgfhiniknfjsjmpehshkmfikdgqjmzruvorxnp{pr~rt{oqzoqvnnvuwqstnqrptunstnmoihjlkmqpryxznhhytv|xzyuzutxnmorqsrqsrqstrt}wx}xyrrrxxxurt|~xuwxvxyvxzxx|wvxxvvriixsrjdezuv~~{{{vvvxz{xz{zy{zxz|~z|z}|~|~~xz}}}zzzwwwxxxvvv||||||}xy|}~}}}}~|nqkz|sxv~xy|}{{~||~~~z{~}~}wxv|~||}{}}}zzz}r}x~}yw}tcV}Z`yxwr~~~~~}~{x{tn}r|yovsy|{jqn{~vttrrrhjjy~}ptsotschgv{zlqpmrqipoiqpjspktqhrlmunvtsuvtjpnu{xpwttpopnmlmkjmkiljimgmql~znnfomeopflpgfmc`d[krhptkz{wtvrejeszuipkelgfmhemfclbcnadnbcjcbibbibaha`g`W^Wbib^e^`g`cjcgokmtqipmbifahecjggljejhfngaibdmccmgkjf`keYtk]tlaldckd`ha`hackdaib`ha`haaibaibaibbibeleahadkddkd]eZ^gZah[ei]ik_ik_hlajncjlfjlfhieikeikeileikeikeghfghfghfghfghfghfghdghdgidilcpthik_ei^bj`epf^kcaokfrqbomnzyerpU`_rttgjhlpkmqmx|w~}vzunrmptorvqpwtnxultqsxvikihmkmvsisphtqguqfuqnsqnsqnsqnsqnsqnsqnsqnsqotrinltywszwqyvYb_mxuwuxvwzx~v}zpyvputz||prr|~~qttyswxzwzv~~~|xxyy}}xxx~vy~~snp}~vttyyyz~}}}~tno}~y{z{|}yz{uv}wx~xzxstzpr{|{uvvqrz{~yz|wxxstxst|wxxppww~tt}rr}ss|ss{vw}wxyst{vvuopjY\ZHKhWZm[^m\_d]`a`b``bcefaefbdenikmfiqhkpdgpehlehmgjmfingjtmpynpzoq{qswln{pryqrswwlpqlqrlutmuurqsnmovuwsrttsuvsssno|xzzwzyy}stxutvutvqprqprsrtwqrz{ommsssxxxyuw|wy|wy{vx}xz{yytsrhba~uuxtsyxwzxx~|{}{xz{}y|x|wnqyqtvy||||||~~~~~}}~~{xx|}~yz|}~uwqw|z}wx{|zrus}yzz}}wysy||~xr{zvstt~mf|mtztn~~~y~w}|~}xp|w|rwuz}z~|v{yuxvvtttssjllxyzqwvqssjkkwxxoqqoqqjppirpjtpgpmlvppxqwtsttrhmkovsjspqmligfijhiljknljmllmk|zwpqjomepmftsknpghg^sulqphfkeekfahcpxseoiahcbhddkddmcdnbcmabibbib_f_bibfmfmtmnunaha^e^`g`fkilqomrpejhdigejhhnlinlhpi`kb`lbbnhinhbpjWtkXpheph_g`bjc`hb]e^ckd`ha`haaibaibaibbiceleahbbiccjc`h]aj]dk^cj]fj^jl`hl`jnchkbfhcdf`gidikeklgikeikegheghfghfghfghfghfghfghdikedf`ad\prfuynowlgrhcph[iehvr]kgm{wp~z_jgtwumpnuytmqkinevzutxsnrmptotxspyvmvsmtqszwmrpqvtntrjspitqguqguqpsqpsqpsqpsqpsqqtrqtrqtrqtrlnly}{qvtnurhqnjuru}vywqtrpusqxur{xpqrqqqzzzzzzsssxztryosz|vytz}}z{z{z|~~{zrvv~}|~|~|~wx}~z{|zz|||{}}~~|}~xuuxyuwtwxy|}{uv{uvztuxyy{{}yz||}||~xz|vxzvv|wxwrsxx|rryppvllvllvllwoprjkvnotlmtlmlX[nX[o[^p[^r^ag`cdcebdeaef`ef`denhjjeglehqhkynqpfjpgjnehrilvmpxlnylnzlnxkmylnrjkquvchimuujttjttrqstsuwvxwvxonpurrqppz{|uxywz~mosxwyutvqprrrtsrtxrs{vw~||rrruuuzuwzuw|wyzvx{wx{yyvywqnm~zy}|{x|z}xyxvv{}~y{|{z||uxz|wz}ru~tvuxyyy~~~}}}{yy}}zxxyww}}~z}}~~~~~|~~|w|{wxvy{u~}~~}y{{yx|s|r}zvywwwu{ttw{{{ztyx~||w}||txyx~s|x|qvtv{yx}{w|zuxvystwuurqqtvvtuvsuunpprttqssqsslrplrqmtqjqnnupjqjwsrtrpnrpnvsiurqmlecbcdbjmknpnoqnhjgwvrtpmqmhqnfuqisqimhaurjsogekffmhenhgrl`lfZd^\f`dogcndbnbbmacjccjcdkdbibahaw~wgngele`f``g`orppsqmpnjljhljjmkinljomfrj^kc^mb`nhjojbrkTsjPlbdph^f_dlebjbU]Vckd`habjdaibaibaibckackackabj`dlbbl`bl_bk^dk^dh\hl`hl`jnbjmdfi_ac]hlbilcjmcilcilcghdghfghfghfghfghffhefhfghdfhbhkbnpdkod`h]doeanf]kf]kg_mjhvr`nk_igorprwqrvpnrlinequpz~yfjeosnrvqclialiiroqwtkpnpusntrlspitqitqguqpsqpsqpsqpsqpsqrtrrtrrtrrtrnqowzx{~lqofmjnwts~{uxvuxvsxv{ktqtvv}}}zzzyyy|||~|rpzpt{}vy~|{{{~}|}~~rwv~{}~~~|{uqpvzsx~|~{}}xzwx~xy}~~~{yyz||}z~z~z~}vxuxxy}~|wx|wxytuz{|}yz~~yzz}xyzvv|xxwrsvqr|rr|pptt~rr~rr}rrwyxzsgjncel`ctbemZ]m[]q_atadhbefegefg`cdafgdhikhjgdfmgirknvmpphklcfofjsjnumptijtijthjtikymovnprwxs{{jttfpppoqwuwnmpwvxmmooookonruvmqrx|lptwvxtsusrttsuvtv{uv|}xvvpoorrrvps}ux|uxzrv|uxxvvoury{xzzxvxvntq}wx~yyywwwz|}xyzttvvtvywyy|z~x|txuyvzxyy|||xxxtttz{}~}zz|{{}||}{z{y{y~~~}~~|~|~v~~}|~~vwu~~}~}}{z}~~t}x~}~}}rzt{xv}vxt}r~www~~|~}}~z}w}zy}|rwuw|zx}{otr}~xtuvuuxyytttruunpporrnppqssqssmrqnsrnuripmpwrinhwsrrpompnjsofqnmjipomopnnpnnrpqrrdeersoqpkqnispjvngsjdwngzsl~unkrmbid^fadpjbojlvpeoiephepfbnbaladkddkdgngfmfdldyykrjgngahaahakmjonlqpomnlkmknnmjnlfkieng_kcbpfapihmh^ngTtjHd[`mf^h`bkdajbMVOengajcdmeaibaibaibckabj`dlbembhpfbl`bk^aj]dk^eh]hl`hl`jnbhlalofprllofilbfi`ildildghdghfghfghfghfghfffffgeijfhkemniruiqukowlhrifskfsmbohdqkgvocqkgsmkomnsnkpikqgflduytw{whmhrwsrwqktqeolmurmvsgnkkqonvsltqkspispguqosqosqpsqosqosqqtsqusqtrrussvtorpqvtinlryvnwty~{~|xzxrvt{nwt|}~zzz|{|~x|y|vyz|x|w||{|y~~~|{outnlkwutz}}~|}xstyvvvtt~~~y||{|||~|~y}}~}|}~{~y|{|{|z{{uvxst{sty|}rsztuvvvuxx}xyzuvz{zuvwss{qq~rruurrrr~ssthjlcdxno~tvuwAGGUZY\``a`abaac_afbdgcegbehcejgikjlfegkikmhjrknnmmfeejjimllrqqkjjkjjmkknmmustrqqqrswwyxwyqqrppqxmoxqrxuuvwwputprshrrryyvnqtwtqsopouuuxvv|yy|}{uv~xyxrsvprtpqxoptv}vvvpqokkvyyftrnyx{tvwxvvwvvuttoooyyy{{{{zzzww|xxgeeuwwx~||z{|yy{~syxx~}vzz}yyy~}~yz|}z{}~|}~~}~}~}~}yww~||~{{}{{{yy{|z~ssry}{}|xz~}|}{y|{~}bczlpv|rsos|abpzyx}wxyty|{~zzz}v||u{zu|{qwvsyxqusnrpmvrnvslvstsstttuuuttttttrurpsnrto~{okh|tutnprttpxwerqlomjmkjomnvshqnbrn^qm`qkdrjfshnukvrivnxkdzqg}ypxvpuvpac]rwpinheof`kaitjgrhdoecndflghnipvqjpkjpkjpliojhnjflgdjehc`xjhtifelghrlkojlljnomopnhhenolsjjlhgbge\ift_njani_njcrmXjfVgb`midokcnf`ld`i_bl`bkabkabjdemgajc`l`bl`ck`\cVpxkhl`gk`ilchkbhjdejadhccgbeifdgddeafgcefbefbfgcghdkihhiggjhchelpnltpahd]d`UZVmqnqrlmpggqhasgYpf[ui]qi[nfcsm`nh_kejmljonqwuqxwnutbifwywqrpgzv^qmivsjwtlyubnkhvriwsfvrfuqftplvsjtq}pxun{woyvtwusvtnsqsxvsxvu{yz~|wwu{xw{{yvutyxv~}~~~}~}{~z~~{|}wvu}|}~}}~ooyzxuvy{|y|z~xst~~~~~~wx{|}~|xz}z}wxxyy{y{vx}xyyxxwvvztv}vw|vx{ux}xzzuxyuw}vy}vyzuuzutzur}ssuu|rr|rr}ssxnnmeeqlkvrqxywqsqT\[X^]_ed]__^``b_agbdhcegbdhceifhkjlgfhsprfacmfihhhfffllllllqqqqqqjjjnnnnnnppptttmlnwvx{z|lkmnmozmoyqrxuu{}}rxwruvnzzowwzqtykonkmqqqyyyzxxzuvpjkuop~xy~xyqlm~yz{pruwxqrtuuesqhusuzyqssxvvvvvyyykkkyyyzzzyyyomm{vwnlltvvwuuxxxy~}o|yu{zuzyy{{~~~~~~{|{|~xy|}~{|ytuz||}~}|~~}}}~||}}zxx}}yww~||}{{wuu~~|str}~~~zwy|~}xvu~}}|~xyw~|~}{{z~swntq{nqnrz~}qt}~~}~x{y}|~}~}~~xzot~}kmmuwwuyt~y{{uxx}|syxx~}}u{zrxwpuskpnmvsmvskvstttttttttttttttsvtstrtusiji|yylih}uvroomooowverpppnlkjikitxvntrarn[ql`rkcrjgrhluktpk|tn~spslfdb^pmitsobb_swrjnjhqh]h^frgfrgcndeofflgflfcid_e`bhcX^Y`fajpkhniekffb^ufdymkhojfrlklhqihpjixqpqjjrjiriilhgdig^ifk|x`nj`nj_njaplYjfWhd_midolbme`kcbkabl`bkabka`gb]d_`kc`kcbkack`^eXlsfhl`fj`fi`fi`fhbch_cgacgabeccfdghdfgcjkgfgchiehiexywyzxpsqinlgljdmjipmdkhmpnnqonoilpfjsidtiXpd[th[ph[mfftnftnlxrntrnrqqwvpxwlwuryv}~|xywi}xbvqjxtjxtlzvftphvriwseurfuqftphvrjurrxvirop~znzvtxvtvtrwurwusxvuzxw|zzxwwut{yxxvuywv}|~|~}|}vxx~}t}|twut~|~~y{uxwyzz{~~wt}}~}||~}w~uxz~}~vpq|}xzy{}z{xxxyyy|vw~xx{}z|{}~z|}wwzxzuruqlxw{qqyoo{qq~ss~ttzz~}{wvurqxywPXWU[Zagf]__^``b_agbdhcefacgbdhfhihjutv}z|facngjgggjjjnnnkkkpppnnnllltttnnnppptttqprvuwvuwutvjikwkmzrsywwtwwionrvwnzzgooxorvztqswww|||~||zuvpjk{stz{|}rppeddxnptv|qsvmn}uvwwwftrdqow|{suuywwvvvsssrrrttt{{{sqq|~~z{vw{zzyq~|u{zv{zxzz}}}z{||~xyz{~|}}~|xx~yz{|~z~~}}~~~~~~~||pnn}~|{|zvwu}}~~}yusrwut{wyy~|~}{w}|jnovpzrurvx}rvx{~|||x{y~}~~}nut}zsyxoutsyxx~}pvvpvupushljmvsmvskvstttttttttttttttqrpopnqrp|}{wxvjih}~srrjmlowvftrsonifebcaxywpsqaro]qlbrkcqkgrjltmtuurroxtthhenpoigbrqmklhjoijnihpibicgohgnhemffngflhdjdiojflghni`faflglrmiojekfXTPvigwnkkuoerlfgcrggpff{ppxmmshhlfekhgdig\gd^pl]jf^if\jfdsoarn]mi`njali^ia`kcbkabl`bkabkabid^e``kc`kcbkabj_bi\gnagk_fj^fi`fi`fhbch_cgacgacfdehfhieijfijfjkgjlhlmi~~|Z\Zhnlhmkhol`ifmtqX_\rusiljmnhjnfhrhftjZla^sf^oh^ngbpjdrllxrsxwpvuu{zmvunyws{xwxvuvth|wbvqhvrftpcqmxr|kyuavpduqgvrftpixts{xnwtq{ozwuxvtxvuzxsxvqvtqvtqvtzxwvtsusrxvuywv}yx{z~~~}~~z~uww}~{|}}yszv|qpyxst{z|}surww~uww~~~}~~~~|~}xy}~~y~x{y}}|}~xyyz{prtv~~yz}}}}}}z{zz{}|~{}~~y{~{~{|zu~wt{ss{ssww}uu|ttrjjzutsonqnmtqpS[ZX^]_edY[[Y[[b_agbdhcefacgbdhegbac^]_}jfhrknjjjnnnqqqkkkpppooonnnnnnmmmssspppwvxnmozy{|{}mlnwlnpijhggqvuowvvz{nzzckkril}osxuwzzz}{{upqystwopvpqupqkjjnppslmwxuwvkmxvviwubomtyxrtt|zzyyyzzzlll~~~kiiytusqq}{xstyzxvvu}|n|zw}|y~}y{{xxx|}}~z|z{||}~|}|}{|z{y~}}{yy~~}}}}}zzz{{{~||mkk{|zz{y}}~|zz~~~}}yyy}|tzy~~~y{rzlxsvptqvx|z}|~}}~x{y}~|}|{{{}~{x|vws|{q|zyvx~{x~}rxwkqpw}|pusdigmvsmvskvstttttttttttttttssspppoqqy{{ehhvzyxuulmmekjqyxhusntrkroltqqzwcokaro]pmbqmeqkiqjlsnmrthkluxzpstosuwsstrqqrpknljmlhpjfnggohemfdlefnggmhagbmsnhnhgmhdjeekfiojhnjdjeQPLqecyroiuo_oh]b]khgjhgqnmsqpokjiedjhgfki`jg\kg^if^if^kgdrnftp]lhaok\gd^h`_jbdmcbl`bkabkabhdbid`jd`jdbjcbj`dj_ci^fj^ei^gjagjagicdi`eicfjdiljgjhlmiqrnklhlmilmimnjy|zZ][kpnkspipmbkhipmdkhjmkjmklpjhnefoeivk[j_`qfbqi`phbrjbqifsklrqnsrqyxkvtlywt}zuvtyzxj~yfzujxtftpdrnaok^lhaokaupduqdvretpjxtoxus|ym{wp{xx{yuxvuzxv{yuzxtywrwuwut}{zxvuxvuywv{wv{z~}{wv}w|{zptoywrs~~vwxxvxrwjs{vxx{yyzy~}~~{yy}|{~~z|}zz}rw{~}~z{|tuyqrupq~~~|}|}}xzz|}z|z|{v}urjxvl|zo~wt}uuummzrrzqq~vvoffzutuponji~S[Z\baW]\RTTY[[dacfacgbdfbdd_adackjlsrt}z|_Z\ibemmmgggkkkmmmoooqqqjjjhhhooopppssstsupoq~}utvlkmskltoplllsxws|{vz{iuurzzriluytqstttyyyhffytuwqr~vwpjkollijjkqpuqqystuopxytrresqkxvuzyrttusspppqqqtttmmm{{{nllz{ywwsuuy~rqq~yzrppqxwn|zv|{x~|y{{{{{~~~|wxyz|}}~yz~{|z{|}{||}x}|z|||zz{yy}}~~~z{y~~{zvywvzxw}~~~|||z~|||x~w~nxlxx{x|puy}z|~ywv~~qsr~xwtts~v~}v|zu{zrxwlrqv|zlqolqolurlurlwtuuuuuuuuuuuutttrppzzzrttpvtmsr|lllqutsyxv~}mxvfxsi{v_snk{^vpatr`qocpnepmipkjomjotpx|`glhnsgkpurprporspcfdknliokhnigmhhnigmhflggmhhnijpkiojhnibhcgmhjplhniagbefbzroupm^mg[ng`idemkZc`aigZda`hfnkjhgf]b`dmjdrndnkenkWb__miYie`ok^lh\gd]h``kcfoebl`bkablbahcahc`jd`jdbjcbjadi`dj_fj^fj_fi`fi`fhbejagkehlflomiljuvr}~zhiefgchiejkgknlV\Zpwtgnkgpm`iffmjahempnsvtjrkfoeirhgpfeoecpfhujcrfeshaqfbrgbhgdlkiurlxvjwumvsstrwxvfzug{vq{guqhvrhvriwsx`vqdxshyudsohwsr{xt}zlzvp{xdgetwurxvpusqvtsxvsxvusr~|{{yxywvwut{wvxts}|}}yknv|wvxx|uwptu{|{z||}~~~{yy{zz~~~yz|}|{}z~z}sxy}}~|}{||}}~ttt}}}|}|}ytv{vx|~z|~y{~zu{vwtl}{q}{p}xu{wvyuswrquqoxtswrqxsr|tt|tt~uuU]\X^][a`eggfhhkhjfacgbdhcee`bfcehgikjlheghceohkkkkhhhiiiqqqpppvvvwwwzzzssspppttttsurqsutvrqsonpvnn|wxz{{qwvdomkopkwws{{tkn}osvsujjj{yyz{uwwqrwvvqttowvnpptttutt{uvuuuhvtjwurwvtvvzxxzzzxxxuuutttrrr|zz|wxusstvvszyjmm|||trrx{{v||v|{x}|{}}yyy~~~zuvz{yz||yz|}~yzz{{|{|{|y~}~~~||qoo}~|~}~~}~~}nlk~|{}|{wv~z||}zt|epguuxswnsx|wz~~~}}}zxzzxxzzx~rxwv|{syxrxwsyxntrnrpnwtpyvp{xwwwuuussstttvvvtqsxuwwyzkpqajk[ddqutnsrionhpoeqnf|vbwrVmhj}[wq`rqbpodpnhqmkqkjpmjotmvz`koirvkpurmnrppsssdffjlljmkiljhkihkiikjiljgmhiojiojhnigmhcidgmhjpjgmhekfkmixuqcun]sk^lf]miVgc^miYjf`plomlefdchf]fc\fd^fceli[da^ifZhddrn]kg_jg`jb`kcbkacmabkaaj`bhdbhd`if`ifbidbjbdj`dj`fj^fj_fi`fi`fhbfkbgkehlffigfigab^jkghieijfhiejmhjom^b`ntqgpmiurmvsgnkbifmpnorpiqjdoeendgpffmdgndhqghsieshbrgdsiiqpw~nxvjwuixvmvstusopn`toj~yhvrhvrhvrm{whvr^lh]sn`vq^snctpfuqr{xu~{ftpp{xy|zrwusxvw|zqvtsxv}{ztrqxvuywvxvuzvuvrq~zy}|{wv|xwsprx}{{uv~vedwy{|jtz{}~}x|z|wywytv{|~z{|}~{x|y~z~|}{|z||}}}{vw{vwuuu|||{|{||~~y{|wyytvxsp}xu|xszwp~{rxspsnm~xw|{}xw{vuwrqvqp}rr{qqrffS[ZU[ZZ`_WYYaccjgihced`bojle`bpmorqskjlkhjmhjqjmoooiiieeennnhhh```jjjuuusssrrrsssonpqprpoqqprsrtuopvsssuuoutjusvz{httjrrxor|liktttkkkommytu{uv}rtzttxxxkpolwuryxu{zz}}}~~wvvuwwjxvjwumrqsuuzxxvvvxxx{{{{{{~~~vvvywwxstywwu}|nwu|}~{yy|}}{x}||~~~~~~yz}~{|{|{||}|}}~{|~|~z~}{{}}{{{}}wuu}~|~{yy~|~~|~~}{{xzz}s|eqiwrutxv{x|wzx|~{|z~~|z|xyw}|qwvv|{v|{u{zsyxqvtptrlurpyvs~{vvvuuuttttttrrr}z|wtvmoognncnns}}msrflk_gfbjiltsp}yanjl|xduqctpcrpanpdomhppkpolppmrudoqgtvirvfhmqlmommqqqeggikkjmkiljhkihkihjhgjhiojgmhiojhnigmhdjeflhhnjhnhflggkf~zwhgc^pi]tlcqk\he]jg]jgcqmXeb\][X\Z\a_`if]fc^ebahe^gdcnkdrnVd`]kg`khbme`kcbkaak_bkaclbbjdbjd`if`ifbiddiefidfkafj^fj_fi`fi`fhb`e\ae_mqkhkihkidd`efbdeaoplffbfjeejhZa^ktqdmjbmjdmjahedkhqtrorpfqhdshgpfmqhfi`cf]iqfnxlesgbsfdwjfmls~|drphvtjxvirotusrsqZnikzkyuhvrhvrp~zjxtm{w_vqbxs`tnevrfwsmvsr|xlzvp{xy|zx{yv{yv{yuzxmrpjnlxvuxvuxvuzxwywvzvuxts}yx{z|wyy{{z}zzw~yy{vw{|}~|x|z|yz~vx|~y{{}}w{{z~||z|zz}|{zzz}wxxstrrrxxx}wx}wx|wy|wywrtzvxxsuvppwrr{vtxsp~zuxusokjokjokjtpouqp{vutonxnn}qq}~U]\Y`_\b`X\[accb`biegb]_ZUX`\^jghjhjjikjfhvptrlolllmmmkkkqqqfffttuwxwsssmnmtttooonmousuqoqtrtutvysttrrqsspvuhtrlpqlwwlstxps{osnln~sqrxrs~tu{vwxxxpwvoywkvtktspvuvzyvyytyxlzxkwuotswxx{yxwwwzzz|||}}}zzzz{zwvuvrsuss~oyxnyw|{yy~||tzyw{z||||}z{z|~~||z{|}~y||~~~~}}~||zxx~~}z{yvuu~|~}zy}~zxw}y}~~ztmyn|swpspty~wzz~~{{{}{w}|y~tzytzyu{zx~}u{zu{zsxvrwuowtktpdolrrrvuuwwwssssssfcemkooqulrviuwuv}|jrq}r{yuzxehgtywfnkhpncpp`mocmnkqpnqonpoglmcnnlzxlvvhlmqmnommnnngiihjjlomlpljnkjnjgjgdgdinijpkkrmkqljpkdjeekfhniiniekegmh{xsqrn`tl_umdqk`ecgnkjomjqnfkinnlpsqotrdkhajgckh^fcaifakhfpmYgc_mi`jhbmebnefnfak`ckbbkbbidcjeaifahgbidejefjdfjcfj^fi_fi`fhafhbx~vdicuytjnlgkifhdgidbc_wwtefbdfbhmj\c_iqm_jhcnkfnkholiolorpiljcoggtjktkmqistmxypovkr|peqfctgevjdpno{yhushvtkywrzwvwuwxvj}xj|xhvrhuqguqo}yn|xhvrbxsavq`upexseuqr{xpyvq~{r|yy|zvywv{yx|zqvtuzxw|z|zywuu|{yzywxwvzvv|xv}||z{|~~z|u||~szhss}|v|{}{~||~{}}yzy{|}{}z|~{{}x|x}z~{|z{~yz|zzwwwztuxturrrwwwzvw{uvytw}x{rnpzux{wyz}yqu|vvwqq~zvyut|{vrqokjuqpvrq~xxtnmyno~rrpqXcaVb`]eebgi]ae^bf`ffagf`fe_fccheqlnqlnofmt}|oykmnlnnruuvywrvqtuqtsntrpqplrpmsqproqtnqxpsuprrqsstutuwqsttvxikmppqvvwpqrusutsuonqvv~{|qqu{|}|}wwwuttzzzuvvrssrrstttvwwwwwwwwuwwrvwrvwvxyxwyxwy{z|xwyy{|y|}uyzx|}x{|vyztwxz~y}~w{|x|}|}~|{}xxzmnnmmm}}}yyy~xyz{yz~yzxtu|{{~~~~vttr{y}y}{svs|~|xvu~}~~}}~~|zyxvu}|~~|{|v~msvyuxvwzz|}}}~zzy{{y|wq}{mwuoyws{zw|{{tvvpsspvvmtsiqpsvttwux|zvzwvywnnpsuyrvzqw{frthtwpy}hrrdlkmvspwpovqmtonvpgnihoijttjvxgnoovtkmllqoisrdnnO[[fsrdqqhilijkgii_b`hkiquomqjkphjngfjcch_rvkiqfitkhwnctmcmjhrodmjipmfkigiglkjlmlgihmpmilk`hedmjluqclifnkjnlhkigljcjgajg`lhcpl`mi^lh\kg_mi]ke^jdakednhfmieif`d`ciemtqbkifjhhigfhfhigkljjjhhjehjeikfhiejkg_ienxtnxvjuqfpmdkfcidgkfeje^_[de_qqgprjkqjhqkhtnjnljnllomvywnqomljrvsovrhplpqn}{yikfqvpkrlgrkjvo`wt`urdsqhtrntstxvuvt~rtrorpiqphqpozxhusuqttpsspssqttvyylrosxvuxvy|{yywwzxqyvx}v{yv{yy|z}y}z|}mutu}zw}{~{vz}}yy|xyu}}}~||v|y|{}x{}x}vxx~}}~ryrvu~~}~}~vyx|~z~x|{uyvz{x~~x}{}z{~zzz{{uyxswvw{z{~npo|}}nppwyxuwvzxwzwwxwuzwvxvuwutljizxwljjtrqtpn}rux{tw{psrvX_^\cb`de^`d^^b]`dbfgchgeih`ecjmkrmowrtk`hodloaljlmdfgbddfigimhommqootrqqonrposqpqnp}vyypsxsusrtqstvxyuwxxz{jlmihjqprsrttsuwvxvuyrqzuu{yz~vxxvxyvvvtttxxxzzztttwwwvvvvvvwwwwwwuwwswxswxtvwxwy|{}|{}zy{{}~|z~swxuyzy}~x||y}~vz{x|~w{|xz{|{}|{}zzzxxx~~~~~~xwwvvvrss}vwsu~}~~p{y|}z}{~|}|}|z~}~~~}~}}uovwz|}}|st~~}|}z~||~|{}xt|{mxvozxqyxjonotstvvqssrxwpvtksruxvpsqpsqz}{}~gklquvjqqissiutjvvluxt~~ltsjro}ntrkromtqipmjpnhqtu~jptkpqlnonsqhrrgqqWccamm_mlhjnjlnmooknliljhlfglcinejpfpuluzqx{pmukbmfetlbrkfqnfoljsppwt[`^nomqrpfgeopnopnnqoenk^hefoldmjdnjhljfigdigcjgajg`kh_nj^mh^mh]kgZhdR`ZZf`_icblfelghkijmkejhovsenkdgelmkkljkljmnllljhjfhjfjjfhjfklhdoljvritqitq`khcjeiojimhjninokrrlrpfpphkqjjrlhtnknlhki\_]jmkpsqsqppsqovshpmmnl|zyllhvzuovqfqjkwq]vr_tqdsphrpmsroqovwutus~}rsqpsqmrqjrqfqo^kitvxxqssprrxzz~jomotrtxvuxvwxvy|zoxuw~{vzxv|zy|z}y~z|}qyxv|z~|x|}~y{uzuotozzwz~uss~sxv~|wuvxtyzxyxyvyyut||~~}~}~}~}}~}~quvz{y}yy~|~~yz|wxvvvwyyrssqssxzzmll{{{qqprrruttzxw{yx{yxywvxvuqonywvsqpmkjxvusonxmp|qtwlo{psodg]``^aadde`]bd_d`ae`de_dcafedjhdgemhjqlnujrj_g|nylmrmookmnhjimpnmkjqonrpoqonrposqprprwpsvmpsnppoqqstwyzsuv|~tvxxwywvxpoqqprzy{~}wvvv|prsuwx{{{uuurrrwwwyyyxxxvvvwwwwwwuwwtxytxyvxy{z|}|~yxzwvxy{||w{|vz{uyz|z~w{|z~w{|z|}~zy{sssyyy}~~x{{~~~qt{~~~|||~~|zyz~|v{yw|zwzxwxvsqp~|{~|}}{{zxx~~}}{zsqp|zy~~~~~}|xovy|uuywmn{xxuxw|{xyx}x~}x~|r{zozxqyx}putv{ztvvqssrxwqwvmuttvtxzxxzxmpninnqyyjssjttiuveopZbbkrrnzxozweplisofolhrnhrnisojswlt{iptlpuswychiisskuuhqqdnnblljjnlnonppnqompnhlfhmdkpgkpgotkrwnsxoouldnfszftmepmajglspqvt]b`qrptusdfdmnlnpnorp`gdntqfmjcjggnjgjhdgechfcjgajg`kh_if`jhaliali\gdSa[\hbblfblf`gbehfjmk`ecgnk[dafigkljmnlkljmnlmnljjfjjfjkgjjfllhhqnkspiroajgoxuhojcidgkfimhpqmmnhppfnpfipimtojunorporptwuehflomttrpsqmspeliikivutmqltxsovqhojkuo_vratpdrphpokqp~}~nomwxvtusruspvupvudmlbmkynppnpptvvrttqssv{ysxvsvtvywz{y|}u|yrzwv|zy|z|}{}y~{}~v~}z{{zv|}yx~yuyx~yx|x}yuqz{|{yyx}{}swy|}~qnp}|}|~~~~~|}}~}~z}x{}}z~pt{z~z~|zz~{~z{~wxvvvvxxqss~~vvvysttqq~{{~xyzxwwutusrywvxvuvtsusrsrpomlywvtpoz}{ps}ruvyfee`]]gbdd^cogljimgijbddgiihjhkljkfhhceodlpemugrlmpnoskmnikkjmkpnnussqooqoorppsqqurtyru{vxqprqstvxymopmophjkonpqprqprsrtonpmlpwvttz{|]_`vxy}}}~~~}}}}}}vvvuuuuuuuuuwwwwwwuwwuyzuyzy{||{}|{}{z|xwy{}~x|}swxvz{vz{vz{|z~{|w{|vxy~|~wwwzzzzzzx|{tzyv}|{}}{~}~z{~}{}{|{{vywtus}|~~||~{{yx~z{|}~xz{uxyoyiqquvuwvpnvtspusxx{}cfh{}~~zyu|y}|{~xyy|~t|{p{yowvagfsxwnsrtvvqsspvupvtmutrwuv{yuzxlqouzxhonmutlxveqnnxvgqofllnwvlwudommzwhonellfnmjrqksriowkpyiktjmsotwhorhttmwwissfnnqxxjkojlmjlllomknlkoiinekpginelrhotklqglpjX_Zgqkcmjjspflilspinlorpedcsqpwttgedomllmk]daksphpl_fcholgjhehfdigcjgajg_kh\hd_jgalidol_jgXf`]iccmggqkkrmbecgjh_db_fc^gdjmkhiglmkjkilmkkljjkgjkgklhjkglmigpmirojspfolqzwdkfgmhfjecgbllhmoinoelofhphoupmtonqoqtrlomcfdmpnorptwukpnfkimpnptrntokqlmsngniipk]tp`spdqoipolqpstrz{yuvttusuvtrusrwvqwvenmaljp{yrttnpptvv|~~vxxw|zsxvvywuxvxywy|zt|xy~|z|zz}{}~|~z|~~z{w~{|||~|w~{w}}y}{|xvqxqnp}~}}~|}~}~|}}~}~|z}|}z}~sv{y}y}vzz~zz{~~z{|zzwwwwww{{{wvvxyrklxqrztt|uu{wvzvuzvu{wvzvuwsrvrpxtsqmlwsrwrq~rvshkxmp|qt}rue`aOIJqildY_k_ehfjfhidfffhhiljkljnjlqlnshpvksxjueektuyz{hjkkmmpnnwuupnmlkjrposqqspre^ai`cpkmtsuprsrturtusuvrtuwvxtsuonpjik}|~|{vv~rrxnosrtusuvyyyyyywwwooorrrwwwwwwuuuuuuxxxxzzw{|x||{}~zy{|{}{z|~{}~{rvw{w{|ost~{~y}~uyzuwxwwwuuu~~~tvvv{z}u~}xs}v}z~}~~~{|}v|r{xx~~~{~|wxvzxw~}|}{z~~{~~||}y~~z}xwsz}{yz|}~}|zxwwt~[btxqqklrrpputsuxy}~|~z~~z~y}|wv|wv}y~zxvvoqr}rssx{zwyy~qyxozxqyxtzxw|{sxwtvvqssoutouthpopwt|v}zt|ys{xgons{znutlsrouttyxsyxu{zjvto|zhvtfqoaljepngsphtqdinmqw{chkfnogppcoolvvltt[`amqrhimhjkegggjhiljhlfjoflqhjofkpglqhlpjmqkekfkrosyxlspcjginlnqojmkljimlkomlhffomlopndiginllqoejhdigfigdgechfbif`ifaif^fc`ifdmjfnlhspesm]ic\f`blfbidiljfig[`^RYVZc`mpncdbjljhigjkilmkijfhieijfhiejkgjqnovsjqnqxuqxufmhekfimhgkfhiejlfoshmrihkfflgjplknljmkknlnqompnotrpsqpsqrustwutzxrytqxscidqwrpvqh}z_pmbommsrprrttr|}{{|zyzxyzxprpqwvrwvoutksrp|zqssrtty{{tvvtvvy~|rwusvtvywz{ytwuvzxv{yuyw|}z{yx~z~~yv|w~{oqnw|lwtx|tyw{{{|yy}}|~~xy|{||||z|}~|}~~{~}wz|y|wzx{}vy}|ywxxy}{{yzzvwwxxx}}}~~~rt}qsxzuwvyzut~yx|wv}xw|wvzttvqpupoupoytrtonynqshk|qt{ps|rtsmnZTUhadi]cj^deafhfikkklllqrpab`mhjqlnnckmbjsepmlvppvmnrlookmnlikvsuolnsprsprsprqnptmp}twzuwrqsprsuwxuwxkmnjlmrqsrqsrprnmotsuutxut}mmsqrvuwxsuvzzz{{{vvvwwwxxxuuusssqqqtttuuutvvx||{}~xwy|{}~}z|~|x|}~x|}quv}uyzy}~y}~w{|xxx|||}x~}x~}|yq{z~~x|}|wx~}}~yzq|yz}z}{}|~z~~zzzswv|w~}xyu|}yzyu~zxw}|ywvywv|}}{yx{yx{s|gnrwtv\`mpnovwstvw{|y||}~|}~}|{z|{}|zxx|~txy{~qvvtyxv{ztyxx~}pzxozxpxxrxwv{ztzxtvvqsspvuoutnvupwty|qxusyvryvlspourlpnoqottsuwuqvupwtitrmzzhvxhqrdnnfpphrrissosxtxzx}gonnzxcom`llisschisxyfhifgkhjkegggjhiljhlfjofjofjofkpglqhkoilplgjhknny{{holhlkgljmmkkljljhqllqmlnjiqmlolkgjhlomkmkhjhiljgjhdhfdhfbif`ifajg_he`jfcmjcljfplbpj_ke`jd_ic_faehfadbjomSZWs|yjmkefdijhijhkljlnljkghjfijfhjfllhjnljompusmrpmrpelgekfhlghlghieoqkntikpguysosngkfgjhmpnrusvywvywhnkimkqpomljsvtzmwqovqiojuytswri|ybqodpnlrpoqqvwustr{|zqrp{|zstuoutntslrqpxwvxxxzzwyyoqqrttsxvotrrusuxvxzxvxvw|zz}{yzx}zzvutuqvqstw~v|w~{w~s~|u}|ots~~~|y}~~~|}z}~}~~}~}~~{}~~}~|}~}}vxwz}xor~x{y|}wyz}}uvyz|wxxvvwuuwuuecc~~vwqij}~xyxpqzut~yxyts{wv|wv|xwwrqsnmsnmytsysrzorshk}ru}ru|qt\ZZe_ae^akagqgmd`fedfdddjjjkljlmke`b|~odlqfn|nymlujjoeekpqvnpqqnptqsnkmqnproqxuwqnpvorzqtxtvrrtqsttvvtvwrtukmnqprrqssrtkjlmlnvuypoxnntz{uwxoqrppptttmmmpppwwwwwwsssnnntttvvvtvvx|}y}~~wvxxwy|{}zy{z||txyrvwy}~vz{z~y}~{|{z|~zzzz~~w{z}|}~}hvr{t~x}~~z~|}zy}~z~|{|~}zzz}~xt~xnqekUYjorvy}svuwy{uzy}yz}zz~~|{~~y{y{fnmrzyt||u}|t|{p|zozxpxvqwvuzyv|ztvvqssrxwntsv~}mvtu~{nwtpyvlurrvuikilkjurqzvuvtqqupnurmxviwvgvxgtsfrrerqbnnanmimndhgousoxtmytlzudpplvvnrswyzljlfgklnohjjsvtjmkeicglckpgjofkpglqhhnilpjmpnjllrqsinljomhkikljkljnjjqmlplkplkqnlnlkiljlomiljjljjmkhjhfhfdigbif`ifcjgelidjhdjgcjgclibpj^jdblf\f`^e`hjhiljfkifmjfolknlkljmnljjhlmknnljlhjjfijfijfmnjkpngljrwupusnsqipkflggkfhlfhieknhnwlencae_nrmklhjmkfigcfdqtrqtrdkhbgenlkqonhkimvsnxrlvpntotxtuvrfyvcqofqolqprrrnomvwuyzxpqotusuvtprroppnsrkqpltsoqqsuuxzzz||vzxqvtuxvuxvxxv{|zxzxqtruvt{yx|xw}y}}pzxmzxx}|~x~~}}|}{|{zz|~~}~~|}{~y|{uxz}{~{ru|wzx{}}~y{vxz{|zz{zzzxxsqqytu~xy}wxytuxrsztu|tt||xpp|tt~vvwwyqqvmmwnnzrr|ttynqvknujm{ps{psZYYfdekgid]bkbhe`efdfedehhhhhfjkiiegokmpfmqgopcmmktmktmlrnnrmnosotojpolrtqvolqspuqorztvxptwsusrtrtvqsunqrnqrlopsrtrqsrqsutvmlnwxzoowppuz{qstprsqqqzzztttuuuuuuvuuxyy~~~vwwwvvtvvwz{uxyvxy{z|~}~|~zx{y{|txyquv{x|}{~|}y}~{y}~uwx|{}}|~qqqzzzwww~~|{{}|y~}}|||}~|}r{|wt{y~|}~~~}~~~~x|{}z|~yp|z|}y}~z{}}zwut~}~}}}}|{}|~~}|vp{xzxyzuysvy|susvw{z|z~z}}|}||{~_jhlwus|xs|q|zoywmvuqwvtyxy}|svvpsssyxnts}mvsv|s{xluru}zx{vdb^igb}xuxtvpmptoovst~drqdtwitviuvfrtdoqbnojnmnqnhojfrjfvliypdrqkvuY]_Z]]jijfikqstmooorplomjnhjoglrjiogjphkqigmgkojmnnpppssuntrkomjmkmnlomlokjrmlqlkpkjsnmrnmiljlomjmkknlhkihkifigejhbif`ifcjgfnkdkhcjgageaifcqkdoidmg[d^ahckmklnllqolspirohljkmkjljikikmkmomjlhilggidikfmpkpusjomouslqoholelgejegjfgjejjfcf_fncdkauysrupoolimkpsruywnrpprpmurhljsporonwzxjros|vmupqwrtxrttpgyvesqisrloorrrrsqvxvy{yz|zwywpqqkonnsrkqpjpomooprrtvvyz{y{{w}{qwuqvstxvwywz}{wzxzzy|zy~|z|xvpnqu}{{y{yzzy~}x~~~y~~{~~yz~~~}~}~|}}~|}}|~{~~wz}x{}y|x{|w}}{}z|z{z{{|}xyztu{vvwrs{|qlmpkl}tt~~vmm{ss~vv|ttyppxppzrrzrq{stzor|qt|qt}ruwlo[ac\`d`cgiejnhmndltkqpkmgfgilldhhefgkkmmkmnjmpjmpjqpjqpjqrlsoipsptpopknompqinomqtoqvmotpqwmotprwenvlsyhqtntuntsrqsvsunmoruuilmvyzrttprs{}~oqqvxxtttttttttvvv{{{suuqvujnnqwvtxwy{{{yyvuutvuw{zqutvyzvxyuwxxz{yz{|qwvw}|{tzy}xzz}}xxxxxx~~~uuu~yuv}||}|{~}}|}|}}}{}}u{zmutjqp~zvw|uv|~~{z|}}~~{v~xz|~z{~~}~|~~|x}|zy~|{~}}|~v|~z~xu}|~{w|z{x{yx{y~xs~|vxu~v}|y~w}|outx~}xm}xjxtryvsvttvtpyvpwtotry{y~qll{zsnmwrq|yxrspotrqxu{`kkeprgvsgvrbqnetpdrojpjfjcblc`pe]sgdzqftqlzv[hezkwtionglkinmlnnppphkijpmgokdojcqlgtprqpopnimkfnkdnlnoomllkkkkkkkkkolkokjnjimihnjiqnmopnmnlpqopqouvtjmkhkichf^eb]fc^mi_njblidhfhhfkmit~ufoegjbklcqohplkrporwuhqncoldmjemjenkclienkjrofnkemjemjenkfolgnkbjghrodtoaqmfkiijhiddoggrghe\ZabZgi`npgpulhnffmjjtqs}zmtqruswzxstrsnmqlktsrosqvyxswupsqrusqtrkuriqnhollomorpotrouspvtqwtournurlsrlsrjqpjrqktspusotrdigotrw|zrf}zcyufzw_pns~z{y{|xy{vz}uwxqt{osynu|qy~w{yx{{rtumil|yy{{y~x~}~|~}wx~wqr~xz{|~}~|}|}{|~}}|}}}{{y|{~z}|x{y{z{y{{}z|wzvyy||{}xsuztu{tu|}ztupssvorrutwlpor~ps|prxpq{stwloz}ynq{psshkY`c\adadhjfkmglj`hi_eYTVedfdihejigijjllhgiljlqlnqkpqkpqkpqkppjoonpprsjnnimnkopgmnorvlosnqupswlosbktiqxktxiqqmsrsrturtcbdrqsimnsxyqsssuuy{{ikkjlltttttttttxxxxxxqssuvvrttrttz||xzzvvv|~~}|w}|vxzvxyvxxuwxwyzv{zv{ztyxv{zrwvv{zwyy}~wyy}ttt}}}|||vvvz{|~z{~yz~||{||}~~z||~}}~xywy~}~|zzz|z|~||~~zz~}~{|{zy|zx~y{~|~}z{y{|z~}|{{{wut~~|{z|~twrv~yr|r{xu~|xz}~~}}~~||}vu~t}xu~v|{x~}w}|syxy~w~kyuq{xsywtwuzwvnwtw~{w~{msq~wwvronlihusruvtotrowt{jrrhqtgvrfuqbqmgvretphqjyw^j`fvkReYf{rhwriwshvretohvrgongmlinmlnnmoorusnsqjsphsp`okesopmllnlmsqjspepmnnnlllkkkkkkkkkljikihhfemkjkjhmkjnomqrppqorsqpqojljhkibhf`hd`hfZjf\lh`ifchfjhfnokxwjrh[^Urulpqhqnmkkifkidmjepmfolgpmgpmfolcliclifolclidmjdljbkhbif[dakvs_nj_plejhjkikgflgfvvyvrsimndnqhejaksijqnfqnt|ltqiljrusrsqtpn{vuusrjmktwuuxvqtrmpnorplurjqnhollompsqntrnurovsnurntrnuriqpiqpltsjrqhpoinlotr[`^ejhx}{m}g~zcxvdwtm~{comx{yy}xz~xz~yx}tsynrxmtypy}wz~zx}|z|}z||wyyxz}~z}|{}s}~}~~|~~}}{|z{~|}|}|}|}|}||{{vyx{{~y|y|z{z{z{z|y{vzvyy|{~zuw{|z{yzxrsxrstwpsoror{jmps|loxkmzoqzrsxppynq}ruwlouxwloY`c\`d_bfnjonhnh]ef\bhcedcensr`edeghjlmhgiljlqlnqkpqkpqkpnhmqkpmlnoqrjnnkpqjrrhpporvlotpswprwknrbltnw{jswgoonstolnvprifhpoqkmnopqnppprrxzznpplnnrrrrrrrrrxxxvvvsuuvxxuwwvxx|~~{}}w{zy~}t|{wvxxvxyvxzvxyvxzy~}qvuu{zw|{x}|x}|y{{y{{|~~wyy}zzz~~~~~~|||}}}}xyz{~xy~||}}{yysqq{yy~||}~|}~||{}}{||}~zxywxxx|{}~||~||{x~|{{~~}z{y}w~}wy|y|r~kvly^cut{vqyt~y{~z}sxwu|||xzw~x~}x~}u{zv|{y~tzzr|yx|vzxxyw{yxszwpwtirooyvkwsiromvsv{xqsqtrqvsrotrptsw}|muuluxhwscrn`okfuqgvrfumetl]ldcrj^mejxpmxuhspgromxus}zgongmlhnminmlnnorpv{yenkfqnbqmguqlnlknlt{xkur`njllllllkkkkkkkkkjhgjhgkhgljikihmjippnkljhigyzxqrpiljjmkbfdbifbkhXgc[jf`ifdigjhgmnjr{qjrhUZQnrjilchgfprpswvenkhspenkbkh_hecliclifolbkhbkhbkhclidmj`gdZc`kvsapl`qmu|yrusjgflhgqhimfcjjejjdgidgkejpjjrocnkn}ypxvoqoorprtrupoxrrsqpqtrrustvtz}{twuvxvlurjqnholmpnpsqltpktrlvrmvsjsphqnfnmjrqjrqjrqjrqnsqrwu]b`pusrwuk|yi}zgyvhxukywgsqv{yw|zu{vt{tt}ruypswntxry}wz}yx}}}}{z|uxv~~~sqpuz|~xy{}|}z{{|~~}}{yyytu|}|||}|}|}|}~~~{zwzx{x|{~z{z{z{z|xzvy~svzqtunqzuwxsu~xy~xy~xyxrs{uvuwrtrtrt~przln~qsuw}rtrjkyqrvkn|qtxmpzortwW^a`ehjmqtpuqkppemvlridfa`bkpobgfhjkprslkmmjlojlqlnqlnplmkfhqlnlnohmninoippfnniqqmqrnrstyymqrimncnrclpktwfmqrwzqnpuproln{y{stuoqrprrprrtvv{}}vxxrrrrrrsssvvvwwwxxx{{{xxxzyyxxxwyyx~}y~akjr}{mzxuwxvxywyzy{|vxyuwwwyysuuuww{}}xyy}wyyxzz|~~qqqttt~~~~z{z{~xy{yy{yy~~~~|}|}}|||}}{z~}~~yz|}|{wtrq~{{~{}|zz~||}{{~|||~~~yvx~z}~z~{|zstr~~~~~}~|xzuysvu|v|riwnzw}~|wvq|~{|xw|}~}vzzowv|zw~x~}y~v|{u{zv|zpvuw~{digqtrrsqusrsxvnwtt|hwsjzvhwscrnhuqiqnprpywvqtrnsqqwvlqr`gj`okdsokzvhwsbqmatmatk[lcbqigskcohmxujurgroozwhspepnemlhnmhmljonpsqsxvajghspfuq`njmnlkomckh`kh_miikkikkikkikkikkjkiijhhigghfhjglmkqrpkljopnopnmnlhkiknl`ecbifajgYhd\kgbkhgljjhgjlhnvlnvlbj`hpffkbaec`dbX_\_he[fcbkhdmjgpmclibkhfnldmjcliajgdmjironuru~{T_\ZieRc_S\Y]b`higmiinihlfdiiciicmoigkehphfolanjiwsr|yafdpsqtusqlktonomlqtrotrotrsxvrwuotrlurjqnholmpnqtrlspktqlurhpnmvsoxurzymutnvuksrfnmjompusnsqnsqv{ykxvn~{kywivtjvtqzyu{zv}zszupwrs{tv}vrzrtztv{zw|{y}~{}~}|~zy{prr~r|yzz}~~{uv}|wyxmo}}|~~|vttyww~}~}~}xy}}~||~rmn|}y|z}{~z}|yzz{||zz|wv}yx}twvywzxorwzz{z{z{y{xzxzy|~z|}xz}wx|}z{~xyztu~qsuwsuxzymovx~su}{stxqqqfishkvjnodgW^a\ad`cghdiichndlqgmlgihgilqpfkjjlmjlmjikkhjmhjvqsqlnuprlhjsnpnpqmqrmrsgoodnnhpp`denrstxymqrlpqcoqajnclomsxnrwupt|uxuprsprpoqsrtsuumooprrwyysuusssrrrllltttzzz{{{yyyvvvxxx|||z||tzyagft}|vhvtsuvvxyy{||~y{|y{{qss~oqqorrxzzsuuuwwz||y{{vvvwwwxxxyyyz{{|z{~~{|~||~||}}~||wuu~|||zz}{{|~~{||}~|{{~zonm}}{{~}}|wywvwyy{}||xywxyw}~|{z||~}}v{yy~}}~}z~z~~|||zzy~syxqwvt{xtywqvtnrpuwu|jspt|etp]mijyuctpctpq~zhigqonrusrustyxkpqfknbqmaplfuqjzv_njWnflz\ngdrlkuodmgoxukspr{xktqgpmdomepnemlgmljnmjmkkpnfolfqndtpesoiljkpnfolamj\kgikkhjjjllikkikkjkiopndechignomnnlopnpqorsqfgestriljgjhbgebifajg[jf[jf_hejomkihfgcfndksidmcclbgpfhol^ebelibkhdolenkajgbkhZc`foldmjcliajggpmktq`ifjqnajgbmj^mi[lh`khelifjhcdblhgnjihgchgciiejnihnigqnbqmetpmxuousorptus}xwxrrrpoqust{xnurnurpwtipmirokrofmjnqosvtirojurjurt|gromyvqyxhpojrqjrqksrsxvsxvsxvpusotrbmkn{yjvtlutovupwvt||u}|t}z{x|u|wt{wszwpvusxyswx{}~|~~xwyx|}~~~~|}}~~|u~~|~~{}z|}~z}~~~y{~{~|~~~|zz~yz}~ojk}~|}y|z}{~y|{~~}~zzzz~{z~{z{ux{tw{uxz}x{z{z{|}wx{|x{ux|svyruvqs{}ztu~|vwztuyst}rt}rtvx{}~suqhiwxwopwpq~suuwpehwloynqshkpehY`c^cfadheafjdiodli_ee`bcbdjonfkjjlnkmnhgilikpkmupqmhinijojkojkhlm^cdgoobllZffdnnfkjtyx}glkfkjmyy]ggajmiotknvwqvunqtoqpjlsprrqssuuprrrttxzzsuurrrrrrpppyyy{yy}zz}}}{{}{{{{{x{{tzxw}|s{znwvvxxz|}qstprstvwuttsssxww}}}uuuxxx}prrprry{{z||~~~yyyvvvxxxz{|}{|xywx|vwxvv}}zxxvtt~||{|||||~~~}ytpo~~~~~||v|~zy}|vwuwxvxyw|}{~}~}}sq~|y{||~z{w{{w|{|w}|v|{}z~rxwrxvnurowtpxumurovsryvovs{mvtitqmvsn}y_top|kpnqonttruwutyxostjpsgvrcrncrnl{wwaupf|x_plcrnernfpnnwtiro`ifr{xktqanlgrpcoljonhnmmpnx}{gpmdolcrnbplhnliolfpmbpl_njglkfkjhmlglkglkgjhkomdgefigehfknllmkvwuopnopnkljhkijmkfkidkh_he[jf_njfol_dbfdcghdfndjrhhqgcndcpedmjenkmvsbkh_heenkajgcli\fbenkclibkhclidnjjrpdljdkh_heali[jf[lh_miajgekifigdbakihhfehfeijhjmkhmkcnkixtduqnzwkroorp{|z~yxytsvtsgljv}zV]Zmtqlspmspjspkrognknqotwujspjurjurs~{epmdolfnmnvujrqltsnvusxvqvtrvtqvtqvtgonnxvlsrmrqputsxwmwwYdcozwr}{r~xv}zv{zrxwswzsx{uyz{}~}yxzw{|{}~}q{x{{|~||~}~}|~}}uyx}}~xvy{}~~~~~~~}{{{|~~}xy~zzzzztw|}~}xwv|uxy|}{~|ux|zzz{~yzz{}~uxwzy|rknxsu{}|}yzystxrt~ww~vwz{xytlmoij{|tnoxppzoq|qsshkshkzorshkujmY`c\bd_bfeafjdinckoeka\^a`bejidihkmnjlnjikolntoqvqrsnoxstrmnmhi`deejkjrrgqq^jjgqqputejix}|uzyotsfsqakkdmphnvjmutnsulozsv}xzzwyqprvxxsuuqsswyyprrrrrrrrtttvvvywwzyy|zz{yywuuxvvzzz~z}|tyxu{zxz{}mopprsvxyyyyyyyyyywwwuuuyyyz||vxxnppz||z||zzzwww~~~z{{}z|z|y{yz}{{|zzxvvwuuvvvyyysqqyz}z{|~~|{}}~||z{}}~|}|~~~vz{}}~}~~y~}~z~}{u{z~zntsrxxoyvyq}zmzwkwtW`]elix|qwuuzwttsowtiyvgwsryvvtsuvtwxvxyzostjmqcrn]lh]lhetp_njfyth|wfwsbtpfuqfupnurnurgnkjqnjqn`nlftrdpnemlhnmpsquzxpyvkvshwsetpjnlhnlcnkbpl`qmglkfkjhmlhllhllgjhikiehfiljZ][ehfmnlopntusmnljkihkijmkfkidkh`ifXgc[jfclidigljinokowmpxngrh`nc\k`]he_jgbmjdljktqenkajgcli^hddmjbkhbkhbjhbkhhrngpmelifol]heZieYjf]lh`khdkhejh]^\mlkigfigfijhjmkhmkbokhxtgxtdrnhpmlomuvtnihsnmljiinlktqmvsoxukurgpmlurjqnjpnnqorvthtpiwsiwsm|whwsjwshppmutgoniqpltspusuzxuzxnsqnsqntsoutjonqsstuusvvjvxmzxkyun|xt||u~~nvvrz|qw|twzvxz{}|~xwytxyy|||~~}|{z|yx|zy}v~y|}~tno~~zy{}}xz|}~z{}{x}~yz}}~yz~}}~zzzzz~xxytssrqyzx~z|{vxytvwrtuqrxvv{||}}~~rvy||vor}xzrmo~xy}~~xxztuxrs{vwtoprlmystwqrsop}||tnoxopzoqzoqzorxmp~svrgjwloTZ\W[]X[^XVYhcgofmsjpwrthgiimlfkjkmnjlmihjlhkqlnsnonijrmnrmnlfglopippfppjtteppgppfjilpopttosshlkgtrr{|ltwlrxnqyxrwzrtwpsuqrrnprrrsuumppnqptvvmooqqprrrwyxuuvwyxwuu~yz{|xstxtuyvw{zz{}}y}|z~xz{~prrtvwwyzyyyuuuxyxyyywwwyzyvyy|~~prr}y{{|||z{{xxx}}}wyz{y{|~{}{|zxx}{|vuu{xy}{{|zz}{{xwwvvvxxx~~~zww{tv~~{}}~~~~~~{yy}}~{|{|y|}~~~||~}~~}|}{~~y}}}szy{lrqpyxr|espm|xhzvbsojtpnussxurtr{zxxttquthwreuqs{xpqoqpomomuvvnrrlnqiwsbqmcrnetpbqm`qlhythxtevql|xgwsiolnurkroipmkqn_ljivtepnemmfnmkomrxuiroVa^]lhapllpngmkakhaokarmflkekjgmlgmlelkdigejhchfbhf[`^x|zqrpjkipqonomjkijljhkiage[b__gd]lh\kg_hefjiggfggcmulmtllvmaoe[i`Xea_lhbmjfolhqnenkajgcli`ifcliajgfnk`ifbjghqnjspfmjbjggspapl]njZhdapl`ifgljfgeSTRjhgjhgijhjmkimkfuqWgcZjf`miemjosqwwurml~yxdcaw|zhqnkspdliowtu}zlurjqnkrolnlqtritqixtixtlzvkyujvsmuuhpoltsltsksrnsq~w}{pvspusotsrwvy{{wxxwwwsuuiuxkxwo|zivuo|xv}}x~~ntxu{qw{oruqst|wz}~~|wy{vxv}ywvv~x{zz~tno{~||z}}~~}z{|}|}}xy||~{zy{yx{|}~oonwxv{|~{|}{wx{uwwvv~xy|}{}{qsy|y}~xzvqtxsu|vw}wx{tv~xyvop}vwystystyz}~zxx|zzrnnwqrzpr|oqrhkvlovyndfsilWXWZ\[VXW\`_aeccdf_]_edfjikkjlklmgiigiifffmkkpklljjnllonnmlkpoonnpjmnlpqjppgoohlmoijxrswqr{tvwprmsrotsnqrtpuvpuwrsuqpvssrsqrtsrsrsttoutovusuuvpqxvrpuqmwqr}xt}wvur{wv|wxzuwztxxtzxtxxw{xz|vy~v{|v{|rtvzy{zy{wvxpoqvuxzy{xwy|{}{{{}|||||{{{}}}}}}}}{{}}}{{z||{||z||{~{txvrtrrmnztuxxx}~~yzzzuz}|}||xzz~~tqsxtw~{}|~}~~|~~||{~}q|ywz}s{{w||z|zutt~}~}}y|{~}~{~{zx~}|}p|zn{xlzxp~|p}~yfww`ttdyyk~terjmunoyrn{rmwtowtjqnipmswvpusjpnzuzxtqpxopnqojtqetpivrpuronmtsrxxwwwunnlkmkiljhkijrncjgktqhvrbmjdolhqnfmjholipmgpmgrocqmgrokljegefhfZ\[lnllomejgipmcnkkxtfjhhjhlmkkmkjkighfijhkljmnlcdbnomkhgigfhfedfddhfbifgqnmvsemjdlinusmpmhnjjolrzvltpadbbhe`fd^heclidmjfolclidmjenkjqnmqobhegljfmjcjgfbadfdfmjdpl]miXfbdrndmjejhijhkljkhhkhgljijihnmlfpmfmkdlichedhfpusntrjqnjpnfmjlrplpnosqptrptrptrlrpinlotrjomqvtlurkvslwtisqjurlvskro{bjfhokovsuzxqyvoyvoxurxvtyxots|sxwtwwsyxkxwgwvgvycnqvzz|{}pstuxxy|||z}{vwv~~||~|x{yy|z|~}~}~~uut}~|x|}~~~~}|{~~}}}}}|~x{~}{}~|}vy}|zx~y{w~yv|x{{v~z|x~~{{|ywwt}vv|sswv~yxz|z}wvyyzz}|{vv~}zy|yw~zyww|ooruqtwxxrs~}uxxruyruvorzsvvpswrsxstwrrnkhrnjjkikljknlejhbgeeghcbdgfhhgimlnfhihjjlnnjjjmkkmhijhhommsqqkiipnnmlnlnphlmdjjenminotopzuv{vwz{pvujonoqrvpuwpuwrsuqpsqpusrpqotvttttntspvuvzyzwwutspusmwunyvirorqm~}}~|xx|vxztyzvzwsxxx|wx|svzrwxvz|vxyutvutv~wvxxwy|{}zzz{{{{{{{{{zzzz{z{}xy|wx{|lllmooqssz||y{{y{{y|ztwuvywtwulomz{ohivqrxww|{z~~~~~||}}~~{||{}~|~~|~}|y{|~~|~~||~~}|}q|yr|}zkyu{z}{~qon|z|yglkzy|~}{{|~|}{}|~~~~}hnmmutiusmzxkywp~|kwwrcts\rof{yqzgrlqxsnuplwrjvritrjqnipmuzxotrqxuoxurxvomlvmmmnlhqnkzvgrolomrpnzxwtrqxvuljilmkiljhkijqndkhjrpguqdnlfpngpmfmjhnlipmfolfqnguqfqnkljfgehignombcajmk\a_ipmgqncnkhkiijhjkijkikljfgehigjkikljnomfgelhgigffgedhfdge^ebhqnpyvktq[dalsphnlejhhmkpwtpxtehfbgeejhfmjcli`ifbkhajgenkdljfnk{~gljinlahekroqpohjhdkhcplcrn[jfdrnajgdjhgjhijhhigjljpqomnllmkgpmgnkkroehffigchffmjholipmipmipmqtrlomrtrqtrptrmrpinlnrplqootrlvrkvskvtitrjurlvrjnmx}{gljjnlotrpyvgrohqnnurrwvnsrx~|rvvnsrqwvo{{m}|htxfnrprzxx~qstsuuxzztyw~str~~~|~wyz|~~~{}}z|}uxv}y}x|}z}{y|zz}{{~|~}}}||zzz~~~}zv|}{{~yz~||zzz~~{~|}wzy|~y}~~{|}||{~|{{~}y}{{yu|wvuuww|vu|~|}vvyyzz{z~}{z~zy}yx||rsz~y{|tv{uvwopworyrutmpxqtyruqjmsnoupqmihspltql^_]Z[Yehfafd`ecbdeedfjhjgfhkjlcefkmmkmmlllkiimhijhhommsqqhffpnnmlnlophlmaefhmnmrssnotoptopsmntopouthmloqrvpuwpuwqrwrqxtstrrlmkz{ytttiomlrquzyxvvvxvs{xq|yp{xirozyu{z}xy~xzztxzvzwsxxx|wx|svzrwxvzzy{|wvxwvxxwy~wvxyxzzy{}}}||||}|}}}}}}}~}~z{z{|||{}}}~~}|~~{}}|}{~|twu|}tvyz|}z|}~~yz|}}zv|}z~||y{~|~~xw}}zzz|}}~}|vtty~}v{zw|{uzy}}~x{{z{q|{put{z|~~}~}}|||zyzz~~}^iglzxjxvn|zmyyp~hwvctthyxp~xrztmsnmtojvpkurhspirokronsqkpnx|irolsprqp}wvstrgpmSb^]hetwusqpqonrpotrqnlknomjmkhkijpnelihpnguqdolhspgpmfmjgnkhplenkcnkiwsjurlljssqghfuusqrpntrsxvu|ygpmu|nqonomopnmnlstrijhkljopnlmk~rsqjhgigffgeehfchfbifovst{xnurgnkmtqgljfjhfkipusv{zhigdfddiggnkelifolgpmenkdmjclidmjptsdiggljchfnsqqonehf`heaokbso[jfbplbjgdkhgjhgjhijhijhpqomnlmnlgpmszwipmfigcfd`eceliholholjqnholfigrvtqtrprpkpnjnllpnpusotrnvtmvsmvrmvrlurltrfkitywjomjommrpotr`ifitqktqt{xtxxputv{zrwvlqpuzyu||vkvzkpuljsvv|uwx}z||qvt|}qrpwxv~~}~~w{v|~~xx|{}z||~}~|z~z~~otrwxzuvwww{~tw{|~}xz}~|}wz~{~}v{zxpp~xw~|{z~zy~yv}yu~{yur|wu{z{{zzyy~{z~vvyy{z~}}yx||}|ywv{yx||vwuxvxyrsystumntmpvprslowpsxptxqtnijmhiqmlurnvsnbcakljcfd_db\a_\^_dcelkmgfhgfhcefkmmqsslllkiinijljjnllpnndbbpnnonpnlnopqrvwmrskpqxvvqpptrrussqookqpinmoqrvpuwpuvqrupovrqurqlih}}uuuqssosrw|{rvumsrpyxkxvnywjrq~|z{wvz{}xy{}ysxyuzxtyxw{yz~wz~tyztxyxz{zy{yxzyxzyxz}|~{z|zx{xwyvuwxwy|z}|}{|}wx{||}}{|y~}v{ztzy~}~wzxwyxtvunonzzz~~yz~yzyz~|x~~z|x~}w{~~yvxzwy|~~~{~||y}{}{z|}}}|~~{}}|xwxvv|y~}~{w}u~{}|~}~~~{|{~~yww}|w|z~zzu}xyw{yy}|~}~|}{|zlqphml^hfnywkxvp}{jwuivtgtrmzxp~|pzwqwtrwuovsjvsjxtguqltqjspjrnpxtszwlurlspqvtxtswxvr{xjyu`khvxvtrqwutnlkpnmsqprsqnqojnlipmfmjenkguqdolitqgpmfmjfmjholenk]heguqs~{mpnuxvcfdnqo`dbfkigljejhjqnkronrplpnknliljwzxgkiiljpsqknlx{yehfjhgghfdgebgeejhjqnw~{t{xnurjqnjqnfnkjomjomknlefdege`ca\a__gdbkhajg[dabjhbkhgpmbifmtqchfinlnrpjkidhfenk[ieWhdWgc^njbmjckhdjhfjhgkichf^ba`edgkigpmovsipmfigiljinlipmholipmholipmhkinqosvtqtrorpjomjomjomqvtsxvpwtmvskurmvslurmtqehfvxvoqompnorpv{yirocnkoxut{xv{zsxwv{zputtyxx}~zqw|qtyjfovv|{}~z}z}{vwu|}{}{z~~{}}~~~{~|y|x|~{{{{}}|wv{{{|~|}{|}vy~~}pjk}~{z{xxuzw~}{z||yy}}wrq}vvyy{z~}{yx~zz|xwzwv~{z}xwyy}uywpstoqz}xqttnptmp~wzvor{twwrsqlm{wvnkgqniZ[Y]^\`cabgebge\^`gfhbacxwylkmgijikknppkkkommsnoommljjpnnmkkkiiolnomonnpqstmqrjlmxvvrpprppurrussjpojonlnoxrwxqvzrszrrwrquqplkjtrqzzzqqqoppsxwlrrkrqkwuiwup{yqxw~}|xw}xyzuvytv|v{qmr}y~xw{uvzruytyzw{|uwxwvxyxzzy{|{}vtv{z|~}{z{tsuqprwvxyxz}wx{|vzyu{z}w}|syxput}~qtrvywhvtq~|ux}|}|}||{|~z}yu{|x~x|{|~{}~}~}yw}xv|xwysuuy~}qvu~|}yx}{{|x}|v{z~{|{}z}|~}}~|~}|~ywws}q}z~~qvumsrrzymvulywesqhsq^hfaljmywq{ytzwrvtsvtnvro~yguqdrnlwtkvsY`]bifourx~jspqwtstropnenkbqmmxuvywxvusqppnmpnmxvuopnlomlomdkhcjgenkbpldolcnkfolipmipmgnkgpm]he^lh`khlommpnikipsqfhfnsqlqomrpnsqhljnqolnllnlmpn^a_Z][jmkmpniljknlfigghffhfehfchfdkhglj_dbkpndihkpngmjenkgnkgljjmkdeclji`b`jmk[`^]b`jrogpmgpm`ifiro_heS\YnurafdqtrpqohiglqoakhZieThcZkg\kg^jghpminlfkicjgbjf^eb_fcfmjgpmdkhelilomknlinlholholjqnipmmtqorplomwzxsvtpsqjomjominlv{ypusryvqxuszwqxuovslrporphljqtrrustwuotrnvtlwtnwtovsqvusxwuzy|tyxz~Y^_u~~ouzpsxrnwyyxy}{}~y{{x}{y|zuvt~}~|{z|~~}}|~}}zyyyzzzyjsp}zyz~~~}xwvvvrrrz{~}xz}~~}{~x{|~}v{wqvuotlhh}ur}vs{x|tqwt}yxuuxzxkkqkk{z|wv}yx|zyzyx}zywywwxv{vuvvqvxjm{uwnikuprunqslo|ux~wze^a{twvqr~yzzvuqnjqnifge]^\^a_Y^\fki\^_hgi^]_feghgiiklmoofhhdddmkkpklommjhhrppnllljjolnpmoonpmopkoplnnpppppptttqqqopppvuqvusuv|v{tmrzpryqqwrqxsrpkjrpourrpnntssputo{ykvvto~jttnst}{z|{|wx~yz|xz{uz{{wvzvw{ux|txzx||vxzxwyyxz{z|~}~vuw~}|{yx|rqq}||{|v{zsyxmsry~z~}z}{vywrusvywsvthzwk}zk{yiwup~|{|xzvxy{z|y|~~~{{|||~~~y~~~{}}~y~}yut~||{~xz~w~}z~{zz{w~bjgz}~|yzxzy{|xzz{z|}{|}}rwvsyxnvvnywkusgrodoljspowtv|zy{{uuutuuotsivtfvrdsoixtkvsluru|ytywr{xitqrzwwzx|}{pyvbqmp{xx{yqonrpowuttrpxvupqoknlknldkhdkhenkcqmbmj_jgbkhipmipmgnkfoljurkyucnklrpntrgljlrpejhcjgejhjomlommnlnqokqojomnsqv|zz}mrpmsqkpnlrpejhghfehfchfbifdkhjomtwupsqgjhnqolqocnkenkchfnqonlkljida`kljbec`echplcliclibkhfoldnjitqqzwhmkhkivtsfigntrbmjWgcUhcVid^pl[iefrnfmjflidmjclibkhajgclinwteliipmlommpnhmkipmkroipmipmlrplomhkiqtruxvnqoinljomejhpusrwurwupusvzxsxvsxvpusuvtkljrrpqrpqrpotrpyvkvsqzwnuruzyv{zw|{w|{rwvv{zippxpz~lqvsqzrrxstxwyz{}}{}}tywx{y~~}}~|{{{~r{x}}||{~}|~{~~}|z~}}|wt~zw||x|y|xw}ss~~wx{{{vuzy}yxzxwtusuvt~}vwutuswsr~ttv~v|y~okqxrw|uxsloztvy|ngjx{~yzwrstpoyvrtqlghfdecjmkpushmkacd]\^_^`feghgiacd^``accgggpnnrmnommfddsqqqoonllqlnrmoonpmlnmoplnonnnrrrnnnppprrrv|{uzyprstnsvot{pr{qqyqqxtrqmlomlsqqxrtxvvkqpjwudppetrm}|jtsnst}|}|vqrytu{}z{yuzxw{vw{svzsxyx|~xz|yxzzy{wvx}|~{z||{}utx}|~~zz}jll}~~~z{{z||y~v~}ckjw~u}|}y|zuxv|}vywsvtn{yhsr|x|{xywyvxy{xzy|}}~}z~wx~z||~~~zyvxxuw|||z~|~}}y~}{{v}w{~}|x}{xyuy~wxsmn|}uxv~|}}}}||z}{|~~~|x{y~}{z}{zxzzrwvsyxpwvnywmyvjurktqovspuswzxyyyyvvssssxwhvtgvrhwsiwsguqnwtovsuzxs|ykyunxtotsstrnwtetpp{xvywvtsrpowutvtsvtsnpnknlknlahedkhgpmftpbmj_jgcliipmkrohnlenkcnkjxtcnkkpnotrjnlkpnhljlspinlgjhmnlkihlomlqoinlinlfji_dbgljnsqlqolpnhljehfchfchfbifbkhafdgjhjmkknlknlinlcnkenk[_]pqoqllokjdbalmkcfdcfdgnkbkhenkbjhfolgqnbmjclijnlefdvqpjmkhol]ifSd`TjfVjearnZiehtpbifdliamj`libmjbnk`kh^gdipmipmknlgjhinlipmipmipmkrojrnqtrlomorpwzxorpjomjomhmkmrppuspusmrpy~|w|zy~|y~|wxvhjhtusqrpkljkpnirogronwtw~{z~x}|txxv{zw|{x~}s~~svow{wyyywx|qstvxxz||{~|}|}{~~}}~~}zz~}}~xs|y||{~}}z|}}~~|~vyzy~}txx|~~{z|}zxt|{w{~z~z}|}~vwvwzut~zy|zzvwutvt~~|wzxrusurq{ttv}x~ysxsotuqv~wzwpsztv{tw{tw{twtopnijplkyvrtql[]\dedikj[_^_dcbbcdceffgtsuvuwhhiiklmoonmnmllqmnonmdbbtrrsqqommqlnrmoqnppoqmnpllnqqquuullltttnnnkqp`edvwxqlp|u{zqr{qqyqq|ttrnmliiqooxstvttlsrm{yiuxky{kz|jrujmqzwwzvvvrsxtv}y{xty}y~vtxxw{tuynqusxyz~z}~xxy{z|zxz{z|ywy}|}}|}~}{zy~}zsxwsyw}}x}|v}|zahg|szyw~|x|zvzwvywz}zy|zz}|opp}||{}~{~z}}~z~~}}|yy}~}~|}}{|~~~}}yvzvryutz}||~}z|z~~ytv|qz~}~u}zxzv~}x|{~||}{~}x}x~{|~{~|y{{z{y}}{|zx{{{qutsyxqwvpxwq{yn{titnmrmquptvqrrr|zzppprwvhusgwsixtivrhtqiurjtqz}pzwjwtkvsqxupsqlvsm|xu}wzxtsrqpnxwvvussrqlmjnpnmqnahecjfhqnftpepmcnkgpmipmkroholemjcnkhtqdpmemjiqnjrnipmhplholjpn\_\gfdkgfgljjpmelihplbif`heemiipmfnkhplipmdhfdifdig_ifakhbgeknkfigiljknlmrpaokenkWZXrsqqmlolkecbomlghfadb`fd\fcfol`ifirngrnbokiromqokljsqokomflibpl^okVlgZni^qmZielvsagedli_jg_jgbkhdnk`khbkhgnkkqnqtrorpjomgnkdkhhollspjpmorpmqojnlpsqkomkpninlrwutywrwupusjom{~fkijomkpnuvtfgetuswxv{|zsxwjrolvsoxuovtmrqnsrotssyxy~}x~}o{{psqz~w|~mostww}~swu~{~|}}~zu|y~~zz~~ux}{z|~twy||{|}~~{~~vzy}x||y~||{z~~y~|zzwxyu{{xz|xwwu}zyvwvw}~ss|wvyvu|{{|zrusrusxyx}~tvuvts|tuzjr|qxytyzx|ytyzsv{tw|ux|uwzsvz}}~vqrplkqnjspkX]_`behjl__b__ba_c_[`fbgrnsa]blkpmnrjlnefjgikeeihklghimmopmovqspnpqnprprroq|~qnpwuuusssppsqqqoonooqrrsssmmmvuvxqtzrtxor}twxnrslnsqquuuswwruuopry}~u{{klnxtvsuww|~v|~s{~pz}zz~stxwx|rswstxptuovvoyx|zy{}y|y|{~~z}}y||vxzw|{}x}|y~}}~y{v}{}z{{t~wz{qxq}{z~x~}}}~~}}xut}zy{zy}{z}}}{~}~~~||~~~~~}yvtsqpwut~~{~z~~}wyp~{{xu|y~gkkzzz|}|{zzzvxx~{~}x}|~}}{}}~}~~tus}}pvtuzxuzy}zy~xzzxzz{w{}xzwwwtzypzvr}xj~yfvrm|xjwtfrorrrooohhhnoolnnmwtkurswuntrmvsiroy~|pvsjronwtnwtdwrbrno|xZb_rwumsniqjhpiiqjkslovpltmdkerzsiqjlvsr{xgpmcliiroovsinlkjijjiosqekhglkjoneiihmllqpknnjllrttprsjkkljjlllkpobom[ljWkh^nl`nlcnlgmlglkcih_hg^kiZjgYkh_ihsxwfhhhjjkkkikkhkkhkkpoorppmhjghhhhighhfffhhhqrrbhgfqocpnjqpglklroiqnclijspjuqcnkanjbpl`ok]pk[kgcrnajhejhkjikjilqodecnmlkqoepmcnkgpmfolinlinlinlfjhcjghrojurhtqhurn{xhspiqnjqniljdfd^a_uxvtvtryvmwtmwtfspm|x`miptrswutusvxvxvuszttxvrutovvtittjuumvvr{{vz|uz|szys|{q|{q|zo{yw|wlxv}y|z~}~}wsx}|q|y{{}z~rtt~}~~orp~vytx~~yyvzw{~}~|~|}}~|}|}}{|xxx|}}|z{z{}zz{}}}{wy~svru~ux{wxxxxwxx}mrrkqpmrsz~uwxsuuvuwrttvvsvwn~vtpj{twyrwzsxzsxwpu|vy~}}eddonnnlkqooY^aWZ^XY]edhihlhdiiejwsxqmr`\alkoijnklpfgk_`d\]agfhljlrnpqlnxqttprtqsurtolnurtpmotrrussrppsqqqoopppuuuppprrrrrrtmp{ru}tw~uxzqtvorxvvuuuvvvssssuuwvxswxvz|jikytvpqu{mtwnwzgsuox{vvzqrvyz~z{txyiqqq{{|{z|x{{~{~{~z}~qst|~~y{||~~xyywyy|}}~|}{~~}y}y{u|wqwr|{z~y}}}zzz~~~~|zy}|~}~~}{{|zzzz|{~}}~vtsnlkxvu|}|z{r}x|r|xyw~z~~|~{}}~~~}}}~yx~uuyuttvvu{zy~}uuuuzy~}}~~~|}x~}z||tvv{w||~xxx|pxvr~xzkzvuo|xhrotttqqq{{{rrrnnnoxunwtqtrotrktqhqntzxrvtpwtmvsq|yq}crnt~{pvsvywptpflgouplrmlrnmsnsytqwsflgpvrntojspr{x\ebenlnwtovsejhljisqpknlbifejijonlqpjonjonjllikkprroqqfhhkiiiiidih^kiZmjXnk^ol`nl_jhaihfkjdji_hg]igZjgUhe`ihv{zeggegg]]][]]ikkikkccchffqlmhhhhhhhhhhhhkkkoqqlrqdombmkkqpjpofspgtqdso]nj[midli`kh`nj`nj`nj`ok`njdljfjhpnmqrpkpnopnuvtmsqerncnkktqmvsjominllqolqopwtktqjvrjur_mis}nwtjspjqnnqoknlgjhnqosvtryvmvsitqaok~m{wqvtqvtrvtuvtusrkqlx|ztvvotuo}|iuujvvlvvt||rwxtxztzyt|{r|zq|zn|zuz}zp}{jqnx{yxk|xu}x|uq|xz{rtt~~|{ywvuss}{{~~{|zzy{zuv|}}~}~~|ynp}xyz{~~~~~}~z{~zz|}}xyvqr{|y|~ptz~|sv~||zzzuwwmoolqpjporwxquv|~zy{yxzvxx~{vwmutjyvn}wx{tw|ux|uwzruuprljjzxxxvvsqqsqqZ_bY\`]^bfeijimiejqmrgchminnjolkojkofgkbcgdeinosxtvxsuzrvtlo|ruuprtqsurtsprsprxuwnlltrrrppsqqqoonnnsssiiippprrrz|x{ysv}vy{tw|wyyyyrrrrrrpqqwwwzy{uyzvz{xwy}xznos}nuxr{~|uvz\]astxzz~tuytxypxxz~vuwvyx{y|x{wz{~y{||~|~xzz~}z||z{yz{y}~|~z~|~u|wpvqz~xzyxxx||||||~~~}||zy~|{~}~}}|~~~||}}~vz}x~{|z{yx~}{yxtrtyuw|~{y{{vx|~~rmovrt|}~zzzy|v|z}}|}|y{{}~s{z~~~~~|}{syx|~~vxx~z~{}zzz|oxur}ws}m{wmxunwtnurvvvooorrrpppqzwmvsrusrwulurjspqvtrzwt}zlwtkvskwtmwtryvrusstrknimqlvzuptoosnosmswrnrmosnptokojU\Yszw\c`jpnt{xovsfkinllzxwnqognkhmlglkchgkpoglkghiegglmmsuukmmjiihhhagf\jhYmjYpl]pm]mj[ec`hgeljdihcihamk\ig[liaihkpohjjlnnjjjjllikkikkiiijhhlghhhhhhhhhheeejjjsuuQWV^igfqoionhnmcsneuq`qmZpj[rmclibkhbmj`mj_njbnkblignkjmkqonrsqpustwuiljjro_mifqnktqlurqvtnsqjomlpnpwtlurkvshtpbqmgroqzwjpmgnkorpmpnhkilompsqqxunwtitq]kgm|xo}ypxtqvtsvtuvtstrqwr|}suufklskwwjvvlvvxlqrqvwtzyt|{p|zq|zp|zuz}yr}v}zzk|xu}~t~w{}x~zvvv~zxwz{~wz~}~|}~~~~|}~~}~|~~~~~~~}~yzz{z|xst{|}~|wzw{~~}}|||wyyrttmrqqwvx|}txyx{|wvxxtvzzzwxtrsi|wumyz}vy~wz|ux{twsmoponmkkzxxtsstrrZ`bZ]a^_ccbfcbfhdiplqjfkc_diejmlpghlghlhimijndeiXQT]VYlcfthk{mqtoqsprtqstqsoln{xzjhhqoorppsqqqooqqqrrrjjjeeetttwrt{tw{twx{~wz{}rtttvv|yyommtsux|}nrsutvvqs}~{lsvjsvgsuqz}wx|{|uvzyz~uvznrsqyylvvyxzx{|qtuxwzwzzsvtvwz|}z|}{}~vxy{{{~}}~~~zzz||||~|x|pusx{y{~|~~~zzz~}~y{|~~|zz~||~{}}~}~}xxuqpvwuz}{mkj}|{yx{yxxvuvts}|xy{y{|}~~{|~~|zxxry{u|z|~x||x|}{www|~~~z~w|z|}yzx|}{~zy~t}z~{|}~|syxy~z||z|||{vxzzzz~v|x|grolwtx}x|x}{yyykkkppprrrqzwirouxvotrfolfpmpwtrzwktqjurdrnpxuryvrwuzzxuvtz{yyzxstrqrppqoopnopnrrqwwvtustuss{wv}zlspkrot|ymtqjompnmtrporpgnkinmkpootsglkglkinmdjhhnluzydihkkkjkkelk]mjXmjVnj[nk_pmivtgsqflkfhhehhbih]igZhfgonotsdffgiiiiiegggiigiifffommpkljjjhhhhhhhhhfffaed[ba^jhdomionqrrgolhspbnjdqm_mjhnkfmjenkbli`li`jgfmjhmkgjhfhfcdbdiglqopvsenkitqdolbkh]fcsxvotrlpnjomjqnktqitqfqn]helxux~{ltpinlpsqwzxvywvywtwupwtqzwnyvq{o~zr|syvpwtpusuxvwxvoupz}{tvvy~kyxlxxkwwlvv|hmnotutzyt|{p{yq|zp}{v{~s}}r}~}~zzt|~wy~wz~{yyy}{z~~yww|zz}~{z|~|}~|}x{}|}{}{}}}|||}{{~~{|~xy}xy{|}~|}|}wzy}vz{~}||||||z||uwwuzysyxz~kmnvuwvsuwtvxvv{tuk~uxvnzutwqryst{uvystxrsxstwrsytutopupq\ad]`d_`dcbfedheafjfkjfjkglkglmlpghlfgkhimijnlmqvor}vyvzynqrdhsnpsprnkmtqsolnwtvljjqoonlltrrtrrqqqtttsssrrr}y{{vxytvuprwrtvsuqvuy{{kkkusszuvnmorvwgklsrtxsutuy{v}ox{my{jsvvw{vvzyz~mnr}~txys{{pzz{yxzxmptwuxwz{~uwxvxy|~suv{{{{{{{{{|||}}}}}}yyy}}}yyy|nsqy|z{~|zzz}}}zzznnnxvuxvu}{z~~|{}|{yxmoprus{yimh|~~rppzxx}{{|zz}{{{uwqsvyuvuwyzytq}z|wx|xwy}yxxxmpn|zyzxwxvuy{|~sqp~}~|{~}~z~olhjie}~z|y}x}{~}|}~~}}}}~}wyy~~~wuu~}w}|y~y{{y{{|~y{|||rwvqzwt~xpzwepmltqryvpustttlllwwwrrrpppqzwpyvwzxotrclidolpwtv|lwtjyukyupusrvtsxvvywtwutvtqtrorpmpnorpjmjnqoknlmpnuxv~x}{tywkpnpusotrovslqotrpvtspsqnurjonfkjrwvinmafew}|gnljpontshnmlmmgiieml\njYokWpl[pm\oldrpfqoemljjjbccgml_igYdb_gfglkjllkmmddddffeggeggeeedbbc^_WWWeeehhhggggggbgf_igYfddmlmppnjjpmlnljvutopnlomiljimkiolemjdmjfligkigjhhkifgeijhjomaifq{xdolepmepmfolfolhmkmrpmrplqoholhqnepmfqn`ifs|ypwt[`^otrorporpqtrsvtrusntroxuozwn|xjyuiwsktqszwqvtpussvttztknltvvv{|tkwwmyylvvnvvsxypuvtzyrzyr}{q|zq~|uz}nxxu~}xwyv~rzxwyy}{~~}nbd~ux}~~~|ystyzyz|~}tw}vy||z|}~{}|}|~z|~~|}~yzz{ytux{vzz||~|||z||z||v{zu{zz}~jlmqmourtwrtytu{{wef\wxn|}tzut|vw{uvztuyzsmn{uv{uvrlmslnrlm\`d\`d^`d`_cfeiminiejjfkmingchfeifgkklphimfgkghlqmo|wy{tw{svtjmrmolikmjlqnpkhjolntrrrppsqqpnnvtttttyyyrrrmmm{xzwtvroqvsuwtvvuwmsrmsrnllwrsrlmjikhlmhlm{z||wypquv{~sz}pz|{fortuytuyqrvfgkuyzyuvzz|~vkn{ps}ru~sv}vyy{|wyz~|~wyz~~~~vttywwyxzyx{~vxxxsxwxzzz|}wwwxxxzzzxvupnmqonsqpqonywv~}|zyzxwywvrtunqouysuyty{{~||~|||z}}}|~||lom~}~|{wzzyvt}|}{zz{tpooml}}}~~~|}vws}|yvvuvt}~|}sxw|zz|}{y|zxzz~~~{~zzpvu}uww~zuw|||x}|hqngrliws_milwtoxulsptttrrruuutttrrrlurnvtwzxqvtgpmhspjspnxuhvriwsixtryvovspwtu{yu|yottmsrlqpnsrlqplqpsxxmsrhmlejiz~uxvsvtpsqsvtsvtlrootrvtstrqrusovsnsrjonY^]mrqY^]syxkqphnm`fepvujllhkjclk]olXokTnjZol\ol_mk_ljdomiefbaafiiglkhqpelkkpolnnlnnaaadffdffdffeeeeccb\^[[[fffiiihhhnnncih\gebomiqpnooohj|ppg^^jcbvqprmlopnmomkominlelinpnjkiijhkljlmkkljinl`jghvr`njgpmepmhpndnjkpnmrprwukpnholenkcnkdolbkhszwlqogljxzxrtrpsqorptwurusjqns|yozwo}yixtfuqu}zr{xt|xrwutywyztwusuulqrftsq}}eqqfppnvvlqry~u{zs{zr}{q|zq~|uz}s}}z{|wvq{l}yu}~lurr}~~}~]^\xvv~~wz~upq{wv~zyz{uvsmnwqry{ukn^WZ|}|~xz~~~~yztop|wx~ytu}~|{z~z}}{}}}}}}}vxxz||v{ztyxzy{tsujgiwrtytvvpqxzprvkuxo}yxyts|wvyts}|wrpytuytuupqrlmnhiZ`b\^b^^ba`dfeimingchjfjhdifbgihl`aeoptjkohimijnihjomoqmormoqjmrnpkhjnkmolnebddacwuuywwqooqoowuuppprrrdddqqqrrryvxurtpmonkmtqswvxoutuzyuss{|}~qprostquv}|~{vxxy}v{~v}r{~xenquvzxy}rswuvzrvwrzzt~~ostyxzvyxlpzor|qt{psyruvxzuwxuwxuwxvxy|zz|zzmkkrpp~}}ttvpoqonptvwksr{y~}wyyz||~~~rrryyyuuuqqqxvuvtsywvtrq|zyvts~wut}{~{yy}}uss~xyz}z~{}wysu~yv}~utv{z||{wv~}{z~}|zxw{y{~zxz|~}}}{zywv~yqqyut}|x~yuytstp~{}{z|}v~}t}~{~||~~}~}yrxw}uww{~|||v{zmvso{uhxt_njftpt}nxutttvvvtttvvvuuuktqlurvywx}{nvtitqiroitqhvrjyum|xt{xmvsqzwq{xkusktsjtrlsrmvumtsktspwvkuslsrhrpmtsorpknlorprusrusjomlqoigfljimpnipmputbgfglkjoninmktrjrqjrqgonbjihkjhllbmkZnjWokTokYplYolapn\igdomd_``^^cddhmlipo`fediheggtvvfffhjjdffdffeeeigg`[\[[[dddgggtttddd\dcVca`nlhpokkklghummwrqgcbxutrqoomloqoprpgljjomoqniffjkijkipqojmkjnlbokbpl^lhdmjepmjrpdmjotrlrpw|zjomipmclicnkdolipmpwtlqonpnnqosvtqtrpsqorporpholu~{p|xcqmetpgvrp{x|pwtovsqvtntouxvoqqhmnjxwuammakkiqqjopsxyv|{t|{r}{q|zq~|w|q{{p}{{|}|sr|z}yz}}zrs|||~~~||zxx~wop{~jef{|{|{}|xz|}~~}}{{{yww}}yz|}}xyz{|uy|~~zzzyyyuwwtvvtyxuzyxwy{{}ytv|uxxrsurnyxnz~stzq}ywyts|wvytszuupkjzqrzqrvnoulmqijY^aZ^b\^b]]a__cgchgbgjejjfjhchjhlRSWijndfjefjijnhkldfgihjkikjfhroqpmoroqolnljlolnsqq^]]hffwvvvssoqpooohhhqrrrrrtqsroqpmoqnplikgfhlsrnsrrqqsnovophginrrfjkutvsnpyz~kptouxrz~doqhpsopughldeijkoprvvxzjpqs{|ruvzy{|twynqyor|qtzpsxqttuvyz|uvxsuvwyz~zz{wxqklqlm{uvqoqzy|{}vwwz{{tttuut~|zy~|{|zy{yxz~xzxx}}|}z|~zz}{}}~~~~~~{~|||}|{{}}}}||x|xpq||~}}w}vy}wuwq{~~z~|svt|xquuvvu}prr{~|}uzyz||z||}{}|||txws|yu{p~k}xl{wkzvjxtwvvvvvuvvvwwuuvoxunwttxuv{yt}zq}zhtpjurfsohwsjzvkurernnyvl{wjwtjwuivtkwujwulywfsrhtrlywmywdoncmkjmkbdchkiptpptp\b`iollljoonquskrofkjotslqphml[`_goniqps{zaih]fdejiinmaljYlhXplYso\rnYmjaqnZgejus_Z[^YZ```fjilqp`gedihbedvxxjkjfhgfihfhhhhgmlk_[\XYXcccddduuukkkZcbWca_ljfmlhhhkhhmlkkljjmkjnlfljkkiifecdbhkikpnvutffdjihghfrsqiljjomhuqfvrcrnfpmeqnjtqdmjpvslroz}hnkiqmcmidplfrojromtqkpnknmlnlosqqtrtwuptrospipms}zs~{t~n}yjyucnk`liisoqxunsqsyt|~nrqglmhvur~~httpzzfnnbgh}v{{s{zs|{r{zr~|t{|r||q~|}x{ywrqz|zwrpzwz}pwtq~{{|w}xoij~~~yxxvtttrr}~z}}xxx{}vy~~xz~~{}~y{zzz{yyzxx|}sno|wx}xy}~wzrv}}}}~zyysssyyytuusxwtyxwvxqnp~y{ytv~wz~{xvwzovyqyvs|vt{uswqouomxrqyprzpr{tt}uvxydmm_gg\bc\`a[_`b^ck`fudjscjociminihjpopihjlkmnmnmmlmllsqpqlmlghroqpoqroqqlnrlnqlnnooprrrssjlllmmcoofppX__chioqrplnmikhdfljlkjlggiinmoqqjjjkjjurrqpronpttusrtwuwy{|fjktxy}jnoswwxwyutvtsuvtvpfi~vx}|xztoqusutsuwsuysvxqtxqtzqt|uxdfgz~z}~xy{{y{ytvz~}xzxtuz||}|tu~xy~~|uv{vw|zz{||~}~~~zzz|~x~{x}|z~zzz}}}_^^||y|~w{~~}|~}|}~~}~~}}~~~~~}|}}~|zx~}}xxwsts|}|~}w~y~|}~|~}}}}zijjvxxwyy{|{|{|||{||x}|{l}zguslutqtsprtuwyousryvpyupxviqpw~~rzynuuszzmvsjspowtlvspyvdwsfvr`njjspourmutoxvkxvjxvhzwdvsfwtjus{~~oklvmotnmqojmmikoglpihtnlyv_kgbnkgtphrokpojonjoninminmjpnksriqpP\Zcpnjonhlkagf`ihanlepnjpobhg_cbhjjjkkihhllkgggiiihhh^kd]ndcrhkxnhrifnfhmelqigldejbcg_`a]]^[`a_dddfegbfedgfdggehhikkijjimkosq`a_~}onlfigikiiljmpnprpjomgkiiljhljqrpnqolqoosqotqipmbmj]qljwslrorzwcplr}lysasfasd^tg`skiyrhwpfvoixqhwpoyxn{yhusfvsgvtfvsiywn{yq~|p{yr|{szzmutpvurwvvwxt{v{cihpuvkqqnyyjvvr||qyyuz{otuyx|}y||wzzq~zt~wu~r|u|v}~|}z{~sxv~{|~xyyww}}||yy~~{{{|~}~~~~y{|~~zuw~|~|~|{{||~~~|}~xzz{}|zzyywwvvtwyxmoyz|wx{||rwvwwwuvv{|zz{|~xyyzxy~tv~su~orvytx{jnqtptpupuvmpvpsuqsOYYW__[cc[_`[_``\bmbhm]dm^etiornskjlnmomlnqprmlnlmmmkkqoopjkpklomonmopmorlnsknrlnlnnmooikkikkkmmfoojpqW[\gijmknjikvvxqprggijlmqrsjonoqqwwwtrrsqqrqs~}wvxqprutvy{|jnnptuz~~nrsquvwvxzy{lkm}|~qfisjmy|z|}~}tqsxsuy}|}vyy{|z~vz{wyzyxzvsu}xz}~wrs{|~~~{uvyvv~xy~{{~jde|||}~}yyy|||}{lpkuxsyxx}~|xy~|~~}~}~{}|~~~~}~||zz||zz|{|zy~zy}yx|~|~~~~{{{}}}~}~}~}{{}}}zz~|{|~~qsswyywyy{|{|{|}xy~||z~gusctqftrltsrttqrvoqrtyxw~{qzwnvuemlpxxmutowvoxuktqmvst}zlurj}xetpftpgplnurhpnitrivtiwuj{xexuhvtjus|liivpqsnmqnjmmikoijrhgtniws_nibpletpfrninminminmhnlhmllrqemlrzyYdbcpnjnnqttgmlckjfqoepnotsv{z\^^fffhhhfhhhijdeffhheggbog_od`ncZi]`lbfoedi`af]bg^glchmdmnjpplmnlggghhhdffdffeggeggfhhmoogljhmkbecvwuolljmkmpnpsqmpnlomlqohmklomknlppnknllqohkirusmtqfqn^sniwskromvsmyvkwucrlcui`sdbvjbuldsohwsfurfuqbqmaljanl[hffwtdurfvtizwm{ymzxnywozxozxnvusyxsxwqvuu|wz~gmluz{zr||lxxoyypxxsxysxyqx{uz}~z||p~zs}t~ut~u|yrvuotsuzx{~v{y}~}wuu{z~~~}}~}xzz||~}|~~xxxzsv|z}}~}~~}~{|}wx{uv|{zz{{sqp~y{zstyyytyxwwwwuu~xy|vw|}}wx}uvzztvsutxtxz~ufj{lpptqurv|svwqtroq_ii_gg\dd[_`^bc^Z_kchi\bl^drjosotpoqjjlfegonpihjkiiiggkiieddnllmmonlopmopnprnppnplnnmooikkmoooqqiklcefppqxuxtprjlmjoporseijgklhlmjllikk|zz{yy{vwtsuyxz|{}wvxuwxmqrostw{|ptutxyzy{xwyrqs{z|yxz}rusjm|sv~y{{vxmlnutv{xzzxz|wy|vy~}vywtvtvwtxytxyrturuuywyxvv~~}}~}~~zyy~||}}||~}~nhi{zzruu{||~}}}zzz|zz~xzx}{|z~~~yyy~|wy}|~|z|~}}z|~z|{xz|~}{|}~~{z~}|{z~|{}|pppzzz~}uvsw|}{z~xvv{||||~|{~z||yzzxzz{|{|{||}~||x}|xn|p~|qyxprrvw{oqrotst{xlurrzygonypxwnvvmutlurktqt}zfols|ym|xhvrftpakigqnbkierpjxviwugxuaspivtjusz~kiitpqonnnmlknikoijqjjtnjurepmepmfpnhpnhmlhmlglkhllhmlflkemlksr\gebommsrinmdjiiqpmxvhrpinmchgikkkkkkkkejieji`fddihejibphaodalb`kaclbemcfkbaf]dh`ejadi`ikekkhiiehghffffhhfgheggfhieggy||`hejomgjhnomjljnqoorpqtrorpmpnlqojomlomlomnomknljomfigpsqovsgrocwrkyupyvt}z`khcnlbmh^ncgylSg[Zme]lhbqmixtixtfupmxvjwuo|zk|ygxudxtjzxlzxlzxlzxq|zpzxlxvtzysyxsxvv}xv}zntsw|}x}~r||myynxxpxxsxyv{|yqvyvz{~y{{p~zp~zp~zq{q{}x}{v|y|~y~|~|}~|~}~uyww~~zxxxvu~~}|~}~~}xy|~~~vvv~wy~|}~~z{{|~}~{|{uvxrs|wvxx{{yzwy|~|stxvvvwwzvwytuztuxrs|vw}uvz{uwrtuy{{xjnyko}ns{lp{orvmpslotqs\ff\ddZbb]abcgh^Z_ibgiafiafmfkqmrtrthgi`_aonpihjojkkfgiggnllnnnjlmjlmlkmqnpsnpqnpnppprrkmmnppnppsoqwrtrlnuoqtmpostlttmrsnsttxykoplnnxxxzxxytusnovuwyxzyxzvuwsrtoqrostptuvz{osty}~yxzxwyzy{~}|~vywnq}twzuw~~{}vprytv}x{w{|xz{}xz{z{{~~~~|}}x|{z~{~w}|y}|yzzstuuusuuwyzy{||~~{}}}}uuuzzzyyyz{z|vz~z~}||||y{}z||~}|~zy{~}onp|{}~}||~|{|~|{~~}rqu|{}|~vuw}}}~}tv}~}~~~~{{}~~{|x}~~|{~x}|v{z~||{|{|~||~|||~~q}l}zo}{pxwqssrswwyzotspwtktqnvuksrowvqyxpxwmutjspajghqndmjktqjvsp{x_micrmesom{yn{zkywfwtgxudsqkvtjusv|zhlkpqqknnlnmglkiojjqjgokfolenkhqnfolhpmhmlhmlfkjglkinmflkckjnvualj]jhdlkmsrkqpionpxwfnminmfkjeggbbbmmmdjidji_edbhgbhgdofcndendfndfndhlcdlbemcbj`emcdlbhlggkeimhgjhfiggjhfigehfdgeTWUhmkmtqjqngljehfijhorpmpnlomlomknljomjomjmklnlnnlnqolqoqtrknlkrocnk`qmhvrozwdol^iffnmo{xo}tizm[kcfunm{y`nlgusiwuivuhsqjwu_ljgxufwtfyvh{xhyviwujwulzxn{ynxvowvsyxtzyw~yu|yqwvuz{tyznxxnzzoyypxxsxyx}~{pux~z||p~zo}ym{wn|xr|~|~~}{}~~~~}~~~}~~||~~~}~~}}}~{}~{||}zuv|||tu|}uvvyrwz~{}|~z|y{}~}~z{~xx}wxzy{{}{z|}wy{}yz{zz|vwztuwqruopuopzrs{stvxrt{qtukmzorwzynqwlozmq{qtvnqrknxsuHRRRZZ[ccbfg_cdc_dgbgjejiejhbgeafa`bcbdihjzy{zy{nhiqklztummmrttjmnjnomopmlnolnljljlljllbddnppkmmldh|svvywpsxqtmrsr||owwmrskmnqqsuuuxvvvqrz{wrrzy{xvxvuwwvxxwyprtmqrlpqrvvlpqswxwvxtsuvuwsrtzxz{~wzwzz|{}orsswxnpqwvx}z}{~|~~{~{}~}~z~z|{{~w|{z}}zv}|t|{u||yu|{|}z{}}tzx}rwxz~vxypoq~}{{{ttt~~~zzzx{u~xzt|{}wtus~~~{{{~{}~}z|}|~~}vuw{z||{}~yxz{z||{}~{|vvv~||~xsr}||{~}}|}|{}zy{yxz~|}zv~~qrp}||~z|~~~zz~}||{w}|z|||{{}}}{{~~vyyjxvfwtdrps{zrttnosxz{nsrszwclimutjrqpxws{zqyxqzws|yx~s|ymvsltqmurkurfuqevrk}zj}zfxtevsgyvlzxjrqowvpxwjqpntsgmniomholgnijpklspgnkdkghnkdkhlsphmlfkjhmlglkinmhnmemlowvkvtbom\edaihbhgpvumsrhnmglkfkjikkbbbpppdlkbih`hgaih_gfemffoehpfglcgkbhmdclbbkadmcdmcendkpgilglpjsvqcfdgjhehffigcfeTWUimljtpmtqinliomknlorpqtrknlknlknlfkijomlomknlmnlnqopusrusmpnlsp_jgVeakzviwsalifolflmenlhum`peiyq`pkp~|cqojxvdrpcqoozxjwuivtn|gxufyvf{xj{xaroiwukywhuslzxmxvowvtzyw~yszwu{zv{|sxymwwmyynxxqyytyzuz{u|v{~{y{{s}q{n|xz|y~x}|~x}|}{|~}|yux~xy{uv~~}|zy|{}su}{|zz}~|}}~|}}~~~}}w~{sz~v}zy|y{vxy{~~~yzyz|}zy{{~~|||}z|z|{}}~z|~tv}uvyzxrs{uvz{yztvylnux~uxzqtxortknulotkntknwpspkmsnp^hhZbbYaa`de`ded`e`\ahhl``dfbhkglgfhonpnmotsusrttlmqkltopkllpsrmqrlpqlnoorsonpmlnmoomoojllprrtvvvkn|qtxqtuprnstirrtyzssutqtrprrppqpptoptno~vvutvvuwtsuvuwsrtsuvostimnmqrrvwmqrmlnvvxsrtsrtvuwvyvyx{{vx~y{uyzoqrsvv}xzy|{~|~y{|{z|vxyzw~~zx~}v|{zy~x~}zxs{zu}|u~||}~yzz~}v{z|mqsx|}x}~{}~~~~~~~~~{{}{y}|||~~~xxx{z|{z|zy{wvx~y{|~wyztwxvyz}{|}~~~~{yx~|{~}}|srvyx|utxxwy~}uvt}|}xyxvv}~~~x~~{w}|wzz{}}|||~|||~zzztn|hvtt|{tvvqrvsuvjont{xgpmqyxnvupxvxpxwmuts|yt}zqzwnwtktqsvtpvthspfvrf{vezwezwburevsiwulywqwvqvumyvhsqiuseppclmjqqgnkipkgljpussxvgljfkjnrqinmhmljonglkinmjpobjiZbakvtgtrdomcnlW`_gmlqvurwvfkjejiikkbbbqqq`lj_jh^ig_jh`kienfgoejnfjmdjlbknddmcdlbbkabkafoegpdjrhfmf_e`ekfkojfjechbeic]a\lrmgpmgpmholinlinlknlrussvtqtrorpinljomlnlknlmnlnqojommpnjmkipmjuraokhws_pldqmiqnafgrxwozsaocguodrniwvesrxaonbpomxvjwur}bspizwg{xh|zh|ysp~|iwujxvlywnxvpwvs{zw~yszwu{zv{|sxynxxnzznxxqyytyzuz{ry|uz}ostqss{}}s}p~zlzvn|xr|~y}~}|~~|{||{vvp|zz~z{v{|~{yx~}|~}xy~ww~~~~|}{||}{||}|y~}y|z{z{~{st~z|yz{|{z||}}yy~|{{|y{uwz|z|~xytvtvwx}wx|vw{stzrswytgivx{twyruwpstmpunqtmpqjmzuw|wysnp[eeYaaZbbaefaefgchb`deil[_cecglhmgfhhgiqprihjgfhynptmnpmmjllmrqfklglmjnoqstrqsqprmoomoomookmmlnn|pttknyruytvpmoinoelltwxlkmrlnrkn~||ztvuop|wxyzsrtzy{pprxwyqprsuvswxgklostmqrmqrtsuyxzrqswvxwvxtwwzwz}xz|~w{|x}~ptutvwtsu{xzwzy|}z|xz{x|}tvwx|}x~v}}v~}v~}v~}rzyu}|xv|{msrx~}v{zz|wx~~~tyxsyx{v{|z~{}~}}}|~|z{~~~~zzzzzz||||{}{z|zy{xxz|~y{|wyzyz|~|~}~}}}zzz~zzyx|{z~~~}|yx|tsw{z}|{}|{}|||z}~||{|}|~~}}}~{|t|{|z{xu}|v|{x}|{}}}}}{|zzzgusl}zo}{w~xzzwx|vxyrwvv}zpyvrzypxwowvv~}mutltspyvqzwiroiroirooqootrjurasof}xd{wczv`urcvsiwulywsxwpvulxvguseuranpcoo_jhenkipmnrpsvtnrpjmkknlnqoinmjonfkjfkjjonionfnmYa`nywerpdrpfqoaihcihdeehlllqpchggiieeekkk]jh\jh\ig\jh\ighnhinejndmnenkdlnf`kabndcoealbcndhodjrhfndbibgmhkojfjecgbimhhlglrncnkfnkholholinljnlmpnnqolomqtrmrpjomknlknlmnlnqojomknlorpbifYdaP[XZie`pmjxtpwtlqtlrqjtnerjjxsjwthvuiwvbpndrqitrhusr}aroevsf{xf~zi|yi|yl}zi{xr~kywlywnywt{zw~yszwu{zv{|sxynxxnzzoyyqyytyzuz{sz}w|suuz||p~zp~zn|xn|xq{uz{z~y}~~||y{|{}~~|~v|zy}{{{||}xyuw}}~}y}{|~{uv|zz|wx~~~}|s}{wx}z|{|vqr}~||yzz{}|~~{{ww{vwwxqty|rutvtvwxyzzuvwopwytgi}vz{vxytvytvzuwxsuvrtrmormosnpkdgYbbZcc]eedhi`dfb`dffj]aeeimjimoknjjk]\]zy{hfhedfxmownpqnnkllmrqeijfjlgjkklmmmponplnnlnnprrrutruu{psxorrlnsopfegilmnssuvw~yorwmpsqrrlmxstyrs{susrsihjrqs}vuwprsuyzgklostuy{w{|zy{yxzvuw}|~{z|x{y|vz{vx{wyqtuotuwz|yy{tsv}z|w{x{~{}z{|ruw||~z~t||tv~|yyx~w}w}}w{z|uttzyywzyx~}nuut{{v{{vz{~xyz|{{}||~~}xqw}{{{zzz|}||||srt|{}~~{z|~prsx}}uz{z~||zy~~|{||mkqrpvyw}wu|{z}|~{|~~yy~z~~~~}{v}|z{yv}|ztzy|||}~z{{{{ftshxvp~|v~}vyytvxvxy{szws}znwupywnwv~ktrmvupyvqzwirnluroxutusqusjtqbupl~d}yc{waurcvsiwumywy~}qvulwugusduretubpodppfmlipmnqonomnomoqnmnlimljonkpokpoionlqpkqpgnm[cbmxvgtrdqo_mkhqodkjgjj\a`jonbgfjllnoohii\ig\ig]ig[ge\jhioilmflmemmfolflogdnfcmccmcalbcndfqefodiqiipjfmhgkfeicejddhbdhc`faepmepmfolholinljnllpnptrmqnorpqwtjomimkknlmnmnqpotsoroorplrphrpdnk[jfWlfankipnkpsjppdnihtlkvqhusestertgtv`loboqkuslxvp|{csqdtrdxvf|xdyvh{xj{xfwtgusn{ylzxnywr}{w~yszwu{zu{|rxyoyyo{{pzzqyytyzuz{sz}sxztxyqssvwwmzvr~zr{q~zp}yx}~ux{}}~~~vw~~}~{{{wvtv}~}|~|~{|yst}~}wy~}|z{{zz|}}~yzyz}|zz~ww}xy}~x{z}|~wytvtvvx~xxupqtno}~~vwvxzmo}xzzvxxtvtrswtwtqswtvurtytvtnqwpsbbc_bc]bc]ff`llZ\]ccibclegpjdkngi|zwdecuuu{vwqgjwkpwmssnpooonpnnopefgljnminqksrlsklqkloejmglofloxlrvmsuouqnsnosnhmqjo{tzyrwwpurkqlhnuruvrwxtwyuzoptmnstvzxy}stxwtvuqqyst{|wxxuzytwwsvuprrz||}xww~}}tttxxwvvvxtuyuv{wx~zz}xytop~zz~}zz~}~tw||~{{|~~~~y|}x~}z{|{}}|}z{|}{{wvx~}|z~|~|}{|~|~{}}z||x{~z||~~}{}}~}~{}}qtty{{{~}{~|~~}z|zy~}{ur~}x}yxv|{uy{}}zz{yy}{uyxz}}uxx|mwsu~yw{x~~jomu|yr|yjspkurtyxv{ztywsxvqwtlwtguqjyufupdxshxtlwtryvsxvmvsiurftpktqlspoxup{ixtn|xhvrhwslzvmxtmsriqpjushtrfsqnttqvuloolmmmnnlqpkqpiqpisqgrpgqoqvxmvvhusmvslrnmrpfnjdmjjvr^iffsqTa_\ig\ifhtrXb`mrqgiijlljoncmk\ig\ed_fejrqdomlkjrolnjhtrpjjhllinmilnhgoegqeeqefpo^gehnlmnmefehjifjfhkidhdhkiimlemliqpdllfnmkrqipojqpmtsmtsipohspgqnioniondmmgprlqsnsrjpnmpnopljrqgtrcvt^op`nojqviptltuhso_ohevmdrokvv_fimvuqxtqstrtvrvypuypw}ly}gwxj{xr~x{u~}t}|p}{x|zqvtx~r}zlzwo|zmzxnyws{zu{zu{zvzzsxwvwwoootrr|yz{{{{}}z}}x{{rxv~z|}{}}~~}}|~}zvu{wv{{yywvyut}~{y~}}{|~y{~~vxwyxz}}|}|}~w||tz|x}~}z}|yzz{wqr{uv{|{|z{}~z{{|~rtxzxzy{}y{uwwyxzwyuwwopzuv}xyxqrxytt|uuwsrxwvssrrqprpprppussyvvedfaef`ef\ff^jj\^_^^defphhrjcjg`aqnjfgepqppjmvjmwkqwmstnpppplnolkmhginjoqmsogqslslmqklpfknhmphnrvlrunstntpptnnrokpnhm|w|tnsy~vpuvrwuqvsotwsxtpuoptoptvw{{|vw{|y{xrtxrrxstrwvxzzrtty{{|~~yyyyyy{{{wwwzuv{|ytuytuz{}xy||}~||~}~p||v~~xwy~}{z|||~|~~{xzz|}z{~|||~~||z|xzz{~hgi}|~}z|z{z{tv~}ywwrppyvx{|x}{xz~{}|~|~~}pvtx}|~}y~}~{}}|~~z}{~~}~{|z|}{~}~}}|~zw}|txwyx||wx|~}|~|}{}~|~~y{{~z||wyyuzxu~{xfrnvyw{~|nsqx|zx~w}hsptywv{yuzxpusptrktqjxtbqm]lhbsofxtiwsnwtnurhroetpftppyvjqnemjiurjyulzvlzvhvrdrnnyvntsjrqjusitrfsqpvuv{zfhhlllnnnlqpkqpiqphsqerpfqonstjsshvtnvtouphmkckhholktq^ifcpnUb`YfdZgedqo\gejpnfhhnppjpobmk_lj[cbhnnaihepnrsqlihqontusfigiljlmijnhhpfgpfeqeepn[cblrrmmmjjjjljfiggjhhkihkigljfnnjrrdlkbjiksrhpoemldlkltsemlitqhspionhnmhrrhsukpqinpkpompnmqlhondqo`rq`sterthrvmsxjttbpl]nefwnesoisscjmnvupwrnpqqstvx|quzpv}kw{gvxwiyxarocrny~v~~w{t}~|prpt|p~zjwulywq|zs{zu{zu{zw|ztzxtvvwww~||~yz}{{|||z||z||mtqz~z|~~{pyy~|}}}}{}|{z~yz|xw~}~|zuv|y|~~~|}~z|xz{~}~|}~~vwyzyz|}ztu|vwz{yzz{}~yzz|vxxzrt{}vxtvxzy{{}uw|~zrs~zuv|vwvvttxxvqppnmlmkrppqoopnnnlljhhedfaef`ef]gg\hh`bc\\befpefpslsqijplkkhhroqtmozlryjrxmstmrropoononponpplqrntphrununosklpfknjorjptxmtunsrnrpptlosrnspin|v{smrtnstnsplqxtyjfkzv{wsxwx|rswqrvqrvpqu|~zuvxrswrsyyysxwuwwsuuwyyz||uwwzzz{{{vvv{vw~{vwz{~yz}xy~xz~zz|~y}}p||u}}|{}{z|}zvxx~xy|vw~|||~~|}||~vw}wx}y|~|~|~{|{|~rt}{}{{w||y{zx~}w~}{}}}}y{{|~~|}}~}~~~~}y}z{yuvt~}}|}||zy~~}~}w|{{~xwz|wz|~}|~~~~|~|~~{}}z||xzz|r{xp~zs~{z}{twutywy~|s|yoxunxvtywv{yuzxpusnsqpyvkvsiwsbqmasogxtkzvozwoxugtphxtjxtw|nsqkroozwnyvjur_jggqop{xhspntsjrqjusitrfsqionv{zdfflllooolqpkqpiqphsqerpfqokophppjtrowtrvqmrpbgenurkur`he`kiYdbZec\gecnl`kiejidfflnnflkbmk_ljbjipvupxw]hfgjh]][lmkqusjominljnihnihohepfeqeepn\dcqwvoooqqqlljfjhfigdgefigejhhpplttfnm]ed^fedlk_gf^ferzyfnmgrohsphnmionr||bnpjqthmnkpokpnmpngmldpn`podsufsuhqujswnzzaok]nej{r^lhbllhorqyxpwrnpqqstx{sw|pv}iuyfuxl{~izydvriwuw}|w~wyw}zy~~|vzxt~{jwulywozxs{zu{zu{zv|{v{znppvvv}~~|||zzxxxxzzz||v}zt{x{z~ryvw~{|~y~kss|~{wvzy{~~}{z~}}~|~}}|~}||}}|vw|x|~|}~x}{z{~~z|vx~yz~tvz||}{|~}}}wzy|{prvwyzyz~xx|vx~xyyzyz{|~xyz{vx}y{{}y{xzvxvxy{y{vxwyyzzuvwrs}wxvvttwwytsvtsvwusqqrpprppnlljhhdce`de_de]ggYeebde^^dbcmZ[eohonfhojikiiZWYriougmyjryltumrqnoonqonponphdinjptlvvovoptklpglolqtlsvvotunspmrpqumptqptpmrvrwsotuqvxuzsotxtyjfk~zvrwrswpquoptoptpqu|~zuv{uv~yz~~~qvutvvnppuwwz||vxxyyyyyyttt|wx|}{|z{}~|wx}~{vw}xy|~vz|~st||{z|}|~{z|}v|{tvv{|yz}}~|}{|z{~~zzz}~~~uss}{~|~{z|x~}{|{}~|~~y|z{~|||}~|}~|~~{yxwut}{z}{z{yx~}~}wxvx}|v{zpus}}|~}y~}|~~}ttt}}}~}~~{~|{~~y{{xzzy{{y~|x~p~zt|y|zuxvw|zz}v|nyvtywv{yuzxqvtpusiqnp{xmzvftpapln~zgxtkyulwtesohyujvsszwmrpouroyvlxur}zepmp|xdolq{xntsjrqjusitrfsqmsruzyceekkkooolqpkqpiqphsqerpfqoknomtthsqmtqqupmpnlqochfgnkfol\fd[fd^ig_jh`ki`jhkpokmmgiiagfbmkbomeml`fe[cbaljhnlw{yimkfnkiqnckhfmkeoiephephepfgrp`hgtzylllrrrlmkgjhehfgjhgjhejhktqoxtiroktqoxufnmdlkdlkmutdlkcnkgroflj`fe~dprhoripsjopkpokpnhnmepnaqpdsugsuiqugptu`ok[nenw`nj{kruqyxovqkmnkmntw{tx}pv}itwhtwgtukxylzzmzxx~}u}|vvxzzsusz~}ys~q|zs{zu{zu{zu{zu{zlqpprr~~~}~|zzxxxwyy{}}v}zu|y}y}v}z{~~y}~sxy~~|{{}}|~}||zy~||zzz~zxwywv{wv~{{|}zy~~x|{wop~|}~z|}~~~{|{z{z|wy{|yzz{}wx~xy|}~xy}wx~xyyzyzz|y{|qs{}wyuwxzsuy{su{stvqrz{vpqvv}qq{ssxsrywvrsqrppqoopnnpnnpnnfeg_cd\ab[eeZff`bcYY_efpfgqjcjmdgohiojlsmroej{js|kvyksujrsmsqnpqprrqsvrwokqtlvrkrlmqhimfjnejmhorvotqlqrqulnrnsvrquplqxtyfbg~y~xtyvrwuqvnjo}y~yuzuvzrrvklpvw{qrvvsuwrsxrs{vwuzyy{{uwwtvvwyy|~~wwwvvv~~~uuu{vwxst~yz~yz{vw}~~~yzz{ux{z|{z||{}~|~x~}z||~~xy{yyxxxuss}|}~~|~~|~x}|y~|~|~~~tvv|~~}~x{y~wzx|}}~}|x|}{~}~|{}{z~|{{xz~|~~~|~z|~{~}tsu}~|~}~|}z||y{{xzzy~|u~{jxts~{uxvuxvw|zw|zqzwu~{ozwrwutywz}tywejhelienkjurl{wkzvp|dsoq{xw|ivrfvrjurqwtuxvsxvt}zmvsqzwoxujspv|oxuntsksrhsqitrhuspvurwvbddmmmooomrqlrqjrqepncpnisqqstrwxgnnmsqpqmstrpsqdjhholZa^dlkaih`hgjrq]edaih]babddgiigmlfqo]jhckj`fet|{bmkgolhpm`hejurZgcanjcplbnkeqkfskfsk[fd^fentslllnnnlmkcfdgjhfigfigejhjspoxuktqktqlusbjiemlgonltsdlkfqnfqndjiu{zr||bnpenrenqkpqjoojonkpojtresrgtvgsucnrhswlzy`plexok~ukyugqqgnqowvmtonpqoqrmptptyv|hqxmwitxhtvr~~r||zs{zozxp{yp}{zyz|ztywz~t}q~|r}{rzyqwvsyxnwvqwv|syxz||}~|zzsssy{{|~~szwt{xcjgryv}ovt~}}}rvt|zy~}}{z{yx}|~~~rjk{|~|}}y{wyy{|~xz{}~}vwux|}}~yz|}{|{|{|{|{|~xy~xy~xxyst~xy{st~xy}uvyrr}rt}oqy{vx~pruwz|wxytu~yzystyyww~vv{vuwutqrpqoorpppnnqoorppbacbfgchi\ffYeeacdaagablklvlellcfvlpvpsyrwthpzht}ly|lwxlswqvxqwa`bgfhlhmlhnphrvovlnrjjndilejmjqtuotqmrqquimpipstuymlponrggksrvuuxzv{~lhm{xtztuytuyrswyz~pquwtvytuystzuv|||uzyrtt|~~uwwuwwvxxyyyzzzzzzyyyvvvytu~yz~yz{vw~~yz|}~yztw~{z|{z|zy{~}~z~yww|~~~~~~}~|~}}~||}{~||~~~}}}}|~}~uyxyzzuxx}~~|~~xzz{}}}~|}x{y~~z~z~}|}{~~~}~|yzx|y|uzy{}}}}}~||~||~~vwv}}}~}~~~{}}z||xzzuzxu~{n|xu}|}v|zv|zt}z{s~{uzxtywv{yuzxsxvpwtv}zr{xnyvlzvp~zgtpowtuywlvsjwsnwtv{ysvtw{y}mvsoxvnwtirofoleoljpoksrhsqitrhusnttputeggooossslrplrpjrphsqfsqltsnnpnrtmsrkpnllhmnlkljknlsxvholdkjaihbjijrr_gfaihsxwoqqlnnkqpfqoanl_gfagfhpoitrjtqepmcolguqP_[\li`om^liaoidpjhumgrpgonjpoffflllhighljdhffhffjhfjhisllvpgqkdnh_jcckjhpobjickjbjiepmhspu{z`fe\ffhtveptenripskpqjqpnqqksr_llgsuktwjuykvzm{zbrnmy\ofjxtcmmipsnvvnvpprsoqr|osxx~ls|mw~hswitxq~r||qwvv~|s~|vn{y||{}x~{w~p}{o|zp{ys{zv|{w~}qxxoxvv|{rwvx}||xxzxxuuuy{{{}}}|~{kqpz}~~~||xz{}uvt|}{}{{~zy~}wrq{yx~~}|~~y|z|xz~~}~suz{z|y{~~~yx|{{~~{|{||}{|z{z{{|yz{uv|vwwx~vxzrszrsy{{mortxzqsrtrt{stytuytuztuymmrff~vvzyqonmnlpnnpnnpnnqoorppa`b`deafg\ffXdd]_`[[abcmjkulelldfpgjpinkcjrelmyly|lvyjvwovztyjhjonpqmrvrxumwwpwnnrllpjornsvu|uotqnsrtxhmpfmpopttswkjndcghgkyx|}y~uqvokp~z~xtystxuvzuvzvw{uvzwtv{vwystupqsssqvuprruwwuwwtvvttt{{{qqqxxx}xyxstz{{||}~yz|}|}r~~w~tsuutvy{|x~}z||z{{|ussz||{|{|{yxxyw}~|~}~}|}{}~wx~~y{{~}}z||}~~x{y|}}|~~}|}|~|{~|{~}}~|~|ur~}|~kkkwut~|{}}}}}xxx~}~}~}|~~y{{uzxu~{r|nyvpsqsvtvzxvzxpyvu~{p{xsxvz~|pusy~|ntrovst{xoxuozwm{wn{xmurqusopnntqkspjsplpndecpsqz~pwtpvspvtmtqlspipmjpoksrhsqitrhusmsrnrrikkqqqtttlppjpphpphsqfsqltsjikjnojpolpnsrnomlijhlomkpnmrpcihcihgllntrchhcihjonprrdffionfqobom`hgfljs{zalj_ni]kgcqmgyui|waup^qn]nk_nk^lflxr_jhemlhnmlllhhhhiglomcfdehffigdjhdnhjtoismhrlfpjgonaihckjfnmckjdol]hebhgv|{kuugsueovbnqipsipskproqqpwvlxxcoqgpsgrvgswn~}dtqavmVkbiwsr||krunvuovquwxnpqwz~uy~ymt}oumt|nwzrz}r||pvuw~r}{s~|jwu~}z|z|p{xo}yp}{o|zp{yu}|p|zpxwv|{syxx}|wrs{yyzzz{}}y{{ryvw~{z~~{}}ryv~}|~~}|{str~~}~}}~|~}~|~}}suu~~|~y{{}~~y{~~~||||{~~}}}{|{|z{{||}}~z{rlm~||ztuuopxst~vwxzwy|~wytvvx}uvwrs{vw}wx||ww~zx~}strsqqrpprppqoopnnljlehi`eg]ffXdd^ababh__ibblgbhndimdgmfknfmrepzgr}kwyiuvisrjqkeipmprqskglnjptlvqjqnotnosflobilclototqptuuzhmpfmprsxonsrqvuuyccgvty}y~wsyxsx{w|vrwrsvtuystwtuysuxust}xyxstuopopprwvsuu~uwwvxxvxxtttsssnmnuut|yz{||~{xy}yz{}|}||}yz}~}}s~yvwxppruuvuvw|z|vxyx~}vxx{ww{|}~~~|yx||x~}{~}~|}}}}}~y{}~~~{||xyy|||{||||}~y{yzz~|{v~}~|}~|}~}{~}{yx}}{~}~}}z}yxx|zy}}|{{{zz~~uus}|~|zzwuty}w}rttz|||~~y{{x}{v|s|r|yy}{y|zuzxuzxpyvnwtpzwnrqmspz}{~szwt{xt}zqzwpzxnyvpvsvxvtsrz|zu{yrzwuxvtvttwuu|ypwtnurovsnvrnurV]Zntsksrhsritriuslrqkpoknnkllklljpojpohpofpndpnkrqigjilmionjmkrpmutrkljikigljhmkbhgchhhnmnutdjicihglkprrghikppcom`mkdlkipodkjgrpbqm^mi[jf`rmZmhXmiG[YWjg^mi\jdo{uitremlflksst___kljlomdgedgeehfdig_jbjvmnypjvngrjgpoaji^fegnmgoncojepkmtrjpngppcopcmtdntgpsjqtmrsqrrbgg]iifpsgorgsvcosiyxdwrXneZnf{nvwlsvovuqxtsuvtuwruxsx|v|ls{nu}qxpw}qy|qzzu{zv}nywiuserp{}w|zxs|tr}q~|r}{y}{s}{q{yu}|w|{|||{{}}wzzw~|v~zw~||}|}|z~}uvr|z~~}~|}{}||wvqjj}{{z}|~}|~|~~~lmm~}z|}~}~}su}~~}}|~~~{}z~~{~z~~{|{|{|{||}~~{|wqr~xyz{yrs|vw{|xpqvxqsy{xzuwrt}uv{vw}xy{uvuu~rr{ss~yx|yxtvtwttsrrrpppoopnn_YZbaa_dc^cbbedZXZpno`^_ecefbhhbjlfkmgllfpeajoitdlpinrlknvpqvlmwrwlkpnjq}ytlssmshkkppq_onVvr_wtmpqpstnrslpqkophrq_jipzzmttlqrtxxxqt{uwwps{}wpsrttrttpvtsxxkrq{yyywwwvvqrqoqqqvurttwyyuwwuwwxzzuy|lostvxxw{wvyvzsyy~uzv{rw|y~uyzx|~txzw{|syx{ru}|}yzqvyxrvwx|}}pstu{zv|{vyzx|~xx}~z~v{z~z~{}zz}~~{||~z}vsuspqy|}x}~y~z~|}}}{vw|}}~}~{}z}{yx{|~}~~}|}}~||||~~{|||||}x||~~}}|{xw{{}}{||}}~}~~wxy}}~}{}}qvumrqw|{v{zz~uzyu|yv}zourourtzwu}zt}z]fc{vironwts|ys|yoxujspqzwktqx|z~y|zrvtuxvrwumsqYb_pwtpwtpwtpwtu|y}jtpjtpgpmjsppxuovskroelijpnekhhonhpoinnionjonknnmnmmmmlmmmmmmmmUYYgkjbgfglkglkcjgenkipmdigcgeimkjmkSXVbhektq`ifepmdol`khfqndolepnbnl]jh`mk\jhZjg[he^lhaok[ie[jfclicmignkmrpfjgjhhmlliiihhheggahfcqkhvpjwq^lfivpcqo_mkamkfqogongpjhpihpjhoihoijtofosipsgmpkorlotnqtilqknrorvnrvdjifnnirqfonhqoemloqqqppwuvputnvutwuqvtt{xpywu}{puwruztx|ptxz~qm|i{xsl~{u~xw~xx{u}m|k}n~}p}}t||twxtwxwz{oqsy|}~~~}}|~w{|~}}y~z}prs~{|||}}~~~~}~~~}~~}}|~|}|||{}}~z|~|~{}}}~|}|}|}}}~}{z}}||z{~~|}}~z{|}|}|}~xyyz|}z{|wx{vw{tuosvytxnqor~uvztu|vw|zz~z{wy|tu{tuytuwuuvwwmoomnnnppnppicda__X]\bgfdffhdgzxwa_^fdcokqokrnhmichidmolukgrYdh\cfhjktnotikwqvkjnjfkqmrpjovqvvuwqnpdvuVvsbzxnrsostmqrkopkopiss^jjissjrrhmnkopyru{tw{twz}yrulnnprrnsrsyxpxwvttwuuvvvsssqssqvurttxzztvvtvvxzzzz~ghljkouvzuw{uzsytzu{rxu{rzzpyxrzzt}|s{{t|qyyu{}u}}w|}x|}xz|y|}ntsqwvvz{svzvy~{~vztwvzz~|}~~~{}}|~~xzz~~~~~~yz}z||z|}|y{x|}w|}w|}ztyzquv}}}jefxst~{}y|}~}{z~|x}~~|~}{z}}~ywvvtsy{{}}}~~~~y~}}}{zv|w|{}|uqpyy~~|||~~~|~~~psqnqo~x~}z||}|~~}|~~}}otslrp{y~}w|{u{z|pyvnwtnwtlurw~{t}zktqt|r|irolurr{xoxupyvu~{kurszwrwupvttxvuxvtwujom[b_dljpwtpwtpwtryvjqnfmjjsplurs|yfoljsplspmtqdkhipmfnjckjr~|ionionjonknnmmmmmmmmmmmmmmm\a`glkdjhbgffljdkhhqnryvw|zjmkgjhilj|gnknurbkh]he`kh_jg[gdcolgoneml^jhbom\jh[ig[ie^lh`nj]kg^lhhqn{nvrinlorpjhhpnnjjjlllfhh`fe[ifaokcqm`njn|xaom`nlcpnaljfnnhojhpihpihpihpiismdnnhpohmnnrrosskppmqrlpqmqrkooflkhpoiqplts_gfrxwmmmtrrvttputnvurwurvtv|zt~zkvsrwxsxxvz{ostmqrbhiizwm~{izwvn|t|v}zw~{vm}nop{{w{~wyzwyzsuvvxzxz{{}~~}|~}{|suv}x~}xzzx}{}~wyy}~|~~}~}~y{vy|{|~{}{}|}|}|}|}~}~|{~}x|y}~y|y||~{||}||||||||yzz{{|~yz}~xstvqr{uvpsqttwy|{|}wxyst}{{{yy~|pr~vwztuytuwuuuwwz||nppdffhjjicdhffinmbgfceeiggkigfe`lkhpnolhnkejkejlgproxkgreptmtwnpqsmnshjvptjimhdizv{lfl{uzyxzolneutTsp`wunrslpqhlnimnkopissbnngqqiqqkpqquvxsuzuw{vx|wyxsuuwwz||mrqsyxksrvttwuuvvvwwwuwwqvuqssvxxtvvtvvwyy~y~pnroptx|w}v}rykr|ipyt{rzpzzmwwy{mwwivumyzvrz{ypxxlpqswxz~vxy|qvuz~tvzwz|~ztvvnqwz{~}xyxst}}~~~|}}{}}~{}}~~~{|~z||y{|y{}z|{xzx|}w|}w|}{tyzuyz~~~{{{wuuz{|}}}{|z{y{xz~xy{zv}~|z~~}|}}~{yx{yx}}}wyy|~~z||~~~|x}|x}|~{zvrqvqp{{|~}~~zxxy{xzz|~}~z~xzzy{{}}mrqjon{~z~v|{xr}zitqitqmxuqxuoxur}zs}mvslurr{xoxumvsktqholu}yv{ysvt}~|uxvx{ytywipmktqpwtpwtpwtovskrojrnqzwjtpx~gpmiroltpmtqjqnkroipm]gehsqhpoionjonjonmmmmmmmmmmmmmmmdihjnnglkbgffkjkrohollqojomhkippnhkiknlfkigokajg[c`bkhfolclibkhgoneml_jhaom`nlaom_mi^lh`nj`nj`nj^hegnkfkilomqtrhefpnnlllkkkikkflk_midrnhvr`njdrnaomaomdqoaljfnmfpjfqifqifqifqiismfppfnnnrtptuostkoplpqlpqrvweijionotsmsrlrpflkqwvlnnrrrrrrsxwoxwrwuqxuw~{w~p{xrxxvz{x{}uyzx|}tyzvuiwuto}{n}xs|yx|u|r~trq{{v~tvw{}~tvwrtuxz{xz{~}tsuvuwxwywvxy}~|{|}|~|~|~~|{}}z||z}}uuu{}}~||{zz{}svz}|~{}{}|}|}|}|}~~w{vzy}{~x{~xz{||}z|z|z|{|z{z{}xy|~xstwrs~xyruswsvwztw|tutnovpqxvv|zz~tlm|}ztuytuwuuz||ikksuuuwwprrhbc\ZZV[Zchgdffdb`bb]ef\mmfljjminrlqqkptoxnktiepalpelooqroijnceuprkjllikvstpkmvqrnkmsoqcsrYwt_usjnohlmdhihlmkopisseqqjttlttlqrlpqxuwywy{xzvtvtrttvveggfkjx~}dlkzxxywwvvvyyywyyqvurttuwwsuusuuvxx}xsxlmqw|u~s{xxqxtzt|rjwyo{}weqscsnsr|ozw|qvwlqr}~~rqs}rxwuyzpuxnrw|}~~~{~{~~zzvuu|~~{~z~}qsszzz~zz|~~|~|y{yvxw{|uz{uz{mrspuvx}~z{|vxx|yy|zzxstxxx}}yzwy}xytrr|zyrqm{{u~zy|wvzy|{~~~~|{{yx|~~vxxy{{yyy~~~}{|xw}yxzvu{z||}~~}z|}v~~x~|||~}}}}}}~suu}}nsrejiw|{z~}x~}kyum{wr|lzvr}hols|ynyvr|qzwnwtu~{qzwqzwdmjmtqpusqtrpsqz{ysvtrusv{ymtqgpmpwtpwtpwtovsovsqxunwtirot}znwtktqovsmtqryvryvszwhsqjwuippgonionjonkmmkmmkmmkmmjllinmkpoinmputkpoipmipmrxvruskljkljopndhfgljhmkipmktqktqhqnenkbliiongml`ihdom`mkanlaok_mi_mibplbplgnkejhfkiknlfgegbcrpplllnnnjllekj_ljbomanl`mkivtesqaomanlfqodlkfpjfqifqigrjfqiismdomksrtzxsxwmrqkqpekjhnmqwvgmllrqtzypvvgmlgmltzygiioootttv|{q|zqxuryvv|lwtp~ztzyw|zy}v{zrxvu{zs~q~|n{ys~tspyxpvux~r~|tt~~ww|}mrsy{|uwxtvw|~xwy~}xz{{|}~y{|wyz||~~vvwz||~~~~~~x~|||}vvv|}|}yz}~vqr{vuzy{yxz{||pr~|~~y{w{{qwyrw|wy|~{}|~}~|}|}|}~}}xw{vuzut{zz~vzz~~~wwz{|}z{z{z{}~{|z{}xy|}ytu~yz{||~~pr~qrwy}oq{stsmn|}wuuywwtopyz|}ytuwuuxwwlnnfhhsuuwyytvvf`acaa]bachgdffnlk__Zjkbgh`jhhjfkmglpjoqlukhqkgrbmqgnqmop_YZshjqlnmlnolnnkmtoquprqmotpqbpoWtqavtptujnohlmgkljnnfppeqqhrrlttkpqlqrmnolnommolnoopq|~~prrglk{mutywwxvvuuuwwwuwwv{ztvvvxxtvvvxxxzzxqv|w|tuysx{vpys|wt}pyoxp{q|uymx|o~zwxt}zr{wtxyswxy{|uwx}z|ywy~~~tvvuz{ouxntyv||}{~|}~zz{zzzz{{y{{x}|x~}y~xzz{}}tttyww}xy~{}}|~}z|zwy}uz{lqrnstuzyyz{||||zz~||wyy|}}|~}y}|zyts{vu~}zrrrttrrrvvv~~~x~y{|wxvtqqnjizutzut~yz}~~qsuwz|{}}zrtts{{v~~~zx}|twuwzxx|z}~|}{~}xxx}}}wyynppsuu}}uzyw|{x}|{}zn|xo}yp{Xfbl{vszwqzwqzwlvtn|xt|zoxuoxus|yu~{s|yx|{nsquxvpqo|yxx{ytwuuzxhollurovspwtqxupwtpwtpwtfolirohqnqzwqzwovslspovsu|yovsgrphusgrpfqoiongmllnnlnnlnnhjjuwwhmlglkhmlafeglklqoinlrustwujhgjgfnlk{|zhkihmkjomipmcjg_fcfmjipmfllgmlbjjblj^ljesq]kg_midrncqm`njejhinl_b`gifkhhojkpnnhhhzzzlnnflk`nkerperp`mkgtrgusbpnanlcnlgondpjcphcphcphdqigsmgrpt|{pvuotsrwwowwksrdllnvvhpou{znsrtyxx}|rwvsxwinmqssoqqryxnzxryvr{xwn{wkyutyyw|{uzy{nsru{zt}wp{yvzsr~|rxw|xv~sxyx}~z~vz{}{}~}zz|~}y||qtu{}~qsttvw|~|~|~|~~}z~{}}vtt|||||||||~}~~}|}{|}}}www|}xst{||~xz~~x|||xz}|~}{}|}{|{|{|}xwmhg{z}xw~}y}x|rv~{}{}{}xz~uwz|y{}wx~yz~yz~yzzuvzturttvvxy{tvwxrlm{|zxxrppztu}wxxstxtt~||kkkrttsuunppjllrtta[\fddfkjV[Z`bbqoomki|{vjhfjhhjfloinmglkfodajmitalpelolnoc]^rhjrlmnnmpnmommtnotopuprwpshwv[vs\qojnojnnimnimnhlmfppammjttjrrlprjopjnojnokopkoposttvvprrglkv||s{zvttvtttttvvv^``x}|suuvxxtvvuwwvxx}wtywx|{tz}pwrys{pxpxs|py}py|ajn~jswq|ys}{rzvx~|w|zswxswxz|}vuwyvx~{}~~~vxxtyzu|r{ozzxtz{w|}w{|vyyv{zu{zx~xzsuu}~~}xy}z|~{}{xz~{}~{}|v{|nstqvwuzyx~}|{{{{yytyxy{{}}}}|}}{{ywv|~}}||tt{vuywv}||~~{}}}|||}}}yzwxvvwuwut{wv{vuz{}~{}|z~~{}~~~~~~}~~|}}zzz{}}w|{w|{x~|x}|z~w}|ozwv~t|mxuq|yx|t}zmvslwtp~zt}zs|yu~{pyvhqniqnpuswzxwxvurr{yxvywtwutywpwthqnovsovsovspwtpwtpwtnxtqzwr{xoxunwtnurnurnvrlspkrokxvlzxbpnjusckjfmlinmglkfljejintrhmlglkjnnotskpojominliljlljpnmrporpovuthljjmkinlhlkinlinlhmkhmkdihhllgmldlkcnlhsq[ie\jf_mi_mi_miejhlomlpnkihmkjupqljjeeeiiijlllrqammdppcopfrrjvv\jh]kibomdomemlfrlerjcpherjdqifrkjurnwtipmrwtrwtnwtgpmbkhlurktqnsrnppuwwprrhjjkpokrpvwxqsspxwiwunxtoxuhspkxthwsqxusxvrwux}{nsqu{xv~}u}|u||t|{pxwdwvnzzx|}}|tyzqvwz~x|}rvwsuv{}~{}~{}~~}~}}|~zy{trt~~~|}|}y{{uwwvz{w{|w{|~~}{{~|~opp}}yztvy{{|}z{}wx|}~}xy|~z|x{y}zpv}wy|~}~||||||{zsnm{z||z~x}~~|nr~}{}{}{}xz~uwz|{}|vw|wx|wx{|sno}wx}wyy{wyvxz{wqr|vwxvv}{{xst|vvytuwuugggsuutvvnppikktvvmghrppafe]babddfce][Zqondbac_egbjkejoinpktfcllhsalpelohjkkefshjrnnnnnpnnommrnnrlnsnpunqdppXsp\qojnoimnfjkgkljnohrrcoonxxhpplqrjopkpqkpqkpqjopjopqssrttmrqrxwltsywwvttrrrsssfhhv{zuwwuwwtvvtvvuwwxx||}z{z|suysypyoxq{qzu~w}u{bhov|tzv}}v{|uyy|}~{{|}vxyrps|{}ytv}xz}}yzzsxyt|~p{n|zumxxt}|s{{y~}x}|w}|s{zr}{u}|wyy~~{vw~|~}z|{xz|~|~{{x}~qvwsxytzyy~}~{{{xxxt|{sxwy{{zxx~~~~zy~~~zyyy}{z|~~yyy}|}|hniv|w~{|y|z|}{~}|~~~yzzxyzxz||~}}~~yyyxxxwyy|}~rtt{{z~~x}|v{zw}|u~{v|oxuqzwmvsy}r{xmvsp{xp~znwtt}zx~qzwlurv}zoqoorpuwtxvt|xwwzxrusmrpmtqktqovsovsovspwtpwtpwtv|mvsnwtu~{u~{mtqpxtntrpvtkroo{yo}{erpivtbihemlinlhmldihhmlmrqglkhlljpnlppkpolomehfnomlnlzutnjisonpnmlljjmkknlkpnqvtsxvjomfkichgglkhnmelkdomhsq[ie[ie[ie]kg_miiljhkiijhgednjiojkljjlllmmmmookqp[gg`ll_kkdppeqq_mkaomerpdomgondpjbqiaphTc[[jbbqiitqhqnfmjqvtptsitrcnlcnlbmjhspjonmoosuuqssprrtyxoutotsqvujtraommvsp{xiwshwsixtryvuzxsxvy~|rwux}{x~}tyxw}|tzymsr]sqlzyz~~~{|~|~xxz~quv|w|}tyzy{|}|~~}xwyvuw}~|{}}{}tyw}|~~}y{}srrzxxz{|}~}~z{}~zy}|~~|z|wvx}qsy|qs{}}|~}~|~|~|~~}xw|{zz||}}}os}{}{}{}xz~uwz|y{z{z{~yz{||}}~vxuwvx}rttv|tuxrsystwuu~||xstxstvutvttrrruwwprrqssoqqmoovxxhbciggbfe`dddeekhjkhiolljhhjfmrnwmflmgljfmhfmlisbkocjmghjoijxnornooonqooomlrmnpkltnqypscnnVnl[kjgklnqrjnoilmhlmfnnfqqkuumuutzzpvvmrsmrskpqjppmrssuuqsstxwqvujrqsqrvuuyyy{||uwwsxwtwvuwwuvvtvvtvvnqtwz~xz}ww{|{~v|q{pynwr{x{|wzqu{vyvyuwzxx}||}z}z~}|y{}xxz|{}}y|~z|~~zzzy~qz}r|n}|xkxxs||s}}x~}w}|s{zr~|q}t~|~~~}|}}}z|~}~{yz|z{~|}z~{y}}sxzuz{w}|y}||~~z{{zyyw~qwvz{{|zzz|~||~~|{~{{~}~}||{||~}|{~}{z~~~z|||~~||{xxw}}|z{z|zz{y~uoq~yz~yvwxvvxxz||~}~z}{~~~{{{~~|~|z~w}{~^``|~~~|z~x~}uzyy~}u|yv}yovsovsovsu|yowtt}yr|yt}q{xs|ymvsr{xqyvw~{mpnkljvuszxwzwvuywx{yuzxkropyvovsnurmtqpwtpwtpwtmvsmvsq{x^gdajgksoszwmtqt{xs{xm{yp~|dqogtrbmkenlemliqptzzsyxjqpfkjhmljonhmlhmlgkiiljnnlnlklihtponjiljimmklmkkmkhmkw|z}jomfkigiigmlgllcihfnneom^kh]jfZgd^kgbokprpstrppngednkjlhhonnmnnpppprrionYdecnoepqbnocnpftraomamkeomgnmerkfumhwom|tguneslmzsjtmjqlntpmsohtmdpkivo\hcjvpkponqqruuorrlooejilrqlqpnsrjtrjxvoyvp{xkyujyukzvv}yyzx~zv|vrxtv{y}sxwx}|v|zruueyzoz}x{~yuz~{z|}lpr|y~z~~y|}{|}~~~~{{|vuw~}}~~~~~{~~~~}{{|}}~~w|zs|yx|~~~|~{|~~}~~}{}}~vx~xz}{|}~z|yzy{y{|~}}}~}xx~yx~}z~{vz{}{}{}xztvz|z|yz}xy|vwzuvysuwqrxyvwuvvwuw}~ystuopxvvrppytuwrswttuttuvvqrrjkkjkllllmoopqqb^b\XZd``ngfha`fa`c^Zpjfcc]cffdhkljkliklhlifikgjkjkljkkhhfccsppqqopqmlmjqrmnnkmlkofixqtnjlonpmkmggilkmmnoonpjjksprsprpstnvvittittmqrlpqhmnimnptuxz{utvwsvyqtzosusyruwvyzztzymsrpvuvxxywwvvvotsqttpvuu{zxzz|zztz}qzoys}kw|ox}~v|xqvzuxsnputttyxuzyvz{wy}tw{tvv{rypwt}rxmnny{{qvww}tzxyzz{|{|}{{}wwxz}|w|{t|{v~}t}v~}z}~z~y~y}y|w~{v}zu{y{yx}xwux~uwvxz{{}}}{zz|yy|}}}{yy}{{~|||zz}~|}}|~{zywv|{|}|}}}~||~||~~}~}}{y{}xw~~zzy|}|{~|}{{|z~~}}{}{z~hfe{yx~~~~}wyy|}z~{wzw|}~|~wzx}~xvxt~{x~v}zy~|ionntsmsrt}zrvtz|zz~|x|r}zmxuktqrxutywrwumpnvzxwzxwzxuwupwtryvqxuszwy}szwryvovspwtpwtpwtryvqxuovsqxuqwtpuspusqvttywsxv]gdp|ygroitqcnk_njZpl_qnivtfnminmhmkejhy~|chensqlrohnljnljljstroomrnmokjqmlokjrnmeighkiehfjljiljfjkijmjglmloadhjrrfihgjidggfiihkkrmlrnmronecbuvtfkhjqnmsphnlflidkgfmkhomkrpjqofnlenmhonfmlfiiillkspgrmmxuixsetpgwqhwsfroiqpnttosuitrgrphsqjusgrogsqjxvkxvcqodqocommrqmrqqvurwvmrqqwut{xt~{mxumyvtzxtyxtyx|lqpotsrwvtyxy{{|}}xxxrxwvyy{{{{xyzxx}}}{}}y{{{}}|}}z~zq}}eppsy}rvzy||~{}~~}}|xzz}}~}}}~{z~}~xy~yz{|}~wy}|~{z~}~{~z||vx}y||~sw}y{}|z{~}~|xw~z~}}~x|wptz}{|xz|~|}yy|}{|~wx|}}~{|{||zzxwvsqqusssrrzww{xxropyuvurssnoojlupqyst{vwxrs{uvxqrxnptuxzvllvnmwnnvnmukk[V[b\^mhiidclddfa`_ZWysnee_cefbgjmjlkhjgdfdacjginllommljjjhhjhhghfjkinomijhhihxvurilslormomjltqsmlnonpmlnqprpoqvqstqsprsjrrhtthttoqrnppopqnpqmopimnnmotqswpszqtsqworvnrsnrssxwsyxrxxxzzzxxz~wyyqwvu{zwyy|zzuy|sz}p{}coqo|~mvyzsxtmr|}vxxwxxwyzwx|wx|suuvrwpwoxksznppxzzuz{y~w}|z|}|~|{}lkmyxzwyyw|{x~}u~|s|v~|{~~z~}|w{|w}x}|xzzx|xx}uxtvvxyyy|||}}{|~~|zz~||~|||zz~{}vsu}z|~xvv{yx~~||~||~||~||~||z{y}~|}~|z{ytus{vwz{}yy}}~{z~}~|}~}|}{~|{~usr~}~}~}}~|~~}~{}}{~|y|zmpn~{}}xzz}|~x{y~~wuww}{|zntssyxqwvktqx{y}~|{~|v}zp{xnyvmvskrouzxpusrus|}rusqtrvywx|t{xv}zu|y|x|w~{v}zpwtpwtpwtqxupwtovsovsovsqvtotrnsqrxvrwudmjnzvgroepmdolcrn\qn_qnfrphonhmlfkiinlnsqchfgljpwthmkrusorpopn{|zrpomlkkihmkjnlkfmjgmjholjpmipmimnhjkhegsrt|nvvgiifhhegggiigiioihokjplkijhstrejhbifelihplfmjdlhcjgbifholgnkdkhbjihnmhnmkmmjlliolispkuritqetpfuqetpfuqjrrnttorvhtrhsqitritrgrpjwuftr\jhaomcqocpnsxwchginmnsrntruzxpwtnurnvsmyvqwvrwvrwvz~nsrpvtotsvzzvxxzzzsxwxzz}}}{yy{yyzzz}y{{vxxtvvputt||s~z~{xzyy~xy}qtuxzz~|}y{{~xzz}}}}|}|~}~{|~|z~}yx{z~}~}}{~|w{~mquyx{|}{vwuqp|}vw~|{x}vsu~~~~~y{z|}~z{yz~xz~xx~~xy}xy}{{xvv}}|zzyww{yy|zzpnnxvv|zzsno{vw~yzvqrxttxrsystzrsvkmwy}prtjjrhhqffsiivllccg\Y[mhisnmlhfiedlgdtniff`gijglojgihegc`bnkmjfhpnnpnnnllljjnomlmknpmhignomljjrilxrtpkmroqqnppoqrqslkmqprsrtytvolnacdjrrhttittnqrmopkmnlnortujnonpqsrtxrtxqtsrxruynrrptutyxtzytzyxzzywwyyylqptvvx~}tzyy{{zxxqtwovynwzamop}mvywqvsmrwrtwrs}~vxxuxxuwxwx|wx|tususxt{vu}}y{{puvqvypv{~}~||~|{}~z~w~|w||u||t||x{|{zx~t{}x~|ytz~yzwzxx|xv}wv|uw~tvzzzzzzwuu{vw|zz~||~|||zz|~~{}wtvyvx~||}{z~|vts}{z~||~||~||~||~||~}|~|{|z}~|}|~||y|z~|}~~~}~}~}~|~}}|~|{~~}}~|{|wrs{}}xzzz}{y|zvyw}}~~~yz~}~xzzy{{|~~{}}zxz{}fnkrxwu{zkqptzyw}|nwt~~}z|zt{xlwtkvszx~||tywpsqvywy|zsvttwukroovsryvu|yszwx|v~zt|xpwtpwtpwtnurmtqovsovsovspuspusrwupusqvtemjktqjspgplhpndqm[nkbrogqpeihnooinlnsqotrglj_dbovsdiguxvlomlmkpqopnmmkjjhgqnnkihenkcliirohqngpmflliklrordcfcgh^ffhjjfhhikkgiigiisontporpoijhqrphmkeliholipmgnkfljfmjfljkroipmgnkckjhnmionkmmikkinljqnjrojtq\gdn|x^jghrpmutptvnsvjrqksrnutksriqpn{yjxvcqoesqgusgtrtyxejimrqqvuputqvtmrpjqnnwtowtoutputputv{zrwvqvuqvuhmly{{}}}uuuuzyvxxwww{yy{yy{{{|~~{}}|~~y{{v{zwq{{r||~sz}{}}}x|}w|{w|{||~~~}}~|{|~{~|~|}~zx|~}~vrq|{~}~{~|sv}}{~{w{~}s}}x}~~~~~~}~yvzz~}}uv~uw~{|xrs{uv}~~~xyyst|vwtnormnxvvqoorppzxx|zz}}{yyrppxvvqlm}xyjeftopwrs{uvztu~vwtikz|~rtww{{~~{ttnffdcg]Z\XVVokje`_hdckfcoidooiikldilolnroqfcelikhegommommmkkljjzxxnnnjjjpppnnnuuuqoownq}vypkmliktqsmlnrqslkmrqssrtuprzwynvviuujttpoqonppoqjikvuwpvwnrsoqrvsuvqsoouqtxmqrosttyxtzyrxwuwwzxx}}}~y{{outv|{vxx}{{txyqvwjsrlvvozzry{wsxysx|~pjkxxxwwwvuwxw{{y}wwuvy{w{v}sxwyy|~~tyzsx{pv|~~}|~|{}wzzxzzx|{v|{t|{u|{tw{}|~~{wtonkfzyyyvxvvyvv|tv~uv|yyy|zz{vw{|}{{}}~|||zz}{yyusrwutzxwwut|zy}{{}{{}{{~||~||~|}{~}wxv~z{zutyyxxx~~~}|}|~}~~}{z~~|zz{zy~{}}{}}{yv}zy~|~~qssz||wyyywy{uzxtzyw}|ntsrxvpvumvsrusnomx{yu|ymxubmj{lspqvtpuspusrwusxvqvtmrpmtqw~{szwszwryvz~u|yqxupwtpwtpwtntrmtqovsovsovspuspusqvtnsqpusmtqirojspgpmhqnamj`omeqolrqrssmijkpnhmktywotrX][gnk`ectwuhkilljvwughffgemnlrtrghfbmj]hefqnfqncnkdjifhhussmmmchgaihhjjeggjllhjjeggkgfjhgiigikihkiekhholkrojqnholfmjgnkjqnjrnipmfmjhpokqpionjllikknqohmklroiqn]fcoyvXa^gpmmutpuvmruirqltsowvksriqptn|zhvtftrftrerphmllqptyxsxwkposvttzxx}{ovsnwtqvuqvuqvutyxtyxsxww|{{}}{{{{{{v{zwyyzzz{yy{yyxxxsuuwyyvxxvxxtyxu}}muu}y~sxyt|}vz~y~{w}~}y~}x}|}~~kmm}}~~}~}~~||~uwz|{wv~~~zyzvu{{{}xy~|~zru{~~{~y}vzxsu|~{|z|}~||y{~~|}xpqvx|vwz{{|vpq}wx|vwxrs|vwz{smnrmn}{{uss{yyxvvsqqtrrwuuwuuzxxrmnupqtoptopxstwqruop{stshjtvtikskkulmrii{ss`aecadgddd`_hdcfbafa^ke`kkeacdchkjgijgigdfurtmjlljjnllmkknllommoookkkppolmllllkjipgj}vylgijgiroqmlnrqsutvnmoljlwrturtqstltthttjttsrtqprtsuqqsutvjttlttostyvxuu{wz~y}~quvqvusyxw}|prrxvvwwwuzyvxxtzysyxz||wuuw{|uz{wt}}lxxksssrvwsxngjrlm{|wwwxxxyxzxw{wvzwvvwy{ruy~msztvv{}}zpuxsy~~~}vuw|~~z}}x}|v|{u{zsvzsrvy~}qwxho{xs}zuyvqrojzuqp~zy}xx~xy}qqqzzz~||ytu|}~~}{{}{{~~zxx{xzxuw~{}{xzwut}|~qonywv}{{}{{}{{}}}}tusxywyzx~}{|{{xwwyyy}~~|{zvuyut|~~|~~iiirrru~{|y~|}~}|~~tvvyw}z}x|||v|zsyxpvuqwvrxwv|svtpwtmxuhspyy}qvtpusmtqnurryvu|yw~{u|yt|xw~{nurt|x{w~{pwtpwtpwtmtqfmjovsovsovspvtsxvlqoqvtotrmtqmtqahekrokrokroeqofmlkkkspptnohmkinlgljdigbgemtqqvtehfbeckljtusrrpqqojkirsqhhfcnk`khgroepmdoldjjfhhqootttW\[ckjikkegggiifhhdffigfkihtusdgeglj^eblspjqnkroelibifipmjqnjqnfmjgnkfnnjpnhnlfhhgiipqokmklomholovsy}tzxqxumsrpuvnvyntsntsoutntsntsgtrftrgusftriwuhusrwvsxwputv{zotsstrruspvtnurqxtqvuqvuqvutyxtyxx}|x}|z~}rrrv{zxzzxxxywwzxxvvvrttrttuwwvxxtyxgkmmrsw|}vw|x}zu}t}}u|{}}}|zz|~~}{{xvv}~|{|~~|}~||}|{nllxrs}|~z}z||~xmp~ptw{y}z~|~pzzw|}||wx~rnmzws~}~zy~|wy|v{}vy{y}|}xy|~{}yz~|}}~}wx{uv}wxyz}xyvtt|zz{yy~||zxxvttljjqooywwupqwrstoppklrmn~xyyst{stzoqz|ujlvqpvrpuposnmwrqhim^`aaaa`^^ea`ea`jebke`ggafhi^cfc`bifhmjlmjlolnmkkljjmkkommommmlnkjlnmpqorqorqnpqhk{twjegjgipnponpnmotsumlnzy{wrturtqstltthttjtturtxuwurtrnpvrthttjttmttlnozy{qrxwz~txyquv_dcntsw}|kmmxvvuuutyxhjjv|{y~}ussrttv{ztzxrzymxvqyyvtxzv{tmpumnuwzxxzxx{xzzv{yuz{xxwvwrt~x}rt|vxxmoonstw|v||{}}|~{z|~uuuvvvz||tyxv|{y~{~~rx{}x{wto|w{xsuqp||~{zx~wx|qqquuu}xy|}~~}{{}{{~~|zz~{}tqsxuwwtv~|{ywv}{z~||~||~||~||~||z{y~yzv}}uwww|z~x|~}~~}~}~|{~}~~zvu~~z||~qooqzwy}z}{}}wyyxzz~u~{{|v|{u{zpvurxvtzxmvsorpuvtvywv}zlwtdolktqmtqpvtw|zmtqnurqwtu|yv}zszwqxuu|yholszw{x|tzxovsovsovsmtqjpnnurnurovsrwumrppusotrotrnsqosrdigjomnsqpvtjrqhkkkkjunnvlninlhmkfkihmkdigipmmrpjmkfiglmkpqomqolpnknlmpnhljfnldljgpmirohqnhnklomomlpqo]b`dmjfhhfhheggfhhhjjpnmkmjorpdjhglj`gdlspjqnipmelibifjpnjqnholfmjfmjemlhnmflkhjjjllonmqqoijhehffjhnsqhkiotrw}|qvwipsputuzytxwmrqmrqgtrftrftrgusftrerpinmnsrnsrmrqkpostruvtsvtpuspwtqvuqvuqvurxvw|{v|zw|{w|{xzztttw|{xzzyyyzxx{yysuurttuwwuwwtyx}qvvy{|{q~uz}w|yv~tst|{zzz}}~~}{~vxxy{{|~~{}}{|}{{~||}{|~{}~~{yy~sss}~~~|{{|tuuxvy{~|~{r||uz{uxy|y~xts{z{}}}~}xpy}yz}~xzz{~z{smn{uv~xzyzyz{|{|~||ywwzxxwuu}{{wuuommsqqrmntoppklwrsojk~xyztu}uvynpzmowln~}idczyxsrsmlcfj^`aedd`]\a_^ea`kfclfaee_hjkafigdfifhkhjifhlikommljjmkkommommmlnmlnnmotsutsutqrphjunqlginkmnlnonplkmqprmlnvuwwrturtqstltthttjtttqszwysprpnptqsguthttlttost|~~~swxswxnsrx~}v|{giiywwzzzz||u{zkqptvvwuuvyyqvuv|{u|{ozxrzzuvzyx|zsvyqrsuzyxzxxyvxyuzzv{{wwvvwst~y{tv~y{{suuw|}v{~u{~}~~}rqszxx~uxxuvwtyxv{z|~}~w|}~z{yvqz|ytvqp~xz~y{|~}||{~}}}~~~}{{}{{~~|zzzwy~~wuu}|~|zy~||~||~||~||~||yzx|}{~~~~{}~~~|~~|{~~}~~|~~|zz|~}x~szwz||}uww~~~x|ztzzu{ztzyrxxu{zs|yz}{vwusvtszwmxuq|yfolovspusqwumvsnwtnwtqzwpyvw~{x|t{xqxuryvu|yszwpwtovsovsovsmtqmtqnurovsqxurwuinlpusotrotrotrptrdjhlqootrrwumrqjkkoijukm{npotrlqogljinlfljgnkjpnknly|zqrppqolnlkmkhkijmkjljiplhnkipmkqojqnjommpnpmmkljejhenkgiigiidffgiijllpqomnllpnfljfmjdkhlrpjrnlspjqngnkjrnipmlspipmipmhpolrqjpokmmlnnpnmvsrigfab`_b`dgeqrporpflkchibilinminmbgfchginmcpnbpnbpnbpnesqivttyxputputmrqnsrusrtvtsvtotrpusqvuqvuqvuqvuw|{w|{w|{uzytvvvvv~~~x||vxx{{{zxx|zztttvxxy{{suusuuput~wyzlnomvvjyxxz~inqqx{r~uvztu|zz~~uzy|~z||||~~|~}~zzzz{|}tvz~~}|yz~z~x|v{y}z~{tww{y}y}y}|~{v{|vyz{~xyx{}xwmyzwyxvv{|{|y{}}~|vwyst{|~xy{||vw}wxz{~yz}{{}}~~xvv~~zxxywwpnnxvv~~ojkzuv{vwnijsnoyzystzrstv{npuwlhgea`son|xwaeg^ab]^__`^``^hedidangcsrldfgbgigefifhifgpmonjlpnnjhhmkknllpnonmoqpsqptmlomlpljnpgjmfiqmosqsmilnmomlnkjlpoqpoqvrturtqstmttittkstuprzuwuprqlnvqshutittkttkopeijdgkfintxynstousx~}ntsoqq|zyrqqqwuwyyputjpoqttzxxqrrrwvqwvipos{zqyytuyyx|}wz~tvux|xy|wxzux{uy{v{xt}xtxytt~xzvyz{{z~}v{|y~w}~~}}{z{~||z~}x{{z|zsxyw~y}x}y}x}xupo|xwxrtvsuwvyyxz|||~~~~~}{{}zz~~~||}|yzzxx~}~|{}}}}}}~||~||~|~|~~|{||}x~x{~~}~}|~~}}}}~~}{{}~}r{xowstvvvxx{~v{yw|y|~|z}{rxwqxw{syysyxpyvuxwz|zuxvryvq|yjuraifx|w|zt{xqzwq{xr|yt}zr|ykspbkhmurnwtiroqxuovsmurqxvqxvqxvltqowtpwtrzwt|yqwuinlmqpmrpotrqusquschflpnhmkfjhlqpnnnrkmuln}prqvtkpndighmkhmkiolinljnlx{ykljrtrhmkgljgmknsqlqolpnknlimklomjnlkpkjlhqplhhdjqkgoldffhijfiigjjhkkmomknljnlinlemjfmjkrokrolrojpngnkkroipmkroholholhpojpphonlmnmooqnmvrqigfjihfhffjhnomjmkqvuflmelnkpojonkpoinmhmlanlaomaomcqoaomgtrotsmrqputruuqttvsrtussurotrpusqvuqvuqvuqvutyx|w|{x}|svvxyywxxw|{vxxz{{zyy{zz{{{suurttuvvvwwy}|z~uwxz{|uo~z}qvyv}s~tru~x{{}rwv~{~~~~~|{z}{{z{~tv~z~{z~~wz||}z~w}{~~z|~~xy{||zz{{~{x~}~t~{}{|uw{}{|z{~~}~~xyyz{|{|}yz}||}zz}{{wuuyxx}||xwwwuukhhystwqsvqrojk{|wqqtklynp|oqtvokjvrqwsrxtsokjZca\b`\a`Z\\^``ecbd`_mhhidfbbe_cdbd^hifhjgkljllltopjefqlnqloqjpljllnnknnnppmooikkfhh`aabdceggjllknmkmmikkmoonqppttprqsrrpqqyxxzwwxsuuprrmopkmnhjipphoojoplqrkpqgjkoqrsuvfhijlmwyzorsqstwwysuvoqruuurssvwwrqqtttqssrwvnuvjrsox|sy}rswwuy{xzzwx~yzxxx{zz|||wwvzyz|zz}xy~xy}yz|x~|{ww~}{~~u~x~}x|}|}zz~xuw|zz|zz}||}||zxx~|}~z|}yzu|{~||}{{}{zyww~||}~{yy}}{yzxx|xy}w{zwz}{}|y}|x~|}|{vzz~~x{~|{~|zy{yy~||}}}}~~{t{z}u}|y|~}}~~~~}}xwwvtt|{|~~yvu~|}}~{~|~}yx|~}~~v|{~v~t~|y~y~~{x}|w}|x~}y{|zy|{z~|vyxz|{{y|zw}xr|yq|yr}zp|yr|ynzwq{xpyuqyvnurqwtu{y{~qvttyww~{lwtn|xm|wm~zl}yl{Wjf[oj`tobwrj{wm}yn{jzvjzvjzvhwshwslzvq|l{wlurgolholinlmrpqqlpnj|xwuqsqlsrnjomkpmchflommqomrpjpngljinlejhimkhkijmkjmkcfdorpmpnjmkhkihkifigmnlnomlmknommnlknlijhmhglhgpomimkejhfkiajfclhdnkgmjdmjfqmgwrdsokmkonloqolnlknlinlmrpjomdmjfoldnkdjglqohmkhnkkpnqlkrmlljiinlfpmeolgrpamkWcabnlfrplrqhnmkpojkkrrrjusbpn`nlcqoesqfsqinlhkinpnrtqttrxpqwuuw}|jqpkrqkusjvtmywjvtgtrerot|{ryxryxqyxx~~msrz~v|xw~y|}lmkrpo{wpy~zzv}}x~s|{s~||x~}y~}}zyyzu|{}}~xwy~}|zysqp~}}~~z||}}z{|}|}}{{}~{|~uooxqryz~|}}|z}{~}x{z~x}{~yz}~}wx~y|{}~z|xuw~z|{||zz{|~~}~xy{||}~z{ywwyzxzz{ywwvzyuyxptsxzztttrrrnnnonnvuuwrsytusv|mrzlpqu|mqxmpsprwuvsrrkihxws]ed\baY_^\^^\^^gediedoijhcdhglimn^aZlmijkiiiiiiiqlmlghpkmoinlfkjikmoolnnhjjfhhceegiimoojllikkhjjlnnrttuwwmoonppnsroqqrrrzzz}{{toptrtwtvnlnpnptrtlpqimnjnnsvxnrs}vxzvxylnplnoy{|tvwvxy}suvrtuwwwzzzqqq|||wyylqpnstluugqtekprswuvzwvxxvv}wxyyyyyyzzzuuuxxx~||z{yz|wxtttotsput{r|zs{z{||zsyx~{z~xuw}}|zz|zz~|||zz}yvx{~y{yy~||{yywuuxvv{|zxx~y}xw{u~usrzxw~|{}{z|zz}{z}~}y~z~z~}y~}y~}~}|xvutrr{yy~~~~z}}~}~~x{yrus~~}~}~}y{}}{~~~{}}{}vvw}|u{zlrqpvutzytzyx~|z|}zy}|{yuyxx{yyz|zy{s|yr{xw}nwtqzwm{wp{xnyvqwtovsuzxy~|qvtotrnurlwtjxtjyuj{whyuizvaqmj{vhwtduphzvj{wo|hyuhyuhyul{wkzvhwsapljyuitqfoldkhjomnrprts}}ponuwuppolnlkpnkpnfkiejhdighnljommrpotrnsqlomhkihkijljknlbechkihkifigknlfighiglmkefdjkilljknlmnlkfeqlksqpqtrdig[`^`ifajgalidlidlj^ifZhd]lhhigljilmkkljknlgljjomgljcliclidolchflpngljkpnjomkffqlkiigdjh`kh^lhdqoerp`mkcpnanljrqkqpglkjklprrgsp`nlbomgtrhusjusx{ynomjhgronwsrvnosqqmsrgonpxwkvtivtlxvkxverpjwurzyowvt|{s{zqyxpvugmlw~{xzxz{~|qrppnmwsryvx|usx}~nst{zx}~zq|z~x~}{~~}w~|wxyx}~|}wxx{|~yz~~}~|stxrs}}~|}~~~xy}~~~~}~}|vzx{~{~x||y~y}}z{{|~xrsyst~{~{twwps|uxytv~~}tqs|zz}}}{{vx{|{||xx|vw~xyyz~xy{yyuzyuzyv{zoqqpppvvvvvvsqqxstxst}os~osswswptxmppmoxuwqooqonvuqX`_V\[TZY`bb]__b`_da]ojiideedfdihjkgpqmefdeeejikpklqlmrmopjnnhmpoqprrhjjceejlllnnkmmmoomoolnnjlljllqssuwwlnnmoomrqoqqttt~~~pnntoptqs|y{likolnzvxnrtgllgllx|~nst~|~suvqstxz{uwxqstoqrvxysuvvvvzzzqqq}}}{}}inmotunstjqtkqvtw{yz~xvxyvvzxxyyyzzz{{{uuuxxxyww{|{|~tttsxwsyxzvv~}v|zuzyz|}{z~}|~wuu~||zxx~||~||{xzyvx{~z{yy|zz|zz|wx{yy~txs{z~~}~|{~|zy|}|x||w|~}|vtsxvv~~~|}z{y{|z}}}|{~|~|{~}||}{|}vtsys~|tzs{z~~~|~~y~}y~~zu{zu{zx~}x~}y~tzyx||xz{zy}|{w}vzwx{yytxvpvqtzwryvz}t{xtzwm{wn|xnyvnxut{xy~|rwuv{yqvt~y}lwtesoixthyugxtkwsiuralikvsmyujxtfwsrhyuhyuhyuuzetpr}o~zlwtgrohqniqnnsqoursywotrqwtmrohnkmrpmrplqomrplqojomnsqdig`ecgljknliljiljhkilom`calomnqofiglnlfigjkimnlfgekljjljgjhuvttonsnmljidge`ec[`^bkhblhalicmjaliYgc]lhZiekljomlopnjkimpngljlqojomclicligroejhkpnkpninldigea`rmlhigcjg_jg]kggtrerpgtrerpbomkrqkqpekjglkqsshon`kifpnkvtkusmtsz{yrpornmvpotpounopoontsowvsyxmxvivtkxvjwugtrlywrzyowvt|{w~owv|rxw|xzxzy|zxxvvtt{zxts~{}wyzqvw|n~}puvkpqpuvtyzt||~x~}z~{|}|{zjsr|||}xy}}|tttvtrzy~}w{~~~~~~~yx|}z{ztu}~z{z{|z}~}x|swy}y|z{{|}z}}vywrt}}vsu}z|}}{yyzxx~~xz{st~xzzuvz{{|}xy{yyvzysxwx}|qqquuuiiirrrywwxstxstqurvqu|mqyjnodgqnpurtrppsqpwvrS[ZTZYTZYaccbdd`^\_\Xtongcbedfejimnjdecfffcbdfegjefnjjnikpjovpuihjmoodffeggkmmmoomooprrprrnpplnnlnnoqqoqqkmmmoojonjllpppxxxmkkrnopoq~~eegihjtsustuhjkfhinpq~qstvxyy{|tvwsuvtvwvxyvxyuwxzzzxxx|||tttvvvz}}jllswxnstjqtotyruyux|vyzwww|zzuuuzzzvvvzzz|zz|}yst~yztttrwvw}|o{yr}r{zuzyz{{~~{y{~z~{xzxvv{yyyww}}~~}z||{vwuu}{{~||}}~~tusxyw{z}}{yy}{{ywwrpp}|{yxtrq|zyywv~wuu}}zxx~~~~{||~~}~|}~|}}{yy|}{~|}|}~~|}|{}}~|}~}|~}~}}vyu~yv~~~|||}zz{u{zx~}zx~}v||w}|w|{tvwzy}|{w}x|zzywwuxvqwrsvty|zwzxl{wn|xlzvktqpyvtywotrx}{sxvsxvu|ylwt`njixtizvhxtqwttyw{qvssyvkwtfuqxm|xm|xm|xp{hwsbqmixthwrdnknwtkronurgpogqopzykusjsrelljominlpustywgljntrkpnnsqinlmrpdgecfdgjhhkidgeknlejhejhhmkhmkgljjljjkihignomijhgjhyzxqlkuposqpdge^calqofolenkbmjdrn\jf[ie]lh\kgkljomlnomlljpsqinlmrpjnlenkdmjjvrinlhmktywjom_dbb^]tqpikiemjamj^njp}{anlanlerplxvkvtemlgmlfkjpvthmlahgjpomtsnsrlqprporpoxsrzut{sssmnmmmu{zkqpputmxvivtjwuivtjwulxvt|{qyxqyxxowvw}|ionpwtw~yu|wy|z}~|xtsyvx~_kkdtssxykpqrwxjopnwvz{z~{}}|~~|~~{|~}}}z{x~ttrx}{|y}}xy{|~~|}{vu|}{|z~~wzx{{~~y||}}~}wx{~y|{vx~~y{~zxx|zz}{{}{{tv|tu|wxzuvz{xy~uw~{{wyyv{z{bddjjjttt{{{zzzvttwrswrs|nrrvptrvptqfiurtpmopnnomltso[cbX^]SYXdff^``dc_ifawroiedjjjfkjtusfgdjila`bedilghmhipkmmglqkpnmojllkmmoqqoqqprrqssvxxoqqsuusuumoonppoqqnppoqqV[Ztvvrrrtttvtttrrlkmusvonppoqutvoqrgij{}~oqrrtuy{|vxysuvrtutvwoqroqrtvwnpqtvwxxxwww}}}}}}z||y|}w{|ty|tx}qvyrtx{}~z||}}}||||||{{{zzzyyyusstnpwqr}~tttv{zqxwerpm{yq}{w}|uop{vxz{~{}kii}{{zxx}}~{}}y{~y}}|zz|zztusxyw~||{yxxvv~~}}~|{~|{~|{xvv~~}}~||~{{~~z{z||{~}|yzx~~||rppyzx~~|}~~~}}{~ytttvvv~|zxu~w}|tzyu{zx~}v|zv|{v{zwyzzz~zz~x~{{|xvvrustzuwzxz}{y{yx|z|}n}ykzvlzvisqmxuu{xlqopusrwurwuv}zozwm{wm|xizvhyuvxvtusrtruvttvtoyvjxtn|xlzvm{wn|xn|xgvrbqmcrnkzvaokWeanyvZc`lspkvtftqfsqftrjwulwulqotywnsqjompusnsqmrpkpnjommrp^a_becehfiljgjhfjhdkhelicjgholgnkkljmnlmnllmkpqompnrsqxsrlgfxvunqodigkpnclibkh^jf\mi^mi^mibqmcrnjkinlknomlmktwulqohmkinldmjlurmxulqoqvtbgekpnotrnlkqonjmkenkaplapl^ki`mkerpcpngtritreqodlkhnmlqplooimlhjjnqqlnnpqqvwuywvspowrrvqpqmnnoosyxntsuwwpzxjwuivtjwuivtkxvt|{t|{qyxv~}s{zsyxzw~{w~yw~yz}{~xvu~|xwsprxz{x}~o{{qrwxqvw{zsxyqwvtyxy~|~~vyy|~~z{{~~z~~~{|ww}xy}{{|}z{|}~|~|wv~}{|{|~|}~z|{~~xyslo{~y|z}}}uxvor{~~}}~||}{{|zz|zzwy~~vwzuvtopyzz|uwz{wyytyx|~~nnnzzztttxxxwuuzuv~yz{mq}nruytxpt}rupmoolnommigfqplMUTZ`_Y_^fhhceejjdifajebpnikljchgrrrnnnutvhgllkozuvvqrtoqtnsrlpkjlkmmmootvvoqqlnntvvlnnprrnppprrnppjlllnnlnnqss^cb|~~vvvwwwwuuusspssoqroqrorrqttqprkjl|z}yxzrqsvxyxz{{}~suvvxyqstsuvprttvwprttvwxxxyyyvvvkkknnn|||xwwjlmuyzlqtlpumruotwuyz|}}|{{|||||||||{{{{|{uv|wxtttv{zv~cqoo}{p}{v}|~|}}}w||{yyyww|zz~~{yyxuw|y{}y{w}}x~~zxx~~}}~||{|~||xyw{|zuytnrm~{}}~{}~uss~||~||ywv|zz~~~~~||~}~zzxy{z~}~pqostr~|}~{uxv~|zy|zy}{~~~~}}}zzzzzz~|ws~|w}|v|{v|{v|zrxwv|{}zy}yx|v|w{xy|zzvywv|wz~|pvsu|ytzwj{wl{wn~zuq|yt{xotrqvtuzxpust{xnzvlzvm|xj{wizvwxvstrrsqtvttvtjspiwsm|wl{vm{wn|xm|xm|xl{whws\kggvr[iejxt]fcirojtthtthttiuuhtugspgljafdhnllqolqonsqnsqlqojpninllomlomknlfigfigfljelifmjipmcjgmtqstropnmnllmkkljcfdghfupoqlkvtsnqokpnejhbkhclibmjZoj\mj\mj`okaokuvtsqpkljnnliljkpnmrpinlfolbkhaliinlnsq]b`\a_kpnollppnjnlgqnbpl`plfsqivtbombomerpfsqhsqbmkhnmlrqppplllllkqqqsrrsttmqokmklmkppntqpsrrloopvunsruuuqyxjwuivtjwuivtkxvrzynvuv~}owvrzzsyxqwvt{xv~xw~y{~|zxw{yx}|~~vxynsto{{qw|}glmuz{w|}{syx}{}}}}}{{{|||~wxx}{}z|qssy~x~~{~||~~xvv~~|}~zyzz~~{}|~|~|~|}y|}~|}~~wzyruz}|ux|ux}vy{tw~~||~~}{{}{{{}}~xyvqr|}xyxlnrtvx~xzyxxrwvy~}tvvuuu|||xxxnnnwuuwrsrmnrvptptvzswtwroqurtpnnjhgqplU]\X^]bhgikkceekkeec[jfaolhghf_db___fffonr^]akiopklqlmqlnlfkrlpmlnnppqssrttrttrttmoofhhdfffhhoqqmookmmlnnlnnwyyglktvvttttttqooqooprsqstsuvsuvqstrprnmovtvsrttsuvxytvwtvvz|}lnotvwrtvsuvsuvuwx{{{vvvxxxwwwxxxzxxwxxorrz|}nqurv{nvxsx{z~rxv{}}|||xxx|||}}}vvvnllvqr{uvwrsrrrtzyvp~|qs~w~|~shjwz~w||v{}wuu{yyyww|zzvtturt|y{xtzzv|{v|zz~~}}|zz~yz}{{|}{{|z|{~}~|}}z|zwyroqa__~~}}wuutrq}|~~}}}}~~}y{wy{z~}}|rsq}}~~xywy|z||}~~~|zy|||yyy|~~z~|{wzz~{y~{zxz{xw{zy}v|uyxy|zzz}{v|wt~zpyvluroxunwtj{wk|xp{r|p~zt{xtywpusqvtqvtovsnyvjxtixtfwsevruvtrsqrsqttrttr{ozwpzxozwlzvdsokzvdsop{tr}kzvaok_jgktpjttnxwkuujtthrrfnnotrkpnchfkpnjomjommrpgljinlhmknqojmkfiggjhgjhhljdnkdmjenkdmjbkhwxvqrpqrppqonomiljdecpkjnihljidgeotrfkidmjcli`khYpj\pj[pj_njm{wppnrpopqoopnfigjnlkpnlqojspenkali\a_otrjomfkichfnpnopnkpnfqnbqm_pl^kibom`mkbomanldqojwubmkfnmlrqtssplmrlntpqwrsrrrltqousnrqpsqtvtxxxkpoionpttvuuqyxjwuivtjwuivtkxvv~}v~}w~pxwrzyu{zqwvw~{v}xx~zzxw}{z{z}yx}y~jvvn~}w|}{}v{|qvwsxwx|{z||ttt|||~|{}~~x{t|~}{~~~wuu{yy~~~~||}~}~{|}||{yz{|~||{yytrr}|~~{}~y{{wst{|}~{||wpsy|{~{~{ruwz}twy|}}}}ywwywwxzxyxyz{vxrty{~wxxxxrwvnsroqqyyy|||yyykkkwuuxstwrs~pt{lpximqu~os|qtpnpwtvpnnnlkpokY`_\ba_dcdffXZZde_mlefc^jgdghfcgfhhhgfhsrvnmqfdjjfgjfhkgie_dpkpkjlkmmnpptvvsuurttloohjjZ\]bedghiikkqtsnppnpo}~~lpoz||tttxwwpoorqqquvhlmsxyswxlqrrqsqprqoqqpqwvxvwxnoquvw}~ghiqstsvwstvvuwvwxyyy|}}wwwxxx}}}~|{{xxxwy{~~jmqpsxsy}sy{w{|vzyy{{|||{yz}}}}||~||}~yz}wxvwwv|{q{zyp}r|u|{y{z|z}~w|z~}z|zxxzxxzxx~||zxxyvy~z~rnt{w~xr|}zz~~{xy~{|{xxz{|z{~~|z|z{yuxu|~~y~z|y~zvz}yyuyzu{~~~~omk|}}}}~~~}{xw}~|x{y}}{y}~}~|}}y~}}|z}}|zz{w}{}|xwyz{{yzz}{tzupzwq|yv~ozws~{l{k|xm|xlzvkyut{xv|zpusputz}qwumwujxtkxtgxsgwsptrosrswuptrptrgpmnxvlvsp{xpzwm{wcrnp{dsojyun}ywn}y_lhepmjvskuuoy{kuwkuwkuwkttmrqlqpbgegljjomlqootrgljY^\jomgjhgjhhkilnljljimkfoldmjfolenkfolgigfgelmknommomjmkjkirmlqlknnlorpnsqousckhbmjcokYpkZpk]pkZjeWd`gigonmnpnprppsqhmkgljjpmgpmiroepmdigfli]caciggmkpqonomkpndpm_ok\lheqpZgeanldqoanldqplzxamkfpnisqxvwqmmsopurrvprlllispkurqxuntqqvtxwwoutsyxrwvxwwqyxjwuivtjwuivtkxvu||qzyt|{wqxxrxwtzyw~{u|vxz{~|vxv|{z|{y~|xx~{}qtuv}}p||p~w~~w{|sxytyzv{|tzy}~||||||~~~||}|}|~~~}|~vtt~||}~~~~}|~zvxz|{~~x{}|||}~yz|}y|slo|ux{~x{~wz{~vy||~~zwwzwwyz~vx|}~yz}yz}~vxwzz}}uwxxxswwqvupqryxxzyywwwpoovttwrszuv}ptzkowhl~or}nq}qtokmroqrnoomlpnjZ]\\___``]___aaeghijkfdfjghnjkfcehgkgfj`_cutxgfjcmnbjm_eiilpimpnoololmsqpuvquyrvxnosopstswwuxupujikrqswuwvrtvrtxrs|vxxvvtvvmsrhpoittakjowwnstpvwuuuqnnvqs}tzsyxpt{uxysuysu~xztvwntu}uxqv{ruxuw~z}yvx}y|rqswvxyxzxwyvtvxyzvwwvww{{}wuy|zuuvv{{|{|yy~~y{{z||x{{wzzx||ruty||xuuyuw|y{}vtt}{{ywwwuuvsuyv~}{liswsyvuyy~wzxuzy{wvxvuyzxwzxwzxzuw{uwrknomoz}~~~~~~~mkk~}~xy~~wx~~~|||~|||}~~~~~}|}|{|x|~z~}}}|~~y~}y~{~w}zy~|}~|x||z}}~{~~vuu~{}}}z|||}|uvuvxvx{yuzxovsv~|v~s~{q{q{p~zo}yjxtlzvr|{s{zouutyzx{~{|xz|svvtwutxvotohnppvxpvxnsvouwlxviwsixto}ygvrcqmhws\kgdrnfuqjyuu|yw~{rzwpwtnvskzwjzwkzwk{xn~{aojntomsnmrphmllqpfkinsqjom^dbv{ydigfigupotmmda`knlbmjbmjdolbmjhtphmkeigejhimkinlkmkffdiihzyxkljnnlrusdli`njXkgWnicoldok^hegljiolaheIROdkhfkicfdtxvdli`ifgpmbkhcli[eb_ifs~{gqnfqnjnlmpnkpnkro`jgdnkbpln|xdrmcqmcql^pm]olapnaomcqobjhnrqopprttsrrmnnkqnpvsotrotrotrhjjwyyqvuqwvpwvmxvivtjwufsqhushusp}yo}ykxtn|xkxtkttmuts{zv|uyz~rxwv|{{x~}y||z{}swxt||q||p||s}}zgootxyw{||~~z}{x{y~|}z||prr|~~{}}}~~|~}{~|}}~|~~|||}}~~z{|}{|~wy~|~|y{{}~~~tw~}yvx~z|}~w~ts}{~z}}yz|~|}~xy{|z{yz}~~z{{uuuzzz|||tsswwwyywzzx}|z}|z{{ymnl~xtp~xvwt|{||{uvz{{vwytuwquvpuxrwytyztztntumqvorwqrwsrtolY[[dffegg^``]__WYZ]^_ljmdceojlheghhlhfjcbfqpthfjatum~hvxbnpcloglkkonjnopwwqx{ntvijnklpvuyyuzuotkjllkmnkmwrtxsuyst}wxxvvsuupvuovukuueoomrsrxyvz{tttnllupr|rx|rxzrw{twwpsxqtvornhkrturwx}twuz~svspr|y{}z|urtyvxrqsutvutvvuwutvqprwwwwwwzy{|{wu{}qqzz}ss}|z{|wx~}}|zz}}}vxxwvvwvvzzzuuu{zzwuuwuuvsu~zwtvqoo|zz~||}}zwxyx}mjryu|uxuzvwxv~yxzvuyxvvtsxxvz|zz|}|~swx~~}{z{yxpnmxwsyzqzyyyyy{{{zzz|~~~~~}~}~}|}}}~~~~}}z~x~}~~}y{{z|||~~~~yyy~}xv|jom||~}v{y|~vtt}~|~~~}y{{uxvqtrqtr|~{~|z}|t}zwv~q{p~zn|xm{wjxtjxtnywkwupuvmrsvx|y|vxyvxyvxxwzxtxrgqqnxxq|{lvvmwwkxvkyufuqlzvftpdrnhws^mijzvjyujyumtq{rzvryvmtqfupjyujyun}yl{wguopvqlrmtywsxwz~digjomhmkfkijomgljdgepkjvmmrnmhkialicnk`khbmjlwthmkdighljhmkmrpxywyzxnomrsqmnlopnnqodli]kg`toXojitq_he^gddiginl[b_gqn_gd`ecUXV^caZdaktqcmj`ift}zozwkvsalicnlcnljpnnqolqofmjajgcnkftpjxt]kgcqmjxt\ol`sp\mjaomaomnvunsroqqrttvvvtvvqvtrwurwulrppustvvvxxy~}tzyrzymxvivtjwugtrftrgusn|xr|n|xftpo}yt||qyxr{xt~wx~}msrx~}v|{zuzyxz|vz{t||r||p||r||}fnntxyvz|twux|z~|}z||tvv}|~~~~}~~yx|}~||~}~~z{~~}~wy{~|~~{}|z|}z|~|~v~~|m}|}|~wzwrtztvzz{|yzyz}~{{{{{{|||||||||uuupppzzz{{{xxxyzxz{y{|zvxvrsqnomvqn~wt~xt{x}xyytu}xyxstytu|vz|v{wqvpjosmrjdipilslonijzutqli\^^_aa_aaY[[fhh[_`QUVnpqcbdjhjlhjjhlhgkgfjmlphgkexyNabVgi_moivxfkkcjhovvntxlvzntyefjfgktswxtyuotkjlutv~toquprxrsxrtwuusuurxwtzymuujrrntuuyzxz{rrrqoosnpxrvzsxxqvzuvvqslgiwrtvrtuyzowwzruuyzrtroqroqsprroqtqsyxznmovuwwvxvuwrqswwwwwwxwy{z~mkqxllxx~uu{zzyyzicd}wypnnrrr|||~}}}}}xxxuuuzzzxvu|zzvtv{w|{xzzxxywwpnnmkkqqrooqtswvtyuv~sw~rrvt~vv{vu|xvywvwxvxywytvx{y|vvx|~~~||~~~}}{z}{z~~xwwq|~~x{{{zzzttt~~~~~|}}~}~uqp~|||~}}{~}z~z~}}wyyz||~vyw~y~}uzxsxvv{ywuu}y{{y{{y|zwzxuxvvywy~|mtqs|ynyvfqnguqn|xm{wm{wo}yq{u~xkssvz|svznqvvw{vxyvxxwzxvywlxxjvwlxxlxxkwwmxvozwdolitqhrphtpiws_miq{n|xhvrovs|ovsovsovsoyvo}yn|xs}guqfrltzuiojfkiafeejiejhjomjomgljdiggnkmpnnjiokjjgfgjhclhfnlfolfnkdmjhmkfkijnlhmkhmkcdbbcanomijhmnlkljknlgnk\he[miOe_hsp[da_hediginl]dabhfglj`fdbfdx{yv}zjqnfliT[X^eb]fcjroenkemjemjjpnjmkafdeliblhcnkesoftpdrnftpguq^qn[nkbspaomaomdlkfkjnppsuutttoqqchfinlnsqkpnsxvikkinmsyxqyxmxvkvtlwukvtgrphrpr|zpzwq|yepmq{x|muujrrltrr{xx~}out{u{z~y~}xz{x|}t||r||p||pzz}goouyzvz{|}x{y~y|zxzzvxx{}}z||}y|zz~||~~}||{|||~{}uw~}}}|~~{}y{|szzxl|{~~|~sno{|z|z{{|}}}xxx|||}~~zzzqqqwww}}}xxxwxv{|zz{yqrpmnlnomvto|wtxuxt}xysnovqrzuvytuy~y~ysxy~{uzpjoulovy|tuxppqjgbdd`bbgii`bbY[[cgh^bciklcefebdnkmjimihlhhlihlihlr{}gprirt]dgjqtglmglmnuxblnamqmvztuypqunmquqvvpunmokjlpmopkmrlntnptnotrroqqntsntsmrsmrsqtumopnmotrrwuumjlvpuytytotvtvvsuvsvxtvsqsvz{pxx{twptzqtsprroqzwyxuwyvxutvutvutvsrtpoqutvttttttpoqwvzsqw~uu~ttxxzutyutyst|xysppusstsssnoroozuvxtu}xytpo|{xstz|{zxy~~omm{yysqp|~|qrpqqqsstsyw|ux|pprff}uuzvt|xwyvu|yx}~|{vx}vy{tw}}}zxx|zz}{{}{z~}~|{wutxvt|{{u{{{{yyyzzzooo}~}~}~~{yx~~~{}}z}~~|||zzxxx|||}|x}{|}{{yx{x}|~~~~xzzz||{~|{~|wzxtwuuzx|t}zq|y{vm{wlzvkyuq{n|xivto|zqyys{{v|vy~vx{vv{tvwvxxuxviwugvtlzxm{ykywmxup{x_jgepmepmjurixt^lh^micqmjxtv}zkroqxumtqxozwp{xt|p{xqztqwrlrmjomfkjjonchfgljhmkkpnejhlspeigolknjiljifigbkhfolblifolhqngljgljkpnhmkkpnxywnomopnhigrsqkljfkinur_jgXie[lhjurbkhirogljhmklspipmnsqoqo]_\dgecjgahebjf^ebv}zfolfolclifoleoljomnqokpngnkenkbmjguqhvriwsguqftp]pm^qn^plaom_mkemljonqssrttkkk`bbkpnnsqqvtpusmrpjlly{{uzyoutnvumxvkvtkwulwuepnepnu~xgsplwt|krugoniqpr{xv|{pvuw}|ntsw}|z~z|}w{|t||r||p||q{{{kssuyzuyzxzzx{yuxv|}~{}}|~~~}|~}y}~zz}~~yz}~}~~~||~}~}~wy~su~{}|~}xz}|~{|}jopsz}}yxzz{~|}}~~}~{yy}}~~uuu~~~}}}|||vwu|}{z{yuvtuvtstrzyuzws|wt~zw|ure`a|wxsno~yzzuvxrwtnsuot|v{xrwxqvxor}twtlmskkslj_aaVXX^``]__^```efafg_cdlnojiklkmnmqhgkjimlkohgklekkdiohmtpunjngjkv||qwzrx}dls_djcdhstxmlpplqsmrjikjhjmjltoqojlrlmtnopnnnppbhghnmkopmoprpromonkmussywwqnpplqmlpklonpqnnpkmnefgxxzv{|kuuysvqutnqurtxuwyvxurtroqtsutsuqprrqsvuwzy{vvvvvvwvxxw{usyyy~vvxsryutxsrtmnqijqklwrszyyzwwyz|}~xyz{|vwtnk}xw~yxzrvx{yvvxvv}{{}}{yx}w|~xqrm~x{z}xz}qq{oowwyqqupowsr|{z~}~y{{tw|x|}zxxzxx}}}}|zz~}|zyzxw~|{}|~}}{}~}y{{{zzz~~~ppp~~~}~|~|~~~|{~}~~{yyqssw|{z~}xwzvux}|y~}w|ztyw{}}~z||{}}vywtwu{~|wzxwzxv{yu|ynwt_jgfqncqmn|xp~ziws_miguqn{yn{ynxxmwwuz}vzww}tuywyzuwwsuujwuo{zr}nzxmzxlvspyvr{xmvspyvjtq[fchspdolgrojurryvt{xqxumtqpwtu~{r{xu~{oxus|yltontnlrm`ecbgfinm`fd]b`hmkmrpafdnurdigpnmuqpnmljmkelhholfmjipmcjfgljhmkinlinlinllmkijhlljkljjkilnlinl\c`bliaokesoepmenkclidiglqofkiafdorpknlpnmlmkfkilqpotrbgechfholelhdkhelignkhljlommrpmtqclibmjlzvo}y^lhftpdrnYliZmj^olaomaomhpofkjprrqsstttvxx}rwuv{yjomotry{{uwww|{v|{nvuowvnvus{zu}|jrqqyxlurfoljrolurr{xu{ry|fmppxxqyxrxwqwvpvumsr{~x|}t||r||p||nxxrzzjrruyzw{|vxxpsqvxvz}{}|~}zv}|x~z{}zz|}|||~xvvwx}~z{z|~{}}z|z|{}wz|~vyslo}vyy|y|}ostymzy~~|~}}~xrs{|{||}}wx~}}|zzzxx~~~{{{{{{wwwyzx|}{|}{uvtyzxuvtxwsyxtzwszurwspvqr{vw~yz|wxwrstnstntqkpwqvztyyrwtilvytikzppwnkTVVRTT]__fhh]__NSTW\]^bc^bcacdfeghgkihljimjimjimvelxhovgmoagi_epmrrtxnpvgkomryeiq`aeoptjimplqtnslkmedfc`buprojlpjkpjknllkmmekjfkjmoponppmormotoq|wx~||nlnttxnosnptswxkopimnostkoplttcoowrt{lpwrttrtxuwroqpmourtkjlonpvuwpoqtsuwvxsssttthgiqptusyyqqytsyts{wvxwv|tuwppnhi|}~yz~xy|tuxpqvno~xyzx|xyts|vw}wx{vwtrrusszxxxvu~x{rsopqltusyyzzxxttuuvvzz{zzyvqpvrq|~{~~|{}y}~|zz{yy}}ywwzxw~|{~|~|{zxwzxw~~~vvv~~~~|~}}}|~|{|z{yyx}|~|zz~|{{{zy|{|~}|pus~~~~x{yvywy|zz}{x|zsxvqxut}zywr|p~zo}yp~zo}ym{wkywlzxo{{oxxpwzy}vw|uu{vw|uwxtvukurznxuu}zpzwoxuqzwqzwyt~{s|y}nyvhsphtphsplspqxunurpwtkroy}qxuu|xpwtrzvipkjpklrmdigfkjinm^cahmknsqafd[`^dliekimmkqonopniljfkifkihmkimlchfgljhmkinldigejhjkimnlkljjkikljlompusnurfolcnkitqlwtgpmdmjbgensqjomejhlomijhmkjlljgjhnqolnliljjljimlfkidhgfkijnmjmkpsq`ecqxucliali]kgesojxtbpldrnXjh\ol_pmaomaomfnmuzytvvuwwrrroqqafdjomqvtrwunsqtvvrttnsrsyxltsmvtqyxw~xksrrzyt}zxv|yoyvmszjqtowwqyyu{zv|{tzyntsw}|uzy|~swxt||r||p||oyypxxjrruyzw{|y|zx{y{~|{yx~~}~|~yx|{|{~w|z|}|wx~~||~~}~|zz~~|}|}zzyy~~||~|~~{}||~~{}|sv~yru}vyyru}yx|xz}yz|~z|wy{|~xy{|z{}}}xxx}}}uuukkkwxvyzxxywuvtzzxvvtvwsxyuyvryvr{vsupqxstwrstopupqvpuwqvtnssmrztyzsx}ruvknvkm|rrypmbdd]__bddWYYVXX^cd]eechi`defhigjkposUTXjimjimjimyjq|mswlru{|uzkfkqospmsomvkkunpxjkoghllkouqvxrwjjlihjnkmuprrlnnhixrspnnmoorxwputonpqnpsmormovorytuusswvxxy}orvptxsxymrsqvwrxykop]eelxxhdfvhltoqtrtxuwroqtqszwysrtutv}|~tsuxwyzy{vvvuuu{z|zy}sqw{ss~yx~zyywvzwv~vwtv|tuztu~{uv}|~|qsuw|w|ur{xyz{stxst}}zxx}{{rpp}{zz|vz}vtuqyzxuuuvtxvvw|ppxll|rr||zyxtt{wv~}}{z|y}~~||uss{yyussywv~~}~}}|zxw~|||{{{|~{~|~}}}{|z~~~~rsqzzz~z{}}}qoo~||}|~~}~}|{~}|~z}}x}{{~}~wzx{~|{~|{~|z}{sxvt{xu~{mxubmjq{lzvjxto}yn|xp~zp~|lzxnzzmzzqwzw{vu~vv{vvzuvztvxqwuv{yu{xw|zrxvpvspwtnurpvsy}owtjroktqmvslurltrntru|ykrou|ykrow|zmrpkpnnsqsxvkqlhnilrlrvtbgfkpo`ecinlSXVhmkv{ybkhipmmnlpnmfhflqofkihmkfkifljchfgljhmkinlejhdigkljnomlmkfgeijhknlkpnahekroclimvskvsfolhqnbgensqfhffiglmkjljplkomllommpniljjmkknlhmkfki`ecjnljomnqoorprvtqxu_he_jg\jfbpl`nj]kgcqmVhf`sp_pmaomaomemljonoqqsuuooojllqvtpusrwurwusuusuuuzypvuiqpntstzy{u{zoutv{zt{xw~{}u|ynt{rx}qw|ovyqyyu{zw}|u{zmsriony~}y{|ostt||r||p||q{{nvvkssuyzw{|wyysvtqtrwzx~~{||z}|~~}|~sxv}xy~|wx~uuu~~~}}~||~||}}|}{}xz|~~}|~{|z|~|roq{xz|~~ux|{~{~vyz}~|~{tyxzy{|x|~|~z|{~wy~qsz{~{|{|~yz}}}xxxoooxxxwxvyzxwxvvwuz|zvxvxyuz{wwvryvrxuqupq{vw~yzqlmpklvpuwqvuotsmrsmrtmrrvvhlwjlwkkma_^aa\___bbY[\knnnttbkkmsseijilmfijkjohgkkhmhgklkoulqsjpuotqmsllqqkq}w|tlvmirkfqljtlmrhinmlpwrxtotjikmlnurtrlnsnpunpsmmtppnppsxwinmpnpqnpuprtmpwnq{vwwuuqqrqtvjosqvxnstpvvmrs{lqrryzlwwwsvsgk|x{urtxuwxuwvtvwtvzxzsrttsurqswvxyxzvvvrsrmlnrqusrw|xv|{|z|yxz{y|}~tvwx}uv|}~xywxyoqvlm|rt~tvxrn{tquom}vv~wx}~~|||{z{xxzvw}zy{{ywwtvvu||||}}wsvuut}rqynn}|~uuwpo|vu|xw{xx~z}y|~|~w{|{yy}||xvv~|{|{y}~}~~~{{}|~}}||{zyy|}|}{}z|z|{|~~}}}vvv~~~~~~}~wv}~}~}}~}~orqy{zz}{z}|~v{xv|zv|q{xhspo|yjwtkxulzvn{wq}zo}{kywq}}myyp{}ry~tu~vu}uvzuwyvwytxry}xvztw{uswrrxuryvovsovru|yqxuktplurlurmvsnwtpvtv}zfmjmtqourjnlosqqtrprpwzxsvriojkqlfljafeoutgljotrotrdjhholfpmjromomnmkiljkpnfkipusafddigfljgljhmkinlkpnqvtmonjlklomfigjmkptrltpgmjous\b_]da]he^gdgpmbgensqjljjmkjjhlkjmihjigbeckomjnlfjhhkiimkfki_camrpjnlknliljhljhpmpxvaliaok`njbolkwsjwsTfcbtq_pm`om`omemlglkprrsuusssqssmrpnsqpusmrptywmpoy{{otsszylvtpvuouugmlqwvx~}{u|yx||v}zszrxov{nvypyyu{zx~}v|{~uzyx~|xz{Y]^u{|r||q||q{{lsslttuyzw{||~~~~{~|~~~~}wywu|vt~wz}~~|~|}~}}~{|{z{|tuu~~{|}~{zz~}~~|~~~}}~|}|}~twvywz|yt}}~}|~vxzuyzxz{~~y|~ilux~yz~~xyyzyyzyyyvvvzyyvwwzzy{{yxxwwwu||zwyvx{vz{wvuqzws{xtxtu|wxyvvlghqmmtnrvptuostnrrkqw|{mqvhl}prssymlWehQ\`ZehQZ]`hlfsuboqcpr[hj[hj_jmeijpoqnijjfhjikbdfkijgbdnlmjlmdchfciiekminngotmslkmlkmnmorqrqpronpqprolnnikrmoxnrulpvqrnnnqvtotrorsnnpupryps}ptzwz|zzvtrsrrustpstuyzvyztwxmmonnpnpuopukjqjhnpovtsurrt}z|rmo{vx{|vsswttxvvtttzzz}yvxlik{xzwtux||mqp{||wwx~~}xy{uv~{{|{{xxwzyy|}||zwxyvvxuu{xx}}zvw|zz|zzz{yzxxxzz|}{}vxyswywx}~{tu||}}||}}zvw|zz|zz}}}{|zstuzy}~~}~~|~~}~z||{||y||wz|{{{{z|yzz{z{{|}|~{z~|z~|z|{}|~}|yyy{|{|||||wyw|{{|}}~~|{}}z|zt{xz~~}|||vwz}|~qrutvxwx{z|}w~{vp}{jtsvy|wx{tvxsvvjpmowttzytzys||iuwdrviwzsx|tvzvuvvvvuzyvywuxvvxwvywvywrwurwuryvnwtr|yoxuqtrpwtnwtitqhtquusoqoimkmurktqjspmurrxuqvtwzxqtrknllomknlgjhtwupxtsxvY^\cli_qlbplenkknlpusaifbkhejhlqodhfgljinlfmjipmipmmtqnurijmcgkcnr`npeptdnoipmjljonmiigdigbjgahelspdkhaiejomdjh]a_gkiejhcjgnxudnkakh`khalhplkqmljgftppvrrronknleok\ieepmgro_njeolqvs~xtshtqernbqm`qm\qlktqmrplqolqoosqptruxvsvtuxvtwuvywVa\p}yp}zhwvjyxiwumxuozvlurw|w~{uzx|~x}{y~|{~o}mz~n}hvxm{}outuyxy{{wzzxzz{||{}~vyzw|}tz{qyypzzpzznxxpyyr|{w|{~}~}{~x}{~wxv}yw~~zxz}~|~z|{}~~~}{~~}~}}~~z}~{~}z}~z~y||~~|}|{y||y}z~z}}xx~~xy|}yzyz|yx|xw~{z~}}zxy{~xzz}|vx|~z{|zv~|xyvqwtpyvryyyssrxxxonnqrr{sr~rq{mozln~lplplnps~jmptknQ]aQ]a]hl\ei`ejbmo_km]ik]ikXdf^ilimnhgikfhlgilkmrvw}jegkhjiklpntmkqfbhhdjrkrqkphgidcehginmoonponpnlnsprhceupryouxorwrsssspusotrnstprsytvzqt|nr|x}pnn_^Zhferoqprsrwxwyztvwnpqpoqoourrxssyoouoouwvxwvx|y{pkmxsu{uvzuvxvvwuuvvvvvv|y{yvx}nkmyvxv|{jon{{{{{{~~yz}{{}{{|||usszxxwuusqq|zzzxx~~}{{zxxiggzxxzxx|wx~xywx}~zqtz}xz{y}~~ztu}~~||~||{yy}}}}{{{uuu{yy{uvtzyy~}xxx~}|~~{}}z||wzzqty{|}y~xz{~yz||zuv||}|~|{}{z}{z~}}|~}|w|z}~yz~yz|zy~}}|~}|~~~~vywx|~|~~{}}}~~w}|rzyywux{{|pqurswrsw|s{xt~kywhsspuwtswvtvtvvjomnvrv|ztzyr||vvtnvynqutsvsttrwutxvtxvtxvvywvywuzxt{xq{xnxvp{xnyvpusqyvmwtitqguqvts{|zz~|oxukwtiurlurpwtovrqvtqtrsvtpsqnqojmkpsqnurotrpuslur[ojaokhqnmpninlbkhclifkijomgljinlmrpjqneliipmkronurpquimrcnr`ordptcprkrolomhfeefdrwujnmnrplqpgki]b`psqknladbiljhkifjijvsdoldol`kh`khnlkomljhgqposqpjhglpnhqn_mihqnoyvesoisprvt{{yyutltqhpmlxujxtdvqltpprpprpmomnpnoqorusqtrknlpsqy|z[gaiwsp}{eutiyxr}{hrnnwtq|yu}v}z}x~|x}{x}{x}{o}|l{yn|zm{yo}|outtvvsuuuwwwyy{}}{}~vxyw|}uz{qyyoyymxxlvvq{{r||~~y{{|~~~|{~{~}}~{|zrsqopn~~~z~~}}|~|}|~{}su|v{}y}|~}z~}}}~~~|}}~~uy{ruy|}}~|{~|~{~|z}|}z|~}}}}}~zy}yz~zvyy}vy{|zxxxy|vw~xy~z{z{~zzzvuzvu}yx~zyx{|ux{tw|uxy|~xy~zy|xxwsr}yx}xx}}}ttttttxxxjjjwpn|pn{lnxjk}mootwfi}npxgjqs|lnequ[eiMX\W]b^di]ehclodlo_hk]eh_gjkopkjlidfmhjlkmptu|~facifhgijxv|{ywsykgmyryrlqfegbacjikpprqprqprjikwtvjegwrtyouzqtupqooootrjpmqvwqtuyuw{ru|nrokputpgedsprrstpstsuvprsqstoqrqqwssywv|oouoouvuwwvxwtvytvsnpwqrzuvusswuuuuutttxuwxtvjgiyvxtzy}moouuusssvprvqrvtt}{{}}}caazxxwuu~||yww|zz}}zxx|zzwuuvvvxvvzuvytuwqr~vwypsz}}z|suv|zrs}wx|}|zzwuu|zz}{{xxxuuuzxx}~zzrxwrwv{{{}|~~z||z||y{{xzz}xz~wzx{~yzy{|~upq|}~|{~||ywvzxw~}}||}zw|{tyw}|~}|~|z||~|{svt|w}v|z~~|~|~~{}}}~~}}}ntsltspxwyuz}||stxtuy{|y}~pzvhxtj{xzsz}vrwutvtvvkpnnsqv~ztzyq{{iuugvxsox|ptwtsutvvw}|txvtxvtxvvywvywu{xr{xq{xn{xm|xl{vmurnxulwtguqguqwutwywtywoxulvtivrjurjspjspmtqmrppsqnpnorptwuknlovsotrmrpiro]qlbplenknqoz}folfolgkjgljhmkinlqusjqneliipmmtqnurnosjnscos`or^nqanpjqnknlhfeghfpusqsqwxvoqojlj\^\oqojnlbfdjnliljfkikspgpmhqnenkdliomlollnkjpmlsppkmkmrpgqnaokmwtksphqocmjafdqsqaa_lqoinlrzwktqepmhnlknlknllommpnnqoorpqtrpsqorpqtriuom{ws~_onhxwu|{|{s~{n}yq}zy~|uzxx}{x}{x}{nz{nxymyyp{{p||nsrsuurttuwwwyy{}}{}~vxyw|}uz{qyyszznvvovvqyypxxrwvwyywyy{}}ots}~~~~}~|~}nom~w{|}|{}}|~~}~|}}|z|}}x~x}~||~~}~}~|}zuv}{z~{{~}xz~~~{vxunq|svvy}y|yru|ux~{tw~}}{vw|}zz{zz}qtsv{zyvuu~{|{||}}wx|{{wvzvu|z{sv~uxz}{ru~ux{tv|xv{wv~zy}yxzvt|||nnnppppppwwwxqnxplwki}oq}knxjlrgiwlnwlnzoqxmoBMQXcgR[_T[`[_d^begmpcgj`fifjmagjdhionpkfhojlihjfjkurtjeglikgijvtz|zzv|miowpwoinmjlmjlolnsprqnprqsgfhzwyniktoqwmsypsrmnpppinlv}znvvkopvrtxqt}ruuqvvttzyurpowtvsrtompkmnoqrostmqrruzqtyruzdglnrvxwy|{}vsu{vxzuwvpqxstywwxvvqqquuuwtvvsu}pmovsurxwz~qss{{{xxxz{z{ywwwuuuuuyyy}{{~||zxx}{{|zz|zzvtttrrvvvwwwywwxstuopztu|ux{}zwyqpryqrz{|}~||~~zxxuss{yy~||zzz{{{|zz}xy~~lllsssy{{{}}|~~|~~|}{yx}{z~}pom}{z}{z}|xvuywv}|~|}y|zz~}~}y}}~yts}~z||}~}|~|{~}|}~~}|z}w|zvywpwthqn~~~}}x||}yz~z{xy}{mxuk|xcwttqz}zv{yvxvvvqtrotrw~{u|yp{ykwwixziz{kuyosxstxsvww}|vywvywvywvywvywqzwozwnzwo~zl{wk{wfsoZhdjxtguqfuqrsqsvtouskurguqiwshvrfrohsphqnlspkpnjominlbgeZ_]lsphmkkpnenk_snyhqnjmk_dbenk_iffmjdkhipmahe`gdfmjholipmjqnipmmosjotbnrbsvbqtfsunurnqonlkpqopusomlqnmmkjmkj][Zjkikljfgeoomnnlkmkjspgpmfpmenkgpmmnllmknomlmkpqohjhiolkvshrojqnkqnsyvfmjinlw|znqooqoknlqusrvtmqomomnnlmnlopnpqoqrporpsvtrusnqolomjvp_miZgen~}gwvtxwx|zu}zu~k{wn{}ryu{y}w~{pywpwuoxvszyoywsxwy{{|~~y{{xzz{}}{}~vxyx}~v{|qyys||oxwpyyr{zpxxw|{}}x}|{zzz{y{}{~vwu}|vw}}}}}~|~swx}|~{~uwx}~|~~~~}z}~x}w|}~~z{z{yz}~nij}~}~}~|}|wx|{x|~|~|wy{}{~}~wzx{}~{~y|}~~}xzx{y{{~y{y{vy~vwwxy~}~yz{||}}|}yx~zy~}{ru{ru~ux~uxx{wzytu{vw|}nij}}}jjjvvvsssgggzxvrymk{om{mnxkmsnoplmupqlhimghU`d]fjW]bZ^cbfk_aeacgdeiceiklpdgkeijkjlkfhpjlkjleijnkmojlkhjjlmpntusysoulhnvovslqzwyqnproqqnpurtpoqkjlxuwvqssnpyouvmpsnorrrkpnnurgoohmnpnp~uxsotussnmi~|{urtxuwvtvoqrptutyzpuvrv{rw|z~quzvuwwvx{xz{vx{vx~xyytuzxxxvvqqqvvvtqsspr~{}tprwtvu{z}oqqvvvyyyytu{vwxvvvtt{{{wwwxvvpnntrr{yysqq~||~~~||zxxy{{}{{|zz}~|}}xz|~zwyxvxwxyz}~}{{|zz~|||zz~||zxxxxx|||{yy~yz|}}y{{{}}y{{suuvxw}~{|~z}{zxw|zy~|{usr|yx~|{~|{|zy~|{~||~|{~|{~nqon~vxzv}z~~}~~}}x{y~|{~|~z~x}|}|}}~{~|zzzzuux|z{{|{||q{x~q~lyxry|~x}vsuvuulnlqtrrysmtop{xvn~}qnxrw{stxptxqyyuxvuxvuxvvywvywozwm{wm|xj{wi{wgytdtpaqmgvrgvrgvrrusqusnvskvskyun~zfvrdsobqlfqnispovsnurjqnpwtw~{`gd`ecjomdmjThcp~zgpmfigjomfolbmjenk]gdkurdmjbkhgnkmtqkroipmipmknrjrvanrj~bsvertipmpsqsqprsqhmkecbkihca`nlknlkjkinomghfjljjliiljholelignkelibifmnlmnlmnllmkmnlswujrnitqdolv|ylnluxvdigbfd[b_y|nnlrsqlmkqpossqppnnomopnnomprpstrsvtvyworpprpqtrr~xeso`mkm}|brq{{}w|u~n~zp|qzwhqns|ys|yw}x~}v{zv|{sxwtyxxyyxzzz||xzzxzzwyy|~vxxuz{tyzmuumrsrwxuz{sxywzzmoo~~w~w~~}vwu~~w|z}~||~|zz}znrs|||~~~wy|~}~}|~~t|u}~|~x}~~~~~||}~}~{|{|~yzwrs}xy{|{|~vz~~y{~{}|xz~y|z}~xz}|{~yz~}zxpp~vwz{zzzzvx|{~wyy}wx|vw~~xyz{~}~~|svwz{ps|pt}ru|svz{~yz~~~nnntttqqqddd~zyslxoktr~pqvllonnooorrrpppuuuT\`ajnTZ_^bgcfkdeiddhecgedhgeideibfghginikpkmhgieijjhjqlnlikgijsqwigmwsykgmqjqtmrqlnwrtjdfpkmojlonpnmotqsrmotoqj`f|pklpppjomltpgqqrxyonp|~~twxtyywwtsowutolnpjlzxzwxytxyu||lttx{x|dhmjnsxwyyxz|y{ytvvqs}wxytuywwywwqqqrrrtqssprzwywtvvsugmlmrqprrwwwyyy}xy|wxvttsqq{{{vvv}{{~||zxx}{{{yy}}}{{{||~~}{{|}~z{|y{zxz|y{wtv|tu{uvwqr|zz~||~||~|||zz~~|zzyyyxxx|zz~yz|}w}||}}}|||y{{|~~tvvxzx}~x~~x{|}}wxzuz{w{}xuvrz|w~||~|z~|z}|zxw~}~}orp}~uVmixo}{ryv~~|{x{y}~x{y~y{{{~{w|{~}|~~~~v|x~}z}{twu}}}}|w~~xwz~}~z{{|xy}z|}rzwt}q}{nwwswz}w|zuwwuupqouvttzu|~t|ftp`qnastvlryqtzkpsltwuxvuxvuxvvywvywnzwj{whyuj~yg|wawr`upaupevrevrgvrruspusmvsjvsfuqPb^Uidarnhwsfupfrokroourfmjahd_fcw~{sxvlqoenk]ql`njfolgjhdigajg_jgirofolirohpnenkkroovsmtqgnkgnkkpsenr_nqWjm_ps\kmfnjknlpnmjkifkikmkcdbsusnomqsqronnlkmkjigflihkkihljejhejhbgelpnknlknlknllommpngmjenkiurgroswulmkoomorpgolkurgqnlomtwukljmkjplkpnmqnmqnnrporpoopntwuwzxpsqqtrsvtp|vcqmfsqn~}iyxyv{yt~zr}zn|xn}yqyvoxus|ypyvx}wzxvxvvzwvxvwzx{}}uwwvxx{}}xzzvxx{}~uwx{x}~owwmqrx|}z~vz{wyyz||{{{v~}xhki}|{yy|y}~|~}~}{|xv~w~~}~~x}|~z{~ytu|}~yzw{~x|zuw~{}}z|~}y||x{||{}}|}~|w{}|y|x|xxyy|wzjlllooztuuop|}yz{uv{z~zy|{y|zprynq~svwz|~~y|xsuxsu|||uuutttppphhhywoqnfxrmyplymkumkpppsssssslllrrrT]a_ejX[`adi`chhdigafjdihchlfkhgkaefgfhnikpkmhgi\`agdfplnkhjgijpntqouyu{plrngnpinmhjvqsmhjvqssnponponpqnptoqwrtsiozqtsnoppplqokrohrrmuullnokmysvyuzxvvwvrqonurtpjlvuwuyzrzzmwwsy~flqflqfmrtsuutvxuw{vxxsuystytuywwxvvsssttttqsvsuwtvxuwvsuw}|x}|nppttt{{{}xy}xyxvvussxxxuuuxvv|zzxvvsqqwuusqqqoo}}~~|~~}|||}{{yww~{}xuw|~~|tu{|ystxvv{yyxvv{yy|zzxvv}}~~~~~ttt~||~zzzzv||w|{{{{vxx}~wyyz{y}u}u~vwz~tzzwz{wz{wxyu|}z}|}{z~|~}xvu}|~x{y~q{z{~~y~}{x{y~}zxwwyy}}z~~w|{|~~~~|{{yx~z}{~y}{{{~z{zyx{wx|wx|wx|z{vzxw|w~uz{zz~~v{xsu|vwtvsuvtszss{tp|ukyum~{{grzryruymqvktwuxvuxvuxvvywvywn|xhyubvqaxrf}xg~ybytaxscwrevrgvrpusovsmvsiwsjyuz^todxshyugvrftpironxtajggqnoxuahemrpkpn\ebh|wcqmenkehfdigajgdolcnkgrokvshtqcnklspovslspgnkgnkhmpblpk{~ZoqUil^moelicfdhfehigqvt]b`txvdihnrqjomoqomkjpnmtrqusrstrhmkhmkrwusxvotrknlknlknljmkknllspgqnaok_jgjmknlkrnltvtntrkvsetphnlmrprusywvuqppnmrppqonrporpoppnsvttwujmkrusuxvmysguqkxvl||l|{r}{r{xr{xq|yr|zozwmxvr}znyvitqwzyxywvyxwzxw|{zrtttvvwyyvxxtvv|~vxy~qyyy}~ost|w{|y{{}tyx}{u~q|ztwupsq~sxv}}~~||~{}}|~~{wv~~~~vw}||vw~v}x~~z|~}{{zxx~~mkk|}{|~yz{vw~w{~z|}{~z}{~|}w|{x~rquzyywxt~w}z~~x~x~x||y|wytvvfkjupq}~~xy|vwzvu|xw{wv~zy}yxwz~x|vzsw|qt~{}|~vqstoqtttwwwrrrwwwnnn|zrsqguoh|omtlinnnmnniiihhhrrr\bhW]c[_cadi]_deaff`flgld^cjejddgaefgfhjfhokmkjleijnknokmhfhhjkqpuusyxtzmiorkrunsrknslomfirlorlnqprlkmsprtoquprvmryqswstrrrpuslsphrrmststuyuwzsvvswsrrttponltrt~xzrnp~}swxkssr||lqvmrwgmqw|vuwvuwzvxxtvytvvqrxtuywwywwsssqqqpmoxuwwuwusuxuwsyxy~~}}vvv|vw|xyzxwzxwqrquuuwuu{yyxvvussuss~~}zz{||}}{zzvuuqqs}vsu{uw{vxyz}~uopqoo|{{|{{yww{xx}}}}~~~onn~z{~xyx||uyxz{{rtt|~~~{}}}~|x~vw|}tz~uy{vz|wyzuz|w~z~}{zy~~}|xwu|yy|yx~t}|msrz~wyw}z~}~}{rtr~|~{}}|x}|{vxx~}~}~|zy~x}~~}||~lolutt~{}yx}xy~yz~wx}suyxyz|}z{~y~uxyzx{x}tnp|||zytusryrv}wnztiwsZkhk}|r}nu~nqytx}qy|txvuxvuxvvywvywlyvk~yok|h~ybzud}w`xscwrevrgvrpuspvsmvsjwsevru^snh{vhxtgvrguqmurqzw[dajspnwtfmjlqohnkdmjOa]lxubjgkomhmkfolmxufpmcmjakh_jfepmlspmtqjpniomiolkpr`imjz}]qsYkn_nofmjhkimlkkljhljX`]nurahenuriqnnlkplkqmlqmlnihjfefjhfkifki_dbeiginljnlinljomkqojqnjurjwskvsmpntrqrnmwxvntritqeupnwtt{xlrolnlkkirnmurqronrnntqpusrwyxvzxuxww{yprqiupkyvlywl{ziyxjwup|ylxtt}zw~{qzwnxus~{nyvfqmy|zwzxu{yv{yv}}yprrvyywyyuxxsuu~xz{x{lpqlprw{|xzzxzz~{s~|r|{ynsqpnm}|}}~~~|}xwy}}|wx|~z}}|}}~{|y|x~}~z|~||}~|vw}~}~~|}}}{tx~}}y{}{}}z|~{~~}}{~z}z~xx{y{zy|w~{|~z|~x}y}y~}z|{|yzyz|}~{z|{|{}yxxlo|rwx|~zztyoiotnssss|{{zzzxwwrrr}ztzxnvqihd\{spwolnllqmnpmnrooqnn[\gW\eY`hack`]cjchhacngj\XZknoahibgfdgghiijkjkkkinmhllfkjfkjglknklnjksmpoik|vzsoqpnpnlnljlrprpnppmopmopmoolnpmoootorvptunuulvtoutuuusooqmntnowqrptsrvuqutquurvuoprstutvwpqrvyz|~loqmpqloqy|}vx{sss|||yyyvvvyxxwvvwwwwwwwxxtttooonnnwzzrxwptsxwvyzzy{{y{{giiwyyyx{{z|zy{rqtyxzxwy|zzqoo}{{zxx{yyxzz|vpq}{{{~~uwww|{u}|v}|x|{uuuyvx}z|~}z|}~~pqquvv|~~wzzwyyxxxooo~yz|{||zzyy~yz~||xzzw~|t~}tyxoqqxzz{}}zzz|zx}}xy{|ryzww}}}}~||}~y}{w|z{}vzx{~|x}~~{xz{{|xy~~}xwvyvuv}z~||z~x}{~}}|~~~}}yxx|nurtzy{u~z~z|}uyzy~ryy|{~~|||}{{{~||vtvusuzy|vuwv{zrywp{xm{wn{gxukuzmvzry}tx}tx}tzytzyuzyxzzxxxrzwpzwu|kvsp{xp{vo}vo}wgurbspctqsttqrrpssotsntsbqmdsoguqesoiurhrojomjpmjqnr{xkurlqojomgnkdmjhtqw|afdjpnksphrobmjgmjdjgptrlnlkljsonvrqwvukmkqsq]fdS^[pyvoxu[a_fljjqniolkroholgnkimkryvdmjjtqhspplkqjjqiirkjoffpkjoihnihicclgfsnmmlkinljrobokjqnkpnbhfgmjjompusppnuywovsktqispgpmjtqcmjYgc\jfgliuwumomlnlnpnossrwyv{}hlnkprmrtlvupzzlxxhvugutenpyt|{u}|r{xqzvsyxqyxozxq|zp}|}|x|xwzppswz|yz{zzz{zz|||xzz||}}z{{}||{}}}~xzzrttwyy}x}|w|{{~ut}|}~}{x|}~|zzz|{wy|}{}}xvvzxx}}~~{}~~~}~ssq~~|~{|z{|}}~~~~~||~~wuuzzz~}}}}}y|{}~}{|}yy{z|}~~zuv|}|}|}tu}~z|~~y{{yu}}~|z|zy|zvzx~x~y~z}|w{{}{vy|~{}z{|}z|topzuvphiz{wxtvxzy{~w}y~|uz}v{{xwlhfqmluqo{xw{yuuvotsnutovuovuptvtytsxkntwrin^^j\aj[bkdfnb`fnhmngjtjmd`blpq[ccafebgfikkpppkkkceehjjdfffggjklnkmnkmqnpjhjkhjnkmlkmmlnihjkjlmlnqnpqnpqnppmoroqnntorvotumuukvtoutupqvqrupqystuopotsqvuputotssxwqstwyzwyzmopz|}xz{y{|vxysuvprsgggvvv~~~{{{{{{zzzyyyzzzzzzyyyqqqtyxsyxbgfywwz||y{{vxxprr}|~}|~yxzvuwvuwvuwtrr~||~||}{{z}}|uv|wx{zzyyyy~}w~u}|w|{uuuzvx|y{|y{|y{y{{z||xzz{}}wyyv{zxzzzzzrrr~~~yz||}}}ttxyyz~||y{{u{zt~xzzvvvssszyy{{{}{z}|x}}wyyt|}tzxx|zz~~}~x}{w|zy~|y~|w{y|~~~y{|xz{|~}z|oln~vxxy{{|zy~~qvt}}}}~|~}~~}y~}xy}~|~{w|}||{w|{~~~}{{xwyrqs{z|xwyw|{v}zv~jxtevrfwtmz|px|ry|ty|ty|rzytzyuzywyyvxxu|yoxuv|ys|yuyr~xp~xr}p~xtttrrrqssotsotsguqaplftpcqmnwtmsptvtimknsqqxumtqnsqinldkhdmjgroszwjommtqlurepm_jgfljgljadbhigpqoxsrxtsusropnrsqZc`Zebu~{szwX][otrovsnurgnkelidkhdigipmholgpmdolnlkpkjojiplkqlkojimihjfefbavrrkgfojimkjhljgpmVd`nurdiguzxy~|mrphmkrsqsvtqxuktqdpm`ifgroepmgvrfuqkpntwunqopsqnqomrqtx|otwzx}qvylttozzo||vhvvforv~~v~}u}|qzwr|vtzxrzxp{yozxq~|}ttxruyorvrstxyzz||qss~{~~put||~~|||~||{}}|~~xzz|~~{}}{y~}||u}|q|v~}~}rwu}~|y{yy}}|zztqs}}wy|~~tus~~{}|~vqs~~upq|wx|wxz{}}~||}}}~uzy}}~yyyy~~y~yz~~}}||zyzxt|zz~y}x~yz~|~zuw}xy{vwxpqz|y{ynptvvnox{~~wz|vx|uxwsrplkzvuzvt~zyyxt}|{w{zv|rrnssquporegujmrhnPP\\ajRYb`bjdbhhafd]`bY\f`b^abZbb`edafeegglllgggaccikkeggeggillpnphegqnpqnpolnqmorqspoqlkmkjlkjlqnpqnpqnppmopnpnntorvotumuukvtout}~ytuytu{vxjdeotsqvuputotssxwvxyrtujlmoqrqstuwxy{|xz{prsprtqqqwwwvvvxxxxxxxxxxxxyyy{{{zzzyyyw|{ots}}wyyz||uwwoqqy{{|{}|z|xwywvxwvx{z|sqqsqq|zz|zzx{|~~tv~xyzyyx||v~|u}|x|{uuuyvx|~|y{|y{|y{oqqxzzqsssuuy{{v{zxzzzzzttt|zz~yz}||{~zxzy}xw~yz~||z{{u{zx~{zzrrr{zzwvv}{z|zy{yvy{|s|zz}~x}{w|zy~|y~|v{y{||{}y{|xz{vyzpmo~}}}vyyy}|~rnmx{yy}}uzxzz~}~}~|z|z{|||}{{~|~|{t||v~~rxwtyxy{{~~~{{{{z|tsu~|wvxxwyrwvqxuq|yp~zm~zm~{nz|nz|ry|ry|ty|rzytzytzyuzyxyzx~|nurw~{|u|yoystzp~xn}yfwtk|ytttrrrqssotsotsgvr`okdrnbmjoxugnksqp{{yegevzxinmnsqinldkhfolgrofmjgljgnkgpmepmcnkfkihmkrusrsqmnlsnmvrqpnmijhz{yirogrou~{szwmrpjommtqkroipmgnkgnkfkiejhholcljdmjlmknkjnjimihokjojjqmltpoupojfelhgokjnmlfkikur[ieovsqvtinlmrplqonsqqtrqsqltppvsktqgpmlwtlwtfuqXgciolorpnqoqtrnpnlqpuz}fknuz}hmppuxlttqyys}}nyyjxwjtvt||u}|rzzqzwr|vtzzrzzp{yozxn|z{z~ffj|~vy}puxswxv{zz~uzy~rxwqut{}}yyyy{{z{{z|||~~}v{zz~~}xzv}|x}{{~z}{{yy}}~~}}|~~|~}|qs|qswy|~}|~~z|z}|}{uvt~}}z|}ytu{}yz|zzzxxwuu||~~~~}ss||vvlee{z{|w{|~|{z}||zxxvr{y}x|x}x{}xz~y{}{vx~y{|wx}~}xy~yz|tuvxuw|~}~x{z}~wzx{|uxxtsiedwsryutwsrttoffbwvrsrnkjfvuqtrqztssfhukn{ty``ldir^enWYaecikdiofiodgf`bcef`ef_dcafedffhhhhhhiiikjjkkkiiikkkqpr\[]nmomlnpoqkjlrqsfeggfhpoqsrtnkmnlnolnnkmnlnnntorvotumuukvtoutlfgsmnwrs|yy`_^ntspvuoutoutpvusvwlnooqrtvvwyzy{|y{|vxymopmopsuvrrrtttnnnuuuxxxssswww{{{||||||zzzzzzuzyw}|tyx}{{|~~z||lnnwyy{}}wvxyxzxwyzy{wvxxwywuutrr}}}{{vy~loxzuwz|yuvwyyv|{w}|xzzwuu{vx}xz}z||~qssrttuwwtvvy{{v{zy{{|||tttzxx}xy}|yts~}zy{z~yz~||{{{xzzx}|~~|xywst~||{yx{zumlh{{u}}zxx~y~|v{yz}v{yz}~}~~{}|~~y~}~{wv~y}~}~||}|~~|zy|{zy|}y|~~}~xzzz~}|~yzsyxsyx{zzzy{|uxyvyzvyzx{|x}|v}zr}zn|xm~zhzvkyxlxxpzzrzzrzzo{yrzyuzyv{zx}|zlspv}zx|mupr~xn|vr}fwtizwtttrrrqssotsotsitqernfqnepmelinrp~zyurqpnmfgepsqkpnjomgnkgpmgrognkjomkrohqndol_jghmkhmkiljnommnlqlkwsrpnllmknomnwtcnkltrhplejhlqokroipmholfmjholorpgljgljpwtpyvjmkjljkkigjghgflljnmlpnmomlomlpnmronopnbhelxugvrgnkgljkpnotrkpnjomotrnsqsxvt|xnurlurkvshspl{w\kgahedigjomlqojomlqpuz}nsvqvyejmrvzqvwowwr||ozzlwxpx{t||s{zqyxpyvr|vu{zs{zp{ynywmzxsuyz~z}vz|zotuionlrqy~}}xxxv{zv{zy~}v|zputv{zv{zx}|y~}|w~vwsyx{~|uxvuvtuvt~|}}}}|zz~||zxx}{{|~{vx~~~~~~y|v|{}}z{|}{~{}~}~~z{|zz}~~~~~~~~|}~~{}~|~}}~~yz~zy~~{zx}yz~~}|zywvryw|xs{v~y{}~yv{vx|wyytvz|{|{|~xz}xy{|vxvxzoqujlyzyz~xy}xxz{|vwxtstpowsrzvuplkwsryut}|}yxxutxtszrrxnprilvpt``lY^g\clZ\d`^dg`ee\_i_bf_bjikdijchgdihikkjjjjjjjjjqqqkkkssshhhkjligibaca_arqsdcelkmlkmkjlpoqmlnnkmlikkhjjgilikllrqtxnstmuukvtoutyqrwqrwrssqqvvvowvnvumvtnwvmutptusuvsuvtvwqstvxyz|}z|}mopjlmrtuxxxzzzrrrzzz{{{{{{{{{zzz|||zzztttv{zy~tyxtrrwyytvvxzzoqqy{{utvzy{{z|ttvtsu{yy{yyomm|zz}}xztvwyy{z|{|yzzqwvu|{z{{wstxqty|wzzsv|txqssuwwxzzvzzz||{{{}}|}}yx~}tpo}|}{{{yy|{{|||{}}{|z{|}yvx~~{zv~z|zz~||}~tyw~{~v{yotr{}}wyy|~zy~~{z|wtv~|~|~}||{}||}y~|tyw~~{z~}|}|~}~|{}xw}yy}|~~~}|zz}~uwxlppzt||qyys{zw}|~y~}z||uwxwyzy{|vxytuvsyxholq|yp~zvn}m{zlzynzzpzzrzzt}q|zltsy~uzyqvtjomy~|z}mrpu}xv|rzm|xizwqtttrrrqssputputkvsguqlurktqnurmrptporonywvnommpnmrpinlgnkdmjfqnlspjomlspqzw_jg_jggljfkijmkrsqpqoojilhgnlkopnopnmvsfqnclielinsqinlntrmtqfmjholfmjjkilomnsqeliahegnkgmkfjh_ec^b`nrpolklihnlkpmlpnmomllnlhpmguqYjfzbge\a_nsqgljjomlsppxtotrlqokpnfolfqn_jgq|\kgenkjrnlspgnkjqnhnmkpsdilinqsx{qvykqrptumuufpplxxpwzpxxpxwqyxpzvmwqrxwpxwr}{q|zq~|~pux|v~uu~~t||t||~ltswqyxu{z|y~v|{w}|x~}zv|{qvusxwx}|v{zx~o|{q}{y~}~psq{|z~z{y~{}}{|~~}}~wz{z}}}x{}yz~{|ytuyzx|~|y{|~|~~~yst|}}wx}~~}|~|~}~|wxz{~}}|~}||z~~vnx|yu|w|{{yxvuq{w}x{|}~y|{}{}~~y{ytv|wx|}|wx|xx}xyz{y{xz}rt|qs{|~xy~xy~xy~xy~xy|{|xwxtsxtswrqojhvqp~yxzut{vu|wvrjj}rttlonineeqX]f^en\^fb`fhbgi]`m^bjbfhfhbefafechgikkeeejjjmkknllhffnlldbbhgi`bcgjjeghvxyfhimlnrqsrqsnmojikmjlmjllikliknkmppvmptqvwnvvkvtott{pryqrwrssrrrttowvmutovvnvumutptutvwvxymopgijsuv|~z|}tvw{}~oqrvvv{{{{{{wwwzzzyyyyyy|||zzzsssqvux~}x}||zz{}}|~~tvv}yxzxwy{z|tsusrt{z|~||yww~~~~}}xzsuwyvxuw~wxwwwv{zinm~~wz{~z}{~xqtxzzvxxprrsuuuwwuzyuwwuuuxxx{yy~yzxvu{yx~}||zy~||~||{yy}{{zzyzst{||}}~|}|}yvx}|}||{w~||}}}~w|z~z}w|z|{{}}|}{z~|~~}{}zwy~{}}z||w}|ovu~~}x|w}|~~~|{~~}~~}~~yxvxo~z~~~z||}{z|}xz{txyuz{rzzrzzt|{t|{~v{zv{ztxyuyzvz{txysxxw}|u|yozwr|p}yk|ylzxn{yn{yp{ys~pzxlxvw}|tzyvzxsvtsvtuxvu{vr~xt|p{j{xl}zvvvsssrttpttptthrohrpmvstzwswujmkusrrqpxzxtxvqvtmrpinlgnkdnjfpnZa^jomkronwt`jh`khdhfejhjnllmkmnl|wvxtsvtsxywvwupyvZebcliryvejhlqoqxumtqahebifgnklmkopnnqojomholfnkajggolktqaifovslnlnomjkilmkopnnpnjnlclicqmZkgz]b`chfotrgljntqlurlspjomdgelomirolwtitql{wm|xbkhmtpovslspgmjntsmrusx{nsvrvznsvmqrotumqrr{{pzzpxzpxxpxvqyxrzxnxrtzyrzyp|zozxp}{px{{mvyq{~rq{~s|xyktwjttrzys{zw}|x}|y~}v|{w}|x~}zw||otsw|{z~~~r}t}sxwwwwytu}~|~|{~~~~~z{}~}~}{~~~}~~~~~zwy~|}~}~~~~~|zz~xyystyst~|~~~~~}y{|{|}yx}zy}{zumw|wxzws|x~~~}|z}|~y}z~zz|ytv|wy|wyzuvzuv|wx|wxzuv}uvxzwyvxy{~~yw~yw~yw~yw~ywzvuzvuwsr{wvzvuystyz}wx{uwyzvqp~vvxnnvkmpjlljn\\hTYb\cl_aidbhlagj`coaenehheg`deafedihikkeeejjjljjkiifddljjeccnopz|}y{|tvwnmovuwrqsqprqprtqstqstqstqsurtssyjmqrwxnvvkvtntr{pryqrwrsrrrqttnywitrmyvkvtjusptutvwvxyy{|kmnprtnpqqst}vxynpqwwwsssttt~~~tttxxx}}}vvv|||~~~tttputu{zw|{wuuwyyqss|~~mlnzy{{z|rqsqprsrt~~}{{~~~||yz{tuxy~vw}uv{uvzyyy~}mrq~yzwzvyzqtxorypswyy|~~xzzwyyv{zwyyuuuxxx{yy~yz|zy|zy}|~||{yy~yz|wxz{xzwyxztvxy|x}vsuxvv|zy}{{|zz~||w|z{~x}{z}}xy}~~{}~{}~~|y~~~|{~zyx|w}}}~~}|~~~~}z|}z{|z||wyy|}z|}z|}x|}lqrqyyqyyiusnvu|x~}z~wz|uxzrvwswxvzzx~~gnkozwq{l}yfzuk|yj{xm{yn{yp{yvkxvozxrzztzytwutwuorp|}wzxflglxrrzp{k|yhyvtttsssrttntrntrhqnfqnnurlsphmknqonpnlpninllspnurmrpinlgnkenkepmahemrpholjsp`lhaliejh`ecjmkkljlljupowsrvtsnomopnr{xitq[dat{xmrpkpnovslrpcjg_fccjgjhglmkhkifkihmkenk_jgdolgro`khirpnomijhkljmnlopnopnhnlblibqm^rmktqnsqhnlnsqhnlmtqlurhqnfkiehfmnlktqnyvnyvfuqkzvYdalvsoxugqnblhu}|zhmpotwqvymrumqrswxmrsqyylvvrx|pxxnvvqyxr|xpzttzyrzyozxozxn|z|vq}rsto{}lyzr~p}~myzvw~}w}|w}|w|{t|{u}|v~}v~~t}|jon||}{y~uwtxw{yysvt}}~~||}~|~}~~|}}~~}}}}~}}}~||~}~}~|zwywtv}|y{wx~~~|||{{{~~~z|}}~}xy~yz~~{~|vzx{}}z~{xt~x||z~y|{|z}{vx~{}{vx|wx{vw~yzxst}~wxy{|~z|tv{st|xw|xw|xw|xw|xwzvuxtsxtsyutxtsyrs|styqrphiz{zrr{sszqqvlnsnpnnr\\gSYbT[c[^f_^dmdjk_bnbenfigdfcghchghlkhkkiiijjjmijmhilfhpjlnhi}~utu~}~wvxzyzvuwusuwuwxvxusuusursxknqqvwpwwmvtosr}pryqrvssqqqqttnxwisroywlvtjtrptussussuwyznpqnpqqrtqrtz{|oprmnpvvvooorssrrruttutttuutttvvvwww{zzooonsroutw|{{yytxwjlkx{zsutvyxrprwvx|{}xwyxwyvuw~~wuu|zz~||~||~yzytu}xy}wxyz|vwz}}w{zrppytux|{sv~ux|wzvxxxzy{||wyytwwwxxzzzzyy|zz{|{yx}|~}|yx|{{|yy~z{~yz{|z{xz}~wxvxxy{|~xvv{yx{yy{yy}}y~|~z~|vzxrwu|~~uqryz|}~~tpr}~|~~y~}{{x~}|{x~y}|}~|{vut~}|~zyxzyxz~}w}|}yyy{}z}}y|}x{|ntut||q|zkvtpxwx~{w|}txypuvrwxv{|v{yourpyvs{n}xn{j|ykzxm{yn{xo{zxkwuozxqyxrzysvtvywz}{x{yw{xy{ftnmzvm{xl|yiywrsspppoqqorrptsjrogpmhrnjroinlknljqnntqnvrirogqnmspinlfnkeolcplemjgmjjqnfplaliblihnkfkigkilnlikixsrvsrrrprsqlljU^Zjur`if}vzxkqnjpniqmholbiflspiigmnkijhdiggmjdnkbok^lh^kgaokenknomfgeopnmnlkljlnlinlepm`pkasnjromrpmrpkpnkpnipmlvsnwtcifqtsmomltqkvrkwtcrnguqfqnw}nvslur`ifnvuotxjprnsvntvnsvnpqw{|qxxjsspxxqy{oxxnvuqzyr{xr|ww|{u|{nxwmwvmzxs|}wr~q~m}~q}p|t~p{~q{oz}yq|zu~|zw|{t|{v}|v~}u|{r{ydih}{z|vzyzxx{vw~~|z}~~~}z{||}~~~}x}x|}{}~|~zuvyyy{|{|{{|}}~~}~~~~~}|}~|~{|}|}wyw~z}tvvy}~|w~z~}~}~}|zz}{{w|}|y|~{vx}xzz||wzzuv{vw|xxvqr~wx}st}~tv|pryz}vu{vs|wu|wt|wuyut{wvwrq{wvzvuiab~vwyqrogh{|}uvxoo|qqwnouprmmpZ^d[^d[^cZ^cZ^c\_bdfjgfj[Y^d`eheikkmnlogfhsrtdcehhhiflmhpqjqwrtkmmurtnltdsxtw~}uyulplkokz~zvzvqturvwruvruvsvwsqrupqwrsvstwttuqqursurrmkkwuutsswxzrstwxyprstuv{vxwsuurt|z|nmosrtrpptrrzzwqrxqrsrtknpnrtwvxvqsystwuutttrrrqssqttsrtuuwuwwsxvszvsztX`Zryspxqrttvuwtsuyxzqprvuw~||xvvzxxzxxvx}uv~yzxzzw{{xvy|y{}||yxxywv~|yzz~yzzuv~zz}xyxvxurt~{~|y{yvxwvv|vwz{}xy|zztxxy}|uuvwrsz|wzxzxzxztvwywww~{{{{{{yzzyzz{{{}}~|}}~|}{vu|yx~|z}wzzssu~~|}}~x}|uwuzyx~}}y~|y~|sxv}~z{|~}}~~~x|z}}~}|~|~~z||z~|{u|u~|s{z}vz{v~{nwsq{ztr|~v|{tuuyuu}yz}||{zrlh|{vxzr|{mywq{yqzzx~nswu~wwyt|xu|ytzyprrutu{{{|||wvvosthu{kx|nuzrxzsvzjonqutnppsssihhupqippYrnZrokpotnogpos{zflklqpinngqpenmcombpnaom_ljcpneqoanl`mkbpn`nldrp`nlerpZgeprpuwu\_]knlosqsttwwxhhhopptstpqqlnnjmljpogml`hgceehjjgii`bbceefkkcjifkkdihfhhfiijnmjnmllllklolmjominlkqnhnkholosrnqottrda`unnmlk\pk`qmbokcmjgolnqpmqolrogpmfpm[fd`kigrqdoncnljusjwuaqnizwbnlionn{{lyyn|{kxwjwvo|{p}{r~|gtr|nywxyyy|{x{zvyxwyyx~}|w~nzyss||r{{t|}u~~v}~r{{oyyryzu~~y~x}x|~y|~{x{}|||z}~v}|yw~}}~~u~v||z}~|y}|~}~~~|~y}{{|zz~}~~~~}}{}|~z{x}|y~}{xxx~~~{uv~zyy~|}~~~||}~{||}}}{z{{|}z~{x~x~uou~{}xz{|z{~wz~wz~wz}uyy|y|x{~wy~|tu|ttztuxuvszqn|yxpm{|wrssmnsmnystztu{vwxstsnosnouqrZ^cZ^cZ^cZ^cZ^c\_c_bfgfjgfjfchd`ehgiihjgfhlkmcbdeeejhnpktrjrlgikmmvrtsnwesyvtwvqtrqtsvyxptuptuswxswxuyzwwwonmrppvttsqqtrrrppnll{yyussywwlrsippnuuu||mttzvxxsuurt}z|nmopprrpprppxrs~xy{|yxzmqrkopvuwuprwqrywwqqqtttqssotslkm{z|tvvsxvrztryuovqryty{qxsuwwtsuxwyyxzsrtrqs}{{zxxwuuwy}uv}zzuwwmsrmlpjgi}{{~||{yx}|x~yz~yz|}~khj}z|yvxzxzzwy|wxvpqyzwqrzxx{~~nsrrssysty{xz{}wytvvxy{yvvppp~~~wwwzzzwwwuuu~~~xxxxxx|zz|}wxyz~}|{|}{~|z~|{}}}}||z~sxwuxvx{y|}x{y|}|z|}z}}{{|zzz~|}{{{~~z~}}}}z||z~|}t|t|{outx{|{{zprpz||vzzty|rxwtttupq~yz|{{yxuol|wxypuyst|{qyxvz|w|nrwu|umtou|wsyxrxwsuuooouuuvvvooohlmiu{lv|pwzrwyptuotssxwwyyqqqmmmupqiqpXso[sokpotnohsqjrqjponsrlqpowv_kh^ljapnaomerperpcpnbom_ljcpn`mkbpncpndqo\igprpsvt\_]hkimpnmmmjjjmmmooossstttnppjllflkflkdlkmookmmnppqss_aadjigmllqpnsrnpplnnglkjonjllrrrommmrppusinljomjomgljmpnusrc_^yqqmkj^ok`ok^lh_khfollomjomjomgnkgpmlxv`mkcpndqobomfsqjwubtpq}eqootsm{zlzyn|{m{zo}|q~|lywr}kxvunywv{zsxwv{ztyxuzyx}|}{n{yr}oyyqyyt||v~~wu}}rzzu~~x}~rwxy}~y}~|x|}{~~}}w~{x~~|}{|}{{|zt~v{}~{~~~|y}}|zz}~~}}}~|~}|~}{zx~~y~x~}xxx}}}}|}|}~xy~}}}}~~~~~{{{}{{~zz}wx}w|z{~lfk}|~}xy{vw~wz~wz~wz~wz||y|{~~ux{ruvyvxz|{st|tu{uvvsvs]TQvsxolz{uopwqrwqrztuxrsytu{vwkfgrmnupqZ^cZ^cZ^cZ^cZ^c^`d]^bggjgbhichgchihjjjlkjlnmohgigfhkiokforjssmqikkxrt|w}~figpsqtwttxylpqqtvswxtxyssswttommrppqoopnn^\\xvv~~sqqsqqfooeookttpzzissyvxxsuurtzxzonponptrrpnnmghkefyzxxztxybfgtsurmosmntrrllloootvvv{zwvx|{}vxxsxvrxtlsnjqlpwrw~yt{v}rqsutvvuwrqsrqs{yy|zzxvvy{zrs|zztxwrxw|zzwuuwut|{vw|wxzuvtopytu~}z|~{}|y{{|yst}{tupnnqrrxvv|vvz{z|z}wytvwyz|wwwxxxyyy}}}xxxqqqsssuuuzzzuuu{yy}~z|{|yz}|~}|~~z}{tyyty~{z|xwy~~||{|}~~zy~}|}uxv}~~}~~}~~z|~~~~y}|~~~~}yy|x~~z~~~~{}}z~||v|x~|x~}}}|usr}}vtvzz~ovuwxxqooywwvvvsno|{wso|z|vtxru{z~v{|x}sv{w{s~wv}rzyqyxmllzzzyyytttostjvzkvyowxtxxtvvw}|otsfljnnnnnnqoohpo[qm^rolpotnomxv^feekjinmglknvuiqpdombom\jh^kidqohvt_lj_ljhvtclkcnlclkcnlclkorporpbechkimpnnnnpppkkkhhheeefffhjjgiiflkflkdlkfhhfhhkmmnpp_aa`febjibhginmikkfjihnmchgkmmtttlllinlotrfkijomkpngljhmksurkhg}uunlkdso^jgu}_hd`ifnomlomjomipmjpngtrYgedrpesq_mkhusgsqivtup{yw|{m{zlzyn|{kyxm{zp|zjusnxvs~|p{ynywrxwtzyu{zsyxtzyx~}w~rzys~|r}qzzqyys{{u}}wu}}qvwz{kpqz~z~|vz{x|}{|zzu{zw}|x{x~}|~~cdbv~w|~~~||~yz~~wy~}~|~z~||{yy}~|~{}~|}}~~~~|z~z~|z~zzz}}}}|}|}}~}~~xyxww~~~~yz|}~||}xxx}{z~yz|wx{{~x}||v|zvpu~x}~yzzuv~wz~wz~wztmpwrt{vxz}{~vknuxvxuw}uv|tuyst}tqvsuliwtzrnrjkuoptnoztusmnztutopvqrnijwrsupqZ^cZ^cZ^cZ^cZ^c_`dXZ^kglb^ce_dfafgfhlkmihjpoqgfhcbdkipnhsrjtmglkkkumpxoywz{}}prr`bbv{|inolqrswxqvwvwwtttrrrrrrvvvlll{yyhffommsqqtrrghiiiknoqlmnrst{vxxsutqsxuwpoqrprvtt|zz|}tnoxyyxzptueijwvxtoqztutrrnnnppptvvw|{xwyvxxsxvqxsv}{u|zu|zv}zv}z|~~onp|{}xwysrt|{}jhhyww{yy|zzz|yrs{zzvzzqyxjim{xz{yy~~wut}|xvqrxstz{}xyzuv{xz|y{zwyzwytqs~xy~uv|xyxuuytu|xxz{}~yzyzyzyz}~qtt|~~z}}twwuww~~~|||xxx|||uuu}{{wrsyz}wx~~}z~z|{}zy{{z|~~}}z||w|{|}}~|{}yx~||~{~{yyw~{~~zx{|~~~}}}{}}z~|xu~{y~v{z~y{|x{y{~~ntt{pwx}spr{xzvvxvuurqqrpo~~zz}vruptxwv{znstqvyouzq{uenkt|yqyyowwotuprsuwxsuvtvwswxkwymvxpvvuzxx{yw}|rxwdihy{{y{{rrrksrbtqbromooqoodombjigmllqpjonbhgqzygrpdpndqobomivtn{ydqo\jhfpnflkelkinmdkjhmllomjmkknllomlomlllmmmnnnhhhgggllljllfhhjpogmlaihjlllnnikkfhhcee\dcdlkhnmgmlinmhmlgmlcihjonprrkkkgljotrlqootrrwulspgljtusigfytsrpofpmirohqnblhmspopnnpnnpngljipmdqoVgdctqfwtXjgkywepnm{yyhrpm{zlzyn|{n|{m{znywr~|ywjusmxvltsys{zqyxqyxv}|xv}|vvws{{rzzqyyu}}u{|vyzsxyzrzzy~y~|w|}y~|{zrxwqwvw}|}}v~}zw~}zzxvuy~z~}}}{{}{{y}}|xz~y||vy}~|~~~zz{~yz}}~||~|}}~~~~~~}~}~{||}|}|zz}|zz{yy~|}z{xvv}}suwyxz}{}~y{|}{}{|nikztx}w|}w|~}xy~wz~wz~wztpr}}uytxvx}rt|tu|tuystxuxol{ro{x|spwopvpq}wx|vwxrtsmnlghxstgbcytuytuZ^cZ^cZ^cZ^cZ^c]^bdcga]be_df_dhbgfegkjllkm}|~ons|xhaowoyicikghwmpxmwiqxisvwzzrtt|~~z||suumoo{_ggemmjssmuutuuvvvssssssvvvtttpnnpnnpnnmkkqoo{osswobfxlo|psyqtrmo|~urtpoqqprtrr{yy~xywqr}uvqprhlmquvwvxwrtxrswuupppvvvsuujonsrt{z|y{{v{yt{vv}yt|xlsppxtpwtvxyrqswvxyxzzy{zy{}}~||xvv}}}}xyzuvzzzu{zz~~~wuu}{z}|xytu~}~upq}z||y{|y{|y{roqz{yzy{z|{|}{{xy}wx~xz|yzyuvz{~xyyzwww|~~y{{y{{~~~yyywwwxxxuuu{yyztvz{|}~~~|}w}|~}}|~~}wuuy~}|~}|~yx~~~}{~}z}|~||pwt{|zy~}}~yv~~~~{}}z~x}|w~{u|y~tyxz|}y|}t}vq~k{zl}~mwwostlkmxxytwwqtuvzzz{zxzxxyuuuuuwwsvww|x~t}iurr~{issu~z~~z|}y{|tvvsuuostkwwmxvsywy}x}gonjpo\bafljeggx|{muteqogpomoorsscnlemlgmljoninmcihsyx_gfgrpfsqerperpivt^kiXecnywikkkonlnnmqpkmmlomknlnqompnknlpppvvvooorrrrrroookmmgiidjiekjhponppdff]__jllgiiemllwudlkhmlhmllqpfonflklqphmlkmmkpnfkichf`ecfkijqnlspwzxnpntqpsonmrplronurkrojqnpmljkiiljjomjomkxvuhvtdrp\jhhusbkjo|zgtrryxmoogutftsn|{jxw`nmr}{u|{u}|w~}szyx^igvr}{mxvxt}u~wzzyv~~rzzqyynvvqvwwvxvz{v{|u}}wwwv~~v~~~~}v|{x~}~}u}|{xu~z|}~|{ywvvts}}|{~~~~}{{{yy|~~|~}|}|z{~|}}~|wx~|~~~~~}||}}~}}~~}}{|}~}{{~~yww{|zuvywwwuu|zz~||vxyy{|~{}z|~~|wy}w||v{|~}~}xy|uxzsv~wz}vy}}z|yy{z}|vzsu}rtzrszrs{uvzwzw}tqzqnzqnzrsvpq}wx|}~xyqklrmnwrsvqrupqojkZ^cZ^cZ^cZ^cZ^c]^be`fe^de_df_dibgonpqprihj|{}yskvohormotwvhsekrltwnpqz|}oqrnpqlttksss{{ovvmuulqpwyymppqsssuuqrrvttussvttrpp{yy{fkou}hntyqv|qttoq|z|urtrqstsutrrussystz{|tuwvxswxquvutvsnpztusqqqqqsssxzznsrsrt{z|xzzuzxt{vsyxtzypuupvuouttvw|{}rqsvuwwvxxwyyww{yyyww}}|zz|}~yztuutzyq|zrsw{xzvttzxx~xws}~wrszuvvsu|y{|y{|y{wtvz{y{xzz|zz}~tvz{z{yxxuvv|wxz{}~}~|~~x~}|z~y~}|}}}}}}www{{{}}}www|zz}xy~~xyw|{|}}|~zy{|{}zy{xwyuss}~~}tyxrwv~}~}~|{|~|~~z}}~}}u|ylrpqrpzxx~|~}usoyyy{z|}~~~~~w~{x|{rtt}{~rwxk|xpi~|czxf{|v{vuysuyswxv{|y|ytuqvssxyyquvuz}v{u|nywqzzpx|u~v{~nquwz~qtxvy~puvmxvoxutyvquoutodpnnvudihbgfuzydihbjignmjpomoonqqitrgongmljnnhlldihrxwagfhrpdomerpcpndqoR_]Yfdhqponnppprqqlllnmmknllnlnrporpiljkkkvvvsssppppppnnnikkcee^dcntsfnlrttikkdffgiigiip{yo|zdpmaihhnnfmlhpohpojpohmlejiejhafdnsq`ecdigholoxuswuttrvrpsonopnmpnosqlqolrppnnljijkilomkpnjsrmywhtrjvt_kijvtltsitrjuszqqq_ml`nmgutkyxaonr}{t|{s{zt||s{zowv\igbomlywkxvup}{s~|ozxz|ywu}}s{{u}}}yuwqqs|zwwwwxx|x~}y~}|}}u}|{w{{{~w{wv|zy~~~||}}}{{~{}~|}|~}~~~}|zzztuz{~}~}~{|}~~~~~~~~|}|}~~~}{{~~~~~||}{{}{{z}mpunossrvzy}|wy{||ww{vwxtt~y~|v{zuwz|{|z}x{{~|ux~wz|{}xxzytv|svtxswsu}rtxpr~vxztuzpnvmjxol{ro|spyqrwqr|vw~zturlmxstytuxstupqnijZ^cZ^cZ^cZ^cZ^ca`dc_de_df_dh^dibgihjihjihjnmoihjecilhskdsmeqslttmpptrbmgjrw}kmmoqr{}}npqhkkoyyeppcmm`kkjttputmnnnopqrrrttmootrrtrrrpprpp{yyptoty}rvswzqtxsuzxztqspprqprxvvvttystystxpqrqsmqrbfgutvqln{uvrpptttsssz||rxvsrtyxzrttqvtpwrpvurxwsyxtzyrxwtvwpoqtsuvuwvuwwuuywwwuu}}ywwyst}yzz||qwvwvw{~~||tsoz{~yz{|}xy}xy}vsuvsu{xz|~z{z|tv}z{yztv{|z{{v{zzxx}{{~||~||z||qvuy~|z~y~}{~~~||||||ssszxx{||}|}~y~z~|~~z~}}|~|{}~}}zxx||z{y|zy}xw~|{~}}|~~w}}|zzvttz~{vv}|~|z{w|~~~~~w|z~{}}rtt}|~vxyp~zm|xl}zexvh{|nz{lrtrtwuvzsvznwzmvyv|{w||twuzyyruvsx{qz~r}lzxmzzr~q|jnqknrhkoux|ruytyzmxuoysqvqqtk|}tgrpfmmfnmcihsxwhpogonloomoomooinmfqomutgmlhnlfkjhmljnmionfnm`ki]jh_ljfsqUb`]jh^fermnrnnytukghpkljmklomprporpiljjjjrrruuulllnnnlllnpp`bb\barxwdlknppikkgiihjjegggrpivthsq`gfkqpemlhtrmttcihionchgfkiotrw|zlqokpnowtjspjomnqotrqyutusrrrppsqlrpnurtonkihfgelpnorpmrqfmlekjpwv}pwvjsrhsqgrpy~xxxkyxiwvo}|m{zxy~w}|uzyu{znvubpnkywlzxn|zr~o}{r}nywzx~}xwwv~~s{{w{|{~trt}ztuuuvvw}|v|{{{z~z~w~|vooolllqqq{|zvu~~~|{~~~||}}{~|}|~}}}}|}||}~|||}~~~|}yzyz~~~~~}}~~~|}xz}~|||yww{yy}{{z{|}}~~~~qoo}{{rwzjmq~}}|}|wxytuz|{uzy~zuw~xz{vw~wz|uxy|zsv{twwyzwyzwrtzptswswrt|qsvnp|}ztuyvzw~{~{zwyqrystztu~xrssmnxst~yzytuz{rmn[^c[^cZ^cZ^cZ^cbaeb^ce_dc\ag^dibgdcfffieehnmoonqcagkhsicqwn{slvohkrvu}~~mnsklqlmrhim_hh\eecllirrlrrciggkkkqpnrqikkqppsrrmllsrruttvjnsxvysw~svxpswsuwtvsorrqsuuwyvvyvvuopyrsvmorqsqtuknoxwyqlnztuvtsuuuvvvy{{x||vuwwvxqsspvtqwtmtsqwvu{zsyxpvvxz{rqtuuvwuwxwxxvvywwtqq~}}xww|uwvttxyyqwvn{yuwy|~|zz~~~|zx{wx}~zvwyuu{wx|y{|~uqt}z|}z}z{{|rtwy{|tv{|z{{syxzzz|||{{{yzzw|{iontzyy~v|{w|{yyy{||zzz~{zzvww}}}~z{|}~~x}{~~~z~}~~~~||}z~}x{{}}~}}|{~}~}{z}|}~z|z|}~~t~{|}~~}~|w|zwts}|z}{|{|z|~~~{}}v{zw{yy{{yzz~~}u|yqyvs~|mwwpz}jvylqvopuqpwwz~ltwowzpwxoutwzxxwvzvvywwqturw{ox|p}{iuumyyr~lw{pu{sw}sw|tx}qv{jpspyspxstxrqulznywgrpaihagfotskrqippmopooomnogmlfpnnvugmlinmejijllloohnmbih_gfamkanlgsqZgedpnbihpllplm{xxhdeokliljlompsqmpnlnlmmmllltttiiilllkkkoqqfhh`feoutdljdffdfffhhlnnrtthrpivtozx^jhhrphqpkutoywgnm]bajmmjpmkpmkpnjnlqwthqnoxukqoqsqqonuqpvrqqonpsqmrpouruqpjhgedbopnmqorwvlqpsxwy~}}x}|syxhsqqzysyxvvvjxwiwvo}|esrlzyu|{tzyrxwtzyv|{v~|ujywp~qo~p~|vs~||{t{{t||wu||rzzuyz{~}|~wz{v||s}}uutvvsyyw}|tzysyxy~}y~x}|w~|t~z|}}}~}~}{~~~~ywwyxx~~~z~}~|z~~~}|~~~~}}~}}z~|}~~~}~~|}~~|}}~||~~{|qijxz}~{zzywwwuuxwv{yyz{xy~|}||~~{yy|}osxhjo~}~}z||wxz{zuvz{toq{uz|wzwrt|vxzuvx{}vyz}zsv{twz{|~~~twvzvyrtzqrslm~ztu|tqumknfc{yyvxrrysuztu{|ztusmnsopvqrzuvvqrsnoiZfe[e`\e\^bZ_b]^acbd`^`{z{fefcdgbhn`cj`biffmbaidbhdfm_dkfjphgmqkovqt}z}~~|y}~y{{y||looiklfjkjmnppqmlmqoqliloorqptmmpcafmopimlvyyruuvzz}v~{v}wtzooqghjtts|||rsrlllsqqtv}su|npsuorvrt|wysoq{wy{vxvsuvuwxwyvuwwvxxvyutvtsutrurrtttvuxxwyyy}|rttrutuutxzwvttwut{{zvtwvq{zwuvtvyyuxxrwvtrr|xyzxxvvx~zy{zy{~v}|x~}putqsswwwz{{|yyr|zwxxzwxwstslm~~~uuyyxsrwrq|{}}}yyy~~~}}}vvwtuu{{{xyyxyywzzqvux{{sxwvzyv{zy||x{{kkk~~{}{|{~~v}xpstzy~~~{z~~zyy~xwwy|uwyzz{}{~}{~str{}{}}~|}{|~}|~|}}{y}~x{|x}{ozto~xp|{szr||muvt{{y}x|}rsxwx|svwvxyuwwtxxszzpxymxxkyxq~yo|zp||sq}qswuw{puxqx{kvxlvuuwusxsryrr{ppyos|yowthol_c`svtvzxkomehforprvsafd`mkhtqeml]dcfllllldddimlkpoagfgonhqphonnsrnqqfjioppklllmmjkknoohnmdfflllpnnljjlkkgggkkkjjjmmmnnnpppjjj`aadeebcceggbdddffgiifhh_okbxrcytWmh^rnhwsnnnooonoosttnnnsttqqquvvqqqijjlrqlsstvvqnounouopsrrrrrpopmmnsttupqussjlmhnmxepnfrpp|zp}zfrpozxpvupwvu{zx~}q~gutlzym{zlzyswxwwxwwyzz|ooqjik{ztztn}w}zxu}|t}}t~~r||q{{mwwlwwq}|n{{o}|n{{q~}q{~p||q}v~|{~{rwrw~}w~zyzlopx{|uyy|}y|w|~||{y|~y|}y|z~x{|~y~}|~|}}~}~||yxx}~y{~}~{|~wy{}|}{||}{|}~{||}{vwzuv{z~}}~~{~~vz||}wv{|zztx{||~{|{|~z{}~ojkz{wrrtop{vw~yz{~z}z}|wyytvzqw~x~ywyxvvwqqxootpoyussppwuxxut|}pmmsopxuuurqvuturqtrqwtsolkwqrztusmnrlmmghjYff[ea\e]^bZ_bZ\]a`bbacgfh]\^cdhhnudgo^`hgfofenecicfk_ejbfkllroinpmorqsvuwdfgfjkmopbde}jlmdfgmqreghnlnnkmkhjgchcbfihlpostswjlminmv{zntruzyv{z~vyu{qou|~wyzqqqkkkmmmlllljj|tu|uvtwwyrtxsuytvtoq~uprvsuvuwxwyvuwwvxxwyutvtsutsurprutvvxxtvvvxxsuusuuxywstr}{zrpozvu~yvutpyxtpqoprrotsputsqqzuvywwxwy}|~xwy~}srt}~rwvptsxyyyxxvttwxxz~xy|||p{yxzzzxxz{yst~vw{||tt}}|{}xwzy{{{|||{{{~~~ttttttyyyzzzz||z~w|{|{sxwu{zx}|y{{ppp}}}~}|{|u|w}~~yz~rsquvt{|~~|}}uvt|{|||||}msrkpo~}}~z}}{~vwu~}}~||~{~|~}|~{}~}}|z}v|u~vzt~~s{{wnrs{ww}z{xz{xz{xzzv{zrzzoyymyykyxp~}vr}uvq}prvvx|puxpvzjvxkuutwutxsryrqyrozpmvsovsryvmpnvywmpnpsqy|zsvtqtrafdYfd]hf_gfjrqhnnnnnsssqssbgfbgfiqpjrqkqpnsrmooehhnppsuumoomookmmjonikkqqqsqqommnlliiillllllmmmnnnpppjjjkkklllkkkmoonppkmmhjjhjjbqmdxsewsZni`rnhvrooonnnrrrtttqqqrrrnnnoootttkkkipnrxwxzzrpppjkrlmtttyyywwwkkkuuurmnmkklnnkqpckjfqofsqivtkxvgtrq|zpvtmsrhnmcihpvum{zkyxkyxn|{m{zrvxtwxtwxxz{prsmln|yy}s}s~xzywu~r||s}}ur||lvvs~~sp~}p~}o}|rzn|zv}~|}ptoz{w~w~w~w~w~z|}{}~{}~tyx|~z~~|~{}~~}}y|~yzz||}{||}|}xxx~xz{}|wx{|{}vx{}|~}~z{smn}~}~~xy|wx~{|xst}~}xw}|}~}|uxxx~vv{z{~xz~x{|~~z{|}~~|wxz{}~z{|}~wrs|qt|sv~ux|wyzuwxnuvpvnnnqqqxsr|stxts|xwywwutxsqqxvvtrrvttvttvtstrqvts}{zwutomlsmn}wxwqrlfguopjYff[ea\e]^bZ_b]_`edfgfhfegjik`bdcin_cggjn``fcciigmcfkagl]af[[aqkpqnpqprsrtmopjnojlmuwxtvwjlmnpqgkljlmljlnkmpmo{w||{utxsrvsrvrtukpokpolqpqvuputwoy|x~xv|suvmoptttmmmuuuvvvrrrkjjxstzuvz{~uvsvxsu|wyzuwsnpvsuvuwxwyvuwwvxxwyutvtsutsupnputvvxxsuusuuwyywyyxywxywvtswut|xwzwtsoxwsuvty~}y~}ytuxzzxwytsuxwy{z|tsuxwy}}}yww}xy{vw~vwwy|}zzzvy{{rpp}xy{uvwx~yxvrqzut~}}}|||}}}lll~~~|||{{{yyyzzzz||tyx|{nsru{zx}|y{{uuu{{{~}|{|w~y{xz{y{|zwy}yyyyz}y|}|{~~}~{|~}}~~uzx}{~}}~|||~~}~~~}|~|~|~{|}y~|tzs|tx~t~~t||pxx|~zzz{z|}z|}z||x}|s{{pzznzzkyxo}|q~|r}sstnptxx|qvynuxjvxkuutwurwuqxsqyrozpmvskrokroorpmpnnqoprpadbiljjmkdigp}{nywbjjckjjpplllmmmjllkpoafehpojpohmlhnmlnnonnmoooqq`bbeggkmmfkjhjjmmmpnnpnnpnnllllllllljjjmmmnnnkkkjjjqqqcccbddikkjllgiigiianj]miWfb^njdrnhtqkkklllooorrrwwwooonnnmmmrrrwwwhmlrxw}qnnkefqlmwwwwwwtttiiiqqqrlnsqq{}}ntsqyxjusivtivtjwudpnitroutlrqjpoflkpvujxwlzym{zn|{m{zrvxrvxrvxnrsostrst~z||x|xp~|vuuq~|pzzs{{|s{{nvvs}}sq~p~}o}|p~~x~wo}{px{tv~{|z||z|{qtr||yzy~~y~~y~y~y~}{}~~~~x~}vsu}~}y~zprpz|}{~|~}|}~~y{|}~~~xx~~wy{prrjkz{}~xy}y{}~}~}~tno{|~xyzuv{||}}xy|{~~|}vyvv}uu}~|y|z|z~z}{~~~yz}~}~{|~yzz{z|tno{uvyz}ru~uxwz{vx~y{|wwwrsp}xuxuzvu}yxxvv}|~qptvttwuuusswuutrqqpotrqxvvusrwtssmnwqrvpqoijicdjYff[e`[d]^bZ_b]_`edfedf\[]edfacdflqdhmbejiioggmnlrehmdjo\`eddjoinolnonpnmojlmjnokmnmopmopgijoqrhlmhjkjiknkmpmolhmjimnmqnmqlkonpqrxwlrqhnmhnmntsphrxtzusyz|}oqrtttnnnooommmmmmlllssswvv~{{rlm|vw|wy|wyrmo}xzvsuvuwxwyvuwwvxxwyutvtsuutvnmoutvtvvrtttvvxzzwyywxvuvtsqpywvzvuqlitsoxwsjki}putots{yy{|{yyz||{z||{}srtvuw~~{yyz{ztu{tuwxxzqqqitrxzzz{vpqwopyrsson|z||yzyy{{{zzz{{{}}}vvv|||}}}{{{yyywyyuzyuzyv{zw|{u{zx}|y{{xxx{{{z}{|{}~|~|{}~}lls||{~}}}}}~~z||{~xut}}~}~{{}~~}~}|}{~|~}|~|~|~|~{z{v|r{s~w}xt||iqqvz{zzyz~z|}y{|y{{w|{t||pzzo{{kyxn|{r}ussq}lmqxy}qvymtwiuwktvrwvrwuqxsoysmzroxuovsholnqoruslomjmkmpnmpnlqocpnitrfnm`hhlrrjjjkkkuwwotsfkjlrqlrqjonlnnlllnnnnppnppoqqikkkmmkpokmmlllnllpnnpnnooommmiiifffjjjkkknnnpppooonnnikkhjjkmmlnnkmmjrnitqfpmbnkgqnkspmmmrrrtttrrrrrrlllpppppptttuuuillotsttticdqnnsssrrrsssyyyzzzqlmsqqtvvntsltsjuserpjwufsqcpnkvtntsoutmsrlrqionhvujxwrm{zlzyqyysxysxymrspuvqtu}xx~}yr~~q}n}{t}}mvvnwwrzzmuukuuiwvkyxm{zm{zo}|ty~t~~wxx{||~~|~~uxv{yuyvx~}x~}zzz~x{{zyy~wxt|}y|}}|~|~|x|~z{|}z{|}z{z{}~|~~}}{|}~}~~z{tnoz{}wxz{{|}~ojk~~yx~x{z}vvww}~x|uyw{{~}~xy~}~zuv{|yzyzvpr~xzvyvywz{}zvxwnqupq||{qrp}xu|urvrqzvvuss~qptwuuzxxwuuwuurppwsrzvuxtswsrqmlwsrvpqjdenhimghrlljYfeZd_Zc\]a\ad`bcbacbacdcehgidfgbjmfknmptijnijnnlrlotjpu_chiiomglkhjnmonmoikljnocefcefvxylnokmnhlmeghkjlnkmolntpuposmlpposyx|tvwmutowvjrqmvunwvyq{tpvmkqmopprsuuurrrxxxssswwwuwwputrvu{~}xxx~}}}xz{}\WYytvvsuwvxwvxutvwvxyxzwvxrqsutvqprtsuqssrttvxxvxx{}}vwuwxvywvywv{wv}xuzyuyxt{|zz||x}|tyx~~~ywwwyygfh}|~~kjlxwyyxxzxxzuvztu|tv}uvxz}}}u~rtt{yy|wxyzxy}wxzvu~}xxwwvvuuuzzzvvvvvvwww}}}zzz~~~yyyy{{x}||x}|x~}x}|z||{{{zzzz|zyz}~stxw{|x{}z|z|wz~~}{{{|~~|||~~~~~~~~~~|}~|zz}}~}qtr|~|~{}~|~}~xz{y}}}t}r}v|kuurzzoww{y}~}}qrvvxyvxyvxxtzxqyyq{{lxxlzyo}|ws~r~~q}lxzrswuvzqvymtwiuwktwrvwqwvnwtnztnztzkromtqwzxlomtwuhkipsquxvpsqptr^kir}{lts[cbpvulllfffwyytyxsxwotslqpkmmkmmtrrjjjgiijlljllfhheggejilnnuuumkknllrppqqqoooiiifffjjjlllmmmlllooommmhjjhjjikklnn{}}jnljpnglihnlkpnmqoiiifffyyyrrrkkkmmmllluuupppooojmmkmmmmmooosqqmkkjjjgggooojjjlllqlmgeelnnntsowvkvtanl[hfjwut~ozxntsntsntsntsntsiwvm{zrn|{m{zmwwowwowwmuux|v}|{uy~y}vto|zmzwo|zv|}puvrwxv{|rwxpxxftsiwvjxwlzxm{ztx}w|}xw|}z|}{}}twuy~}z~|z~{|~suv}vww{zz|}}}}uvr~uyysyx~z}{uxv~|z|}}~|~~yz|}{|}~}~|}z{~}{~~~{}|~z|}~~~yz|}y{{|}~|wx|}}~|wx{|yz}wxz{}~~}xy}xyvqr~yxz{y|{~{{|||{xywiljrvz~~x{|}wx|}|wxxst{|}~xyvmnyztwwz{vx{}{||}{wxtvrm|vpwsrxtssqq|{}vvzusstrr|zzwuuxvvwrqzutrmlrmltonwrqxrtjdeuopqklztujYfg\fb]f_`d\ad`bbb`bb`ba`bfegbdeaiidijhlmceedfggek\_dcinaejfflpjoolngfhfeglnolpqnpqprsrtucefgijfjkiklihjnkmpmolhmlkofeinmqnmqnpplsrmtsjrqmutnvuxpzuqwomskmnjlmnnnnnntttwwwtttopqlvtjtrekjdjhehhytvpkmwrt|wywrtvsuwvxwvxutvwvxyxzvuwutvutvrrttsurttsuutvvvxxz||uvtuvtxvvxvv{wv|xtxwsyxtxzxy{{w|{z~zxx|}xvvnppihj~rqs}|~srtqrsttt~{vw}uvuwystyyyitrrtt|zzz{~~~}|ttxxxxyyy}}}{{{|||{{{yyy|||}}}vxxz~z~{}w}|y~}uww|||{{{y|z~}~}~y{|{vyu}vy}~~{~z{z~y~|{{y~}w|z~}yzx}}|~~|~~~~|}z{zzrwuz}{~~~||~||}~~u|yx{y~|~}~}z}~y{v~~~}x~s|r}v|urzzv~~x|}|{{nosuwxuwxsuuputpxxoyymyylzyn||s~r}uq}tstxtvzpuxmtwjvxlvxrwxpuuoyvlwtiwqclilspnurrusfigrusorplomsvtpsqrwu]jhitremljrqkqpllldddsuunsrjonjonjonlnnmmmsqqonnkmmlnnhjjfhhgiifkjmoowwwkiijhhpnnmmmlllllljjjmmmpppoookkkmmmlllikkfhhegg]___aaikiknkkkiilippnstreeejjjqqqtttgggggglllwwwuuujjjkkklllmmmqqqtttpppooogggnnntttuuupklvttxzzv|{iqplwudqohusivtjwucnlntsntsnttnttnttkyxn|{rtm{zlwwmwwmwwmwwgqqmuu}~y{vzuzu{u}|~|x|}uyzuxzvz{twxtxyn|{o}|o}|hvujxwx{|v|}|~~|~~x{y{}}|~~|}}|~~z|}~}{}|}}twu~z}~y{~}}{}|}{}}z||}}~~yz~~}~~~}{~~z||}~|~}~|}~xy~xy|}~~zz|}z{}wxzzxst|}}xyxst~}wx}vy}vy~~}uu{wvvwuy|zz}z~y|||~}~|}}~}~wrs{vwxx~vwunnz{vyz~~ux|~{vx|tu}|tvqtuq{wrztn~zywsr{yy}|~~{yyywwtrrztt|wv{vuzutxsruqpxrsoijuoplfgvpqkZgeZd`[dbdh\ad^`b``b``ba`bfegbdeaiidijfjjcefbdejhnknsioteinggmrlqgdflkmsrtmopdhihjkdfggijikldffbfgoqrxwynlnlikqmrposonrrqujimhjkhtqjushsqjusitryq{wsyrpvnpqlnolllmmmnnnsssuuuputhvtkxvs~|v~}t{zzvxojlxsuytvytvvsuwvxwvxutvwvxyxzvtvyxzutvutvttvwyyz||vxxwyywyymnlrsqzxwxvt{wv~xvxvrzyuxywy{{w|{z~uss{|xvvjllnmoqprwvxxxzyz{rwvqttppqwvvuss{stvx}wxjusuww{yyz{{uv~vw{uvwxv~{zxx{{~pqtttyyy{{{{{{zzz~~~|||sss~~~x~|{y~}tyxjon|y{{tttzzzrus}~t{v~z|}}{{wuwz{yzyx|zq{}}|||x~|~~~~xvvrpp{{~y{~su}|qvtwzx|}pwt~}~|~|~}}zxv~~||tzr|q~|u{t~~muut||{|ww}tuy|~z|}vxxqvurzzoyyo{{lzyn|{p}{p}{tq}p|~wx|ttxpuxmtwjvxnwzrwznvvnywixtn|xjspw~{ipmrusqtrorpvywtwux{yorpnsqgtrhsqmutZbahnmlllrrrnppjonputsvvqssnnnmnnpklhffbddfhhfhhhjjgiijonikkkkkmkkkiipnnjjjkkkmmmmmmmmmooommmkkkmmmkkkikkfhheggceenppomlronokjqnmwsrzvummmhhhrrrrrrggghhhiiiqqqrrreeemkknllmmmqqqrttprrvvvnnnoookkkoooqlmrpphjjzjrrlvthusmzxjwulywkvtntsntspvtpvtpvtjxwjxwm{zn|{n|{kwwkwwkwwlxxeqqjvvy~sy~u}vv}{otsrwv|w{|vz{vz{uyzuyzw|}r{xgutp~}x{mttz}~{{zz{y{||~~wyy{}}|~~{}}|~~}~}~y|w}|zruy{twu}~wzx{~wwy{zwzy~}{~~{}~y{}}|~z{~}}}}~|}}}~}y{|~~~}wrs}~|~|}~yz{|~}~|}z{~xx~xxzuv~{|~}||ww|tt}~|}~z|x{{uxz||y{|wx|}{vw~}xy}~xzznpy{wzz|{~z|~xywsrmnjrtn}zr{unyutrnmwuuxwywvz~||wuu}}wuutrr|vvyqqwoojbbnff~vvvpqnhi{|tnotnpiZfg]gd_hfgk\ad^`a`_``_acbdihjdfgcllglmdhihkkcefjhncfk]chbfkbciojoiehihjedfgjjnqrjkljjlhijghighihkleghmlnplnsprmjmihkqptutxlmoluslusjsrktsjtrtnwtpvpnsoqrqstuvutttpppssrtttnsrfwtgusjvtkvtnxw}xzqlnwsu{vxxsuusuwvxwvxttvxvx{y{vtv}|~tsuutvutvvyy{~~twvwzyuxxstsvwtxvuwut{wv~ywwvrzyvwxvwzzvzytyxtss}~yww|~~xxzxxztrttuvyxzqtupwvqwvrwvsvvvww{tu~tu}wxvvvr{z{|||zz}xy}xxyz||~}|xx}}|mnuuu~}}xxx}}|{{{~}}zzz~~~uuuv{z{~w|{{qwvrxv}~~~{|z~}z|}}~xw|z|{}zz~vxx{y~y}{{~}fmjstvwxy{|~|~|}|~{wz~zr}wr|p~|uzt~~qxyw~~puw~z}}v|}r{zo{{lzxnzzp}{p|zq}}p|~p}~wy}stypuxmtwlwzpy|mtxpxxnzwhuslyuylspkronposutruswzxqtrvzxpsqpwt[hfT`^dmlqyxflklmmtuurttjonrwwprroqqpppnllokkljjdffaedbeegjjfiikpojmmkllqoorpppooijjlllklllmmkkkkkkiiieeehhhfffikkhjjikkhjjikkwrqwrqojiqlksnltponnnnoozzzmmmjkklllnnnwxxoppijjnlmonnnnnooorsspqqxxxqqqssszzz|||rnoussnrqrxwltsjuskxviushvtiusgrpntsnsspvvoutpvulzxkyxlzyn|{lzymwwlwwmwwozziuuhttpz~p{o{sr~}y||{~}{~~uxywz{vyzuxyx{|{rm{zbpomzzoww}|zxwx}xz~{}~z||{}}|}}}~~}|~~~}}|}mpm~~{~|~}|{}wvmotyzx~v}|{}}|}~~~}~xvx|xz~yz~z{~|}|~xzyzz{}~~z{~xy{uv}yzz{{vw~xy|ux||{{{|zwywx||~{}{}|z||}zvv{|~{|}xx}suwxzqsz|z{z}vyx{zuwxsvwx{wvttqopjxvo{vowsrzvtwuuutvxvz{zzyxxxwwtqqvutxxzrrww|ttyppohh{uvnhiwqrtnotmn^[f[Ydb`j]\f_`i^``^b^]`^giiY\\ehigkleijgijihjkikfhlijn_cffkngmppnwqmxrowsqvkjnnmqokmjfhxsu{vxpkmrqswvxnlnpoqssupuukoomppvssxturmmxop}zmotvzjmpppqqrsrsqqqrrrqprsrtqpsqprqprqrtntunuuntuntuotuooqtrtrvwx|}rstxwywsu{wyysuwqsupr|xzxuwwvxxwyr||s|}p{{lxxjwwrwvqqqzzztttwvvtssuvuxxx|||yxxyyyxzzwww|{{|zz{wxnppx~|swvnsrrvuszxn|zn|zq{yrzypxvwvvqqqsrr}zzxww~|}|x{zwxxs~|y}|{~}}}~wrsvop|xx{|~|}|yy|~wstpmmwww}|}w{u~|rwu~{txsuwqxyvv{nhi|{y~}|y}{~ysu{}|zyxt~}}~~~}|~vvy|yx}}rwx~|||~}}{z|yy{vvx{rywr|zq|zr}{py}ox|dmpjqvow{iwyctsr~r}p}yx~w{zy|zy}{y}z{}y~}u||wt}r{xpwwqyynvvqyypwwmutu}|v~}gqomutivt_jhltsjnpmoquturttrxwnutbomftrZqmaspcpnhpogmlflirwukpnknlmnlpppkjjhhhnnnkllkllgmlkrqdmlbljp|zmtsbihemkipoltskrqfmlcjiemlemlemlfjicgggggdddgddlnnkmmgiijllfhhdbchbdpklpkltnpnllhjjotslrqckjbihhpngnmipognmelkhnmgiissskkkxvvywwsuuqttjlleggloolnlrur{~w~{qzwiqqu~~muthqoluroxvprysv{mpuy}~uyzq{bqnjxvhvusvuwzuvuvv|gsqp|{s{|rz}s{pzp|n~hwvp||u||v{|{y{{y{{y{zxzywyxxzpvwouvqxxt{{v}}yqyxw~z~}{{|zzzyxy{{{|{{~~~~~}~||}~~~|}y~upo~}y{|x}zz|yxoptrr}}nkuw~~}}{}~|{}}}}y}z}|{}x|}w||y|||}y{|y}z~y}vz|~z|z{~|}~yz|~}~z|{}y{ztu~xyyz{|~{|~z{{yyuss~||~xy}vwyy}~}~~y{toq}|~{}}y{yyyy{{mppy|{tyywy|tu}~yxwwwwvxsuxy|vvuvxstztv|zzttttttquuiqpelkoooytuvx}rt~vwtnoqlmrmntoptopwopwopynp`_iUT^edna`jdcmcee_c^^``hjjdfg]abbfgbfgfhiihjihjhhljkoilpjorlsvhgphdofclkiofeiqptwrtpkmb]_gbdrmorqsqprpoqnmokjlruuotspppwwwvqrystwkmwlnrtrtnrrrrrrrssspppuuukjlkjllkmmlnqprprsptuptuptuptuptusrtutv{vxy|{}{xzytv|x{z|xvxwvxxvxqxxpzzlxxkzxjxxnsrnnn{{{tttzzzxxxwwwvvvxxxv{zx|{y{{zzz}}suuxzzz||wyyuzys}p{ypxwy~tzyqssnnnrrrzxx|zz}{z}|wut{yx~|{}||||~~~{|yz~xzz|}~z{z||}{|ttt}~z~xptosxvq|{p}y|vw{vz{w~|{}~}}vxvz~~}v{zz{~}|{}{}~}~||}}}xyuy|}|~|~|u{zowvqyxr}{|pz}ox{wr{~fsufvun|zp~|p~zx|z}{wzx~xzxy~}u{zuyzry|wwvr{zmuuu}}nvvksrnvupxwhpoluthusamkdllilpmnrtrtqsshnmksrdqogusdxugxuhtrowvhmlholotrotrrsqpqoooolllggglllkkklnnhnmgondpndomkxvjrpbjigonfnmeml^fe_gfaihbjibjibjidihdihgjjllltqqfhhjllikkjllikkjiikjjpnnonnsqqnmmceetyxgnmflkfnldlkemliqpemlemlcihaccvvvrrr{yytrrrtttvvhjjnpprttorpprppus{iromuulttmutgonjsplurnpupsvptu|rwuk{tZieq}guto}|wuw{uvvvvz~lutp|zs{{qz}oz~ny}myrk{zp||t||v{|xz{zy{zy{yxzvvxuxyrwxtyztyztzzw|}t}u}|v~}y~}|~~~~~~{||}~~|~~~}{|wx~~~{vuvtt|zz~wt}z{tyrslt{tpklsqs{~||~}}~~{}|y{~}|~~z|~}v{|pzz|~}|~|{z~z|vx|~~~~}~|}|~|~y{y{xz|vw|}{|yzz{{vw}yz}~}~}}~||zxxzxx|zz|vwyz~}~~xxhcesnp{}~y{}y{|||}}}x~}y~wyzrs}wxzxxttttvwy}uvwxuwpkl{|ommnnnnnnrwvw~xuuuwrstvynp|tvz{wrswrswrswopwopynpUT^SR\\[e_^h`_ieggdgeaccdfgddhfimbfg\`agijfegcbdcdh^_cehllqtypoxsoztqzpntnmqedhrmovqswrtnikpkmonpjikonpihjrqsjllnpprrrkkkrppsnoxpq|tusvsurtrrrrrrqqquuummmqpronpsrtonpsrtuuwptuptuptuptuptusrtwvxmop{{rtuvuwqnpurte`bojl}xzzvxwvxvvxowwpxxlvvnyzkyxsxwrrruuuwwwyyyyyyxxx}}}vvvxxxrxww}|z~wzzxxxsuusvvy||uwwvxxptsnttysyxtxwxxyputrtttvv~||~||wut}|}|}|}{z}}}{{{~||z{z{{|z{~yzz{|}{|{|uxv}|zy~|p|zn~{|~|}}~{~~}y}|}}~zyvqp~}~v|{}|xxws~~}y}|x|{w||zwwwstp}~v{|rwxkkk{|~xyzy{rqskqpv{zzvntxv|djnhnrouygtviyxiwup|zs~{uyx{yy|znqotwuv|y}~v}qx{t{{kopmrsotuzrwxrxwsyxflkekjionozxnvuksshmptw{rstsuucihfnldqogusdsqdrpfpnntsfkjinlw|zlomnpnkljnnnnoodddmmmmmmnppflkemlfrpgrpgtrhpndllhpnhpogon_gf_gfdlkbjibjibjicihdihikkdcc]^^eggikkjllhjjikkjlllnnnooaccrttlmmehhvwxlqpkqpiqpepncnlepncnlcnlbhg`bbuuutttpnntrrnpprttlnnsuuwyysvtmpnfkiw~{irohpppxxowvgonjsplvqlqqotrotsx~xjzsfuqiwukyxn|{uvwxvvuvvx~|pwvs{zq{{q{{q}o{mywp}|nzzt||v{|xz{yz{zy{xxzzxzz|}x}~v{|v||vz|w|}v|{||}~~~~~{|~~~}vxy}{{}zv~z~~vqs}xw|zxw|zzxo{lwltpltqltqp|yzxx{}~y||~}{~y~pzzz~~~}wvxvuwyxz{z|zwy{~{~twz|tvxy|}~}~~~yz~z|z|~{}|vw{|||{|~yst|}|}~yz{|}{{}{{|zz~|||zzyz{||~wqrmhj~y{~y{|wy|~{{{vvv]^^tyxw|{y{yqryst{yyssssuvx~vw{sttvuwzuvyyynsrmuthpo|||xrttvzoqzrstnn}~zuvwrstopwopwopynpZYc`_iLKU^]gZYcbfgjomgklbfgbeiadhgindgkdeihgkjimhhlhimX[_qvyovymlumitkhqljpqptrqupkmrnpkfhidfojlqprnmoqprkjl~deebbbggglllhhhplltopsmntlmzoqxlnqqqooommmppplllqpronputvqprmlnvuwrturturturturtusrtqproqrswxostsvw|~{z|zwy{uwlgilgiytvzwywvxvuwqvwqyymwwozzmyyuxxxxxtttwwwqqqxxxzzz|||wwwowvionionwyyxzzyxxyyy{{{zzzqqqnppw}{y||qrryyyyxwjqpu{zsuusqqwuuvttussqoozxx{{{}}}{yy|}|}|}z{}xy{|{||}{uvwrsnjkwuuv|w~{r~ow{{}~||}xzz}|~}~{z~}v|{{}}|x}y}{{}}wz~|stp|~|~~~wwwyz{{{~}vuwyxznppx}|jpojpogonqzys{{oxwktst||lxzsfrpo|zs~{v}x{~|nqorusx{y}~{~v{zpuvry|uz{pvwnstpuvx}~v{|ntsrxwzw}|outmutksrrvwejmrwzrtuxzzflk_gfanlerpfqofonfmlkponpplqox{ynrppnmnlkqnnrppdbbmkkkiijjjhnmckjitrjusdqoemlfnmiqpgonfnmdlkbjiaihckjckjckjbhgdjiejihjjoooikkkmmjllhjjkmmlnnoqqlnnhjjmoohhhjllnsrlqpdjibmkbmkfpncnldomfljeggppprrrqoopnnlnnnpp~`bbxzzsvtmpn_dbnurnwtnvvpxxmuthppluroysnsqpvqfmg{yiqgjzss~p~|sn|{svwuvvtvvx|{tyxv|{q|zo{{o|~mz{hwzdtskyxuv{|w{|vz{vz{wz{uzztxyuyzuz{v{|x}~v{|w|}t}}~|~}{~~{}}{}}~}~|~~uzy{~|~~|~{{{~z{{z{y~pmo}z|~}|~usqz~p[wfj{uzfnctty{yy~|~~yxz~~~}}{}w|{||{}trt}z}~|~uwxy~yz~~|}~yzz{~{||}z|z|z|xzvxwqr}~}~}~tsr}}xww~}}z|}~z{{||}rlmtoqxsu|~z|ytvz|zyytuu|~yqrxrsywwssssusuz{~vwuw}xst~nll~~~otst|{rzyytuuwtvvnoyst|vxytuvqrtopwopwopynp[Zdbak[Zdcbla`j[_`Za`[`abgjhlq^chbejbejccihflljplmqoptbeilqtfmpedmhdolirmkqnmqmlptoqqlnpkmjegmhjnnpqprfegmlnutv|{{xyy{{{tttlllmnnqooqlmwrrtlmumnmmmooonnnooorrryxzpoqrqsqprnlnsrtsuvqstprsqtttvw~}wvxuwxptujnoswxptu{~|{}|y{yuwwrt~y{yvxxwyxwyuz{uz{s|{nxxlxxvxx}}}uuutttoooqqqzzz~~~~~~xxxrrrv|{qwvx{{ruuzzz|||zzzxxxmmmijjuvwsuuuuutrrtopkvtqyxtzxigg{vwzxx~~vttzxxvttvvv|zz|wx{|~yzz{{||}|}{|xy|vw{vw|zzy}z}y~snz}{|{z|wy~vxx||~~|ss{{{z~}~|~{z|txytzy}|x~z~}}{{~~~z|zyyu|{y~{{st~}{z|~zxzxzzwyy|}{y}tyzotuw|}y~sWedhvtr}{w}z|wzxx{yz}{xytx{yuzxy~w||uyzrvwtxyquv{swxmrqmrqv|zsxwkpokqprxwpuvv~nuxxz{uww`fejrqcpnjuslpojonkonlnnsrrrusruspqoedclhgljjlkjnllljjhffeeeflkdlkfqodombomgongongongongondlkemljrqbjibjibjiaihcihchghmljllgiiikklnnhjjlnnmppikkeffdffvwwjkkvttdddprrtyxjon`mkanldqoXecanlhnmlnnuuupppussxvvrttnppxzzPRRqssorpnqohmkelimvsowwnvvpxwltslurjtnipjrzrt|swurzofvop{n|zsp~}ryysxwsuuuwwwxxsvvm|wr}m{zn}lkxwlxxq{{w|}w{|vz{uz{uz{uz{v{|w|}w|}w|}x}~v{|w|}r}{qyx|~~}|~~{}}|~~|||{|~~{||}~}u{zx||~~z|}}y~urq~|{}~}||{wwut{yxz|z|{|mwHJ؁)fr~{||}~||z}x|}~|y{~txw|z}}}}~}|y{y{vno|}}}~}~|vx~z|z|y{}|~|}|}|}z{~}z{z~~~|zzz|xy}~{|yqr}vwz{z{|vvvqs}~~y{~y{{||~}vw~yz~{{|zzwvv{}woo~yzussyzy|oqy{{tuz{znplghxstihgz{zssrvzzt{znutrrr|wyvx{przrsuopxstysttoprmnvnovnoxmoWbcVbcWbcR]^T_`jlqbejZ`eV\a`bgb`gd_jjeplfqkepicnhimjkojkokkohjnadioouomrjhnnjpiejpqruuwddfjjlmnogjiprrbeelonlnnomlnlktrrqoojhjolppmovrtlikmjlpnpihj~cbdonptrusrtrqsqprrqsrqsmmomnrvw{tsuywvvssu|~t|tjqmgnytsybbgxx~jjpvv}nptuyxpttuyxrxvtxxuvztrtzuvwutuvtyvvwwwmqrrxytw{qsxotu|mpqnmonmphlky|yxwv~qpk{vu|wv{vua\Ztsstrrmll}{{|zzuwwmoosssvvv{renvwt|w}vxvx~xyzyywyyz{~|||zzyxxyzzz{wy{}|y{yxwtuvvxw|x~|yy|vz{zz|y}~~xzy|~~~{}~}{{}|ztu~yz~}}||}rpp~~|}~~~~~{|~}~xz}{}x}|z~}}}u~v~}i}zf~z|}|vwu|n~yo~yq|wv{|z{|z}{z|{}|v~|u~|r|zn{ym{yw~|xyw~{z|{||{rywnxvktsnutpvuqwvnur^rml{w}|wttpppsssnoonqpqvuputssqqonrnmvrprmljdfqklpikmgdpjgnkjqonolloloqlpmkmlnnlqpout_gfbjicnldombmkdomdombmk_jh_jh]hf^igaihchgfljafelqpglkhjjgiifhhikkplmnijhcdlfgkefqklmkktrrkkkmoolqp\cbNWUERP]jh^kinvuflkoqqlnnmmmqqqorppsqtwuimjz}{qvvmqrjll\\^XXYinnnvuckjgonjrqksrostusvxrtnmnoxvgqow~}x}|~qttz}|y{{z||qssnqrnuzrz~tmx{mz~pyxtwx{xzuxsvzvxyy{x|}v|}q{{oyyuz{uz{w|}w|}w|}vxx~yx~|}zy~{wzz{}}wxx~{|{|v{zy~}|{{zzsxyzzuyy{}~}~|xz}|~}utp}tjfHYK9_!fn}z~|}~|}|{{}|zy|~~v~||~}}~}}~}}~{wyvss{|}y~zpm{y||w}}|y}|~xzxzxyutt}}|yy}~|}}y{|~|~{wz{wz{xz}xy~yz~~yz~xyw}y~w{}~vz}y|z}z}~wztwyqt|ux~}sv{sv|wyzwy~z|tqrvstwttxtutqqwstytvxtvjegzvxmhjxswzux{vwwtsxtrvnoynpvkmpfh|rtxopwmptjm{psympshkWccWccXddYeeWcccdj`ch\bgTZ_`bgb`fe^jgale_jjdpicnhim_`dghlghlnoshkpaag`^dhflnjpc_dgijqstgijfhijlmjllmoomooprrlnnigfjhgrppwuumjlgchfcekhjwtvplnqnpfdf|{}{z|qprrqsppronpnmolkmqprkmnmnrrswqprtrrtopynsxntx~|vzy~}|uvzjkopqu{|uvvnppsuutuutvvstxwsuztuyutuvttsstuulrroyyrx{ptxquvx|~~}otsxzztus~zrsl|wv{zxtr{zfa`}|sqqxvvzxx}{{zzzrrrxxx{{{zzz|rem|t|v~syxz{}}wx~~~tvvz{~||zzz{}}}~~|}{stvxy{z|}|ssuxzvzvzuxx{vy|sxrw|z}~~~{}~~~{{~}~|wx~||}}}}}~~~||~~{||}uss}tvvwvv}|wxv~}{y~}v{zx}|x~}tyxmf{~z{v|r|q|o}yjxtu||}{}{z{z{zt|zozxq|zm{ym{yv}zxzxuqpyutv}zjxvkvtnvtpvupvvnvscytm|x|wv~{ztttuuuoqqqssotsnrrqrpqrpvrqwsrqlkhcekfgtpoqnjpnjmkkqnnnlmommplqmkmikkjpnrxwkqpbjidombmkbmkcolcolcnl_jh`ki_jh`kickjfljjonkpoz~^cbfhhfhhfhhnppgiiljjlkjjiinllkjiiggiggpnnjjjikkjongmljrqhpo]jh^kis{zglkjllnppmmmkkkrusnrpy|zRUStvtmvvlssmqrehiswwotsltsemliqpltsnvunrsutvlgitprqprnyws{zflkv{znsrtvvz||suutvvxzzuyyr{~tyq~l{}puvuwx~{}wzqu{twwvxvyzuz{pzzq{{vz|vz|w|}w|}w|}u}vu|wu|yy~{w|}z~z||{}}sss}yzzprr|{zzv{|}~t{{|{zuzy|yxt{}{}ywv{yxwuttrq|yyxxx}}}}}}swxxaAU^?9~#nz|}zw~{w{~~{w~}}}|{~||~}~}x{|y~z~~~~}{{z|ytv{}zuwsno}~hcd{zzzxx}~yutzxw~}z~{}wyxywvvzzz|zz|}wsu{xz|z||xz|xz|xz~yz}~xst~yzzx|vx{~~wz|z}y|}vyx{uxzqt|uxzuwgbd~vy~xz|wy{wy|z|yww}{{|zzvttwuuommsnpytvnikytvtoqxrw|wy{||xwzvutlnynpznqtik}rt{oqzortilwlorgjqfiUaaWccXdd\hhXddadifinekpbhm_bgedjlgpidmgblkfomhqstxuvzstxklpijnjmr^^djhnkiolhnnjpbdelnoiklkmnsuvkmmjllrttrttlnnljhmkjussvttqnpokproqolntprroqvsunmovuwmlnqprrqsonponpnmonmotsuqstqrvlmqmlntrr}xyz{qwoekqkpuourqutuy}~jkoefjqst}vyyqssrtttvv{{vqstnozutttrkmmmsrgssmyyox{ouxquvvz|{}~{z|wvxswxvxwtusyxttsp|wvzywrq|wvnihyutljjsqqrppyww}{{zzztttyyyyyyv|xksviqt|u}rxuw|~yz~~~uww}{{~||zzzrttmrq~||xrtyzxy~vw~~~uwy~v{qxqwx~ynv_jjo|}{~~{~|vxv_cdqtx~~~~~|||{~}{~|z{y{|}{{~~~~~|||}|~}}{yy}}}}|}||{uvw|{}xzzz||uyz~{}{~{mzxnywtl~f|qlmsno{vw}u}kuroyws}zu}z}~|~}{z{z{zrzxp{yq|zm{ym{yszwy|zxts}zyszvjwuivtovvnvupvtktqWmhVeamkjxvuvvvtttrttqsslqplqprsqvwunmlvrqrnmqlmnijxsstqmrojonjonjomlommpmonkmjlllnnuzyqwvckjbjignnckjellellemlaihbji_gf`hgaihjonjonotsqvubfffhhfhhfhhjlleggjiiljjnllnllommommsqqommnnnlnnejigmlionemlblj^kiu}|otsdffmoorrrvvvsvtlpnorpZ][nqohtthssqzzcijntuksrltsw~pxwjrrksrnstxwy|wyyvx{{}itrwckjtzyotsqss~}~~xyz|~~v{zp|~p}xslptuvvx~z|wzrv}vyxvxtvwqvwqzzq{{v||v||w|}w|}w|}s{tszuszwsx{|sxy|rtttvv|||~~~~{zz}{z{y~~r||~|{wzxw~}|~|~xsu{yxrpovtssqp}{z|||zl[}_sfZp[v}x~~~{w}zv{|}}|{z}||}}~{}suvw|}{~~}xsu~~xst~yz{|{z||{{ww|{~yxv~y{xmo~wx}~vxxyyymhinkmtqszwy|z||z||z|~yz}~~ytu~yzx}x|twwzy|{~z~|uxyruzsv}ruwnq{tw{vx}xzxvxrqstvwvvv}}{yy{yy}{{vttsnpzuwupr{vxytv}w|xtvzuvzvuwsrsklwppyqrumn{stzstxmptilynqrgjh]`S__T``VbbYeeXdd`chgjoaimWaebej^^dd`fhejlhnfbhlhnjkohimabf`aerswmpu\\becijhnlhnhdiprseghcefjlmkmnkmmfhhnppnppkmmnlkmkjrpprpplikrnsjgilikolnurturtsrtkjllkmonpsrtpoqpoqonprqsqprsuvz{qrvrqstrr{vw}rt{ruxoq{|zuwtsusuvuwxprsnpqtvwzyyvvvsssuuuyyyyx|mgjunnzutsqpnppqxwnzzkzymz{muxquvtxyz|}yxzutvrvwrtutttvttwvrytszutyts~yxqlkhdcrpptrr|zzywwxvv{{{nnnrrr{{{}syyu}~rzu{vx|~}~xxxz||}{{|||xzzsxwx|{~rrryxx{|z{zzz{}}pvkrhkehbdgmbkglw}x|}w|z~|}~~}}z|zz||}|~y|z~xy}{{{|~~~~||~||~|||zz|zz~~}}|zz~~}}}~|{}~}~qooz~x{uxx~x}~q~|u~q~|g|yf{~~ommzyx~||~zpvtx}u{yqwuvwuz{y}{z~zy~yxpxwu~nywm{yn|zs|yvzxutszxwosqmvshwujwumxvnvumutlvs]toeuqtrqqporrrssswyyprrlqpmsrlomruspnmrpomihnllpnm||wpqjqqkpoknmiomlomlpmonkmkkkikkw|{rwviondlks{zhqpdlkdlkemlaihbji`ihbjicjityxmrqmrqkpofkjdffeggfhheggeggllliiiklljjjcccgffpnnjhhaaalnnejinsrionipoenmaljv}|jonsuuikkfffoooqtrknltwuz}{wzxetshvutoyypzznvudlknvujrqiqppxwjopuuwqnpnlnsuvjwut}ippoutqwvqvu{rxwotstyxtzyq~p}tpntvvutv{vx~txuxy|{xzuvwpuvrzzt}}w|}w|}w|}w|}w|}xyz|y}pux~{}upqupq}{z|{~{~nyy|{zrqmwvr~~}ljj~|zzwuv~~}}~uX}VoC3pyj}~}~}~|}}~~|~|~z{|}}}~|{{}}|zzyww~||{||}{|}~|}~yz|}|wx{uvz}|nqwy|~z|~yz~wopjbcwx~xyprrrttzuv~}|y{}z|}z|}z|~yzz{}xy|}~yzrvy}}sv|uxz}z}{~x{y|}vyvyxoryru}|z|zwy{}wuwtyzttt~||zxxsqqrppxvvzuwzuwtoqzuwtoq|vztoqxstyutxtstmnyqryqrxop{st}uvtxshkshktilf[^Q]]UaaWccUaaVbbZ^c]afZdh\fjfjoMMS_[agcgeafieijfkfgkcdhbcg`aewx|dgl__etrxkiojflkgl^`abdenpqlnofhigiilnnqssmoomoonlknlkrpptrrroqlhmnkmroqyvxsprroqwvxrqspoqrqsonptsusrtqprrqslkmuwxtuyvw{wvxkiisnoynq{ruzqtytv{vxutvfhikmooqrcefjlmyyytuuuuuwwwrsskfkx{vxzsr{xwsuuszykwwjyxhtvpx{quvuyzxz{vvxsrtpswsuvvvwvttvtsytsxsrxsrzyztt~zxywwzxxvttxvvsqqeeerrryyyzzzukqxjr|ow|ow|owrxwy~su}~xxxy{{||||}}wyyv{zw}|msrrxwswvz{{zzzz||wztxfm{aizc`}nifcbbilszz|x~}ovs~x|}|}|}}}||~~~~}~~~~~jhh|}z{~~}|~}{{rpp}}|zz}{{}zystrpptyx|z||{}}domjxvzttt~|~~}suv~zr~|u~q~|bxth|~{{yvv{yy~~}}~}~|}{~|}~|||z~|{{zzymutu~r}{n|zr~rzxtywwwuyxwpusjspgusiwujwumyvqyxoyvZql`sny{yxywtttiii`bbnpphmlw}|iompsqijhomlkihomlkjf]\Xvuprsjppjppjpokpnmommqoopnnlkk`aachginmdjimsrhnmchgflkflk`fecihcihcihhnmkpohml`edafe^cbeggeggeggdff]__lllnnnpppmmmjjjdddiggjhhccchjjjongmlhmlgmlckjfnmekjhmlvxxnppkkkqtrpsqnqoknllomdts`poaon`mm`jjjrqrzyfnmiqpjrrksrfnnqtuvsuyxzmpqhusn|zkvtnvu{djisyxu{zqwvsyxs{zq||lyyqwpxvyyvxzuw|rv~uxx||xzvuwruvsxyu~~v{|x}~w|}w|}w|}xylsnmrusw|}rttzzz~~~|}z{}z{{{~xz{zu}}}~zy|~sqq~~~srr}}}jvVpDf/_z>jIKbq|~{~~~z}~}~}~|~|~y{}~{}~~{~~}}}xy}~}~{|{||}~xy~qs|qs||}~{||}yz{|}~|vw|vw|}~xyrwvqssz||~{{xvv~}}z|{xzxuwzwyz{{||xx~yzxstwmp~tw|yqty|yruz}}{~}vyx{y|x{~wzz|zuwutv~~z|x|}vvvzxx|zzfddnllvqs}xzwrt|wy{vxwqv|wywrswsr|xwwqrsmnqklrlmqkllffpehshkthlujmqfibnnZffVbbXddXdd]af_di_jn\gkpuz_`ddbchffkhimkkmklghlefjefjghllmqgjo]]cpntfdjieknjofhihjkjlmnpqkmnmoooqqsuumoomootrqsqpwuuommolnkgllikqnpzwytqsnkmtsulkmrrtonpvuwgfhhgihfhsrtmlntvwklpjkorqsommxstuwwx~vwvqr}xywww|~~tvvprrfhglnn{xxxuuwuuwttsqqeafz}}rtxppvrqnppqvulwwiuupy|rx{uyzuyzuwxvuwtsupswstxvuwussvttwrqzut|wvxsrpjjlhgwuuywwussussrppnnneee{{{xxx{rzxks{nv{nvrxz|tv{|{{{vxxxwwprrnsrqxwv|{v~pyxrxxy~vyyw{|ux}uzahwflfcifoomqero~u}~x}{qvtwt}z}~}~|}|{~}~~~}|{|}~~}}|~}}vtt~||}z~||{}{yys~|t~|x~}xwy{y|}|~}~}y}~s~s~|v`uri~{{{zzzpppyyyzzz}|{|zxwvklj~}}~|z{yywv~zy~}s{zjusr}{kywtq|yjpn{|ztusouskvsfxuiwuiusivtkwus}^xreytyzxrtrlmmpppqsskpou{zkpnlqoehfopnljipqmlmibe_lpfmphpqgpojpnkpojomlsqqpnnnmmkmmmoolqpfkjnrrjonotsjonchgafdgljejidihinmotseji`edchgkpofhhfhhfhhdffaccjlllnngiibddacc[[[ecciggggghjjkpolmmhmlglkekjclkmsrhmlz||wyy^^^gggknlknlknlqtrx{yhxwjxwmyy_iinxxnvurzys{zksrltslvtjsspturqsdefptuixvkxvlywowvs|zkppqvuu{zy~y~x~}w~}r}z{ws~{wywtvvqswps~uxx{|wyywytvxsxyv{|v{|x}~w|}w|}w|}v~wlsnx|z}tvv~}}{z|~x}~~y~~}w{|{}qpl~z~xvv~}yvx~~}xyzuvuwtxryhy^ltW{lw}|z}x}}~~}}}}}~}~}~~~~~}||ww~}}~|xw~}~|}~w{rvvyx{x|{~{~x{x{{yy~yz}~zzx}|w|{|~~zzzwxx|y{|z|yvxzwy~{}zwyz{z{~yzwrs~yz~x{|ux}vy{twy|yru|ux{twx{rkn~xzxz}twzsvytv{vx{y{y|w{x|x||vvvommussxvv{yyuss{vxwrt}upruprtnsytvxsttpowsrsmnrlmtnnystsmnuopxmpujmynqynqqfiZffR^^S__[ggZff_ej[afXcgYeiagl^bfigghffjhhljkjhhhhlijnjkoijnghl_bgccihflljphdjgchoqrprsjlmsuvprslnngiifhh_aaikkqonpnmrpppnnqnpplqolnkhjsprqnproqnmodceutvonpvuwzy{onponpzy{qprprsz{rswqprpnnsno~su~vw~vwpkl}xytttsuuqssrtthjjpqqyxxywwwvvusstrruot}twuw{rrwsrusstttjpqjtttz}rvyuyzvz{y{|wvxsrtpsxstxvuyvtttrr|wvupo~yx|{xtsxvvywwvttsqqrppssskkk{{{wwwsss|rx{nv|nv|px|owrxrtxmo}wxy~}x}|w||xulyxo|zs}{u}|t{z{~tx}syfm}fpfnV]bkuj|G^o\q|v~w|zq{oxu}~|}||{y|z}~|yutz{~~}xy}~~}}{{}{{~~~~yww~||}}rvv}~iggrttxzzt|{kvtw}|utvxwyutv}}~x{~q~|u~o|z^spb{wwwwuuutttxts{zson~}~~||zyzx~|{{zzyt|{kvtkvtq}kywnyvfmj}}tvtqxunxvhxugxujywlywmwuiws[uog{vuxvqtrprrooortttvvkpopvunurnsqlpnstropnuvrrtnnpjorilqenpfnpfnohpoknlksqpsnomkkmmmmpplnnhmlmrqjonlqpkpo^cb`ddhnlfljejihnllqpv{zhmldih]bafhhfhhfhheggfhhmoofhhqssprrprrmmmiggljjmmmnpplrphkkjllinmdjichglrqinmbddnpprrruuulomsvtlomsvtuxvkyxhtuisswyksrhpogonksrltslwuhrrrvxvuwqstrvwkywiwulywlxvpwvnvumutr{zv~t|{u{z{t{z{s|{nyw|z|ztvvqsxqt}vy{tw}vyzwyxxzswxtxzv{|x}~w|}w|}w|}v~ww~yw~{ty|vzz~xzzz||}~~|~~}zz{tyzz|}}|~z|}~kmn~}|{~}qlk{z|~~~~~}}|~ruqryytvqqu\|jw~{xt}y{~}}}}}~~~~}|}y}~}{{}}~~y|vyvy|sux{~x{x{toqyzz|zz||{|y~x}|y~}yxxxxxxuwzwyxuwzwy~{xzz{}xyytuz{{|zxz|y{|~|~~y{}}z}}vy~wzvy}tw}vy|wy~y{}y{lqvz}|~wwwljjvttyww{yy{yyxsuxrt|~ytv|wyuotytv|wxwsryutvqrtopupr|wxlghlfgxmpshkwloxmpshkXddOZZQ\\_jj\gg^chY`dZfj\hlcjn_bejhgecbljjljijhghimklpmnrlmqdeiprwkkpgekliogbheaflnplopfginpqjlnhlkgkjiml^aaillonmmlknmmmllqnppmrrprpnpomoomorpqjjl][]vuwpoqonp{{|iikrrtooprtunnrnnrnmorqqwtt|suzstvoptpqtuurutrvutwwhjjsss{vw}wxytuwqs{uvuoszps|pryppwrqtpquuumrsnuuqtxprvlpqqtuxz{wvxtsuqsxstxvuxzvypnn~yx|{{y~yxwrqkfe|xy|zzyuvrppsppoooqqqvvwxxxuvv{pw{ov~qx~qy~ryu{y{xyyz~~~~{~|x}|zym{yjzxp~|p}zs}|ryxz}vz~v}s~kxez]s[sQlB`tې~zy~szw}x~|}|}{vz{rtxyzx|}{{z}~~||xxx}}|}|{{zyy{yz~}|{{{ursfhi~~|{}{~}|}y|r~s~|q~|nh||||yzzwxwwxwxxyxvuxutzvvurq|xx{yxz{y{|z~||{{~yxv~}mvtp{ylzxlzxjvsjqn{}w{ys{xm{wizwhxukyvlwujvthsqVojbupmpnnqolnnrrrqsssuujonjqplspnsquxvorpoomuxrjneimckoelngmngnnhqplnlkvsrrnomlljkknnnlpoinmkpokpolqpinm[_^^cbjpohmlejihmlfkjjonejintrjpnfiifiifiiehghkkfkjbgflrpflkbffgiisqqtrrooovyyosskkkkllimldjiaferxwlqpnppoppuutoppuxvx{yiljsvtwzxgsrgpplsrglmjoolsrnutipojqplssktsjttotumnpvxzpvwjzwkywiwtkvtkwunutowvqyxt|{u|{v|{npptxxw|{tzynwuz|}wzyuv{tx~wz{tv|vx|y{zy{swxrwxv{|x}~w|}w|}w|}u|vv}yv}{v{~sw{w|}}wyyy{{|||z~}y~}{}}|z~z~}v{|~~bbd~}zzz{wvs~~|~zzx~{~~~yuy{|~yz|vwl~uiptx~|yxm~\g{y}|}y~{~{~{}}}{}{zws~|y~~|~{~|zzywx|z{|zz~~~~}~yz|}{|}w~x~{ov}tz|tz{~}ry~sz~{xzz{zz~yz~xyw}|qutvzyuvvzzzxuwzwyyvx{xz~|~z{{wxztu}yz{|wvx|x{}|~wqtx{zru{tvx{{tw|twuxwz~wz{}{vxxsuz~mq{lp}y{xwwzxx~z{|zzxuuuqrrnpuprvqsxtvtoqrmpvqs|vwyut{vu~z{zvvxtt{wwwtt|wxzorujmujmzps{qt\\^[Z\^_`hgiiikbfk`ckdho^bjcfnknsjjm`_ca`cvuxlkoigkjimkjnljnkimkjja``f`ewovvkvkcmrv{glpcglinrhlqbiieklhno`ggdkllqolqlmqokoomqrmpqlqthlpinqhlpjnrmqrostprstsumlnjnonsthmnlpqkopknoyuwsqrkmnmqrmstopprtsopp{||vwwqutpwvlvuovuxzzxvvxstxstwpqyzuvz|tvvqrvttquutvtsvttvvptsqstqruqrrttttttrrrrrrsrststuuuuuusssprryz{rssvxx~yw|xttom|xt}{qwvvyyz}}tzyysuvxzrtz|~xzztv|yywtuzzzvyyx}|x~x}~v{|x}~zslxxrz{ippxyy~xy}zzDsXHyKHrfjl}wzzz{|y{|}~zxxyzz~x~y|{{|w~~}y~zx~y}~z{x~}{}w|y~z}~~z~}qvu}~xyw|~~{|z~t}t~wuj|yq{zmwuryzvz}z}w|~pvvpuvjpppuvuyytsnzyt}yzuq}yrsssyxkywhzwi~{l}zm}zk{xkywkywqwvruutsusnrtmssnrpoqkmmhmkkqnknlmpnptqvyvkmkmqomrpotrmsqlrpkomepes~rkvlgqhfoiepldnjeifpnmmddwqpinljnlgnkfnkgqnklmmpmkoglphnrlnmmkkkmoogljdkjhnmhiikmmjllnppjllamkamkamkamk`mkdlkfkjmnnjllfffaaaghhkkklllssskkkplmnjjljjeeedeepqqoppnllnllrmnrppgjhjmktwuvywruspsqtxvrvtlpnruslpnosqptqhljaecntqftqiusivtiusmywkwwkvvissmuuryys~|s{s|yt{xy~{ryvlywiwum{yo}{ftr~}|yxw}wy~y|yy~wx|zz~wx|wx|vx|vz{vz{x{|vz{x|}x}}uzz}swwuyz|~z}|z|v{|s||s||{}}{}}~tyxputlqpy}|twwy{{}~~}{qs{}wzy}u}~y}|txw~~|~{|}~|~|~xy~{z}{z|zye~]qs~subwYjGv[xq|}z~}zy}z||z~y}x~y{qr~|~~}{}x|}}|}}|~|wyxzx{wzpkmxtvz|}z||~y|y|}y{~}}zxtv{vx}y{|~|wx~yz~yzzz{|}{{|{{z{{xww|||yxxyzyzxy{qrvlmtmquot}w|~y~yrxuxvy}vy}xz|wyvtvzvxytvvqs{tw{uwyru~wz|uxyrux|zrvzrvtmprppvop~qs~qs{qsrqrqtupstmqrquvtsuumppgjumpvprlhjZ]^]_`\``dfg]`adglcfndgp^aigjrgjojimfeicbftswnmqkjnmlpmlpihlihlhffcaamgljbii]iiakosxfjogkpdhmimrcllaiigpoaiidllmrpquovxxnppoqqlopehlhkoknrknrmotmrshlmxz{qprpoqtxyhmnglmmrsmrsnrsmkmjnnmrsmuutvvz||suutvvnsroxwfrpkusx}|yxxytuxstumnpegrtvxxttvvvntrqtrsvtprrqssqstqstrrrttttttrrrrrrtttttttttttttttsuutvvqsstvvsuu|}{|y~yv{xzw}xunsrz}}rxwz}}mrqyqr}~}xy}xyxvvywwwwww|{w|}w|}uz{y~~tlxxxy~}}|}}zdq{vdarTIU9dquwwx|~|~|~vsu|~~rzyq|{vtyx}~|~}zzz|}w{z||z}{}~z~|zvw~xvur~n|zt}v~}qyyv|~{~vy}uyzquvnrsmqrqvu}{z~}xts~}tttsyxmywizwexuexui{xiwulywozxputuwwtprqmrtmtrnsvtvsttqvtmtqnqoorpqtrvywqtrnqonsqnsqnsqmrplpnmymozpjvkdog`ke`khdnkjmktrqkbb~vvjmkinlhnkenkhqntnptmmwumxtl{xsrppfgglpodjibjigmlhjjnppprrnppkmmbmkbmkbmkbmkbmkfmlhmlmoonppxxxlllfffrrrbbbnnnppppkljhhihheeebddlnnjlllllnllrlnqoonqohkiorp~jmkfighkihkijmkrushkirusjmkdge\_]inlgtrhuserpgtrkxvmyylvvgqqltttyzt~|t~{pyvtzxz}u}zhvtgusiwulzxftrwu{{y{{qtyvz~xy}vw{wx|yz~wx|uvzy}~txyx|}w{|x||x||vz|y}~vz{vz{z}z|}z|vz|r||r||{}}{}}|||~~{w|{{}{}}|x||~}x~}uw~|xx{~}~}xuwzwy{|wy|~|~z|skl}|d?b`~bwHsIj\qxu~{}|}{}z|z}z}z|}~}prz|~~}~y|y~z|~|~z|z|}vy{~slo{vxx{|~z}z~z}{~~y{}|}zvzvuysxzuw~y{|~snp|wx{|}~{|{|{yyssspppxxxsssvxvxvxwy|~}v{xrxy~ysx~x}}x{~uxzsv{vxytvvuwvvxwtvytvzsvvorvor{~wpsx{zsvwpsrkntmpvprslosqqxpp}prtvvxpoqhlmdghfjksvwsrtxmprhlunqgbdojlY_`\abZ`aeijjpqfjoaejfjo^bggkpgjodcgfeinmqqoswvz}|}|vuyihljhlwuueccuotmelrfrnfposxhlqgkpcglgkpnrtlqrtxybghkpqmqpkomlnnkmnnotmnrkosknrlptknrnqulqrptu{}~rqsqprx|}dijhmnkpqoturvw|y{pprjnplstnvvrstvxxrsstvvxyyjrrgusaqndqojqpy{{xstztvyqr{|i^`}oq{}{vwvvvmrqqtrsvtceeqssqstqstsssuuutttpppssstttttttttttttttuwwsuusuurttprr{|z|y|wtxsprmj{xrsslllsttzzznoo||~{uvz{wqrzxxyyyw|{x~~x~~uz{x}~v{|vnzzxz~}|~zyxwx~}rZEFPBQRktsuu~zz|}~}z|}p~|jxvfusi|yn}|strwxv~}~~~vvv|x~}~~~}}}xxw}~~v{z}y~}{uvt~~~vww~{vxxvxy~~|}vxyw{|{u}iuuur~{|v{|y{x|svz}rvwmqrmrr{~|{|z}|~}|~~wxxsyxnywjzw_pmcqoivtmywpyxrxxsxwtvvrqsrmrrntmlpttvnookpnkronqonqoorppsqqtrorpnsqnsqnsqnrpmrpeocpynmunjqlfmhbljktqpsqsqpxppqhhjlijnlimkgnkjqnsilqggrkdnf_zuonncffnsrfljckjgmlnppnpp\^^^``ikkdlkelkdlkelkdlkekjglkikkikkmmmrrrrrrxxxdddppptttjhhihhijjcee^dbhmlhmlikklllnmlnnnrusrusjmk|}lpnjmkmpnqtrfigbfdlomwzxfigfigadbinlftrhusjwuhtrhuslxxlvvhrrltttyzu{zv|ysyvszvy}r|yhvtgushvtjxviwuwu{{y||ux}tw|{|xy}xy}xy}wx|vw{eijostz~x|}w{|vz|x||uyzz~x||x{x|}z|tzzr||t~~{}}{}}{{{}}{||wyynpp}}{}~uz{z}~z~w|{~yvxvsuwx{|xrty|||˛AiHd8y~ol{~z}~~}uv~z|y}z~z}z}y~z}{}uwz||uu}zwy}~{}|zwrs|}}~{|~z||wy|wy|~w{w{~twy|x{z|{~z}{~~zuwyut~{w~}|wrt~y{{}|wy}xy~xz{vw{vw~yz}{{|||pppwwwvvv~rttvvxwyxzy~}w|||v{}w||uzuxvy}vy~y{|wyuxyutvwtvzuwytv|ux{tw}vy|uxxqtwpsyruxqtohkunqvortrrwop|prtvwywtvqqsutvpqrrqsifhwlosilyruyrueac[eeV__WaadmmOYYTY]QUZkot_chcglimrqswghlghlnosdfjrqurquhgkhgkkjnommljjxrwognsldnmqvgkpbfkhlqdhmbghhmnmrsdijmrsprropnonpnmoutwxx|uvzuvzpqupquqrvptvy}~dfg{z|yxzbfguz{kpqkpqdij`dextvpqrjoplttlvvpvtoutsxwv|{puthsq`nlaspapnfnmqvuvqr|wxsklz{vx~pr{vwvvvnsrorpsvt[]]qssqstoqrtttwwwsssmmmsssuuutttssssssuuuvxxxzztvvtvvsuuopnzwytqvqnzur~yvvut~~~}}~||topxyyzxst|{{}}}{{~~~z||w|{zzx}~tyzuz{r||s||v{|w{|~}}xyz{~}pmkRIX82`qy}~w{|}xz|~xuw}}}~u}}uvum{{~|{|yy~~~|x}{}~}|~~|~}xzz~kmn}||}~tvwuyzzv~pzzivto|z{{uz{y}vvzwx|tvwxyzuwxsuvmopkpoxzzvvvqppmkk~~~xzztzynywkyw[hf`mjjsrnutrxwuzyuwwvxxwyzqqunlr|~gjkiomfkifkimpnmpnknlnqotwuz}{otrmrpnsqnsqnsq`i_xyjskipkipmemjpwtpsqomllgflgfljilmklnlhmlkpnusuqpnjkbQRJ{{vbffagfrxwhnmfnmjpooqqqssmooegglnnflkhlkglkhkkglkflkjonjlleggiiimmmmmmlllfffnnnkkklllhiihkk`fe\bahnlhnminmjllkllllllomqtrsvtuxvorplomhjhhkiadbnqocfdrusjmkehfgjhfkifsqfsqhusfsqgtriuumwwlvvowwrvxswvuzxu|yoyvr|yjvsjxviwuiwukywm{y|z|zzzruztw|xy}tuystxtuyxy}z{quv|y}~w{|uyzx|}quv}y}~~wzx{}z|tyzr||t~~{}}{}}~~~}}{|x}|uzyv{z~qvu}xzzx}|y}{~|rxw{~w{~{yz~|~~~{xzwtv{|pnm~}xvu}lPs}xJ-}}|}y|{}|~}}|{zz{wx}~{|}uvvsu~{}tqs}{yx~x}tnsz|ytu~}~ytu{}ytvrmo}w{wzy|x{{~z}|~}yx~vqs|~z|zuw|wxz{|}|}}~|zzyyyyyyooo~~~www{pr~suvxtvwyx}{uz|v{{uzux{ru~wz~y{}xzwyzqttusvwtv{vxx{{~zsvxqtxqtunqyruxqtx{x{xqtsqqtlm|oqvxuwxsuroqwsuqnpsoqtnpuymbecZ]jdgpilZggS__Xdd_kkbnnV]`[`ceknbgjchkejnhhlijnggkZ[_nosdcgyx|tswedhmkkfddoinjbiqeq_Waimr^bgaejdhmcglcghfjkeijbfgkopqrrnookjlqptoms_]cklppqunosikotuyqvwjnolnoqprqprjnoinokpqjnphmnkoptsunpqkpqjsshuulrqoutkqpkrppvukvto}{`ro`omzputytuwrs~vwxyxmozlnvxwrshhhlqprussvttvvnppdfg{}~ooopppooonnnttttttttttttttttttuwwwyy{}}uwwstr~yvytqzurzwzvr}~|vw{||}ztuz{~yz}}wttvuu{yywuu|~~z~~rwxv{|v||~pzzuz{prs~{}~yz|{xlZ\aN:iYUybwqzxu{{|xz{ytv}~{xz}|~~|{ytu}~{}~}~~~}||~~~|||v{rlqz~{uz{~x{x{x{}|z}{~z}vy~|~~vy}wy~|~|{~z}|}{|z{zz{|{|}~{|yz~|}~zzytu{|yzztuxrsmgh|vw{twqtuxwyrwpu~sv|zry~v}|s}zxzrrtrrtvuwvuw|v{}qmrgchyx|}y~~wzxqt}wxwrq~yvtvynp|qswxuop}twvxshk~ptqu~svzwysprsprwtvjgiT__R]]V``OYYXccY]^]_`_ab\^`Y[\VXY`bciklpty[_d`fmmlpjhmihjihklllorshmnpstjnoehiqtuhhlkknmlpoosnmqtknrlnpilnkmrnpslqoinnhmtnskejvqvwvxnmoqprxwylkmihjfegjikonpmlndhlvxssyoourpvtrwrnspptkpsgorgqtsssssstrrvqrwrsxotumrzpvxouwmsvpulmqijnposqmrrlpvs|ljpljpnnponpwwwssstttsssrrrqqqtttpppnnnmmmqqqlrqrvutyxwyyrrrx}~owwyksswu}}y{{xvv{||vw{yy}wx}wxvpqwqr}wxrknvmp{ruyruzuw|xzvvvsssmllzyy}xy~yz}xy}~ytuwww{}}|||}}|wx|}{}~wvx}z]y^tVibqeomuRsRwp|w|wyz}z||y{~~~|||~~~tusxywstr~}{{{yxx|||wvv|zzrpp~~}{{xvv}{{ywwrppvtt}~}~yz|vw|}~z}{rwu~~~~}~|~~}~|}wyz}~wwwqvu{tyxv|z{jllxzz{~~|~~{}}~|zuq{{t{{tyzz~uyyy{|r}}xqyypuvz|}vyz{}~y{||~~|}suuqtvty|w~}wzxtwurusqtrrtr~~wwwtxydhkjnsjnshjodhikmm}}}yzx{|zhkiwzxntrovsnsqnsqlqootrrwuewpdsohwrjvvitstw{{}~wyytuutwuptolqorwumvsoxulwtovsovsmtqipmfmjelielignkgnkgnkhmkmkjkihljiljinlkq|yjurirojqn_camsrdjjlrqhnmmsrjpokpnx}{hljlqojomplqsntnnrceidhlhjnnosuvwnoprutpqrnosstxlnohjj\_]jororvlosrtxtswmmnuuuppptttgggkkkoqrnrsinov{|owwmuumuumuumuumuutxzuz{s{{oyymyyoyyrtulnooqrsuvsuvxwyxwyxw{xv|wt}mkqnmstqwtsyxu{z|o{}u~}z||myxxzyv||z||}}~~x~yz|~~~|||~~~}oqqqss~zzz~}~mmmqqqxzznsrsyxy~|}}~{}}pmo~{}~||~~~x{|}ttjye{]tcxlxxzy~uy{{zwu}y~}~z}~~{|{|xz}wx|}}{|ztyqkp}w|{uz{~x{x{y||uxzsv}vyx{}|~}{}wloxmpy|}y{qprvvxz}y|~}vy||}{|z{{|yz~{||}{|vpq|wx{|ytu~zz}wxyst}~}wx|txvz{}|pu~svy||qipw~}uxwytsutsuvuwvuw|v{yuznjo|{{yrug`cuopsnmxsp~qs~su~suyqrwqr|uxx{odgynq|nr{pszwykhjvsusprifh[ccX^_X``[bbW`_Y]^[]^]_`^`abdeeghbddeghquzcgl`flhflfdiedhiiikljmlmjklrqsjjlihjnlnmlpfeigfjmlpnlppgjsloslopmoroqqmrljnokppmrlhmmjoihjihjpoqlkmkjlmlnknrmpunntmmstq{ljqrpvppvkotgmrhqunnnsssvttxsttopsioylt~px|owzltvnvqrvcdhkjnkglpjospykioljpmlnnnptttvvvrrrwwwooossssssxxxrrrrrrppplqplrqqssrrrsqqmrsmuuqyykssxu}}uww~||{|qklmkkwqr}wxvpqxrs|vwuorwqtzsv|sv|sv}vywwwxxxttttttsss|}ztu|~~xyz||qvuy{{wuux}|s~|rxygw|OrYw:Vo\yQqNjz}}svv|~yvx{xzwww}}}~~~~{|z}~|yyyzzz|}}yyysqqzxx}}{yy}{{xvvvttyzqkl~~}z{y~}vxx{wz|}z||}{}}~}xzzjll}~~{}}z~z}~x}~v~~r||w{|ggixvx}{}u~~vqyyswxzy{tsuz||y{|{}~xz{|~~|~~{zv|nqoy|zuxvtwutwuwwwqssqrtux|ruznqvux|kmnzzzqoomnlvwusvttwujomjqnlqonsqnsqlqopusctpfuq_mkjwvox{nqunpqqssuwworprvpinlfkijsplurs~{nurpwtmtqgnkholfljipmfmjfmjfmjgljnlkoml~|{`^]pnmhsppyvlrolqoY_]fkjglkflkinmkpoglkinlnsqkpnmrpqvttnsqmromqqospptlkqssyrswikluwwvxxppvqrvjlmsuvtvvnqvvy~hhnrpvxtzbacwwwqqpvvussspppnpqoqrlpqnstmrsotuotuotuotuoturwxsxyrzznxxlxxnxxwyzvyzxz{uwxtwx|{}wvxvuyyw}yvqsypsxtv{imrjlqv{p|~wx}~{~`njxv~}x|tzt~~{{{{z{{{{yyyzzzvvvxxxvyyz||y{{|~~|~~~~~~z}|}{{{}xy~~~wuu{zzz{{rttrwvw|{{|~|~~~||}}xuw~{xz~~p~mxckjqp|hyh{g{ru{w{y|xx|}yxv|sno||}~{}~{|uxy{|~yz~z|v{~y~~x~~z}x{x{|ux{tw}|~}y{{}|xz|~tqs~{}|y{{ruvlox|~{}stutsuy|y|}vyy|{~{|z{yzyz{|{uvvpq}wx}wxz{}xy}xy{vwytu}xy{vwzuvxstrmn|wxzuwpuv}~{w|~vyuwodgtls{{vyxzvuwwvxutvwvxztyuotxtynjo~}xtyxqtvorwqrsnmpkhxkm~su|qsvnoztu}vyy|pfjvmp|mqzorqnproq{xzvsujgiQVWTWXVZ[Y\]Y]^^`a[]^_abhjk\^_`bcbdedfgnrwfjo_elhenb`fedhhihmnkpnnjgiolnkhjjfhomolnrfgkijnnptoptypspilohkdac|y{klpklpnnrmnrllpoosnmoihjutvmlnkjledfcbdnmojikgfhhkolnsoouonwqmxkhrqqvppukotlpuiotppptttvttxsttoprhnshp~s{{pxtiqvovghlijnfeiokprlqpmvdbhkiopoqqprtttxxxppptttrrrtttqqquuuwwwvvvtttlqpoqqprrrpponnjops{{pxxlttmuumuuoqqwuu}wxuopztt|vvtnoyst|vxwtvvtvxqt|svrvvy}{{{yy{yyywwxvv}||zyx|{{y}|v{z~wzzqqqv|ys~{}qgcXROE|^q~~~trtzy{~tqs~~{}www~~~{{{|||~~~}~}{|w{|x{|xrso{yy}}xvv~{{zxx{yyywwxvv~~~~{|}~}~z}{}x}|v|{}}}y|z}}xzzzv}qmx~wyy{}}}{}}~~w}|qwvrwv{}~uyz{z~s{{xyzieg|wyz|w~~t~~x}~{vuwutvrtuy{|y{|{}~xz{wyyx{kntlrvkqoz}tywotrsywwyylnnkmnttzqtyttxqst}{{rqqnomtusqtrknlhmkkromrpnsqnsqnsqnsqgvrhusdoopx|{tuyvuwVVVuttstrqupjomlqohqnjrpwnurpwtkroholholfmjgnkfmjfnjfnjhljnllnllywwdbbommdmjholjqnejhacaklljklikkfhhhjjqssinlotrgljkpnlqouotvptvpuqkpqlqws{xv|rqukjnwvxywyvv{qpwklptvwvxwvz~ssxxx~xtztpvjilwvxonprpskilfegpoqpprlprostnstptuptuptuptupturwxsxyrzznxxlxxnxxvuwvuwvtvtsuutvvuwwvxxx|yw}xu~rv{pv{uzx~kpuxtwz|}xsyjvpz~z|w~wv}vt{tryrv|w{{{}}}ooossstvvwyyy{{{}}~~~~~}xytqsy~}~~|||}|vwywwzxx{zy|||xzzu{zx|{rmnifh~|zz}}|~}xz}{yx|~jziwdqlzm{h{j}h|iv~{}vyw~{zy|~|}{~y|z{|}{~uwz{~xy}~|}y~~x|}y~{}vy|uxz}z|y|}xz}}|~zxzpoq~}|~vuwvvx}|~yxz|uxzqtz}~|~uwxuxy{twx{zsv~wz|{|z{yzyz}wx~xy|}yzzuv{vwz{upqzuvzxxywwxwwussjopjnozkouytfjy|ldk~zxwyvuwxvxutvwvxxrwwqvzv|lhm|{tpuyrutmp|vwrmlqli~qszoq}rt|tu{uvqlnqlnqjmulozpr|svolnroqyvxurtlik\\^_^`__aa`babc]_`]_`^`boqr_ab\^_bdebdeaejbfkagnfbm^\cbadfgejkglhitnphceqlnidfheglmqstxnnroptijni`cibengjxuwsprpqudgkorvknrknrmosmlnlkmrprrqshgi_^`edfdcelkmjikjnojnooousr{rnyqmxmpxkmujltehpmoxooouuuywwxsttopphpneovmwsjtqhrtmthjnfgkrqunjotnsvs|ljpusyqprsrtxxxsssvvvrrrwwwvvvmmmwwwwwwuuurrrtuutvvssspnnupqquvlttqyy~u}}v~~vxxtrrztuwqr}}{uvztuuopztt}wxxwyvuwxtv|svrvuy~|||zz{zzzxxzyy{}}yzz|~~|}}z||w|{v|{|tvvxxxxxxtyws~|iuu\{9fehXHoRx|wvx~}zvx~{}xxx}}}{{{|||yyy}~|z{wrsoxyuyzv}~z~~~~~~~||}}zxxwuu~||}}|}xrs~|}w|zz~w}|xxx|}|~~}z||tvxz||y{{~~~y{{z}~w|{inmtyxx}|y~}y~}~{}~w{|v{|s{{|~~y{{~~vyx{x}~s}}y~xuwtsurtt{}~{}~vxxrtunosnqumqvsy~tywnsqtywsxwinmjlmlmqusyuu{xy}srtzxxsnoponqrpnqompnnsqnurnsqotrnsqnsqnsqcomhtqlttty|mmqutvmmm|||txrnsqlqogpm`if^ifmtqpwtmtqholholfmjelifmjhnlhnlhnlmkkljjrppiggnlllvrz~tyw}~knllnnjllikkikkikkgiibgeinlkpnqvtpustnrwqvzsxqkopinvqzvs|nkrpossrtrquqpyooupqutuynpqlktts|zwxs|tkvhfjsrtsrtpoqpoqpoppoqqprprrmqrostptuptuptuptupturwxsxyrzznxxlxxnxxtsutsuutvqprpoqtsuxxz{z~xv|vs|ouzmvzpz}u~jswkvzhuwgsuv~~w}|w|{rylyqq~vozrckdnvmu}svtrzpqynv~v|||www{}}}}~~{}~}y~}~|tuvx~yzsqq~z|}}}{}}|~~|||}~lik}qstqylxjvl{aqfvhxfviq}~xxrr~|x|~vvny~|y{}z|z}z|}~y|{~~y{{|{|wxz{|~~x}z~y~y~z{tw|uxx{z}y|z|~|{y{pnq{z|~~wvx~zy{x{|tv~z|{z|wz{xz{y|{~}||z|y{xzxz}~yzztu~xy|}yzzuv|xx{|top{vw|zzzxxywwvttyvxouv}w{~txrvvyxzv|pmvwvxvuwxxzsrtyxzzty|v{}y~}y~yx|{w|x{yru|}xsrxsp}}rt}rt{st~xytpridfpilvorznqypsvsunkmsprolnjgi`\_\X[VSV][^]Z\Z\]acd^`a`bcegh^`adfgbdedhmaejbgnkhrfdmcbejjilmjrnosoqfacmikhcehegginfjmginlosmosxprngjb[^a^`lijlmqlosknrmptknrfimrqsnmoonqmlnljmrqsihjnmorpsvuwquvlppnntqoypkwsq{lmvhkqnpxru|iltpoorrrtrrxttsppqjplfnh`imgovnwuqwoptpquonrurwysxtrznlrrqvqprqqsvvvppphhhqqq{{{{{{qppvvvuuuqrrnnosttxvwqqqwstxstquvkrrnuuzpwxnuuvzytrr~|zzxstztvxrszsu~xyuwxuwxzuw{rvrvuy|wx~yz|wx|vw}xyy~}tyxtzyuzyw|{uyyvzzwzzxyyzzz|||vzxx|p|{Rux5WjO2:WQ~tsuzy{}~~zzz{{{~~~xxx}~|xys{}v{~z}yz||}~kgg{yypoo~|||zz~~{yy}{{||}~~xy{zy~{|zz}{z}}}}}}y|{~|~~|~~|~~|~~}|wyu{w}}~|~}}~stt{~w}|||}w|{y~}uzytyx}~z}~w|~tyz{}y|}vy~vywzx}~ww|}wz{tqsywyqsuwy{stvsuvoptsvzqs|ns{qvvioliolryvqwuovsotsnsrprslnpsqwtuzqpsvuwywwtpqxwuvwvswuswuqvtlspnsqptrosqpuslqoipohnninovz|ppvposwvxsrsyyy|}{wzvmrpourrzwt~{s~{lspnuripmipmipmgmjcjgemiholholiolkkkjiimkkljkmllaheipmlqofjhoomnppmnnjkkkmnfhilnneignsqlqosyvqvsplovpu{uy}tzwnsplttrypnuoosssusswpqzlmtprvvw|suvdelqnwqowsoyrmuomroosiimcbflkosrwsoqqprqrtlpqptupttptuptuptupturwxsxyrzznxxmxxoxxutvvtvrqsutvzy{wvxzy{{z~xv|vt{ov{lvzoz~ufqup|etwvs||w}|z~v}uzx{wxv~tywxvt}rwuyx||||x~}{}}~vtt{|~~}}}|}}~~~~wz|ux{~y}|yy{uuptmviwfrgtjuistu~x{yuv|z|zzxpx|xxt}~w}|{zyxzy|x{y|{||}|~~}w{{}w|y~|~z}x{x{y|z{}xyzprswyz|{|~{y{zxzxwzy||ux{wyyxyxz{wxz|y|}vyx{z}z|y{xzxzxyz{z{}wx~xyyz|wxz{~xyvqrz{}{{|zz{yyywwpnnxuwippnrsvyy}|txw{~w}xtztt|uuwvuwyxzqpr|z{yrx{uzxtznlpqotqnsx{ysu|vw{vu|wu}pryop{qrvnosmnxsulgiunqxqtxortmpyuwyvxsoqokmlhjP=SfXl_Xe__gY^b^`aa`b`^a^]_edfecfeghdfgccidekbckfkr]`gdhlfhiikledfdcedbdsrtljlnmqlhrhfnebkkipokusnsojptpuminnjoklpgimlosgjngjnjnpoqqppopnnheenijqmmqnnnnnmpoprrnrtlotmptdglklquv{mlpoosnnswz~hmpfhhqttsvvmoopqqnnoqqqsrsppqqpromoprsorstyzquxprulpqpstostrttorrjllmppuwwqqq|wvurqopnmrpmspyvszvuxqr|qt|qutqtsprytvx{tx|twszxtyx|||}}yyyrqqoppw{zrvvrwxtxyvyzyz{ywy{xzz{xzvyvx|vw}}}xzzgiiputtzy{|z{~}}vwxyzws}vr|{{ZrwK?;89>ax}{{||y{{}~|~~z|wzzxz{{|}}xxx~~~{{{{{{~~|z}xx|xvy}||~z~}|}}}}}|}}~{}}xy}~z|~w}|~||}{{|z~~~|~vywzy|xnuvv}}{rzzz|}{x|~z}z}y|x{z~~|~{z||y~|xy{txyrxyu}~wp{{usv|wy}w||x|xzx}zyzx~{zww{ttutuuvwwuwuswrotrotrtvunnmuutvwt}~}~~~wvxutvsyxnvsnxun{xjyucrnlurptrrrpqsqtywgpmhpljqow|z\b`vw|pqvqouplrmgnlkohpmkspsyvrvtqtrorppsqw{ympnhljlmnhkklqpgmlemldmlcokdnkfnkgolcjgXba`ffgiigcdnhiupolihljipomnomwxvxxxpqquuurrsnnngonipojqpipphongophqtiqtjsvemqkrvioskqtnvyfqsbmpotwflpgpsfrtaprgprjqqkopkoomopmopnnpprsmsrkroluprxtqvtpvuqwxmwvqyyqyyqyypxxpxxpxxtwxruv~|rqs{xzonpxwyxwztsutvxuxywy{twxvx{v||r~q}q}q}q}}wys}|{}wv|ut{tr|ts~v~wz{}}~}z||v}|x~v}|}{z|}~~{}}~}}}||~~~||~{|||~~~||x||vyyww}~hcd~}xy|}|}yryhspyjugppxkosr~|{|~zyzwwv~~~v|{w~{{w~||z{uv|}~yx|~{z}|yuv{wy~y}{|x~wxyy}rvwzvyx{}~{|~z~u{y|z{zvw{xw|zy|||wv|uu|||}yz}wxxrs|~y{y{yln{}xzyz{{{zzyyz|}vx{|xyy{z|wwwxyyyyyuvvssswsuwrttoq}wz|vyx{vxuwztv|zzwwwrvwvuw|y{ux|ruyruwsuutuqturtu|~spr{}xuvvrssmqxrtvqrojiqnlxstystxss|vw|wx{uvzps|qtyorshl{qtXDZgXm[Ta[Zctx|_aba`b^]_^]_edf`_acefacdggmccigfoekraejaejjlmikljiklkmpoqutvhgikjnmjsifoebkjgpmjsrnsnjoplqplrokpilpejmpuwkpsinqkopsuuikkssspnnpklrmnpnnnnnkmmmoolosmptruytw{tw{ruytrvpptpqusvzjnrikksuuvxxlnnrtteeeZZZiiiiiiuuummmrqsrqsprsuyzqvwnrsostptuostostprroqqmoonppsuuooovqpxtslmksxvv}z{xt~yxwqr|sv|qtqnppoqxsuzru{ps~uxrwvsuuuuusqqojkfffuuuuwwx}|tyxqvxrwxtxyuwxzy{}z|vxvwuw|uv{{{vxxsxww}||wx~xy~~}~wyxx~xu}z~{{YkqdJGP3KMWev{y{{|~|~~{}}vxy{}~z|}~~~~~~~~~~~~{{{|zzyyyyzz|tt{{~{{||{}}vxx|}}z{|}z{z|~~~y{~uzy}{xyywuu}{{}}~~xvv|{~x|}y{|yxz}}~ypswnqx|}rvxx|}|w{|{wz|wzxzy|xzy|~}y{xxzy}~xsuvy}~x|~t||wr||rzz}vtvysu{{x~{||yvuyqptoos|{~~vuyvuwvvvvvvvwutxrmrpqvty|z{|z{|znokefdmmmutvsrtoutnwtitqbplixtesoiqnjmkrppwxvtxvlspjqnovs\a_hmkvxxuvzqptllopjnpophqnlspfkijompsqnsqsxvhmkinlfkjqssqssinmgmlemlcnlaokcnkenkfnleli_gfcigjkkwrskefqlksonywvsqpmnllmkdddzzzwwwssskkkemlemlfnmfnmemleoohrrhrrbmlkuudmlkpqjrrdnngssbnnnssdllfppdrqbrqnxxlttmrsjnomopnpqjlmnpqoutjqnhrlpvqotrsyxowwnxxqyyqyyqyypxxpxxpxxquvlpqorr|{}{xzrpr|{}xwyxxz~xz{xz{xz{y{|vxyuyzr}s~s~s~s~~~{{|y~|}yz~yv|wryts}wyvz~}~y{{|w}|}|}~~~~~||~}~z||wy~}zxx{yy~~~||}~~~~~||xw~szovvkvhqkqjnwu~{}}z{zxxx{~zx~}w}}~{zuv~~zx~{w}{z}|~z|x}z~zw}x|swvzw{|z{{uv}~ystv~|z{~yzusrvts|xw|{{ss~~~|}yz~xy{vwtvvx}xzz{{|tttttt}wx{|y{xz~tvwyxzxvv~||uts}{{~{}~y{~~y{|uxvxsuz{}}wwwtxyxwy|y{}ruzruxsutsuqturtu|y{sprxuwqnptqsxrwwrt}xyuqprnmtnovpqsmnxrtystvpqshkvknshkpehrgjkWnfXld]j\Zd[`c^`aa`b`^`_^`cbd^]_cef`bceekbbhgfo^dkhlqkotkmnhjlnmohhj`_avuwnmowvyljpkiozy~rpuigmplqkglrnstpurnsfloahkfmpipsfmphnokpooqq}||mkksqqrmnpnnnnnkmmlnntw{orvmptTW[mptdgkxw{qptpqunqukpskmmy{{dffnppqssvvvmmmzzz{{{iiidddpprutvnpqhlmmrsmqrostquvostostprrlnnnppuwwvxxtttsnmuqpvwuv{ymtqurnxts{uvy|~uxtsuqstomotnpvnqzruqsssttusstrrtnptttxxxtvvw|{sxwrvvsvxvxxvxyutvyuwvxz|uxuw}uv}}w}{w|{}xyyz~~}xy{}||}z|zyrseqx]xL[nmcXNW{}|}}~|~}~{}xz{~|~vvvvvvzzz|zzww|rr{qqwwv{zw|{}vxxyz{{}}~~||~xyxyz|{}uzy|z||xvv}}|zz}}~~|{~}~{|~y|xqt}vy}~wz{z|}z~~|~~v{|z|}vy}vyx{~wzx|yvxtvvtxyy}~{swxx}~zypwwoxxw{|pnpzuyzx}~zy~trxsv{ruyhkoz}qtxvuyvuwvvvvvvvwutxtqvtpusmpntustus|}y{|zvvvwvxutvntsnwtitq_migvrjxtjqnikiwutvvt}~hmkrwuw|zhmkgljptupswnosmkpmiopoqmtqmurfkimpntusdkh]daovskroeli|~~wyyhnmhmlgmldnlaokcnkenkdnjipminmceeeeehcdmghqlkqmlsqpnlkuvt|}{|||ooowwwtttnnnemlemldlkdlkemlgoojrrjrrlssrzzbjjkpqlqrkttr{{bnnkpqiqqhqrdrqbrqeooowwfkljnomopnpqjlmsuvtzyqxucmglrmlqou{ziqqlvvqyyqyyqyypxxpxxpxxlqrrvwoqr~}xxztruxvxyxzyxz|z|xz{xz{xz{xz{xz{x|}u~}u~v~u~v~~{}~zz{wz{wy}wx~yz|u|ww{v{|~~{}}|~~z~~~y{{vzz|u~}{~}}~~~~}{{wyy~~|wy}{{ywwxvvxst{|{|~~~w~rxnuipr|qymvlqlpvtz|yz~{z|xxx}}}z}v{|yv|z|y~rlq}xy~yz~zz}y}{z}||zz|~}y~|x}zy~x~txtx~uyvzz}~}~rz~}twzuv}xyqon{zwoo}uu|tu|}}~wxyz{}~y{~z|xy~wqr{|vx{prtv|qszuv{|xst}~wrtjeg|~|~zuwwpstv}tuysttrruuutxyxwyyvx}ru{ruxruusurturtu{xzmjlwtvvsu}z|uotrmo{vwsonnjigabmghgabuopuoprlmtil|qtuxshkpehnZqeVk_XeVU^X]`Z\]`_abaccbd`_aa`bgijacd__ebbhdcl]cjfjp_chhjkhjkigimjlpmotpr`]_gcejhnnlrigmigmomsplq}y~plpminokprwzmvyeor`jm`ilemmtyxlrptvvkkkspprmnpnnnnnmoolnnkpslqtmruinqpuxbeikjnposrswloslqtmooz||hjjwyysuusss{{{wwweeekkkpppnmoutviklmqrotuostostptuostnrstvvlnnmoohjjlnnooo~okjuvtpusmtqxwsokjxsty|}tww{|x|}vyzpnpvqsqkntsswuuvttvttwuuyyyrrrwyyuzyqvuquvrvwuwxyxzxuwzuwxzxzxzxzxy}{{xvvxxxuwwx~|}~|}sno{}|}{y|{y{gvNrH{A6{7r@tDo\uz|~|~}|~|~|~~|~|||{{{~~~yyxxwkkymmuzyy~}~x~|w|{sxwtyxsxww|{|{|x{|~{}uwwxyy{}}{yy}}{zwvz~z~xuw{~y}zsv}}|~}{}|{}|z|}y||wyz}|~~}z|}xz~y{}xz|wy}y{tsuqstquvx}~t||qzyu}}xs}}mttptuswxnpqgdfxwzxwxonqw{{swxuzz|osttswxwyxxxuuuvwuuytsxvw|zwzxstrrsqtuqxywvvvutvsrtoutlurmxuftpgvrn|xlrpnomuqpsqpoqortrqtradbdigsxvilmgklnppmppnkmnmnovspusnpnnqonpn}iomlspjpnkronookjjhjjhmlgmlemlaokcnkenkdmjkrohjjcccggg{vwmghojiqmlpnmpnmghfopnuuussskkkooopppgonfnmdllemlgongonjrqjrqhqpnwvhonlqplrqgponzxfqngmlqyxjuscqoctqissowwejkjnomopnpqikllnocihovsblfoupnsq{emmoyyqyyqyyqyypxxpxxpxxmqrotvuyzsuvwvxrturuvwyzvxywyzwyzvxyuwxsuvuwxy|}y~}x~w|{v||x}|z{y~|}{{|z{~||}z}v}zs|yx||~~|~~~~~~}}zzz~y~~yww{yy~||~~tvv~}zwy}}z||y{|~}{{~~|}{|{|v~sxosrvrxqypwosjlsq|{{|}yxy~|||uzx~u{|w}{u{z}{ojkz{~zy|yu}{z}|~|||y{yuz|y{|y{|~~{~}z~{uyswvy{uvz{z{}~}~tz{ru{vwwut~}nff|||tu{|}~oghwln~~suwy~|}{vw{{{{{{rlmyzwytvuwwyynp{uvxrsztuyzystrmoz|}xz}xzvprslozqr|uvz{mkksssrvwwvxtqsy|vz~ru|ruyruvsusturtunkma^`pmopmoifhlfklgipklpljplka[\jdea[\pjkrlloijladncfqfiwlok`cfRi_Pe\UbYXaTY\Y[\bac_^`YXZUTVTRTVXY^`a\\beekdclbho`dh_chfhicefnkmmjlolnqnpusunkmkjnnmqnmqonrlkorns~zplqplqmintx{ovyioqdkngmphoojqplqpjkljllppptopommpppkmmnppotwfnqmtwjqtmtwlqtmlpqptvw{gjnkpsmoouwwnpprttsuusssvvvpppnnnoooxxxpoqyxzqstostptvptuostnrsnrtostdffhjjnppjllkmmsssvrpxtsvwulqoovstvrupq~vzunqotupzypwwuuwzxzyvxzuvzuvvttxvvwuusssrrr{}}uzyrwvptttvvyxz{xz|~|vxuwx{~{}tv~|{z{zz}~~{}}~xy}{{topujl|}wuzyzvvzavXvTGrWyVuYtds}zwy~}|~wyzxz{wyz|||}}}|zz||xxznn~~{x}|rxvsxwpvugmllrrzv|{~zyyuw~y{z|y{{suuruu{}}xyy~||~~~~|{|{~~{yyxw{~~{|~nmo~{}zwyz{}~|~}~{z||{}~}|~~{}zxzzwyxvxyvx{y{{|}vxympqlppy}~kvv~t~~nuurvwptuuvwwyzyxzvuvzzy{|y{{zturuvuv{|y|}y}~|y}~vuywvxxxxtttuvttxssxvkpnpsqwxvnompqmvwurrrvtvpoqekjgpmozwhvrfuqiwslqossqhbankjppnrporqplnlfkijqnjookpqkopdfgbadhiiotrnsqnqonom~|{jnluwukomjljgkiihhlkkjkkjllhmlgmlaokcnkenkenkholpoorppsqqsnopklsnmrnmqonkihopn`a_mmmrrrnnnpppooohpoemlfnldlkdlkhnmkppmrrgmljpohnmkpolqprxwjrq`kilrqzgrpbpnctrkuumuulqrjnplnooqroqrtvwoutw~{hrlpvqotrqwvowwoyyrzzpxxqyyqyyrzzs{{ytyzvz{swx|~{}~oqrvxyvxyvxy{}~z|}xz{npqsuvwyzz||y|||~~x{{tvv~|}z|}{w{xw{yx}{x|y}~z|||~~z||}}}}~~||}}|zz{}}~{}{yyxst~~z{xvvwwwvxhlkox{pupxswjksq~xxv~}~||~yzy~zy~z}xst~}|{xt}{z~|{~~xuw|x}|y{|~{}|uyuyx|w{x|{~ztuztu{uv{uvw{qwvmpwrsvqrxvu~}~~yx{ss~vvy{z|wy~rt{pr|tuwopyzyzwopwxvqrmmmwwwwqrzrswlntvxzwy|qszrssklwx~vwxpqsmpytvwrtpkmrmowrtz{ytu}~qooommptupoqvsu~sv{mq~pt}ruxpsxtvtsuqrstqstqsgdfsprifhlfkojlrmnnjiplksmnwqrtno~xyoijrlmtilshkshk|qtvkndPg]NcWP]WV_UZ]VXY`_a`_a]\^VUWSRTY[\^`addjbbhcbkX^e^bg_chiklgijfcemhjfacjegkfhebdihjjhjjikjikmlnokptpuqmriejplpdfjkorcejcgjmoshmnhnmhnmfkjikkoootopussqqqprrmoopvymtwnuxmtwnuxmrumlpnmq~cfjmrutvvuwwhjjnppprrpppsssmmmpppnnnyyysrtzy{tvwrvwotunrskopjnoostquvfhhhjjlnnlnnnppsss|wvuqptuspvtnvrhievwuljjsnptlomvvhtupyyuyzmoputv|tv{tvzuv{yy{{{yyyvvvy{{txxrwvqstvtvzwyzwyz|{~wikps{~y|obdtoptopywwzzzuuuxrsxrrzxxupqvxyzvtxvzxvco_pZrLdat\nbrowvw{|xuw~}|~|~{}~mopz|}z|}{{{www}}}}}}}{{||uu||yoo}}y~}w|{uzy}qvupvu~zsyxqwvy~}zyyy~|~xz{}z|~~y{yyy~~~~~||{yy|z{z{yyvuw~}~}|~~{}}}~{~|~vyzwyz|}{}wyzwxyvxywwyw{|y}~uyzuyz}ptuhvutlxxnxxmuurvwyz{vxyxz{vxytvvyzv}y|}xvxruvqyzz~}}|||~~{||vvzwvxxxxwwwwxvuytz}sxvtwuqrpmnlrrnuvttttttvvuwntshqnt|hvrftphvrnrprpowsqtpoqqotonronopngljjqnmutmsqlqolrqwzyvxxntrprplmkrpo}{zuustqpyywolkddbkjimllkkkjllhmlgmlaokcnkgpmenkkrormnqlmztusnorlnvqptporporpoopnijhjjjmmmnnnpppooogonemlfnndlkfnlkqninlnsqnsqchfmrpmpnjpnlspahenwtjqnfolhsp`pkfwrgqqgoolqrkopmopprruwxlnokqpholnxru{vsxvrxws{{s}}rzzpxxqyypxxowwnvvlttpyxtyztxyw||w{|ptusxxtxztxzz|}y{||~x{|}|||||}||}}~}|}}}}{zzxzzw}|w}}y~~{}}{~~|~y~}}~|||~~}~{z|~zxx~||{||}~zzztwjlvwprquvwv{uxopzwuu{tsv{z|~}}w}}|y~}ytu{vw}||~}}{z~||xuw{w|}{{|zz|wxztuyzx|txrvtxtxvy}wx|vwvpqvpq}~zmurhnvmpqlm~{yxmkjxts{zzz{{uwtvvx~tvuwz{tlmxpq{st~qqqvpq{stzoqz|~sushj|qtwlnz|xmovx|uxz||wy|wyxsukfh{wxrppnllvttmkkostutv~{}y|qu~pt{nrvmpvprvtvqprtqsroqlikzwyljlwqvzuw{vwvrqvrqtnnvpqtnn~xyrlmtnoxmpvknqfi|qti^aaMd_Pe[TaUT]X]`\^_bac^]__^`a`bcbdbdedfgeekccihgpbhodhm`diiklfhhhegmij`[]facmhjuqsmlnfegihjfegpoquqvokptpugchrnsrrurrvkjnffjposkmngpolrqqvulqpjllpklwuuvvvmoolnnbilgpsforluxjtvkruonrkjnijnjmqnsvqssprrbddnppkmmjjjqqqooossswwwoooqprlkmoqrmqrjopnrtimneijnrslpqjllhjjjllmoooqqqqq|wv{wvuvttywnurtxsrsqvttxsu{vxlxx`onannfnnkoppnp{ttztttoprpplllssswwwwyyrvvqvuvxyvuwwtvzuwz}uknqs|iluxy||oqystzuv{|yyysssz{}~{|{prwxsqtruw{s}xqfoeocneofncmfqovz{~yvx~}y{|kmnvxyxxx~~~{{{zzz}}xx~~{sswwv{zuzy|v{zrzyv~w~~xyy}{}vqs|~}|||~~~~}{{}{{{z~zy~~}|vz{yxz~}z|tsux|}tyzz|y{|sw|{}uyztxyuyzuyzw{|x}~v{|rvwz~ykvwnxxv~~prsz|}vxytxyuxxx{r{~u|vz}twzp}}}wx{|yz}zzxvzwvxvvvwwwwxvuytrwuqvtsvtpqoprpttpuvtttttsuxwyqwvhpnt|hvrdtpesopsqpnlyqqwrqywv{utwrqrrpotripmnvultskrprwvikk|~~psqnrpopnywv|xwvqpvpotonmfflhgpjlqklkkkllljllhml`njbnj_heajgipm{uv|vwxrsupqtopzy|xvvtstrqkljhignnngggnnnpppooofnmemlhpndlkfnljomhmknrqmrpbgew|zlomjmklqo]daqzxlsqfomcnk_nkfwsgqp^ffinolpqnpqprsy{|oqr~szwnxru{vtywpvvowwmwwrzzpxxqyyrzzpxxpxxkuuovvtxzsxyvzzvz{txxswxvzzvzzxz{uwx|~z|}|z|{|||}~~~|}}z}}y{{x}|x~||~~x~}~{~{{{yy}{{rrr}yww}{{~zzvvvxxxqyxxrsoqmnz|uzsvpq|x~|{xv|{z~}z}|x~}x~u{}~~x}~y{xstupq|{|zy}}}z|}y~~|||zzzuv{uvxyz~y}z~{z~z}|}||z{{||u{vyrmn~yz}|~|{}|}|||zz{nprtvx~qssuztuuop|}z{~umn|wxppp{uv{|uw~suxmovxwln~qs~qswyvx}pryru~y{}qlnjfhpppussyww~|||yxz|y{vyw{rv|nrrilxqtwtvrrtwtvpmotqs}z|olnysxxsuyuttpovpqvpqtnp|vwtnovpqujmwlo{pswlotil_MbaSfYQ_UT\Z^bY[\a`b^]_cce__a\\^`bcacdcchaagcbiagmein_cgeghcefjegohkkdgqjmldhpjlmlnnnponpeegrprzv{minnjogchurwsotidjniomhnojpnmoipoksrottjooikkqlmjghhghlnnkmmqwyv~ktwjtuhqtjqttswwvzwy}ehllptprqsstfgglmnpqqqppssskkjmmmrrrqqqxwypoqkmnjnpkpqpsttwxw{|lqrlpqlnnikkikkkmmnppmmmvqpxvsqsrlrniolvzvrtrttt~y{|wynyyfuuittmvvswxxz{~rt{stwrsussqqqtttxxxqssqttrvupqruuw|y{{vxy|xpsvhj~mpvyrttv}vw~xyytu~||xwwztuztuvstxssynqxywvxwzrswysgofjioqt`djrhrlrtt{xz{xy|~~{|}z|y|}uxxuwx}~~kll|{{zzzzyy~~yut~}zut~yxx|{w{zw{z|{~~ntshpoltsu}|w~w~}{||}|ytvupruprxvvzzz{{{}}~~~}~~{}~{xz{xz{rxyt{{}z|z~}{}uyztxyuyzuyzx|}w~~v{|z~y}~|m~}qsr||mvvprslnortuuyzx||qtkqtk|vz~tuxo~xy{|wy~xyyvzvvxuvvvvwtvtqtqjomntrnrprsquvtuwrtustuuuuvttvmtrgpmr|yhvrdsoernqtrnkjzrrxtsqnmvoovrq{zxkpnjqojrqjrqlrqinmfhhqssorppqomjizxw}yxvv~ttuv~ttxooqklqkmmkkllljllhmlbnjdmjirnjro_ebxpqvpqztvwttrnoplkkgfdbafcbghfhigpppfffnnnpppoooemlemlhpofnmdlkgmjjpklqmkqk_eanuostomqkqwrahcoupqxsismcoi`pidxpisrX__ejklppnpqqstyz{kmmglkovsakeouprxvoutqxxnxxrzzpxxqyynvvpvvqxxmvvluuqyytyzswxtyzuz{rwxuz{uz{wz{qstz||z|}|{}||||{|||~~~~}~~~~~~wxw}}~~~xzzx|{y|||~~~v~}{}z|~{}|~}~}~}|~|{}|{{~}}~~xwwpmm{vwz|{||}{|z{~}{{wvvlzyyrqxynortrwnqmmplsr|vu}}z}||~}}w{|~|}~z~{|~x}}{yx}{{}z|{w||||}~yzyz|}|~wztytwvzy|{tuwpq{|u|~tz}tw}xy}xy~{z~|{zvt}|}wv|ttvx~rt|~sutvxqrslm|}{uvyzwy|~sqr~wyxz~tuz{yz}~{rsxy|~uwxzwikxptytv{vx~y{~milrrrxxx{yyqooqkltwxvuw~z|zpsvzqvuxz}~x{tqswtvroqpmo{yz{yzpmounsvqsqlmsoowsswrrvpquopztutnovopvknvlo}rusilrgj`\eSOWign[Z]^^`\^_Y[\Y\]UZ[Z`aY]^`_aa`bc_akfj`Z]ifijhkgdfhfhfdfd]`mdgslotoqeacgeggjkgkladeeijimnkdiokplkoggkklppoqfcdnkmolnnkmnlnknoorsppuiioffnoenpgmzsyplnpmpjjkmqpioou}|dpobkjrqsutvcbdssttuvsnrsnstosjej}y|{rvtqsjlngkluwxutvsuvsuvmopklmlmnvrtxuwrstlmnvwx`fe]cbekjjonjpnkpn}zx|vnrkrupzyytrryvvyxx~|||~~~|xyzvvvmnvmnyps{stuqptrn{ywxvvsqqwuuwvvtssxuwwtv}z|qnpvtv{wyqnnmjjxyz{vwz|}~zuw}wzv}zv{wx{zy}xtx|v{|vz~xzyvw|z||{~~pnhihknpgfmoklom{t|q~yrxvxtsuoy|tx|qw{rv~v~{{|{|z|}xtuz{|||t{zuzyuyyv{zzyyyxxsyxs{zt|{u}|u}|w}|{||}~{}zxxuttyxw~~~~xvvuss|}~~~|||{{{~|~y|}ywy}}}}~|~zz|{}~y{|w{|v{|x{|wz{xz{wyzwyzu}}xto{{t||y{{vxxvxx|~~zy|zy|~}~}~~|x{xsyyuyzuzzvzuxyrxwqwvrxwsyxtzxwzxwzxuusqonvsrqvtptrnsqimkqvtuqpwsrutsrusourntqqrprnm}|yvurusfoikspqyxgnmemmiqqhpohnminmkmmnppstrnomusr~}~yx{uqzw~wt|urtnjzyvsqomlomlmnllnlhhgihf}|tpoupoknkknlgigoronpnppnhigghfkljlmknpnkooqwvgonfpocmkaihgonltsqyxgonglllsqjpohnmekjafev{yfkjnpnoqolkjpqodmj`rn]vq[wqospupprpppsqntrtzxxut{|znsqkro\ebpvqqvtotsswxrvxrwzqx|pz}gorprvuv{lqtlqtsx{ty|uz~y}|z||rwvy~xmrprus}~||w}|w~{v|w|x{{{{x~z~}~~zzzzzzzzzzzz}}}}||~{lonx|{~~~||vqpu|{u}xz||y}|vyy}|zy}|{zx|zy||{xuwzuy|v|gqjqjrrynuqxxynlmlol}~|{}}}}~qppzxyz{~xz{}{}{|z{{|vst{xzwtv}~z{z|~{|}}xywxxywyxw~sii~~yy}wx~xz|vwyz{|}~wrs{|~yzwrsz|wx{}~vwxz{vw{vw~xtu~y|t{{x~x}~xz}wz}wz|vx|vx{uxz}vpsupr|wyxstzuv}xyupqwrs|zzwww{{{sssmmm~~}}yz|yy{vw}xy{vvxuuyvw|yzxvvtrswqvnhm{uz|v{vpu{rsumntloqlouptupuurtrmnsmnriiyrpvopsmnwpqoijohi[XaSQWb`fa`bYXZ[]^XZZX\^TYZYaa\ab`_aa`bgdfc^`xqtnkmifhhegnkmebdg`cofiqjmtoqdacdceeijeijimnimnjnoqkpplqlkofhljjnmnoooqkjlnopnmollnmopnpqppvffledmpeongnskrsnpolnooooqqjpobjibomfqokjlqprlkm|{}xwyxrvtnrnglmfkb[`ulosproqrlpqprsqprlnomopmopkmnlnoytvwtvpoqoqrtvwceeeggoqq{}}lnnuxvosneidz~ymqllpk~~nllussussywwooosss~yzxrrtv|qsxpqvpqyutwso{zv~||}}~||ywwxvvvsuyvxwtvxuwtqsqnp|zz|zzxrsz{|tuz|~z|x|z~zyz~zy}zy}~x}|v{}xzxuwy{|xz{ppmokmmokirspsolpjyyo{wovvwstvpx{rwzqw{poxumyvz{yxx}wx|}|}rmn|wx~}}u~}~syxqvutvv{yy}}v|{t}|u}|u}|u}|x}|{|xyzrs{stz{~~}}}{{{yy}}~~ywwxvv~upqwrs}xy|}uss}|||{}~}~~}|~|x}|mqp~}{{z{}{z|xz{y{|w{|v{|y{|xz{y{|y{|y{|vz|qyyus~~u|}xzzxzzy{{|~~~}~}}|{z~{w|wsxwsx}y~xtyuwxsxvrwvnsrotsputtwuruspqoqonwsrpusntrpuslqorwutppwrqtrpoqonrpmtqijhuqp{vurpoknlismlurw~bjjmuudllltshnnfljeggkmmrsqkljmkjzvurmlmfcib_f^[lebqjg{vuvrqpnlomlmnlmnlwutjfeulmqiimpnnqotwujmknqoopnopnnomnompqoorphmlpvudlkfnmdomdljfnnhpockjbjifljjpnhnnhnnflkekjqvtinljmkpqopnmnpnajg^pl]up^wqoqornlsqporpnurrwu|{~}otrelilurmsnqvtrwvw{|rvxpuuqyytgqqsuvtvworsostrvwtxxuxyy{{{}}qvuw}|t|{rwu{~|uytz|vz|v~{v~{v{vy~|zzz|||zzzzzzzzz}}}~v|{{~{prrrtt~}~}~||~}}~wrq~yx{t|{v}|u~}}}|~~z~~~}{z|zy}|}{z}}}{xzvpuuotvtlwu`igllqnsrww|zvrosotq~~~}}ztttyyytttxrs}~vxxz{}}{|}wx}~{}{xzz{yz}~}}}{{yyxx||~~yyxnnww}~{||vw}wx{||}~vqr}xy|}ytu{|}uv|tu|tu~}~vqr~snoy~{szxpwzw~~w|{xz{xzzxzzwyyvx|wy{}}{vxz||wx}xyz{~yz{vw}{{tttmmmqqqwwwpppzuvwrs{vwvqrwrsvttqoo|zzpnniggtrrrmoiefrmn}xztpquwvno|svvpusmrtpupmormnmghphhqjgtnooijoijrlmicdUR[ZX^cag_^`ZY[Z\]VXXY]^Y^_bjjX]^`_aa`bdactoqmfiebd`]_a^`nkma^`g`ckbemfiojldaccbd\`aaefeijeijdhimgljfkihlhhlghlfjklpqfijhlmjmngjkjlmkmnkkq``fihqtisognhahhfhebd````bbdjiksr`mkZecvuwkjlgfhtsujjlvlrxmtrhnsioxmtwzxuwlnopturtuwvxkmnmopkmnjlmkmnuprurtqproqrvxymoohjjgiiz||rttx{zx|v}~swrrvq{yyqooxvvywwwuuwwwvvv|wxuopwywywqrwrrxuqjiepslvtt{yysqqtrr~{}vsuxuwzxzspr~|zz}{{ystvpq}uvz|}~}{}~x~z|{wz~xy}|{|x}{w|}z|wuwz|}rturvwnpfjdigjeehkkpnnmiw{ttpvwtz|v{~u{tw}pyv~}|{zzz|~xst|}y~|tvvsuuvvvyww~~y~}w}|w}|w}|w}|x}|z|~xyxrsztuz{xvvzxx~||}}~||zxx|zz~~~~xyz||z|}|~|z~{~}~~z{}{}|{}|~y{|w{|v{|xz{y{|wyzwyzwyztxypuvv~~{y}{}}xzzrttxzz{}}}|~~}yx|zv{yuz{w|}y~yuzsuvqwvrwvpvtrwvrwviljmpnopnsqpxtstwuprppsqwywehftpnrnmponlomjqnkrovvtokj~yxusrmpnkuofolgoniqqkss`hhmutionejiceefhhvwuvwuigfwsrwrqnjgwro|kfcpkhwrquqppnmomlmnlnnlrmlmhgphhxnnwmmlomjmkknlorplpnqrpstruvtnomstrprpionkpoiongoodomemlfnmgonckjdlkdjjflkfllionjpoionmtqnsqqtrnomjljmnlcjg^njbvqatpopnpljsqpy|zryvnsqhdcyzxlqodkhbkhmsnqvtrwvw{|swxtyzwsmvwtvxvwxpuvrwxqvwrvwswxy{{z||putx~}w~mrpy|zvzuz|vz|v||v~{v~{v~zy{z~ttt{{{zzzzzz}}}~~~|wr}ux|}quvx|}wyyz||}~~psqqtr|{}}~~zyzy{ztppjon}x~}v~~u~}}}yyy~z~|~~{}}{yx}|{{{qvt~oyfnkoglgkkpos|vvqrmvpz}zvvv|||xxx{|}~y{z|wysurtz}ztu|~~|~~{}xy~||wuuyyzz{{|rrzz}}ww|uuyyz{|}z{~xy{uvojkvprpklwrsz{{|yz~yz{|~xy|}}xypkl~w|yqxxpww~|t{|v{{xz{xzzvxzwy{xzz|xsuytv}xz{}~yz~yz~yzvqrvqrsopuvv~~~rrrxyyhhh~yzwrsytuupqxstxvvqooyww~||pnnrpp|uxwosrjnyruvor|qsrjkypssmrsmrrnspmotopystyqqyrotnonhioijvprhbc_\e\Z`USYONPZY[Z\]RTUY]^chiZbbX]^`_aa`bhegd_ac\_b_ahegfdf]Z\`]_jcfmdglehjegebdedffjkeij`deaefaefjdjhdilkohimdeiglmhmnhmndijkpqjnokmnprsww}ddjjirphruovqjqpmoyxzonpkmnotujrriuus|}nmobacwvx}|~tsuxkqzntrekylr}pvwzurtcefjnomopxwymoplnpoqrmopoqr|wyyvxpoquwxsuvsttlllcccuuu{zziiiknlqtrruslonrustrrvttpnnussyww}}}~~~{vwuopuwy{{vuwsrwvr|}wuvq~||xvvywwwuu{yyxuwwtvurtzwyvsuurtxvvxvvyst}wx|}|}z{{xzy~v|yw{ux|xy}vw{{w||x}~xwyy{|txynrsfjchlumqxzmsfmim|nmymhrtnursqxyuy{uz{v{~uszwmwt}trq}tt{|ytuzuv|wxzxxy~}y}|xxxwvvyww|wx{vwz{y}|v|{tzyw}|w}|x}|yzyz~z{rppzxxqoo~~}{{}{{yww}{{~{|}}}zx~{}~|~~|z|~x|yyx~}|{}z|}y{|w{|v{|xz{y{|y{|y{|{}~txyqvwv{|zv~~~{}}y{{z||{}}wyyxw{~rqu{w|xtyxtysotvrwssusuutvvqssqsssttuxvvywtusvttwsr{zyqonoomgedjjhsonpnllmkkomholgnkfgeplk{zvtspsqismpyvnvumuudll`hhksrlrprwvvxxprrijhijhqonuqpzutsnkidakfclfcqlivqpuqprpoomlmnlomlpkj}tuoddqggviilommpnhkidgejmkjkighflmkmnlstropnlominlfmjipmgpmdljgoniqpgondlkdjicihekjjpnkqplrrekhkroqvtgjhopnnomdkhaplfuqftpsqpojisqptwut{xrwu{wvlmkfkiu|yXa^pvqqvtotsjnomqrkpqyn|yp{ymoossstvvwyyrtssuutvvuww{}}|s{ztywpsqnqosvty|z|{w{ux|v||v{{u|ytots|zz|}{}ytvnnn{{{zzzzzz}}}~~~{{{{|m~{r~z|y}~swxrvw~{}}|}z}{z}{|y{|}~}~zy~~{{zzzzuuuy{{z~~tyx~}{z|zy{~z|kpwyekjlqtxzsuvx}utnmfrjzs||xw{z~yyy~~~}}}|}~vwz||~z}{}skl}z|~z|}z|~|}{uvwuu~}yyyy~vv~vv~~}}{{yywwyqqwqryz}~{|z{{|{|z{}~z{|}yz~xy}wx~wx|}~yz}~}~~yzzzry|t{~v}}u|{uzyxzyxzwvxxwyyxzz|}|wyz|}xy}xy{vwzuvzuv~~xvv~~{xxsqqwrszuv|wxzuv}xy|zz}{{sqq|zz|zzyuvwqrwqr{|yst~xy}rt{st|tvuottnsqmrurttopxrsqiiunkxrsrlmuop{uvkefQNWYW]YW]_^`\[]TVW_ab_cdQVWbjjY^__^`_^`ebdkfhleha^`]Z\khja^`a^`kdglcfohknikjgilkmeijimncghcghdhijdiplqkjnoptrswinohmnglmkpqmrtjnoprsqstttznntpoxtlvvnutpvwvxoqrihjkmnnstpxxhttjttxwyyxztsuvuwsrtvnswmsulryousjpwzvsusuvrvwnpqmlnkmnlnntvwrtuoqrqlnqnprqsvxxwyzxxxvvvrssvvvrrrpppfjgsvtsvtjmkruszxxzxx~||}{{{yyvvvuuu}xyuopvxyz|xw|xtyysz{vu{r{yy|zzzxx~~}}vsuvsuoln}z||~~xvvvtt{uvpjkxyrooutvzv{{tymnrqvyz}vw{~}~}~~x}~hlmotuqyck_ijsX]z_i}fngn|op{vt~yuzwxvyzxuurxztwysv{yw~{~xutyy|wx|wx{|~||z||~~~yxw{vw}xy|}|~~y~}}w|{x}||~~|zz}||~|{{{yywuu}{{xvv}{{|zz}~~}xy~{}}|{{{{}t{x~~}qprutv|~z|}x|}w|}xz{wyzprswyzkmn~}~vyzpuvqssuwwwyyjllnpp{z~~posyuzwsxvrwvrwvrwrqsrtttvvwzz~wzxruspqoywvzvu{wvuqpplkxsrnjiqmlomllnlhnlenkdmjopntpowrqrpnnqogqkbkh_gfkssfnnfnngonmsrnsrprrprrghfopnpnmsonqlkqnjfc_yvrspkolhsnmrnmpnmomlmnlnnlrnmojioggi__j``hkiqtrrus}~svtstropnpqoqrpopnopnknlknlgljipmelibjigonksrhpobjiagfcihflkjpomsroutblignkhmk`fdsvtpqocigeollurlqomihpkj{yxrusmtqbgernmjkigljqxuktqpvqqvtotsmqrptunssqyxmzxr}{moorrrrttqstvxxuwwwyzz||tzynvurwuuxvsvtx{yz~|z~zu}vvytxzt{zt{{uuzy}wx|vw|}ppp{{{zzzzzz~~~}}}vydwtk}zxw{|xzztvv{~||~}zy~|wv|{~uvw~{|xzz|z~|~~~xvuzzz~{}|v{{|xxyosv|qwmplopvpsntlpsolhjcqi{trxu|{yxyz~zzz|||}}}~~~{|~{uvyz}y|{~tv~pry{y|zwy{xz}z|{xz|~}~z{zxxzy}|zyzyzyzy{z~}~vpq{||}|vw}xy{||wx}xy~}xy|}{vw}xyzuv|wx~yz{|z}|t{}tlswqvxwyxwyyxzyxzyxzytvytv}xz{vx{vx~yz{|~pklojk~||uss}}xvvywwupqz{|wxzuvytuxvvvttxvv|zzgeekfgxpq{styztlmqij}rtnfglcf}w|xrwplqnkmupq|vwummjc`hbcxrsmghysttnoOLU\Z`SQW\[]_^`Z\]]_`TXYJOPX``_de`_a_^`ebdjegkdgfcelikdacebdhegibeofilehjegc`blkmimnfjkeijfjkfjknhmokpjimghljkoeijeijfijimnqtuknoxz{uwxqqwoourqzrisuqwsouxxzsuvonrqrvotxmtwfrthqtkjltsutsuvuw{z|wrwxrwtotqjoupuworpmosuvswxprsgfhjlnjlnhjkkmnnprzuwtqslkmtvwlnoooomkksqqvttywwvvvikklnnmooikknpprppwuu}{{zxx|zzuuusssytuztuuwyqryvrxwsvxrw|sx~s|zz|zzsqqtrrzxxzwyzwyroqnkmolnzwyxvvzxx|vwvpqxyljjrtu{y}|v{mqurwzz}x{wx|utx|tuv}ejkpxxfpjthvs}\d]j|_l{ir}ps}vw~|{xxx{{zxyuwxtz|ux}{y}w|z}}uno|}|vx|}~yz{|~~|vx|vwz{{||}{|z{|{}}z||xzzvwwwyystt|~~z{{}}xvv}}|zz{yy~~~z{~}|~~~|~~}|}z~}kusz|z}}}vwxwvx{}~z|}x|}w|}xz{wyz~lnozz|{{}}y{{wyy|{~~}wvzvrwyuz{w|xty{w|wvxrrrxxxuuuxxxsuusvtpsqpqovttxtsxsrxsrjedxsrrnmoomlomipmfplfnknomtpotonpnmdgegqkhqniqpmuuiqqiqqhpoionjonlnnlnnlmkopnpnmsonrmlnmigfbutppoknmirnlrnlpnlomlmnlmnlvtsspojfenhgmgfiljhkiehf`canqorsqpqorrptusopnstrmnjlojhoiiojfmhckjgonjrphpodljdjifljhnmgmlionjqpenkiroeli_camrppqodigholosrtqpnhghcbxvvsvtt{xqvt}yxnomlqomtqktqpvqrvtputquvptuionlurlzvr}zrusstrvwtvwtvwtuvsvwuwyyx}y|z|}~}~y}xu|uszsx|vx{u~~x||~nnnzzz{{{zzz}}}xxx~~~ytizwp~|{}w{|xzzz||~{}yvx~}~yx|wvzy~}xyyw|{y~|{yyyxzz~v{z|}{}}~|{}{zywv}}}~~~}z|{~|x|}svuzuzloX_bjcjiqipommjlhtn|u{u|~{{yz{}xxxzzz~~~|}|}|}|}xz{~~uxwyxzwyzwy~{}|~wtv~{||vw{|~||}yx~{z~zy~}{wv~yx~yx~yx|{~}}wxxrsxrsz{}wx}xy~yz}xy}xy~yz|}|zzvtt|}~{vw{|~~w|{w~y{sz}w|vxyvxywyzwyzwyzuprsnp{}wrtvqszuvzuv|}~yztopqlmztv{uv{|~xz}xyytu{|zuvtopvprusstrrxvvzxxxvvtopyyzrrvootll}}uw}~~ux|v{xrwrnsvsuqlmsmn{sswpmxrsystmghoijnhiZW`^\ba_eUTV\[]Z\^`bcZ^_UZ[fnnW\]bac_^`ebdjegkdglikoln`]_ZWY^[]jcfnehjbfkfh_\^a`b]abptuswxcghfjllfklhmjimrswlmqjjkmnosrtpqronpefgfhidfgiiommslktqluyu{nlrsuvsxxgfjuvzhmpipscopfortsutsuvuwtsuvvxutxvtxsrvpmrwvzvorkhjkmnnrsqstmlnjlnjlnlnomopnpqlgivsuqprwyzprszzzrppvuu{yyvttonnsuuqssrttprrhjjrppvttywwuss}}uuusssxsttno}rttllsrnwwqy|ruzqs{pussnllwuutrrpnn|y{zwysprroq}tqsussxvvxrs|}~vwz{~}}{}~yx|{uzwz~t{~uz}y|uvzrswz|}txytyzotuowwbmWc}cqmxYe]k}izlvnt}ux}}~z{yxyu{|x{~|x}{txv|xwxx}uvytu{vwzuvytu~yz}~{uvxy~~|}~~xzz{}}z||xzzsxwsxwotsx}||zz~~}}uss~~~}{~~~~||~||x{{~|~~|}y{|wvxxz{z|}x|}w|}y{|xz{y{|y{|tvw}{}~|~uwxxzzsuutvvvxxtvvy{{poszy}wvzxw{vuyyuzyuzyuzyuzxtyxwyzzzwwwvvvxxxqssiljmpnrtrusrwsrzrr~uuvnnwooqiivrqrsqosqmtqgrofroopntposnmqoniljismhqngonnvvckkjrrhpohnmkpomoomoonompqopnmsonrmlnlhmlhtsopokpokrllpllnllomlmnlmnllnlhjhhhfzwvvsrgjhfhfgjhknlehfnomnomtustusnomqrpmnjmnjlpkiojkqldlkfnnhpphpnfnmhnmhnmhnmgmlgmlfnmfqnktqeliovspuspqodiginlsrqzppwqpupovtsvywryvotruqpopnotrjqniroqwrrwupvtquvostjpolurur}ztwututvwvvwvtuttusvwutvvzs{zz}wzxy|zwzxz}{zzu~ww~wuysvwq{}wz~|~||}}}zzz{{{{{{|||yyywww|||y~u}}~xzzxzz|~~~~}~|{|{~yx}|}}}tvvsxwy~}~~~y{{z~}~}~}}|omlpnm|||~~~}y~z~x}}wyy}}q}^jS^al^icejjok~{~x}v}omwvwxy}~zzzzzzzzz|||z{~xyyqr}rtx{~svzlnuwzwy~{}{xzyvx||xrsz{~||{yxzww}|}||xw|xw}|~}|yz{uvztv}wxz{|}{||}|}}xy||}}|zz|zz{vwz{z{}xy{xzrywov|v|vxyvxywyzwyzwyz~y{snp}xzwrtuprxstxst}xyxst}xy}xyzuv~yzzuv{|~yz|wx{vwyturmnywwyww}{{|zz}{{topuv}rsynotjj}ss}umni`csmroinnjokhjnijvpqtlllebnhiuopoijkefmgh][cZX^\[`QRTZ[\Z\]acd\`aY^_W]^Y^_bbd__`dbdjegkeghehifholnqmopmonhjkcfgachdfgdfdcejno`dehlmgjkhkloioqmrposlmqffkonppmopnoomoighgfhhhjnnoqrwwx~rsztqyzyljptwxptumlqrrxfjplrwhrxltxwvxnmnsqsxvxvuwrsyrtxpqupquqrvztwnikpqrnrsloponpkmnkmnlnonpqprstoqxuwgfinopuwx|yzwqrytuxssxturqqqttrttnpprsshiipnnzxx~~~||}}wwwuuuwstuop|rtqijpnlvvporkqvkw}txvvsqqtrrwuuvtszwyyvxspryvxzwy|y{qoorqpwqr{uvwopmmmtvw|{|v|ptxpwyu{~ux{uv{z|~wxztvwlpqipphpqdoO]w[jdqdo^l~csfq{lr|rv|}qpstuuxyw|~z{|yx|ysxvvxv|{zz~wx|}~xy|}{||xx}~~xyzstzpq}vw{|~uwxx{{{||{}}~y~}nsr~z~~|||zz}}~||sqp}~}~~|~~}~{{{}||yzzy}}v~}y{|utvuwxz|}x|}x|}y|}xz|uxyuwxxz|}|~tsuqpr|uxwoqqqssuvwy{{poszy}onsyx|tswwuzvtxuswvtywuz|{}vvvvuutttxxxtvvqusptruwuuusxutwqpxqq{ttwoovtrttrptrousjtqisppqotonytsqnnknlirmiqnipoovvfmmippipojpojnnlmmkmmlnlprppomsonqmlllgqplsrnpokpokqlkolknlkomlmnlknlhnliolcgey{yfkhbecbfdsvthkighfkljuvtkjihhfccbppjklglpjgnhlrldlkenmgpofonfoniqpiqoiqognmgnmenlgtphspcljpwtputnqodiglomuqqzqq{ssqlkxvuuxvrxuqusuqpuusnsqjqniqnrxssxvqvurwwswxkrnblfhvor}wotoxxtxyvxyuvvsuvqwxuwyy|~~{w}|u|{y~|z}{y|ztxv{}{x~zw~xv|vuztswq~z}~{}v{ysx|zyzyyyzz{||{|||xxxxxx~~~}}}}ys~xy}~uzzz}~{~ruv|~~~~|~~|z~|{xyyxyy~x|{z~}}z~}|~~}}}{z~}~~~|{{||{{{~|{xwy{{~y{|tqhvaojyw{vvvv}||uvxyz{~|||~~~~~~|{|~~yzz{z|z|uxvx|~zwy{xz{xz|y{}~z{{uv|{z~~~}wyvuwuvxvy{ytts{xw{xw{z}|~}z{}wx~xxz{{|{|~yz}~upq{vw{|zxxsrr~||uss|wx}xy|}{uv|zxzry{|v{txysxyuyzuyzuyz|wyupr~y{xsuzuw{vwztvz{topvqrkfgmfg{uvxqrz|xyzuvvqr~yz|wxxstvuutsrutsqoopmmqlm}vt|urskiunkzspypqzqs{svsmrqlouqtvtunijqklqhhtnlsmntnormnpjkojjSOSi\aZWXTa`RYY\^`Y[\Z\]WZ[X[\Y]^]ddSZ[_de_deaefahh`bcihjfghgllijkbacljldcehhjgijcjj^cdbdeljlmiklghc`byxyjlmlnnejmkosinqhlpbfjfhlxmpympqvwUhg[ghjuvoyzhrrouvpwwlnvnoyqr|oqzqr|opxoptlmqopunosqrvhosupoyklqmrrxtx}ovylsglomsvqprrrqpqnqrpmnlrsrussxvvrppsqpvttsrwwtv{wvvtpimklstlqtux{{z|zww{wwrppywwywwwuu~~xyyturuusqnnyzp|zku}nuxjpumo}y{xrtoilxuw|{}wvyssszzzrrr|||qrqyxxxsuvqsytvwrtztwxvxmlnsrt|{}zy{mttkwtpzypzxxu{z{{}~i_ehglptzfqhsZe~dn`h[o~^p{dpzkq{ss~x{uy}x{yz~{y}xwzt{zv{z{zzzzxv|wxzzz~xyu~~vuu~}}vuuz{{uv|}~}~}{~||zywzxy|zwzx|}qtr{|~yz|}z{|~~~|y|~||}}}~}}}||{~~|~}zz~{|~~~~~}}}|}mghsop}}||{wyyrttwyyyzzv{znxvr}{s}{v~q{yihjjhjkjlutvsrtzy|utvnpprttrwuv|z|z|vuw|{|{z|zy{isvisulvxmwyq{}oqrjhhmhiwuuvxxovupvvnutoutsvvuvvnsqqyvv~|xwv~ssyoozsrwrqtsqqrpiljstrqpotsropnuusqvuptstttutsnlltppuqptsqrurmqoiolgmjekhgmkhnlipmtooqlkvqqvqprmllljjkilmkmnlnomhmk]njcrnXebeqnbmiYhferpfnmprrnnnqonpmltqpxsrxqpvqpdddy|{inmgpndpnanucpwgs{cpw^kr]oqZnn^po`qndupdtpdum`pifslpztpwrfslhsmgsljsmksmuqppkjvvtssq|xw}|wwurwujrnqututrsusw|zovspzwmzwjurmxvu~{u{yinlrvttvvtwvuwxxzyvxytvvxzz}x{zv{zu{zu{zrxwy~}z~w|}vx{~{y}{x}|{{z}xw{}|}|~~~~{~~z}w|w~x{{{}|~~|}~z}~zw}yw}}x~}x}~vz{|~~{}zxz~|~~~~~zz|z~~yzz{wzv||{tsomkkrsuwu{uo|fthxrhrquklwu{{||zzyxyy~}|wv{|~{vyz|yrs}~~~~~~y~x~|u{zty}~ytu}yz}xy~yzv|{u}|rzyw~ryxt{ztxwvwwzyy}wy~xyyzz{z{z{yz{}{vx~{}}xyy~z{{~{||~||xvv~~|{{y~xys|~s{{uzwyzy{|uwxxz{uwx~yzytu~yz}xy|wxzuvzuvzuvzuv{vw}wx|qs~tv|qsz{tvyrsxpqyrsyzxqr|wypmpytvsmp}ux{uwxzzpsrrttprqsuu{ux|u|{xrwuqqxsstpotomsnmsomqnmkoploplmnhjkkikURT\PSRPRN\[OYY^`a[]^[]^cef^`aY]^ZbbT\\Z_`[`a^cd]bc]_`dcebcdcghdfgdceonphgilkmgij]ee`efeghmjlniknikifhsrthjkiklflohmphmpglomsumosyor~ptafgYomjwwjvviuujttjrruz{su}mnxpq{jkupq{lnvoptmnrnnrlmqnosjrqsvxppvjopwsxqw|ntinqntxnlnstrrsqstrppnuvtvttsqqvtttrrtrrqou{xzyut{zvsvtksselohmpopq}xytrrussvttzxx}}yz{mqopsqqqq{vqitq|s|s{ulo{wyunq}xzhegzy{vuwnnnpppzzzpppqqq}roq~{}zwyxvxvuw{z|vuwzy{vuwnwvq|zozxmxvmxvpvtx{y~pfnrnxwydoitcnhqjsbras~fr|nvprzz|x{mpu|vw{wvzs{{vz{{zzzzxv{|yyy{|z|}y|uvr||||||rrryyy||z|~yz}~}xy|zy~|{|zy}|z{yqtrx{yy|z}~z}{z{}~}~}xy}~}{xz}}~~~~}}}}}}}}{{{vxwy}~~z|}z|}~}~~xy~yz~yz{||{}}}xzzvxxz~x{w~~w~nmokjlnmoqprtsuzy}wvx{}}tvvqvtsxvvuw||~xwykwyivxjwxkxzmy{uwx}{{snowuuqssqyxnywu}|syxsxwrwvpxufpm{tvtzss}ssxsrvrqqnnqrporptusqrpnomrsquvtpttqssuuuvttrppsnmytstrqnpnoqonrpinlhljhmkinljomqonomlvtstrqljinomjkiijhlmklmkhmk`okcrn_mi`khajgZhferpjrpprrnnnpnmsqptpoupovnntonppp\^^qwvaihhusbnvbnvdpxbowbow`ru]pq_qpfvvjxvgvrgvrjxunwthqnelifqohspitqiqoiqookjplkzzxwxvytszutwxvrwuovsv{yywv}~|v{yu|ylwtn|xlwtmxur|xtzxmrprxvtvvtvvwyyy{{wyyuwwtvvtvvwyyv{zu{zu{z}pvurwv~~~~{}}~~~zy}{z~{z~~}utx|{~~|z|||}w}v{y~xzz{}}}~|~z||~~~{}y~}tzyrwxqvw|~~}onj|~z|z|w}vy|zsq}|x_^lmlmrsqyn}]nZk`rovv|ruzx}|{}~wwwxzy}|}{z|}xz{}{}|wx~~~~~y~}w|}w|wrsvqr}xy{vw}xyruuy~~outhnmz||yzz|zz~yzyz~xzz{{||vwyzz|~z|}~}zwyxzz~~{}}~~vtt~||}{{x}zv|x~w||uzwyzy{|suvxz{suvtoprmn~yz{vw{|zuvzuvzuvzuvzuv{uvtvuw{prwytvypqwop~vw|tuzqr~y{vsu}xzvnr|sv|yuuxttwstxtutpqsnpvovtmtvptyutvrptonsnmsnmsnmqnmjopkopkmnjikjik_\^^SVYXZO]\R\\Y\]XZ[YZ[_`bY[\SWXW\]Z_`X]^inoejk_degfhmjlkikhkkcefWVXpoqihjmlnegh^ffejkrtuqnpmhjojlvsu}|~hjkgijcfjfimlos\_cnquabf|nruyhnoVgf`llhtthrrjttmqrtyzjltmnxklvklvpq{npxnptnoslmqlmqnosluhkxopznrwjpttqvqw{pvglonvyjikrsqrsqnpnqrp}~|xvvnllrppusstrreci|xwrqmqtrlttry|tx{kmnrrrrmnommyww~|||zzqoontskrosxv\__pnwkfqvjtt|syqil}y{vor|~urtzy{ffhtttyyyssrxxxurtmjl}{xzxuwsrtutv{z|~mlnqwvt|{szzowvjrqkqp{}u~kbmkkwlpdpfrbmdoeobrdukwlu~oqzy{|w}|~tw|uvzsz}vz{zy{zzxxxtu{{{vvutts{{xyzvxxxzzzwww|||}~xst}xyxvu~|{wut{|zy|z}~x{ywzxz}{ytu|~{xzxuw}{{|zz{{{zzz{{{}}~ywwyyy{|}yzwyyy{{}xzzvxx{~~~~w|{w}|xwysrtwvx|{}yxz~}srtvxxuwwqvtrwulkmpoqtsuxwypx|luxmvyktwlux|~}{{upqsuuqyxmxvmxvrxvmsrotsktrr}zfqnmsqrqpsonpmlzwvyzxqtrnqostrqrppqostropnnrrqssyyyzxxrppxsrojiyut{yxttrnpnkpnjpnjomkpnlqousrqonurrrponlkrsqmnljkikljhighmk`njesobljhqn[da^kigrpltsqssprrsqpusruqpvppwoovqpommxyytzyemlitrcqyanvanv`mucpxgw{crubprn{{kyvgsqgtpmwtlurjpmjqneokiroluqfrnfrnoomqqorvttxvtsruvtrwupwtuzx}|z{ylqopwtp{xlzvfqnitqpyvrzvrwusxvxzzxzzsuuuwwtvvsuusturtt|~~yzzv{zu{zu{z|qwvnsr~~~x}~|{~}||zy}{z~~~tsw|~~vxs~y{{|~}|}{{}}}|}x}|qxvtyztyz||}|~}|y{}{{|{zv~}yz~x|w}xnqozzrmnlkjwzhz\mbubvi~hsmtnqstwwswptghqqzzz~{y}}}z|{}|wx~z{z{z{z{~x}|v{ztyxrx{uz|wxz{zuvy{{mppz{{pttnoo~~~~|~}~}~yz~xy}wxxrsz{z|}zuw{}}|~xzz{}}tvv{}}{}}~~{yy~||}{{|uy{y~x}}w}{}~uwxtvv~|~{vwytu|xxytu|wxzuvzuvzuvzuvzuv{uv}rt|qs}rttv|qs}wxpkkpklwrrztu|wyxuwz|xqtnehx{xpqyqr|tt|ttxppqlnqjqngnsmrsontonsnmtnnsnmsnmrnmkopkopkmnjiklikPPRSILQQSSdcT``Z^_VZ[VZ[X\]W[\VZ[X\]X]^S\\Zbb`hhhingchf`efafmmqtsw`_clkohgkmlpbcgZbbhmndfgdace`bpkmnkmbaciklsuvstxoptrsvstxnnrebg{lpzkoquvbtscnnisshsshppotumqrqs{opzst~st~pq{tv~nosoptnosmnroptozotuwy|lrvqptsy}pvovyr{~acduvtvwuijhkljxywywwnllpnntrrussqou}z|{wvwvrqtrmuuhqtovyjmnyyyxvvsqqywwnllxvvjhhmsrpyvqxuhnmuw|ylt{oupjlvvxwpszuwroqutvsrtsrtyxzrqtrqsvtwvuwqqsppryxzvuwssuxwy}|~~jikpvuoxwt|{owvltskppwtzxt}rlzsrmqirnwpxdkkrftbrcn{go{ortwio}ms~tzuysw{uz}vy}zy{z{xx}{}uwxz}}~~}}}wwwvvv|||~~~}}}}~ztv}xy~~ywv}{zyzx{~||}vyw{~|sno~yz}xy}~}z||~~usstrr~||~~~|||vvv}~xy}{{prs}z{}~|||z||~}~z||y{{wyyvxxxzzxzz|wxxy}|vww}zvx~{}~poqsuutvvqvttyw~zy{t{~ovyovyltvlsvqst|zzzuvxvvprrmwuhuskvtnvumsrqwvm|xetpzlsphmjvxvnpn{|zsvtpsqrusqrpopnlmknomnomkpoqss{{{pnnpnnxtstpo}yxxtswtssrqorpnqoprpqtrrusxywnpnopnstrjkitusqrpopnjkighfgkicnkgrodmjipmX^[foniqpmsrsuuqssxvutrqwsrwrqzrrzutsqqrrrhkkovulutfrycnvbmubltcnvUagXcg_jl`jkfoojqpmtslrqlrqlrqnsrlrqiqqiqphsqgsqlnlptrpvsourhljvtspqorwux|nsqywvqrptyw^ebp{xn|xv~r}zqzwszwtywuzxv{zv{zrxvuzytyxsxwy~}|z~zu{zu{zu{zy~~~~|x|~}~}{z~{z~|{}|vuy~rtuzzzopl}}}|~~suu~{|}~~~w|}~{xvq{vso{xt|~x~wywxt}yutqkkqrfhv~wh{ezavezkwpxtywwkkrwnsoqww}{rrr~qou}z|~y{|wy}{{~||}{{}{{~||~||~x}xrwvpu}~zuv{|}~{|}xy|yyurs~~~z{{xx|}~~~~{|~xyuopz{}xzz|}~y{y{{uwwuww{}}xzz~~~||}{{~||}{{|~wpsunq|uxx{{}~prssuv|~qstzuwz|ytv}lgizuwzuwzuwzuwzuwzswtvuwvx~suynp{~wpszsvwpsx{vrturt{vxvorvmp{sv{~okmzuxtorvqtuprqjqqjqsmrrnmsnmrmltonsnmsnmrnmkopmopnmoliklikLKMcZ]XZ[O_^Q]]V[\Y^_Y^_V[\X]^[_`^ab]`b]eeWaaXbbb`fiaij`hbY`lionlrcahb`fdbiljpfgkU]]inocefliklgie`broqihjeghjlmrquomqhdiigklhmkejufjtcgchhdsrlvvgqqjrrhmnnrspuvgiqfgqmnxtuklvlnvrswpqujkofgkqrvfq|cktuvlnwu|uuyv||rxt}fps]_`{|zwxvrsqopnstrsqq{yyvtttrrrpv{xztpowvrnqogppdlphnqrvwwyyrppvttmkkiggyww{yyoutclinuragfoqymlvvnxxov}uzrnpqtuyruxsuwtvvuw{z|{z|xwyvuv~srtutvwvxwvxywzvuw|{}{z|xwyyxz~qprv{zsyxu{zpvuqwvnstwwur{xpu]e}iq_fahkqludp`hzkqdiyuxjqwntyw|uy~vy}xy}{xzz{}||}xy{z||y{zz}{uuuzzzxxx}}}{vw{vwupq}xy|zynlk~~~|~uxv~zuv~~{xz}~|||||{||vwvxx}}}{}~uxxrwvuzy~~~~wxxtwwqvu{}}suuxzzxzz{|||}~}}{wxxww{xz}khj~}rqstvvrttnsqjom~zy{vuwxwy~}uz|uz}rwznsvpuxrtu{yyqlmsqqqsskvttmzxnywiqptzykzvjtqrzwltpnwtqwuw}zqusmrqqtrrusqrpqrprsqmnlpqolqpoqqnnnrpp{yy|xw|xwyutxsrvqpyutqtrpsqqtrnqomqomnlqrpmnlqrprsqrsqqrppqolnldectwujspgolcifgljlomgmlotsnsrhjjjllsqpmkjxtsoji{ssuonrmnqppaccgmlpxwir{clu^gpclufoxbkrahoekpflonrsqtuqrrnrqnsrmrqlqpkqpkqpiqpdqocqoiomlrpnxunxuv|yrtrpqootrkrouzx{yxtusx}{t{xyhvrpzxkvsx~eliw|zrwuqwvqwvt{zrxwsyxqwvv|{y~v|{outrxwu{zu{zqwvdji~~~v{ztyzy|}y|{{z~~}~}vwwvvvvwv~~}}}}lqr}z|{{}}}~~~~ssy~~x}~z{|{}}|y{zxx~yv}|}z~{|v~w{~vz{wzyz{x}yutwxrwfpqostrp{qzrvrrnonskrtw{{~}}{{{}|~|{zuw{}upr|~}xz~~~~~~ywwuss||v{~{uz{uz}xy}xy}xy|wxz{|}{stxyzrsxz}~~~|}{uv}wx|}~y{~|~~y{z|zwynppqsssuuy{{xzz}{{}{{}}}}}}}xz|wyzuwvqszuw{xz|~{}~tvw{}~xsu|wx}z|topzuvxsu{vx|wywrtyrutvuw~su|qsk`b{vxvqrwrs{vxz|urtyvxzuwyruzqtwrtv~~u}}fmnv~~nuuxsuunurkrwqvzvuupotonsnmsnmsnmrnmjlmmopebdkhjqlnNPQ\TWQTUN`_P_^UZ[X\^X\^VZ\X]^[^``bc`deZbbU``Yeefbhlcjnail`gc^dcagkinhfligmljpfglrzzX]^dfgmjlnhjhbdolnhhjdfggijlhmf_dqkpnhmjdipin{kotcgcefcsriqqjrrquwglmmqrmopwyjkuhisrs}tunpxpqunosfgkcdhnosZjq[dmlqz^ekfntppuqfljchYbegsubefpqoijhefdefdqrpsqqyww}}sqqrppsqwsprsontsosvthrreqscloejk}~~oppvtt~~xvvusstrrjpnholtxwtxwtr|tp{snwvovtnsrsuimnyruxsutqsvuwonprqvkjn~}yx|vuz{z~xz{{}~vyzy|}prsyxzxwyyxzxwy~}y||tyxz~{z~}qvwrtuu}u}^b}rvlokngiagfmZ_yosvwrwirt|luqyqz~vxvy~xy}yxz|z||}wz~|v{{v{zy}{mmmzzz|||yyy|}zuv}~z{~|zyrpozxw~}}~x{y{~|z}{|wx{vw{||}~}z|{xz|y{yvx|z|~~~~ussjhh{}}~suv}~{{{|}|~~z~}wyyz||z||{{{~y{y{|~rlnrot{z|suurttnsqlrp~~|~yxzzy{zy{svzx{nqvpsworvopqwuuqlmrpprttnywftrlxvmxvkrrpxwnxuqwty}{osqjspepmfolkromtqotrrusqrpqrpqrpnpnpqolqpoqqoooqoonllxtsqmlupowsryqqysrpqoopnopnopnrsqorpqtrosqorporppqopqoopnpqowxvfigjqnlpogjhiljjkijmmprrmoorttjllyxwljivrqupolddwoopkltqrijjkpooutenwdnwcmvclvdmvfirehohlplnsqrvurvtqsrpsqqsoqrlprmpqlpqiqqdpqdrqemkhrpjyum{wjtqlqorsqkpn`gduzx}|wxvx}{v}zwlzvp{xozwu~{gnkuzxqvtsyxsyxv|{tzyu{zqwvuzzx~}v|{pvusyxu{zu{zrxwion|v{z~~tswyx|~~~|~}~}~}vw{xz{{{{~z~~~|{}~uz{y~y~}|xxx~}zxx~~pqu||~}~|}~w|}~y~{z|~{}|~|~{|z|y}x|}twxnutpywu|zrwpy^ncugw^qi{t~ksnrln}}~szuy{vz~~~~rqsjim{yxsu{}|~~||||||||}~~wwwvvv{uotzzqlmytu}xyvqr}rtvx{}{}z||~|~||z{{uv|vw|vw~xx||}~~|~{xztvvxzzvxxz||xzz|zz~||~||~||~||}{{{zzywwsqq{yyzyytvwiklxz{uwxy{|vpuxrw}w|}zsyysx~x}{u{xrwyrx~wzynpshj}rtuwnce|x~uqvzv{sotwsx}z|}z|{tw}twtrtmy{jwyp|~ivxeqsvrtunuunuwqvvrqqlkrmltnnsnmsnmrnmsrtrqsfcenhjrmoQST_X[Z^_M^^O]\QZZS\[S\[S[[U]]X^^bac\`aX``R^^Ucbf^hl_jn^jhZeritkgpfclhenifolhrhhnckkchicefmjlojljegkhjihjdfgeghlfkmfkohmkdildjwotrvzfkfhiiwvfnndllchihlmiklfhifhp[\frs}mnxijtoqypqunosZ[_YZ^ghlYiocmthntejsioymmssiowpuersbnpost~}xywxywnomstrywwywwzxxsqqqoovtzroqxtsxwswzxmwwfrtktwuz{{{{xvv}{{ussvtttrrqssptrx{ywwwyt}|wvs|vsyzuznpqcjjyru{vx|y{~}qprrqubadkjnzy}vuytvw}~wyztvwtvwzy{qprkjl{z|z||rwvrwvmrquzyqvxpsqs~uwu}bdloegdfjknqikeg\_}dfjnqw}t}oxmx|vxvy~xx~xy}xz{|uxztyxx||rrr}}}zzz|}z{vprzxwywv}{z~}z}{z}{x{y|}}~}~}xuwjgi~{}~spr{||~~~|~~z~}xz||}|~}~x~w~y~}y{{~wyyy{{}}}~}uv|}}xz|xz~y{uprz|sot}|~suurttntrntr}|~~xwy{z|zz|tuyyz~lmqstxprvzxx~yzywwtvvlwuesqiwuhvtjusnutnurrtrxxvvxvemjcplbnkktqmtqotrqusrsqrsqqrpqrpprplqpoqqoooljj}}wutokjupoypp{qqxppmnllmklmklmkprpsvtorpmpnpsqnqopqonpnnnlqrp~}adblqoinlmmklmklihoooprrkmmtvvjonxywpnmiedytsh``tllqklvqrxxxrwvnttgmvhnxipygnvfmvhkughrmkuqoutqvupuwpsvrsppqoqrnrrnpqlpqiqqfrqbsqdpmfrofvrhyufrolspxywsxvlspx}{~|z{yuzxx|p{xlzvdol_jgqzwlspw|zsyvqyxqyxpxwnvuowvnvupxwrzyt|{nvutzxv|{v|{tzyqwvy~}x}|}y||x~xw{}|~|{|{yx|xw{{z~qrvwyz}}{{~zu~~z~{}}|}z||qrvts|||}|}~|{|sxyw|}v||wvxxuwyvx}z|{x~|}w{|sxys}~|}wyw{vkzlzjziyjsfnmp~~|~|~~~~}|~|{}{|vx|wy}|~~||||||||wwwwwwxxxz|z|v{zvqrz{~zz~{|z||~twz|qtrux|xzy{xzxyyst~xy|}zz{|z|{}z|~~z|{}}qsswyyxzzwyy|zz~|||zz~||~||}{{|zzywwsqq~||yyylnovxyqst{}~tvwxrwvpu|v{~x}zty{uz|v{ztysmrzsw{pr{pr}rtuwrgi{zv{~z~njosotnkmvsu{vxxqt|svtoqpx{mwyiqtmwyirttoqtmtslsvpvuqprmltnntpnsnmsnmrnmqprrrttoqqlnphkZ_`WQTLOQH\ZLZYQXXSZ[TZ[SYZU\\X]^b`b`bc_ffWbbVddg`jnaln`knalndohclebkifofcmhfojjpjpqafg`bckgimikjegjgikjlihigghlfkjdinglngllejqhnscguchgfhjwwahifklimnimnkmnljlfgnegpggqghr__iefostxqrvhimaaefgkgx{gryu|ou~js|hinwntzkvxtuz{pqpturz{zmnlttsxuuzvwyxxsqqqppusyuquxtsxvtqtslvvlwzirtdij~~xvvtrrwuuussvttvwwuvtrrptqq{s|zt~tq{xtzuqvruvlss|uxztvvrtvuwyxzutxyw}}wu|yv~yx}rvw}rvwquvswxxwyxxz}}rrt}{}uwwv|ztxwots|v{~rwy{tywhhhhgekinlfeffjkfhlmjmmuq{nwhs{oy~vxwwwy~xy}xz{tx|tx}w|qvwsyxw|{}~}z{{yzz||{yxx~{{|}z{~~|{xw~~z~|w{yx|zy}zy|z~yzzvwzuv{}}zx{yvx~~~~~~xwwzuu}~y{|uwx{{~{|~~}|{|z~y~}}yu}|y~}{}}}~z||z{{~}}~~z|zsv{twy{{uw|vyrrsvxxqssotrpusyxz~tsu|{||{}vvzwv{mmquuypotrrtzyy||usspssmwugusapmgsqlvujtrswuxutyutvwuflierneroispltqotrqusstrstrpqorspqrplqpoqqooowuugeeutrqmltpnwpp|rrvonmnllmklmklmkopmkqokqoqvtnsqkpnnommnllmkpqovwujljlpnnqonommkjigeooorqqiiiqrraeekljhfeolkwrrrlkrkkrlmtnollllnnntshovjoxipxinwekskkujispmtpmutotslrvouwrvposoqsoqvoorlosjqsfrtdrsfsqesoarnbvqhvrowtyzxmrpw|qvt~~|x{ypusx|nyvq{q~zs}zoxulsptywqxus{zs{zqzypxvpxwlvtoxvpzxt|{nvuszyv||v|{w~}x~~y~}|{~~z~~{|~}|y{||}{{{|rzzwy{{}{{}|}}|zx}~~v{|uz{}~|~~}~zv|y~{}~|xw~{z~zysxxxtyw{|{~~}}}}}zz{}|~{z~yw}{|{||~}xy|zz{zz{zztsswwvzyy}zsy|u{|v{~xz{|{|z{xz~z}y|zilpswzvxvxyzyzztuz{}~{|{|{}}{vxupr}}{}}wyytvvuwv{zz}}|zz}{{}{{|yyzwwvuusqqyyy{}~uwxy{}wyzrtux~{s{z|t|{t{zszwpvkck{tz|uz~tu}stvx|rsukmyu{zv|vrxtpvxtzpmozwy{}uorvzysuuuzqsxmnsprwqrwtorpjpngnuptuqpwrqwppvposmmtnnrnmmlnmjlplnnjlmfiXYXVYYJONVXW\XY_SWe]_ZYZY\]^`aa_ag_bh`cjbdg`cf_aa`f^agabhidjiahfbhb`f]^cX[`imqkotgimqrvabfffkgglkgm_cgqlr{hpsdkjgihfhjijkjkjhjljleadtpsjgidcedacmmnffhoopjikjikrqtjjmsrtuuwtsuoqsnqvorxpsxmpunqvn|~kw{grynxit|lsyouxafgostknnz||tsuoopsrtrrsrqs{qszstuopwrsuopvvyposxvztsvutwrrtmoo|}}opptssooousssqqvttrpptrrtttpopkkkvvvtssssu{v|touwsyvsx{x}wvvtssllluuuqqqsrvwt~uq|sozwsqnxsoq|xzxtvz}xsurqsz~rxyptuvxyzzzvwwyyyyyz}}}yz}rtzs}kxhiffdeehgkpqfi\agkmrnrrspqvuutywzu{w{x{z~{{{w|~pw{|v{~ruz||~x|~w|}wyz~x{}}}{zzrss}||~~|~~z||uxxpwvszyt{zt{zt{zuyxx|xvw~}hlqw{y~y}{}{~{uxx{w{ztu|}|{}}z|~~}}~|}|~}~|}{|||v|zx}|x}|tzyxx}~uvwvuw{xz{|~~uvwz{}z{|}vz{v{zsxwrwuqus|xz|y{trr}|{yyrwxrwxmrrsxxw||w}|qutvzzkoouzyotssxwlqpqtssttrrroooyyzuvwnqqlqpnrrnqpqtsnrqqrrrttprrprroqqqssoqrjonmooppppnnrppvqrsnoqoonmmpqqrttlnnjllmoolnnkmmoqqoqqoppnppnppoopmmnlllnnoppplllmmmmmmmmmlllnnnusntpm|yxvstmijpnojjjmnlmmillgmnjuqrrppurrtrrqooqqpqooppoommnmlpprporsruqpsmmokikvuulllnnoppoonootsjoo`ihitrfrphqpeomhqphqolvtlsrptrfkidigsxvw{ylywmywn|zl|yi{xjxvo|zmxwt|{|lspy}s~{kywnyzv}eyvfyvjxvvowvl|yp|t}s~|p~|p~|z~}|{y||}||~{|~{~~{}}}~~{}{~~~uvv~}}uz{{qyyyyxxsrs}|}yxzwpw}{y~~z~t}|sxw~}}z|~{}}}|{~z}x}v~x~w~w~v}v~w~}~vv~{x{xw{|{w|~yty~z~z|x}{w||y~}y~~xz|wx|}xrs}~}yvx|y{|z{}~{xz{z{z|wv{z|}{|{wxrno{uvtwtwy|xy~~z|z|{}}z|yvxyvx}z|}{}}y{}wyzxz{suwkopxwy|y{|y{y||ux}wzusu}~vz{xwwwwwxxxvvvxxxyortinndguyuxzuxsprtrstqtqnptsutrttsutsumlnwtvwswwtvuruwtvyvxwtvtrturtwsuvsuxuvvuvspqrpqtqrvjrwgovem}owqms}sw}puznrzmrtglvlpmlnjikccecfgehiSSSX]\JONXXX[VWdVZ]TWPMO\^_^`ac`bg^ai`bh^ah^ag^aabf_dg`eghdikdhgcia_e[[acfkfjogjoabf^_cbcghimabfjfkhnqb`dwelm`fgdffegjikmlnonpllnjgivsuolnjgiifhlopcefjmnlnojmnpoqrqssrtnmoonpmop`chqtyjmrruzpsxivxlx|gswkx}ju}lt{ry|puvptu{}}lkmrrtsrttrtrrtzrs}tuwqrytuwuuvuynmqutxutxtswqprmmm|||uuutttjjjtrrywwywwvttusswww{{{tttyyyxxxyyyxuwurtwtvyvxzwyyyyzzzyyyxxxsssyx|vtzwt}|x{lhs}xz}xzvqs|xz{vxsrtquvnvvx}~qsttttssswwwzzzyyyrtuw{q{frjvnoihjkmn[^qtjmpsw}rwrvtuxxxvvv~z{v{w{x{z~{{{yvy~mrsquvwyzzwyy|}z~{{}{}||||||zzzyyy|||~~}wyy~xu}|s{zs{zs{zvxyx|w|r~t~~ty|x~s|t{~}|~|~{vxz~{|vqr~}knr}yxz{z|yy{}yptuy~vxy}}}|x}|tyxsxw|{z||tzxz~~z~~|v|zr||v~~|~xz{|~z||tw{vz{v{zuzysxvuxv|y{~|{sqq~~|zpuvuz{txzqvuotstzxmrqw|{uzyy~}uzyprrrrrtttvvv~~~oqqkpomrqy{{tvvprrrttqssqssrttprrmoosuuoqqjpnmoopppqooqoouopsmnooonnnopqprrkmmmooprroqqmoolnnlnnlnnlnnnppssspppggglllmmmiiillllllmmmlllnnnqmhlhcupmvqppkjmkkllllljijfkmgoplussvttrpp{yywuuwutnlkvtsomlusrnkmsprqnppmoqnpolnuuuooopppkkkmmmnrrkqpfkjksrhsqiqpfnngonjsrltsmsrknlgjh]`^qtruwunywlywn|zj|xk|xm{ymzxp{ypxw{nuru|ys~{n|zq||v{~f{xj{xlzxvszzo}ru~t}n|zr~w|{x}|rvw~z}}}~}||y}~{}}|~~|~~|}}~~~~}~~~xxxvvvv{|zy|zy}www{{{|||{zyyz~~|~zwy|~xuw~~|{~z{v|w}vzr{t|u|u~v|}~|{|~}|{|pos}z||}y~{w|xty}y~|}y~}y~x{z{|}yst{|z{zwy}urtxuwzz|wv~yxzy|{}||{{{}~~twruz}{|vvvjhjxuw}{}vsu|z|~{}}z|yvxyvx}z||{}}{}~{}~~{}~lpquwxyxzxuwxuw~vy~x{uqslmnuxyuyzwww|||vvvuuuvvvuxwlovkntwux{vxpmospr~{}|y{vsulkmonp~onppoqvtvvtvvtvurtwtvspr{xz{xzvsutqszwyxvvvtttrrrppussxms{kr{jq|qvpkp{pv{ms{mszlr~pv{oukhj}|~ghimopimnNNNTYXV[Z[[[_Z[fX\e\__\^\^_\^_b^`d^`e^be^ae^ae^abbg`dh`fifbgjbhmfmdbh]\bkkqilqehmjkoijnghllmqz{mlpksvRRVtbiugmpmomlnpoqonpqprnmoliktqspmowtvvsunrsglminokopinocfflkmkjlonppprprsqtyux}mpuruzqtykxzly{lx|kw~gsynw|mtwjopeijoqq|~~gfhvuwpprttvsrtyst|vxyuvywwtttlkowvzvtxutxutxsqsvvvzzzxxxrrriiirpp{yy}{{vttvtttttqqqtttsssuuuvvvvruvsutqtqnpzwyvvvsssssstttrrrsrvxv|roxlhtjfsrny|wyuprtoqzuw}tsu{rzz{tvwwwwuuuzzzzzzyyyorst}vvhvfsrswxorx{ruchmqszoxu{ptqswxxvxv}z{w{w{x{z}{z|xxz}vy{z{|yvxwxyy||yxz}xzzzzzzz|||zzz{{{z|||~~xzzmoooqqx{{y~u{zu{zu{zu{zxx{w}wzp|utw{w|v}s|w~|{vx~wrsilp}~~zv}|~z~{~x}|v{zv{yz}{zzzsxw{|z~x~|q{{w~~||{}}vxy{|~z|}ruytxyv{zuzyw|zy}y}||~|}|zz}}sxy|v{|uz{qvwputotsrxvkporwvrwvsxwnsrlnnmmmsssqqqmmmqssotsqvusuuqsssuurttvxxwyyrttqssrttuwwsuulppmoonnnqooqoopnnonnooorttkpohmllmmmootvvprrklljlljlljlllnnjlluuutttdddkkkjjjiiillllllmmmlllnnnxrkd^Ye_Yngdullljkkkkjjiijhjkgnokiggpnnrppzxxtrrvtsvtsomlmkjsqpnikvqsytvtoqxsuroqnnnqqq~~~bbbooolrqmrpionktrjrqdkjionkqplrpmsrpvulompsqvywsvtrusnywlywo|zmzxj|xwq~|mxvzy~mtqs{xp}zjwuoyysw{j|xk{xlzxp}{q}{ssr~|q|zn|zo}{x||w|{nrrz}|z{y~}y||y}~y}~|~~}}~|}~vyw~~~}~|||zy|y~}||{|||}}}~{}y~~y~z~}x~}y~}~zwy~{xz}|~}|~|{||wyrxtp}yt|w|w}x~|{}z|w~{wvzurt|~z}y~|x}}}y~}y~x{|}~}wx{||wxurt}z|{z}xwzy|{~yxxyyv{zuxxqvuqutvvvj]_wzxz~{zzz|}||~mophiky||~{}}z|yvxyvx}z||{}z|}z||z|}suvvxynrtacdzxzzwyzwyzsvuprusuuxyrwxpuvwww~~~tttyyyvyvkntil}rutx|wy}z|roqpmotqspoqqpr|{}qprvrtvrtvrturtwtv{xzkhjvsutqszwywuuussrppvtttrrwls{nt|ou|qxmglwkqugmwioqcisekuionikjginlnkkmlnoQQQV[ZKPOYYYa\]cUYe\_ZWY[]^XZ[_\^d\`e^af_bg`ch`dbde`efafgdacg`cleld`fZX^ddjhkp`chklplmqghlabfXY]bdhcmpMOSn_eqflmkmjikihjihjgfhjikifh|y{olnlik{xzfooiqqdllgooemmgijonponprqssrtqstqtysv{vy~lotorwhvucpsivxo{~nzmvzmtwtyz~y{{jllhgiwvxnmoutvsrtxst~xyzyyppptvvrswxy}pquoptstxtvwxxxxxxwwwrrrnnnussmkkljjsqqvttvvv}}}}}}oootttttttrqwutiggxvv{yxzzz{{{qqqssszy}wvzvtzqnw{wolu|wy}xz|~|wy}xzyxzvz{s{{puvxz{yyyvvvxxxyyy{{{swxozeshtdsaqtuopfiqsghnqjqpxpyryuy{{xvvu}y{xzwzx~{z|{z|v~}n{yovujrqzsxwyvxywy|y|zwyzwyzzzvvvyyy~~~|~~~y{{}w{zw|{wzzv{zw{z|x}ww}yxy}uz{yoxxkwwu|zxz~~nlntw{}z~x{|y~p~}n{{p{{xrzzx}|y~}|y~}z~{{|w|z|}}{|y~y~|w{|z~|x|}x}r~~urvwwyz~}z~swxvz{y}~ux|quvtyxw|{x}{|{|{}|z||wy}wynst{tyzuz{rwxtyxrwvpvtnrrputotsputuzynppoooxxxyyyhhhnpppvtotstvvrttrtttvvprrnppqsssuurttnppqsslqpmoonnnqooqooommnmmoppoqqlqplpolqpjonafedihhmllnnkmmkmmjlljlltttvvveeellljjjjjjkkkkkkmmmlllnnntogmgb{vq|yibbnkmhgikkkkljijfklhhfewutnljxvu|zyxvtywvnlkrposqpytvwrtwrtrmouprlikooorrr|||lllmoomrqlqpntsksrqwvqwvkqpionmsrv{zjkitusssqvwustrpxwnywo|zm{yn{ycpnlywlxvjrqmsrw~{q{xn|xfsqqzzwy}n|zo|zn|zlyxm|zqr~qyxt}|to|zy~}x||imn~ux}{{|}z~y~y|~|xzxxzz{}}|~~}}z|||}~~}~|}rrrjrrv~~x|yx|}}}yyyxxx|~{~y~}stt~}z|~}}}~|{|w}y{~y~zu{v|w}y~{z|}||x|~|x}~z{w|{w|z}w||v{y~y~x{~~|}|wxxuw}|y{|y{}z|}|}|~yx}||{z||w}|u{z{|z||yzy{z|{|}wxz|}vxxmop{}~~{}}z|yvxyvx}z||{}xz{wyz|~~vxyptuPRS{z|zvxyvx~y{}z|wvxz~rxxrwxwwwtttzzzwwwz}~~~svvyxrttqsroqnkm}z||~{xz{xzurt~urturturturtwtvvsutqsurtwtvwtvusswuumkkzxxtrrtknxorzqt}twkdgzntugmzlryn`frfltmppjmmikwuwmlnXXXSXWTYXXXX]XYUGK\SVJGIUWX_ab_]_gbdfaca\^c^`facdfgbghchiZWYngjkdjiahgcihflhhn`_foptfgktuymnrklp_dgbnpTX\tgmtmrnmomlnmlnkjlihjmlngdfqnphegifhpmoemmbjjhqqdll^ffgijhgigfhkjlihjmophkpknspsxjmr|hvscqpdqtnz~r~mvzipsotutxysuuacctsusrtzy{ttvvuwvttuuumnnmppputvw{stxoospptmnrlnotttssssssssswwwsqqrppqootrrvttxxxuuuuuuvvvxxxuuusqq~|}pnntrrywxvvvwwwwww|||{{{tsvwvzljp{ywt}tqz}xzqlnwrtrmo}xzqprostpxxotuqstwwwzzzvvvvvvzzznrs`ltgusiz]omnacjoprstrtipcomxmttvrrom|{w{zx}{yzy}zy{|{}t~|o|zr}{t}rxwx}|vsu{}{ux~xz{xzxxxyyyxxxzzz}}}xzzxzzuwwvxx{}}}{{{xyyzzzyzzzzz~wwwywwx|vz|wwmyyozz{~|~~{{rwx|xq~}{uzy|rwvz~||||x~}zv|{w}|y}~vz{{}|z~vx}{uz{w|}w|}ux|quvtyxv{zz}z~y|y{z{|x{{y~tyzrwxsxyuz{tyxrvvotsputotsqvusxwtyxoqqrrrssslllsssjllputmrqrttprrwyy|~~uwwmoooqqxzzuwwrttvxxputlnnnnnpnnpnnqookkkmoosxwrxwmsrjpohnmcihekjhnmbddlnnkmmmoolnnuuummmWWWnnngggllllllllllllllllllolhokgb`]niitpqtrua`dihjjjjbca^_]iffqon{yxnlkusrxvttrqomlomlxvunjlokmwrtsoqwrtvsusssuuuvvvssssssppplnnkpokqpmsrnsrnsrjonjonlrporrqsqstrtvtrtrwxvnvupxwq|zjwudrp~bommxvlttpvurzwq|ylzvt{||s}{r}{p}{hyvj~{n|o|zu|{}xr}x}|x}|swxtw{mpuvv|yz~vz{~z||z~wyyz|}}|~~}~~~}}~}~y|zwu}}~~~~yyy{{{zwy}vywz~{}|~~{}{}~|||~|{~y}y{~y|x|w}y~z}|wwww|{~{s|~{zwtv~z}y~}y~}zy~}v{zz}~xyz{|}|}|y{wtv~|y{zwyzy{z}|~yxy{{tzyzx~}y~sxw|xy}y{vx~wxxz{xy{y{|vwxy{||~xuwyvx~{}yxzkmn|~}z|}swxwyzwvxyvx{xz{~vqsvtvwz{sxyotuvvvzzztttuuusssuxvywzujmj_b~y{yvx~{}~}xvx|y{nlnzwyqoqtqswtvurtxuwxuwwtv}}pmowtvmjljhhywwnllsqqvorunqyruvorpfjvio{ms}ouvhnugmylr~uxrjmohknikrnpSSSRWVW\[XXX]XYcUY]TW`]_Y[\acdYXZ]Z\_]__\^ebdebdaccbhfdji_]]nhiibgf_feagiflecicci_`d[\`bcgbcgefjbil\kmlrushnnglihjhgijikkjlmlnnmojgilikgdffceolninohmnfklgkmdijlnorqstsulkmkjljlmilqjmrjmrn|zhvtftso|~htxhqujptpuvtxyprreggpoqrqstsutsuqprtttuvvptsputjpotw{ruysw{qtxorvlopuuuuuutttsssvvvvttusstrrtrrtrrpppqqqppp{{{xxxvvvwut~}~|{{yx~}sssqqqooovvvxwyutvutxpntwt~vtz|vxxsuz|ytvvuwrvwqyyotuuwx}}}|||xxxyyyvvvnqrV`iXewiwcuduuuhhwzcdxvqsgnmxwiokmqpmkyvwu}~y|xwy{z}zy{|z|zz{t}r}ynyvmvsx}|y{x|x{|~|{}{{{{{{{{{{{{{{{xzzuww|~~z||}}~~}{{{yy|zz|zz|zz~tvwwutxyu}||esqvyy{z~}~~|}~z}|zyxv~~|ywmuu{y~}}uzy{|||}~z}x~}}v|{w}|{~x{{~y|z}zuvrzzx|}|~jopswxtyzvz|tw{uyztyxv{zx}{x|w~y}y{tyztyzuz{tyztyzrwvpvtotsqvuputputw|{z~wwwwwwzzzxxxegglqpmrqprrrttprrikkprrjllprrprr^``suuqssotslnnooopnnpnnonnmookpootslrqnvujpohnmhnmionjpobddoqqrttnppmooqqqlll^^^mmmjjjlllllljjjeeehhhkkknpoxwwxy{sqt^]bpntcbfjhjkkleeedecpoknmiutoqpl~zwutvtsywvrpotrq|z|rstvtvpprqoqpoqrrruuutttppptttpppnnnmookpomsrrutoqqlnnmoomoolnntqpvsrurqxvuwutpvuqyxoywjwuhtrxhvtmxvnvusyxr{xq{o~zo|z~|z~v{zsyxp}{pg~zk|yjvty~{yo|zx}|x}|jno{~||yz~x|~tzyx~||v|{xz{}}~|~~}~~uxvwzx~~~~~}~{|~||||||}wx~~suu~~~{}~z||~|z}}}y~||}{z|zy}{z~|{|x~}zzzyzy{tzr{~uyz}}y~|{{x}y~{z~z~y|}wxyz}~}~|z|xuw~{}zwy}z|}xw}xw}xwzvtupouvvuzyswvuzy|wxx{|xzxzwy{y{yuwsqs}yz{y{|z|~{}{xztqs|z||{}y{|tvwz|}vxywyztxytvwvuwyvx{xz|twumpvpr}wxyqtuuuuzzz{{{zzzwztxy|uprzwyvsupmovsusprytvzuwsmo{vx{vxwtvroqroqtqsurttqszxz|z|nkmsprolntrrzxxcaa}{{qoovpqjggtrrxrstjlwiougm{msn`fqwugm|qtqgjypsyruysvYYYRWVW\[XXX]XYfX\VMP^[]Y[\WYZYXZYVXdacb^`dacebdacc`fdagfeccicdldikcjlelkgmljpgek^_cefj`aecdhghlbknZjldknqhniejihjhgikjljikihjlkmnkmqnpkhjhegroqjnoegh]`adggadeihjnmoqprutvjikmopjmrlntx{lotux}etpbpn]kju]jlenripspuvx|}prrmooutvmlnqprxwyutvqssqutputipo\edptwnqutv{vx}ux|ostrrrttttttsssuuusqqussvtttrrtrrtttvvvuuuxxxppppppvts{yxyvv}{zsqpsssuuuwwwqqqtsuwvxnmqtswyw}wu{ytvuprmhjlgiqlnpoqhlmhpppvvvxyyyyzzz|||yyyuuurtu`epiresducv~|yxmotsyuuvszmwq|kmjjhhyxur~vrwz|}}}}|~zy{|z|zz~kvtfuqjxun|xoxuqxuzwyx{xz}~}}}}}}}}}tttrtty{{xzznpptvvyyyz{}xy~yz~yz~yzwvuwvw{|t{zs}u|q}vt~~x}~x~y}~~eppr}}vywx~jopots}}x}|x}|||||}z}w}|v||y~x~}{~|~wz~z}{uvxz}~}u}}qyyux|vz{vzzv{ztywx|vztoxuvyx~urwxrwxrwxv{|rwxpvtpttotsrwvrxvntrw|{w|{z||lllhhhlllssslnnkponsrprrtvvnppkmmtvvqssrttmoobddxzzsuunsrlnnppprpprpppppoqqlqpv|{fnmfnmgongonhpogonfnmaccmoonpplnnikkjjjlllgggllllllnnnlllkkkbbbgggnnnjoqikoehnijqegpljrgdkjimkjldddijhqplrqmwvsrpmzyuqontrqgednlksqpw{{otupstnrsjmnilmjjjrrrppplllrrrrppnnnmoomrqotstvvmookmmnppmoonoousrvtsxwvomlusrrxvrxwpxwkvtivtq~|n|zlwunvutzyqzwn}yn|xfsqz{vzyqwvo|zi}zc~zm~{q|zrwvsyxu~s~|x}|x}|]ab~}|~|w}|{}v|{~}{z|}~~~}~}~|~~kpqnvv{||{zzz~~~||||}zz~||x{{{|~{}|~~y|z|}zz{~}|}{z}{z|zy~|{}|~z{z{y{z{x~ywx~~{}{w|~z{|x}zv{w}x~zw~w~~wz}wx~xy}~~}z|xuw}{xz{zzyzy|{|wvyxx{||vvvwxxxxxy{{z}}z{xz{}wywqt~vy}wyz}xrtzvxzwyyvxspr{xzyxzrtuwyzsuvxz{swxuwxzy{yvx{xz{~}{}yvxvuxwwwxxxqqqwz~svx{}ruy|zuw~{}yvxsprvsulikzuw{vx}yz|wyxsutqsqnproqroqpmotqsvsuxuwnkmqnpsprwuuwuuomm{yy{yyvprsrrnnotqqujlykqwio}ouoag|ntykqxjnrfisgjndgxruTSSQTS\_^XXX]XX`SWUMP^\^XZ[fgijil\Z\_\^dac][]dbdbdd^db\bacaahbckbhiahldklgmgekjhnabfcdhhiliknhgldloVgi`gjmfkkhmffggghjjlpprhginmoolnnkmmjlgdftprqprnmosrtpoqjiknnpmlnjikjikrqsmnqkntmptpsygkohkqapl`nl[iglx{ly{fnskrunstw{{looqrsxvyllnzy{srtotslqpjpolsrrzyty|pvxuz}w|x}ux{uttwwvuuussstttvtttrrrppsqqwuupppvvvsss}}}ppptsrwurzxswtr|zv{yvustttsrrr}}}{zzssspqqrrvsswwu{}|wrtuqsnikokm|~zy{hlms{|sxytwxxyyvvvvvv{{{vvvz{|uy|mxj|]pmkgfvxxuytrskphqnxnrkkljwvzx{x|}y{z{{}|}z{{{y|{{~mzwl|vp}xlxss~ynvs|~vyvy|~~{|||{{}||uvvy{{xzzxzzvvv~z{|xy}zz}yz|yyvuwxyw|}r|zr}{o|ys~q}s}}t~~yw|}y~~~{|~|~{}y}|r{{z{z|syx}z~||||{~rwvv||pvv|z~{uw|{}}{tuwx~{jqqsz{v}}u{|y}uyzx|{v{zswuwyu{tzxz||sz|r}rwxuz{x}~v{|rwxotsotsotstyxsxwlrqqvunsrvxxqqruvvrrruuuuwwntsntrqutswvrttuyxyz{wyxrstrutxzzwzyrttnrqlnnqqqrpprppsttmoootstzyjrqjqphongonnutksripo`bbgiiceegiijlleeejjjmmmlllmmmnnnkklooouuusssrrriotgkrfltilvlp{igqhflkjnhgibbbijhklelmgrsmopituntrqsrqnlkrpovtsnrsowwouvlttdkkbghfffuuummmiiirrrrppnnnoooptsqvuwyylnnjllnppprrsttwtswtsxuttpotqptzyoutt|{kvtlwumywumwulsrsyxnvtm|xl}yv}xwzvxxputo|zf{xd{l}zpzx{r}{s~|x}|x}|Z^_{~z}~~}z{~w}|w|{~||~~{~|~~~|~~xz{{|y~{z~{{{|||umnvqr~|~}}{z}z|z|}zzz}|~|{}|~}~|{}||xyw~y|y}~{~y~x~w{w}x|z|wxwy}~|~wuwyvx~trt{z~yx}xwzy{zzww{yyzxxywwwuuxxxx~|{uvxz|~wy{ruz}{~y}w{~z||~}{y{z|}vxywyzwyz{}~txytvwxvxyvx|y{vztxux~vyxrt{wyyyzggg}}}{z{wzwz~twwztw~y{vtvxuwzwy~vsuysvysuz|ztvxqttrtzxzzwyqoqlikurturtxuwpmoqnpxuwxvvommpnn|{zwuuvqrwwwptsoklrgiuhmzmq|ourekzlrvhnufjvimyorxpssjmf\_kaeg]`dZ]j_c^WZYUWZY]ZY^WW^hjoX[\ehiWZ[adeehikikigib_aeadiegfchecib_e`^digmfejnkmhfgmioqntkfoimnafffklfjjadedklbllagh^cdX[\jmnlkmnmokjljikkkmsoqnkmqnpkhjkhjkgipmolkmpoqprsmptklvklvst~jkunoybhiiopgmnkqqqwwlsvipskrvouxiorioqorspuvmpqjnolppmqrloqostptuswxux|ikozz~ffjyvzvsxmopy{|vxzuwxsuv|}wtutqqvrspmmqurpsqstrrtqspoyvuxvvzzzpqxjkpsxztjlxrsqpprttmprquvfjkmttmvwnuutssyzzxxwkkk~~qts{tyxpxwszysxworrtttxxxvtt~v|st~kvkrip}mtgnkmmsfpsygq{nys}qx}s{~x{wy}x|~w{zy~qwwqwxrxxqwwu{{tyy{}wsu~|~zxzsuvtzytvvyyyyyy~~}x~}x~}yzz|||{||z{{wxx|}}~zx~~{y~|xxyvvwzzz|~}}~~z|{}}z}|~~|~~~{{|}{z{yzu{u}~||ut}vy||~y{|~z~}x|}z~~~{{}xsuywxsts~|}~{y}zy|vwxww{tv}stilwsxysxyv{|x}~rxyptsqssmrqmsr}lvtq~zdkhx{ysxvowtuxxprrwyyqsslnnlprnstputlrqageszuy}y_c^osoptntwtnnnqqqsssqqqkllqssnppopppqqqoopoojonlrqrwvntskpooqqmoolnnoqqmooqqqmmmmmmnnnmmmlllqsppqotusvwursqjqshorjptflshmukmukjrggmhim]_`wyyjojhmhiniioijpkqjlzuwursvuwppqkmnnrtmwwhrrejkorsrvusuutttmmmsqqrrrqqqsssxxxvwwvrrvuurrrqppwyyuyxtvtsussusikixzxtzxhqpt|{grpivtsxwy|{rutrvux{{pvujxvjxvkywl{xt~||jonto}k|ztzs~p~k~zo~zo~zVdacrnl{w~~z~{r}x|}~u{{ino~sxup}wzz~~pzzy||z|}~zwy}{v~}vzzwtt}~~yz~~~~|}~}|zz~|||}}}}}}}}~~|~}yvw}}|~z{xuy|~ytu|~wzxzy|uwtwz}wzruz}z{{|~{|{||}}{|upq|wxz{|wx|wxxrt|xypmo{wyvsuwtv~x{~xzz}|t}}v{}wzx{{tw~wz{vxtvwuwxwyzz|}y{|rvwuwxutvxuwyvxy|{~uxux|ru|tw~}vuz}||y{zvx|vyx{~uxztwytv{vx}xz{uwvsustvwxy}{}zwysoqytv{vx}xzzuw|wyvttxvvwuuvtt{zyywwvsunkmmjlxuwuopxrsvpqtnoqklxstnklheggdeminlglnilqknpkmqlnnikQEHVJM_TW]RUeZ]c\_\Y[[Z^ZX^ZYbVY^bde`bcZ\]fghiklhegjgi^[]pmoheggekb`fb`f_]ckiofeihegifhlhnkgmd_hfjkbfgeijgkldhiaiicmm]eeejk\`alpqpoqonpjikjhjljlmlnlkmqpredfmlnhcemjlkjledfjlmjmqjlvjlvqr|jkuuvuxzswxptufjkw{|tz}lsvmuxmtxnuxntwrvwptufjkosthlmnrtmqrptuswxvz{ux|mnrzy}edhuqvzv{lnoiklnppmopikl|rs~su|rtynp~uvpqouxvvwustrrpnuqprqpwqrvkm}nqvxwlnxrstsswyykopnrsmrsqyypzzs{{xxxtttnnnjjjtvvmsquzyrxwrzyw|{rttsssoooqoo}xyx{nx|}|{]iojv|p{vx}orwilprvwv{zy~}txyswxuyzuyzjnovxy}{xz~{}~tzy{vxxyyy|||uwwpvuv|{vvvzzz|~~xzztvv|~~z||zy}~{z~vvxzzzyyyzzzzzz}}}}y}~~~{{|}{{~~|{~y~|u~~|z{}}|}z|z~}txyy}~~}{~vuwzwy}xzvttttt~|~yx|zy}xz{yz~z}wytxvzzuyzw{|wz|swxtvvoqqmrqhnmpxwjusn|xmtq|}tywnwtuwwrttwyyrttoqqilpnstrxwkqpcjgz|y}xgkftxsrvquytssstttoootttrrrqssnppppppppqoorppqrrnppgiijklmnomoolnnkmmlnnnpppppmmmmmmnnnmmmlllrsqqrpmnlpqonomfnnelognqgmrflsgiqjirjjphimacdrttkpnejichffkiinlvorlgispronprqsdfginobllgqqejkoqrqvuwyyvvvtrr}}uuuqqqwwwzzzuuu{vwvttrrrqqq|~~uzytwurvtx{yhkiwzxrxwksrnvufrpcpnnsrvxxvxxuww{}}outlzxl{yo}{gusv}}otsxk|yru{zr}rj}zp{p{aplhwsp|}~~~~~~~~tyxu~vu~z~xyzr~vxx}oyy~uwx}}}~z~}zxx{yy~~}}~~~~~||~~zzz}}}~~~}{z|zyxvvxvv~~x}w}t~zyv{|~|wy~z|y{{}}qsvx{~wzsuwztv|wx|wxytu~yz~yz|}|}topytuzuv|}|wxzuvsnoz{}yvxpmoxuw~{}zwyvrwrmv|v{zuwxtuzvwz|{xzvxyuwxwyzsuvxzztxyrtuyxzwtvxuwvyz}x{~rv~ru~twrquvuy~}xw{wvz{xzyvx|xz~wz~vx{twytv{vx}xz{vxwtvxz{y{||{}}xsuwrtzuw}xzytvytvzxxzxxzxxwuuxvvywwurtolnlikpmoyst{uvztutnosmnwrsqooc`bkhjqmrkglqlnqlntoqsnppkm\SVWNQ[RU]TWe\_aZ]]Z\ZY]ZX^ZYbQTY`bc^abZ]^bef\^_heglika^`nkmkhjb`fa_efdj[Y_hflihljhjifhmiolhnnirgklgklfjkfjkdhidll`jjZbbjopeijjnoqprlkmjhjhhjkjlkkmedfrrsgfhnopkgiqnpmlnmlnkmnfimjjtjjtijtnoyklvlqrhlmlpqglmrwxhmpjorotwpuxx|nsvrvwptufjkquvostquvuyzosttxyvzztw{pptxw{}|yuzplqz|}rtu|~z||}xkm|npuwxjlqdfnomorpmnllmkqonvrq}xy|vw~su~qsqs}rtxnpvpqpppqss|lqr{oyymuussspppwwwpppqqqtss\]]sxwrxwtzyw|{vxxtttpppuss|wx||lxn{r~n{|gjogswitxox|x~tzy|z~|x~|rwvvxyqstvxyxz{vxy|~osttzyv{zvxx}}}xzz~{{{{||||~~y{{z||~}~~{z~yx|ttu{{{{{{uuuzzz~~~||~||~~~||y|}uz{|x}~|~}z||~z|}~{{|}{}y~|}x}{x~|~|~xz{~}quvsvwywzzxxxxx~}~}xw{zx|xz{z{y|xzx|w||uzzw{|swxrvwnppprrputpvupxwozxo}ynvrz}{rwupyvvxxprroqqeggilpnstrxwsyxjqn|~vzvlpjkojmqlrvqvvv{{{oooooowwwqssnppppppppsqqrpporrtvvkmmjmmkmmkmmjllikkjlllnnpppmmmmmmnnnmmmlllrsqfgeefdlmknomgmlfklgloaejbfkffohgpjjpijneghnppkpnfjhbgeejhinkvoruprnkmonpxwymopmrshrrnxxinoqstoqqfhhywvrpprmnpppooorrrwwwyyy{vwrpprrroooy{{v{ztxvtvttwuehfuxvtzxpxxgongrpcpnnsruwwy{{uwwz||v{zlxvn{yp}{n{ymzx{yyy~}tk|yuws~{r}vj}ztto~zp{uy|zz}{~z|||||zzzy~}q|zo}{r}{u}|y~y~{tyzy~t}}v}x|yw~v}}|}~}~~~~|~|~z~~||zzz|}}|||}}}}|~|{}{{wuuurt}~{~yy{{~}xz{}wytvwyz|suwzz|z{xy|}z|~yz}xy~zzytuz{~~zuv}xy}xy|}~xz}xyxstyvxyvxlikurt|~{xz}y{zv{{w}zzty|wy~y{|wy}}xz{vxxtvxoqruwxtxysuvzy{sprvsu~vxvmp~uxzqt~ux~wztswutxyy|zwyyvx~xz~vzvy{twytv{vx}xzytvyvxvxywyz~|~nkmwrtzuwxsuxsuxsu{vxsqqzxxywwvttrppusssprqnpnkm|y{fceuopvpqxrsystrlmpkliggjgiqnpwsxtpuqlnojlnikrmo{vx[QT]TWbY\TJMd[^XRTXUWXW[YW]WV_Z]ba`bb`b]\^hgia`blikmjlheg`]_pmodbheci`^dhflgekihlifhmjlmioeaghcldhigkldhibfg`dedll`jjhppglmgkl`decbdgfhihjhgijikkopjmnhlmjmnjnolikolnhgijikmoplosijtijtlmwghrZ[eikljlmxz{wyzqstbfilqtglow|nsvrwznrsquvptunrsswxquvkoptxytxxvz{tw{rswwvzsrv{w|sotxz{kmn}prsxzzwrswpqrkltopsusrusxywkljpnmsonqlmmghvno|qs|prwpqvpqtop{{{wwwnrsgklv{|lttisspxxtttmmmppprrrtttPQQwyysxwtzytyxwyyvvvqqqusswrs}|z~ortp|~p}s|v|uxx{vy}{v{z{}~xwy}{}ywyonpxvx|~{swxtzysxwvxx}}}|~~{{yyyz|||~~}{}}{}}yxztsuyxzrrrwww~~~~||~||||~suv}~~|~~{{|}{y~}tyxz~sxw~{}{{~|y|z}||wx{~z~|uyzy{|vxysrtroq}}}zz|~~wvzyx|vxyz{|{}rv{|xy}xy}stxttxwyz{}}qvupvumuthsqkyuovsvywnsqpyvvxxrttoqqgiimptnstpvulrqkroz|txsosnptolpkkojwwwqqqqqquuuqssnpppppnnnrppsqqnnniiilllmmmnnnmoomoolnnikkhjjpppmmmmmmnnnmmmlllmpnadb`cahkilomgmlfklhmnejmbglhgphgphhnijnhjkjmnhnmflkekjflkgmlqjm}xzurtqpr|{}prsinokuuq{{glmmopnpqutvsprwrtpkmnnnpppnnnuuuyyywrsmkkrrrkkkqssv{zuxvtwunqohkiwzxu{zv~}dlkp{ys~v{zxzzxzzuwwwyyjwumzxjwuivtjwuussz~S`^m~{tur}s{zcpnrgzwuuv{wwzxvyw~y{{{{{yyyqvup{ym{yvs{zznut~v|{}{z|}~z~y~|{}}www~~~{{{}{{|zz}}vtt{yy}}}{{vtt~{{}}}||zy~~wtv~{z~|~~~y{tvvx|~zz~z{z{|}zuvztuvqrwrs{vw|~{||wx~|vx{vw|}~xz{|}xy{vw~zwy}z|spr|{}~~ww{pntvt}||~~{}vsu~{}}{}xz{vxysuvprsuwxtxyvxyxwyurtvsu}uxwz~ux|svy||vqvsotuqv|x}{w|yvxyvx~y{}vyvz{twytv{vx~y{xsuyvxxz{vxyifhzuw{vx{vx|wywrtxsu{yyrpptrrljjrppsprqnproqurt^[]vpqvpqztuzttuop|wxtrrgdfheglhmtpuuprpkmnikkfhojlRKNTMP^WZUNQ_X[_Z\\Y[POSVTZSR[fhm[[]bbdhgikjlfegebdfcegdfdacgdfhflhflhflmkqmkqfeijgijgiiekd`fjenhlmhlmgklaefeijpxxisskssafgeijeijgfhhgiihjjikkjlgkmhmnkpqkpqafgkhjmjlonppoqkmnlosjkujkuhiscdn_`jsvwnpqhjky{|npqgimhkogjnz}nquwz~x||fjkquvnrsostosty}~ptuswximnpswmnrwvznmq{w|njortuuwx{}~gijqsthnmkpptzyinnqwvnsqsvtqrplmkqonnjixstnjkwrsvnozrsurrtpquss{{{oooruvquvrwxltthrr~uuu|||tttxxxppp}}nnnx{{rwvsxwuzyvxx|||yyy}xy||y|xzzlxws}}sz}x|z}y|tw{z~||~oqrz|}|~{~~wvxqsttxyy}~inou{zv{zvxx{{{|zzu{z}}}}}~fhh{z|{z||{}{{{~~~~~}{{{yyz}xsu}}~~~{y}~}|~{y~}x~}z{{{vwyst}x|}x|}y}~x|}vwxuwxzvxzwy}}}yyywvx~~wvzyx|tvwvw{nqymoymq|zzxx~uu{qqwuu{uwxxzzotspvtowvozxkyupxttwupusnwtuwwrttprrvxxrttrtxrxxlrqlrrkroxzvzuswrmqlosnkojeeeiii{{{jjjnnnoqqnppoooqqqsqqtqqqqqlllnnnppprss|~~qsstvvgiijllmmmnnnooommmnnnppporpiljfigiljnqojominmhlmilpilpihqihqiioghlgijeijckjdlkgondlkckjpilnikurtqprmlnjlmpuvissfppchilnnjik{xyqln|wy{twppptttiiisssrrr{vwjhhxxxjjjnppotsuxvtvtz}{nqo{~|v|{s{zksrfqoR_]v{zuwwxzzwyy}|grpozxt}t}u~{yy~k|yp~wp}{xsouvwutz}{wzx}~}~z||yyyyyyputjusp~|u~x~{|~x}|~syw~}|~~}|||y{{yxx~~~}}~||}}zxxxvvtss~||~|||zzzxw}|~|||y{~|}}tnsz|~y{z|}{}wyuwrt}oqz{||||{{qqqnmm{{{|wxytuupq{vw|wx}xy}xyz{|wx}xyzuvzuv}xyzvv{vw{vwxuwzwy}{xz~{}yxzzy{wt}}x~}~{}|~}xwyuwxsuvwyztvwtvwrvw|~poqsprwtv~wzztw|voryruxqt|urw|x}rns{w|xuwzwy~y{|uxwzyruytvzuw~y{xsuwtvrtuxwyyvx|wyvqsrmonikytv{vxzxx|zzqooqoonllrpptqsqnpsprvsuroqwqrnhikefztumghupqqoopmolikokpplqtoqsnphceidffac^VZWPSZSVVORYQTWRTYVXXX\XV\\[dXX^c`bebdgdfgdfd`bgdfgdffcec`bfbdfdjecifdjdbhjhnedhheggdfmiolhnmhqgklcghfjlkopnrst||`jjfnnbhheijgklihjjikhhjihjjikgoohpplttemmckkqoqkhjsrtonpjlmlosjkujkulnxhhrfgqrqsjiklkmmlnkjlhimdeieeiefjrswlprkopx|}lpqkopkophlmmqrgklnrsruyklprqurqunjo|x}suvuwxy{|tvwuwxiwuerpo}{lzxaomkroqtrpqonom|zyqml}xytop{uvxst|vwwwwvvvxxxxxxzzztvxquvrwxnvvgqqv~~xxxwwwvvvyyyqqq{yywuussstvvsxwuzywyy}}}zzz~||topzv~|}}ozwnywx}y}xz{~pswz~|rvwvz{ostjnogkl}uwxrtuy}~y~ww}|w|{y{{ooovvv~|||~~}z~{{{{}}y{{{}}||||||~~~}}}}}}~~~{yy~~~{z|~{z~{{~~}~|u}|||||ytu}{{z~vz{x|}x|}x|}{}zz|{z|zzz|||vvx~}yx|yx|wyz~twmoyw{}{zx~yw}{yxv{tvwuwwnsrntsltskvtjxtszwsvtptrnwtuwwqsstvvvxxprrsvzv{|tzyoutnurv}xqupqupuytw{vvzurrrxxx~~~lllsssprroqqpppppprpptopqooqooqnnpnnpnnegghjjrttkmmjllmmmnnnooolllooopqqotrjpnfljhmkinlknljmkjlkjlljkoihpihqiiohhlhjjfjjckkgoohppdllckksloojlsprrqsqprgijlqrjttissdijoqrniovrwvpuzsyukqrrrsssllltttuuuytuommvvvjjjoqqputqtrsvtwzxvywqtrionltsjrqmxvkxvotstvvtvvtvvrttsxws~|p|zlwuozxw}{{{qo}sp~|yygxui|yr}s~ttr}{~||~y{{zzz}}}}yq}x}x|}|~|~~|~{y~~~~}}}|||}}}tvvwzzz||uxx{yy}}xvvyww{yy}xy~yz|}{yynkm}~~{}xzz||~~pr|~xz}|}vvvzzzvvvzzzzzzzvv~vqrpkl~yz}xyytu|}~yz~yz{vw|wx{vwytutop{vw|y{}z|{xz|y{|y{y|}vxyyz~yynmvutxtsuzy{yy{utvsrtuwxsuvvxztvwuwxtxyvxykjlvrt{xz~wz}vy{~xqtunq}}w|}w|}xrwvpuxvxzwy~xz~vzwzyruytvzuw|wywrtsprsuvz|}vuwvsuytv{}~zvxzuwzxx}{{trrywwwuu}}tqsqnpqnpsprolnuop}wxyz|vwvpq{vwpnnmjllikqmrlhmnikojlojlpkmnik]XZUPRWRT[WY[VX^Y[dac_^bZX^bajRRXa^`a^`fdfdacebdgdfgdfhegc`bc`bfdjecicaghfljhncbfmjlmjlsousouhcleijimnfjkbfg^bct||V``bjjdjjdhihllkjljikhfhhhjjhj_jj^ii`jjdnnZddedfa^`nmoonphjkgjnjkujkuqr|lmwnoytsullnpoqzy{utvmnrjkoklpfgklmqhimgklhlm`dekopostimnvz{x|}lprostux|rswutxutxfbgsotnpqqstrtuprssuvoyxktsq|zt}|p{ydjhorpuvtijhigfwsrunoz{ytuzuvzwwsuurttvuuttt{{{vxxquvqvwnvvakkhppuuutttxxxyyysss}xyvttwwwuwwtvvx}|prr{{{uuu|zzxtux}v}{z|r~xnvsrwzvy~qr|{~~|{z~u{|yjpqu~~rxy{y{|uyzotulpqlttrxwuzyttt}{{xzzw}|v|{}}}}}}z||wyy|~~y{{zzz||||||~~~||||||}}}~~}~|}{|xv~v~~y~}z||trr}{{{z{y{zy{zzz|||vvx|z||z~yx|xz{z}y{uy~zzw|x~{zwwyzrttpttntsltsitrjxtszwrvtotrmvstvvrtttvvsuulnnlosqvwu{zv|{pwtmtoswrrvqw{vrvqosnhhhsss\\\nnnpppprrprrpppppprpptopqoorpprpppnnnllegggiilnnikkhjjmmmnnnooolllnnnnppfkieihhmkhmkhmkjoijljhjkhjkikliioihqiiohjnhjlfjlalkeoofppcmmbllunqpkmsprtsuutviklkpqjttlvvmrsz|}wswysx|uzrhnpppuuuyyyuuu|||rmnjhhwwwrrrtvvsxw}~x{yx{yorporpmsrksrksr^igmzx`edrttrttprrmoow|{t|{pwwlsspwv|zz|vn|rr~q~|ytizwdwto~zn}yp{p{r}}~|~||~~}}}}t}tv}tyzz~}}tvw|~}}{{zzzz||z||vxxvxx{}}uww}||~~ywwyww|zz|zz|wx~yz|wx{vw~z{ywvxvuqoowuuzwypv}iuyz~}}|~z|~prxz}oqz|z{uvvuuurrr|||zuv}~}~z{vqr~yz}~}xyytu|wxwrs{vwtop{vwzwy{xz|y{xuw}z|z|}vxxxy}xx~vu~{z~vuwxwyyxzyxz}|~vxyvxyvxxtvwvxyrvwsuvmlnyvx|y{wrt{vx~y{ytvz{zty|v{zzvxzwy|xz~xz~uxyruzuw|xz|wyvqsliky{|{}~yxz{xzzuwytv{vx}xz|wyytvwuuywwussvttpnntrrtqsqnpqnpqnppmosmntnopjkztu{uvgbchffolnmjlqmrjfklginikojlpkmmhjXSUXRT_Z\WSUXTVOJL_]^UTX\Z`baiVU\a\^`\^a\^]Z\fbcgefgdefbdc`ba^`iflfdiebhhflfcigdimjkqmpqmszv|okrhmmcfgbfgbefchhnuvR\\aghfklehiilmjikihjgfhhgiihjhqqbkk`iiajj^ggjikkhifeghijhjklosjkujkurr}mnwqr|srtonponpYXZcbdnosttxtuy`aehjnghlnrsjnotxytxyuz{dhiosutxyswxmqrpswvx|ttxww{urwpmroprpstlmnz}~tvwrvusvusvvtwwtxwehgjmlklkonmtpo~xysmoupqvstvstptsqrrsttrrrsssvxyquvpuvltt]gg^efzzzrrryyyyyyssszwwywwwuuwwwtvvrwvwyyzzzuuu|zz{vx|zx~zy{s|ukspsx{{|yworwy|rvw~v{zqzzs~r||vpzzv~~xz|txyrwxqzzv~~x~}w|{|~~xxxtrqxyyy~}v|{}}}{}}y||{~~}{}}}}}yzy}}}}}}}}}|||~~~}|{}|y{}|}~~~x~xs}|y{~~|}}rpp~x|}x|}y|}w|}~y|}~}~~~yyxvuwyxz~}yx|uxywy}z|z{vz|zw}{xv}{{}~suurwvpvumtsjtrmzvryvqusnsqmursttwwwqrrrttjkkrvxnstntsmsrmtqiojmqmw{vrvrptoquqiijvvwbabrqrwvwqssprrqqqssstrrvrsupqsoptoptpptopjmmikkikkikkeggmmmnnnnnnpppnnnjllbjgdlhelignkhplimijljhkihjihjkjioihpiioijnjjlhklempemqhpsdlpckotmpqlnvrtonpssunpqlrrktujstjopmopuqwslrmele[b{qxrrruuu|||sssuvvnjktrsqpqvwwsvvotssusqtrsvtrusx{yntsovuqyxu~lywqvuqttehhrwvszypwvdlkcjinutx}|r}m~{q~tt~w~}hyvgzwn|xl{wn}xo~zp{|~}~|}y}{z~||vn|zv~~|gij|~}z~}|z||z||z~kqouzy~}~~}{{~||~||~||}}yww}wx|}|}|vw|}sqpywv|zz}}yvx}y}~{}|~}~|~rtuwvx{|xuu}yzywwxvv}}||}yy|}|wx~}~vqrupqvqr|xx}xy~xst{{xtu|wx{xz}z|~vsu}vz{twxvz~oqvmpvvuyzy{{z|zy{}|~wwy{{}z|}tvwtvwwyzvyzz{}~|~~z|{xzvpswqsysuz}}wy|vyzsx}w|{tx~w|}v{zwyzwy|wyy||svyruzuw~y{yuv}yzyvx}yy{yx{}z|zuwytvxsuwrtytvzuwtrrusssqqusssqqywwtqsqnptqsroqsprrlmqkltnozztmnytuyvvnjlqnpninlglpkmnikkfhlgiidfONPXVXTUVHLMVZ[Y[_`bf]^b]_cabfRUY[`dcjmW\`QWZ^dg`bfefjhhliekb^dhbfnjllfilgif`chegjinignqnxpmwqptllpmlp^^bfeiggllmnbbcqqsjklihjlkmjikhgicbdedfihj`efbfgdijgkl`defeilhmihlghldglfknamr`mpdpuYeigsxqprljlkjljikwvxpquknrmnrdbfmjnutwegg{||jonbol`spanndponxxlqrostkzzk|{gtsovvvyzhllkppjopbfgafgkpptsuutvonplkmxwymkqsruqmp}wyztutmnvvwllsszoo~srwpqvpqvpqqnnsqqttttuusuuotsdjhafe|y{vru}y{}y{vruzzzzzzzzzvvvsssqvurxwwyzvxyyx|}v~}~~~tsu{}}x}y|v|uwxwyywyyz||xzzz|yvywzzz{}|{{}yx}xz{txysxyrzzs{{w|}qtv|{}zy{wvyzy{zz|xxz{z|}|~~}|{}}|~}|~~}~z|||~}|{}~}~}|||tsu~}{~~~}~~w||wv}~~zyy|zzkii~}}zzz}|~{{yw|vvx}{}~}|{}zy{xz{qwzvz}wxxu{uprzkmuqs{nqyjmuuyzinmvxxstuxxxvwwswuovshpmpvsrtryln|}wqrxxxsxwqvunsqjonmrqnsrlqpmoofhhwyyorqrttpnsmlqnmrechqouutvpoopppqqqvvvssspooooopooooopoonmmnnnooommmnnnnnnsssvvvpppnnnjkkbgehmkfkihmkinlsqrpmnqoqebdsqskgknknmjmhfhlikonpfjkkopmqrjnojooqlmqppqqqkonagfmspnsqhnlhmlmrrtvwtrr`^^ursspqwtusssuuuwyyosrnsruywtwuosqousu}zmurpuspusotrpvtrwuqvuputu|{hpomxvxu|{u|{ltrlsrsxwz}{xzyy{twx{~y{{qyxo~|m}r}z}{|}urw~mxujwsp{xnzwr}z~}~t|ys~z{|ztxv{x~}ur}s~~vwx}||~}tyz|{|~~}}~|z}{z||v}|pvu||lrqy~z||{|~yz~||wtv~|~z|}{}{vx{y{}~pmoroqzwyxuw~~yyyyuz~}~~~|}}xyvrrz{wzz}~vyztw{ux}xzwzy|}}z||~x|yptxsuzux}uyzuv~qsxzswvw{z~yz~{}|y{hegxyzwvxyy{vuwwwzxvx|y{zwy}z|{xz~{}{xzyxzwyzuwxtxy|{{|}y{}vw{vw~nrosuyot{ojovsxytyyuztpuyvxwtvyvx|xz~z|wqtwz~vzzrux{~xzqoowtt}|{yxxvvytvytvytvzuwxsuqoovvvuuussstttvvvsrtqprrqspoq}|~uprpkmmhjkfhmhjumptlophkrilqilmfjnhnrlqgbdfabgbcVUWXWYJLMLPQY]^QVYINQY]aZ_b`dgX^aU^a\ehZcfOX[V_badhefjihl_[`gchhegifhhfhjgifcegdfhflgdmkgrwt}tswvrwtotplqmhmlhmjikihjkjlpoqkjljikihjkjlutvqprqprnpqtvwoqrnpquwxonrjjnbdhffjdfjty|bmq`koalp`kofqujikfeglkmjikgfhegknquoptcdhjjmxwyiiisssknnclkZlieqqq{{pxxtyzvz{ujyxlxylutkoplpqjnpjnpchidijnsttsusrtutvmlnvuwtqwvuyxuwsnprlmd]^{oozz|ppttrrzrsystvpqvttwuuvvvuuurttpvtgmlfkj|y{xuwxuwxuwvsupppuuutttssskkkqvusxwwyzuwx{z~yu{|yzrst|~}~~|z{uwwvxxwyytvvtvvwxvvwuwwwzzz~}|z~xz{txysxytyzs{{tyzquv~{z|{z|wvxzy{{z|yxz{z|}|~{z|}|~{z||{}~}ytvxsuz||~}|~}|~~}zy{{{{}}}}~~|~}~owwu}|y|}||{xxuwyysqqsqq}}rpp~~~zzz|{}|{zx~vuw~}~}zy{|{}srtwyzuz|ty|vuvq}ysv~nqyqt|ru}ps{uz{glksuurttssswwwrvtmtqajgqxuwxv}oq{}ytusssrwvsxwqvuputlqpnsrlqpqsskmmoqqrttnppomsnlrmkqigmusysrtoooqqqrrrssssssooooooooooooooopppnnnmmmmmmnnnnnnllltttuuunnnjjjfigknlknlknlknlqnpurtyvxpmoliklikfcehegfcevuwjnojnphlmgklmqrsnotrrrssjonckjotrlomkmmoqqsuvwyz|zzvtttrrxvvrppuuullleggmrqmrqqtry|zsxvt{xv|jspptrptrotrnsqotrputtzxrxwiqpmxvltsnvujrqjrqrwvy|}y{wvxxz{z~~xzzpxwlzxk~{n}yz}{x{ygxtl}yzjvskvsv~q|yu}{~u~{r}z|}{|}{~~~xvv~||xuw~z{s}}{xuzz~|z}x}~~~}{uzz|~~{}}}}z}{z{}|{y~syxrxw}uwwyz|}roqy|x{~xz}vzy{{}~{}urtzwy{xz||}~vqr|}|}~yz{vw|}|}}|x{|ux~y{z|wzx{|~}z|}z|w{|}xz}xz|ux{uv~rtuwsxwqvuupq|y{{xzmjl~{}{z|zy{|{}xvx|{}}~{}xuwvsuwtvzwy{xz{xzyxzuwxtxy|zz|}|~|tu~yz}|mqz~quswz~qmrxtyxtxwsxuqvsprurtspryvx~{}zuw{vxytvzuwz|xsu}{{ljj~||vttywwxsuytvzuwytvytvxvvrrruuuooosssssssrtqprqprhgiihjvqsrmoidflgiojlogjwmpqgjypsrilpiltnskejojl}xyojkONPSRT]_`LPQ[_`ZbeT[^U\_SZ]V\`PX[S_aXdfVceS_a[hi]`dbcgedhgchlhmgdfheggdffcejgijgigekhenkgrspylkohaflejslqpinnhmebdhgihgitsuonpjikjikgfh`_a_^`gfhehiehhjmmcffbefjimihlfgkvy}ejmglocjoajnnuzjswfnrihjdceedfjikihjgjnlqt^aestxlkopoqfffvttvuuputesqgpppvwzvz{ostcnnlwwkttlqruwxlpqgppgppkssfnnpxx|{}qprvuwsrtwvxyytswroq_\^pklpjkzqqzz||}ss~tt|tv|vwvpq|zz{yyvttuuuuvvtuuotsprr|y{vsuxuwxuwzwyvvv|||yyyuuuuuuqvusxwwyzvxyxw{|{~~~~z}txykmn}zwyurtzvyzwyvxxuwwy{{qssrttvwutvsvvvzzz|{}|{wyzwyztxytyzs{{tyzuyz}zz||z|wvxzy{{z|yxz{z|}|~{z||z|{z|z|z|~{z|}|~~||{|~~}}}~~}y~|r}xvz}||u{vvxx}}}}~~zy{|{zx~wvx~}zy{zy{|{}}|~vuw~}zy{qprxyzvz~ruyuu{tqz}wvzquzquzuy}tx|v{|~tvvrttnnnnnnqtrryvs|y|xyw|npwy{vwtttput_dcejikpolppnsrnsrprrlnnmoouwwmooomsnlrmkqpntyw}wvxppprrrqqqssspppooooooooooooooolllnnnooonnnmmmnnnjjjtttkkklllnnnmpnhkiiljknlmpnsprroqolnlikxuwlikolnlikjgifdfutvimnjnoimneijmqrsnosrrqssionhpomrpknlikkorrruvvwx{yyvttywwywwxvvpppmmmlnnlqpotsrusy|zsxvszwqzwpyvntrntrpusnsqlqoputx}|qwvltsmxvxnywjvsitrepnv}||xz{z|stu|~y}~~~~w{zpxvkywl~|q|y|zx{yhzvk|xx|t}zw}zw}x~v|r}z|}{ys|yy~z~~|}~~t~~uyu~~w~w~{~y}{uz{}~~}y~|v{}}}~z~}}}z}{z}zmsr|~zy~}{{ztuxst~{}{}yz}z}~uxx{~}|y{{xz}xuwvsu|~~yz{||wx{vwz{|}y|wzvy}vy|~{}z}|uxytv{xz}z|z~|~x{}wx~qssurwvtyx{vwyvx|y{zwyurtxuwwvxzy{zy{yy{{z||~zwyvsuzvxxvx{xz}xz{xzyxzuwxvxy|vw{stzmo}tu~xzzrurjm}twypsz}x{uqvxtzvrxwsxyuz{xz~sprurt{xzytv{vxvqsytvz|z|vttgeeyww|zzusszuwytvxsuytvytv{yyqqqsssrrrrrrssssrtqprsrtnmopoqupr}xz}xzsnppkmslongjpilyrurknqjmqkpztyvqsZUV^YZVUWSRTTVWJNO[_`RY\PZ\W`cQ[^KTWDOQUceXgiP^`UdfXfh_bfbdhgfjiej_[`c`bgfhbbd^]_lkmmlngeklirfbmdajgfjtjpsiooekpflrhnplnfeggfhpoqonpihjfegfegkjlhgitsujhjpoqnlna`bqprposklpikohkolqtinqgkoeinbfjdinmqvrqswvxsrtonpjikjmqmqt`cgknrlmqpoqwuulghoijlmmcjigklkoomrrstvpqrzfmmquvnqrxwyprshppipplssgoot||xwykjlxwyyxztsuxx~mnrqprZWYjefsmnrggnddzoo}rruu~vxyzvpq~~|zzvuuwuuvvvuwwsywuww{xzroqtqstqs{xzyyy}}}vvvnnnoooqvusxwwyzuwxzy}z}yywkoplno}~}vvv|}}}}}vvvvxxtvvz||qssuwwwwuwtsxvvywwsoqxtyyxzwyztxyuyzuz{v{|y}~}zy{|{}wvxzy{{z|yxz{z|}|~|{}zy{kjlrqszy{z|}zuw}|~~~}}}}}}~||{|~~vxy|{z~u}}u{u~}r~q~|~x}}~||}{{||||||{z||{{yzy{|{}yxz|z|{z|{z||{}yxzwvxsrt{z|xx|qqu|zx~wv|x|uy~quzuy~uytyzputtvvy{{|||svtlspbkhkropqo{mo~suzuvssssxw{v{zotskponsrotsqssrttoqqtvvoqqlmsllrkkqrrx||yxzlllkkkpppwwwkkkooooooooooooooonnnnnnooonnnmmmqoopnnwuuiggnllonnppn^_]ijhmnlrrprnsrnsminkglnjopmopmojgifcefcefegdhiimnptugkllpqpnnpppnrrgnm]hfknlmnliiipooqprsrt{yy~||kii|zzxvvtttqqqoqqqvumrqwzxtwukpnelit}zjspnsqlqorwunsqkpnqvux}|rxwpxwjuslzxp}{p~|kxv_lj~xyzz}~mqr~x|}|~~uzyowvlzxn|s}twuvywk|xk|xw~{yy}w}nlkjkiotrt~zt|}~|}|{wzxv~zu|zx~}w|{}}}}}|}{yyvttt||{wy}|~|}y}wy~}~~zz~x}{}|}|~z||z}ntsz|u{zu{zxzz~~rlm|}vrwzv|}uxy|xz}vsu{xzvsu}z|roqzzzqlm}~}xy~xz~zz~yzvyuxx|y||~y|x{{}|~zwysw~~y{|{|tvsurwvuzy{vwvsu}}zwy~{}zwy|~{}|y{urt}z|zwy}z|~z|zwyyvx}xz}xz{xzwvxvxy~yzwyrtsu~xy{wyheguqrxtvzvxxtxyuzwsxuqvzv{zwynkmnkmvsu|y{wtvzwyvsuurtyvx~~ljjpnnrppvttytvytvytvxsuzuwwuusssttttttlllooosrtqprtsupoqonprmonikmhjuprtoqsloqjmmfif_bhad]VYlfkb\amhjnijqlmDCEYXZ]_`LPQX\]PWZPY\T]`R[^Q[^S]`N\^TdfR`bUdfQ_a_bfcdhdcgjfkiejcacedf_^`cbdjhjkjlhflnktfbnqnwxw{ynuqgmrhnkagpflfbdbacjikqprhgi`_abackjlmlnjiknmoonpnmoonpffhmlnrswabfsuyhnqdlojoriiofhm^^d_afbbhbacddfgfhonponpjorlsvflogjnlmqllnrmn}vwtjlrnomnnmmonlnggilnonpqtxx|~ssusrtqnpssukuugqqjttgqqxpoqonpsrtrqstsu||rvzmppqprqoopklvoowwxxyqq~vvxy~xx|vw{yy}{{|vx{uvwuuwwwtvvsuunkmpmotqsxuwuuu~~~wwwxxxyyyputtxxvxyuwxzy}~|xz|}p||lpqsuvtss|{{}||zyy~uwwvxxy{{rttuww{yx~}}||wuu~{}{w|xuwxwyxyzw{|vz{uz{z~zy{|{}yxzzxz}|~yxz{z|}|~{z|{z|~}zy{}|~|~|~ytv}~~~}}}}}}~~~~~z|}x|}{xz~x{~~yw}}{yy~~zxx}}}|||rqs{z~~~}~|~yxz}|~xwyzy{yxz}|~~zspuww{~x}iorotwpuxqvyrwwsxwxzzwyyzzzwwwnqonurr{xipmjki|np}rt{vwtttrwvuzyqvunsrkponsrmrqtvvmoogii{}}vxxooullrllrlkqhhnihjkkkyyyppprrrkkknnnpppnnnpppooolllmmmmmmnnnnnnrppnllponqoomllommpqonomtusopnstrplrplrlhnd`flhnwswroqqnpolnnkmsrtlpqmqrptukopgklkhhjkkkppgonbmkqtrstrkllooojiksrtzxxwuunllwuuzxxuuupppmooV[Zmrqsvtsvtrwuovsktqnwtqvtw|zy~|pusputsxwpvunvunywn{zfusykzxjxvo|{tzzx|~sxy{w{|x}|v{zowvmzxq}vmpnsvtizvk|xw~{y}x{qxuqxu{~|{yzxsxvt}zu}x|zqyvp|xwv~}x~}z|||||{|~~w}u||s{{x}~z|}syu}}y~w~}|{|}y~~|{~}{}~x~}tzypvuw}|{rxwnts{}}|}~yz~||~~zv{}}ruz}|y||qt|~~{}{xzvsu~~{}vxx~{vwz{~yzz|z{}xyxzvy|{~~y{wzz}}xz~}pt~y{|uxyztvrtv{zput{vwyvx}z|wtv|~|~~~|~wtvurt{xz{xz}z|wtv{wy~wz|wyyvx|z|xwy~xyvx}|~yrs]`apprz|}uuwxty}y~qmr{w|zv{~{}yvx~{}zwyyvx}z|zwywtvyuwyvxtrrnllwuu}}zxxzuwxsuzuwxsuzuwwuuwwwyyypppdddsssrqsrqssrtpoqpprtoqrmoqlntoq{vxojlojlidfkfhgbdojlpjoqkppkme`atopTSURQSHJKJNOY]^V]`JQTSZ]PWZT[^dloMY[R_aQ]_]jlT`b_bfcdhdcgiejlhmgfhfijbefdghehhoqrljplirhdoc`isrvunshaflfkjdhpinolnjikhgigfha`bdcejikdcekjldcenmohegnkmhegc`bqnp[\`pswpuxfkngnqbilliojhnolrhflifltsuvtvqprlkmnlndknjqtgknglomptiklrkl{prsegzprvpqqmosnpqoqonpjlmomoyuwxtvsoqwrtrqsjttgqqlvv_iiuonpbacmlnonp|{}qrxdgknpqruuooomjjvmmzrryqqvmm{rr~vv|vvzttywwzxxzuvzuvwvvwvvwwwvww{xzolnroqxuwvvviiiyyyzzzqvutyxwyzuwxzy}~~|~wfjkprr~y}zuxv|}z~|xzzuwwuwwuwwvxxzxw|xw{uv{|zuw}w|xuwtrtsuvsuvuz{uz{quvoqr{z|yxzzy{{z||{}yxz{z|}|~{z|{z|||~{z||z|~{}{vx|~|{}}|~zy{}}}}}}~ywz|~}t||r}tz~vs~nzxr}w~~~|||zz~~~{{{srt~}}{~}~zxzzz|vvxzy{zz|~|~}}x}}z|{z{{~~tyzmrssxytyyuzzu{zsxwtvvuww{{{uuutwuovsmvsw~{{|zrt~suzuvttttyxotslqplqpputqvuotsrttuwwoqq{}}tvvnqvilqhkpjmrimrmlnjjjwwwpppppppppppppppooopppooorrrmmmjjjnnnnnnsopqklsmntnpnhisopljiljiywvurryvuplrokqlinhejplqnjopmosprnkmwtvsrtgklimnhlmnrsnrsdddjllionjsrcpnmpnxvuwuusqqkhjwtvsqqrpppnnsqqvttwwwuuutvvsxwmrqtwuorpx}{ryvgpmmvsotr}digejhqvtsxwrxvpvunvunywk|ygzwwh{xk}zn}tt~}pxx|uz{w}|t{zowvnywp}{esox{yuxvfwsgxtszwx}{||~}|}{x}{t}zr}z{~|z}~lxus}u~w~}~~zxx|y{}~w}~y~~zz}}~vxt~~qyyw|}p{y{xwvx~x{z|{xw{wzzw|{v|{x~}syxw}|z~{w}|{uv|}zxx~~yuzzv|z}wz{ru}z|wtv~pmosprzzz}}xz~||utswrsz{~zz|}z{}xyy|zor|}~z}{~~}{xz|mqz}|vwrtvxrwvnsrxst|~yvxyvxvsuzwy}xz~xz{vx~xz{vxxuw}z|~{}zwyzvxz|}wz{tw}xz{xzyxz}vwz|~xywvxhjknpqsuvsuvrns~plqvrwzv{|~roqlikvsuxuwtsuvuwxwyttvvvxttvsqq|zzwuuwuuzxxxtv|wyxsuztvzuwrppooonnnjjjuuuppprqsrqsrqssrtpnprnpuprvqsnikgbdnlnjgiecetqsolnhegoinmgljegd_``[\JIKRQSTVWRVWX\\V[^MRU\`cSXZ_cf_ehXadV_bU^aW`c[dg_bfcdhdcg^Z_b^cihjgijfhiiklcefoqrjhnebkmit^[drquokpd_diejkejplqihjedfedfonpgfhgfhedfrqsnmoonpmlnpmoliknkmroqheg_`ddgkhmpelo_hkinpqjqnhoiahoipg`gmlnjikfegmlnkjlfmpjsvgnqlqtqtxlnorkl{mo{mouwzpqsknunqrnpttvkjlmfitmpunqvor{vxvuweqqeqqr~~o{{dppsrtyxznnpdcejikpsxx}nrsoqrsssusstonqlkxsrzyzvu|ttzttwqrussvttxrs{uv}xy}}zzzxxxqnplikyvxwtvtqstttrrrvvvvvvrvvuzyxz{uwxzy}~yzzzhlmfhhtwu{}|orp|}|~}y{{uwwtvvxzzvxxxwv~xstxsuupu{vxwtvyxzqttxz{uz{txzuwxxwysrtzy{|{}yxz{z|}|~{z|{z||z||z|yxz}xzxsu~{xz~}}}{|{|}|~}|~~}~vr~~}|xw{~us~s~p}{}wuuws~}~||{yy}{{|||wvx||}{{z|zy{~}yxz{z|zy{xwytsuxwy|{}|~zzljkwxwuxvw|}qvwuz{uz{v{|tzyrwvtvvvxxssswzxw~{qzw{tusrt~suzuvuuux}|lrpnsrsxwuzyqvulqprttmoosuuxzzqssmpukmrknsjmrjmrstunnnooonnnppprrrpppppppppqqqpppZZZgggqqqnnnnnnrmnrmnrmnsnpmhitoppnnponrpousrkihpktmhrmhqmhqrmv{zwyqnpolnifh^]_imnlpqdhimqrquv```nqpionkvterpgjhsrqussvuuyvxtqsrpptrrrppzxx}{{wwwtttrttpvtntrsvtuxvqvtmtqirodmjrwuv{yv{yfkilqorvvrvvrxwnvunywm~{j}zol|pi{xsp|}jrrqvwu}|s{zowvpzxs~|kyuwzxuxvgxtfwsqxutywrwuv{ynsqx}{~|{z{yw|zv|t||}|}~zm{wvy{~~~~||~~~z~|{xz}{}yvnvvqvwqxw}|yxy}|{{tswvw|z~w}|tzyu{zx~|x~|w}|u{zwyyyww}wx|wxzxx{yyzwy{wsyz|}vy{~z}y|}z|vsuzwyyvxxxx~|||}~z{z{z{}xywzwzy|~wzytv|wywz~{}swy|z|zuw~wz|vw|oq{}qvuotszuvyvxvrtxuwxuwvsuzvw{vxxsuzuwwrtxuwzwywtvzwy|xz{}vy~wz~xz}xz{xz{|sumqtv}rtqpr~rtuwz{kmnxyzplq{|x}yuzyuz|y{roq{xzyvxzvxvuwsrtxwytsuwvxqprigg~~~~}}sqqwrt~y{ytv{vx{vxqoorrrxxxqqqvvvooorqsrqsrqsvvxnnprlnuprwrtsnpidfpmojgikhjroqjgiqnplfkichmhjfabgbcOPQPPRORSSWXVZZSVYUX\Y[_TW[XZ^NPTX^aZad`fi[be^dg`bfddhdcgfbgd`edfgaefbghjno_cdgijliofck^Zeifngehiglebghfjjhlrptvwxeegeegijkhfhbcdfegdefigiffgihjiegqlnokmlgipkmnosloscilfmpforflophonhnqiqqlrf^fqprihjmlnqprjjlhnrjrubjmjqtlotkmntmnxlnzil|np|prwnq{twpjmqmonnpxpt}tw{ruysvy|~fppepp`jj\ff`kkvuwvuwutvsrttsupsxmqsfjkprstuuywwuppuqp|wwvrpvqqyqrwrruopqoorqp}wx|vwzuvommrqqttttrtlikwtvvsutqsrrqtsswvvsttrwvuzyxz{uwxzy}~}skuyty~|}~cghhjju{w{|rxsw}yntpwzytwwvxxxzzuww~}~yxztu|vwz|xqv{wy|~xxzppr{}~x|~y|}y{}~~usv{{||{}yxz{z|}|~{z|{z|{z||{}xwy~y{{uw|~}~|}~xwy~~}}{|~~xwz}~{~yx~~]iivuz}|xw||ws~w~{{t~jwu|||}|~yy}}|zz|xxyzy||z}zy{uuwtrtssu{z||y|yy~{yx{|zw{wszzhnnhnntzzv||ovuqvuuxxpss}}~lmmptrjqnYb_msqtvt|np|st{vwvuuz~~kpojonlqpfkjkpomrqoqqnpptvvuwwrsslpuilqimqimrkotpqqssrlmmkkksttqqqqrroppoppqrrpqqwvvooonnnnnnqlmuoprlmsmnqklrlmxtsurouqormlupooksliplhqlhqrmvxuzxvxrpromodacihjgkllpphlmimnost\__qvukpojvtfrpqrpzvuxstystztvxsuqpputtqpp{yzspplllooosuulqpputtxvnqootrpwtirnlurpusrwux}{hmkqvtottpvuv|{nvumwvi{xg{xfyvi|yrexuwn}|lww}qxxu}|t{zowvs}{u~}jyuvywuywl|xjzwu|ytyww|zsxvpusv{y}|zz|zy~|y~y}w}yy|}~}|~{~~yx{z|xwlvvovwy~w{z||}~y||~{y~zy~}w{{zv|{~|}~||zwy{w|{|}{||~|yz|}}zvxtprqqr|~~~y|vvv|yzvqrzuvz{z{}xyx{ux}tw~wz|vz{vywz~z|}z||~txvy|vy~xzy|}wy{np{}vzytww{|~spryvx|y{urtztw}vy}wzx|wpsyuw~|~}|xz|y{}x{}ux~txy|{vx}y|yzvxru{mo|}tqr}|~srs|z|qpr{y|{fbg{w|uqvxtztqstqsyvxurt|x{{{}srtxwyssuwvxnmoljj|{z|zzussvutwsu}y{|xz{wy{vxrpprrrvvupppwvvooorqsrqsqpryyzmmoqlnsnptnqqlnqlnmikebdnkmnlmmjlmjmvpuqlqidfmjjfabQUVNRTLQRPUVRWXM^[HZWP^^O\[QY\PW\WWcZ[f_bg`dgdhic`bheggdea^``]_gfhfghbde^`anrsqstcX[i^ambdvknkacpjltmprknwps}wyjnrckncilbfjegkbejceigjnhjnehlbeibafljopoqeed`a`acdlnnehiillillprspnqlkmtruiijmkolkmrqsjlmlopkopeijgklhlmimmjnomopurr~yzuop{qszrstppwttuttvwwtvvxxxnnmlkkuttkjjuuutsssssmmmooosrrvvvrrrrrqyyyqqqpssnpoijjssrxvvussutvtstvtvwvwrprtrtqoqrpruprtoq~ru|txkhjutvxtw|vytoqxrtxsuxsuxsukjmvxy~nrppvtqttvxyuwxsuvz|}otyn{}y~}hjlkmnsx{v|~ty|ty{uz|t~|u|{pvu}~~zzz|wvzvuwttxvvwvxstxkvvqyyrvwsvwwvx|{{zxxqtuw{|z}~wzzzy{}}}wwwxxxuuuwtv~~vw{~z|z~~~}}}}|w{|{~xxwuz~txzx}}~z~{~tyyx{|yv{||uu}zzxz~sxypstuyzvyzwyzyw{|z|xwyyxzzz{lyt|\idlytlyto{{kwxlwzgrsfpsdoojtspxxottrwvnsrzvxuorvsuups{xzjonionntshnmkqpionnppmoolllkiinjjnopoppijjnoosttttrtsouspsrnwurrspqwvouthnmoutlrpqttnppprrkmmkmmmkkihg|yytrrollqoovtsssmqqjppksqqjmpfhllnrhhqiirfjnelmfklimnghjiklhlmjnohlmimnfjkhoorxyjrrkqrlrsmnl}|vttpmoonpntrmromqovywoqoqmlopnqtrlspnurqvtqtrrusrvtlpnx|zntrafdejhrwuotrfsqq{yxputu|{putyww}}|}|pvuj}|k}h|zok~|y~}x|{rxwqvuv{zitrp}{yvo{|t|w{|uzyx}{uzxyzz{v}wx~yz{|}wyyz{}}z|uxt{||y~~~|~|~~z||x}|x{z|~~{qu{~wz|}}}~~~~{z|~|{}~y|z}y||zxw{|zzzzwvx{zvuz~zy}}|~|xsutoq|wyzuw{vxz}tw{qw{ry|u}}v~{uzy~zty~x}yw|v|v|x~wzvzx{{x{y{|vwx{yy}{{}{{wuu~||}~}z|~z|~{}ytuuxx}|~txw~~ytuxx{|uvutvxzvxz|}uv~zxomkturvvuxzz|~~}~ywxroppmozwy|zywuuwuuywvwuu|y{wtvyvx|y{zwy|xzroqyvxzwzyvxvsuvvxuvwttvvvxqrsurtvrtwrtsoqxsusprvtwrtupturwxlqrojlphkrhk{lp|lpumrohnqkpmfllfkqmrjhjdcehfhkkmkikQYYNVVMUUMUUQYYJ\XFXWO]\R^^PY\V[a[[gZ[e_bg`dfy~}c`bebdfcea^`dacgfhhgieghTVWfjksuve]^qijhabskllddnjlqlnrnphbdeacglo^gj_fifknhkoehlgjnnquehldhldgkljpqptlkmkkkiiihjjhjkdfgikleghoqrjikihjlkmmlnjikmlnmlnnppjnojnoimnlpqlpqjnolpqnpquss}wyrlltnovnoqlmhffrrrqsshjjtttdddmmmqqqhhhjjjrpptrrtrrussvttnnnvvvvvvppprrroqqrttkkknnnvttvttpoqqprnmopoqnmowvxtsuspr{vxvqstwwpsolnvuw}xzyru}xzzuwxsuxsuxsumlpwux{}}kpnlspvxxwyzvxyy{|xz{y{|}}r|{zv{~prsprstwxtwxgklkopostlwumutmsrzzzvvv|xvzvuvttxvvwvxqtxjvvlvvptvostutv{yyywwzxx|zzx|}uz{z~|{}yyy|||xxxxxx|||}~|~x{ruy~wz~~~|||{xz}~~~vxyvwxuy}~~|x}z|w{||z~x|}|~|xw~{z{wxyqstxzzxzzxzzwvxwvxxwyxwyxwytlzv]kgguqkzvkxxn{}dprgsuertbnnjtrowvu{zntrntrksthppmuuovwnvwlqpjonlqplqpputglknppkmmmmmmkkpkljjjiiinnnoooooozxwtsotsorqmonjnokimlotslqpputlqphjjjlloqqnpplnnpnniggywwhffnllqooqonqqkrsjooiommgkljmqgjnehmfhqjoremmlqrfjknpqqstjnnmqreijkophlmfnnostlprjnpkopfgevtstrr~||khjyxzovsjpntywhmkqsqomlmnltvtmrpryvqusptrrusorphki{~|otrv{yafdtywotrgtr{mutlqpy~uzyz{}~~xi~|pmlz~~|{y~}{kvtq~|ysp|~s}w{|w{|x}|uzxx~yy}x|z}z}z}|~|tmxvt~~x}{z{~{}}~}y~}z{vrw}~pv}~|||zzz}}}}||{~xz{y|}|~~y|txsw~|}{~}~}yw}~zrzzsqquqp|y}snpzuw|wy|svtwv|xpwx{t{{uz}w|zty|v{~x|~w|v|v||x~w{uxx{zwystusuvrppywwwuuzxx{yy|y{vsu|~{vwwyy|zzykmynpy~}yz~vwzuvxxxtvsuz|wxxrszxtzyuvwutus_aaqsssprxuwyvxxvvusswuu{yywuu|y{vtvvsu|y{|~spr{xzxtvxuw|y{tvwmopnpqnpqlnpqnptoqvrtuprxsusproqrqstlpqmrshqppkmpilqgj{lp}lprjorlqnhmjdjoinkgljikkjltsurqshgiOYYMWWKUUR\\R\\LZYKZYO]\O[[WaaQX[]\iZ\eVY^UYZY^]a^`c`bfcec`b`^`edfhgieghlnoptu]`apjkicde_`mghkefhijlilstukiknopbil]fi^ehafiilploscfj]`d`cgdgkjmqnlrqptonphhheeemopjlmhjkgijfhilnpkjlqprrqslkmpoqpoqnmoqstjnonrsimnlpqkopnrslprmpqpnnmkknijrkltkltopsqqttttvvwyyuuujjjlllrrrhhhoooljjrpprpptrrqoollluuuvvveeeppp}~tttmmmvttxvvpoqrrtnmonmoonputvutvrnpzuwsnptil|uxyvxutv}xqt{}{vxxsuxsuxsurmrtsutvvmrpkpnwyysuvrtuvxy~|~~q}ptwpnpjjlswxx|}osttxy{s~|rzysyxqqqnnn|vvzvuxvvxvvwvxqtxkwwkuunstostutv}{{uss{yy~|||zztvwptu{|~svvwvx~{}qqqzzz}~~wwwqqq|y{|~~{}~y|x{nqvz}}~lno~xy{yz}~}}{{}}}~y~tnsx|}uyz~|x|}x|}}}~usy~yyy}{}~pstx{|x{|x{|xwyutvxwyxwyxwyozwxr}zs~{t|bkkktwr{~t}nwzgqqjtrowvv|{kpootsixwfvuk{zjzym}|pvulrqmrqmsrlqp^dcsuuprrmmmpnnqlmjjjgggnnnkkkfff|zyqpltsopoklkgmnjjonotsjpomrqlqpoqq\^^kmmmoolnnqooljjwuujhhljjmkkjhgkkewxouuovttejimqrfimehnfjnkpsfnnlqrgklmopoqrkopmqrbfgosthlnglmjnplopjjllkltqpywvtrrvtttqsmlnkpnhmkszwlspiollmkopntwumrplqortrpsqqtrnqofigy|zpusdigejhrwuotrivtvowvtyxrtty~uzyz{}~~||hml}m~}ropz~uzyy~}qyxs~|xywzx{uyzx}|w|zv{zs|yv}zu|yx{yx{xuuu~uzyv{zputv}|yverpwx~|}~}}}}{{{}}ooozv{|~yxty~xuw{yyrx{}~~~~vvvxxx}}}y{{w{|w|}w{|y~|~wzqutw}|xywvvv{{{|{}zy}xv|}{|{~yv{vxrmo|~}xz~xz{~z}~x}rjqzy|vz~x}zty}w||v{~w|~w|v|x~x~uxwzx{|xzrqspqrsqqywwyww~||xvvwtvwtv|y{c^_uww{yyy{{}tyxxvvyzwx}xy{{{tv{prxyystxuq{zvvwursqvxxxuwsprtqsjgi|y{~||vttsqqhffiggvsuwtvxuw{xzpmo}z|urturt}vxylnojlmkmnjlmuprworworxptwpsuprmopnrsv{|sxymuuroqojlldhylp{lpqjosmrlflhbgnhmidigfhcbdmlnjikhgiLXXIVVHTTUaa=JJFRUJVXLXXMYYT_]T[]]^h]_gX[`VZZW\Zc^`c^`hcefacgbdcacdcecefbdeimn^bclhippo`]]ggfjggeijeijtyzgjkbfgbil]fi`gj^cfehlgjnfimdgkhkofimdgkljpbaebacfffjjjgijjlmiklgijjlmjlmjiklkmhgilkmjikkjlmlnlnodhilpqmqrostostostmqrlpqooo~~nijplmqllqlmrppvvvlnnmoohhhwwwoookkkrrrlllljjiggommtrrsqqrrrpppsssdddtttdffkmmuuuqqqxvvxvvvuwutvwvxsrttsunmorproln{vxuprwlowps|y{mln}vor|wy{vxxsuytvytvtpuvrtrrrsvtmrprttsuv{}~{}~x}losmlnmlnoqqpqqsttwyy}~~t}nvuntsyyyyyy{vuzvuxvvxvvwvxqtxlxxmwwotuquvxwy}{{yww}{{|zz}x}~y||rqsspr|y{yww}zz}}kiizwysprzwy~{}{xzy|z}}|~z~v~~~~~|~~{}zzxzyz}|z{~~zzz{~}w{|vz{w{|w{|z{~~{{xvypoq{z|{z|{z|zy{vuwxwywvxvuwp{yu~mxvq|zvisus|gptluxktwhrrjtrpxwqwvinmnsrn{zhvulyyerrshmlnppmoooqqnppnppmmmqoormnpnnnllnllussommxvvlkgutp|{w~z{|xsttnpphiikmmoqqoqqnppoqqlnnnllqoousssqqnllqoorporrlvwnmmgdbbejilpqhllgjnhkpzyw|}hlncefdfgdhidhi`dequvimnhlmhjkpnpkgimgiqnmusrvttmkkpmo|{}pusejhnurltrmvswzxvzxnqonqoqvtqtrorppsqprphkitwuptrx}{rwulqootrfsqt}pxwotsu{zput{vw~~||~stkxwn|{p~}rwvw|{y~}tyx{t{zt|{t||pxxt{~sx}wz~vy~x|}x}|v{xq|zv~}v|{z||~~~}}z~|yr~n{ysz}pwz|~~~}z{~|{wtv{yyyywxy~~~}}}|||y{{s{{yt||u}}|~{~vz{~~xxv||z|||}}}zy{zy}yw}|zx}~~}||~}xsu~{}z}|~w|unu~y|x~|v{|~x}y~}w|}w|~w|~w|u{v|{qt{~}vy|wy}~}}}|zzxvvtqszwy|y{snowyyxvvwyy{qvurpp{uv}uv~yzwwwvx{przrs}~zuv}zvwvryzxstruwwvxxwtvzwyzwyvsuxuwzxxvttsqq~~}{{}xuwzwyrprwtvvsujgipmoxuwvxx{}~}|~y{|yuvyruvorzsvvoruprlptnqufjndknenrqprmjlhbdwmpzlptnrqkplfkgafkejjdilikjgihegfcefceHRRENNCMMCLLNXXPW\IRVFOR\eeP^[Ydc\\gZ]cSVYTYX]b`hadibee^af_bhadebdgfhcefdfgeij^bcghhdggfggcgfeff]gg^gg\ffbkk`jj_hkenq`gjhmpadh`cgilpjmqjmqjmqcfjigmfeiihjfffgggjlmnpq`bcfhilnonpqcbdfegjiknmopoqonpnmojlmeijrvwnrsquvostptuptuquvuwwpppljjpklqlmrmnwuuuuuoqqhjjbbbmmmkkkooommmqqqmkkommkiivttpnnlllsssnnnfffhhhjllwyyqqqppp{yyzxxvuwpoqsrtrrtpoqrqsonpqnpzuwtoqynqyruxuwutv|wyxqtytvytvwrtvqsytvuotsprrqqrtrsvtceeoqry{|xz{{}optrnptrtnpptwwtvvvxyz||p{yowvtzy|||yyy|wvwsrxvvxvvwvxtw{nzzq{{txz|{}yww~||uss~||~||}}uwx|z}|~z||~zxxutt~~~~|~|y{~xuw{xzvv|~|~pqz{~vzz}}|~|{}xwy||{{}}{}~imh|zzyyy~~~wz~xy}~|{w{||||z~~~}~vsuwwy{z|{z|{z|xxzvuwxwyxwyrqslts{muts{zszypwzt{~x~mtwgoojusnvumsrjonnsrwz{orsruvqtu~swwwyyjllxzzprraccfhhlnnoooommpklussgfepnnussxvvusrnmitsoutputpssooqqmoomoodggmooxzzegggiinppnppnllqoomkka__fddommwutrrluvmqqk{yyinlhmlgklilqfimkpqksskpqlpqgijkmnhlmcghdhjkophlldhiihjplnqilwloqmlqonwuuwuuyvxpoqpuspwtktqhspamjtywgjhlpnpsqtwusvtrusqtrrusqtrrusnsqmrpdigotrkpnjwuozxrzyx}|tvvtzyv{z|wx{|}}xzzt}}s~~yts||~uzychgrwv}{v|{qvwuz}x|x|x{txyw||sxwlyw|zz{{~~~}}{}}z~}}s}{tslzxox{r{~|~~{}}{}}~}}yyy}z|}yvxy~}|~}}}~~~vxx~mvupxxqyyoww|z|~wz~y{xyw}~|yyyyyyutvxw{vtz}||vz|}xzrmozuw|wy~y{~wzy|y~zt{wr{vsy|v{ztyzty}w|y~}w|}w|~w|{rjm}xz}xz}z||~|zzxvv~||}{{{xzyvxyvxyvxxuwxstoqqtrr{mo}rtuzyqooxrs{st|wxzzzvxzstvpqwrsupqyvr}|x{|zz{yy{{tvv{xzyvxwtvtqszwytrrommljjljjmkkroqwtvxuwvsu|y{vrtvsutprwtv|y{xuwuwxvxy}~{}~xqtypsxorxnqvmpuprmpukotlrwgptktxnpqonpqnptmpwmpxqvysxgafxrwrlqoinjgijhjlikfcemjlRYYNRSLRRGKLKQRUY^UZ`^dg^ihKYU[ecZ\d[^cUYZVZY[a[g`clfhngjaZ]b[^b`bfegbdf_ab`dedijbgfagfdihbgfagfZih]jj]lk\iiZih^hkZcfahkkpshko`cgknrhkogjnhkofimjhnhhlihjdddsssmopfhifhiacdacdacdmlnihjnmohgikjljikonpdfgjnolpqimnkoplpqkopkopkopprrjllollonnrmnsnorppkkkoqqlnnllltttkkkmmmmmmhhhgeeiggqooywwpnnpppqqqnnnmmmgggnpprttvvvttttrrxvvvuwtsusrttrtutvsrtqprroqvqs}xzzortmpvtvpoqsnp|ux{vxzuwzuwxsuytvzty|vxzyyuvttusuwwqsty{|z|}px|y}rswurtvstturuvtxywuvt|}{p{yjrqtzzzzzyyyton|{xvvxvvwvxtw{p||s}}y~ptuywwrpp|zzxvv|{}wvx{xz{xz{vx~y{ytuwrs}~{|~}z|{xz}z|vsuxuw{{y||~rt|x{~~z|||xuw}~t}}w|}vxy|~lpk{uvzzz}{x}y}~z~y}~~z~||}vyy|ztvzwy}z|}z|}z|wvxvuwxwyxvxtsuowwxv~~t||t||sz}xpwzmtwlsvqyyjusmutw}|v{zput}y{tprvqsokmxsuxxxnnnpppkkkmootvvlnnjjjnllsnouopjefqlmytuxstomlpokpokpoktsoxwsllltttxwwxwwxxxsuurtttvvkmmhjjmkknlltrr}{{ommrppvtsrrlyzquuoxvvinlhmkglkfjkilpglmfnnotulprgijiklfjlfjkimnhlleijiklnkmvmpuhlwgkvpoywvwuurpptqssrtgljnureolcrn_njovschfmomqrpturqtrqtrpsqrusqtrrusmrpotrtywy~|lrplywnywowvuzysuux~}y~}~yz~~||}tyz{~w}~x}~uzy}tyxuzy{~wz~}wzvy~wz~z~x~|q~yy~{z||~{}}~u~vrhus{yu~~}{z~|{~}{}}}{}}|zz~||}z||}|yvxzz|}~||{{{|||xxx}sxyy}~y~vz{wtv}|}|xz}~|{{{zzztsusrvtrxjhnssy{~~}|y}}|~}xz|~~{twzsxzv|tqzrpvuotwqvysx{y~{w|}w|}w|zunq}}xzz|~yz}xzzxxwuuuss|zz|zz|~roqwtvwtvyvxztvprrussz|shjw|{sqqyst{st|wxooo{st|vxztvwuurokvuqtusstrrttnppxuwwtvxuwyvx{xzywwljjljj~||}}~}z|yvxxvxxuwyvx~{}qnpxuw~wtvtvvlnolnowyzuwxvorwnqvmpworxpsxrvlqulptkrvirvitxlpqmopnmosnptmpuotwqvjdiqkpmgljdilfhlfhgacidfupr[^_PRSLOPSUVTWXTT]ORZU\_Q\ZM[UR`\\^f[^bY]]X\ZW]Xmdglcfndgi`ckad`]_dbdbdedfg`dechi^fe^fe]ed^fe`hgZlkUfeOa`VffUgf^jlbkn^ehhmphlp_bf`cg]`ddgkdgkfimjhnljnkjliiikkkjlmcefhjkmopmopgijkjlhgimlnqprkjlljlsrthjklpqhlmimnimnjnojnojnojnonsrrttoppqnnpnnrmntrrooonppmooaaalllsssrrrqqqmmmtrrsqqqoopnnjhhppptttnnnqqqnnnsuurttxxxsssrppxvvutvutvsrttrtutvtrtqprvsuuprz|zorslourtsrtzuwtmp|vx{vxwrtvrtxsu}v{{vxzuvstrwxvy{{vxyprsz|~v~zwwvy}pnrvprrppvwuuvuvwustsz|zp{yjrqtzzzzzyyywrq~zyxvvxvvwvxtw{q}}t~~x}~uyz~}}}xvvwuu~}{z||y{z|~vz{~ytuvqr{|z|~}z|{xzzwy}z|oln}|xyz{{|wx{}w{|~nvvyyy|~~}z|}~y~w|}|~x|x~vvv~|~w|y}~vz{txy{w~uyynq|xz|~{y{{xz{xz|xzwvxxxzxwywvxxvxpuv~sxyvz{vz{y~uz}nsvnsvkpsowwgrpowvv|{v{zmrqsqssqsvtvqoqtrtrrrnnnwwwwwwtttlnntvvkmmjjjnllqlmsnolhhqlmupqsnomkjpoknmipoksrnutpdddwwwyyymmmmmmrttsuuprrhjjikkommtrrnllkiiommsqqsqpooi|}tyystrriojhmkglkgklimn`ff`hhhmnmqriklikldhijnngkldhieijnmosnp{qtxhls^czvurpovttpmowvxlnlnurmxukzvbuppwtkpnlqopqotqprtrprpnrpqtrorpqtrjomnsqpussxvnsqlywkvtowvuzysuu|zuv|}|zz~rvw~uyzsxyz~y~}~w|{~wyyvv|xzwzvy}z}k|zr}}tyz|z|z|{||tvv}xup~o}q~vt~{}}|~~{}}}{{~|{}}}|y{}}zwy}z|~~|||}}}wz{vxywz{xz{vuw}~~{}z{y~}zzzzzzzy{{z~~|omsssyrv{|~~|{}{vx|~zuwz|wrtuqvzu{}znlrysxztyy~~x~{w|{w|}w|~w|x}ztvz|}xz~xz}vyzuwywwrppuss|zzzxx}z|tqsyvxyvxvsu{vwrttvtttfh|~tyxussz{}uvupqssswx{|xvvyww|yu|{wvwuuvtwyyuwwxuwwtvxuw|y{zvx}{{qootrrsqqommmjlrprurtzwyurtyvx|~roqxuw~wtvrtunpqprsvxysuvworznqymp{psxmpunsnpyjpwfnvfpwfpwiqqkoplnoroqrmonhmpjoichqkpnhmlfkjfhjfhlgimhjrmoRQSJHKMKMYX[XWYWU^PR[X_bQ\ZM[UQ]Z\_c\_a[_^Y^\W[We]_d[^h_ai`cjbd^[]bacbbdacd_cd^cd^hf]hf^hg]ig^hfWkiWkiXkiUhfWjh\fi`hk`gjejmhkofimkmrorvjmqgjoilpjinnlqljlfffmlleghgijdgh^`arsulmoqoqkjlqoqmlnpnpmlnsqtjlmimngklptukopjnoptuptuptunqqqssrrrpppqoormnsrrnnnnppkllooofffjjjqqqpqpsssommvttsqqiggljjrqrrqr^\]qqrlklprrnppoooppprppvtttsurrtsrtrrtqprtsutruxuwwquxrtzorxpsuqssrt~z|ysu~y{~y{{vxwrtwqszsvytvzuvwutuvtyyzprsx{|{}~~q~rrxllntprsqquvrxytssovvryzuq{zpwvuzywxxxyy~{upoussussutvtvzr{|t||qvxv{{|{||zz~~yww}}{zz{z}zy{{xzz|~wzz~}~}wx{|z||}}|~zwy|y{urt|{yzzzz{zzz{|{|}}~~~xyz}}z|qstz{|zztuu~z~{uyzpuv~w~tzxmo~y{}xz~z|}xz}xzzxzzx{|z|ywzvuv{y|tx|x|sw{tx{tx{ty|x|{ptxlpstz|isrpxvpvuqutossorsnqqprsvyyswxklluuuyxyuuupppvxxtvvhjjwvwussroovppqjltnouoptnoronpokpolonjljgihekkkkkkuuuvvvrrrqssqssqttfhhprrsrrrooommpnnnllxvvpmlkke~}vzytolljojimkhljfjibfgrwxryypuvjmnmmolnpdhhlqrdhikoqquwppruqs}svxgkpY^ypqvutwuutqqkgimkmmpnholalhdsobtpktqpwtkpnopnspoqrpnqompnlpnkomnqoqtsqtrtxvotrswujvtkusrzxx||vxw}|{xx}yy~{{{{{tvwxyzy{|y{|{z~x}|z~|{||z}y|wz~svzptuiwzoz}uy}}y~x~}z~~yvpp~p~}sszz{y|}||{~~}}}~}}}z||~}~~~~~~~~~{{{}|~~|~{z||{}zxzwvx{}|ztw}z|vwu}|}~}~|{}yx|zx~vtzvv}z|}}~{}|wy{}{}ysuytyzx~yxwv|ysx|{uzyrvy~yx||w|}w|}tzw|}xz{xz}wz{vx|vx{vxywwywwwuutrrtrrtqs~z}|y{wtvxuw|wxtuuxvvqs~uvorqtqr~wx~vw{uvtstsmn~xy}xyyvvtsswsqzyv|{ywxvuvvmoozwyyvxurt}z|wtv~{{}zz}}wuuywwyvx}xtvzwyvsuvsuxvxvtvvsu|yzyuwtvwprssuvuwxmopyqtzpszorzorynqxpvlrxkqwgntjsyhrxjqqjopmmoroqrmomfkoinkejoinmgllfkkcfkdgpilpilrjnIJIFFFBAEURZWT^\U_WTZXY]X]\U_YW_[_]^b^^f`ae^_d]^i^^kcch``hccb^]a\]a__edfddhcch`dh`efaghafg`fgafg`gj`fj]dgTZ]_eiafiafibeicfjqqufekiepheoqpzjluloxjlmknnikldgheghfijdfghfiqoqifhkgirlnlhjqlnokmsmonlnjmmkmnhlmafgw|}bghlrslrskpqimnqnsifjpmoqoorppqwvgkj`aarnoqklsnpolnvru|y{pmonkmmkkussrppgeeommwmt|t{skrqmsrmsmloecffegnmotsuvuwqtumqrmqrkopmpqvrx|ry}ov}owznuzoszqtwpswuwvwxstuurt|vx|ux{tw}tw|ztyvswrs{t{zt}xw{|{}zxz|{}}{v~~fqr`jjowupvtwvryxtzvsvro~xuxzxtxvuywsyvrxv{{wzxwxzz~v{yx|x~yz}}~~xxxy{{~}~~z{z{}uv|}yww|zz~z{~xuw}z|{xzspr~~~~zyy}}~z{y~}zx~}uy{~~}|z{|q{zxww}x}}nos~~~~~|x}|~~zx}{w}}w}zx~~ywywwytxyqvwrxyuz{yry~}u|v}u}tsyrpwpouwv|yw}~z{x|ttxxx|}}y|stytvyxxzzwzrnotpp}olnutxuv{oqqdhfhkirusrvsvywpppooowxvuwrnpkurmtqn{vuvno{qrwpqrmmsmopnnqqqpppnnnoootttqqqnnnnnnnnnnmmooonnnnnnnnnnnnmmmljjsmnqllqljrmjvqmojkmiimllnnneggmllqponmlrqqrpprqpfegprsbejknsknuforjnrurwxotxjqrkosmqwps}~lefrllnrpqusptrrusrtrjtpu{xffdsnmwqpqpompnjomjqniqnrusshf|urzuqwvqyzurxrptpw|w}|y}|w{||xxxqqqvvv|}}x}~w{|z~w{|x|}z~y}~|~v~luunwwmvw{|}~{|~xxz}{}~~www{}}{~~ututw~vwv}}~}~w|{y~}~|~z|{vxs{{zpxxww|z|}y{|y|}x{|z|}xz{y{|zzz}||tttpoo~{|}~~{}|~wtvwtvzv{zx||{zx{}{}}}|wywzvy~tz{w}vypuz{}~tv{~wx{psw}u|x~v|tzuprsssxwwuutzzz}xy}xyzuvxvv|zz|{ztrr}{{|}{wx{uvytu|wx~xy}rxsxu|uzsz}sxt{}uy}tzzqvvqs{vw|vzy|ysu|{vuyrquwvzutxuuuuvvuvvmmmtttvsuyvxwtvxuwxuwvuwrwxuwxwsuy|~qusrttsuutvutvtrtvpuupupnrrptsrwptwlstkstnrtnrtprtolnomotprroqroqkimmkomglpjnmfkjdihdfdacrnpvsuokmMNLJJJGFJZW`\Xc]U_^ZaXX\Y^]\faX_Za[\a\\d\]eZ\fZ\g]]f^^d\\^ZYhdcqlmljjedfedhedkdgkbfg`debfgbfgbfg`fhdilchkdilbgj_fi_fiafibeioqudekkgrhdoZYc]^hjlvgijoqrfhjbdegijeijfhiihjkjljgipkmpkmhcejegkfhqlnnmomlnhjkmqrejktxydhiimnnrsimnklmminnjotqstrrtrroutglkceesnoqkluprpmonkmebdhegolnqootrrxvvussrpptiqxpwskruqwvrxsrvpoqqprrrtxwyttvrtumnortuprrqrtvrx{pxpxqy~qywmsunrvrtuvwsvvvyz|}~ywyurtxtvxruxzpwvrvuuvryvp{xw{xwyzy{~uwfpp^hhjrqkpnxvrzyuwroytq{xyzxwxvvywrxvszw|}yvtspnnljj{xz}wz{z|sxww|zx|w}~zxx~~~xzz|~~{zz}}zuvz{xy|~{yy~~}{{}z|~~~{}~~~~~~{{{}~|wx}|tzyzx~}|~~~x}qrv~y{z|u~n{ywz|z}znpt|~~~|~z}z}z||~xw{|x}~x}z|uzyxwyvxxswxrvxqyytzz~x}}w|~|vzy~pntyw}vtzwu{usy~x|tpu{{~optvy}yyxy}~||wqrzuuxtvqmrusysuuiljfigtwutwutwuqqqcccmnloplrtnyvqzxtwrqvnotvyrs|vwvqrrpprrrqqqnnnmmmpppnnnnnnnnnnnnnnnnnnnnnnnnnnnnnniiigggpoonijojkpllolhurnpnnsqqllljllputpppvtttrrvttqoovttgfhtrtsv{knslowfnrinqrrvslqthnlfktpurmoy}z{vqprqppqowwuqonrpojrptzxegesnnwooppnmpnjpnkrohrnnrpcXXyz~yxxwvxxwnsqx~|z}{|}{}{zuuu}}}xxxqqqtttvxx{|z~w{|x|}z~z~z~z~v}}}~gqqr||q{{}zy{{z|tuv|~|~yzz|~zs~vvuw|}zsrt~|{}~{}qln{}z|r||wwuu|}}y{|xz{y{|z|}xz{y{|xxxzzzuuunnn{xz~}z|~{}wtv{xz|x~tpuxwy}~|{}xuw~y{~{}{vxwzvy~tz{w}sv~nsx{stxpq}~~vwx}v|w}tzv|~~~yyyyyyuuu~yz~yz~|~|vxwuuwuu}{{vtt}}|xx|}|wx{|xst~xytzv|yw}tzv|yx~}sywmsrmouprswptx{tmpyx|tswzy}yx|vuytttzzzxxxssstttvsuzwyxtvxuwxuwvuwpuvqsttoqx{twsrttrttsuutvrrtuottpvpospnrpquotwktsmrsptuostqstqnpnlnqnpsprroqokpkflqkpoinkdig`ec`ba^`a^``]_a^`QRPNNNKJN\Yb_[fWOYSMVZX]beeW_\]b_c\\cY[eY[gZ\hZ\e[[g__meehdcfbajfejhhfeggfhcdh`cgcghbfgbfgbfgbfg^cfbhjchkfkn^cf^fj]fj_ej_dimqveglplwjfqvumnxmoyfhinpreghikllnodhieghhgijikmjlojlojlpkmkfhidfjegpmotsuwzzptujnomqrgklgklsxyimnnpqkglsotolnsqqwuunttfkjhjjsnoqklpkmtqssprvsuqnpnkmkiinllljjsqqnllwltxpwxpwuqwqmspossrtsrtwvxxwytsurtusuvrtupstqtuvrxynvrz|muyltvptrnpsqsrtupuvt{{uy{lopssuxwyqoqvupwusxuvys||vtsw|{}~|yxztqiqqdllntsmpnxwszzvzur~yvyv{yxwxvvywrwu{~|pnmtrryww~{}{uz~vzutvuzyx|z~yxvv~~~z||{~~~|}z{}~~~wuu}|y{roq}vvvyyywww|||~zuu|}z|y~z|}z|}~~~wz~||vwzq~|{sww{zr{~~nos||~||~~}z}{z~}y~{zsx}v{xwyuwxrvvrxxqyytxz|slry~~rpvrpvusy|zvtz{t{}yxv|ifmmmsilqtuywx|}|~xvwtllnefjcftnsrnsqrrgjhiljuxvsvtorpooolllmnluvr{}w|}yvppvnotvxrsqlmqppqpprrrnqqpppnnnnnnnnnnmmmllmllmllmllmllnnnnnnnnnrrrmmmmmmnhioijpljlhdwsnoppsttinmgmlu{zoootrrqooqoojhhommsrtwvxkkq\_dnpxdnphnppquslqrhnmiorpvsotojlxrs~xyuqpmji{wvtposongropwthkisonwnnnpnmpnlpnjqnirolqo{rq~zy~{zz|zuywszwqwtuzxuxvxywuuuyyyxxxrrrttttvv}w{|w{|x{|||x|}z~{~eooup||dppsytxyvz{~}~y|}y}~}|~}~}||xwwxxz{|~mln~~zx~~~xyy{zz~}~}y{|xz{|~}z|}xz{y{||||rrrwtv~{}}tqs}z|~ztpu}|~}~}}z|}}xzwzvy~tzvrx{~pv{z{{|}wx{|}~xw~yv}w~}xz~~~uuuwww~yz|wx}~||~yzywwwvuommtrrzxxytuz{ytuxst|wx{uvszt{w~v}sz}v{x}~x|yrwtmrrmowrtvztxwzy|zy}tswwvz{z~rquvvv{{{{{{|||yyyxuwxuwxuwxuwxuwvuwuxyuvxxrt{txwzsrtrrtrqssrtrqsuotuqvrrvnmqpptptxotunstptuqstqprtprmjlnkmqnpqnpminfchoinqjorhnnhmc`bifhebd`^`dacTUSPPPNMQ[XaQMXWPZYQ\YV\WYZPVT]`^g\^fY[hZ\i[]l[^i__f^^lddd`_`\[eaahffcccdcebcgadiacdbcddfgdfgdfg]be`eh_dg_dginq]fjZfj\ei[aflpucflqmxgcnkjtfgqgis]_`npqqstfhidfhimniklllnvuwtqspkmqlnsnpmhjojlsnplikifhdcedfgkpqkmnlnomopvxyhijlnookpxtypmopnnommmsrfkjkmmsnoqklmhjtqspmoolnnkmkhjkiitrrpnnsqqkiixmutlsvnuuqwsoujimsrtqpr{z|srttsuususrtsrtrprsqswsyynvrz}nvwjrxrwpmommonstoxxnxxowwmtttxyz}~jlmrtnuvtwvytq{wt{{tvw}}r}y}zinohmnntrlnlyxt{zv|wt~yvvol{yxywvxywvywpus|}ysqpxvv{yy}z|zz}opqy~u|yv|w}}www{}}x}|z~wxxooopnnztv}vw|vw~~nllxvv~{}xuwvvvzzz}{}|||wxywx|x|}{pxwyt|o{{{twuv{ukwy}opt{|}|{}~||{}}~{z~}y~|xrw}v{xwyuwxostsxyqyysxyz|pno~{|}vtzkio~|usyvovyu{wu{}{uv{vy~rswsuutttsqp~zy~tt~~{|wprwpu|||hkinqoqtry|z{~|sssqqqlmkwxtprlzwrxuqsnmvno{prwqrvqrqoonnnnppmooikkjllloomoomoojlljlljlljlljllnnnnnnnnnrrrooolllnllljjmkjfeawwqlqpnsrjpognmksrrrrtrrommrppommmkkliknlnrqwrqwgjqfmphmpoqusotqkpmkqhhmtswyvyztw{vwzrrmffzttxtsuqpisqiqnnrpspotonmnllomkpngnkktqnsq|vw|xxz{{y~w}|rzynvuqwvtyxwyyz||suuwyyrttsuupts~x}~y}~{z~txyw{|y}~nrskuu|shtts~~}txy}|}~z~}{{{s~|xy{|y}|~ytv~y{z|nvvt||s||xxvz{|~z|}y{|z|}}~z|}xz{y{|yyyyvxtqsvsuzwy|~~z{w|{z~yz~~}{}z|zuw~z|{vxwzvyu{xtztwu{tqqttt{wxqpp~z{u|t{v}u|sz}xzuuulllqqqtttuuunijvqr|}{|{|yz}xy~xzxstytuz{{|ytu{vw{vwz{u|v}ryszt{~v|x~x}xqvunsyuwzuwqusw{psmfixw{postswutxssspppvvv{{{yyyyvxwtvxuwxuwxuwxuwwuw|y{xuwrmnztvurttqssprtqsurtuotvrwutxmlpoptqtxlqrkopqrsnpqonpurtkhjliklikpmoqkplfknglpjokagdZ`d_amhjlfhidfgbdNOMWWW[Z^WT]SOZWN[_VaUPXZ[]TYX^a_g\^i\^gY[hZ\kZ]^TTlddiaasonlhg]ZVaa\fgedddadd[__]_`bdedfgcffeghlnrggkefj^^bghlbhn^fmcipdhpcemefnkgrjfqut~ablegq^`ahjkrtuqstdfgkopoqrpoqfegkhjpkmqlnzuwpkmpkmojl|wygegjhjefghkklnolnolnojlmkmnllnplquqvsprgeekiiw}|ejimooojktnnqlnvsulikpmolikvsujhhnllsqqsqqpnnwltnfmrjqqmsplrrquvuwxwyrqswvxvuwrqsrqsqprrqsttvvrx}rzyt|sfn}w|sprssuntukttnxxt~~qyyy~tz{ptusspxxxutxvr}xsxx~z|}z|hmpmqrlnonoomomzyu|zw|wtxu}yxywvyxwwywuxv||xwutywwywwzwy}w|~qxwpyvpwrooorssprrrwvsyxruuxzzsno{vwzxx~~{yywuu}z|}vsuspr|||{{{{{{z|u~juslwuy}~y}~}~~wx|w{|y~{}yv|z}xuzvxtq}xo{}}~|}xw{rwuy~|zy}{|zy}~z{~x}xwysuvvz{qvwrzzv{|yvxxvxyy{uz{qvwxv|{y~|~|xv|vnx{xwt}kjtsv{tvwtvwuvu{yxxuq}vsnefxsrtoqsprxyygjhtwuqtrvywy|zxxxuuumnlpqmmoiurmurnxsrumnuwpklussrrrnpplqpjongiikmmlnnlnnlnnjllkmmmnnjllkmmooommmnnnmmmoookkkmkkmkkljimkgkkejonqwvkqphonjrqnnnvttjhhussywwwuujegnkmnlrllrlktfmpjormptposminihpehponutsvqnpwqsxxvnnwrpwtsqonaokenkinlpnmsnmstrqtrqvt]danwtpwtxvusttsyxr{zqzymywmxuv~}tzyv{zqutvxxwyytvvuwwz~y{{xw{{z~z~z~p||stp~}{|~w{{~~}q}}}~|}}t{zwx{y|prs~~}|~}{}~y{|uwxvxyz}|}|y|}|~|~vxyz|}|~~xz{z|}}}}}}}}}}|||{xzvsuvsu|~|~}|x}tpusrvx}~y{|wywrtwrt|~wz|svvlrxtzru}luywxx||}}qutz{{u{qw~qwqwtz}{{{zzz|||{vw|wx}xy}xy}xy{uvvpq|}ystz{z{|wx|wxvqryszov~nuv}}w|~x}wqvxrw~x}zwyzuwrv}nrvyvortsw~utxmlpttx{{{llluuuvvvuuuxuwxuwxuwxuwxuwxuw~x{xsuxuwtrtrprsprtqsurtvsunkmvpusotposrqulmqloslpqdhirtutsuebd|y{roqmjlqnpnkmlfkoinkdiqgmg[ancipilsloldglehkcgQRPVVVYX\YV_WS^\R_]R_[T^\Z_PSSZ\\c\\d[\h\^j]_l^`e[[tlliaa`\[_[Z`^Zba]dfdghfacc`delkmhgidbddcehgif`e^X]idimglsmrnqy^cj]_g_`hhfolksgcnb^ifeo_`jkmwdfgdfgeghnpqikljnohjka`bhgiifhmhjjegvqssnpniknik{vxojlmjlmlnmlnnmonmonmomlnmlnmlnuqvvrwurtpnnmkku{zhmllnntopwqrojlolnqnpolndacroqvttywwqooljjjhhtiqognqipplrsoumlpnmocbdjikhgisrturtolnqnpqnpwtvsouvks~owqyuhptnsropusuqttsxylttt||muukpqnstrtuswroqqxy~ts~vsvx}quv|{~||xz{onpwuusqpvvryxt~zv~yv{x}yx{wvzxwxxvxxv{zvxvtywwywwzwy|w|~}nxvnyvtzv|||z||v|z~{rwvxyz~~~~~z{~yzzxx~||}{{~||}{{{xz}z|xuw~{}}}}|||zzz~~v~{{{{~x}~~~~~~xy}uyz{}ny{{wz~zz~}ly|o~w{wqz}{zsy|wz~yz~wx|wvzsxv~}|z{rsw}}}y~y~~}rttrvwqvwpxxsxyxyxwzzs{z{{yvtzsqwzx~{yw|qnwlktptxtvvsuutus|{vwtpxtq|xtrqponnqrrsutpsqtwuqtrtwux{yuuummmhhfnokqsm~{vtqmfa`vnovxwrssssuvvsuumrqputoutjpojonjonjonhnlglkfkjdjhglkooonnnpppooollllllkkkkkkjkijkgjlf_``bcc`feionhnmnnnussqooussvtt}{{nikojlqmsqntnmvdknjornqunosllphksprzknsvv|utxwtvrhhysrronpsplom^miepmjpmponrnnqrpptrpus_fcktqlspqrssxyrxyo{{nzzkyxkwwt~~rzzu}}pvttyxuzyrwvtzxw}|xzzxy|~{}tpl}|gwvst}|tx{z|||~|{s}z}s{z{zzw~~}}}{}uwx}xz{~{}}uyz|txy}~z|}prsz|}z|}{}~zzz|||~~~{{{}z|}}z|zwy}zwy|x}rns~~{vxvqs{vx~y|wz}sy|qt|ox|u{zsyx{rxwv{z{rxu{zw|w|urtvvvtttfffyyyyyy{vw}xy}xy}xy}xy{vvxrs|}{uv|vwwrsytu|wx~yzvqr|vwtz~qwqwwjpqwyuzxtysotsotvrxtqswrttxrvuxxptwvzhgktswnmqutxkkkyyywwwsssxuwxuwxuwxuwxuwzuwwzxru|~qstruvvprvqswrtwrtxsurlqxtyzy}rrvlmqorvmqrxz{pnpjgimkmxtvkhjolnroqtqsrlqunssiotgmugml`fd^a[TW`Y\d]`d^aQRPTTTVVZUR[YU`ZO^]P^`Xb`]c]_`WYY`Z\`[\aYZdY[fZ\`VVf^^lddd`_fbad`\cc]de`bca\^^[`_hhjgfhhgifeggfhg\bm`fncil`flagmjt__ia^igbmkeplhsfbmfbmddnijtbdnhjkdfgacdjllkmnimnkmnkjlmlnifhmhjlfhojlvqsojlpkmunqqlnsnpmlnlkmnmonmonmomlnmlnmlnrnsuqvsprrppqooqwvlqpkmmzuvuopuprvsuxuwifhnkmqoosqqpnnvttkiixmuskrnfmrntmioqptpoqkjlonpmlnpmopmotqsvsuurtuqwzowqbj~px~qyvlrrknxuvrrtuxymqrjopkpqknortuxwyvxwjlm}}vtuqtw|ostw{|{yvw{onpnjl{vw|{tsovuq~zv~yv{x~yx{wv|xwvxvvxvxxtxvvzxxywwzwy{w|~z|txyp{yq|yt~xvxxx~|z~v{zoxwx}|y~}xxxxxxzxx|zz|zz|zzzxx{xzlllzz{|zs~xs~xz~|{}~~~y}~u{zw~}pwzxo{}vt{zsz}t{~zv{~wz~|}wx|yx|w|z}y{{yx|vz~jko}y~}y~prrrvwtyzpxxqvw||qrruzyiushuszx~zx~xv||zxv|tlwtnyjfrmhtnmwlnvvxxsuupqmzyu~{uxysssoosnloolrprvtwzxx{yrusqtrtwuuuuoooxywuvruwqxup{xt|tu|qsxvvvvvuwwtyxw}|nttnrqkpojonjonjonjnninlglkbgfhmlnoonnnrrrpppiiilllkkkkkkjkijkgjlfb``trrjkkkmmjpnnnnpnntrrtrrussljjqjmrmoplrrpvoltgkninqkpslptilphltot~orzsw{rrvpoqtll{wvzyxtzxksp[jfitqjqnppntpn{|zvxvjomelihqnjqonrsrxxnyyn|{k{ziyxjxwr~~gqqputsxwtyxsxvw|zw}|t~~wwut~~{{|uyznzzl|{o~dts|esr~~uoqrvwzwyz{zyz}vw}|~z|zlkmxwyuwxxz{|{{|~uwx}}z~z|}|~{}~~uwx{}~uwxrtu|||~~~{xzurtxuwwtv~|~zwysotxtxpnrtuy{}~}}{{}z|}{}wzwzw}mpxq{owvdlkv~}pxwqyxurv}yvzyty|x}yxztttzzzxxx}}}wwwz{}xy}xy}xy}xy~vv|tu|||tu~vw~xyytuytuzuvzuv{|~syzrxx~skp|qwyuztputpusotrnswtvytvtx~os|qtyruvuyrqu~xw{yyyhhhuuuvvvtttxuwxuwxuwxuwxuwzuwzprqjmtqsjmnpuvvrtvqsuqrupr}uotxtytswsrvnosnptnpqsuvmlnnkmniktqssprnkmpmopnpqjoslqpfluiordjqekjadqhkpgjpgjmdgSTSRQRUTXVS[]Zd_Sb]R_WPZ]Z_Z[\XYZ\ZZ]ZZ^XY_XY`YZe\\aYYc]\fbafbbfc_bc]bc`efdikkfjjedgbacedgcdeffij\cpahsek}mtrdjnhrfblfake]gkalmdnkfqeblihrgiregqjlmklmklmfghhjkfijjlmlkmnmofcekfhnikqlnpkmjegniktnpsnptoqolnnmonmonmonmomlnmlnmlouqwrnsnjnljksqqpvupsskllzvwnijlhjkikpmofbdolnpmonllnmmnmmlkjdcbujrzrxtmsupvwsxvtwpoqrqsonptrttrtojl}wz~x{uprwsyzqwszpx|pw~sxrhl{vxqoqqtumqr{{~~rqrvuwyvxuzyhlm{~tvqrtw|tzzv||x}~eeifcejgipklzuuuspxvt{x}wu~wu}yx|xv{xwxvuvwuwuszwvzxxywwzwy{w|xuwuz{oywp{xqztwyyv{ztyxryxs{yqvuv|ztwv~}}vuu|{{xww{zz|zzyxx~}|{z{wuw~{}{xz|~{{ztttvvu|~u~s~u~z}|~y}|||w{y}~{}zuy|~x}xr|ysp}z~x}vz~|z}~|}~y~|v{y}yx|ux{bcg~{{~|x|npptwxx}~t{{rwxxxxxzzw}|s}q}wu{{yyw}{yyw}xwr}\Xcjgrkjudfmwyytwtqrnsrnywrrwqpuqryukrpgonpvtorpvywsvtnqotvtttsoooyywqrnpqlxvqrplrmlzrrzoqvssxxxrttrwvpwumsrkqpjpoionionionionjpokqpoutjpomnnooosrrqqqgffnmmljkkkkkjijkgklf_Z[ytuommlmmpqroooliitrrqppommollvorqlnmiotpvlirjmphmphmplpsjnqcjqgmutxx{tx|opswqqjgfnrppxtlurXfblvsjqopporpo{|zvywjomipmiqniqppuylswnz|l{~i{|iwzjwyq~dprnttqxvrywrxwv}|w}{wwxvy~~|x{|rvwz}~nxxixxo}}n||q~~~||wz{{~y~yzvy~}|{v{}{{~~~~ywz||}~z|~y{w{{z}~w||pstmrr|~~z{|||~z||z|}}||}||~~}|||~~{y|ywyvtvwuw|z|~{}}x~c_e}||}{~|xz{vx~}xz}xz{ru|svv{hkrvzirppyxmwupyxxy}wwzttxwvzwx{rrtdddppppqqxxx~~~|xx|vwyz~yy~yy~vw~uw{|~uwzst|wx|wxytuwrsytu{vxxrwysx}ninvpu|w|upvvrvupuqlq}}wysvz}{psuosrswklpz{rrvrrw___}}}sssssstttxuwxuwxuwxuwxuwzuwqutmpvsupstqxxxqtxpsvorvorwqvzv{spusrvrswmosprsqprvsurnpqkmtqsqnptqssoqmjlnhmsjoodjpekpcilagldgg^af]`f^af^aPORVSXTOTa\b`[`VV^VX`EINTX\SXXW[\ZZ\YY[VWX\]^_`a`\^a\]a\]f__jdaededfg^`agiiacdmopb`fZY^``g`dh_chfcegeglhjpkmsmplnrihmf^do_gybjhppimiikilnhkmggicbdkdgg_bkdgolnnmopnpnmonmoeeggegnikojlojllfhplna^`sprlikqnpolnonplkmllnnmomlnljnojsokrnjqrmuqltsnornnmkknmmjiihklprskjlkjlvsukhjmmolnojopsxyellqkmuoqysuwprsmnytvtoqqlnnjlsnpqlnvop}styqrnllhlkppqvuvtrsnlmxxxmrrmutnuujqtkptmtxpw{||tottswsw{uuwvoqwz}h}|gwxrvy|~wz~~~|swxjlmljmmjltoqyoqzps}suvxvx|{{rqqyyywwwvvvvvvsssvvv{{{zzzvvwvuw}}lnlqso|~{xzxvwwlmortvvxzvxyxz{z|}wyzvyzswxwz{wz|~ozzttvztv{~~}~xwy~ppr~|z|{~ww}rsx|~~|~~~~zzsuusywx~~y~~||~{}||vy~x{y||yzx}{z||}}|}{x|zzut|xy{|zwywuw}uv}yzwxx}t~|||}}{{uu|uu|swyu{zv{{nrqyzzvywtxvrusqtrpsqhwvhwumxwjoqkoprttpqrhjjprrprrqpp|rsvopz{kii[[Ztztprnvtpqliyrnvqrrqsrvwlrsquvqtujpojpojpojpojpolomlomnrprtrknlqonronvrptqprnmojiwllvllwkkvkkwkkjnlmsqgpmfolkvslnnnnnpnnqlmqklrmnnkkjhholnplqqmstjrnhoaagquziqvhtwequkuymtyflqqx{nqrmqpinlkpnlrmtrnxtp|vryrnzrnxuuuvtlompusjqnjrqly{sctvbtuauvozzozznxxq{{mwwmrsrvwsvxrvw~|o}{|{ws~zz||z||z|{}~xz|wxyvwz||{~}z~~~}}}~{|~|{~z{}}zyvw}|x{zouts|{~w|{|w||~|t~~~}x}xz|~~yry|~~}}|y{y}ww||~~}~yz}~{|xst~xyyx|{uyyvxwzwx|~xwywyz{~}}}}~}}~|||wxxst~vw}}wyxy}}vyysttwtub_`|yzvst~{|z{u|zt{zt{{u|~zzz{|}}xyxst}txx{~swux}ptuzw~ytzusv|y~|y{{wvupoypuxpvvrwsot~|rswprvzzkvr{nzoz|ltylrxntidjcchhmrfoyfoxfoygpzgpzjmoruvvuwtqs|y{xuwwtvzwyvsuxuwwtvxtvtqryvxzxzolnytvrmoupqsnpvqszsvytvolnljlsrtljlutvqprtsunnppnpgdfnkmnikvorsknnjokimjhlhfjjgkfchgcei`cd^aiegabdMNRNOSKKOONRZW\TV^UX`JNSSVZRWXUXYWYZZ\]_abZ\]Y[\a^`e`bfabe`_jc`gggdfgZ\\gij`bcjlmfdj`^d]]c\_dZ^cdceedfkhjojlfacggkhhlmfkrciyaju]ehZ^xqspmoqknrjmjikslojadlfhnkmfegrqsjikihjnmokjlqlnojlnjlnhjsnpsprxuwolntqsolnmlnjikjjlkjljjlihllgpojspktnirqlutnornnxvvpppmmmjlmhjkfegljlvsupmolnolnoglmnrtemmqlm|wxc^_topvqrvrtqnppmonlnolnplnrlm|tuoghsqqw{zrrrtttrrrooowwwnsrmsrnrslqtlpunsxqwzuuyrlqxw{suyuuwzrtswxdywuwz~}~{~z~~s||{}~x|}imnZ\]lnorqssoquloump|rv}ux~uxvvvxxx|||yyywwwvvvtttuuu}}}~~~{{{wvxhgi~~~jkivws~|x}zy}yz}xvxtvwsuv{}~y{|y{|w||vz|w|}y~t~~w|}{}~zsvy||y{yxz{z|}|~|{}~}yxz~~}~~~}}}~~~mlpwvz|z~}yyww}{}~z|}yx|}|}zx~wxx}}|}~}|{{zzux}z|z}|z}z~tvvrsqxws{zv{x}xwyturqpyxz|y{~xyz{yyyz~owvvx{z|z{uvztuypuvw}|uzysxwoqquwwvywuxvsvtx{ylomcsrkvvisshmnlpqnppprrmooqssnppommxmovno~yznmmaccqvtrusywwrmlumnwprsrtquvbjjkopnpqkpokpokpokpokponqonqopsqpsqiljrpornnuqptpntpoqlkwmmvllukkukkukknsqjqnkrofolitrlmnnnnpnnqlmrllpjlrpppnnpmookpnjpshprkrqqwnrwluygsw[gk[fjdmqhnstz~mqrostputmrplrmtpoxsrvqpvnoynowutqrpmpnv{ydkhoxvlzyp~|brqcutdzwkuuq{{r||nxxnxxqvwostptutxxvz|r~zr~wq}{z|{z|}z|z|x{|xxzvv{{{x|{{x~|~}|z{z{~~|}zy|{xwxw{{~z~y~}|uyv{{y{{u}|~tyx{z~}||yzty|yyxx}{{{{~~~~yx|~vwuyzxzywwvqq{ostz|}wrs}~sno~|wxtvv{|w|{xzzzuw|wy|y{{z|xz{suvz|}}{{xstzuv~vwvttvxxx~|xzz{{{zuvnij~yz}xy}xy{vzupttnrzuytosjegnij{vw}xyzuvwrsyruuxxlpvhl|rxqxovv|vuyokq}|{upox~xsottpuzy}rswux|y}mxq|n{n{|kszlryou}}~ptzjs}hr|gqzgqzgqzquvtvwutvroqurtwtvsprsprurtxtvvtvvsunkmmjlqnpvsuwtvroq{xzroqvsu|uxrmolikroqyxzihjqprxwynmopoqqprroqurtkfhtmprilkgllkoihlffjdcgfdhkdgi`ckbemjlacdLOSMPTHLPKMRSVYNSZRT\UX]]`d[]^VWXY[\VXYXZ[acd[]^`_ca_`d_ae``faaeefacdVXYacd^`a`bca_e^\bhhnjmrlpukjlgfhhegkfhe`bhfjhfkjchqdjwfmxdlyhlujmohknfiuillkmmfipgjnhjheggfhgfhihjkjlkjlrqsqlnojlnjlojlqlnpmotprsprtqsfcenmokjlihjkjlihjihklinokqqmsokqrntuopqlmnnnoooprskmnkjlllnroqqnplnolnokpqmrsgoovqr{|ytuwrsuopqnpplnqnpplnolnolnuopz{rjkrootuuuuurrrqrrppptttosqnsrnrsmqrnptotwotwttxzv{srvuvzvsuuxx|}h}{usvz~{~{~tailfmplqrlqrfjkoprutvqoqrlornpysuyuwztwvvv{{{}}}xxxvvvvvvvvvsss}}}}|~onp|||jkituq|xtzz|}y{oikutvuwxy{|{}~uwxtvw}~|~~vxyvvxt~~zy{|wqt}twyvx}|~xwy}|~utv|{}zy}}|{z~zy{{|~{}~zx|~~}~~|sqw|z~~{~~~~|{~z}y~zzwz|~psxruzruzw|{tvvqrp}|x~z}zv~zyxvv~~xrsyvv~~~{syxrswz{{|yz~wx|qvvs{zu|zw|{rttsuuwzxxzxrushkijmkfsrjvvisskpqptusuurttnppuwwqssqppwlnslmzvwsssqssmrpqtrwutrmlxppunqsqsmqrchijmnnnpkpokpokpokpokpoorplpnnqopsqiljrpornmrnnrnmyutupotklqkjskkrlkskknsqqvtfmjfolktqhnlmllollnllqlmlghrppussmjlnjnmioqfn`Y`VV\ptyirv`lpZfj\gkirvjpuntymothlmptsmrpjomqmluqpvrpvmmummplkkljz|zsxvnurmyylzyaqqbtsfwwzyv~~s{{kssqvwrvwrvwuyzpuvr}zq~|{ty{|{z|}z|{}z|}xywvvwxxw|{x~u}|{{{|zz|wx{|}|~wvts}uz{{v{zuzy~}l~{xz|z||y~}w~}uzyv{zy}~rvw~{~~zs}}x}~wpv{{xx~}}}|{w}~w|~|}{xsr}xw~}pvwx~y}~w{|tvwwqr}wx{|zuvxzz|]bay~}tyxxzz{}~y{yxz}|~xz{~~~zxxvqrzuv|tutrr~y~}uwwzzz|vxpkl{vw|xxytuwqvpjolflzsyxrw{vwytuwrs}xy}~wrszru|vx}rurgj|u{v}xw}vuyuqwvsu{wv{vuqgm|t{~zzv{tuytw{v~qxrzpypyxhozlr{qw|}w|ns~lr}lp|jp|lp|ptusuv|{}roqsprurturtxuwtrtvtvvsu|y{rprkhjlikqnp|xzvsu{xztqsvsuwqsxsuurttqspoqjikxwyrqsihjqprurtjgigbdunqsjmokpnmqnmqffjdcgfdhicfofildgnjlcceINQLQTGNQIORNVYRX_OV\UX]YZ^^\^ZXZXZ[XZ[[]^_ab\^_]\`b^ccabd_`f`_a`b^`aUWX^`agij`bckio^\bbbh`ch[_dcbdedfjgiidfe`bhchlfklejmdjlchpfktjmkgijijfegrknkjlrknqhkqjma^`gfhihjljljiknmojiknikpkmojlojlmhjjgiifholnxuwlikpoqlkmjjlljlkjljiksoutpvqmsuqwsousmn^YZqoommmooooqroqronpmlnnkmmjllnolnohmnhmnjrrvttrqqpnntrrrppomomlnpoqpoqkjlmlnpkl{|vnppklyxxywwsqqsqqurrussttrqsqqpppprrotsswrwzux|{z~rquyx|wtvzprruui{zdtsqtx}~{ztmvyhooqvwjnonrsrtuqprpnpopqtrtuuwwuwtttsssuuuxxxtttvvvwwwrrrlll|||{{{rrrlmkvwsuwr||zuuwrtutvwtvwz|}xz{||~|y{|z|zwyusuvsut||txywyzmhj|uxqpr{z|}|~~~}xxx|||~~~zy}}~|~|zzssyqqwy{|{}~zy}vuyzy}~pos|{yw}xv|zx~xv|zx~|wx~z{}|||||~}|{~z~~z{||}y|x{{~w|{|{wvuqyxtxxvzzz~mpqprswrs|zz~~~z~}v{zqst{}~~xzzvxxqyxpwvx~}tzypvtv|zx{yy|zz}{y|ziwvlvvpxxlprqstqssrttlnnqssprrrrrwoprlmxvvvwww}|puusuuvttuopwopxqtyvxpstinonqrpoqmoomoomoomoomoolomjmkjmksvtjmkrpoqmlqmlqml~zywsrokjjgfrmlpmlqlkknlgljgljholirohmljlllllnllqlmjefnlliggifhlhmokqvksyryrrxuy~nw{equlx|r}luylrwlrwlqspuxkpqlrqipmljjtopwrstopvnotpoigfvwuhkipusovsm{xkxv`nlduri|yqyyowwlttpxxjrrquvw{|uyzy}~puvywr~wp~|xz{xz{zy{~|~z|zyytuutxww~}u~v{|}|||~|||wxytuyx~}{z}||}~|~~vwxzo}{jxv||}|~~~x}|||y~}{ptt|~}}x~z~~~y{~~|||y{y|wxv{|z~}zy{zwtzyuzyuww{yy|zz|zzz|}ruwcghw{|twy|~xsuvsuqpr~}|}|}z}}}~||vqr{|zxx~vxxwwwxstupq}xy|wx}xytoqlgihceytvwrtxst|xxxstytuvqrxrtzuw~wzvmptil}v|szqxsyonrvrxwtvzvu{z~|xtywsx~stxsvzv~s{s{pypyuelxjp|rxzv{lmqvy~rs~or}op|nq|pq|mqrmopxwytqsurtwtvtqsurtvsuvsuvsutqsxuwifhspr}z|nmotsuutvsrttsuytvqlnrprkhjrqscbdfegcbdlkmihjtsuroqtqsrmotmpqhkjfkbaehgkgfjihlgchi`cncfmbdgaccbdFIMOUXELOBMOMY[MV]PV]QTYVUY\WY^Y[SUV[]^Y[\`bcZ\]UU[\[_a]bc^`e`acbdfhhacddfg`bcbdehfl[Y_kkq`chZ^cddfa`bhfhojlnikunsqjomgljejhfjgejlnp`hiVcc\gfcjkkjlpiltknngjmjldcecbdlkmsrtpoqkjlnikpkmpkmqlnnikifhtqskhjolnfceqprkjlkjlljlihjhgihdjhdiplqlhmplqsmnvqrpnnmmmooonpqqstqprpoqgdfplnlnolnokpqinohpprpptrrrppmkkrppkjlkjlqprpnqnlnnlnrppystyqr~jfgqoosqqusspnntrrurqusowsqvrsvprxuwruyehlstxxw{xty}xzwjntrtewvr~orv}wiqqbjjinokopjlmqtujnomqrmpqtyztwxyyyrrrwwwtttpppxxxzzzwwwqqqtttuuuvuw{z|ppprsqvwsivplxtnzxx\hhuyzsuv~wyzzy{|~}|wyosuwyz~~|~~y{vuw~}~yyy{{{~~}|{zzww}{}~xz{~}~}||}|~|}{xv|{yystzxx{z~xw{zv{|x}tw|z}x{{~y~}|~~~|{wyxtyyuz|z{}}ntsptvtxy}{{|yy~~~y||xzzmop}tvwtvwtvwovvlwuu}|y~}putputuxvvywwzxorpiuuittlssklnpnplnnjllmoonppqssssstmnsnnwvvmooinmotsuwwvttsmnzrsxor{wyuwxkopqprsqsmoomoomookmmlnnorpjmkknlnqopsqsqpsonsontpokgfgdcihghjhnmljljmmklljrusfljipmkroinminmkmmmmmommonnommjhhlikminqmsynvwpwuu{nrwmvzequhtxlw{ktxrx}cinekpcjmqyyZbb`hgbbbrpp|wxtnoxrswsrwsrttrrusrwuitrhusjxvo}{n|z~}zv{|PTT{x|}z~v{|q|zvzr}{ww{|y{|y{|~{}|y{wxxtxwuzyr~|r~r}x}|y}||||{zz{zy}|zyz|}}}uo|z}{{}}{zz}~}quv||~xuz~~|~ts}~~xx~zz}||y|~}{|z{|zvwu~}yx~}zvuz{yn{y_igu{zz{{|}||vttxvvzxx}{{xz{w{|vzzy}~uyz|~~upr{xzqpr}|~z~y}~}~xyxvvvxxotsoqq{vwvqr~yzwrs{vxxsvsnpxsuytvz{z{|wx|wxxstxrtzuwxsuzsv|svvy{z|pv|{|x~xuw~zy~}~tz~v}{w|uqvvuyqrvorv|rx|rx~rxrxqxovrx{qwyuzqrvlotqo{qp|omyonzsq}txyuwxutvsprtqstqswtvwtv`]_yvxsprroqwtvroqtqstqsvuwrqssrtsrtutvqlnmhjoln|y{poqnmolkmihjonponponproqliknikmfisjmminfeikjnjimbaefbgh_bbWZi\`ngjb`bNOS^_cHNQLVYLY[HPWIOVWY^TPUe]`[TW\^_Z\][]^Z\]\^`cbk__e^]aa^`e`ba`bVXYSUV]_`^`abdeeciYW]llr^afbfkihj_^`gdfhcegbdmbhi^dhbgfgjcgjahjlvv\ml`rq[ml_nmgfhrknsjmjcfmjlkjljikedfnmodcedceojlojlojlpkmlgilikroqjgisprkhjnmomlnedfkjlihjgfhjhiroqropjginkmqklqlmnlloooqqqoqrlnonnpnmojhjroqlnolnoinohmngooooopppnnnpppppplmnlnokmnlnolnolnommmxrs\QSlefojksnoupqwrstnoxstvpnvpmwooysrxpqysvmoslqtsvzyy}ysx|wy}osuuwiyxfsrorv|~zfpp`ggmqrfkldijinofooirrnxwqzzoxxsssyyyvvvpppqqqzzzxxxwwwsssvvvtttzy{tsuwwwxyw}~zfvpdsohvtn|{bposwxoqr|~xz{xz{srtz}z~||qvvz|}wvx|~~|~}|~yxz{z||||~|{{{{{xz|xz{yx|~}|~~|}{y~z{}~xw{xw{~z}y~qtywz}{~~v{zz||~~z~zzzvu{yy~}ryxqyyuz{yyy}}}qqqwwwoqq{}}xzzvxxvxxitrerpt}{ionrxwvywuxvvywz}{}~lyyjqqlqrkmntsu|}}{}}uwwsuubddkkkwqrupqssskpokqpnrsprsvruqjmzptxorytvttvnpqqprnkmooooooooonnnppporplpnmpnmpnmpnpnmrnmqmlrnmokjmkjeihchfgkjfkiimkstrvwutwuinlipminminmkmmkmmmmmommommkiilikkglokqwltqjqkkqosxpy}dptcosbmqhrvqw|gmrkpumsxeloiqpckjqprpoqxuwrmotmpyttrnm{zyyxwuvtpushspjtqm{wp|r|ptufjkosttxyw{|ptuostmqrtxyz~~w|}r}{u~znywwy}~x}~{}~|{}zy{wyyqwvr|zp~|q~q}v|{v|{z||xzzzzz}||||s~t}y{{}{z}|z~z|}{z|vy}ux||z|{|||{yy~}~klkvvv|zz|}~~}}~|~|}w|{}{~}zzxxxxyy~~~}}}vwzsvzruz|~y|wx|toqytv|y{xwy|{}vz{{}}}}~~zuvzuv|}~~rwvoqqxxx{vwtop|||wxvqrwrsytuwrswrs{vv~yzytutopytuzuvytuvsuz||ux|ux|svtzov}mtuioutxuqwxuw~zy~yxw}zry}y~wsxsrvqrvrtxzsv|sv|svrvrvov}ou|rxxtzrrvpqwpjwtp|rmyqmyrmyjnoprsutvtqsyvxsprxvxwtvifhwtvsprsprqnpolnsprvsusuvtvwqstnpqjlmsnpxsuvsuurtqprpoqnlnnmopoqonpnmoolnnkmojlkdgsjmmina`dfeiffjonriejmadfW[eW[jbegdfTRVZZ^NRVKSVMY[JRYGMTWW]UPUg]`^TW^`a_ab^`aXZ[^`a]_g\\a[X^a]bc`b``bacd^`a`bc_ab`bcb`fcagjjp]`egkppoqfegifhnikkfhh\bwlrrlqdhl^il^ildklYfeQ`_]lkZeefegrknrilmfipmolkmlkmedfjikrqsqprojlojlmhjpkmqlnlikolnifhxtvqnpqprfegdcelkmjikihjnkmpmojgiroqmjltnosnoqoolllmmmegheghmlnpoqnkmolnlnolnoinohmniqqqqqrrrpppuuurrrnprprsgijhijlnoklmijjzuvtvvnolfgwrsupqtppvqrytvzro{rn{ro|rrynpxqsqrvmru]benosysxvnr|mqsprgwvnzzz}~z~hppeooenmjnphlnjopcoofrrhttq}}iuupppxxxqqquuuvvv~~~vvvwwwssszzzvvvzz|utvyyytusrsontoqvtvzyrvwrvwptumopxz{vxy~wvx{~|z}z}vxy|{}poq{}wvxfeg|{}|{}~}{{{~|{~|~|~|}{yw}|{zzyyvxyy{|yx|zx~~|y{}~}~vtxvuy{w|~z~y|ux}wztyxxzz||z~{y}xtxv{rzypzzu}}~pppxxxyyyzwwnppprrqssvxxvxxozxjwup{yryxhmlu{ztwupsqqtrqtroyyrzzdhi}{~sprrrrtvvsuunppfhh{{{xtuurroppinmlrqnssoqrtqrtmpxorwlosmponpsuvurtrnpooooooooonnnrrrorppsqmpnmpnmpnpnmtpoqmllhgmihomldlhdlhjqngnkholqonrsqrusmrpkpnhnmhnminmkmmmmmmmmmkkommxuwsotnjpynvpipiiolpuox|htxbnr_jnfosrx}ntylt{dnq^gjgps`jjuwxppqwturmosnpwqrvqp{wvrpostrrusjrphsqo}yr|r}swxnrsquvw{|w{|vz{nrsnrstxyx|~v{|mutqyxxmutw~tyzuyzuyz|{}zy{v{znutq|zp~|o~o}t|{t|{x}|v|z{|}~}|~}}}{w}|~vxx{z~}y}~x|x{~}xy}~~~~~xxx}{{yzxyw{|z|}{wut~xvu}|~}nwu~{z||zzxxxzzz|||zzzwwwuvzorvruyux|y|xx||wy|~}z||{}utvu{qx{|{kxzixz||||zz~yz|wxyzzxxrttxzzzzz{|xst|wx|wxxrttop{vwzuvwrs{vwupqlgh|wxzuv|wxzuv|y{|y{wrt~xz}twx~yxsy{z~|x~}}yx}xwv|{szsotvrwrquqrvsvzzsvzsv|sv~svrvovzlr~tzxtyrtxuu{~tzryp}swxsuvsrttqszwyspr{xzwtvroq~|~wtvsprmjlqnpsprrsttvwsuvy{|vxy}xzvqsroqzwywvxsrtpoqpoqnmoonppoqpmoxuwpkmkdgpgjokphgkgfjedhkjnfbgg\_pcg\NRh_beacXSX]X^PRVJPSIRUHPVJOVYY_ZTYaWZ`XZRST`abbcd[\]^^`Z[b_^hcci_^bc`bedf\^_`abadddefijkc`ffdjiio^afgkponpjikgdfmhiidfm_etgmichdil]jl_jlxy{jppX`baii`beihjnhkqilngklhlihkjiklkmnmoihjkhlpkmmikmhjmikpkmplnroqpmoxuwroqpoqqprrqspoqnmokjlqnqpmojgiroqrprqklrmnnllmnnnnniklklngfhomopnpqnplnolnokpqkpqnuuopoqqpnnnqqpoooqturvwbfgcghjopinnhjjupq~uvulmuopzzysttnnxrs|wwyplzpl{on~rrzmozprttxquxbhkqrvsmrzsvwzxuwlxxp{{}wx|vy}{|~v}wy}lttfpplsskrslpqjopbooesrhuuesrkyxvwwsttrrrxxxxxxsttwwwqpp}}}zzzvuw}|~yyystrqso~zw~yz}vyy{xvywxzyz{xyz}|~}tx~vyw{}{z|xwzmlnvuwzy{wvy{z|www~~~~|{wu{zx~}~}|}}}}suvz|}~~{z|{vuyzx}{y~|wu{wu{xmoz{{uvuqtutw|z~{|x{z}y|x{vzzuxxwxvvur|{vy~ypwt{pzyozzs||z}}ehhwxx}||{zzprroqquwwxzzxzznwvr}wpzynvusyxy|zwywrurz|zpzzqxxhlmyxzxuwqrrpqqtuvoppgiinnnyttsrqlnnhnmksrorustxpmqzzqvwmprlnonprttpnpvrtnoomoommmqpprrrorprtrorpqsqnqoronwtsronmjiokjponemjgqnfnkcmjfnkrqpxywvxvmrpinljpojpoionkmmmmmmmmljjpnnfbdhdgnjpumtnioghmfjoltxkvzamq_jn`imntyouzelsgougprbkmbllnpsqpsrrusmqwquyz~}yutwutstrpsqirnkunq|wpxpyvz{otuuyztxzuyztxyrvwswxvz{x|}txynutt}|{u}|~u||w{|w{|y|}zz{v|{lvtq|zp~|o~n}w~v~}v|{w|{z~~~~o}{s~|~~{}}tvv{{|~}}|~vy}}}v}xxx|zz|~~~~~yznom{|z|}{vwu|}{nnm~||z}pwr~~|yw|||ywxtssz{{uv{orwtw||y|wy}~z}xtvqpr||~y}|~uuuxvvxstyttzst{xxuwwz~}tuuvuu|}{vwz{zuvtop|wxytuxstytuzuvvqr~yz|wx}xyvqrpoqvsuzux{}vor~qwsz~pv{yx|rot|y{xuu~yy~uyx~wsxxuxtswrrvrtyzsvzsv|sv~sv~tvpwviot{ytytuyyy~f]iofrxo|xo|zq}qtvwxz{{}rorvsvsos|x{wtwvsturtsprrpqtqsroqurttrsostnrrqvwqtufjkvqtzuwqnplikpoqnmoqprnmoonponponqrnplhjtoqkdgldgiejlkohfklko`^cfagi^agY]XHMndggadLLPRSWOPTNOTPQUSQVURVYW[ZV[[V[^Y^\V\`Z`f`fc^cb\b^\`_\aa]b`\ac_dfbdfcefbdfcfdacjfhc[bcbhcfkbejhgmgfkfeid`euotoinn`dxjnmdjkgmdelbckmioliniekhfkkhnihjfdfljojhnhfm^[ebakffpffoohrkbknnnjjjkkj|||jjiddfutvnmolkmmlnonppoqsrtqprlkmnopkmmqooojkqpplpopnnpoomkktrrnllrnojffsoprlmrmnussoooppppnnuqquqqrnpsnprnprmoqmornnutsonnjkkmoomrqkliqqmzxusqm{yv{vrvspvsnpolvwrtopvpp{rt|qswjlxmoytyyv{mmqnosoqu|vwytu~~z||~~xzusp~}ostoqrmpqorsrtupstmrqkqpfqoamkj|xqwvpvuputtvvvvvw|{sxwsvvxzz~~~uuurrrxxxuuuvuv|||}~|}}wx{xx{yy~zz}yyyuv}yz}{{{}}moo|}}z{z|||yyyyyy{{{xxx~~~~~~{|}}wyy{}}yyx||{opnprurtxtvyyz~~~|}{~y}~vy}uy~~yz~z|{y{{z{|||{}}}|x}}w||x}|x||w||zzzvvvsssuuu{|{|}}wwwxxxvyypzxs}|{u{zy||xxxyyywyyw|{v{zv{zwzz}}}{{{vtt{yysssvuv{xy|xy{uwwxxvwwqposoowrsqssinmmrqmrqnsrwxxyrutqsnppipmkvqntrmrrosrnsrmqpxyz}}y{|prsmopruvjrqeqoujltqqnpp|xyztutpqtttrvtrvtptrlpnimkkomhmkdjggkjfljgljjmmjmminminmhmlPVUUYXeffikkkkkkkkmmmlllijjjkkpopgquenslsxeinnqvept_koktxdjoorwknrfliltopzvamhbpktsrtrqusrtrrwuuvtssqpljiywvxvuvwuoutnwumzxhvtk|zmwwhrrpzznxxpzzuz{w{|swxrvwtxyw{|ostqvw}uyz|s~~q{{q{{pzzp{{m}|evun|{r~~t}}y~z{{{|||{{uzzz}{{~~\ge}xr~~~|~~{}z}{z~~x{}z~~zxz|||}|zy~}}z||vxxuytz~y~}enlzoyxqzxyw|{txs{~{|x{y|}}ytuxw}|tvvrtutwzmrsntvqzzdqpxykuu]ddx}v}v|{ttwt{wr{xqxwo~|u|zs}zu|~}xyytuvqrsnoxrsztu|vw|vw{uvzuv~yzzuv}xyz{{|tssvxxptstuuzuvzruxsuxuwtrtmlnxwyyy{vuxvuwvuwxvxihitttywxvrryrtxssxor}rutzqxu{rjlqhkzruxprwqrnlkecbljiwuuvsswr|{uys}pkurlwupzys}vqyuqwsottpuyrxyrxyrxxrwxrwiikusvssurqspqrxstxstqonqoossstutommommomlqooqoovnqqjmunqnjljfhiboiapgbpom{`^lecmldenefujksfhpceMNRPQUKLPQRVMNRSOTVRW]Y^ZV[ZV\]Y^^X]`Z_e_dichd^c^Z__[``\a`\ac_db_afce_\^^[]XUWb]_bZa``f^af]`ecagihlfeifbguotichseihZ^mciokqihqgfonirjenjenojsmhqmlnihjjimnlrc`i^Zemlvijtjkuqiti`jnnnhhhddduuu[[[gfhsrtnmomlnmlnnmopoqrqsonponprtuoqqljjkfgllljonpnnommljjsqqljjsnoxstupqrmnpklywwooogeeojkuoprnprnprnpqlnqlnrmnqooqqqnnnikklqpmnlvwuzxwljitpormlnihmihrpopnmlghvpqzrr|qsvik|qszrwtnssnsqpttrv~xyzvv~||uuu}}}~bponrrprrnprkmnlnooqrmrqntsmxvfsql}znvvpvuqvttuvsvvsxwqvuprrtvvtttyyyxxxzzzrrrwwwwwwwx{uv{uvxvvxvv}||yxwwuusqqwuuvuuprry{{uww}z||yyyzzzvvvzzz}}}yyy~~~}}}~~~}xzzxywz{yvw{rswpqu~||~~}~|}}~}~yz~qqwts|qqw}~|}z{xy}~~zy{utv|||}}}}}v|{z~z~nsrotsw|{zzz}}}zzz{{{|||zzz|||y{{p|znvuqwvv|{{~~~zzzy{{tyxrwvsxw}vvv|||ywwxvvxxxxxxywwzuvztuvvvwwwtrrsnowrsnppnsrw|{qvuxrumkmnrqjpnjvpotspvtqvurwvqvurtujlnprshjkltsbom~{{{np|wxlnnzuv{uvtoptttnsqnsqkpnotrkpnkpnejhejhgljgljgljejifkjhnlinmhmlX^]\a`fhhikkfffiiilllooommmmmmqqqjvxenqpwzkqsnrultwcmppwzlrumqtkppiojdkfr|vfsllxrywvzxwrpotrqvtrusrrppmkjzxwqonstrsxwnutfrpm{yctqaqpl{ztjyxgwvt{|w{|txzmqrx|}x|}swxrvw|nrsz~~o~~l{zk{zbqppk}|btsp~}t~~w{|y}~|||||||||szyu{z~}}|zz~||~~ythtvx~~xz{|~y{|z~x|}vz{y}~w{|~|~{}~z|}yyy}}}}}}xxxvvvxxx|||{{{{{{||vu~}}|~~~uww}|}uxv|}p{y|q|zszyv|{zx{y~|wvwwz{{|}~xx~}mop{}~z~zt||nxxn|{o}|^hhisss{{|}~jvy~|x}|wy|}~~wt{wrxvnxvnwzypzwr|wx|xx{|{|upqytt{uv|vwytu{uvztv|wxxst|wxytu}xyxvvqsslqpqss|wx}vyz|vsu{z|yxzxwyvvxzy{xwysrtqprtttuuu|zz~xrsvprxpqxorrxt|xnr{ruvy{ruypsxrtywvtrqsqprpovp{rlwyrlwqkvvp{rlwvqzvrxsottpvvpuvpuxrxxrwxrvlkmpnplkmrqsonpvqr{vwqooommwwwmmmnllommvttvttpnnvmpmfipilmjl_\^iboibqgbqpjz``ndcmjefnfgnceqdfpceQRVUVZKLPSTXOPTUQVUQVYV[XTYZV[_[`^X]^X]`Z_nhm_Y^_[`a]bc_d`\ac_dgdfheg]Z\XUWecdnilaY```fehmfjnigmzz~ihlfbgoinb\aoaervrhnjflfenfenjdojdooitgallfpkjlmlnihlkio_\eokvlkughr_`jphslcmlllmmmkkkkkkiiikjlonpnlnmlnmlnnmonmonmoonponp}ikkkiic^_iiikpomkkommsqqmkkpnnqlmlghlghqlmtopqoosss|||ommsnotnorlnrlnrlnpkmpkmojkommmmmoookmmnsrmnlcdbrnmplk{zvnmyqp|wvrnm}{zhcdystwopzprxkm~qsymsrjovnsrmrwqvztu|wx~||sss|{~}\jikopprtoqrkmnqstkmnqvurxwkvtcpngxunutpvupvvpvtsttlqpejiprry{{sss}}}}}}~~~rrruuuuuu~vw{||vwxvvrppxvvxvvuss|yy~|||||hjjrtt{}}{{{}}}yyyzzz}}}~~~{{{yyy{{{y{{|}{}~|xy}uvzz{~}~|}~}~}~yz~~~vw{zz~~~~~}}}tzy}z~x}|w|{z~|||}||||||||zzzzzz}}}zzz~~~xzzs{zw~ryxhmljonyyyyyy~v{zuzyuzyrrrsss}}mkkvvvzzz}{{~yz~xy}}}yyyqoo}xyytutvvsxwnsrkponsrsuutprjklntrjrnkuomrqrwvuzyuzyv{z|~z|}iklfhioqrfhiaihcpnxst{npytunppvqrystwrstttnsqqvtrwupusfkiotrafddiggljgljgljfkjfkjglkglkhmlagfdihhjjjllfffdddllloooooonnnqqqnuxiorptxtw{yz~qwzkqtpuxtw|wx|vxylonbgeqwujtqnwurpoywvxvuusrsqpqonqonljivtsmkjttrrttpvufongtrgus[om\onnh{zfzyt}|vz{vz|mqrz~y}~w{|txyx|}kopvz{k}hzzg{z_qpi}{m~}iyxp||t}}v{|z|~mnnux{{{|{{|zz}{{}}q|ztt{~y{|~z|}~|~qyyt~~|||{{{{|rrxyz~y{{xzz~|~~{~|||lwuivtq|zu~|v|{|zutzz}wxwzwrsozxx~}z|}~jnohmnrzzpzzv~jttvw{~~xss|ytxuqzvr{xuqzws~yz{vwytu|wxvqr}uv~vv~vw~vw}uvztu|wxxstxstxstz{zwwnppotstuu|}~wzwrtwtv{z|{z|utvtsuxwytsuqprqprqqqjjjtrrxst|vwvqpupqyps{ouxjpxorwpstmpxqtwpsyttvttywv|zyzxw|zyuozkepytnyuozwq|oitxs|vrxuqvuqvztyztyztxxrwvpvjiklkmkjlonputvtopxstqooywwrrrooonllpnnxvvwuurpptlnlehngjjgi_\^kbokaqibqnhxfbrfbmhbchbclack`bnacUVZ`aeNOSNOSOPTTPUWQV\V[\V[TNSPJO^X]ZTYLFKWQVc]bZV[]Y^`\a`\ac_dfbgiejhdj^Z`b^clfkaY```f\_d^af_]cqpthgkplqkejpjoseim_crhnc_edclgfof_ljcqmfsjbpjcpgfhmlnihligmdajZVa]\fdeobcmvnysjtpppooolllhhhooomlnnlnmlnmlnmlnmlnmlnmlnnmoZY[npqkmmpnnpkloooinmommiggiggnllsqqtoppkllghsnolghmkkooommmnllrmnsmnqlnqlnqlnpkmojlpklussmmmoooqssqvuononnnpkltmn~tvynpynpxpqvnpxrsjde}wxumnynp{np{np~pvrxsyxpu}v{|vwytuvttrrr||^lkhlmqstoqrjlmXZ[TVWputoutjuscpnizwkvtnvuqwvputputrxwrwvrttwyyrrrzxx~||}{{{yy~||zrtuopz{xvvkiiooovvvvvv{||~}}}y{{|~~nppy{{y{{yyy{{{www|||zzzzzzwwwsss~~~~~~~~~~sqq~~~}~{|z{|zz{y|}{jko|}yz~}~{|~}~~|{rpvzwmms|~z}sv{x|{z||{}zy{zzzttt~tyxtzyz~}uzy}z~xzzy||z}}xzzwyyxxx{{{zzzxxx~~~wyymutrxw|}yyyssswyytyxw|{jonvxxrrr~||sqq||||zz|wx}wxxxxwwwpnn|}}xyuwwejityxjonputuxxrqskmnputkrokuomrqhmldihbgfchgjlmrtuhjkwyzqsthjkw||hsqsno{moystoqqsnouoplghqqqmrplqofkilqopuspus_dbchfgljgljgljlqpjonglkfkjglkhnminmikk^``mmmmmmooommmnnnmmmooopstoprkmnoopxwyxxyruvkmnjlmxwxvtvmlmuwwvyzottqvwusr{yx~usrrpoomlpnmkihpnmmkjusruuurvutzyq~|iwu^ihbmlmxxkvvozyw|}vz{y}~imnquvptuw{|vz{uyznrsuyzo}|lzylzy_mlaonkxwq~}r||v{|wz{{|}|zzxu~|||~||~||wutwrx}~|~~~{{|~wyz{}~y}~{}}}~~~zzz|||~nnuvw{y{{{}}}vxx|~~{}}pxwr}{w~z|~|}wx~xy~vqrq|zgmloqrwyzx|}x}~wgqqo}|tgqq\ffkssrwv}~xst{y}yyvq|yt{xup}zvz{z{z{|wxytuuwuwuwvxtv|vx~yzzuvxstvqrqlm{vwsttstttssz{~wz{vxqnpxwytsuqprtsupoqtsuxwy}|~iii|zz|wxvpqxttupo|wxuxy{twxsuxsuvqrvqszuvxvuvtstrqomloitwq|icnuozztvp{qkvyt}xtzuqvvrwwqvxrwztyxrwvpuolnwtvzwyurturtuoprmnpnntrrsssrrrpnntrrkiiommommsjmmfirknnkmqnpkbokaqibqmgvietfbmhcfhadjadj_bh]`FGKXY]LMQMNRPQUVPUYRWaZ_YRWTMRSLQa[`nhm`Z_^X]^X]TPU\X]`\ac_db^ceag\X^kgmhdjgciibih`gbbh`chbejcaga`ddcgjfknhmtnsx|txpflhdja`ibajjdolgqpjulgqmgrjikkjlihlhfljgpiepqpzfgqbcmtlwzq{oooeeegggpppjjjmlnlkmnmojikmlnlkmjikjikjikkjlgijjllsqqojkpppglkhffdbbeccnllpnnrmnvqrojkpklpklommnnngggsqqpklsmnqlnrmopkmrmoytvytusqqllliiisuulqpknmoootnorgiyln}pr{np|qszpqkcdc]^~xyvnnujlrt}prpwtz|pv}qwv}|vwtopljjzzz}}}z}{y~gutftslpqnprnpqkmnjlmiklfkjdjihtrhusgxulwulwunvupvuqvurxx}oqqprrpppzzz~}}}}~~ussxwwyqr|vx|}~|||zzyyyvvv{{{{{{tttxxx|~~tvvxzzz||zzzwwwzzzyyy{{{||||||tttzzztttyyy|~~}~||}{~}~~{|}~|}|}|}}~|}{||{}{z|~||y}}y~qwzuz}|{}~}zy{{}}jonrxwsxwz~|{x}|xzz}~~y{{y{{}}}uuuxxxuuu|||prrkqpsyxv{zopqyyyuuunnnoqqtyxz~}vxxwwwqqq}}yyyyyyrppz{ystxxxrrrqoowrswrsuwwjonx}|qvuv{zjonquvuyzntsnurfpjlqpjonhmllqpmrqoqrqstnpquwxnpqkmnmrqiqpsmnxikypqy{{fbbtnn}xyvvvinljomrwuqvtpvtjombgeejhinlbgehmkotsjonfkjglkinmjpohmlikkjllkkknnngggsssooonnnmmmmilwrutrtnkmhgjigivsurnpsqsnlnpoqsotutxuuyikodgkpnmqonusrywvtrqusrusrwutwutvtsywvywwvwwy||w~}dmk`^_onotrswuwuxyuyzvz{rvwuyzz~y}~y}~uyznrstxyyyzvvxvwxwwxzz|t~}issszzvz{zy{wuwxwv~|||{z}z~qqq~~wuuwuu}{x}~|~}|~{}~}~~}~|{~}}}{{{xxx}~{||}|~{}}|~~vxxrttrtty{{z||y{{wx}v{zz||zxx{|~xqr{|ztuvy{vwr~|zrttqstx|}{pxxgqqro}|kuunxxt||rwusnpz{|y}zv|zu|xxuq|yv~{|{|~yztvtvwydWYsu~xy~topztvsnozuv}xxuttz}}~||vpq{twytvtqskjlsrtutvnmoutvxwyzy{xwy{{{rrr~||ytuz{~{wb^^{vuzqt|svvqssqsvsurprsprrpp{yxomlsqpusrsqpsmxys~pjuwq|xr}ys~qkvvqztpvuqvtpuwqvwqvztyysxxrwvsulikxuwpmooijidewuuwuuooommmqooommommnllqooqhkohksloliknjlj`mmbrlbrhbqgbqgcokfhkghkdglcfladSTXVX\PPTIJNKLPWQVXRW`Y^^W\aZ_f_dXRWVPV\V[^X]e_dgchgchd`ec_dc_dc_e[W]eafhdjhdjjcjjbiffl^af`bhhflfeifeijfjmglpjo|nrqcgf\bjflbajbajkgnkglnjqnjpniqlkmkjlgfjfdjhenokvjisghrghrldoofpnnnkkkkkkqqqlllkjlrqshgillnpoqhgihgihgiihjgfheghfhhljjmhiiiihnlnllzxxvttommrpprmnqlmkfgrmntopnlljjjdddpnnqlmrlnqlnqlnrlnqlnwrtnijwuuxxxsssikkafe`bckiksknzlpzjnnrquuyrvshkjcd{uvvnoynpreg}pr~pu~rxxlrxnt~tz{uvzuvtrrxxx~~~}|vw{ty|~z||}rlzynrsqstnpqoqrprsoqrjonlrqitrr}hyvjwulwulwupvupvurxwx}|tvvqsspppvvv}wx~yz~vpr}wx~}wx~~|zzvvvtvvtww{~~}wyyrttz|||~~vxx{{{zzz{{{zzzyyy{{{~~~xxx}}}yyy}}}yyy~z||z{y|}|}{|{||}|~~~~~~~~|~~{}z~zz~nsv|{}|{}tsuz||otssxwz~w|{x}|u{zpvtlqptyxv{z|||www~~~~~uzyyz{|||ttttvvrwvv{zw|{xzzwww{{{~~zxxwwwrrrwuu}xyyzyyytttsqq{vwtopz||uzyw|{qvusxwotsmrsjophnnu|yfmhkpolppkpomrqntroqrrttnpqtvwnpqhjklqpktryrsyhk}uvwyyrmnuoptoprrrpusnsqpuskpnntrotrdigbgefkiafddig^cbchgfkjglkinmionhmlnppnppnnnnnnkkksssoooooooootnn}vwtopkefommtmn~wxrklojkwttolnslswqwwtzqpuppvsqp}{zvtszxwqonqonsqpusrvtszxwwts}wxxwwtuusyxgnmpfiynqxnquxxwyvzzvz|w{|w{|w{|vz{quvrvwswxtxy|wy}vyz|{~{}x}~ltttyzxz{|z|}xzz{{|yzx}||x~}z~sssvtt{yyu~zx{}{}~z|}{}~}||vz{mop~~~|xx~~~}}}~~~}|~|~~z||xz{y{||~z|}y{|w}|~y~}xyyzzz~y{wrtxsu}xzz{~yzs~|y~wyzvxy{x}~rzzfppq~n|{lvvt~~muuvyw{}}{xz~{wv}yxzz{wvxts}yx|wxwrszuvxstzuvwytvtvzlnuw~xy|}|wxxst~rmn}wxqootttyuvyqr|uxhce}z|tsurqsyxzyxzyxzvuwvvvrrrzxxztvz{|{xifb{zvqqxpqtrtnpqmmotwwvwxwxxxvtljipnmvtsqontnxxr}xr}vp{vp{uozuozupyvrxsotxtywqvvpuztxxrxxrvxsusnp{}ytvuprwqr~yz}{{wuuooopppqooommgeewuuqoosjmnfjpilgdfgdfmcplaqkaqkaqibqgcogcijcinglrkp~t{WX\TVZTVZPQULMQYRVYNTcY__U[aW]e^c`Z_WQV^X\]W\`Z_b^cd`ed`eb^dfbffbi]Xa^Yb_Ycc^gjblmelggm^af]`ejhnhgkfeiiejmgloinrdhrdhyouplrkjshhmliljhijfjpmolillkmihjhgkgekifoieponxijthhrogrrisnnnhhhfffmmmnnnkjlutvcbdnmoqprdceihjhgifegihjjlmceeecc`[\kkkjonljj|zzjhhjhhqooqlmkfgc^_ojkrmnljjlllqqqljjsnoqklpkmpkmtoqrnptoq|wxommjjjhhhnppv{zvxy{xyvmpptmrmrptptruzkorjkxrrxprshjvikzmo{ouzouxntxqvysxrlmqlmtrrttt~}zz~uz}{yx|{jxwhvukopprsoqrrtuxz{y{|sxwu{zjusfsqevsjwujwulwunvupvumsrotswyytvvqqqtss{vwzuv|}top~yz~vw|vw~xzvttwuuqrrvwwnppz||vxx|~~uwwtvv{}}~|||yyytttuuu||||||yyy|||nnn~yztvv~{|zz{xz~~~}~~{|}z|{w|}yz~xv}v}yxz{z|{{{|~~{}}otsy~}}|rwv}uzyrwvqvutyxv{zyzztttvvvvvvz|||z~rrr{yywwwqqqsuuotsrwvx}|z||zzzzzz~~xxxssssqqupqxrsuuurrrrppz{xstvxxz~w|{qvuqvupvujrrnvvdih{cjemrqmrqmrqmrqputprsrtuoqrtvwoqrffhmnnpvu}uvzhk}rtvxxvqrsmnxstoooinllqosxvgljmrpfkinsqhmkbgebgeejhafedihfkjglkinmionfkjprroqqnnnoooppptttooooooooo|pruwzrsrkl}xyzoquwxnpqjk~yzytvwnxwozsnwrnwroxsqpywva_^}{ztrqpnmsqppnmrpoxvvtpozz|xyvvvruukqp{sv}uxxpswzxyzvz{x||kophlmswxrvwostrvwvz{vzzywy{xz}{}mjljhjx}~nstwyzzy{z|~z|~|}{|~~xxxsqqxzy{~~~|}~z~{}~}~~z}}}}~~~}uwxz||~uwxwzz^dcw}|{x}|xzzxxxx{zrusnp|vwtwwrsozxv|{|~mopx|}tyzpxxissq~rissq{{muujoj~trx{{xzytt~zy{zyutzvt}yx{|ytu}xyz{~vysvsvnqux|uvtoppklupq{vwuopz{roossswrszrsy|pkmroqlkmvuwttvutvzy{yxzxwyutvuuuvvvxvvzuvyzz~}y~zuopuopstuostptugklimnmoosqptrqwutqonsqptnyztzwq|uoztnyvp{toxuqwminyuzxrwztyxrxxrwwqvuprvrs{}vqsuprsmnpklommusseeeyyyqooommkiiussommsjmmfiohkkhjqnpmcpm`pmbrkaqibqibogchfchf`ef_dtjpNORRTXXZ]FFJHHKXRWWNTcZ__U[[PUWNS_Y^WRW_Y^^Y^a[`^Z_b^cb^cb^cgcha]d`\deahgbjgbjibjg_ga`ebci[^bkioedhfdikflpkppjonbfncfpgmniomltmlrollkghdbbpnnjhhjjlhhklkohfmlhqup{tr|hhrkisqitkakrrrkkkoooooollklknutwaabnmoqqsdcejikjikhgijikjlmikkrqqhddiiihkkpnolkjhffusstppsppurrpmnolmpoolkkrrriggtopoijpkmpjlvprsoqpkmqlmsqqwwwjjjkmminnnns`\btio{ksnvlt}iqrahrbiwipvnptnoyrs|rsrt{orwmsvlr~v{~x}ytysnomhiywwrrr~~|{|y{~nzzbonnrsqssprsrtu}~~ioneljisqgtrhxukwulwulvuovuovusyximlprrxyytttrqqyzysty{xrsyz}vwz{~~zyysuusxw{~uzy{~swwy{{z||z}}vxxxzz~}}~}}uttz{{~~~vvvyyyzzz|||nnm~{{suu}~{vw{uwz~xy}|~~yzz|zuxx~zysy|v~sz}{z{}}~{||}{}|sxw|}x}|{~uzzv|zu{zt{yu{zv|zz||}}}|||||||}}x|{{~vvvzzzzxxwwwsssvxxtyxv{zvzyrttxww~}}xtu{wxxwxxwx}}}}xywvvutttsr|wx{vw~vzyrvutxxlrqjrrtz{`hgcieptsnrqlpokonptsprssuwoqrwyzsuvedfkllqwv{stzilvmouwwrnonhiurrkllimklpnswuhljjnltxveigejh^b`dhfjomgkjjmmjpofkjinmhnmchgopplnnnnnopptttsttnoopppqqqwjlznp}suysuvrs{oq~prvx|~{|}wy|t}zr{woxupxrpxmmkxxvzzxtsrnlkxvuzxwtrqwuturq|}yzrrrprrqtt~~~|~yxz|z||{}wyzw{|x|}z~z~w{|vz{y}~vz{uyzw{|x{}vyzvyz~~x}~nrsvyz{z|{}z}yzz{~|}z{{kpo|~~sqqtrr|zzv~{q{v|~~~vz{z{}~}~|||~~~}}~|}{{{|{{syxv|{}{|||xww~w|~|u{zty{w|ytuz~{vwjsrqwuxz{suvuyzsxyntuqzzkxxrt}}oxxqwx}}~}nnt~}yuv~{z|yx{xwzwv{xw}xy}xy}wx~zzsnotvtvuxtxtw|tuupqz{zuvzuvyzvpq|wxywwzuv~uwy{|~rprrqsutvvuwvvwvuwuuvxwywvxrqqtssrpptoptnohjdnmipljvqpystpqrx|}vz{rvwqutsqpurrvtswutusrsny~ymhrkgrup{tnyupxvrxiej}y~ysxyrxxrwwqvvputmpsloqimumpworvpqsoonkkolmvuujhiqpoonmxvvliinkkpfjmfiqjmnjlmjlk`mk^moetkapibqibod`gfafd]dbZ`qhpGTREXVOYWXRTXUUJTWHPSUVZ[OUfOWdPWXUZYX\\Y^ZY]^[`a[`b\ad^cd^cf`eb\_f`dpknicghbfkfjc`d`_aedgdcehgjfegfefeefffghfhaefdkkchihhiymrxgkvhjnhifcelilohnceocenfcmngrkbn}ov|nrwinyjoufkvhmlikjgionpoqrgjklgoqmsiekpmonkmjikmlnjikihjhgiiklnrsqtunnpjiklkmqjqqjpmgjidexstmsrfpnjsqhqofoncljmopmopporolnnjlunqgdftrtlmonqrqnpqnpvtwqprqstimnmoopnorhkvfmlwqtwilynqsknvqsvrtkrstuwrvtxyqtzmsu{u{zsxtpu}xyjhhiiisttsuu|mx{|~z}{twuqusptqqrqrsppnnvssmoptwxorssvwrsussuwwxwwxttv|xy{wxpnnvuuuuu}}}tvvsttrsssuuuvvz~}vzyosspttxyyvvvvvv|}}wwwwww{zz}}}xxxzzzxz~~z{{wxxxx}}}~}~}|~~}}|~{||~uwwtvwtvvy{{xzzxzzyxy||||||{{|y|u||~~wx}vwzsu{tvy|}}tyyxuw{~w}x|~y|w{~vy}}{}z{{}x~yw}yw~yw~zrysz}z{}}}~~~{{{rqqyxxwttzxxzxxuuuyyyy~}w|{|zzyz{uvztuxrs~y{usxvtzvuzwu{vsyuop}wx{uvwqrxrrz{|vwwstxttsrrrqqulmyoqukm{qszqsyuvvrstpqtppsoptttoqqprrqssuwwyzzwuutttsssmpolqpnsrnrqkonmppinmppprqqtrsqpplkkwvvstrpqoqpnrnnqlkmlllllkllnppkpohmlafe]cabhgfjjgmlptsntsmtsitrisqsrppomllkllkstrspnwqpwwzzzz}opron{zyxvuzxwtrqrvtrvtmqorvtswupqotusz{ystrstryxw}yzywwzxx|{{yxxsywy}|pvttxxsxw~vwwwyyz||v{zozzq||juukwwq||q}m{yp~|str}|s{{uyzqrs{wy|~{}z||~~y|z||~xyz{}~orswwwzzz{{{}}|~~}~}tyz{}}|}y~}~}z{{{v}}ut}}y}~~}~|~xtvz||ussqoo|}{||y}|x}|x~}nutlsry|z}yuzysx|zw{~y~|y}}wtxxzzuzyy~}y~}nsrz}}zvwxxxvvvttt}x|{~xilq~|~wwwyzzwxxsttz|||}}ytutoptrryyyvuuyvv}xxyzxkm~qr~su|uv}tu{tu|tuzturmnnij}xrv~w}zwyyvxtqsvsuzvxrtuptuuxyosttwxvxyzuwxsurmoojlwrtuqqrmmsnpvqrxstzxzklmprsmqrlqrputstpqrmvuqvsnxtprvugkjdjimtsjtroqqtttrrrkklqqrttuxvxtrturtvqrrknrnormoniksnpwrtyrurknynrylp}rvoiljgjtoqwlpyglkehrhkndg}ptxknrbjpcjulrlekdcgedhrdiqbfl]bj[_o`eBPOHJLNP\KQXJOPNQRSTQPQb_aYTVWTVSVVRVWRYYOXXRZZ[Z^[Z^^^b]\`XX\b_a`]_b_a[Y[ebdfdf`cg`chikpcfkbeihfhgfhlkmedfgfhbbfkjogfkgfjgejjglkjojkoghlffjghlbdfjkmbdfcdf}~fffkkkccckkkhhhiiimlnpprdcegfhhgimimnjnmjljginkmihjihjfegjiknmomopjjoghlcbffagkfkqkpkhljfkplqrosmlnkkmkjljgiusuwuwnmoqorqpronponpomoomoqmopmopmomjl\Y[|y{kgivsupnpnkmpmooilrkntlo}nrzlpxmpypsrknsssrwuuzykol[^]rtrvstpmotqsyuwlijrmnzxxyyyikk|y}~qvuuttupqystqnntttsuugmlouttuylmqpquqrwssxyru|ux}vyyruvorttswzutwsvzutxtwzxtwxruvsvwsvwsvwyruwtvwuw~xzwz{lvunvuv|{vzysvuwxvtus}}}{z||{~xqwxpyyv~~xw~~v}}vz{vvx{wy~z|z|~z}~z~~zxrs{{{~~~|||||ywx}zz|zzxzvu}}z|}qtumopz|}}{z~x|s|z|z~}}~s}z~|~{x}|s{ztyxuyxqvu~}}|}z{|||vxxy{{vxxtvvyz{z{xrwsqyvt|zrtuvuwxrxvpuvpt{}ytuwvqsqorpptrrsrpwwrqqmqrmwxtprpntsntsoutmsrkqp_qiarll}v`qkj{tuwwwvvkiiqpptrrqppqrqonnpooqoornonkvmlvmkvklvilvmilgbctopsmnlfhdbbnppkmmnpppqqikkwstlijqooommpnnonnkkklkkkkkmllmmmaaajjjlnnnsrv|{uvtab`tusrsqrsqlrontqqusmpnopnpqocdbyzxstrpqopqomrplspktqjtqkurnurpusptrpusmrpqvtqqqloopwvmwukvulxxnxxnxxpuvlqruz{quvrvxtxyw{|x{}u}}t||lvvfrrp||p{|s|}ut~~p{{o{{q}}fppmwwrzzv{|}|~|~{}~}~}xy~z{~tvwrtuvxy|~y~}~~xx}yz~|}|{}{tzxz~|~~|w~~owwzzvor~~{~}~pppxxx~||}~upx~~}}}{wwyz}{zzxxzxx{yy{yxxwwxww{{{ovuryxlnn~~~yz~txp{|w|{}zpy~wyx}tuvrtuqvwptupwxyyyxyyxyyxxxuvvxst}vw|rttwuwvhjsrrvtttnotnozrtsgitv|pr|prsgivpsz|vpssjmodgypr{vvtsqlhh}ss}mnuprytvtoqxsuxsuwpsjegsrtvtvxnryor|zqvxoutkqodjopqqstmpqmqrgmnoqrpoqsrtkjljik|y{yuwrrtstumqrrmotoqwrtxsuvrtpnpnkm{xzpnpnlnmkmrootnoqijsikrgimclphoiagjfhhfhn_go^hl^ijaje`ikio`Z_c]b]X]b]bgbgJNO7BBORS\MQVLOJJLQSTQPRPOQJDFNKMTVWRVWRWXRVXRZZ^]a[Z^\[_[Z^\[_b_aa^`ebd\Y[jgiedfabffgkdeifgkccgdcejikbaca`bhgifeijimedhedhhgkihlghlefjdeighlfgkgijfhijlmceffhidddhhh\\\ggglllmmmpoqqprhgifeglkmolnlhjolnjginkmjhjjikffhjjljjlfhighlijncbfnjonhmojnoinokptpulkohhjhjkkjlhhjsprvsuonpnnpnmokjlmlnpmopmopmopmopmourtgdf{xzolnkhjpmoqnptqstmprjnypsxnqzps{sv|vx}y{nnnlomhkigjhvywhkitqsurtzwywtvwtvupqrrrmooprruz{|~~{~z}hmlwuuztuyzytuuttprrjpopvutuyqrvnosmnrlmqzuw{vx{vxxsu~y{yyxvxwvxwtwvtwvvywuwxsuvtvwtvwtvw}vyzwysvwyz{~x{mxvowvntskpotyw{|zyzx|||~}u}}muuqyyu~}u}}owwpxxvz{tvv~y{z|}y~~z}zv{~vxyjusgrpkpozzzyst|||zzz|||~~~~{z~~yvx{yy|zz{{{y||}rzz}}}uwx|~yx|u|uxtz|zvz~}|~zxvxyyyszyt}yx}|xxx{|yyytvv}|~~~{}}|}{u{ut|{s{ztvwutwxu{zv{ywy|zzussttnsrnywvxvvxvvusr|zy{yy}{zzxwxywntsntsmsrpvusyxl{wp{m|x`olixtxzz[YYrppwuuommsqqrpppnnpnnpnnokvokvmlvklvjlvmjlgbcsnpojkmhijhhnpplnnlnnmoohjjussnllpnnpnnpnnnnnkkkkkkkkklllmmmllliiimoolqptzystrjkirsqmnlrsqlrpnsqrtrnqomnlkljdecdecnommnlpqomrpmtqnurltritrnurotrotrotrntrptruwwvzynvulwujwukuukuumvulqrlopwyzsuvtvwxyzz|}vz{tyzwlvvkwwmyyoyyr||s}}r||q||o{{xuowwvz|y~x|}w{||~~}~z|}z|||~lmqtvw|~}}z~zy{v{zzt||qyyq{{uxqt{~~yv~~z}}}vvv}{{}uv{qw|}xw{{z~~{}{|yz~||wuu}}|zz}{{qoonlltrr}{{xxxw~syxxzzvttzuvuwoz~x|y~{v{|w|q{{}{uwxvxysxyotukssvvvyyyuuu~~~pppsrrzvw~wxtvvx}prusswuusmnsmnwopxmouw|qsodf{twxsu{tw{~x{~vwzvu~|{yutyoorsvpr}xzytvuprtoq{twvrtxwywtvxnqvyy|rx}syu{x~qprmlnmopptuv{|uwxpoq|{}srtmlnmlnifhqnpwvxoqrmqrtprtoqvprxsuwrtsprlikwtvmjlifholnqlmrlmnfgxpqwlnwlvognnfmjfhifhn_gn^il^ijakd_igek_[`a]b`\aYUZNKPAHH8GFMQR\OSPJMSVWPTULNO\Z\^[]ZWYTVWTVWSVXPVVQYY^]a[Z^\[_ZY]\[_jgidacdaclhja^`dbdbcgcdh_`dcdhbcggfhedffeg`_a`_ahgkffjedhedhgfjhgkghlefjbcgfgklmqkmnacdjlmprsfhiiiioooaaaffflllllljjlwvxfegfeglkmplnolntqsjginkmjikjjlhfhljlgfhdfgklpijn|{vrwnhmohmztyfbgqpthgkbefafgeghjhjpnproqnlnmlnonpnnpqprpmopmopmopmopmowtvolnxuwroqgdfnkmqnpwtvrknqjmzqt}z}}jhjpqrhjjsvtw{ybecvzxjljurturtwtvxuwwtvyturrrsuusuuy~}|nrqwttystxrs{uvussxyyputlrqstxttxpptz{uvzysuwrtwrttoqytvvvvuxvx{xtwtvywvxxuwxsuvtvwtvwtvw}vyxwysyzryzsyzt{{just|{syx|z}{|z{|zzzz~~zuz{txysxynstjrrnvvw{|rtt}z||}|x}}}yp{ynsrxxx}wx|||zzz{{{~~~~~}{z~{xzzxxxxx|uz{|w|}tvwsuv{}~oqr|~{z~~v|urouyz~q|z~{w}z~up}{s~|xw|{ttt~|||tvvtvvsuu~}v{yu}|s{|wx|vuyyuzytzurtwuuxutuuovuqwutwuuusswutvtspnmqonkihpqontsntspvupvtoutjxtp}y]kgcpliwsoqq~||nllsqqnllqoorppusspnnpnnpnnqkvokvmlvklvklvlgijdesmnqkllfgjefjllgiihjjhjjfhhsqqpnnpnnpnnrppnnnkkkkkkkkklllmmmqqqjjjoqqnsrtzywxvppnmnlnomkljnrpnsqptrpsqmnljkiddbefdmnlmnlopnmrpnsqnurjtpktpnurotrotrotrptrntrtuvtyxnvukwuiwumuumuuotunrslopvxyrtusvvtwxy{|y|}v{|imnzmwwYeet||u||pxxt||u||s~~wr||pxxsxyuz{vz{swxy{|xwyvxy}xz{~wx|z{~y{|rtuxz{zz~{z}x}{~~~|{yxzzs{{t||q{{r~~tsv~}wt}{|xzvyyy{stuuuezwh}zx}~zy}xw{}|}xvvvttwuu}}~~rpp|zz~||~~~{rxwy{{sqqwrszq{x|w{zutx{y~xmt}v}wv{uwxz|}otuotuqyyvvvvvvuuu~~~llloppvvwzxx{tu~tvvwzxxxvvystwqryqr}rtuw|qsvx|qszsvtoqzrv{ru~svvno{yxqon^ZYyooopvqsrmo}xz{vxytvytvzwyyxzqoqril|qt|uzzsxwpuunsrkpwtvmlniklptvtxyxxzsrtyxzqprmlnrprolnqnprqslnoimnvrttnpsnpuprvqsqnpnkmvsunkmpmokhjqlmqlmojjwoppegrgqh`gognjgihegk_gm_gk_ghahebhb`f_Z`a\b^Z_\X]ZV[;FF=PO7BBQJMPNPSWXIMNMOPSUVQNPPMOVUWTVWRVWQUVRWX\[_[Z^_^bZY]\[_ifh\Y[ROQ_\^ZWYkhjposihla`da`dedhihjhgihgiedfihjgfjcbfhgkfei_^bedhjkoijnghl`aefgkoqr]_`dfg\^_]_`eeeooo```iiifffgggkjl}|~lkmjik]\^daclikpmojginkmkjlkjlhgilkmgfheghhimklputxzv{pjovnsqjouotqptuvzfjkdhjdghjiknlnqnpkjlnmolkmrqsrqspmopmopmopmonkmsprqnptqssprolnnkmmjlifhmfirknwnqomoqoqtwxhklnrshjjopnfgehhfqnpxuwqnp|~vsu~yz{yyzzzgiixzz{z~}}{rtt|wx|tu~vw}xyrnorrrptslqpoptuvzvw{mnrhimmjlmjlliktqspmonnnuwwxzzrttwyyvxxuwxsuvtvwtvwtvwxruvxyp||q~~q~~q}{nywt|{tzy~y~|z{y}~|yyy~~otux}~v{|x}~|~yuyzoqr~z|~z{}~}}~xz{xz{jvtp{y|||~xy{|zzzxxx~~~|||xy}z{}~~|zzsqq{|||ors}uxy{}~xz{}|}~vu{}vyunlvx{p{vz{y{|y{|ryxuo~|jwujvtputqqq{vwzuv|||{}}uwwz||y{{tvv|~{v{yu}}u}}{|yx|yx|tsutttnomoqossmrqmvts|zzxvvwuuwuuwuu}{{ustuuuntsoutpvupvuoutgpow~}fonipozpppljj|zztrrqoonllqooxvvommommommpkvqkvokvlkuklveacnhiqkljdeidelghkmmgiikmmikkikkrppsqqommqoorppnnnkkkkkkkkklllmmmooonnnprrtyxu{zorpmpnpsqpsqsvtnsqnsqpsqqtrqrpmnlbcakljrsqopnnomorpnsqotrlspjspmsqotrotrmrpotrmrpputqvumvujwuiwupuvquvquvtvwpoqxwytsuutvxwy|{}y{|}tz{qyypzzvyu~~muurzzu}}q{{xqyyqvwvz{x|}x|}{|~}|~suv|~~z||wx|wx|z{vw{~z{}|~{}~y{|vw~xz{uzxvz{}~~|{}{}}}|~|t||yxqrvz~~}~{}|z|~{{yyy}}}xxx|||wwwezwf{xuz{yx|rqu{xz}xy|vwywwpnn|zz|zz|zz{yy}{{jhh{yy~~~~~pxww}|vxxz{wwxs}~}wuyxv|~zzoxu}|u|{z~qstoqrkpqmrsrzzzxxvtt|yy}}~||jpnoutrttuttvqr{vw{yy}}xrsvpqwop}rt|qszoqzpr|qs{tw|wyxrt{ruwzxysqppqosqp{rrqrytvpkm|wy|wyxsuwqsusuuwxvuwxps{qtxqv{ty{tyx}|wtv|y{zy{suvosttsuzwy{wyroqpmourtgdfqnpedfmoprvwytvsnpqlnqlnrmojgitqszwyroqkhjjgimkkpkluoprmnmefh]gg_frjqifhgdfi`fi_gg`geaheci_\c\[_^]a[Z^ZY]XW[@PO8ROLKBMMJSSIOPNRSMOPSRTWRUXUX\Z]^]`]^`ZY]XV[^]b^\aTSWa_`_]_]Z\`^`a^_c`bf_ee_dg`ec]bf_ebaca`bbacb`babc^]addhjglgfkfdhihlggkefkffjbcgggkggibcedeffghijkeefddedddmmmkklllmkjmjjlgfhfegbacbabpnojikgefigjkjldcefdggfgmlmjklfgkijnkjnqmryty{kqrgmieiefj^dfZff[hg`ghcfgUPRlgilkmjjla`b~sruc`bwtvsprgcegcemjlroqtqsolnqnpolnpmoolntmprjnvmpmlnqoqrrtjnojnowuuvrqpllolknkjspouqs|~tprxvxsoq{wxvwvoqrrut|ntsvyyqoo}vv}rs|}~tuyst{vwvvvxwxuuypputvzrrvooqtsuqqrnmoppruvztuzuvzpqvtuyqrutvwtvwtvwtvwtvwquwittlxxpwxxz{szypzxryxtzyuyxy|{qrpxywwwwyxz}|vxykmntvwy{|yw~~vz{~{}{}~z}~xwy{}~|~u~r|zuzyzzzyz|~{{{~~~~}}|||}}}|{~x~|}|~}||{zzvuu~{}}|~}y{}{~zz}|ut~tuxxx|ryowox|vzzw}soqyzyy}}yz~rvuvzzxwx{|zwx|}|rvuvyxx|{x{{xyzrvwltwnuzpqyvu{w|{x}{x~yz~y|{{urrurswsuvrwvrwvrwwrxutvmrqpvuoutoutoutvrvurvupvtpvqnsxvwvuuxvvyww{xyqooqnoqooqooqooqootjvzr}~wqkvrnyvmp{prqfhxloujlnhi\^^uwwjllfiihkkpnnpoorooqmnspponnnnnonnonnnmnmllmnmpppjllsxwntsowsmtqx|lroqwupwtpusuwururwvuqrpopnopnqspqrpqrp}zzwxvstrosqmsqotrtywfkinrpmqomsqpvunvutn|exutrt~{}ojlzsvxrtmhj|~zuw|xz}y{ywyxxyxz|swxv||txyxz{xz|z}~x{|uxyrwxuz{w{|vz{|z|wyz{w{|}{|}||~~~~~z{{|z|}~{{}z}~y{|{}~~~}}~{||}~~|~z~}~{}|~{z|vwy{{||~|xzzuw{}}}|||xxxxxxwwwqn}w|}wvzyx{zwyz{ysttrrtrr|zzywwxwvxwvwuumkkommtttowvu{z|zy|}zwqutqtwty||}~uqs~ux}uxwsuutvxy{uvxpuvrwxmstztu|uvvpq{uv{uvosspvuqrrxvv|vwtopxvvvssvpqwrsyrswln}rttvzoqzoq{tvzuwwprvy~ru|tvruskpnrusrnm{ppzuw~y{toqrmouprmknqrtmrtptuxsumhjtpuwsxsputrvtpu|vxwrtzuwvrttsuwrtxqtxqt{sw{tw{twvrtebdpnpkmnpstwrtqlnoklojlpkm~{}pmoliknkmmjlomojlllllnmmnijlghqeokcjibhifhhegbfg_de^bc`cdade_bb]_c\^bZ\`Y\`Z]a6HDFNCKQFOUKTWRUTPRPMPTQSRQTPPTDHLLPSSV[RUYTW[UWXVXYVYZWZZWYZX]`X_b^dgX_bNTWY\`i_bi[_q`dl^bjada`ba`bacd_bcaffb`be`bplmlhjhcdb^_jgiebdheg\XZkhjmgmmgnkcjqfnk^gkcmlgqf`jmgqicme`jjcojcomgrkfnlgmkgjjejjflkepmfsgfmhhnghlfijcff^``lkkiihqprkkojinnjkmhiieejfgeabkcfsjnkcfrjmpgjpinmfrkeq_Yegammgtropvttiddrklsklpkmlikolnrnpifhljlmhivpqsnopmmnkkumntjlqijxmo{stihgjmkrtspsqprqnonpilohkyruyruz|sw{y}vz~sx{puxy{|wz{|}u~orrkssuz{jlmmqriop||~wtvrnpsqsuqssoqyuwxtvvrtqmoptulopostnrsswxruvqtuqsttwxvxytuvz{{pppuuusssxwwvuuozxmvt{vwzuvvuuxxxyyywxxxxxtuu{||tttz{|zy~{}y~zws||xwy~xy}yyz~|}~~w{z~x|{uzy{~|{||~{}~}wzxvxy|~{}~}{}}xz{}}z|}z|~}|~|~y{|}|~{z||{}}|~~}{z|z{y{y{y{z~|{}}|~}|~~}}z~stz{y~|twyrutssxwy~v}xuuvxpt}n{yitrlwuqzyu}|tzyrxwpuvrwyotwnqv|xz}zyyxuzxxsrvhrrksspuusrt|y{ysvxsuurtmlnyyyuupooittnssnqqlpnfophrtntxrpsrmssy|~qqtpotvrzsowrmxqnxqnxpntrquuuuhhhrsrtutqpprppnllpnnsqqsopnmmjllknninmhnmgnmilltuudddqmmzwwmgkqkovouvnrwlrwmswmvujtrlqnimrorssvpmqrmp{uywqtfggionkppkpolqppvutvvuwwwwwwuuurryx{z~|wvzutuussusrus|~jqnmtqovvqxwnxvmvukusrtttwvuyypwvpxwwvvyxxzzzxxxuwwtzypyyqwxtvw}y{}vxtyzw{|x}~s{{rzzowwqwxszzu||ryzs||t~xts~kyvhjlprssuv~~|}{{t~txutz{zw|{x}y~y~ux|quvx~}y{{~oqrwx|uyzzy}qstuvxtxyvz|u}}y{|||~xz{z}}uyy{~vzz|~~~}}}nnnttt~~~}||~}}{{{yxx~z{yuv|yy|yzyvwxvvrpqyxxywwytuvpqxvvzxwuuuxwxsqvxw{xv{lkobae~{x~zyyvv|vxvrt|v{rrxsqwyrztnsxsuwrt{vx}xzpkn}zzvqrvqrlghtope`azuvlghupqyuutppnnnpppxxxrrrvvvuttystxpsyrvurwzmt~mtovmunv}nusjrvnutkstltvmuvrsytvwrtzuvtpqrkrqjsvpwmglplnrkpvmxonulnrjmoqpsvrwtpunjorntplqoiksnowprwrsrlnslnvmptmpqkmnkmhegqlqpkppkpsmrnhnnhomhmlhjkghc_`vrsd^`okkidegbbjefkdglgidaceceedfgdhdbe[Y\[Z\feh^]^ZWYa^`dacWUW`^`RPUGCMKHQJFQJEQHLRKQUJNSGNRSX]IPTCNPMTWTVZXSXXOUPOQUSVXVXYXZYXZUW[VZ^TW[W[_[^b]]ak\cl^dpaem^bm_afbbdbb`^a_`e\^b`bgachccg]\`iejgciffjfeijimhgkjim`dmjgqlcmmcijchjgjggihgjgfhiikzz|ifiifijhhjhgjifcdcfbgfbhvnyvlyihleggdiidjidkjemlprscefonplikjfhhgiigidegeijjmnijkpnpebcokmkehmfjojrabinqxdgnhhotjmzlpveiyjnuimrknjnommoxkozlpsnpnikpmopnpkjlnopmlnkjlljlnmotsupmoomouqsnlmtpsspqqkkpkljfhrnsyv|vt{~xv}xw}sqxwy{}{}~koptppjfgiggsssrssvqsxruldgvpsworwpsypvypvxouxpuvntwtttssvwwvxxvxxtuvvtvtrtusutrtrttsx{vx{yxzvttysttsv||~nnnyywxxvtvvw|{svvx~}svvtzyt{{qxyv}~v}}v|}yvvu}}x~v|pvy~~~zy{yy{~}|{~}zy}rqvvuwyyy}}}|||~w{|{}}}xz|~{}~|~}}~z|}~z|}vuwwvx{z|||~{z~}|{{~|{}|~}}|{z~~}{z~{z~}|||smszuqs{}|vw{||}zzzz}}quumzxivthvtk{xh{xw|}vyztuyuv|ut|srxyy}sswttwuwztuyovymrvnquprvssxojl~{xzpoqnqrpstooponptqrzuwzsvvsoqplqrnrxrntonmmyuvxtuxtuytuysvvnwrlrrntomsqouutvigjqnpvqsxsusopvttvqrojkvopqlmjlllqpbjijonkllflkntrgkjhiiooosnouppnnojnnippptt|yymkklklmnnuyxhpnhnlipmikjkmkfhhhjjoqqnppqrrrttrrruuutttstttttzuv}wx|tuxnpvlnpssntsqssuuuwstvrsrvuy}|uxwsvusvvvxz{tnoytuoll{{{y{{~twwwyytwwvz{sxyqzznyykyxrzztz{yu}}rzzvz{yz{wxy~qyypyyuq}}r~~~|~xz{y{|uwxuxx~v{|wz|uyztxyy}~{~uxyxz{}z|~{{|qqr{|~z~|suu~{}}}~|}}|~z|}vuw}x}|ipnxxx~}tyz}||utt~~|{{~}}~~uss~{}wps}|{}wyz|vw{tuxyyz~rtwsxy{|lppyyyzwzurtxtw{xztqssrtxz{vyyprssuv|xxxuttyx{{y~wvz||}rwyoptxsxx}tmrxrwxqw{vxupqtoptttrqqrqqxstsno|~uqsojl{vx{uwsnpurrwwwtwwinmryx{vwpkl|xysrrlooonpkijzuwwprzsuyrttotqmrrmrqmrrmrvotxqvwpuxqvwpupnqjjmwxz[\]nopoospjynjxqlxieozxsprsprnkm{xzolnnjojflvqwrotrmssmrxmpxorslowrtnnrmmqllppptkkonmqllpiimkko`cgeijyxurrmiheihcedamhjlgia\^hce]Y[e[ceXbbZad^d^\b^\b]\^\\^\Y[NIK^WZ?=CFCLFCLGCNGCOHHQHKPJKQCGLGINNRWHQTJPSWW[YUZ^X\[Z\YXZXWYVUWVUWXY][\`^^b\]a[\`]\`i]dl`fncfk`ck`bd_`caaa`b_`djkoZ]a_bfcdhjkojimeafgfjedhfeia`dfeiY^gb_h`Xbkagjchhegbac_^`fegnmofegifhifhjhhjhgjiehhh`_cc_eh`koerhgkeggfkjgmlemldlklnofhhfegnkmjeggfhlkmkmneijkopiklkjljgikhjkfhpilnjodfjglodilmorsjmrvwfj{lpukntmphlmruvy}~osrmonikpmokjlmoprtuihjonplkmlkmutvpmogdfnkmolnqnpqnpwqrrmnqnpzy}~~|}vtzsqwrpv{||~prs|~}imnystzuvxvvtttppptoquqridfpkmtprysuzovzovyouyouyouwrsrpp|||wyyprrxwyzy{utvvtvvuwmoppvysvz}|~vqr{uvvtxmmmxywuvtsuusxwqvuuzyx}|x}|r{{s{{pxxqyys{{t~vs~t~z|ry|ry|w~ry|v{~~}}|~zy{~}~~}~~~yyyzzz|~~z~vz{{|~y||~vxyxz{|~{}~utvvuw~{z|{z~|{zz~zz~zy}{z~{z~||zz~{z~zx~vtzvtz~|zvqs}tnp|wx~yz{yy~~~y{{v{znxvp}{n|zizwm}zsxywyzuvz{{xwssyvw{xy}~uvzuvzqvymptlptnosqpttoq~zwysprqprqttlkmonpolntoqvorzwv}zzz|zqvtlsqsqq{vwvqrzuvxsttoqsmrsmrqmrnnqppswvxpoqroqwrttoqytuvtt{vwlfg{stwqrjlllqpionjonqpphonkpoglksssmmmtopvqrpppjpnemlionljjljjmmmoqqtyxhqnholipmorpnqomoolnnz||uwwrttprrqqqoooooopppssswrsyrtwqrwopymoqssntsqsstsstopqlmgiivxxprrwyywyywx{|wrsupqqoozzzy{{~suuvxxvxxvz{sxypzzmyyiyxnvvwwv~~qzytxywyz{}zy{uz{pyyuq}}r~~{}~uwxtvwuwx}|~{}~{}~z|}|~|~{}~~vxy{zwyy|~~tvv}}~{|vy}z~|~z|}ihjy~}out|~wxr||jttu}}vz{{yyzxxywwqootrr{yyywwvorz||{}y{|~xx~vvwyxz~pryu{vw{zhml}}}vsu~tqsyvxyvxpoqvxyxz{rtulnokmnzzznnntsu|{yx|}y~zuvzlhm{tyyrwxrvztyuprnijvvvnnnmkkwrsrmnyru}vymgiupruqswtvussyyyw|{ntsgnmtoptopvttcccpppsqsmjlzuwupr{twmfiqmrqmrqmrqmrqmruotwqvvpuwqvvpuonpjlmtvxrtusuvijnmhwojyqmxqmxsprrproln{xzpmolhmnjornsuqvtpuvpuvjnvmpwpspkmkfhmnrjkoklpklpjkorquqptjjnpquadhdhiXVUljihfehfedbamhjnike`bkfhhceh^dncjqipkcmWR[a_fZY[\[]dacLGIYRU=;AIFOFCLFBMGCOIFOTRYPMSPOUMJPUV[NTVJNQRQUWSX]W\[Z\XVXUTVVUWVUWTVZWX\\]aYZ^Z[_ZY]`WZh`cldfiadjade`a`^^a`babf_`dX]``ehbeiijngfj`_ckjnhgkgfjihlkjnafokhqiakmcimfkifhZY[kjlhgikjllkmifhifhjhhjhgjiedgga`dfbhe]hkbofeibddchgbhgaihaihhjkgijkjlolnlgihgisrtsuvaeffjkgijihjlikpmomhjpilplrgjnkpsdhlaafpilrv|mqxjnqilqknjnofjkvjnk]atnproqnlnkmnkmneijihjqprpprlkmqproln{xzyvxjgiolnurtxstupqxtv|zw}omsusy|}}prs|{}}z|yvx~jno{uvzuvwuuooooooqmotoqjdfpkmsnpuprvptvptwpuwpuwpuvprnll{{{y{{prrttvvtvsrtrprwvxrtunqumossnoystvuy{z|zzzqrpkljtvvsxwqvurwvz~sxwrwxtyztyzuyztyz}v|{|}v|{y|v}w~pwzu|x}rqsyxztsukjl~}~yx|tsw|{~~}}}}{{{zzzwwwxzzz~w{||~y{{}z||tx}~{}utvyxzxz{xz{vuwwvx~}~}{z~|{xw{xw{|z~{z~{z~zy}zx|{z~}xv|~yu{yuz~|~|y{zxx|zzywwzyy{|||ozxq~|q~|p~|hyvkpqvxyvw{yyut}qqwstxijnlmqqrvmnrjmqknroptonrplqztw}ytvtqsrqstsugfhrprlikpkmunqrtrjmjy}{fkhahewuuytuytuzuv~yzzuvtnsrlqplrnlqposutvqprroqsnptoqxstvtt|wxkefyqrxrskkklrpgmllposqqinmlqpjllooouuuzuvwrskkkkpodlkgmliggpnnssrprrnsrhqnholipmnrpmpnprrjllprrrtttvvtvvvvvqqqmmmooorrrtopsnouopxpqxqrqssotsrssrppztuytutvv}nppvxxwyyztu~~}}}xzzy{{suuxzzz||vz{sxypzzmyyiyxnst|y}~x|~uyzvzzxz{~y{~w{|tz{w|}vs}}r~~|~rtuprsxz{tvwz|}xz{tvwwyzxz{}|z~}uwxz|}{}~vuwzy{|x|~~{}}xzzxzz{}}~|~y{|~~zy}}rxwy{vxy}}yww~~~||}}wuuyvx~{z|prszzxxwy{}}prplrtuyzlqp~~~zwy{xzurturturttsuvxytvwnpqqstz|}yyyrrrhgivuyxw{sotlmqkglzsx{tyvpv~x}snpkfgqqqmmmmkkupqrmnxnp|ru}vyxsuusutsuxyyfffz||tyxlqpvppwrswrsnnnssspmovsuvqsrjnzqtohkqmrqmrqmrqmrqmruotwqvvpuwqvvpuonpnpqstvhjkqstoptpjynhwnjuniuspysprrnpsprtqsolnminplqokqplrsotrlrshkvmpslormozuwpqujkoklpjkojkoonrjimghlfgkZ]a`defdcgedljigedYWVfacd_agbdgbdgbdg_bb[^kdkjble^jfcm_^`TSUc`bWRTPILKIOMJSKHQFBMIEQLEOMHNSLSVPWSLSROTRSWLMQONRYX\XTYTVWUWXVYYUWXUWXZY]YX\^]aYX\fei]\_d^_hdfkehfafhagjefa__bac_`dGHL\addiladhcgkfgklkofdh`_ca`dlkojim`enjgpjblndjkdipmobaca`bkjledffegifhifhjhhjhgjiefhh_ae\Z`c^hd[hfei`bb]ba]cb`hgckjfhifhibac^[]kfhedfhgi]_`_cdkopdfgihjgdfa^`facngjsprgklfkldijdfgojluknv{ymprlnsnpdhiejkzorqdhlik{wyjiknpqeijeijlkmonputvnmoihjwtvmjltqssprtqsxuwvqrsqqgfhuvz}}~~tu{rrx|}~~}wyzvz{wqrsnowuusssrrrpmosprhfhxvxurtuqsvotvotwpuwpuwputnpkiitttnppvxxsuvnpqtvwoqrnqrnpqpswklphegyz|tuvuyonpopnfgexzztxxtyxx}|~nsrqturvwuxyuyzy|}}u}yw}x|{qx{nuxu|z~||~~xw{{z~}|~}}}|||{{{zzzz||ptunrsw{|y}~x|}zuw|wy~y{}xz|wyz|~|y{~{}~z|}{}~{z|xwyxwy}|~|{{z~xw{xw{~}yx|{z~zy}yx||{z}ymhnuqwxtzyw}vvz{z|xyzlmmtttxzzoqquwwxzzovuhsqfsqiwulzxglmvxywx|ww}wvssyvw{yz~|}uvzstxmnrmmqonrqmrrlqx{~vqsuqstqsutvedfsrt}z|xsuslonsrfkjoutflkntsywwsno|}xstzuvrmnrmormopmomlnonprqulkoqmrnhmysxqlnussytupjkrjksmnjiinqqmrpprrgcddjhrttikkxvvb``}xyytunnnjonfnmjpomjlolnmlnoqrosthqnholipmnqoorpprrmoonppsuusuuprryyyuuupppppppppqooqlmtpqwqrzrsqssotsssstqr{uvztutvvz||prrprrtvvvqr|wxxwwvvvvxxwyyz||moouwwwyyvz{sxypzzmyyiyxptu~y}~x{|w{|w{||~~y{~||~{txyy~ws}}t~~}{}~{}~y{|suvy}~vz{vz{z~z|}rtuz|}|~|uz{~}z|}wx|}~z}vz{~~~wvzzy}utxzyzqzzs{{zx|}mrsxvv{yy{yy|zz{yy{yywuu|~|~}|~prs{|yzwy{}{npxtzz{rwxx}|{{{|y{{xzzwyroq}wvxtvxvxysuvnpqoqrrrrqqqvuwxw{utxvrw~sotztxxqvvpu|toqnij{|qqqsssyww|wxrmnynq{pstmpsnptsumppcccqqqmmmlnnqrrvpqtnosno|zzpnnuqsytvwpsunqqhksilokpqmrqmrqmrqmrsotuqvtpuuqvtpumopnrsostimnkpqhkolixkhwkjtkjthgproqpmotqsqnppnonkmolnnkmsprqlnshkwnqzsvojl{vxpquhimklplmqjkomlp`^bghlmnr[^b^bcfddtrrommljjZXXgafpjojdigafhbghcdlghc[cZU^[TaZT_VUWRQS[XZ[VXVORHFLLIRFCLGCNLHTMEONGNOHOSLSSLSNGNb]bSPUSRV]]aPQTSTVUWXTVWUWXUWXUTXSSWXW[\[_\[_^]_ccacdd]Z_``d^\aide][[ZY[Z[_VW[`fiahk`fhdgkz{_`dcbfjimbaenmq`_cQV_ifoogqrhnkdijgia`bzy{jjlnmoihjifhifhjhhjhgjieflkllpXX^e_jkdqfeiacc\a`bhgemlfnmhjkikledfjgipkmmlnYXZVXYdhieijdfhkjllikfcenikrknolnhlmejkejlkmnlikqil}wmpwsuroqkqr`efmcfpehmlnutvmppmrsgklfklkjlonpqprZXZpoqroqnkmspr~{}khjroqxvvtttiiklkqssymnrz|}{}~{}~rtukopystxstzxxnnneeeqmotprurtzwyxuwroqtnssmruotvpuwqvsnotrrsssrttvxxprsrtusuvvxyprsz|}optyx||vxrlm~surqullnpqovwuqsssxwqvuqvu|ptt~rrttsuwxy|{}~~z~z}zxqx{pwzsz}y~{x~}z{z~~}~yx|yx|yxzvvvrrrxxx}}}y{{z~quvtxyrvwtxy~}xz|wy}{}|y{}|~|~|~y{|zy{|{}{z|}|~}||{{z~{z~~}zy}yx|{z~wvzzy}wvz{w}}z||ww}y|x{|vz{z~~qvuptt|tvvtvv}pxwmutq{ygtrjxvnrsuwxrsw{{kjsww}stxnoslmqpqupqulkoplqojozsxrkpypsulounqvqssqsyuwa`brqs|y{facpilfpnahgltsenlenlqoomhi~yzupq|}wrsrmosnpqnpmlnnmorovomsrntngnvovpkmnllqlmjdeqijvopuqrqrrqwvwww|}qrrnpp}}}}{{vqrsnoqlmnnnjonfnmgmlrpqpmohghgijlpqktqlsplspmpnpsqqssprruwwy{{ikkjllooorrrpppqqqrrrrrrusstoptnovpqqssqssusswrs{|lfgtvvwyyvxxwvuyxxxzzx||x}|xzzprrrttz||y{{{}}uyztyzq{{nzzm}|xyz}|~yy{xwyzz|{~}z|~wvxswxuyzvz{x}~v~~s~~z|}|~|~wyz{}~{}~~x|}txyy}~}y{|}vxyz|~wyzwyz~uz{{}}|~~|~~y{{~wx|~|vz{}~}zxq|zyuxv{|xyz}|~}}~||zxx~y{|uxnik|{}y{|~xy~vwvxwy~qsxtzxz~uz{sxwwwwzwy{xzyvx~{}yvxqprtvwuwxrtulnooqrttt}}}yxzxw{tswqmrw|_fi{w|zsx{tytnsy~rmokfgvqrqqqoooxvvtopupq|ru{sv|uxzuwwuwyxzrrrqqqnnnonnqootlmztuqklupqwuuxsuwsuvor}tw~svvmpplrplqqmrplqrnsrnssottputpurnsostfklkpqinootv_cfc`olixnlvnlvnmvroqroqwtvpmoqnpsprroqpmospsvsusnptilvmptmptoqtoqoptjjnlmqlmqklpnmqposklphimfimdhjcaaussfeddbbhffe^engnkdkkdkg`gdbekilkgmnirgal]XbXWYTRT[XZZUW[TWOMSDAJJGPEALIEQNGQOHOPIPQJQUNUWPW_W\XQVTSWZZ^PTXPTURVWRVWSWXSWXVUYXTY[W\`\a\X]ZY[Y][]ba[]a]`e\\ee`aa__^]_`aedeiY`c_fibgjafijnrgimdcgedhlkogfjgfjafomjsogqsionglfcebaclkmihjhgibacifhifhjhhjhgjiefkjfjn[Z`d`khdpggkeggjoniongondlkfhiiklgfhifhnikhgihgi`bcfjkdhieghhginkmifhmhjohkomlfkjcihflkkmmlkmnjl}twrloqoqrnphppjqqsjmsilkilsuvmnpimnhmnktskjlpoqsrtXWYvuwroqroqolnnkmolnspruuutttoqrvy}x{vy~wzhlqwz~suvptu{uvytuusssssuuupoqrrtqprpoqrqsutvrnssotspttputpvupqxvvyyyvxxvxxpuvquvrvwquvmqrswxoquttxwqttlm~sumlpkjl|||wxv}~|rttmrqrwvrwvv{ztvv|~{xz~{}}uvw}zz|{}~{v|u|v}ry||zxv|xv{~}|{~}}|~xw{zzz{}}y}~txy}vz{y}~{}~}~}y{~y{suvy{|y{|y{|~|{}zy{{z|~|||{|z~|z~~}zy}zy}zy}yx||z~tswxyz|u|yqx~nsvnrtqvwy~t{zu{zzots|~~zzzsxwpyxu~}ivtkxvostsuvqrvww}yxrrxrswwx|stxnosstxqmrtnrslp{qwukqynqulovorwos{uwwtvlkmutvyvxojlrkndqpgrrdnnhppu}}xstxsttop}~snosnosnopnnnnmqqpsqwvtysotngnslsniknllsnoztutlmzrstnpqqqnoodccztunqqqqqjhhb\]upqrmnojkkkkdihdllionokprntyx|stxnqumvsnurpwtnqoqtrvxxvxxxzzvxxlnngiipppqqqpppppppppqppmnnussupqtnosssqssussxrsxzrklvxxtvvxzzwyyvxx}}}tuuorrz~{vzywyymoogiiqss{}}uyztyzq{{nzzm}|}z|vsu}z|{xz~z|}~srt{}txzt||y{|{}~~{}~~z|}{}~z~vxyy{||~vxyvxytvv{v{|xzz}{}}wyz}|~yx|yx|~}|{~}~u}|q|zz||~}z|~~~~~~}}yww|zz{vx}vyupry{||vw}uvuwuw~qsyu{xy}sxyuzyyyyzvxzxzxuwzxzyvxrrttvwtvwrtumopprsvvvvvvonpyx|vrwz}nuxkpsmnrrnsx}{tyxrw~x}nik{vwqqqmmmusstopvqrwqstprwrt{vxxrtwrurqqsss{yy|wxojkxln|tuuopsnoupqvorx{tkn}ruvz~svrnsplqqmrplqrnsqptrqurrvrqurrvpttdijmrsfjkpuvafipq~llzklvklvkmuroqroqvtvpnpsprrqpljjpnntrrussrmnvjnwnqqjmtoqzuwpqulmqnoslmqklpnmqonrijncdhhkoJMQhegolnrnqmjla^`g`gpipqjqngnrkr`]eWW^ROW\X]^W_ZV\VUWVUW^[][VX\UXWU[A>GC@IEALB>JNHQNKPPLRSOUQMSTMTaTZWOTURWWX\RWZRUVTXYTXXRVWTXY[[^\X]WTY]Y^ZV[]\^V]X]daZ_b]af[]gb]^ecca`bcdhfhl[be_hkcjmlqtgjnhkogfjjimqptfeibaeV[dfclnfprhnnglhegihjjikkjllkmlkmifhifhjhhjhgjiedjicfj[_de`lhdpcdhdffsxwagfckjdlkiklfhijikifhjegpoqqpreghdhigkldfgfegkhjjgikfhkdgljjinmekj_edlnnceflhjunqrnpklmnmomvvgooulotkngijcefjnojopkpqiqqkjlmlnonpedfutvurttqskhjnkmsprqnpmmmmmmfjk|ruzpsxwz~ijnmop}y{|~suvhlmwqrtopsqqpppppptrttrtpprlkmzy{onptpvtputpvtputptupqxvvyyysuuqssqtvquvptuquvortrvwxw{zv{zsvumnsuonrsrtxxxwxvz{yxzzx}|w|{tyxtyxwyyzuw}}}xz{}|ptuvz|vz|y~~y~t{~yovykruv{~}z~{~{}|}|~xw{~xxxxxx|||vxxnrsrvwvz{~vz{}xz|~~y{|~}~{}z}{}qst|~zz|zz|yxz|{}|z~|{|||{|{|{zy}zy}yx|~|onrxqx}w~{yryzsztw|qx{qyypxxv~u}|u}|s|{v{z{}}zzzrxwrxwpxwnxvkxvtxxuwxrswvu~ppvqrvtuy|}jkoz{vpuwptslq{outz~sv{psxorxqtsnpwtvkjldcenkmrmo{twiyxtdpodon`hhomm}xytopsnoytuvqrsnosnorppnnnqqqqnwyvpktphsrjutoqsqqwrsxrsumn~vwqlmsrrkmm}{{pjkoootttjhhxstpjkrmnojkkkkchgdlkhnnqmrplqmlpklpmptmvsnurszwmpnmpntvvvxxuwwsuuqsssuupppooopppppppppmppgggywwytuvqrsssssswrswqrtvzrsy{{oqq|~~wyysuuvxxtwwz~ys{zsxwy{{giiy{{vxxuyztyzq{{nzzm}|{}tnp~y{{}}~|~~}|qvwx~|~uwxwyz}vz{xz{uwx}~wyz|{}vxxwyyxzz~|}vy}~~xz{qprxwv~}xz~~~~~~sqq~||~~~~}{{{yy}z|pkm|uxzuwvxy{uvyqruwuwsuxtzvw{nstqvuuuuyvxzvxxtvxvxyvxutvsuvsuvqstmoprtvuuuwwwutv|{}|xty|zbcgvrwzztyztyytv}xyzuvsssrrrussupqxstomojkltpr{svyprzorqttrrr|vxxrs{tuxmopij}uvxrsxstwpsx{rilwlo}osynqqmrplqqmrplqrnsrptrrvtrvrquttxotv^ffmvv^gf]fe`fimm{kkyklvklvkmusprrnpvrtrnpwtvrppljjpnnzxxqookfgwlovnprjnvqs{vxoptnosnosmnrlmqihlmlplmqghllos]`dhegnklhfgfce^[\bZdf^hjblg_iiakXUcZZefendch_Z[XUVXWYXXZTQSWRT`Y\ZX]LIPKHPFBM<8DMKRMLROMSNMSLJPSMT]PVZQWURWTVYSY\SXZV[\TYZQVWSXYZUZ_Y^]X]hdh^Z_^_`R]XXb_W_b\bjY^gb]^gee`_aoptjkoZbd_gjagjahkceibcgjhlfdhfdiomrhfjbgoeclhbjmdjjchgdehfhjhjpoqnlnmlnhfhhfhihhiigiiecjhaeh]`ebblgdoijn`cckonbhg]ecY`_jjliikihjgcef`c^^`bacgijeijeijijkmlnjgijgilgilfijhhaed^cbnts]abqnpzuwrnpiklonpiqrkrrsknsknfhihjkhlmhlmipqjqrjkliikhgijikljmsorkhjb_aliksprroqtttruutxyzotxptyx|sw|uz~{}~|~{y{vtvkmnjmnxrrpklywwrqrpppvuwttuonpkklyz{rsuuswrottqvtqvrptroosrrsttrttorrotumrslqrqvwpuvrwxzy}~zx{xpqsuppsxxzvvvxywvvttvvtxwtzxx|{xzzlgiz||wy~y{~y{uxyquvv{|{|v}|w~|x}|y~~||~{~}{z~yx|{{zy{yyy}}}{{{y{{pturvwvzz}|}|~|~~z|{~~}~{~~{}~tvwxyz}~xxzzz|{z|}}{z~|{}||{{z~}|zz~yx|{z~ljo~w}z{ry|z}u{~syzt||t}|pyxxv~}w|{fhhtttoutsyxryxpzxnxvy}~wyzuvzllrpoxwv~uvztuyqrvnosww|zsxxqvvmszouu{|qsynqyps|suxrtxtunmnedfnkmokm{uwl|~wborltxrx|vuv{wxtoqtqq~z{uqrrnornovtsooppopjgpa^hsoxtlvtlvwsutrrsopwrsxqr{tupllwvvnnnuttwrsqqqsqqkiiupqxrstoprmnnnnptslsrmqrrntqmrqoumnslotltrlrpt{xorpprqqttswvqttuxxopptuunppnooqpppnoomnlnnbaa}||wttvrrssssssvsswqr}st~vwy{{lnnoqqtvvvwwtyxmrqqxwpyxlvtv{z}jllqssuvvy{{uyztyzr{{nyyn||z|rnp~z||~~~yy{{~|swxz}suviklz|}qst{}~~z~y}~z~|suv{~{}~|~y}y~xzz|~z}~}~|}y}~{}~||{~xvy~~|vq}{wu}}|~~z|~~~||~||}{{xvvxuusqq}~rmo{tw{vxzy{uuw}wxz{z{wxwy|zwy~puvrwvvvvxuwyvxwtvwtvyvxxvxssutuvqrsnpqtvwvvvuvvtsuvvyvuyzw|{}tqu|{txxqwwqtxrt{vwvqrmmmtttpnnupqytu|nqrnkmxrt}nrzortuupooytuztuskltkmvkm{stystxtu|vx{ruwmpwlorehqgjninqlqqmrqlqsnsrqurrusrvrquvuypuvZaapxxrzzpwwouylm{kmzjlvikuhkttprqnqtqsqoq}z|pnoponrpplkkpnowrtvlovmprknqkmrlnllpmmqjkonnrlmqonrpnqiimccffhlceimhnlhnieke`ea\bd\fd\fiakaYcf^hYYf\]j^]f[Z]ZWWZYX\[]ZY[WTUWRUaZ^@CDRTVNMPKGK?;>GHLHLOJLPILPIKOKMQLOTPRXSW\W[`RUZ^Z[]\[]^_STXSUZ`W]b[`YY]MTWP_aPbdP`cO`cU`dV`dW`egacnik_\_egh`de\ad[`cceieeigeimeln_msespbohZhpao_hl`fi`cgb`dljoe`fnglnciwkqpinhgldhicfgdggdhfdid[hhYgiZeh^elaemcdhbachgiggi||~iegokmjbee\`f[^UZ[]`alpqcghdhjjiknkmkhjmjlkhjljlporsoqhbdtrtjlmnknc`btqsroqnlnnllommlkknkkmjjhggnpqprsjjpklrlmtrxvdjibffnqqoonmnnoooZ[Zmmmnnnpoozwyrprhfi~txyz~xvy~z|ywzx{|}{}~}uyzw~~rwx~{}~lnoonptorxrw}w{rkqplo~yzwwupsrkuqfuqhvrtxxmqqw{{jmnlopepnfqohonnppuuukpqmuumuuqyykttqvwutxvtxz}xpq}rtkrqv{ztwwvstvqrqoppprjikxxz{z|ywz|xz{vxytvxsuxsuzxzzy{zz{rtukopstuu}~}||w|w~y~y|~~{|~|~{z|}|{}~|~|uyzw|}{uz{{y~z|~{}zy{||~{{|vqvmxzm{}yz~{x|}mrsu||r||t~~~}|~}z||~|}{z|uzzuxy|wyvyuxzsv|rmo{}zy|ttvptuvz|rwxsxysyxsyxw|{}}}{|xwwtttuxxsvvwuwzwyutxtrxnmvrt|mpvyz~a`b^]_qnonquqqusquwsxzvzyouxntsioi_fpeltnsoptnoshhloosttxnqzz}pr{rs}rs|opu||llpxx|sswqrtopppprsswuvzopulhnpjqogntjrvksqnppoqqprqoqrpropqgpnmwuhrpbkjlvtrrr```caapklrmnpjksmnoijuopwrsrnnrlpplmllonlnqrusosojkzws|yxxsujvrhyrlytt}wdjfkroerpjonsno|oqnpvnoojkfbcpooqrrotsorrpqqpqqssssuuu{zy~}}}}{{zvwsxwovukxvexuaxtq{zw}||~~||||yy}||sxwv{zw}|w|{zz|wxyz{|uuwxxzxyzuxyx}~x|xmzxu}msr|~{}~}~|{z~y}~x|}w{|z~|r~~yut||}zy~~y~oty{~{~~~{{{~~~z}}y~|v|z~~y{{}}~{}z|}~{}uuutttzzzvvvwutsqpyvvzwytrutruzxzvtwzxz{xz|{|tyxv~}{y{{wsuytvysuytv{uwxsuxtvvrtzwytruwvx{xxtqqurt|w}}x}ysx{{nvu}yxuyxusqrsqq{zzuttvttnmozy{xtwqlnvqt|wyrprsoqwpsumpzruvrrxst|wxxstvqruwvzzzsttsttqrrvrt{vxvqstnpsnppjmnfiujmrv}lpnsxtyzv{|x}uqvxsytqvmintqvwtyurvqpvmnymnynnznn{nn}mlqhgm}xsuxstpknmgknlqw}ptxqmrmflqgmvjqviorkpunswpug`fzsxokme`ah`bmacscfugjlegkhjlikhadj]ah\dfYabV^bU]eX`^a^Z`\TTSUYXSZZV_]XZ[VXYWV[[W^^W_BFGLNOPOQ>;=FCEFGKHJNILPHKOHLPLNRNQVORWLOTVY^SVZ\WX^\\XXZTVZUVZZTY^W\]\`QY\UceSefM^aO^aPZ^Q\`V_ca_aigi_bcafgdjk[_bdfja`dhdilfknfm}rg^krgt|rsgu`il]dgdiledhjimiejpinocipdjb[`cbfdhigklchgchfcidZgfZfh[dg\bg]ckbcgdcehgijikgfhkjlhcelgig^aqhkzorbfg^bbeijfjkgkllkmolnmjljgipmoihjdcehceqjmnkmkmnnkm^[]zwylikmjlnllommmkkljjpnnooojlmhjkffl__egfoflkbgfglkmmmjjjiiikkk```mmmnnnoooxuwsprutvnpqz~x||~|~xuw~zwyxz{y}nst}xwykkmuot}w|oinpjopjolkjmompuskurhvrgvrgkllpqx|}hlmlpqfsqnvupvuxzzpppglmhpprzzmuugppjoprqurpt{~tlmtvlrqx}|wyyxturnovsuutvmlnwvxxwywvx{vx{vx{vxzuwvqs|y{|y{zy{tvwostq|~uuv||z~}xz~y|w~{}}z|~|~~z|tsuwyzy{|x}~qvw{|x}~|~~}|~~}srvkglqmrxrwxtymy{jy{xy}w}~}x||otuuz{pxxmwwyxz|~xuw}~{}zy{rwxtxy|vxwztx|ux~}xzyxzwvxruvvxyy}~uyzrwxpxxx~}ntsx~|uwwlnn{vwzxxwwwvxxtvv{xz|~{z~usytr|oqy}|wvzdacfccvqrnrvprvrrvtpuxtyypvvlrxntu{|rxslqoptnnrhimhimoptnoyxyoq{qr}qr}tuybdexz{qstvxyprrnpoijnhhlkjqjfkohmrlpuosrhnpnppoqrprrqsmlnqsthsqbmk_kiiusitrkkkhhhsqqkfgjefnhismnnhirlmvprvpqrmopkmolnllnnpquqvnmlqqmrpotrtgtrixtlwtr{xdhgjqnhsqlqptopwkmzkntmn{uvvprrttntrnsrprrprrssstttqwv{}}xxx{yy~yzqwvipofrpfxubxtltsu{yxzzxxx}xy~||uzyw|{tyxtyxsxwy{|xzzz|}xz{{}~~}zx|}{}s~u~msr~}}~|zw{|vz{vz{w{|z~ztvwuy~wz~y{~}|~{v|x~{~~xxxwwwzy~w}|{}~~~zzz~yz~z|z||~|~}sssyyyzzz~~~vts}{z}}}z||x}~wvxxvxxwyxvxyyyz~xw}|wyyzuw|wyzuw~y{}xz{vxytvxtvwtvonplkm{yy{yylikwsx|x}ysxzv{~|zx|utpzxvsqqsqqzxxvttvttpoqzy{zwyqlnuprvqsvsuwrt|uxxnrunqupqvqrtopupqvrrnppsuuprrprrqssurttoqwrtxsusnppgjujmzlp|nrptxtylhmjfknjonjoqmrqmrtptsotsotqptpoxpoypnzpm|ro~lisjhn|x}vrsxsu|ntqflulroinwvzxx|qmrpjovlrxlrxjpslqslqjche^cztyztvrnowoprgivikwjlmgjlikifhg`ck]am`focirflsflk_e]a\bhc[\ZZ^\V^]Va_XZ\VXXVTZZV\_WaCGHFHIFEG?<>DACDFJFJNILPGJNILPLPTLOTKNSHKPRUZRUZWRSYWWSRTWX\VW[YW[[V[WX\MSVT^aO]_R_bNZ^LW[OZ^W`d[_``de^eeYaa]hgUW[rot_Z_haff_drjqd\i_Yfjboc]jjbo[dgX_bdilmlpkjna]blejqekvjp`Y^a`dfjkhlmchgchfcid\ge]ff`ficglknsffjddfonppoq`_ahfhkfhmhjmdgofipehbfg^bceijgklfjkjikkhjmjlmjlpmonmoffhrmowpsmjlhjlkhjqnpnkmljlmjlpnnqoonllqoopnnjjjfhidfguu{kkqrqzlqpkpomooppplllfffgggcccmmmnnnpooqnppmnnppvz{~{}|~tqs}|~z|}vxxx|}rvw~rtuhgivrtvpuvpuxrwxrwtnspoonrpntrlurivrjurkopmqrquvostgklgrpckjy~}yyyussjnohmnmrsjopmrsotusrvnmqohk|tuuwntsw}|~~~pjlztuxuwvuwrqsyxzxwyzy{{vx{vx|vx~y{rmo~y{|y{|y{xyztvwowzttr}vx|}z}yzw|||{w}}z|yvx|~}z||y{yxzrrtxz{z|}z~qvwotupuvlqrv{|z~y{}z|yxzwyzxw{yx|}xtxxrx{wn}{||vz|txyuz{pxxkssvuwzwy~tyztxyzvxwzuy{}}xzwtvxwyrqs}~xz{ptutyzrzzrzzoxwy~tyxw|{vxx~||vvvvxxtvvxvvzwyvuyutxxx~qry~}vrwjegrlm{vuprvrrvtrvrnsrnsxqvslqwpuyrwxrwrlqoptnptmnrjkooptsr{qoxpoxtrzrrzuvz}bdesuvvxynpqoqqlnneggnotmnrkjomintnsyrwpinplnpnprqssrtkjlprsgonbjickjqyxltsfffmmmommjefidepjksmnoijqkltnovpqslopkmolnkjlmknokpqnnsrndbazwyfqojyujvrowtbhenrpkqpmoourrtjluikqlmzuvussxxxmmmnrrnsrprrprrssstttyww|zz|}vwwlooisqhxudxvtzyzzzzxxz{~||{y~}uzytyxtzxxz{z||{}~z|~~~}}}y~w~nywo|zu~}rtumopy{||~|~z~z~x||vz{y}~w{|x|}wwtt{{||}vz~uz}}}pv{tw|vy~|||y~syxrxw~|}}}vvvtuywx||{}z|z||~}xxx|||{yx}}xuwvrwonpzy{zxzwvxutvwww|mutjpotvv~y{~z|}xz~y{{vx|vxzvxvsutsuwvxsrrvtttqszv{xty{uzyuzvzuzwutvtsvttvttvttxvvvttlkm|{}}ojlytv~xuw{vx|uxypstlpqlmrmnsnoxstytuvxxwyyacclnnmoorprqlnxtvtoquprtoqwnqwlovgl{mq|mqxtylhlminplpnjoplqtpurnsqmrrnrpnrlktlktljvkiujgvqnvlkpvrxvoutpqxjp}ntzmsphm{uzposlhmlfk{qwzntzlrxntyourgmukqkagslotnof^_thjrgiqgilhjgfhgfhjdfncfg]dlbhoekj`gg]cW[V`d_XYWbecW^]Q\ZY[\UWXVTZZV\`XbGKLLNOHGIJGIFCECDHFIMILPFJNILPMPTSRXPOULLRONTSRXZUVYWWYXZXY]VW[QSWRSWXZ^RXZ]cfW_bWbf\gk`koZeiT\`S[_U]`W`cV_bYbf^\`pjoc\ag`eodjldkmjvfdpifrhfrheqYbeZadejmhgkfeieafnglqekvjpg`ejimcgh^bcchgchfcid`gfchifjjacg]\c`^akhjfceheg]Z\ebdlgilginehlcftileijbfghlmdhidhilkmlikolnvsudacfegjik|wywpsurthjkjgipmoolnlikroqljjmkkkiipnnnllhhhdfglnouu{hhnihqfkjsuukmmrppljjhfffddebbommpnnqnouqvuqvvw|x{vsuytvnkmwyzeghprstvwrwxostnqumnrsrv|{w|zvpu|v{pjorlqoqqntqnurlurlurmurlpqnrstxylpqgklmtsjpoussztunqrnstlqrinolqrnrsqptwvz}vyskl~suuzylnnooopklvpqwtvxwyyxzxwyvuwxwy|wy{vx}xz{}ojl~y{~y{|y{|{}vxymsvutr~pvyyy}xtz~|~zxuw~{}|y{tsu}|~}quvw|}x}~tyzrwxz|}|{}vxzyx|{z~yuz{w|wsxeqsdsuzzy}xzzw{|uyzv{|x{z||~}vsuyvxwvxw|}uyzzuwwzvz}xz}z|{{}npqtxyy}~x~u{|v~~q||u}|xpvuz~nsrwrstrrsssvxxtvvsqqxvvutumlpssypqvqlrvsurklytsxxpswrswtswsotsottmrunsslqvottmrvpuoptpptklplmqlmqrnwnir~zvqztpznnpvxx{}|vxxtvvtvvqtrrurprsmopjkoomoolnroqzvwslollnmopqstprsjlmmopcihlrqgmlntrlrqtttjjjpnnvqrwrsvpqqklsmnsmnrllsmnsloqjmrlnmjlihjkkopppoplrsqsrtepokxvlssjpodffsttwwwrqqqooyuv~xyuttsqqnnnooorrrmrqnsrqssqssssssss}||ussxvv{yy{yypqqsxwjwuiyvqtt~~ywwwuuywwtuuz~w|{tyxv{zuzyxz{{}~{}~|~~|~~~|~}~x{vu~{}vxyvxywyzz|}|~~|~z~y~y}~x|}vz{uyzx|}s}}wn~}t}x|jmuw~z{zt}tzw}y|x{~~~~~~~|tzyqwv}|||xxx}}}|}z{|}rsw~}{}z|{}{}~~~|||zzzsqp~|zz|y{~}|~{z||{}vuwutvyyyx||{|wyyupr{vxvqsvqszuw{vx~y{}xzvsuvuwwvxytuz{{vx~x}ysxvputpu}}vttxvuzxxywwussxvvwuuonpxwyyvxsnpwrtz|c`bvqsyruxorrkntoptpppklwrsupqkmmjlleggoqqnpppmotoq|wyzuwsnpysvrjm~svwlo~tvzmq}y~lhmqmrrnsqmrqmrsotqmrtpurnsokpolrokunjuokwpkwplwmjsrntuotsmrvlqvmsztzbafvx|losb^cqkp}syymsxjpsioukqtkq}sypfljadiabh`aslmpijmghhfh`de^`ac_ai`ce^ae^af_ag`ce^aZ^Y[`[YVV_a_X^]V^]Y[\UWXTRXZV\aYc:>?79:;:@A>=?ECEFCEFGKGJNHKOGJNKMQGJN\Z`RPVNLRPMSVSYYVVVTU[Z[^_c]^bM[]JY[QY\^]ahafkbg_ag\`eW^cOZ^XcgZciZ`hVZ`bdl]\diejc`dechcdicgjdgld\hleqiamb[gi`l[ehail^dgiimhimfbgh`fmahmahg`egfkbefdghchgdhfdhesplpkjjedlefndgjcficf{twibeiaelfhjdfojl}uwlcfuknbfghlmeijfjjeiicbdhfhhdffcelikjhj\[]qlnjdglhjehhmjlljlkikjhjlikdbadbbmkknllpnmmlljjkhiklmr__emmvxxxkiiroolghojjqkkoijqklxrrjcfvoyz{z~}~y{{x{suvv{|w|}{}|z}}{yrzoiqvnvupuxsxqkpxrxupuiusgvrlusotrtrrtrrmqrlpqkoplopmqrqrrsrrvpq{qs}rssprnpqrturtusuvvxyutxzx|{}yrs}stuvuvttwrs}vw}stsoqzxzutvlkmvtvxwyyuw|wywrt{}}xzx{x{~x{}xz}z|{zx}sy|l{}m|~r}~~{~~|~}{}}}{}|y{~|~{z|yxz}vz{zotvpuwrvxrvx|~y||~wvxyz|z{|}|tswxsxvqv{uzxtynx{l{}z|y~}|~{z||{}uxyuzzwvwxuvjgi{xz|~xwysxyx{||xz~vyx{|z|{|}vxylpqv{|zv~~wr{{vr}}r}ut~|ipolrq{wxywwuvvtwwuxwxxvwxtuvuuvvqtuotukuthrnkrnhoiw~xruxyz}srusptqmqtpttptsottptsotrptpqupqunosjkoxy}|}syyotxouxptzzxvxspsnqtovytqtoormnrmtwurusqssotsnppkmmkkkrppnrsjoppuvrwxtyzuyzkiikiisoprooollnnnppponnokkrnosnorlmtnoyst}wxlefvkntimsknsmpqlnbeguxww}xrxutxyry|v|ruyyy|rns~vzoqynpsqqkrqerpw~~jpomppqrrsqqlqpnsrrttsuutttusstv|uv{vwwuuuuuru}su|wx{zzvzyyst~tv}wxyuvnnnsttvzytzxtyxsxwx}|{~vyzz|}{}~rtuy~z}y{|wtv}z|tzzoyxr~}}~xz{|{}}|~y{|{{y}~y}~x|}uyzquvnyyyt~zy{~}|zzv{xz}}}~~~~~z||{szxv|{w~||yyy{zz{}{|wx|xy}{z}}}~x{}}|||rrr}}}xvvtrrzxxyvx{w|vuwttvtsuvvxzy{yxxuyypwvpvuz~}ytwvrty{snp}xz|wyrln{wxvtwvuxwvywxvx~tw~syu{xrwhim||~urtxuvywwtqqywwvsstturqrplosmptnpysvmikuoryru|svumpwstnjkyuuvrsqmmmoopqqlnnlmmorqpmowrt}xzxsurnprknxlp|rvtnpurtyxzqnsolqrmsrntlglhchgch|x}totvqvrnsrlqrlqrkrqksrjsplxokwpjutlurjspmrkkptw{ovzjsviruuqvqkptjpvjpvhnykqxjptglqci{msxhkvhkskmmmmaggdkk_de^hgX``^bceceabb_aa_``abb_``TTP][Wb]\`]]\]]VZZZ\]\]^SRX]Y__WaAEF8<=>@AEHIA@BIHJCLLAMMOJLPLNKPPORTOPSNJPVOVXOZUUXTTXPRVOPTQRV\^bVX[XZ^^`dbbf`^bfafdaeSPUTTXaae]cfZ^b]beafiZ_b\abY^]`deY]^fknehmbgm_dj_djjov[`fYfh\ik[hjhsv`lnghimijd`bdabkgifceeddihhmghicdphiommlkkeaciehjejjeilikheffcehdfhegjfkkgmlglojpiejhhlghmijngjngmpfimjkohgkkjnkglninlkmmlnkjlnmokjllkmmjlniklfioikjginmoa`bdcemlnnknshioijmkmjmqgmqqlonhjogjvlovlorkormoqlnrnptoqvpsqioww}xx~w~x}x|pstnrs~|yuz|qtwqqtpqsnqrmqrnrrkoonqrovvmssmrsnttsxyqvwmrsinolqrjopnstqvujnmkpoptstwwknomrrostuyzv{|xz{soq|y{vsuzvxtqszwyvtv|xz}mlnuwxprstvwwyzz|}rxyrwxkpqzy~xwyywy~wuw}|~~}~srt{{|zz|{{}z}~{~pssvzyptssvvz|}}~wz{ywypoqrtu|wy~xp}wq}|y|ywyzyz}vwxyxy{~}~{z~||}{{}{z{|z|utvzy}zy~zy~zy}yy}yx|{z~xw{{z~zy}wvzxxzvuw||~vuvvuwv}y~wwyz||xyy}wy{wywwyyyzzvyzy{mzxtyxwwxxzztzypvuovunxvjwunxwnxwoxxnwwnxxpxxsvvlrqiqpjpnwxwtywnqptutusrrqpsqqpppxvvuss{vwwrsrrrprrosthko^bgyqrngitopyuvwsttqpyvupllronxtttqppnnpppqssqsslrpqrronnfffiiimnnrqqlkkkjjkiirqqrqqojkojkzstxpqwmoppppppnppbfehlktssnjk~xrs}uvldexpstoqqoqopqmpqrqpf]_zxxktsputytvxttzvwwuutstvss{rswrsrrrotsnutvusyxwrrptrpywvlmmnsrqvurxwtxwsuuwttyvvtssussusswus{xwwut{yxuts{|yz}zwvvuttzvx}|~|||y{{uzyu{zu{zu||tyzx|}{}~{}~x}~}|~mopxwy|{}{|{|uv{rsytuz{|{vrv|y{}|~mnooqrz~xz{|~wyzz|}x~~~|wyz}~~}~}}|~}}{~}|y{|z|}}}}{}~{~y~v{|qssqssjll|~~{z|~}{z|qpr~{}}~}}}vtt~z{{yxwuuzxx}z|}y~~z|wtvvsuxtv|y{}wxvwwx}|t{zx|{vwwyxxzxx|wxytupinzw|st{qpxztsvsxximswtx|ru|~mmq}}v|{tzskqwqtytszwrzwnxusqlkunntjksil|os{nqpt|mqpt|ruortlop_cdilnsqstqsrprqnpomosnpupr}vqstprvprvnouoplghmkkussnqrlnokhjrknumo{nrxjm|osxnqwnqrjmsnpsnppmqqpsnloqnomjlroptqrrpprmoyuv~vx~vxvmounplejointjpriotioweo{kswmupipnipojpjekpjpmflj`gich_bccceifhiadlbe_[\fbba]^c``^[[kge`[X`[Xd^[`[Y]ZY`^`YVX]Y_b^d[V_EIJ7;@A>@ABCDLNP>LKCOOSPRRMOKPQHLMLNOQOUSNT[V_VU\VV\WW]UU[TTZ[\`^_c[\`_`dbcgbaed^de_deafbae`_cdgkZ]aZ]a_bfdhlbjj]hf]gg[eeclocjobfkcglhlqaej_chYeg^jl_kmaln^ikeghhegdacifhjgijgimkkeccnhismnphhjhhfddb_avrwsotiejhegifhifhjgijgigchgchokpqmrlhmgbgfeidei`dhbeidgkefjihla`dgchpjokdhgadslolfipilqlnpilqhkrgjvknmjllkmnmopoqlkmpmovopoijpmolnrlnttoqrnpqjmwzsjmunquprwrtupruprsnpqipx{nqv~|wzx|y}vxymlnquzquzzmrsrvwrtuprslpplpplppkopmqrptuw{|y}~osthmnotuhlmjnoostkppmqrgwtixviyvl{yhxvlqrostostx|}mqrsuvtqsvsumjl{xz|~urt|y{ifhvsuwtvtsusuvrtu{}~kmnvxyw||z~vz{txyw{|}|~utvyxz|{}{z|qpr~|~}|~{}~y~owv}rzy|~qst{}~xz{{}~}|~{}~zxx~qlxvt~|uu~yz}wx~xy~xy~xy~z~}~}~}rquwvzyxz{z|tsu~|z~|z~|z~zy}zy}yx|yx|~}|{zy}ihjwvxwvxyxzu}|v{yz{y~}wxx}xzzvxvxyz|}{}xwyq~|w}|uuu}}}rttstuputpvulsrgonnvvovvovvgoolssjnptvvsyxrzymsrrrrrwurusuvt~}wutwuuttt}}xvvxstzuvrrrrrroqrrvzpsxumnrlmuoppnn~||xtra]\sonrnmsonsonsnonllpqqmpprtttttkkkooonnnooo{yyuss{yyywwussrpprmnrmnoghqijujlnnnnnnlnnkpoinmsvvkiivpqupqwqrsmnnkmpnpopqnpqlpqrppodfommitrotsupqytvwuuvuuxwwuuuxrsussprrotsoutusrtrqpnmpnmwwwtvvsuurttsuuz{{pnnpnnussussussxvu{yxywv||yxrpp}uyz}{x~}zw~s{{w|}xz{z|~{{}iklxwy|{}ssyppvz|}|~z{yuz|z{}|~txyvxy}w|}~~}|~~|~~|~|}|{z~ytvzty|v{~w~}|y{|z|}}}}~~|y~x~}x~}|y~}~|{}~}~}wx|vwyyyzzzwuu|}}~~|zyzxxxvv~z|{xuw}z||y{~{}|vwwwwz~ymsrz~y{{yyyuss|yy{uzvvznpx}vr}|twz}zpsw{|~z~untzz~x|}~wqvunu|uzvqrwsqyvqwsrzvuxrsrhkqgm~tvzpr|qtxmp|rty|utvooqihjjjlsrtolnvsulikkhjroqxsuxrt~y{xsuxsuupryqrwqrpklzxxqoojnonpqqnplehpfj{mqyjnxjntilnehf]`qlnrlnmjlnmomlnljjussmkksqqvttwrtvqs~wzrlntkntknlfkkejndjoeksgmykrzmuyowsntlkqkgllhmpjpslqxntlekfdf^[]]VYi`cm_c\WXmhi^YZb]^b]^hcaa\[b^\a][`[Y]YY[XZ[XZLHN]Y_XS\@?A<=>:<=@DECGHHNO@NM=KJMJLOJLJNOIKLRTU>>DPOUVR\RVZSW[TW\QTYNQVVW[YZ^]^bZ[__`d^]ac]be_d_[``_c_^b^_c^_cZ[_^_cdeiVaaXec^jjcooXdfW`d`diaejfjo_di]bgZfh]ik\ij]ik]ikcefmjldacjgihegifhpnnecclfgoijphjgeea__`]_eafminjfjfceifhifhkhjlikhdikglokpkgljfkgchhdigfjcdhdhlfimfgklkorquplqrlqpgjvlosjmpgjrhlmeiqgjqhkshkvglolnpoqonphgiedfpnpwqrmhinkmnlpolrpmormoojltnqsjmsmotoqwrtzuwzuwwrtxryz~wyx{||tsuxuwy}w{zxlqrvz{rtueghjopjopjopjoplqrimnfhidfgmoplnoghjiklstunpqoprirqnwuoxwrzxktsnrsptuptutxyptuwyz}z|tqs~wtvxuwxuw|xztqs}tsuoqrsuvvxyprstvwy{|y{|uwxwxyz|}|{}yxzutvtsuzz|y{|z|}}|~z~r}{|s~|{t}|~z|}~y{|xuwxvxrtuuz{yxtp|us||ss}wxwqrwqr~xyyz{w|~}~}|{utxxw{tsuonpzy{|{}zy}zy}{z~zy}zy}yx|{z~wvzvuyutx|{{z|tsuyxzzy{v~zvyzz~syxzvx~|~vyzwz{}z|tsuo|zu{z{{{|||tvvsssppqnqqpvux}|szzqyynvvgppQYYNTUwyyoutt|{qwvgggv{ympnqrpvtswuttrrxxxzxx|zzpklysttrrsrrrrtoptorwtlmsmnwqrljj|zzsonrnmuqptpotpormnsmnrpponntvvsssnnnnnnnnnnnntrr|zztrrtrrpnnljjrmnrmntlmtlmvkmnnnnnnlnnkpoqvutvvfffmkktopwqrvqrqprkmnnpqnpqnpqommrgiommhsqotswst{vwussppprttpqqusssssprrotsoutywvvts~}vtstrqttt{{{wwwuuuooorrrrpppnnussussussxvu|zyywv}{zvtsxu{zqnnswvu|}s{{sxwtyxtyxs{zozxmuuuz{v{|y{|}|z~}bde}|~xwy||ssyxx~xwy~y~}y~zz~}kmny{|~z|}uz{~{|}{|{|z{|}~~y|{xy}z{}~}~}~}}}{}v~}}t|{u}|w~~{z|yxz~}|||{{{wuuz|~}{z{yyxvv~{}|}xuwyvxwtvxuw{pr|vw{{{x}|t|{flk{wyywyywuuzxxxsxxy}qt|hksxtwsu}wz{twx{znp|~|~|~yu{|x~omn{yxxvuywvzuvytvyrwzpv|tvypsyps|svy|qjmtprvsusoqmjlnjltqsxuwpmosprqnptoqzuwxsuvprvqsrmownqqjmpkm~{}~z}mqroqrpmongjqhk{mqyjnvhlujmvyz}rmoojlnkmqprpoqussusstrrommqoomjlqnpgbdpilqhkldgoinoinndjpfluiorbjznvskrnjpgeknjonkmniksloh_bleheeghegrjmujmn`d_Z[jef\WXa\]_Z[gaba[]c]^\VX_YZ`[\]Z\a^`TPVZV\a\e968>=?>@A156EJKFOO?RQ4DCJGIKFHJNOPRSNPQNQVQTYPPYKNWQT\UX`NQYMPYXX][\`^_cXY][\``_cc]bc]bWSXXW[_^b]^b\]aWX\VW[]^bZcc\jhQ]]NZZXdf_im^afY\aadibfjcfk_hk^gj]fi_hk`hkefgpmoliklikgdfkhjljjhffjdepjkrjkdbbfdda^`hdijfkkglifhifhhegfceifhkglnjotpub^ciejlfkjfkjgljjnmnrgjnfgkkjnonrokpoinrilqhkmdgulorhknikmfjskntjmqfijgijikgfhonphgihgipoomkkljlnglnfmlkmroqlgimfingjtoqvqsxsuz|{vxxrtxxzy|{}{xtvqln|}y}y~rzzqvwswxmopsuvgoohppiqqiqqhqpnrsy{|mopwyzprslnogjjmopoqrmopnpqurrwsssopzvwxuvoqrlpqlpqlpqswxqstzxzzwy|y{vsuurtxuwwtvzwyvsutqsnmonpqlnosuvprswyzvxyz|}suvorswzz|{}utvsrtwvxwvxy{|}~y{|z|}quvo|zr}n{yn|zs~uwxxz{}}zwy}|~y{|vpwz~xvxxxxz|~xzwqrvpq|wxrmntrvvuy~}~utxqpr{z|srtmln}||{vuy|{{z~utxttxxw{zy}tsu~{z|utvs{upuuyzt{zrwvvsuwvxnrstxyyxzxwylywu{zvvvxxxvxxwuuonnkllrttotsrwxqvwpuvlqrrwxuyznpptzys{zw}|nnntxvnrpqrpywvwutsqqvvvyww}{{rmn|vwwqrsqqqprpquqqwyqrz{ystommzxxwsrqmluqptpotposonjdetopqpopnnllloooeeemmmjjjlllmkktrrrppqoohffmkkojkqlmtlmphi{prmmmnnnmoojonafeprrqssussqppsnpqpompqlpqnpqnpqnpqtrr{prtrritrotssqqwuuhhhlnnkqpqttrssoqqptsotsotszxwqonrpowutqqqxxxqqqooorsssqqussvttsqqwuuzxw{yxzxx~|{vtszw~wwzvw|xs{{sxwqwvqyxr}{r|zowwv{|kpq|~x|}vz{{}~||~zy{zzzzyy||~zx~{y}}knrz|}z|}y{|sxy}|~~~z}~|}|}{|{yxx~zw||zz{|~|tyzywxr}{t}zy{|}|~}~yz~}~~~~|zz{|}|}{zywwxvv|~~z|y{zxz~{}nkmroq|}qqqsxws{zx~u{zuzyvwwuuuuttuqvwy}kow~poyttvvtvxtv}xz|vxvx~~|vy|~}{y~xty}y~xuwvrtursuuuvsuwrtzsxyqx{txpilslo|txvorunqxpsztvwor~x{worroqroqxuwurtvsuqlnwrtmhjsnpz|jegrilrknqlnpmoqnpkopqstroqtmprilwimximtfjodgofipgjnikplnmjllkmpoqqoosqqxvvkiikiijiksprpkmqlnngjsloqkprlqsiozpvxlrremwlttmtolrdeknkonkmojlwpsofjjcfhegmhji`cdY\rcg`\\hcdmhiVQR`[\c]^]WX_YZ_YZ`ZZ]XX\Y[XUWTPV_[a\X`D>@DACFHI@=?@9>?EMM?ML6MK6GFFEGKFHGIJKNONPQNRWPV\NU\JOXFLUGLULQZINWUX][\`WX\WX\^_c_^bc]bc]b]Y^YX\\Z^]\`[Z^\[_nmq\[_glmZbadllT\\Y`cW[`QQWaaghhn``ffflbil`fj^dh^ehdknmlnifhebdgdfifhgdfommomme_`hbcoghcaadbbhegnjogch`\ac`bjgiifhlikkhjjfkjfkiejeafeafmfkhbge_deeidcgbdhhimjjnjimlhmmgllhjmjlqmoifhrnpilmijknmonkmnjlnlnkjljikrqsmlnnpqhnmfhhkfhkagtfnloojik`]_hcetoqrmowrtsnpplnrmoroqy}v{r}t}~z~v}{t{vyzqtz{{tx}zz~x~gooejkgkllnojlnfppfppeppfpphrrsuvtsupoqnmoonpsrttsurqsqpronppoqxpqyprvopwnprklxxznrsrvwnrsnrsqstwtvvsu}z||~}z|~olntqsyvxzwyvuw}suvkmnwyzy{|wvxutvutvzy{{z|zz|wvx{z|xwyvyztxyy}~z~x|}t{{l}zn|n|m~{t{}~{}~wyz}~{}utvsuvx}~wxxvvvxz~tx}{{}}~||{yyvttutxxw{tsw}|xwy~~}~zy}yx|vuywvzxw{{z~}|yxz{z|zy{yzx|w|}s{zu{zyxzz|}uz{sxyxz{wyzn{yu{z{{{{{{vxxzuvzuv{xxxvvttttwxrvwquvnrsimneijfhhmsrpxwrxwsssnsqnqotus~|{ywv~||xxxxvvwuuupqwqrystytutrtsrvtrx|tu{uvz{trrwuuuqpsontpovrqvrqplkrjjsmnrmnsnoqoonnnpppppppppnnnsqqtrrywwmkkussnllrmnpllvnoumn{prnnnpppnppjoninmlqpkqpppprrrtrrqrrjrrjrrlpqoqrrrtrppwlnommitrotstttmmmwyyz~djipvuntsntsotsotsotsqon{yxjhg}{zzxwrppywwvutwuuxwwwuuxvv|zztrrvttvttvtsxvuwutpnm}{zvvrxywyzzihhpoquwxqwvqyxt}p}{trzzv{|w|}z|}z|~w{|uyzz|}~zy{ww}zzuu{trr~}y~}~yvyv}|vx~uwxtvwrtuv{|x|}}yw{~yz|z|z|wz~ux|wztwwzvx~}|zyxzzuz{x}~zxwuo}{s{|{}xwy~~zxxxvvyyy{{{|zz~}}{zzxxyww~{}|x~yvx}z|zwyyvx|y{~|vwsssw|{owvs{zv~}{uzyvxxvwwxw{zcipwxw|}rxxquvrturqsz|ytwr{||xzzq}y{|~zy}vtztrxrpvsuvtswuqvunuvny{v{nkmgdfurt|~toqrvrv}osquykosprnkmolnpnprprvqs\WYqlntoqzuwhcexntrkouotqmrplqjnolnoxuwibe|sv|nrvgkvhlxmpqhkulomhjojllikmlnnmonllqoowuumkktrrlkmfegokmlikrmosnprlqqkptjpvlrvjpujrskridjVU[findceigglghrlmldehbcjegjcfg\_i[_raenije`a^YZYTU^YZ]VY_XZaZ]\UX^WZ\WY\Z\ZWYYU[QMSOJS?;?B@C=@@8=>EMM=KJ7MK+?=EFGPKMLNPNMNLNNNQVPV[NT\PT]W[dSW`W\dUYbTUZ\\`XY\TTXVW[\[_c]bb]b^Z_YX\ZY]\[_]\`cbf[Z^^]a]aaW]\[`aRWX\`dfjokkrpqvTTZOPUccielo_gj\cf_ficjmefhjhjhfhdacd`bhdfhffjihgabmghoghkjjkiifcelhmgchnjnjgiifhjgilikifhjekiejiejlhmhdijchiciidhgbggeiceideikjohgljflkgjjikklmkjlefgqprlqrfjlhjkonpnnpkkmgfhihjqprkkmnpqcjhbeelgijagvhpmopzy{wwyrmopkmnikwrttoqsoqtprrorz}vtr{z}~~vy~yuzxrv{y~jrrhlmjnojlmmnohpqhppgooenngppnqrpoqrqsrqsppqsrtqoqppqrpronpqoqqpputtvvuuttppoprspstsvwostnqrprswtvvrtwtvvsuqnpmkmgegpmpusuvtvxwyuxyvyzy{|xz{uwx~~}|~tsuqprkjkzz|}|~xwy{z|{z|txyv{|tyzuz|rvwnwwj}zj~{l~{rq~uwx}vxysxyx~usvw|}vyzyy}z{yxx{xy{zzwvzyx|wvz{z~tsw{z{xwyxwx{z|}|uuyww{trwyw{wuzzy}||~}ihjutvxwyzy{zzy|w||v}|v{{wxyxzzuz{x~~y{|uxyozzuzyvvxyyyvxy|uvysuzvwxuuywwuwxruxqtwptvosunrtnppu{zmttlqqrssptrimklmj}zyusruttwxxyxyrqqmijuopyrszuvurtvrwuty{tt{uvytusqpsqqtpornmsonsonyutlhgsklumnnjkollnmmnoopppuuvsrsoppqnnommxvvommpnnrpppklrmntmnwnoxnooooqpppqqlpomppjnnknnlnnqqpspppppiqrkrrlpqorstsuwut}suwuumwurxvpppnoorvux}|hnmmsrltsovuptsptsossqnmyvumkj|zypnmsppwstwqrxtt|vwwssxvv}{{sqqvssusswutyvuwutyvuzxwturuxv{{{{{{zwy{y|u|{s{zr}{ts~w~~uz{vz{vxyy{|w{|sxyy|}vyzzy|{{zzxx~wx}}}y~}z}z}zyxz}z|}}{~~{zz~yzzx~v{}w|y~uywyvx}}yxxvzz~w{|{v}~qqsru|zz{~~zyxxvv}{{}|}vvw}}~{||z{yxxuv{xx~{}}x|{xz|y{vrtvtvvtv|}zuuxxxw|{nutx~pxwjporxwtvvsuujknlrtjsyntzmoxovvsxysxyswxstvy|zw}zrwuinmx~~}xyvuysqvtrxus{tuvuswtrvumvxpyqnsqprwuwrpr|{}uqsququ}mrru~osroqolnqnpokopmpniksnpxsu{vxhcesjrskrqjqrmrsnumopmnotproikvnpxinyjoxjoynp{ru|twojlnjlroqqprrqsnllnllqooliiwttbacbbcmlnroqoilqkmpjooinsiprhnsgmneloipiekgfldfledfrppmhimghmefnhijdfmfij_bn_co_cnije`a`Z[\WXd_`VOSYRXZSX\TZ]V[[U[YVXXUWUQWYU[NHR1BG,EG5@DHCEGCEKGHIHH?A@AFEDMLJTRPRVMNSLLOTQUVQWUTY[Z_ZZ^VUZYX]_V^bV_\T[WSXWVXWYZ`]b_^b]]a^]a\[_Z]a[]a[]a_^b`\aieggbde`be`c_Z\gegUWYNPQVXZacdegiY^^^cc^ff]gg`kjbllahieghgdfkcfjcfkikgcfgbdogkmeheghecfcbdifglgihegjikgfhihjlkmhgihegkhjiekgcihcllcli`jjajlcmldmnhoifjolnjgijhhihiimneijgjkkopX[\W\[ceelllrppqoosoqnkmnjlliktprmkmhlmafg`demjlnfhmkmhegpmoroqkikgkjjponstinokpspv{r}u~wt|t~r~mz{n{zq}|mzyt}zs}s|z}}boocllmqrpoqoklxmpkpwmpkopqqrokprnswsxvqwtpunioqkpsnsrlquousmrmmmlllsssxxxssssrrsrrsrrsrrsrrsrrvtvtqstqswtvwtvhlkkonptsnrrmqpvuwvuwvuw{z|qorooowxvxyxtttkjlkjozy{zy{zy{zy{zy{xz{uxyvzztyzs||tpsvx}~}xzzsuusuuz||z||}mooz|{y}|z~}~npry{}xyz{~yy}uvy}}{||z|y{{v|{v{|{z|{yx|vuzxw{vx|tx|~ty|vx|x{x|~vy|vx|y{~{}{z|mln{z|xwy{z|}z{yyx~wv{zywwwyzw|w|x{|ywuw}t|t|tys~vr~lllwvvvvvxxxvvvuvzsv{psyuvrr~opzptxrtyorwsv{qtypwvjpobeeyyywuuqstptvqswuwz{~yy|}z|wtvxuwxuwxuvvtvxvyutvwvxmlnsnntpornmlhg~lihpoonmmfhhfjjlrqrwuosqrwuejgntrrsskiivttqoorpppnnqlmlghxstidetopxqrrmnuop`^^onnsmntmntmnunounoyqrxuuroorqqrrrvvuqpsssspqm|~{xxzvyzkopippjrrkttnst{wxz{wrstpqytuuuutttoopzzzsssopppppsrrstttssuuuvvvxxxlll{{{wxxtttvvwyyyxxxvvvxxxutu|||zzzyyytuurwvpwvowvq|zz|qtuz{|{}~{}~xyzzz|~}|{}|{}yx|{zyxyx{z{zy~||{|v|~|rsww|tylwzr}u~{njo{~x|{y}|}y}|}~~rwvtyx~}{|}~~wvxwxyntuzz|~u}}qzzr||cmmr||u{|}lik{wz}}|x~}y~}vrx~vx}suvlmxy~|~yvxzwytsutvwvyz|z|{y{~}{{|ddfgjiuyxlpoy{{vxxw|{kxtp}ykyun{yfrqppqrstytvyuw}}}uwwuwwlnn}}}wvw~v~y}~uyyruuvuxutwxqwwpvvptwpuvotnmolkmxruwqtvtvnoptorsprrmpspqtprpmominokpnjrmiprkqqlnupruprwrtytvoknxtvslpunqumqwmsrjoslqichpkqp^ipzyjroglolmljlkikmlnlkmonpnnppmoojlpjlrjmvnrzpsvknrhktjmlbe~twzmqxmpulopgig_bdglihnigmkelnfnqjmsmnqkloijlfgkefj`ckbef^afacf`bjeggbd^Y[]XZb]_WQV[UZ`Z_VPUXRWUOTYSXXRWVRWRQUQPT';@)CE7CGJCFOJLLGHKFGDDD?DC@JIGONSTXIJNEDHNJOSMRSRVVUYSRVRQUXW[cXb\NY\TZXTXWVXVXZ``d[Z^^]a^]a[Z^[]bZ^b]^b^^b^^bd_a`[]fbdc^`SNPjgi\^_lno`bcbde]_`Y]^\ab_de]ee^hh]gg^eedfgfceldglfibdeihjlikmhjmhjjklgijhfhd`bidffdfihjlkmgfhgfhedf`]_gdfiekgcihclpeolakncmodnodnjcjlhmnkmjfhhffccchjkgijhijwyzeghmrqikkgggiggnllpjmnhjlehqkmyrumgiklmhlmfhirnprhkqlnjegqlntoqnikfljjpolprglmhlpntylw~zy}v{http||w~r|s|y|{~jssjnotuvvrtvor~ptkpujmquvqprnjolhmqmrxtyuqvplptpurnsrnsuqvrnslllhhhuuuuuuppptrrtrrtrrtrrtrrtrrurtroqxvxwtvzxznrr~otslqpmrqvtvvuwvvx{z|rqspppwxvuvtvvvzy{zy{zy{zy{zy{y{|z|}x|}w|}xunt}x|}prrsuu}y{{uww~xzzprrz||xz{|}yyxy}wx|tuy~svzknr}|}|z{z~|{zx|yx|wvzx|x~}xx}x{x|vyx{|y{zy{xwyrqs||~xxzzxzzx~zx~zx~zx~|zsrtuvrwzq}wstp}z|}s{q~|syryq~llluuuwwwvvvtttvvzruzlnvbcmmmyuwooroptmnqmnruuxmttjpodihuuuwuuopqtvvopqlnotuvvvx{xzxuwurturturtwvxyxzvuwjikwvxtnpsontppokj}yxljjlllnnnqssmrqlrqpusmrpinlsxvqvtpppxvvommommqooommqlmlghwrskfgsnoxpqtnotnpwuuljjsmnumnumnvnovnoxpqsno~yzpnnrrrnnnpptrrrklh|}{zy{rtujnonrsjssjttntulkkljjtrrwvvrpprrrsssnnn}}}}}}uuurrrrrrrrrrrrqqqrrruuuooo{{{}}}vvvvvvxxxxxxvvvssszzzzzzzzzyyytvvpvtovtowvrzyu~}vxytvwz|}y{||{}utvpoqwvxxwyvuyzyvu~~}{z{w|ty|mru~~z}w~{}{stxw|q}o{}o{}vt{y~rnsvxxz||~z||tvv~~~z{|~~z|yxzzy{svxz~x|}svwzltt~xsxy}z|spr|~|~z~z}vrx}qfhtvz|yzvsuzwysrtsuvrvw|{}{z|utvxwy~}z||prrz||rttnsqr~xp|vr}zjuslxupoqonp{xzxtvwrtvvvsuuxzzxzz}x{wu~yswxswxvxyvuwtsuwpuvotunsvotxqv}|~vuw|uxxrturtprsqnpqnpliknkmtqsyvxvqwuqvsotrlvrlpsnptprrmopkmojlnkmyvxyrungjtkn{mszmsoflnhmlglvepkwsdllejolnlkmrnppmoqmonkmsoqnikplnrknsjmshkwloxmptilj_bladtwwimynqsjmwnqngjcfjgiljgklejoekpiluopnhihbbkefjdek`ci`ce^afacd_agbd^Y[VQS`[]a\^ZTZWQV_Y^]W\[UZ]W\^X]\V[WSX]\`TSW4DJ'?A@HHJFIJDGH@DELMQCDHVUYZV[YSXQLQVRWVRWXSY^Z_g\f\NX[SZYUZWVXUWXedhQPTWVZ]\``_c[`c[`c\_c]^b]^b`\^d_a_Z\gbde`bc`b\^_^`bZ\]_ab]_`dfg\abaefZ^_Ybb`cdcbdkhjjgijfgfcelqr_de`dfdfgjjlZ^_W[\WYZYXZ\Y[baccbdihjhgi_^`fegWTVifhiekgcihclpbngYen`kufrvhtrjthdiifhjgieccsqqfegihjlkmhgiedffjkiklkjlolnoloofithkmbepehwlotilvnqtprifhxpsqfislowpslehohkslojllionglmglmmru|s}u|w}|||~x|qwz|wsyoqyywynjlwqttknynqzlpkpxmpnrsjikiejtpusotlhmlhmqmrvuyhgkffjnmqrqummmdddccctttuuutrrtrrtrrtrrtrrtrrtqstqs}z|oln~{}qvuotssxwdihtyxsrtwvxxwytsuxwyzzz|~|{|ztsuyx|zy}zy}zy}zy}zy}xxz}|~yz{w|}tyzyxw}~}~|~~prr|~~z||prroqqz||prrz||prr~|}{|vw{yz~stxwx|xw{yx|wvzwvzvtxyx|{z~{z~tswqz}ly{kz|sr|y|ux~vy~z|||~}suvuwxwyztvwxv|yw}zx~{y}{rqtuvtuwqz|vvwuvrw}q|n|{q~zr~|syyyyyy|||yyyxxxuvzsv{przmnxqq}wvzruwqsy|~xzvornpppqqppppppsssupq{uvyzyzxrswrrroqsprtqstqstqsvsuvsupmoyvxqnpupqrnmyutvrqplkomlmmmlllkmminmlrqw|ztyww|zuzxnsqoooqooqooqootrrusspklrmnrmnpklrmnskluopsmnnllhffrmnrmnrmnrlnrmnsnovqrwrsommlllrrrqptsssvws}~||{}twxmopostotunvvqvwpppoppwxxyyyhhhnnnqqqnnnooouuurrrnnnssstttrrrooonnnpppnnnoootttxxxvvvtttuuuuuurrrxxxvvvxxxwwwsuupvuv|{x}|s{z|~|~~z|}yxzvuwutvyxzutvwvxww}xx~vv|qqwy~}}|v~x|yzx~vw{w|tujvxzr~{{{~z{z~|~qssxzz}{}}|~~~~~zzz{~z~zzy{|{}vxy}z|}~vyz}~uuwpmozwyzwyyvx|x~|{{w}xtzz}zoqvx~{|xvxzwytsuuwxquvrqsrqslkm~}vxyxz{|~{}~vxyz||nsnnto{txwrqswvxkhjwrtqlnkkkxzzjllprry}{u~~wrvwrvwxz{utvxwyyrwwpuvottmrslqtsujjlngjwpsxuwmopqnppmopmogdfroqrmnwrtwrtwqvvnvsmqsnpsnpuprsnprmomjlkhjpild]`}tw~goksyjptjp|uzzitygrzmue_dmlnmkmshkvytilwmpwloqjmsloofitwoaezorrgjzorujmi^a|qtykoujmjbdmdglehdfghgijfhrilqfinghicdkefqkld^_gabk`cg^ahadfacc^`^Y[d_a\XZ_Z\_Z\\V[[UZ\V[YSXXRWSMRXRWTNSWSXPOS]\`;EL-?B5>BKDGHBDEBCKHJB?@EDFCCECEFFGKHIMPOSSOTMGLUQVWSXTPULHMa]bcXb]OZ\T[YUZVUWVXY]\`\[_^]aZY]]\`X_b[`cY^a[^b\\`_\^a\^`[]c^`idfgdfacd\^_jlmdfgdfghgicef]ab]bc[_afdfnillgisprifhbdejop`ef_cdbef_^`[`a]ab]abeghecfpoqddfbacdcefegfegebdjgijflfbhidmlang[ig\ieZgncpnepjfkdacnkmdbbussfegjjlkjlnmoedffjjjlljikgdfkhjqhkpehvkn~svznrzor{rugbdxuwnikqfjsmpf_bjdgumqqknloolrqlqrglmjor{|vz{~}}{|vv|qsyux}pv}ymr}iirolqvprpilzqtvmpvmpzlpjozorlpqutvxtyqmrsotminnjoqmrsquwvzyx|xw{qptsssyyyrrrsssxxxtrrtrrtrrtrrtrrtrrolnqnpqnpurtmrqqvu{nsr|{}hgi}|~vuw}|~{{{|}{yzxwwwzy{~}zx~{yyw}zx~|z{w{}}|}~quvtyzkwwryytwxroqtmpuww{}}xzz{}}~vxxy{{prr{}}z|||~~uww}~~{|yz~~vw{uvz||{|{zy}xw{uuy{z~|{zy}{z~}|qz}nz|fuwgtvt~z}x{}vyzwy}~|~rtuxyz|~xz{tvwzx~yw}xv|usywvzrsrvwrtvpmnm}xiw|n|}q|r{r{{{zzz|||stxorwprzuvssrq{yrurknsloyruyruqpprppppppppsssytvvpqkefuopwqrvqrurturtvsuurttqszxzvtv{xztqswtvtoptposonsonrnmvtsiiiiiikmmjonjpoinlhmkotrafdx}{qqqpnnommommtrrsqqrmnojknijmhinijvnotnotnosqqjhhpnnonnpnnonnjhhxtuwrstoppnnkkkyyyonrYYYqrnrsqrqstsuoqrorsuxyuz{w{|sss}}}{{{jjjjiinnntttiiinnnrrrwwwjjjwwwuuurrrrrrpppvvvkkkoootttvvvrrrnnnvvvyyywwwyyyzzz{{{xxx|||qssprrzu{zy{|rtusuvz|~z|}xwyyxzwvxxwyvuwwvx{|{|z{{|uz}x}zv{~v{~{v|v{xzx~yz~w|tvbnpnz|s{z~|x~{z~{|~uww|~~z||uwwyzz{{{~~~~~~wxxuuu{{{zvztpu~{vrw~}~~}{z|z|}uwx{}~|~{}~{y{}{}vrt|y{|y{pmo~{}{xzyu{~z|}y|x~wyvxxuwyvxvuwuwxtxy~}rqsxwy}|~hgiqsstvwxz{uwxz|}rttttpqsoqqoyzzsrt~}xuw}xz{vxuuuxzzprrikktvv~}u|w~z}vz{x|}tvwonputvyrwwpuwpuslqxqvqprmlnqjmzsvqnpnpqmjlzwyqnpjgilikojizst~wzqjorkpuprrmotoqrmormouprqnproqunqzsvwnqjr{empw|qwsns{jutdou}mhmiikkjltfjvgkykoykozlpslownqshk{mqvzrgjvknqfivkn~svynqykoxmpzqt|svpilfhijgilgiqhkynqjbcoijpjkvpq{uvlfgladjade^ad_ad_aa\^kfh^Y[^Y[YTVZTYYSX^X]\V[ZTY[UZ]W\XRWXTYTSWTSW7?F0@D;BGE>ADACMJOB>DE@FB>DHDIHGKFGKEFJQPTMINYSXWQVRLQRLQMFLSMR]R\[MX]U\ZV[VUWVXYZY]]\`YX\\Z^YX\T]`Y`cY^a[^bZ]a_\^a\^^Y[d_ajeggdfcef^`a`bcbdegijihjgfhcef_bd\abicelbebZ]mjlffhabccgh[^_ffhjhjlikcllchiehifhi`bclkmfdfdbdgfhgfhgfhdacjgihdjhdjhcliaqnfuldtriyb[kgcliejfbd_\^WUUussmjllikjgiolnnjljlqpquposhdjjeknfiofinehf]`bY\rilvyeacompfdfjfhkikhdfjhjqmoigijonlrqhmnglmotwx{~}|mjotqwrpv~w}{}{wsxyruqjmvortnptmpzlpjoznrlppsrtxtytputputpurnsspumnrmnrcdhlmqrswrrrsssmmmnnnoootrrtrrtrrtrrtrrtrrebd{xzzwyliknkmlqpz~rwvnsrlqpxwymlnyxz{z|xxzwwwwxvxyw||||{}wvzwv{{y|zzx~|z~z}z|qproqrw{|sxyu~~w|}ttvzuw}prrrtt~rttqssy{{}ikkwyyuwwwx|ww}vw{tuy~xy}wx|{w|}|~}~wy}|{}|xw{zy}}|w|unz|bnplux~{~y{zxzrtukoprwxrvw{w{|vz{xv|vtzusyxv|vuyvvvtuqqrnrrs~~m{|m{}p~xn{vlxlllooooookkkxxxstxpsxrt|tuoo{ts|xrswqrnhivpqwqrsnosnoqoooooqqq|xwzygbavqpytrieesprurttqstqssprsmoqlnxsuwrt{vxsnosonsonqmlrnnvtsiiijjjkmmjonjpootruzxqvtejhuzxpppqooqooqooljjkiiqlmqlmmhilghojkvnntnotnpommrppmnnlnnmnnklmhiiuuuxst~mkknnntttonrbbbuvrrsqrqssrtrproqrhlmfklfjksuuvxxwyyknnruutttvvvlllpppttttttlllttttttrrrrrrsssxxxpppsssvvvwwwyyyvvvvvvxxxsss}}}yyyyyyyyyqqqtttqrr~{~v}|xz{uwxqstwyzvxyxwyxwyvuwvuwvvxyxzx{{y||z|}uwwpsstz|uz}w|y~uz}|w|v{x{yz{x|tthtvo{}p|~y~|x}{w|}}z|}tvvwyyxzzwuu}}~{{||{yy||zv{{uqv~}~~|~}|~~~x{y||{}wtvpmo~|y{}y~z|zv|qhktv|~}rtwyz{zwywtvyxzrtutxyyxzutv{z|wvxqprtty{|uvzuvzqpr|yuwuqjfg}xyvuw}|~yvx}xzvqswwwvxxtvvsuuxzz{v~|~~}quv}{z|wvxvotvotxqvunsvntrqsmlnrkntmproqlnosprwtvwtvsprmjlrml|wvvqq{twrmoqlnsnprmormouprsprroqngjsloulogpmu{msqkprrvsepqalzowlhmjlmklmpehujmtjlujmvknqhkvmptilwim|mqh[_mbeujmvknynqvkntfjtilf]`kbeohkhhhjhhmghshjxkmjbcnhjicdf`agabe_`j_bi`ce^afachcec^`JDFb]_gbd`[]f`e\V[\V[^X]]W\\V[]W\[UZ]Y^VUYUTX8>E3@D;AFLEHEBDFEIC?DIEJB>CKEJIEJIJNDEIEDHNJOTNSTNS\V[TNSPJOUOT[PZ[MX]U\ZV\VUWTVWVUY]\`YX\]\`XW[T]`\cfW^aZ_b\_ca^`facgbdojlb]_]Z\^`acef_abacdacdifhgfhegh^bc^bbodhpdgkcffcefhi^bcgijnmoroqlfhd_ackk\ab[`achi`bcihjfegedfgfhgfhgfhhegfcehdjhdjhclgftlhwcbpxtnm{qmvokpgdfwtvpnntrrnkmifhmjlnkmkhjhkomnqgfjkglhdinhkoilohkgadzsvworljlnqrbeffghgijhijhklnopfhiejimsrlqrjopqvy|z}}y~~xzs|xpzwpzzzy|wt}njonjkytutprtqsrnp{mqjoxnpjnppprplqokpnjosotrnsqptlmqlmqoptpquklpmmmoookkkyyywwwtrrtrrtrrtrrtrrtrrqnptqszwy|y{sprhmlw|{w|{w|{utvutvwvxvuwutvwwwtusvxvvvvvtvsrvwt~{x|xzw|y{z|xxz|{}lnomqrluuptuusu}vyxnpuwwy{{}~xzzsuutvv~vxxtuyssy~xy}{|xy}xy}yuz{z~y|vy}~|~~yx|{z~}||w}jvxowzty||~xzxwyruvptvswxnrs|y}~w{|{yusyqou{ytswmmnz{wstpwvx{qn|rzm{qgtssstttsssnnnzzzstxpsxtv~st~kkwyx|wxpklpjlzuvwrswpqvpqupqpppqsspnmlhhwsrzvuyutlhgtprtqstqsrprrnppkmb]_c_`tprqmopklrnmuqpqmlsonsqpkkkmmmkmmjonjponsquzxpvtgljlqonnnnllpnnqoonllpnnqlmqlmidelfhqlmtlntnovppommusslnnjonjonkqoglkqsswrstop~||hhhwwwsrvmmmuvrqrpqprurtsrtoqrmopjnoimnrttuvvnppnppsuuvvvwwwppptttuuusssnnnssstttrrrtttvvvxxxtttuuuvvvxxxxxxvvv~~~yyyvvvvvv|||qqqtuusss}~~z~y~|z|}uwxtvwzxzzy{wvxyxzvuwwvxwyzy{|y{|vxyuwxty|uz}uz}y~w|~y~x{x|zz|x~ssnz|nz|o{}}y~|x}yx||}~vxx~uwwwxxzxx{yywvv|zz}}nll}{{}~wsxwsx~~~|{}~}zy{zy{~}~}~}{~y|wz}|z}vsutqs}z|}~z|x~~z{w}tknuwy{tvwyz{xuwyvxutvxz{rvw|{}xwy{z|}|~{z|uvzlmquvzuvzxy}srtupmzvsjedtopxstsrtvuwvsuzuwqlnlnnvxxprrikk~}~}~}iklutv|{}zsxxqvyrwtnrtmrrqsnmotnpunqtqsnpqvsutqspmotqsroqtliyqqqijrilqhkmgiqlntoqrmormouprsprqnpohkunqyps|dlpw{pvwtyquyocmrbmulsolqilmjlmrilwnqrilsjmtknqhkxmpvhlrcgsdh}osrgjncfvknwloxmpqcgvknsjmsjmpilhhhlghmghshjtgioghnhihbbe_`e_`kefmbeh_bg`cfacfacmhj\WY\WYojlRMOe_dYSX]W\ZTYWQV[UZXRWYSXZVZSRVPOS<@F5@D8>BC=?C@BECHB>DUQXOGNRJSMFMIHM<;>KJOPLPSNSUNSWOTPINVOTXQV\PZ^QZ_V^[W\VUWTUWTSW\[_]\`]\`ZY]T[^\dgW]a[`d]`da^`b]_\XZmhj\XZheg\^_acd[^^`bc`ccebdfegffh]ab_cdqgjpdgmchdabhjl`deebec`bgachadqjl[bbXa`cgibfgacdeeghgifegffhedfdbdifhfcfgbhiekfbjfgtghubbpddqbdqhgnjglfceecehffnmmoikidfmgimhjmhjfhmmlrdbhmiohdjlgjgefnjkjgilgikghoikpopeij]bcjnnimmknoilmossimmgmmqwvlrrmrsosw{~~|~z}z|~zzqks}uys{utzuxnr|uv~tnstoqqnpsprsrtonp{nqjoxlpjnonnpqmrqnsplqqmrtpuvuyjmqnpufjnnpuoquooorsrtttrrrllltrruqrurstsstrrtrrxuwsprvrturtwtvntrvzyhml[_^otsqprzy{tsuxwy{z|wwwuvtuvtssspnqyx|yw{yzwzw|y||xz~{}yxzouvvy{||tw|nsrssvwwpqq|}}{}}z||y{{y{{~yzz{}}{{vx|xy}vw{vw{wx||zz{|qtxquy~}|{z~yx|xy~otwmuxw}ruytnpxru|xzzy{uyzv{|rwxglmhmnotuy{z}~}ww{ssv}}zzzwzx{wsyqq~qu|zyyxxxuuuuutvuuqswqtyuv}su~ggr|{zyyrpppnnzxxrppzrsxrswsttttsuuwvtvuqrqmxwsrqmvtrtqtqnproqqnppmoohkaZ]e_btmprknpklqmltoosonrmmnlkonnrqqlnmjnnkpolqolpnsxwuywotrpqqqooussrppqoomkkpjlrmnfabkffrmntlmuopxrssqqrpplnnjonknnkpojontvvsnosnoyvvttttttzx|uutrsopqopoqtprwsuqoqnpqnrrostv{zrxvkonuyxosrsssvwwtttvvwvvvuuussstttsssrqrttuwvvuuuvuuttttttzzzxxxuuuyzz|}}tuursrurrvvv{||y~}y~~z|}uxyuwxsvw|z|}|}|z||z|{z{}|~x{|y|}z}~wz{y{|v{}vz~vz}ptwty|z~x{x|{{|z~tq|oy|ny{q|~{{z~zz}z{}z|}suux{zxtt{|zuv|~zw|vrw{w|}~}{}~}zxz}{~~}~}|z}y|x{z}|xuwywy~}z|~{}~zxtz|yuz{svy{{|uw|rt}vwzwyxuwzxzuuwsvwzz{rprnmowwx~~mmsssxxy~{{ttvtnl|vtzzz{xqrsrtrpsurt|wxtnpkmmvxxnppy||y|{u|uwxutvtsuxpuxqv{uyslqunrrqsnmovpruoqmkmnnpurtqnppnpsprurtunjwooummphizpt{uwxtvqlnqmoqmotprpnpmjlohjunqvmpnuyhopinjkpahlf]en_hofnqnrlnolmnwpszsvrknrlnsmowloznqugkwhlufjuhlh^aladlbepfisilrehrgjpgksjnh`djhhlghmghtikqdfpghibcf`ab\]b\]e^_lbef^ahade`ba\^]WY`Z\[VXc]``[]f`fRLQXRW[UZPJP_Y^TNSZTYVRWQPTRQUEDG>BCBACEBDD?HGALC=HF@KJDOKCMTGIPHIMHIGIIEJINHM\V[\V[XQVUOTPNPRNPURTVTVVSUYVXZV\UQV^Z_WSXYUZ^Y[]Z\cbd^`a[]^b[^dacgij[_``bccbd_^ba`d_^ba`dcbf\^__abacdmppgijqmsjfld`f`\beag^Z_pkmqjmhadeceW[\baccgh^ffbfhdfghjkacdbacfeglikkfhljjgeeb``a__kiivovheja]cjioffld^cnjlhcfkgihcemikgdfdacc`bjgimjlminnjpXSYidjjfkkejpjorlqslqkejjfkkjnkjnminmglpjnplqplqnjonkpolpihllnnosqkqp~~{{{{sqw}zyw}xv|spwu}~|qtx\^blkmlkma`bhgiqprxuwqjmx{facuwxrtugjjjjlmopzz|hjknrsquveghqprjgivuwlkmpoqihjsrtystvnoystxstqoorpptswtrvzy}poszy}utvpoqyxzutv{vwrppxxxmmmuwwotsuutxxxxxxyyy~~}xz}utvuwxy{|zy{{}~vxyuyzv}lr}x|}}~zvo|{xz~{}|~|~yy{wyzxz{tvw{}~tvwjnpvz{uyzuyzuyzwvzsrvrqutswtswsuvz|}tqspoqx|}s{{prssuv|{}~z|wrt|~}uwxqstuyzvxyywy~{xzytvvqssprillqstxuw{}~zswxzy{qhryq}xq~royrzztyzptux|}~|~|xy}twuxpt}xz~}wwysrt~xwywuuvttzxwyxtxvsvwwwww|||xxxyyystrwxtvwsyzvtuqvwtusstrrtrrusstrrtrrommpnnjhhqooolnqnpsprolnnkmqnp|wxxstupqrmnrmnmnlmnlnomopnrsqsqqmkkgeeommrpprppsqqussljhpnjrrlmommlkhignnlopnkljopnopnmolnommkjsnmsnmsnmojijedupovrqzxwvwuuvtuturpsnpqlnokopkpqprsprsrqszwyuprzzzrwvnvukqpnppwwwtttpoq|{}mlpwsx~xywyyrwvputooossszzzihjzy}tswkpspxxckkiqqmuurwx{zzwyylrqjrqmxvevup||rxxzz||y{v|y}{~t|{z|~||}}mooeji|{}}~}{}y{|~y||z|}}~~}}|~}{xv|}~vrx|w}{y~{~}xz~{}~{}y||~z~tz~~vz{}z|}|z|~}|{|z|~z|}z|~|~~xuw~{}vtturr{yyuot|v{uotvpv}w|wtv{yyrppiggsqqommkhjxuw{xzyvxxuw{ryq{vrt{wvzxrtrrxwxutxkiopmvwu||{y{|vz{suvnmoqprztuqlmpnntttyyysssmmmrqsrrtrqunmqtoqqlnqlnqlnzuwrlmvpqtnntnosmnmopkopkoplpqjnojlmsmrsmroinnhmsmrhgilkmmopgklgklytywpuwmsvioykqymssmrsmrsmrsmrsmrslorhlnfhshkqcgslonikrmovqsvqsuprsqqommpnnrppljjpilqhkvmptilseixgjl_aumnidekcdf^_e`ahcdb]^VQRc^_dZ`pbhtelZOU]W\\WYWRTZUWZUWXSUXSU]W\\V[WSXRQUONR7BB;CC9>?A@BB?AGBKC=HKEPGALJDOLDNTGIPHINIJHJJFKJQMRVSXYUZSOTUQVWTVTQSURTURTZWYURTokp\X]`\aXTY[W\]XZ^[]\[]NPQ`bcd]`_\^[]^Y]^`bc\[]_^ba`d_^ba`dcbfgfjdbf]\`^\aWVZhdjeag]Y_d`ffbh_[`e`bi_bsjmqnp^abcbdaef`hhbghdfgacdcefdcebaclikidfjhhgeeljjkiiljjmfm{sznjpomsfflmfjwormcfjbepfiqilkhjnjlolnkhjebdfcepmojhiroqkhjjfkokpiejlhmiejplqjimjimminpjongloinrlqrlqqkprlqhimkopmsrpuu}}xx|{}|zx}pntuz}u|ty|lnrdeipqujikllnqprnmojiktqstmptmpa\^eghfjkbfgdhihlmuyzkpqpprpqrmln}|~poqqprjiksrtsrtsrt{uv{stystzuvommommonrvuy|{jimxw{tsu|{}lkmpoqonpupqhffyyysssqssnsrvtwyxzrqssrt|{}~y{|y{xwyuwxz|}}|~~}z|}tvwrvwt{~ntuyss}yvo|yxzyxzyy{{z|zz|y{|wyzz|~vxysuvwyzimnvz{vz{vz{vz{wvzvuywvzvuyutxxz{uwxxuwzy{|wtvvwyz{z|zwyytvsrtpoqpoqywz{y{z~ptux{||~z|zsvwrttnp~onptwx~{}tvwuz{swxzy{qio|uqnyoqyv~~tyztxyw{|~z}y|ptz~x{urt{xzxuw}{xzvsuwtvxvuxvuyxt|||tttwuu{yyxuuutsyzxz{ytustusqootrrtrrvttwuuussommommommqooolnroqtqs{xzyvxqnpzwyvsutrttqspmooooqqqtttsrspppwuuommmkksqqrpprpprppussigfpokssmolktporonqmlolkijhpqoqonpnmspoplksnmsnmsnmwrqzutytsxtsywvvwutusrrrppomoomoolqplrqprsprsutvtrtupryxxqvusxwotskllpppuuuwvxzy{xw{{w|~xzvxxuzyrwvmmmiiiuuuwvxxw{vuy|qyypxxzlttpvvvuuy{{|u|{qyxhvunyysxyzy{}z|u{x~you}v{ysx|{p|}xv~~~wyy{xz~}|~zy{~}|{}|{}srv~}|{}{z|yw}~|zx~~}{}y~x{{vx}~~zzv|{~|yzx|}xz{utv}||{xv|ur{zv{w|}z||y{tqstqs|y{|||{{{xxx|||{{{vpuvputnswqvvpupmo}{{|zz{xzvsu|~|y{{xz|syq{xsuxtsyvqyvxxw{yw}rpvur{qnwtsw~~}wvxtsuystpklrpppppyyynnnpppqprnmoposnmq|wysnpmhjlgirmoqkluoptno{uvystmopimnjnohlmhlmiklsmrsmrrlqpjptntnmonmolnpmqrtxyjfkrmrunsukqwkqvlrqmrqmrqmrqmrqmrsloqhkmdgpdhtfjtmpmhjsnprmopkmmhjqooljjgeejhhsqqqjmnfhvmppehrdhradcVXh`ac^_e]^g_`gbcfabe`aTNPe`ae_dqekwio`V\[V[[VXZUWb]_ZUWVQS[VX[UZZTYQMRQPTRQU8>?.23>AB>=?CBD?:CF@KQKVGALHBMNFPTGIOGHMHIFHHFKJPLQWSXPLQTPURNSURTXUWROQROQ\Y[URTYUZ^Z_a]bVRWd`e^Z\XUWedf[]^fhiaZ]]Z\bdebfg]_`^]__^bbae_^b``dcbf_^dZX^][a^]chflhdjgcieagfbhfbhd`ehadcZ]ZQTgcebcdddfaef_ggafghjk^`adfgihjhgigdfgbdhffdbb{yyhffhffibge_dg`fjekgfjYNQsgjpbfpdgtfjrhkkhja^``]_fcelikdacjgidacpmomjlfbghdilhmokphchqlrjimlkolhmpjo|kchpinpinohmrkpjioosuout|~{{}}~{zw|yspywt~vy~swzorvy|klpdcglkmpoqlkmnmolkmlikaZ]tmpuprprskpqrvw]abimnmrslnoroqqoqtsuxwynloonpjikmlnqprihjqklyz~xyupqwuuvttrqurquutxpnrsrvonputvyxzwvxyxz{vw~~~rrry{{x}|utvsrtpoqsrtutv~y{}xwyxz{xz{zy{|{}suvprsostqx{rxswss|x|uvuwyxzutvtrtwvx{}~xz{|~vxyqstvxyvz{uyztxytxytxyxw{wvz{z~zy}utxxz{uwxurt|{}ptuwxz{y{|vsuytvqprxwy}|~utvvuwx}~puvy{|~z|~wz~vxxqtytv}z|{y{zy{wtvrtux}~y}~yxz~}~t|wtzqs{kuuv{|kpqtxy{}}uxy|uyswqnp}|~yvxwsxwtvwuuwutwutrttuuuuss{|||ywu~}wxvwxvxywsqqtrrvttusswuurpppnnpnnpnnpnnnjljgiliktqsvsuqnpwtvvsusprolnropmmmqqqtttnnnoporppmkkommtrrussxvvrpptrrrpopokqqknihojilgfrnlsnmstrnompnlhdcqlktnmsonrnmrnmtpowsrxtrxts{yxwxvtustttqqquwwlnnlqpjpooqrnpqqprtqswrtxvvjmmlrqotsuvvuuusssrqsmlnnmq~z~xytvvtyxrwvyyyzzzvvvllnonrmlpsx{muuqyymuuhppnrt~{nsrqwvrxwn|{r||lpq}~x~z}~}|frrt~~u}}x~|{z~uww|~}~z||{}~}~}{z|~~~ttt~~~}|~~xwy{z||z~|{y~}}z~y~xor{~xuwvsuy|~z~zw~|~}ztu}uwx}|~yx|xw{zx~zwyuzv{zwy~{}pmo}{xz}}}zzzqppoookkk{uzztyvpuvpu{urtwuuhffqooussrppolnsprwtvwtv}z|yp}yq{ytvxtszwrxvxjimqotspyokvpmvyx|y|sy~qw|~dceonpvpqrmnussrrrrrrnnnlllnmonmoonrqpthcetoqytvtoquprkef~xypjkqkloijeghimnimnimnfjklnorlroinnhmtnsuotnmonmolnolpq|~zxrwrkprkpukqrhnokpqmrrnsrnsrnsslorilpgjrgjykorknkfhsnpqlnniktoqkiimkkfddjhhhff`Z\nehmdgladn`dtcfl_ajbdhcdbZ[mefkfg^YZa\]e`ac^_^W\]QW\PVrioTQVc_aZUWYTVYTV\WYUPRVPUWQVRNSJIM_^bAABUTV;9;A@BBACD?HBIKEPNFPM@BOGHMHIFHHFKJKJNPOSMLPRQUPOSURTVSUURTURTa^`MJLWSXTPU`\a\X]c_de`bjgi_^`^`b^`aaZ]fce_ab\`a]_`WVX^]ab`d_^b`^b`_cUPYPKUgblZU^lgq_[ahdjiekhdjhdjfbgg^ag\_qfioilqprgfhjnoS[[fjlfhiacdkmnedfedfliksnpiggrppiggommiggofijcfkdghcefceqfiteim^brbfl]ambelikc`bc`bfceolnhffljjjhhdbbqooonrlkoihllkodcgedh]\`hgkgchtnswpuncjpfltipukqtipphrliovsu~xx{{}}{{{|xxtqmxxtstzvx}|||}jimqmronpvuwsrtutvtsuvsumfitmpxsulnpmlnnlnvsuigiyvxplnunqxruwtvtsumoppoqnmoqprtsulkmpjkqijwqrpklpnnsqqrqurqutswnmqonrrqsyxzzy{vuwsrtvqrjhhlllvvvmooottwvzvvy{z~yx|vuxytvtqsvuw{}~z|}{z|}|~suvswxpwzntnr}{{tp||utvwsuvtvwuvxvxywyzuwxy{|z|}xz{z|}uyzuyzvzzvzzvzzzz~xw{{z~{z~xw{z|}dfg|{}txyyvxyxwy{xz|wywtvyvxnkm|y{}z|u||nwwy{|}z|y|y||svxqt{vx|wy|~}z|xz{w|}x|}{z|w|w|x~xy}t~o{{|wzz{|xuw{}|wrtxtuzuwxsuwsywsxwtvwuuwuusuuvvv}~wxtvqnnsss~~~lllvvvvvvwuutrrtrrxvvpnnljjpnnusssqqpnnhegyvxsprroqroqqnputxvuxkjnnmqonrnmomlnmlmnmorqrtrrtrrsqqrpptrrhffsqqpnnmkjxwsrrlsiiqffxnnxmmvkklmksvttqpmffpdd{qqnljnlkxvuigfqonwrqzvuywvrsqopnkljxywsvuruskpnjqnnpqprrqprsprupr|wxwwwhmlnppnllsqqrrrsrtvuwzy}zv{yst~qvunsrqqqiiitttsrtvuyzy}y~rzzqyyzowwqyy}syxuzyy~}z~q}}muutxy~z|x|~{|{tx{{|xw~rxwz||z||}}}}z|~{}}zyx~}~utxyx|}|~}|~zy{~xv|sqw{y~|z{{}|~~~}{{~}{tw{}~{}{~}}}{|x~xtzxrylfk~yz~~|uwxvuw}|~~}ttxtrx|y}y|xuw~{}xuwyxzwyywxy|~~oqqnpp|wqvysx}xuwvttywwommxvvxvvxuwpmovsuwtvyp}yq{ytvyutyvqurtyw|pmvvr|hdpxt|{{r{}pv{pv{~mopihjyxzztuxstsqqqqqsssjjjqqqpoqnmoonrpostoqvqsuprytvnik{|kefyzztutnoprshlmbfgkoprvwkmnjdi{uzvpurlqrlqnmonmolnokopjnorptuqvtnrqkpohmwputswyx|posonrnlpohkjadrilvknxjntmpidfmhjojlpkmpkmljjpnnpnnmkkljjqjmg^arilpehseizilsfhjbcc^_`XYg_`b]^b]^^YZ_Z[\WXa[`g]cf\b^W\^]aURT^Y[YTV`[]WRTVQSSMRTNSMINIHLMLP@/3H8=SJM@=?@@BB=FC9;=69I?BNBF>46KABMCEH>@LACLCEHBEE?BHBHLFMKEMECITRYWU[RPVOMSTPUTPUTPUSOTVRWVQWUTVXWYXWYZY[ZZ[VUW^]_^]_a`bXWY^_`Z[\fgg`a_^^[heec]gfaibae_aa^bacagomreciechjhnc_ejflgcijflhdjlfkwjmpcgufkthkobec__eaaZWWieflhhhegmjmb_afcefdfjgimhjgadmhje_ahceudhtafsbfubgp_cncfoehodgrdhrcgladieklhmnjp_[akgmrjmpkleeeagdbnhloonmndceqpqqprkgkmemnfmjbjpipqiqpmromrmkoiglsqumhkdacqoq~}y{}}|~}}|~{wsyqlswrxswzntwzvy}mnrorvkmnmjlallVjhbonsprlik|z|qnpnknjnohmnotumsseklgmnjnoglmjopinootusrvposusyrowolvqmusorolnolnqootttmpqptuuyyswxnrrrrrwwwrrruuthhhqptutyrqvrqvtrw{{xz}y{|uwyuwxuwyr||q||uq||gssnrvwz~mptvy}qsxty|oyv|yw}stuuw|{}vvx|z|}vuwvuwzy{}{}xwywuwywy|z||z||z|zxzxusywvwyxzplq~w}{suyuy}wvz{y~tsulllsssxps{~uuwuxytyztyzwyzzwy|uxzuwyuwzvxxuwzxz{xz~~xz|{ovvr||vtvztvy{tpr~y{z|vxzuyxy}|~zzzxxzy{osvtqw|ztqwwtzttzou|otyprvvuwzwyoqrz|}usuqnp{vxuuuprr}moooqqsssxvvxvvxvvywwvttommrpptrrussrpp|zzussqooqoopnnljjxuvvttropwtuolmqooursyvvwtusqqsqqrppussrpppnnljjwuuqoonlltrrommtoprlmvnoxmoxmosqqsrrnnnrrrfff{{{eeeooopppmmmppp{uwyxytzymvthusennovunuunuufmm^ccjdesmn{uvztuyrsvvvyyytuusssuuuxvvyuvzuwytv{uzzv|uuztvxx|}u{zuzyuwwruupststxwx|wu|vw|rvwuz{rxww}|zz|zz|}|~|z|zx{t|v}|sv}zzz||z|}|}{{|xxyqwvp|}wmy}s}vp~{yz}x~}z~tzxzvzy{{x|~|~{z|~rswyz~z{}|~~}}|~~zy{{y{y|z{z|z~||~w{|rvw}yxs~v{y|swv~z~~}tnu{~~suv~uwzy{}zxyxvvljjvttsqqxvu}|~rrt{z|yy{vuwxvwxvwwtvyvxyvxussqoo|zzxvvtrrtrrwuuxvvxvvywwvutvo|ys~uqxxtxvsuvrvvrxyu{zu|xszurwuqvz~|}}rmoxrutrrqppqqqqsskpoonpsprplnqnpvsuwtvtlm|prwmopjkpoopnnlghsnotlmyqrphpibmtmwohrphspjrnikpkmkfglgisnpsjmoilqkmrnpnlnsntokptnrslqshnvkqytzzkrxipvgnxmtncjociufmtcktmplgisnppkmmhjkgllhukesqgupdsxjyysxysxqkpjdioinndge_`iefa`_f_`iaba`_\ZZ`^^`^^][[b_a`\^_[]`]_\YZ[UWWPSYTVYTVUSUVUWSOVSOVXQXSKSXNV768:57<58H=@J<@@78H@AJBCA9:QIJMFGJEGGBDMFMLELDBF8AH=@H:>>==@DCBCC=A@@AA?@@LGILGIHAHMFMQISKGMYU[SOUQNTROTJMQGLOFKN@EHHMPORVVUWSRTWVXZY[]\^YW]ZX^USZcag\ZaYY_]]c\[_[Z\a__d_ae_j_Zcbaeacc\a_][a`^d_]ccaghflifilikb_a_\_dadjik]dd^ff`fg]eeaghjeffabideideb]^dacebdroqjgifceifhjegkfhd_ae`bkfh`bcdeghjkopqhjkkdgnehpehseisdhodgmiokgmnjp`\b\X^hahhbgslqrjnbZ[pkmebdjhjgdfkhjjfhsfjqhkqln`_ahjkfeikjnonrkjnonrlgipmoutv~~{|x}szzv|ps{ikskjsjmrkmnxuwhttkesrmjlmjlpmolikifhedfadehjkjlmhjkilmrwxjopqvwbghjoponrsrvomsolunjurmvminwtvwtviggrrrnrsostswxmqrtxyuuuqqquuuqqqsssxw{pntnlrusy{yyx|uwxsuvprsrtuvxyjvvfrriuumyymyyuz}|nqupswvy}wy}xv{wx|zzxzxxz|}uwxwxyqpr|{}|{}xwy{xzwtvvsu{xz|y{xu~trx{yyxztsuvw{wx||vz~sz}vuyyx|xwy}}}|||~~y{yxzvz{puvsxyvxy|y{~wz|wyyvxyvxoln|y{}xz{xztuvmrsw~~|~wvx}|~zy{~qrvuwwvxxw}||v||{~nqu}yvpw~~zszwu{lt{pv{nptyxzxuw|~wps~uxz}|yrsuopkefxrsystidetrrpnnqoouss}{{xvv~||sqqsqqommommommrpprpprppqoopnnnlliggkiirppsqqdbbsqqommpnnmkkommommnllvttmkkommpnnsqqnllkiillltrrvpqrlmsmnsqqtttwwwoooqqqqqqoooooopppoooqqqrrrllloqqvxxx}|ivvevugvueutfutittrppzwwommywwussxzzvxxxyzz||wxxrrrrrrrprrqssrvttzswzptwnuulxvlwurttsuuvxyxy}wx|tw|nsvovvlttp{yq|zt}|rzzs{{ktsfnnW[`mruuyzyzzz|||yuz{z|{z|y{{v|{z|p{p{q{n|{so~q{{y}~xkvtz}uqv}z}{}}z|{z||{}z{wx||}yz~{z|zy{||~}|~~}~}{z|}{}{|z{y{yyz~yv~~xjvvjxw{|x}{z~v{zmms}{||y~sxyqwxw|}|yyy|zz|zzsqq}}ywwvuwzxz|{}{z|wvxxuwxuwxuw{xz{xzwuuusszxxussywwyww{yywuuxvvwuuyruozxs|vrwvsuwtvspryvxsprqnpxsurxwqv{~||t||w{}xqtwqrvqrvqrtrrtttsprroqsprwtvpmonkm{vwrjkumnrppnqpsuupppqoosmnmhitlvvnynfrvnyskvphrrmotoq}xz~y{{vxzqtwpsxqtmjlhegqmruqvpjorkpukqvotpkpkglpkplhmmhmmlpiejrmrxrwxqvtmtohopiphah^W^e`jgbqlgvnbrh[keUfb\akejmglsmrb\a`]_ijjfkjcih^^^^\\_]]][[_]]_]]\ZZZWYc`bXUWPMOVSUWNQTILYPSSLORMORMOMJLROQRJNSLOPGJ98:4/1A:=F;>I;?@AABAKFHKFHIBIKDKQISSLSMEL@8?RKRVOVLPTIPSDKNRY\IPSMRUNMONMOUTVWVXYXZZX^ZX^XV[_]c\Z_YXa\\a\[_jimifhfacd^ja\e^]a_aa^ca_]cb`fdbhfdjjhngdfmkkdbbgedcaaeedZeeZddV``U__Vaahcde`agbcideb]^likc`bXUWXUWZWYfcee`bgbdfacnikjfh`bcjlmfhh`bceghlehnehpehseisdhodgjfla]chdja]cd`fgblmfntlqrfiqbfkdggbdlfhlfhrmomfiqdfphinijbccglkfeigfjedhjimfeinikqnptsu}{}z||lvzyq|}|qt|jltpoxdgliklolnhttZpnesrolntqsnkmliklikihjnmoomomlnonpqstntthmnhmnglmejknmqsrvrpvkhqvr}toxokpxtvwtvtrruuuptukopdhiptuptutttssswwwtttwwwwvzomssqwsqwwu{xw{lnowyzvxyqstvxyjvvjvvnzzo{{p||zorv}vy}ux|tvzuqstrvtw|rw|nszx}~|~quv{z|srt{z|{z|zz|wvxzwyxuwzvx|y{|y{xv~vtzzx~yxztsuwy}wx||}tz}qy|vuytswxwy}}}|||sjmpiltoqzy{txxrvxtxzvxy|y{~wz|wy}z||xzqnpxuwunqwrtxwytxyw|}z|}xz{x{{vxywyzuxy|~uvzvxyoqqrttirqovv~ux|ruyxw}srx{x~xw}{x~rsynv~pv{qtxttvxvxz}|y|rwvz~suzssiabvnowxmhirpppnnommxvv|zz{yyvttwuunllrpppnnqoorpprpptrrrppljjkiinllrpppnnhffommommpnnsqqpnnqooommsqqnllnllommrppnllljjlllooonmmsnovpqnllsssqqqtttppppppoooooopppoooqqqtttuuuxxxooopqqkssivuhtthtthttkttuuuwwwsss|||tttrwvputputu{zrxvqssqssprsnqroqurrxuuytvztwxipognmoqq}~z{}~ww}rtxsvwmrshonksrs}}s}}jttkuuoyyfsvhsvpwwz~wyy{|x}xwy|z|z||v||tulx|r}q{p~}tsww{|t{z{yxr}{~xwy{z{yuz}v}vy|z|}z|{z|{z|z{vw{tuy~~}zy{{z|~}|{}~}}{}{}|z|zz|~zwu}yzy{}~x}|uzyqvuswxorw|||z|x~vz{z~{v{|~zzz~||}}usstsuzy{|{}srtrqsxuwxuwxuwzwy{xzvttywwwuu}{{vtt~~wuusqqywwwuuussxq~uozxs|yuzzvxwuuussvttsqqommytu~rxrmr|ptyz~~t{~w|}{tmpyqrwqrvqrussvttroqtqsvsuxuwifhroq{vwtopuopnmmlqplnnnppmmmponmghumwkcnmepmepldoogqnikmhjmhjxsutoqypsunqvprroqkhjrnsqmrqkpslqukqrkpnmqkkolkojknjimghlnnrnmqrnstnsohounuwqwkdjjcjjene`ohcrg\lj]mqarsmrpjolfkgafrlqe`bbaa]``]a`YXXa\]_]]][[_]]_]]\ZZ^[]YVX]Z\VSUQNP\QT`QUVKNYPSVORSNPNLLEDCNHINHIPHH>=?4/1:36D9AA:BA;CB6:D9HCEJEGD=DNHOMEOOGNOGOQIPKCKPFNKORKSV=EHKRUHPSOUXWUWSRTXWYVUWUSUWT\SPYWT[[V_YV]ZZbXX`ZY_YY]_\^a[`d]hfaj\Z^]__]b`fdj^\b`]c\Y_dbicacca`ommd``b__edd`gh^ee`fgbhi_efhdekfgkfgd_`fabebdnkmb_a`\^a^`^[]d_aicfjdgf`cmgijika`bedfcadbaclehnehpehseisdhodghcia]cc_dXUZZV]`]ee^gulsxhoxchmcengjkdgkdglegqhkwhkpfhmijill`gfa`dhglljonmqkinmiktqs||}|y{|~|~wyqjx|ix{aos\kmxz^`imnwigqqszwyylijhtsYnlivufceroqvsunkmkhjjhjmkmkjlihjkkllopqvwqvwmrsjopqvwooronrontpmuspzvrzojouqsvrturrsrrnqrnrsjmnostruvssslklklloppjkknnrsrxrpvnmspmsww{mppqtuvyyvxywzzmxxnyyq||mxzmyzsx{hkoux|uw{tvzzz}{}}~wx|tzpz~v{|y~rwwv{|v{|tvwssu~~|}~ywytsuyvx}z||z{wtvvrtxv~xw}xw}yyzvwxswyy|{y~z}xt|~|~xvywz}vyyuwotuuyzuz{uwx|y{x{~y{}zvxywy{y{{svysuqnpuuwdghw{|z~swyvz|twyy|~stxqruuxyqttpsrjvtnyxsz{z~ptxx|qw{y}sy}x}ouzw}qv{ruxqprxuxuxrvy}vgkosynpxop}sundfxzldf{yyxvvywwommvttxvvnllvttzxxqoppootssqppsqqtpqspqpnnmllqoorppoklkhhpnnqooxvv\[[[YYrppqnnmkkpmmroospqsppolmqmnjllrrstsssopsnojhifggiiikllnmmpooooopppoooqqqtvvooovwwonnvuurvwippmttmttmttostrrrnoorsrvvvvvvpvuottovtottntsntslqpjnoimnknrqpvyrwtoturttuttutpssvwwprsikovw{zszxrwsoqrqrttty~}s}}zozzozzq||_sueuuq||{||zzz|||~z}|w}|nyyvoz}q|vq~txw||}r~|~z{{~{}~}~||~{|~{|wx{}~~}|~zxz}|~~}|{}~|{}~}zyvsy|z{y{z~}|~|y}~|ux|~~}~~tx}tw||}{|zxw~~}zsz{lst~~yvw}~ussussxwyvuw}|~{z|xwyxuwxuwxuwwtvzwyxvvwuu|zztrrzxxxvvzww{yy{xxxvvvssvo{xr}xt{uqvolnrppwuuusssqqxvvwuuuuyonrzy~|{~}unrxqrzqswqrytvwvuqnovsurprsprnkmsprvtttnpqkmonnjpokonhkjlnmmmmgeesltskvsjvxp{jbmneprmormorno{vxvqszqtsmotnpsosvrumjnolppkpqjowotslqjmqfimgjnilpfhm^`dqtxooskhmjhmnfonfomfng`hphqrmwhcrketj_pl^nsbskekhbhjdilfkf`ed[^kdec`aieee_af^__]^][[_]]_]]\ZZZWYZWY]Y[YVXWTV_SV\NRaVY[PSYPSVPRIHHDBBPIKMGIXOQ,./768?:<>??A::<==?DDFFCFJEGC>@A=CKIONJSLMV@NZPW/12657;68>58B8::79879FEGBACJIKEBDHCEFACHDJIGMGDMMNXD@KICNL>JRANXNVVOTOHMRKP^W\UNSUPTPJOPLQMLPLMQOQU]X]dX^eW]j^da_a]_`Z^_X^_W__[^bcYef]gd\bc]^d_^XTYkimfeiNOS[^ba`ba^`gbdhadh`bf_bacd`bcbdddfghjkhhh```gdfgafkejc`bfff^^^ZZZXXXdbbpehqfik`cmadpdgebdb_ac`bifhdacgabmefrgiobdn`bndfgfjkiofeodfnhjtgkldfggfhfcehegohmwpuunsjdhtmrpjookpplqiejkglkglc^`hegonpbdeoqrgmnxyy|{zxw}vv|xw}rvw~txyptusvzmpt]`dceigjnilpjkonmqjfkeafiggpnnsqqommussxrttnopnnhjjjpolsrimncghgklostmqrmoomooiklklpoptvotynqxmpzorzorxoronpxwypoq~}poqqrvmnrmpuwzv{ehmnosnosmnrZ[_uvztsupoqonputvsrt{ru~vy~twqtxz|}vtvyxzxuw|wyyuzzv{{z~vw{ux|~x~qmrutxzz~zz~s|ssz}uz}lkoutxyx|{uzztz}v{u|v}y{xx}~z~tvwxwy~wpw{ys~ys~tnytnyuprvsuqprvxyuwxutvutvxvxyxzxwyxuwwpswrtwvxswxv{|z}~}|~sqs{xzyvxlrwitxpxvw}typutputr}vpztmzrtw{tw{yyzxwq|ywy}}}|{{yyyyxxxwxwsx{w||zv{xtxvtvvtvvtv|y{nkm{}}uxvuvtwxv|zyvtsrsqstrstrrsqstrsqp|zyhfesqptrqonrz{lpqkopupqxprzrstnpmhiwuu~||vnooijztunllsqqnpprwvrpprlmuhjvhjh[]bUWtfhwjlylnpjupjuqitrhtthtkjqekmmooa_armopjjrmormoolnnmomoppoqnqrfppfrrlpqgijrtuprslnokopwnvvpuvptuostoptoptpqumnrnoslpqpxvlvvqwxvuyupvzx~nmqdffqwrrzsnvuu{zlpq{{yuzxw{vuwgiilnntywuzx|{}{z|zy{|z|z{}|t{zbwvl~}q}}r~~vy~lpq|~~}z|}z~z~u~}w|}x|}z{|z|}vuhuukyxtigm~~}q{unz~tt{~ww}nntzzzzvv|~}y~y{||~|~x|x{{||}|{zy}xz|{}~~~wyzvwu}~|wxvuvtwxv|{}~|~uz{s{{y~~}tqzvs|vr}uq}yvxv|wvzxw{zy{wvxvuwutvutvutvyvxxuwwtvxuwxuwzuvzuvzuvzuvzuvzuvzuwzuwwrtvqsvqs~rxrxrx|lrnuzsvvttvttvttvuttrrqqtpnr~|w~~~}z}}~~~~{t{pjoointnsnhmqkpplrvrwsprtqsljjkiirppmkksqqnllpnnkhjroqsprroqtqsokplhmhdiqmrokpnjorlpoinrlpqkptnsrprpmoplqrntqluadichjadhabfokpmlpfimdgk^aemptjmqsmrrlptmroekrflrknkfhkfhojlgbdhdhigokdom`ns`rhVfj`ljaki`jjdhibgi]ch\bcY_f_de_dgaf\X][W\`\`[W\YUZVUWTSUIHJVUWVUWZQT^SV[PRXMPZOQTJOLJJGE?G?IG=MSKR466657:57:14@68?<>:9;CBD657GFHDACFACJEGIEKCAGB?HOPZJFQLFQM?KO>KYNVXQVVOTZSXXQVVOTVOTOINIFJKJNRQUUVZ_Y^aU[_QWbV\b_a]_`Y^_Z^_Y^_Y\`aWc^U_b\``ZZb\\e_djfk`^c`_dWX\hhjfcegbdidfibegad`bd^`acef\^_eghfffcccfcee_dlfkebdhhheee\\\[\[hffnehpgjf]`lcfmdgfcekhjgdfdacebdkefnceregvikugin`bedijilddjdenhjteij\^_dcegdfhegmfke^cf`dngld]bf`dsotrnsjfkminokpmhjjgihgi_absuviqqxu~u~mu|z~|~~}y{x|}ptupttptumqrruytx|losehlcfjklpjkoplqminnhmommqoorpprppnllmghvpqpnnmnnjnmpvujopnrsimnnrsmqrlnnmoojlmcdhhim{tywnqrjmrilulotmprqsqpronpzy{ihjtuystxqtyhksinwknsqrvqswoptqrvmnrwvxwvxonpqprqprtmp|wyz{y|tw{}wvx|{}yvx|~wsxvrwxw{uvzvy}~x}wsx}|{|{|py|txuz}|}wvzyx|}y~z~x}w~t{~ovysz}ry|y}~|~~vuw|xzvqwztwq|smx|vuozsnptqsqprvxyuwxsrtsrtwvxutvzy{~{}{~zuwwvxrvxtzzvz|{}~vyz|xzyvxv|lvyrzijt|~tsxvputrzxoysnztvw{zz~zw}x|~y{{{z{|}~xyxuuvrwyu{~z{w}xtyxtvxtvxtvroq|y{wyysvtuvtvwu|zyusruvtuvtstrtusstrsqpxvunljsqprpodcgnrsmqrvrr{styqrtnnsnoqooljjumnpjkystussywwjllafekiiqklregregwlnvkmvkmxmovkmpjunhsogrqgsrfrkjradikkojgirllqlmslormoolnnmoonpmlnnpqrwxirr_kkimnoqrnpqnpplnokopkuumuunstnrsmqrnnroptqqunnroosoturzypzzlqromqqjqyw}srvlnnoupowpjrqzswxzuz~x}}{wvxjllnppqvtnsq|{}poqzy{zy{}|~isqy{y}jg|}myyiuupzzu~~x}~ost|{}|~}z~y~u}}w|}w|}w{|z|}srsxrzx~{yxv|pxzgptwt~~ux}}}|}zy}~z{{}~y{|wz~x{z{~}zy}wyzy{|z|}|~~vxy~~|~}}|~~tyzowwx}~{z|wt}spy{w{w{wzwyw}wvz{z||{|wvxvuwwvwwvwwvwwtvxuwyvxxuwxuwzuvzuvzuvzuvzuvzuvxrt{vxsnpvqsztvwmvoys~kvxqtvssyvvzxxzxxxvvqptllpwy|}yz|z~yxrwichz~rlqqmssotnkmurtpnnrppussqooljjhfffddpmovsuurtnkmjgilhmnjprntsotlhmpkqrlqichtnrrlprlprnoojlsmr{ogqeekbeiefjcdhhhlkjnehlaeibeiilpdhlsmrqkpvotpflsgmsloytvsnpmhjhcee`enhrldnm`nm^ljWih^ji`jh_ijchlejdX^g[ah^db[`d^cc]b]Z_\Y^`\bWSXUQVSRT`_abacVUWZY[_X^dZ`XNTTJPYOUSLQGGGMOIUQZICRLIO8:;:8::576-0?47:79.-/GFHIHJ768FCEMHJJFHJFLDBHIFOJKUJFQKEPPBNP?LTIQVOTYRWYRWZSXZSX]V[]V[GAFPKPVUYVVZ_X]bTZaQXgY__[][Z\Y[\Y]^V[\WY]_Ua^U_b[`\VW`[Zhadf_bolmc`bdcdZWYdacifhfacgbdhce`bc^`ajlmTVWdfgiiiooolikb\agafe`debdnjm\Y[b^`hegibekdgaZ]ngjohldacmjlb_afcetqssmnpegj^`h[]`QSi\^edfedifflbejbemdhiacdkjljgikhjnglmfkohmpjnf_dsmrrnsc_dc_dnjnminlgikhjhgi`bcqstlrvyyr{zsy~ztpvtpvorv|wz~ux|jmqrsw~~yy}iimghlooskmqjimlhmpinsmrsqqnlltrrljjkiipjmnfjqnqmlnrsulnomopsuvprsmopprsnnnooousu|{utxxqvrilvmptjnwnqxqtrqsrqs~}}|~ihjklpmnrnqvsv~inwrrx|{utxnmqxvzwvzvtv{z|poqqprqprmhjokm}|{{uwtw{qstnmowvxtqs~wsxvrw{z~xy}vy}ztytpuyx|yz~zz~t}p|~yv{~|}~}yz~wx|ytz|y~zv}v}ry|lsvnux{}~~~wtv}z|xtzws~yuws~xu{vsupoqvxyuwxwvxwvxyxzvuwxwy{xzz}}wvxrvwsxyszzy}~{}~}z|{xzy{rx|jjv}stxypttpywoxuo{uwvzyry|s}wx{wpqxrs|uv|}~yzyvxzwyspqvsuwtvxuwxuwxuwurt|~tvvvywuvtyzxzxwywvz{yuvtprpstrqrptrqrposqpsqpqongfjxy}swxrvwytu|tuvnotnoqlmpnnommskltnovpqpnndbbgiidihiggpjk{npuwwopxpqumnyqrzrsnhtnhsphspfrpdpigp`dhhhloknpiltlmslosloqlnpmoonpsprrstjophppnxxfjksuvkmnlnokmnkopgqqnvvkpqlppjnplosnqupswmptnquxp{yq{{w|}wovtrxtswprrkqlqyrozxszyrvwokp|v{xtyutvqssprrotrsxvzy{zy{|{}zy{{z|ozwxjmo{{issrzz}mqrx|}{}~||wu}}tv~~y}~x|}x|}z{u~t}~}~|yw}yw}rx|\bg}s|{x{~~yy||oou||z{~y{|wz~x{vw{nosvuy{z~xz{y{|vxzz|}xz|~~y|z}|~vuw{z|vuw}|~vxyv{|s{{w|}zy{~|yvrny|xws~vs|uszzx~wvzzy~wvzvuywvzvvzvuyvsuwtvxuwxuwxuwzuvzuvzuvzuvzuvzuvtqs|z|yvxxvxtqs{mu}owv~pxytvuuu{||wwwsssuvvklphhltv~}}x~{z~|~|v|x~x~xrwnhmysxhbgpjosouqmrvsuxuwsqqqoojhhrppvttnllywwtqsqnproqnkmnkmolnropurt|y{dbcqnprlqd^cvpurlqpjoslosloslq{sz}t~fdjcdhlkotswmlpmlpfgkfgkfgkijniimpjopjopinkagnbhibelgilgiuprvqslgjrkrkcnmamk\jhYgi_kf]gkblibgohmeY_i]cj`f`Y^`Z`]W\`Z__Y^d^cWQVTNSWTVVRTURTZWYWTVXQW^S[XMUWLTXMUVNUIIINPJKJS=;JCEJ9;<<;=8355,/>36=:@EAGMKQA>GABLKGRICNSEQXGTPFNSLQUNSSLQWPUWPUVJPVLRNGLVNT^X^\X]ZPVfV]m\cgU\bZ^_Z\WVXXWYZ\\SRV`Vb`Wad\bc]^d_^i\^j]_g\^ZRS\UV^Y[d_aa`b^`a\`a^bc]_`acdcefcefbdeaaabbbhegkejichf`ehbgb\ab\armqmhmgfhhfhihjedfkjlolnkhjroqkhjebdfhhcfeeffdcclhhommiijiiicefbeibgj{jlmdcekhjc`bkdig`eg`elejwpumgltpvkglmintpuplqlgidachgilnoiklp{yrnyq{t}{v{x{rw|sw|uwqs{hjrzy~rqunmqlkollpkjnqmrmglmfjwqvukqwuupnnwuujhhnlllfksmrsmr{ty~w|hbghgilkmihjsrtrqspnnqooroqlhmtpuxrwuprtoqvrtyuvrnprrtonpsrtrqspoqvw{ijnorwwzmr{trxwtyxtyyvzsottpuutvutvutvsrtyxzuwxvuwwvzyw}upyxy}tvwyxz{z|vsunik{w||x}xx|{|los|vzwsxtswwx|yz~rz~q}t{~sx{xz~}~w|vz~ttxxw{uuyzxyyv}}vyz{}|~~z~~~}|{~|zy~y{}z|zy{rtutvwzy{xwyxwyxwyzxz{xzunq|wyvuwquvtyzeutmxxw|}ywyytvxr{}zttlkyu{qqtyruynvvrzyp{yruyvx}zzyvzttrtuuuqppvvv{zzuttvttvtt}{{zxxpnnxtvxtvxtvwtvurttvvvywxzx|}{vtttrrqrpqrptusuvttussqpsqpsqpsqpsqptswstxostjno|wx{stsklmghfabussussqijtnoztuusspnnikkejikiiqkl{nppdfnllpnntrriggommnhtnhtphtpfrwkwlitplwnfpphouioykqwloulosloslormotprtprrrtjopiqqlppnppnppkmnlnnlpreoodllkpqquvrvwjqtelohorhorjqtkwwkywhttmqry~}pxyw}qptjllntot|uk}ykvtmqrxrwu{upurqs{}}|~~tzx{~ttvyxzutvwvxwvxotu~y~{f{}hx~rz}v{|{z~iklt~~lvvp||p~}rhtttq{{v~~y~z|z}y|~x|zx~~~|z}|{{zz{}~~~zz||vv|~~zy~z|}z|}}z|}vy}wz~xy}{|{z~{z~{}~uwxuwxvxzz|~z}|x}{w|zx}{{|}{z|~zy{~{z||~t||sxywvxyw}|y{x{zvxt{}zyw}zx~nktur{vs|wt}vs|urtvsuxuwtprtqszuvzuvzuvytuytuzxxvuwrqsrqslkmonp\gocmvwt{syx|}|~~lnnrssjllrttehlmrumsz}{zuvwz||z{{~~xrw|v{ysxc]bvpuqmsvrwtqstqsrpppnnpnnpnnb``hffussroqpmonkmqnpmjlqoosqqiggsqqrpppnnrlq|v{rlrqkpsmrwiml^bgY_qyzjuznvtmrrlpnjojkoijnkjnkjnbaegfjposnhmlflslqrhnrfllehgbdlgic^`lgie`bf\blbhpholcmi_kj`lf]gg^hjchkdik_ei]ccY_d]bb\aYSXf\bdY`]RX_TZ^TZ\WYZUWZUWYTV\WYVNYWN[TKXULYULYSIUXKMUPKWPZMIXEGL.01435>8:?69B8;<9;>=?FEG:9;<;=846E?AICEFBHA?EC@JABLKGRICNRDPZIVPEMXPUOGMLCITLQWNSZNTYMSWMSVOTe_dWSXMBI\LSfS[cQYf_ca\^ZVXYWY[\]QNScYekbkibge_`b]]hZ\eZ\f[]VNO\UV_Z\d^a^]`_ab\`a^bc_`c^`babebdfaceeddaa`gdejdie_ch`fhagg_fbZbjbjd_d^`adfgcfg_bcdghc_ahdfecd^[]`]_ejjbhgafedffghhhhhlmliiicfgbeibfjehicegcbdlimgdfhbfhaftmrlekyrwlfkifklimrmrlhlhchkhilikecfhjklopt~zus}u~ryluz~t}wz|su}xyqt{egnxv{ljnqosmkpnlqpmrrmrpjojch|rxukqussecccaaxvvmkkrkqrjqrjsqipzpykdjmkmnlnjhj{z|rrtrmnsnouoqvpuvotrlqqlmtopidfgbckhivuvqpqhfhpoqrprpquqpukmsy}iowspvztyzty{tzvpu{w|wvxwvx{z|vuwwvxsuwtwxvuz|wzu~vw{wyzxwy{z|{wy|wy~z{x}yx|jmq~x}}ttxvv{xz~rz~s~u|v{~xz~{|uz}y|uvzuvzxx|u{~{yxt{~y{z{y||xy|{~|xzxzvxqs|pr{vrt}z|}|}|~{}~wvxttuutvxwxzy{{yzx{|wywwzuxytz{n}|juvzxxz}xzy{usqmjxt|qqsxqtxovvszznywrwzrvzruzwv~wt~xwywyy{||tvvqrrwxwywwussvttpnnqoovuvvuvwtvyuwurtqsrsvswxw~wuturqnomqrpvvuttrssqsqpsqpsqpsqpsqprotrrvpstmpqxuuvoptlmuopkegqnnpmnslmkefztuussttslnngjjmkkqkl{nqkacmmmpppooonnnmmmoitojtpitphsrhsuozqnypisnensiowkowlovlovloslnrmoupquqssrtkopkqqlpqmpqnpqilmlnomqrkuuqyysxznrtmqrjqtjqthorjqukruivviywlwwquv}ymuyw}srvgiipvqt|vk{xnywrvwzymsysxjikkmmuwww|zsxvlmnvvwqrsuuwtuv}vpvtw|gx|jv|qvzrxyptvx|~zx{yyr~ssfrrwq{{xu}~}{|{}~y|}z}~}}z|||z|ttystzxyz{y{yz~}~~}{w|~y~|y|||~wz~wz~xy}yz~{z~}|~vxyuwxuwxz|}x||x|w~|v~{z{|~}~tsuwvxtsu~}{}~w|}krs{uuwyv|{xyv~xuzw|yrp{litwtzxwv|khqvt{xu~wt|vs|wuwzwyywyrnprpryvv{uvzuv}xyzuvvttvuwutvutvsrtrqsiqymr{pt|swrt~}~lpqqvvorsorsceiqvyrw~qyzxyyxvx~{v|wy|}}tnt{v{~y~b\a{tytpvtpuqnpxuwnlltrroklkjixtuxvvzwwroqolnnjlqnppmnqoosqqgeeljjrppnklrlq~x}rlqqkptns{nqvhltdk}luyhryltumrtnrnjoijneeiljnjjmdafbaecaegafnhnslqpflpekmfjoimsmplfihbeidgpflqgncZbf\fkbkmcojajiajd]bb\af\ai_de]baZ_]W\^W\h]cdZ`[QW_T[_U[]UXZQV[TVZRU]UX]T`WN]VL[SIXVL[WLYZLNRLGLEMICRDCI435102:9;<:<98:>=??>@KJL=<>>>@768KHMFBGJFK=9>HCIDFNPMVOJSQEPSCNM@G^RXVGMXDK_HPbKSbNV^OUYOUSMRVRWXSaMDSVN\ZO_ZN^ZRY[SY[TY[TZ^W]\V[_Y\c]a`\^\[]][]\]_YY[_`a\\^XZ[_^^ba`hih\]]]__kmndbic_ke`nd`jb_elbcmbgaU\ndgnecebafefcbcecfdbfccgihjgfhedfcbdihjcbffeia]bichlfklnobfhfjkeijdijbdfjgikik^]_defeijjhndbhd`fibingnaYaplqmikljlmijbabbikW^apek~hpvelfheooofihginruy~xv{y~v{ntkr|u{yy|vz|wy{prt}tzpekwlr|qw{ouphmqjoqjopinunstmrvtthffgeeommmkkojrnismhsojtngrogqmehrilrlosoqlikpmopmopmoomnpmookpplqvrx{w|hejwqvwlpphkqkmsnpuprxqwqxpkpr{nrvvoszrtyruvqs{wxzxyrtxstxwx|tuyz{vszuq||}stxvxyruvwz{z{|z{}yz{z|}y||~tuvwzmpytvtw||zzvysyry~uy~|v{}z~yz~vz~qwzrswrtxwy}{}vx|}|x{zzyz~y~z{ww|stxww|z{wvzutx|{zy}}|{z~srwonrvuyzy}xx}prxtx}z~tx|y}{{zzzx~tqw~vywqqjyt}o}wvz{z~ooqsssssturtx|ztw{twwpsuorvpsxqtxrttqtqnpurtvsuzwybrreqqkqrpqryvxtnpyrtysvyuvmjlgbcvxt||r{vouupqtttsssrrrqqqssswnqwnqtnqmopmrsjnoujrvlsynurhoulslmnjlllnmuxux|wpnpomopnnpmmmji{ywmnlnomlmkpqnqrppmrljpijsgludmuejqhkshlqgknlpqtuvtnmsnmqllupoqllwvtopnrusousqvtmsroutmsrjpojpnqwvmrqotsbgffljmrqnstkpqkpqotukpqlssmvvhlmiegnhmpjtqqt}koj{ykpopvu{squzqwiceqqpmppy~}vwwwvvrwxqvwrvwrwxrwxy~lqrotumtvpvxnnxqp|xvzxwv~z}~{~nzz}luxtztzz|{{}{z|vtvyvx|wy~}~yx~z}z{z{z{stxsuyu{~zxx~|w|~}yy}}|~{z~|}yz~xy}xy}pquqpt~zzy}wx|tx|sxx{ys||r~}y~|~yx|wvzsnt}vxyuuwxuwz|z|}xwzqtvpwxxrwyy}z~w{~vz|onssrvsrvtswwvzvxywxyvxyuuwwz{xuwtqsxvvyxvnmjvtsutvtsutsuxwyqprrqvwv{|{potzz~{w{xpkxwtrmyuq|rouyt}wq|tp{wx~y~zw{xy}~xvsuyrrv{z~sotwsx{uxnikwrt}xzojlmhjqjmsmpf_bicfunqxjnylozmpsknumpsmproqlikkgjvsuroqrlqqkppjopjopjoxuyxsxhchnimqinqkrnipqmsnjpmhnokqohosmtqjqqkrphpwrtpklxsulgikeglfne`jfakkfpc^hg_htilvknm^cn_dsbhlild`cheh`\^][\`aedcglfkg]cj]c`SY_Y^WQUXPY^U_WNY\NUXJR^QW[NRmac^PW\NT[MS\NU\NUXKRLFIMHJE@CHBFNJM6466570/176898:;:<>=?RQS@?A?>@A@BFBGFBGIEJFBGKGLADIMLRMGNSHPQDLQFL]QVUFLVDK_HPaKS\KR\NTYOUUOTVRWVQ]MJUWP\XP\[P]ZSZZTYZTYYSX\V[[UZ_Z\`[]]Z\^]_^]_[`aVZ[Z_`Y^_\`a^]_^[]feh[Z\\^`efiebkd`ld_n_[fcagncfqeldW_nbgndcfa`hffc`bc`bd`feafhdfdackgia^`qmoedhcbfb^cnhmpjoiikbghbefdhjehiceflhjmjlonpnpqimnoms`^d^Z`hahqjq]V]tpumjlkhjjhhjjjcjm\dgh^dgoucjghfwwwbdeilpruy|w}w|x|vz}{v}{yrv{vzvxymop|rxrflvjppdjeY_tjpmfkqjopinslqrjprppdbb_]]kiiiggojsmgrjdomgrjdophruiluloqjmrmopkmpmopmopmopmopmonjoplqokpzv{iejoin}ruh`btlp}xz|~}w|t{snsdpr[betopwpsyqtmhjytvvsuvw{pquwx|nosvw{vtzyuplxlhs|rswprs|~}y{|vxytvwwyzvxyz|}y{|{|vwwxvwyyyyxztzr{|{vtxrtxv{~nuxoptqrv{||}wx|zy}}y~~x}xty{|x|}~yz~yz~uvzvuyutxyx|xw{yx|utx|{~}zy}wvzxy}ptyquzx|y}}{{ywu{|xvvuumju}t|p|fegvvvrtu}~nln~z|z|ytvvqsuprsnptoquprwtvzwywtvroqqnpetrdqqgoonoprqsrmovqrvprdacifhhcex{v~xoyunssnotttsssrrrrrrpppzprznrunqnppmrsjnovksynvt|u}sgooqrlnoprrqtrnrlmjlpmopnntrrrpoqpljkiijhlmkqrpstrrnsnkrjnremtbmufjrgiqknsjmqnrsrttrnmqmlqmlsonokjutrrrpz{ytwuousw|{putnsrjonlqprwvrttoqqfhhjllqssostlpqlpqptukopmrsnrsuvwplmtnpzty|x~vrwmqlu}sprrtzyuz{ihlsjp}tttv{ztyxttt{yyswxrvwquvrvwswxuyzlpqostpturvwtt~xv~|zx|z|{y{|z|}z|}r~~|ktwu{{}ux|wyz{z|xvxzwy|xzu~u|x{zz~zz~zz~~|}w|}yv}y|}|~~||zy}yx|uvzxy}xy}xy}rswtsw|x}}{z~xy}vy}y~{x~u~~yz{~|{}|~y{|{~{~}|~swxlttt{{rzzowws{{t||uz{nmqsrvtswtswvvzxz{xz|wyzwyzqstxuwyvxsqqvttyxt}{zwvxxwywvxvuwjikposutxwvzqptvuynjuuq}vr~vr~uq}sozuqwxs|xr|xr}u~{~}}vvw{srvqmrwsxxqtohkwpspilrknunqxorwnqjadi`cpgjxjnykoxmpulotlornproqnkmpmotrtroqqkpqkppjopjopjoqptrrviejoinpinlfmiekokqmiogcikgmmfmpiprkrrjrmfme`b_Z\mhjqlnlgisnwnhrrlwnhsicnf^hcX[tfjiZ^k\`sbfoln`\^dac[XZ[XZ``d_`dnhnc[`dV\`TZVOT\UZVMW[R\YO[YITYJRTFLVHLdVZZLR]OUYKQZLRWIOUIOQLN]XZKFHHCEMHJ768213.-/546:8:::<@?AMLN:9;;:/.098::9;;:=?:9;A@BHGIHDIJFLA=BGCHJFKIHIC@BKGHPILSJLMHNSLSRIPRDLXIQ[KTL?EUJPXPUXQVVOTTTYQQXRPUWS[YRXXTYXTYXTYROTSPU[V[`Z_`Z_XTYKJNPOSXad[dgIRVIRVZcg_bhUT]daj]Zcfajd`fc_ec]giaogbka]bl`gi\ehZeh\cmbcc\\ohikbeh`dkagndjncfh^af[^lbeqfikjnhgkc_dlfjlfkkgigdfokm`]_jfhlhjjgilikgfhceffjjigmigmeagqjqxqxjcjgchgdfifhnllooo_hk_kmqjoiqvfmgggrqsddi^ag}x~{uzz~|zw{w{w}sw|rv{tvwprsukquiosgmymsx~pflqjopintmrrkpqjoommkiia__fddkiikfokepmgrpjuxr}umwykovkn|svrknunqpmopmopmopmopmotpu~z`\avrwsotrlqujmypsvor|wylgiqns~qwqns_lngqtmmotqswtvxrtxsuvtvyz~mnr{|ghltuywu{yuso{tp{zwxy}y{|uwxwyzwyzy{|}z|}prssuvzyvuwvwvwv{{zzvxtzvsx}rntwz{tuyefj}~{|{z~zv{{xy}sx{uvz{|bdhopt|}zz~yx|utxwvzutxvuyutx{z~vuyxw{stxptyrv{ptxy}{~z}yuqwzu{yu{tx{qz}tq~nvyqtxrqupptvvvmmmt{{~hlmtvwstvvsusprroqroqroqsprvsuwtvvrttprvsukttfnn_hglprjopmqrnrrooqutvsrtyuwvy~v}zr||uzusstttssssssooonnn~sv|qtunqnpqjopmqrumtskrvmtrjqognnoslmqoqrprrpsqtqskhjnlltrrxvuutppqojkimnlnomlmkpmolkphmpenrbntgjrcajnntuvzrtuoqqqonsqpusrrporpowrqsnmzwv}|tusoqqqrskmmstuprrlnnoooqqqmmmmmmqqqqstnpqnpqmnoqstomopmotoq|qt~os}pt{uzz|sqq}}zvzutuuqttnrszv{zou}tw|}uwwsuu||~yzuvwtvwtuvuwxxyzyz{rstrtutvwyxywwuqpz{}~suv{}~qstwyzxq{{w~|wyux|wyzyxzyxzzwy{vxt}u|{~xy}xy}xy}xy}wx|v{~ry|t|~v}zw|zy}{z~~}zy}wvz~}vuy}~wx|yz~uvzstxzy}~}y~~}z{wz~{xz}z|zz|}~w{|ux|wx|}||z~|x}{}y{|zwywzx{{z|}iqqo{{lxxmzzp||t{pptrquvuytswutxuwxz|}suvoqrprsyuzxtyqnoropfdcvtspoq}|~jikqprrqsrquvuynmqutxvtxws~tp|zvtp|qmyvr}souxs|ys~ys~{~}}}}x~vz|y|tuyqptokpvrw|svthlrfipdgympvypt|nrximqcgvgkvmpulorknsmprnpmjlmjlpmosprjgijgipjopjopjopjopjoabflnrlkominoinngnkdkwpwohorkrngnjcjibilelohophprmonikpkmjegfacnirb\ggald^id^ildnqcgufjudhp_cp\aWRT^Y[e`b`[]c^`ccggfja]b_Y^_X]_W\NGLWPUZQ[XOYUKWYGUfVafW^bTZ_QWVJPVJPYLRZMSPDJVLRQLND?AOJLPJLGBD,+-10243565798:;:<<;=<<>@?AGFHEDFC?DB>CC?DOKPIEJNJONGLNHMLDJQJOLIQQMVQKTPGQTHS]OWf\bZPVWPTUOTVPUX]^Z\^RTUWSWURTYUZYUZVRWQLQVRWZV[`X`aZa[W]\Z`_]cZcgS\`dmqU^b\ei`ckZ\dlirc`jh_jjbihdib]frlwgcjgdgocioalfXdh[claclacodfpcgcX[sflobhsdivgkoael^brdhlkocbfminnhmoinkdgkeg|twvprg_bf`cifhhegfegdfggklljpa_eWSYg`gkdklelhdjjfhjfhecchhhfst]jlaZ_r]ewioihjnmqcdhdglxzzyou|v{x||~wy}z|u{nrwkotsuvrturhnuioxlrthnthnvlrslqqjoslqtlrqjoywwnllusssqqljjmhqlfqjdod^if`kkcmzlpxlovknulorknqnpolnpmopmospruqvplqxtytpuokprlqshkpgjtmpwrtrmotpuzntonrYfhzorsstuqprvsu}vyrmo|}wx|yz~tuyrswtrxtp{vr~~zyvddhwyzy{|suvz|}{}~qstxz{vxyrttz|}wwwvzyut~|{ttsstvu{u~u{z}pw~{|~~z{}~zy}~zxrw|x}|}z{|yz~~z{zy}utxvuyyx|xw{tswvuywvzutxxw{qrvtx}rv{uy~ptytx}}yyu{vrx~rtywjxviwujutotwqpttswvuwooowwwu||zlpq}~~tqsqnprnproqspruqswtvurttrturtroqkpqkopmrsjrrjsslsslrsnrsoqrqprroqzsvyxpzvrwtttttttttkkkrrruuu~rvynqunqprsmrsjopvnuslstmtvovwpwmmsjkomnriklnpprorjgikiipnnpnmwvrstropnnomopnpqopnnnmoinqenrbnrjmua`iqrxtuyoqrmnnnkjkihnlkljipnmzqrwoozutwts|}}}uwwnpprttmoorrrmmmoooopppppnpqoqrorr_abprssprysu}twvknzkoteirkn~y{vttsrpttrvvvwyy|~lgluionehgbcxzzqrrupq|wxtvwrtutvwtvwsvwuwxsuvrturtuqtunmw{yusxv|{wyzz|}xz{z||t~~x}~y|svzuwxyxzwvx|y{z|y~u~v}ux|xy}yz~yz~wx|wx|ty|qx{sz}uz}yx||{zy}wvzvuywvzzy}|{_`d|}yz~wx|zx|xtyxtyxw{yz~vy}}tuvtvwrvwvx|stx|{yx|}~z~}zy{xuw~}lttyjsskuuqzzsyzsrvtrvutxutxutxuwxwyztvwprtiklvrwuqwwsx}z|qoousssrtxwyjikqprwvxrquutxyx|wvzwvzuq|yuvr~okwmiuzvyu{yt}oitxr}yr~}x~{}}~ysy~uy~y|qtxvw{rquplqtpuxpsqiltknldhi`ctjm}os{mqxjnykoufjrknrknnjlurtZY[c`bfcehegpmomjlolnpjopjopjopjopjorvzdeihimnjolhmkdkskrnfmofnumtnfmkdkd]dkdkmfmngnojllgikfhmhjojltoxgalkephbmf`kiakzjnm^bwfjvbgw`eg`cibepilf_bf_ba]b`_c_[`ZV[XSX]V[XQVb[`^U_WNX^T`^MZeTacS^bS[^PVYMSZPVVLRRHNMCIOFLMHJMHJNIKQLNIDF98:.-/324435;:<768>=?<:<@?A@?A?>@B>CD@EA=BTPUJFKH@IE>FH@IF?GC;:=?GCHD@DC?DFBGGCHJ@LKAMJAMIAMOFRHISHITCBLHDORJUSKUUPUTNSTNTTNTVNTMTONTPOVPUVSSTPWVXSRVXW[ZY]YX\ZV[`XbaYc^Yc^[da^gWZb\^f\_gZ\eilt^ehbgh_`c`]_aZ^h`ce`bg`hjblmgmc^_h\dn`lk\ji[fh]`rdfr`dq`dkZ^r`gqahlcflcf_VYofioficbfdbfkglichichpehwhlwimseipbfodgifhlikpoqhjkeijigmfdjkgmkdkjcjngnjfkkhjolnommlll]jl\lnwqvm[bxlrihlfdjjjpqs{z{zx~rxx~~vzwwyy}}yysyosx{tvwjlmoekthnwkqthnj^doekrkprkpohmrkphffywwnllnllpnnnirkepys~mgrjdownx~osw{vhl|psvnqqnpwtvhegxuwzxzokplhmokptpuuqvvpuynqqhk{twuprupronrlbhlmqdsudprdllejknpqurt}vyzsvvw{optuvzvw{rtxzx~uq|xtuq|{xstxrtuuwxtvwwyz{}~wyzrtutvwoqrsuvws~xt}~tr~ttuwv|qz~tzvust~kpzls|p{xy}qrvwx|z|||~}~z~x}{z{ty|zz~qrvrswz|zy}{z~xw{tswutxvuytswxw{nmqtswxy}~osx}{x|{t{wpw|ztz}v}uiq|v}srxhlqcejpntzx|xw{jikpppxxxrturrttrtzvx{vxtrtpoqpoqrqsrqsrqsxuwzwyrprurttqspnpmnojppjttfvuetsftsissmrtpsttrtuqrxqxupywvzqssqqqsssmmmxxxuuu|pt{pstmpnpqkpqinoyu{rntiektpvsouedmiioppvlmqkmnsotpmo|zzywwywvihdffdrsqnomopnpqopnmnnninoenqboqgiqkhqljphgknmosssnpnopnlmkqrpnom~sr}ppzppskk~wwsqqqqqppppppooonnnpnnqppusssrrrppnmorqsutvhgionprqstruytvxps~sv}qtyyvqrvqrztuvsuwuussswvxpinrdjodgnhirqquttztuystwvxwvxvuwvuwvuwutvttvtsuzy{zy{zyyw~|xv{zrtu~uwx~rzzv{|uu{yxsvzz|}vtvvtvzqz}sz}{~xy}xy}z{yz~yz~w|ovysz}xqx{{wvz|{{z~yx|zy}zy}tswqpttswtswpquuvzxy}z{xvzuqv|yx|uvzpswsxyz~w|}v}}ww||~vuyxw{}{w|uwxrtukjlpmoz|{psg`ctsuuyzs{{mpqwyzsvw|~prrtswwvzvuyvuyvuysuv}oqrtvwsuvsouxs}xtzrntvsuwtvutvqprvuwyxzutvpnrsrvutxmlppostp{plxwsuq}qmyuq|zv|qlurlwpjuyr||v}~t~rv{{{}~vuyrnsminqoqsrtnlnjikrpr^Z\rjlwnqypsg^ajadmjlomonlojmn]bbkjlqnpfcelikolnmjlpjopjopjopjopjolrthkofimkjnkjnphovjsrfnl`hqfnnfmohorkrhahpiphahlgilgimhjojlc^`kfolfqicnd^ihbmneop_ccRVt`ezdir[`g]`e\_i`cf\`f\`d^c^\`]\`[Z^[]a_^bb[`YRWd[eXNXVLX`N\^M[^MZ^NY_PXWMSUNSTMRSMRGAFUNSNIKLGIFACNHJKFH212102/.0;:;.-/657:8:>=?A@B98:A@BA>CB@D?;@@;@D?DG=LQFVF=LK@QMETCEPFKTHHRGFPNHRWOYSNTRNSUPUUOTXOUNTPTXTOTQTWSSTQWVXWVZTSWVUYUTXXTY\T^`Yc]Xa\Yb^[d]^e_]f^_fgenmnu]bc\b`egg`^^`Z[jccjcfjbijakg`ef_ag[cqcofXem^jlbeqacp_btaen\aq]do`fjdhjdf`Y\lehkehfehedgifjjehidgoaeo`eqben_drchrdikgiifh`_a^`adghfdjljpmioicjf_elelhdijfipmoiff]]^`ln\jlheiwfmujpgfjgekjirst~yztzynt{v{|wzvuvvyynsxx|rtvrstvmswlrvlqxms|rx|tyqjoslqy~aZ_pjnqoovtsdcciggiggxt|pkupjukeplgqtlt|mqrvxknwloxnqroqzwyfbdfbdhegjflkglqmruqvtpuqkpxmpnehxqtuprsnpqquvms|}`qsfrtbllkrrrtuxvx|vxysustxoqurtxuvzprvtrxtpzzvr}~{||svwy{|y|}wyzz{|tvw~uvwqruprtytws~~z}ywuvvsusynuzrw||zwyx|t}mw|~pquxy}|}yz~wvz{w|z|yz~rvzxy}uw{qrv|}zy~||zy}ttxwvz{y~wvy}z~tuytx}osxw{uy~pty{szyw~{{lvxxq{}ztpywpyzx|vsxigi~~vuvyyzxvxytvyru}wywtvtsutsupoqrprsrtxuw|y{roqurturtpmomlnjophrrdtsdutfttissnstqstsrtsorsntljrttxptsnnnrqqjjjxwwrrrzos|qttmpppqlpqimnzv|routqwmippmsjipdbkddjllpmnopmpolnliiolmwutqolwvuqrpmomopnpqopnmnnnionenpcopjkrliqpotporjhjonnpqpqrpgifpqohihrs|qqxmmvpoxxnllppovuvxwxsstsstrmnrlmxsuwqrtopqprqprrpslkmjiltvwhjknlnuoq{sv|qtww~vvxtt|wytprrnovvvutvjdh|ntwjnwqrxvuwut{uvyrsutvvuwvuwuvwvuwssussusst~|~}|~yxyxvusq}qp|wvtvwruuwyzvxyrvwsxxw{ffl}{qtv}tsutsvqnpmhj}|vz}s{~mtwrvyyz~yy}xy}wx|vx|rx{krvtz~|t|ty|wvz}|{z~xw{wvzuswvtyzx|yw|yw|}}vw{stxxy}y{~vvztqv}z~pptxz~ux|w|}w|}t||p{{r~~sx{}|wvz~zv{wyzvxy|}{}z}pwwsuvrrt{{}wxy||~qqsrquvuytrwsrwsrwtvvvxysuvrttxz{zw~zu}{w}xsyxuw}z|utvutvxwy|{}edfqorzw{sqtuswutxtozvstq}sp|liulitrournuwr|zs~yxz~~|x~rx|{ow{xtx}||tuyyy|uqvkgltrupqrmnppqrjlnljlohkslnvorunq{twolnomojklfjjaeeigijgisprqopnkmpmopjopjopjoojopjolpsjmqgimiinlkptlsukssgpj_gnckoemleltmte^eslskdlnikjegkfhgbdpkmniqe_iidnlgqe`jmdouejq^cydi|glmW\g_bd\_g_bd[^d\_d^c]Z_]\aUVZYZ^XZ^OHMYRWWNXVMWWMY_N\cR`_N[^NZ^NX[QWSMRRKPRKQRJPHAFNHJNIKFBDKFHC>@-,0105.-1<;?-,0467023324:9;?<>=;=9=A?@DE@EKAGN@GFALLFRD@KOJV>:EOLQQMSPJPOHNRIOTFNYFTONZEKTQPWUGO`QT^TWXTUXVWYVWWTYUTXTSWVUY[Z^[Z^XV[\[`\Z`_]c_]cg^dbY_^UZh_elch`[]ebda_aa^`a^`b^`kbelbgmbjeZbj^hf^elbkhagjbfjefldhb[_lbhjbhkbhldifcifcic]dkdkphohfegedigffededcndgladm_ecT\sblq`ijdfhdffcefegfeggdmhflkiodcfdbdjdjmemmelldkldjihm^nqako^bgzu{ohoggnffolmwtvuyu||x}|~z|uwrt{}r~nvzvzliprlrslqolmgkl^eeoqriginjooinrkpoekrhnffhihjpstcghtwxloqhjlgfiporoloqlosoquqsmjkyvxroqsrvrrvgfjjimlkoolnolnolnsprroqqnpplnplnrnprprtqswnsxqvvw{lru`lnhlmorsoqrnpqoprpqrtsurqsrqssrttsu{nwwvsz}uz{tyznsty~v{|wvxmqvopv|xxwyxs{}xwt{z}uzsy~xywv|{v~wu|wx}wy{x|z{y{y{y~srv{x}{z~}|{{xw{yx|zy}yx|wuyvuw{z|{z|vuvutv}xywx}}}~vu|wx|vy}uz}qy|owyvsx{gbguotzsw{sxzrwyqwslqmfkhaf{uzwpubY_w||pvrvzquyrtxrswxvz{{}tvwtvwvxysuvrqsztv|wyqnpsrtsrtpqsknolqrhrrbooallgmmuvxxvxtuwqvvaiigpqgpqgqpirrmikpkmplntoquqsxpp~vwumnvopunoqmo]`cjlpjlpjlpkmqpkpsnsqlqninojourttno|uvyoprt}prsmotpqtrrrssnnnnpnnomoqovvulomnnnqpqpnovsslfg{uvsprqnokiiifelkgnsrlqqputhmllqprstrqsposonstqyqouwqwpjn}w|xrvwqvrrrsssnnntttuuurtulnortumnprstvuwyru{tx{twyruwpsmsrorrqsscbbsqqnnoopr}}uvxstvvtvsqssrtsuvrwxswxhquhxzq{{}xx{{{uuyusxvs|ur|zvyvstxtuyuvzwx|stxutyuuyuuyutwvuyvxy{}}uutuutuss~vx|vy}zu|x{~yz~tx|rx{o}|n{{|x|}x{|xy}z|~y~z{y~y~y{|tuyww}uw|x|ptwtz|sx{t||u}}t||t||u~~w{uvztsw{z~}y~zv{xw{yx|tsxtsxxw{~|~~w}v}t{zxxovsoywjxtr|zousmlnpssorsostmqrrswwx|qrvnosfglqprutwsruvvwqqssrtutvtsuutvonppoq|npy{wxz{yuurs{qr|moygisklvmpxknpstvrmpoilskny|{zzy}yz}~tu{ww}ttzvtzuqwrnttlsrkqtlt{tzrjqpiopjpztzvqrvqqnhiuotmflqlqhchjejminmiouqvplqokppjowioqjonjoikoflomiqnkqieldachegmhlrlqpjni_ewkqrhnnfmultlcjrjqognmjljgiebdhegkhjrnsa]bgchkgmeagc_enhphciSNS\X[RMOadh^\a_Z_`\aUX\c\^bZ][VXSWXT^]RYYc_a][\_Z``]bVOY^LY^NZ_OZ_PWZLRTJN[QTWPROJLNJLJFHLGIKFHGBDGBDGBD548104)(,DCG.-1;=>356MLNA@BFCE@=?9>A?@DD>DH>DPCID@KFBMD@KOKVIEPUPVOKPRLQRKPPFLWJR\IXPNZFNTQNWVGObQU]RUVRTVTV[VXXTYUTXTSWVUY[Z^\\`ZX^^\b\Z`_]c_]cdZ`dZ`cY_j`flahc^`dackhjlikkhjkfhh^amdgmbjf[clakjakkcjg`ef^ahadgafb]akejhcgidhhdha_ecagd`fjcjnfmhfefdchfdkihjhgkdfjadm_efV_p`kpaihcefachdfhgigfhdaj`^d_]cdcegfhhcig`gngnmfmlelgfl]im`hl_bgtpvognedmgfpjlvvxx{v|xnu~qvtvxzy{wyrt~~nz~mw{nsxkjphdjllpimnennbjjhklkjlkglnglrjomfkrhnjikmlnjlm\`afjkquvlnoutvvuwsprtoqmjlpmoqnp|y{heggfjhgksrvmlpnmqplnplnplnqnpqnpqnpnkmpmoolnpmoqnpzpvvpustxinqbnpeijmopmopkmnkmnsuvtsurqssrtsrttsus{wytpvrpvpswswxtxynrsrvwqrsonpmqvqty|w{r|}zyt}{yy|msxntyyy|zuqwuqwtrxttztw||z|z|z|z|zutx~}yx||||{yx|yx|zy}yx|yx|{z|~}srttsu|vw{||~}~yyxx|||sxzry|rquyy|gchrlqunswqvuotsmroinnhmmglwpuxqvsiox~pvmosttxyv{xuzvqvtuvsuvsuvy{|lnowvxxsuwrtolnrprtsupoqmpqotudnnammfnnilmtprzuwc_akopbllfppfppgqqhrr{vxuprqlnrmotnpvop{stumnvmnumnrmnadhilpilpjmqmptuotvputnroinqkpsprupqzrrwlnqs{motnouoppklwuunnnopnlmklmkwxvlmkoooqqqpnnvprqklvqrqnpqnpvttywvyxtpvuoutmsrjqppvuoqrpoqmlpqoupmvnlrwqvqkpysx|v{wqvtttuuurrrqqqrrrmopdfghjklnooqrutvtoqxtv|~wrtoutnsrprrfffrrrnpqjlmvxywyzz|}utvwrtwtvrprsuvsuvkvzyu}xyyyyutxtswusyyv|x{xrswuvztvzstxvw{||zy}wvztswwvzxz{wyymmmssszxx|zztvzsvz~ry|ktw{uz{w|{|rwzry|rq~s}}goovz{uwx~zy}yx|~}~|{~{{}tuyzz~}ruz|zv{~uz}tx{vxv~~s{{t||z}|}}|}||x}xtywvzxw{{z~posqqwrpvyw~qy}}qxuitqm|xkvst{xutvxwyimnptuotutvzqrvuvzmnr{|yxzsrttsusrtrqswvx|{}srtvuwpoqpoquikuwxpq~zzvuusv~jkust~wyqs}loxmqrqsttprunq|svzy}|ulvs}u|x}x{{{yy||~~vv|wu{xtzwsyv}ujrwlttiqncke^eiejpmr_\^mllussqkpmgltns}w|rlqminminqmrplqokppjouioqjonjoikogloojslhnhdja^`tqsvpuqkprjpj`fuiorhnmeltlrkcjqipognpmolikxuwdacvsunjogchd`elhmb^c`\aojsokqjfkjgiTQSbdha^c\VZ\W\^^b]VYe\_^Y[Y\]LUUQYYYVXVSUQMSTPVIDM[JW\LV\LW]OU\NTZORQHKVORSNPOLNHFHHCEGBDGBDGBDGBD;:>+*. #>=A326356*,-=<>768<9;857;=A@@DD>BA:?RHNB?HC@I@=FLIQKHQQOUOKPRLQQKPOHMXKS\HXNJTJMURQV^OW^MQYNQVQSURTZTVXTYUTXTSWVUY\Z^^^bZX^ZX^\Z`_]c_]cb[`_X]\UZd^bmfk]Y[c`b]Z\]Z\]Z\^Z\d]`c\_iahd\ciakg^hiahiahc\ahadhbhe]ejbjibikckeag_]c`^db^dhahognecbdbbfdcmkjljikefjadk_ehZ_n]fpaimhjlgiifhhfhfegdaj_]c_]cedffeglhngciokqkgmhdjddj\gk_fk_aflhnkcjcbkhgqjkuxyx{v|xkr{ot}suy{y{suvxz|uwl|iuyszlmrfdjcil^jj^kjblldghlhjkglkglpjonglrgnedfgfhcef`degklkopmopfegffhjginikljlroqhegc`bxuwsrvonrkjnonronrpnppnppnpqnpqnpqnproqqnpmjlnkmolnzqwvpuqrvmru[cfimniklmopkmnlnotvwtsurqstsusrtrqss{~s{umt|x~trxvy}txy|quvlpq}tsux|}kotqtyzy{sz}y~njpxv|vy~rx}v|xx~usysousoutrxttztw||z|z|z|z|zttxlkoyx|yx||z~zy}xw{xw{xw{yx|yx|yxzvuwwvxyxz|yy|~|~~{}wvzuu{wx|}~pvynuxqrvvuyminsmrtotuotuotvpuwpusmrqkpyout{|pvtzqwspusnssmrvntyqvwvxy{|wyz~iklrqswrtvqsurtpoqonppoqkmnlqrbkkammimnnlnumpzruwztrthpphpphppiqqjrruprojljegrmormorlmvpqsmnrmnsmnrmnehlhkojmqhkoilpuotvpuuotoinoinliktopvnpz|rt~vnotmnnhizuvrppqrplmkkljuvtopnkmmrrrrooqooqlmrmnqnpqnprppusrutpmrqqvujonhmlrwvmnmnmpqptmlppnttrxwqvuotvpu|v{wqvqqqtttqqqqqqsssrtujlmgijmopnpqvuwwrtzuw}wyz|xsulrqmrqprrlllrrrtvwoqruwxxz{|~ttv|ux}wy}xzrprvtveptopzz{vwvvvvvxtsxusy{y~|y{xrswtuyttxrswuvzzy}utxvvzwvzz|}uwwrrqsss~~~|}ruypsw~u|s||}xy}|u|vvpzzltt~`bctsw|{yx|}|~~}|{|{}{klp~~onwnqvrz}u|sz}ysz}mrsrwxotupuvqvwwz~z{}|}|{w|yuzzy}}|wvzzy}yywu{yryt|v}zlwto~zitqt{xvuwpoqsuvinouyzvw{nosuvzoptyz~utvvuwihjvuwpoqqqsrqsjiksrtwvxqqsqijxqruqrpqquyxmrwlrynu{rxnu|mrwptumopwrttmpwnqvuy}}~zjv{u~r|v~x{uu{{{{{zzyyzzyw}vrxsoutiqzmuviq~qyrz|qyxtyyuzebdsppywwkejhbgy~ZTYqkpplpminlhmplqokppjosiopjonjojkoikoojsnjptpvfceroqwqvoinrkpndjthnpflkcjrjrmelphophnkhjpmodaca^`_\^qmrfbgfbghdic_diejlhqokqd`eTQSgeg_^bkdiZQW]TZ`^baXZg^aa\^dfgTZ[[`aSPRSPR^Z`XTZIENRANYIT]MX[MS`RXYNQULOMFIHCEJGIHDFGBDFACGBDGBDGBD548437659326204:<=>@AA@B98:;8:D@B?HGDND@JKJOMLPLHMMGLTLQXLTYGTLEORSZUQWXKQ_NR[PS]XZVSUXSUXTYUTXTSWUTX]\`a`d\Z`\Z`\Z`_]c_]ca[`a[`c\ag`eoin`]__\^\Y[]Z\`]_c`bf_bf_bf^ec[bh_ih]jjaknfmpinlejleldafebggciifkc_eb`f^\bc_e`Y`bZaecbca`ecbljikihkefhbck`cg[ak\dmahmhjpkmgdffegdce`]fa_eeciedfgfhhgmfdjigmgfldbhabh_fkbhleekjflmfmhgponxopzxyvytzbktnu~rw|~}{}{}z|kmwgisfwzjvzktxknsnnt_il[lj\lkallcghjgijimlhmnhmnhmohmjikihjmopeij`deeijjlmonpmlnmjlpkmmjlroqmjlgdfnkmutxonrnmqmlplkoqnpqnpqnpolnpmoqnpqnppnpnkmolnpmovpuupurswjpr\dgquveghprtmopoqrprstsurqsrqsutvyxzw}rznfm{w}trxuvzz{xy}iimww|z~osxwz{t|wovyvrxtpv{yx{sy~pv{||~~zzv|{yxx~ux}zx~zx~zx~zx~zx~|{xw{zy}|{{z~vuytswtswtswvuyxw{utvpoqvuwyxz|{}xwwvuuywytsukjnpntposnosilpehllqtqquklpposplqtnruqvrnssotyuzvrxtotulrpekuio~pv}outmrskqtiosfl|ntqnprtujlmhjkgijqprqlnuprroqonprqsroqopqqvwaiidnnilmsmo{oruhkwz{vxjsshpphppiqqjrruprwrtytvtoqrmoqlmsnormnpklqlmpnnhkohkoknrlosnrvtnsuotsmrpjoqkptqszuvsklodfpbdsuxmovlnphiztuvpqnomuvt{|zqrpstrgiiprrsssnllmhipklolnqnpqooomlrqmjlltuvkmmdefeggnnnooopoqqpuqouusywqvvpuuotysxvpurrrwwwttttttttty{|y{|npqprsprsyy{tqstrtwuw}z|sproutotsoqqppprrrsvwquvquvtxyuyztsu}tw|tw~wz~y{upritxtlvvzvvuuuyxzwvxyx|zx~{xyv~rswstxstxtvzqrvlkorquvtxxw{vuyz|}y{|}yvxrvzpsw~t{~qz}}rnswx|w|sz}p~}ru|pprytz}||}|}w|uy|z{y~ijn~~{zx{ry|u|~x~sz}|swx{~uyztwxuyzx{yz~zy}{z~zv{~ztswqpthgktsw~~}rzs{}{{u|yozwo~znyvovs}z|xvxttvnpqtxyuvznosrswstxrswtrturturtvsupmovrtwtvwtvxuwpmourtoilokmssugjkrwxpv{lrymrzot|lrzkqvquvhjkytvxqt~ux~}y~yvx{aov{q{rzpv}ssyyyssyww}ddj~||yw}yu{xtz{nvyiqufnyjrvgovjroosihlnmotttssslflmglrlqsmrqkpqmrnjogchplqokpnjopjopjookpmkomjopktjflsouhfhhegqkpoinrkpoeksgmpflkcjrjqnfmognphoolnolnolnmjltqsjfkkglfbgiej_[`fbgbZdpipoind_`lgijfkc[``TZ^TZ[V[_X[aX[]XZVWXSVWRVWRMOYTV^W^WPWZR\ZIV[KV\LWVHN]OUUJMTKNRKNKFHKHJGDFGBDFACGBDGBDGBD0/343765976:1049;<>@A>=?:9;>:D=BE?DGCH?=AUSWCAGFDJA?EECIKINGHLHIMMINOKPQLQXMU]LVMEONJQJDIWKR^LP_TWZUWSPRUPRXTYVUYVUYUTXUTXVUY^\b\Z`_]cZX^][a^[`^Z``^b_[`a^c_\^b_agdfa^`gdffcehcehcehah^W^e]gh^jj_lg^hldkibgjdle`ic^gb\ff`jkfocagdbhc_ef_fe]db`_a_^dbakihjhghdchcbi`cjadoafmagmhjnikgdfgfh_^`^[da_edbhedfedfiekeagfbhgcigciecidhlfinigmmionfngfomlvvwtusvntu~qxpu~tv|~z}vytweuxiuylsxtu{hek[fi\ll`po^ii_cdeceghlhgklhmnhmnhmlkmlkmkmneijlpqjnoeghgfhjiklikniknkmpmonkmkhjpmohgkkjnlkomlppospmopmopmopmopmopmojgikhjmjlqnpqnpplqpmrjkojnrjpskopiklrtttvwvxyuwxrqssrtrqsutv~|~yyqx{usyzzyyqqwnnttt{uuyvuwptuptypsxvqz~tz{tyzsx|x}wsx~orwqw|lrwvv|yw}}y}yysv{vtzvtzvtzvtzxv||{wvzsrvqptsrvsrvsrvutxsrvqpta`bhgixwyonpqprlmmkmmmlnihjtrvnmsnjojhllmqsvzfimorvffjnosrnsokpkfljekxsxd`elhmrlqtnrvns|qwsy{qw}qwtzu}ov{xztvxtvwwyzxz{{z|{}snp|y{ihjonpqnponpmpqhnocmmlno|wyrvvgkzorvqslqrlqrkpqmrslqrrmotoqupruprwrtkiimllpnnnmmrppqqqilphkolnr^aeY\`wqvvpuuotoinrlqspr{vwvno{prxz~mp}oqxlnujlxpqwop~}^_]VWUpqokljjlldjiceennnommpnnmjlpnpqoopnmpokmllxvvqppwuutsspqopqopoqqprrqusrvzty{uzsmrqkptnsttttttuuusss{{{y{|z|}qstqstrtttvxolnnkm}qnp}y{pvuglksuupppqqqptukpqejkkpqqstvmpyqtvor}xzxsuitxot~~zuvuuuxxxzy{yx|wvzvtz|zprvpqustxvw{vw{onrsrvvuytswxw{xz{x{{}|~wvxsvzux|w~u|py|}sotwx|ty|ovyo}|xlvvv~~uyz|{}{wvzsuywz~s|t|~wx|xx~zzruzs|s|w{^gj~}|~~~zy{uvwvx|xy}{z~|{uqvqmrutx|{vvzzy}vuygeksls}rzu}trrw~{lxtkzvhsp`gdtoq|z|wvxwyzrtuwx|prvwx|tuytuyvsuyvxrprpnppnpqnptrtxvxsprolnxsuwtv|~rvwkssmvzjswjswktxktxmtxswxuwx}xz|ux~vx~}vxvtjy|o{q~kvzr{uu{yyww}uu{~~y|{{xv|yu{vrx{pxymusfnsgoviq|rzwuytswrqstsshhhmglb\atnspjopjoqmrokptpuqmrnjonjonlpkglplqrkppjoojsnjpjfllhjolnqkpqkprkpsiouiosioldlphoognognqipsprfceifhmjljgikglkgliejc_dc_d\X]bXbripibgg`cf^bkfk^U[aU[_U[_Z_`Y\`VY`[][Y[WXY\[]VORZSVUMTZRYVLV^MZ[KV^NYSEK[MSUJMVMPOHKRMOROQOLNRMOJEGIDFIDFIDF326.-1548437104245=?@768<;=>:<@:=F?435324>;=D=@H@A657668C?BE?BJC:=A4;>IHL@>C@?CFDIKJNHHLFILHIMIHLKHMSLQZIRRELSIOSJMVNOZJNXNQZVXURT\XZ[Y]YX\TTXUTXVUYVVZYW]YV\ZY_\ZaZY_X[_VY]WZ^WY]\^b[Y[^Z\^Z\^[]c`ba^``^`b`bifkb_eb^fg]if\iaWdkbllcme`j`]ga]h^Zdfbmfdm``figmkgmaZalclmkjgeddbab``dbbdb`gdaiddhbciadjadgacnhkfbdlklb`ac`hebhebiedfedfpdltfnj\dl_hnaimbjdbhedjd`fhdkjfl`_hjisst~z{svv|t}|nr{swdgny}}{ldkh\coimnkmglmgnndghgijehlegkiimiimkhmmlnlkmkmncfggllimn`bcfeghgihegsnpjgijgikhjmjlmjljimonrhhlgfjkkopmopmopmopmopmoomosqsrprpopkjllkmjkomnrmnssswnpurrtnnpmmolopmopknnsqssrtvvwtsutsuvjqx|t{zv|rqvvt|nlsxu}mjrqnvkiosqstwxtx|rtywrzzqt{uwupr}~xvx|znouhmrlqvxx~wu{tqwwtyvtzyyx{tsxtsytsysqxutyyx}{{{y~uuyqotzy}rqurqurptrrvtswnnp~xxynmov|{ovulopz{|vrwtpvxrw~y~qottswlmqkptmptjmqpqusqvqptsswpospptqqurtxmsvnsvqtxqtxyx}xqvypv{sx|qw~rx|z|vxystuvxyuwxusuxsuxsu~|~jiknlnsoqqnpqorlqrjopptuxvxvprsjnhbdkiknqrmqrmpqnrsnqrsoqtnpqmosmp`\^]__chgjnnjnnjonjonmospswhko|ikpsmrytysnsoinnglomnpklwpq|qs|nppspsrtsuxkmreguvtxywopnghfmsrflklpoprruuuxxxljljhjtsswutonkztuytuupqtno{uvrpopqnpqoooopoqqprytyhchztypkpzuzsssrrrrrrsrrxxxttvrtusturtuuuwnqrvuwvwxwwyuuwwwxovuqvuprrsssqrrnuukttt}}r{{nwwpvvttuuuwuxypuutxyui{|fpqyuvyzzy{y{{zwwwsrtsrvxw{uvzstxvw{vvzutxvuywvzvuynmquu{tuz~|vry|zuw|z|w~xv}vrwurv{|vz~qwzo||vt~v~~x|}~}z|v{}}x{w}s{~ry|yt|rz}|}~z{ww|xw~xzlvxjuws~r}u|}z|{~z}z}vw{xy}{z~|{vqwvrxoos||vvzuuyxvzut|{x|w}}t{{pxponv|ymxvl|wjtrmqovorwrt{xzxuwxwyuvzttytuyttxtuyzuwzsv{ux{uxtmpvorohkxrtzsvx{{ux{qxvnuytzvszttznvyitwjtvitwhrugormqrrtuqmoxqtvmpsrv{xtvrrtwp{}xyxw}ttzrqwzx~wy}|{yxtzvrxtqwkiojholjqpntpntknrikp_cdjnnmqpsmrhbgnhmrlqrlqminhdigdilglsotpnrlqtklomglqgmsfkojsqmsyu{nkmifhrmqrmptmrsiotiosjomelqiqmelf^ephoolnlijmklmjlhegjfkifjebfrnsfbgjdif[eeZbkagbY\d\_Z\`a_dc_d][_WZ^^[]b[]YSVXQTZTVWQS]TWaX[QFNMBJXMWVGSXIR[MVaSYZMSVLOUMOQJLNIK?<>JGIEACHCEE?BE?BE@B.-1/.221598<>=A;:?;9>;:<879;;;><KFKQJQLFNJBILDKLHNDBHGGMJIMVJNVMPSLOTNPQKNQLNPMOSQSQPRTUVV\_AJMSW[NQUVTX]Y^_V\YPUZV[T[^M[]W\_VZ^Z[_^\``[`c[^d\_aZ]b[^_Z\^[]\_`_bc`cdegj]_be^gaWbi\fobmg_idaia_e_\d`^d_\d_chSbdbjngfoujvp^koilhehdcf]]`[]_cbffbfc`ckfjjejmfkt`hm\cgX^qdki[af\bg`ejchgbhedhidigbfe`edbfjinonrhchminkglgchjfkusx|~}}u~x}x~zyuzzkilgfgiegolnljlkikigijikbgj_dgeimeimhlpfejihlomrhfjonshkljlmihjkjljgipkmmkknlljgilhmkflpmoolnroqpmolikolnolnolnpmopmoiklbonn{zcpoann_lkhlmnpppoqtpqtnprmornpqnponpmoponpwqvupuxtynmqpquupo}xwxtttrqqonqpqmnqnprmnqedgxsuytwsoqxsvytwrswhhlbdiquypwzwx|nmp|{uuyxw{zz~qtvvzznqsw{|uxzu||ovwryyqxynuuqtypsylmvpsyfgprqusrvrqusrvrqusnurms~{}urt}}wrt{}qlnwrtvorworkcftqsprsuprroqnmosuvpssnsvmsvmsvqxzpvymsvpst{uxtxsvsvxrwvqvztyusxutxruvpuvptupturvwqstytvwrtwrtzvxrmonopkkmprslnompqbfgrwxpqrsqsrmouprttttuurrrrsstttuuusrrrrrsrrrrrsuulqphmlhmllqpkonrqswvzvtzljrnjtkoopqrpoqsprqopsrr```lghuopxmosuxpr{uvytuxuvommvttkiijhhpnnommmmmmnnzzzwvvrrrooo~xymghhcdupqrlmzqryqrumnwoptlmtoprpprppsqqqooppqvw{efiyz}z{~qqu{tuurroqqoqqrrrvttzyyywwyxxxuuvwvsxurxvpwvrxymvyputotsrwvqvuqvujuujwwkyxjwwkxxlwwpwvmutnuunuxrw{stloxgkrptyrv{xy~stwlmqmnrqswtuyvw{uvzvw{uvzwx|zy}zy}zy}}|qptyx{~}|{}wzzxz}z|}~|z|~z~z~yv|tx}ruz|z|ov{vqv|puxrtuy{vx|y|qtxsvz~z|qmo~y{x{}vxytvw|x|zuyxvz{}y{w{~~z}y}}y}x{y}vtvzy{nmovwxntwry|rvzqtxxx|uvvwyy|}{|vuy}~tyzpvv||}xsux{ytvyvxuxyy}~zwyvsuvtvwtv}{|wvxxvxywy{z|wuwzz|quvptupstpqrusunuulqspuvnpspsstuvijkpprstukkmmmnprsrtuppropqopruw{ejmqz}qz}z}ux}{y}vnu|qyv~xx{xw{vuyllonmqonrnmponrlkonlnnlmfcffdfqoqrmrjdiojorlrnhmkgmiekmelqhoykssforkrsksnemiahmdk~yxtzyu{roqfcemnmponrlmqjmninhimklopptdbfiejmglichjdiuntb\anhmhbggafjdihafkejkdieWbeX`g[aeZ\g\_l\`l_bb[]][]\__V[\SWX[Y[ZTV^SV\RU_U[`V\RHNWMSWLSQOROLOZX[mklONORMRRMRPKPLHM3/5BAEBCHKDJK@FJ?EF?D.-1/.2437215?>BA?E>=A:9;768:::<::C>@B=?FCEA@BDCEKFHFACLFKQJQLDNJBHJBIKHNHFLEDJHGKRJMWQSPKMLJLQNPOLNHFHMMOPRSRVXNUXAHKRXZPTXSTX[W\\RXaW]\X\Y`cJXZSVZYY]YZ^_[`a[`d\^lbec\_d_a[XZa`b^bcdhiUYZgkl_cdl`kp_jeS^o\hk^ic_dedg\[_bad^]a]`dXegbin`^gqgqm^jpjngchcbf[\`[\`dcgeafd`ed`elhmkdivdkl\cp`gi\bh\bg^dg`ee`ebbecaegdhhbgd`fgbhfdhddhb^ciejiejplquqv~|}|vs|vzv|sx}lsvt{~oyys{{joppoqjikfcemjlnkmljljgihhjgloafifknflnglomlpkjnihljhlkjnnpqceflkmjikolnplnqooqoopmokgliekpmoolnmjlifhmjlolnolnolnpmopmoikl`llkwwdppdppdppjnonpqnmorprtoqpkmrlnonponpmopnnpunsplqposccgklpqml~zyupousrsqppprgijxz{tvwvxyihj|~zuwrmozuwytvstxnosmptotwqx{vx|utxwvztswyx|tvzuz{x}~jopvz|uz{s{{pyyv~~s{{mvugjous}pnxrqzlkt||xw{tswsrvwvzvuyxs|yu{xtzspr|y{z|}xzuprqlnlgisnpxqtulokbelikkmntoqurtqprvxywyznsvlsvlsvrx|mtwlsvqst{tw{mq}os~svwpvuqvoosmnroptostx|}x|}uyzy{|~y{{vx{}rmoqsthjklnonpquwx`efoststusrtrmoplnuuuwwwsssttttttttttttssstttpppjllmoolnnnpplmmgiimlnyx|vtzpntplvimniklpoqsprurt~~~vvv|vwvpqxmozoqvpq|}upqommommrppussommtrrsqqmmmnnneeeooorrrsss{yyonnihhtrrrqqwop|tuxpqvnowoptoprpprpprpprppqqqwx|tuyqrvstxtuyzrtwuurvurwvoooqooussxvvxvvzxxxywtywqvtksrowwmvyputputrwvqvuqvuiuujxwm{ziwvlzyiuuowvmutksslsvouzttwxz{sw|quztvzyz~~xy}tvyvw{vw{vw{uvzwx|{z~{z~{z~zy}}|~}{}|xz{~|~}z|}y}y}xx~tx}tw||~ry~ytzty|vxy|~y|ux|z|nqupsw}|~{~y|}}sqsuxysvwrnpvqsxuz~{y}tuyquyvrxzv{xtz{vvp{wvzvuwzy{yxztvwluxlsvhmplosw{xxyzst~rt|ruzxw{vvxotufklqqs~y{wnq{uwrnpnmoopqurtvsuvsuvsu}z|wvxutvutvvuwmln~ptvptvlpqprsqstqvwqtulnopprtrt{z|lkmqprtsulkmgfhnppvxyuwxuwxuwxqtxglov}}~}vy}sv{qr{uu{|{xpw{tzv~xxzvuyqptnmqnnrpnrmlpmlpjimolnolnmjlqnpsprkmqikoknrgimfimjgmiekmelshpyltxksmelmelpipjbikdkjenrntsouurtebdmmmkkkohlpillhmhilhimuvzb`diejjdif`ee_dgaf]W\b\a]W\d^cmglmglmglhafhZeaT\dX^fZ]i^al\`l^bd\_gceaacY]^TXYXVXWRT`WZaWZ`V\cX^UKQWLSUKQYXZZY[XWYNMOFEGPLQQMRKGLPLQLHMHGKABFLFLI=CK?ED=B0/332687;21576:54:87;;:<98:>>>B@@E@B=8:B>@A@BCBDC>@B=?C=BIBIJBLIAHG?FLELC?EOLREBGLHJIGIGEGGJKNOPMLNEEGILMMRSRVXPVXLQTSVZSVZUVZ]Y^h[a[PV^X]Z_bJWYVW[Z\`\[__[`a[`d\_^W[`Z]ebdXVXVVX^bcdhi^bcimn]abhYahV_mXavbkm^efbg_^b^]acbfa`ebdhW`c^dgcbhb[ei_joinhdihgk^_cYZ^jimgchiejiejfbgjdim^el_dk_f_V\i`foingaf^\`bae`aeibhibghbffbgccfa`dd`ejfkmintpuxtyttzrt|z|}|z|~}z~}u~jsvirumwwpxxbghqprhgigdfgdfroqmjljgigfhfknbgjflnhnpfknkjn}|ttxljnhgkjlmmopnmoonppmopkmkiiiggroqsotrnturtgdfkhjmjlropolnolnolnpmopmojjlennissjssgqqgppimnlnojlmomopmotqsrpronpmopkopmoprnsmlpuuyqswmptttrusrusrurrtrqpoqikltvwwyzy{|lkmz|}xzxsuxsusnpnosjkopswmrulsvvvzyx|vuyyx|zx|qrvu~}t||jrrqyyrzztyzsxyy~w{|qvwXZ_vw|qrwrrxppvww}|{xw{nmqwvzxs|{}yspr~{}xsuuprpkmkfhlgiqlnngjypsxortqslnotoqzwywvxoqrlnnnsvlsvlsvtz~ipsmsvssuunq{mqrv}svtpvuqvposlmqoswuyzquvrvwswxptuuwxxuwifhurtwtvxuw{}~lnomopmnomnomuunvvhmnqstrnpolntttwwwuuuttttttsssuvvstttuupppopplnnoqqkmmikkonpwvxttwpntqnwmqrsuvpoqvrtnkmlllkmmrpptnovjlynpummupqojkonmommrppdccqoorppjiitttlllrssqqqoootrr|zzjhhspptrr{uv|vwwqrpklsmntoprpprpprppsqqtttyz~optklppquwqrtttqvuputqtttrrusszxxxvvzxxtussxvpusnvtowwforsxwqvurwvqvuqvukwwiwviwviwvkyxjvvpvupvuqvwqvyuy~xuwuuvqt|sw{qtyuu{ww}zzxx~vv|vw{vw{vw{uvzwx|{z~{z~{z~yx|{z~}qstuwx{}~|y{|~}y{|}tx}vz~|y{~y{nrws|x~x}vz{txy{~ux|y|pswruy}}xzy|wzuxwxyquvw{|zy{yvxyrwyx|rswmnrzv{}y~|x~zu~vp{tswyxzzy{ywympqluxmvykpsx{yyxyqr|qs{ruzwvzqstmrsglmvxy}xzril{svtlptpqsoqspryvxtrtvrt~{}yxztsuxwyqprtsutvwnwvquvhlmnrsprswwypoqusulhjmgj}z|poqonpzy{{z|utvkmnvxysuvsuvsuvqtxmpt|{xzxzuwsu~xwxt}}twv|t~zv~vuysrvonronrposrquposlkoolnqnpolnpmopmofjnafitx|mqukpskgmkdkmelthp{nvrzthpnckujrqfnvjrnjr~zfbhurtmjlkkkgggpilphnlhnffmfgkklp`_cgchmglrlqjdiichc]b`Z_ichjdif`eqkpichd^codnlaif\bf^ad[^h[_j]acZ]\WYcacY\]WYZWUW]XZZQT[RUXQV]V[RLQXQV[TYYXZUTVGFHMLNLKMLHMPLRJFKPLRNJOGFJDDHOINJ>DMAGD=B-,0/.254898<:9=739:5:?<>746@>>DBBFAC724=:<>=?@?AA<>B>@?9>JCJG?IHAHD=DLELH@HMHND@FLKOFHL<>BHMPKORKMNJLMIMNLQRNWWRWZUX\MPTOPTSTX[W\XLR_SY]W\UZ]JWYXW[]Z_YUZ_[`_[`d_ad_aa]_cbdKKM]_`[_`SWXbfg_cd[_`fagi_gn_hmaibZa^\_`_a^]_]\^]\^cefY]^acgddj`_eb_h`Z_]Y^cbfcdhZ[_bae_[`b^c`\ad`fd^ch^diagpjnd`eebf^^bb`dccgabfabfhbgibghbgjejojollookpqmrnjokglmingjo{}pts|t}v~vv}}zox{pzzqyyX]^srtjhjkfha\^wrtpkmlgiifhkpskpsglokpsfkngfjonrihlmlphgkcefhjkihjfegifhtoqkiijhhplntpujflkflmiokgllhmlhmqkpqkpqkprlqrlqkinlqrkqrinodkk`dfmopqstrtuoqrrrtqoqpnpopqmopkoplopnmqfgkhjnchkjormqosvtoqoqrprsqpqrprssuvuwxsuvjik{vxzuw~y{xsuytvlmqhimorvv{~cjmuvzyx|xw{xw{zy}{|vs~~oyyjttnxxtyzpuvv{|puvmrsLMRzx~usyusyurxvtz|{zy}mlpxw{tswz}ywsyzwy{xzytvtoqrmormosnptoqxqtxorpgjsprlnoojlzwyzy{y{|xz{nsvlsvlsvv}hornsvomoworrvx{}uxvqvsrvtuyuy}pswpturvwmqrswxrvwz}~xwystusrtxyzvuww||nrsswxvz{jnohrrhrrippkoprqsonprrrvvvwwwuuutttusszxxwuuvtttrrrrr~}}nnnpppoootsswwwsrtsrvnmqpntlpqmopsrtxuwolnmoojklnkknijrkk{pryps~uxyrusnprmotoqwrtmhjrmotorolnwtvkhjvsuurttpsoooeeedddnnnrrrwqrvpq|vwtmntnospprpprpprpptrruuuuvztuywx|qrvstxupqqqqmrqouttvvtrrqootrrqoozxxxywqvtqvtpxwu}}mvytyxqvuqvuqvuqvukwwjxwiwvlzyiwvnzzpvupvupvwpvxsw|yrvq}sq|ru~rxuy~tx|sv{uy}sv{tw|vw{vw{vw{uvzwx|vw{vx|vw{rswxy}w{|uz{w{|x}~xz|z{||y{~{w}}yztx}x{~{}}xzvzw~z~~tyzqvw{uz}otwotwpux|~x}}v{x~w}qnpvyzv}}tz{vz{wrvxtywvz{|}y~|x}||~}uxxuxyz|}lpqhtvksvxotww|xxst~rs}su}sv{xx|y{u{~mtwoqvxtyulnxortmpzrv{twvsu}z|roqurt~{}yxzutv~}utv}|~npqowwnvv`ffmqrnrslikplnrmotlo{ruvsurqsnmozy{{z|onpcdhpqurswrswrswqrvmptz}~losy||~st~tztwuu~zvx}sxpzvqzyx|yx|onrqptqptrqunmqjimolnroqolnlikpnpokpfbfmimyuynjnnfmldkmelqippemnckynvynvwltqgoujridmzv|iekebdmjlggggfhtmrohmkgmfflklplmqkjnfbgkejqkp^X]`Z_d^c_Y^gafmglichysxgafhbgmbli^fcX^g^ah^a`X[d[^`WZVORZUWWXYVYZZWYa\^`X\NGJSLQZSXVOTYRWZSXRPRTSUIHJJIKLKMEAFOKPLHMLHM[W\QPTFGKOINJ>DQEKF@D0.2548:9=76:98<4064050-/313FDDB??=8:<79A>@=<>;:@A<>BHHAHC9;;68=89723?:<<79<9;98:879B=?D?AD>CG@GG?IG?FD=DKBJF>ELAINDKMKQHHNHJOJNRHLQPLNPLNRQSNNPOSTTRVHDIMLPPRVPSWZZ^[MSgY_\TYY\`R]_]TZ`Y^a[`ZV[VRWVUWZ[\WZZSXYUZ[V[\^bc^bcX\][_`Y]^SfeVcbR^]XedRbaaeeaaabcb___^^^a__smnrrq^_cV^aLVZ`Z_ZV[cbfcdhYZ^POSTPUc_d`\a]Y^b`d__c\^b[_b\beZ`c[bf]cf^cf^ae^aee^cndjibgjchhbghbgiejkgliejfbfokpmqvuw~x~|}{t}t}wvx}p|~juwy}afgedfjikrlnf`bqjmrknngjkgidhlinqflngloinqkjnposfei`_ca`deghjlmgfhihjmjlojlwuukiiqnpjfklhnuqwnjpjflkglnjotlrrjqqipognohnohneceihjmkmkjlnlnlkmlnnlpqinohopoprjlmnstostmrslrsoswjpslsvjrvdoqaokcnknvslomqrpprsqstoqrqstsuvqprlgipkmxsuidfxtvnosoptpswqvyhorrsw{z~kjn{z~wvznnrnqrrvwilmquvqtuwyznpqvwxuvwuwxrprzwxwtvwtvyuwzvx{z~utx~}|{{z~}x{w}okq}tqsxsuytvvqsqlnrmowrtqjmpgjxorfcejlmtoqvsuzy{jlmtvwotwlsvjqtlsvlsvpux{uwyqtzor{ruuqssrvstxmptntvkpsimneijdhhostrvwvz{qvwsxyw|}fklnsttyzsxy`df}txyfutbrqdppeonlrsruvuuutttsssqqqvvvzuvwrswqszuvytuussjhhsppqnnpnnpnnopnopnonppoqposjnojlmmlnpnpvrtlqpfkjijjsqqvpqtlmrx|pv|rxqjptmrxqvyrwslqsmrysxwqvxrwyrxlfkmglqnporrsuurttikkmoousswuuxvvtrrponsqqrpprpppnntrrwwwtuystxjkoxy}wx|khhhjjltsqyxqwvwwwvtt{yyrppvtttuspvtqvtnvuhppdmpkporvvv{zputotsp||lzyiwvhvuYgfo{{uvwtuvrtuuvzxx~qzovqop|lqznrztv~y|jlttv~osyvw{vw{uvzvx|tuyruypswqtxux|tx|t~~uu}}|~srt~z||x~}y{vsyquzx{}z||~ww}uv~y}zq{{ury|qx{xry|t{~zsz}v}xpvw~qyzs~~tw~~{wqvwtyzy}{~zyu{wr{ztuvzz~}mrsjno|n{}r~t}w~t{~uuvwuvsu}qtyggmtw|xvw{vw|tsusqsqmo~yzyru}z||y{{xzurtzwyutvyxzyxzyxz}|~twxlxxkuugoolqrotuwtvzuwwpsulo|likutvvuwjikmlnsruvw|nntqrwppvnntjim~z|ut~v|z{vx|r~}{z~gfjgfjnmqfeilkohgktqspnpnkmjgimjlx^fqzgpfnfosckobjnckskrf_fkcjwjr}pxsfnuhpreme`i_[ab^dkhjnkmxw{kjnvnungmgbkbaj]^babfqptfbgd^clfkichmgljdjjdhnhmjdijdihbggaff`ed[e^V]g`ed]`c\_a_aa\^VORdX[bVYXQT\Y[ZWYTQSYVX[XZWSXWTXWSXPLQVRWQPRQPRONPMLNJIKEAFPLQRNSKGLEAFA@DCDHMGLI=CHEKCJJ>GOBJQEMOJSKHQOMVLLUILTOGJOHKOKMPLNRORPLQZTYTPUTRVPSWYX\^NUeV]WMS[[_OX[`U[ZPVTMRUQVWSXWYZ[]^VZ[`ff[ddV]]`decghX\]^bc^bcXgfT__QXY[ddN^]chg___aaa```___c_`qegd_`]`aT_bKY[a[`^Z_edhfgkfgkdcgb^cc_d_[`^Z__^b[_cY_bSZ]Xad\gjXdfZcf\cf^cf]`dc\athnlagibghbggafd`ea]biejfbgokpkotryxt}xvqzq|q}o{jwyivxr||aiibghmlnfegohkkbdsjmtknpgjlgibgjgloejmdilinqkjnqptfeiihlmlpfhihjkhgipoqqnplgisqqnllroqjfknjpmhqkfonirqlunhrtkutisshrnbmpeophogacjegrmookmsnppoqkmnimngnnhppnrsfhiostotuiqqkssouxjqtktwfsumy{dtp_mijtqfkipsqrtuvxyrtuprssuvrqsytvtnpvqssnpxsuvw{uvz~w|mtwtuyutxlkowvzutxtswooqhgiuuwqprxz{hjkqsthjktvwurtwtvwtvwtvusutrtzy}wvz{z~xw{utx{vzv|mioroqkhjmhjrmo{vxtoqtoqytvvorvmp|svolnprswrtroqtsu}prsmrujqtjqtkrukrupuxyruynq~sv}ux{xzoptvy}pswnrunux{swxuyzrvwuyzvz{nwws{{rzzjrrnwwnvvpyynww`hhiqqgvu_rqapncllmrsswxtttrrr~~~vvvsssvqrytu~ytuupqtpphffrpponnpnnpnnoplopnooohgizy{mqrnpqrqsqnpvsudihdjiikkihhpklsjl|ntqwqgmqflvot{qwvlrlbhujp|rxwpu|vzwqvxrwoinlilprrtuufhhlnnjllxvvzxxywwzxxywwvtttrrqooussqoonnnnospqustxklphimtrrptst|{owvpvtxxxtrr|zzxvvxvvtusnsqnsqmutjrrjsvqvunsrmrqrwvsxwr~~o}|kyxjxwhvugssrttsuuvxxwx|xx~n{nysttlp{ot}sxv|chrpu~ru}vw{vw{uvzwx|vx|qtxpswsvztw{tw{urt}}z~}|~~{}}|x~~z|{}z||~{yw{w~r||sox{hqtu~ktwlvyxpz}uxu~p{z|xstzy{|v|tmrztz}w|~z|{{w}wr{ztyz~y|~z~nrssvxszznz|wnz|nwzu{~xxwxrs}rt|ux}fhqsv~t}mv}mpxnqvuyznqruvw}{}spr{xz~{}}urtvsuutvyxzyxztsuonpnrsmyytmttnvvqvwtsuyvx~z|vorxqtpmoutvutvpoqtsukjnut}poxqpymlvonwrnsutxlmqy{~z}wzqr|vvx|sp|s|x|vxv|{~}~mlpkjnposkjnllp{z~urtqnpqnplikqnphpjriqzck}fntdlobjnckpholfmpiptem{lttemvfnzjrlgpkgmxtzolnlikgfjjimh`fd[fhbmkjsjkoghljimsotkejhbglfke_dmglf`ejdilfkjdijdihbghbgc[eg`gf`eb]__Z\dfgifhicfcWZeVZ_WZXSUZWYYVX[XZRRTWSXUQVRNSUQVTPVRQSONPONPLKMIHJKGLPLQIEJHDIJFKA@DABFF@EMAGJ>DC==?A<>IDFICHMFME=G@?BF@DC8HA;EBD?>B:;:E@@MABJ>?LBC215215326104104+-5-/7..4**.NMO32671<82=71<;5@?9DD>CB?7BA;FA=HROXHFLMLPPNTNJUIEPD@KFBMLHSEHMHFJNKMSHJ\OQTNQRQSVUYVOV\MX]KT`RX_SYWPUVPVWVZZV[RRVSVZRY\QZ]ZYb`]f]]cRUY]bc]cdT``RbaHZZXhfXbbh_bb]_\^_]bcWaa\^_c`bb_aebdfce`]_e`a]]]`de\adX^b^efZffWijJZ]NY`dbhd]djcjbZbe^egci`djX^cLUYYbfWbfhencfk^bg\ffZffbbhmkqkiofdjb`fZV\gafjdiJFKXX\baempxot}zzzxwvqzr|jv|nzr~irvipsglolikidfjcfnehmhjpmofaclfhifhifhlik]cdfppbffsnprdjndjjfkfgkfknhlmoqrdfgeghdfgnqrfkldijekpbhmbhorckpbjqbjn_gwhpnfmlelpiptmtslsrlqyutson{wvlhgnjijimxw{nosjmqlosnfptkuwltsywimvknxqtytvjhnmpujmugjolptlpqglkv{zrttoqqmookmmnppotsnquutxhwySoo^rtdo}jqotppihxgirtzv|otzmsxovyswxtxymqrswxnrrllxoo{rr~xxvvv~~p{xnwtpvtotrnrrruyrsw{vxwqrvno~vunuohofacc^`roqlnodijjopedfqnputvutvrtuostkpqnrsnrsfjkuyzquvjmqfimhnpmtwirujpwhbynk{sozxuwwsxyz~}dknsx{y~nvvnvvmuumuumrsa]czsz``fnrwnjominvpu{ty|rxnmohjkswxinogooipsprzgjorswxwyzwydrpjpovrskfglqphffecchhhmmmjlllnnuuuy{{hmnhprbko^cfdilglojorotwkpsglogloinqkpsjoplrmejilotijtnn|lvplwtkxvWgfasrjlmrmowrtsnpojlpkmrrtkmnjnpjrrgqqgrpdllmsrrrroootsutvwrtutvwtvwsuvnpqprsoqrqstprsnnntyx]hf^igdlkiqpksroutlqpsuunpplqphnngrphusdurnxxmuujrrquvw{|ry|t}nz|gtvm|~qh{~fy~hxgu{n{}wstp|wswszv||wx|pqupqujkofhlux|ux|tuyzx||{k|}nh}}d}}`~}\~za|yp~}otusuvuyz{yv~~wlm|~o|~v{~y|||~zv|zozwn|zhxwlwq{v|uzx{z|}t~z{~v}}y~yz{vz|s{zvzx|{|~zyxvvuvzqvyjor{w||}|z|}xzzvxy{|syzosxsv{{w}|ux}x{rv{sy~nw{u{yytzmsxgptp|~kxzlxzotwyuzzrxunu|vtzxv|zyzzstxrturtuqstqstnpqtvwrtuqvunppssstrryww~s{|ny{qwxrs}zv{wvnkmnkmrpvrrxnpxqjq{t{ngn|v|y|||}y|v|pxpxzu{uxy|vwzyzyzyzy`bjbbhusyljpnjppjoolnqnpurtwtv|y{rkpjchwpuqjopinfhldgkhkoknrfimbcghdihdijfkjfknjoqjopinohmnglslqmglmgld^clfjkejifhffffffhhhoooiiik`jiahleja^`hegXadUac`ehYZ^`Z_e^ci[_fX\dVZdVZ_QUbX\eZ]i^agX\eVZcVX^QSWLN_WXRLMWQRTQSYVXPPRRTTNRRVRWYUZXTYSOTOKPGKPAJN;BG@DHB@FCBFFGEIDC[OOSGGJ@@.-10/3104104104.08-/7++1&'+87998<2,75/:71<<6@A;FBIEALLHSEHMGFJOLN\QS`SUZSVMLNBDHLFM\PZcS\`RX_SYYRWVPURQUTPUWVZSUYU[^R\_XV_^[dTSYWX\eij\abWccScbJ\\TdcV``g^aa\^[]^`ef`jj[]^dbdb_alikheghfhe`a^^^`de`ehOUZbcd^hhVegJ\_FW\bbhc\cvovb[bd]dgcidhm\bgT]aYbfVbfebkadi`di\ffZffddjmkqljpdbh_]cQMSjdilfkUQVhgkdcgjmulqzpu~tzxxwvmvwq}p|r~fosipskps{xzdaclgingjnehjegtrtsprvsurprokmiegX``foo`deztvtflndjd`ehim`eh]abY[\bdebdebdegkldij`efgkpdhmdgotempain_gj[cxiqmbjmelognd\ce]dngluqptpn~zxsonvrqjimnmqstxlosnquumwulvvkszugkwloqjmqln}mpuorzhjprtxhlmy~}dihrttprrlnnkmmprrotslos}|etv^zz[opbm{jpotppjiyflsox|qz~luylvynuxhlmimnkoprvwjnommypo{ttttssv~~nyvlurpwtntrlrpprvqrv~tnovno~slsqjqhced_aa^`suvotujopnmo}z|xwy}|~z|}swxglmkopkoptxyhlm|ilpehlfkngnqenqgmtjg}sovq|{xzxtzrsw`gjpwzw|muunvvowwowwrwxvtz|njpaagZ_d~zvrw|wpuwmsmlnlnorvwjopfnnnuxtwqtypptusulkmdpnkllvopnijput[YYxvvcccmmmjlllnntttxzzhlnjqtfos^ehnuxcjmhormtwkrudloahkelofmpioplrmhmlnqvdeooo}lvpkvslyw[kj`rqiklmhj|~wrthdfsnpttvhjlinohppdnnepnbjiv|{uuunnnmlnoqrprsrtuprsprslnolnoprtoqroqrnnnotscnldomfnmgonjrqkqpdihrttlnnntrionfqoivthyvjttmuunvvptuv}r{~o{}boqn}l~~gz}dw|gw~hv|ly{vr|ws~uq|zvzvuu{vw{vw{xy}{|wz~}ux|tuyxvz|z~^}}hWxvYzy]}|X{w]xum{zsxyrtuz|}{u}}rzzt~~kkz|jwyotworv}~{x|zozwp~|dttnxpzrxtzx|{vnx~tzw}x~y~xwyx||t{ztzx|z~xz|x~zzxxyz~sx{ty||x}}v{{|}zy{|tw|qt|sv{wymqvtw|qmsyy|tw|vzsy~qz~ntytzyu{ntxenrnz|jwybnpglosotxpwxqx|pntsqw{zghluwxrtvrttrtuikly{|vxysxwjllkkkwuu|zz~s{ugryouxrs|xuqpifhwtvtrxqqwlnvqjqzszngn{t{yzzz{z}x~hp}owiq~w}y|y|wxzy{y{y{zRT\ZZ`xv|qouzv||pmomjlnkmmjllikslqpintmrwpu|uzefjbeihkoknrgjnhimgchgchnjonjo{w|slqohmnflnglf_dmglichmgllfknhlifhdddfffhhhmmmkkkk`jiahnfmYUZkhjQZ]LXZ`ehVW[]W\b[`dVZcUYcUY`RVcUY`WZdX\j_bgX\eVZbUW^QSVKM]UVVPQUOPROQ\Y[NNPTVVLPRRNSRNSSOTRNSQMRAFK@IMFINBAHD@FBAEEFDGBANBBK??C99104.,0+*.104104.08/19**0()-213=<@4.993><6A=7B>8C@:?A;@CRWddjb[b~w~e^e_X__[aimr`fk^gk\eiVae`]f\_dein\ffZffhhngekhfl`^d\Z`UQWlfkjdirnskjnnmqlowns|rwqwwxwvmv}vq~shqugnqglo|~ebdjeglehmdgmfiidfddfeegnikngjgbdS[[eqq_cd|uxxjppfl[W\jkobgjimnqst`de_hg\edgkpdhmegoufno`hk\d|mupxh]eiahjbi[SZ^V]nhlokjson{zwsr{wvlkonmqmnrmptnquogqwnxmbjx~sei{psyruojlsv{ilthkpvy}fjkchgglkvxxrttmoooqqrttrwvnquftva}}Xlmcn|hp~lqrrtsrxmvzqz~lvzpy}hor]abcghdhiuyz{pr}pr}rutv~owwjurlvrqxunsqlppnqustxtnoxpqrjtf_frkrfacb]_ebdjlmnstlqrtsutqstsuxwyuwxtxxjopimnlpqptujnoz~adhlosx}mtwhqthnunkvuuuzy{zv{nosbilry|ty|tyz\ddkssksslttuz{sqwvrx_afPV[min^Z^votyouonpnpqnrsnstW__^eh^aitx}mptprsonpdomjlluoprmntyxdbb~||iiimmmjlllnntttz||fllipsox|dknhoripshormtwfmplsvnuxjqtfnphppgniekjpty`blno}jtnhsplywbrq[mlhjkjegwrtb]_{vxvuwfhiinogoobllgrp]edtzymmmkkkkjlnpqprtxz{qstprteghmopsuvkmnprtlllotsdnlepnfnmhppjrqekj_dcrttkmmputionlwugtrevslvvkssjrrrvwzjsvs[hjl{}fxygz}gzcszkyhuwsozvr~rnyzv{w||vvzvw{z{xy}x{knrilptuyvuy{z~S}z_GrpQxvXzyUxt\wtm{zpuvoqrnpq~s{{qyyr||i}~jy{gtvmrujmq~}y|}yx}{ozwq}brqp{oypvtyz|{qhrv|yv~zyxzz|}u{zvyw{x}wxzv||{xx{|ty|x|~}v{~y{|zqtptlqz~w{sv{uqwyqxwzz}ptyu{r{v|tz~sy~tz~ntyfptlxzn{}kwyuz}tpuxpw~w~~zxv|qou{z`aevxxsuvrturtuegh|~vxztxxgiifff|zzdbbv~n`koekrlmtqm{wvnkmebdfdjllrprzunuvovjcj|u|x}ww~fkxqw}tz{~{~xxvwz{z{yzbdlggmzx~ljpiekgafvsukhjfceljl|~unsunslejvotlejfhlbeiknrknrknrpqujfkhdiminlhm{wpujchlejuns~w|mglnhmmgllfkoinifhdddggghhhlllkkki]imdnmelfbgnjpJSVHTVhmpYZ^]W\_X]eW[aSWgY]]OSi[_bY\aVYh]`gX\eVZaTV^RTZOQ^VVYSTRLMVSUZWYLKMVXYLPQLHMKGLUQVNJORNREKPBKODEKEAG@>HFFB?A@=?EBDFCEEBDGEEHHCKJFFEAONJKJFQMRRNSPLQSOTVRWUTVY[\VXYRTUSUV]_`a^`d`b`^^b``bb^fffdddmkkgbcnijqmlnnirqmwvrsrnrrmutputpsrnutpnmi{vwz{|~~}~|Ҥ|{yt|{ru}›ֹ񶷳漽¾ƺҷ¼̮ѱ׫¾¾®Ƚȿȿ¹ǾĻƼ~|xѢīɺ~~~~||kaa~~||{{{{}xwxsr{vuojiytsyvrsqpnnnlnojlmjhjjhjjgiheggdfjgicbdcbd^]__^`baccaaTRR^\^VRWYUZXPVYRWTMRSLQSLQPILMGHJDEHBCE?@LFH.,,422:88<::ECC?<>>;=?<>B?AIFHHFFHFFHFEJHGROOOMLRNSVRWVRWRNSVRWZY[[]^Z\]Y[\\^_\^_ebddbdcaaca`cb^dddeeeussidekfgsonpnmtrqsqpsqpurrutpvuqyxtyxt|{w{|}~}~~||~|{w~wz𻼹ۿ̽ĺÿ࿻żȿz{|ģß~~||}}xx}}||{{zz}xwxsr{zvqpzyyvrtrqpppprsmopjikkhjjgiifhb_a`]_bacb`bcbdbac`_acaaYWW^[]ZV[\X]WPUWPUWPUSLQSLQPILMGHICDLFGE?@LFG422422866:88CAA@=?C@BC@BA>@IFHHFGLJILJINLKSQPQONMINQMRQMRVRWZV[ZY[VXYY[\^`aXZ[^`afceebdb``ca`ihdgggeeepnnrmnpklsonljirpoqonrpousrutpwwszyuzyu~}y~}~|}z|~~|xɰǴ|ʒ”~~}}~~||||xx||{{zz}xwzut{vu{vuyvrusrrrrqstoqrjikjgigdfgdfifhmjlb`b_^`^]__^``_a_]]WUU]Z\[W\]Y^YRWWPUVNTSLQSLQPILNHIKEFKEFNHIA;<866644866;99DBB?<>FCEIFHDACFDFJGIJHHKIINLLQOOQOOSOTTPURNS]Y^`\a\[]TVWZ\][]^VXYTVWdacfcejhhdbafeadddfffjhhvqrsnoupqljjtrrrppqoosqpxuqzws}zvz}zv}~{|z{~yz~{|}~}~~zx{xzzz޺Ͽ~vȦ||}}~~||||{{{{||{{zz~yx{vu~|wvytsyvrvtssssprsnpqonpnkmjgiifhc`bc`ba`b^]_dcea`b^]_[YYcaaWTVYUZYUZ]V[UNSSLQSLQSLQPILRLMMGHLFGPJKHBC311977><<<::?==C@BFCEFCEEBDEBDJGIGEENLLOMMPNNNLLSOTUQVRNSWSXUQVXWYUWXVXYZ\]`bc]_`a^`dacfddgedgfbdddhhhnllnijqlmtoprqprpprppsqqtrrytq}xu}xu{x~yv{vwytu~yzz{}}Ŋ{ˣſ溸ÿ¾Թ¾ص¼Ü{{||}}||{{zz||{{zz}xw{vu{z|wvytsxuqwutvvvrttnpqnmopnpqnpgdfqnpnkmfegdcebacbaccbd`^^caaZWY]Y^ZV[`Y^aZ_VOTOHMQJOLEHRLMPJLRLMOIJJDE;99;99<::<::?==C@BFCEFCEEBDFBDLHJIFHLIKKHJPMORNQQMRTPUPLQTPUVRWWVXTVWUWXWYZ\^_Z\]b^`ebdgeegedgfbfffdddjhhpjlrnntoqroqroqroqtqsvstxsp{vt{vs}xu}yv|}|wxɋ~y}ln{ɟϼſÿɮ̸ΜÿĵȪĺŻʽ~~||{{zz{{zzzz}xw{vuzutxsrytsvsojhgqqquwxprrpoqroqroqlikwtvolnihjgfhfegedfedfcaacaaZWY]Y^ZV[\UZXQVUNSTMRRKPRKNRLMTNOPJKNHHRLM311755:88<::@>>C@BFCEFCEEBDFDFNKMKHJIFHKHJPNOSPRUQVZV[SOTSOTZV[XXZTVWUWX[]^^`a_abb_afceeccecbed`eeeccceccpklsnotoqroqroqroqurtytu|tq~vs|uryroyro~yz}xy~|}ӌ~}tzzʧӺԾľٶ}~z}x}t}sy~}|~ҠʤüЭzz||||{{zzzzzzxx}xw{vuwrqvqpxsrxuqusrooonpqqstnmopmopmokhjsprmjlihjfegihjgfhedf`^^_]]YVX_[`ZV[_X]YRWZSXRKPOHMMFIRLLUOPSMNMGHMGH655;89><<><DHAFJCHF?DKDIPIOTPUIEJSOTSOTTPUWSX]Y^YUZWSX^Z_]Z\][]^[]`^``]_b_adachegjfikijighfhijlmknokkmmmoqnptoquprwrtytv{vx}twwyy{skm{}{}zwy~}|}}|̈́w{ouoryykkȸ˞½÷ӽƺƿƻ{tlݏ~~~~{z}}~yxxxxxvvvvuu|qq~ssvqrwrswttrnntpqpmopmopmonkmlikmjlaZ`ninkdjmhmgafgbcd_`b]_b[`_Y^]UZ]TW\SV\SU]SVTJMSJMTJNULOTKNPGJ78<89==<@B>CF@EF@FF@EGAFHBGKEJQKPLHMHDIUQVTPTSOTSOTXTY[W\VRW\X][XZ]Z\\Y[a^``^`b`bdacdacifhgdflikgijjlmlnokmnkmnqnptoquprwrtytv{vxz}z}}twy||~|y{}Ȟʚ͆űǿǠƷżȼõŻyy{չĖҸ{{}xwzy~yx~yxxxvvvvtt~rr}qqvrrwrsxrtqlmsnopnppmoplnnjllhjlikc]blfkichgafb\aa\]b]^b]_b\a`Z_^UZ^UX]TW[RUWNQVLOWNQTKNWMPSJMNEH26:67;9:>C>DEAFICHG@FJCHHBGPJOXRWPLQKGLTPTTPUUQVUQVWSX\X]XTX[W\[XZb_a`]_b_ab^`d`bdacdacfdffcemjliklhjklnokmnkmnqnpuprxrtwrtytv{vx|ux}vyx{zsv~vsu~}}ɖȎƍȉǔϒəȆŵîǼ{yt~qeżüտŻȫκxx|rr~~yx~yxxxxxxxxxwwttxrtwrsvrrupqvqrrnppmonlnmjljhjlhjjdinhmkejd^cd^cc^_]XYYTVc]b`Z`^V\\VX[TXXQTTMPVPSUNQQJMOHKMFIOHK7:>8;?=>BA@DFBGGCHFBGMINIEJJFKOKPPLQQMRQMRTPUXTY\X]\X][W\ZVZ]Y^XUWb_a_\^c`bb_adacdachegebdifhifhiklgijlnojlmlnoqnpuprytvvqsytv{vx}vyx{~wz}vyx|ˍ–҂Š͇Ȑɚˏzz|྿ή{{~~uu~~{z~}~yx~yxyyxxyywwww~rrxstwrsvqrsnovqrroqpmonkmlikjgikhjkejlfke_d]W\d^cd_`hcdjegd^ca[`^W\]VY\UXYRUXQTWQSVQSSNPPKMJEFLGI>CF@CG?BF?@DCBFEAFC>DLHMEAFKFKNJOMINQMRTPUTPUVRWYUZYUZXTY[W\]Y^^[][XZ`^`b_adacgdfebdfcehegjginkmjlmiklkmnjlmkmnlikuprytvytvxrtytv{vxytvwrt|wy{}|~~}ĔǜԓόɆØĔؽ궲y}Ƕʾÿ}vɑǾºýĿ~~}}~}zut|{xxxxzzzzznnytuxstxstvqrupqliktqsmjlkhjkhjmjlkejnhmhbggafhbgb]^`[\`[]b\ab\a]W\\WYZUWZUVUPRTPRURTRPRSPRNLNJGIDLODJLDGKDEIEFJEEHCCFJIMEDHKJNPOSPLQUQVWSXVRWUQVVRWUQVZV[\X]^Z`^Z\`]_b_ac`bdachegjgikhjgdfjgilikkmnjlmlnolnokmnpmotnpz|vqsxrt|wy}z|~|~tqs–‹’đ˜ĿˢzǷʉʷyzҾ̨̘}}{z~yx~}{{~~wwvv|ppthhvqrvqrvqrvprtopqnpliksprnkmjgijgijdigafnhmf`df`ec^_`\\a\^b\ab\a`\a]Z\ZWYYVXWTVVTVVWXSUVWWYUWXTUVAHKBGJAFIDHLHIMHFJFFJIHLFEIKJNNMQNJOSOTUQVWSXTPUVRW_[`ZV[^Z^`\a]Z\_\^a^`dacebdhfhifhjgijhjkhjnjllnnjlnlnpqstprsvsurmozuwxrtxsu{vxxuwwtvyvx{xz䮶֜ϦɡûШĿհ~IJȼñƹijúxْܶϻ~~~~~}|{vu}uusswwssuuuuz{nijtoptpptnproqqnpnkmkhjlikolnqkpf`ehbgd^cgafd_`b\^b]_`Z_`Z_]Y^]Z\b_a[XZYVXXWYUYZTXYNSTOSTOST;AD=DGBGJEHLHJNIHMHHLGGKJJNLKPMLQPLQPMRWRW[Y]ZV[VSX^Z_`\a_[`a]cc`c`]_fbeebcgcfifhjfhkhjnkmnlnplnlmollnmopnpqoqruqsupr|xzytv{}~|~}ywͰɱɥȳ¢Ȕ|ɹ·Ϸˤwƾ¨ī~|vuxxuuyy{onwwtt}yzupqpkltopsnornpolnqnpnkmlikljlkejqkplfknhme_dd_`b]^b]__Y^_Y^`\_[Y[b^`YVXXTVYWYUXYUYZQTUNRTNQR:CF>EH@GJGMOFKNDJMDKNINSHNTKOXJNVNNRNOSSSWVW[^^bSVWYZ[ZY[b_a]Z\^Z_a`e`_ecbga_eedhiikjlmmnokmnnopurtqmorpsnpqy|}qsxvx}xx}zw|~{}Ɋ˽ȡǬó̹ΩƪîᒊǬƭͣ¸¿ܺ׹ž }}zzyqqz{~~~~||z|y{}rtz|~suwqr}wxzsvwpttmrrlpqlnrlnpkmpjlqlnlfksmrkejgafjdid_ae`bb]_d_ab]^c]`b[^_X[[UXc\__Z\VUWUUWVTVRRTONPRWJ[bHW^W]bZ`eGMRRX]NTY^^^\[[_]]XSTkefe`ajeehddkfgjeekiinpqnpqlnokmnmopnstyhrrs~~myztzu~x}y|~{z~}{~|zy}~׵ӭ̷̲ȮŰ˩ܬ뻭Ϊͦڵ~ĺƺ­Ƶ~yyyy}}~~}}||y{xzz|xz~suyzztuxqtyrwyrwxrwvqswrttoqvqsytvrlqqkprlqnhmlfkhbdidfface`bb]_aZ]aZ]aZ]_X[[TWZTVVSUWTVPMOPMOOLNEEIBBF@CGDILIPSAPR=QRJ]`FY^PbiL\c]elS[ct|mu|PX`WZ[Y[][Z\\Z]c_ad`bgcejefhdfideqmokmnlnomophjknpqpxxunxxnzzrvwxx}z}zy}~}|~Ӵǩ٢Ũݡy¼ٿȦڪƹŕͨš{{|¸ŻŰ~~{{||z|xzvxxzvxuopyruzsxzsxvpuvqsrmosnpwrtwrtsmrqkpkejnhmichjegjeggbdb]_d_a]VY[TW`Y\`Y\^WZ\VXWTVVSUTQSQNPQNPFAFC@EBCGCHKFMPBQSJ_`QdgNaf]nu_pwakrgqxZdj^hoS^dX]b[`fWY_[\c]^d``ebbffchffjdagghljlmnppqstnpqqstnww{r||tvw||vz~z}xz~wsx~{}~ɿɮ֚ʱ½xspūت´ܮͨƺŊϰ{|ÿ{{||z|xzy{wytvyzqklxrt{ty{tywqvtoqqlntnpsnppkmnhmoinoinpjomgljegjeghcec^`b]_b[^^WZaZ]b[^`Y\^WZTNPSMOVQSSNPSNPGAFFAFDEIBGJBJL;IKN_`O^aP_eERZKX`WbjLW_OZbU`hQ\dW`iaisbgq[^h\^i_aj_bhddn_bicclijqnpqsuvqstprsprsmqry~qyyvwy{z~wx|yy}{z~yuz}}}~ҳǴ՘|zzþꌈysǾӪ껭Ц̨ͤ}þ͔ǿŻĺ·ѳ¾|{{{||z|xzxz}rtzoq}wx|vwyruyrwyrwysxtoqsnptoqwrtwrtqkppjoqkppjomglkfhkfhhdfc^`b]_YRUb[^aZ]b[^`Y\^WZYTVXSUVQSSNPSNPJBFJDHHHLBFHAGI9DGMZ\GSWHTYMX`P[bO\dR_fQ^fUajQ_gR^kZcp]esX_m[bo^dpZakcht_epbfrdirvyz}uvyuwxsuvnqrx}~puuu||u||ty{wz|xx{yx{|x|~z~}y~|~|~ʽ̲Йͬ엒smƫ~ΨҧШw|vӝ˿ج¸yy{{~~z|xzvxy{}vwy}wosvotysxupqxsvxsuvqtsnpoinsnqqkpnilmfllfilfiidfc^`d`bg`c`Y\_X[`X\^VZ\UX\UXZRVWPSTMPTMPEEDEDCGGFGHGHIHEIJMSVMSUMSVOTXSX]V[bX\aZ_hWboM\nWdoXctTauVdxYn~]vqQmRj{L]lZercnvuzyywx}svzpussutuxvuvuyxwvuu{yx|yy}{zzxw~{}}z||~ŶٿԿʹŽ⏌Ÿƣwtrᥥµ|wxǮºþ||~ttyyuuz|{}|~z|xzvw{pr}suuw}svxqvtntwpwwqwunurlqrmnpklrmnidekfhncflcfnfib]_hcefbbidec^_e`a\WX]XYYTVXSUWSTTPRTOQDECDECGHFFGEFGEHKLKNRJMQKNRPSWTV\XXa[Z`^\eZ^lSZnWguGVjQc|]tnacdu`u[j{hs{jpwnntqrvtw{qwutwuwxvusrvutywvxvu{yx}{z~}~~ڻмę»ډͭŹyvᬬɼĩͺ~~|~|~{}z|y{xztvuwuw~suyrwxswwqvwrvqkpsmqrmntnpsnomhiojktilnehndhd`bgbda\]d_`a\]_Z[_Z[^YZ^Y[]XZYTVUPRTPRDECDECGHFIJHKLJJLMKNRQTXKNRQTXRTYWT^YV\[XbYZhV\oSi}Xocb`^e[bxozhnuiiomnrqtxtwutwuuvtvts~yxywvzxx{yx{yx}{z~||~~ϻҖƕ}z~ּȬķ~~yy}}y{y{{}z|y{xzvxuwuw~suzsw}w|xrwysxtnsuprpklvqrsnopklqlmvknofimdgfbdojllgh_Z[_Z[_Z[b]^b]^_Z\]XZ]XZXRTUPRDECDECGHFHIGPQOPRSMNRRSWRSWVW[ORVPTYRUYZ`dakwrl]|TyLzYZX__iv~hnukkqmnrknrrusstrsqpxsr{wvxvu|zy{yx~|{{yx~|{}}~||~~{yyȾȽʦХƿ~}z}ÿù~~~~~~|~|~{}z|y{vxuw}rtvx}rtyru|~xsuwrstpqqlnlghvqrpklpklpklthlnehnehhceojlidehcdb]^\WXZUV_Z[a\^^Z\^Y[YTVVQSCDBDECEFDFGEFGELOPLMQQRVQSWRSWRWZIXZL[]ZimcwidY}Q~L|[RRR]rlr}ou|ww}optlosuvttrqvutyut|wv{xw|zyzxw{yx|zy}||y{~ýɶñƾƊǸ̺÷}{x{½|wtûŴİ||||{}{}{}vxxzy{vxvxynp{}}vz{vxxtvytvuprsnpupqwrspllojkpklrgjnehlcfjeghcee`ad_`c^_ide`[\\WX_Z\`[]\WY\WYRMODFDFFDGHFJKIJKINMOQPTVUYRQUZY]UY\K_`RdcXjkWnuUp}diZ]V}jeLp[zZqhygrzsyxx~wx|mptvwuxwvwsrzut|xv}|wut}{z{yx|zy~|{xz~||·Ÿɳ¼̸uz|rlgݑ¶˴ȼzz~~~{}xzxzy{vxvx{prxzvpqsnozuv|wxxstsnotnpvqrqlmojkmhirhjnehldfgbdfacf`be`ad_`d_`a\]a\]_Z\_Z\XSU\VXZUWFGEGHFGHFNOMJKICBDLKOTSWWVZ`_c]_cYccX_`XbdXgn\o{NivPsPyW{kOawH\qPgzWo\n|aq{fqypv}ttzz{ux||yx}yxxts{vuwxzvu|zy|zy|zy}{z~}~}z{~||ε}wrþߋ´vvyyz|vx{}z|y{y{vxvxtvvx|vwvqrxstxsttopqlmsnovqrpllqlmmhishkofindhgbdfacfbbf`bd``b]^a\]c^_d_a^Y[]XZ[VXXSUFGFHHGHIHOONQRQWWYZY^YX\WW[[[__`daaca_``_cUZbR[iJclIjvEjz:Wh`rX^t`g{_n}\lxes~lxju}nsywx~yzuy}~}||yx{xw}vwxxvts|zy|zy|zy~|{~|wxƴ¸ļҎ»ľ|wp|Ҵ|ô²¶}琌êѩº¶}}z|~}{z}|}}~z|{}y{y{vxvxuwtvxrsxstwrsupqtoptopsnovqrpkltoprlmtilpfjnehjdfidfgbcfabe`ac^_a\]c^_^Y[^Y[a\^_Z]_Z\FJLHKMHLNMPRMQSKQTRX[RY\RX[SY\UY\][b^\d`]ecaj`_hPbiSbmTclT`kWbliitlhrmkvmlwmoynrymqsptvv{}u||pzzknqtvyrvxtwz}{}|z{}~~z}~ÿɺլϲ{vtſǣzyкؤ¸xtʇɿ̶¼}{}{}z|z|z|wyz|vxtvwx{twzuwzuwxsuwrtvqsupqsnopijxpptklshkpgjofikfhjdfe`ahcdd_`c^_b]^a\]_Z[\WX_Z[]XY[VVILPJMQKNRKNRORVPUXPX[OVZPXZQX\TZ\\Yb[XaYV_YV_\YbU[b\`i`cieenghofcjgciignkjoilrjnroqrosttyzs||rzz|ux|z{||{}}z|~{}˼Ǿʸݥ¬zzuu‹·⾵Ӣ}}љù͸Ǽz|z|z|z|z|xzz|vxuwwx|txzuwztvxsuwrtvqsupqsnotlmxpqvkmshkpgjofikfhjege`ahcdd_`c^_b]^a\]_Z[\WX^ZZ]XYZVVILPJMQKNRSVZGJNQVYQVXPUXRWZSX[UW\ZX^YW]WU[[Z_\[`c^cidilejmdjqgmohlnikplpmlmjlnoqrpoqpstsvwtxzsxywz~wz~y|x{|y}~qtuwyzǺ̩ʛyyƛ~{ysnδưŻ}}|~|~z|z|z|z|z|y{y{tvuwxy|vxzuwxtvxsuwrtvqsupqsnoskltlmrgishkpgjofilfhjege`ahcdd_`c^_b]^a\]_Z[\WX^XZ\WXZUVLOSMPTNQUPSWSVZQTXPSWSUYRUYTVZUW[ZW^[X_USYb`f^\bfbcjdfjdgoehqgjlffkgflkjmlkjkjprqqnprqsrstswxtxyvz~vy}{~z}{~z|y~~|~ȶ̥êztoֹɿ~~}{}{}z|z|z|y{y{tvvxxy}vyzuwxsuxsuwrtvqsupqsnovnoumnshjshkpgjofilgikfhe`ahcdd_`c^_b]^a\]_Z[\WX]XY\VXYTUHKONQULPTORVQTXRRVUUYVUYUUYWVZXW[ZY][Z^\[_\[__^bcfefggeddliiokksnmtonsonlkjijhponuprrnprprtuvz|}wz~x|y|z}z}|{|v{|~ԹIJû}~~̨ϻƺĸ~yڸŻɽʿ¸~~|~|~{}z|z|xzxzzoqz{|uxzuwytvxsuwrtvqstopsnovnoumnvkmrgjofinehjeghcehcdhcde`ab]^b]^b]^^YZ\WX\WX[VWZUVLOSJMQMPTLOSPRVSRVXTYXTYXTYZV[\W\ZY[[Z\ZY[[Z\]\^]bc]bcgjkhhikjlpkkqmkrnm|xwmkkrppunqtnqrnpzxzzy{y|z}{~~z|}}~`ddtvw|~{zμĿǽǙɝ­ÿ¼{󹻵}Ϲĭ~|~|~{}z|y{wywy}rtxz|uxzuwytvxsuwrtvqstopsnovnoumnvkmrhjpfjnfhjeghcehcdhcde`ab]^b]^b]^_Z[]XY\XX\WX[VWFIMORVLOSLOSNQUUQVZTYZTYZTY]W\]Y^[Z\\[]ZY[\\^^^`eeiigleafkfkmglpfkrikskntoplikrnpxorumpvqsuqs{xzy|z}{~y|˾ѾƸ•DZ}lmĽʎzz|wwqſμó¯y{y{z|}z|{}|~y{xzwyvxxx|uxzuwytvxsuwrtvqstopsnovnoumnvkmshkpgjpfjjeghcehcdhcde`ab]^b]^b]^a\]^YZ^XZ\XX\VXFIMGJNILPMPTPSWUQVZTYYTYZTY^X]`[`[Z\\\^\\^^^`a`bh`gi`hmelrdlrdlndjoflrkprlqrnsslryqttkntnp{vx|vxwz~y|z}x{ʭʕst張̿ȾýȆ|rznzxxrüͬwy{}|~|~z|{}|~{}z|xzy{wx|uyzuwytvxsuwrtvqstopsnovnoumnvkmsilqhkqgjjeghcehcdhcde`ab]^b]^b]^a\]_Z[^YZ]XY\WXNFLRJOUMRWPUYRWOPSOOSXW[VSXZV[`Z_]Z\^[]_\^`]_`]_dafgbgjejkfkjfjfbgrmrpkpqmruqvxtytrtonpsqsssuxvxyy}zy}yy}{z~~~|y{vv~sr̭þŵļ}}ć}ȮĴĿ¾|~y{{}z|uw{}|~{}y{xz|uu{uvystystyrsztuvorslotmpunqtlorknrknjcfjcfibehcdhcde`ad_`b]^c^_c^_b]^^YZ[VW[VWKEJNHMQKPTNSYSXUVZPQUXW[VUYZV[`Z_]Z\_\^`]_a^`b`bd`efbhlhmhdikgliejlhmnjouqvuqvvrvutvutvutvwvxyxzzx|zx|zx|{z~}|xuw}}~ǾؽĤ¨{wǖĻŻ}~{}z|~{}wyvxy{xz~vw}wx{uvzttystystvorslotmpunqslorknqjmkdgngjmfiideidef`be`ab^^d^`c^_b]^^YZ[VW[VWPJOSMRVPUVPU[UZYZ^UVZ\[_ZY]ZVZa[`^[]a^``]_c`bebdeafgchjfleafiejokpnjoqmruqvuqvsotrqsrrtutvwvxyxzxx|xx|xx|~}~}~{}~||}}ʿ辽|{~ws՘Ĺ̾Ľ̿~~{prxmoz|wywyy{xz|tu{uvystztu|vvystvorslotmpunqsloqjmpilohkohkngjjdfjdffabf`bd^`d_`c^_b]^^YZ[VW[VWPLQSOTVRWRNSUQVPQUWX\\[_[Z^YUZb\a^[]b^``]_c`bgdfiejgchiejiejlhlminokpokpqmrrnssotpoqpnprqstsuwvxxw{xw{xw{|{|||y{|zz~~ýûĕȏ~yxû~Ǹx}zvڨưƺ}z||~xzwyy{xz}uv}wxztuztu}wxystvorslotmpunqsloqjmohkpilohkngjjefjefgbcfabd_`e`ac^_b]^^YZ[VW[VWRMRSNSTPUSOTPLQVW[VW[YX\WVZ[W\c]b_\^b_ab_a`]_ebdfbggchgchnjonjpnjonjnlhmrnstpusotqprnmowvxzy{vuwwvzzy}|{zz~~{}~~ȹݾ¦zvuzut崴}y|xێʾļȼǐ}{}~|~}z|xzxz~vw{uvztuztuztuystwpsvorslotmprknsloohkngjpillehideojkgbcgbcd_`d^`c^_a\]_Z[\WX\WXMLPLLOUTXUTXTSWUVZVW[YX\UTX[W\c]b`]_a^`b_afcefcehdikglnjovrwqmrqmrjfkkglnjornstptrqspnpqprpoqqprzy}zx|yx|vuyyx|~|~~~~~~}ʹzvu{z}||x؎ɾ̾½¾{}~}~xz{}z|z|xzxzwy~vw{uvztuxrsystwqrunqtmptmptnprlnqjmpilrknpilmfimhiojkideidec^_a\]c^_a\]_Z[\WX\WXQPTTSWLKOWVZWVZUVZVW[YX\WVZ^Z_b\ac`bc`b_\^gdffcegchiejlhnminlhmrnslhmminnjornstptsrtrqspoqwvx}|~|{zy}xw{|{}||~~~~~zxxzxx~||{vwҵǀ~͗~~|~{ro{wׅ¶и~~}{}}}z|xzuw~vw{uvztu{uv}wx{uvvprunqtnpvnrsloqjmqjmslopilohkmhijefhcdidec^_a\]c^_a\]_Z[\WX\WXNNROOSNNRUTXVVZUVZVW[YX\]\`b^c`[``]_`]_a^`hdflikiejiejkglkgljfkokpqmrrnsrnrtqtspsusutsupoq|{}ywy{z~{z~zz~zz~{z~~~}~~~Ƙÿ}yv|z{y|up}tp䂃}¿ة~~~}}{}|~xzxztv}vw{uvztuztu{uvystyruxptunqvortmpunqqjmpjlpiloilqlmkfgjefgbcd_`d_`c^_`\]_Z[[WX\WXMRUMRUMRUPTWOTWXY]XVZ[Z^^]a_^b`_c^^b]\`_^bfeigfkgchkglgchminiejokppmoqooqoorpopnmuprtprxsuzuw|wy{xz|y{~{||y{|y{|{~z~|{}»ǿ¶ƹ½}zzxꃀ{¾̛~~|~z|{}xzvx{uv|xxzuv|wx{vx|wxxsuvrtvqsvqsrnppmoqmopmomikkhjpkmjegjehface`bc_adbd_^`\Z\ZY\ZXZQTXORVNQURUYRTYXX\XW[[Z^\[_]\`^]a_^b_^bcbfffjdcgfbfkglkglminkglnjpolnpnnqoorpovtsxsu{vxxrt{vx|wyzwy{xz{xz|y{|y{||}|~}}|~ʴȵ{{||࿺yvyuxx爅ýʽӏ~~{||~~|~}|~vx}}z||~y{vx~xy{|~yz}xy}xy|wxxsuvqsupruprrmopnppnppnpifhlhjjegidflgiidfidfdacddfbac_^`^]_]\^LOSORVRUYRUYQUYYX\ZZ^[Z^\[_]\`^]aa`db`ddcggfjdcgd`elhmlhmjfknjonjnnlnpnnmkkpnmrpnxsuvqswrtzuw{vx|y{{xz{xz|y{|y{{|}|~}~~ϱʬvvyy让unk|~|rzꠜΰƺ瓓vy˾}|~|~|~|~{}~|~|~z|wy~xy~~yz{vwytuxst{vxxsuxsuytvwrtrnprnprnppmoljlpkmsnplgiojlqlnifhgfhedfa`b`_a_^`LMQNOSOPTSTXSTXXW[\[_[Z^^]a_^b`_cbaedcgcbfgfjedhfbgkgljfk_[`lhmminnkmommommtrqljjuprxrtuprztvzuw~{}~z|}z||y{|y{{||}}~~~~ѼĽ׫Ȩ޾unk~zwqjz˯ޞ~wuvx~}~}~|~}z|xz|vw~}xy|xxzuvxst|vx}xzvqsytvxsuroqroqroqpmonkmnikvqsplnnikrmohegihjhgi`_a`_a_^`OQUNPTPQUNOSKLPXW[[Z^UTX^^b\[_cbfa`dcbfa`dcbfdcgeafjfjqmrokpplqminpmoommsqqrpoqonxsuxsu{vxytv}xz~{}{xz{xz|y{yz{|{||}ǸŤ||νqjgzt~{wpjcʙ{vóށouvt|~|~xzz|xzxzyz{|~yz~zzz{}xy|wy|xzytvtoqsnppmourtolnplnlikmhjpkmsnpojljegjgigfhfeghgi`_a`_aMLPQPTXW[XW[[Z^\[_[Z^SRV`_c^]a`_cbaecbfbaecbfdcggchhdilhmnjookpiejnkmpnnnllqontrqxsuxsuxsu}xz}xztqsyvx}z||xz}z|{~~~|Ǻɡâ{{Ҭ|y~zwq}x]WPŗľŸݳvpmbvǪ~xzvxy{y{zzz|z{{|{|}xy}xzzuwvqssnprnpmjlsprqnppmomjlojljeglgiojlmhjkhjhgigfha`b`_a^]_POSPPTSRV[Z^YX\[Z^\Z^\[_YX\^]abbfcbfdcgddhcbffeikglkglnjolhmlhmkglnkmqooussvtsvts{vx{vxytv~y{}xzwtvyvx{xz|z|~z|}~ɽºÝԏwmm֦|y{oizt~y|zuohĚĸߤȉđ{Ò̘ź|}y{y{~su}}~z|xzz|~zzz{~zzz{}xy}xzzuwvqsuprrmoroqurttqsnkmsprsnplgilginiknikkhjgfhfeg^]_bacfegONRPOSSRVZY]YX\^]a\Z^ZY]_^bcbfdcgcbfddhfeibafgfjhdjkglnjoplqokpokprnqqoopnntrqywv{vx{vx|wy|vx{}{xz}z|}z|}z|~{}|~̾‡{|ƑyyƬyqn~|uחĺķŲעԞ݊ȍ¸z|~|~y{{}y{|}}xyz{|wx|wxzvwzuwzuwwstytvtprtqsroqpmokhjlikokmniklgikfhnikjfhedfbcdbac^^`cbdRQUPOSXW[WVZZY]]\`\[__^b`_ca`ddbfcbddceedfdcefegfegeefjiklkmmlnommrqpxvvtrrussvttzwyywyyvxzwy{xz|y{}z|~{}}~~}xyĸǷƿson߰yljzv~xȹcZWzȾǸݭɃ̅\{}}|~{}z|z|uwxyyz{|~xyztu}vyy|zsvyqtvorsnptoqxrtojlrmoslongjkdgkcfkdggbd`cdcghadeVZ[W[\POSQPTZY]XW[[Z^[Z^\[_``dddhZY]feia`bcbdhgifdffegjikjhjkjlllnlkmsqqrppussussvttvttwtvyvxzvxzxz|xz{xz|y{}z||~|~~ÿµźĐÿpkjԷ}{|ô~{rpЍͿ˺䞳dr}}~}}y{{||vw|vwyzwrs{uv|uxz}wpsvorslornpwrtzuwrmouprrknohkngjjcfkdgkfhghi`bccdf`bc]_`NMQNMQUTXXVZZY]\[_]\`baehgkgfjfeigfh`_ahgigfhihjlkmlkmkjlnlnnmoljjmkkxvvvttvttxvvzwy|y{zxz{xz|y{{xz|y{}z|}~ɲɰÿ|wvخus}|Ϳ¼挞y{ȃ~ǽ{}}|~{}|~yzxy|}|}|}xx{tw}vywpsunqslormouprsnpojlrmorjnpilqjmngjkdgmhjcfg_abbef`bc_abTSWQPTVUYVUYYX\_^b^]a`_cbaedcgedhihjbacgfhgfhmlnlkmlkmhginnpsrtywwqooussvttwuuxvvyvxyvx{xz|y{}z|}z||~}~˾Ҧ|wvţ}u~~ɚ{׶{ŵ^rgpa}|~~~z|z{xy||z{~vwyzz}~wzxqtvortmpsnpojld_anikqlnqjmqjmtmprknkdgkfhkjlbacdbd][]`_a[Z^XW[UTXWVZVUY^\`^\``_ccbfdcgbaegfh_^`dceihjlkmjikjjlnmoonppoqqootrrsqqwuuxvvxvvyvx{xzyvx|y{}}~{}~{}~{}~~|{Ŝ{zx{ĴԀ{z͓}yy{}⭰ȫulztmYlfq}}~~}}{{~~z|~~}tvynp~vw}vyyruzsv{twtlptoqsnpsnpidfqlnslosloqjmpilpilpkmihjihja`bcbdbacZY][Z^[Z^[Z^WVZ\[_]\`dbfdcgfeiddhgfh_^`fegjhjgfhihjihjlkmonprqstrrussrppusswuuywwyvx{xzzxz|z||~|y{|~~~{}}~~v|~jsu{ȼſϿ¸|wvÜ~~ȇy{~~z|y{z|{}z|z|wyuwuw}vyyru{twzsvslotprsnprlnqlnsnpqjmwpsqjmpjlpilnjlkhjgdfmikebddacUTXWVZXW[^]a\Z^_^ba`dfeidcgfeifeigfhgfhmlnjikfegjikjiklkmlkmonpommtrrwuu{yyywwwuuyvx{xz|xz}z|~|~|y{~{}~~{}}~~z~zqyivr~lxåʵþ˯еۃ~}yqq}{xt|uqtlu}u~w{~~}}~|~|~|~|~z|z|z|z|xzy{vx}vyzsvrknwpsvoruprrnpplnqlnpkmqjmunqqjmqjmpilnhjjgifceYVXZWYfceTTXUTXTTX_]a__c^]a^^bb`d`_cdcgdcghgigfhtsuihjjikllnllnooqnmoonprpqutsvttyxxxwwwvvyvx{xz|y{|y{|y{~}{}zxy~|}~yz}~}wz~}nu~u|ixðͼɸԺηzxtӞ߱xoowsytoja}xĹÿ،~ze}xz{}z|{}z|wyxzy||txwpsztvxqtvqsrmoojlsnpplnqkmpjmohkqknohknhjlgikfhmhjkfhf`bORVRTXSW[VY]X[_Z_bWZ^XZ^^`dddhgfjgfhfeglkmlkmkjlolnqnplhjplnolnsmqxsuytuztuzutzutzwy|y{zwy~{}}~|{~~|{n|menxаǰְޥpff~|~{{zuvi{wĽsws|z¶ıӿٝugooßぞ~~xz~y{wy|~wywx|vwxstvttwtt{vwtoprnntopqlmnjlmjlokmvtvrnpieglfhjeggbdidfidfPSWPTXWZ^X[_]`dX]`WZ^^_c^^bedhedhgfhedfmlnlkmkjlpmoqnpmjlmjlpmotnsvrtvqrzuvzvuzvuxuwzwy}z|xuwvsuz{|}~zy}llʶӱЧɺÿsii}{|y{yt~熉ֹ˝ƚދٌ~{}|qsuwz||~z||~uwwx{uvxttvttvttzvvvqrwrstopqlmnkmolnpmotqsifhhegkfhjegidffbc[VXTW[QTXRUYZ]a_bf[`cZ]adei\]abae_^bddfedfmlnlkmkjlpnproqnkmmjlrnpxrwuprrmnwrswsrwsrxuwzwyxuw|y{|~|}~~Ѕnϝյۺíÿѷµwmm~|y{{}zޗԻ˼񈝨puϙm~~~~suwy|~|~uwtvvx}z||~uw}uvystztvxvvxvvzuvrmn~topqlmnkmmjlliktqsgdfhegkdgjcfh`dlehohkSVZ[^bY\`VY]WZ^[`cWZ^bcg_`dedh_^bcbddcemlnlkmkjlqnproqnkmpmosprxrwytvz{zuvzvuzvuzvx{xz|y{}|~{|}zv~zqhrlϻ޸ǿȶû̼ƻ۳黷yyu~|}x㞡ؽmZ{~|~}}z|uwtv}wy|~xz|tuystzuvxvvxvv~yzupqtoptopqlmtqspmojgiurtjgihdfkdgibfibec\_hadQTX[^b_bfORVRUY\ad]`d_`d_`ddcgdcgcbdfegihjjiklkmroqpmopmotqstrttnsojl{|xst{wv{wvzwy~|z|~{}}z|~|}~}{~lnqzxʽȵʿǽž|~vv“}xlfx}Ŝ|}{{ĉ{ɂ~{}xzz|xzwyy{y{vx{st{uvzuv{yy|zzytuxstojktoptopqnpqnplikifhgdfhcejadkbelcfh_bh_bRUYWZ^^aeSVZVX\\`d]`d``d``dedhddhgfhfegfeghgijiklikmjlnkmtqsvsuxrwytv|wxzvvzvv|xvzwyyvx|y{zwy|~}~{~rsxm̻ýž礡zz}{~|{t|}{ssʓ|t~{sx~|ÿĿׇstlRi{}z|xzxzy{y{vx|tu|vvzuvzxxtrrvqrxstvqrtoptoppmomjlqnpolnjhjidfkbekbelcfnehlcfVY]Y\`^aeX[_Z]aZ`b]`d`bf`bffdhedhhgigfhkjllkmnmonkmpmopmosprvsu{uz{}xst|xxzvu|xw{xz}z||~|z|~}|{~aplc}_yf{uȿȺ،ث~~skvw}}zrrڍ~|}uy}uwǿѾ̌myfxf~dl{}y{y{y{y{vx~vw|vwwrs}{{trr{vwupqqlmtoptopolnkhjsprroqnkmlgiodgmbek`codfmbeUX\Y\`Y\`Z^b^aeZ^b]`dabfabffeifeihgijjlonpnmokkmpmoolnnkmomosqs{vzz|xst~yzyut}yx|y{}z|~z||~~{}{|~|{~|~y}hnyr{xȸ¿Ⱦśww|}}c[[ߜ{~}}w|tzsx|v҉~yoyŻ~}}y{|~y{y{y{y{vx~uv~xytno}z{|wxupqqlmtoptopokmliksoqolnokmmijpehmbencfladodgUZ]X]`X[_``d]]a\^b\_c^ae`dhacgefjifhmjlolnnkmpmotqsrrtvtwpstvz{vuv}{{~xy|wx|uw|}wvxzy{zz|{z|}}~~~}|}~¿жɌoml~}讪|~x}wllɔ|wsyu~zzv{xvsyxxvxwxvxwպ˻¾̈~{}~~}}}y|x{z|xzy{xzxzvxz|}uv}vwystxrswqrwqrvpqtnoslouoqtmpsmotmpphkseiqcgodgkbejbfS[^W\_VY]abf]_c\_cX[__bfadhadhfgkkhjmjlqnpnlnolnqnputvnpqquvuxzuvvzzz{yyz{}wx}~zxz~}{z|~|~{z|{|~}}~|}}|~}ƺǸlji~}ⶲ~~xtxyrffڰthbtquqyu|xzwvuutxwtsvv¾ú˺ƌ~{}}~~~z~x|{}z|xzz|xztvwyvx~vv~vwztuwqrwqrxrtvpqtnoslounqtmptmpngjpgjtfjrdhnfinehjcfSY\]ad`ehZ]a]^b\_cY\`achdfkdfkehljjljmnjklhjkkkmgfhusvoprpttsxyrvuvxwzzy{yy{vw|}|z|}|~yxz~{|~}}}|~izu~msﰪͶμzyl``㣞|zzsmvsvsyv~zwyvvuutvttsut}}ǽе|xxxz}z}z}}y||~|~xzy{xzuwxzxz~vx|tuztuztupjkztuvpqtnoslounqtmpohkohkulowhlpfhlcfkdgf_bQZ]Y`c]beY\`_bfZ^b]beafidilchkfknhlnjnogllimnnrsnmortulpqlqrrwxpturvwxz{|{}zwz{}~wyzx{|y{|~~ir~޾Ջôΐٶwnaǻx|znnېysvsurvtwuxvtqwvvusryxutyy¸{z}}~y{~}|{~{~~z}|~~wyvxy{xzwywyxy|tu{uvyzxrssmnvpqsmnslounqtmprkntmpqilwkqqflmdjngle`dW_c\eh]dgUZ]bei[ad\cfcjm`gjahlbilgmmZccgmnennkqrprsnrsquvpuvmvux}~kpqptu{~~}}yyz}z|}z{||~}vqtʧ٢­ţŧ°ĥ}wwўƻ}}ztruswutr~xwutsrwvvu{{ʾՙ}~ty}~~||~~{}~xz{}vx~su~vw~vvwqrztu|vw{uvwqrxrsvortlptmpunqngjrkntiqodlmelkdkf_fQ]_V_bS\`]behnpbil^dgbilcjldkndlnmxxp||kvvhttitttyzw{|x}~x~||vy~~|x|}yurz”ʚڠ~}̬¶˿y~nbbҮ·|v~{xvxvuswuxvvtvtvttryyȴԚ{x}}~}|{~|~~{}wyy{wyvxtv~vwxx}wx}wx{uvxrsuoprlmtmpqjmqjmtmpqjmrkotiqnfmhahmfmnjp`lndprclo]dgglofmp`jlaknclpdmpeorbpohvuq~n|{m{zx|}y~v{|xox{u~x~wz~{~}||tyx{}}z}o}qyÜՒϲƺ¶wquiiݤys|z|y{xxtyv}wuuswuustrss҈y~wy~z|z|y|||~||~~~wy~su|~wyuwxxz{yz}wx{uvxrsvpqtnotmpqjmqjmrknqjmrkprispfqkcme`i^YbT`bZgi\eh_fibhlelogprclofprhpsgrs^nmgwvl{zjyxkzyuyzsxyjqqs}}s||ny|kuyzvz~qvwrwww{zkon{~}z}nzԿǺ܊ŸȪ|}~vkjxrzw|y{x{xwtxuvttrwuusyvwwľ{x}x}z{~~~{~z}z|xzz|{}y{xzy{xzvxz{yz|vwztu}vw{uvuopuopvortlptlpqjmslorkorispgpkcmkfnjfo_ihXbbZddYcc\ffbjibihgllgnmmrrgnmoyxlxvmwwjuwluyxw|utyoqu{~y|{~wz~}~~}}}znwo~iwлIJֈҤ~|}Ȼuĸx|ljzvyv|y{x{x{xzuzvzxxyz{xxsp}yor~}}{wyxzy{y{|~}vxy{wyuwwywywyvxtv~tuynpvmnunotnotnotnouopvprqkpoinlekkdihbh[eeWaaZddXbbZdd`feafeejhglkjonhnmbhgfmlotuiorgkpsrvtrvpqusvztw{nuxfmpqvyvy}uvzxy}|{{z~|{~www}n|myupzyźĿǻճĘus~||Ƶwmx}x֎}vzvxuzwzxzxzxztyuywxxzzwwpl|}jn}}|{}{}}}xzy{y{{}y{wywywywyvxuw{przoqvnotnotnotnotnpuoppjpnhmmgljdigafZbbQYY`hhZbbZbb^cb_dcbgfdjhfkjhkjhiiknnkkmikonmsposrquopthkoorvnuxsx{ruynqustx|{{z~}}}|~}~}~~~}~~}}}vvszϼ}y|x~~įʼn¹tj`wǻ~~{~ymjeyr~z{x{xyvyvyvxrvrxvwxyzvvĻwt~|}qu|~z||~|~z|vxy{y{y{{}wywywyuwtv~suzoqxmovnotnotnotnotnnsmnpjonhlmglkejhbg[`a\abafg^cd]bc`dcaccdffdffdffgiiommmlljgijhlplrsrvrqunosgjnqtxqvyty|ruypquxw{zy}{{{w||}zzz{{{~{|̞̿~wnj}}}{~zywv~vvpfc}|yfc^ıa^Z}{|xzvzvzvzvzv|vyuxvvwwxwwɼɮusxzy~~~~z}~|~xz~{}|~|~wytvy{}z|wywywyvxuwuw|qszprvnotnotnotnosmnrlmoinmglnhmnhmnhm\`a\_`_cd]`a]ab_aacffehheggfhhfggmkkqoolikplqokqqptttxpqulossvzruysvzvw{tvz}x}|x}~z~z{w|~~z}w{x{rs÷ʽҔ}z{|x{w}y~z|xzv}}}|vl{x|]ZU¼Ǜ{t|{wxtxtwsvruovrwuz{yooļӳǣ||x{}mnΠ{}}}~~~}}y{vx|~uwxzwyvxz|xz|qswln{prwopuopuopsmnrlmpjkpjooinlfklfklfk``a^]_]^_cbdddfcccgggiiilllfffhhhmjjonnnkmqosqmsrquvuytuynquorvruysvzvw{yx|{w|zv{{{{{|~vzuyvz~̸ō{sp|xvrzv{w~z|~z~z~㐈}z|rholgϹyt{zvxtyuzvyuxtxrxtzxzz}~ww¥Õ|z}|stʝí©{{}~}~{}{}|~~z|y{vxz|wyz|y{xzvxwyuw{pr|qswopvppvpqwqrwqruoppjolfknhllfllfkbacbac__abbdccecccgggiiinnniiikkkijjjklhhjmnrnmsposqptrtxnqusvzsuyuvzxw{yx||uz}w|{{{{|}~z{|z~z}w~|~Һsli{xtyplyuxt{{~z|x}v̪zwŶôx}xupÿ{zyuxtzvzvyuxtysyuywyzyy|w{|~џ˲˰|}y{}~}|~~}z|}{}xzvxvxz|y{xztv~suvx~suxmowopvpqxrrrlmrlmrlmpjolfkoinnhllfk`]_d`bb^`b^`c_aaaaeeehhghhhiiiiiheiiekjfijlptnquvuxrpuqsvnptpsvsuyvvyxw{zvz{uz|x~x}x}{~}yusvzxykq~orzɧrkhyu}toulgys}tpzvxt}}x|y|uľ௦{Κ{÷{zǷ{|yzv{wxtwsvrxrxtvtxy~uuœʒԔӣԳϩ|~~|~y{y{xzxzy{{}y{y{xzxywxuw|qs~tvzoq|rtvopwqrystrlmsmnuoppjopioqjpoinlfkYY[`_a_^``_a`_abacfegfegedfhgiedfkjlklmomonnppoqppprqrsrrtstttt{zz{yy~z{~xy~vxwqr}xyz{{||||wy~~~{vx|wxys{{}jq{qx{ʮz|ton|xr|xm~xl~uk~vo|vs{up}~wnyq|u¶Αxyɞ˿ǿöŹz|٩wwskc[vz|xyuuq~pmvrxpwqytusyvÑ~ÒƎĊΎ՘٥ԶϤ|~~|{~~}}~z~z~|}z|{}{}{}xzxyxy~xy~xz{uvzstxrsyrs{uvystvpqvpqwqruopsmnzpsrhkwmpndfndg]\^^\^cbd`_a`_acbdbacfegedfgfhhgijikljlnmoonppoqqqqrrrsssssswww{yyyww~|}{|z|}~~z|z~}|}uzĖ{vuxunzvk}wj~ul~vo{vs|vqxq~ulxq~~}xtr}yxtnĸƺə˿~}y|vМng^{~~zzvvssqxrxpwq{wuszx֌ʘٖғ}~~yy~}{{~}}}~x|}z}}}{}{}{}xzxyz{z{z{yzystwqrxrsztuxrsvpqvpqvpruoptnnzorujmxmppdgodf]\^[Z\bac`_a`_abaccbdhhjihjmlnmlnjikkjlnmoonppoqssstttuuuxxxwww}{{}~{||}}~zw~{}xwwsnzuk}wj~ul~vp{vs~vtvr{sl}tk~vo{vywv|xwuqpqe_vn~˽´y¶{x|{pŋ}w|w|uyrxrxrxpwqwsxv}{}}}zz}~}}~vz}}{}{}{}|~{||vw{vw{vwz{xrsztuztuxrsxrruopuopvppuoptnptknqhktknofilcfcbdb`bedf`_a`_aa`bgfhjikgfhqprihjjhjkjlnmoonppoqoooqqqrrrsssvvv`^^xvv|}}~}~z|~|~~}|yx྽Ͱystxtp{vm}wl~tm~ur{vu~wt{rnzqn|rj~vo{up¾tpo¾XLFtløƺ¶ɦwƺŹŷ~}xyjg\xv|~v}v}vzt{uysxpwqxtzxzx}rnɴɖ{㭨~}}}}~txz~}~{}{}{}{}y{yz}wx|xx}xy~xzystyz{uvxrswqrtnotnouopuoptnotjnsjmsjmpgjlbe[Z\dce^]_`_a`_a``bedfedffegihjmlnihjgfhpoqonpqprvvvppprrrwwwyyy|zz{yy|wx~xyxyz{|wxz{~{|z{|~~|{|}z}|מztuytrztl}vmvo|sp}xwww|sp}tpuryqjqkf̩~znh{sѦɳ|}y|v¾uxv~uyqyqyqzrwq{wxvywmb^ա›Ħƹumn|zw~|~~|~|z~}z|z|{}{}{}vx~vwz{~yz}xy|vw{uvystystvpqwqrvpquopwqrtnoz{qjmpilqknmfikdga`b\[]nnpa`ba`ba`bdceedfedfhhjjikjikhgipoqonpqprmmmrrrnnnrrrvvvyww{yyz{z{yz{|{vw|~~}~|~ˆ}~||}}vvþךzsvytsztn}vmuq|rq|vx~vv|sp}tquq{slvpkͫɚœtnwzogĻͿ̧Ųî}wux}|x~~vsiϴ~{xwypyryqxqzrwqwsvtvtpeaҠõˡ}uv~~|||{}{}}z|z|{}{}{}z|{|z{~yz}xy|vvystz{zttwqrwqrvpquopsmntno{uvrknqilqjmphlpil_^`[Z\gfhbacbacedffegihjgfhhgijiklkmjikpoqonpqprqqquuutttvvvvvvyww{yyz{yz|}|}{||~zzzzwxtu뷱Ǧzsvytszto}unuq|rr|vv{st|rr}tqtryrytʭҤ~zywĹȱ¶|ry~yz~ruw{vmн{~xm|qu|qzpynzrwqvrtrtrnc_߻|~~|~~{}{}}z|z|{}{}{}xz}uvz{~yz}xy{uvztu|}ztuxrswqrvpquopsmnvprxrsqmnplnqlnpkmrmocde\[]cdebacaacedfdcegfhjjlkjlkjllkmkjlpoqonoqprwwwnnnxxxuuuyyyxwwzyy~{{yzxy~xy~}~|~~Ƈ~zrsuvuvyzîzsvytszso}unuq|rr{tvyqr|rr~tqurzs}yȮþ滷~{}v{Ĺ}zqzzz{}}|y|}вz~wl}ukv|rzpxnzrwqvrvsusl`]ј~~}|}z|y{{}{}{}y|z{}xy}xy}vw~wx~xy{uvxrtwqrvpquoptnoystxrsrmoqlnrmoojlojlbfgade\`a_bc_cddce\Y[miknkmnkmqnolmlnomstrrsqpqotttuuuooovvvxxxwyytwwvxx{zz{xx{wx}xz}~ɫĖˁuwyttnqhzytsyts{tq}tptouo}sr~tqtotntmuosptq|vwtnowqr’¾ԫ͐™ȬƠȿv|{{}~{}|yvoȨrsowshyuzp}suzp~vlvqwqtnvpupҷò~}}~~~~}|~{{ww{{zyuwuwvw{stystxrsxrsuopqklyzxrsrkntlprjmtmpvor_cdaef`de^bc_cdedfebdqnpifhifhljjnomqrpopnrsqopnnnntttssstttvvvuwwqvuwvv}}}}xz|wyňƐquololmi{uxytsyts{tq}tpunun}tqsqtntnumuotqwt|vwćãtw|ƽ}zxx{}~t{wqlgҕghdzvk{zp|r|q~s{p~xn{uxrvpvpvpwkkö~~~~}|~|~{}vx{}|~~{{xx||}xwvx~su|qswxzttystystvppqklzttvpqrlntmpslopilleh[_``deaef^bc_cdgfhhfhkhjlikliknllnompqomnlpqoqrpuuuvvvssssssuuuuwwtuuvvv{yyrmn|}~ɞ擗䂆ՓӒ̑ȎÈytsyts{tq}tpunun}tqsqtntnumuotqwt~ϏЇ}Ɲxzvuw|y}s}z~ujd]Ɲ}ywo|tyq{r{rzq{uxrysvpxrss¾~~}}|~z|}}xxzz||{zvxtv}rtxyztvzttzttvpquopuopvpqslounqpilunq{tw`dedhidhi^bc_cddceliklikolnolnrppstrqrpopnlmktusrrrsssqqqyyy{{{uwwuwwzxx~}}wrslghnik~~}Ů爋Ӗ솊܋щɌʇÉŐytsyts{tq}tpunun}tqsqtntnumtnspwt|vwrokކ{÷ڟǤřĵ{}ī{vuwi_U~x}yvib[԰{{yqzqyq{r{r|rwqxr|vwqzt~~ø}~y{|~}rt{}z|{}}}}||xxyy~yxwyvxwy}uv{uvztuztuwqrzttsmnxrstmpunqslopiljcf^bccghcgh^bc`dehgijgijgiliklikkiilmklmkkljopnpqommm}}}nnnwwwxxxwwwxvv~yz{|{|z|{}|~~͛トԋ\^yzБ͑ʍ{vuzut|tr}tpunun~ur~rptntnum}wyvroӍهǥ˔}w}s~}|yȾwpwqwqwqwqwpyrxrtnvpxr{uxll̛Ƴ‹xrs}~}~~~~xz|~|~y{{{zzyyyyzyxz{}}}uvztu{uvxrsxrt}wxystwqrvortmppilrknqjmZ^_TXYY]^\`a]abhgijgijgijgikhjkiilmknpnmnlwxvxywsss{{{oooyyyyyy~||}xy}xy|}|}~~}}v}|v{~ǘܜޙԄ}~|wv|vv|ur}tpunun~ur~rptntnum{utq}nk͖¾k~}~zzw|wmx|{{~|{~}}z{|pɿȾ˳wpysysysvn}unxqxrtnvpxrysssºĹªý~~{}~}}}||yyyyzyxzwyvx}uvztuxrsxrs{uvztuwqruopvnrslolehpilrjn]ab_cdlppaef`dehgijgijgijhjkhjmkknnlpqotuslmkstrqqqwwwtttwww|||}zz|zz}xyzz}~}~~~|̑~x~lr~‹{z~yx|vr}tpunun~ur~rptntnumtnvsl]Z½{kiage\}w{|xvl|yv}y}w}x|z}|}|zn~㩫yuyuvtuq~so~uqxu{uwqwq|vysª˹ʲø||}}}y{z||~}{}{{zzyyyyzyxzvxtv}uvztuxrsxrs{uv{uv{uvwqrunqrlnngjqjmrknSWX\_`glldghaefhgijgijgilikolnpnnopnopnopnmnluvtwwwvvvuuu{{{yyytrr|zz{||}}~{||~|~|~}zʨɓư׮ԕ}}yw~vs~tpunto~ur~rptnsnumrlroeWS{ss}}zsty~|zvwun{xzpfxnt~s~zyz|wzxyx{yy{|ozuնƭ|wwtwstpvr{uz{uzty{vĴĿӻ~|y{}|~|~|~{}}}||yyyyzyxzxzxz}uvztuzuvxrsyrsxrs{uvuoptmprknrknslprkn``bb`bghifegefgjgijgijgijginkmtrrtuspqonommnlstrtttzzzxxxvvvvvvxvv}{{~|||}|}}}|}|}~~~ñÖÝyli}yqmrospuq}tq}tqxqzryptn}soyok~j_^|y}{|z|z~||~}~}}zw||zvw}o|xzx|uxryrul~sxp~x|v|v|xzz~x|vy~tz½xvysz}v|z~|~|{yxxƿ½ðȼÚ~}~}~yz|}{|y|wyy{y{y{xy}vw}wx|vwztu}sv~tw}ru}sv|ptyorvmptknuknwnqvmpedfdcegfhffhffhjgijgijgijginkmtrrtuskljrsqqrpvwusssxxxwwwuuuwwwzxxzxx}}~||~||~|||||||}}~~Ͼʮpd`yvtqrnspvr}tq}tq~vowohypwpzqmwnj}zsq|z{yxv}{~z{|~v~zyrtx~}xyt|nsqzw}px~tvxysz~w}tu}t}w|vztztxr|v|v}w}w{u}uzy}tjޮ~pqxvyw}yzwsqxvywƴݸ|||{~}{zz|~~|~|}|}{|z{~vw{}y{y{y{~xy|vw}wx|vwztu}ru~rvzpr|ptznrwlovmptkntknvmpulo_^`dceihjhfhhfhjgijgijgiliknkmrpprsqjkistrqrpuwusssyyywwwuuuwww|zzzxx~||~||~||~||z|z||}bVRtqspqntpvr}tq}tqzrkh`Y|rwp{rnulhtr~rp}~|xv~xw}{~zz|zr´vyv|wzxuwszywu{xjvu}ps|r~u}wp}vxr}u}tsvztysxryys{u}w|vyqz{rh޾|}~|}zzuvs}wtn}qo|pnwu½ƿ˭ƺŽȾ~~~zz~~~}~~|~}|~~}~{}z|y{}|{}y{y{y{~xy|vw}wx{uv{uv~sv}ruynqzorxmpvlotmprknmfipilwqtdcegfhgfhhgihgijgijgijgiolnlikmkknkjpnmusrspovsrurrzxxxvvxvvxvvyww}{{|zz}{{|zz}{{z{z{z{}~ľrfb~tq~oltqxt~ur}tqxpi[SL~uvovrpgcsqvttr}yvrso~z{|}xp{}swxiǟq{rd||}}{~q{u{nwuyk}uxrwuqrsr}sv{tyr{u~v~tym{rztxrxrtnwqy{|z~xyq}xnĹĻ}~zy}z{|zvth\Zxv{{̺˷ǫΡ~||~z||~y{}wyxz~z||~|~y{xzxzy{y{y{~xy{uv}wx{uv{uvvytwzpr{pszorvmpsloqjmqjmpilslobacedfnmolkmgfhjgiifhkhjmjlroqqoopnmrporposrqvtswuuxvvywwxvvxvv{yy}{{|zz|zz~||~yz~~yz|}~͵լwkgtq}urwtxtrif|sp|tmzsxovo}tp}tp¹ywzxy{u|xr|v~z{{|t{q}v}w~x}w||vwsuq{oi~y|q{{q~~{}z~~|{|}v{v}prr~q~puwiwutrty~p}o~qruxzsyrz~vu}qyoysysz{|~}w{{w{|vw~wu}vzƹIJҥ~|{{{|~}z|}y{wyy{y{rt{}tvz|z|y{xzy{y{y{~xy~|vwz{}wxtwz}{ps~svxmpsjm{vx{vxqlntoqojlgfhcbdfegmlnlkmheghegkhjmjlolnommrnmtposonvrqwsrytuzuv{vwzuvzuvzxx|zz}{{|zz~||~yz~}~}~}~ľɫ˶ymispxuurvsxtxu}tq|tn}un~wnvo}tp|so{y{y|z}x{v~xvpzt}yzz~v|ry}w|u|vx|wvtwu{xwuyutnzndv~}y~|~w}v~~zu{|yz{z~~}}~~{~tzr~qu~q}psqwwvwr~pzq~prtvx}vzsx}u~t~rzpxr~x|vwq|pj}qkz|{{y{}|thdsqvqq¶ȸõԯÿε{|~z|z|z|wy~prxz}|~xzy{z|y{y{y{yz}~{uvyzztuwzz}twzorux{rusprroqmkmmjlsprgfhcbddcedcehgijfhifhnkmnkmnkmommrnmtpookjzvuvrrytuzuv{vwzuvzuvxvv|zz~||}{{~~~~z{}~ҶźȽ̪znjpmtqurvsxtwt}tq}unzrk~wnxq}tp~vryw|zwu~v}u|two|s|xzz~v|rwqyuzwzvyuxtusvt~|yzywzvvr|vyxwvy|ztz}v~z|y}~|}{|wzxyj~rzx~~}~|~}~~xw}prtrsst~p~pqutqyq~ptuxw}v|u}v|s}s~r|rys{u{uyswq}wyyyyx{vxkik_]ŹŻƹ˾ğ~xz}~wxuvvw|~~{}|~~|~y{~z||npxz}xzz|y{y{y{yzz|{uv{|{uvwzy|ux{psux|svyvxpmolikqnpjgicbdcbdigifdfnlokhjmjlqnpqnpnkmqoosnmuponih|xwwrqztu{uv|vw{uvztuxvv|zz~}}}{{}~~~~yz}~ͼɼ̚Ƚ̳Þ}qm|njzmitqvrzvyv}sq}unzrjwoyr|sowsxv}z|tw|txp|t|wyy}u~txrxtwsxtuququsxv}{}{|zy{wx~|~z{~x~xzyyw~x{~xzs}y{~|zyy~|~}{{u~~|x~{{xizyys{}}{z}~~~~|~yw}pr}pvwws~p~psyrqw|n{m{n|o|r|s}v}v}u|s}s~r}s}wyysztys|v~x{u|vw~tytsqcWU»ɾɯѶ½}}}~~~{|~~|~z|}{}{}y{z|y{xztvxzz{y{yzz{yz{uv}wxzuvuxvytw~twzorsknroqsprqnpnkm^``_baceefhhgiiliklikpmoolnpmoqooronsqppmlsrqurquttwvvvuuttt|zz|zz{|{||}~{|÷ætni{soxt}vq|tpyrnzuozto|vqwqlxrmuq~uqxt~usujf{szs{o~t}tww~v~u~skxsvrwswsso~rnxtxtzvuq~rn}qn~qn~rn|x{w|r|p~rs{nwjx~sxwxruq~x~x}uzqxm|qxttw~z~z|x~z|yyzyx~|qywlvuv}|{{|u}ur}}||}{{}}~~{{|wwzwtrqstusvszmrxlyk}or|n|nzmyl{q{szt{s{r{rzqyqzqxrztztysxr}w|}wztysy~w|uwvtloifzmk~wrzrkc]ŷԼȼ{}|~~y{~~}}}{}vx~}|yy|{vvuutt~rr{xyvy{yxxxz}}svy|wz~ux~wzsmpvsutqsvsujgikhj^``^``^``ceehjjjgijgilikolnpmoqooqonsqppnnsqptrqtttvvvvvvvvv}}}~||}}~|}z{~yz|}|~{|~~hb]|wojdzto{up|wr{upzto~xsysn~xsws~uqvr}xywuq|uz~twv}sw~wzrv|t|t}rjxtyuxtvryu{xtxtwsyu|~|x{w|r|o~q|ors}pt|tz{}{u{s{qzn|p~rym}qv|x|x|x~z|wxyxz{}u|qx{zzz|txuxtuz~}}~~~|yxuyu~qqsus{mturvt~qrykr}o{mq|pylwmxpyszr|rzrzqyqzqwqxrztysxr|v}wztztys}wzt}vyrz|tl¹Ȼ¿λùȣƽ}y{y{{}|~{}z|tvtvz|~~{{{{{{wwvvyyuu|qm}v{xvv{}~svy|wz~ux~wzojlzuwyvxurtolnjgiifh^``_aa\^^ceedfflhjjgilikolnpmoqooqonsqprpprpotrquuuxxxvvvtttvvvuss|zz}~}wx}~~|}z||}ʤųnfbzv{w|so}tpvr|so}tpvrxok~uqvr~uqws~x}qo|x}vw|r|o{rzq{tyrys{u{u}w~xzv|xzvyuuquqvrvrxtxt{w}|xwszvzv~t|o}p|osu{nvy|~wszys|tw}quwys{qztzt|v~xzwxyxzxxzv}ysztz||xtw|~~{y~}|{{syurrtvr~psr~syxv~u{p{mr}o{mp~qxkvlvnxryrzp{pzqzqzqysxrxryszty|vztysxr|vyrp}tpzqxyv{uvú̴ɼ||oq{{~~}wy~{}y{}vvxx||{{yyxx{{vv{wtp{twt||xzz}x{y|wz~ux|txuprwrttqspmorprolnnkm]__cee`bbfhhikknkmlikmjlolnpmoqooqonsqpusrqonsqpvvvxxxwwwvvvuuuyww~||}xy|vx}~yz{|~yz|wx|}{|yzyxxxokzqm}y~uq}tp{rn|so}tpzvvnj|tp~sovr|x}~xwvu~tvzsyuwq~rlwq{zv{|xxtwsxtvrvrvrvrxt|xxtsoxtzv~t|o|or~q}pruxz|v}yzt|tzrvtxu~t{u{u|v~xzz{{zx~u~}~}rz{~}z}|{y{txwvr|nzlwisrq~txyzp~t}sis~pt|o|o|oylxnzrxrzqzpzpuzqzqwqvpxryszt}wxrwqyswqvpxr~{{~wolfg±¤·͸{}z|~z|z|~}y{z|y{{}||{{yyzzzzttyuuqunwt{{|~vywzy|wz~uxyru{}zuw{vxwrtytvojlrmo]__dffceeeggeggmjlolnmjlnkmolnpnnqonrpotrqsqpxvuxxxyyyxxxvvvvvvxvv|zz{vw~xy~||~}Ʃzokzvvr~sovr~so~soso}rn|qmvr~uqzqmjd_}|wpy~ulv|svo{wvrvrtpvrfZVso{w~zws{w|pluqxtxtwswsxtxtxtyuyu|ryl~q~q|p|o}p|}u|tzv|{uzrz|o{n{n}p}p~r{s|t~v|txyz}yzv~|q~w||vy}w{y{yp~~{~sz{nwx{ywvuwxuu|n~ugzly}o}oxwzr{szq|r|rypzp{qy}p{qyqwqzp|q|rh^Tvzpxrtntnxrztxrtnvpwq|vrl}wŽyuyr·öǞ|~{}~}}~~~}|~z|{}|~{}zzvv||xxtt{{yyyy|yu}sl}tquux{uxx{tw~ux{twzuwzuwyruxqttmpslopil`bbgiidffdffceelhjplnnkmolnpmopnnqonpnmtrqsqp}{zxxxyyyvvvvvvvvvxvv}}{||}{|}~|}}~șĺũť}~rnvrtpuq}qmsosouqtptpuq~uqypl~{~|swntpwstrtr~qp~qotgetryu{{wxt{wsoxtyu|x{wyuxtxtxtxtxt{qzn~p~pzmxk|o{n~vyqyzv~xxryqv|p|p|p~q~q~q{t}u~v~v~vu}r~suv{|zn}rw}s|r{y|{|{txzsy~~|x{wvvxxuvh}o~ug{mw}o~pv|swoxp|t|t}ryozpyoynu}pzpyqwq~yp~zozo}|r|rzttnuoxrysxrsmuovpzwqzvxtxqϹοǽʓ}xz~|~{}|~~|~z|}}xxyyzzxxzz{{yy{wyuwp{ro}ssxzvyvxwzzor|sv|uxytvxrtyruxqttmprknpilbddgiidffeggceeifhpnpnkmplnpnprppusrusrvtrrpp}|yyyxxxvvvvvvvvvxvv|}}~{|{|{|~~~~վìðtpznjymi~rnsososotp~rnuquqvrvlh|~|xzsz{rvmvotptrsqsqusus|omywwszvwswsyuuqxtyuzvyuxtxtxtxtxtxtzp|n}p|pzmzm{nzlyq}u~x{wyswqzr}s~p~p~p~q~q~q~stuutv|r|q}r~sv~|q}ryv{|yys|yz{z~{yvh|~v|xtxyyyzl|n~ug|ns}orwxrupwq|v~w|uyqvntl~sk}p{nxnyqwq~yp|zo~zo~xmzpztxrwqysxrysuovpvp{uuo|xWOHz¿Ƹɻûƽ~{}{}|~~{}xzz|}qq||xxttzzyyvvvr|xx~urvv~suvyvztwx{~ux|uxxsuvqszqtypsvmpwmpvmpaccfhhaccijjegggdfroqnkmpmoqnprpprppvtswutqon}{zzzzwwwtttvvvvvvyww~yzz{{|~̷̮²wtwtwr~rn~rnsoso~rn}qmtpurwsqhdhb]vr}vy{rxnhywstruuurwutrxvzwtpvrtptpwstpvrwssouqwsxtxtxtwswsyn}o}p|n~qr{oxlvmxprm~zysxr}t}s}r~q~q~q~q~q~tuux}su}r~s}rtu~s~s|q~tu{{zt|~|}{~|n||x{ztxyzynw~p}tf}or}or{sysvpys|v|v}u}uyqwntltu~uzrwq~s}}q}{pvxnysyswqysxq|vxr{txs}vrl~ǿxuvtzt|tkϽļٻ˭~z||~{}{}|~}y{~utzz|{~rrzzvvwt{xvpvtwwxmotwwzx|vy~uxxrtxsuytvzqtworzqtyqt{rufeeiffjiijhhlkkmjlnkmroqolnpnprnptpsxuvwtvvtuxuwxvv|zz}}zxx{yyzy{{z}}z|{}|~|}~z||ʭ~zz|oopn}qmtpuq}rn~souqzog|rk}ypmxt|u}twpustrusvtwuyrztwpxrzszqmyuuq~sososouq~rn~rnymiyuzvyuuqtptp{u{r|rzpzmzmvqytxrwpzrxxrsm{v}vvut|q|q|q}p}p}p{m|o|r}s~t}s~s~v~v~uvry~zwq{v|⪰z}{{wjuz|z|u~xy~w~x|v{uzsyswqxrxr{u~v}q}p~s~q{o}p~q|ozozn{q|rzp|ri~tjwovrwsvrws|risj{s{szr{rxwrsttɸƸؾķ{}~~~~}~}{}vxz||~}|~z||~wytv~vxyzvxvxtvtwvxtvwyxyyyyy{vuuqqwrrysvxsuysuwrtsmokiijhhiggommnllpmoroqrprtqsroqrnpvsuxvxwtvvsuxuw|zzywwwuuzxx{yyzy{|{}}z|~{}|~|~|~|~~yvxzwy}öȱͿɵĦzrr|rr~rp~rnuquq|x|qmyuum~tmzvwnkwszs}t{txvvtvtxvxvztzsxpvo|rkzqm|vqypl~sososovrtp~rn|plxtuqxtyutptpwqvp{rwmxkwnvrurzqwq{r}wysxr}xzt{qyozo|p~|p|p|p|pzmzmxk|r}s~t}suxxwzuw~z~Ͼ•|z|yu}w|v|vyy{u{u{u}w{uysvpuoysyszrrr~qrr}pr~p|pzn{q|rzpxnwmwowttpurwsyo}qgulv}u~tl{r~pqƻƯǴ|~~~~~~~~~~~|~{}~|~}|~~|~xzy{z|tvy{|~{}xzwytvsurtvxzzzzzz~yx{wv~zy{vxzuw{vxxsuuprkiijhhiggqooqooroqroqsprurtsprroqvsuyvxwtvvsuxuwwuuyww{yy{yy|zzzy{|{}}z|~{}|~|~|y{ÿӱ®~~{qqwu{w~tpwszvwlhxtx}z~ypmzv|u~vyvtxvzxzx|z|vyrxryr}sl|rnztozqm~sososoxtuq~rnsovr{wuqtptptpvpuo|twmxkwmvruozrzp{s}uxpvn~v~uyoyovpe~zp|zp~zp|n|nzm|o}uh|r}s~t|ruxxw{wwx旍~xvz}~xys}w|vwq{uzt|v~x}wyswqwqxrxryqsssutstrr{n{q|rzpwmvlwnys}vpvpwqwmxn{q}tvzqyriz{ƺ¼ʻսĴ}~|~~|~xz~~~~~~~~xz{}z|z|~}|~{}{}z|xzy{{}rtwyuwsuvxwyz|vxvx}prxkmtvsuzzzzzz~yxyut|xw{vxzuwytvsnprmofddhffjhhiggljjroqqnpqnpqnpsprtqsurtvsuwtvvsuyvxzxx|zz}{{{yy}{{zy{|{}}z|~{}|~|}|~zuw|~|~~~~s~|¨}}trznj|qmvrvrvkgyu}zw}xy|~zx{y|z}{xyryrxqxq~uq|vqws~sososozvvr~rnuqtpvrsowsuquqwsuqywoxnxnvozr|s{r~r|uyq{sx|tyouof\zo~zo~zo{n{n{ns}uh|r~t~tzp}szzywyw|wvyz|v~x{}|~x{uzy}wxrxr|vzt~xyssxwttust|o|r}s|r{qyo|rzt|{uyswqzp|rzp~uypvypž}xy¿ⰳž{}}~xz~~}}~|~z|y{y{wy}z|tvtvxzsuz|xzy{{npuhjxzsuxxyyxx}|zvuzvuxsuwrtytvqlnqlnjhhhffigghffjhhpmoqnproqpmoqnpsprwtvtrtvsusprsprxvvywwzxxyww{yyzy{|{}}~{}|~|~|~|~~~ɹvrtp{}ulhx~wzxyw|z}{}zswp|uwpwp}tpyt|so|qmso~rntptpsosososo{oktpuqso}qm{wxrxpyoyp{r|sw{nthwlyo{pxnzp{qzpxnxnzo{p|o|o~qtxk~twnd~tyo~t~w{y|xk|Ƚƪtys|vwz|y}w~xy|xr||v{uzt{u}w}wq~v{nzmxvtr~qsul_~uhu{qxn}vl{sxpzz{r}swmc|r{p{ry|s{vw´¿ģ{}}{}~~~~~~~~{}}|~}~}}z|y{vxzmoylnz|xzvx}pruwvxxzwyy{~tv}wyxx{qqxx{zxttwsr~y{wrttoqupruprjhhhffiggiggkiiplnpmoqnpqnproqroqsprroqxuwxuw|y{ywwzxxzxxyww|zzzz||{}|~}~~~~ƼĽřzvzoh{pi`zs|y{x|vs|}y~w{twpwp}tp~xs|souquq~rntptptptptpyuvrwsvrtpvt|z{wyszr{r}tt|oui~ug{r{qzpxnxoxnzpyozp{p{p|p|pzmtyl}s|si~tyux{{~t}uh}~ʽ醃x~~p|wxzz{uovpwqtnwq||vztztwqtnznhyszrytyxrr|or{qwoyr{s{t{s}ryo}~t|rwypòһ׷|~~~~~~~~~~~}}~y{wyxz}rtrtz|wywywyxz{}{}xzuwtvz|xzyy~ttxxzutxtszvu}xzuprwrtwrtwrtjhhhffiggkiimkknlnplnpnpolnolnnkmroqspr|y{xuwwtvzxxzxx|zz{yy|zz|z||{}~|~}~~~z||Ǹɮ~so{wyog|u}yypl}|xvuqxqwpwp~uq|vp|rnuquq~rntptptptptp~rn~rntpvrxtvtywyuytzr{r{puyqdxitr{nxjzlylxnzpyozpzp{p~p~pzm}p}p|rxn|rwzp{z|x|âŷpncvsexx||v~xz{||pjzt|{uztysztzt{~}~w{n|o{}~tzp}s{xv}r}tvu~tvv»ݺº~|~}~~~~~~~~}~~~|~z|vx|~}z|{}~wyxzvxxzxzvx~qstvxzxzyyxx~~~yxzvuzvuzuwojlwrtwrtwrtjhhhffiggljinllnkmolnpmosprroqqnpurturtyvxyvx{xzzxx{yy|zz|zz{zz|{}|{}~{}|~|~~~Ŀ׸yqmuq{qmukgxnjuq|z~{vo}w{~ur}vwpwp~uqzsn|rn|qmso~rntptpuququqtptptpwsxuxvxvxt{w{v|t~s~~qzj|tcxlyl|o|nzm{qyoul}r{qzp}r~q~q~vitzp{q|r}tyo}y|wtyø}{pswy|{tyrunvovpxle~x~ztyr|v|v}v}s~q·uvw|r{rv{pw~tvjbYžֿϿ{~{}~~~~~~~~~y{|~~xzz|{}y{xz|~|~y{xzvx|~{npy{xztvvxrtrtwyxzxx}ssxqqxtrzvt~yy|vypjlvpsvpsvpslhkjgiifhlhknkmolnpmoqnpwtvtqsroqtqsxuwyvxwtvxuwyvxz|~xz{}z|}{z|}z|}z|}z|zwy}¹Գqjj}~xx{yyywuzwyųþhgbqpkzvr|xswountm}qkuovpunyqyrxqxqys~pjsmwqzswuwuzx~|}|~xss}xhl{td|r{sslyyun{~v~vu}xm}zlsswt}uh~qw||n{ɽ٠񸿴oqfzx}xuswkym~r~t~uxw{quttttl^vpcx|~rznwx~|xge\z{zpüÞ~}~~~}}}~~~~{}~|~|~z|wysuwyxzxz}tvwyuwxztvy{z|wy~sutvvx|rt|rtuwx{ux{qtzpsyorcbdfeghgiihjkjlolnpmoqnptqsroqqnptrtxtvxuwvtvxuwxvxx{x{z|y{|{z|}z|}z|}yvx~Ѻɤsnm{}jlfuuoyvq{wrwqwqvpuovptnsmtoxrxrxsvp~xzt~|~~{y~ztwqpyub|whp|o{q|tzty~xxry}v}v~u}r}{mxz~q|o{xvssr||p}댊yuj}xwxszm|nr}s~twwxnvtt~Ƹ{texrewqdzxvjsȻri\x||{~uwv~ǻŸxz}~~|~}}~~z|{}|~}|~{}}}y{y{z|}y{wyvxuw}z|tvxzxz|~y{{}|~xz~su~su}rttvzorwlo|ptzprznrjjljikiijhgijjlolnpmoqnpurturturturtwtvxtvvsuwtvxuw~wz|z|y{|{z|}z|}z||~~{}~}~ëǼѳ˒||rqkwsnwtowqwqwrwqvrupqk~pjvpxrxr|vtnrlyszt}}uwtr`xvd{nzp|tyzvpxryr|u}tzou~q{sfylzxwj}{r|o~ryujrzv|zm~q~qsvuw~tzpvvvwi{sk^r|}zw~tstkzñ¼~{np}}~~|}~{}{}}{}|~~}}{}{}{}{}|~|~}{}z|xzz|y{z|{}{}y{y{y{xztv}rt~tv}ru{pszprzorynq\`aadedhidhhfjkmlnpmoqnpsprtprsprvsuvsuwtvurtvsuxuw~wz}~y{xz{{z|}z|}z||~}z|~ʴųʴ̙mhg}~uwqstmwsntnupvqupxsytvpsmrltnxrztvpysysys}}zws}wjzp}uyxr|wqvpyr{t|sxrg|osw~q}pw~sv~q{b\Xⴴߧoi\{l|zsrtvuvxn{www~pĶkhZ}wjzu{q{visqchdV]\Myñ½~~z|y{wy}}~~|~}}|~|~~|~y{y{y{z|{}xzvxy{z|y{wywyz|xzxzxzuw}rt~su~sv}ruzorynqxmpafgafgbghchifkljiknlntqsurtqnpvsuvsuvsuwtvvsuxuwwtvzsv~wzxsuxz{}|~~{}~{}|~~}̱Ǚzyton{~tikȬ{yvvpvvpvpwqwrxrxsztuotnysrlvpwqvpxr~x{u{}r{zl}t~o|zpzrztz~x{u{u|v{t|rxn|osuzm|o|oķyqd|y|vkwumomeywo|zrqohf^Usjcwo~ļ|ﴲvxxw~}p~qwx|{q}x|vm_{tzvugu|~rqwheW~~pqutf{̼ĸ¼Ͼ~~|~~~{}z|~{}{}{}}{}{}y{}xz{}|qs{}xzz|y{uw}rtvxwyz|z|tvtv~su|qs}ru{ps{psxmp{pskssemmgoodllfnnllnlikurtsprqnptqsvsuvsuwtvvsuxuwyvxzsvzsv|~wyzyxz~z|}|~~}{}}͹˿ɭ˼Ư~yx~}xwwzzor}suotvpvpvpwqysztztytun|v}rlwqztxrztys{uŴttvpx|rzqxrvpxrysxrxrxryr|r|o|o}pwj|orsk^xy{yond|ļƼWULvtj~zxzstyz}wmxv}sww~zwxtv~~pŖָŻĺ~y{~~}}~~|}~z|~~}|~~{}{}z||~~~y{{}|~|~vx}rtz|z|~z|}rt}rt~suuw}ru{ps}ru~svwznxxjttjttfqqeppnmoliktqstqsvsuwtvvsuvsuwtvvsuxuwxuwx{y||~yxz~z|}|~~}˽ϻʱwrq~ryŽ}moi|unwpwp{t{t}vxxq{t}vow|vzt|vzt~xwqwv}t{uxrztyswqvpxrzru~q{nwj~vixkzmtl_~~z̾~qĵ}nrnazu||{{ty~}~tzvxjsuy{{mz~zzlu²³ø½ôۻ~}}~~~z|~|~}~|~}}z||~{}}~~{|{|z{wyy{z|y{xzxz}{pr}rt~suuw}ru{pszor{pszor`jjjttgqqissfppklmnmnonoroqtrturtvsuutuwtvusuxuwxuw~xz{tw}xz|~}|~{}~{}|~~}Ϻյʿɮ~yxy~̛qtnxun{wo}wq~zr|v}v{}uzw~x}w{v}vz|}xǿ{yuwyx}vxzt{uxrwpytzr~t}p|ozmt|oxksvspsyzi|viɿsys~~~|{wvvm|wĶ̽ŶƷ½̺ȝ巼̺xz}}~~}|~xzz||~|~z|vx~~yz~z{z|z|z|z|y{z|wy~sutv~su|qs}ru{pszorxmpmbfissississmwwlvvjsvfptksvmswquvntrmvqourosrsuuvwxuw|zw|~w}~wy}y|~}{{~~}ι¨Ӻŷ׶{|sytw{wrvr{|~||{{y~xwzwǻŹvvz{{{y|u~t{q{qxuvvstznus|o~~pp}ouyu{|zDZxxxlcyqdv}}ttxx~~pmd{yl½þ¾Ƽȿ­wy~~~~~~}}~~~y{|~~~~~~z||~{}{}{}xzxzwyz|uwuw|qsuw{prtv{pr}rtynpujl_kldppiuugssgssjvyjvxox{mwws{{irqoxvoxvsxyvz|vv{pswyu{x}{tw}y{zy~{}}}̯Ѷ̯pvpyzpvqx~yv|wioj㇄uzxw|}y~t~sywwyzyxvu~pur~o}wtswwy|~~~y}|zm|ozlzrev{Źüȼùú˻ʲ||~~~~~~~~|~{}|}|~|~{}{}{}xzz|xzxzvxvx}rtwywln}rt|qs|qs|qs{prcqpesrkyxjxwiwvgsskwwmyyp}|p|{coojvwlwxqy}y~rw}qs{{wz|uzvtv}x}z{}|~~Ѽ˷»Ŀȱ¬v|wz{hj`yvl~pxvi|vmw|sx}x|xyzxzz~}yx~s|{}i|jzvmdùϼźŹ½úٽҹԷy{~~~~~~~z|~yqr~}~~~~{}{}{}xzz|wytvvxvxuw}rttv}rt|qsxmoujlqfhgwvarqevubsr_onfsqmzxl{zm~}omsn|`ksnvhozms|uu|x~zvv{zx~~~||xvv˼ ̾ǷĿȾĿĿwzx}|w`]X{zqy|u|y}|r|zp|{pyvm|rz{}|{}~|zyyͽĵrǿ¼ĺȾƼ·ǼĹ·øŹĿþþƿÿȸ輴~~|~~~~~|}}~~{}{}{}xzxz~su}rtwyxzy{xz~su~suynp|qs|qs|qs^lkdrqcqpdrqcqpjxuhutfvxh~gmzfz|j|esjvrwtu|}pu}szbir|y~uwx};ӼŝʾĿ½ɠ}}u|}{{s~u~xpw||swz{qwxnzv{{rzwvɾκ¹úºþºĻ¶з¾ǀչ~~z{yz~~~~}~y{z|z|y{wytvuwxzuwuwuwtv|qs~su}rt{przoqxmoxnp_jjcnndoogrreppgssfsv`rv]w|Zxauumy}q~ws|~x|}~|϶ľνƮij½ôŽƻĺŵʾþϿòöżĻƼĶ¸ĿҿþþĽĐļDz{|~~~~~}~|~z|z|{}vxz|vx~suuwuwuw}rt|pr|qs}rt{pr|qsxmowlncjjflmjpqmstkqrjquhu{\nuVp|Xynmssmq~{x{uuly}~|ųʻijΗξĿï´¤ŻºǼĹƻøþöݭ̽ʻѹƼüüüʾƼ¸ʸþɫ|}}~~}~~}|~z|xzuwxz{}uwuwuwuw}rt|pr|qs}rt{pr{pr}rty{`ddbefgkljnohlmiotn{gyoxsoqrqa`~noto`}s|~}~}~}y{||}ƺ׷ϺƶǗ¿Ŀ½ǫʪºȿøƽŻȿúǼȽ󶶬ɿ¥ľʾrtٸ¼ĽĿѬ}~{|~}}}z|xzy{xz{}uwuwvwvw~uv|rs}st}rt{pr{prtikmbdllpmlpoptjlqhjoekpuvibjovqclnethfixw{|~½î͸ğպǵ·ķɷĸÿĮ˴ƴúĹǻ̺ѺŹĻ}kRx}pξϾûķʱĽƿôĿŷȷ¾zyy۾ǥ~~}y||~y{xz}~}~|}}~z|wy{}{}uw|uvzuvzuvzuvzuv{uvuu}ss{qqxnntjjTSW_^bjkopswhkodkqary`|gjgddnbikofokgh}xut}w{w~z||к˳Ʈү˺¼Ǽʾ®ĺĸźø÷ȹĽ¹Żɾ´ĵȷƼǾoo~¦}sa}ɾǭ̾¶þ娬Ŀ婤~|~}|~~|}||z{|~vxylnvx~qs{uvzuvzuvzuvzuv{uv~tt}ss}ss|rrzppnmqjimklplptpswwnhZ_ilgm_gvc}hvwe|xqnt}xw}sz}Ϸƫʽ­ƵľͺĴѴ÷˾՛~˽zyԾõøȾĺƾù·Ⱥɻxvzvy^szyxlîĿ½ƽͳۼ}~{}y{|~{}|~~~{|z{suxztvuw~qs{uvzuvzuvzuvzuv{uv}ss|rryooyooyooihlkjnpqulosilpfpzoiohinhtwou~wn|sswsps||˸ᶾؼ̦ƛɼȶŽŹrn\sqprft~̮IJ¶֠|i;ʸzctƾĹ¿ĻĻżùøq}z}}bwu{ĿȽÿ¾¾娣z|~~{}}}~}~z{z|{}wyy{su{uvzuvzuvzuvzuv{uv}ss|rr|rrzppxnnihljimprvvy}nqu`jssruxw}vmmv{yiyp|yy~uw{}~|~~~~ǴƷ½þ˲ĭЫʿƿ´i|ĵ}umýʖ{÷u|rv~ĹĻǾĻú¸}|nyolxk{~ĿĿӾ߭~{}}|~~{}z|{}y{y{tv|vwxstxstytuvqryz~tt|rrzppyoowmmposonrqrvlosnqubmtnc{wqu[tizrm~m{tkznzgu}qwx}zz~~ļɿƾ˽Ɇxs{{jwtw~ʻŸ÷ow}ķ}wyyflsúúżżƺon`u͵˲з˲нȾŷ•奠y|~~{}z|xzy{xzz|xz|vxytuytuytuwrs~xx~tt|rr|rryoovllmlpmlplmqjlpknrisxl{bu{[pv`sz^ovjygvcpycnx_iscntku|nyuq|}~z|}~εñhpo{lnm[|x~|ŶĴµɼonɼ~pywnxuxuǿĻƽ¸ȗ~p˺̺ƙ{wȰȰĽ°Ǵī͝½겭~}~~y{~z|uwwywy{}y{}wxzuvzuvxttytu|vx~tt}ss|rr}ssuuhgklkojkogjnlosltvjuygx{l~iw|jv{cowjt|lt}bgp{lszipwry|{}~z}~|~z|}ĮĿ˲±ľǽmwxϼ{ygy~~xôŴƷó˾´ķŸ{x}iƴΓki}}Żú¸¶}vñtz϶¬ýþ½ùɼș}{}{}y{z|y{{}y{}}{~uw~wx{vwzuvxstytu{vv~ttuu~tt}ts}ssefjhimjlpjkomnrqowonwrr{ps{nrymqvpsstwwwxxzxyzvw{||xxxzzz}~~}~|~}{}}ެЫ²ľȺúlz}p`¾}uzxŹĻ¼¼ƺȾŻwtlĺɽƸe°ǹɼƼ÷žįjuvҾμ̻ȸŷԹõҾýÿ̷~~|~|~xzz|{}{}{}||}}yxuuyyxlnwytvtvtvtv}rt|qs}rtznqfgkhimklpjkomnrsqxlirlktgiqloxqu{tvvrttxxxzxx|wx|||{{{~~~{{{||~}}ʲŵ֙þ½½»˅|j|v~nƵwsoqÿĺ¹ǽtkϿȺοͽzfгƴʼɼ³˾ɼ嶵ƯŽƯovgư|o}~ḫ½Ͼ½¾ĿԹ~~}{}}z|}{}{}{}||}}yyuuww{}vxtvtvtv~su}rt|rt{prwlnnosklpijnjkomnrtqwqpuvuzllrlotnqurtttvvwwwxvvzvv|||zzzwww{{{~~~{{~|}~~z{{~}§ͺ¾˶Ȝ|k}r{kƼĽ|uh½Ⱦƺ׀|hvwmƛx|ƷȻɽµöȱtvvz|jn~j~i}ʹȺɬyz~xzxz~|~~{}{}{}||}}yyzz{{wywyuwtvtvtv{przoq}rt|qs|qsghlijnklpjkomnrrntwsysqwrrxosxpswrtttvvvvvxvvzuv|zz~||yvv}}~}|~|z|~wvx~y}z|̯ѿĭĿ˰|xm{rm}vƿvrqmum`lkQzuqɐyvwrgs}pxdzòǸ̻ķ}upjzr[xrqs}amyuwùóĿ˴ĿȤ~~|~{}|~{}{}{}||}}xxyyzzy{y{y{tvuwuwzoqynpxmoxmo~sujkojkojlpjkooptwsxxrwsotsrvrswsuwsuusuuvvvzxx~yz}{{zyyzxx}{{~|~}|~~{z}yѷþ½κͧ‘ѹŵ~uez|mssƭ~ůùkmYytzmԽxzwxԿͽƺĵö̿osgwkxotlywo̺¸øʼŷľĿ洵½ģ~}y{z|}{}|~}}|~|~|~||~~zzvvwyuwsusuzmo}pr}rt{pr|qszoq}rtklpjkoijnjkonosustwstsprtrttsusuvtvvtvvvvvzxx~yz~yzyz~yz{|}~}}}}}}}ͱʢþɶŻɽѼoѿȶtlsup}ʽҲxyjzvzmԼϾȴ´ȺʼöyzêvzrºɭýþƾĬ~}y{|oq~|~|~{}{}|~|~|~||}}zzwwwyvxtvvx|oq{np|qsuwtvujlxmojjnjkojkojkolmqvprxptuprurttsusuvuwwuwwvvvzxx~yz}xz}~|||||}|}}}~β¼þ¼½ʾglkϱµͲ¶ѿȵ~nпıvt{{|kǽȿ½ǵ½¸vyv{jҾɱ϶Ĭĵͺ̷Ȼİƶƹɲs|eȷ®ȱ|vsɺõʷǪŞ|}~z|su~|~}}}|~|~|~||||}}zzxxwyvxvxuwtvuw}rttikxmo~su}rthimklqnosjkolmqtoqwpsuprurttsuttvuwwvwwvvv{yyyz~xy~~|}z||}|}}}~׿ˢ˶ڷܴ½Ŵı̹{x®ű~~ot}|ktȽĹĸ~~xhӾԿ̵Ϲʴyblsʻ̺ɵįǴŲȹɼƹаȱư̺pxužƹįѹǼƵýɾɰ|~}|~|~|~|~|~}}{{}}zzyywywywy|oqsusu}suuw}tu|rt{qsfegihinlnmlnnmorpqusstrrtrqvttxvvwvvxvvywwwuuzyy~zz}yz~}w{|~}z|~~Ĩʴеɩȿû¿˻¿½·µĭȶ~kwwa˶ʿʾļżöܡɟxϿ˽|r~r~l}q~qȳƻʿ̽|{pnb~oz~}kq½ü¼ĿĮͺôɬ}~~~~}y{tv~qs|~z}{}wyy{xzwyvx|rt|qs~tvxsrwrqnjisnmxtrhgiihjllnllnnmopnnussxvvommtrrzxxxvvxvvtrrwuu|zz{|~yzz|~x}{~z~z~~{y~}~ʸøʬɤðµìǴz{gvt`xmY¶ĹżµŶŽ½Ƚ¼ʷ̾ns|{yy}nwvrűʺùlsqfzts}zɶóɼ¼о¼Ƽͮƴäǹƾƕ}~}}wy~qstvrttvy{xzwyvxz|suyqrzvu|xw}yx|xwzvujjljhjlkmlkmnlnommussywwrppqoozxxvttvttxvvzxxzxx{|{|}xzxrwz{{z||~~о¡ěȺǴ̷ӿƲѽwqvüؿȽ»żƙ~}jƳƳk~~wfwfsvgjz̸øûûùŻν¹ſ~ypvcxfxaüĻӿĿIJ{}}}}vx~|~y{y{{}wy}suz|xzxywxxx|tu{tuxts|xwwsrvrqvrqlkmjikjiklkmmlnqoovttywwzxxqooussvttvttsqqzxx{yy}xy|}z|ysxy~y~|~~|}~~}~z~éijõǽƺoqvym}~su|ǻùʿȗ}tjVõïòĘwqŹ»˻³ĺùɿ³ͼŷ~~rw[uƼͳɵȽĺΗ彼қy||z}~~|vw}~xz|~}rtwy~|~wyz|vxxzvx|~yzxywxyz|tuystzvu|xwzvuxtsuqponplkmmlnmlnnmotrrtrrussussvttwuuwuuusswuuxvvyww~yz{vw~y{{zy~{~~yxz}}}|}~~~ɫǻ׺Ŵszwڱ½rvjttbvv{tc}vez{x}i|h}~uqf~~rȾ·Ĺ¼¿ƭύs˼ϻпlǯɴѾŵȽîzx\wxdſνַɶߵѨ}{|~z|wy|~}|~~{}|~|~|~wyxzvxuwxy{uv{uv~xy{vwztuxtsxtswsrvrqvrqnmolkmnlnmlnnmorppwuuvttussvttwuuvttvttwuuxvvyww~zz}~}xzzzy~{~~yuw{vwz{|}yΞ´˷^ebҷz{p|~}w|{rqz÷÷ù¹ŸıtxϻǾƱ˸˺³ƶ䤯¸ùom}z{klİžztwȿ§ďԺ½ĿþâŹα՘|t|~}|~}}}|~z|vxwy~wysu{}xzxzxy{uv{uv}vx{uvztuxttxttzvuxttxtsmlnlkmnnpmlnnmopnntrrrppussvttwuuvttusswuuxvvywwz{}xzz~{z{~{~wtvyvx~ÿҲΞipmĵqx{~«ǮҸȽȽĸħž¿ƽrwnzjvpt`bL|zѾǽĺrwclİŭwŞ|{̾ĿǼ̼ٗp{p~~}~z|z|wyxz{}}~}{}|~|~~}vxvxwy~xyzuvzuvzuvytvytuzvtzvtzvuzvuxtslkmkjlonpmlnnmosqqsqqussussvttwuuxuvxtuxvvzvw~yz|}}xzy}|z{~{~~}~Žîʴ¿Ǻ̸~zǰ˳ɭĹǼĺø˾ɲſrwnvkirl{yyeػĹżĴκͷƴ̹ľȿ¸ĺ¸Ķ~μԾīӢǁzsrp{}{}z|wyxz|~z||~{}z|y{xzy{y{z|~xyzuvzuvytuytuytuzvuzvuyutyutxtsihjrqspoqmlnonpqooxrsvqrwrswrsxrsztu|vw|vw|vw}vx{vw{vw{|}~~|~{{}|y{¾ôȶĻĽ|uƱ̿ʾŹ÷ȹƻȽø·ӄpr|{yc~zfkrlsȻʮ{ɾ½ɮſ߶͓ܶɐ|ʈޟc|~}|~}|~wy|~y{uwz|{}y{wy~~xzwy~xyzuvzuv{vwzuvytuzut}xwupoupovqpkjlpoqonpmlnonprppsrrtrrtrrvttwvvwrs~yzytuzuv{vw|wx|wx}~{|}~~|~prrũƾʿw®Ȼ¶÷˼ļöõƻźĹьyqx®˵Ѽî͸кͺŲȷ˻ʽſŻĺù½ֵѾ˾¾¼˵ʯÈufdrz{~~z||~|~tvz|{}y{z|{}{}xzwy~xyzuvzuv{vwzuvytuyut|wvvqpvqpxtsnmollnnlnmlnonprpprootrrvttwttwuu{uv}~{|}xy~yzz{}xyz}|~~w{|pqȴgmlϧͰĻtqv¯IJ÷¼ó·ƽ¹¹̉zǴƳīҾƶĵ³ʿüȮŭżͼ¹˺¿ѺĬqixӞm{}}~~~}~~vxz|{}y{y{~xzwyxy{uv{uv|vw{uvztu{rr~uv|sszrrwooqprjikkjlmlnonpqqqnnnrrrwwwtuurrrrppvuuxvv{yy{vw}xy}~~}|}}}ĞÝƖƺƻʶĸrxwνIJþ{l̻ŵŹɲǻ̿ǿͺŻŵȸ̼Ƿw̺Ĵ¯¾˼{ɾƹɔku͚⇪|~wy}~|~z|}~wyy{{}y{|~vxwyxzwyxy{uv{uv|vw{uvztuzrr}uu|ttzrrzrronpjikzy{onppoqnnnooonnnuttrrruuuvttwuuyvv{xx|zz}xy~xz~yz~}~~Ǝlj¯þ|Ѱӷʫɼ̽ƸĺŻƻĿýļƷ˿µµſľ̾ݿěƭ̺ͺլƆyˈՂ~~~~~|~|~|~|~{}{}z||~y{y{xzxzwxvx~uv~vw}uv|tuuu~tt|rr~tt}rronpa`blkmmlnnmonppnppoqq~tvvqssuuuvwwvvvxxxzzzz{z||}|}~~{~}~{yyllfjkrqxnoyzԽ˨Ʊûɶ°ͿƸɽڸùƮƻȼ½Ŀ·Ⱦù¶Ÿϥũ¼w{vվȱ˷ʼ¿Ѯ|xúƳɰߣvjVVyTox~~~}}y{|~|~|~z||~~|~z|xzy{xzxzxzxywx~wx}vv|uvuu~tt|rr~tt}sslkmonpnnpnmopnpmoorttxzzuwwrttuwwttttttvvvxxxzzzz{|}|}{||}y|~|~|{}zqripnxeoilqq͹ׯǭǴ¶έ·»ʿѭþûôƾǕþĿpto˼ɽ̺ú~vrnʕ¿عջkyeam~t~~~{}|~|~|~z|{}~|~xzwyvxxzxzxzvxuwtvvxuwtvuutt~rrttsskjlonqsrtpprrprprrpttquutyxntrpssvvvvvvvvvxxxzzz~yzz{{||}}~z}~}}mnhohsmxproqºė»˰ѩqssմŹŶǾļº½ÿþýĻŹþwzu~½¾лĺƭyvr˱Ƽȹ˙lt{tuw}~}z|~~~y{|~|~|~y{|~|~wyuwuwxzxzxzxzwyvxwyvxuwxxtt~rrttssmlqmkqpntvszutyuqssrrrrrqrrqssputuuuuuussswwwxxx|{{~}|}{{}}~~}~{}tw^eykpklsrttnysǿžzxwDz˨ѶŞ||z~nquz½þ¾òǿ¾ƾſýö;Ǹ˼ɾw~zum|wo{v~unkf`{yr»ۯĿüɿƿÿ¼nsqpvuǾᢥv}zyyyt|~|~}{}|~|~~|~}xzwywywywywyxzwyvxuwuwuwg[[uu~rr~rrssmlponrsrvposposvqstrrrrrrrrqssputuuuuuurrrsssuuuussywwzxx}{{{yy|zz~||}{{}}uwx~~zmwlxlwen^ooǰŵhfeǾĵȻ»ϴƸ»ýý³˾ýµƶ|u|u~w|zq~txsjxo{r~wyrvjdzpiytmhf^˰ûηļļǿļ|oqkuyt{~|Ž흡t{zu|g{avxrs|~|~}{}|~{}~{}}y{wywywywywyxzwyvxvxvxvxwwzz{ooznnlkolkponrtswtswvqrtrrrrrrrrqssputttttttoooqqqzzz|zz{yywuu}}~||~||~~}}~~{|}Vqa~]zcvþĽƿ»ƼǸ»ruo{y}nz{}{swx{xsqisqisqisqizpiwp{qjtjcpf^ki^rncpma}tj~ukwohys{rk~|tef]ɾƿϪºü|jf^wtlw¾ϷŽޑuvvX{w|~|~}{}|~z|}z|}z|wywywywywyvxwyxzvxvxvxwwwwxll~rr{ooqpqnmonmopoqpopvqrtrrrrrrrrqssputsssssszzzwwwzzz|zz}{{{yy}}~||}}}{{~~{}z|}suv~xst~vǃoqǽwut׵»¾žοүļ½rwu|~y}z|}{uyupszuqzxjqqfvkne`bY_[Sic\rnfrlenjblf`rnfxrktphysl}vo}slwp|rk{qjxq~zo{p}wlvlukzpi|pjzrkjh`õΰ}uxumif^urj}~|ķʷܠŠom|~|~}{}|~z|}z|}z|wywywywywyvxwyxzwywywytt{oo|ppuuyynmokjlonpqprrqstopusssssqqqprrotsuuuvvvyyysssvvv|zz}}}{{}}~||}}~~~~}~drnVSʞnsqѱü¯ִǾºrwuxvuomlwtptpk~w|{{}|ux~voy{twp{wr{v[YTjjdsuornioidqkf{upoidyt|qm|qmvrvr{plxplvmiqiezrm|up}vl}xkzugxsf{vh{m{uhxwhzwlvvlywo{slzqjzrkypixpizqjxpiypi{sl{rk}tm~tm~tm~tm|rk}sl{xj}wjxk}tg}tgulznh{oi}untsk¹ŷèǿqnfhe]jg_{xpxx~ſ抩ysс~ۧ~{}|~{}}~wy{}{}xzwyy{y{vxvxtvuwvxvxwyvvuuxxssssnnnlllppozzzssstopusssssrrrqsspttuuuvvvuuuxxx|zz|zz|zz|zz}{{~||}}~~~~{yy]p^`Zqnsqz}ʼüűּͷ½»vtsurnxtotngumdrjaof\nf]vmdxpfzsc[Te^Wme^zsl{upwqlxupvtozuzqmzqm|soulhyu|lixkgpmsourtpsp~so~pm}rnvlxjth|sf|qe}tg}uf|th|vkxvjxuk{pj{oj{pj{oizpi{oj{pj{oj}rl|pj}rlvovo|rjyohzpi|vg~vg}wg}tftftl}nhynhog`abYƼžøzvukgb{¿ùӒ{|zѯĿ¿tsz}ug˓猪}xy~~|~|~{}}}y{z|~~xzwyy{{}xzxzvxwyz|xzvxss}qq~rrtt|ppooommmppptttoootopusssssrrrrttpvtvvvwwwxxxttt{{{|zz|zz|zz}{{~||~||}}~~glq_ľ±~[`^õʼĺȼ½ذĿsqp{xtuqlxrk{ri|rh|rhvlb}si}tj|rkunyr~tm{qjzqmxokxrmvrmxupvmiujfzokvrzoksorosptqpmliropmolroqntkujth~qe}oc}pdsf|te}tgzuj{sk|nh|nh|nh}oi}oi|nh|nh|nh}oi|nh}pj~tn~tnzpiyohzpi{vg}vg~ugvhvhtl}oizlfrlfjmdüӅjkihedrpoϯ|אxyw飤½ۊ{qfɈk|~~~|~{}}vxz|~y{xzwyy{xzvxtv}rttvznp|qs}rtttssww{oo~rrpppmmmqqqoootttsppusssssssssttruuvvvxxxzzz{{{{{{|zz}}~~{yy|zz~||}}~~~~}~angsbgȫΰ޺µjolu{v~ľܣxvtwtpyupxrk}ri|qgyndzoe|pf{qg~smvn~tm|sk~tmtpxokumisoj{wrxmhuhdxkg}qlzni}nipmommkmknlmiokqmpmoksjuisgpdpdrf~sd~se}tg|si{ti}nh}nh}mhoioi}nh~nh}nh~nh|mg}oi|rk|rk|rkzpi{qj~wh~whvhvhvhrj~oiwjd}wphkaĽžu{t}z񱬪}ysvȩƎ}Ɉҁn|z~}wx}~~~|~{}}{}z||~z|z|xzwyz|z|xzvx~suuw{}y{y{yywwvvuu~rrpnnpnnpnnpnnrppqnpvrutqswtvxuwxvxxvvxvv|zz|zz|zz}{{zxx~~}{{~~}}~~}}}}}|~yy{NkStRqbZkls࢙ͳ~}ac]lnh}ƺͼ½¿ù÷ɽĺľĿrumrtjqpgpocxsgwoetmbvndxpfxshxsiysh{rh|qgzpfzokvmiwnjwplvrm{rivmawnbxocvmatjashdujf|qmynjwlh}qfpfpfpfqgvjthrf~qerfth|sf}uhritlrm{rkwoh}tmxohxohzpiukd}rk|qjzpi}rk~rl~rl{oi|pj}pk~vi~uhvjvjuixn~tktnd~ĕllbw|Ę~ċzӽ𢣟ĺĴftnsj|}yz}~y{|~|~wy|~~{}y{z|vx|rt~suxzwyvxxzzoqxy|uv}vwvvwwxx|rr~uupnnpnnpnnpnnrpptqsvsuvsuwtvxuwyvxywwyww}{{}{{}{{|zz~~|zz~||}}~~}}~~~|{}~~~zLdzXsbzav_lptɰγҏkkedd^ttnggaooi˿¶ʻ¸ҙruluvmsrhqqesmbwqf{ujyshxrgwqfvrfwqfzqg{qgzpfwlhvmisjftnirnjzqgxob{rezqdzqdyoe{plxmi|qnynkznkrg~sgsgrfrgvjuith~pd~pdvj{reypc~qislsmzrkvnf}unxpiwohzpivle|rk{qjzph{qj~rl~rlxlfznh}qkxj{nvirfrezndxndtmd|zrŭkhc¢y徾铉¶rkzeyeyWjXjet}xz|~}|~y{z|~z|wywy|qswyz|y{xztv|rt}uvyst{uvvvwwvvvvuupnnpnnpnnpnnrpptqstqsvsuwtvxuwyvxzxxzxx}{{}{{}{{{yywuu}}~~wuu~~~~{|z~~}}Qcycyaudshsov݄|~~Ԍ{zvyrrlnnkad_rxsgniZa\jnc~u¿ϮMPGwxoutjrrftncuodvpeuodvpewqftpewqfzqgxndzpfvlewogtlenhaqnfwnd{rewjvi}tg{qgunzqi}sl{qj|rj}tgsgsgrfthvjvjuisg{maxlqh[ul_~qitmvp{sltlf~vozrkxphzpixngyohzpiyohzpj}qk}qkvptn}qkwnzpvltkul}s~tjune}wt|~{ɟy𤦠ĽrhhŹsyjsszu{~~}z|xz{}z|wywytvy{z|y{wytv~su|tuyst{uvvvww~tt}ss{qqpnnpnnpnnpnnrppsprpmosprwtvxuwyvxzxxzxxzxxzxxzxx|zzxvv~~~||~||trr~~~||}{{}}huhyexhteu_oĵed`~|}svvjnnb__SNNBXXLrphþ\_Vqriutjssgtncvpexrgyshwqfvpduqfwqfzqgwmc{qgyohvngyqjuohrogypfxobsj]tk^zqduk~tm}rl~tm|rk}slviviuisgthvjvjvjthwky~qitmwq{slskdxqzrkxpiyohyohyohyohxngzpi|pj|pj{oi{oiznhypfyoe|pfpgrhwmzpftmdzmhgxx~þzzny󆈂zppon~|~~}z||~}{}y{z|vxxzxzxzwysuwy}rt}uvztu}wxvvwwww|rr~ttpnnommommrpppnnolnroqurtvsuzwyxuw{yy{yy~||yww|zz~||~~}}~||~~}{{}}uss}{{~||~}}xzz|xyamj|h\phd~ȏ}|xsqgRQGmpghi`yxnrrfysh|vkyn~xm}wltncok`{zqgxndwmcxof{ukzsjytkusiwndzqdzqdxkvi}sh}tk}tkypf{riyp~vi~uhwjvjvjxlwkvjvj{ovr~uhzmetmvp{sltlfxpiwohumfxngzpiyohxngyohzpiznhznhznhxlfznhyphxmeyldnh~ngui_mcY~u̥jc`~{źʿƮ줨ɻ~z~uuɼ‹~~}~~}z|wyz|z|y{|~z|z|susu~surjkz{{uvvvzzvvuuuupnnsqqtrrvttommnlntprurtwtvwtvxuwxvvwuuyww}{{{yy}{{}}~||~||~~yww}}~~}}|wytd|Tt@cVɨЮ}||vhhbyuľqriull`wqfvperlawqfvpfyshvrgoi^|si{qg{qgxofrkbtmdwrisqhyqe|sf{rexkvi|sf|sj|sjypgzri~ulzth{tf~uhtiuiwkvjuiqeth{oc}tg}tgxkcpirlxpiwohxpivngvngzpj~tm~tmzpi}slvoxlfznhwke|pjymgxofxme}phqjohwm~tjf^Voic¦í|zpļ˘˭蜒Ӎ~{}s~~~}y{{}z|xzy{z|y{xz~su}tvsu~rttlmyz|vvyyxx|rr~ttvvkiihfffddrpppnnnkmvrtvsuyvxsprxvxzxxxvvwuu~|||zzyww}{{~||~||~~~~~~}{{~~r{tʂж蠫nsrՑwwq~~xzxļǾuvmsrhyymxrg~xm{ujvpepj_ztiplauodzqgyoe{qgypfwqf{ujspdsqfyqd|sf{rewj|sfxobxoexoexoezqgzqgxrfyqdzrf{re}qesgsgqeth~pduixob{rexld|leoiyqjwohvngxpiyqj}slun~tmzpi}slvoxlf|pj{oivjdymgvleznhuopjpj~ri{qgaZQ{tl{tjĺxpqy~{m~жxxºމ~}}~z|~~}{}|~xzz|y{z|y{~suuwxztvsu|rtxpq|vx|vx|rrzpp|rr|rrvllonnnllmllsrrrqqnjlwtvvsuyvxqnpyvxzxxxvvxvv{yy|{zxvv|{z~||~||~~~~}}|zz~~kldNyqooӉťſywsҍ{ººttjxxmxsizozth|vknh]xrgwshvpdvndulaxndvnbtnboi^qmbqodxobzqdypc}tfxobtk^wndwndwndzqfwndvpdvodypezpe|pergrf}pe|nbrftgzpe{rfzmd|leoivngme^og`zrk}un}sl}slyohxnhyohzpizmhvo|qj~tl}rllc\shaslzlfpj}qhyoe}t¹pk^}o}orma|fdVĝtkg؈~}|zzǼŌy}}~vx}~}{}{}wy{}xz|~y{yoqz|uwsu|qsyrr|uv~wx}}}}|rquu{qpnqrjmnloplopmpqssusrtsrttsuqprutvvuwtsu{xz{}z}~y{|~|~z|{}}~~}}|~{xzxwyyxzsaV[Od𓫪rnkӠ}ɿw{kphx}t|cf[ͶprmurntojrnfsnetnciaT|viurcurcb_PfcTrn`wp`upasqbqodombvpevoexoexnd{nezoexnaxobynfynf}pkynguib{piznhxleymi{ojxmftmcuqftpexqi{qjxlgzlgzlftleqibpha~vovngyohyohzpiwmfxngxogyrhlg\upeqncpmcnk`urgsrgvujsth}rrqeȾ˿cg[xƸ˽슈je`❓ƻ}|~}|x}{}}~z|xzwyzmoy{wytvwxtv~su}rt}rt~sutvynp~svzoq|qsodfimnlpqnrsjnonrssrtsrtsrttrtqprutvvuwutv}z|{}z}z|{}}xzz|{}y|~}|~}}}z{zgf^Wc~zv~~zztYYS늋~uuief\ŹmjftpksphupgtnckcVwpcurcurcspaol]ol]wpavqbtm`podmk`tncsmbulbvlbxlbxlbwnaypcxmetiaznhymguicznhznhxlfvjfxlhxngvofuqftpexpi{qjznh|nh|nhvngwohqib}unyqjwmfwmfwmfwmfyoh{riypf|quqfsqfsqfxvkxvkuuiuuivvjxujQQEƺ`dX׋ڣ|`\W雕Ѿ~|z}{|x|wxz|~|~}}xzuwz|{}}xz~su}uvtv~su}rt}rt~sutv~su|qszoqtvz|dhitxy]abjnonrssrtsrtsrtsrtsrtsrtvuwwvxxuwxsuyru}xz{}|~z|{}y|~~{z|zz|\vttvUS8]bzxt񡢞QRN|z{yƺ͇~lmcʢliernisphupgvpesk^vnawrcwrcsn^ql\ql\wqayqdrl^planlbtncsmbsj`vlbxlbxlbwnazqdzogrf^znhxlfwkexlfznhxlfvjfxlhxngzsjxtivrgxpi{qjznh|nh|nhrjcumfphavngwohwmfwmfwmfvle|rkwnulbvlvqfuqfsqfssguuiyymssgtuhvuΟ~w{ی{{zʼwxt뭱omh閐÷ѺɁzx}{zu|~vxz|z||~}}~xzxzz|z|z||~wyz{tv~su}rt}rt~sutv}rtvkmuwzoqvkmvz{lpqptulpqlprsrtsrtsrtsrttsurqsvuwwvxzwyxrtyru}xzz|}xzz|{}}|~~dv]|QuCjP{YUlw|uvt|iic¼Ż[[Okk_bcY~RRFeb^okfpmetnfrlavnatl`wqdwqdpj]pj]ni[zpd{sepi^uofytjwpfuodtkawmcymcymcul_ypc~skod\}qkxlfxlfxlfznhxlfymi{okwmfxqhuqfsodxpi{qjymgzlfzlfrjcrjdskdtlexpjxngxngxngxnftjcqh_xndwndwqfvrgwshqsgtsgwwkpncsqfzq~Ⱥgb_Ç~{~zztqlyzvҦ|z~|{z{~}{}y{z|{}y{|~{}z||~xz{}vxxytv~su}rt}rt~sutvzoq~~su|qsynpgklmqrnrskopkopqprrqssrtsrtrrttsutsuyxzzwy|wyx{|~}xz{}z|{}||~urt~}yxz~~}~~fpcvUkUj^uh~{wTUSԕϳ񬭫u~z{q瞝zxm[XTrniqnfrmdqk`vnavnawndzqgulbulbvlczqdxndwndvngyqjvofsmbulbwmcxlbwkavm`xobxme~skwkexlfymgznhxlf{oizv~rn{qjrkbtpeuqfvngwmfxlfzlfzlfskdphaqibtld{sltjcukdvleyohxngof]xnd|qgwndsmbrnclpdkma}}qqodtpe{Žnkc~٣Ľʪ|vvp¾̼ʰ{~~~|~|||nk{}~}z|{}|~{}y{uw|~z|z||~wyz|xyuwtv~sutvtv~sutvy{|qs|qsynpostimnostjnomqrqprrqssrtutvqprsrttsuxwyzwy~y{~xz}xz~y{z|z|{}{~~|~wtv~~}y{~frglirpy|{|uurТ¼Ҕ񷸶mlb}sYYObcZɿxsh\YUvrmsphrmdpj`vnazrezpe|rgukaukauka|pfulash`sibsjfvnfsmbvmcxndxlbxlbxob{rerh`ynfymgwkexlfymgymgthbsoznjxngrkbtpesodumfzpism|nh|nhtlerjcskdtlexpiwmfxngyohyohzpisjazndzpf{rhwndslbmtgprfswshxqfnhaebYvĹŐ~~||vrrl|{upsmnqk䨫z}|z|z|zzy{|~}z|{}|~y{~suwy{}wywywy|~z|xyuwtv~su}rttvwyuwvxynp{przoqgklkophlmjnomqrqprrqssrt~}rqsonptsuvuw|y{{vx~wzwrt{}~z|z|{}z~|~}~{}zy{{z|~~~qsplroqrkh~~y~ed`¢}~vuk~sojpmeojapj_sk^xpc|pi|qiujbujbujbxlbzmeynfvkgwlhtndsmbwndxndymcxlbxob|sfxmepe]eYSwkexlfymg{oiuic}qmso|rkuneuqfsodumfzpivp{mg~pjskdrjcumfwohvng{qj|rk}sl}sl|rktjb~rh}pf}siypfvqfhqduym~s{wl{vj¶uql}mqfŒ໻wp~w{x|~ɤz{ussmvwqzrtn֔ͱИ{~~{z{}~yz~~}|~{}z||~{}vxxzwywywy|~z|xyuwtv~su}rttvwyuwtv}rt~su}rthlmfjkimnmpqlpqqprrqssrtyxznmopnptsuvuw}tnp{uwojl|~~y{z|{}z}{}~~}{uqokuoysvrplibr⌉w~hgcȥɕjj`y?@]`Pkn^`XJjaSrj[vh~otnbzuÿʽŲٖҰŜ|}yzz|z|z|z|z|~}rt}rtwywyvxuwtvuw{}|}wqrvpp{uvvpqrlmgfhrprvuwqprrqssrttsuutvutvutvutvxsu{vxzuwzuw~y{}z|}z||y{~{}~{}zy{~|~{z||{}|{}|{}{z~fionopwyoqstihrn͝ġ}{zþhdc[UT]YXohhwrq{ttnih}|rnjLFD{ysp|xtzvmuthtqfzym~{p}r~|qzxnushvtiqodrpesqfushvtixvkfd\da\}xggappjmmgee_`a[ooipqjstnZaZY]WZZTokfic^ZVQmjeqmhc`[_\W\YTi`\YPLi`\qhdvr|x~z{w}y|ƶο˳ͽŸ򞠳ˣǨſ⾻ÿЫ~|}{|kefz{z|z|z|z|z|ynp~suuwuwxzwyvx~su}rtumnwqruop{uvystystonpsrtjikjhjmlnsrttsuutvwvxnmoxwy|wy~y{upr~y{~xz~{}|~}z||~|~|{}~}}|~|{}}|~{z|~}|~~}|~ÊXZmmprkmoskmjjge~~wljjpnnǧpnm~{z}|{zved`wuq~zvjl`sth`bVdeYdeYXXLKL@jj^XYMddXnocqqeuvjjj^efZeg^}~xghattnqqkz{y{y˻Ǻ̽ŶùŻŸԷʺʠӶͼ~ynp~z|z||~z|z|vxvxwywyxzwytvwxuopwqrystxrswqrnmopoqrqsyxzzy{srttsuutvutv{z|wvx}xzz|}xz~{}|~}z||~|~|{}~}}|~}|~~|~~̈́чZ]fdgklsnuinfkegxw~xwtuӯ÷ʾŹȼĸ;ľſĿκ½þÿŶǸĵĴɽǿѽȿû}}{Ϭɺ~~}}~}||}ncezoqwyvxwyz|z|y{vxvxy{xzxzxz~tv{stvpqwqrxrtxrsxrrnmopoqtsurqspoqsrttsuutvrqs{z|tsu}xzz|uprzuw~{}|~}z||~|~|{}~}}|~~~}|~~~~}jno|~|{}傇zznhYcV_\fipkrqyef}y}ĸɽĸľſ;Ĵ˻ǹ|}v}{{Ƥŗܢ~~~~~z|{}~wywywyy{xzvxxz~tv{stxrtxrsxrrxrsxrtpoqrqspoqqprrqssrttsuutvutvxwywvx{vx~y{}|wy{}~{}|~}z||~|~|{}~}}|~~|{}~~}rvv~~Ñ炇rwutݓ߀܀}t~w~wxtpۼľĿɼûɹô~Ŵ~{Żwst{xdkgdliiqnbf\UYN`dYuynrvk¿ґ~z|tv}qsxz~|~xzxzwyuw~suwytv~uw{tuxrsxqrxrsyrtxwypoqsrtqprqprrqssrttsuttvwvxwvxvtvvtvyvxzwy~{}|~z||~}}~|~~}~~}~|~~{}ꊈXZ`e҄wrzozp|rxttˆÁ{vu}}ӿĻĿźӾķȰúŽļ¹ǿ̬ÿùǷ~qzjmaejZfk\PYN190dldbhc[b\۹π|wy~~tvwy|~|~|~y{wyuwxxww~ut~tsxonxxuu|ss{qqyppyyjiktsusrtqprqprrqssrttsusrtwvx{z|zwywtvyvxzwy~|~|~{}|~}xz{}|~~~~zy{~}|~|~}z|}~|y{~㏍㖘|rw|dnƒ׀ȅz}xyͱ¿~~m~xn|yvcxufnk]`_Putf}|mxwivufihZji_[]TX\Sqtksuj{~tx~sy}t}|vzuñʻ}}xz~~{||~~~xmoz|y{wyxzxzwywyuw~ttuuwwwwrhhvv}ssvllukkwmm}ss{z|rqsvuwqprqprrqssrttsuvuwrqstsu~{}|y{zwy{xz|~{}|~~}~~~~|~zy{~~{}}~}xuى䖜}sqyu|؂w}xyto}y}¬ϵֻɭ̱yrogVvqbvserobjh]jg]ecYhf[ebX`^SpneYWOpqhoriz~sxr|uvrxztpsjz|}}~|}|}{|{|{|}~~{|~}~wx|qsvxwyy{vxuwxzwyuw|rr~ttwwxx}ss|rruu~ttzpp|rr}ss`_ahgixwyqprqprrqssrttsuxwyutv{z|{xz|xz{xz|y{}|~}~|{}|~yzxik`gszdžytephqV^ho~}~ź~wxmxlvw]z`{dq|flky_jRlYvfuVL{bW|sm`soeqlclj`ig\nl`jh]ig\^\Quskhf^\]T|~~tz}o~wzrtnijfbc_ʰʑ}}~{||}|}~|}}~~wxy{xzxzxzwyuw{}wyuw~tt~ttuuxxvv}ss~tt~ttwwvv|rryxzsrtzy{utvqprqprsrtwvxyxzzy{xwy{xz{xz}z|yvx}z|zuwz|}{}~}|~~}~~{}uwx~}՜sx^qiwsvtt|}ƽǿ~zryslqkdib\gaZb_WYWRTUO`_YXYSUSNae[YZO;;)|cttqunhZpfL~gIxXbuYv[fMevWrRwZw\zilqalkIgqYgOhRt\}wZsZx{bSoameYoi^rmdqjdif_hf\hf\jh^dbXig]qofebZWUMsuky{}ry|z{|xprlx{r|sqp~}˯ю|}||~~}~|}}~~|~}~|~|~xzxzwyvxwyuwtvuuvvwwxxuuuu~tt}ss|rr}sswmmsrtonp|{}utvqprutvutvvuwxwyxxzvvxxvxxuwxuwxtv}z|{}|~|~{}{}~~}~~~~ϟܱڪʰ|~ikk^``TVVTWUcfdILJ`caX[YJOF=B9LQHdi`~V[RZWOb\Ujd]ke^qkdsmfrniplgkgbmidplgopcvvgfaMŭuYzZpPa_lfun\s}^_]_j`hGba=ǡ}Ŝzy[РŕzcloɢzRtиɮȯu\ϷӱϱiVBrbmd[kd[pjcpjehc`dbXdbXfdZdbXge[nhaebZNLDqomyyr{|r~t|}}ylkgnok}{ca`ſİϾоεŦyz{vw}~~{|yz|}|~|~xzy{z|uwtvvxxzuuvvwwww}ss}ss~tt}ss{qq~ttrhhhgitsuvuwrqsqprsrtutvutvvuwwvxutvwtvxuwwtvvsu|y{}|~|~{}~{}}|~}|~wvx~~|~y{|ձОĨuwxjll|~~qtrpsquzq{w|pul~z~bg^pldqibne^phaof_jc\lfamgbid^lgbqkfjiZmiYqkUŬ~sUzZdiJbĭȵv|YzOT_pKǢg@|UvJ׭wQiHƴfɒjdvJɑ~PҾԻҴy]ε̸fʀiTziXkaZh`Ynhcnfdhcbgd\daZfc[daYgd\oibjc]pme{yxssmv{yw~~¤}~~|}|}z||~y{|~}y{}xztvuuvvwwvv|rr}ss}ss~tt}sswwukktsuutvutvrqsqpronpqprutvutvvuwtsuxtvzwy{xzxuw{xzz||~|~}}~wvx~}z|}z|z|}{|}޵ĸͯǭsrpuww{di`id\ne^of_phaqibpg`oebqgcneapfbqhdhhWplYsmVȭdּ̲g϶ʱѻљ}WyM{K{Th@辧W_h;ѣ_wSíaȓhcsEyIsQmڼϮfrLtNyXv\E{hWkaZg`\lebmfcgbahe]gc[c`Xd`XecZlg_tng}{~tw~~zws{|x~||ƾͪz{}~yz~|}y{{}y{}xzz|y{wyuuvvww~ttzppzpp}ss~ttxnn|rryootsurrttsuonponppoqsrttsuutvutvutvvvxxxzzz|zy{|{}~{}}{}~urt}|~}~}|~~~}~{|~Ԑ{{{xrs`bbwyysuuhjjdffWYYgiikmmwyypsp}|y~upulw{ulpkmc_oc_sebtc`yfcvfcneamd`ofbpgcneadcYebUrkXӽxzeOkƩf][@Ӳkj>s@X}U)ɯd\gC޻_}Z²eÌe_rNƝahmT\ZcmϮdMhhPhe[a_Vkhchc`mhec[Wg]Zg_[i`\tlhpfb|}t~v~ɢ̿Ⱦٻ|}z{}~|}~~yz~z{|}z{|~z}z|xzvxttuuvv~ttuuuu}ss{qq{qq{qq{qqnmoqprnmonmopprsrtvuwwvxutvutvutvutvwvxyxzyxz{z||y{|y{~zwy~~{}|~}~z|~{}}~|~{}~nrssno{vwikktvvprrkmm~~~}~ptneiclf`nc_qeasdavebtdblb^lb^neaoeamc`fe[ebTlfRԾxxdNy_ǿlcáǡ|vIm:„\ZƒuHXeBᾦhyV°dĎgcvR͍pQN̿rYcU\uT`HilSki_ebZea\e`]e`]c]X[UPjd_oidjd_yqm~}~ǪƳ}|~|}~~xy~{|zzwyy{z|wyuwuuvvvvwwwwvv}ss{qq{qq{qq{qqpoqqprtsunmopprqprtsuutvutvutvutvyxz{z|zz|yxz{z|~{}|y{|~|~|~xuw|~zy{z|}}xz{~}|~{z|}|~~||ͱɡtxyXZZwyyqssacc~mqktxrmqkjfbkd_nd`peaqfbod`gb\gb\je`kfaic^fe[ebTf`MÞwqdL՝z~v[{]6SUWah;~TpM߼ouRĬbƓkitPϛcQǬqH}S}VɊuUnWeiPge[he]{~{}}wx˹Ǻ镓~~|}~z{|vw~}~~xyz{yz{|}|}y{xyvvvvwwuu}ss|rr}ss{qq{qq{qq{qqpoqmlnxwypoqonpqprtsuutvutvutvutvwvxyxz}|~|{}~}{xz{xz~{}xuw{xz|~~}|~tvwvuw~}~|~~||z~wyzjllceekmmlnnikkXZZHJJPRQehfdhctxrtxqx|vhgagd_ie`ngcohckd_f_Ze^Zic^jd_ic^dcYfcUe_L̜uulVwqkRγдrX3`ϟrvNvJАsFVqNཞ`sPë`Ôk‘k]޹pPEzNynQݾ^j@hAЍvV]Ep~y}~ÿ˺ڡuw~}~}wx{|{|~~xz|}}~yzxy}wxvvwwxxwwuu}ss}ss{qq{qq{qq{qqnmosrtnmonmorqsnnpxwyqprsrtsrtsrtxwyzy{yxzxwy~}roqzwy~{}~~{}}~y{|vuw}|ȧilfnpjde_fd__[Va]X\XS`]X[WR]YTa]X]\R\YKjdQƻk{e^Fou}bï{R~R~VSϏrE|Rc˭ohEΣ}Za\zTΐ~][re̔tLvL\5gG}W?{hȤ|}y|}y~{|}~~z|ƿ̷ɿ›}~z{}~}~}~{|}~z{yz~{|}wx|}|}{|}~~z{zuv|ttyyzzuu~tt}ss|rr{qq{qq{qq{qqnnprpronppprtsukjlzy{qprtrttrttrtxwyzy{}|~}|~|{}{xz|y{~|~~~~{}~}|~~}|{}mkkΦ}|~ikkfhhprrgiilnnrttikl\^_^``uxvovoiqj~}x}Įo¿vmVoҬ_e=}USǏrE}SeᾧipMΘrOfazf@װrѸdfΗzNvKd=؆kL}W?ziüüy}r}~z}~z|{|xyzvz{w}~z~~{{|x}~z~{ϿɸԱ~yst}~~{|{|{|yzyz|}~xyrlm|}xxzzzzwwvvuu|rr{qq{qq{qq{qqonppprqprrqstsujikzy{tsuttvttvttvxwyzy{zy{{z|~{}{xz}z|}|~z|}z|}y{|}|~~}}}z}zukhd}x|jgYx˵ιn˯|aÞ[wO|TU躒tHV\ǚ\uR˩rOᷢ}Uuc<ޘkԥquYӰuHsG`9̊nO{W?zl~yz}}}~xxxx~~y~w{plofac]~{mnjghdqrnxyutuq{|xvwsyzv|~dz˽ǝ~xy}~z{|}|}z{zz|}xywop~yyxxyy}ss~tt~tt|rr{qq{qq{qq{qqonponprqspoqsrtjik}|~utvutvutvxwyzy{}|~vvx~}|y{|~yvx}z|~{}~~~~~~}}}|wxzuvy{{Ŀľ|{qkhZvpծDzuȫz`̬vqLYZ}TYⳔwJUyTβѵ༚iڷӬѪɢhxʟdvJpCuMΌqQyU;m|s~ws}v||{yzvyvxusijmhgronjji||~xurmgic]dbYlpead[moiYZVlminokttqrsozywegbyzvyzv{|x|~ԸǞyz~{|}~yz~{}{}{}y{yx~ttvvutvvww|rr{qq{qq{qq{qqqprqprqprqprqprsrtutvtsusrtsrtxwyxwy{z|yxz}z|~{}}~}~}}z|}z|~~|~}y{}~}}~~ƨzwy}{{}xyuvwnnn|{{~|o|ubѷ~^nTĬӈoX~fN̅hDVQyOg=ɞqFZoIfʣrM|V]ʭչiIewW~^{ijhqLwQ}YtP|^pfb|zxzvr{|w~ywsn{wrkealgcmgdlgdmgdqhed[Wmdanfbnfcqheg^Zja^g][lc`tmikmhce_lnhoqkmoisoowrswstytuzvvywu~}y~z}þʱ}y|}~z{~yz|}{||~z|y{wy}xz~suwytvtvtv}ss|rr{qq~ttzppqprqprqprqprqprpoqrqswvxxwyvuwxxz{z|zxzonpkjl~{}}~~~|~}~~~{}xwy}wwwwwwwuu|wxz{϶sTeŦq{\qR̴Ͳ|hhIWRzLRgSZbrHiAkAZa}]mLgL.otXtVyY}]vWmN{cxtzqmoidrlgqmhgcbkgfjfeda`iedpkhie`gc^b^Yc_Zd`[gc`idajebjebjebphdwnkofcpgdpgdd[Xh_\wnkwnkrifqjgoqkuwqnpjoqkprltnpupqwrsxtt~yz~|{~|{~ywwʿǻ̿IJ~~~xz}~~}~z{|}z{z{z|{prwyvxtvuwtvtv~tv}ss|rr{qq~tt|rrqprqprqprqprqprnmomlnpoqwvxutvxwy{z|xwyvuwwvx|z|~|~~}z|}z|}}~}|~}|~}|~}}~}{|ſĶyvxy||||vvvvttxst}xyrkn|y{xuwutvxwyzvpoxjMyYlV3uSwU~hF|dHbUo\sL1ǜzvOuEk=i9xJyIuJyMqEpCwKtLvYx[ysn¥ȴ̵DZɱ~maVRh_[]WR_YT\XSd_^fa`hcbe`_e`_snkgc^hd^ie`jf`fb]mfclebmfbmfbmfbmdanfbulipgdpgdsjgofcnebnebqhevoljlfegajlfkmglnhsnormnupqxstzuv~}~|}|igfɻӬwy}~z{zuv|}z{|}wy|~y{z|y{y{y{vxtv~rt~tt}ss}ss~tt~ttqprqprqprqprqprsrtqprwvxqprqprvuwwvxwvxzy{}|~zwy|y{~{}}}|y{zwy}|~}xstnkmpmogdftqs|~~~~yzunqyvxzwywvxwvxrttwyywyy|~~}{}}z}{nrmuwqxsr|wvxtryyv{|xz{w||}xu}yv{vsytqpi`zqd{bjU=zcgPthp\qd|l{ЯӱʬӲغݽϲˬæȨή~k|dhzb|n_qbT|m_sdVykUG^VDh]RmbY]RIZNEcXOl`Zla]kb^f`[ga\fb]iaah``g__f^^jbbfa^fb]hd_njemidlhcnebnebnebnebnebofcofcofcxnlqheofcpgdrifuliunkprllnhoqkoqknpjqlmojkz{ytu~||{yy~Ţ̞~su|}z{}~z{{|~z{{|{}~z|xzvxuwwytv}rt}rtvvvv}ss}ssvvrqsqprpoqrprrprtrttsuutvutvvuwwvxwvxyxzyxzyxzyxz|xz|z|~z|~|y{}z|~}~xvx{{{}}~}rpp{yy~}}|zuvlhh|y{}|~{~~~~{|y|snpyvxzwyxwyutvgiiy{{dffhjjeggdffeggikkWYYTVV[]]`bbZ][[^\[_ZZ\V[VU_ZYd_^\WVQLKSJKNHHfbaZXWZXWYWS[ZV`_[a`\`_[b_[c\Yd]Z_XU_XU_XU\WR[SLZQGzqdiaOiYRfRQWCBS?>P<;K;7G?2PJ:\WFhdPd`Kf^QlbUZREbYLogZd]QmgZpi]nh[jcXg`SjcOe]Kf[Lk^OqaUleWiaUg_Qh`TibTe]T^TMpf_qhag]Vi`Xk`\jb^f`[ga\fb]g__g__g__f^^jbbd_\fb\jfamidkgblgbnebnebnebnebnebofcofcofculizqnqheofcpgdriftjhsliikenpjprlprlprltopqlmzuvxst}z|}z||~}trsŲ֭±}~~}~|}}~vxy{xzz|xzz|~su}rtvxtvuwvv~ttuuzppyoopprqprqprrrtrrtrrttrtttvutvvuwwvxwvxyxzyxzyxzyxz{xz|y{|z|}|~~}~}~|{}qpr~~~mmmwwwqrpkkk~}~}}|~~roqRRRPPP]]]~~~|y{~~~}}{|~wztoqxvxzwyxwyutvnppikkgiiikkgiieggdffeggacceggdff\^^dgebecbfaac]gbae`_hcbgbafa`g__c^]_ZYc_^a_^ba]a`\_^Zcb^`_[`]Yi`\i_\d[Xd[Xd[XcYUaYR[TKd[PibTf[Te\Vi^Xlb]k`Zi^WkaTh_RogZ`ZLhaSgaSibUb\Nb[NhbTidVd`RifWeaSd`Rb_Qb`Od`Qd[Ng\Qj_Ug\Tk_XmcZl_Xg\SfZRg\TfZRf[Sj^VeZSj`\j`\f`[ga\fb]i__i__i__h^^lbbe_\fb\jfaie`kgbmgbpdbpdbpdbpdbpdbofcofcofctkhxolqheofcpgdrifrjfrjhgicnpjprlprlprlvqrupqxstwrszuv|y{|}|~}~||ɹȾ}~~}~}~}~{|}~{|{|~}y{z|xzy{tvtvtvvxvv~ttuuyoovllnnprqsutvsrtsrtrqssrttsusrttsuutvwvxyxzyxzyxzyxzzwy{xz|y{}}~|~}~}z|}~{}oln~z|}z|~wtvoln~yxzvuwvuwtsuqpr|{}xwylkm{z|qpr~}~~{z|vvv|}{|~sqsplo}}{{|}{||vqtxuwxtwvuwtsumnnprrlmmkmmlmmgihdeecfefggdgf{}}OQPegedfedgcde`ga`haae_^e_^f``i`_lbce_]e`_ca^fb_ea]c_\d`\ea^fa^i`]i`]f]Zf]Zf]Zja]g_Xb[Sc\Rf]Ra[Qc^UfaWc_Vf`WjaVsbWqaXlaWkaWkaWh_Nf\MoeUdYKj`PjbQkcRh`OjcQkcSidR``R_]Pe_Tg^Uh]Uj\Vm]Zn`Zm\Zj\Vj[TgZQi[Rk_Uj[Rk_Wj_[i`\g`[ga\gb]g]\h^^i`^h^^lcahb^gb\id_he^if_kfaodbodboebpdbpdbofcofcofcmdanebphenfcogdqifqifoiflmgmoipqknqkopjupqwrsxstxstytu{xz{~z}|{yxռԳ}~~|}{|{||~{|z|~{|xz~|rsuv}su}stvxuuvvuuzppwmmllnpoqsrtnnpsrtsrtutvtsusrttsuutvvsuyvxyvxyvxyvxxuwzwy{xzwtv{xzyvxxuw|~~{}|~}z|~}{z|}}|{}olnkhjqnproqtqsjikrqskjlwvx~|{}yxz}|~yzzpnn~yz|}}vwvtttuustssssrrrooosqqonnnlllkkljjiiegeced`hgdggcojhkdalfcnhemfclc`naapbcpcdn`aj]]j\Xj]Zlb^f^[ia]ha\f^Zd\Xe^Yf^Zf_[d]]e^[f]XiaZh^Xd\Ud\Ue]Vc[Td\Te\We\We\We\We\We]Vf]Uf^Uf^Uf^Uf^Uh\Vh\Vh\VfZTfZTg]Vc\Te\Ue^Vg^Wkd[faWc\Sd]Td]Te]Td\Se]Tf^Ue]Uf^Uf\Xf\Yf\Ye\Xf\Yf\Xj_[k`\j_[i_[i_[j_[j^[j_[i]Zla]ldZjbXkdZgcYfdYgf[gd_gd_ic^ohcqhdqhelc`mdapgdqhejfbhgcmkgkiekiekieolhpnjpmiomisplupqzuv}xypklzuvwuu~|{|z{}{{~~~}ʿɦĬ}~~~~~}|{~}wsr}yx~z{z{|}{vvytuwqrytuztuvvuu}ss~ttzppkjllkmmlnmlnonptsutsuqprrrttrtttvvsuyvx}z|}z|}z|xuw~{}xtv~{}~|~~~|~|y{}~}~~}|~}}~~}}~~~~yz{|xvvtttrrrtttrrrpppqoonllnllnllmkkkjfihdffbhgchgclgdmfcmfcmfbmfbnfcocbnbbl``j^^h\\h\Xk^Znb^ja]f`[i`\g^Ze\Xf]Yg^Zf`\b^\d^Ze\Xg^Zh^Vf^Vf^Vf^Vf^Vf^Ve\Xe\Xe\Xe\Xe\Xe\We^Ue^Ue^Ue^Ue^Uh\Uh\Uh\UfZTfZTe[TaZRbZSd]Uf^Vh`Yc\S`ZPb\Rb\Rb\Rc\Sd]Sd]Tb\Rb\Re\Xe\Ye\Ye\Ye\Ye\Yj_[k`\j_[j_[j_[j_[j_[j_[i^Zla]md[kbXjdXjf[geZfdZc`[c`[hb^mgbnfbpgdmdanebpgdqheheafeahgcjjfjjfjjfolhqnjpmipmisplvprzvv|wxqlm{vwvtt|zz|zz}{{}}{vstpoͿƿпȸ~|~{|{|{|z{{|~|{}|~zuv|wx~yz~yzz{~yz}~~yz{||vwvvuuzpp{qqyooonpnmonlnrqstsuutvvuwtsurqssrttrtvsuyvx}z|}z|}z|}~{}{xz~}}z|}|~|~}|~}~~~|||zz~~~{uvz{lkknnnwwwuuurrrrrrrppnllpnnnllnlllkgljfgfbhgchgcidalgdkfcidaidbkeblbblbbj``h^^f\\i]Yj_[od`ib]f`[i`\g^Ze\Xf]Yg^Zf_\b][d[\e\YcZVf]Uf\Yf\Yf\Yf]Yf]Ye\Xe\Xe\Xe\Xe\Xe\Xe]Ve]Ve]Ve]Ve]VfZWfZWfZWfZVfZVeZVaXUbYVdZWe\Xd[VbZS`XQbZSbZSbZSc[TbZTbZSbZSbZSe\Xe\Ye\Ye\Ye\Ye\Yj_[k`\j_[j_[j_[j_[j_[j_[i^Zla]md\jaXg`XhcZdbYdbXeb]eb]hb]ke`lc_lc`lc`kb_pgdqhejfbfeahgcljfljfljfolhqnjpmipmisplvqr|vxxstupq{vwwuuzxx{yy~~~~~{fba̸ҳþڼ}}xz{|{||}~|{}yx}||{{z|wx~yzz{~yz~yzz{zzyz~xy|vwxrsvvuu|rr~ttzzmlnnmoonppoqqprlkmpoqsrtqprrqssrtvsuyvxzwyyvxyvxxuw~{}|y{~|~~{}}xuw{z|}|~~}|~}}|~}}|zz~}}~~~~~vvvtttwwwqqquuutrrommpnnommnllmlhnmigfbhgchgcjfbjebmhekfcic`fa^jabkcch``h``h``i^Zk`\md`hb\ea\i`\g^Ze\Xf]Yg^Zf_\a[\c[[d\XaXUf[Wd[Wd[Wd[We\Xe\Xe\Xe\Xe\Xe\Xe\Xe\Xe]Ve]Ve]Ue]Ue]VfZVfZVfZVfZVfZVg\XcZVd[WcZVe\XaXTbZSbZR`XP`XP`XPc[TbZSaYRc[Tc[Te\Ye\Ye\Ye\Ye\Ye\Yj_[k`\j_[j_[j_[j_[j_[j_[i^Zla]mc\jaXf`Vc^Tb`Vb`Wdb\eb]hb]ke`ja]nebpgdnebpgdqhelhdhgcihdlkglkglkgolhqnjpmipmisplvqr}xyxstzuvytuzxx{yy~||ζĿĭ{|~}~}~|{|{|}z{~yz|}||}wxz{z{ztutno{tuvvuuvvzppwmmonponprqssrtpoqvuwwvxtsurqssrttsuvsuzxzwtv}}z|yvx}z|~{}~{}|y{zwy}z|}~{}~}~}~}zy{~zy{}|~kiiomm~~|||zz}{{ywwpnnxxxtttxxxwwwqqqmmmvttrpppnnommnllnmilkgjiekjfihdkhdjgcifbjgcgd`da\fbagbagbagcbfb`i]Yi`\ga\fa\ea\h`\g^Zh_[g^Zf^Zb[X`Y\d\]e[[e\Yg[Yf]Zf]Zf]Zc[Wg^[e\Xe\Xe\Xe\Xe\Xh_[h^[h_[i`\h_[f]YfYWfYWfZWeXVfYWfZXd[Xd[XbYVcZWd[Xd[WbYUcZVcZVcZVbYUbYUbYUaXTaXTbYVcZWaXUd[Xd[Xd[Xj_[j_[i^Zk`\j_[j_[j_[j_[j_[k`\lbZh^Xg^Xe_Xc`Xhe]da\c`[hb]jd_kb^sjgzqnqheqhenebliekjfihdhgcjienlhqnjqnjpmipmispltopvqrvqrupq|wx{yyzxx{yy~~}}{z{xdzϹƱبyz|vw}~~~~~~son}|}~}xy|wx}~~|}z{z{~vwwx{st}ss~tt}ss|rrxnnonponpqprrrtrqstsutsupoqrqssrttsuxuw|y{yvx|~|~yvx}z|}z||z||~~|~}|~~}~~{yy~~~vvvz{{xxx{||zzzzzzyyytttkkksssvttrpppnnommnllnlhlkgjjfmlhlkgihdihdhgced`ba]`_[d_^hdcjfeiedgcbg^Zj`\f`[c^Za^Zga\g^Zh_[i`\f]Yb[Xf_bf^`f\[f[\h\Yf\\f\\f\\i__f\\e\Xe\Xe\Xe\Xe\Xh_[i`]d\YaXUaXUcZWk]_iZ\gYZeWXfXYfZZdZZdZZbXXbXYcZXbYVbYVbZWbZWbZWbYVbYVbYVd[Xf]ZbYVcZWaXUd[Xd[Xd[Xj_[j_[g\Xg\Xg\Xj^Zj_[j`\j_[k`\j`Yh^Wg_Xic\gd\jg^da\c`[hb]jd_kb^ofckb_pgdnebqhefc_jiekjfjjflkgonjpnjpnjpmipmisplvprxstvqrvqr}xyywwxvvzxxwuu~||~~¯ϩԷ~uop~|{~vrq|xxz{~yzz{{|{{zzwx~vw|tuwwzpp|rr}ss}ssnmonmopprrqsxwyyxzxwyvuwrqssrttsuvsuzwywtv{xz|y{{xz~|~}z|{xz}{xz|y{}|~~~|~yxzưƬ~||~||{{{www{{{wwwwwwvvvtttttthhhuuuusssqqpnnommnllllhlkgljfmlhlkgjjfjhdhhded`ba]`_[a_^fdciffgddda`j`\hb]d`[`]X`]Xga\g^Zh_[lc_dZVc\Yd]bcZ]f[^f]\h\]f\\f\\f\\^TTdZZe\Ye\Xe\Xe\Xe\Xh_[ja^bYVbYVcZWd[Xj\]hZ[fXYeWXfXYfZZdZZdZZbXXbXXaWWbYVbYVbXVbXVbXVbYVbYVbYVbYVg^[`VT`XTdZXd[Xd[Xd[Xi^Zi^Zg\XdYUf[Wh^Zj_[l`\j_[k`\mb^la]lc_lfakfbjfada\c`[hb]jd_kb^sjgwnkrifja^vmja^Zihdkjflkglkgnlhplhplhpmipmisplvqrnijxstxstxst}{{|zz~||~~~~̸Ψٱ{zyz{|}~|}~|{|{xtsyutz{~yzz{{vwz{}uvvxtvxztv~suvvsii~tt|rryoonmonmopoqwvxzy{nmoqprrqsrqssrttsuxtv|y{zwy|y{~{}|~~}~{xz~}|~~{z|~~}~~vuw~dbb|||}}}xxxssszzzsssssswwwkjjttttrrtrrqnnplmnklkjfmkhllgmkhkjfjifiidihdhgcdc_a`\`a_cecfgebdb_`^hd]hb^d`Zb^Zb_Yga\g^Zh_[ofaaXTd\YaY]aX[g\^g\^j]]f][f\\f\[ukki`^d\Yd]Xd]Xd\Xe]Yh`\i_^bYVf]Zd\XcZXcVVdWWdWWeXXfXYeZZdZZdZZaXXaWW`VV`WTbYVaXUaXUaXUbYVbYVbYVc[W^UR]TQ]URe\Yb[Xc[Xd[Xh]Yg]Yg]YcYUg\Xg]Xi_[la\i_[j`[la]j`\lc_lfalhcid_da\c`[hb]jd_kb^pgdtjhogdf]Yzrn_[Wjhdihckjejhdljfolholhpmipmispluqqtpprnowstxtu|zzzyy|{{~||~||}~ѱгķŽһ{||}~|{}|~}}||{}~}xy|wxz{}xzxy{~wyy{~su~su|rquu|sr~tt~ttjiklkmonptsuvuwvuwvuwsrtrqsrqsutvyvxzwy{xz{xz~{}}|~|{}zy{}}}|~}|~}|~~}~~~z}}}{{zzz~~~{{{yyywwwtttvttussystvpquorsnprklqjjtljsnnkefkfflfgkffnijnjjkgfhdcjfbiic]b]\c^Z_Z^d_^c^ee[dd[`aWabXabXhb]g^[f]Zi`]kb_h_\f\]bXXe[[dZZbYYcZVe\Xg^Zg^[g^Z`[X^ZW]YW`[\]XZ^Y[bZ[bZ[e[[h\Zf[W_YX_YX_YX_XXb\[f``[VU`ZY_ZY`ZY^VVbVVdWXcWWdXXeYY`ZYaYYcYYfZZdWX^]XZ]Y[]XZ]X[]YZ\W[\S``WbcZ__V_`WcdYccYcdYccYddZh`\i`]g`]hcafc_eb_fa^gb_he]he]ie\hd_ic`hccleelggneeoddoddujjthiriilieolhliepmiurnqqqoqqpqqquupvuwuuytu|wx{|z{~ù̸ùĿˢ}~~}~{|}~z{~z{|~|~|}}~}~z{xxyywwvv}}xx~su~ru{pr|qtuwqprnmorqstsusrtpoqrqsrqsrqsrqsutvyvxzwy{xz{xz~{}~}{z|xwyzy{}|~|z|}|~~}~}~~~{z||||~~~}}}zzzzzzwwwtttvttvttwrsvpqtoquprqijnffofcuoplfgkeflfglfhgbcideiedhdbfd`cc]^b]_c^\`[_c^`c^de[abXdeZef\ef\hb]g^[f]Zh_\i`]h^\f\\f\\e[[dZZcYYaXTf]Yja]i`\h_[`[X^[W]YX[WV\WX_Z\`Z[bZ[e[[h\Zf[W^YX^YX^YX^YX`[Zd^^^XX^YX^YX_ZY^VVeYYeYYdXXdXXdXX_ZYaYYaYYcVVcWW^^Z[`[_a]\`[Z\X^a\`aX`aW^_VbcZabY_`VbcYcdZbcYcdZga\i`]g`]fa^da]da]fb^hb`hd\hd\hf\hd^hb`hbbjdemghnddpddpdduiisggtjjjhdliemjfpmitploppnnnoqqtyxntswuuytu|wx~yz~yz|zz}~ƫҮɤ~~|}~{|~~z{|}{|{|wqryz}wxxxyywwvvzzxxtv~su}rt{prwlnlkmlkmmlnutvvuwyxzxwysrtrqsrqsutvyvxzwy{xz{xz~{}|{}zy{yxzwvx|{}||~{z||{}{z|~}~~~}yxz~~~~~~}}}}}}|||wwwtttvttxvvupqvpqtoqsnpsklphhpgdnhigabhbclfgnhhlghkfggcbfbbeb^bb\_c^^b]\a\]b\ae`cd[abYef]bcZbcZhb^g^[f]Zg^[h`\g^[e[[g]]e[[dZZcYYaXTf]Yja]i`\h_[`\W^[V]ZV_[Z[VW[VW`Z[`Z[e[[f]Zf[W^YX^YX^YX^YX^YXa\[`ZZ]XW]XW_ZY`XXdXXbVVdXXdXXdXX_ZY_ZYaYY_UUdXXa^Z^^Z`_[^^Z]\Xcb^dd^^_Y]]Waa[``Z_`W_`W`aXbcZcd[g`\i`]g`]d_\da]da]gb_hd`fd\fd\fdZhd^hb`hbbjdemghnddpddpddwkkoccmccifbliemjfolhqnjollkkkoqqpvuotswuuytu|wx~yzytu}}ztuоõʺ¼ã~~~|}|~yz{|~|}{|xxyywwwwxxwwtvy{uw}rtynpmlnsrtpoqyxzpoqrqstsurrtrqsrqsutvyvxzwy{xz{xz~{}{wy|y{~{}}|~|{}zy{{z|~}~}|~zy{~}}}zzzzzz|||vvvwwwtttvttywwtopwqrrmonjlphinffsjgpjkicdhbclfgnhiidejffhddfbagd`ff`ab^`a]_`\_`\eeaabYef]cd[cdZcd[ha^g^[f]Zg^[i`]g^[dZZdZZe[[dZZcYYcZVe\Xg^Zf^Ze\X`\W^[V]ZV\ZU\XW_Z[_Z[`YZc[[f]Zd[W^YX^YX^YX^YX^XX`[Zb]\\WV\XV_ZY`XXh\\cWWfZZdXXcWW^ZY_ZY_ZYcYYbXXa\Y^[W\XT]ZVa]Ya^Z`]Xgd_jgaeb]fc^jh`ge]ecZdbZec[g`]i`]g`]e`]eb^gd`hc`idafc[fc[fdZhd`idahcbjdemghnddpddpddxlloccmcckhdmjfmjfolhpnjljjkiiqqqy{{qvuwuuytu|wxytu|}}{{wtvνz{}xy~~~}~|}~xy{|{|z{~xy~xyxxyywwwwwwwwuw~su|qs}rt}rtnmovuwvuwsrtsrtrqsrqsrqsrqssrttsu}z||~{xzzwyyvxyvxzwyxuw}z|{xz}|~~}~~wuuwww}}}kkkuuutttwwwsssxvvwuuwrs{uvwrtmhjqijnffpgdnhimghlfgkefkefjefjefjfehdcgd`hfa`a]_`\`a]`a]_a]bb\bb\cc]aa\cc]h`^i`]f]Zd[X^UR_VSe[[e[[dZZe[[f\\f]Yf]YcZVd\XcZV^[S][S]ZU\YU]YX^ZYd_`eab`[Zb[Xd[W^YX^YX^YX]XW]XW]XW`[Z^YX\WV`[Zc[[h\\fZZdXXdXXdXX^YX]YX^YXaYYaYYf^[_YVaYV^XUd\Ye_\b\Ygb_f`]fa^fa^fa]fb]fb]ea\gc^h`]i`]g`]e`]da]da]hc`idagd\gd\ge[ie`hc`kfeicdmghnddpddpddoccqeeoeejgclielieolhpmiojkgeeqppvwwtvvsqqytu~yz}xy~yz~||xuwϼлüøӧwqr{||}{|z{|vw|}yz|}yy{{~ttvvww~tttv~su~su{prtvlkmpoqutvutvtsurrtrrtrrttrtttvvuw{xz|xzxuw}z|~{}|~{}|wy}xz{}xvxzy{|{}{z|{z|zy{~~~}|~{}{{vvvtttyyygggyyyuuutttwwwvttwuu{vwyzzuwojlrjkoggqhenhjnhhlfhkefkefjffjefjfdfbaeb^gd_cb^b`\ba]ba]ba]`_\`_[_^Zihd{g`]g^[f\Ze\Yd\Xg^[e[[e[[dZZe[[f\\e\Xf]YdZVcZVbYU^[S][S]ZU]ZU^[W^[Xdbbe`aa\Z`\Xb]X^ZX^ZX^ZX^XX^XX^ZX`ZZ_ZY`[Z`[Z_WWbVVcWWfZZdXXaUU\ZZ_ZZ^ZZ_ZYaYYh^[f[XfZXf\Yh\Zg^[d`_fa`ea`ea`ea`e`^e`^e`^e`]fa^i`]i`]g`]e`]da]da]hc`idafc[fc[fdZgc^gb_jedicdmghnddpddpddpddpddnddjhdolhlieolhpmipkllghsrruuussswuuzuv|vx|wx{vw~||¼Ǻ̾ȿƾҜ}xz~~|}~{|yzz{}~z{z{yz{uv~xy|vw~xyzz~xyyyzzuuwwwwvvtv~su}rtzoqxmomlnpprutvsrttsutrttrttrtutvvuwvuwzxzxuwurt}z|~{}{}{vx{}~{}|{}xwyrqs|z|{z|~}~{}}}ttttttzzzwwwxxxtttxxxtrrtrrzuv|vwytvrmotllrjjtkhoijnhinhhkefkeflfhjefhddfbaeb^gd_cb^bb^ba]ba]ba]b`\`_[_^Zba]srne^[d[Xe\Yf^Zja^ja^e[[e[[f\\e[[dZZd[Wf]Yd\XcZVd[W^[S]\R][S^ZV^\X`\Xcaab```\\b\Zd^X`ZZ`ZZ`ZZ^ZX^ZX`ZZ^ZX_ZY`[Z_ZY^VVaUUcWWbVVdXXg[[]ZZ\ZZ^ZZ_ZY_ZYg[Yh\ZgZXh[Yi\Zi][g__g^^g^^g^^g^^g`\g`\g`\f_\g`]i`]i`]g`]e`]da]da]hc`idafc[fc[fdZhd`hc`jedicdmghnddpddpddpddpddnddkhdolhlieolhpmirlmpklxrtvvvsssyuvzuvzuv|wxxst~~Żȶś~{|}~{uv~{|~|}|}zz}~zzxxvv{{ww}ssuwtvtvuwuwihjqoronpqorrqstsutsutsuwuwxvxywyzwytqsurt~z|{xzx{z}y{|uxy{zxz}|~~~}~}~{Ȣ{{z}}|~~~{zzyxxwwwvvwvvvussqoovqrrmnuprrmoumnrjjukipjkoijnhikefkeflghjefhdchdcgd`ifafc`eb^d`^da]d`^dc^b`^__Za_]a`\c]Z`XUe\Yh_\kb_h^\e\Ze\Zf\\e[[dZZcZVf]Ye\Yf\YcZV^[S]\R][S^\U_\X`]Y`^^b`^a][c^Zc^X`[ZaZZ`[Z`YY_ZY`[Z^YX`[Z_ZY`[Z`XXeYYeXXcWXdXWdXXZZY\ZY^ZY`ZY`ZYdWUi[XiYWfXVk\Zl_]d\\f^^f^^e^^f^^e_\f_\f_\f^\g`]h`]h`]g`]e`]da]da]hc`idahe^ie_if]kfbkfdmhgicdmghnddpddpddpddpddnddkhekgelifolipljsmnsmnzuvwuupqpwstzuv|vx{vwtop~~κýȿ˱ĽźԘ}xz~|}|}z{~}~}~{|}wxyzyz||xxvvwwyyxxuwtv~tvtvynpgijmpplnomopqstqstrtusuvqstrtusuvvuwttvvuwuuwvuw}xz~z|~|~xyz{z||{}|~|~}|~}}|~|}|s}|zz~~wz~wvslxyqxvu~~rppqooqppqmnvpquopqkloijrklnllollkiikhhgeeljiihdgd`jeajdaic`gabicdhbchbbhbcjcce_`c^^dbcebbc`\a^Ye_Ze`Zja]f]Yg\Wf[Wg[Yg[[g[[f^Wf^Wf^W\TMw\XTZWS]ZV^[W`^Z^ZTe\SbZPi_Ui]Tj\SbYVcZVbYVd[XcZWd_^XTS_ZYbZZcZZd[YeYVfZVg[Xf[WfZW\VS^VS^VSdWUdWUcWWeYZaTU^SS_RSbWW`VV_WWe`_c_^b^]a^Y`]Xc_Zd^Yf]Yha^e`]e`]gb_hc`fa^ea`fbbjgegcaifdjffjefjefjefjefneeoeeoeeoeepffpgglfhlfhjcfqjmslnqplsrorrmrpnonivttxvvzxx{yy}||{z|}|~|||ҷ¼Խ̿ľʩtrr}~~}~}~|}|}|}ztu{|yzyzz|z{{tu|vw~wxyzxztv~su|qs{prrtuoqrlnooqrprsqstrtusuvqstrtusuvvvxutvvvxvvxvvx|xz}z|||~tvwwyzz{|||~|~|~{~~~~}~}|~~|}}}}{}~|}}|~}|{}~yw|tzxpwxotrqrpppnnnllnlltppsnoupqqlmpklnllnllkiijhhgeejhhhhdheaidaib_ib_f`agabjdejdejdelddicdgabdbbdbbeb^he`d`[f`[h_[g^Zg]Vf[Wg[Yg[[g[[g_Xe]Vd\T`XQ|u[VSZVR[XT`]Yb_[`\Wf]Rd[Qf]RfZPcWMbXVbXVbXVbXUd[Xd_^ZVT_ZYbZZdZZd[XdZWe\Xf\XdZWe\Xb[Xd[Xd[XdWUdWU`TTfZZj^^g[[dXXdXXbXX]UUe`_c_^b^]a^Y`\Xb^Yd^Xf\Xg`]d`\e`]fa^gb_f`^ea`fbamihjfelhgjefjefjefjefjefmeeoeeoeeoeepffoggpilpilngjrjnohkqplsrnsrnvuqxwsvttxvvzxxyww}}vttyxz|{}ӷƫǾ˿DZ~{|ystvpq}wx}~|vx~xzyzyz~xyyz~xy~xy}wx{uvz|~su}rt|rt|qsmopjlnnpqlnomopqstrtusuvqstrtusuvxvxyxzxvxxvxxvx|wy|y{|z|xz|xz{z|~}|~}~~}|{}|}|}~}~}~{y|z}|z~|²yxz}|~}x~z|{{uxwrwutusstrrpnnljjljjtoprmnupqrlnqlmnllnllkiijhhgeejhfhgchfbidajd`ib_hbcgabjdejdejdeldeicdicdcaacaagd`b^Yfb\`]Xb\Wd[We]Vd[We\Ye[[e[[g^Zd[WbYVi_\ofb[VSZVR[XT_\Xa^Z_[Vb[RcZQdYRcXPdWO_XV_XV_XV_XUa[Xb]\ZVV^YXbZZdZZd[X`[Vb\Wd^Y_YTb\Wc\Ye\Yf]ZgZXgZXcWWcWWfZZeYYi]]nbblbbf^^e`_c_^b^]`]X_\Wb^Xb\Xd\Xd^Zd^\e`]e`]fb^e`]d`_ea`jfegcbiedjefjefjefjefjefmeemeemeemeenffoggqjmqjmohkrknohkqplsrnsrnwvr{zvxvvxvvxvv|zzywwwuuyxz~{|z~~~~fffͮϹǺҩyz|}{||}{||}ztu~xyz{yz}wxyzyz~xyz{z{~xy}wx{uvy{~rt}rt}rt~sulnodfgkmnkmnnpqqstrtusuvqstrtusuvxwyzy{xwyxwyxwy{vx{xz{z||~~{}~|~~~yxz~}y}~|}~wyz{}~uyz}~~yzx~|z}}}vvxrzxw}{{}{{rppljjnllqoopnnonnnllonnnllnllkiijhhgeeigfhgcifblgdmfclebjdficdicdicdicdjbchbchbdcaacaa^]Ybc]gd_d`[d]Xf`[e]Vd[We\Ye[[e[[d[Wd[We\Xi`\md`]XUZWS]ZVa^Zc`\`]Xe^Ue^UbZPf[Rg\TaZWaZWaZW`YV`XUa\[[WV^YXbZZdZZc[X\XS]YT_[VYUP]YTbZXd[XcZWhZXh[YeYYeYYj^^g[[eYYfZZf\\bZZe`_c_^b^]_\W^[Va]Xb\Wd[Wc\Yc^[e`]e`]fa^d_\d`^ea`iedfbahddjefjefjefjefjeflfemeemeemeenffoggqjmpjlnfjrknpilqplsrnsrntsowvrxvvxvvxvv|zzzxxwuu{z|ǻ˨~}~|}}~}~}~yzz{{uv|}zzyzyzz{{|yz|vw}wxyzuw|qs|rt~rtuwlnooqrxz{oqrrturturturturturturtuwvxvuwtsuvuwwvx~y{|y{zy{{}~~{z~{}~~}~~~~{|||~|~~}zy{}}z}~~qpr{}}xsuqx|wywwommwuutrrpnniggqooommmkkrppqnnpnnljjnllkiikiiomlhgcifbkfcmfcleblfgjdejdeicdhbcg_`e_`hbccaacaacd`cc]da\b_Zea\gc^kf_f`[b[XaYY_XXaXUbYUcZWbYVd[X]XU_\X^\X`]Y`]Y`]Xd^WgaZh^WdZSeYS]XU]XU]XU]XU]XU]YX^ZY`[ZaYYbXXc[X^ZU^ZU_[V[WR^ZUc\Y`WTf]Zh[YgZXdXXeYYfZZbVVcWWj^^g]]f^^a\[ea`b^]`]X`]Xa]Xc]Xf\Xf_\d_\d_\e`]e`]e`]d`^ea`hdcfbagcbidejefkfgideidekfekfekfekfelgfmhgohkpilmfiohkpilqpltsoqplvuqxwsuss|zz{yyxvv}{{}}~ɵѻ|~|ux~~~|}{|~~xy~z{|vw{||}{|{|yz~xy~xy{uv|vw}wx~xyuwtv~su~su~sunpqbdemopoqrrttrturturturturturtusrtvuwvuwxwyxwy~y{|y{zy{z|}z|}{z~{}~z|}~}~}|}~}}~~{}~y}~}~}|zztrrwvx}xxtsrpnmqsqy{z{zz{yysqqpnnljjllllllmmmpppooopnnmkkljjjhhjhhmkjihdifbidanfdpiflfgjdejdeicdhbcg_`e_`hbcdbbdbb^_[^`Z``Zb_Zd_Zc_ZXRK_YTc\XbZZaYYf[\dZZbXXbXXbXY`[Xa^Z`^Z`]Y`]Y`]X][Rb[Td]Ve[Se[T^XV^XV^XV]XU^YV^ZY\XW`[ZbZZcYYd\X^XSa[Va[V]XR`ZTe^[cZWg^[h\Zj][dXXfZZfZZaUUbVVh\\g]]f^^a\[ea`b^]`]X`]Xa]Xd^Yh_[f_\d_\d_\d_\d_\d_\d`_ea`mihgcbb^]idejefkfgideidekfekfekfejedkfelgfngjpilrknlehqjmmlhpokrqmvuqtsotrrzxxzxxzxx{yy|zzƽϮʮ{~z{}~}~|}z|}~z{}~z{{|yz~xy~xy{uv|}yz}wxuw~su|qs|qs|qsmoplnojlmoqrrttrturturturturturtuutvwvxzy{xwyxwy~y{|y{zy{vxy{}~zy~y}~z|}~~}~}~}~|~~}}|~~|{~{~{z|}|~|{vwusvtw|zvvv~||qoorpprpppnnlllmmmppprrrppppnnnllljjhffhffigfjiejfbidanfdpiflfgjdejdeicdhbcg_`e_`hbcgeedbb`a]`b\cc]``Zb_Zb_Zc`X^ZUa\Z`\Z_[Z_UUaWWbXXbXXbXX`[Xb_[b_[`]Y`]Y`]Y[WR\XSbXUcZWeZV][V][V][V\ZV^\X_[Z\XVa\[c[[dZZe\Yd[We\XaXTaXTaXTe^[d[Xf\Zh\Zj][fZZfZZg[[bVVbVVfZZg]]f^^a\[ea`b^]`]X`]Xa]Xd^Yh_[f_\d_\d_\d_\d_\d_\ea`fbajfdhdcjfeidejefkfgjefjefjfejfejfeiedjfekgfmfipiltmpkdgqjmlkgpokpokrrnrplrppzxxxvvvttwuu|zzyxz~˱ɠ~xy~~~~}~|}z{~xrs}~|}{|yz~xy~xy{uvyz{uvxrsuw|qs|qs|qs|qskmnnppjlmoqrrturturturturturturtu{z|{z||z|zy{yxz}y{{y{yz{xz{y{|zy~y}~|~||~}|~~~}~~|z|}}{}~|y{||ízy{{xw}~|yzx{~|x~|zzzzwwpmmqoosqqrppnnmppprrrtttpppommommkiifddfddhfekjfjgdkfcmedkeclfgjdejdeicdhbcg_`e_`hcchffecc_`\^a\ac]cb]ca\c_[a]Vc_Zb]Y`\Za[Zf]]f\\dZZe[ZbYY^ZXa^Z`]Y`]Y`]Y`]Y]YT\XS^XSd[WfZW^[W^[W^[W]ZV_\X`\[[WVa\[c[[dZZf][eYVaVRbVSdYUcWTb[XcZXcZWh[YgZXfZZf[[g\\dXXbWWf[[g]]f^^a\[ea`b^]`]X`]Xa]Xc]Xd]Xf_\d_\d_\fa^fa^fb^ea`fbafbaea`fbaidejefkfgkfgkfgjfejfejfdlgfmihniilehpjlslolfinhkmlhttplkhonjpokqnnwvuwtuwttyvw~|~yvyɞĻԮ}~tmp~||{||}}~yz}~~}~xrsz{yst{|yz~xy~xy{uv|vwztuyrsuw{rs~su}tu~sulnomopqstqstqstqprrqssrtvtvrqsusv|{}yxz|{}|{}yxzvz{wz{vz{vz{}uz{x~~z~{}~~{}}~}~wyz~wyz~{}~yz{z}~~l~}~z~{uv~zy{uvvvvvrrrxxxuvvuuuijjooonnnooopppnmoonppoqpnqkjlljjljjiggiggiggkfgmghkeflgglfglfgjdekfgidee`agbcd_\c_]``[dcacd`dcbebbhddgbbg`ag_`f[]f\^mbci_adY[d^_d]^a[\b\]a[\d`__]\^]\_]\_]\]ZX^XV`YVaYRc\Te\Ta]]`\[]YX\XW^ZZ\[Z\[Z`]\a\[c[[c[[cYY`WVbXXcZXdZZf\XeZVf[Wh]YdYUbZZb\[c\\b\[b\[b\[d^]fb`b]\b]\b]\b]Zb]Zb]Zb]Zd_\g`]g`]g`]mfckdahc`dbbgeeeccecceccgeehffiggigggeeiggkiimklmkknllljjihhjiimmljiillkvsmyupmjdqmholgvvr|ytwvvs{z}xvyz~~~彾ӰǶȸ~}{}|uxy|x|z}z}yz|}{uv{|yz|wxzuv{uv~vwuw}uv{ttxsrysrxsrysrmoplnonpqprsprsqprrqssrtwvxutvutv{z|{z|~}xwyxz{xz{xz{vxyy{|uyzw|}x|}~~z|||~suv|~y{|~y{|uwx|vw||z}~~~~~|{wwwvvvsssrrrwwwuuutttqqqoooqqqpppmlnnmosrtjikgfhljjljjjhhiggiggkfglghjefjffjffjfffedhffjiidcbcaafa^eb^cb^cd`cd`dbbhffe`agabh`ag_`g\^fZ]pegg\^i^`d^^b\^b\^b\]`Z[]YX\ZY][Z^\[_]\\ZZ^ZV`YV`XRc[Te\S`\[_\Z\XWXTSa]\a_^_]\`\[`\ZbZZbZZcYYbXXbXXcYYdZZdYUcWSdXTh\XdXTbZZa\[b]\a\[a\[a\[`[Zc^]e`_d_^b]\b]Zb]Zb]Zb]Zd_\g`]g`]g`]g`]f_\d_\dbbgeefddfddfddhffiggjhhigghffiggkiimkkmkkmkkmkkmmmkkkjjjiiinnnrqmmlhihdpplqpl|}ysqm|sptryv|wt{uv{|~}}}ʣ֟~~~}|~z|~y{}y|{~z}|}|}{uv|}yzytuxst|vvwxy{{stzutxsrvqpvqpvqplnonpqnpqprsprsqprrqssrtwvxvuwutvzxzyxzxwyyxzzy{xz{xz{xz{xz{z}~vz|z~~|~~y{|zx{{z|~~|~~}vxy{}~wyzs~coss{w{zxp}{~~~}~{{{}}}wwwxxxxxx|||vvvpppuuupppmlnnmopoqqprhgimkkmkkjhhkiiiggkfglghjefjdfjdfhefgddhffljjfddebbfa^eb^cb^bc_bc_dbbhffe`agabh`ag_`f^_aZZf^_b[[f^_c]^b\\e_`e_``Z[^ZX_]\_]\][Z_]\^\Z`ZX`YV`XQbZSd[Ra\Z`[Z]XVZUTa\Zb_^_]\`\[`ZZbZZbZZaYY`XX`XXaYYbZZbYU`WS`WSd\X`XTbZZa\[b]\a\[a\[a\[c^]e`_a\[a\[`[Zb]Zb]Zb]Zb]Zd_\e`]e`]e`]c^[d_\d`\dbbgeefddfddfddhffjhhjhhjhhiggiggkiimkknllkiiommoookkkjjjiiinnnqplihdlkgrqmtsnxyuvuqumjvs~wt{wt{vw}~~̽űЩ٠~~~{z|}z|}~}~~}~y{~y{}{~y|{~z}z{~xyystztuz{zuvwrs|vwyqrxz}uvzutxsr|wv|wv|wvgijsuvlnonpqoqrqprrqssrtutvtsupoqxwytsuutvyxzyxzzy{zy{zy{xwy}|~z}~{~{}~z|}{}~|{}~|~}}vxy~vxx}~~}~}~yut|{~|wxvrq|}z{xx{z|{z|~~~wwwzzzwwwyyyssssssxxxqqqpoqqprqprnmolkmnllnllkiiljjiggiggjhhhfffeegeegeeeffggghhhcdddeehc`gd`ed`ab^ab^eccdbbhcdgabh`ag_`g_`aYZ^VWjbcg_`c]^`Z[gabicdb\]_\[c_^^ZY_ZZa]\a]\`[X`YV_WPbZSd[R`[Z_ZY\WVVQP]XW_[Z\ZZ`\\`[ZaYYaYYaYYbZZ`XXaYYbZZcZVaXTbXTd[W`WSaZZa\[b]\a\[a\[a\[b^\fa`c^]e`_hcbb]Zb]Zb]Zb]Zc^[e`]e`]e`]f`^gb_gd`dbbgeegeegeegeeiggjhhkiikiiiggiggkiimkknllkiiommkkkjjjmmmiiikkkopnlmkopnopnrsq~~wtyv~xu}zvxvv~}}wwyش¯yz}xz|{xz~}~~{|~~~~|~|~wzy|{~z}yzyzyz{|{|z{xst|vwyzvx|tuzutxsrvqpvqpvqphjknpqoqrtvwsuvrqstsuvuwnmo|{}{z|{z|}|~{z|kjlyxz{z|{z|||~~}||~~y{||~|{}{z|~}}~twzpvyry|~}zxx|}|}|{|wxwrs~yz~yz~yzz{±}}}xxx}}}wwwmmmoooooo___oooxxxqprsrtyxzfegihjnllnllommkiijhhkiijgggeekiigeecbbeeegffdddcccdddhc`gd`ba]cd`ab^`^^fddkfgkefjbch`ad^_b\]VPQe_``[\b\]e_`ZTUhbcf`a[VUb]\a\[`[Za\[`[Z_ZW`XVaYRaYRcZQaYYaYYaYY`XX`XX`\[[YX`\\QLKf^^aYY`[Zb]\_ZY_ZY_ZY`ZU`ZU`ZU`ZU`ZUa\[c^]b]\`[Za\[b]\b]\b]\e`_d_^c^]c^[b]Zd_\a\Yqlic`\da]eb^fc^eb^eb^dbbfddgeegeegeehffiggjhhiggiggjhhjhhmkkmkkljjnllmmmmmmmmmkkklllnomopnpqostrrsqrwrqrn|y|y{wsvuq{||{||˿²Ѭ޷ç~|vw{uv~}~{}z}|x{z}y||}{|{|z{~yzz{yzxy}rtyz|wv|wvwrqxtrzutkmnnpqoqroqroqrpoqsrtttvsrtutvgfhzy{zy{srt}|~{xz{xzspr{xz|y{|{}|{}|~z{|x|}x|}yxzzy{}|~~~yq|v}}yvx~rrr~{{{wwwxxxuuuwww{{{|||XXXmmmpppqprpoqpoqonplkmnllrppnllljjjhhiiihhhfffgggdddbbbceedffaccgiiehhhc`gd`cb^bc_ab^caa_]]fabd^_f^_g_`d^_b\]e_`gabb[\gabd^_ZTVhbbd^`]XWa\[a\[b]\b^]b]\^YV^WTaYRaYRcZQaYYaYYaYYaYYaYY^ZZ\ZY`\[RML^VVf^^b]\`ZY_ZY_ZY_ZY_YT_YT_YT_YTa[V`[Zb]\`[Z`[Z`\Za\[`[Ze`_e`_d_^c^]a\Yc^[`[Xc^[nifc`\ba]cb^ed`ed`ed`dbbfddgeefddfddfddgeehffiggiggjhhjhhmkkmkkljjnllmmmmmmjjjkkkooomoonppnpqtvvsuupurvyt{x|y{xtwxtvxy{{{Ϻ¹ɿŶȺ|}~~|~|~z}|y|z~y||}{|yzz{~yz~yzyzwxtv|}~yxxsr{vuzutytslnokmnlnomopoqrpoqpoqsrtnmotsurqsxvxwvxvuwwvxzy{~{}|y{wtv~{}}z|}z||~~{zw{|wvx|{}~}~~}}z|~{{{~~~wvx~~~zzz{{{zzzyyysssooonnnooopnpnmopprihjlkmnllpnnljjljjljjiiihhhhhhiiigggfffcdddffeggfhh_``idaheadb^^_[ab^ecc`^^hcdf``h`ag`ab]^b]^c^_a\]c^_b\]_YZ^XYf`bb\^bYZbZZbZZbZZc[[aYY^YV`XVaYRaYRcZQcYYcYYcYYdZZdZZ^ZX^\[`\[XRRYQQg``a]\^ZY^ZY^ZY^ZY]YT]YT]YT]YT_[Vb]\d_^c^]`[Z`ZZ_ZYc^]c^]e`_d_^c^]e`]d_\d_\a\Yfa^c`\ba]cb^cb^cb^cb^dbbfddgeefdddbbfddgeehffiggiggjhhjhhmkkmkkljjnllmmmmmmjjjkkkooonopopppqrqssrttrxunrm|x~{~|x|}y~yʴЧ̱yxz}|~z}{~z|{~z}|}{|{|yst~yz~yzyzz{vxwxzutytsxsrwrqrstnopqrspprstvnmopoqqprsrtrqsvvxvuwtsuyxzyxz{z||xzy{~z|}xz{vxztv~{}{}~z~|v{|xvx~}~~}z|}z|}~~~yz{~}{sz{z~~}||{~y}vz~{zzzooo~}ŝ~zy{}}}|||zzzvvuuuupqpnnnrrrnnnnmnnnosrtnmommnljkljjmkkmkkljjjiiiiiiiihhggfgeff`edafechg`ed`dcieaiebdc_]^[ab^`^^`^^jefgabf_`c]^b\]b]^d_`c^_a\]d^_ZTUYSTf`a`Z[c[[aYYbZZd\\e]\bZZa\YbZWaXSaXRcYQcYYcYYcYYdZZdZZ\XW^\[_[Z]XWXRQd^]a]\_[Z^ZY^ZY^ZY_\W`\V_[V_ZU]ZU^YX_ZY^ZX`[Z_ZY^YXb\\e`_d_^d_^c^]a]Y\WSc_[c^Zd`\b`\ba]cb^ed`ed`ed`dbbfddgeeeccb``hffiggjhhiggiggjhhjhhmkkmkkljjnllmmmmmmmmmkkklllmqpnrqnrrmqqtxwovstwr|y|xzyvvzvrzxԫѻñͺſ~y{}z~z}z}}{~|}{|~xyvpq~yz~yzyz}uvuwwxwrq|wvxsrzutzuttprxtvqmo~z|tprokmjfh{xz~zwy}poqrqsrqs{z||{}}|~|{}|z|yy{wuw~z|zy{x{|}x|}vxyz}~}vxysvvu{~ovyuz~orv|wyz{}~{y{vsuwsu{wyrsw|}lmrstxfgl[^_moqtwwz|ruvzx{|xzz}tnpzuxywxz}}xz{}}}xstѣsqp}z|}}}}~||}}{xxwvxtsvqprrqssrtrppqnipnisrmkmhijefjgdfdkkknkmnkmplkmlghjfghddhdafc`fe_dc`cabf`efahffhff`^^a__a_^a__caaecccaac``a^^ecc_]]b``caaa__b^_`[\`[\b]^`\]c[\c[\c[\c[\d\]d]^a\^`[\aYZc[\dY[bZZc[[aYYc[[c[[b]\]YXc_^\XW_[Z_[ZZXW^\[[YX[YX[YXc\We\Xe^YcYUh`[`ZZ`[Z]XW`[Z]XW`[Za^Zb_[gd`eb^b`[`^^b_^`^]b_^a_^`_[`_[`_[cb^dc_ed`eccfddgeehffjhhhffhffhffhffjhhkiikiinllmkkmkkmkklkmnmolkmmlnnmoomosqsusuwuwwuwvuuusrywwzxx|zz~~~{}ǿƾհƽŴ³~~z~y|x{zsvx{{||xyz{}xy~{z}||{{vu{ss~vvytsytsytszut{vumhjd_ahcefacXSUmjllikolnolndacfceonpjikvvxnmorqsqprsrtvuwsrtsrtyvx|{}wyzprsostptusuvrturtusuvvxyr|v}w|pswxz{¹{|zxx}}|~}{{|zz|zz}}{yysrttsuutvqprqprpnnrokpminmihifghdekfgjhgggnkmnkmqmlnmijkgghddhcagb_ed_dc_b`bc_ce_hffgeea__caab``b``caadbbb``b``a__a__mkkcaadbbb``c^_`[\`[\b]^a\]b\\d\\d\\d\]e]^d^^d_`c^_e]^bZ[eZ\d[\d\\d\\c[[c[[]XW[WV_[Z^ZX_[Z^ZZ][Z[YX[YX[YX[YXd[Xe\Yf]ZcZWe\Y`YX`[Z^YX]XW_ZYb]\c`\b_[]ZV`]Yc`\ca`ca`ca`b`^b`^ed`ed`ed`cb^dc_ed`b``caafddgeehffhffhffhffhffigghffhffkiimkkmkkmkklkmnmollnmlnnlnpmotqsvsuolnolnqoosqqxvv{yyywwyww|y{|~|~}}~|ȟ;ʼwy}~z|z~~wz~wzy|{|~yz~zz}xyzuv}{z|zy~zyzy~vv~vvxsrytsxtrytszutgbdqlnwrtjeg~y{pmovsuxuwyvxvsuyvxwvx~vuw}|~{z|xwypoq{z|yxzyxzwwy|{}~suvv}z||~~z|}~}z|ő|zz}{{{yyzxxxvv{yyzy{xwyutvvuwrqstrrtqmliejjefgcghdflhiljfffnkmnkmqmlllhhjfghddhcagb_dc^cb_b`bc_ee_geefddeccgeeeccb``caadbbb``b``b``igg`^^dbbdbbb``fabc^_c^_c^_b]^b\^b\^b\^b\^c^^d^`d_`c^_bZ[^VWmbdb^]`\[c^]a\[a\[^ZY^ZYa]\^ZZ]YX^ZX][Z[YX[YX[YX[YXb[Xc\Yd]Z`YV`ZV^XX`[Z_ZY]XW`[Za\[]ZVb^Zc`\b_[a^Zca`ca`ca`b``b``a`\a`\a`\cb^dc_ed`b``caafddfddhfffddfddfddgeehffgeegeekiimkkmkkmkklkmnmonlnmlnllnpmotqsvsuurturtussxvvzxxxvvyww~||~|~ϼĺϫŻͺz{|}y||{twz}{~|wx~yz~xzytu}{zxvu{wvzyww|ttxsrytsxrrxtrzttojlpkmqlnvqsuprurtvsuxuwvsutqsvsuyxztsuutv~}~}zy{{z|~|~xwyyxz}~y|}w{|w{|x}~wz~vy}x{wvt{~y~u{~}~|~{|Ĵ|uu~|||zz{yy|zzxvvtsutsuutvvuwqprtrrplklhgiffghfjkihnihkihhhnkmolnokjkjffhdghddhcagb_dc`aabdafeafgageeeccfddecccaacaacaacaaa__b``caadbbgeedbbecccaagbcd^`d^`d_`b]^c]^c]^c]^c]^d^_e_`c^_b]^e]^]UVncea\[^YXb]\a\[a\[\XW_[Za]\`\[^ZX]YX\ZY\ZY[YX[YX[YXbZZc[[d\\f]^h``]XW`[Z`[Z_ZY`\Z]XW`\Xa^Zb_[b_[a^Zb`_b`_b`_ca`ca`ba]ba]ba]cb^dc_ed`caadbbeccfddgeefddfddfddfddhffhffhffljjmkkmkkmkklkmnmonmomlnlkmpmotqsvsusprsprxvvzxxwuu|zz{yy}{{}}ƿŶȾƽݽ~{||}x{}vyx|slo{vwz{}xy{||}}{zvtsyutzutww|ttxsrytswrqxsrytsqlnqlnpkmojlvqssprsprroqvsutqsvsuwvx{z|zy{yxzsrtyxz{z|~}zy{}swxuz{v~w||z~~yspwzx|{||~wwwƢecczoqvx~~||~~~||}{{ywwsrtsrtwvxttvhgifdeplknjimkjjkiijh^d_adbdddifhgdfgcbgfbdeadeaeidcidacc`bbgeded`he`geeiggdbbb``b``a__caaeccdbbfdda__caafddcaaeccdbbd_`d_`d_`a\]d_`b]^b]^b]^`[\c^_c^_b]^b]^iab]UVnce`\[UQPc^^^ZY_[Z^ZYc_^\XW^ZY_[Z_[ZXVU[YX\ZY[YX][Zb]\^YXe`__[Z`\[_ZY_ZY_ZY_ZY_ZY_ZY`]Ya^Za^Z_\X`]Yb`_dbaca`ca`ca`dc_ba]a`\ba]cb^dc_a__geefdddbbeccfddfddfddhffiggiggkiimkkljjqoomkkhgikjlqprmlnpoqroqroqurtroqtqsvttyww{yy|zz|zz}}ռй̹¨ſ½~|}yru~}vyx{x{z{{|{vw~yz|zy{yxzvu~yx}uu}uuytswrqytsxsrwrqpkmsnpvqsqlnuprsprtprtqssprsprurt|{}zy{{z||z||{}xwyyxzzy{xvxvuwy{|y}~rwxy~xx}||{xzw~y|}~|}xz|~}y{}}}}{yy{yyutvtsuwvxsrtonproqqlmnikjhhjjjmmmu{vnrpjjjmjllikrnmnmiefbhieeid`facccbaaecbfc_gd_geeiggdbbb``_]]b``caafddeccfddb``a__a__b``dbbcaad_`d_`d_`d_`d_``^^`^^`^^_^]`^^a__b\^b\^`XYbZ[h]__^]UTRca`^]\_^\_[Zb^\\XW^ZY]YX_[ZYWV[YX[YXZXX\ZZb\]^XYc]^`Z[a[\_ZY_ZY_ZY_ZY_ZY_ZY`]Ya^Zb^Z`]Ya^Zb`_dbaca`ca`ca`dc_ba]bb^cb^ed`ed`b``hfffddeccfddfddfddfddhffiggkiikiinllnllqooommlkmmlnqprlkmlkmolnolnqnpqnptqs}{{|zz{yy|zz|zz}}ؾԻɺľ~yru~|z}x{ytuz{z{{|~yz|zy|zy~zy~yx}uu}uuytswrqxtrxrrvrprmoqlnpkmtoqzuwsprtqsvrtsprtrtwtvxxz|{}yxzwvxzy{}|~{z|~nmoxz{~{}}{w}z~vt}xx|vw{}{}}|y{þ|zzvtt{yy{yy}|~{z|}|~srtlkmolnrlnojkljjkkkmmmhninqosssqnpjgiokjmlhijfhiefjeagbdddccciddfc_hd_hffgeefddcaa`^^b``dbbfddfddgeeb``fdda__b``dbbb``d_`d_`d_`e`ab]^`^^`^^`^^a__^\\a__`\\`\\_WXe]^dY[`^]WUTecb_]\a_^`\[`\\]YX`\[YUT`\[VTSYWVZXXZXV\ZY_Z[^YZ`[\^YZ`[\_ZY_ZY_ZY_ZY_ZY_ZY`]Ya^Zb_[`^Zb_[b`_dbaca`ca`ca`dc_bb^ed`gfbed`ed`fddjhhgeefddgeefddfddfddiggjhhkiinllpnnpnnpnnommljlkjllkmkjlpoqsprroqtqsqnpvsusqqussyww|zz|zz}}~̲ȾŹϴwrs~~~~z}y|x{|ux}xy|wx{vw|}|wxzxw|zy|{~yx}uu}uuytswrqxrrwrqvqprmotoqupruprtoqsprtqtwtvtrtvtvxvxtsuxxz|{}{|}zy{yyzxxz~~~~{{}~w|}~~}z|ľ䜙|wx~|{zzyyzyyvvxuuwuvwqprnlnpopqmnoklnllkllkllhmjilkkkkZVXolnpmlnnjjkhghdgjgfjgggghffjgfifblgchfffddfddecccaacaadbbgeefddgeecaahff_]]a__caab``c``d_`c``d_`^ZZ`^^`^^`^^b``^\\a__`[\`[\e^_b[\bY[][ZVTSecb^\[_]\a]\`\Z]YWa]\WSR`\[XWV\ZYZXWYWV[YX^YZ^YZ^ZZ^YZ`[\`[Z_ZX_ZY_ZY_ZY_ZY`\Ya^Zc`]a^Zb^\b`_dbaca`ca`ca`cb_cb^fdbhgcgfcfebgeejhhhfffddgeefddfddfddiggkhhmkkommqoopmmmkkmkkkjlnmoonpmlnpoqurtsprtqstprxuwywwywwyww{zz|zz}}|~{||xzȼÿ౱ͥz{~}x{y|z}~wzz{~yz{||}vtsywv{z~yx|vu|vuytswrqwrqvqpupormotoqytvvqsxsurppussssspsrnrqx|{uxyrvxwz{y}~y|}r{~qz}w|{{{|xw}|{x{{|~|~xz{~zy{sssȝ|}wsu~~|wz{y|}svw{lruquvruvnppsvuprplpnhnmhmnfmokqqkoplnozy{kkmmnolnoilldfglnogijeggfggfffhffjffjhhgeegeefddecceeefffgggeeeeeeeeegdfdacb_ab_ab_a```a`````baaYYY```^^^\\\___[[[[ZZ][[^\\_^^dee`dc_]]USSdbb_]]_]]^YZ]XYb]^`[\a\]`[\b]^a\]]XY]XY]XY`[\^YZ\VX_Z[_Z[XRSd^_`Y[_YZ_YZb\]dbca__a__a__a__`a]`a]`a]^_[_a\caaeccdbbhfegeefdddbbgeeecceccecceeedddfffhhhjjjjkkklllllmmmlllnnnmlnrqssrtpoqrqsrqsqprpoqttvzy{vwwsuuuvvvxx{||}~|~|y{ռѶƾz{~|}|}{|{|z{~yz~yz|}~~xz}xy}xy|wxzuv{vw|xwwsrxtsyuturpliktqsroqpmotqsqoorrrprrprrrwvw|{uyzrvwostw{|}}}|v~yzu}|p}}uz{wv~~wxt}}x~tvw~|~}|~}}}zzz{~|¿{|zwyy}~z~~w{|vz|txxw{mtwrwxquvnppsvtqtrnqolrqlqrjqtkpqkoplno|{}onpkmnlnpjlmhjklnoiklfhhfhhiiikiimhihffhffkiigeefdddddeeefffeeeeeeeeegdfebdd`bb`bb_a````````````[[[```___^^^___^^^```^\\_]]bbbdff`ed_]]YWWb``^\\\ZZ]XY[VW`[\`Z\`[\`\\_Z[]XY^XZ^XZ^XZ^YZ\WXZUV^ZZ^ZZZTVc]^`Z[_YZ_YZa\]dbba__a__a__a__`a]`a]`a]deaefbhffhffb``eccdbbdbbdbbfddhffhffhfffffeeefffhhhjjjiiijjjkkkkkkjjjllljiklkmhgijikqprsrttrttsuvuwwvxuwwsuuuwwy{{}}~~|~Ƚ̹ɺ̿ǾŠ}~}|~~~~~||{|z||}|}~~~~xz~xz~xz|wxzuv{vw|xwwsruqpsonvrqvsusoqxtvpmovsuvvvvvvprrntrqwvv|{swxvz{z~y}~y}~siuwr~sq~{vumy{jwyu{s}}xvt~~w|}z}x}~~z|}}}}}~ò|{}x|}x|}vzztxyvz{quznuxpuvrvwnppqtrpsqmpnkqpkpqipskpqkoplnoonpnmokmnmoplnpiklkmniklfhhfhhiiikiimhihffiggljjhfffddddddddfffeeeeeeeeegdfgdfebdd`bb_a````````````___``````___]]]\\\^^^^\\`^^cccfhh`ed_]]^\\`^^^\\][[`[\^YZb]^^ZZ`[\b\^_Z[\WX^ZZ^ZZ^ZZ`[\^YZ]XY^XZ^XZ]WX_YZa[\_YZ_YZa\]ecc`^^a__a__a__`a]`a]`a]^_[_`\eccfddecccaadbbdbbcaafddhffiggkiigggfffgggiiiiiiiiijjjkkkkkkjjjlllonpmlnnmoonpnmorprutvxwyutvwvxsuusuuvxxxzz}z|||~~khjؼĬҿӻ~~~{|z|z|{||||}|}~~yz~yz~zz~zz~zz|wxzuv{vw|xwyut~zyyutxtrihjpoqrqslkmqprpnprturvwqtvlprsxyrwxtxyuz{x}~wzsvw}{}~|xv~~xww{|{~}~~{}~{}~~}}wyz}|~yxzyxz~yxzwvxpoqyxzzzzyyy{{{~tsupoq~~~y|}|y}~txyswxw{|vzu|qvwswxnpppsqrusorplrrlqrjqtkpqkoplnolkmihjkmnnpqnpqhjkiklhjjgiigiihhhjhhlghljjiggigghffgeecccdddeeedddeeeeeegdfheggdfebdb_a`````````___aaa`````````bbb___^^^_]]`^^cccegg^cb_]]b``][[^\\a__]XY\WX`[\^YZ`[\b]^`[\\WX_Z[_Z[_Z[^YZ]XY[VW]XY]XY_YZ^XYb\]_YZ_YZa\]ecc`^^a__a__a__`a]`a]`a]ab^bc_hfffdd`^^dbbeccgeeb``eccfddhffkiigggfffhhhiiiiiikkklllmmmmmmlllnnnsrtnmoonprqsonponptsuxwywvxtsusuusuuvxxwyy}vxx}z|khjȼѿΫԱҴzwy~z{z{{||}~yz~yz|}~xz~xzz{z{z{|wxzuv{vw}yxzvuyut}yxzvuhgikikpoqtsuonpmppikltxyrwxv~~z{t||mz|ivxkxzxyxwvyt|w|}{x}~|}~~}z{|xwystuy{|tvw~qstoqrlnovxyuwxrtuvxy}~mop~}xwyvuw~}}ɣupqx|}z~uyztxyswxuy~ry|lqrquvkmmtwuqtrrusntspuvmtwkpqlprhjkonponpmopmopmopkmngijgijgiigiikkkkiimhiiggiggiggfddgeedddaaajjjjjjbbbbbbfcefceb_ac`bb`bcccbbbaaa``````aaa```___^^^^^^^^^`^^`^^bbbacc\a`_]]b``b```^^b``b]^`[\`Z\_Z[`[\a\]_Z[^YZb]^`[\]XY]XY]XY]XY[VW]XY`Z[`Z[`Z[_YZ_YZ`[\caaa__a__`^^a__`a]_`\]^Z_`\ab^geehfffddeccgeefddfddecchffgeejhhhhhiiiggghhhiiiiiimmmlllmmmlllnnnrprsrtqprsrtrqsqprvuwwvxvuwvuwqssvxxxzzxzzy{{vxx˷ϸɽ}xy}~}~wrs}xyz{{|{|{|{|{|{|{|~yz~yzz{z{z{}xy{vw|wx{wv|{wsrtpovrqhjkiklnpqvyymopoqvjmqv{ty|sy}qz}qyyjqqs{{owwv~~o~l{}n}k{}l|~q~|x~zswzostosty~~|z~|~~|~|~{}~~{z|~}˛~vz{quvquvtxytx}sz}nstptuprrrusrusrvtlrqnstkruhmnlpqlnosrtonpmopmopmopkmnjlmmopgiigiimmmpnnkfgjhhjhhjhhfddgeeiiigggiiibbbhhhhhhfcefcec`bc`bc`b``````^^^``````aaa```___^^^^^^^^^`^^`^^bbbacc]ba`^^a__a__`^^^\\^YZ]XY_Z[^ZZ`Z\`\\_Z[^YZ`[\^ZZ]XY]XY]XY]XY\WX\XX`Z[`Z[`Z[a[\a[\c^_dbba__dbbb``dbbbc_bc_ab^``\bc_dbbgeehfffddhffgeefddfddhffkiikiihhhkkkkkkkkkgggfffmmmooommmlllnnnpnppprqprrqspprrqsttvsrttsutsusuuwyyy{{y{{wyyz||ͭƶμҼ~~|~}~}~~yz{|||||||||||||z{~yz~zz~zz~zz}xy{vw|wx}yx~zyuqpuqpxtt_abacdkmntvwjlmRUY_bfbgjfmpluxr{~w{zs~~wn}m|~n}po~vz~wy}~~~}~|~~|~xz{{}~|~~xz{~}~}{{}|~~w{|swxrvwtxzvzpwzy~ptusuusvtvywsvtlrqnstkrukpqhlmtvwqpronpmopmopmoplnnlnooqrhjjhjjmmmpnnkfgjhhjhhjhhgeefddfffgggcccggghhhffffcefcedacdacdac```^^^^^^___aaaaaa```___`````````a__a__```acc^cb`^^^\\`^^`^^^\\_Z[]XY^YZ^YZ_Z[`Z\`Z\^YZ^ZZ^XZ]XY]XY]XY]XY]XY\WX`Z[`Z[`Z[`Z[^XYb]^eccb``geedbbdbbbc_bc_cd``a]bd`igghfffddfddhffhffgeehffcaaiggjhhhhhkkkkkkqqqkkkmmmqqqooommmlllnnnnmoonpqprrqsonprqstsurqstsutsusuuwyyy{{xzzxzz|~~żѪ˶Ͼɾ{vw~~~}~~~}~~|~|~|~|~|~|~|}~zz~xz~xz~xz}xy{vw|wxuqp{wvvrqvrqzvuptuimmotuw{|rwx|w}wy}wxuvl{}n|o}qn|~sz~{xy~~}{~}|~~~}~xz{~|~~{|z|tty|~}y}vz{vz{puyu|~puvrvwsuuxzywzxtwvotspuvltwmrsostqrsttunnploploploplnolmnnpqjkkjkklkkjiilhhkiikiikiigeefddbbbhhhbbbaaaaaadddfcefcedacebddac```_________aaaaaa```___`````````b``b`````acc`dca__\ZZ`^^`^^b``e_`_Z[]XY]XY^YZ_Z[`[\_Z[]XY]XY]XY]XY]XY]XY^YZ\WX`Z[`Z[`Z[c]^`Z[e`aeccbaafddcaaa```a^bc`bd`ab_cdaecchffhffgeeigghffgeejhhmkkiggigfhhhiiigggppojiigggnnnonnmmmlllnnnnmopoqqprqprnmonmosrtutvvuwvuwqssvxxwyyxzz{}}|~~}z|}|}ӸκԸ|~|}~~||}~}~}~}~}~}~}~|}z{}xy}xy}xy}yy{vw|xxtpoyutyutwsryutbilekndknqwzry|`fk`fkdjov|x~{x}v{y}{|z~y}|~{~y|xzz{}|}yz~}~}~}}|~}vz{}{y~~~~}~ywwvpn}urŌ|{z{{}}yzzxxxyyzwxwvwwuuuxxxtssrqrrsuoqrrvwqvvptuostkopmqrmqrmstgppjqqlqrjnolnornnsoonhjnijnijhhhhhhhhhjjjgggeeefffhhhjjjdddcccfggefeddddddbbbaaaaaabbb```aaa`bb_bb^``]``bdd^___``_``aaa``````a__^\\^\\a__b``a__a__ZXX[YY_]]][[^\\\ZZ^\\][[][[[ZY\ZZ`[\^XYb[\b\\a\^c^__Z[\WXhcdb^]c^]d`_c_^b^]a^_a_`dacdabebdhfffddhffdbbdbbhffjgikhjhegifhjgieghegheghdfggijjmnkmnlnomopkmnlopqprsrtonpmlnrqstsuwvxutvvuwvuwrtuqstwyzuwxnpqzz|pkmϻȴ¸ء~~|~}~y{~{}|~}~}~|}yzvw{z|zu|yvzwrzwtzvt|xw|xwzvuxtsrnmyw~v|pwzpwzrx}tzflq]chorvxz~wz~z|ux|wyz{|}}y{{y|zzxxw|{xx|yz~~tvwmqr~~|{y~sxw|~~{{{zzzxxxxxxvvvuuuxxxtttvuwyxzrtutxyqvwnrskopjnolpqlpqjrrfpphppkpqnrsqstqppqoojhhjhhjhhhhhhhhhhheeeeeeeeefffgggfffaaabbbfffgggeeehhheeebbbaaacccccccccbddbddaccceebdd]__^^^^^^`````````_]]_]]b``^\\`^^b```^^XVV][[][[][[^\\_]]_]]][[[YY^\\`^^\WX^XYc[\c]^d_`gbc`[\UPQ_Z[_[Z`\\c_^b^^b^\b_ac`bd`bdacebdfddfddfdddbbdbbhffjgikhjhegifhjgifhhfhhfhheghgijjlljlmkmniklhjkjlnlkmsrtvuwrqssrtvuwsrtttvvuwvuwrturtuwyzy{|rtu~}ϼ̵ʿƞlik}z|~}{}|~{}{}{}|~|}|}xyuw}xw|ww~zy{wvzvvzvu|xw~zy}yxzvuplkfmphorjqtnuxpwzcinu{sy~pv{tz|ruyux|wz~{~x{vy~x{y|y|ux}xx~zzzz||vw{{|{|}~~~~{}~x|}͚~~w}|y~}wyy{{{zzzxxxwwwvvvuuuxxxttt}|~^]_qstrvwmrsnrsjnokopkopkopjrrhrrhppkpqostsuvsppqnnnllnllnlljjjjjjjjjddddddeeefffggggggdddfffdddddddddmmmeeeddd```eeeccccccbddbddceeeggbdd_aa```````````````_]]`^^caa][[`^^`^^`^^b``][[][[][[][[^\\^\\][[\ZZ^\\`^^\WX^XYc[\b\]b]^d_`_Z[ZUVe`a]YX_[Zb^]b^]a]\b_afcec`bebdfcehffhffdbbdbbdbbhffjgikhjhegifhjgifhjfhjfhjfhifhihjljlljlniklhjkiklonprprnmopoqsrtutvrqstrtvuwvuwprtrtuz|}xz{tvwںƿҾ̱}~~{}{}{}{||}|~|}xz|xvzwu|yw|yw{wvzvuvrqwsrzvtzvuwsrnuxlsvlsvmtwmtwu{jpuqw|sy~qw|sw|zz~xx|yy}xy}yz~|{zzxx~{zzz{y~|~|~|}{|z~xy}z{}~~~~}~ē~{}z||{{{xxxwwwuuuuuuuuuxxxtttvuwtsutvwtxynstquvkopnrskopkophppissgookpqmqrorsrrrnnnjjjjjjjjjjjjjjjjjjgggdddeeefffgggeeecccdddccc___aaannndddddd___gggaaaaaa_aaaccbddcee`bb`bbbbbaaa`````````caa`^^`^^^\\b``b``^\\`^^_]][YY^\\\ZZZXXZXX\ZZ`^^\ZZ\ZZ`[\]WXc[\e_`c^_b\^`\\`[\d_`]YX`\[b^]a]\`\[b_afdfc`bebdfdfjhhljjfdddbbdbbhffjgikhjhegifhjgigijgijgijfhifhihjkikljlmjlmikljlmkjlonponprqspoqqprtsusrtvuwvuwnprrtu~y{|uwxxvvϯзȽаƩ}~~~|~{}z|~y{z{{|}~z{wy~xyzuvzuvz{|wxzuv}yxzvuuqpwsruqpjqtqx{horkrut{~yv|tzu{sy~uy~suyyz~yz~yz~yz~xy}yz~z|yz~yz~zz~|||{{z~||}|yz~uvzyz~~~~~~xst~ݒ|Ǩxuurxwsxw{}}vvv|||}}}wwwuuuzzzyyyjiksrtoqrquvpuvptukopnrslpqimnhppeoohppglmlpqmqrnmmmmmllljjjkkklllllllllggggggffffffhhhfffaaadddfff```aaafffcccfffgggcccaaa^^^bddbddaccdffbdd`bbbbbggghhhbbbbbba__`^^b``^\\^\\`^^^\\_]]_]]WUU][[^\\\ZZ^\\^\\^\\ZXX\ZZ\WXkefbZ[e_`b]^`[\b]^c^_d_`b^]c_^c_^c_^c_^dacgdfhegebdgdfhffiggfddhffhffjhhifhjgiebdkhjgdffhifhifhieghfhihjkkmnkmnjlmhjkmopsrtpnpsrtonprqstsuwvxxwyvuwtsuoqrwyz{}~|~suvy{|ͭȼĶŶɝ~wrt}}}}~|}z{z{xz~xy{vw|wxxstzuv|wxyutxtswsrvrqvrqlsvpwzjqtnuxsz}ouzntyouzu{u{{uswwvzzx|{z~{z~{z{|{}}|}{z|zy{{wy~z|~{}}z|~|{}|}z{}~vw{~}~{}~|}¡ȅsyxv{z}zzzwwwtttyyy{{{{{{wvxxwysuvvz{puvswxpturvwjnojnokssfpphppnstimnkopkmmjlljllikkjllllllllllliiieeeiiikkkhhhjjjdddcccfffdddeeeccceeeffffffccc``````bdd`bb_aadffbdd`bb```dddeeebbbbbb`^^\ZZ[YYa__`^^\ZZZXX\ZZb``[YY_]]][[][[^\\^\\^\\ZXX\ZZ^XZf`a_WXf``c^_a\]b^^c^_d^`d`_ea`b^^c_^d`^dbdgdfgdfc`bebdhffigggeeigghffgeejfhjhjdackhjkhjfhjeghgijeghfhihjkkmnkmnjlmjllmoppoqpprqprpoqpprqprtsutsuvuwtsuprsvxysuvxz{vxyvxyͭᴽļĿǾƸ»ɿĨ~~~}|~{}|~||||yzuw~w{|wy}xz|wyzuwytuyutxtszvtxtstpohorkrugnqmtwovyntymsxntyqw|ntyquzttxtswxw{zx|{z~yxz{z|{z|zz|xwyzwy}z||~~|~~}|}|}z{}~~~|~~}~ߑv|{v|z}~~~xxxuuu~~~}}}zzzzzzxwyxwyoqry}~nstptuptuptulpqostowwgqqgoorwxmqrimnoqqnppkmmjklkmmlllllllll___eeekkkiiiiiikkkfffcccfffdddfffbbbeeeffffffcccbbbbbbdffdffceedffbdd`bb```cccbbbaaa^^^b``b``ecca__^\\a__`^^a__b``][[^\\][[][[^\\^\\^\\\ZZ\ZZ`Z\hbce]^f`bd_`b\^d^`c^_b^^`\[_[Zb^\c_^d``ebdgdfebdc`bebdfddigghffiggkiihffjgilhjfcenkmlikgijcefikleghfhihjkkmnkmnkmnlnnmoponpqpronppoqpnpqprtsutsuvuwtsuvxyxz{uwxwyzz|}xz{~{}~ɳܼĹԺΰܲ}~~~~wrt|wy}|}z|~yzvxx{|xy~y{~y{{vxxsuyutxts{wvxtstpojqtlruipsrx{ovyotyjpviotkqvkpunrxvuytswvuyxw{{z~}|~~}~zy{xwy|y{}~~z|xy}{|~~~~~|x|}Ø{yx{zz|w|{z|{~|{{}}}yyy{{{}|~tsusuvkoppuvostrvwquvjnoostrzzjtshnorwxbfgmqrlrpkpokpohmlinmlllllllllqrqrsskkkcccgggfffcccgffaa`eedddddddffffffccchhgddd`bbbddeggdffbdd`bbccceeehhhfff^^^a__^\[^[[`^]\ZZ^\\\ZZ][[a__\ZZ[YY\ZZ^\\^\\^\\^\\\ZZ\ZZb]^]WXaZ[gabc``b]^`\]b]^a^^c_^`]\a]\b_^ea`fcegdfebddadgdffddiggigggednlkkiilhjljljginknlikgijcefiklfhifhihjkkmnkmnkmnmoplnoonponpmlnqprnmorpsutvutvvuwtsurtuqrsxz{uvxxz{y{||~ǸŶdzͽƓyz}~}z||}z{|}wxy|}w|~x}}w||v{zuwyttxtsyttxtsxsseilnptdhlqtxquymptmqtmptlpsknrjlputxwvzxw{yx|zy}}{{~~~}{z|{}|}~{|~||~z{wx|~~}|~ΟʿǑ}|}xz{xz{suvprsz|~svwuwxtvxvuwtqstsuswxbghmttotunstntuinpfklprsjmnloplnoklmmnpklmijlcdfklnhjkgjkhjkjikjgiifhffffhhfiieggfhhdff_ab\^_`bc`bcbefdcedcedceedfcbd^^^bbbdddfffdddaaa`_acbddcefega`b]\^_^`]\^]\_\\^`^^_]]^\\^\\^\\^\\ZXX[YY\ZZ^\\\ZZ^[]_\^`]_`\^`]_`__```_^^z{{jii````___``baaaaabaadbbfdddcbgeehffedgedfedfa`bdcfedgeegacdccejmnghiihjhgijikSRTgfhlkmnmomlnnmopoqlkmjlmkmnnpqnpqnpqoqrqstsuvtvwqstsvwswxuyzrvww|}z~{}~kfgаΤƣ}}}~y{toq~xz}~~~~y{{}z}z}}y|~x{{}z|z|{}{|z|ytvvqsytv{vx{vx]`dlos_bf_bfnqunptnptnptorvpswruyxw{xw{xw{xw{xw{sqqrppwuu}}~}{}~~|~~|}|~~|~xz{~}|~Țvxyxz{}~uwxxz|y{|tvwrtuttv}z|xwyquvgklnrsptunrsnrskophlmlnohjkikljlmfhihjklnooqriklhjkjlmfjlhjljjlifhifhgggeggeggeggfhheggeghfhiacd`bdbdedcedcedceedfcbd^^^bbbdddeeedddaaa`_aa`bbac`_a_^`]\^_^`]\^^]_]\^`^^_]]^\\^\\^\\^\\\ZZ^\\^\\a__`^^^[]_\^`]_a^`_\^___```^^^pppddd^^^aaaaaa______```eccfdddbbdbbfddffhffhffhlkmlkmjikkmndfffhigijhjlmlnkjllkm\[]edflkmnmomlnpoqpoqonplnpnpqnprnprnprprtrtusuvtvwqsttxyquvvz{rvww{|{|~}}~ŸƼ̹ݳɹüß~}~~~~~~y{z|z}z}}~~y{~z|~y{~}{}}xzztvwrt{vx{vxknrilphkoqtxknrnrvnrvnrvorvruyux|xw{xw{xw{xw{xw{{yyzxx|zz}{{}{{}qstvxyxz|{}}}~prsyx|ē~wyzrtuxz{{}~wyztvwqst{}~uwxtrutsuuwxnstotunrsptuptujopkoplnokmnjlmjlmfhihjkhjkegheghdfglnohlljllljlkhjkhjiiigiigiifhhgiifhheghgijdffbddbdedcedcedceedfcbd```bbbcccbbbcccaaaa`ba`bcbdbacbac`_aa`b`^`a`b`_a^\\_]]`^^`^^`^^`^^_]]`^^`^^a__`^^^[]_\^`]_`]_dac___```^^^YYY]]]aaa______YYY^^^dddfddfddb``caafddffhffhffhfeggfhedfkmneghhjkgijjlmkjlhgiihjhgihgilkmnmomlnmlnlkmmlnnpqoqrprrprrprrrturtvsuvtvwqstquvrvwuyzuyzswxuyz~~}ıȶ̺z|~z|z|z}z}}zvx~z|~z||~z||wy{vx|wyz|}xzwrtknrilporvsvzqtxorvorvorvnquprvpswutxwvzxw{wvzvuy|zz}}zxxyww|{}z|}vxy~~~{}}xzz}zy}~}~}ytuΌœ~zy{}~{}~uwxz|}vxyrtuuwxrtunpqiklkmnwyzruusuvtvwptuqrsuwx{}~jklqstjlmlnnjlmjlnkmnoqrprslnonpqlnoiklhlmjlmlkmnkmnkmllljlljllgiihjjfhhgijfhieghbdebdedcedcedceedfcbd```cccbbbaaacccbbbcbddce_^`dcebacdceedfcbdbaca`b^\\_]]`^^`^^`^^`^^_]]a__^\\`^^_]]^[]_\^`]_b_adac___```^^^YYY[[[^^^aaaaaa___aaabbbgeeeccb``ecchfffdffdffdfdcehgihgiegheghhjkjlmjlmlkmihjhgirqsgfhlkmnmomlnnmokjlonplnomopprsprsprsrtusuvsuvtvwqstquvy}~w{|uyzvz{~д̷κŦȚ|~}|~~{}~}}z}z}~y|z}wrtz|z|~~y{{vxuprrmormomhjilpgjnilppswsvzorvorvorvorvorvruyxw{xw{xw{zy}srv|zz~~wuu{z||~y{|iklxy}wx|xz{|~~}}~~{z~~}}|{|zy{|{}~~~~~~~إkiiwyz}tvvuwxuwxvxytvwlnouwxuyzxz{xz{wyzlnolnosvveghoqrruvrtumopiklkmngijnpqlnomoplnokmnjlmfjkgijkjlkhjliklllikkhjjfhhjlldffdfgdfg`bcdfgacdcbdcbdcbddcecbdbbbbbbbbbbbbaaa```fega`bcbdcbdcbdcbdcbdcbda`b`_ab``_]]_]]`^^`^^b``dbbcaaa___]]][[]Z\_\^b_a^[]_\^aaa___cccaaaaaa`````````aaa```bbbgeefddcaafddkiifdffdffdfddffegdcegijhjkfhiiklkmnkjlhgigfhcbdlkmihjkjllkmmlnnnponpnppqstrtuqstsuv|~rtuuwxtvwvxyuyz{vz{w{|z~x|}~~y{{үԯ˷«հ}z||}|~|~|~}xz|~z}{~}vyz}z}{}}xz{vx~y{ytv}xz{vxytvvqstoqrmogjnlosknrknrmptnrvorvprvorvorvruywvzyx|yx|zx|tsw}}~~zxxrqsqstjlmeghWYZxz{xy}xy}xz{uwxxz{lnoy{|~}|~}}|~{{{}~~|{ͷǥ~~z|}oqrsuvwyzwyzsuvtvw~qturvwrvwtvwqpr{z|utvtrtmlnvtvutvprsjlnkmnkmnhjjmopikliklkmnjlnjlmgklhjkljlmjlliklllhjjhjjikkhjjceeeghbdf^`acefdfgedfedfedfdcecbdbbbbbbbbbbbbbbbaaacbda`bcbdcbdcbdcbdcbdcbdcbdbaca___]]_]]][[][[`^^b```^^][[_]]a__`\^a^`b_ab_ac`bcccaaaeeebbbbbbbbb``````bbb```cccgeefddcaab``caaffhffhffhhgiihjgfhhjkikliklgijoqrmlnkjlkjla`bhgihgijikmlnpoqrprqproqroqrprrnpqprsz|}tvwtvvrtutvww{|vz{w{|z~{{~yxzҵϕ»™~~~}{}|~~{~{~x{z}z}z|xsu|~toqz|{vxytvwrtvqstoqdgkjmqknrlnrlosnptorvptxorvorvruywvzyx|zy}yx|xw{{yyommxvv}}wvxxy}vxywyywyzsuv|~~}~}|}{{{¸~y{|uwx~y{|z|}uwxuwxsuv{}~^bcsxyuyzqstjikmjlsrtrqstsurqspoqprshjkprslnohjliklikliklikljlljlmhlmhjllkmnkmlikjjjhjjgiihjjgiidffdffacd^`acefdfgdcebaca`bdcecbdbbbbbbbbbbbbbbbccc_^`cbdcbdcbdcbdcbdcbdcbdbac``b`^^^\\^\\][[][[`^^`^^][[\ZZ^\\a__a^`a^`b_a`]_a^`cccaaaeeebbbbbbbbbbbbbbbbbbbbbdddgeefddcaaiggnllffhffhffhihjjikihjhjkiklhjlgijmopmlnkjlmlnlkmkjljiklkmnlnpoqtsupoqnpqmopnpqnpqprsuwxtvwsuvy{|wyztxyrvwvz{vz{txyvz{}|~YXZϡٮŷƭ}|~{xz~{}|~ytv~y{}|~{~y|y|z}z}|wy~z|ytv{vx{vxytvuprsnpqlnilphkomptloslnsnptprvrtxprvprvsuyxw{xw{zy}xx|xw|xvvwuuuss׿½³|{{z|ϙz|}rtuxz{z|}}qstz|}tvwrtu^cdrwxw|}vxyzvxttvqpronppoqooqjlmacdoqrlnoiklhjkjlmjlmgijhjkjklhlmiklmlnliknkmjjjgiifhhgjigiiikkcefacd`bcdfgacdgfhdcebacdcecbdbbbbbbbbbbbbcccddd\[]dcecbdcbdcbdcbdcbdcbd_^`^]_`^]][[^\[`^^`]]b``b`_][[][[_]]_]]`]__\^^[]a^`b_aaaa___ccc`````````bbbbbbcccbbbdddgeefddcaahffjhhfegfegedfihjjikhgifhifhigijhjkfhiljlkiklkmkiknmopoqonpnmonmosrtnmoprspstoqropqprstvwz|~z|}z|}qsttyzuyzx|}|x|}|~}~hcf˴Ǽʢ|~{|{||}{vx~}~|~~{}~|x{z}z}z}z|ytv~y{|~{vx{vx{vxytvwqttprsmpdhijnoimnmqrkoprqstrtusuusuvtvvuwwyzx{{yxzyvx{|zwyzvy}nmrz{tvzbfj`eh~}|~}zy{|zonrpot~}~~~~ųtsujhjvxyprstvw{}~vxyprstvwijktvwqstpqrurrtttqqpmppkponpqlnokmnkmnjlljlmkoplpqjikqpryuwjlmkmniklikljjljikjikjikjikb`b^]_`bciklfhhgijdfgfegdcegfhdcedcedcedcedcebaccbddcebacbacbacbbddcedcedcea`b_^`^]_dce_^`\[]]\^a`b^]_b_a`]_b_aa^`ieh]Z\b_ac`b`]_`]_`_ba`b`_aa`ba`ba`bddddddbbbbbbbbbebdebdebddachegbacedfhgiihjjiklkmceflnoikldfhjlmhjkiklkmnfijhjknmomlnkjlnmotsuonpusuwvxrtvswxw{|rtttvvwyxxzywyxwxy|}~{|}}y{{~vttѶïԺ״ĻɸĶē~y{wuw|wy~~~|~{}{}{}{}z||~z|}xz{}}xzz||xz~y{~ux{svypswnruloswxmqrostjnomqrrqsurtvsuvsuwtvvuw{}~tvvzy{~{}zuw}z||~|y{}z||{^`dnosxy}Яw|}Ƒ~y{|wyz~cbdwvxvxytvwrturtuprs}oqrceftvwsuvqsturrrrrillnsrotsnppkmnlnomopjlnlnoknplprgjjjiknkmjlmkmnikljlmikljikjikjikgfhhfhjik]_`hjkikleghfhifegcbdcbddcedcedcedcedcebbdcbddbdcbdcbdbacb`b`_acbdcbd`_ab`ba`bedf`_a]\^^^```b`_ab_a`]_`]_a^``]_\Y[_\^_\^`]_`]_`^``^``^``^``^``^`dddhhhbbbbbbbbbfbdfbdfbdfcejgihgifegihjgfhgfhhgibdegijegh`bclnojlmhjkgijgijhjknmonnppoqpoqrqslkmwvxyxztvwostinotvvvxxxzzy{{z||wyzrtusuvy{||~}{}}{|~~ֶ˽ĬȿɹſιɻɸķºĘ|~~}~~}~{}{}{}}}}z||wy~y{z|{vx~ux|svzptxorvmp]abhlmimnlpqquvrqsurtvsuvsuwtvvuwoqrzy{tqs{vx|~urt|~~{}~ɳpuxy~z~~~}xw{}|~}|~~}~}}}ϒxwywvxutvkjlzy{qstprsuwxvxysuvnpqtvwtvwsuvsssxxxtvvnsrionlnpkmnmopmopklnknoinonrriklmlnjikjlmkmnikllnojlljikjikjikjikigijikhjkeghY[\tvwhjk`_a^]__^`dcedcedcedcedcedbdcbdbbdcbdcbdbacb`b`_abacbac`^`cbda`bcbd_^`^]__^``_acbdb_a`]_`]__\^QNPZWY`]_b_a`]_`]_`^``^``^``^``^``^`dddmmmbbbbbbbbbfdffdffdfb_afcea`bcbdnmogfhgfhfegfhigijcefbdelnohjlgijfhigijhjllkmonprqssrtsrtpoqrqstsuprtnrsmrsprrsuuuwwwyyy{{z|}vxy{}~}tsu½·ǹȸŷ¶¨|wyx{|~~~}{}{}{}z|{}}z|z|}~upr{vx~y{~y{|uxzsvxrtwpstnpdhidhihlmkopostrqsurtvsuvsuwtvvuwhjkzwylgiyvxpmo٨{w|}~}{z~ɴ˥ÿqprzy{mopwyzoqrgijuwxnpquwxuwxuwxwwwxzzrwvoutlrqimnimnlpqimngklgklinomrsglmqstdcejlmkmnhjkkmnjlmhjkhjkhjkcefceffhieghdfgrtu]_`bdefeghgikjldcedcedcedcedcedcecbdbac`_a`_abaccbddcebacbac^]_a`b`_a\[]\[]_^`a`b`_adceb_a`]_\Y[b_aPMOa^``]_^[]`]_`]_a`b`_a`_a`_a``b``beeerrrbbbbbbbbbgdfgdfgdfd`bgdfedfdceonpihjhgigfheghbdecefgijkmnfhigijiklhjkikllkmmlnnmopprrqssrtpoqsrtmoplpqmrsqsssuuuwwtvvrttsuvuwxuwx{}~~uwwʹϾʽ˼˺Ǻŷķ~~|~{}~~|~{}{}{}|~{}}xz~y{~y{z||~~y{~y{ytv{vx|uxzsvyruwpsunqeijkopimnnrspturqsurtvsuvsuvsutsuxz{oqr|~|y{{xz~{}~|qrvx}swx|z|qpr׮vuw~zy{~~}{}~y{|xz{|~uwx|~y{|wyzrtuvxytvwuwwlrqotssyxqyxmrsinpinolqriopmrsgoojoplpqlpqmopiklnpplnortufhigijlmnfhidfgeghfhihjkgijfhihjkgijgfhcbdedfedfedfcbdgfhdcecbdcbdcbdcbdcbdbac_^`gfhbacbacbaca`ba`b\[]^^`_^`a`ba`ba`ba^`a^``]_b_ab_aa^`]Z\]Z\_\^a^`^]_edfcbda`ba`b``baaaaaaaaaaaaaaafbddacc`bfbdroqgfhfeggfhgfhihjfegdfgeghdfhnpqoqriklgijeghikliklonpnlnnmonmopoqonppoqpoqmopnrtnsttvvwyyxzzvxxwyyuwxsuvy{|~~ϽŠʽʪ̱Ʒxsu~}vy}~}xz}z|z|{}{}{}~y{}xz}xzz|~y{~y{{vx|wy{vxzuwzuwwrtsnpimnostkopnrslpqrqsurtvsuxuwxuwrqsuwxz|}̨~~{}klpijnrsw̤x}jor~}y}~{z|}|~zzzwuuЫvuw}|~|{}zy{~|~y{|y{|z|}wyzsuvxz{vxysuvtvwz~qvusyxowvryxntulprlprmrsdijellkssksspuvlpqnrsjlmprskmnnpqfhifjkhlmejjbfgdhifjkhjkfhifhhgijfhigfhdceedfedfedfcbdgfhdcedbddbddbddbddbd^]_bacdceihjedfcbdb`bb`b`_abac_^`a`ba`ba`ba^`a^``]_b_aa^`c`b_\^_\^_\^a^`a`b_^`WVX\[]^]_`_a```aaabbbbbbbbbdacdacdacgdfpmogfhfeghgigfhmlnonpeghegheghnpqnpqjllgijfhhfhijllnmonmonnpnmopnppoqpoqsrtsuvswxqvwtvvtvvtvvy{{y{{xz{~}|~Өյˮכ{}|wy~~{}{}{}{}{}z|z|z|z|zuwvqsvqsyvxxuwvtvtrtroqlpqmqrmqrlprkoprqsurtvsuurtwtvqprwyzwyzqprkhjb]_heghegpmo|y{~{}~΄ejmz~|~tvwvz{{~}{}~zzzmkkΰº›´qpr~}{z|z|}y{|xz{wyztvwvxyrtuuwxwyzsuvtvwv{zntsqwvowvp{ymuujsskssowwdllowwoyyowwrwxlrrptutvwiklkmnjlmjlmfjlhllhlljnofjkbfgfhidfgeghfhjeghgfhffhedfedfedfcbdgfhdceddfddfddfddfddfdceedf_^`_^``_abacbbdbbd`_adce`^`a`ba`ba`ba^`a^``]_b_aa^`c`b_\^_\^`]_`]__^`_^`]\^]\^_^`a`baaabbbbbbbbbbbbhegheghegfceifhgfhfeghgiihjhgiihjhjkhjkeghacdhjkjlmhjkfhjgijjlnnmoppronppoqonprrtxwywvxxz{x|}v{|tvvtvvtvvvxxxzz|~z|}y{||~~ʺ¥μƃ}wx~|ux~~|~|~{}{}{}{vx|~z||~|~}xzytv}xzyvxxuwvrttqsrprlpqeijnrskopmqrrqstrtvsuuru|~xwyxz{z|~~}|zuxxvxurt}~ptx~uwxx{{z~~onr~xxx}|~~Ď{zrps~|~z|}{}~z|}vyz{~qtugijmopvxyvxzqstrxwsyxnvujvskvtlttirrjqqhppekl|qzzkuuntuotunrstvxknojlmjlmnpqgklfklinolqrinohlmdggcfgcfgehidghgfhhgidceedfedfcbdgfhdceedfedfedffdfedfdcedcefdfeegdceabccbdbcd[Z\cbd`_aa`ba`ba`ba^`a^``]_b_aa^`b^a]Z\]Z\`]_`]__^`^]_`_acbdcbdcbddddeeecccccccccfcegdfheghegheggfheegggiiijggiijkhjkhjjeghjllhjkkmniklgijkmnkmnnmorqsonpqpronpstuwvxyy{prsquvqvxsvvuwwvyyy{{z}}{}~|~z|}xz{z|}opl|}ɦæʗ{}}xz~y{|~|~{}z}{}tnq~|~|~}xz}xz}xzytvyvxxuwurttqsroqmopjlmlnolmnkmnorsprsooqrtuhikmopqsssutvxxrttwx|yy}{|vvzxy~y{|vuyzy}zy}yx|||~}zy{~~~~}|~楧|~{}~|~~xz{w{|w|}x~y~y{zsuudffgiiqssowvowvlttltslsrkopkopostnstlopquvtsurrtilmlpqotulsskpqjnoprstvvhlmjnnhlmhlmfjkfkldjndjmagjagjagjgfhhgiffhgfhgfhedfedfedfdcefdfa`b]``bdecefcefcef`de`cd^bccfg^bc`_abbd`_abacdce^]_`]_b_ab_aa^``]__]]^\\`^^a__`^^bacbac^]_cbdcbdcbdbacdceedfedfedfgdfhegifhhegjfhbghcjjfmmbijV]^diilmllmj_`_jkioonlnohjkgijikllnoolnyvxqprpoqqstpuvqttrwvrwvsxwrwvqwvqwvx~}~rtu{}~~|}мųĬıvvuxwy|~{}~~}{}}z|~|{~z}z}{~|z|}xz}xz|wy{vx{vxztvvqsqlnwqslnpoqrlnnjlnmopmoptvwrtuuwxsuvwyzuwwvxxmoo|}yz~xy}vw{wx|}~{}}}{}~~~zy}yx|~{||~~~Ӳ}|~~~y{||~|~w{|tyzpxxsxywyytvv~vxxvxxnvuluts{znwvltsnrsnrsquvnrsostmqrqpronpiklptuotulttkpqjnpnpqsuvjnolpqkophlmgklimnahlbjm`gj`gj`gjgfhjikjikgfhgfhedfedfedffegfegdcegijdfgbdfbdfbdfbdeacd`bc`bcabd``bb`ba`b`_aa`b]\^b_ab_ab_aa^``]__]]^\\`^^caafddgfhedf^]_cbdcbdcbdbacdceedfedfedfgdfhegifhkhjlikafg`hhbjj_hhYbadjjmnlnomcdbijhkljlnphjkgijlnonpqtqsyvxrqsonpoqrnrsputrwvrwvuzyuzysxwv{zw|{x|{uzyprs~}ԩϳ~~~zy{}~|~}}~{~wz{~{~|z}~z|}xz}xz|wy{vxztvzvxzuwwrtuprlnooqrkmnjlnmopqstprsjlmqstprssuvsuutvvnppsuuxzzvw{uvzxy}vw{wx|uwx|~~}prs~~|{}|~z{z{}~~~˴{|~~~tvw}}w{|uz{s{{uz{vxxtvvwyytvvkqpjpotzypvuionmqrmqrquvrvwhlmkopqprtsuoqrquvnrtlttlqrjppprslnogklimnhlmfjkfjkimnbgjbgjbgjbgjbgjhgijikihjgfhgfhedfedfedffegdcedce_ab_abbddbddbddbdeacd`bc_bbacdb`b``ba`bcbdbaca`bb_ab_ab_aa^``]__]]^\\`^^a__ecchgifeg_^`cbdcbdcbdbacdceedfedfedfgdfhegifhkhjlikfjkejkejk_cdaefgljlljnomkljnompqonppiklhjkmopnpqolnroqlkmqproqrnrsputrwvtyxtyxqvuouttyxuzytyxqvuwyzxz{y{{|wxԶİżƼȅ£Ĕ{}{}|~}~|y|z}{~z}~z|~xz}xz}xz|wy{vxztvzvxvqsvqsxrtikllnojlmlnokmnoqrnpquwxrtuprsprstvvtvvy{{nppprr{|vw{uvzuvzyz~xz{}rtt}{}}~y{|}z|}yx|~wvzvw{{|z{~{|yxz~}~{z|xvv~~}}vtt­|{}vrq}~|}~qst{}~y}~otuwuz{wyyuwwz||lrqkqprxwtzyjpoptuptutxyptuostptuvuwrqsxz{quvkpqmuulrrkpqnpqrtugklimnhlmkopkopnrshmpdilbgjbgjbgjihjhfhcbdgfhgfhedfedfedfcbda`bbacacd_abacdacdacddcecbdb`cdcedcecbd_^`bacbac`_aa`bdacb_ab_aa^``]__]]^\\`^^caaeccedfdce`_acbdcbdcbdbacdceedfedfedfgdfhegifhhegifhdhidijdij\bcejkglkijhlmkmnlopnuvtnpqikliklmoplnoqnproqpoqtsurtupttputrwvotsuzyz~sttwyymooz||rtt~oqrƝʴƻȒqt|~~{}~}|~}{}|~~|x|y|~wz}xz}xz}xz}xz|wy{vxzvxztv|wytoquprmophjklnokmnmopnpqprsrtvsuvrtusuvrtt}wyyoqqxzzxy}wx|vw{wx|wx|wyzwyyxzz}}}z|}z|}|~{z~xw{~}~~~}}}϶uwx~|s{{lqruwwuwwprr{}}{}}tzxputhnlsxwnsrrvwptupttptumqrmqrpoqsrtxz{lpqrwxpxxnrtotunproqrlpqimneijaeffjkimngjnehlcfjdgkehlihjfegkjljikhgigfhfegedfdceXWYedfacdcefbddbdeeghgfhcceffhcbdcbdbacbac`_a_^`]\^]\^gdfb_a`]_^[]\Y[][[_]]^\\b``dbba`b`_a_^`bbdedfa`bedfgfhdcedcedcenkmlikjgiifhjgihjkbfgaefbfgbfgfjiijhlmkkljlmklmklnolnoiklkmnmopmjllikpoqsrttvwquvrwvuzytzx{sxwz}}z||suuuwwvxxy{|z|}~}ºЯͲ‡ptidfyyy~~~}wx~~|~~{}}z|~}z||~~}~~~{}z|~y{z|}xz~xz~y{|wy{vxxsuxsuwrttoqlnoikllnokmnmoplnonppqstprruwxsuvtvv|~~y{{suurttxx|wx|vx|wx|wx|}y{{vxxy{{z|}z|}y{|{}~z|}|{xw{vuy{z~~}~}|~~ʙɶƍ~}~npqqst{z||qssprry{{vxxtvvyzzsuuoqqswxostnrsostlpqmqrutvonprtumqrsxyowwotuhmnmopprslppmqrptulpqkopkopijnghlefjfgkghlhhjfegjikjikhfhgfhfegedfedf]\^edfcefacd_ab`bcacdgdfebdfcefcefceddfdbdcbd^]_\[]\[]c`b\Y[a^``\^]Z\a__^\\_]]caadbb`_a_^`^]_bacedfbacedffegfegfegfegolnifhdacifhjgiklmfghbdeeghcefceeijhlmklljlnlnnlkmnlnojllmopnpqnkmmjlonpsrtxz{ostrwvuzy|w|{v{zxxxyyyuuuyyyyyy{}~~z|}~̴˜ƅNjȐ̄~xy~{}{xz~y{~|~|~|~xuw{y{~{}}}z|z|z|~xz~y{~y{{vxytvwrtxsuwrtxsujlmkmnlnokmnmopmoplnokmnmoprtuprsprrxzztvvsuutvvvx|wx|xx|xz~xz~wyzy{{z|||~~~y{{z|}z|}z|}}}~{z~{z~}|z{}~|}~~}~}}ϸ{z|}~oqroqr~y~}y~z||tvv{}}uwwoqqqssprrrttlpqkopswxlpqhlmlpqonpwvx{}~vz{rwxrzzv{|tyzoqrlnokopjnohlmnrsjnofjkijnghlefjfgkghlhgihgihgihgigfhgfhfegedfgfhdcehgifhieghcefeghcefhegjgiifhdbddbdfegedfcbd^]_\[]^\^`]_dac_\^`^`c`bhff^\\a__caadbb`_a_^`^]_a`bedfcbdedfdcedcedcedcea^`ebdifhifhjginmohjkgijfhicefdfflnljkilnlmnlnomjlmlnojlnjlmkmntqsqnptsurrtnpqrvwrwvuzyw|{x}|yyy|||yyyzzzzzzuwx|~|~~{}}ϷžȶƻrwŁun|}}{uv}{}z|~~~~~}|~~{}}~{}z||~~y{|~z|{vxzuwzuwvqswrtwrtikllnolnokmnmopmopprsvxxtvwruutvvtvvtvvwyyprrtvwvw{wx|xy}{|{|y{|z|||~~z||y{{y{{z|}z|}z|}}{}~~|{|{~}{||}~|}}|~|~||~|}ʱ~yx|||xz{~rvwqvw~|prr}suux{{nqqrutwxxxzzprrkopjnoswxptuhmnqtutsvttustvnrsglnemmbghdijmopmnpnrslpqkopgklimnjnoijnghlefjfgkghlhgiihjgfhgfhgfhgfhfegedfedfedfedfbdecef`bcdfg_bchcelgijege`bd`becfcbebaca`b^]`_^`a^`vsu[XZa^`gdfmkk\ZZb`_caadbbcbdbac``b`_aedfdceedfccefdfeegedfjgiigiifhhfhigighieghfijfhifijiklpqoefdmnlnomopojlllnokmnmopoqrusupmpsturrtstvptvrwvw|{tzxinmtuuyzzyzzwxxwxw~{zyðعȳx{hgrpjpw{lmieTMrzrvz{~|~{}ytv|~~~~{}~{}|~~}|~|z|~{}{}|~z|}z|{vxxsuxsuvqstoqqlnkmnkmnkmnkmnmopklpqrvqrvtuystxwx|uvzrsvttywx{wx|tuyvw{|}uvzuvzxz{xz|uwxz|}xz||~yz~yz~z{z{|}|}|}~~}~vxy}~|ƴɒsqq~yxº}|~}|~~}|{}xy}y|z}x{mpsmop|~zwyuxyt||w~}rxwmsry{{uwwrstmopqstrtuxz{qstrtyqtyhkpx{nqvfosmtwirrlqpjonmoomoomookmmhjjfggiklgijggmggmgfofgkfgkfgkfgkdeifegfegfegfegbacddfcbdfdg`_abaccadedffdf``b][]]\^geeecba__fdddbbeccdacb_a_\^b_afcejgiebdfcfdaddacc`bb_ab_ab_ab_a`_adggbgfdhh]bagkjafgbghchichiejkeghhfhgfhhgijiklkmlkmqpqmlnkjklkmiklmopoqroqrkmnjpn|chgpvtntsoutotuejluz{tyztyzx}~txyw{|x}~~z{|{{ܮȹƾ˴Ɂqvilaenojihiio~{vw{}|~|~}}~}~}}|y{}}z|zwy|y{~{}}|~}xz~y{zuwytvytvsnp|wy}xzlnnlnnlnnkmnmoplmqlmqpquoptqrvuvzvw{z|uvzyz~{|xy}zz~|}xy}uvzvxy|~vxzz|}y{||~zz~zz~{||}}~}~~{|~~~ɾńpnmvtt|{}~}}|~}|~|}x{ux|wz~x{qtxoqrspr{xzx|}nvvu}|pvumsry{{rttoqrrtutvwvxyy{|tvwsv{sv{bej{~mpujswhorjrrmrqjpnmoomoomoolnnnppqssiklgijggmggmgfoghlfhlfgkfgkfgkgfhhfhgfhedfcbdedfbacedfa`ba`bdcegfhhgibac\[]]\^caadbbeccfddeccgeeebdgdfa^`dacifh^[]dac^[]hegheg`]_c`bdacfcefcedcebgfbffdihfkj^cb`ffbfhbhhchiejkiklkjlkjlhgijiklkmlkmlkmjikkjlpoqnpqjlmlnplnonpqqvuu{zekjpvuntsoutotusxyrwxrwxtyzqvwsxyv{|v{|z}z|}}~}z|ɸʻˤ|x|qtnorprntrgiz{|~~|~~{}y{|~|~~y{|~{vx{}}~~{}{xz{xz}~{}~~}z|~y{|wy~y{|xz~y{zuwzuw|xz|wywrtlgilnplnplnpkmnmoppqurswz{rrvvw{wx|vw{qrvuvzwx|xy}z{yz~uvzwx|yz~npqy{|xz{wyzy{|y{|z|z|z{}~|}{||}~|}yz~}~}~}~~~~~~кuuu{z|tsuonpxwyyxzz{x{y|z}wz~vxyvz{rzz|qwvpvuvxxtvvkmnwyztvwtvwqstruzpsxbejy|orwhquelojrrnrrkpomoomoomoogiieggbddiklgijggmggmgfohjnghlfgkfgkfgkkjljikhfhddfgfhfegdcefegedffeg]\^cbdhgigfh^]__^`b``dbbfddcaacaafddebdgdffcehegkhjfceb_aebdhegheg`]_gdffceheghegfeg`ddafeeji_dcbgf`efafgbfhchiejkkmnkjlihjihjlkmmlnlkmkjlihjljlrqsoqrjlmiklnpqlno\a`ekjhnmsyxoutntsotuotuoturxxrwxjopuz{lqrv{|w|}{~wyz}}~~Ƚͧw|x{runlsoytzunl|~~~}|~{xz{}~{}{xz|~|y{~|~wtvxrtxqty|}vy~wzzsv~y{{}snp}xz|~mopmopmopkmnmoppqutuyrswtuywx|uvzrswnosstxstxpqustx{|{|}~~wyzy{|wyz{}~~|~{|{|yz~}~}~z{{|{|yz~{||}|}~~}~}}}ڽüß|{}~}}|~zy{z{x{wz~jmqehl|}tqsqnpvz{{ntsmsruwwy{{prsrtutvwuwxsuvprsux}ruzhkpsv{sv{jrvlsvowwnsrlqpmoomoomoosuuvxxxzziklgijggmggmgfojkohimfgkfgkhimmlnjikhgidcegfhfegifhliklik^[]a^`fegfeg_^``_aa`bcaadbbdbbdbbecciggb_afcefcedacb_ac`b_\^dacgdfgdf^[]ebd`]_dacdacbac^cbafefkj`fdbff_de`efafgchiejkgijhgifdfdcefeggfhnmonmokjllkmqprmopnpqfhikmnnppkpomsrflksyxpvuntsqvwpuvpuvtyznstuz{x}~w|}{uyz|{|ɲķذot~inrqrsqpspwr{z|~}xz|~}|~wtv~{}{xz~{}tqsx{|ux}vzyrurmo{}qln{vxsnpmoprtunpqjlmlnolmqqrvoptrswstxstxvw{wx|vw{stxtuyoptstx}~wx|wx|{}~z|}z|}|~}|~wx|~~uvz{|z{{||}{|{|z{{||}}~vuw~{}}}}~~tujp»ś}|~}~vy}z}ux|wz~wz~{}~}~txyqyyowvZ`^tvvvxxoqrqstrturtvikl|~sv{qtypsxlottw|luyipskssotsmrqmoomoomoonppmoolnnhjkgijhhnfflgfohimghlefjefjfgkkjllkmgfhdcejikgfhifhifhfcegdfxuwfega`bcbdfeghgigeea__caacaahffigghegebd_\^dacc`bc`b`]_`]_fcehegc`b`]_^[]c`bebdfeg^cb`edbgfbgfbgfbghejk_dedjjdijprsfegdce]\^\[]cbdgfhonpkjllkmmlnlnolnofhiprsmopqvuntsntszhnmkqprwxpuvlqrjophlnafg{qvwzv{|uz|{y~zqstwqrpifɯþtzt}otox_h[a}poz{}~{z|qprzy{~~}z|{}~|~}z|~{}|~}z|~{}~{}~wzx{x{wzvyzsvytvzuwvqsytvtoqjlmikldfgkmnlnolmqpquoptuvzxy}{|vx|vx|vvzuvzwx|vw{optwx|z{xy}wyzxz{xz{xz{y{|xz{xx|~}~}~}~z|~{|{|z{}~|~{|wvxwvx}|~~̧~}~x{y|x{vy}x{y{|tqszwyvzzrzzs{zlrqztvvtvvqstqstprsfhigij}ruzpsxtw|jmrorwluykrunvvnsrmrqmoomoomoonppmoolnniklhjjhhnggmhgpjkojkoijnfgkfgkjikhgijikedfhgigfhkfhkfhlgihcef`bfegb`bcbda`bbacb``eccb``caaeccgeeifhhegebda^`a^`dbdfcejgigdfc`ba^`a^`b_ac`bdacddfdihejibhfbhfbhfbhhejkbghfklchirtujikffhcbdcbdgfhvuwkjlmlnnmoonpjlniklfhilnomopmrqjpontsoutpvusyxqvwpuvpuvmrsw|}rwxx}~rwxx}~sxyx|~w|}}y~wyzmop}~~¸ķɳŸȵ¯ʹòȳȈoj}\ta{r~}~}}}}zwywtv~|~{}~y{~y{|~yvx|~}z|~|~|~}z||~z}z}y|wzvy{svxsuxsuytvxtvzuwprskmngijkmnjlmlmqnosqrvstxqrvstxxx|xx|vvzuvzwx|z{ijnuvzwx|xy}wyzxz{z||z|}{}~y{|xy}~xy}|||}||~~{|{|z|~~}~~~~|{}~~~~Äƹ}~vy}wz~wz~vy}{~~|~|y{w{|t||rzyx~}jpoqssprroqroqrwyzy{|vxyux}{~ux}lotmpuhquhorlttmrqlqpmoomoomoonppmoolnnjllhjliiohhnihqjkojkoklphimfgkhhjfeghgigfhhgihfhkfhkfh[VXrnpkfhfdfbbdfdfa`b`_aa__geecaab``b``geeifhhegebda^`b_aebd`]_^[]gdffceb_ac`bfced`bc`bbacbhfdhhdhhdhhdhhchichibghbghafghjkhgiihjfegfeggfhedfXVXmlnlkmkjliklhjkjllfhikmnkpolrqsyxnttrxwoutpuvotuv{|hmnnsty~y~}rwxtyzowwv~~u}}}|wyz|}ͻǵǵǶƶðĬ|~yrm~hgi~|~z|{}z|~{}|~|~}|y{|~~{}~{}wzx{y|wzvy|svuprytvxsuxrtzuwgjkhkkkmngjkehijlpnptsswstxqrvwx|xy}xy}vw{stxttxxy}fgkxy}uvz|}xzzz|||~~xz{y{|z||xz~xz~yz~|~|}z{yz~{|{|z{~|~~z}}~}~lhlk̊Ɇضʊƽ~~z}z}|ruysvzz{}ywx|z|quvnvvqxwqwvw}|suurttsuwqstxz{mpqnqqcehpsxux~ru{qtynqvipuipsovvmqqlqomoomoomoonppmoolnnjlmikljkphhnihphimikojkoijnegkfghghidceggifeghfhlehlfh[UXpjmmfiedfcbdgfhfegdcea__fddfddb```^^eccfcffcfgdfkhjjgiifha^`_\^ebddacfcefcefcedacb_ab`bafebgfdihdihdih`ef_deafgdijfklhjkhgihgilkmlkmjikedfyxzomonmomknkmnilmlopqtumpqhmloutmsrnusoutnuspuvnttrvwglmotuotulpqsxyw{|v{|ovvw}~{}jop~ƻ̾Я´²αĤxwpy[bl|}lkm~~|~~~zwy}~}z|}}|svuxvywzvy{svxrtxsusnpwrtqln^gjfnqdloaimclov{ekplptmptmooprstx|wz~wvzxw{|w|yz~qrv{|{||}{|z{z{{|}~zx||{{z~|z~~|~}|~}|}|~}|{~~}~~|{|||xxx~‚΃ȅv~΀У~~xx~wyx|z||~y}~w{}uxyuxyvxyuwxtvw|~}moo{|elofnrr}wkvxmxzgruqt|gjpsuzrvwkoppqqooopppooonnnmmmhgigfhgfhjilkjmkjnjimnlplkomlpcef_cd]`a_cdcfgbffhgifegigidbd}|~fceb_aebdgdffcecdd```fffbbb[[[abbfddfddeccfddhfedacb_ab_ab_adacdacfcegdfd`bb_ab`bdfgfhieghegheghchichiejkfkljopkmnkjledfihjlkmmlnkmnmopoqrkmnknocomfsphrpqxwkrqnoqrrtrtupstswxotuqstpstz|}x{|xyztvwwyzwz{xyzy|}}}}~|vyz|}z}}z{ȳƹ´ɤkgnl_WoXv~}}{}~{}~~{}}|xz}~{}|y{~~~}}y{yvw{xz{xyzvxxtvzuwytvtoq}xz{}px~dktgouw~s|IQXflqkpsrwzostvyzqtxpswuvzxw{{w|vw{rsw||rswqrvvw{xy}z{|}nospquyx|~|~~||zy}~}}|}|{z~|{|z~~}zy}~|~~}|~}|}~{||}~~jhj|||wuuyww|||~}}|}zv̄lsy|zzxx{|uvz~~}~zzuwtwwyy|tw{w{|w{|wyzvxzvxywyztvwtvv{zvmy{iuwlxziuwsu}gjotw|gklrvwooonnnooopppnnnnnnlkmkjlmlnnmokjlhgkkjnhgkjjnmlpjlmkopgklcghaefaeffegbacfeg`_autva^`ebdgdfhdffdf```^^^```aaa______dbbdbbfddeccdbbdacb^`c`bb_ab_aa^`b_ac`bc`bb_abbddfgeghegheghegh`ef`efchifklfklbdehgijikjhjlkmlkmhjkjlmprslnpjlm`mkerpitrjrqouttvwvuwprsqstrvwoturtuqstvxyxz{z|}suvvxywyzvxyxz{~|~~}|~}z{~}xyгͶ÷̧gskl^Uqbztu{yy{}~}|~}xz|~{xz|~}{xz{xz{xz~{}|~~{}{xz{xz~}}z|wtvzxzzwy{xzxvxvtvzuwytvqlntoqrmofoyajtgpygpzgpylu}_gnlrwv}otuuyzotwtw{uvzxw{yx|wx|wx|{|~uvzrswtuyvw{xy}tuy|}|{~~|z~xw{}|}|}|yx|~~}|{||~|~}}|~}}~|}~}|~}|}}}qqqnq|gbst{r}S[dhvxȦȒ}}|}~}~~~y{x{kmudglcfjw{|w{|xz|wyzvxytvwsuvmootxykpqgnqirvlxzkwykwymy{htvqs{nqvnqvfjkptupppnnnooopppooonnnonpnmonmonmolkmihljimgfjihlmlpjlmimnhlmdhiaefcghgfhbaca`bhgijikmjlkhj`]_hfhgdfdddfffaaa___bbb```dbbdbbb``fddljjb^`a^`c`bb_ab_a`]_^[]a^`b_ab`bdbdcefdfgegheghegh`ef`efchiejkdijeghjhjihjjiklkmjikjlmlnooqroqrkmnbpnhsqhsqsxxmsrqstvtvuwxprsrvvnstsuvqstuwxwyztvwqstsuvuwxvxyxz{~~~}|~~|puvz}z}ŽȸľʴțtocO_f{vwz{}}|zz~|||~~{}wtv}xz{vx}xz|~~y{~xz|~z|~y{vqs~{xz{xz{xz|z|~{}|xz~~~{}~{}|y{~|y{|~}z|zwy|y{{xz|y{xuwvrtzuwytvytv{vx}xz`ivXannwnwluV`is~entyrw{puxqvysvzvw{yx|uvzuvzrswz|uvzwx|{|z{tuyzy}wvz~}|{{z~yx|~}|{}|}|~}}|yx|~~}|{{z~~~}~|}~|{}}}}}sx^\UV\_SZZ_movuѽʽÙ{|}~{{y{{~y}~z~z|}xzzvxytvwvxywyyuwwquvpuvxt}lxzmy{\hjeqshtvrt|mpuorww{|ptvsssqqqsssppppppoooonpnmoihjlkmmlnmlpihlkjnjimjimhjkaeffjkcghaeffjklkmfdfhgijikjikhegolnc`bifhhegfffkkkaaa``````cccfddfddcaafddgee`]_`]_c`ba^``]_a^`]Z\b_aa^`c`bdcecefdfgegheghdfgchichiejkejkglmgijjikmlnjiklkmjikiklmopkmnoqroqrcnlcomckjbihlqppqrtsusuvprsquvmrstvwqstqsty{|y{|prssuvuwxrtutvw~~}{}~|~~}~y|̵ʸÞϖlgt{{qYPn~lkk|wxvttxvv~||}}~||~~}z|}{}~~{}|~~{}~{}|z|~{}|~}z||~~{}}z|}|~~}z||y{}z|xuwtqszuwytvvqssnpqlnbn|bm{lxhszr}s|v~ovzpuxuw|wz~vw{vw{vw{vw{wx|uvzuvzyz~vw{wx|yz~yz~yx|zy}}|}|}|~}|{zy}~}~{z~|{~}|~|~~~~vvv}}~~|zz~~xvvv{gp}Y\^c[`SX`fksWZvϾɶ·srt~~rswww}vxwz|~wzy|x|}x|}vxyz|~~wyywyytxyw|}lxzp|~yr~lxztv~orwruzostostmmmooossszzzjjjbbbnmolkmjikjiklkmlkojimkjnkjnnmqdfg_cdbfg^bcaefptuhgihgilkmpoq_^`fceifhgdfgdfgdfddddddcccdddaaaaaaecccaab``][[jhhc`bb^`c`bkhja^`b_a`]_a^`a^`b_acbdacdacdacdfhioqrbghchidijglm]bcXZ[tsurqsnmokjljikjllhjksuvrtunpqeqohpoionkposxwutv}|~oqrkmnquvnstuwxoqrrturtusuvvxyprskmntvw{}~}|~{z|z|}xz{}{|}չ軽ǻˀo|gwTi^tQmBdNg|}|zz~||~||}zwy|~~{}|y{|y{}z|~{}~{}~{}~{}|~~{}|~|~|~~{}}z||y{yvxzwywrtrmonikojlpkmbr~^my\lx`o|WgsRaj[jsmzuq|r}qx{pwzsx{svzvy}vx|vx|vx|xy}vx|wx|yz~xy}yz~xy}xx|~}|z~}|}||{|{|{~}}|~|~~}~~~~}~|{|{~~~}{{os{s|^dVb\dZa[en{ep|}wx|zzwyx{uw}wz~w{|uyzprsgijacdhjkiklgiilnnquvotu_fi\einz|frtXdfZfhhtvrt|prxruzostostrrrppprrrwwwlllhhhihjihjkjlihjonplkojimkjnnmqfeijlmcghbfg_cdaefjnohfhhfhgfhlkmonpfceifhhdfhdfhdfdddeeecccccc```bbbeccdbbhff`^^eccdacdacdackhjc`bb`ba^`b_aa^`b_adbdeghfhifhidffnpqbfhbhhdhjino]bc]_`rprsrtnmocbdkjllnnkmnmopmopnpqjrqjonntsnsrtvvmlnxwyvxysuvquvrwxprsmopsuvy{|vxyqstprsprsrtuprs}|~{z|{}~|~|ƜȴγĔtzufrsxhrdru|zz~~}{{|~~~~{}|~~}z||~}|z|~{}~{}~{}~{}~{}~{}~{}~~}z|}z||y{|xzxuwxuwytvytv{}xsuex`s{bu}dwi|uq|sr~cnrox{pwzosvpvyz}xx|xx|xx|xz~yz~wx|uvzvw{uvzvw{wx|zy}}||{|{|{~}~}|~~}|~~~~~~~}|~|yyy}}}||||zz~||yfp}T\|Vi^m^jcrlo\nwx|yz~}~srtyz~uu{tv~vydfn|vy}w{|txysuv|~~swxuz{krut}o{}gsuo{}_kmeqsjltgjodglostosttttpppttttttjjjiiionponpnnpmlnonplkojimkjnmlp`_clnocghbfgbffbffdhiffhffhdcelkmfegfcefdfheghfhhfhdddeeeccc``````bbbfdddbbljjb``a__dacebdc`bebdb_ac`bb^`c`bb_ac`bdcecefdfgfhibdemopafgbghbhhbghinodffonponplkmjikihjmopkmnnpqmopprsjrqagfrwvoppprrqprutvsuvprsostuz{prsrtuqstxz{uwxtvwvxywyzwyzz|}{z|{z||~~z|}x|}}~|~ⱸ̮zosywmomsrtzxx~|||~~}{}}z|~|~}~~z|~|~~{}~{}~{}~{}~{}~{}|~|~}z||xzzxz{xzxtvxtv|wyytvsnpuprytvYlsh{Ylsbt{lhydu}l{uo{p{t}r|ovyrvzruywy}xy}wy}yz~y{~yz~tvzxx|vw{z{}~xw{vuy~}~}~}|{|{~}|{~}}|~}~}~}~~~}{|~}|~~~}}}}wwwvVbVo^r]m^q]ypmȲ|}~lkmstyvx{~wztw|z}uyzvz{rturttuwxvxyuwwvxxsxypuvrx|xny|q}aknS_ahsvtv}wzx{ostoststupppyxxqqqkkkpppqprnmomlnonpfeglkojimkjnposcbfiklbfgcfgcghcfgadegegfeghfhgfhigifceebdhegifhifhddddddbba______cccfdddbbmkjcaa`^^a^`ebd_\^`]_dacdacb_ac`bc`bc`bfdfefgfhicdfdfgklm`efafgbghejkbghiklkjlihjihjlkmpoqmopkmnnopijkmopkqpkqplqpoqquuurqsrqsrtusuvptuptulnosuvtvxvxywyztvwuwxuwxvxyvxzzy{{z||~z|}}|ͷѻˈsuxzpszzpsmshk~~}wrs}~~|~}~}|~~{}|~~{}~{}~{}~{}~{}~{}}z|}z|{xzzwyyvxzwywtvwtvz|{vxxsuxsuwrtjv~grz_jrht|it|ar|bthvgs~muwv{x|rvsx}vzvzvy~vzw{~w|y|~|{z~{z~{z~}|~}|}|}|~}}|~}|~~}~}~y{|}wyyuww~~zww~{{}}}}{XvNu/Ul+SnJxgcrѸŸ÷Ü|{}|{}yx{xy|x|~|z~quvx|}z|}uwxrtuxz{|~~xz{rtuwyzwz{fijkoplttnwvqyynwwmuupquxx|wx|qrvqrvrturtunpqoqrkmnlnonmonmonmonmoonpijnghljkoefjdeighicdefdfffhgfhgfhkfhjfhkfhjfhkfhhegheghegjgiheg`^akjlmkn`_abac\[]c`ba^`fceb_bc`bb_a`]_c`bdbdc`bc`bc`bb`b`]_ebdc`bgdfgegdacljlgdfbfgaefbfgbfgdhihhjlkmjikjiklkmmnojoplpqnstnrsptumnnmnnpqqllluuuqssuxxprroqquwwuwwvxwrttnporttoqqrttqsssuusuuvxx|||||||||~~{zz~{}~wyyilmȿȢީݬ‚dwr~qwixhpap\qrx{yy}~~}xz|~|~|~}|~|~~y{{}}}|~}z|}}vsu|y{xuw~{}zwyyvxxuw}zwyrprurt_jrfpxp{grzp{m{m}rspxqyuyswswptrvuy~z~ux}x|w{t|x}y||}xy}zy}}|~|{zy}~}|{|{}|}||{~~~}~~~~wvzxvz|{y{|{}~~|{}~||~~~Ood]YgtNlϯ~}~~}~}|{}}w{|{rvwswx{}~vxy{}~uwx|~y{||~y{|wyzuwxuyznvvmuupxxmuumuurswvw{stxstxstxrturtuoqroqrkmnkmnnmonmonmonmonmoklpghlghlfgkdeicbdhgiihjgfhgfhgfhifhifhifhifhifhhfhhfhhfhifhhega`b`_a]\^]\^\[]gfhc`bc`bb_aYVXa^``^``]_a^`fceb_a`]_a^`dac`\^b_ad`bgdfhegnkmgdfkhjeijcgheijdhicghgfhihjhgifeghgigijhlngklgklfjkhlmnnnnnnqqqnnnsssoqqtvvqssnppprrprrrttuwwy{{z||vxxsuurtttvvvxxxzz{{{{{{{{{|||{{{~~~~xz{}wyz|~y{|ʼغϴƻιхm\pet]wXiPg[yzxx{xz~~{|~}|~~}|y{|~|~}xzz|}|y{|y{spr|y{{xzwtvwtv{xzzwyyvx{xzvsu{xzqnpvsuroqanv`muZgobpxp}xjvgo}ltqyqwsynu}x~|v|v|sy~sz}v}{z|z{{|yx||{zy}|{zy}~}}|{z~}|}|}|~~}~~{z~~~~~srv~~yhYTRRL]wͳ~~zxxutxutxvuywvx~}{z|yxzz|}|w{|uyz~xz{xz{tvwtvvy{|prsqstswxpxxmuupxxmuumuuuvzwx|tuystxstxrturtuoqrlnojlmoqrnmonmonmonmonmomnrjkojkoijnhhlcbdhgiihjgfhgfhgfhifhifhifhifhifhjfhjfhjfhheggdf`_a`_a_^`bacbac`_ac`bc`bfceZWYdac_\^b_ab_a_\^a^`a^`c`bebd_\^olnc`bgdfhegkhjlikkhjdhicgheijfjlaefgfhgfhjhjfeggfheghfjlfjkimnhlmjnonnnnnnqqqqqqjjjjllprrprrprrprrrttqssuwwjllmooprrtvvrtttvvwyy{}}{{{{{{{{{zzz|||~~~}|~|}װү~}gVsGqQrXu|{}zxx~~}xuw}|~~{|~~~~}z|~|~|~~}{}~~{}~{}{xzxuw{xz~{}xuwvsuurtxuwroqwtvroqcqy_ltbpxgt|erzUam]gten{mvoxpxsysxpvzx}}|ysy~ouzvzy~ztw{~}~}onr~~||}|}|{z~}|~~~~~|{}}{{|zz{ӃPD{PGIAnƱĵpnn~zyrquvvx|{}|~vz{}x|}fjkptuwyzoqrgij~oqrrtuuwxoqruwxsuvvz{owwpxxpxxmuumuunosstxrswqrvpquqstsuvprslnpfhifhinmonmoonponpnmohimghlijnlmqlmqihjdceedfgfhgfhgfhgfhgfhgfhgfhgfhjgijgijgiheggdfdcehgibac_^`a`bb`bc`bebdheg^[]c`ba^`ebdc`ba^``]__\^_\^_\^c`bfceTQSfceheggdfdacebdgkleijgklimn`dehhjgfhjikjikihjhjjeijhlnimnhlmjnonnnnnnqqqpppjjjjllsuusuujllmoorttrttsuuoqqlnnnppuwwsuuuwwrttvxx}}}~~~~~~yyy||||||~{|𴼿תʢtvtyvxΈl}{{~||~}{}{}{}|~vsuzwy~{}}z|}z|~|~|~{}~{xzzxzxuwxuw{xz|~}z|{xzzwyxuwyvxurtxuwxuwpmosprvgqydowmwr}pxrz{ktnwqzt}r{`jsenxr|jswwypy}ltwnwzry|rwzux|~{z~wvz|{~|~}}||{{z~|{zy}~~~|~~{}~|{}~~~~||}{{z|]QUFHd«ʬý‹kjnnmqwvzihjqpr|{}vuww{|}w{|}{|~xz{tvwz|}y{|{}~vxyx|}wnvvlttkssrswvw{klprswwx|rtufhi`bclnofhiiklmlnmlncbdihjihjefjabf`aeXY]YZ^gfhgfhgfhgfhgfhgfhgfhgfhgfhgfhgfhifhifhifhgdfebdcbdhgidcegfhcbdbacb`bdacebdc`bdacb_aa^`hegb_ac`bb_aebdc`bgdffbddachegifhjgihegkhjeijjnofjkSWXfjkhgihgisrtlkmmlniklhlmjnolpqfjkmqrlllssspppooouuurttvxxz||wyylnnuwwqssuwwprrvxxtvvnpp|~~~~~|||{{{~~~z|}xz{~αϢݑnbhd]_qa~~~utv~}zxx}z|}}}{}~{}~}~{}~|~|~z|}|y{|y{|y{|y{zwyzwyyvxxuwxuwvsutqsvsuxuw_fphnwkr{ou~kr{jn|ntyjrclygp}oxs|js}mvzxmvzktxvdqsertvmtwv{~orv|{}|zy}xw{zy}|{}|{z~|{~}|~}~}~~~~~}{}~}{}~zy}|{}zy{~~z{oTmi]gOb^Z|ͺľ{yy{yy{z~mlp|{z|}ptu}vz{mqrtxyoqreghprshjknpqqstrtuoqrrtuuwxmqrZbbowwnvvnvvnvvrswstxuvzrswjkooqry{|mopmopoqrnnpnnpcbdutvkjlnoshimfgkmnrhimgfhgfhgfhgfhgfhgfheghegheghegheghifhifhifhgdffcea`bdcebacbac`_acbdb_a`]_ebdc`bdaca^`a^`ifhfcegdfhegebdfcehfhhdfebdhegifhkhjjgilikhlmimneij]abeijfegihjedfkjlmlniklhlmjnojnogklmqrlllqqqpppooouuukmmnppqssuwwuwwsuuvxxrttuwwtvvrttoqqhjjmoooqqxxxzzz{{{~~~{{{~~~|~xz{õĶɒԎsecTS`_i~}|}|~}~{}}|y{~}|~~z|zuw{}}z||~~~{}yvxyvx{xzyvxzxzzvxxvxxuwvsutqssprroqdeoopzrs}pq|opzhiwlo}w}owlur~vgr|lvzt}t}kruquxrvzxw{|{~}{z~xw{|{}|{z~|{~}|xw{~~~~}|~~z|}~{z~|{}|{}}{{}}}}}}~|||jwL^sEi`\peNwf{˱Ĺ}|{z~mlnkjlhgkfeimlpihjnmovtvyxzy}~}vz{ostostvxy}vxytvwmopsuvrtunpqrtuwyzptupxxnvvlttlttmuustxpquwx|uvzpqujlmprtnpqlnphjksuvnnpnnpnmolkmsrtrswhimcdhdeiefjgfhgfhgfhgfhgfhgfheghegheghegheghifhifhifhheggdfa`bbaca`ba`b`_ab`bb_aa^`ebdc`bdaca^`a^`hegdacebd_\^_\^ebdjgiifhebdifhjgikhjlikjgidhicghaef[_`cgha`bgfhbacjjlmlnkmnhlmjnokoplpqquvppprrrtttooouuurttrttrttkmmprrsuuwyytvvtvvvxxsuuwyyz||tvvz||zzz|||yyyzxx~|εʰؓ؀qn^WW\Vl}{{~|||}|~|~~y{}}z||~~{}}~y{~|wy|wyz|}z|}z|~{}{xz|y{xuw{xzzwy{xzzwyzvxxuwvsuxuwvsusprmkuhgqcblkjttr|tusttznwoxo{mwdoxuz|q|tvnx|q|]gjdoqxt}|z~~}~}|{}|}}|}{{z~}|{z~~}~~~}}}|~|}szanUq8]{0[{9`}7ToZwftޡ~{~|{~wvx}}lpq}}vxy{~~vxyz||y{|wy{wyzuwxrtvw{|u}}pxxt||rzzpxxxy}tuyvwztvxtvxnqrorslnoknoorsklmnlnnlnkjlpoqhgifgjdeiefifhlfhkgfhgfhfeggfhfehgfhcghcghcghcghcghifhifhifhhfhgdfdcebaccbdecfa`b`_aeadfbeebdc`bdacebd`]_ebdebdgdfhegifhebdhfhhegdacgdfkhjifhkhjgdfbfgbfgdhiquvlpqhikhgibacjhjmlnlnoilmjnojmnlqrruvqqqppprrrooovuumooqsswyyvxx{}}uwwtvvy{{uwwtvvwyxxzzwyyxzzvxxuww{{{|||}}}zzzqqq|~xpt˲ջ׬dztpq`fbVhuss~||~~|~pmo}z||}~zwy~{}}}xz|vx~{}~{}~{}{xz|y{yvx|z{|z|{yz{yzzwyxuwvsuvtvurttqsbfjgglmkpolrtpunrtmuvqxzoxyqy{s{}ul|hw|iuzv~qx{jruouxltvrx{jpsz~}zz||zz{{{|~|{yyyx|{z~~~~}}|tswxyw}~{z|}|~yyymmm|||}~|}|}z{}{{z}}qooygs`n]k]n`mnwtrwvյƜmv{y||vxy}|~wvxqpr}|~xz{rwxtyznstw|}sxycdhrsxwx|wx||}xz{uwwsuty{{qssmrqnsrsyxsyxkqpkjnihijllntrlqpfspcqofspjtrjqpionlopkmnkmnilmrtukkjhghaaaihieeehhgjjilllgggllkffffhhegfdfeegfgiiifhifhifhjgijgicbd`bc_ab^`a^`adfgffffgfdeebcbeeec`bdacfcefcefceebdgdffcehegdacfce{xzhegnkmheggdfaefaefdhidhicghnppfhhgiioqqlnnikklllkllmmmnooqqqlnnlnnlnnkmmmooqssprroqqnppnppvxx~wuxqstptunrsy~tyxxzzsssrrrwww{{{~~~y|{uvtupqʼ¹̴źΨrbxgvthWMuq~|~|~{}~|~vqs~sqqwuu~||{xz}z|~y{|~|~pmo}z|}~{}~{}|y{|y{|y{~x}~x}{uzwpv|v{{vxxsuxrtxsuxsubeimnrlkoplqplqmqrluuowwnvvmuulutZbfmz~evyhx{nz~w~mtwmtwnuxw~}{~ruyuvzvw{xx~||ppvssy||||||||{~}~}{z~}|zy}{z~~}~~{z|}|~xwy~~yxzyxz~~~{yy|zz}}}~}~~~~~yww~v}grcmbmcodnfnjkcd|ӭkswy{|cef{}~|~vxyx|}|~z~vz{z{wx|uvztuytvwxzzqssz||}~u{zuzyx~}lrqnts~}vuwprrmrpjomcpncqohusitriqpionmoplnokmnjlmnpr___dddeeegggfffiiifffbbbeeelllhhheggceebddceeeggifhifhifhheghegcbd`bc_ab`bc`bceghiiihhhdddcccccchegdacdbdfcefcedbdfceebdebdd`bdacebdjgi`]_mjljhjbfgbfgdhjdhidhioqqjlljllkmmikkhjjllllllnnnoooppplnnlnnlnnkmmnpptvvrttrttvxxwyytvvxwyvvxrtuswxotusyxtzxrttwww~~~{{{}}}}~x}|x{y˷Ȭ𡨼jvsXnRkBbEgDg^tv}~yz~yz{||{~x{z~xsu~|~~{}~~~zxx}}z|~{}}z||y{~~}z|~}ytv{}|~~y{}z|~{}~{}~{}|y{|~|~|~|~y~y~|vz}xrwztyzvxxrtz|xsuvqsgjnijnposnjominjnokoplqrlqroturvxmsxviz}dsvr|u|ovyqx{rz|qx{krujqthmpwz~xy}xx~zzvv||{|||ytz|{|{~|}|yx|zz|}|~}|~~~}~~~}poq{z|vuwwww|zz}~~~~~~cndl\f`mbmbkhnnwշhputvvtvwyxzxwyxwyvuwxxzz~txyrvwx|}swxjkoqrv{|wx|pquprsoqqsuuvxxqssjonqyxgonoxvnwvmuttswutvtvvmrpjomcpncqohusitriqpionjlmikljlljlmkmnkkkhhhffffffgggfffgggggggggqqqqqqikkikkmooikkeggifhifhifhhegjgicbd_ab\^`\^_\^_acdhhhhhhjjjhhhiiiebdfceifhfcefcedacfbddacdacc`bfbdheglikmjlebdpmocghcgheijhlmostnppmoomoomoolnnlnnnnnnnnnnnooopppnppnppnppprrrtttvvtvvrttrtttvvnppsrtwvxtvwswxinoqwvuzyrttlll{{{~~~||||||{}}{~|ztuķȶʦzs}oyjwgujyYlbqdh~{|}z|ljj~{}}~{}}~xuw~|wy{vx~}z|}~z|urt~{}~{}}~{}{xz|y{|y{z~z~|v{||v{ztzztvwrtzuwxsuytv`cgijnjimkglmingklfklglmjopkpqkpqlqvtl{~p~p{qx{u|v}w~v}xv}x~orvqtxtw|wzruzx{qty|z}{}|}|}z{z{wx|uvz|{~}}|}|{z~}|~}~}|{}{z|~~~}{z|tsuxwyyyy{{{}}~||{yyywwsqqtrr`^^usstrr}}{|}xy{|~~ppp{[fz]fep^o[k^kSeWkͬz~}|~~|{w{||{}yxzwyz{}~xz{xz{wx|pquuvz|}tuyrtuvxxsuunpptvvqvuu|{iqpnutmutnvuwvzutvprrntrlrpfsqcqoerpitriqpionkmnjlmgijjlmiklfffggghhhhhhdddffffffggggggiiicccacc_aabddceedffifhifhifha^`ebdcbd_abZ\]^`a^`acefhhhlllXXXrrrdddifhgdfhegfcefcec`bebddacebdfbdhegifhfcehegifh`]_cghdhidhjhlmquvkmmlnnlnnmoomoonppnnnnnnooooooooonppnppnppprrsuusuusuurtttvvuwwtvvtsuxwyqsttxynstu{zx}|y{{zzz|||}}}~~~{}}|ehfsmnǹ͹ʖqv}{~uxorltjqkrdc~|}~}z|}|~|~~y{{yyvtturt~}z|~{xzyvxzwy|wy~y{}xzvqsz|}~{}zwy}z||~~{}{xz|y{zz|v{{|v{ytvvqsytvzuwrmodgkefjjimminmineghmqrhlmimnimnimnvzlvz`mpnz~ktx~rz|u|w~{{}z}vx}rv{}sw|z~x}}{|y}{xu{~z{}~|}~~~}~~~~~}~}|{}{z|~~vtvsrtutvwvxyxzwvx|||yyyooolllzxx~~~~}}z{top|zz}{{~~myXh^rH`GaXqLk⟶Ǧ~|y{|v|}~}fhisrt^^`srtxwy{z|y|}uwxy|}z|}z|}}~qrvz{xz{vxx}wyyy{{w|{q|znywr}{nzxp|zyx|xwyvxxpusotrfsqftrerphsqjrqionlnolnohjljllkmnjjjgggkkkhhhiiikkkjjjgggeeeaaacccgiiikkgiidffdffifhifhifhifhgdfbac_abacd^`a^`aacdmmm{{{ooolikjgiebdfcefcegdfgdfgdffcegdfhegkhjmjlkhjjgidhi]abw{|dhidhijlllnnkmmjllmoonppllloooppppppppplnnmoonppprrqssrttqssprrqssvxxqssvuwwvxvxyw{|tyzw}|v{zwyy}}}|||||||||{{{|||{|ýάor}|{yysqhrhqhoffyv~~||xvv~~}zwyz|z|~{}~|~}zwy|~~{}{xz{xz~{}|~yvxztyysx~}w|ztyvpuxsuxrtwrtuprqlnfimefjgfjnjoqmrpoqrtunpqkmnlnolnoruzr{{lsvipshorjqtqx{r{~p|~py|ry|sx{rwzptysw|sv{tx}uy~yyvv|xx~xx~ppvuw{svzvy}ux|ruyvx||{yx|wvzxw{yx|onr{z||||z{y{|z|||~}|{}rqs}|~}|~~~}~}z{z{|xx~~|{]yEfFlJr]vρԺđŝ{z|~{}~wvxyxzsrtyxz{z|utv{y{{z|{z|vw{vw{uvzyz~{}~wyyuwwvxx{}}sxwmxvnxvq|zp{yq|zzy}vuwrttotrotrfsqftrerphsqjrqionlnolnojlmiklgijjjjgggkkkjjjfffdddgggjjjiiiddddddhjjikkfhhceebddifhifhifhifhgdfcbd^`a\^_^`a^`aacdiiimmm```kkkmmmnkmkhjebdgdfgdfgdfgdfgdfb_aebdhegjfhkhjifhhegxuwdhhdhiimndhifjkjllkmmjllmoonpplnngggnnnpppppppppmooprrrttnppuwwsuurttrtttvvsuuuwwwvxvuwwyzquvpuvtzyw|{}zzz~~~|||{{{zzz}}}{}}{}}{|wtv~~~Ⱥκnoqq{xyxtqcogqjpY]x~~~||}}urt}|~|~{xz~|~}z|~yvx}}z|~|z||xzyvx~x~|vzz|v{|v{zty{vxzuwwrtytv|wyadhhimlkohdikglihjfhifhihjkikljlmehmdmqFRVP[_bhmahkcjmelognqmtwgpscoqQZ]]dgkorrwzrx~u{u{pw|sy~ww}utzttzxx~uu{tw{svzux|wz~y|{~|{}|}|zz|}}}~}}~|||||{}|{}}|~{z|~~~~}}}xstz{XQ~qei\ņֆywwz|}{jrr|oxx|~qpr{z|utvutvzy{{z|}|~z{zz~xx|tuyuvzvxywyywyy}{}}putivtkxvgtrhusgtrutxrqsmoootrotrfsqftrerphsqjrqionlnolnokmniklikljjjgggkkkgggaaajjjiiihhhggggggjllikkhjjdffbddifhifhifhifhgdfedf^`a[]^^`a^`aacdjjjkkkqqqrrrpppwtvtqspmogdfgdfgdfgdfgdfdacfbdfcehdfjhjmjlolnxuwbfhfjkcghdhifjkikkjllikkkmmlnnjllhhhlllmmmnnnpppnppqssrttnpplnnqssrttrttsuuuww}}txyotu~xxx{}}~~|y~}y~}~}upqξϺtrrszyuvnngplplmgd~|zz|y{~{}~{xz~{}|~}|~~z|xuwzwy|~~{}{xz{xzxuw{xz|}w|z}w|}w|{uz{vxzuwxsuvqstoqbdhghlgfklgmlglihjeghlnojlmmopoqrnqvdkpiswp|msxovyqx{|w~x{r~wyzzv|tz|rx}v|x|{~z~wz}|zv{~v{~{}|{~}~}~}~{z|}|~|z|~}|~xwy}|~~}~~~xvv~~{|}vvv}|yKzM[_R^ysƶ{nqqz}ovwu{|vvxmlnhgitsurpr{|}yy{zz|~~pquww|tuyuwxxzzvxxtvvtvvqvulywlywkwunzxlywwuyvtvtvvqwumrpfsqftrfrpisqkrqionlnolnokmnkmnmopijjgggkkkfff_``llkkkkkkknon}}}nnnjllhjjkmleggceeifhifhjfhifhgdfedf`bc^ab^`a^`aacdhhhmmlkkkjjjdddc`bdaca^`dacdacgdfgdfgdfhegfcefbdfcejgijgiebd]Z\aefdghgklehifjkhjjjlljkkehgjlkkllrrrpppsssuuuqssoqqnooqssjllmoooqqqsssuusuulooZY[gfgkmnnrsnrsjpoZ]]^aannnsssppputu{zzihhjiinnnuwwjllrttvxxz||{}}~Ӯұŭ}zusrqqtornqpmoje]x~wz|~}}~mjl~zwy}}|~}|~~|~~y{yvx{xz~}~~|}}|}w|{z}w|yrwxtuxstzuvxsuwrtkjllkmjjkkkljjklkmljmmlnqprpnqmopruyflolsvox{hqtjvxq|jvxkvxmy{r~p|~ny}itz_gpajqmrxsy~tzu{qw|{~~y|wy}{~tz}t{~t|u}v~y|~~}{~~}|~}|~}|~|{}utv~}}}}~}RJZVP\rVyȥ}zyy}~~~z|}}y{}eijx|}vz{vxxuwwoqqxzz|~~z||{~}wzywzypsstuyvw{ops}z{~pssosrpssx{z{~~vzylnnprrmoomoomoopnnkhhjhhnlltrrljmhgigfhhfiedfihjlnooqrsuvqstlnofffhhhdddffffffa`bbacb`c`_aa`bbacdcedcejik\[]`_bc`bc`bd`bdacebdhegebdb_aebdifhdacgdfgdfifhifhifhhijjikijkjikggikikkiklikjhjlikljljjjpppoooooonnnmrqntsputkpomsrrttkmmlnnvxxikkommzyxuutuxvsxwwwwzzzssswwwtttwzxx{ynqo{|x{y~~ȶĵȺwvvuopstmpfgghlj~~yz}~~z|{}~~|~~y{~|~|~oin}}z~}z|y~zw|xtyysxvpuvpuwqvvpuedfhgionpnmolkmkjllkmmlnqprlkmoqrqtxhmpmtwovyjsvivwnz|p}uyp{|mvz_hl}x~~zztz}ovy|}~{|{~tswyxz}|~}|~~}|~|~|~~}~|~srtzy{w}{~|~||}{{~~yYQ\TRcv~yzxxxtxywyz~xwypxx|vz{w{|ptuquvuww{}}wyyqssuwwvxxqsstvvsuu`bbhjjdeighlefj[\`]^bfhihjjceeQSSRTTXZZdffceeacc^``[]]caaljjeccUSSfddlkmhhjhgigfhjikhgifhicefXZ[bdelnogggeeehhhfffccccbda`b_^`a`bbacbbd`_a`_aihj`_abbdfcefcefcedacebdgdfheghegfcehegfbdgdfgdfhfhhfhhfhdceedffeghgihgilhjlikljlljlnjlolnnnnqqqoooppptttmrqnsrotsnsrotssuuoqqprrwyyrttnnnsqp{yxwxvz}{}|||xxxzzzxxxxxxwzxtwux{yxzzغò̼uuorpostnqffikji|~z||~{}z||}|zv{yuzwsx|x}wqvwqvvpuwqvvpugfhihjonpmlnjikkjlonpnmopoqkjlpprpswlosinqt{~hqtmvyr{~u}zforzws|mt|gnw|p{x}xoy}t~t~t~hrvxqz~t{y|yz~}|~~}|~}~}zy}~}~wvx}|~}{yy}}MvZhlik\MgËw|}}vtv~}vw{~nvvpvupppx|}ostptt|y}~wyytvvikkjllkmmnpptvvtvvuwwtvv~tuyqrvnosxy}tuykmnnppikkqssrttnppoqqkmmjllkmmlnnrppqooqoomkknllmlnihjhhjhgikjlihjfhifhiNPQY[\egheeebbbeeeeeeddddcebac`_ab`bbbddbdbac\[]ffh`_addfdacdacdacdacebdfcehegjgiheghdfheggdfgdfhdfhdfhdffeghgihgihgihgijhjliknjlnkmolnolnpppppplllsssuuuotsputqvumrqmrqrttqssrttuwwqssxxxzxwzxwtuswzxw|zvvvtttzzzzzz{{{x{yrusy|z}~}~{}}}̷Űz{pqqsuvoriijlkj}~{vw|~}{xz~{}~{}zuw|~}xz~}~{w|~z|x}~z}y~~{{y~ysx^]_jikrqsrqsnmojikonplkmnmomlnlkmqrvmptiorty|lsvktwqz}luxluxw}u~wt{it{qo~yyyxlx{{uumx{t}wzqz~zz~}|}{|~~|{~}~tsu|{}|~z|}{}~{}~yxz~~}{{~||HgIlnUEmLmVqwŌ~}zxxb``sqqsqq}{xzurt~feg|~~rttx}~xz{yxzpquzoutzzzz~mqrw{|uyzuyzvxxsuuuwwvxxrttsuutvvrttprrkmmjllqrvqrvqrvlmqnosoqrnppoqqjllhjjprrprrnpplnnjllhjjnllpnnpnnmkkommnmojikihjjhjihjmlndfgeghfhigijdfgjjjhhhaaaeeehhhdbddcedcebaccbddcehgigfhedfbacfegfdfgdfgdfdacebdgdfgdfhdfheggdfifhgdfgdfgdfgdfgdfedffeghgifeghgijgiliknkmolnpmoqnpooommmhhhwwwpppjonlqplqpputntroqqqssrttsuuvxxyyyvts~|{yzxwzxrwuxxx~~~yyy{{{|}|~~z{尶ٹͺzy|~suuvsvornngied~~~~|y{{xzyvx{vx}xzzuw|wyxsuxsuwrtz|~y{toqkfhlgiidfqlnkfhmhj_Y^oinoinoinrlqrnslhmlhmqmrrnsqmre_dc]bgafjdijdhhgilkmnmolkmmlnllnzy{~}mlnnmoonpnptqrvsuzsx{mrupwzt{~ouxpwzipspwzpvyntyu{sxmu|qv|z|{|}w{zt~v~{|ptx}~~}}|~}|~yxz{}~{}~|~zy{|{}~~~~}}}}{~ShTlMjNkTmVk`qhr܀xvv{yyrpp|{{|vw~~||{}}}|~edfvw{|~vz{vz{x|}txytxyxzzsuuuwwuwwrttwyywyyxzzvxxsuuuwwrswrswtuyhimfgkprsprrprrkmmoqqoqqprrlnnnpplnnkmmommommommnllnllgfhjikonpkjljikihjeghfhihjkdffhjkkkkggglllhhhhhhbaccbda`bedfedfedfa`ba`bbacedfgfhhegdacb_adacebdfcefcefcegdfgdfgdfifhifhhegheghegihjhfhfegffhhgikhjlikmjlnkmnkmmjlooonnnlllssstttputfkjotssxwputoqqoqqoqqqssnppgggxvuz{yvzxw|zyyyxxxwwwwwwuxvuxvz}{~ĵð{{tswxsvpunqnnln^]wvpqyz~z{~yz~yz~yz{xz|y{~{}wtv}vsuqnpsprmjlc`bhegliknlna^`ifhqnpurtwtv|y{vsutqsroqzwy}z|wtvpmojgiqnpvsu~{}~{}{vxvqsz|~y{zuwvqsxsuxsu{vxxsu}xzz|upr|~z||y~|v{vrw|x}zv{wsxvrwxtyysxztyy~{uz~hgihgijikjikkjlmlnpoqlkmmlnnmoonpqptqquqtxtvzouxovznuxovzpwzu|v}zu{pvryxxny}q|ny}my~q}uiu{vy|vv|{y~tv{y|y|{~~}~}|~}~~~}{{}}}}~||~~{yy}{{~~vtWc`n`obpcokrmsnnЇwrs~~zxx~~z||y~xz{suvyxzuvznsvxw{|z~x|}txytxxtvvuwwuwwsuuvxxsuuwyyxzzz||rttqssrswrswuvzxy}vw{rtvqssoqqoqqnppmoonppkmmjlljlljllommommommnllommhgijjlmlnkjljikihjfhhgijhjjfhhhjkhhhdddfffffffffhgifegedfcbdcbdcbdbacbacdcefdfgfh`]_c`bebddbdfcefdffdffdfgdfgdfgdfifhifhgdfgdfgdffeghgijikffhffhlhjljlnjlnjlnkmnkmkkknnntttooonnnmrqinmrwvqvumrqmoolnnkmmmoowyy|||}|uvttxvw|z|||||||||xxxwwwvywz|zqtrбóδwvstoqntptnqnnikZYs}~sno}xyzuvwrs{vxrlnvqs~y{{vw~yzytuytuytunijzuv~dacyvx~{}|~}~~{}~~|~~y{zuw{}vpuysx|{}}y~{w|xtywsxztytnsuotysxrlqgfhhgihgijikkjlkjllkmonpmlnnmoonpposqptstxrvzsvzqvynsvrwznsvv{~rwzsx{sv{ps{rs~y}{u~z|t}zu~qzr}s~txz{xyv{~x}{~tvzwz~}x{z}|~}|~}~~}~}{{|zz|zz{yy}{{}{{~||}{{omm}}}{{{yy|zz~vv|ywxsaddjbjfkgilkpnpl}yz~wyy||{rvwuyzswxrvwptuqssrttprrxzzprruwwtvvxzzsuurttvxxstxstxuvztuyqrvtvwrttoqqqssprrnpplnnkmmjlljlljllommommommnllommjikkjllkmkjljikihjfhjhjjhjkhjjgijjjjhhhhhhffffffjikedfdcedcefeggfhedfedffdfffhgfhgdffcedacfbdfdfhdfhdfhdfgdfgdfgdfjgijgigdfgdfgdfdcegfhihjgfhedfljlmjlnkmmjllhjnkmkkkooouuupppsssw|{rwvsxwmrqjonoqqrttvxxsuusuuvvv|zy{yxtussvtv{yyyyyyyyyyx{y~}~rusưǭ͎ontsnpmrltpsssnpYXrˊ{|}xy~|vv}~{|~{|{xz}}z|~~~}{}z|~~xrw}w|~|x||x}xtyxtyztyysxysxuotxrwfegjhkmkmlkmmlnmlnkjlqprmlnnmoonprmsqptrswruyux|qvyrwzqvyty|sx{osvzx|rv|tvru~w|v|z|x~|||r~txz~qx{wy}mru|y~w|~}{~~~}|~{{}}~}{{yxx|zzxvvvtt|zz|zzvttzxxxvv~||}}~||rpp|zznll{yyxvv|zz~~~~vtt}}}}{yy~~zxx}~zzzwzscbbdhlfikipktlqjtuq{|}~}|{}}~~~^`akjlqqsz|w{|w{|z~svwnstqttvwwvxxtvvrtttvvw{zrttptswyysuxstxuxzqrvy{~qstrttsuuqssqssqssnppnppklllnnmooommommommnllommkjlkillkmkjljikihjgijhjkikliklfhjiiiiiifffhhhhhhigj``ba_b`abdcegegfegfdfgfhgfhgfhgdffcefcefcegdfheghegheggdfgdfgdfkhjkhjjgijgijfhjikkjlkjlnnpjikmjlnkmolnmjljginkmppprrrrrrpppppp`edlpptyxpssotsrttsuuuwwqssrttvwwwvuxwuxywuxuuzxyzzyyyyyyrrrwwwz}{y|zlomؿhfxwquoslslotupq^]w{x}wty|}|~~~{xz~}{xz}}|~|~|~~|~}xzojl|wy}xzsmrysxztyzty~x}{|x}{w|yuzwsxyuzysxxrxxrwuotvoudfghkljlmkmnloplopmoploplnolnooqropqoqrrtutvwvxxsuyrswtvzxx|uvzxx|z|}~tvzvv{qswtw|w{z|r|otysv}nsw}ty~oy~y{yxw|x{xz}}~~{z~|z~~~}tqs}|y{vsuyyy||{~hcd~upqztu{|{vwytu}{{yww}{{}{{}}~||}}}}}}~~~~}}ej[_dhejbidfikb`}nll}~~vux}}v{|y|}~{}~||~yxzyy{}|~zz||xyzvwyww{{{oqqjnmnsrpvurxwrxwqwvovtqvvqwvrwwntssuvtvwrtuqstprsoqrhnmjpojonjonjonnnnllljjjkkkmmmhiiprrfhhgiiikkgjjikklnnjllhjjgiihhhhhhiiijjjjjjegg^cb[_^^cb^bb_badcefeghgifeggfhgdffceebdheghegfegfegfegedffeghhjifhifhifhjgikhjlhjliktqsokmnkmliknkmlikliklikqnpqqqrrrqqqpppoooqqrooooppqqqoppmooqssprrsuutvvtvvruuuyyswwrxwsxwyww~||||||}{{z{{~~|}ﵳਡԇtpwvoqqtnrejimtt\Yyܒ|~~~{}~}}z|~{}~{}}{}~|~|~~~x}~x}zty~x}|v{{w|yuzuqvwsxwsxyuzxsuytvvqssnpsnpeghdfghjkfhilnojlmlnoprsjlmjlmlnokmnoqrxz{suv|~xx|stxrswyz~jlptuyvw{z{z{{|vw{sv{vy~w}v|y}{s~x~}y}z~|{ux}x{ux}x|wzsv{psxmpurswpossot~zxrw{xzqnpxuwzwykhjrqsyxzxwyutvonpnnpxuwvsu}~~~~|}~{vw|wx}~}{{zxx}{{~~|ag`daebg\cVY^`kizx{|{}|z||~y}~|}{}~}|~{z||{}{z||{}~{{~xyzzz~~~{|}sxwtzyqwvmsrrxvoutqwvntsmsrlrqpvuqstqstsuvqstprsoqrglklqpjpnjonjnnnnnoooiiikkkkkkhjjprrikkhjjikkfhhfhheggfhhgiiikkjjjjjjjjjjjjjjjfhhacc_``_aaaccbddhgifegfegdceffhifhheggdfheghegfegfdfedffegdcedcejfhjfhjgijhjkhjjgihegkhjkhjjginlnqnppmoliklikqnpppprrrqqqqqqppppppoooqqqtttmootvvvxxsuurttrttsxwtyxotsputrxvzxxzxx~||}{{~~~~~xzz|~~~~yz|}{||z֬׈zuomtvuylqlpgkffge`Zѣ~}z|}{~|~|~~y{|urtyvx~{}|~|y{~{}~{}~{}z|z|~y{z||~y~}w|~x}|v{wsxyuz{w|{w|uqvtpuzuwytvvqssnpsnpbdedfgeghhjklnonpqmoplnooqrmopnpqoqrvxyqstnpqwyzvw{xy}wx|{|z|qrvyz~ux}wzlrwrx|irvux}knsfinqtysw|uzmvzjswdmqdlpfnriruclpfmpdjm_cgHPWLT[SY`wzwyptynrvlpunrwvz}}|z}}~~}yvxxuwzwyzwy}}}}}~}~~}~_ecg`dchfmkntvtr|z}}zzzzy{oqr~w{|tyz{}~}vxzvxyy{|{z|{z|xvx~|{}~||}{{|||y{{tzxrwvoutntspvuqwvqwvoutrxwsyxu{zuwxprsnpqqstprsoqrkpoputlppjonhnlnnnmmmjjjkkkkkkhjjkmmlnnikkhjjfhhceeceeeggfhhhjjjjjjjjjjjfffffffhhbeeacc_aabdddffgfhcbddbddcefegifhheggdfheghegfegedfdbdgfhdceedfjhjjhjliklhjkhjkhjkhjjhjhegifhpmoqnppmoliklikqnppppqqqnnnoooppppppoooqqqsssqqqnppsuuqsssuusuutvvsxwnsrqvurvvrvvrppuss|zzywwnllllly{{~tvvvxx|ywƈ̋bcsuqvouhonulmlhlfndʝ~x|~~~~~~{}}z}|~~z|{}~}|~~{}|y{~{}~{}~{}{}{}z|z|z|{uz}w|~x}|v{yuzwsxuqvwsxvrwwsxxsuvqsvqssnpsnpdffnpqhjkhjkfhidfgeghgijhjkeghfhiegh]_`gijprsmopjkoijndeighllmqijnfgkmnrhim]^bnospsxqtyouzmsxjswrrxontuu{ww}vv|ntyirvoy|nx|s|mvzw}vyz}osxlot~xx~~~|~zxx~~}}}]cbfbfchdkehcegeywquv{~xwyz|}x|}w|}~~z|~zy{vuwonp{z|{z|}zzzyyyzz|}}kpomrqjpooutpvujpooutpvuoutntsdjidjisuvmopoqrprsoqroqrafekpokpojonhmlmmmfffkkkkkkiiihjjaccmoojllhjjeggdffgiihjjfhhegghhhhhhhhhgggfffihhfffeeefffeddcccdcebaca`ba`bedfgdffceebdheghegfegdcea`bgfhhgijikkhjkhjmjllikjgikhjlikkhjhegjgiolnpmoolnliklikqnpooopppmmmkkklllpppoooqqqrrrwwwmoouwwxzzlnnoqqrttsxwx~|w|{txxqvu~||~||zxx{yypppuwwz||z||~vwuy}sxwuzyy|z|}|}|}vywuvr~zy{}{x~͋lpmrmunvjpkorrmkkhkdǓ~~}{{}|~zvxurtx{}tw}}~}}~{}~{}~{}~{}~y{~y{}|~|~~x}|v{{~x}|v{yuzxtyvrwxtyvrwxtyzuwwrtvqssnpsnpdfg^`afhigijjlmgijjlmjlnmopmopmopoqrqsthjkuwxvxyuvzz{}~}~z{vw{xy}xy}yz~|wzqw|qw|mvzuv|zzuv|xx~yoy~kw}zv~zmt~v{}~{vgptktxuw{y}~{~~|}zuv~~}}zypvbf_cbgdkjmiknlb`s~}}|~vuw}|~}|~tsunpqz|}z{}~|~|~zz|vuwwvx~~~|{{{}}x}|w}|v|{tzy~w}|w}|u{zv|{rxwpvutzyqwvnpqnpqmopy{|xz{rtuotsputrwvinmkpoooojjjhhhllljjjjlltvvkmmfhhjllikkdfffhheggegghjjkkkjjjhhh```ooofffdddddd[[[^^^aaadcecbddcefegihjfcefce`]_ebdhegcbdgfhihjedfedfihjkhjkhjkhjjginkm\Y[ifhlikjgijgijgikhjjgikhjlikpmommmkkkXXXvvvjjjpppppppppqqqdddfhhlnnnppmooprrqssglkinmNSRglkejiqooommommussussqqqmoojllsuulnnnpp~}x{y{~zw~نclW`]hhsgojnpvildf][̡xuxurmo|wy~y{~|~}}}{}~zwy~}}z||~~{}}z|{}{}{}~}y~z|~x}~x}zv{wsxwsxzv{yuzzv{zuwxrtuprtoqsnpbdeeghoqreghhjjgijgijnpqoqroqroqrprsuwxlnouwxuwxstxtuywx|z{vw{stx|}uvzxy}rswuvzy|~sy~tzt}}~}{~|~z~u{z|x~q}z{~yzzqyt|nt{z}ww}}~}}}}}~~|}{{flfjcgbfdkfijltr`^qxz{~y{|xz{vxyvxy}|~{z|}|~{z|vuwzzzwyypvttxwpvuv~}outntsw}|syxlrqlrqlrqw}|kqplrqwyzvxytvwtvwqstjlmjonkponsrglkinmiiiggghhhjjjlllikk\^^ikklnnkmmhjjhjjfhhfhhegggiiccchhhkkkaaagggjhha__YVVYWWfddollb`b`_a]\^^]_bacgdfjgia^`fdfhegbbddcecbdedfhgimlnlikjgidacjgiifhVSUfceebdliklikifhdachegifhkhjolnmmmpppnnnppppppppppppwwwuuu~xzzuwwsuuxzzvxxsxwotsx}|w|{~||}}~|||zzyyywyyxzzwxv~}psqz~rwvtx}{偈ozXdaljtgnadgp\b_d`ey}~ŁÇvw~~~}}~|~|~xuwroq}z||~~{}~{}|~~|~~{}}xz}xz~z|~{y~~x}}w|xtyuqvvrwsotqmrsotwrtwrtvpruprtoq^`adfhlnnjlmfhijlmjlmqstoqroqroqrnpqlnomoprtvrturswvw{{|yz~stxuvztuyuvzvw{|}tuyqtyux}pv{rx}s|~||z{y~|~|z|x|z~{}rxu~|tgx\nvfpzwpy{|vztz~{y~}|~wvx}z||~}~}}~~Z`kohlafbigjgimkdbu}}y}w|~~~{wyzy}~x}~wyz|~yxz~poqnppprrots^dcckjckj`fe_ed\ba[a`[a`W]\QWVJPOY_^`fe]_`^`a^`acefuwx^`ahmlinmjonhmlinmffffffhhhjjjlll_aaceefhhmoolnnhjjVXX[]]hjjeggfhhhhhiiiiiihhhhhheccfeeljjfdddcbcaa`_a_^`bac_^`_^`ebdlikifhgdfhegbbddcecbdfeghgikjllikjgiqnpnkmsprpmoifhkhjlikliklikhegjgiifhfcegdfnnnqqqqqqrrrnnnrrrrrrrrrsssuuurttnppprruwwwyyvxxuzynsrtyxsxwput{yy}{{}}~~zxxyyyz|||~~ytu||zwxkxboXbW^WZZa]`krrxt{ىՏqt~|}}~z||~}}z|~}z}|~|~{xz~ytv|wy{}|~z|}wyzvxyuwx|~~~}z||~|~}z|z|}xz}{}z~x}z}w|ztz|}y~}y~zv{yuz{w|ytvytvvrtvprtpracddfggijgijikljlmmopoqrnpqnpqnpqnpqoqqmopprsnpqrswrswtuyvw{rswuvzvw{uvzuvzuvzxy}y}tw|sx}tzt|}{yw}yw}{y|zvy~{w{x|tx~nu{mvz|{z|um}rfvyz{v~~|~{}}|~srtqoqxuw~{}~|~|RXptjmafahdhegkj^\p}~}{}qprwvxsrtutv_^`\\]fhibde]abW\]\^^fghUWXVXYXYZopqfdgopqkilllnrttnrqw||pwunwvt}|~ztzyryxqtuwxy}mopeghjonjpojoninmionooommmnnnkkkjjjrttnppnppjllkmmhjjbddikkhjjeggeggfffggfgggcccffffddfabhcd\VWc^_geea`b``b]]_^^`ddfebeb_ab`bifhgegdcegfhhgigfhfeggfhifhmjlifhmjlnkmebdgdfifhnkmnkmqnppnpqnpqoqvsu{y{qqqlllppptttrrrqrrrrrqrrwwwqrrprry{{}wyyrttxzzuzyrwvrwvtyxtyx{yy|zz|{{wvvz{{}}~||~vuÊ}yꂎyq~u~hmhiotosx}v~wvw~~ӊkn~zsv~~~zz|xz{~|~~z||~}~z|upr|~z|{}z~~x}~x}}w|ysxvrwsotsotwsxvrwwsxxsuvqswrtvqsuoqcefdfgeghhjkiklkmnjlmlnooqrnpqmopnospqvnosmnroptpquhimstxwx|stxxy}uvztuywx|vw{xy}xx|xy}wy}xz~y{}||{zz}|{~{z~}|y|{}z}y}||{|~y|z{|v{~z|vw{z}}{{~~~~~~~~~~}}}|zz~uss}~||{{Y`]aefcd^d`c`ejmjj}~}|}}}||}||}rrsffg}yz{wx{{{wyz{}~ikl}y|y|{~z~uxyv{|~sxzrxzpuxuz|sx{ty|sv}`dhrwzinoglmhmlv{zx}|nsrmrqv{zmrqntsnsrnsrmrqkmmlnnnppmooqssrqsmlnpornmoljmhjjkmmkmmjlljlllnniiihhhfffffffffedfcbdjikdbedcefddgeehffgeeljjhffebddacgdfebdc`bacd_`a]``eegeghbacedffegedfcbddcelgilginikoikpkmhgikjllkmjiklkmhijruvefgkmnhijiikomponponponpsrtotsqutnsrqutoutrtttvvxzzvxxsuuvxxx}|y~}rwvtyxx}|suu~z||z{{uww~uzy{|z||}lqp~}qllj zt{ڃف{||nvnww~|yzԂԌxv|wx~~~y{|~~{xzc`b|~~|~~~{}}~|~~z||y{~|y{|y{~z~z~zzw|xtyxtyyuzzv{wsxwsxvrw|y{wtvurttrtsprdffdfgdfheghfhifhifhihjkmopmopmopoptqrvyz~xy}nospqulnrz{xy}vw{z{yz~xy}vw{wx|uvzvw{xy}yz~z{{z~|{~}{z~{z~z}~{~w|ypziv{|rmzhs{z|z~rz~xy}wvxrqsyww}}{{{}}}rpp}{{}{{~\UduuRYaecdab`f`daedfkluq}x~}zxx{wvwxvuvu|}{||igg~}{|wyzy|~}wz~svzx{|wz~{~z~y}~~rvwtxy|}w||x}v{~x{{uzyrwvputv{zinmw|{rwvtyxpvtoqqlnnlnnkmmnppnmojiklkmmlnmlnjllmoolnnhjjikkjlljjjhhhffffffgggedfcbdjikbaca`bfddgeehffhffkiihffebddacfcefdfc`b`bd^`a^`adfgeghbbddcefegedfcbddcekhjjgijgikhjlikhgijikllnkjllkmikloqrfhinpqjlmz||poqpoqkjlmlnrqsotspvtotsotsnrrprrqssqsssuusuutvvrwvsxww|{v{zw|{qssxzzz||~z||{txzrvwy||rqszvieȂyqzuht\fel|}}u|nxpwv{Ձ݂ӂyv~z}~~~~{}|~~{xz~xuw}~}z|~{}vsu}z|~}z|}}~{}}|~|~|z|}}z||~|~}y~~z|x}{zv{}y~zv{vrwvrwvrwvrwvsuwtvsprqnppmodfhdfgdffeghfhigijgijiklmopmopmopmnrmnroptrswlmqmnrpqurswwx|tvzwx|wx|optyz~vw{vw{uvzvw{xy}yz~z{{z~|{~}vuyzy}wz~}z|vz~kruy}|pzizeyvunqk|~wz{|~~|||{}~}|~}|~~xxx~~~~~~{lerd[q:@lVY\^adbhefegcdqoqk~~|}|vx}~z}|x{~~|y~x}ty|qvyv{~w|wzosxnsvy~uz{y~}putnsrputsxwtyxsxwpvtrwvv{zotsprrmoooqqmoonpppoqnmomlnqprpoqlnnlnnkmmdffeggfhhlllhhhfffggghhhedfcbdjikdbda`bfddgeehffjhhigghffebddacfbdhfhc`b`bc^`a`bcdfgeghcbd`_adbdedfcbddcelhjifhjgikhjlikihjihjnlnlkmmlnjlmkmnjlmmopmopmoponpqpronppoqtsuputqvupttnrrlqptvvtvvrttrttwyytvvuzyv{zx}|sxw|~~~x}|tyxswx{}}wyznsr{z||zom؄{xep\dX\{|ptpvqyv{w}~}ۅsq~~}~}}}nll}{{}z||~~{}}~}~|~~{}~|~|z|}~{}zwy|y{}z|~{}}y~~zxty}y~~zsotuqvvrwxtysotokproqwtvsprtrtwtveghdfgcefcefdfgfhjeghgijkmnlnomopoptmnroptmnrmnrprvstxyz~xy}pquvw{vw{{|yz~vw{uvzvw{yz~xy}yz~z{~}|{zy}tx|~x{x{wz~zry|dlsju|x|xwy|umvu}~~~}{{~~}|zz|zz}}}}~}}zjct^WtupCJz]dfk`f_hgijkggmmrn~~~||~~|y||~z|svzy|}ux|kpsdilhmpkpsotwntv|}v{~qvwqvuuzyx}|v{zrwvnsrlqphmljonotsfkjlnnmoonppjllkmmpoqonplkmnmokjljlllnnhjjfhhhjjikkmmmiiifffhhhjjjedfbacjikfdfbacfddgeehffjhhhffhffebddacebdjgic`b_ab^`a`bcdfgeghdce_^`cbdedfcbddcejikgfhjikjikkjlihjhginmolkmnmokmnhjkkmnjlmjlmkmnonprrtqprnmopoqqvurwvputkpokportttvvtvvtvv|~~uwwtyxuzytyxsxwv{z|kqpots|kpo~|~vtkinn~~˃}}{nrw{քx~w}|trsqpm{}toqupqy|~|~zwy}~~}}zwy}~}~}|~}z|~~~|~~{}~}|y{~{}}}~}|y{}y~~zvrw|x}zv{tpuuqvvrwwsxxtyyuzolntrtvsusprpmobdecefbdfacdfhifhigijhjkkmnlnomoplmqoptklprswnostuyvw{vw{rswstxijnxy}stxwx|vw{xy}xx|stxuvzyz~yz~~~~zy}}|uvzux||~x||x}v|u{y}s|u~txpy]numkrprnw~~~~}}}}}}wwwzzzywwywwxvvusssqq}}~||~~}}rppnll}}}}ywwzxx~~}~~~{yy}}}{{|zz~~~~}{{{vppmzx|ydlZa\c^fZd`dgigh``c_sv|{}mkk{}~y||}}}wz~vy~wzwzz}vy~{x~{v{~x}nsvwzjnsty|tyzw|}z~nsrnsrtyxsxwqvux}|~w|{qvuotsqssmookmmprrqssonpnmomlnqprpoqnpphjjikkjllhjjgiijjjfffeeehhhjjjcbdhgiihjhfhfeggeehffiggjhha__iggfcedac`]_khjgdf_abdfg]_`ceffhidcecbd_^`gfhedfcbddcedcehgimlnnmomlngfhonpkjlmlniklkmnjlmjllmopnpqpoqsrtsrtrqssrtputrwvsxwqvukpoqssrttsuufhhnppuwwtyxv{zuzyv{zw|{tzyv|{tzyv|{x~}||~mqr{~}ontstv剎~x|΀|{|{be_^pnqq}|~|~~}}}z|{xz~{}}z|}~}}z|}~{}}|~~{}}z||~}}z|yvxzv{~z}y~|x}{w|zv{wsxuqvyuzwsxwtvtqstrttqsolneghdfgacdiklfhifhhgijhjllnnlnolnplmqmnroptrswrswrswxz~{|uvzuvztuyxy}z{wx|vw{xy}yz~xy}|}}~{|{z~utxmlpzy}|}ux|qtxx{x{z}{~tz||t}cjsnvr{zwx}}|yxzsrtomm|zzyxzonputvwvxutvruueghmoprtuuwx|||xxxwwwxxx|||{{{|||www~||yww|zz}}~~}}~~}{{{yzy_cY^]c`g\dbf`dgl_bVW~HLلqo}xvvz{{|~~~tw{vy}tw{vy}uy}x{vz~tw|uy}x}uz}w|w|zv{~twimrotwpuvqvwsxwjonhmltyxuzyputotsputlqpkpojonvxxjllprrkmmmooonpnmomlnonponpmooikkqssnppnppikkmmmjjjfffiiijjjihjgfhdceihjhgijhhfddb``a__b``jhhfdfdacb_ajfhgdfbdeikl`bcdffeghhgikjlonpgfhgfhgfhbdehjkjlmgijhjklkmkjlkjlihjjikiklkmnjlmjlmhjllnorqstsurqslkmtsuqvuqvusxwsxwotsqssrttvxxrttrtt{}}tyxv{zuzyv{zw|{tzy{~v|{w}|z~z~||}{~{W^`ekpy{zmv`l^hV]}}~{~{vx~~||yvx}}~|~~{}}}}z|}|~}|~~{}}z|~{}}z|}|y{{w|{~z~zv{yuz{w|wsxzv{}y~|x}uqvyvxyvxtqsxuwyvxbdeeghdfgfhihjkdfhfhjikllnplnolnnmnrnosnosjkojkopqughllmqtuywx|yz~tuytuytuyuvzxy}vw{yz~yz~}~~}zy}yx|yz~z}}x{{~wz~}u|ykr{szsunpz_akRZcbpxQbiWck[flScf\jpalt^gpajtbku^gpY`iagndhmfinjkoqprsrtywwywwwvxwvxxwy{z|zy{z|}{}~}}~~}}~~}}qruwzzRVZ`W_^gZd^dcjdkX^Y[vyru׍tp~xvvz}~~~~nqu~y|z||~{}wyz|y~v{~qt|lpuuz}v{|w|}v{zsxwtyxsxwlqpuzykpokpojonjpnlqpmoosuueggdffprronpnmomlnkjlmlndfffhhmoojlloqqhjjmmmkkkiiijjjjjj`_asrtkjlfegedfeccfddhffpnnmkkfddgdffcedbdhfhgdfacdcef`bcdfgdfhedffeggfhgfhgfhgfheghqrsjlmgijhjklkmmlnkjllkmmlniklkmnjlmbdeeghnpqpoqqprtsuutvsrtejiotsotskpoinmuwwrttwyywyyrttrttuzyuzyuzyv{zw|{u}|zzt|{yz~z~x|}y|~͌Պmskspvvxu䨬ӗ}~{~}{}{xzqnp|~}z||~~{}|~~}z|~~{}|~~{}}~}~}~|~}z|~{}|~}|~|y{~z~|x}~z~zv{yuzvrw~zvrwsottpuqmrpmoroqroqtqsqnpeghfhidfggijhjkdfgfhijlmmoplnolnohimjjolmqjkptuyghlwx|yz~rswoptlmqnostuyttxvw{zz~qrvyz~mnroptnosqptlkoXX\onrxw{lnrhlp]`d^bforvlptnquehlorxtyvzvgnvu{~y||}nrznxuxx~{~{yyy~~~~~}~~~~~~|}~~tx~X\UZ\c`g\cY`PZV`Xadhotv{tv|{so~pswy|wz~vyy{xz{}tx|puxsx{nsvnsvty|knvosxswztyyv{}qvuqvvqwvtyxv{zw|{otskpokoojoonpqnpprttmoonpponpnmomlnihjlkmehhoqqnpphjjruujllkkkjjjjjjkkkjiizy{]\^cbdhgigfhfddgeeiggJHHfddnllgdfgdffcehegfcecef_abeghdfhdfggfhihjihjdceedffegaefnstdhihmnjnoonpmlnnlomlnnloiklkmnjlmeghjlmkmnqoqtsurpronptsuchgz~put|{}}suuvxx{}}}z||tzxu{zuzyv{zw|{qyxw~}xw~}u}|y~}w}|v{|}x{}y}y~̨ЛǖƌѤзڡ~|~}xz|~{xzzwy~~}}~{}~}|~}}|~}z|~{||y{xuvyvx|y{{}y~|x~|x~|x}}y~{x{uqv{x||x}wtxwtv{xzzwyroqebd]^b`ae`aeddibch^_chimefjllqijnabffhigiiacd_ab`bc_`d[\`^_clmqnosloslososwtw{ilpknrijn[\`optstxyz~tz}kqtrx{lruTZ]x|stx{|tuyxy}vw{~yz~}{}vy}|y|y|ruz{wxjuxlvzt|}|~}wxxvxx~~~~~~}~~t}t}WhP\NT[^Z]PZNZP[_llyevj{lu|}mnmln|yz~xy}~y}~~y~~|~}}y|vz~qx{|v{~v{~sx{v{~{tzw}v}jpv}luxqz{v}|pvurwvglkptuorvvy~ruyquwlosjnpknsmppkmmlnnlonlnnnnnnnnWVVlllooojjjhjkgijgijhjkehibachgiihjjikgfhkiijhhiggljjhfffddfddhffkiikiiiggacdbdedfgegheghhfhgfhqprhgihgihgieghegheghjlmghi`bcgjkjlmjlmjlmiklkmngijjlmikllnooqrtvwuwxjlmsuvrrrvvvopptyxrwvtvvqsstvvwyyy{{xzz{}}oppwyyxyyy{{v{|z~|}x|~wzz}|}}|~~y{{|xxxÞ}{}~|zz}z|}}z|~~{}|~~{}wtv|y{zwy}z|~|~mjlnkm~{}~{}}}|~}|~|}~zz|{z~{z~~zzy{||x}~zwsxzuwvqrwrsytu}xyuprvsuvsuzwyyvxpmo_`dbcg^_ccdhefj_`dijn_`dcdhijnhimnpqmoplnomopqsttuyxy}{|tuy{|z|x{|y|wz~|qrvvw{xy}|}uvzzt|{ovylsvx{z{{|}~vvzwx|}~qrv~|}|y|x{|ux|t{~luxjsvmy{kwyum|~qtzkz}~~~}|~w}ow\m]g\aVZKPJVSasjwqfxguu}ɂno{w|}xy}uvz}z~w{|z}x}v}v{~ty|x}|v{~w|hnsu{msxszrx}~t}mwwrzyv|{|txyx|}ruyqtyorvnrvlosknrlnrmookmmlnnlnnlnnpppmmmrrrmmmlllnnnkmnjlmfhicefhjkmlnihjffhfegjikkiikiiqoojhhhfffddfddhffjhhjhhiggacdbdfgijegheghfeghgiihjhfhhfhhfhfhhgijiklkmnhjk_abgijkmnjlmjlmkmnmopiklhjkhjkkmnjlmnpqsuvjlmrtvwwwwwwnpprwvqvuuwwrtttvvy{{z||z||oqqxzzy{{wyyy{{y}~w{|{|~~xzzz||~svz~nlkė΍⩫~~{}|y{|y{}|y{roq}}}|~{}~|~{}~{}~|~}|~|~{z~{z~{{{{~z}y~{w|yuz}xzsnosno}xyz{zuvvtvvtv{xzxuwqnpbcg_`dghlmnrklpdeinosdeighlqrvrswprsprsuwxqstoqrstxtuystxjkowx|psworvpswx|ux|vy}z{}~tuy~zquxrwztx{mruxz~{|xy}yz~xy}z{tuy_`d{|xy}{|vy}x{ux|x{ruymptvz~x}~}rm~qyvxr~dptp{htxgrv}|{||xzzy{{~|||||||~{vx{}|~yzw}t{pvtzy~rzp|n~oi|l|fu`iwz{|ij~}~}{xz{z|{~|}|}x}w~x}puxx}zuz}v{~tx}sw|nrww{w{grvnwzmww`hgrxwafew|{y}~swxqtxqtyorvmpthkohkoknrkmmgiifhhlnnlnneeebbbfffmmmlllnnnkmnjlmlnooqriklfegfegedffegmlnmkkjhhjhhhffhffhffgeegeehffjhhiggbdeceffhhegheghhfhhgiedfgfhgfhgfhfhjhjjlnplnnjlmhjkhjkeghjlmjlmkmnmopikljlliklkmnmopnpqprskmnrtuuuuooowyyuzysxwuwwuwwtvvy{{z||z||{}}vxxxzzvz{~}~}z||~~~~|}}çǚʥĨ|}ytu}xz~~{xz{xz}|~~{}~}z|~{}~}~}~z|~{z~{z~}y~y~y~{|x}}y~xtyxty{vxupqtppvqrxstvqrxtvxtvurturtwtv^_cghlefjijnjkoddhlmqjkoijnnosmnrlnoprrmopkmnkmnmnrtuytuyrswrswruypswqtxwz~vy}vy}wx|tuyrswyz~xy}w|puxrwzotw|}yz~xy}xy}}~~z{xy}}~~x{z}z}vy}mnr{|x{{ysz}mvyox{y}}x}y}~y~}|}~|~~}~|~~~~rs|sxkqlxjsaixvq~hxijk}qwy|~fdxz}~yz~stx}w{|{}~tuyv{~t{~x}rwzy~v{~y~vzvz|yxt~~v~}w}|otsnsrw{|swxruypsxqtxnrvknrknrorvnppikkhjjlnnlnnssswwweeelllooojjjhjkgijgijfhihjkkjljikhfhgfhonpiggnllhffhffhffhffgeegeefddiggiggfhicefdffegheghjikedfhgifegfegfeggijhjkrtumopjlmfhilnonpqjlmjlmjllkmnhjklnolnnnpqhjkgijmopkmnrtuwwwrrroqquzyqvutvvuwwuwwwyyz||xzzhjjlnn~tvvy{{imn~|~wyy|~~{{{|zzņÚ~}vqs~}|~|~{xz~|~|~|~|~|~~{}|vx|~{z|xz{{}~}wyzxz{{z~{z~{{{{{w|~z{w|zv{uprytuwrsytuzuv{vwxuwxuwwtvrprrnp`bfhimcdhabfabfefjlmqmnrghlklpmnrnpqoqrqstnpqprspquuvzwx|rswtuyx{vy}ux|x{vz~z}yz~{|rswxy}xy}lossvzy|z}uvzyz~yz~xy}}~{|z{wx|xz~{|{|y|y|y|z}x{}}rtx}}w~yq~n{guxhwztqurn}rty{~x}|~|~~~}zxwwwps~|qwqumxai?JMXgrmxjzh~d{dwr{݃li}{z|~~quvz~xy}y|w|u|}uz}nsv}v{~sx{rv{tw|{|vu~q{{v~}syxuzyrwvtxyrvwvy}knslosorvnqupswqtxsuuwyyprrlnnjlloooooolllooommmnnnikliklgijikliklmlnjjlihjjikjikljjhffigghffecciggigggeegeegeegeeeghacdbdedfgacddcegfhdcefeggfhhgigijhjk`bdbdedfgdfgjlmmopjlmgijfhikmndfgkmnprsqstnpqtvwprsnpqprstttrrroqqqvuqvurtttvvtvvvxxuwwwyyy{{xzzrtt~tvvx|}w{|||~~|~~}{}ȟƱwrszuv}~{xz|~~{}~{}|~~{}~~}|~}|~{}~{}~z|}}|{~}{zy~~z}y~vrw}y~|x|ytvytu|wx}xyzuvtqsxtvtqspmolikdeibcgddhcdhcdhhimhimjkohimoptklpnpqoqrqsttvwrtuuvzvw{tuyxy}|}z}y|x{ux|wz~|xy}z{tuyxy}xx|ww{yz~|}uvz|}xy}yz~xy}z{z{z{z{xy}z{zz~x|y|z|}z}~}rsw~}|z|}ypnwtxz{~qs|ru{w||}~{~|{}~}~}|~wut~ppSTxdiu|{xzq|^hv]giunxm{e|ul|Іojoj||~~uyztxyz~|}}~vy}w|w~zy~qvyuz}uz}w|||xw}~}~}}|uu~q{{pxw~uzysxww{|ostmptruzux|qtxlosknrgjnkmmsuurttjlljlllllnnnmmmmmmpppjjjikliklkmnjlmiklljljikihjcbddceljjiggigggeefddhffhffhffgeegeegeebde_ab_abhjk`bcgfhcbddceffhgfhhfhdfgeghfhivxyy{|mopjlmeghgijhjk_abbdehjkfhilnomopqstprsqstprsqsttttooorttrwvrwvprry{{y{{wyyvxxxzzwyywyy{}}uwwwyyx|}uyz{}~syđ~~~~}yvx|~}~{}~~~}uwx{}~}}xz{|{}||{z~z}y~wsxvrw}y~{}ytuz{zuvupqupqvrtvtvvsutqstqsfgk_`ddeiefjefjfhljjnpquhjnfgklmqnpqoqrqstvxyrtvrswxy}{|vw{xy}ux|ux|ux|x{ux|x{rswnosxy}{|wx|z{yz~~uvz~z{z|yz~yz~z{z{z{yz~z{xy}xz~y|z~~{~~~|~}~|{zlxzz~zql}vz~}~~{w}|~~~}mllrZc_hr}ftiveqmyu{r}qvjwQTkf{w~}z~|}yz~~{|~tw{x}v}}puxy~uz}uz}xx~yy~~yy{{r}t}q{{ytzyuzysxwvz{w{|wz~orwpswmptdgkknrjmqnppoqqnppikkjllnnnlllhhhmmmoooiiiiklikliklhjkgijjikjhjihjhgiihjljjiggigggeehfffddhffhffgeegeegeedfg`bcacdgijacdkjlcbddcehfhgfhffh`bcacdacdrtulnogijlnolnolnoikl_abdffmopiklnpqoqrnpqrtuuwxrtumopmmmnnnwyysxwsxw|~~{}}xzzvxxxzzwyywyyxzzwyyvxxuyz~}w{|}~ȅ{~|}{}}~|~~}}|~}|~wyzy{|}z|}vxyz|||{}|||z~z}y~wsxzv{}~y{pkl}xy|vxvqrvqrvtvvrtsprnkmifhcdh_`ddeiefjefjefjlmqklpijnijnjkonpqoqrrtuuwwsuvqrvnoshimtuyqswtw{tw{ux}vx|vx|{~z{vw{~~zz~yz~|}xy}|~rtxz{|}|~|}yz~|}z{z{|}|}yz~wz~x{{~{~{~~{~}|z~~{zy|{ywttiz|gwzttyyu|zv~rzy{}~yxzrqs}}zYb]dcov̄xiu{vXmLaXdx{Ά{x|}vw{}zu|~y~w|x|yyyzyy~}}r|u}r{|mttrxxw|{rwvrvwrvwtw{orvruynquhkoqtxorvoqpoqqprrprrsutnoooooonnlmmkkkkllikliklhjkjlmjlmihjihjihjihjjikljjjhhiggfddigfeccfddigggeegeegee`cd^`a^`a`bcdghlkmffhedfhgihgifegbdecefacdoqrhjkfijgjjeghillikl`bceghgijkmnlnokmnoqrpstnoporsnpqrrrssstvvsxwsxwikklnnqssxzzwyyy{{wyywyy|~~uwwxyyw{||{~~tvvůø~|~|~~{}roq|~|y{}~{}zwy~{}~|~}z|~}~~~}|~~~}yz{vwx|{}|}|{~z}y~wrxyuzwsy~z{wttztu}yzz{|xxxuwtqsyuwvrttprefjabfddhdeideifgkfgkijnhimklpjkolmqpqvrswrswrswstxstxqtxrwzsy|ptutuvwwxxwyywy|z|uy}{~|y|{|z{~{|rswstxyz~yz~z{}~{|{|z{~}~yz~~xy}vw{{|zz~yz~{}wx|z|ytz}~x{{~{zzyv}p{|{|y~|y}|xwyxuw~{}~x{~}|~|~~rxx[cNVMXHSQ]EWObfwر謶`by~~ejmrx{x}}}~uvz{|y}}|wz{~}x|}w{|x|}|y}~uy{z~vz}y~~z~x}|w|{sxwvz|uyzrvwquvtxxptxrt|movgiqilsmownpqoqrhjkkmnlnogjjjonloojonjnmillkmnikllnojlmlnofijhjkfhifhieghffh^]_dcecbdfeggfhommgeefddhfffddhfha`bedfgeghgikhjjgijgiifha^`fdffdfgfhedfmlnigjmlnmlnnlnljlnmomopmopmopiklnpqlopjnolrslqrntupuvsuutvvrtttvvuww}~~yyyxxxwyyv|zuzyqwvotsy~}v|z}z~z~{uyzuz{x~yz{{~~˛ͨy|~~}~{xz}}{}|~}|z||~}{}rnpnjl}x}sotyuz~z~{|{xzzwy}~|}zyyvvvuttyyyyxxxxxtsutsusrtutvonpdeibcgbdhdeideifgkfgkijnjkojkoghlnnrrswrswrswrswrtxrtxptxpuxrx|x|}{}~|{}xwyzwy|y{qtxxz~z}{~|~{|{|tuypqurswlmqxy}xy}z{z|z|z{yz~vw{uvzyz~xy}z{vw{~z{~|}}~~z|w}pxx||{z{}yv|{}|sxw~z~{|oln}yxzϰ޳餬ۙѡ۞٬骾⬾٦͠ln{yyzz~~~|}z{z}x{wz{~xz~{z~y}~|z~x||z~ptuuyzx|}x}|y~}x||v{zsxwy}~vz{rvxrvwrvwruyuwrt}kmvlmvlnvmopmopikljlmkmnfljnsrkpojoninmhmllnnlnolnoqstmoplnogijacdgijgijkjla`ba`bdbdfegfegommhffecchffljjjikjikgfhfeghgijgiliknkmmjllikkhjihjjikfeghgihginlnnlnnlnpoqqprlnolnolnokmnmoplpqinojopnstoturwxuwwxzzxzzuwwtvvuuusssoootttvvvxzzx}|tyxnsruzyv{zvzzx}|{z~~z~{~|y}w|{~ztwΞѾȏ{~z}}z|~|~~{}yuz{~z~zwy~~}}}}z|zwy~z{w||x}}y~|z|{xzsprqnp|y{xxxvvvuuutttwwwzzzvuwrqssrtpoqonpdeideibbfdeideifgkfgkijnjkonospqupqurswrswrswrswrrvrrvprvqvyqx{ptusuvvuwwvxyvx|xztw{tw{qtx{~~~|||}uvzz{optjkouvz|}z{{|zz~zz~xy}yz~|}|}yz~wx|vw{}~xz~yz~opt|}{|~~}~uy}ux|svz{~vy}w|~{~~}zskwyx~wz{~yzxstz{|y{|~}z|tys}|ឮȞ˓̞]iq}rqzlhn|||~kpoz}{~z~}~{~x{wzx{z}tw{z~y}~z~}{{w{|w|{x~|w|{w|{uzyostpturvwrvvswxqtwpsxpsxgjnhkohkpkmnkmnjlmlnokmnglkjoninmjoninmhmlkmnmopnpptvwmopikliklfhifhifhilkmedfedfdcefegdcehfffddeccb``b``feghgidcefeghgijgiliknkmlhjmjljgilkmkjlqpronprqsnnpnnpnnponpkjllnolnolnoprsprsost_de]bcotunstrwxuwwxzzxzztvvtvvxxxppp~~~uuuxxxz||uzyrwvputw|{v{ztyx~uzyx}|y~}{x}~y|w{{~ٺͣ}|wx{|z|}~~yuz}~}~~|~tqs~}z|{xz~{}yvx~{}{xzvsuroqyvx}y~|x|}tpu{w|{xzzwyroqzwyxuwxxxuuuvvvvvvqqqllltsutsusrtlkmfegcdhdei`bfdeideifgkfgkijnklpnosmnrtuyqrvrswrswrswqrvqrvorvotwkrukopqstxxzwvxxuw{xzux|wz~ruyvy}y|}~|}qrv~~~~uvz|}xy}yz~yz~yz~|}xy}yz~z{{|~{|{|{|}~|}|}xy}vzqw||}}sv}}~~|~ytvvrrwrs}xy~{}|~zwyvsu~{}~yvx囤ׯϠɟr|~~~~~~}}zxtz}y|wz~|wz~vy~wzx{z}y|{z~~{koprvwy}~w{|w|{x}|v{zw|{{{x|}rvwptvvz{lpqlotnqvmpupsxtw|prsprsrtuoqrmopmrqhmlkpojoninmhmlbdesuvprsrtulnojlmiklfhifhiacda`bbacfegedffegdcehffljjiggcaaeccddffegedffeghgikhjjgijgijgijgilikljljikmlnpoqpoqonponpnmovuwqprlnolnolnooqrmoplpqejknstnstmrsqvwsuutvvsuuprruww{{{xxx|||tttuuuwyyw|{x}|x}|qvux}|v{z}z~}~||zxv}sxw~äоĜ|}lgh~~wz}~~|~z|~~~xuwyuz~}z|yvxwtv}~|y{wtv~{}yvx{xz}z||~{xz}xuw~~{}|y{~|~|~~{}}z|xvxyvxyvx~z{{w|{w|{w||y{yvxxuw~{}wtvwwwuuuwww{{{}}}wvxqprlkmpoqkjldei`ae`aecdhfgkghlhimijnghlhimnosnosoptrswmnrpqupquoptorvnsvlsvlpqprszy{srtvsu|y{x|x{z}y|wx||}~|}z{|}yz~z{xy}xy}xy}yz~yz~tuyyz~|}yz~{|{|{|z{|}{|yz~~z{z{~|}w{~z}|w|t}fnr}{~}y|~zy~vxy{xzzuvojktop|wxz{~{}ęťȱ{~{{{psw}}|}z}y|z}ruyy}~~}z~w{|x|}|vz{x|}{y~}y~}uzyy~}y~}vz{rvwvz{quvuyzrvwnqunqunquorvlosnpqoqroqrlnokmnkpokpokpoinminminmlnokmnlnonpqnpplnohjkkmnhjkhjkihjfegedffegedfdcea__igghffiggjhhhgicbdfegfegfegjgijhjjgikhjjgiifhfeghgikjlmlnonpnlngfhonpnlnpoqjlmlnplnokmnnpqmqrjppjopotuY^_qvwtvvuwwmoovxxtvvqqqooommmvvvwwwxzzx}|v{zuzytyxx}|w|{}{|{}}|q{{myys}}~z{~yz}~~{y”Ǫxx||}}~~{}}zv{|~|~~{}~{}xuw}|~|~~~{xz|~wtvwtv~}}z||y{}y~}y~{sot|x|{xzzwyyvxzwyxuwuuussstttiiikkkpppvuwsrtkjlpoqnmo`ae_`d^_cabfcdhcdhcdhefjklpnosmnrnosoptpptoptstxpqupquqtxrwzpwzvz{uwxxwywvx~{}}z}wz~y|y|vy}stxtuyqrv|}~z{xy}xy}z{xy}zz~zz~{|z{wx|tuyz{}~{|{|{|z{|}yz~{|z{|}z{|}z{~~{z~zy}x{|y}~x|}~x}|z|xx~zz}|~}~|}~yzwtv}z|~~{}|~|~~ϵНμԪ|~vy}wz~~{xzzx}v{~~y|}z}x{x{y}~w{|w{|vz{w{|y}~{w{|z~w|{y~}y~}uzyuzyvz{swxuyzswxuyzswxnrsnrslpqnrrkopmopmoplnokmnmopkpokpokpoinminminmkmnlnooqrprsoqriklfhihjkgijfhihhjfegfegffhfdfddfdbbhffdbbfddjhhhgicbdfegfegfegkhjlhjmjljgiifhhegbaca`bjikkjlnmolkmonp{z|onponpmopmopiklmoplnoimnkpqkpqlprinoprrsuuprrtvvjllvvvvvvvvvvvvuuuuwwrwvnsrqvurwvw|{v{z{z~put}|}|pzztsuu˰ƭ̼š~~~|~|~}}}}z|~{}vsu|x}|{}~{}~{}}|~|y{~{}~~xuw}z|~~~|~~|y{}z|}z|}y~}y~~z}y~{xzzwyyvxxuwxuwwwwuuuvvvtttsssrrrutvtrtqprtsuqprabfbcg_`dbdhcdhabfbcgcdhklpabfjkoklplmqmnrnptrswijnlmqmptpuxnuxpturtuxwyyxz}z|~{}z}losz}~qrvxy}yz~~~xz~vw{xx|z{z{zz~zz~}~z{xz~z{{|{|{|z{|}z{z|yz~~}~{|~~|{}~||}}us}vxv}z|uz{{|{|xstytu{|~}z|}}|~}zwy~{}Ţ}~wuu~||wuu}}}vvv}}}||nquz{{~{{zy{||wz}~xzx|y}~|}w{|vz{y}~{w{|lpqswxw|{w|{z~uzyuzyuyzrvwtxyswxostostnrtnrtlpqnrrkopnprmoplnolnomopkpokpokpoinminminmkmnlnonpqnpqkmniklfhihjklnohjkihjgfhgfhgfhfegfdffddgeefddfddhffhgicbdfegfegfegkhjlikmjllikkhjjgilkmpoqjikpoqxwyonphgiihjonpkjllnokmneghjlmnppmqrpuvkpqnrtotuhmnsuumooz||rttmoorrrzzz}}}{{{{}}lqpqvuputtyxvzzz~|}y~}~y~||zv|â˙ĺȹĿő{z|~~}~~z|}z|{xz|~~{}{{|~~{}}z||y{|~}z|~{}zwywtv}z|}zwy|y{~{}~~~zwy}z|}zwy~|~}z|}z|~{}}y~}y~zv{{zv{{xzzwyyvxzwyzwysssqqqssskkkuuutttttvtsumlnmlnkjl]^babf\]aefjdeideiefjfgkpquefjjkoklpklpmnrnoslmqmnrppuruyquxovyquvrtuvuwxvxurtvtvx{y|wx}xy}yz~xy}xy}wx|vw{wx|z{{|yz~xz~|}|}z{yz~vw{yz~z{{|{|z{|}~~yz~}~}}}~~yz~~~}|}{~z~}{~x|z{~{u|}xs|yu{u}s{yz|w||~z{wrsxst}xy{uv|y{~~{}~}¿ûύchl}{}}{{{~~vx|wz~||y{ztz}}}ruzwzvzy|x|}z~|w{|{z~{y}~z~z~v|zx~|v{zv{zuyzquvtxyuyznrsquvostostnrsnrtlprpstnpqkmonpqlnolpokpokpoinminminmkmnlnoprsprsmoplnohjkjlngijcefjikgfhgfhhgigfhgeghfffddkhhjhhheehgicbdeeggegfeggdfifhlikolnmjlmjllkmlkmlkmjikfegkjlnmoqprutvnmonpqnpqlnoprsoqrmqrx|~kpqkpqlqrmrsuwwsuuvxxxzzoqqsssvvvvuuwwwxzzotstzxw|{sywy~}y~}|~x}~{}ytx~ĭƴϻxwy}~z|{}|~~{}}}|~~}zv{~z}~z|x|~~|~|y{~~}}z||~~~~|y{|~{xz|y{}z|}}z|}y~}y~vrw|{y{zwyyvxyvxwtvvuursrtttfgfuuurrrtsuttvsrtpoqnnp^_cbcg\]aefjefjhimhimjkojkolmqghlfeiqosqptqpttswrturtutvwvwxsvwtvvuwxvxywyzvwxvxytvw}z||yz~xx|xy}|}{|wx|tuyuvzxy}yz~xy}z{xy}yz~xy}yz~z{|}{|z{z}z}{~{~z~|z|}twwsvv~~~|ww{uwyz{~vxzvxxwwu|vty{}|}|}}z||y|xuwmjlspr}z|yvxqnp}~{}}|y{~{}|{}׭ҡW[dmow{yyommϐ}~|}{~{{yy}mptmruuz{x}~x~}syxu{|w|}uz{sxy^cdq||ozznzzo{{ozzmwzmxzmxzny|kvxjssputputotsotsotsrrrvvvxxxmmmooomoomoonoomoomoomoojnolpqnstnrskopjllgiikmmjlkikkfhhdffeggehhgii_bbedffeggfhgfhgfhjegidfeacmhjgcejgikhjmjllikolnifhmkknllnllnllnllmlnjik~}nmonmoprtprsacdjlmlnoostntshnmntsntssyxvxxwyytvvuwwwyyvxxz}}wyyuxxvxxwyyvxxvxxz||{}}}~|~~z||stt}||kmn~̦ȻĮ}y|}~{}~~~~z|z|~|}~~~~}~|x}~{xz~{}~z{~uqv{}||~~|~~{}wtv{w||x}}y~~z|x}}y~{w|{w|tpuytvz||wy{vxytvuqtvsutpswtvtqswsutqsvsu{xzsprplnfgkfgk_`defjfgkjkoklplmqlmqlmqklplkonmqnmqrqunmqmopmopprsqstrtvtvwuwxvxyrturtuvxypquqrvnpqrtutvwz|}y{|xy}xy}|}{|yz~|}vw{xx|{|yz~yz~|}}~wx|xx|||wx|yz~xy}z{z|z|z~z~z~{}~{}~{}~|~jlm}|~}}|}prsnpqdqsr~x|x{||}~xuwzwymjlspr}|y{|y{~~~}}}|ѿՌqs{}|~}|~||{~~{~~swxx|}{{~{|ptu}q}}nzznzzlxxlxxkwykwykwyjvxjvxkuuputputpttpttpttsssqqqkkkrrrqqqlnnmoooqqmoomoomookopkoplprlpqjnojllfhhgiihjjhjjikkfhheggdffdff`bbedffeghgigfhedfjegmhjojld_algilikkhjifhhegjginkmmkkljjnllnllnlllkmhgisrthgipoqoqrnpqy{|rtuqstquvtzypvuqwvoutntsvxxvxxprrprrsuu|~~}}xzzy{{y{{y{{wyy}z||{}}xzzy{{y{{}{}}~prswyzwtv{}z|ǭ­Ƹó}~~~}~|~~~}}~~}~xtyz}y|}~xuw|x}|x~}y~~z|x}}y~|x}|x}|wsxrmouprxsu{vx{vxsprxuw|y{urttqsvsuvsuolnolnpmomjlZ[_]^b[\`efjcdhhimijnjkojkoijnklpmlpposnmqrqumlpprsprsrtvprsqstrtusuvtvwprsgijy{|{|zz~himrswvw{prswyzrtuvxywx|xy}{|wx|yz~stxwx|z{vw{uvzz{{|zz~|}|}z{vw{}~}~z{{|~x|x|z|z|z||~}}{}~}~}~}|}|~~~xz{zv~ywxqz}s|yxy}~}~~plnwtv~~{xz}}~|~~|y{٨|~wy~}}}z|}vy}x{~~tswzzy|w{|{z~w|{swxv{|swxswxy}~ut~~vs}}hrrnvynvynvymvymuxnvvputputpvtpvtpvtqqqtttnnnuuuaaanppoqqoqqmoomoomookopkopjnolpqjnnlnnfhhceefhhgiiikkfhhdffceeceebdddcecbdfegedfedflgiidfgbdgbdpkmmjljgigdfgdfhegpmopnnommnllnllnllonplkmpoqlkmlkmkmnnpqoqrnpqoqrquvlrq~tzyv|{zxzz}|~~z||xzzz||y{{y{{vxxvxxkmmrtt}|~~tvvz||}|~~~|~~}Űŵϊ~~|~~}~}~}~z}y~~z~z}z|}z|~~z}~{zv|{|~~{}|~xuwzwy~{}~z~z~}y~~z|x}}y~|x}|x}{~zwsxytvrmowrt|xzzvxyvxvsunkmurttqsvsuvtvurturttqsmjlbcg`ae^_cdei]^bcdhdeiefjdeibcghhljimxw{onrpnrrqutvwsuvuwxqstqstvxywyzy{|kmnwyzrswnos{|z{yz~uwx{}~rtuxz{wx|uvzvw{vw{wx|z{xy}xy}yz~uvzwx|~yz~yz~xy}xy}z{yz~z{|}{|}~x{x{y|y|y||~~z|}z|}z||z|}yx|~~}xz{wyzprsr{~nwzw~{|zu||~tuy{||}~|~~}wtvroq°ƩҶˮZ\f}|~~{}~{}~~}~{~~nptuvz~}vv|xz{{}}{}}qstz|}rtustunpqisslvvs}}xxpy|py|ox{q{~nwznvvputputqvuqvuqvurrrtttkkkuuunnnrttprrlnnmoomoomoolpqjnohlmjnoimnnppikkceefhhikkhjjcee`bbeggdfffhhdcecbdbacdcehgikfhnikqlnnikd_ajgiifhhegifhkhjmjlnllommnllnllnllnmonmopoqonpnmohjkmopxz{oqrmopkoppvuQWVqwvkqpgmlmooprrmoorttsuukmmdffuwwy{{xzzwyyxzzxzz{}}kmmsuu}~z||y{{{}}suv}xzǎ~~}~}~{}{}~~}|~~~~~~~}~{~|z}y|}|~zwy{~z}y~~z|x}}y~|x}|x}}y~}xsuzvxz|ytvrnpwtvzwyurttqsvsuwtvxuwsprolnpmo`ae]^b`aeefjdeicdhdeiefjfgkfgkefjlkomlponrnmqjimjlmrttuwxvxyuwxtvwz|}prsnpqtvwy{|wx|}~{|}~vw{y{|vxy~tvwuwxwx|vw{vw{xy}yz~|}{|z{{|stxtuyz{xy}xy}z{xy}yz~|}xy}stxtw{wz~x{svzgjnuwxvxyz|}z|}~}|y{|xz{}}}v|}yuy|y~zzxy}}~|}||}~tuy~{}olntqs~}}~~}}~}~ŭ™w~RT^vxxwytsu{}~|~~{~|~}}z}z{~}~}}|}uwxz||y{{~z|}{~y{||~u||ylttrzzu||sz}qx{u|u|sz}pxxqvuotsputqvuotsqqqsssooopppsssnppnppnppmoomoomoolpqjnodhijnonrsnppgiidffceefhhdffeggaccdffeggfhhhgidcefegedfhfhlgijegjegkfhmhjkhjhegifhkhjlikolnommommnllommpnnnmonmonmonmonmolnosuvoqrlnonpqkopsyx~syxpvujpoprrrttuwwoqqtvv|~~{}}z||xzztvvuwwy{{{}}}{}}{}}|~~{}}vxxy{{suuxzzz||{}}z~~}}}{z||y{{z|}z|yuzrns{}|~}}z|{}}~|{|~x|w}~~~{}~{}{~z}y~|x}|}}iej}z|zuwz|z|}xz}z|urtvsuvsutqsurtwtvsprroqnkmtqs_`d^_c`aebcgbcgfgkghlhimhimhimhimrquvuyonrpptposmopqsttvwuwxtvwvxyvxysuvrtuvxxtvwstxxy}vw{xy}vw{z||vxy|~{}~wyzxx||}yz~z{yz~yz~vw{vw{yz~wx|rswnosuvzxy}xy}xy}yz~yz~}~{|}~~}}ux||~z|}z|}|~~}~~~y{|}~yy}xy}~~|}}~|}}~~{}wtvvsu~}}~~}~|~|~~~}~~~еϟƱƟY[e~}|ux|y|~y~z}|}~}~zx~xvxzzz}}}yxzsrtvuwpoqxwys{{xr{{irqkssovynuxgorjqtlsvpwwqvuputputqvuotsssstttnnnqqqtttnppnppnppmoomoomoolpqjnonrstxynrsnppgiikmmsuuoqqjlldfffhhdffeggfhhgfhgfhffhedfgfhhcejdfjegkfhmhjkhjjfhifhkhjlikolnommommnllommpnnnnpnnpnnpnnpnnpjlmnpqkmnmopprslproutoutntsmsrmsrvxxuwwuwwvxxtvvnppikkoqqvxxy{{z||wyywyyvxxvxxuwwxzz|~~~|~~y{{|~~|~~z||xzzuz{ϯ~~~}~~}~|~~~z|}|~z}{~z~~|~~~~zzz}||}}|~vsu~z~z~z~plqxty{w||x}vrwvrwrnsxty}xz}xz{vx~z||wywtvsprsprvrttprtqszwytqsrprroqoln]^b`ae`aepquklpfgkghlhimjkojkojkoposqptonrrqusrvrtunpqoqrrtuqsttvwuwxrtvsuvuwxqststxvw{uvztuyvw{z|}xz{y{|vxyuwxxx||}yz~z{||yz~wx|yz~tuyz{z{~}~xy}xy}xy}yz~|}~}~|}ruywz~y|y|{~wyzz|}z|}{}~{}~~}~z|z~|uvzz{~{|xy}|}{|vw{~}~~}z|}~~Ϭƹ~^`jwyzy{tvwz|}{}~xz{y|qtxz}{~z~z~}}~~~vtzsrvxwy}}}}|~~}~yxzpuv~y~~tyzsx{v{~sx{kpslqtpuvrwvqvuputqvuotsrrrsssooonnnpppnppnppnppmoomoomoolpqjnonrsx||gklnppgiikmmjlljllhjjacceggdffeggfhhcbdedfhfhedffeghcejdfjegkfhmhjjhjlikifhkhjlikolnommommnllommpnnpnppnppnppnppnpmopoqrnpqnprprsnrsmsrpvuoutqwvrxwtvvrttqsssuuuwwfhhmootvvy{{xzzuwwwyywyyqsstvvxzz|~~{}}z||z||vxxrttxzz|~~~~}{xzrwxţ³ĵǑ|~~|~z|tmr}xz~}}}vrw~}}z||~}~|}y~~x|zy}}}{xz}z|{xz~z~~z~z~z{}y~zv{}y~~z}y~zuw}xz{vx~y{|vxwtvvsuvsuurtrprtprtqsjgitprroqnkm\]aabf`ae\^bcdhefjfgkghlhimijnijnonrrquposrquposprrnpquwwrttpssprrxz{qstrtuuwxqsttuywx|wy}tuyvw{z|}y{|yz{{|}y{|wx|vw{wx|yy}~{|vw{yz~wx|yz~z{xy}vw{yz~xy}xy}xy}vw{wx|z|{|{|x{z}~{~~~wyyz|}|~}z}}y{|z|}}vz~|w|{|{z~~}|}~wx|}}~~~~|y{~̣ȴɭĦywytv~y{{|~yx|{z||vx}vy~z~y{~~~xwy~|{}~zuz{zy~uzzw|tx|uy}tx|nrvrvwrwvqvuputqvuotstttxxxvvvqqqpppnppnppnppmooloomoompqinolpp{dghdffillnqqgiihjjhjjdffhjjdffeggfhhfegedfhgiedfedflhjkegiegkfhlhjjgilikhfhjhjkiknlnommommnllommpnnpoqpoqpoqpoqpoqopqnqroprprsssupstntsntsoutoutpvusttsuurttvwwvwwuwwqssy{{y{{x{{uxxvxxwyy{~~y{{y{{z{{|~}}~}~cbdtqsx{zkpqIJɛ|~}x{~~}xz~y{~}~}}z|}{w|}z|{xz|y{~~|{zt~|~~~}}z|}}~}y~~z{~z~z{w|rns~|~}~zyuwzuw|xz}xzzvxvrtwtvvsutqsroqsprtprfceurtplnqnp]^bcdhefjefjfgkefjghlijnpqulmqlmqijnkmqnptnosnptoptnosqrvppuppuuvzuvzstxtuywx|tvzvz}ouxpy|px{mxztw|tw{x{vy}wz~wz~orvqtxuy}wz~wz~xy}z{yz~yz~yz~yz~yz~yz~yz~wx||}~}~xy}z{z{{|z{z{z{z{}~yz~xy}yz~{|}~{|{|}{y{xy}y{xz~|{}wvw~}~}~}}~~~~}|~~~|~wtv~{}ӯůƪµͮǏnp{z|{y{~~vz{|{|{|{x~{}~z|}~y|}xy}z{}z||~x~}tzyuz{w|ty|xw~vvzyz{xxzvwwstuxz{rtuqrtrsuprsqqqvvv{{{rrrnnnrrrnnnqppqqqssspoopnpqrsnmollnompmmmmlllllkkkmmmkkkhhhgggfffgggeeefffggggggeeefffeegihjedfgeggfhgijjmngjkehigjkjlmommommpnnqoorppqprnmotsuqprmlnqoqpnpsprxuwyvxwvxqvuqvunsrrwvrvurvwrvwrvwuyzvz{vwwyxxyyy}}}zzz{{{|||qqqw{|z~|vz{|~~~~ny}°}}~~|~~~{}|~}}~}}~~}y~~}y~~}~~}{|{~||}~~~~}y}y~~z{|~z}z}}vw{yy}xy}yy}yxzywyqpr|z|vvxtsusrtutvqprpprrqsssupoqsrtnmoonpijncdh_`dbcgddhefjghlijnnosjkohimjkolmqoptoptoptmnrnosqrvmnrnosuvzstxstxwx|rvzsx{ovymvyox{p|~vy}vy}x{{~tw{}ruypswtw{vz~ux|xy}z{yz~yz~yz~|}|}|}yz~wx|uvz{|tuyz{yz~xy}z|}~z{z{z{z{yz~{|wx||}wx||}~{z~~z{{|~~}yx|{z~}~y|z{~~~~|}~|~|~~|{}~}zwyzwy|zzXjldmwحðȼԮƮòuz{}}~w{|srt{}{w{|z~}|zzwt||z~qstwyzwyzvxyxz{|}{||~y{{{}}x~}u{ztzzuz}qvyyyzx|zxzyxzxxxvvvuwxuwxprsprsoqrpppqqqrrrqqqqqqoooooosssrrrooossspoqtsunmonmonmoqqqnnnkkkkkkmmmlllhhhgggfffhhhffffffggggggeeegggihjihjhgiffhhgigijhllfjkdhifjkjlmommpnnpnnqoorpplkmrqsonpqprmlnroqqnpsprvsuxuwwvxpvtpvtnsrnsrsxwrvwrvwrvwuyzvz{~~~zzzwwwzzz||||||zzzttt{{{z~|z~z~vxx~}}~~}Ĵд~tqs|y{~}|~}~~~~~~y{~}~~|~z}~z~yuz|x}}|~|}}~~{}~~}y~}y~}y~}y~|{z~yz~xz~|}xy}stx{z|zy{trtxwytsutsusrtqprsrtrqssrttsurqsutvnmoqprZ[_[\`abfabfbcgefjghlijnfgkdeiefjjkolmqklpklpklplnrnptnosmnrnostuywx|qrvpquuvzruyuz}nuxnxzpy|p|~vy}vy}tw{{~qtx~tw{svztw{vz~ux|xy}z{yz~yz~yz~yz~yz~yz~yz~wx|yz~pquabfzz~~z{z{z{z{z{yz~{|{|~xy}|}~~}~|}|}~~z{~~~}||{~~wx|uvz{~|}~}~~~~~}|}~|~|~~~}|~~}~olnᵿɳɯǠx{}quvrvwjikuwx{}txyy}~vz{|{xz{}~y{|vxyy{|}~}~y{|z|||~~x~|v|{txztz|puxzz|z~yxzyxzxxxxxxnpqoqrtvwtvwrtutttsssrrrqqqqqqnnnrrrsssrrrooossssrtsrtnmonmonmokkklllmmmkkkmmmllliiihhhiiijjjhhhfffgggeeeeeehhhihjfegfeghfhhhjgijeijfjjdhifjkjlmpnnrpprppqoopnnpoqsrtlkmqprmlnroqqnpsprtqsurtsrtpttpttinmkporwvrvwrvwrvwuyzvz{rrrssstttssstttxxx}}}|||pppwwwtxy|{tvv{}}|~~}~tswqrvк’~~{xz}|{~y|~|||zzz|}x{|~~|x}||~z}|~|~z~yz~~xty}y~{w|}y~}y~}y~}y~{srvzz~z{z{{|{|{z|zy{utvxwymlnpoqtsuutvrprpprsrttsuqprsrtnmohgimnrdeicdhcdhdeiefjghlijnhimjkooptjkolmqllplmqlmqklpoptlmqnosqrvxy}stxqrvstxxy}vy}uz}sz}qz}qz}o{}svztw{psworvvy}svzmptruyvy}wz~x{xy}z{yz~yz~yz~yz~yz~yz~yz~wx|z{{|VW[z{}~{|yz~z{z{z{|}yz~xy}opt{||}|}|}|}}|~}~~}~}|~~yx|{z~{|~{~|}~}|{}~}~{}||~tqs{xz~ɥޮ¼ҬķϳȨglunoyvxvxyxz{{}~~~~zxy~|~{}~}}~|}vxy}x~}w}|rwxty|qvyzz}|xwyyxzyyyyyyz|}tvwsuvtvwprssssrrrrrrtttpppqqqtttrrrpppsssoooonpkjlnmonmonmoooommmkkkkkkmmmmmmjjjhhhjjjkkkiiifffgggdddeeehhhlkmgfhhgihgiihjhjkdhieijdhifjkjlmpnnrpprppqooqooonpnmovuwqprnmoroqqnpspr{xzxuwsrtputotsfkjqvuuzyrvwrvwrvwuyzvz{vvvwwwzzz|||yyy{{{|||~~~ooosssvz{y}~swx}y{{~˕~}z|tqs~}~|~z}~~~{}|~~{}}{w|}|~z}~z}y~~z}}|{|z{}~~~z|}y~|x}{w|zv{{z~{|z{yz~yz~{|}|~|{}vuw{z|utvutvxwyutvpoqonppoqtsunlnjiktsumln`aeZ[_efjabfbcgefjfgkghlghlghlghlhimijnlmqjkoklplmqnoslmqnosoptstxqrvstxtuyvw{vy}uz}sz}qz}py|nz|tx|vy}qtxsvzux|ux|vy}wz~ruy{~tw{xy}xy}zz~}~{|~xy}xy}wx|z{xy}yz~{|yz~xz~{|z{|}}~|}}~~~~|}~~~~|}~~~}~~}|~~|yz~|}|}y|}~~|z~}|~{xz~{}}|~~ܱǧ٧inusu}z}~Ǣ}~z|}vxy{|z~rvw}yv~~t|||{}~z|}y{|y{|yz~yz~vxxwyyntstzyx}~v{~qvyww}zy}xxzxwywww|||rtutvwprsnpqqstnnnvvvqqqssspppkkkqqqpppppppppooopoqjiknmonlnnnpmmmllllllllllllkkkjjjiiiiiiiiiiiiffffffgggccciiimlncbdihjgfhjikfhijnocghcghdhigijmkkrppussnlliggnmohgimlnqprgfhpmopmoqnpqnppmonmohmlqvurwvrwvsxwtxyuyzswxtxyuyzvvvwwwvvv{{{yyyyyyyyy|||wwwttt~^bcx|}y{{|~~}~||~Ե±î}}z|{~z}yyy~~~|{~|~|~~~~{}~zv{|x}{~|~yuz~|}|}|wsx|x||x}|x}|x}~z~vw{z{vx|z{wx||{}}|~zy{xwyqprmlntsumlnmlnlkmnmoqprkjllkmpoqnmo`ae]^bdeibcgdeiefjfgkghlghlhhlhjnijnjkolnrklplmqnnrnospquuvzjkovw{stxqrvvw{uvzx{qvypwzluxr{~p|~wz~vy}ux|svzux|ruysvztw{qtxy|vy}yz~wx|tuyxy}yz~|~yz~zz~xy}xy}vw{{|uvzwx|yz~z{{|{|z|z|}~{|tuy}~~~~~~|~z{|}|{~~~|}~~~}|{}~~yxzutx~}~rswprv}~|}~~}}~~{}|~~|{}~{}z~ʢ۵ǨX[cwvz~vxxxwy{}}y{|{~x|}txyw{|~|zxy{{xz{|~}}|}{|z|~{}}y{{lrqsyxzvz~qvyww}xx|yxzxwyxxx{{{uwxtvwqstnppqstrrrrrrlllvvv|||pppppppppnnnooommmnmoonprqshginmommmkkkkkklllllllllkkkjjjhhhhhhhhhffffffhhhfffggga`b`_aa`bhfhkjleghgklcghdhjfjjiklljjpnnussrppqoorqsonpqpredfpmopmoroqlikroqutvotslqpqvurwvsxwtxyuyzswxswxvz{vvvvvvuuu{{{xxxzzzwwwyyy|||wwwx|}y}~eijvz|{vxx}~}{{rqqծͰȓ}z|}|~wz|uxx{~}}}vvv}|{~{~}~ux}xzvqs~y{z|}|~}xuwurt}z|~~|~}|x}}y~~z|||}}~~~z~z}{|x}{~z{w||x}{z~z{|}vw{vw{vvzxwyzy{zy{tsuutvyxzutv~}xwypoqqprqpronpjiknlnmln`ae`aeabfbcgbdhefjfgkghlghlhjnjkolmqmnrmnrllpmnrpqumnrtuyxy}himwx|stxqrvrswstxtw{x}ovymvys|q}wz~ux|ux|tw{tw{tw{ux|vy}mptux|ux|yz~wx|rswrswvw{xy}uvzuvzxy}xy}z{wx|~{|xy}yz~yz~zz~{|z|z{|}uvz{|~~~}~yz~z{wvzposxw{~}|}~~~}~{z|}|~~~}~|}z}z{~~~|~}z|}}~}|~~}srt}z|~kosz{~~}~~nvv|zxw{y}~xz{~}~wx||~|~~vxxjpomrsuz}rwz{{vuytsuxvxyyyxxxuwxtvwrtulnprttrrrooojjjvvvpppmmmqqqsssqqqihjrqstsusrtpoqmmmlllkkklllllllllllljjjhhhhhhhhhhhhhhhhhhhhhgggfegfegbachhjgfhgijgkldhjfjkgkliklpnnqootrrsqqtrronplkmtsuihj`_awtvtqspmoqnpsprtsuputputqvurwvsxwtxyuyzswxuyzquvvvvvvvtttxxxxxxzzzwwwxxx{{{{{{rrr~~z~y}~z~~vxx~y{{|~~|zz~||smoñâ|~~~{}~yz~~}}}uuu}}}{}|wy}y|{~|{}}xz~|~|~~}zv{wsx||{{w|zvzvuyz{~ghl}}y~||}~wsxyuz{w||x~{z~wx|xy}wx|uvztuyvuwxxzxvxwvxtsusrtsrtpoqwvxpoqonptsuwvxpoqnmojik`aecdhabf`aeabfefjfgkghlghlijnllplmqmnrnoslmqmnrrrvmnryy}tuyjkouvzstxuvzrrvxy}ruyjornuxowzmvykxzux|ruytx|tw{tw{qtxrvzsvzorvwz~y|wy}wy}{}yz~{|~z|{}wy}wy}yz~xy}yz~z{{|{|||{|yz~|}yz~wx||}}~|}}~~~~|}{||~zy}wvz|}~~}|~xw{~~}~ww|stx~~}~~mpqpst~yvx}~ϧ榰Ʊȵͤx{vsy~y~~|{zyx~}z|}~|~z|~}wx|wyzz||}v|{zuz}qvy{{xw{}|~wvx{zzxxxrtutvxsuvlnortunmmnnnnnn}}}|||hhhhggnmmppprqqpoogehxwyzx{zy{utvoppnoomnnkllkllmmmlllkkkjjjkkkkkkhhhhhheeehhhjjjkjlhgihgiihjonpkmnhlmhklgklilmkmnnllpnopooonnqoorqsmlnutv|{}poqmjlolnqnpplntqstsuputqvuqvurwvsxwtxytxyrvwquwrvwuuuttttttwwwwwwzzzyyyyyy}}}}}}mmmvz{y}~{x|}uyzz{|}~~~~yy{}}ɡvuv{xz~{{z}{}~~~utt{vx}~|nikz||~{xz|~|~~~{}~|}{w|~|}wy}~|~~|}{|~z|{{w|}}{~y~|{wx||}{|uvzuvzywzyxzvuwywywuwwvxsrtsrtqpqttvporrqsyy{ihjjikmmo]^b^_cbcgWX\\]a`chbfkcflcfkjmsknsmnrrswklpijnnospswlptnquqtxmptruyruyruyqtxrvzruyqtxpswnuxmuxox{stxrswuvzvw{wx|wx|tuyz{xx|vw{vy}t|tz}ty|x{ux|zu}qy|r{~rz}tw{zz~wx|xy}xy}{|}~xy}yz~wx|wx|z{{|yz~{||}~}~yz~yz~zy}xw{{z~}|~}~|}|~}|~yxzwvx{z||{|~~~wvx|z|~}|~~~{~}~|~~xz{}}y~{x}˥одǻаǥquzruy|{}}}vwttxxz~{|}~~|~|}}~|~fhiz|}{}~xz{}rzzrz{r{{w}wz|vxyruuvxyuwxtvwrrrqqprrrqqqsssprrnppmoolnnnppikkdfflooprroqqnppprsnpqmppjlmnpqjpoflkcihkpohnmkmmlllkkklllkkkjjjjjjiiifffgggjjjjikjikjiklkmmlnlkmooqjikmmomkniklgnm^dcptsegghiinkmnjlnjlliksprpoqpoqonppprtsuuwxqwvoutpvupvuovuqvuy~}rwvtyxxxx{{{yyyzzzxxxyyyxwzzy{{z|{z||{}z||uww|~~lrq|{~Ļǧ~}}~z|}}vy}~}|~|xz~}~~{~~~|}|~}~ttx}|}|~}|}|~{{{~z{~}||z{{|ttx~}~|{xvzzy}y{|rtuxz{ruu{~tsuqprrquqpurowpntplphefvsvqnosos]^b^_cabfcdh_`d_bgadidgldglfinfinjkobcgjkojkolnrilpnptsvzx{orvrtxrtxrtxqtxsvzruyruyruypvznuxnwzpqunosvvzvx|yz~yz~xy}wx|vw{vy}qz}t{~uz}qtxx{s|ox{s|s}r{~x{z{z{z{wx|yz~yz~{||}}~z{tuy}~}~{|||}~|}|}wvzwvzyx|yx|~}|{z~{z|zy{}|~|{}{z|{z|~}{z|~}{xz{xz~~}|~}}z||y{|~zwy}z|}|~~ҳдӓimrx{utv~yxzzy{~urt{~~txy|txy}~~{|z|}prsz||z|}oqrqstsuvxz{s||s||s||pxxpyxswxuwxvxzvxyuwxtvwrrrpppqqqppprrrrttqssqssnpplnnkmmlnnvxxprroqqnppoqroqrmoplnpjlmjpolrqlrqjpohnmkmmlllkkklllkkkjjjhhhgggfffgggkkkjjlihjkjllkmmlnnlnpoqmlnkjlmlnlnockjionputgiimooolnnlnpmoqnppmonnpnnpnnpqprsrtsuvpvupvusyxsyxsyxw|{x}|mrqrwvtyxzzznnnxxxwwwyyy|||yxzzy{|z||z||z|z|||~~|~~mooptt~}|~~}z|~}~~}vy~{}~~z|~~{}~|~~y{}}~}|}y~~}~{~~~~}}|{{{{~|}tuyvx|||z{|{~}~}zy}|{{}~vxyxz{vxyeghqprtsupptqouqnwqnwvrxyuzplrkglxty\]a]^b`bf`aebbfcfkbejhkpfinfinhkpnosghlnosmnrjkofimnquqtxqtxlosptxptxptxqtxsvzruymptorvpxznuxmvy|}stxqrvtvzvw{wx|xy}wx|wx|vw{vy}s|w~zvy}vz~tz}u|x~u|t{~x{z{z{|}z{{|{|}~wx|wx|qrvmnrz{xy}~~{||~{|{|}~wvz|{zz~~}|{z|rqs~~}}|~|{}~}}}~~{}onponp~~wvx~~{}}|~|~}}~}}vjs|Ĵôķͬҹܴťaejruyzy{~~~roq}}y|||~wyzz|}}y{|uwxw{|w{|w{|rwxswxuxywyzy{|vxyuwxtvwqqqppppppppprrrprrmooikknppmooikkjllprrprroqqnppoqroqrnprnpqjlmflkgmlhnmjpohnmkmmlllkkkjjjkkkllljjjhhhggghhhlllkjlgfhmlnlkmmlnonpnlnihjhgikjlkmnaihkqpkpohjjlnnolnpmotqsmjljginnpnnpnnpnmopoqoqrpvupvupvupvupvuuzyuzyotsrwvtyxqqq\\\uuuwwwyyy|||zy{{z|||~||~||~z|||~~|~~lrp~{|zxst|~£ıƮ}zuw}xz}}|~y|}z|~|~|~zwy|~|~yvx~~}~~}{|}|{~~|{{z~~vuywvz{{{{|x}|{z{yz~tuy|}~~zy}~}|{|{z||vxywyzrtunpqqprtsupptrpvoluspyxs|pkukfopktqlu[\`]^b`ae^_ccdhbdj`chilqdglcfkhkpdeijkocdhijnjkohkolosknrorvpswpswpswpswqtxsvzruynquruyqx{nuxluxuvz{|tuyuvzyz~wx||}wx|vw{vy}qz}ry|lqty|tw{owzt{~ovyqx{t|~vy}vw{yz~wx|wx|{|xy}yz~yz~}~}~z{z{|}|}}~yz~yz~{z~|{{z~|{~~zy{|{}~}~~}~}|y{~{}zwy}z|~}{z||y{}{xz~{}}}~yxɽԭϻ˗PTYvy}tsu~zy{~{}|~x{vy}~~}~{{}~suvuww}y{|z|}wyz}w|}w|}w|}sxzlqrtvwuwxuwxvxysuvsuvooonnnpppoooqqqoqqsuutvvnppprrsuuqssoqqprroqqnppoqroqrqstmopprsntsjpogmljpohnmkmmlllkkkjjjkkklllllljjjgggiiilllkjlgfhmlnlkmmlnlkmlkmqprlkmnmomopiqpejikmmhjjqnproqurtolnhegpoqonponprqsrrtqstoutqwvqwvqwvqwvw|{tyxsxwrwvtyxvvvWWWooozzzxxxyyyzy{{z||{}}|~}|~y{{uww{}}rttots~|xwyyßyw}~|~}{xz}~~~~z~|~~}xuw~|y{}z|~}}~y{~||x}{~z{~~}|~}{z~~}||{{{||{~|}~uvz}~~~}zy}|{|{zy}xz{vxxtvwoqrtvwutvqprqptrpvoluspytnypjukeplfqrlwcdhabf\]a]^babf`chbejcfkehmfinknslmqghlhimijnmnrlosjmqlospswqtxpsworvnqunquqtxsvzpswpswlsvmtwmvyuvzuvzvw{stxtuyxy}wx|z{vw{vw{wz~py|ipsx{wz~ty|uz}v{~sx{uz}|}xy}vx|yz~xy}wx|||vw{yz~xy}wx|wx|z{yz~|}vx|tuytuyxy}z{|{~}}|srv{z|~xwy{z|tsu~}|~}z||y{~{}{z|}|~}|~}|~~~}~{}~{}|~}z|~{}y{|z~|kvv{z{ƩĚϲðɡiqxgkpxz~~}~}}pr{}~~}|}|}xy}||}~~z|||~}}z|}wyzvz{x|}v{|{z~tvwvxyuwx~tttwwwssspppooomookmmikknppprrqsslnnlnnnppnppnppoqroqrlnooqrprsrxw}y~lrqhnmjllkkkhhhhhhkkkmmmkkkmmmcccdddnnnjikjikjikjikihjlkmnmomlnlkmonpjlmdlkflkglkikkikkolnolnroqpmoroqrqspoqtsuvuwutvrtupvurxwpvupvupvuputqvuqvurvvsxwwwwxxx~~~zzzrrr{{{xwy}|~{z|{z|yxz}|~~{}}uwwots{x}|~{xzѲ÷ļߣ}~~}~y|}}{}~zwy}}~{rns~~}|~~z{xty}y~~z}|wx|yz~vw{xy}{|{z~vuyxw{zy}utxxzzuwx|~uwxtvwtsupprutxtrxmjstqzqkvslxkepjdooit_`d_`d\]a_`defjdglbejadifinhkplotmnrijnlmqpqulnrknrjmqlptpswqtxruyruyqtxnquruyqtxsvzsvznuxnuxmvyuvzuvzuvzuvz|}}~yz~wx|vw{vw{wz~qz}jqtty|tw{ux|tvztw{vx|qtxsvzuvzyz~xy}wx|yz~xx||}xy}xy}xy}uvzwx|xy}{|yz~}~z{{|uvzyz~}|~zy}{z~~}}||{~{z|}|~wvx~~zwy}|y{zwywvxzy{zy{}|~~~|{}|~|~~{}|z|~{}gdf~{}}|x~{}ıª˼Ȳԫzrv{tw{~~rt|~~{~z}}~|}|}y{|y{|{}}|~~|~~xz{z|}{}~y{|vxyprsvxytvwvxyuwxuwx_abpppqqqnnnqqqpppoqqprrqssmooqssqssnpplnnnppnppoqqoqroqrprsprsqstntstzyionlrqhnmjlljjjhhhhhhmmmkkkjjjiiifffqqqjjjjikjikjikjhjjiklkmnmomlnnmolkmlnoemlflkhnljlljllpmopmosprwtvnkmmlnrqsrqsyxzvuwrtupvupvupvupvupvuqvuqvuqvuqvurwvwwwxxxxxxzzzuuuzzz{z|~}|{}zy{xwy~{}}}rttrwvz~~|~~{}w}¹ɻʤ`]e~{}}urt{}~x{|~}}xz~~{}|~}~}}~~~}z|~|wy|~~|x}wsx~}~}{z~|{~z{|{z{}~||z{yz~~}|{~}zy}zy}vxyxz{tvwvxyuwxtsuqprtswrpvnktpmvqluojsojsnirnir_`dabf`aeabfefjdglbejadiilqhkpfinhimfgkmnrpqullpjmqjnrnptpswqtxruyruysvzruyvy}tw{ux|ux|qx{pwznwzuvzuvzuvzuvzuvzvw{uvzz{vw{vw{wz~s|qx{w|x{svzsvztw{ux|tw{ux|}~uvzvw{xy}yz~vx|z{vw{vw{z{{|tuyvw{yz~|}yz~~{|stx~zy}~yx||z~zy}zy}zy}|{}|{}{z|{z|zy{~}||~xwywvx|{}zwyxuw|~{xzxwysrtzy{~}~}|~|~~z||y{}z|vtv{r|||xx}uлǸѳŽemtsw|tw{~}~}xwywvx|}}~{|~vx}z{}~~~}~~{}}y{{{}~~}xz{z|}{}~y{|vxyz|}z|}tvwvxyuwxsuvqstrrrtttpppooonnnkmmlnnmooikknppprrprrlnnprrprrprroqroqrmoplnolnohnmjporxwjpohnmmookkkgggdddjjjllljjjiiilllfffllljikjikjikihjjjllkmnmomlnjiklkmqstemlgmlkpomoojllqnpqnptprxuwyvxonpwvxvuwsrtoqrpvupvupvupvupvuqvuqvuqvutyxuzy}}}|||{{{yyyzzzzz|vuwutvlkm~{}}xzzuwwqvuuzyx}|y~}{{|z}|~posֵŰrny|~}}z|~{~~}}~{~|}{~~~~}~}}|~~~{}}}{}}~}|||x}|zy}~}~~}~~}pos|{{}}xty}y~|{{||}wx|}~~}{z~~}zy}yx||~z|}lnovxyuwxtsusrtrqusqwroxpmvtpvrnsieknjoqns[\`_`d``dabfabf`dhbejcfkbejhkpilqhhlfgkjkojkojloilplnrnquqswqtxorvqtxruypswwz~rvzux|ux|w}t|qz}uvzuvzuvzuvzqrvrswstxwx|vw{vw{wz~s{~w~x~wz~wz~ux|vy}wz~svzvy}z{z{xz~yz~yz~uw{stxxy}xy}xy}vw{wx|yz~~z{rsw{||}vw{tuy}|zy~|{{z~~}~}xwyyxz{z|}|~|{}{z|zy{yvx}}~{}{z|||~~}~}|{}xwy}~~{}{xz|y{|~~{}~}~{zwp|»⵸ϼιɸȨU^cy}wz}}|~|xwy}|~~}}|~yz}}~}wx||~wy}}|}}}{|}~{}}z||z|}z|}z{|{}~z|}xz{z|}y{{lnouwxtvwvxyuwxsuv}ijluuuwwwsssqpp|||rssqrrpqqkllqrrprrqsslonpsrprrprrpqroqropqnpqmnolrpkpokqpejihnmjllqqqvvvqqqhhhijikkkmmmeeennnhhhjikjikjikhgikjllkmnmomlnmlnnmohjkdkjionmrqlnnkmmpnpqnpsqszvxomo[Z\srtqprvuwvuwsuvqvuntspvupvupvuqvuruupvutwwtzxxyyzzz{{{{{{|{{xxx{z|xxzljl}{}}|~~}wyywzz|}}zzz|}ztus}wtvxuwٯҲ~}{}z||~~~~~}|~~|~}z|vsu}}~~~~~{|yv{{y}}}~~}|{~}zy}{|wsx}{z~{|xy}|}z|uvz|{vvzwvzxw|trwgijsuvrtutvwrtuututsurptpntspxmkqnknlikifimjkmim[\`\]a_`ddeicdhaagddjddjccieekehmhkpknsonuifmnkrmlromsontsqwsrxprvpswqtxsvzsvzqtxrvzrvzorvptwuy|vw{uvzuvzuvzwx|tuyuvzvw{vw{wx|wx|oswrvyx{vy}tw{yz~vw{vw{yz~nos}|~}|~}|~zy{zy{~}~yz~rswwx||}xy}z{{||~}~}|~~{}}zy{xwy~}~~}yxy{z|zy{xwyutv|{}|z|{z|zy{~xwy{z|zy{{z|wuu}{{}{{}}~|{~~}}vtt|~{xz|y{|~|xz|{}{z|zy{xxz~}vvv˷ԯʾͺͬȫry|z~xzz|}}~zxzuy~~}~vyx~{w|w||}|~}|~y{|vy~vy}x{w{y|{|wx|xy}uvzxy}rvwsxwtzxtzxuzyw|{svvsuutvvqssrtttpqsoprnoqnnsoppoqtruonpmlnonprqsroqqoqsprrprqmomnomnomnohhjjjklkmmlnpnqqprkjlihjkjllkmmlnjikhgijhjjjlhgikjljiklkmnmomlnmlnlkmkjlcccrssnoommmnpqopqqstrrtmopqprqprqprsrttsutsuqrrqrrstttuuvwwvwwvvvyzzxxxyyyy{{wyyxzzy{{|~~|~~w{zx}|}w|{y||z|||~~|~~~suuz{|~~~|}}uvzuu~Іʩˬɓ}|zx~}z}z}~~~{~}xz~|~}|~z|~z||~|~~~}}vpu{|v{unt{{w|wvz}~z|{|uuy|}}}{z~qptutxsrvtsw}|~}{z~{z~||zy}yx|{z~|z~|z~}|uuy{puvquusxystxttyrswootpquklprtxoptmnrnosmnriikggipoqmlnYZ^^^b[\`abfcdhaagddjddjcciddjdglilqgjokkqnlrqounlrnlrpntrpvtrxprvorvpswsvzsvzqtxorvorvvy}ruypswuvzpquoptwx|tuytuyuvzvw{vw{tuyrswx{tw{ux|tw{svzxy}vw{xx|vw{pqu{z|{z|{z|zy{zy{|{}{|tuyxy}|}}~|}z{yz~|}~~}z|}}}vuw|{}~~}}|~{z|yxzyxz{z|{z|~}zxz~yww~~}}}}~|||zz~||~||~||qoo~}z||{}|{}}|~|~}u}py}|~ӗ|u{v~y~{~|{}}~zu}{x{yzzz|~}~}z|}wz~wz~x{|z}z{xy}xy}vw{klprvwuzyx}|v|zuzyqvusuuprrtvvnppikkqoopnnommpnnrpprprsrtpoqnmoonprqsroqroqrnpsprqnpnmonmonmolkmjiklkmlkmlkmlkmihjjikjiklkmllnkjlihjihjkjljiklkmjhjmlnnnpmlnmlnllnlkmgggnnnvvvkkkqqqoqrnpqprtoqroqrqprqprqprpoqrqstsurrrrrrsssssstttvvvuuuuuuyyy|||z||xzzz||{}}{}}xzz||{{~z|||~~qsssuu{z|||wyy}}}~vw{`_hȾΟz|~~wzy|}~}|~{}~}}~{}}xz~y{|~z|{}~yxzedf~x}z}zy}}~{~|}|}|{zy}~|~tsw}|~}{z~{z~~}|zy}}|vuy|{}|{z~utx{}~qstxz{iklkmnrswqrvrswqrvnptqrvstxmnrjkoijnsswmiknkmlhjlikrnpZ[_`ae]^b`aeabfaagddjddjcciddjbfjhlpfinjjppntqoumkqnlrnlrrpvsqwpptnrvprvqtxqtxorvorvorvruyqtxsvzstxstxwx|stxvw{tuyuvzvw{tuyvw{xy}qtxruyvy}vy}wz~wx|vw{xz~z{yz~{z|{z|{z|yxzyxz|z||}uvzz|yz~xy}||{||~|~}}z|}y{|xwyyxz|{}xwyzy{zy{yxzxwy{z|}|~wvxxwyxxzzy{poqzy{yxz~}~~}{{}{{|zz~||xvv~|~}z|~}~}}|~|{}~~{yu}|Ӳԛcjsfktflsqvy{y~~wyy{{{~yxz~}t}|x~z{{~~~{}}ux|wz~ux|}|}vw{stxuvzghltxytzxv{zx}|putrwvqssprrqssrttoqqtrrsqqrpppnnrpptsusrtrqsqprpoqrqsroqroqpnpsprroqnmonmonmoihjfeglkmnmojikjikihjjikljllkmnlnlkmjhjlkmnmonmollnihjnlnonpnmomlnnlnnmokkkooommmrrrqqqprsnpqprroqroqrqprqprqprrqsrqsrqssssssswwwvvvvvvvvvwwwvvvzzz|||{}}z||{}}{}}z||wyyy~}sxwuzyw|{y{{}~~qss}|~~}~||~~~{}}~}~ç¨|}~y|}}~~toq~}}xz{}~z|yxzvuwxwy}y~yuz~}|xy}pswwx|~z{|}}~zy}|{wvzkjnsrv}|~}{z~{z~{z~{z~wvzzy}~}|{}|{z~zy}~}uwxwzz|~}vxytuyqrvrswtuylnrqrvrswqrvpqulmqihlunqoikmfipjlkdg_`d`aecdhdei\]aaagddjddjccicciadihkpgjonntmkqomsljpmkqnlrqourpvoptnquorvux|ux|ruyorvorvtw{qtxqtxstxoptpquuvzttxtuyuvzvw{tuystxstxptxqtxsvztx|vy}vw{vw{yz~|}~yxzyxzyxzxwyxwy{z|{|xy}mnrz{uvzyz~z{|}{|z{z|}|~}z|}xz{~|{}|{}yxz~}yxz~}|{}~}~xwy~}|{}tsusrtzy{{z|~~}{{~||}}}}}{{}{{~~~~~}}~{}}~~~~~}{iov}|w}x}ܵý̺ɤհygluegpuz}{z|}{{{{{{{z|zy{vuy}~x~u}xzyz{{~}|}{~z}z}}|y|y||}z{}~vz{sxwrwvtxxx}|lqpqsssuutvvuwwqssrrrqqqpppnnnppputvrqsrqsqprpoqrprroqroqpmosprsprnmonmonmoihjhgiljlpprmlnmlnjikjikmlnnmonmolkmjikgfhlkmmlnmlnhginmopoqonpmlnnmoonpqqqmmmqqqnnnpppqstnpqnpqprsnpqqprqprqprvuwtsuqprttttttvvvtttsssuuu{{{{{{zzzxxxuwwtvvuwwwyyz||z||}mrqkpoqvuw|{uwwz||}lnnyxz~}}~~lmqǮʴ|z~~y{}}xzvor~|~z|}{}xuwvsu~|~|~|~~y{}~{}{}zy{~}|xrw~x}}w|z}|}~|}}~|}}~~~{z~wvz|{wvzsrv~}|{}|xw{utxyx|xw{yx|zy}~}}|xw{yx|{z~poqxwyutvtsutrtuvznosrswvw{klpdeiijnoptqrvdeiihlmdgsjmofimcfofiWX\Z[_[\`cdh^_c]]ccciddjddjbbh_bgfhnhkpjjpljpljpnlrmkqomsqousqwoptnqumptorvqtxrtxpswnquruytw{ruyuvzxy}wx|stxqrvtuytuytuystxstxstxruyux|tw{tw{tw{vw{wx|xy}yz~wx||{}xwy{z|zy{yxz{z|z{stxrswz{yz~tuyqrvpquyz~||xz{xz{{}~uwxvxyrtu|{}{z|||~xwy{z|{z|zy{|{}}|~}|~}|~utvzy{{z|xvxxwy||~|{}wuu~~~||}}}}~||~||}}~~}~~|~|~~}曡͵ĥÿϪuxux|}~}~}}}}~~|yy|~}}}||}}lpu|z}ux|z}y|yz~pquuvzyz~fjlrwvrwvqvunsrkpobddkmmuwwy{{rttqqqqqqqqqrqqqqqqprsrtrqssrtrqsqprsprtqsliksprroqnmonmonmonmokjlkjlrqslkmlkmhgijikkjllkmqprjikjiklkmlkmhgikjlmlnonpnmomlnmlnonpqprnnnmmmnnnpppqqqprsqstoqroqroqrpoqqprrqstsuonpsrtsssssstttttttttwwwzzzzzzzzzyyylnnprrtvvtvv{}}vxxx}|x}|ots{y{{|~~}|z|~{}~opt­}|}z}|~{}|~|~|~~{}|~~z|{vx|~{}z|~}~}|~~}}w|{uz}w|z}w|uot{yuz~}||z~{|}~yz~z{tuy{z~}|zy}~}~~}wvz{z~wvzkjn|{|{|{}|{z~}||{{z~xw{|{~{z|srt|{}uuwxy}tuypquwx|klpmnroptuvznosghlkjnxnqsjmofimdgnehWX\WX\WX\\]a_`dbbheekbbhbbhbbh_bgdglhkpjjpljpljpnlromssqwpntsqwqrvqtxpswmptnquorvpswnqunquqtxruyrswtuystxwx|z{tuytuytuyttxttxttxruytw{tx|tx|tx|vw{wx|xy}yz~xy}zz|zxzzy{zy{yxz{z|yz~xy}}~tuyuvzyz~|}~~z|}{}~xz{y{|y{||{}{z|wvxwvx~}|{}{z||{}|{}|z|~|{}tsuyxz{z|yxzyww{yyzxx~||~||~||~||~~~~}}~||~{}~{}}~|~|~~}|~~}|~puyx{{~x{ԹȜտҼuwy|wyzgeerqswvx|{}~~|}zyw}~~~}vuw{|}{|x~}{{~|w{|||}~xy}uvz|}wx|v{zy~}z~~~suuvxxoqqprrorroqqnppnpprqstrtrqsrqspoqpoqqnproqnkmsprroqnmonmonmoonponpllnpoqlkmkjljiklkmljlllnpoqkjlmlnjikihjgfhkjlmlnnnpnlnllnmlnonpqprooonnnnnnppprrrprsqstoqroqroqrpprqprrprqprnmoqprtttttttttttttttwwwzzzzzzzzzyyyx}|z~~put~|~~|~~~|~~y{{wxvvv}z|}|~vw{Ǵǰ ~~~|~z}z}{~|||~{{}{z|{z|~~|~~~ytv~y{}}}z|zuwytv{}~}{z|xwy|{}z{|x}yx|z{{~yz~}~~xy}~}}|{z~|{zz~{z~yx|lko|{|z~zz~{z~{z~zy}zy}zy}yx|yx|zy}|y{xuw|~yvxqnpoptoptnosmnrqrvnptnosqrvstxklprquwpsqknpillfikdgZ[_Z[_ZZ^bcg^_caagddjbbhbbhbbhadidglfjnhhnljpnlrmkqnlrrpvpntqounosnqumptmptnquorvpswnqulospswrtxtuywx|vw{tuystxtuytuytuytvztvztvzruytw{vx|vx|vx|vw{wx|xy}xy}wx|zxzzz|zy{zy{yxz{z|}~uvzstx}~tuy|~|}z|}jlmvxyprsuwx|z|zy{zxzzy{||~|z|~}xvx{z||{}{z|xwyxwyvuwzxz{z|~}~||~}|~}}wuu~~~||}}}}|~|y{}|~xwyzy{~}~{}|y{nkm}|}{}z|xy}}~όƾֻ̭ͤ͑oqyyz~wvx~yz|{}~xuwqtx}}x~zyz{{yx~x~{jpwqv{y|x{}z}}tvzzz~stxxy}stxtxysxwtyxsxwhml]baz||kmmtvvtvvoqqrstprroqqoppopprrttsusrtrqsrprpoqroqtprrnprprsprnmonmonmomlnmlnonplkmlkmjhjllnlkmllnnlnpnplkmpprqprnmomlnkjlmlnnlnmlnlkmmlnonpqprpppnnnnnnppprrrprsqstoqroqroqrrprqprpprsrtsrttsuttttttvvvvvvvvvwwwzzzzzzyyyzzzsuuz||qssxzzvxxx}||{}|~~~}|~~}}{}}{}~ƿʏz|~}{~z}z}~~~~~y{|~{}xsuxsuz|~{vx~y{z|{}|~~}zy{~gfhzy{|v{vpv{y~~x}{}y~~z}yz~z{xy}yz~}|}|}|{z~zy}vuy}||{zz~yx|{z~{z~|{zy}yx|xw{}z|zwy|z|xvxsprstxstxtuyijnstxpqunosnosrswlmqnnrrnproqqmoolnmikXY][\`]^b`bfYZ^\\bbbhaagddjeekeglehmdglhhnljpnlrmkqlioljppntpntmosnqulosnquorvpswpswnqupswruyptxtuyvw{vw{wx|vw{tuytuytuyuvzuvzuvzruytw{vy}vy}vy}vw{wx|xy}xy}vw{yxz{z|yxzzy{yxz{z||}tuy{|ghltuywx|{|stx{|~}egh|~z|}~{z|zy{~}yxz|{~|{}|{}~}srt|{}|{}{z|yxzyxz{z|zy{}|~~}zy{wwy{z|}{{|zz|zz}}}|{zxx|{z~}~}z|{xzzwy~{}~}wvx{{}{z|}~|~heg~аÓŷʭĝsyvwz|xwy{~}yz|{}}|~zw}yw}ssv{z||~uxxzv|}y~zyw}y|||z}vy}{~z}{|~yz~uyyy}|vzzw{zx||w{zsuurssxyyvwwrssqwvossmrqossntrrrtutvtsutsutrtrqsurtvsuuqsroqsprnmonmonmorqsonponpjiklkmgginmonmomlnnmoonpmlntsuqprljmlkmkjlmlnmlnlkmjjlmlnonpqprpppnoolllnootssprsqstoqroqroqrsqsrprpoqrqstsutsuuuuuuuvvuvvuvvvwwwzzzzzzyyyzzzxzz{}}Y[[qsstvv}v{z{}}npp~}mrs|yy}~}z|}}ɫ}{}|~z}z}z}~~|z|{y{rqs}}}}}~}}xzwrtxsuz|{}{}{}}|~{}{|}}|~|{}||~{z|~}}|zv|~zzz~z|{}z|{|xy}|{{z~posqptyx|{z~utxtswtswyy}yx|ww{yx|{z~yx|zy}zy}yy||{}z~|wyytuysuwrtoptoosmnrmmqoptpqulnrnos`aelnrmnredfaachgijjkihjZ[_]^b^_c`ae`ae]^b_`dbcgabffgkiknfgkhhldeiiknklplmqijnrswoptpqumptlosnquorvorvorvrswrswrswrswrswvuy}{tswutxwvzuvzsvzsvzruysvztw{svzrvztw{vy}tw{xz~z{xy}uvz{|xw{{zzz~zy}~}z{uvzuvz~z{z{|}|}}~}~}z|}|||}}}{{{}}}{{{|{}}|~{z|{z|zy{|{}yxz}|~yxz~~y||z|}vvxzwyuqszvy{xz|y{~}}}}z|}~{}}~|~}}yvx~{}|~tqs}xux~|~Þ~}}{zy{~}}|~~opp{z|}|~y{~}w}{zz~|}|}||}~{}}z||suutvv~~~~||~z{|xyxtt~{{|xxyvvyvvyuurssqqqpqqssssttrturtuwyzuxytvwtvwrqsrqsnnppoqqpronppoqqprjiknnpurtsprrnplikjfhnkmpmoroqqnpnkmolnjlmhjkfhikmnlnoomoqnpqmoqnpsprpoqlopkopknoimnmpqqstqstqstqstqstnpqkmnnpqrturturtuvuwvuw{z|{z|vuwtttwwwwwwxxx{{{tvvsuutvvwyyxzzvxxjllwxxz|||||vuuy{}}wyztvv}tpr}|~}z|}|~|~|xz{}~z|}y{~|~|~{}~y{}xzz|~{}}}{}~{}}~}}w|zzz~}~|{}||~}|~qmrfbglhmgchxuzyuz|x}}y~xvz}{}z{}tpu~|~z|x}}|x}}y~zu{|{{z~|{zy}~y~{w|~zz{}y~~tpu}y~}y~|x}yuzxtyuqvrotsotspuqlrpnromqrquonrsrvonrrptd`eqmrninnjojfk^_cZ[_`ae_`d`ae^_c`aebbfdeifgkhimghllmqijnghlijnklpjkoprvoptpqumptlosnquorvorvorvrswrswrswrswrswvuyxw{yx|utxwvztuyruyruytvztx|vy}ruyruyvx|vy}tvz{|{||}yz~{|xw{xw{{z~yx|yx|tuyvw{vw{uvzxx|wx|z{z{xy}~|~xz{}uwx~~~zzz~~~{z|vuwzy{|{}|{}zz|}|~~xz{z|}wyzvuwxuwvqsurt~{}|~}}~{}|~|~}z|~{}}{xz|~~~}z|~~{}~|z|~¯лqs}}{}{zy{}}}{z~|{|z|~vy~u{|}~z{{}}}}}}~||~~zxxsqqqlm{vwzuvytuxstxxxooorrrtttsssoqrnpqnpqqstmopkmnpoqpoqpoqqprrqsnmoonplkmhginmotqsurtvsuxuwnkmqnpnkmqnpurtpmonkmgijgijgijikljlmmjlqnpnlnqnpsprpoqkopkopimnjnolpqqstqstqstqstqstuwxrtuqstrtvrtvrtvvuwvuwutvxwywvxvvvuuu||||||xxxy{{wyysuuoqqegglnnrttz|||~~~~~|||~~~|~}}}~quy~~~}{xz|~z||~|~}~{}}{}z||~z|{}}xz}{}~{}}z|~}yxzy~zzz{z|}|~|{}~}~}y~|yuzyuz{w|zv{zv{}y~rns~|x}~zyuzzy}}|tswyx|sot}y~|x}|x}{w||x}zv{min|vrwxty|x|{w|{|x}vrwwsxuqvwsxqmrtputswkjnrqunmqsrvlkogchuqvrnslhmnjo]^bVW[`ae]^b``d_`d`ae`bfabfcdhdeicdhghlhimfgkijnjlplmqpptoptpqumptlosnquorvorvorvrswrswrswrswrswtswtswvuyutxwvzsuyruyruyux|vy}vy}vy}vy}vz~vy}rvzvw{vw{z{z{xy}zy}|{zy}{z~{z~yx|uvzuvzxy}uvzvw{z{qrv{|yz~xy}y{|prsxz{uwx|~~~~~~~xwy~}}|~|{}zz|}|~|{}utvy{|z|}~{xz~}z|}z|}z|}|~}z|}z||~~~}z|~~}z|~{}}|y{spr}|~wtv|~ѣŸʪЯxz}{~||{}zy}xw{zy{~|{}}|~|{}}}{~wz~yyux}sy~u{zu{RX]aej~~~zz~xzzsuumooy{{accnmm|zz|zz~||}~~yz|wx{vwzuvrrrvvvqqqtttrrroqrlnokmnqstnpqkmnpoqpoqpoqqprrqswvxonpsrtnmorqsroqvsuurtwtvpmoroqnjlpmosprpmomjlgijgijgijikljlmifhsprmjlqnpsprpoqkopkopbfgfjkmqrqstqstqstqstqstqstuwxxz{tvvtvvtvvvuwvuwsrtxwyxwyuuuvvv|||zzzxzzvxxsuutvv{}}{}}z|||||~~~xz{{}~~|~}z|ܛƲöَ}}~~|~|~}|~~}~{}|wyytvqln}}{}~{}}z|~}zy{{uz{zzzzy{~|~|{}rqsyxz~{zv{|x}~}y~~{}y~~}y~~}yuz{|{{z~|{{z~xty~~|}|x}xtyzv{|x~{okpwsxtpuokprnsxtyvrwposrqusrvposposjimminrnrlhmqmrlhmWX\VW[^_c]^b_`d`ae`ae`ae_`ddeihimbdhdeibcghimijnjkolmqoptoptpqumptlosnquorvorvorvpswpswpswpswpswwy}uvzrswstxuvztw{tx|ux|vy}wz~x{vy}vy}wz~vy}ruytvztuyz|wx|rswxy}qsw{|yz~}~{|wx|zz~|}z{yz~z{wx|wx|uwx{}~y{|suv|~~~~~uuuwww||||{}|{}}|~}|~yxz|z|yxzpoqutvwyzz|}{}~|{}}z|{xz~{}|~~{}~|~~z|}~{}|y{|~|~|~|y{|z|}z|{xz|y{~~{}|y{~}}٘ʿϲ¯npzywzx~yxz{{{}|}|~nmq{z|yy~}yxz~~~|zx~}}~z}zz}xzzz||vxx}}}{{{yyyvuuupqtopztvytuyturrruuuuuuvvvrrroqrmopnpqprsoqroqrrqsrqsmlnmlnonputvtsuhgiqprrqsolnsprnkmjgimjlkhjlikolnolnlikmjlkmniklgijlnomopfcetqslikqnpsprpoqkopkop`delpqqstqstqstqstqstprsuwxtvwtvwtvwtvwwvxvuwwvx{z|xwywww|||qqq{{{qssqssprrrtty{{z||tvvsuuz||xzzzzz~~~xxxwww~~~{}~xz{~yxzvsu|{}~~{xz˙̨qvyqst~~~}~~}~zuwxsu~y{~y{ytv~}{}~{}}z|~y~zzz|{}~}}y~}|x}{w|}{|x}wsx}y~~z~}y~{w||x}|x}}y~~{w|{w|zv{zy}|{zy}{z~~zwsxzv{yuz{w|yuz~z|x}~zwsx{w|{sotxtyxtyrnsvrwwsxvrwtswutxyx|}|possrvlhmnjominkglminZ[_XY][\`[\`bcg_`d`aeabfabfcdhefjdeifgkghlhimjlplmqlmqlmqnospqunqulosmptnqulosmptotwpuxnsvnsvnsvrswrswstxtuyvw{wz~vy}ux|vy}vy}vy}ruypswx{tw{rtxstxwx|{|yz~z{vvzuvzyz~xy}z{yz~qrvxy}yz~xz~xy}z{xy}xy}y{|}z|}{}~|~~|||vvv|||{{{}|~xwyvuwyxzyxz~|z|xwysrtutvy{|y{|{z|~{}|wy|y{}z|}}~{}}z|{xz}z|}z|}z||~~{}|y{xuw|y{~}~~|y{{xz|~׷ǥrt~|z{y}|~{{{zy}}|~~~}~yxz~~}zy{yxz{z|tsuww}}wzzx~trxnnty||u{v|gmrlrwouznrw}~}~xy}pquxy}~wyyrttxzzzzzxxx{zzzzzzuv|wxupqqqqnnnooorrrxxxoqrnproqrtvwprsprsrqspoqonprqspnpqprqprtsunmorprfcemjlqnpsprqnppmoqnpjgipmolhjlikjlmfhifhjkmnkmnkhjroqolnolnqnpqprkopkopjnoostnrsqstprsoqrprsoqrqstrtusuvsuvsuvuwxxwyutvvuw{z|wvx|||~~~yyy|||xxxvxxrttuwwtvvuwwy{{{}}~z||vvv{{{xz{~}y{{zy{zwy|~}z|ŮÓy}~{~||~~{}~}}|~zuw}xz}nikz}{}~{}}z|wvx{z||{zzzyxzwvxyxz~zv{}y~|~|{w|yuz}y~yuz{|x}|x}}y~{{~z{~}~}~}{z~zy}{w|zv{{w||x}|x}|x}}y~~z{w|{w|{w|{w|zv{xtyyuzyuzxtytpuqmrnjosotsrvrqunmqqptqptvuysotqmrplqnjokglXY]XY]]^b^_cabf_`d`aeabfdeicdhcdhdeifgkhimjkolmqlmqlmqlmqnospqunqulosmptnquloslnrotwpuxotvotvotvorvpswqtxqtxqtxtw{svzruypswwz~y|vy}orvz}ux|ruystxuvzyz~|}tuyorvruyw{vy}{~rvznosuvzxy}wx|vw{{|z{xy}xy}y{|npqrtvwyzy{|y{||||uuusssppp{{{~zy{~zy{vuw}|~{z|xwyqpr~~mopzwyzuw{xzzwy|y{zwy}|~|~|~|~~{}vsuzwy~{}~|~~{}}z|~{xz}xxx{z{³òĭĽͯhjt~|~|~}{z~~}|{}{z|z|~}{{z}{}|{~~yw}yw}z}y|z{~}~y{{uwwz||rtt{}}wyyuxxy{{{}}{}}zzzytutnp}xyqlmrmniiiqqqooofffqqqrttqstrttvxysuvsuvrqsqpronprqspoqqprrprrqskjlsrtkhjnkmolnolnqnproqkhjolnlikkhjmjlhjkegheghjlnjlnlhjqnpolnwtvspronpostnrsnrtnrtnrtrttprtprrqstrturttrtvtvvuwxtvwtvwvuwtsuwvxxwywvx}}}vvvsssyyyzzzwyyuwwvxxtvvtvvwyywyyy{{{}}{{{iiimmmʳɜ{utvqpr}z|~}z|~{}|~~{}~}~ojl|wy|wy}z}{}~{}~~~x~zzzzrqs|{}{~z~z~|x}~z|~{w|sot{w|zv{vrw}y~~z~~z~}y~yuzwsx|zv{{}|}|{z~}|{z~|x}~z|x}|x}|x}|x||x}}y~{rns|x}~zyuzvrwvrwvrwvrwqmrplpqmrsotrquposnnrcbftswlkolhmjfkokpnjomin_`d[\`]^b^_c_`d_`d`aeabfdeicdhcdhdeifgkfgkghljkolmqlmqlmqoptoptnqulosmptnqujmqimpmtwnuxmtxmtxmtxsvztw{ux|ux|ruyruyruypswsvzux|pswmptux|tw{wz~xy}xy}{|z{stxwz~wz~vy}vy}xznqu{|~{|{|z{wx|vw{{|{|{|suvwyz{}~y{|z|}{}~|||nnncccttt}}}{z|xwy~}|~||~{z|yxzzy{suvrtvxuwytvxuwwtvxuw~{}|y{}z|}z||~|~|~|~~{}wtv}}~{}}|~{xz|~~|~}z|}z|}~~{}Ʊ¥ΰ¥chqnpzyw~|{{z|~vuw{}~~zy{yxzvvv{{{}}y|x{zx~{y~~z}x{tz{rx}w}v|sw|yz~pqu|}}~z||suu|}}z||}|~~z{{xxxzuvzuvwrs{vwxstsssxxxqqqssswwwsuvqstsuvvxysuvsuvsrtrqsrqsutvsrtqprpprpoqpoqrqspmoroqroqroqsprtqskhjolnkhjmjlmjlkmnhjkhjkjlmjlmljlolnplnqnproqqprnrsnrspttpttpttrtuqstprtoqrkmnrtvsuvtvwtvxrtu|~yxztsu}|~xwy{z|{{{wwwvvvsuuuwwtvvuwwtvvwyy}|~~~|~~{}}~~~zzzuuu~z|}xzzuww|~z|}yvx{xzvsuolnֱٓ{{{}~|~}{~}|~|~~{}~}|~|wy}~{}|~z|vqsnik|wyz}{}~{}|y{~}yxz{uz}w|zzz{z|}|~zy{}|~{}y~}y~{{{}y~||x}~z|~z{{vrw}y~|x}zv||{tsw|{~~}~|x}|x}zv||x||x~~z~zwsxuqvuqvvrwvrwvrwvrwplqnjookpokpposmlpnmqkjnnmqlkohdihdikgljfkiejQRVTUY\]aZ[_^_c_`d_aeabf`bfdeifgkdeifgkhimijnlmqkmqlmqkmqoptnptoqulosmptnqujmqhmpntwouxnuxmtwnuxpuxsx{uz}rxznsvsvzruyqtxqtxux|nqujmqruyvy}ux|wz~xy}vw{yz~yz~nosruyv{~uz}ty|puxknr|}yz~}~{|xy~xy~xy}xx}yz~yz~{}~rtuvxyvxyxz{zz|zyyrrr|{{noo~|}|z|zy{zy{~~}~~~|{}}|~|~y{|~|~~~{}{xz|y{|y{}z|~~~|~~{}vsu|~~}z|}~{}yvxvsuzwy{xzyvx}}}||z~~}Ѹ±ɲ±÷ɱmr{vx|{~{z|~~~}|||}}~~~}~~z}{y~~z}y}x}z~~x}xy}||~zzeggvyyhjjxzz||x||x}|y}}wyy}xzzuvzuvxstzuvsttxxxtuutttxyyrstprsrstvxyrturtutsurqsrqsvuwsrtqprpoqonppoqrqsliknkmpmoolnolnnkmpmojgiolnqnpmjliklggiehiklmjlmmjlolnpmoqnproqonpsvwrvwqtuotuqtutvwsuvrtutvwxz{suvtvwuwxuwxdfguwxywzvuw~vtw{z|~~~vvvjjjnnnvvvtvvxzzuxxxzzvxxxzz~|~~|~~z|}{}~~~xuw~ѴڤζĠĘŧɗ}}}~}~|}|y{~{}~{}~}|~|~{}|~~z||~{}z}{}~{}}~~|~}|zzz~}|~wvx{yuz{w|~~}yu{lhmwsx~{}|{w|yuzyuzupv}y~|x}|x}|{utxzz~zy}||xtyrmszv{|x}|x}zv{{w||x}{w|yuz|x}xsxwsxwsxwsxvrxqmrokpqmrokpoorjimnmqonrmlpkjnfbglhmjfkjfkkglTUYVW[[\`Z\`bcg^ae]be]ae]cf`dhbgjdeiffjghljkoklpjorimqjorimpnsvoptnnrnospquhjninqnptprvpuxw|lsvrwzrwzrwzrwzotwvy}qtxsvzsvzruyqtxpswruyvy}vy}vy}vw{wx|yz~vw{wx|xy}uw{xy}vx|stxww{|~{}}hjkknny{|wyzxz{|~z|}z|}}|zy}xw{{z~yx|utx~w||wzzuxx~|{yx|}|~~}~}{z|~}|}|~|{}|{}yxz|{}|zz~||zxxxwv}~{}~|~~{}~{}}}z|}z|xuw~ˮ޲¼˸ǟͬ|{}~z~|x}yyz~mnr|~vw{}{||}}{|}w{vxxz|~}|zx}y~ty|quxyuzwswtpuurvvrxqwvrvuqvurvuqvuptuptuptunstostqstrqsrqsrrtrqsrqssprqnpsprsoqtqsqnpyvxvsutprjgipmoqnpolnqnppmoolnmkmjfhkikplnmjlpmoplnolnpmoqnproqtrtrrtpoqxyzwvxvxyrtuoqrrtuqsttvwqstwyztvwvxywyz{}}xzzuxwwzysvvvvvpppzzz{{{vvvzzz{{{zyy|||{{{~~~}~{~}uwwwyywyy~o|zgtq~z||~{}z|}ɢμȶƞz}{~~}}|~{}}}}~toq{}|~}~y{{~z}y|z}{~~y{{}{}{}~}{zzz~zwy|~zv{{~y|x}~~y{{vx{}~{xz{xz~{}yvx~{}|yz~{|yvxxvwzv{tpu}y~{xz|~~{}|y{|z{{w|zv{yuzxtyyuzyuzposvuyutxuuxuuxyuzuqvtputpuvrwnjookprnsrnslhmninminnjokglminiejVW[WX\Z[_[\`cdh_bf^cf^cf\ad^cf_dgdeiefjghlhimfgkfknlqtjorglolqtoptonrnosrswz}ty|rswwx|qvyqvypwzqvyqvyqvytz|puxpswruysvztw{ux|rvzptxruytvzux|wz~yz~vw{vw{yz~yz~z{{|wx|xy}xy}stxxz{uwx{}~|~tvwwyzz|}vxyxz||~~}}|{z~{z~wvzwvzfbgtpuyuzzv{|x}}|{z~}||{~}utx~}{}~xz{{}~{}~||~{z|zxzwvxvuwqnp]Z\spr|y{sprjgi}{{}{{{yy{yy~|~~{}}~|y{~{}}z|~{}yvx}xz~ִøǮ|~~~~}~}|~utv|{}}|~~~~y|~{stxopt|}xy}|}}{zwzy{z|vxtv~~||zzx~zx~|zprvorvqsxwz~ux|uvzyuzwsxvrwwsxxtysuusuusuusuusuurturturturttrttrttrqsrqstrttrttrtroqurtqnptqsurturtxuwsprurtpmourtqnpolnpnppmoplnnkmlhjlikqnpmjlpnppnppnppmoqnproqrqsqpronputvsrtxz{tvwnpqprsrtutvvqsttvwvxyvxyxz{y{{z||wyyxzzwyyuuunnn|||rrryyy|||~~~}}}zzz~~~~~~}suuqpr}z{{~|~|tw|}~~|~pkmz~x{y||~~{}y~~x}}w|zzz|~~{}~z~{{w|zv{zuwzuw~y{z|}wtv|y{~ifhpmowtvzwyvsutqs{xzzwy|y{{xz~{}}}~zxtzzv{dacpmozwy|y{zv|zvzxtzxtyyuzzv{tswzy}yx|xw{xw{wsxmintputputpunjolhnsotsotplqnjoiejokphdikglkglYZ^XY]ZZ^Z\`bcg_bf^cf^cf^cf_dg_dgcdhdeidfjfgkdeifknmrulqthmpmruoptonrnospqumptotwvw{~nsvmrurx|qvyqvyqvyv{~puxqtxtw{ux|svztx|tw{qtxruyruytw{wz~yz~vw{vw{yz~yz~wx|xy}wx|jkovw{uvz}vxyrtutvwxz{z|~vxyxz{z|}|{~}|{zz~yx|vuymhmlgl|x}~zytz~}{z~~}|xw{yx|~~~|~|{}yxzwvxzy{zxz|y{{xzxuwxuw|y{}z|}{{}{{}{{~||~||~{}|y{~{}|~}~{}}~}}}xwy~šūsvz~wvx~}|{}zy{~~~kpsz|}~{|pquvxyz|}~~|rzyruz}sv{usy}}uvzx{tw{stxyuzwsxtputpuvrwsuusuusuusuusuurturturturuvruvruvrqsrqstrttrttrtroqroqwtvtqssprtqsurtrprroqnkmrnpqnpolnplnpmopnpolnnkmnlnqnpnkmpnppnppnppmoqnproqrqsqpronprqsqprprslnogijprstvvvxyz|}wyztvxvxyuwwwyyz||wyynppvvv{{{zzzzzzwww}}}~~~}}}}}}{{{}}}|||~~~~~~}|x}|}~xzzvxx|~{}~svzvz{x~z~}~~}~{}~{}īЯρ|~~}~y{~{}|wyytvxsuz~x{{~|~}~|wytoq}xz}zz{zzz~{}}z|~{}|~z~{||~{}|~~}|wy}|y{~}~}z|~}yuzyuzxtxxtyplq}|y{tqsyvxwtvzvzyuzxtyxtyyuzzv{zy}~yx|xw{vuysottpuokprnrqmrnjojfkvrwsotqmrlhnlhmokpkgllhmplq\]aYZ^YZ^Z[_]^b\_c[`c[`c\ad\ad\adbdhdeicdhfgkhimejmglojorfknlqtoptonrnosnosnptotwpqubcginqmrusz}ty|ty|tx|v{~otwruymptpswpswtw{ruysvzruyux|tw{svzvw{vw{yz~xy}xy}z{xy}vw{xy}vx|xz{tvwuwxvxyqsty{|{}~~z|}tvwxw{~}{z~zy}|{rquonrfei}||{|{|{wvzzy}|{yx|vuywvzzy}zy}{}~|~z|}xz{prs|{}xwyrqs{z|~}~~{}{xz~{}}z|zwy~|||zz}{{{yy}|~~{}|y{|y{~{}{xz}z||y{{z|}z|wrtŸȶŴòȷŗsuyzy{~~~|}{|}|}tuy|}{}~v{zv|{gonptympuorwpntnlrxv|jhnjko~rswwx|uvztuyyuzwsxvrwvrwxtyuuuuuuuuuvuuuuutsutsutsuutvvuwvuwrqsrqsrqsrqsrrtvsujgiroqpmopmoqnproqsprnkmnkmqnpolnolnpmoqnppmoqnppmojgimjlolnpmoolnpmoqnproqtsusrtrqsrqsrqsy{|qstrtuqsttvwsuvoqrtvwsuvqstwyywyyuwwsuunppqqqtttxxxttt}}}|||}}}|||~~~~~~zzz|||~~~{~|uzy}~x|֒ ~}~}|~~|~~~y{{~z~{~{~x{|wy~~}|~~x}y~{zzz}|~|y{wtvxuw|{w||{z|z|~z|zwy|y{vsusprvsu}z|~{}wtvyvx{xz}}yvx}|x}vrwzv{plq~{}vsu|~yuzxtywsxxtyyuzzv{wvz}|vtxsrvqptuqvxtyplqokpnjonjohdiwsxqmrplqjfkuqvplqjfkhdilhlUVZXY]Z[_^_c`ae\_c[`c[`c\ad\ad\adcdhcdhbcgdeighlgloinqhlpbgjinqlmqrqunosnosorvpuxqrvqrvotwqvypwzty|qvyuz}ty|rwzsvzorvpswruyruyvy}ux|svzsvzvy}wz~yz~yz~xy}wx|wx|xy}pqurswppt{|~y{||~~rtuxz{wyz~y{|yx|{z~|{qpt}|vuyqptlko}|~}~}~}~~}}|xw{|~xz{z|}~zy{yxzzy{~{}}|~}z|}z|}}}}}|zz}{{~||}}|~|~}z||{}|~}}|~}}ΫĶų¶Ž̮}~}|{}utv~}{z~}v{~~|}puxqvyvz~|~xz{{}~|}{|{|yxzzx~pntzx~~~yz~vvzxtyxtywsxwsxwsxuuuuuuuuunnnrrrsrttsuutvtsuooqnnprqsrqstsusrtrqsurturtrnproqsprroqqnppmoqnpqnpqnppmopmoolnolnolnolnnkmplnvsuroqqnpliksprqnproqtqsqprrqskjlqprvuwnpqnpqoqrsuvrtuqstuwxsuvtvvqst{}~z||y{{~y{{wwwxxxzzzyyyxxxrrrwwwwwwooowwwwwwzzz~~~}}}|||}|tyxx}|~{}~~~}z|y{|x|ѼҜӣïz|{}z||~}~~y{~}{}}{}{~x{}z|~y{{}~}zzy~zzz~{}~{}|~|~zwy|x}|}y~~}{}}xzz|z|~{xzzwy|~xuwwtvxuw}xuw~{}}z|{~zxtyzv{{w|sprzwy|y{zwy~{w|xtyvrwxtywsxxtztswmlpsrvutxtswvrvzv{yuznjogchmineafuqvjfkokpokpjfkkgljfkjfkhdiabfZ[_WX\Z[_WX\X[_X]`[`c\ad\ad\ad`aejkoklpijnefjhmpglodildjlhmpmnrqptpqunosnptnsvqrvrrvrwzsx{ry|uz}sx{v{~v{~ty|svzpswptxorvux|ux|tw{svzvy}vy}vy}yz~yz~yz~yz~yz~vw{xy}xy}wx|vw{mnrxz{tvwtvwoqruwx}{}~~y{|wyzxw{xw{}|xw{rrvzy}nosstxuvz|}xy}vuyposyx|zy}~}vvzxw{{z~tswxw{{}~z|}}|~xzzhgixwywvxxwyzwy{xzzwy}z|}z||~~|||zz|zz|zz}{{}~~{xz~|~~{}}|~|~Ŝͬqvy~}~}|~yxz~{z|{z|~|{}z{}~{}~~wx|{|{|}~|{}ooolnnkqplsrvz{vz{kopuyzquv{y}{|zvtzvuykimrqu|{zy}yx|uqvvrwwsxwsxwsxwuuwuuwuu{yyxvvyvxwtvurtvsuxtv{xzrrtrrttsusrtrqsurttqssprtqstqsroqqnppmoqnpqnpqnppmopmoplnplnplnnkmmjlnkmpmopmopmomjlsprolnolnpmoqprrqsnmorqsvuwrturturtuprssuvuwxqsttvvsuvuwxvxysuusuuoqqrttxzz{{{uuusssyyyyyy|||~}}}}ůňë£wtvz|{}}z|~}{}~~~}|~}{}z~slox{z|}z|~y{{}{}{}|v{~x}{zzz}z|}z|}z|~{}|y{}y~|~z}y~~~y{|~{vxtqs~|~yvxxuw|y{}z|~{}yvx}|~|y{{xz{~zzv{zv{{w|yvx|y{xuwzv|xtxwsxwsxwsxwsxjimnmqsrvutxtswvrwtpuplqrnsplqminkglplqminplqplqlhlkgljfkiejgchQRVSTX\]aZ[_[\`X[_X]`[`c\ad\ad\ad_`dfgkbcgbcgcdhbgjgloinqfknhlpijnlkomnrnoslptlrtrswttxotwpuxovyuz}rvzv{~v{~uz}svztw{rtxtw{tw{pswqtxpswruyruyruyuvzuvzuvzuvzuvz{|tuycdhefjqrvyz~}wyz{}~|~z|}|~{}~|~|~xz{xw{zy}{z~}|uvzxx|z{|{}|~}zy}yx|wvzy{|xz{~|~rtu~}~}}|~wvxxwy|y{~{}}z||y{|y{~|~~~zxx|zz|zz~{}}~}~~{}|y{|~~{}~}~~~zy{kop{~Ӥӿˀ~~}||~~}~~}|~qrv}~|~xy~|~~~|~|z~}utx{z~~}~}}|}|yuztpvwsxwsxwsxwuuwuuwuu~||qoourtwtvyvxwuwurturttrttrttsusrtrqsurttqssprtqstqsroqqnppmoqnpqnpqnppmopmopnppnppnpnkmmjlplnmjlplnmjlnkmrprolnolnnkmonprqswvxutvrqsprsprsprssuvuwxuwxqsttvvtvxwyzuwxqssxzzy{{{}}|~~|||zzz|||||||||sssvvv~~~yyy|||~~~}}}{{{yyy~~~~{w|}yvx}}z|}z|~~{}{}~y}w}֬ڧȨvqs}~|~|~|~}|~}{}z}x{x{z}}z|~y{{}{}{}~|y~zzz}z|}z||~~}{|}}{}{}{}}zuw}z||y{{xz}z||~~wtvyvx}z|~{}{~z~zzv{|x|{xzvsu~{}vsuyvxzvzwsxxtyxtzzv{wsxsrv~}srvutxtswvrwvrwxtysotqmrsotfbgokpkglkgllhmlhmjfkfbgiejkgl\]aUVZZ[_\]a\]a\_cZ`c[`c\ad\ad\`dabffgkefjefjfgkbgjeimejmdhkglojjolkooptnosloskosrswuvzosvotwpvyqvyptwrwzuy|tz|tv{vx}suzsvzruyux|svzruypswruytw{vw{vvzuvzwx|wx|uvzpqujkorswnosz{oqroqrhjktvwtvwxz{y{|z|}|~{z~zy~yx|wvz{~ruylosz}xw{~wvz}|~~}{z~yx}yx}~}~z|}vxyxz{z|}|z}tsu{z|yxzzy{}y|~{}|y{{xz{xz~{}{yyxvvzxx{yy|zz~{}{xzxuw~~{}xuw~{}|~|y{~}~ruv͡›Ťuy{~utv{z|{z~|}nuxw~~|~}pqunos{|{|}~|{{{||z~{jnnuxyy}}zx~|z|y}{~~}|{{z}yuzvtwwsxwuxwsxytuytuytutop|}{vxzuwytvyuwxrtvsutsutsutsusrtrqsurttqssprsprroqroqqnppmoqnpqnpqnppmopmoqnpqnpqnproqpmoroqolnpmomjlolnroqqnppmonkmnmorqsnlnmlnnmosuvsuvsuvillprsqstuwxrtvwyzvxywyztvvxzzxzzy{{z}}|||yzz{{{||||||vvvwww|||uuu~~~~}x}|}~rx~̦~~{vx|~{}{}|~}|~}{}|z}z|~y{{}|~~y~z{zzz}|~}z||~{y{|{~}upr~}~y{|~zwx|y{|~|~ywxvsu~urt~{xz|y{~z|~{~z|zv{|x}}z{yvx}{}pnozxyytzwsxyuz{w|~y~zv{wvztswsrvtswtswrnsqmrtpvsotokpminkglokpminjfknjolhmiejgcheafb^cRUYRUYTW[WZ^X[_Z]a\^b^ae\_c]`d^ae`aebcgcdhdeiefjegkijnhjnhhllnrjlmhjkoqrnqqoqqoqqoptwx|nossuyprvsuystxuvzyy}uw{wr}{uyvur}ts|quyt{{rxwtxyuvzttztvzvw{wx|vx|uvztuyyz~xy}rswrswxy}}QSTvxywyz{}~z||xz{xz{}|u|~yuy}wz~z|vy}nosppt{z~{z~}||{~~{}}z|}z|zwy}}||{zz{{{~~~zzzzzyxxw{{zvvv{{{wuuuss}z|}x~|x~|zzzxx}{{{yyz{z{~yz}~~}|{|zz~~~||}}srtŧw|{{z|~}}rqqedh|~~~zx}|}|~y}}~tuytuy|~{z|{{{{z{|}|zzzyyyxyzvyxsttceexyzvttvttvttrppnmmvuuuuuvuuvvvvuutttsuusuutvvrttoqqjopknojmnnoqpprurtroqroqqnpqnpqnpolnnkmqnpsprqnppmoolnnkmkhjifhpmoqnproqrprnkmolnpoqpoqmlnrqsyxztsutsutsuutvutvtvwsuvrtusuvtvwuwxzzz{{{}||zzzyxxywwzxxzxx~||~||~~~xzz{}}z||y||}}}|||{{{}}}~|~z{||z~~{y~~~{zyvx}}xxz{|}vuwqusʻ̤Ū|~~z|~y{|~||}~~{|~yz{||||~z||~|~}}{}|}}~|~}z|z|z|z|{}~~{}~|~|~}}x~|w}~y}{xtv{xzwtv|~~{}|y{~{}}z|}z|~zzv{zvzxty{{~wx|fhlxzttxwvzutxrqu}|utxutxwvzyx|{z~utxsprolnlijjgikhjjfk_[`d`eqmrokpiejiejkgliejeafd`eRUYRUYUX\WZ^X[_Z\`[^b]`d\_c]`d^ae`aebcgbdhcdhdeiffjijnijnijnoptnpqkmnnpqoqroqroqrnosstxmnrqrvpqustxttxvx|uvzstxtny|uxt~vs{ttypvxowvrxwrvxoptttzstxtuyuvzvw{vw{vw{xy}stxstxuvzuvzz|}~z|}wyzvxyz||z|}z|}{}~^^bxz~wtv~ptwjnrz}xy}|{zy}|{xw{utxyx|urt|y{}z|{xzyvx}z|xxxxxxyyy|||xxxzzzyyyzzzvvvwwwxvvwuu~~z|~z~~z~}}zxx|zzyww{yy}xy{|}~upq{vw}{{xvv~~}}z|~Ī¨¬ųǼд”~}~{z|}|xw{~v{~otw|{x||||{pmvxv||{}vvxyxzoqrmqrlqrv{|qtx^`emptux|z}rsw}~}|~}}}}}}{{{vvv{{{tvvvxxuwwjllvxxvttvttvttyww|zzuuuuuuuuutttuuuvvvsuusuuprroqqnppmrslpqlpqqprpoqpmoqnppmoqnpqnpqnppmoqnproqtqsrprpmoolnnkmlikroqpmoqnproqroqnlnolnpoqqprxwyqprsrttsutsutsuutvutvsuvrtuqsttvwuwxvxxzzz{{{xxxwwwwww{yy|zz|zz}{{}{{zzzy{{|~~y{{z||~~~{{{~~~~~{}~{z~x}~u}|~~rusɟĜLJ~{}z||~z||~|}||z{}~}~}~~|ux{~z}~y{{}~y{|~~y{z|~{}{}z|~y{|~~y{z|}xz|~xsu{}{}}wrt~wtv|y{yvxzwy|x||x}|x}sotzv{zwywtv|y{|~}z|zwy}}zv{{||x}xw{yx|{|x{vy}tuyxw{xvzwvzxw{}|xw{xw{}|vuyqpturtlikolnpmotqsrnsxtywsxminjfkiejhdilhmminkgllhlRUYRUYUX\WZ^X[_X\`Z]a\`d\_c]`d^ae`aebcgbbfbdhddhdfjjjnklpfgkmnrprsoqrnpqmopmopmopnospqumnroptoptrswtuyxx|xy}uvztnyyrvr}tq{rryptxltspvuquvz{xx~wx|vw{uvztuyxy}wx|xy}tuywx|xy}wx||~suvz|}tvwvxyxzzz|}{}~}{q~p}t}y|z{~||{|{|{{z~{z~zwy~{}zwyyvx~{}xxx{{{{{{~~~{{{zzz{{{zzzttuvvvzxxxvv}z|~z|~z~~z~~||zxx}{{zxx|zz}xy}~~~}{{zxx{yy|zz~~|~yxz٨Ϥ·˞~~}|~~yxzzzz{z~{|ips}y~v{~y~z{|~zy}~{y|z|{}|vz{}~x{{~z}}~z{yz~~uvz{z|{{{{{{wwwwwwvxxsuubdddffprrvttvttvttusstrruuuuuuuuuxxxwwwvvvtvvtvvprrprrnpplpqkoplnoqpronpsprurtmjlqnpqnpqnppmoqnptqsurttqspmoolnnkmnkmnkmpmoqnproqpmoolnqnplkmmlnonpwvxvuwtsutsutsuutvutvsuvrtuqsttvxvxxvxz{{{zzzzzz|||~~~}}~~}{{}{{yyykmmwyy{}}xzzy{{{{{}}}}}}~|~|w{|}|}~}{}~wzxսִǦƣɉ}~~|wy}|~zuw|~|~~{|}xy{|}~z{{~|{tw~wzz|{}~y{{}z|}}}{}{}~y{{}z|toq{}{vxzuw|~~yvxzv{yuz{{~z|z|~~{}}z|zwy}z||~~~|y{}yuzzv{uqv{w|xw{vuy|}z}svztvzzy}zx|wvz|{utxwvz|{~wvzzy}wtvtqsroqpmoiejiejokplhmfbgkglgchlhmhdib^c]Y^RUYRUYUX\WZ^X[_X[_Z]a\_c\_c]`d^ae`aebcgabfbcgcdhdeijkolmq^_chimprsrturtuqstqstqstpqupquoptoptqrvqrvtuyxy}wx|uvzwr{uozvt|trxrswotvnvtpvuptuuvzww}vvztuystxuvzwx|wx|{|xy}z{wx|{||~~wyzsuvtvwvxyuwxz|}}|~y~eorfwxexyhwyamotw{svztuyxw{~}|yx|zz~|z|{xz|y{|y{|y{zwxwxv{|zyzx}~|yzwz{y}~|yzxtusyzxzxxxvv|y{|z||x}}y~xvv}{{|zz}}}{{z{}~~~~~|||~~}tsuĥЦҰģy~}{z|rwz~ty|zx{w|~||{|zzx~|{}|y{}vz{zzz~|}z{yy}}}{|}~z{wx|}|~}}}}}}|||{{{zzzuwwwyy{}}oqqvttvttvttwuuvttuuuuuuuuuvvvrrroootvvtvvprrprrqssostoqroqrtqsqnphegtqsolnqnpqnpqnpplnnkmnkmolnnkmpmoolnnkmnkmpmopmoqnproqpmoplnqnpllnmlnonptsuzy{tsutsutsuutvutvvxyuwxrtusuvuwxwyz{{{zzzrrruuuyyy~||}}~~~~~~|||{}}~z||xzzy{{}}}~z~ihj~}~}~fkláįԭօ{}~}|~z|~~y{|vx}}~|}}~{|~{~z}|~~{}z|~snp~y{~y{{}{}z|~y{xsuytv|~|~|~{}vpr}~{}{{w|{w|xtzyuz~{}xuw}|~|xz~{}~{}}~|~|y{zv{vrwvrwxty{z~xw{xy}svzux|uvz{z~|{zy}}|utxxx|{z~{z~tswonrnkmroqwtvpmopmoiejnjoqmrmineafnjohdijfkiejeafb^cRUYRUYUX\X[_Y\`\_cZ]a[^b]`d\_c`cgbcgbcgbcgbcgabfcdhghlhimmnrjkokmnlnonpqrtuuwxrtuoptoptqrvqrvqrvtuyqrvtuywx|uvzzu~upyqovrpvrswnstnvupvurvvuvzww}tuyuvzvw{tuyvw{uvzwx|vw{wx|xy}yz~vxywyzz|}y{|uwx~~z|~}rwzunn}ywz~tw{|}|{zy}|{vuy|{vuy{z~}z|}z|zwyzwyzwy}{{yzx}~||}{z{y{|{{|zxyw~}|}{{|zywwywwzwy|y{~z{w|~~zxx~|||}{|}~}~ytu{yy~||~~uss}{{~|~|y{ưġåw|}}}|~~}xww}z}|~~|}zx~xz~~~yz~xy}wx||}xwy||||||{{{zzzyyyqsssuuvxxrttprrywwtrrvttwuuwuuuuuwwwvvvvvvwww}}}y{{prrrttqssprroqrnpqonppmosnplikpmonjlqnppmonkmolnolnnkmnkmnkmjgiqnpolnolnlikpmoroqqnpolnpmonkmmlnpoqrqssrtsrttsutsutsuvuwvuwvxyvxy|~~|~tvv{{{{{{tttxxxzzz{yy}{{|zz~||}}~~~}z||vxx{{{||||~|vw{}~|~~}~ļ͢ϭrqu}~}}z|~}z|~zvxvqr{|}~{|~{|~y|{~|ux}vyz||wyz|}|~z|}}{}~y{}|~{}|~z|}~{}zwy~{}|~}z|~z~z{w|~|~~{}~{}~{}|y{}{xz}}}z|}|~z}|x}|{}|{|qtxrtxvw{srvwvzzy}utxrquzy}{z~{z~vuyvuyxuwxuwolnpmonkmjfklhmkglkglkgliejokpfbghdjc_d^Z_RUYRUYUX\WZ^X\`VY]WZ^\_c[^b`dh]`dbcgfgkZ[_bcgabffgkghlfgkhimlmqkmnkmnkmnprsoqrmopoptoptmnrpptrswrtxrswstxstxstxxs|yt}trytswqttotuowvsyxswxuvzuu{vw{vw{vw{uvzvw{tvzuvztuyvw{wx|wx|wyzxz{vxyy{|y{|vxyxz{uwxy{|~rwzhsuk{}h{|`prbnpmptux|}~~{z~~utxyx||y{|z|{xzzwyzwy|zzzzvyzvuvqz|wz|wxzutuqz{wyzvxyuyww|zzwtvyvx|x}}{{}{{}{{~||z{|wx|wx{|}~~~}{{yww~{}|y{xwyɛװğӰw{||~~tsu~}|~}px{~z{|~mtwovyv{~~~{xyw}|zutvsrt|~~~}z|}}|yx|}|~xy}tuyz{zy{|||||||||zzzxxx}}tvvxzzwyy~||wuuwuuxvvvttsssuuutttsssrrrsssuwwprrrttrttqssnpqonppmormornpyvxifhlikqnpolnolnolnolnnlnnlnnlnlikqnppmopmomjlpmoroqpmotqssprqnpnnppprrqssrttsutsutsutsuvuwvuwy{|suvy{|prswyzxz{{{{{{{sssxxx|||yww~~}{{~||~~~z||z|||~~~z||}}}~}}uxw}~~ůª Šǯ~{xz{}|~}xtv{|{|{|{|~yz{|vor}z|}xz|~z|zuw{vx|wy{vxzuw}xz{}~y{zuwz|~y{{}{}z|z|{}|~}z|}z|~{}}z||x}{w|}y~{w|{w|}z||y{~{}zwy{xzxuw|~}z||~}z||y{{~zv|zy}}|wx|z}nqurswyx|yx|xw{wvzutxutxvvzposmlpposolnwtvolnqnpmjla]bvrwminnjonjonjolhmgchhdigchfbgRUYRUYUX\VZ^XZ^X[_Z]a_bf]`ddgk]`dabfghlYZ^bcgcdhcdhijnklpklpklpkmnkmnkmnmopoqrsuvoptoptlmqmnrpqurrvrswqrvuvzuvzsovtpvtsvqptrtuuz{w~v|{uyzxy}yyvw{vw{vw{vw{wx|tuyuvzrswtvzvvzwx|xz{y{|vxyz|}{}~wyztvwz|}w{~v~p~m|~huwox{los{|~}~}|{z~}|xw{|{zvx|xz{xzyvxyvx|zzz{wxyvuvrz{xz{xwxtrsoz{xyzvxyvvtt}{{~{}|y{zv{|x}~||{yy|zz~|||}}~z{{|~~~~}}~~}|~|y{}|~ÜĚutv~onpyyy~~~yyyqss~{wx}}|}}}|~}|{}|{z~~~}||||||vvvxxxyyytvvrttsuurttxzztrrljjxvv|zzvttwwwyyywwwxxxyyywwwuwwtvvtvvrttrttrqsqprroqtnptlpqmoqnpqnppmovsulikolnolnplnplnplnmjlroqqnppnpnjlroqroqplnsprtqsqnppprrprrqssrttsutsutsutsuvuwvuwxz{xz{tvwvxyxz{{{{{{{uuuzzz|||wuu}{{~~}}}|~~|~~~~~~~~~}}{|}~|~~ƬȨйĦ~wtv}{}|~{}}}z{{vw{||}{|}~x{}~|ux|~~|~~y{}xz|~~y{z|}}|~{vx|xz}xz}}xzpkm}xz}zwy{xz}z||y{}z||x}{w|{w|zv{}y~~{}|~|y{}z|}z||~{xzyvx|y{|x~zv{||x}yuz{z~|{xy}knrsvzpquonrqptsrvsrvsrvsrvrquwvzonrlkoa^`pmoqnpsprroqokpgchiejlhmgchc_dd`ed`eXTYa]bfbgRUYRUYUX\VY]WZ^X[_X[_]`d^ae^aeY\``bfdfj`aebcgddhghlijnhjnhimghlkmnmopoqrnppmpprttoptoptmnrmnrmnrpqurswopttvzvw{xtzrouwvzwvzqssrxvpxxryxmqrsuywx~xy}wx|vw{vw{xy}wx|vw{rsxstxtuzuvzxzzz|}y{|{}~z|}|~~tvwxz{wyzz|}kmqovyp}x~ux|||}||zyx{zy}yx{vuy{z}xuw{xz{xzxuxxux{yy{}wz|w|}x{}wz|w|~xz{v|}x{|wwutwvvzwyzxz|y}xux~||{yy~||}{{|z{z{~yz{|z{{{~||}}zxx}}ǣλ΢Ȓz|}~~wvx~||~~~|~{sx{kps||}|~~}{z|~~}|~z{yz~wx|{|~||||||{{zwwwwyyrttxzznppy{{zyyxwwwvv}||uttuuuwxxvwwsssxxxwwwqsstvvtvvsuurttttvvruurtvpstnqlgirprnkmusuqoqusuolnolnpmopmopmoliksprqnpqnpmjlsprroqolnlikpmoqnpsrtrqsrqssrtrqstsutsutsuvuwvuwz|}oprtvwuuwvwx{{{{{{yyy{{{yyy}{{}}}{{~||~||}}}vxx}~x{z~}~~z~ztxy{}~~fhi{z|}x|swxʒޙФ~spr}}~|~{~|~~{vw~yz~yz|}~yz|x{zsvrkn|~}xzzuw}xz~~xz|vx~}xz|~zvx{}~z|}xz{vx{}}xzxsuxsu}{xz}~{}|y|~|~}{}z{y}|y~~|y{~{}}~{}zwy}z||~xuwyvx{w|yuz{w|~zzv{xw{srvuv{z}yz~}|ttxutxsrvqptutxsrvnmqmlpsrv|y{urtqnppmoroqninmhmninhchidikfkidjminlgmminfafRVZTW[VY]UX\UX\VX\X[_Y\`[^b[^b[^b`aecdh\]aabfdeideifgkhimhimhimijnklpmnrnosmnrlmqnnrnosnosnosnosqrvtuyrswtuyrswstwprvtuywx|lmqqtwisvhsujuwmxzny{rvzsvzux|ux|ux|uwxwyzsuvrtuoqquwx|}vw{xy~z{yz~tw{vy}x{x{vy}jqtnwzx{vu~x~wzx{{zvu~}}}gfgqqqwwxvvvzxxzxxzxxywwyww|zz}z{|y{}{||}}}~yy{{|xx~zy|xw{z~yy|xxzz~zy~zy~zy}||~}~{}~z}|~}}|~|y{pmoţФ}{{|~}~~{|x|{zz|~{~{~}|wxz{|}}~}}xz~}|~}~}~}~~}|~|{}tsv}|~|{}wyyrttwyyvxxxzzuxxptskooptsyyyxuuwuuwuuwuuuuuputputoutputputwuuvtttrrsrqpnntoquprwrtuprzuwsnpsnpsnpqlnrmosnpsqqommqpopnnsqqqnppmoolnolnpmoqnpsprsprtqspmovsuwtvuqsyvxyvx|xzywyvsutrtzwyywyzzzzzzvvvzzzzzzzwy|x{{xzwtv{wzxwy|z|{z|}~}|x}~}~~|~x|}|}~poqtsuxx{޵Ͳ»̯űò|~~yz}~z{}{}|~|~{}|~|~|wyytwxsu}xz{}}xz|~}xzytv|~~{vx{}{}|wy{vx~z|ywyxxzzxzzz|xvx|wy{}{vx{}~~|~x{|w|}z~~twxx{|vyz|z|{xz~}z|~{}}{w|{|{w}wsxzv{{w|{uqvutvpoqrprutvqqrzy{{z|wvxrrsrrsrqstswtswrquonrnmqnkmqnppmoplnmjltmroflpgllcimdjd[aibee_ajcfgaciadTVZTW[TW[TW[UX\TW[WZ^\_c[^b[^b[^b`ae_`d_`ddeiddhdfjfgkhhlhhlhhlhimjkolmqlmqlmqlmqjkolmqnnrnnrnnrnostuystxrtxstxstxtuytuyxy}nnrorvhtvjvxiuwlxzmy{x{x{vy}ux|ux|uwxsuvwyzy{|uwxprtvx|wx|z{z{wx|tx|vy}xz~wz~vy}pwzvox{xluxnwzw}qt|uwts|wvyyyiiiooouuuvvvzxxzxxzxxywwyww{yy}z|{xzpmoifh{|~zz~yz{vw|wx}yx|xw{z{z~zy|{~zy~zy}|{wvwsr{xz|y{~~~{}|~}z|}|y{{xz΄\[_|~z{iru{y{zxty|}vy}ux|z}zx}~{|}~~}z~||}wx|yxz|{}{z|{z|}|~y{{wyywyyy{{y{{y~}tyxv{znsrxxxvttwuuwuuwuuuuurttrttrttrttrttussvttxvvsqqrpptnptoquprtoqqlnqlnrnprnpqlnrmosnpqooqooussussvttqnppmoolnolnpmoqnpsprsprsprwtvjgisprtqstqsvsuxuwurtvsusprtqsvsuzwyxxxyyywww||||xzzxz{xz~{}~{}wvx{z|{z|{}tswxy}~~}~z|}|vz{~~|x{~{x}z|}~|{}~|{}{z|zy{yvx}z||y{|~вµĦϜ|~{}}~|}z||~z||~~y{|~|~|~|~~|~z||~~xzzuw|~|wyz|}xz}upr{vx~y{}xzwrt|~zy{|{}}|~yxz~}vrt{vx|~|~z|tqsqprvxyz||vz{v{|uyzswxnrsostquv|~|z||z|zwy{xzwsx}yuz}y~yuzzv{~zvrwzv{{xtyvuwsrtzy{utvutvxwywvxqprtsuutvutxsrvqptposposroqolnmjlpmoroqpinoekqgmukqdY_oglkfhlhjlhihdefacTX\RUYPSWRUYTX\UX\VY]\_c[^b[^b[^b`bf^_cUVZabfddhffjfgkfhlfhlfhldeifgkhimdeiijnmnrijnlmqlnrlnrlnrmnrstxstxqrvstxpqupqutuytuypqutw{jvxlxzmy{o{}nz|ux|tw{svzux|ux|uwxsuvwyzwyzvxxmopstxyz~wx|wx|stxvx|vy}vz~ux|vy}{xnuxovyv}tz}rx}{tw|ww}rrrrrs||}uuv|{||zzzxxxvvxvvxvvzxx}z||y{zwyz{{|}xy{vw{vw}yx~zz{z}yx|xw}yx~zy~zy~zy{wv|xw|y{}z|}|~~|~~|~~yvx|~|~~yvx~vuyzy{~}|y{}w~}{~xv~|~z}|{y~z||~y{|~}{}~x|}ux|}z{|{|}rsw}|~utv~yxzyxyzy{vxxtvvtvv{}}xzzx}|putputkposxwvvvvttwuuwuuwuuvuurttrttrttrttrttussvttxvvpnnussrnptnptprvqsnikqlnrlnrlnqlnrmosnppnnqoowuupnnsqqqnppmoolnolnpmoqnproqtqspmosprrprsprsprwtvwtvxuwvsutqsmjlxuwroqwtvyyyzzzxxxzzz}z|yvx{xzyvxwtvwvxzy{zy{|{}~z}y~wvzwx|wz~~}swxtxy}~{z~}~|zy{~}DZįijëɃ~|~~~}~{|{||~~z|{}~y{z||~|~|~~|~z||wy~~y{|~~y{{}zuwwrt{vx{vx~y{}xzvqs|{}vuwyxzyxzz|}xzz|{z|z|}xzztxzvz|rvww{|lppmqrtxy|~~|~yvxqnptqs~z|x}~yuzvrwvrwrns}}yuzyuz~tsuyxzvuwwvxsrtwvxtsuyxzvuwsrtrqurptposlkokjnhegjgipmnmjlpnoslqpinrkprkpd^chafgbde`bfacb]_`Z\UX\QTXNRVRUYSVZY\`UX\[^b[^b[^b[^babfabfXX\deicdhfgkfgkfgkfgkfgkfgkhimjkojkojlpklpklplmqlmqlmqlmqnptrswoptrswpquijnfgktuywx|rswruyiuwmy{q}r~r~svzux|vy}ux|ux|uwxvxytvwtvwuwxuwxz{wx|yz~xy}vy}vy}vy}ux|vy}v{~v}v~pwznuxqw}nrwfintszyyrsqrsqtus}~||zzzxxxvvwuuwuuzxx{xz~{}tqs}~{}|~{}~}xz{vx|xx|{{z{z~zy{z~zy~zy{z|{~~}|~~{}}|~{xz|~УÉŘ||~~}}~}y{|~{~{}}}}ux|}~}~}~~z{~wvzzy}xw{~}{z}wyyrttoqq{}}uwwuzyqvukpoy~}tttusswuuwuuwuuwuutttttttttttttttwuuvttusspnnvttrmosnptoqzuwqlnrmoqlnqlnqlnrmosnpsqqqoovttqoorppqnppmoolnolnpmoqnproqtqsurtvrtxuwurttqs{xzzwyxuwyvxyvxvsu}roqtqs|||}}}~~~|||~{}wtv{xz~}~}}|ihlnostw{|{}|{}oqrrvwfjkz~||~~}rtu~~~{{yvxlhm̻ʿиѭƬƞ}~z{{|{}~y{z|{}~y{{}|~|~|~z|{vx}xzz|{}z|~y{{vx~y{{vxzvx{}|~|wy~qnputvzy{xwypoqsrtzuw~y{~y{z|}xzvsutsuoqruwxswxtyz{x|}imndhiptu~{}yvxurtzwyxty~rntyuz}y~|x}~zyuz{{w||{}lkmtsuvuwxwywvxwvxsrttsusrttsumlpposutxvuy~}zv|rnssotojpplqtmrpinpinmfjg`e`Z_dacgdfebdcacdacSVZQTXORVPSW_bfVY]X[_X[_Y\`\_c\_cYZ^_`d\]acdhefjfgkfgkfgkfgkfgkghlefjhimklplmqmnrnoslmqlmqmnrklpklpjkooptqrvvw{optoptstxrswrswruyr~r~nz|wq}x{ux|tw{vy}svzy{|z|}qstvxxxz{|~zz~yz~z{vy}vy}vy}vy}y|{~z}uz}ty|jqtafix{stx{|qrpjkimnlijh|}{}{{ywwxvvxvvywwzxx|y{zwy|~wtv}z|~y{~{}zuw{vw{z|xw|xw|xw{z~zy~zy{z}|~}|~|~|~|~~~{}zwy}zwy}ȏ}|wvz|~xwy}|}{~wz~~|}|}}|~~{}~~~{|z}~rswyz~|}z{}{}{|zyw}yv}}|z||}xzzvxxy{{sxwqvusxwputlqpsssvttwuuwuuwuuywwtttttttttttttttvtttrrsqqsqqsqqtoqrmosnp{vxwrtrmoqlnqlnrmopkmsnptrrusssqqpnnpnnpnpqnpqnpolnnkmpmopmospryvx|y{|y{urttqs{xz|y{xuwxuwxuwurtvsuurtyyy|||zzz~~~{xzzwy{xzyvx|y{zy{{z||{}xwyxwy~{~~}}~txyz~z|}~{|z~}lln~{ਨѵƥƛ˕}~{}}z|~yz|}{|z{~yzz|z|z|}xz|~|~z||wy~y{}|~~y{~y{~y{}|wy|wy}|xz{vx{vxz|ytvwrtsnpyvxzy{utv{z|srtvuw|wyz|{}}xz}z||{}|~y{|quv||}{uyzlikxuw~zvx~{}~z}y~{|x~|x~{w|{w|{xtyxtywsxxwyyxzxwyzy{poqrqs~}vuwrqstsumlnkjnjima`dmlpkjnlhnplrvryokqokqtnslfklfkichf`ee`eifhc`bdac]Z\]Z\UX\QTXTW[ORVORVVZ^WZ^Y\`\`dZ]aZ]aXY]`ae]^bddhfgkfgkfgkfgkfgkfgkghlghlhimhimjkojkolmqlmqnostuyfgkrswjkomnrstxrswrswnosqrvvw{tuytw{lxzgsufrtjvxp|~ux|tx|wz~tw{wz~rtuvxytvwxz{qstoqrprvrswz{{||}vy}vy}vy}vy}ux|tw{mpttv{wz~wz~sx{_ggkpqnrs|~|~oplhieghdoplz{w~~zxxvttxvvywwzxxzvxxuw|~zwy{xz}w|{u{ysy~x}~x}~yz}|~zy|xw|xw~zy~zy~zy}yx~zy|{}z|}z|}z|}z||~xuw~{}~~{}̝iioɴǢͲxw{tsuxwy{}~|~~}u|}~}}}}|~|{~|~~~}~z|}{|z{yzx~yw}|{~xzzrttsuutvvvxxuzysxwtyxuzyx}|wwwxvvwuuwuuvttxvvvttvttvttvttvttwuuzxx|zzvtttrrsnprlnsnpxsuvqsrmoojlrmopkmpjlqlnrppsqqqoopnnpnnplnplnplnpmoolnpnppmoroqroqvtvxuwroqqnpxvxyvxwtvvtvvtvvtvxuwzwy|y{xxxvvv~~~yyy|||~{}zwyyvxwtv{xzvuw{z|~yxz{z|~z{}~x{~}z|~x|}~}|z~uyzx|}z~x|}tyx~~~zzz~~~zy{yxzz|}vsuyvx~{}}~z||rlqȪƟǻʧϡ~zwyyvx~{|z{~yzz|z|z|upr}~z|z|z|}xzz|{}~y{~y{z|z|qlnxsu~y{}xzzuw~y{}xz}{vxqnp|{}wvxzy{tsutsu|wypjlvqs{vxxsuvsuvuwy{|vxyswxsxynrsptuuyzuyzw{|gdfvsuzwy}z|~{}{w|}y~|x}|x}~z~wsxxtyxtytpuutvutvutvzy{wvxtrtrqsonprqsvuwonrxw{|{xw{sounjpvrxnjpplrrnslhnlinifkhdiiejkjla`bgfhedf``bRUYWZ^ORVRUYY\`WZ^Y\`\_c`cg[^b\_c_`d_`dabfdeiffjfgkfgkfgkfgkfgkijnklpklpjkoklplmqlmqlmqnostuyfgkqrvxy}uvznosmnrnostuytuyqrvpswmy{iuwo{}lxznz|z}ux|tw{tw{mptwyzxz{tvwwyzrturtuwx|xy}tuyvw{yz~vy}vy}vy}vy}z}{~qtx~ux|w|dllsxyptuwxtstpoplnokuvr|zzywwzxxxvvywwzxxxuwwtvroqurt~{}}w|y~z{y~}xy}yx}yx{wv{wv~zx~zy~zy}yx~zy~zy}z|}z|}z|wtv|~~|y{{xz~Œ~}}|~}~|wz{{{{~|z~}|~|}~~{|}z|y{x{xyvzxz||y{{tvvy{{y{{txxsxwuzyrwvputwwwxvvwuuzxxsqqussvttvttvttvttvttxvvusstrrwuutrrrnpqlnrmotoqtnpsnpqlnqlnpkmpjlqlnrppsqqqooqooqooplnplnplnqnpplnqnpsprtprnkmqnpqnproqqnpwtvwtvxuwvtvvtvvtvvsuxuwzxzwwwssswwwyyy~{}zwyyvxxuw}z||{}|{}}|~zy{xwy}y~~z~|}x{~zy{}|{z~}|~txy{|}him|{}|{}}~z|v{Ȼȯɽ̧ƙ|~}z||~|}z{{|z{~yzz|z|z|}|wy|wy~{}~{}{}z|z||wy|wy{}}xz~~}xz|wy{}~y{{vx{vxz|zwy~~}|{}}|~{}z|ytvzuw{vx~~}rtuw{|w|}w{|vz{x|}vz|w{|zwytqs|y{~{}}z||x}wsxxtyzv{wsx|x}}y~~zwsx|x}{xwyxwyxwyutvonplkmkjlihjlkmgfhwvxonrgfj_^ba`dgfjjennhrjeonispjtplqnjolhnjfkhdihdiihja`b`_aa`b_^`PSWRUYPSWQTXQTXSVZVY]Z]a\_cWZ^[^b_`d`aecdhcdhffkfgkfgkfgkfgkfgkefjijnhimghlijnijnjkolmqlmqmnrklpoptcdhjlpprvprvpqunnsrswsuyoqvmqukwznz}r}r~p}~ruyquysuzsvzqtxqsttvwwyyz|}kmnfghpqustxqrvtuyxx|vy}vy}vy}vy}wz~wz~svzvx|z~wy}rwznvvnstswxorsvwruwqsuo|~y}|zxxwuuxvvywwzxxzwyyvxroqxtv~{}|u||u|{u{zsz|v|{|~yxzzzvu{vv}yx~zy~zy{z{zzz~{}~{}~{}|~{xz}z|~~~{}}bajǤ~}~~}|~{u{|~|qtxzz{{{~~~}~}~}~~|}}z|z|y{xyvzxxzzxzzrttz}}{}}qwvqwvtzyqvuqvusssvttwuu|zzrpptrrxstxstxttxstwstwuusqqpnntrrtrrrmopkmqlnrlnrmouoqtoqpkmrmoqlnsnpsrqtsrsqqqooqoopmopnppmoqnppmoroqurturtwtvxuwurtsprqnpyvxwtvvsuxtwxtwxtvyvxxuwwuwwwwttt}}}{xz{xz}z|}z|~}}|~~|~~}~{}vuwx{|{{~{~x|}y}~}|||xxx|}||}|~z|}zvxxuw~|uzӼɮҩǝȪ}~{|{|z{~yyz|z|z|~y{}xz|wy~y{z|~y{}xz~z|z|z|{}}xz~z|~y{|~zuwz|~y{z|}xz~y{z|}xz|xz~|~tsuvtvxwy}{}z|~y{|~z|zuwxvxqpruxyuwxtxxpuv~{y~||~yvxxuw{xz|y{~y|x~{w|}x~}y~uqv{wsx{w||x}wwywvxwvxxxzxwyutvyxzwvxutvvtvqprposwwzww{vuyonrkgpsnwxs|qlunhrlhnminkgliejd_eb^bdbdb`bcbd`_agfhMRSSXXRWXRXXSYYTXYVZ[Z^_^bcX\]W[\]ab]abbfg`deaffdfgfiifhiehhehhdeicdhhimhimhimijnnoslmqpquoptnptoqrostjornsxnsyoqzpoymmyop}proslwlxoyr|wv~qx|u{~pswilpnqvruzrvzruyvy~tw{optoptxy}xy}xy}vw{xy}ww{{{z{yy}{z~xx|~|wx|uz{tyzntux}~y~zwwvttiggvtszxx|zz{yyxvvywwzxx{yywvxutvwvxxwyyxz|uxzswy|vnrx{|~}{|}z|zxyyvy~{|}z|~|}}z|}z|}z|}z||~{xz|~{xz~|~}|~}z|}z|}z|{}xsuxu~~ppptrrǖ||}z}vy~~wznkovqs|~}|{}}yy{~~|~|~}}|{{z~xw||{|{utwzzzzzzvvvxxxtttsuusuuuwwwyyprrpoovttwuuvttxvvvvvqutqttpttosrnrrtrrussvttwuuwuupmopmopmoolnroqnkmrmo|wynikpkmsnpxsuwrtvqstoqvqsroqqnpsprroqqnpsprwuuwuuwuunllomlrpr{xzroqvsuvsuuuuvvvwwwwwwyyyxxxy{|uwxxz{Z]^jlm{w|uqvsot}x~~|{~||{~|z|zy{~|~wvx~|~|y{ªzuw~{}}~{}{}~y{}xz~z|~|~z|}xzz|}xz~y{vqs{vx~y{{}{}|~~y{|wy|wy}xz}xzz|~xz~y{}xz~xz}xz{vxz|{}{uw|~~zv|wsx|x~wsx{z||{}utvvuwwuxuuvvwxz|}qsttvwz|}vsudacxuwyvx{xzxuw}z|xuwzwy|y{qnpwsxzv{|vrw~zxuwzwyyvx{xzxuwsrtwvxutvonponppoquqvtpuminwrwjfkjbi`Y`plrljpjhnlgnkgnmiojfk`]_\Z\X[ZZ]\]__`bb_aaQVWTYZRWXTYZW\]X\]UYZX\^^bc[_`[_`aefaefbfg`de^bcdfgfhiiklfhifhiijnhimhimijndeilnrstxnosnnroptrswlpqquvotwlrwhpwlmwopzpr}xz}u}tp}nxuu~ox{u|v}rtxmptsvzorvqtxux|tx|svzstxwx|uvz{|zz~yz~xx|tuyoptqrvedhyx||{vuyxw{stxquvostimnmqruxyxvvwuuommwuu{yy{yyzxxxvvwuuxvvywwwvxwvxxxztsuxwy|xzzvx|xyytv{}zxzwtvxuw{xz{xz}z|}z|~{}}z|}z|}z||~}z|zwy|~|~~{}|~}}|~Ȩ¬ƨ~~|~|z}x{vy~ux}x{x{}~|}x{|~~{{xx~|~~|~~|~~|~|~~}~zy{{{{{{{zzzzzz{{{z||uwwuwwtvvprrjhhwuu{yywuuywwwwwsxwqvuotsnsrmrqsqqsqqsqqtrrtrrpmopmopmopmopnpplnqlnwrtojlqlnsnpuprtoqtoqtoqrmorprrnptqssprroqtprsqqqoorpp|zz{yytqsroqxuwvsuvsuuuuvvvwwwxxxxxxwwwy{|uwx^`az|}~|x|~z~{z~}|~}utx~{z|}}}}}|~|{}}|~{z|{z||{~~~kporwv|~|}{lqr~~~zzzyyyutv~}~~~rpp~zsv|~ßʥ°ƧŖwtv}z|zuw|~|~~y{z|z|~y{z|}xz~y{zuw{vx~y{{}|wy~y{~y{xsuvqszuw~y{~z|}xz}xz}xz}xz|wy{vxzuw}xzxsuzuwwrtxtyzv{qmryuzwsxvuw~}yxzutvttvvtvuwxsuv{}~z|}vxyvsugdfzwy|~~{}yvxwtv|y{}z|roqxtzzv{|x}xty~z}z|wtvzwywtvxuwtsuutvsrtnmorqsutvsotxtysotqmruqv|t{|u|jflgekfdjjennirkgmfbgb_acbdeggceeceefhh]__PUVSXXPUVQVWUZ[X\]VZ[W[\\``VZ[aefcghcgh`de^bb^bcacdacdeghcefcefefjfgkjkodeibcgpqustxmnrklpnospqulpqpuvotwmtykszlnxrt~tweiwrwiq~jvjwcmtiszhquqz}sz}qx{ruyptxrtxrtxwz~tvztvzux|tuymnryz~|}{|yz~xx|tuywx|xy}utxzy}~vuyvuyuuyw|}z~vz{w|}|}{{ussljjxvv{yyzxxxvvxvvwuuxvvywwwvxwvx{z|vuwxwy}xz}xz|wy{vx|wywtv~wtvwtvyvxyvx|y{}z|}z|}z|}z|{xz}z|}|~{xz~~}z|}z||~}{}||{w|}{{~~|~~y{|vxy||~~~rquyy~~yy{{}}z|~z|~z|~|~~|~~|{utxzy}|{xwyzzzzzzwwwyyywwwxzzsuurtttvvtvvxvv|zzzxxwuuxvvwwwrwvrvvsxwrwvqvusqqvttxvvsqqsqqpmopmopmopmoplnpnptoqvqsrlnsnpsnpsnptoqtoqtoqrmosprrprtrttqsrprtqsxvvxvvussnllwuutrtroq{xzvsuvsuuuuvvvwwwxxxwwwttty{|uwxprskmnvxy{w|{w|~z{w|}y~}|~vuy~~}|~~z{~uuu|||zxxwx|̞ƲĮñǻѥ~~{}~{}{}{}z|z|}xz~y{|wy{vxz|~y{{}~y{|~|~{}{}}~z|~y{z|z|z|z|}xz}xz}vqs{}{}|x}|x}xtyyuzwsx~mlntsusrtvuwy{|z|}jlmprs{}~xuwwtvwtvzwyzwyxtvzwyxuwzvx~{}zv{zv{}y~|x}}y~}z|vsuxuwxuwzwytsupoqjikjikkjllkmtptrnsiejc_dkglUMTf_fjflqoujhngbknirmiohdia^`_^`]__Z\\VXXZ\\XZZINQNSVMRURWZRXZSWXZ^_VZ[Y]^_cd`deaefaef[_`\`a`deegh`bccefegheghcdhbcgdeidfj^_cdeinosjkoklpklpjkolqrmrshorirvit{qt}w|v{zr~lyuuvqz}pwzu|tw{tw{puxty{qvypuxrwzy}xy}z{rswstxvw{xy}vw{vw{stxvuyonryx|xw{zy}y{|uwxrtuvwxqsttrrommjhhzxx}{{xvvxvvxvvywwzxx{yywvxyxz{z|zy{xwywtv|y{~{}}z|zxz|y{~xuwwtv{xzyvx{xz|y{}z|}z|}z|}z|{xz|~~|~~{}|y{~{}}z||~~~{yx|~ĭ}fgkrswty|~~|}x{wz~xw{~vv|~~zzz|}z|}z|}{}~{}~}|~}}|yx||{xwywwwwwwlll{{{{{{wyysuusuuvxxxzzywwqooqootrrussuuunsrsxwsxwrwvputvttsqqpnntrrtrrpmopmopmoqnpnkmqnpxsuxsusnpsnpsnptoquprwrttoqvqstqssprurttqssprurtussxvvvttpnnussurtyvxxuwurtvsuuuuvvvwwwxxxvvvsssy{|uwxy{|}y~{||x}|{|{xw{~}|~srt~]\^~y{{~~lqr~~}}}}~|y{~{}~z|suvȴ}}z|}|~{}|~z|z|}xz~y{z|z|z|~y{{}z|{}}xzytvz|ytvz|}xz{vx{vxzuw{vxytvytv~y{}xzgbd|wyxsuyuzyuzzv{}y~wsxyxzyxzzxzwvx|{}~~prsgijrtu~{}|~|~zwy~{}{xz}z|~{}wtv|~}z|{w|{w|zv{{w|vrwxuwwtvtqsvsuwtvvuwvuwzy{|{}vuwrqstpvrnssotrnsqmrqiplelhdjigmigmpktlgpieklhmfceedfbddaccbdd]___aaLPUOSXPTYSW\RV\SWYY]^]abZ^_`de[_`Z^_^bb^bc[_`\`abdedfgacddfgacddfjfgkghlghldfjefjnosghljkoklpoptquvpxxjsveosirzls|qxip{irakyhtamwanvr|r|s|r{~sz}qx{svztw{ty|nuxnuxry|sz}x}z{xy}vw{uvzxy}xy}z{xy}xy}xy}tswxw{zy}zy}{z~{z~uxxz}}suvtvwtvwpnnjhhomm}{{|zz{yyxvvywwwuuyww}{{zy{yxzvuwvuwzy{{xz|xz|y{|~~~{}~{}zwyzwy}z|}z||~|y{~{}}|y{{xz}z|~{}|y{yvx|~}|~{~qq{{~~{}~|{}}|~vxy{}~}}~x{~||~~{{{{{}~z||y{|uwxuwx~}~}~}zy}zy}zy{uuurrrzzzyyyyyyxzzvxxtvvxzzvxxywwwuutrrxvvvttrrrmrqjonqvurwvtyxwuutrrqooussussqnpqnpqnpolnroqurttoqtoqrmosnptoqvqsrmormotoqtoqtqstqstqsroqurttqswuuywwwuuwuuwuuwtvzwywtv}|y{vvvyyywwwvvvvvvvvvvxzuwxxz{{|~~z}y~yx|}|}|~~~~~dffsuuafi~~bddȨʺР~{}}{vx~y{|~~|~|~{}~y{{}z|}|~|~~y{~y{~y{~y{~y{{}z|}~y{}xz{vx}xz|wy|wyz|}}xzz||xzzuw~y{|~zvxxtyxtyxty{w|zv{utvzy{xwy{z|zy{~}y{|vxy{}~xz{y{|~}z|~{}xuw{xz|z||y{zwyzwy|y{urtzv{yuz|x}yuzwsxxuwvsutrtwtvvsuutvwvxutvxwyvuwsrtvrwxtyyuznjogchphnoholhnjhnmkqnirnirgcifbghegedfbdd_aa]__]__\^^LPUNSWOSWTX]TX]VY]Y]^Y]^X\]]abZ^_[_`Z^_\`baef^bc`bddfgeghhjkceffgkfgkghlklpjkoklplmqjkomnrnosstxnvvqyyqz}tu{u~yz{x{toyjt{s|u~t{~ry|tw{ruyrx{ovypvzqx{ry|x}wx|rswrswwx|xy}yz~rswstxtuyrswvuyutxutxxw{xw{xw{tsu{z|}|~nmoigiljjdbbtrr~||}}}{{zxxvttywwyww|zzyxzxwy}|~|{}~~}yy{vuwsrtyxz{xz{xz~yvx~{}zwy|y{}z||z|~{}|~}z||y{~z|}~|~~zv|Ҩ~}°{z|~{}|y{~}{}|~{}~}|}~}~|~~~yyzz~~z|}xz{xz{{}~|{|{|{zy}zy}zz|yyy}}}yyyyyyyyyxzzvxxtvvtvvsuuvttvttwuuxvvxvvvvvputnsrqvuotslqppnnrpptrrtrrrpprnprnprnpsprnkmnkmojlojlvqsuprtoqsnppkmpkmtprtprtqsroqpmoqnptqssprwuuywwxvvxvvxvvyvxzwysprxuwyvxyyywwwxxxzzzyyywwwsuvuwxxz{|~~{w|||{w||zy}|||{zy}}|~}yww|{}}|~~}utvvuuvvvtvvx}|knrz||vuyy{|{}}~qss۩ʩðƗť}{}~z|z||~}}}~|~}~y{~y{~y{~y{~y{~y{{vx{vx~y{|~zuw}~y{|wy~y{}xz}}xz{}~y{~y{zuwxsu|wyxtyxtyxtywsxxtypoqvuwwvxxwyzy{zy{npqwyz|~y{|suvvsunjl|y{|~|y{|z|zwywtvxuw{xzyvxzv{yuztpuyuztpuspr~{}vsuwtvyvxrqsutvvvxvuwsrtnmowsx}y~tputpuvrwskrrkrqmsljpmkqkfogbkhdjkgljgihgigiigiidff[]]Z\\LOWNPYLOXTV_RU^UX\W[\VZ[[_`]ab[_`[_`X\]Z^_Y]^bfg_abeghfhibde]_`bcgcdhdeibcgcdhfgklmqhimjkoklpqrvnvvkvvgsufrvdpvcnv]iqeq{fuUdqVeqbnxcpxoyq{nw{ktwnuxnuxpswtw{qx{mvzoy|kuxlvysz}wx|wx|rswwx|xy}yz~pqustxtuywvzzy}}||{}|~}zy{}|~onponpnllhffvtt|zz~~|zz}{{xvvwuuvttxvvvuwutvvuwtsuvuwxwywvxxwysrtxwywtv|y{~yvx~{}zwy~{}|~~z|~{}~|~~{}|z|~{}|y{~{}~{}~{}~}~~̄~}xv~}~~}{}~~}y{~~{~yz~z|}~~~vv|ttzssyz|}z||xz{mopvxy~}~}~}|{|{|z|yyywwwyyyyyyyyyvxxvxxvxxsuurttusswuuywwxvvxvvvvvputotssxwtyxtyxvttusssqqtrrrpprprrprrprurttqsyvxrmormovqsuprtoqsnppkmpkmvprvprtqsroqpmorprtqssprwuuywwxvvxvvxvv{xzvrturtxtvzwypppyyyxxx|||xxxwwwsuvuwxwyzy{|npqxtyyuz~z{}y~~}|z~|{~}}{{}|~~zy{}|~˯zz||~~z|{vxsnp|wy~|~}~}}~z|~~y{~y{~y{~y{~y{}~y{|wy|vx{}{vxrmonik~}xzz|xsu~y{~y{}xz~y{{vx|vxxtyxtyxtyyuzzv{zy{tsuyxztsunpqy{|rtuwyztvwyvxzwy}z|spr{xz|y{{xzzwywtvyvxzwyyuzzv{yuzuqv}zvxwtvwtvxuwzwyutvwvxwvxyxzlkmnnprnsqmrd`ekglqmrnflngnmiojhnhflnirjfnlhnokpjgihgiceeeggbddWYY\^^LPVMPXKNURT]PTZRUZVZZVZ[Z^^Z^_Z^_Y]^X\][_`]ab\`aacddfgdfgfiicefdeideiefjefjhimmnsghlijnhimklprswjuus|}htvgswbmtbmtgrzlx`nzetkz[gqbowlv}hsxow{r{~ntxipsqtxsvzrx{owzrz}px{qy|v|xy}tuyvw{tuyxy}xy}uvzyz~{|optttxsswrquposdcgZY]mlnsrtmlnfegihjecdpnoxvvxvv~||xvv}{{ywwzyyywwzyyyxzyxz{z|zy{{z|yxzxwywvxyxzvuwzvx~z|}zwy{xz}z||z|}{}~{}~{}~{}~{}}z||~|z|}z||~}z|~~}}~mio~}}||~~~~}~|xz}w{~y}~{{~~}}z|}}y{||||{}||{|{||~~~|||zyyyyyzyyvyywxxvxxwxxvxxwuuxvvxvvutsvutvuuorrosstxwrvumqqusstrrussussusssprsprsprurtmjlnkmsnpsnprmosnptoqvpsrmormovqsvqstqstqstqstqtwtvvsuwuuxwwywwxwwywwzxzolnzxzwtvwuwwwwzzz~~~wxxtttwyzuwxxz{y{|suv|w}~{}y~~~{z}{z~~|}{{~}qrr}qsty~~~~~~~~~~~ïŤ~|~}~z|~}{}z|{}~z|~y{~y{~y{~y{~y{z}}xz}xzzuw|wy|wyz|xtvuprz|zuw|wyytv}xz{vx|wyzuw}xz{vxxtyxtyxtyzv{zu{wvxzy{xwyxvx~~vuwrtuuxynpqxz{rtuzwyyvxzxyvsuxuwvsuyvxzwyzwywtvxuvyuzzv{uqvuqvyuz{xzwtvvsuyvxxuwtsutsupoqpoqutvqprvqwsotxtyvqvkfkmelogookqkjphflniqokrjflplqheghfh`bb`bbdffY\\WZYLQTMRUMRUPTXQVYRVWSWXVZ[W[\X\]VZ[UYZ_cd_cd`de^bc_`dbei`eh^dg^dh_ddeggfhhhjklnolnoghlgkoeknfnqitvZgjitxgrvov{mtxitxlx~akscoxbmxozr}o{lx}p}ly{{nuxmtwqtxpswrsxtvztvztvztvzwy}vw{wx|xy}wx|uvzstxvw{yz~uvzvw{sw{tw{y{{|utxhgkjimihledhZ^cikovxywxxzzzvwwvxx~z|||}}|}}}|~srt~}yxz{z|tsuvtvzy{xwywvxyvx|y{yvxyvxwtv}z|}xz}xzy{y{y{z||~rmo{|{|{|}xy{z~̎x{}~~}{|}}{xzqnp|~sprjgi}y{}|~~}ww{y|w}x|{w{~nrvmnronr~~{}~uwx~vy}z|{z~}|}y~xtvxrsnkk~yz~{{}xywvvywwyxx}{{yxx{wxxstxrswrswrsyvvxwwywwxwwuttwuu|zziggwuuwuuusstrrsqqwuukiiwvuqoorpprqqsqqtrrtrrusswvvussusssqqvttvttvttvttxwwvwwuwwwxxtwwxyyxzz}~~z||wxxsvurqqxvv{yydbb{xxtttz|}y{|z|~wyz|~z||{|}xzz{||z||~}~~~~~~~~~~~~~}{{{{z{zwy~{xywwx̪™||~z~z{~~}|~{}|~~y{|~~y{{}z|~y{~yz~yzz{}xyvqrwrtvqsxsu|wy}xz}xz}xzzuwvqstoq~rpp|{{{zz}{{}{{wtvzwyzwx|y{xuwxwyzy{{z||{}}|~rqsxwyrqswvxwvx|x~rnsvqwzv{{w}~ztpuyuzxsyytzvrxwvzzz}yx|vuyvuywtvxuwvsu|y{{xzutvsrtpoqlkmtsupoqonrnmqjimlkollpnjookpokpokpminkglkglkglminhdifbfcbd`_a]\^^]_ZY[PUXMRULPTPUXRWZRVVSWXUYZVZ\W[\W[\W[\bfg]ab^bd^bc^bfcfjchk_fi\fibghaef^bcaefdhimqrorvpvypx{mvyq}~nz~mx|qz~nw{juynz~^kpt{wr}tp|p}kxzmvyelot{~x{ux|stxuvztuyuvzuvzwx|uvzwx|~{|wx|wx|tuynostuytuyruyvy}stxnosrqumlpqptlkoutxrqurqukotwz~wyzyyy|||rttxzzz||y{{y{{y{{zy{wvx}|~zy{wvxwvxzy{wvx{xzzwy{xzurtxtv}z|}xz}xz~xz~xz~xz|wyz|}upr{|{|{|{|מ|}|y{}z|Ɓ~~{}xwy}~{z}z}~xxxz~~|~}~y{|tvzyz~~}zz~~zz{z|~xzuss{yy}}|zz|zzvttvttvttussussxvvxvvzxxxvvzxxvttrppvttwuuwuuwuuusstrrsqq{yyjhhtrrtrrnlltrrrpptrrussussvttussusstrrvttvttvttvttwwwtvvtvvwyyuwwy{{y{{vxxqsstvvwyy}}|zzrpptrrvvvwyztvw}uwx|~xzzz|||~~z||z||}}}|||yyy~~~yyy}}}~z~|y{||{}|}~~trrxuw~{yyljjzwyvuwԲӵ̦Ų}x}{{{|x}}y~~}|~|~{}}xzz|{}{}z|~y{~yz~yzz{z{{vwwrtvqsxsuzuw}xz|vx}xz{vx}upr}xzzxx|zzvttxuwzvxyvxzwyvsuzy{tsuvuwnmopoqqprrqsvuw|{}xvxtsuyuzsottpuvrw{w|~zokp{w|zv{xtywsxutxonrrquvuyvuyyvxwtvvsuvsuurtyxzwvxonplkmrqstsuvuywvz|{zy}utxplqiejlhmlhmkgljfjjflkgljfkkglgchcbd`_a_^`feg`_aQVYLQTKPSOTWPUXPUURVWTYYVZZVZZX]]UYZW[\Y^^\`a]ab^ae`ehchk[cfZcf`ffdkkchiaggfjkntvty~gnsclpgrwjuy`qtZilZhlfqugrvgrvalpgqxjs|js}lur{ur}q|~my{r{~horry|x{wz~uvzwx|uvztuytuyvx|uvzvvzstxuvzwx|vx|xy}pquwx|wx|orvux|vw{yz~zy}srv{z~yx|rrvyx|tx}qtxwyzuuuxxxsuumoowyywyyuwwsuu{z|}|~wvxvvxyxznmohgiyxzyxzyvx}z||y{wtvyvx|xz}xz}xz~xz~xz~xzz||wy{|{|{|z{|}ɬy{|~{}}}z|}zwywtv|y{spr|~zy{z|}~~s{{}z}wz~{z|}~~}}~y|y|xuwxwyuwxz|}svzxy}xw{}|~zytv|}zuvz|||~yz|zzzxxwuu|zz|zzwuuusszxxussussxvvxvvyww{yy|zzwuuwuuywwusswuuwuuusstrrsqqtrrpnnvttussusstrrpnnusswuuxvvtrrussusswuuxvvvttvttvttwwwtvvtvvsuurtttvvxzzy{{wyyuwwxzzywwzxxzxx~~wuuyyy{}~xz{{}~{}~xzz{}}}{}}{}}|||{{{~~~|z|Ǭ~|~{{|||~}~|~z|~y{{}{}z|~y{~yz~yzz|z{}xy{vxzuw|wy~y{toqzvx}xz|wy{vxsnpxsuvttzxxxvv}}|zzxuwxvxvtv|y{xuwvuwxwy}|~|{}utvrprzy{xwyqpryuzxtywsxzv{zv||x}uqv{yuzxty|x}vuy}|wvztswzwywtvyvxvsuurtedffdfjikpoqnlnsrtonrkjnkjnmlpnmqokpnjob^cgchgchhdijfjkglc_dfbhjfkcbd`_a]\^dce]\^NSVINQKPSLQTMRUPSWRUYTW[UX\TW[Z]aY\`X[_X[_\^c]`d\ad\ad`gj\ehYfhgrus}hps\giempgrtp{grvbmqr~l}wjy|huycosdprbnpitxnxoxkt}pzr|ny}lxzlyzktwpwzqx{ruytw{rswrswpqustxvx|uvzvw{tuyrswrswqrvvw{wx|jkostxstxwz~ux|uvzstxrquyx|xw{tswzy}qpt|z~uy~z}y{|uuuxxxvxxvxx}z||wyyuww{z|~}vuwzy{vuwvuwvuwjikutvzy{~urt~|y{|y{yvx}xz}xz~z|~y{~y{|~~~y{{|{|{|}xy}xy|}˱ppvz}yz~~~~~|~y}~{}lot{{}|~}~~~~zxzvy}vy}|}}|z|y{|{}~rswzx|~{~|}{vw|}}~z{zxx{yy|zz|zzzxxsssiiivvvssssssuvvzxxwuu~~{yyywwywwtrrwuuwuuwuuusstrrsqqrpptrrsqqtrrussvttpnnusswuuywwsqqussussxvvxvvussvttvttwwwsuusuuuwwtvvvxxy{{y{{wyyy{{wyy}{{}{{{yy~~|~{}~|~z|}}y{{z||{}}|~~|~~||||||{{{~~~||||||}}}urt~}~}}{xzifhroq~~{yy~x|ȯĥгà~}{~z|~{w|}|~}~}z|xsuytv}{}z|~y{~yz~yz|}z{ytuzuwxsu|wy}xz}zuw}xz}xzz|}xzxsuxvvywwyww|zz}{{xuwxuwtqsxuwxuwyxzyxzvuwvuwwvxwvxxwylkmonpxwyqpruqvyuzuqvvrwzv{zv{~~zuqvwsxutxrqusrvpostswxuwwtv|~vsuurtedf]_`iklvxygjjkmnonrmlplkoonrposqmrmingchjfklhmfbgiejkglkglb^cgchbac`_aa`b_^`YXZINQLQTMRULQTOTWORWPSXTW\QTYTW\X[`X[`Z]bZ]bZ^c\^dY^a]dgW`c^hk[fh^jnequYdi^jnalpXfi\ioboudpvfrx`lrbsvapsesvbmqbmqnwzmvymuzluylt{ovls|kszgptjsvnvynwzjqtsz}orvpswrswstxqrvwx|YZ^uvzstxtuystxvw{wx|vw{vw{z{yz~wz~psw|}yz~utxxw{|{~}}|~|{z~}svztvwqqquuuy{{nppuwwuwwsuuoqqsrtvuwyxztsuvuw{z|xwyvuwutvrqsyvx}{xz}z|zwyzvx|wy}xz}xzz|~z|~y{~z|~y{~yz|}~yz||{|~ˡgim|~~tqs}zwy}z||~}}|xz{rpr{ux}}}z|y|z}~~}z|zy{z|}|~~vy}wx|yx|wvzzv{|wy{|~yz|wx|wx~yz{yyxvv}{{}{{|zzwwwqqqxxxvvvrrrzzz~||vtt}}xvvywwwuuvttxvvvttzxxvttvtttrrtrrsqqsqqussussussussussxvvzxxtrrusswuuvttwuuxvvwuuwuuuuutvvtvvsuutvvuwwvxxvxxwyyz||tvvxvvywwzxx}{{zzzz|}y{|z|}{}~|~|~~|~~}|~~y{{uuu~~~w|}~yz~|~¨ɮ¨Ťvy~z}{|{~z|~|~{}}}xz~y{~y{~y{|wx{|~yz{|{|z|wrt}xz}xz}xz|wy|wy~y{|wyz|vttvttwuuywwxvvwtvyvx~|~{xz|y{xwyutv{z|~}{z|zy{}|~zy{vuwutvyuzwsxvrwxtyxty~z{~z~}wsxvuytswvuyvuyvuyxuwvsuwtvvrt{xzuuwkmnrtuqstcefmophgkjimihljimmlpminiejd`eeafiejiejgchhdijfkd`egchihj`_aa`b^]_]\^INQINQINQLPTNSVQTYRUZVY^RUYTW\X[`X[`Z]bZ]bZ]bY\aX`b]dg]fiiuwdqs`nqk{~n~csv`orhxzl~hx~cqwix}gsxn{kvzgqukrwqx}s{~mwwt}qzt|nv}ovqyr{py|mvzluxipspwzwz~ruystxwx|xy}rswvw{z{wx|wx|tvztuyoptqrvqrvrswmnrnostw{tw{vw{rswxw{vuywvzyx|{z~utxzz~mqvqtxy{||||yyyuwwsuu{}}y{{z||suuqprxvxyxz{z|}|~wvxxwyxwy~zwy|z|zwyzwy|wy}xz|~}}xz{vx{vx{}z|~yz|}}~~ww}~~£ihlzwy~{yzz}~{~{~|y|~`_a~}~}}z|{~|}~}~~~}y{|z}}~~}~|}~{|{|{|~||yww}{{|zzuuuy{{vyyvyyprrtuuzxxvttywwwuuzxxwuuvttxvvwuuzxxsqqtrrrppsqqsqqqooussussussussussxvvzxxussusswuuvttwuuxvvwuuwuuuuutvvtvvtvvtvvvxxvxxtvvxzzz||vxxzxxxvv|zz~||{{{xz{z|}z|}{}~|~~}}y{{uww~~~yyy~~~~~~xxxput|~~x}~zyz{}~}~{}|zzwuu{}ͩz|~z|x~~z~z~zytvzuw{}|~{}zuw|wyz|~y{~y{~y{~yzz{{vw|wx{vw|xz{}wrt|xz|xz~y{~y{~y{~y{z|wrtxvvxvvwuuywwxvvxuwwtvxuw{xzzwyxwyvuwyxzxwyyxzwvxwvxtsuvuwutvwsx{w|xtyuqvuqvtpuuqvwsx}minrnsvuyutxvuyvuyvuyzwyzwy~{}tqsurtoqrkppmqrnrs^bcknoihlmlpposonronrqmrlhmhdiminkgliejgchhdijfkfbglhmhgidcea`b`_a^]_INQINQINQKPSMRUOQXOQZTV^RT\TV^WYaXZbZ\dZ\dZ\e[]eZadXbe\ik_ln[hjZkoYlqVhmWjoRdj[ot^qxas{fv}_ltdnwkuygnsglqmqvgkomsut||qx{pwzlrvou|ot}mryouzpwzpwzjsvjqtnuxorvyz~yz~uvzqrvoptxx|uvzuvzvvzstxoptz{wx|yz~{|z}svzyz~{|zy}wvzyx|wvz{z~{z~z~ruynpqwwwzzztvvxzzy{{wyyvxxkmmtsuxwyxwyyxztsutsurqsxwyvvxxwy|y{|y{|y{zwy|y{|wy}xz~y{}xz~y{}xz{vxwrt~z{{xzttzsu}}~}z|{xz}zwy}}vy~y}z}wvx~}|x}~{}xwyz~|~~~~}y{|}|}xw{~|x}zuw}~~yz|wxz{~xvvzxx}{{|zzwxxsuuvwxwxyrttqsswuuvttxvvyww{yyxvvvttxvvxvvzxxrpptrrtrrkiipnnussussussussussussvtt{yyvttusswuuvttwuuxvvwuuwuuuuutvvtvvtvvuwwvxxy{{prrxzz{}}xzz|zzyww|zz|zz~|||||z|}vxyz|}{}~|~~}{}}{}}vxx~~~}}}xxxzxxhffƬʢƯxy{z~zxtx|||~y{}xzz||~{}~y{~y{}xz~y{~y{~y{{vw}xy|wx~yz}xy{vx}xzzuw|vx|vxzuwzuwzuwzuwwrt|wyxvvxvvwuuywwxvvwtvzwy|~zwyxuwutv}|~vuwyxzyxzyxzutv~vuwrqsyxzwsx{w|xtysotxty|{w|~zrns}y~wvzvuyvuyvuyvuyyvxurtvsuurtrtuptupturvwosthlnkjnmlpnnrnlpkjnlhmokpc_dd`egchiejgchhdiiejb^cc_ddce`_a^]_`_a^]_INQLQTMRUJORLQTQSZQS[VX`SU]TV^WYaXZbZ\dY[c\^f`bjYcfT]`Zfh^kn^kn[kq\nsaty_rw]pu\puZqwfyfw}iv}r}nswhkpsv{wx~||sxyrzyrx{muxqv{ou{os|pv|ouynuwntwqz{rx{tz|vy}tx{rsxtvztvzpptrswuvzvw{tuyvx|oquwx|qrvqswrswtuystxqtxux|xy}yz~tswkjotsxwvz~}xw{yx|sv{uw{rtuuvuwwwyzz{}}rssvxx~xyyzz|wvxwvxvuwzz|||~yxzsrtutvxwzzwyyvxwtv{xzzwy|y{|wy}xz~z|z|{vx{}}~yzrlm{|}~~ֺȗǮ˜|~}~{}}y|}yvx}~~yvx}uzpuz~}z~y|{{hgj}~~z~|}~~}~||~|~~|~z|}xz~z{xw|~}|}{|{||wx|wx{vw~~}}~||}{{|zzuwwsxwrxvsxwqvuqsswuuyww{yy}{{|zzxvvwuuxvvxvv{yyrppvttvttommsqqvttussussussussussvtt{yywuutrrwuuuttvuuwvvvuuvuuuuuuvvsvvvwwvxxxyyxzzwxx{}}xzz~||~||}{{}}}||xz{vyzz|}{}~|~|y{{vzy}vzy|~~|||~~~|~y~}zv{{}{|y{}y|ūòžФë~zrot~z~z~zz|~|~{}|wy}xz~y{~y{~y{z|}xy|}|wx~xy}xy}xz|wy}xz{vx{vx|wy|wy|wy~y{}xzytvvutvttwuuywwxvvxuwxuw{xz}z||~zy{wvxwvxzy{srtyxzxwywvxtsuutvxvxytzwsxvrwzv{wsxvrwuqvzv{xty}x~{v|wvzvuyvuyvuyutxzvxursvsurnproqruvmrsnstptukppgklnmqlkomlpllomlpokominrns~zgchiejgchhdifbga]bfbg\[]bcdYXZ^^_\Z\KPQJOPJORKOTNQXNRXQUZRW[RV[SW\W[`UZ^X\a[`eY`e\fjZdmU^h]gqXcl[fo]iqmyapx[mtZmt[rxZmr^prZehfrrjprilmlnprtugiktvvruvvz{z~sxywz|sxxtyxrwvrwvqvuputvvvwxxtttuvvtttouxox{ouxnrvsvzuw{zy}utxrptsrvvtxutxxw{}|yw{utxvwxyyzyxzxwyxwyvuwyxzvuwwvxyxzxwywxywuwzy{wvxwvxzyy|{{{yy}||~{{zxxzwwvtt{xxzxwzxxzxxxvvzxx{yyuss}xzztvwrt{vxzuwz|}xz|wy|~z|~xz{xz}{xz}z||y{{xz}|z||y{ҙƨ~}~~~~|y{zwy}~~w||~{yx}}{|{}}{|xx~||~}~tuy|}qrvy{wwy{z||{}zy{|{}|z|}~}~~xxy}{}|zz|zztssusszxxyww~|||zz{yyvxxqvuqvurxwputwyy{yy{yy|zz{yyywwywwxvvwuu|zzzxxwuusqqtrrrppussusstrrussrppussrppusszxxvttxvvussqssrvurvvosrsvvsvvywwzyyzxxyxxzxxzxx}{{}||}{{|{{}}}{{~||zxx|zz~||{{{zzz{zz{{{~~~w}|x~}x~}z||}|~~~~rz}xty{yy|ww±ơŲƆ{~w|||||{y~~x}~x}~y{z|}xzz|~y{ytv|x}~{~xty}z}{w|zvx}xz~y{zuw{vx{vxzuwzuwxsuxsu{vxytv|vy{xzzz|xwyyvxvsuzwy}z|}|{}~}tsuzy{tsuwvxxwywvxyxzyxzutvzy}xw{vuynmqzy}ttu{{|zy{wvxwvxzy{zy{yxzsrtxwx~xw|yx|zy}ttx}|ttxoosrrvpptnnrjhnpntnlrlipliplhnsoujflWSYd`ffbgfcefcec`bdaccbdadh^bf[]aZ]bWY]FKLGLMGLOJNTMPXLPUMQVOSXRV[RV[TX]TX]VZ_YbfV_c`ko^hr^hrgq{dnxfpzbmucnv_ov^qx\ovdw~`tx\mpu|mrsjlmlnortutvwnpqnrsjnogkltxyrvwostsxwsxwputotsnsrvvvtttqqquuutttmtwnwzpwzotwqtxpswxw{tswposmlpwvzvtxrqusrvtswutxwvxwvxutvsrtvuwvuwutvxwytsuwvxvuwwvxwvxzy{vvxvvxwuuwuuussxvvsqqwuuwuuywwzxx}{{wuuvtttrrywwussyww~y{zuwupr|wyxsu{vx~y{|vx}xz{}{vx|y{}zwyxuwzwy}z|~~z|}}ЭƜс~~~~}{{~||}}}{{}~}~|{}}pswlosruy|~~}vv|}}~~||~~}~~|{}~|~}|~~tsu}|~}{{}}zxx}}|zz{yy|zzwxxvxxxzzrtttvvwyy}{{ywwywwxvvwuuywwxvvwuu{yyywwvtttrrussusstrrrppusstrrrppvttrppusssqqrppywwxvvtvvqvupttmrqrwvvxxywwsqqzxxzxxzxxxvvzxx{yy|zz|zzxvvwuuxvv|zz~||}}yyywwwzzz{{{|||w|{w|{w|{}}xzz{}}|~~}}}}}}}rttuwwz~}}}xvv|zzywwvutǧÒ~}|||~{|v{y~y~~y{z|}xz~y{~y{}zv{{w|xty|x|{w|zuwqlnjegzuwytvztv~y{|wywrtpkmwrt|wywrtvsuzy{utvtqsvsu{xzwtvspronp~}tsuxxzutvvuwtsutsuzy{zy{xwyutxwvzutxutxyx|xxz|z|yxzwvx}|~yxzwvxonppoqtsuhgirqusrvsrvqptrquqptzy}rqusrvposonrljppntkioigmjhnjflqmslhnmiojflfbgfbdebdc`bdacbac^aeZ]aWZ^VY]UX\GLMINOJORJNSLOWLPULPUMQVLPUPTYTX]UY^U[`T\`^imhrv^hr\fp_is\fp^hrit|alt_ltZjqbt|\nu[kq\knXdfkuukpqmopiklkmnuwxkmnhlmkopuyzw{|rvwquvotsotsputotsnsrtttvvvzzzuuuvvvovyluxpwzrwzux|svzxw{vuyrquppt}|vtxqptqptsrvutxttvvtvsrttsuxwyyxz{z|zy{yxzxvxsrtwvxwvxutvvtvvtvusstrrsqqpnnxvvvttwuuywwxvv|zzywwzxxuss{yy{yy~||ytvxsuvqsz||wy~y{~z|{vxzuwz||wy|y{}{xzzvx~|~xuwnkm}~{}|y{ϧ~~~~~~~}}}{{~~mjl~~}}|~~~~||{}~||efj~|}{|~}~{z|{z|{z|~}||~}|~zy{utv}{{ywwwuu}{{ywwywwvttzxx|zzyyyvxxx{{z||{}}wxxywwtrrvttvttwuuywwxvvwuuzxxwuuwuuussommusstrrrppvtttrrqooxvvrppxvvrpptrr{yy|zzsuuputnsrotsuzyy{{}{{zxxzxxzxxzxxzxx{yy{yy|zz|zz}{{|zz}{{|zz|zz}{{~~~{{{z~z~xzzy{{~~{}}~~}}ţëО“{z~~~|||{|zy~y~~y{z|}xz|~}xzz|zv{|x}xtyzvzzv{wrtvqsvqs|wyytvxsu~y{|wy{vxzuwxsu|wyzuwzwy{z|wvxzwyzwy|y{|y{{xzzy{xwyvuwvvxutvvtv~}zy{vuwyxz~xw{yx|wvzvvz|{}|{}{z|xxz~}utvtsutsutsu|{}zy{{z~wvztswmlppostswnmqsrvqptqptqptrpvomskiohflhflieknjphdjeaghdjfbgebddabb`adac^^_WZ^jmq]`dZ]aTW[EJKHMNJORIMRLOWMQVMQVMQVUY^RV[QUZV\aX`dR\`S^bXdh\fp^hrcmw]gq]gqWdl^ksbowcpxkzjxgtzthtvnxxfnnikljlmprsjlmtvwptukoposttxyostrvwnsrotsrwvqvuputsssrrrwwwxxxzzzsz}luxnuxotwsvztw{zy}yx|{z~tswtswvtxutxxw{utxutxsrtvtvvuwsrtutvtsuvuwutvtsuwvxyxz}|~}|~utvutvutvywwtrrvttzxxwuuzxxxvvxvvxvvyww}{{}{{sqqywwussnllxsu{vx{vx|wy|wy{}z|zuwzuwzuw|vxyvx~{}xuwwtvzwywtvc`b|y{}z|zwyѳʷƭzxx~~~||{xz|~~{}~{}}|~w||}~}~~llr{{xx~qrv|}|}~}}|~~}~|{}}|~|{}zxz{yyywwywwussyww}{{zxxxvvzxx|zzzzzwwwwwwpppxxxqqqwuuxvvvttvttxvvywwxvvwuuywwvttussywwxvvrppusstrrvttsqqrpp{yysqqvtttrrsqqvttsqqoqqotsotsotsqvurttvtt~||zxxzxxzxx}}~||}}{yy{yy{yyywwzxx{yy{yyywwwwwrrrzzz~~~zzz|~~|~~|~~z||z||{}}y{{~|~~}~~~||sssoqq|~~xzzz}~npr|||}}}}{yy}}}}~||~v|z}ȴǦvuy{y~|{|}{}w|zz~y{z|}xzzuw~y{}xzwsxyuzyuzxtyzv{zuwytvxsuz|}xzxsuytv|wyytvvqs~y{|wyytvzwytsuvuwyvx~{}yvxvsuwvxutvtsutsuvuwutvwvxzy{utvsrtwvxvuywvzqptvuytswtsuutvwvx{z|zy{qprxwywvxqprkjlsrtsrvutxwvznmqsrvposyx|posqptrqurquvtzljpljpigmigmnjpplrgcia]cb^deafd`fb^cb^cd`e\[_VY]ilpPSWZ]aQTXHMNINOINQHLQJMULPUMQVNRWVZ_HLQOSXZcgYbfWbfYeiXcg\fp\fp^hr\fp[eoN[c\iq`mubmuhs{`jr\fmitxckncmmfnnkmnjlnrtumopnpqkopkopmqrostnrseijotsrwvuzyuzyputsssqqqtttqqqzzzry|mvykrumruruyruyzy}xw{ttxvuyvuyutxtswutxutxvuwvuwvuwvuwyxz{z|xwysrtwvx~}xwykjlqprvuwwvxvttxvvvttwuuzxxwuuywwwuuvttxvvzxx{yyxvvxvvvttyww|wy|wyytvzuw|~|wy|wy|wy{vx}xz{xz|~|y{|~|~yvxxuwzwyzwymms{{̺ҟ{z||zzzxx}{{|zzzwy|~yvx|~ttvmrsquv}uvz}{~yy{{{{~~{|~|}|}|}|{}~}~|{}|{}|{}|{}zy{{z|ywwzxx{yy}{{|zzzxxywwxvvyww{yyzzzzzzz{{zzzwww{{{{yyrppywwxvv{yywuuzxx}{{xvvvttusswuusqqrppussvttusssqqmkksqqrppqoorppvttywwzxxsuuputw|{chgputuww|zz{yyxvvzxx|zz~~|zz|zzzxxxvvsqqussvtt}{{{{{xzzuwwqss{}}|~~z|||~~~|~~{}}z||~~~mmmxxxxwy}|§Ĩƫ٠~}~~x}~}w|zzzy~y~z|z|z|~{w|zv{wsxxtyyuzzuwxsuytvwrtwrt~y{|wy{vxzuwzuwzuw}xz}xzvtvzy{wtvvsu}z||y{|y{utvutvutvxwyutvqprqpryxzyxzvuwutvyx|wvzxw{onpmln|{}srttsutsuyxzutvutvvuwutxzy}zy}~}qptwvzvvzposonronrpostrxjhnkiomkqljpmiorntjflhdjrntlhnd`ga]ca]ceag[Y_beiVY]Z]aSVZlnrHMNDJJLQTHLQJNVLPTLPUMQVQUZOSXPUZV_cOZ^T`dS^cWfi`jtYcmcmwgq{akuUbjYfndoweqygpypwbjq`im`ilgqqdnnlnpkmnnpqlnolnolprkopmqrostnrsmqrkposxwuzysxwnsrxxxvvvrrrtttxxxovyr{~qx{otwsvzruyvuyutxnmqxw{wvzvuyutxtswutxutxutvutvutvttvutvwvxvuwxwyutvtsuutvwvxkjlsrtutvvuwvttwuuzxx{yy|zzzxxywwxvvwuuvttywwxvvywwxvvxvvxvv{vx|vx|wy~y{}xz|wy|wy|xz|vx~y{|xz{xz{xz|z|~}z||~~{}}|y{˲|{}~~|zzvtt}}|~}z|}|~~|y{wvxtz|rwz~}xw{|z~}{~|{{~}|~~}~}|{}|{}~||~}|~|z|xwy{z|}{{~|||zz|zz|zz{yyzxxzxxzxx{yy|zz~||~~|yyzxx|zzzxxwuuzxxyww|zzsqq}}xvvxvvvttxvvxvvvttrppvttusstrrtrr{yyqoosqqpnnpnnsqqsqqtrrsuurwvjonputmrqnppzxx|zz|zz{yyyww{yy|zzxvv{yy}{{}}~||}{{|zz~||{{{yyyzzz|||~~~zzzvvv~}~~~~z||}}yxz{w|}~~~}~™Ĩģ}w|~ysxzzzy~y~z|z|z|}}xz{vx|x}xtywsxxtyyuzzuwxsuytv{vx{vx~y{{vxzuwzuwzuw{vx{vxtqsxwyyxzvsuxuwxuwxuw{xzutvutvutvrqsyxzxxzqprvuwvuwxwyrqstswxw{|{vtxxw{utvqpryxzvuwvuwvuwwvxxwyvuwutvutvrqunmqxw{onrkjn_^bonrrqurqulkovuyqouigmjhnljpjhnjflc_egci\X^^Z`fbheageafc`eeagdbhehladh_bfNQUX[_EJKAFGJORJNSKNVJNTLPTLPVRV[RV[MSXR]aS^bZfj_nq`or`jtblv\fpcmwcmw_lt\iqaltclu`gphmvekrbhmdknjttissnpqnppmopprsoqrnrrkoplpqimnimnrvwtyxv{zotsotsrwvtttzzzuuusssry|r{~ovynsv~tw{tswutxvuyxw{utxvuyutxtswutxutxutvutvutvtsuutvutvutvutvutv{z|wvx{z|tsuutvvuwxwyxvvwuu{yy|zz}{{|zzzxxyww{yyzxx{yy{yywuu~||xvvxvvwrt{vx}}xz}xz{vx|wy|wy}xz|xz~z||z|zwyxuw}z|~yvx~{}}z|~{}ۭȦ}{z|zy{}{{kii~~}}~}}|y{}{w~|vv|~~{{{|~~{z|{z|zy{|{}|{}{z|~|~}|~|{}xwyzy{~||}}}{{zxx|zz|zz|zzzxx{yy|zz}||~||~|||{{{zzxvvvttusszxxywwzxx~||zxxzxxxvvvtttrrrpprpptrrvttusstrrtrrrppusstrrrpppnnrpptrrvttqssnsrSXWSXWv{zwyyxvvtrr~|||zzyww}{{{yy{yy{yy}{{~~~~~||}{{|zz|||yyy{{{~~~{{{|||~~{}}}}~~~|}z{}|~~|{}{~zxx~~~~ıİñģ¬|{uz}w|zzzy~y~z|z|z||~~xzytvxtyxtywsxxtyyuzzuwxsuytvxsuxsu{vxxsuytvzuwzuwzuw{vx{vxyvxzy{vuw{xz{xzzwyyvx}z|utvutvutvvtvgfh~}tsuwvxxwy|{}srtxw{wvztrvtswxvzvtvtsu}|~vuwvuwvuwyxztsuxwywvxxwyxw{poswvzyx|qptonrmlponrmlpposkjnigmmkqhflhflfdjjfllhngcieagkgmc^hf`jfajgbkgbkhflbeiWZ^SVZUX\X[_GMNDJJKQTJOTJNUKNSKOTLPUORXSV\U[`U`dQ\`S_cP_bQad[fo]hqS]galucnwO]eRahZem[dlchqbgpfiqdhncilennhrqmoppqrnpqnqqmpporskopjooquvgklottmqqpuspttnsrpuuvvv{{{poo|{{ntvktwpvztx|vx|qswtswvuyxw{wvzwvzvuyutxtswutxutxxwxwvxwvwvuvvuwvuvutvxwyxwytsuvuwzy{yxztsuzy{{z||zzwuuzxx|zz}{{{yy{yyywwzxxxvvzxx}|vttzxxxvvuqsyuw{vx|wyytvz||wy|wy~y{}xzz|~{}{xzzwy|~~{}|xz~{}Ϧ~öǺͮƁ~}}}|{}~~~~}}a__~||~||}{{~}}roq|~yvxxwyvuw|{}}{suz~|}~}~~~}}|~|{}|{}zy{~}}|~~}~}}|~~{{~}}~||xww}{{}||}{{{zz{yy|zz|}|vx~yzy{ysuvttqoowuuvttxvvxvvvttwuuxvvvttwuusqqtrrvttwuuusssqqussvttwuuwuusqqrpptrrvttwuuuxxrvuqutkonoqqvuu~~}{{|zz{yy}||}{{}||~||}||}{{}{{~||zzz}~~||||||}~~|||{||}}}zzzwww{||~~vtw~|||zy åx~{uy}x|smr|zzzy~y~z|z|z|zuv~xz{vx}y~zv{wsxxtyyuzzuwxsuytvytvxsuytvz|zvxzuwzuwzuwytvytv{xzsrtwuw}z|wtvyvxxuw{xzutvtuvutvyz{srt{z|rqstsuvuwvtvomoqptwvzonrsrvwvzutvpoqsrttsuutvoopsrtonpmlnkjlllnonsonsjjnonsihlrptqquposllpsqvkjnhflnlrhflhfldbhd`fgcigcib_dgdib^efbif`jd_fd^h^\cbei[^badhZ]aVY]BLOAKNBMPDOQFPSDKNGORMTWNVXPXZMVYKX\S_cUaeS^cVafWbgZdj\gl`kp`jp[djV`d[diZbf`inY_dfimfimilpgkoimqimqknrnospnrpnsoptlmqssxwx|klpghlruyoruorvgkmnquuwxwyzoqrqsttvwstuuuwwxyvvxwvxwvxwvxvtvutvutvutvvrwvrwvrw|w|xtyvuyxw{|{yx}wv{utxttvutvutvrqsxwyutvxwyutvvuwtsuwvxwvxwvxyxzyxzyxzvuwvuw}|~xwyutvlikurtvsuyvxurtwuwvuwyvxwtv}xz}vy}xz}xzz|{}}xz}z|~{}}}|~{~|wy~~{}yxzĤåx{|x|~y}~tyzx||}z|~|~|~|~|~|~~|~}y|}~}|~~|~|~}mjlyz}|z~~~}{}}~~~~~~~~~~}}}||||||sssTTS~~~{||wyyvxxz{{y{{|~~{}}z{{y{{b``jiiyww}|{ussywwxvvywwywwywwywwvttwuuzxxywwwuuusstrrwuusqqsqqsqqtrrvttvtttrrsqqxstupqwrsxstxstywwwuuvuu{zzzyyyww}wxzuv}xy}wx|wxuwwwxxsuuvwwnpp{yy}{{~||~||zxx}}}{{}{{~~}}vtt{yywuu{|pqp|||{~~}z||x}֫ztyw~}y||x}}y~|x}|x}|x}|x}|x}|x~|x}wsxyvwwtvxuwxuwxuwzuwytv{vxzuwytvvqsuprzuwzvxytv{vxxsuuprtoqxtvytvzwyqnpzwyqnp}z|vxymqrnrsqvwruvtwxwtvvsuxwympqruvqpt~}tswutxxw{{w|yuz}y~wsxokp}z|yvxxuwxuwsprroqnklpmotqstprtwwuyzpstinnjnofhktrxpntmkqecia_ef]glcnjalh_jkbmgdjfei]\``_c`_da`d\_cVY]UX\QTXNQUBNPAMOBNPAMO?KMIPSDKNMTWJQTPWZPY\P\`R_cT`dQ]aXdhWbfYdhZeiZeiZeibko\eiYcfZdg_im\bgfhlfhlehlehlgjninqhkolmqpptpptnosmnrprvstxrswlnrorvilpknrtvzsvzqstrturtutvvsuvrqsutvvvxvvxvvxvvxrqssrtttvttvttvvrvvrvvrv|x}wsxtswvtxkjnqpttswwvzutvsrttrtsrtyxzxwysrtsrtsrtsrtxwysrtwvxzy{xvxutvvtvvtvonp}|~xwyzwyzwyvsuzwyvsuxwyrqsyvxyvx~y{x{|xz|xzzuw}xz}xz}z|~z|~{}~|~|y{z~{}~{z|{~v~{|}{xz~{}|~~{}|~|~|~|~|~}~z|}~{xz|~~~~y|{w}{|~~}}}}}}}}}{{{zzz|||~~~||||||z||xzz}xzzz||xzzwyyy{{y{{sqq|zz}{{{yy~~~||zxxxvvywwywwyww}{{wuuxvvvttvtttrrrpptrrrpprpprppsqqnllpnnpnnsqqupqupqwrsxstxstvtttrrusssqqussvtt|wxxst}xy{vw{vwvxxvxxuwwxzz|~~zxx~~}}}{{{yy~||}{{}{{~||~~~||~|}}|~}|~~}~}~~~{{{y~|}}}|x}}{vxࠪ}yz~{~zzv{|x}|x}|x}|x}|x}|x|wsxxtyyvxwtvxuwxuwxuwzuwxtvzuw}xzytvvqsvqsytv}xz{vx}xz}xz{vxvrt{vx|wywtvroqvsuurtzxzwxywyzwyztvwrtuvtvwtvurtutvprsswxihlsrvonrtswsrvtpuqmr{w|qmr|gchsprxuwyvxqnpurtwtvvsusprroqlikopqxz{dfgjlmmopkmnjimfeijimkjnrquhcld_he`igbl`[ddbgbaeYX\YX\ZY]WVZ]^bZZ^WX\RSWOPTCOQBNPCOQDPRBNPKRUDKNJQTLSVT[^U^aQ\`R\`OZ^R]aWbf[dh\ei\eiZbfZbfTY_X^c`ek_dj`fk`fkdhldhlbeicfjgjndilfjnqrvpptpptnnrmnrnptopttuyqrvtw{nqujmqilphkooqrrturtuuwxtvvrqsrqsutvvtvvtvvtvrqstsutrttrttrttpvtpvtpvtpuvrwtswsrvyx|utxttxtswutvsrtrqsttvxwysrtsrtvuwsrtutvvuwqprvvxxwyutvtsuttvttvvuwwvxvuwtqsurturtzwyvsuwvxqpryvxyvx~y{x{|vx|vxzuw}xz}xz}z||z||y{}z|}z|~ʸѤǢ~z}~z|}z|}|~~|~|~|~|~|~{xz}z|{xz|~|~}z|}z|~}}~}z~~yyz}}{}}}{{{{{{{{{|||}}}~~~}}}vvvwww||||~~xzz}z||z||xzzwyyy{{y{{}{{xvv|zz~||{yy{yyzxxywwywwywwyww~~wuuussvttvttrppqoosqqrpprpprppwuuywwzxxwuuusswrszuv|wxxstxstusstrrusswuuusstrr{vwytu{vw~yz|}y{{vxxrttqssrtt}{{~||}{{|zzzxx~||}{{}{{~||~~xvvwuu~~~}~}kjlzzz}}}{~wyzutxmlp{w|~{}pmo|~rnsï·ǡ҉ƨnpx~{t{y~x~}|x}|x}|x}|x}|x}|x|wsxxtyyvxwtvxuwxuwxuwytvxsuztvxsuzuw{vxzuw|wy}xz{vx}xz{vx{vxxsu{vx|wyzwyzwyyvxyvxyvxrqsqttqstqttpsttsuwtv|y{zy{z|}vz{vuyrqu~srvqptxty}y~tpusotvrwwtvroqurtqnpvsuyvxyvxtrtmjl|y{mlny{|suvnpqprsmopihlcbgfeirqutswplqfbhgcijflfbh]\`gfjihlihlljnedh^_c]^b[\`WY]VW[COQBNPEQSEQSFRTKRUGNQHORMTWSZ]S[^NY]OZ^LX\YdhXcgV`dV`cV_cYbfYbfcinagl\ch_fj_ejdindgkdgkbeidfjhkofjndgknosonrposmnrnoslmqnospqurswhkoilpknrpswpswprtuwxoqruwxuwxpoqrqstsuutvutvutvyxzxwysrtsrtsrttputputputpuuqvsrvvuysrvutxtswtswrqssrtvuwvuwtsu{z|{z|vuwutvyxzqprrqsvuwutvutvutvtsutsuutvwvxvuwyvxwtvwtvxuwsprsrttsuwtvwtv}xz~wz{vx{vxz|{}}xz}z||y{{xz|y{}z|y|yxzЬ}}|~|y{|y{|~}|~|~|~}|~~wtv~~|y{|~prsrtu~~~xv~~~}{z}{}zzz|||}}}www||||~~xzz}{}}z||y{{|~~{}}z||y{{{yy{yyxvv{yyxvvxvv{yyxvvywwxvv}}trrtrrwuuywwwuuwuuywwsqqtrrsqqzxxusstrrsqqusstopzuv|wxxstxstvttussvttvttwuuxvvz{|}{|~yz{vwvxxxzzwyyvxx|~~ywwyww{yyyww}{{}{{}{{~~}}~||~||xwy~}}}}tzy~{{{|||vrw}~}ĸˬĩua]h|wtls|{{w|wsxxty|x}|x}|x}|x}|x}|x}|x}wsxyvxwtvxuwxuwxuwxsuwrtytv{vxzuw|wyzuw{vxzvxytv{vx}xz}xzvqs{vx{vxzvx|~xuwzwyyvxzy{tsuutvsqtqprsrtwtv{xzqprcefvz{ttxnmqutxsrvrquokpuqvsotsotqmrnjoroqvsuspr|~|y{xuwurtwtvxuwkhjqprhginmoonponpkilvuwonp`_abacllmljpecicbh[Y`fdj^^b\]aQRVWY]Z[_RSWVUYVUYXW[UTXTSWFRTAMO?KM@LNHTVHORFMPJQTFMPOVYTZ^QZ^PY]V_c_hlYbfY_dZ`eV[`Y_dY_d\`e\`ecglbfkcglchldgkehlehldgkdgkfknfimoptonrnmqlmqlmqlmqmnrqrvuvzpswnquknrnqupswtvwqstmopprsrtuqprmlnqprwvxutvrqssrttsusrtutvtsutputputputpuvrwtsw{z~yx|utxutxutxutvutvrqsxwyutvsrtrqswvx{z|~}poqsrtrqsrqsutvsrttsusrtnmosrtvuwvsuurttqstqsurtvuwtsuwtvxuwzuw{tw{vx{vxzuw{vx~z||~|z|~{}|~~{}}vy~}z|zwyܠʦЯ~~~}}z||y{|y{tqs~|~~}~~~}z|}}}~}~~}y|~}||||||yyy~~~{{{}}}|||||||||~~~~~~~~{}}z||y{{xzzz||tvvwyy}}}{{}{{}{{wuu}{{~|||zzzxx|zzzxxxvvvttwuuwuu{yyvttwuuusstrrvttussvttvttrppussxst|wx}xyvrrvrr}}zxxvttussxvv}xy~yzytuz|z{wyysuuxzzy{{}}zxxzxx}{{~||~||~~~~~~~||}{{~||}}wwwxxx~~~|||}}~}|~yyy~zzz~~~zzz{{{~~}|zv{}y~}{xzzwyxuw~~|}z|vrwäڎ̈́}~zyuz{w|{w|{w||x}yuzyuz}y~|x}yuzyvxwtvtqswtvwtvxsuxsuxsuxsuzuw{vxytvzuwzuwzuwzuwzuwzuwytvytvytvyvxzxzurtzwywtvvuwpoqrrtsrtrqstrtwtvwtv}|~vxyostqptutxutxsrvwsxtpuvrwuqvrnssprurttrtzwytqs|y{roqjgiurtc`bsrtnmoqprrqsonphgirqsrqtqpr^]`fegposgfjbaeedhdcg\]a_`dghlffj``d[\`UTXYX\VUYUUYSRVDPRDPREQS?KMFRTIPSJQTNUXIPSPWZSZ]MVZLUYMW[Q[^Q[_SY^RY^W]bY_dY_dX\aZ]bbej`chadibejilpknrehldgkfimfkngjnmnrpossrvnoslmqjkoklpnospqupswnrvlptorvpswtvwsuvprsoqrrttutvyxzzy{xvxrqsutvtsusrtsrtutvtsutputputpuuqvsotrquqptsrvsrvsrvsrvttvttvrqs{z|tsuxwyutvutvtsusrtwvxyxzzy{yxztsusrtutvyxztsutsuvtvvrttrttqsurtrqswvxroqxuw|vx{twzuw{vx}xz{vx}~{}~{}|~~{}~wzz|wtvԨ؂{|~{}|~}|y{|y{~~|~}z|}}z|~~~~~}|{}uwx~x||~}uzyz||}}}{{{|||zzz||||||zzzzzzyyy}}}}}}~~~~~~}{}}}y{{y{{z||z||tvv}}zxxsqq|zz{yyxvvsqqussuss|zz|zzzxxxvvvttwuuwuuusssqqxvvusstrrvttxvvxvvvtttrrussupqupqsnoupqupqtrrywwvttvttpnnrpp|wx}xyvqr{|{vw|~~{}}y{{wyy{yyzxx|zz~~|zz}{{~||~||~||}}~||~||~~~~~~}}}}}~~~yxz|{}z|uuu}}rmovrwјpox}~{|~z}y~{w|{w||x}zv{zv|zv{zv{xtyxuwxuwvsuwtvvsuxsuxsuxsuxsuzuwzuwxtvzuwzuwzuwzuwztvztvytvytvytvvsuvsu~~{}yvxxtv~{}xuwzvx}z|xuwyvxzwytvwquvutxhgkmlpsrvsrvwsxnjonjpxtyvrxtpusprtprurtvsuliksprhegolnqnpebdroqebdolnqnpolnkhj``````___^^^^^^bde^`a^`a`bc_abceicgk[^bX\`Y\`[\`ZV[_[`\X]VQVTPUDPRCOQ>JL>JLBNPIPSMTWPWZNUXNUXKRUNTYOUZQW\QW\SX^UY^VZ^[_d[_d[_d\`d]`edgl`chadibejilpjmqhjndgkilpglohkojlpnmqsrvmnrlmqklpnospquprvpsworvorvpswprvsuvrttprsnprqstpoqrqsqprxvxrqsutvtsurqssrtutvtsutputputpuwsxvrwtswposutxutxutxutxtrttrtwvxpoqqprtsuwvxwvxonpsrtxwyzy{~}{z|wvxrqspoqonp{z|vuwwtvvsuvrttqsurtonpyxzqnpwtv~xz|ux|wy~y{}xz~y{}|~{xzyvx|~~{}y|{}zwyƲǭƣӶîҐllp|~|~|~~{}~|~|y{~zwy|~}{xz|~~}|~yvx~{}~z||{}rtu}x|}~{~ppp~~~|||{{{|||{{{www|||}}}}}}||||||y{{y{{xzzwyyvxxvxxwyynpp~uww}{{|zz{yy{yy}{{|zztrrussuss~|||zzxvvxvvxvvwuuwuuwuusqqussusstrrvttywwywwusswuuussytu}xy}xyytuytu}{{xvvyww~||}xy~zz}~{vwytuvxxtvvxzzuwwtvvyww|zz|zz}}~||~||}}~~}}~||~~}}}~~~|||yyy}{{}~~~~~}|~vuw~~~qqqy~zrwz}uqv|~}z||~~{}|~|{~}y~|x~{w|{w||x}zv|}y~}y~}y~zv{xuwxuwvsuyvx{xzxsuxsuxsuxsuzuwztvxsuytvzuwzuwzuwxtvxtvytvytvytvwtvyvxvsu|y{wtvwtvurturtwtvyvxurttqssprrqsnpqostutxposutxsrvsrvrnsvrw~xtyxtyvrwtqsrnptqsvsuvsuyvxvsumjlpmomjlpmoqnpkhjjhjifhjgiooooooeeehhhfffabcijk_abacd`bcbei[]aZ]aXZ^Y\`]^bZV[^[`\Y^VRWVRWAMOHRUBNQ>IL?KNFNPNTWPVYKQTMSVLRURW\W]bV[`U[aQV[TX]W[`UY^[_d[_dadi^afcfkadibejcfkaeicfjjmqehlknrglohloijnnmplknijnkmpoptoptoqtqrvpswqtxpswqtxorvoqrprsnpqnpqprstrtsrt~|~vuwutvsrttsurqssrtutvtsuspusqusquomqqosrqusrvtswsrvsrvsrvsrtsrtwvxrprqprutvutvrqszz{ppqrqsttvttvwvxutvrqsrqssrtqprwvxvuwxuwwtvvsutqsurtnmozy{urtwtv{}|vxxsu|wy|wy|~}xz|y{yvxzwy|~~{}{~٘}}fpsutx|~~|~~{}~~{}|y{|~|~}z|}z|~zrwz|}}|z{~|}}}}}}{||}}}}||{{{{}}xzz|}}z{{z{{z||z|||}}y{{}}~||~|||zz~|||zzxvvxvvsqqxvvvttxvvxvvxvvwuuwuuqoopnnwttusstrrvttusszyxussxvvussvqrvqrsnoxstwrspnnrppwuuywwussussz{{||vwz{yzwyyyzzwyywxxwzzxww|zzzxxussyww~~~~~~~~~~}}~||}}}~~~~~~}{{~}~w~|qstwyz~~~|~uqv}~zz}~|~wsyȧss|xv|}}|uqv{w|xty{w|{w|{w|~z~zzv{uqvwtvyvxxuwwtvqnpxsuxsuxsuxsuzuwytvwrtxsuzuwzuwzuwxsuxsuytvytvytvvsuwtvxuw}z|{xzzuwxsuytvxsuxrtytvzwytprrqstwxpstutyrquonsqptrrvvrwtpuokpuqvvrwwsxtqsomonkmpnpsprsprtrsmjlhfgecdgbdrlnoikniklginkmooonnnhihbbbcdcadfbfgaef_bc\`a`cg_dgY]`X]`VZ^UX\[TY[V[\V[]W\^W\KSSDLLAJJFNMDMMHKOLNRPRVMOSPRVQSWRUYUY\RTXUY]TW[VY^WZ_X[`[^c\_d^af`ch]`eadi`dhdglefjdeiijnklpjkoiiokkqllrkkqklrqnunlrpntqnuqnupnuqrvtuypquoospquoptnosmnrnosnosmoptwxsuvwyzprsnpqsrtsrtqprvuwvuwqswnptnptrtxoqusrvtswvuytswtswtswtqstqsttvrtupttprvwx|tswvrwtpuurtsprwtvvsuyvxtsurturtuqttqstqsttsutsutsutsuqqswvxxwywvxzy{{z|vtv}wtvxuw|y{}z||~}xz}}xz{}yxz͹©ĵƏԗzyz}z||~|y{|~{xz}}~|~~~}{z||{}~{}|~|y{~}}|~~vxxz}}~|z|}~{{{~~~{{{}}}~~~xuuxtuqlm}zz{|}zz{|~{{|xy{wx|{{~}}zyy}zzz{}~|}{vwzuvzxx}{{xvvxvv~~wwwsttxxxwwwwwwtttrrrqqqqqqnoouttzuvxstxstxstxstxstvprtnptopxsttrr{yywuuvtt}}xvv~}}zyyzxx|zz|{{~||xww{yy}||zzz}~~{{{~~~{{{z{{|||~}~~}~~~~~~~~~~~vwwccc|}|}}}~~~~~~~~~~~~~{}~qvyfhiz|}}npq~yz~|}|{}|{}{xzrop}z|}~{}~{}{}~wtv}y~Dzμ;ϙȤepsv|z~|}{}y~wsx|z{zwyzwyyvx{xztqswtvzwyxuw|y{{xzwrtxsuytvvqsztvytvytvytv{vxzuwytvurtolnxuwvsuwtvwtvwtvwtvzwyzwyyvxzwywtvvsuvsuvsuyvxurtvsuvtvtrtjoolopptunqrkopxw{tpuvrwzv{rptstulnoqqslnoopqplqtpuvrxrnsplqlikolnsprlikolnolnnkmvsumikjgiifhb```__lkkbaa^]]ddh\]a[\`XZ^[\`YZ^YV]ZX^YV\WV\XV\OWWFNN@IIBJJGOOILPKLPLMQLMQNOSPQUPSWTW[TVZWZ^X[_VZ^WZ_XZ`Z]b\^d]`e`ch^`f_bg_bgadiefjdeiklpnosefjnntllrkkqmmsllrnlrrpvrpvnlrnlrnlrlmqlmqrswlmqoptnosmnrlnrnosnoskmnqstoqroqroqrmopsrtsrtrqssrtrqsnqunquqtxqtxmptrqu|{tswtswtswtswvtvvtvrqsrtuswxrtxz{vuyyuzuqvurturturtwtvpmotsuqstqstsuvsuvsuvtrttrttrtttvvuwvtvwvxvuwutvwvxzy{}z|{xzwtv|y{|~|wy{}z|yvx~}|~zɵ}~}}z|~{}|~|y{}|~}|zwy|{}~{}~{}~~~~}~}~|~|{}~}~}|~|{z|{z|~}|y~txyy{|}~~}~~|||~z{}~|}}~ytu~~z{}~~}}xvv}{{}{{{yyz{|wx|wx~yz|wx~yz}{{}{{}{{zxxvttzzzxxxuuuvvvvvvxxxtttrrrqqqppptttsnoxstxttxttxttxstvrrupqzuvsnotrrxvvtrruss}{{qooxvvvttussxvv{yy~||~~{yy}{{}}yyy{{{uuuyyy{{{{{{}}}{{{~~~}}}|||}}}}}}}}}yyy|}|}}}~~}}}zzz|~x|}z~{|qvy{{utv~}}|~{z|~}|~}|~~{xz}}]Y^ᶾŴĚ|~{|x}{w|wsx|~zwyxuwyvxxuwtqsyvxzwy}z|xuwxuwytvytvytvytvxtvytvytvytvzuwytvxtvwtv|~wtvvrtwtvvtvvtvvtvxvxxvxwtvroq~vsuvsuvsuxuwurtvsuyvxyvxwyzwxyrtuuwxwyzuswsotminsot~xz{qstrtuprstvwuqvnjoxtyuqvwsxolnpmovsuolnolntqsmjl^[]hegolnlikhffb``^\\_]]b``cbfXY][\`\]a\]a\]aYX\XW[SRVSRVSRVCHIDIJCGHEJKFKLJLPKLPJKOLMQNOSPQUSVZVY]UX\VY]Y\`XZ`WZ_VZ^Z\bZ^b\_d`ch^bfcfkadibejefjdeijkooptjkoppvooummsmmskkqmkqrpvrpvnlrnlrnlrnosnospquuvzoptnnrlnrllpnosnosprstvwoqrkmnqstnpqrqsrqstsusrttsunquorvruyqtxux|xw{utxtswtswtswtswxuwxuwtrtsuvswxsvzz{vuyyuzsoturturturturtmjlqprprsprsqstqstqstrrtrrtrrtutvvuwutvvvxutvxwywvxwvxzwyurtyvx|~|xz}xzytv~y{~y{}xzzwy}|~dijʰɞқӀyxz}z|~{}zwywtv~|~|y{}|~~{}z~|~yxz|~~{}xuw|y{}~{}~~}z||~~}z|}x|}~||}zvz{~}xy~yzytu|}}~xst~~{vw|}}~}}}{{yww|zz}{{}xyqlm~yz~yz~yz{||zzywwuss|zz~||zzzxxxuuuvvvvvvvvvtttrrrrrrrrrtttxstytuztvztvztvxstxrtvrrsno~yzwuuwuutrrwuuusswuuwuuusstrrwuuzxx{yy}{{{yy|zz|zzyyy}}}|||yyyzzz{{{zzz}}}}}}}}}}}}zzz~~~|}|}}}~~|||xxx}~v{|}|~~{}xuwvsu~yvx~{}}|y{}z|~{}|xz}yvx|~~¡’w~y~|~}{}y~{zv{~{}zvxwtvzxzxvxvtvvsuzwy~{}zwyyvxytvytvytvzuwxsuytvytvytvztvxtvxrtzwyvsuvtvurtvsuvrtvrtvrtvtvvtvtqsvrtzwyvsuvsuvsuzvxwtvwtvvsuqnplooprsoqroqrz|}xtyvrwqmrrnsxtyrtunpqqstnpqqstrnsplqzv{wsxuqvmjljgimjlolnnjlliktqsifholngdfgdfhgfmkka__^\\b``^]a_`dZ\`YZ^VW[YZ^VUZUTXQPTQPTQPTGLMJPQINOCIJHMNKLPKLPLMQNOSPRVRSWQTXTW[SVZRUYX[_X[`WZ_VY^Y\aY\a[^c`ch_bgcfk`bh`chefjdeiklpjkoghlhhniiokkqjjpggmmkqmkqsqwomsomsomsklpmnrstxrswnosmnrmnrlmqmnrnosrtuuwxoqrmopwyzqstqprqprqprpoqtsuruyorvorvqtxtw{}|wvzutxtswtswtswwtvwtvvuwuwxswxqtxz{utxxtyokpurtwtvsprwtv{xztsuprsprssuvsuvsuvrqsrqsrqsutvsrttsuvuwutvutv|{}zy{vsuyvx|y{yvx{xz}xz|wyzuwz|}yxzПͭyy~~{}}~{}zwy|~|y{}|~}z|y|~~{}{z|~~oln~}~|~npq}{{}|~zy{~}~{vz{z~~{w{|{mop}|~~~~}~zy}}|~{|~yz|}z{|wx~|}}{{|zz{yy}{{~yz|wx}xy{|~yzz{}}zxxzxx}{{sqqwwwtttxxxuuuuuurrrrrrtttrrrtttrrrytuzuvzuvzuvzuvxstxstxstxstqlm{yyywwussussywwzxxzxxxvvxvvywwzxx|zz}}}{{}}~||yyyzzz{{{{{{zzz{{{~~~~~~zzz{||}}}}}{{{~~~quvsxy~~}tsu~zy{|~urtɧԢázqx{v{||~|~z|x}zwyxuwxuw}z|yvxzwy}z|zwyurtwtvvsu{vxzuwzuwzuwzuwytvytvytvytvxsuwrtpmosprvsutqsurturturturturturt{xzyvx{xzvsuvsuvsu|xz{xz{xz{xzxuwwuwrqssrtutv}|~vrwsotzv{xty{w|yx|rttuwxoqroqrsotuqvnjominplqvsukhjjgilikkhj[XZfbdd`bhegkhjgdfgdftqsb^ab^a_\^^]a[\`Z[_WX\TUYYZ^WVXYXZTSUTSTTSTBFHDHIGKL;?@HLMJKOLMQNOSNOSRSWSTXSVZUX\UX\VY]WZ^X[`X[`X[`X[`cfk[^c\_dadi_bg_bg`chdeiefjjkoijnklpjjpllrkkqmmsmmsnlrljppntqoupntnlrjkomnrqrvklppqumnrfgkabftuynosoqrprsmopqstmopqstqprqprnmorqssrtqtxsvzruyorvnqunmqwvzsrvutxutxutxurturttsuoqrkopsvzpquxw{tpurnsvsuvtvqnpvsuwtvutvqstqsttvvrturtusrtrqstsurqstsuvuwvtvsrttsuvuwxwy|y{yvx{xz~}z|z|zuw{vxzuw~y{tsuƲ}|~~nnt~~}yvx|y{|y{~~{}~{}~wz|~~~}|~wtv}}z|}z|}|y{urtzy{~~}~{}~~~~~~~~~~~~}xy~zz{vw~yz{|~yz~~z{{|{|{|~||~~}{{zuvytu|}{|{vw{|~||}{{|zz|zzvttrrrsssvvvtttuuuvvvfffsssssstttxxx~yzytuytuytuytuupq}xy}xyytuzuvwuuxvvywwwuuxvvywwxvvxvvxvvwuuyww|zz}{{~||xvv|zz||||||}}}||||||{{{}}}||||||vvv|||{{{~~~}}}}}}{|~|||||uuu{{{~~~~~~~~~~~~rswtw{}w|}~}~~|z|~{}~~|y{spr}~}z|}{xz|{ây~uwx~zyuzxty}~zzwyyvx|y{zwyyvx{xzzvxxuw~{}yvxwrt|wyytvxsuxsuxsuxsuxsuzuwzuwzuwxuwwtvwtvvsuurttqstqswtvurturtsprvsutqsurturtxuw}z|vsuspryvxvsuutvonprqssrtyxzwsxzv{vrwqptwyzuwxy{|vxyrtuuqvqmrplqsot}y~olnmjlwtvmjlmjljhjjgi^[]khja^`lik|y{jgi_\^c`bb_a\[_Z[_Z[_YZ^RSW^_c^]_[Y\SRTTSUTSUBDEBDEBDEACDJLMJKOJKOJKOJKOQRVTUYRVZUX\WZ^X[_Y\`X[`X[`X[`Z]badi[^c\_d`chehmadi`chcdhddhoptcdhlmqiiollrjjpiioiioljpljppntpntomsomsnospqurtxnnrpqumnrklpjkorrvklpoqrmopqsttvwqstqstpoqsrt|{}{z|vuwqtxmptknrpswtw{possrvrqurqurqurquvsuvsutsuy{|x|}orvqrvrqurnsrnstprtqsroqqnpxuwwvxmopwyzsuvtvwtvwtsusrtttvtsutsuutvwvxzy{wvxvuwvuw~{}{xzxuw}z|zxz{vx{vx}xz}xz|wyvsuȴōttzwvx}z||~~{}|y{{xz|~{xz|~{xz|{}}z|~~~~~|{~vy}}|z{}~qrv}}|~z~|ostuyzswx~yvx}~xy}~|{}|~~~}}}|||~~~{|}~~||{|{|{|{|~~}{{~||~yz}xy}~{|{vw{|~~~||~|||zztrr{{{uuutttvvvwwwsssssstttpppnnn~yzytuytuytuytuwrs{vw}xyytuytuxvvzxxzxxwuuxvvywwxvvxvvxvvwuuyww|zz}{{~||}{{ywwyyy{{{}}}zzz|||}}}}}}}}}zzz~~~}}}|~~||~||y}~~~}}z|~~~|z|Ѳx}~xz{|x}|x|zv{}|xuwyvx}z|xuwtqs{xzzwyzwywtv{xzwtv|wyytvuprytvxsuxtvxtvxtvxsuxsuxsuwtvwtvwtvvsuurtvtvtrturturturturtvtvurturturtxuw|y{tqsvrtxuwvrtroqqnptqszvxwsuokp~zwsx|x}uqv~}tvwqstprssuvkmnxty|x}qmrtpuyuzjgiolnnkmmjlkhjgdfmjljgikhjkhjfced`ehdia]bgchhdi_^bZ[_\^b]^bRSW`adWWWSSSVVVWWWRRREGHDFGDFGFHIJLLLMQLMQLMQJKOQRVTUYRUYSVZWZ^X[_Y\`X[`X[`X[`Z]b\_dZ^bZ]b\_d]`e\_dcfkcdhddhmnrabfjkohhnjjpjjphhnhhnigmmkqnlrrpvrpvsqwqrvpqustxoptoptnosnosnospqumnroqrmopqstprsqstoqrtsuqprpoqrqsrqsnqupswux|y|z}xw{rqunmqtswtswtswvsuvsuqprrtulpqmptpqurqusottpvqnpurt}z|yvx}z|xwyoqrvxyoqrrtuprsutvtrtutvtsutsurqs|{}wvxutvxwy{z|xuwwtvurt{xzyvx}xz{}z|}xz|wysprsrtͻŪqqw|y{|~~{}|y{zwy}z||z|}vyqln}|~{xz|~}|y{~{}~{}zwyzy{|}~vwx~utv}z|~yz~~{{{}~~}~{|{|{|{||zz}{{~||~||{yy|}{|||{|{vw{|wuuuss}{{|zzusslllmmmppptttuuuyyytttsssssssssuuu}xyzuvytuytuytuztvwrs|wxytuytuzxx{yy|zzwuuxvvywwxvvxvvxvvwuuyww|zz}{{~|||zz|zz|||~~~yyywwwxxx|||vvvqqquuuvvv}}}}}}|||}}}~~||~~~|~|~~y{|}y}~~{xz}z|{xztqs|~~{}|~~{}}|y{||x}~zzv{~z~zyvxyvx|xz}z||y{|y{yvx~{}zwy{xzyvx|wywrt{vxxtvztvztvztvzuwzuwzuwwtvwtvwtvvsuurtxuwvrtvsuurturtvrtwtvvsuurturtxuwvsutqswtvvtvurturtqnpolnurttqsrns|x}tpuplqrnsnmqprsnpqfhiqstjlnzv{plqqmrokpzv{roqliksprnkmkhjfcekhjifhdackhjdacd`eb^cfbfhdhieja`d]^b_`d_`dTVZ]_`[[[XXXTTTVVVOOOACDDEHEGHHJLIKLGHLIJNKLQMOSQSWRTXRUYRUYUX\VY]XZ^X[`X[`X[`Z]bX[aZ\cY\a\^e]`eY\badideiefjfgkefjhhlhhnjjpiioiioiiohfmmkqmkqigmkioljortxnotqrvnptlmqnotnosnnspqustynpqqstmopprsuwxuwxsrtsrsqprtstsrtnqunrvwz~{uy}yx|qptutxqptqptrpttqrtqrtsupssorsprvpptww{vrwwsxsprsprzwypmozwywuwuuwnpqpqrsvvqrsvuwtsuvuwvuwtsukjllkmutvxwyxwyxwyxuw|y{urt|y{{xz|wy{}|wy}xz~y{~~¿Φœpwoou{z|wtv~{}|~}z||y{yvx|y{xuwyvx|~wrtsrt}}}~{}~~xuw}}z|}|~vw{yz~swxcgh}y{xy~yz~yx|utx~uuu|}~~||~{|~yzz{{|~||}}~~{yy|}{|~yz||{vw||~~}}yww{yyxvvvvvppptttuuuqqqssspqqsttrrrvuu}xyzuvytuytuytu{vwupq|wxytuytuuqrusswttwuuyuvywwxvvxvvxvvxvvxvv|zz|{z~||}||{yyvvvwww{zzz{{zyyxxxwwwtttxxx~~}}~|{}~}~~{}}z|zwy~~}}|~~{}uvvΧʣv}otu|~~{{wsxwtyyuz}z|zwyzvx{xz{xzxuwzvxurtxuwxuwvsuzvwvqsyuw{vxxtvzuwzuwzuwxsuxsuxsuwtvwtvwtvvsuurtvsuwuvxuwurttrswtuxuwwtvurturtxuwxuwsoqyuwurtsprvprwrtvpr}wyxrtwsxxtyuqvytyyuztswpqrnpqtuvvyyZ[]okplhmuqvplqwsxpmokhjurtqnpmjlhegliknkmkhiifhgdeebhfbi`\ceahc`f^^bbdh_`d^_cVW[VX[ZZZZZZSSSXXXQQQFDJHELLJOKHOJHNHILCHHHOOKRRLUUISSQUVNRSWXYWWXZY[V[\TZ\VZ_XZdZ\f[]gX[dSU_Y\eY[eackdeiefjdeighlfgkjimkjnihlmlpkjnihljimmlphgkfeijimonopoqmlmpoprqsoqrnpqmopprrtwwtvwqstprshjkmopkmnonrsrvsrvsrvsrvmnropttuyoptklpposqptposrqupptonrnmqpostswtswqptpnptqsvsumjl|y{tqstqsqnptqssprzwyyvxsqsurtywyxuwnmosrtvuwvvxqprrqsutvxwyxxzxwyyxzzy{xwywvxxwyyxzx{wz|txy|w{}v|}x}Дloqyy|wvxxuwpmo~|z|}z|}z|}z|}z|}|z|}z|~{}}z||y{~zzz|}||}|~~zwy|~~}z|~||~~|~{w{|~}{z|xxz|z{}~}}||{~~~~~|}}|}}|}}}||~}~~~|||||||||||||||||}}}~~~}||{{{xww|||yyyxxxyww{vwysttqqvtturrvssussvttvttvttussvttussytuytuzuvytuxstxstwrsxstytuzuv|vwztuyst{vw|vw~yzxyywwwtttooo~yz~yz|}z{~yz~zzz{{|wuutrr}}~||~||||}~|}z{|||~~~|~~vxx{{{~npqz|}|~~~|~~{}~}z|~~}}}|~}ǜʛ_dg}{|v{{uz|v{|v{yvxwvxwvxwvxxwyzz|yx|xw{yx}srwtswsrvvsxvvzwuztswwtvwtvvsuxvxxuwxuwvsuvsuxuwwtvvsuytzmin{w}xty{w|plq{w}wrxwsxxtyvqwyx}xw{srvrqusrwroqwtvpnpzwyqnppmrrqutswvuywvzrquqnpomosprrprqnpsotminrnssotgchvqwokpuqv{v|mioiejiejhdigchfbg_ae^ae`bf_be\^b_^bjim_^ba`dZY]ZY][XZXUWTQSXUWURTEDHKJNDDGCBEHGKFHIHLMQVWOWWISSISSSWXPTUVXZVUWVUWRVWTW[X[`YZdZ[eVV`]^h\]gZZeYZd]_gcdhijnhimjkojkolkomlpkjnedhonrnmqjimonrkjnmlpqptnmoonplkmnmoonpoqrnpqmopnpqrtuiklprsprsrtujlmoqrrqurqusrvsrvsrvpqumnrmnrnnrnosmlprqutswnmqposqptqptsrvutxyx|wvzwtvvsuvsutqs~{}roqsprtqspmo{xzvsuvsusprxuwyvxyxzvuwtsuwvxsrtutvutvvtvwvxzy{}|~xxzxwyxwywvxyxz{wx{wxxtu~y{|xzz{v{Ȅs}}jno~}yvxspr|~zwy{xz}z|}z|}z|vsu~{}{xz~~|~~~~~~~~}z|~~}{z|~}{wx|~|~{~}~y{|y{||~|||{}}|~~|~~{}}{}}{}}~||uss~~|zz|||||||||||||||}}}{{{xxx}}}|||~~~xxxwwwyww{vwxrsusswuuvtttrrtrrvttvttvttywwywwywwxttxttztvytuxttytuwrsvqrytuwrsztuztuztuztu{uv~xzyyyxxxvvvvvv{{{z{}~~yz|}z{{||}}~}xyz{z{|zzxvv}{{~||~}~{|}~}moot{~z{}~~{}}~wtv}z||y{~}z||~}|~w{Ėşª~z{uzysxztyysxvsuvuwzy{yxzzy{{z|wvzxw{~}srvtswvuyxw{yx|xx|xw{vsuwtvxuwxuwwtvwtvvsuvsuxuwwtvvsu{w|uqvvrxvrwwsxuqvzv{uqvyuz}y~}y~utxlkorquutxutxtqsqnpkhjqnpurtnmqqptqptonrqptqptsprsprpmopmourtnjonjnnjonjornsokpkglokpiejminkgleafeafhdjgchd`e`cg_bf_bf_bf[^b[Z^dcgRQU_^b[Z^YX\ZWYWTVTQSXUWVSUA@EPOSHGKDCHJIMIKLHLNJOPKOQIQQLUUTXYTXYVXXUTVUTVRVZVY^Z]bX[bZ[e\^gTV^\^fY\cZ]d[^dbcgghljkoijnklplkomlpkjnedhonrjimposkjnjimmlpmlpihjkjlnlnnmoonpoqrnpqmopoqrjlmoqrnpqoqrjlmqstsrvrqusrvsrvsrvpqujkoghllmqnosqptposfeiposposrqusrvtswlkoljnonrtqs}vsupmotqslikfcexuwpmovsuxuw{xzyvxvtvtsuttvutvvtvsrtvuwutvtsuwvxvuwutvxwyvuw|{}vuwxwyzuw{uwxsu}xz|wy|x~Ȫ˷ɲĸʘ}urt|~|~}z|}z|}z|~~{}{xz}|y{}~~~~~oln~{}~~{}{z|xwyzz|y}~}|~|{}~}~~}{y{|{}~}}yx||||~~~{{{xzz~~{}}{}}{}}~~~||zzz|||~~~{{{}}}~~~|||zzz{{{zzz{{{zzzxxxzxx|xxztusqqussusspnnussvttvttvttsqqsqqsqqxrtxrtxttytuztvupqupqsnosnoupqwqryst{uv|vw{uv}xyyzzxxxxxxzzzyyyz{~yz~yz|}z{z{~yz}xy|}~zzz{ywwyww~}~{|~~~~~~sqqz||vxx}}}~~~z}orv|~~}~~|{|~|~|~|y{xuw~|~z~tx}{|z{uzzty|vzysxzwywvxvuwwvx{z|~}|{|{|{utxvuytswtswutxzy}zy}wtvwtvvtvtqswtvzwyvsuvsuxuwwtvvsuzv{xtysotvrwvrwxtywsxuqvsotwsxwsxwvzsrvtswutxqptolnpmotrtpmourtpptrrvqptposposrquwtvroqsprnkmmjlnjonjoplqminlhmminjfkkglplqjfkfbggchgchiejkglmin`bf_bf]`d^`d\`d`_cdcgUTXZY]YX\VUYZWYVSUTQSVSUXUW@?@KJLCBCJIKJIKHKLLNOLPQMRSLTTHPPOQVORVUVZVUYXW[TTZUU[YY_ZYb[ZcYXaWU__^g^]f_^g]]cddhbcgfgkefjhimjimkjnihlmlpkjnnmqlkoihllkolkohgkkjllkmpoqonponpoqrnpqmophjkoqrjlmmoptvwprsrtuoqrrrvtswsrvsrvsrvvw{pqulmqlmqmnrkjnxw{{z~utxsrvrqusrvrrvnmqzz~srvurtvsuqnpmjlqnptqsgdfyvxsprurturtsprurtsrtrqsrqssrtpoqttvutvvuwvuwxwyyxzvuwutv}|~utvxwyywyyvxwtvzwyxuw}u}|yʯˬyձ͜{}~|y{xuw~xuwyvx}z|}z|}z|}z|zwy|xz{xz}|y{}~~~~~~|~~}|~{~v~~}~~~~}|||}}}|||xzz{}}{}}{}}}}}{{~||}{{zzz|||~~~{{{}}}xxxwwwzzz{{{{{{zzz|||{{{}{{z{|vxvttywwywwywwywwussussusswuuwuuxvvwrswrsxstytuzuvupqytuytuwrsvqrvpqyst}wx|}}wxzuv|zz{yy}zz|zz}{{z{zuv~yz|}~yz}~~yzytu}xy~yz{yywuu~~~|||}}~{||}~}}|||}}}xvv~~~z|~|~~{}}rqu{xz~zwy~~ehpŪÔïåˮrrx~~x}}w|~x}ztzvsuvuwxwyzy{wvxutvyx|wvzvuyxw{wvztswsrvsrvwvzxw{{xzxuwtqsxuwurttqsvsuvsuxuwwtvvsuvrwwsxtpuwsxwsxwsxuqvyuzwsxxtyvrxkjnfeijimrquutxtrtnkmrprvsuqnptswtswtswposmlponrsprtqssprsprnlnkglhdiplqplqgchplqminlhmjfllhmnjofbggchkglhdieaf_bf[^bY\`[^b_bf_^b_^bZY]\[_\[_XW[\Y[VSUURTURTXUW?>@<;=A@BCBDFEGHGIHJKKNOJNOLQRNSTQTYPSXTTZVTZVTZVU^WV_XX^YZ_YY_[[aXX^WW]YY_\\b`agdeicdhfgkdeihimhgkjhlmlpmlplkoihlihlgfjmlponrkjnlkmjiklkmsrtqprqstsuvnpqoqrlnooqrprssuvprslnoiklrqurqurqurquutxrswijnklpnnrmnronrhgkjimonrsrvposrquposmlpsrvtsw{xzhegc`bmjllikdacnkmroqnkmxuw~qnputvtsurqssrtutvttvtsutsuxvxwvx~}vuwxwyyxzvuwxwyzwyzwyzwyxuwzwy~z{xϸȢ¯ƪ׳÷Ħζ~{}|y{|~~{}}z|~{}zxz|y{|y{~{}{xz~|z|{xzurtxuwyvxyyy{{{|||~{}~}~{}}|~urt~|{}lkm}jnoy}~}|~yxz~‰y{|z~~~|~~~}y{{~~~|||zz|||{{{}}}{{{|||zzzzzzwww{{{{{{|zz|wx~xytrrywwzxxvttxvvvttvttvttwuuvttusszuvxstxstxstxstwrsupqxrtvqrxstvpqztuyzz{~xy{|yxw|zz{yy{zy|zz}xyytu~yz{||}~}~~|zz}{{|zz~||{yyz{~}~{yy|||yyyuww|y{tsw~~{}}}yy۷ʼӫy~y~}w|~x}|v{zwyzy{|{}~}wvxyxzzy}vvzutxxw{vtxutxutxutxposwvzzwyzwyvsuwtvvsuvrturtwtvvsuroqxuw{w|xtywsx{w||x}yuzxtywsxwsxwsxzvzxw{wvzsrvsrvnmqyvxtqsvsusprolnsrvzy}srvnmqkjnposqnptqsvsuroqqnpplqwsxvrvvrwrnseafokpkglkglhdiiejkgleafnjoieja]b]`d\_c[^b[^b]`da`d_^b^]aYX\^]aYX\XUWXUWVSUVSUVSUAAABBBEEEEEEGGGEDFHGIHJKHLMFLMLQSSV[TW\YY_ZX^WU[UQ\WT]WT]ZW^\[_\Y`ZW^ZX^KIOWU[_]cbbfdeihimghlffjfeihgknlpmlpjimmlpfeirqu{z~nmqnmqpoqmlnkjlonponphjkmoplnoqstnpqrtuoqrprsprsikliklrqurquvuyrrvrquuvzlmqklppqupptrrvrqulkopptrrvrqusrvrqunmqposqptzwyheg}}}b`b|y{~{}|y{zwywtv~{}pmotsusrtsrtutvutvvtvvtvvtvyxzrqs}|~tsuwvxyxzvuwxwyxwyxwyxwywvxxwy~ɜ޲ąä¹hjlzxz{}~~{}}z|zwyyvxzwy|y{yvx~{}xuw{xz|y{|~~{}~{}~~~}~~~{}}}}~{}~{}|y{}}}}~v{|||||~~{}}vxxxzz|~~{}}}}|zz}{{~||~||zzzzzzyyy{{{}}}zzzxxxwwwyyy{{{{{{}{{{|~xxussywwywwtrrvttvttvttvttvttvttvttzuvytuxstxstxstupqupqvqrwrsxttztuztv{uvyst||~xz{vw~xy}wx~yz~xy~yz{vwz{~zuv~yzytu}xy{|{|{|}{{|zzzxx~||}{{{|z{{|{|qqqooo~~~|||www~||xzz~~{}}|~{}}z|yvx~{}~}|rqu}|}|~~{}~{}}}omv}|v{~x}~x}|v{zwyyxzzz|zxzutvvvxwvzxvzutxrqutswutxutxutxrquvuyurtwtvvsuroqtqsvrtwtvvtvyvxsprurtvrwuqvwsx{w|lhmuqvuqvwsxvrxwsx{w|srvsrvutxtswmlptqsnkmkhjolnurtonrxw{jimsrvsrvnmqsprroqqnppmopmoqmr}yuzplrplpvrwqmrnjoplqgchfbglhmc_dhdieafb^b\`d\_c\^b\_c\^ba`d_^b\[_XW[_^bUTXVTVYVXTQSTQSTQS>>>BBBCCCFFFHHHKHJIHJJLMLNOKOPNQUOQZPRZYXaYV_WT]WS_XT_YV_XW[ZY[YX\XX[ZY]ZZ]^]a\[_`aedeifgkffjcdhgfjihlmlpedhcbfihljimihlnmqedhmlpkjlmlnllnnmonmoqstoqrmopqstnpqjlmiklprsmopcefnppqptsrvwvzsrvqptstxnosnnrpquqrvvuyutxhgkqptrquutxqptrquqptonrtswxuw}z||y{yvxdacnkmzwynkmroqwtvvsuyvxtqstqsvuwvuwwvxutvutvvtvvtvvtvvuwyxz~tsuvuw|{}xwyzy{xwyxwyxwyxwyyxzroyzyηɮěmno|z|{~~}z|~{}|y{|y{|~zwy}|z||~}|z||y{}z|zzz~}z|~{}{xz}{xz|y{yvxzy{|{}onp}|~|~~|{}~y{jns|}~x}~|{~~~}}}}wyy{}}|~~}{{}}}{{~||~||~~~|||zzz{{{}}}zzzwwwxxx|||{{{{{{~||~yz}wxvttxvvxvvusstrrvttvttvttvttvttvttzuvytuxstxstxstxstytuwrsxrtytuxrs{uv~xy~xy}wxytu~yzuqr}~{|z{z{z{~yz{|{|}xy|}~{|zxx|zzyww}}|zz|}{|~~~uuu~~~~zxx}}|~~z|||~}~~{}|~~}|yx|~~{}~{}}~}}~ūzy}|v{~x}~x}|v{zwyxxzyxzutvutvutvvuyxw{xw{vuywvzutxutxutxvuyrquurtxuwyvxxuwvsuurtzwywtv~{}wtvxuwxtywsxyuz~z~mintpuuqvwsxvrwzv{|{z~ttxwvzvuyroqtqsnkmolnvsunmqxw{kjntsw}|{z~vsutqssprqnproqplrvrwhdilhmminokpminfbggchiejiejieja]bfbgd`eb^c\^b\_c\`d\_cZ\`^]a]\`]\`WVZ\[_UTXTQSYVXTQSTQSTQS>>>DDDCCCFFFIIILIJMILKJMJLNPRUKNRNPXJLTRQZTQZURZUP\VR]WT\XW[XVXXX\XW[[Z^XW[a`d_^b`aebdh`aeceibdhfeidcgedhbaedcfhgkkinjimnmqhgkrpuvuwpoqonpnmopoqlnolnooqrorrjlmjllcefiklikl_absuvqptsrvutxsqvsrvnosnospqunospquqqurrvoosrrvqptuuyutxwvytswrpt}|}z|xtvkhjmjlpmpyuwxvxsprxuwtqstqsmjlvsutqsrqssrttsuwvxutvutvttvttvtsu~}rqstsurqsyxzutvwvxxwyxwyxwyxwyyxz~ᱻÝȋ~{}vx}~{}{}y|wtv}{xz{xz|~}z||~xuwzxz|~}}z|}z||y{yyy{{{|||}z|~z|nkm{~~|}{z~y|{{~zy}}~~}}{}}}|}}~||}}|zz}}}}}}|||{{{}}}}}}wwwxxxxxxuuuyyy{{{{{{wrszuvwuuxvvwuuwuuussvttvttvttusswuuwuuzuvytuxstxstxstwrsytuvprxstzuv}wx|vw|vwxrs}~ztuz{~xrs}wx{||}z{}xy}xyz{~~{vw~zz}~|yy}{{~~{yywuulghvqr}~~~{{{|||xxxywwuwwqss~|~~}zy}qptz~~}|~|yz|~{z~|y{urt~z||~}}~nlwʮ¦tt~zz~x}~x}|v{ywyxwyxwytsuwvxvvxvuyvuyvuyyx|vuzutxvtxutxwuzqpttqsvsuurtvsuxuwxuwxuwtqr|y{vsuyvwxtytpvtpu{w}ytzvrwxtyzv{{v|uqvtpurqutswtswvuyqptvsuwsujgisprroqjjntswpptqptposlkoroqqnpsprpmomjlplqkglhdikgliejnjpe`fjfkiejrnsiejkglebehdiebeb]c\^b]_c^`d]`dY[_YX\]\`a`dWVZWVZYX\SPRXVXROQQOQROQ===BBBGGGGGGBBBHFLJHPKHPLIQROWOMUNMVONWONWQPYQPYQRWRSXSTXVX\STYXW[YX\ZY]ZY]\[_^]adcgedha`dbaebae``f]^b`bcfhhgiieghhjkhjkgijhkllookmqnoshjnmnrmnrkjnmlpmlphgkonrhjkgijgijmopfhilnopssrtuprsqttprsrqunlpqpttrvtrvqtxnrvquykpsquyuy{vvwzzzvuvvvv~ffhfegkjlooqrqsaaclnouuwrtuvvxvwypmopmowtvsprurtqprpoqrqswvxsrtsrttsuttvvtvzz|trtpoqwvxyxzutvxwyyvxzwy{xzyvx}z|~}ԷƱŏZcl}~}|~~{}|y{|y{|y{xuw|y{xuwzwy|~urtyvx}z|{xz|y{|y{|~~xuw~{}zy}||~}~|{}|{}xz{uwx|~|}||z~~~~}|{}~}~~~~~}}}~~~{yy}{{}{{}{{zzzzzzzzz{{{{{{zzz{{{{{{xxxzzz}}}}}}{{|zz~|||zzxvvvttwuuwuuussvttvttvttwuuommvttxwvwuuxvvxvvuss}xywrsvqrxttxstystyz{uv~xy~xyzuvzvwxvvpmmljjzwxz{{||}z{z{|zzwwwzzz{zz{zz~||~||~~}}kkksss~~~}}|yx|~}~~}|~~}||~||~}qu{yuz|x}{w|zv{yuzyxzwvxxwywvxwvxwvxvuwyxznmotsuvuwxsxysxxsxztnsvsuvsuvsuwtvwtvwtvvrwvrxzv{zu{xtyvsuurttqr~|y{tqsxuwsprtqstqsroqmjlursvrturssprkjlpoqmmoqprpprolnpmosprpmosprsprqnpsprpmomjlurtnjohdijflfbgjfkhegjgilikjgipmokijjhihffomnigga_`a^cb_da_cc`e^\`^\bXV\\Z`XV\WU[VTYTTXTUYQQUMOSNOS<<=@@?CDCGDDGFEIDCEDCEFEGJIKNNPLLNLNOQSTOQRLNOPRROPTRSWRSWQRVTUYZX\\[_[Z^ZY]]\`\[__^b^\`^]a`_ccbf``f`aebde`bbjlldfggijgijgijgijgijghlklplmqfgkbcggfjlkoqptmlponrkmnlnomopoqrtvwiklsuv{}~tvwrtuqstihlonrutxrqurqurquzy}srvnnpmmmtttqqq}}}rrrrqspoqpoqmlnonpsuvtvwqstlnolnosuvwtvpmotrtvrtvsusrtvuwrqszy{rqstsuvuwwvxutvpoqyxzvuwvuwutvvuwwvxwtvxuwyvxyvxroqƥ¯Ÿfmvtvw~|~~y{}zwy~{}{xzyvx~z|zwy~{}~xuwzwy{xzzxz|y{~z|}z||~wtv~}|~|{zy}||~~|{}~}{}~y{|~x}y~{~}|}uzy~~||||||{yy~||}{{{yy|zzyyy}}}zzzxxxzzz|||yyy}}}|||zzz|zz}{{~||~~~~xvvvttvttxvvvttxvvxvvxvvywwvttwuuvttvtttrrvttwuuxstytuxtt{vw{vw}wx|vwztv|}~xyz{yww~||}}}{{~yzz{~yz{|}~~~~||||||}}}~~~||~||}}}~{|}{{|||}}}~~~z~}{|vy~~{u|~}npq~vuy{z~~}zy}yx|~vuw~vwutwz|x}okp||x|zvzwvxxwywvxxvxvvxvtvwvxxwyvtvutvttvxrwxrvvpvysxysxurturturtqnproqroqrnsminrnsuqvyuzspr|y{tqsyvxroqxuw{xzqnptprsprqnpvsuxuwsprlikurtsrtrqshgiqprrqsqnpolnpmoqnproqnlnpmoqnpvsulikpmolhmhdifbgiejgchhegjgifcec`bb_aa^`dbba__b``ecc_]]_[`_[`\X]TPUZVZXV\XV\USYXV\USYRPVPQURRVLNRLMQJLPB@EA>ECAFFDJGEKFDFEDFGFHJHKNMOLLNOQRORSPRSJMNNPQQRVTUYTUYRTXUVZVVZYX\ZY]\[_^]a\\`_^b\\`_^b__ca`d``f_`dbdd_bb_aadfggijgijgijgijgijghljkojkofgkfgkjimhgkpnrjjnkjnlnoikkmoplnnprskmnmopegheghpssnppqptrquonrtrvrqusrvsrvrqugfjonrrqtqpqpooeefuvvppppoqrqsonpvuwutvqqsmpqrstnpqpprmnpwtvtqsvsuvsuvsutsuutvssuqprwwytsuutvutvvuwqprqprvuwvuwtsuuuwvvxxvwzvyzwzzwyywy˹Ɵ̾аũektprskjl|~{vx~{}yvyzwy~{}{y{~{xzxuw~{}~|~zwyzwyzwyzwy|y{~{}}|~zwy|{zz~}|~}~}~}~{{~|{}|wvx}|~utv~~~{~|~~}}}}}|||{|{zzz}z{}}}{{{yy|zzzzzzzz~~~yyyzzz{zz}||tsswxxzzzzzz|zz~||}{{|zz{yyzxxxvvywwxvvvttxvvxvvxvvzxxywwxvvvttvttvttusswuu|wx{vwxst{vw|wx|vw{uv{uv|wx{||wxxww~||wvuyww~||~yzz{|xx|wx{|~~|||yzz{yy|yy~||}}~~||}}}~~{|wz~|{}~~~}}|~~}z|~}~}|~|{}tsuwvv{zyz}~bfj̮¡urvkglyuzzu{yuzwvxzyzxvxxvxwuwutvutvutuvuwutvtsuxrwxrwxrwysxysxurturturtsprroqsprplqxtyqmruqvyuzurt{xzxuwqnpwtvsprroqolnurttqsolnspryvx|~~{}urtjjkomopoqvtvrqstqsroqsprpnomjlpmokhjlikvsukhjkglhdifbgiejd`fhegjgifcec_adaba^`b``ba`a_``_^b_``\aWSX]Y^ZV[WSXUSYYW]USYZX^USYQOUQQUPQUKKOIKOIIM9;<;=?@BCBDFEGHDFGBDECEFFHIMOPJMNKOPHMNLQRJOPKPQPQUQRVRSWSTXUVZUW[TW[Y\`UX\\_cWZ^XZ^Y]a\^b]ae^`dbcgabf`aebbgbdfedhhfkhfkfeigfjhgkgfjhgklkojimkjnmlpkjnrquhgklkolmqlmrlmqnosmnrlmqnosmnrqrvpqupqusrvtswrqurqurquqptqptqptnmqnmqnnrvx|lnqonrxtxsnsqprrrtrqsutvtrtmkmqoqsprvtvwtvvsuyvxsprxuwurtvsuxtvpmourtwsuyvxutvtsuyxzwvxxwyyxzurtyvxxuwvsuxtv{wvyww|zy}|γɨŷ˦«mmw{wy}{zy}|{~yz}xyz{z{xssytv}xzy{|~z|xuw}z|zxz~{}}}~{xz|y{~z||~|{}{}~}}|nmquruzvw{~~}vuwy~}|~}{~tru{z|{z|{z|{z~{z}zy~zz}zz~zzzzzz|||zzzzzz~xyz||}~~{yy}{{}{{}{{{yyzxxyzzvwwyww{vwzuv{xxxvvwuuwuuwuuvttvttvttsqqvttzxx|}}xyxstytu{vwzvwywwzww|zz~{{|xyyz~yz|}~yz}xy~yz}xy}~}xy}{{~||~||}{{~||~||yyy~{||xvv~||}}}{{}}~}}z||y{|||{}~}yvxxsu|z|{z~lks}{usywtv{vxtswxx|~u{tz{tywsxtswsrvwvzwvztrwwsxwsxysxzrxxouroqsrtrqsrqsooqqprvst|y{tqrurttqrtqsvsusprpmoroqa^`sprvsutqstqspmnpnnonmtqsyuzvrxwrwwqvwrwysxtotrnsqlrrmsplqqmrkflgfhcbdmlnpoqkjljgikhjlijhegkhia`eedhedhvvzedh``d`\ab^bb^cc_c`\a]Y^YUZ]Y^^Z_ZV[YUZ]Y^VRW`\aVRWRNSSNTSPUOKPLJNNJO:<=<>?@BC@BDBDEDFGBDECEFHJKNPQIMNKPQGLMJPPJNPKPQPQUQRVRSWRTXUVZSVZSVZ[^bUX\[^bWZ^XX\\]accg^_cccgbcgabf`aeabf^_cddhgfjgfjfdhffjhfjgfjhgklkojimlkomlpkjnposgfjlkolmqlmqlmqnnrmnrlnrlmqjkooptijnnosrquqptposrptrptqptonrmlppospptnosrswoptmlpvrwtnrnnprprqprxwysrtroqtqstqsqnproqyvxvsupmovtvwtvyvxtqsolnroqvtvxvxtrtsrtwvxutvxwyzy{roq}vsuvtvzvxyutvttsrtwx|ƚǝǍ}~{}|~zxx}}~yz}xy{|}xyz{|wy{}}xz}xz|y{{xz|y{|~~vsu}z||~}z|}z||~zy}wvz|{{z~zy}}||{|{|{yx|zy}llpwx|yz~|wz~~|{}|{}{w{|z|}||~|{}~}|{}yxz{z~{z~|z~|z~|z~}}}uuuzzzzzzz{zz|vwxstvtt~~}{{}{{~||~||~||{{{vvvwuu{vwzuvzuvtrrtrrywwwuuussvttvttwuuussxvvrmnrmnzuvzuvzuvyww{yy~||}{{~||}{{~yz~yz}xy{|{|~zzupq}~~z{}{{}{{}{{zxx~||zzz}}}{{{{z|xwy~}~|}}}}{~~}||{tswwvz|~zwy~{}~|~vuyqqwsqwwtv}wyvtxvuyw}w}|uzvrwonrljnposrqurquwsxvrxxrvyrwxnttqsutvttvutvutvrqswtvurtvsuurturttprpmopmotqsqnptqssprvsutqrsqqvttvsutpuminztnssmrysxvpulhmnjoplqqmriejkglfeggfhffhonpmlngdfwtvgdfdacheggfja`d_^bkjndcg_^b`\aeaf`\a]Y^XTX[W\\X]YUZXTYXTYWSXRNSPLQa]bTPTUQVNJOVRWSOTPLQLHM:<=<>?@BC?ABBDEDFGBDECEFFHJLNOFJKHMNDIJHMNHNNKPQPQUQRVRSWRSWSTXPSWNQUX[_TX\X[_YZ^^Z_a_cd`e`]beafbcgabf`ae^_c\]adcgfeifeiedhfeiffjfeigfjjimjimllpmlphgkgfjposrqulmqlmqlmqlnrmnrnnroptmnrnptrswoptqptonrposrqurquonronronronrrqurswtuynptmlpsotrlrmlnqprrqs{z|srtqnpvsuyvx~{}likvsuwtvurturtwtvwtvvsusprtqswtvxuwrqsutvwvxutvwvxxwy{xzvsuxtvwtv{xz|zz}{{wvxwx|ŻĘ̦x}{z|x}|~{yy}{{~yz}xy|wxytuz{}}xzxsu}zuw{xzxuwwtvurtzwy~{}zxz~{}zx|~}~~}qptzy}}|xy}|}{|z{u}|~|z~z|}|{}}|~yxzzy{|{}{z~{z~|z~|z~|z~{{{zzzyyy{{{yyyz|yz{uv|wx{yyzxx}{{}{{~|||zz{yyzzzvvvxvv}xy~~yz{yy}}xvvwuuvttxvvxvvxvvussxvv|wxxst}xyzuvzuvywwwuutrrzxxzxx|zz~yz~yz}xy~yz{|z{|wxzuv~z{}{{}{{}{{yww}}|||~~~}}}|||}}}}}}}}yww}~~~|~}y~}y~{~~}~}~zz~|{|y{~|}rquzzttz{xz}z|xw{xw{w}v|ztxvqvssvzz~|||{wvzwsxvrvvpuxqvxntrprtsuvuwssuutvqprurtwtvtprvsuurtsprpmoolnpmojgipmomjlurtolnsprpmowutxvvvrxrnsplslfkmglrlrtnssmrlhmqmrqmrnjolhmhdi^]_`_aa`ba`b^]_ZWYa^`dbd]Z\[XZ[Z^\[_KJNTSWXX\VUYUQVPLP[W\UQVPLQQMRSOTOKPOKPNJOPLQJFKMINPLQQMRLHMLHLQMRGCHLHMLHM:<=<>?@BCACDCEFDFGBDECEFEGHIKLBFGINOJOPGLMHMNKPQPQUQRVRSWRSWRSWUX\NQUWZ^TW[VY]Z[_]Y^`\a`\ab^bb^cbcgabf`ae^_c]^bcbffeifeidcgedhfeiedhgfjihljimmlpkjnmlpnmqtswnmqlmqlmqlmqlmqmnrnospqunosnosjkomnrsrvonrsrvnmqnmqonrpptsrvsrvposjkolmqlmqmlpplqrlqnmotsuutv|{}vuwrprroqnkmxuwwtvurturtxuwurtvsuqnpwtvurtsprxuwwtvtsuyxzyxzxwyvtvtsupmo}z|{xzxuwyvx~||{}ʮ˳Ŧū|~z}z|~||zxx~yz}xy}xy|wxz{~y{ytv~y{{}~|~{xz}z||~zxz|~zy}zy}|{yx||{|{}srt|{}~zy{xw{zy}|{~~wyzrs}}{~~}~~}~{z~z|}yxz~~}~}}|~{z~{z~zz~zz~zz~}}}zzzww}{{xvv{|{|yz|wxzxx~||}{{}{{|zzxvvrppwwwvvv{yyzuvvqrxstrpppnntrrxvvzxxxvvxvvwuusqq{yyz{}xyzuv{vwytuywwywwxvv{yy{yy~||~yz~yz}~xst|wx~yz}xy|}|~~xz}{{|zz{yyyww}{{}}|||}}}||||||{yy}}~~|||~~~~~}yxz}|~vxy~~~}z|~}~}{z~}|~}utxzwy|~|~|}}~|~a_ex{zyxzyuwww{|{~tz~rxyrwwqvvrwtputpuvqvtotwsxtputnswpuwmsrmourtwtvroqplnqnptprurtqnpsprqnpolnnkmpmopmoebdnkmroqolnkhjlikgdflikebcgchhdjuqwpjouotrlqnhmmgljfkokpjfkminiejqmrxwyvuwpoqfegihjzwy`]_b_adachegbaegfjdcghgkkjn`_c_[`VRWlhmeafa]b_[`_[`_[`[W\WSXTPUVRWZV[WSXUQVUQVIEJWSXKGLLHMB>C8:;<>?>@A?ABACDBDEACDFHIBDECEFDHIGLMJOPINOJOPKPQOPTPQURSWSTXSTXQTXPSWSVZVY]WZ^Z[_`\a`]bVQW]Z_]Y^]^b`ae\]a^_c`aeedhfeidcgdcgedhfeifeifeijimihlkjnjimhgkmlpmlpnlplmqlmqlmqlmqlmqlmqnosmnrlmqlmqnossrvrquqptnmqonrmlprqurqusrvmlpnosqrvz{hgkvrwrlqrqsqprqprrqsqprtqssprsprvsuurturtjgipmotprwtv}z|urturturtzwyvsurqswvxutvrqssrtutvtqszwysprtqs|y{yxz~~ww{ıŜʭrnv}y~zwy}z|}}|}|}~~zz|}{}}xz|wy}xz|wyyvxwtvwtvzwy~{}zwy}z|sprkhjpmoxw{~}~{z~~~}{z|~srvzy}lsv{|~{}z|}~~{z|yx|{z~zy}zy}zy}|zzzxx}{{~~z{yz|wxqookii}}~|||zzywwzxxxxx|||xvvytu{vwvttwuuvttvttvttvttxvvvttvttussupq|wxzuv{vwytu{yyxvvzxx~||ywwywwzuv|wx~yzz{~yz~yz~yz~yz~yz|wx|zz{yy{yyywwwuu|zz~~~yyyvvvwww}}~||~~}{{~||ttt~}~}~~|{}~yx|~}{{~}~}~}|{yx|}|{z~~}}z||y{yvx}|~~}~ruztw|rtu|{}tuyxw{{qw}qw{tyysxwsxwsx}y~zw|uqvwsxvrwwqvxqvzpvtoqomotqsxuwsprwuwxtvqnptqsurtqnproqroqvsutqsroqspr{xzpmosprpmopmosprrnssouyuznirsmrxrwoinnhmoinokpplqtpurnsplqqmronppoqutvrqskjlnkmlikjgijgikhjmlpgfjgfjfeigfjdcga]bb^ceafYUZc_dd`eb^ca]b\X]\X]_[`]Y^YUZZV[ZV[RNSQMRTPUSOTOKPLHM8:;<>?>@A>@BACDBDDBDDDFGGIJGIJDHIGLMHNNJNPJOPJPPNOSSTXWX\RSWRSWRTXPSWRUYVX\VZ^WZ^\\`[]aWW[[]aZZ^\]a_`dYZ^[\`Z[_dbffeiedhdcgedhfeifeifeiedhfeikjnlkojhllkonnrnnrlmqlmqlmqllpllpllplmqoptnoslmqlmqonronrqptqptnmqnnrpnrnmqnmqmlpnosstxxy}ihlsotrlqpoqvuwwvxpoqpoqtprsprrprtrttrttrtroqrprroqqnpqnpxuwxuwxuwxvxvrttsuwvxvuwwvxutvsrtvrt|y{}roq|y{yx|xy}psxɼȦšŢīyglu{v{zwy}z|~||zuv|wx}xy|}~yz~y{}xz}xz}yvx~{}yvx}|y{}|{z~~|}|~|||yyy}|}y|~|}|~}y~}|~~~~~~||~yx|{z~zy}zy}zy}}xy~xz}xysmnyzz{{|{|sqqljj~|||zzywwywwvvvuuurpp~ytu|wxvttvttvttvttvttusstrrvttvttvttsnoz{zuvzuvzuv{yyusszxxussxvvuss}xy~yz~xz~yz~zz~yz~yz~yz~yz|wx}{{}{{|zz}{{|zz{yy|||}}}~~~~~yyy~~~~}}|~{z|y{{{}}~|xv|{}~|~~vxx~~~~||~}}~{}zwyzv{{}y~yuzyx|xw{}|}|}|}z||~~vsu}z|~}~{xzvvz~͝y}orwsuv}stxxw{|rx}qw{tyysxysxysxsmrvpuyrwvrwuqvvpvxqvzpvuorsnpwrtytvzuwxsuxuwurturtpmopmoqnpolnpmourturttqssprqnpxuwsprroqyuzminjglzleqsmruotoinoinsmruqvnjoqmrminkgllhmnmokjlsrtnnpfegkhjifhlikkhjfcecbfhgkedhihlgfjbaea]ba]bgch[W\\X]XTY^Z_c_d[W\]Y^^Z_ZV\WSXVRWXTYTPUSOTUQVOKPQMRMIN8:;<>?>@A>@A?AB@BDBDEBDDEGHDFGCGHFLLFKLJPPJOPJNPMNRSTXXY]QRVQRVRVZTW[RUYUX\VY]WY^SW[RX[PTXY_b]ad[\`_`dUVZVW[nosbbffdhfeidcgedhfeifeifeihgkfeigfjmlpkjnonrnnrnnrlmqlmqlmqjlpjlpjlpopttuystxqrvqrvmlponrposqptnmqposmlplkolkonnrnospqupqunlpsottnsqprxwyttvqprrqsrprsprtprtprtprtprurttqsurtvsuwtvurturturtvtvurtrqsrqsqprsrtutvwvxwtv|y{}roqwtvuvzw{y|ĭqvwr{zv{{xz}z|~~zxxxstytuzuvz||wx~y{zuwxsu~y{}xz|y{~{}~{}|y{xuwvsu~|~|~}|zy}zz~}|~~~vvv{vy}x{{{~~~zz~vxy~|{}~}~~}~~}~}yx|{z~zy}zy}zy}z{gbczuv~yz|vwwrstrrrpp|zzyww|zzywwywwxxxvvvvtt}xyxtt{|trrvttvttvttvttusstrrvttvttvttytuxst{vwzuvzuvzxxwuuyww}{{|zzwuuytuytu|xx~yzz|~yz~yz~yz~yz|wx~~|zz{yyzxxxvv{{{wwwqqq}}}~||~~zzz|||}}}|{}~~|zy}xw{tsw~yx|{z~}ikluwxlnomop{}}}vxxnppvxxprr{}}|~~moooqqwyzzx~vtz}{}suv|~}y{{}}~}|~}{}|utxwvz||~~}{z~yx|}|{z~~~~{}ƙw|otuvxzrswxvz}sy}qw{tyysxysxysx|v{ztyuotvrvtpvvptxqvzpvvprsopxsuvqsxtuuprtqsurtqnpnkmpmorprpmopmotqsvsutqsqnpsprvsuroqqnpvrvokqrmwsnwvp{xrwxrwtnsrlquotvrwnjoqmrsotqmrrnstsunmoonplkmdceifhgdflikmjlfdfbaelkofeicbfcbfedhc_dc_dd`d_[`a]b\X]^Z_^Z_]Y^YUZZV\YUZVRWTPUTPUSOTSOTTPTNJNLHNHDI7:;<>@=@A>@B=@A@BCCEF@BCCEFFHIFIJFKLEJKLPQJOPINOLMQQRVUVZQRVQRVSVZTW[QTXTW[UX\UZ]NVYNWZKTWT]`U^`Z[_^_cRSWVW[mnrbaeedhgfjdcgedhfeifeifeifeigfjkjnkjnmlptswnmqmlplmqlmqlmqjkojkojkopptrswpqupqustxqptposnmqposqptqptmlpposposqptnnroptklprqusquwrwutvxwymlnnnopoqroqsprtqssprsprsprroqrprurttqstqsvsuvsuvsuurttqsutvrqsqprxwywvxutvurtyvx|xzzwyvsuyx|yyxzàеǭ٫y}}yzv|zwy}z|}}yww}wxztu{vv}xy|wx}xz~y{|~|wyzwyyvxyvx~zwyyvx~zwy}z|zwy~|}||{}|~}~}~}wx|}~|{~|~~{z|}{~~~~}}}~}~yx|{z~zy}zy}zy}z{}~}}vqrwuuussywwzxx|zzywwywwxyyxxx|zzytuxst|}trrvttvttvttvuuwuuxvvutsuttvttxrs|vx{uvytu{vwxvv}{{ywwwuuwuuzxx{vxzuv}xy~yz{|~yz~yz~yz~yz|wx|xy|zz{|}}{||yzy||||||{yy~~uvv~~~~}}z}~}}~~~xz{}zzttzzz|{~tw{|vw{y|{~|}stxyx|utx}|~~~~~{zy{yy|~}z|~{}~|~z{w}{|{yx|zz~~yvx{xzoln}~~~yvx{{}vzvz{prsrrvxvz}tz|qw{tyysxzsxzsxzsxzsxwpuuqvtpuuotxqvypvwpsuoqyruxrtzruztvursxuwnkmurtwtvtqstqswtvroqroqsprsqrvstsprspqurtrnsmiomhrrlwpjusmrsmqpjotnruotrnsqmrqmrrnsplqrnsonpkjlkjlkjlhgimjlgdfmjlheggdfcbfihmbaecbf^]a`_c`[a`\a`\a_[`_Z`]Y^\X][W\YUZWSXVRWVRWWSXUQVPLQOKPRMSRNRLGMHDGPKQ7<@8B8@AEEEDEDCDCIIHDCDFGKLNRKLPPQUTUYPQUMNRIJNQRVTUYRSW[\`VW[TUYVW[X[_SZ]RY\SZ]U\_X_bbcg^`dUVZ]^b]^ba`dcbffeiedhfdhhgkihlgfjsrvonrjimjjnllponronrjimmlplkonmqqptqptmlpstxklptuystxlmqonrnmqpnrmlpqptposposposnlpnlpnlplmqmnrpptpqupqurnrrntplrvrwvrwqprpoqnnpmlnmlnnmoroqroqroqroqroqurtvsutprsprvrtrqsrqsrqsutvyxzvuwxuwyvxvsuvsuzwyw}zsxƨĴʤƬ}{xty|~~{}{xz{xz{xz}|y{zwyzwyxuw}xz|wyzuwxsuzuw}z|}z|}z|~|~|y{|y{~{}~{}vsuzwy{xzrqsrrt}|~~}|{}yxz}|~~}{z|xwy~}~uvz}}wx|opt{~wz~z~kps{}~~}|~~{}|~}y~zv{}y~~zzv{}|~z}~y||xz{x{|xyz|y{}}z|~{}|~~z|z|~y{|wy|uv}uv}wx|wx~||wuuytu}xyytuytuytuwuusqqtrrvttvttzuvztvytuxstvrrxstytuzuv~yzvqrwrswuuwuuwuuvttxvv|zzzxxzxx{yyywwywwzuv}xytop{vw|wx~xyz|yzyzyz~xx~xx~xx}wxz{{|yvx|y{}}z|~~{}xuw|~~}|~~~~{}~{}|~}|{}vuwvw{|}mqrvz{}|~suv|~|~~yvx~|~|y{~}z|~{}zwy~|~|~pmo~xuw|~}}z|}}}~|~}z||y{{xz{x|~tvwvrw{uz{uzxrxxrxxrx{uz|v{ysxxrwwqvurtwtv}wtvtrtuqvrnsqmrtpvtpvtpvqmrqmrrnszv{okpuqvsotqmrrnsrnsrlqrlqysxtnswqvvptnkmnkmplrplrnjrokquqwtpvnjpqmsokpnkmqnpqnpnkmebdihjmlnhgifegedfdacgdfnkmdacdacbacbac`_a^]_^]_a`b_^`]\^`_aYXZXWYVUYVTXWVZXW[XW[YUZPLQVRWVRVRNSRNRMNMOOONNMNNNMMM7;@8?CBACHGIIHJBACIHJLMQGHLQRVPQULMQHIMMNRNPTRSWUVZVTXWVZZZ]VUYWVZXY]TY\TY\TY\W\^W\_Z[_XY]XZ^`ae]^b^_c^_cabf_`dYZ^fgkedhgfjgfjihlhgkfeiihlkjnihljimlkokjnjimlkopnrnmqklplmqlmqklpnosnmqlkomlpnmqonrposkjnlkolkoonrmlpklpoptoptoptnosplqplqplqrnsqmrmlnnmorqstsupoqxwyrntrntrntrntrntroqroqroqsprurtsrtsrttsusrtsrtsrtxuwxuwyvx{xzyvxyouojoɖɛwu{|zwy|~}qnp|z|}z|}z|}yvx{xz~{}vsuzwy|~}yvx|y{|y{|y{|~~{}xuw}|~zy{xwy}|~~||~|{}}|~~}~~~{|}~~~y~x}x}rwzsx{}wzvy~{}~tvwsuvplqvrwzv{{w|yuz}y~~{xzvsu|~zwy~|~~~{}~|xz{xz}~z||~}z||y{|~~~~~{}~z|}~~|~}y~}{yuz~z{z||{}}|~~}~}~~}z|{xzxuw|y{{xzzwy|y{|y{|y{zwy|vwxy~xyz{|zzzxx|wx}xyzvv|wxvqrvttusswuuvttvttsno{|ytuytuytuzuvwrswrszuvxstytuwuuwuuwuuwuuwuuussvttwuuywwvtt~||xvvxvv|zzzxx{yyoijyzz{~xy~xy|vw}wx~xy~xyz{|}~|~}z|yvx}z|}z||~|~|~~}zuwzuw{}~|~|~}~}~|}~x{pqu~}~}}~wtv|~}|~|~}~}}~}z|~xuw}|~{xz~{}}~|~}z||y{|y{|~}z|}z||~~{}zy~uz{swx{w|}w|}w|{uzysxzty|w|}x}{v|wrxuqvtqsurtvsuurturtvrvvrwwsxvrwrnstpusotsotuqvuqvtputpurnsqmrsotrnrsntplqojormrrnstpuolnqnpokqplrnirplrrntuqwsouqmstpuqnpwtvvsuurtebdrqs`_afegedffeggdffceifhc`bb_ab`bgfh``bcbda`b^]_^]_dcea`b[Z\XWYTSWUTXVUYTSWXW[UQVRNSRNSRNSSOTPLQJIJKJLJIJIHJHGI7;@:>C<@E8?CDCGCBFJHMFEIJIMHIMGHLGHLIJNHIMGHLKLPLMQMNRPQUTRVYUZVRWUQVVRWWVZUW\UW\UW\WZ^WZ^XZ^XY]YZ^_`d\]a[^b]`d_bf^bfZ]abdhjimihlcbfgfjihlhgkhgkhgkkjnlkolkokjnjimlkoonrnmqlnrlnrqrvmnrklpnlpmlpnmqnmqonrjimjimlkonmqpnronroptjkoklpmnrnnrplqplqplqqmrplqihjlkmhgitsurprsrurntrntrntrntrntroqroqroqroqtrtrqsrqsrqsrqsrqsrqstqsxtvvsuurtwtv|syfbg~trx|urt}z|tqszwyvrtxuwwtvyvxxwyvuwxwysrtrqsyvx{xz|~zwyxuw|xz|~}z|~{z|yxz{z|{z|||~|{}|{}~}~}||xx~xx~vv|jkowx|xz~|x}wsx{w|zzz~~ruyqtxhko{~~suvrtu}prsprs|{pos|zspyb^its|z~x|}x|}vz{imnpturvwux|x|su}vzy~}~|~prs|x}~z|y{~}~~~}|~|~~{}||~z~{~z|~{}|~|~|~|~~{}}z|yvx|y{}z|xwyzz|yxzzy{xwyz{xyyst|wxzxxxvv|wx}xyytu|wxxttvttusswuuvttvtttopytuwrsytuytuytuxrtxrtxstvqrwrswuuwuuwuuwuuwuuvttvttwuuwuurppvttvvvvvvxxxvvvwwwpjk|vwyz~xz~xz|vv}wx~xz~xzz{|||y{|y{|~~{}}z||~|~|~}}{}{}~e`b|~|~z|z||~|~~|~~~opt~}~~~z|}}~}~yvx~{}zwy|~}~~{}|~}}z|~}|~~|~|~|~~|y{}å{v~~|zv{|v||v{{uzysxytyxx|xx|tswutxutxroqurtvsuurturtuqvuqvtputputputpusotsotrnstputptplqvrw|x}uqvqmrsrvsrvuuxrqupptpossprqnpsouqmsrmvnjpnjpqmsplrplrplqnjlqnpurtqnpebdutvhgifegihjedfZWYnkmjgic`bb_a_^`cbd^]_``ba`b^\^ZY[^]_\[]]\^^]_XW[UTXSRVTSWVUYTPURNSRNSRNSRNSPLPJJNKJNJHMHHLHFK37<7;@:>C8D:8>B@HB@FCAIECIDEILMQJKOKLPKLPKLPMNRLMQLMQNOSTPUWQV[TYXSXZTY\W\TVZSVZSVZVY]WY]XY]Z[_]^b`ae\^bZ]a_dg_dg`eh_eg^aehfj]\`hfjigkgfjfdhhgkjimihljimlkokjnjimlkokjnonrkmqkmqgimhjnlmqmlponrrqumlpmlpiillkolkolkonnrmlpVW[nosrswqrvlmqplqplqplqsotrnsonpmlnnnpnnptsuonrrmvrnurmvrnurmvroqroqroqqnpsprutvtsuttvttvtsusrtyvxwtvyvxurt}z|OINhim{Đq|usyxv{rosurtwuwvtvwtvxuwxtusprwsuzwyzvxwvxxxztsutsutsuxuwxtvvsuxuwyvxwsuzwyspra^`khjwtv{z|tsuutvyxzutvwvxuuwyxzwvxzy{xxzrrtvuwqprvuw|}xy}xx~uv|xx~|}~|}~z~}z|}z|{xz~{~~{||~{}z|{}{}{}zwy|~|y{zwy~{}|{}|{}yxzzy{xwy}wxyzz{}xy{yyxvv|wx}xy}wx~yzxstvtttrrwuuvttvttvpq|vxztvytuytuytuytuytuzuvxstytuwuuwuuwuuwuuwuuywwxvvwuu|zzzyx{yyxxxxxxzzzxxxyyyztuvpqztuz{z{yst|vwz{z{z{z{}z|~|~|~~{}|z||~|~|~~|~~}{}|~|~}ytv|~}~~|~~~~|~~}~~}}|~~|}~~{}~{}~yvx~z|}z||~}}uu~~~{{{uqvyrx|v{{uzysxxtyvvzutxqptvuyrrvtqsurtusutrttrtsntplqminrmsvrwtpuvswvsxqospmrkhlplqrnstputputpurotonrqqtrqutswttxurttqsnjpvrxrlvnioiejokqnjpokqnjoolnnkmpmogdflikjika`bmlnfegccdgdfb_ac`bc`ba^_`_a_^`\[]\[]^]_]\^]\^_^`\[\^]_XWYVVZWVZWVZYW[[Z^RPTPLQQLQQMRQMRNJOLIOMJPIFLHEKGDJ99=<:D?:DCB?>B<;?=<@A@D@IFAJGFJLKORQUNMQJJNJKOMNRLMQKLPLMQQPTQPTZY]VTXVUYXX\WVZWVZUTXWVZZY]\[_ZY]ZY]ZY]a`d\^b_bfZ\`_bf^`d`bfefjefjddhdeiefjffjffjffjihljimjimjimljnmlpkjnjhllkonlpqptmlponruqvnjpnjonjoplpplqokpkglminplqmlpghlghlabfprvmnrolnnkmwtvnlnsprpmornpqnpnkmroqpmoplpnjpnjonjonjookpokpokpnjoplpkhjjgimjlolntqsjgiqnpurtpmo|~ž׶вϭɞɲ~xwyrqsquvotupuvrwxrwxost|v{ztywqvxrwqkpmjlurtvtvvsuvsuutvutvutvvuwtsuxwy|x}||zv{wsxyvxxuwzxzwtv{xzyvx{xz~|~urtvrt{xzwtv}|}z{pqustxxw{zy}}|xw{vuy}|zy}yx|qpttswz~y|}}~~}~~x|}~}|}}~~wz{twx{|wx~yz}~ytuxst|{}{z~w{|z}x{vx|y||uvz|z|~{}~{}|y{}z|{xz~{}~~|zzzxxywwxvvwuuwuuvttvtt~~pnn|zz|zz|zz|zzywwvttvttvttwuuzxxzuvzuvztvztvztvzxxzxxzxxxvvyww|wx~xzz{|wx}xy~yzzxx}{{|zz|zz|zz|z||z||z|}|y{~~~|||zzzxxx}xy~yz}~}~|x{{~}|~~{}~|~}}~vsuxzz|~~|~~{}~|svzruy}|}v|{}z|}z|}}{}~}~~~~vuw~|y{|~}~~~~~}~}~}~}~z{|{zv{zv{~{z~mqvsyÓ{z}vrwyvx{xzwtvwtvwtvxtyxtywsxvrwuqvostpttlpqmqrlpqqprqprmlnhhjlkmmoporvehlx{pswilpqptposplruotyrwvqvtptqmrxtyhdiokprquqptpossrvmlpnktmjsqluqisqitsotlkokjnkjnonrhgklhmkglfbghdhokpjfjfbglhmc_dgchhdieafb^ca]bgchgchjimXX\XW[ZY]WVZQRVaaefgkYZ^RSWRQURRVQPTQPTPOSPMRRKRLELNGNMFMLEL>=A>=A<;?=<@A@D@GB=EB=FA:9==<@>=A@;C?:CC>GB=F?:CC?E@@DCBFFEI@?CGFJFHLHIMGHLKLPPQURQUKJN^]aTRVXW[UTXRPTRQUWVZVUYTSWVVZUTXZY]WVZUTXc_d_[`a]bc_de`e``d_`d\]abcgcdhdeiedhedhedhedhfeimlpedhdcghgkihlkjnkjnqptwvzzy}rquminiejlhmokpplqplqlhmkgljfkrnslkohimhimmnrpqujkonkmnkmolnmjlrnpmjlolnnkmnkmpmonkmnjominkglkglkglminminminokpplqroqurttqsqnpsprpmoolnurtroqwtvvsus{|̷Ѯ˛ҼجȲλݳȸʠqvw|{}{z|rsurtuvwxtvwttvvwxvrxurvxtyuqv|x}wtvsprtqsvsuvsuxwyxwyxwywvxwvxtsu{w|zv{yuzzv{yuzwtvyvx|y{~{}vsuzwy}}xuw}~}z|~z|}z|~{}|y{|}{|{|vw{zy}}|~yx|yx|{z~vuyzy}xw{rquy}~}ux|}wy}|}|wx|uvz}{{~|ux{twx{z|~wz{vwxstytu|vxxstxw{|{~~}~}~}|~}{y}~|x|}{y|x{vy}x{}xy}|z|}z|}}~{}|y{}z|xuw~{}}{{zxx~||zxx{yy|zzxvvyww~~|zzzxxxvvusswuuzxxzxxxvvzxxwuuvttwuuzxx{vw{vw{vw{vw{vwywwywwxvvwuuxvv}xy|wx{vw|wx}xy~yzyww~||}{{}{{}{{{xz|y{{xz}z|zwy|||~~~xxxyyyzzzz{}xy}xy|}}}z}~{}|~{}z||~}z||~}}}~{}{xz}uwwy{{y{{z||{}~vxy~vuwwvxx|}|}mnryz~z{}~vw{|}wvxzy{|~|~~{}~{}}}~|~~{}}|~}|~~}~|~zv{{w|||x}wsxzv|~zy}vuyx{puyvrwvrtzwyyvxyvxzwyxtyxtywsxvrwuqvimnnrsostptunrttsutsurqslkmnmooqrjmqknrorvjmqgjnklpnossrvrnsmgltpurnsqmrplrplqminposonrgfjjimlkonlrkiomiomfmohonjnbaeposposfeifdhb^ceafgchiejfbggchjfk_[``\aiejeafd`ec_d]Y^_[`_[`[Z^\Z^ZY]^]aUTXXW[WVZPOSUSWONRPOSRQUONRLKOKJNJIMLIOLHNIFLHDJGCI32676:76:;:><;?<8>=9>A=BC?D=9>D@F>=A@?CHGKGFJFEIEFJHHLJKOHJNLMQNLPTSWQPTPOSNMQRQUPOSONRTSWQPTQPTPOSXW[TSWVUY[Z^`\a_Z_`[``\aa]b`_c^_cXY]^_cabfcdhdcgdcgdcgffjfeihhlihlmlprquqptljnnmqmlpjimonrihljfknjominokpplqplqb^ciejlhmnjokjnjkofgkghljkojkoqnpqnppmoroqpmopmopmojgiolnqnpolnnjolhmjfkhdijfkkglokplhmnjookpolnpmotqskhjnkmroqqnpsprtqsvsuurtƹӪǬȬȲνٲΟƪخuz{{z|yvxwuwzwyxvxxuw|y{wrwwrx{v|uqvwsxxuwurtroqroqurtutvutvutvwvx{z|yxz|~z}y~wsxqnpyvxvsuzwyzwypmourt}zwy~{}~{}~{}~{}}zwyxy}z{yz~wx|yx|~wvz~~{z{}~y|~}~}}x{xqty||uxy|zuv{vw{|zuvytu}|}|~xwy~}z~|z~|y}~xz~y||tw{{~xy}|y{}z|}z|~{}|~|y{zwy{xz}z|~|~{yy}}|zz{yyzxx|zzywwqooxvvzxx{yywuuwuuxvvzxxywwsqqywwwuuvttzxx{vw{vw}xyz{zuvwuuxvvxvvxvvzxx}xy}xy}xy~yz~yz~yz|zz|zz}{{~|||zz}z|xuw}zwy|||uuu|||zzzxxx}~}xyz{}~z}{~|{vx}}~|y{|~}~xzzy{{wyy}}psw{|{{~|~~}z||~|y{zwylkm}|~~|{|x}yuzzv{|}y~~z{}|{z~}|~}rtu[^b“wsxsprxuw|y{~{}urtxtywsxvrwvrwuqvx|}ostnrsptuptvsrtutvtsunnpsrtlnojmqz}losknrknrknrnosoptrnstpuqmrqmrc_dnjnxtyplqnmqkjnqptljnposmlpjimjfkpjorlqnjodcglkokjnfeigfjd`ed`ec_dkglhdihdihdigchgchgchiejb^cb^c`\a`\aa]b`_c`_cYX\a`d_^bZY][Z^WVZTSWONRPOSPOSPOSMLPJIMJIMGBHB>DJFLJFLKFL98<>=A659<;??>B?;AB>EEAGB>DB>DC?E@@DB@DHFJGFJFFJEFJFHLHIMFHLJJNJIMMLPNMQNMQNMQPOSPOSRQUUTXSRVTRVMLPWVZVUY^]adcg_^b]]a_^b[\_]\`]]a_`d]^bdei_`dbbfddhddhddhhgkdcgfeihgknlpnmqonrmlplkolkonmqtswwvz{w|qmrminlhnnjnlhm`\ajfklhmnjokjnhimhhljkojkojkopnptqsmjlliknkmlikkhjolnplnkhjmjlnjonjookpminnjonjoplqplqnjookppmotqssprqnpwtvurtsprqnpolnvsu|y{}̠ȳϦ­ɺ֠ͬ‡lqrxwyvuw{vx{vxzuvztvzuw|xzvvzvvzyy}ttxrquurturtvsuwtvxuwutvutvutvvvxxxzyxz|x}yuzvrwvrwsot~zwyvsu{xzzwy|y{~{}|~~{}~{}~|~{xz~{}|}~~}|}||{|tv~wvyxyytvvz~kopuyzvzzy||{~~{~{~xty{~~vzxqt{tw|uxzsvytuzuvzuvytu|vx{|~}}zwy~|~~}{y}~wz~wz~y|y|xz~wx|{xz|z|}z|}z|}z|~{}|xz}z|}z|~{}|zz}{{|zz{yyxvvwuuvttvtt{yy|zz}{{xvvvttwuuwuuywwxvvxvvussvttywwvtt{vw{vw{vwwrswrsxvvxvvywwxvvyww|xx}xy~xz~yz~yz~yz|zz|zz}{{~|||zz{xz~{}}}z||~~~~xxxyyy|||zzzxxxz|~zzz{~~}~z~{~|~}}{}}{}~~|~}|~|~z||z||}|~~|~|~~utv}ux|}z{~}~~}z||~yvx}~~}~}~~{|}y~yuz{w|zv{}y~{~z}y~|{|{zy}rqurtugjnuqvpmo|y{zvxxvxzwy|x}uqvrnszv{xtyx|}ptunrsptuswxvuwvuwrrtpoqrqssuvknrruynqumptlosknrlosoptpptkjnokpqmriejlhmuqvsotposonrqptmlpqptmlnjhjljkpklrmnlhmnmqmlpkjnedhfeid`egchfbggchhdinjohdieafa]bb^cc_d_[`_[`ZV[[W\d`eedhYX\YX\ZY]^]aYUZWSX[V\WSXVRWPNRPNRPNRMLPJIMJIMIGMHFLFDJIGMLJP659::>32687;<;?738<8==9>>:?B>B@:?>:??;@B>CD@EBAECBFFEIGFJHGKEFJEFJEFJFHLGHLLKOJINPNSONRQPTMLPVUYTSWRPTPPTSRVRRVWUYXW[YX\ZX\W[_UZ]V[^Y^aZ_b\_caae^^bbbfbcg`bfeeifeieeigfjeeimlpllpposkkoonrvuyqrvrqvttxllpsrvyv{urwolqkhmljnnkpa^bkgllhmnjoljnffjbcgttxjlpllpnkmnjllikhefgdehegjfhgdfjginkmnkmnjoplqokplhmmjominkglokpnjookpuqspnpolmomnolnqnpurtpnproqzwy|~֥©Ş˳ϗiqqv||utvwvwysw}vzwptxrt|uxytuvtyvtyutxvuytswvtvwtvwtvxuwurtvtvutvutvutvtrtxwylhltpusotxtxxty|y{}z|tqsxuwxux|xz|z|yvx~z|{xz~{}~{}{}|y{~z|yz~|}|~~z{}|~{z~~||}~}~~x{{z~|z{mru|xz{w|yty}vy~wz~wz}y{{tw{wy}yy|xy{|}yz|}~{}z{y}~y|tw{|~z|{}wx|zwy|y{}z||y{{xz|y{zxzzxz{xz|z||{{xww|zzxwwxvvzxxxvvvttywwzxx{yy{yyxuuywwussvttsqqxvvxvvvttvttzxx{vw{vw{vw}wyytuywwzxxzxxvttxvv{vw}xyz{~yz~yz~yz|zz|zz}{{~|||zz}z|{xz|y{~{}~~~xxxzzzzzz{zz{vw~{|z{|}||~{}|~~|~|xz~|~~y{~{}|~|~|~~|~}}{}}|~}{~~}xwy~|y{|~w{~}~~|~~~|~~}yxz|{|~~~~|w|~{~zqlr}y~~z|~|zz~|zyy}zy}z{zwzztx}jlswuzwuwywyvtvtqssprvrwuqvtpuuqvtpuqtuqtunqrorsorsnmoqprpoqsrtqprpprlosjmqnptmptlosjnrlosnptrswihlrnssotsotplqplqrnslloqptmlpihlonrlkmgfhrprpkmojlnjoihlhgkihldcgdcggchjfld`fjfkc_dgchfbgnjoc_db^c]Y^ZV[^Z^[W\\X]\X]YX\XX\TTXediWVZ[V[ZTYSMRUNSRMRNMQNMQNMQMLPJIMJIMHFLCAGFDJFDJGEK3.495:838<7<:6;857;8:968C@B@=?CAC?@DABFEFJEFJEFJGFHHGIIHJIHJIHJHJKILLHKKILLKMNNQQVUYQPTPQUMPTOSWPTXSUYVW[WVZXW[^^b\\`^^b\\`]]a_^bb]bd]bc^c^`d]dg_bfacgadhacgbeinptlosrtxwz~y{yq}w~uvztvztvzfhlegkfhlegkghlkkolkonjolglojonkpminqnslhmikokkolkolhmjfljgijgidachegqnpnkmnkmnkmlhnplrmhqminokpqmrnjoqmrqptpqvllqlmqnnrgkljnmkonopqlkpomsryРäԽ׭ǫõ̀s|u}v|{lqouururoxryzuvpxvrxwrwurwsuvsuvutvwtvxtvxrwysxztytns|v{{vxxuwutvvuwqstprswsywsyxtztpvzv|uwxwwyxz{vwxuwxuuwvxy}~~yy{|{}zy{zz|}|~{z|~~~}|}|~}|wzzsuvy||w{|wz~z}{}~htv~~~~~~zwyvqs{~~vx|uxwrt|xzxuwvuwonp``epps~~vv{zz~|~}yy}}{{}~~~~}|~}}}~|~|~|y{}z|{xz|y{x{|svwx{|wz{wz{vxxvxxy{{y{{rssoqqtvwxyzvuwzwy{vxxxx{{{zxx|wx{vwwttwuuwuuywwwuuxvvzxxzxxqoosrqxvvxvvxvvxvvxvvxvvxuwxuw{xzzwyzxzzwz{xz|~zwy}z|zwy{xz{xz|y{|~|y{}y||y{zwy{xz{}{}~y{~y{|~yz|z{|yz{|}~y{|}}}}}urt}z|~}{{}~~~}z}zz}}~|{}|{{y}~y~~xw{|}wx|yy}|}|{|{{{|{}|zz~vzzuyzvyzx|}uxyyuyxw{ux}zzxsw{suyqqunnstqrurttqspmnvsurprvsutqtsqssqssprroqtqstqstqsmlnjmqlosorvloslosnnrnnronrnmqonrokphdifbgnjojfkrnsplqpkpminokpjfkkgiolna\^jcfpfilfkjfklhmjfkhdikfkhdigchb^bfbgc_dc_dd`ed`e`\afbgd`e`\a[W\ZV[fbg]Y^WZZPUVQXXNSSUTVVUYURWPOSOLQNMQNPPKMNNMNKJLNKLJFJIGMLJPDBHDBHDBH1-2516627738738857:79968B?A@=?@?A>?CBCGDFJDFJDFJFFHHFHHHJHHJHHJGIJIKLJLMLNNKMNKMNTSWQPTSTXPSWQVYNSVRUYZ[_WVZWVZ\\`[Z^`_c]\`^]a_^bc]bd]bd^b]`d\cf_bf`cgadh`cgbeigjngjnknrhkoilpips^kmeqs`gjkpsnosjmqgjnbeiehlfimhkoffjmlplkonjomglnjonjojfkplrokphkojkolkolhmkglifhmjldacfcemjlliknkmnkmmiojfllgpokpwsxsotnjoqmrqptoptlmqpqullphlmglkjonprsmlptrxdktӦƮ̣µϣÏ˙hnlqvtqpltqmyu{ys~nirvrxvrwtswsuvsuvttvvtvxtvxrvxrxztxuotxrwzvxxtvttvsrtqsttvwvrxvrxyu{uqwyu{uwxsuvtvwuwxuwxvxyuwxwyzz|}z|~uwx}|~~~{z~|{}z|}xz{z~|xzkot}~z}y~yylxz{|{}kpo~sprrmo}vy~uxxqt~vsuroqvw{tuyy|{~tsu~}~~}~{|~{z|}~|{}|{}}~~y{wrt~}z|}z|{xz|y{x||swxx||vz|vz|xzzvxxxzz~moowyyuwxwyzxwy|y{}xzyyyzzzzxx|vx{vwytuxvvwuuywwwuuxvvzxxzxxwuuxvvxvvxvvxvvxvvxvvxvvxuwxuw{xzvsuyvx{xzzwy~{}zwy}z|zwy{xzyvxsprzwy|~|~yvx|~|y{zwy{xz~y{}}}z|y{||~wyzz|}y{|~~~}z|}|~|y{vsu~{}~~~}|~r{~z}~~{~~}~~~~{{z~~}xw{zy}{z~|}}~zz~z{z{|||z~zz~zz~|{yz~x||vz{uyzx|}txyzvzxw{tx|{pwzotwqtxprvnptxuwwtvurtroqtprqnpurtroqtrtrprsprroqtqstrtsprnnpilploslospswknrkjnmlponrnmqnmqsotqmruqvqmriejsotplqokpokpqmrnjomjlkhjuprlehqhknhmminnjokgliejiejfbffbf`\ab^cb^cb^d`\ab^c_[``\ad`e\X]\X]TPUb^ca]bZ\]NTTPXXMRSVUWVUYTRVPNRKJNKJNMOPKMNLJLKJLNKMKHJKIOJHNDBHDBHCAG405/+0738738405857:79646?<>=:<@?A@AE@AEDDHDDHDDHFEGGFHHFHHFHHFHFHIFHINPQMOPMOPLNOTRVQPTSTXORVNSVNSVPSW[\`TSWXX\ZZ^XX\a`d]\`^]a_^bc]bd]bb\b\_c\bf_bf`cgadh`cgadhdgkilpsvzpswqtxqx{o|~tqx{mrustxhkogjngjnhkoilpgjnfgkkjnlkonjomglokpokphdiplpokphkojkolkominlhmhegkhjb`bfcelikmjlnkmnkmlhniekkfolhmxtytpunjoqmrqptmnrnosqrvijnimnejilqpoqrihlvtzv}¦Ģʨ´Υqwvtywwvr~zsou{u|wvrxvrwtswsuvsuvtrtvrtxrtwqvxrwxrxxrwxrwztvwtvtsusrtrtutvwvrxvrxzv|xtz~zsuvrtuwyzvxzvxzz|}wyzwyzwyzy{|uwxyxz|{}}|~|{}yxz|{}}|~|{}|~}utx{}~z|}}~{jmq~{vz~~~}~x|}~|pmo{vx}vy{rurknojl{xz{xzyz~tuytuy|{}~~~{y{|~|{}~|~}~}|~}|y{}z|{xz|y{x|}txyx|}x||x||xzzvxxwyy~lnnz||wyzwyzxwy|y{}xzyyyxxx|zzzvv{vwztvzxxvttywwwuuxvvywwywwywwywwxvvvttvttvttxvvxvvxuwxuw{xzxuwzwy|y{yvx}z|zwy}z|zwy}z||y{zwyxuwxuw|z|zwy}z||y{zwy{xzz|}xz}~z|tvw}wyz~~~~hegyvx~|~{xzyvxurt~~z|}uwx}~~~z}~x{wz~{~~}zy~||yx|~~}~|}{|z{z{|z~{z~zy}xw{|{yz~y}~x||uyzx|}txyzv|xw{tv|lsvmruptxqrvpptvsuroqurturtrnpqnpurtroqurtqnpsprroqtqsurtroqpnpilpknrlospswknrmlpmlpmlpnmqnmqokpiejokpwsxokprnsplqminokpplqjfklikmjld_ahadlcfjdiiejjfkgchfbgd`ed`dd`djfkd`ed`eb^c_[`_[`^Z`]Y^`\a`\a\X]XTY\X]\X]Y[\LRRT\\INOTSUUTXSRVNNRFEIIHLMOPIKLJHJFEGJGIHEGECIA?EDBHCAGB@F2.3849,(-516:6;857968524?<><:<>=?@BF@@DCDHCDHCDHEDFFEGGFHGFHGFHFHHFHHOQRGIJIKLKMNRRVQPTVW[QTXPUXQVYPRVYZ^POS[Z^XW[VUYb`d]\`^]a_^bc]bd]bb\a\_c[be_bf`cgadh`dh`cgcfjehlilplosmptnuxcprfrtdkndilmnrgjnknrilpehlgjnilpnosmlplkonjomglplqplqiejokpminhkojkolkonjnlhmifhdaca^`heglikolnnkmnkmjflmiokfouqvuqvnjonjoqmrqptlnroptnosdeiimnfjjputtvwutx¨Ƨ̫Ų̗ɣjpov{ytso|wsywq|mhqvrxvrwtswsuvsuvsrturtwrtvpuwqvxrwxrwtnsytvvsusrtvuwqstqstuqwuqwtpvuqw~zsuvnpquwxxz{xz{wyzuwxuwxwyzz||wyzsrtyxz~}|~}wvzwvz}{uy~x|z{}}}|{vy{~|{x||~~wtvsprupr{tw}tw|~{}pquqrv~~}|~}~|}xy}|}|}}~{xz{~~}|wy~{xz}z|{xz|y{y}~txyy}~x|}x|}y{{vxxvxxxzzoqquwwxzzwyzvuwzwy{vxzzzxxx|zzzuv{vwzuv}{{vttywwwuuxvvxvvxvvvttwuuxvvvttvttvttxvvxvvxuwxuw{xzxtvwtvxuwyvx}z|zwy}z|zwy{xzzwy|y{zwy}z|zwy~{}yvx|y{zwy{xz}~{}z|~y{mop}xz{xz{y{|~{}~{}~{}vsu~{}|~~{}~{}roq}}~hjkcefacdjlm}nqvyz~{}~}wz~}}{z~~~|~|~}xvz}~{||}xy}|}{z~zy}yx|xw{{z~z{z~y}~uyzx|}txy{w|xw{sv{^dkdknqvypswqrvpquxuwpmovsuwtvpmotqswtvtqsvsupmosprroqtqsurtqnppprknrilporvloslosqptonrllpnmqnmqnjominzv{|x}uqvqmrplqlhmlhmplrqmrsprhegrmolehqhkichgchiejgchhdid`db^cb^chdib^ckgleaf`\b`\`^Z_^Z_YUZjfk\X]ZV[[W\^Z_UWXJOPZbbHNNPOQTSWRQUNMQGFJIHLLNOHJKGFHFEGJHJJGIFDJ@>DDBHB@F@>D \ No newline at end of file diff --git a/device/mpp/sample/ive/data/input/platelocation/car_2.bgr b/device/mpp/sample/ive/data/input/platelocation/car_2.bgr new file mode 100644 index 0000000..5ef6073 --- /dev/null +++ b/device/mpp/sample/ive/data/input/platelocation/car_2.bgr @@ -0,0 +1 @@ +-(*:57724<79=8:=69E@BDACC@BBACACCADBBEC>?=NLKIEDGGGOOOLLLVVVVVVTRVXW[XW[ZZ^]\`[Z\^\\WUU_]]\ZZfdddbbmkkkiiiggjhhqnpurtpmohegroqpmosqqussvttsqqpnnzxx}{{}{{{yy|zz|}}}jll|~~kkwy~ܐŻķѹں˿ÿȻŻ¹ƽ¼Ǭ΁È}y~ʧˢç~}zzyy~~~sonrnm~~~}}||xwzvtzvtwsr{z{yxnrsnrslpqdhinsthhhqqqkkkuuuhhhedfgfhihjhgia`bZY[_]]dbb^\\caa\ZZbX^TJPe[a`V\`V\VQSSQQOMMPNNNLLJHHNLLLJJHFFGEEFDD1,.846:57<8:>8:5.1724>;=C@BBACACCADBBFDGHFKIHJFEIIIQQQKKKUUUXXXTTXWVZXX\[Z^`_ca`b`^^\ZZigga__geefddmkkgeejhhjhhroqtqsroqwtvurtvsuvttwuuvttwuuxvv}{{|zzzxx}{{|zz|}}}wyy{}}}}v|~~ǿƺŹû¸ʾĻúÿˑϒʋɊȒ̓ğvvzvuron~}{|~}~zy~|xxzvuzvu|xw}||{zrturtunpqhjjoqrooooooggguuudddhgihgigfhgfhcbd^]_caaecc_]]a__\ZZ_U[TIPj`f^SYODJQLNPNNSQQRPPJHHMKKLJJKIIIGGIGGHFF613724=8:=8:>:9;?::<@;=@;=>7:B=?=:@?<>DACDCEBDDBECDGELMKPNMTPONNNPPPWWWQQQWWWVUYWVZXW[ZY]\[_^\^^\\`^^dbbfddfdddbbljjljjhffiggpmopmosprkhjdacsprsqqussvttxvvvtt|zz|zz|zz|zz}{{|}}|~|~y{{vxx~~~||wuuwy~|}vsѓżŹ򨨜עǎ¾¹þŦ֮~~}}{{~~~~{{xxww~vv~vv}vv{vuwtvxtvtqssprsprbbbiiiqqqrrrqqqpoqpoqkjlljlllnihjiggnll][[ecccaa^Z_XTYZV[ZV[XTYWTVSQQRPPOMMLJJNLLLJJLJJKIIIGGDBB1,.613>9;;68A<>B:>C>@B?AHEGFFHFHHEHFEHFHIGMKJSONNNNRRRWWWRRRWWWVUYXW[ZZ^ZZ^]\`^^`_]]b``fddiggigga__iggiggkiiljjmjlmjlqnpurtifhkhjxvvywwvttyww|zz|zz|zz|zz}{{|}}|~|~|}~}}}~nmӏ¸𲲦צ㦞ľü¹½μ~~||}}~~{{xxxxvvxxvv}uuwtvvtvtqsqnpqnphhhnnntttrrrqqqihjnmosrtmlnmlnkjlmkkljjljjcaadbbc_d\X\_[`ZV[XTYWTVUSSSQQTRRQOOSQQMKKKIINLLSQQSQQ946825<78>8;C=?C<@C>@FBDIFHIGIHIIILJHKHHIGOMLUQPQQQRRRTTTUUTXXXVUYXW[\[_[Z^\\`_^acaacbafddiggiggfedljjjhhnllmkkolnolnsprspr|y{zwyussxuuzxxzxx}zz}zz}zz}yz~z{|}~~yzՀsxx{}ⴴÖ괰Ĩÿǿع|{~~~~||~~{{zzyywwyyvv}uuytvwrspkmnijojlfgglllqrrooonnnjiklkmnmollnjikkjlommhfflkjhffeccc_d^Z`_[`ZV[XTXWTVWUUTRSRPPTQRPNMNLLKIIECCHGGCAA2.484:>:@?;A=9>CMGILFGNHJKJJLJJRPPLJJRPPPOQRQSTSUUTVWVXYUZ[V\]X]_[`c_db]bfcefcefcekhjkhjnikmhjrlnrlormonkmpmoolnolnsprvsuuuuxxxxxx~~~|||yzyzyz{|{||}}~~y|jo{mvowswfhܾЖľϖ½򯮥}ధźż¹»þЯ漶˸~~~}||{{zpp{qqxxxxxxxx|wv{vuysswrpxrrsqqvssqooommpnnnkmnkmolnmjlmjlmjlecc[YYjgiieic_eeahb^c\Y[ZXX[YYVVYTTWPOTRQTQPTRORUOQQKNPKMNHKLGI64:20697==;A<:@B;BGAFFACKFHKFHNJJMKKNLLNLLJHHPNNPPRRQSTRTUTVWVXXTYZV[\X]^Z_]Y^a]bjgib_aifhifhkhjpkmpkmqlnojlojlsprsprpmoqnpvrtxuwzzz}}}{{{|||zzzzzzzzzyzz{}~~ė͆x}v}yƯþגø淵ȿƽĿ¼||zz{qq|rruuxxxxxx~yx}xwxsrvqpwrqtrrwuurppnllommifhifhjgijgijgijgi^\\eccdacd`efbha]ca]b]Z\ZXX\ZZ\X]TPUTOTTOTTOTRNTTQSSPROMONLNMJL2171/576<<:@<:@A;BJDIGBDJEGLGHPJLNLLPNNPNNPNNSQQRPRRQSRRTUTVWVXZV[[W\]Y^c_d[W\YUZifhc`bc`ba^`jgipkmpkmojlojlniknkmrprurtwtvwtvvsuwwwuuuyyyz|z|z|yz{|ťɘɔʔЏєڈʆľڞĹ񘖎Ҍ˹¹¼¼¹½ȳwwzz|rr}ss}ssvvvv~vv~yx}xwxsrvqpwrquttvttrpprpppnnjgijgikhjjgijgijgijhhfddfce_[`\X^`\ba]b_\^\ZZ^\\]V\XRW\UZUOTVOTVPTRNPQNPPMOPMOOLN=@E;BG<@E:>C8JLDINHLQJOTHQUHRUJSWKPTLQSRTXPRTTTXQUVTVWUWX_\^[XZ]Y^\X]b^chdjfbgebflfgjdelghrlmpjkrmnuopupqsmnwrrvvxuxytxywz{z}~~w{|w{|~}|~zyy}{{~~~ȰМϴ˹ͨĽĻꠖՅ|sûºŵڰĿĻʷºŷӡƝ¾ƑŻ}}~~zts}||{{zyts|{{zzttzy{vvqklxrsrlmwqrvqrgbcniiojkoijmhhlgijegjeggbdfacc^`d_afacd^`c^`[Z[YYYYXYXXXYXYUTUXVWUSTNLMKJJQOP@?CBDH?DG:CF>JLBKPHPWBKRITZP\bMY^NWZPX[TZ]TX[UX\SXVSYWWXXYYY][[c^ac\be_da[`b\ac^`geeihhnllrppqoorppvttvtt|zzvutrtuw{|w{|vz|vz{x|}lpplpq|{}~~yww|zz~~ʿƯοط͛¿ƽ|Ǿ񖋄Ŀ»ŻµƾŽv¯vʹľޞ¿ûꧤȴ÷ݯ~~~~~yx{z~|{z~yx{vu~}|wv|{}wxystxrsxrs|vwtnpjefpjlpjlrmnlghlgijegjdfhdffacc^`b]_d_ad`b`\^YWWZZZ^^^XXXYYYUUUUSSTRROMMKIIPNN<;?BBFAFI@?CIKOEKNDMPCMUEOYGT^HXaRclFX_RbhTdkjx~jv|WahP[[OXZW__X]_X]^`[`jdildjjchjciichpoqjhjpoqnmoonputvqpr|{}vtvv{|v~~t}}r{zrzzt||x||w{|xz{~}|{}~||~||~yzȷãʧ°ĸ˥ɿúùøw}mr|ĽͽοþƼļº׿øۯſ||{{~~mhg~}~}~}{z~}~yx}xw{vuztu|vwystwqr}wxqlmtoptoptopnijjefnikmhjkfhjegidffackfh`[]c^`b]_][[XXXXXXYYYYYY[YYYSTYST]WXWPRRLM>8==;??@D@EHFMP@IPGQYKV^IV^ZipRbiUekftyVchR\cS]dR_cPZ`U]bTZ`V]b^\db^fiblfbjialhdlprvbcgmnrklpmnruvztuy|}uw{v{|ryyv~~s{{xu}}vz|x|}{z|~||˛¹Ǻû੣x{|yzyl}ŸDzuîĺȺ¾¾¹º¹ºͫĸþƺ~~||~~~~yx}|zy~yx{z|wv|xv}xw{uv|vvztvxrrztuqlmpklqlmqlmpklnijnikmhjlfhkfhjegmhjlgib]_`[]b]_^\\YYYYYYYYYYYY[YY_YZ]WXUPQWRSTOPE?DD@EAAE>BE@HJLRXGOVBKRDOUKW]HU[P\dKV^LU^U\eT[dTajWajYblV\fU\fZYf[Yf`\jc`nfbpfdprswjknnnrmnrpquqrvtuyyy}{|uvzqzznxxs~~mwws}}r{{vz|swxwyzxwy|zz~~ºƑż㴮»펊ȿ°qg]}ǻʾŻ¸ľÿÿĹø·ļĻ̰ҿ|{}|zy~yxzyzy|wvxsr{uvztv|vvwqrvpqsnopklrlnpklpklpklojlniklhjlfhjfhkfhidfa\^facd_a^\\ZZZZZZYYYYYY[YY_WX\TUXOPOGHXPPE?DD@D@?C?AE=ADCGKECIBGLFKOKPOSTMRSIPPCMM=HHENMVQVWV^ZXdZZh\\lLcvJfzIi[{jWxbrVvWvSoyZltlv}jmrklpnosonrkjnqptrrvutxtvwy{|wxzuwxy{||~}z|~~z}}}~||}|~~־ȱӬýıľŻͺݗíĬ´wƪĩDZ˼³Ķ©ïɴĴҧ{uĻƽǾɫѾ}|~|~|~|}||{{zzy{vutv}rtwy~su~su{twtprqlnqlnojlpkmpkmniklgikfhjegibehadf_bf_be^aa[\d^_`Z[`Z[_YZ]WX^YZ[VWVQRYTU^YZI?EHAFKEJKGLKGLLLNRVVJMNIOOMSTRVYVS[UU^RT`KRaWbsMf}HiXV`W[`hj^{_pwfowjmriiogknnlpljntswrptrptuxxy{|uxy}xz{zz|~{}|z||~y|kjf{vwӸŞĮͿ÷«ǰɴȶͱǻ;Ưӽȷο¶ʱê徶¶½¹ƽùṷ̀߭~}||||||zy~yxzyzz|xv}rtvxnce~su~su|uxvprrnpqlnojlpkmpkmniklgikfhjegibehadf_bg`cf_be_`hbcd^_c]^d^_`Z[]XYYTUXSTWRSXSTE>CE@DHBGKGLJIMJHJFDFRQSILMSWXNQURPYTU_T]jN\mi{]w[~]VPG|WYe[}Vszlt|lnvjnrkotmosklpstxoptmnrywywvxvuw~|{z|xwy~z||y{}~ux~~wvrо͸͈ľç÷򒋄ůŭԿ̸ɴ{ɽǻ˷~vŹ¹кյ}||{|{|{{z~yx{z|{zyvx~su}rttvyruvqsuprqlnojlpkmpkmniklgikfhjegjcfibehadhadf_bd^_hbcd^_a[\d^_`Z[a\]\WXVQRWRSXSTGAFE?DIEJJIMFGKMJLTQSONPSRTVXYQTWQRYRYaS\h]n{i|\xZ{SUTGxPe`[}Sn|gs}tzpq{moxlqvnosjkooptqrvrrv~xwyxxz{z|yxzyxz}z|~{}}vy~wzz}Żíƻ␏˞ƻ昒ıҺ̳ʴʵɵijķŷ³ŹõŶyٺʾŭŹÿżŻѿ뷯~~zz||}}zzzy}|}|}xw~yx|qs{pr}rt~su~suzsvytvtoqtoqrmopkmmhjqlnnikkfhkfhohkqjmlehg`ce^ad^`e_`d^__YZe_`b\]d_`_Z[\WXZUVYTUGAFC?DIEJGGKFGKLJLNLNRQSOQRQUVRWXTY[S\adpwRdn\myXob[ZT{S{TyRwNm}OkxUlwgp}jozrs|qt|nu|mptknrnrvqtxz}vuw}y{}z|~{}~z|~|~}vyxqty|̵̣љŻ晑ðθֽ͸ɴȴ˹p®Ǵî÷÷ôŰõ´ǸõطĸŹƺ¾ƽż౰׳~~~~}}{{~yx|{}|~wy~su|qs~su~suzsvwrtpkmsnptoqtoqpkmplnnikkfhkfhngjohkkdghadf`bgabhbbd^`c]^c]^a[\[VWZUV]XY[VW[VWEAFC?DGFJFGKEHLIJKLLNPRSNRSPUVW^^R\ZT]_IVYWdkR_hUjtjWvXvTqA[mNhzD[lRjwYnxar|fn{ehwsstwmv}prworvprvqtxorvxwy|y{|~xuwyvxywy~{}|~~y|žɴ²~}̣¹ȿǶҾԻѷ͵ȱ͹μķ³³Ǹµ|Ƹ˸³­ì~ɱ˿úĿúɽýŽ{{~yx|{|{~}|z|qs}rt~su~su~suxqtwrtrmowrttoqrmosnppkmnikkfhkfhpilqjmmfihbdibeicdicde_`d^_e_``ZZ]XY]XY]XYZTVZTVDAF@@DFFJGIMGKOMORSVWPUVPVWOXW]edUa\XebT_b[eiV^eOafPej@Z`OfnUfqO\lVdtTbpWhrbs{ds|ho{lo|rr~symu~otwpuyotwmrvouwtqs{vx{}~|~}~~|ʻ»ѡ̾ȸƼIJʶϸͳεƯ͹ɷ̽˽}̸˺οɼķôȸдȺǺɺ³n·̽ijԼϺǹƸƷ´zпÿ¹»÷ȼºۮȯ}}yy}|{z}wwwxtv|st~su}tuxptxsuvqsvrtvqsvqstoqpkmnikkfhkfhlehmfiiadibejcficdgabc]^c]^jde]XX^XY[VW[VVWRSWRS?EJ8=BAFKHMRDKPLTWNVYQY\LUXQZ]OWZV\^Z]`^_cY[_]\aT]_S[]OYXZca]gecin_fmejrelsinvlrxqqxnpwosypv{typv|rylsyygmsrvzx{|xyz||~~|~~|~{}}z}xvv轿ͽɴӺ˥ٰŰ¯®ðįɷǸͰµǸƸŷɽ·ĸŴ´ȺȻ²÷ȻǹµĺºŷĶŶ}ƏŶμ̿½̿ºǿ̨xxxnn{{||||ww}tt{{{uv}vw|vw|uvztuxstytutppvpqwrsytu}nikmhjkfhlgiidfjegjeggbdgbdfacidfb]_^Y\_Z\b[^eXZcWY`TV`TV`TV?EJ;AFAHMLRWJQVNVYLUXKUXNX[OY\OWZV[^X\`Z[_YX\[Z^Z^a^abZ_^`dbciggjkeikdgkglnikpkmrpqunqutz|ty|qx{qw~tzrxgnuv{~}z|}{}~}|~}|~|~}~{}}{{zuvʴ̶ڊƼƼ¼˰蠕Űî®ɶƳ̺ʼüǽöµʽ̿ĸƹƹöĶǷɼµ̿²ɼƹŸĶǶǺ¸ɿүȸŹúȿƼͥ~xx{qq{{zzyyvv}}yz{||}}wx{uvz{wrsrmntoptopupqrmomhjmhjkfhlgimhjpkmkfhgbdgbdhcegbd`[]]XZe`b\UXj]_\OQeWYeWYeWY?CHEINKOTX\aOSXKRUJQTIPSPWZOVYPWZVY]VZ^\]a\[_b^c[[_\Z\cddffdgigfeefhgecdmnnihilklklpssxy|nsvw~uy}vz~vzrv{sw|v{~|~{}~}|~}|~}~~{}~{yy~|}̾ʽɴ¸òľ¼ӪпİðƴͼͿȽſĺ¸̾ıʼĶķȻķµöǺȻ¶ŸöƺŹöƶȻµöööµ̿ŸǺ¶̾ŷżû·Ŷñ¸ƹûȼxɶǾ¾׾ͷ{qq~~vvxxvv~~yzyzz{~xx}wxrmn|wxupqtoptopsnonikmhjmhjkfhlgimhjlgijeghcehcehceidfjeg_Z\_Z\aZ]j_aZOQ_TV_TV_TVCGLFJOGKPTX]LPUMSVLSVLSVRY\RY\X^aUX\WX\YX\ZU[_[`ZUZgacc``hdcjfeifbmkglheusnlhflihllmnpqquvnrskpqvztx}sw|lqvy}otv~|~{}~}|~}|~~}|{}}}{yxͳΰҚᣕ¼uqпDzƲŴɺ˽¶ĺʻʼŴɻ´ƸĶǹ˽ŷɻõöµöö˾ɼƹööŸƹȻöŸ˾ŸǺƸ̿÷ǹ|ĸôƼ¶ȸƹƼ¶ɻĹrwjƿ̾«Ŀyyzppxxuu}ss}}~z{~xyyz}wxtopytuwrsvqrupqtnppkmrmomhjkfhlgipkmidfmhjidfidfjegidfjeg_Z\_Z\aZ]f[]bWY`TV`TV`TVGKPVY^KNSLOTNQVNRUMRUPUXSX[RWZVZ]XY]VW[a]beaff`ef`ehced_`okjlhglienkgurnjgcnkgwsrroqkjlsuvnrs}ux}ruytv{wz~x{rwxz~z|}{}~}|~}|~~|}~}~~}yӵĪӴ¼ÙĴ{¹ͺ˸͵Ϳ¸ŵǷʺ³úǸ˼ɺĵǸǺƹöƹ˾ŸöŸŸŸµö˾ǺķɼµµĶʻƸ½ľ·ɻx~qڰͿ¼ư¨|x~}xxwwxx}}yy||}}{{}}{|z{z{vpqxrspkl{vwsnotoptoptopsnpojlmhjlfhlgilgikfhmhjkfhhcehcec^`]XZe`b_Z\e_bg_`bZ[^VW^VW^VWLLRKJQLLRJJPPOVMPTMPTQSXRUYSVZVY]XW[ZX\\X]e_dlfkgafjeghcdgcbokjlielhdnkhnkgnkhsnmvttpooknmrttousvxxwyytvvxz{z|}z~||~{}~}|~}|~z|}{~~xz{Ƴ䀁ſýԿIJнıĹǽ¸Ĵó²ôǸ˼ȹŶŶ;ǺƹŸööµķööɼȻµƹǺöǺķµĶĶµ·Ƹ~|ΫȺľdzɼٳ}~|x}}{{zz~~||~~~~yy~xy~xy|}xrsvpqtopzuvupqwrswrswrstoquprqlnlhjidflgikfhmhjkfhhcekfhkfhlgifacidfb]_f]^bZ[_VX_VX_VXBBHIIOEEKLLRPPVLPTLPTPSWRTXTVZSVZYX\[Z^c]be_djchc_debdfdda_^igfjhhhffjhhjhhkiimllqlmtrroooqssqrrsuvvxytvwxz{z|}{y}~y{|{}~}|~}|~{}~}~~|||Ͼɺȏ¼¼ľ좙ȿǴ˸λųĺ˾òɽƼ¸IJǶ±Ŵŵͽ²ƶ̼òŸöµķŸŸöǷķķŸƹ˽´vȻ¶ȺĹsƸ{qjضǽīŷ¾˺׵~~~~~~||~~~~xx{|yz}wxztuzuv|wxzuvwrswrswrstoqtoqsnpnhjidflgikfhmhjkfhhceface`bb]_]XZe`bb]_b\^_ZZ]XX]XX]XXAAGIHNIIOKJPMMSMOSLOSORVPSWTW[RTX]\`^Z__Z_`Z_hbgbbfddfijjhihefdggggggijjijjnoosqqrlntrrbbbvvvqrrsuvsvwwyzxz{z|}z~x|}{}~{}~}|~||~||~ywuɑе˿艁}¸ʻİñȺ˽Ĵȷ²ǷǷĴϿŶƵòķǺƹöµŸöŸµ´ööxȽǺ¿ƾʿɻ»㞕ʢȺɾ¾׼ɴ{}}{{||||~~|{}}xx|}|vw|}ztvyst{vvyttxstvqrvqrvqrwrttoqrmoniklgilgikfhmhjkfhhcegbdf`bd_a`[][VXa\^b\\_YZ^XY^XY^XYLINMINMJNOJONLPNNROPTQRVTUYTUYTUY]\`\[_YX\][`fdhdabebdfbeifhebdjgihegmillhjroqtqsommsqqtrrtrrvttttttttvvvzzyzzywz{vz|vz{w{|z}~{zy}u{|ĨζΘĻµĸĿĿ{uȌûȷƴŲįʲкϾǸƻƼźĹƺŹ÷ȼȼĸʽɽŸöķ˾ƹŸȻƹöŸķöóµźĻȻ»·ĹƔ{ûƺ¾ºÿؽxz{{~~}~z{z|yzyzyzztuystystzuw{vxwrtzuwvrtvqswrtvqssnpmhjlgiojlmhjkfhjegidffacfacfac`[]^Y[_Z\^Z\[XZ\XZ[XZ\XZMINOKPOKPPLRRNRNMQOPTTUYTUYTVZVVZZY]\[_a`d]\`dcgifhb_a^[]hegjginkmjhjmjlnjlolntqssqqusstrrussvttyyyuuuvvvyyywwwvxywxywxyy{|{}~{{|x~uuu·ҼķǼ¼ĿýóƳı¯ʴʱɳ̼ùǽǽĺùɽŹĸȼƺĸȻŸĸźķ¶ķöĶ´ķķŸȻŸɻɽȼ¼®ƹƻ~Žƺ¼Ļ¹¸ĸƽԸȽ|~~~}}~~~|~}wxzzz{yz|vw|vw|vw{}wrtvqs|wywrtvqswrtuprtoqqlnnikojlnjljfhjfhjdfgbdfbdfbdb]__Z\`\^a^`^[][XZ[XZ[XZRNSOKPLHMRNTTPTQPTRRVTUYTUYVVZWX\ZY]\[_`_c]\``_cgdffcefcejgihegmjllikpmopmoqnprnpussvttsqqsqqsqqtttuuuyyy{{{zzzvxyvxyvxyvyzz|}|~{|ɴļźü|óƳŲȵdzűɳ̶ųʺɼŻ¸ĺùĺȼŹĸȼƺ˿Źŷƺķ÷ĶµöƹµöŸµŸʾ¶ºźƽƺûľ³ô÷skםŷżúżܵǼ~~~~~xy~yzz{{|z{|vx~xy~xy|~vqswrtxsutoqtoquprsnptoqsnpojlojlqlnjeglfhjeghcehbdhbdd`bc^`c^`b_a^[][XZ[XZ[XZNJOQMRSOTUQVUQVVUYSTXRSWTUYWX\YZ^]\`\[_^]acbfbaec`bfcegdfhegfceifhifhqnproqxuwolnrppvttxvvwuuvttyyyvvvwwwwwwzzzyxzyxzyxzwvx|{}~|~ȹžµݶǼĹøĹʿ¼½þμʻɹŲƳʸ̹ɴȱɳʹ·´ºĺ¸ùĸĸɽŹĸɽŹ˿÷ĶƸŸ÷öµƹŸµɼǺƹ˾ƹķ˾ɼɿúǻƹļľ;ŹŷźķDzЬżżùĽҼҮyy}}|vw~~}~{|z{}wx}wx}wx}xzxrtxsuwrtvprxsutoqsnpqlnrmomhjojlrmojeglgikfhhcehcehcefacd_ae`ba^`\Y[[XZ[XZ[XZQMRPLPSOTVRVZV[UTXSTXSTXTUYRSWVW[ZY]]\`]\`baebaefcehegjgijgiifhjhjlikpmosprqnptqsrppvttwuu{yy|zz{{{yyyxxx}}}}}}{z|{z|{z|yxz}|~~~|~~~۶ߛǺ̿ƼμĹŹ˸ƳŵȴŲʶïǵǶŸǽ¸ùȾ÷÷ȼɽ÷Źȼ÷ǻȹȺŸöµɼķǺƹķǺķɿĹżżĶĵɻ÷ĸ̷̾½¹ĺɽѿзκ~~~~~z{~~{|{|{|~xyyz~xyzuwxtvwrtupruprytvsnptoqsnpqlnmhjqlnojljegojljegjegidfhced_afacd_a_\^\Y[[XZ[XZ[XZJFKPLQVRWVRVVRWUTXSTXSTXTVZTUYVX\ZZ^_^b^]a`_cfeifdfhegjfhhfhifhnkmnkmolnolnnkmpmopnnusstrr}}ussvvvxxxyyyppprrr}z|}z|}z||y{|~~}~~üʜƹµƾķɺ˻IJðŵŲî̸ȶʸɺ÷÷÷ʾĸŹǻ¶÷Ƕĵ´µö´ĶõǹǺ˾Ȼ˾ͿǹƸĹöɼȿúýȹrƻõʻxw෮¹ż¸˹ѷΘz|~~~~~~~~|||}{|z{{||}|vw{uvzuwytv|wyytvojlsnprmormotoqqlnnikniknjlidfpjllgijegidfhcee`bfacd_adac^Z\ZWYZWYZWYKGLNJOOKPTPUUQVUTXSTXSTXVVZXY]WX\[Z^^]a^^ba`dgfjhdfheghfhhegjhjnkmqnppmopmoolnqnpsqqxvvvttusstrrvvvyyy{{{{{{}z|}z|}z|}z|}~~suv~ȯ֛¶·ϒĽõ¯ƶ²Ƴȵ̹μɼŻ¸÷÷ǻ÷¶ȼ¶ƺŵƷʼƸƸɻȺ¶´ƹƹŸĶȺƸɻǹ´¶żý³÷ȼ|ŷvo;뻲ºƽŹĹƱҿԱ|rrzz}}}~|}||z{{|{||vw{uvzuwytvz|{}vqsytvvqsuprtprrmoojlniknikjegpkmlgijegidfhcefacf`bb]_ebd_\^ZWYZWYZWYLHMQMSPLQQMRUQVUTXSTXSTXWX\Y[_VX\a`d`_c_^bedhcbfhegheghegjgimjlkhjsprrprpmonkmpnprqpwutwttvuuwvvvvvwwwwwwxxx}}}}z|z|z|z|~{~~yy{||~ȵҢ¶˾ɲƜΒöɺŷƺôƷijȶϼϽĻùȾŹĸ÷÷·¶ŹξɹƸôĵǷǸȿƹµʽµķ˾ʼŷƸƽŽȿȼͿ³ôŹŐwɻ}uȝ̼žն¼¶ýִ}}}}}}{||~|}}~{||vwyz~xy|wyvqs}xzzuwvrsxsuvprsnpuprsnpojlojlqlnmhjnhjidfjeghdfhcefbde`b`\^c`b^\^]Z\\Y\]Z\PMOOLNNKLTQSURTVUVUTVTSUUTV\[\]\^bae]\`]\`cbfdcggfjgfjccggfjhglnkmpmotqsolnpmoqnproqtqstsuruvruvqttvxxyyy|zz|zz{yyyxx|zz~}~~wvv~||ǺϥùƺɹƸ¼ĿĹɹľɹ÷ƺʼĹźƹùĺŻȾȾ¶ĸ÷Źƺ̺ʻij²ǹŷɼµ³ɺǺķʾ»üžƾûɿɿúƻ¾ɿȧ}sûľϾϺ¶´ȼ̶죢}}~tt~~~}~~|}~}~|}}wxztu}vyyruzsvyruxqtwpstoqsnpuprpkmqlnnlnolnljlkhjjgigegedfeceedfa_a_^`^^`[^^[\]Z\][\]QNPNKMLIKTQSTRTSRTSRTTSUUTV[Z\\[]^]a]\`^]abbfedhcbfedhhgkgfjhgkliknlnqnproqtprsprroqtqsrqsqstptunsruwwxxxywwyww|zz|zz{yy|zz}}~~~xzz£źĵɺ½˽³ĶŵɹķĹĹʾɽǻùĺŻȾ÷ǻǻǻɿȷ¸оǺʽ˾ɼǺĵƶȹ̾Ÿ²ĸǻʽ¼¼û¸ǽĺŻ̿¶ĸ¶ŹûyȹŰǹ˿õ˿´ĻžνĶ竫~x~~~}}zz~~~|~|}}~}wx|vwx{zsv{twzsvzrvxqtxsuwrttnpqlntoqpnpqnpnkmkhjlikgfhgfhedffegbac^]_]_`^`a]_`]_`]_`QNPOLNMJLURTTQSQPRTSUWVXYXZ_^``_a`_cdcg``dbaegfjdcga`dfeifeigfjlikmjlolnroqvsuroqsprsprrqssuvtxyqvuvxxvvvuss}{{~|||zz|zz{yy~||ʬ£¹οͪnjiǽ³Ľ˽´ɹóùȽƼ¸ȼɽ¶ʾƺĺǽŻŻ¸¶ƼɽɽȼŴɿǽ¸ϾȻȻɼɼοĸ˿˿ƾòſ¸ùȾȾø¶ƺ÷ĸǻȽtnṫ̩¾¶ĵǸô³¹¹視񟟮rw~}}}}~~~}~|}}~{|ztu}vyx{x{~wz|ux|uxxsuwrtsnppkmtoqroqpmomjlolnkhjkjljhjihjkjledfihj_ab[]^]_`]_`]_`MJLOLNPNPURTSPRRQSUTV[Z\XWY^^``_a`^bgfjcbfbaegfjrqucbfhgkedhgfjnkmnkmplnpmovsupmosprsprpoqqstswxx}|wyytttzxx|zz~||}{{|zzzxx~||~~~}}Ϻ½¿ز|urƽŻǿµĶȹĺŻĺùĸĸŹùǽƼȾƺȼʾɸƵɿͼķʽ´´ʼ÷ķʽƺ÷ǿýʿ·ɿƼĺĺ·ȼʾǻǻŹŹƺ¶쵨ҹâ;ùɾø÷ݴ鑑~zslv~~~~}~{|z{}wxxqtx{y|~vz}vyzvxytvzuwuprvqspmonkmifhlikpmokjlkjljikihjbacrqs`bcdfg`bc`bc`bcYVXTQSQNPTQSVSUSRT]\^SRTWVX]\^[Z\`_chgkbae``dfdhgfjgfjedhhgkhgklikolnolnpmoqnpsprolnpmoonpsuvostuzyz||zzzyww}{{~||}{{|zz}{{~~~}Ԧ÷ʹĵȹ|wøȾ¹ƹõƹ¹ɽ˿ĺȾù¸¸Źǻ˿ƼǶȾп´ķöööǸŷƹµ÷ijýýĝ¸Ⱦ¸ź˿¶ȼ¶ɽػȼĸĵ³»÷Ǿx~~k|kh~~~{|yzyzwqrzsvvorx{{tw~wz|ux}xz~y{zuwvrtwrtsprolnolnnkmroqvuwmlnmlnjikfegmln_abdfgacd^`a^`aJHJMJL\Y[VTVXUWYXZXWY\[]`_aYXZa`bedhZY]]\`_^bdcgfeifeiedhgfjfeinkmtqsroqnkmurtvsutqsrnpqprtvvptvuzyz||||||zz}}~||~||~||~||~~~ۡŶǸ𾻷¶ǹµżĶú÷¶ɽ¸ȾƼĺɽĸʾ˿ĸƼɿijķķķķǸĴȹȺµȻɽĸĸ¶ļòºº¼¸Ƽ¸¹Ĺ˿ʾɽ¶¶¶¶ƺĸ·ɻżŹϴɹƶż윥joWˏ}z{~}wx}~yzyzz{|vvx{{twy|~wz{tw{tw}xz}xzwrtxsuxsuvsutqsliklikolnrprihjmlnonpdcebac^`a\^_acd^`a^`aYVXJGINKMXUWYVXPOQXWYUTV]\^[Z\YXZ`_cXW[^]abaedcgfeifeigfjhhlfeiebdroqurtvsuurtsprurttprutvtvwrvxuzyz||~~~~||}}~||~||~||~ИǼ¿ĵý⽺ŸǻɶµȻǹǼŷúʾƺƺʾȾƼŻŹʾŻɽȾŻɿƼijķķķķȹƶŶ̾öƺ÷÷ƺŹòȷǿĺĺǽĺȿĹ·÷ĸŹ¶¶¶ŹÿƼ¢ͷ¾¹ǾĻԹŭǍ|ȅ{{~}{z~{||vw}~~|}z{y|x{y|yruyru}vyzuwxsuvqssnptoqroqvsuqnppmopmollnihjjhjihjedfbac^`a_abacd^`a^`aC@BIFHVTVVSUWTVYXZ^]_XXY[Z\\Z\\Z\a`edcgfeiihledhhfkihlkjnkjnhgklhjxtvuqsurtolntprsprurtvuwtvwuxyvzy{}}~||||~||}}~~~ߺĸ;ôȰǸƺʿĸ˺ʼȾͿĻƽ˾ȼ˿ȾǽŹ¸ǻĸŻùɿĺ̿ķöķķŶϿǷɼƺȶ¶úļɺƾɹļľý¿ŷŶȾŻǽƾ·ź÷ȯ÷Ŀ¶ǶȿԽؽǩÈ{yy~}ztu~xyyz{|~}~~~xy}vyx{~wz~wzx{|ux{vxytv~y{pkmsnptqrqnpqnpolnmjligillnedffeggfha`b__a^`abcd^`a_`aXZ^NNRUV[WW[TUY[Z_WV[^Z_b]bc\ae^d^]_dcehghedfihjjijhgijikkjljhjmlnnmommosrtrqsqprqqquvu{{ztttxxxxxxzzzxxx{||{||~||}}׾ƽþѿƹŻĽ}rzļŹɺóȻɻƼƽźùȾŻ¹ɺǿǻʽʾĸ÷÷÷ĸĺ¸ù̻ù¸¶´ɽõƸǺöõµ¶ȽµøýȿƼżȿȽøȼƵù|㰢ȺƷþ۴xzxu̠}wv~}zz}||{{z{||}}~{|yz|uxy|x{z}{~yru{|vppxrsvpquopsomsnnsnormoqlnmjlqmogdfdacfceebddaca_ab_ab`ba^`JKOJKOUVZXY]YZ^ZY]]\``\`e^dd]bd^ccbddcegfhfegihjjikjhjljlllnlkmgfhonponpsrtzy{utv|||vvv~~~wwwxxxxxxzzzyyyzzzzzz}}~||δƺҼŽȻŷιމxȺǾʾʺʺƸ˽ŷȺƼ¹ù·ǽ¹ɻȻǻʾ˿ĺȼʾƺɽ¸òǽ¸ͿƸķķĶĶĶ÷ǻøüŻ¹úǾʿƻʿ˾ʿƸƾ¹ƼȺȹĺ¿󐤱vzƨt}}}xw}xwzy|||}|~{|yz{~{~y|zsv~wzyru}wxwqrystvpquopsplsonsnormoqlngdflikgdfdbdfdffceebdebdebdd`b_\^KLPNNRSTXSTXTUYXY]]\`b^cdafc]bc^cdcedcegfhhhjihjlkmkjlmlnonponptsusrtnlnqprqprvuwzzzttt|||wwwzzzxxxzzzyyyzzzzzz}}~||~~~||ÿƱͺ½޷¶ۡƾȿȿȸõ¶õ´ĺĹùļ÷ĸɽĸɽ˿ʾ˿ʾʾƻǽù¸ŷʼĶ̾ȺµȻĸĸĸ¶ǽȾ¹¸ù¸ŻȿŻøÿ·طµ}Ǿ򳥧ƸƼ¹ȶ{̅ŠĐ}||~|}||{|yzxqtyru~wzwpszsvyruystxrsystvpquopsplsonsnormoqlnroqsprlikebdhdffdfebdebdebdd`b_\^IJNQRVUVZXY]VW[YZ^XY]`_ceafd^ca]bbacdceedfkjlihjmlnlkmnmoqprrqszy{poqkjlvuwxwysrtuuuvvvwwwtttzzzxxxzzzyyy|||{{{}}}{{~~~||ɻǜƺֵ¾ɽ⦠µ˽ƸʺŹĶĶĶɿ¸ȿĺȽɾºǾɽȼǻɽƺǽ˿µǼ·ɻ´ɻʼƸƹŸŸŹĸƺȾŻ¹ñǻĺú¸ø·ý··Ĺʿ´ͿzĺxŻƸŸżɽkw{|fwnv~}|{{z}~|}{|{|yz}vy{tw~wzxqtyruyrtvqpxsrzusvqpuposplsonsnormoqlnolnrprqnpfceheggdfdacb_ab_ac`b`]_QRVSTXYZ^UVZXY]WZ^SW[\]acbfeafa]bdcecbdonpdcehgijikmlnnlnmlnonponplkmutvonputvwvxvvvrrrxxxwwwzzzwwwzzz}}}{{{~~~ljj}{{~~~~~~vttӼک÷ùˈƾ˱ƸǻǹʼǹĺȼŶȼ˿¶ĺŻŻ¸µŹʿøƻ¶´Ⱥǹ¶ƺ¸ɽȾǽƼ¸ǻŻƽżýýÿøƿͬɼzǽʾƼõɾŹǾ½½ɳw{uvv}||{{vu~yz|}yz{|yzy|y|y|}vy{twystxsrxsrupoupotonsplsontoptoqrmolikpmojgiebdgdffcec`bb_ac`bc`bc`bTUYSTXUVZWX\VW[WZ^X[_ZZ^^`dcbfeafedfbbdhgibachgicbdjikmlnmlnpprqprpoq~}tsuvuwttvvvvsss}}}||||||{{{{{{{{{}}}|||}{{|zz~~put~u}ܾʼͿӶ¬˿ĸLjŽŵȺ´õɿúºǻĸŽǽ¶ʾɽʾŹ¸ƼȻû¸ŹʾĸĶȺõƸĶõĵĶƺȼʾɽùȻǻǻǻŶ²˼ùúúľ¾ĺÿƸ̧úǽyƿȼǻƻǸĺȾƾ|Ʀµ~~}~{|yzy|y|y|~vz{twzttxspxspxspwrnvqnsplrnmrmnsnpqlnlikpmokhjfbdhdfgdfdacdacb_ab_ab_aZ[_Z[_XY]STXYZ^WZ^Y^aWZ^]^bcbfdcgfdfbacdcebachgigfhrqsedfpoqrqsrprwvxvuwvuwsrtwwwvvvzzzzzzxxxyyyyyyxxxyyy}}}~~zxx~{}szvo{o{ճƕþÿ¿zulxż˼õĶõŻƺƺȽ¶ɽǻ¶ù˿ȼ÷ɻµʾŹ˿ĸŹʾʼõ´Ź̾ȼȼʾ¸ɽȼǸǸƽǾƼ·ſƳſľ»ſŷ¹Ⱦ}sϺĸµſĺĿ¸Ż󁈗zrz{qqzz~yx~}yz{|{|yzy|y|y|~wz|uxztvxspxspvqnupmtolsplrnlpklrnppkmlikpmokhjfcehfhhdffcedacdacdacdacRSWVW[STXTVZVX\WZ^X]_[^b_`ccbfbadgegbacfefddehfhgfhnmonmoonpmlna`bqprsrtsrttsusrtwwwwwwwvv|{{{zzzzy{{z|{{{zz|{{}}~~sqq}z|oln~~s}rvq}ܾ˼ں̶חûsne|ûǿɻʾĸ˼Ƹ¸ȿƾŸǻʾļ˿Ź˿ȼżùʾƺɽľƺ˿÷÷ĸŹĶȺɻǸƷƷøŻɽ˿ʼʻ̽ξȿĻǾøüĹ¼Ŀüý̾ŹxɿȪ¶輷Ży_vllwwxsr}||vw~xy~{|yzy|y|y|x{}vy{uvxtoxtoxtpxsowrnsomqmlojkrmoojlmikpmolhjgdfjfhheggdffcefdfgdfgdfNOSNQUPSWQXZT[^[__WYY[]]^``_aaffge_da\blekidilflhgihgionpjikonppoqihjpprnmovuwvuwvsuxuwz}~xzz~z{{||}~y{|}~~~||wqpw~ӽͶŒǾùɺɼİƽܞƸ¶ƻƺɽżƽƾĹĺɽ̾õɻͿͿǽʼǸɻ˿ĵ˽ʼȺǺ²ööõȺȼʼĵȹ¹ƾɼ~̼²óľȾǽɾǽǽǽǽŻȾƼĹvsǾǵŶ찯ùþыnw]~~}|~}{|{|z{{|yz{|{|{|||ztu{uvxsswrryttxrswqrxrstnorllsmnrlmngjpjlldhlfhldgibeidfjegkegidfkfhOPTORVRUYTY\T[^TXYSUU\^^acc`bbbbbidfhcenikkfhkfhedfhfhnmollnonpqpryxzsrtutvutvutvvsuwtv|x{z}xyyzz{}~~~~~}}xnpäٶۼʾľףŻȻǿ砚ǾĶƸĶɽǻʾȼǶʾŹͿȼȺͿʼʼ˽ƺǹ˽Ⱥʼ˿ȺõȺȺƸƹƹʽöµǹƹɿƵóĺƼȾǽɿɿùƼŻùƺǺyvǾ˿̿ĵĶϻڸ٧ߔޗq~{}|~~xsr~}{z|z{|{|{|{|yz{|z|z{}~|vwztv|vw{uvystxrswqruoprlmpjlsmnrlmpjlphlpilohklehngjidfkfhe`bb]_c^`SRVTUYRUYSX[SX[\`a_aadff`bb`bbaaab]^]YXidekgfpkkjikgfhgfhonpgfhqprrqspoqpoqvuwsrtwtvyvxzsvzsvz}~xyyzz{yz}~~~~rpp̈yʎwӻӭ̠ùvvõɼȻƿԜǾǾ´ɻ´ǻĸŹƺõºñȿǻǻʾɻ¶Ķ´̾ǹƺʼʼɻ÷ɻǹ˽ǹǹƸƸɼʽʾȻʼȺ˾̿ʾ˽Ķ̾´ǸͽùƸƷƶ²Ƽĺ¸Ⱦɿ¸Ƽɿɿĺ¸¹ø¸Ź÷{Ĺ»ǻʽοÿѮͶٽҤLjro~|~xsr~~{{yy{|{|{|{|yz{|z{~xz~xyystztu}wx|vwystxrswqruoprlmpjlsmnrlmrknohkohkohkngjmfigbdkfhsnpmhjidfTSWUUYVW[Y[_W\_X[\^``WYY]__bddbcbigbmjelielienkgjjlkjlhgixwynmomlnrqsrqsyxzonpxwy{xz|y{}vy{twx|z{{|{|yz~~}}|{}}xyij‹Ѣѫ̥´џĺĺŶʼƾû꿹õƸĸ¶ŹŹŹʼȺɻ¶̾ŷƺ´÷ȼƸŹ̾ʼ˽ǹʼĸĶõĸǹõƸǺ˾²ɼ˾̿ɼ̿νöƹ´öʽŸķöŻȷƹĵƷŻŻɿĺĺȾŻƼŻƼɿɿ¸ĺĺŻƺyɾ·˿ȻŸɻĶק؍ċ؂݃ݰ~~~vqp~||{{{|{|{|{|yz{|yz}wx|vwztuyz}wx|vwystxrswqrxrstnoqklsmnrlmpilqjmhadlehpilhadd_ahced_ae`bidfWSXVVZXZ^Y\`X[_XZ[[]]bddbdd`bbeedifbifbmjeolhqnjjikjikihjonpkjlqpryxzqprvuwzy{yxz{xz|xz~xz~wzwzz{~yz~|vehq߰˔ʼŽƽ¸´´õ÷ʾŸƽŷúŷȺɽǻ̾´ĶƸ̾ͿʼʼƸŷɻƸĶöķöķǺöƹµ˾ƸĴɿ¸ĺùɿĺ¸Ƽǽɿ¸ù³ŹŹǽǻɿ|׻ʻṵ̀{‡ڌܘڏ~}{{{|{|{|{|{|{||}~xz|vw}wxztuystxrsxrswqrvpqwqrsmnrlmsmnrlmrknmfiqjmhadhadhbdidfjegkfhb]_YTVVRWXSXRQUYZ^WZ^[]^Z\\Y[[\^^`bbhhhjeejfekfflhhojjlkmlkmlkmrprrqsutvqprutvvuwzy{|{}|y{zxzx{~vzx|~}}~|||zz~||~~ypˀá̸Ϳ˜þ˪ĵȺȣºyqm¸ǻõŷȼʽƹŷ´ǻŹƸõʼõɻʼͿͿǹ¶ɻʼȺʼȺ´ǹǹ˾ķŸȼɷ˾µǺµ̿ǽ̿ȺŻùù¸ùǽ¸ƼŻƼŹùƼǻĸùſżǽȼɊ~Ż׻txSug\a|||~~{|{|{|{|{|{||}{|z{~xyztuxrtxrrxrrwqrvprystxrsqkluoptnongjohkkdgjcfpilmfilgikfhface`bgbdXQV\X]KKNTUYYZ^]_`[]]Y[[dffceefffjfgjfgkfhlgiojllkmnnppoqsrtsrttsuonpvuwvuwvuwsrtvsuzwyy|}vyz~zxxxvv~||~||wuu_|]eVyYvܾ˦ѸШ´vrƼĶ¶úǾ´ȿúƸĶɻŷǹƸ̾÷ȺͿȺȺõŷĶƸ̾µȻƶƹɽ̺ξȺŸµö̿ȾxöǺǹ¸ƼȾƼŻĺ¸Żǽùùƻɽ˿·¸ĸŹĻĺ䷹~yn_sex_n}|~~~~{|{|{|{|{|{||}yzz{~xyztuxrsvprvprwqrxrrystystrlmqklrlmtmpohkvorqjmohkkdgmhjlfhidfjegnik_Y^XSX^Z_^]aXZ]]_`^a``ccbfe`ccdeejejjejkfknhnpkpnmoqprsrtsrtpoqnmosrtrqstsuwvxvuwwtvyvx{}{uw|}{z~||ofutvѾӧſö粧·ʼοĽǸ³³ĵŹƺɾƼɿĺǼƸɻĶǹõĶõʼ̾¶ɻɻĶŷ̾ǺŸŶȻ³ȼĹ·Ҿ̼ƶķŸƼ{ɼ¶˾Żĺ¸ȾŻĻɿƽŻŻ˽ĸǽĺǻukhĹȿƾȾǼƺƻ½չ𝞰|s{ow}}}}{{{|{|{|{|{||}z{{tu|wx~wxzuvwqrvpqwpryttxrsystuopsmnrlmtnotmpunqunqqjmlehrknjeglgilgifaca\^YQX\T\[W]`^d\Y_\`d\bd\bf^dfagj`eiihngflrqwontfelnmqpnsrqunmqsrvsrtppoyyyxxxvvvwwwutvvuw{y{~|~zxzzy{~}}|~~z{}~z|}j||~{|מĻŽĿβǽቂ{þƹƵƵƲɵ˶ĴȷúƽĹŷ´´̾ŷ´´ʼǹɻȺ˽ǻ̼ƹķɼĶķǺ~ȸ˾˼ɽȼ˿ǽǻ̿˿˿ĴɾʿȾƽyqѽ³϶ž鶵ǃ}~ý~}|~|~z{{}|}y{{}}rt|stwy{stxsqxsosnld_\wrpumqvorwpsunqrknunqngjpilohkmfingjngjmfimfiibef_bRPUYU[^]c_^d^`eZ`cZad[be_fhahjagjdhm`chgjokotfjnfgkklppptklprswqprxxxzzztttzzzxxxxwyyxz}|~|z|xwy~{z|~|}{|lr}Ҷϝýꗊ֭ƙĽʾȻƶƶdzɵʴ²ĴŵǺĸƹƺɻɻŷĶ´̾ƸƸ˽ȺͿǹ˿̾ƺʼͿ˿¶ͿǺŸ´ʼƹ̿˽ƹpǹÿȼɽʾɽ¸˿±¸ƼɿĻ˿Źżvڻۿÿпnj}}~}}wy|~{}z|{}xzvxuwwxzuuxsrqll|{wrqvorwpsxptvnrslotnpohklehohkmfingjngjqjmmfiibeg`cWW]VU[Y\aX[`Y^c\ch\ei\fj\fj^hl_fkafk\dhfkp^fjglqknrlosmptmptorvtuvlllxxxvvv{{zyxx{z|zy{}|~}|~|{}|{}|}}xy|zxt{ȶ綶¸ȾȾxliخ綰ȾĴĴdzȴȲôɺȹŷƽŸŹ¶ĸŹ˽ʼŷƸ˽˿̾ʼͿ¶ʾͿ˽Ķʼ¶̾õƹöķķɼƺĸpŸͿŹ÷÷ɽȼǽ¶ŴƶĺŻƽƽŹȼ¹}ԲzxԽÿ¹½⥣|~~~}~|~z|{}z|z|wywxzytontonvqoupovprxptxrtvortmptmpohkkdgohkmfingjngjqjmmfijcfjcfY\aUX]ZafW^cT]a[dg\dh]fi[dg^gj\fj]gk\hlcmq_jnfptinpmrupuxmruty|knovxyvxywyzvxzwyzx{|vyzz|}}z|}{z|}|~}|~gdnزͰý˾븸ƽÿ󚎎Ҿ죝νķĴĴȴȴDZIJòŶƸƸǹɻŷǹʼ÷÷̾ǹƺ˽ͿƸʼ˽ʾ÷ǹ˽Ϳ̾¶ƸĶµǺȻǺƹͽķķµŸƶ´ɻĻ¶÷ƺǻȼȼȼ˺ϾɿŻɻ¹ĻŻȼǻĻ¹xv޳û¹¹ĺԽ啕~~~}|~}|~ynp~|~|~y{wytvtvvno~xyuop|uwystsmowpsxqtyruwpstnpqjmrjnohkohkmfingjngjmfilfhjcfjcfW[``fkY_dNW[P[_Xbi[elZel`jq\fmU_fZfj^jn`lpbnrbnrfmphorgnqjqtmtwptu~y{{}vwxuwxvxyz|}xz{~suv~}}|~~|ǀիա̺ʺ翶{˹ŵĴȴƲ̶Ʒµʺ̼ôƸŷƺŷǹƸõŷƺɻĶŷʼ¶ĶƸ̾¶̾ɻ̾ɻ˽˽ŹĶǺǺɼɼʽȻ˾ɼƸʼ̾ʼ˽ƶʼȹ¶˿ʾɽ¶ƼĸɽȼŹĺƼȿȾŹ÷ĻٳǼϴǍ}~uw|~z|}{}z|xzvxuwtv}uvztuyz}wx{uvzttzsvyruvorwpsunqvorunqohkohkqjmlehlehmfingjlehjcfaejbfk_ejY`e[dh_ipblsblseovakr_ipbmqdoscnrfqueptgpsjsviruktwr{~z~x{~y|tx|y|vz{w{|nrsw{|w{|~}hjj~suu~n~ŔЬٟƶȶڍüǾǾ÷Ųzs˿˾ĴóƲƲ˵ȶòνпĸ̻ȷó±ǷȺȺĶŷ˽ĶȺĸ˽ĶǹͿ̾ǻǹɻ¶ȼĸ̾ŷ̾˽ĸʼ̿ƹöʽƹǺɼȺʼŸɻóƸο˿ɽɽʾȾʾŻǻ˺Ⱦ±ȷȻʽȽȼȼǻŸȨ»¶лӯÅ~qsz||~vx|~|~}{}z|xzvxuwtv|tu|ux|ux|uy{twzrvzsvyruvnrwpsunqohk{twqjmpilqjmlfhmfingjjcflehmfi[[a^afbfkX]bagl`jrbmubmualt^iqblsforktxktxmvzmvzmz|p|~p|~htvp}~v{~wz}ruytw{tw{{y}~~}~{lr{Ă쪼Ƿ˳ųՙĿùṱzsžǻŸȸǷ˷ȴȲǶŴɸ˾ϿϾɽ̼ŵɹȺɻȺŹƸĶ¶˿Ź¶˿Źʾ¶¶ĸ̾ɻõöɼƹʼŷȺƹĴ˾ȿ÷ǻȼɽʾɽùƼȾĺϾƼòòνȺ̿Ƚƽȼʾǻʾż}vջµܦ~y{xz~~|~}{}z|xzvxuwtv|tu}vy|ux|tw{twztvyruxqtunqwpsunqvortmpngjpjlrknnfjohkngjpilkdge^aa`ecdi_bg\_d`ch]en^iq^hq_jq\fodmtinskqvlqvouyotykvxmx{mwzjuxq|~v}~}uz~{{x}~z~~|y~rwvjvtxx絿ȸʿآŷ¨ɦϓȼƹǷƷdzȵϹɶ˷Ǵȴλźɷμɷǵ̼ȻʼǺ÷´ɻǹŹ˿ʾ÷̾ĸõŹȼ̾ǹƹµǺǸȻŷĶɼµʽ˿ǻ˿ʾ˿ɿŻɺνñȾɼƶ²ķżǻ˿´{̮µݠ{uv~~}~}{}z|xzvxuwtv}su}tz|uy|sy{tx|tyxrtwpstmpwpsunqvorunqrknqjmrknngjpilngjmehjcfg`cZYZcbcabb\]]efgadibfkejoglqglrfjphksknslosrwwruxpvvnttjqqpvwtzzv||zy~zzx~~}zy~~y~}|~}~~}t_qxu~Ϸɺͺˤúļǿʛ㤘ŹĽᱮ´ʿȻɻ˺ƳϺζѺǶƵȷijijƶοǷ÷˻ɹ÷ȼ̾ǻ̾Źɾķ¸Ÿɽĸ÷÷÷ɽŷĴ¶ʼŸǹƸ˾̿̿˾Ĵʺµɺǹùȼȼ÷ƺʾʽ̾ȾʺǼȻɽ÷¶ɽǻĸ´ȼѨ޲₅Ǽz|jefvx{}y{{}}xzvxuwwyvxvxuv~suxqtyruwpstmpvorpkmsnpqmnmhjpkmpkmidfojlidfgbdlgi\\\bbb\\\WWWdddbdh`ch`bhcfkcfkdglfenhhnllpnpqoqrimnlpqlpqtxyswxotssxwrwvvzyx}|z~{w{|x|}x|}z~{z|xwy}|~|{}~}tvwy{|vph~xzظſηůˣyqjĺ𞛓sŷȼ̼˸Ʋ˷θȷȶɸɸò÷˻̼˻ŵͽ¶ξǷͿȺ÷õ¶Ⱥ÷ɽȿöǾ̿Ÿ÷÷÷Ź˽̾ȺƸ˽Ȼɼƹ̿ƹŷʾ˾ĺʾ÷¶ʾǻȼ´Ⱦȷòĸĸȼ÷÷ǻ{˿Ź苃ô³Ԫstz||}{}~~z|z|xzxzvxtvvx{pr~suy{wytvwpsunqxqtslowpstoqtoqplnnikpkmnjlidfnhjlfhd_ajdfcccZZZddd___bbb^_c[^cY\aaejcglehmedmffltuyfhifhiimnjnoimnmrsostlqpputntsrwvuzyx~|uyzvz{uz{vz{y~xwywvx||~~}|~~~~||jqw~w|zɷӲĻ¹ĺʿ˾Ȼɹ²ɷӾҼ˺ɸʺĴξ̼Ͽʺ²˽˽ǻ÷Ⱥʼ˽ƺȿǾɽɽƺ̾Ƹ´ɽȼŹ÷ĸŹĸǹ˽Ȼɼ̿Ϳʽ˾ɻóƸƺ̿Ⱦȼĸĸ¶÷´ƵĺƼijĸ÷ŹŹŹ㮤ôô¶ɷ׻вnpzx|~vx~~z|z|vxxzuwtvvxvxxzy{xzvxxptwpsxqtvoryrutoqqlnpjlojlpkmnhjrmolhjnikfacgbd]]]WWW___bbbRRR`ae__e__eaagddjffljgpjgmnlponpbaciklprsrtuvxyqstqrrvwwuvwuwwwyyy{{tvwz|}vwx}z|}|{}}|~|{}|{}}|~trr{{y~˯ľŷɻȻ̿ʹ˻̹˺ȷ˺˻ƺ¶ȸƶǷȼǻƺʼʼͿŷĸɽǺƽŹŹ÷÷̾̾̾Ƹ˿Ϳ÷ŹŹǻͿ˽ɼȻŸö±ɸĺʿǻƺ˿÷ȼȼŹĶǶŻʹòǻƺ¶¶÷ŹjaXͯĺ˿ûٹӾjlwuɦy{~|~}y{{}{}wyz|~su~suuwwyvxuwvxxzxqt}vyvortmpsloojllgiojlpkmpkmmhjqlnlginikmhjgbdZZZVVVcccdddWWW^_c``fbbhcdjcci`agkhqkionnrmmomlnjlmoqrprsnqrqsttvvqssqssvyyuww|~~twxtvw~tvwz|}|{}|{}|{}}|~~|{}js}ѶѥyǹƹöķǺʽǶ̻ɼƹŹ̼̼ͽϿǷϿ˻¶ǻ¶̾ĸʾǻ̾ƺǺ̿ķɼʾŹƺȼŹɻ̾¶ɻȺ̾˽ǻʼĶͿǹ̿ȸƸƹŸŴƴȷƵõõ¶˿ʽȾɽŹʾȼĸ´ȷŴƵƵȽƺɽʾ÷Ź‘xsiaĸù¸øȼ½÷ۯΟ‚|zߣz||~}|~wyz||~z|y{~su~tv}rt~su~suuwtvvor{twzsvxqtxqtpkmpkmplnsnprmoqlnojlkfhidflgic^`[[[ZZZbbbbbbbbb`_cb`fdbhigmlioljpojsjflplqplnnkmnmoonpnmoqorrqstsssssvvvxxxyyy~}}xwyvuw~}|~|z||{}|{}|{}|{}~~}|~~ni~hpzז̠ȺĶķijξ˻̻˻ƺ˻ξͽͽʾȸȸϿɹɽͿĶʼͿĸ÷ĸǺ̿úȿƹǻʾĸǻĸȺ˿õƺ˽÷ʼ˿̾ŷȸʺ½òò´´ƺǻ˿ƺƺ÷ǶŴƼøĸ¶εºǽʿƼùΔ~}О©|}~y{}uwz|z|y{y{xz{}~su|qsuwuwtvvxtvxrtyru|uxxrtzsvtnprlnsnpsnprmoqlnojlkfhmhjgbdojl```^^^ZZZ^^^bbb`_cb`fdbhdbhcaggeklgpkgmplqqnpqnprqssrtpoqpprrqsssssssvvvsssuuuwww|{}wvx~}~{z||{}|{}|{}~}~~~|zr}״ŰʦĻʼϾν²Ǹɺ̿Ƕʾĸóͽ¶ŹƺóǷʾŹŹȼĸŷƺʽùǾ÷ǻŹƺȺǹĸƺĶʼ÷÷̾÷ͿŷȺȺȻȻ²̻±ƽŽĶĶ÷˿ȼŹ÷Ź˿ɾ±ƼǻŹ˿ʾ¶̷ȵȼĺŻĺأɭٗďǖ͗Ť|~xz{}|~{}y{y{z|z|y{vxuwuwtvvxuwzsvzsvztvyruzsvvqssnpsnpsnprmoqlnojlnikidfkfhpkmXYY```ZZZ```___`_cbafdbhdch`^debhnfomflnglojlpkmonpqprpoqqprsrtvvvstssssrrrvvvvvvutvzy{|{}{z|}|~|{}|{}|{}{z||{}}xst~nysxҼ馣ȿ̼ôŵ˼ĵϿͽ̼öĸŶ¶ĸŹ¶ŹȺɻķʼ˿ȼǻɼƹ˿Źʾȼ̾÷ɽͿŸ÷÷̾ĸ¶ǹȺij»Ŵòij´õù˿¶ǻʾ˿ŴȾǶƺĸľİ¢zpľĹ¸ùĺŻ͠ȦӍę˚ΔȐ͐ΓΝ˪Ȩ}~~|~}~}z|z||~}z|vxwywyxyuwwyvxzsv|uxxqtvoryruuprrmopkmsnprmoqlnojlnikmhjjegnikRWX[_`Y[\`_a^]_c`bc`bc_bfbdfcfhehgdhmjljgiiginkmpkmroqsrtprsqttutvutvutvtsvsrtqorrpp{yy~||~||~||~{}{}~{}{xz|xz}|~||yxxʧƫȫͿŲǼĻ;ùĶ÷Ϳ̾ɽöɼķżµķ¶ƺƺʾŹ˿ĸɾɼżƹĸǹ½´ö´żȺȺ˿˿ĸǻ̿ƺʿŹ¶Źĸ{{ʾ¹̓{zp¹ƷłΓǙӌƜߞ㜒٥Ϟ}|~~|~}}}}{}y{xxwwwwxxyy{yxu{rpzwwvzsxx~{tywpvvourmormormosnprmoqlnpkmojlmhjlgiidfMRSW[\Z\]`_a`_a`]_fcefceebdifhfcehegpmolhjolnolnpkmolnnmonpqrttttvttvttvwvxutvqpryww~~~||~||~||~{}~}wv㗘ȿɼɽ˸òñѽ͸˸̽ĸȻŸöĶͿȼȼǺúǾ¹µɼȼĸ÷ʾǻ˿ɽʾȻɼķǻ˿¶ƽõȾĶǹȺȼǻȼŹȼɽĸŹŹŹȼ¶ĺɽοƽzþƽ¸řžȗɔɊ×ؚڟإ̛wy}{}~}}|~z|||xxvvxxyyzz{xxu}tqzwyv|ux~wzxqtzsvvorrnprnprnptnprnprlnniklginhjojlpkmW\]\`a]_``_a`_a`]_^\^c`bifhnkmjgijgipmonkmqnppmouprsprrprrtuqsttrttrttrtvuwvuwsrt|zz~||~||~||~||~{}~nn㵸̩ŸɴĻǾĻƽ|ȾҸĺ˸ȶȶųѻĮóԿǺĵ÷˿ʾɽ÷ƺķķƹƹɼƽ˾ǻʾ˿ʾʾʾ˿Ǻ̿̿ȿǺǺȼ˽Ƹ¶ȼȿĶĶȺʾ˾÷ɽĸƺǻŹ¶˿˿ȼ˿Ź÷ǻŹĸú҉ˌƕƖŢ~}}~{}~~}}yyxxzzzz{xxu{rovswt|ux~wzxqtvorrkntnptnptnptoqsnprnpojllginhjojlpkmRWXX\]]_``_abacc`bolnfcekhjkhjmjlnkmplnqnpnkmolnsnpurtvuwnpqnpqsrtsrtsrtyxz|{}|{}~||~||~||~||~||~{}~{}}z|{xz|y{~||}{{~ײƘɿýϽƽƽĻƼķ̹ıIJ˹IJ׿ñй˷ǸȻ¯ʾ񿴦ɻɾͿ÷ɽŹȻʽ̿ǾƹȻµŸƺƺĸǻ̿żƽǻƸǻ¶˿´õ˽Ϳ´ȺǻǻȻ¶ĸ¶ȼɽʾ÷÷ȼ÷ǻ÷¶Ź÷ƷƿƼ¹ĸ㹵Кő֠y{xz~}}~|~||||vvyyzz{{{xwt}tqvsxuztuyz{uvuopuoptoqtoqtoqupruprsnprmonikmhjkfhidfUZ[Y]^]_`b`bbacfcefceheghegkhjolnmjlolnpmoqnproquprqnpqprkmnrtuqprutvvuwxwyzy{wvx{yy|zz}}|zz}}|~}|~~~~~~jju}}{w~lrꢥʿǾúẕ̹̹̇ʸĬμȶǵɷ˹ɵŲŹʿƺƸŹ¶ŹȻöŸƹöµǾƺ÷ǻȼĸ¶Ź¶ż¹¸ú¶ŷĸŹǹȿõƽźɽƺǺоƺƺ¶¶ȼȼƺ÷׼ڪǩ⣦妟{}|~~|~~}~y{}}}}}}||{{}z}z~urvtxuyst~xyxrsz{rlmuprtoqsnpuprojluprrmojegkfhlhjnikOTUX\]`bccbddcefdfhdfhfhifhhegjgimjlolnsprtqsurtuprsprpoqoqrsuvrqsutvvuwvuw|{}{z|{yy~||}}|zz~|||~}~~τz~zuz[^yᩩÿ½ƽͿŷɶɸİůӽҼDZѹζƷпŴųǽ÷ŹŹʽǾ¹ǾȻ¶żĻ˿ƺ˿ʾʾ¶ƺ˿ƺ˿öʽķú˾öǻĸŹĶ´ȿȾøø¶ù̿ƺ÷¶ǻʾ˿ĸƺĸ÷ȼĸĸ÷wpgⱨ½娩̷}~}|~xz~||zzvvxxzz{{}zzqn}tq~urvsytsyts{vu~yxupouprtoqsnpwrtvqstoqwrtnikniknikojl\ab\`a\^__^``_ahdfhegifhjgihegifhmjlolnpmoqnproqsnpqnpkjlprsrturrtvuwwvxxwyxwyrqs|zz~~~||zxx|zz|~}}z|xuw}{{}}|~~wuv|y~cdĿĻս»Ҥ˸Ķ˸ҾκκʶİͶ͹Ѿ࿵Ŵ±òȼʼ̾ɻȼ¶żĻʽǺƹżķƺŹʾĸ¶ǻǻƺ÷ƽŸúµǻʾǾúĻǾŷºŹƺȼǻɽ÷÷ĸ¶ǻǻȼ~wnȿ¹¹Ʀūwy~|~|~z||~||}}{{xxwwzw~ur}tq~urvszvuyts}xwxsrtonuprtoqsnptoqvprqlnnikmhjlgilgikfh^bc]ab_`aa`bbacheghfhjgikhjkhjmjllikolnpnproqspruqsurtlkmrtuwyzsrtvuwwvxwvxyxzutw}}~~~||yww|zz|~}~ˆhhw}}{x|hiم¼ļ泯ƿȻ˾ķƳʷо̻Ƕϼҽ̴ɸʵ²ŵ²ǽȾ̽ķȽµµȿȻɼȻĻķ÷÷ɽ˿ȼŹƺƺʾķźµɾȺ̾¹ɽɽȼĸʞ~˴ĻӴľ}|~{}{}|~ww||yyzz{{}|~usvswv|wt|xt~yvvqnwroupqtoqsnpuprtoqsnpqlnnjlojlniklhjOXXX]^]bb^`a[]^]abfhigfhgfhjgimhjmjlpmoqnpqnpqnptsuttvsrtsrttsuvvvxxxxxxxxwzzzwww}}~||ywwyww}}~||~||}}}}vvvurhcosz~{nryz׾ǻƳɻ̺̽мʻʺóó˾̾¹º˾ɽ¶˿ĸǻ÷ο÷ĶȺǹ»º˿иĸ÷÷ƺ¶ŹƺĹ÷Źȼɽ˾ŽдúŻú{}}wy~z|y{}}vv~~yyzz{{~wxyz}xx}vw}xuzw}xu{vsupmvpqvorwpsunqtmpslotmprjnsloohkphlS[[\ab`ef_ab\^_]abfhigfhhgikhjnhjifhqnppnpqnprnpqprsrtqprqprsrtwwwvvvuuuwww~~~zxxzxx~||~~~~~~wwẃ{ytypwu}ӟ۞ͣ§ȶŗĿ򟜗wqh˺ɹ²ο˾ʼȺĹźǼȻƽ¹ĸʾɽǻʾ¶ȼŹ¶ȺͿĶǾ̾~ĸȼƺŸȿĻ½ļź}}zoqz|z|xzzz||zz{{{{{{z|{|yz~xy}xw|wvxsr{vuvqpxqsvortmpunqtmpslotmpqjmrknphlpilX``Z_`Z_``bb]_`]abfhigfhhhjlhjnjlplnjgiplnqnprprrqsutvutvsrtonpyyyxxxwwwxxxzzzwww~||}}|zzzxx~||~~~~~||~||{{{ڳᐒ߇҅ͅȋʖ֐їٝՕŎ{̻ȸ˼óƹµ¸սøļ¶Źĸȼ˽Ⱥ÷ƺ÷¶ƺ¶ĸ¾żʻ¼¿}~{}}{}{{}}{{{{{{{{~{|{|yzxy|xv{vuwrq|wvwrqwpsunqrknunqtmpslosloqjmngjpjlpilV^^Y^_Z_``bc]_`]abfhigfhihjlikojlqnpolnolnqnpspronptsuutvxwymlnuuuvvvxxxwwwyyyuuu{yy|zz}{{{yy~||}}~||ӣ瓗芑䀅͓ޗږܜߑnjǾ¶ĵ̾Ǻ~vwȼ÷÷´μ¶ĸ÷÷̽ǻ¾Ѳع~xz~~~|~}z||~ww}}{{zz|tuxywx~wx{uv|vxztu}vxwqr{tw|ux|uxunqtmpslosloqjmmfirknqjm^ff^cd^cdbdecefaefdfgdcejiknkmlgiolnnkmnkmpmoroqtsutsuvuwutvtttuuuuuutttyyyyww{yy|zz}{{}}yyyx}|dihy{{̗ۄׅx~Ž֑֘ڡߑƅƺĹþ|yt³²óij¶ǻw´˽ĸǻʥ¶¶ƺƺ𯩪¹Ƹ¹ʻƫԵƸ}}~z{~~y{yy{}xzy{}rtz{~yy{|{uvzttzsvrknmfirknrknrknslotmpngjjcfjcfZbb^cd_decefeghbfhgijhgiihjmjlnjlroqqnpolnqnpsprhgiihjrqsrqsttvrrruuuyyyssszzzyww~||{yy}}put֜㒞܄ń“ЋǑDžpvƷǽĹ˿°IJƶĶĴʼȼȼ÷ʾǻŹ÷ǻ¶Źø½ǾǾĸùȯɜ|}xz~|~~xz}}yy{{xx}ssuwvxwyxztvyruy|}vy|ux~wzzsvzsv~wzslosloslotmpvorngjlehlehX``[`a\abcefeghdhigijhgiihjlikplnroqqnpmjlolnqnpxwysrtrqsrqsutvtttuuuyyyrrrzzz|zzxvv~~}}~~{yy~||قڼµ³ȻϽþ򠝘·¸Ǹ÷´Ķ̺´¶´ǹ÷÷̺´ƺ÷Źƺ¶¶ʾĸʾʾ÷ŽľŻȿĩϹƼʯöœjde{}{}}y{}}||||||yyz|y{wyxzxz|uwunqwpsxqtunqyru{twzsvwpsunqslotmpvorsloqjmqjm]dd]bc]bcbdebdecghfhigfhihjkhjrmoplnnkmqnptqsvsumlnsrtvuwutvvuwvvvwwwwwwppp||||zzxvv~||~~~~株ɗƪЛæ˧ƷӨʾķǸ˾¹ʺñ±ŶƷϿöƵ¶ǻȺɺɻ³³ŶɺĸƳŹŹƻƺʾ˿·ĸⲭżúƾʼ̽ղɶÿ÷}~~|~{}}}}zz}}}}yyy{y{wywyz||uz}v{zswxqwunrvorzsvvorxqtvorslpsloslounqrknrknfbddadc`bcbdedfcghbgheghfegmhjplnlkmmlntsulkmmmorqstsuvuwutvutvwttxvvyww~||yvvzxx|zzzxxxvv{yy}{{}{{~||~}}zzzؿ؛ů̧æ­ù˦ƺĶ´´³òô´Ǻî͹²̺ͼκ͸͹ɵϺտĮíѼηȵïǴɵȶȻɻŷǺƹƸžž̾úηĺŹú̶¬ľޘ}y{}~~}}{{zzyyyyyywwzzss~xyxz|vw~xzz{~xxxrsxrsvpqtnovpqsnnuoprlmrlmrlmhbddacc`bebdedfbef`de`bcgfhmhjolnnmoonpxwykjljikvuwutvtsuutvutvussvttwuu{yyzxx~||}{{zxxzxx{yy}{{{yy}}~~zzzԨƳ̨¯ǨĿĿǽǽɾȽùùƼ±ʸ˸ʹµ¹ͽƴȶŲIJмƺ÷ź˸ï˷ʸųȷĺ˿ɽŹ˿ɽýɽɽ÷Ǿûǵ¼ƹĹǽԼҙ~~~}~}~}~zuv{|~~||xx~~|~{}|~~~~~||{{zzyyyyyyxxzzvv}wx|}yz~xy|vwystxrtztuuopsmntnovppvprtnotnotnoheggdffceebdgdfdeffhilkmjgimhjmjllkmmlnrqsihjihjnmorqstsuutvutvywwzxx{yyxvv|zz}}xvv|zz~||{yy}{{{yy}}~~Ϯ²ĩȺʐþżθʾƻɾƽ˻ƿļͽżƾǾͼ´ijǸƸ¶¹ż÷ȼɿ¶ȼ÷ȼȼƺȹǻ˼ɽºŵļ¹ðıóʸɸƾĶżżżƼ¸ÿ¿ĹĹøʿ˱еļƾɻɶץzz}y{}|~{}}~}~}~|}~{{wwyy{{{}~~~{}|~~~}}||{{zzyyyyyyzzzzzzztuqkltno|vx~xywqrystztuxrsuopvpqxrrxrtrlmrlmrlmebddace`bhbdjdfcbdeceifhkhjjgimjlonpqprlkmrqssrtsrtrrtrqsutvutvwuuxvvywwxvv|zz}{{yww|zz~~{yy~||~||~||~~||||~||ΑĭƳò³µƽʆż¾žƾƽ»žý˼¶öµźȽʽöƼķĹƼùʾĸ˿ȼöƺ˿ǽĺŬŷƽǹȻøķ·źƼſżƽþ½Ƚºտ榡|||||~{}}|~{}{|{|{|~~~yyyy{{{}{}z|}}{}rttvsu}}||{{{{zzyyyyzz{{zz||}~}wxztuystxrt{uvxrsvpqtnntnoyst{uvlfglfglfga`bc`be`bjadlbdjdgjegkfhjgikhjlikmlnonpqprpoqsrtnmosrtvuwutvutvwuuxvvyww{yy}{{|zz}{{{yy}{{~||}{{}{{~||~~~~ttt}}}z||¯ͼžʸҺĪ¿һľǽǽľüüĻ·ŹȽºžƻǾý¼ÿƽļþºļº÷ŻƿȷӠ~~~~~~{}|~{}{}{}{}{}{{||yy|~z|{}y{z|xzvxwy|~z|}}~~{{zz}}||yyuuxxzz{{{uvxrsztuyst{uv{uv{uvsmnwqrsmnxrs~xyjdekefkefkefcbdebdh`dj_bm_ck`chadjdflgikhjjikonpqprtsunmoutvtsuutvutvutvutvwuuxvvywwzxx|zz|zz}{{{yy|zz~||~~}}~||~~~xxx~~~{}}ԽȹԴĿþ½½ýſ½ǤŽĽ¸úǾȿüǾûŽºĺȲ¾ɿȽѽȾ{{~xx}}~|~|~}}}{}{}{{~~wwvvzzzz|~z|y{wyxzwy{}uwwyyy}}zz{{||||zzyy~xx~xrsvpqystztt|vxuopvprxrswqruopystuopuopuopcbdebdhadk^bn_ck_bjadldhlgikhjjiklkmnmoqprkjlrqsvuwutvutvutvutvwuuxvvywwxvv|zz|zz~|||zz|zz~~~~~~~Ⱦڿɼûôó¼ȵȽ˼ǼŹ۳Ѩ{}{}}yyss~~}}}}}|~|~zzzz}}}}|~z|y{wyxzz|xzz|wyz|||}qqvvvvyyxxyyyy||zzyyyzyz}wxystystwqr~xzystwqruopsmnpjkqklkefkefkefa`bc`bf_bl`doael`cmcfnfjlgiihjjikmlnpoqonpnmorqssrttsvutvutvutvwuuxvvywwwuu|zz}{{~|||zz|zz}}~xxx˺Ÿ˸¢IJĿĸþŬв뿾ٷ~~}}}}}~~||}}{{}~z|{|z{{|y{xz|~z|z|z{vv{{yxww}}yzzzxxzz{|z{{|~wxz{{uvuopz{{uv|vwsmnsmnsmnrlmqklqklrlma`b_^`a`bdbddbdldgofipilpkmmjlnkmonponprqstsuvuwssstttrrrttttttwuuxvvywwwuuyww|zz|~}z|}{wz~~{yy~||{yy}{{ȷĶǡԮʐòſøй¹ا~~~~~~|~x{zzyv|yzwyv{x{}y{wyz|wyw|z}y{y{zzvttqwu|zxvxvxzxzxzwyxyztv~xyztu}wxsmnpjkwqruopwqrtnopjkdcedcefegihjgfhjdfqhktmpqlnnkmpmoonponppoq|{}wvxssstttsssttttttwuuxvvywwzxxyww|zz~{}|~~}~|zzwuu{yy|zzӬͯʶɿб´~xy»ö嫦|~~~~|~~|~||}yuqzvzv~z|~y{xz|~z|y{{}y{yyustrustrwuxvxzxzxzvxxxvpqvpqyzystsmnqkluoprlmrlmpjkoijdceedfhgigfhgfhjcfpgjqjmqlnnkmpmoonponpqprsrtwvxtttuuutttttttttwuuxvvyww|zz{yy}{{~{}{xz}yvx|zz|zz}}zxxxvvͽŦըǶ˾ǪĻ½ջ˺~wx~~~{}~~~|~~~||xzv|~z|xz|~{}y{{}xzxxususutvjh~qp{yvyvyvyux~vx{uvxrsyzxrswqruopysttnopjkoijrlm`_abacgfhgfhjhjpilrilqjmojlliknkmonponponprqsxwyuuuvvvtttttttttwuuxvvzxx~|||zz~|||y{}zwy|y{{yy~||~||~~{yyŵµĴ®ý¥ֿ̾Dzξʹĺ}|}{}}~~~z|~}rn~z{w}y}z|y{y{y{w}y}y{tvxxxvyuyuzvuq|xvwvwwwvv~vv{||vw|vwxrt|vwystxrsrlmrlmrlmxrshgidbd^]_feglkmpilqhkngjqlnpmonkmonppoqonpnmovuwrrruuutttttttttywwxvvxvv|zz|zz|zzqnp~|~zxx}{{~~wuuxvvӜýƵĭ¾ɛ¿½ҲЪ~suujl|~tv|~}|~}~z~z|~{}z|y{z|x~x|y{vx{{yvzryqunvovnststtt~tu|tuxrs{uvztuystystystxrssmnvprrlmrlma`bbacjikfegjikohkphjngjpkmpmonkmpnppprpoqnmoutvrrrxxxnnnsssuuufddljjuss|zz|zz|zz}z|{xz}{{~||~~~~}ʿֺ˹ƨ¢ĿĿ޵׺Űþ´ŻӺţ{prxz|~~~~{}~~vr}|x~zzv|~{}z|{}y{x~x|xzuwwwwswqvovovovotrtrtr~uq|uqztv|vvztuystystystxrssmnztuoijpjka`ba`bhgifegjikmfipfjngjpjlpmopmopoqrprrqsnmotsuqqqwwwtttuuuuuuqoorppwuu|zz|zz|zzzwy|~}~{}~~~~~||ٳںƺīȥ஭¾øĿμλʨ}~vx~yuvr{|~{}z|xzz|v|vzxzuwuuwsxnvmwnwnwntrtrtr~tr|tr}ww|vxztuystystystxrssmnuoppjktno]\^dcegfhfeghgilfhnfingjnjlpmopmoqprrqsrqsnmotrtzzzooovvvzzzwwwxvuvttyww|zz|zz|zy|~|y{~z|}sxwxϽι¹ʨ}񰯫óο|~~~}~~~uw}~~~|y|||~{}z|{}wyv{vzwyxzuuxtxowownwnvnuququq~ur}vr~yx}wxztuystystystxrssmnwqrwqrrlmXWYa`bhgifegfeggegigikikjjlmlnqqspoqutvsrtsrtsrtttttttzzzyyyvvvutvxwy~}zy{|{}~}}}|||~~~t}}ɳЮǬâûǺŸȽƻǼ·䕘ٮںuw}~~~|~~~|~|~~yz}~|}}|~y{{}z|wyz|z|xzsuvwuwsusututv{tu{tu{tu~xx|ww}wx}wx}wxystystystvqrvqrvrstoprmnbacedfhgifegfegfeghgijikihjmlnsrtnnprrtqprqprqproootttnnnzzzuuutsu{z||{}zy{|{}}|~uuuuuu|||{{{}}}׾˰ƦńǺ๺÷rqs۴Ƹz|||vx{||}|~|~~~|~|~}{}|~}}z|}|~z|z|}xzz|y{z|vxxzy{uwuwtvtvztvztuytt~xz|vw|vx|vx|vxzttzttzttrmnupqtopsnormngfhgfhhgifegfegfeghgijikjjlmlnrqsmlnqprsrtsrtsrtrrrvvvnnn|||rrrvuw|{}|{}zy{|{}zxz}}}zzz}}}{լñȰżµȼǾ¶ٴµzy{ձ˼ݽévkm}~~xy~xyz{~|~{}|~}|oq~~qssuz|y{z|z|}xzz|xzy{tvvxvxxzy{xzvx~vv|tu{rtzzxy|vv|vv|vvztvztvztvqlmtoprmnsnoupqedfedfedffegfegfeghgijikllnlkmonpnmosrtqprqprqprtttppptttxxxwwwzy{zy{}|~yxz|{}wvx{{{}}}}}}~||xxxѿȹƵŮw||Ǿ¿ȿǾ´ݸĺzoq{}}~yz~vv~~}}}{}~~{}{}xz}{}{}{}xzz|y{y{wy{}wyy{vxvxwyuwsu~vw|tuzrs{|yz{uv{uv{uv{uv{uv{uvupqupqsnovqrxsthgifdffegdcelkmfegihjjikmlnmlnkjlnnponpwvxsrtwvxvvvwwwyyyrrrzzzyxz{z|yxzyxzxwyzy{}}}}}}{yyϪÿ̶Ʃ¸̸¶¼³̭Ⱦ}~~~|~z|}|~{}}}z|su~z||~vxz|wysuvxvxrtsutvvxuwrttv{nptv~su}rtuwwyxy|vwztuystystystupqvqrsnoupqwrsdcedcegfhgfhrqsjikhgillnhgisrtqprpprrqsrqsrqssrttttvvvzzzvvvwww~}|z|{z|}|~zy{~~~}}}~~~}}~}yyyxɫ㭴³Ļȿ޳Ҵy{~{}~~~}{}|~|~}z|y{vxwyz|uwy{xzwytv|pr}prxz~qstvvxvxuwvxwytv~su}rt|qstvwyxy|vwztuystystystytuvrrupqtoptnp\[]]\^a`bcbdpnplkmihjonphgitsusrtrqssrtrrtxwyvuwuuuuuuxxxwwwuuuxwy|{}wvxxwy{z|wvx~~~~~~{{{|||}}}~~~||}}}{~̬ٯżķư𪪪Ǿú¹¶ƫھ՟y{~{}|}~~|~~~~y{y{suz||~{}xzwytvvxy{z|y{vxtvvxuwtvtvtvuwtvsutvuwxy|vwztuystystystzuvwrspklpklpklcbdcacecfbacmlnjikmlnnmollmpnpqpqppqrqrrqs|{}wvxwwwtttuutwwwvvvzy{yxz|{}{z|zy{{z}||}~~~ywww~}Ҵνɽ̦߱þû÷ƻƷ{{~|~}~|~~|~{}}y{z|{}{}}xzuw{}suwywyvxvxuwuwtvvxxzvxvxsuuwxy|vwztuystystystvqrwrspklrmnupq_ab`bcfhicefkmnlkonmqrnsrmrtmrsmrposnmrtsunnnttsvuxsrtonpzy{nmovuwyxz}|~xwy{z|xxx{|z~}~~}|~}}{zz~|~}ɍ߰ۺĽþ}~|}~~|~|~|~}z|{}z|{}|~{}xz{}zprwyuwvxvxtvtvrtuwwyy{uwwywyyz~vwztvzvwxtuvttwuuvttqklrlmumnacdacdcefiklkmnlkokjnnjojchyrwtnsonrlkoyxzyyyvvvvuwwvxtsuwvxyxzzy{yxz{z|yxzyxzwww{|z~}~~~~}~~|{}~~sqq|||~}ɭΎ|}½ľź·ĺĻΫ{|}~}~y{|~~{}~~~~|~|~{}y{|~|~|~z|y{{}xzxzwy{}wyuwvxuwuwuwtvvxz|y{xzwywyxz~vw{uv}xyzxxywwwuuvttuoptnoumn`bc_ab]_`kmnklnklpkjnkgljfkxrwupupnrnmqnmorrrooosrtwvxrqssrtyxzvuwutv~}}|~{z|{{{{|z~}~~~|{}xvv}~~~z{ƿ½Ĺʣ꾼žüſ·ĺž||xy{|xz~~~~|~vxy{|~|~||z{yz|}yzyz~xy~vwvxuwuwuwxzxzwyxzuwwywyxzwx~xy}xyzxxywwvttusswqrvprwopbfgaef[_`imnhlmnosklpihlqmrmglnjoposrqusrtvvvyyywvxzy{rqs{z|vuwzy{tsu{z|~}xwyzzz{|z~}~~~|{}yww~~ٱ̽Ʌ|}ļ·Ĺ羷}{{zzww}y{}}}}~~}}z|z|yzz{z{|}yzyzxy~vw~vwtvvxuwy{xzuw~vxwywyxzwxyz|wxywwxvvvttusswqrxrs{stY^_[`aafgafgdjkilphkoklpqptminsotqptqptsrtqqqlllqprxwyvuwutvwvxvuwvuwxwy{z|{z|{{{|}{z{ywww~~}~~~{yy֯߸ͷĿ½¿俺ٺȿĺǼľûмп׾ſ{{}|~{}~}vx}~|~vx{}~|~}|}yst~|}}wx{|~yz}~xzxzz|y{vxz|vxwyuwwywx|vwzuvywwwuutrrtrrvpqvpqxpqejkcghchifjlinoknrjmqmnrklpjimplqonrrqutsuuuuqqqxwy{z|wvxtsuutvwvxvvxxwy{z|||~zzz{|z{|z{{{wvz~}~}~}}|~ԳɬϜ¿൳¹ĻĹȫȸ¿~~~~|~|~wy{}}|~}yz|vw||~~}~z{wxwy{}xzz|y{xzwyxzwyuwuw~vw{uvytuxvvvtttrrtrrwqrwqryqrdllcllenmenmgpoinqhmpjmqijnjimmlpposonrtsuuuuuuuutvzy{}|~wvxxwyzxzxvxxwy|z|~~zzz{|z{|z|{}{z~}|~|ͷɿڷӮú÷ʾĸƻʿƻֵ߸˭~|~z||~|~{}|~|}{|zuvz{~{|{||wx~z|}prxzz|y{vxvxxzwyuwuw|tvzttxstxvvvtttrrtrrwqrwqryqrdlldlkenniqqjrrjpsjorlosikmlkonmqnlqporrprtutvuuusvtsuwvxuuwwvxzz|wwxwwy{|}zyzzzx|}{vvv~~|x~}ശȱŽÿþźƻĺȽ}xz~}~~|~z|{}~yz~|}z|~}~}~}xzz|y{rtxzwywyuw}su{stxrsxstxuuusstrrtrrtnounpwnpbnpepshtvhsvcoqfpsdlolpqfhhtqrrmntopsopxssyws|xusvwzxz|xz}z|{z|w|zu|ytzyw{|w|y|~}~zxxvyw|~{~~|xxxįܻ¦½½󶶶Ŀüƽ÷ȼ¾Żϰ㗓|~~~uvyss~z|z|}xno{|{||~}~}~vikxzz|z|wysuz|tvxzwx|uvxrsxrtxrsxrsztuvqrtoprnnrmnrlnfrtdprlxzivxly{clodmpouvlpqsttuuuusuzxy|z{zyywvvuy}~{{|}}|}x|{w|zv{zx|}ruy|~|{zz|{~topɴθҺÿ½ֽʾžſȿĻȼ¾½շvx{}}vnoztu{st{}~y{wy|~y{}|~z|z|suy{z|z|wyxzvxxzwywx|vvystystvpq{uvtnovqrupqrmnqlmojkaildloowzbjnnwzdqpcooeoodlldjlgmohjodfkikpqtwy|~svxx}z{}|x}}x}|wz{wz~y|}}|}qlmνКÿӼ¾üȼ½ȿ⵲¼zvuxzwyz{~|~z|z|z|~~~}y{wywyz|z|wywytvy{vx~vw|vwztuztuyst|vwkefwqrxrsuoptnnpjkclocmpenq^gjqz}eqqeqqbnqdrtivzxv\fofowjs~nvmwwyzy{zz|z~v|~v{~x|{}|}}~~~~~ʡҿ̶ćĿ¿ƾǿùºǽz{{}zoq}~yz}~{||~|~~|~{}}|~{}}~{}xzz|z|wyqsrtvxvx~vw}wxztuztu|vw}~wqrxrsystystuoprlmdjmbildjmkqtgnqfrrixw^np\oqdx}`u}yy]qYm{]pcsirswtv~qvzltwnx|xysyz}~~~~~~wyzvxy|~طĿĿļþÿļέ}~~~}~{}|~~}{}y{su{pr|tu{uvxrsxrsxrsyst{uv{stzqrxpqzrsumncjm^fieloahk`gjfrrixx[oq^uz_{lsxthozs~ht|r|nyxz{y~z~~~|||z||ƾĻȖĿӽĿþºùÿƽ~~~~~~~~~|~|~{}y{vxuwsu}rt|tu}wxxrsvpqystxrswqryrrzst~vwxpqzrs_cfchkinpafi`ehfrrfxt^tvUqvUu~U{fgohhxspxyuYhtuamwmw||~}|||||||~{}~̴ڷôʹÿĿŽþ⹳~~~}~~~~~~~z|{}|~z|xzxz|~|oqvxwx|vwztu{uv{uvztuyst|pr}qt~sushjznpdilX]`kpsfkndilhss`qo`xzcckf^\ZZba}Qizuwws}wt~|y~|}||~{{{Ƿʹה¾þĿ뤢 ~}}|~|~~~|~~}~~}|~wy{}z|wyvxwysu{}{|{uvxqrvoqxrsyrt{tu}rt|qs|qsrhjxmokop]abgklgklfjklrthwzr{yd]\fX`mohwqpm||wx~y}~|}}}uvtнüȢо¿ܺüĿ볳¼¿ǿƿ¸ź¾ú{vu}rtsuxz~|~|~|~xzxyxzz|y{xzwyvxuwvxtvwwww}rqtt}rr~sszoqwlnvkmujl|qsz~imn`deaeffjkfnqZjq[y`[d^^d\]jrhow}iqjwqr{x|{|||}{ȲĿŽϺþ½þĽ⿽¿ÿ¾ƺroo孨xz{}~|~|~{}~xz~vwz|z|y{xzxzvxvxvxtvttwwwwuu~rrtt}rtwlnzoq}rtzoqX\]hlmlpqfjkjnoiu{qe\M{\^efbpv`{gyvd~lgfi}vzyz|}|{~ʦվԩyxtմ½򲲲¿ȿƺ¶}}條~}}~~z|xz~}~{}{}{}|~xzxyz|z|y{xzxzwyvxvxsu|ppssyyvvtttt}rtwlnznpvx~suosttxymqrcghnrshvpag]\otfnjts`ymuumnb~jo|yz}|~~}~~~~~ضϼԐ}ƿ¶󱱱ƽǾĸù~}|~~}z|z|{}z|y{|}|~z|y{xzy{xzwyxztstrzxvttrut|qszoqznpynpshjaefhlmkophlmnrshx]wnllmygn{yvrlqswppjry~}{|}ɽûĿþƽƾƼƻ¹¿ϵן}~z|~~}|~{}{}{}{}{}z|xzwyxzxzxz{npwyl`^xtzv~sows}qo~suzoqxnpwlnujlcghgklgkljnokopeqyoPkuewng|avpi{dup~rm{p}nyozp}uz|~~{|}||{}˦Ŀ½ý»þþƾøȻĸĿ~~~}{}z|y{{}{}{}~z|y{y{y{xzxzxz~qswyl`^wsvrwswsus~su}rtynpzoq{prptulpqgkllpqgklfovo~Xls[oyeyixevcs`mwbpwiu}ep|lt~jr|rxt{}|y}}}}~pqomjlʘвŐıĿ¾½ƻ¸÷¶Ǹ˭~|~{}z|y{{}{}{}}~z|~{}y{xzxzxzwyxzvr~tm}skxq~tmvr}rt|qs{prxnpujlmqrkpphlmkopfjkmrwhsxesxfu{grzgqzfr}mxku}s|lu|pu~vytxxyz}|}|y|wt}}w~}ɿ®þÿߥγ½Ƚǻ¸ʾŹ˭{}}~|~|~~}|~{}{}{}{}|}y{tvwyz|xzxzxzxztvxtxq{qj}vtn{w|qsynpxmoxmoxmokmnmophjkmnphijnptlnquvvrttqqputtos|nu{rwqx~pt|xwwxvw}{|{yz}~~|r|~xw}vy}~~~|~~~}ֿȹĸŹƾͰ|vw|~xz}|~|~z|{}|~}|~}uw|rrws|xxyy{{vvutzwr{yqyruormol}rtqfh|qsvkmujleghhjkeghjlmiklmptgijrrrnnnpnmusrrtxotvrtypuwsuzzxxwuuzxx}}~}~}{|xs~~t||zxz{}}г½ʾƾĸƺ¶ߞ~~~~}~|~}{}vxzz{x|xzzyywwxxuuzwr{yqyrvpsnrn|rttjl{prtv~suprsmopjlmjlnnppjmqoqrpppnnnpnmvsqvtusttustrsrxvwwuuyww~||}}~~~~~}}}||~~v~~y}~~~w}{yy~~ۿԾ¾}}þžɽȼ¶¶ưÿİ|~~~~~y{y{{}~{}uw||zw~uqzzyywx{{xxzwr{xsxtvrurrr|qsxmovkmzoq{pr^`aacdeghlnosuvnqulnopppsssrpoxuqzvszxtyvsvtp}zw|zyzxw~|{}|}{y|zz}{{~}||w|{z|z{~|~y{z{z}ۆŰƺĸ÷¶ĸѲđyz~|~~}|~}}z|{}~{}{}y{}z~uqxvyw{y{yzxzwr{xsxtvrurts{prznpzprxmo{preghhjkjlmmopkmnjmqmoppppsss}{z{xt|yuyvryvrtqm{|zzvtsywvzxx}|{yy{yy~~~}}z||xzzy~}|}|ostx|y{~а󻻻¼Źɽ÷ȼ߷z|}|~|~|~|~}~~}y{{}|||y{wvrzu|x}yzv}zvyvrxuusvuss~su{pr~su{prvkmbdeeghfhikmnmopjmqmoppppsss{yx{xt{wtyvrurovso~zx{zvyxt|{w~}y~z|{zy|{~}~~~{~~x|w{~~}y|}y~uy||~}׺ù֦Ӽ׾¶Źܳ}~~~~|~{}{}|~|~|~}~~}z|y{|||y{wxuzw|y}yzv|yuzvvuvtuorqr|rt}rt|qszoqwln_abeghkmnmopqstjmqmopppprrrwutxuqxvvwuuusswuu}{{vuqwvryxtyxtwvr~~~{wv~z~y~|v{|~~|}}z{{|͖¸¹񋋋ļǽĸƺǺϱ}~{|{}z|~~|~|~|~}~~}|~|~|||y{w|t~v~w~w{t|yu|xwuustjlmn|rt}rtzprynpwlndfgeghfhigijnpqkmqmopppprrrvssxurqqquvutttqrrzzzxxryytxxr}}wwvqz}y{~{}{}z}zz}~x}~{~}~|}}|}|}|{җĿ嚐ƾƿƻ¶Ξ|}yzz||~|~~|~|~|~}~~}|||y{w}v~wx~w{t|yv}yx}ssxylmqrtv{prynpxmowlngijgijgijkmnkmnllnonpqprqprtsuooplkmutvsrttruzxwxvvzxxsqq}{{}{}|}}~||vrt|~{|}||w~z|}|ɣɮɿ¼ʥ{|z{}~z{|~|~|~|~|~~~~}~z}y|x|x|x|x|x|xzvyuvvsvykn}uw~qsuhjyln{np{np{npgijgijgijfhimopmlnonpqprqprrrtpoqonptsurrttsuxvvyww}{{xvv|zz}{z}{z}{{~~~{{{~~~|}~}}z~}}~~~~ǶµŹĿ½ƹɽĸ¹㸹ӯz||||~|~|~|~|~~}}}|y|y{y{y{y{y{y{yxwxvxy~qs|oqy{tv~qssu{np{np{np{npgijgijgijgijjlmmlnonpqprpprpoqpoqyxztsutrtrqssrtvttxvv|zzyww|zz~}~}~~}}}~~~|||vvv}}}{||{{{~~~~}|~˰Ŀ«ʲƼɼźμО||vs~~~~}}~~{|{|~|~|~|~|~|~~~~{~{{y{y{y{y{y{ywuvtsu|oqvxuw~qs~qszmoyln{np{np{npgijgijgijgijiklmlnonpqprpoqonpqprwvx{z|srtqprrqsvtttrrussyww~||~}|zz|~}z|}}}{{{xxx}}}|~~}~}}}}~~~ͮͩΨ¼¼øܩźƻŠ׶٬|~x{|~~||}}~~~|~|~|~|~|~|~{}z|}}||{{z{z{{{{{{{}}{{vxrtsu~qs~qs~qs|oqznp{np{np|oqhjkhjkhjkgijlnokjlpoqpoqqprsrtonpsrtrqssrttsutrtussxvvzxxzxx~~xvu}{{}}~|~zzz|||{{{{{{{}}~y~}{x{~{|ɤ½þȑ赴㯲ƾ㼼㰯zz}~~~~~~~}}~||~}~}~|~|~}{}|~y{z|xz~vvyy{{z{z{zzzzzzvvwvvxwyuw}pr|oqwy}|oq|oq{npylngijgijgijiklkmnnlnpnponponprqsrqsrqstsuvuwvuwvuwxvvywwzxx}{{}}}}}|~{{{zzzuuuzzz~~~~~~~}}wwwzzx{~}s}ʱɼЪຸ깹ϳθøýղrz{~~~~~|}|}|~|~}y{|~xzxzy{}uwwyy|z|z|y{y{y{vxuxvxvxuw~qs~prtv{}|oqxkmzmo}prgijgijgijmopjlmonponppoqqprpprrqsrqstsuvuwvuwvuwywwywwzxx{yy}}}{z{yxzxx}}~{}|~zzz~~~|||vvv|||~~~~|~zr~xwww~҈떔خ̽Ǿʿͳ˃|l|~~}}~~~|}|~|~}vxz|z|xz}|tu~suxzxzxzy{y{y{vxuwtvvxuwrtsusuxzzmo|oq{np{npjlmjlmjlmnpqiklkjllkmusutsuomoonptrtsrtvtvutvvtvywwxuuvttxuuzxxzxw}|~||}}|y{}}}}vvv|||yyy~~~~~~bjn~~{~wwºĿȾ圚˺곳˽ͻ碮}lsc܋}~|~|~|~suz||~{}|tuuwxzxzxzy{y{y{wytvrtuwuwsutvrtwyylnxkmznp}pslkklkklkkooommmmoplopjlmlnotvwtsuxrttprxsuyuwytvpjmyquysvzsv}wy~{|~|}~{~~{}}z||~~~~}}}|||}}}}}}~~~|}~~}}}º֟ħڢͼԩ͌΃͇֟o}}~|}~{}~|~tv~z|}wywyy{y{xzz|wytvuwtvtvvxsu}qsvssurrmjjolmurrlllllllllnnnnnnmopoqroqroqrrtuqrswtvwtvurtwtvzwy~y{}xzzuw~y{zwy}z|~|~~{}|~||||||~~~|||~~~|||zzz}}z~uŠѲþƲԻߧļ̨oztƒ}}uw{pry{~~~wyzoq~|~z|{}{}uwxzy{xzxzwyuwsuvxy{wyuw~suusstrrsqqtrrwuuhhhhhhhhhnnnnnnnpqoqrqstlnomopnpqwtvyvx}y{wtvwtvxsuxsu{vxzuwwrtzwy}z|~}~|~}{{{{{{||||||~~~~~~uuu}}}{{{tvwy{|~|}vzu}wxÝϛ弽ͽҰ㽼ž⍝{wʍo|}~y{{}{}{}y{~|qsy{~|~y{y{xzy{z|y{vxvxwywyuwtvsuuwrt|qsusstrrsqqvttwuuiiihhhhhhmmmnnnprsnprmopnppprstvwrqsvvxzy{utvwvxwtvvsuyvx}{}|~}z|~{}~{}|~|~~||||||{{{|||}}}~}~}|zy|{{}xwėěƥǚվڒέȾн宼ȊstƐo{}|~z||~|~xzvxwy|~{}z||~y{z|vx~y{vxuwwywysuuwwywytv~suusstrrnllrppwuujjjjjjjjjpppnnnlnonppoqrnprprtrtuutvvtvvuwrqswvx|y{spr|xzyvx~~}||||||}}}|||}}}|||~~~xz{~~}||~yzy˟ϑpoѯȧп̷͈ۖ̽݊lz}~{|~}{}{}|~z|{}|~|~|~z|uwz|~su{}|~vxvxwywyvxvxvxvxtvyqrusssqqpnnusstrrooonnnlllmmmkkkmopnpqoqrprtrtusuvqturuvsvwqtttwxvuwrrt{{}yxz||~}z|xuw}z|~|||||||||}}}}}}}}}|~}cb]_gkefxxmnǼͺٲኋб½Ĵيz{cbHe}}~~~~~z|{}{}|~z||~|~|~|~}z|}vxz|xzvxwywywyuxuxuxvxtvzrrywwommsqqtrrsqqnnnnnnmmmnnnkkkprsqstrturturtusuvpqrqrsrtustvtvwutvtsu|{}}|~tsuwtv~{}oln~~~~~~~~~{{{||||||}}pmptkrlsknprþ½鼻Ϻҗpxm|pti|s}~xz{}z|{}{}z|z||~|~|~|~uw|qs{}vxvxxyxy~vwwxwx}vv}vv}vv~vw}vvxrtvttrpprpptrrwuuiiilllmmmsssnnnnpqnpqprsprsprsoqrlpqlqrnstqvwrvwvtvtsuyxzvuwrqs}}z|{}}~}~~~||||||~~~~~~~}rpjqs}qzrvw{̿Қĭ³ȱ墠аϺϾӉw}~sz~}}{}{}|}y{{|}|~|~|~}uwz|xzy{yzxyzrs~vw~vw}uv}uv}uv}uv~vwztuoll{xxwttpnmmjjggggggiiiooommmlkmrqssrtsrtonppqrrtuvxyuwxrtutuvsuvuwxz|}{}~qstwvx}|~zy{~}}}|~~{z|vxx}}}xz{{]i}kwtvlsx}½٦Хø֢Ĭ̱lv`l}|}|}z{z{}~{|{|yz~~~|qsy{y{y{y{vxuwuwuwuwuwuw~su|ps}ssyqmyqmyqmumj}ooonnnpppsssmmmpoqrqssrtsrtrqsrqsqstvxyuwxsuvtvwsuvsuvoqrqstsuvxxz}|~|{}|{}~|{}~|{}~|~~~~}}}|||~~~}|_ofx]rn[vlϷƙȽʫůࡡɽĽҾ񗞯xczbw~yz~}~}~~|}|}||z|~~~~~~~uwxzxzxzy{xzvxuwuwuwvxvxtv~su~tt~uq{rn}tpvmizqmqqqmmmlmlrrrlmlqprpnponpqprrqsrqslnotvwrtusuvrtuvxyuwx|~tvwzxz~}||~|{}{z|~}~}|~~y{{~~~~{{{}{XuUz?hKi宽ɻؔȽ੩ܨŬɢʵҿΧ‚ooLnb~}~~yz~~|}|}|}|}|~|~|~|~|~y{xzxzxzy{xzxzuwuwuwvxxzvx~suvv~uq~uq{rn~uqxtjikjiknlonmokjmqprlkmkjlmlnqpronptvwqstxz{uwxvxytvwsuvwyz{}~xz{zy{~}}|~~yxz~}~yxz~~}}z||y{{{}}{{{u|{Nʡƻ·Ĺ»᜜Ԫ󳸸в»ϷϱӧŠĉypеvz{|}{|}~}~~|}|}|}{}}{}{}{}y{y{y{uwuwuwwyz|wyuwwwws|soypl}tpxokfefhfhkjlnmosrspoqpoqonponppoqqprprsrtutvwwyzwyztvwvxyxz{z|}{}~{z|zy{~srt}|~}|~~|~~~~~~~~~}}fofSZvʥȸøɾߗʭ̹񼺺㲸Ҭ멢ģʾӼ򘩸ՌҘ߰~~xy{|yzz{z{~~}~|}z|z|z|z|z|{}z|y{|~{}y{~su~suuw}rt~tt|sownjtkgzqmyplfejgfjjimnmqrqurqsrqsqprqprqprqprprsrtutvwwyzwyzwyzy{|z|}z|||~~{z|{z|qpr{z|}|~~{}}|||uwxhbbH_vĹƻ·⎎wqrľ¾ޠϵ߸Ŀɾϩԇ{{́گy~xy|}}~~}~|}z|z|z|z|z|y{xzwyy{wy{}{}|~~su|rt}sszqmxokzqm~uq~uqihlhhkjjmnmqrqurqsrqssrtqprqprqprprsrtutvwwyzwyzuwxuwxvxyy{||~|{}yxz{z||{}wvxyxz~}zy{}|~~~}|||}xz{~xaohZa˽ǺޛҤϸǿƔ䝞ՠ誦ñžӴրvxvvo¢揦}wx{uv~yz~~|}}~~}~|}wywyz|z|z|{}z|y{}{}uwtv{pr~su|rt}ssypl{rn~uqvrvrmkqjhomjqnlrrpvonqqprrqssrtrqsqprprsrtutvwwyzwyzuwxtwxsvwy{||~||~||~}}~}}|~~|~`uNqpird_}þ}{{ݜﻹǥؙެȠ٬̸ԿԉoӅӁ~~~~}~|vvzuv~z{z{~~}~|}}}z|z|z|z|xzwyvxtvtvwyvxuw~suut{rn{rn}uq|so}tpkjnlkomlpposrquonrnmrsrvrqusrvqptqprrqstsuzy{yxzvuwwvxyxz~}zy{fceyvx|~~{}~~{}~~}~~}wyy}{}}}oczXvVzTq`wp|¾}xyѸÿɤսNJݬᛠʐ¿Ÿîĺ½ȷlYyhzbdb}o}}xz~z|}{}|~z|vy}uwxzvxz|xzxzxzxzwyvxtv~su~su}rttv{qr~tuvklvkmvkmjjnljnllpnlpmlpmlpmlponrqptsrvqptrqstrtxvxyxzutvzy{xwytsu|~yvx|y{~y{|~y{|wyz{z|}|~}~|~~{z}to\wcyj}ozĽžɾĿ踳ÿÿ麶ҪɴθښթɤָǴp}m}zh__yo{|~}}}|~~}|~{}xzwyy{uw{}xzxzxzxzxzwywyvxuw~su|rt~su~su}rtpegpegpegjimkjnljnlkokjnnnrmlponrpptsrvsrvsrtvtv{z|srtxwyyxz~}qprvuwxxzxuwwtvzxz}|~{z|{}~|~{}~vxyy{|~}}~|~~~fsl|l~lzp}u~žɘDZ¶Ⱥྐྵܶzyt~|x|y~{~{~xs|x|{zŴþ緵䰬}yxʷ¦ܼɤԸ¹卌wt~|}~~z||~|~z||~z||~|~{}{}|~{}wy|~xzxzxzy{xzwyvxuw}rt|qs~rt|qsuwxmoxmoxmoihljimkjnmlpposqptonrpospossrvtswtsuxwywvx~}~zy{wvx}|~yxz~{}~{}{xz~~{z||~|~z|}z|~|{}~~}{}}~lthrr~uizm{˗˵洶}Ļк򳰤ǿƼ÷߯ӾұꢦŤη˳yr}~|}~|~|~|~}|~{}}|~wy{pry{{}{}xzxzxzz|xzvxtv~su|qs{pr}rt|rt}rtynpynpynpkjnkjnkjnkjnlkonmqrquonrtswrqusrvsrttsu|{}||~}|~yxzwvxzy{yxz|{}|y{|y{~}z|zz|}|~|~~}|~}|~~}~}z|}bkgtjzgx`wxƘºָ婩蹴ȿûžƾúۍ|澻~vϿ¾өĝԨ৩Ķɺ¶ȳ˭}}{y}~{}{}~|~|~{}{}xmouwtvwywywywywytvuw~su~suujl~tv|qsvkmshjshjshjkjnkjnkjnlkomlputxrqutswsrvrquttxqprzy{vuwxwyyxz|{}|{}~|{}~{}{xz}z|{xzyxz~}|{}zy{}|~xzz|~~v{zn~by\wOnc񣮷̦̾켾׺ϤߜХ}sᨣyŨ~x}x|ysȋ㴴ߺȳ¾·㯮ẹ⼸땗~{x~}~}{}~~}|~|~~z|xmo~suwywywywywywyvxtv~suuwxmowyxzwyxzxzxzkjnkjnkjnnmqqptposmlponrrqurrvvtxutv}|~|{}{z|yxzutvwvxwvxyxz|{}|y{yvx|~}~{}}|~z|}y{|~}|{}~wyyz||ttyph曬½ͺΩ㳷ä낂б¾읛ɼĴx௮xtoxto~zu}xy{ͮ沮֪Ǽɺ֏}{}~z|{}~~z|y{z|z|~su~su}rtwywywywywywy~su~tvuwzoqz|~suxmoxmoxmoxmolkokjnkjnnmqrrvpostswrquqptsrvvuywvxutvpoqsrtwvxxxzyxzrqsxwy{z|}|y{}|~}z{|wz{~||}~~~~|~ussphh]ZѶ𗭳ǥ˸ɇ㴼卍Ş㒐ywwzyuخķ;𠙇rla~y{}w~̴Оݐ¢Բʽ»ԉ|}}w|~~|~z||~z||~~z|uwuwwywywywywywyxz}rttvtvynpz|tv|qs}rt~su~subaehgkihlpostswsrvqptnmqrqusrvtswvtvvuw~}}|~yxz~}srtwvxyxzyxz{xz}~~{}~{}}}}~|~~}|~|{}}|~~}~~~~pte^{ƸꏡǹĿ粶ꐔᙖǾѭ~x|su{v{y|pcxk_ylvդ囖~Żǥ¼ȿɻɷ֭þئvz~yz|~{}|~|~~|~}{}xzvxy{z|z|z|xzxzxzxzwyvxuwtv~tvuwuw~su~su~su{prxmoutxrqumlpkjnonrlkomlp~srvtswttxvtvxwyyxzyxzvuwkjlwvx{z|yxzyxzzwy}z|}z|~{}}z|~{}|~|~~{}~|y{|{}~~suv~{}~z|}uwxzlqhxtРުզķμͲѥƿ~{˿ՊwĦƻݭóʲŻҴйֈ~w{~{}z|~}|~}z||~|~|~z|y{vxvxvxvxuwuwvxuwtv}rt~su~su~rt~rt~rt{prxmocbftswlkokjnnmqrqufeizy}trvttxvtxvuwyxz{z|{z|xwyihjxwy{z|yxzyxzzwy|y{|y{|y{}z|{xz~{}~{}~|~}|~|{}~rtu{}~kxjQyYu̿½󒔕ȹλ㜗Ŀ鴰}}̿Ƚƻ𭫪þĪؾӽ|w|~z}}z|}~}~{}xz~~}z|xzz|z||~y{uwvxvxvxwywyvxuwtvtv~su~su|rt|rt}rtzoqwlnfeionronronrrquposutxpostswutxvuyxwywvx{z|{z|xwy|{}}|~yxzyxz}z|~z||y{wtv}z||y{~{}~{}~|~~|z|~|~~}~~Yh|WmSm\qQjVol}ݬѝذއÿ˶½̜徼ʥȼymaɶ˼¹vz~|rwvl~ꙝں򻹸Ϻǩ٬{|~|~}{vwxst~y{}{}}~}|~}z||~|~{}xzxzwyxzy{{}vxuwtv~rt|qs{pr|qs|qs|qszoqvkmihllkoonrnmqrqurptqptrqurquvtxzy}yxzwvx{z||{}zy{{z|yxzxwyyxzxwy}z||~~{}~{}~{}~{}|~~{}}z||{}~{z|}|~}~{}}eogwkjtmvmx{îþ䔔ǻ̸y~|qxw}ry{uj}{yn੥ܿĺߔ}}~}{}{}|~{}z|{}y{y{y{xzy{wywyxzvxuwtv|qs|qs|qs|qs|qs|qs{przoqjjnkjnkjnnmqrqurrvrrvrrvtswutxsrvihjjjl~}qprwvxyxzxwywvxyxzzxz{xz|z|}~~{}~{}~|~~|~~{xz~~}~~~~ntjsp{mnuvrsĿ窬}|~|y{ųܸ{ws~{{wsqlhnkfieajfb|xt{rk}un~un|tm~wwo{r÷tpeok`|qnh]Ĺ㶷©镗~}~~~{prxz{}z|z|~}{}xzxzxzxzy{wyvx|qsvxtv~tv|qs|qs|qs|qs|qs|qs|qs|qslkokjnjimkjnnmqrrvrrvrrvqptposonrsrtutvqprvuw}|~qprutvyxzzz||y{{xz~{}}~{}}|~|~~{}~}|{}~prw|pujktqtm~v~вuqpÿ;¼혘}}qwwvŸӧίͻ׻ɬ~߆|}~~vx~z|~|~~z|xzxzxzxzy{wywywytvtv~su|qs|qs|qs|qs|qs|qs|qs|qsjimkjnljnnmqqptqptrpuqptsruonqwvytsutrt~usvpoqvuwzy{wvxyxz{z|~{}}z||~|~~{}}}}}z|~~~}|{}lllwxx|qussvryqºɴ䧣ԏywnv~uu~º̾ͻ߷|zy݀~~{}~~~~|~{}z|z|wywywyxzy{wyy{~sutv}su}rt{qs|qs{rs{qs{qs{rs|rt}tulkolkolkonlpposrptrqrttusssrrqvwsqssuwwqssprr{|{vwvssswww|}|}}}{{{|||}}}}}}}}}|~|~|~}~~~{}~wvx~y{||~qssumptrvqwp{qݘ}~溸~}}ĺǽʾǻɽŽ´ȼ}pd~»½ӓ}ssz}~~}xy|~xzy{wywywywyz|wyxzxzvxwx{vwzstystyrsvqryts|xwuqpxtsxtslkolkolkomlponrsrvpoqqqqtttjkituqtvvoqqxzzy{{zzz{{{wwwyyyxxx}}}{{{|||}}}}}}}}}|~|~|~}~|~zwy}~{z|~~~x{}~uxsukousxsxr~vkdנ槝ź|{nyzqd|u}vķüù߾琑z}nqz}qwây|}~|}|}{||~{}y{wywyxzuwxzvxxzxzvxwx|vwztvxrsuopsmnvrqzvuvrqxtsxtslkolkolkolkonnrqptsrtyyyxxxmnlvws{}}qssvxxxzz|~~zzzyyyvvvwww{{{}}}{{{|||}}}}}}}}}|~|~|~}~~|y{|~wvx}|nqmokoww|x}wrkͥ໴ē~{vtjtshxz~|r{yozwvvl~{qwmvl~tz{vl{uqgyuj|q}{|}孧ȋuv{|~~|aiĠȡx{~yz~{|xy{}z|y{wyxzxz|qsuwtvwyvxuwwx|vx|vwz{nhirlmvrqvrqvrryutyutlkolkolkoljnnmqrqurqsvvvpppvwuvwskmmvxxz||y{{vvvyyy}}}{{{|||}}}}}}}}}|~|~|~}~}{xz~wvx}qtnpimttxvyvxrfb{㳱ۭu{zvnxȽƻ˺ڀψqquwzzz{os͍Νѡƙ~|~~wz}vy~~hcdz{z{xyxzwyy{wyxzy{ynp~su~suwyuwuwwx}wx}wx|vwvpqtnoplk~zywsrzvuzvuonrmlpqptjimlkonmqpoqsssqqquvtvwsprrprrsuutvvwyyzzzvvvtttuuuwww~~~~~~~{}|~~|~}}~{}|~~}lnnrqtwwwtzusoɩ·ʾx¶ɾ˺˦Κّؑ؅qryy||y~Õግգɘ|~{|yz{|~~{|~xzwyxzvxuwuwuwuwuwuwuw~vw~xy}wxztuwqrystxtswsryutxtsxtscbfedhhgkkjnposnmqpprsssyyywxvtuqsuurttsuuuwwwyy{{{xxxxxxvvvxxx|||www{{{qqqttt|||yvx~|~}z||~~~|~|~{z||{}xz{}qslpqtvwuuvu}|ĺźʿǼ¬ȑτ̔ܗ՜܄ƐҒԖٍԚ뒑ܐ•~xyztu}~}~~yzz|wywyxzwyy{wyuwuwuwuwuw~vw}wx|vvystuopztuzvuxtswsrwsrwsrutxsrvposmlpqptsrvqprpppsssvwuvwstvvtvvsuuuwwwyyzzzxxxyyyvvvyyy{{{{{{|||zzzwtv}z|}z||~~|~}}|{}xz{xz{~|~prlpntsvttusȻȹȾ竫Ïݍϖז܁srԥыӗ厊٥䛒˕y|}~}~}~~yz~~z|y{xzwyvxwy{}vxuwuwuwuwuw~vw}wxystxrsyzwqruqpyutyutyutyutmlponrkjnnlponrmlpqpruuusssvvuuvstvvuwwsuuuwwwyywwwvvvxyxwwwyyy~}}|||{||}z}~~|~~{~}~|{}}jmosnssvst{y´ο俿ћי֓yxec֔ќ✛玉֓ϐ}|}~}~|}~~{||~z||~wyuwtvz|uwuwvwuwvwvw~wx|vwystwqr|vwxrsxtsyutwsrwsrwsrkjnkjnnmqonrposlkmihjihjsrtxwywxxpusrxurwurwusxvxwyxwyxwy{z|{z|~y~}x|{z~z~}y||x|}z}~z}~z~x{|{{}|{}}|~utvrqs~z|}z|}{}~}}‰bclmmutwst{vzsǿà̑ÙҊƗזל֒ň{}z{}~}~~|~{}wywyuw{}xz{{yvvuzwvzvu{vu{vu}xw|wvyts~yxvqprnmwsryutyutyutkjnkjnnmqpnrpptpoqnmoonpvuwvuwrttpussxvotrrwuuzxxwyxwyxwyyxzyxzvxxv{zw|{z~~y~}x~|x|}y}~y}~w{|w{||{}|{}}|~zy{{}~npq~znpqiklȅfgmmnssuvu{u{tyuʢ}~{~|}Ɖw{wwǝ}~{}z|vxvx~suz|y{{|zxxvywv|xw{wv{vu}xw|wv|wvzttvqpxtsyutxttxttxttkjnkjnnmqposrptmlnonputvvuwsrtrttqvttywmrpotrsxvxwyxwyxwyzy{|{}|~~y~}w|{x~|y~}z~~z~y}~{x||x|~~}|{}}|~~}wyzuwxigminrprus{vuoztӹ~ջѭ͟œqs䪨Đw{|~~}~~{||~z|z|xzxzwyxz~su{|zzzxywv|xwzvu{vu}xw|wvupovqpzutytswrqytrytrytrkjnkjnnmqqptrqusrtqprsrttsurqstvvrvttywsxvsxvtywxwyxwyxwyyxz{z|xzzx}|z~x}|y~}z~{z~x|}z~~{z|~~}~~Í[Zmgqsmnqpywnjws˛Ğ®xvuxvu΢ŠҦȳԸ䲬|}~|}z|y{z|z|y{y{z|{|z{|zwutyutvrq{vu}xw|wvytszutxsrytsxtsxsrxsrxsrkjnlkonmqsrvrqusrtqprrqstsutsurttrwurwuuzxtywsxvyxzyxzzy{wvxyxz{}}y~}{y~}|~~{z~}~~~}~~}~}|~|``rlsthjffwvfgolȌĖ¾ڽ޽ȞĮƺѴ佺ٗz|}~{}z|}|~|~~vx}~|z{y~}yutzvuytszut{vuzutytsxsrzqqzqqzqrzqrzqrmlplkojimonrrqusrtqprrqsttvttvrttrvtrvtqvtrwurwuwvxwvxvuwxwyxwyrtttyxz~v{zx}|z~z~x|~x|}z~z~~~‰́ւafigbelpgl]bjo||Ÿͥм̱}~~~~}~z{|}z|z|z|z|xzy{vwuvwu|zy~zy}|wrqyts|wvzvtytsxrryqqyqqyqqyqqyqqmlplkojimonrrqusrtqprrqsvtvvtvtvvpvtpvtqvtrwutxvxxzwvxvuwtsuzxz|uzyv{zv{zw|{w{|w{|x|}w{|y}~~~~~}}䁋|u~y}inSY\cr{ny҃{|ňȹüƳμ÷|}~~||z|xzz|xzvxy{pqo{|zzxwtpoyutxsrzut|wv{vuxtrvrp}ss}ss}ss}ss}sskimkjomlosrvrqtsrtqprrqsvuwvuwuvwqutpusswutywvzyzy|yxzwvxyxz|z}uwwv{zy||w|{x|{w|{x|}x|}z~w{|z~~~~~}}{}~}}{{߅sp}،xv~}؁هԆԀʓ˕¾¾Ĵÿ¾ã~}~~{|z{xz{}z|z|wy{zyyyx}zy|{wsq}vvzutysr|wvysrwppyooxooyooxooyoommmqpqrrqsrsopoonppoqrqsutvwvxsrttrtuvwtsuwwx}|~{{{zzzwwwvvv}}||||z{{}}}||||{{{}}vz{x|}vz{w{||~}}|~~}~}~}~qwWagwy{{zڄڃҌɔ}yĿ追촩ɽ÷Ÿ»ܥ٠~}xz~~~{|}zz|}z|z||~y{wy}yx{zyxzztt~tt}tt~tt~ttyoovnnsmlsnmsmlrnlsmlbbbfffjjjmmmnnnnmolkmutvvuwutvrqsvtvxvxzy{yxz||~~~~}}}yyy||||||{{{}}}~~~}}}}w{|txyvz{~~~~~~}|~~}|{}~~~qtЇߊ~zsvڈہ™ÿļöĸ~yzʪŒǰ}{}~~~||}~}}z|xzwy~zxyyxxzztt~tt~tt~ttvv}ssyqqtontonsnmsnmsnmllllllqqqooorrrpnpmlnutvxwyvuwwvxxwyzxz|{}xwy|{}uuuuuu{{{}}}zzz|||{{{}}}~~~}}}}|vz|~~~}~xwyrtuˇ䎜u~tq{քہqwrvǾ°ôŹþƹ÷ηЯϴ}}{yy}}~~}{{|zz{||~|~xzwyxzzyxx~vvyyuu~tt~tt~tt~ttvvyqqtonrmlvqpvqpvqpppplllqqqpppppprqsrqstsupoqpoqwvxyxz{z|xwyutv~}wwwyyyzzzyyy|||{{{}}}|||{{{{}}y}~x|}w{|~|{}zy{~~oqrhmcjbmkwzs}q}fp^dgnu{ƺĽǻѿ˸dzhcbÞ|~~yww~~~||~||}~wyvxxzzyww|ttyyuu~tt~tt~tt|rruuxpprmlnihqlkqlkqlkjjjmmmooooooppprqstsutsuyxz~}wvxtsu~zy{yxz}|~|||yyyyyy{{{}}}{{{{{{{{{{{{y{{y}~w{||uyz~}~tsu~|{}~{~|~Ĝ·꯷痢t|wwǩy}¼¾öȻ»ôȺŸķźøö̾ηb]\ãиݟ~pkl|{ton}|{~}}~~}}~~}{{}~y{z|xzuwuw}xw~vv}uuwwvvuu~tt}ss|rr|rrzrrvqp|wvupoxsrwrqnnnpppqqqrrrsssrqsrqspoqsrtyxzwvxtsuzy{vuwqprzy{zzzyyyzzz{{{|||{{{{{{{{{||||||z||x|}x|~~|~~~{~|ʹᶾբrt~Ͻ˹Dz͸î¬{lzj|sc~}wzzt}yf}}~ũfba㽿㻸~}xz~{}~~~~~~|||}y{{}xzuwuw|wvwooyyyyxxuu~tt}ss|rr|rrzrryts}xwrnlupoupommmnnnnnnrrrssstsusrtrqstsuutvrqsvtvutvsrt|{}}|~xxxxxxyyy{{{zzz{{{~~~|||||||||z||w{|{~~~|{}z|}ܦȣ}ywwvttlfg~xy{plshdvwmrixw˷tzpxjvy}p_vfx{~mʬzves͚~q̵ɶ׫~~{}}~~z{{}~xzuwuwytsummxxwwvvuu}sszppzppzppxppxsr{vuqlkrmluponnnnnnmmmpppppppoqqprqprrqstsuvuwxwyrqssrtwvx}|~zzzyyyxxxyyywwwvvv{{{xxx~~~}}}|}}vyz|}{~zz||{}~}{z|qst{}~|~ͼ˿ƶ~z|yzvqģxo~vzœ̨yͦЫ̨ơơײĵҷݸǼ~eh̳zЍö׷Ŀʻִ~~~}|~~yzvy{}xzuwuwzy||{{yywwuu|ssyooyppzppxppupowrqqlkrmlwrqpppooonnnmmmooolkmnmotsutsuvuwutvvuwvuwvuwutvwvxxxxuuuxxxzzzxxxtsu|{}xwytsu~}~|~~}}~|vy~~{z|͋лĮɱqlk~}xƶi\ν°~oΧ|ƨѮxëܽÛسƬܥti⹬}trq}~y½ywvxvvȗҶٷ~~~~}~||{{zzxxyywwxxyyyyuu|uuzvtxrrvqpvoowrqvqpxsr{vuwrqsnmnnnnnnnnnmmmooosrttsutsutsuvuwutvvuwvuwvuwvtvwvxxxxvvvtttxxxvvvxwy~~|~~{z|{z|x{~trrrjõ´̾ͽĭ翱|stxƝҼl|hʶp_zh͵wh몄wz|~~}ǵðìϹŻк~|}~xy}~~~}{{}}yyyyyyyyxxxxxxvvyyyy{vuwrqvqpupowrqupolgfhcbmhgsnmnnnnnnnnnmmmooorprtsuqprtsuvuwutvvuwvuwxxzvvxwvxxxx}}}xxx{{{|{}~}}|~~}|~~|{}~}}|~}|~}|~}~Ʒ~|ljj|t|ּyny«Ęඩ׸˱r}r[ΧutuӿzfsudϲxԔp˺uΔ~}{zŶưâкƹ΢|y|~}~}}~~~~yywwww{{xxxxxxxx{qqyywwwrqupovqpupowrqwrq{z~|wvrmllllmmmnnnmmmoooonputvrrttsuvuwutvvuwvuwzy{wvxwvxtttyyywwwxxxuuuyxz{z|~}|{}~|~}|~|{|{~~}}~~{}~~~ŊԸ~ì}uӷֽٱέ{yyүwŠŘ~nǸľ|r|wvr|zz®ֺӱyzz{~~||}}{|||vv{{xxyyxxwwwmmvvyyvqpxsrvqpupowrquposnmvqpvqpuponnnnnnnnnmmmoooonptrttsuvuwtsuvuwvuwvuwzy{vuwyxzuuuxxx~~~{{{{{{yxz}|~|{}~}~}~|z|z}|y{~{}}|~~}x{ò}|y|ũƬu¨ƴ²Ȱwgwv}ٻŮuf~ԫ⿱ڻ߾xzɴٵtq潬z̻ͭ~~ÿŊ}վϑ}}~~~}}~~{|}}xx~~||yyxxwwvvxxyykcc|wvytsytswrqton{vuupormlrmlrmlnnnnnnnnnmmmooonmorprrqswvxtsuvtvvuwvuwzy{vvxxxzxxxwwwyyy}}}~}|~|{}|z|{z}|z~|{~|~}|~{}~~ʞussǣç~°ʺxڲwԺʶyj~~||qʽ}|غ~yx຦rrz}~|xywrsqֳŢά~~~{|vtt~~~~~~||||uuyyyyyyxxxxvv{{uuvnnwrqzutytswrqupoxsrsnmtnntnntnnnnnnnnnnnmmmoooonppoqtrtzy{vuwvuwutvutvwvxxvxxwyzzzwwwwwwyyy||||{}~}{z||{}zy{yx|yv}zzw~{~}~{}~|~~~}|~ihj{}~|~yxzyľ䨦}uxĶuyĵ{zϿͼs{~|Ķʦ|fưʭsswªoʍtfʬ||zyǹذǩƫҿɟ~~~wz~}~~~yz}}~~~~|}yy{{yyyyyyyyxxxxww}ss}uuupo{vuytsytsxrr{vuvqpupoupouponnnnnnnnnmmmooosrtpqrvuwvvxsrtrqstsutsuvuwyxzxwyzzzwwwxxxzzzzzzzy{~}}|~~}|z}yx{~{zw{x|y~|~~gddwrq}|Ѝ{ʱ{ɻåt}vdWƶƴu۶ѮpìvlwӺqvƱyl|o߽pz~Ľ|zyӚϾմʓ}~z{|}unq{|}~}~z{}}||yyzzyyxxyy}ssxxvqpzutytsytsytsytstonvqpvqpvqpkjlmlnlkmmlnpoqoqrmqrpstotupttoqrrqssrtwvxwvxwvxwvxwvxwvx{z|vuw||||||}}}|||~}~|~|~}~~}~~}|~|{}wvxvsr氱npn~~zy}zsui~qôzk}nĶxyyzǧɬ}mk[۬|yҰzĮȮplۿŵz}bR˻|pzkƶiWpyslvy~{tth¿ÿþȫ|wv||}uu~ĩŽпǫ~|~|~|~z}z|}~|{zwyyxxwwwwvv|ttytswrqytsvqpxsrytswrqvqpvqpvqpjikihjpoqmlnpoqprsnopnoptvwuwxsuvsrttsuvvxvvxvvxvvxvvxvvxtsu|{}|||~~~~~~}}}|||~~~~~~}}|~~~{z||{}zy{srt~}}|~Ǫ|}{~}~zrzto{x}~{yªƣÛ|Ʊ߿zyx˨׹sͯåԶqַԴ˫rݿֹ̿ݿvxϰr|{t~{qjzsz~}|~{zɺvqpwwӰɩϳѰyz~~|~|~|~|~z}z}|~|{zxzzxxxxwwwwwwytszut}xwytsytsytswrqxrrxrrxrrjikmlnihjmlnpoqprsmppmopsvwuwxtvwvuwwvxvtvvtvvtvvtvvtvvtvvuw}|~zzzzzz|||}}}|||~~~|{}|~~|~}|{|{~~~}|~}|~zy{~|{ĵ~~wutsqpڥ}xo{{x~z~l^Ϊ~Ȳ{x{}Щs}oͫtdԹΪЭu˨wvexxpqg`ws|yz}}x~y}|̤ʞǿˮ~{vx|}|~~{}z|z|z|z}z}|||{|xzzyyxxwwxxzz{vu}xw|wv|wvzttytswrqxrrxrrxrrjikihjnmomlnpoqrprqprsrttrtvuwvuwsrttsutsuutvutvutvutvutvxwysrt}}}|||}}}|||~~~~|~~}}|~{z|~}~}~}|~~~~}|~}|~}uz{ptu[]^xwypnnywv|zzrsq§~{w}}xrm|vq|xs|y|}z}xu}z|su|~~z}~rykqx~zvs}wyku{{m|k~p|{sdqixo~vhr~txxyr~xpwqjrleyro|{z~{vн}{~}̾̾~xy{|ztu{}|~z|z|z|z|z}z}{||{|y{{zzyyzzww|ttsnmytsxsr|vvzutytswrqvqpvqpvqpmlnkjlfegmlnmlnqprrqssrtsrtxwyutvpoqutvrqsrqsvuwwvxvtvsrtutvzzzzzz|||{{{|||~~~~}~|{~~~}~|{}}~~~|zz}}}oqqfff}{{trryutd`_xzzy{|hgi~}޾~}|vr~x|u||}z|y|||r{qxuxv~y}|swgpax`P{|}x{~tq}{|}xzupm~}x}{v¿~z~~}{z|ϨƾϽɽμ{|{||}{}{}{}z|z|z|y|{~}~|{}zzzzzzzww}ss|tt~}xwwrqytsytsxsrvqpwrqwrqwrqmlnkjlihjkjlonpurtvsuwtvtqstqsvsurqsutvpoqutvvuwvuwvuwxwyzy{xxxyyyzzz~~~|||zzz{{{|||}}}~~~~}~~~nkm\Y[`^^dbbusszxx~~{|~||zvuuqpz|}}|ۺº{z|z~}yyvypfzpxsxzzw|}}~xl~q|{}ugwmrj~qiuouovo{y{sphzʿ{{xt~xxxdzħIJƶ½˥ػ~~|~|~{}z|z|z|y|{~{|}||yzzzzzz||yyvnn}|tonztttonzutvqptontontontonkjllkmlkmjikbbdurtusuvtvpmo|y{~{}xwywvxutvyxzxvxxwyvuwxxzzy{utvxxx|||{{{|||zzz{{{~~~}}}~~~~~~~~~~~}zy{~tvwvz{}~~}|~{z|{}~|~|y}~y}~~z~z|}wyz}{}~{}~wyz|~yyy{{{}|sqqb_adac}y{|~|{鿻~z|vpkz~zu}xuzwzvy~}{|yw}{~xxq|uxr}r_Z~le}tutw{y}t~{z¾ÿþ֫}y}|x}xwyyyɺʾ̱ؾɸ}{}~|~{}z|z|z|y|{~}~~{zzzzzzzzxxyyzyxsr{vu|wvxsrwrqupovqpvqpvqpkjllkmonpqpqyxzsprvqswrtpkmvsuwvxtsutsuzxzyxzvuwzz|ttt{{{xxxzzzyyyxxxsss{{{yyy|||}}}{{{yyyz{zzzz}}}zy{}|~{z|wvxonpy{|puvjophmnejkhmnutvpoqkjlyxz}|~yxz|{}}xz{}~z{yxvz{vxy~|{{x~~~}llkͼ|}smitojzvq{wa]Yuqm~zyo{xnxn|r|zzqzvz~tvyxp}jvtwu~mnsrsyf{w}twnxnf|ukojc}u|}v}z|vzswzq~poym|p{rwoȼĺǸľſtplwtp~z~{w~~z||npuưֻ͸Χ}~~z{~}{}z|z|z|y|{~~xy~}{xzzzzzzyyxxxx|wvxsrytsxsr}xwuposnmtnnsnmsnmmlpmlpmlpkjnonrtqstqstrtwtvwuwsprytvxtvwrtfbdzuwzwywtvvrtkgiifhxxxxxxxxxxxxuuusssrrrttt{{{{{{{{{tsuxwyyxzqprrpszy{yxz~}~{}~y|~{~~~~~{}~|uȼ½ӻ|{zqpo~|yx~~}{zzywvuvjw{l~n|qwxnzp~t|qwwrv|ovzntzmyt||m}ozrurysd{uf|m||xrl}wм½·¸ȼv{ujg~{}z{x|y{y|z{yzxyw~~~~xvxÖϡӶԽ䠨ǚ{|~~}~~xyz}z}z}z}z}y|{|zy~yvzzzzzzyyvvyyzutzutytsxsrytswrqsnmrmlsnmtpnmlpmlpmlpljnpnrpmotqstrtvsuwtvsprwrtwrtuprvqs~y{wtvurtwtv|y{~xxxxxxxxxxxxyyyzzz~~~xxxxxxzzz|||~zy{zy{~{}~}|~wvx{z|~~{~ttvll۾޳tonxoowooskkwwww~~||ww}}~tzpfs{n~~suvk{rw~u}sr{n~x{s{pzor}yls}p{sfyl{nyxvzlſſýȾ{~{zx}~{~{~{}}{zxzxzxyx~~}ǽŬΰ°μΰϼ}~zsv|ux}vyz}z}z}x{y|{||{{xzzzzzzyyvvxx{vuztt|wvxsrwrqvqpwrqupovqpwrqmlpmlpmlpllppptroqqnpurtxuwxuwvsuzuwzuwwrttoq|wyzwyyvxzwy{xz~{}zzzzzzzzzyyy{{{|||{{{zzzwwwyyy|||zy{|{}{z|wvx~}zy{}|~zy{}|~}|~~~x}~}~}~}~}zy||~~vtsӻĽӻzutw|xqvldumxo~v{x}uvmvlvkvjdys~rkxvk}~v䶹z|x|tr}~{|yxuzw}z{x{x|x}}˸źƠų¯̴~~y{~|}|}x{~wz~wzz}z}z}x{x{}wx}xw~yvzzzzzzyyvv~vv|wvyts|wvxsrwrqvqpytsxsrxsrwrqmlpmlpmlpmlpqptvsulikwtvurtroqsprxsuxsuvqsvqsvqs{xzwtvwtvxuw{xzyyyzzzzzz{{{{{{{{{{{{{{{zzzyyyxxxzy{|{}{z||{}wvx}|~{z|~}~~{}}oqr~~~}wrsvqrytuͷ»ųȵѹƾƽz֥~|x|{w}}xquoh|wp|voyvnyzqtqi~w|uzsyki|zyvxuyv|y|y{xzw{x|y}}ʬֻŴМ~xy|}~y||uxz}z}z}{~~wz~xyzyzxzzzzzzyyvv}uu}xwytsytsxsrzutytsytsxsrwrqvqponrmlplkolkolkotqsmjlsprroqurtzwyzuwzuw{vx{vx{vxyvxyvxyvxxuw~yyytttzzzqqqzzz|||{{{zzzyyy{z||{}zy{|{}{z|zy{~}~}~xz{}}}wwrsoml¡wyzxz{z}{|}{|}~~~|~|}{}z|}~~|{пǾ¸ſʿ·ɿízvuuqmyv|yyurZRN~sp~uqwsxs}xxuyuxuywxvyw{x~{|xu{xzwyv}~~yy{{DZӶȫّ|}~{~|~z}{~z}z}~xy~yx|yzzwwyyzzvv~vv{vuzutytsytsytsytsytszutxsrtonmlponrposqptonrsprnkmrprurtvsuzwyzuwzuwztvztvztvyvxyvxyvxxuw{xz{{{uuupppmmm{{{}}}|||{{{~}~}|{}{z||{}~}~~~}}~}~y}~tvv{|}|}~|zï~y|~~~{~}z~x{{~}{}vz|{zfba}|}|ǾɳǼúøǼʿ}|y|u}|~zywtwt~wt{xwtxvtrus~rpsqut{xywywxwxvxvxvwuzw{x|yzw|y|yyv}}|ur¡ҿɼþȮ}~}~~~||}|~}||~z{~yx{x{{||xxzzww~vv{vuzttytsytsytsytsytswrqvqpupomlponrposnmqlkoolnroqroqurttrtxuwzuwzuwztvztvztvyvxyvxyvx}z|zwyooovvvssssssvvv~~~|||}}}|||{{{yxz~}~~}~~~~~}}{|xz{}vy~~y|~y|x{z}{~z~uyrux|~{zwsryut|{ָԽ˲ý¿÷ƹ~|znl}s~uyv~s|vkzoxqffaX{wvzvuzvu{wvtr}qo|pnvtvt{mk|zrppntrusxuzwywxwxwxvxvxvxvywyv}zzw}yvpjg}}~~yutɮȽ~~|}~~}}||ux}~{zzw{{||xxzzyyxx|vvytsytsytsytsytsytszutxsruponnrllpkkollpmlqljlrprpnprprrprsqszuwyuwzuw{vxzuwyvxyvxyvx}z|zwyz{zwwwzzzxxxpppvvv||||}|~~}~}~}|{}yxz|{}~~~~~~y|}~}yqv|~zy~x}x}x}s{x~qyx~ryzttztt~~~|zyqkjsmktnl}xv|z~ywwrpzxvxunrovzwpuq~~|y|||ss}utwolsgfthg{ooxwyx|{vvxxyy~~vwvwkttinoclmakl`ke[snc~wm|qzpuzuszvt|zxssrptswutrurwuwupoposrwuxtxmjvtvtutvuwuwu}z|zzv{x|y}yyvzw~~|rrzzvrr|xΨƼȵ}~~}y||{~|~|{~yuzzxxzzzzzzyy|wvxsrytsytsytsytsytszttupoojihoohoohoogmnhooknomoporsnstfmmqxxqvwvvx{xzwvxtxyxwyxwyxwy~}vuwwvxxwy{z||{}|{}}|~~{}~{}~~|{}~}~}|{}~}~}~}|~}|~z|}~tsu~|{}}~~zx~|zzxxwzxxzuxtusutrtrtqvsxv{v~uoukfxnivqwrxs|pktoto|yrzwpyvo~x~ztztwr~y|zturk{}vjefZT|vxq{od_yswr}rl~sn|qltidsntoto~sm{ojwr~sn~sl~rmsntowrsnsntlvqso~qosqxquozsysyrtnunupyrwq{ssmxqxsvr|rn{wo}yr{wp}yr}yqusyztustyzz{yx{uuyy|utzss{z{z{z~}{{yyyyyywwzz~~~xxtxvڦ׸˾֤~|{}}~~}~zvu}yx~{xw|{yyuu|rruuwwww{vuytsxsrxsrxsrytsytsytsxsrvqpgppgppgppfongpplpqnpqostrwxlttlttsxywyzxuwvuwswxyxzyxzyxzsrtvuwzy{}|~}|~|z||{}~z|~z||y{~{}~{}{z|yxz~}~|~~~}}|~|{}}~rtuŬ}||{zw~||xwtusxvz|uwtvsutrtrtrsqus{wvowmfukd|rk~{uwqzt|vztyvnxumwtlvsk}zrwpvp{u{uysxx~{sqnfvsk}uvpznh{uwqznh{|pjvpuotnvpxrsmsmsm~rlsmsmsmsmtntntnvpvpyssktnroqosqvptnys|vztvpwqxruo}qk}rjukskvqxtzv{xp|yqzvn}u|yqwuxy}~|}{|xx}xwzutxsr|{|z|z|z}|~yxyyyyyyzz}}~~~~}zy~y|z޵ҬЈz|~wrt{}}||xx~zy~zxyyvvuu~ttxxww{vuytsxsrxsrxsrytsyts{vuzutxsrkopkopkopinokopmpqqstptvqvwltthppsxywyzxuw{z|w{|yxzyxzyxz~}xwywvxvuw~|~|{}}|~|z||z||y{}}~~}~}~}~~zy{wvx~}ƪ~zy|xwzx|z{xwtusvtz|uwtvsutrtrtrsrtrupzsz~wpwpxrystnxrys|t}zr}zr|yqtqi|u{usmuouo|u}zrzvnxumzwowtlxr}qkznhtnsmwqtnvpuotntnsm~rlsmsmsm~rl~rl}qk~rl~rltntntnuotnwqumvproqosqvptnzt}wztysysxrxr~x~tj}si~tm~voxt|yq|xpxvnwyvn{yvwyzyzz{zz|xv{vuwrq||||||}|~yxyyyyyyvv||}ss~}~}}|˲Πֳ׿̇~{}~}|~}xz{}}xz{||{|xw~~zz|xwyyxxyy||yyww{vuytsxsrxsrxsrytsyts{vuzutzutkpqkpqkpqjopkpqprsrturvwtyznvvowwqvwuwxvsu{z|vz{vuwvuwvuwutv~xvxxwyyxz~}}|~~}|y{|y{{xz~{}}}|~~~~}~}~~~~}|{}z}{|zz~}zvu|w|w|wytwsxuww||vvuuttuququqvrvr{t{t{tvoxqwpyswquowqwq{xpzwoyvn|yqyvnun{utnuowqyr}zrurjwtl|yqwtl|pjuovp}qk~rlwqtn~rltntntnsmsmtntntnsmznh}qk~rl~rltntntnuo~rlsmrluoroporqwq~rl}w|vysysyswquosmumxjxmxo|uoztm}zr{xpxumwtqizxyzyzz{z{xx|wvzut}xwlgf}|}|}|zyyyyyyyxxyoo}|~xxxɭϾ樧}~|y{~y{}~~}|wy|wy~yzvrq|xw|{{z{zyyzz||||zzww{vuytsxsrxsrxsrytsytsytsytszttglljnokopkopostsuvprsrvwqvwowwrzzqvwsuvyvxwvxswxvuwvuwvuwvuwvuwvuwyxzzy{yxzzy{zy{|z||~~{}~{}~~|{}{z|~}~~}y}~~uyzrwvzy{qoo~~{wv~}x}u|t~{s~xqwsxxxy~tt}ssuuuououououowp|u|uxzr}vwqwqxrwqwq{xp{xpurjzwozwoxqvp|pjsmvp|rk}uzwovsk}zryvntnsm~rltn~rlys{oi|pjsmsmsmtn~rl}qkuouosmxlfsm~rl~rltntntntnsmrlrkrltqonrquoxruoysxrztwqwquowqzqsma}yk|xmzxnzwo}zr~{s|yqyvn{xpvtxyxyxyz{zz~yx|{{vu|{|{{z{z}|~}~}zzxxyyxxxxzzzy}|~~~ɚű׾Ƴ䝜~}~}{uv}~z|~~}{z{zyywwxxzzxxxxzutytsytsytsytsytsytsytsytsytseghgijopqlnnqstrtuprsnrsmrsmuurzzsxyuwxyvxwvxswxvuwvuwvuwyxzzy{xwyxwyvuw{z|zy{yxz}z||y{~{}~{}~}|~~}~}wvxzy{}~}}}zxw}|~{z~~x}~u~|t~{sxr{uxuxu}tp~urvsuououououovpzrztyr{tywqwqwqwqwq|t}usph|yq|yqvozt}wtnvp~tm|yq{xpxum|yqyvntnsm~rl~rluouo{oi{oismsmsmtn~rl|pjuotnsmznhsm~rl~rluououotnsmrlrkqltqonrqvpyszt~rlvpztwqxrxrys{rt~|nyxmyymwxn}zr~{s|yq~{szwovtxyxyxzyzyy|xv{zzutzyzut{z~|wv~}~}zzxxyyzzzzzzzy~yxzy~}¶ʽɭƞz|}~yzz|z|z|z{~}}|~}{z{z{{yyzzzzyyzz}xw|wvytsytsytsytsytsytsytsytshjkiklqstjlmqsttvwtvwptulqrmuupxxqvwuwxyvxwvxswxvuwvuwvuwzy{{z|wvx{z|}|~zxzzy{zy{~{}~~z|~~}|~~}~yvx|y{|y{zy{lkm~~~~}|~v}~t~}s~}s{zo}wpzwxvwpm}vs~wtvnvnvnvnvnvnvoxq|uzszswqwqwqwqwq~vxvsk{xp{xp|uuo{oivpvpvptqivskxum{xpzvntnsm~rl~rluotn}qk|pjsmsmsmtn~rl|pjwqtnsm|pj~rltntnsmsmsm~rlsmtnslrmtqonrqxrvp~rlvp~rlxrwqysvpvpwn||lvvfyykwymuyn}zr~{s|yqyvnzwovtxyxyyzxyvvzutzyzy{z|wv{z~xsr|{~}zzxxyyxxxxxx{z{z~{z~}~}ɷƫʺ;̔{}z|~y{~y{}xzrmozuwz{~}{z{zyywwxxzzyy~vvzutzutytsytsytsytsytsytsytsytsiklkmnlnokmnnpqnpqruvqtupuvnuupwwsxywyzyvxwvxswxvuwvuwvuwwvxyxzyxz{y{yxzxvy{z|~}{}|~}z|~}~~}~~}qqs{|txyŸ~}~~w|u~|s}|r|yp}yq~y|wvpk}xrxsvnvnvnvnvn~tm~slxqzs{tyrxqxqxqxqxq|yq}yrwskzvnzvnwptnysvpvpxqxumxumzwozwozwotnsm~rltnuouotntnsmsmsmtn~rl{oiyssmsm}qk~rltntn|pj|pj|pj~rlsmtntmsosqonsrxrxrvpuoxrwqztysxrxozzixyixzlvymvxm}zr~{s|yq|yqzwovtyzxyzzwxuu{ttzy{{}xwzy}||zxsr{z~}zzxxyyzzzzzz|{~ةӳϴ㤢xrt}~z}~~|~}~~}{z{z{{yyzz{{zz|ttyts{uuytsztsytsztsytsztsytsztshlnhlmkophlmlqrpqrtrtutvrrtqrsvwxtvxuwxvvxuwxuwxvuwvuwyxz{z||{}wyzz|}z|}twwz|}z}~xwy{z|||~z~~z|~~}|~|~z|{||}||z~vs|yuzw{v}{r}wrzqn|{uutruqvo~ulwnwp{sl}vo}yr|zq|zrzvozvo|wpyumxtmxq{slvovovoununuotntntnyvnvskzwo{xp{xpvounsmsmsm~rl~rl~rl~rlsmvo}un{tl}tm{tm}tm}qkznhuosmsm~rl}qk~rltnsmsnrrrruursxjksmuovpsmwquowqwqwqxq|yqyvm{ypzwn|yq{xp{xpxum~v{xpvs~vruuy|wz~su{{vvyyvvyy}|~xxxsr{z|{|{zy{z{z||{z~~}|~}~~ѳ̚ȹϹӫ}~~utv~}~}~|{~}||{{z{z|xw}wvyy{{vv|ss~tt}tt}ss{rr{qqzqq{qqzqq{qqimnimnkopimnjnoonprqssrtpoqvuwrqsrtusuvuwxuwxuwxvuwvuwyxzzy{yxzwyzz|}z|}|~z|}wyzzz|}|~y{|x|}x}~z|}z|}y{|}~{z|~}{}~z|}}~z}{vz{Đxxxwtv~zy|{|{}|~zy{xwt~~|~ur|vq~{s}wrzqn{{uutruquq~tmwnwp{sl|vnzwoywoywozwozwozxpzwoyvn}xp}un~tmtntn~tltnuotntntnzwozwo{xp{xpzwo|tm~tmsmrlrl~rl~rl~rlsm}qk|rk|tl|tn|tm|tm|tmsm~rltnsmsmxr|v}wtntnuqrrrsuvtutusmvpwqymgvpuotnvpwqxrzwowtlzwo|xp}zr{xp{xpxum~v~{s~vr~vs~tuxxuw}rtzppyyxx~ttvv}|zutzy{z|{{z~zx{z|{}|{z|{~|}|~}~~~ʽŹīߺǶ|{}}~}~|}z{~zy|{}||{{z{z|xx}xwxxzz{{ww~tt~tt}ss|rr{qq{qqzppzppzppfjkfjkhlnmqrimnrqslkmtsuwvxutvvuwrtusuvuwxuwxuwxvuwvuwyxzzy{yxzwyzz|}z|}y{|{}~y{|}|~}|~y{|x|}x}~z|}|~}~|{}|{}~~~{}~y{|~y{|}}{}{yxz~y~z{|~}|}z}vs}z}vsxu}x~{s}wrzqn{{uutrtruq~tmvo}un}un{unxumwumwumzwozwozwo}zryvn}vp}xpyqj~unsnzrj|tmwptntntnzwo|yq|t}zr|yq|tm~tm~tm~rlrltntntntn}qk}sl|tl|tn|tm|tm|tm}qktntnsmsmsm}qk~rl~rltnuqqrrtqr~pqxxxruo~rl}uicztztuovpwqzr|yq|yqxvn~{s~{s{xp{xpxumvskvsk~tp~tp~uq}ss|qszoqyyukkvv~ttuu}|xsr~zy{zzz~yxzy~~}{z{z|{}|~}~}}|{ϘķƫǿŹȮ|y{yxz~z{~xy~zy}||{{z{z~zxzz~vv~tt}}xx}ss~tt}ss|rr{qq{qqzppzppzppbfgbfheijquvimnmlntsuqprmlnyxzwvxuwxvxxuwxuwxuwxvuwvuwyxz{z|{z|wyzz|}z|}xz{y{|xz{}|~|{}{}~y}~z~}~}~|{}|{}~}~zvuyz}}}|~~bbb~}~|~}|y}vs~vt{xzu~{s}wrypm{{uutttrtr~sovo|tm~vo{unyvnxvnxvnzwozwozwo~{syvnzwoyrwoh~tm~tmwoh|tmwpuntnunzwoyvn|yqzwoxumxrk{sl~tmtotntntntntnuoyr|tn|tl|tm|tm|tmvjdvptnsmsmvp}qkz{oi}qktp~pqstst|noz{~rlvpxrysi]Wztzt~rluowqzs{xpzwovsk|t|t{xp{xpxumvskyvn}tp}tp}tqxuwvuw}ssww~ttvvzyyts~zy{zzy|wv~yx~}zy}|~}}|~}~йʭº̾{}ztu~z{}~{|{|~yz|||{}||{{z{z~zy|{{{{{vv~ttuu}ss|rr{qq{qqyooyooyoocghaefdhiptukoponprqswvxsrttsuvuwuwxwyzuwxuwxuwxvuwvuwyxzvuwwyzz|}y{|z|}vxybde}|~}|~z|}|mrsuwxz|}~~~~~|{}|{}y{|vxy~xz{{|||xw~}}~son~}{z|{|y~{niftpl|xs|yq~xsyvwwwwwy|pptquq~so|tm|tmztmzwowumwum{xpyvnzwozwozwoxum|yqztm}unun{tm|vo}ununuounzwo{xpzwoyvnxumxrkwrkzrjunwqsmtnuosmtnvo}un{slzrk~vo~vo~rl~rlsmsm}qktn}qkuo}qksm|pl{mnrtqrwxvw|pj~rlvpvpwqwquouotntnzrxumzwo{xpyvn~{s}zr|yq{xpyvnxum~vo~vo~uqxxyy}ssyyuuxx{zzy~}~yxzy~yx~{z~yx~yx}|}|}||{~}~ƵѤŰƬʯю~}~{|}~{||}~}~}~zy}yx|{|{|{uuvvww~ttxnn}ss~tt|rr|rryoo|rr|rrdhibfgeijmqrkopqprlkmjikxwysrtpoquwxvxyuwxuwxuwxvuwvuwyxzwvxuwxwyzwyzxz{xz{cef}|~}|~y{|}|~|~~}{z||{}{z|xz{quvx}~v}~~wz~~{z}|~}|y~yv~{zurzvq|yq~xsxuwwwwwy}prsstr~so|tn|tnztnyvnxvnxvn|xpxumyvnrogrphqogyvnzwo~un}unztmzwo{un{tl}slyrzwo|yq}uurjxumurjwqjwqj|rk|rk|pj|pj}qk}qk~rl~tm}un{slzrj~vo}un~rluotn~rl~rlsm~rluo|pjwqxt}opsttuuvstuoxrsmtnvpys~rl~rltnvp{t|tzwowtlzwo~v|yq{xpzxp{xp{xp~wn~vo~uq{wwnk|sp||yyuuxx~yx|{~~}}||z}|{z~}~}}|}|}||{~}~}˺ͶǼͺʻʳ̷ҝ~zy{~~z{}~~}~}|{}yx|{|zzzxx~ttvvwwxnnzpp|rr}ssuuyoo|rr|rrimngklkopostnrsrpr{z|jiktsutsutsutvwuwxuwxuwxuwxvuwvuwyxzyxz~uwxuwxwyzxz{wyzy{|}|~}|~{}~z~x}~|~|~|~~~~|{}|{}y{|~y~~ksv~…yww|y{|{}||{}zv|x}zvwtp~{|yq~xsxuwwwwuy~qs|pptr~rp~up~vn|vnvsk{yq{yq|yqwtlyvny~vw{yqxum}wp}unytmzwo{unzrk{qj{xumyvn{xpurjxvnyvnxvn{un{sl|rjsm~rl}qk}qk~rl~tm}un{slxpjxq}untnvp}qk~rl~rlsm~rlsmsmtn}qm~pqyzrtqrrsvpxr~rl~rluouo}qkznhznhvpztyvnyvnvskzwo}zr|xpzxpzvnyvnyvn~wn~wn~vo|sowt}tqvvyyuuxx~yx~}|{z|{~}||z{vu}|}|}||{~}z}{ҽȸɹʧжȴܽբ~}z{|}}|~}yx{wv|{|{~zz~yx~~zz~ttvvwwvvrhh{qq|rryoo|rr|rrkopgklkopnrskoprqs|{}nmovuwsrttrtsvvuwxuwxuwxuwxvuwvuwyxzwvxxwyxz{uwxy{|vxyy{|y{|}|~}|~}x|~|z|}}|~|~~}y|~~z~~z}zvzws~{w{xsxuq|xr~xsxuwwwwvy~rt{oqtr}sp~uq}vo|vourj|zr{yq}yrxtmytn|xr{wpyyqywo{xp~xq{unxumzwo{un{unog`wqxumurjoldzvnyvnyvnyvn{unxqjyqj~sl}qk|pjsmsmvo~un{slypizs}tm~rmvpymh|qksntmtn~sl~slun|plrrtu~qq}pptt~rm~rmsnzu{vto|wto{uzu~uoyvnxum~v~v{xp{xpzwoyvn|yq|yq}vn}vn~upztzvzvwwyy~uuxx{zzy~yx~}}||{|{}|}|}||{~}~}ӣн͵ֹÿղyz~|}xy{|~xy}|~|{|xw|{|{}zx|wv{{{{vvww~ttzppyoo|rrwmmtjjyoo{rr|rrbghejkinnjnokoppoqpoqonplkmxwytsuutvutvwvxtsuxwyxwywvxyxzwvxwvxwyzxz{y{|y{|y{|y{|{z|}|~}{~}~~~~wyz}|~hgi}|~wvx~{|}{~{yx|~{~}}~|{ywv}|{z|xw|xxzvuzvv|xwxwxvwwwwww}wvvpopjjxxxqqxtqxuqxvnxvn{zp}zr~sr}rqtststs|yq{xpzwozxp{xp{xpyvnzwoywookd~{suskvtlrphuskvtlxumxtlwumyvnxtlvoun|rk~tm|uxqsm~smsm~smsm|nnzmlzmlutqqxplwslzvnyunwslzvqvpoxqqwqqzts}wwytrwqowqo{us~ywysqf`^~xv{vtztrztqwtlwtlzwoyvnzwo{xpzwoyvnyvn{xp}xv}xw~xvzxzz~yx~xw{z{{|xwztszyqlkytszy~}{zzz{z}|~yx}|}|}xw~}|z~|غ̣Įٴǻƾ˖~z{|}z{}}~~}~|}{|{|{|{|z{~xyyz|vw~xy}yxzvuzut}uu}ss}ttwqprmlvpoupovooeghfhijklkmnoqrpnppprnmonnpvuwtrtutvutvutvtsuvuwzy{vuwvuwxvxxvxxz{y{|z|}xz|xz|xz|{z|}|~}|~~}~~{}~z|}y{||{}{z|z~z~u}}y{}{}~~||v|zn|{pru~y{ywxv{{~}~~~}}}~~{|z{yzwqr~|{~}|~}}||xwzvuzvu}yx~zy|xw~uuxxxxxx}xw~}|~yxxuqxuqxupxvnwvlxumss~rrssssss{xpzwozvnwtlwtlzwozwozwoxtltqizwouskusktrjsqivtlvtlvsk|yqxumwtl{sl|rkyohzs~tmyrsmsm}qksmuoqr|noykluvrtxrlwtlxvnvsktqitpkwrqvqpupoxrrzuttonupoxsrwrq{vurml{zzutsnmupoupmwtlwtlzwowtlvskxum{xp}zryvn}zr|wt|wv|wv{vu~zx~zx~zx|{}xw}xw~yx|{}|snm}|~|{zz~xx~~}|{z~}~~}|{zzvuzxxúƳú̗ͪܰ~xy~}}|~}}|}||{|{|z|{||}z{z|z|z|z{yz~xy~xyyst~zxzvuzut}uu}ss|ttwrqtonvqpvqpvqplnofiidgggijhjkonppnpnlnpprsrtsrtutvutvrqswvx{z||{}yxzyxzxxzxxzxz{y{|z|}xzzxzzxzz|{}|{}}|~~}~{}~y{|z|}y{||{}~}|{}~{|u}}x~{}|xwp|~r~~x|zsywz|zy~|x}~||||||}~~}~zy}yx|{{z{wvyutyts|xvxxxxxxzyvqpoji}|~yxxuqxuqxupxupvtlvskssttsssssszxpzvnxvnurjurjxtlzwoxumvskwtlzwotrjtrjuskrphtrjurjvskzwovskwtl{sl{qjyohxq|rk}slvp}w~rlsmtn~pqzlnxjkuvtuxrnwtlxtlvskvsktpkuposnmupovqpxsrsnmsnmupowrqxsrytsupovqpsnmupoupmwtlwtlxtlwtlvskxum|yq|t~{s~{s|wt|wv|wv{vu~zx~zxzy||}|{z{z~|{}xwzyzyzy|wv~{z~~~yxzuty|zzѾͷž̷ƾɵ{vw~~{~~{}wtvzwy|y{{xz~{}}xy~yzyzyzxzyz|}{|zzzzzz{|z{ztuystztu~zy{wv{vu}uu}ss|ttytswrqzutzutzutqprpnpqprusuompnmoonpmlnrqsqprsrtutvutvutvwvxtsuwvxvuwwvxyxzyxzuwxvxywyzwyzwyzwyz|{}|{}}|~~}~vxy|~}|~}|~~}qst|z{z|t{}~zr{~zz}xz~}}|}{z~}|~}~~~~~}~}~}|{|{~}}|||}|zyyyzzyy|{{zzy~yxxtsxtsxuqxupxvmyupttuuvvvvvvzwoyvnxumurjurjvskzwowtlvskwtl}zrsqitrjrphuskrphurjyvnsphvskvsk|tm}slzpiwptjcwptn}qkvptn|pjzlmyklxjktutuysnwtlwtlwtl}zr{wrwrqxsrwrqwrqxtrzutwrqxsrxsrytsytsupovqp{vuytsytqwtlwtlurjwtlzwozwo|yq|t}zr~vzw~yx~zxzyzy~yx{z}|{z}|~}|{z~}}xw|wvzy|{}xw|{~|z|{жҪ̲ͳyz~~}{xz|y{|z|}xy~yzz{z{y{z{yz}~yzyzyz{|{|ztunhiz{{z|xv{vu}uu}ss|ttzutxtrxsrxsrxsrhhjhhjhgijikkkmlkmlkmnmopoqtsurqsutvyxzyxzwvxtsusrtutvxwyzy{xwywyzwyzwyzvxyxzzxz{zy{zy{{z|{z|}|~{}~y{|z|}z|}{}~~}{z|}|~|y}~v~~}{}~~t{{||znwwy|}|~}y{tyzvz{zzz~||ommpnnxxx|}topupq~wrs~yzwrsdz~{}|~}~|{{z|xxyusyqq}}{z|{|{}|zyzuvwsrwsqxuqxupyupttttuuuuuuzwozwozwoxumxumzwozwozwoyvnyvnyvnvtltrjuskuskuskvskxtlsphnkcsph{sl|rk{qjsibpf_wp~rlxr}qk~rl~rl|no}opzln~pqqrvpkurjxumyvnyvnyupxrrytszutytsxtr{vuyts{vuzutxsrxsrwrqwrqytsxsrwrosphxumvskxumzxpxumxum|yqxum{xp}xu}|{zzy}|zy|{|{~}|~}~~~yx~|{~~{z}|{|з򳹾Ö{|}z|{|~yz{|z{|~z{z{z{~xy{|~xyz{|}tnoyz~~zy}yxzywwvvyqqytsxsrtonqlkqlksprsprsprtqsqnponpsrtrqsonppoqtsurrtutvwvxxwyxwyttvqpr|{}zy{xwywyzwyzwyzwyzwyzwyz}|~zy{zy{zy{|{}{}~|~}z|}|~{z|~~~}~}x|}|~}r{r{pxr{~yvz|s~~w~}~}}}~~~~||}|~}}||{{z{zx{wv|wvxtr{{{vu}xw~zx}|zyzuvwrswsrxuqxupytpttttttttttzwozwozwozwozwozwozwozwozvnzvnzvnvtlvtlwumwumwumurjvskqnfqnftqiyqjzpiyohyoh}slyoh~rl~rlznh|pj|pj}op~pq}op~pqqrxrmyvn|yqxvnxvnxtpxsrvqpvqpwrqwrqwrqvqpxtrytsxsrwrqupovqpupoupotolsphyvn~{syvnvskwtlyvn|yqyvn|yq~xv}|{z|z}|~zx{z}|~~}}|~|~~~{z~|{~}~}~}zy~~}~}ԷĻӵ}}~}~~~}~{|z{}wxz|yz{||}xrsz{ztuzvu|z{vu|ttuuzrrytszut{zhfhhfhhfhlikolnlkmrqsonppprqprutvqprsrtsrttsuvuwttvqpr|{}yxzyxzwyzwyzwyzuwxxz{y{|}|~zy{|z|zy{|{}|~|~{}~|~z|}zy{}|~|{}~}}uyz|y~{~}{|xszz{~|z|}oqrkmnz|}|y{|zy{yzzsuu{}}|~~~~xxx}}}{|}z~}~}|z||~|}|~zy{wv{xwywv~zyzvtww{vu|wv|wv{z~yxzuvwrswsrxtsxuqytqttttttttttzwozwozwozwozwozwozwozwozxpzxpzxpxvnvtlwumwumwumzwowtlurjtqivskyqjzpiyohzpiyrtjcuoymgznh{oiznhzlm~pq}op~ppqrztovskrogxtlxtlxtnxsrvqpvqpwrqxtrwrqvqpwrqxsrwrqwrqupovqpwrqxsrxspvtlyvnurjvsk|yqurj{xp|yqyvn|yq~zv{z|{}|~}~yx{vu~yx|{{zzy~yx{z{zzy{z~}~|{~}~}~}yts|{~}~sqsɿѹĥѽ~yz}}z|~~}}~}~z||vwzz}~|}z{}wxyz~{wv~}zutwoovvxxyts~yx{vutonupoojlojlpjlrmoqlnnlnmlnonprqsutvutvrqssrtutvutvutvsrtutvxxzyxzyxzxyzwyzwyz{}~vxytvwzyzzz{}||{~~|~z{~vyzy{|}~}~zy{~||~swx{w}~x~wttys~ww}v}qwzmtxovvu~~ywx||}~yzw|zx~}w}|~~y{|vvu}~ϋ~}~}~{z|{}||{~zy{xwyzx|zy|{|wv{vu}{zy|wvzy~yx{uwwrtwrsxtsxuqytqtttt~ss~ss~sszvpzvpzvpxuoxuozwpzwpzvp{xq{xq{xqywpxvoywpywpywpzvpurkspivrlwtm|sl{rk{qjvn}v|rk{pjwlf{oi|qj{pj|oorsss}op~pq|vqxunvslwsmwsmwsnupovrpwrqyts{vuxsrwrqxsrxsrvqpvqptonupovqpxrrytqzvpxtnolemjctqjtqi|yq{xpyvn|yq{xzy|{~}~zy{vuzy||{zyx}xwzyzy~yx|z~|{~}{vu~}~~~γַղ|wx~xtt|}}~{|ztuz{|}yz{|yzwqr}|~}|wvxrq}tt|ttzutsonqlktontonsprroqroqolnolnonpnmonlnlkmutvutvonponputvyxzwvxsrtrqsutvzy{vuwutt{zzzzzvxxuzymop~}qtxv|uz|{x|ru{oswtyzv{|uwxrqsa]_{wygbdnjlprsklmdghnqrrtvirsluvv~mvwrz{x}}eijtxxtxy}w{|uz{y|}~y{|v||}|~mkj{}z~~~}~}|}{|}{yzxzxw{wv{zyy~vv|ttzrr|ttwsqytszutzutytsxsr{tt{tt{ut{ut{utvvsvvsvvsvvsvvsxurzus{vtytrzuswsqvtrvtrusqusqusqvsquqoromtpnuqousiwtizvi{vi}vewrcwrkvrjxtlwrkvrjvpoztsyrryssxrrvrpyusxusxurxtruqoupowrqupoyts|vvytsxsr|wv{vuzutvqptonxsrupoupozut|vu|wu~yw{yzxzur{wr|yq{yo|zp|{w{zy}}{{zyzzxyxwqml{wv}|~}xx|wv{z~}~|{~||{~~~~~~}̧ҧжᗖ{}{xz~~}~}vz{~{unq}vz|zz~z{|{zzvwyxwxvvyxxxvvyuvwtuwstvrstrryvvzxxyuvjgigdfebdolnolnkjlkjlkjlhhjlkmlkmihjmlnpoqpoqpoqpoqpoqsrtvuwqprtrrwwwuwwxyylqp{}}quymszlryqs}vxy}{z{tyzuxy{vz{}y}||}|vuwtsu~~~}}~|}~|wxvz{yyzx}|}|zywxxxyy~uuvw|wv{vuzutzut{vu|wvzutzutzutzutzutuvtuvtuvtuvtuvt}yx{vuytsytszutwsrvtsvtsusrusrusrtppsonrnmtpouqptqitrgxufysf{te}wjzwourjvtlvskvrjrml|wvwrqxsrwrqtpouqpvrqvrqxtsyutytswrqvqpzut|wvxrrwrq{vu{vuvqpupovqp{vu~}vqpyts{vu|xv|wvzyzy{vs|xs|xtyvnzxnyxtz{yuvtvwuyzx}~|}yx|xwyut~vv}xwzy|zy~}~}~~~~}{|zөѣϸк·pkm}~}||~wzx{|}~vorx{zxxzxxzxx}{{ywwvttyww{yyxvvwuuvttsqqussmkkhffjhhjgimjlolnliklikhgiihjkjledfsrtqprrqsqprutvrqsrprtsuwvxxwyyxzyxzvvv{{{y{{y~}~~zqyv|yzxz|t||w~~|||~~z~~uyz{~{vz{|~z}~{}»ȡ~}xywvwu}~|z{ywxvwutzvu{z{z}yx{vuzvuyus|wv{vuzutzut{vu|wvzutzutzutzutzutuvtuvtuvtuvtuvt|xwzutupoytszutwsrvtsvtsusrusrusrsonsonrnmuqptpotqitrhtpfvpcyrc|vi{xptqivrjvskvtlqlkqlkwrqupotontpoqmluqpvrquqpxtszutvrptonxsr{vuvqptonxsrzut|wvupouposnmjedwrqyts}xwytszvt|wv|wv|wtvqnqmhtqivskzyuz{ytusstrstrxyw{z{z|{wsrvrq|||{zy}{z~|{~}}~||}{~|{پɰپɰԹİ|{}|y{}z|~|}~xz|{~{~zsv~wzzxxzxxzxx}{{ywwvttyww{yyxvvwuuvttqoorpp{yy|zzrppifhifhjgiliklikhgiihjlkmtrtonpsrtwvxyxzyxzutvtsuvvx~}}|~srt}|~xxx{}}z}}uzypvuotsxx|v|pxt|wytzuzmsxpxxw~~zt~~xqxxz~w||~vxy{y~}zz~~z||{~lsp~|~~zzz||||}{{~~}~|}{{|z}~|z{y}|wsr~yx~yx{z|{~yx|wvxsrzut{vuzutytswrqzutzutzutzutzutuvtuvtuvtuvtuvtwsrvqptonytszutwsrvtsvtsusrusrusrtpouqpvrquqptposojrpfsndvpe{sfwqfwtlsphurjvskwtlrmlrnlqlktonsnmuqpqmlvrquqpplktpovqpvppqlkupowrquposnmxsrzutrmlsnmvrpvqpxsrwrqwrqxsrwrqyts|wv{vu|wv{x~{}yw~zz|zz{ystropnuvtuqp~}|xwzvu|{wut~~}|z{y~ҺҨ־ͳwyzy}~|~~|y|~wzxqt|}vy}vyz}|ux{yy{yy{yy{yyzxxywwzxxxvvxvvwuuvttvttusswuutrrtrrkhjkhjkhjjgijgikjllkmnlnnmoutvutvtrt{z||{}rqsutvwvxsrtutv{z|vuwuwwxzzw|{syxqyxw}|y{v}yqx}~x{xvxr~~s~~{~z~}|~lno|zz~y~}||x|}~|~~q}z}qqq}}}~}՟}}~}}{z~}svtpsq}~|}~||}{z{y||z}~|zxwzvv{z{wv|xw}yxzvuvqpupotonqlkwrqxsr{vuxsrzutzutzutzutvwuuvttusuvtuvtvrqwrqwrq{vu{vuwsrxvuusrusrusrusrwsrwsrvrrwsrtposojrogsneuodwoauod{xpwtlvskwtlxumvqpupotonvqpvqpqmlsontpouqpokjrnmzyvqptonupowrqtontonupoxsrwrqxsrxsrxsrupotpnsnmytsupoyts|wv}xw|vw{vuzur}yt~zv|zx{|z|}{vwu{|z|}{}||{}yx}yx{z~}~ywv{yx~~}~~~sqp~~~}´ػֺϬ~~}{~}{~x|~wzy|{yy|zz}}|zzzxx{yy~||{yyxvvvttwuuvttvttwuuwuuwuumjlmjlmjllhjnlnonpqprpoqrqsvuwsrttsuvuwwvxutvtrttsurqstsuxwyvuwxzzx}|v|{w|{t|{u}|z~x}nx{zy{yyyt~~w{tyz~z|}uwx|x|}z~|}|~}t|||{}{~}|}{qtr~~|~}yzxz|z}~||zy~}zxw{zy|zyyxwxvu~yx{z|{{z|wvytszutzutzutzutzutvwuuvttusuvtuvtzvu{vu{vu{vu{vuwsrxvuusrusrusrusrxtrxtrxtrvrqvrrupltokunhvofxofvpenkcoldvtlwtlxtlvrpvpptpnvqptpnsonuqpuqpuqpqmlsonqlkojitonupoxsrpkjtonvrpzutxsrxtrxtrxtrxrrrmlxsrzutxsryts|wv}xw|vw|vxztt{vs|ys|zy{|z|}{vwuz{yz{y|{|{~zx~zz|z}}~}~|}~|~~~rsq~׫ȮڸŧΫ~~~}{~z}~}{~|x{~wz{yy}}|zz|zz~||{yyxvvzxxxvvvttwuuvttvttvttvttvttolnolnolnnkmroqnmo}|~poqsrtutvmlnrqsutvsrttsurqswvxvuwyxz{z|}|~y{{z~y~}~|x|zz~s}v{{yzw{~{~{~~}|~~~y{|~z~~~v~}xwytno}~~}vwuwxv}~|yzxyzx}|~|{|zy|zyywvxvuzy|wvytswrq{vu|wvzutzutzutzutzutvwuuvttusuvtuvtxtsytsyts{vu{vuwsrxvuusrusrusrusrxtrxtrxtrzvuyutupmuqluohzsj|shztipmegd\xtlwtlvtlwrqvqpvppvqptpnwsruqpuqpuqpuqpuqpupoytsvqpxsrzutrmlupoxsrzutzutzttzttzttytsqlkzut|wvxsryts|wv}xw|ux~xzytszur{vt|zy{|z|}{xyw{|zz{y||||~zz{z|{}}~~|}{|}{~~~~}Ϯ؏ɺ¾yz~}}z|}{~~}{~||}y|~wz~||}{{vtt|zz~||zxxwuuywwxvvvttwuuxvvxvvvttvttvttnkmmkmnkmnkmqnprprutvlkmqprtsuhgitsuooqwvwtuvwvywwxxwz{{|vwy||~vyyz~zzzw}uwxx{ut{y~}|}{~|~{}~wyzz|}~~x}~|~y}~|z}|z~~ǭwrs{~|}}{yzxz{yxyw~|{zy}||{}zy|zyzxw|xw}xw|xwytszy{z|wvzut{vuzutzutvwuuvttusuvtrsqyttzutzut{vu{vuwsrxvuusrusrusrusrwsrvrrvrqxtsuqpvrovrmvqkzsm|tkztkokeolexunwtmvslxsrwrqvqprnlvqpyutwsrvrquqpwsruqptonytswrqxsr{vuwrqxsryts|wvzvtzutzutzutytssnmxts|wvzutxts|wv|xw}vxz{xrt{ws|xt|zy{|z|}{|}{}~|}~|}|}|{z|{}|}}~~~|}~|~~~~~}ȼzƱέrlm}~~}{~|uxx{z}||z}y|{~}}}}|zz{yyxvv{yyywwxvvvttwuuyvvyvvvrsvrsvrsqlntnpqlnvprtoquprvrtuqssrtoqrsuvosrlpqxzy|stzqvzow|py|gtsvyyxzxzxv{~z}|~|~y{|{}~~~|v{zpvtx~}~{z|~~ywtnlkzxx}{{|}ztu|}z~|uywwywz|zxzx~yzx{}{z{y{{yzzxyywyyxzzx|zy}xw{vuytszut{vursqvvtxywvwuwwvutsuusvutwvuxxvvtstrqtrqusrsqpuqpvrqxtsvrqvrqvsrvtqvtqwurvtqurpwtqyusuqotpnsomurpsontonzqqwnnwqptonxrqtonwrqxsrvqpxsrzutzutzutwrqxsr{zytszvt~vvzrr{vuuqpurqsqpzyxwwuxxvyywzzy{{yzzxxxv{{y{zy|}{|}{|}{{|z~xyw~|{~|{~|{}{z}|~|{~{z~~}~xyw˲ε~||~~wz|}|{~{~{~{~{~{~{~z}y|~yz~yz|}zuvwrszxxywwzxxxvvvttytu~tv|rtyzuwzprnkmolnsprtrtroqvqswrtonpsrtxyzuxyotujopx}ptyru}rxpz~r{~lzym{zpz}wo~ml~p}{xu~|yy{}~~xz{xz{z|}~~}~}|~}suv|~}z{ypokusryww~~~||xyw}~|}|}}~z}{yzx|}{{|zyzxz{yyzxxywz{y{|z~|{}xw{vu~yx|wvzutwxvqrptusvwu~}wxvtustusuvtvwuwxvvtstrqtrqusrsqpsontpptpoxtsyutusrusrusrvtrusrtrryutvrrtpptpotpnsontpnwrqxppzppzrrvqpytsxsrzutwrqtonzvtzutzutzutxsrxsr~yxytszut|ttzrrzutvrqtrqtrquvtvwutusxyw|}{z{y|}{{|zz{y}~|zzx|}{~}~|~}~}~||~||~||~|z~}~}|~~}}|~ǴŵòȤɳ{|{tw}|{~{~{~{~|~|~{~z}y|~yz~xzz||vxzuvywwywwywwxvvvttytutv}rttikxmosud`burttqsurtqnproqspronprtutxylpqhppjqtsy~ntxrx~syr{r{tp~}q~n|~ixzsqply{p{}r{~w~t{~r|t|zx{}|~~~~}{~~vxxwzzmop{}~~}{}~~}{|z{|zz{y{xuwՖǬz{y~}|}{~|z}{z}{y|zyzxyzxvwuyzxz{yyzxxywvwuwxvzxw}xw{vuvqpxsrzutwxvijhrsqxyw{|zwxvuvtuvtuvtvwuwxvvtstrqtrqusrsqpsonsonrnmvrryutusrusrusrtrrusrvtrxtstpptpntpotppsontpnwrqvnn|rryqqtpnxrrytszutxtrupo|wvzutzutzutytsxsr}xwxsrytszrrzrrxsrvrrrpousrtusvxvvwuvwuvwuz{yqrpghfz{yyzxxywxywwxv|}{~~|~|}|~||~~~~|ݰʾƾƻѧ{|wx|}|{~{~{~{~||{~z}y|~yz|xx}xy|wx{vw|zz|zz|zzxvvvttytu}uv{st~wwzrstlmedfpoqqprpprlkmnkmqoqpqrqsttxypuv[dgluxisvs{pwtys{r{yzxx{vxptwxv}w{~{{uz}vy}}|~xz{}{}~|{}~|||mop~uwx|~|~~~~~}xwy~|~vuwuwxz|}prsrtuuwx{}~~xzztvvy{||~~tso~~|}{~x{yy|z{~|~}yzx{|z}~|yzxz{yyzxxywwxvyzx|zx}xw{vu{vuzutytsjkiwxvz{yz{yxywuvtstruvtvwuwxvvtstrqvtrwutsqpvrqvrqrnmtppwsrvtsusrusrtrqusrusrtpornmsontpouqpvrpsontonumm}ssvnnrnlvppvqpzutzutwrq|wvzutzutzutzttxsr|wvxrrytszrr{ssxsrxtsqonvtswxvwxvvxvyzx}~|xyw|}{}~|z{y|}{yzx|}{~}}~|tus~}~}~}}|~str~}}~|sssƲѿ̰ƽ²~|||}|{~{~{~{~}}{~z}y|z{|wx|xxzuvzuvywwxvvywwxvvvttytu}uv{stwopwopwopigiljmjikomppnpmlntsusuvtxyv{|u}}rvr|u~u~x~pwp|usml~zm{}sktwry|otwqvynsvv{~suzyz~wx|vxyxz{xz{xz{tvwuwxwvxxwypoqvuwiiixxx}}}{||nnnvxy|~y{||~|~z|}suvkmnwvxwvxzy{z|}zy{{yy~||~~nll|zyyzx|}z}{hki}~z}{uxvwzx~}{|zghf~~}z{yxyw{|zzzx}{z|{|{rmlvqp{vuvwuijhwxvwxvpqostryzxwxvxywzxwsqpljiqonwutsonjfesontpo{wvljirpotrqrpnvts{yxuqprnntpovrquqpwsrrnmupowoozppummqlktontonvqpxsrwrqytszutzutzutzut{vuwrqwrqzutwooyqq{vunjiqon|zyyzxxywvwuxywxyw|}{{|zwxv{|zz{y|}{}~|yzx}{z~xzx}~|rtt{wvݽѾɽ¹޿ի}~~{~{~{~z}||{~z}}xyzuv|xx~yz}xy{yy|zzxvvxvvusszvw}wxztuxrsxrsxrscefiklkmnrtugijlkmkmnfjkjnomrslvvhtxjvzozS^fdnxnr}kr{eltlx{htxcrtjy{xuoz|vjrvnxzuz}ty|ruyqwzy|x{~~}y{|{}~|~}|~}{{{}~~~|~~}~|}}}}}}䚗twu{~||~uxvtvtuxvz{y~}qrp~}|}{z|z|}{{|z~|{{zzytpnvqpxtr}~|tuslmkwxvwxvrtruvt}~|wxvttrtusxvvtrrywv|zyrpornmlhguqp{wv{wvnlkqonqonomlomlsqpuqptpnvrpuqpuqpvrrtpotpnxpp{qqvnnsnmvpptonvqpxsrwrqzttzutzutzut}xw}xwwrqxsrxtr{ssyqqzut{wv|zyzxwyzx~xywz{yz{y{|zxywwxvwxv}~|{|z}~|yzx}{z~|{~|~}~}|xw}|ĩֲí}|~~|{}{~z}|{~{~{~{~||{~z}z{}xy}xy{|~yz}{{xvvzxxxvvwuuxvv}wxztuyrtyrtyrt`bbacddfgpqrgijmopkmnimnkpqjrrmwwm|~uiv~lxeq{os~qww~o{p|q~q~tovyqwzv{~r{~xz{~x{z}|~{{}wyz}~}~~~{yy~~{}~~{}~z|}~}~}vtt~~ܒ{~|jmk~y|zy|ztuswxvz{y~}{|z|}{z|zzzx~|{|wv{vuvrpvqpvrpyzxtuspqowxvwxvtvtvvtz{yrsqopn[\Zwutvtszxwqonsqprnm[WVzvutpousrrporposqprposqpuqptpoxtstpotpovrpxtstonxpp|rrvnnwrqvrptonvqpxsrytszutzutzutzut{vu}xwytsytsxrrwwzrrvqpkgfnlk}{zvwu{|z|}{z{yz{yuvttusxyw}~|}~|~}{|z~zxw|zy~|{~|{~}~uuuͬОĭů{|~{~y|y|{~{~{~|}|{~z}z{~yz}xy{|z{}{{zxxywwxvvywwxvv|wxytuxttxttxttrvwkopjnomqruyztwwtvwx|}x}~qyyvl|rurrtyv{pwr}r~vv~x~uy}y{x{u|v||y|~z}z{~z|}z|}~~}~~}~}uss}{{Ľ㈅}}toq~}~ruswzx}~twu~}~{|z|}{xywz{yyzx{|zxywxyw{yxzvuzutxsruqptpowxvtusrsqwxvwxvwxvvwuwxvrsqZ[Ylmkvtswutusrqonpnmson_[Zwsrqmlwutpnmpnmsqptrqwutuqpvrqzvusontpouqpzvuvqpyqq{rrunnxsrwrqtonvqpxsrzutzut{utzutzutupo}xw}xwzutwrq{{{ssupo}yxwutusrz{yuvt~}|}{{|zwxv}~|}~|}~|~~~}{|zvts~}}|}|~}~~~}ؾĨӾݽũ}~||{~~{~{~{~|~|{~z}|wx~xyytu~yz}xy}{{|zzussxvv{yyxvv}wxytuztuytuxstfsu`moertfsuly{luxpwzrx|w~{ktwtr~mw{t|w~x|x|y}~z}yz~|~yz~vw{z}u{~y|{|x{yz{~xy}|{~~{z~~orv||~~xz{~|~~{~~~{z|qrruuu}wuu|}{wwu~}~~}~}||zz|zrsqz{y|}{{|z|}{uvtuwtyxwvvtwwuvvtuuswxvwxvvwustrstrpqowxv~|}{|}{z{yvtsusrusrtrqsqpwsrwsruqpwsrrnmtrqsqpsqpusrusrusrsonuqpxtsmihsonpkj~SNMvqpwrqvrqwsrvrqvrquqpwsrzvuxtstpovrqzvuxsrojirmlupormlyqqwooqlkokjywv|zyvwutvt{|z{|z{|zyzxvwuxywyzx{|z}~||}{~{~~}zz~}~|dzشԿƷ͹}~||{{}{}~}{}}}{||}{|z{~y{}xzxsuytvxsu|wyz|xsuytvxruwrtuttvttsqqyww~~ertdqsfsufsuivxluxnuxnuxkruqx{gpsr~p|~ovxnuxuz}ux|ux|tw{pswpswvw{{|stxtuyx{v{~z|}|x|xx~x|}~}|}|~{}~~~}}{}~y{|suu{xzyyy~}{z~~vttzxw|xwz{y~~}{|zvwuz{y|}{{|z|}{tvtyzx|}{|}{vwuz{y~}xywuvtstrtustusz{y|}{~rsquvtghfvtsusrusrusrusr{wvyutwsrvrqxttusrrppusrusrusrusruqpqmlxtsnjisonsnm|{kfevrpxrryutzvuyutvrqtpouqp|xwxtssonuqpzvu{vusnmsnmwrqtonzrryqqvqp}yx|zyxvuwxvuvt{|z}~|~wxvvwuxxvz{y~}wxvxywz{y|}{~~áɼݽŽɣ{|~y{|~}~|wy{}|}|}|}{|z{~y{{vx|wy}xzvqsxsu~y{|wyztvxsuvrtvttvttwuusqqljj`moboqdqsdqskxzluxnuxnuxry|sz}ksvjvxox{lsvotwty|ux|svzruyorvpswz{vw{tvzxy}y|v{~{|{{~z|v|v{~wz~~|}xy}~v{~wyzz|}|~~~{z|~xzz|||~º~~~|}~|~~|z{y{|zwxvz{y|}{{|zz{yuvtxywyzxzzxyzxyzxyzx{|zz{yyzxxywz{ywxv~}rsqxywyzxxywvtsusrusrusrusr|{{zzvu{ztporporpozxwusrusrusrwsryutxtrqmltpnrmltonojiwrqxtrwsrwsruqprnmqmlsonwsrvrqvrquqp}yx{zidcwrq|wvxsr|tt{ssxsrwsrywvwutxxvvwu{|z}~|~wxvxywwxv}~|||z}~|~~Ѻ۹ƛyst}~~~|}|}{|z{{}{vx}xz{vx{}vqs~y{~y{zuwxrtvprtrrtrrtrrussvttanp_lnjwygtvkxzluxpwzry|nuxry|nuxqz}lvynsvsx{vy}y|wz~tx|ux|tw{z{{|vw{yz~vy}wz~||}y~|}v{~v{~z}yz~{z~~~|}z}{y{|y{|~ppp~~}}|~}̶~}~|}~|yzx|}{vwu|}{}~|z{y{|z{|z}~|~}z{yyzxvwuwxvxywyzxxywzzx{|zxyw|}{|}{}~|~}xzxwxvrsqvtsusrusrvtswutyut}yxxttxtsa]\fdcjhgywvusrusrusrtposonxtssontpornlrmlwrqxsrytswsrwsrsonqmltpoyutzvuvrqyutwsr}||vvjedzyzutton~vv{ssvppxts{yx{yxxywvwu{|z{|z{|zxyw|}{z{y}~|}||wxv˼Ѿʹ˵íyz~z|}~~y{~}}~}~|}{|z{z|z|zuw}xz}ztv~y{zuw{vxwrttoqtrrtrrtrrtrrsqqanphuwly{huwhuwluxovypwzpwzlsvqx{ry|sz}puxwz~vz~wz~x{vy}vy}vy}wx|z{z{xx|vw{wy}vy}zy}|y~{{w{~w|z}zz~yx|{z~~~z|{}~z|}yyy|~}~~}zy{~}vts{yx~xyw~~~{|z|}{vwuz{y|}{{|z|}{{|zwxvwxvwxvwxvxywwxvwxvxywz{yxywxywwxvxywz{y{|zzxwtrrusrtrqvtswsr{wvwsr|xwwsrpnmomlxvuusrusrusrokjyutnjirnmuqptonxsr{vuytszttwsrwsrwsrtposonsonsonxtr{z}yxyutzut|wv|wvvqpvqp|ttxppupovrq|zy}{zyzxyzxz{yz{yz{y{|zz{yz{y~}{|zyzx~}~~~~|vwȼؽǷϺƬ~y{}~|~z|{}~~}~z{z{{}z|~y{|wyzuw{vxz|ytv{vxxsuwrttrrtrrtrrtrrtrranpcprdqserthvxktwovyry|nuxhorkrupwzrwzorvux|xy}x{ux|vy}vx|vx|wx|z{z{zz~xz~{|yz~}x~~w|}||x}{~|}}|}|}~|~{}~}xz{~}|{}|{}~{}~z|}tvv|~~~}а|}yzx~~}xyw~}|}{|}{~{|z|}{~}|~|{|zyzxstrqrpstrxywstrwxvz{ywxvzzxwxvvxvvwutuswxvyzxxvutrqvtrtrrwutvrqxtsokjwsrxtssqprpoxvutrrusrvtrrnmwsrqmlqmlplkupoxrrztt{vuzutwsrwsrwsrrnnrnnrnnvrqyutyutyutzvuzut{vu|wvxrrvqpyqqwooupovrq{yx}{zyzxyzxz{yz{yz{yz{y~|}{z{yz{yz{yyzx~}yzxpkj{yx}~~v{yuzx}|xwøǕ͙suv|~|~wtv}}z||~z|{}~~}~z{z{z|z|~z|~y{}xz{}z|xsuytvvqsvqstrrtrrtrrtrrtrr`mo`mo`modprgtvjsvntxpwznuxhorkruotwkpssvzz{yz~vy}ux|ux|tx|tx|wx|z{z{{|z{{|zz~~z~y~}zux|qvywz~~}wvz~{|}{}~~|~}|~~~y{|xwy}{|}rpoũ㦤~~}~~{|zwxvnomlmkhigtvtz{y|~|{|zz{yvwustruvtyzxz{ystrvxvyzxz{yuvtopnopnqrpstrxvuusrvtsvtrxvtxttrnm|xwzvuzvuvtstrqusrtrpusrvttrnmxttrnmvrqwsrvppwrqxtr{vuytswsrwsrwsrrnnrnnrnnvrqzvuwsrxtszvuzut{vu|wvxtrupoxppwooxsryutywv}{zz{yz{yz{yz{yz{yfge}~|z{y|}{~}wxvz{y~}{~|~}z{yz}{~w}{~~}|}xyʳӯɽŰ|wt~|y{|~~|~z|{}~~}~z{z{~z|z|z||wy{vxxsuzuwzuw{vxxsuxsutrrtrrtrrtrrtrr_mn`mo`nocprdqsluwkrujpthorelpjqtsx{mruux|yz~uuyqtxy|sw{tw{tw{wx|z{z{zzyz~z{{{~z}w|{{}w{wy}|}~}|}z{z~|~~~yx~}onp~Ж|}{~}~|xywvwupqo~}~}xywrsq||z{|z}~||}{~}{|zxywrsqstrtusvwuxyw{|zz{yxywvwutusqsq{yxxvvwutvtsxvu{wvrnmwsrxtsyutvtssqpqonsqpusrwutrnm{wvtpotposonvqpwrqxsrytsupowsrwsrwsrtpnsonsonuqpyutzvtzvtzvuzut{vu|wvytsupoxrqyrq|wvxutxvu||z{|z{|zz{yz{y{{yxywyzxy{y|~||}{|{zupo|{}}~y~sxv|}{ʟά᯵~{}~~}~~~}|~z|{}~}~~z{z{~y{z|{}~y{|wz|wyzuwzuwytvvqtvrttrrtrrtrrtrrtrrgjngjnjnqjmqnrulovlpvjmumpwknvptylqtlqtuz}rvzrwzy{{}y{|z|}vxxwyz}y{|wyzvxx|~{z|||}yyz|z|zz|zy{~}~{|z{~|~}xz{~||ywwʊ¾~z{y~}~~~}}~|~~{|zrsqxywxywwxv{|zz{y|}{}~|yzxz{yxyw|zyzxwxvu{yxxvuywvwutywvtrqzwv~zxwzxwzxwxvuywvzvuxtsvrqxtsxttwrrupprnmsonsonsontrqsqpvppytskbbvqpwrqwrqtonxsrtpoxtswsrtpouqpvrqwsryut|xwzvu|xw{yx|yxzxwspoonmutsuwuuwutvtwywvxv{|zyzxywv|xx|wv~|{}|~|{~|{|yx}~|~}~|~}}|}|~~IJѺũƻμ}~}xz}}z{z{z{~z{~~}}}{{{{{{|{{{|{|{|}xy|}z{{|}xyytuvqrupqurtwtvurturturtgjngjnjmqorvnptorxnpxijsnoxtv~nqvnqumptuw|suzsvzxz{|~y{|y{|y{|y{||~y{|y{|y{|wyz{z||{}~{z|}|~yxz~}~~}|}{|~xy}}~vw{uvz{|~yz~}z|}{}~}|~~~||̸xyw{|zrsq{|z~}|}{}~|{|z{|z{|zxywxyw{|z{|z~z|zz{y}{z{yxywv{yxxvu~|{{yxzxw|zy{yxsqpzxvxvtxvvzvuvrqwsrxtsxtsuqptpnrnmuqpuqpuqpsqpusrvrpxsrlddvrpsnmnih{vuupouqpsonvrqtpouqpvrqwsrzvtyutwsrxts}{z{yxxvvywvwutxywx{ywzxtwuxzxx{y{|zz{yywvzvu|wv{yx~}}|ywvxxv~~~~}x||~~ǹഽԯΰ~z|}~}}|~|}{|}~~~~}}}{{{|||z|z|z|}xy~{|{|~xzytuvrrvqrurturtvsuvsuvsugjngjnjmqbeimptmpuorwmquqtyy}tw|oswmptruyqtxsvzxz{y{|z||z|}prsy{|y{|wyzikl~z|}zz||{}~{z||{}xwy}|~~}{z||}z{rsw}~z{{|~~|{}~~}~yyy°zxx~~}{{|}{{|z~}{|z|}{{|zz|z~}z{yz{y}{zzxwywvvtssqp|zxxvuwutrpooml~~}usrywvwutxvuxtrvrqwsrxtsvrqtpnrnnrnmsonsonsonrppvtrwrqtonnffvqp{z|{tonytstpornmuqptpouqpvrqzvtzvuwsrvrqwsrsqpvtswut}{zpnmvwuuxvtwutwuz|z{~||}{{|z{yxzvu~xx}{z}|usr}{zvwu~}{|z~~~~ſ尹Ӵ˾லyz|}}~y{{}|~|~~~~|}}~}~wrsljj~~~{{{|||~zz~zz~zzzvvzuvvqr{vw~yzytuxrtxtturttrtusuusuusugjngjnjmqmptmptnntmmshhniioiioqqwrswoptttxstxvw{wyzwyzz|}y{|rtu~{}~z|}}yxz{z|~yxz}|~wyzuwx}x{{~y|{|yz~}~sssܜuvt~~|}{}~|{|zwxvpqoyzxz{yz{ywxvxywvwuzxwxvtvtsusrrpoxvuwutywvywvsqp~|{}|wutxvuvtswutvrquqpwsrxtsuqprnmrnmrnmuqpuqpuqprpovtszutrmlphhvrpxsrnihoji{vusonvrquqptpouqpvrq{wv{wvxtsvrqwsrywvywvzxw~|{dbawxvvxvsvttvt{~|}~}~|{|z~|{zvu{z{yxvtsusrrpo~|{uvt~mkj~}|}{}ѹ嵻کƟ|vw}~y{{}~y{z|~~~}~|}}~|}}~~~~{{{|||~yz~yz~yzxstzuv{vw|xx{vwytuxstzuvwrtuprvqrvqrvqrilphkogjnhkoknrklplmqmosoquuw{vw{qrvqrvstxtuyuvztvwy{|xz{z|}xz{|~wyztvwxwyzz|}|~suv{|~{}~z|}xz{ty|w|w|y~}~|~}|{}{}~{}~ߛ|~~{|z~}lnl{|z{|z|}{{|z|}{|}{{|zxywyzx{yxwutwutzxwusrywvvtstrqtrrzxw|zyzxw|zyywvwutsqptpovrqxtsvrruqpsontpouqpsontpouqpusrusridc{vutllwrq{vu~yxytsokjyutuqpsontpouqpxts}yxtpoxtswsrvtsywv{yxywv~}yzxvywuxvy|z~|}{~}zy}{zusr{yx{yx}~|}{z}|~~~z{yywv~|{z׳ƭòҕĈ|}~}}}~}~{{{{{{zzz|wx|wxz{xst|}~yz~yz~yzxstvqrwrsxqtvorunqunqunqhlphkohjnilpknrlmnnmoonppoqutvvuwsrvsrvutxvuywvzwyz}uwx|~}bdeY[\eghjlm~{z|~}}|~~}|{}vz{w{|fjkptux|}ty||uy|zx}y~}~|~}~}~~}|||š໾Øʡ}~|~}~~|~}}~|{|z{|z{|z|}{|}{||zyzxyzx{yxzxw}{z}|zxwzxvvtsvttzxwywv{yx~|{|zyywv~}|zyxtstppuqpuqptpornmsonsonsontpouqptrptrqlgfwrqwootonupovqpvqp}|qmlxtstposontpouqpwsrzvtwsryutyutwutywvywvywvwutz{yx{yvywtwu|}{}~|~}zyljirpo{yx{yx~}}~|~~~~ӻõ٣~|}|zz}}}|||zzz{{{|wx|wxz{zuvz{~yz~yz~yzvrrwrswrsxrtvorwqtwqtwqthjnhkohlpknrknrmlnnmoonpsrtutvutvsrvsrvutxvuywvzwyz{}~suv|~z|}Ȳ~xwy~}jikmlnuyz{px{zwv}y~{|xy}|~}~~~}rqsҔ|zzxvv~~vv|~yzx~{|z~}~}wxv{|z{|z{|z|}{|}{|}{z{yz{y|zx|zy}|~|{ywvzxwxvuxvvxvu{yx~|{zxw{yxusr|zyyutsonuqpuqpvrqtposonsonsontpouqpqontrpupoupotllupovqpwrqytsytstpnwsrtposontpouqpuqpvrq{wv{wv}yx{yxywvywvxvu{yxz{yx{yz}{psquxv|}{{|z~|{xtryts{yx}|}|}||zy}~|~}~}~|}{|{|~̳д˺ĶŮ|}}z|{}~{{{|wx|wxz{~yzz{~yz~yz~yzupqxrtvqr{ruzqtzqtzqtzqthlphkohlplnsknrllnnmoonponpqoqpoqsrvsrvutxvtywvzwyz{}~y{|wxyשqprw|}{rx|v|x~|}~|~}|~~}~~}}|~]\^wvxˊ̣~pnn~~}~{|z{|z{|z|}{|}{}~|z{yz{y|zy{yx~|z}|{yx{xxxxv{yxigf~~{yxzxvvtstrqusrxtssonxtrwsrxtsxsrvrquqpsontpouqppnmsqpwrqsnmyqqtonytszvt}xwwrqvrqvsrtporontpouqpuqprnm~zyzwv{z|zyzwvwutyvu{yx{|zz}{||y|zjmj}~zzxzzxqon~}xvu}|~}~}{yxz{y~~~pusžȯѻƿԹùô~yz}{zurr{}}}~~~yxx}~~~}}{wx|wx~{{{|}zz~yz}zz~yzsnoxstvqr{ruzruypsxpsyps_ggellhppjpphqpjmnkmnkmnmoplnokmnrtuprssvvxz{twwz~txzy}~|mqr^cdpuvpuv~mqrglmz~}qutv{zqtuy|}}}~}~}~|}{}~}~tvw~xwy}|~||ϔ~~ghf~|}{yzxyzx|}{z{y}~|z{y{|z}{z|zy{yx{yxxzxsvtwywx{yy{yvxvywvywvusrvtttrq{wvxtsyutuqp~zyyxwtrqsqprqptrqvtsuqprmlplkplkvrqvqprml}xwvqpwrqigffgeonmpqoqpoqontpoxtswvutvszyxzy}xw{vu{vu}xx}|||zzxwutsa_^}yx{wv|{~zy~zy~zy~}yyw|}{{|z~{zy{{y~}}}{űιôİ}xz~}~|}|}|}}~}~{|~z{{|{|{|zzz{zzzzz|{{yyy{y|yxzzxxyxxyut{vtyttvqrsnosnosnojssiqqgoofnnhppimnkmnkmnlnplnolnnprs{}~uwxxz{z|}w{|swxostlpqvyzeijosttxynsrdihx}|uz{z|}|~~|~~}~~|~{}~xz{~~wyz}uww|~~~~|{}zy{}}~~~~~~ɵ‘vttvvvpqo~|}{{|z~{|z{|z~{|z~~}~|{zxwwut{yxwutuvtsvtvywx{yxzxwzxywvywvxvuywvywv{wvyut{wvxts|xw|zyxvuusrrposqpsqpvrqwsrwsrsontposnmqlkytstontonljijjhnnlpqopqorposonzvtxvu{|zwxv~xx|wv{vu|wvzy{zzxwwutzxwusrxtsyut{z{z{z}|z{yyzx{|z}~|}~~¶Ěݾ˻δ~{}~}~|}|}|}{|{|{|{|{|{|zzzzzzzzz{{{zzzzy}yxzzxxywwyut{vszuvxstrmnrmnrmnejkdijdhjjnplqrjmnkmnkmnlnnlnolnpnpqxz{npqy{|wyzptuswxswx}|Ǝqvuv{z}}~z{yz~|}xz{|~y{|~}~|}~{}~~uwx{}~{}~~~~~z|}{}}{}}|zzի~}~|tus~}}~|}~|z{yz{yxyw|}{~}{|zywvywvywv|zyxvustrsvtsvtuxvx{yuxv{yx{yx{yxwutywv{wv}yx{wvzvu~zxzxw{yxywvusrsqpqonvrryutzvuuqpvrqsnmqlkupotontonnlllljlnllmklmkomltpp{wvwuttus|wv|vv{vu|wv~xx}|}{z{yx~|{zxwusrwsr{z}yx|{vrq{z|{}|}|z{y{|zyzxyzx~}z~x||ҙȾȼɩɪzuv~~{}~~{}}~~|}{|{|{|{|{|{|||||||||||||{{{zy}yxzzxxywwyut{vs{uvystyrsyrsyrsdijglmjopinpinpkmnkmnkmnkmnlnomopsuvmopwyzgij_abswxrvwuyzy}~w{|jklε|y{|~}~{|}~}~~|}{|~}~}|~xz{~utv}}}}Ʒ~||{|z~|}{|}{z{y|~|yzxyzx{yxwuttrq|zy|zytussvtnqoqtruxvsvt|zy|zy{yxsqprpo{wv{z}yxzvu~zyusrzxw{yxywvusrrpowsrvrqplkpljuqpsnmsnmvqpupoupopnmnomlmkyzxyzx{yxvrqyutwutqrp{vu{vu{vuyts|wv{z~|{~|{{yxwutqml~zy~zy~zzxtr~}~~|{z{y|˾˧׽ȽϮ̮|~upr~~qnp|~~}~~|}{|{|{|{|{|||||||||||||{{{zy}yxzzxxywwyut{vsystwqrtnotnptnpfjlkopkopjnohlmjlmlnojlmjlmjlmmoptvwy{|lprtxyhlmhlmz|}y||y{|{zxx~z|}z|}}{|z{hjkz||~~}~{|}~~~{}~}|~~}zy{~~~||~~ɰzxwzxx~||}~|{|z{|z}~|}~||}{}~|{|zyzx{yx{yx~|{~|{ywvtusx{yorpruswzxqtr}{zzxwywvxvuywv{z}yxzvuuqppnmxvuzxw{yxywvwutwsrxtskgflhgqml}xwfa`e`_tontonqonmnlnomnommnlhfe{wv{wvwutprpwrqzutytswrqsnm~zy{yxzxw{yx}{z{yx|{{z|{|z}yxson~}}|yzxyzx{|z~|{z~y}|˭ɶʳķĶ´|~}~~~~z|}z|{xz}~{}}~~yz|}{|z|{||}~yz{|~~~|||{{{zy}wvx|zzwuuxts{vs~vw|tuyqrvnnvnnhjkeghjlmlnojlmjlmjlmkmnlnnkmnmopuwxy{|xz{Ɲptuquvvwxutvsrtputinm~}~}z|}}{|z{{|{}~tvw|~~~~|~~}|~~}~~ywwxvv|}Dzžrpp}}|zzЋ~}uvtuvt~|}{|~|{|zzzx}{z}{z}|~|{zxwnomx{ysvtrus{~|{~|~}xvuywvywv{yx~zy}yxzvuxttzxwywvzxwzxvxvuwutwsrxtssonrnmplkytsupovqpupotonrpnnomopnpqo{|zwsrsonzxw~pqovqpzut{vu{z}xw~zy|zy|zy~|{}|}{z|{|{{z~zy{z~zy~~}~|}{~}|zy}}~ɿȳǻüįǶŮĮővqs}~~~}}~|~z|}|~}z|}~z{|}{|z{{|~|}{||wxxxx}}}tttzzz}|xvxywwwuuxts{vs}uvzrssklphiphilnoeghlnolnojlmjlmjlmmopnpqlnnmopoqruwxnpqfhiSUVOSTRVWhlmptuw{|jik|rvv{}~~z|}xy}~stx|}uwx~{|z{~{}~{}~|~{}~~}{z|}|~~||ºʛyww¢~}~}{|zz{ywxvz{y{|z||z{|zz|zzxwzxw}{z~|{|zyjkiz~|wzxvywwzxuxv|zyzxwwutusrwut{wv|xwzvu{wv{yx~xvuxvtwutwsrvrqnjivrqplktontonrmlsnmtonrponpnpqotusrsqusr{wvuqp}{zvwuz{yxrrzutzut|{zy~zy|zy|zy~|{}|}{z|{|{}|~zyzvu{z}yx{yx~~}z{yyzx|zy~y}v||ʽƶŮø}{}|wyspr~{}|~~}~~~|}z{|}|||{{{yyymmmzzz}|xvxywwwuuxts{vs{oqxz}z|{}jlmfhijlmlnojlmkmnhjjnpqnpqlnolnoknovyz|}~tvwmopptuilmimnsvwz~uzymqpwzzkpqquvquvz|}}{}~}{~~|~xy}}~z}}z||}~}~}wuuqoo}}~~mnl}~|}}|~|~}z{ycdb}~|yzx{|z{|z{|z|zy|yx}|~|{|zyijh}~xzxwzxwzxwyw{yxywv{yxwutvtszvu|xw{wv}yx~}qpotrqmkjwutwutwutwsruqptpo}yxokjtnnuonwrqtonsonsqpopnpqonompqoxvuvrqhdc|{~~}{{yyutytsuqp~yx}xw}zy}{z~|{|zy}{z{yx|xw~yx~zy|{}yx|{zvu|}{}~|~~~{z~~zȷǹʭǤzz~y{~}}z|}~|}}~~yyz{|}{vwz{}||zyy|}|xxxzy}wvx|zzwuuxts{vttvzoqpegmbdmbdfhigijeghjlmhjkjmrjmqlotruylptptxfmmotuw{|suvwyzwv{yx|xx|wvzxx|Y[\uwxssuyxz|y{|{}~uw|yyv|yz~}}wx|~}|~}|~~}~zy{~~}}}}ȟwuz}~}|uvt}glj~|}|x}{z}{{~|~}{|z|~|wxvxywyzxyzxz{y{|z|}{|}{{|z{{y~}{zxw{{y{yxxvu{vuzvt|xwxtstpo{wv{wvwsrqml||sonpkjnjitpoxsruqpsqpsqpuposnmummxmmwmmummtporpopqomnlmnlpqonomsqp{vu{vu}|zy}xwwutyvuyxw|zxzxwwut{yx}{z}{z}||zyzxx}{z}{z}{z{z~}~~z{yy|zw~{վƦ¡ƫ~|~|~~z}~~}{}~}~~{}}}|~y|z|}z|zy{{z|{z~yxzywwywwzvuzuttwynq|qt|qu|quhjkiklgijjlmjlnnquorvmptqtxpswjorhppnstostprstvxwvzxvzxw{wvzyx|xz|}rtusuv|~}|~|{}y{|suvxzzy{|{}~svzx}w~t}t{~z{~~~zz~~|~~}y{|zy{yxz~|{}{yy}}zxx}{{~||zxx~}¨|}~}~~{|z}jomqvtrwu}w~{{~z|zx{y|}{~}|}{}~|~}|}{yzxyzx|}{~|}{{|z|zz~|{{yx|zy{yxxvuxttwsrvrqtpornmxts{wvzvtxts{zrnmqmlrnmtpowsrvrqtrqrpotpntnntllxllvlltlluqpsqppqonomnpnrsqtusywv}xw}xw}xw{vuzvtxvuywvzxvywv~}}{z~|{{yx~|{}|~|{{yx~|{~|{~|{{z}|y|zy~|ⴹЪ|}~}}~y{~}~~|~~z|{}}z|y|z|}z|zxzzz|zz~yxzzxxywwzvuzuttw}ru|rt|rt|rtmopnpqlnomoplnomptmptnqugjnmptjorkssnstlpqprssuvwvzvvzvuyxw{xw{tvwlno{}~~tsuxwyyxz|~~{}~{}~wz~y|w~s|u|vw{|}~~~~||~~}|~{z|}{{xvvxvvzxxz{~~|sxvv|z}w~{{~z|z{~||}{|}{|}{~}|}{{|z{|z}~|~}|}{{|z}|~|{}{z|zy{yxxvuwsrvrqvrqvrqokjxtsxtt{wv{wv|xvuqptpnuqptpotppvrqtrrrpntnnsnmtllxllvlltllmihkihpqonpnqrprsquvtwutsnmzut~yx|wvytsxvvzxvzxxwut~|{}||zy{yx|zy~}|zvu~}}||}z}{{~|ķՋŠ~|v}z|yv~|~yvx}~|~|~{}{}~}|~}|~{}{}z|y|z|}z|xxzzy{zx|yxzzxxywwzvuzut}rutw~rv~rv~rvbfgcghafgnrsimnilpehlnqu{~vy}mrukssotuquvtvwtvwwvzvuyutxxw{xw{uwxlnolnodfffhiqstxwy}|~vuwrqs{z|vxyy{|xz{|~z|}{~|zt}yz{}~}~}}}}~~~}|~ĩ|zz{vwÑuxv{~|~|{~{mrpsxv}{x}{z~|z}{}~|z{y~}xyw|}{~}~|{|z|}{{|z~}}{z}{z|zy{yxxvuxtswsr{wv{wvnjiyutwsrxtszvuxtsyutvrptpotposonwsrusrqonsnmrmlskkwkkukkskkokjljiopnopnrsqtusvwuusrvqp{vu{zzutywvzxw{yxxvu}{z}{z{yx~|{~~}okjzvu~zy~}zxw~΢Ʊv~PX{jfr}z|}wtvxz{}}|~~}}|~~|~|~y|z|}z|xwyyxzyx|yxz{yyywwzvuzutynqtw~sv~sv}ruglmfkl`efejkglmjmqknrmptnquhkokpsnvvqvwtxywyzrtutswsrvrquvuyxw{xz{y{|z|}vxyrtu|~}|~~}zy{zy{xwywyzy{|tvwvxy{}~z}x{v{~v}t}v}wx||}z{{||}}~}{~|{~z~~}~~{yy~~yww{y|z~{y~|{~|npn~}}~|{|z}~|z{y~{|z{|zz{y}~|~|{~|{~|{|zyywvwut{wv|xwwsruqpxts~njiyutyut~zyyutxtswsrqmlrnmtpovtspnmtonupophhuiivllummgcbjhgnpnpqoprpuvtuvtwutzvt{vu}||{}xw{yxwutzxw}{z|zyxvuwut|zy~|{~}~~}|~}~}~}}|{zz{y|}y|zstrx|zxvv¨İ~{|vwpkj~yz}}~{}~{}|~~z|}xzytv}vy~y{{xzzy{yxzzy}yxzzxxxvvyutytsux|qtuxynq{~glmglmejkbghjnonqumptlospswknrjorpxxtyztxyxz{uwxutxtswtswvuyxw{wyzz|}}{}~uwxz|}xwywvxvuwvuwxz{y{|vxxvxyxz{y|y|x}v}t}v}xy}|}{|tuy~~|~y|}|~zy{|{}~}}zxx}}}ȱ—|{~~{y~|{~|~}~}|~|z{y~}~~}z{y|}{}~|~|{}{z}{zzxxzxwxvu{wv|xwxtswsrvrp}yx|{vrrxttwsrxtszvuwsrtposonrnnwutrpoupoupomeevjjvllwooqmlpnmnomnomnommnlopnsqpwrq{vu}xw~yxywvywv|zy|zy|zy{yx{yx}{z~~~~}yx~}|~|}{~xxvuvt»dzɭȕƑǃ~}zw{|~yz|~}}}}}xz}~|~}~~{vxvqs}vy~xz|y{zy{yxzzz~yxzzxxxvvyutzttx{{psvyynq~sv`hhaiienmajibjjhkojmqnquknrnqupuxmuupuvrvwxz{uwxvvzvtxtswvuyxw{vxyxz||~{}~uwxwyzzy{}|~~}~}z|}xz|xz{|~vxyy|y|x}v}t}v}{|~}~|}}~~~}}|~~}|zz{yyhkiƷЪ{yy|{y~|{~||}|}{~~||}{}~|{|z}~|z{yyzx~|{ywvrpoxvv}{zywv{wv|xwyut{wvtpo~zztpowsruqpwsrzvvvrqtpornmrnmwutusrqlkojibZZxllyoowootpoqonnomnomnomnompqotrqwrq|wvupo}xw}xwwutywvywv}|}|}|~~~}|~|{~|xw~|{|}{gjh}~|str|zyܬtvx{xy~~zzwtv}{}}xtv~z|~{vx}xzvqsx{}xz~|~zy{yxz|z~zxzywwvttyutzvtvx~sv}ruvkntil`ghdjkkrrflmfmmlpslptlosmptpswotwlttotunrstvxsuvxw{wvzvuyvuyxw{vxywyzxz{wyzuwxvxy}|~~zy{{z||{}z|}xz{xz{~{}~z|y|y}w}u}w}|}}~|}}~yz~~}x|y{}|~Ƽ{|}{x}{y|z}}~||~|{}{~nom~}{|z|}{y{x~}|}{zvts~|{zxv{wv{wvzvu{zson~}}yxplkuqpzvuvrq{wvvrqvrqxtsyutusrusrvqp}xwwnnxllzooyqqtpotrqsrqqqooonprppqorpowrqytsupozy}xw}|{}{zyyw}|}|{~~~}|~|{{z}yx~|}{{~|y{y|}{y{y~~|{tpoɱȪijnob`wxzzururvqz{{|~~~wtv}~~ytv~~~|~{vx{vxy|}xz}{z|xwy}|zy{xvvvttyuu{vu}sv|qt}ruxmpujmfhilopknojmnknolqtelojpskruouxltumutmtrputsuutvvwvzvuyutxtswwvzzy{xwyyxzzy{{z|utvwvx{z|vuw{z|}|~|~{}~z|}y{||~~}~||~yy{zz|xxz{|}|}z{{|~|~|}yz~~~~z}~~vsu|||wuuvtt͠ƏŽ~{wv~ywv~|{|zy~|{|yy|zy|{xvu|zynlkqonzxwzxwzxwywvxwvusrzxw}|}yxvrqokjvrqokjyutwsrvrqvrqqmlxttwsruqpzvutpotpo|ttzrrwoovqptpouqpuposonronoqnwut|wv|wv~yx|wv}xwlompsqnpntwu}|}||{~}~~|{~}}yxxzw~}|~}||zz}¶~vzsiklllmmklsq{}|z|~~~~zuw~zuw|~}}z|~~|z|~{}}z||~|~~{}}xz|~ztvzuwvqtzvxutvwvxxwywvxrqsZ\]ikloqrjlnlnolqtkruipsqx{mtwmuuksrlrqpttrttsuuvvzvuyvtxvtxwvzxxzxvxyxz{z|}|~yxzxwyutvvuwxwy{z|{}~z|}z||}y{|~}~zy{}|~~|{}~~|}|}{||}~~||{}}{yymjl~~~ͼʺ{yx|}{}w|z~}~||~~~~|{~}~~}~}}{zxvuxvuywvxvuusrwuttrq{yx}{z|{sonrnmkgf~zyuqpvrqxtsyuttpovrrsonrnmyuttpouqp~uu|stxppvrpupoxppuposonvrqtrqwutzutzutxsrzvt|xvnqosvtlomorppnm|{}|{z~zy~}{z~z{y~mnlyzxĬЍwt{soqoqpqnqpq{uv}~~y{tqs~yxzz|~|~{}z|xsu|~~{}{}z|vrtzy{}z|sprytv~y{ytvytvuprzwyonpyxzutvqprtsulnomnohjkjlmlnnfknipsnuxnuxnuxrzznvuntsntrrttrttvtxvuyvvzxvzxw{vuwvvxyxzzxz~}}|~yxzyxz{z|yxz}|~{|~z||yz|z{|uvwqpr{z||{}~~}~z{yz~|}|}|}}~~~}|x|}wyz~zxz{z|~~Ž|}nsq~|{zvu~~~~}~~|zy~||xvu{yxywvzxwxvuxvutrq|zyqonplktpookjokjxtstpouqpvrrxtstpotpornmqmlxttuqpvrr{y{vuwrqwrqtonxppwootonqmlrpotqpzutzutwrqyts|vvuxvqtrjmkrus~}}|~}{z~zy}yx}yx{zyzx~sxvղ˴æªҵrszwtvsxrznsrt}}vpq|vw~~|~~{}pkm|~~y{}{}{}|~~|{}~~{}~{}{xzurt{}{vxwrtytvwrtxtvqprwvxrqsqprvuwehlilqilphkoilpgmpelolsvkrupwzpxxksrlrqnsrqssrttutxvuywvzyx|xw{utvvuwyxzwvx~}~|{}yxzzz|wvx|z|x|}w{|vz{vz{opq}|~|{}|{}zy{}|~}~}~}~}~|}}|}|~~}}}|||~Ƶɇ{|ќtyw|~}{wvoml}|~~~}~}~}~}~xvuywvywv}|~}|zyvtsvtszvusontpo~zywsruqptposonsonsontppsonxtsuqpxtsplkxsr{vuzrrvnnzppwoounntonxsrvrqxsrxsr{vu|wv{vuwzxwzxbectwu}|}||xwxtsxtszvu{z}|~zyzvubca~Ÿɯ}{tzmsjviydrsz{|vwztu{xzyvx|~|~}}~y{|~{vx}|~~~~~{}zy{vuw~{}~urtz|{vxytvz|tqs|{}tsurrtvuwvuwfjomqwafkfjogkpelognqkrury|nuxnvvpxwqwvmrqqsssuuxw{qpt{z~zy}zy}vuwvuwyxz{z|jikyxz{z|zy{zy{zy{tyzuz{v||v{|tvw|{}zy{|{}}|~|{}{||}wx|pqu}~}~z{~|~z~~~{}yvx}{xzzxx}{{~~~~yzx|«ŵljjtrqwut~}~}}{z{yx}|vtsywvvtsuqptposonzvuyutvrqvrqvrqrnmsontppvrqvrq{wvtpouqpvtsxtszut|rrxnnyoo{qqxpptonuqpwsrytsyts~yxrmlzutxzxrusmpn{~|}|~|{lhgzvu~zy}|}|~~wzx~{~Ŀ·ñƭȺ̨juiu]layRoTm}fu~|}}}|~z||~|~{}~}z|~y{{}tpr~z|~y{~{}zy{vuw}z|}|~|~zwyytv{}z||wyytvtprxwysrtutvrqsutvfjokotdhlgjohlpfmpelognqkrunuxpxxqyxrxwnrrqssrttvvzrquxw{rquutxvuwvuwyxz|{}zy{_^`jik{z||{}|{}{z|swxw|}x|~uz{}vxz|{}zz||{}|{}|{}{||}}|z~|~}|~yyy}}}~}—Ĵ}}x{y}}xvtywv~~~|{~|z|zy~|{~|{~}}|{yx{yxxvtxtruqptpnsonuqpvrqvrqvrquqpvrqvrqvrptppyutuqpuqpsurytt|wv}ss~rrsszmmxmmwnnvqpxrrytsvqp~yxupo|wvx{yqtrlnluxvx{y~|~}|{~~zy|{uvtwzxx{yʺ̳ŵDZäi|s`zTzGu{}~~xy}~~~~~{}z|~y{|wyzuwzuwytvytv|~~}}|~~|~}z|}xztoq|wy|wyzuwtqsvvxtsusrtqprvuwdjqflscjqekrfltflpelognqjqtry|t||t|{u{zntrqssrtttswwvz{z~rquwvzvuwvuwyxzpoq|{}xwy{z||{}~}zy{nwvv~v~~s{{v~~z|}|{}{z|||~zy{~}|}{|vw{wx|yz~|||}~~zy}|{}~y}~z~|~~}~{}~~~jmcfÝ{}}z}}~}~~|{{yx}{z}|~zxx~|{~|{~}~|{}|}{z|zyxvu{yx|zyxtsvrqtppsonuqpvrqvrqvrqwsrvrqvrquqprnnvrrvrqvrqtuswvtzy~ssstttznnxnnwppvqpvrpzttwrq~yxytszytwunqolomtwuz}{~~|{|{|{~zy~}ӻʰĴֲŢr|j`m`s~{|}xuwtsu~}|y{~}~}xzz||~}|~{}vqs|~|~|wymhjytv|wy~~|~{}|~|~~wrtvsuttvtsuyxztsutrtdjqcipekrflsgmtekpgnpksuhorqx{rz{pxwpvuotsqssqsstswsrvonrvuyxw{vuwvuwyxzonppoqvuwxwy}|~{z|}|~wvxmttzyx~w}~}|{}{z|~}yxz|}{|wx|yz~~|}|}}|{z~|{xw{yx|~}||~~~x|}~}vuw~|~~}}ptpsɺƛyzzsqqyzx{yx~|}{z~|{~|{~xvu}|}|{~}|~|{|zy|zy}{z{yxyutwsrxtsxtsxtsvrqvrqvrqvrquqpsontpoqmluqpvrqvrqrusywv}|ss~qq~rr}rr|rrzppxppvqp{vuzut~yx{vu}|vzxqtrtwuvywz|z|{}|}|}yx{zy{xuus~~}}άɧǫ}uurUIo\z}|z{zy{~y{|vx~}}xz}|~{}~|~{}}z|}~{}{xz{vx{vx}xzxsu{vxtprtrtususqsonprprcirfktejtgkucirbkpdmqiotjnsilrpuxglmkpqkopnpqsqtsrvrquvuyvuyxw{tuytuytuyvw{uv{tuyvyytvwtvwz}~z|}wz{wz{uxyz}~}xy}z{yz~yz~fgk|{~}|{|{yz~|}|}~}~{z~~}|zyz~|~{}~~z~{}~~}~}~~~~~{ȉĒՃsmnڠtus|}~~}|}||{{z~zy{z~}{z~zy}yx{wvxttc_^|xwxtswsrvrquqpvrquqptpoqmluqp~}~zyyutrrpprpvsrvrqxtswoo}uu{ssyqq{sszrryts}xw{zzut{vunnlqrp{|zwzxx}{}}{~|{~|{|{z{wv}|˵IJİ©Ī}qor[Chc||~zut}xz}|~}|~{}{}|wy{}~}xz{vx}xzvsu}~{}}~|~|z|zwyzuwxtvzuwwrtvqswrtwpsyruxruxruxrteoxdluaktowdnwblsbkoglqhmrmqvkpshmnmrsostrtuqtuwvzutxwvzposutxtuytuytuytvztvztvzlno{}~y{|wyzy{|vxyy{|{}~}z{tuywx|yz~yz~~{z~{z~{z~~}~zz~}~}~z|~|~~}|~~}|~wvx|}zy{zy{~|||~~~zzz{}~z|}||{}cdü|~|~|}{rwu~~}|~}~}|}|{z~zz~zx|xxxtsuqp~zy|xwxtrwsrvrqtposonrnmwsrrnm}yx{wvxtsopnnomusruqpsonvmnzrryqqyqq{sszrrytsxsrxsrzut|wvzxwxutxywx{yx}{||z~|{~}qon}|yut{|z~ӡޱŲhhmkRHt]{|wv~~{}{z~{}}xz|~{}}~}~y{~}~~{}|~tqs|~|y{xuwdacspr|y{|y{zwyvqsuprxsuxsuxsuxsuunqyruwpswpswpsYgo_jrdrzq|bqxerxmx|qz~fpslrwflpgpomrrswxquvqssvuyvuytswonrwvztuytuytuyttxttxttxz|}vxy|~y{|wyzprs{}~z|}y{|xy}rswstxuvzwx|}~~zz~~|{{z~|}xy}{|vw{xy}~~|{~}|}|~~~yxz}|~~}||{}~}|~|{}}|~vuw~~~~~~~rrrej}\`}otoxhuWcdjbbʩ}~{|}{~zykgf|{}||{{z}|~zx}yx|xw{wvxts|{~zy}yxxttxtrvrrtposonrnmxtsyutxtsvrqsonopnlmkusrtpoqmlqlksnmtpnwrqytsxsrytsvqpupo}xwzy}||zyzxw{}{z}{||z~{wv{|z}~|wxvjki~~֭´ƪѵìuogLQ{]zyzwy~z|~vrtwrt|~}{}z|{}}|wyz|xsu|wy}xrtxsusnpzwyyvx}z|~z|~{}|y{|y{yvx}z|zwy}}xz{vx|wyzuwxsuvnrxptsloslosloTfmYjqcu|gy^pwdsykw{[fjeptgptdmqkruhpssx{pswknspqupquklpklptuytuytuytuystxstxstxwyzprtwyz|~wyzsuvnpqikluwx}z{yz~vw{wx|vw{uvz~zy}|{{z~~}}~~}~wvz{z~|{~}lkm~~}~|wwwyyy|||mrfjbaadbi[`opzy̮|zztopɹtus}~{zea`~}{wv~~}~}~}|xw}yx|xw{wvwsrzvuzvu|xw}yxyutxtswsruqpuqptpo|xwvrrsonyut}yxqrpkljxvutpornnrmlqlkrmlwrqytsxsrzutxsrupo|{zy~zy}|~}||}{z}{}|}{zywv~}lhg~yzx赸צԮeutr~ufP~v~}}xw~{}~{}{xz}}}|~}|wyzuw}{}{vxuprrmo}~{}z|~{}}|~|~|~{xz~z|~{}}z|zwyupruprxsu}xz{vxytvvorvortmpslorknYkr[mtfxbt{Ugnxgrvbmqluyfoskotptyprxstxvvztuypquvvzvw{vw{ttxuvzuvzvw{wyz|~|~xz{uwxwyz}wyzuwx~}~{|xy}xy}~}xw{xx|zy}{z~|}}~{z~utxwvz~|{zy}{z~~|}|~}~}|~y{|}|~y}~~oooxxxnnn|||~|||~ls_dkdb\[Wfb}ywyʲ}~}|~zy{wv|xw~{z}|}|}yx}yx}yx}yxzvu~zy{wvyut|xw{wvxtsxtsvrpson|xwyut|{~zy{wvqrptustrqtpotpofbakgfwsrwsrxtryutzut~yx}xw|{zy}yx|xw~{z|}{}{zzxw~}{z}|~zy᮷ƺ̟v^rQiPmXy7Xsf{u|y||~{yy{z~~z|~y{z|{}zuwvsu}z||y{}}~{}~{}~{}roqurtsnptoqxsuytvytvwrtwpsrknb[^mfislo]ovary_qxdu|TfmATYQdgiz}l{~eptuoz~luyiotkotkotpswrvzruytw{mqutuystxstxpqustxwx|y{|uwxz|}}tvwy{|~}wyzvxywx|xy}xz~|}~}wvz|{}~{|}~~xw{{z~~{z~~|{|{~xwyz~z~~}~wvx~~}lllzzz}}}~yyy~~~~}u|gnhnkhkeb\jdr}â~~}}~|}|{wv~zx~}|{~}}|}|~zx~zx~zx}yxzvu|xw|xwzvu|xw{wvzvtxtsvrruqp|xwxtssonxtsxtsrsquvtvtruqpuqpkgfigfnlkwutusrvsrzutytszut}xw{znff_^]~|{|zy~}}|}||{rpoomlйĬ̟ü˟sznxw~oxlux{|wyz{~|~~|wy|~|~toq}xzwrt}~z|{}~~~y{}xzzuwxuw}z|{xz}z||y{~z|~z|~z|pmoxuw{}~y{{vxzuwzuwxsu|ux||zsvunqm|anv^ltht}pk~lcvyduxkz}jwzgqyjt|djqhnuknvqtxrtyorvux|orvvvzstxvw{nosnosuvzwyztvwuwx{}~qstwyzy{|z|}|~}vw{uvz|}wx|yz~}~~||{xw{~}}|~~~~}}|~|{~~~~z~|xwy~}~~}~~~xxxzzz{{{}}}|~{}~zzzzlw|lvXczcnag\alsr}Ypczϳ¶š~~}~zy~zy~~}|{}|}|~zz~zz~zz{zzvtyut}yx~zy|xw|xv{wvxtsxtrvrrzvvyutxtsvrqyutttruvtwutyutyutsonwut}{zywvxvuwut|vvton}xw}xw{z{z}||xw~}~}~}~}}|}|}|~}~zy~}trq㴽ư՚IJ{w{yvtxvsq|zvt~~}}~}xz~pkm~|~}}{}{}~~|~~|~~y{~y{|y{{xz{xz}z|{xz|z||z||z|urtwtv|~{vxlgiojlwrtzuwzsv~wzvorslozsvZfnhs{lxyht|atybwzi|^quk|]lpku|iszaiptztw~rx{otwinrnsvtz}xy}tuyz{uvzqrvxy}y{|uwxtvwz||uxxy{|x{|z}}|}z{}~~yz~xy}|}}|}|~~{|vw{}~{|}~~xw{~|~}~~~~|~}|~wvxoqruxy|~xxxvvvlll}xz{~~~~|||yt{mxYrQdRf\oWqʧʹ°Ƽ|{~}}|{z~}}|}|}|}|{z{z{z|{yutwsr{z|{|xw|xw|xwxtsxtsxtsytt{wvyut|{rmluvtxxvxvuyvuzvu{xwxvusqpsqpusrvsr~xx}xwzz{ztpo|zy~~}~|{~}qonʺĶ߶ƨ⑎|x}v|yzrnpq}~{|{|~x{~~{}{{y|~y{~{}{}~|~~y{}{}|~~y{{}~{}|wy}xz}z|yvx~{}~{}{xz|y{|y{|y{wtvyvxzuw|~{}{}}xzytv~wz~wztmpohkleh_pwev}fxYjq^ov_pzat~dwexi{bs{htzmw~mvzhorittluuhpouz{uzzoptvw{mnruvzstxwx|vw{xy}}~|}}~oz}s{~t|u{~z{|yz~xx|uvzyz~yz~z{yz~{|z{}~{|xy}}~}~jim{z~vuy~yxz~~}~}~}~}}|~}|~|z}}|~~}~{}~szz1K_9ZrCh;d|Fl_p{Ӱƞ~yz}||yx}|}|}|}|}|}|}||{~}|{{z}|yutzvuwsrzvu~zy~zy~zysonuqptpousrtsrwrq|wvxppyvuyutzxwxzxx{ywutytsxtsvrqwrqyut}yxrnm~zy|{~zy{{|wvxsrzxwrpo~~~|{~}~~Չӹزɒr}p~jzbikilq`n}z~}z{|~~wz|}|~}xzxtv{vx~~}xzz|ytvupr|~~y{ytv}xz|y{~}z|}z|}z|z|z|z|z|wrt~xy{uvyst{uv|uvxqr~uxypsyps}sv~crzbrygw~`pwgw~ct~Zjvbr~etfvkzkv~oyjsw_hkxlxxt}}lvvx}~zpqu|}klp~rswwx|xy}xy}z{{||}o{}r{~s|sz}x~|}xy}stxvw{yz~z{z{vw{wx|xy}}~z{{|z{z{stxuvz}~}~~}|{z|~|{}~|~xwy~}wvx|{}wvx~|~~fo}|FfzGqylsec۴˜~~~~|}|}|}|}|{z|z~zyokjwsr{wv{z~}vrpzvu|xvyuttpornmsonyutusrusrytszutummyvtxtt{yxz{ywxvrpotpovrqvrrxttyutvrq|{{wv}yx|{{sszy}xw}{z|zy|{~}~vrq~zy~~}|}mhivsuõ޼ɷǼϼм֊l~^sbv]nfpL^zYtv|}}}z|}xy|wy}~z{z|}~~~zwy{}|~~|~}}xz}xz~y{~z||wy~y{~{}}z|}z|}z|z|z|z|{vx|~|vw{uvystztu|vw{uvwzxoroehnehrilYio]lrSdiSbh^ntvrl|csbr~n}oztbmqktxpwznzzr~~nwwowww|}rtxstxpquuuynosxy}yy}z{}~o{}r{~s|ry|w|wx|{|}~|}xy}z{}~|}{|{||}uvz~~~~zy}~~~}~}{z|}|~|z|~}~}zy{vuw|{}~p}HoT>tYcZutػӟ~}~~}|}|}|}|~zy~zx{z}yx}yxzvuzvutpnzvuzvuwsruqpuqpnjizvuusrusrxsryts}uuzutwtr}|xwv{}{spovrqvrqwsr{wvxtsuqpokj|xw|xx~~vnn~{zzxw}{z~}|xw|{}|son~~}{|zuvtxywIJŠզyiOnWz\{Ʈw~yzytv|~}{}{z|}|~xuw~}~}|~}xz}xz{}}{}{}{xz|~}z|}z|}z|z|z|z|vqs~y{|vw|vw|vwztuystztuzsvzsv~x{y|qjmbou^jpYfl_kqcpwaowcr{fu~fu~et}l{gs~cnvhryalpu~up|~nz|mtwipsrvynquilpwz~ux|z}x{y|y|~o{}r{~s|t{~x|z{xy}stxvw{yz~yz~z{{|{|z{{|xy}z{yz~|}~|}~~~{z~|{~}~~}{z||{}{z|zy{}|~}|~|{}qpr{z|~|{}~}|~~}tpDoLJgbScjؼֱz~~}~|{~|~}|~}|}|~zy|xw~zy|xw}yx|xxzvuqmlzvuyut{wv~zyzvukgfwsrvtsusr{vuupozrrzutxsr}|zyxzxw{wvzvuyutwsr|xwxtszvuxts|{~zyc[[{z}xw}|ywv~}~}|}|~zy~zyzvu~}|ٹ¹ºՑɭ̈ow{wV\ie~zuw~}z|}xz~y{}|~|~z|~wrtz|{vx|wy}{}zwy|~}z|}z|}z|z|z|z|uprupryzyzyz{|{uv|vwzsvzrvtmpslounqeptdorfqumx|juyiwfw}du{eu|du{fw}mykxq|gpxq|lx|ss~wnw{zrwzmruv{~x}qwzv{~x}x~x}x}ts|r{~w~w|{|xy}xy}z{{|z{z{{|z{z{~}~~~}~|}{|z{~vuw~|{}}|~~}~}~}xwyxwy|{}~}{z|~}~kwonS6qc`_~‰⚬w|{{yyx}{vrqvrq|xw~~}}|qml~}~}{wvzvu|xw~zy}|~zyuqpuqpwsrzvv{wv|xwzvuwsrokjrnmrpovtsytsxsryqq~vvwrq|xw{yxyutxtswsryutyutyutzvu|{~}~}{z|zy{zzvuuqp{wv{zwsr|{wsr|~вǬ璬ibmf^]vX~wuu~||toqxsu}z|}~~{xz~~}{}ytv|~~{}~|~}z||y{~y{z|}|~z|yst{uvyz}wxztuxrszuwxsuwrtwrtvprPY]Zcgjrwenrhqulxjvhu}mz\iq]jrftm|epxjv|vl|~snz~p{ktxlrumrurvysx{w|rwztx{v{~v{~v{~v{~s~|ry|v{~xy}xy}uvzrswz{xy}z{z{wx|zz~|}~~|~wx|}~}~}|~xwypoq~}|~~}~{z|}|~||~zy{~~~}~}bzJn]`O_\fSs񞫸ɭuzy{xz~}~|struvt~usr~~~{z|xw|xv~}}|}|~zxvrqwsrxtt|xwzvu}yx~zyxttxts{z~|{{yxzut}xw||xx}uu~~{z|{zvvyutzvt{wv{wv{wv|{{z||~~}|{z}|~}}yx~~}yxinl~½ʸֲšꑩlZf^QKiy}}wrt~}xwy~}|~~}xzxsu}xz}xzwrtz|}|~~{}~y{z|z|~{}~{|}wx~xy}wxzuvxuwvsuvsuurttqsahkbikhnqdkncjmeqwetzjx~o}]lrvhvbp|Wcmlwtsvz}uw~ovyqx{krupwzqx{ry|ry|ry|q}t}s|yz|}~tuyvw{}~z{z{z{wx|zz~|}}~|~{||}~~~~}~}~|}vuw~wvxvuw{z|rqs}|~~}}|~|{}~~xwy|{}xwy{z||~j{Ke{ddyjWzZuezԿӢៜ|||{}~rtu~}|~}~}|{~zz~zx|{{z}yx|xxyutxtszvv~zzxts|xv}yxzvuyut{wvywvywv}xw~xxxxxxwwyz{z|z|xv}yx|xx{wv{wv{wv}yx}yx~zy|{}|~~~{wvson~zy~zy}yx||yut~~~ӻȣ˹ɮꎣhrjg[Pe~~}xz~{}~|~~z|}xz~y{}xzz|~z||~~{}}z||y{{}~y{|wyz|}xz~xy}wx}wx~xy}wx|wxxuwvsuqnppmooln_gicjm_fhcjmbjloznzmynziu{tk{jw^kt[fnp{m}fsxlx}fqwkv|jpuouypwzqwz{|sz}muvsz}sz|sz}juwGORmuxlruv|xz~y{}uvz{|{|yz~z{z{{|z{z{z{z{~{|~yz~}~{||}~}|}|}~~}~}~~~}|~|z}|{}~~{z|~}~}|~~}rqs{z|~}{z|~gs^qNiWvPsGgKg_rsԗɒ»~á~~}~}}yx~}{z{z||~{z~zy}zy~zy|xwzvuyut|xw}|yutzvuyutxtszvu{wv{yxywv}xv}xwxxvvvv}uuzy~zz|xw}yx{z}yx}yx}yx}|}zy|{~{z}}~~~}mih\XW}|{zyut}yxz{vpr̷зĺ˫lftka`Td~~{}~{}~y{|wypmozwy~zz|zwy~|~}xz{}|~xsu{}|~~}{}z|}~|~~{}|~~y{xtvz|}z|~xy|vw{uv{uvzuwxuwvsuxuwwtvvsudih`eemsrjooekjluxitxr}hswkvzlvzxvjt{lu~woxypyzgoqgpqkqxdltkt{s}{w{}hpojrqqyxu}|s{zswzx|{tv{{y{{zzz{yz}}~z|z|z{z{z{uvzvw{}~zz~|}z{}~}~~}~z{z{|}zz~{|}~~|}|}~{{{}}}|||yxz~~}xw{~}|{~~}|~{z|mlnrqs|~z|}|~}gpamWe_qk}`n[f|«ytu|{zjmkyzx}zy|{{~||{~~}{|z}}{{|z{zy|{{wvzvuzvuvrqxtsxtsxtsyutyutyut~zyyut{wvzvuyut|xv}wv|xw}xw~yx}|zxwyxw~|{ttrstrzzx}~|~~}|wwvŵŲźҹбz`uhmy\Mxr~|}}~{vw~ztv|wy|wy|wy}~~|~xuwwtv}{}}xz|~}~y{{}~z||wy{}z|||||{{z{z~~yyy|xw|zzuv~yz}xz~x|zwyyvxurturturtflkagfhnmion`fe`ileptgrvny}bmq^im`lnp|~alsgqxpywrzzmuunvv}q}ny}tx|rvwmutemlrzyzv~}ruysvzx{ptxorvrvwputuwwxzzzzz}}}{|{|z|z|z||}xy}z{|~}~}~}~|}yz~z{}~~{|{|{|~|}yz~y{||||zzz{z||{}~~||~~~||}{{zyz~~}poq~}|{}|{}~{z|}|~{z|~~}|{}~iqdobnYhVdivalitɶʵpswzzz{z|rpp|}{z~}|}{|}{{|zyutyutvrq~}xtsxttxttxttyutyutyutwsr|xv{wvzvu|vv|vv|vv~yxzy~~}|zywutvtswxv|}{|}{z{y~}~zxw|{qrpxyw~ɼv~k}XtBfQu9cRJkq~~~~ytu{vw~yzzuv~}xzwrt|wxz{~z|~{}z|}xz~xzz|}~z|{}}{}~xz{}{}|||{{{zzzzzzyyy}yx|xw|wx~yz|wyztxxvxxuwurturturt^dcjpobhgflkekjjru`imajnnw{hqugosktwr{~mt{]elqxyu}}pxxv~~u}}yks|kw}itxuz}x|}v|{cihz|v{zruysvzz|{~vy}{djiv{zxzzzzz}}}zz~zz~|||||||}|}}~|}|~}~}~wx|yz~xz~{|~xy}|}~zzzyyy}}}}}}yxz}|~~|~~~~~{yy~}wux~~}~}}|~}|~zy{rqs~{z|srtyxz~~}~}zyz~iqdkalUbZhdqgukxںnmr|zy~}||xw~~}}~||~|||z}yx{zuqp~xtszvtzvtzvtyutyutyutvrp|xx|xvzvv|vv|vv|vvyts{vu{yxvts{yx|zy|}{~|}{z{y}{z~|{}|~~|}{|zz~Ծϳɵɸv{|]q[vSlXtUsfzv}{vu~|wx{vw~}roq}z|}|~~{}{xznkmzwyzuw{}{}~y{zuw{}z|~y{{}~y{~y{~z|~y{{}|||{{{zzz}}}~~~|{zuvzuvxsuvpuvtvwtvurturturtcihfllcihbhgbhghorenrclp`imhqudmqmvyvjry}ovt||pxxs{{s{{owwow~bktiv|kw{u{~{jpo]cbtzytzyw}|tw{ux||{~vy}{{v|zxzz~~~wx|xy}|}|}|}hhl}~{|z{|}~rrvvw{}~wx||}vw{{|xy}z{~tvzvxy{{{zzz~}{z|~|~xwy~~wuu|zzqoovtttrrtttiiigggyyx~}}|~|{}}|~}|~~|{}tsu~}|~}|~~}~~lkm|{}{z|y{|y{|~~ybmfn^iWi`rgxUkmÿˉstrtrr~~~|}yx~~}|}{~}}~||}{{wv~zywsrzvuzvuzvuyutyutxts~zy|xw}yx{wvzvu|wv}xw}xwzut{vuzwv}yx}yx}yx~zyxut~z{y~}~~|~|{}|xvu|zyxtsyut~}}{{ӹʧއw~fsk~`lbrdsaiuu}}~{||~~y{rmn|~}xuwzwy|~|~}z|sprxuw~y{~y{|~z|wrt{}{}}xz~y{{}|~z|}xz|~|||{{{zzz{{{yyyxts~zy{vw{vwzuw{uzurtvsuurturturtbhgflkbhgcihflkelokpvdjoiotkqvkqvfloipskpwtyxfnnnvvs{{zu}wst{~~tzy|msqy~}x{y|y|wz~x{t{{rzyv|{rwvxzzwyyyz~z{~|~{|~xy}|}{|yz~tuyz{~{|xy}wx|vw{nosxy}wx|vw{xy}wx|oqrnnnxxxtttvvvxxxxwyzy{|{}xwyxwyuss|zz|zz}{{{yy}{{|||~}~}~}|{}~}{z|~~|~~|t~tXf~BSsQi>Xz>YvHi˾x~||~~~ƽ{wv|}{~}~|{|z~}xts|xwyut{wvzvv{wv|xw|xw{z|{zvu~|{~wrq|wv{vu|wv{vuvqpwqpzy|{~~|}{strxyw{yxwut|zy~~}}|~z{yyww}{{~~zy|~}ƬͯКz|vxpyp{nrlqsyihzswtv}}~~{}~~~{}|~~z||wy{}z||~|~{}}|~|~|~|~}}}}}}~~~|||tpo|xwvqrzuv~y{xrwlikolnroqroqroqdjigmlekjflkekjbildjojpukqvhntdjobjmu|yqyygoorzzrzzs{{lu|`ksHX^Xgj`hkqvwqssnppz||prruwwmptqtxvy}qtxmptrzzs{zw|{ipnnsrlqpnos|}uvzvw{pqupqutuyrswz{tuyuvztuyz{{|yz~vw{vw{wx|pqustxvw{tuyvx|xy}xy}xx|yz~z{}~~|~wwwvvvttttsuyxz}|~yxz}}|}{~}||~~}}|~~}~~|{}~}~~~tXqb~Y}^biĒыڍ|}{}~~{z~}~}~~}~|||z|{son}||xwyut{wvzvuzvu|xx}yxzvuvrq|{xts{wv~}yts~yx{z}xwzutxtrvrq~zx|{}|~}~{|zvts}||{~~|{|{~~~~{yy}~©Աdh}z~rvnrtzopoosrvt|~|y{}~}~|~zwy|~~}|y{vsu}|~|y{xsu|wy~y{~{}}xz}xz~y{~|~zuw}}}}}}zzz|||~zy{z{|zuvxsu{uz~{}~{}vsuvsuvsu`feagfagf^dc^dc_dg`dihlqkothlqdhm[`c_dghksiltegqckkaii^ffdllaii`jqgs{k{iy|hqtlqrz||qsstvvrttrttorvnquux|orvpswowwp{yqyxcihuzyy~}uvz{|~tuywx|}~|}jkoz{z{xy}~|}}~yz~}~}~|}z{xy}|}~uvzvw{xx|vvzz{{{{|||xxxvvvvvvwvx}|~}|~xwy}}z{y}~|~~zz|}|~~}~|{}zy{|{}~zy{~~xz{wgt]ZrbXTwԨkii~}}|~~|yzx~~|}~||~|}yx~zy|xw|xwyutsonvrqyut}yx|xw{wvwsr~zywsrxts{zzvt~zx~yx~yx{ss~vvwooxxxx~yx|}{yzx{|z}~|{yxywvusrywv~~{wv~zz{z~}zz~}}{{Ͽ¹ڷy{prvylpmpoonnhe~~{}~~~}}}{}}~}{}xsu}xz}xz{{{zzz||||||}|xts|}xst{vxxrwebdc`bpmopmopmo^dc^dcagfagfdjihmphlqjnslptosxnrwoswv{~nqxmpxtwowwt{{{q{q~fu|gwzr|qwytww|~vyy{~}z|}|ruyuy}z}wz~z{v~}ksr{w||xz~suy|}wx|xy}~z{}~xy}|}{|}~}~}~{||~}~}~{}}~}~{||}stxrsv}}}}}}xxxxxxyzyzxz}~||}}|~ywy~|~}|{~~}~~~}~|~{|{xf\QZSYjp}xx~~zvu}}{{|z||z|}{~}|~}{z|xx{wvwsr~}|{z|xwxts}|xts}yx{z|wvzy~}zy{ssxxvnnwwww}xwvvu|{z~~|zy~{z{z~}~{z~~~zy}}{vwutpo|{~Ǘϯlulsrypsnsprlmqp{|zvx}}zwy~}}|~z|{}}xz|wy{vx|wy|wy|~{}vuu|||}||xxx{z}|ojk|wxxsu~x}}z|xuwtqstqstqs^ffafg`efcfgdghjnrkotjnsjotjnsknsrswqswhmpgkolswgsuhsvp}gqtiuwmy|yeqtertboqivxnvyr{|ltxv~v~nt|x|tzz~u{enrirtajnpz|qy}px{sy|tz}x|vy}{{{|{||}|}}~{|{||}z{xy}z{{|{|yz~~}~}~}{z~~}~z{|~uwxxwyzwy~{}~z|}}~||~{||}}~|{}|{}{z|zzy~~sqsyvxzwy}rVL`LLSXqĞ|yy~{z~}~zy{z~||{}|zy}xw~zx~zy~zy}yxxts|{~}vts|vv{vu{{zutzy~}{z{zmhg}|{wvzvt~zxzy{z~yx|{}xw~yx~}{|zopn|~ȱottvuwqtrrmqms^bv|{~|~}~zzw~yryqkm}~{xz~{}~~|wy{}}~~~y{|xz|}y{~y{~y|ysuxzy|}vy{twztwzuw{vxuprvprsnp^ffchidijgijkmnjlrknsjmrjlqjlqilqnosqrvhmpmrumtwiuwjvxly{v{u~x~uymy{u{y~|t|r{~qy|py|ox{t{~v{~vx|vy}|}}~~~{|{||}|}}~~~~|}qrv~|~|~|}|~~|{|}xz{rqszwy}}~}}~||}}}}xvv|}z{|}{|~xy{yy~~}zy{~|||~t\L~_SJ\lY~yxz}{{yyystrvwu}~|yzx~}njiqmlzvu|{~~{z|{}yx~}||zzy|{}yx{wvyut}yxvrq{wv}|zxw~yx|wvyyzvtzy|{{z{zsnm}||wv{z{z{z|{~|}Ʈµtzinwyqsnqpprvqxkn~}~}~}||wy{xz~{}yvx}z|{xz|~|~}~}xz|wy}xzzuw|~~y{z|}y|{~}vyzsvzsv}vyvqsrmosnpsnptoq^ffchidijeghiklilqjnrilqilqilqilqlmqtuyinqotwlrvu~s{s{~vqz}htvp|~q|~lxzfrtfsulz|ixzu~xypwls|nu~nu~nx|zn{}kwyox{s|v{~tz|vy}xy}||~~~~{|{|{|~{|{|||||||~|}|rqu~wx||~rtu}|~}~||~||~||}}~~}}yzyz{|z{}wx}}zxx|{}yxz|{}~}|{}vz{}|}}wfvRuPz`_]oZJjx́}}|zxw~zy|{}|}||||z~|{~zy{wv}yxyut{wvxvu}{z~yx|wvyy|vv~yx}xw{z{z{vu}|~yx{z~yx|{zy~yx~}~}~|~|~~ȥhnkpuwprornnuyqxmp}~||{wvz||wy~~~}~}~}z|}}z|}z|z|{}|wy{vxzuw{}}xz}ytvz|vqsxsu{vx}~wzxqtxqtzsvxqtworyruyrux{^ff`ef_degijhjkjjpllrkkqmlrllrllrlmqoptmrulrtipsnwzdnpgqtgpsjsvr}zukxzjvxkxz`rsdwxtmou|zx~_enkr{q|nz|my{tlxzskxzvu|v{~x~x{{~~|}~{|{|}~yz~vw{xy}{|yz~vw{}~|{|{|{~~}|wvz{z~|~~}wtv~z|}y{|{}~{}~~||~||}}}{{~||~xy{|~~~|||{}zy{zy{|{}~~}~~~tWpWvNtLtNs2XqMokvsu~~}{{}}xvvvttstrpqozuv}{zyww}}}}}~~}yut{wv~}}|}|}|}|~}~}~}|{{z~}}{z~}|wvzut|||wv~yx{vu{z{z{z}|}xwzutyts{z|wv{z~Ӫհmsjoqstvsvllvznubezxvvvrq~y{{}}~{}}|y{}}|~|~|~}vsuroqnkmvsu{xzuprqlnvqsxsuvqssnptoqrmo^Y[c^`hce`[]upruprpkmojlslopilibelehkdglehf_bmfimfihadmfi^ff^cd`efgijgijkkqkkqkkqijpkkqllrklppqunsvlptqx{jqtqx{nuxjpshnqjsvhpshqtnwzox{lxzfyzfxyyww{yuzvtq}p}~{t{~nsvuz}v{~|}z|}z{z{{|{|{||}yz~yz~}~~||{~}~zy}utx~~{}~yxz|y{}y{|~{}~}}}}~||}~~~}~}~{|}~~~|zz~~~yxz~~|~}|~~xwy{xz~xvzwyz~{cly\jcuWmPgWoQiPhas|jjjtrr}}uss~~zvuyut~zy}yxxyw{yy~~|zz}}pnp{xz}~}~}{z}|{vu{vuwsrwsr}||xw||{zzxwupo~}{{{z{z~}~}|}|~}}|zy~~|{}~|կɷɴʩflrwrtrtruqqhlkrady~{}~z{z|||~}}|~zwyhegb_a\Y[jgitoqkfhxrwtmt`Xbg`gxsuvqsmhjz|ojljgiolnlikxuwvsuwtvwtv~{}{xz}z|}z|{xzzwyxuwqnp|y{zwy|~zwy~{}z|}xz}xz|wy{vxzuwzuwzuw|wyvqszuwz|zuwzuw~y{ibezsvxqt~wzwpstmp{ruzqtzqt{ru|sv^ff`efejkbdeeghljpnlrmkqnlrqousqwoptoptlrthmpry|pwzsz}horipsw~t|ws}wnwznx{p~o}ssuenwkt}oxlu~v~xfvxuetvt~}xhorv{~x}{{y~~||{|||||||}~~zz~xy}~|{|{}|~}~wvzxz~|~z||zy{}|~|~}}~||~~~~~~|}{||}|}{||wx}}~||~~~}}|~~}~}zy{zy{~~~}}|~}~}~}~w}`gbh`g_hal^m_mt~kii~rqsrqs}|~|~~~|xw~}~~{z~}|~}{z~||{|{|{}|~}}|}|}|~~}|zy{z|{~yxwrq~yx{z|{~}̰ǨŠlrw|sususvvvdhls[^s~}~}z||~|wy~}}}~|wy{vxzuwz{|}{||}{|y|~}srtxwyupr~{}|~{xz~{}~{}wtv~{}~{}~|~}xzz|z||~}z}yruunqxqtzqt~uxumpvmpwnqaii^cdejkeghgijjhnomsnlrljpnlrpntoptmnrlqt`dhsz}rwzmrunrvmruuz}horqx{sz}lrvpwzr~my{iuwxq|lwit|lwit|fuxn}spn}gvxsmz|o{}vouxrz}t|~t|~w~v}|~{||}||||||}~~z{z{~||{}|}||{|{zz~xy}z|}y{|~|~~|~{}~~||sqq_]]}}zxx}{{~||}}|}~xyzuvzxx~||~||}}~||zy{~yxzzy{xwyxwy|{}|{}tsusrtxxz~}|{}yvxzsvvnrwps{~zwy{xz|~~{}}~{}zwywtvzwy~}lkortuz~tx{~dddbhekhefgmhndi}|utv~}}~|{|z||z}|}||wv|xw~}yxywvzy~~|{~yxzyzy{z{z}|{z}|zy~}}|~ʷӦĔqww|qsqsqtttlpelPSh||zz}|~~~}~~~y{}~|wy}z|{}~whah|~|wyurt~~|~}~}}|~|~}}{}}xz}xz|wy~z|zsvxqt}vy}{tw}vyujmxlp{pszorynq]dd\abfklfhifhhgekpntnlromsnlrljpklplmqmqtsy|}mrvrwzrwzsx|rwzqx{pwyqx{lrtpvyv~ox{py{rz~xsvbrt_mor{vmyzmwzs}nvxqy|pvyw~v~z}{||~z{z{{|{|}}|}~|}{z~||}|~}}|yx||{zy}zz~xz{wyz{~z|}yww}{{ljjtrr}}}||mkkyww|zz}{{~||qlmsmnrlmslmztv}yzsqq}{{}{{~|||zzyxzttvzy{~xwz~xwy~}|wwy|{}wvxkjmutw}z|{tw|uxy{y||~~{xz~~{}}z|z|wzgckeqhlejfijgimnyxx}|~\[]|{rml~}zywsr}yx}|~yut}zy{z}|vvzz{z~}~yxzy~}~}|{oomx||좥€rwoqopoqstorgmX\pxs~yvw~}{|}||{}|~|~~|~~~{||~~|}~z|~~y{z|{}|}z|z||}{}~yz|vx~xz|~z||vx{twzsv~wzzrvslo{twux{qt{psynrxmpijobdhklpijnhinhhnllrhhnllrllrllrlnrlmqmnrlnrrswtxyptulpqfjknrsnvuiqplqqmrp]`adihpxwqyxt~}lzwkxvftthuuivwfttessq~nz|nz|wnz|wxu|}y~~}||z~~}|{||zzty||{~wvzzy}vuyzx|zy{vuwxwysrtpnntrr~}}omlyww|yy~~}~~z||wyy{yyuss{yy|zz}{{}{{|}{|~~}}~~~||~||}{{vttwut~{{|zy}}~||}}~}}}{{utttwcedeedgeihhgfhnm}|~wuu~}~yyw~{{}||{{z|{~okj|{zy|{}xwzut~}||{~}~|~~z{y~|}ֶᕓ}ydfrstuxtqqstikX[w{|}|~olnroq|~~}y~~~}||}}}}z|~z~z}x~||~|}|zz|{y~|u{zx~x~yy~y~y~z{|~|y{{xz|y{wtvwrtytvwrtytvvqsuqruqsursroqsoqsoqijnabfefjghlfhlddjfflhhnoounntmmsmnrklpghllmqpqurvwnrsosty}~ptuoutnvulrqlqp]__uzyqwvpxwp{ymzxn{yyyzwp~}}}}{wsn}k|k{~kw{lw{_jnu~rx}z}wx|uvz}~~~nosppshchXRWqkppinnkpvrwminrnsurv}||{|{yx||{yx|qprutvutv~~~yz}}}}}~~}}~~yww|zzyww}}}}}}~~}}~~}}~||z}~ln_a\`hhkjlkiklkzz~||zzyy|{son}|yts~zy|{}|{z~|~}||}|}|~{{ww{zuss~̖҆xzjlwyzywvqpqqjl[]{~}|~}|~|zv|wtv~{}}y~yuzxty{{~~}~~|y~~}w||vz~x|~x~~x~~x~y~z~{}~{}zwywtvxuw}xzzuw|wyztvvqsvprqnpqnproqroqroqefjabfdeifgkijnfflooujjpjjpiioiiojkojjnefjqrvrswquvnrsmqrlpqz~ntspxwsyxmrqlnnx{{outpvulvtmxvjwugrscoo`llcoogssksviqtdlogor_hk\hjUaeP\``nqZknPcfS_cWcgcnrow{mvzvz}rvzruzgknvy}zz}z~zzv{~y~~zzy}vuyzy}~}|~}~yxz|{}}}}{}}}{{}}}{{~||{yy~||~||~||}{{}~~~~|zz~twhkX\[^dehggfiklk||}}~}|~xyw|{{z|{}xw{zzy~}}||{~~~~}wxv|wx~||}}Ljʆjlptqtxzz{yxpqmnikaczwyvsu{}|~}z|~|||kkk|y{}~z~~~|}w|wqv~x~ysx|v{~x|~x|~x|~x~z~xuwsprurtvsu{xz|~~y{{}zvxvprtprsprsprroqroqroqefjdeighlghlefjggm^^d__e]]caagcciefjghlcdh\]almq]abkopmqrW[\cghpvuhpoioninmoqqsuumrqmsrksrjusepnbnndppfrrcoo^kkluxluxirut}u~txz~r}t}v}zz{y||~}~~~|{|{}}|~}{{~~}}|zzsnovttyww~~~||zxx~~~||~||~||~~||~||z||mpx{~ae^cdiceefhghjfett|zzvttiedytswxv~~~}~}~}||~}}||{~yx~~}~}zy|}xywyzxz{ytusghf{|zxywyڍmsfjptsvxy{{mojlfh]_x||y{}}|y{{|zxuw{{w|jfk}|{{~|zxrw~x|}w|}w|}w|~x}y~yvx}z|roqroqvsuytv~y{{vx{vxuprtoqrprsprroqroqroqVW[bcg`aehim`aeiio``fjjpjjpggmddjhimjjnmnrmnrnosmqrkopkoplpqnrsrxwowvpvusxwtvvtvvqvuqvuoutowvp{ymwwmwwmvvmwwmwwry|zyhxzsj|oiz}|zmx|ny}ypz}u~}wv|{vtx~~~}xwy~~}~}|{}~~|~~}{{~~~||~~}}}|zz{yy{yy}}~||~vxuxfk^dW\_cdfhgjlhgeeu|{wyw{yx~}~|{xts{z{z}||{~yx~~{wvwxv~~}~{z~}{z|zy|}~}y|zz}{}~Ş~z}{tֆr{befjmpxysrnrilgjnq|~~urt|~~}||~{||||||yyyyyy|~~z~z~{||}}}w|{}w|zty}{~x}~x}~x}}w|z~x}sprxuwxuwxuw{}}xz|wyz|wrtuprroqpmosprsprsprabfbcgfgklmqghlkkqddjkkqkkqoourrxnosmnrnosnospqunrsnrsnrsnrrostoutmutoutrwvtvvtvvsuuqvuovtqwvryxlvvlvvlvvnxxnxxpwzqy|y|zsi|uz~vp|yr~x|u~{}ou|osz~~xy}}|zy}zy}~}|zy{{z|rqs~~ommytu{yy}~||~~yww}}}}~~~~}{{}{{}}}{{}{{~~wuu~||~|||~~uxz}SYvYaZaZ_nqlklnjiww{z~}wvx{}~tvwvts}{z|||{~~|{z|{~zy~}{z~}{z}|~}~}}|zz|~{n{ӌmphllojkmk`b`bijpqxx}njΙ͌~wtv}z|~y{}z|}|~zy{~~~~}w|~x}~y~ysx~x}y~{uz}w|z~x~~x~y~~x}|}z|hegurtplnwrtrmowrtvqsvqsqlnroqqnproqroqroq`ae_`dijnhimghlkkqggmkkqkkqkkqllrklpnosmnrlmqoptptuptuptupttptuoutmutoutrwvtvvtvvsuusuurvvrxwrzyovvovvovvmuumuuqvyzw|y~{t}niz}mkly}z}vy|vxuv}}}}zz~ttx{z~|{~|{{z~xwyyxz~~xzzmoo}}}}}{{~~~~}}|zz|~~~~~}{{}{{{{{w|}y|Y`}]fZaX]fkhhnptsyyommoml~{yxvwu~|{}{zsqqqookiinllllllllzzz|{|xw|xw|{~uyw|}{sqp{z{z}|~zŷxlz|qsmqrsoogeegWYde{z}{Ƈ؍ۗӍ~trt|y{}~{}|~|~zzz}}}}|~uqvtpu{zv|~y~|}|}~{y~~x}z~z~y~~x}|zwy}z|yvx~{}|wy{}xsu|~~y{wrtsprroqroqroqroqdeh`afefifgkghkeejeekeekfelhhnjjomnrnosoptoptqrvostostostquvquvpuuowurwwrwvtvvtvvvuvsuurwvryxv{{pyxrxxpxxu||t}|ty|zv{~rwzotwltwdtxew{t}trj{~|rtewxrl}gxzhxzt}ow|vz}y}~vy}|}|xw{|{~ww{xw{yxzxwyutv~|}|}|z||~~}{{~~~||~~|zz~||~~~~~~zxx~~}}|~~~}{{|zzwww|~~vy}QYw_g^h]c_edekmpozz}}xz~~|z}|{yxzxw~~|{vtsnlkyvuvqp~zy~}}}~yutxts|{yut~mihyut|xw~~}~~~}{wvgfāo|mz}ڃz|uwmlqnnp|}Ń̓΂π{؅ڍςzyvxzwy{}}z||wy}~{}~~~|||~~z~z}}w|uotzqkplfkzy~~x}zz}w|z~x}~z|}{xzzwyyvxxsuytvxsuzuwwrtxtvroqroqurturturtceecefceebdeeggcdhhimfgkhjmlmpklpnpqnpqqstoqrmoortuprsmoptvwuwxruwuwzssxtuxvw{yz}rswtvxtuytvyvw{tx|svzux|qtxptwsvzz|x{wz~uw{uz}yzszyzzyxjzh{i}sxp|grxq}p|uwmtww|{y|wz~|}|w|}y~{z~|{zy}vuy|{|}}{{{}|~~~}}{{qoo~~yyy{||~~~{yy~|}~z{zzzzzz}{{}~{yy}{{~~}}~~~~~~kii}{{cb`{}beae_d\d\f`eghnlkgwxyx}|}}}zzz|}{{~}~}vwu~}|{~~}xtszyzy~~|{}|~qrp}}}gdn}o{䃋ݏ|w|y{t|v{uy|}y|yx|z֊ƀ{~{}}xz{}}~}|}}~z{w|}zv{|x}xty|x}~z|x}}y~|}y~|x}~{~{}~{}{xz{xzyvxvsuvsuvsuvsutqsurtwvxllnqqsqqsqqsceeceeceebdddffcdhmnrjkolmqpquklplnoprsoqrnpqjlmqstprsmoptvwuwxuvznosoptstxxy}|}rswtuytvzvvzvx|ux|tx|vz~svzvy}x{{~x{z}~|u~p|~[lmh|}Vmmrp~bpvaouiw~vivzy~|svzvy}zz~xy}zy}}x~{z~}|}|zz~~~~~~~|{}}|~{yyxvv}}}yyyzxx|}}~|}}}}|||xvv~||}{{~~~~~~}}~||}{{}}~||~}x~[V^vybh_bbf]f\f`edfjheb{ywvwyz}vtsusr|zyrporpp}|xwykgf~~zy|xw~~zy}xw|{~~}}yxplkz||zwmṕ{vovV_PWdi|xt{x{܃xyyz݀~ׄ}~qln}}}~{z|~{{{zxx}{{{yy~||{}|yuzzv{qmrysxzxrx|v{|v{|~z{}|~z}~|x~~z~xuwyvx|~|y{vsuvsuvsuxuwzwyurtbacpoqonponponpceeceeceebdd_aaqrvghlhimcdhpquvw{mopoqrnpqnpqeghnpqoqrmoptvwrtuuvzmnrpquvw{uvztuypquvw{vvzvw{wx|wz~vy}x{vy}svzqtxvy}{~~z}v{~r|xtq}~xuxp~eu{qi|btwj}cuxgz}_qtjvx}sz}zvy}}~~{z~}|xw{vuyxx|zzz}|~}|~|{}zy{}|~wuu|||}{{~||~||}{{~||~||~||}}}}~~}}|~lbqvmur^dZ`^d^fZh`hehkidbz|zz}~}}}}}}{yy|zz}|~}|snm|{}||{uuuptw|y{فv{gmbk_f{rz~{}|}txӁ}wr~}~zy{}{{~~}}|zty}~}y~}y~|x}{uz|z~~{w|||~}|x~~z~zwy{xzzwy}z|wtvvsuvsuvsuvsuqnpurtutvmmopprpprpprceeceeceeacc]__himdeighlfgkghlopthjkbdejlmrtuqstmopoqrnpqtvwsuvttxqrvvw{uvzxy}yz~z{z{vw{wx|xy}x{wz~z}pswqtxvy}wz~|wz~pswuz}u|r}frtlz|r}p{xr}zswyj|z|}o{}~}otwinqvy}}~}~utx|||yyy|||}|~|{}utvwww~~~wuu||yz~~}xy{|}{{~||vtttrr}}~~wuu{yy{yy|zz~||}}yww~~~||~||}ztk{PJda_X^]c]f\h[h\caeihiirsjh|{z|{z}|}|~~}|wxvotsvmoԍz|X^ny^jszw}聂|}}~fghfok}|~}|~}|~zy{ttt~~~}}ywwrpp}{{}||~}}|x}}y~z~x}z}z}y~}y~{~z|{}y~|x}~zyvx|~wtvurturtvsuwtvxuwxuwxuwurtrnpvsuqnpqnpqnpbddbddbddbddbddabfcdhjlpghlghlnosqstkmnlnortuqstsuvqstmopsuvjlmrswvw{uvzuvzfgkoptrswstxrswuvzqrvy|x{qtxmptruyvy}vy}ruysvzrtxv{~w~px{px|nz|vz{r{~ys}]hl_knsym|g|~qsn{{||}||||{}~}vuwwvxb``sqqtrrywwqoovvvuuuxxxtttvvvyyy}{{|tuz{|wxzzzzzztttwuu|}yww|zz}}pnn}{{~~zxx}{{~||~||~||~||zxx}{{ywwwuuvttyww}{{kjvtu~Z^]ebl\iXeW^\_b`iimqxs}zxkiv}~}}{zsrtutv}||{~zy}yx~}~~y}|zXVii߅v[g|y}~||~knor{}yx}~|~~|~{}zuw~}~~}|~ysxy~y~|~x}}y~||}w|~x}~ztyzty{}{w|xty}y~uqvnjpuqvuqvzv{|xz}~{}zwyvsuqnphegvsutqstqsnkmkhjnlnnkmlikceeceeceedffbddcdhefjnosjkohimlmqjlmnpqhjkprslnoprrtvwoqrsuvsuvstxuvzvvzz{yz~uvzz{{|uvzz{qrvx{wz~ux|wz~vy}qtxorvy|svzrwzt{~xt{~ry}yqyyv~~}vbtwViltshz}~|wamos|pwz`ehmruux|mosgfjqptnmqedhpossssxxxvvvlllooopoqmlnxwy{z|yxzwvx|||yyyxxxxxx{{{~~~~}}}}}|zz~||~~vtt|zz~~~~~||~~~~~~|zz~||yymn^c]c\f]jWfdicda^ihadpkԑyx~{~||}{{}{z~}}|~}|zz~rqm~ŤǛeeMWpmzltrvlodglm|~~{xz~~}}}xz~~~}z|~pstxz{utv~}~}}y~~x}~|{~z}}}w|}|xrv}~~z||{w|vrwwsx~z}y~}z|zwyxuw|~zwyurtspr{xztqsxuwpmopkmsnpvqsxrtzuwceeceeceeceebdddeibcgjkoefjqrvmnrhjklnogijhjkfhinppy{|jlmqstsuvuvztuyvw{qrvz{yz~zz~xy}xy}stxxy}}svzvz~y|xz~vy}svzmptrtxux|w|ovysx{uz}w|x{puvkoqtyzchichiempT]`GSTR_aXgiaprgvy^nqJY\Zjl`orYgjjy{]jlYegYegdmpfpskrulpsknrsvztsw~tswttt~}}|~~}}}}{{|zz~~~~~}{{}}}{yy~|}~~~~~~}{{|zz~~~~~~~~y}qq`bY`\fZiYdbdddebedfhztŒ΁~~|~~~ywwqoo}~||}{~~~~}yts~}jykxkrx}uyϓĮ}}{vx}|~}~y{|yyy~||}{{}~{~}y~zv{}y~{}zty}y~~z~z|zv{|x}yuz|{w||y{zwy~{}}z|yvxyvxspr|y{tqsxuwpmopkmidfytvuqsqln`bb`bb`bb^``cee_acbcgttybchfgklmqjllgijsuviklkmnmopkmnnpqoqrlnonosmnrppurswtuyuvzvv{tuyttyrswqrvlosilpnqubeicfj_bfknrknrlosknrimqbgjlqtpswz}tuyquvptuuyztxyhlmt{~|u{qzq}q}|vm{}|yy}{z~wvy||{zzzutv}|~~}{{~||yyypppzzz||}~~{{}}}|||zzz}{{~top~~~||}}~~~z}trX[V\^iYeXb\]`adbhfqr׃zЋ˘nn~~~nllwuuklj{z|{~}|wv~їћϳអ˦ΔŪ~~{vx}|y{{}y|}~|zy}y~}~|x~|{}}~~y~ysx{~z}~z}zv|xtywsx{w|{|x}~{}yvx}z|yvwxuwzwywtv|~vsuwtvtqsqjmmfilehibed\`_cf`dh_beilp^bd`bcceffhhbdeacd]_`hjk`bcgijbdebde^`afhidfg`bcikllppdhinrsjoobgguzzhmm_cdnrsgklmqrwz~orvjmqruytw{z~x|mptnquux|nquqtx{~nqutw{pswux|y|}y|sv{u|y|zmz|sxo~q{k{z_pnnz}r~zsy~lqv}}sw{vzy{}}{z|~}vuwvuwvuwzzzzzz}}}{{{www~~}}}}~||~~~}|||}}|||{xx}}yww~||}}}~~}~{}xlvajYeGR\edhefRVIOktv|w||{ʋՔkj{~~~}}lll|zÔ×~|~~|~}~~~}zy{|{}}|~{xzvtu}{|wuvzxz|y{xuw}~~}~}|~}|~~}}y~|~}y~|x}}y~vrw}y~|x}{w||x}|x}yuzzv{xtyxvx}z|xuw{xzjgiroquqsvsu~z|pnppln]`d[^b[^b\_c_bfacdbdebdeiklprshjlkmnlnooqruwxnpqsuvkmny{|rtuhjkkophlmswxptujnoquvz~swxrvwvz{wz~orvruy{~vy}ux|x{vy}ux|x{vy}|ux|tw{{~|y|y|ux|w~wr{~jtwnwzuy|wwk{zuw}~zvz{zy{yxz|{}~}}|~{z|zzz{yyzxx~~~~}}}}}}}}}~~~zxx}}}}{yy}{{x~v~q|\hZdivEQW`UYFKR[kup{{pwopLJ֊gf{yy~~{}}~~˜}~|}{}{xz}~~}~~}xuw~}z|xuw{xz|~}zy{{z|~}~z~}y~tpuyuz{|x}yuz}y~|x}{w||x}|x}yuzwsxyuzxuwwtvplnroqkhjtqsurtroqurtolntqsdgk^ae]`dY\`fimgijgijfhhkmneghfhinpqkmnprsjlmmoplnooqrwyzrtukmnmqrimnnrsptuy}~y}~x|}quvrvwy|ruyruy}y|z}y|wz~ux|x{ux|ruymptknrpswz}wz~x{{~{~x{ntwt{~u|~t{~{xlxztq}|k{zn}xeutaqtdtwfuxp|ys}zsx{}xxx~~~yyy}{{~||zzzxxx~~~~~~||}}~||zxx|~~~{}ktp|q|fps}{v|ys~p}rq|pxw{܋xuol}|£~~}z|wxæ~~|~~{}|y{|~~{}}trt~|~~z~z~{w|zv{{|x}{}y~|x}{w||x}|x}yuzwsxxtx~~{}yvxurtmjlnkmyvx{xzyvxqnpsprjmqadh_bf[^bjmqhjkhjkikltvwtvwrtuprsnpqsuvmopprsnpqprsrtunpqqsthlmhlmostvz{cghbfgptuw{|hlmlpqptuorvvy}ux|ux|vy}ux|ux|vy}orvx{{~wz~tw{ilpy|}y|x{|vy}x{v{~t{~v}u|nuxnvykwyp|~zpm~vwv{z}}|}~}|~~~~wuuvtt}{{}}}xxx}}~~yww~{}yvx}z|~}t~ujuallwpZho{oxxjzj|l|o|r|遈|cawt}|~~|wx̑~~{|~}|~~~}srtxwyyxz}~|y{|~zwy|~|{}~}~}~{{{|~z}y~|x}{w||x}|x}yuzwsxuqvsprsprvsuolnpmotqsvsuurtroqifhmjlZ]aZ]adgk_bfgjndfgceffhiikloqrjlllnolnofhikmnnpqlnomoprtuxz{xz{imnlpqimnvz{uyzuyzquvptutxyy}~quvux|tw{}ux|vy}wz~orvux|tw{svzvy}ux|qtxtw{vy}ux|wz~z}{~}wz~tz}v{~w|zx}u{~t|vt}u~~vw\fks~yevyfz|qt{xwxz~x}{}}yz{}|~utv{z|}|~yxzsss}{{}{{zxxuuu~~~~~~}}}}{{~~}}}}tqs|~}~{}}x{flt}r}r~lwp}]kN_N\lxq~lzgyl|wt~u|mqlk~}}~}}wuupkj~}~}}{ʷ|y{}yvx|y{~yz}~~|~|{}xuw~xwy~{}}~xvx~|{}{z|~}rns~}y~~z}y~{w|}y~|x}{w||x}|x}yuzxtyyuzwtvyvxxuwwtvurtwtvvsuroqroqroqnkm\`dadhbfj_bfbeibdfbdeeghjlmnpqdfgkmnlnogijmopqstoqrprstvwvxxz|}lpqostswxtxyquvswxlpqmqrrvvtxyptutx|svzvy}svztw{qtxprvz}wz~y|wz~vy}ux|tw{vy}vy}wz~ux|tw{wz~svzruytw{xz~{~x{{wzww{v{y~vqgxz|gswtlw{yv~zzzzx|}y}~w{|}|~mmmzzzzxxywwxvv|zzvvv~~~|||}}vttqoo~~}}~|||z|~}z|~OUxhsrzuvVfn^ol{n{n}k{k}qxrz^cyzz}{}~|{vwzxx}}}|~rsq~}~}{}~}}~}z|~{}xwy}|~|{}}|~|y{{xzoln}|{}}|~|{}yuz}~z|{|{{~z~}y~|x}|x}|x}yuz|x}}y~wtvyvxxuwtqsvsuyvxqnp{xzurtqnpqnp]`dcfjbeibei_bfacdbdeeghfhiiklacdhjknpqjlloqrqstprsqsttvwsuvy{|eijuyzz~{z~}vz{ptvquvswxquvux|svztw{hkoprvorvpswx{vy}wz~tw{vy}wz~tx|wz~wz~x{{~~wz~svztw{vz~{~|v}z{v}qx{x}to{}~y~q{{{}}|z{|~}}|~{z|rrr{{{wwwvvv~||}}~|||zzzzzyyy|||~~~~||~~{yy~||}}~~}}~}|~wy{mxivp}oy}Ue[n`qptp}npn|MXdjz~}|~|{|}~}~~www||zz{y}~z{top|zz~~zy~}~}}̣|{}~~~~~}}}|y{~}xwy|{}}|~~}}}|~~}~}y~~{}y~{~z}y~}y~~z~z~|x~|x}|x}yuzwsx|x|wtvyvxxuwtqsvsuyvxvsuroqqnppmopmo\_c`cgcfjcfj_bfbdedffhjkhjjhjkjlmjlllnokmnnppmopoprprssuvqstuwxhmmfijnrsqtwquwtwyswyuyzswxtxyuyzux}wz~vy~wzy|x{ux|wz~x{tw{vy}vy}tx|vx}vz~x{wz~wz~wz~svzorvwz~wz~tw{x{|~|t{tz}u|u{szyltzszxwgrvpz~sz|sznx}z{|yw||qvwvww{||{yyywv~||zzz||||||}}}~~~||}}~~~{}}~{}~}Q]Xaakztnnyq|RaKYYgΔ|~|}~~|}z{~||~~w}{z~īҒ~~}~~}~~}|~~utv}|~~~~|y{|z|~}~}~}~|x}}y~|w||x~~y~xtz{{{~z}y~|x}|x}yuz|w}vrwwtvyvxxuwwtvtqsvsusprwtvqnpxvxurt\_c\_c_bfbeibeibeibeiehlfinilpdhlvy}nrvlotilplotkoplpqmqrptumqrsw{pvytx|pt{or{qt}tv}wzvy~y}~uyzrtu{}~{}~vxyy{{xx||}yz~xy}vw{ux|x~nuxsy|~u{~wx|yz~rswqrv|}{|xy}|}~y{}|uw}{~wyz{|~}z|qm~zk|~pp}uvy{}zy~x~}{~}yz~~}zy{~}rqs~~~}}}~~~~}}}|~|~~~{}~}{z|zy{{ftO^I[9JK].A}Re~粻ځ|}}~ysuo}~~}}~~}pkk{{|~~}é囚~z}~{}~y{~~|~z||wy|~~~~{}|~{z||{}~}z{y|z}y|unqnik}y~{{|~z|yzyvxzwxwtvurtlikurtxuwtqsxuwurtzuwrmopkm}wyqln\_c\_c_bfbeibeibeibeiehlhjnknrehlhkojmqnquknrorvmqrnrsostimnrvwrwzotwrv|uxrt~rt~su}wzvx|w{|quvkmnxz{y{|~}~vw{yz~vx|vx|w~t{~t{~gnqnuxpqutuyrswuvz}~z{xy}xy}|}|x|}y|~{}z{|}hruiuwwyl~nz|r~vw{~pux|}uvzu|s|qz}ymvyjsvw~z}~~}}|~~zy{~~~}}}~~~~~~{{{~~~~~||~~~~~}~|{}~|~{z|}z||y{}ŦП۝ٓԣ椺褻奼਽ݠʙuuu|||}~|~~~~}~yyyǶƧչtrr|~|z{~wrt}~{}~yvx}z||~~~~xuw}~}|{}srt{}~z{zuw|}}y~{{{xzyvxzwywtvurt|~}z|vsutqswrtqlnwrtqlnvqs\_c\_c_bfadhcfjbeibeiehlhkoknrbeisvznqunquknrorvmqrnrsostgkllpqotwmruquzuxqs}pr|oqyruzux|x|}txy}vxyrtuxz{wyzuvzuvzpquzz~xx|vy}t|~w~qx{w~sz}pqutuyuvztuyyz~wx|wx|}~||{|~vz{z~{~}|~stxy{z}n{}ttr{~|x~{{y|}~|~}|~}{}vuw{{{vvvxxx}}}{{{~~}}~||~~~||~~{z|~~|~|{}xwywtv|~~}~{zktyx~ڙʀʕr~isy~{|z}}}~~~{z~yx|xw|~~{{{ɝ|~~}}}}~~{vxwrt~|~}z||~~~b^`}z|~}{z|{z|~~~y{|~tnp|wy|wy|x}{w|}y~~z}y~yvxzvx|y{zvxwtvurtmjltqsroqjgigdfwrtsnppkmojlkfh\_c\_c_bfadhcfjbeibeiehlfhljmq]`dcfjmptlosilplptkopmqrmqrimnswxotwlqtptynqymoypr|su}wzwz~||z|}uwxuwx{}~y{|{|xy}nosz{xy}x{sz}w~qx{v}u|xy}yz~|}wx|xy}uvzpquz{~}~z~uyzwzx|y{yz~~~v{~pwz~|rlxzr~wyzx}x}|zuql{}sw|wx||~y{|{~~vxyx{|vvvnnnrrrppprrr~~~~~||}{{}}~~}}{z|}|~wvx~xuw}wxvȱ֭դʣŤ}}~~wrq~}{{vvvʮό||z~~}}{}|wy|~~~~}}}xz}}~tqs~{}~{}}|~{||~~{}zwy|~}}}~~}zy{{z|~|{}}z|~|~{xz{w|yuz|{yuzyvxzwy~{}|y{zxzzwy{xzvsuxuwwtvspruprrmovqszuwxsu[^b[^b^ae\_c`cg`cg`cgfimcfjgjn`cghjnnqujmqjlpknrlpqimnmqrnrsostnsvotwnrwqt|npznpzqs{qtywz~vz{y}~qstvxy}}{}~vw{stxstxuvztuyqtxpwzry|t{~rz|t{~tuyrswnospqurswxy}{|z{vx||}wx|vzz}z}wzuwyz~wx|~{|vy}v{~~qy|}wv{zwvx|~zzl{}srz{~}z{|xz{uwx~}}}uuukkkdddqqqttt~~}}}}}}ywwwvxzy{vuw~}|~~|y{~}z|~}|}ҍȶьʍtvxuwwwtvwxvzy}}|~~{~{vts[YYjhh}|xts}|~~zpmmƛ̩ß}~~~|~~~~|~~}~|wylgi|~~{}zwy}wtv~~}~zwy~tqsxuw|~|~~~{}}z|mln~~|{}}xuwebd}z|zvx{wy{xtyvrw{xtyxuwyvxpnp~{}urtvsutqssprroqurtsprsnpqlnojlmhjjeg_bf\_c^ae_bf`cgadh`cgehl`cghkohkogjnorvlosjnrmptjnpmqrimnjnoptuty|otwptxps{npzoq{qs{ruzqtxw{|~tvwqstnpqrtuuwxtvzrtxstxttxuvzsvzrx|ry|u|ry|pwztuystxuvzstxstxz{~vvzxz~quvlpqvy~z}vxwx|yz~rswxy}{|uvzwy}qwz{{r~q|~o~x}ywmy{sz}{|x|}{z~rwxrrr~~~pppzzzywwtsuyxzrqs~~~~–єĨɭɦzz~{yy}~||}|pnm~}xw~~vqsŹ̶Ȯў}|xvu~~|}~~~~~olntqs}z|~{}|y{}~~~}z|}|~~~{}~{}nmo|{}yxzzy{tsu~}yxz{z|}yuzvrv~zzv{xuwzwyxuwxtv}z|tqsyvxxuw{xzxuwsprqlnsnpvqsytv|wy\_c[^b]`dcfjadhbei`cgdgkehlhkogjnknrqtxlosjnrmptjnpmqrimnjnoptuty|ptxrv{ps{pr|rt~su}vy~uyzqstsuvtvwxz{rswrrvstxrrvvw{tw{rz|ry|qx{v}u|xy}xy}wx|vw{vvzz{z{vw{uvzvw{txxy}~ux}z}xz|||}vw{wx|{z~|}x|~w|jmq|r~|svyyyyr{~~py|mvyt}z|{~z{opty}~||~swxwxx~~~ooouuuyyy|zz}|~{z|rqs~Л«pr|{|z~}~{z|~||~wut~}ƣǯ~}~}}zz|~}~~~~{}~y{|~~|y{}}zwyyvxzwy|~|~spr}z|zwyyvx~~{}~{}onpxwyyxzyxzvuw}|~rqs|{}}|~|{}~zwsxuqvzv{yuzxuwurtqnp{xzyvx{xzyvxljlfbdjgiplnojlqlnqlnpkmpkmWZ^Z]a^bffimadhcfj`cgcfjgjnhlpilpjlplosjmqjlpjmqkopimnlprmqrostnrupuxsv|ptzps|tvvxz|z||iklrtuwyzrswqrvttxoptxy}ux|tz}sy|ry|v|rx{nosz{xy}xy}wx|yz~z{yz~wx|vw{|}y}~x}}x|x{{~{|~yz~xy}}|}z{{{z~|{{}tswrtkrv}x|vy}{}~w|}|}}vvvqrrrrrsrrzyy~~~~||xwyqpr~~~}}˫ß˫ĩbiqlnxxyutys~~~urs~~~~vqo}xw~}~|~~~|u}vǭء~zz||~|~~~|wy~~~{}~|~|y{|z|}z||~~|z}~~~{xz~~{}~{}{z|}|~yxzyxzvuwxxzutvvuv{y|~{~zvz{w}}y~{w||y|zwy{xz{xz}xuwwtvxuw{xzroqqnptnprmorlnqlnqln^`d]`d_bfadhcfjbeibeibeifjnilpilphkoilpehlilp{~prsoqrpqrsuvqstpquoqupquoquqqvtvztxzy}~wz~svzux|pqunostuyrswpqustxtvztvzvx|z|wy}xy}z{xy}z{yz~uwwrtuwyyuxxxzzwyzxx}nos_`dxy}yy~z{{|tuy}~|}z{z{z{zz~|}}~rv~x~yt{~}zzzx}{}~||}}~{{|~}rqsvttrppupo~zy|~}|~}~{}|~~}|~~}~Ϙgjo|}vtw|||ɇ~~}~wywvtt}}}{{{}~}{{ů~|~z{}~~|wy~~~|z|}}{~~~}~toqsnp}|~|~}|~~~zwz|~zwy|y{sprhfh}~{}|~}}z|~z|~{}}z|}z|z~~qvtuxvw{x{|zxywzzzz}wyz{{uzzxx{yyywwwuuwuuytv{vxvqswrtvpruoqwtvurtolnolnolncfj^ae^aeadhcfjbeibeibeigjnhjnehljmqlosgjnfimlos^`akmnrtuqstrturtxqrvoptpquoptpquostvz{jnojnohlmehldgkz}ux|y|uvzrswstxrswqrvstxwx|wx|vw{qrvvw{rswoptqrvstxqrvprstvwxz{wyz{}~wyzstxxy}}~pquvw{~yz~yz~uvz{|z{z{z{|}wx|optyz~vx|nrsquv{~~{v~v{yyx|~|{}~}xwy~}xwy}{{sqqrnmyut~roq}}|y{~z||~|~}z|}z|է¨ ʴòwztv~x{|zyxxxztu|}|}z{{|z~}usr|}}ŵǸȸЧ~~yz~yz~||}~}y||xqt|vx}xztoq~z|~{vxz|zuw}~}}xz{}}z|{xz|~}~{}zwy}}|y{}|~~|~~z|~}}z||~{xz{xzw|{v|zvzxsvtyzxtusywvywvywwyvxxtywuuxvvvttvttvtt{vxwrtojlupruprtoqroqlikolnolnoln]`d]`d`cgadhcfjbeibeibeifimehlcfjbeiehldgkhkoknrlnooqrrtuprsrtutuyrswoptqrvqrvpquostvz{x|}swxquvorvqtxjmqux|ux|uvzstxqrvrswqrvstxtuytuyvw{pqu~uvzstxtuytuyrswwyzxz{prs{}~{}~y{|yz~stxabfstxxy}|}wx|vw{uvz|}wx|z{z{z{z{~z{lmqy}~z~}z|}x}~y~{{{{}~zy{{z|xwytpo|xw|y{~~~|~}}}z|{xz~{}}~~}{{{kns|~}|||~yzx}~|}xrr|}|}~ppp|||~~å£ô}~yz|wx}}}||}{}~~~|~~}~{}}xz|~zwyyvxwtv|y{~{}~{}}|y{{xz}vsu~|~}}z|}z|}|~}z|zwy{xz{xzw|{z}y|zwzxyzxyzxywvywvzwwyvxzuzywvzxxywwtrrvttzuwxsuytvupruprvqsroqqnpolnolnoln[^b]`d_bf`cgcfjbeibeibeibeiehlehlbeifimdgkgjnehlsuvkmnrttrtuoqrqrvrswrtxstxwx|vw{quvswxostvz{ostorvux|mptorvruyqrvrswqrvrswqrvstxuvzvvzyz~pquxy}uvzyz~wx|wx|vw{xzzz|}kmnxz{rtuxz{yz~z{uvzuvzxy}{|rsw|}vw{uvzvw{vvzz{z{z{}~z{{|ijnnosquvuyz~z}|{~}y~z}zzzuz}v{~yxz~}|zznjiurt|y{~}|~|~~}yvxyvx}z|{xz|~~|y{|~tqs~~~|||ÜĤnqvvy~|~Ҧ}|~xrs~}~~|zz|zyv~}~hhh~~~||zxx~~žد||xz|~~z|{|z|~}~y{{}|wy{vx~wz~}{~}}}~y{{}}}~{}|y{~|~|~}|~~|y{{xz}|~}z|~|~~{}~z|}z|}z|y~}z}|}y|ztus~}wxvwxvyyyxwyzy}zwyzwzxuwtqsxuwz|xtvvqsvqsxsuytvxuwsprolnolnoln[^b[^bbeigjn_bf_bfdgkcfjcfjfimcfjcfjdgklosmpt]`dacdqstprsoqrqststxtuyuvzstxvx|z{txyrvwswxswxx|}x{x{svzpswz}klprswqrvtuyuvzwx|xx|tvz~{|stxoptwx|wx|vw{vw{wyzwyzxz{vxyvxyvxy^_cmnrrswstx~{|qrvtuyoptyz~~xy}yz~z{{|}~~{|}~w{|~y|rt|uwy{{~y|}{{~y|x{vy}svztsupoqzy{zy{xvvnlltpo~{xz~~|~|y{~}~|~~{}|~}z|vsu|y{|~~}~ĿҠǝ|vx~}yxztsu~zy}|||~}}lkoشïȣƶ|~|~}~~~~{}|~~~~}|wy~}~}~yvx~{}yvx~~~|~|~|~|~~{}}z|~|y{|y{}~{}|y{|y{{w|zz}{uxvxywyzxyzxwxvutvqnozwy{xz{xzxvw|wyytvzuw|wy}xz|wyurtroqliksprnkm]`d[^b^bfbei\_c_bfbeiehlhkohkocfjcfjdgkfimknrz}y{|vxylnoqstsuvpquqrvrswqrvtvzvw{uyzquvvz{swxrvwqtxpswx{orvwz~nosrswrswvvzttxvvz{|uvzxz~{||}opt|}wx|vw{vw{wyzwyzwyzvxzvxzvxy}~rswrtxrsw{|{|}~|}z{z{z{{|}~|}|~~{ruy}|zzy{|~~{{||z{yz~wx|vvxutv{z|xwyyxzutv}{{|zz~|{zwynkmxuw{xz~{}~}{xz~{}|~~}|~~{}|~~}z||~~{}ĝҝ͖cfkfin|~|}~~yzw}{{~}~yx~xy{{{~}~|}lko~{㶵|~}}{|z{~~|~}}~~vqs|y{~~}z|}z|}z|{xzyvx|~~~{}~{}~|~|~|~{xzurtyvxw|{|z}{xzx|~|z{yvywvywtwwjmnnostpuzv|{w|yuzyuz|wyytvxsupkmniksnproqtqspmoroqqnp[^bX[_\_c_bf\`dhkohkoknrilphkodfjcfjdgkhkobeilosjlmoqrmopmopoqrnosoptpquqrvstxtuytxzquvuyzrvwswx{~ruyz}ux|svzrswstxstxxy}rswstxtuyvw{xy}xy}vw{xy}tuyuvzvw{vw{wyzwyzwyzxzzxzzwyzrswxy}mnrvw{yz~z{rswqrvrswvw{z{z{wx|z{z{z{{|}~}~~|wz~y|uw{zwvqqwz{|~~~~~}~yxzvuwyxz|{}}}|zz{z~~|y{~{}~~|~|~sprxuw|~}~|~}~{}~~~~~ľѣɴδΗz}wyxy}~xwy}||wv}~{qptǟ˭}||}zuv~~}}}xz}|~}~{}~~{}}|~}~{}~{}~|~~{}~{}~|y{~~}z|{xz{xzyvxuzysxvx{yy|zyzxvywvyw~wxypquxtx|x}zv{rnsuqvytvztvxrtxsurmotoqqnpsprroqnkmmjl\_c\_cbei_bf]`dehl`cgadhehlhkodhlcfjdgkilpjmqnquprsoqrmoplnonpqoptpquqrvtuytuyuvztyyptuptuswxz~wz~nqutw{tw{pswuvzstxtuyyz~pqurswrswwx|xx|z{z{xy}xy}uvzvw{vw{wyzwyzwyzxz{xz{xz{qrvstxz{z{z{wx|wx|vw{rsw{||}{|{}{|z{{|}~~~{{x}~{z}z{tw~yxxx}z|~z|}~~~~~}~}}|~~}~wvx~~|||{}}{y{~|~~{}}|~~~{}{}|~}~|~~~~~~ɘٜǢhlruw~z|}}~}nmrzy|~||~â{~~x}xstxsu~}|{~yuw{}~~}z|}~|~|}|z{}}}z|~~yvw~|}}~|y{}z|~{||xzptsx~|xzyx{yvwuuywtzxpttuyzvx|zu{}yzv|tpvytzwru{uwwrtzuwytuvqrroqroqzwyolnlikZ]a^ae`cgadhbeidgkehlfimfimdhldgkcfjdgkhkoilpjmqiinmnrjkonotlmqoptoptrswrswrswrswtuyvw{zzttyxy}rtxruyx{pswnqustxuvzxy}wx|xy}wx|wx|{|wx|xy}yz~xy}xy}xy}wx|wx|xy}vw|vw|xy}wx|{|z{yz~z{yz~yz~|}z{yz~yz~|}}|~}|}z||y}~w{|z~|w{|vvwqpruvwxxxvwu}}|{{z~~~z{z{tstsrt}z|}{~}~x|}y|}{|}|{}~{}|~{~|{~{}~|~~~~~}~}}xz|~y{}~~}~vȻϡxzrs|{z~|||{~xvxvtt{z~}}|{{{jjj}а~{|~~z{}}xzxsu~|~}xz~}|z|~|~|~~|~y{{}{}|wy|~}{w|{~z~z}y~~z~y{~|x}sotxtyxtyzy~|{yx|{z~wvywxzyx{vtx}|{z}onq{{~wvztsxvuy{{||{~wwx{z}|{}xtysotrnssotnjpplrolnpmopmopmonkm[^b[^b`cg]`dadhdfjdgkehlcfj`cg^aecfjdgkhkoilpjmqijnklpmnrqrvnosnosnosrrvrswrswrswtuyuvzvvzvw{xy}ruyruynqutw{vy}xy}lmqtvzvx|wx|xx|wx|xy}vx|wx|xy}xy}xy}xy}xy}xy}xx|xx|vw{vw{wx|z{vw{{|himpquyz~z{yz~xz~z{zz~{z|~~~nnn{{{y{{y}~{y}~txy}|~rqs}|~xxxwxvz{yyzx{|z|}{z{yxyw}~|{|{|rswrswyz~xwy|{}{}y|{~}~x|}x||z|||z|~{}|~}~}~}~}|{}|{}}|~~|~}{}}~~}~{UedƱĶɼϷԕkt~x{tv~|zut}~}wsxwuu|}yyy~|{txyƪ¼͗~|~toqzuw}|~}~|~~~~}|~~|~|~z|{}|wyxuwzwy|{|||{w||x}~~zvrw{w|}|vuyyx|wvzvuyyx|vuy}|yx|yx|yx|pnrtsw~zy{|{}tsuwvxtpurntuqvtptsottpupnpplnqnpqnppmobei[^b\_c\_c`cgbfjdfjdhlfimdgkbeicfjdgkhkoilpjmqoptghlhimnosklpnnrnnrqrvrswrswrswtuystxrswtuyxx|mptruymptux|wz~stxstxstxvvzwx|xz~tvzxy}vvzvx|xx|xy}xy}xy}xy}xy}vx|xz~vvzvvzxx|wx|yz~|}}~z{zz~xz~xx|xz~xy}|{}}}}xzzswxvz{}z~x|}}|~nmoyxz~yyywxvvxv{|z|}{|}{z{yxzxyzx~~{|wx|yz~}~~{}z||~|~|~z~vz|xz|zz|}z|~{}|~~~~}|{}~~}}|~}ͼϨʨrzz}mpxrrxppu}|~{z~zwy•~~wrq|}ooo~~}|}}}yx̬ϡ}~~~ojl}}|~~}}~}}xz|~|~}~~z|{}|wy}z||x}|}~zv{{w|~wvz~}wvzvuyzy}qptzx|zy}edhonrutxkjntsw{z|{z|qpronputvrnsrnruqvsotuqvuqvpnpplnqnpqnproqbeiadh`cg^bf`cgbeicfjdgkehlgjnhkocfjdgkhkoilpjmqoptefjklpnnrjkomnrmnrpqurswrswrswstxstxqrvmnrwx|vz~ux|pswqtxsvztuywx|yz~uvzwx|z{stxyz~uvzvw{wx|xy}xy}xy}uvzuvzvvzz{uvztuyxy}uvzoptvx|stxtuyvw{yz~xy}wx|vw{yz~zzzxxx}}}~~~~z~w{|z~~rqsyxz~}|~yyywxvtusxywyzxxyw|}{z{yvwu~z{z{~wx|{||~}}|~~|~}|~z~vz{wyzzy{|y{~{}|y{~{}~}~~}~~}~~}||~~}~ܴǾѴǤ:AI{~{{}}||tttlll~zvsuz{}~|~yxzut~~pon}}~µŲê~}|~|~~y{{}upr~y{~|y{~|y{}z|~~~}}ytv{}}{xz~y{{}|wy{w|}|x}{w|{||x}}}}~{w|~z||{yx|}||{yx|yx|tswrqu{z~|{}ttvpoqonpwvxrnsqmrsotrnsuqvsotpmoqnproqsprtqsTW[_bf]`d`cg_bfbeicfjdgkdgkdgkdgkcfjfimehlilpjmqnptpquklpnptklpklpmnrqrvrswrswrswwx|klpoptvw{rswqtxrtxruytw{ruyxy}xy}uvzwx|yz~tuypquyz~qrvtuyuvzuvzxy}wx|yz~z{vw{vw{stxuvzvw{wx|uvzz{{|yz~z{yz~xy}xy}z{|{}{{{zzz~~~xxx{}}quvvz|y}~w{|z~|{}~|{}zy{xxxxywuvt{|zpqoyzx|}{z|z~yzx~}yz~{|wx|stxvz{v{||~~{}}|~roqtxyquv}|~}|y{}z|}}|~~~~|{}|{}{z|ȾѬӼϢou|xzzzz{{|}~~~}|~}}~zzz}}}}z|ͫ؈}ytv~~urt|z|{xz}~|{}~}}|~}}~{vx|y{~}~}|~}~|~~|x}}y~}y~~z~z{w|{{~}{}~{z~zy}zy}vuy}|{z~}|yx|xw{vuyzy}|{}nmowvxvuwqmrokpnjornsrnslhmmjlpmoqnpsprtqsUX\\_c[^bdgkcfjcfjdgkehldgkdgkdgkcfjfimhkoilphkopqulmqhimoptnosqrvrswstxrswrswrswrswpqustxxy}stxptxptxptxsvzruystxpquuvzwx|pquxy}uvz|}rswuvzvw{yz~xz~pqutuyxy}z{yz~stxvw{wx|xx|}~nosyz~tuy|}zz~yz~xz~xy}z{{z|zzzxxx{{{y{{w{|x|}uyz{}~~}||~zy{xxxvwutusyzxvvtz{y|}{{|zxyw~}z{tuy}~|}}|~}}z|wtv|swx|~|z|}~z|~|~~~}|{}|{}~~{~~|~z|}|~nmoɩȷ͵ˠqv{wx|zy}{}~www~~~yyy~{xz~qoqy~y̴±ַťπ~}|~}xztqsxuw}~}|{}|{}|{}~~}~|~|y{|~|~{}z|z|}}}~{}~{}|x}}|x}~z}y~~~z{w|||~~{}y~~vuy~}xw{|z~zx|xw{~}|{{z~|{|{zy}zy}vuyxw{tsurqs|{}srtsrtrnsplqokprnsxtyxtynkmpnpkhjlikjgiY\`]`d\_ccfjbeicfjdgkehldgkdgkdgkcfjfimjmqlosknrjkojjnefjmnrlmqqrvrswstxrswrswrswtuyyz~optvx|wx|ptxptxptxruyqtxqrvoptuvzwx|qrv}~wx||}rtxvw{wx|{|xy}qrvuvzyz~z{yz~stxvx|xx|xz~z{}~{|xy}xz~yz~zz~yz~yz~yyyzzz{{{{{{suufjkswxtxy{~~~~}~}|~|{}xxxuvt{|zxywz|z{|z|}{}~|z{y~}{|xy}yz~qrvswxv{|w{|~}~}|~}|~|~w{|vzzxz{zxz|~~|~~~~~}~}~}z|}}~{}~|}~~tsuϔzwlpuyy}}|vxy}~~~}~kkkyut|{}|~~vsuεŮę~{vx~~}~~}|~zy{}|~|~}z||~|~~|~z|~}~{}~}wsx{w|~z|wsx}|x}~|}~z|x}|{xw{}|xw{zy}vuyutxwvzyx|yx|wvzzy}vuyxw{srtxwy}|~utvutvminnjoqmrtpusotrnsolnrnppmopmonkmY\`Z]aZ]a^ae\_cadhadhcfjdgkdgkdgkcfjfimcfjhkojlpnosnos`aeoptmnrklpmnrqrvrswrswrswpquxy}optvw{tuyruyruyqtxruypswstxvw{vw{stxvw{~~vvzyz~stxvw{wx|uvzqrvuvztuyuvzvw{vw{stxwx|xy}yz~xy}yz~rsw|}yz~xy}yz~z{yz~yz~zy{{{{~~}{{{}}}z||vz{|v{|v{||~}|{}yxz}|~}|~{{{tus~~vxu{|z{|znonxyx~}|}{yz~z{}z}~{wz{~|~{}srtvxyy|}x{|uxxwvx|~|~~|{}~}|~wwyy}~}|{~wwz·αĠاdmpmqv|{}z|}}vxy~vwu|}}}|{z}}~}}z|{}yvytrxŃvz{{}{vx}}~{z||z|~}~~{z|~}{}~|~~~|~y{|~~~zu{|}{~}}~}z|y}|{xw{|{~xw{vuyyx||{{z~{z~wvzvuyzy}xwyzyzzy{utvvuvminokqqmrrntqmrrnsnkmroqmjkolnolnZ]aY\`VY]\_c_bf\_c`bf_bfadhdgkdgkdfjilpvy}fimgjnjkoklphimwx|jkomnroptqrvstxqrvpqutuyuvzpqupqughlorvqtxsvztw{ux|ruyptxoswnrvjmqorvruyquyqtxruysvzstxstxstxuvzuvzvw{vw{wx|tuyvx|wx|yz~z{tuy|}|}vuyzy}{z~|{~}{}~|~z|}wyzorswyzoqruwxz|}y{||{}{z|~}|z|}|~}|~~}~~}}}~srt{z|wvyvuxyxz{{{|{||{|{|{|z~}~|~|{}~{{}vuwywy|{}{z~utx~}xw{wv{~}~}xwyyxzuxy~||~z|{~ˬԾѸˬ˶hnvsw|z{~~~zzz|||zzz~~~{}~~рtrr}}|}{yx~|{mln~zvrxqnwȰΞ~~|wy~{}~~|~}~|~}z||~{xz~}}z|~{}}}}|y{ywy~{}}~~~~}{|~~}{~~}xz~{z~|{|{rquxw{tswvuy{z~||{z~{z~{z~{z~xw{xw|xw{srvvuysrvwtvurttrsroqolnnlmzv{~zplqqmrqmr[^b]`dY\`\_cY\`\_c^ae^`d`cgdfjdfjdgkcfj^ae_bfmptjlpqrvpqumnroptklpnosrswoptrswqrvpquqrvuvzmnrqrvwz~ruyy|wz~wz~rvzruyqtxptxorvruyruyruyrtxruyrvzstxstxstxrswrswrswstxuvzwx|tvzyz~z{yz~uvz~uvzxx|||yx||{z|}{}~z|~z|}~{}~uwxprs{}~wyzy{||{}{z|}|~zz|zy{}|~{z|}|~xwywvxvuwvuywvzxxz{{{{{{|z~|z~|z~wvzyx|z||y{zy{}|~uwxy}~xwyzy{{z||{}|{}zy}vuy|{{z~|{~~}|~}|~|{}~y}~~~}~ң˽оѷʷʹ̛ou|tx}yz~|{}zzz}}}~|{}~}}}}}}}~}||zy|{}|~}|~{zwʫ~z|~~~~}|~~~|~{xz|~}~{}}~~~{}|~|~~{}{xz|~}~~}~{|}~|~z}x{z}y||{~}{z~~vuy}|}||z~{z~{z~~wvzzx|zz~xw{wvzutxsrvtqsvsuxuwvsuqnplikrnsminnjookpqmrY\``cg[^bbeiilp]`d^ae\_c`bfcfjcfjdgkehlilphkoilpjkorswstxmnrnoslmqnptrswijnuvzrrvrswstxoptrswrswjmqjmqux|tw{ruytvzrvzrtxruyruyruyruyruyrvzruyrtxstxstxstxrswrswqrvstxvx|wx|stxxy}uvzxz~stx|}z{{z~vuyxw{xzzz|}{}~y{|uwx{}~y{|}}z|}{}~|{}{z|}|~zxz|{}{z|vuwxwyvuw}|~yxztswxwyzzzzzzzz~zz~zz~{z~zy}}xz|y{zy{|~|{}zy{}|~}|~|{}zy}wvz{z~zy}}|zy{|{}~}|~~||{u{muzҷ¶ãľܯ¸˲Źˌnt{quz{|zzz~~~}~}zy{ђ~|~|~|zv{zx~zɤݯ|{|~~~~~~y{|wy}~~}~}|~}~~|~{xz~{}}~|~}}|~~}~{}}|~}~~}~}~~~|x}{|}|}xz~z}y|svz|{~}~vuyxvz~}}|~}{z~{z~{z~tswzy}zy}|{vtxzy}srvsrvxuwurtpmowtvyvxwtv|x}okpplqnjosotVY]`cg[^bdgkbei`cg`cg]`d_bfbeibeiadhadh`bffimilphimoptppthimqrvpquoptnosefjvw{rswqrvstxqrvqrvrrvorvqtxtw{tw{qtxtw{svzruyqtxruypswruyruysvzruyqtxstxstxstxstxstxqrvuvzyz~wx|wx|tuyvw{xy}stxtuyvx|}|rquutxvxyy{||~rtuqstxz{|~y{|suvxz{y{||{}{z|}|~yxzxwy{z|~xxzutxwvxzzzzzzzy}zy}zy}zy}zy}}xz|y{|{}x|}xwy|{}zy{{z||{}yx|xw{zy}vuyzx||{}|{}{z|~z|}{|}||pesw˹̤µǵw}vz|}~~~zzz~~~~~onp{z|}|ywvuvt~}zy~pmo~{}~|zxʽƖ~~~~|wyz|~~~|~}|wy{vx|wy~|~}~{}}z|}z|~~|~~~|~~~}|~}~~~}}|~~|x}{||{}vy}x{}{z~yx|xw{}|wvzzy}yx|wvzutx{z~{z~{z~{z~zz~{z~rrv{z~srvsrvwtvvsutqssprtqsnkmnjoyuzokpiejminTW[beiWZ^`cg]`d`cg_bfadh`cg\_c_bfcfjgjnknrlosdgkghlghlnosnosrswmnrlmqmnrfhltuypquqrvqrvpqurswqrvruyqtxsvzruyruyqtxrtxruyruyorvruyruyruytw{ruysvztuystxrswstxlmqtuystxxy}wx|vw{uvzwx|uvzstxzy}zy}rqu}|wyzvxy{}~y{|z||y{|~{}~z|}z|}{z||{}xwyxwyzy{wvxzy{srtxwytsuyx|yxzxxxzzzzy}{z~wvzxw{|{{}}||~|{}uwxuyz|{}{z||{}~}}|~yx|utx{z~xw{xw{~xxz{z|vuw|~|{v||yh{~z}yдРs|}|www|||{}~}|~~}wrs~~{|zkkkxx~}qqq}~}|̫òį}z|{yy~~|~~{}|~~{}}{}~|~|~|~~z|~z|}}|~|~|~|~|~~{}}|~~}|~~{}}~}|{}wvx~rrt|{~z{{}|z}wz~y|y|vy}xw{|{}|}|~}xw{{z~utxzy}}|vuyvuytswwvzwvznmqrquonrrquroqtqstqspmourturtplq{w|iejnjofbgWZ^^ae]`dadhadh`cg_bfadhilpfim^aedgkbeidgkjmqcfjefjcdhmnrrswijnllpjkolmqijntuyqrvqrvqrvqrvrtxqrvpswpswpswqtxqtxpswpswpswrtxrtxsvzrvzrvzsvzruysvztuystxrswttxlmqyz~rswuvzwx|vw{vvztuystxwx|rswwvz|{~~wvzvxyvxysuv{}~z|~tvw|~{}~z|}z|}z|}|{}|{}zxzyxzvuw}|~tsuxwyvuwvuwuuuwww{z~zz~wvzyx|yx||~}|{}yxzuwxswx|{}{z||z|}|~|{}zx|vvz{z~yx|yx|zy{~}z}sy}~auxzɺɯ®Ŵbktqw~{~~}{}~zy{w|{}}}}~|vvv|||nnn}}}|zzzxvv~zxÕdzŨmlp}~~}}z||~~{}}z|}|~|~|~~{}~{}~~}}}~}~|~~|~}z|~~}~}}|~~}}y~{|{{}|z}y|x{{~z}yx|tswvuy~}~}utx|{vvz~}|z~onryx|yx|yx|}||{nmq}|vuy|{tqsolnvrtwtv|y{qnpiejlhmeafhdib^cSVZQTXPSWX[_[^b`cg_bfadhadhgjnQTXehlcfjhkonquilpijnoptijnqrvhimjkojkolmqmnruvzrswqrvqrvrrvstxrswruytw{pswqtxqtxruyruyruyqtxtvztvztvztvzwz~ux|vy}tuystxrswtvzstx|}uvztuyvx|vvztvzoptrswvw{vw{yx|wvzrquutxzy}~tvwlnnsuvwyztvw~wyzz|}z|}z|}|{}zy{zz|~}xwyqprzy{xwyvuwwvxxwyxwyvvvvvvxw{{z~|{{z~zy}~y{|y{wvxxwyvxyswx|{}{z|{z|||~{z|zy}xx|zz~{z~{z~|{}|{}srtsrty|yt|z^ruxƶƽЭDzũ`irou|z~|}~|~}|~|~~|~kfg~zzzppp~}xw~yyyutvͤϽƝvtx|~~yww~||}{{~~~~y{~}}z||~~{}}}|wy~|~|~|~|~|~~~|~}}}~{}|y{~{}~{}{xz{xz~~{}}~}~|{}~}}y~{|{{}|{~orv}{~wz~tswwvz~}~}{z~yx|}|yx|~{z~utx}|posxw{}|rqu~qptwvz}z|olnwtvsprpmomjlwsx|x}fbglhmokpWZ^[]a\_c_afdgk`cg_bfadhbei`cgZ\`\_c`cgdgkcfjfimhhlklphimlmqpquklpllppqupquuvzstxqrvqrvrswtuystxpswsvzmqutw{tw{qtxqtxptxpswux|ux|svztw{rvzorvruyrswrswrswuvzstxtuystxvw{vw{uvztuypquoptqrvoptvw{zy}wvzvuy{y}tswz|}xz{y{|vxytvwtvwxz{|~z|}z|}z|}}|~zxz}{}nmosrtyxz|{}}|~yxzzy{|{}}|~zzzzzz||zz~wvzutxutyz|}z|xwyyxzz|}txy|{}{z|zy{|{}{z|zy}zy}zy}{z~{zwvxzz|~|~omo}}{iswtt{w}zÛêbjruzux}tuy~yyy|~}|~|{}{poousrzzz̙}{{}{xzwuuw~~ñ©ͪčmjl~||}{{~||~~|~}~}~{}}|~}{}}~}}~|~|~~|~~{}~|~~{}~z|}z|~{}~|~~{}|~~~|~{z|yy{}|~~~}~}|{}~}~}{~z{{}|vy}kmqxz~z|x{}|xw{{{~{{~|{{z~yx|{z~|{yx|srvyx|utxzy}rruposqqujimllpfceyvwvstroqtrskhj]Y^\X]iejjfkjfkTY\Z_b]ce[`c[`c^cf_eg`ehafi`eh^cfbeigjnhkolosgjnghlklpjkohimpptoptmnroptnptpquoptoptprvnosstxqrvqrvoptrswrswpqumptjmqpswptxqtxbeivw{tuyssw}~vw{uvzqrvtuytuystxuvzwx|uvzuvzuvzvw{prvmnrqrvuvzwx|rswvw{xy}uwxuwx|~z|}vxyqstwyzwyzz|}z|}z|}xz{uwxwyzorsruubacrqsxwywvxzy{zy{yxz|{}|{}{z|zy{|y{|y{ropwsu|xz~y{zwyyxzyxzy{|x|}{z|{z|{z|{z|{z|{z|zy{{z|}|}zyz{}~{~uxyz~|vwzy}q}v{Ҹƾӱ÷Ʀjinuuxstukkkooo}}}}}}~|~~}|{z~|{{zxxx}spr}~{}|~~Ϸij~}~}}~~{}{}z|{}}}}|~|~|~|wy|~}xz~|~~~}z|utvx{|vwxolnpmo{xz{xzxuwz|}zz||}~}z|{xz|~|~yvx{xz|y{~{}|~~{}~z||y{}z{}z|}z|}z|}z||y{xvx|~}{}}{}}{}zv{vrwvrw|x}|x}{z~{z~{z~yx|zy}{z~xw{~}wvzutxtpuvrwplqqmrrmrqmrxtysntsotsotlhm|x}zv{qmrkglminchkW\_X]`^cf_dgZ_bZ_b[`c[`c^cf`dhdgkjmqfhlhkofhlijnjkohimghlnnrklplmqqrvmnroptnospquqrvoptqrvtvzpqulmqqrv|}|}losorvlossvzruyhkostxstxvw{vx|tuy}~|}tuytuyttxuvzvx|uvzuvzuvzoptrswrswmnrrtxstxuvzvw{vw{xy}z|}tvw~z|}qstvxy{}~xz{uwxy{|}srtqprrqsvuwvvxxvxzy{zy{{z|zz|zy{|y{~{}|~zwy}|y{xwyyxzxz{x|}{z|{z|{z||z||{}zy{|{}xwyxwy}}{{|y{xzzyxs{yzɚVV\xxzxwylll~}~}||~}~}yx|y{~}|~utv}ĸŜ{}~y{|~|~|~|~|~|~|~|~|~|wy~z|}xz~y{vqs{}yxz~zwy~z|~y{|z|}|~~{}{xz|~|y{|~{xz}z|}~}z|}z|}z|}z|}z|}z|xuw~{}~{}~{}~{}xtzvrwuqv|x}|x}{z~{z~{z~|{xw{yx|{z~|{tswnmqonruqvuqvxtyrnsrnsyuztptwsxsotrnslhnminminjfk_[`\X]NSVZ_b^cfY^aZ_b\ad]be^cfY^a^cfafibeiehlbeicfjcfjfgkghlijnghllmqjkoklppptpqustxrswtuystxqrvstxwx|stxoptqrvnosoptknrilpruyz}losnqupquvvzmnrqrvtuyxy}vvztuytuytuytvzuvzvvzuvzuvzuvzmnrwx|vw{lmquvz|}|~vw{xy}|~uwxrtuy{|vxyqst{}~wyzvxyxzzwyzoqrqstprsvxzoqrutvzy{vuwvuwtsuvuwzy{zy{yxzzxzzy{}z||y{zwy}z|}z||~~{}~}~}y{|uyz{z|{z|{z||{}~|~yxzwvx{z|y{|z~~y}~{|z|xw|wvv~w}Ġըɇ^ehv{~oou|{}~}zzzqqqwwwyyy~}~}}|~}~}~zyzvu~}z|~~}~~~|~|~|~|~|~|~|~|~|~}xz|~{}{}z|zy{tvw~trt~{}|y{|~}|~~}|~|~y{|yvxzwy|~zwy{xzurt{xz|~wtv|y{}z||~~|~~}z|}z|}z|}~{}}z|~{}~{}~{}wsxxtxuqv|x}|x}{z~{z~{z~yx|xw{~}|{yx|qptvuyuqvplqzv{sotqmryuzokprnstptplqnjnjfklhmmingchgchV[^TY\Z_b]be_dg[`c\ad]be[`c^cfafiadh_bfadh`dhbeighljkorswjkomnrmnrklpnnrpquqrvrswrswpqunosrswpquqrvqrvklpuvzvw{qtxtw{wz~ruytw{vy}xy}xy}stxstxrswrswopttuyuvzuvzuvzuvzuvzuvzuvzmnrcdhyz~jkovw{rswklppquvw{xy}y{|tvvtvwtvwuwxsuvuwxrtuy{|suvwyzwyz{}~xz{uwxtvxvvxqprrqsxwytsuxwyzy{xwyxwyyxzzy{{xz|~zwytqs~y{yvxvuwtsuvxyw{|{z|{z|{z|||~~{z|}|~{z|~}~|~|x|}x|}}|}}fclfmppvzt}uivxwͫǖҢ~ddj{z~srtuuuwww{{{|||~~~z|}{z{z}yx~|y{}}~}yvx|y{qsttxyͦʒ~}}~z|rmo|~{}}}~|~{}{}{}|~|~|~|~{vxz|~y{~}}{}ytvz|}z|}~}z|~{}|~~|~zwyxuwxuw~{}|~zwyvsu|~~}z|}z|}z|urtzwy|y{}z|}~{}~{}~{}xtyyuzxty|x}|x}{z~{z~{z~|{vvz|{qptxw{nmqvuyzv{plq}y~sotplqjfkplrwsxtpuokpnjpiejnjoplqhdiiejPUXUZ]V[^W\_[`c^cfbgj]beZ`b`ehafi`cg`dh_bfadhdgkghljkoijnlmqqrvnnrklplmqnostuynosrswrswjkowx|stxopttuypqunosqrvnquruyruyqtxdgktw{vw{vw{wx|vw{wx|vw{tuyrswstxnosstxstxrswstxtuyuvzyz~yz~yz~vw{uvztuyuvztuytuyxy}xz{xz{wyzwyzrtumopvxy{}~z|}tvwwyzy{|qstuwxy{|vxyzy{tsuyxzwvxtsusrtvuwzy{|y{~{}urtzwy{}|y{|~x|}zy{|{}|{}}|~~}~~~}|{}xwyvxyy}~~}{yz~{w|}zt{~|}}íˤ^^d{z~onpyxzzzzzzzvvv|||}}}utv~~}|~}~|||~}~}}|yut~}}|{wv~~~}}y{|utv~~y{}}}}xz}xzz|z|z|z||~}}|~z|z||~z|{}zy{z|}tvwy{|uwx~zwy|~|y{|~}|~wyz{}~~{}{xz}z|}{xztqstqszwy~}z|vsuyvxyvxxuw|y{~|~|y{|~|~~{}}z|}z|}z|}z|}z|{}y~|x}wsxvrw|{{z~yx|zy}vuy}|utxxw{utxtsw~}y~okp}y~rnsqmrokpsot|x}uqvvrwnjpuqvqmrokpokpokp]be^cf\adY^aZ^bZ_b^cf_dgZ_b^cf^cf`cgadh_bfadhcfjhhlklpklpghlefjoptmnrnptoptqrvpqunosnosmnroptqrvtuyvw{stxprvtuyprvpswnqupswmptvw{stxuvzz{z{vx|tuyrtxrswxy}klprswstxuvzuvzuvzvw{uvzwx|uvzuvztuytuytuyvw{wx|xz{uwxtvwuwx~}}oqrsuvy{|tvwrtuxz{tsuyxzsrttsuvuw{z|xwytsuzy{zy{{z|}z|}xtvyvx}z|{vxyvx~}|{}y{|uyz{z|{z||z||{}}|~}|~|{}|{}~|~txyz~z~{|~|~y}tz}¬¬ȸ ggm{z~{z|wvxzzz|||}}}www{z||{}~~~~~|{{wv}|}|~||zwytqs}xuw~øŰ|~qnpfce{}~}}}~~y{~y{z|z|z|z|z|z|}z|z|z|z||~~y{{}|~|~z|}wyz~|~|y{}xz{z|~|~~{}{xz~|~|~~{}~~~|~}z||z||~~z||y{~z|~z|~z|}z|}z|}z|}z|}z|vrwzv{|x}{w|uqvxw{~}yx|{z~{z~|z~vuy|{xw{rquqptminiejvrwrnrqmrtpulhmyuzsotplqokpnjokglnjpnjpnjpTY\Z_b]beX^`X]`^cf\bdZ_b\ad^cf^dfadhcfjX[_^aeehlhimllpllpjkoklpnosmnrpqulmqlmqoptmnrmnrmnrnosxy}rswstxqrvrswtuyqtxpswloslosgjn|vx|qrvstxxy}z{wx|uvzttxstxuvzz{z{xy}uvzuvzuvzrswpqustxuvzuvztuytuytuyvw{wx|xzzrtuuwxxz{uwxxz{{}~xz||~vxy}suvoqrxz{npqtvwyxz}|~yxzyxzyxzyxz{z|wvxzy{yxzxxz|xz}yvxxuw|y{~}z||{}|{}y{|w{|{z|{z|zz||z|||~|z||{}|{}zy{zy{vxykoplpqtxyvz{y~~~~~~||ƵīIJŬmmswvzzy{yxz|||}}}~~~~~~~z||}~{}~~~xsr~~|{}{{}z|{z|ŽҐ~~}}}}~{}|~}|~|~|~{}z||~z|}xz~y{}xz{}{vx{}zuwxwysuvz|}|~~|~~|~~|y{|~}wyzy{|~|~}z|wtvvsuvsuzwytqs~{}~{}|~}z|~z||z||y{|z||z||z|}z|}z|}z|}z|}z|{}|}y~zy}~}|}|yx|zy}zz~vuyvuytswtpurnstpuqmrrnrwsxlhmvrwnjoplqtpuokpnjonjnnjnnjnUZ]Y]`W\_X\_X\`[_cZ_b\ad_dgafi`dhadhdgkadhbeicfjijnlmqlmqklplmqklpklpnosrrvnostuynosnospqupqutuysuyqrvqrwoqurtxqtxruyorvsvzy|svzxy}tuyuvztuyvx|xy}vw{tuyvw{wx|xy}pqustxwx|vw{uvztuyqrvqrvuvzuvztuytuyuvztuyxy}wyzrtty{|{}~wyy{}~vxyuwxprsy||xz{uwxvxyuwxvyysuv{z|wvxwvx{z|xvxzy{xwyttvutvutvvvxzwy|~xuw|y{yvx}y{yvx|{}}|~z|}y|}|{}zy{zy{{z||{}|{}~}~~||~qst~z~|~}~~~{{tz}Զȕffkvuy~}~}}~}~~~yyx~~~y~}z{}||~yuuzz~zywtv~~}xz{rwwőîē|~zwyvsu{}}}}|~|wy{}~|~|~|~z|}xz~y{{}~y{|~}}xz}zvx|}||~~~}z|}yvx|~z}~}}z}~uwx|y{{xz}|y{wtv}vsuspr{xzmjl}z|}z||y{|y{|y{|y{|y{|y{}z|}z|}z|}z|~z|ytytotrmrmhnb^cyx|xx|zy}}|zy}yx|zx|yx|vuyyx|uswxtyxtyuqvpmrrnsuqvsotrnsuqvuqvplqminminminminmin]]aZZ^aae\\`\\`]^b\adZcf\dgafibdh_eg`eh_dgaficilhimklplmqlmqijnlmqhimoptfgkbcgpqunosnosoptnospqumsvmsvmsvmsvmsvqtxvvzuvzvw{wx|rswpquuvzvw{uvztuyuvzstxtuytuytuytuyyz~}~wx|xy}uvzuvzstxtuytuytuystxtvzmnrz{wx|xy~yzwx|}~}~yx|vuyusx{z~}yx|xv{wvzwvzzy}xwyvvxvvxvuwutvwvxvuwsrtsrtsrtsrttsuuuwvuw~{z~|{yx|srv~}||~~{}}z|}z|}z||y{|y{}~}z||}}~|~}||~|~|~|~{~uvzrtuyxz}~z|}|~}|~~}{y|{z~~}~}|~|{}~wvx}|~{{z}}}kjl~y|}֝y{{{xz{xz|~z|~|~|~|~z||~|~}{}}{}{}~y{|tw~wzyy{oss|~|xz~z||~z{zuv|}{{{|zxz|~{y{oln|z||y{{xzurtyvx|~~vsuzwy}z|}z|{xz|y{}z|}~~{}}z|}z|}z||y{|y{|y{xx|yx|zy}yy}vuz}|zz~uvzy|sw{uw{uw{vw{vtxwsxwsxysxrquutxrnsxqvtnszuzvrwplqplqsotplqtpunjokglkglkgl`_c\[_`_c]\`]\`[\`Y^aXad[dgaficdhbdhehl_bfcejgjnefjhimijnlmqijnmnrlmqijnijnZ[_nosnosnosoptnospqulsvlsvlsvlsvlsvsvzwx|uvztuyuvzqrvstxpqunosrswvw{wx|yz~tuyuvzuvzxy}stxmnrtuyxy}vw{uvzstxtuytuytuyuvztuy}~}~z{tuyyz~rswqrv~}zy}srvzx|wvzutxzy}yx|vuwtsuttvvuwttvvuwyxzvuwnmoonprqsrqstsusrt|{}wvxyx|yx|wvz~~}}|{xzzwy}z|}z|}z||y{zwy{xzurt~{}|y{~xvx|~|y{|y{}z|}z|~{}|~|~ŷƻŮսԱÁvx|vxyvuw~}{vx|y{yxzzy{yxzsrt~utv~xwy|~~~~z|}prr|}~~}|~}}|~}~ruszy{{|}~||~~wtvlikyvxytv~y{~}|~}z|vqs{vx|~|~x{~}|}|wx{|{|{|~z|~{}|y{~{}~~{}yvxxuw|xz}z|{xz}z||~|~yvxyvx|y{|y{|y{|y{|z|~z|{z~zy}|{~zy}{z~xw{yx|wvz~}tvzx{~tx|tw{tvzrswpquutxwsxysxsrvsrvplqxrv{uzwqvrnssottpunjookplhmhdiiejiejiej^]a[Z^`_c]\`]\`[\`Y^aXad[dgaficdhbeieimadhcfjfjnhimjkolmqllpijnllpfgkjkoxy}mnrqrvnosnosoptnospqulsvlsvlsvlsvlsvorvstxrswuvzxy}uvzwx|nosxy}wx|xy}wx|xy}tuyxy}tuyqrvtuy}~xy}z{stxuvzstxtuytuytuyvvzvw{stx{|wx|tuyuvzyz~wx|yz~yx|zy}xw{hgkyx|zy}yx|wvz~xw{vuwsrtsrtutvtsuvtvxwyvuwwvxxwyxwyvuwxwywvx|{}xwyyx|xw{{z~~yx|yx|zwyzwy}z|}z|}z|}z||~}z||~~{}~{}}spr}z|}z|}z||xz~{}~}ܭ›Zcgsvzvz{{}~zwy~{}xwy{z|{z|}|~~{}}z|~xwy|~~xz{ccc}}}xxxuss}yx~~~~~~}|zy~zy{|×Ʒ̅~{}}~{}}z||~}xz~z|~~y{~z|~y{|~|~upr{}|~|wy|svyru{vxzy{vz{~{}|~}}xz~|wx{|{|{||~~{}|~zwy}~{}{xz}|y{|~zxz}z||y{yvx|~~|y{|y{|y{|y{~z||~{z~xw{yx|}|wvz~|{{z~ttxtw{vy}vx|tw{rvzptxstxutxwsxwsxvuytswsotwqv{uznhmrnsqmrqmruqvokplhnlhmfbgfbgfbgXW[YX\bae]\`]\`]^b\adZcf[dgbgjcdhdeifgkghlghlfgkghljkolmqklphimklpnosklp|}mnrmnrnosnosoptnospqulsvmtwlsvlsvlsvqtxuvztuystxwx|uvz{|optuvzuvzuvzstxrswrswuvzwx|uvzklpcdhxy}xy}uvzstxtuytuytuyvw{vvzuvzuvzyz~stxvw{vw{wx|stxvuyposjim|{}|{z~|{~}wvzwvxtsuutvtsusrtutvzy{yxz{z|zy{wvxwvxyxzxxzzy{wvxvuytswxw{wvz{z~zz~|xz~{}}z|}z|}z|yvxyvxzwy{xz}z|zwy}z|{xz~{}~{}zwy}z|ԭѮßŲu~nqutw{xy}}~}x~{v||z|~~|{}{z||~~~tvv}}{||xxz{zuv}|~~~~ywvuvtrtrz{y}~|~}}}}x{y{|y|hko~~{}~|~{vx~~z|z||~{}}}~~}z}z}~yxzy}~~{}{}ytvz{{|{|{|}z|~{}}z|~}z|}|~~{}tqs|y{sprzwy}z|}z|{xz{xz|y{~zwy{xz{xz{xz|y{~{}}xw{mlpwvz~vuyvuyzy}|z~zx|~stxsvzpswvy}tw{ruypswptxstxutxwsxonronrsotnhmysxysxminvrwzv{tpuplqnjookpjfkjfkjfk]\`_^b`_c^]a^]a\^bZ_bW`cXad[`cbcgabfbcgdeiceiijnjkojkojkollpklphimklpijnklpnosoptoptmnrnosmnroptpwzeloipslsvlsvnquuvzstxstxxy}jlpvw{stxuvzvw{wx|uvzpqutuyxy}uvzvw{vw{{|{|z{qrvvw{uvzstxuvztuytuytuytuywx|rswvw{wx|uvzuvzvw{yz~|{utxrquonrwvzutxwvz|{zy}utvutvutvtsurqspoqyxzxwy}|~xwyzy{yxzyxzyxzyxzyxzzy}|{zy}|{xw{zy}~{}}z|yvx|y{}z|xvxvsu|y{pmowtv|~|y{~{}}~{}|~|y{~{}yvx{{{ݦktxrv{x|rv{uu{{y|{|{}yxzvuwzy{vuw}}~}~}~~zy~~~~~}xw~}~{vuzyz~llly~z~wzxzzz|~}z|zwy|~zwy}z||~~}~wzz|}ը~}|~{}~}|~|~}|~~|~~y{~z|}~|tv|ux|wy}|~x|}~{}~y{|wy}~}~{vw|}|}|y{}~{}~{}~|~|~xuwxuw}z|yvx~~{}|y{|y{|y{{xz~}zx|yx||{~wvz{z~zy}{z~wx|ux|ux|ux|ux|ruypuxprvpqurswutxwvznmqgchsmr}w|uotqmrokpqmrrntnjoplqqmrjfkjfkjfk]\`YX\WVZ[Z^[Z^\]aZ_bW`cXad^cffgkfeidcgdcga`djhljkojkojkolnrmnrlmqklpijnpqupquqrvnosnosnptnnrpqusz}horipsltvltvruyrswuvzoptz{qrvuvzrtxstxstxtuytvzrrvtuyvw{stxuvzvvzyz~vw{tuytuyxy}ttxstxuvztuyvw{vw{vw{xy}tvzvw{wx|uvztuyuvzyz~vuynmqjimutxvuyzy}yx|zz~xw{tsutsutsuwvxvuw|{}}|~yxz|{}}|~wvxxwyxwyxwyyxzyxzzy}zy}zy}|{|{wvz{xzyvxxvx|y{}z|xuwxuw{xzxuwzvx~z||z|}z|yvxpmo~{}}}z|yww}}ʻ̽ϳƴǦ}}y|vy~yyyxztsu}|~}|~|{}}|~|}~}zy{z}|zut}|~zzzzuxv~}~{~~Зʞ~~}~|y{}{}z||~~z|{vx}}|~z||~|~~~{}upr{~z|xwyuyz|~~y{~y{|wxxst|}z{z{xuwyvx}z|~{}|~~{}|~~{}|y{|y{|y{}z|}z||z|}z||y{wtvspr{xz|~|~|y{|y{|y{|y{|y{yvxsrv{z~{z~{z~yx|wvz}|vuyyx|zy}xx|ux|tx|tw{ux|rvzpuxotwruytuywvzttxonrfbgsmrz{uzzv{sotnjoplqokpiejd`ejfjjfjjfjYX\[Z^[Z^\[_^]aYZ^W\_T]`U^a\adcdhfeidcghgkddhkjnjkojkojkonospqunosghlklpmnrlmqklpnosnosoptnptprvkrujptmtwntxntxruystxvw{qrvuvznostvzrrvstxstxrswtuyrtxrswvw{stxtuyvw{uvzwx|rtxuvzxy}rrvstxuvztuytuytuytuyxy}vw{vw{wx|uvzpqustxwx|||rqujimposihlqpt|{yx|yx|tsutsutsusrtxwy~}~}zy{xwy|{}wvxtsutsutsuxwyzy{||zy}|{yx|}||{|y{xuwxuw{xz|y{}z|}z||~|y{|y{|z|~z|}z||y{}zwy{xz}z|}z|~}}~~ƱĪq}r{z||~xwxyutvwvxyx||{}|y{wvxppp}|mhg~|{z{~ux}Ǖبzy~z|z|}|~{}}}~|~|~~~|~}xzzvx|~zqtyruwrtzy{x|}}~|~}~|}{|}~}|~~|~~yvxxtvxuw}}z|}z||xz~{}yvxwtv|~}z|}z|}z||y{|y{|y{|y{}z||~~xw{zy}vuyutxvuyyx|{z~|{xz~ux|tvzsvzux|rxzovypuxruyruystxtswihlnjouotxrwjdiokpminlhmminokpiejgchhdjhdjhdjXX\YX\YY]XX\[[_[\`Y_aW_bZbe]bebcgfdhffjhfjhhlgeijkojkokkojjnlmqjkodeioptpquoptnosmnroptpquoptqrvnuxlsvmtwouxnuxorvvw{vw{stxqrvstxtuyqrvvw{tuystxtuytuyqrvvw{ttxstxwx|tuyuvzrswopt{|pqustxuvztuyvw{vw{vvzxy}vw{vw{wx|uvzrswuvzz{yx|qqtxvz|z~ihlpos{z~yy}wvxwvxwuwvuwrqsedfyxzzy{tsuvuwvuwvuwvuwvuwxwy{z|~}zy}}|zz~zy}}|y{wtv{xz|y{|z||~}z||y{|y{{xz|~|y{|y{|y{}|y{xtt~Ʋխ̪r~{}|x{qsz}{~}|{}hfi~~|~~}}|{z{vu~yx~zy~{{{|~~~~~vuw~z~}z|vxzԢɶȳŪíppv~|~~z|~}upr}{}|~~y{~z|{}~y{}xz|~}|~w{|}|wy~y{~z|wrszz}xy{|~{}yvx~{}|~~|y{}z|}z||y{|~~{}{xz|y{{xzvst~{|{xzwtvwtv|y{|y{|y{zwy{xz~{}qquyx|wwz}}|{uuxutxuuxyy}zz~yz~ux|svzsvzux|tx|pvznuxruyqsxqrvxw{rqutpuvpvvpuqkpnjpplqplqkgmnjogchdbfhdigdihdiSW[SW[SW[UY]Y]`\]aY[_`bfcdh`bfbdhbdhbfjegkadhhjnfimgjncfjfimhkojkolmqnospquoptnosnquptxnqunrvqtxtx|pswptxrtxtw{ruyruyruyqtxqtxqtxstxstxtuystxrswqtxqtxorvqtxruytw{tw{qtxqtximqmptstxtuyrswtuyvw{stxuvzvw{stxxy}tuyz{tuyuvzrsw{|srvsotuputmrtmrtsumln}vzz}uwxtvwxz{vxy|wvxrqszy{{z|xwyvuwwvxxwyutv|~}z{|~}z|sprzwyxuwvsuyvxyvxyvx}z|~{}|~|y{}z|~{}}z|{xz~{}|~}~~{}~{}}}yx{{zz}zǛ֨ϵ˻Ѩx}|~oquy{{{~}}|~~}|~|{~oqr{xx~|~}}|~}~}|~}zyyϫɮͳ©{~~}z||~}~y{~z|{}}ytvz|z||~kfh}|~}{}{}{}}~~|~~~}xtv}x{|~{vx{}{}~y{~y{|wyupsxsu|xzzuw{xz|y{~z|~|~~}|y{|y{}z||~zu{}y~|z~z}z|~{}|y{vsu~{}{v{}y~{w|zuz|x}zv{zv{{v{yuz{v|zy}{z~qrvpswrwzsvzwwxxxzppqwvxrqsqprxwyonpmlnononikmhiojkojltopifgfghhjkfgheghffhSX[SX[SX[RWZV[^YZ^YZ^^_c]^babfcdhadhbeidhlilpilphkofhlbeifimhkoklpjkonosnostuytuyruyruypsworvjmqqtxorvpswtvzrtxrtxrtxrtxqtxqtxqtxstxstxttxstxrtxruyruyorvux|vy}svzrvzruyruyorvnqutuytuy{|xy}mnrlmqqrvtuystx|}xy}z{tuyyz~stxsrvqptxrwvpuwputsuvuwy}~~vxyvxyxz{z|}xz{lnotsuzy{zy{utvzy{vuwxwy}|~tsuqprfce_\^xuwtpr{xzyvxzwyyvxyvxyvx{xz{xzzwyzwy}z|}z|}z|~{}{xz~z|}~|~}z|~{}}~xw{yzvş¸ͯŞflqyz~}~~yz~z{~}}|~}~~~|{}~}{}~{}|{xz~zy{z~~~z}x}{pswƮkps~z|z|~~}z||~xsu~y{~y{}z||~}{}|~~|~{}}}z||~ytv~y{|~|xz}z||y{{xz~z|yvx}z|tqs|~|y{{xzxuwsprvsumjlebdkhj|x}~z|~z~z~{}|z||y{pmo|y{yvx~z~z|vrwzv{zvzzvzyuzxtzwsxttxwvzqrvpswrwzsvzxwyzy{qprwvxwvxrrtqprpoqonpsrttoqojlkfhpjlsnpifhdfgfhifhidfgbdeSX[SX[SX[RWZV[^XY]Z[_^_cWX\_`d`ae`cgadhdhljmqgjngjncfjcfjgjngjnklpjkollpqrvqrvnosorvnqulosux|orvorvqtxpswvx|prvptxptxptxqtxqtxqtxstxstxrtxstxttxux|ux|ruyux|wz~rvzptxsvzy|wz~wz~tuytuyklpvw{tuyprvstxvw{uvzyz~wx|xy}tvzrswmnruvzrquqptuqvuotuottvwy{||~uwxuwxvxy{z|yxzzy{utvzxznmozy{xwysrturtlik~{}zwytqswtvyvxzwyyvxyvxyvx|~}z|zwy~{}}z||y{|y{|y{}|y{|~wtv~}|{{{rso̚«Ɏgnqchktuy}~vw{xx|~|{}|~}}|~}|{|{~~~}{quvyxzxz{wyy|}~}~}{wv}|~}{{xz{ux{ƬΝ}|~}|~}|~|~~~y{pjl}z|{}z||~|wy}xzz|z|z||~ytv~y{xsu{}}z||~|~|~}|~{vx~y{}xz|~}z|~|~{xz|z|{xzyvx~}|y{|y{|y{xuw~{w|zv{{w|~z~z~{}zxz{xz{xz}|~|x}{vrwyuzzv{xtzxtzxtyxtyxtyxtyvuyttxrswsvzsvztsuvuwutvtsuxwytsuvuwlkmkjlonpuprojllgipjlidfjgidfghjjeghdfgdfgSX[SX[SX[UZ]X]`YZ^]^b_`d]^bdeibcg`bfadhdfjehldgkcfjcfjgjngjngjnklpijnjkomnrhimmnrmptpswilptw{knrorvtw{svzxz~nqupswpswpswqtxqtxqtxstxstxrswstxtuyruyqtxpswtw{ux|ruynqusvz}wz~z}tuytuystxstxvw{uvztvzyz~qrvrswtuyuvztvzrswrswoptpquzv{wtxzty{z|tsu{}~x|}ptuz|}{}~wyztvwz|}{}~wvxsrtvuwrqs}|~mlnsrt||~{z|qpr{xz|y{xuwwtvwtv{xzyvxwtvyvxyvxyvxzwyvsuroq{xz}z|{xz}~|y{}|y{{xz~{}~zzz~tǍȶƇrwztxywx|tuy}~wx|uvz|{~}~}|~}~~}~}|y}~ihj|{}|}{vw~}{z~}}}{{{~||~~}屺âԲԜŦʿΟpqu~}~~wrt|~{}z||~z||~{}~|~~y{z||~|~~y{{}|~~y{~z||~{vx}z||wytoqytv{xz}|~|y{zwy}xuwzwy|y{zwy}z|}z|}z|hegurtlik}y~|x|yuz}y~~z~{}yvx{xz|y{}~{}}{{yuz|x}xtyyuzyuzxty|x}{|w|yx|rswsvztvzvuwwvxwvxpoqtsuutvonplkmlkmmlnqlnojlqlnojlnikc`bgijjlmceffhiiklTY\V[^RWZPUXW\_Z[_Z[_Z[_\]a`aefgk_bf_bfcfjdgkbeicfjhkogjnfjnehljkoklplmqoptjkoklpjmqmptnquux|losmptsvzx{y|ilppswpswpswqtxqtxqtxstxstxstxstxstxqtx~qtxqtxqtxruyqtxpswnquvy}uvzvw{qrvmnruvztuyuvzstxxy}nosvw{uvzuvztuyklpijnjmqoptzy}|x}yuzxwy|{}xz{x|}txyy{|wyz{}~wyzvuwtsuvuwyxz{z|zy{wvx}|~vuwsrtvsuxuwyvx|~tqs~{}yvxvsu{xzyvxzxz{xzurt|~}|~}z|xuw|~|y{}z|{{{ʿδĥɸʹʭ|}z{z{{|xy}~}wvz|{~}~}~~}~}|~z~|{}z||~|~~~}~~|{{}~txy|{}roq}{{}վҭʜʩíʎ|~~{}~{}{}{}{}{}{}~y{~y{~y{z|}xz~y{|~}xz{vx~y{{}{}|~{}}~{}~xz|wy|~}zuw~|wyxsu{}yvx|~}xuwzwyzwy|y{|y{}}|~}z||z|}z||y{|x}}y~|~vrw}xuwyvx}z||~~|x}xty|x}iejkglqmrxtyyuz~x}y~yuzvuytuyyz~srtqprutvtrtwvxutvkjlqprlkmonplgipkmpkmnikpjlolngijhjkikljlmfhiRVZPUXTY\X]`W\_XZ^\]a_`dabf^_c_`dadhadh_bfbeicfjcfjhkogjnehlhkojkoklplmqoptijnstxmptmptnquhkopswnrvrtxsvzx{orvptxptxptxqtxqtxqtxstxstxstxstxstxorvz}qtxqtxqtxruyqtxpswqtxnqurvzstxstxwx|uvzoptwx|yz~wx|uvzrswtuytuytuytuynptnosnquorvvx|zz}|w|~|{}wyzz~txyvxywyzuwxwyzuwxuwxvuwtsuzy{yxzyxz|{}rqsrqswvxsrtzwyyvxwtvxuwxuwxuwurtsprzwyzwy|y{}z|tqs|y{vsuwtvzwyzwyyvxzwy~|~~z||~}~Ǜˬ¤[be|~~~zz~wx|xz~}|zy}~~}~~{}}|~x|}{~}{{~~{z}||{~~|{}~z|||~}~}~}|zzuuwڸȥ̕¬Ǩ|psx}~{}{}{}{}{}~y{~y{~y{~z|~y{z||~~y{~y{{}~y{|xzz|~{}~z|zuw|wy{}{}zuw|~}xz{}~y{urt{xz|~|y{{xz~{}}~~}z|~{}}z|zwy{xz|z||x}zv{{w|{zv{{xzvsuxvx}z|~{}~yuzuqvxtyyuz~zwsxminxtyyuzy~ysxtpuvtxzy}rswtsuwvx}|~wvxsrtwvxutvnmokjlmlnqlnlfhrmoniknikkhjeghfhidfgbdeY[\PUXPUXTX\TY\V\^WX\YZ^\]a^_c^_cabf^ae\_cadhbei^aecfjhkogjn^aegjnjkoklplmqlnrhimstxpswjmqloslosruynquorvpswtw{ruyrtxrtxrtxqtxqtxqtxstxstxstxstxstxqtxvy}qtxqtxqtxruyqtxpswpswtw{ux|uvzuvzxx|vvzklpvw{yz~yz~tuyxy}tuywx|uvzxy}tvzqvylosstx}|{{~kjlz|}x|}{{}~z|}tvxy{|wyzvxyvuwvuwwvxutvsrt`_axwynmo~}wvx{xzzwyxvxzvx{xzvsu~{}|~yvxxuwzwyyvx}|y{vsuyvx|y{|~zwy~{}|xz~{}|~}~{|z͖șѪwyz|}{|zz~wx|xz~zy}|{}|~}~}~}}|~}}~}swx|yxz|~~~}~~zy}|}|~{z~|{x}{|}z{ysrt˥ǥҝĐ~}}~~{}{}{}{}{}~y{~y{~y{~y{z||~|~{vx}xz}xzzuwxsu}}|wy{}}xzzuwzuw}xz|wy|~~z||~}z||~{xz|~~{}~}z|xuw|~~{}{xzyvx|y{|x}zv{{w|{wtvwtvyvx~z|}z|~{}{w|vrw}y~uqva]bwsxkgluqvxtyyuz{|tzxrwwsxyx|wvzwvx|{}|{}poqgfhedfqpronplkmmlntoqhceojlpkmpkmnkmikljlm]_`cefcefOTWTY\SX[TZ\V[^Z\`Z\`[]a^`d\^b^`d^aeZ]a]`d`cg`bfcfjhkogjn[^bjmqjkoklplmqklphimmnrjnrmptruyjmqnquknrorvquyrtyquyruyruyruyqtxqtxqtxstxstxstxstxstxvy}vy}pswqtxqtxruyqtxpswwz~tw{svz}uw{tvzrtxprvtvztvzsuyyzwy}y{wy}|~prwhkosw{ruyqswz|||gfhy{|swxvz|tvwvxyuvxsvvyzzuvwzy{{z|yxzyxzxwynmovuwutvyvxzwy{xz|y{tqsvsu~zwyvsutqsxvx|y{wtvroqtqs}z||y{{xz|z|{xz|~zwyzwyyvx}|~tsrĬ˭¨kss}|}z{|}y{wx|utx{z~~}~}{{|||{hklrvw}~~{z~~}|{}zx~~~{{{zzzvuw}{{zwwƭƖ|~}{}{}{}{}{}~y{~y{~y{~y{{}~}~~y{{}z|ytvz|{}|wyz||~z|{vx}xzz|~y{{}xtv~xzz|ytvzwyzwy~{}|~}wtv}z|{xz{xz}z|yvx~~|~xuwyvx|x}}y~|}{|xz}~{}|y{~z|~z|x}~z|x}plquqv}y~xtyyuz~w||vzyrxxtxsswtsuyxz|{}xwyxwy}|~qprmlnpoqpoqyuwlgipkmlgipkmpmokkmlnodeffhi`acSVZVX\VX]VY]TW[U^`VadVbdT_bT_aX`c\_c\_c[^b[^badhddhklpggkddhhimjjnklpijnklpklplmqnoslmqlmqkkopquovymsvhormsvlsvnquqtxsvzsvzpswqtxqtxptxpswpswpswtx|svzpswruypswruyruynquorvqtxrvysy|z|u|pwzsy|sz|tz}ry|v|eiq~||y}{szrx~lrupvwxwx}uvzy{|xyyuwwwuuuttwutxwu~}z{zwxuwwsuwtvyvx}y{{xzwtvzwyvsusprvsuyvxyvx}z|tqsurt}z|zwywtv{xzzwyzxz}z|{xz|y{~{}|y{~z|{xz|~yvx|y{{xzzvxxuw~{}}w{~Ɯz}|~~}tsuzy}~}{z~}|~}~~~}suunpponprqs~~}uwu|{~~}{yx}||zy}|z|~~}ЯśyѼʬ~pkm|wy{}}{}{}{}{}{}|~z|~xz~y{~z|{}|~}|~{}zuwytvwrtz|z|}~~{}{}{}{}}z|}|wyvsuyvx}~{}xuw|{}zy{{z|yxzwvxttusrt}|~~zy{zy{}|~|zv{|~z}zv{{w||x}xtyzv{jhi}}rpqqoozxy~{|yxzrqsqprutv`_amlnrqslkmmlnpmomjlgdfjgilikolnqnpmjmb_agdfgdfUX\WZ^UX\VZ^UX\T^`VbdQ]_T`bT`bV_b\_c\_c]`d^aebdhbcgjko_`ddeihimhjnklpjkomnrjkonosmnrpqujlpllptuypwzkrufmpkrvkrvnquqtxruypswsvznquqtxpswpswpswpswqtxruyptxqtxqtxmptqtxptxqtxtw{uz}nuxkrumtwkrumtwnvxovyovyry|t{~lryjoxtykoxinwkoxsytzfmpjrrgoouu{ttxz|}y{{uwwvttussvts{yx~}y}|xxuwvsuyvxyvx{xzzvxwtvyvxyvxtqsvtvyvxxuw|y{vtvvsu~{}{xzxvx}}z|{xz~zwyzwy{xzyvx|z|}z||xz{xzyvx{xzzwyxuw}~{}|xtz¬Ųǩoyyy|{}|{|{}|}~|{}~}|~tvv}~zy~~~~~}~~zz}{z~~~||ƫƏӗ~~~|~z|z|z|z|z|~y{~y{}xz}xz|wy~z|{}}xz~y{}xz{}ytv~y{z|z|ytvz|z|z||wy|wyuprzuwzwy|y{~{}}z|vsu{xzzwy|~utv~zxzwvxutvvuwsrt~}|{}|{}|{}zy{zy{}|~|x}}y~~z}y~{xtyxtyyuzxtyxty~vttqooqooqooyww{z||{}~}rqsrqshginmosrtpoqlkmnkmroqxuwnkmlikliktqsifhrnpifhebdSVZSVZQTXWZ^VX\T]`T`bIUWUacVbdV_b\_c\_c]`d^aebdhfgk\]aghlhimjkohhljlpklpjkodeimnrmnrklphimlmqrswrwzmruimpmrtmrtnqupsworvhkopswqtxlospswpswpswpswqtxruyptxqtxqtxux|ux|rvzrvzux|uz}sz}ry|t{~pwzmtwlsvsz}w~u|w~rzryxxu|szv|u{pwzrzzkssvv|rswsuvxzzuwwxvvussvts{yx|{w|zvvsuxuwyvxyvxwtvxtvxtvxuwwtvxuwxtvyvxwtvyvxxvxyvx~{}yvxzwyzwy{xzyvx|~xuwzwyyvxzxz{xzxuwxuw|y{~{}|y{{xzxuw~{}~{}|njowsxԟϑƸr||t~~z|}xwy~}}|~}|~~}~~~|~~{z|}zuvzxx~}~|~~}|~{|zyzx~}~~{wv}|}{z|zy}}}}sssҴðƘ}z|~ytv~|~|~~z|~z|~z|~z|~z|~y{}|~~y{|xz}xz{vxytv}xz}xzz|~y{|~|wy{vx~z|}~z|~z|~z||wy{vx|~|~{xzvsuxuw{xz{xzwvx{z|~xwy~~vuw~}zy{zy{zy{zy{zy{zy{}|~zv{yuzwsx|xtyxtywsxxtyxtytqs{yysqqywwkiixvvyxzxxzyxzsrtqprnmosrtmlnihjkhjlikmjljgikhjmjlroqhegebd^[]^[]TX\TW[QTXX[_VY]XadXdfHTVUacXdfV_b\_c\_c[^b[^b`dh`aejkolmqfgkfgkghljkolmqklpbcgpquopt_`dhimllpmnrqvynsvjpslqtlqtorvpswnquqtxpswqtxsvzptxpswpswpswux|svzpswpswruypswtw{vy}tw{svzpuxpwzry|u|ovymtwqx{ry|sz}ry|lsvgoveluioxnu~nu~ls|kqxsy~lsvkssmuurrxstxtvwtvvuwwzxxxvvzxwzxwxwszyuwtvyvx{xzyvxvsuurtxuwwtvzwyyvxxuwyvxwtvyvxzxzyvx|y{tqsvsuzwy{xz}z|}z||xzzwy{xz~{}~{}|y{|y{}z|{xzyvx}z||y{~}~}ˬ薣V``w||~~}qpr}|zy}~}~}|{}~{z|{z|z|}zy{uss~vqpwxv~}}xw~}~}|}{wsr[_`ó¡ãÝ{vx|wy{}{}~y{~y{~y{~y{~y{{vx}z||~~xz~z|{}~}z|~y{}xz|~|wy~y{}xzytvwrt~y{~y{~y{}xrtytv}xzsprwtvxuwyvx|y{}~{}}|~~}~rqszy{}|~rqsxwy~}|{}zy{zy{zy{zy{zy{}|~vrw~zv{yuzxtyxtyvrw{xzyww|zzkii~||zy{tsuqprrqsrqspoqmlnqprqprnmolhjjgifcejhjgdfgdfliklikdacb_ab_aUX\RUYVY]VY]VY]V`bP\^NZ\VbdZfhZcf\_c\_cZ]a]`d`cgcdhbcgcdhefjbcgefjklpklpmnrlmqklpjkolmqnosklplmqknsloslosloslosknrlosqtxorvpswqtxqtxqtxqtxorvpswtw{lospsworvqtxqtxorvmptx{pswty|pwzpwzpwzt{~rx|pwzqx{ry|ovyovyxt}qzqzmu~pv}sy~nuxnvvjrrppvrswvxyrtttvvxvvxvvxvuwutwvrwvr|y{oln}z|wtvxuwxuwurtqnptqsxuwzwywtvvsuvsu|y{}z|{xz|~}z|}z|}z|xuwroq}z||y{{xz}z|xuw|~zwy}z|{xz{xz}z|vsugfj˚̡Zbb~}|{}|{}}|~}|~~~|{}vxyoqq~}}{zhfe|zy~}~zy{}acd~~~~{ɬƫÙ~}{}{}{}~y{~y{~y{~y{~y{{}~y{z|z|~y{z|zuw{vx}xz~y{{}~y{{vx|wy~y{~y{|~~y{~y{{}|~|~}z||~|y{}z|{xzyvx|y{}z||z|~|{}~}yxzxwyzy{{z|zy{zy{zy{xwywvx|{}~{w|xty|x}yuzxtywsxxtyxtyzwyyww~||{yy~||wuuzy{wvxvuwqprqprrqsnmoqprrqsnmokhj_\^hegkhjebdfcejgikhjifhhegifhMPTQTXVY]WZ^VX\T]`Q]_S_aVbdXdfZbf\_c\_c\_c_bfbeideiefjfgkhimfgkijnijnjkoklpmnroptlmqijnllpjlplmqnosnosnosnosnosmptlosptxqtxqtxqtxqtxqtxqtxorvpswruyknrlosqtxqtxux|vy}wz~mptruyqvynuxqx{t{~v}w~sz}pwznuxovygnqnw~ir{lt~jr|hqzir{lrypv{v}yxrrxrrvtvvrttsuuxvvxvvxvuywvwvrvuqvsuolnzxzyvxurtxuwvsuzwyyvxroqxvxzwyyvx{xzyvxwtvvsulikxuw{xz~{}{xz|y{{xzvsu|y{}z|zwy{xz|z|zwyxuwvsuoptƬƭœǫqvwzy{}|~~~~}{xzzwy~~|{}y~~}|~}~~vtr~yx{z|{~y{{~~~~~~{yy~mopı~{}~~{}|~|~|~{}{}{}~y{~y{~y{~y{~y{}xz~}~y{|wy}xz}xz|wy}xz~y{z|~z||vx~~y{zuw{}{}}~y{~y{z|rnp~{}xuwxuwzwy}}zwy~{}xwy{z|{z|~}|{}|{}}|~yxz}|~zy{wvxvuwwvx~z~z{}y~yuzxtywsxxtyxty|y{zxxwuu|zz~||trrqprsrttsuonponpnmomlnqpronplkmjfhnkmolnkhjliknlnjgigdfhegc`b_\^GJNUX\Z]aWZ^UX\PY\NZ\R^`T`bUacYbe\_c\_c\_c]`d^ae^_cdeiijnhimghlijnghlfgkklpjkofgkjkolmqijnjjnlmqnosnosnosnosnosmptlnrprvqtxqtxqtxqtxqtxqtxorvpswux|qtxruyqtxqtxorvorvqtxqtxruyzt{~qx{t{~t{~u|t{~nuxjqtmtwt{~pzju}dowkv~grzir{lrypv{t{~s{{owwttzqrvrtttvvtvvxvvxvvxvuywvyxtxwswtvurtxuwnkmyvxyvxxuwurtqnp}z|qnpzwy|y{yvxyvxwtvzwy~{}{xzyvx}z|{xz}z|{xzzwy{xz{xz}z|yvx|y{yvx|~~{}|xz|y{{xz{|xy}ʎzvz{{z|~{z~{z~z|||~~~~ò}rt|~~}}~|}~|wxv~~~}{zuuucefŴ~Ϭ|~|y{~{}{}{}{}{}{}~y{~y{~y{~y{~y{~z|wrt{}}{}|~upr|wy}xz~y{~y{z||xzz||wy{vx}{}z|~{vxz|~y{|~|~pmotqsvsu~wtv|~|~}{xzyxzvuwzy{}|~|{}~}{z|~}yxztsuxwyzy{xwyutvzxzzy{zv{yuz}y~vrwuqvyuzxtywsxxtyxtyzwytrrrpptrrvttommihjgfhlkmgfhhgionpmlnnmomlnkjlifhkhjebddacc`b`]_b_adacdacdacebdFIMSVZORVWZ^SW[T\_Q\_S^aU`bT^aZbe\_c\_c^`d_bf_bfcdhefjfgkfgkfgkklpmnrhimiimnnrijnlmqlmqhimijnlmqnosnosnosnosnosorvknrnqusvzruyqtxqtxqtxqtxorvpswoqupswruytv{qtxqtxpswnquorvruylqtqwzrx{sy|ntwmsviqtkruksvqx{rz}ku|fqx]hotq|mv~ov}sy~v|w~~w}~uu{qrvprsvxyvxyxvvxvvxvuvtszxv|zxurtwtvyvxqnoyvxwtv{xzzwyqnp|~yvxyvxzwywtvyvxxuwyvxzwy}~z|zwyxuw}z|yvx{xz{xz}z|xuw{xzyvx}}z|}z|{¨ҫhlm~ost~~}|zy}}}~|}{|}wyzǂwy{z~~{{{www~~~~||}{{~ĥ}|~{}{}{}{}{}~y{~y{~y{~y{~y{|~~y{z||~~z|{}~|wy}xz~y{~y{z|~y{{vx}xz}xz}xzz|~y{{}{vx}{vx}xz~~z~ebdzwztqr{rpr{~|z|}ttvxvxwvx|z|yxzwvx{z|yy{srtwwy~}xwyzv{|~zv|zu{xtywsxxtyxty|y{rppxwvvttvttzxxpprsrtzz|utvutvsrtpoqkjlmlnlkmolnkhjmjlolnplnlhjebddacfcedacgdfMNRTUYSVZUZ]T[^X\`W[^Y]`Y]`Y\`[_b[^b]`d_bf\_cbeihkoZ]abfjeimhkojmqjmqcfjfimilpimqklpklpijnhimjkoonrsrvrqumlpposnptmptpswqtxpsworvsuuqstqstqstrstqvypvypvxmrurwzpuxmruotwouxnsvrwzijnvx|vx|tuziuwjuwiuwoz|ly{iuxp|~t}u}|lrvrvzw{~vxyx|{vwwtrxrpvnlqpnt~|wtvtqswtvxuvwuvywwywvywvvut{yxvtsvtvwtvvsuxuw{xzyvxwtvurtxtvurtvsuzwyzwy|y{}|y{|y{xuwvsuzwyzwy|y{|y{yvxyvx{xz}}z|~|~|~|y{v}ȰͲǤ^ehy~~~~}{z|y{|~~{z|~~~~yut~|{~}omltrqzxw~~~}ҹ֨}z}|z}{}{}|wy~y{|wy~y{~y{~y{z|z|}z|z|~y{|wy|wy~y{}xz|wy~y{~y{{vx{}zuw~y{|wy{vx~y{z||~{vwz{wrs~z|x~{}|x~{y}}zyyy|{zy}}xz{vx{uwxtvzuwzwy|xz|xz~z|vsuwtvwtvvrtzwyurtvqsrmnpkmsnpvqsroqyvxxuwxuwyvxurtroqwtvxtwurtpmoolnrnphdfhegnkmnmoonpkjljikjikllnhhjihjhhjjjlhgi_^`bac^]_^]_]\^PQUQRVORVTY\TZ^UX\UX\XZ^XZ^Y\`[^b[^b]`d\_c[^b_bfgjnY\`fimfimhkodgkgjndgkfimfimjmqklpklpjjnhjnklpqptutxrqupptposprvknrknrgjnknrorvprstvwprsqstsuvrvzrvzrvzrwzty|ty|sx{ty|rwzqvylqtyz~z{tuy|}pquiuwiuwiuwmy{nz|htvnz|py|t{~kpsqvyqvyqtxuwxtssuuuxwzwvzhgkqpt~yvxxuwzwyxuwzwysqqvtsvtsvttxvvvtsvsuzwyroqvtv}z|{xzxuwtqsvsuvsuyvxyvxyvx|y{wtvwtvyvxyvxzwyzwyyvx{xz|xzxvx{xzyvx~{}}z|~~{}}z|Ⱦ~̰ŭĚ_fiqvy~}|{}|~|y{}{z~~xz{~~~xtt}|~}{yx}}~}|kjlvtt~~~}}}zzzzzz}}}}~||vrwžʾӠ׬}z}|~|~|~{}{}~y{~y{~y{~z|~z|z|{vxzuwzuw|vx|wy}xzwrt~y{|wyzuwxsu{}z|{vx}xz{}vqs}xz~snpfacvqrpklz{topupqvrwxtyyuz}y~njo}|yz~{|yz~z{{z~}xz{vx{vxxrtvqswtvxuwyvxvsuvsuzwy|~}z||y{yvx~z|{}}}z|}z|~{}xtvtprsprurttqspmopmonkmolnmjlmjllkmlkmpoqihjgfhhgifegedfdcefegdcejikbachgiedf_^`QRVPRVPTXTX\RZ\TW[SVZVY]VX\WZ^[^b[^b]`d[^b\_c_bfadh^ae^aeehlgjnfimhkoadhbeifimhkoklpklpjkojjnllponrutxutxyw{posqswlosjmqlosloslosprstvwrtusuvsuvrvzrvzrvzpuxqvyqvyrxzqvyrwzpux|bcgjkotuy~stxiuwiuwiuwlxznz|o{}p|~mvypwzrwzty|ux|pswqtuooouss{z~vuzyy}zy~|{vsutqspmotqsyvxvttvtsvtsvtsvttwutvsuzwyroqvsuyvxzwyxtvtqstqstqsvsuyvxyvxvsu|~}z|yvx{xz|y{zwywtvzxz{xzxtvyvxvsu~{}}~{}wtv}z|}gnq|~{z|~}}}z||~yvx|z||zytqs~}|~~}|~}~~|~yut~}zut~~nlkvxynmo}}}y~ۥɡÐ}|~||~|~|~~~y{~y{~y{~xz~xz}xzzuwzuwzuw|vx|wy{}toq|wy~y{{}{vx|wyzuwzuwxsu{vxz||wy~y{{vxytv~~yz~yz|w}{yuzyuz{w|yzwx|yz~xy}{z~|wy|wyytvvqsuprwtvxuwyvx{xz}z|zwyyvxyvxwtv}spr|wyuprrmovqs{vxwtvsprwtvsprurtyvxvsutqsurtvrtroqolnolnqnpolnlhjpoqgfhddffegfegfeggfhedffegedffegedf`_a]\^]\^]\^PQUPQUSVZSX[RY\TX\TW[VY]TVZVY]Z]a[^b]`d\_c`cg`dhadh\_c`cgadhcfjadhcfjbei_bfilpdgkklpklpklpjkolmqpqupquklprswmnrpswnqumptmptmptnquostquvtxyqvvnrspuxpvxpuxotwrxznsvqvyotwpuxotwty||}klppqutuyiuwiuwiuwkwynz|tz{zuz}puxruyoptxwyyww|zzxuwnkmqnp}}z{roqwtvxuwxuwurtusswutwutusrusrxvuwtvwtvvsu|y{wtvwtvwtvxuwzwyxuwyvx}z|}z|zwyzwyzwyzwy{xz{xzzwywtvzwyzwywtv{xzyvx~xuwˬv}z|}}|~~~~xuw}}}{z~~}|}|}~|pnm~~yxz~~~vvv}{{ljj~~wsxwsxĬےڭ֪y|~}}~y{~y{~y{~y{}xz}xz}xz|wyz|z||xz|wywrt~y{|wy{vx{vx{vxzuw|wy~y{|~z|~y{vrtxsu}}~~yzvqr{vwxstvsu}yvxsprtqsyxz{}~z|}y{|vxy|z||wy|wywrtvqsytvxuwyvxzwy|y{}z|zwy{xzzwy|y{|~spr~vqs|wy{vxzuw|y{yvxsprwtvzwyyvxyvxxuwxuwxuwvsuwtvqnpmjlpmojgirqswvxutvihjlkmjikkjlhgiedfcbdfegkjlihj]\^^]__^`OPTOPTPSWSX[RY\UX\VY]WZ^TW[WZ^\_c[^b[^b[^badhbeibei^ae`cg`cgbfjbeijmqfimcfjcfjgjnklpklpijnjkoklplmqpquefjww{sswlosloslosnqulosorvtyzlqrpuvqvwqvwqvyotwqvyotwty|qvyotwnsvpuxsx{uz}xy}tuystxz{yz~lxziuwjvxlxzmy{]ikbnpxv}rvzmrujkoprvwtvwuu{vwolnolnkhkuru|y{vsuvsusprsprwtvywwvtsvtswutwutwutroqxuwzwyzwyyvxurtvrtyvxyvxxuw}}z|}z|wtvyvx{xz{xz|y{}z|}z|spr|y{|y{vtvyvxyvx}z||y{|~sz}יyy~tuy~|~~~y{||~{z|~x~mlnwww~}{wv~|{zxw~~{zxyw|}{}{z}}}wvx~}|A=B÷֦tqs|{vx{vxwrtxsu~y{{}z|xsu}xz|vxz||~zuw|xz}xz{vx}|wy{}z|wrt|wy~y{{vx}xz|wy{}z|ytv~y{~yzwrs{vw|}{|yvx~wtvurt}vuxtvxvxyvxyuwxzx{{vx{vx~y{ytvxuwyvxzwyzwyzvxyvxroqspr|y{yvx|y{ytvrmozuwtoqyvxtqsolnxuwxuwzwy|y{vsuxuwtqspmolikmjlmjlifhmjlnmokjlonplkmkjllkmjjllkmihjdcebacedf[Z\edf^]_`_aOPTOPTORVRWZRX\TX\VY]XZ^[^bZ]a\_cZ]a[^b[^b^bfadh_bfadhdgk`dhehlbeifimknrgjnfhldgkghljlpklplmqmnrjmqknrloshlpqtxloslptmpthkopswqtxrwxmrskpqsxyotusx{rwznsvqvyty|qvypuxpuxpuxv{~kpsuvzuvzpqupqustxkwyiuwjvxnz|o{}ujvxpy|fmplqthlpkjnvtxusu|}xsttoprmnqlmtoo{|yvxvtvurtwtvvtvvttvtsvtsvttvttvttxuwxuwtqs|y{yvxroqspryvxxuwxuw|y{|xz|y{{xz{xz{xz~{}|z|roqtqszwyzwyyvxvsuyvxwtv}}|~|y{ԓyõšry|y~x}|~~}~}xwy|~}~{}xvu~~~}~swxsrt~}}|xvu}{z}|~onp~~}|zz}}{yy~~xvv}{{~||~|uqvàv|ҪͲebd~y|}xz|wy|wy~y{}xz|wyzvxytv{vx~y{ytv|wy{vxpkm}xz|~}xzxsu|wywrtytvvqs|wy}xzytvvqsytvz|{vx~yz|wxsnoxstytuusssqqsrq|zzzxxwxwqsswyywyyz||zzz|wyzuwtoqtoqwrtxuwyvxzwyxuwxuwxuw{xzzwy{xz}z|{vx|wyz|ytv{vx{xz{xzvsusprtqswtvwtvurtroqwtvqnpsprxuwurtqnptqsmlnqprjikgfhihjfeghgicbda`bjikjikihjjikedf^]_ZY[NOSNOSNRVRVZPXZTVZVX\X[_\^bX[_X[_X[_Z^b[^b\_c`cg^bf`cgZ]abdhehl^aehkoadhhkogjnadhklpjjnklplmqmnrnqupswlosgjnqtxlosmptnrvwz~svzkoshpppxxu}}xqyyZ_blqtty|qvysx{otwpuxpuxrwzv{~hmpqrvwx|stxoptrtxjvxiuwlxznz|o{}nz|q}py|zpuxsvztswxx|}wyzuv{uv{vwupqvqrwrt~yzxuwwtv{xzyvxwtvussvtsvtsvtrvtrvtrtqsvsuvsuxuwvsuurttrtvtvwtvwtvxuwzvx{xz{xz{xz{xzspr|y{}z|}z|}z|zwyxuw~{}}|~|~~~s}Ìmtw~x}yxz~~}{yx}|zxw~}}}~}~}~w{|z~~yxz~||{wv~zy~|{wut~}}|wvu~}~}~vuw~~~~~~~òý˫likz|~{~{~`[]}xz|wy~y{{}z|}xzytvztvxsu}xz|wyz|z|zuw{}}xz~y{{}|wyytvytv~zuw|vx~y{~y{z|zuw{vx~yz~yzz{|}|}zxxqoo{yyzxxuuu{}}xzzy{{vxxwww|wyzuw{vxytvxsuxuwyvxzwyzwyzwywtvxuwxuwurturttqsytv}xz|vxvqsxsuurtpmoroqurtsprmjljginkmgdfqnpolnmjlkhjkhjgdfjgidceihja`ba`bhgiihjlkmfega`bedfbacgfhgfh`_a]\^YXZNNRNNRNQUQVYPWZSVZUX\Y\`[^bX[_Y\`X[_Z]aZ]aZ]a_bf^aebeicfjcfjbeiehlbeidgkfimadhghlijnijnjkoklpjor]be_dgjorhnqkosnpupswgkojnrpuxgoopyxpxxs|{wsx{mrulqtoswquymrumruotwqvyx}suyprvstxrswrtxitwjtwlwzmxzny|ny|ny{nvymtvmruqtxttx{w|xsuwrsztu|vvtnouoo|vw}}{wyqnproqxuwxuwxuvvtsvtsusrusrutsyvxzwyyvxxuwzwy{xzwtvurtvsuwtvvrtxuw{xzzxzyvxxvx{xzwtvnkmtqs|~zwyxuwxuwzwy|xz}~~|~yvxw}Ǟioxkqt}y~}~}}~||~{z||{}}|~~~zxw~ywv~~~|||}|z~}}|~zy}|~}~}~}~~}}}wxvwvxzy{utvvuw}~~~~zxx}}~zwsx׮Ӫ}~~y{|~~|wy|wyz|}xz{vxytv{vxxsu~y{|wyz|}xzxsu{vx{vx}xzz|z|}xzzuwytwz|zuw}xz|wy|wy{vx~y{}xx|wx{|}xy|wxxvvonm}}{yyyxx{{{{}}}~~z||monppp{vw{vwytvxstztvxuwyvxzwyyvwxvwzwyvsu{xzyvxz|~xzwrtvqsz|spr}z|}z|wtvxuwtqs{xz|~zvxuqsokmkhjsoqnkmrnpkjlhgilkmlkmihjkjljikkjlhhjcbd``bnmo`_a_^`bacdceMNRMNRNQUOTWNUXRTXVX\]]a\^b\]a_`d]^bYY]_`daaeabf_bfbdh]`d`cgbeicfjcfjcfjdfjcfjehlfjngjnjmqknrlosmrukrugnqfnqhrujpqkpqntuoyxnzznyyhsvjvxkuxiuxdnqmvygnqnsvsrvrquilplqtkpsrwzrwzjorlruotwpswrswrswrvwquvx||rvwostrtxoptoqurswoqurrvwtvxuwsqsvsu}y{qwqkplmsn{|w}wxstytvvsuxuwutvwvxxuxxvwvsuropqnpvsuzxzvsu}z|{xzwtvvsuurtvsusprurtvuwxwyzvxztvwqtxuw{xzxuwqnpxuwsrtwvxyxzwvx}|~|~{~y{~vuyƢfjl{}~yz~||}||~|{~|}|{}y~|~|~|}{xz|~wwxyxy~bac~~~}{{~~}|}|}|}|}~}|~~zzz~||~||~~~||ƃáwxy|~z|}xzztv~y{|wyytv{vx{vxtoqvqsz||~{}}xz~y{~y{~yz~yz~yz~yz{vvwrt~y{{vx}xzxsu|wywrt~z|~y{z|ztuxrtyst|wx{vwvsuywyyvx{y{xtw|xz{x}yu{{w|yu{xtywsxwsyxtyxtz{w|vsupmonkmzwyvsuvsuvtvusuxvxwuwzwyzwyzwy}z||y{wtvrmolikqprzy{tuvuvwxqtohkskosmprjmgcehegjginkmuqslikkhjhegebd`]_c`bcbda`b]\^^]_TSUMNRMNRNQUOTWNUXQVYTY\X\`W\_Z^a^bf`ae]^bcdhlmqcdh]`d_bf_bf`cgbeicfjcfjcfjcfjbeigjnilphkohkoilpjmqfknahkelogpscoqluumvvkvvkxwo}|yr~o{}r~p|~vpy|gnqx}tswrqulosglokpsx}afix}ovyotwpswrswrswrvwpturvwswxswxrrvpptpquqrvpqurtxvsuxvxvsuvsu}z|vywlomilj~y|z{vxojlroqxuwttvvtvurttqsyvxwtvwtv{xzzvxqnpwtvtqsyvxxuwwtvxuwroqyvxxwyyxzyvxytvzsvxuwzvxwtvyvxyvxvtvxwyyxzxwy}|~~{}z}~xzxuwzy}{z~¼͟~uvzvw{|}{|}|}|~|}y~{w|}y~|~z|y{}z|}~}wvx~yxzy}~vx|}wyz~}~|{~}xw}|~}ywv|}{z~}utx{z||z|~{}}~~}{{}{{|y{~{}ƥƤw{|~}~~z|~y{|~ytv|wyz|~xsuvqs}xz{}{vx|wy}xz~yz~yz~yz~yz|wx|wy{vx~y{|vxytv{vx}xz}xzytv{vx}xz}xyxst|}|vx{vw{xznln|y{wtvwtv|y{vrwrns|{|x}xtyxtywsxvrwuqv{xzzwy~{}}|y{wtvvsuxtvurturt{xzyvx{xzxuwurtzuw~{}tsutsukmnsuv}xsuvqsuprplnsprvsusprolnpmomjlifhmjlkhjifhebda`ba`b^]_ZY[ZY[MNRMNRNQUOTWNUXOVYQX[SZ]T[^V^`\be__cZ[_abf^_c^_c^aeadh`cg`cgbeicfjcfjcfjehlcfjdgkhkohkojmqknrlosflnahkfmpclogsufsrn{zp~k|{^onZkj]ikdpreqslxzjvxqz}ry|sx{vuyvuyptxinqptxrwznsvx}pwzntvpswrswrswrvvquvquvswxrvwoptnptpqupquprvttxpmoyvx}z|yvxvsunqogjhbec|}vywvqszuw|y{xuwtrtsrtwtvurturturtwtv|y{yvxolnvsuurtwtvvsuurtvsuzwyvsuxwywvxurtytvzsvxtvwtvwtv{xz|y{xwyyxzxxzyxz}|~|z||}~xz{xzwvzyz~vw{z{yz~|zz~}{z}|~~}}}y~{w|}y~~z}y~zwy}z|zy{{z|~}|~{z|~}~}jno}y{||~tsu|~z|}~z|}}|~}|~|zz}}~~~}~}{zusr|{{vuxvu~|}|}~}~}}~ssszzz~~~~~~~~||}}~||ɲƦʰĠcgh~}~|~z|}wrtupr|~vqsytv|wy}xz}xz}xz}xz|wyz|{}|~~yz~yz~yzz{|xxlgi~y{ztvztvzvxytvytv{vx}xz|vxzuvzvv{vwzwy|~yvxyvxxuwwtvuqv}wsxyuz|x}vrwuqvsotuqvuqvroqvsuqnpvsuzwyxuwwtvvsuwtvvsuwtvzwyvtvxvxvsuurt{vxroqfegxwyikllnoxsujeguprtoqojlhegb_aifholnifhifhmjlc`bjgiifhc`b\[]a`b\\^bacYXZMNRMNRNQUOTWNUXMVYOX[PZ]T]`S]`W^a]`dX\`X[_WZ^Z]a\_c^ae^ae`cgbeicfjcfjcfj_bf_bfSVZdhlilpilpjmqknrhmpdkn`gjdmpiuwguwm|~l~i}~jmr~vp|~lxzjvxnwzjqtchkqptvvzux|qvyty|qvynsvuz}mtwnsvpswrswrswquvtxxtxzptunrsoptoptpquoptqrvtuyxuwxuwzwy|y{qnpgffgggedexxxvuvvqszuwzwyxuwsrtsrtvtvsprqnproqvsuyvxzwysprroqtqsxuwxtvvtvxuwyvx{xzwvxtsutrtxsu|uxwtvvtvxuwzwyzwyzy{|{}xwyzy{|{}zy{}~{}xwyzy}ќɧswxsuvyz~tuy}~xy}}|~}~~||{|x}~z{~z}~~}~~~|~~~~{yy}{{~}|xvu}|{yxzxw{z}|rmlvsr{z|}~{~|uww}jjjvuy{}~xz{~~ussmkkxvv~~~{}~{}}z|}z|onrbgh}|~~}}z|{}zuwytvupr|~|wyzuw{vx|wy~y{}~xsu}xz}xz~z|{}~yz~yz~yz{|}xywrtytvxrtwrtzuwzuwzuw}xsuwrtwrtzuvrmnqlmzuv{vw{xzzwyvsuwtv{xz|z|yuzxty{|x}xtyyuzxtyvrw{vrw{xzsprvsuyvx}z|vsuwtvurtxuwyvx|~zwyurtvsuvsuvtvzuwyvxqprzy{prsoqrkiksqsvsuroqtqsqnpsprpmoebdjgilhjgdfkhjebdebdXWYa`b\[]bacfegMNRMNRNQUPUXOVYMVYNWZOX[OY\R[^V]`Y^aW\_UZ]Y^aZ`c]`d_bfY\`dgkbeibeibeibeicfjbeidfjadhdgkY\`adhjmqjorhorfmpmvylxz[jmfwz^qtex{k]pscoqiuwhtvhtvgsupy|sz}kpsutxvuyruyqvyv{~sx{sx{v{~nuxnsvpswrswrswrvwuyzvz{rvwfjkjkoefjqrvqrvoptnossprnkmroqqnpurthhhkkkkkkvvvtttxsuzuwxuwwtvmlnlkmurtwtvvsuurtxuwxuwxuwxuwpmoxuw{xzxuwxuwwtvxuwxuwkjlwvxspr}xzx{vsuvsuvsuzwyzwynmomlnxwyxwyyxznnp~}suv~}z{z{xy}z{yz~|zz~|{~~~{{~}~~}~}~}~|z~tuy~{yyz|}~~|{}|~~}zpp|{~}|zy}~}}}~npqxxxqqq~}}~{}}}vuyɠǴǢmrs|~}|~~y{}{}{}z|{}|~zuwzuw|wy}xz~y{|wy{vx|wy}xz}xz}xzz{z{z{~yz}xy{}|wyzuwzuw|wyzuw~y{{vx{vxwrtzuv{vw{vwzuvupqvsuurturt~{}|~zvz{w|{}y~}y~}y~xtysot~z}y~wtvvsutqssprliktqsvsu|y{vsuyvxyvxwtvvsu|y{zwyyvxzuwvrtonppoqprsuwxpmourtifh[XZdacmjlmjlnkmplnliklikjgijgikhjfcea^`]\^a`bUTVVUWWVXMNRMNRNQUOTWNVXNVXOVYPWZRX\T[^U\`Z_bY^a\ad^cf\ad^`d_bf[^bcfjadhbeibeibeibeidfjadhilpgjnmptilphkoglopwzfmpwwcqtwk|k~vpunz|nz|frtiuwluxry|jprvuytswrtxotwotwuz}w|qvynuxnsvpswrswrswrvvquvptujnoeijvw{mnrlmqoptqrvrswzwyyvxtqsjginkmhdgjfihegwsvvsuztwwrtwtvvsuutvrqsxuw|y{yvxvsuvsuxuwxuwxuwtprvtvsprsprurtwtvzwy{xzjiktsutqssnpvorwtvvsuxuwyvx|y{yxztsuvuwzy{yxzlkm{z|ghiȬͩqst|~z|z|z|{|yz~|zy~~~{{}y~~~}~~}}yww|zz{|zuv{}~}}|~}~~~||~}wzx}|||~qstljjqoovtt{yy~~~{}}ˢʮòƿΓÞw|}{}~{}}xz{}{}z|~y{z|z|~y{|xzz|{}~y{|wy}xz~y{|xz|xz|xz~zz~zz~zz~yz}xy{vx{vxzvx}xz|wy}xzzuwzuw{}|wyzuvzvv|vx|wxzuv~{}{xzsprnkmnkmxtx}y~{}y~zv|rnstpuvrwuqv|x}|~wtvyvx~|~zwy}zwysprzwyzwyurtwtvurtyvxxuwzwyzuw{z|nmoprsvyztsusrt\[]gfhmjlolnkhjolnkhjjgimjlifhjgigdfdachgiihj[Z\bac^]_MNRMNRNQUNTVNTXPUXQVXRVZSX[UY]W\^T[^U\_X`bZadY`c^ae_bf^bfbei`dhbeibeibei`bffhl`bfjmqhjnfimcfjhkohmphorjqthqtcoq_kp`lr]krZjp\msgx{^jleqsiuwlxzkwyjsvnuxlptvuysrvqtxsx{uz}qvylqtpuxnuxnsvpswrswrswquvostnrsmqrnrsqrvnoslnrpqurrvstxsprtqsroqjhjtqsnlmqnppmotrsurtohke`bpmoqnpsrtrqsqnproqzwywtvvsuxuwxuwxuwwtvvtvpmoqnpurtzwyurtroqhgixwy|y{xsu|uxwtvvrt|y{wtvwtvnmoqprzy{yxzxxzutvvuwzy{}z|||||||{|zxw~~~{{xty~~wvx}|~}|~~}|{}poqwyzzxx~||vts~}~}~}|zy~}~{z}{zvwu|~~|||}}{yy}{{}}vuyαũƜ}~{}}xz|~{}z|~y{z|z|{}~y{~y{~y{}wrt{vxzuw|vx|vx|vx~xz~xz~xz}xy|wx{}~y{|wy{vx|wy~y{}xz}xzz|vqs}xzzuv|vx}xy~yz{vwzwyvsuurtxtvpmovrwxtyplqwsxyuzvrwtpusotvrwnjo|y{}z|wtvolnolntqswtvpmovsuzwyxuwwtvxuwxvxxuwojl~yxzsuveijnmosrtpoqcbdnmonkmgdfmjlkhjgdflikolnkhjlikgdfdaccbdihj\[]bac]\^MNRMNRNQUOSVNTWPSWRTXTUYTVZXX\WZ^U\_V]`V^`Zad\cf^ae_bfadhbei`cgbeibfibei]aehjo]adgjneimlosehljmqouxjruhpsdmpeqtfov_ip]hn]jqaqwbpsiuxmy{tkwyhsvjsvgmqmrusrwsswqtxsw{oswkpsnsvlquouxnsvpswrswrswptuptuptumqrptupqupqulmqstxqrwpqvjgikhjieggdfolnmhmuottntvouvqvz|~z|sprqprwvx~z||xzxtvwtvzwyxuwxuwxuwwtvxuwtqssprvsuzwyvsutqslkm~}yvxyuw}wywtvurt~{}wtvyvxxwywvxxwyyxzyxzzy{|~utv|}}}|~||y{~||}|}|~~~||{zwz|y{|y{|utv~}~qor~~~vxx|~~~w}}}z|}||~ztuzxw}~~}okj~~~~~xxx}|~||usswvu{zy}}~}imqƩ}|~~}{}{}z|~y{z|z|~z|{wy|wy~z||xz{}}xz{vx{vx{vx{vx}xy}xy}xy}xy|wxytv|wyupr{vxwrt~y{{}z|z}ytvzuwzuv}wxz{wrsytuwtvebdwtvyvxxuwxuwxtzyuzwsx~z~zxtywsxvrw~ztqtxux|x|wswwswyuywtvurt~z|{xzurt{xz{xzxuwzwytqssoqusuvuwrqskmnorsrqsutvutvsrtqprqnpmiknkmmjlheglhjjfhifhplngdf`]_^]_`_a^]_]\]ZY[MNRNOSOPTNOSOPTNQUORVRVZTW[VY]TX\T[^`gjU\_ZadW^a^^b_`dadh[adafiagj[be`gi]dgflodknbipkqyaktZdpcnzaks_iqbjrmt}ekthmvdjs_fmmtynvynuygnvny~q}iy~ew|p}|jrqlpqmqrtyyekl`hh^gfmvumuunuuquvnrsqvvptuostoqrprsqstprswyzrtutvvuwxwyy{}~rqsmlngfhfegfegfegjhjwvxsrstsuurwvuytsxsrvrquqptrqsvuwttvssuwvxyvxyvxvsuvsuvsuurtvsuwtvxuwyvxutvutvwvxutvwuwutvxwyzy{utvxwywvx{z|xwyyxzzy{~z||y{~}y~}{}~{xz~{}}{}~{}yvxvru}~~}}~|{|zy}{z~||~|{}}|zzxvv~}}}}~z}~z}~~~}|{}urt|}~xyxvuz{~~}}|~~~~~}~~~|~}z|yy}ƶªŹ˧ͪz|qos|{{}|~|wy~y{}xz|~}xz}xz|wyzy{z{|wxyyz{ttv~}~y{{}~y{{vx}xzzuwzuwzuwzuwzuw{vx~y{z|zuwvqs|~}{{}{{ywwvttwvuywwxvv~}|trrvsuxuwyvxzwyzwyyvxyvwvsuvsuyvxwtvwtvzwy}~xuvurssoutpwwrz{w~snvvrxxuwpmoxuw{xzvrtvuwwvxwvxlkmwwystuorrqstmophjkprssprlikpmoqmojgidceihjjjlihjnnpiimedhddhbbfbaebaf^]a_^bUTXZY]ZZ^NOSOPTPQUMNRMNRQTXORVPSWTW[VY]TY\U\_]dgX_bZadU\_^`dabfbei]be_dg^eh[beY`c[beagjagkemtir{hr|emzjvp{dow}t|hmvdirglulryouznuxovyow~lv~o{jx~fv}cqpkssimnmqrpuvqyyt||owwmuumuunturvwquvtxyrvwostoqrprsqstmopsuvtvwoqrtvwmopgijXZ[mlnpoqnmorqsjiklkmmlnttvwvxyxzzy}vuywvzwvznmqtrvtrtutvtsuxwytsuwtvxuwvrtvrtvrturtvsuwtvsprvsu}z|tsuutvvuwttvvuwwvxwvxwvxwvxutv{z|wvxzxzxxzzxz~z|x{vrw}z|}~{}{xz~{}urttqswtv|~~}~}{z~|{}|~~wuu~~vuw~y|z{|zxz|z||y{{|{|yst|}|}vqpusr~yz~yzztuztu~xyvqpzz|}~~~|||y{{suu~}zy{xwy~tsu~}~wtv|~~|tswļίx{tuy|~{}~}xz|wy|~}xz~y{|xzyxzwyzz|}y{|rtuvuw~y{{}{}~y{|vxzuwzuwzuwzuwzuw{vx}xz|xz~y{zuwytvussxvv{yy{yy}}zxxvttwuuzxxvttxuwwtvzvxzvx~{}roqyvxwtvzwyxuwvsuurtqnppmotqsvsu{snx{v}qlu{w}yvxnkmvtv|y{yvxwvxwvxwvxxwyzy{rtunppkmnjlmnpqqstmjlnkmurtsprjgibbdhgikjlkjlihja`dgfjgfjedhdcg^]alkodcgcbfdcg^]aLMQMNRNOSSTXTUYQTXORVPSWTW[VY]TY\U\_X^bW^aV]`V^`\]a[^b^ae[`c[cf_hl`inZcgWae\ei^hl_ipbktcmwanzap|_jr_jrajseluinwlqzgludjqouzdknrz|lvyeptkw{hvyjwzannahhrturtuotupuvtxypuvotuotuotuostswxrvwquvostoqrprsqstmoprtuqstuwxuwxtvwjlmjlmvuw{z|tsurqsutvsrtrqssrtvuwqpronrnmqposyx|mlpvuytsuttvtsuxwypnptrtvsuurttrttrturtvsuwtvxuwspryvxutvtsuvtvtsuutvsrtxwy{z|}|~vuwzz|wvxyxzxwyyxz|xztwy{{gjnvuy~}z|}wtvvsuxvx~~~|{{yx}{z~|{}|sqqyww}}ljj}}wvx{}~}}}yxz}~}~|wxtop}~~}~|{yy~~~sno~}yww{~~~zy{~}}urt~}͟}~~{vx|vx|~z|~z|~xzzy{vxzz|}vxyxz{}|~}xz~y{z||wy{vxzuwzuwzuwzuwzuw{vx|xzzuwzuw{vx{vxywwvtt|zzywwzxxyww{yy{yyxvvzxxzwyzvxzwytqsvsu}z|zwywtv{xz|y{vsuurtwtvtqsvsuuqwqmstpv{w|gch~zzwyroqtqszxzzwyyxzonpzy{srtkjlprrlnomopmopqstprsolnnkmifholnpmo`_a[Z\ZY[gfhedffeigfjbaedcg[Z^`_cbae[Z^[Z^_^b`^bIJNJKOKLPNOSFGKNQUORVSVZTW[VY]TY\RY\RY\SZ]U\_Y`c\_c\^c\be]ehbilclpktwbko_hldmqhrumv~mxjvmzjwepxnwkr{pu~joxfkthnusy~lsvqx{xkvzjuyitxlw{lxxglmx{|uxxqvwtyzrwxtyzpuvotunstbfgmqrmqrmqrptuoqrprsqstoqrrtvsuvqsttvwiklqstoqrvuwxwytsuwvxpoqxwyutvsrttsuutvrqu{z~}|vvzposwvzutvtsuvuwutvkjlroqurturttqstqsurtvsuwtvvsuzwywtvutvtsuutvsrttsuvuwxvxyxz~}tsuzwy}z|{xzyvxzwy}xzxnqˠ{svz}~{}zwyxuwyvx|y{~{}~}|}{z~|{}|~||~}~{}~x{y{~|{}|}|~|~xz{}||~}|z{nijz{|}~~~~zz~}~~|{~}|~~}edfqpr~{}|y{~{}|y{vsuifh{qpt~α´Ųty~vz~}|~y{xsu{vx|~{}z|~y{~}vxyxz{vxy|~~}~y{}xzz|vqs|wyzuwzuwzuwzuwzuw|wy|wyztvytvwrtzuwzxxywwywwxvv{yyxvv}{{trr{yy~|||y{urtzwy|~wtv|y{sprqnpzwy{xzwtvurtvsuxuwvsurnt}y{w}tpwplqtqstqstqsyvxvsuxvxtsusrtwvxwvxlnooqrvxyuwxnpqlnoxuwnkmtqsroqkhjdceihjtsu_^`dceihldcgcbfa`d^]a`_c`_ca`dZY]`_cbaeIJNLMQNPTPPTSTXQTXMPTORVSVZTW[TY\RY\RY\T[^QX[Y`c^aeZ_bbhkX`c]fi_ioakreovblsV`h[em`lrbmu\gq[iu]my^iq\gofoxhoxbgpfktchqou|flqry|rz}n{}frtclpktwmuxissnstjikxwympqostrvwotulpqnrsrvwz~swxmqrrvwostoqrprsqstprsrtuprsqsttvwxz{qstrtuutvtsuwvxvuw}|~~}yxzutvyxzzy{srvdcgsrvtrvutxrquqprtsuutvihjlkmroqtqstqsurturtsprtqszwyxuwzwywtvtsutsutsutsutsu{z|utvrqssrtutvtqs{xzzwyzwy{xzz|{ruÑsrt|{}\_c~}yuz~{}~~{}|~~{}}z|~z|}|~|{~|{}|~}~~~~~~}}}}vuw~}|~tvv}|~}~wvxz{~~~}{{~~}~vtt~}|zzhjjxwy~}|y{~̫ïʵïz}~ytv{vxzuwz|z|z|z|~y{~y{zy{wyzz|}uwxsuvyxz}xz~y{{vxvqs|wyzuwzuwzuwzuwzuwxsuz|ytvwrtvqsxsu|zz{yyxvvxvvzxx{yyxvvvtt{yyqooroqurt{xz{xzyvxwtvxuwzwy{xz{xzxuwwtvvsuurtyvxwtvvrw|x}|x}|{w|ytzvsuwtvurtwtvxuwwvxnmonmoqprrprnpqmoprtuprtoqrkmnmjlqnpebdolnifhgfhdcea`bmlnedfbae[Z^baedcgbaea`da`dbaeZY]baeXW[IJNMNRQRVOPTRSWORVNQUPTXSVZTW[TY\RY\RY\RY\V]`W^a[`cZ_b^ehforbnpeoveoudnufpwiszdovams_muapyaq}csfqy`ksZclhoxot}uzkpyu{kqvt{~t}udppjrqnvvpuvfppimntsuonprtulnouwxrtukmnoqrsuvnrsostquvostptuoqrprsqstlnorturtuqstprsoqrmopsuvtsuwvxtsuqprxwytsusrtqprxwyyxzqptqpt{z~pptposyx|utvtsu}|~~wvxxuwxuwurturturtxuwxuw{xzxuwxuwwtvtsutsutsutsutsu|{}qprutv~rqswsu}xz|wy}xz~xz~xzkcfɣ|z|`cgutx~z~{}~{}~{}~{}~{}~{}}~|{~|{~|{}|~}~~}}~~yxz|{}~{}~qss}uwx~~zy~~~~~}}}}|}|~}wx{yy|y{~}yxz|{}}|~urt~zǧњty|{}z|ytv{}z|z|z|~y{~y{zy{uwxz|}tvxtvvxxz}xz~y{~y{ytv}xzzuwzuwzuwzuwzuwxsuz|ytvxtvwrtxsu{yy{yyywwwuuvttyww|zzusstrrxvvzwyyvx{xzzwyxuwwtvwtv|y{wtvyvxzwywtvvsuurtolntrtwtv}z||y{}z|vsutqrvsuvsuroqzwyxuwutvvuwsrtnmorqsprsprskmnmoprtumoplikpmonkmhegroqedfcbda`bljlihja`dZY]]\`cbf`_c^]aZY]^]aZY]^]aWVZLMQIJNGHLLMQNOSORVPTXRTXSVZTW[TY\QX[SZ]RY\X_bW^a[`cZad^eh\hjS_aWciXck[fnVai]hpZem]kq\iqZirYiuXjualt^iqYbkfmvtyuzlqztzmsxjqtfordppdppkssotulpq`hhsvwyvxxuw||~npqvxyqstqstqsttvww{|txyrvwostnrtoqrprsqstkmnsuvrtutvvoqrsuvnpqprstsuwvxqprvuwxwytsutsusrtsrttsuqpttswrqunmqqpt{z~|{}tsuonputvnmourturtsprurturtyvxxuwyvxvsuvtvxvxtsutsutsutsutsu{z|poqxwyutv|vx|xz}xz}xz~z|{uxc\_}}rtu|loswvz}z||~|~}z|~{}~{}~{}|~}z|}}~|{~|{~|{}|~}}}}{{}{{~~~~{z|wvxyxz|~|~~{}~}|~~yz{|{z}|{|z{~~~}}}}|}|z{~~}z{y~~~wyy~}|~}Ѩͤ͵èrwz~|~|wy{}z|z|z|~y{~y{zy{uwxvxytvvsuvxwy}xz~y{|wyytvzuwzuwzuwzuwzuwzuwzuw}xzztv{vxwrtxsuyww{yyywwyww|zzzxxyww}{{zxxtrr}z|{xz{xz|y{|y{|y{yvxsprsprwtvyvxwtvvsuurttqstqsyvx|~{xz}z|wtvyvxzwyxuwurtzwytrttsurqsvuwvxysuvjlmqstnpqvxypmoolnolnmjllikihjgfhedflkmihjedh`_c`^bcbfa`d`_c_^b^]a[Z^ZY]WVZKLPKLPJKONOSQRVLOSRUYRUYSVZTW[TY\QX[SZ]V\_V^aW_b]be^dh]gjOZ]T`cVag]gpfqy`ksaltfrz`nu]nt\lu[kwZkw_jrYdlYbjeltpt}os|nrzsxntwjpsgorfrriuuowwqvwmpqgoouxyuruwtvpproqqoqrlnnmopoqqtvwx|}dhiquurvwlpqoqrprsqstnpqtvwrtuvxysuvsuvmopprswvxwvwzy{nmo{z|vuwtstqprsrtvuvtswwvzutxrqu]\`tsusrtqprpoqsrtrprvtvtrttrttrtwtvtqssprurturt{xztsutsutsutsutsu{z|utv|{}tsuwvx~y{}vy~wz~wzy|zsvjceŜsx}xytuvmqu{{~~{|~zwy~~{}|~}|~{xz~{|}{z}{z~|{}|}|~~}|{}|~||~rturtuy|zvzv}vz{ors{|}~~{|~}~|}|}{z|}}xy~~~{{~~}~}xy}|uzz~Ʈʮ~~y{xsuz||~z|z|z|z|~y{~y{qtutwxrtuqtuwxy}xz~y{z|}xz|wyzuwzuwzuwzuwzuw{vx|wyzuw|wyxsuwrtxvv{yy|{zxvvxvvxvv~||}{{ywvtrrzwywtvxuwzwyzxz|y{|y{rpqtqswtuwtvwtvurturtvsuxuwtqsxuwtqsyvxvsu~z|~{}{xz~z|yvxqnputvmlna`btsuutvxyzprsmnpnpqnopooqtprtqsolnpmomjllkmhgigfhwvxkjledhbaebae^^b`_ca`d_^bbae_^bZY]ZX\JKOIJNLLPKLPOPTRUYORVSVZWZ^WZ^RWZPXXPZZR\aR^bU`f]bm`do[`kY]g\blbhpbjq`jq\jo_ot]ls_ku_ku`kv^lu]ktakr`joflqjoplnqllsooxikphinnqrswxluunvvmuumuujqrlttnuvhophpplrsqtxruyhkojmqorvpsworvnqvmptvy}pswqrvqrwrswuvztuyrturtunpqqstqstsuvutxutxrquutxwvztswtswtrwutxutxutxvuyutxwvzutxqpttsutrtrqstsusrtruvjmnimnmpqmpqmlnolnroqurturturtvsuvsuvsuvsuyvxxwyzy{srtsrtwvx~}ywy}{}{}z|{}wx}}}~s{{y~|~~{}vsu~}zy{}|~zy{zy{yzzzz{{||yyy|||qpr{z|~~zy|}~}}~~{}vz{~~{}~wqs}~}~|}}~~}~|~|}}~|~~~~~||}|~~}ĎÜz||~{}~z|~y{}xz~xz|xzquvt{|v{|u||sxytxy|wy{vxzuw~y{{vxxuwxuwxuwxuwxuwxvxwtvxuwpmoroqwtvyvxyvxxuxxuwurtyvxxuxyvxwtvwtvtqsxuw~{}yvxyvxyvwxvuxvuxvvvtswut|{}xwyihjutvjiklllqqqsttxyxwxxyzyvuwtsuvuwtsuqprxwyjiktsusrtusuururoqomonkmomomlnonpfegnmogfhminsotiejeafhdic_deafeaf]X]b]b`_c^_c]_cYZ^[\`Z[_KLPJLPMNROPTRSWPSWNQURUYTX\WZ^SX[RZZS]]R]aP\`T`f\fp]eoYcmZbmblvgoxhpyeoxcpxhxdu|dpzdpzeq{bnx_kucmtbkodjoeijhjkllrlktooumnroqrjnonvvktsgoogooiqqjrrjrrgoojrrjrrknrorvmptjmqmptpswmptmptjmqpswdgkstxuvzvw{stxnosqstprtnpqhjkqstsuvttxttxutxttxtswxw{{z~vuyttxttxsrvtswsrvsrvtswqpttsutsutsutsuqprptujnojnpkopkopmlnolnqnpwtvwtvvsuvsuvsuwtvvrtxuwvuwwvxzy{xwy{z|~xwy|~}|~~|}~{uz{|z~}|y{xuw|~}z|zy{~}}|~}|~{z|xxxwwwxxx|||}}}}|~~}~}|~~}npq}{}~|}}~ztu{uv}~{||}~~|}}~~~~}~|~}~z{~sqquuu~}strw|}{~|~~|}}orp{~̶ȝ}z||~{}z|z|~y{|wy{vxwyztyzvzzuz{txxwyz{vxytvzuw|wyzvxxuwxuwxuwxuwxuwwtvurtvsuqnpmjlzwyyvxyvxurtxuwsprxvxxvxxvxwtvwtv|y{}z||~xvxxvxxvvxvuxvuxvvwutxvuzy{tsu~wvxvvvyyywwwzzzvvvsrtsrtsrttsuutvxwypoq~}tsutsuxuwurtrprsprolnnkmihjmlnnmofegonpokpnjofbgeafjfklhmiejfbgb^cd`eedh]^b\]aXY]\]a^_cFGKKLPQRVOPTQRVSVZNQULOSRUYWZ^UZ]S[[S]]LW[O[_[gm[ir^is^ku]hr\isU`j[fp_kv\ktXitXhq_ku_kudpz`mw]isakrbkodjpfjkgijjjplktppvmnrprstxyptvmrsfklfkllqrnstmrslqrmrsmqrknrfimux|y|qtxnqupswjmqwz~ruyruyrtxstxtuyz{vw{prrnpqnpqnpqsuvqsttrvtrvvuytswrquutxzy}tswtrvtrvtswutxtswutxutxvuywvxwvxsrttsurrtmqrmqrlpqmqrmqryxzvsusprwtvwtvyvxvsuvsuwtvurtvrtwvxyxz{z|zy{|{}}|~{z|~{}}z||wy{}Ϡlsvy~y~}~{}}z|urt|~|y{zy{~}utvxxxwwwzzz|||zzz~}}~}z~}z|~|}z{|}~z{~}~yz{||}|}}~~~}~||}~}~|}~~~~|}~~z|{}~}yvx~w|{qwuƯßǐ}{}z||~{}~~y{{vx~xz|wyzxzxyzzxzvwxxvxzxzytvytvzuwxsuztvxuwxuwxuwxuwxuwwtvurtvsuxuw|~vsuxuwxuwspr{xzsprxtvxtvxtvwtvwtvjgiroq~{}xtvxtvxvvxvuxvuywvxvtywvyxz{z|~}yxzuuuwwwsssvvvrrrtttrqsrqsrqstsuvuwwvxtsuxwyrqsmlnqnppmosprqnpsprwtvmlnkkmllnkjljikokpkglgchkgliejmingchb^cd`eb^cdcg]^b\]aVX\WX\UVZGHLGHLKLPOPTPQUNQUKNRNQUPSWVY]V[^RZZR\\VaeNZ^R^dPajTdm[lu\luZktWer\jw`m{ZguYetftdnxdnx^hr^hr\fp\fm`imflqfjjfhhkkqonwmmspqufhipstmrsnsthmnejkkpqkpqjopjpqlqrotupswknrjmqgjnhkoqtxy|ilpknrilpgjnqrvoptlmq_`doptmopkmnnpqnpqprstvwsrvsrvsrvsrvsrvtswutxvuysrvsrvrqutswrrvutxsrvtrvtsutsuonpsrtutvlpqnrrmqrkopkoppoqqnpspryvxyvxzwyvsuvsuwtvtqstqssrtwvxsrtwvxvuwvuw~}{xz|y{zuw{}ytuy²Ĩejmx|}w}{z{|~urt}z|zy{~|{}srtzzz{{{{{{zzz}}}~}}~{}}~{}|~|~}|~|~~|~~z{|}|}~|}~}~~~~yz}~|}|}}~~}~{|}~z{uz}~}|{}~vtv|~~{}ˑmw~}z|z||~{}z||~|~{}z|}xz{wy{uxyuw{uw}xzytvwrtzuwvqsytvxuwxuwxuwxuwxuwxuwwtvwtv{xzpmotqswtvwtvurt}tqswtvwtvwtvwtvwtvurtxuw}z|wtvwtvwuuxvuxvuzxwxvuywv{z||{}yxzrqswvxtruwvxrpstsusrtttvsrttsutsusrtvuwrqsonppoqxuwpmoolnqnppmoroqtqsvsuhegqmoqmonjohdiiejb^cc_dlhmgchc_db^c^Z__^b`ae_`dUVZXY]XY]GHLFGKIJNMNRIJNRUYJMQTW[QTXX[_RWZQYYQ[[WbfXdhYekN^hTenXirQbkN_hIWdWer^ky\guT^lYdp^gq^gqV_iYbl]fp^ho`imekpeijdfgeekkjsooumnrkmnjlmptumqrmqrjnohlmmqrkopimnlpqnrtnqunquwz~tw{svzmptnqupswmptnqulptstxqrvoptoptqrvsuvoqrmoprtuuwxrtuutxsrvsrvpostswutxwvzrquqptrrvutxqptqpttswposqptsrtwvxonpsrttsuptunrrmqrlpqnrrtsusprurtxuwzwyvsuwtvwtvvsuurtsprutvvuwvuwtsu{z|tsu{z|~{}~{}z||wyoptЖotwx|}zzz~{}~|y{|~}z|yxz|{}{z||{}zzz|||yyyxxxyyyzy{srt}|~~}}|~}lik{xz}|~xvxtvwz|}y}~prs~{||}~|}|}|}~{|{|z{}~}~~}~~{|}~~~yz|}}{|z|~|~x}Σ|~}{}z|z|z|~y{}xz~y{~y{~vywzx{~vyvy{twwrtxsuwrtvqsxsuyvxxuwzwyzwyxuwyvx|y{~urtxuwzwyyvxyvxvsu|~xuwxuwwtvyvxwtvwtvyvxurtsprxuwxuwxvv{yx{yxzxwxvuywvyxzvuwyxztsusrtvuwqprqpqwvxtsusrttsutsuutvtsuttvsrtrqsrqsrqslkmwtvroqolnlhjmjlnkmpnpjginkm\Y[mjliejlhmgchb^cb^ca]bgchhdia]b]Y^]\`\]a^_cVW[WX\cdhFGKGHLJKOMNRKLPLOSHKOORVMPTVY]UZ]RZZOYYQ\`UaeUagK\eVfoSdmRbkVgpbox[gqalwckuelx`hr`jt^gqXblZdn^gq^ho`imekpfjkeghfflhgpppvoptprsjlmprspqroqrlnolnoprrmoplnnvxyopqpswruyz}qtxgjngjnloslosorvtw{orvqrvqrvoptrswpqujlmqstprsprsz|}rtutswtswrptonrrrvutxvtxrqunmqrquonrnmqllpvuyposqptsrtwvxrqsonppoqkoplprmqrnrsnrtutvxuwtqsolnkhjvsuvrtvrtroqyvxurtvuwxwywvxwvxwvxwvx~{}}|~}¯wz~q}w~x{|~zzz~{}}}z|}z|}z|zy{|{}{z||{}utvzzzxxxxxxvvvwww||~}|~zy{~}zwy{xz}z||~|~|~}|~{y}~~qlmz{z{{|{|{||}|}|~z|}~}~}~~~{||~~~{{{xvv~|~|~yvx}|~~u}~z|~z|~z|z|~y{}xz}xz}xzx{y|z}y|ux~wzwrtxsuwrtvqsxsuyvxvsuvsuvsuurtqnp~~zwy{xz|y{yvxxuwxuwnkmnkmyvxwtvyvxwtvwtvtqsurttqsxuwxuwxvvxvu{yxusrxvu}{zutvxwyvtvutvvuyvuyrqvxw{utxvuywvxpoqnmoqprtsutsuwvxxwysrtkjlurtsprtqsifhnkmroqrmoniklgihcermonjo\X^hdid`ed`ec_dnjoeafd`ekglhgkbcg_`dZ[_YZ^cdhCDHEFJHIMOPTMNRLOSLOSNQULOSSVZUZ]OWWR\\U`d[gk\hnZhq]isUclYeobpyeqyYck^fo`engjtcdnbhs`ep_ep`fqbgr^ho`imekpfjliklzzlktjjplmqtvwqstqstqstoqrmopmopprsnpqlnpvxynpqorvorvnqugjntw{vy}orvorvorvtw{orvqrvqrvstxstxqrvjlmrtunpqprsrtusuvtswtswposnmqqpttswtrvrquqptsrvlkonmqjimvuyqptrqusrt}|~trtpoqpoqkoplprmqrostptusrtvsuqnpurtxuwyvxvrtvrtroqyvxvtvtsuvuwutvwvxwvxwvxtsu|y{zwyz|~{}ȝt{~]`dsw|losruy|~}{{~{}|y{|~}z|}z|zy{|{}{z|zy{|{}zy{zzzwwwxxxvvvwww||~~}wvxxtvtqsurt}z||~~yxz~}{z|}~kop}~~}~}~~}~}~}~|}}~}~{||~|~}~~~{|||}~yyy~~~||yz~srtpoq|~~~Ɲ~~z|~z|~z|z|~y{}xz|wy|wyx{x|z}y|vor}vywrtxsuwrtvqsxsuyvxwtvtqsurturtwtvxuw|y{wtv|y{|~|y{zwyxuwwtvyvxzvxwtvwtvwtvwtvpmonlnifhxuwxuwxvv{yxywvsqpusr{yxvuwvuwwvxrqs|{srvzy}vuyutxvtxrqsonputvvuwsrtvuwsrtqprsrtkjlqnppmoqnpnkmliklikojlplmgbdjegmijminiejjfkhdigch^Z_\X]_[`c_deafhgk^_c[\`]^bPQUGHLFGKGIMLMRPQUMNRJMQNQULOSNQUQTXQVYPXXPZZLW[UaeUagYcm\fp]gq\eodmxYai[bh_dk]`f__hcen^eo`fp_do_eoafq_inahmfkpglljlmiio`^hllrlmqklmmmolnnlnoqttnpqmopqstnpqmopoqrnqrnptorvorvmptlosnqunrvnqunqumqumptoptqrvstxrtxrswqstrttjlmsuvwyymopsrvutxvuytswwvztswrqusrvyx|wvzqpuvuypostswrquwvzrqswvxtsuwvxtsuostnrrmqrjmnkoptsutqswtvurturturtvtvvtvvsuxtvwtvutvxwywvxvuwrrttsuttvzxzwtv}yz|x{ēruyy{|~}{{}z|{xz~{xz}z|zy{|{}{z|zy{yxzyxz||{{{zyyyxxxyyy|{}|{}yxz|{}xwyifh}z|roqtqs~{}zxz}|~zy{{z|xz{y{|~|wyzuyz|~~~|}|}|}|}{|}~~{|{||}~}|~}}~}xyw~|~{}z|z|z|~y{}xz|wy|wy{wy|xz}y{rnp~z{wrtxsuwrtvqsxsuxuwzwywtvzwywtvurtwtv}yvxvtvtrtyvxvsuxuwqnpwtvzwywtvwtvwtvwtvsprurtpmoxuwxuwxvwxvuywvtsrrposqpnmoutvyxzqprrqsvtynlqljpsqwrpvsrvutvqprqprwvxvuwrrttsuutvsrtnmoroqpmoqnpolnmjljgilehvorohkoikpilVRWiejfbgeafb^cfbg]Y^^Z_`\ac_dZX\\\a]^c^^cXY]YY^?JMCNQFRTEPR>IKGNPJPRLQTINQKQSQVYMTWLY[FWYS`b\aeWdlXemYgoUckcpx`ej`aedfj`aeabf_bg_ei_dgbdikjnhejegkgimikoghlghlijqlktmkqposnkmnkmlmqmnslmrijnnosoqrprskopmrsjqqlptloslptlosloslosjmqmptmnrpptomqtrvsquyx|tswqptqrvnosklplmqtuystyqrvqrvvw{rtxstxoptklppqutuyuvzxwytsuqprqprqpronosprpmoroqurtvsurrtrqspprqprqqsvsuroqroqvsuvsuvsuwtvwtvtqsvsuwtvyvxvsuwsuxuwwtvtvvpvt}ʡfegzy{|{}}|~~xuw{xzzwy{xzzy{~{z||{}|{}|{}|{}|{~}|~{z||{}|{}}|~{z|~{}~~~xwy~}|yvxzwy~~|}|}||z{|}}~|}}~~~~~y~utxy{|zy{}wuu~}ãūêljl{}y|{~z}~y{}xz|wy~y{zuwwxyvzztwxtwxuyzvwyxsuwrtwrtwrtwrt|vx{}|wywrtzuwytv{vxytvzuwytvysuurturttqstqsvsuxtvxuwtqsurtwtvwtvroqxuwyvxxuwwtvurtxuvvsutqrtpsxwyutvtsusrtutvrtunpqrqtyxyyvy}}z|roqroq|y{xuwtqsvsutqsolnpln|y{zwypmonkmlikmjlrmrminjejiejkfkiejhdijfkd`eb^cb^cgchb^cc_d^Z_\X\`\^^\^b^`TRT\XZ>JLCOQ@LNEQS?KMGNQINQJORMRUPUXV[^MUXN[]LZ]Q^`TZ]T^f[fn\goYdlcnvdhm^_ccdh`aebcg`bfcgjegk^]anjoohmfgkhimjkoklpklpfhpjirkiolkokhjlikmnrnosefjabfklpoqroqrjnomrsmuujmqjmqjmqlnrlnrlnrmptmptoptposonrwvzlkorqusrvqptpqunosoptqrvqrvstxqrvqrvstxqrvqrvmnrklpoptstxtvzutvrqspoqonpqprrrtolnlikrnpurtvsusrtrqsqprnmonmotqsroqsprsprsprsprtrttqsurtvsuvtv|y{urt}z|tqswtvsuuv{z~Ü~psw|vuw~}~}}|~|~yvx{xz{xz|y{{z|~}|~}|~{z||{}|{}~}~yvx~}~|~}}z|}|~qst}dfgw{|vz{|~tqs{~{~yru}vy}|}{|}~|vwxrs~}~~~|}z~~~~z}~~~~~|||~~}y~ɬx|z}y|z|{}{}~y{zuw{z|z|}xz{vxyvxyxwyxsuwrtwrtwrtwrtxsuytvvqszuwvqszuwwrtytvxsuxsuxsuurturturttqsvsutqswtvroqtqs{xzroqpmovsuwtv{xzvsuurturtwtvurturt}|~tsupoqrqsonpkmnprsrqspoqvsuvqsqnpwtvhegjgipmozwytqsyvxpmoxuwpmosprpmomjlpmolikd`ed`eiejkglnjohdieafa]b`\a^Z_\X]]Y^ZV[b^da]b^Z_a^`^[]_\^\Y[`\^?KMGSU@LNIUWJVXLSVKPSMRUNSVQVYV[^OX[R_aO\^O[]QX[Q[b[flXbiZdkZdkbej^_c`ae_`ddei``deeigfjfbgminlfkfgkhimjkohhlhimfhpjirkiojimkhjlikdei^_cfgkmnrtuynpqnpqjnnlqrkssjmqjmqjmqjnrjnrjnrlosruyrswqptrquutxsrvkjnonronrmnrijnmnrstxrswrtxqrvqrvtuytuyqrvlmqnosoptrtxttxtsurqsqprtsurqspprroqpmoqnptqsurtsrtrqsqprqprnmoqnppmoroqsprsprsprsprtqsvsuvsuvrtvsu~nkmtqswtvuvvy{{vxyrrvͪɢ«sx{srtwvxzy{|~xuwurt}z||y{yxzzy{zy{~~~}|~{z||{}|{}zy{kjl~}~~vsu}z|~{xz{xz|y{}z|xz{~}}|~~{}|yru~z{}~{|}~~yz|}~~~~~~~|{}~~~~~yvx}z|}|xtyvrwƪ|~|~~y{y|x{~y{|wyzuwz|{vxwvxvyytvwvxyvxyxwyxsuwrtwrtwrtwrt{vx|wy|wysnpwrtvqswrtz|xsuxsuxsuurturturttqsvsuroqxvxroqqnpxuwkhjurtroqwtvxuwroqurtpmowtvtprtprrqsfegqprwvxpoqoqrsuvonpzy{heg{}urt|y{wtvwtv|~sprspryvxifhplnroqroqlikgdfqnproqlhmlhmsotqmrnjoiejb^cjfkc_dhdijfk\X]`\ab^cmin]Y^b_ab_a`\^LIKLIK;GIIUW>JLIUWDPRNUXINQLQTNSVLQTOTWKTWS\_OX[PY\U\_T\d]elQY`S[bU]d[^b`ae`ae_`ddei^_chdifbgjfkjejnhmdgkfimhkoilpilphjrlktmkqkjnliknkmlmqpqulmqcdhtuynpqnpqimnhmnemmknrknrknrjmqjmqjmqgjnjmqpqumlponrposmlponrqptqptpquijnmnrrrvuvzrswqrvqrvpqurswoptmnrqrvrswrswstxvuwtsusrtrqsrqsutvroqolnolntqstrtsrtrqsqprpoqmlnqnppmoroqtqstqstqssprvsuwtvvsuurtyvx~{}sprxuwwtvwwwwvvxz{~ѯţinqɞ}|~xwyyxzwvx~~}z||y{|{}zz||{}}|~}|~}|~|{}|{}}|~{z|}|~~}zy{{z|}|~zwy}z||~{xz|~}|~}z|}|~{}~~zy}|~|y{|y{~~}~}~{|{|yzz{~~}~}~`fesyxz~}|||{~{}{|x}ßzvx}xzz|x{{vxz|~{}|wy{y{{z|yxzxwyxwyxwyxsuwrtwrtwrtwrttoqwrt|wynikkfhrmoupruprvqswrtxsuurturturttqsvsuroq{xztqs|y{|~}z|xuwzwy|~yvxtqsurtmjltqsqnpqnpqprlkmlkmxwypoqprssuvtsuqprifh}xzsprliksprspryvxsprwtvmjlifhfcenkmolnkhjifhkhjnkmminjfkhdihdifbgminhdi^Z_b^db^cYUZ]Y^fbgXTYa]bZV[WTVYVX\Y[TQSXUW>JL@LNAMOCOQHTVFMPLQTINQKPSV[^SY\SZ]SZ]U[^RY\R[^X^c\bgY_dTZ_V\a]`d_`dbcg`aeabf_`deafd`ebaeeeihfkbgjdilfknglogloiksjirljplkonkmnkmijnhimhjndeistxprsrtukopkpqgoojmqjmqjmqknrjmqmptmptlptoptnlpnmqrqunmqvuyqptsrvpquuvzrswpqustxrswqrvpquoptrrvrswqrvnoslmqstxqrvlkmtsuutvmlnvuwonpurtroqurtroqtqsrqsrqsrqsrprsrtqnpsprsprsprroqsprurtvrtwtvyvxsprxuwxuwxuwxuwxuwzxxsrry{|rvx|Ǧx}dgh}|~|{}~|{}}}|~~{}}z|{z|{z|{z|zy{{z||{}|{}|{}~}~}yxzzy{}|~zwy}~}|~}x|}y{|||vw~}}yz|}}~z|yz|||}~}~~{{{vxy~v{|z|}dfg~~{{{~{}{xz~zwy~~}}}{{|~}}y~c_ḓúЎ˜jik|y{}{||~|~z|~y{{vx{xzvuwvuwvuwyxzwuwytvwrtvqsxsuwrt{vxxsuxsuxsuxsuwrtwrtwrtxsuxsuxsuvsuurturturturtwtvzxzxuwxuwqnproqwtvvsuyvxxuwwtvzwyjgi}z|vsuvsupoqrqsutvutvtsuuwxwyzutvtsuzwy{vxtqsqnpwtvzwyyvxmjl{xzwtvliknkmolnurtolnolnkhjnkmiejiejiejhdihdiiejeaffbgb^ceaflhm`\ahdid`e[W\[W\VSU`]_ZWY\Y[[XZFRTBNP>JL@LNEQSJQTLQTLQTKPSSX[PVZQX[PUXMPTMRUNWZVZ_Y]bW[`[^d\`eZ\`Z[_[\`_`dbdhcdhedheeibdhcgjaeibfjdilfjnglnglnbdlfenjhnlkonkmnkmijnijnhimnosrswnprnprjnpjopgoolnrilpjmqlnrjmqlnrnptpswqrvonrposutxihlonrqptmlpklplmqpquprvstxrswprvpptnnrqrvqrvoptlmqklprswpqurqsrprvuwvuwsrtxwyqnpolnolntqsqnprrtrqsrprrrtnmosprsprqnpolnyvxpmosprtqsroqvsuurtvsuxvx{xzxuwxuw|wx{yyzz||u{~ˤy~}prswvx|{}xwy{z|~z||~|~zwy~{z|{z|{z|zy{{z||{}~}~}|{}{z|zy{|{}}|~xwytqs}spr~{}}z||~}tvw{}~{}~~vxyuwxvxy|~{z~|vwyst~|~~~~{|zz|}~}~|~~{|vvv{~vzwwwlll||}}}}minŢȩqtuxuw{xz|vx{}{}|~{}~xz}z|{xz{xz|y{xuwxvxytvytvxrtytvwrtxsuxtv{vxzuwzuwxrtxrtxrtxtvxtvxtvroqsprurturturtvsuzwywtv~{}~{}urturtvrturtxuwyvxzwynkm{xzwtvurtvuwwvxrqsvuwrqsnpqoqrmlnmlnyvxxrtolnmjlurtolnmjlhegwtvpmosprqnpnlnsprnkmnjllhjlikgchfbgeafhdhjfkiejd`ea]bb^cb^dZV[^Z_gch]Y^c_d_[`YVX\Y[NKMOLNNKMAMOBNPAMOAMO>JLJQTLQTLQTLQTOTWNTXMTWPSWMNRMRUOX[Y\`Z]a[^b_bf`cg]^b\]a\]a`aedeideicdh\ad[ad^fi^il_fiahkbjlcjncjndfnhgpljplkonkmnkmijnklpnosrswlmqlnokmnjnnjophppnpthkojlplosjlpjlpnquqtxpqunmqonrsrvlkosrvpnrkjnmnrnptstxqrvoptqrvpqunptlmqnosnosqrvoptmnrqrvppttsuonputvyxzwvxnmoolnolnpmolikolntrtrqspprrrtrqsqnppmoolnpmozwyroqtqsvrttqswtvzwyvsuxvx{xzxuwxuw{vvz{|{}ptu¥ƖY[\|{}|{}|{}yxz|{}|y{|xz}z|yvx{z|{z|{z|zy{{z||{}{z|{z|nmorqslkmzy{zy{vuw{z|zy{urt~{}zwy|y{~{xz|~{}~wyz~~{z~y}~~rtutxy|y{}~}|~~z{~|}z{}~}~~~z{~~~}~wuu|z~|~{}~~|}ynzzhrry{w|{w||~{}}}}}|~|y{}z|~z|{{æˡá˚uwxzy{}~{}{vx{vxz|{}z||z|zxzzxz|z|yvxyvxytvytvytvzvxzuwxsuxtv{vxzuwzuwxtvxtvxtvztvztvztvsprtqsurturturtxuw{xzyvxurtroqurturttrtvsuurturtwtvpmo|y{zwywtvrqsihjzy{{z|nmosuvxz{zy{ppryvxtoq|xz{xzpmo~{}}z|qnpzwyurtpmomjlnkmolnmjlmjllikifhgchfbgeafhdhjfkeafd`efbgb^ca]bhdihdib^d^Z_eaf[W\WTV[XZVSUWTVVSUEQSEQSCOQALN=IKIPSHMPKPSMRUMRUKRUKRURTYWW[TY\U^aZZ^Z[_\]a\]a]^b[]a[]a`aedeifgkdeicfj`dh\dg[hj[hj^ehagjbilcjmcjmfhoggoigmlkonkmnkmijnlnrmnrjkooptkmnhjkhlmlpqlsspswfinilplothkpgjnorwnqvssxposqptpnrmlplkomlponrnosstxqrvrswnotprvoptnosklpnnsnospqunoslmqprvoptppronprqsonpusurprplnpmoolnrnppmotsurqspoqqprqprsprtqsurturttqstqswtvxuwtprusuvtvxuwxuwwtvxuwxuwysu{vw~vz|֪͢hq|zdfgzy{{z||{|yxzyxz|~yvxyvx|z||y{{z|{z|{z|zy{{z|{{}|{}||~|{}|{}}|~~}|~~}y{~{}urt|~~{}|~|xz|{}~y|||~z|~~w{|vzzz~~wyz}~}{~|}}{~~|}z{}~}wx}~|}~~~{|~}{{}w}|~w}|z|}w{|~zuz{puvvwv}~||~{}}y~țșz|}vtvyxzyvxzuwytv|~}xz~xz}xz{uw{vx}xzy{|wyytv{vxzuw|wyzvxzvxwsuxtvwsuwsuytvytvytvzuwzuwzuwxuwvtvurturturttqsxuwurtyvxvsuwtvsprurtqnpurtwuvyvxurtxuwxuwroqmlnvuw{z|yxzpoqpsspssmlnutvrnpkgiqnppmoolnsprqnpnkmlikkhjmjlkhjnkmmjllikkhjlhlhehjfjiejiejhdihdihdifbgfbgb^ca]bb]ba]b_[`[W\c_d[W\^[\\YZXUVXUWXUV9IK;IK=MO>LN>MOJQTGLOJORLQTMRUPUXPUXQVYTX\TY\V\_UX\WZ^Z_bW]`V_bX^aZ`cZ^b]`d^_c\]acfjchkbhk]fi^gj\eh_hkahk`eheimeeiihljimlkolkolkomlpihlposnmqonrmnrlmqkkpjkoikonpqoqrlnojklrstmopoqqprsnppqstqttlnooqrprsrtupsspoqsrtsrtsrsqprqpqlnolnomopmopmophimijnijnoptlmqpmoqmormoqmoqlnqnponpmlnsrtpoqnmoqnptqstqstqssprnkmpmosprvsuvsuvsuurtwtvtsumopy|}utvutv|y{{vx}xz|sx~x{~zˮwy}ĕ{y~{z~{z~{z~utxxw{tpr|y{xuw~{}}z|~{}zwy~z|{xz~qnp|~|{}}|~~xwy}|~yxzutv}}~{tyzsxyquvx}~osuyz~|{{z|xvv}{xz~}~~|~{}|~~}~~{||}~~{|}~~~~|}|||www}{|x{}~z|}}|~}}|{}~||~{z|{xz|~~srv͸̢x{wx|{xzz|}xz|wy{}{}}xz{xzyvxwtvxuw{xzyvx{vx{vxytvzuw{vxtuvuvwnnprrtpqswtvxuwvsuxuwxuwwtv{vxytvytvxsuwrtroqvsuwtvpmovsuxtynjoa]brnssottputsuutvvuwvuwrrttsuonprqspoqtsuxv{zy}potjimxx|linolntqslikpmoqnpmmosrtpoqnmohhjnkmmjllhmlhmlgolhnlhmkgleafgchlhmgcheafc_d`\a]Y^YX\bbf`_c\[_[Z^]]`b^c`[aWSX\X]UPV>KM?LNBOQ>KM>JLHORGLOINQLQTMRUPUXQVYQVYPUXTY\TY\UX\TW[TY\V]`S\_W^aY`cZ_b\_cbcgfgkcfjchk_fj`gj^gj]ficjmbilbgjdgkfeiihljimlkolkolkonnrjimonrnlponrlmqmnrnosklpjkokmnprstvwprsnpqnproqrlnomopikljlmnpqmopmopmoplnosrtonppoqpoqonpnmolnolnomopmopmopmnrklpijnqrvlmqpmormormoojlojlolnqprnmoqprrqsonproqtqsrprsprroqroqrnpqnpvsuvsuvsuurtwtvrqsoqrswxwvxutvxuw{vxzuw~w|{sxyu{{yչDzƣƯ{z~{z~{z~vuyutxwtvzxz|z|}z|zwy~{xz{xz~{}}z|{xzspr|y{|~|{}~}wvxxwy|{}{z|zy{yxzvvx|{}kpqx}~|}~}}|~~}rs}y}~~xu~|{{~|~}~{}}~~{}|~z|{}~~|}}~z{|}~~~~}~}~~~}}}}}}{{{}~}}z|}xzz~}ttxsrt~}}|~~}|y{}|~~~~z{z~Ģͤ{}}xz|xzz|{}~xz{xzyvxwtvxuw{xzzvxxsuxsuxtvytvzuwtvxuwxqsttvwrtuurtwtvxuwzwyxuwvsuxsuzuwztvytvxsuurtqnpurtroqvtvxtyplqhdirnssottpusrtttvvuwvuwrqstsu|{}xwyrprrqsyx|rquqptqptyx|srvroqsprqnptqsurtnmotsutsumlnhginjlljllhljfljenjflhdid`ehdi^Z_b^cb^ca]ba]bb^c\X]RQUQPTWVZZY][Z^[Z^ZV[[W\OKPTPUQMR8DF5AC4@B:FH>JLDKNGLOINQLQTMRUPUXQVYRWZTY\TY\VZ^Z]aWZ^V[^W^aPY\W^aY`cZ_b\_c_`d_`d^bf`bf_dgahk_hk`jmcjmdilbeicfjfeiihljimlkolkolkoqptlkonnrmlpnmqijnjkoklppquijnnpqprsoqrqstmopprstvwuwxoqrlnpikloqrtvwwyznpqxz{tsuqprqprrqspoqpoqlnolnomopmopmopnoslmqjkopqulmqpmormormormormoroqonplkmtsuwvxonpsprtqsrnppmoolnroqroqrprvsuvsuvsuurtwtvvuwxz{txysrtxwyzwy|wywrt|uzzzw}{zխȜwx|mlp{z~{z~}|{z~zy}zwyzwyzxz{xz{xz~yvxyvx|y{|~{xzoln|y{|y{zz||{}utv~}~}}|~utv~}|{}z~}}{}~sz}|}~}|zy}{z|trr~||~~yvx|y{~{}|~~{}{}~~y{}xyz{ytu|~{}|~z|{}|}}~{|~~~|~|~|~}~}~|~{{{www~~~uuu|}|}~~}}}~~~tttxz{oqr|{}}onp}|~wvxlkm}|~|~}z|qnp|~~~|x}~{}|wy}xz~xz{vx|~~z|{xzyvxwtvxuwxvxzwyxsuwrtxrtxtvztvuwxtvvsuvtvwqstzwyyvxspryvxxuwwtvxsuxtvzvxztvxtvwtvroqurttqswtvqmrminlhmrnssottpurrttrtvuwutvrrtrqsnmorqsrqsvuwsrvmlputxqptrquvuyurtpmoolnroqspronpqprsrtpoqlkmljllikkgllhnlgplhnvrwtpueafhdiiejd`ec_da]bc_dd`e\[_`_cbae]\`ZY]SRVWSX[W\PLQTPTTPU;DG=FIBJNEMQBKNCILGLOINQLQTMRUPUXMRUSX[]beSX[X]`X\`X[_X]`ZadQZ]W^aY`cZ_b[^b]^b^_c\]a[^b^cfeilahkdknglodjl`cgghlfeiihljimlkolkolkosrvmlpnmqlkomlpklpklpklpqrvpqujlmlnolnomopmopmoplnoiklkmnqstkmnlnooqrqstlnnuwxmlnpoqqprpnpnmomlnlnolnomopmopmopklpklpklprswlmqpmormormosnpsnpsprqprmln{z|~nmotqstqsqnpolnnkmpmoroqtqsvsuvsuvsutqswtvutvz|}ostutvxwywtv|wyupr|v{wrwjks±ůÙou|efj{z~{z~{z~xw{zy}{z~~roq{xzyvx|y{|~|y{sprurttqsxtvsprwtvzy{~}~|{}{}~}wz|~w}mvy~~y}~{}~{|xx~~zy{}}{}~~topytutopz|~y{|~{}|~|}~~~xy}~}~~~|}z{}~{||}}~}xy||||||www|}yz~yz}~z|}{z|lnnmoozy}jikqpr~|~{z||{}{z|{z|xwy{xz~{}}}~|vrwxuwzuw~xz~y{zuw}z|{xzyvxwtvwtvwtvzwyzuwwrtwrtxsuytvrtuqstsuvxz{suvxuwxuwurturtyvx{xzytvwrt{vxzuwytvwtvwtvvsuvrtxuwplqnjornsrnssottpurqssrtutvutvsrtutvpnptsunmokjlqptrptposmlpxvzurtpmosprtqsonpmlnonpnmohgilikkhjjfkjfljenjflgchokpkglfbhjfkfbga]b^Z_a]b`\a]\`RQUYX\[Z^_^bYX\XTYa]bRNSSOTTPU:AD@GJDKNAHKGNQDILFKNINQNSVNSVMRULQTNSVMRUTY\V[^VY]VZ^UZ]V]`QZ]W^aW^aY^a\_c^_c^_c_`d^^b\^c`ehaehdildilehlefjcdhdcggfjlkomlpgfjmlpvuyposmlpnmqonrmnrfgk^_cklpefjhjlgijhjknprkmnqstnpqcefkmnqstmoplnojlniklkmnnpqmlnrpronpmlnnmoonplnolnolnomopnpqklpklpklpjkollprnpqlnrmoqlnrmoqnppoqrqsrqsutvqprtqssprroqroqroqroqtqsxuwvsusprqnp~{}sprtsunpqswxutvwvxyvx{vxxsu~wsx;ϲƧlmq~}|{|{|{|{|{~{}wtvyvxyvx|y{~}z|~{}|y{}z|~{}}z|wtvihjwvxrqsyxzmlnqprwvxyxz|{}wvxrqswvxzy{uz{uz{~}|{~{}~{y}~w{|stx}~~~~~zzz~rtt|~~~zwyz{}~zuv|}~yzz|z|snp|}|}z{|}}~~yz}~~~}~|vw}~|}}~{||||{vw~uuuwww}}}~||}~~~~z|}y~}lnn~~~}}|~}|~|{}zy{zy{zy{{z|zwy}z|{xz|~~~zv{}|x||{v|~ʩšyz~|z|~y{}xz|wyz|{vxzwy{xzyvx}urturtxsuytvwrtxsuytvsuvsuvuwxrturtuvsu{xzurturturtxuwwrtvqswrtxsuytvzwyzwyxuwwtvwtvvrwrnssotplqrnstputsutsurqsutvrqsrqsrqsrqspoqpoq~}tswxw{kjnxw{pmoqnpzwynkmkjlpoqlkmwvx~liknkmminjfljenjfljfkfbgb^ca]blhmlhmiej_[`lhma]bgfj]\`a`dZY][Z^\[_]Y^[W\TPUVRWUQV=BD?DGAFI?DGDJLFKNHLPINQINQLQTNSVJORLQTSX[MRUW\_VY]VY]UZ]T\^R[^V^`V^`X^`]`d_`d_`dbae``dadhadhflochkdgkdgkgfjedhddhgfjkjnkjngfjkjnsrvonrihljimkjnklpjkoqrvnosfgkiklfhigijnpqgijnpqoqrmopmoprtuoqrjlmjlmjlmuwxvxyutvsrtrqsonponponplnplnplnpmopnppllpllpllplmqlmqsprsnprnprmosnprnppoqqprrprutvpnptqssprroqsprsprroqtqsvtvvsutrtspr|xzurtrrtoqrquvqpr|{}yvx|wyzuwztyljn֪ȥǨqrv}||z~|z~|{|z~{z~|~xuw{xz{xz}z||z||~}z|~|~|~|~~tsuzy{utv~}zy{}|~}|~xwyxwyyxz{z|xwyyxzy~|z{~}~z~x~~s~~ptujno|{prr}|~yxzx|}|svz}|~}z||~}ytvytv~y{~~|vw}~{||}yzyz}~~~~~~xy~xxx~~{uvz{~yz~~{~~uvz~}z||~|{}|~~}|{}~zwywtv{xz|~|x}~{zy}Ԫ}~z|~xz|xzz|z|zwyzxzxtvzxzxtvwtv|wy}xzwrtxsuytvqstqstkmnvxyz|}xuwzwyxuwvsuurtxtvzuwytvwrtxsuytv{xzxvxtqsvtvyvxsotqmrrnsrnrsottputsuvuwsrtrqsutvrrtrrtrrtvuwutvkjnqptlkosrvvuyxw{wtvurtxuwyvxspronp}|~mlnsrtyxzgdftqslhmjfljfnjfllhmkgleafb^djfkhdiokp`\akgla]ba`da`d_^b\[_]\`]\`]Y^^Z_XTYVRWYUZ>AE?BF@CGADHCFJHLPHNPINQINQMRUQVYNSVNSVPUXINQRWZX[_X[_W\_SZ]R[^V\`V\`X\`]`d_`d_`d``dfeijko`cgbeicejbfjefjfeifeifdhhgkkjnonrjimonrnmqnmqkjnkjnmlpijnefjlmqnosklpeghgijqsthjkjlmqstikllnonpqprsnpqnpqnpqnpqz|}kmnqpronpnmoonponponpnppnppnppmoplnplnrlnrlnrlmqjlpqnprmosnprnptnprprpoqonppnptrtonptqssprroqvsuvsuroqsprtqsvsuvrttrtzvxvrtqprqstquvonp~zvx{vxzuw|vuytv{Ѩuvzyx|zz~zz~||{z~zx|}z|xuw{xzxuwroqxuw~|~}z|zwyqnp}}z|}z|zy{~xwyxwy|{}zy{^]_zz|poqwvxxxzpoq}|~v{|y~|w|}~vy~w|~}}xy}yxz}z|}~}~y{xsu{|~~vqsxsu~y{|~yz|}~~{|{|~~~~|}|}|}yyy|}}~z{wrs}xy~~z~y{|~}}|~zy{~~wvxtsuutv|y{vsuyvx~|~}y~}y~~xty~}svzz|~y{~xzzuwz|zwyzwyvsuvsuzvxvsuytvzuwwrtxsuytvtvwtvwnpqsuvrtuurturtvsuwtvurtvtvxsuytvwrtxsuytvzwyxuwtqsvrtxuwqmrsotrnssottpttpurqsrqsyxztsurqstrttrttrtxwyvuwrquutxqptsrvrrvposmjlnkmqnpsprtqsqprrqspoqhgiutvvsuzwylhmlhnlfplhnminiejgchd`ffbghdifbggchd`e^Z_`_cedh_^bZY]ZY]YX\a]bUQV^Z_ZV[TPU>@DCDHDFJIJNDFJINQINQINQHNPJPSLRULQTLQTMRURVYRVZTW[TW[SX[T[^OX[U\_V\_W\_Z^b]^b\^b`[`^]acdh^ae]aeadhadhcdhfeigdifeihfjihlnlphgknmqjimmlponrposqptnosklpoptlmqwx|kmnfhilnpikloqrlnojlmoqrlnolnolnolnomopoqrtvwmopkjkqpronpqprpoqonpnpqnpqnpqmoplnomnrmnrmnrijnhimjgimikuprrnpsnptqsonpnmonmorqslkmtqssprroqsprsprroqsprtqsvsuvsuvsuxtvvtvsrttvwtxypoq~}zwyvqswrt{w|wvzԝltystxyx|zy}zy}}|zy~xw{{xzurtxuwvsuvsuvsu}z||~}yvx{xzzwy{xzxuw}|{}zz||{}~~~}wvx}|~zy{vuwihj{z|{~znmox~tyu{qzz}vz{quv~tuy{|ekl}{|}}wzupr~}z{~|}z{~yz{{}~{|}~~}~}~~}||~{|~{vw|}{|~|{xvv}vxyxw{~}{z|}~|}|z{|~|vtx~~ѥzwz{{}z|~y{zuwzwyzwyurtvsu{xzroqwrtytvwrtxsuytvsuvrtusuvtvwrttvrturtxuwwtvurturt{vx|wywrtxsuytvwtvxuwvsuurturtplqwsxvqwtpvupvtputsuqqsutvvvxsrttsutsutsuvtvrqsvvzsrvutxsrvnmqvuynkmqnproqtqsnlmqprgfhmlnnmozy{lhjkhjqmrlhnlgolhnninkglhchfbgd`eeaf`\a_[`a]b`\a\[_bae[Z^]\`\[_ZY]YU[b^cVRW[W\RNTBF:?B>CF?DGAFICEIEFJEGLEKNELOFMPLQTMRUMRTMRUNSVQRVQRVRUYPUXQX[VY]XY]XY]WX\XY]YZ^XY]Z[__`d]^b`aeabf_`dbcg_`ddeihfjhhlfeipos|{llpljnhgklkofeiffjeghdfgacdgijgijsuvcefhjllnolnokmniklhjkiklmopnpqlnogijmoplnolnrlnrlnrqrvnosmnrjkolmqlmqklppquwyzhjknpqtsuXWYrqsjikmlnmlnmlnljllkmpoqpnphgikjlpprmlntrtlkmsrtdcez|}mopvxxqprvsuzuwyruyruyruwptyru}v}¶̠hko}|zv{vuwxwyrqssrtvuwtqsroqqnpolnpmowtvyvxxuwyvxxuwzwy|~|~~{}wtvurt{xz}wtv{xz~{}wvx~}~~|~~y{|~~yxz|}~}{}~tw{|~}~xz~~~zwy~}}|~|{~}~~}}|~||~}}}~~z|z{z|z{~~z~{~}}~{|z|z{}wxztu{uv}wxyz|}xst~z{}~wyzwz~{}~|{~}|yyw}|{}|~}|~|{}{z|wvxzy{~~~~~~uwx~{yyzxxzxxxvvxvvxtvxtvxtvwtvwtvwtvvsuvsuurturturtrttrturtvrturtuwtvxsuwrtvrtvrtvrtwrtwrtwrtwrtuprvsuyvxurtpmowtvwtvolnvsuurturttqsroqurtpmoqnpqnppoqpoqqprrqsqprnjoxtywsxqmrxtysotsotrnsiejkglkglpmoroq|y{sprpmogfhjikgfhfegfegdceedfhfhfeggfhbac`_c`_c^]a\\``_cZY]ZY]YX\ZY]WVZVTXWTVURTROQQNPROQCF?DGAFIDEIDFJCFJDGKFJMFMPLQTMRUIPTKRULTVQRVQRVRUYPUXQX[VY]XY]XY]Z[_Z[_[\`]^bZ[_^_cZ[_``dabfWX\[\``ae`aegfjhfjfdhlkolkojimkjngfjhgkihlhhlgijhjkkmngijmoplnohjj\^_cefgijgijjllfhiiklikllnnkmnikleghbdefhinnrnnrnnroptlmqklpcdh_`defjmnroptsuvwyz{}~rtuhgia`bnmosrtnmonlnqprqprnnpmlnonppoqpoqihjnmorqslkmutvmlnutvvtvuwxrtuz|}qprtqsxsu{ru{ru{ru{rt|rvkdkxu~ڡŧ˜qtx~|x}xwy{z|yxzvuwutvzwyxuwurtvsuwtvyvx~{}yvxxuwzwy~}wtvyvx|y{|~}z||y{~{}}zy{~}zy{srtkjnxx|xw{|{}|~~~~wyz{}~~ppvtw|x~{z|}}||~~{|}~~~}}|~|{~}~~}}|}|~}}{|z||~|uv~~~|~~}~{|{|z{{uv{|{|z{yst{||}|}~~~|~}}vxy{z~~|zxwyyxz{z|}|~yxz~~~~~~z{}~{~ywwxvvvttwuuywwxvxxvxxvxwtvwtvwtvvsuvsuzwyxuwzwyrtvrturttrturtuwtvxsuwrtxrtxrtxrtwrtwrtojlrmoytvvsuyvxurtyvxzwy|~nkmtqsroqsprurtsprvsub_aqnp{xzpoqpoqonplkmmlnjfkzv{njotpuvrwqmrtpurnsiejjfklhmmjlplntqsifhmjl`_adcebacfegfegdceedfdcedceWVXbac_^b^]a[Z^ZZ^_^bZY]YX\WVZZY]WVZWVZWTVURTWTVSPRROQ>BF=ADBFJ?CGAEIDEIFEIBEIBEIEIMHLPJMQJPRJPSLRUNTWPRVPRVRUYPUXMTWTVZUVZUVZUVZYZ^\]a[\`\^bZ[_Z[_^`d_`dXY^fgk`ae`aefeigfjedhfeicbfjimsrvonsfejihljinfhiegheghgjjacddfg_abZ]^fhihjkeghhjkprslnojlmikllnpmopkmntvvnpqnosnosnoslmrmnrmnrjkofglopuklprswiklacdlooknoqprrqspoqonpsrtsrtpoqpoqpoqnmoonppoqonpqprrqssrtpnpwvxqprlkmpoqssuprsoqrqoqpmovrtzruzruzruzru{svxr|̷ə|Zajhpw}hpsailykptqsw|wvx{z|ttvssuvuwyvxxuwxuwxuwzwyyvxzwyvsuyvxxuwzwywuwzwzyvx}{}|z|~zxz{xzzxz}|~|{}}z||}z||~{}~|z{wzz}~|x}}uvz|wx|~}~}zwy~~~}{z~~}}|~}~}}}~{|~wqrz|}}|~}{|{|z|}~z{|vwz{~|}|vwyz|}|}}~}~|}{|~~~z|{}~~|{xwy}|~~~}|{}||}}z|~}{|~uwxªvz|zzywwxvvwuuywwyvxyvxzwyyvxxuwwtvvsuvsu{xzvsuzwysuvrturtusuvrtuwtvytvwrtxsuxsuxsuwrtwrt|wy{vxytvvsuyvxurtzwyxuw}z|olnwtv{xzurtroqxuwzwy]Z\roq~{}rqsqprpoqnmolkmokptpurnsrnsjfk_[`lhmiejd`efbgnjomkmlikkhjkhjjgifdfjikjikihjhgifeggfhdcennpcbdbbda`d_^b[Z^YX\\[_YX\]\aVUYSRVTSWWVZURTSPRVSUWTVPMO>>BAAEEEIFFJGGKBCGCDHEEIDDHIJNJKOFGKLNRMOSNPTOQULRUOUXPWZMTWMTWQVYUX\XY]WX\YW[XW[^]a_^b^]a`_c_^b_ab^`aacdgii_aaedhfeigfjfeia`dedhihjgfhhghihjgfhkjl`_a_]_jhjlkmhgiihjhfhjhjeceihjiklhjkqstacdjlnnpqlnoqstnpqmopoqrlnoprrlnolnokmmegh[]^fhisrtqprpoqlkmlkmlkmrqsqpronpqprwvxsrtqprmlnnnppoqmlnpoqpoqonprqsqprmlnqprrqssrtqproqrnpqoqrqsttuvwuwxvxywywuwvtvffkØ}npqvxx}|~yvx}z|urtwtvvsu}z|urtvsu{xzvsuvsuyvxxuwzwyxuwwvxsvwwz{x{|~vyzwyzzz|uxyxy{vyz|z|{xz{xz|y{|~|}y~|}y~~z~~~~}~}xwy|{}~}{z|{z|}z|}vz~}x{yz||}|z|}{}~~~}||}}}~~{}{}z|smpz|}~~xy~}{y}~zz~}wwz{z{z{z{z{{|{||}~}~}~z{|}~xy{|~|}yzy{}~~~}}z}~}wyzy}~ww~zz~}~~~~~~~~}}}~~~|~|~~{}}zxy~notx~zxx}{{xvvywwussurtyvxqnpxuwvsu{xzwtvwtvtqsvsuwtvrturttiklnpqtvwtqsolnwtvurturtyuwwpswpsxqttmpyruxuwurtxuw~{}wtvqnproqvsusprsprwtvroqurtwtvsprqnprqsqprpoqlkmlkmnjoqmrnjonjornsokpnjolhnminjfkrnspkmnhjqlnlgiojlkhjmjlifhhegnkmfcemjlnkmfce_\^]Z\_^``_`^^bVTZWU]ZY]ZY[YXZXWXONPVUVVRTSPRSPRROQQNP;:>>=AA@DDCGFDHCDHDEIFGKDEIHIMHJNDEINOSNNRNOSOPTJRTLTWMUXLTVLTVPVXUX\XY]XX\ZX\ZX\VUY[Z^^]a`_c_^b^`a]_`bdd]_`bdeddhedhfeifeibaefeiihjedfihjkjljhjmlnPOQqprkjlvuwa`bfegmlnnmohginmokmnlnpnpqkmnnpqoqrkmnprsnpqnpqprsnpqqstrtulnolnomopuwxprsZ\]kjlqpronpnmokjlnmoqprnnpihjjikqprqpronppoqpnpnmonmonmojiknlnpoqlkmqprsrttrtutvsrtrturtuprrqstrtvsrtutvutvutvtsujjpΐx{suv}|~vuwxuwyvxurtwtvxtv|y{olnvsuxuwsprwtvyvxxuwzwyxuwwvxrvxvzzswxswxptuuwxwyzvxywyztvwpmourt|y{}{xzyvx~z}y~zv{}|~~~~~~~}|~~|{}z{|~ty|~ux}vy~{|}{~~~}|z|}~}}|~~}~}|~~}~|wyvotz~}~|}}zz{|vw~~xyz{zzzzzz~xy~xy~xyz{{|{|}~|}}~z{|wx~~~||yww~zz|~}~~yz{z|}}|~w|{}|yxx~ppv{w|~z~{xz~~{}~z||~~{xz~uu{~|zzzxxzxxywwyww{xzwtvtrtxuwvsuzxzzwyzwyvsuvtvwtvrtuqstlnnrturtutprrnpvsutprqnpqnpvqsvqsvrttprwstxuwwtvwtv}sprsprtprvsuroqsprzwyrnptqswtvvrturtutvtsusrtnlnnlnnjpplpokpokpminnjornstpunjominvrwrmomhjmhjkfhkfhgdflhjjgiifhheggdfjgijgidaca^`ebdcbd_^`edh\Z`\Yb`_c[Z\ZY[[Z\TSUVUWVSUTQSOLNQNPURTBAEBAEEDHCBFDCGABFCDHFGKFHLHIMFHLEFJPQULNRNNRNPTLQTMRTMQTNRVNRVPUXTW[WX\XX\ZX\ZX\ZY]ZY]^]a`_c_^b^``\^_`bdacdikldbfddhfdhfeicbfhhlonplkmhgikjlkjllkmedfa`bihjvuwhgigfhkjlonpfegmlnmopprsmopfhijlmjlmfhiqstqstrtuprslnpprrtvwacdmopvxy~TVWoqronpjiknmojiknmoihjtsunmomlnnmosrtqprpoqqprpoqonpnnponphgilkmutvkjlsrtsrtutvutvrqsrtutvwprtqstrttutvvuwwvxvuwxwypx}~uwxtsutsuwtvxuwxtvurtyvxzwytrttqs}z|roqsprxuw{xzzwyxuwwvxswxuyzw{|uyzswxsuvtvwwyz|~z|}|~~{}|~~{}}}y~yuzzv{xty|~~}|~wvx}|~~~|~wyzxz{zz}}~x{~~}{z||{}zy{}|~wvx|{}z|{vx{vxzsx|~~~|}~}~{}wx}wx|}yzzz~xz~xz~xz~xy~xywqr|vw{|}~}~|}{vw~||}}}wx~tsuy{||~~yyrqs}}}~|x}~z~}~}z|~z||z||~~|~zxz~^]cԩywwuss{yy{yy}z|wtvxuwwtvxuwzvxxuwxuwxuwxtvwtvqstprsnppmopprrrprtprurtroqpmoqnpvqsvqsuprvprwrt{xz{xzyvxzwy}z|yvxurtsprroqqnp{xzrnptqswtvwtvurtrqsqprpoqpnppnpplpnjpokprnsiejhdiokprnsqmrlhlminnikpkmojlkfhkfhebdifhifhhdfdacebdfceebddac`\^_\^a`bYXZ]\`^\b^[d[Z^[Z\YXZ[Z\UTVQPRWTVTRTSPROLNJGIBAEB@DCBFEDHEDHEFJHIMLMQHIMGHLDFJHIMRSWLMQMNRNOSKPSKPSKPSMRUMRUOTWTW[WX\VW[XW[XX\YX\]\`^]a`_c_^b]_`\^_`bcUWXTVWcbfdcgedhfeidcgjimonponpedfhgijikhgifegihjmlnrrtmlnihjmlnutvedflkmjlmprshjkhjkacdWYZiklhjknpqprsnppkmnmopuwx`bc{}~nppjlmlnonmonmojiklkmlkmmlnnmosrtonponpsrtkjllkmonppoqrqsonpqprkjllkmonppoqsrtrqstsurqsonpqstsuvqstqstqstrqstsutsuzy{tsuxx~]gps{X^artueghrqstsuwtv{xzyvxvsuyvxwtv{xz{xzurt}z|~{}{xzzwyxuwwvxtxytxy{{w{|y{|z|}~rtusuvwtv|y{{xzyvx{xz~yuz}}|~|~|~}~~|w}qx{~}|}|~}~~}|{}~}~srtxwy}|~z|~~{ty|~yzxsrupm|vwz{{|z{yz~xy~xy~xyyzyz|}{|{||}}~~~z{~||top{|{|~~yxzutv~~{}{xzy}~~~~zhhn}}}}~z}y~}z|}z|}z||y{~{}}z|zwy~{}wu{ĥ|zz}{{xvv|zzxvv{xz{xzxuwwtvyvxxuw{xz{xzyvxxuwwtvqstoqrprsprsnpqroqvsutqssprsprwtvtqstqsroqtqsurtxuwyvxvsuwtvolntqstqsxuwurtpmozwyroqurtvsuurturtsrtqprqprqprqprplqminnjoplqrnsrnsgchhdiplqkglminpkmpkmlgilginikfceifhebdfcedaca^`c`bb_ac`b^[]_\^a`bUTVRQU\Z`[XaWVZ`_a]\^VUW[Z\\[]WTVURTSPRQNPOLN=<@@>BBAECBFHGKFGKHJNHIMGHLPQUCDHMNROPTLMQMNRNOSLOSLOSLOSNQUPSWNSVPSWUVZWX\ZY]XW[YX\[Z^]\`_^b^]a^`a]_`acdbde[]^cbfdcgbaegfjedhgfjihjgfhfeglkmnmohgipoqnnponpsrtonponponprqskjlqstuwxgijgijiklɺdfgnpqoqrhjkiklrtunpq{}~suvhjknppnpqhjklnolkmkjlkjlkjlmlnnmoqprrqsqpronputvonplkmonprqsrqspoqutvlkmpoqvuwrqspoqtsuutvrqspoqsuvtvwrtuprsqsttsutsutsutsulkmginƠŪǞۢxz{uwxzy{utvwtvyvx}z|vrtyvxxuwvsuvsu{xzzwy{xz|z|{xzxuwxuwvuwrvwquvvz{|rvwnpqxz{z|}wtv|y{|y{xvx{|{}|~yxz~{z|~}zzppv~~}}{}~~{v}~}|}~xvxtsupoq{}|~|~~}y|{||~}|~tno~~xy}wx~xyyzyzyzz{}wx}wx}~~~~lgh~~~||}{{~|||}|}z{}~~}~}{{~~~zz}|~yxz~~~{}{{~~{}|~~~}~{}~{}~{}}wtzw~ljjzxxsqqvttzxx}z|{xzzwyxuwxvx{xzzvxzvxwtvyvxxuwrtuqstprsqstoqrsprsprsprroqsprtqsroqsprroqurtsoqurtxuwurtvsusprxuwwtvurturtroqvsuvsuurtvsuwtvolnpoqtsunmopoqqprokpplq|x}plqrnsminnjoqmrminb^c{w|snplgilgigbdrmoolndacifhdacc`bb_ac`b]Z\a^`YVXa^`\\^\[]XW[ZX^VS\UTX[Z\TSUQPRTSUPOQWTVPMOXUWTQSZWY=<@?>B@?CDCGHGKGHLHIMEFJCDHMNRGHLIJNLMQLMQMNRNOSNOSNOSNOSPQUQRVNRVPSWTTXUVZXW[XVZXX\[Z^]\`_^b^]a\^`]_``bbikl`bca`da`dbbfedhdcgedhgfhlkmcbdmlnjikdcejikjiknmoihjihjllnkjljikkjllkmprskmniklqsthjk^`alnorturtufhjwyzxz{mopjlmmopnpqlnoprslkmjikjikkjlmlnlkmrqsnmoqprpnpsrtonpkjllkmonpnmomlnonpqprqprtsunmoonphgiqprsrtrqssuvtvwrtuprsqstrqsrqsrqstsuutv˚jnozy{~}yvxwtvzwytqsvsuyvxvsuvsuxuwurtwtvyvxzwyxuwxuwvuwswxrvwlpqvz{x|}uwxhjkVXYrtujlmnkmqnpwtvyvx|y{xuw|x}{~z|{}|{}~vuw~{}~||||zw||y}w~z~~~{z|}|~~~}|~|~|y|z{{|~}z~xyz{}wx{uv|vwyzyzyzz{~xyystz{~~z{|}|}}~~~~~}|||{}|{}w|}wz~ttz}{}{~}{|y{|y{{xz~{}|~{xz{xz}z|~|~~{}|~ynllzxxvttxvvxvvyvxxuwxuwxtvxuwzwywtvwtvurtwtvvsusuvrtuqstprsoqrsprsprsprroqsprtqsqprqprnmoqpronptqsyvxroqxuwtqsyvxxuwvrturtroqvsuwtvzwywtvwtvpmoqprpoqnnpqpronprnshdiiejqmrokpokpokpvrwplqokpiejsnpkfhmhjhcepkmnkmb_agdfgdfb_ab_a_\^gdfb_aZWY\Y[UTVZY[[Z^XV\XU^XW[SRTUTVTSUONPQPRQNPIFHROQMJLLIKA@DBAEBAEBBFFEIDEIEFJBCGBCGHIMGHLHIMKLPLMQMNRNOSNOSNOSNOSOPTPQUORVPRVRSWRTXXVZWVZXW[YX\[Z^\\`[Z^\^^^``^``egh]_`cbfgfjcbfedhfeiedhgfhgfhdcelkmfegihjgfhmlnkjlkjlgfhjikjikihjljlonpnpqz|}suvrturtvfhiUWXhjkkmnrtufhigijy{|uwxdfgjlmhjkprsnpqlnortvlkmljljikkjlmlnnmotsupoqrprpprpprpoqmlnonpqprqprqprmlnnmonmoqprnmoutvpoqqprvuwsrtuwxvxyrtuprsqstvuwvuwvuwpoqxxzƻ̐Ƣƚfrxu|MTWrwxuyzprsz|}~}|{}|y{yvxzwywtvwtvroqurtzwy}z|sprvsu}z|~xuwxuwvuwtxyvz{z~z~swxvxyprsvxyxz{wyz}zwyvsu|~}}y~|~|~|{}}|~|{}{}~|~~ssy||~~||vxy~u~{}y{~z}|~~~~{z||{}~{}}~{}{}z{~z{z{~}|yyz{uv}wx{uv|vwyzyzyzz{z{{uv|||~}~|}}~~~|{}~}srtsrtvxy~xz{xz{|~t||z|~v{~vv|qqwzx~|zxv|yxzvuw|{}yyyzzz~~~~|}xty}z|}~{}{xz}z|}z||~~z|~}vykdk}pnnwuuzxxwuuywwwtvxuwxuwwtvvrtvsuurturturtwtvvsusuvrtuqstoqrnpqsprsprsprroqsprtqsrrtqprnmosrtsrttqswtvroqwtvyvxurturtvsuurtroqvsutqsyvxxuwurtpnponpnmonmoonprqswsxlhmqmrokpnjonjookpzv{plqrnsd`epkmgbdkfhhceojlolndac`]_ebd`]_c`b_\^c`b]Z\YVX\Y[TSUYXZ[Z^ZX^\YbWVZXWYPOQMLNUTVONPSPRPMOKHJKHJLIK@@D@@D@@D@?DBAF?AEBCHCDHBDHDEJDEJKLPMOSLMQLNRNOSNOSNOSNOSNOSPQUORVORVQRVPQUVUYWVZXW[XW[XVZZX\XW[Z\]^`a\^_^`a[]^`^ckin]\`hgkjimgfjhgihghhgihhiedfcbdedfihjhgihgionpjjlkklggillnhhjmopkmnnpqlnokmn_bbgjjhjklnoqstmpquwxcef_abmopqstqstlnooqrgjkuxyonpnmomlnkjlmlnlkmonpqprrqsqpronpnmopoqonpqprqprpoqrqsqprnmotsunnprqsonpnmosrtlkmqtusuvrtuorsqstttutsutsu|{~ªӱǪltw`cdvxyxxzzy{zy{wuwvtvvtvusutrtzwyxuwyvx{wyuqsxuwwtvtqsxuwxuwvuwuyzostkopquvtxywzzy{|}z|}x{|zxz~{}{xzrpq{xzxtyvrw}}y~~~{}}}yz~}}~}~w~~~}{y|}|~|z|zy{|z}~}{}{}{}y}|yzz{{z~|~xy~xyyz}wx~xyyzyzyzz{z{z{~~|}z{yz}~}}}~~~~~~~~~~~|{{~~onp{z|~~uwx~z~}zx~}|~~~wwxzv{{w||y{~}z||~|~~~|~}}z|}|||[]b°Řpnovst|zzuss{yyxuwyvxzwywtvtqstqsvsuvsuwtvxvxwtvprsoqrnpqoqrnpqrprsprsprqoqsprsqssrtqprlkmrprrqsurtsprurttrtvrtpmoqnpuqsurtsoqvsuokmqnp{wysqsrnppoqwwxtsusrtsrtvrwiejplqnjoplqkglspunkpkimljnmgia\^idfe_aqlnkhjnjlifhfbdd`blikkhi_\^[XZ_\]hefYYZYYZWVZXV\ZX_^]aZY[MLNPOQPOPPOQQNPROQTQSROQMJL?>@?>@?>@@?AB@BCBDDCDEDEDCEEDFDFGHLPINQINQINQIMQMNRNOSOPTQRVQRVQRVPQURSWSTXUVZYZ^YZ^XY]UVZVW[STX[]^_abY[\]_`UWXadd]_`hjkbdefhicffcbfonrfeifeifeijiknmoihjhgihgirtumqrhlmipqfoognnkmnnpqiklgijhjkjikhgijikkjltsuonpnmojhjjiknlnqoromponppoqlkmlkmlnojlmkmnkmnlopnmonlnqprpoqqpronpqprbaconponpqprmlnnmoqprrqsrqsqprpoqsrtpoqqprmlnpoqrprpnqwuwtsupuvsuvxz~}|yϛžʙΣ`ch{xz{y{}z|zwy{z|ptutwxpstmpqpstttvutvutvwvxutvtsuwwyutvtsuxwyyxzswxnstsxyswxswxsrvusxvuyzx}zx}zx}yx}|x}y~~x}{{z|utv||{|}{|vw{}~}}||~w~~kqr~~}~~~~}}|~~~~yz~z{{|z{z{z{z{{{{|~|vw{|z{yzyzyzz}x|x{y|}z}~x{z}y|~~~~||}}}}~~~}~|}|}|}z}~~}|~srvxw{}|~tsu}|~}|x~}~{}~~}}yww~~|~|~}vsyvw~ww|wv{wtvuruwtvwtvwtvyvxurtvsuvsuurturtvsuwtvtsupoqonpsrtmlnttvkmnuvwmoprstrturtuprsjlmmoporrurturtwtvsprroqtoqysvqjmvortlpuoqunqsloslowqstmpyuzxsxwsxupvtpunjolhmlhmnjoqmrhgkjlprtxbdhjlpoqudacebd_\^nkmifhjhmkjnedhutxhgk``dc_e\X^a]ba\bb]c\W\\X]VRW[V[YTY\[_\[_XW[gfkPOSFEIMJLPMOMJLNKMMJL>=?>=?>=?@?AA@B@?AB@BBACDBDEDFDFHJMQKNRJMQJMQJMQMNRNOSOPTPRVPRVSTXPQUQRV\]aTUYXY]TUYVW[WX\YZ^WX\^`aacd]_`^`aUWX_ab_abikldffgijhjkonrnmqbaedcgffjhfhihjfeghgihgicefimnjopgoodnnfnnkmnlnpjlmhjkikllkmgfhllnihjonpkjllkmjiklkmllnmlnllnllnonpkjllkmlnnjlljlmkmnlnokjlkjlnmoonppoqnnppoqrqsutvonpqpronplkmqprtsutsurqslkmqprqprtsuutvnmopoqqprttvtsuosttvwxy}vv|Ӝfin~yvxyvx{xz|{}rvwuyzrvvlpqlpqutvutvutvvuwvuwvtvvvxvuwvuwyxzyxzsuvwyztuvstuprsutxwvzwvzwvzwvzxvzwvzyuz}w|yrwysxqprnmoqpr~z||}}~{|~~x|y}{z}}y{|}}zv{}~|{}}|~~}|{}~~~zzz|||z{z{z|z|{|{|yz{|z{{|{|{||~z|}||~~}vy~|}~||~||}{{~||~~~}~|~}wx~}~~~|~|y{~}z|onr~srt~}~~z}~||~z~|}}}~{}~~{}}~zrntppvrpvxtvxuwwtvwtvwtvqnpurttqssprxuwjgiliksrtutvvuwmlnonpoqrqstqstkmnkmnsuvoqrnpqlnomopprsnkm{xzwtvpmoqnpvqs|wytoqvqspkmtoqvqspkmxsutoqsnpuqvuqvminvrwsotokplhmlhmminplphgkgjn]`dfimcfjlosolnheglikfcemjldcgedh`_cposcbfcbf_[`fbgZV[YUZWSXXTYZV[RNSUQV[W\UTXMLPMLPZY]LKOMLPLIKOLNTPRHEGC@B:9;<;=>=??>@@?A@?A@?ABACCBDFDFFGHJMQJNRJMQJMQJMQMNRNOSOPTPPTPPTRSWPQUQRVXY]YZ^PQUPQURSWWX\YZ^XY]Z\^[]^Y[\]_`Z\]]_`cefXZ[dfgfhihjkhgkhgkcbffdhhfjfegfegfeghgihgilnokopinofnndnndlljlmjlnjlmhjkikllkmjiknmojjllkmmlnkjlkjllkmljlkjlkjlkjlnmojikljlkmnhjljlljlmkmnkjlihjkjlnmopnpnmokjltsutsuqprqpronpkjlqprrqspoqrqsedfsrttsuqprqpr\[]poqrrtrqsrqsrstuwxvw{UU[śö̬’tw|~zzwyyvxsprvsuutvrvwrvwswxmqrnrsutvutvutvvuwvuwvvxvtvvuwutvwvxutvvyzprssuvsuvrtuyx|xvzwvzwvzwvzuvzwvzyuzwsxzty~y~}|~{{|~~|}y}y}}ruyy~rtu}|||sot~z}y~~~~~|{}}|~~}~}~|{}~z|{||}{||}|||||~~{|{uv|vw{|{||}{|{|{|}z}{~{~{~z}|~|~~|}||~||zxx|zz}}~~|~||~~}~~}xz{}|~{~~{}~|~~~{xz|~}~}}~{~}~~wv{|{tswzy}~~}~|~{~z~|~~{yyxvv~|||~}~|~}xuw}yqqwusyyvx{xzwtvwtvwtvtqshfholnqnpqnpurtwtvvsuvuwtsunmonmokjlsuvkmnuwxmoplnortuprssuvrtuoqrjlmjgiolnwtvolnliksmosnpqlnxsuqlnpjlwqstoqtoqwrtnikhdivrwd`eb^cminokplhmlhmminnjnhhl^`d[^bZ]aDGKSVZ`]_TQSmjlXUW]Z\bae]\`VUYNMQXVZRPTOKPWSXTPUYUZWSXOKPLHMOKPSOTKGLQPTLKOONRHGKKJNFFJ@=?HEGHEGB?AC@B98:<;=><>>=?@?AA@BBACCBDBACFEGIHJJJNKLPLMQLMQLMQMNRNOSOPTOPTOPTNOSPQUTUYPQURSWQRVXY]VW[TUYWX\XY]VXYWYZWYZ[]^SUV^`acefdfgfhibdedfgdeideifhlfgkfgkgfhfeghgihgihgibde^bcejkfnncmmdlliklikljlmhjkikllkmonpkjlmlnmlnrqslkmkjljikkjllkmmlnmlnnmojikkjljlmhjkikljlmkmnlkmjikkjlnmoonpmlnlkmnmolkmrqspoqonpqprsrtsrtpoqrqstsuqprsrtrprutv~pprtsurqsqprsvwuwxpswcfkÝĢ{xz|~|y{~{}xwyx|}quvswxptuswxutvutvutvutvwvxxvxtsuwvxxwyyxzwvxvuwxwyvuwxwy{z|xy}wx|vw{vw{vw{vw{vw{xw{{y~}|{}tsunmo~z~z}y~|~~{||}yz~~}}~y|}~~~}~yuzyuz}{z~}|}|~}|~{z|~{z|~{||}}~{|}~|}|}~~||~uop{uv}wx{|}~}~}~}~}}yrux{x{z}z}}z}~|~yz{|ztv~yz|}}~|}{|urtvuw~}}~~|~}}}~}}|~|{}~}|yxz~}xw{~~}}y~~{}~||wuurppzxx|~|~|y{|y{~}z|{xz|y{{|x~yyvtztqsvsuwtvwtvwtvtqswtvvsutqsurturtwtvtrtqprqprihjutvqprmopgijuwxtvwrtunpqmopiklkmnkmnjlmroqmjlolnolnsprxuwljlroqjgisprqoqifhnkmjgiljlqnpxtywsxsotminkglokplhmlhmminlhmihlnrvruydgkadhfce`]_khjlikc`bfeidcgedhjimhgk]\`c_dZV[uqv]Y^b^c^Z_d`e[W\YUZ[W\]\`ZY]SRVQPTSRVPOSURTVSUSPROLNIFH:9;:9;=<>?>@=<>@?AA@BBACDCEEDFHGIDEIGHLJKOKLPLMQMNRKLPOPTOPTOPTOPTNOSXY]UVZRSWQRVSTXVW[UVZYZ^Z[_[]^Y[\WYZXZ[_abacd`bcdfhdfgacd`bbdeideicdheeifgkgfhlkmedfhgiihjgijcghchiemmblldllhjkhjkhjkikljlmnmoonpkjlihj_^`tsulkmlkmkjllkmmlnjiklkmonpkjllkmiklikliklhjkjlmlkmkjljiklkmlkmlkmqprkjlnmopoqonpqprnmonmoqprlkmvuwnmosrtqprrqsqprmlnpnpsrtpnpqprvtvy{|nrv|åͣϦzv{xuwxuw{xz{xzwvxswxtxyswxswxquvutvutvutvtsuvuwxwyvuwutvwvxsrtutvvuwvuwvvxwvxxwytuyuvzvw{wx|wx|tw{tw{xz~~{z|yxzrrt|~|~}xy}y}{tx}|}wvz~}}y~{w||x}~}~~}}|~}~|}{|~}~{||}}~}~{||}{|z{yz{|{|z{z{}~z}|z}}x{z}x{y|||}wxyzxrsztuz|{|~~yz~~~||{xz{xzvsu~|~|{}~~~~}~z|}y~|~~z{{|x~{w}{|zzyww}{{{yyxvv{xz{xz|y{|y{|~}z||z|xuwxtz|zsqwspr}z|zwywtvsprnkm}z|mjlsprtqsyvxurtsprrqsrqssrttsusrtmopqstrtuprtoqrnpqrtuy{|prsmopoqrroqsprnkmpmovsulhjpmoyvx}z|pmoplntqsroqpmoroqroqqmrrnsnjominlhmplqlhmjfkminkglgfjjmqjmqknrehlgjnjfhnkmkhjhegmjljimedh\[_feiedh\[_ZVZhdi`\aXTYeaf_[`eafgch@?>@=<>@?AA@BBACDCEEDFHGIHGKIHLLKOLKOMLPJKOLMQRSWOPTOPTQRVRSWXY]UVZTTXRSWRSWTUYTUYXY]Z[_VXYY[\UWXUWXY[\^`a^`aacdbdecef]_``dhbeicfjbei`cggfh`_afeghgiihjdfgfjlbghdlldnnfnnmopmopikljlljlmnlnnlnkjljikmlnrqsllnlkmkjllkmmlnlkmmlnonpkjllkmjlljlljllikljlmllnlkmkjllkmlkmlkmmlnkjlmlnonpnmoqprqprsrtpnppoqtsupoqtsusrtrqsnmomlnrprtsunmomlnutvxz|nsvy¥ʬ Ī}wsxurturtzwy{xzvvxostquvvz{txyquvutvutvutvtsuvuwxxzvuwvuwxvxxwysrtwtvwtvwtvxuwyvxsvzpswnrvsvzsvzqtxsvzz{z{vuytpuwvxutv~}}|~poq}wt}~~{}~~uvz{|~}{~|xz{~z~}|~}|~|{}{z|~~}|~{||wx~~~{|~xy}~|}zturlmtno{|z|z{yzz{|}|}z}|x|z}}y|x{x{y|~xz|vwwqryst~xy|}{|~xy~|}~}|~~}xwy~~~|||zzz~~~suuuzyntrwyynppxxxrrszy}~xw{~}~|~xwy{z|~~}|x}yuz}y~wsx~z~~}y{w}|zxxxvv{yy{yy~||}z|}z||~~~~|~~z||{yyvxzwyvsuvsuvsuroqvsuwtvurtspryvxzwywtvrqsrqsrqspoqqprnpqnpqnpqnpqoqrprsoqrqstnpqlnoiklroq|y{hegtqsmjljikmlnrrtutvssuiikrqsutvrqsrrtonprntrnsuqviejkglrnsminkglnjnkglhfjbeifimZ]anquehlifhkhjfcedachegfeiedh`_c`_c^]a^]aa]b`\a`\aWSX^Z_]Y^_[`hdiHDI_[`XVZYX\XW[RQUQPTPOSQNPURTSPRQNPMJL:9;:9;=<>?>@=<>@?AA@BBACDCEEDFHGIIHLMLPKJNLJNLLPHIMKLPRSWNOSPQUQRVSTXWX\TUYVVZRTXTUYWX\WX\TUYSTXVXYWYZWYZVXYXZ[^`a`bb_abbdedfg`bc_bfbeidgkbeibeiedf\[]dcehgiihjacdjnoinojrrdnnckkoqroqrkmnjlnjlmmlnljlljlihjqprnnpmlnkjlkjllkmmlnjikkjlonpkjllkmjlnjlnjlnjlmkmnnlnllnljllkmlkmlkmpoqnmollnnnpnlnmlnnmopprnmorqsonpnmoqprpoqonplkmnnpsrttsunmomlnrqsxz{nsv¢z}{~yuzvsuvsuxtvyvxvuwptuquvtxyswxquvutvutvutvtsuvuwyxzwvxwvxvvxqprvuwwtvwtvwtvxuwyvxux|x{y|tvztvzuz}rwzrvzxy}yx|yx||{}usy~~~wx|vw{|}~~~v{||x|}quv~|~pswz~}{~}y~~~|}y~{w||}|~~{z|xwy}|~}|~||z|{vw|}~|~|||vw|}|}wqrtno~{||||}{|}wxz{z{}~y|{~~xz~wz|z}z}}vyyruz{{|{rt|stwx|}z{|vw{||}~urtxuw|y{~zwy{xz}~~}}|{}yxz|~{}~prs}|~}|~}|~~~}}|~~}|srtxwyxvxuuu{{{|||pppmmmyyy{{{sss}}}}}}wyy|~~|~~tttzzz~}zy{|{}{w|~~{w|~z}~|~z}y}}}}}}}}~||{xz|y{}z|}z||~}~}wu{}zwyvsuvsuvsuvsunkmqnpyvxvsuvtvyvxwtvrqsrqsrqstsuutvrtuprsqstrtusuvtvwmopprsprssuvuwxtqsifh[XZvsuqnpnmonmovtvutvnmoutvxwyutvlkmrqsrqsrntrnsuqvtpuqmrqmrlhmjfknjolhmhhlknr`cgbeihlpadhfcemjlnkmdachegdcgcbf`_c_^b^\`baegch_[`a]b\X]]Y^[W\ZV[d`eUQVTPURQUVVZXW[SRVTSWPOSPMOSPRIFHJGIFCE:9;:9;=<>?>@=<>@?AA@BBACDCEDCEHGIONRKJOJIMJJNKJOIJNJKOPQUNOSPQUPQUQSWTVZTUYXY]STXSTXUVZVW[UVZ[\`Y[\WYZ]_`Z\][]^^aabdd_ab_ab^`a_bc]beafichkdilfjmhgifeggfhhgiihjdfgfjkdhifmmbkkbhimppmpplookmnjlmmlnjiklkmnmnqpqlkmmlnkjlkjllkmmlnlkmmlnonpkjllkmkmnkmnkmnjlmknonmomlnlkmlkmlkmlkmonpkjllkmnmomlnonpmlnmlnmlnqpronppoqsrtrqssrtrqsqprsrttsupoqqprqprz{}mruˢ|}y}zwy{xzvsuxuwvuworskopostostrvwutvutvutvtsuvuw{z|wvxwvxvuwvuwtsu|wxzvx{vx{vx}xztz|ty|ty|rxzsy{swzquyuw{xy}|{|{wvxwwy~|{}yw}~|}~}~qswxz~stx}~~~~~z}vy~|~{~}|~~}|~~}zyz|z|{|z{{vx||z|z{|}}wx|}|}z{yst{{|}}~yz|}{||}x{{~~wzy|y|z}~x{ngj{|xy}tu}tuxx|}||~xy{|~}~}}toq|~|~~{z|~npp|~txy||}|~~jlluwwtvvxwy~qss|~~~{~jlm}uwxwyz}|~tsw}lllqpq~}}|~}|{~|{}~~|z||x}}y~{||vrx}{{|}}{{|}~|{}zwx~{}|z{{xy|~}|x~}y|w~wtvzwywtvsprwtvsprpmoqnpqnptqsqnptqsrqsrqsrqsvuwutvqtunpqtwwtvwruvpssnpqtvwrtuvxysuvwtvqnprprurtrprnlnfegyxznmojikrrsqprnnollnrqsllmrnsrnsokptpusotrnsnjolglpkplhmihlhkoilpgjncfjbdhfcekhjifhb_agdffeicbf]\`^]a^]a_^ba]b]Y^^Z_^Z__[`[W\XTY[W\]Y^KGLRQUTSWVUYPOSRRVLKOROQROQJGHOLMROQ<;=<;==<>@>@=<>@?ACBDB@BFEGMLNGFHIHIKJLGGMKNSJMUIJNLNROPTSTXMNRA@DXVZSRVQPTXW[QPTPQURSWQRVWX\^_cXY]STX_`eXY][\`a`dcaf]^b^_c[^bY^aY`c`ehadhdfjhhlXZ[gjjdfglnoacdfhiiklacdcfgilmnpqnmqnmqkinmlplkokmqhimjkoghlmnrnmonmolkmihjkjlnmolkmkjlmlnjikhgijikjikjikkjlmlnlkmkjljikkjlkjlkjlkjllkmnmoonpkjlmlnlkmpoqqprqprmlnpoqqprrqsqprrqsnmopoqpoqnmorqstpupmuss|bfgzwyxuwvsuroqqnpxtvsrtqqstsuttuvuwsrtsrtsrtqprsrtutvzy{vuwtsuzy{zw|~}wuzyx}zw|wz~orvmpuvy}vvzyv{zx|urwminxsyroqwtv}}z|}~xw{~}{z~zy}rqszu~}y|~xy}|z|~}|yx|}}~~~~z}~~}z|}z|zwy}z|}}~xsxz{yz~{~y{|~ytv~{}|wzz||~z}}{}z}{}y|x{~wz|uxx{{~{~x{yru}x{z}~x{}{~y|z~z}}{~|{||~~~|~}|~}~~|zz~||~zxxyxwqnpwtv~}svw~~yxzwvxxwy}}}~~~~}}y}~~y~~~z|}~xwy{}~~}nnphhjnmo~}yxz{z{vuw{z|~ztv|~}~}|yzyuzzv{}|~zvuyrqutsvyx|~zzv||x~~z~zyy}|{srvrv|wvzvuzxuwvsutqsurtvsutqsnkmxuwwtvvsuurtsrtpoqpoqtsupoqqoqrqsrqsqprsrtwuwusutsusrttrtutvorrqrtqstpproqrqnsqmrsotqmrtpuxtyrnshdiojpokpqmrnjosotnjotpuplronrjimnmqihloorlkousubbdjikgghjikifhgdfhegc`bb_a`_cbbf_^b_^b_^b^^ba]b`\a^Z_]Y^\X][W\VRX[W\XTYWSXSNSXTYTPUSNTRMRRNSMLPJINMLPLKPLKO<;=<:<;:<@?A=<>>=?CBD@?AA@B=<>GFHHHJKJLJJPKNSGJRMNROPTNOSPQUMNRGFJVUYSRVONRYX\XW[TUYSTXTUYTUYSTXUVZWX\ZZ^Z[_VW[_^ba`d]^b^^b[^bZ^bZad`ehcfjfgkhim_abcefdfgmopY[\lnogijdfgcefjlm]_`feijimonronrkjnhimfgkhimghlijnjikljlihjihjjjlllnljllkmmlnjikihjjjljjljjlkjlqprlkmkjljikkjlkjlkjlihjjiknmonmomlnjikjikrqsmlnlkmllnpoqqpronponponpmlnpoqpoqmlnpoquqwtqzmnvŜwuz{rvvyvxvsuwtvtprtqsxuwtsusrtvuwwvxxwyvuwvuwvuwutvutvutvyxzwvxxwyqprihj}|vuy{z~{z~ww{yz~vw{wx|ww{|}y~yuzxtyrns|x}|~}z|~|~~}}|~~|{|{}zy{wvx~{{~y{{|}}~}{rw~~}|vuyvuy~}{wsx|||~}}z|~{}zwy{{{pjoy~y~}}{uz|~{}ytv}xz~xz{}z||~~y{z||~{vx~y{~y{{}y|x{~wz}vyx{z|||~wpsg`cx{z}z||y|x{z}z}|~|~|~|y||ux{}|~{}|~}}}zxx}{{}}vsu}y}~|onpyxz~}|~y{||~|oqrvuw|~~}~zy{vuwzy{xwy~}|~|~}~}}}yvx~{}}z|}|x}}zy}~||x}~z}y~~z{~}|nmqzy}qpttswsrvxuwvsutqsurtvsutqsurtvtvroqroqqnprqspoqrprrqsrqsonppoqqprqprrqsttvtrttrtpoqrprrqsnpqnpqmopoqroqruqvyuzwsxvrwuqvwsxtpuplqxtytpuokpminplqnjornrnjomlpkjnmlphgkmlphgkxwygfhfegedffegkhjgdffce`^`b^`a`dbae_^ba`d_^b]\`YUZ]Y^]Y^\X]ZV\XTYUQVWSXVRWWSXTPUYUZUQVRNSOKPMINKJNIHLJIMJIMJIM98:;:<<;=CBD@?AA@B@?A98:DCEFEGGFHIHJGFHHHNJMRFJRJKOOPTKLPOPTPPTONRTSWQPTONRWVZXW[UVZTTXSTXTUYVW[TUYWX\TUYWX\VX\_^b]\`]^b\^b[^bZ`b\cfbgjadhcdhdeieghbdebdecefgijbdegijbdeeghegheghedhkjnmlpnlpjimghlefjijnijnjkohgijikjikhgijhjjikkjlllnmlnkjllkmljlljlljlkjlqprlkmkjljikkjlkjlkjlihjjikkjljiklkmhgigfhqpronpmlnlkmonppoqonpmlnkjlmlnrqsrqsnmoonprnttr{|~–z~urtqnpvsuvrtxuwyvxrqsqprsrttsuutvvuwvuwvuwutvutvqprsrttsurqsutvihlrqu{z~yx|qrvpquklpstxvw{zv{|x|}y~sotvrw}z|}z||y{~zy{~{z|~~}}|{z||lpq}~z~w~}~kjl|{}{z~~}rqu~}~}|}~|}y~{~z{|}qnp}zwy|~y~y~y~pjoy~y~}}y~~x}z|}}~z|{}~y{~y{~y{~y{|wyzuw~y{|~~y|x{~wz}vyx{x|{~{~yruunqy|x{z}{~~z}|{~z~z~z~z|{tw{}|~{}|~}~||}{{~~~~}z|~{}yxzyyywwwz~~}~}}|~xwy~zy{~|{}|~|~{}}xz|~}}}{xz|y{|~kgl~z~z{z~~~}y~~{|}{z~}|}|utxmlp~srv}|xuwvsutqsurtvsutqstqsvrttqswtvtqsqprpoqrrtrqsrqsonppoqqprrprqprrqsrrtrrtpoqpoqrqsprrnpqmopnpqprssotvrvtpuwsxsotsotxtysotqmrqmrqmrnjoplqplqplqlhmposdcglkojhlmlphgkfegpoqedfcbdedffcehegkhj_\^a^`a`d`^b_^b`_c_^b^]a^Z_]Y^]Y^ZV[XTYWSXUQVUQVVRWVRWTPUXTYSOTNJOOKPPLQLKOJIMJIMJIMJIM546;:<@?ACBDA@BCBD?>@@?ACBDCBDJIKQPRIHJCCIFINEHPJKOSTXOPTOPTSTXSRVTSWPOSQPTTSWRQUSTXTUYTUYSTXSTXTUYTUYSTXXZ^WX\]\`[Z^]^b\]a[^b[`c\cfchkcfjefjefjeghhjkeghiklcefeghdfghjkgijdffacddcghgkihlkjnjimhimghllmqfgkijnihjkjllkmhgiihjhgijikmlnmlnkjlmlnlkmlkmlkmkjlmlnlkmkjljikkjlkjlkjlkjllkmnmolkmqprrqskjlwvxonplkmkjlnnppnppoqmlnkjlpnputvutvpprrqsusyonwÖ߅wtvspr|y{xuwyvxzwytrtsrtrqssrtutvutvutvutvtsusrtpoqqprtsuvuwyxzsrttswqpt}|zz~{y}wvzyx|zx|zy}xtyzv{|x}sotzv{}}z||~vuw{z|wvx}|}|xwyvtvuwx}}y~~x~|}}{{zzzsssxxxzzziiilnntuv{}}xzzy{{uwwvxxuvv|~~dcevuwvuw|{}|~yvxutxwvz~}|qptxvz}||x}{w|zv{{w||x}~z{}y~}{|x}}}z||~~|~{zzpjo{{zy~y~|~}}|~z|z|{}}xzz|z|z|~xz|wy}xz|~{}y|x{~wz}vyx{y|z|~wz{tw|ux|uxx{z}z}|x{}}vy}y|~z}z}z}~|zsv~}{}|~}~||~~{yy}z|x|}z}}~rvx~z|}uwx}|~}|~|{}wvx~}}|~|{}~}|~~}}|~~{}|xz~{}^Z_}y~|{z~zy}~|{~yuz}y~|x}}y~~z~}}|~}uu{zwvzyx|xuwvsutqsurtvsutqs|y{urtwtv{xzwtvpoqpoqsrttsupoqpoqrprsrtrqspoqrprrqsrqsqprrprsrtqstoqrnpqnpqprsuqvqmrrns{w|tpusotvrwxtyqmrplrplqrnsqmrtpuqmrlhmmlpmlpmlplkoonrihljikhgifegdceedfheggdfifh^[]b_abae^]a_^b\[_`_ccbf`\a_[`]Y^ZV[VRWXTXWSXUQVWSXTPUSOTVRWPLQRNSOKPNJOJIMGFJHGKHGKHGK879:9;>=??>@>=??>@879IHJEDFGFHGFHIHJIHJ;;AILQHKSOPTKLPJKONNRSTXSRVRQUQPTQPTPOSRQURSWSTXPQUSTXSTXTTXVW[RSWZ[_VW[^]a]\`]^b\]aVY]_dgX_bbgjadhdeifgkgijdfgbdefhibdegijhjkdfgeghcefgijgfjihlhgklkokjnefjfgkjkoefjfgkfegmlnlkmjikmlnjikihjkjledfmlnjikkjlkjlkjlmlnnmolkmkjljikjikkjllkmnmopoqpoqonplkmonponpmlnmlnmlnmlnnlnnnpnmoonpkjlrprtrtrqsrqsqproouuu~ğtyzrvwwtvxuwpmospr}z|vsutsutrttsuvuwrqstsutsugfhwvxqprrqstsuvuwutvzy{xwyvuyyx|vuyyx|zy}xx|yx|}|xw{vvyxtyxtyyuz|x||x}||y{}z|wvxzy{zy{vuy~xsu|}yz~~{|jlmvxymopvxy~uwx|{|yxzwuuyww|zzxxxrrrrrrwwwwww|||yyyuuuxxx||||~~|~~xzzqsstvvsuuxzzy{{|~~{}}yxz}||{~}~|}}{|~~z}z|}~{}|~xrwy~||{{y~y~||{}{}{}}|~{}{}{}~y{|~~z|z|{}z|~y{y|x{~vzx{x{x{x{y|x{x{x{x{x{{~|~wz~wzx{z}{~{~{~{~{~|uxibe|ux}|~|~{}z|~||~||z~rvwy{|uwx}~{}~z|}x|}y{|tvwzy{}|~~}}|~srtyxzvuwzy{|~{}z|}|~|~|~}~z~~z{||{{z~zy}~tpu||x}xty}y~zy}{z~xw{yx|}|||ãy{z~xuw}z||y{yvxvsuwtvsprtqsvsutqstqspoqqprsrtsrtpoqrqsrqsrqsqprqprqprrprpoqrqsrqsrqstvwsuvnpqnpqlnoplqqmrtpuzv{yuzsotsotvrwtptrnrrnsokpqmrplqtpuqmrnmqxw{nmqedhihlhgkjikfegedfdcefegifhebdheggdffce_^b^]a]\`bae\[_YX\_[`]Y^[W\ZV[ZV[XTYVRXVRWVRWUQVLHMVRWNJORNSQMRKGLHGKGFJEDHEDHEDH;:<:9;<;=>=??>@=<>;:<>;:<;:<=<>>=?>=?FEGIHJCBDHGIIHJGGMCFKCFNIJNHIMHIMKLPPQURPTRQURRVSRVRPTSRVSTXSTXRSWOPTSTXRRVRTXTUYZ[_Z\`\Z^`_c\]a[\`X\`]beips_dgbeicdhbcgcefbdebdebdecefdfgbdedfgacdeghfhifeifeigfjlkokjnghlghlijnefjfgkhfhhhjhhjhhjgfhihjihjkjllkmnmoljlkjlkjlkjljikkjllkmkjljikjikkjllkmonpnmohgikjlonponpnmomlnmlnmlnlkmnlnnmohgijikgfhonputvutvtsutsugko~xnstquvtqsxuwpmoroqtqsurtsrtqprutvtsuutvonpqpryxzkjljikrqsrrtsrtsrtonptsutswrquyx|{z~wvzsotokp}y~yuz|x}wsxuqvsotrnszv{vrvpmotqsyvxyvxurtrpr~}poqdcerqsrqulkogfjyx|mlp{z~|{}zy{rqsvuwwvxsprspryvx{xz~{}rmomhjyxzvtvvxywyzwx|{yy|vw}~xy}{x}|}tyx|v}|{xzz~zz~~}}{w|{~z}~~z~z~z~xrwvpuz}w||{}{}{}z|~y{{}{}{}~y{~z|z||~|~z|~y{}xz|ux}vy~wzx{x{x{x{x{x{x{x{x{x{~wzz~}vyy|y||{~{~|||y|~wz|~}~|~|~}}}{{~~}}{yy~{}z~}}}|~~vxy{}~y{|xz{{z||{}|~|~}~{}|~|~|~~{}}xuw~z~}{{zz~zy}~}njo|x}~z~z~z~}~~{z~ttzutxqptwtvtqswtvwtvtqstqsurturttrttqssprrqspoqqprnmopoqrqsrqsrqsqprqprqprrrttsurqsrqsrqslnokmnlnooqrqstwsxsotokpxtytptrnssotqmrtputpunjolhmsotkglrntplpnmqnnrlkomlpnmqhgk`_apoqhgi_^``_adacc`bjgifceb_a``d`^b^^b[Z^edh_^b_[`\X][W\ZV[YUZWSXVRXVRVXTXVRWTPUTPUPLQOKPMINNJOKJNFEIFEIFEIFEI98:<;=@?AA@A;:<>=?>=?A@AEDFDCEBACBACHGI@AFILQCFLGHLGHMGIMEFJJKPQPTRQUSRVSRVRQUSSWVW[UVZPQUQRVSTXQRVQRVVW[Z[_\]a[Z^`_c\]a\]aZ]a[adcjm_df_bf`cebcgdfgdfgdfghilfhjefiacefgjeghgiidfghgkgfjgeikjnjimhjnfhlhimefjfgkhgifeggfhhgiedfihjihjkjlmlnlkmjikkjlkjlkjlmlnnmolkmkjljikjikkjllkmjikljlrqspoqnmoonpnmomlnmlnmlnnmopoqpprqprtsuqprrqrtrtutvqprmlndgllow[biwŦZ`borsolnolnolnroqroqtqsrqssrtrqspoqtsupprtsupprpprpoqrqsqprrqspprrqsutvtswtswtswonrrqvvpud^cninwqvxrwtpuuqvvqvuqvxsxrnssprmjkyvxspr~{}{z|gfh}|~{z|{z}|rqv~}vuy~zy{~|{~{xz|~xy}~}||{|x|}uzz~kruvxx~}~wvx~yz~}zy}yx|~}{{|y~}~z{w|}|}}y~y~x}|v{|v|}w|y~y~{}{}{}|~z|{}{}{}~y{~y{~y{}xz|~}|~z|{~z}y|x{x{z}y|y|x{x{x{x{x{x{x{}z}y||{~}}}}|}|~}~}|~|zz|{z~~}|{zwyrvw{|}~~~~~}}~}}}~{}~xz{}{z||{}~}}|~~}~}|~}|~|~|~|~|~~{}}~||ww{~||}}|x}|{|~z|{}||{~}yx|mmsyzz~nmqyvxsprxuwurturswtvurturttqssprroqrqspoqqqsooqpoqqqsqqsqqsqprqprqprususrtsqsrqssqsnpqnnppsspqsoqrvrwmhnqmrvrwsotsotuqvuqvplquqvqmrokprnsplqrnsokpkjnonrjimhgkfeigfjjikonpnmoa`bbacgdfjgihegb_a`^`a`d`_d_^b`_c`_cUTXb^c^Y_]Y^\X][V\YUZXTYXTYXTYWSXUQVRNSSOTSOTNJONJOJIMIHLFEIGFJFEI;:?;:>=<@<;?<;?A@D?>BBAEEDHCBFEDHA@BKJLIHILLOIILKJLJHJJIJGEGIHJPNRPPTRTXSUYOQUPTWRSWOPTSTXVW[OPTOPTQRVXY]\]a]^b[\`^`dZ[_UVZYZ^adf^cc`feZ``^dc`ee]ab[_`^ae_bgadj^`i_ajcflbejdhldgkklpfgkefjghlfgkjikihiihjhfhihjjhjihjgfhfegfegfeggfhhgipoqnmogfhkjllkmkjllkmlkmhgklkojimjimlkoihlihjhgiihjlkmnmoplnmjlpmoplnqnpsprqnproqsprrnppmokjoposrquonrmlqξ֜Կۻ֛һצŚprvyx|urttqspmovsumjlqnppmosprtqsroqwsuuqsroqurttqsurturt}z|urttqstqsvsusrtvuwttutsurqswwzwuysswtrvrrvzy}}|yy}uuytswvuy~}xw{ww{utxrqssrtsrt~|{|vuw}|~yxz~}~}~{~~tuuvwwz||z|{uwwvxyuwxxz{}~}~|}|}x{tw|ruz|{~~}xz|{z~~}~~|z||wy|wz|~~~~}|}vuy~ysuz|}~{}{}z||wyuqr}y|y|z{~{}~|}y|y|y|}z|~|~|}{yzz~yx~xx~xxz|z|{}~}|~|~~y{~z|{}{}}|~{vx|wy~y{|~|~~y{z|{}z|{}|~|~mij|~}{}{}}|~|~~zwy|~}z||~}}~~|}}z|||~|z~~~yxztsuxwy~}~zz|}}}|~}|~}|~~{z~zz~}|}|||{z}y~|x}|x}~z{~z{{w|~}~}~~}~}nmskmuu~rqu|x}hdizu{uqvtpuvrwurturtvsusprsprroqroqroqroqroqroqroqroqqnpsprtpr}xytpqxrstpqxstpmpqmoroqsprsqsurttqrwtvifgpmnsotsotrnrqmrminokpsotplqokpokpmlpihlkjncbffeinmqifheacifhgcedacheggdfc`b`]__\^b^`^[\`]_`\^_\]_\^`^_^[]^\]]Z\\Y[]Y^]Y^[W\VRWRNSRNSRNSUQVUQVKGLOKPHGKHGKIHLFEIHGK87;=<@98<87;;:>BAE@?CEDHBAEB@DDBFGFHLKMGFHLKMIHJJIKGFHFEGHHJHGIMLPNMQQRVVW[RUYQVYSTXNOSQRVRSWNOSPRVRSWUVZXY]Z[_Z[_]^bZ[_Z\`[\`acd\a`\a`Y^]\a`]ba[_`Y]^[^b_bgfhpfgqdeodfn`chbeibfjijnefjfhlhimhimutvnmoihjjikjikkjlihjffhfegfegfeggfhhgijjljikedfgfhpoqnmomlnjiklkohgkhgkhgkcbffeiedfgfhfeghgijikmjlhegifholngdffdfgdfifhqnpjgiroqnmqmlputxƺ̽ӤѥƠq|ehpstxsrvwtvwtvtqsxuwolntqsroqsprsprpmoolnyvxkhjrnproqlikqnpxuwurtwtvsprsprtsuwvxtsuvuwtsuvtxwvzwvzutxrqupossrv~}rquutx~}zy}xw{utxrquqpr}|~tsuutvxwypoqzy{{z|onpyxzzxzxwyyxzwvxqprprsy{||~{}~}|~~|~~~{}~xzzz|}}|~{|}~xz~~}}z|{xz}leh}xzz|~xz{vxzy{~~~~~}}~|{~y~|~}xz{}z|z|{}~|~|~{vxwrty|y|}xz|y{}z|y|y|y|{xz|y{yz}xw~xx~yx~yx~yxz|z|}}{}|~~z|z|{}{}}{}ztv|wy~y{|~|~~z|z|z|~z|z||~|wy}xzytv|~{}}|~|~~|y{}~|~}|~|~~tvv~yz}|}z{yz~~|~prs{}~wvx~}xwyvuw|{}{z|~}~}~|{|z~}|}|}|{~z}y~|x~|x~}y~}{|}y~yuz~}||~}~}~}giqŞz{~rnsuqvtpuvrwurturturtsprsprroqroqroqroqroqroqroqroqsprpmoolnsqqvttnllommsqqvsuqnproqtqssprzwykhjspr|y{jgisprsotuqvtpuqmrminminplrminokpkglgfjhfjkjndcghgkmlpkhjdacgdfc`bfcefcedacebd`]__\^`]_^[]c`bb_a[XZheg_\^ZWY_\^_\^`]__[`]Y^kgl[W\PLQYUZNJOTPUTPUMINKGLHGKHGKHGKEDHDCG76:<;?:9=98<=<@FEI>=A@?C?>B@>BCBF?>@?>@@?AFEGEDFDCEGFHHGIJIKJHJHGKJIMNPTTUYQTXOTWUVZQRVRSWRSWQRVQRVRTXQRVSTXVX\XY]ZZ^Z[_^_c_`dace\a`\a`Y^]\ba^cb]abZ^_[^badigiqefp`bl^`h^afbeibeideighlijnnosqrvlkmkjlfegihjihjihjgfhfegfegfegfeggfhfegfeggfhedfkjlonphgijikgfhedhedhkjnlkoonrihldcefegfegfegfegifhjgipmosprkhjqnppmoroqtqsolntqsmlptswonrkjnutxmluϝԧóϡӦw}t{kmusrvrmrtqsurttprvsusprroqpmoqnprnppnpmjl|y{liknkmolnxuwqnpvsuurttqstrtxuwqprtsupoqutvrqstswvtxwvzyx|tswrquqptxw{}|ihlrqugfj~}xw{vtxtswutv{z|}|~{z||{}zy{yxz|{}tsuzy{vuw~~}{}~|~xzz|~~}y{{|~~|~~}y{|suv}}~z}z}|}}~{|yz~|{yxzyvx|~~wps}xz{}|wy}xzxsumhj}z|~~}|~}|~~~}yz~~}xw{}|~}z|~~{}ytv{}~|~~y{~y|y|}xz|y{}z|y|y|y|{xz|y{yz|wv|wv~yx~yx~yxz|z|~y{{}z|z||~z|{}|~}}z|wrt{vxz||~|~z|z|~z|~y{z|z|~y{~y{toq}xzz|~z|~|~~|~~}z|~{}}~z|~|~~|~|}}~}~~~}{~z{edf~}~}~~}~~|{|{}|}|}|{~z}y~~z~~z~~z~~}y~}sotzy}|{~|{{yhint}w|ijn}{w|{w|uqvtpuvrwurturttrtroqroqroqroqroqroqroqroqroqroqqnptqsurtommvtttrqsqqommqnpsprurtxuwvsuxuwifhpmourtpmourtvrwwsxvrwplqokpminokpkglplqlhmfeifeijimkjngfjbaeifhhegifhdacb_agdffceifh_\^^[]c`ba^`fceb_aZWYYVXZWYXUWc`b_\^ZWY[W\XTYRNSOKPTPVZV[RNSMINOKPMINNJOHGKHGKDCGBAEBAE21564887;76::9=<;?76:@?C<;?>=AA@D?>@LKM?>@FEGDCEDCEDCEDCEIHJLKMFDHHHLMNROPTMPTHMPOPTPQUPQUOPTPRVSTXSTXOPTPQUTUYXY]WX\YZ^XY]\]a^_c[]^YZ\YZ\\^_]_`\``W[\TW[`ch_aiabl]^h[]e^afcfjehlghlrswhimjkoghllkmkjlcbdgfhedfbacdceedffegfegfegfegedfdcegfhfegjhjihjhgidceedfdcgfeigfjfeigfjlkohgifegfegfegfegjgihegljlpmovsumjlifhhegmjlqnpjgicbflkokjngfjzy}jisΤ˗ͥѭɵ˱ǿҩʀppsxtyroqurtsprroqwtvkhjjgiqnpolnqnpnkmmjlqnpnkmtqsc`bvsuxuwurtwtvtrturtrqsutvonpwvxutvsrvsrvsrvwvzpospostrvwvzyx|pos|{xw{vuyvuyxw{vuw{z|~{z|wvxyxzvtvxwywvxtsu{z|~rqs~}yxzyxzsuvvxy~z|}y{}y{|}}~xy}tuyvw{wx||~|{|~wtvyvxzuwz|uprxsuxsu}xzytvqnp~~z{}y~~~~}}yz~|}{}}}|~nikxsu}xzy|y|z|~{}|~y|y|y|~{}|~zz}xw~yx~yx~yx~yxz|z|{}}|~~y{|~{}{}|~}~z|vqs{vxz||~|~{}z|~y{}xz~y{z|}|~|wy~xzz|~y{~y{~{}~{}}xuw|~{xz~{}{xz~{}~{}~xzzrtt~uz{~z||~x{}~zy{~}~kjl}|~{z|~}~{z|}|~~}}|~}||{}|}|}|{~z}y~~z~z|x}~z|~{}|{{z~}|~qpvx|xuz}y~{w|uqvtpuvrwurturttqsrnpqnprnsrnsrnsrnsrnsrnsrnsrnssntqmrpmpmlnonpnmoqprnmpsprpmoroqvsusprolnmjlqnpsprroqolnuqvsotminhdilhmplqplqkglqmrplqjimhgkihlkjnihl`_cdaca^`b_agdfb_ac`bgdfgdf^[]^[]b_a_\^`]_c`b\Y[\Y[[XZOLN\Y[YVXWTVXTYZV[XTYPLPZV[PLQC?DMINUQVHDILHMHGKHGKGFJGFJKJN32621587;87;:9=;:>=<@76:>=A98<>=A>=?@?A;::9=>=A::>BAE;:<>=?;:CBF=<>@?A@?AEDFEDFCBDDCEEDFEDFIHJLKOGFJFGKJKOPSWLQTNOSJKOSTXNOSMNRQRVSTXRSWVW[XY]WX\YZ^YZ^Z[_UVZ]^b\[^\\_``c``c``c[_`^bc^bf[^cbdlcdn_`jcemfinfimfimxy}pqufgkfgkqrvgfhbacedfhgigfhffhffhffhfegfegfegihjjiklkmfegcbdgfhhgidce^]_edfgfjcbffeidcgdcgihlhfhhfhihjjikihjjfhliklikpmoplnjgiroqliktqsdactqslkoihlnlpgfjhgk~βͦũƝDZ͗Ĩܒqnw}w|zsxxsuwtvxuwurtvsusprurturturtrnpqnppmosprolnroqqnproqsprtqsurturttqspoqqprsrtnmosrttswsrvutxposhgkrqusrvxw{yx|posvuytswutxonrmlputxyxzyxz~}xwyvuw}|~yxz|{}yxzpoqwvx~}}suvvxyz{}|}|}~|}z{}~~|z}}z~z}z{x{}y~uqvspr{z|zvxvrt{vx{~}xzvrt}xzz|{vx~}|~~yuz{w|}~|~~}z||~{}{}|~}}zuwz|~y{~y{~y{~y{}tw|uxz||y{{xzvy{twy|~{}zwyz{}xw}xw}xw|xv|wvzuwxsu|wy~xz|xz|wy{}}|~|~~y{z|}xz~y{z|}~y{{vxz|z|~z|z|~y{~y{~y{ytv|wy~{}|~}z||~~}~}|~~}|~{~|yz~|~|{}~~}|}|}|}|{~z}y~|xty~z~}xw{xw{xw{xw{}zwyCFJtswvrxwsxwsxvrwvrvurturtmjlwtvsprrmwpkutnxtnxtnxrmvrmvrmvsnwtoxspxoosoptoptmnqnossprroqsprolnnkmsprqnpurtroqroqsprqmrtpuplqkglxtyqmrplqminminplqlkolkogfjlkoedha`difhebdebdebdjgiebddacfceebda^`daca^`gdf^[]`]_ebd[XZ\Y[VTVb_a\Y[WSXWSXTPTUQV^Z_PLQMINOKPMINKGLIEJHGKHGKEDHHGKLKO-,/20421443665865::9=76:;:>87;BAE<;=>=?A@BDBDA@BCBDDCEEDFFEGHGIIHLEEIIIMFHLJMQLQTKLPMNRQRVMNRPQUQRVSTXRSWVW[WX\TUYVX\VW[YZ^VW[[\`ZW^[X_`]d`]d`]d[_`_cd]`d\]c`ah``jdfohkqehmmptcgidfiijmhjmkmpjlouuv}|~hgijikihjgfggfhgfgfegedffegfghjijgfhbaca`afefhgicbda_afefbadbad`_bfehhgkjilhgihgihfhihjhgihfhlhjkhjlikpopmklpnomkmrprgdfvtuqqukjnljnutx~ǨèȠǰ̡{|gfooltvpuvotuqstrtvsupmoolnolnsprurtvsuqnpqnpsoqqnpsprroqqnpnkmqnptqsolnurtrprqprpnpffhqrsrrttswsrvutx~}rqvutwrquutwqptonrsrv|{~~}}{}yxzyyz}}zz|}|~~wvx|{}|{}utv|z}zxz|{}~suv|~xz{ruu~~~yzyyuu~}}~uvzvw{wz||}{y}{}~w}~rnstpumkmwxywuwwtw}~ztvrnp|wy|~zuw{|}}|{~}~|}zy}|x}}x}~}~}xz}{}~{}|~|~{}z|}xz~y{~y{z|~uyy|z|}y{|xzwzy|x|~{}zwy{{}xw}xw}xw|wv{vu{}wrtzvx|wy{vx~z|{}~z|{}~z|~y{{}~z||wy|wy}xz|~z|uprz|~y{~y{z|z|~y{~y{~y{~y{}~~|~~~|~}z|~{}|~|~|}~{}}|~~|~{~}~egh~|}yz~~~}{|}zz|~}|~}}|{~z}y~|}y~}spuplq}zupvvsxyw|xvzxw||{{{zwyY[_vvzxuzxuzwuywsxvrwurturtqnpnlnxuxsnvplstpwtpwtpwrmurmurmvsovtoxspxilqorwnqvilqlotsprroqurtursomoolnnkmvsupmnolnsprsnspmqrmskhkqlqolqmjojfkgchmhmlinfehhgkhgjjim]\_fcfb`a^[^dbdfcffcec`bgdfdacc`b`]_`]_^[]^[]_\^a^`YVXYVXVSUb_a[XZXTYVRWSOTUQVKGLPLQJEJNINJFKJFKJFKIHKIHKCBEHGJB@D..-01/554454443324:9=98<76:;:>=<@BAC?>@>=?BACDCEBACBACDDFFEGFEGGIJDHIOSWDINDKQGMRMOPRTULNOLMQOOVOPTQRVSTXSTXSTXSTXUVZYZ^WX\\]aTUYWX\UVZ\^a\^a\]aX`c\ad^aeb`de`ehfhnonnppoqrott|}}zvuuqvplqjfliejiejjimfeijimihllkobcgadhdfjcdhhgkhgkjfejeefcblggkhgdbb\ZY_]\fdcigfiggjfkjfkgfjghlegkdhlihjmkjkljimklifjhgfhh`dcVXYfimhgkrlqupunmq׮ũţÕӦĖ˪¨qzpyemuhgoxv|tquropooqprsqpronproqrmourturttprsprroqmlnqqsrqsonpnmoqkmrmoqnppmommonmomopmopglmnstmtttswutxsrvrqutswutvssstttvvvtstrqspqu{|prs{}}uxxuwxoqrnstostsyzuxyvxyoqrmopjmn|~suvdfguvz|}ywttxyhptouxy~|~txz}osxz|~}z}|~{~}onrfbgwqvxrwjklhlmknoknoilmcefrqsutvwuwqprtrt|z{~z|{}y~~}~~xw{~}~|y~{y~z|~|~~y{~y{z|{xz|y{zwyzxz~rprzzy|{{yzxyvxyzyzyz{yy}{{zvuzvuxts}zxzvuyvtwrtzuwytv{vx}xz{z|}|~|{}}{}{z|vzzsxyrsuurt}vyz}z|~y{snp}~{}}z|{xz}z|}~y{~y{~y{~y{|~~|~z|z|~}}~|~{}~z~|zy}}~x{x{z}||~~xww~}~{{w{|vp{}ymut}z}yzz~}~}~}}~~~{}~z}~qst|~~}}}|x~z~|{|{|{qpt~}~z}y~|x}zv{|z|z{zz~zz~}w|v|vx|py|vw{zx{yx||z~}}xpvyptxrtxttxttxvuwttvstuqtuoturorpmptptsosspstpusotplqrnsuqvutxqqurswfkngloioruotrnsrnsposklpnjolhmfbgmioplqpmorkmuopnhismnqjlgjkjllheghbdkcfjfhljjnkljhhhffggg_ca^c`\`_`eb_cb[Z\\\^bacbacbaca^`\Y[\Y[fceebd`]_\Y[ZWYYVXXUWYVXYUZWSXUQVLHMJFLONRCCGKJNJIMIHLHGIFFEHIHLLKHIG>>=01//0.120231231324<:>76:76::9=<<@A@B?>@>=?BACDCEEDFCBDDCEFEGFEGGIJDHINSVCINCKRGMRLNNRTTEGHHIMPPVOPTQRVSTXSTXSTXTUYVX\XY]Z[_Z[_Z[_Z[_[\`^^b^_c^`dZad\bd^aec_df`eebdjjjjllikkchg_gf_miaokZhdVd`Uc_iejiejminiejiejhgkihla`dffjjhlbcgcfjcfjdeiffjhgkkgfiedd`_lhgmihrppnlkhfefdcigfiggjfkjfkgfjghldgkejmkjlnllkljhmkqnjomlkmmotsfhiijnfimkjnoin{uzmlprr~ɪȝʑzggmwu{sprqnpnpqprspoqnmolikpkmpmopmopmoqnproqutvkjlsrtnmopoqtoqrmoolnpmonmonmolnplnpjopjoplttwvzvuysrvsrvttxtsurrrttttttsssrqspquwx|gijtvvtvvz|||~x|}nstowwosttvwrtuxz{{}~xvtrvvqz}ovyuz}||wz~vy}mpttw{{}~w{|jnrruz~|lot~~{onrminuotxrwkmnlpqrvwmqr}}}|~yxzosty}~psw}~|~~~tsw}|~z~x~z|~|~~y{z|z|{xz|y{zwywtv~{{{|||yzzzz|z{z{z{~||~||{wv|xwxts|zzvuyut{}zuwvqstoqzuwzy{}|~|z|wvxvuwquvuz{qst|y{|~wz~y{{vxzuwvqs|xz}z|~{}~~~y{~y{~y{}xz~y{z|{}{}{}|~}}~|~{}~|}z{zy|uwwz||z|z{z~~~y~rwt}yvxyxz{|{}~}~~~~~~}~~~}~||~|xy~|{{z~~}|zy}~z{|}{~stxlmqyz~z{vw{ztyv|xx|pz|xx|yx|yx|yx|zyltvlqtptxrtxrtxqprutvqstnrsoturnpqnproqrprroqqmrplqminrnstputswpptrswuz}puxkruqjpplqpptnptmnrqnsrnsnjominplpolnsmnvpqmghqkloijgklgijlikc\_qhkkfgnllsqqhffcaafff\a__db^ca`fd]b`[Z\YXZ^]_`_acbd\Z\[XZ[XZPMOROQROQZVXZWYXVXXTVXVXXTXVRWSOTNJONJONLPFEIKJNJIMEDHIHJGHFDDBHJHHIG?@>01//0.120231231324><@42665998<<;?@@B>=?>=?BACDCEEDFCBDFEGFEGFEGGIJDHINSVCINCKRGMRJLLQSSDFGFGKMMSOPTQRVSTXSTXSTXWX\XY]VVZ^_cTUY[\`_`d_`d^_c_`dabf]dg]be[^bc_df`eebdeeeeggfhhjonhpodrndrn`njaokesonjohdigchiejiejfeicbfedhedhhgkfgkcfjcfjfgkfdhhhljfemihmihlhgmihecbecb_]\fdcigfiggjfkjfkgfjghldgkejmkjlnlljkigljolhmkjikkhml^`almqcfjhgktnsmglxw{xxʱȘƛ‘ĦĦÒyytrxvsuurtprsprspnpnmolikrmoolnnkmolnnkmoln~}gfhpoqonppoqtoqrmoolnpmonmonmolnnlnnjopjopjrrutxutxsrvrqurrvtrtrrrssssssrrrrqsstxwx|suv{}}rttnprlpqmrs{jnoprstvw|~~npq}xz{rtu~|}vw{z{zvxq~ttu~{x}|z~z}z|{~x{~y}~psxz}|~~y|~wz~{~y{|}|tpuwqvxrwmopswxostost||~~~}~~{~~~||~~}~~~srvxw{}||{~z~~x}y~|~|~~y{z|z|{xz|y{zwyxvx}z|zy{{{{zzzyzzzz|z{z{z{}{{}{{}yx{zyut}||xx|xw{vxzuwvqszuwyxz}|~zxz|{}zy{rvwmrstvwzwyrkn|wyzuwxsu|~toqzwy|y{}z||~~y{~y{~y{}xz~z|z|{}{}{}z|}}~|~{}~}wv{|}prrprr|~|}||z|z~kop{u~zv}~}tuy~~pquy{|}}{uyz{~}|~}|~|||~xsx{|z~zx|wvz|{|{~z{|~z~zy}{|{|vw{ztyv|xx|pz|xx|yx|yx|yx|utx}zzjqtjorprvrrvrrvpoqrqsoqrlppotupnpqnppmoroqpnpqmrokpminrnsrnsrptoptpqujorinqipskglkflonrmnrilplkoplqnjolhnnjpnkmsmnvpqqklhbcoijgkldfgqnplehsjme`amkkhfffdda__ddd_db\a__dbafd]b`]\^WVX\[]gfhYXZYVXZWYXUWWTVURTURTXUWXUWXTVVSUXTVVRWSOTSOTNJONJOKJNIHLKJNFEIEDHGFHGHF?@>EFDEFDAB@-.,01/564453453324?>B10454898<;:>@?A>=?>=?BACDCEBACEDFJIKFEGFEGGIJDHINSVCINCKRGMRNPPVXXRTUOPTPPVOPTQRVSTXSTXSTXXX\YZ^TUYbcgNOSWX\STX`aePQURSWTUYPWZX]`^aec_df`efcedddegghjjfkjdlk`nj^lh]kgZhdYgcgchlhmlhmiejiejFEInmqgfjfdhjhlklpehlcfjfgkddhihlkgfkgfiediedjfejhgb`_ZXWfdcigfiggjfkjfkgfjghldgkchkihjljjjjhgljpminlkjllhmllnohimehlhhlsmrvpu}|ww¦ġҜŝssysqwtqstrtprtprsonpnmotqswrtroqpmoqnpnkmjgigfhjikjikihjpkmrmoqnppmonmonmokmnkmnglmlqrgoopossrvtswrquqptsrtqqqrrrrrrrrrrqsttx{|xz{prr~xz{{kpqltty}~tvwmopoqrwyzz|}}yz~z{}~}~zuxp}st|gloorvux|}}x{|vy~}vy~knsx{|}~rquvuy}y~|v{xrwuwxptu~~}{z|}|~~x|}~}}~}{~|~}|~||~}|{|{~srv~||}y~}w|x}|~|~~y{z|z|{xz|y{zwyzwyzwyzxzyyywwwyzxzvxwx}wx}wx{yyywwvrqxtsqml{z~zy|{ytv{vxwrt~y{xwy}|~wvxsrtrqsmqrpuvtvvxvxqjmz||~pkmlgi{vx|y{{xzyvx{xz~y{~y{~y{{}z|z|z||~|~~z|}}~|~{}~~ss~~egg}~~}z~x~||~~w}~~{hllux~ztvw}~z}{~|w|yz~rqusrv{|z}|}~rrvlmqcef~z|}}~}}|~{z||}|}z}{x}{z~xw{}|xw{~}~z}y~|x}|x}{z~z{xy}wx||}pqu~x}v|vx|px|vx|yx|yx|yx|cbfpwzfknorvqrvqrvkjlrqsnprjnootuplnrnpnkmroqolnrnsqmrnjornsrnsposoptoptnsvmrulsvsotlkooptmptjlpihlnjookplhmnjomjlpjksmnpjlsmnsmnhlmacdurt|uxqhkhcddbbeccfddeccbbb]b`^ca]b`afdafd`_aXWY]\^_^`^]_a^`a^`ZWYXUWXUW]Z\YVXURTWTVURTWTVUQVRNTQMRLHMNJNJJNLKOKJNBAEHGKCBDDEC=> +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_ive.h" + +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_ive.h" + +#include "sample_comm_ive.h" + + +typedef struct hiSAMPLE_IVE_CANNY_INFO_S +{ + IVE_SRC_IMAGE_S stSrc; + IVE_DST_IMAGE_S stEdge; + IVE_DST_IMAGE_S stMag; + IVE_MEM_INFO_S stStack; + IVE_CANNY_HYS_EDGE_CTRL_S stCannyHysEdgeCtrl; + IVE_MAG_AND_ANG_CTRL_S stMagAndAngCtrl; + IVE_THRESH_U16_CTRL_S stThrU16Ctrl; + FILE *pFpSrc; + FILE *pFpDst; +}SAMPLE_IVE_CANNY_INFO_S; + +/****************************************************************************** +* function : Canny uninit +******************************************************************************/ +static HI_VOID SAMPLE_IVE_Canny_Uninit(SAMPLE_IVE_CANNY_INFO_S *pstCannyInfo) +{ + IVE_MMZ_FREE(pstCannyInfo->stSrc.u32PhyAddr[0],pstCannyInfo->stSrc.pu8VirAddr[0]); + IVE_MMZ_FREE(pstCannyInfo->stEdge.u32PhyAddr[0],pstCannyInfo->stEdge.pu8VirAddr[0]); + IVE_MMZ_FREE(pstCannyInfo->stMag.u32PhyAddr[0],pstCannyInfo->stMag.pu8VirAddr[0]); + IVE_MMZ_FREE(pstCannyInfo->stStack.u32PhyAddr,pstCannyInfo->stStack.pu8VirAddr); + IVE_MMZ_FREE(pstCannyInfo->stCannyHysEdgeCtrl.stMem.u32PhyAddr,\ + pstCannyInfo->stCannyHysEdgeCtrl.stMem.pu8VirAddr); + + IVE_CLOSE_FILE(pstCannyInfo->pFpSrc); + IVE_CLOSE_FILE(pstCannyInfo->pFpDst); +} +/****************************************************************************** +* function : Canny init +******************************************************************************/ +static HI_S32 SAMPLE_IVE_Canny_Init(SAMPLE_IVE_CANNY_INFO_S *pstCannyInfo, + HI_CHAR *pchSrcFileName,HI_CHAR *pchDstFileName,HI_U16 u16Width,HI_U16 u16Height) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32Size = 0; + HI_S8 as8Mask[25] = {0,0,0,0,0, + 0,-1,0,1,0, + 0,-2,0,2,0, + 0,-1,0,1,0, + 0,0,0,0,0}; + + memset(pstCannyInfo,0,sizeof(SAMPLE_IVE_CANNY_INFO_S)); + memcpy(pstCannyInfo->stCannyHysEdgeCtrl.as8Mask,as8Mask,25); + memcpy(pstCannyInfo->stMagAndAngCtrl.as8Mask,as8Mask,25); + pstCannyInfo->stCannyHysEdgeCtrl.u16HighThr = 150; + pstCannyInfo->stCannyHysEdgeCtrl.u16LowThr = 50; + pstCannyInfo->stMagAndAngCtrl.enOutCtrl = IVE_MAG_AND_ANG_OUT_CTRL_MAG; + pstCannyInfo->stMagAndAngCtrl.u16Thr = 0; + pstCannyInfo->stThrU16Ctrl.enMode = IVE_THRESH_U16_MODE_U16_TO_U8_MIN_MID_MAX; + pstCannyInfo->stThrU16Ctrl.u16HighThr = 100; + pstCannyInfo->stThrU16Ctrl.u16LowThr = 100; + pstCannyInfo->stThrU16Ctrl.u8MaxVal = 255; + pstCannyInfo->stThrU16Ctrl.u8MidVal = 0; + pstCannyInfo->stThrU16Ctrl.u8MinVal = 0; + + s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstCannyInfo->stSrc,IVE_IMAGE_TYPE_U8C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto CANNY_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstCannyInfo->stEdge,IVE_IMAGE_TYPE_U8C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto CANNY_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstCannyInfo->stMag,IVE_IMAGE_TYPE_U16C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto CANNY_INIT_FAIL; + } + u32Size = pstCannyInfo->stSrc.u16Stride [0] * pstCannyInfo->stSrc.u16Height * 4 + sizeof(IVE_CANNY_STACK_SIZE_S); + s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&pstCannyInfo->stStack,u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateMemInfo fail\n"); + goto CANNY_INIT_FAIL; + } + u32Size = pstCannyInfo->stSrc.u16Stride [0] * pstCannyInfo->stSrc.u16Height * 3; + s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&pstCannyInfo->stCannyHysEdgeCtrl.stMem,u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateMemInfo fail\n"); + goto CANNY_INIT_FAIL; + } + + pstCannyInfo->pFpSrc = fopen(pchSrcFileName,"rb"); + if(HI_NULL == pstCannyInfo->pFpSrc) + { + SAMPLE_PRT("Open file %s fail\n",pchSrcFileName); + s32Ret = HI_FAILURE; + goto CANNY_INIT_FAIL; + } + + pstCannyInfo->pFpDst = fopen(pchDstFileName,"wb"); + if(HI_NULL == pstCannyInfo->pFpDst) + { + SAMPLE_PRT("Open file %s fail\n",pchDstFileName); + s32Ret = HI_FAILURE; + goto CANNY_INIT_FAIL; + } + +CANNY_INIT_FAIL: + + if(HI_SUCCESS != s32Ret) + { + SAMPLE_IVE_Canny_Uninit(pstCannyInfo); + } + return s32Ret; +} +/****************************************************************************** +* function : show complate canny sample +******************************************************************************/ +static HI_VOID SAMPLE_IVE_Complate_Canny(SAMPLE_IVE_CANNY_INFO_S *pstCannyInfo) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_BOOL bInstant = HI_TRUE; + HI_BOOL bBlock = HI_TRUE; + HI_BOOL bFinish = HI_FALSE; + IVE_HANDLE IveHandle; + + s32Ret = SAMPLE_COMM_IVE_ReadFile(&(pstCannyInfo->stSrc),pstCannyInfo->pFpSrc); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_ReadFile fail\n"); + return; + } + + s32Ret = HI_MPI_IVE_CannyHysEdge(&IveHandle, &pstCannyInfo->stSrc, \ + &pstCannyInfo->stEdge, &pstCannyInfo->stStack, \ + &pstCannyInfo->stCannyHysEdgeCtrl, bInstant); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_CannyHysEdge fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); + while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret) + { + usleep(100); + s32Ret = HI_MPI_IVE_Query(IveHandle,&bFinish,bBlock); + } + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Query fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = HI_MPI_IVE_CannyEdge(&pstCannyInfo->stEdge, &pstCannyInfo->stStack); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_CannyEdge fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstCannyInfo->stEdge,pstCannyInfo->pFpDst); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_WriteFile fail\n"); + return; + } +} +/****************************************************************************** +* function : show part canny sample +******************************************************************************/ +static HI_VOID SAMPLE_IVE_Part_Canny(SAMPLE_IVE_CANNY_INFO_S *pstCannyInfo) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_BOOL bInstant = HI_TRUE; + HI_BOOL bBlock = HI_TRUE; + HI_BOOL bFinish = HI_FALSE; + IVE_HANDLE IveHandle; + + s32Ret = SAMPLE_COMM_IVE_ReadFile(&pstCannyInfo->stSrc,pstCannyInfo->pFpSrc); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_ReadFile fail\n"); + return; + } + bInstant = HI_FALSE; + s32Ret = HI_MPI_IVE_MagAndAng(&IveHandle, &pstCannyInfo->stSrc, &pstCannyInfo->stMag,\ + HI_NULL, &pstCannyInfo->stMagAndAngCtrl, bInstant); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_MagAndAng fail,Error(%#x)\n",s32Ret); + return; + } + bInstant = HI_TRUE; + s32Ret = HI_MPI_IVE_Thresh_U16(&IveHandle,&pstCannyInfo->stMag,&pstCannyInfo->stEdge,\ + &pstCannyInfo->stThrU16Ctrl, bInstant); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Thresh_U16 fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); + while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret) + { + usleep(100); + s32Ret = HI_MPI_IVE_Query(IveHandle,&bFinish,bBlock); + } + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Query fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstCannyInfo->stEdge,pstCannyInfo->pFpDst); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_WriteFile fail\n"); + return; + } +} +/****************************************************************************** +* function : show canny sample +******************************************************************************/ +HI_VOID SAMPLE_IVE_Canny(HI_CHAR chComplete) +{ + SAMPLE_IVE_CANNY_INFO_S stCannyInfo; + HI_U16 u16Width = 720; + HI_U16 u16Height = 576; + HI_CHAR *pchSrcFileName = "./data/input/canny/canny.yuv"; + HI_CHAR achDstFileName[IVE_FILE_NAME_LEN]; + HI_S32 s32Ret; + + SAMPLE_COMM_IVE_CheckIveMpiInit(); + + sprintf(achDstFileName,"./data/output/canny/cannyout_complete_%c.yuv",chComplete); + s32Ret = SAMPLE_IVE_Canny_Init(&stCannyInfo,pchSrcFileName,achDstFileName,u16Width,u16Height); + if(HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_IVE_Canny_Init fail\n"); + goto CANNY_FAIL; + } + + if('0' == chComplete) + { + SAMPLE_IVE_Part_Canny(&stCannyInfo); + } + else + { + SAMPLE_IVE_Complate_Canny(&stCannyInfo); + } + + SAMPLE_IVE_Canny_Uninit(&stCannyInfo); + +CANNY_FAIL: + SAMPLE_COMM_IVE_IveMpiExit(); +} + + + diff --git a/device/mpp/sample/ive/sample/sample_ive_main.h b/device/mpp/sample/ive/sample/sample_ive_main.h new file mode 100644 index 0000000..2de4e4e --- /dev/null +++ b/device/mpp/sample/ive/sample/sample_ive_main.h @@ -0,0 +1,27 @@ +#ifndef __SAMPLE_IVE_MAIN_H__ +#define __SAMPLE_IVE_MAIN_H__ +#include "hi_type.h" +/****************************************************************************** +* function : show Canny sample +******************************************************************************/ +HI_VOID SAMPLE_IVE_Canny(HI_CHAR chComplete); +/****************************************************************************** +* function : show Occlusion detected sample +******************************************************************************/ +HI_VOID SAMPLE_IVE_Od(HI_VOID); +/****************************************************************************** +* function : show motion detected sample +******************************************************************************/ +HI_VOID SAMPLE_IVE_Md(HI_CHAR chUseFile); +/****************************************************************************** +* function : show Test Memory sample +******************************************************************************/ +HI_VOID SAMPLE_IVE_TestMemory(HI_VOID); +/****************************************************************************** +* function : show Sobel sample +******************************************************************************/ +HI_VOID SAMPLE_IVE_Sobel(HI_VOID); + + +#endif + diff --git a/device/mpp/sample/ive/sample/sample_ive_md.c b/device/mpp/sample/ive/sample/sample_ive_md.c new file mode 100644 index 0000000..036a909 --- /dev/null +++ b/device/mpp/sample/ive/sample/sample_ive_md.c @@ -0,0 +1,507 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_ive.h" +#include "hi_comm_vgs.h" +#include "hi_comm_vi.h" +#include "hi_comm_vo.h" + + +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_ive.h" +#include "mpi_vgs.h" +#include "mpi_vi.h" +#include "mpi_vo.h" +#include "ivs_md.h" + +#include "sample_comm_ive.h" + +#define SAMPLE_IVE_MD_IMAGE_NUM 2 + +typedef struct hiSAMPLE_IVE_MD_S +{ + IVE_SRC_IMAGE_S astImg[SAMPLE_IVE_MD_IMAGE_NUM]; + IVE_DST_MEM_INFO_S stBlob; + MD_ATTR_S stMdAttr; + SAMPLE_RECT_ARRAY_S stRegion; + FILE *pFp; + VB_POOL hVbPool; + HI_U16 u16BaseWitdh; + HI_U16 u16BaseHeight; +}SAMPLE_IVE_MD_S; + +static HI_BOOL s_bStopSignal = HI_FALSE; + +static HI_VOID SAMPLE_IVE_Md_Uninit(SAMPLE_IVE_MD_S *pstMd) +{ + HI_S32 i; + HI_S32 s32Ret = HI_SUCCESS; + + for (i = 0; i < SAMPLE_IVE_MD_IMAGE_NUM; i++) + { + IVE_MMZ_FREE(pstMd->astImg[i].u32PhyAddr[0],pstMd->astImg[i].pu8VirAddr[0]); + } + + IVE_MMZ_FREE(pstMd->stBlob.u32PhyAddr,pstMd->stBlob.pu8VirAddr); + if (NULL != pstMd->pFp) + { + s32Ret = HI_MPI_VB_DestroyPool(pstMd->hVbPool); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VB_DestroyPool fail,Error(%#x)\n",s32Ret); + } + + IVE_CLOSE_FILE(pstMd->pFp); + } + + + s32Ret = HI_IVS_MD_Exit(); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_IVS_MD_Exit fail,Error(%#x)\n",s32Ret); + return ; + } + +} + +static HI_S32 SAMPLE_IVE_Md_Init(SAMPLE_IVE_MD_S *pstMd,HI_U16 u16ExtWidth,HI_U16 u16ExtHeight, + HI_U16 u16BaseWidth,HI_U16 u16BaseHeight,HI_CHAR *pchFileName) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i ; + HI_U32 u32Size; + HI_U8 u8WndSz; + + memset(pstMd,0,sizeof(SAMPLE_IVE_MD_S)); + for (i = 0;i < SAMPLE_IVE_MD_IMAGE_NUM;i++) + { + s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstMd->astImg[i],IVE_IMAGE_TYPE_U8C1,u16ExtWidth,u16ExtHeight); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto MD_INIT_FAIL; + } + } + u32Size = sizeof(IVE_CCBLOB_S); + s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&pstMd->stBlob,u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateMemInfo fail\n"); + goto MD_INIT_FAIL; + } + if (NULL != pchFileName) + { + pstMd->pFp = fopen(pchFileName,"rb"); + if (NULL == pstMd->pFp) + { + SAMPLE_PRT("Open file %s fail\n",pchFileName); + goto MD_INIT_FAIL; + } + + u32Size = SAMPLE_COMM_IVE_CalcStride(u16BaseWidth,IVE_ALIGN) * u16BaseHeight *2; + + pstMd->hVbPool = HI_MPI_VB_CreatePool( u32Size, 5,NULL ); + if (VB_INVALID_POOLID == pstMd->hVbPool) + { + SAMPLE_PRT("HI_MPI_VB_CreatePool fail\n"); + goto MD_INIT_FAIL; + } + } + pstMd->u16BaseWitdh = u16BaseWidth; + pstMd->u16BaseHeight = u16BaseHeight; + //Set attr info + pstMd->stMdAttr.enAlgMode = MD_ALG_MODE_BG; + pstMd->stMdAttr.enSadMode = IVE_SAD_MODE_MB_4X4; + pstMd->stMdAttr.u16SadThr = 100 * (1 << 1);//100 * (1 << 2); + pstMd->stMdAttr.u16Width = u16ExtWidth; + pstMd->stMdAttr.u16Height = u16ExtHeight; + pstMd->stMdAttr.stAddCtrl.u0q16X = 32768; + pstMd->stMdAttr.stAddCtrl.u0q16Y = 32768; + u8WndSz = ( 1 << (2 + pstMd->stMdAttr.enSadMode)); + pstMd->stMdAttr.stCclCtrl.u16InitAreaThr = u8WndSz * u8WndSz; + pstMd->stMdAttr.stCclCtrl.u16Step = u8WndSz; + + s32Ret = HI_IVS_MD_Init(); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_IVS_MD_Init fail,Error(%#x)\n",s32Ret); + goto MD_INIT_FAIL; + } + +MD_INIT_FAIL: + + if(HI_SUCCESS != s32Ret) + { + SAMPLE_IVE_Md_Uninit(pstMd); + } + return s32Ret; + +} +static HI_VOID * SAMPLE_IVE_MdProc(HI_VOID * pArgs) +{ + HI_S32 s32Ret; + SAMPLE_IVE_MD_S *pstMd; + MD_ATTR_S *pstMdAttr; + VIDEO_FRAME_INFO_S stBaseFrmInfo; + VIDEO_FRAME_INFO_S stExtFrmInfo; + VI_CHN viBaseChn = 0; + VI_CHN viExtChn = 1; + HI_S32 s32GetFrameMilliSec = 2000; + HI_S32 s32SetFrameMilliSec = 2000; + MD_CHN MdChn = 0; + + HI_BOOL bInstant = HI_TRUE; + VO_LAYER voLayer = 0; + VO_CHN voChn = 0; + HI_S32 s32CurIdx = 0; + HI_BOOL bFirstFrm = HI_TRUE; + + pstMd = (SAMPLE_IVE_MD_S *)(pArgs); + pstMdAttr = &(pstMd->stMdAttr); + //Create chn + s32Ret = HI_IVS_MD_CreateChn(MdChn,&(pstMd->stMdAttr)); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_IVS_MD_CreateChn fail,Error(%#x)\n",s32Ret); + return NULL; + } + + while (HI_FALSE == s_bStopSignal) + { + + s32Ret = HI_MPI_VI_GetFrame(viExtChn, &stExtFrmInfo, s32GetFrameMilliSec); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_GetFrame ext chn(%d) fail,Error(%#x)\n",viExtChn,s32Ret); + continue; + } + s32Ret = HI_MPI_VI_GetFrame(viBaseChn, &stBaseFrmInfo, s32GetFrameMilliSec); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, EXT_RELEASE, + "HI_MPI_VI_GetFrame base chn(%d) fail,Error(%#x)\n",viBaseChn,s32Ret); + if (HI_TRUE != bFirstFrm) + { + s32Ret = SAMPLE_COMM_DmaImage(&stExtFrmInfo,&pstMd->astImg[s32CurIdx],bInstant); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "SAMPLE_COMM_DmaImage fail,Error(%#x)\n",s32Ret); + } + else + { + s32Ret = SAMPLE_COMM_DmaImage(&stExtFrmInfo,&pstMd->astImg[1 - s32CurIdx],bInstant); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "SAMPLE_COMM_DmaImage fail,Error(%#x)\n",s32Ret); + + bFirstFrm = HI_FALSE; + goto CHANGE_IDX;//first frame just init reference frame + + } + + s32Ret = HI_IVS_MD_Process(MdChn,&pstMd->astImg[s32CurIdx],&pstMd->astImg[1 - s32CurIdx],&pstMd->stBlob); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "HI_IVS_MD_Process fail,Error(%#x)\n",s32Ret); + + SAMPLE_COMM_IVE_BlobToRect((IVE_CCBLOB_S *)pstMd->stBlob.pu8VirAddr,&(pstMd->stRegion),50,8, + pstMdAttr->u16Width,pstMdAttr->u16Height,(HI_U16)stBaseFrmInfo.stVFrame.u32Width,(HI_U16)stBaseFrmInfo.stVFrame.u32Height); + + //Draw rect + s32Ret = SAMPLE_COMM_VGS_FillRect(&stBaseFrmInfo, &pstMd->stRegion, 0x0000FF00); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "SAMPLE_COMM_VGS_FillRect fail,Error(%#x)\n",s32Ret); + + s32Ret = HI_MPI_VO_SendFrame(voLayer,voChn,&stBaseFrmInfo,s32SetFrameMilliSec); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "HI_MPI_VO_SendFrame fail,Error(%#x)\n",s32Ret); + CHANGE_IDX: + //Change reference and current frame index + s32CurIdx = 1 - s32CurIdx; + + BASE_RELEASE: + s32Ret = HI_MPI_VI_ReleaseFrame(viBaseChn, &stBaseFrmInfo); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_ReleaseFrame fail,base chn(%d),Error(%#x)\n",viBaseChn,s32Ret); + } + + EXT_RELEASE: + s32Ret = HI_MPI_VI_ReleaseFrame(viExtChn, &stExtFrmInfo); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_ReleaseFrame fail,ext chn(%d),Error(%#x)\n",viExtChn,s32Ret); + } + + } + + //destroy + s32Ret = HI_IVS_MD_DestroyChn(MdChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_IVS_MD_DestroyChn fail,Error(%#x)\n",s32Ret); + } + + return HI_NULL; +} + +static HI_VOID * SAMPLE_IVE_MdProc_File(HI_VOID * pArgs) +{ + HI_S32 s32Ret; + SAMPLE_IVE_MD_S *pstMd; + MD_ATTR_S *pstMdAttr; + VIDEO_FRAME_INFO_S stUserFrmInfo; + VIDEO_FRAME_INFO_S stBaseFrmInfo; + VIDEO_FRAME_INFO_S stExtFrmInfo; + IVE_IMAGE_S stImg; + HI_S32 s32GetFrameMilliSec = 2000; + HI_S32 s32SetFrameMilliSec = 2000; + MD_CHN MdChn = 0; + + HI_BOOL bInstant = HI_TRUE; + VO_LAYER voLayer = 0; + VO_CHN voChn = 0; + HI_S32 s32CurIdx = 0; + HI_BOOL bFirstFrm = HI_TRUE; + VPSS_GRP VpssGrp = 0; + VPSS_CHN aVpssChn[2] = {VPSS_CHN0, VPSS_CHN3}; + VB_BLK hBlkHdl; + HI_U32 u32Size,u32LumaSize,u32ChrmSize; + + pstMd = (SAMPLE_IVE_MD_S *)(pArgs); + pstMdAttr = &(pstMd->stMdAttr); + //Create chn + s32Ret = HI_IVS_MD_CreateChn(MdChn,&(pstMd->stMdAttr)); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_IVS_MD_CreateChn fail,Error(%#x)\n",s32Ret); + return NULL; + } + + stUserFrmInfo.stVFrame.u32Field = VIDEO_FIELD_FRAME; + stUserFrmInfo.stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stUserFrmInfo.stVFrame.u32Height = pstMd->u16BaseHeight; + stUserFrmInfo.stVFrame.u32Width = pstMd->u16BaseWitdh; + stUserFrmInfo.stVFrame.u32Stride[0] = SAMPLE_COMM_IVE_CalcStride(pstMd->u16BaseWitdh,IVE_ALIGN); + stUserFrmInfo.stVFrame.u32Stride[1] = SAMPLE_COMM_IVE_CalcStride(pstMd->u16BaseWitdh,IVE_ALIGN); + stUserFrmInfo.stVFrame.u32Stride[2] = SAMPLE_COMM_IVE_CalcStride(pstMd->u16BaseWitdh,IVE_ALIGN); + stUserFrmInfo.stVFrame.u32TimeRef = 0; + stUserFrmInfo.stVFrame.u64pts = 0; + stUserFrmInfo.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR; + + u32Size = stUserFrmInfo.stVFrame.u32Stride[0] * stUserFrmInfo.stVFrame.u32Height *2; + u32LumaSize = (stUserFrmInfo.stVFrame.u32Stride[0] * stUserFrmInfo.stVFrame.u32Height); + u32ChrmSize = u32LumaSize >> 2; + + stImg.enType = IVE_IMAGE_TYPE_YUV420SP; + stImg.u16Width = (HI_U16)stUserFrmInfo.stVFrame.u32Width; + stImg.u16Height = (HI_U16)stUserFrmInfo.stVFrame.u32Height; + stImg.u16Stride[0] = stUserFrmInfo.stVFrame.u32Stride[0]; + stImg.u16Stride[1] = stUserFrmInfo.stVFrame.u32Stride[1]; + stImg.u16Stride[2] = stUserFrmInfo.stVFrame.u32Stride[2]; + + while (HI_FALSE == s_bStopSignal) + { + //Read file,than send to vpss process + hBlkHdl = HI_MPI_VB_GetBlock( pstMd->hVbPool, u32Size, NULL); + if(VB_INVALID_HANDLE == hBlkHdl) + { + SAMPLE_PRT("HI_MPI_VB_GetBlock fail,hVbPool(%d),Error(%#x)\n",pstMd->hVbPool,s32Ret); + sleep(10); + continue; + } + + stUserFrmInfo.u32PoolId = HI_MPI_VB_Handle2PoolId(hBlkHdl); + stUserFrmInfo.stVFrame.u32PhyAddr[0] = HI_MPI_VB_Handle2PhysAddr( hBlkHdl ); + stUserFrmInfo.stVFrame.pVirAddr[0] = HI_MPI_SYS_Mmap(stUserFrmInfo.stVFrame.u32PhyAddr[0], u32Size); + stUserFrmInfo.stVFrame.u32PhyAddr[1] = stUserFrmInfo.stVFrame.u32PhyAddr[0] + u32LumaSize; + stUserFrmInfo.stVFrame.pVirAddr[1] = (HI_U8 *)(stUserFrmInfo.stVFrame.pVirAddr[0]) + u32LumaSize; + stUserFrmInfo.stVFrame.u32PhyAddr[2] = stUserFrmInfo.stVFrame.u32PhyAddr[1] + u32ChrmSize; + stUserFrmInfo.stVFrame.pVirAddr[2] = (HI_U8 *)(stUserFrmInfo.stVFrame.pVirAddr[1]) + u32ChrmSize; + stUserFrmInfo.stVFrame.enCompressMode = COMPRESS_MODE_NONE; + stUserFrmInfo.stVFrame.u32HeaderPhyAddr[0] = 0; + stUserFrmInfo.stVFrame.u32HeaderPhyAddr[1] = 0; + stUserFrmInfo.stVFrame.u64pts += 40000; + stUserFrmInfo.stVFrame.u32TimeRef += 40000; + + stImg.u32PhyAddr[0] = stUserFrmInfo.stVFrame.u32PhyAddr[0]; + stImg.pu8VirAddr[0] = stUserFrmInfo.stVFrame.pVirAddr[0]; + stImg.u32PhyAddr[1] = stUserFrmInfo.stVFrame.u32PhyAddr[1]; + stImg.pu8VirAddr[1] = stUserFrmInfo.stVFrame.pVirAddr[1]; + stImg.u32PhyAddr[2] = stUserFrmInfo.stVFrame.u32PhyAddr[2]; + stImg.pu8VirAddr[2] = stUserFrmInfo.stVFrame.pVirAddr[2]; + + s32Ret = SAMPLE_COMM_IVE_ReadFile(&stImg,pstMd->pFp); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BLOCK_RELEASE, + "SAMPLE_COMM_IVE_ReadFile fail,Error(%#x)\n",s32Ret); + //Send data to vpss + s32Ret = HI_MPI_VPSS_SendFrame(VpssGrp, &stUserFrmInfo, s32SetFrameMilliSec); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BLOCK_RELEASE, + "HI_MPI_VPSS_SendFrame fail,Grp(%d),Error(%#x)\n",VpssGrp,s32Ret); + + //Get data from vpss + s32Ret = HI_MPI_VPSS_GetChnFrame(VpssGrp, aVpssChn[1], &stExtFrmInfo, s32GetFrameMilliSec); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BLOCK_RELEASE, + "HI_MPI_VPSS_GetChnFrame fail,Vpss Grp(%d),Chn(%d),Error(%#x)\n",VpssGrp,aVpssChn[1],s32Ret); + + s32Ret = HI_MPI_VPSS_GetChnFrame(VpssGrp, aVpssChn[0], &stBaseFrmInfo, s32GetFrameMilliSec); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, EXT_RELEASE, + "HI_MPI_VPSS_GetChnFrame fail,Vpss Grp(%d),Chn(%d),Error(%#x)\n",VpssGrp,aVpssChn[0],s32Ret); + + if (HI_TRUE != bFirstFrm) + { + s32Ret = SAMPLE_COMM_DmaImage(&stExtFrmInfo,&pstMd->astImg[s32CurIdx],bInstant); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "SAMPLE_COMM_DmaImage fail,Error(%#x)\n",s32Ret); + } + else + { + s32Ret = SAMPLE_COMM_DmaImage(&stExtFrmInfo,&pstMd->astImg[1 - s32CurIdx],bInstant); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "SAMPLE_COMM_DmaImage fail,Error(%#x)\n",s32Ret); + + bFirstFrm = HI_FALSE; + goto CHANGE_IDX;//first frame just init reference frame + + } + + s32Ret = HI_IVS_MD_Process(MdChn,&pstMd->astImg[s32CurIdx],&pstMd->astImg[1 - s32CurIdx],&pstMd->stBlob); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "HI_IVS_MD_Process fail,Error(%#x)\n",s32Ret); + + SAMPLE_COMM_IVE_BlobToRect((IVE_CCBLOB_S *)pstMd->stBlob.pu8VirAddr,&(pstMd->stRegion),50,8, + pstMdAttr->u16Width,pstMdAttr->u16Height,(HI_U16)stBaseFrmInfo.stVFrame.u32Width,(HI_U16)stBaseFrmInfo.stVFrame.u32Height); + + //Draw rect + s32Ret = SAMPLE_COMM_VGS_FillRect(&stBaseFrmInfo, &pstMd->stRegion, 0x0000FF00); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "SAMPLE_COMM_VGS_FillRect fail,Error(%#x)\n",s32Ret); + + s32Ret = HI_MPI_VO_SendFrame(voLayer,voChn,&stBaseFrmInfo,s32SetFrameMilliSec); + SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE, + "HI_MPI_VO_SendFrame fail,Error(%#x)\n",s32Ret); + + CHANGE_IDX: + //Change reference and current frame index + s32CurIdx = 1 - s32CurIdx; + + BASE_RELEASE: + s32Ret = HI_MPI_VPSS_ReleaseChnFrame(VpssGrp,aVpssChn[0], &stBaseFrmInfo); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VPSS_ReleaseChnFrame fail,Grp(%d) chn(%d),Error(%#x)\n",VpssGrp,aVpssChn[0],s32Ret); + } + + EXT_RELEASE: + s32Ret = HI_MPI_VPSS_ReleaseChnFrame(VpssGrp,aVpssChn[1], &stExtFrmInfo); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VPSS_ReleaseChnFrame fail,Grp(%d) chn(%d),Error(%#x)\n",VpssGrp,aVpssChn[1],s32Ret); + } + BLOCK_RELEASE: + s32Ret = HI_MPI_VB_ReleaseBlock(hBlkHdl); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VB_ReleaseBlock fail,blkHdl(%d),Error(%#x)\n",hBlkHdl,s32Ret); + } + + (HI_VOID)HI_MPI_SYS_Munmap(stUserFrmInfo.stVFrame.pVirAddr[0], u32Size); + } + + //destroy + s32Ret = HI_IVS_MD_DestroyChn(MdChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_IVS_MD_DestroyChn fail,Error(%#x)\n",s32Ret); + } + + return HI_NULL; +} + +HI_VOID SAMPLE_IVE_Md(HI_CHAR chUseFile) +{ + HI_S32 s32Ret = HI_SUCCESS; + + HI_U16 u16ExtWidth = 352; + HI_U16 u16ExtHeight = 288; + HI_U16 u16BaseWidth = 1920; + HI_U16 u16BaseHeight = 1080; + HI_BOOL bOpenVi = HI_FALSE; + HI_BOOL bOpenViExt = HI_FALSE; + HI_BOOL bOpenVo = HI_TRUE; + HI_BOOL bOpenVenc = HI_FALSE; + HI_BOOL bOpenVpss = HI_FALSE; + SAMPLE_IVE_MD_S stMd; + SAMPLE_IVE_VI_VO_CONFIG_S stViVoConfig; + pthread_t hIveThread; + typedef void * (*fun_callback)(void *); + fun_callback fun; + HI_U32 u32VpssChnNum = 2; + HI_CHAR *pchFileName = NULL; + //SAMPLE_COMM_IVE_CheckIveMpiInit(); + + s_bStopSignal = HI_FALSE; + stViVoConfig.enPicSize = PIC_HD1080; + stViVoConfig.enNorm = VIDEO_ENCODING_MODE_PAL; + stViVoConfig.enVoIntfType = VO_INTF_BT656;//hi3518ev200 only support BT656/LCD + stViVoConfig.stViConfig.enViMode = SAMPLE_VI_MODE_BT1120_1080P; + stViVoConfig.stViConfig.enNorm = VIDEO_ENCODING_MODE_PAL; + stViVoConfig.stViConfig.enRotate = ROTATE_NONE; + stViVoConfig.stViConfig.enViChnSet = VI_CHN_SET_NORMAL; + stViVoConfig.stViConfig.enWDRMode = WDR_MODE_NONE; + + if ('0' == chUseFile) + { + bOpenVi = HI_TRUE; + bOpenViExt = HI_TRUE; + fun = SAMPLE_IVE_MdProc; + } + else + { + bOpenVpss = HI_TRUE; + pchFileName = "./data/input/md/md_sample_sp420_1080p.yuv"; + fun = SAMPLE_IVE_MdProc_File; + + } + + + s32Ret = SAMPLE_COMM_IVE_BT1120_720P_PreView(&stViVoConfig,bOpenVi,bOpenViExt, + bOpenVo,bOpenVenc,bOpenVpss,u32VpssChnNum); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_BT1120_720P_PreView fail\n"); + return; + } + s32Ret = SAMPLE_IVE_Md_Init(&stMd,u16ExtWidth,u16ExtHeight,u16BaseWidth,u16BaseHeight,pchFileName); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_IVE_Md_Init fail\n"); + goto MD_END; + } + + pthread_create(&hIveThread, 0, fun, (HI_VOID*)&stMd); + + SAMPLE_VI_PAUSE(); + + s_bStopSignal = HI_TRUE; + pthread_join(hIveThread,HI_NULL); + +MD_END: + SAMPLE_IVE_Md_Uninit(&(stMd)); + SAMPLE_COMM_IVE_BT1120_720P_Stop(&stViVoConfig,bOpenVi,bOpenViExt,bOpenVo,bOpenVenc, + bOpenVpss,u32VpssChnNum); + +} + + diff --git a/device/mpp/sample/ive/sample/sample_ive_od.c b/device/mpp/sample/ive/sample/sample_ive_od.c new file mode 100644 index 0000000..aeff907 --- /dev/null +++ b/device/mpp/sample/ive/sample/sample_ive_od.c @@ -0,0 +1,322 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_ive.h" +#include "hi_comm_vgs.h" +#include "hi_comm_vi.h" +#include "hi_comm_vo.h" + + +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_ive.h" +#include "mpi_vgs.h" +#include "mpi_vi.h" +#include "mpi_vo.h" + + +#include "sample_comm_ive.h" + +typedef struct hiSAMPLE_IVE_OD_S +{ + IVE_SRC_IMAGE_S stSrc; + IVE_DST_IMAGE_S stInteg; + IVE_INTEG_CTRL_S stIntegCtrl; + HI_U32 u32W; + HI_U32 u32H; +}SAMPLE_IVE_OD_S; + +static HI_BOOL s_bStopSignal = HI_FALSE; + +static HI_VOID SAMPLE_IVE_Od_Uninit(SAMPLE_IVE_OD_S *pstOd) +{ + IVE_MMZ_FREE(pstOd->stSrc.u32PhyAddr[0],pstOd->stSrc.pu8VirAddr[0]); + IVE_MMZ_FREE(pstOd->stInteg.u32PhyAddr[0],pstOd->stInteg.pu8VirAddr[0]); + +} + +static HI_S32 SAMPLE_IVE_Od_Init(SAMPLE_IVE_OD_S *pstOd,HI_U16 u16Width,HI_U16 u16Height) +{ + HI_S32 s32Ret = HI_SUCCESS; + + memset(pstOd,0,sizeof(SAMPLE_IVE_OD_S)); + + s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstOd->stSrc,IVE_IMAGE_TYPE_U8C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto OD_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImage(&pstOd->stInteg,IVE_IMAGE_TYPE_U64C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto OD_INIT_FAIL; + } + + pstOd->stIntegCtrl.enOutCtrl = IVE_INTEG_OUT_CTRL_COMBINE; + + pstOd->u32W = u16Width/IVE_CHAR_CALW; + pstOd->u32H = u16Height/IVE_CHAR_CALH; + + +OD_INIT_FAIL: + + if(HI_SUCCESS != s32Ret) + { + SAMPLE_IVE_Od_Uninit(pstOd); + } + return s32Ret; + +} + +static HI_S32 SAMPLE_IVE_Linear2DClassifer(POINT_S *pstChar, HI_S32 s32CharNum, + POINT_S *pstLinearPoint, HI_S32 s32Linearnum ) +{ + HI_S32 s32ResultNum; + HI_S32 i,j; + HI_BOOL bTestFlag; + POINT_S *pstNextLinearPoint; + + s32ResultNum = 0; + pstNextLinearPoint = &pstLinearPoint[1]; + for(i = 0;i < s32CharNum;i++) + { + bTestFlag = HI_TRUE; + for(j = 0;j < (s32Linearnum-1);j++) + { + if( ( (pstChar[i].s32Y - pstLinearPoint[j].s32Y) * (pstNextLinearPoint[j].s32X - pstLinearPoint[j].s32X)> + (pstChar[i].s32X - pstLinearPoint[j].s32X) * (pstNextLinearPoint[j].s32Y - pstLinearPoint[j].s32Y) + && (pstNextLinearPoint[j].s32X != pstLinearPoint[j].s32X)) + || ( (pstChar[i].s32X>pstLinearPoint[j].s32X) && (pstNextLinearPoint[j].s32X == pstLinearPoint[j].s32X) )) + { + bTestFlag = HI_FALSE; + break; + } + + } + if(HI_TRUE == bTestFlag) + { + s32ResultNum++; + } + } + return s32ResultNum; +} + + +static HI_VOID * SAMPLE_IVE_OdProc(HI_VOID * pArgs) +{ + HI_S32 s32Ret; + HI_U32 i,j; + SAMPLE_IVE_OD_S *pstOd; + VIDEO_FRAME_INFO_S stFrameInfo; + VI_CHN viChn = 0; + HI_S32 s32GetFrameMilliSec = 2000; + HI_S32 s32SetFrameMilliSec = 2000; + IVE_DATA_S stSrc; + IVE_DATA_S stDst; + IVE_HANDLE IveHandle; + HI_BOOL bFinish = HI_FALSE; + HI_BOOL bBlock = HI_TRUE; + HI_BOOL bInstant = HI_TRUE; + VO_LAYER voLayer = 0; + VO_CHN voChn = 0; + + POINT_S stChar[IVE_CHAR_NUM]; + POINT_S astPoints[10] = {{0,0}}; + IVE_LINEAR_DATA_S stIveLinerData; + HI_U64 *pu64VirData = HI_NULL; + IVE_DMA_CTRL_S stDmaCtrl = {IVE_DMA_MODE_DIRECT_COPY,0,0,0,0}; + + HI_U64 u64TopLeft, u64TopRight, u64BtmLeft, u64BtmRight; + HI_U64 *pu64TopRow, *pu64BtmRow; + HI_U64 u64BlockSum,u64BlockSq; + HI_FLOAT fSqVar; + + pstOd = (SAMPLE_IVE_OD_S *)(pArgs); + pu64VirData = (HI_U64 *)pstOd->stInteg.pu8VirAddr[0]; + + stIveLinerData.pstLinearPoint = &astPoints[0]; + stIveLinerData.s32LinearNum = 2; + stIveLinerData.s32ThreshNum = IVE_CHAR_NUM/2; + stIveLinerData.pstLinearPoint[0].s32X = 80; + stIveLinerData.pstLinearPoint[0].s32Y = 0; + stIveLinerData.pstLinearPoint[1].s32X = 80; + stIveLinerData.pstLinearPoint[1].s32Y = 20; + + while (HI_FALSE == s_bStopSignal) + { + + s32Ret = HI_MPI_VI_GetFrame(viChn, &stFrameInfo, s32GetFrameMilliSec); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_GetFrame fail,Error(%#x)\n",s32Ret); + continue; + } + stSrc.pu8VirAddr = (HI_U8*)stFrameInfo.stVFrame.pVirAddr[0]; + stSrc.u32PhyAddr = stFrameInfo.stVFrame.u32PhyAddr[0]; + stSrc.u16Stride = (HI_U16)stFrameInfo.stVFrame.u32Stride[0]; + stSrc.u16Width = (HI_U16)stFrameInfo.stVFrame.u32Width; + stSrc.u16Height = stFrameInfo.stVFrame.u32Height; + + stDst.pu8VirAddr = pstOd->stSrc.pu8VirAddr[0]; + stDst.u32PhyAddr = pstOd->stSrc.u32PhyAddr[0]; + stDst.u16Stride = (HI_U16)stFrameInfo.stVFrame.u32Stride[0]; + stDst.u16Width = (HI_U16)stFrameInfo.stVFrame.u32Width; + stDst.u16Height = stFrameInfo.stVFrame.u32Height; + + bInstant = HI_FALSE; + s32Ret = HI_MPI_IVE_DMA(&IveHandle,&stSrc,&stDst,&stDmaCtrl,bInstant); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_IVE_DMA fail,Error(%#x)\n",s32Ret); + (HI_VOID)HI_MPI_VI_ReleaseFrame(viChn, &stFrameInfo); + continue; + } + + bInstant = HI_TRUE; + s32Ret = HI_MPI_IVE_Integ(&IveHandle, &pstOd->stSrc, &pstOd->stInteg,&pstOd->stIntegCtrl,bInstant); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_IVE_Integ fail,Error(%#x)\n",s32Ret); + (HI_VOID)HI_MPI_VI_ReleaseFrame(viChn, &stFrameInfo); + continue; + } + + s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); + while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret) + { + usleep(100); + s32Ret = HI_MPI_IVE_Query(IveHandle,&bFinish,bBlock); + } + if(HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_IVE_Query fail,Error(%#x)\n",s32Ret); + (HI_VOID)HI_MPI_VI_ReleaseFrame(viChn, &stFrameInfo); + continue; + } + + for(j = 0; j < IVE_CHAR_CALH; j++) + { + pu64TopRow = (0 == j) ? (pu64VirData) : ( pu64VirData + (j * pstOd->u32H -1) * pstOd->stInteg.u16Stride[0]); + pu64BtmRow = pu64VirData + ((j + 1) * pstOd->u32H - 1) * pstOd->stInteg.u16Stride[0]; + + for(i = 0;i < IVE_CHAR_CALW; i++) + { + u64TopLeft = (0 == j) ? (0) :((0 == i) ? (0) : (pu64TopRow[i * pstOd->u32W-1])); + u64TopRight = (0 == j) ? (0) : (pu64TopRow[(i + 1) * pstOd->u32W - 1]); + u64BtmLeft = (0 == i) ? (0) : (pu64BtmRow[i * pstOd->u32W - 1]); + u64BtmRight = pu64BtmRow[(i + 1) * pstOd->u32W -1]; + + u64BlockSum = (u64TopLeft & 0xfffffffLL) + (u64BtmRight & 0xfffffffLL) + - (u64BtmLeft & 0xfffffffLL) - (u64TopRight & 0xfffffffLL); + + u64BlockSq = (u64TopLeft >> 28) + (u64BtmRight >> 28) + - (u64BtmLeft >> 28) - (u64TopRight >> 28); + + // mean + stChar[j * IVE_CHAR_CALW + i].s32X = u64BlockSum/(pstOd->u32W*pstOd->u32H); + // sigma=sqrt(1/(w*h)*sum((x(i,j)-mean)^2)= sqrt(sum(x(i,j)^2)/(w*h)-mean^2) + fSqVar = u64BlockSq/(pstOd->u32W*pstOd->u32H) - stChar[j * IVE_CHAR_CALW + i].s32X * stChar[j * IVE_CHAR_CALW + i].s32X; + stChar[j * IVE_CHAR_CALW + i].s32Y = (HI_U32)sqrt(fSqVar); + } + } + + s32Ret = SAMPLE_IVE_Linear2DClassifer(&stChar[0],IVE_CHAR_NUM, + stIveLinerData.pstLinearPoint,stIveLinerData.s32LinearNum); + if(s32Ret > stIveLinerData.s32ThreshNum) + { + SAMPLE_PRT("\033[0;31m Occlusion detected!\033[0;39m\n"); + } + else + { + SAMPLE_PRT("Enter any key to quit!\n"); + } + + //Send to vo + s32Ret = HI_MPI_VO_SendFrame(voLayer,voChn,&stFrameInfo,s32SetFrameMilliSec); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VO_SendFrame fail,Error(%#x)\n",s32Ret); + (HI_VOID)HI_MPI_VI_ReleaseFrame(viChn, &stFrameInfo); + continue; + } + + s32Ret = HI_MPI_VI_ReleaseFrame(viChn, &stFrameInfo); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_ReleaseFrame fail,ViChn(%d),Error(%#x)\n",viChn,s32Ret); + continue; + } + } + return HI_NULL; +} + + +HI_VOID SAMPLE_IVE_Od(HI_VOID) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_U16 u16Width = 1920; + HI_U16 u16Height = 1080; + + SAMPLE_IVE_OD_S stOd; + SAMPLE_IVE_VI_VO_CONFIG_S stViVoConfig; + pthread_t hIveThread; + + SAMPLE_COMM_IVE_CheckIveMpiInit(); + + s_bStopSignal = HI_FALSE; + stViVoConfig.enPicSize = PIC_HD1080; + stViVoConfig.enNorm = VIDEO_ENCODING_MODE_PAL; + stViVoConfig.enVoIntfType = VO_INTF_BT656;//hi3518ev200 only support BT656/LCD + stViVoConfig.stViConfig.enViMode = SAMPLE_VI_MODE_BT1120_1080P; + stViVoConfig.stViConfig.enNorm = VIDEO_ENCODING_MODE_PAL; + stViVoConfig.stViConfig.enRotate = ROTATE_NONE; + stViVoConfig.stViConfig.enViChnSet = VI_CHN_SET_NORMAL; + stViVoConfig.stViConfig.enWDRMode = WDR_MODE_NONE; + + s32Ret = SAMPLE_IVE_Od_Init(&stOd,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_IVE_Detect_Init fail\n"); + goto OD_END_0; + } + + s32Ret = SAMPLE_COMM_IVE_BT1120_720P_PreView(&stViVoConfig,HI_TRUE,HI_FALSE,HI_TRUE,HI_FALSE,HI_FALSE,1); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_BT1120_720P_PreView fail\n"); + goto OD_END_1; + } + + pthread_create(&hIveThread, 0, SAMPLE_IVE_OdProc, (HI_VOID*)&stOd); + + SAMPLE_VI_PAUSE(); + + s_bStopSignal = HI_TRUE; + pthread_join(hIveThread,HI_NULL); + SAMPLE_COMM_IVE_BT1120_720P_Stop(&stViVoConfig,HI_FALSE,HI_TRUE,HI_FALSE,HI_FALSE,HI_FALSE,1); + +OD_END_1: + SAMPLE_IVE_Od_Uninit(&(stOd)); +OD_END_0: + SAMPLE_COMM_IVE_IveMpiExit(); +} + + + diff --git a/device/mpp/sample/ive/sample/sample_ive_sobel_with_cached_mem.c b/device/mpp/sample/ive/sample/sample_ive_sobel_with_cached_mem.c new file mode 100644 index 0000000..2689acb --- /dev/null +++ b/device/mpp/sample/ive/sample/sample_ive_sobel_with_cached_mem.c @@ -0,0 +1,302 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_ive.h" + +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_ive.h" + +#include "sample_comm_ive.h" + + +typedef struct hiSAMPLE_IVE_SOBEL_S +{ + IVE_SRC_IMAGE_S stSrc1; + IVE_SRC_IMAGE_S stSrc2; + IVE_DST_IMAGE_S stDstH1; + IVE_DST_IMAGE_S stDstH2; + IVE_DST_IMAGE_S stDstV1; + IVE_DST_IMAGE_S stDstV2; + IVE_SOBEL_CTRL_S stSobelCtrl; + FILE *pFpSrc; + FILE *pFpDstH1; + FILE *pFpDstH2; + FILE *pFpDstV1; + FILE *pFpDstV2; +}SAMPLE_IVE_SOBEL_S; + +static HI_BOOL s_bFlushCached = HI_TRUE; +/****************************************************************************** +* function : show Sobel uninit +******************************************************************************/ +static HI_VOID SAMPLE_IVE_Sobel_Uninit(SAMPLE_IVE_SOBEL_S *pstSobel) +{ + IVE_MMZ_FREE(pstSobel->stSrc1.u32PhyAddr[0],pstSobel->stSrc1.pu8VirAddr[0]); + IVE_MMZ_FREE(pstSobel->stSrc2.u32PhyAddr[0],pstSobel->stSrc2.pu8VirAddr[0]); + IVE_MMZ_FREE(pstSobel->stDstH1.u32PhyAddr[0],pstSobel->stDstH1.pu8VirAddr[0]); + IVE_MMZ_FREE(pstSobel->stDstH2.u32PhyAddr[0],pstSobel->stDstH2.pu8VirAddr[0]); + IVE_MMZ_FREE(pstSobel->stDstV1.u32PhyAddr[0],pstSobel->stDstV1.pu8VirAddr[0]); + IVE_MMZ_FREE(pstSobel->stDstV2.u32PhyAddr[0],pstSobel->stDstV2.pu8VirAddr[0]); + + IVE_CLOSE_FILE(pstSobel->pFpSrc); + IVE_CLOSE_FILE(pstSobel->pFpDstH1); + IVE_CLOSE_FILE(pstSobel->pFpDstH2); + IVE_CLOSE_FILE(pstSobel->pFpDstV1); + IVE_CLOSE_FILE(pstSobel->pFpDstV2); +} +/****************************************************************************** +* function : show Sobel init +******************************************************************************/ +static HI_S32 SAMPLE_IVE_Sobel_Init(SAMPLE_IVE_SOBEL_S *pstSobel, + HI_CHAR *pchSrcFileName,HI_U16 u16Width,HI_U16 u16Height) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_CHAR achFileName[IVE_FILE_NAME_LEN]; + HI_S8 as8Mask[25] = {0,0,0,0,0, + 0,-1,0,1,0, + 0,-2,0,2,0, + 0,-1,0,1,0, + 0,0,0,0,0}; + + memset(pstSobel,0,sizeof(SAMPLE_IVE_SOBEL_S)); + + s32Ret = SAMPLE_COMM_IVE_CreateImageByCached(&(pstSobel->stSrc1),IVE_IMAGE_TYPE_U8C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImageByCached fail\n"); + goto SOBEL_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImageByCached(&(pstSobel->stSrc2),IVE_IMAGE_TYPE_U8C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImageByCached fail\n"); + goto SOBEL_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstSobel->stDstH1),IVE_IMAGE_TYPE_S16C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto SOBEL_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstSobel->stDstH2),IVE_IMAGE_TYPE_S16C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto SOBEL_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstSobel->stDstV1),IVE_IMAGE_TYPE_S16C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto SOBEL_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstSobel->stDstV2),IVE_IMAGE_TYPE_S16C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto SOBEL_INIT_FAIL; + } + + pstSobel->stSobelCtrl.enOutCtrl = IVE_SOBEL_OUT_CTRL_BOTH; + memcpy(pstSobel->stSobelCtrl.as8Mask,as8Mask,25); + + pstSobel->pFpSrc = fopen(pchSrcFileName,"rb"); + if(HI_NULL == pstSobel->pFpSrc) + { + SAMPLE_PRT("Open file %s fail\n",pchSrcFileName); + s32Ret = HI_FAILURE; + goto SOBEL_INIT_FAIL; + } + + sprintf(achFileName,"./data/output/sobel/sobelh1.dat"); + pstSobel->pFpDstH1 = fopen(achFileName,"wb"); + if(HI_NULL == pstSobel->pFpDstH1) + { + SAMPLE_PRT("Open file %s fail\n",achFileName); + s32Ret = HI_FAILURE; + goto SOBEL_INIT_FAIL; + } + sprintf(achFileName,"./data/output/sobel/sobelh2.dat"); + pstSobel->pFpDstH2 = fopen(achFileName,"wb"); + if(HI_NULL == pstSobel->pFpDstH2) + { + SAMPLE_PRT("Open file %s fail\n",achFileName); + s32Ret = HI_FAILURE; + goto SOBEL_INIT_FAIL; + } + sprintf(achFileName,"./data/output/sobel/sobelv1.dat"); + pstSobel->pFpDstV1 = fopen(achFileName,"wb"); + if(HI_NULL == pstSobel->pFpDstV1) + { + SAMPLE_PRT("Open file %s fail\n",achFileName); + s32Ret = HI_FAILURE; + goto SOBEL_INIT_FAIL; + } + sprintf(achFileName,"./data/output/sobel/sobelv2.dat"); + pstSobel->pFpDstV2 = fopen(achFileName,"wb"); + if(HI_NULL == pstSobel->pFpDstV2) + { + SAMPLE_PRT("Open file %s fail\n",achFileName); + s32Ret = HI_FAILURE; + goto SOBEL_INIT_FAIL; + } + +SOBEL_INIT_FAIL: + + if(HI_SUCCESS != s32Ret) + { + SAMPLE_IVE_Sobel_Uninit(pstSobel); + } + return s32Ret; +} +/****************************************************************************** +* function : show Sobel proc +******************************************************************************/ +static HI_VOID SAMPLE_IVE_SobelProc(SAMPLE_IVE_SOBEL_S *pstSobel) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_BOOL bInstant = HI_TRUE; + IVE_HANDLE IveHandle; + HI_BOOL bBlock = HI_TRUE; + HI_BOOL bFinish = HI_FALSE; + + s32Ret = SAMPLE_COMM_IVE_ReadFile(&(pstSobel->stSrc1),pstSobel->pFpSrc); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_ReadFile fail\n"); + return; + } + + memcpy(pstSobel->stSrc2.pu8VirAddr[0],pstSobel->stSrc1.pu8VirAddr[0],pstSobel->stSrc2.u16Stride[0] * pstSobel->stSrc2.u16Height); + s32Ret = HI_MPI_SYS_MmzFlushCache(pstSobel->stSrc1.u32PhyAddr[0], pstSobel->stSrc1.pu8VirAddr[0], + pstSobel->stSrc1.u16Stride[0]* pstSobel->stSrc1.u16Height); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_SYS_MmzFlushCache fail,Error(%#x)\n",s32Ret); + return; + } + s32Ret = HI_MPI_IVE_Sobel(&IveHandle, &pstSobel->stSrc1, &pstSobel->stDstH1, &pstSobel->stDstV1, &pstSobel->stSobelCtrl,bInstant); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Sobel fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); + while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret) + { + usleep(100); + s32Ret = HI_MPI_IVE_Query(IveHandle,&bFinish,bBlock); + } + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Query fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstSobel->stDstH1, pstSobel->pFpDstH1); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_WriteFile fail\n"); + return; + } + + s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstSobel->stDstV1, pstSobel->pFpDstV1); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_WriteFile fail\n"); + return; + } + + //Second sobel + // The result of sobel my be error,if you do not call HI_MPI_SYS_MmzFlushCache to flush cache + if(s_bFlushCached == HI_TRUE) + { + s32Ret = HI_MPI_SYS_MmzFlushCache(pstSobel->stSrc2.u32PhyAddr[0], pstSobel->stSrc2.pu8VirAddr[0], + pstSobel->stSrc2.u16Stride[0]* pstSobel->stSrc2.u16Height); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_SYS_MmzFlushCache fail,Error(%#x)\n",s32Ret); + return; + } + } + + s32Ret = HI_MPI_IVE_Sobel(&IveHandle, &pstSobel->stSrc2, &pstSobel->stDstH2, &pstSobel->stDstV2, &pstSobel->stSobelCtrl,bInstant); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Sobel fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); + while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret) + { + usleep(100); + s32Ret = HI_MPI_IVE_Query(IveHandle,&bFinish,bBlock); + } + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Query fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstSobel->stDstH2, pstSobel->pFpDstH2); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_WriteFile fail\n"); + return; + } + + s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstSobel->stDstV2, pstSobel->pFpDstV2); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_WriteFile fail\n"); + return; + } + return; +} +/****************************************************************************** +* function : show Sobel sample +******************************************************************************/ +HI_VOID SAMPLE_IVE_Sobel(HI_VOID) +{ + HI_S32 s32Ret; + SAMPLE_IVE_SOBEL_S stSobel; + HI_U16 u16Width = 720; + HI_U16 u16Height = 576; + HI_CHAR *pchSrcFileName = "./data/input/sobel/sobel.yuv"; + + SAMPLE_COMM_IVE_CheckIveMpiInit(); + + s32Ret = SAMPLE_IVE_Sobel_Init(&stSobel,pchSrcFileName,u16Width,u16Height); + if(HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_IVE_Sobel_Init fail\n"); + goto SOBEL_FAIL; + } + + SAMPLE_IVE_SobelProc(&stSobel); + + SAMPLE_IVE_Sobel_Uninit(&stSobel); + +SOBEL_FAIL: + SAMPLE_COMM_IVE_IveMpiExit(); +} + + + diff --git a/device/mpp/sample/ive/sample/sample_ive_test_memory.c b/device/mpp/sample/ive/sample/sample_ive_test_memory.c new file mode 100644 index 0000000..f980f63 --- /dev/null +++ b/device/mpp/sample/ive/sample/sample_ive_test_memory.c @@ -0,0 +1,240 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_ive.h" + +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_ive.h" + +#include "sample_comm_ive.h" + + +typedef struct hiTEST_MEMORY_S +{ + IVE_SRC_IMAGE_S stSrc1; + IVE_SRC_IMAGE_S stSrc2; + IVE_DST_IMAGE_S stDst; + IVE_DST_MEM_INFO_S stHist; + IVE_SUB_CTRL_S stSubCtrl; + FILE *pFpSrc; + FILE *pFpDst; + +}TEST_MEMORY_S; + +/****************************************************************************** +* function : test memory uninit +******************************************************************************/ +static HI_VOID SAMPLE_IVE_TestMemory_Uninit(TEST_MEMORY_S *pstTestMem) +{ + IVE_MMZ_FREE(pstTestMem->stSrc1.u32PhyAddr[0],pstTestMem->stSrc1.pu8VirAddr[0]); + IVE_MMZ_FREE(pstTestMem->stSrc2.u32PhyAddr[0],pstTestMem->stSrc2.pu8VirAddr[0]); + IVE_MMZ_FREE(pstTestMem->stDst.u32PhyAddr[0],pstTestMem->stDst.pu8VirAddr[0]); + IVE_MMZ_FREE(pstTestMem->stHist.u32PhyAddr,pstTestMem->stHist.pu8VirAddr); + + IVE_CLOSE_FILE(pstTestMem->pFpSrc); + IVE_CLOSE_FILE(pstTestMem->pFpDst); +} +/****************************************************************************** +* function : test memory init +******************************************************************************/ +static HI_S32 SAMPLE_IVE_TestMemory_Init(TEST_MEMORY_S *pstTestMem,HI_CHAR *pchSrcFileName, + HI_CHAR *pchDstFileName,HI_U16 u16Width,HI_U16 u16Height) +{ + HI_S32 s32Ret; + HI_U32 u32Size; + + memset(pstTestMem,0,sizeof(TEST_MEMORY_S)); + + s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstTestMem->stSrc1),IVE_IMAGE_TYPE_U8C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto TEST_MEMORY_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstTestMem->stSrc2),IVE_IMAGE_TYPE_U8C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto TEST_MEMORY_INIT_FAIL; + } + s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstTestMem->stDst),IVE_IMAGE_TYPE_U8C1,u16Width,u16Height); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail\n"); + goto TEST_MEMORY_INIT_FAIL; + } + + u32Size = IVE_HIST_NUM * sizeof(HI_U32); + s32Ret = SAMPLE_COMM_IVE_CreateMemInfo(&(pstTestMem->stHist),u32Size); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_CreateMemInfo fail\n"); + goto TEST_MEMORY_INIT_FAIL; + } + + pstTestMem->stSubCtrl.enMode = IVE_SUB_MODE_ABS; + + pstTestMem->pFpSrc = fopen(pchSrcFileName,"rb"); + if(HI_NULL == pstTestMem->pFpSrc) + { + SAMPLE_PRT("Open file %s fail\n",pchSrcFileName); + s32Ret = HI_FAILURE; + goto TEST_MEMORY_INIT_FAIL; + } + + pstTestMem->pFpDst = fopen(pchDstFileName,"wb"); + if(HI_NULL == pstTestMem->pFpDst) + { + SAMPLE_PRT("Open file %s fail\n",pchDstFileName); + s32Ret = HI_FAILURE; + goto TEST_MEMORY_INIT_FAIL; + } + +TEST_MEMORY_INIT_FAIL: + + if(HI_SUCCESS != s32Ret) + { + SAMPLE_IVE_TestMemory_Uninit(pstTestMem); + } + return s32Ret; +} +/****************************************************************************** +* function : test memory +******************************************************************************/ +static HI_VOID SAMPLE_IVE_TestMemoryProc(TEST_MEMORY_S *pstTestMem) +{ + HI_S32 s32Ret; + HI_U32 *pu32Hist; + HI_U32 i; + IVE_HANDLE IveHandle; + HI_BOOL bInstant = HI_FALSE; + HI_BOOL bBlock = HI_TRUE; + HI_BOOL bFinish = HI_FALSE; + IVE_SRC_DATA_S stSrcData; + IVE_DST_DATA_S stDstData; + IVE_DMA_CTRL_S stDmaCtrl; + + s32Ret = SAMPLE_COMM_IVE_ReadFile(&(pstTestMem->stSrc1),pstTestMem->pFpSrc); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_ReadFile fail\n"); + return; + } + + stDmaCtrl.enMode = IVE_DMA_MODE_DIRECT_COPY; + + stSrcData.pu8VirAddr = pstTestMem->stSrc1.pu8VirAddr[0]; + stSrcData.u32PhyAddr = pstTestMem->stSrc1.u32PhyAddr[0]; + stSrcData.u16Width = pstTestMem->stSrc1.u16Width; + stSrcData.u16Height = pstTestMem->stSrc1.u16Height; + stSrcData.u16Stride = pstTestMem->stSrc1.u16Stride[0]; + + stDstData.pu8VirAddr = pstTestMem->stSrc2.pu8VirAddr[0]; + stDstData.u32PhyAddr = pstTestMem->stSrc2.u32PhyAddr[0]; + stDstData.u16Width = pstTestMem->stSrc2.u16Width; + stDstData.u16Height = pstTestMem->stSrc2.u16Height; + stDstData.u16Stride = pstTestMem->stSrc2.u16Stride[0]; + s32Ret = HI_MPI_IVE_DMA(&IveHandle,&stSrcData, &stDstData, + &stDmaCtrl, bInstant); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_DMA fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = HI_MPI_IVE_Sub(&IveHandle, &pstTestMem->stSrc1, &pstTestMem->stSrc2, &pstTestMem->stDst,&pstTestMem->stSubCtrl, bInstant); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Sub fail,Error(%#x)\n",s32Ret); + return; + } + + bInstant = HI_TRUE; + s32Ret = HI_MPI_IVE_Hist(&IveHandle, &pstTestMem->stDst, &pstTestMem->stHist, bInstant); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Hist fail,Error(%#x)\n",s32Ret); + return; + } + s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); + while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret) + { + usleep(100); + s32Ret = HI_MPI_IVE_Query(IveHandle,&bFinish,bBlock); + } + + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("HI_MPI_IVE_Query fail,Error(%#x)\n",s32Ret); + return; + } + + s32Ret = SAMPLE_COMM_IVE_WriteFile(&pstTestMem->stDst,pstTestMem->pFpDst); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("SAMPLE_COMM_IVE_WriteFile fail\n"); + return; + } + + pu32Hist = (HI_U32 *)pstTestMem->stHist.pu8VirAddr; + + if(pu32Hist[0] != pstTestMem->stSrc1.u16Width * pstTestMem->stSrc1.u16Height) + { + + SAMPLE_PRT("Test mem error,pu32Hist[0] = %d\n",pu32Hist[0]); + for(i = 1;i < IVE_HIST_NUM;i++) + { + if(pu32Hist[i] != 0) + { + SAMPLE_PRT("Test mem error, pu32Hist[%d] = %d\n",i,pu32Hist[i]); + } + } + } + +} +/****************************************************************************** +* function : Show test memory sample +******************************************************************************/ +HI_VOID SAMPLE_IVE_TestMemory(HI_VOID) +{ + HI_S32 s32Ret; + TEST_MEMORY_S stTestMem; + HI_U16 u16Width = 720; + HI_U16 u16Height = 576; + HI_CHAR *pchSrcFile = "./data/input/testmem/test_mem_in.yuv"; + HI_CHAR *pchDstFile = "./data/output/testmem/test_mem_out.yuv"; + + SAMPLE_COMM_IVE_CheckIveMpiInit(); + s32Ret = SAMPLE_IVE_TestMemory_Init(&stTestMem,pchSrcFile,pchDstFile,u16Width,u16Height); + if(HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_IVE_TestMemory_Init fail\n"); + goto TEST_MEMORY_FAIL; + } + + SAMPLE_IVE_TestMemoryProc(&stTestMem); + + SAMPLE_IVE_TestMemory_Uninit(&stTestMem); + +TEST_MEMORY_FAIL: + SAMPLE_COMM_IVE_IveMpiExit(); +} + + + + diff --git a/device/mpp/sample/ive/sample_ive_main b/device/mpp/sample/ive/sample_ive_main new file mode 100644 index 0000000..590530c Binary files /dev/null and b/device/mpp/sample/ive/sample_ive_main differ diff --git a/device/mpp/sample/ive/sample_ive_main.c b/device/mpp/sample/ive/sample_ive_main.c new file mode 100644 index 0000000..74de655 --- /dev/null +++ b/device/mpp/sample/ive/sample_ive_main.c @@ -0,0 +1,119 @@ +/****************************************************************************** + A simple program of Hisilicon mpp implementation. + Copyright (C), 2012-2020, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2013-7 Created +******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sample_comm_ive.h" + +#include "./sample/sample_ive_main.h" + + +/****************************************************************************** +* function : to process abnormal case +******************************************************************************/ +HI_VOID SAMPLE_IVE_HandleSig(HI_S32 s32Signo) +{ + if (SIGINT == s32Signo || SIGTSTP == s32Signo) + { + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram termination abnormally!\033[0;39m\n"); + } + exit(-1); +} + +/****************************************************************************** +* function : show usage +******************************************************************************/ +HI_VOID SAMPLE_IVE_Usage(HI_CHAR *pchPrgName) +{ + printf("Usage : %s [complete] [vi/file]\n", pchPrgName); + printf("index:\n"); + printf("\t 0)Canny,:0, complete canny;1,part canny.\n"); + printf("\t 1)Occlusion detected.\n"); + printf("\t 2)Motion detected,:0,vi;1,file.\n"); + printf("\t 3)MemoryTest.\n"); + printf("\t 4)Sobel.\n"); + +} + + +/****************************************************************************** +* function : ive sample +******************************************************************************/ +int main(int argc, char *argv[]) +{ + HI_S32 s32Ret = HI_SUCCESS; + + signal(SIGINT, SAMPLE_IVE_HandleSig); + signal(SIGTERM, SAMPLE_IVE_HandleSig); + + if (argc < 2) + { + SAMPLE_IVE_Usage(argv[0]); + return HI_FAILURE; + } + + switch (*argv[1]) + { + case '0': + { + if ((argc < 3) || (('0' != *argv[2]) && ('1' != *argv[2]))) + { + SAMPLE_IVE_Usage(argv[0]); + return HI_FAILURE; + } + SAMPLE_IVE_Canny(*argv[2]); + } + break; + case '1': + { + SAMPLE_IVE_Od(); + } + break; + case '2': + { + if ((argc < 3) || (('0' != *argv[2]) && ('1' != *argv[2]))) + { + SAMPLE_IVE_Usage(argv[0]); + return HI_FAILURE; + } + SAMPLE_IVE_Md(*argv[2]); + } + break; + case '3': + { + SAMPLE_IVE_TestMemory(); + } + break; + case '4': + { + SAMPLE_IVE_Sobel(); + } + break; + default : + { + SAMPLE_IVE_Usage(argv[0]); + } + break; + } + + + + return s32Ret; +} + + + diff --git a/device/mpp/sample/readme b/device/mpp/sample/readme new file mode 100644 index 0000000..de08c91 Binary files /dev/null and b/device/mpp/sample/readme differ diff --git a/device/mpp/sample/region/Makefile b/device/mpp/sample/region/Makefile new file mode 100644 index 0000000..d48980f --- /dev/null +++ b/device/mpp/sample/region/Makefile @@ -0,0 +1,33 @@ +# Hisilicon Hi3516 sample Makefile + +include ../Makefile.param +#ifeq ($(SAMPLE_PARAM_FILE), ) +# SAMPLE_PARAM_FILE:=../Makefile.param +# include $(SAMPLE_PARAM_FILE) +#endif + +# target source +SRC := $(wildcard *.c) +OBJ := $(SRC:%.c=%.o) + +TARGET := $(OBJ:%.o=%) +.PHONY : clean all + +all: $(TARGET) + + +MPI_LIBS += $(REL_LIB)/libtde.a + +$(TARGET):%:%.o $(COMM_OBJ) + $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(SENSOR_LIBS) + +clean: + @rm -f $(TARGET) + @rm -f $(OBJ) + @rm -f $(COMM_OBJ) + +cleanstream: +# @rm -f *.h264 +# @rm -f *.jpg +# @rm -f *.mjp +# @rm -f *.mp4 diff --git a/device/mpp/sample/region/mm.bmp b/device/mpp/sample/region/mm.bmp new file mode 100644 index 0000000..ef86c50 Binary files /dev/null and b/device/mpp/sample/region/mm.bmp differ diff --git a/device/mpp/sample/region/sample_region b/device/mpp/sample/region/sample_region new file mode 100644 index 0000000..c7c15d7 Binary files /dev/null and b/device/mpp/sample/region/sample_region differ diff --git a/device/mpp/sample/region/sample_region.c b/device/mpp/sample/region/sample_region.c new file mode 100644 index 0000000..8d7b62c --- /dev/null +++ b/device/mpp/sample/region/sample_region.c @@ -0,0 +1,4235 @@ +/****************************************************************************** + A simple program of Hisilicon HI3516A osd implementation. + the flow as follows: + 1) init mpp system. + 2) start vi ( internal isp, ViDev 0, 2 vichn) + 3) start venc + 4) osd process, you can see video from some H264 streams files. the video will show as follows step: + 4.1) create some cover/osd regions + 4.2) display cover/osd regions ( One Region -- Multi-VencGroup ) + 4.3) change all vencGroups Regions' Layer + 4.4) change all vencGroups Regions' position + 4.5) change all vencGroups Regions' color + 4.6) change all vencGroups Regions' alpha (front and backgroud) + 4.7) load bmp form bmp-file to Region-0 + 4.8) change BmpRegion-0 + 6) stop venc + 7) stop vi and system. + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-2 Created +******************************************************************************/ +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include +#include "loadbmp.h" + +#include "sample_comm.h" +#include "hi_tde_api.h" +#include "hi_tde_type.h" + +HI_BOOL bExit = HI_FALSE; +HI_BOOL bTravel = HI_FALSE; +HI_BOOL bShape1 = HI_FALSE; +HI_BOOL bShape2 = HI_FALSE; +HI_BOOL bArea = HI_FALSE; + +pthread_t g_stRgnThread = 0; +pthread_t g_stVencThread = 0; +pthread_t g_stVencRgnThread = 0; +pthread_t g_stVpssRgnThread = 0; + +pthread_t g_stVpssOsdReverseThread = 0; +pthread_t g_stVencOsdReverseThread = 0; + +#define OSD_REVERSE_RGN_MAXCNT 16 +#define MAX_VENC_WORK_CHN_NUM 4 + +VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_PAL; +VO_INTF_TYPE_E g_enVoIntfType = VO_INTF_LCD; +PIC_SIZE_E g_enPicSize = PIC_HD1080; + + +SAMPLE_VI_CONFIG_S g_stViChnConfig = +{ + SONY_IMX122_DC_1080P_30FPS, + VIDEO_ENCODING_MODE_AUTO, + + ROTATE_NONE, + VI_CHN_SET_NORMAL, + WDR_MODE_NONE +}; + +#define SAMPLE_RGN_NOT_PASS(err)\ +do {\ + printf("\033[0;31mtest case <%s>not pass at line:%d err:%x\033[0;39m\n",\ + __FUNCTION__,__LINE__,err);\ + exit(-1);\ +}while(0) + +pthread_mutex_t Rgnmutex_Tmp = PTHREAD_MUTEX_INITIALIZER; + +typedef struct hiRGN_OSD_REVERSE_INFO_S +{ + RGN_HANDLE Handle; + HI_U8 u8PerPixelLumaThrd; + + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_REGION_INFO_S stLumaRgnInfo; + +}RGN_OSD_REVERSE_INFO_S; + +typedef struct PTHREAD_VENC +{ + VENC_CHN VeChnId; + HI_S32 s32FrmCnt; + + FILE *pstream; +}VENC_PTHREAD_INFO_S; + +typedef struct hiRGN_SIZE_S +{ + HI_U32 u32RgnNum; + SIZE_S stSIZE; +}RGN_SIZE_S; + +typedef struct hiRGN_ATTR_INFO_S +{ + RGN_HANDLE Handle; + HI_U32 u32RgnNum; +}RGN_ATTR_INFO_S; + +static HI_S32 SAMPLE_RGN_SYS_Init(HI_VOID) +{ + HI_S32 s32Ret; + VB_CONF_S struVbConf; + MPP_SYS_CONF_S struSysConf; + + HI_MPI_SYS_Exit(); + HI_MPI_VB_Exit(); + + memset(&struVbConf, 0, sizeof(VB_CONF_S)); + + struVbConf.u32MaxPoolCnt = 32; + struVbConf.astCommPool[0].u32BlkSize = 1920*1088*2; + struVbConf.astCommPool[0].u32BlkCnt = 6; + + struVbConf.astCommPool[1].u32BlkSize = 768*576*2; + struVbConf.astCommPool[1].u32BlkCnt = 0; + + struVbConf.astCommPool[2].u32BlkSize = 768*576*2; + struVbConf.astCommPool[2].u32BlkCnt = 0; + struVbConf.astCommPool[3].u32BlkSize = 768*576*2; + struVbConf.astCommPool[3].u32BlkCnt = 0; + struVbConf.astCommPool[4].u32BlkSize = 768*576*2; + struVbConf.astCommPool[4].u32BlkCnt = 0; + + s32Ret = HI_MPI_VB_SetConf(&struVbConf); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VB_SetConf fail! s32Ret:0x%x\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VB_Init(); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VB_Init fail! s32Ret:0x%x\n", s32Ret); + return s32Ret; + } + + struSysConf.u32AlignWidth = 64; + s32Ret = HI_MPI_SYS_SetConf(&struSysConf); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_SetConf fail! s32Ret:0x%x\n", s32Ret); + (HI_VOID)HI_MPI_VB_Exit(); + return s32Ret; + } + + s32Ret = HI_MPI_SYS_Init(); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Init fail! s32Ret:0x%x\n", s32Ret); + (HI_VOID)HI_MPI_VB_Exit(); + return s32Ret; + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_RGN_SYS_Exit(HI_VOID) +{ + HI_MPI_SYS_Exit(); + HI_MPI_VB_Exit(); + + return HI_SUCCESS; +} + +HI_VOID SAMPLE_RGN_Usage1(HI_CHAR *sPrgNm) +{ + printf("Usage : %s \n", sPrgNm); + printf("intf:\n"); + printf("\t 0) vo LCD output, default.\n"); + printf("\t 1) vo BT656 output.\n"); + return; +} + +HI_VOID SAMPLE_RGN_Usage2(HI_VOID) +{ + printf("press sample command as follows!\n"); + printf("index:\n"); + printf("\t 0) VI->VPSS(COVER)->VO \n"); + printf("\t 1) VI->VPSS(COVEREX)->VO \n"); + printf("\t 2) VI->VPSS(OVERLAYEX)->VO \n"); + printf("\t 3) VI->VPSS(OVERLAYEX)->VO/VENC(OVERLAY)->file \n"); + printf("\t q) quit the whole sample\n"); + printf("sample command:"); + return; +} + + +/****************************************************************************** +* function : to process abnormal case +******************************************************************************/ +HI_VOID SAMPLE_RGN_HandleSig(HI_S32 signo) +{ + static int sig_handled = 0; + + if (!sig_handled &&(SIGINT == signo || SIGTERM == signo)) + { + sig_handled = 1; + bExit = HI_TRUE; + + if (g_stVencOsdReverseThread) + { + pthread_join(g_stVencOsdReverseThread, 0); + g_stVencOsdReverseThread = 0; + } + if (g_stVpssOsdReverseThread) + { + pthread_join(g_stVpssOsdReverseThread, 0); + g_stVpssOsdReverseThread = 0; + } + if (g_stVencRgnThread) + { + pthread_join(g_stVencRgnThread, 0); + g_stVencRgnThread = 0; + } + if (g_stVpssRgnThread) + { + pthread_join(g_stVpssRgnThread, 0); + g_stVpssRgnThread = 0; + } + if (g_stVencThread) + { + pthread_join(g_stVencThread, 0); + g_stVencThread = 0; + } + if (g_stRgnThread) + { + pthread_join(g_stRgnThread, 0); + g_stRgnThread = 0; + } + + //HI_MPI_RGN_Destroy(gs_s32RgnCntCur); + SAMPLE_COMM_ISP_Stop(); + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram exit abnormally!\033[0;39m\n"); + } + sig_handled = 0; + exit(0); +} + +/****************************************************************************** +* funciton : osd region change color +******************************************************************************/ +HI_S32 SAMPLE_RGN_ChgColor(RGN_HANDLE RgnHandle, HI_U32 u32Color) +{ + HI_S32 s32Ret; + RGN_ATTR_S stRgnAttr; + + s32Ret = HI_MPI_RGN_GetAttr(RgnHandle, &stRgnAttr); + if(HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_GetAttr (%d)) failed with %#x!\n", RgnHandle, s32Ret); + return HI_FAILURE; + } + + stRgnAttr.unAttr.stOverlay.u32BgColor = u32Color; + + s32Ret = HI_MPI_RGN_SetAttr(RgnHandle, &stRgnAttr); + if(HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_RGN_SetAttr (%d)) failed with %#x!\n", RgnHandle, s32Ret); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +/****************************************************************************** +* funciton : load bmp from file +******************************************************************************/ +HI_S32 SAMPLE_RGN_LoadBmp(const char *filename, BITMAP_S *pstBitmap, HI_BOOL bFil, HI_U32 u16FilColor) +{ + OSD_SURFACE_S Surface; + OSD_BITMAPFILEHEADER bmpFileHeader; + OSD_BITMAPINFO bmpInfo; + HI_U32 u32BytePerPix = 0; + + if(GetBmpInfo(filename, &bmpFileHeader, &bmpInfo) < 0) + { + printf("GetBmpInfo err!\n"); + return HI_FAILURE; + } + + Surface.enColorFmt = OSD_COLOR_FMT_RGB1555; + u32BytePerPix = 2; + + pstBitmap->pData = malloc(u32BytePerPix * (bmpInfo.bmiHeader.biWidth) * (bmpInfo.bmiHeader.biHeight)); + + if(NULL == pstBitmap->pData) + { + printf("malloc osd memroy err!\n"); + return HI_FAILURE; + } + + if (0 != CreateSurfaceByBitMap(filename, &Surface, (HI_U8*)(pstBitmap->pData))) + { + free(pstBitmap->pData); + pstBitmap->pData = HI_NULL; + return HI_FAILURE; + } + + pstBitmap->u32Width = Surface.u16Width; + pstBitmap->u32Height = Surface.u16Height; + pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_1555; + + + int i,j; + HI_U16 *pu16Temp; + pu16Temp = (HI_U16*)pstBitmap->pData; + + if (bFil) + { + for (i=0; iu32Height; i++) + { + for (j=0; ju32Width; j++) + { + if (u16FilColor == *pu16Temp) + { + *pu16Temp &= 0x7FFF; + } + + pu16Temp++; + } + } + + } + + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_RGN_UpdateCanvas(const char *filename, BITMAP_S *pstBitmap, HI_BOOL bFil, + HI_U32 u16FilColor, SIZE_S *pstSize, HI_U32 u32Stride, PIXEL_FORMAT_E enPixelFmt) +{ + OSD_SURFACE_S Surface; + OSD_BITMAPFILEHEADER bmpFileHeader; + OSD_BITMAPINFO bmpInfo; + + if(GetBmpInfo(filename, &bmpFileHeader, &bmpInfo) < 0) + { + printf("GetBmpInfo err!\n"); + return HI_FAILURE; + } + + if (PIXEL_FORMAT_RGB_1555 == enPixelFmt) + { + Surface.enColorFmt = OSD_COLOR_FMT_RGB1555; + } + else if (PIXEL_FORMAT_RGB_4444 == enPixelFmt) + { + Surface.enColorFmt = OSD_COLOR_FMT_RGB4444; + } + else if (PIXEL_FORMAT_RGB_8888 == enPixelFmt) + { + Surface.enColorFmt = OSD_COLOR_FMT_RGB8888; + } + else + { + printf("Pixel format is not support!\n"); + return HI_FAILURE; + } + + if(NULL == pstBitmap->pData) + { + printf("malloc osd memroy err!\n"); + return HI_FAILURE; + } + CreateSurfaceByCanvas(filename, &Surface, (HI_U8*)(pstBitmap->pData), pstSize->u32Width, pstSize->u32Height, u32Stride); + + pstBitmap->u32Width = Surface.u16Width; + pstBitmap->u32Height = Surface.u16Height; + + if (PIXEL_FORMAT_RGB_1555 == enPixelFmt) + { + pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_1555; + } + else if (PIXEL_FORMAT_RGB_4444 == enPixelFmt) + { + pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_4444; + } + else if (PIXEL_FORMAT_RGB_8888 == enPixelFmt) + { + pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_8888; + } + + int i,j; + HI_U16 *pu16Temp; + pu16Temp = (HI_U16*)pstBitmap->pData; + + if (bFil) + { + for (i=0; iu32Height; i++) + { + for (j=0; ju32Width; j++) + { + if (u16FilColor == *pu16Temp) + { + *pu16Temp &= 0x7FFF; + } + + pu16Temp++; + } + } + + } + + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_RGN_ConvOsdCavasToTdeSurface(TDE2_SURFACE_S *pstSurface, const RGN_CANVAS_INFO_S *pstCanvasInfo) +{ + HI_ASSERT((NULL != pstSurface) && (NULL != pstCanvasInfo)); + + switch (pstCanvasInfo->enPixelFmt) + { + case PIXEL_FORMAT_RGB_4444: + { + pstSurface->enColorFmt = TDE2_COLOR_FMT_ARGB4444; + break ; + } + case PIXEL_FORMAT_RGB_1555: + { + pstSurface->enColorFmt = TDE2_COLOR_FMT_ARGB1555; + break ; + } + case PIXEL_FORMAT_RGB_8888: + { + pstSurface->enColorFmt = TDE2_COLOR_FMT_ARGB8888; + break ; + } + default : + { + printf("[Func]:%s [Line]:%d [Info]:invalid Osd pixel format(%d)\n", + __FUNCTION__, __LINE__, pstCanvasInfo->enPixelFmt); + return HI_FAILURE; + } + } + + pstSurface->bAlphaExt1555 = HI_FALSE; + pstSurface->bAlphaMax255 = HI_TRUE; + pstSurface->u32PhyAddr = pstCanvasInfo->u32PhyAddr; + pstSurface->u32Width = pstCanvasInfo->stSize.u32Width; + pstSurface->u32Height = pstCanvasInfo->stSize.u32Height; + pstSurface->u32Stride = pstCanvasInfo->u32Stride; + + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_RGN_AddReverseColorTask(TDE_HANDLE handle, + TDE2_SURFACE_S *pstForeGround, TDE2_RECT_S *pstForeGroundRect, + TDE2_SURFACE_S *pstBackGround, TDE2_RECT_S *pstBackGroundRect) +{ + HI_S32 s32Ret; + TDE2_OPT_S stOpt = {0}; + + HI_ASSERT(NULL != pstForeGround); + HI_ASSERT(NULL != pstForeGroundRect); + HI_ASSERT(NULL != pstBackGround); + HI_ASSERT(NULL != pstBackGroundRect); + + stOpt.enAluCmd = TDE2_ALUCMD_ROP; + stOpt.enRopCode_Alpha = TDE2_ROP_COPYPEN; + stOpt.enRopCode_Color = TDE2_ROP_NOT; + + s32Ret = HI_TDE2_Bitblit(handle, pstBackGround, pstBackGroundRect, pstForeGround, + pstForeGroundRect, pstBackGround, pstBackGroundRect, &stOpt); + if (HI_SUCCESS != s32Ret) + { + printf("HI_TDE2_Bitblit fail! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + return HI_SUCCESS; + +} + + +HI_S32 SAMPLE_RGN_ReverseOsdColor(TDE2_SURFACE_S *pstSrcSurface, TDE2_SURFACE_S *pstDstSurface, + const VPSS_REGION_INFO_S *pstRgnInfo) +{ + HI_S32 i; + HI_S32 s32Ret; + TDE_HANDLE handle; + TDE2_RECT_S stRect; + + + HI_ASSERT(NULL != pstSrcSurface); + HI_ASSERT(NULL != pstDstSurface); + HI_ASSERT(NULL != pstRgnInfo); + + s32Ret = HI_TDE2_Open(); + if (HI_SUCCESS != s32Ret) + { + printf("HI_TDE2_Open fail! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + handle = HI_TDE2_BeginJob(); + if (handle < 0) + { + printf("HI_TDE2_BeginJob fail!\n"); + return HI_FAILURE; + } + + stRect.s32Xpos = 0; + stRect.s32Ypos = 0; + stRect.u32Width = pstSrcSurface->u32Width; + stRect.u32Height = pstSrcSurface->u32Height; + s32Ret = HI_TDE2_QuickCopy(handle, pstSrcSurface, &stRect, pstDstSurface, &stRect); + if (HI_SUCCESS != s32Ret) + { + printf("HI_TDE2_QuickCopy fail! s32Ret: 0x%x.\n", s32Ret); + HI_TDE2_CancelJob(handle); + return s32Ret; + } + + for (i = 0; i < pstRgnInfo->u32RegionNum; ++i) + { + stRect.s32Xpos = pstRgnInfo->pstRegion[i].s32X; + stRect.s32Ypos = pstRgnInfo->pstRegion[i].s32Y; + stRect.u32Width = pstRgnInfo->pstRegion[i].u32Width; + stRect.u32Height = pstRgnInfo->pstRegion[i].u32Height; + + s32Ret = SAMPLE_RGN_AddReverseColorTask(handle, pstSrcSurface, &stRect, pstDstSurface, &stRect); + if (HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_AddReverseColorTask fail! s32Ret: 0x%x.\n", s32Ret); + HI_TDE2_CancelJob(handle); + return s32Ret; + } + } + + s32Ret = HI_TDE2_EndJob(handle, HI_FALSE, HI_FALSE, 10); + if (HI_SUCCESS != s32Ret) + { + printf("HI_TDE2_EndJob fail! s32Ret: 0x%x.\n", s32Ret); + HI_TDE2_CancelJob(handle); + return s32Ret; + } + + s32Ret = HI_TDE2_WaitForDone(handle); + if (HI_SUCCESS != s32Ret) + { + printf("HI_TDE2_WaitForDone fail! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_RGN_GetVoDisplayNum(HI_U32 u32VoChnNum) +{ + HI_S32 s32DispNum; + + if (1 == u32VoChnNum) + { + s32DispNum = 1; + } + else if (4 == u32VoChnNum) + { + s32DispNum = 2; + } + else if (9 == u32VoChnNum) + { + s32DispNum = 3; + } + else if (16 == u32VoChnNum) + { + s32DispNum = 4; + } + else + { + return -1; + } + + return s32DispNum; +} + + +HI_S32 SAMPLE_RGN_GetVoLayer(VO_DEV VoDev) +{ + HI_S32 s32LayerNum; + + if (0 == VoDev) + { + s32LayerNum = 0; + } + else + { + return -1; + } + + return s32LayerNum; +} + +HI_S32 SAMPLE_RGN_CreateCover(RGN_HANDLE Handle, HI_U32 u32Num) +{ + HI_S32 i; + HI_S32 s32Ret; + MPP_CHN_S stChn; + RGN_ATTR_S stRgnAttr; + RGN_CHN_ATTR_S stChnAttr; + + /* Add cover to vpss group */ + stChn.enModId = HI_ID_VPSS; + stChn.s32DevId = 0; + stChn.s32ChnId = 0; + + /* Create cover and attach to vpss group */ + for (i=Handle; i<(Handle + u32Num); i++) + { + stRgnAttr.enType = COVER_RGN; + + s32Ret = HI_MPI_RGN_Create(i, &stRgnAttr); + if(s32Ret != HI_SUCCESS) + { + printf("HI_MPI_RGN_Create fail! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = COVER_RGN; + if (i < 4) + { + stChnAttr.unChnAttr.stCoverChn.enCoverType = AREA_RECT; + stChnAttr.unChnAttr.stCoverChn.stRect.s32X = 10 * (i - Handle); + stChnAttr.unChnAttr.stCoverChn.stRect.s32Y = 10 * (i - Handle); + stChnAttr.unChnAttr.stCoverChn.stRect.u32Height = 64 * (i - Handle + 1); + stChnAttr.unChnAttr.stCoverChn.stRect.u32Width = 64 * (i - Handle + 1); + } + else + { + stChnAttr.unChnAttr.stCoverChn.enCoverType = AREA_QUAD_RANGLE; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.bSolid = HI_TRUE; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.u32Thick = 2; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[0].s32X = 50 * i; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[0].s32Y = 0; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[1].s32X = 50 + 50 * i; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[1].s32Y = 50; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[2].s32X = 50 + 50 * i; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[2].s32Y = 300; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[3].s32X = 50 * i; + stChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[3].s32Y = 200; + } + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x000000ff; + if (1 == i%COVER_MAX_NUM_VPSS) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x0000ff00; + } + else if (2 == i%COVER_MAX_NUM_VPSS) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x00ff0000; + } + else if (3 == i%COVER_MAX_NUM_VPSS) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x00808080; + } + stChnAttr.unChnAttr.stCoverChn.u32Layer = i - Handle; + + s32Ret = HI_MPI_RGN_AttachToChn(i, &stChn, &stChnAttr); + if(s32Ret != HI_SUCCESS) + { + printf("HI_MPI_RGN_AttachToChn fail! s32Ret: 0x%x. w %d, H %d\n", s32Ret, \ + stChnAttr.unChnAttr.stCoverChn.stRect.u32Height, stChnAttr.unChnAttr.stCoverChn.stRect.u32Width); + return s32Ret; + } + } + + return HI_SUCCESS; + +} + +HI_S32 SAMPLE_RGN_CreateCoverEx(RGN_HANDLE Handle, HI_U32 u32Num) +{ + HI_S32 i; + HI_S32 s32Ret; + MPP_CHN_S stChn; + RGN_ATTR_S stRgnAttr; + RGN_CHN_ATTR_S stChnAttr; + + /* Add cover to vpss group */ + stChn.enModId = HI_ID_VPSS; + stChn.s32DevId = 0; + stChn.s32ChnId = VPSS_CHN0; + + /* Create cover and attach to vpss group */ + for (i=Handle; i<(Handle + u32Num); i++) + { + stRgnAttr.enType = COVEREX_RGN; + + s32Ret = HI_MPI_RGN_Create(i, &stRgnAttr); + if(s32Ret != HI_SUCCESS) + { + printf("HI_MPI_RGN_Create fail! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = COVEREX_RGN; + if (i < 4) + { + stChnAttr.unChnAttr.stCoverExChn.enCoverType = AREA_RECT; + stChnAttr.unChnAttr.stCoverExChn.stRect.s32X = 10 * (i - Handle); + stChnAttr.unChnAttr.stCoverExChn.stRect.s32Y = 10 * (i - Handle); + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Height = 64 * (i - Handle + 1); + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Width = 64 * (i - Handle + 1); + } + else + { + stChnAttr.unChnAttr.stCoverExChn.enCoverType = AREA_QUAD_RANGLE; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.bSolid = HI_TRUE; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.u32Thick = 2; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.stPoint[0].s32X = 50 * i; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.stPoint[0].s32Y = 0; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.stPoint[1].s32X = 50 + 50 * i; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.stPoint[1].s32Y = 50; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.stPoint[2].s32X = 50 + 50 * i; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.stPoint[2].s32Y = 300; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.stPoint[3].s32X = 50 * i; + stChnAttr.unChnAttr.stCoverExChn.stQuadRangle.stPoint[3].s32Y = 200; + } + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x000000ff; + if (1 == i%COVEREX_MAX_NUM_VPSS) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x0000ff00; + } + else if (2 == i%COVEREX_MAX_NUM_VPSS) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x00ff0000; + } + else if (3 == i%COVEREX_MAX_NUM_VPSS) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x00808080; + } + stChnAttr.unChnAttr.stCoverExChn.u32Layer = i - Handle; + + s32Ret = HI_MPI_RGN_AttachToChn(i, &stChn, &stChnAttr); + if(s32Ret != HI_SUCCESS) + { + printf("HI_MPI_RGN_AttachToChn fail! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + + return HI_SUCCESS; + +} + +HI_S32 SAMPLE_RGN_CreateOverlayExForVpss(RGN_HANDLE Handle, HI_U32 u32Num) +{ + HI_S32 i; + HI_S32 s32Ret; + MPP_CHN_S stChn; + HI_U32 u32layer = 0; + RGN_ATTR_S stRgnAttrSet; + RGN_CHN_ATTR_S stChnAttr; + + /*attach the OSD to the vpss*/ + stChn.enModId = HI_ID_VPSS; + stChn.s32DevId = 0; + stChn.s32ChnId = VPSS_CHN0; + + for (i=Handle; i<(Handle + u32Num); i++) + { + stRgnAttrSet.enType = OVERLAYEX_RGN; + stRgnAttrSet.unAttr.stOverlayEx.enPixelFmt = PIXEL_FORMAT_RGB_1555; + stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width = 300; + stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height = 300; + stRgnAttrSet.unAttr.stOverlayEx.u32BgColor = 0x000003e0; + + if (1 == i%u32Num) + { + stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width = 180; + stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height = 120; + stRgnAttrSet.unAttr.stOverlayEx.u32BgColor = 0x0000001f; + } + else if (2 == i%u32Num) + { + stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width = 160; + stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height = 120; + stRgnAttrSet.unAttr.stOverlayEx.u32BgColor = 0x00007c00; + } + else if (3 == i%u32Num) + { + stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width = 100; + stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height = 150; + stRgnAttrSet.unAttr.stOverlayEx.u32BgColor = 0x000007ff; + } + + s32Ret = HI_MPI_RGN_Create(i, &stRgnAttrSet); + if(s32Ret != HI_SUCCESS) + { + printf("HI_MPI_RGN_Create failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAYEX_RGN; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 48; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 48; + stChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha = 255; + stChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha = 255; + stChnAttr.unChnAttr.stOverlayExChn.u32Layer = u32layer; + u32layer++; + if (1 == i%4) + { + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 130; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 330; + } + else if (2 == i%4) + { + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 270; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 300; + } + else if (3 == i%4) + { + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 180; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 400; + } + + s32Ret = HI_MPI_RGN_AttachToChn(i, &stChn, &stChnAttr); + if(s32Ret != HI_SUCCESS) + { + printf("HI_MPI_RGN_AttachToChn failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + + return HI_SUCCESS; + +} + + +HI_S32 SAMPLE_RGN_CreateOverlayForVenc(RGN_HANDLE Handle, HI_U32 u32Num) +{ + HI_S32 i; + HI_S32 s32Ret; + MPP_CHN_S stChn; + RGN_ATTR_S stRgnAttr; + RGN_CHN_ATTR_S stChnAttr; + + /* Add cover to vpss group */ + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = 0; + stChn.s32ChnId = 0; + + for (i=Handle; i<(Handle + u32Num); i++) + { + stRgnAttr.enType = OVERLAY_RGN; + stRgnAttr.unAttr.stOverlay.enPixelFmt = PIXEL_FORMAT_RGB_1555; + stRgnAttr.unAttr.stOverlay.stSize.u32Width = 300; + stRgnAttr.unAttr.stOverlay.stSize.u32Height = 300; + stRgnAttr.unAttr.stOverlay.u32BgColor = 0x000003e0; + + if (1 == i%u32Num) + { + stRgnAttr.unAttr.stOverlay.stSize.u32Width = 180; + stRgnAttr.unAttr.stOverlay.stSize.u32Height = 120; + stRgnAttr.unAttr.stOverlay.u32BgColor = 0x0000001f; + } + else if (2 == i%u32Num) + { + stRgnAttr.unAttr.stOverlay.stSize.u32Width = 160; + stRgnAttr.unAttr.stOverlay.stSize.u32Height = 120; + stRgnAttr.unAttr.stOverlay.u32BgColor = 0x00007c00; + } + else if (3 == i%u32Num) + { + stRgnAttr.unAttr.stOverlay.stSize.u32Width = 100; + stRgnAttr.unAttr.stOverlay.stSize.u32Height = 160; + stRgnAttr.unAttr.stOverlay.u32BgColor = 0x000007ff; + } + + s32Ret = HI_MPI_RGN_Create(i, &stRgnAttr); + if(s32Ret != HI_SUCCESS) + { + printf("HI_MPI_RGN_Create failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAY_RGN; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 48; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 48; + stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 128; + stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 128; + stChnAttr.unChnAttr.stOverlayChn.u32Layer = i; + + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = HI_FALSE; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp = 0; + + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Height = 16*(i%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Width = 16*(i%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.u32LumThresh = 128; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.enChgMod = LESSTHAN_LUM_THRESH; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.bInvColEn = HI_FALSE; + if (1 == i%u32Num) + { + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 128; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 320; + } + else if (2 == i%u32Num) + { + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 280; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 240; + } + else if (3 == i%u32Num) + { + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 180; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 400; + } + s32Ret = HI_MPI_RGN_AttachToChn(i, &stChn, &stChnAttr); + if(s32Ret != HI_SUCCESS) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + + return HI_SUCCESS; + +} + + +HI_S32 SAMPLE_RGN_GetVoAttr(VO_DEV VoDev, VO_INTF_SYNC_E enIntfSync, + VO_VIDEO_LAYER_ATTR_S *pstLayerAttr, HI_S32 s32SquareSort, VO_CHN_ATTR_S *astChnAttr) +{ + HI_U32 u32Frmt, u32Width, u32Height, j; + + switch (enIntfSync) + { + case VO_OUTPUT_PAL : u32Width = 720; u32Height = 576; u32Frmt = 25; break; + case VO_OUTPUT_NTSC : u32Width = 720; u32Height = 480; u32Frmt = 30; break; + case VO_OUTPUT_1080P24 : u32Width = 1920; u32Height = 1080; u32Frmt = 24; break; + case VO_OUTPUT_1080P25 : u32Width = 1920; u32Height = 1080; u32Frmt = 25; break; + case VO_OUTPUT_1080P30 : u32Width = 1920; u32Height = 1080; u32Frmt = 30; break; + case VO_OUTPUT_720P50 : u32Width = 1280; u32Height = 720; u32Frmt = 50; break; + case VO_OUTPUT_720P60 : u32Width = 1280; u32Height = 720; u32Frmt = 60; break; + case VO_OUTPUT_1080I50 : u32Width = 1920; u32Height = 1080; u32Frmt = 50; break; + case VO_OUTPUT_1080I60 : u32Width = 1920; u32Height = 1080; u32Frmt = 60; break; + case VO_OUTPUT_1080P50 : u32Width = 1920; u32Height = 1080; u32Frmt = 50; break; + case VO_OUTPUT_1080P60 : u32Width = 1920; u32Height = 1080; u32Frmt = 60; break; + case VO_OUTPUT_576P50 : u32Width = 720; u32Height = 576; u32Frmt = 50; break; + case VO_OUTPUT_480P60 : u32Width = 720; u32Height = 480; u32Frmt = 60; break; + case VO_OUTPUT_800x600_60: u32Width = 800; u32Height = 600; u32Frmt = 60; break; + case VO_OUTPUT_1024x768_60: u32Width = 1024; u32Height = 768; u32Frmt = 60; break; + case VO_OUTPUT_1280x1024_60: u32Width = 1280; u32Height = 1024; u32Frmt = 60; break; + case VO_OUTPUT_1366x768_60: u32Width = 1366; u32Height = 768; u32Frmt = 60; break; + case VO_OUTPUT_1440x900_60: u32Width = 1440; u32Height = 900; u32Frmt = 60; break; + case VO_OUTPUT_1280x800_60: u32Width = 1280; u32Height = 800; u32Frmt = 60; break; + case VO_OUTPUT_240X320_50: u32Width = 240; u32Height = 320; u32Frmt = 50; break; + case VO_OUTPUT_320X240_50: u32Width = 320; u32Height = 240; u32Frmt = 50; break; + case VO_OUTPUT_320X240_60: u32Width = 320; u32Height = 240; u32Frmt = 30; break; + + default: return HI_FAILURE; + } + + if (NULL != pstLayerAttr) + { + pstLayerAttr->stDispRect.s32X = 0; + pstLayerAttr->stDispRect.s32Y = 0; + pstLayerAttr->stDispRect.u32Width = u32Width; + pstLayerAttr->stDispRect.u32Height = u32Height; + pstLayerAttr->stImageSize.u32Width = u32Width; + pstLayerAttr->stImageSize.u32Height = u32Height; + pstLayerAttr->bDoubleFrame = HI_FALSE; + pstLayerAttr->bClusterMode = HI_FALSE; + pstLayerAttr->u32DispFrmRt = u32Frmt; + pstLayerAttr->enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + } + + if (NULL != astChnAttr) + { + for (j=0; j<(s32SquareSort * s32SquareSort); j++) + { + astChnAttr[j].stRect.s32X = ALIGN_BACK((u32Width / s32SquareSort) * (j % s32SquareSort), 4); + astChnAttr[j].stRect.s32Y = ALIGN_BACK((u32Height / s32SquareSort) * (j / s32SquareSort), 4); + astChnAttr[j].stRect.u32Width = ALIGN_BACK(u32Width / s32SquareSort, 4); + astChnAttr[j].stRect.u32Height = ALIGN_BACK(u32Height / s32SquareSort, 4); + astChnAttr[j].u32Priority = 0; + astChnAttr[j].bDeflicker = HI_FALSE; + } + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_RGN_StartVpss(HI_S32 s32VpssGrpNum, HI_U32 u32VpssChn) +{ + HI_S32 i = 0; + HI_S32 s32Ret; + VPSS_CHN_MODE_S stVpssChnMode; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + PIC_SIZE_E enPicSize = g_enPicSize; + SIZE_S stSize; + + SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + memset(&stVpssChnAttr,0,sizeof(VPSS_CHN_ATTR_S)); + + stGrpAttr.u32MaxW = stSize.u32Width; + stGrpAttr.u32MaxH = stSize.u32Height; + stGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stGrpAttr.bIeEn = HI_FALSE; + stGrpAttr.bNrEn = HI_FALSE; + stGrpAttr.bHistEn = HI_FALSE; + stGrpAttr.bDciEn = HI_FALSE; + + for (i = 0; i < s32VpssGrpNum; i++) + { + s32Ret = HI_MPI_VPSS_CreateGrp(i, &stGrpAttr); + if (HI_SUCCESS != s32Ret) + { + printf("create vpss grp%d fail, s32Ret: 0x%x.\n", i, s32Ret); + return s32Ret; + + } + + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = 720; + stVpssChnMode.u32Height = 576; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + + stVpssChnAttr.bBorderEn = HI_FALSE; + stVpssChnAttr.bSpEn = HI_FALSE; + stVpssChnAttr.bFlip = HI_FALSE; + stVpssChnAttr.bMirror = HI_FALSE; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + + for (VpssChn = 0; VpssChn < 4; VpssChn++) + { + if (0 == VpssChn) + { + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + } + else + { + stVpssChnMode.u32Width = 720; + stVpssChnMode.u32Height = 576; + } + + s32Ret = HI_MPI_VPSS_SetChnMode(i, VpssChn, &stVpssChnMode); + if (HI_SUCCESS != s32Ret) + { + printf("set vpss grp%d chn%d mode fail, s32Ret: 0x%x.\n", i, VpssChn, s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VPSS_SetChnAttr(i, VpssChn, &stVpssChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("set vpss grp%d chn%d Attr fail, s32Ret: 0x%x.\n", i, VpssChn, s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VPSS_EnableChn(i, VpssChn); + if (HI_SUCCESS != s32Ret) + { + printf("create vpss grp%d chnl%d fail, s32Ret: 0x%x.\n", i, VpssChn, s32Ret); + return s32Ret; + } + } + + s32Ret = HI_MPI_VPSS_StartGrp(i); + if (HI_SUCCESS != s32Ret) + { + printf("start vpss grp%d fail, s32Ret: 0x%x.\n", i, s32Ret); + return s32Ret; + } + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_RGN_StartVpssHD(HI_S32 s32VpssGrpNum, HI_U32 u32VpssChn) +{ + HI_S32 i = 0; + HI_S32 s32Ret; + VPSS_CHN_MODE_S stVpssChnMode; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + PIC_SIZE_E enPicSize = g_enPicSize; + SIZE_S stSize; + + SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + + memset(&stVpssChnAttr,0,sizeof(VPSS_CHN_ATTR_S)); + + stGrpAttr.u32MaxW = stSize.u32Width; + stGrpAttr.u32MaxH = stSize.u32Height; + stGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stGrpAttr.bIeEn = HI_FALSE; + stGrpAttr.bNrEn = HI_FALSE; + stGrpAttr.bHistEn = HI_FALSE; + stGrpAttr.bDciEn = HI_FALSE; + + for (i = 0; i < s32VpssGrpNum; i++) + { + s32Ret = HI_MPI_VPSS_CreateGrp(i, &stGrpAttr); + if (HI_SUCCESS != s32Ret) + { + printf("creat vpss grp%d fail! s32Ret: 0x%x.\n", i, s32Ret); + return s32Ret; + + } + + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + + stVpssChnAttr.bBorderEn = HI_FALSE; + stVpssChnAttr.bSpEn = HI_FALSE; + stVpssChnAttr.bFlip = HI_FALSE; + stVpssChnAttr.bMirror = HI_FALSE; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + + for (VpssChn = 0; VpssChn < 4; VpssChn++) + { + if (0 == VpssChn) + { + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + } + else + { + stVpssChnMode.u32Width = 720; + stVpssChnMode.u32Height = 576; + } + + s32Ret = HI_MPI_VPSS_SetChnMode(i, VpssChn, &stVpssChnMode); + if (HI_SUCCESS != s32Ret) + { + printf("set vpss grp%d chn%d mode fail, s32Ret: 0x%x.\n", i, VpssChn, s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VPSS_SetChnAttr(i, VpssChn, &stVpssChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("set vpss grp%d chn%d Attr fail, s32Ret: 0x%x.\n", i, VpssChn, s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VPSS_EnableChn(i, VpssChn); + if (HI_SUCCESS != s32Ret) + { + printf("create vpss grp%d chnl%d fail, s32Ret: 0x%x.\n", i, VpssChn, s32Ret); + return s32Ret; + } + } + + s32Ret = HI_MPI_VPSS_StartGrp(i); + if (HI_SUCCESS != s32Ret) + { + printf("start vpss grp%d fail! s32Ret: 0x%x.\n", i, s32Ret); + return s32Ret; + } + } + + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_RGN_StopVpss(HI_S32 s32VpssGrpNum) +{ + HI_S32 i = 0; + HI_S32 s32Ret; + + + for (i = 0; i < s32VpssGrpNum; i++) + { + s32Ret = HI_MPI_VPSS_StopGrp(i); + if (HI_SUCCESS != s32Ret) + { + printf("stop vpss grp%d fail! s32Ret: 0x%x.\n", i, s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VPSS_DestroyGrp(i); + if (HI_SUCCESS != s32Ret) + { + printf("destroy vpss grp%d fail! s32Ret: 0x%x.\n", i, s32Ret); + return s32Ret; + } + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_RGN_StartVo(VO_DEV VoDev, HI_U32 u32VoChnNum, VO_PUB_ATTR_S *pstPubAttr) +{ + HI_S32 i; + HI_S32 s32Ret; + HI_S32 s32DispNum; + VO_LAYER VoLayer; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + VO_CHN_ATTR_S astChnAttr[16]; + + s32DispNum = SAMPLE_RGN_GetVoDisplayNum(u32VoChnNum); + if(s32DispNum < 0) + { + printf("SAMPLE_RGN_GetVoDisplayNum failed! u32VoChnNum: %d.\n", u32VoChnNum); + return HI_FAILURE; + } + + s32Ret = SAMPLE_RGN_GetVoAttr(VoDev, pstPubAttr->enIntfSync, &stLayerAttr, s32DispNum, astChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_GetVoAttr failed!\n"); + return HI_FAILURE; + } + + VoLayer = SAMPLE_RGN_GetVoLayer(VoDev); + if(VoLayer < 0) + { + printf("SAMPLE_RGN_GetVoLayer failed! VoDev: %d.\n", VoDev); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VO_Disable(VoDev); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_Disable failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VO_SetPubAttr(VoDev, pstPubAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_SetPubAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VO_Enable(VoDev); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_Enable failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VO_SetVideoLayerAttr(VoLayer, &stLayerAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_SetVideoLayerAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VO_EnableVideoLayer(VoLayer); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_EnableVideoLayer failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + for (i = 0; i < u32VoChnNum; i++) + { + s32Ret = HI_MPI_VO_SetChnAttr(VoLayer, i, &astChnAttr[i]); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_SetChnAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VO_EnableChn(VoLayer, i); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_EnableChn failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_RGN_StopVoChn(VO_DEV VoDev, HI_U32 u32VoChnNum) +{ + HI_S32 i; + HI_S32 s32Ret; + VO_LAYER VoLayer; + + VoLayer = SAMPLE_RGN_GetVoLayer(VoDev); + if(VoLayer < 0) + { + printf("SAMPLE_RGN_GetVoLayer failed! VoDev: %d.\n", VoDev); + return HI_FAILURE; + } + + for (i = 0; i< u32VoChnNum; i++) + { + s32Ret = HI_MPI_VO_DisableChn(VoLayer, i); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_DisableChn failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_RGN_StopVoDev(VO_DEV VoDev) +{ + HI_S32 s32Ret; + VO_LAYER VoLayer; + + VoLayer = SAMPLE_RGN_GetVoLayer(VoDev); + if(VoLayer < 0) + { + printf("SAMPLE_RGN_GetVoLayer failed! VoDev: %d.\n", VoDev); + return HI_FAILURE; + } + + s32Ret = HI_MPI_VO_DisableVideoLayer(VoLayer); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_DisableVideoLayer failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VO_Disable(VoDev); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO_Disable failed! s32Ret:0x%x.\n", s32Ret); + return s32Ret; + } + + return 0; +} + +HI_S32 SAMPLE_RGN_StartVenc(VENC_CHN VencChn) +{ + HI_S32 s32Ret; + HI_U32 u32PicWidth; + HI_U32 u32PicHeight; + VENC_CHN_ATTR_S stChnAttr; + + u32PicWidth = 720; + u32PicHeight = 576; + stChnAttr.stVeAttr.enType = PT_H264; + stChnAttr.stVeAttr.stAttrH264e.bByFrame = HI_TRUE; + + stChnAttr.stVeAttr.stAttrH264e.u32MaxPicHeight = u32PicHeight; + stChnAttr.stVeAttr.stAttrH264e.u32MaxPicWidth = u32PicWidth; + stChnAttr.stVeAttr.stAttrH264e.u32PicHeight = u32PicHeight; + stChnAttr.stVeAttr.stAttrH264e.u32PicWidth = u32PicWidth; + stChnAttr.stVeAttr.stAttrH264e.u32BufSize = u32PicWidth * u32PicHeight * 2; + stChnAttr.stVeAttr.stAttrH264e.u32Profile = 0; + + stChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR; + stChnAttr.stRcAttr.stAttrH264Cbr.fr32DstFrmRate = 25; + stChnAttr.stRcAttr.stAttrH264Cbr.u32BitRate = 1024 * 2; + stChnAttr.stRcAttr.stAttrH264Cbr.u32FluctuateLevel = 0; + stChnAttr.stRcAttr.stAttrH264Cbr.u32Gop = 25; + stChnAttr.stRcAttr.stAttrH264Cbr.u32SrcFrmRate = 25; + stChnAttr.stRcAttr.stAttrH264Cbr.u32StatTime = 1; + + s32Ret = HI_MPI_VENC_CreateChn(VencChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_CreateChn error, s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VENC_StartRecvPic(VencChn); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_StartRecvPic error, s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + printf("Venc chn create ok, and start receive picture!\n"); + + return HI_SUCCESS; +} + +HI_S32 SAMPLE_RGN_StopVenc(VENC_CHN VencChn) +{ + HI_S32 s32Ret; + + s32Ret = HI_MPI_VENC_StopRecvPic(VencChn); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_StopRecvPic error, s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_VENC_DestroyChn(VencChn); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_DestroyChn error, s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + printf("Venc chn stop receive picture and destroy ok!\n"); + + return HI_SUCCESS; +} + + +/****************************************************************************** + * function : change cover + ******************************************************************************/ +void* SAMPLE_RGN_VpssCoverDynamicDisplay(void* p) +{ + HI_S32 s32Ret; + HI_U32 u32RgnNum; + RGN_HANDLE Handle; + RGN_HANDLE startHandle; + MPP_CHN_S stChn; + RGN_CHN_ATTR_S stChnAttr; + RGN_ATTR_INFO_S *pstRgnAttrInfo = NULL; + + stChn.enModId = HI_ID_VPSS; + stChn.s32DevId = 0; + stChn.s32ChnId = 0; + + pstRgnAttrInfo = (RGN_ATTR_INFO_S *)p; + startHandle = pstRgnAttrInfo->Handle; + u32RgnNum = pstRgnAttrInfo->u32RgnNum; + + if (u32RgnNum > COVER_MAX_NUM_VPSS) + { + printf("cover num(%d) is bigger than COVER_MAX_NUM_VPSS(%d)..\n", u32RgnNum, COVER_MAX_NUM_VPSS); + return NULL; + } + + while (HI_FALSE == bExit) + { + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = COVER_RGN; + stChnAttr.unChnAttr.stCoverChn.enCoverType = AREA_RECT; + stChnAttr.unChnAttr.stCoverChn.stRect.s32X = 32*(Handle - startHandle); + stChnAttr.unChnAttr.stCoverChn.stRect.s32Y = 32*(Handle - startHandle); + stChnAttr.unChnAttr.stCoverChn.stRect.u32Height = 64; + stChnAttr.unChnAttr.stCoverChn.stRect.u32Width = 64; + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x0000ffff; + if (Handle%2) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x00ff0000; + } + stChnAttr.unChnAttr.stCoverChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.unChnAttr.stCoverChn.stRect.s32X = 32*((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverChn.stRect.s32Y = 32; + stChnAttr.unChnAttr.stCoverChn.stRect.u32Height = 64; + stChnAttr.unChnAttr.stCoverChn.stRect.u32Width = 64; + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x0000ffff; + if (Handle%2) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x00ff0000; + } + stChnAttr.unChnAttr.stCoverChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.unChnAttr.stCoverChn.stRect.s32X = 60 * (Handle - startHandle); + stChnAttr.unChnAttr.stCoverChn.stRect.s32Y = 60 * (Handle - startHandle); + stChnAttr.unChnAttr.stCoverChn.stRect.u32Height = 64 * ((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverChn.stRect.u32Width = 64 * ((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x000000ff; + if (1 == Handle) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x0000ff00; + } + else if (2 == Handle) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x00ff0000; + } + else if (3 == Handle) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x00808000; + } + stChnAttr.unChnAttr.stCoverChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.unChnAttr.stCoverChn.stRect.s32X = 60*((Handle - startHandle)+1); + stChnAttr.unChnAttr.stCoverChn.stRect.s32Y = 60; + stChnAttr.unChnAttr.stCoverChn.stRect.u32Height = 64 * ((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverChn.stRect.u32Width = 64 * ((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x000000ff; + if (1 == Handle) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x0000ff00; + } + else if (2 == Handle) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x00ff0000; + } + else if (3 == Handle) + { + stChnAttr.unChnAttr.stCoverChn.u32Color = 0x00800080; + } + stChnAttr.unChnAttr.stCoverChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + + sleep(2); + } + + return (HI_VOID *)HI_SUCCESS; +} + +/****************************************************************************** + * function : change coverex + ******************************************************************************/ +void* SAMPLE_RGN_VpssCoverExDynamicDisplay(void* p) +{ + HI_S32 s32Ret; + HI_U32 u32RgnNum; + RGN_HANDLE Handle; + RGN_HANDLE startHandle; + MPP_CHN_S stChn; + RGN_CHN_ATTR_S stChnAttr; + RGN_ATTR_INFO_S *pstRgnAttrInfo = NULL; + + stChn.enModId = HI_ID_VPSS; + stChn.s32DevId = 0; + stChn.s32ChnId = VPSS_CHN0; + + pstRgnAttrInfo = (RGN_ATTR_INFO_S *)p; + startHandle = pstRgnAttrInfo->Handle; + u32RgnNum = pstRgnAttrInfo->u32RgnNum; + + if (u32RgnNum > COVEREX_MAX_NUM_VPSS) + { + printf("coverex num(%d) is bigger than COVEREX_MAX_NUM_VPSS(%d)..\n", u32RgnNum, COVEREX_MAX_NUM_VPSS); + return NULL; + } + + while (HI_FALSE == bExit) + { + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = COVEREX_RGN; + stChnAttr.unChnAttr.stCoverExChn.enCoverType = AREA_RECT; + stChnAttr.unChnAttr.stCoverExChn.stRect.s32X = 32*(Handle - startHandle); + stChnAttr.unChnAttr.stCoverExChn.stRect.s32Y = 32*(Handle - startHandle); + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Height = 64; + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Width = 64; + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x0000ffff; + if (Handle%2) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x00ff0000; + } + stChnAttr.unChnAttr.stCoverExChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.unChnAttr.stCoverExChn.stRect.s32X = 32*((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverExChn.stRect.s32Y = 32; + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Height = 64; + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Width = 64; + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x0000ffff; + if (Handle%2) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x00ff8000; + } + stChnAttr.unChnAttr.stCoverExChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.unChnAttr.stCoverExChn.stRect.s32X = 60 * (Handle - startHandle); + stChnAttr.unChnAttr.stCoverExChn.stRect.s32Y = 60 * (Handle - startHandle); + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Height = 64 * ((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Width = 64 * ((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x000000ff; + if (1 == Handle) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x0000ff00; + } + else if (2 == Handle) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x00ff0000; + } + else if (3 == Handle) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x0080800; + } + stChnAttr.unChnAttr.stCoverExChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.unChnAttr.stCoverExChn.stRect.s32X = 60*((Handle - startHandle)+1); + stChnAttr.unChnAttr.stCoverExChn.stRect.s32Y = 60; + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Height = 64 * ((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverExChn.stRect.u32Width = 64 * ((Handle - startHandle) + 1); + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x000000ff; + if (1 == Handle) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x0000ff00; + } + else if (2 == Handle) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x00ff0000; + } + else if (3 == Handle) + { + stChnAttr.unChnAttr.stCoverExChn.u32Color = 0x0080800; + } + stChnAttr.unChnAttr.stCoverExChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + + sleep(2); + } + + return (HI_VOID *)HI_SUCCESS; +} + + +/****************************************************************************** + * function : change OSD + ******************************************************************************/ +void* SAMPLE_RGN_VpssOSdDynamicDisplay(void* p) +{ + HI_S32 s32Ret; + HI_U32 u32RgnNum; + RGN_HANDLE Handle; + RGN_HANDLE startHandle; + MPP_CHN_S stChn; + RGN_CHN_ATTR_S stChnAttr; + RGN_ATTR_INFO_S *pstRgnAttrInfo = NULL; + + stChn.enModId = HI_ID_VPSS; + stChn.s32DevId = 0; + stChn.s32ChnId = VPSS_CHN0; + + pstRgnAttrInfo = (RGN_ATTR_INFO_S *)p; + startHandle = pstRgnAttrInfo->Handle; + u32RgnNum = pstRgnAttrInfo->u32RgnNum; + + if (u32RgnNum > OVERLAYEX_MAX_NUM_VPSS) + { + printf("cover num(%d) is bigger than OVERLAY_MAX_NUM_VPSS(%d)..\n", u32RgnNum, OVERLAY_MAX_NUM_VPSS); + return NULL; + } + + while (HI_FALSE == bExit) + { + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAYEX_RGN; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 80*(Handle - startHandle); + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 80*(Handle - startHandle); + stChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha = 30*(OVERLAYEX_MAX_NUM_VPSS - (Handle - startHandle)); + stChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha = 30*(OVERLAYEX_MAX_NUM_VPSS - (Handle - startHandle)); + stChnAttr.unChnAttr.stOverlayExChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAYEX_RGN; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 50*(Handle - startHandle); + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 50*(Handle - startHandle); + stChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha = 30*(OVERLAYEX_MAX_NUM_VPSS - (Handle - startHandle)); + stChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha = 30*(OVERLAYEX_MAX_NUM_VPSS - (Handle - startHandle)); + stChnAttr.unChnAttr.stOverlayExChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAYEX_RGN; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 60*(Handle - startHandle); + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 60*(Handle - startHandle); + stChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha = 30*(OVERLAYEX_MAX_NUM_VPSS - (Handle - startHandle)); + stChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha = 30*(OVERLAYEX_MAX_NUM_VPSS - (Handle - startHandle)); + stChnAttr.unChnAttr.stOverlayExChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=startHandle; Handle<(startHandle+u32RgnNum); Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAYEX_RGN; + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = 100*(Handle - startHandle); + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = 100*(Handle - startHandle); + stChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha = 30*(OVERLAYEX_MAX_NUM_VPSS - (Handle - startHandle)); + stChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha = 30*(OVERLAYEX_MAX_NUM_VPSS - (Handle - startHandle)); + stChnAttr.unChnAttr.stOverlayExChn.u32Layer = Handle - startHandle; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + + sleep(2); + } + + return (HI_VOID *)HI_SUCCESS; +} + + +/****************************************************************************** + * function : change OSD + ******************************************************************************/ +void* SAMPLE_RGN_VencOSdDynamicDisplay(void* p) +{ + HI_S32 s32Ret; + RGN_HANDLE Handle; + MPP_CHN_S stChn; + RGN_CHN_ATTR_S stChnAttr; + + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = 0; + stChn.s32ChnId = 0; + + + while (HI_FALSE == bExit) + { + /* ̬ɫ ̬ƶ */ + for (Handle=0; Handle<4; Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAY_RGN; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 80*Handle; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 80*Handle; + stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 16*(8-Handle); + stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 16*(8-Handle); + stChnAttr.unChnAttr.stOverlayChn.u32Layer = Handle; + + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = HI_FALSE; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp = 0; + + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Height = 16*(Handle%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Width = 16*(Handle%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.u32LumThresh = 128; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.enChgMod = LESSTHAN_LUM_THRESH; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.bInvColEn = HI_FALSE; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bQpDisable = HI_FALSE; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=0; Handle<4; Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAY_RGN; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 8*Handle; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 8*Handle; + stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 16*(8-Handle); + stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 16*(8-Handle); + stChnAttr.unChnAttr.stOverlayChn.u32Layer = Handle; + + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = HI_FALSE; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp = 0; + + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Height = 16*(Handle%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Width = 16*(Handle%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.u32LumThresh = 128; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.enChgMod = LESSTHAN_LUM_THRESH; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.bInvColEn = HI_FALSE; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=0; Handle<4; Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAY_RGN; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 8*Handle; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 8*Handle; + stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 16*(8-Handle); + stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 16*(8-Handle); + stChnAttr.unChnAttr.stOverlayChn.u32Layer = Handle; + + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = HI_FALSE; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp = 0; + + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Height = 16*(Handle%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Width = 16*(Handle%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.u32LumThresh = 128; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.enChgMod = LESSTHAN_LUM_THRESH; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.bInvColEn = HI_FALSE; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + sleep(3); + + for (Handle=0; Handle<4; Handle++) + { + stChnAttr.bShow = HI_TRUE; + stChnAttr.enType = OVERLAY_RGN; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 8*Handle; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 8*Handle; + stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 16*(8-Handle); + stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 16*(8-Handle); + stChnAttr.unChnAttr.stOverlayChn.u32Layer = Handle; + + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = HI_FALSE; + stChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp = 0; + + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Height = 16*(Handle%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Width = 16*(Handle%2+1); + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.u32LumThresh = 128; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.enChgMod = LESSTHAN_LUM_THRESH; + stChnAttr.unChnAttr.stOverlayChn.stInvertColor.bInvColEn = HI_FALSE; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + } + + sleep(2); + } + + return (HI_VOID *)HI_SUCCESS; +} + + +HI_VOID SAMPLE_RGN_WriteStreamToFile( FILE * fp, VENC_PACK_S * pstNalu ) +{ + HI_U8 * p; + HI_U32 u32Len; + + p = (HI_U8 *) pstNalu->pu8Addr+pstNalu->u32Offset; + + u32Len = pstNalu->u32Len-pstNalu->u32Offset; + + fwrite(p, u32Len, sizeof(HI_U8), fp); + + fflush(fp); +} + + +HI_S32 SAMPLE_RGN_CreateRegion(RGN_SIZE_S stRgnsize) +{ + RGN_CHN_ATTR_S stChnAttr; + RGN_ATTR_S stRgnAttr; + HI_U32 i,j; + HI_S32 s32Ret; + MPP_CHN_S stChn; + + for(i=0; iVeChnId,pstVencThread->VeChnId); + system(acmd); + + while (HI_FALSE == bExit || i < pstVencThread->s32FrmCnt) + { + /*change the bitmap*/ + Handle = 0; + + s32ret = HI_MPI_VENC_Query( pstVencThread->VeChnId, &stChnStat ); + if (HI_SUCCESS != s32ret) + { + ; + } + if (stChnStat.u32CurPacks > 0 || stChnStat.u32LeftStreamBytes >0) + { + if(bTravel) + { + char pfilename[60]; + snprintf(pfilename, sizeof(pfilename), "./jpeg%d/stream_fff_009_%d.jpeg",pstVencThread->VeChnId, i); + pastream = fopen( pfilename, "wb" ); + HI_ASSERT( NULL != pastream); + + + /*change the position to display*/ + Handle = 0; + + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = pstVencThread->VeChnId; + stChn.s32ChnId = 0; + + s32Ret = HI_MPI_RGN_GetDisplayAttr(Handle,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 36 * (s32cnt % 19); + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 32 * (s32cnt / 19); + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + usleep(500); + + s32Ret = HI_MPI_RGN_GetDisplayAttr(Handle,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + if(++s32cnt > (19 * 16) - 1) + { + s32cnt = 0; + } + printf("s32cnt = %d\n", s32cnt); + + /*get the stream*/ + SAMPLE_RGN_GetStream(pstVencThread->VeChnId, pastream, HI_TRUE); + + i++; + + fclose(pastream); + printf("i = %d\n", i); + + } + else if(bShape1) + { + char pfilename[60]; + s32Tmp = 12; + if(pstVencThread->VeChnId > 0) + s32Tmp = 14; + snprintf(pfilename, sizeof(pfilename), "./jpeg%d/stream_fff_0%d_%d.jpeg",pstVencThread->VeChnId, s32Tmp, i); + pastream = fopen( pfilename, "wb" ); + HI_ASSERT( NULL != pastream); + + /*change the position to display*/ + Handle = 0; + + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = pstVencThread->VeChnId; + stChn.s32ChnId = 0; + + s32Ret = HI_MPI_RGN_GetDisplayAttr(Handle,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 0; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 32 * s32cnt; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + sleep(1); + + s32Ret = HI_MPI_RGN_GetDisplayAttr(Handle,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + if(++s32cnt > 25) + { + s32cnt = 0; + } + printf("s32cnt = %d\n", s32cnt); + + /*get the steam*/ + SAMPLE_RGN_GetStream(pstVencThread->VeChnId, pastream, HI_TRUE); + i++; + + fclose(pastream); + printf("i = %d\n", i); + } + else if(bShape2) + { + char pfilename[60]; + s32Tmp = 13; + if(pstVencThread->VeChnId > 0) + s32Tmp = 15; + snprintf(pfilename, sizeof(pfilename), "./jpeg%d/stream_fff_0%d_%d.jpeg",pstVencThread->VeChnId, s32Tmp,i); + pastream = fopen( pfilename, "wb" ); + HI_ASSERT( NULL != pastream); + + + /*change the position to display*/ + Handle = 0; + + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = pstVencThread->VeChnId; + stChn.s32ChnId = 0; + + s32Ret = HI_MPI_RGN_GetDisplayAttr(Handle,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = 32 * s32cnt; + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = 0; + + s32Ret = HI_MPI_RGN_SetDisplayAttr(Handle,&stChn,&stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + sleep(1); + + s32Ret = HI_MPI_RGN_GetDisplayAttr(Handle, &stChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + if(++s32cnt > 25) + { + s32cnt = 0; + } + printf("s32cnt = %d\n", s32cnt); + + /*get the stream*/ + SAMPLE_RGN_GetStream(pstVencThread->VeChnId, pastream, HI_TRUE); + i++; + + fclose(pastream); + printf("i = %d\n", i); + } + else if(bArea) + { + char pfilename[60]; + s32Tmp = 16; + if(pstVencThread->VeChnId > 0) + s32Tmp = 17; + snprintf(pfilename, sizeof(pfilename), "./jpeg%d/stream_fff_0%d_%d.jpeg",pstVencThread->VeChnId, s32Tmp,i); + pastream = fopen( pfilename, "wb" ); + HI_ASSERT( NULL != pastream); + + pthread_mutex_lock(&Rgnmutex_Tmp); + + stRgnsize.u32RgnNum = 1; + SAMPLE_RGN_DestroyRegion(Handle, stRgnsize.u32RgnNum); + stRgnsize.stSIZE.u32Height = 36 * (s32cnt + 1); + stRgnsize.stSIZE.u32Width = 36 * (s32cnt + 1); + SAMPLE_RGN_CreateRegion(stRgnsize); + + /*change the bitmap*/ + Handle = 0; + + s32Ret = SAMPLE_RGN_LoadBmp("mm.bmp", &stBitmap, HI_FALSE, 0); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + s32Ret = HI_MPI_RGN_SetBitMap(Handle,&stBitmap); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_RGN_NOT_PASS(s32Ret); + } + + if (HI_NULL != stBitmap.pData) + { + free(stBitmap.pData); + stBitmap.pData = HI_NULL; + } + + if(++s32cnt > 25) + { + s32cnt = 0; + } + + pthread_mutex_unlock(&Rgnmutex_Tmp); + + printf("s32cnt = %d\n", s32cnt); + usleep(50000); + + /*get the stream*/ + SAMPLE_RGN_GetStream(pstVencThread->VeChnId, pastream, HI_TRUE); + i++; + + fclose(pastream); + printf("i = %d\n", i); + } + else + { + SAMPLE_RGN_GetStream(pstVencThread->VeChnId, pstVencThread->pstream, HI_TRUE); + i++; + } + } + } + printf("\nchn %d finish!\n", pstVencThread->VeChnId); + + return HI_NULL; +} + +HI_VOID *SAMPLE_RGN_VpssOsdReverse(void *pData) +{ + HI_S32 i = 0, j = 0; + RGN_HANDLE Handle; + TDE2_SURFACE_S stRgnOrignSurface = {0}; + TDE2_SURFACE_S stRgnSurface = {0}; + RGN_CANVAS_INFO_S stCanvasInfo; + TDE_HANDLE hTde; + TDE2_RECT_S stRect = {0}; + VPSS_REGION_INFO_S stReverseRgnInfo; + HI_U32 au32LumaData[OSD_REVERSE_RGN_MAXCNT]; + RECT_S astOsdRevRect[OSD_REVERSE_RGN_MAXCNT]; + RGN_OSD_REVERSE_INFO_S *pstOsdReverseInfo; + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 *pu32VirAddr = NULL; + MPP_CHN_S stMppChn = {0}; + RGN_CHN_ATTR_S stOsdChnAttr = {0}; + + HI_ASSERT(NULL != pData); + pstOsdReverseInfo = (RGN_OSD_REVERSE_INFO_S*)pData; + Handle = pstOsdReverseInfo->Handle; + HI_ASSERT(OSD_REVERSE_RGN_MAXCNT >= pstOsdReverseInfo->stLumaRgnInfo.u32RegionNum); + + srand(time(NULL)); + + /* 1.get current osd info */ + s32Ret = HI_MPI_RGN_GetCanvasInfo(Handle, &stCanvasInfo); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetCanvasInfo fail! s32Ret: 0x%x.\n", s32Ret); + return NULL; + } + + s32Ret = HI_MPI_RGN_UpdateCanvas(Handle); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_UpdateCanvas fail! s32Ret: 0x%x.\n", s32Ret); + return NULL; + } + + /* 2.make a backup of current osd */ + s32Ret = SAMPLE_RGN_ConvOsdCavasToTdeSurface(&stRgnSurface, &stCanvasInfo); + if (HI_SUCCESS != s32Ret) + { + printf("Func: %s, line: %d! s32Ret: 0x%x.\n", __FUNCTION__, __LINE__, s32Ret); + return NULL; + } + + memcpy(&stRgnOrignSurface, &stRgnSurface, sizeof(stRgnOrignSurface)); + + s32Ret = HI_MPI_SYS_MmzAlloc(&stRgnOrignSurface.u32PhyAddr, (void **)(&pu32VirAddr), + NULL, NULL, stRgnSurface.u32Stride*stRgnSurface.u32Height); + if (HI_SUCCESS != s32Ret) + { + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + s32Ret = HI_TDE2_Open(); + if (HI_SUCCESS != s32Ret) + { + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + hTde = HI_TDE2_BeginJob(); + HI_ASSERT(hTde >= 0); + stRect.u32Width = stRgnSurface.u32Width; + stRect.u32Height = stRgnSurface.u32Height; + s32Ret = HI_TDE2_QuickCopy(hTde, &stRgnSurface, &stRect, &stRgnOrignSurface, &stRect); + if (HI_SUCCESS != s32Ret) + { + printf("[Func]:%s [Line]:%d [Info]:HI_TDE2_QuickCopy failed\n", __FUNCTION__, __LINE__); + HI_TDE2_CancelJob(hTde); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + s32Ret = HI_TDE2_EndJob(hTde, HI_FALSE, HI_FALSE, 10); + if (HI_SUCCESS != s32Ret) + { + HI_TDE2_CancelJob(hTde); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + s32Ret = HI_TDE2_WaitForDone(hTde); + if (HI_SUCCESS != s32Ret) + { + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + /* 3.get the display attribute of OSD attached to vpss*/ + stMppChn.enModId = HI_ID_VPSS; + stMppChn.s32DevId = pstOsdReverseInfo->VpssGrp; + stMppChn.s32ChnId = pstOsdReverseInfo->VpssChn; + s32Ret = HI_MPI_RGN_GetDisplayAttr(Handle, &stMppChn, &stOsdChnAttr); + if (HI_SUCCESS != s32Ret) + { + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + stReverseRgnInfo.pstRegion = (RECT_S *)astOsdRevRect; + while (HI_FALSE == bExit) + { + /* 4.get the sum of luma of a region specified by user*/ + s32Ret = HI_MPI_VPSS_GetRegionLuma(pstOsdReverseInfo->VpssGrp, pstOsdReverseInfo->VpssChn, &(pstOsdReverseInfo->stLumaRgnInfo), au32LumaData, -1); + if (HI_SUCCESS != s32Ret) + { + printf("[Func]:%s [Line]:%d [Info]:HI_MPI_VPSS_GetRegionLuma VpssGrp=%d failed, s32Ret: 0x%x.\n", + __FUNCTION__, __LINE__, pstOsdReverseInfo->VpssGrp, s32Ret); + continue ; + } + + /* 5.decide which region to be reverse color according to the sum of the region*/ + for (i = 0, j = 0; i < pstOsdReverseInfo->stLumaRgnInfo.u32RegionNum; ++i) + { + pstOsdReverseInfo->u8PerPixelLumaThrd = rand() % 256; + + if (au32LumaData[i] > (pstOsdReverseInfo->u8PerPixelLumaThrd * + pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].u32Width * + pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].u32Height)) + { + /* 6.get the regions to be reverse color */ + stReverseRgnInfo.pstRegion[j].s32X = pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].s32X + - stOsdChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X; + stReverseRgnInfo.pstRegion[j].s32Y = pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].s32Y + - stOsdChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y; + stReverseRgnInfo.pstRegion[j].u32Width = pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].u32Width; + stReverseRgnInfo.pstRegion[j].u32Height = pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].u32Height; + ++j; + } + } + + stReverseRgnInfo.u32RegionNum = j; + + /* 7.the the canvas to be update */ + if (HI_SUCCESS != HI_MPI_RGN_GetCanvasInfo(Handle, &stCanvasInfo)) + { + printf("[Func]:%s [Line]:%d [Info]:HI_MPI_RGN_GetCanvasInfo failed\n", __FUNCTION__, __LINE__); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + if (HI_SUCCESS != SAMPLE_RGN_ConvOsdCavasToTdeSurface(&stRgnSurface, &stCanvasInfo)) + { + printf("[Func]:%s [Line]:%d [Info]:SAMPLE_RGN_ConvOsdCavasToTdeSurface failed\n", __FUNCTION__, __LINE__); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + /* 8.reverse color */ + if (HI_SUCCESS != SAMPLE_RGN_ReverseOsdColor(&stRgnOrignSurface, &stRgnSurface, &stReverseRgnInfo)) + { + printf("[Func]:%s [Line]:%d [Info]:SAMPLE_RGN_ReverseOsdColor failed\n", __FUNCTION__, __LINE__); + HI_MPI_RGN_UpdateCanvas(Handle); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + /* 9.update OSD */ + if (HI_SUCCESS != HI_MPI_RGN_UpdateCanvas(Handle)) + { + printf("[Func]:%s [Line]:%d [Info]:HI_MPI_RGN_UpdateCanvas failed\n", __FUNCTION__, __LINE__); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + sleep(2); + } + + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return HI_NULL; + +} + +HI_VOID *SAMPLE_RGN_VencOsdReverse(void *pData) +{ + HI_S32 i = 0, j = 0; + RGN_HANDLE Handle; + TDE2_SURFACE_S stRgnOrignSurface = {0}; + TDE2_SURFACE_S stRgnSurface = {0}; + RGN_CANVAS_INFO_S stCanvasInfo; + TDE_HANDLE hTde; + TDE2_RECT_S stRect = {0}; + VPSS_REGION_INFO_S stReverseRgnInfo; + HI_U32 au32LumaData[OSD_REVERSE_RGN_MAXCNT]; + RECT_S astOsdRevRect[OSD_REVERSE_RGN_MAXCNT]; + RGN_OSD_REVERSE_INFO_S *pstOsdReverseInfo; + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 *pu32VirAddr = NULL; + MPP_CHN_S stMppChn = {0}; + RGN_CHN_ATTR_S stOsdChnAttr = {0}; + + HI_ASSERT(NULL != pData); + pstOsdReverseInfo = (RGN_OSD_REVERSE_INFO_S*)pData; + Handle = pstOsdReverseInfo->Handle; + HI_ASSERT(OSD_REVERSE_RGN_MAXCNT >= pstOsdReverseInfo->stLumaRgnInfo.u32RegionNum); + + srand(time(NULL)); + + /* 1.get current osd info */ + s32Ret = HI_MPI_RGN_GetCanvasInfo(Handle, &stCanvasInfo); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetCanvasInfo fail! s32Ret: 0x%x.\n", s32Ret); + return NULL; + } + + s32Ret = HI_MPI_RGN_UpdateCanvas(Handle); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_UpdateCanvas fail! s32Ret: 0x%x.\n", s32Ret); + return NULL; + } + + /* 2.make a backup of current osd */ + s32Ret = SAMPLE_RGN_ConvOsdCavasToTdeSurface(&stRgnSurface, &stCanvasInfo); + if (HI_SUCCESS != s32Ret) + { + printf("Func: %s, line: %d! s32Ret: 0x%x.\n", __FUNCTION__, __LINE__, s32Ret); + return NULL; + } + + memcpy(&stRgnOrignSurface, &stRgnSurface, sizeof(stRgnOrignSurface)); + + s32Ret = HI_MPI_SYS_MmzAlloc(&stRgnOrignSurface.u32PhyAddr, (void **)(&pu32VirAddr), + NULL, NULL, stRgnSurface.u32Stride*stRgnSurface.u32Height); + if (HI_SUCCESS != s32Ret) + { + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + s32Ret = HI_TDE2_Open(); + if (HI_SUCCESS != s32Ret) + { + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + hTde = HI_TDE2_BeginJob(); + HI_ASSERT(hTde >= 0); + stRect.u32Width = stRgnSurface.u32Width; + stRect.u32Height = stRgnSurface.u32Height; + s32Ret = HI_TDE2_QuickCopy(hTde, &stRgnSurface, &stRect, &stRgnOrignSurface, &stRect); + if (HI_SUCCESS != s32Ret) + { + printf("[Func]:%s [Line]:%d [Info]:HI_TDE2_QuickCopy failed\n", __FUNCTION__, __LINE__); + HI_TDE2_CancelJob(hTde); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + s32Ret = HI_TDE2_EndJob(hTde, HI_FALSE, HI_FALSE, 10); + if (HI_SUCCESS != s32Ret) + { + HI_TDE2_CancelJob(hTde); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + s32Ret = HI_TDE2_WaitForDone(hTde); + if (HI_SUCCESS != s32Ret) + { + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + /* 3.get the display attribute of OSD attached to venc*/ + stMppChn.enModId = HI_ID_VENC; + stMppChn.s32DevId = 0; + stMppChn.s32ChnId = 0; + s32Ret = HI_MPI_RGN_GetDisplayAttr(Handle, &stMppChn, &stOsdChnAttr); + if (HI_SUCCESS != s32Ret) + { + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + stReverseRgnInfo.pstRegion = (RECT_S *)astOsdRevRect; + while (HI_FALSE == bExit) + { + /* 4.get the sum of luma of a region specified by user*/ + s32Ret = HI_MPI_VPSS_GetRegionLuma(pstOsdReverseInfo->VpssGrp, pstOsdReverseInfo->VpssChn, &(pstOsdReverseInfo->stLumaRgnInfo), au32LumaData, -1); + if (HI_SUCCESS != s32Ret) + { + printf("[Func]:%s [Line]:%d [Info]:HI_MPI_VPSS_GetRegionLuma VpssGrp=%d failed, s32Ret: 0x%x.\n", + __FUNCTION__, __LINE__, pstOsdReverseInfo->VpssGrp, s32Ret); + continue ; + } + + /* 5.decide which region to be reverse color according to the sum of the region*/ + for (i = 0, j = 0; i < pstOsdReverseInfo->stLumaRgnInfo.u32RegionNum; ++i) + { + pstOsdReverseInfo->u8PerPixelLumaThrd = rand() % 256; + + if (au32LumaData[i] > (pstOsdReverseInfo->u8PerPixelLumaThrd * + pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].u32Width * + pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].u32Height)) + { + /* 6.get the regions to be reverse color */ + stReverseRgnInfo.pstRegion[j].s32X = pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].s32X + - stOsdChnAttr.unChnAttr.stOverlayChn.stPoint.s32X; + stReverseRgnInfo.pstRegion[j].s32Y = pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].s32Y + - stOsdChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y; + stReverseRgnInfo.pstRegion[j].u32Width = pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].u32Width; + stReverseRgnInfo.pstRegion[j].u32Height = pstOsdReverseInfo->stLumaRgnInfo.pstRegion[i].u32Height; + ++j; + } + } + + stReverseRgnInfo.u32RegionNum = j; + + /* 7.the the canvas to be update */ + if (HI_SUCCESS != HI_MPI_RGN_GetCanvasInfo(Handle, &stCanvasInfo)) + { + printf("[Func]:%s [Line]:%d [Info]:HI_MPI_RGN_GetCanvasInfo failed\n", __FUNCTION__, __LINE__); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + if (HI_SUCCESS != SAMPLE_RGN_ConvOsdCavasToTdeSurface(&stRgnSurface, &stCanvasInfo)) + { + printf("[Func]:%s [Line]:%d [Info]:SAMPLE_RGN_ConvOsdCavasToTdeSurface failed\n", __FUNCTION__, __LINE__); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + /* 8.reverse color */ + if (HI_SUCCESS != SAMPLE_RGN_ReverseOsdColor(&stRgnOrignSurface, &stRgnSurface, &stReverseRgnInfo)) + { + printf("[Func]:%s [Line]:%d [Info]:SAMPLE_RGN_ReverseOsdColor failed\n", __FUNCTION__, __LINE__); + HI_MPI_RGN_UpdateCanvas(Handle); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + /* 9.update OSD */ + if (HI_SUCCESS != HI_MPI_RGN_UpdateCanvas(Handle)) + { + printf("[Func]:%s [Line]:%d [Info]:HI_MPI_RGN_UpdateCanvas failed\n", __FUNCTION__, __LINE__); + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return NULL; + } + + sleep(2); + } + + HI_MPI_SYS_MmzFree(stRgnOrignSurface.u32PhyAddr, pu32VirAddr); + return HI_NULL; + +} + + +/****************************************************************************************** + function : Vpss cover + process steps: + 0) create some cover regions + 1) attach them to vpss + 2) change Regions' Layer + 3) change Regions' position + 4) change Regions' alpha (front and backgroud) +******************************************************************************************/ + +HI_S32 SAMPLE_RGN_AddCoverToVpss(HI_VOID) +{ + HI_S32 s32Ret = HI_SUCCESS; + RGN_HANDLE Handle; + HI_U32 u32RgnNum; + MPP_CHN_S stSrcChn, stDesChn; + HI_S32 s32VpssGrpNum; + HI_U32 u32VpssChn = 0; + VO_DEV VoDev; + VO_LAYER VoLayer; + HI_U32 s32VoChnNum; + RGN_ATTR_INFO_S stRgnAttrInfo; + VO_PUB_ATTR_S stVoPubAttr; + VO_CSC_S stCSC; + + s32Ret = SAMPLE_RGN_SYS_Init(); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_SYS_Init failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 1: create region and attach to vpss group + *************************************************/ + Handle = 0; + u32RgnNum = 8; + s32Ret = SAMPLE_RGN_CreateCover(Handle, u32RgnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_CreateCover failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 2: start vi chn + *************************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(&g_stViChnConfig); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_StartVi failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + /************************************************* + step 3: start vpss group and chn + *************************************************/ + s32VpssGrpNum = 1; + if(VO_INTF_BT1120 == g_enVoIntfType) + { + u32VpssChn = VPSS_CHN0; + s32Ret = SAMPLE_RGN_StartVpssHD(s32VpssGrpNum, u32VpssChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVpssHD failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + else + { + u32VpssChn = VPSS_CHN0; + s32Ret = SAMPLE_RGN_StartVpss(s32VpssGrpNum, u32VpssChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + + /************************************************* + step 4: start vo dev and chn + *************************************************/ + VoDev = 0; + s32VoChnNum = 1; + + stVoPubAttr.enIntfType = g_enVoIntfType; + stVoPubAttr.u32BgColor = 0x0; + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + s32Ret = SAMPLE_RGN_StartVo(VoDev, s32VoChnNum, &stVoPubAttr); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVo failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 5: bind vi and vpss + *************************************************/ + stSrcChn.enModId = HI_ID_VIU; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = 0; + + stDesChn.enModId = HI_ID_VPSS; + stDesChn.s32DevId = 0; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 6: bind vpss and vo + *************************************************/ + VoLayer = SAMPLE_RGN_GetVoLayer(VoDev); + if(VoLayer < 0) + { + printf("SAMPLE_RGN_GetVoLayer failed! VoDev: %d.\n", VoDev); + return HI_FAILURE; + } + + stSrcChn.enModId = HI_ID_VPSS; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = u32VpssChn; + + stDesChn.enModId = HI_ID_VOU; + stDesChn.s32DevId = VoLayer; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 7: create a thread to change region's + layer, position, alpha and other display attribute + *************************************************/ + stRgnAttrInfo.Handle = Handle; + stRgnAttrInfo.u32RgnNum = u32RgnNum; + pthread_create(&g_stRgnThread, NULL, SAMPLE_RGN_VpssCoverDynamicDisplay, (HI_VOID*)&stRgnAttrInfo); + + printf("\n#############Sample start ok! Press Enter to switch!#############\n"); + + + /************************************************* + step 8: stop thread and release all the resource + *************************************************/ + getchar(); + bExit = HI_TRUE; + + if (g_stRgnThread) + { + pthread_join(g_stRgnThread, 0); + g_stRgnThread = 0; + } + + bExit = HI_FALSE; + + /************************************************* + step 9: unbind vpss and vo + *************************************************/ + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_UnBind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 10: unbind vi and vpss + *************************************************/ + stSrcChn.enModId = HI_ID_VIU; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = 0; + + stDesChn.enModId = HI_ID_VPSS; + stDesChn.s32DevId = 0; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_UnBind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 11: stop vo dev and chn + *************************************************/ + s32Ret = SAMPLE_RGN_StopVoChn(VoDev, s32VoChnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVoChn failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = SAMPLE_RGN_StopVoDev(VoDev); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVoDev failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 12: stop vpss group and chn + *************************************************/ + s32Ret = SAMPLE_RGN_StopVpss(s32VpssGrpNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 13: stop vi chn + *************************************************/ + s32Ret = SAMPLE_COMM_VI_StopVi(&g_stViChnConfig); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_StopVi failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 14: destroy region + *************************************************/ + s32Ret = SAMPLE_RGN_DestroyRegion(Handle, u32RgnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_DestroyRegion failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = SAMPLE_RGN_SYS_Exit(); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_SYS_Exit failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + return HI_SUCCESS; +} + +/****************************************************************************************** + function : Vpss coverex + process steps: + 0) create some coverex regions + 1) attach them to vpss + 2) change Regions' Layer + 3) change Regions' position + 4) change Regions' alpha (front and backgroud) +******************************************************************************************/ + +HI_S32 SAMPLE_RGN_AddCoverExToVpss(HI_VOID) +{ + HI_S32 s32Ret = HI_SUCCESS; + RGN_HANDLE Handle; + HI_U32 u32RgnNum; + MPP_CHN_S stSrcChn, stDesChn; + HI_S32 s32VpssGrpNum; + HI_U32 u32VpssChn = 0; + VO_DEV VoDev; + VO_LAYER VoLayer; + HI_U32 s32VoChnNum; + RGN_ATTR_INFO_S stRgnAttrInfo; + VO_PUB_ATTR_S stVoPubAttr; + VO_CSC_S stCSC; + + s32Ret = SAMPLE_RGN_SYS_Init(); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_SYS_Init failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 1: create region and attach to vpss group + *************************************************/ + Handle = 0; + u32RgnNum = 8; + s32Ret = SAMPLE_RGN_CreateCoverEx(Handle, u32RgnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_CreateCoverEx failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 2: start vi chn + *************************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(&g_stViChnConfig); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_StartVi failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 3: start vpss group and chn + *************************************************/ + s32VpssGrpNum = 1; + if(VO_INTF_BT1120 == g_enVoIntfType) + { + u32VpssChn = VPSS_CHN0; + s32Ret = SAMPLE_RGN_StartVpssHD(s32VpssGrpNum, u32VpssChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVpssHD failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + else + { + u32VpssChn = VPSS_CHN0; + s32Ret = SAMPLE_RGN_StartVpss(s32VpssGrpNum, u32VpssChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + + /************************************************* + step 4: start vo dev and chn + *************************************************/ + VoDev = 0; + s32VoChnNum = 1; + + stVoPubAttr.enIntfType = g_enVoIntfType; + stVoPubAttr.u32BgColor = 0x0; + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + s32Ret = SAMPLE_RGN_StartVo(VoDev, s32VoChnNum, &stVoPubAttr); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVo failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 5: bind vi and vpss + *************************************************/ + stSrcChn.enModId = HI_ID_VIU; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = 0; + + stDesChn.enModId = HI_ID_VPSS; + stDesChn.s32DevId = 0; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 6: bind vpss and vo + *************************************************/ + VoLayer = SAMPLE_RGN_GetVoLayer(VoDev); + if(VoLayer < 0) + { + printf("SAMPLE_RGN_GetVoLayer failed! VoDev: %d.\n", VoDev); + return HI_FAILURE; + } + + stSrcChn.enModId = HI_ID_VPSS; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = u32VpssChn; + + stDesChn.enModId = HI_ID_VOU; + stDesChn.s32DevId = VoLayer; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 7: create a thread to change region's + layer, position, alpha and other display attribute + *************************************************/ + stRgnAttrInfo.Handle = Handle; + stRgnAttrInfo.u32RgnNum = u32RgnNum; + pthread_create(&g_stRgnThread, NULL, SAMPLE_RGN_VpssCoverExDynamicDisplay, (HI_VOID*)&stRgnAttrInfo); + + printf("\n#############Sample start ok! Press Enter to switch!#############\n"); + + + /************************************************* + step 8: stop thread and release all the resource + *************************************************/ + getchar(); + bExit = HI_TRUE; + + if (g_stRgnThread) + { + pthread_join(g_stRgnThread, 0); + g_stRgnThread = 0; + } + + bExit = HI_FALSE; + + /************************************************* + step 9: unbind vpss and vo + *************************************************/ + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_UnBind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 10: unbind vi and vpss + *************************************************/ + stSrcChn.enModId = HI_ID_VIU; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = 0; + + stDesChn.enModId = HI_ID_VPSS; + stDesChn.s32DevId = 0; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_UnBind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 11: stop vo dev and chn + *************************************************/ + s32Ret = SAMPLE_RGN_StopVoChn(VoDev, s32VoChnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVoChn failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = SAMPLE_RGN_StopVoDev(VoDev); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVoDev failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 12: stop vpss group and chn + *************************************************/ + s32Ret = SAMPLE_RGN_StopVpss(s32VpssGrpNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 13: stop vi chn + *************************************************/ + s32Ret = SAMPLE_COMM_VI_StopVi(&g_stViChnConfig); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_StopVi failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 14: destroy region + *************************************************/ + s32Ret = SAMPLE_RGN_DestroyRegion(Handle, u32RgnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_DestroyRegion failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = SAMPLE_RGN_SYS_Exit(); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_SYS_Exit failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + return HI_SUCCESS; +} + +/****************************************************************************************** + function : Vpss Osd + process steps: + 0) create some osd regions + 1) attach them to vpss + 2) start a thread to handle color reverse + 3) change Regions' Layer + 4) change Regions' position + 5) change Regions' alpha (front and backgroud) +******************************************************************************************/ + +HI_S32 SAMPLE_RGN_AddOsdToVpss(HI_VOID) +{ + RGN_HANDLE Handle; + HI_S32 u32RgnNum; + HI_S32 s32Ret = HI_SUCCESS; + RGN_ATTR_S stRgnAttrSet; + RGN_CANVAS_INFO_S stCanvasInfo; + RGN_CHN_ATTR_S stChnAttr; + MPP_CHN_S stChn; + HI_S32 i; + BITMAP_S stBitmap; + HI_S32 s32VpssGrpNum; + HI_S32 u32VpssChn; + VO_DEV VoDev; + VO_LAYER VoLayer; + HI_U32 s32VoChnNum; + MPP_CHN_S stSrcChn, stDesChn; + RGN_OSD_REVERSE_INFO_S stOsdReverseInfo; + RGN_ATTR_INFO_S stRgnAttrInfo; + RECT_S astOsdLumaRect[3]; + HI_U32 u32OsdRectCnt; + SIZE_S stSize; + VO_PUB_ATTR_S stVoPubAttr; + VO_CSC_S stCSC; + + s32Ret = SAMPLE_RGN_SYS_Init(); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_SYS_Init failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 1: create region and attach to vpss group + *************************************************/ + Handle = 0; + u32RgnNum = 4; + s32Ret = SAMPLE_RGN_CreateOverlayExForVpss(Handle, u32RgnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_CreateOverlayExForVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 2: start vi chn + *************************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(&g_stViChnConfig); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_StartVi failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 3: start vpss group and chn + *************************************************/ + s32VpssGrpNum = 1; + if(VO_INTF_BT1120 == g_enVoIntfType) + { + u32VpssChn = VPSS_CHN0; + s32Ret = SAMPLE_RGN_StartVpssHD(s32VpssGrpNum, u32VpssChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVpssHD failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + else + { + u32VpssChn = VPSS_CHN0; + s32Ret = SAMPLE_RGN_StartVpss(s32VpssGrpNum, u32VpssChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + + /************************************************* + step 4: start vo dev and chn + *************************************************/ + VoDev = 0; + s32VoChnNum = 1; + + stVoPubAttr.enIntfType = g_enVoIntfType; + stVoPubAttr.u32BgColor = 0x0; + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + s32Ret = SAMPLE_RGN_StartVo(VoDev, s32VoChnNum, &stVoPubAttr); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVo failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 5: bind vi and vpss + *************************************************/ + stSrcChn.enModId = HI_ID_VIU; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = 0; + + stDesChn.enModId = HI_ID_VPSS; + stDesChn.s32DevId = 0; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 6: bind vpss and vo + *************************************************/ + VoLayer = SAMPLE_RGN_GetVoLayer(VoDev); + if(VoLayer < 0) + { + printf("SAMPLE_RGN_GetVoLayer failed! VoDev: %d.\n", VoDev); + return HI_FAILURE; + } + + stSrcChn.enModId = HI_ID_VPSS; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = u32VpssChn; + + stDesChn.enModId = HI_ID_VOU; + stDesChn.s32DevId = VoLayer; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 7: load bitmap to region + *************************************************/ + s32Ret = HI_MPI_RGN_GetAttr(Handle, &stRgnAttrSet); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_RGN_GetCanvasInfo(Handle, &stCanvasInfo); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetCanvasInfo failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + stBitmap.pData = (HI_VOID *)stCanvasInfo.u32VirtAddr; + stSize.u32Width = stCanvasInfo.stSize.u32Width; + stSize.u32Height = stCanvasInfo.stSize.u32Height; + s32Ret = SAMPLE_RGN_UpdateCanvas("mm.bmp", &stBitmap, HI_FALSE, 0, &stSize, stCanvasInfo.u32Stride, + stRgnAttrSet.unAttr.stOverlayEx.enPixelFmt); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_UpdateCanvas failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_RGN_UpdateCanvas(Handle); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_UpdateCanvas failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 8: create a thread to change region's + layer, position, alpha and other display attribute + *************************************************/ + stRgnAttrInfo.Handle = Handle; + stRgnAttrInfo.u32RgnNum = u32RgnNum; + pthread_create(&g_stRgnThread, NULL, SAMPLE_RGN_VpssOSdDynamicDisplay, (HI_VOID*)&stRgnAttrInfo); + sleep(3); + /************************************************* + step 10: start a thread to handle osd color reverse + *************************************************/ + u32OsdRectCnt = 3; + stOsdReverseInfo.Handle = Handle; + stOsdReverseInfo.VpssGrp = 0; + stOsdReverseInfo.VpssChn = u32VpssChn; + stOsdReverseInfo.u8PerPixelLumaThrd = 128; + stOsdReverseInfo.stLumaRgnInfo.u32RegionNum = u32OsdRectCnt; + stOsdReverseInfo.stLumaRgnInfo.pstRegion = astOsdLumaRect; + + stSize.u32Width = stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width; + stSize.u32Height = stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height; + + stChn.enModId = HI_ID_VPSS; + stChn.s32DevId = 0; + stChn.s32ChnId = u32VpssChn; + s32Ret = HI_MPI_RGN_GetDisplayAttr(Handle, &stChn, &stChnAttr); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetDisplayAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + for (i=0; i < u32OsdRectCnt; i++) + { + astOsdLumaRect[i].s32X = ((stSize.u32Width/ u32OsdRectCnt) * i) + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X; + astOsdLumaRect[i].s32Y = stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y; + astOsdLumaRect[i].u32Width = (stSize.u32Width / u32OsdRectCnt); + astOsdLumaRect[i].u32Height = stSize.u32Height; + } + pthread_create(&g_stVpssOsdReverseThread, NULL, SAMPLE_RGN_VpssOsdReverse, (HI_VOID*)&stOsdReverseInfo); + + printf("\n#############Sample start ok! Press Enter to switch!#############\n"); + + + + /************************************************* + step 11: stop thread and release all the resource + *************************************************/ + getchar(); + bExit = HI_TRUE; + + if (g_stVpssOsdReverseThread) + { + pthread_join(g_stVpssOsdReverseThread, 0); + g_stVpssOsdReverseThread = 0; + } + + if (g_stRgnThread) + { + pthread_join(g_stRgnThread, 0); + g_stRgnThread = -1; + } + + bExit = HI_FALSE; + + /************************************************* + step 12: unbind vpss and vo + *************************************************/ + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_UnBind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 13: unbind vdec and vpss + *************************************************/ + stSrcChn.enModId = HI_ID_VIU; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = 0; + + stDesChn.enModId = HI_ID_VPSS; + stDesChn.s32DevId = 0; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_UnBind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 14: stop vo dev and chn + *************************************************/ + s32Ret = SAMPLE_RGN_StopVoChn(VoDev, s32VoChnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVoChn failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = SAMPLE_RGN_StopVoDev(VoDev); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVoDev failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 15: stop vpss group and chn + *************************************************/ + s32Ret = SAMPLE_RGN_StopVpss(s32VpssGrpNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 16: stop vi chn + *************************************************/ + s32Ret = SAMPLE_COMM_VI_StopVi(&g_stViChnConfig); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_StopVi failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 17: destroy region + *************************************************/ + s32Ret = SAMPLE_RGN_DestroyRegion(Handle, u32RgnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_DestroyRegion failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = SAMPLE_RGN_SYS_Exit(); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_SYS_Exit failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + return HI_SUCCESS; +} + +/****************************************************************************************** + function : Venc And Vpss OSD + process steps: + 1) create some cover/osd regions + 2) display cover/osd regions ( One Region -- Multi-VencGroup ) + 3) change Regions' Layer + 4) change Regions' position + 5) change Regions' color + 6) change Regions' alpha (front and backgroud) + 7) load bmp form bmp-file to Region-0 + 8) change BmpRegion-0 + 9) enable color reverse for Region-0 +******************************************************************************************/ + +HI_S32 SAMPLE_RGN_AddOsdToVencAndVpss(HI_VOID) +{ + HI_S32 s32Ret = HI_SUCCESS; + RGN_HANDLE Handle; + RGN_HANDLE VencOsdHandle; + RGN_HANDLE VpssOsdHandle; + HI_S32 u32VencRgnNum; + HI_S32 u32VpssRgnNum; + RGN_ATTR_S stRgnAttrSet; + RGN_CANVAS_INFO_S stCanvasInfo; + BITMAP_S stBitmap; + MPP_CHN_S stSrcChn, stDesChn; + RGN_CHN_ATTR_S stChnAttr; + MPP_CHN_S stChn; + HI_S32 i; + + VO_DEV VoDev; + VO_LAYER VoLayer; + HI_U32 s32VoChnNum; + + VENC_CHN VencChn; + HI_S32 s32VpssGrpNum; + HI_S32 u32VpssChn; + VENC_PTHREAD_INFO_S stVencGetPram; + RGN_OSD_REVERSE_INFO_S stVpssOsdReverseInfo; + RGN_OSD_REVERSE_INFO_S stVencOsdReverseInfo; + RGN_ATTR_INFO_S stRgnAttrInfo; + RECT_S astVpssOsdLumaRect[3]; + RECT_S astVencOsdLumaRect[3]; + HI_U32 u32VpssOsdRectCnt; + HI_U32 u32VencOsdRectCnt; + SIZE_S stSize; + FILE * pastream = NULL; + VO_PUB_ATTR_S stVoPubAttr; + VO_CSC_S stCSC; + + s32Ret = SAMPLE_RGN_SYS_Init(); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_SYS_Init failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 1: create region and attach to venc + *************************************************/ + VencOsdHandle = 0; + u32VencRgnNum = 4; + s32Ret = SAMPLE_RGN_CreateOverlayForVenc(VencOsdHandle, u32VencRgnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_CreateOverlayForVenc failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 2: create region and attach to vpss group + *************************************************/ + VpssOsdHandle = u32VencRgnNum; + u32VpssRgnNum = 4; + s32Ret = SAMPLE_RGN_CreateOverlayExForVpss(VpssOsdHandle, u32VpssRgnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_CreateOverlayExForVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 3: start vi chn + *************************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(&g_stViChnConfig); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_StartVi failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 4: start vpss group and chn + *************************************************/ + s32VpssGrpNum = 1; + if(VO_INTF_BT1120 == g_enVoIntfType) + { + u32VpssChn = VPSS_CHN0; + s32Ret = SAMPLE_RGN_StartVpssHD(s32VpssGrpNum, u32VpssChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVpssHD failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + else + { + u32VpssChn = VPSS_CHN0; + s32Ret = SAMPLE_RGN_StartVpss(s32VpssGrpNum, u32VpssChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + + /************************************************* + step 5: start vo dev and chn + *************************************************/ + VoDev = 0; + s32VoChnNum = 1; + + stVoPubAttr.enIntfType = g_enVoIntfType; + stVoPubAttr.u32BgColor = 0x0; + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + s32Ret = SAMPLE_RGN_StartVo(VoDev, s32VoChnNum, &stVoPubAttr); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVo failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 6: bind vi and vpss + *************************************************/ + stSrcChn.enModId = HI_ID_VIU; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = 0; + + stDesChn.enModId = HI_ID_VPSS; + stDesChn.s32DevId = 0; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 7: bind vpss and vo + *************************************************/ + VoLayer = SAMPLE_RGN_GetVoLayer(VoDev); + if(VoLayer < 0) + { + printf("SAMPLE_RGN_GetVoLayer failed! VoDev: %d.\n", VoDev); + return HI_FAILURE; + } + + stSrcChn.enModId = HI_ID_VPSS; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = u32VpssChn; + + stDesChn.enModId = HI_ID_VOU; + stDesChn.s32DevId = VoLayer; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + /************************************************* + step 8: start venc chn + *************************************************/ + VencChn = 0; + s32Ret = SAMPLE_RGN_StartVenc(VencChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StartVenc failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 9: bind vpss and venc + *************************************************/ + stSrcChn.enModId = HI_ID_VPSS; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = VPSS_CHN1; + + stDesChn.enModId = HI_ID_VENC; + stDesChn.s32DevId = 0; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 10: load bitmap to region + *************************************************/ + for (Handle = VencOsdHandle; Handle <= u32VencRgnNum; Handle += u32VencRgnNum) + { + s32Ret = HI_MPI_RGN_GetAttr(Handle, &stRgnAttrSet); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_RGN_GetCanvasInfo(Handle, &stCanvasInfo); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetCanvasInfo failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + stBitmap.pData = (HI_VOID *)stCanvasInfo.u32VirtAddr; + stSize.u32Width = stCanvasInfo.stSize.u32Width; + stSize.u32Height = stCanvasInfo.stSize.u32Height; + s32Ret = SAMPLE_RGN_UpdateCanvas("mm.bmp", &stBitmap, HI_FALSE, 0, &stSize, stCanvasInfo.u32Stride, + stRgnAttrSet.unAttr.stOverlayEx.enPixelFmt); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_UpdateCanvas failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = HI_MPI_RGN_UpdateCanvas(Handle); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_UpdateCanvas failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + } + + /************************************************* + step 11: create a thread to change region's + layer, position, alpha and other display attribute + *************************************************/ + pthread_create(&g_stVencRgnThread, NULL, SAMPLE_RGN_VencOSdDynamicDisplay, NULL); + stRgnAttrInfo.Handle = VpssOsdHandle; + stRgnAttrInfo.u32RgnNum = u32VpssRgnNum; + pthread_create(&g_stVpssRgnThread, NULL, SAMPLE_RGN_VpssOSdDynamicDisplay, (HI_VOID*)&stRgnAttrInfo); + sleep(3); + /************************************************* + step 12: start a thread to handle vpss osd color + reverse + *************************************************/ + u32VpssOsdRectCnt = 3; + stVpssOsdReverseInfo.Handle = VpssOsdHandle; + stVpssOsdReverseInfo.VpssGrp = 0; + stVpssOsdReverseInfo.VpssChn = VPSS_CHN0; + stVpssOsdReverseInfo.u8PerPixelLumaThrd = 128; + stVpssOsdReverseInfo.stLumaRgnInfo.u32RegionNum = u32VpssOsdRectCnt; + stVpssOsdReverseInfo.stLumaRgnInfo.pstRegion = astVpssOsdLumaRect; + + s32Ret = HI_MPI_RGN_GetAttr(VpssOsdHandle, &stRgnAttrSet); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + stSize.u32Width = stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Width; + stSize.u32Height = stRgnAttrSet.unAttr.stOverlayEx.stSize.u32Height; + + stChn.enModId = HI_ID_VPSS; + stChn.s32DevId = 0; + stChn.s32ChnId = VPSS_CHN0; + s32Ret = HI_MPI_RGN_GetDisplayAttr(VpssOsdHandle, &stChn, &stChnAttr); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetDisplayAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + for (i=0; i < u32VpssOsdRectCnt; i++) + { + astVpssOsdLumaRect[i].s32X = ((stSize.u32Width/ u32VpssOsdRectCnt) * i) + stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X; + astVpssOsdLumaRect[i].s32Y = stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y; + astVpssOsdLumaRect[i].u32Width = (stSize.u32Width / u32VpssOsdRectCnt); + astVpssOsdLumaRect[i].u32Height = stSize.u32Height; + } + pthread_create(&g_stVpssOsdReverseThread, NULL, SAMPLE_RGN_VpssOsdReverse, (HI_VOID*)&stVpssOsdReverseInfo); + + /************************************************* + step 13: start a thread to handle venc osd color + reverse + *************************************************/ + u32VencOsdRectCnt = 3; + stVencOsdReverseInfo.Handle = VencOsdHandle; + stVencOsdReverseInfo.VpssGrp = 0; + stVencOsdReverseInfo.VpssChn = u32VpssChn; + stVencOsdReverseInfo.u8PerPixelLumaThrd = 128; + stVencOsdReverseInfo.stLumaRgnInfo.u32RegionNum = u32VencOsdRectCnt; + stVencOsdReverseInfo.stLumaRgnInfo.pstRegion = astVencOsdLumaRect; + + s32Ret = HI_MPI_RGN_GetAttr(VencOsdHandle, &stRgnAttrSet); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + stSize.u32Width = stRgnAttrSet.unAttr.stOverlay.stSize.u32Width; + stSize.u32Height = stRgnAttrSet.unAttr.stOverlay.stSize.u32Height; + + stChn.enModId = HI_ID_VENC; + stChn.s32DevId = 0; + stChn.s32ChnId = 0; + s32Ret = HI_MPI_RGN_GetDisplayAttr(VencOsdHandle, &stChn, &stChnAttr); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_RGN_GetDisplayAttr failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + for (i=0; i < u32VencOsdRectCnt; i++) + { + astVencOsdLumaRect[i].s32X = ((stSize.u32Width/ u32VencOsdRectCnt) * i) + stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X; + astVencOsdLumaRect[i].s32Y = stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y; + astVencOsdLumaRect[i].u32Width = (stSize.u32Width / u32VencOsdRectCnt); + astVencOsdLumaRect[i].u32Height = stSize.u32Height; + } + pthread_create(&g_stVencOsdReverseThread, NULL, SAMPLE_RGN_VencOsdReverse, (HI_VOID*)&stVencOsdReverseInfo); + + /************************************************* + step 14: create a thread for venc to save stream + to a file + *************************************************/ + char pfilename[30]; + snprintf(pfilename, sizeof(pfilename), "venc_encode_stream.h264"); + pastream = fopen(pfilename, "wb"); + HI_ASSERT( NULL != pastream); + + stVencGetPram.pstream = pastream; + stVencGetPram.VeChnId = VencChn; + stVencGetPram.s32FrmCnt = 0; + pthread_create(&g_stVencThread, 0, SAMPLE_RGN_VencGetStream, (HI_VOID *)&stVencGetPram); + + printf("\n#############Sample start ok! Press Enter to switch!#############\n"); + + + /************************************************* + step 15: stop thread and release all the resource + *************************************************/ + getchar(); + bExit = HI_TRUE; + if (g_stVencThread) + { + pthread_join(g_stVencThread, 0); + g_stVencThread = 0; + } + if (g_stVpssRgnThread) + { + pthread_join(g_stVpssRgnThread, 0); + g_stVpssRgnThread = 0; + } + if (g_stVencRgnThread) + { + pthread_join(g_stVencRgnThread, 0); + g_stVencRgnThread = 0; + } + if (g_stVpssOsdReverseThread) + { + pthread_join(g_stVpssOsdReverseThread, 0); + g_stVpssOsdReverseThread = 0; + } + if (g_stVencOsdReverseThread) + { + pthread_join(g_stVencOsdReverseThread, 0); + g_stVencOsdReverseThread = 0; + } + + bExit = HI_FALSE; + + /************************************************* + step 16: unbind vpss and venc + *************************************************/ + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_UnBind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 17: unbind vpss and vo + *************************************************/ + + stSrcChn.enModId = HI_ID_VPSS; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = VPSS_CHN2; + + stDesChn.enModId = HI_ID_VOU; + stDesChn.s32DevId = VoLayer; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_UnBind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 18: unbind vi and vpss + *************************************************/ + stSrcChn.enModId = HI_ID_VIU; + stSrcChn.s32DevId = 0; + stSrcChn.s32ChnId = 0; + + stDesChn.enModId = HI_ID_VPSS; + stDesChn.s32DevId = 0; + stDesChn.s32ChnId = 0; + + s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDesChn); + if(HI_SUCCESS != s32Ret) + { + printf("HI_MPI_SYS_Bind failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 19: stop venc chn + *************************************************/ + s32Ret = SAMPLE_RGN_StopVenc(VencChn); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVenc failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 20: stop vo dev and chn + *************************************************/ + s32Ret = SAMPLE_RGN_StopVoChn(VoDev, s32VoChnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVoChn failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = SAMPLE_RGN_StopVoDev(VoDev); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVoDev failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 21: stop vpss group and chn + *************************************************/ + s32Ret = SAMPLE_RGN_StopVpss(s32VpssGrpNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_StopVpss failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 22: stop vi chn + *************************************************/ + s32Ret = SAMPLE_COMM_VI_StopVi(&g_stViChnConfig); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_COMM_VI_StopVi failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + /************************************************* + step 23: destroy region + *************************************************/ + s32Ret = SAMPLE_RGN_DestroyRegion(VencOsdHandle, u32VencRgnNum + u32VpssRgnNum); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_DestroyRegion failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + s32Ret = SAMPLE_RGN_SYS_Exit(); + if(HI_SUCCESS != s32Ret) + { + printf("SAMPLE_RGN_SYS_Exit failed! s32Ret: 0x%x.\n", s32Ret); + return s32Ret; + } + + return s32Ret; + +} + +/****************************************************************************** +* function : main() +* Description : region +******************************************************************************/ +int main(int argc, char *argv[]) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_CHAR ch; + + bExit = HI_FALSE; + + if ( (argc < 2) || (1 != strlen(argv[1]))) + { + SAMPLE_RGN_Usage1(argv[0]); + return HI_FAILURE; + } + + signal(SIGINT, SAMPLE_RGN_HandleSig); + signal(SIGTERM, SAMPLE_RGN_HandleSig); + if((argc > 1) && *argv[1] == '1') /* '0': VO_INTF_CVBS, else: BT1120 */ + { + g_enVoIntfType = VO_INTF_BT656; + } + + g_stViChnConfig.enViMode = SENSOR_TYPE; + + switch(SENSOR_TYPE) + { + case SONY_IMX122_DC_1080P_30FPS: + case APTINA_AR0230_HISPI_1080P_30FPS: + g_enPicSize = PIC_HD1080; + break; + case APTINA_9M034_DC_720P_30FPS: + case APTINA_AR0130_DC_720P_30FPS: + case SONY_IMX122_DC_720P_30FPS: + g_enPicSize = PIC_HD720; + break; + + default: + break; + } + + while (1) + { + SAMPLE_RGN_Usage2(); + ch = (char)getchar(); + getchar(); + switch (ch) + { + case '0': /* VI->VPSS(COVER)->VO PAL */ + { + s32Ret = SAMPLE_RGN_AddCoverToVpss(); + break; + } + case '1': /* VI->VPSS(COVEREX)->VO PAL */ + { + s32Ret = SAMPLE_RGN_AddCoverExToVpss(); + break; + } + case '2': /* VI->VPSS(OVERLAYEX)->VO PAL */ + { + s32Ret = SAMPLE_RGN_AddOsdToVpss(); + break; + } + case '3': /* VI->VPSS(OVERLAYEX)->VO/VENC(OVERLAY)->file */ + { + s32Ret = SAMPLE_RGN_AddOsdToVencAndVpss(); + break; + } + case 'q': + case 'Q': + { + bExit = HI_TRUE; + break; + } + default : + { + printf("input invaild! please try again.\n"); + break; + } + } + + if (bExit) + { + break; + } + } + + return s32Ret; + +} + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ diff --git a/device/mpp/sample/scene_auto/Makefile b/device/mpp/sample/scene_auto/Makefile new file mode 100644 index 0000000..a1d4528 --- /dev/null +++ b/device/mpp/sample/scene_auto/Makefile @@ -0,0 +1,33 @@ +# Hisilicon Hi3516A sample Makefile + +include ../Makefile.param + +# target source +SRC := $(wildcard *.c) +OBJ := $(SRC:%.c=%.o) + +SCENE_DIR := src/common src/adapt/$(HIARCH) +SCENE_SRC := $(shell find $(SCENE_DIR) -name '*.c') +SCENE_OBJ := $(SCENE_SRC:%.c=%.o) + +TARGET := $(OBJ:%.o=%) +.PHONY : clean all + +all: $(TARGET) + +MPI_LIBS := $(REL_LIB)/libmpi.a +MPI_LIBS += $(REL_LIB)/libive.a + +MPP_PATH := ../../../ +CFLAGS += -Isrc/include -I$(REL_INC) +CFLAGS += -I$(MPP_PATH)/code/include/ + +$(TARGET): %:%.o $(SCENE_OBJ) + $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(SENSOR_LIBS) $(MPI_LIBS) $(AUDIO_LIBA) + +clean: + @rm -f $(TARGET) + @rm -f $(OBJ) + @rm -f $(COMM_OBJ) + @rm -f $(SCENE_OBJ) + diff --git a/device/mpp/sample/scene_auto/ini/DV/sceneauto_34220.ini b/device/mpp/sample/scene_auto/ini/DV/sceneauto_34220.ini new file mode 100644 index 0000000..6c360e3 --- /dev/null +++ b/device/mpp/sample/scene_auto/ini/DV/sceneauto_34220.ini @@ -0,0 +1,905 @@ +[common] +IspDev = 0 +ViDev = 0 +ViChn = 0 +VpssGrp = 0 +VpssChn = 0 +VencGrp = 0 +VencChn = 0 + +HLC_AutoEnable = 0; +HLC_thr_off = 140000 ;ǿⳡرֵ δ +HLC_thr_on = 150000 ;ǿⳡֵ +HLC_tolerance = 3000 ; +HLC_expthr = 6000 +HLC_count = 5 + +ave_lum_thresh = 30 +delta_dis_expthresh = 20 +dci_strength_lut = 32,33,33,34,34,35,35,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,48,48,49,49,50,50,50,49,49,49,49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32 + +exposure_thr_indoor = 10000 ;ȥ +exposure_thr_outdoor = 100 + +fpn_exp_thresh = 2000000000 ;fpnֵ34220sensorҪ + +u32DRCStrengthThresh = 48 + +[AE] +aeBitrateCount = 3 ;ʵȼ +aeBitrateThresh = 2048|8120|16318| ;ʵȼֵ + +;speed,tolerance,BlackDelayFrame,WhiteDelayFrameʵȼ +u8Speed_0 = 64 +u8Tolerance_0 = 3 +u16BlackDelayFrame_0 = 25 +u16WhiteDelayFrame_0 = 15 +u32SysGainMax_0 = 8192000 + +u8Speed_1 = 64 +u8Tolerance_1 = 3 +u16BlackDelayFrame_1 = 15 +u16WhiteDelayFrame_1 = 10 +u32SysGainMax_1 = 8192000 + +u8Speed_2 = 48 +u8Tolerance_2 = 2 +u16BlackDelayFrame_2 = 0 +u16WhiteDelayFrame_2 = 0 +u32SysGainMax_2 = 8192 + +aeExpCount = 5 ;عȼ +aeExpDtoLThresh = 6000|30000|240000|800000|8000000| ;عȼֵ +aeExpLtoDThresh = 8000|40000|300000|1000000|10000000| ;عȼֵ + +;CompesationHistOffsetعȼ +aeCompesation = 68|62|62|54|54| +aeHistOffset = 12|12|20|20|20| + +[nrprofile] +nplut_default_1 = 0,0,0,0,0,0,0,2,15,20,24,27,30,32,33,35,36,37,38,39,40,41,42,42,43,44,44,45,45,46,46,47,47,48,48,49,49,49,50,50,50,51,51,51,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,56,57,57,57,57,57,58,58,58,58,58,59,59,59,59,59,59,59,60,60,60,60,60,60,61,61,61,61,61,61,61,62,62,62,62,62,62,62,62,63,63,63,63,63,63,63,63,63,64,64,64,64,64,64,64,64,64,65,65,65,65,65,65,65,65 +nplut_default_2 = 0,2,15,20,24,27,30,32,33,35,36,37,38,39,40,41,42,42,43,44,44,45,45,46,46,47,47,48,48,49,49,49,50,50,50,51,51,51,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,56,57,57,57,57,57,58,58,58,58,58,59,59,59,59,59,59,59,60,60,60,60,60,60,61,61,61,61,61,61,61,62,62,62,62,62,62,62,62,63,63,63,63,63,63,63,63,63,64,64,64,64,64,64,64,64,64,65,65,65,65,65,65,65,65,65,65,65,65,65,65 + +nplut_1 = 0,0,0,0,0,0,0,2,15,20,24,27,30,32,33,35,36,37,38,39,40,41,42,42,43,44,44,45,45,46,46,47,47,48,48,49,49,49,50,50,50,51,51,51,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,56,57,57,57,57,57,58,58,58,58,58,59,59,59,59,59,59,59,60,60,60,60,60,60,61,61,61,61,61,61,61,62,62,62,62,62,62,62,62,63,63,63,63,63,63,63,63,63,64,64,64,64,64,64,64,64,64,65,65,65,65,65,65,65,65 +nplut_2 = 0,2,15,20,24,27,30,32,33,35,36,37,38,39,40,41,42,42,43,44,44,45,45,46,46,47,47,48,48,49,49,49,50,50,50,51,51,51,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,56,57,57,57,57,57,58,58,58,58,58,59,59,59,59,59,59,59,60,60,60,60,60,60,61,61,61,61,61,61,61,62,62,62,62,62,62,62,62,63,63,63,63,63,63,63,63,63,64,64,64,64,64,64,64,64,64,65,65,65,65,65,65,65,65,65,65,65,65,65,65 + +explow = 5000 +exphigh = 16000 + +[demosaic] +BitrateCount = 2 ;ʵȼ +BitrateThresh = 2048|4096| ;ʵȼֵ +ExpCount = 8 ;عȼ +ExpThresh = 800|1200|1600|2400|3200|12000|32000|64000| ;عȼֵ + +UuSlpoe_0 = 128|128|136|140|148|176|152|152| +AaSlope_0 = 162|168|174|182|188|200|162|162| +VaSlope_0 = 160|164|168|172|174|185|160|160| +VhSlope_0 = 164|170|182|192|202|220|164|164| + +UuSlpoe_1 = 110|110|110|110|110|110|110|110| +AaSlope_1 = 170|175|182|190|195|200|170|170| +VaSlope_1 = 168|172|176|180|182|185|168|168| +VhSlope_1 = 172|178|190|200|210|220|172|172| + +[sharpen] +sharpenBitrateCount = 3 +sharpenBitrateThresh = 1024|2048|4096| + +SharpenD_0 = 64|62|60|56|100|140|170|200|220|240|200|160|16|16|16|16| ;Ӧ16ȼISOsharpenֵ +SharpenRGB_0 = 80|80|76|66|56|48|40|24|20|20|16|16|16|16|16|16| +SharpenUd_0 = 80|80|72|64|56|48|40|24|16|16|16|16|16|16|16|16| ;Ӧһʵȼ + +SharpenD_1 = 64|62|60|56|100|140|170|200|220|240|200|160|16|16|16|16| ;Ӧڶʵȼ +SharpenRGB_1 = 88|88|84|74|64|56|48|32|24|24|16|16|16|16|16|16| +SharpenUd_1 = 88|88|80|72|64|56|48|32|24|24|16|16|16|16|16|16| + +SharpenD_2 = 64|62|60|56|100|140|170|200|220|240|200|160|16|16|16|16| ;Ӧʵȼ +SharpenRGB_2 = 80|80|76|66|56|48|40|40|32|32|16|16|16|16|16|16| +SharpenUd_2 = 64|64|64|64|64|64|56|40|32|32|16|16|16|16|16|16| + +[dp] +ExpCount = 12 ;عȼ +ExpThresh = 20000|40000|160000|320000|640000|1280000|2560000|4800000|9600000|18000000|34000000|72000000| ;عλ*ʱ(΢) + +u16Slop = 0|0|0|32|64|128|256|384|512|512|512|512| + +[gamma] +ExpCount = 0 +ExpThresh = 3200|6400|300000| + +gamma.0_0 = 0,180,320,426,516,590,660,730,786,844,896,946,994,1040,1090,1130,1170,1210,1248,1296,1336,1372,1416,1452,1486,1516,1546,1580,1616,1652,1678,1714,1742,1776,1798,1830,1862,1886,1912,1940,1968,1992,2010,2038,2062,2090,2114,2134,2158,2178,2202,2222,2246,2266,2282,2300,2324,2344,2360,2372,2390,2406,2422,2438,2458,2478,2494,2510,2526,2546,2562,2582,2598,2614,2630,2648,2660,2670,2682,2698,2710,2724,2736,2752,2764,2780,2792,2808,2820,2836, +gamma.1_0 = 2848,2864,2876,2888,2896,2908,2920,2928,2940,2948,2960,2972,2984,2992,3004,3014,3028,3036,3048,3056,3068,3080,3088,3100,3110,3120,3128,3140,3148,3160,3168,3174,3182,3190,3202,3210,3218,3228,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3530,3538,3546,3554,3558,3564,3570,3574,3582,3590,3598,3604,3610,3618,3628,3634,3640,3644,3652, +gamma.2_0 = 3656,3664,3670,3678,3688,3696,3700,3708,3712,3716,3722,3730,3736,3740,3748,3752,3756,3760,3766,3774,3778,3786,3790,3800,3808,3812,3816,3824,3830,3832,3842,3846,3850,3854,3858,3862,3864,3870,3874,3878,3882,3888,3894,3900,3908,3912,3918,3924,3928,3934,3940,3946,3952,3958,3966,3974,3978,3982,3986,3990,3994,4002,4006,4010,4018,4022,4032,4038,4046,4050,4056,4062,4072,4076,4084,4090,4095 + +gamma.0_1 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_1 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +gamma.0_2 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_2 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_2 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +[ccm] +AcmEnable = 0 +u16HighColorTempAcmOn = 4900 +u16MidColorTempAcmOn = 3850 +u16LowColorTempAcmOn = 2650 +au16HighCCMAcmOn = 396|32910|2|32857|443|32866|22|33081|547| +au16MidCCMAcmOn = 411|32941|18|32868|410|32823|42|33121|566| +au16LowCCMAcmOn = 438|32855|32863|32877|461|32864|0|33061|549| + +u16HighColorTempAcmOff = 4900 +u16MidColorTempAcmOff = 3850 +u16LowColorTempAcmOff = 2650 +au16HighCCMAcmOff = 396|32910|2|32857|443|32866|22|33081|547| +au16MidCCMAcmOff = 411|32941|18|32868|410|32823|42|33121|566| +au16LowCCMAcmOff = 438|32855|32863|32877|461|32864|0|33061|549| + +[h264venc] +vencBitrateCount = 4 +vencBitrateThresh = 1025|2049|4097|8145| + +chroma_qp_index_offset_0 = 0 +disable_deblocking_filter_idc_0 = 2 +u32DeltaQP_0 = 0 +s32IPQPDelta_0 = 4 +slice_alpha_c0_offset_div2_0 = 5 +slice_beta_offset_div2_0 = 5 +ThreshI_0 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_0 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_1 = -6 +disable_deblocking_filter_idc_1 = 2 +u32DeltaQP_1 = 1 +s32IPQPDelta_1 = 4 +slice_alpha_c0_offset_div2_1 = 5 +slice_beta_offset_div2_1 = 5 +ThreshI_1 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_1 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_2 = -4 +disable_deblocking_filter_idc_2 = 2 +u32DeltaQP_2 = 0 +s32IPQPDelta_2 = 4 +slice_alpha_c0_offset_div2_2 = 1 +slice_beta_offset_div2_2 = 1 +ThreshI_2 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_2 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_3 = 0 +disable_deblocking_filter_idc_3 = 1 +u32DeltaQP_3 = 0 +s32IPQPDelta_3 = 2 +slice_alpha_c0_offset_div2_3 = 0 +slice_beta_offset_div2_3 = 0 +ThreshI_3 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_3 = 7|7|7|7|7|9|9|9|12|15|18|25| + +[h265venc] +vencBitrateCount = 2 +vencBitrateThresh = 2048|4098| + +ThreshI_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_0 = 1 +s32IPQPDelta_0 = 1 + +ThreshI_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_1 = 1 +s32IPQPDelta_1 = 4 + +;²ʡع +ExpCount = 2 +ExpThresh = 8000|300000| +;I֡intraģʽѡ +u8NormIntra4RdCost_I_0 = 0|0| +u8NormIntra8RdCost_I_0 = 0|0| +u8NormIntra16RdCost_I_0 = 0|0| +u8NormIntra32RdCost_I_0 = 0|0| +u8SkinIntra4RdCost_I_0 = 0|0| +u8SkinIntra8RdCost_I_0 = 0|0| +u8SkinIntra16RdCost_I_0 = 0|2| +u8SkinIntra32RdCost_I_0 = 0|1| +u8HedgeIntra4RdCost_I_0 = 0|0| +u8HedgeIntra8RdCost_I_0 = 4|3| +u8HedgeIntra16RdCost_I_0 = 1|1| +u8HedgeIntra32RdCost_I_0 = 15|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_0 = 0|0| +u8NormIntra8RdCost_P_0 = 0|0| +u8NormIntra16RdCost_P_0 = 3|0| +u8NormIntra32RdCost_P_0 = 0|0| +u8SkinIntra4RdCost_P_0 = 0|0| +u8SkinIntra8RdCost_P_0 = 0|0| +u8SkinIntra16RdCost_P_0 = 0|2| +u8SkinIntra32RdCost_P_0 = 0|1| +u8HedgeIntra4RdCost_P_0 = 0|0| +u8HedgeIntra8RdCost_P_0 = 4|3| +u8HedgeIntra16RdCost_P_0 = 2|1| +u8HedgeIntra32RdCost_P_0 = 3|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_0 = 0|4| +u8NormFme16RdCost_P_0 = 0|0| +u8NormFme32RdCost_P_0 = 0|0| +u8NormFme64RdCost_P_0 = 0|0| +u8SkinFme8RdCost_P_0 = 0|0| +u8SkinFme16RdCost_P_0 = 0|0| +u8SkinFme32RdCost_P_0 = 4|4| +u8SkinFme64RdCost_P_0 = 2|2| +u8HedgeFme8RdCost_P_0 = 3|4| +u8HedgeFme16RdCost_P_0 = 3|4| +u8HedgeFme32RdCost_P_0 = 3|3| +u8HedgeFme64RdCost_P_0 = 2|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_0 = 0|4| +u8NormMerg16RdCost_P_0 = 0|0| +u8NormMerg32RdCost_P_0 = 0|0| +u8NormMerg64RdCost_P_0 = 0|0| +u8SkinMerg8RdCost_P_0 = 0|0| +u8SkinMerg16RdCost_P_0 = 0|0| +u8SkinMerg32RdCost_P_0 = 4|4| +u8SkinMerg64RdCost_P_0 = 2|2| +u8HedgeMerg8RdCost_P_0 = 3|4| +u8HedgeMerg16RdCost_P_0 = 3|4| +u8HedgeMerg32RdCost_P_0 = 3|3| +u8HedgeMerg64RdCost_P_0 = 2|2| +;I֡ɫ㷨 +bSkinEn_I_0 = 0|1| +u32SkinQpDelta_I_0 = 3|3| +u8SkinUMax_I_0 = 100|100| +u8SkinUMin_I_0 = 127|127| +u8SkinVMax_I_0 = 135|135| +u8SkinVMin_I_0 = 160|160| +u32SkinNum_I_0 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_0 = 0|1| +u32SkinQpDelta_P_0 = 3|3| +u8SkinUMax_P_0 = 100|100| +u8SkinUMin_P_0 = 127|127| +u8SkinVMax_P_0 = 135|135| +u8SkinVMin_P_0 = 160|160| +u32SkinNum_P_0 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_0 = 30|25| +u8HedgeCnt_I_0 = 4|4| +bStroEdgeEn_I_0 = 1|1| +u32StroEdgeQpDelta_I_0 = 1|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_0 = 30|25| +u8HedgeCnt_P_0 = 4|4| +bStroEdgeEn_P_0 = 1|1| +u32StroEdgeQpDelta_P_0 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_0 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_0 = 1|1| +u32Norm32MaxNum_P_0 = 4|4| +u32Norm16MaxNum_P_0 = 3|3| +u32Norm32ProtectNum_P_0 = 256|256| +u32Norm16ProtectNum_P_0 = 64|64| +u32Skin32MaxNum_P_0 = 8|8| +u32Skin16MaxNum_P_0 = 6|6| +u32Skin32ProtectNum_P_0 = 32|32| +u32Skin16ProtectNum_P_0 = 16|16| +u32Still32MaxNum_P_0 = 8|8| +u32Still16MaxNum_P_0 = 6|6| +u32Still32ProtectNum_P_0 = 64|16| +u32Still16ProtectNum_P_0 = 8|8| +u32Hedge32MaxNum_P_0 = 8|8| +u32Hedge16MaxNum_P_0 = 6|6| +u32Hedge32ProtectNum_P_0 = 32|32| +u32Hedge16ProtectNum_P_0 = 16|16| + +;I֡intraģʽѡ +u8NormIntra4RdCost_I_1 = 10|0| +u8NormIntra8RdCost_I_1 = 0|0| +u8NormIntra16RdCost_I_1 = 0|0| +u8NormIntra32RdCost_I_1 = 0|0| +u8SkinIntra4RdCost_I_1 = 0|0| +u8SkinIntra8RdCost_I_1 = 0|0| +u8SkinIntra16RdCost_I_1 = 0|2| +u8SkinIntra32RdCost_I_1 = 0|1| +u8HedgeIntra4RdCost_I_1 = 3|0| +u8HedgeIntra8RdCost_I_1 = 0|3| +u8HedgeIntra16RdCost_I_1 = 0|1| +u8HedgeIntra32RdCost_I_1 = 0|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_1 = 0|0| +u8NormIntra8RdCost_P_1 = 1|0| +u8NormIntra16RdCost_P_1 = 15|0| +u8NormIntra32RdCost_P_1 = 15|0| +u8SkinIntra4RdCost_P_1 = 0|0| +u8SkinIntra8RdCost_P_1 = 0|0| +u8SkinIntra16RdCost_P_1 = 0|2| +u8SkinIntra32RdCost_P_1 = 0|1| +u8HedgeIntra4RdCost_P_1 = 0|0| +u8HedgeIntra8RdCost_P_1 = 1|3| +u8HedgeIntra16RdCost_P_1 = 15|1| +u8HedgeIntra32RdCost_P_1 = 15|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_1 = 4|4| +u8NormFme16RdCost_P_1 = 0|0| +u8NormFme32RdCost_P_1 = 0|0| +u8NormFme64RdCost_P_1 = 0|0| +u8SkinFme8RdCost_P_1 = 0|0| +u8SkinFme16RdCost_P_1 = 0|0| +u8SkinFme32RdCost_P_1 = 4|4| +u8SkinFme64RdCost_P_1 = 2|2| +u8HedgeFme8RdCost_P_1 = 0|4| +u8HedgeFme16RdCost_P_1 = 0|4| +u8HedgeFme32RdCost_P_1 = 1|3| +u8HedgeFme64RdCost_P_1 = 1|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_1 = 4|4| +u8NormMerg16RdCost_P_1 = 0|0| +u8NormMerg32RdCost_P_1 = 0|0| +u8NormMerg64RdCost_P_1 = 0|0| +u8SkinMerg8RdCost_P_1 = 0|0| +u8SkinMerg16RdCost_P_1 = 0|0| +u8SkinMerg32RdCost_P_1 = 4|4| +u8SkinMerg64RdCost_P_1 = 2|2| +u8HedgeMerg8RdCost_P_1 = 0|4| +u8HedgeMerg16RdCost_P_1 = 0|4| +u8HedgeMerg32RdCost_P_1 = 1|3| +u8HedgeMerg64RdCost_P_1 = 1|2| +;I֡ɫ㷨 +bSkinEn_I_1 = 0|1| +u32SkinQpDelta_I_1 = 3|3| +u8SkinUMax_I_1 = 100|100| +u8SkinUMin_I_1 = 127|127| +u8SkinVMax_I_1 = 135|135| +u8SkinVMin_I_1 = 160|160| +u32SkinNum_I_1 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_1 = 0|1| +u32SkinQpDelta_P_1 = 3|3| +u8SkinUMax_P_1 = 100|100| +u8SkinUMin_P_1 = 127|127| +u8SkinVMax_P_1 = 135|135| +u8SkinVMin_P_1 = 160|160| +u32SkinNum_P_1 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_1 = 25|25| +u8HedgeCnt_I_1 = 4|4| +bStroEdgeEn_I_1 = 1|1| +u32StroEdgeQpDelta_I_1 = 0|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_1 = 25|25| +u8HedgeCnt_P_1 = 4|4| +bStroEdgeEn_P_1 = 1|1| +u32StroEdgeQpDelta_P_1 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_1 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_1 = 1|1| +u32Norm32MaxNum_P_1 = 4|4| +u32Norm16MaxNum_P_1 = 3|3| +u32Norm32ProtectNum_P_1 = 256|256| +u32Norm16ProtectNum_P_1 = 64|64| +u32Skin32MaxNum_P_1 = 8|8| +u32Skin16MaxNum_P_1 = 6|6| +u32Skin32ProtectNum_P_1 = 32|32| +u32Skin16ProtectNum_P_1 = 16|16| +u32Still32MaxNum_P_1 = 8|8| +u32Still16MaxNum_P_1 = 6|6| +u32Still32ProtectNum_P_1 = 16|16| +u32Still16ProtectNum_P_1 = 8|8| +u32Hedge32MaxNum_P_1 = 8|8| +u32Hedge16MaxNum_P_1 = 6|6| +u32Hedge32ProtectNum_P_1 = 32|32| +u32Hedge16ProtectNum_P_1 = 16|16| + +[3dnr] +datafile=ini/IPC/iso_34220_3dnr.bin +irdatafile=ini/IPC/iso_34220_3dnr.bin +hlcdatafile=ini/IPC/iso_34220_3dnr.bin + +hlctimes = 2048 ;1024Ӧ12048Ӧ2 +drctimes = 2048 +irtimes = 2048 + +3dnrExpCount = 13 +3dnrExpThresh = 20000|40000|160000|320000|600000|1400000|2400000|4800000|10000000|20000000|40000000|80000000|120000000| ;عλ*ʱ(΢) + +SHP0_0 = 85 +SHP1_0 = 64 +SHP2_0 = 64 +MDDZ0_0 = 127 +MDDZ1_0 = 6 +MDDZ2_0 = 127 +TFS0_0 = 10 +TFS1_0 = 10 +TFS2_0 = 10 +SFS0_0 = 512 +SFS1_0 = 256 +SFS2_0 = 64 +TFP0_0 = 100 +TFP1_0 = 200 +TFP2_0 = 200 +SPS0_0 = 8 +SPS1_0 = 8 +SPS2_0 = 8 +TFR0_0 = 0 +TFR1_0 = 6 +TFR2_0 = 16 +SPT0_0 = 10 +SPT1_0 = 10 +SPT2_0 = 10 +SBF0_0 = 64 +SBF1_0 = 32 +SBF2_0 = 0 +SFC_0 = 0 +TFC_0 = 0 +Mdn_0 = 0 +MATH_0 = 36 +MATW_0 = 28 + +SHP0_1 = 80 +SHP1_1 = 64 +SHP2_1 = 64 +MDDZ0_1 = 127 +MDDZ1_1 = 6 +MDDZ2_1 = 127 +TFS0_1 = 10 +TFS1_1 = 10 +TFS2_1 = 10 +SFS0_1 = 512 +SFS1_1 = 256 +SFS2_1 = 64 +TFP0_1 = 100 +TFP1_1 = 300 +TFP2_1 = 400 +SPS0_1 = 8 +SPS1_1 = 8 +SPS2_1 = 8 +TFR0_1 = 0 +TFR1_1 = 6 +TFR2_1 = 16 +SPT0_1 = 10 +SPT1_1 = 10 +SPT2_1 = 10 +SBF0_1 = 64 +SBF1_1 = 32 +SBF2_1 = 0 +SFC_1 = 0 +TFC_1 = 0 +Mdn_1 = 0 +MATH_1 = 36 +MATW_1 = 28 + +SHP0_2 = 75 +SHP1_2 = 64 +SHP2_2 = 64 +MDDZ0_2 = 127 +MDDZ1_2 = 6 +MDDZ2_2 = 127 +TFS0_2 = 10 +TFS1_2 = 10 +TFS2_2 = 10 +SFS0_2 = 512 +SFS1_2 = 256 +SFS2_2 = 96 +TFP0_2 = 100 +TFP1_2 = 500 +TFP2_2 = 500 +SPS0_2 = 8 +SPS1_2 = 12 +SPS2_2 = 12 +TFR0_2 = 0 +TFR1_2 = 6 +TFR2_2 = 31 +SPT0_2 = 10 +SPT1_2 = 10 +SPT2_2 = 10 +SBF0_2 = 64 +SBF1_2 = 32 +SBF2_2 = 0 +SFC_2 = 0 +TFC_2 = 0 +Mdn_2 = 0 +MATH_2 = 64 +MATW_2 = 24 + +SHP0_3 = 70 +SHP1_3 = 64 +SHP2_3 = 64 +MDDZ0_3 = 127 +MDDZ1_3 = 6 +MDDZ2_3 = 127 +TFS0_3 = 10 +TFS1_3 = 10 +TFS2_3 = 9 +SFS0_3 = 512 +SFS1_3 = 384 +SFS2_3 = 192 +TFP0_3 = 100 +TFP1_3 = 500 +TFP2_3 = 500 +SPS0_3 = 8 +SPS1_3 = 12 +SPS2_3 = 12 +TFR0_3 = 0 +TFR1_3 = 6 +TFR2_3 = 31 +SPT0_3 = 10 +SPT1_3 = 10 +SPT2_3 = 9 +SBF0_3 = 64 +SBF1_3 = 32 +SBF2_3 = 0 +SFC_3 = 16 +TFC_3 = 0 +Mdn_3 = 0 +MATH_3 = 64 +MATW_3 = 28 + +SHP0_4 = 80 +SHP1_4 = 48 +SHP2_4 = 32 +MDDZ0_4 = 127 +MDDZ1_4 = 6 +MDDZ2_4 = 127 +TFS0_4 = 14 +TFS1_4 = 12 +TFS2_4 = 12 +SFS0_4 = 1048 +SFS1_4 = 512 +SFS2_4 = 256 +TFP0_4 = 100 +TFP1_4 = 500 +TFP2_4 = 500 +SPS0_4 = 16 +SPS1_4 = 16 +SPS2_4 = 16 +TFR0_4 = 0 +TFR1_4 = 6 +TFR2_4 = 8 +SPT0_4 = 14 +SPT1_4 = 12 +SPT2_4 = 12 +SBF0_4 = 64 +SBF1_4 = 0 +SBF2_4 = 0 +SFC_4 = 16 +TFC_4 = 0 +Mdn_4 = 0 +MATH_4 = 64 +MATW_4 = 28 + +SHP0_5 = 80 +SHP1_5 = 48 +SHP2_5 = 32 +MDDZ0_5 = 127 +MDDZ1_5 = 6 +MDDZ2_5 = 127 +TFS0_5 = 14 +TFS1_5 = 12 +TFS2_5 = 12 +SFS0_5 = 1048 +SFS1_5 = 512 +SFS2_5 = 256 +TFP0_5 = 0 +TFP1_5 = 500 +TFP2_5 = 500 +SPS0_5 = 16 +SPS1_5 = 16 +SPS2_5 = 16 +TFR0_5 = 8 +TFR1_5 = 6 +TFR2_5 = 16 +SPT0_5 = 0 +SPT1_5 = 0 +SPT2_5 = 0 +SBF0_5 = 64 +SBF1_5 = 0 +SBF2_5 = 0 +SFC_5 = 32 +TFC_5 = 0 +Mdn_5 = 0 +MATH_5 = 96 +MATW_5 = 28 + +SHP0_6 = 80 +SHP1_6 = 48 +SHP2_6 = 32 +MDDZ0_6 = 127 +MDDZ1_6 = 6 +MDDZ2_6 = 127 +TFS0_6 = 14 +TFS1_6 = 9 +TFS2_6 = 9 +SFS0_6 = 1048 +SFS1_6 = 1024 +SFS2_6 = 512 +TFP0_6 = 0 +TFP1_6 = 500 +TFP2_6 = 500 +SPS0_6 = 16 +SPS1_6 = 16 +SPS2_6 = 8 +TFR0_6 = 8 +TFR1_6 = 6 +TFR2_6 = 16 +SPT0_6 = 0 +SPT1_6 = 0 +SPT2_6 = 16 +SBF0_6 = 64 +SBF1_6 = 0 +SBF2_6 = 0 +SFC_6 = 16 +TFC_6 = 0 +Mdn_6 = 0 +MATH_6 = 128 +MATW_6 = 24 + +SHP0_7 = 80 +SHP1_7 = 64 +SHP2_7 = 64 +MDDZ0_7 = 12 +MDDZ1_7 = 12 +MDDZ2_7 = 127 +TFS0_7 = 12 +TFS1_7 = 10 +TFS2_7 = 10 +SFS0_7 = 768 +SFS1_7 = 768 +SFS2_7 = 384 +TFP0_7 = 0 +TFP1_7 = 400 +TFP2_7 = 500 +SPS0_7 = 8 +SPS1_7 = 16 +SPS2_7 = 16 +TFR0_7 = 8 +TFR1_7 = 14 +TFR2_7 = 16 +SPT0_7 = 16 +SPT1_7 = 0 +SPT2_7 = 0 +SBF0_7 = 96 +SBF1_7 = 32 +SBF2_7 = 0 +SFC_7 = 32 +TFC_7 = 8 +Mdn_7 = 0 +MATH_7 = 128 +MATW_7 = 24 + +SHP0_8 = 80 +SHP1_8 = 64 +SHP2_8 = 64 +MDDZ0_8 = 12 +MDDZ1_8 = 12 +MDDZ2_8 = 127 +TFS0_8 = 12 +TFS1_8 = 10 +TFS2_8 = 10 +SFS0_8 = 9999 +SFS1_8 = 768 +SFS2_8 = 384 +TFP0_8 = 0 +TFP1_8 = 400 +TFP2_8 = 500 +SPS0_8 = 8 +SPS1_8 = 16 +SPS2_8 = 16 +TFR0_8 = 8 +TFR1_8 = 14 +TFR2_8 = 16 +SPT0_8 = 16 +SPT1_8 = 0 +SPT2_8 = 0 +SBF0_8 = 96 +SBF1_8 = 32 +SBF2_8 = 0 +SFC_8 = 64 +TFC_8 = 16 +Mdn_8 = 0 +MATH_8 = 128 +MATW_8 = 24 + +SHP0_9 = 80 +SHP1_9 = 48 +SHP2_9 = 32 +MDDZ0_9 = 12 +MDDZ1_9 = 12 +MDDZ2_9 = 127 +TFS0_9 = 12 +TFS1_9 = 12 +TFS2_9 = 10 +SFS0_9 = 9999 +SFS1_9 = 1024 +SFS2_9 = 512 +TFP0_9 = 200 +TFP1_9 = 500 +TFP2_9 = 500 +SPS0_9 = 8 +SPS1_9 = 16 +SPS2_9 = 16 +TFR0_9 = 14 +TFR1_9 = 12 +TFR2_9 = 31 +SPT0_9 = 16 +SPT1_9 = 0 +SPT2_9 = 0 +SBF0_9 = 96 +SBF1_9 = 0 +SBF2_9 = 0 +SFC_9 = 64 +TFC_9 = 16 +Mdn_9 = 0 +MATH_9 = 256 +MATW_9 = 24 + +SHP0_10 = 96 +SHP1_10 = 48 +SHP2_10 = 32 +MDDZ0_10 = 127 +MDDZ1_10 = 24 +MDDZ2_10 = 127 +TFS0_10 = 12 +TFS1_10 = 10 +TFS2_10 = 8 +SFS0_10 = 9999 +SFS1_10 = 1024 +SFS2_10 = 512 +TFP0_10 = 200 +TFP1_10 = 500 +TFP2_10 = 500 +SPS0_10 = 7 +SPS1_10 = 16 +SPS2_10 = 16 +TFR0_10 = 16 +TFR1_10 = 6 +TFR2_10 = 31 +SPT0_10 = 16 +SPT1_10 = 0 +SPT2_10 = 0 +SBF0_10 = 96 +SBF1_10 = 96 +SBF2_10 = 0 +SFC_10 = 64 +TFC_10 = 16 +Mdn_10 = 0 +MATH_10 = 256 +MATW_10 = 24 + +SHP0_11 = 96 +SHP1_11 = 48 +SHP2_11 = 32 +MDDZ0_11 = 24 +MDDZ1_11 = 24 +MDDZ2_11 = 127 +TFS0_11 = 12 +TFS1_11 = 10 +TFS2_11 = 8 +SFS0_11 = 9999 +SFS1_11 = 1024 +SFS2_11 = 512 +TFP0_11 = 500 +TFP1_11 = 500 +TFP2_11 = 500 +SPS0_11 = 7 +SPS1_11 = 8 +SPS2_11 = 16 +TFR0_11 = 9 +TFR1_11 = 9 +TFR2_11 = 31 +SPT0_11 = 12 +SPT1_11 = 10 +SPT2_11 = 8 +SBF0_11 = 64 +SBF1_11 = 64 +SBF2_11 = 0 +SFC_11 = 128 +TFC_11 = 16 +Mdn_11 = 8 +MATH_11 = 256 +MATW_11 = 24 + +SHP0_12 = 96 +SHP1_12 = 48 +SHP2_12 = 32 +MDDZ0_12 = 127 +MDDZ1_12 = 24 +MDDZ2_12 = 127 +TFS0_12 = 12 +TFS1_12 = 10 +TFS2_12 = 8 +SFS0_12 = 9999 +SFS1_12 = 1024 +SFS2_12 = 512 +TFP0_12 = 500 +TFP1_12 = 500 +TFP2_12 = 500 +SPS0_12 = 7 +SPS1_12 = 16 +SPS2_12 = 16 +TFR0_12 = 12 +TFR1_12 = 8 +TFR2_12 = 31 +SPT0_12 = 16 +SPT1_12 = 0 +SPT2_12 = 0 +SBF0_12 = 96 +SBF1_12 = 96 +SBF2_12 = 0 +SFC_12 = 128 +TFC_12 = 16 +Mdn_12 = 0 +MATH_12 = 256 +MATW_12 = 24 + +[BLC] +AEStrategyMode = 1 +HistRatioSlope = 32 +MaxHistOffset = 64 + +[DYNAMIC] +TotalNum_normal = 7 +TotalNum_fast = 7 + +IntTime_normal = 2|20000|20000|20000|20000|40000|40000| +IntTime_fast = 2|2000|2000|5000|5000|40000|40000| + +SysGain_normal = 1024|1024|1500|1500|3072|3072|16777216| +SysGain_fast = 1024|1024|2048|2048|5120|5120|16777216| + +[HLC] +DCIEnable = 0 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +ExpCompensation = 16 +WhiteDelayFrame = 0 +BlackDelayFrame = 0 +u8Speed = 32 +HistRatioSlope = 128 +MaxHistOffset = 6 +u8Tolerance = 6 +Saturation = 120,116,104,96,88,80,72,64,56,56,56,56,56,56,56,56, +gamma_0 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma_2 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +[IR] +ExpCompensation = 50 +u16HistRatioSlope = 64 +BlackDelayFrame = 30 +WhiteDelayFrame = 30 +MaxHistOffset = 20 +u8Tolerance = 3 +u8Speed = 16 +DCIEnable = 1 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +IRu16Slope = 768 +au8LumThresh = 96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96, +au8SharpenD = 92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92, +au8SharpenRGB = 112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +au8SharpenUd = 86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86, +gamma_0 = 0,76,154,234,313,390,463,531,592,646,694,736,775,812,847,881,916,951,984,1016,1047,1077,1107,1137,1168,1200,1231,1263,1294,1325,1356,1387,1417,1448,1478,1508,1537,1567,1595,1624,1651,1677,1702,1727,1752,1777,1803,1828,1854,1880,1906,1932,1958,1984,2010,2036,2062,2087,2112,2137,2161,2185,2209,2232,2255,2277,2299,2321,2342,2363,2383,2404,2424,2443,2463,2482,2501,2520,2539,2557,2576,2594,2612,2630,2648,2665,2682, +gamma_1 = 2699,2716,2733,2749,2766,2782,2799,2815,2831,2847,2863,2879,2895,2911,2927,2942,2958,2974,2989,3004,3019,3034,3049,3063,3078,3092,3106,3120,3133,3147,3160,3173,3186,3199,3212,3224,3237,3249,3262,3274,3286,3298,3310,3322,3334,3346,3357,3369,3381,3392,3403,3414,3425,3436,3447,3457,3468,3478,3488,3498,3507,3517,3526,3535,3544,3552,3561,3569,3578,3586,3595,3603,3612,3620,3628,3637,3645,3654,3662,3671,3679,3687,3695,3703,3711, +gamma_2 = 3719,3727,3734,3741,3748,3755,3761,3768,3774,3780,3786,3791,3797,3802,3808,3813,3818,3823,3828,3833,3838,3843,3847,3852,3856,3860,3864,3868,3872,3876,3880,3884,3887,3891,3895,3899,3903,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3967,3971,3975,3978,3982,3985,3989,3992,3996,4000,4003,4007,4010,4014,4018,4022,4026,4030,4034,4038,4043,4047,4051,4056,4060,4065,4069,4074,4078,4083,4087,4092,4095 + +[DRC] +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +DRCu32SlopeMax = 56 +DRCu32SlopeMin = 192 +DRCu32VarianceSpace = 10 +DRCu32VarianceIntensity = 4 +DRCu32WhiteLevel = 1791 +DRCu32BlackLevel = 0 + + + + + diff --git a/device/mpp/sample/scene_auto/ini/IPC/sceneauto_222.ini b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_222.ini new file mode 100644 index 0000000..e126cf8 --- /dev/null +++ b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_222.ini @@ -0,0 +1,882 @@ +[common] +IspDev = 0 +ViDev = 0 +ViChn = 0 +VpssGrp = 0 +VpssChn = 0 +VencGrp = 0 +VencChn = 0 + +IVE_Enable = 0; + +HLC_AutoEnable = 0; +HLC_thr_off = 140000 ;ǿⳡرֵ δ +HLC_thr_on = 150000 ;ǿⳡֵ +HLC_tolerance = 3000 ; +HLC_expthr = 6000 +HLC_count = 5 + +;DIS򿪵Ȳ +ave_lum_thresh = 30 +;DIS򿪵ع +delta_dis_expthresh = 20 +;ȥʱ,DCIǿȥǿұ +dci_strength_lut = 32,33,33,34,34,35,35,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,48,48,49,49,50,50,50,49,49,49,49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32 + +exposure_thr_indoor = 10000 ;ȥ +exposure_thr_outdoor = 100 + +fpn_exp_thresh = 2000000000 ;fpnֵ34220sensorҪ + +;DRCǿ,ģʽ´DRCʱعл +u32DRCStrengthThresh = 48 + +[AE] +aeRunInterval = 2 +aeBitrateCount = 3 ;ʵȼ +aeBitrateThresh = 2048|8120|16318| ;ʵȼֵ + +;speed,tolerance,BlackDelayFrame,WhiteDelayFrameʵȼ +u8Speed_0 = 64 +u8Tolerance_0 = 3 +u16BlackDelayFrame_0 = 25 +u16WhiteDelayFrame_0 = 15 +u32SysGainMax_0 = 8192000 + +u8Speed_1 = 64 +u8Tolerance_1 = 3 +u16BlackDelayFrame_1 = 15 +u16WhiteDelayFrame_1 = 10 +u32SysGainMax_1 = 8192000 + +u8Speed_2 = 64 +u8Tolerance_2 = 2 +u16BlackDelayFrame_2 = 0 +u16WhiteDelayFrame_2 = 0 +u32SysGainMax_2 = 8192000 + +aeExpCount = 5 ;عȼ +aeExpDtoLThresh = 6000|30000|240000|800000|8000000| ;عȼֵ +aeExpLtoDThresh = 8000|40000|300000|1000000|10000000| ;عȼֵ + +;CompesationHistOffsetعȼ +aeCompesation = 64|64|64|64|64| +aeHistOffset = 12|12|20|20|20| + +[sharpen] +IsoThresh = 200 ; +ExpCount = 2 ;عʱȼ +ExpThresh = 2000|10000 ;عʱȼֵ + +abEnLowLumaShoot_0 = 0|0|0|0|0|0|0|0|0|1|1|1|1|1|1|1 ; +SharpenD_0 = 20|20|30|30|30|35|35|40|50|60|70|90|110|120|120|120 ; +SharpenUd_0 = 35|40|50|50|55|55|55|60|60|70|80|90|110|120|120|120 ; +TextureNoiseThd_0 = 0|2|4|6|6|12|30|60|80|0|0|0|0|0|0|0 ; +EdgeNoiseThd_0 = 2|4|8|16|25|11|12|0|0|0|0|0|0|0|0|0 ; +overshoot_0 = 170|190|200|150|140|120|110|95|80|70|40|20|20|20|20|20 ; +undershoot_0 = 170|190|190|140|135|130|110|95|75|60|50|50|50|50|50|50 ; + +abEnLowLumaShoot_1 = 0|0|0|0|0|0|0|0|0|1|1|1|1|1|1|1 ; +SharpenD_1 = 20|20|30|30|30|35|35|40|50|60|70|90|110|120|120|120 ; +SharpenUd_1 = 30|40|50|50|55|55|55|60|60|70|80|90|110|120|120|120 ; +TextureNoiseThd_1 = 0|2|4|6|6|12|30|60|80|0|0|0|0|0|0|0 ; +EdgeNoiseThd_1 = 2|4|8|16|25|11|12|0|0|0|0|0|0|0|0|0 ; +overshoot_1 = 220|230|200|150|140|120|110|95|80|70|40|20|20|20|20|20 ; +undershoot_1 = 210|220|190|140|135|130|110|95|75|60|50|50|50|50|50|50 ; + +[gamma] ;ȫһ +DelayCount =1 +Interval = 10 +ExpCount = 3 +ExpThreshLtoD = 8000000|32000000|3200000000 +ExpThreshDtoL = 6000000|30000000|3000000000 + +gamma.0_0 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_0 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_0 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +gamma.0_1 = 0,147,223,284,338,386,431,472,512,549,585,620,653,685,716,746,776,805,833,860,887,913,939,965,990,1014,1038,1062,1085,1109,1131,1154,1176,1198,1220,1241,1262,1283,1304,1324,1344,1365,1384,1404,1424,1443,1462,1481,1500,1519,1537,1555,1574,1592,1610,1628,1645,1663,1680,1698,1715,1732,1749,1766,1782,1799,1816,1832,1848,1865,1881,1897,1913,1929,1945,1960,1976,1992,2007,2022,2038,2053,2068,2083,2098,2113,2128,2143,2158,2172,2187,2202,2216,2230,2245,2259,2273,2288,2302,2316, +gamma.1_1 = 2330,2344,2358,2371,2385,2399,2413,2426,2440,2453,2467,2480,2494,2507,2520,2534,2547,2560,2573,2586,2599,2612,2625,2638,2651,2664,2676,2689,2702,2714,2727,2740,2752,2765,2777,2789,2802,2814,2826,2839,2851,2863,2875,2887,2900,2912,2924,2936,2948,2960,2971,2983,2995,3007,3019,3030,3042,3054,3066,3077,3089,3100,3112,3123,3135,3146,3158,3169,3181,3192,3203,3214,3226,3237,3248,3259,3271,3282,3293,3304,3315,3326,3337,3348,3359,3370,3381,3392,3403,3413,3424,3435,3446,3457,3467,3478,3489,3499,3510,3521, +gamma.2_1 = 3531,3542,3552,3563,3573,3584,3594,3605,3615,3626,3636,3647,3657,3667,3678,3688,3698,3708,3719,3729,3739,3749,3759,3770,3780,3790,3800,3810,3820,3830,3840,3850,3860,3870,3880,3890,3900,3910,3920,3930,3939,3949,3959,3969,3979,3989,3998,4008,4018,4027,4037,4047,4056,4066,4076,4085,4095, + +gamma.0_2 = 0,84,137,182,223,260,296,330,362,393,423,452,481,508,536,562,588,613,639,663,687,711,735,758,781,804,826,848,870,892,913,934,955,976,997,1017,1037,1057,1077,1097,1117,1136,1155,1175,1194,1213,1231,1250,1269,1287,1305,1324,1342,1360,1378,1396,1413,1431,1448,1466,1483,1500,1518,1535,1552,1569,1586,1602,1619,1636,1652,1669,1685,1701,1718,1734,1750,1766,1782,1798,1814,1830,1846,1861,1877,1893,1908,1924,1939,1955, +gamma.1_2 = 1970,1985,2000,2016,2031,2046,2061,2076,2091,2106,2121,2136,2150,2165,2180,2194,2209,2224,2238,2253,2267,2281,2296,2310,2324,2339,2353,2367,2381,2395,2409,2423,2437,2451,2465,2479,2493,2507,2521,2535,2548,2562,2576,2589,2603,2616,2630,2644,2657,2671,2684,2697,2711,2724,2737,2751,2764,2777,2790,2804,2817,2830,2843,2856,2869,2882,2895,2908,2921,2934,2947,2960,2973,2986,2998,3011,3024,3037,3049,3062,3075,3087,3100,3113,3125,3138,3150,3163,3175, +gamma.2_2 = 3188,3200,3213,3225,3237,3250,3262,3275,3287,3299,3311,3324,3336,3348,3360,3372,3385,3397,3409,3421,3433,3445,3457,3469,3481,3493,3505,3517,3529,3541,3553,3565,3577,3589,3600,3612,3624,3636,3648,3659,3671,3683,3695,3706,3718,3730,3741,3753,3764,3776,3788,3799,3811,3822,3834,3845,3857,3868,3880,3891,3903,3914,3926,3937,3948,3960,3971,3982,3994,4005,4016,4028,4039,4050,4061,4073,4084,4095, + +[ccm] ;ȫһ +AcmEnable = 0 +u16HighColorTempAcmOn = 5120 +u16MidColorTempAcmOn = 3633 +u16LowColorTempAcmOn = 2465 +au16HighCCMAcmOn = 480|32968|32792|32843|399|32836|25|32981|444| +au16MidCCMAcmOn = 463|32936|32807|32882|424|32822|26|33005|467| +au16LowCCMAcmOn = 462|32941|32801|32892|402|32790|34|33020|474| + +u16HighColorTempAcmOff = 5120 +u16MidColorTempAcmOff = 3633 +u16LowColorTempAcmOff = 2465 +au16HighCCMAcmOff = 480|32968|32792|32843|399|32836|25|32981|444| +au16MidCCMAcmOff = 463|32936|32807|32882|424|32822|26|33005|467| +au16LowCCMAcmOff = 462|32941|32801|32892|402|32790|34|33020|474| + + +[h264venc] +vencBitrateCount = 4 +vencBitrateThresh = 1025|2049|4097|8145| + +chroma_qp_index_offset_0 = 0 +disable_deblocking_filter_idc_0 = 2 +u32DeltaQP_0 = 0 +s32IPQPDelta_0 = 4 +slice_alpha_c0_offset_div2_0 = 5 +slice_beta_offset_div2_0 = 5 +ThreshI_0 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_0 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_1 = -6 +disable_deblocking_filter_idc_1 = 2 +u32DeltaQP_1 = 1 +s32IPQPDelta_1 = 4 +slice_alpha_c0_offset_div2_1 = 5 +slice_beta_offset_div2_1 = 5 +ThreshI_1 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_1 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_2 = -4 +disable_deblocking_filter_idc_2 = 2 +u32DeltaQP_2 = 0 +s32IPQPDelta_2 = 4 +slice_alpha_c0_offset_div2_2 = 1 +slice_beta_offset_div2_2 = 1 +ThreshI_2 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_2 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_3 = 0 +disable_deblocking_filter_idc_3 = 1 +u32DeltaQP_3 = 0 +s32IPQPDelta_3 = 2 +slice_alpha_c0_offset_div2_3 = 0 +slice_beta_offset_div2_3 = 0 +ThreshI_3 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_3 = 7|7|7|7|7|9|9|9|12|15|18|25| + +[h265venc] +vencBitrateCount = 2 +vencBitrateThresh = 2048|4098| + +ThreshI_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_0 = 1 +s32IPQPDelta_0 = 1 + +ThreshI_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_1 = 1 +s32IPQPDelta_1 = 4 + +;²ʡع +ExpCount = 2 +ExpThresh = 8000|300000| +;I֡intraģʽѡ +u8NormIntra4RdCost_I_0 = 0|0| +u8NormIntra8RdCost_I_0 = 0|0| +u8NormIntra16RdCost_I_0 = 0|0| +u8NormIntra32RdCost_I_0 = 0|0| +u8SkinIntra4RdCost_I_0 = 0|0| +u8SkinIntra8RdCost_I_0 = 0|0| +u8SkinIntra16RdCost_I_0 = 0|2| +u8SkinIntra32RdCost_I_0 = 0|1| +u8HedgeIntra4RdCost_I_0 = 0|0| +u8HedgeIntra8RdCost_I_0 = 4|3| +u8HedgeIntra16RdCost_I_0 = 1|1| +u8HedgeIntra32RdCost_I_0 = 15|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_0 = 0|0| +u8NormIntra8RdCost_P_0 = 0|0| +u8NormIntra16RdCost_P_0 = 3|0| +u8NormIntra32RdCost_P_0 = 0|0| +u8SkinIntra4RdCost_P_0 = 0|0| +u8SkinIntra8RdCost_P_0 = 0|0| +u8SkinIntra16RdCost_P_0 = 0|2| +u8SkinIntra32RdCost_P_0 = 0|1| +u8HedgeIntra4RdCost_P_0 = 0|0| +u8HedgeIntra8RdCost_P_0 = 4|3| +u8HedgeIntra16RdCost_P_0 = 2|1| +u8HedgeIntra32RdCost_P_0 = 3|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_0 = 0|4| +u8NormFme16RdCost_P_0 = 0|0| +u8NormFme32RdCost_P_0 = 0|0| +u8NormFme64RdCost_P_0 = 0|0| +u8SkinFme8RdCost_P_0 = 0|0| +u8SkinFme16RdCost_P_0 = 0|0| +u8SkinFme32RdCost_P_0 = 4|4| +u8SkinFme64RdCost_P_0 = 2|2| +u8HedgeFme8RdCost_P_0 = 3|4| +u8HedgeFme16RdCost_P_0 = 3|4| +u8HedgeFme32RdCost_P_0 = 3|3| +u8HedgeFme64RdCost_P_0 = 2|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_0 = 0|4| +u8NormMerg16RdCost_P_0 = 0|0| +u8NormMerg32RdCost_P_0 = 0|0| +u8NormMerg64RdCost_P_0 = 0|0| +u8SkinMerg8RdCost_P_0 = 0|0| +u8SkinMerg16RdCost_P_0 = 0|0| +u8SkinMerg32RdCost_P_0 = 4|4| +u8SkinMerg64RdCost_P_0 = 2|2| +u8HedgeMerg8RdCost_P_0 = 3|4| +u8HedgeMerg16RdCost_P_0 = 3|4| +u8HedgeMerg32RdCost_P_0 = 3|3| +u8HedgeMerg64RdCost_P_0 = 2|2| +;I֡ɫ㷨 +bSkinEn_I_0 = 0|1| +u32SkinQpDelta_I_0 = 3|3| +u8SkinUMax_I_0 = 100|100| +u8SkinUMin_I_0 = 127|127| +u8SkinVMax_I_0 = 135|135| +u8SkinVMin_I_0 = 160|160| +u32SkinNum_I_0 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_0 = 0|1| +u32SkinQpDelta_P_0 = 3|3| +u8SkinUMax_P_0 = 100|100| +u8SkinUMin_P_0 = 127|127| +u8SkinVMax_P_0 = 135|135| +u8SkinVMin_P_0 = 160|160| +u32SkinNum_P_0 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_0 = 30|25| +u8HedgeCnt_I_0 = 4|4| +bStroEdgeEn_I_0 = 1|1| +u32StroEdgeQpDelta_I_0 = 1|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_0 = 30|25| +u8HedgeCnt_P_0 = 4|4| +bStroEdgeEn_P_0 = 1|1| +u32StroEdgeQpDelta_P_0 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_0 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_0 = 1|1| +u32Norm32MaxNum_P_0 = 4|4| +u32Norm16MaxNum_P_0 = 3|3| +u32Norm32ProtectNum_P_0 = 256|256| +u32Norm16ProtectNum_P_0 = 64|64| +u32Skin32MaxNum_P_0 = 8|8| +u32Skin16MaxNum_P_0 = 6|6| +u32Skin32ProtectNum_P_0 = 32|32| +u32Skin16ProtectNum_P_0 = 16|16| +u32Still32MaxNum_P_0 = 8|8| +u32Still16MaxNum_P_0 = 6|6| +u32Still32ProtectNum_P_0 = 64|16| +u32Still16ProtectNum_P_0 = 8|8| +u32Hedge32MaxNum_P_0 = 8|8| +u32Hedge16MaxNum_P_0 = 6|6| +u32Hedge32ProtectNum_P_0 = 32|32| +u32Hedge16ProtectNum_P_0 = 16|16| + +;I֡intraģʽѡ +u8NormIntra4RdCost_I_1 = 10|0| +u8NormIntra8RdCost_I_1 = 0|0| +u8NormIntra16RdCost_I_1 = 0|0| +u8NormIntra32RdCost_I_1 = 0|0| +u8SkinIntra4RdCost_I_1 = 0|0| +u8SkinIntra8RdCost_I_1 = 0|0| +u8SkinIntra16RdCost_I_1 = 0|2| +u8SkinIntra32RdCost_I_1 = 0|1| +u8HedgeIntra4RdCost_I_1 = 3|0| +u8HedgeIntra8RdCost_I_1 = 0|3| +u8HedgeIntra16RdCost_I_1 = 0|1| +u8HedgeIntra32RdCost_I_1 = 0|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_1 = 0|0| +u8NormIntra8RdCost_P_1 = 1|0| +u8NormIntra16RdCost_P_1 = 15|0| +u8NormIntra32RdCost_P_1 = 15|0| +u8SkinIntra4RdCost_P_1 = 0|0| +u8SkinIntra8RdCost_P_1 = 0|0| +u8SkinIntra16RdCost_P_1 = 0|2| +u8SkinIntra32RdCost_P_1 = 0|1| +u8HedgeIntra4RdCost_P_1 = 0|0| +u8HedgeIntra8RdCost_P_1 = 1|3| +u8HedgeIntra16RdCost_P_1 = 15|1| +u8HedgeIntra32RdCost_P_1 = 15|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_1 = 4|4| +u8NormFme16RdCost_P_1 = 0|0| +u8NormFme32RdCost_P_1 = 0|0| +u8NormFme64RdCost_P_1 = 0|0| +u8SkinFme8RdCost_P_1 = 0|0| +u8SkinFme16RdCost_P_1 = 0|0| +u8SkinFme32RdCost_P_1 = 4|4| +u8SkinFme64RdCost_P_1 = 2|2| +u8HedgeFme8RdCost_P_1 = 0|4| +u8HedgeFme16RdCost_P_1 = 0|4| +u8HedgeFme32RdCost_P_1 = 1|3| +u8HedgeFme64RdCost_P_1 = 1|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_1 = 4|4| +u8NormMerg16RdCost_P_1 = 0|0| +u8NormMerg32RdCost_P_1 = 0|0| +u8NormMerg64RdCost_P_1 = 0|0| +u8SkinMerg8RdCost_P_1 = 0|0| +u8SkinMerg16RdCost_P_1 = 0|0| +u8SkinMerg32RdCost_P_1 = 4|4| +u8SkinMerg64RdCost_P_1 = 2|2| +u8HedgeMerg8RdCost_P_1 = 0|4| +u8HedgeMerg16RdCost_P_1 = 0|4| +u8HedgeMerg32RdCost_P_1 = 1|3| +u8HedgeMerg64RdCost_P_1 = 1|2| +;I֡ɫ㷨 +bSkinEn_I_1 = 0|1| +u32SkinQpDelta_I_1 = 3|3| +u8SkinUMax_I_1 = 100|100| +u8SkinUMin_I_1 = 127|127| +u8SkinVMax_I_1 = 135|135| +u8SkinVMin_I_1 = 160|160| +u32SkinNum_I_1 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_1 = 0|1| +u32SkinQpDelta_P_1 = 3|3| +u8SkinUMax_P_1 = 100|100| +u8SkinUMin_P_1 = 127|127| +u8SkinVMax_P_1 = 135|135| +u8SkinVMin_P_1 = 160|160| +u32SkinNum_P_1 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_1 = 25|25| +u8HedgeCnt_I_1 = 4|4| +bStroEdgeEn_I_1 = 1|1| +u32StroEdgeQpDelta_I_1 = 0|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_1 = 25|25| +u8HedgeCnt_P_1 = 4|4| +bStroEdgeEn_P_1 = 1|1| +u32StroEdgeQpDelta_P_1 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_1 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_1 = 1|1| +u32Norm32MaxNum_P_1 = 4|4| +u32Norm16MaxNum_P_1 = 3|3| +u32Norm32ProtectNum_P_1 = 256|256| +u32Norm16ProtectNum_P_1 = 64|64| +u32Skin32MaxNum_P_1 = 8|8| +u32Skin16MaxNum_P_1 = 6|6| +u32Skin32ProtectNum_P_1 = 32|32| +u32Skin16ProtectNum_P_1 = 16|16| +u32Still32MaxNum_P_1 = 8|8| +u32Still16MaxNum_P_1 = 6|6| +u32Still32ProtectNum_P_1 = 16|16| +u32Still16ProtectNum_P_1 = 8|8| +u32Hedge32MaxNum_P_1 = 8|8| +u32Hedge16MaxNum_P_1 = 6|6| +u32Hedge32ProtectNum_P_1 = 32|32| +u32Hedge16ProtectNum_P_1 = 16|16| + +[3dnr] +3DnrIsoCount = 11 +3DnrIsoThresh = 100|200|400|800|1600|3200|6400|12800|26000|53400|105800 + +;ISO = 100 +s32YPKStr_0 = 10 +s32YSFStr_0 = 100 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 13 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +;ISO = 200 +s32YPKStr_1 = 5 +s32YSFStr_1 = 100 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 13 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +;ISO = 400 +s32YPKStr_2 = 4 +s32YSFStr_2 = 100 +s32YTFStr_2 = 64 +s32TFStrMax_2 = 13 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +;ISO = 800 +s32YPKStr_3 = 0 +s32YSFStr_3 = 116 +s32YTFStr_3 = 78 +s32TFStrMax_3 = 13 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 0 + +;ISO = 1600 +s32YPKStr_4 = 0 +s32YSFStr_4 = 116 +s32YTFStr_4 = 92 +s32TFStrMax_4 = 13 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 4 + +;ISO = 3200 +s32YPKStr_5 = 0 +s32YSFStr_5 = 124 +s32YTFStr_5 = 96 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 8 + +;ISO = 6400 +s32YPKStr_6 = 0 +s32YSFStr_6 = 132 +s32YTFStr_6 = 100 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 0 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 24 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 48 +s32CSFStr_6 = 32 +s32CTFstr_6 = 16 + +;ISO = 12800 +s32YPKStr_7 = 0 +s32YSFStr_7 = 136 +s32YTFStr_7 = 105 +s32TFStrMax_7 = 13 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 24 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 48 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 32 +s32CSFStr_7 = 64 +s32CTFstr_7 = 32 + +;ISO = 25600 +s32YPKStr_8 = 0 +s32YSFStr_8 = 146 +s32YTFStr_8 = 105 +s32TFStrMax_8 = 13 +s32YSFStrDlt_8 = 8 +s32YTFStrDlt_8 = 48 +s32YTFStrDl_8 = 4 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 32 +s32CSFStr_8 = 64 +s32CTFstr_8 = 32 + +;ISO = 51200 +s32YPKStr_9 = 0 +s32YSFStr_9 = 176 +s32YTFStr_9 = 105 +s32TFStrMax_9 = 13 +s32YSFStrDlt_9 = 24 +s32YTFStrDlt_9 = 56 +s32YTFStrDl_9 = 18 +s32YSmthStr_9 = 64 +s32YSmthRat_9 = 16 +s32YSFBriRat_9 = 32 +s32CSFStr_9 = 64 +s32CTFstr_9 = 32 + +;ISO = 102400 +s32YPKStr_10 = 0 +s32YSFStr_10 = 180 +s32YTFStr_10 = 110 +s32TFStrMax_10 = 12 +s32YSFStrDlt_10 = 24 +s32YTFStrDlt_10 = 36 +s32YTFStrDl_10 = 12 +s32YSmthStr_10 = 0 +s32YSmthRat_10 = 16 +s32YSFBriRat_10 = 32 +s32CSFStr_10 = 64 +s32CTFstr_10 = 32 + + +[BLC] +AEStrategyMode = 1 +HistRatioSlope = 32 +MaxHistOffset = 64 + +[DYNAMIC] +TotalNum_normal = 7 +TotalNum_fast = 7 + +IntTime_normal = 2|20000|20000|20000|20000|40000|40000| +IntTime_fast = 2|2000|2000|5000|5000|40000|40000| + +SysGain_normal = 1024|1024|1500|1500|3072|3072|16777216| +SysGain_fast = 1024|1024|2048|2048|5120|5120|16777216| + +[HLC] +DCIEnable = 0 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +ExpCompensation = 16 +WhiteDelayFrame = 0 +BlackDelayFrame = 0 +u8Speed = 32 +HistRatioSlope = 128 +MaxHistOffset = 6 +u8Tolerance = 6 +Saturation = 130,130,128,128,120,116,104,96,88,80,72,64,56,56,56,56 +abEnLowLumaShoot = 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1 +u8SharpenD = 40,20,30,30,30,35,35,40,80,120,120,120,120,120,120,120 +u8SharpenUd = 20,45,50,50,50,55,55,60,90,120,120,120,120,120,120,120 +u8TextureNoiseThd = 0,2,4,6,6,12,30,60,80,0,0,0,0,0,0,0 +u8EdgeNoiseThd = 2,4,8,16,25,11,12,0,0,0,0,0,0,0,0,0 +u8OverShoot = 220,230,200,150,150,145,140,130,120,80,40,20,20,20,20,20 +u8UnderShoot = 220,230,200,150,145,145,140,125,110,95,80,50,50,50,50,50 +gamma_0 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma_2 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[IR] +ExpCount = 4 +ExpThreshHtoL = 600000|1800000|4000000|7000000| +ExpThreshLtoH = 700000|2200000|5000000|8000000| +ExpCompensation = 50|48|38|32| +MaxHistOffset = 20|18|14|10| + +u16HistRatioSlope = 64 +BlackDelayFrame = 30 +WhiteDelayFrame = 30 + +u8Tolerance = 3 +u8Speed = 16 +DCIEnable = 1 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +IRu16Slope = 0,0,0,0,1,1,2,2,3,3,3,3,3,3,3,3 +abEnLowLumaShoot = 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1 +u8SharpenD = 40,20,30,30,30,35,35,40,80,120,120,120,120,120,120,120 +u8SharpenUd = 20,45,50,50,50,55,55,60,90,120,120,120,120,120,120,120 +u8TextureNoiseThd = 0,2,4,6,6,12,30,60,80,0,0,0,0,0,0,0 +u8EdgeNoiseThd = 2,4,8,16,25,11,12,0,0,0,0,0,0,0,0,0 +u8OverShoot = 220,230,200,150,150,145,140,130,120,80,40,20,20,20,20,20 +u8UnderShoot = 220,230,200,150,145,145,140,125,110,95,80,50,50,50,50,50 +gamma_0 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma_2 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +expweight_0 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_1 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_2 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_3 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_4 =1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1, +expweight_5 =1,1,1,1,1,2,3,3,3,3,3,1,1,1,1,1,1, +expweight_6 =1,1,1,1,2,3,4,4,4,4,4,3,2,1,1,1,1, +expweight_7 =1,1,1,2,3,4,4,4,4,4,4,4,3,2,1,1,1, +expweight_8 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_9 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_10 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_11 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_12 =1,1,1,1,2,3,3,3,3,3,3,3,2,1,1,1,1, +expweight_13 =1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1, +expweight_14 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[DRC] +DRCEnable = 0 +DRCManulEnable = 0 +DRCStrengthTarget = 128 +DRCu16BrightGainLmt = 127 +DRCu16DarkGainLmtC = 127 +DRCu16DarkGainLmtY = 127 +DRCu8Asymmetry = 2 +DRCu8LocalMixingBrigtht = 45 +DRCu8LocalMixingDark = 45 +DRCu8LocalMixingThres = 2 +DRCu8RangeVar = 0 +DRCu8SecondPole = 180 +DRCu8SpatialVar = 10 +DRCu8Stretch = 54 + + + + + diff --git a/device/mpp/sample/scene_auto/ini/IPC/sceneauto_222_newstyle.ini b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_222_newstyle.ini new file mode 100644 index 0000000..1393364 --- /dev/null +++ b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_222_newstyle.ini @@ -0,0 +1,882 @@ +[common] +IspDev = 0 +ViDev = 0 +ViChn = 0 +VpssGrp = 0 +VpssChn = 0 +VencGrp = 0 +VencChn = 0 + +IVE_Enable = 0; + +HLC_AutoEnable = 0; +HLC_thr_off = 140000 ;ǿⳡرֵ δ +HLC_thr_on = 150000 ;ǿⳡֵ +HLC_tolerance = 3000 ; +HLC_expthr = 6000 +HLC_count = 5 + +;DIS򿪵Ȳ +ave_lum_thresh = 30 +;DIS򿪵ع +delta_dis_expthresh = 20 +;ȥʱ,DCIǿȥǿұ +dci_strength_lut = 32,33,33,34,34,35,35,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,48,48,49,49,50,50,50,49,49,49,49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32 + +exposure_thr_indoor = 10000 ;ȥ +exposure_thr_outdoor = 100 + +fpn_exp_thresh = 2000000000 ;fpnֵ34220sensorҪ + +;DRCǿ,ģʽ´DRCʱعл +u32DRCStrengthThresh = 48 + +[AE] +aeRunInterval = 2 +aeBitrateCount = 3 ;ʵȼ +aeBitrateThresh = 2048|8120|16318| ;ʵȼֵ + +;speed,tolerance,BlackDelayFrame,WhiteDelayFrameʵȼ +u8Speed_0 = 64 +u8Tolerance_0 = 3 +u16BlackDelayFrame_0 = 25 +u16WhiteDelayFrame_0 = 15 +u32SysGainMax_0 = 8192000 + +u8Speed_1 = 64 +u8Tolerance_1 = 3 +u16BlackDelayFrame_1 = 15 +u16WhiteDelayFrame_1 = 10 +u32SysGainMax_1 = 8192000 + +u8Speed_2 = 64 +u8Tolerance_2 = 2 +u16BlackDelayFrame_2 = 0 +u16WhiteDelayFrame_2 = 0 +u32SysGainMax_2 = 8192000 + +aeExpCount = 5 ;عȼ +aeExpDtoLThresh = 6000|30000|240000|800000|8000000| ;عȼֵ +aeExpLtoDThresh = 8000|40000|300000|1000000|10000000| ;عȼֵ + +;CompesationHistOffsetعȼ +aeCompesation = 64|64|64|64|64| +aeHistOffset = 12|12|20|20|20| + +[sharpen] +IsoThresh = 200 ; +ExpCount = 2 ;عʱȼ +ExpThresh = 2000|10000 ;عʱȼֵ + +abEnLowLumaShoot_0 = 0|0|0|0|0|0|0|0|0|1|1|1|1|1|1|1 ; +SharpenD_0 = 20|20|30|45|30|30|35|40|80|120|120|120|120|120|120|120 ; +SharpenUd_0 = 35|45|45|55|50|50|55|60|90|120|120|120|120|120|120|120 ; +TextureNoiseThd_0 = 0|2|4|6|6|12|30|60|80|0|0|0|0|0|0|0 ; +EdgeNoiseThd_0 = 2|4|8|16|25|11|12|0|0|0|0|0|0|0|0|0 ; +overshoot_0 = 170|190|200|175|150|150|140|130|120|80|40|20|20|20|20|20 ; +undershoot_0 = 170|190|200|200|175|170|130|115|100|70|50|50|50|50|50|50 ; + +abEnLowLumaShoot_1 = 0|0|0|0|0|0|0|0|0|1|1|1|1|1|1|1 ; +SharpenD_1 = 20|20|30|45|30|30|35|40|80|120|120|120|120|120|120|120 ; +SharpenUd_1 = 40|45|45|55|50|50|55|60|90|120|120|120|120|120|120|120 ; +TextureNoiseThd_1 = 0|2|4|6|6|12|30|60|80|0|0|0|0|0|0|0 ; +EdgeNoiseThd_1 = 2|4|8|16|25|11|12|0|0|0|0|0|0|0|0|0 ; +overshoot_1 = 220|230|200|175|150|150|140|130|120|80|40|20|20|20|20|20 ; +undershoot_1 = 210|220|200|200|175|175|130|115|100|70|50|50|50|50|50|50 ; + +[gamma] ;ȫһ +DelayCount =1 +Interval = 10 +ExpCount = 3 +ExpThreshLtoD = 8000000|32000000|3200000000 +ExpThreshDtoL = 6000000|30000000|3000000000 + +gamma.0_0 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_0 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_0 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +gamma.0_1 = 0,147,223,284,338,386,431,472,512,549,585,620,653,685,716,746,776,805,833,860,887,913,939,965,990,1014,1038,1062,1085,1109,1131,1154,1176,1198,1220,1241,1262,1283,1304,1324,1344,1365,1384,1404,1424,1443,1462,1481,1500,1519,1537,1555,1574,1592,1610,1628,1645,1663,1680,1698,1715,1732,1749,1766,1782,1799,1816,1832,1848,1865,1881,1897,1913,1929,1945,1960,1976,1992,2007,2022,2038,2053,2068,2083,2098,2113,2128,2143,2158,2172,2187,2202,2216,2230,2245,2259,2273,2288,2302,2316, +gamma.1_1 = 2330,2344,2358,2371,2385,2399,2413,2426,2440,2453,2467,2480,2494,2507,2520,2534,2547,2560,2573,2586,2599,2612,2625,2638,2651,2664,2676,2689,2702,2714,2727,2740,2752,2765,2777,2789,2802,2814,2826,2839,2851,2863,2875,2887,2900,2912,2924,2936,2948,2960,2971,2983,2995,3007,3019,3030,3042,3054,3066,3077,3089,3100,3112,3123,3135,3146,3158,3169,3181,3192,3203,3214,3226,3237,3248,3259,3271,3282,3293,3304,3315,3326,3337,3348,3359,3370,3381,3392,3403,3413,3424,3435,3446,3457,3467,3478,3489,3499,3510,3521, +gamma.2_1 = 3531,3542,3552,3563,3573,3584,3594,3605,3615,3626,3636,3647,3657,3667,3678,3688,3698,3708,3719,3729,3739,3749,3759,3770,3780,3790,3800,3810,3820,3830,3840,3850,3860,3870,3880,3890,3900,3910,3920,3930,3939,3949,3959,3969,3979,3989,3998,4008,4018,4027,4037,4047,4056,4066,4076,4085,4095, + +gamma.0_2 = 0,84,137,182,223,260,296,330,362,393,423,452,481,508,536,562,588,613,639,663,687,711,735,758,781,804,826,848,870,892,913,934,955,976,997,1017,1037,1057,1077,1097,1117,1136,1155,1175,1194,1213,1231,1250,1269,1287,1305,1324,1342,1360,1378,1396,1413,1431,1448,1466,1483,1500,1518,1535,1552,1569,1586,1602,1619,1636,1652,1669,1685,1701,1718,1734,1750,1766,1782,1798,1814,1830,1846,1861,1877,1893,1908,1924,1939,1955, +gamma.1_2 = 1970,1985,2000,2016,2031,2046,2061,2076,2091,2106,2121,2136,2150,2165,2180,2194,2209,2224,2238,2253,2267,2281,2296,2310,2324,2339,2353,2367,2381,2395,2409,2423,2437,2451,2465,2479,2493,2507,2521,2535,2548,2562,2576,2589,2603,2616,2630,2644,2657,2671,2684,2697,2711,2724,2737,2751,2764,2777,2790,2804,2817,2830,2843,2856,2869,2882,2895,2908,2921,2934,2947,2960,2973,2986,2998,3011,3024,3037,3049,3062,3075,3087,3100,3113,3125,3138,3150,3163,3175, +gamma.2_2 = 3188,3200,3213,3225,3237,3250,3262,3275,3287,3299,3311,3324,3336,3348,3360,3372,3385,3397,3409,3421,3433,3445,3457,3469,3481,3493,3505,3517,3529,3541,3553,3565,3577,3589,3600,3612,3624,3636,3648,3659,3671,3683,3695,3706,3718,3730,3741,3753,3764,3776,3788,3799,3811,3822,3834,3845,3857,3868,3880,3891,3903,3914,3926,3937,3948,3960,3971,3982,3994,4005,4016,4028,4039,4050,4061,4073,4084,4095, + +[ccm] ;ȫһ +AcmEnable = 0 +u16HighColorTempAcmOn = 5120 +u16MidColorTempAcmOn = 3633 +u16LowColorTempAcmOn = 2465 +au16HighCCMAcmOn = 480|32968|32792|32843|399|32836|25|32981|444| +au16MidCCMAcmOn = 463|32936|32807|32882|424|32822|26|33005|467| +au16LowCCMAcmOn = 462|32941|32801|32892|402|32790|34|33020|474| + +u16HighColorTempAcmOff = 5120 +u16MidColorTempAcmOff = 3633 +u16LowColorTempAcmOff = 2465 +au16HighCCMAcmOff = 480|32968|32792|32843|399|32836|25|32981|444| +au16MidCCMAcmOff = 463|32936|32807|32882|424|32822|26|33005|467| +au16LowCCMAcmOff = 462|32941|32801|32892|402|32790|34|33020|474| + + +[h264venc] +vencBitrateCount = 4 +vencBitrateThresh = 1025|2049|4097|8145| + +chroma_qp_index_offset_0 = 0 +disable_deblocking_filter_idc_0 = 2 +u32DeltaQP_0 = 0 +s32IPQPDelta_0 = 4 +slice_alpha_c0_offset_div2_0 = 5 +slice_beta_offset_div2_0 = 5 +ThreshI_0 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_0 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_1 = -6 +disable_deblocking_filter_idc_1 = 2 +u32DeltaQP_1 = 1 +s32IPQPDelta_1 = 4 +slice_alpha_c0_offset_div2_1 = 5 +slice_beta_offset_div2_1 = 5 +ThreshI_1 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_1 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_2 = -4 +disable_deblocking_filter_idc_2 = 2 +u32DeltaQP_2 = 0 +s32IPQPDelta_2 = 4 +slice_alpha_c0_offset_div2_2 = 1 +slice_beta_offset_div2_2 = 1 +ThreshI_2 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_2 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_3 = 0 +disable_deblocking_filter_idc_3 = 1 +u32DeltaQP_3 = 0 +s32IPQPDelta_3 = 2 +slice_alpha_c0_offset_div2_3 = 0 +slice_beta_offset_div2_3 = 0 +ThreshI_3 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_3 = 7|7|7|7|7|9|9|9|12|15|18|25| + +[h265venc] +vencBitrateCount = 2 +vencBitrateThresh = 2048|4098| + +ThreshI_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_0 = 1 +s32IPQPDelta_0 = 1 + +ThreshI_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_1 = 1 +s32IPQPDelta_1 = 4 + +;²ʡع +ExpCount = 2 +ExpThresh = 8000|300000| +;I֡intraģʽѡ +u8NormIntra4RdCost_I_0 = 0|0| +u8NormIntra8RdCost_I_0 = 0|0| +u8NormIntra16RdCost_I_0 = 0|0| +u8NormIntra32RdCost_I_0 = 0|0| +u8SkinIntra4RdCost_I_0 = 0|0| +u8SkinIntra8RdCost_I_0 = 0|0| +u8SkinIntra16RdCost_I_0 = 0|2| +u8SkinIntra32RdCost_I_0 = 0|1| +u8HedgeIntra4RdCost_I_0 = 0|0| +u8HedgeIntra8RdCost_I_0 = 4|3| +u8HedgeIntra16RdCost_I_0 = 1|1| +u8HedgeIntra32RdCost_I_0 = 15|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_0 = 0|0| +u8NormIntra8RdCost_P_0 = 0|0| +u8NormIntra16RdCost_P_0 = 3|0| +u8NormIntra32RdCost_P_0 = 0|0| +u8SkinIntra4RdCost_P_0 = 0|0| +u8SkinIntra8RdCost_P_0 = 0|0| +u8SkinIntra16RdCost_P_0 = 0|2| +u8SkinIntra32RdCost_P_0 = 0|1| +u8HedgeIntra4RdCost_P_0 = 0|0| +u8HedgeIntra8RdCost_P_0 = 4|3| +u8HedgeIntra16RdCost_P_0 = 2|1| +u8HedgeIntra32RdCost_P_0 = 3|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_0 = 0|4| +u8NormFme16RdCost_P_0 = 0|0| +u8NormFme32RdCost_P_0 = 0|0| +u8NormFme64RdCost_P_0 = 0|0| +u8SkinFme8RdCost_P_0 = 0|0| +u8SkinFme16RdCost_P_0 = 0|0| +u8SkinFme32RdCost_P_0 = 4|4| +u8SkinFme64RdCost_P_0 = 2|2| +u8HedgeFme8RdCost_P_0 = 3|4| +u8HedgeFme16RdCost_P_0 = 3|4| +u8HedgeFme32RdCost_P_0 = 3|3| +u8HedgeFme64RdCost_P_0 = 2|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_0 = 0|4| +u8NormMerg16RdCost_P_0 = 0|0| +u8NormMerg32RdCost_P_0 = 0|0| +u8NormMerg64RdCost_P_0 = 0|0| +u8SkinMerg8RdCost_P_0 = 0|0| +u8SkinMerg16RdCost_P_0 = 0|0| +u8SkinMerg32RdCost_P_0 = 4|4| +u8SkinMerg64RdCost_P_0 = 2|2| +u8HedgeMerg8RdCost_P_0 = 3|4| +u8HedgeMerg16RdCost_P_0 = 3|4| +u8HedgeMerg32RdCost_P_0 = 3|3| +u8HedgeMerg64RdCost_P_0 = 2|2| +;I֡ɫ㷨 +bSkinEn_I_0 = 0|1| +u32SkinQpDelta_I_0 = 3|3| +u8SkinUMax_I_0 = 100|100| +u8SkinUMin_I_0 = 127|127| +u8SkinVMax_I_0 = 135|135| +u8SkinVMin_I_0 = 160|160| +u32SkinNum_I_0 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_0 = 0|1| +u32SkinQpDelta_P_0 = 3|3| +u8SkinUMax_P_0 = 100|100| +u8SkinUMin_P_0 = 127|127| +u8SkinVMax_P_0 = 135|135| +u8SkinVMin_P_0 = 160|160| +u32SkinNum_P_0 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_0 = 30|25| +u8HedgeCnt_I_0 = 4|4| +bStroEdgeEn_I_0 = 1|1| +u32StroEdgeQpDelta_I_0 = 1|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_0 = 30|25| +u8HedgeCnt_P_0 = 4|4| +bStroEdgeEn_P_0 = 1|1| +u32StroEdgeQpDelta_P_0 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_0 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_0 = 1|1| +u32Norm32MaxNum_P_0 = 4|4| +u32Norm16MaxNum_P_0 = 3|3| +u32Norm32ProtectNum_P_0 = 256|256| +u32Norm16ProtectNum_P_0 = 64|64| +u32Skin32MaxNum_P_0 = 8|8| +u32Skin16MaxNum_P_0 = 6|6| +u32Skin32ProtectNum_P_0 = 32|32| +u32Skin16ProtectNum_P_0 = 16|16| +u32Still32MaxNum_P_0 = 8|8| +u32Still16MaxNum_P_0 = 6|6| +u32Still32ProtectNum_P_0 = 64|16| +u32Still16ProtectNum_P_0 = 8|8| +u32Hedge32MaxNum_P_0 = 8|8| +u32Hedge16MaxNum_P_0 = 6|6| +u32Hedge32ProtectNum_P_0 = 32|32| +u32Hedge16ProtectNum_P_0 = 16|16| + +;I֡intraģʽѡ +u8NormIntra4RdCost_I_1 = 10|0| +u8NormIntra8RdCost_I_1 = 0|0| +u8NormIntra16RdCost_I_1 = 0|0| +u8NormIntra32RdCost_I_1 = 0|0| +u8SkinIntra4RdCost_I_1 = 0|0| +u8SkinIntra8RdCost_I_1 = 0|0| +u8SkinIntra16RdCost_I_1 = 0|2| +u8SkinIntra32RdCost_I_1 = 0|1| +u8HedgeIntra4RdCost_I_1 = 3|0| +u8HedgeIntra8RdCost_I_1 = 0|3| +u8HedgeIntra16RdCost_I_1 = 0|1| +u8HedgeIntra32RdCost_I_1 = 0|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_1 = 0|0| +u8NormIntra8RdCost_P_1 = 1|0| +u8NormIntra16RdCost_P_1 = 15|0| +u8NormIntra32RdCost_P_1 = 15|0| +u8SkinIntra4RdCost_P_1 = 0|0| +u8SkinIntra8RdCost_P_1 = 0|0| +u8SkinIntra16RdCost_P_1 = 0|2| +u8SkinIntra32RdCost_P_1 = 0|1| +u8HedgeIntra4RdCost_P_1 = 0|0| +u8HedgeIntra8RdCost_P_1 = 1|3| +u8HedgeIntra16RdCost_P_1 = 15|1| +u8HedgeIntra32RdCost_P_1 = 15|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_1 = 4|4| +u8NormFme16RdCost_P_1 = 0|0| +u8NormFme32RdCost_P_1 = 0|0| +u8NormFme64RdCost_P_1 = 0|0| +u8SkinFme8RdCost_P_1 = 0|0| +u8SkinFme16RdCost_P_1 = 0|0| +u8SkinFme32RdCost_P_1 = 4|4| +u8SkinFme64RdCost_P_1 = 2|2| +u8HedgeFme8RdCost_P_1 = 0|4| +u8HedgeFme16RdCost_P_1 = 0|4| +u8HedgeFme32RdCost_P_1 = 1|3| +u8HedgeFme64RdCost_P_1 = 1|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_1 = 4|4| +u8NormMerg16RdCost_P_1 = 0|0| +u8NormMerg32RdCost_P_1 = 0|0| +u8NormMerg64RdCost_P_1 = 0|0| +u8SkinMerg8RdCost_P_1 = 0|0| +u8SkinMerg16RdCost_P_1 = 0|0| +u8SkinMerg32RdCost_P_1 = 4|4| +u8SkinMerg64RdCost_P_1 = 2|2| +u8HedgeMerg8RdCost_P_1 = 0|4| +u8HedgeMerg16RdCost_P_1 = 0|4| +u8HedgeMerg32RdCost_P_1 = 1|3| +u8HedgeMerg64RdCost_P_1 = 1|2| +;I֡ɫ㷨 +bSkinEn_I_1 = 0|1| +u32SkinQpDelta_I_1 = 3|3| +u8SkinUMax_I_1 = 100|100| +u8SkinUMin_I_1 = 127|127| +u8SkinVMax_I_1 = 135|135| +u8SkinVMin_I_1 = 160|160| +u32SkinNum_I_1 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_1 = 0|1| +u32SkinQpDelta_P_1 = 3|3| +u8SkinUMax_P_1 = 100|100| +u8SkinUMin_P_1 = 127|127| +u8SkinVMax_P_1 = 135|135| +u8SkinVMin_P_1 = 160|160| +u32SkinNum_P_1 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_1 = 25|25| +u8HedgeCnt_I_1 = 4|4| +bStroEdgeEn_I_1 = 1|1| +u32StroEdgeQpDelta_I_1 = 0|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_1 = 25|25| +u8HedgeCnt_P_1 = 4|4| +bStroEdgeEn_P_1 = 1|1| +u32StroEdgeQpDelta_P_1 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_1 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_1 = 1|1| +u32Norm32MaxNum_P_1 = 4|4| +u32Norm16MaxNum_P_1 = 3|3| +u32Norm32ProtectNum_P_1 = 256|256| +u32Norm16ProtectNum_P_1 = 64|64| +u32Skin32MaxNum_P_1 = 8|8| +u32Skin16MaxNum_P_1 = 6|6| +u32Skin32ProtectNum_P_1 = 32|32| +u32Skin16ProtectNum_P_1 = 16|16| +u32Still32MaxNum_P_1 = 8|8| +u32Still16MaxNum_P_1 = 6|6| +u32Still32ProtectNum_P_1 = 16|16| +u32Still16ProtectNum_P_1 = 8|8| +u32Hedge32MaxNum_P_1 = 8|8| +u32Hedge16MaxNum_P_1 = 6|6| +u32Hedge32ProtectNum_P_1 = 32|32| +u32Hedge16ProtectNum_P_1 = 16|16| + +[3dnr] +3DnrIsoCount = 11 +3DnrIsoThresh = 100|200|400|800|1600|3200|6400|12800|26000|53400|105800 + +;ISO = 100 +s32YPKStr_0 = 10 +s32YSFStr_0 = 100 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 13 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +;ISO = 200 +s32YPKStr_1 = 5 +s32YSFStr_1 = 100 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 13 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +;ISO = 400 +s32YPKStr_2 = 4 +s32YSFStr_2 = 100 +s32YTFStr_2 = 64 +s32TFStrMax_2 = 13 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +;ISO = 800 +s32YPKStr_3 = 0 +s32YSFStr_3 = 116 +s32YTFStr_3 = 78 +s32TFStrMax_3 = 13 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 0 + +;ISO = 1600 +s32YPKStr_4 = 0 +s32YSFStr_4 = 116 +s32YTFStr_4 = 92 +s32TFStrMax_4 = 13 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 4 + +;ISO = 3200 +s32YPKStr_5 = 0 +s32YSFStr_5 = 116 +s32YTFStr_5 = 100 +s32TFStrMax_5 = 13 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 8 + +;ISO = 6400 +s32YPKStr_6 = 0 +s32YSFStr_6 = 116 +s32YTFStr_6 = 100 +s32TFStrMax_6 = 13 +s32YSFStrDlt_6 = 0 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 24 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 48 +s32CSFStr_6 = 32 +s32CTFstr_6 = 16 + +;ISO = 12800 +s32YPKStr_7 = 0 +s32YSFStr_7 = 126 +s32YTFStr_7 = 105 +s32TFStrMax_7 = 13 +s32YSFStrDlt_7 = 8 +s32YTFStrDlt_7 = 24 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 48 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 32 +s32CSFStr_7 = 64 +s32CTFstr_7 = 32 + +;ISO = 25600 +s32YPKStr_8 = 0 +s32YSFStr_8 = 146 +s32YTFStr_8 = 105 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 8 +s32YTFStrDlt_8 = 48 +s32YTFStrDl_8 = 4 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 32 +s32CSFStr_8 = 64 +s32CTFstr_8 = 32 + +;ISO = 51200 +s32YPKStr_9 = 0 +s32YSFStr_9 = 176 +s32YTFStr_9 = 105 +s32TFStrMax_9 = 12 +s32YSFStrDlt_9 = 24 +s32YTFStrDlt_9 = 56 +s32YTFStrDl_9 = 18 +s32YSmthStr_9 = 48 +s32YSmthRat_9 = 16 +s32YSFBriRat_9 = 32 +s32CSFStr_9 = 64 +s32CTFstr_9 = 32 + +;ISO = 102400 +s32YPKStr_10 = 0 +s32YSFStr_10 = 180 +s32YTFStr_10 = 100 +s32TFStrMax_10 = 12 +s32YSFStrDlt_10 = 24 +s32YTFStrDlt_10 = 36 +s32YTFStrDl_10 = 12 +s32YSmthStr_10 = 0 +s32YSmthRat_10 = 16 +s32YSFBriRat_10 = 32 +s32CSFStr_10 = 64 +s32CTFstr_10 = 32 + + +[BLC] +AEStrategyMode = 1 +HistRatioSlope = 32 +MaxHistOffset = 64 + +[DYNAMIC] +TotalNum_normal = 7 +TotalNum_fast = 7 + +IntTime_normal = 2|20000|20000|20000|20000|40000|40000| +IntTime_fast = 2|2000|2000|5000|5000|40000|40000| + +SysGain_normal = 1024|1024|1500|1500|3072|3072|16777216| +SysGain_fast = 1024|1024|2048|2048|5120|5120|16777216| + +[HLC] +DCIEnable = 0 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +ExpCompensation = 16 +WhiteDelayFrame = 0 +BlackDelayFrame = 0 +u8Speed = 32 +HistRatioSlope = 128 +MaxHistOffset = 6 +u8Tolerance = 6 +Saturation = 130,130,128,128,120,116,104,96,88,80,72,64,56,56,56,56 +abEnLowLumaShoot = 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1 +u8SharpenD = 40,20,30,30,30,35,35,40,80,120,120,120,120,120,120,120 +u8SharpenUd = 20,45,50,50,50,55,55,60,90,120,120,120,120,120,120,120 +u8TextureNoiseThd = 0,2,4,6,6,12,30,60,80,0,0,0,0,0,0,0 +u8EdgeNoiseThd = 2,4,8,16,25,11,12,0,0,0,0,0,0,0,0,0 +u8OverShoot = 220,230,200,150,150,145,140,130,120,80,40,20,20,20,20,20 +u8UnderShoot = 220,230,200,150,145,145,140,125,110,95,80,50,50,50,50,50 +gamma_0 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma_2 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[IR] +ExpCount = 4 +ExpThreshHtoL = 600000|1800000|4000000|7000000| +ExpThreshLtoH = 700000|2200000|5000000|8000000| +ExpCompensation = 50|48|38|32| +MaxHistOffset = 20|18|14|10| + +u16HistRatioSlope = 64 +BlackDelayFrame = 30 +WhiteDelayFrame = 30 + +u8Tolerance = 3 +u8Speed = 16 +DCIEnable = 1 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +IRu16Slope = 0,0,0,0,1,1,2,2,3,3,3,3,3,3,3,3 +abEnLowLumaShoot = 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1 +u8SharpenD = 40,20,30,30,30,35,35,40,80,120,120,120,120,120,120,120 +u8SharpenUd = 20,45,50,50,50,55,55,60,90,120,120,120,120,120,120,120 +u8TextureNoiseThd = 0,2,4,6,6,12,30,60,80,0,0,0,0,0,0,0 +u8EdgeNoiseThd = 2,4,8,16,25,11,12,0,0,0,0,0,0,0,0,0 +u8OverShoot = 220,230,200,150,150,145,140,130,120,80,40,20,20,20,20,20 +u8UnderShoot = 220,230,200,150,145,145,140,125,110,95,80,50,50,50,50,50 +gamma_0 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma_2 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +expweight_0 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_1 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_2 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_3 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_4 =1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1, +expweight_5 =1,1,1,1,1,2,3,3,3,3,3,1,1,1,1,1,1, +expweight_6 =1,1,1,1,2,3,4,4,4,4,4,3,2,1,1,1,1, +expweight_7 =1,1,1,2,3,4,4,4,4,4,4,4,3,2,1,1,1, +expweight_8 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_9 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_10 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_11 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_12 =1,1,1,1,2,3,3,3,3,3,3,3,2,1,1,1,1, +expweight_13 =1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1, +expweight_14 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[DRC] +DRCEnable = 0 +DRCManulEnable = 0 +DRCStrengthTarget = 128 +DRCu16BrightGainLmt = 127 +DRCu16DarkGainLmtC = 127 +DRCu16DarkGainLmtY = 127 +DRCu8Asymmetry = 2 +DRCu8LocalMixingBrigtht = 45 +DRCu8LocalMixingDark = 45 +DRCu8LocalMixingThres = 2 +DRCu8RangeVar = 0 +DRCu8SecondPole = 180 +DRCu8SpatialVar = 10 +DRCu8Stretch = 54 + + + + + diff --git a/device/mpp/sample/scene_auto/ini/IPC/sceneauto_4682.ini b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_4682.ini new file mode 100644 index 0000000..0d41c4a --- /dev/null +++ b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_4682.ini @@ -0,0 +1,460 @@ +[common] +IspDev = 0 +ViDev = 0 +ViChn = 0 +VpssGrp = 0 +VpssChn = 0 +VencGrp = 0 +VencChn = 0 + +HLC_AutoEnable = 0; +HLC_thr_off = 140000 ;ǿⳡرֵ δ +HLC_thr_on = 150000 ;ǿⳡֵ +HLC_tolerance = 3000 ; +HLC_expthr = 6000 +HLC_count = 5 + +;DIS򿪵Ȳ +ave_lum_thresh = 30 +;DIS򿪵ع +delta_dis_expthresh = 20 +;ȥʱ,DCIǿȥǿұ +dci_strength_lut = 32,33,33,34,34,35,35,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,48,48,49,49,50,50,50,49,49,49,49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32 + +exposure_thr_indoor = 10000 ;ȥ +exposure_thr_outdoor = 100 + +fpn_exp_thresh = 200000 ;fpnֵ34220sensorҪ + +;DRCǿ,ģʽ´DRCʱعл +u32DRCStrengthThresh = 48 + +[AE] +aeBitrateCount = 3 ;ʵȼ +aeBitrateThresh = 1024|4060|8159| ;ʵȼֵ + +;speed,tolerance,BlackDelayFrame,WhiteDelayFrameʵȼ +u8Speed_0 = 64 +u8Tolerance_0 = 3 +u16BlackDelayFrame_0 = 25 +u16WhiteDelayFrame_0 = 15 +u32SysGainMax_0 = 8192000 + +u8Speed_1 = 64 +u8Tolerance_1 = 3 +u16BlackDelayFrame_1 = 15 +u16WhiteDelayFrame_1 = 10 +u32SysGainMax_1 = 8192000 + +u8Speed_2 = 64 +u8Tolerance_2 = 2 +u16BlackDelayFrame_2 = 0 +u16WhiteDelayFrame_2 = 0 +u32SysGainMax_2 = 8192000 + +aeExpCount = 5 ;عȼ +aeExpDtoLThresh = 6000|30000|240000|800000|8000000| ;عȼֵ +aeExpLtoDThresh = 8000|40000|300000|1000000|10000000| ;عȼֵ + +;CompesationHistOffsetعȼ +aeCompesation = 62|56|56|48|48| +aeHistOffset = 12|12|20|20|20| + +[sharpen] +IsoThresh = 200 ; +ExpCount = 2 ;عʱȼ +ExpThresh = 2000|10000 ;عʱȼֵ + +abEnLowLumaShoot_0 = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_0 = 80|80|100|140|180|200|250|250|250|250|250|250|250|250|250|250 ; +SharpenUd_0 = 30|30|32|35|35|60|100|120|160|200|250|250|250|250|250|250 ; +TextureNoiseThd_0 = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 ; +EdgeNoiseThd_0 = 0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 ; +overshoot_0 = 255|255|255|160|140|100|80|20|0|0|0|0|0|0|0|0 ; +undershoot_0 = 255|255|255|255|200|150,100|30|0|0|0|0|0|0|0|0 ; + +abEnLowLumaShoot_1 = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_1 = 80|80|100|140|180|200|250|250|250|250|250|250|250|250|250|250 ; +SharpenUd_1 = 30|30|32|35|35|60|100|120|160|200|250|250|250|250|250|250 ; +TextureNoiseThd_1 = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 ; +EdgeNoiseThd_1 = 0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0 ; +overshoot_1 = 255|255|255|160|140|100|80|20|0|0|0|0|0|0|0|0 ; +undershoot_1 = 255|255|255|255|200|150,100|30|0|0|0|0|0|0|0|0 ; + + +[gamma] ;ȫһ +ExpCount = 3 +ExpThresh = 3200|6400|300000| + +gamma.0_0 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_0 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_0 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +gamma.0_1 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_1 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +gamma.0_2 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_2 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_2 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +[ccm] ;ȫһ +AcmEnable = 0 +u16HighColorTempAcmOn = 5120 +u16MidColorTempAcmOn = 3633 +u16LowColorTempAcmOn = 2449 +au16HighCCMAcmOn = 475|33034|47|32833|415|32862|12|32959|435| +au16MidCCMAcmOn = 458|32975|5|32863|419|32836|7|33015|496| +au16LowCCMAcmOn = 453|32980|15|32831|312|7|23|33176|641| + +u16HighColorTempAcmOff = 5120 +u16MidColorTempAcmOff = 4633 +u16LowColorTempAcmOff = 2449 +au16HighCCMAcmOff = 475|33034|47|32833|415|32862|12|32959|435| +au16MidCCMAcmOff = 458|32975|5|32863|419|32836|7|33015|496| +au16LowCCMAcmOff = 453|32980|15|32831|312|7|23|33176|641| + +[h264venc] +vencBitrateCount = 4 +vencBitrateThresh = 513|1025|2049|4097| + +chroma_qp_index_offset_0 = 0 +disable_deblocking_filter_idc_0 = 2 +u32DeltaQP_0 = 0 +s32IPQPDelta_0 = 4 +slice_alpha_c0_offset_div2_0 = 5 +slice_beta_offset_div2_0 = 5 +ThreshI_0 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_0 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_1 = -6 +disable_deblocking_filter_idc_1 = 2 +u32DeltaQP_1 = 1 +s32IPQPDelta_1 = 4 +slice_alpha_c0_offset_div2_1 = 5 +slice_beta_offset_div2_1 = 5 +ThreshI_1 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_1 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_2 = -4 +disable_deblocking_filter_idc_2 = 2 +u32DeltaQP_2 = 0 +s32IPQPDelta_2 = 4 +slice_alpha_c0_offset_div2_2 = 1 +slice_beta_offset_div2_2 = 1 +ThreshI_2 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_2 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_3 = 0 +disable_deblocking_filter_idc_3 = 1 +u32DeltaQP_3 = 0 +s32IPQPDelta_3 = 2 +slice_alpha_c0_offset_div2_3 = 0 +slice_beta_offset_div2_3 = 0 +ThreshI_3 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_3 = 7|7|7|7|7|9|9|9|12|15|18|25| + +[h265venc] +vencBitrateCount = 2 +vencBitrateThresh = 1024|2049| + +ThreshI_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_0 = 1 +s32IPQPDelta_0 = 1 + +ThreshI_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_1 = 1 +s32IPQPDelta_1 = 4 + +;²ʡع +ExpCount = 2 +ExpThresh = 8000|300000| +;I֡intraģʽѡ +u8NormIntra4RdCost_I_0 = 0|0| +u8NormIntra8RdCost_I_0 = 0|0| +u8NormIntra16RdCost_I_0 = 0|0| +u8NormIntra32RdCost_I_0 = 0|0| +u8SkinIntra4RdCost_I_0 = 0|0| +u8SkinIntra8RdCost_I_0 = 0|0| +u8SkinIntra16RdCost_I_0 = 0|2| +u8SkinIntra32RdCost_I_0 = 0|1| +u8HedgeIntra4RdCost_I_0 = 0|0| +u8HedgeIntra8RdCost_I_0 = 4|3| +u8HedgeIntra16RdCost_I_0 = 1|1| +u8HedgeIntra32RdCost_I_0 = 15|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_0 = 0|0| +u8NormIntra8RdCost_P_0 = 0|0| +u8NormIntra16RdCost_P_0 = 3|0| +u8NormIntra32RdCost_P_0 = 0|0| +u8SkinIntra4RdCost_P_0 = 0|0| +u8SkinIntra8RdCost_P_0 = 0|0| +u8SkinIntra16RdCost_P_0 = 0|2| +u8SkinIntra32RdCost_P_0 = 0|1| +u8HedgeIntra4RdCost_P_0 = 0|0| +u8HedgeIntra8RdCost_P_0 = 4|3| +u8HedgeIntra16RdCost_P_0 = 2|1| +u8HedgeIntra32RdCost_P_0 = 3|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_0 = 0|4| +u8NormFme16RdCost_P_0 = 0|0| +u8NormFme32RdCost_P_0 = 0|0| +u8NormFme64RdCost_P_0 = 0|0| +u8SkinFme8RdCost_P_0 = 0|0| +u8SkinFme16RdCost_P_0 = 0|0| +u8SkinFme32RdCost_P_0 = 4|4| +u8SkinFme64RdCost_P_0 = 2|2| +u8HedgeFme8RdCost_P_0 = 3|4| +u8HedgeFme16RdCost_P_0 = 3|4| +u8HedgeFme32RdCost_P_0 = 3|3| +u8HedgeFme64RdCost_P_0 = 2|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_0 = 0|4| +u8NormMerg16RdCost_P_0 = 0|0| +u8NormMerg32RdCost_P_0 = 0|0| +u8NormMerg64RdCost_P_0 = 0|0| +u8SkinMerg8RdCost_P_0 = 0|0| +u8SkinMerg16RdCost_P_0 = 0|0| +u8SkinMerg32RdCost_P_0 = 4|4| +u8SkinMerg64RdCost_P_0 = 2|2| +u8HedgeMerg8RdCost_P_0 = 3|4| +u8HedgeMerg16RdCost_P_0 = 3|4| +u8HedgeMerg32RdCost_P_0 = 3|3| +u8HedgeMerg64RdCost_P_0 = 2|2| +;I֡ɫ㷨 +bSkinEn_I_0 = 0|1| +u32SkinQpDelta_I_0 = 3|3| +u8SkinUMax_I_0 = 100|100| +u8SkinUMin_I_0 = 127|127| +u8SkinVMax_I_0 = 135|135| +u8SkinVMin_I_0 = 160|160| +u32SkinNum_I_0 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_0 = 0|1| +u32SkinQpDelta_P_0 = 3|3| +u8SkinUMax_P_0 = 100|100| +u8SkinUMin_P_0 = 127|127| +u8SkinVMax_P_0 = 135|135| +u8SkinVMin_P_0 = 160|160| +u32SkinNum_P_0 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_0 = 30|25| +u8HedgeCnt_I_0 = 4|4| +bStroEdgeEn_I_0 = 1|1| +u32StroEdgeQpDelta_I_0 = 1|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_0 = 30|25| +u8HedgeCnt_P_0 = 4|4| +bStroEdgeEn_P_0 = 1|1| +u32StroEdgeQpDelta_P_0 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_0 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_0 = 1|1| +u32Norm32MaxNum_P_0 = 4|4| +u32Norm16MaxNum_P_0 = 3|3| +u32Norm32ProtectNum_P_0 = 256|256| +u32Norm16ProtectNum_P_0 = 64|64| +u32Skin32MaxNum_P_0 = 8|8| +u32Skin16MaxNum_P_0 = 6|6| +u32Skin32ProtectNum_P_0 = 32|32| +u32Skin16ProtectNum_P_0 = 16|16| +u32Still32MaxNum_P_0 = 8|8| +u32Still16MaxNum_P_0 = 6|6| +u32Still32ProtectNum_P_0 = 64|16| +u32Still16ProtectNum_P_0 = 8|8| +u32Hedge32MaxNum_P_0 = 8|8| +u32Hedge16MaxNum_P_0 = 6|6| +u32Hedge32ProtectNum_P_0 = 32|32| +u32Hedge16ProtectNum_P_0 = 16|16| + +;I֡intraģʽѡ +u8NormIntra4RdCost_I_1 = 10|0| +u8NormIntra8RdCost_I_1 = 0|0| +u8NormIntra16RdCost_I_1 = 0|0| +u8NormIntra32RdCost_I_1 = 0|0| +u8SkinIntra4RdCost_I_1 = 0|0| +u8SkinIntra8RdCost_I_1 = 0|0| +u8SkinIntra16RdCost_I_1 = 0|2| +u8SkinIntra32RdCost_I_1 = 0|1| +u8HedgeIntra4RdCost_I_1 = 3|0| +u8HedgeIntra8RdCost_I_1 = 0|3| +u8HedgeIntra16RdCost_I_1 = 0|1| +u8HedgeIntra32RdCost_I_1 = 0|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_1 = 0|0| +u8NormIntra8RdCost_P_1 = 1|0| +u8NormIntra16RdCost_P_1 = 15|0| +u8NormIntra32RdCost_P_1 = 15|0| +u8SkinIntra4RdCost_P_1 = 0|0| +u8SkinIntra8RdCost_P_1 = 0|0| +u8SkinIntra16RdCost_P_1 = 0|2| +u8SkinIntra32RdCost_P_1 = 0|1| +u8HedgeIntra4RdCost_P_1 = 0|0| +u8HedgeIntra8RdCost_P_1 = 1|3| +u8HedgeIntra16RdCost_P_1 = 15|1| +u8HedgeIntra32RdCost_P_1 = 15|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_1 = 4|4| +u8NormFme16RdCost_P_1 = 0|0| +u8NormFme32RdCost_P_1 = 0|0| +u8NormFme64RdCost_P_1 = 0|0| +u8SkinFme8RdCost_P_1 = 0|0| +u8SkinFme16RdCost_P_1 = 0|0| +u8SkinFme32RdCost_P_1 = 4|4| +u8SkinFme64RdCost_P_1 = 2|2| +u8HedgeFme8RdCost_P_1 = 0|4| +u8HedgeFme16RdCost_P_1 = 0|4| +u8HedgeFme32RdCost_P_1 = 1|3| +u8HedgeFme64RdCost_P_1 = 1|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_1 = 4|4| +u8NormMerg16RdCost_P_1 = 0|0| +u8NormMerg32RdCost_P_1 = 0|0| +u8NormMerg64RdCost_P_1 = 0|0| +u8SkinMerg8RdCost_P_1 = 0|0| +u8SkinMerg16RdCost_P_1 = 0|0| +u8SkinMerg32RdCost_P_1 = 4|4| +u8SkinMerg64RdCost_P_1 = 2|2| +u8HedgeMerg8RdCost_P_1 = 0|4| +u8HedgeMerg16RdCost_P_1 = 0|4| +u8HedgeMerg32RdCost_P_1 = 1|3| +u8HedgeMerg64RdCost_P_1 = 1|2| +;I֡ɫ㷨 +bSkinEn_I_1 = 0|1| +u32SkinQpDelta_I_1 = 3|3| +u8SkinUMax_I_1 = 100|100| +u8SkinUMin_I_1 = 127|127| +u8SkinVMax_I_1 = 135|135| +u8SkinVMin_I_1 = 160|160| +u32SkinNum_I_1 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_1 = 0|1| +u32SkinQpDelta_P_1 = 3|3| +u8SkinUMax_P_1 = 100|100| +u8SkinUMin_P_1 = 127|127| +u8SkinVMax_P_1 = 135|135| +u8SkinVMin_P_1 = 160|160| +u32SkinNum_P_1 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_1 = 25|25| +u8HedgeCnt_I_1 = 4|4| +bStroEdgeEn_I_1 = 1|1| +u32StroEdgeQpDelta_I_1 = 0|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_1 = 25|25| +u8HedgeCnt_P_1 = 4|4| +bStroEdgeEn_P_1 = 1|1| +u32StroEdgeQpDelta_P_1 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_1 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_1 = 1|1| +u32Norm32MaxNum_P_1 = 4|4| +u32Norm16MaxNum_P_1 = 3|3| +u32Norm32ProtectNum_P_1 = 256|256| +u32Norm16ProtectNum_P_1 = 64|64| +u32Skin32MaxNum_P_1 = 8|8| +u32Skin16MaxNum_P_1 = 6|6| +u32Skin32ProtectNum_P_1 = 32|32| +u32Skin16ProtectNum_P_1 = 16|16| +u32Still32MaxNum_P_1 = 8|8| +u32Still16MaxNum_P_1 = 6|6| +u32Still32ProtectNum_P_1 = 16|16| +u32Still16ProtectNum_P_1 = 8|8| +u32Hedge32MaxNum_P_1 = 8|8| +u32Hedge16MaxNum_P_1 = 6|6| +u32Hedge32ProtectNum_P_1 = 32|32| +u32Hedge16ProtectNum_P_1 = 16|16| + +[3dnr] +datafile=iso.4682.bin +irdatafile=iso.4682.bin +hlcdatafile=iso.4682.bin + +hlctimes = 2048 ;1024Ӧ12048Ӧ2 +drctimes = 2048 +irtimes = 2048 + +3dnrExpCount = 10 +3dnrExpThresh = 400|2000|10000|20000|50000|60000|100000|200000|800000| ;عλ*ʱ(΢) + + +[BLC] +AEStrategyMode = 1 +HistRatioSlope = 32 +MaxHistOffset = 64 + +[DYNAMIC] +TotalNum_normal = 7 +TotalNum_fast = 7 + +IntTime_normal = 2|20000|20000|20000|20000|40000|40000| +IntTime_fast = 2|2000|2000|5000|5000|40000|40000| + +SysGain_normal = 1024|1024|1500|1500|3072|3072|16777216| +SysGain_fast = 1024|1024|2048|2048|5120|5120|16777216| + +[HLC] +DCIEnable = 0 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +ExpCompensation = 16 +WhiteDelayFrame = 0 +BlackDelayFrame = 0 +u8Speed = 32 +HistRatioSlope = 128 +MaxHistOffset = 6 +u8Tolerance = 6 +Saturation = 120,116,104,96,88,80,72,64,56,56,56,56,56,56,56,56, +gamma_0 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma_2 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +[IR] +ExpCompensation = 50 +u16HistRatioSlope = 64 +BlackDelayFrame = 30 +WhiteDelayFrame = 30 +MaxHistOffset = 20 +u8Tolerance = 3 +u8Speed = 16 +DCIEnable = 1 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +IRu16Slope = 768 +au8LumThresh = 96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96, +au8SharpenD = 92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92, +au8SharpenRGB = 112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, +au8SharpenUd = 86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86, +gamma_0 = 0,76,154,234,313,390,463,531,592,646,694,736,775,812,847,881,916,951,984,1016,1047,1077,1107,1137,1168,1200,1231,1263,1294,1325,1356,1387,1417,1448,1478,1508,1537,1567,1595,1624,1651,1677,1702,1727,1752,1777,1803,1828,1854,1880,1906,1932,1958,1984,2010,2036,2062,2087,2112,2137,2161,2185,2209,2232,2255,2277,2299,2321,2342,2363,2383,2404,2424,2443,2463,2482,2501,2520,2539,2557,2576,2594,2612,2630,2648,2665,2682, +gamma_1 = 2699,2716,2733,2749,2766,2782,2799,2815,2831,2847,2863,2879,2895,2911,2927,2942,2958,2974,2989,3004,3019,3034,3049,3063,3078,3092,3106,3120,3133,3147,3160,3173,3186,3199,3212,3224,3237,3249,3262,3274,3286,3298,3310,3322,3334,3346,3357,3369,3381,3392,3403,3414,3425,3436,3447,3457,3468,3478,3488,3498,3507,3517,3526,3535,3544,3552,3561,3569,3578,3586,3595,3603,3612,3620,3628,3637,3645,3654,3662,3671,3679,3687,3695,3703,3711, +gamma_2 = 3719,3727,3734,3741,3748,3755,3761,3768,3774,3780,3786,3791,3797,3802,3808,3813,3818,3823,3828,3833,3838,3843,3847,3852,3856,3860,3864,3868,3872,3876,3880,3884,3887,3891,3895,3899,3903,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3967,3971,3975,3978,3982,3985,3989,3992,3996,4000,4003,4007,4010,4014,4018,4022,4026,4030,4034,4038,4043,4047,4051,4056,4060,4065,4069,4074,4078,4083,4087,4092,4095 + +[DRC] +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +DRCu16BrightGainLmt = 127 +DRCu16DarkGainLmtC = 127 +DRCu16DarkGainLmtY = 127 +DRCu8Asymmetry = 2 +DRCu8LocalMixingBrigtht = 45 +DRCu8LocalMixingDark = 45 +DRCu8LocalMixingThres = 2 +DRCu8RangeVar = 0 +DRCu8SecondPole = 180 +DRCu8SpatialVar = 10 +DRCu8Stretch = 54 + + + + + diff --git a/device/mpp/sample/scene_auto/ini/IPC/sceneauto_9m034.ini b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_9m034.ini new file mode 100644 index 0000000..d1a4883 --- /dev/null +++ b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_9m034.ini @@ -0,0 +1,833 @@ +[common] +IspDev = 0 +ViDev = 0 +ViChn = 0 +VpssGrp = 0 +VpssChn = 0 +VencGrp = 0 +VencChn = 0 + +IVE_Enable = 0; + +HLC_AutoEnable = 0; +HLC_thr_off = 140000 ;threshold value for HLC auto off +HLC_thr_on = 150000 ;threshold value for HLC auto on +HLC_tolerance = 3000 +HLC_expthr = 6000 +HLC_count = 5 + +ave_lum_thresh = 30 +delta_dis_expthresh = 20 +dci_strength_lut = 32,33,33,34,34,35,35,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,48,48,49,49,50,50,50,49,49,49,49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32 + +exposure_thr_indoor = 10000 +exposure_thr_outdoor = 100 + +fpn_exp_thresh = 200000 ;threshold value for fpn auto on + +u32DRCStrengthThresh = 48 + +[AE] +aeRunInterval = 2 +aeBitrateCount = 3 ;the counts of bitrate level +aeBitrateThresh = 1024|4060|8159| ;threshold value for each bitrate level + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 0 of bitrate +u8Speed_0 = 64 +u8Tolerance_0 = 3 +u16BlackDelayFrame_0 = 25 +u16WhiteDelayFrame_0 = 15 +u32SysGainMax_0 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 1 of bitrate +u8Speed_1 = 64 +u8Tolerance_1 = 3 +u16BlackDelayFrame_1 = 15 +u16WhiteDelayFrame_1 = 10 +u32SysGainMax_1 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 2 of bitrate +u8Speed_2 = 64 +u8Tolerance_2 = 2 +u16BlackDelayFrame_2 = 0 +u16WhiteDelayFrame_2 = 0 +u32SysGainMax_2 = 8192000 + +aeExpCount = 5 ;the counts of exposure level +aeExpDtoLThresh = 6000|30000|240000|800000|8000000| ;threshold value for each exposure level from dark to light +aeExpLtoDThresh = 8000|40000|300000|1000000|10000000| ;threshold value for each exposure level from light to dark + +;AE compesation and histoffset for each level of exposure +aeCompesation = 62|56|56|48|48| +aeHistOffset = 12|12|20|20|20| + +[sharpen] +IsoThresh = 200 +ExpCount = 2 +ExpThresh = 2000|10000 + +abEnLowLumaShoot_0 = 0|0|0|0|1|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_0 = 25|25|28|28|30|30|30|35|40|40|40|50|50|50|50|50 ; +SharpenUd_0 = 35|30|30|30|30|30|30|25|21|15|12|12|12|12|12|12 ; +TextureNoiseThd_0 = 10|10|12|14|16|18|20|22|24|26|28|30|30|30|30|30 ; +EdgeNoiseThd_0 = 10|10|12|14|16|18|20|22|24|26|28|30|30|30|30|30 ; +overshoot_0 = 180|150|120|110|110|60|40|30|20|10|0|0|0|0|0|0 ; +undershoot_0 = 200|180|160|160|200|200|200|200|200|220|255|255|255|255|255|255 ; + +abEnLowLumaShoot_1 = 0|0|0|0|1|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_1 = 25|25|28|28|30|30|30|35|40|40|40|50|50|50|50|50 ; +SharpenUd_1 = 35|30|30|30|30|30|30|25|21|15|12|12|12|12|12|12 ; +TextureNoiseThd_1 = 10|10|12|14|16|18|20|22|24|26|28|30|30|30|30|30 ; +EdgeNoiseThd_1 = 10|10|12|14|16|18|20|22|24|26|28|30|30|30|30|30 ; +overshoot_1 = 150|130|120|110|110|60|40|30|20|10|0|0|0|0|0|0 ; +undershoot_1 = 160|160|160|160|200|200|200|200|200|220|255|255|255|255|255|255 ; + + +[gamma] +DelayCount = 1 +Interval = 10 +ExpCount = 4 +ExpThreshLtoD = 8000|40000|400000|4000000| +ExpThreshDtoL = 6000|35000|350000|3200000| + +gamma.0_0 = 0,180,320,426,516,590,660,730,786,844,896,946,994,1040,1090,1130,1170,1210,1248,1296,1336,1372,1416,1452,1486,1516,1546,1580,1616,1652,1678,1714,1742,1776,1798,1830,1862,1886,1912,1940,1968,1992,2010,2038,2062,2090,2114,2134,2158,2178,2202,2222,2246,2266,2282,2300,2324,2344,2360,2372,2390,2406,2422,2438,2458,2478,2494,2510,2526,2546,2562,2582,2598,2614,2630,2648,2660,2670,2682,2698,2710,2724,2736,2752,2764,2780,2792,2808,2820,2836, +gamma.1_0 = 2848,2864,2876,2888,2896,2908,2920,2928,2940,2948,2960,2972,2984,2992,3004,3014,3028,3036,3048,3056,3068,3080,3088,3100,3110,3120,3128,3140,3148,3160,3168,3174,3182,3190,3202,3210,3218,3228,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3530,3538,3546,3554,3558,3564,3570,3574,3582,3590,3598,3604,3610,3618,3628,3634,3640,3644,3652, +gamma.2_0 = 3656,3664,3670,3678,3688,3696,3700,3708,3712,3716,3722,3730,3736,3740,3748,3752,3756,3760,3766,3774,3778,3786,3790,3800,3808,3812,3816,3824,3830,3832,3842,3846,3850,3854,3858,3862,3864,3870,3874,3878,3882,3888,3894,3900,3908,3912,3918,3924,3928,3934,3940,3946,3952,3958,3966,3974,3978,3982,3986,3990,3994,4002,4006,4010,4018,4022,4032,4038,4046,4050,4056,4062,4072,4076,4084,4090,4095 + +gamma.0_1 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_1 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +gamma.0_2 = 0,90,181,272,363,452,541,606,669,731,794,856,920,986,1055,1086,1118,1149,1181,1213,1246,1279,1312,1345,1379,1413,1447,1483,1518,1554,1591,1628,1666,1688,1710,1733,1756,1780,1804,1828,1852,1877,1902,1928,1953,1978,2004,2029,2055,2080,2106,2131,2156,2181,2206,2230,2254,2277,2301,2323,2346,2367,2389,2409,2429,2448,2467,2486,2505,2523,2540,2558,2575,2592,2608,2625,2641,2656,2672,2687,2702,2717,2732,2746,2760,2774,2788,2802,2816,2829,2842, +gamma.1_2 = 2856,2869,2882,2895,2907,2920,2933,2945,2957,2968,2980,2991,3002,3013,3023,3034,3044,3054,3064,3074,3083,3093,3102,3112,3121,3130,3139,3148,3157,3166,3175,3185,3194,3203,3212,3221,3231,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3534,3541,3549,3556,3563,3571,3578,3585,3591,3598,3605,3612,3618,3625,3631,3638,3644,3650, +gamma.2_2 = 3657,3663,3669,3675,3681,3687,3694,3700,3706,3712,3718,3724,3730,3736,3742,3748,3754,3760,3766,3771,3777,3783,3789,3794,3800,3805,3811,3816,3822,3827,3833,3838,3844,3849,3855,3860,3865,3871,3876,3882,3887,3893,3898,3904,3909,3915,3921,3926,3932,3937,3943,3949,3954,3960,3966,3971,3977,3982,3988,3994,3999,4005,4011,4016,4022,4027,4033,4039,4044,4050,4056,4061,4067,4072,4078,4084,4089,4095, + +gamma.0_3 = 0,87,176,266,354,440,523,600,656,707,755,801,846,892,939,988,1040,1071,1103,1136,1169,1203,1237,1271,1306,1341,1376,1411,1446,1481,1516,1550,1584,1635,1676,1710,1740,1769,1800,1835,1865,1895,1924,1955,1986,2018,2052,2089,2128,2151,2176,2202,2229,2256,2285,2313,2342,2372,2400,2429,2457,2484,2510,2536,2560,2582,2605,2626,2647,2668,2688,2707,2727,2745,2764,2782,2800,2818,2835,2852,2870,2887,2904,2920,2936,2952,2968,2983,2998,3013,3028, +gamma.1_3 = 3043,3057,3071,3085,3098,3112,3125,3138,3150,3162,3174,3186,3198,3209,3220,3231,3242,3253,3264,3276,3287,3298,3309,3320,3332,3343,3355,3366,3377,3389,3400,3411,3421,3432,3442,3452,3462,3472,3481,3490,3499,3508,3516,3525,3533,3541,3548,3556,3563,3570,3577,3584,3591,3598,3605,3611,3618,3624,3631,3637,3643,3649,3655,3661,3667,3672,3678,3684,3690,3696,3702,3708,3714,3720,3726,3732,3738,3744,3750,3756,3762,3768,3774,3779,3785,3790,3795, +gamma.2_3 = 3800,3805,3810,3815,3819,3824,3829,3833,3838,3842,3846,3851,3855,3860,3864,3868,3873,3877,3881,3886,3890,3894,3898,3902,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3966,3970,3974,3978,3981,3985,3989,3992,3995,3999,4002,4005,4008,4011,4014,4017,4020,4023,4026,4029,4032,4035,4038,4041,4044,4048,4051,4054,4058,4061,4065,4068,4072,4075,4079,4082,4086,4089,4093,4095, + + + +[h264venc] +vencBitrateCount = 4 +vencBitrateThresh = 513|1025|2049|4097| + +chroma_qp_index_offset_0 = 0 +disable_deblocking_filter_idc_0 = 2 +u32DeltaQP_0 = 0 +s32IPQPDelta_0 = 4 +slice_alpha_c0_offset_div2_0 = 5 +slice_beta_offset_div2_0 = 5 +ThreshI_0 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_0 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_1 = -6 +disable_deblocking_filter_idc_1 = 2 +u32DeltaQP_1 = 1 +s32IPQPDelta_1 = 4 +slice_alpha_c0_offset_div2_1 = 5 +slice_beta_offset_div2_1 = 5 +ThreshI_1 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_1 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_2 = -4 +disable_deblocking_filter_idc_2 = 2 +u32DeltaQP_2 = 0 +s32IPQPDelta_2 = 4 +slice_alpha_c0_offset_div2_2 = 1 +slice_beta_offset_div2_2 = 1 +ThreshI_2 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_2 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_3 = 0 +disable_deblocking_filter_idc_3 = 1 +u32DeltaQP_3 = 0 +s32IPQPDelta_3 = 2 +slice_alpha_c0_offset_div2_3 = 0 +slice_beta_offset_div2_3 = 0 +ThreshI_3 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_3 = 7|7|7|7|7|9|9|9|12|15|18|25| + +[h265venc] +vencBitrateCount = 2 +vencBitrateThresh = 1024|2049| + +ThreshI_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_0 = 1 +s32IPQPDelta_0 = 1 + +ThreshI_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_1 = 1 +s32IPQPDelta_1 = 4 + + +ExpCount = 2 +ExpThresh = 8000|300000| + +u8NormIntra4RdCost_I_0 = 0|0| +u8NormIntra8RdCost_I_0 = 0|0| +u8NormIntra16RdCost_I_0 = 0|0| +u8NormIntra32RdCost_I_0 = 0|0| +u8SkinIntra4RdCost_I_0 = 0|0| +u8SkinIntra8RdCost_I_0 = 0|0| +u8SkinIntra16RdCost_I_0 = 0|2| +u8SkinIntra32RdCost_I_0 = 0|1| +u8HedgeIntra4RdCost_I_0 = 0|0| +u8HedgeIntra8RdCost_I_0 = 4|3| +u8HedgeIntra16RdCost_I_0 = 1|1| +u8HedgeIntra32RdCost_I_0 = 15|15| + +u8NormIntra4RdCost_P_0 = 0|0| +u8NormIntra8RdCost_P_0 = 0|0| +u8NormIntra16RdCost_P_0 = 3|0| +u8NormIntra32RdCost_P_0 = 0|0| +u8SkinIntra4RdCost_P_0 = 0|0| +u8SkinIntra8RdCost_P_0 = 0|0| +u8SkinIntra16RdCost_P_0 = 0|2| +u8SkinIntra32RdCost_P_0 = 0|1| +u8HedgeIntra4RdCost_P_0 = 0|0| +u8HedgeIntra8RdCost_P_0 = 4|3| +u8HedgeIntra16RdCost_P_0 = 2|1| +u8HedgeIntra32RdCost_P_0 = 3|15| + +u8NormFme8RdCost_P_0 = 0|4| +u8NormFme16RdCost_P_0 = 0|0| +u8NormFme32RdCost_P_0 = 0|0| +u8NormFme64RdCost_P_0 = 0|0| +u8SkinFme8RdCost_P_0 = 0|0| +u8SkinFme16RdCost_P_0 = 0|0| +u8SkinFme32RdCost_P_0 = 4|4| +u8SkinFme64RdCost_P_0 = 2|2| +u8HedgeFme8RdCost_P_0 = 3|4| +u8HedgeFme16RdCost_P_0 = 3|4| +u8HedgeFme32RdCost_P_0 = 3|3| +u8HedgeFme64RdCost_P_0 = 2|2| + +u8NormMerg8RdCost_P_0 = 0|4| +u8NormMerg16RdCost_P_0 = 0|0| +u8NormMerg32RdCost_P_0 = 0|0| +u8NormMerg64RdCost_P_0 = 0|0| +u8SkinMerg8RdCost_P_0 = 0|0| +u8SkinMerg16RdCost_P_0 = 0|0| +u8SkinMerg32RdCost_P_0 = 4|4| +u8SkinMerg64RdCost_P_0 = 2|2| +u8HedgeMerg8RdCost_P_0 = 3|4| +u8HedgeMerg16RdCost_P_0 = 3|4| +u8HedgeMerg32RdCost_P_0 = 3|3| +u8HedgeMerg64RdCost_P_0 = 2|2| + +bSkinEn_I_0 = 0|1| +u32SkinQpDelta_I_0 = 3|3| +u8SkinUMax_I_0 = 100|100| +u8SkinUMin_I_0 = 127|127| +u8SkinVMax_I_0 = 135|135| +u8SkinVMin_I_0 = 160|160| +u32SkinNum_I_0 = 200|200| + +bSkinEn_P_0 = 0|1| +u32SkinQpDelta_P_0 = 3|3| +u8SkinUMax_P_0 = 100|100| +u8SkinUMin_P_0 = 127|127| +u8SkinVMax_P_0 = 135|135| +u8SkinVMin_P_0 = 160|160| +u32SkinNum_P_0 = 200|200| + +u8HedgeThr_I_0 = 30|25| +u8HedgeCnt_I_0 = 4|4| +bStroEdgeEn_I_0 = 1|1| +u32StroEdgeQpDelta_I_0 = 1|0| + +u8HedgeThr_P_0 = 30|25| +u8HedgeCnt_P_0 = 4|4| +bStroEdgeEn_P_0 = 1|1| +u32StroEdgeQpDelta_P_0 = 4|4| + +bImproveEn_I_0 = 0|0| + +bImproveEn_P_0 = 1|1| +u32Norm32MaxNum_P_0 = 4|4| +u32Norm16MaxNum_P_0 = 3|3| +u32Norm32ProtectNum_P_0 = 256|256| +u32Norm16ProtectNum_P_0 = 64|64| +u32Skin32MaxNum_P_0 = 8|8| +u32Skin16MaxNum_P_0 = 6|6| +u32Skin32ProtectNum_P_0 = 32|32| +u32Skin16ProtectNum_P_0 = 16|16| +u32Still32MaxNum_P_0 = 8|8| +u32Still16MaxNum_P_0 = 6|6| +u32Still32ProtectNum_P_0 = 64|16| +u32Still16ProtectNum_P_0 = 8|8| +u32Hedge32MaxNum_P_0 = 8|8| +u32Hedge16MaxNum_P_0 = 6|6| +u32Hedge32ProtectNum_P_0 = 32|32| +u32Hedge16ProtectNum_P_0 = 16|16| + +u8NormIntra4RdCost_I_1 = 10|0| +u8NormIntra8RdCost_I_1 = 0|0| +u8NormIntra16RdCost_I_1 = 0|0| +u8NormIntra32RdCost_I_1 = 0|0| +u8SkinIntra4RdCost_I_1 = 0|0| +u8SkinIntra8RdCost_I_1 = 0|0| +u8SkinIntra16RdCost_I_1 = 0|2| +u8SkinIntra32RdCost_I_1 = 0|1| +u8HedgeIntra4RdCost_I_1 = 3|0| +u8HedgeIntra8RdCost_I_1 = 0|3| +u8HedgeIntra16RdCost_I_1 = 0|1| +u8HedgeIntra32RdCost_I_1 = 0|15| + +u8NormIntra4RdCost_P_1 = 0|0| +u8NormIntra8RdCost_P_1 = 1|0| +u8NormIntra16RdCost_P_1 = 15|0| +u8NormIntra32RdCost_P_1 = 15|0| +u8SkinIntra4RdCost_P_1 = 0|0| +u8SkinIntra8RdCost_P_1 = 0|0| +u8SkinIntra16RdCost_P_1 = 0|2| +u8SkinIntra32RdCost_P_1 = 0|1| +u8HedgeIntra4RdCost_P_1 = 0|0| +u8HedgeIntra8RdCost_P_1 = 1|3| +u8HedgeIntra16RdCost_P_1 = 15|1| +u8HedgeIntra32RdCost_P_1 = 15|15| + +u8NormFme8RdCost_P_1 = 4|4| +u8NormFme16RdCost_P_1 = 0|0| +u8NormFme32RdCost_P_1 = 0|0| +u8NormFme64RdCost_P_1 = 0|0| +u8SkinFme8RdCost_P_1 = 0|0| +u8SkinFme16RdCost_P_1 = 0|0| +u8SkinFme32RdCost_P_1 = 4|4| +u8SkinFme64RdCost_P_1 = 2|2| +u8HedgeFme8RdCost_P_1 = 0|4| +u8HedgeFme16RdCost_P_1 = 0|4| +u8HedgeFme32RdCost_P_1 = 1|3| +u8HedgeFme64RdCost_P_1 = 1|2| + +u8NormMerg8RdCost_P_1 = 4|4| +u8NormMerg16RdCost_P_1 = 0|0| +u8NormMerg32RdCost_P_1 = 0|0| +u8NormMerg64RdCost_P_1 = 0|0| +u8SkinMerg8RdCost_P_1 = 0|0| +u8SkinMerg16RdCost_P_1 = 0|0| +u8SkinMerg32RdCost_P_1 = 4|4| +u8SkinMerg64RdCost_P_1 = 2|2| +u8HedgeMerg8RdCost_P_1 = 0|4| +u8HedgeMerg16RdCost_P_1 = 0|4| +u8HedgeMerg32RdCost_P_1 = 1|3| +u8HedgeMerg64RdCost_P_1 = 1|2| + +bSkinEn_I_1 = 0|1| +u32SkinQpDelta_I_1 = 3|3| +u8SkinUMax_I_1 = 100|100| +u8SkinUMin_I_1 = 127|127| +u8SkinVMax_I_1 = 135|135| +u8SkinVMin_I_1 = 160|160| +u32SkinNum_I_1 = 200|200| + +bSkinEn_P_1 = 0|1| +u32SkinQpDelta_P_1 = 3|3| +u8SkinUMax_P_1 = 100|100| +u8SkinUMin_P_1 = 127|127| +u8SkinVMax_P_1 = 135|135| +u8SkinVMin_P_1 = 160|160| +u32SkinNum_P_1 = 200|200| + +u8HedgeThr_I_1 = 25|25| +u8HedgeCnt_I_1 = 4|4| +bStroEdgeEn_I_1 = 1|1| +u32StroEdgeQpDelta_I_1 = 0|0| + +u8HedgeThr_P_1 = 25|25| +u8HedgeCnt_P_1 = 4|4| +bStroEdgeEn_P_1 = 1|1| +u32StroEdgeQpDelta_P_1 = 4|4| + +bImproveEn_I_1 = 0|0| + +bImproveEn_P_1 = 1|1| +u32Norm32MaxNum_P_1 = 4|4| +u32Norm16MaxNum_P_1 = 3|3| +u32Norm32ProtectNum_P_1 = 256|256| +u32Norm16ProtectNum_P_1 = 64|64| +u32Skin32MaxNum_P_1 = 8|8| +u32Skin16MaxNum_P_1 = 6|6| +u32Skin32ProtectNum_P_1 = 32|32| +u32Skin16ProtectNum_P_1 = 16|16| +u32Still32MaxNum_P_1 = 8|8| +u32Still16MaxNum_P_1 = 6|6| +u32Still32ProtectNum_P_1 = 16|16| +u32Still16ProtectNum_P_1 = 8|8| +u32Hedge32MaxNum_P_1 = 8|8| +u32Hedge16MaxNum_P_1 = 6|6| +u32Hedge32ProtectNum_P_1 = 32|32| +u32Hedge16ProtectNum_P_1 = 16|16| + +[3dnr] +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 48 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 48 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 12 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 0 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[BLC] +AEStrategyMode = 1 +HistRatioSlope = 32 +MaxHistOffset = 64 + +[DYNAMIC] +TotalNum_normal = 7 +TotalNum_fast = 7 + +IntTime_normal = 2|20000|20000|20000|20000|40000|40000| +IntTime_fast = 2|2000|2000|5000|5000|40000|40000| + +SysGain_normal = 1024|1024|1500|1500|3072|3072|16777216| +SysGain_fast = 1024|1024|2048|2048|5120|5120|16777216| + +[HLC] +DCIEnable = 0 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 72 +ExpCompensation = 16 +WhiteDelayFrame = 0 +BlackDelayFrame = 0 +u8Speed = 32 +HistRatioSlope = 128 +MaxHistOffset = 6 +u8Tolerance = 6 +Saturation = 120,116,104,96,88,80,72,64,56,56,56,56,56,56,56,56, +abEnLowLumaShoot = 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 +u8SharpenD = 25,25,28,28,30,30,30,35,40,40,40,50,50,50,50,50 +u8SharpenUd = 35,30,30,30,30,30,30,25,21,15,12,12,12,12,12,12 +u8TextureNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8EdgeNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8OverShoot = 150,130,120,110,60,40,30,20,10,0,0,0,0,0,0,0 +u8UnderShoot = 160,160,160,160,200,200,200,200,200,220,255,255,255,255,255,255 +gamma_0 = 0,61,123,187,250,315,380,445,511,577,643,709,775,841,906,971,1035,1098,1161,1222,1283,1342,1400,1457,1512,1565,1617,1667,1714,1760,1796,1831,1865,1897,1928,1958,1987,2015,2042,2068,2094,2118,2142,2165,2187,2209,2230,2251,2271,2291,2311,2331,2350,2369,2388,2407,2426,2445,2465,2484,2504,2524,2544,2565,2586,2598,2609,2621,2633,2644,2656,2667,2679,2690,2702,2713,2725,2736,2747,2758,2770,2781,2792,2803,2814,2825,2836,2847,2858,2869,2880, +gamma_1 = 2891,2901,2912,2923,2934,2944,2955,2965,2976,2986,2997,3007,3018,3028,3038,3048,3059,3069,3079,3089,3099,3109,3119,3129,3139,3149,3158,3168,3178,3187,3197,3207,3216,3226,3235,3244,3254,3263,3272,3281,3291,3300,3309,3318,3327,3336,3345,3354,3363,3372,3380,3389,3398,3407,3415,3424,3432,3441,3450,3458,3466,3475,3483,3491,3500,3508,3516,3524,3532,3540,3548,3556,3564,3572,3580,3587,3595,3603,3610,3618,3626,3633,3641,3648,3655,3663,3670,3677, +gamma_2 = 3684,3691,3698,3705,3712,3719,3726,3733,3740,3747,3753,3760,3766,3773,3779,3786,3792,3798,3804,3810,3816,3822,3828,3834,3839,3845,3851,3856,3861,3867,3872,3877,3882,3888,3893,3898,3903,3908,3912,3917,3922,3927,3932,3936,3941,3946,3950,3955,3960,3964,3969,3973,3978,3983,3987,3992,3996,4001,4005,4010,4014,4019,4023,4028,4033,4037,4042,4047,4051,4056,4061,4066,4070,4075,4080,4085,4090,4095, + +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[IR] +ExpCount = 4 +ExpThreshHtoL = 600000|1800000|4000000|7000000| +ExpThreshLtoH = 700000|2200000|5000000|8000000| +ExpCompensation = 50|48|38|32| +MaxHistOffset = 20|18|14|10| + +u16HistRatioSlope = 64 +BlackDelayFrame = 30 +WhiteDelayFrame = 30 + +u8Tolerance = 3 +u8Speed = 16 +DCIEnable = 1 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +IRu16Slope = 0,0,0,0,1,1,2,2,2,3,3,3,3,3,3,3 +abEnLowLumaShoot = 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 +u8SharpenD = 25,25,28,28,30,30,30,35,40,40,40,50,50,50,50,50 +u8SharpenUd = 35,30,30,30,30,30,30,25,21,15,12,12,12,12,12,12 +u8TextureNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8EdgeNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8OverShoot = 150,130,120,110,60,40,30,20,10,0,0,0,0,0,0,0 +u8UnderShoot = 160,160,160,160,200,200,200,200,200,220,255,255,255,255,255,255 + +gamma_0 = 0,76,154,234,313,390,463,531,592,646,694,736,775,812,847,881,916,951,984,1016,1047,1077,1107,1137,1168,1200,1231,1263,1294,1325,1356,1387,1417,1448,1478,1508,1537,1567,1595,1624,1651,1677,1702,1727,1752,1777,1803,1828,1854,1880,1906,1932,1958,1984,2010,2036,2062,2087,2112,2137,2161,2185,2209,2232,2255,2277,2299,2321,2342,2363,2383,2404,2424,2443,2463,2482,2501,2520,2539,2557,2576,2594,2612,2630,2648,2665,2682, +gamma_1 = 2699,2716,2733,2749,2766,2782,2799,2815,2831,2847,2863,2879,2895,2911,2927,2942,2958,2974,2989,3004,3019,3034,3049,3063,3078,3092,3106,3120,3133,3147,3160,3173,3186,3199,3212,3224,3237,3249,3262,3274,3286,3298,3310,3322,3334,3346,3357,3369,3381,3392,3403,3414,3425,3436,3447,3457,3468,3478,3488,3498,3507,3517,3526,3535,3544,3552,3561,3569,3578,3586,3595,3603,3612,3620,3628,3637,3645,3654,3662,3671,3679,3687,3695,3703,3711, +gamma_2 = 3719,3727,3734,3741,3748,3755,3761,3768,3774,3780,3786,3791,3797,3802,3808,3813,3818,3823,3828,3833,3838,3843,3847,3852,3856,3860,3864,3868,3872,3876,3880,3884,3887,3891,3895,3899,3903,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3967,3971,3975,3978,3982,3985,3989,3992,3996,4000,4003,4007,4010,4014,4018,4022,4026,4030,4034,4038,4043,4047,4051,4056,4060,4065,4069,4074,4078,4083,4087,4092,4095 + +expweight_0 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_1 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_2 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_3 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_4 =1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1, +expweight_5 =1,1,1,1,1,2,3,3,3,3,3,1,1,1,1,1,1, +expweight_6 =1,1,1,1,2,3,4,4,4,4,4,3,2,1,1,1,1, +expweight_7 =1,1,1,2,3,4,4,4,4,4,4,4,3,2,1,1,1, +expweight_8 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_9 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_10 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_11 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_12 =1,1,1,1,2,3,3,3,3,3,3,3,2,1,1,1,1, +expweight_13 =1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1, +expweight_14 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[DRC] +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +DRCu16BrightGainLmt = 127 +DRCu16DarkGainLmtC = 127 +DRCu16DarkGainLmtY = 127 +DRCu8Asymmetry = 2 +DRCu8LocalMixingBrigtht = 45 +DRCu8LocalMixingDark = 45 +DRCu8LocalMixingThres = 2 +DRCu8RangeVar = 0 +DRCu8SecondPole = 180 +DRCu8SpatialVar = 10 +DRCu8Stretch = 54 + + + + + diff --git a/device/mpp/sample/scene_auto/ini/IPC/sceneauto_9m034_wdr.ini b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_9m034_wdr.ini new file mode 100644 index 0000000..c8780e7 --- /dev/null +++ b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_9m034_wdr.ini @@ -0,0 +1,833 @@ +[common] +IspDev = 0 +ViDev = 0 +ViChn = 0 +VpssGrp = 0 +VpssChn = 0 +VencGrp = 0 +VencChn = 0 + +IVE_Enable = 0; + +HLC_AutoEnable = 0; +HLC_thr_off = 140000 ;threshold value for HLC auto off +HLC_thr_on = 150000 ;threshold value for HLC auto on +HLC_tolerance = 3000 +HLC_expthr = 6000 +HLC_count = 5 + +ave_lum_thresh = 30 +delta_dis_expthresh = 20 +dci_strength_lut = 32,33,33,34,34,35,35,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,48,48,49,49,50,50,50,49,49,49,49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32 + +exposure_thr_indoor = 10000 +exposure_thr_outdoor = 100 + +fpn_exp_thresh = 200000 ;threshold value for fpn auto on + +u32DRCStrengthThresh = 256 + +[AE] +aeRunInterval = 1 +aeBitrateCount = 3 ;the counts of bitrate level +aeBitrateThresh = 1024|4060|8159| ;threshold value for each bitrate level + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 0 of bitrate +u8Speed_0 = 64 +u8Tolerance_0 = 3 +u16BlackDelayFrame_0 = 25 +u16WhiteDelayFrame_0 = 15 +u32SysGainMax_0 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 1 of bitrate +u8Speed_1 = 64 +u8Tolerance_1 = 3 +u16BlackDelayFrame_1 = 15 +u16WhiteDelayFrame_1 = 10 +u32SysGainMax_1 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 2 of bitrate +u8Speed_2 = 64 +u8Tolerance_2 = 2 +u16BlackDelayFrame_2 = 0 +u16WhiteDelayFrame_2 = 0 +u32SysGainMax_2 = 8192000 + +aeExpCount = 5 ;the counts of exposure level +aeExpDtoLThresh = 6000|30000|240000|800000|8000000| ;threshold value for each exposure level from dark to light +aeExpLtoDThresh = 8000|40000|300000|1000000|10000000| ;threshold value for each exposure level from light to dark + +;AE compesation and histoffset for each level of exposure +aeCompesation = 64|64|64|64|64| +aeHistOffset = 128|128|128|128|128| + +[sharpen] +IsoThresh = 200 +ExpCount = 2 +ExpThresh = 2000|10000 + +abEnLowLumaShoot_0 = 0|0|0|0|1|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_0 = 35|40|45|45|50|40|40|45|45|45|40|40|40|40|40|40; +SharpenUd_0 = 40|45|50|55|50|45|40|40|40|40|43|50|50|50|50|50; +TextureNoiseThd_0 = 10|10|12|14|16|18|20|22|24|26|28|30|30|30|30|30 ; +EdgeNoiseThd_0 = 10|10|12|14|16|14|12|8|4|8|12|16|24|30|30|30 ; +overshoot_0 = 50|50|60|60|60|60|60|70|70|80|80|80|80|80|80|80; +undershoot_0 = 150|150|150|140|140|140|140|150|160|170|200|200|200|200|200|200; + +abEnLowLumaShoot_1 = 0|0|0|0|1|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_1 = 35|40|45|45|50|40|40|45|45|45|40|40|40|40|40|40; +SharpenUd_1 = 40|45|50|55|50|45|40|40|40|40|43|50|50|50|50|50; +TextureNoiseThd_1 = 10|10|12|14|16|14|12|8|4|8|12|16|24|30|30|30; +EdgeNoiseThd_1 = 10|10|12|14|16|14|12|8|4|8|12|16|24|30|30|30; +overshoot_1 = 50|50|60|60|60|60|60|70|70|80|80|80|80|80|80|80; +undershoot_1 = 150|150|150|140|140|140|140|150|160|170|200|200|200|200|200|200; + + +[gamma] + +DelayCount = 1 +Interval = 10 +ExpCount = 4 +ExpThreshLtoD = 8000|40000|400000|4000000| +ExpThreshDtoL = 6000|7000|35000|320000| + +gamma.0_0 = 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888, +gamma.1_0 = 1904,1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,2240,2256,2272,2288,2304,2320,2336,2352,2368,2384,2400,2416,2432,2448,2464,2480,2496,2512,2528,2544,2560,2576,2592,2608,2624,2640,2656,2672,2688,2704,2720,2736,2752,2768,2784,2800,2816,2832,2848,2864,2880,2896,2912,2928,2944,2960,2976,2992,3008,3024,3040,3056,3072,3088,3104,3120,3136,3152,3168,3184,3200,3216,3232,3248,3264,3280,3296,3312,3328,3344,3360,3376,3392,3408,3424,3440,3456,3472,3488,3504,3520,3536,3552,3568,3584,3600,3616,3632,3648,3664,3680,3696,3712,3728,3744,3760,3776, +gamma.2_0 = 3792,3808,3824,3840,3856,3872,3888,3904,3920,3936,3952,3968,3984,4000,4016,4032,4048,4064,4080,4095 + +gamma.0_1 = 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888, +gamma.1_1 = 1904,1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,2240,2256,2272,2288,2304,2320,2336,2352,2368,2384,2400,2416,2432,2448,2464,2480,2496,2512,2528,2544,2560,2576,2592,2608,2624,2640,2656,2672,2688,2704,2720,2736,2752,2768,2784,2800,2816,2832,2848,2864,2880,2896,2912,2928,2944,2960,2976,2992,3008,3024,3040,3056,3072,3088,3104,3120,3136,3152,3168,3184,3200,3216,3232,3248,3264,3280,3296,3312,3328,3344,3360,3376,3392,3408,3424,3440,3456,3472,3488,3504,3520,3536,3552,3568,3584,3600,3616,3632,3648,3664,3680,3696,3712,3728,3744,3760,3776, +gamma.2_1 = 3792,3808,3824,3840,3856,3872,3888,3904,3920,3936,3952,3968,3984,4000,4016,4032,4048,4064,4080,4095 + +gamma.0_2 = 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888, +gamma.1_2 = 1904,1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,2240,2256,2272,2288,2304,2320,2336,2352,2368,2384,2400,2416,2432,2448,2464,2480,2496,2512,2528,2544,2560,2576,2592,2608,2624,2640,2656,2672,2688,2704,2720,2736,2752,2768,2784,2800,2816,2832,2848,2864,2880,2896,2912,2928,2944,2960,2976,2992,3008,3024,3040,3056,3072,3088,3104,3120,3136,3152,3168,3184,3200,3216,3232,3248,3264,3280,3296,3312,3328,3344,3360,3376,3392,3408,3424,3440,3456,3472,3488,3504,3520,3536,3552,3568,3584,3600,3616,3632,3648,3664,3680,3696,3712,3728,3744,3760,3776, +gamma.2_2 = 3792,3808,3824,3840,3856,3872,3888,3904,3920,3936,3952,3968,3984,4000,4016,4032,4048,4064,4080,4095 + +gamma.0_3 = 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888, +gamma.1_3 = 1904,1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,2240,2256,2272,2288,2304,2320,2336,2352,2368,2384,2400,2416,2432,2448,2464,2480,2496,2512,2528,2544,2560,2576,2592,2608,2624,2640,2656,2672,2688,2704,2720,2736,2752,2768,2784,2800,2816,2832,2848,2864,2880,2896,2912,2928,2944,2960,2976,2992,3008,3024,3040,3056,3072,3088,3104,3120,3136,3152,3168,3184,3200,3216,3232,3248,3264,3280,3296,3312,3328,3344,3360,3376,3392,3408,3424,3440,3456,3472,3488,3504,3520,3536,3552,3568,3584,3600,3616,3632,3648,3664,3680,3696,3712,3728,3744,3760,3776, +gamma.2_3 = 3792,3808,3824,3840,3856,3872,3888,3904,3920,3936,3952,3968,3984,4000,4016,4032,4048,4064,4080,4095 + + + + +[h264venc] +vencBitrateCount = 4 +vencBitrateThresh = 513|1025|2049|4097| + +chroma_qp_index_offset_0 = 0 +disable_deblocking_filter_idc_0 = 2 +u32DeltaQP_0 = 0 +s32IPQPDelta_0 = 4 +slice_alpha_c0_offset_div2_0 = 5 +slice_beta_offset_div2_0 = 5 +ThreshI_0 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_0 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_1 = -6 +disable_deblocking_filter_idc_1 = 2 +u32DeltaQP_1 = 1 +s32IPQPDelta_1 = 4 +slice_alpha_c0_offset_div2_1 = 5 +slice_beta_offset_div2_1 = 5 +ThreshI_1 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_1 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_2 = -4 +disable_deblocking_filter_idc_2 = 2 +u32DeltaQP_2 = 0 +s32IPQPDelta_2 = 4 +slice_alpha_c0_offset_div2_2 = 1 +slice_beta_offset_div2_2 = 1 +ThreshI_2 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_2 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_3 = 0 +disable_deblocking_filter_idc_3 = 1 +u32DeltaQP_3 = 0 +s32IPQPDelta_3 = 2 +slice_alpha_c0_offset_div2_3 = 0 +slice_beta_offset_div2_3 = 0 +ThreshI_3 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_3 = 7|7|7|7|7|9|9|9|12|15|18|25| + +[h265venc] +vencBitrateCount = 2 +vencBitrateThresh = 1024|2049| + +ThreshI_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_0 = 1 +s32IPQPDelta_0 = 1 + +ThreshI_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_1 = 1 +s32IPQPDelta_1 = 4 + + +ExpCount = 2 +ExpThresh = 8000|300000| + +u8NormIntra4RdCost_I_0 = 0|0| +u8NormIntra8RdCost_I_0 = 0|0| +u8NormIntra16RdCost_I_0 = 0|0| +u8NormIntra32RdCost_I_0 = 0|0| +u8SkinIntra4RdCost_I_0 = 0|0| +u8SkinIntra8RdCost_I_0 = 0|0| +u8SkinIntra16RdCost_I_0 = 0|2| +u8SkinIntra32RdCost_I_0 = 0|1| +u8HedgeIntra4RdCost_I_0 = 0|0| +u8HedgeIntra8RdCost_I_0 = 4|3| +u8HedgeIntra16RdCost_I_0 = 1|1| +u8HedgeIntra32RdCost_I_0 = 15|15| + +u8NormIntra4RdCost_P_0 = 0|0| +u8NormIntra8RdCost_P_0 = 0|0| +u8NormIntra16RdCost_P_0 = 3|0| +u8NormIntra32RdCost_P_0 = 0|0| +u8SkinIntra4RdCost_P_0 = 0|0| +u8SkinIntra8RdCost_P_0 = 0|0| +u8SkinIntra16RdCost_P_0 = 0|2| +u8SkinIntra32RdCost_P_0 = 0|1| +u8HedgeIntra4RdCost_P_0 = 0|0| +u8HedgeIntra8RdCost_P_0 = 4|3| +u8HedgeIntra16RdCost_P_0 = 2|1| +u8HedgeIntra32RdCost_P_0 = 3|15| + +u8NormFme8RdCost_P_0 = 0|4| +u8NormFme16RdCost_P_0 = 0|0| +u8NormFme32RdCost_P_0 = 0|0| +u8NormFme64RdCost_P_0 = 0|0| +u8SkinFme8RdCost_P_0 = 0|0| +u8SkinFme16RdCost_P_0 = 0|0| +u8SkinFme32RdCost_P_0 = 4|4| +u8SkinFme64RdCost_P_0 = 2|2| +u8HedgeFme8RdCost_P_0 = 3|4| +u8HedgeFme16RdCost_P_0 = 3|4| +u8HedgeFme32RdCost_P_0 = 3|3| +u8HedgeFme64RdCost_P_0 = 2|2| + +u8NormMerg8RdCost_P_0 = 0|4| +u8NormMerg16RdCost_P_0 = 0|0| +u8NormMerg32RdCost_P_0 = 0|0| +u8NormMerg64RdCost_P_0 = 0|0| +u8SkinMerg8RdCost_P_0 = 0|0| +u8SkinMerg16RdCost_P_0 = 0|0| +u8SkinMerg32RdCost_P_0 = 4|4| +u8SkinMerg64RdCost_P_0 = 2|2| +u8HedgeMerg8RdCost_P_0 = 3|4| +u8HedgeMerg16RdCost_P_0 = 3|4| +u8HedgeMerg32RdCost_P_0 = 3|3| +u8HedgeMerg64RdCost_P_0 = 2|2| + +bSkinEn_I_0 = 0|1| +u32SkinQpDelta_I_0 = 3|3| +u8SkinUMax_I_0 = 100|100| +u8SkinUMin_I_0 = 127|127| +u8SkinVMax_I_0 = 135|135| +u8SkinVMin_I_0 = 160|160| +u32SkinNum_I_0 = 200|200| + +bSkinEn_P_0 = 0|1| +u32SkinQpDelta_P_0 = 3|3| +u8SkinUMax_P_0 = 100|100| +u8SkinUMin_P_0 = 127|127| +u8SkinVMax_P_0 = 135|135| +u8SkinVMin_P_0 = 160|160| +u32SkinNum_P_0 = 200|200| + +u8HedgeThr_I_0 = 30|25| +u8HedgeCnt_I_0 = 4|4| +bStroEdgeEn_I_0 = 1|1| +u32StroEdgeQpDelta_I_0 = 1|0| + +u8HedgeThr_P_0 = 30|25| +u8HedgeCnt_P_0 = 4|4| +bStroEdgeEn_P_0 = 1|1| +u32StroEdgeQpDelta_P_0 = 4|4| + +bImproveEn_I_0 = 0|0| + +bImproveEn_P_0 = 1|1| +u32Norm32MaxNum_P_0 = 4|4| +u32Norm16MaxNum_P_0 = 3|3| +u32Norm32ProtectNum_P_0 = 256|256| +u32Norm16ProtectNum_P_0 = 64|64| +u32Skin32MaxNum_P_0 = 8|8| +u32Skin16MaxNum_P_0 = 6|6| +u32Skin32ProtectNum_P_0 = 32|32| +u32Skin16ProtectNum_P_0 = 16|16| +u32Still32MaxNum_P_0 = 8|8| +u32Still16MaxNum_P_0 = 6|6| +u32Still32ProtectNum_P_0 = 64|16| +u32Still16ProtectNum_P_0 = 8|8| +u32Hedge32MaxNum_P_0 = 8|8| +u32Hedge16MaxNum_P_0 = 6|6| +u32Hedge32ProtectNum_P_0 = 32|32| +u32Hedge16ProtectNum_P_0 = 16|16| + +u8NormIntra4RdCost_I_1 = 10|0| +u8NormIntra8RdCost_I_1 = 0|0| +u8NormIntra16RdCost_I_1 = 0|0| +u8NormIntra32RdCost_I_1 = 0|0| +u8SkinIntra4RdCost_I_1 = 0|0| +u8SkinIntra8RdCost_I_1 = 0|0| +u8SkinIntra16RdCost_I_1 = 0|2| +u8SkinIntra32RdCost_I_1 = 0|1| +u8HedgeIntra4RdCost_I_1 = 3|0| +u8HedgeIntra8RdCost_I_1 = 0|3| +u8HedgeIntra16RdCost_I_1 = 0|1| +u8HedgeIntra32RdCost_I_1 = 0|15| + +u8NormIntra4RdCost_P_1 = 0|0| +u8NormIntra8RdCost_P_1 = 1|0| +u8NormIntra16RdCost_P_1 = 15|0| +u8NormIntra32RdCost_P_1 = 15|0| +u8SkinIntra4RdCost_P_1 = 0|0| +u8SkinIntra8RdCost_P_1 = 0|0| +u8SkinIntra16RdCost_P_1 = 0|2| +u8SkinIntra32RdCost_P_1 = 0|1| +u8HedgeIntra4RdCost_P_1 = 0|0| +u8HedgeIntra8RdCost_P_1 = 1|3| +u8HedgeIntra16RdCost_P_1 = 15|1| +u8HedgeIntra32RdCost_P_1 = 15|15| + +u8NormFme8RdCost_P_1 = 4|4| +u8NormFme16RdCost_P_1 = 0|0| +u8NormFme32RdCost_P_1 = 0|0| +u8NormFme64RdCost_P_1 = 0|0| +u8SkinFme8RdCost_P_1 = 0|0| +u8SkinFme16RdCost_P_1 = 0|0| +u8SkinFme32RdCost_P_1 = 4|4| +u8SkinFme64RdCost_P_1 = 2|2| +u8HedgeFme8RdCost_P_1 = 0|4| +u8HedgeFme16RdCost_P_1 = 0|4| +u8HedgeFme32RdCost_P_1 = 1|3| +u8HedgeFme64RdCost_P_1 = 1|2| + +u8NormMerg8RdCost_P_1 = 4|4| +u8NormMerg16RdCost_P_1 = 0|0| +u8NormMerg32RdCost_P_1 = 0|0| +u8NormMerg64RdCost_P_1 = 0|0| +u8SkinMerg8RdCost_P_1 = 0|0| +u8SkinMerg16RdCost_P_1 = 0|0| +u8SkinMerg32RdCost_P_1 = 4|4| +u8SkinMerg64RdCost_P_1 = 2|2| +u8HedgeMerg8RdCost_P_1 = 0|4| +u8HedgeMerg16RdCost_P_1 = 0|4| +u8HedgeMerg32RdCost_P_1 = 1|3| +u8HedgeMerg64RdCost_P_1 = 1|2| + +bSkinEn_I_1 = 0|1| +u32SkinQpDelta_I_1 = 3|3| +u8SkinUMax_I_1 = 100|100| +u8SkinUMin_I_1 = 127|127| +u8SkinVMax_I_1 = 135|135| +u8SkinVMin_I_1 = 160|160| +u32SkinNum_I_1 = 200|200| + +bSkinEn_P_1 = 0|1| +u32SkinQpDelta_P_1 = 3|3| +u8SkinUMax_P_1 = 100|100| +u8SkinUMin_P_1 = 127|127| +u8SkinVMax_P_1 = 135|135| +u8SkinVMin_P_1 = 160|160| +u32SkinNum_P_1 = 200|200| + +u8HedgeThr_I_1 = 25|25| +u8HedgeCnt_I_1 = 4|4| +bStroEdgeEn_I_1 = 1|1| +u32StroEdgeQpDelta_I_1 = 0|0| + +u8HedgeThr_P_1 = 25|25| +u8HedgeCnt_P_1 = 4|4| +bStroEdgeEn_P_1 = 1|1| +u32StroEdgeQpDelta_P_1 = 4|4| + +bImproveEn_I_1 = 0|0| + +bImproveEn_P_1 = 1|1| +u32Norm32MaxNum_P_1 = 4|4| +u32Norm16MaxNum_P_1 = 3|3| +u32Norm32ProtectNum_P_1 = 256|256| +u32Norm16ProtectNum_P_1 = 64|64| +u32Skin32MaxNum_P_1 = 8|8| +u32Skin16MaxNum_P_1 = 6|6| +u32Skin32ProtectNum_P_1 = 32|32| +u32Skin16ProtectNum_P_1 = 16|16| +u32Still32MaxNum_P_1 = 8|8| +u32Still16MaxNum_P_1 = 6|6| +u32Still32ProtectNum_P_1 = 16|16| +u32Still16ProtectNum_P_1 = 8|8| +u32Hedge32MaxNum_P_1 = 8|8| +u32Hedge16MaxNum_P_1 = 6|6| +u32Hedge32ProtectNum_P_1 = 32|32| +u32Hedge16ProtectNum_P_1 = 16|16| + +[3dnr] +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 48 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 72 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 48 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 120 +s32YTFStr_2 = 74 +s32TFStrMax_2 = 12 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 48 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 76 +s32TFStrMax_3 = 12 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 32 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 12 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 32 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 90 +s32TFStrMax_5 = 12 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 32 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 154 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 12 +s32YSFStrDlt_6 = 0 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 24 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 12 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 24 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 180 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 24 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[BLC] +AEStrategyMode = 1 +HistRatioSlope = 32 +MaxHistOffset = 64 + +[DYNAMIC] +TotalNum_normal = 7 +TotalNum_fast = 7 + +IntTime_normal = 2|20000|20000|20000|20000|40000|40000| +IntTime_fast = 2|2000|2000|5000|5000|40000|40000| + +SysGain_normal = 1024|1024|1500|1500|3072|3072|16777216| +SysGain_fast = 1024|1024|2048|2048|5120|5120|16777216| + +[HLC] +DCIEnable = 0 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 72 +ExpCompensation = 16 +WhiteDelayFrame = 0 +BlackDelayFrame = 0 +u8Speed = 32 +HistRatioSlope = 128 +MaxHistOffset = 6 +u8Tolerance = 6 +Saturation = 120,116,104,96,88,80,72,64,56,56,56,56,56,56,56,56, +abEnLowLumaShoot = 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 +u8SharpenD = 35,40,45,45,50,40,40,45,45,45,40,40,40,40,40,40 +u8SharpenUd = 40,45,50,55,50,45,40,40,40,40,43,50,50,50,50,50 +u8TextureNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8EdgeNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8OverShoot = 50,50,60,60,60,60,60,70,70,80,80,80,80,80,80,80 +u8UnderShoot = 150,150,150,140,140,140,140,150,160,170,200,200,200,200,200,200 +gamma_0 = 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888, +gamma_1 = 1904,1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,2240,2256,2272,2288,2304,2320,2336,2352,2368,2384,2400,2416,2432,2448,2464,2480,2496,2512,2528,2544,2560,2576,2592,2608,2624,2640,2656,2672,2688,2704,2720,2736,2752,2768,2784,2800,2816,2832,2848,2864,2880,2896,2912,2928,2944,2960,2976,2992,3008,3024,3040,3056,3072,3088,3104,3120,3136,3152,3168,3184,3200,3216,3232,3248,3264,3280,3296,3312,3328,3344,3360,3376,3392,3408,3424,3440,3456,3472,3488,3504,3520,3536,3552,3568,3584,3600,3616,3632,3648,3664,3680,3696,3712,3728,3744,3760,3776, +gamma_2 = 3792,3808,3824,3840,3856,3872,3888,3904,3920,3936,3952,3968,3984,4000,4016,4032,4048,4064,4080,4095 +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[IR] +ExpCount = 4 +ExpThreshHtoL = 600000|1800000|4000000|7000000| +ExpThreshLtoH = 700000|2200000|5000000|8000000| +ExpCompensation = 50|48|38|32| +MaxHistOffset = 20|18|14|10| + +u16HistRatioSlope = 64 +BlackDelayFrame = 30 +WhiteDelayFrame = 30 + +u8Tolerance = 3 +u8Speed = 16 +DCIEnable = 1 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +IRu16Slope = 0,0,0,0,1,1,2,2,2,3,3,3,3,3,3,3 +abEnLowLumaShoot = 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 +u8SharpenD = 35,40,45,45,50,40,40,45,45,45,40,40,40,40,40,40 +u8SharpenUd = 40,45,50,55,50,45,40,40,40,40,43,50,50,50,50,50 +u8TextureNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8EdgeNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8OverShoot = 50,50,60,60,60,60,60,70,70,80,80,80,80,80,80,80 +u8UnderShoot = 150,150,150,140,140,140,140,150,160,170,200,200,200,200,200,200 +gamma_0 = 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888, +gamma_1 = 1904,1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,2240,2256,2272,2288,2304,2320,2336,2352,2368,2384,2400,2416,2432,2448,2464,2480,2496,2512,2528,2544,2560,2576,2592,2608,2624,2640,2656,2672,2688,2704,2720,2736,2752,2768,2784,2800,2816,2832,2848,2864,2880,2896,2912,2928,2944,2960,2976,2992,3008,3024,3040,3056,3072,3088,3104,3120,3136,3152,3168,3184,3200,3216,3232,3248,3264,3280,3296,3312,3328,3344,3360,3376,3392,3408,3424,3440,3456,3472,3488,3504,3520,3536,3552,3568,3584,3600,3616,3632,3648,3664,3680,3696,3712,3728,3744,3760,3776, +gamma_2 = 3792,3808,3824,3840,3856,3872,3888,3904,3920,3936,3952,3968,3984,4000,4016,4032,4048,4064,4080,4095 + +expweight_0 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_1 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_2 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_3 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_4 =1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1, +expweight_5 =1,1,1,1,1,2,3,3,3,3,3,1,1,1,1,1,1, +expweight_6 =1,1,1,1,2,3,4,4,4,4,4,3,2,1,1,1,1, +expweight_7 =1,1,1,2,3,4,4,4,4,4,4,4,3,2,1,1,1, +expweight_8 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_9 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_10 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_11 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_12 =1,1,1,1,2,3,3,3,3,3,3,3,2,1,1,1,1, +expweight_13 =1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1, +expweight_14 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[DRC] +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 255 +DRCu16BrightGainLmt = 127 +DRCu16DarkGainLmtC = 127 +DRCu16DarkGainLmtY = 127 +DRCu8Asymmetry = 2 +DRCu8LocalMixingBrigtht = 45 +DRCu8LocalMixingDark = 45 +DRCu8LocalMixingThres = 2 +DRCu8RangeVar = 0 +DRCu8SecondPole = 180 +DRCu8SpatialVar = 10 +DRCu8Stretch = 54 + + + + + diff --git a/device/mpp/sample/scene_auto/ini/IPC/sceneauto_ar0130.ini b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_ar0130.ini new file mode 100644 index 0000000..2354078 --- /dev/null +++ b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_ar0130.ini @@ -0,0 +1,872 @@ +[common] +IspDev = 0 +ViDev = 0 +ViChn = 0 +VpssGrp = 0 +VpssChn = 0 +VencGrp = 0 +VencChn = 0 + +IVE_Enable = 0; + +HLC_AutoEnable = 0; +HLC_thr_off = 140000 ;threshold value for HLC auto off +HLC_thr_on = 150000 ;threshold value for HLC auto on +HLC_tolerance = 3000 +HLC_expthr = 6000 +HLC_count = 5 + +ave_lum_thresh = 30 +delta_dis_expthresh = 20 +dci_strength_lut = 32,33,33,34,34,35,35,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,48,48,49,49,50,50,50,49,49,49,49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32 + +exposure_thr_indoor = 10000 +exposure_thr_outdoor = 100 + +fpn_exp_thresh = 200000 ;threshold value for fpn auto on + +u32DRCStrengthThresh = 48 + +[AE] +aeRunInterval = 2 +aeBitrateCount = 3 ;the counts of bitrate level +aeBitrateThresh = 1024|4060|8159| ;threshold value for each bitrate level + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 0 of bitrate +u8Speed_0 = 64 +u8Tolerance_0 = 3 +u16BlackDelayFrame_0 = 25 +u16WhiteDelayFrame_0 = 15 +u32SysGainMax_0 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 1 of bitrate +u8Speed_1 = 64 +u8Tolerance_1 = 3 +u16BlackDelayFrame_1 = 15 +u16WhiteDelayFrame_1 = 10 +u32SysGainMax_1 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 2 of bitrate +u8Speed_2 = 64 +u8Tolerance_2 = 2 +u16BlackDelayFrame_2 = 0 +u16WhiteDelayFrame_2 = 0 +u32SysGainMax_2 = 8192000 + +aeExpCount = 5 ;the counts of exposure level +aeExpDtoLThresh = 6000|30000|240000|800000|8000000| ;threshold value for each exposure level from dark to light +aeExpLtoDThresh = 8000|40000|300000|1000000|10000000| ;threshold value for each exposure level from light to dark + +;AE compesation and histoffset for each level of exposure +aeCompesation = 62|56|56|48|48| +aeHistOffset = 12|12|20|20|20| + +[sharpen] +IsoThresh = 200 +ExpCount = 2 +ExpThresh = 2000|10000 + +abEnLowLumaShoot_0 = 0|0|0|0|1|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_0 = 25|25|28|28|30|30|30|35|40|40|40|50|50|50|50|50 ; +SharpenUd_0 = 35|30|30|30|30|30|30|25|21|15|12|12|12|12|12|12 ; +TextureNoiseThd_0 = 10|10|12|14|16|18|20|22|24|26|28|30|30|30|30|30 ; +EdgeNoiseThd_0 = 10|10|12|14|16|18|20|22|24|26|28|30|30|30|30|30 ; +overshoot_0 = 180|150|120|110|110|60|40|30|20|10|0|0|0|0|0|0 ; +undershoot_0 = 200|180|160|160|200|200|200|200|200|220|255|255|255|255|255|255 ; + +abEnLowLumaShoot_1 = 0|0|0|0|1|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_1 = 25|25|28|28|30|30|30|35|40|40|40|50|50|50|50|50 ; +SharpenUd_1 = 35|30|30|30|30|30|30|25|21|15|12|12|12|12|12|12 ; +TextureNoiseThd_1 = 10|10|12|14|16|18|20|22|24|26|28|30|30|30|30|30 ; +EdgeNoiseThd_1 = 10|10|12|14|16|18|20|22|24|26|28|30|30|30|30|30 ; +overshoot_1 = 150|130|120|110|110|60|40|30|20|10|0|0|0|0|0|0 ; +undershoot_1 = 160|160|160|160|200|200|200|200|200|220|255|255|255|255|255|255 ; + + +[gamma] +DelayCount = 1 +Interval = 10 +ExpCount = 4 +ExpThreshLtoD = 8000|40000|400000|4000000| +ExpThreshDtoL = 6000|35000|350000|3200000| + +gamma.0_0 = 0,180,320,426,516,590,660,730,786,844,896,946,994,1040,1090,1130,1170,1210,1248,1296,1336,1372,1416,1452,1486,1516,1546,1580,1616,1652,1678,1714,1742,1776,1798,1830,1862,1886,1912,1940,1968,1992,2010,2038,2062,2090,2114,2134,2158,2178,2202,2222,2246,2266,2282,2300,2324,2344,2360,2372,2390,2406,2422,2438,2458,2478,2494,2510,2526,2546,2562,2582,2598,2614,2630,2648,2660,2670,2682,2698,2710,2724,2736,2752,2764,2780,2792,2808,2820,2836, +gamma.1_0 = 2848,2864,2876,2888,2896,2908,2920,2928,2940,2948,2960,2972,2984,2992,3004,3014,3028,3036,3048,3056,3068,3080,3088,3100,3110,3120,3128,3140,3148,3160,3168,3174,3182,3190,3202,3210,3218,3228,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3530,3538,3546,3554,3558,3564,3570,3574,3582,3590,3598,3604,3610,3618,3628,3634,3640,3644,3652, +gamma.2_0 = 3656,3664,3670,3678,3688,3696,3700,3708,3712,3716,3722,3730,3736,3740,3748,3752,3756,3760,3766,3774,3778,3786,3790,3800,3808,3812,3816,3824,3830,3832,3842,3846,3850,3854,3858,3862,3864,3870,3874,3878,3882,3888,3894,3900,3908,3912,3918,3924,3928,3934,3940,3946,3952,3958,3966,3974,3978,3982,3986,3990,3994,4002,4006,4010,4018,4022,4032,4038,4046,4050,4056,4062,4072,4076,4084,4090,4095 + +gamma.0_1 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_1 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +gamma.0_2 = 0,90,181,272,363,452,541,606,669,731,794,856,920,986,1055,1086,1118,1149,1181,1213,1246,1279,1312,1345,1379,1413,1447,1483,1518,1554,1591,1628,1666,1688,1710,1733,1756,1780,1804,1828,1852,1877,1902,1928,1953,1978,2004,2029,2055,2080,2106,2131,2156,2181,2206,2230,2254,2277,2301,2323,2346,2367,2389,2409,2429,2448,2467,2486,2505,2523,2540,2558,2575,2592,2608,2625,2641,2656,2672,2687,2702,2717,2732,2746,2760,2774,2788,2802,2816,2829,2842, +gamma.1_2 = 2856,2869,2882,2895,2907,2920,2933,2945,2957,2968,2980,2991,3002,3013,3023,3034,3044,3054,3064,3074,3083,3093,3102,3112,3121,3130,3139,3148,3157,3166,3175,3185,3194,3203,3212,3221,3231,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3534,3541,3549,3556,3563,3571,3578,3585,3591,3598,3605,3612,3618,3625,3631,3638,3644,3650, +gamma.2_2 = 3657,3663,3669,3675,3681,3687,3694,3700,3706,3712,3718,3724,3730,3736,3742,3748,3754,3760,3766,3771,3777,3783,3789,3794,3800,3805,3811,3816,3822,3827,3833,3838,3844,3849,3855,3860,3865,3871,3876,3882,3887,3893,3898,3904,3909,3915,3921,3926,3932,3937,3943,3949,3954,3960,3966,3971,3977,3982,3988,3994,3999,4005,4011,4016,4022,4027,4033,4039,4044,4050,4056,4061,4067,4072,4078,4084,4089,4095, + +gamma.0_3 = 0,87,176,266,354,440,523,600,656,707,755,801,846,892,939,988,1040,1071,1103,1136,1169,1203,1237,1271,1306,1341,1376,1411,1446,1481,1516,1550,1584,1635,1676,1710,1740,1769,1800,1835,1865,1895,1924,1955,1986,2018,2052,2089,2128,2151,2176,2202,2229,2256,2285,2313,2342,2372,2400,2429,2457,2484,2510,2536,2560,2582,2605,2626,2647,2668,2688,2707,2727,2745,2764,2782,2800,2818,2835,2852,2870,2887,2904,2920,2936,2952,2968,2983,2998,3013,3028, +gamma.1_3 = 3043,3057,3071,3085,3098,3112,3125,3138,3150,3162,3174,3186,3198,3209,3220,3231,3242,3253,3264,3276,3287,3298,3309,3320,3332,3343,3355,3366,3377,3389,3400,3411,3421,3432,3442,3452,3462,3472,3481,3490,3499,3508,3516,3525,3533,3541,3548,3556,3563,3570,3577,3584,3591,3598,3605,3611,3618,3624,3631,3637,3643,3649,3655,3661,3667,3672,3678,3684,3690,3696,3702,3708,3714,3720,3726,3732,3738,3744,3750,3756,3762,3768,3774,3779,3785,3790,3795, +gamma.2_3 = 3800,3805,3810,3815,3819,3824,3829,3833,3838,3842,3846,3851,3855,3860,3864,3868,3873,3877,3881,3886,3890,3894,3898,3902,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3966,3970,3974,3978,3981,3985,3989,3992,3995,3999,4002,4005,4008,4011,4014,4017,4020,4023,4026,4029,4032,4035,4038,4041,4044,4048,4051,4054,4058,4061,4065,4068,4072,4075,4079,4082,4086,4089,4093,4095, + + + +[h264venc] +vencBitrateCount = 4 +vencBitrateThresh = 513|1025|2049|4097| + +chroma_qp_index_offset_0 = 0 +disable_deblocking_filter_idc_0 = 2 +u32DeltaQP_0 = 0 +s32IPQPDelta_0 = 4 +slice_alpha_c0_offset_div2_0 = 5 +slice_beta_offset_div2_0 = 5 +ThreshI_0 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_0 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_1 = -6 +disable_deblocking_filter_idc_1 = 2 +u32DeltaQP_1 = 1 +s32IPQPDelta_1 = 4 +slice_alpha_c0_offset_div2_1 = 5 +slice_beta_offset_div2_1 = 5 +ThreshI_1 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_1 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_2 = -4 +disable_deblocking_filter_idc_2 = 2 +u32DeltaQP_2 = 0 +s32IPQPDelta_2 = 4 +slice_alpha_c0_offset_div2_2 = 1 +slice_beta_offset_div2_2 = 1 +ThreshI_2 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_2 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_3 = 0 +disable_deblocking_filter_idc_3 = 1 +u32DeltaQP_3 = 0 +s32IPQPDelta_3 = 2 +slice_alpha_c0_offset_div2_3 = 0 +slice_beta_offset_div2_3 = 0 +ThreshI_3 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_3 = 7|7|7|7|7|9|9|9|12|15|18|25| + +[h265venc] +vencBitrateCount = 2 +vencBitrateThresh = 1024|2049| + +ThreshI_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_0 = 1 +s32IPQPDelta_0 = 1 + +ThreshI_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_1 = 1 +s32IPQPDelta_1 = 4 + + +ExpCount = 2 +ExpThresh = 8000|300000| + +u8NormIntra4RdCost_I_0 = 0|0| +u8NormIntra8RdCost_I_0 = 0|0| +u8NormIntra16RdCost_I_0 = 0|0| +u8NormIntra32RdCost_I_0 = 0|0| +u8SkinIntra4RdCost_I_0 = 0|0| +u8SkinIntra8RdCost_I_0 = 0|0| +u8SkinIntra16RdCost_I_0 = 0|2| +u8SkinIntra32RdCost_I_0 = 0|1| +u8HedgeIntra4RdCost_I_0 = 0|0| +u8HedgeIntra8RdCost_I_0 = 4|3| +u8HedgeIntra16RdCost_I_0 = 1|1| +u8HedgeIntra32RdCost_I_0 = 15|15| + +u8NormIntra4RdCost_P_0 = 0|0| +u8NormIntra8RdCost_P_0 = 0|0| +u8NormIntra16RdCost_P_0 = 3|0| +u8NormIntra32RdCost_P_0 = 0|0| +u8SkinIntra4RdCost_P_0 = 0|0| +u8SkinIntra8RdCost_P_0 = 0|0| +u8SkinIntra16RdCost_P_0 = 0|2| +u8SkinIntra32RdCost_P_0 = 0|1| +u8HedgeIntra4RdCost_P_0 = 0|0| +u8HedgeIntra8RdCost_P_0 = 4|3| +u8HedgeIntra16RdCost_P_0 = 2|1| +u8HedgeIntra32RdCost_P_0 = 3|15| + +u8NormFme8RdCost_P_0 = 0|4| +u8NormFme16RdCost_P_0 = 0|0| +u8NormFme32RdCost_P_0 = 0|0| +u8NormFme64RdCost_P_0 = 0|0| +u8SkinFme8RdCost_P_0 = 0|0| +u8SkinFme16RdCost_P_0 = 0|0| +u8SkinFme32RdCost_P_0 = 4|4| +u8SkinFme64RdCost_P_0 = 2|2| +u8HedgeFme8RdCost_P_0 = 3|4| +u8HedgeFme16RdCost_P_0 = 3|4| +u8HedgeFme32RdCost_P_0 = 3|3| +u8HedgeFme64RdCost_P_0 = 2|2| + +u8NormMerg8RdCost_P_0 = 0|4| +u8NormMerg16RdCost_P_0 = 0|0| +u8NormMerg32RdCost_P_0 = 0|0| +u8NormMerg64RdCost_P_0 = 0|0| +u8SkinMerg8RdCost_P_0 = 0|0| +u8SkinMerg16RdCost_P_0 = 0|0| +u8SkinMerg32RdCost_P_0 = 4|4| +u8SkinMerg64RdCost_P_0 = 2|2| +u8HedgeMerg8RdCost_P_0 = 3|4| +u8HedgeMerg16RdCost_P_0 = 3|4| +u8HedgeMerg32RdCost_P_0 = 3|3| +u8HedgeMerg64RdCost_P_0 = 2|2| + +bSkinEn_I_0 = 0|1| +u32SkinQpDelta_I_0 = 3|3| +u8SkinUMax_I_0 = 100|100| +u8SkinUMin_I_0 = 127|127| +u8SkinVMax_I_0 = 135|135| +u8SkinVMin_I_0 = 160|160| +u32SkinNum_I_0 = 200|200| + +bSkinEn_P_0 = 0|1| +u32SkinQpDelta_P_0 = 3|3| +u8SkinUMax_P_0 = 100|100| +u8SkinUMin_P_0 = 127|127| +u8SkinVMax_P_0 = 135|135| +u8SkinVMin_P_0 = 160|160| +u32SkinNum_P_0 = 200|200| + +u8HedgeThr_I_0 = 30|25| +u8HedgeCnt_I_0 = 4|4| +bStroEdgeEn_I_0 = 1|1| +u32StroEdgeQpDelta_I_0 = 1|0| + +u8HedgeThr_P_0 = 30|25| +u8HedgeCnt_P_0 = 4|4| +bStroEdgeEn_P_0 = 1|1| +u32StroEdgeQpDelta_P_0 = 4|4| + +bImproveEn_I_0 = 0|0| + +bImproveEn_P_0 = 1|1| +u32Norm32MaxNum_P_0 = 4|4| +u32Norm16MaxNum_P_0 = 3|3| +u32Norm32ProtectNum_P_0 = 256|256| +u32Norm16ProtectNum_P_0 = 64|64| +u32Skin32MaxNum_P_0 = 8|8| +u32Skin16MaxNum_P_0 = 6|6| +u32Skin32ProtectNum_P_0 = 32|32| +u32Skin16ProtectNum_P_0 = 16|16| +u32Still32MaxNum_P_0 = 8|8| +u32Still16MaxNum_P_0 = 6|6| +u32Still32ProtectNum_P_0 = 64|16| +u32Still16ProtectNum_P_0 = 8|8| +u32Hedge32MaxNum_P_0 = 8|8| +u32Hedge16MaxNum_P_0 = 6|6| +u32Hedge32ProtectNum_P_0 = 32|32| +u32Hedge16ProtectNum_P_0 = 16|16| + +u8NormIntra4RdCost_I_1 = 10|0| +u8NormIntra8RdCost_I_1 = 0|0| +u8NormIntra16RdCost_I_1 = 0|0| +u8NormIntra32RdCost_I_1 = 0|0| +u8SkinIntra4RdCost_I_1 = 0|0| +u8SkinIntra8RdCost_I_1 = 0|0| +u8SkinIntra16RdCost_I_1 = 0|2| +u8SkinIntra32RdCost_I_1 = 0|1| +u8HedgeIntra4RdCost_I_1 = 3|0| +u8HedgeIntra8RdCost_I_1 = 0|3| +u8HedgeIntra16RdCost_I_1 = 0|1| +u8HedgeIntra32RdCost_I_1 = 0|15| + +u8NormIntra4RdCost_P_1 = 0|0| +u8NormIntra8RdCost_P_1 = 1|0| +u8NormIntra16RdCost_P_1 = 15|0| +u8NormIntra32RdCost_P_1 = 15|0| +u8SkinIntra4RdCost_P_1 = 0|0| +u8SkinIntra8RdCost_P_1 = 0|0| +u8SkinIntra16RdCost_P_1 = 0|2| +u8SkinIntra32RdCost_P_1 = 0|1| +u8HedgeIntra4RdCost_P_1 = 0|0| +u8HedgeIntra8RdCost_P_1 = 1|3| +u8HedgeIntra16RdCost_P_1 = 15|1| +u8HedgeIntra32RdCost_P_1 = 15|15| + +u8NormFme8RdCost_P_1 = 4|4| +u8NormFme16RdCost_P_1 = 0|0| +u8NormFme32RdCost_P_1 = 0|0| +u8NormFme64RdCost_P_1 = 0|0| +u8SkinFme8RdCost_P_1 = 0|0| +u8SkinFme16RdCost_P_1 = 0|0| +u8SkinFme32RdCost_P_1 = 4|4| +u8SkinFme64RdCost_P_1 = 2|2| +u8HedgeFme8RdCost_P_1 = 0|4| +u8HedgeFme16RdCost_P_1 = 0|4| +u8HedgeFme32RdCost_P_1 = 1|3| +u8HedgeFme64RdCost_P_1 = 1|2| + +u8NormMerg8RdCost_P_1 = 4|4| +u8NormMerg16RdCost_P_1 = 0|0| +u8NormMerg32RdCost_P_1 = 0|0| +u8NormMerg64RdCost_P_1 = 0|0| +u8SkinMerg8RdCost_P_1 = 0|0| +u8SkinMerg16RdCost_P_1 = 0|0| +u8SkinMerg32RdCost_P_1 = 4|4| +u8SkinMerg64RdCost_P_1 = 2|2| +u8HedgeMerg8RdCost_P_1 = 0|4| +u8HedgeMerg16RdCost_P_1 = 0|4| +u8HedgeMerg32RdCost_P_1 = 1|3| +u8HedgeMerg64RdCost_P_1 = 1|2| + +bSkinEn_I_1 = 0|1| +u32SkinQpDelta_I_1 = 3|3| +u8SkinUMax_I_1 = 100|100| +u8SkinUMin_I_1 = 127|127| +u8SkinVMax_I_1 = 135|135| +u8SkinVMin_I_1 = 160|160| +u32SkinNum_I_1 = 200|200| + +bSkinEn_P_1 = 0|1| +u32SkinQpDelta_P_1 = 3|3| +u8SkinUMax_P_1 = 100|100| +u8SkinUMin_P_1 = 127|127| +u8SkinVMax_P_1 = 135|135| +u8SkinVMin_P_1 = 160|160| +u32SkinNum_P_1 = 200|200| + +u8HedgeThr_I_1 = 25|25| +u8HedgeCnt_I_1 = 4|4| +bStroEdgeEn_I_1 = 1|1| +u32StroEdgeQpDelta_I_1 = 0|0| + +u8HedgeThr_P_1 = 25|25| +u8HedgeCnt_P_1 = 4|4| +bStroEdgeEn_P_1 = 1|1| +u32StroEdgeQpDelta_P_1 = 4|4| + +bImproveEn_I_1 = 0|0| + +bImproveEn_P_1 = 1|1| +u32Norm32MaxNum_P_1 = 4|4| +u32Norm16MaxNum_P_1 = 3|3| +u32Norm32ProtectNum_P_1 = 256|256| +u32Norm16ProtectNum_P_1 = 64|64| +u32Skin32MaxNum_P_1 = 8|8| +u32Skin16MaxNum_P_1 = 6|6| +u32Skin32ProtectNum_P_1 = 32|32| +u32Skin16ProtectNum_P_1 = 16|16| +u32Still32MaxNum_P_1 = 8|8| +u32Still16MaxNum_P_1 = 6|6| +u32Still32ProtectNum_P_1 = 16|16| +u32Still16ProtectNum_P_1 = 8|8| +u32Hedge32MaxNum_P_1 = 8|8| +u32Hedge16MaxNum_P_1 = 6|6| +u32Hedge32ProtectNum_P_1 = 32|32| +u32Hedge16ProtectNum_P_1 = 16|16| + +[3dnr] +3DnrIsoCount = 12 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000|53000|100000|200000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 100 +s32YTFStr_0 = 48 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 100 +s32YTFStr_1 = 48 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 0 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 16 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 48 +s32CSFStr_6 = 48 +s32CTFstr_6 = 14 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 104 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 14 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +s32YPKStr_9 = 0 +s32YSFStr_9 = 156 +s32YTFStr_9 = 120 +s32TFStrMax_9 = 12 +s32YSFStrDlt_9 = 8 +s32YTFStrDlt_9 = 16 +s32YTFStrDl_9 = 0 +s32YSmthStr_9 = 72 +s32YSmthRat_9 = 16 +s32YSFBriRat_9 = 48 +s32CSFStr_9 = 64 +s32CTFstr_9 = 20 + +s32YPKStr_10 = 0 +s32YSFStr_10 = 156 +s32YTFStr_10 = 120 +s32TFStrMax_10 = 12 +s32YSFStrDlt_10 = 8 +s32YTFStrDlt_10 = 24 +s32YTFStrDl_10 = 4 +s32YSmthStr_10 = 80 +s32YSmthRat_10 = 16 +s32YSFBriRat_10 = 24 +s32CSFStr_10 = 64 +s32CTFstr_10 = 20 + +s32YPKStr_11 = 0 +s32YSFStr_11 = 156 +s32YTFStr_11 = 120 +s32TFStrMax_11 = 12 +s32YSFStrDlt_11 = 16 +s32YTFStrDlt_11 = 36 +s32YTFStrDl_11 = 16 +s32YSmthStr_11 = 96 +s32YSmthRat_11 = 16 +s32YSFBriRat_11 = 24 +s32CSFStr_11 = 64 +s32CTFstr_11 = 20 + +[BLC] +AEStrategyMode = 1 +HistRatioSlope = 32 +MaxHistOffset = 64 + +[DYNAMIC] +TotalNum_normal = 7 +TotalNum_fast = 7 + +IntTime_normal = 2|20000|20000|20000|20000|40000|40000| +IntTime_fast = 2|2000|2000|5000|5000|40000|40000| + +SysGain_normal = 1024|1024|1500|1500|3072|3072|16777216| +SysGain_fast = 1024|1024|2048|2048|5120|5120|16777216| + +[HLC] +DCIEnable = 0 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 72 +ExpCompensation = 16 +WhiteDelayFrame = 0 +BlackDelayFrame = 0 +u8Speed = 32 +HistRatioSlope = 128 +MaxHistOffset = 6 +u8Tolerance = 6 +Saturation = 120,116,104,96,88,80,72,64,56,56,56,56,56,56,56,56, +abEnLowLumaShoot = 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 +u8SharpenD = 25,25,28,28,30,30,30,35,40,40,40,50,50,50,50,50 +u8SharpenUd = 35,30,30,30,30,30,30,25,21,15,12,12,12,12,12,12 +u8TextureNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8EdgeNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8OverShoot = 150,130,120,110,60,40,30,20,10,0,0,0,0,0,0,0 +u8UnderShoot = 160,160,160,160,200,200,200,200,200,220,255,255,255,255,255,255 +gamma_0 = 0,61,123,187,250,315,380,445,511,577,643,709,775,841,906,971,1035,1098,1161,1222,1283,1342,1400,1457,1512,1565,1617,1667,1714,1760,1796,1831,1865,1897,1928,1958,1987,2015,2042,2068,2094,2118,2142,2165,2187,2209,2230,2251,2271,2291,2311,2331,2350,2369,2388,2407,2426,2445,2465,2484,2504,2524,2544,2565,2586,2598,2609,2621,2633,2644,2656,2667,2679,2690,2702,2713,2725,2736,2747,2758,2770,2781,2792,2803,2814,2825,2836,2847,2858,2869,2880, +gamma_1 = 2891,2901,2912,2923,2934,2944,2955,2965,2976,2986,2997,3007,3018,3028,3038,3048,3059,3069,3079,3089,3099,3109,3119,3129,3139,3149,3158,3168,3178,3187,3197,3207,3216,3226,3235,3244,3254,3263,3272,3281,3291,3300,3309,3318,3327,3336,3345,3354,3363,3372,3380,3389,3398,3407,3415,3424,3432,3441,3450,3458,3466,3475,3483,3491,3500,3508,3516,3524,3532,3540,3548,3556,3564,3572,3580,3587,3595,3603,3610,3618,3626,3633,3641,3648,3655,3663,3670,3677, +gamma_2 = 3684,3691,3698,3705,3712,3719,3726,3733,3740,3747,3753,3760,3766,3773,3779,3786,3792,3798,3804,3810,3816,3822,3828,3834,3839,3845,3851,3856,3861,3867,3872,3877,3882,3888,3893,3898,3903,3908,3912,3917,3922,3927,3932,3936,3941,3946,3950,3955,3960,3964,3969,3973,3978,3983,3987,3992,3996,4001,4005,4010,4014,4019,4023,4028,4033,4037,4042,4047,4051,4056,4061,4066,4070,4075,4080,4085,4090,4095, + +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[IR] +ExpCount = 4 +ExpThreshHtoL = 600000|1800000|4000000|7000000| +ExpThreshLtoH = 700000|2200000|5000000|8000000| +ExpCompensation = 50|48|38|32| +MaxHistOffset = 20|18|14|10| + +u16HistRatioSlope = 64 +BlackDelayFrame = 30 +WhiteDelayFrame = 30 + +u8Tolerance = 3 +u8Speed = 16 +DCIEnable = 1 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +IRu16Slope = 0,0,0,0,1,1,2,2,2,3,3,3,3,3,3,3 +abEnLowLumaShoot = 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 +u8SharpenD = 25,25,28,28,30,30,30,35,40,40,40,50,50,50,50,50 +u8SharpenUd = 35,30,30,30,30,30,30,25,21,15,12,12,12,12,12,12 +u8TextureNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8EdgeNoiseThd = 10,10,12,14,16,18,20,22,24,26,28,30,30,30,30,30 +u8OverShoot = 150,130,120,110,60,40,30,20,10,0,0,0,0,0,0,0 +u8UnderShoot = 160,160,160,160,200,200,200,200,200,220,255,255,255,255,255,255 + +gamma_0 = 0,76,154,234,313,390,463,531,592,646,694,736,775,812,847,881,916,951,984,1016,1047,1077,1107,1137,1168,1200,1231,1263,1294,1325,1356,1387,1417,1448,1478,1508,1537,1567,1595,1624,1651,1677,1702,1727,1752,1777,1803,1828,1854,1880,1906,1932,1958,1984,2010,2036,2062,2087,2112,2137,2161,2185,2209,2232,2255,2277,2299,2321,2342,2363,2383,2404,2424,2443,2463,2482,2501,2520,2539,2557,2576,2594,2612,2630,2648,2665,2682, +gamma_1 = 2699,2716,2733,2749,2766,2782,2799,2815,2831,2847,2863,2879,2895,2911,2927,2942,2958,2974,2989,3004,3019,3034,3049,3063,3078,3092,3106,3120,3133,3147,3160,3173,3186,3199,3212,3224,3237,3249,3262,3274,3286,3298,3310,3322,3334,3346,3357,3369,3381,3392,3403,3414,3425,3436,3447,3457,3468,3478,3488,3498,3507,3517,3526,3535,3544,3552,3561,3569,3578,3586,3595,3603,3612,3620,3628,3637,3645,3654,3662,3671,3679,3687,3695,3703,3711, +gamma_2 = 3719,3727,3734,3741,3748,3755,3761,3768,3774,3780,3786,3791,3797,3802,3808,3813,3818,3823,3828,3833,3838,3843,3847,3852,3856,3860,3864,3868,3872,3876,3880,3884,3887,3891,3895,3899,3903,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3967,3971,3975,3978,3982,3985,3989,3992,3996,4000,4003,4007,4010,4014,4018,4022,4026,4030,4034,4038,4043,4047,4051,4056,4060,4065,4069,4074,4078,4083,4087,4092,4095 + +expweight_0 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_1 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_2 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_3 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_4 =1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1, +expweight_5 =1,1,1,1,1,2,3,3,3,3,3,1,1,1,1,1,1, +expweight_6 =1,1,1,1,2,3,4,4,4,4,4,3,2,1,1,1,1, +expweight_7 =1,1,1,2,3,4,4,4,4,4,4,4,3,2,1,1,1, +expweight_8 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_9 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_10 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_11 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_12 =1,1,1,1,2,3,3,3,3,3,3,3,2,1,1,1,1, +expweight_13 =1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1, +expweight_14 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + +3DnrIsoCount = 9 +3DnrIsoThresh = 50|100|300|600|1200|2700|5000|9800|20000| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 110 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 110 +s32YTFStr_1 = 64 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 116 +s32YTFStr_2 = 80 +s32TFStrMax_2 = 14 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 0 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 128 +s32YTFStr_3 = 80 +s32TFStrMax_3 = 14 +s32YSFStrDlt_3 = 0 +s32YTFStrDlt_3 = 0 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 12 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 136 +s32YTFStr_4 = 80 +s32TFStrMax_4 = 14 +s32YSFStrDlt_4 = 0 +s32YTFStrDlt_4 = 0 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 32 +s32CTFstr_4 = 12 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 148 +s32YTFStr_5 = 88 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 0 +s32YTFStrDlt_5 = 0 +s32YTFStrDl_5 = 0 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 64 +s32CSFStr_5 = 32 +s32CTFstr_5 = 12 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 148 +s32YTFStr_6 = 96 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 12 +s32YTFStrDlt_6 = 0 +s32YTFStrDl_6 = 0 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 64 +s32CSFStr_6 = 32 +s32CTFstr_6 = 12 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 172 +s32YTFStr_7 = 106 +s32TFStrMax_7 = 14 +s32YSFStrDlt_7 = 0 +s32YTFStrDlt_7 = 0 +s32YTFStrDl_7 = 0 +s32YSmthStr_7 = 16 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 48 +s32CSFStr_7 = 48 +s32CTFstr_7 = 12 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 148 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 12 +s32YSFStrDlt_8 = 24 +s32YTFStrDlt_8 = 0 +s32YTFStrDl_8 = 0 +s32YSmthStr_8 = 64 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 48 +s32CSFStr_8 = 64 +s32CTFstr_8 = 16 + +[DRC] +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +DRCu16BrightGainLmt = 127 +DRCu16DarkGainLmtC = 127 +DRCu16DarkGainLmtY = 127 +DRCu8Asymmetry = 2 +DRCu8LocalMixingBrigtht = 45 +DRCu8LocalMixingDark = 45 +DRCu8LocalMixingThres = 2 +DRCu8RangeVar = 0 +DRCu8SecondPole = 180 +DRCu8SpatialVar = 10 +DRCu8Stretch = 54 + + + + + diff --git a/device/mpp/sample/scene_auto/ini/IPC/sceneauto_mn34222.ini b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_mn34222.ini new file mode 100644 index 0000000..f0982d4 --- /dev/null +++ b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_mn34222.ini @@ -0,0 +1,963 @@ +[common] +IspDev = 0 +ViDev = 0 +ViChn = 0 +VpssGrp = 0 +VpssChn = 0 +VencGrp = 0 +VencChn = 0 + +IVE_Enable = 0; + +HLC_AutoEnable = 0; +HLC_thr_off = 140000 ;threshold value for HLC auto off +HLC_thr_on = 150000 ;threshold value for HLC auto on +HLC_tolerance = 3000 +HLC_expthr = 6000 +HLC_count = 5 + +ave_lum_thresh = 30 +delta_dis_expthresh = 20 +dci_strength_lut = 32,33,33,34,34,35,35,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,48,48,49,49,50,50,50,49,49,49,49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32 + +exposure_thr_indoor = 10000 +exposure_thr_outdoor = 100 + +fpn_exp_thresh = 200000 ;threshold value for fpn auto on + +u32DRCStrengthThresh = 48 + +[AE] +aeRunInterval = 2 +aeBitrateCount = 3 ;the counts of bitrate level +aeBitrateThresh = 1024|4060|8159| ;threshold value for each bitrate level + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 0 of bitrate +u8Speed_0 = 64 +u8Tolerance_0 = 3 +u16BlackDelayFrame_0 = 25 +u16WhiteDelayFrame_0 = 15 +u32SysGainMax_0 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 1 of bitrate +u8Speed_1 = 64 +u8Tolerance_1 = 3 +u16BlackDelayFrame_1 = 15 +u16WhiteDelayFrame_1 = 10 +u32SysGainMax_1 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 2 of bitrate +u8Speed_2 = 64 +u8Tolerance_2 = 2 +u16BlackDelayFrame_2 = 0 +u16WhiteDelayFrame_2 = 0 +u32SysGainMax_2 = 8192000 + +aeExpCount = 5 ;the counts of exposure level +aeExpDtoLThresh = 6000|30000|240000|800000|8000000| ;threshold value for each exposure level from dark to light +aeExpLtoDThresh = 8000|40000|300000|1000000|10000000| ;threshold value for each exposure level from light to dark + +;AE compesation and histoffset for each level of exposure +aeCompesation = 62|56|56|48|48| +aeHistOffset = 12|12|20|20|20| + +[sharpen] +IsoThresh = 200 +ExpCount = 2 +ExpThresh = 2000|10000 + +abEnLowLumaShoot_0 = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_0 = 80|80|65|50|120|160|180|200|220|250|250|250|250|250|250|250 ; +SharpenUd_0 = 30|30|32|35|35|50|60|70|120|200|250|250|250|250|250|250 ; +TextureNoiseThd_0 = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 ; +EdgeNoiseThd_0 = 0|0|0|0|0|0|0|0|100|200|0|0|0|0|0|0 ; +overshoot_0 = 140|140|130|100|75|45|25|10|0|0|0|0|0|0|0|0 ; +undershoot_0 = 160|160|150|130|115|100|90|70|30|0|0|0|0|0|0|0 ; + +abEnLowLumaShoot_1 = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_1 = 80|80|65|50|120|160|180|200|220|250|250|250|250|250|250|250 ; +SharpenUd_1 = 30|30|32|35|35|50|60|70|120|200|250|250|250|250|250|250 ; +TextureNoiseThd_1 = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 ; +EdgeNoiseThd_1 = 0|0|0|0|0|0|0|0|100|200|0|0|0|0|0|0 ; +overshoot_1 = 140|140|130|100|75|45|25|10|0|0|0|0|0|0|0|0 ; +undershoot_1 = 160|160|150|130|115|100|90|70|30|0|0|0|0|0|0|0 ; + +[gamma] +DelayCount = 1 +Interval = 10 +ExpCount = 4 +ExpThreshLtoD = 8000|40000|400000|4000000| +ExpThreshDtoL = 6000|35000|350000|3200000| + +gamma.0_0 = 0,180,320,426,516,590,660,730,786,844,896,946,994,1040,1090,1130,1170,1210,1248,1296,1336,1372,1416,1452,1486,1516,1546,1580,1616,1652,1678,1714,1742,1776,1798,1830,1862,1886,1912,1940,1968,1992,2010,2038,2062,2090,2114,2134,2158,2178,2202,2222,2246,2266,2282,2300,2324,2344,2360,2372,2390,2406,2422,2438,2458,2478,2494,2510,2526,2546,2562,2582,2598,2614,2630,2648,2660,2670,2682,2698,2710,2724,2736,2752,2764,2780,2792,2808,2820,2836, +gamma.1_0 = 2848,2864,2876,2888,2896,2908,2920,2928,2940,2948,2960,2972,2984,2992,3004,3014,3028,3036,3048,3056,3068,3080,3088,3100,3110,3120,3128,3140,3148,3160,3168,3174,3182,3190,3202,3210,3218,3228,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3530,3538,3546,3554,3558,3564,3570,3574,3582,3590,3598,3604,3610,3618,3628,3634,3640,3644,3652, +gamma.2_0 = 3656,3664,3670,3678,3688,3696,3700,3708,3712,3716,3722,3730,3736,3740,3748,3752,3756,3760,3766,3774,3778,3786,3790,3800,3808,3812,3816,3824,3830,3832,3842,3846,3850,3854,3858,3862,3864,3870,3874,3878,3882,3888,3894,3900,3908,3912,3918,3924,3928,3934,3940,3946,3952,3958,3966,3974,3978,3982,3986,3990,3994,4002,4006,4010,4018,4022,4032,4038,4046,4050,4056,4062,4072,4076,4084,4090,4095 + +gamma.0_1 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_1 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +gamma.0_2 = 0,90,181,272,363,452,541,606,669,731,794,856,920,986,1055,1086,1118,1149,1181,1213,1246,1279,1312,1345,1379,1413,1447,1483,1518,1554,1591,1628,1666,1688,1710,1733,1756,1780,1804,1828,1852,1877,1902,1928,1953,1978,2004,2029,2055,2080,2106,2131,2156,2181,2206,2230,2254,2277,2301,2323,2346,2367,2389,2409,2429,2448,2467,2486,2505,2523,2540,2558,2575,2592,2608,2625,2641,2656,2672,2687,2702,2717,2732,2746,2760,2774,2788,2802,2816,2829,2842, +gamma.1_2 = 2856,2869,2882,2895,2907,2920,2933,2945,2957,2968,2980,2991,3002,3013,3023,3034,3044,3054,3064,3074,3083,3093,3102,3112,3121,3130,3139,3148,3157,3166,3175,3185,3194,3203,3212,3221,3231,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3534,3541,3549,3556,3563,3571,3578,3585,3591,3598,3605,3612,3618,3625,3631,3638,3644,3650, +gamma.2_2 = 3657,3663,3669,3675,3681,3687,3694,3700,3706,3712,3718,3724,3730,3736,3742,3748,3754,3760,3766,3771,3777,3783,3789,3794,3800,3805,3811,3816,3822,3827,3833,3838,3844,3849,3855,3860,3865,3871,3876,3882,3887,3893,3898,3904,3909,3915,3921,3926,3932,3937,3943,3949,3954,3960,3966,3971,3977,3982,3988,3994,3999,4005,4011,4016,4022,4027,4033,4039,4044,4050,4056,4061,4067,4072,4078,4084,4089,4095, + +gamma.0_3 = 0,87,176,266,354,440,523,600,656,707,755,801,846,892,939,988,1040,1071,1103,1136,1169,1203,1237,1271,1306,1341,1376,1411,1446,1481,1516,1550,1584,1635,1676,1710,1740,1769,1800,1835,1865,1895,1924,1955,1986,2018,2052,2089,2128,2151,2176,2202,2229,2256,2285,2313,2342,2372,2400,2429,2457,2484,2510,2536,2560,2582,2605,2626,2647,2668,2688,2707,2727,2745,2764,2782,2800,2818,2835,2852,2870,2887,2904,2920,2936,2952,2968,2983,2998,3013,3028, +gamma.1_3 = 3043,3057,3071,3085,3098,3112,3125,3138,3150,3162,3174,3186,3198,3209,3220,3231,3242,3253,3264,3276,3287,3298,3309,3320,3332,3343,3355,3366,3377,3389,3400,3411,3421,3432,3442,3452,3462,3472,3481,3490,3499,3508,3516,3525,3533,3541,3548,3556,3563,3570,3577,3584,3591,3598,3605,3611,3618,3624,3631,3637,3643,3649,3655,3661,3667,3672,3678,3684,3690,3696,3702,3708,3714,3720,3726,3732,3738,3744,3750,3756,3762,3768,3774,3779,3785,3790,3795, +gamma.2_3 = 3800,3805,3810,3815,3819,3824,3829,3833,3838,3842,3846,3851,3855,3860,3864,3868,3873,3877,3881,3886,3890,3894,3898,3902,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3966,3970,3974,3978,3981,3985,3989,3992,3995,3999,4002,4005,4008,4011,4014,4017,4020,4023,4026,4029,4032,4035,4038,4041,4044,4048,4051,4054,4058,4061,4065,4068,4072,4075,4079,4082,4086,4089,4093,4095, + +[ccm] +AcmEnable = 0 +u16HighColorTempAcmOn = 5120 +u16MidColorTempAcmOn = 3633 +u16LowColorTempAcmOn = 2449 +au16HighCCMAcmOn = 475|33034|47|32833|415|32862|12|32959|435| +au16MidCCMAcmOn = 458|32975|5|32863|419|32836|7|33015|496| +au16LowCCMAcmOn = 453|32980|15|32831|312|7|23|33176|641| + +u16HighColorTempAcmOff = 5120 +u16MidColorTempAcmOff = 4633 +u16LowColorTempAcmOff = 2449 +au16HighCCMAcmOff = 475|33034|47|32833|415|32862|12|32959|435| +au16MidCCMAcmOff = 458|32975|5|32863|419|32836|7|33015|496| +au16LowCCMAcmOff = 453|32980|15|32831|312|7|23|33176|641| + +[h264venc] +vencBitrateCount = 4 +vencBitrateThresh = 1025|2049|4097|8145| + +chroma_qp_index_offset_0 = 0 +disable_deblocking_filter_idc_0 = 2 +u32DeltaQP_0 = 0 +s32IPQPDelta_0 = 4 +slice_alpha_c0_offset_div2_0 = 5 +slice_beta_offset_div2_0 = 5 +ThreshI_0 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_0 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_1 = -6 +disable_deblocking_filter_idc_1 = 2 +u32DeltaQP_1 = 1 +s32IPQPDelta_1 = 4 +slice_alpha_c0_offset_div2_1 = 5 +slice_beta_offset_div2_1 = 5 +ThreshI_1 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_1 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_2 = -4 +disable_deblocking_filter_idc_2 = 2 +u32DeltaQP_2 = 0 +s32IPQPDelta_2 = 4 +slice_alpha_c0_offset_div2_2 = 1 +slice_beta_offset_div2_2 = 1 +ThreshI_2 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_2 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_3 = 0 +disable_deblocking_filter_idc_3 = 1 +u32DeltaQP_3 = 0 +s32IPQPDelta_3 = 2 +slice_alpha_c0_offset_div2_3 = 0 +slice_beta_offset_div2_3 = 0 +ThreshI_3 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_3 = 7|7|7|7|7|9|9|9|12|15|18|25| + +[h265venc] +vencBitrateCount = 2 +vencBitrateThresh = 1024|2049| + +ThreshI_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_0 = 1 +s32IPQPDelta_0 = 1 + +ThreshI_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_1 = 1 +s32IPQPDelta_1 = 4 + +;²ʡع +ExpCount = 2 +ExpThresh = 8000|300000| +;I֡intraģʽѡ +u8NormIntra4RdCost_I_0 = 0|0| +u8NormIntra8RdCost_I_0 = 0|0| +u8NormIntra16RdCost_I_0 = 0|0| +u8NormIntra32RdCost_I_0 = 0|0| +u8SkinIntra4RdCost_I_0 = 0|0| +u8SkinIntra8RdCost_I_0 = 0|0| +u8SkinIntra16RdCost_I_0 = 0|2| +u8SkinIntra32RdCost_I_0 = 0|1| +u8HedgeIntra4RdCost_I_0 = 0|0| +u8HedgeIntra8RdCost_I_0 = 4|3| +u8HedgeIntra16RdCost_I_0 = 1|1| +u8HedgeIntra32RdCost_I_0 = 15|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_0 = 0|0| +u8NormIntra8RdCost_P_0 = 0|0| +u8NormIntra16RdCost_P_0 = 3|0| +u8NormIntra32RdCost_P_0 = 0|0| +u8SkinIntra4RdCost_P_0 = 0|0| +u8SkinIntra8RdCost_P_0 = 0|0| +u8SkinIntra16RdCost_P_0 = 0|2| +u8SkinIntra32RdCost_P_0 = 0|1| +u8HedgeIntra4RdCost_P_0 = 0|0| +u8HedgeIntra8RdCost_P_0 = 4|3| +u8HedgeIntra16RdCost_P_0 = 2|1| +u8HedgeIntra32RdCost_P_0 = 3|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_0 = 0|4| +u8NormFme16RdCost_P_0 = 0|0| +u8NormFme32RdCost_P_0 = 0|0| +u8NormFme64RdCost_P_0 = 0|0| +u8SkinFme8RdCost_P_0 = 0|0| +u8SkinFme16RdCost_P_0 = 0|0| +u8SkinFme32RdCost_P_0 = 4|4| +u8SkinFme64RdCost_P_0 = 2|2| +u8HedgeFme8RdCost_P_0 = 3|4| +u8HedgeFme16RdCost_P_0 = 3|4| +u8HedgeFme32RdCost_P_0 = 3|3| +u8HedgeFme64RdCost_P_0 = 2|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_0 = 0|4| +u8NormMerg16RdCost_P_0 = 0|0| +u8NormMerg32RdCost_P_0 = 0|0| +u8NormMerg64RdCost_P_0 = 0|0| +u8SkinMerg8RdCost_P_0 = 0|0| +u8SkinMerg16RdCost_P_0 = 0|0| +u8SkinMerg32RdCost_P_0 = 4|4| +u8SkinMerg64RdCost_P_0 = 2|2| +u8HedgeMerg8RdCost_P_0 = 3|4| +u8HedgeMerg16RdCost_P_0 = 3|4| +u8HedgeMerg32RdCost_P_0 = 3|3| +u8HedgeMerg64RdCost_P_0 = 2|2| +;I֡ɫ㷨 +bSkinEn_I_0 = 0|1| +u32SkinQpDelta_I_0 = 3|3| +u8SkinUMax_I_0 = 100|100| +u8SkinUMin_I_0 = 127|127| +u8SkinVMax_I_0 = 135|135| +u8SkinVMin_I_0 = 160|160| +u32SkinNum_I_0 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_0 = 0|1| +u32SkinQpDelta_P_0 = 3|3| +u8SkinUMax_P_0 = 100|100| +u8SkinUMin_P_0 = 127|127| +u8SkinVMax_P_0 = 135|135| +u8SkinVMin_P_0 = 160|160| +u32SkinNum_P_0 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_0 = 30|25| +u8HedgeCnt_I_0 = 4|4| +bStroEdgeEn_I_0 = 1|1| +u32StroEdgeQpDelta_I_0 = 1|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_0 = 30|25| +u8HedgeCnt_P_0 = 4|4| +bStroEdgeEn_P_0 = 1|1| +u32StroEdgeQpDelta_P_0 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_0 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_0 = 1|1| +u32Norm32MaxNum_P_0 = 4|4| +u32Norm16MaxNum_P_0 = 3|3| +u32Norm32ProtectNum_P_0 = 256|256| +u32Norm16ProtectNum_P_0 = 64|64| +u32Skin32MaxNum_P_0 = 8|8| +u32Skin16MaxNum_P_0 = 6|6| +u32Skin32ProtectNum_P_0 = 32|32| +u32Skin16ProtectNum_P_0 = 16|16| +u32Still32MaxNum_P_0 = 8|8| +u32Still16MaxNum_P_0 = 6|6| +u32Still32ProtectNum_P_0 = 64|16| +u32Still16ProtectNum_P_0 = 8|8| +u32Hedge32MaxNum_P_0 = 8|8| +u32Hedge16MaxNum_P_0 = 6|6| +u32Hedge32ProtectNum_P_0 = 32|32| +u32Hedge16ProtectNum_P_0 = 16|16| + +;I֡intraģʽѡ +u8NormIntra4RdCost_I_1 = 10|0| +u8NormIntra8RdCost_I_1 = 0|0| +u8NormIntra16RdCost_I_1 = 0|0| +u8NormIntra32RdCost_I_1 = 0|0| +u8SkinIntra4RdCost_I_1 = 0|0| +u8SkinIntra8RdCost_I_1 = 0|0| +u8SkinIntra16RdCost_I_1 = 0|2| +u8SkinIntra32RdCost_I_1 = 0|1| +u8HedgeIntra4RdCost_I_1 = 3|0| +u8HedgeIntra8RdCost_I_1 = 0|3| +u8HedgeIntra16RdCost_I_1 = 0|1| +u8HedgeIntra32RdCost_I_1 = 0|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_1 = 0|0| +u8NormIntra8RdCost_P_1 = 1|0| +u8NormIntra16RdCost_P_1 = 15|0| +u8NormIntra32RdCost_P_1 = 15|0| +u8SkinIntra4RdCost_P_1 = 0|0| +u8SkinIntra8RdCost_P_1 = 0|0| +u8SkinIntra16RdCost_P_1 = 0|2| +u8SkinIntra32RdCost_P_1 = 0|1| +u8HedgeIntra4RdCost_P_1 = 0|0| +u8HedgeIntra8RdCost_P_1 = 1|3| +u8HedgeIntra16RdCost_P_1 = 15|1| +u8HedgeIntra32RdCost_P_1 = 15|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_1 = 4|4| +u8NormFme16RdCost_P_1 = 0|0| +u8NormFme32RdCost_P_1 = 0|0| +u8NormFme64RdCost_P_1 = 0|0| +u8SkinFme8RdCost_P_1 = 0|0| +u8SkinFme16RdCost_P_1 = 0|0| +u8SkinFme32RdCost_P_1 = 4|4| +u8SkinFme64RdCost_P_1 = 2|2| +u8HedgeFme8RdCost_P_1 = 0|4| +u8HedgeFme16RdCost_P_1 = 0|4| +u8HedgeFme32RdCost_P_1 = 1|3| +u8HedgeFme64RdCost_P_1 = 1|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_1 = 4|4| +u8NormMerg16RdCost_P_1 = 0|0| +u8NormMerg32RdCost_P_1 = 0|0| +u8NormMerg64RdCost_P_1 = 0|0| +u8SkinMerg8RdCost_P_1 = 0|0| +u8SkinMerg16RdCost_P_1 = 0|0| +u8SkinMerg32RdCost_P_1 = 4|4| +u8SkinMerg64RdCost_P_1 = 2|2| +u8HedgeMerg8RdCost_P_1 = 0|4| +u8HedgeMerg16RdCost_P_1 = 0|4| +u8HedgeMerg32RdCost_P_1 = 1|3| +u8HedgeMerg64RdCost_P_1 = 1|2| +;I֡ɫ㷨 +bSkinEn_I_1 = 0|1| +u32SkinQpDelta_I_1 = 3|3| +u8SkinUMax_I_1 = 100|100| +u8SkinUMin_I_1 = 127|127| +u8SkinVMax_I_1 = 135|135| +u8SkinVMin_I_1 = 160|160| +u32SkinNum_I_1 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_1 = 0|1| +u32SkinQpDelta_P_1 = 3|3| +u8SkinUMax_P_1 = 100|100| +u8SkinUMin_P_1 = 127|127| +u8SkinVMax_P_1 = 135|135| +u8SkinVMin_P_1 = 160|160| +u32SkinNum_P_1 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_1 = 25|25| +u8HedgeCnt_I_1 = 4|4| +bStroEdgeEn_I_1 = 1|1| +u32StroEdgeQpDelta_I_1 = 0|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_1 = 25|25| +u8HedgeCnt_P_1 = 4|4| +bStroEdgeEn_P_1 = 1|1| +u32StroEdgeQpDelta_P_1 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_1 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_1 = 1|1| +u32Norm32MaxNum_P_1 = 4|4| +u32Norm16MaxNum_P_1 = 3|3| +u32Norm32ProtectNum_P_1 = 256|256| +u32Norm16ProtectNum_P_1 = 64|64| +u32Skin32MaxNum_P_1 = 8|8| +u32Skin16MaxNum_P_1 = 6|6| +u32Skin32ProtectNum_P_1 = 32|32| +u32Skin16ProtectNum_P_1 = 16|16| +u32Still32MaxNum_P_1 = 8|8| +u32Still16MaxNum_P_1 = 6|6| +u32Still32ProtectNum_P_1 = 16|16| +u32Still16ProtectNum_P_1 = 8|8| +u32Hedge32MaxNum_P_1 = 8|8| +u32Hedge16MaxNum_P_1 = 6|6| +u32Hedge32ProtectNum_P_1 = 32|32| +u32Hedge16ProtectNum_P_1 = 16|16| + +[3dnr] +3DnrIsoCount = 12 +3DnrIsoThresh = 100|200|400|800|1600|3200|6400|12800|25600|51200|102400|204800| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 100 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 120 +s32YTFStr_1 = 90 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 120 +s32YTFStr_2 = 105 +s32TFStrMax_2 = 12 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 4 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 125 +s32YTFStr_3 = 105 +s32TFStrMax_3 = 12 +s32YSFStrDlt_3 = 32 +s32YTFStrDlt_3 = 48 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 10 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 125 +s32YTFStr_4 = 115 +s32TFStrMax_4 = 12 +s32YSFStrDlt_4 = 64 +s32YTFStrDlt_4 = 63 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 48 +s32CTFstr_4 = 16 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 125 +s32YTFStr_5 = 110 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 100 +s32YTFStrDlt_5 = 63 +s32YTFStrDl_5 = 2 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 48 +s32CSFStr_5 = 48 +s32CTFstr_5 = 16 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 125 +s32YTFStr_6 = 120 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 100 +s32YTFStrDlt_6 = 63 +s32YTFStrDl_6 = 10 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 32 +s32CSFStr_6 = 56 +s32CTFstr_6 = 20 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 125 +s32YTFStr_7 = 120 +s32TFStrMax_7 = 12 +s32YSFStrDlt_7 = 100 +s32YTFStrDlt_7 = 63 +s32YTFStrDl_7 = 20 +s32YSmthStr_7 = 64 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 16 +s32CSFStr_7 = 60 +s32CTFstr_7 = 24 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 125 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 10 +s32YSFStrDlt_8 = 120 +s32YTFStrDlt_8 = 63 +s32YTFStrDl_8 = 28 +s32YSmthStr_8 = 80 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 16 +s32CSFStr_8 = 64 +s32CTFstr_8 = 28 + +s32YPKStr_9 = 0 +s32YSFStr_9 = 180 +s32YTFStr_9 = 120 +s32TFStrMax_9 = 11 +s32YSFStrDlt_9 = 127 +s32YTFStrDlt_9 = 63 +s32YTFStrDl_9 = 31 +s32YSmthStr_9 = 8 +s32YSmthRat_9 = 16 +s32YSFBriRat_9 = 16 +s32CSFStr_9 = 64 +s32CTFstr_9 = 28 + +s32YPKStr_10 = 0 +s32YSFStr_10 = 200 +s32YTFStr_10 = 120 +s32TFStrMax_10 = 12 +s32YSFStrDlt_10 = 127 +s32YTFStrDlt_10 = 63 +s32YTFStrDl_10 = 31 +s32YSmthStr_10 = 0 +s32YSmthRat_10 = 16 +s32YSFBriRat_10 = 16 +s32CSFStr_10 = 64 +s32CTFstr_10 = 28 + +s32YPKStr_11 = 0 +s32YSFStr_11 = 200 +s32YTFStr_11 = 120 +s32TFStrMax_11 = 12 +s32YSFStrDlt_11 = 127 +s32YTFStrDlt_11 = 63 +s32YTFStrDl_11 = 31 +s32YSmthStr_11 = 0 +s32YSmthRat_11 = 16 +s32YSFBriRat_11 = 16 +s32CSFStr_11 = 64 +s32CTFstr_11 = 28 + +[BLC] +AEStrategyMode = 1 +HistRatioSlope = 32 +MaxHistOffset = 64 + +[DYNAMIC] +TotalNum_normal = 7 +TotalNum_fast = 7 + +IntTime_normal = 2|20000|20000|20000|20000|40000|40000| +IntTime_fast = 2|2000|2000|5000|5000|40000|40000| + +SysGain_normal = 1024|1024|1500|1500|3072|3072|16777216| +SysGain_fast = 1024|1024|2048|2048|5120|5120|16777216| + +[HLC] +DCIEnable = 0 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +ExpCompensation = 16 +WhiteDelayFrame = 0 +BlackDelayFrame = 0 +u8Speed = 32 +HistRatioSlope = 128 +MaxHistOffset = 6 +u8Tolerance = 6 +Saturation = 120,116,104,96,88,80,72,64,56,56,56,56,56,56,56,56, +abEnLowLumaShoot = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 +u8SharpenD = 80|80|65|50|120|160|180|200|220|250|250|250|250|250|250|250 +u8SharpenUd = 30|30|32|35|35|50|60|70|120|200|250|250|250|250|250|250 +u8TextureNoiseThd = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 +u8EdgeNoiseThd = 0|0|0|0|0|0|0|0|100|200|0|0|0|0|0|0 +u8OverShoot = 140|140|130|100|75|45|25|10|0|0|0|0|0|0|0|0 +u8UnderShoot = 160|160|150|130|115|100|90|70|30|0|0|0|0|0|0|0 +gamma_0 = 0,61,123,187,250,315,380,445,511,577,643,709,775,841,906,971,1035,1098,1161,1222,1283,1342,1400,1457,1512,1565,1617,1667,1714,1760,1796,1831,1865,1897,1928,1958,1987,2015,2042,2068,2094,2118,2142,2165,2187,2209,2230,2251,2271,2291,2311,2331,2350,2369,2388,2407,2426,2445,2465,2484,2504,2524,2544,2565,2586,2598,2609,2621,2633,2644,2656,2667,2679,2690,2702,2713,2725,2736,2747,2758,2770,2781,2792,2803,2814,2825,2836,2847,2858,2869,2880, +gamma_1 = 2891,2901,2912,2923,2934,2944,2955,2965,2976,2986,2997,3007,3018,3028,3038,3048,3059,3069,3079,3089,3099,3109,3119,3129,3139,3149,3158,3168,3178,3187,3197,3207,3216,3226,3235,3244,3254,3263,3272,3281,3291,3300,3309,3318,3327,3336,3345,3354,3363,3372,3380,3389,3398,3407,3415,3424,3432,3441,3450,3458,3466,3475,3483,3491,3500,3508,3516,3524,3532,3540,3548,3556,3564,3572,3580,3587,3595,3603,3610,3618,3626,3633,3641,3648,3655,3663,3670,3677, +gamma_2 = 3684,3691,3698,3705,3712,3719,3726,3733,3740,3747,3753,3760,3766,3773,3779,3786,3792,3798,3804,3810,3816,3822,3828,3834,3839,3845,3851,3856,3861,3867,3872,3877,3882,3888,3893,3898,3903,3908,3912,3917,3922,3927,3932,3936,3941,3946,3950,3955,3960,3964,3969,3973,3978,3983,3987,3992,3996,4001,4005,4010,4014,4019,4023,4028,4033,4037,4042,4047,4051,4056,4061,4066,4070,4075,4080,4085,4090,4095, + +3DnrIsoCount = 12 +3DnrIsoThresh = 100|200|400|800|1600|3200|6400|12800|25600|51200|102400|204800| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 100 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 120 +s32YTFStr_1 = 90 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 120 +s32YTFStr_2 = 105 +s32TFStrMax_2 = 12 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 4 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 125 +s32YTFStr_3 = 105 +s32TFStrMax_3 = 12 +s32YSFStrDlt_3 = 32 +s32YTFStrDlt_3 = 48 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 10 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 125 +s32YTFStr_4 = 115 +s32TFStrMax_4 = 12 +s32YSFStrDlt_4 = 64 +s32YTFStrDlt_4 = 63 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 48 +s32CTFstr_4 = 16 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 125 +s32YTFStr_5 = 110 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 100 +s32YTFStrDlt_5 = 63 +s32YTFStrDl_5 = 2 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 48 +s32CSFStr_5 = 48 +s32CTFstr_5 = 16 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 125 +s32YTFStr_6 = 120 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 100 +s32YTFStrDlt_6 = 63 +s32YTFStrDl_6 = 10 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 32 +s32CSFStr_6 = 56 +s32CTFstr_6 = 20 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 125 +s32YTFStr_7 = 120 +s32TFStrMax_7 = 12 +s32YSFStrDlt_7 = 100 +s32YTFStrDlt_7 = 63 +s32YTFStrDl_7 = 20 +s32YSmthStr_7 = 64 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 16 +s32CSFStr_7 = 60 +s32CTFstr_7 = 24 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 125 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 10 +s32YSFStrDlt_8 = 120 +s32YTFStrDlt_8 = 63 +s32YTFStrDl_8 = 28 +s32YSmthStr_8 = 80 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 16 +s32CSFStr_8 = 64 +s32CTFstr_8 = 28 + +s32YPKStr_9 = 0 +s32YSFStr_9 = 180 +s32YTFStr_9 = 120 +s32TFStrMax_9 = 11 +s32YSFStrDlt_9 = 127 +s32YTFStrDlt_9 = 63 +s32YTFStrDl_9 = 31 +s32YSmthStr_9 = 8 +s32YSmthRat_9 = 16 +s32YSFBriRat_9 = 16 +s32CSFStr_9 = 64 +s32CTFstr_9 = 28 + +s32YPKStr_10 = 0 +s32YSFStr_10 = 200 +s32YTFStr_10 = 120 +s32TFStrMax_10 = 12 +s32YSFStrDlt_10 = 127 +s32YTFStrDlt_10 = 63 +s32YTFStrDl_10 = 31 +s32YSmthStr_10 = 0 +s32YSmthRat_10 = 16 +s32YSFBriRat_10 = 16 +s32CSFStr_10 = 64 +s32CTFstr_10 = 28 + +s32YPKStr_11 = 0 +s32YSFStr_11 = 200 +s32YTFStr_11 = 120 +s32TFStrMax_11 = 12 +s32YSFStrDlt_11 = 127 +s32YTFStrDlt_11 = 63 +s32YTFStrDl_11 = 31 +s32YSmthStr_11 = 0 +s32YSmthRat_11 = 16 +s32YSFBriRat_11 = 16 +s32CSFStr_11 = 64 +s32CTFstr_11 = 28 + +[IR] +ExpCount = 4 +ExpThreshHtoL = 600000|1800000|4000000|7000000| +ExpThreshLtoH = 700000|2200000|5000000|8000000| +ExpCompensation = 50|48|38|32| +MaxHistOffset = 20|18|14|10| + +u16HistRatioSlope = 64 +BlackDelayFrame = 30 +WhiteDelayFrame = 30 + +u8Tolerance = 3 +u8Speed = 16 +DCIEnable = 1 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +IRu16Slope = 0,0,0,0,1,1,2,2,3,3,3,3,3,3,3,3 +abEnLowLumaShoot = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 +u8SharpenD = 80|80|65|50|120|160|180|200|220|250|250|250|250|250|250|250 +u8SharpenUd = 30|30|32|35|35|50|60|70|120|200|250|250|250|250|250|250 +u8TextureNoiseThd = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 +u8EdgeNoiseThd = 0|0|0|0|0|0|0|0|100|200|0|0|0|0|0|0 +u8OverShoot = 140|140|130|100|75|45|25|10|0|0|0|0|0|0|0|0 +u8UnderShoot = 160|160|150|130|115|100|90|70|30|0|0|0|0|0|0|0 +gamma_0 = 0,76,154,234,313,390,463,531,592,646,694,736,775,812,847,881,916,951,984,1016,1047,1077,1107,1137,1168,1200,1231,1263,1294,1325,1356,1387,1417,1448,1478,1508,1537,1567,1595,1624,1651,1677,1702,1727,1752,1777,1803,1828,1854,1880,1906,1932,1958,1984,2010,2036,2062,2087,2112,2137,2161,2185,2209,2232,2255,2277,2299,2321,2342,2363,2383,2404,2424,2443,2463,2482,2501,2520,2539,2557,2576,2594,2612,2630,2648,2665,2682, +gamma_1 = 2699,2716,2733,2749,2766,2782,2799,2815,2831,2847,2863,2879,2895,2911,2927,2942,2958,2974,2989,3004,3019,3034,3049,3063,3078,3092,3106,3120,3133,3147,3160,3173,3186,3199,3212,3224,3237,3249,3262,3274,3286,3298,3310,3322,3334,3346,3357,3369,3381,3392,3403,3414,3425,3436,3447,3457,3468,3478,3488,3498,3507,3517,3526,3535,3544,3552,3561,3569,3578,3586,3595,3603,3612,3620,3628,3637,3645,3654,3662,3671,3679,3687,3695,3703,3711, +gamma_2 = 3719,3727,3734,3741,3748,3755,3761,3768,3774,3780,3786,3791,3797,3802,3808,3813,3818,3823,3828,3833,3838,3843,3847,3852,3856,3860,3864,3868,3872,3876,3880,3884,3887,3891,3895,3899,3903,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3967,3971,3975,3978,3982,3985,3989,3992,3996,4000,4003,4007,4010,4014,4018,4022,4026,4030,4034,4038,4043,4047,4051,4056,4060,4065,4069,4074,4078,4083,4087,4092,4095 + +expweight_0 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_1 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_2 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_3 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_4 =1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1, +expweight_5 =1,1,1,1,1,2,3,3,3,3,3,1,1,1,1,1,1, +expweight_6 =1,1,1,1,2,3,4,4,4,4,4,3,2,1,1,1,1, +expweight_7 =1,1,1,2,3,4,4,4,4,4,4,4,3,2,1,1,1, +expweight_8 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_9 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_10 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_11 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_12 =1,1,1,1,2,3,3,3,3,3,3,3,2,1,1,1,1, +expweight_13 =1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1, +expweight_14 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + +3DnrIsoCount = 12 +3DnrIsoThresh = 100|200|400|800|1600|3200|6400|12800|25600|51200|102400|204800| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 100 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 120 +s32YTFStr_1 = 90 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 120 +s32YTFStr_2 = 105 +s32TFStrMax_2 = 12 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 4 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 125 +s32YTFStr_3 = 105 +s32TFStrMax_3 = 12 +s32YSFStrDlt_3 = 32 +s32YTFStrDlt_3 = 48 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 10 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 125 +s32YTFStr_4 = 115 +s32TFStrMax_4 = 12 +s32YSFStrDlt_4 = 64 +s32YTFStrDlt_4 = 63 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 48 +s32CTFstr_4 = 16 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 125 +s32YTFStr_5 = 110 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 100 +s32YTFStrDlt_5 = 63 +s32YTFStrDl_5 = 2 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 48 +s32CSFStr_5 = 48 +s32CTFstr_5 = 16 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 125 +s32YTFStr_6 = 120 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 100 +s32YTFStrDlt_6 = 63 +s32YTFStrDl_6 = 10 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 32 +s32CSFStr_6 = 56 +s32CTFstr_6 = 20 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 125 +s32YTFStr_7 = 120 +s32TFStrMax_7 = 12 +s32YSFStrDlt_7 = 100 +s32YTFStrDlt_7 = 63 +s32YTFStrDl_7 = 20 +s32YSmthStr_7 = 64 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 16 +s32CSFStr_7 = 60 +s32CTFstr_7 = 24 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 125 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 10 +s32YSFStrDlt_8 = 120 +s32YTFStrDlt_8 = 63 +s32YTFStrDl_8 = 28 +s32YSmthStr_8 = 80 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 16 +s32CSFStr_8 = 64 +s32CTFstr_8 = 28 + +s32YPKStr_9 = 0 +s32YSFStr_9 = 180 +s32YTFStr_9 = 120 +s32TFStrMax_9 = 11 +s32YSFStrDlt_9 = 127 +s32YTFStrDlt_9 = 63 +s32YTFStrDl_9 = 31 +s32YSmthStr_9 = 8 +s32YSmthRat_9 = 16 +s32YSFBriRat_9 = 16 +s32CSFStr_9 = 64 +s32CTFstr_9 = 28 + +s32YPKStr_10 = 0 +s32YSFStr_10 = 200 +s32YTFStr_10 = 120 +s32TFStrMax_10 = 12 +s32YSFStrDlt_10 = 127 +s32YTFStrDlt_10 = 63 +s32YTFStrDl_10 = 31 +s32YSmthStr_10 = 0 +s32YSmthRat_10 = 16 +s32YSFBriRat_10 = 16 +s32CSFStr_10 = 64 +s32CTFstr_10 = 28 + +s32YPKStr_11 = 0 +s32YSFStr_11 = 200 +s32YTFStr_11 = 120 +s32TFStrMax_11 = 12 +s32YSFStrDlt_11 = 127 +s32YTFStrDlt_11 = 63 +s32YTFStrDl_11 = 31 +s32YSmthStr_11 = 0 +s32YSmthRat_11 = 16 +s32YSFBriRat_11 = 16 +s32CSFStr_11 = 64 +s32CTFstr_11 = 28 + +[DRC] +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +DRCu16BrightGainLmt = 127 +DRCu16DarkGainLmtC = 127 +DRCu16DarkGainLmtY = 127 +DRCu8Asymmetry = 2 +DRCu8LocalMixingBrigtht = 45 +DRCu8LocalMixingDark = 45 +DRCu8LocalMixingThres = 2 +DRCu8RangeVar = 0 +DRCu8SecondPole = 180 +DRCu8SpatialVar = 10 +DRCu8Stretch = 54 + + + + + diff --git a/device/mpp/sample/scene_auto/ini/IPC/sceneauto_ov9752.ini b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_ov9752.ini new file mode 100644 index 0000000..a870de0 --- /dev/null +++ b/device/mpp/sample/scene_auto/ini/IPC/sceneauto_ov9752.ini @@ -0,0 +1,963 @@ +[common] +IspDev = 0 +ViDev = 0 +ViChn = 0 +VpssGrp = 0 +VpssChn = 0 +VencGrp = 0 +VencChn = 0 + +IVE_Enable = 0; + +HLC_AutoEnable = 0; +HLC_thr_off = 140000 ;threshold value for HLC auto off +HLC_thr_on = 150000 ;threshold value for HLC auto on +HLC_tolerance = 3000 +HLC_expthr = 6000 +HLC_count = 5 + +ave_lum_thresh = 30 +delta_dis_expthresh = 20 +dci_strength_lut = 32,33,33,34,34,35,35,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,48,48,49,49,50,50,50,49,49,49,49,48,48,48,48,48,47,47,47,47,46,46,46,46,46,45,45,45,45,44,44,44,44,43,43,43,43,43,42,42,42,42,41,41,41,41,41,40,40,40,40,39,39,39,39,39,38,38,38,38,37,37,37,37,37,36,36,36,36,35,35,35,35,34,34,34,34,34,33,33,33,33,32 + +exposure_thr_indoor = 10000 +exposure_thr_outdoor = 100 + +fpn_exp_thresh = 200000 ;threshold value for fpn auto on + +u32DRCStrengthThresh = 48 + +[AE] +aeRunInterval = 2 +aeBitrateCount = 3 ;the counts of bitrate level +aeBitrateThresh = 1024|4060|8159| ;threshold value for each bitrate level + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 0 of bitrate +u8Speed_0 = 64 +u8Tolerance_0 = 3 +u16BlackDelayFrame_0 = 25 +u16WhiteDelayFrame_0 = 15 +u32SysGainMax_0 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 1 of bitrate +u8Speed_1 = 64 +u8Tolerance_1 = 3 +u16BlackDelayFrame_1 = 15 +u16WhiteDelayFrame_1 = 10 +u32SysGainMax_1 = 8192000 + +;AE speed, tolerance, blackdelayframe, whitedelayframe and sysgainmax for level 2 of bitrate +u8Speed_2 = 64 +u8Tolerance_2 = 2 +u16BlackDelayFrame_2 = 0 +u16WhiteDelayFrame_2 = 0 +u32SysGainMax_2 = 8192000 + +aeExpCount = 5 ;the counts of exposure level +aeExpDtoLThresh = 6000|30000|240000|800000|8000000| ;threshold value for each exposure level from dark to light +aeExpLtoDThresh = 8000|40000|300000|1000000|10000000| ;threshold value for each exposure level from light to dark + +;AE compesation and histoffset for each level of exposure +aeCompesation = 62|56|56|48|48| +aeHistOffset = 12|12|20|20|20| + +[sharpen] +IsoThresh = 200 +ExpCount = 2 +ExpThresh = 2000|10000 + +abEnLowLumaShoot_0 = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_0 = 40|42|45|50|70|80|100|130|180|220|250|250|250|250|250|250 ; +SharpenUd_0 = 64|62|60|55|50|45|30|50|90|160|210|250|250|250|250|250 ; +TextureNoiseThd_0 = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 ; +EdgeNoiseThd_0 = 0|0|0|0|0|0|0|0|100|200|0|0|0|0|0|0 ; +overshoot_0 = 100|95|90|85|80|60|55|10|0|0|0|0|0|0|0|0 ; +undershoot_0 = 140|130|120|100|90|76|66|45|30|0|0|0|0|0|0|0 ; + +abEnLowLumaShoot_1 = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 ; +SharpenD_1 = 40|42|45|50|70|80|100|130|180|220|250|250|250|250|250|250 ; +SharpenUd_1 = 64|62|60|55|50|45|30|50|90|160|210|250|250|250|250|250 ; +TextureNoiseThd_1 = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 ; +EdgeNoiseThd_1 = 0|0|0|0|0|0|0|0|100|200|0|0|0|0|0|0 ; +overshoot_1 = 100|95|90|85|80|60|55|10|0|0|0|0|0|0|0|0 ; +undershoot_1 = 140|130|120|100|90|76|66|45|30|0|0|0|0|0|0|0 ; + +[gamma] +DelayCount = 1 +Interval = 10 +ExpCount = 4 +ExpThreshLtoD = 8000|40000|400000|4000000| +ExpThreshDtoL = 6000|35000|350000|3200000| + +gamma.0_0 = 0,180,320,426,516,590,660,730,786,844,896,946,994,1040,1090,1130,1170,1210,1248,1296,1336,1372,1416,1452,1486,1516,1546,1580,1616,1652,1678,1714,1742,1776,1798,1830,1862,1886,1912,1940,1968,1992,2010,2038,2062,2090,2114,2134,2158,2178,2202,2222,2246,2266,2282,2300,2324,2344,2360,2372,2390,2406,2422,2438,2458,2478,2494,2510,2526,2546,2562,2582,2598,2614,2630,2648,2660,2670,2682,2698,2710,2724,2736,2752,2764,2780,2792,2808,2820,2836, +gamma.1_0 = 2848,2864,2876,2888,2896,2908,2920,2928,2940,2948,2960,2972,2984,2992,3004,3014,3028,3036,3048,3056,3068,3080,3088,3100,3110,3120,3128,3140,3148,3160,3168,3174,3182,3190,3202,3210,3218,3228,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3530,3538,3546,3554,3558,3564,3570,3574,3582,3590,3598,3604,3610,3618,3628,3634,3640,3644,3652, +gamma.2_0 = 3656,3664,3670,3678,3688,3696,3700,3708,3712,3716,3722,3730,3736,3740,3748,3752,3756,3760,3766,3774,3778,3786,3790,3800,3808,3812,3816,3824,3830,3832,3842,3846,3850,3854,3858,3862,3864,3870,3874,3878,3882,3888,3894,3900,3908,3912,3918,3924,3928,3934,3940,3946,3952,3958,3966,3974,3978,3982,3986,3990,3994,4002,4006,4010,4018,4022,4032,4038,4046,4050,4056,4062,4072,4076,4084,4090,4095 + +gamma.0_1 = 0,120,220,310,390,470,540,610,670,730,786,842,894,944,994,1050,1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568,1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907,1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184,2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422,2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570, +gamma.1_1 = 2583,2596,2609,2621,2634,2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825,2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001,3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165,3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318,3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463,3471,3480,3489, +gamma.2_1 = 3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600,3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730,3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855,3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974,3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095, + +gamma.0_2 = 0,90,181,272,363,452,541,606,669,731,794,856,920,986,1055,1086,1118,1149,1181,1213,1246,1279,1312,1345,1379,1413,1447,1483,1518,1554,1591,1628,1666,1688,1710,1733,1756,1780,1804,1828,1852,1877,1902,1928,1953,1978,2004,2029,2055,2080,2106,2131,2156,2181,2206,2230,2254,2277,2301,2323,2346,2367,2389,2409,2429,2448,2467,2486,2505,2523,2540,2558,2575,2592,2608,2625,2641,2656,2672,2687,2702,2717,2732,2746,2760,2774,2788,2802,2816,2829,2842, +gamma.1_2 = 2856,2869,2882,2895,2907,2920,2933,2945,2957,2968,2980,2991,3002,3013,3023,3034,3044,3054,3064,3074,3083,3093,3102,3112,3121,3130,3139,3148,3157,3166,3175,3185,3194,3203,3212,3221,3231,3240,3256,3266,3276,3288,3300,3306,3318,3326,3334,3342,3350,3360,3370,3378,3386,3394,3398,3406,3414,3422,3426,3436,3444,3454,3466,3476,3486,3498,3502,3510,3518,3526,3534,3541,3549,3556,3563,3571,3578,3585,3591,3598,3605,3612,3618,3625,3631,3638,3644,3650, +gamma.2_2 = 3657,3663,3669,3675,3681,3687,3694,3700,3706,3712,3718,3724,3730,3736,3742,3748,3754,3760,3766,3771,3777,3783,3789,3794,3800,3805,3811,3816,3822,3827,3833,3838,3844,3849,3855,3860,3865,3871,3876,3882,3887,3893,3898,3904,3909,3915,3921,3926,3932,3937,3943,3949,3954,3960,3966,3971,3977,3982,3988,3994,3999,4005,4011,4016,4022,4027,4033,4039,4044,4050,4056,4061,4067,4072,4078,4084,4089,4095, + +gamma.0_3 = 0,87,176,266,354,440,523,600,656,707,755,801,846,892,939,988,1040,1071,1103,1136,1169,1203,1237,1271,1306,1341,1376,1411,1446,1481,1516,1550,1584,1635,1676,1710,1740,1769,1800,1835,1865,1895,1924,1955,1986,2018,2052,2089,2128,2151,2176,2202,2229,2256,2285,2313,2342,2372,2400,2429,2457,2484,2510,2536,2560,2582,2605,2626,2647,2668,2688,2707,2727,2745,2764,2782,2800,2818,2835,2852,2870,2887,2904,2920,2936,2952,2968,2983,2998,3013,3028, +gamma.1_3 = 3043,3057,3071,3085,3098,3112,3125,3138,3150,3162,3174,3186,3198,3209,3220,3231,3242,3253,3264,3276,3287,3298,3309,3320,3332,3343,3355,3366,3377,3389,3400,3411,3421,3432,3442,3452,3462,3472,3481,3490,3499,3508,3516,3525,3533,3541,3548,3556,3563,3570,3577,3584,3591,3598,3605,3611,3618,3624,3631,3637,3643,3649,3655,3661,3667,3672,3678,3684,3690,3696,3702,3708,3714,3720,3726,3732,3738,3744,3750,3756,3762,3768,3774,3779,3785,3790,3795, +gamma.2_3 = 3800,3805,3810,3815,3819,3824,3829,3833,3838,3842,3846,3851,3855,3860,3864,3868,3873,3877,3881,3886,3890,3894,3898,3902,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3966,3970,3974,3978,3981,3985,3989,3992,3995,3999,4002,4005,4008,4011,4014,4017,4020,4023,4026,4029,4032,4035,4038,4041,4044,4048,4051,4054,4058,4061,4065,4068,4072,4075,4079,4082,4086,4089,4093,4095, + +[ccm] +AcmEnable = 0 +u16HighColorTempAcmOn = 5120 +u16MidColorTempAcmOn = 3633 +u16LowColorTempAcmOn = 2449 +au16HighCCMAcmOn = 475|33034|47|32833|415|32862|12|32959|435| +au16MidCCMAcmOn = 458|32975|5|32863|419|32836|7|33015|496| +au16LowCCMAcmOn = 453|32980|15|32831|312|7|23|33176|641| + +u16HighColorTempAcmOff = 5120 +u16MidColorTempAcmOff = 4633 +u16LowColorTempAcmOff = 2449 +au16HighCCMAcmOff = 475|33034|47|32833|415|32862|12|32959|435| +au16MidCCMAcmOff = 458|32975|5|32863|419|32836|7|33015|496| +au16LowCCMAcmOff = 453|32980|15|32831|312|7|23|33176|641| + +[h264venc] +vencBitrateCount = 4 +vencBitrateThresh = 513|1025|2049|4097| + +chroma_qp_index_offset_0 = 0 +disable_deblocking_filter_idc_0 = 2 +u32DeltaQP_0 = 0 +s32IPQPDelta_0 = 4 +slice_alpha_c0_offset_div2_0 = 5 +slice_beta_offset_div2_0 = 5 +ThreshI_0 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_0 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_1 = -6 +disable_deblocking_filter_idc_1 = 2 +u32DeltaQP_1 = 1 +s32IPQPDelta_1 = 4 +slice_alpha_c0_offset_div2_1 = 5 +slice_beta_offset_div2_1 = 5 +ThreshI_1 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_1 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_2 = -4 +disable_deblocking_filter_idc_2 = 2 +u32DeltaQP_2 = 0 +s32IPQPDelta_2 = 4 +slice_alpha_c0_offset_div2_2 = 1 +slice_beta_offset_div2_2 = 1 +ThreshI_2 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_2 = 7|7|7|7|7|9|9|9|12|15|18|25| + +chroma_qp_index_offset_3 = 0 +disable_deblocking_filter_idc_3 = 1 +u32DeltaQP_3 = 0 +s32IPQPDelta_3 = 2 +slice_alpha_c0_offset_div2_3 = 0 +slice_beta_offset_div2_3 = 0 +ThreshI_3 = 7|7|7|7|7|9|9|9|12|15|18|25| +ThreshP_3 = 7|7|7|7|7|9|9|9|12|15|18|25| + +[h265venc] +vencBitrateCount = 2 +vencBitrateThresh = 1024|2049| + +ThreshI_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_0 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_0 = 1 +s32IPQPDelta_0 = 1 + +ThreshI_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +ThreshP_1 = 3|3|5|5|8|8|8|15|20|20|25|25| +u32RowQpDelta_1 = 1 +s32IPQPDelta_1 = 4 + +;²ʡع +ExpCount = 2 +ExpThresh = 8000|300000| +;I֡intraģʽѡ +u8NormIntra4RdCost_I_0 = 0|0| +u8NormIntra8RdCost_I_0 = 0|0| +u8NormIntra16RdCost_I_0 = 0|0| +u8NormIntra32RdCost_I_0 = 0|0| +u8SkinIntra4RdCost_I_0 = 0|0| +u8SkinIntra8RdCost_I_0 = 0|0| +u8SkinIntra16RdCost_I_0 = 0|2| +u8SkinIntra32RdCost_I_0 = 0|1| +u8HedgeIntra4RdCost_I_0 = 0|0| +u8HedgeIntra8RdCost_I_0 = 4|3| +u8HedgeIntra16RdCost_I_0 = 1|1| +u8HedgeIntra32RdCost_I_0 = 15|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_0 = 0|0| +u8NormIntra8RdCost_P_0 = 0|0| +u8NormIntra16RdCost_P_0 = 3|0| +u8NormIntra32RdCost_P_0 = 0|0| +u8SkinIntra4RdCost_P_0 = 0|0| +u8SkinIntra8RdCost_P_0 = 0|0| +u8SkinIntra16RdCost_P_0 = 0|2| +u8SkinIntra32RdCost_P_0 = 0|1| +u8HedgeIntra4RdCost_P_0 = 0|0| +u8HedgeIntra8RdCost_P_0 = 4|3| +u8HedgeIntra16RdCost_P_0 = 2|1| +u8HedgeIntra32RdCost_P_0 = 3|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_0 = 0|4| +u8NormFme16RdCost_P_0 = 0|0| +u8NormFme32RdCost_P_0 = 0|0| +u8NormFme64RdCost_P_0 = 0|0| +u8SkinFme8RdCost_P_0 = 0|0| +u8SkinFme16RdCost_P_0 = 0|0| +u8SkinFme32RdCost_P_0 = 4|4| +u8SkinFme64RdCost_P_0 = 2|2| +u8HedgeFme8RdCost_P_0 = 3|4| +u8HedgeFme16RdCost_P_0 = 3|4| +u8HedgeFme32RdCost_P_0 = 3|3| +u8HedgeFme64RdCost_P_0 = 2|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_0 = 0|4| +u8NormMerg16RdCost_P_0 = 0|0| +u8NormMerg32RdCost_P_0 = 0|0| +u8NormMerg64RdCost_P_0 = 0|0| +u8SkinMerg8RdCost_P_0 = 0|0| +u8SkinMerg16RdCost_P_0 = 0|0| +u8SkinMerg32RdCost_P_0 = 4|4| +u8SkinMerg64RdCost_P_0 = 2|2| +u8HedgeMerg8RdCost_P_0 = 3|4| +u8HedgeMerg16RdCost_P_0 = 3|4| +u8HedgeMerg32RdCost_P_0 = 3|3| +u8HedgeMerg64RdCost_P_0 = 2|2| +;I֡ɫ㷨 +bSkinEn_I_0 = 0|1| +u32SkinQpDelta_I_0 = 3|3| +u8SkinUMax_I_0 = 100|100| +u8SkinUMin_I_0 = 127|127| +u8SkinVMax_I_0 = 135|135| +u8SkinVMin_I_0 = 160|160| +u32SkinNum_I_0 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_0 = 0|1| +u32SkinQpDelta_P_0 = 3|3| +u8SkinUMax_P_0 = 100|100| +u8SkinUMin_P_0 = 127|127| +u8SkinVMax_P_0 = 135|135| +u8SkinVMin_P_0 = 160|160| +u32SkinNum_P_0 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_0 = 30|25| +u8HedgeCnt_I_0 = 4|4| +bStroEdgeEn_I_0 = 1|1| +u32StroEdgeQpDelta_I_0 = 1|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_0 = 30|25| +u8HedgeCnt_P_0 = 4|4| +bStroEdgeEn_P_0 = 1|1| +u32StroEdgeQpDelta_P_0 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_0 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_0 = 1|1| +u32Norm32MaxNum_P_0 = 4|4| +u32Norm16MaxNum_P_0 = 3|3| +u32Norm32ProtectNum_P_0 = 256|256| +u32Norm16ProtectNum_P_0 = 64|64| +u32Skin32MaxNum_P_0 = 8|8| +u32Skin16MaxNum_P_0 = 6|6| +u32Skin32ProtectNum_P_0 = 32|32| +u32Skin16ProtectNum_P_0 = 16|16| +u32Still32MaxNum_P_0 = 8|8| +u32Still16MaxNum_P_0 = 6|6| +u32Still32ProtectNum_P_0 = 64|16| +u32Still16ProtectNum_P_0 = 8|8| +u32Hedge32MaxNum_P_0 = 8|8| +u32Hedge16MaxNum_P_0 = 6|6| +u32Hedge32ProtectNum_P_0 = 32|32| +u32Hedge16ProtectNum_P_0 = 16|16| + +;I֡intraģʽѡ +u8NormIntra4RdCost_I_1 = 10|0| +u8NormIntra8RdCost_I_1 = 0|0| +u8NormIntra16RdCost_I_1 = 0|0| +u8NormIntra32RdCost_I_1 = 0|0| +u8SkinIntra4RdCost_I_1 = 0|0| +u8SkinIntra8RdCost_I_1 = 0|0| +u8SkinIntra16RdCost_I_1 = 0|2| +u8SkinIntra32RdCost_I_1 = 0|1| +u8HedgeIntra4RdCost_I_1 = 3|0| +u8HedgeIntra8RdCost_I_1 = 0|3| +u8HedgeIntra16RdCost_I_1 = 0|1| +u8HedgeIntra32RdCost_I_1 = 0|15| +;P֡intraģʽѡ +u8NormIntra4RdCost_P_1 = 0|0| +u8NormIntra8RdCost_P_1 = 1|0| +u8NormIntra16RdCost_P_1 = 15|0| +u8NormIntra32RdCost_P_1 = 15|0| +u8SkinIntra4RdCost_P_1 = 0|0| +u8SkinIntra8RdCost_P_1 = 0|0| +u8SkinIntra16RdCost_P_1 = 0|2| +u8SkinIntra32RdCost_P_1 = 0|1| +u8HedgeIntra4RdCost_P_1 = 0|0| +u8HedgeIntra8RdCost_P_1 = 1|3| +u8HedgeIntra16RdCost_P_1 = 15|1| +u8HedgeIntra32RdCost_P_1 = 15|15| +;P֡FMEģʽѡ +u8NormFme8RdCost_P_1 = 4|4| +u8NormFme16RdCost_P_1 = 0|0| +u8NormFme32RdCost_P_1 = 0|0| +u8NormFme64RdCost_P_1 = 0|0| +u8SkinFme8RdCost_P_1 = 0|0| +u8SkinFme16RdCost_P_1 = 0|0| +u8SkinFme32RdCost_P_1 = 4|4| +u8SkinFme64RdCost_P_1 = 2|2| +u8HedgeFme8RdCost_P_1 = 0|4| +u8HedgeFme16RdCost_P_1 = 0|4| +u8HedgeFme32RdCost_P_1 = 1|3| +u8HedgeFme64RdCost_P_1 = 1|2| +;P֡MERGEģʽѡ +u8NormMerg8RdCost_P_1 = 4|4| +u8NormMerg16RdCost_P_1 = 0|0| +u8NormMerg32RdCost_P_1 = 0|0| +u8NormMerg64RdCost_P_1 = 0|0| +u8SkinMerg8RdCost_P_1 = 0|0| +u8SkinMerg16RdCost_P_1 = 0|0| +u8SkinMerg32RdCost_P_1 = 4|4| +u8SkinMerg64RdCost_P_1 = 2|2| +u8HedgeMerg8RdCost_P_1 = 0|4| +u8HedgeMerg16RdCost_P_1 = 0|4| +u8HedgeMerg32RdCost_P_1 = 1|3| +u8HedgeMerg64RdCost_P_1 = 1|2| +;I֡ɫ㷨 +bSkinEn_I_1 = 0|1| +u32SkinQpDelta_I_1 = 3|3| +u8SkinUMax_I_1 = 100|100| +u8SkinUMin_I_1 = 127|127| +u8SkinVMax_I_1 = 135|135| +u8SkinVMin_I_1 = 160|160| +u32SkinNum_I_1 = 200|200| +;P֡ɫ㷨 +bSkinEn_P_1 = 0|1| +u32SkinQpDelta_P_1 = 3|3| +u8SkinUMax_P_1 = 100|100| +u8SkinUMin_P_1 = 127|127| +u8SkinVMax_P_1 = 135|135| +u8SkinVMin_P_1 = 160|160| +u32SkinNum_P_1 = 200|200| +;I֡ǿԵ㷨 +u8HedgeThr_I_1 = 25|25| +u8HedgeCnt_I_1 = 4|4| +bStroEdgeEn_I_1 = 1|1| +u32StroEdgeQpDelta_I_1 = 0|0| +;P֡ǿԵ㷨 +u8HedgeThr_P_1 = 25|25| +u8HedgeCnt_P_1 = 4|4| +bStroEdgeEn_P_1 = 1|1| +u32StroEdgeQpDelta_P_1 = 4|4| +;I֡DCT ROUNDING㷨 +bImproveEn_I_1 = 0|0| +;P֡DCT ROUNDING㷨 +bImproveEn_P_1 = 1|1| +u32Norm32MaxNum_P_1 = 4|4| +u32Norm16MaxNum_P_1 = 3|3| +u32Norm32ProtectNum_P_1 = 256|256| +u32Norm16ProtectNum_P_1 = 64|64| +u32Skin32MaxNum_P_1 = 8|8| +u32Skin16MaxNum_P_1 = 6|6| +u32Skin32ProtectNum_P_1 = 32|32| +u32Skin16ProtectNum_P_1 = 16|16| +u32Still32MaxNum_P_1 = 8|8| +u32Still16MaxNum_P_1 = 6|6| +u32Still32ProtectNum_P_1 = 16|16| +u32Still16ProtectNum_P_1 = 8|8| +u32Hedge32MaxNum_P_1 = 8|8| +u32Hedge16MaxNum_P_1 = 6|6| +u32Hedge32ProtectNum_P_1 = 32|32| +u32Hedge16ProtectNum_P_1 = 16|16| + +[3dnr] +3DnrIsoCount = 12 +3DnrIsoThresh = 100|200|400|800|1600|3200|6400|12800|25600|51200|102400|204800| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 100 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 120 +s32YTFStr_1 = 90 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 120 +s32YTFStr_2 = 105 +s32TFStrMax_2 = 12 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 4 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 125 +s32YTFStr_3 = 105 +s32TFStrMax_3 = 12 +s32YSFStrDlt_3 = 32 +s32YTFStrDlt_3 = 48 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 10 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 125 +s32YTFStr_4 = 115 +s32TFStrMax_4 = 12 +s32YSFStrDlt_4 = 64 +s32YTFStrDlt_4 = 63 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 48 +s32CTFstr_4 = 16 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 125 +s32YTFStr_5 = 110 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 100 +s32YTFStrDlt_5 = 63 +s32YTFStrDl_5 = 2 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 48 +s32CSFStr_5 = 48 +s32CTFstr_5 = 16 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 125 +s32YTFStr_6 = 120 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 100 +s32YTFStrDlt_6 = 63 +s32YTFStrDl_6 = 10 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 32 +s32CSFStr_6 = 56 +s32CTFstr_6 = 20 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 125 +s32YTFStr_7 = 120 +s32TFStrMax_7 = 12 +s32YSFStrDlt_7 = 100 +s32YTFStrDlt_7 = 63 +s32YTFStrDl_7 = 20 +s32YSmthStr_7 = 64 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 16 +s32CSFStr_7 = 60 +s32CTFstr_7 = 24 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 125 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 10 +s32YSFStrDlt_8 = 120 +s32YTFStrDlt_8 = 63 +s32YTFStrDl_8 = 28 +s32YSmthStr_8 = 80 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 16 +s32CSFStr_8 = 64 +s32CTFstr_8 = 28 + +s32YPKStr_9 = 0 +s32YSFStr_9 = 180 +s32YTFStr_9 = 120 +s32TFStrMax_9 = 11 +s32YSFStrDlt_9 = 127 +s32YTFStrDlt_9 = 63 +s32YTFStrDl_9 = 31 +s32YSmthStr_9 = 8 +s32YSmthRat_9 = 16 +s32YSFBriRat_9 = 16 +s32CSFStr_9 = 64 +s32CTFstr_9 = 28 + +s32YPKStr_10 = 0 +s32YSFStr_10 = 200 +s32YTFStr_10 = 120 +s32TFStrMax_10 = 12 +s32YSFStrDlt_10 = 127 +s32YTFStrDlt_10 = 63 +s32YTFStrDl_10 = 31 +s32YSmthStr_10 = 0 +s32YSmthRat_10 = 16 +s32YSFBriRat_10 = 16 +s32CSFStr_10 = 64 +s32CTFstr_10 = 28 + +s32YPKStr_11 = 0 +s32YSFStr_11 = 200 +s32YTFStr_11 = 120 +s32TFStrMax_11 = 12 +s32YSFStrDlt_11 = 127 +s32YTFStrDlt_11 = 63 +s32YTFStrDl_11 = 31 +s32YSmthStr_11 = 0 +s32YSmthRat_11 = 16 +s32YSFBriRat_11 = 16 +s32CSFStr_11 = 64 +s32CTFstr_11 = 28 + +[BLC] +AEStrategyMode = 1 +HistRatioSlope = 32 +MaxHistOffset = 64 + +[DYNAMIC] +TotalNum_normal = 7 +TotalNum_fast = 7 + +IntTime_normal = 2|20000|20000|20000|20000|40000|40000| +IntTime_fast = 2|2000|2000|5000|5000|40000|40000| + +SysGain_normal = 1024|1024|1500|1500|3072|3072|16777216| +SysGain_fast = 1024|1024|2048|2048|5120|5120|16777216| + +[HLC] +DCIEnable = 0 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +ExpCompensation = 16 +WhiteDelayFrame = 0 +BlackDelayFrame = 0 +u8Speed = 32 +HistRatioSlope = 128 +MaxHistOffset = 6 +u8Tolerance = 6 +Saturation = 120,116,104,96,88,80,72,64,56,56,56,56,56,56,56,56, +abEnLowLumaShoot = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 +u8SharpenD = 40|42|45|50|70|80|100|130|180|220|250|250|250|250|250|250 +u8SharpenUd = 45|43|35|30|25|20|20|50|90|160|210|250|250|250|250|250 +u8TextureNoiseThd = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 +u8EdgeNoiseThd = 0|0|0|0|0|0|0|0|100|200|0|0|0|0|0|0 +u8OverShoot = 100|95|90|85|80|60|55|10|0|0|0|0|0|0|0|0 +u8UnderShoot = 140|130|120|100|90|76|66|45|30|0|0|0|0|0|0|0 +gamma_0 = 0,61,123,187,250,315,380,445,511,577,643,709,775,841,906,971,1035,1098,1161,1222,1283,1342,1400,1457,1512,1565,1617,1667,1714,1760,1796,1831,1865,1897,1928,1958,1987,2015,2042,2068,2094,2118,2142,2165,2187,2209,2230,2251,2271,2291,2311,2331,2350,2369,2388,2407,2426,2445,2465,2484,2504,2524,2544,2565,2586,2598,2609,2621,2633,2644,2656,2667,2679,2690,2702,2713,2725,2736,2747,2758,2770,2781,2792,2803,2814,2825,2836,2847,2858,2869,2880, +gamma_1 = 2891,2901,2912,2923,2934,2944,2955,2965,2976,2986,2997,3007,3018,3028,3038,3048,3059,3069,3079,3089,3099,3109,3119,3129,3139,3149,3158,3168,3178,3187,3197,3207,3216,3226,3235,3244,3254,3263,3272,3281,3291,3300,3309,3318,3327,3336,3345,3354,3363,3372,3380,3389,3398,3407,3415,3424,3432,3441,3450,3458,3466,3475,3483,3491,3500,3508,3516,3524,3532,3540,3548,3556,3564,3572,3580,3587,3595,3603,3610,3618,3626,3633,3641,3648,3655,3663,3670,3677, +gamma_2 = 3684,3691,3698,3705,3712,3719,3726,3733,3740,3747,3753,3760,3766,3773,3779,3786,3792,3798,3804,3810,3816,3822,3828,3834,3839,3845,3851,3856,3861,3867,3872,3877,3882,3888,3893,3898,3903,3908,3912,3917,3922,3927,3932,3936,3941,3946,3950,3955,3960,3964,3969,3973,3978,3983,3987,3992,3996,4001,4005,4010,4014,4019,4023,4028,4033,4037,4042,4047,4051,4056,4061,4066,4070,4075,4080,4085,4090,4095, + +3DnrIsoCount = 12 +3DnrIsoThresh = 100|200|400|800|1600|3200|6400|12800|25600|51200|102400|204800| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 100 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 120 +s32YTFStr_1 = 90 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 120 +s32YTFStr_2 = 105 +s32TFStrMax_2 = 12 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 4 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 125 +s32YTFStr_3 = 105 +s32TFStrMax_3 = 12 +s32YSFStrDlt_3 = 32 +s32YTFStrDlt_3 = 48 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 10 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 125 +s32YTFStr_4 = 115 +s32TFStrMax_4 = 12 +s32YSFStrDlt_4 = 64 +s32YTFStrDlt_4 = 63 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 48 +s32CTFstr_4 = 16 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 125 +s32YTFStr_5 = 110 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 100 +s32YTFStrDlt_5 = 63 +s32YTFStrDl_5 = 2 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 48 +s32CSFStr_5 = 48 +s32CTFstr_5 = 16 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 125 +s32YTFStr_6 = 120 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 100 +s32YTFStrDlt_6 = 63 +s32YTFStrDl_6 = 10 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 32 +s32CSFStr_6 = 56 +s32CTFstr_6 = 20 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 125 +s32YTFStr_7 = 120 +s32TFStrMax_7 = 12 +s32YSFStrDlt_7 = 100 +s32YTFStrDlt_7 = 63 +s32YTFStrDl_7 = 20 +s32YSmthStr_7 = 64 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 16 +s32CSFStr_7 = 60 +s32CTFstr_7 = 24 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 125 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 10 +s32YSFStrDlt_8 = 120 +s32YTFStrDlt_8 = 63 +s32YTFStrDl_8 = 28 +s32YSmthStr_8 = 80 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 16 +s32CSFStr_8 = 64 +s32CTFstr_8 = 28 + +s32YPKStr_9 = 0 +s32YSFStr_9 = 180 +s32YTFStr_9 = 120 +s32TFStrMax_9 = 11 +s32YSFStrDlt_9 = 127 +s32YTFStrDlt_9 = 63 +s32YTFStrDl_9 = 31 +s32YSmthStr_9 = 8 +s32YSmthRat_9 = 16 +s32YSFBriRat_9 = 16 +s32CSFStr_9 = 64 +s32CTFstr_9 = 28 + +s32YPKStr_10 = 0 +s32YSFStr_10 = 200 +s32YTFStr_10 = 120 +s32TFStrMax_10 = 12 +s32YSFStrDlt_10 = 127 +s32YTFStrDlt_10 = 63 +s32YTFStrDl_10 = 31 +s32YSmthStr_10 = 0 +s32YSmthRat_10 = 16 +s32YSFBriRat_10 = 16 +s32CSFStr_10 = 64 +s32CTFstr_10 = 28 + +s32YPKStr_11 = 0 +s32YSFStr_11 = 200 +s32YTFStr_11 = 120 +s32TFStrMax_11 = 12 +s32YSFStrDlt_11 = 127 +s32YTFStrDlt_11 = 63 +s32YTFStrDl_11 = 31 +s32YSmthStr_11 = 0 +s32YSmthRat_11 = 16 +s32YSFBriRat_11 = 16 +s32CSFStr_11 = 64 +s32CTFstr_11 = 28 + +[IR] +ExpCount = 4 +ExpThreshHtoL = 600000|1800000|4000000|7000000| +ExpThreshLtoH = 700000|2200000|5000000|8000000| +ExpCompensation = 50|48|38|32| +MaxHistOffset = 20|18|14|10| + +u16HistRatioSlope = 64 +BlackDelayFrame = 30 +WhiteDelayFrame = 30 + +u8Tolerance = 3 +u8Speed = 16 +DCIEnable = 1 +DCIBlackGain = 32 +DCIContrastGain = 32 +DCILightGain = 32 +IRu16Slope = 0,0,0,0,1,1,2,2,3,3,3,3,3,3,3,3 +abEnLowLumaShoot = 0|0|0|0|0|1|1|1|1|1|1|1|1|1|1|1 +u8SharpenD = 40|42|45|50|70|80|100|130|180|220|250|250|250|250|250|250 +u8SharpenUd = 45|43|35|30|25|20|20|50|90|160|210|250|250|250|250|250 +u8TextureNoiseThd = 0|0|0|0|0|0|20|40|90|120|180|250|250|250|250|250 +u8EdgeNoiseThd = 0|0|0|0|0|0|0|0|100|200|0|0|0|0|0|0 +u8OverShoot = 100|95|90|85|80|60|55|10|0|0|0|0|0|0|0|0 +u8UnderShoot = 140|130|120|100|90|76|66|45|30|0|0|0|0|0|0|0 +gamma_0 = 0,76,154,234,313,390,463,531,592,646,694,736,775,812,847,881,916,951,984,1016,1047,1077,1107,1137,1168,1200,1231,1263,1294,1325,1356,1387,1417,1448,1478,1508,1537,1567,1595,1624,1651,1677,1702,1727,1752,1777,1803,1828,1854,1880,1906,1932,1958,1984,2010,2036,2062,2087,2112,2137,2161,2185,2209,2232,2255,2277,2299,2321,2342,2363,2383,2404,2424,2443,2463,2482,2501,2520,2539,2557,2576,2594,2612,2630,2648,2665,2682, +gamma_1 = 2699,2716,2733,2749,2766,2782,2799,2815,2831,2847,2863,2879,2895,2911,2927,2942,2958,2974,2989,3004,3019,3034,3049,3063,3078,3092,3106,3120,3133,3147,3160,3173,3186,3199,3212,3224,3237,3249,3262,3274,3286,3298,3310,3322,3334,3346,3357,3369,3381,3392,3403,3414,3425,3436,3447,3457,3468,3478,3488,3498,3507,3517,3526,3535,3544,3552,3561,3569,3578,3586,3595,3603,3612,3620,3628,3637,3645,3654,3662,3671,3679,3687,3695,3703,3711, +gamma_2 = 3719,3727,3734,3741,3748,3755,3761,3768,3774,3780,3786,3791,3797,3802,3808,3813,3818,3823,3828,3833,3838,3843,3847,3852,3856,3860,3864,3868,3872,3876,3880,3884,3887,3891,3895,3899,3903,3907,3911,3915,3919,3923,3927,3931,3935,3939,3943,3947,3951,3955,3959,3963,3967,3971,3975,3978,3982,3985,3989,3992,3996,4000,4003,4007,4010,4014,4018,4022,4026,4030,4034,4038,4043,4047,4051,4056,4060,4065,4069,4074,4078,4083,4087,4092,4095 + +expweight_0 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_1 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_2 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_3 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +expweight_4 =1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1, +expweight_5 =1,1,1,1,1,2,3,3,3,3,3,1,1,1,1,1,1, +expweight_6 =1,1,1,1,2,3,4,4,4,4,4,3,2,1,1,1,1, +expweight_7 =1,1,1,2,3,4,4,4,4,4,4,4,3,2,1,1,1, +expweight_8 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_9 =1,1,2,3,4,5,5,5,5,5,5,5,4,3,2,1,1, +expweight_10 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_11 =1,1,2,3,4,4,4,4,4,4,4,4,4,3,2,1,1, +expweight_12 =1,1,1,1,2,3,3,3,3,3,3,3,2,1,1,1,1, +expweight_13 =1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1, +expweight_14 =1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + +3DnrIsoCount = 12 +3DnrIsoThresh = 100|200|400|800|1600|3200|6400|12800|25600|51200|102400|204800| + +s32YPKStr_0 = 0 +s32YSFStr_0 = 100 +s32YTFStr_0 = 64 +s32TFStrMax_0 = 14 +s32YSFStrDlt_0 = 0 +s32YTFStrDlt_0 = 0 +s32YTFStrDl_0 = 0 +s32YSmthStr_0 = 0 +s32YSmthRat_0 = 16 +s32YSFBriRat_0 = 64 +s32CSFStr_0 = 32 +s32CTFstr_0 = 0 + +s32YPKStr_1 = 0 +s32YSFStr_1 = 120 +s32YTFStr_1 = 90 +s32TFStrMax_1 = 14 +s32YSFStrDlt_1 = 0 +s32YTFStrDlt_1 = 0 +s32YTFStrDl_1 = 0 +s32YSmthStr_1 = 0 +s32YSmthRat_1 = 16 +s32YSFBriRat_1 = 64 +s32CSFStr_1 = 32 +s32CTFstr_1 = 0 + +s32YPKStr_2 = 0 +s32YSFStr_2 = 120 +s32YTFStr_2 = 105 +s32TFStrMax_2 = 12 +s32YSFStrDlt_2 = 0 +s32YTFStrDlt_2 = 0 +s32YTFStrDl_2 = 0 +s32YSmthStr_2 = 0 +s32YSmthRat_2 = 16 +s32YSFBriRat_2 = 64 +s32CSFStr_2 = 32 +s32CTFstr_2 = 4 + +s32YPKStr_3 = 0 +s32YSFStr_3 = 125 +s32YTFStr_3 = 105 +s32TFStrMax_3 = 12 +s32YSFStrDlt_3 = 32 +s32YTFStrDlt_3 = 48 +s32YTFStrDl_3 = 0 +s32YSmthStr_3 = 0 +s32YSmthRat_3 = 16 +s32YSFBriRat_3 = 64 +s32CSFStr_3 = 32 +s32CTFstr_3 = 10 + +s32YPKStr_4 = 0 +s32YSFStr_4 = 125 +s32YTFStr_4 = 115 +s32TFStrMax_4 = 12 +s32YSFStrDlt_4 = 64 +s32YTFStrDlt_4 = 63 +s32YTFStrDl_4 = 0 +s32YSmthStr_4 = 0 +s32YSmthRat_4 = 16 +s32YSFBriRat_4 = 64 +s32CSFStr_4 = 48 +s32CTFstr_4 = 16 + +s32YPKStr_5 = 0 +s32YSFStr_5 = 125 +s32YTFStr_5 = 110 +s32TFStrMax_5 = 14 +s32YSFStrDlt_5 = 100 +s32YTFStrDlt_5 = 63 +s32YTFStrDl_5 = 2 +s32YSmthStr_5 = 0 +s32YSmthRat_5 = 16 +s32YSFBriRat_5 = 48 +s32CSFStr_5 = 48 +s32CTFstr_5 = 16 + +s32YPKStr_6 = 0 +s32YSFStr_6 = 125 +s32YTFStr_6 = 120 +s32TFStrMax_6 = 14 +s32YSFStrDlt_6 = 100 +s32YTFStrDlt_6 = 63 +s32YTFStrDl_6 = 10 +s32YSmthStr_6 = 0 +s32YSmthRat_6 = 16 +s32YSFBriRat_6 = 32 +s32CSFStr_6 = 56 +s32CTFstr_6 = 20 + +s32YPKStr_7 = 0 +s32YSFStr_7 = 125 +s32YTFStr_7 = 120 +s32TFStrMax_7 = 12 +s32YSFStrDlt_7 = 100 +s32YTFStrDlt_7 = 63 +s32YTFStrDl_7 = 20 +s32YSmthStr_7 = 64 +s32YSmthRat_7 = 16 +s32YSFBriRat_7 = 16 +s32CSFStr_7 = 60 +s32CTFstr_7 = 24 + +s32YPKStr_8 = 0 +s32YSFStr_8 = 125 +s32YTFStr_8 = 120 +s32TFStrMax_8 = 10 +s32YSFStrDlt_8 = 120 +s32YTFStrDlt_8 = 63 +s32YTFStrDl_8 = 28 +s32YSmthStr_8 = 80 +s32YSmthRat_8 = 16 +s32YSFBriRat_8 = 16 +s32CSFStr_8 = 64 +s32CTFstr_8 = 28 + +s32YPKStr_9 = 0 +s32YSFStr_9 = 180 +s32YTFStr_9 = 120 +s32TFStrMax_9 = 11 +s32YSFStrDlt_9 = 127 +s32YTFStrDlt_9 = 63 +s32YTFStrDl_9 = 31 +s32YSmthStr_9 = 8 +s32YSmthRat_9 = 16 +s32YSFBriRat_9 = 16 +s32CSFStr_9 = 64 +s32CTFstr_9 = 28 + +s32YPKStr_10 = 0 +s32YSFStr_10 = 200 +s32YTFStr_10 = 120 +s32TFStrMax_10 = 12 +s32YSFStrDlt_10 = 127 +s32YTFStrDlt_10 = 63 +s32YTFStrDl_10 = 31 +s32YSmthStr_10 = 0 +s32YSmthRat_10 = 16 +s32YSFBriRat_10 = 16 +s32CSFStr_10 = 64 +s32CTFstr_10 = 28 + +s32YPKStr_11 = 0 +s32YSFStr_11 = 200 +s32YTFStr_11 = 120 +s32TFStrMax_11 = 12 +s32YSFStrDlt_11 = 127 +s32YTFStrDlt_11 = 63 +s32YTFStrDl_11 = 31 +s32YSmthStr_11 = 0 +s32YSmthRat_11 = 16 +s32YSFBriRat_11 = 16 +s32CSFStr_11 = 64 +s32CTFstr_11 = 28 + +[DRC] +DRCEnable = 1 +DRCManulEnable = 1 +DRCStrengthTarget = 128 +DRCu16BrightGainLmt = 127 +DRCu16DarkGainLmtC = 127 +DRCu16DarkGainLmtY = 127 +DRCu8Asymmetry = 2 +DRCu8LocalMixingBrigtht = 45 +DRCu8LocalMixingDark = 45 +DRCu8LocalMixingThres = 2 +DRCu8RangeVar = 0 +DRCu8SecondPole = 180 +DRCu8SpatialVar = 10 +DRCu8Stretch = 54 + + + + + diff --git a/device/mpp/sample/scene_auto/readme.txt b/device/mpp/sample/scene_auto/readme.txt new file mode 100644 index 0000000..59e5cdc --- /dev/null +++ b/device/mpp/sample/scene_auto/readme.txt @@ -0,0 +1,3 @@ +1. This scene sample can only be run when vi-isp-vpss-venc is running; +2. Different sensors have different configuration file in ini dir; + diff --git a/device/mpp/sample/scene_auto/sample_scene b/device/mpp/sample/scene_auto/sample_scene new file mode 100644 index 0000000..477df90 Binary files /dev/null and b/device/mpp/sample/scene_auto/sample_scene differ diff --git a/device/mpp/sample/scene_auto/sample_scene.c b/device/mpp/sample/scene_auto/sample_scene.c new file mode 100644 index 0000000..abd8645 --- /dev/null +++ b/device/mpp/sample/scene_auto/sample_scene.c @@ -0,0 +1,208 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hi_comm_isp.h" +#include "mpi_awb.h" +#include "mpi_isp.h" +#include "hi_type.h" +#include "hi_srdk_sceneauto_define_ext.h" +#include "hi_srdk_sceneauto_ext.h" + +#define CFGFILE "sceneauto.ini" + + +void SAMPLE_SCENE_HandleSig(HI_S32 signo) +{ + int ret; + + if (SIGINT == signo || SIGTERM == signo) + { + ret = HI_SRDK_SCENEAUTO_Stop(); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_Stop failed\n"); + exit(-1); + } + ret = HI_SRDK_SCENEAUTO_DeInit(); + if (ret != 0) + { + printf("HI_SRDK_SCENEAUTO_DeInit failed\n"); + exit(-1); + } + } + exit(-1); +} + + +int main(int argc, char *argv[]) +{ + int ret; + int choice; + int specialscene; + SRDK_SCENEAUTO_SEPCIAL_SCENE_E eSpecialScene; + char *file_name; + HI_BOOL b_help = 0; + + file_name = (char*)CFGFILE; + + if (argc > 1) + { + file_name = argv[1]; + if (!strcmp(argv[1], "-h")) + { + b_help = 1; + } + } + else + { + b_help = 1; + } + + if (b_help) + { + printf("/***************************************************************/\n\n"); + printf("usage: ./sample_scene ini_path.\n\n"); + printf("for example: ./sample_scene ini/IPC/sceneauto_178.ini\n\n"); + printf("/***************************************************************/\n\n"); + return 0; + } + + ret = HI_SRDK_SCENEAUTO_Init(file_name); + if (ret != 0) + { + printf("HI_SRDK_SCENEAUTO_Init failed\n"); + return -1; + } + + signal(SIGINT, SAMPLE_SCENE_HandleSig); + signal(SIGTERM, SAMPLE_SCENE_HandleSig); + + printf("init success\n"); + + + while (1) + { + printf("1.sceneauto start\n"); + printf("2.sceneauto stop\n"); + printf("3.set specialmode\n"); + printf("4.get specialmode\n"); + + scanf("%d", &choice); + switch (choice) + { + case 1: + ret = HI_SRDK_SCENEAUTO_Start(); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_Start failed\n"); + return -1; + } + break; + case 2: + ret = HI_SRDK_SCENEAUTO_Stop(); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_Stop failed\n"); + return -1; + } + break; + case 3: + printf("please input the specialscene(0-blc, 1-ir, 2-hlc, 3-dynamic, 4-drc, 5-specialnone)"); + scanf("%d", &specialscene); + switch (specialscene) + { + case 0: + eSpecialScene = SRDK_SCENEAUTO_SPECIAL_SCENE_BLC; + ret = HI_SRDK_SCENEAUTO_SetSpecialMode(&eSpecialScene); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_SetSpecialMode failed\n"); + return -1; + } + break; + case 1: + eSpecialScene = SRDK_SCENEAUTO_SPECIAL_SCENE_IR; + ret = HI_SRDK_SCENEAUTO_SetSpecialMode(&eSpecialScene); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_SetSpecialMode failed\n"); + return -1; + } + break; + case 2: + eSpecialScene = SRDK_SCENEAUTO_SPECIAL_SCENE_HLC; + ret = HI_SRDK_SCENEAUTO_SetSpecialMode(&eSpecialScene); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_SetSpecialMode failed\n"); + return -1; + } + break; + case 3: + eSpecialScene = SRDK_SCENEAUTO_SPECIAL_SCENE_DYNAMIC; + ret = HI_SRDK_SCENEAUTO_SetSpecialMode(&eSpecialScene); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_SetSpecialMode failed\n"); + return -1; + } + break; + case 4: + eSpecialScene = SRDK_SCENEAUTO_SPECIAL_SCENE_DRC; + ret = HI_SRDK_SCENEAUTO_SetSpecialMode(&eSpecialScene); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_SetSpecialMode failed\n"); + return -1; + } + break; + case 5: + eSpecialScene = SRDK_SCENEAUTO_SPECIAL_SCENE_NONE; + ret = HI_SRDK_SCENEAUTO_SetSpecialMode(&eSpecialScene); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_SetSpecialMode failed\n"); + return -1; + } + break; + default: + printf("unkonw input\n"); + break; + } + break; + case 4: + ret = HI_SRDK_SCENEAUTO_GetSpecialMode(&eSpecialScene); + if (HI_SUCCESS != ret) + { + printf("HI_SRDK_SCENEAUTO_GetSpecialMode failed\n"); + return -1; + } + printf("current scene is %d\n", eSpecialScene); + break; + default: + printf("unkonw input\n"); + break; + } + + sleep(1); + } + + ret = HI_SRDK_SCENEAUTO_DeInit(); + if (ret != 0) + { + printf("HI_SRDK_SCENEAUTO_DeInit failed\n"); + return -1; + } + printf("deinit success\n"); + + return 0; +} diff --git a/device/mpp/sample/scene_auto/src/adapt/hi3518e/hi_sceneauto_adpt.c b/device/mpp/sample/scene_auto/src/adapt/hi3518e/hi_sceneauto_adpt.c new file mode 100644 index 0000000..dadacdd --- /dev/null +++ b/device/mpp/sample/scene_auto/src/adapt/hi3518e/hi_sceneauto_adpt.c @@ -0,0 +1,2442 @@ +#include +#include +#include +#include +#include +#include +#include +#include "hi_sceneauto_comm.h" +#include "hi_sceneauto_comm_ext.h" +#include "hi_common.h" +#include "hi_comm_isp.h" +#include "hi_comm_vpss.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_vo.h" +#include "hi_comm_rc.h" +#include "hi_comm_venc.h" +#include "hi_ive.h" +#include "hi_comm_ive.h" +#include "hi_comm_vgs.h" + +#include "mpi_isp.h" +#include "mpi_venc.h" +#include "mpi_ae.h" +#include "mpi_vi.h" +#include "mpi_awb.h" +#include "mpi_vpss.h" +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_vi.h" +#include "mpi_vo.h" +#include "mpi_ive.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define IVE2_ALIGN 16 +#define calcStride(width,align) ((width+align-1)&(~(align-1))) +#define CCIMGWIDTH 160 +#define CCIMGHEIGHT 128 +HI_U16 u16IThreshTable[12] = {20, 25, 30, 35, 40, 50, 60, 70, 75, 80, 85, 90}; +HI_U16 u16PThreshTable[12] = {20, 25, 30, 35, 40, 50, 60, 70, 75, 80, 85, 90}; + + +#define CHECK_RET(name,express)\ + do{\ + if (HI_SUCCESS != express)\ + {\ + printf("%s failed at %s: LINE: %d ! errno:%x \n",\ + name, __FUNCTION__, __LINE__, express);\ + }\ + }while(0) + +#define IVE_MMZ_FREE(phy,vir)\ + do{\ + if ((0 != (phy)) && (NULL != (vir)))\ + {\ + HI_MPI_SYS_MmzFree((phy),(vir));\ + (phy) = 0;\ + (vir) = NULL;\ + }\ + }while(0) + +static __inline int iClip2(int x, int b) {{ if (x < 0) x = 0; };{ if (x > b) x = b; }; return x; } +static __inline int iClip3(int x, int a,int b) {{ if (x < a) x = a; };{ if (x > b) x = b; }; return x; } +static __inline int iMin2(int a, int b) {{ if (a > b) a = b; }; return a; } +static __inline int iMax2(int a, int b) {{ if (a > b) b = a; }; return b; } +static __inline int iMin3(int a, int b, int c) {{ if (a > b) a = b; }; { if (a > c) a = c; }; return a; } + +typedef enum HI_MBRCMODE_E +{ + E_MBINTEG = 0, + E_MBSTEP = 1, + E_MBDEFAULT = 2 +} MBRCMODE_E; + +typedef struct IVE_MD +{ + pthread_t hIveMBThread; + IVE_IMAGE_S stImg1; // for mb bakup + IVE_IMAGE_S stImg3; // for intergal image + IVE_IMAGE_S stImg4; //for cal madi tmp + IVE_IMAGE_S stImg5; //for mb madi + + VIDEO_FRAME_INFO_S stCCScaleTmp; // for scale picture buffer + VIDEO_FRAME_INFO_S stCCScaleOut; // for scale picture out + IVE_IMAGE_S stCCIntegtmp; // for intergal image buffer + IVE_IMAGE_S stCCInteg; // for cal interg image + IVE_IMAGE_S stCCCalBuf; // for cc cal + + + IVE_IMAGE_S stHistInfo; + HI_U16 u16VideoWidth ; + HI_U16 u16VideoHeight; + HI_U16 u16OriWidth; + HI_U16 u16OriHeight; + HI_BOOL bStopSignal; + HI_BOOL bPause; + MBRCMODE_E eRCMode; + HI_U32 ViExtChn; + HI_S32 s32VpssGrp; + HI_S32 s32VpssChn; +} IVE_MD; + +static IVE_MD stIveMd; + +typedef struct hiVENC_FACE_CFG_S +{ + HI_BOOL bIntra4Ang[2][35]; + HI_BOOL bIntra8Ang[2][35]; + HI_BOOL bIntra16Ang[2][35]; + HI_BOOL bIntra32Ang[2][35]; + HI_BOOL bImproveEn[2]; + + HI_U32 u32Norm32MaxNum[2]; + HI_U32 u32Norm32ProtectNum[2]; + HI_U32 u32Norm16MaxNum[2]; + HI_U32 u32Norm16ProtectNum[2]; + + HI_U32 u32Skin32MaxNum[2]; + HI_U32 u32Skin32ProtectNum[2]; + HI_U32 u32Skin16MaxNum[2]; + HI_U32 u32Skin16ProtectNum[2]; + + HI_U32 u32Still32MaxNum[2]; + HI_U32 u32Still32ProtectNum[2]; + HI_U32 u32Still16MaxNum[2]; + HI_U32 u32Still16ProtectNum[2]; + + HI_U32 u32Hedge32MaxNum[2]; + HI_U32 u32Hedge32ProtectNum[2]; + HI_U32 u32Hedge16MaxNum[2]; + HI_U32 u32Hedge16ProtectNum[2]; + + HI_U8 u8NormIntra32RdCost[2]; + HI_U8 u8NormIntra16RdCost[2]; + HI_U8 u8NormIntra8RdCost[2]; + HI_U8 u8NormIntra4RdCost[2]; + + HI_U8 u8NormMerg64RdCost[2]; + HI_U8 u8NormMerg32RdCost[2]; + HI_U8 u8NormMerg16RdCost[2]; + HI_U8 u8NormMerg8RdCost[2]; + + HI_U8 u8NormFme64RdCost[2]; + HI_U8 u8NormFme32RdCost[2]; + HI_U8 u8NormFme16RdCost[2]; + HI_U8 u8NormFme8RdCost[2]; + + HI_U8 u8SkinIntra32RdCost[2]; + HI_U8 u8SkinIntra16RdCost[2]; + HI_U8 u8SkinIntra8RdCost[2]; + HI_U8 u8SkinIntra4RdCost[2]; + + HI_U8 u8SkinMerg64RdCost[2]; + HI_U8 u8SkinMerg32RdCost[2]; + HI_U8 u8SkinMerg16RdCost[2]; + HI_U8 u8SkinMerg8RdCost[2]; + + HI_U8 u8SkinFme64RdCost[2]; + HI_U8 u8SkinFme32RdCost[2]; + HI_U8 u8SkinFme16RdCost[2]; + HI_U8 u8SkinFme8RdCost[2]; + + HI_U8 u8HedgeIntra32RdCost[2]; + HI_U8 u8HedgeIntra16RdCost[2]; + HI_U8 u8HedgeIntra8RdCost[2]; + HI_U8 u8HedgeIntra4RdCost[2]; + + HI_U8 u8HedgeMerg64RdCost[2]; + HI_U8 u8HedgeMerg32RdCost[2]; + HI_U8 u8HedgeMerg16RdCost[2]; + HI_U8 u8HedgeMerg8RdCost[2]; + + HI_U8 u8HedgeFme64RdCost[2]; + HI_U8 u8HedgeFme32RdCost[2]; + HI_U8 u8HedgeFme16RdCost[2]; + HI_U8 u8HedgeFme8RdCost[2]; + + HI_BOOL bStroEdgeEn[2]; + HI_U32 u32StroEdgeQpDelta[2]; + + HI_BOOL bSkinEn[2]; + HI_U32 u32SkinQpDelta[2]; + + HI_U8 u8SkinUMax[2]; + HI_U8 u8SkinUMin[2]; + HI_U8 u8SkinVMax[2]; + HI_U8 u8SkinVMin[2]; + + HI_U32 u32SkinNum[2]; + HI_U8 u8HedgeCnt[2]; + HI_U8 u8HedgeThr[2]; + + HI_U32 u32StillThr[2]; + +} VENC_FACE_CFG_S; + + +extern HI_S32 HI_MPI_VENC_SetFaceCfg(VENC_CHN VeChn, const VENC_FACE_CFG_S* pstFaceCfg); +extern HI_S32 HI_MPI_VENC_GetFaceCfg(VENC_CHN VeChn, VENC_FACE_CFG_S* pstFaceCfg); + +int IVE_DetectDestory(IVE_MD* pstIveMd) +{ + if (pstIveMd->stHistInfo.u32PhyAddr[0]) + { + IVE_MMZ_FREE(pstIveMd->stHistInfo.u32PhyAddr[0], pstIveMd->stHistInfo.pu8VirAddr[0]); + pstIveMd->stHistInfo.u32PhyAddr[0] = 0; + } + + if (pstIveMd->stImg3.u32PhyAddr[0]) + { + IVE_MMZ_FREE(pstIveMd->stImg3.u32PhyAddr[0], pstIveMd->stImg3.pu8VirAddr[0]); + pstIveMd->stImg3.u32PhyAddr[0] = 0; + } + + if (pstIveMd->stImg5.u32PhyAddr[0]) + { + IVE_MMZ_FREE(pstIveMd->stImg5.u32PhyAddr[0], pstIveMd->stImg5.pu8VirAddr[0]); + pstIveMd->stImg5.u32PhyAddr[0] = 0; + } + + if (pstIveMd->stCCScaleTmp.stVFrame.u32PhyAddr[0]) + { + IVE_MMZ_FREE(pstIveMd->stCCScaleTmp.stVFrame.u32PhyAddr[0], pstIveMd->stCCScaleTmp.stVFrame.pVirAddr[0]); + pstIveMd->stCCScaleTmp.stVFrame.u32PhyAddr[0] = 0; + } + + if (pstIveMd->stCCScaleOut.stVFrame.u32PhyAddr[0]) + { + IVE_MMZ_FREE(pstIveMd->stCCScaleOut.stVFrame.u32PhyAddr[0], pstIveMd->stCCScaleOut.stVFrame.pVirAddr[0]); + pstIveMd->stCCScaleOut.stVFrame.u32PhyAddr[0] = 0; + } + + if (pstIveMd->stCCIntegtmp.u32PhyAddr[0]) + { + IVE_MMZ_FREE(pstIveMd->stCCIntegtmp.u32PhyAddr[0], pstIveMd->stCCIntegtmp.pu8VirAddr[0]); + pstIveMd->stCCIntegtmp.u32PhyAddr[0] = 0; + } + + if (pstIveMd->stCCCalBuf.pu8VirAddr[0]) + { + free(pstIveMd->stCCCalBuf.pu8VirAddr[0]); + pstIveMd->stCCCalBuf.pu8VirAddr[0] = 0; + } + + return HI_SUCCESS; +} + + +int IVE_DetectInit(IVE_MD* pstIveMd) +{ + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32Size = 0; + int i; + + VPSS_GRP stVpssGrp = pstIveMd->s32VpssGrp; + VPSS_CHN stVpssChn = pstIveMd->s32VpssChn; + HI_U32 u32Depth = 1; + s32Ret = HI_MPI_VPSS_SetDepth(stVpssGrp, stVpssChn, u32Depth); + if (s32Ret != HI_SUCCESS) + { + CHECK_RET("HI_MPI_VPSS_SetDepth fail\n", s32Ret); + goto FAIL; + } + pstIveMd->stImg3.enType = IVE_IMAGE_TYPE_U64C1; + pstIveMd->stImg3.u16Width = ((pstIveMd->u16OriWidth >> 3) & (~0xf)) + 2; + pstIveMd->stImg3.u16Height = ((pstIveMd->u16OriHeight >> 3) & (~0xf)) + 1; + pstIveMd->stImg3.u16Stride[0] = calcStride( (pstIveMd->stImg3.u16Width), IVE2_ALIGN) << 3; + u32Size = pstIveMd->stImg3.u16Stride[0] * pstIveMd->stImg3.u16Height; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstIveMd->stImg3.u32PhyAddr[0], (void**)&pstIveMd->stImg3.pu8VirAddr[0], NULL, HI_NULL, u32Size); + if (s32Ret != HI_SUCCESS) + { + CHECK_RET("pstIveMd->stImage 3 malloc fail\n", s32Ret); + goto FAIL; + } + + memset(pstIveMd->stImg3.pu8VirAddr[0], 0, 16 + pstIveMd->stImg3.u16Stride[0]); + for (i = 1; i < pstIveMd->stImg3.u16Height; i++) + { + memset(pstIveMd->stImg3.pu8VirAddr[0] + i * pstIveMd->stImg3.u16Stride[0], 0, 16); + } + pstIveMd->stImg4.enType = IVE_IMAGE_TYPE_U64C1; + pstIveMd->stImg4.u16Width = ((pstIveMd->u16OriWidth >> 3) & (~0xf)); + pstIveMd->stImg4.u16Height = ((pstIveMd->u16OriHeight >> 3) & (~0xf)); + pstIveMd->stImg4.u16Stride[0] = (pstIveMd->stImg3.u16Stride[0] >> 3); + pstIveMd->stImg4.u32PhyAddr[0] = pstIveMd->stImg3.u32PhyAddr[0] + 16 + pstIveMd->stImg3.u16Stride[0]; + pstIveMd->stImg4.pu8VirAddr[0] = pstIveMd->stImg3.pu8VirAddr[0] + 16 + pstIveMd->stImg3.u16Stride[0]; + + + pstIveMd->stImg5.enType = IVE_IMAGE_TYPE_U8C1; + pstIveMd->stImg5.u16Width = (pstIveMd->u16OriWidth >> 4) & (~0x3); + pstIveMd->stImg5.u16Height = (pstIveMd->u16OriHeight >> 4) & (~0x3); + pstIveMd->stImg5.u16Stride[0] = pstIveMd->stImg5.u16Width; + u32Size = pstIveMd->stImg5.u16Stride[0] * pstIveMd->stImg5.u16Height; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstIveMd->stImg5.u32PhyAddr[0], (void**)&pstIveMd->stImg5.pu8VirAddr[0], NULL, HI_NULL, u32Size); + if (s32Ret != HI_SUCCESS) + { + CHECK_RET("pstIveMd->stImage 5 fail \n", s32Ret); + printf("alloc size: %d w %d h %d s %d\n", u32Size, pstIveMd->stImg5.u16Width, pstIveMd->stImg5.u16Height, pstIveMd->stImg5.u16Stride[0]); + goto FAIL; + } + + memcpy(&pstIveMd->stImg1, &pstIveMd->stImg5, sizeof(pstIveMd->stImg5)); + + if ((pstIveMd->stImg1.u16Stride[0] & (IVE2_ALIGN - 1)) != 0) + { + for (i = 4; i < 255; i++) + { + if (u32Size == (u32Size / (i * IVE2_ALIGN)) * (i * IVE2_ALIGN)) + { break; } + } + if (i == 255) + { + printf("can't find stride,can't use ive hist\n"); + goto FAIL; + } + pstIveMd->stImg1.u16Stride[0] = i * IVE2_ALIGN; + pstIveMd->stImg1.u16Width = pstIveMd->stImg1.u16Stride[0]; + pstIveMd->stImg1.u16Height = u32Size / (i * IVE2_ALIGN); + } + + u32Size = 1024 * 4; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstIveMd->stHistInfo.u32PhyAddr[0], (void**)&pstIveMd->stHistInfo.pu8VirAddr[0], NULL, HI_NULL, u32Size); + if (s32Ret != HI_SUCCESS) + { + CHECK_RET("pstIveMd->stHistInfo fail\n", s32Ret); + goto FAIL; + } + + + + pstIveMd->stCCScaleTmp.stVFrame.u32Width=calcStride(MAX2((pstIveMd->u16OriWidth>>4),CCIMGWIDTH),IVE2_ALIGN); + pstIveMd->stCCScaleTmp.stVFrame.u32Height=MAX2((pstIveMd->u16OriWidth>>4),CCIMGHEIGHT); + pstIveMd->stCCScaleTmp.stVFrame.u32Stride[0]=pstIveMd->stCCScaleTmp.stVFrame.u32Width; + u32Size=pstIveMd->stCCScaleTmp.stVFrame.u32Width*pstIveMd->stCCScaleTmp.stVFrame.u32Height*3>>1; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstIveMd->stCCScaleTmp.stVFrame.u32PhyAddr[0], (void**)&pstIveMd->stCCScaleTmp.stVFrame.pVirAddr[0], NULL, HI_NULL, u32Size); + pstIveMd->stCCScaleTmp.stVFrame.enPixelFormat=PIXEL_FORMAT_YUV_SEMIPLANAR_420; + pstIveMd->stCCScaleTmp.stVFrame.enCompressMode=COMPRESS_MODE_NONE; + pstIveMd->stCCScaleTmp.stVFrame.u32PhyAddr[1]=pstIveMd->stCCScaleTmp.stVFrame.u32PhyAddr[0]+pstIveMd->stCCScaleTmp.stVFrame.u32Stride[0]*pstIveMd->stCCScaleTmp.stVFrame.u32Height; + pstIveMd->stCCScaleTmp.stVFrame.pVirAddr[1]= (HI_VOID *)((HI_U8 *)pstIveMd->stCCScaleTmp.stVFrame.pVirAddr[0]+pstIveMd->stCCScaleTmp.stVFrame.u32Stride[0]*pstIveMd->stCCScaleTmp.stVFrame.u32Height); + pstIveMd->stCCScaleTmp.stVFrame.u32PhyAddr[2]=pstIveMd->stCCScaleTmp.stVFrame.u32PhyAddr[1]+(pstIveMd->stCCScaleTmp.stVFrame.u32Stride[1]*pstIveMd->stCCScaleTmp.stVFrame.u32Height>>1)+1; + pstIveMd->stCCScaleTmp.stVFrame.pVirAddr[2]=(HI_VOID *)((HI_U8 *)pstIveMd->stCCScaleTmp.stVFrame.pVirAddr[1]+(pstIveMd->stCCScaleTmp.stVFrame.u32Stride[1]*pstIveMd->stCCScaleTmp.stVFrame.u32Height>>1)+1); + pstIveMd->stCCScaleTmp.stVFrame.u32Stride[1]=pstIveMd->stCCScaleTmp.stVFrame.u32Stride[0]; + pstIveMd->stCCScaleTmp.stVFrame.u32Stride[2]=pstIveMd->stCCScaleTmp.stVFrame.u32Stride[0]; + if(s32Ret != HI_SUCCESS) + { + CHECK_RET("pstIveMd->stCCScaleTmp fail\n",s32Ret); + goto FAIL; + } + if( (pstIveMd->stCCScaleTmp.stVFrame.u32Width==CCIMGWIDTH) && (pstIveMd->stCCScaleTmp.stVFrame.u32Height==CCIMGHEIGHT) ) + { + memset(&pstIveMd->stCCScaleOut,0,sizeof(pstIveMd->stCCScaleOut)); + } + else + { + pstIveMd->stCCScaleOut.stVFrame.u32Width=CCIMGWIDTH; + pstIveMd->stCCScaleOut.stVFrame.u32Height=CCIMGHEIGHT; + pstIveMd->stCCScaleOut.stVFrame.u32Stride[0]=pstIveMd->stCCScaleOut.stVFrame.u32Width; + u32Size=pstIveMd->stCCScaleOut.stVFrame.u32Width*pstIveMd->stCCScaleOut.stVFrame.u32Height*3>>1; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstIveMd->stCCScaleOut.stVFrame.u32PhyAddr[0], (void**)&pstIveMd->stCCScaleOut.stVFrame.pVirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + CHECK_RET("pstIveMd->stCCScaleOut fail\n",s32Ret); + goto FAIL; + } + pstIveMd->stCCScaleOut.stVFrame.enPixelFormat=PIXEL_FORMAT_YUV_SEMIPLANAR_420; + pstIveMd->stCCScaleOut.stVFrame.enCompressMode=COMPRESS_MODE_NONE; + pstIveMd->stCCScaleOut.stVFrame.u32PhyAddr[1]=pstIveMd->stCCScaleOut.stVFrame.u32PhyAddr[0]+pstIveMd->stCCScaleOut.stVFrame.u32Stride[0]*pstIveMd->stCCScaleOut.stVFrame.u32Height; + pstIveMd->stCCScaleOut.stVFrame.pVirAddr[1]= (HI_VOID *)((HI_U8 *)pstIveMd->stCCScaleTmp.stVFrame.pVirAddr[0]+pstIveMd->stCCScaleOut.stVFrame.u32Stride[0]*pstIveMd->stCCScaleOut.stVFrame.u32Height); + pstIveMd->stCCScaleOut.stVFrame.u32PhyAddr[2]=pstIveMd->stCCScaleOut.stVFrame.u32PhyAddr[1]+(pstIveMd->stCCScaleOut.stVFrame.u32Stride[1]*pstIveMd->stCCScaleOut.stVFrame.u32Height>>1)+1; + pstIveMd->stCCScaleOut.stVFrame.pVirAddr[2]=(HI_VOID *)((HI_U8 *)pstIveMd->stCCScaleOut.stVFrame.pVirAddr[1]+(pstIveMd->stCCScaleOut.stVFrame.u32Stride[1]*pstIveMd->stCCScaleOut.stVFrame.u32Height>>1)+1); + pstIveMd->stCCScaleOut.stVFrame.u32Stride[1]=pstIveMd->stCCScaleOut.stVFrame.u32Stride[0]; + pstIveMd->stCCScaleOut.stVFrame.u32Stride[2]=pstIveMd->stCCScaleOut.stVFrame.u32Stride[0]; + + } + + pstIveMd->stCCIntegtmp.u16Width=CCIMGWIDTH; + pstIveMd->stCCIntegtmp.u16Height=CCIMGHEIGHT+1; + pstIveMd->stCCIntegtmp.u16Stride[0]=(calcStride(pstIveMd->stCCIntegtmp.u16Width+4,IVE2_ALIGN))<<2; + u32Size=pstIveMd->stCCIntegtmp.u16Stride[0]*pstIveMd->stCCIntegtmp.u16Height; + s32Ret = HI_MPI_SYS_MmzAlloc(&pstIveMd->stCCIntegtmp.u32PhyAddr[0], (void**)&pstIveMd->stCCIntegtmp.pu8VirAddr[0], NULL, HI_NULL, u32Size); + if(s32Ret != HI_SUCCESS) + { + CHECK_RET("pstIveMd->stCCInteg fail\n",s32Ret); + goto FAIL; + } + memset(pstIveMd->stCCIntegtmp.pu8VirAddr[0],0,(pstIveMd->stCCIntegtmp.u16Stride[0])); + for(i=0;istCCIntegtmp.u16Height;i++) + { + memset(pstIveMd->stCCIntegtmp.pu8VirAddr[0]+i*pstIveMd->stCCIntegtmp.u16Stride[0],0,16); + } + memcpy(&pstIveMd->stCCInteg,&pstIveMd->stCCIntegtmp,sizeof(IVE_IMAGE_S)); + pstIveMd->stCCInteg.u16Stride[0]=pstIveMd->stCCIntegtmp.u16Stride[0]>>2; + pstIveMd->stCCInteg.u32PhyAddr[0]=pstIveMd->stCCIntegtmp.u32PhyAddr[0]+(pstIveMd->stCCIntegtmp.u16Stride[0]+16); + pstIveMd->stCCInteg.pu8VirAddr[0]=pstIveMd->stCCIntegtmp.pu8VirAddr[0]+(pstIveMd->stCCIntegtmp.u16Stride[0]+16); + pstIveMd->stCCInteg.u16Height=pstIveMd->stCCIntegtmp.u16Height-1; + pstIveMd->stCCInteg.enType=IVE_IMAGE_TYPE_U32C1; + + pstIveMd->stCCCalBuf.u16Width=(CCIMGWIDTH<<4)+(CCIMGHEIGHT<<4); + pstIveMd->stCCCalBuf.u16Height=1; + pstIveMd->stCCCalBuf.u16Stride[0]=pstIveMd->stCCCalBuf.u16Width; + pstIveMd->stCCCalBuf.pu8VirAddr[0] = (HI_U8 *)malloc(pstIveMd->stCCCalBuf.u16Width); + if(pstIveMd->stCCCalBuf.pu8VirAddr[0] == HI_NULL) + { + CHECK_RET("pstIveMd->stCCInteg fail\n",s32Ret); + goto FAIL; + } + + + + +FAIL: + if(HI_SUCCESS != s32Ret) + { + IVE_DetectDestory(pstIveMd); + } + return s32Ret; +} + +int HI_MPI_IVE_GetFrame(int ViExtChn,VIDEO_FRAME_INFO_S *pstFrameInfo,int s32GetFrameMilliSec) +{ + int s32Ret; + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + + VpssGrp = stIveMd.s32VpssGrp; + VpssChn = stIveMd.s32VpssChn; + //s32Ret = HI_MPI_VI_GetFrame(ViExtChn, pstFrameInfo, s32GetFrameMilliSec); + s32Ret = HI_MPI_VPSS_GetChnFrame( VpssGrp, VpssChn, pstFrameInfo, s32GetFrameMilliSec); + if (s32Ret != HI_SUCCESS) + { + CHECK_RET("get frame failed\n", s32Ret); + return s32Ret; + } + + return s32Ret; +} + +int HI_MPI_IVE_ReleaseFrame(int ViExtChn, VIDEO_FRAME_INFO_S* pstFrameInfo) +{ + int s32Ret; + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VpssGrp = stIveMd.s32VpssGrp; + VpssChn = stIveMd.s32VpssChn; + + //s32Ret = HI_MPI_VI_ReleaseFrame(ViExtChn, pstFrameInfo); + s32Ret = HI_MPI_VPSS_ReleaseChnFrame( VpssGrp, VpssChn, pstFrameInfo); + if (s32Ret != HI_SUCCESS) + { + CHECK_RET("release frame failed\n", s32Ret); + return s32Ret; + } + + return s32Ret; +} + +int EncMadiCal(IVE_IMAGE_S *pstDstImage,IVE_IMAGE_S *pstSrcImage,int offsetxy) +{ + int s32EncOffset; + HI_U32 u32ValAL,u32ValBL,u32ValCL,u32ValDL; + HI_U32 u32ValAH,u32ValBH,u32ValCH,u32ValDH; + HI_U8 *pu8Img; + HI_U32 mean,sqsum,*pu32Src; + HI_U64 u64ValA,u64ValB,u64ValC,u64ValD; + int i,j; + s32EncOffset=(pstSrcImage->u16Width*pstSrcImage->u16Height>>8)*offsetxy; + pu8Img=pstDstImage->pu8VirAddr[0]+s32EncOffset; + pu32Src=(HI_U32 *)pstSrcImage->pu8VirAddr[0]; + for(i=0;i<(pstSrcImage->u16Height>>4);i++) + { + u32ValAL=pu32Src[-2]; + u32ValAH=pu32Src[-1]; + u32ValCL=pu32Src[15*(pstSrcImage->u16Stride[0]*2)-2]; + u32ValCH=pu32Src[15*(pstSrcImage->u16Stride[0]*2)-1]; + for(j=0;j<(pstSrcImage->u16Width>>4);j++) + { + u32ValBL=pu32Src[(j*16+15)*2-(pstSrcImage->u16Stride[0]*2)]; + u32ValBH=pu32Src[(j*16+15)*2+1-(pstSrcImage->u16Stride[0]*2)]; + u32ValDL=pu32Src[j*32+30*(pstSrcImage->u16Stride[0])+30]; + u32ValDH=pu32Src[j*32+30*(pstSrcImage->u16Stride[0])+30+1]; + mean=((u32ValAL&0xfffffff)+(u32ValDL&0xfffffff)-(u32ValBL&0xfffffff)-(u32ValCL&0xfffffff)); + u64ValA=(u32ValAH<<4); + u64ValA=(u32ValAL>>28)|u64ValA; + u64ValB=(u32ValBH<<4); + u64ValB=(u32ValBL>>28)|u64ValB; + u64ValC=(u32ValCH<<4); + u64ValC=(u32ValCL>>28)|u64ValC; + u64ValD=(u32ValDH<<4); + u64ValD=(u32ValDL>>28)|u64ValD; + sqsum=(u64ValD+u64ValA-u64ValB-u64ValC); + *pu8Img++=(HI_U8)(MAX2((sqrt((HI_S32)(sqsum-(mean*mean>>8)+64)>>8)),0)); + u32ValAL=u32ValBL; + u32ValAH=u32ValBH; + u32ValCL=u32ValDL; + u32ValCH=u32ValDH; + + } + pu32Src+=((pstSrcImage->u16Stride[0])<<5); + } + return 0; +} + +HI_S32 EncSetMbQp(int EncChn,int *ps32Hist,int width,int height,int u32HistSize) +{ + int i,j; + float f32factor; + HI_U16 u16Hist[256]; + HI_U32 pu32IThresh[12]; + HI_U32 pu32PThresh[12]; + VENC_RC_PARAM_S stRcParam; + int s32Ret; + j=0; + f32factor=1.0/u32HistSize; + u16Hist[0]=ps32Hist[0]; + for (i=1;i<256;i++) + { + u16Hist[i]=u16Hist[i-1]+ps32Hist[i]; + u16Hist[i-1]=(HI_U16)(u16Hist[i-1]*f32factor*100); + } + u16Hist[255]=100; + for(i=0;i<12;i++) + { + pu32IThresh[i]=255; + pu32PThresh[i]=255; + } + i=0; + for(j=0;j<12;j++) + { + while((u16Hist[i]= 80 && totalpercentmadi[i-1] < 80) + { + tage8 = i*2; + } + } + for(i = 1;i < 25;i++) + { + if(totalpercentmadi[i] >= 50 && totalpercentmadi[i-1] < 50) + { + tage5 = i*2; + } + } + for(i = 1;i < 25;i++) + { + if(totalpercentmadi[i] >= 20 && totalpercentmadi[i-1] < 20) + { + tage2 = i*2+1; + } + } +#ifdef HI3518E_RC + { + if (totalpercentmadi[0] < 1 && totalpercentmadi[1] < 5) + { + pu32IThresh[0] = tage2; + pu32IThresh[1] = tage2; + pu32IThresh[2] = tage2; + pu32IThresh[3] = tage2; + } + else + { + pu32IThresh[0] = tage2; + pu32IThresh[1] = tage2; + pu32IThresh[2] = tage2 + 2; + pu32IThresh[3] = tage2 + 2; + } + + } +#else + { + if (totalpercentmadi[0] < 1 && totalpercentmadi[1] < 5) + { + pu32IThresh[0] = 0; + pu32IThresh[1] = 0; + pu32IThresh[2] = 2; + pu32IThresh[3] = 2; + } + else + { + if(totalpercentmadi[1] < 10 && percentmadi[0] == 0) + { + pu32IThresh[0] = 0; + pu32IThresh[1] = 0; + pu32IThresh[2] = 3; + pu32IThresh[3] = 3; + } + else if(totalpercentmadi[1] > 30 && totalpercentmadi[2] > 50) + { + pu32IThresh[0] = 2; + pu32IThresh[1] = 2; + pu32IThresh[2] = 4; + pu32IThresh[3] = 4; + } + else + { + pu32IThresh[0] = 3; + pu32IThresh[1] = 3; + pu32IThresh[2] = 5; + pu32IThresh[3] = 5; + + } + } + } +#endif + tage8 = MAX2(tage8, 15); + tage5 = MAX2(tage5, 7); + dp = (tage8 - tage5) / 3; + pu32PThresh[0] = pu32IThresh[0]; + pu32PThresh[1] = pu32IThresh[1]; + pu32PThresh[2] = pu32IThresh[2]; + pu32PThresh[3] = pu32IThresh[3]; + for ( i = 0; i < 5; i++) + { + pu32PThresh[i] = tage5; + } + for ( i = 5; i < 9; i++) + { + pu32PThresh[i] = pu32PThresh[4] + dp; + } + for ( i = 9; i < 12; i++) + { + pu32PThresh[i] = pu32PThresh[8] + dp + 1; + } + dp = (tage8 - pu32IThresh[3] + 2) / 4; + for ( i = 4; i < 11; i++) + { + pu32IThresh[i] = pu32IThresh[i - 1] + dp; + pu32IThresh[i + 1] = pu32IThresh[i]; + i++; + } +#if 0 + for( i = 0; i < 12;i++) + { + printf("%d\t",pu32IThresh[i]); + } + printf("\n"); +#endif + s32Ret=HI_MPI_VENC_GetRcParam(EncChn,&stRcParam); + if (HI_SUCCESS != s32Ret) + { + CHECK_RET("HI_MPI_VENC_GetRcParam failed\n",s32Ret); + } + memcpy(stRcParam.u32ThrdI,pu32IThresh,12*4); + memcpy(stRcParam.u32ThrdP,pu32PThresh,12*4); + s32Ret=HI_MPI_VENC_SetRcParam(EncChn,&stRcParam); + if (HI_SUCCESS != s32Ret) + { + CHECK_RET("HI_MPI_VENC_SetRcParam failed\n",s32Ret); + } + return s32Ret; + +} + +HI_VOID* ImageAnalyProc(HI_VOID* pArgs) +{ + IVE_MD* pstIveMd; + HI_S32 s32Ret; + //HI_S32 s32GetFrameMilliSec = 100; + IVE_IMAGE_S stSrcImage; + IVE_HANDLE IveHandle; + HI_U32 u32Offset; + IVE_INTEG_CTRL_S eIveIntegCtrl; + //IVE_DMA_CTRL_S stIveDmaCtrl; + HI_BOOL bFinish, bBlock; + IVE_MEM_INFO_S stHistMem; + int i, j; + VIDEO_FRAME_INFO_S* pstFrameInfo; + prctl(PR_SET_NAME, (unsigned long)"ImageAnaly", 0, 0, 0); + + pstIveMd = (IVE_MD*)pArgs; + bBlock = HI_TRUE; + pstFrameInfo = (VIDEO_FRAME_INFO_S*)malloc(sizeof(VIDEO_FRAME_INFO_S) * 2); + if (pstFrameInfo == NULL) + { + printf("can't alloc frame info\n"); + return NULL; + } + eIveIntegCtrl.enOutCtrl = IVE_INTEG_OUT_CTRL_COMBINE; + stSrcImage.enType = IVE_IMAGE_TYPE_U8C1; + + stSrcImage.u16Height=(pstIveMd->u16OriHeight>>3)&(~0xf); + stSrcImage.u16Width=(pstIveMd->u16OriWidth>>3)&(~0xf); + + //stIveDmaCtrl.enMode=IVE_DMA_MODE_DIRECT_COPY; + + while(pstIveMd->bStopSignal==HI_FALSE) + { + s32Ret =HI_MPI_IVE_GetFrame(0,pstFrameInfo,200); + if(HI_SUCCESS!=s32Ret) + { + usleep(200000); + continue; + } + for(i=0;i<8;i++) + { + for(j=0;j<8;j++) + { + u32Offset=(j*stSrcImage.u16Width)+(i*(stSrcImage.u16Height) *pstFrameInfo->stVFrame.u32Stride[0]); + stSrcImage.pu8VirAddr[0]=((HI_U8 *)pstFrameInfo->stVFrame.pVirAddr[0]+u32Offset); + stSrcImage.u32PhyAddr[0]=pstFrameInfo->stVFrame.u32PhyAddr[0]+u32Offset; + stSrcImage.u16Stride[0]=pstFrameInfo->stVFrame.u32Stride[0]; + + s32Ret=HI_MPI_IVE_Integ(&IveHandle,&stSrcImage,&pstIveMd->stImg4,&eIveIntegCtrl,HI_FALSE); + if (HI_SUCCESS != s32Ret) + { + CHECK_RET("HI_MPI_IVE_Integ failed\n",s32Ret); + (HI_VOID)HI_MPI_IVE_ReleaseFrame(0, pstFrameInfo); + goto ANALYFAIL; + } + s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); + if(HI_SUCCESS != s32Ret || bFinish!=HI_TRUE) + { + CHECK_RET("HI_MPI_IVE_Query failed\n",s32Ret); + (HI_VOID)HI_MPI_IVE_ReleaseFrame(0, pstFrameInfo); + goto ANALYFAIL; + } + EncMadiCal(&pstIveMd->stImg5,&pstIveMd->stImg4,i*8+j); + s32Ret=HI_MPI_SYS_MmzFlushCache(pstIveMd->stImg4.u32PhyAddr[0],pstIveMd->stImg4.pu8VirAddr[0], + (pstIveMd->stImg4.u16Stride[0]*pstIveMd->stImg4.u16Height<<3)); + CHECK_RET("HI_MPI_SYS_MmzFlushCache failed\n",s32Ret); +#if 0 + while(1) + { + usleep(10000); + } +#endif + } + } + stHistMem.pu8VirAddr=pstIveMd->stHistInfo.pu8VirAddr[0]; + stHistMem.u32PhyAddr=pstIveMd->stHistInfo.u32PhyAddr[0]; + stHistMem.u32Size=4*1024; + + s32Ret=HI_MPI_SYS_MmzFlushCache(pstIveMd->stImg5.u32PhyAddr[0],pstIveMd->stImg5.pu8VirAddr[0], + pstIveMd->stImg5.u16Stride[0]*pstIveMd->stImg5.u16Height); + CHECK_RET("HI_MPI_SYS_MmzFlushCache failed\n",s32Ret); + + + s32Ret = HI_MPI_IVE_Hist(&IveHandle, &pstIveMd->stImg1, &stHistMem, HI_FALSE); + + if (HI_SUCCESS != s32Ret) + { + CHECK_RET("HI_MPI_IVE_Hist failed\n", s32Ret); + (HI_VOID)HI_MPI_IVE_ReleaseFrame(0, pstFrameInfo); + goto ANALYFAIL; + } + s32Ret = HI_MPI_IVE_Query(IveHandle, &bFinish, bBlock); + if (HI_SUCCESS != s32Ret) + { + CHECK_RET("HI_MPI_IVE_Query failed\n", s32Ret); + (HI_VOID)HI_MPI_IVE_ReleaseFrame(0, pstFrameInfo); + goto ANALYFAIL; + } + s32Ret = HI_MPI_IVE_ReleaseFrame(0, pstFrameInfo); + if (HI_SUCCESS != s32Ret) + { + CHECK_RET("HI_MPI_IVE_ReleaseFrame failed\n", s32Ret); + goto ANALYFAIL; + } + if (pstIveMd->eRCMode == E_MBINTEG) + { + s32Ret = EncSetMbQp(0, (int*)(pstIveMd->stHistInfo.pu8VirAddr[0]), pstIveMd->u16OriWidth, pstIveMd->u16OriHeight, pstIveMd->stImg5.u16Width * pstIveMd->stImg5.u16Height); + } + else + { + s32Ret = EncSetMbQpSec(0, (int*)(pstIveMd->stHistInfo.pu8VirAddr[0]), pstIveMd->u16OriWidth, pstIveMd->u16OriHeight, pstIveMd->stImg5.u16Width * pstIveMd->stImg5.u16Height); + } + if (HI_SUCCESS != s32Ret) + { + CHECK_RET("EncSetMbQp failed\n", s32Ret); + (HI_VOID)HI_MPI_IVE_ReleaseFrame(0, pstFrameInfo); + goto ANALYFAIL; + } + usleep(2000000); + } +ANALYFAIL: + free(pstFrameInfo); + +return HI_NULL; +} + + +HI_S32 CommSceneautoIVEStart(HI_S32 s32VpssGrp, HI_S32 s32VpssChn) +{ + HI_S32 s32Ret = 0; + VPSS_GRP VpssGrp = s32VpssGrp; + VPSS_CHN VpssChn = s32VpssChn; + VPSS_CHN_MODE_S stVpssChnMode; + int ViExtChn = VIU_EXT_CHN_START; + + memset(&stIveMd, 0, sizeof(IVE_MD)); + stIveMd.s32VpssGrp = s32VpssGrp; + stIveMd.s32VpssChn = s32VpssChn; + s32Ret = HI_MPI_VPSS_GetChnMode(VpssGrp, VpssChn, &stVpssChnMode); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VPSS_GetChnMode failed\n"); + return HI_FAILURE; + } + + + stIveMd.u16OriWidth = stVpssChnMode.u32Width; + stIveMd.u16OriHeight = stVpssChnMode.u32Height; + + stIveMd.bPause = HI_TRUE; + stIveMd.bStopSignal = HI_FALSE; + + IVE_DetectInit(&stIveMd); + + stIveMd.ViExtChn = ViExtChn; + + s32Ret = pthread_create(&stIveMd.hIveMBThread, 0, ImageAnalyProc, (HI_VOID*)&stIveMd); + if (HI_SUCCESS != s32Ret) + { + printf("create ImageAnalyProc thread failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoIVEStop() +{ + stIveMd.bStopSignal = HI_TRUE; + + (void)pthread_join(stIveMd.hIveMBThread, NULL); + IVE_DetectDestory(&stIveMd); + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetRegister(HI_S32 s32IspDev, HI_U32 u32Addr, HI_U32 u32Vaule) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + + s32Ret = HI_MPI_ISP_SetRegister(IspDev, u32Addr, u32Vaule); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetRegister failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetAcmAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_ACM_ATTR_S *pstAdptAcmAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_ACM_ATTR_S stAcmAttr; + + s32Ret = HI_MPI_ISP_GetAcmAttr(IspDev, &stAcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetAcmAttr failed\n"); + return HI_FAILURE; + } + + pstAdptAcmAttr->bEnable = stAcmAttr.bEnable; + pstAdptAcmAttr->u32CbcrThr = stAcmAttr.u32CbcrThr; + pstAdptAcmAttr->u32GainHue = stAcmAttr.u32GainHue; + pstAdptAcmAttr->u32GainLuma = stAcmAttr.u32GainLuma; + pstAdptAcmAttr->u32GainSat = stAcmAttr.u32GainSat; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetAcmAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_ACM_ATTR_S *pstAdptAcmAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_ACM_ATTR_S stAcmAttr; + + s32Ret = HI_MPI_ISP_GetAcmAttr(IspDev, &stAcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetAcmAttr failed\n"); + return HI_FAILURE; + } + + stAcmAttr.bEnable = pstAdptAcmAttr->bEnable; + stAcmAttr.u32CbcrThr = pstAdptAcmAttr->u32CbcrThr; + stAcmAttr.u32GainHue = pstAdptAcmAttr->u32GainHue; + stAcmAttr.u32GainLuma = pstAdptAcmAttr->u32GainLuma; + stAcmAttr.u32GainSat = pstAdptAcmAttr->u32GainSat; + + s32Ret = HI_MPI_ISP_SetAcmAttr(IspDev, &stAcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetAcmAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetCcmAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_CCM_ATTR_S *pstAdptCcmAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_COLORMATRIX_ATTR_S stCcmAttr; + + s32Ret = HI_MPI_ISP_GetCCMAttr(IspDev, &stCcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetCCMAttr failed\n"); + return HI_FAILURE; + } + + pstAdptCcmAttr->u16HighColorTemp = stCcmAttr.stAuto.u16HighColorTemp; + pstAdptCcmAttr->u16MidColorTemp = stCcmAttr.stAuto.u16MidColorTemp; + pstAdptCcmAttr->u16LowColorTemp = stCcmAttr.stAuto.u16LowColorTemp; + + for (i = 0; i < 9; i++) + { + pstAdptCcmAttr->au16HighCCM[i] = stCcmAttr.stAuto.au16HighCCM[i]; + pstAdptCcmAttr->au16MidCCM[i] = stCcmAttr.stAuto.au16MidCCM[i]; + pstAdptCcmAttr->au16LowCCM[i] = stCcmAttr.stAuto.au16LowCCM[i]; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetCcmAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_CCM_ATTR_S *pstAdptCcmAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_COLORMATRIX_ATTR_S stCcmAttr; + + s32Ret = HI_MPI_ISP_GetCCMAttr(IspDev, &stCcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetCCMAttr failed\n"); + return HI_FAILURE; + } + + stCcmAttr.stAuto.u16HighColorTemp = pstAdptCcmAttr->u16HighColorTemp; + stCcmAttr.stAuto.u16MidColorTemp = pstAdptCcmAttr->u16MidColorTemp; + stCcmAttr.stAuto.u16LowColorTemp = pstAdptCcmAttr->u16LowColorTemp; + + for (i = 0; i < 9; i++) + { + stCcmAttr.stAuto.au16HighCCM[i] = pstAdptCcmAttr->au16HighCCM[i]; + stCcmAttr.stAuto.au16MidCCM[i] = pstAdptCcmAttr->au16MidCCM[i]; + stCcmAttr.stAuto.au16LowCCM[i] = pstAdptCcmAttr->au16LowCCM[i]; + } + + stCcmAttr.enOpType = OP_TYPE_AUTO; + s32Ret = HI_MPI_ISP_SetCCMAttr(IspDev, &stCcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetCCMAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetSharpen(HI_S32 s32IspDev, ADPT_SCENEAUTO_SHARPEN_S *pstAdptSharpen) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_SHARPEN_ATTR_S stSharpenAttr; + + s32Ret = HI_MPI_ISP_GetSharpenAttr(IspDev, &stSharpenAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetSharpenAttr failed\n"); + return HI_FAILURE; + } + for (i = 0; i < 16; i++) + { + pstAdptSharpen->abEnLowLumaShoot[i] = stSharpenAttr.stAuto.abEnLowLumaShoot[i]; + pstAdptSharpen->u8SharpenD[i] = stSharpenAttr.stAuto.au8SharpenD[i]; + pstAdptSharpen->u8SharpenUd[i] = stSharpenAttr.stAuto.au8SharpenUd[i]; + pstAdptSharpen->u8OverShoot[i] = stSharpenAttr.stAuto.au8OverShoot[i]; + pstAdptSharpen->u8UnderShoot[i] = stSharpenAttr.stAuto.au8UnderShoot[i]; + pstAdptSharpen->u8TextureNoiseThd[i] = stSharpenAttr.stAuto.au8TextureNoiseThd[i]; + pstAdptSharpen->u8EdgeNoiseThd[i] = stSharpenAttr.stAuto.au8EdgeNoiseThd[i]; + } + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetSharpen(HI_S32 s32IspDev, const ADPT_SCENEAUTO_SHARPEN_S *pstAdptSharpen) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_SHARPEN_ATTR_S stSharpenAttr; + + s32Ret = HI_MPI_ISP_GetSharpenAttr(IspDev, &stSharpenAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetSharpenAttr failed\n"); + return HI_FAILURE; + } + + for (i = 0; i < 16; i++) + { + stSharpenAttr.stAuto.abEnLowLumaShoot[i] = pstAdptSharpen->abEnLowLumaShoot[i]; + stSharpenAttr.stAuto.au8SharpenD[i] = pstAdptSharpen->u8SharpenD[i]; + stSharpenAttr.stAuto.au8SharpenUd[i] = pstAdptSharpen->u8SharpenUd[i]; + stSharpenAttr.stAuto.au8OverShoot[i] = pstAdptSharpen->u8OverShoot[i]; + stSharpenAttr.stAuto.au8UnderShoot[i] = pstAdptSharpen->u8UnderShoot[i]; + stSharpenAttr.stAuto.au8TextureNoiseThd[i] = pstAdptSharpen->u8TextureNoiseThd[i]; + stSharpenAttr.stAuto.au8EdgeNoiseThd[i] = pstAdptSharpen->u8EdgeNoiseThd[i]; + } + s32Ret = HI_MPI_ISP_SetSharpenAttr(IspDev, &stSharpenAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetSharpenAttr failed\n"); + return HI_FAILURE; + } + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetDP(HI_S32 s32IspDev, ADPT_SCENEAUTO_DP_S *pstAdptDP) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_DP_DYNAMIC_ATTR_S stDPAttr; + + s32Ret = HI_MPI_ISP_GetDPDynamicAttr(IspDev, &stDPAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetDPAttr failed\n"); + return HI_FAILURE; + } + + for (i = 0; i < 16; i++) + { + pstAdptDP->u16Slope[i] = stDPAttr.stAuto.au16Slope[i]; + } + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetDP(HI_S32 s32IspDev, const ADPT_SCENEAUTO_DP_S *pstAdptDP) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_DP_DYNAMIC_ATTR_S stDPAttr; + + s32Ret = HI_MPI_ISP_GetDPDynamicAttr(IspDev, &stDPAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetDPAttr failed\n"); + return HI_FAILURE; + } + + for (i = 0; i < 16; i++) + { + stDPAttr.stAuto.au16Slope[i] = pstAdptDP->u16Slope[i]; + } + + s32Ret = HI_MPI_ISP_SetDPDynamicAttr(IspDev, &stDPAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetDPAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetPubAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_PUBATTR_S* pstAdptPubAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_PUB_ATTR_S stPubAttr; + + s32Ret = HI_MPI_ISP_GetPubAttr(IspDev, &stPubAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetPubAttr failed\n"); + return HI_FAILURE; + } + + pstAdptPubAttr->u32Frame = (HI_U32)stPubAttr.f32FrameRate; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetGamma(HI_S32 s32IspDev, ADPT_SCENEAUTO_GAMMA_S* pstAdptGamma) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_GAMMA_ATTR_S stGammaAttr; + + s32Ret = HI_MPI_ISP_GetGammaAttr(IspDev, &stGammaAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetGammaAttr failed\n"); + return HI_FAILURE; + } + + pstAdptGamma->u8CurveType = stGammaAttr.enCurveType; + for (i = 0; i < 257; i++) + { + pstAdptGamma->au16GammaTable[i] = stGammaAttr.u16Table[i]; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetGamma(HI_S32 s32IspDev, const ADPT_SCENEAUTO_GAMMA_S *pstAdptGamma) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_GAMMA_ATTR_S stGammaAttr; + + s32Ret = HI_MPI_ISP_GetGammaAttr(IspDev, &stGammaAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetGammaAttr failed\n"); + return HI_FAILURE; + } + + switch(pstAdptGamma->u8CurveType) + { + case 0: + stGammaAttr.enCurveType = ISP_GAMMA_CURVE_DEFAULT; + break; + case 1: + stGammaAttr.enCurveType = ISP_GAMMA_CURVE_SRGB; + break; + case 2: + stGammaAttr.enCurveType = ISP_GAMMA_CURVE_USER_DEFINE; + break; + default: + break; + } + for (i = 0; i < 257; i++) + { + stGammaAttr.u16Table[i] = pstAdptGamma->au16GammaTable[i]; + } + + s32Ret = HI_MPI_ISP_SetGammaAttr(IspDev, &stGammaAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetGammaAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetH264Trans(HI_S32 s32VencChn, ADPT_SCENEAUTO_H264TRANS_S *pstAdptH264Trans) +{ + HI_S32 s32Ret = HI_SUCCESS; + VENC_CHN VencChn = s32VencChn; + VENC_PARAM_H264_TRANS_S stH264Trans; + + s32Ret = HI_MPI_VENC_GetH264Trans(VencChn, &stH264Trans); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetH264Trans failed\n"); + return HI_FAILURE; + } + + pstAdptH264Trans->chroma_qp_index_offset = stH264Trans.chroma_qp_index_offset; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetH264Trans(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H264TRANS_S *pstAdptH264Trans) +{ + HI_S32 s32Ret = HI_SUCCESS; + VENC_CHN VencChn = s32VencChn; + VENC_PARAM_H264_TRANS_S stH264Trans; + + s32Ret = HI_MPI_VENC_GetH264Trans(VencChn, &stH264Trans); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetH264Trans failed\n"); + return HI_FAILURE; + } + + stH264Trans.chroma_qp_index_offset = pstAdptH264Trans->chroma_qp_index_offset; + + s32Ret = HI_MPI_VENC_SetH264Trans(VencChn, &stH264Trans); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_SetH264Trans failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetH24Deblock(HI_S32 s32VencChn, ADPT_SCENEAUTO_H264_DEBLOCK_S *pstAdptH264Deblock) +{ + HI_S32 s32Ret = HI_SUCCESS; + VENC_CHN VencChn = s32VencChn; + VENC_PARAM_H264_DBLK_S stH264Dblk; + + s32Ret = HI_MPI_VENC_GetH264Dblk(VencChn, &stH264Dblk); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetH264Dblk failed\n"); + return HI_FAILURE; + } + + pstAdptH264Deblock->disable_deblocking_filter_idc = stH264Dblk.disable_deblocking_filter_idc; + pstAdptH264Deblock->slice_alpha_c0_offset_div2 = stH264Dblk.slice_alpha_c0_offset_div2; + pstAdptH264Deblock->slice_beta_offset_div2 = stH264Dblk.slice_beta_offset_div2; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetH24Deblock(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H264_DEBLOCK_S *pstAdptH264Deblock) +{ + HI_S32 s32Ret = HI_SUCCESS; + VENC_CHN VencChn = s32VencChn; + VENC_PARAM_H264_DBLK_S stH264Dblk; + + s32Ret = HI_MPI_VENC_GetH264Dblk(VencChn, &stH264Dblk); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetH264Dblk failed\n"); + return HI_FAILURE; + } + + stH264Dblk.disable_deblocking_filter_idc = pstAdptH264Deblock->disable_deblocking_filter_idc; + stH264Dblk.slice_alpha_c0_offset_div2 = pstAdptH264Deblock->slice_alpha_c0_offset_div2; + stH264Dblk.slice_beta_offset_div2 = pstAdptH264Deblock->slice_beta_offset_div2; + + s32Ret = HI_MPI_VENC_SetH264Dblk(VencChn, &stH264Dblk); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetH264Dblk failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetH264RcParam(HI_S32 s32VencChn, ADPT_SCENEAUTO_H264_RCPARAM_S* pstAdptH264RCParam) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + VENC_CHN VencChn = s32VencChn; + VENC_RC_PARAM_S stRCParam; + VENC_CHN_ATTR_S stChnAttr; + + s32Ret = HI_MPI_VENC_GetChnAttr(VencChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetChnAttr failed\n"); + return HI_FAILURE; + } + if (stChnAttr.stRcAttr.enRcMode != VENC_RC_MODE_H264CBR && stChnAttr.stRcAttr.enRcMode != VENC_RC_MODE_H264VBR) + { + return HI_SUCCESS; + } + s32Ret = HI_MPI_VENC_GetRcParam(VencChn, &stRCParam); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetRcParam failed\n"); + return HI_FAILURE; + } + + pstAdptH264RCParam->u32QpDelta = stRCParam.u32RowQpDelta; + for (i = 0; i < 12; i++) + { + pstAdptH264RCParam->u32ThrdI[i] = stRCParam.u32ThrdI[i]; + pstAdptH264RCParam->u32ThrdP[i] = stRCParam.u32ThrdP[i]; + } + switch (stChnAttr.stRcAttr.enRcMode) + { + case VENC_RC_MODE_H264CBR: + pstAdptH264RCParam->s32IPQPDelta = stRCParam.stParamH264Cbr.s32IPQPDelta; + break; + case VENC_RC_MODE_H264VBR: + pstAdptH264RCParam->s32IPQPDelta = stRCParam.stParamH264VBR.s32IPQPDelta; + break; + default: + break; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetH264RcParam(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H264_RCPARAM_S* pstAdptH264RCParam) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + VENC_CHN VencChn = s32VencChn; + VENC_RC_PARAM_S stRCParam; + VENC_CHN_ATTR_S stChnAttr; + s32Ret = HI_MPI_VENC_GetChnAttr(VencChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetChnAttr failed\n"); + return HI_FAILURE; + } + if (stChnAttr.stRcAttr.enRcMode != VENC_RC_MODE_H264CBR && stChnAttr.stRcAttr.enRcMode != VENC_RC_MODE_H264VBR) + { + return HI_SUCCESS; + } + + s32Ret = HI_MPI_VENC_GetRcParam(VencChn, &stRCParam); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetRcParam failed\n"); + return HI_FAILURE; + } + + stRCParam.u32RowQpDelta = pstAdptH264RCParam->u32QpDelta; + for (i = 0; i < 12; i++) + { + stRCParam.u32ThrdI[i] = pstAdptH264RCParam->u32ThrdI[i]; + stRCParam.u32ThrdP[i] = pstAdptH264RCParam->u32ThrdP[i]; + } + switch (stChnAttr.stRcAttr.enRcMode) + { + case VENC_RC_MODE_H264CBR: + stRCParam.stParamH264Cbr.s32IPQPDelta = pstAdptH264RCParam->s32IPQPDelta; + break; + case VENC_RC_MODE_H264VBR: + stRCParam.stParamH264VBR.s32IPQPDelta = pstAdptH264RCParam->s32IPQPDelta; + break; + default: + break; + } + + s32Ret = HI_MPI_VENC_SetRcParam(VencChn, &stRCParam); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_SetRcParam failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetAERoute(HI_S32 s32IspDev, ADPT_SCENEAUTO_AEROUTE_S *pstAdptAERoute) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_AE_ROUTE_S stAERoute; + + s32Ret = HI_MPI_ISP_GetAERouteAttr(IspDev, &stAERoute); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetAERouteAttr failed\n"); + return HI_FAILURE; + } + + pstAdptAERoute->u32TotalNum = stAERoute.u32TotalNum; + for (i = 0; i < 8; i++) + { + pstAdptAERoute->astRouteNode[i].u32IntTime = stAERoute.astRouteNode[i].u32IntTime; + pstAdptAERoute->astRouteNode[i].u32SysGain = stAERoute.astRouteNode[i].u32SysGain; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetAERoute(HI_S32 s32IspDev, const ADPT_SCENEAUTO_AEROUTE_S *pstAdptAERoute) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_AE_ROUTE_S stAERoute; + + s32Ret = HI_MPI_ISP_GetAERouteAttr(IspDev, &stAERoute); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetAERouteAttr failed\n"); + return HI_FAILURE; + } + + stAERoute.u32TotalNum = pstAdptAERoute->u32TotalNum; + for (i = 0; i < 8; i++) + { + stAERoute.astRouteNode[i].u32IntTime = pstAdptAERoute->astRouteNode[i].u32IntTime; + stAERoute.astRouteNode[i].u32SysGain = pstAdptAERoute->astRouteNode[i].u32SysGain; + } + + s32Ret = HI_MPI_ISP_SetAERouteAttr(IspDev, &stAERoute); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetAERouteAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetDCIParam(HI_S32 s32ViDev, ADPT_SCENEAUTO_DCIPARAM_S *pstAdptDCIPara) +{ + HI_S32 s32Ret = HI_SUCCESS; + VI_DCI_PARAM_S stDCIParam; + + s32Ret = HI_MPI_VI_GetDCIParam(s32ViDev, &stDCIParam); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VI_GetDCIParam failed\n"); + return HI_FAILURE; + } + pstAdptDCIPara->bEnable = stDCIParam.bEnable; + pstAdptDCIPara->u32BlackGain = stDCIParam.u32BlackGain; + pstAdptDCIPara->u32ContrastGain = stDCIParam.u32ContrastGain; + pstAdptDCIPara->u32LightGain = stDCIParam.u32LightGain; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetRgbirParam(HI_S32 s32IspDev, ADPT_SCENEAUTO_RGBIRPARAM_S *pstAdptRgbirPara) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_RGBIR_ATTR_S stRgbirAttr; + ISP_RGBIR_CTRL_S stRgbirCtrl; + + s32Ret = HI_MPI_ISP_GetRgbirAttr(s32IspDev, &stRgbirAttr); + s32Ret = HI_MPI_ISP_GetRgbirCtrl(s32IspDev, &stRgbirCtrl); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetRgbirParam failed\n"); + return HI_FAILURE; + } + + pstAdptRgbirPara->bEnable = stRgbirAttr.bEnable; + pstAdptRgbirPara->bRemovelEn = stRgbirCtrl.bRemovelEn; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetRgbirParam(HI_S32 s32IspDev, ADPT_SCENEAUTO_RGBIRPARAM_S *pstAdptRgbirPara) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_RGBIR_ATTR_S stRgbirAttr; + ISP_RGBIR_CTRL_S stRgbirCtrl; + + s32Ret = HI_MPI_ISP_GetRgbirAttr(s32IspDev, &stRgbirAttr); + s32Ret = HI_MPI_ISP_GetRgbirCtrl(s32IspDev, &stRgbirCtrl); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetRgbirParam failed\n"); + return HI_FAILURE; + } + + stRgbirAttr.bEnable = pstAdptRgbirPara->bEnable; + stRgbirCtrl.bRemovelEn = pstAdptRgbirPara->bRemovelEn; + + s32Ret = HI_MPI_ISP_SetRgbirAttr(s32IspDev, &stRgbirAttr); + s32Ret = HI_MPI_ISP_SetRgbirCtrl(s32IspDev, &stRgbirCtrl); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetRgbirParam failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + + +HI_S32 CommSceneautoSetDCIParam(HI_S32 s32ViDev, const ADPT_SCENEAUTO_DCIPARAM_S *pstAdptDCIPara) +{ + HI_S32 s32Ret = HI_SUCCESS; + VI_DCI_PARAM_S stDCIParam; + + s32Ret = HI_MPI_VI_GetDCIParam(s32ViDev, &stDCIParam); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VI_GetDCIParam failed\n"); + return HI_FAILURE; + } + + stDCIParam.bEnable = pstAdptDCIPara->bEnable; + stDCIParam.u32BlackGain = pstAdptDCIPara->u32BlackGain; + stDCIParam.u32ContrastGain = pstAdptDCIPara->u32ContrastGain; + stDCIParam.u32LightGain = pstAdptDCIPara->u32LightGain; + + s32Ret = HI_MPI_VI_SetDCIParam(s32ViDev, &stDCIParam); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VI_SetDCIParam failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetDRCAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_DRCATTR_S *pstAdptDRCAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DRC_ATTR_S stDRCAttr; + + s32Ret = HI_MPI_ISP_GetDRCAttr(s32IspDev, &stDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetDRCAttr failed\n"); + return HI_FAILURE; + } + + pstAdptDRCAttr->bEnable = stDRCAttr.bEnable; + if (stDRCAttr.enOpType == OP_TYPE_MANUAL) + { + pstAdptDRCAttr->bManulEnable = HI_TRUE; + } + else + { + pstAdptDRCAttr->bManulEnable = HI_FALSE; + } + pstAdptDRCAttr->u8Strength = stDRCAttr.stManual.u8Strength; + pstAdptDRCAttr->u16BrightGainLmt = stDRCAttr.u16BrightGainLmt; + pstAdptDRCAttr->u16DarkGainLmtC = stDRCAttr.u16DarkGainLmtC; + pstAdptDRCAttr->u16DarkGainLmtY = stDRCAttr.u16DarkGainLmtY; + pstAdptDRCAttr->u8Asymmetry = stDRCAttr.u8Asymmetry; + pstAdptDRCAttr->u8LocalMixingBrigtht = stDRCAttr.u8LocalMixingBrigtht; + pstAdptDRCAttr->u8LocalMixingDark = stDRCAttr.u8LocalMixingDark; + pstAdptDRCAttr->u8LocalMixingThres = stDRCAttr.u8LocalMixingThres; + pstAdptDRCAttr->u8RangeVar = stDRCAttr.u8RangeVar; + pstAdptDRCAttr->u8SecondPole = stDRCAttr.u8SecondPole; + pstAdptDRCAttr->u8SpatialVar= stDRCAttr.u8SpatialVar; + pstAdptDRCAttr->u8Stretch = stDRCAttr.u8Stretch; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetDRCAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_DRCATTR_S *pstAdptDRCAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DRC_ATTR_S stDRCAttr; + + s32Ret = HI_MPI_ISP_GetDRCAttr(s32IspDev, &stDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetDRCAttr failed\n"); + return HI_FAILURE; + } + + stDRCAttr.bEnable = pstAdptDRCAttr->bEnable; + if (pstAdptDRCAttr->bManulEnable == HI_TRUE) + { + stDRCAttr.enOpType = OP_TYPE_MANUAL; + } + else + { + stDRCAttr.enOpType = OP_TYPE_AUTO; + } + + stDRCAttr.stManual.u8Strength = pstAdptDRCAttr->u8Strength; + stDRCAttr.u16BrightGainLmt = pstAdptDRCAttr->u16BrightGainLmt; + stDRCAttr.u16DarkGainLmtC = pstAdptDRCAttr->u16DarkGainLmtC; + stDRCAttr.u16DarkGainLmtY = pstAdptDRCAttr->u16DarkGainLmtY; + stDRCAttr.u8Asymmetry = pstAdptDRCAttr->u8Asymmetry; + stDRCAttr.u8LocalMixingBrigtht= pstAdptDRCAttr->u8LocalMixingBrigtht; + stDRCAttr.u8LocalMixingDark = pstAdptDRCAttr->u8LocalMixingDark; + stDRCAttr.u8LocalMixingThres = pstAdptDRCAttr->u8LocalMixingThres; + stDRCAttr.u8RangeVar = pstAdptDRCAttr->u8RangeVar; + stDRCAttr.u8SecondPole = pstAdptDRCAttr->u8SecondPole; + stDRCAttr.u8SpatialVar = pstAdptDRCAttr->u8SpatialVar; + stDRCAttr.u8Stretch = pstAdptDRCAttr->u8Stretch; + + s32Ret = HI_MPI_ISP_SetDRCAttr(s32IspDev, &stDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetDRCAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetSaturation(HI_S32 s32IspDev, ADPT_SCENEAUTO_SATURATION_S *pstAdptSaturation) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_SATURATION_ATTR_S stSaturation; + + s32Ret = HI_MPI_ISP_GetSaturationAttr(IspDev, &stSaturation); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetSaturationAttr failed\n"); + return HI_FAILURE; + } + + pstAdptSaturation->u8OpType = stSaturation.enOpType; + pstAdptSaturation->u8ManualSat = stSaturation.stManual.u8Saturation; + for (i = 0; i < 16; i++) + { + pstAdptSaturation->au8AutoSat[i] = stSaturation.stAuto.au8Sat[i]; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetSaturation(HI_S32 s32IspDev, const ADPT_SCENEAUTO_SATURATION_S *pstAdptSaturation) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ISP_DEV IspDev = s32IspDev; + ISP_SATURATION_ATTR_S stSaturation; + + s32Ret = HI_MPI_ISP_GetSaturationAttr(IspDev, &stSaturation); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetSaturationAttr failed\n"); + return HI_FAILURE; + } + + switch (pstAdptSaturation->u8OpType) + { + case 0: + stSaturation.enOpType = OP_TYPE_AUTO; + break; + case 1: + stSaturation.enOpType = OP_TYPE_MANUAL; + break; + default: + break; + } + stSaturation.stManual.u8Saturation = pstAdptSaturation->u8ManualSat; + for (i = 0; i < 16; i++) + { + stSaturation.stAuto.au8Sat[i] = pstAdptSaturation->au8AutoSat[i]; + } + + s32Ret = HI_MPI_ISP_SetSaturationAttr(IspDev, &stSaturation); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetSaturationAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetDISAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_DIS_ATTR_S *pstAdptDisAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_DIS_ATTR_S stDisAttr; + + pstAdptDisAttr->bEnable = HI_FALSE; + s32Ret = HI_MPI_ISP_GetDISAttr(IspDev, &stDisAttr); + if (HI_SUCCESS != s32Ret) + { + //online mode not support dis + if (0xA0108008 == (HI_U32)s32Ret) + { + return HI_SUCCESS; + } + + printf("HI_MPI_ISP_GetDISAttr failed\n"); + return HI_FAILURE; + } + + pstAdptDisAttr->bEnable = stDisAttr.bEnable; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetDISAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_DIS_ATTR_S *pstAdptDisAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_DIS_ATTR_S stDisAttr; + + s32Ret = HI_MPI_ISP_GetDISAttr(IspDev, &stDisAttr); + if (HI_SUCCESS != s32Ret) + { + //online mode not support dis + if (0xA0108008 == (HI_U32)s32Ret) + { + return HI_SUCCESS; + } + printf("HI_MPI_ISP_GetDISAttr failed\n"); + return HI_FAILURE; + } + + stDisAttr.bEnable = pstAdptDisAttr->bEnable; + + s32Ret = HI_MPI_ISP_SetDISAttr(IspDev, &stDisAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetDISAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetAEAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_AEATTR_S *pstAdptAEAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_EXPOSURE_ATTR_S stExposureAttr; + HI_S32 i, j; + + s32Ret = HI_MPI_ISP_GetExposureAttr(IspDev, &stExposureAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetExposureAttr failed\n"); + return HI_FAILURE; + } + + pstAdptAEAttr->u8ExpCompensation = stExposureAttr.stAuto.u8Compensation; + pstAdptAEAttr->u16BlackDelayFrame = stExposureAttr.stAuto.stAEDelayAttr.u16BlackDelayFrame; + pstAdptAEAttr->u16WhiteDelayFrame = stExposureAttr.stAuto.stAEDelayAttr.u16WhiteDelayFrame; + switch (stExposureAttr.stAuto.enAEStrategyMode) + { + case AE_EXP_HIGHLIGHT_PRIOR: + pstAdptAEAttr->u8AEStrategyMode = 0; + break; + case AE_EXP_LOWLIGHT_PRIOR: + pstAdptAEAttr->u8AEStrategyMode = 1; + break; + default: + pstAdptAEAttr->u8AEStrategyMode = 0; + } + pstAdptAEAttr->u8AEStrategyMode = stExposureAttr.stAuto.enAEStrategyMode; + pstAdptAEAttr->u8MaxHistOffset = stExposureAttr.stAuto.u8MaxHistOffset; + pstAdptAEAttr->u16HistRatioSlope = stExposureAttr.stAuto.u16HistRatioSlope; + pstAdptAEAttr->u8Speed = stExposureAttr.stAuto.u8Speed; + pstAdptAEAttr->u8Tolerance = stExposureAttr.stAuto.u8Tolerance; + pstAdptAEAttr->u32SysGainMax = stExposureAttr.stAuto.stSysGainRange.u32Max; + pstAdptAEAttr->u8AERunInterval = stExposureAttr.u8AERunInterval; + + for (i = 0; i < AE_ZONE_ROW; i++) + { + for (j = 0; j < AE_ZONE_COLUMN; j++) + { + pstAdptAEAttr->au8AeWeight[i][j] = stExposureAttr.stAuto.au8Weight[i][j]; + } + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetAEAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_AEATTR_S *pstAdptAEAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_EXPOSURE_ATTR_S stExposureAttr; + HI_S32 i, j; + + s32Ret = HI_MPI_ISP_GetExposureAttr(IspDev, &stExposureAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetExposureAttr failed\n"); + return HI_FAILURE; + } + + stExposureAttr.stAuto.enAEStrategyMode = AE_EXP_HIGHLIGHT_PRIOR; + stExposureAttr.stAuto.u8Compensation = pstAdptAEAttr->u8ExpCompensation; + stExposureAttr.stAuto.stAEDelayAttr.u16BlackDelayFrame = pstAdptAEAttr->u16BlackDelayFrame; + stExposureAttr.stAuto.stAEDelayAttr.u16WhiteDelayFrame = pstAdptAEAttr->u16WhiteDelayFrame; + switch (pstAdptAEAttr->u8AEStrategyMode) + { + case 0: + stExposureAttr.stAuto.enAEStrategyMode = AE_EXP_HIGHLIGHT_PRIOR; + break; + case 1: + stExposureAttr.stAuto.enAEStrategyMode = AE_EXP_LOWLIGHT_PRIOR; + break; + default: + stExposureAttr.stAuto.enAEStrategyMode = AE_EXP_HIGHLIGHT_PRIOR; + break; + } + stExposureAttr.stAuto.u8MaxHistOffset = pstAdptAEAttr->u8MaxHistOffset; + stExposureAttr.stAuto.u16HistRatioSlope = pstAdptAEAttr->u16HistRatioSlope; + stExposureAttr.stAuto.u8Speed = pstAdptAEAttr->u8Speed; + stExposureAttr.stAuto.u8Tolerance = pstAdptAEAttr->u8Tolerance; + stExposureAttr.stAuto.stSysGainRange.u32Max = pstAdptAEAttr->u32SysGainMax; + stExposureAttr.u8AERunInterval = pstAdptAEAttr->u8AERunInterval; + + for (i = 0; i < AE_ZONE_ROW; i++) + { + for (j = 0; j < AE_ZONE_COLUMN; j++) + { + stExposureAttr.stAuto.au8Weight[i][j] = pstAdptAEAttr->au8AeWeight[i][j]; + } + } + + s32Ret = HI_MPI_ISP_SetExposureAttr(IspDev, &stExposureAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetExposureAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetExposureInfo(HI_S32 s32IspDev, ADPT_SCENEAUTO_EXPOSUREINFO_S *pstAdptExposureInfo) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + HI_S32 i; + ISP_EXP_INFO_S stIspExpInfo; + + s32Ret = HI_MPI_ISP_QueryExposureInfo(IspDev, &stIspExpInfo); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_QueryExposureInfo failed\n"); + return HI_FAILURE; + } + pstAdptExposureInfo->u32AGain = stIspExpInfo.u32AGain; + pstAdptExposureInfo->u32DGain = stIspExpInfo.u32DGain; + pstAdptExposureInfo->u32ISPDGain = stIspExpInfo.u32ISPDGain; + pstAdptExposureInfo->u32ExpTime = stIspExpInfo.u32ExpTime; + pstAdptExposureInfo->u32Exposure = stIspExpInfo.u32Exposure; + pstAdptExposureInfo->u8AveLum = stIspExpInfo.u8AveLum; + pstAdptExposureInfo->u16RgbirGain = stIspExpInfo.u16RgbirGain; + + for (i = 0; i < 256; i++) + { + pstAdptExposureInfo->u32Hist256Value[i] = stIspExpInfo.u32AE_Hist256Value[i]; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetWDRAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_WDRATTR_S *pstAdptWDRAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_WDR_MODE_S stWDRMode; + + s32Ret = HI_MPI_ISP_GetWDRMode(IspDev, &stWDRMode); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetWDRMode failed\n"); + return HI_FAILURE; + } + pstAdptWDRAttr->u8WdrMode = stWDRMode.enWDRMode; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetQueryInnerStateInfo(HI_S32 s32IspDev, ADPT_SCENEAUTO_STATEINFO_S *pstAdptStatInfo) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_INNER_STATE_INFO_S stInnerStateInfo; + + s32Ret = HI_MPI_ISP_QueryInnerStateInfo(IspDev, &stInnerStateInfo); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetDRCAttr failed\n"); + return HI_FAILURE; + } + + pstAdptStatInfo->u32DRCStrengthActual = stInnerStateInfo.u32DRCStrengthActual; + pstAdptStatInfo->u32DefogStrengthActual = stInnerStateInfo.u32DefogStrengthActual; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetBitrate(HI_S32 s32VencChn, HI_U32 *pu32Bitrate) +{ + HI_S32 s32Ret = HI_SUCCESS; + VENC_CHN VencChn = s32VencChn; + VENC_CHN_ATTR_S stVencChnAttr; + + s32Ret = HI_MPI_VENC_GetChnAttr(VencChn, &stVencChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetChnAttr failed\n"); + return HI_FAILURE; + } + *pu32Bitrate = stVencChnAttr.stRcAttr.stAttrH264Cbr.u32BitRate; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetDefogAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_DEFOG_ATTR_S *pstAdptDefogAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_DEFOG_ATTR_S stDefogAttr; + + s32Ret = HI_MPI_ISP_GetDeFogAttr(IspDev, &stDefogAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetDeFogAttr failed\n"); + return HI_FAILURE; + } + + pstAdptDefogAttr->bEnable = stDefogAttr.bEnable; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetFPNAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_FPN_ATTR_S *pstAdptFpnAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ISP_DEV IspDev = s32IspDev; + ISP_FPN_ATTR_S stFpnAttr; + + s32Ret = HI_MPI_ISP_GetFPNAttr(IspDev, &stFpnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_GetFPNAttr failed\n"); + return HI_FAILURE; + } + + stFpnAttr.bEnable = pstAdptFpnAttr->bEnable; + + s32Ret = HI_MPI_ISP_SetFPNAttr(IspDev, &stFpnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetFPNAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGet3DNRAttr(HI_S32 s32VpssGrp, ADPT_SCENEAUTO_3DNR_ATTR_S * pstAdpt3dnrAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + VPSS_GRP VpssGrp = s32VpssGrp; + VPSS_NR_PARAM_U stVppnrbex; + + s32Ret = HI_MPI_VPSS_GetNRParam(VpssGrp, &stVppnrbex); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VPSS_GetNRParam failed\n"); + } + + pstAdpt3dnrAttr->s32YPKStr = stVppnrbex.stNRParam_V1.s32YPKStr; + + pstAdpt3dnrAttr->s32YSFStr = stVppnrbex.stNRParam_V1.s32YSFStr; + pstAdpt3dnrAttr->s32YTFStr = stVppnrbex.stNRParam_V1.s32YTFStr; + pstAdpt3dnrAttr->s32TFStrMax = stVppnrbex.stNRParam_V1.s32TFStrMax; + + pstAdpt3dnrAttr->s32YSFStrDlt = stVppnrbex.stNRParam_V1.s32YSFStrDlt; + pstAdpt3dnrAttr->s32YTFStrDlt = stVppnrbex.stNRParam_V1.s32YTFStrDlt; + pstAdpt3dnrAttr->s32YTFStrDl = stVppnrbex.stNRParam_V1.s32YTFStrDl; + + pstAdpt3dnrAttr->s32YSmthStr = stVppnrbex.stNRParam_V1.s32YSmthStr; + pstAdpt3dnrAttr->s32YSmthRat = stVppnrbex.stNRParam_V1.s32YSmthRat; + pstAdpt3dnrAttr->s32YSFBriRat = stVppnrbex.stNRParam_V1.s32YSFBriRat; + + pstAdpt3dnrAttr->s32CSFStr = stVppnrbex.stNRParam_V1.s32CSFStr; + pstAdpt3dnrAttr->s32CTFstr = stVppnrbex.stNRParam_V1.s32CTFstr; + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSet3DNRAttr(HI_S32 s32VpssGrp, ADPT_SCENEAUTO_3DNR_ATTR_S *pstAdpt3dnrAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + VPSS_GRP VpssGrp = s32VpssGrp; + VPSS_NR_PARAM_U stVppnrbex; + + s32Ret = HI_MPI_VPSS_GetNRParam(VpssGrp, &stVppnrbex); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VPSS_GetNRParam failed\n"); + } + + stVppnrbex.stNRParam_V1.s32YPKStr = pstAdpt3dnrAttr->s32YPKStr; + + stVppnrbex.stNRParam_V1.s32YSFStr = pstAdpt3dnrAttr->s32YSFStr; + stVppnrbex.stNRParam_V1.s32YTFStr = pstAdpt3dnrAttr->s32YTFStr; + stVppnrbex.stNRParam_V1.s32TFStrMax = pstAdpt3dnrAttr->s32TFStrMax; + + stVppnrbex.stNRParam_V1.s32YSFStrDlt = pstAdpt3dnrAttr->s32YSFStrDlt; + stVppnrbex.stNRParam_V1.s32YTFStrDlt = pstAdpt3dnrAttr->s32YTFStrDlt; + stVppnrbex.stNRParam_V1.s32YTFStrDl = pstAdpt3dnrAttr->s32YTFStrDl; + + stVppnrbex.stNRParam_V1.s32YSmthStr = pstAdpt3dnrAttr->s32YSmthStr; + stVppnrbex.stNRParam_V1.s32YSmthRat = pstAdpt3dnrAttr->s32YSmthRat; + stVppnrbex.stNRParam_V1.s32YSFBriRat = pstAdpt3dnrAttr->s32YSFBriRat; + + stVppnrbex.stNRParam_V1.s32CSFStr = pstAdpt3dnrAttr->s32CSFStr; + stVppnrbex.stNRParam_V1.s32CTFstr = pstAdpt3dnrAttr->s32CTFstr; + + s32Ret = HI_MPI_VPSS_SetNRParam(VpssGrp, &stVppnrbex); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VPSS_SetNRParam failed\n"); + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetVencAttr(HI_S32 s32VencChn, ADPT_SCENEAUTO_VENC_ATTR_S *pstAdptVencAttr) +{ + HI_S32 s32Ret = HI_SUCCESS; + VENC_CHN VencChn = s32VencChn; + VENC_CHN_ATTR_S stVencChnAttr; + + s32Ret = HI_MPI_VENC_GetChnAttr(VencChn, &stVencChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetChnAttr failed\n"); + return HI_FAILURE; + } + + switch (stVencChnAttr.stRcAttr.enRcMode) + { + case VENC_RC_MODE_H264FIXQP: + case VENC_RC_MODE_H264CBR: + pstAdptVencAttr->eRcMode = ADPT_SCENEAUTO_RCMODE_H264; + pstAdptVencAttr->u32BitRate = stVencChnAttr.stRcAttr.stAttrH264Cbr.u32BitRate; + break; + case VENC_RC_MODE_H265FIXQP: + case VENC_RC_MODE_H265CBR: + pstAdptVencAttr->eRcMode = ADPT_SCENEAUTO_RCMODE_H265; + pstAdptVencAttr->u32BitRate = stVencChnAttr.stRcAttr.stAttrH265Cbr.u32BitRate; + break; + case VENC_RC_MODE_H264VBR: + pstAdptVencAttr->eRcMode = ADPT_SCENEAUTO_RCMODE_H264; + pstAdptVencAttr->u32BitRate = stVencChnAttr.stRcAttr.stAttrH264Vbr.u32MaxBitRate; + break; + case VENC_RC_MODE_H265VBR: + pstAdptVencAttr->eRcMode = ADPT_SCENEAUTO_RCMODE_H265; + pstAdptVencAttr->u32BitRate = stVencChnAttr.stRcAttr.stAttrH265Vbr.u32MaxBitRate; + break; + default: + break; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetH265FaceCfg(HI_S32 s32VencChn, ADPT_SCENEAUTO_H265_FACE_CFG_S* pstAdptH265FaceCfg) +{ + HI_S32 s32Ret = HI_SUCCESS; + VENC_CHN VencChn = s32VencChn; + VENC_FACE_CFG_S stVencFaceCfg; + + s32Ret = HI_MPI_VENC_GetFaceCfg(VencChn, &stVencFaceCfg); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetChnAttr failed\n"); + return HI_FAILURE; + } + + { + pstAdptH265FaceCfg->u8NormIntra4RdCost_I = stVencFaceCfg.u8NormIntra4RdCost[0]; + pstAdptH265FaceCfg->u8NormIntra8RdCost_I = stVencFaceCfg.u8NormIntra8RdCost[0]; + pstAdptH265FaceCfg->u8NormIntra16RdCost_I = stVencFaceCfg.u8NormIntra16RdCost[0]; + pstAdptH265FaceCfg->u8NormIntra32RdCost_I = stVencFaceCfg.u8NormIntra32RdCost[0]; + pstAdptH265FaceCfg->u8SkinIntra4RdCost_I = stVencFaceCfg.u8SkinIntra4RdCost[0]; + pstAdptH265FaceCfg->u8SkinIntra8RdCost_I = stVencFaceCfg.u8SkinIntra8RdCost[0]; + pstAdptH265FaceCfg->u8SkinIntra16RdCost_I = stVencFaceCfg.u8SkinIntra16RdCost[0]; + pstAdptH265FaceCfg->u8SkinIntra32RdCost_I = stVencFaceCfg.u8SkinIntra32RdCost[0]; + pstAdptH265FaceCfg->u8HedgeIntra4RdCost_I = stVencFaceCfg.u8HedgeIntra4RdCost[0]; + pstAdptH265FaceCfg->u8HedgeIntra8RdCost_I = stVencFaceCfg.u8HedgeIntra8RdCost[0]; + pstAdptH265FaceCfg->u8HedgeIntra16RdCost_I = stVencFaceCfg.u8HedgeIntra16RdCost[0]; + pstAdptH265FaceCfg->u8HedgeIntra32RdCost_I = stVencFaceCfg.u8HedgeIntra32RdCost[0]; + + pstAdptH265FaceCfg->u8NormIntra4RdCost_P = stVencFaceCfg.u8NormIntra4RdCost[1]; + pstAdptH265FaceCfg->u8NormIntra8RdCost_P = stVencFaceCfg.u8NormIntra8RdCost[1]; + pstAdptH265FaceCfg->u8NormIntra16RdCost_P = stVencFaceCfg.u8NormIntra16RdCost[1]; + pstAdptH265FaceCfg->u8NormIntra32RdCost_P = stVencFaceCfg.u8NormIntra32RdCost[1]; + pstAdptH265FaceCfg->u8SkinIntra4RdCost_P = stVencFaceCfg.u8SkinIntra4RdCost[1]; + pstAdptH265FaceCfg->u8SkinIntra8RdCost_P = stVencFaceCfg.u8SkinIntra8RdCost[1]; + pstAdptH265FaceCfg->u8SkinIntra16RdCost_P = stVencFaceCfg.u8SkinIntra16RdCost[1]; + pstAdptH265FaceCfg->u8SkinIntra32RdCost_P = stVencFaceCfg.u8SkinIntra32RdCost[1]; + pstAdptH265FaceCfg->u8HedgeIntra4RdCost_P = stVencFaceCfg.u8HedgeIntra4RdCost[1]; + pstAdptH265FaceCfg->u8HedgeIntra8RdCost_P = stVencFaceCfg.u8HedgeIntra8RdCost[1]; + pstAdptH265FaceCfg->u8HedgeIntra16RdCost_P = stVencFaceCfg.u8HedgeIntra16RdCost[1]; + pstAdptH265FaceCfg->u8HedgeIntra32RdCost_P = stVencFaceCfg.u8HedgeIntra32RdCost[1]; + + pstAdptH265FaceCfg->u8NormFme8RdCost_P = stVencFaceCfg.u8NormFme8RdCost[1]; + pstAdptH265FaceCfg->u8NormFme16RdCost_P = stVencFaceCfg.u8NormFme16RdCost[1]; + pstAdptH265FaceCfg->u8NormFme32RdCost_P = stVencFaceCfg.u8NormFme32RdCost[1]; + pstAdptH265FaceCfg->u8NormFme64RdCost_P = stVencFaceCfg.u8NormFme64RdCost[1]; + pstAdptH265FaceCfg->u8SkinFme8RdCost_P = stVencFaceCfg.u8SkinFme8RdCost[1]; + pstAdptH265FaceCfg->u8SkinFme16RdCost_P = stVencFaceCfg.u8SkinFme16RdCost[1]; + pstAdptH265FaceCfg->u8SkinFme32RdCost_P = stVencFaceCfg.u8SkinFme32RdCost[1]; + pstAdptH265FaceCfg->u8SkinFme64RdCost_P = stVencFaceCfg.u8SkinFme64RdCost[1]; + pstAdptH265FaceCfg->u8HedgeFme8RdCost_P = stVencFaceCfg.u8HedgeFme8RdCost[1]; + pstAdptH265FaceCfg->u8HedgeFme16RdCost_P = stVencFaceCfg.u8HedgeFme16RdCost[1]; + pstAdptH265FaceCfg->u8HedgeFme32RdCost_P = stVencFaceCfg.u8HedgeFme32RdCost[1]; + pstAdptH265FaceCfg->u8HedgeFme64RdCost_P = stVencFaceCfg.u8HedgeFme64RdCost[1]; + + pstAdptH265FaceCfg->u8NormMerg8RdCost_P = stVencFaceCfg.u8NormMerg8RdCost[1]; + pstAdptH265FaceCfg->u8NormMerg16RdCost_P = stVencFaceCfg.u8NormMerg16RdCost[1]; + pstAdptH265FaceCfg->u8NormMerg32RdCost_P = stVencFaceCfg.u8NormMerg32RdCost[1]; + pstAdptH265FaceCfg->u8NormMerg64RdCost_P = stVencFaceCfg.u8NormMerg64RdCost[1]; + pstAdptH265FaceCfg->u8SkinMerg8RdCost_P = stVencFaceCfg.u8SkinMerg8RdCost[1]; + pstAdptH265FaceCfg->u8SkinMerg16RdCost_P = stVencFaceCfg.u8SkinMerg16RdCost[1]; + pstAdptH265FaceCfg->u8SkinMerg32RdCost_P = stVencFaceCfg.u8SkinMerg32RdCost[1]; + pstAdptH265FaceCfg->u8SkinMerg64RdCost_P = stVencFaceCfg.u8SkinMerg64RdCost[1]; + pstAdptH265FaceCfg->u8HedgeMerg8RdCost_P = stVencFaceCfg.u8HedgeMerg8RdCost[1]; + pstAdptH265FaceCfg->u8HedgeMerg16RdCost_P = stVencFaceCfg.u8HedgeMerg16RdCost[1]; + pstAdptH265FaceCfg->u8HedgeMerg32RdCost_P = stVencFaceCfg.u8HedgeMerg32RdCost[1]; + pstAdptH265FaceCfg->u8HedgeMerg64RdCost_P = stVencFaceCfg.u8HedgeMerg64RdCost[1]; + + pstAdptH265FaceCfg->bSkinEn_I = stVencFaceCfg.bSkinEn[0]; + pstAdptH265FaceCfg->u32SkinQpDelta_I = stVencFaceCfg.u32SkinQpDelta[0]; + pstAdptH265FaceCfg->u8SkinUMax_I = stVencFaceCfg.u8SkinUMax[0]; + pstAdptH265FaceCfg->u8SkinUMin_I = stVencFaceCfg.u8SkinUMin[0]; + pstAdptH265FaceCfg->u8SkinVMax_I = stVencFaceCfg.u8SkinVMax[0]; + pstAdptH265FaceCfg->u8SkinVMin_I = stVencFaceCfg.u8SkinVMin[0]; + pstAdptH265FaceCfg->u32SkinNum_I = stVencFaceCfg.u32SkinNum[0]; + + pstAdptH265FaceCfg->bSkinEn_P = stVencFaceCfg.bSkinEn[1];; + pstAdptH265FaceCfg->u32SkinQpDelta_P = stVencFaceCfg.u32SkinQpDelta[1]; + pstAdptH265FaceCfg->u8SkinUMax_P = stVencFaceCfg.u8SkinUMax[1]; + pstAdptH265FaceCfg->u8SkinUMin_P = stVencFaceCfg.u8SkinUMin[1]; + pstAdptH265FaceCfg->u8SkinVMax_P = stVencFaceCfg.u8SkinVMax[1]; + pstAdptH265FaceCfg->u8SkinVMin_P = stVencFaceCfg.u8SkinVMin[1]; + pstAdptH265FaceCfg->u32SkinNum_P = stVencFaceCfg.u32SkinNum[1]; + + pstAdptH265FaceCfg->u8HedgeThr_I = stVencFaceCfg.u8HedgeThr[0]; + pstAdptH265FaceCfg->u8HedgeCnt_I = stVencFaceCfg.u8HedgeCnt[0]; + pstAdptH265FaceCfg->bStroEdgeEn_I = stVencFaceCfg.bStroEdgeEn[0]; + pstAdptH265FaceCfg->u32StroEdgeQpDelta_I = stVencFaceCfg.u32StroEdgeQpDelta[0]; + + pstAdptH265FaceCfg->u8HedgeThr_P = stVencFaceCfg.u8HedgeThr[1]; + pstAdptH265FaceCfg->u8HedgeCnt_P = stVencFaceCfg.u8HedgeCnt[1]; + pstAdptH265FaceCfg->bStroEdgeEn_P = stVencFaceCfg.bStroEdgeEn[1]; + pstAdptH265FaceCfg->u32StroEdgeQpDelta_P = stVencFaceCfg.u32StroEdgeQpDelta[1]; + + pstAdptH265FaceCfg->bImproveEn_I = stVencFaceCfg.bImproveEn[0]; + + pstAdptH265FaceCfg->bImproveEn_P = stVencFaceCfg.bImproveEn[1]; + pstAdptH265FaceCfg->u32Norm32MaxNum_P = stVencFaceCfg.u32Norm32MaxNum[1]; + pstAdptH265FaceCfg->u32Norm16MaxNum_P = stVencFaceCfg.u32Norm16MaxNum[1]; + pstAdptH265FaceCfg->u32Norm32ProtectNum_P = stVencFaceCfg.u32Norm32ProtectNum[1]; + pstAdptH265FaceCfg->u32Norm16ProtectNum_P = stVencFaceCfg.u32Norm16ProtectNum[1]; + pstAdptH265FaceCfg->u32Skin32MaxNum_P = stVencFaceCfg.u32Skin32MaxNum[1]; + pstAdptH265FaceCfg->u32Skin16MaxNum_P = stVencFaceCfg.u32Skin16MaxNum[1]; + pstAdptH265FaceCfg->u32Skin32ProtectNum_P = stVencFaceCfg.u32Skin32ProtectNum[1]; + pstAdptH265FaceCfg->u32Skin16ProtectNum_P = stVencFaceCfg.u32Skin16ProtectNum[1]; + pstAdptH265FaceCfg->u32Still32MaxNum_P = stVencFaceCfg.u32Still32MaxNum[1]; + pstAdptH265FaceCfg->u32Still16MaxNum_P = stVencFaceCfg.u32Still16MaxNum[1]; + pstAdptH265FaceCfg->u32Still32ProtectNum_P = stVencFaceCfg.u32Still32ProtectNum[1]; + pstAdptH265FaceCfg->u32Still16ProtectNum_P = stVencFaceCfg.u32Still16ProtectNum[1]; + pstAdptH265FaceCfg->u32Hedge32MaxNum_P = stVencFaceCfg.u32Hedge32MaxNum[1]; + pstAdptH265FaceCfg->u32Hedge16MaxNum_P = stVencFaceCfg.u32Hedge16MaxNum[1]; + pstAdptH265FaceCfg->u32Hedge32ProtectNum_P = stVencFaceCfg.u32Hedge32ProtectNum[1]; + pstAdptH265FaceCfg->u32Hedge16ProtectNum_P = stVencFaceCfg.u32Hedge16ProtectNum[1]; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetH265FaceCfg(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H265_FACE_CFG_S* pstAdptH265FaceCfg) +{ + HI_S32 s32Ret = HI_SUCCESS; + VENC_CHN VencChn = s32VencChn; + VENC_FACE_CFG_S stVencFaceCfg; + + s32Ret = HI_MPI_VENC_GetFaceCfg(VencChn, &stVencFaceCfg); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetChnAttr failed\n"); + return HI_FAILURE; + } + + { + stVencFaceCfg.u8NormIntra4RdCost[0] = pstAdptH265FaceCfg->u8NormIntra4RdCost_I; + stVencFaceCfg.u8NormIntra8RdCost[0] = pstAdptH265FaceCfg->u8NormIntra8RdCost_I; + stVencFaceCfg.u8NormIntra16RdCost[0] = pstAdptH265FaceCfg->u8NormIntra16RdCost_I; + stVencFaceCfg.u8NormIntra32RdCost[0] = pstAdptH265FaceCfg->u8NormIntra32RdCost_I; + stVencFaceCfg.u8SkinIntra4RdCost[0] = pstAdptH265FaceCfg->u8SkinIntra4RdCost_I; + stVencFaceCfg.u8SkinIntra8RdCost[0] = pstAdptH265FaceCfg->u8SkinIntra8RdCost_I; + stVencFaceCfg.u8SkinIntra16RdCost[0] = pstAdptH265FaceCfg->u8SkinIntra16RdCost_I; + stVencFaceCfg.u8SkinIntra32RdCost[0] = pstAdptH265FaceCfg->u8SkinIntra32RdCost_I; + stVencFaceCfg.u8HedgeIntra4RdCost[0] = pstAdptH265FaceCfg->u8HedgeIntra4RdCost_I; + stVencFaceCfg.u8HedgeIntra8RdCost[0] = pstAdptH265FaceCfg->u8HedgeIntra8RdCost_I; + stVencFaceCfg.u8HedgeIntra16RdCost[0] = pstAdptH265FaceCfg->u8HedgeIntra16RdCost_I; + stVencFaceCfg.u8HedgeIntra32RdCost[0] = pstAdptH265FaceCfg->u8HedgeIntra32RdCost_I; + + stVencFaceCfg.u8NormIntra4RdCost[1] = pstAdptH265FaceCfg->u8NormIntra4RdCost_P; + stVencFaceCfg.u8NormIntra8RdCost[1] = pstAdptH265FaceCfg->u8NormIntra8RdCost_P; + stVencFaceCfg.u8NormIntra16RdCost[1] = pstAdptH265FaceCfg->u8NormIntra16RdCost_P; + stVencFaceCfg.u8NormIntra32RdCost[1] = pstAdptH265FaceCfg->u8NormIntra32RdCost_P; + stVencFaceCfg.u8SkinIntra4RdCost[1] = pstAdptH265FaceCfg->u8SkinIntra4RdCost_P; + stVencFaceCfg.u8SkinIntra8RdCost[1] = pstAdptH265FaceCfg->u8SkinIntra8RdCost_P; + stVencFaceCfg.u8SkinIntra16RdCost[1] = pstAdptH265FaceCfg->u8SkinIntra16RdCost_P; + stVencFaceCfg.u8SkinIntra32RdCost[1] = pstAdptH265FaceCfg->u8SkinIntra32RdCost_P; + stVencFaceCfg.u8HedgeIntra4RdCost[1] = pstAdptH265FaceCfg->u8HedgeIntra4RdCost_P; + stVencFaceCfg.u8HedgeIntra8RdCost[1] = pstAdptH265FaceCfg->u8HedgeIntra8RdCost_P; + stVencFaceCfg.u8HedgeIntra16RdCost[1] = pstAdptH265FaceCfg->u8HedgeIntra16RdCost_P; + stVencFaceCfg.u8HedgeIntra32RdCost[1] = pstAdptH265FaceCfg->u8HedgeIntra32RdCost_P; + + stVencFaceCfg.u8NormFme8RdCost[1] = pstAdptH265FaceCfg->u8NormFme8RdCost_P; + stVencFaceCfg.u8NormFme16RdCost[1] = pstAdptH265FaceCfg->u8NormFme16RdCost_P; + stVencFaceCfg.u8NormFme32RdCost[1] = pstAdptH265FaceCfg->u8NormFme32RdCost_P; + stVencFaceCfg.u8NormFme64RdCost[1] = pstAdptH265FaceCfg->u8NormFme64RdCost_P; + stVencFaceCfg.u8SkinFme8RdCost[1] = pstAdptH265FaceCfg->u8SkinFme8RdCost_P; + stVencFaceCfg.u8SkinFme16RdCost[1] = pstAdptH265FaceCfg->u8SkinFme16RdCost_P; + stVencFaceCfg.u8SkinFme32RdCost[1] = pstAdptH265FaceCfg->u8SkinFme32RdCost_P; + stVencFaceCfg.u8SkinFme64RdCost[1] = pstAdptH265FaceCfg->u8SkinFme64RdCost_P; + stVencFaceCfg.u8HedgeFme8RdCost[1] = pstAdptH265FaceCfg->u8HedgeFme8RdCost_P; + stVencFaceCfg.u8HedgeFme16RdCost[1] = pstAdptH265FaceCfg->u8HedgeFme16RdCost_P; + stVencFaceCfg.u8HedgeFme32RdCost[1] = pstAdptH265FaceCfg->u8HedgeFme32RdCost_P; + stVencFaceCfg.u8HedgeFme64RdCost[1] = pstAdptH265FaceCfg->u8HedgeFme64RdCost_P; + + stVencFaceCfg.u8NormMerg8RdCost[1] = pstAdptH265FaceCfg->u8NormMerg8RdCost_P; + stVencFaceCfg.u8NormMerg16RdCost[1] = pstAdptH265FaceCfg->u8NormMerg16RdCost_P; + stVencFaceCfg.u8NormMerg32RdCost[1] = pstAdptH265FaceCfg->u8NormMerg32RdCost_P; + stVencFaceCfg.u8NormMerg64RdCost[1] = pstAdptH265FaceCfg->u8NormMerg64RdCost_P; + stVencFaceCfg.u8SkinMerg8RdCost[1] = pstAdptH265FaceCfg->u8SkinMerg8RdCost_P; + stVencFaceCfg.u8SkinMerg16RdCost[1] = pstAdptH265FaceCfg->u8SkinMerg16RdCost_P; + stVencFaceCfg.u8SkinMerg32RdCost[1] = pstAdptH265FaceCfg->u8SkinMerg32RdCost_P; + stVencFaceCfg.u8SkinMerg64RdCost[1] = pstAdptH265FaceCfg->u8SkinMerg64RdCost_P; + stVencFaceCfg.u8HedgeMerg8RdCost[1] = pstAdptH265FaceCfg->u8HedgeMerg8RdCost_P; + stVencFaceCfg.u8HedgeMerg16RdCost[1] = pstAdptH265FaceCfg->u8HedgeMerg16RdCost_P; + stVencFaceCfg.u8HedgeMerg32RdCost[1] = pstAdptH265FaceCfg->u8HedgeMerg32RdCost_P; + stVencFaceCfg.u8HedgeMerg64RdCost[1] = pstAdptH265FaceCfg->u8HedgeMerg64RdCost_P; + + stVencFaceCfg.bSkinEn[0] = pstAdptH265FaceCfg->bSkinEn_I; + stVencFaceCfg.u32SkinQpDelta[0] = pstAdptH265FaceCfg->u32SkinQpDelta_I; + stVencFaceCfg.u8SkinUMax[0] = pstAdptH265FaceCfg->u8SkinUMax_I; + stVencFaceCfg.u8SkinUMin[0] = pstAdptH265FaceCfg->u8SkinUMin_I; + stVencFaceCfg.u8SkinVMax[0] = pstAdptH265FaceCfg->u8SkinVMax_I; + stVencFaceCfg.u8SkinVMin[0] = pstAdptH265FaceCfg->u8SkinVMin_I; + stVencFaceCfg.u32SkinNum[0] = pstAdptH265FaceCfg->u32SkinNum_I; + + stVencFaceCfg.bSkinEn[1] = pstAdptH265FaceCfg->bSkinEn_P; + stVencFaceCfg.u32SkinQpDelta[1] = pstAdptH265FaceCfg->u32SkinQpDelta_P; + stVencFaceCfg.u8SkinUMax[1] = pstAdptH265FaceCfg->u8SkinUMax_P; + stVencFaceCfg.u8SkinUMin[1] = pstAdptH265FaceCfg->u8SkinUMin_P; + stVencFaceCfg.u8SkinVMax[1] = pstAdptH265FaceCfg->u8SkinVMax_P; + stVencFaceCfg.u8SkinVMin[1] = pstAdptH265FaceCfg->u8SkinVMin_P; + stVencFaceCfg.u32SkinNum[1] = pstAdptH265FaceCfg->u32SkinNum_P; + + stVencFaceCfg.u8HedgeThr[0] = pstAdptH265FaceCfg->u8HedgeThr_I; + stVencFaceCfg.u8HedgeCnt[0] = pstAdptH265FaceCfg->u8HedgeCnt_I; + stVencFaceCfg.bStroEdgeEn[0] = pstAdptH265FaceCfg->bStroEdgeEn_I; + stVencFaceCfg.u32StroEdgeQpDelta[0] = pstAdptH265FaceCfg->u32StroEdgeQpDelta_I; + + stVencFaceCfg.u8HedgeThr[1] = pstAdptH265FaceCfg->u8HedgeThr_P; + stVencFaceCfg.u8HedgeCnt[1] = pstAdptH265FaceCfg->u8HedgeCnt_P; + stVencFaceCfg.bStroEdgeEn[1] = pstAdptH265FaceCfg->bStroEdgeEn_P; + stVencFaceCfg.u32StroEdgeQpDelta[1] = pstAdptH265FaceCfg->u32StroEdgeQpDelta_P; + + stVencFaceCfg.bImproveEn[0] = pstAdptH265FaceCfg->bImproveEn_I; + + stVencFaceCfg.bImproveEn[1] = pstAdptH265FaceCfg->bImproveEn_P; + stVencFaceCfg.u32Norm32MaxNum[1] = pstAdptH265FaceCfg->u32Norm32MaxNum_P; + stVencFaceCfg.u32Norm16MaxNum[1] = pstAdptH265FaceCfg->u32Norm16MaxNum_P; + stVencFaceCfg.u32Norm32ProtectNum[1] = pstAdptH265FaceCfg->u32Norm32ProtectNum_P; + stVencFaceCfg.u32Norm16ProtectNum[1] = pstAdptH265FaceCfg->u32Norm16ProtectNum_P; + stVencFaceCfg.u32Skin32MaxNum[1] = pstAdptH265FaceCfg->u32Skin32MaxNum_P; + stVencFaceCfg.u32Skin16MaxNum[1] = pstAdptH265FaceCfg->u32Skin16MaxNum_P; + stVencFaceCfg.u32Skin32ProtectNum[1] = pstAdptH265FaceCfg->u32Skin32ProtectNum_P; + stVencFaceCfg.u32Skin16ProtectNum[1] = pstAdptH265FaceCfg->u32Skin16ProtectNum_P; + stVencFaceCfg.u32Still32MaxNum[1] = pstAdptH265FaceCfg->u32Still32MaxNum_P; + stVencFaceCfg.u32Still16MaxNum[1] = pstAdptH265FaceCfg->u32Still16MaxNum_P; + stVencFaceCfg.u32Still32ProtectNum[1] = pstAdptH265FaceCfg->u32Still32ProtectNum_P; + stVencFaceCfg.u32Still16ProtectNum[1] = pstAdptH265FaceCfg->u32Still16ProtectNum_P; + stVencFaceCfg.u32Hedge32MaxNum[1] = pstAdptH265FaceCfg->u32Hedge32MaxNum_P; + stVencFaceCfg.u32Hedge16MaxNum[1] = pstAdptH265FaceCfg->u32Hedge16MaxNum_P; + stVencFaceCfg.u32Hedge32ProtectNum[1] = pstAdptH265FaceCfg->u32Hedge32ProtectNum_P; + stVencFaceCfg.u32Hedge16ProtectNum[1] = pstAdptH265FaceCfg->u32Hedge16ProtectNum_P; + } + + s32Ret = HI_MPI_VENC_SetFaceCfg(VencChn, &stVencFaceCfg); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetChnAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoGetH265RcParam(HI_S32 s32VencChn, ADPT_SCENEAUTO_H265_RCPARAM_S* pstAdptH265RCParam) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + VENC_CHN VencChn = s32VencChn; + VENC_RC_PARAM_S stRCParam; + VENC_CHN_ATTR_S stChnAttr; + s32Ret = HI_MPI_VENC_GetChnAttr(VencChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetChnAttr failed\n"); + return HI_FAILURE; + } + if (stChnAttr.stRcAttr.enRcMode != VENC_RC_MODE_H265CBR && stChnAttr.stRcAttr.enRcMode != VENC_RC_MODE_H265VBR) + { + return HI_SUCCESS; + } + + s32Ret = HI_MPI_VENC_GetRcParam(VencChn, &stRCParam); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetRcParam failed\n"); + return HI_FAILURE; + } + + pstAdptH265RCParam->u32QpDelta = stRCParam.u32RowQpDelta; + + for (i = 0; i < 12; i++) + { + pstAdptH265RCParam->u32ThrdI[i] = stRCParam.u32ThrdI[i]; + pstAdptH265RCParam->u32ThrdP[i] = stRCParam.u32ThrdP[i]; + } + switch (stChnAttr.stRcAttr.enRcMode) + { + case VENC_RC_MODE_H265CBR: + pstAdptH265RCParam->s32IPQPDelta = stRCParam.stParamH265Cbr.s32IPQPDelta; + break; + case VENC_RC_MODE_H265VBR: + pstAdptH265RCParam->s32IPQPDelta = stRCParam.stParamH265Vbr.s32IPQPDelta; + break; + default: + break; + } + + return HI_SUCCESS; +} + +HI_S32 CommSceneautoSetH265RcParam(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H265_RCPARAM_S *pstAdptH265RCParam) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + VENC_CHN VencChn = s32VencChn; + VENC_RC_PARAM_S stRCParam; + VENC_CHN_ATTR_S stChnAttr; + s32Ret = HI_MPI_VENC_GetChnAttr(VencChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetChnAttr failed\n"); + return HI_FAILURE; + } + if (stChnAttr.stRcAttr.enRcMode != VENC_RC_MODE_H265CBR && stChnAttr.stRcAttr.enRcMode != VENC_RC_MODE_H265VBR) + { + return HI_SUCCESS; + } + + s32Ret = HI_MPI_VENC_GetRcParam(VencChn, &stRCParam); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_GetRcParam failed\n"); + return HI_FAILURE; + } + + stRCParam.u32RowQpDelta = pstAdptH265RCParam->u32QpDelta; + switch (stChnAttr.stRcAttr.enRcMode) + { + case VENC_RC_MODE_H265CBR: + stRCParam.stParamH265Cbr.s32IPQPDelta = pstAdptH265RCParam->s32IPQPDelta; + break; + case VENC_RC_MODE_H265VBR: + stRCParam.stParamH265Vbr.s32IPQPDelta = pstAdptH265RCParam->s32IPQPDelta; + break; + default: + break; + } + for (i = 0; i < 12; i++) + { + stRCParam.u32ThrdI[i] = pstAdptH265RCParam->u32ThrdI[i]; + stRCParam.u32ThrdP[i] = pstAdptH265RCParam->u32ThrdP[i]; + } + + s32Ret = HI_MPI_VENC_SetRcParam(VencChn, &stRCParam); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VENC_SetRcParam failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ diff --git a/device/mpp/sample/scene_auto/src/common/hi_srdk_sceneauto.c b/device/mpp/sample/scene_auto/src/common/hi_srdk_sceneauto.c new file mode 100644 index 0000000..deebaaf --- /dev/null +++ b/device/mpp/sample/scene_auto/src/common/hi_srdk_sceneauto.c @@ -0,0 +1,6953 @@ +#include +#include +#include +#include +#include "hi_type.h" +//#include "hi_confaccess.h" +#include "iniparser.h" +#include "hi_sceneauto_comm.h" +#include "hi_sceneauto_comm_ext.h" +#include "hi_sceneauto_define.h" +#include "hi_srdk_sceneauto_define_ext.h" +#include "hi_srdk_sceneauto_ext.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define MAX_LEVEL 32 +#define DIV_0_TO_1(a) ( (0 == (a)) ? 1 : (a) ) + +static dictionary* g_Sceneautodictionary = NULL; +HI_BOOL g_bSceneautoInit = HI_FALSE; +HI_BOOL g_bSceneautoStart = HI_FALSE; +HI_BOOL g_bNormalThreadFlag = HI_FALSE; +HI_BOOL g_bSpecialThreadFlag = HI_FALSE; +SCENEAUTO_INIPARA_S g_stINIPara; +SCENEAUTO_PREVIOUSPARA_S g_stPreviousPara; +SRDK_SCENEAUTO_SEPCIAL_SCENE_E g_eSpecialScene; +ADPT_SCENEAUTO_VENC_RCMODE_E g_eVencRcMode; + + + + +pthread_mutex_t g_stSceneautoLock = PTHREAD_MUTEX_INITIALIZER; + +pthread_t g_pthSceneAutoNormal; +pthread_t g_pthSceneAutoSpecial; + +#define CHECK_SCENEAUTO_INIT()\ + do{\ + pthread_mutex_lock(&g_stSceneautoLock);\ + if (HI_FALSE == g_bSceneautoInit)\ + {\ + printf("func:%s,line:%d, please init sceneauto first!\n",__FUNCTION__,__LINE__);\ + pthread_mutex_unlock(&g_stSceneautoLock);\ + return HI_FAILURE;\ + }\ + pthread_mutex_unlock(&g_stSceneautoLock);\ + }while(0) + +#define CHECK_ISP_RUN(chn) \ + do{\ + pthread_mutex_lock(&g_stSceneautoLock);\ + if(HI_FALSE == g_bSceneautoStart)\ + {\ + printf("func:%s,line:%d, please make sceneauto run !\n",__FUNCTION__,__LINE__);\ + pthread_mutex_unlock(&g_stSceneautoLock);\ + return HI_FAILURE;\ + }\ + pthread_mutex_unlock(&g_stSceneautoLock);\ + }while(0) + +#define CHECK_NULL_PTR(ptr)\ + do{\ + if(NULL == ptr)\ + {\ + printf("func:%s,line:%d, NULL pointer\n",__FUNCTION__,__LINE__);\ + return HI_FAILURE;\ + }\ + }while(0) + +static __inline int iClip2(int x, int b) {{ if (x < 0) x = 0; };{ if (x > b) x = b; }; return x; } +static __inline int iMin2(int a, int b) {{ if (a > b) a = b; }; return a; } +static __inline int iMax2(int a, int b) {{ if (a > b) b = a; }; return b; } + +static int MAEWeight[128]; + +static int Weight(const char* b) +{ + const char* pszVRBegin = b; + const char* pszVREnd = pszVRBegin; + int u32Count = 0; + char temp[20]; + int mycount = 0; + int length = strlen(b); + unsigned int re; + memset(temp, 0, 20); + int i = 0; + HI_BOOL bx = HI_FALSE; + + while ((pszVREnd != NULL)) + { + if ((mycount > length) || (mycount == length)) + { + break; + } + while ((*pszVREnd != '|') && (*pszVREnd != '\0') && (*pszVREnd != ',')) + { + if (*pszVREnd == 'x') + { + bx = HI_TRUE; + } + pszVREnd++; + u32Count++; + mycount++; + } + memcpy(temp, pszVRBegin, u32Count); + + if (bx == HI_TRUE) + { + char* str; + re = (int)strtol(temp + 2, &str, 16); + MAEWeight[i] = re; + + } + else + { + MAEWeight[i] = atoi(temp); + } + memset(temp, 0, 20); + u32Count = 0; + pszVREnd++; + pszVRBegin = pszVREnd; + mycount++; + i++; + } + return i; +} +HI_S32 InterpolationCalculate(HI_S32 v, HI_S32 x0, HI_S32 y0, HI_S32 x1, HI_S32 y1) +{ + HI_S32 res; + + if ( v <= x0 ) return y0; + if ( v >= x1 ) return y1; + + res = (y1 - y0) * (v - x0) / (x1 - x0) + y0; + return res; +} + +HI_S32 DrcStrISO(HI_S16 s16Index) +{ + HI_S16 as16IndexTh[7] = {0}; + HI_S16 as16IndexSlope[6] = {0}; + HI_S16 s16Weight; + HI_S16 as16Weight[7] = {0}; + + as16IndexTh[0] = 32; + as16IndexTh[1] = 96; + as16IndexTh[2] = 128; + as16IndexTh[3] = 160; + as16IndexTh[4] = 192; + as16IndexTh[5] = 224; + as16IndexTh[6] = 256; + + as16Weight[0] = 1; + as16Weight[1] = 2; + as16Weight[2] = 4; + as16Weight[3] = 8; + as16Weight[4] = 16; + as16Weight[5] = 128; + as16Weight[6] = 256; + + + as16IndexSlope[0] = (as16Weight[1] - as16Weight[0]) * 256 + / DIV_0_TO_1(as16IndexTh[1] - as16IndexTh[0]); + as16IndexSlope[1] = (as16Weight[2] - as16Weight[1]) * 256 + / DIV_0_TO_1(as16IndexTh[2] - as16IndexTh[1]); + as16IndexSlope[2] = (as16Weight[3] - as16Weight[2]) * 256 + / DIV_0_TO_1(as16IndexTh[3] - as16IndexTh[2]); + as16IndexSlope[3] = (as16Weight[4] - as16Weight[3]) * 256 + / DIV_0_TO_1(as16IndexTh[4] - as16IndexTh[3]); + as16IndexSlope[4] = (as16Weight[5] - as16Weight[4]) * 256 + / DIV_0_TO_1(as16IndexTh[5] - as16IndexTh[4]); + as16IndexSlope[5] = (as16Weight[6] - as16Weight[5]) * 256 + / DIV_0_TO_1(as16IndexTh[6] - as16IndexTh[5]); + + if (s16Index < as16IndexTh[0]) + { + s16Weight = as16Weight[0]; + } + else if ((s16Index >= as16IndexTh[0]) && (s16Index < as16IndexTh[1])) + { + s16Weight = as16Weight[0] + ((as16IndexSlope[0] * (s16Index - as16IndexTh[0])) / 256); + } + else if ((s16Index >= as16IndexTh[1]) && (s16Index < as16IndexTh[2])) + { + s16Weight = as16Weight[1] + ((as16IndexSlope[1] * (s16Index - as16IndexTh[1])) / 256); + } + else if ((s16Index >= as16IndexTh[2]) && (s16Index < as16IndexTh[3])) + { + s16Weight = as16Weight[2] + ((as16IndexSlope[2] * (s16Index - as16IndexTh[2])) / 256); + } + else if ((s16Index >= as16IndexTh[3]) && (s16Index < as16IndexTh[4])) + { + s16Weight = as16Weight[3] + ((as16IndexSlope[3] * (s16Index - as16IndexTh[3])) / 256); + } + else if ((s16Index >= as16IndexTh[4]) && (s16Index < as16IndexTh[5])) + { + s16Weight = as16Weight[4] + ((as16IndexSlope[4] * (s16Index - as16IndexTh[4])) / 256); + } + else if ((s16Index >= as16IndexTh[5]) && (s16Index < as16IndexTh[6])) + { + s16Weight = as16Weight[5] + ((as16IndexSlope[5] * (s16Index - as16IndexTh[5])) / 256); + } + else + { + s16Weight = as16Weight[6]; + } + + s16Weight = iMax2(0, iMin2(s16Weight, 255)); + + + return s16Weight; +} + +static int MapISO(int iso) +{ + int j, i = (iso >= 200); + i += ( (iso >= (200 << 1)) + (iso >= (400 << 1)) + (iso >= (400 << 2)) + (iso >= (400 << 3)) + (iso >= (400 << 4)) ); + i += ( (iso >= (400 << 5)) + (iso >= (400 << 6)) + (iso >= (400 << 7)) + (iso >= (400 << 8)) + (iso >= (400 << 9)) ); + j = ( (iso > (112 << i)) + (iso > (125 << i)) + (iso > (141 << i)) + (iso > (158 << i)) + (iso > (178 << i)) ); + return (i * 6 + j + (iso >= 25) + (iso >= 50) + (iso >= 100)); +} + +HI_VOID Interpolate(SCENEAUTO_INIPARAM_3DNRCFG_S *pst3dnrcfg, HI_U32 u32Mid, + const SCENEAUTO_INIPARAM_3DNRCFG_S *pstL3dnrcfg, HI_U32 u32Left, + const SCENEAUTO_INIPARAM_3DNRCFG_S *pstR3dnrcfg, HI_U32 u32Right) +{ + int k, left, right, i = ((u32Mid > 3) ? MapISO(u32Mid) : iMin2(71,-u32Mid)); + left = ((u32Left > 3) ? MapISO(u32Left) : iMin2(71,-u32Left) ); if (i <= left) { *pst3dnrcfg = *pstL3dnrcfg; return; } + right = ((u32Right > 3) ? MapISO(u32Right): iMin2(71,-u32Right)); if (i >= right) { *pst3dnrcfg = *pstR3dnrcfg; return; } + k = (right - left); *pst3dnrcfg = *(( (i+((k * 3) >> 2)) < right ) ? pstL3dnrcfg : pstR3dnrcfg); + pst3dnrcfg->s32YPKStr = ( ((right - i) * pstL3dnrcfg->s32YPKStr + (i - left) * pstR3dnrcfg->s32YPKStr + (k >> 1)) / k ); + pst3dnrcfg->s32YSFStr = ( ((right - i) * pstL3dnrcfg->s32YSFStr + (i - left) * pstR3dnrcfg->s32YSFStr + (k >> 1)) / k ); + pst3dnrcfg->s32YTFStr = ( ((right - i) * pstL3dnrcfg->s32YTFStr + (i - left) * pstR3dnrcfg->s32YTFStr + (k >> 1)) / k ); + pst3dnrcfg->s32TFStrMax = ( ((right - i) * pstL3dnrcfg->s32TFStrMax + (i - left) * pstR3dnrcfg->s32TFStrMax + (k >> 1)) / k ); + pst3dnrcfg->s32YSmthStr = ( ((right - i) * pstL3dnrcfg->s32YSmthStr + (i - left) * pstR3dnrcfg->s32YSmthStr + (k >> 1)) / k ); + pst3dnrcfg->s32YSmthRat = ( ((right - i) * pstL3dnrcfg->s32YSmthRat + (i - left) * pstR3dnrcfg->s32YSmthRat + (k >> 1)) / k ); + pst3dnrcfg->s32YSFStrDlt = ( ((right - i) * pstL3dnrcfg->s32YSFStrDlt + (i - left) * pstR3dnrcfg->s32YSFStrDlt + (k >> 1)) / k ); + pst3dnrcfg->s32YTFStrDlt = ( ((right - i) * pstL3dnrcfg->s32YTFStrDlt + (i - left) * pstR3dnrcfg->s32YTFStrDlt + (k >> 1)) / k ); + pst3dnrcfg->s32YTFStrDl = ( ((right - i) * pstL3dnrcfg->s32YTFStrDl + (i - left) * pstR3dnrcfg->s32YTFStrDl + (k >> 1)) / k ); + pst3dnrcfg->s32CTFstr = ( ((right - i) * pstL3dnrcfg->s32CTFstr + (i - left) * pstR3dnrcfg->s32CTFstr + (k >> 1)) / k ); + pst3dnrcfg->s32CSFStr = ( ((right - i) * pstL3dnrcfg->s32CSFStr + (i - left) * pstR3dnrcfg->s32CSFStr + (k >> 1)) / k ); + pst3dnrcfg->s32CTFstr = ( ((right - i) * pstL3dnrcfg->s32CTFstr + (i - left) * pstR3dnrcfg->s32CTFstr + (k >> 1)) / k ); +} + +HI_S32 SceneAuto_SetDRC() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 s32IspDev; + ADPT_SCENEAUTO_DRCATTR_S stAdptDRCAttr; + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + s32Ret = CommSceneautoGetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDRCAttr failed\n"); + return HI_FAILURE; + } + stAdptDRCAttr.bEnable = g_stINIPara.stDRC.bDRCEnable; + stAdptDRCAttr.bManulEnable = g_stINIPara.stDRC.bDRCManulEnable; + stAdptDRCAttr.u8Strength = g_stINIPara.stDRC.u8Strength; + stAdptDRCAttr.u16BrightGainLmt = g_stINIPara.stDRC.u16BrightGainLmt; + stAdptDRCAttr.u16DarkGainLmtC = g_stINIPara.stDRC.u16DarkGainLmtC; + stAdptDRCAttr.u16DarkGainLmtY = g_stINIPara.stDRC.u16DarkGainLmtY; + stAdptDRCAttr.u8Asymmetry = g_stINIPara.stDRC.u8Asymmetry; + stAdptDRCAttr.u8LocalMixingBrigtht = g_stINIPara.stDRC.u8LocalMixingBrigtht; + stAdptDRCAttr.u8LocalMixingDark = g_stINIPara.stDRC.u8LocalMixingDark; + stAdptDRCAttr.u8LocalMixingThres = g_stINIPara.stDRC.u8LocalMixingThres; + stAdptDRCAttr.u8RangeVar = g_stINIPara.stDRC.u8RangeVar; + stAdptDRCAttr.u8SecondPole = g_stINIPara.stDRC.u8SecondPole; + stAdptDRCAttr.u8SpatialVar = g_stINIPara.stDRC.u8SpatialVar; + stAdptDRCAttr.u8Stretch = g_stINIPara.stDRC.u8Stretch; + s32Ret = CommSceneautoSetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDRCAttr failed\n"); + return HI_FAILURE; + } + return HI_SUCCESS; +} + +HI_S32 SceneAuto_SetDynamic() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + HI_S32 s32IspDev; + ADPT_SCENEAUTO_AEROUTE_S stAdptAERoute; + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + + stAdptAERoute.u32TotalNum = g_stINIPara.stFastDynamic.s32TotalNum; + for (i = 0; i < g_stINIPara.stFastDynamic.s32TotalNum; i++) + { + stAdptAERoute.astRouteNode[i].u32IntTime = g_stINIPara.stFastDynamic.pstRouteNode[i].u32IntTime; + stAdptAERoute.astRouteNode[i].u32SysGain = g_stINIPara.stFastDynamic.pstRouteNode[i].u32SysGain; + } + + s32Ret = CommSceneautoSetAERoute(s32IspDev, &stAdptAERoute); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAERoute failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SceneAuto_SetHLC() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + HI_S32 s32IspDev; + HI_S32 s32ViDev; + ADPT_SCENEAUTO_AEATTR_S stAdptAEAttr; + ADPT_SCENEAUTO_DCIPARAM_S stAdptDCIParam; + ADPT_SCENEAUTO_DRCATTR_S stAdptDRCAttr; + ADPT_SCENEAUTO_SATURATION_S stAdptSaturation; + ADPT_SCENEAUTO_GAMMA_S stAdptGamma; + ADPT_SCENEAUTO_SHARPEN_S stAdptSharpen; + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + s32ViDev = g_stINIPara.stMpInfo.s32ViDev; + + //AE + s32Ret = CommSceneautoGetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAEAttr failed\n"); + return HI_FAILURE; + } + stAdptAEAttr.u8ExpCompensation = g_stINIPara.stHLC.u8ExpCompensation; + stAdptAEAttr.u16BlackDelayFrame = g_stINIPara.stHLC.u16BlackDelayFrame; + stAdptAEAttr.u16WhiteDelayFrame = g_stINIPara.stHLC.u16WhiteDelayFrame; + stAdptAEAttr.u8Speed = g_stINIPara.stHLC.u8Speed; + stAdptAEAttr.u8Tolerance = g_stINIPara.stHLC.u8Tolerance; + stAdptAEAttr.u16HistRatioSlope = g_stINIPara.stHLC.u16HistRatioSlope; + stAdptAEAttr.u8MaxHistOffset = g_stINIPara.stHLC.u8MaxHistOffset; + s32Ret = CommSceneautoSetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAEAttr failed\n"); + return HI_FAILURE; + } + + //DCI + s32Ret = CommSceneautoGetDCIParam(s32ViDev, &stAdptDCIParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDCIParam failed\n"); + return HI_FAILURE; + } + stAdptDCIParam.bEnable = g_stINIPara.stHLC.bDCIEnable; + stAdptDCIParam.u32BlackGain = g_stINIPara.stHLC.u32DCIBlackGain; + stAdptDCIParam.u32ContrastGain = g_stINIPara.stHLC.u32DCIContrastGain; + stAdptDCIParam.u32LightGain = g_stINIPara.stHLC.u32DCILightGain; + s32Ret = CommSceneautoSetDCIParam(s32ViDev, &stAdptDCIParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDCIParam failed\n"); + return HI_FAILURE; + } + + //DRC + s32Ret = CommSceneautoGetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDRCAttr failed\n"); + return HI_FAILURE; + } + stAdptDRCAttr.bEnable = g_stINIPara.stHLC.bDRCEnable; + stAdptDRCAttr.bManulEnable = g_stINIPara.stHLC.bDRCManulEnable; + stAdptDRCAttr.u8Strength = g_stINIPara.stHLC.u32DRCStrengthTarget; + s32Ret = CommSceneautoSetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDRCAttr failed\n"); + return HI_FAILURE; + } + + //SATURATION + s32Ret = CommSceneautoGetSaturation(s32IspDev, &stAdptSaturation); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetSaturation failed\n"); + return HI_FAILURE; + } + stAdptSaturation.u8OpType = 0; + for (i = 0; i < 16; i++) + { + stAdptSaturation.au8AutoSat[i] = g_stINIPara.stHLC.u8Saturation[i]; + } + s32Ret = CommSceneautoSetSaturation(s32IspDev, &stAdptSaturation); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetSaturation failed\n"); + return HI_FAILURE; + } + + //GAMMA + for (i = 0; i < 257; i++) + { + stAdptGamma.au16GammaTable[i] = g_stINIPara.stHLC.u16GammaTable[i]; + } + stAdptGamma.u8CurveType = 2; + s32Ret = CommSceneautoSetGamma(s32IspDev, &stAdptGamma); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetGamma failed\n"); + return HI_FAILURE; + } + + //sharpen + s32Ret = CommSceneautoGetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetSharpen failed\n"); + return HI_FAILURE; + } + for (i = 0; i < 16; i++) + { + stAdptSharpen.abEnLowLumaShoot[i] = g_stINIPara.stHLC.abEnLowLumaShoot[i]; + stAdptSharpen.u8SharpenD[i] = g_stINIPara.stHLC.u8SharpenD[i]; + stAdptSharpen.u8SharpenUd[i] = g_stINIPara.stHLC.u8SharpenUd[i]; + stAdptSharpen.u8OverShoot[i] = g_stINIPara.stHLC.u8OverShoot[i]; + stAdptSharpen.u8UnderShoot[i] = g_stINIPara.stHLC.u8UnderShoot[i]; + stAdptSharpen.u8TextureNoiseThd[i] = g_stINIPara.stHLC.u8TextureNoiseThd[i]; + stAdptSharpen.u8EdgeNoiseThd[i] = g_stINIPara.stHLC.u8EdgeNoiseThd[i]; + } + s32Ret = CommSceneautoSetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetSharpen failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SceneAuto_SetIR() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i,j; + HI_S32 s32IspDev; + HI_S32 s32ViDev; + ADPT_SCENEAUTO_AEATTR_S stAdptAEAttr; + ADPT_SCENEAUTO_DCIPARAM_S stAdptDCIParam; + ADPT_SCENEAUTO_SATURATION_S stSaturation; + ADPT_SCENEAUTO_RGBIRPARAM_S stRgbirParam; + //ADPT_SCENEAUTO_DEMOSAIC_S stAdptDemosaic; + ADPT_SCENEAUTO_SHARPEN_S stAdptSharpen; + ADPT_SCENEAUTO_GAMMA_S stAdptGamma; + ADPT_SCENEAUTO_DP_S stAdptDP; + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + s32ViDev = g_stINIPara.stMpInfo.s32ViDev; + + + s32Ret = CommSceneautoGetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAEAttr failed\n"); + return HI_FAILURE; + } + //stAdptAEAttr.u8ExpCompensation = g_stINIPara.stIR.u8ExpCompensation; + stAdptAEAttr.u16HistRatioSlope = g_stINIPara.stIR.u16HistRatioSlope; + stAdptAEAttr.u16BlackDelayFrame = g_stINIPara.stIR.u16BlackDelayFrame; + stAdptAEAttr.u16WhiteDelayFrame = g_stINIPara.stIR.u16WhiteDelayFrame; + stAdptAEAttr.u8Speed = g_stINIPara.stIR.u8Speed; + //stAdptAEAttr.u8MaxHistOffset = g_stINIPara.stIR.u8MaxHistOffset; + stAdptAEAttr.u8Tolerance = g_stINIPara.stIR.u8Tolerance; + + for (i = 0; i < AE_WEIGHT_ROW; i++) + { + for (j = 0; j < AE_WEIGHT_COLUMN; j++) + { + stAdptAEAttr.au8AeWeight[i][j] = g_stINIPara.stIR.au8Weight[i][j]; + } + } + + s32Ret = CommSceneautoSetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAEAttr failed\n"); + return HI_FAILURE; + } + + //RGBIR + s32Ret = CommSceneautoGetRgbirParam(s32IspDev, &stRgbirParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetRgbirParam failed\n"); + return HI_FAILURE; + } + + if (stRgbirParam.bEnable) + { + stRgbirParam.bRemovelEn = 0; + s32Ret = CommSceneautoSetRgbirParam(s32IspDev, &stRgbirParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetRgbirParam failed\n"); + return HI_FAILURE; + } + } + + s32Ret = CommSceneautoGetDCIParam(s32ViDev, &stAdptDCIParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDCIParam failed\n"); + return HI_FAILURE; + } + stAdptDCIParam.bEnable = g_stINIPara.stIR.bDCIEnable; + stAdptDCIParam.u32BlackGain = g_stINIPara.stIR.u32DCIBlackGain; + stAdptDCIParam.u32ContrastGain = g_stINIPara.stIR.u32DCIContrastGain; + stAdptDCIParam.u32LightGain = g_stINIPara.stIR.u32DCILightGain; + s32Ret = CommSceneautoSetDCIParam(s32ViDev, &stAdptDCIParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDCIParam failed\n"); + return HI_FAILURE; + } + s32Ret = CommSceneautoGetDP(s32ViDev, &stAdptDP); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDP failed\n"); + return HI_FAILURE; + } + + for (i = 0; i < 16; i++) + { + stAdptDP.u16Slope[i] = g_stINIPara.stIR.u16Slope[i]; + } + + s32Ret = CommSceneautoSetDP(s32ViDev,&stAdptDP); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDP failed\n"); + return HI_FAILURE; + } + + s32Ret = CommSceneautoGetSaturation(s32IspDev, &stSaturation); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetSaturation failed\n"); + return HI_FAILURE; + } + stSaturation.u8OpType = 1; + stSaturation.u8ManualSat = 0; + s32Ret = CommSceneautoSetSaturation(s32IspDev, &stSaturation); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetSaturation failed\n"); + return HI_FAILURE; + } + #if 0 + s32Ret = CommSceneautoGetDemosaic(s32IspDev, &stAdptDemosaic); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDemosaic failed\n"); + return HI_FAILURE; + } + for (i = 0; i < 16; i++) + { + stAdptDemosaic.au8LumThresh[i] = g_stINIPara.stIR.au8LumThresh[i]; + } + s32Ret = CommSceneautoSetDemosaic(s32IspDev, &stAdptDemosaic); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDemosaic failed\n"); + return HI_FAILURE; + } + #endif + + s32Ret = CommSceneautoGetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetSharpen failed\n"); + return HI_FAILURE; + } + for (i = 0; i < 16; i++) + { + stAdptSharpen.abEnLowLumaShoot[i] = g_stINIPara.stIR.abEnLowLumaShoot[i]; + stAdptSharpen.u8SharpenD[i] = g_stINIPara.stIR.u8SharpenD[i]; + stAdptSharpen.u8SharpenUd[i] = g_stINIPara.stIR.u8SharpenUd[i]; + stAdptSharpen.u8OverShoot[i] = g_stINIPara.stIR.u8OverShoot[i]; + stAdptSharpen.u8UnderShoot[i] = g_stINIPara.stIR.u8UnderShoot[i]; + stAdptSharpen.u8TextureNoiseThd[i] = g_stINIPara.stIR.u8TextureNoiseThd[i]; + stAdptSharpen.u8EdgeNoiseThd[i] = g_stINIPara.stIR.u8EdgeNoiseThd[i]; + } + s32Ret = CommSceneautoSetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetSharpen failed\n"); + return HI_FAILURE; + } + + for (i = 0; i < 257; i++) + { + stAdptGamma.au16GammaTable[i] = g_stINIPara.stIR.u16GammaTable[i]; + } + stAdptGamma.u8CurveType = 2; + s32Ret = CommSceneautoSetGamma(s32IspDev, &stAdptGamma); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetGamma failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SceneAuto_SetBLC() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 s32IspDev; + ADPT_SCENEAUTO_AEATTR_S stAdptAEAttr; + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + + s32Ret = CommSceneautoGetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAEAttr failed\n"); + return HI_FAILURE; + } + + stAdptAEAttr.u8AEStrategyMode = g_stINIPara.stBLC.u8AEStrategyMode; + stAdptAEAttr.u16HistRatioSlope = g_stINIPara.stBLC.u16HistRatioSlope; + stAdptAEAttr.u8MaxHistOffset = g_stINIPara.stBLC.u8MaxHistOffset; + + s32Ret = CommSceneautoSetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAEAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SceneAuto_HLCAutoOn() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + HI_S32 s32IspDev; + ADPT_SCENEAUTO_DRCATTR_S stAdptDRCAttr; + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + + s32Ret = CommSceneautoGetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDRCAttr failed\n"); + return HI_FAILURE; + } + stAdptDRCAttr.bEnable = HI_FALSE; + stAdptDRCAttr.bManulEnable = HI_TRUE; + stAdptDRCAttr.u8Strength = 0; + s32Ret = CommSceneautoSetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDRCAttr failed\n"); + return HI_FAILURE; + } + + usleep(100000); + s32Ret = CommSceneautoGetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDRCAttr failed\n"); + return HI_FAILURE; + } + stAdptDRCAttr.bEnable = HI_TRUE; + stAdptDRCAttr.bManulEnable = HI_TRUE; + stAdptDRCAttr.u8Strength = 0; + s32Ret = CommSceneautoSetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDRCAttr failed\n"); + return HI_FAILURE; + } + + s32Ret = CommSceneautoGetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDRCAttr failed\n"); + return HI_FAILURE; + } + stAdptDRCAttr.bEnable = HI_TRUE; + stAdptDRCAttr.bManulEnable = HI_TRUE; + stAdptDRCAttr.u8Strength = 0; + s32Ret = CommSceneautoSetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDRCAttr failed\n"); + return HI_FAILURE; + } + + + for (i = 1; i < 128; i++) + { + s32Ret = CommSceneautoGetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDRCAttr failed\n"); + return HI_FAILURE; + } + stAdptDRCAttr.bEnable = HI_TRUE; + stAdptDRCAttr.bManulEnable = HI_TRUE; + stAdptDRCAttr.u8Strength = i; + s32Ret = CommSceneautoSetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDRCAttr failed\n"); + return HI_FAILURE; + } + usleep(5000); + } + + return HI_SUCCESS; +} + +HI_S32 SceneAuto_HLCAutoOff() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + HI_S32 s32IspDev; + ADPT_SCENEAUTO_DRCATTR_S stAdptDRCAttr; + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + + s32Ret = CommSceneautoGetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDRCAttr failed\n"); + return HI_FAILURE; + } + + for (i = stAdptDRCAttr.u8Strength; i >= 0; i--) + { + stAdptDRCAttr.u8Strength = i; + s32Ret = CommSceneautoSetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDRCAttr failed\n"); + return HI_FAILURE; + } + usleep(5000); + } + + stAdptDRCAttr.bEnable = HI_FALSE; + stAdptDRCAttr.bManulEnable = HI_FALSE; + stAdptDRCAttr.u8Strength = 0; + s32Ret = CommSceneautoSetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDRCAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} +#if 0 +HI_S32 SceneAuto_SetDemosaic(HI_S32 s32IspDev, HI_S32 s32DemosaicExpLevel, HI_S32 s32DemosaicBitrateLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + ADPT_SCENEAUTO_DEMOSAIC_S stAdptDemosaic; + + s32Ret = CommSceneautoGetDemosaic(s32IspDev, &stAdptDemosaic); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDemosaic failed\n"); + return HI_FAILURE; + } + + stAdptDemosaic.u8UuSlope = g_stINIPara.stIniDemosaic.pstDemosaic[s32DemosaicBitrateLevel * g_stINIPara.stIniDemosaic.s32ExpCount + s32DemosaicExpLevel].u8UuSlope; + stAdptDemosaic.u8VaSlope = g_stINIPara.stIniDemosaic.pstDemosaic[s32DemosaicBitrateLevel * g_stINIPara.stIniDemosaic.s32ExpCount + s32DemosaicExpLevel].u8VaSlope; + stAdptDemosaic.u8AaSlope = g_stINIPara.stIniDemosaic.pstDemosaic[s32DemosaicBitrateLevel * g_stINIPara.stIniDemosaic.s32ExpCount + s32DemosaicExpLevel].u8AaSlope; + stAdptDemosaic.u8VhSlope = g_stINIPara.stIniDemosaic.pstDemosaic[s32DemosaicBitrateLevel * g_stINIPara.stIniDemosaic.s32ExpCount + s32DemosaicExpLevel].u8VhSlope; + + s32Ret = CommSceneautoSetDemosaic(s32IspDev, &stAdptDemosaic); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDemosaic failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} +#endif + +HI_S32 SceneAuto_SetAERealtedBit(HI_S32 s32IspDev, HI_S32 s32AEBitrateLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + ADPT_SCENEAUTO_AEATTR_S stAdptAEAttr; + + if ((SRDK_SCENEAUTO_SPECIAL_SCENE_IR != g_eSpecialScene) && (SRDK_SCENEAUTO_SPECIAL_SCENE_BLC != g_eSpecialScene) && (SRDK_SCENEAUTO_SPECIAL_SCENE_HLC != g_eSpecialScene)) + { + s32Ret = CommSceneautoGetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAEAttr failed\n"); + return HI_FAILURE; + } + + stAdptAEAttr.u8Speed = g_stINIPara.stIniAE.pstAERelatedBit[s32AEBitrateLevel].u8Speed; + stAdptAEAttr.u8Tolerance = g_stINIPara.stIniAE.pstAERelatedBit[s32AEBitrateLevel].u8Tolerance; + stAdptAEAttr.u16BlackDelayFrame = g_stINIPara.stIniAE.pstAERelatedBit[s32AEBitrateLevel].u16BlackDelayFrame; + stAdptAEAttr.u16WhiteDelayFrame = g_stINIPara.stIniAE.pstAERelatedBit[s32AEBitrateLevel].u16WhiteDelayFrame; + stAdptAEAttr.u32SysGainMax = g_stINIPara.stIniAE.pstAERelatedBit[s32AEBitrateLevel].u32SysGainMax; + + s32Ret = CommSceneautoSetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAEAttr failed\n"); + return HI_FAILURE; + } + } + + return HI_SUCCESS; +} + +#if 0 +HI_S32 SceneAuto_SetSharpen(HI_S32 s32IspDev, HI_S32 s32SharpenBitrateLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ADPT_SCENEAUTO_SHARPEN_S stAdptSharpen; + + if ((SRDK_SCENEAUTO_SPECIAL_SCENE_IR != g_eSpecialScene)&&(SRDK_SCENEAUTO_SPECIAL_SCENE_HLC != g_eSpecialScene)) + { + s32Ret = CommSceneautoGetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetSharpen failed\n"); + return HI_FAILURE; + } + + for (i = 0; i < EXPOSURE_LEVEL; i++) + { + stAdptSharpen.au8SharpenD[i] = g_stINIPara.stIniSharpen.pstSharpen[s32SharpenBitrateLevel].au8SharpenD[i]; + stAdptSharpen.au8SharpenRGB[i] = g_stINIPara.stIniSharpen.pstSharpen[s32SharpenBitrateLevel].au8SharpenRGB[i]; + stAdptSharpen.au8SharpenUd[i] = g_stINIPara.stIniSharpen.pstSharpen[s32SharpenBitrateLevel].au8SharpenUd[i]; + } + + s32Ret = CommSceneautoSetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetSharpen failed\n"); + return HI_FAILURE; + } + } + + return HI_SUCCESS; +} +#endif +HI_S32 SceneAuto_SetH265FaceCfg(HI_S32 s32VencChn, HI_S32 s32H265FaceCfgExpLevel, HI_S32 s32H265FaceCfgBitrateLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + ADPT_SCENEAUTO_H265_FACE_CFG_S stAdptH265FaceCfg; + s32Ret = CommSceneautoGetH265FaceCfg(s32VencChn, &stAdptH265FaceCfg); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetH265FaceCfg failed\n"); + return HI_FAILURE; + } + stAdptH265FaceCfg.u8NormIntra4RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormIntra4RdCost_I; + stAdptH265FaceCfg.u8NormIntra8RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormIntra8RdCost_I; + stAdptH265FaceCfg.u8NormIntra16RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormIntra16RdCost_I; + stAdptH265FaceCfg.u8NormIntra32RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormIntra32RdCost_I; + stAdptH265FaceCfg.u8SkinIntra4RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinIntra4RdCost_I; + stAdptH265FaceCfg.u8SkinIntra8RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinIntra8RdCost_I; + stAdptH265FaceCfg.u8SkinIntra16RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinIntra16RdCost_I; + stAdptH265FaceCfg.u8SkinIntra32RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinIntra32RdCost_I; + stAdptH265FaceCfg.u8HedgeIntra4RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeIntra4RdCost_I; + stAdptH265FaceCfg.u8HedgeIntra8RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeIntra8RdCost_I; + stAdptH265FaceCfg.u8HedgeIntra16RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeIntra16RdCost_I; + stAdptH265FaceCfg.u8HedgeIntra32RdCost_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeIntra32RdCost_I; + stAdptH265FaceCfg.u8NormIntra4RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormIntra4RdCost_P; + stAdptH265FaceCfg.u8NormIntra8RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormIntra8RdCost_P; + stAdptH265FaceCfg.u8NormIntra16RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormIntra16RdCost_P; + stAdptH265FaceCfg.u8NormIntra32RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormIntra32RdCost_P; + stAdptH265FaceCfg.u8SkinIntra4RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinIntra4RdCost_P; + stAdptH265FaceCfg.u8SkinIntra8RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinIntra8RdCost_P; + stAdptH265FaceCfg.u8SkinIntra16RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinIntra16RdCost_P; + stAdptH265FaceCfg.u8SkinIntra32RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinIntra32RdCost_P; + stAdptH265FaceCfg.u8HedgeIntra4RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeIntra4RdCost_P; + stAdptH265FaceCfg.u8HedgeIntra8RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeIntra8RdCost_P; + stAdptH265FaceCfg.u8HedgeIntra16RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeIntra16RdCost_P; + stAdptH265FaceCfg.u8HedgeIntra32RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeIntra32RdCost_P; + stAdptH265FaceCfg.u8NormFme8RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormFme8RdCost_P; + stAdptH265FaceCfg.u8NormFme16RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormFme16RdCost_P; + stAdptH265FaceCfg.u8NormFme32RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormFme32RdCost_P; + stAdptH265FaceCfg.u8NormFme64RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormFme64RdCost_P; + stAdptH265FaceCfg.u8SkinFme8RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinFme8RdCost_P; + stAdptH265FaceCfg.u8SkinFme16RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinFme16RdCost_P; + stAdptH265FaceCfg.u8SkinFme32RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinFme32RdCost_P; + stAdptH265FaceCfg.u8SkinFme64RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinFme64RdCost_P; + stAdptH265FaceCfg.u8HedgeFme8RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeFme8RdCost_P; + stAdptH265FaceCfg.u8HedgeFme16RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeFme16RdCost_P; + stAdptH265FaceCfg.u8HedgeFme32RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeFme32RdCost_P; + stAdptH265FaceCfg.u8HedgeFme64RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeFme64RdCost_P; + stAdptH265FaceCfg.u8NormMerg8RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormMerg8RdCost_P; + stAdptH265FaceCfg.u8NormMerg16RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormMerg16RdCost_P; + stAdptH265FaceCfg.u8NormMerg32RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormMerg32RdCost_P; + stAdptH265FaceCfg.u8NormMerg64RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8NormMerg64RdCost_P; + stAdptH265FaceCfg.u8SkinMerg8RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinMerg8RdCost_P; + stAdptH265FaceCfg.u8SkinMerg16RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinMerg16RdCost_P; + stAdptH265FaceCfg.u8SkinMerg32RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinMerg32RdCost_P; + stAdptH265FaceCfg.u8SkinMerg64RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinMerg64RdCost_P; + stAdptH265FaceCfg.u8HedgeMerg8RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeMerg8RdCost_P; + stAdptH265FaceCfg.u8HedgeMerg16RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeMerg16RdCost_P; + stAdptH265FaceCfg.u8HedgeMerg32RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeMerg32RdCost_P; + stAdptH265FaceCfg.u8HedgeMerg64RdCost_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeMerg64RdCost_P; + stAdptH265FaceCfg.bSkinEn_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].bSkinEn_I; + stAdptH265FaceCfg.u32SkinQpDelta_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32SkinQpDelta_I; + stAdptH265FaceCfg.u8SkinUMax_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinUMax_I; + stAdptH265FaceCfg.u8SkinUMin_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinUMin_I; + stAdptH265FaceCfg.u8SkinVMax_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinVMax_I; + stAdptH265FaceCfg.u8SkinVMin_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinVMin_I; + stAdptH265FaceCfg.u32SkinNum_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32SkinNum_I; + stAdptH265FaceCfg.bSkinEn_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].bSkinEn_P; + stAdptH265FaceCfg.u32SkinQpDelta_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32SkinQpDelta_P; + stAdptH265FaceCfg.u8SkinUMax_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinUMax_P; + stAdptH265FaceCfg.u8SkinUMin_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinUMin_P; + stAdptH265FaceCfg.u8SkinVMax_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinVMax_P; + stAdptH265FaceCfg.u8SkinVMin_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8SkinVMin_P; + stAdptH265FaceCfg.u32SkinNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32SkinNum_P; + stAdptH265FaceCfg.u8HedgeThr_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeThr_I; + stAdptH265FaceCfg.u8HedgeCnt_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeCnt_I; + stAdptH265FaceCfg.bStroEdgeEn_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].bStroEdgeEn_I; + stAdptH265FaceCfg.u32StroEdgeQpDelta_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32StroEdgeQpDelta_I; + stAdptH265FaceCfg.u8HedgeThr_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeThr_P; + stAdptH265FaceCfg.u8HedgeCnt_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u8HedgeCnt_P; + stAdptH265FaceCfg.bStroEdgeEn_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].bStroEdgeEn_P; + stAdptH265FaceCfg.u32StroEdgeQpDelta_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32StroEdgeQpDelta_P; + stAdptH265FaceCfg.bImproveEn_I = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].bImproveEn_I; + stAdptH265FaceCfg.bImproveEn_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].bImproveEn_P; + stAdptH265FaceCfg.u32Norm32MaxNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Norm32MaxNum_P; + stAdptH265FaceCfg.u32Norm16MaxNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Norm16MaxNum_P; + stAdptH265FaceCfg.u32Norm32ProtectNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Norm32ProtectNum_P; + stAdptH265FaceCfg.u32Norm16ProtectNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Norm16ProtectNum_P; + stAdptH265FaceCfg.u32Skin32MaxNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Skin32MaxNum_P; + stAdptH265FaceCfg.u32Skin16MaxNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Skin16MaxNum_P; + stAdptH265FaceCfg.u32Skin32ProtectNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Skin32ProtectNum_P; + stAdptH265FaceCfg.u32Skin16ProtectNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Skin16ProtectNum_P; + stAdptH265FaceCfg.u32Still32MaxNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Still32MaxNum_P; + stAdptH265FaceCfg.u32Still16MaxNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Still16MaxNum_P; + stAdptH265FaceCfg.u32Still32ProtectNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Still32ProtectNum_P; + stAdptH265FaceCfg.u32Still16ProtectNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Still16ProtectNum_P; + stAdptH265FaceCfg.u32Hedge32MaxNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Hedge32MaxNum_P; + stAdptH265FaceCfg.u32Hedge16MaxNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Hedge16MaxNum_P; + stAdptH265FaceCfg.u32Hedge32ProtectNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Hedge32ProtectNum_P; + stAdptH265FaceCfg.u32Hedge16ProtectNum_P = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[s32H265FaceCfgBitrateLevel * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + s32H265FaceCfgExpLevel].u32Hedge16ProtectNum_P; + s32Ret = CommSceneautoSetH265FaceCfg(s32VencChn, &stAdptH265FaceCfg); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH265FaceCfg failed\n"); + return HI_FAILURE; + } + return HI_SUCCESS; +} +HI_S32 SceneAuto_SetH265RcParam(HI_S32 s32VencChn, HI_S32 s32VencBitrateLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ADPT_SCENEAUTO_H265_RCPARAM_S stAdptH265RCParam; + s32Ret = CommSceneautoGetH265RcParam(s32VencChn, &stAdptH265RCParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetH265RcParam failed\n"); + return HI_FAILURE; + } + stAdptH265RCParam.u32QpDelta = g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam[s32VencBitrateLevel].u32DeltaQP; + stAdptH265RCParam.s32IPQPDelta = g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam[s32VencBitrateLevel].s32IPQPDelta; + for (i = 0; i < 12; i++) + { + stAdptH265RCParam.u32ThrdI[i] = g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam[s32VencBitrateLevel].u32ThrdI[i]; + stAdptH265RCParam.u32ThrdP[i] = g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam[s32VencBitrateLevel].u32ThrdP[i]; + } + s32Ret = CommSceneautoSetH265RcParam(s32VencChn, &stAdptH265RCParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH265RcParam failed\n"); + return HI_FAILURE; + } + return HI_SUCCESS; +} +HI_S32 SceneAuto_SetH264RcParam(HI_S32 s32VencChn, HI_S32 s32VencBitrateLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ADPT_SCENEAUTO_H264_RCPARAM_S stAdptH264RCParam; + + s32Ret = CommSceneautoGetH264RcParam(s32VencChn, &stAdptH264RCParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetH264RcParam failed\n"); + return HI_FAILURE; + } + + stAdptH264RCParam.u32QpDelta = g_stINIPara.stIniH264Venc.pstH264Venc[s32VencBitrateLevel].u32DeltaQP; + for (i = 0; i < 12; i++) + { + stAdptH264RCParam.u32ThrdI[i] = g_stINIPara.stIniH264Venc.pstH264Venc[s32VencBitrateLevel].u32ThrdI[i]; + stAdptH264RCParam.u32ThrdP[i] = g_stINIPara.stIniH264Venc.pstH264Venc[s32VencBitrateLevel].u32ThrdP[i]; + } + stAdptH264RCParam.s32IPQPDelta = g_stINIPara.stIniH264Venc.pstH264Venc[s32VencBitrateLevel].s32IPQPDelta; + + s32Ret = CommSceneautoSetH264RcParam(s32VencChn, &stAdptH264RCParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH264RcParam failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SceneAuto_SetH264Debolck(HI_S32 s32VencChn, HI_S32 s32VencBitrateLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + ADPT_SCENEAUTO_H264_DEBLOCK_S stAdptH264Deblock; + + s32Ret = CommSceneautoGetH24Deblock(s32VencChn, &stAdptH264Deblock); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH24Deblock failed\n"); + return HI_FAILURE; + } + + stAdptH264Deblock.disable_deblocking_filter_idc = g_stINIPara.stIniH264Venc.pstH264Venc[s32VencBitrateLevel].stH264Dblk.disable_deblocking_filter_idc; + stAdptH264Deblock.slice_alpha_c0_offset_div2 = g_stINIPara.stIniH264Venc.pstH264Venc[s32VencBitrateLevel].stH264Dblk.slice_alpha_c0_offset_div2; + stAdptH264Deblock.slice_beta_offset_div2 = g_stINIPara.stIniH264Venc.pstH264Venc[s32VencBitrateLevel].stH264Dblk.slice_beta_offset_div2; + s32Ret = CommSceneautoSetH24Deblock(s32VencChn, &stAdptH264Deblock); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH24Deblock failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SceneAuto_SetH264Trans(HI_S32 s32VencChn, HI_S32 s32VencBitrateLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + ADPT_SCENEAUTO_H264TRANS_S stAdptH264Trans; + + s32Ret = CommSceneautoGetH264Trans(s32VencChn, &stAdptH264Trans); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetH264Trans failed\n"); + return HI_FAILURE; + } + + stAdptH264Trans.chroma_qp_index_offset = g_stINIPara.stIniH264Venc.pstH264Venc[s32VencBitrateLevel].s32chroma_qp_index_offset; + s32Ret = CommSceneautoSetH264Trans(s32VencChn, &stAdptH264Trans); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH264Trans failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} +#if 0 +HI_S32 SceneAuto_SetDP(HI_S32 s32IspDev, HI_S32 s32DpExpLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + ADPT_SCENEAUTO_DP_S stAdptDp; + + if ((SRDK_SCENEAUTO_SPECIAL_SCENE_IR != g_eSpecialScene)) + { + s32Ret = CommSceneautoGetDP(s32IspDev, &stAdptDp); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDP failed\n"); + return HI_FAILURE; + } + + stAdptDp.u16Slope = g_stINIPara.stIniDP.pstDPAttr[s32DpExpLevel].u16Slope; + s32Ret = CommSceneautoSetDP(s32IspDev, &stAdptDp); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDP failed\n"); + return HI_FAILURE; + } + } + return HI_SUCCESS; +} +#endif + +#if 0 +HI_S32 SceneAuto_SetSharpen(HI_S32 s32IspDev, HI_S32 s32SharpenExpLevel) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ADPT_SCENEAUTO_SHARPEN_S stAdptSharpen; + if (SRDK_SCENEAUTO_SPECIAL_SCENE_IR != g_eSpecialScene) + { + s32Ret = CommSceneautoGetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetSharpen failed\n"); + return HI_FAILURE; + } + for(i=0; i g_stINIPara.stIniGamma.pstGamma[s32GammaExpLevel].u16Table[i]) + { + u32Temp = ((HI_U32)(g_stINIPara.stIniGamma.pstGamma[s32LastGammaExpLevel].u16Table[i] - g_stINIPara.stIniGamma.pstGamma[s32GammaExpLevel].u16Table[i])) << 8; + u32Temp = (u32Temp * (j + 1)) / g_stINIPara.stIniGamma.s32Interval; + u32Temp = u32Temp >> 8; + stAdptGamma.au16GammaTable[i] = g_stINIPara.stIniGamma.pstGamma[s32LastGammaExpLevel].u16Table[i] - (HI_U32)u32Temp; + } + else + { + u32Temp = ((HI_U32)(g_stINIPara.stIniGamma.pstGamma[s32GammaExpLevel].u16Table[i] - g_stINIPara.stIniGamma.pstGamma[s32LastGammaExpLevel].u16Table[i])) << 8; + u32Temp = (u32Temp * (j + 1)) / g_stINIPara.stIniGamma.s32Interval; + u32Temp = u32Temp >> 8; + stAdptGamma.au16GammaTable[i] = g_stINIPara.stIniGamma.pstGamma[s32LastGammaExpLevel].u16Table[i] + (HI_U32)u32Temp; + } + } + stAdptGamma.u8CurveType = g_stINIPara.stIniGamma.pstGamma[s32GammaExpLevel].u8CurveType; + + s32Ret = CommSceneautoSetGamma(s32IspDev, &stAdptGamma); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetGamma failed\n"); + return HI_FAILURE; + } + usleep(80000); + } + } + return HI_SUCCESS; +} + +HI_S32 SceneAuto_SetDefaultGamma() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + ADPT_SCENEAUTO_GAMMA_S stAdptGamma; + HI_S32 s32IspDev; + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + + for (i = 0; i < 257; i++) + { + stAdptGamma.au16GammaTable[i] = g_stINIPara.stIniGamma.pstGamma[0].u16Table[i]; + } + stAdptGamma.u8CurveType = 2; + + s32Ret = CommSceneautoSetGamma(s32IspDev, &stAdptGamma); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetGamma failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 Scenauto_SetIRAERealtedExp(HI_S32 s32IspDev, HI_S32 s32IRAECurPos) +{ + HI_S32 s32Ret = HI_SUCCESS; + ADPT_SCENEAUTO_AEATTR_S stAdptAEAttr; + + s32Ret = CommSceneautoGetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAEAttr failed\n"); + return HI_FAILURE; + } + + stAdptAEAttr.u8ExpCompensation = g_stINIPara.stIR.pu8ExpCompensation[s32IRAECurPos]; + stAdptAEAttr.u8MaxHistOffset = g_stINIPara.stIR.pu8MaxHistOffset[s32IRAECurPos]; + + s32Ret = CommSceneautoSetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAEAttr failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 Scenauto_SetAERealtedExp(HI_S32 s32IspDev, HI_S32 s32AECurPos) +{ + HI_S32 s32Ret = HI_SUCCESS; + ADPT_SCENEAUTO_AEATTR_S stAdptAEAttr; + + if ((SRDK_SCENEAUTO_SPECIAL_SCENE_IR != g_eSpecialScene) && (SRDK_SCENEAUTO_SPECIAL_SCENE_BLC != g_eSpecialScene) && (SRDK_SCENEAUTO_SPECIAL_SCENE_HLC != g_eSpecialScene)) + { + s32Ret = CommSceneautoGetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAEAttr failed\n"); + return HI_FAILURE; + } + + stAdptAEAttr.u8ExpCompensation = g_stINIPara.stIniAE.pstAERelatedExp[s32AECurPos].u8AECompesation; + stAdptAEAttr.u8MaxHistOffset = g_stINIPara.stIniAE.pstAERelatedExp[s32AECurPos].u8AEHistOffset;; + + s32Ret = CommSceneautoSetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAEAttr failed\n"); + return HI_FAILURE; + } + } + + return HI_SUCCESS; +} + +HI_S32 Sceneauto_Set3DNR(HI_U32 s32VpssGrp, SCENEAUTO_INIPARAM_3DNRCFG_S stSceneauto3dnr) +{ + HI_S32 s32Ret = HI_SUCCESS; + ADPT_SCENEAUTO_3DNR_ATTR_S stAdptSceneauto3dnr; + + stAdptSceneauto3dnr.s32YPKStr = stSceneauto3dnr.s32YPKStr; + stAdptSceneauto3dnr.s32YSFStr = stSceneauto3dnr.s32YSFStr; + stAdptSceneauto3dnr.s32YTFStr = stSceneauto3dnr.s32YTFStr; + stAdptSceneauto3dnr.s32TFStrMax = stSceneauto3dnr.s32TFStrMax; + stAdptSceneauto3dnr.s32YSmthStr = stSceneauto3dnr.s32YSmthStr; + stAdptSceneauto3dnr.s32YSmthRat = stSceneauto3dnr.s32YSmthRat; + stAdptSceneauto3dnr.s32YSFStrDlt = stSceneauto3dnr.s32YSFStrDlt; + stAdptSceneauto3dnr.s32YTFStrDlt = stSceneauto3dnr.s32YTFStrDlt; + stAdptSceneauto3dnr.s32YTFStrDl = stSceneauto3dnr.s32YTFStrDl; + stAdptSceneauto3dnr.s32YSFBriRat = stSceneauto3dnr.s32YSFBriRat; + stAdptSceneauto3dnr.s32CSFStr = stSceneauto3dnr.s32CSFStr; + stAdptSceneauto3dnr.s32CTFstr = stSceneauto3dnr.s32CTFstr; + + s32Ret = CommSceneautoSet3DNRAttr(s32VpssGrp, &stAdptSceneauto3dnr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSet3DNR failed\n"); + return HI_FAILURE; + } + return HI_SUCCESS; +} + +HI_S32 Sceneauto_IVEStop() +{ + HI_S32 s32Ret = HI_SUCCESS; + + s32Ret = CommSceneautoIVEStop(); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoIVEStop failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 Sceneauto_IVEStart() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 s32VpssGrp; + HI_S32 s32VpssChn; + + s32VpssGrp = g_stINIPara.stMpInfo.s32VpssGrp; + s32VpssChn = g_stINIPara.stMpInfo.s32VpssChn; + s32Ret = CommSceneautoIVEStart(s32VpssGrp, s32VpssChn); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoIVEStart failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SceneAuto_SetAERoute() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + HI_S32 s32IspDev; + ADPT_SCENEAUTO_AEROUTE_S stAdptAERoute; + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + + + stAdptAERoute.u32TotalNum = g_stINIPara.stNormalDynamic.s32TotalNum; + for (i = 0; i < g_stINIPara.stNormalDynamic.s32TotalNum; i++) + { + stAdptAERoute.astRouteNode[i].u32IntTime = g_stINIPara.stNormalDynamic.pstRouteNode[i].u32IntTime; + stAdptAERoute.astRouteNode[i].u32SysGain = g_stINIPara.stNormalDynamic.pstRouteNode[i].u32SysGain; + } + + s32Ret = CommSceneautoSetAERoute(s32IspDev, &stAdptAERoute); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAERoute failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +} + +HI_S32 SceneAuto_SetPreviousPara() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i, j; + HI_S32 s32IspDev; + HI_S32 s32ViDev; + HI_S32 s32VencChn; + //HI_S32 s32VpssGrp; + ADPT_SCENEAUTO_SHARPEN_S stAdptSharpen; + ADPT_SCENEAUTO_DP_S stAdptDP; + ADPT_SCENEAUTO_GAMMA_S stAdptGamma; + ADPT_SCENEAUTO_H264_DEBLOCK_S stAdptH264Deblock; + ADPT_SCENEAUTO_H264TRANS_S stAdptH264Trans; + ADPT_SCENEAUTO_H264_RCPARAM_S stAdptH264RcParam; + ADPT_SCENEAUTO_H265_RCPARAM_S stAdptH265RcParam; + ADPT_SCENEAUTO_H265_FACE_CFG_S stAdptH265FaceCfg; + ADPT_SCENEAUTO_AEROUTE_S stAdptAERoute; + ADPT_SCENEAUTO_DCIPARAM_S stAdptDCIPara; + ADPT_SCENEAUTO_DRCATTR_S stAdptDRCAttr; + ADPT_SCENEAUTO_SATURATION_S stAdptSaturation; + ADPT_SCENEAUTO_DIS_ATTR_S stAdptDISAttr; + ADPT_SCENEAUTO_AEATTR_S stAdptAEAttr; + ADPT_SCENEAUTO_VENC_ATTR_S stAdptVencAttr; + ADPT_SCENEAUTO_CCM_ATTR_S stAdptCcmAttr; + ADPT_SCENEAUTO_ACM_ATTR_S stAdptAcmAttr; + ADPT_SCENEAUTO_RGBIRPARAM_S stAdptRgbirParam; + //ADPT_SCENEAUTO_3DNR_ATTR_S stAdpt3dnrAttr; + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + s32ViDev = g_stINIPara.stMpInfo.s32ViDev; + s32VencChn = g_stINIPara.stMpInfo.s32VencChn; + //s32VpssGrp = g_stINIPara.stMpInfo.s32VpssGrp; + + //pthread_mutex_lock(&g_stPreviousParaLock); + + //sharpen + for (i = 0; i < 16; i++) + { + stAdptSharpen.abEnLowLumaShoot[i] = g_stPreviousPara.stSharpen.abEnLowLumaShoot[i]; + stAdptSharpen.u8SharpenD[i] = g_stPreviousPara.stSharpen.u8SharpenD[i]; + stAdptSharpen.u8SharpenUd[i] = g_stPreviousPara.stSharpen.u8SharpenUd[i]; + stAdptSharpen.u8OverShoot[i] = g_stPreviousPara.stSharpen.u8OverShoot[i]; + stAdptSharpen.u8UnderShoot[i] = g_stPreviousPara.stSharpen.u8UnderShoot[i]; + stAdptSharpen.u8TextureNoiseThd[i] = g_stPreviousPara.stSharpen.u8TextureNoiseThd[i]; + stAdptSharpen.u8EdgeNoiseThd[i] = g_stPreviousPara.stSharpen.u8EdgeNoiseThd[i]; + } + s32Ret = CommSceneautoSetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetSharpen failed\n"); + return HI_FAILURE; + } + + //DP + for (i = 0; i < 16; i++) + { + stAdptDP.u16Slope[i] = g_stPreviousPara.stDP.u16Slope[i]; + } + s32Ret = CommSceneautoSetDP(s32IspDev, &stAdptDP); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDP failed\n"); + return HI_FAILURE; + } + + //gamma + stAdptGamma.u8CurveType = g_stPreviousPara.stGamma.u8CurveType; + for (i = 0 ; i < 257; i++) + { + stAdptGamma.au16GammaTable[i] = g_stPreviousPara.stGamma.u16Table[i]; + } + s32Ret = CommSceneautoSetGamma(s32IspDev, &stAdptGamma); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetGamma failed\n"); + return HI_FAILURE; + } + + //ccm + stAdptCcmAttr.u16HighColorTemp = g_stPreviousPara.stCcm.u16HighColorTemp; + stAdptCcmAttr.u16MidColorTemp = g_stPreviousPara.stCcm.u16MidColorTemp; + stAdptCcmAttr.u16LowColorTemp = g_stPreviousPara.stCcm.u16LowColorTemp; + for (i = 0; i < 9; i++) + { + stAdptCcmAttr.au16HighCCM[i] = g_stPreviousPara.stCcm.au16HighCCM[i]; + stAdptCcmAttr.au16MidCCM[i] = g_stPreviousPara.stCcm.au16MidCCM[i]; + stAdptCcmAttr.au16LowCCM[i] = g_stPreviousPara.stCcm.au16LowCCM[i]; + } + s32Ret = CommSceneautoSetCcmAttr(s32IspDev, &stAdptCcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetCcmAttr failed\n"); + return HI_FAILURE; + } + + //acm + stAdptAcmAttr.bEnable = g_stPreviousPara.stAcm.bEnable; + stAdptAcmAttr.u32CbcrThr = g_stPreviousPara.stAcm.u32CbcrThr; + stAdptAcmAttr.u32GainHue = g_stPreviousPara.stAcm.u32GainHue; + stAdptAcmAttr.u32GainLuma = g_stPreviousPara.stAcm.u32GainLuma; + stAdptAcmAttr.u32GainSat = g_stPreviousPara.stAcm.u32GainSat; + s32Ret = CommSceneautoSetAcmAttr(s32IspDev, &stAdptAcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAcmAttr failed\n"); + return HI_FAILURE; + } + + //venc + switch (g_eVencRcMode) + { + case ADPT_SCENEAUTO_RCMODE_H264: + s32Ret = CommSceneautoGetVencAttr(s32VencChn, &stAdptVencAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetVencAttr failed\n"); + return HI_FAILURE; + } + if (ADPT_SCENEAUTO_RCMODE_H264 == stAdptVencAttr.eRcMode) + { + stAdptH264Deblock.disable_deblocking_filter_idc = g_stPreviousPara.stH264Venc.stH264Dblk.disable_deblocking_filter_idc; + stAdptH264Deblock.slice_alpha_c0_offset_div2 = g_stPreviousPara.stH264Venc.stH264Dblk.slice_alpha_c0_offset_div2; + stAdptH264Deblock.slice_beta_offset_div2 = g_stPreviousPara.stH264Venc.stH264Dblk.slice_beta_offset_div2; + s32Ret = CommSceneautoSetH24Deblock(s32VencChn, &stAdptH264Deblock); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH24Deblock failed\n"); + return HI_FAILURE; + } + + stAdptH264Trans.chroma_qp_index_offset = g_stPreviousPara.stH264Venc.s32chroma_qp_index_offset; + s32Ret = CommSceneautoSetH264Trans(s32VencChn, &stAdptH264Trans); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH264Trans failed\n"); + return HI_FAILURE; + } + + stAdptH264RcParam.s32IPQPDelta = g_stPreviousPara.stH264Venc.s32IPQPDelta; + stAdptH264RcParam.u32QpDelta = g_stPreviousPara.stH264Venc.u32DeltaQP; + for (i = 0; i < 12; i++) + { + stAdptH264RcParam.u32ThrdI[i] = g_stPreviousPara.stH264Venc.u32ThrdI[i]; + stAdptH264RcParam.u32ThrdP[i] = g_stPreviousPara.stH264Venc.u32ThrdP[i]; + } + s32Ret = CommSceneautoSetH264RcParam(s32VencChn, &stAdptH264RcParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH264RcParam failed\n"); + return HI_FAILURE; + } + } + break; + case ADPT_SCENEAUTO_RCMODE_H265: + s32Ret = CommSceneautoGetVencAttr(s32VencChn, &stAdptVencAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetVencAttr failed\n"); + return HI_FAILURE; + } + if (ADPT_SCENEAUTO_RCMODE_H265 == stAdptVencAttr.eRcMode) + { + stAdptH265RcParam.u32QpDelta = g_stPreviousPara.stH265Venc.stH265VencRcParam.u32DeltaQP; + stAdptH265RcParam.s32IPQPDelta = g_stPreviousPara.stH265Venc.stH265VencRcParam.s32IPQPDelta; + for (i = 0; i < 12; i++) + { + stAdptH265RcParam.u32ThrdI[i] = g_stPreviousPara.stH265Venc.stH265VencRcParam.u32ThrdI[i]; + stAdptH265RcParam.u32ThrdP[i] = g_stPreviousPara.stH265Venc.stH265VencRcParam.u32ThrdP[i]; + } + s32Ret = CommSceneautoSetH265RcParam(s32VencChn, &stAdptH265RcParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetH265RcParam failed\n"); + return HI_FAILURE; + } + { + stAdptH265FaceCfg.u8NormIntra4RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra4RdCost_I; + stAdptH265FaceCfg.u8NormIntra8RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra8RdCost_I; + stAdptH265FaceCfg.u8NormIntra16RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra16RdCost_I; + stAdptH265FaceCfg.u8NormIntra32RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra32RdCost_I; + stAdptH265FaceCfg.u8SkinIntra4RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra4RdCost_I; + stAdptH265FaceCfg.u8SkinIntra8RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra8RdCost_I; + stAdptH265FaceCfg.u8SkinIntra16RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra16RdCost_I; + stAdptH265FaceCfg.u8SkinIntra32RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra32RdCost_I; + stAdptH265FaceCfg.u8HedgeIntra4RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra4RdCost_I; + stAdptH265FaceCfg.u8HedgeIntra8RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra8RdCost_I; + stAdptH265FaceCfg.u8HedgeIntra16RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra16RdCost_I; + stAdptH265FaceCfg.u8HedgeIntra32RdCost_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra32RdCost_I; + stAdptH265FaceCfg.u8NormIntra4RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra4RdCost_P; + stAdptH265FaceCfg.u8NormIntra8RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra8RdCost_P; + stAdptH265FaceCfg.u8NormIntra16RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra16RdCost_P; + stAdptH265FaceCfg.u8NormIntra32RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra32RdCost_P; + stAdptH265FaceCfg.u8SkinIntra4RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra4RdCost_P; + stAdptH265FaceCfg.u8SkinIntra8RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra8RdCost_P; + stAdptH265FaceCfg.u8SkinIntra16RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra16RdCost_P; + stAdptH265FaceCfg.u8SkinIntra32RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra32RdCost_P; + stAdptH265FaceCfg.u8HedgeIntra4RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra4RdCost_P; + stAdptH265FaceCfg.u8HedgeIntra8RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra8RdCost_P; + stAdptH265FaceCfg.u8HedgeIntra16RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra16RdCost_P; + stAdptH265FaceCfg.u8HedgeIntra32RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra32RdCost_P; + stAdptH265FaceCfg.u8NormFme8RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormFme8RdCost_P; + stAdptH265FaceCfg.u8NormFme16RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormFme16RdCost_P; + stAdptH265FaceCfg.u8NormFme32RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormFme32RdCost_P; + stAdptH265FaceCfg.u8NormFme64RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormFme64RdCost_P; + stAdptH265FaceCfg.u8SkinFme8RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinFme8RdCost_P; + stAdptH265FaceCfg.u8SkinFme16RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinFme16RdCost_P; + stAdptH265FaceCfg.u8SkinFme32RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinFme32RdCost_P; + stAdptH265FaceCfg.u8SkinFme64RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinFme64RdCost_P; + stAdptH265FaceCfg.u8HedgeFme8RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeFme8RdCost_P; + stAdptH265FaceCfg.u8HedgeFme16RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeFme16RdCost_P; + stAdptH265FaceCfg.u8HedgeFme32RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeFme32RdCost_P; + stAdptH265FaceCfg.u8HedgeFme64RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeFme64RdCost_P; + stAdptH265FaceCfg.u8NormMerg8RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormMerg8RdCost_P; + stAdptH265FaceCfg.u8NormMerg16RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormMerg16RdCost_P; + stAdptH265FaceCfg.u8NormMerg32RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormMerg32RdCost_P; + stAdptH265FaceCfg.u8NormMerg64RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormMerg64RdCost_P; + stAdptH265FaceCfg.u8SkinMerg8RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinMerg8RdCost_P; + stAdptH265FaceCfg.u8SkinMerg16RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinMerg16RdCost_P; + stAdptH265FaceCfg.u8SkinMerg32RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinMerg32RdCost_P; + stAdptH265FaceCfg.u8SkinMerg64RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinMerg64RdCost_P; + stAdptH265FaceCfg.u8HedgeMerg8RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeMerg8RdCost_P; + stAdptH265FaceCfg.u8HedgeMerg16RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeMerg16RdCost_P; + stAdptH265FaceCfg.u8HedgeMerg32RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeMerg32RdCost_P; + stAdptH265FaceCfg.u8HedgeMerg64RdCost_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeMerg64RdCost_P; + stAdptH265FaceCfg.bSkinEn_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bSkinEn_I; + stAdptH265FaceCfg.u32SkinQpDelta_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32SkinQpDelta_I; + stAdptH265FaceCfg.u8SkinUMax_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinUMax_I; + stAdptH265FaceCfg.u8SkinUMin_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinUMin_I; + stAdptH265FaceCfg.u8SkinVMax_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinVMax_I; + stAdptH265FaceCfg.u8SkinVMin_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinVMin_I; + stAdptH265FaceCfg.u32SkinNum_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32SkinNum_I; + stAdptH265FaceCfg.bSkinEn_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bSkinEn_P; + stAdptH265FaceCfg.u32SkinQpDelta_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32SkinQpDelta_P; + stAdptH265FaceCfg.u8SkinUMax_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinUMax_P; + stAdptH265FaceCfg.u8SkinUMin_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinUMin_P; + stAdptH265FaceCfg.u8SkinVMax_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinVMax_P; + stAdptH265FaceCfg.u8SkinVMin_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinVMin_P; + stAdptH265FaceCfg.u32SkinNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32SkinNum_P; + stAdptH265FaceCfg.u8HedgeThr_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeThr_I; + stAdptH265FaceCfg.u8HedgeCnt_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeCnt_I; + stAdptH265FaceCfg.bStroEdgeEn_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bStroEdgeEn_I; + stAdptH265FaceCfg.u32StroEdgeQpDelta_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32StroEdgeQpDelta_I; + stAdptH265FaceCfg.u8HedgeThr_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeThr_P; + stAdptH265FaceCfg.u8HedgeCnt_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeCnt_P; + stAdptH265FaceCfg.bStroEdgeEn_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bStroEdgeEn_P; + stAdptH265FaceCfg.u32StroEdgeQpDelta_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32StroEdgeQpDelta_P; + stAdptH265FaceCfg.bImproveEn_I = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bImproveEn_I; + stAdptH265FaceCfg.bImproveEn_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bImproveEn_P; + stAdptH265FaceCfg.u32Norm32MaxNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Norm32MaxNum_P; + stAdptH265FaceCfg.u32Norm16MaxNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Norm16MaxNum_P; + stAdptH265FaceCfg.u32Norm32ProtectNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Norm32ProtectNum_P; + stAdptH265FaceCfg.u32Norm16ProtectNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Norm16ProtectNum_P; + stAdptH265FaceCfg.u32Skin32MaxNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Skin32MaxNum_P; + stAdptH265FaceCfg.u32Skin16MaxNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Skin16MaxNum_P; + stAdptH265FaceCfg.u32Skin32ProtectNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Skin32ProtectNum_P; + stAdptH265FaceCfg.u32Skin16ProtectNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Skin16ProtectNum_P; + stAdptH265FaceCfg.u32Still32MaxNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Still32MaxNum_P; + stAdptH265FaceCfg.u32Still16MaxNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Still16MaxNum_P; + stAdptH265FaceCfg.u32Still32ProtectNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Still32ProtectNum_P; + stAdptH265FaceCfg.u32Still16ProtectNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Still16ProtectNum_P; + stAdptH265FaceCfg.u32Hedge32MaxNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Hedge32MaxNum_P; + stAdptH265FaceCfg.u32Hedge16MaxNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Hedge16MaxNum_P; + stAdptH265FaceCfg.u32Hedge32ProtectNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Hedge32ProtectNum_P; + stAdptH265FaceCfg.u32Hedge16ProtectNum_P = g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Hedge16ProtectNum_P; + } + s32Ret = CommSceneautoSetH265FaceCfg(s32VencChn, &stAdptH265FaceCfg); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetH265FaceCfg failed\n"); + return HI_FAILURE; + } + } + break; + default: + break; + } + + //AERoute + stAdptAERoute.u32TotalNum = g_stPreviousPara.stAERoute.u32TotalNum; + for (i = 0; i < 8; i++) + { + stAdptAERoute.astRouteNode[i].u32IntTime = g_stPreviousPara.stAERoute.astRouteNode[i].u32IntTime; + stAdptAERoute.astRouteNode[i].u32SysGain = g_stPreviousPara.stAERoute.astRouteNode[i].u32SysGain; + } + s32Ret = CommSceneautoSetAERoute(s32IspDev, &stAdptAERoute); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAERoute failed\n"); + return HI_FAILURE; + } + + //DCI + stAdptDCIPara.bEnable = g_stPreviousPara.stDCIParam.bEnable; + stAdptDCIPara.u32BlackGain = g_stPreviousPara.stDCIParam.u32BlackGain; + stAdptDCIPara.u32ContrastGain = g_stPreviousPara.stDCIParam.u32ContrastGain; + stAdptDCIPara.u32LightGain = g_stPreviousPara.stDCIParam.u32LightGain; + s32Ret = CommSceneautoSetDCIParam(s32ViDev, &stAdptDCIPara); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDCIParam failed\n"); + return HI_FAILURE; + } + + //DRC + stAdptDRCAttr.bEnable= g_stPreviousPara.stDRCAttr.bEnable; + stAdptDRCAttr.bManulEnable = g_stPreviousPara.stDRCAttr.bManulEnable; + stAdptDRCAttr.u16BrightGainLmt = g_stPreviousPara.stDRCAttr.u16BrightGainLmt; + stAdptDRCAttr.u16DarkGainLmtC = g_stPreviousPara.stDRCAttr.u16DarkGainLmtC; + stAdptDRCAttr.u16DarkGainLmtY = g_stPreviousPara.stDRCAttr.u16DarkGainLmtY; + stAdptDRCAttr.u8Asymmetry = g_stPreviousPara.stDRCAttr.u8Asymmetry; + stAdptDRCAttr.u8LocalMixingBrigtht = g_stPreviousPara.stDRCAttr.u8LocalMixingBrigtht; + stAdptDRCAttr.u8LocalMixingDark = g_stPreviousPara.stDRCAttr.u8LocalMixingDark; + stAdptDRCAttr.u8LocalMixingThres = g_stPreviousPara.stDRCAttr.u8LocalMixingThres; + stAdptDRCAttr.u8RangeVar = g_stPreviousPara.stDRCAttr.u8RangeVar; + stAdptDRCAttr.u8SpatialVar = g_stPreviousPara.stDRCAttr.u8SpatialVar; + stAdptDRCAttr.u8SecondPole = g_stPreviousPara.stDRCAttr.u8SecondPole; + stAdptDRCAttr.u8Stretch = g_stPreviousPara.stDRCAttr.u8Stretch; + stAdptDRCAttr.u8Strength = g_stPreviousPara.stDRCAttr.u8Strength; + + s32Ret = CommSceneautoSetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDRCAttr failed\n"); + return HI_FAILURE; + } + + //Saturation + stAdptSaturation.u8OpType = g_stPreviousPara.stSaturation.u8OpType; + stAdptSaturation.u8ManualSat = g_stPreviousPara.stSaturation.u8ManualSat; + for (i = 0; i < 16; i++) + { + stAdptSaturation.au8AutoSat[i] = g_stPreviousPara.stSaturation.au8AutoSat[i]; + } + s32Ret = CommSceneautoSetSaturation(s32IspDev, &stAdptSaturation); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDRCAttr failed\n"); + return HI_FAILURE; + } + + //DIS + stAdptDISAttr.bEnable = g_stPreviousPara.stDis.bEnable; + s32Ret = CommSceneautoSetDISAttr(s32IspDev, &stAdptDISAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDISAttr failed\n"); + return HI_FAILURE; + } + + //AE + stAdptAEAttr.u8ExpCompensation = g_stPreviousPara.stAEAttr.u8ExpCompensation; + stAdptAEAttr.u16BlackDelayFrame = g_stPreviousPara.stAEAttr.u16BlackDelayFrame; + stAdptAEAttr.u16WhiteDelayFrame = g_stPreviousPara.stAEAttr.u16WhiteDelayFrame; + stAdptAEAttr.u8AEStrategyMode = g_stPreviousPara.stAEAttr.u8AEStrategyMode; + stAdptAEAttr.u8MaxHistOffset = g_stPreviousPara.stAEAttr.u8MaxHistOffset; + stAdptAEAttr.u16HistRatioSlope = g_stPreviousPara.stAEAttr.u16HistRatioSlope; + stAdptAEAttr.u8Speed = g_stPreviousPara.stAEAttr.u8Speed; + stAdptAEAttr.u8Tolerance = g_stPreviousPara.stAEAttr.u8Tolerance; + stAdptAEAttr.u32SysGainMax = g_stPreviousPara.stAEAttr.u32SysGainMax; + stAdptAEAttr.u8AERunInterval = g_stPreviousPara.stAEAttr.u8AERunInterval; + for (i = 0; i < AE_WEIGHT_ROW; i++) + { + for (j = 0; j < AE_WEIGHT_COLUMN; j++) + { + stAdptAEAttr.au8AeWeight[i][j] = g_stPreviousPara.stAEAttr.au8AeWeight[i][j]; + } + } + s32Ret = CommSceneautoSetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAEAttr failed\n"); + return HI_FAILURE; + } + + //RGBIR + stAdptRgbirParam.bEnable = g_stPreviousPara.stRgbirParam.bEnable; + stAdptRgbirParam.bRemovelEn = g_stPreviousPara.stRgbirParam.bRemovelEn; + s32Ret = CommSceneautoSetRgbirParam(s32IspDev, &stAdptRgbirParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetRgbirParam failed\n"); + return HI_FAILURE; + } + + return HI_SUCCESS; +#if 0 + //3dnr + stAdpt3dnrAttr.s32YPKStr = g_stPreviousPara.st3dnr.s32YPKStr; + stAdpt3dnrAttr.s32YSFStr = g_stPreviousPara.st3dnr.s32YSFStr; + stAdpt3dnrAttr.s32YTFStr = g_stPreviousPara.st3dnr.s32YTFStr; + stAdpt3dnrAttr.s32TFStrMax = g_stPreviousPara.st3dnr.s32TFStrMax; + stAdpt3dnrAttr.s32YSFStrDlt = g_stPreviousPara.st3dnr.s32YSFStrDlt; + stAdpt3dnrAttr.s32YTFStrDlt = g_stPreviousPara.st3dnr.s32YTFStrDlt; + stAdpt3dnrAttr.s32YTFStrDl = g_stPreviousPara.st3dnr.s32YTFStrDl; + stAdpt3dnrAttr.s32YSmthStr = g_stPreviousPara.st3dnr.s32YSmthStr; + stAdpt3dnrAttr.s32YSmthRat = g_stPreviousPara.st3dnr.s32YSmthRat; + stAdpt3dnrAttr.s32YSFBriRat = g_stPreviousPara.st3dnr.s32YSFBriRat; + stAdpt3dnrAttr.s32CSFStr = g_stPreviousPara.st3dnr.s32CSFStr; + stAdpt3dnrAttr.s32CTFstr = g_stPreviousPara.st3dnr.s32CTFstr; + s32Ret = CommSceneautoSet3DNRAttr(s32IspDev, &stAdpt3dnrAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSet3DNRAttr failed\n"); + return HI_FAILURE; + } +#endif + return HI_SUCCESS; +} + +HI_S32 Sceneauto_GetPreviousPara() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i,j; + HI_S32 s32IspDev; + HI_S32 s32ViDev; + HI_S32 s32VencChn; + //HI_S32 s32VpssGrp; + ADPT_SCENEAUTO_SHARPEN_S stAdptSharpen; + ADPT_SCENEAUTO_DP_S stAdptDP; + ADPT_SCENEAUTO_GAMMA_S stAdptGamma; + ADPT_SCENEAUTO_H264_DEBLOCK_S stAdptH264Deblock; + ADPT_SCENEAUTO_H264TRANS_S stAdptH264Trans; + ADPT_SCENEAUTO_H264_RCPARAM_S stAdptH264RcParam; + ADPT_SCENEAUTO_H265_RCPARAM_S stAdptH265RcParam; + ADPT_SCENEAUTO_H265_FACE_CFG_S stAdptH265FaceCfg; + ADPT_SCENEAUTO_AEROUTE_S stAdptAERoute; + ADPT_SCENEAUTO_DCIPARAM_S stAdptDCIPara; + ADPT_SCENEAUTO_DRCATTR_S stAdptDRCAttr; + ADPT_SCENEAUTO_SATURATION_S stAdptSaturation; + ADPT_SCENEAUTO_DIS_ATTR_S stAdptDISAttr; + ADPT_SCENEAUTO_AEATTR_S stAdptAEAttr; + ADPT_SCENEAUTO_VENC_ATTR_S stAdptVencAttr; + ADPT_SCENEAUTO_CCM_ATTR_S stAdptCcmAttr; + ADPT_SCENEAUTO_ACM_ATTR_S stAdptAcmAttr; + ADPT_SCENEAUTO_RGBIRPARAM_S stAdptRgbirParam; + //ADPT_SCENEAUTO_3DNR_ATTR_S stAdpt3dnrAttr; + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + s32ViDev = g_stINIPara.stMpInfo.s32ViDev; + s32VencChn = g_stINIPara.stMpInfo.s32VencChn; + //s32VpssGrp = g_stINIPara.stMpInfo.s32VpssGrp; + + //sharpen + s32Ret = CommSceneautoGetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("Adpt_GetDemosaic failed\n"); + return HI_FAILURE; + } + for (i = 0; i < 16; i++) + { + g_stPreviousPara.stSharpen.abEnLowLumaShoot[i] = stAdptSharpen.abEnLowLumaShoot[i]; + g_stPreviousPara.stSharpen.u8SharpenD[i] = stAdptSharpen.u8SharpenD[i]; + g_stPreviousPara.stSharpen.u8SharpenUd[i] = stAdptSharpen.u8SharpenUd[i]; + g_stPreviousPara.stSharpen.u8OverShoot[i] = stAdptSharpen.u8OverShoot[i]; + g_stPreviousPara.stSharpen.u8UnderShoot[i] = stAdptSharpen.u8UnderShoot[i]; + g_stPreviousPara.stSharpen.u8TextureNoiseThd[i] = stAdptSharpen.u8TextureNoiseThd[i]; + g_stPreviousPara.stSharpen.u8EdgeNoiseThd[i] = stAdptSharpen.u8EdgeNoiseThd[i]; + } + + //DP + s32Ret = CommSceneautoGetDP(s32IspDev, &stAdptDP); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDP failed\n"); + return HI_FAILURE; + } + + for (i = 0; i < 16; i++) + { + g_stPreviousPara.stDP.u16Slope[i] = stAdptDP.u16Slope[i]; + } + + //gamma + s32Ret = CommSceneautoGetGamma(s32IspDev, &stAdptGamma); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetGamma failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stGamma.u8CurveType = stAdptGamma.u8CurveType; + for (i = 0 ; i < 257; i++) + { + g_stPreviousPara.stGamma.u16Table[i] = stAdptGamma.au16GammaTable[i]; + } + + //ccm + s32Ret = CommSceneautoGetCcmAttr(s32IspDev, &stAdptCcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetCcmAttr failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stCcm.u16HighColorTemp = stAdptCcmAttr.u16HighColorTemp; + g_stPreviousPara.stCcm.u16MidColorTemp = stAdptCcmAttr.u16MidColorTemp; + g_stPreviousPara.stCcm.u16LowColorTemp = stAdptCcmAttr.u16LowColorTemp; + for (i = 0; i < 9; i++) + { + g_stPreviousPara.stCcm.au16HighCCM[i] = stAdptCcmAttr.au16HighCCM[i]; + g_stPreviousPara.stCcm.au16MidCCM[i] = stAdptCcmAttr.au16MidCCM[i]; + g_stPreviousPara.stCcm.au16LowCCM[i] = stAdptCcmAttr.au16LowCCM[i]; + } + + //acm + s32Ret = CommSceneautoGetAcmAttr(s32IspDev, &stAdptAcmAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAcmAttr failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stAcm.bEnable = stAdptAcmAttr.bEnable; + g_stPreviousPara.stAcm.u32CbcrThr = stAdptAcmAttr.u32CbcrThr; + g_stPreviousPara.stAcm.u32GainHue = stAdptAcmAttr.u32GainHue; + g_stPreviousPara.stAcm.u32GainLuma = stAdptAcmAttr.u32GainLuma; + g_stPreviousPara.stAcm.u32GainSat = stAdptAcmAttr.u32GainSat; + + //venc + s32Ret = CommSceneautoGetVencAttr(s32VencChn, &stAdptVencAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetVencAttr failed\n"); + return HI_FAILURE; + } + + switch (stAdptVencAttr.eRcMode) + { + case ADPT_SCENEAUTO_RCMODE_H264: + g_eVencRcMode = ADPT_SCENEAUTO_RCMODE_H264; + + s32Ret = CommSceneautoGetH24Deblock(s32VencChn, &stAdptH264Deblock); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetH24Deblock failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stH264Venc.stH264Dblk.disable_deblocking_filter_idc = stAdptH264Deblock.disable_deblocking_filter_idc; + g_stPreviousPara.stH264Venc.stH264Dblk.slice_alpha_c0_offset_div2 = stAdptH264Deblock.slice_alpha_c0_offset_div2; + g_stPreviousPara.stH264Venc.stH264Dblk.slice_beta_offset_div2 = stAdptH264Deblock.slice_beta_offset_div2; + + s32Ret = CommSceneautoGetH264Trans(s32VencChn, &stAdptH264Trans); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetH264Trans failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stH264Venc.s32chroma_qp_index_offset = stAdptH264Trans.chroma_qp_index_offset; + + s32Ret = CommSceneautoGetH264RcParam(s32VencChn, &stAdptH264RcParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetRcParam failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stH264Venc.s32IPQPDelta = stAdptH264RcParam.s32IPQPDelta; + g_stPreviousPara.stH264Venc.u32DeltaQP = stAdptH264RcParam.u32QpDelta; + for (i = 0; i < 12; i++) + { + g_stPreviousPara.stH264Venc.u32ThrdI[i] = stAdptH264RcParam.u32ThrdI[i]; + g_stPreviousPara.stH264Venc.u32ThrdP[i] = stAdptH264RcParam.u32ThrdP[i]; + } + + break; + case ADPT_SCENEAUTO_RCMODE_H265: + g_eVencRcMode = ADPT_SCENEAUTO_RCMODE_H265; + s32Ret = CommSceneautoGetH265RcParam(s32VencChn, &stAdptH265RcParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetH265RcParam failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stH265Venc.stH265VencRcParam.u32DeltaQP = stAdptH265RcParam.u32QpDelta; + g_stPreviousPara.stH265Venc.stH265VencRcParam.s32IPQPDelta = stAdptH265RcParam.s32IPQPDelta; + for (i = 0; i < 12; i++) + { + g_stPreviousPara.stH265Venc.stH265VencRcParam.u32ThrdI[i] = stAdptH265RcParam.u32ThrdI[i]; + g_stPreviousPara.stH265Venc.stH265VencRcParam.u32ThrdP[i] = stAdptH265RcParam.u32ThrdP[i]; + } + s32Ret = CommSceneautoGetH265FaceCfg(s32VencChn, &stAdptH265FaceCfg); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetH265FaceCfg failed\n"); + return HI_FAILURE; + } + { + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra4RdCost_I = stAdptH265FaceCfg.u8NormIntra4RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra8RdCost_I = stAdptH265FaceCfg.u8NormIntra8RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra16RdCost_I = stAdptH265FaceCfg.u8NormIntra16RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra32RdCost_I = stAdptH265FaceCfg.u8NormIntra32RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra4RdCost_I = stAdptH265FaceCfg.u8SkinIntra4RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra8RdCost_I = stAdptH265FaceCfg.u8SkinIntra8RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra16RdCost_I = stAdptH265FaceCfg.u8SkinIntra16RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra32RdCost_I = stAdptH265FaceCfg.u8SkinIntra32RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra4RdCost_I = stAdptH265FaceCfg.u8HedgeIntra4RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra8RdCost_I = stAdptH265FaceCfg.u8HedgeIntra8RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra16RdCost_I = stAdptH265FaceCfg.u8HedgeIntra16RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra32RdCost_I = stAdptH265FaceCfg.u8HedgeIntra32RdCost_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra4RdCost_P = stAdptH265FaceCfg.u8NormIntra4RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra8RdCost_P = stAdptH265FaceCfg.u8NormIntra8RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra16RdCost_P = stAdptH265FaceCfg.u8NormIntra16RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormIntra32RdCost_P = stAdptH265FaceCfg.u8NormIntra32RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra4RdCost_P = stAdptH265FaceCfg.u8SkinIntra4RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra8RdCost_P = stAdptH265FaceCfg.u8SkinIntra8RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra16RdCost_P = stAdptH265FaceCfg.u8SkinIntra16RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinIntra32RdCost_P = stAdptH265FaceCfg.u8SkinIntra32RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra4RdCost_P = stAdptH265FaceCfg.u8HedgeIntra4RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra8RdCost_P = stAdptH265FaceCfg.u8HedgeIntra8RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra16RdCost_P = stAdptH265FaceCfg.u8HedgeIntra16RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeIntra32RdCost_P = stAdptH265FaceCfg.u8HedgeIntra32RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormFme8RdCost_P = stAdptH265FaceCfg.u8NormFme8RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormFme16RdCost_P = stAdptH265FaceCfg.u8NormFme16RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormFme32RdCost_P = stAdptH265FaceCfg.u8NormFme32RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormFme64RdCost_P = stAdptH265FaceCfg.u8NormFme64RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinFme8RdCost_P = stAdptH265FaceCfg.u8SkinFme8RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinFme16RdCost_P = stAdptH265FaceCfg.u8SkinFme16RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinFme32RdCost_P = stAdptH265FaceCfg.u8SkinFme32RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinFme64RdCost_P = stAdptH265FaceCfg.u8SkinFme64RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeFme8RdCost_P = stAdptH265FaceCfg.u8HedgeFme8RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeFme16RdCost_P = stAdptH265FaceCfg.u8HedgeFme16RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeFme32RdCost_P = stAdptH265FaceCfg.u8HedgeFme32RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeFme64RdCost_P = stAdptH265FaceCfg.u8HedgeFme64RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormMerg8RdCost_P = stAdptH265FaceCfg.u8NormMerg8RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormMerg16RdCost_P = stAdptH265FaceCfg.u8NormMerg16RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormMerg32RdCost_P = stAdptH265FaceCfg.u8NormMerg32RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8NormMerg64RdCost_P = stAdptH265FaceCfg.u8NormMerg64RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinMerg8RdCost_P = stAdptH265FaceCfg.u8SkinMerg8RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinMerg16RdCost_P = stAdptH265FaceCfg.u8SkinMerg16RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinMerg32RdCost_P = stAdptH265FaceCfg.u8SkinMerg32RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinMerg64RdCost_P = stAdptH265FaceCfg.u8SkinMerg64RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeMerg8RdCost_P = stAdptH265FaceCfg.u8HedgeMerg8RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeMerg16RdCost_P = stAdptH265FaceCfg.u8HedgeMerg16RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeMerg32RdCost_P = stAdptH265FaceCfg.u8HedgeMerg32RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeMerg64RdCost_P = stAdptH265FaceCfg.u8HedgeMerg64RdCost_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bSkinEn_I = stAdptH265FaceCfg.bSkinEn_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32SkinQpDelta_I = stAdptH265FaceCfg.u32SkinQpDelta_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinUMax_I = stAdptH265FaceCfg.u8SkinUMax_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinUMin_I = stAdptH265FaceCfg.u8SkinUMin_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinVMax_I = stAdptH265FaceCfg.u8SkinVMax_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinVMin_I = stAdptH265FaceCfg.u8SkinVMin_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32SkinNum_I = stAdptH265FaceCfg.u32SkinNum_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bSkinEn_P = stAdptH265FaceCfg.bSkinEn_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32SkinQpDelta_P = stAdptH265FaceCfg.u32SkinQpDelta_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinUMax_P = stAdptH265FaceCfg.u8SkinUMax_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinUMin_P = stAdptH265FaceCfg.u8SkinUMin_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinVMax_P = stAdptH265FaceCfg.u8SkinVMax_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8SkinVMin_P = stAdptH265FaceCfg.u8SkinVMin_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32SkinNum_P = stAdptH265FaceCfg.u32SkinNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeThr_I = stAdptH265FaceCfg.u8HedgeThr_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeCnt_I = stAdptH265FaceCfg.u8HedgeCnt_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bStroEdgeEn_I = stAdptH265FaceCfg.bStroEdgeEn_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32StroEdgeQpDelta_I = stAdptH265FaceCfg.u32StroEdgeQpDelta_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeThr_P = stAdptH265FaceCfg.u8HedgeThr_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u8HedgeCnt_P = stAdptH265FaceCfg.u8HedgeCnt_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bStroEdgeEn_P = stAdptH265FaceCfg.bStroEdgeEn_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32StroEdgeQpDelta_P = stAdptH265FaceCfg.u32StroEdgeQpDelta_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bImproveEn_I = stAdptH265FaceCfg.bImproveEn_I; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.bImproveEn_P = stAdptH265FaceCfg.bImproveEn_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Norm32MaxNum_P = stAdptH265FaceCfg.u32Norm32MaxNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Norm16MaxNum_P = stAdptH265FaceCfg.u32Norm16MaxNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Norm32ProtectNum_P = stAdptH265FaceCfg.u32Norm32ProtectNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Norm16ProtectNum_P = stAdptH265FaceCfg.u32Norm16ProtectNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Skin32MaxNum_P = stAdptH265FaceCfg.u32Skin32MaxNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Skin16MaxNum_P = stAdptH265FaceCfg.u32Skin16MaxNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Skin32ProtectNum_P = stAdptH265FaceCfg.u32Skin32ProtectNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Skin16ProtectNum_P = stAdptH265FaceCfg.u32Skin16ProtectNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Still32MaxNum_P = stAdptH265FaceCfg.u32Still32MaxNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Still16MaxNum_P = stAdptH265FaceCfg.u32Still16MaxNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Still32ProtectNum_P = stAdptH265FaceCfg.u32Still32ProtectNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Still16ProtectNum_P = stAdptH265FaceCfg.u32Still16ProtectNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Hedge32MaxNum_P = stAdptH265FaceCfg.u32Hedge32MaxNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Hedge16MaxNum_P = stAdptH265FaceCfg.u32Hedge16MaxNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Hedge32ProtectNum_P = stAdptH265FaceCfg.u32Hedge32ProtectNum_P; + g_stPreviousPara.stH265Venc.stH265VencFaceCfg.u32Hedge16ProtectNum_P = stAdptH265FaceCfg.u32Hedge16ProtectNum_P; + } + break; + default: + break; + } + + //AERoute + s32Ret = CommSceneautoGetAERoute(s32IspDev, &stAdptAERoute); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAERoute failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stAERoute.u32TotalNum = stAdptAERoute.u32TotalNum; + for (i = 0; i < 8; i++) + { + g_stPreviousPara.stAERoute.astRouteNode[i].u32IntTime = stAdptAERoute.astRouteNode[i].u32IntTime; + g_stPreviousPara.stAERoute.astRouteNode[i].u32SysGain = stAdptAERoute.astRouteNode[i].u32SysGain; + } + + //DCI + s32Ret = CommSceneautoGetDCIParam(s32ViDev, &stAdptDCIPara); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDCIParam failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stDCIParam.bEnable = stAdptDCIPara.bEnable; + g_stPreviousPara.stDCIParam.u32BlackGain = stAdptDCIPara.u32BlackGain; + g_stPreviousPara.stDCIParam.u32ContrastGain = stAdptDCIPara.u32ContrastGain; + g_stPreviousPara.stDCIParam.u32LightGain = stAdptDCIPara.u32LightGain; + + //DRC + s32Ret = CommSceneautoGetDRCAttr(s32IspDev, &stAdptDRCAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDRCAttr failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stDRCAttr.bEnable = stAdptDRCAttr.bEnable; + g_stPreviousPara.stDRCAttr.bManulEnable = stAdptDRCAttr.bManulEnable; + g_stPreviousPara.stDRCAttr.u16BrightGainLmt = stAdptDRCAttr.u16BrightGainLmt; + g_stPreviousPara.stDRCAttr.u16DarkGainLmtC = stAdptDRCAttr.u16DarkGainLmtC; + g_stPreviousPara.stDRCAttr.u16DarkGainLmtY= stAdptDRCAttr.u16DarkGainLmtY; + g_stPreviousPara.stDRCAttr.u8Asymmetry = stAdptDRCAttr.u8Asymmetry; + g_stPreviousPara.stDRCAttr.u8LocalMixingBrigtht = stAdptDRCAttr.u8LocalMixingBrigtht; + g_stPreviousPara.stDRCAttr.u8LocalMixingDark = stAdptDRCAttr.u8LocalMixingDark; + g_stPreviousPara.stDRCAttr.u8LocalMixingThres = stAdptDRCAttr.u8LocalMixingThres; + g_stPreviousPara.stDRCAttr.u8RangeVar = stAdptDRCAttr.u8RangeVar; + g_stPreviousPara.stDRCAttr.u8SecondPole = stAdptDRCAttr.u8SecondPole; + g_stPreviousPara.stDRCAttr.u8Stretch = stAdptDRCAttr.u8Stretch; + g_stPreviousPara.stDRCAttr.u8Strength = stAdptDRCAttr.u8Strength; + g_stPreviousPara.stDRCAttr.u8SpatialVar = stAdptDRCAttr.u8SpatialVar; + + //Saturation + s32Ret = CommSceneautoGetSaturation(s32IspDev, &stAdptSaturation); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetSaturation failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stSaturation.u8OpType = stAdptSaturation.u8OpType; + g_stPreviousPara.stSaturation.u8ManualSat = stAdptSaturation.u8ManualSat; + for (i = 0; i < 16; i++) + { + g_stPreviousPara.stSaturation.au8AutoSat[i] = stAdptSaturation.au8AutoSat[i]; + } + + //DIS + s32Ret = CommSceneautoGetDISAttr(s32IspDev, &stAdptDISAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDISAttr failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stDis.bEnable = stAdptDISAttr.bEnable; + + //AE + s32Ret = CommSceneautoGetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAEAttr failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stAEAttr.u8ExpCompensation = stAdptAEAttr.u8ExpCompensation; + g_stPreviousPara.stAEAttr.u16BlackDelayFrame = stAdptAEAttr.u16BlackDelayFrame; + g_stPreviousPara.stAEAttr.u16WhiteDelayFrame = stAdptAEAttr.u16WhiteDelayFrame; + g_stPreviousPara.stAEAttr.u8AEStrategyMode = stAdptAEAttr.u8AEStrategyMode; + g_stPreviousPara.stAEAttr.u8MaxHistOffset = stAdptAEAttr.u8MaxHistOffset; + g_stPreviousPara.stAEAttr.u16HistRatioSlope = stAdptAEAttr.u16HistRatioSlope; + g_stPreviousPara.stAEAttr.u8Speed = stAdptAEAttr.u8Speed; + g_stPreviousPara.stAEAttr.u8Tolerance = stAdptAEAttr.u8Tolerance; + g_stPreviousPara.stAEAttr.u32SysGainMax = stAdptAEAttr.u32SysGainMax; + g_stPreviousPara.stAEAttr.u8AERunInterval = stAdptAEAttr.u8AERunInterval; + + for (i = 0; i < AE_WEIGHT_ROW; i++) + { + for (j = 0; j < AE_WEIGHT_COLUMN; j++) + { + g_stPreviousPara.stAEAttr.au8AeWeight[i][j] = stAdptAEAttr.au8AeWeight[i][j]; + } + } + + //RGBIR + s32Ret = CommSceneautoGetRgbirParam(s32IspDev, &stAdptRgbirParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetRgbirParam failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.stRgbirParam.bEnable = stAdptRgbirParam.bEnable; + g_stPreviousPara.stRgbirParam.bRemovelEn = stAdptRgbirParam.bRemovelEn; +#if 0 + //3dnr + s32Ret = CommSceneautoGet3DNRAttr(s32VpssGrp, &stAdpt3dnrAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGet3DNRAttr failed\n"); + return HI_FAILURE; + } + g_stPreviousPara.st3dnr.s32YPKStr = stAdpt3dnrAttr.s32YPKStr; + g_stPreviousPara.st3dnr.s32YSFStr = stAdpt3dnrAttr.s32YSFStr; + g_stPreviousPara.st3dnr.s32YTFStr = stAdpt3dnrAttr.s32YTFStr; + g_stPreviousPara.st3dnr.s32TFStrMax = stAdpt3dnrAttr.s32TFStrMax; + g_stPreviousPara.st3dnr.s32YSFStrDlt = stAdpt3dnrAttr.s32YSFStrDlt; + g_stPreviousPara.st3dnr.s32YTFStrDlt = stAdpt3dnrAttr.s32YTFStrDlt; + g_stPreviousPara.st3dnr.s32YTFStrDl = stAdpt3dnrAttr.s32YTFStrDl; + g_stPreviousPara.st3dnr.s32YSmthStr = stAdpt3dnrAttr.s32YSmthStr; + g_stPreviousPara.st3dnr.s32YSmthRat = stAdpt3dnrAttr.s32YSmthRat; + g_stPreviousPara.st3dnr.s32YSFBriRat = stAdpt3dnrAttr.s32YSFBriRat; + g_stPreviousPara.st3dnr.s32CSFStr = stAdpt3dnrAttr.s32CSFStr; + g_stPreviousPara.st3dnr.s32CTFstr = stAdpt3dnrAttr.s32CTFstr; + #endif + return HI_SUCCESS; +} + +HI_VOID Sceneauto_FreeMem() +{ + + if (NULL != g_stINIPara.stIniAE.pu32BitrateThresh) + { + free(g_stINIPara.stIniAE.pu32BitrateThresh); + g_stINIPara.stIniAE.pu32BitrateThresh = NULL; + } + + if (NULL != g_stINIPara.stIniAE.pu32AEExpDtoLThresh) + { + free(g_stINIPara.stIniAE.pu32AEExpDtoLThresh); + g_stINIPara.stIniAE.pu32AEExpDtoLThresh = NULL; + } + + if (NULL != g_stINIPara.stIniAE.pu32AEExpLtoDThresh) + { + free(g_stINIPara.stIniAE.pu32AEExpLtoDThresh); + g_stINIPara.stIniAE.pu32AEExpLtoDThresh = NULL; + } + + if (NULL != g_stINIPara.stIniAE.pstAERelatedBit) + { + free(g_stINIPara.stIniAE.pstAERelatedBit); + g_stINIPara.stIniAE.pstAERelatedBit = NULL; + } + + if (NULL != g_stINIPara.stIniAE.pstAERelatedExp) + { + free(g_stINIPara.stIniAE.pstAERelatedExp); + g_stINIPara.stIniAE.pstAERelatedExp = NULL; + } + + if (NULL != g_stINIPara.stIniDemosaic.pu32BitrateThresh) + { + free(g_stINIPara.stIniDemosaic.pu32BitrateThresh); + g_stINIPara.stIniDemosaic.pu32BitrateThresh = NULL; + } + + if (NULL != g_stINIPara.stIniDemosaic.pu32ExpThresh) + { + free(g_stINIPara.stIniDemosaic.pu32ExpThresh); + g_stINIPara.stIniDemosaic.pu32ExpThresh = NULL; + } + + if (NULL != g_stINIPara.stIniDemosaic.pstDemosaic) + { + free(g_stINIPara.stIniDemosaic.pstDemosaic); + g_stINIPara.stIniDemosaic.pstDemosaic = NULL; + } + + if (NULL != g_stINIPara.stIniSharpen.pu32BitrateThresh) + { + free(g_stINIPara.stIniSharpen.pu32BitrateThresh); + g_stINIPara.stIniSharpen.pu32BitrateThresh = NULL; + } + + if (NULL != g_stINIPara.stIniSharpen.pstSharpen) + { + free(g_stINIPara.stIniSharpen.pstSharpen); + g_stINIPara.stIniSharpen.pstSharpen = NULL; + } + + if (NULL != g_stINIPara.stIniDP.pu32ExpThresh) + { + free(g_stINIPara.stIniDP.pu32ExpThresh); + g_stINIPara.stIniDP.pu32ExpThresh = NULL; + } + + if (NULL != g_stINIPara.stIniDP.pstDPAttr) + { + free(g_stINIPara.stIniDP.pstDPAttr); + g_stINIPara.stIniDP.pstDPAttr = NULL; + } + + if (NULL != g_stINIPara.stIniGamma.pu32ExpThreshDtoL) + { + free(g_stINIPara.stIniGamma.pu32ExpThreshDtoL); + g_stINIPara.stIniGamma.pu32ExpThreshDtoL = NULL; + + } + + if (NULL != g_stINIPara.stIniGamma.pu32ExpThreshLtoD) + { + free(g_stINIPara.stIniGamma.pu32ExpThreshLtoD); + g_stINIPara.stIniGamma.pu32ExpThreshLtoD = NULL; + + } + + if (NULL != g_stINIPara.stIniGamma.pstGamma) + { + free(g_stINIPara.stIniGamma.pstGamma); + g_stINIPara.stIniGamma.pstGamma = NULL; + } + + if (NULL != g_stINIPara.stIniH264Venc.pu32BitrateThresh) + { + free(g_stINIPara.stIniH264Venc.pu32BitrateThresh); + g_stINIPara.stIniH264Venc.pu32BitrateThresh = NULL; + } + + if (NULL != g_stINIPara.stIniH264Venc.pstH264Venc) + { + free(g_stINIPara.stIniH264Venc.pstH264Venc); + g_stINIPara.stIniH264Venc.pstH264Venc = NULL; + } + + if (NULL != g_stINIPara.stFastDynamic.pstRouteNode) + { + free(g_stINIPara.stFastDynamic.pstRouteNode); + g_stINIPara.stFastDynamic.pstRouteNode = NULL; + } + + if (NULL != g_stINIPara.stNormalDynamic.pstRouteNode) + { + free(g_stINIPara.stNormalDynamic.pstRouteNode); + g_stINIPara.stNormalDynamic.pstRouteNode = NULL; + } + + if (NULL != g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32ExpThresh) + { + free(g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32ExpThresh); + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32ExpThresh = NULL; + } + + if (NULL != g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32BitrateThresh) + { + free(g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32BitrateThresh); + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32BitrateThresh = NULL; + } + + if (NULL != g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg) + { + free(g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg); + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg = NULL; + } + + if (NULL != g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pu32BitrateThresh) + { + free(g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pu32BitrateThresh); + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pu32BitrateThresh = NULL; + } + + if (NULL != g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam) + { + free(g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam); + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam = NULL; + } + + if (NULL != g_stINIPara.stIR.pu32ExpThreshHtoL) + { + free(g_stINIPara.stIR.pu32ExpThreshHtoL); + g_stINIPara.stIR.pu32ExpThreshHtoL = NULL; + } + + if (NULL != g_stINIPara.stIR.pu32ExpThreshLtoH) + { + free(g_stINIPara.stIR.pu32ExpThreshLtoH); + g_stINIPara.stIR.pu32ExpThreshLtoH = NULL; + } + + if (NULL != g_stINIPara.stIR.pu8ExpCompensation) + { + free(g_stINIPara.stIR.pu8ExpCompensation); + g_stINIPara.stIR.pu8ExpCompensation = NULL; + } + + if (NULL != g_stINIPara.stIR.pu8MaxHistOffset) + { + free(g_stINIPara.stIR.pu8MaxHistOffset); + g_stINIPara.stIR.pu8MaxHistOffset = NULL; + } + + if (NULL != g_stINIPara.stIR.pu323DnrIsoThresh) + { + free(g_stINIPara.stIR.pu323DnrIsoThresh); + g_stINIPara.stIR.pu323DnrIsoThresh = NULL; + } + + if (NULL != g_stINIPara.stIR.pst3dnrParam) + { + free(g_stINIPara.stIR.pst3dnrParam); + g_stINIPara.stIR.pst3dnrParam = NULL; + } + + if (NULL != g_stINIPara.stHLC.pu323DnrIsoThresh) + { + free(g_stINIPara.stHLC.pu323DnrIsoThresh); + g_stINIPara.stHLC.pu323DnrIsoThresh = NULL; + } + if (NULL != g_stINIPara.stHLC.pst3dnrParam) + { + free(g_stINIPara.stHLC.pst3dnrParam); + g_stINIPara.stHLC.pst3dnrParam = NULL; + } + + + if (NULL != g_stINIPara.stIni3dnr.pu323DnrIsoThresh) + { + free(g_stINIPara.stIni3dnr.pu323DnrIsoThresh); + g_stINIPara.stIni3dnr.pu323DnrIsoThresh = NULL; + } + + if (NULL != g_stINIPara.stIni3dnr.pst3dnrParam) + { + free(g_stINIPara.stIni3dnr.pst3dnrParam); + g_stINIPara.stIni3dnr.pst3dnrParam = NULL; + } +} + +HI_S32 Sceneauto_LoadINIPara() +{ + HI_S32 s32Temp = 0; + HI_S32 s32Offset = 0; + HI_S32 i, j; + HI_CHAR szTempStr[128]; + HI_CHAR* pszTempStr; + + /**************common:IspDev**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:IspDev", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:IspDev failed\n"); + return HI_FAILURE; + } + g_stINIPara.stMpInfo.s32IspDev = s32Temp; + + /**************common:ViDev**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:ViDev", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:ViDev failed\n"); + return HI_FAILURE; + } + g_stINIPara.stMpInfo.s32ViDev = s32Temp; + + /**************common:ViChn**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:ViChn", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:ViChn failed\n"); + return HI_FAILURE; + } + g_stINIPara.stMpInfo.s32ViChn = s32Temp; + + /**************common:VpssGrp**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:VpssGrp", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:VpssGrp failed\n"); + return HI_FAILURE; + } + g_stINIPara.stMpInfo.s32VpssGrp = s32Temp; + + /**************common:VpssChn**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:VpssChn", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:VpssChn failed\n"); + return HI_FAILURE; + } + g_stINIPara.stMpInfo.s32VpssChn = s32Temp; + + /**************common:VencGrp**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:VencGrp", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:VencGrp failed\n"); + return HI_FAILURE; + } + g_stINIPara.stMpInfo.s32VencGrp = s32Temp; + + /**************common:VencChn**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:VencChn", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:VencChn failed\n"); + return HI_FAILURE; + } + g_stINIPara.stMpInfo.s32VencChn = s32Temp; + + /**************common:IVE_Enable**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:IVE_Enable", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:IVE_Enable failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.bIVEEnable = (HI_BOOL)s32Temp; + + /**************common:HLC_AutoEnable**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:HLC_AutoEnable", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:HLC_AutoEnable failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.bHLCAutoEnable = (HI_BOOL)s32Temp; + + /**************common:HLC_thr_on**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:HLC_thr_on", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:HLC_thr_on failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.u32HLCOnThresh = s32Temp; + + /**************common:HLC_thr_off**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:HLC_thr_off", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:HLC_thr_off failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.u32HLCOffThresh = s32Temp; + + /**************common:HLC_tolerance**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:HLC_tolerance", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:HLC_tolerance failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.u32HLCTolerance = s32Temp; + + /**************common:HLC_expthr**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:HLC_expthr", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:HLC_expthr failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.u32HLCExpThresh = s32Temp; + + /**************common:HLC_count**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:HLC_count", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:HLC_count failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.u32HLCCount = s32Temp; + + /**************common:ave_lum_thresh**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:ave_lum_thresh", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:ave_lum_thresh failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.u32AveLumThresh = s32Temp; + + /**************common:delta_dis_expthresh**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:delta_dis_expthresh", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:delta_dis_expthresh failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.u32DeltaDisExpThreash = s32Temp; + + /**************common:fpn_exp_thresh**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:fpn_exp_thresh", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:fpn_exp_thresh failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.u32FpnExpThresh = s32Temp; + + /**************common:dci_strength_lut**************/ + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "common:dci_strength_lut"); + if(NULL == pszTempStr) + { + printf("common:dci_strength_lut error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < s32Temp; i++) + { + g_stINIPara.au8DciStrengthLut[i] = MAEWeight[i]; + } + + /**************common:u32DRCStrengthThresh**************/ + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "common:u32DRCStrengthThresh", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("common:u32DRCStrengthThresh failed\n"); + return HI_FAILURE; + } + g_stINIPara.stThreshValue.u32DRCStrengthThresh = s32Temp; + + /**************AE**************/ + //AE:aeRunInterval + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "AE:aeRunInterval", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:aeRunInterval failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniAE.u8AERunInterval = s32Temp; + + //AE:aeBitrateCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "AE:aeBitrateCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:aeBitrateCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniAE.s32BitrateCount = s32Temp; + g_stINIPara.stIniAE.pu32BitrateThresh = (HI_U32*)malloc((g_stINIPara.stIniAE.s32BitrateCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniAE.pu32BitrateThresh); + g_stINIPara.stIniAE.pstAERelatedBit = (SCENEAUTO_AERELATEDBIT_S*)malloc((g_stINIPara.stIniAE.s32BitrateCount) * sizeof(SCENEAUTO_AERELATEDBIT_S)); + CHECK_NULL_PTR(g_stINIPara.stIniAE.pstAERelatedBit); + + //AE:aeBitrateThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "AE:aeBitrateThresh"); + if (NULL == pszTempStr) + { + printf("AE:aeBitrateThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniAE.s32BitrateCount; i++) + { + g_stINIPara.stIniAE.pu32BitrateThresh[i] = MAEWeight[i]; + } + + for (i = 0; i < g_stINIPara.stIniAE.s32BitrateCount; i++) + { + //AE:u8Speed + snprintf(szTempStr, sizeof(szTempStr), "AE:u8Speed_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:u8Speed_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniAE.pstAERelatedBit[i].u8Speed = s32Temp; + + //AE:u8Tolerance + snprintf(szTempStr, sizeof(szTempStr), "AE:u8Tolerance_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:u8Tolerance_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniAE.pstAERelatedBit[i].u8Tolerance = s32Temp; + + //AE:u16BlackDelayFrame + snprintf(szTempStr, sizeof(szTempStr), "AE:u16BlackDelayFrame_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:u16BlackDelayFrame_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniAE.pstAERelatedBit[i].u16BlackDelayFrame = s32Temp; + + //AE:u16WhiteDelayFrame + snprintf(szTempStr, sizeof(szTempStr), "AE:u16WhiteDelayFrame_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:u16WhiteDelayFrame_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniAE.pstAERelatedBit[i].u16WhiteDelayFrame = s32Temp; + snprintf(szTempStr, sizeof(szTempStr), "AE:u32SysGainMax_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:u32SysGainMax_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniAE.pstAERelatedBit[i].u32SysGainMax = s32Temp; + } + //AE:aeExpCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "AE:aeExpCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("AE:aeExpCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniAE.s32ExpCount = s32Temp; + g_stINIPara.stIniAE.pu32AEExpDtoLThresh = (HI_U32*)malloc((g_stINIPara.stIniAE.s32ExpCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniAE.pu32AEExpDtoLThresh); + g_stINIPara.stIniAE.pu32AEExpLtoDThresh = (HI_U32*)malloc((g_stINIPara.stIniAE.s32ExpCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniAE.pu32AEExpLtoDThresh); + g_stINIPara.stIniAE.pstAERelatedExp = (SCENEAUTO_AERELATEDEXP_S*)malloc((g_stINIPara.stIniAE.s32ExpCount) * sizeof(SCENEAUTO_AERELATEDEXP_S)); + CHECK_NULL_PTR(g_stINIPara.stIniAE.pstAERelatedExp ); + //AE:aeExpDtoLThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "AE:aeExpDtoLThresh"); + if (NULL == pszTempStr) + { + printf("AE:aeExpDtoLThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniAE.s32ExpCount; i++) + { + g_stINIPara.stIniAE.pu32AEExpDtoLThresh[i] = MAEWeight[i]; + } + //AE:aeExpLtoDThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "AE:aeExpLtoDThresh"); + if (NULL == pszTempStr) + { + printf("AE:aeExpLtoDThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniAE.s32ExpCount; i++) + { + g_stINIPara.stIniAE.pu32AEExpLtoDThresh[i] = MAEWeight[i]; + } + //AE:aeCompesation + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "AE:aeCompesation"); + if (NULL == pszTempStr) + { + printf("AE:aeCompesation error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniAE.s32ExpCount; i++) + { + g_stINIPara.stIniAE.pstAERelatedExp[i].u8AECompesation = MAEWeight[i]; + } + //AE:aeHistOffset + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "AE:aeHistOffset"); + if (NULL == pszTempStr) + { + printf("AE:aeHistOffset error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniAE.s32ExpCount; i++) + { + g_stINIPara.stIniAE.pstAERelatedExp[i].u8AEHistOffset = MAEWeight[i]; + } + /**************sharpen**************/ + //sharpen:IsoThresh + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "sharpen:IsoThresh", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("sharpen:IsoThresh failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniSharpen.s32IsoThresh = s32Temp; + //sharpen:ExpCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "sharpen:ExpCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("sharpen:ExpCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniSharpen.s32ExpCount = s32Temp; + g_stINIPara.stIniSharpen.pu32ExpThresh = (HI_U32 *)malloc((g_stINIPara.stIniSharpen.s32ExpCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniSharpen.pu32ExpThresh); + g_stINIPara.stIniSharpen.pstSharpen = (SCENEAUTO_SHARPEN_S *)malloc((g_stINIPara.stIniSharpen.s32ExpCount) * sizeof(SCENEAUTO_SHARPEN_S)); + CHECK_NULL_PTR(g_stINIPara.stIniSharpen.pstSharpen); + //sharpen:ExpThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "sharpen:ExpThresh"); + if (NULL == pszTempStr) + { + printf("sharpen:ExpThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniSharpen.s32ExpCount; i++) + { + g_stINIPara.stIniSharpen.pu32ExpThresh[i] = MAEWeight[i]; + } + for (i = 0; i < g_stINIPara.stIniSharpen.s32ExpCount; i++) + { + //sharpen:abEnLowLumaShoot + snprintf(szTempStr, sizeof(szTempStr), "sharpen:abEnLowLumaShoot_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("sharpen:abEnLowLumaShoot_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < EXPOSURE_LEVEL; j++) + { + g_stINIPara.stIniSharpen.pstSharpen[i].abEnLowLumaShoot[j] = MAEWeight[j]; + } + //sharpen:SharpenD + snprintf(szTempStr, sizeof(szTempStr), "sharpen:SharpenD_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("sharpen:SharpenD_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < EXPOSURE_LEVEL; j++) + { + g_stINIPara.stIniSharpen.pstSharpen[i].u8SharpenD[j] = MAEWeight[j]; + } + //sharpen:SharpenUd + snprintf(szTempStr, sizeof(szTempStr), "sharpen:SharpenUd_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("sharpen:SharpenUd_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < EXPOSURE_LEVEL; j++) + { + g_stINIPara.stIniSharpen.pstSharpen[i].u8SharpenUd[j] = MAEWeight[j]; + } + //sharpen:TextureNoiseThd + snprintf(szTempStr, sizeof(szTempStr), "sharpen:TextureNoiseThd_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("sharpen:TextureNoiseThd_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < EXPOSURE_LEVEL; j++) + { + g_stINIPara.stIniSharpen.pstSharpen[i].u8TextureNoiseThd[j] = MAEWeight[j]; + } + //sharpen:EdgeNoiseThd + snprintf(szTempStr, sizeof(szTempStr), "sharpen:EdgeNoiseThd_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("sharpen:EdgeNoiseThd_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < EXPOSURE_LEVEL; j++) + { + g_stINIPara.stIniSharpen.pstSharpen[i].u8EdgeNoiseThd[j] = MAEWeight[j]; + } + //sharpen:overshoot + snprintf(szTempStr, sizeof(szTempStr), "sharpen:overshoot_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("sharpen:overshoot_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < EXPOSURE_LEVEL; j++) + { + g_stINIPara.stIniSharpen.pstSharpen[i].u8OverShoot[j] = MAEWeight[j]; + } + //sharpen:undershoot + snprintf(szTempStr, sizeof(szTempStr), "sharpen:undershoot_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("sharpen:undershoot_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < EXPOSURE_LEVEL; j++) + { + g_stINIPara.stIniSharpen.pstSharpen[i].u8UnderShoot[j] = MAEWeight[j]; + } + } + /**************gamma**************/ + //gamma:DelayCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "gamma:DelayCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("gamma:DelayCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniGamma.u32DelayCount = s32Temp; + + //gamma:Interval + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "gamma:Interval", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("gamma:Interval failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniGamma.s32Interval = s32Temp; + + //gamma:ExpCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "gamma:ExpCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("gamma:ExpCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniGamma.s32ExpCount = s32Temp; + + g_stINIPara.stIniGamma.pu32ExpThreshLtoD = (HI_U32*)malloc((g_stINIPara.stIniGamma.s32ExpCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniGamma.pu32ExpThreshLtoD); + g_stINIPara.stIniGamma.pu32ExpThreshDtoL = (HI_U32*)malloc((g_stINIPara.stIniGamma.s32ExpCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniGamma.pu32ExpThreshDtoL); + g_stINIPara.stIniGamma.pstGamma = (SCENEAUTO_GAMMA_S*)malloc((g_stINIPara.stIniGamma.s32ExpCount) * sizeof(SCENEAUTO_GAMMA_S)); + CHECK_NULL_PTR(g_stINIPara.stIniGamma.pstGamma); + //gamma:ExpThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "gamma:ExpThreshLtoD"); + if (NULL == pszTempStr) + { + printf("gamma:ExpThreshLtoD error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniGamma.s32ExpCount; i++) + { + g_stINIPara.stIniGamma.pu32ExpThreshLtoD[i] = MAEWeight[i]; + } + //gamma:ExpThreshDtoL + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "gamma:ExpThreshDtoL"); + if (NULL == pszTempStr) + { + printf("gamma:ExpThreshDtoL error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniGamma.s32ExpCount; i++) + { + g_stINIPara.stIniGamma.pu32ExpThreshDtoL[i] = MAEWeight[i]; + } + //gammatable + for (i = 0; i < g_stINIPara.stIniGamma.s32ExpCount; i++) + { + s32Offset = 0; + + snprintf(szTempStr, sizeof(szTempStr), "gamma:gamma.0_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("gamma:gamma.0_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < s32Temp; j++) + { + g_stINIPara.stIniGamma.pstGamma[i].u16Table[j] = MAEWeight[j]; + } + s32Offset += s32Temp; + + sprintf(szTempStr, "gamma:gamma.1_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("gamma:gamma.1_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < s32Temp; j++) + { + g_stINIPara.stIniGamma.pstGamma[i].u16Table[s32Offset + j] = MAEWeight[j]; + } + s32Offset += s32Temp; + + sprintf(szTempStr, "gamma:gamma.2_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("gamma:gamma.2_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < s32Temp; j++) + { + g_stINIPara.stIniGamma.pstGamma[i].u16Table[s32Offset + j] = MAEWeight[j]; + } + + g_stINIPara.stIniGamma.pstGamma[i].u8CurveType = 2; + } + + /**************h264venc**************/ + //h264venc:vencBitrateCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "h264venc:vencBitrateCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h264venc:vencBitrateCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniH264Venc.s32BitrateCount = s32Temp; + g_stINIPara.stIniH264Venc.pu32BitrateThresh = (HI_U32*)malloc((g_stINIPara.stIniH264Venc.s32BitrateCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniH264Venc.pu32BitrateThresh); + g_stINIPara.stIniH264Venc.pstH264Venc = (SCENEAUTO_H264VENC_S*)malloc((g_stINIPara.stIniH264Venc.s32BitrateCount) * sizeof(SCENEAUTO_H264VENC_S)); + CHECK_NULL_PTR(g_stINIPara.stIniH264Venc.pstH264Venc); + //h264venc:vencBitrateThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "h264venc:vencBitrateThresh"); + if (NULL == pszTempStr) + { + printf("h264venc:vencBitrateThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniH264Venc.s32BitrateCount; i++) + { + g_stINIPara.stIniH264Venc.pu32BitrateThresh[i] = MAEWeight[i]; + } + + for (i = 0; i < g_stINIPara.stIniH264Venc.s32BitrateCount; i++) + { + //h264venc:chroma_qp_index_offset + snprintf(szTempStr, sizeof(szTempStr), "h264venc:chroma_qp_index_offset_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h264venc:chroma_qp_index_offset_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniH264Venc.pstH264Venc[i].s32chroma_qp_index_offset = s32Temp; + + //h264venc:disable_deblocking_filter_idc + snprintf(szTempStr, sizeof(szTempStr), "h264venc:disable_deblocking_filter_idc_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h264venc:disable_deblocking_filter_idc_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniH264Venc.pstH264Venc[i].stH264Dblk.disable_deblocking_filter_idc = s32Temp; + + //h264venc:slice_alpha_c0_offset_div2 + snprintf(szTempStr, sizeof(szTempStr), "h264venc:slice_alpha_c0_offset_div2_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h264venc:slice_alpha_c0_offset_div2_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniH264Venc.pstH264Venc[i].stH264Dblk.slice_alpha_c0_offset_div2 = s32Temp; + + //h264venc:slice_beta_offset_div2 + snprintf(szTempStr, sizeof(szTempStr), "h264venc:slice_beta_offset_div2_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h264venc:slice_beta_offset_div2_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniH264Venc.pstH264Venc[i].stH264Dblk.slice_beta_offset_div2 = s32Temp; + + //h264venc:u32DeltaQP + snprintf(szTempStr, sizeof(szTempStr), "h264venc:u32DeltaQP_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h264venc:u32DeltaQP_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniH264Venc.pstH264Venc[i].u32DeltaQP = s32Temp; + + //h264venc:s32IPQPDelta + snprintf(szTempStr, sizeof(szTempStr), "h264venc:s32IPQPDelta_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h264venc:s32IPQPDelta_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniH264Venc.pstH264Venc[i].s32IPQPDelta = s32Temp; + + //h264venc:ThreshI + snprintf(szTempStr, sizeof(szTempStr), "h264venc:ThreshI_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h264venc:ThreshI_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < 12; j++) + { + g_stINIPara.stIniH264Venc.pstH264Venc[i].u32ThrdI[j] = MAEWeight[j]; + } + + //h264venc:ThreshP + snprintf(szTempStr, sizeof(szTempStr), "h264venc:ThreshP_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h264venc:ThreshP_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < 12; j++) + { + g_stINIPara.stIniH264Venc.pstH264Venc[i].u32ThrdP[j] = MAEWeight[j]; + } + + } + /**************h265venc**************/ + //h265venc:vencBitrateCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "h265venc:vencBitrateCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h264venc:vencBitrateCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.s32BitrateCount = s32Temp; + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pu32BitrateThresh = (HI_U32*)malloc((g_stINIPara.stIniH265Venc.stIniH265VencRcParam.s32BitrateCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pu32BitrateThresh); + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam = (SCENEAUTO_H265VENC_RCPARAM_S*)malloc((g_stINIPara.stIniH265Venc.stIniH265VencRcParam.s32BitrateCount) * sizeof(SCENEAUTO_H265VENC_RCPARAM_S)); + CHECK_NULL_PTR(g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam); + + //h265venc:vencBitrateThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "h265venc:vencBitrateThresh"); + if (NULL == pszTempStr) + { + printf("h265venc:vencBitrateThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniH265Venc.stIniH265VencRcParam.s32BitrateCount; i++) + { + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pu32BitrateThresh[i] = MAEWeight[i]; + } + + for (i = 0; i < g_stINIPara.stIniH265Venc.stIniH265VencRcParam.s32BitrateCount; i++) + { + //h265venc:u32RowQpDelta + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32RowQpDelta_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h265venc:u32RowQpDelta_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam[i].u32DeltaQP = s32Temp; + + //h265venc:s32IPQPDelta + snprintf(szTempStr, sizeof(szTempStr), "h265venc:s32IPQPDelta_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h265venc:s32IPQPDelta_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam[i].s32IPQPDelta = s32Temp; + //h265venc:ThreshI + snprintf(szTempStr, sizeof(szTempStr), "h265venc:ThreshI_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:ThreshI_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < 12; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam[i].u32ThrdI[j] = MAEWeight[j]; + } + + //h265venc:ThreshP + snprintf(szTempStr, sizeof(szTempStr), "h265venc:ThreshP_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:ThreshP_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < 12; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pstH265VencRcParam[i].u32ThrdP[j] = MAEWeight[j]; + } + } + + //h265venc_face_cfg + //h265venc:vencBitrateCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "h265venc:vencBitrateCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h265venc:vencBitrateCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32BitrateCount = s32Temp; + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32BitrateThresh = (HI_U32*)malloc((g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32BitrateCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32BitrateThresh); + //h265venc:vencBitrateThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "h265venc:vencBitrateThresh"); + if (NULL == pszTempStr) + { + printf("h265venc:vencBitrateThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32BitrateCount; i++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32BitrateThresh[i] = MAEWeight[i]; + } + //h265venc:ExpCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "h265venc:ExpCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("h265venc:ExpCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount = s32Temp; + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32ExpThresh = (HI_U32*)malloc((g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32ExpThresh); + //h265venc:ExpThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "h265venc:ExpThresh"); + if (NULL == pszTempStr) + { + printf("h265venc:ExpThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; i++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32ExpThresh[i] = MAEWeight[i]; + } + + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg = (SCENEAUTO_H265VENC_FACECFG_S*)malloc((g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32BitrateCount) * (g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount) * sizeof(SCENEAUTO_H265VENC_FACECFG_S)); + CHECK_NULL_PTR(g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg); + + for (i = 0; i < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32BitrateCount; i++) + { + //h265venc:u8NormIntra4RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormIntra4RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormIntra4RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormIntra4RdCost_I = MAEWeight[j]; + } + //h265venc:u8NormIntra8RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormIntra8RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormIntra8RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormIntra8RdCost_I = MAEWeight[j]; + } + //h265venc:u8NormIntra16RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormIntra16RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormIntra16RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormIntra16RdCost_I = MAEWeight[j]; + } + //h265venc:u8NormIntra32RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormIntra32RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormIntra32RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormIntra32RdCost_I = MAEWeight[j]; + } + //h265venc:u8SkinIntra4RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinIntra4RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinIntra4RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinIntra4RdCost_I = MAEWeight[j]; + } + //h265venc:u8SkinIntra8RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinIntra8RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinIntra8RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinIntra8RdCost_I = MAEWeight[j]; + } + //h265venc:u8SkinIntra16RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinIntra16RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinIntra16RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinIntra16RdCost_I = MAEWeight[j]; + } + //h265venc:u8SkinIntra32RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinIntra32RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinIntra32RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinIntra32RdCost_I = MAEWeight[j]; + } + //h265venc:u8HedgeIntra4RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeIntra4RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8HedgeIntra4RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeIntra4RdCost_I = MAEWeight[j]; + } + //h265venc:u8HedgeIntra8RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeIntra8RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8HedgeIntra8RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeIntra8RdCost_I = MAEWeight[j]; + } + //h265venc:u8HedgeIntra16RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeIntra16RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8HedgeIntra16RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeIntra16RdCost_I = MAEWeight[j]; + } + //h265venc:u8HedgeIntra32RdCost_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeIntra32RdCost_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8HedgeIntra32RdCost_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeIntra32RdCost_I = MAEWeight[j]; + } + //h265venc:u8NormIntra4RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormIntra4RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormIntra4RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormIntra4RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormIntra8RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormIntra8RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormIntra8RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormIntra8RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormIntra16RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormIntra16RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormIntra16RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormIntra16RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormIntra32RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormIntra32RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormIntra32RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormIntra32RdCost_P = MAEWeight[j]; + } + //h265venc:u8SkinIntra4RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinIntra4RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinIntra4RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinIntra4RdCost_P = MAEWeight[j]; + } + //h265venc:u8SkinIntra8RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinIntra8RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinIntra8RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinIntra8RdCost_P = MAEWeight[j]; + } + //h265venc:u8SkinIntra16RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinIntra16RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinIntra16RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinIntra16RdCost_P = MAEWeight[j]; + } + //h265venc:u8SkinIntra32RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinIntra32RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinIntra32RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinIntra32RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeIntra4RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeIntra4RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8HedgeIntra4RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeIntra4RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeIntra8RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeIntra8RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8HedgeIntra8RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeIntra8RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeIntra16RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeIntra16RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8HedgeIntra16RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeIntra16RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeIntra32RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeIntra32RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8HedgeIntra32RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeIntra32RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormFme8RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormFme8RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormFme8RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormFme8RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormFme16RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormFme16RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormFme16RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormFme16RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormFme32RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormFme32RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormFme32RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormFme32RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormFme64RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormFme64RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8NormFme64RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormFme64RdCost_P = MAEWeight[j]; + } + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinFme8RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinFme8RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinFme8RdCost_P = MAEWeight[j]; + } + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinFme16RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinFme16RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinFme16RdCost_P = MAEWeight[j]; + } + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinFme32RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinFme32RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinFme32RdCost_P = MAEWeight[j]; + } + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinFme64RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8SkinFme64RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinFme64RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeFme8RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeFme8RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("h265venc:u8HedgeFme8RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeFme8RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeFme16RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeFme16RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeFme16RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeFme16RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeFme32RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeFme32RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeFme32RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeFme32RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeFme64RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeFme64RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeFme64RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeFme64RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormMerg8RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormMerg8RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8NormMerg8RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormMerg8RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormMerg16RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormMerg16RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8NormMerg16RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormMerg16RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormMerg32RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormMerg32RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8NormMerg32RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormMerg32RdCost_P = MAEWeight[j]; + } + //h265venc:u8NormMerg64RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8NormMerg64RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8NormMerg64RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8NormMerg64RdCost_P = MAEWeight[j]; + } + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinMerg8RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinMerg8RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinMerg8RdCost_P = MAEWeight[j]; + } + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinMerg16RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinMerg16RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinMerg16RdCost_P = MAEWeight[j]; + } + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinMerg32RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinMerg32RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinMerg32RdCost_P = MAEWeight[j]; + } + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinMerg64RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinMerg64RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinMerg64RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeMerg8RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeMerg8RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeMerg8RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeMerg8RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeMerg16RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeMerg16RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeMerg16RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeMerg16RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeMerg32RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeMerg32RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeMerg32RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeMerg32RdCost_P = MAEWeight[j]; + } + //h265venc:u8HedgeMerg64RdCost_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeMerg64RdCost_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeMerg64RdCost_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeMerg64RdCost_P = MAEWeight[j]; + } + //h265venc:bSkinEn_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:bSkinEn_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:bSkinEn_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].bSkinEn_I = (HI_BOOL)MAEWeight[j]; + } + //h265venc:u32SkinQpDelta_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32SkinQpDelta_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32SkinQpDelta_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32SkinQpDelta_I = MAEWeight[j]; + } + //h265venc:u8SkinUMax_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinUMax_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinUMax_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinUMax_I = MAEWeight[j]; + } + //h265venc:u8SkinUMin_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinUMin_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinUMin_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinUMin_I = MAEWeight[j]; + } + //h265venc:u8SkinVMax_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinVMax_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinVMax_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinVMax_I = MAEWeight[j]; + } + //h265venc:u8SkinVMin_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinVMin_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinVMin_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinVMin_I = MAEWeight[j]; + } + //h265venc:u32SkinNum_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32SkinNum_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32SkinNum_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32SkinNum_I = MAEWeight[j]; + } + //h265venc:bSkinEn_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:bSkinEn_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:bSkinEn_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].bSkinEn_P = (HI_BOOL)MAEWeight[j]; + } + //h265venc:u32SkinQpDelta_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32SkinQpDelta_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32SkinQpDelta_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32SkinQpDelta_P = MAEWeight[j]; + } + //h265venc:u8SkinUMax_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinUMax_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinUMax_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinUMax_P = MAEWeight[j]; + } + //h265venc:u8SkinUMin_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinUMin_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinUMin_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinUMin_P = MAEWeight[j]; + } + //h265venc:u8SkinVMax_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinVMax_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinVMax_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinVMax_P = MAEWeight[j]; + } + //h265venc:u8SkinVMin_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8SkinVMin_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8SkinVMin_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8SkinVMin_P = MAEWeight[j]; + } + //h265venc:u32SkinNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32SkinNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32SkinNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32SkinNum_P = MAEWeight[j]; + } + //h265venc:u8HedgeThr_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeThr_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeThr_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeThr_I = MAEWeight[j]; + } + //h265venc:u8HedgeCnt_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeCnt_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeCnt_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeCnt_I = MAEWeight[j]; + } + //h265venc:bStroEdgeEn_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:bStroEdgeEn_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:bStroEdgeEn_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].bStroEdgeEn_I = (HI_BOOL)MAEWeight[j]; + } + //h265venc:u32StroEdgeQpDelta_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32StroEdgeQpDelta_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32StroEdgeQpDelta_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32StroEdgeQpDelta_I = MAEWeight[j]; + } + //h265venc:u8HedgeThr_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeThr_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeThr_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeThr_P = MAEWeight[j]; + } + //h265venc:u8HedgeCnt_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u8HedgeCnt_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u8HedgeCnt_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u8HedgeCnt_P = MAEWeight[j]; + } + //h265venc:bStroEdgeEn_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:bStroEdgeEn_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:bStroEdgeEn_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].bStroEdgeEn_P = (HI_BOOL)MAEWeight[j]; + } + //h265venc:u32StroEdgeQpDelta_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32StroEdgeQpDelta_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32StroEdgeQpDelta_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32StroEdgeQpDelta_P = MAEWeight[j]; + } + //h265venc:bImproveEn_I + snprintf(szTempStr, sizeof(szTempStr), "h265venc:bImproveEn_I_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:bImproveEn_I_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].bImproveEn_I = (HI_BOOL)MAEWeight[j]; + } + //h265venc:bImproveEn_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:bImproveEn_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:bImproveEn_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].bImproveEn_P = (HI_BOOL)MAEWeight[j]; + } + //h265venc:u32Norm32MaxNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Norm32MaxNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Norm32MaxNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Norm32MaxNum_P = MAEWeight[j]; + } + //h265venc:u32Norm16MaxNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Norm16MaxNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Norm16MaxNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Norm16MaxNum_P = MAEWeight[j]; + } + //h265venc:u32Norm32ProtectNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Norm32ProtectNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Norm32ProtectNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Norm32ProtectNum_P = MAEWeight[j]; + } + //h265venc:u32Norm16ProtectNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Norm16ProtectNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Norm16ProtectNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Norm16ProtectNum_P = MAEWeight[j]; + } + //h265venc:u32Skin32MaxNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Skin32MaxNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Skin32MaxNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Skin32MaxNum_P = MAEWeight[j]; + } + //h265venc:u32Skin16MaxNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Skin16MaxNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Skin16MaxNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Skin16MaxNum_P = MAEWeight[j]; + } + //h265venc:u32Skin32ProtectNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Skin32ProtectNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Skin32ProtectNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Skin32ProtectNum_P = MAEWeight[j]; + } + //h265venc:u32Skin16ProtectNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Skin16ProtectNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Skin16ProtectNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Skin16ProtectNum_P = MAEWeight[j]; + } + //h265venc:u32Still32MaxNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Still32MaxNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Still32MaxNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Still32MaxNum_P = MAEWeight[j]; + } + //h265venc:u32Still16MaxNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Still16MaxNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Still16MaxNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Still16MaxNum_P = MAEWeight[j]; + } + //h265venc:u32Still32ProtectNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Still32ProtectNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Still32ProtectNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Still32ProtectNum_P = MAEWeight[j]; + } + //h265venc:u32Still16ProtectNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Still16ProtectNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Still16ProtectNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Still16ProtectNum_P = MAEWeight[j]; + } + //h265venc:u32Hedge32MaxNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Hedge32MaxNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Hedge32MaxNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Hedge32MaxNum_P = MAEWeight[j]; + } + //h265venc:u32Hedge16MaxNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Hedge16MaxNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Hedge16MaxNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Hedge16MaxNum_P = MAEWeight[j]; + } + //h265venc:u32Hedge32ProtectNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Hedge32ProtectNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Hedge32ProtectNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Hedge32ProtectNum_P = MAEWeight[j]; + } + //h265venc:u32Hedge16ProtectNum_P + snprintf(szTempStr, sizeof(szTempStr), "h265venc:u32Hedge16ProtectNum_P_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if(NULL == pszTempStr) + { + printf("h265venc:u32Hedge16ProtectNum_P_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; j++) + { + g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pstH265VencFaceCfg[i * g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount + j].u32Hedge16ProtectNum_P = MAEWeight[j]; + } + } + + /**************3dnr**************/ + //3dnr:3DnrIsoCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "3dnr:3DnrIsoCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:3DnrIsoCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.s323DnrIsoCount = s32Temp; + g_stINIPara.stIni3dnr.pu323DnrIsoThresh = (HI_U32 *)malloc((g_stINIPara.stIni3dnr.s323DnrIsoCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIni3dnr.pu323DnrIsoThresh); + g_stINIPara.stIni3dnr.pst3dnrParam = (SCENEAUTO_INIPARAM_3DNRCFG_S *)malloc((g_stINIPara.stIni3dnr.s323DnrIsoCount) * sizeof(SCENEAUTO_INIPARAM_3DNRCFG_S)); + CHECK_NULL_PTR(g_stINIPara.stIni3dnr.pst3dnrParam); + + //3dnr:3DnrIsoThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "3dnr:3DnrIsoThresh"); + if (NULL == pszTempStr) + { + printf("3dnr:3DnrIsoThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIni3dnr.s323DnrIsoCount; i++) + { + g_stINIPara.stIni3dnr.pu323DnrIsoThresh[i] = MAEWeight[i]; + } + + for (i = 0; i < g_stINIPara.stIni3dnr.s323DnrIsoCount; i++) + { + //3dnr:s32YPKStr + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32YPKStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32YPKStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32YPKStr = s32Temp; + + //3dnr:s32YSFStr + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32YSFStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32YSFStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32YSFStr = s32Temp; + + //3dnr:s32YTFStr + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32YTFStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32YTFStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32YTFStr = s32Temp; + + //3dnr:s32TFStrMax + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32TFStrMax_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32TFStrMax_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32TFStrMax = s32Temp; + + + //3dnr:s32YSmthStr + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32YSmthStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32YSmthStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32YSmthStr = s32Temp; + + //3dnr:s32YSmthRat + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32YSmthRat_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32YSmthRat_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32YSmthRat = s32Temp; + + + //3dnr:s32YSFStrDlt + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32YSFStrDlt_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32YSFStrDlt_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32YSFStrDlt = s32Temp; + + + //3dnr:s32YTFStrDlt + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32YTFStrDlt_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32YTFStrDlt_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32YTFStrDlt = s32Temp; + + //3dnr:s32YTFStrDl + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32YTFStrDl_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32YTFStrDl_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32YTFStrDl = s32Temp; + + //3dnr:s32YSFBriRat + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32YSFBriRat_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32YSFBriRat_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32YSFBriRat = s32Temp; + + //3dnr:s32CSFStr + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32CSFStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32CSFStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32CSFStr = s32Temp; + + //3dnr:s32CTFstr + snprintf(szTempStr, sizeof(szTempStr), "3dnr:s32CTFstr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("3dnr:s32CTFstr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIni3dnr.pst3dnrParam[i].s32CTFstr = s32Temp; + } + + /**************BLC**************/ + //BLC:AEStrategyMode + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "BLC:AEStrategyMode", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("BLC:AEStrategyMode failed\n"); + return HI_FAILURE; + } + g_stINIPara.stBLC.u8AEStrategyMode = s32Temp; + //BLC:MaxHistOffset + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "BLC:MaxHistOffset", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("BLC:MaxHistOffset failed\n"); + return HI_FAILURE; + } + g_stINIPara.stBLC.u8MaxHistOffset = s32Temp; + //BLC:HistRatioSlope + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "BLC:HistRatioSlope", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("BLC:HistRatioSlope failed\n"); + return HI_FAILURE; + } + g_stINIPara.stBLC.u16HistRatioSlope = s32Temp; + /**************DYNAMIC**************/ + //DYNAMIC:TotalNum_fast + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DYNAMIC:TotalNum_fast", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DYNAMIC:TotalNum_fast failed\n"); + return HI_FAILURE; + } + g_stINIPara.stFastDynamic.s32TotalNum = s32Temp; + g_stINIPara.stFastDynamic.pstRouteNode = (SCENEAUTO_ROUTE_NODE_S*)malloc((g_stINIPara.stFastDynamic.s32TotalNum) * sizeof (SCENEAUTO_ROUTE_NODE_S)); + CHECK_NULL_PTR(g_stINIPara.stFastDynamic.pstRouteNode); + //DYNAMIC:IntTime_fast + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "DYNAMIC:IntTime_fast"); + if (NULL == pszTempStr) + { + printf("DYNAMIC:IntTime_fast error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stFastDynamic.s32TotalNum; i++) + { + g_stINIPara.stFastDynamic.pstRouteNode[i].u32IntTime = MAEWeight[i]; + } + //DYNAMIC:SysGain_fast + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "DYNAMIC:SysGain_fast"); + if (NULL == pszTempStr) + { + printf("DYNAMIC:SysGain_fast error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stFastDynamic.s32TotalNum; i++) + { + g_stINIPara.stFastDynamic.pstRouteNode[i].u32SysGain = MAEWeight[i]; + } + //DYNAMIC:TotalNum_normal + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DYNAMIC:TotalNum_normal", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DYNAMIC:TotalNum_normal failed\n"); + return HI_FAILURE; + } + g_stINIPara.stNormalDynamic.s32TotalNum = s32Temp; + g_stINIPara.stNormalDynamic.pstRouteNode = (SCENEAUTO_ROUTE_NODE_S*)malloc((g_stINIPara.stFastDynamic.s32TotalNum) * sizeof (SCENEAUTO_ROUTE_NODE_S)); + CHECK_NULL_PTR(g_stINIPara.stNormalDynamic.pstRouteNode); + //DYNAMIC:IntTime_normal + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "DYNAMIC:IntTime_normal"); + if (NULL == pszTempStr) + { + printf("DYNAMIC:IntTime_normal error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stNormalDynamic.s32TotalNum; i++) + { + g_stINIPara.stNormalDynamic.pstRouteNode[i].u32IntTime = MAEWeight[i]; + } + //DYNAMIC:SysGain_normal + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "DYNAMIC:SysGain_normal"); + if (NULL == pszTempStr) + { + printf("DYNAMIC:SysGain_normal error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stNormalDynamic.s32TotalNum; i++) + { + g_stINIPara.stNormalDynamic.pstRouteNode[i].u32SysGain = MAEWeight[i]; + } + /**************HLC**************/ + //HLC:ExpCompensation + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:ExpCompensation", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:ExpCompensation failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u8ExpCompensation = s32Temp; + //HLC:Saturation + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "HLC:Saturation"); + if (NULL == pszTempStr) + { + printf("HLC:Saturation error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stHLC.u8Saturation[i] = MAEWeight[i]; + } + //HLC:BlackDelayFrame + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:BlackDelayFrame", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:BlackDelayFrame failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u16BlackDelayFrame = s32Temp; + //HLC:WhiteDelayFrame + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:WhiteDelayFrame", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:WhiteDelayFrame failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u16WhiteDelayFrame = s32Temp; + + //HLC:u8Speed + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:u8Speed", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:u8Speed failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u8Speed = s32Temp; + //HLC:HistRatioSlope + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:HistRatioSlope", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:HistRatioSlope failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u16HistRatioSlope = s32Temp; + //HLC:MaxHistOffset + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:MaxHistOffset", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:MaxHistOffset failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u8MaxHistOffset = s32Temp; + //HLC:u8Tolerance + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:u8Tolerance", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:u8Tolerance failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u8Tolerance = s32Temp; + //HLC:DCIEnable + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:DCIEnable", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:DCIEnable failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.bDCIEnable = (HI_BOOL)s32Temp; + //HLC:DCIBlackGain + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:DCIBlackGain", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:DCIBlackGain failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u32DCIBlackGain = s32Temp; + //HLC:DCIContrastGain + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:DCIContrastGain", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:DCIContrastGain failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u32DCIContrastGain = s32Temp; + //HLC:DCILightGain + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:DCILightGain", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:DCILightGain failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u32DCILightGain = s32Temp; + //HLC:DCILightGain + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:DCILightGain", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:DCILightGain failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u32DCILightGain = s32Temp; + //HLC:DRCEnable + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:DRCEnable", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:DRCEnable failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.bDRCEnable = (HI_BOOL)s32Temp; + //HLC:DRCManulEnable + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:DRCManulEnable", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:DRCManulEnable failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.bDRCManulEnable = (HI_BOOL)s32Temp; + //HLC:DRCStrengthTarget + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:DRCStrengthTarget", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:DRCStrengthTarget failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.u32DRCStrengthTarget = s32Temp; + + //HLC:gamma + s32Offset = 0; + snprintf(szTempStr, sizeof(szTempStr), "HLC:gamma_0"); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("HLC:gamma_0 error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < s32Temp; i++) + { + g_stINIPara.stHLC.u16GammaTable[i] = MAEWeight[i]; + } + s32Offset += s32Temp; + + snprintf(szTempStr, sizeof(szTempStr), "HLC:gamma_1"); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("HLC:gamma_1 error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < s32Temp; i++) + { + g_stINIPara.stHLC.u16GammaTable[s32Offset + i] = MAEWeight[i]; + } + s32Offset += s32Temp; + + snprintf(szTempStr, sizeof(szTempStr), "HLC:gamma_2"); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("HLC:gamma_2 error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < s32Temp; i++) + { + g_stINIPara.stHLC.u16GammaTable[s32Offset + i] = MAEWeight[i]; + } + + + //HLC:abEnLowLumaShoot + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "HLC:abEnLowLumaShoot"); + if(NULL == pszTempStr) + { + printf("HLC:abEnLowLumaShoot error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stHLC.abEnLowLumaShoot[i] = MAEWeight[i]; + } + + //HLC:u8SharpenD + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "HLC:u8SharpenD"); + if(NULL == pszTempStr) + { + printf("HLC:u8SharpenD error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stHLC.u8SharpenD[i] = MAEWeight[i]; + } + + //HLC:u8SharpenUd + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "HLC:u8SharpenUd"); + if(NULL == pszTempStr) + { + printf("HLC:u8SharpenUd error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stHLC.u8SharpenUd[i] = MAEWeight[i]; + } + + + //HLC:u8OverShoot + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "HLC:u8OverShoot"); + if(NULL == pszTempStr) + { + printf("HLC:u8OverShoot error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stHLC.u8OverShoot[i] = MAEWeight[i]; + } + + //HLC:u8UnderShoot + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:u8UnderShoot"); + if(NULL == pszTempStr) + { + printf("HLC:u8UnderShoot error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stHLC.u8UnderShoot[i] = MAEWeight[i]; + } + + //HLC:u8TextureNoiseThd + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "HLC:u8TextureNoiseThd"); + if(NULL == pszTempStr) + { + printf("HLC:u8TextureNoiseThd error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stHLC.u8TextureNoiseThd[i] = MAEWeight[i]; + } + + //HLC:u8EdgeNoiseThd + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "HLC:u8EdgeNoiseThd"); + if(NULL == pszTempStr) + { + printf("HLC:u8EdgeNoiseThd error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stHLC.u8EdgeNoiseThd[i] = MAEWeight[i]; + } + + //HLC:3DnrIsoCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "HLC:3DnrIsoCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:3DnrIsoCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stHLC.s323DnrIsoCount = s32Temp; + g_stINIPara.stHLC.pu323DnrIsoThresh = (HI_U32 *)malloc((g_stINIPara.stHLC.s323DnrIsoCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stHLC.pu323DnrIsoThresh); + g_stINIPara.stHLC.pst3dnrParam = (SCENEAUTO_INIPARAM_3DNRCFG_S *)malloc((g_stINIPara.stHLC.s323DnrIsoCount) * sizeof(SCENEAUTO_INIPARAM_3DNRCFG_S)); + CHECK_NULL_PTR(g_stINIPara.stHLC.pst3dnrParam); + + //HLC:3DnrIsoThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "HLC:3DnrIsoThresh"); + if (NULL == pszTempStr) + { + printf("HLC:3DnrIsoThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stHLC.s323DnrIsoCount; i++) + { + g_stINIPara.stHLC.pu323DnrIsoThresh[i] = MAEWeight[i]; + } + + for (i = 0; i < g_stINIPara.stHLC.s323DnrIsoCount; i++) + { + //HLC:s32YPKStr + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32YPKStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32YPKStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32YPKStr = s32Temp; + + //HLC:s32YSFStr + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32YSFStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32YSFStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32YSFStr = s32Temp; + + //HLC:s32YTFStr + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32YTFStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32YTFStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32YTFStr = s32Temp; + + //HLC:s32TFStrMax + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32TFStrMax_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32TFStrMax_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32TFStrMax = s32Temp; + + + //HLC:s32YSmthStr + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32YSmthStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32YSmthStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32YSmthStr = s32Temp; + + //HLC:s32YSmthRat + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32YSmthRat_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32YSmthRat_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32YSmthRat = s32Temp; + + + //HLC:s32YSFStrDlt + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32YSFStrDlt_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32YSFStrDlt_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32YSFStrDlt = s32Temp; + + + //HLC:s32YTFStrDlt + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32YTFStrDlt_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32YTFStrDlt_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32YTFStrDlt = s32Temp; + + //HLC:s32YTFStrDl + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32YTFStrDl_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32YTFStrDl_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32YTFStrDl = s32Temp; + + //HLC:s32YSFBriRat + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32YSFBriRat_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32YSFBriRat_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32YSFBriRat = s32Temp; + + //HLC:s32CSFStr + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32CSFStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32CSFStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32CSFStr = s32Temp; + + //HLC:s32CTFstr + snprintf(szTempStr, sizeof(szTempStr), "HLC:s32CTFstr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("HLC:s32CTFstr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stHLC.pst3dnrParam[i].s32CTFstr = s32Temp; + } + /**************IR**************/ + //IR:ExpCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:ExpCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:ExpCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.s32ExpCount = s32Temp; + g_stINIPara.stIR.pu32ExpThreshLtoH = (HI_U32*)malloc((g_stINIPara.stIR.s32ExpCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIR.pu32ExpThreshLtoH); + g_stINIPara.stIR.pu32ExpThreshHtoL = (HI_U32*)malloc((g_stINIPara.stIR.s32ExpCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIR.pu32ExpThreshHtoL); + g_stINIPara.stIR.pu8ExpCompensation = (HI_U8*)malloc((g_stINIPara.stIR.s32ExpCount) * sizeof(HI_U8)); + CHECK_NULL_PTR(g_stINIPara.stIR.pu8ExpCompensation); + g_stINIPara.stIR.pu8MaxHistOffset = (HI_U8*)malloc((g_stINIPara.stIR.s32ExpCount) * sizeof(HI_U8)); + CHECK_NULL_PTR(g_stINIPara.stIR.pu8MaxHistOffset); + + //IR:ExpThreshLtoH + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:ExpThreshLtoH"); + if (NULL == pszTempStr) + { + printf("IR:ExpThreshLtoH error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIR.s32ExpCount; i++) + { + g_stINIPara.stIR.pu32ExpThreshLtoH[i] = MAEWeight[i]; + } + + //IR:ExpThreshHtoL + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:ExpThreshHtoL"); + if (NULL == pszTempStr) + { + printf("IR:ExpThreshHtoL error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIR.s32ExpCount; i++) + { + g_stINIPara.stIR.pu32ExpThreshHtoL[i] = MAEWeight[i]; + } + + //IR:ExpCompensation + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:ExpCompensation"); + if (NULL == pszTempStr) + { + printf("IR:ExpCompensation error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIR.s32ExpCount; i++) + { + g_stINIPara.stIR.pu8ExpCompensation[i] = MAEWeight[i]; + } + + //IR:MaxHistOffset + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:MaxHistOffset"); + if (NULL == pszTempStr) + { + printf("IR:MaxHistOffset error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIR.s32ExpCount; i++) + { + g_stINIPara.stIR.pu8MaxHistOffset[i] = MAEWeight[i]; + } + + //IR:u16HistRatioSlope + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:u16HistRatioSlope", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:u16HistRatioSlope failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.u16HistRatioSlope = s32Temp; + + //IR:BlackDelayFrame + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:BlackDelayFrame", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:BlackDelayFrame failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.u16BlackDelayFrame = s32Temp; + + //IR:WhiteDelayFrame + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:WhiteDelayFrame", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:WhiteDelayFrame failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.u16WhiteDelayFrame = s32Temp; + + //IR:u8Tolerance + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:u8Tolerance", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:u8Tolerance failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.u8Tolerance = s32Temp; + //IR:u8Speed + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:u8Speed", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:u8Speed failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.u8Speed = s32Temp; + + + //IR:AE WEIGHT + for(i = 0; i < AE_WEIGHT_ROW; i++) + { + snprintf(szTempStr, sizeof(szTempStr), "IR:expweight_%d", i); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("IR:expweight_%d error\n", i); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (j = 0; j < AE_WEIGHT_COLUMN; j++) + { + g_stINIPara.stIR.au8Weight[i][j] = MAEWeight[j]; + } + } + + //IR:DCIEnable + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:DCIEnable", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:DCIEnable failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.bDCIEnable = (HI_BOOL)s32Temp; + + //IR:DCIBlackGain + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:DCIBlackGain", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:DCIBlackGain failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.u32DCIBlackGain = s32Temp; + + //IR:DCIContrastGain + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:DCIContrastGain", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:DCIContrastGain failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.u32DCIContrastGain = s32Temp; + + //IR:DCILightGain + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:DCILightGain", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:DCILightGain failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.u32DCILightGain = s32Temp; + + //IR:IRu16Slope + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:IRu16Slope"); + if(NULL == pszTempStr) + { + printf("IR:IRu16Slope error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stIR.u16Slope[i] = MAEWeight[i]; + } + + //IR:abEnLowLumaShoot + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:abEnLowLumaShoot"); + if(NULL == pszTempStr) + { + printf("IR:abEnLowLumaShoot error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stIR.abEnLowLumaShoot[i] = MAEWeight[i]; + } + + //IR:u8SharpenD + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:u8SharpenD"); + if(NULL == pszTempStr) + { + printf("IR:u8SharpenD error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stIR.u8SharpenD[i] = MAEWeight[i]; + } + + //IR:u8SharpenUd + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:u8SharpenUd"); + if(NULL == pszTempStr) + { + printf("IR:u8SharpenUd error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stIR.u8SharpenUd[i] = MAEWeight[i]; + } + + + //IR:u8OverShoot + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:u8OverShoot"); + if(NULL == pszTempStr) + { + printf("IR:u8OverShoot error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stIR.u8OverShoot[i] = MAEWeight[i]; + } + + //IR:u8UnderShoot + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:u8UnderShoot"); + if(NULL == pszTempStr) + { + printf("IR:u8UnderShoot error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stIR.u8UnderShoot[i] = MAEWeight[i]; + } + + //IR:u8TextureNoiseThd + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:u8TextureNoiseThd"); + if(NULL == pszTempStr) + { + printf("IR:u8TextureNoiseThd error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stIR.u8TextureNoiseThd[i] = MAEWeight[i]; + } + + //IR:u8EdgeNoiseThd + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:u8EdgeNoiseThd"); + if(NULL == pszTempStr) + { + printf("IR:u8EdgeNoiseThd error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < 16; i++) + { + g_stINIPara.stIR.u8EdgeNoiseThd[i] = MAEWeight[i]; + } + + //IR:gamma + s32Offset = 0; + snprintf(szTempStr, sizeof(szTempStr), "IR:gamma_0"); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("IR:gamma_0 error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < s32Temp; i++) + { + g_stINIPara.stIR.u16GammaTable[i] = MAEWeight[i]; + } + s32Offset += s32Temp; + + snprintf(szTempStr, sizeof(szTempStr), "IR:gamma_1"); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("IR:gamma_1 error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < s32Temp; i++) + { + g_stINIPara.stIR.u16GammaTable[s32Offset + i] = MAEWeight[i]; + } + s32Offset += s32Temp; + + snprintf(szTempStr, sizeof(szTempStr), "IR:gamma_2"); + pszTempStr = iniparser_getstr(g_Sceneautodictionary, szTempStr); + if (NULL == pszTempStr) + { + printf("IR:gamma_2 error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < s32Temp; i++) + { + g_stINIPara.stIR.u16GammaTable[s32Offset + i] = MAEWeight[i]; + } + + //IR:3DnrIsoCount + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "IR:3DnrIsoCount", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:3DnrIsoCount failed\n"); + return HI_FAILURE; + } + g_stINIPara.stIR.s323DnrIsoCount = s32Temp; + g_stINIPara.stIR.pu323DnrIsoThresh = (HI_U32 *)malloc((g_stINIPara.stIR.s323DnrIsoCount) * sizeof(HI_U32)); + CHECK_NULL_PTR(g_stINIPara.stIR.pu323DnrIsoThresh); + g_stINIPara.stIR.pst3dnrParam = (SCENEAUTO_INIPARAM_3DNRCFG_S *)malloc((g_stINIPara.stIR.s323DnrIsoCount) * sizeof(SCENEAUTO_INIPARAM_3DNRCFG_S)); + CHECK_NULL_PTR(g_stINIPara.stIR.pst3dnrParam); + + //IR:3DnrIsoThresh + pszTempStr = iniparser_getstr(g_Sceneautodictionary, "IR:3DnrIsoThresh"); + if (NULL == pszTempStr) + { + printf("IR:3DnrIsoThresh error\n"); + return HI_FAILURE; + } + s32Temp = Weight(pszTempStr); + for (i = 0; i < g_stINIPara.stIR.s323DnrIsoCount; i++) + { + g_stINIPara.stIR.pu323DnrIsoThresh[i] = MAEWeight[i]; + } + + for (i = 0; i < g_stINIPara.stIR.s323DnrIsoCount; i++) + { + //IR:s32YPKStr + snprintf(szTempStr, sizeof(szTempStr), "IR:s32YPKStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32YPKStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32YPKStr = s32Temp; + + //IR:s32YSFStr + snprintf(szTempStr, sizeof(szTempStr), "IR:s32YSFStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32YSFStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32YSFStr = s32Temp; + + //IR:s32YTFStr + snprintf(szTempStr, sizeof(szTempStr), "IR:s32YTFStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32YTFStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32YTFStr = s32Temp; + + //IR:s32TFStrMax + snprintf(szTempStr, sizeof(szTempStr), "IR:s32TFStrMax_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32TFStrMax_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32TFStrMax = s32Temp; + + + //IR:s32YSmthStr + snprintf(szTempStr, sizeof(szTempStr), "IR:s32YSmthStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32YSmthStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32YSmthStr = s32Temp; + + //IR:s32YSmthRat + snprintf(szTempStr, sizeof(szTempStr), "IR:s32YSmthRat_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32YSmthRat_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32YSmthRat = s32Temp; + + + //IR:s32YSFStrDlt + snprintf(szTempStr, sizeof(szTempStr), "IR:s32YSFStrDlt_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32YSFStrDlt_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32YSFStrDlt = s32Temp; + + + //IR:s32YTFStrDlt + snprintf(szTempStr, sizeof(szTempStr), "IR:s32YTFStrDlt_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32YTFStrDlt_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32YTFStrDlt = s32Temp; + + //IR:s32YTFStrDl + snprintf(szTempStr, sizeof(szTempStr), "IR:s32YTFStrDl_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32YTFStrDl_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32YTFStrDl = s32Temp; + + //IR:s32YSFBriRat + snprintf(szTempStr, sizeof(szTempStr), "IR:s32YSFBriRat_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32YSFBriRat_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32YSFBriRat = s32Temp; + + //IR:s32CSFStr + snprintf(szTempStr, sizeof(szTempStr), "IR:s32CSFStr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32CSFStr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32CSFStr = s32Temp; + + //IR:s32CTFstr + snprintf(szTempStr, sizeof(szTempStr), "IR:s32CTFstr_%d", i); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, szTempStr, HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("IR:s32CTFstr_%d failed\n", i); + return HI_FAILURE; + } + g_stINIPara.stIR.pst3dnrParam[i].s32CTFstr = s32Temp; + } + + /*************************DRC***************************/ + //pthread_mutex_unlock(&g_stIniParaLock); + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCEnable", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCEnable failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.bDRCEnable = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCManulEnable", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCManulEnable failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.bDRCManulEnable = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCStrengthTarget", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCStrengthTarget failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u8Strength = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu16BrightGainLmt", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu16BrightGainLmt failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u16BrightGainLmt = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu16DarkGainLmtC", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu16DarkGainLmtC failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u16DarkGainLmtC = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu16DarkGainLmtY", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu16DarkGainLmtY failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u16DarkGainLmtY = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu8Asymmetry", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu8Asymmetry failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u8Asymmetry = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu8LocalMixingBrigtht", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu8LocalMixingBrigtht failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u8LocalMixingBrigtht = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu8LocalMixingDark", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu8LocalMixingDark failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u8LocalMixingDark = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu8LocalMixingThres", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu8LocalMixingThres failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u8LocalMixingThres = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu8RangeVar", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu8RangeVar failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u8RangeVar = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu8SecondPole", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu8SecondPole failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u8SecondPole = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu8SpatialVar", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu8SpatialVar failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u8SpatialVar = (HI_BOOL)s32Temp; + s32Temp = 0; + s32Temp = iniparser_getint(g_Sceneautodictionary, "DRC:DRCu8Stretch", HI_FAILURE); + if (HI_FAILURE == s32Temp) + { + printf("DRC:DRCu8Stretch failed\n"); + return HI_FAILURE; + } + g_stINIPara.stDRC.u8Stretch = (HI_BOOL)s32Temp; + + return HI_SUCCESS; +} + +HI_VOID Sceneauto_FreeDict() +{ + if(NULL != g_Sceneautodictionary) + { + iniparser_freedict(g_Sceneautodictionary); + } + g_Sceneautodictionary = NULL; +} + +HI_S32 Sceneauto_LoadFile(const HI_CHAR *pszFILENAME) +{ + if(NULL != g_Sceneautodictionary) + { + g_Sceneautodictionary = NULL; + } + else + { + g_Sceneautodictionary = iniparser_load(pszFILENAME); + if(NULL==g_Sceneautodictionary) + { + printf("%s ini load failed\n",pszFILENAME); + return HI_FAILURE; + } + } + return HI_SUCCESS; +} + +void *SceneAuto_NormalThread(void *pVoid) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 i; + HI_S32 s32AECurPos = 0; + HI_S32 s32IRAECurPos = 0; + HI_U32 u32Exposure = 0; + HI_U32 u32Iso = 0; + HI_U32 u32LastExposure = (MAX_LEVEL + 1); + HI_S32 s32GammaExpLevel = 0; + HI_S32 s32LastGammaExpLevel = 0; + HI_U32 u32GammaExposure = 0; + HI_U32 u32LastGammaExposure = 0; + HI_U32 u32GammaCount = 0; + HI_U32 u32Bitrate = 0; + HI_U32 u32LastBitrate = (MAX_LEVEL + 1); + HI_S32 s32VencBitrateLevel = 0; + HI_S32 s32LastVencBitrateLevel = (MAX_LEVEL + 1); + HI_S32 u32Lastu32sharpenIso = 0; + HI_S32 s32AEBitrateLevel = 0; + HI_S32 s32LastAEBitrateLevel = (MAX_LEVEL + 1); + HI_S32 s32H265FaceCfgBitrateLevel = 0; + HI_S32 s32LastH265FaceCfgBitrateLevel = (MAX_LEVEL + 1); + HI_S32 s32H265FaceCfgExpLevel = 0; + HI_S32 s32LastH265FaceCfgExpLevel = (MAX_LEVEL + 1); + HI_S32 s32IspDev = 0; + HI_S32 s32VencChn = 0; + HI_S32 s32VpssGrp = 0; + HI_S32 s32ViDev = 0; + HI_U64 u64Temp = 0; + HI_U8 u8DciStrength = 0; + HI_U32 u8DrcGain = 0; + HI_BOOL bDefogState = HI_FALSE; + HI_BOOL bDciEnable; + HI_U32 u32BlackGain; + HI_U32 u32ContrastGain; + HI_U32 u32LightGain; + ADPT_SCENEAUTO_EXPOSUREINFO_S stAdptExposureInfo; + ADPT_SCENEAUTO_DRCATTR_S stAdptDrcAttr; + ADPT_SCENEAUTO_WDRATTR_S stAdptWdrAttr; + ADPT_SCENEAUTO_SHARPEN_S stAdptSharpen; + ADPT_SCENEAUTO_STATEINFO_S stAdptStatInfo; + ADPT_SCENEAUTO_DEFOG_ATTR_S stAdptDefogAttr; + ADPT_SCENEAUTO_DCIPARAM_S stAdptDciParam; + ADPT_SCENEAUTO_VENC_ATTR_S stAdptVencAttr; + ADPT_SCENEAUTO_RGBIRPARAM_S stAdptRgbirParam; + HI_S32 s32IsoLevel,s32IsoLevel1; + SCENEAUTO_INIPARAM_3DNRCFG_S stSceneauto3dnr; + + SRDK_SCENEAUTO_SEPCIAL_SCENE_E eSpecialScene; + eSpecialScene = g_eSpecialScene; + + prctl(PR_SET_NAME, (unsigned long)"SceneautoNormalThread", 0,0,0); + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + s32VencChn = g_stINIPara.stMpInfo.s32VencChn; + s32VpssGrp = g_stINIPara.stMpInfo.s32VpssGrp; + s32ViDev = g_stINIPara.stMpInfo.s32ViDev; + + //get the DCI value + s32Ret = CommSceneautoGetDCIParam(s32ViDev, &stAdptDciParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDCIParam failed\n"); + } + bDciEnable = stAdptDciParam.bEnable; + u32BlackGain = stAdptDciParam.u32BlackGain; + u32ContrastGain = stAdptDciParam.u32ContrastGain; + u32LightGain = stAdptDciParam.u32LightGain; + + + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoLoad3DNRdata failed\n"); + } + + while (g_bNormalThreadFlag == HI_TRUE) + { + //get the exposure value + s32Ret = CommSceneautoGetExposureInfo(s32IspDev, &stAdptExposureInfo); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetExposureInfo failed\n"); + } + s32Ret = CommSceneautoGetRgbirParam(s32IspDev, &stAdptRgbirParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetRgbirParam failed\n"); + } + if (stAdptRgbirParam.bEnable) + { + u64Temp = ((HI_U64)stAdptExposureInfo.u32AGain * (HI_U64)stAdptExposureInfo.u32DGain * (HI_U64)stAdptExposureInfo.u32ISPDGain) >> 30; + u64Temp = (u64Temp * (HI_U64)stAdptExposureInfo.u16RgbirGain * (HI_U64)stAdptExposureInfo.u16RgbirGain) >> 16; + } + else + { + u64Temp = ((HI_U64)stAdptExposureInfo.u32AGain * (HI_U64)stAdptExposureInfo.u32DGain * (HI_U64)stAdptExposureInfo.u32ISPDGain) >> 30; + } + u32Exposure = (HI_U32)u64Temp * stAdptExposureInfo.u32ExpTime; + + + s32Ret = CommSceneautoGetDRCAttr(s32IspDev, &stAdptDrcAttr); + if (HI_SUCCESS) + { + printf("CommSceneautoGetDRCAttr failed\n"); + } + s32Ret = CommSceneautoGetWDRAttr(s32IspDev, &stAdptWdrAttr); + if (HI_SUCCESS) + { + printf("CommSceneautoGetWDRAttr failed\n"); + } + + //exposure value if different in WDR + if (stAdptWdrAttr.u8WdrMode != 0) + { + s32Ret = CommSceneautoGetQueryInnerStateInfo(s32IspDev, &stAdptStatInfo); + if (HI_SUCCESS) + { + printf("CommSceneautoGetQueryInnerStateInfo failed\n"); + } + u8DrcGain = DrcStrISO(stAdptStatInfo.u32DRCStrengthActual); + u64Temp = ((HI_U64)stAdptExposureInfo.u32AGain * (HI_U64)stAdptExposureInfo.u32DGain * (HI_U64)stAdptExposureInfo.u32ISPDGain * 100) >> 30; + u64Temp = (u64Temp * u8DrcGain) / g_stINIPara.stThreshValue.u32DRCStrengthThresh; + + if (u64Temp < 100 ) + { + u64Temp = 100; + } + + u32Exposure = (HI_U32)u64Temp; + u32Iso = u32Exposure; + } + else + { + if (stAdptDrcAttr.bEnable == HI_TRUE) + { + s32Ret = CommSceneautoGetQueryInnerStateInfo(s32IspDev, &stAdptStatInfo); + if (HI_SUCCESS) + { + printf("CommSceneautoGetQueryInnerStateInfo failed\n"); + } + + if (stAdptStatInfo.u32DRCStrengthActual < g_stINIPara.stThreshValue.u32DRCStrengthThresh) + { + stAdptStatInfo.u32DRCStrengthActual = g_stINIPara.stThreshValue.u32DRCStrengthThresh; + } + + u32Exposure = (u32Exposure * stAdptStatInfo.u32DRCStrengthActual) / g_stINIPara.stThreshValue.u32DRCStrengthThresh; + } + + u32Iso = 100 * (u32Exposure / stAdptExposureInfo.u32ExpTime); + + } + + u32GammaExposure = u32Exposure; + + if (u32GammaExposure != u32LastGammaExposure) + { + + if (u32GammaExposure > u32LastGammaExposure) + { + for (s32GammaExpLevel = 0; s32GammaExpLevel < g_stINIPara.stIniGamma.s32ExpCount; s32GammaExpLevel++) + { + if (u32GammaExposure <= g_stINIPara.stIniGamma.pu32ExpThreshLtoD[s32GammaExpLevel]) + { + break; + } + } + if (s32GammaExpLevel >= g_stINIPara.stIniGamma.s32ExpCount) + { + s32GammaExpLevel = g_stINIPara.stIniGamma.s32ExpCount - 1; + } + } + else if (u32GammaExposure < u32LastGammaExposure) + { + for (s32GammaExpLevel = (g_stINIPara.stIniGamma.s32ExpCount - 1); s32GammaExpLevel >= 0; s32GammaExpLevel--) + { + if (u32GammaExposure > g_stINIPara.stIniGamma.pu32ExpThreshDtoL[s32GammaExpLevel]) + { + break; + } + } + if (s32GammaExpLevel <= 0) + { + s32GammaExpLevel = 0; + } + } + if (s32GammaExpLevel != s32LastGammaExpLevel) + { + u32GammaCount++; + if (u32GammaCount > g_stINIPara.stIniGamma.u32DelayCount) + { + s32Ret = SceneAuto_SetGamma(s32IspDev, s32GammaExpLevel, s32LastGammaExpLevel); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetGamma failed\n"); + } + u32GammaCount = 0; + s32LastGammaExpLevel = s32GammaExpLevel; + u32LastGammaExposure = u32GammaExposure; + } + } + else + { + u32GammaCount = 0; + } + } + + if ((u32Exposure != u32LastExposure) || + (eSpecialScene != g_eSpecialScene)) + { + //setting 3DNR param + if (SRDK_SCENEAUTO_SPECIAL_SCENE_HLC == g_eSpecialScene) + { + s32IsoLevel = g_stINIPara.stIni3dnr.s323DnrIsoCount - 1; + for (i = 0; i < g_stINIPara.stIni3dnr.s323DnrIsoCount; i++) + { + if (u32Iso <= g_stINIPara.stIni3dnr.pu323DnrIsoThresh[i]) + { + s32IsoLevel = i; + break; + } + } + + s32IsoLevel1 = s32IsoLevel - 1; + + if (s32IsoLevel1 < 0) + { + s32IsoLevel1 = 0; + } + + Interpolate(&stSceneauto3dnr, u32Iso, + &g_stINIPara.stHLC.pst3dnrParam[s32IsoLevel1], g_stINIPara.stHLC.pu323DnrIsoThresh[s32IsoLevel1], + &g_stINIPara.stHLC.pst3dnrParam[s32IsoLevel], g_stINIPara.stHLC.pu323DnrIsoThresh[s32IsoLevel]); + + } + else if (SRDK_SCENEAUTO_SPECIAL_SCENE_IR == g_eSpecialScene) + { + s32IsoLevel = g_stINIPara.stIni3dnr.s323DnrIsoCount - 1; + for (i = 0; i < g_stINIPara.stIni3dnr.s323DnrIsoCount; i++) + { + if (u32Iso <= g_stINIPara.stIni3dnr.pu323DnrIsoThresh[i]) + { + s32IsoLevel = i; + break; + } + } + + s32IsoLevel1 = s32IsoLevel - 1; + + if (s32IsoLevel1 < 0) + { + s32IsoLevel1 = 0; + } + + Interpolate(&stSceneauto3dnr, u32Iso, + &g_stINIPara.stIR.pst3dnrParam[s32IsoLevel1], g_stINIPara.stIR.pu323DnrIsoThresh[s32IsoLevel1], + &g_stINIPara.stIR.pst3dnrParam[s32IsoLevel], g_stINIPara.stIR.pu323DnrIsoThresh[s32IsoLevel]); + } + else + { + s32IsoLevel = g_stINIPara.stIni3dnr.s323DnrIsoCount - 1; + for (i = 0; i < g_stINIPara.stIni3dnr.s323DnrIsoCount; i++) + { + if (u32Iso <= g_stINIPara.stIni3dnr.pu323DnrIsoThresh[i]) + { + s32IsoLevel = i; + break; + } + } + + s32IsoLevel1 = s32IsoLevel - 1; + + if (s32IsoLevel1 < 0) + { + s32IsoLevel1 = 0; + } + + Interpolate(&stSceneauto3dnr, u32Iso, + &g_stINIPara.stIni3dnr.pst3dnrParam[s32IsoLevel1], g_stINIPara.stIni3dnr.pu323DnrIsoThresh[s32IsoLevel1], + &g_stINIPara.stIni3dnr.pst3dnrParam[s32IsoLevel], g_stINIPara.stIni3dnr.pu323DnrIsoThresh[s32IsoLevel]); + + } + + s32Ret = Sceneauto_Set3DNR(s32VpssGrp, stSceneauto3dnr); + if (HI_SUCCESS != s32Ret) + { + printf("Sceneauto_SetNormal3DNR failed\n"); + } + } + + //setting sharpen param + if (SRDK_SCENEAUTO_SPECIAL_SCENE_IR != g_eSpecialScene && SRDK_SCENEAUTO_SPECIAL_SCENE_HLC != g_eSpecialScene) + { + s32Ret = CommSceneautoGetSharpen(s32IspDev, &stAdptSharpen); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetSharpen failed\n"); + return HI_FALSE; + } + if (u32Iso != u32Lastu32sharpenIso) + { + if(u32Iso < g_stINIPara.stIniSharpen.s32IsoThresh) + { + for(i=0; i u32LastExposure) + { + for (i = s32IRAECurPos; i < g_stINIPara.stIR.s32ExpCount; i++) + { + if (u32Exposure > g_stINIPara.stIR.pu32ExpThreshLtoH[i]) + { + s32IRAECurPos = i + 1; + } + else + { + break; + } + } + if (s32IRAECurPos >= g_stINIPara.stIR.s32ExpCount) + { + s32IRAECurPos = g_stINIPara.stIR.s32ExpCount - 1; + } + } + else if (u32Exposure < u32LastExposure) + { + for (i = s32IRAECurPos; i >= 0; i--) + { + if (u32Exposure < g_stINIPara.stIR.pu32ExpThreshHtoL[i]) + { + s32IRAECurPos = i; + } + else + { + break; + } + } + } + s32Ret = Scenauto_SetIRAERealtedExp(s32IspDev, s32IRAECurPos); + if (HI_SUCCESS != s32Ret) + { + printf("Scenauto_SetAERealtedExp failed\n"); + } + } + else + { + if (u32Exposure > u32LastExposure) + { + for (i = s32AECurPos; i < g_stINIPara.stIniAE.s32ExpCount; i++) + { + if (u32Exposure > g_stINIPara.stIniAE.pu32AEExpLtoDThresh[i]) + { + s32AECurPos = i + 1; + } + else + { + break; + } + } + + if (s32AECurPos >= g_stINIPara.stIniAE.s32ExpCount) + { + s32AECurPos = g_stINIPara.stIniAE.s32ExpCount - 1; + } + } + else if (u32Exposure < u32LastExposure) + { + for (i = s32AECurPos; i >= 0; i--) + { + if (u32Exposure < g_stINIPara.stIniAE.pu32AEExpDtoLThresh[i]) + { + s32AECurPos = i; + } + else + { + break; + } + } + } + s32Ret = Scenauto_SetAERealtedExp(s32IspDev, s32AECurPos); + if (HI_SUCCESS != s32Ret) + { + printf("Scenauto_SetAERealtedExp failed\n"); + } + } + + //get the bitrate value + s32Ret = CommSceneautoGetVencAttr(s32VencChn, &stAdptVencAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_SceneAuto_GetBitrate failed\n"); + } + u32Bitrate = stAdptVencAttr.u32BitRate; + + if (u32Bitrate != u32LastBitrate) + { + s32Ret = CommSceneautoGetVencAttr(s32VencChn, &stAdptVencAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_SceneAuto_GetBitrate failed\n"); + } + switch (stAdptVencAttr.eRcMode) + { + case ADPT_SCENEAUTO_RCMODE_H264: + for (s32VencBitrateLevel = 0; s32VencBitrateLevel < g_stINIPara.stIniH264Venc.s32BitrateCount; s32VencBitrateLevel++) + { + if (u32Bitrate <= g_stINIPara.stIniH264Venc.pu32BitrateThresh[s32VencBitrateLevel]) + { + break; + } + } + if (s32VencBitrateLevel == g_stINIPara.stIniH264Venc.s32BitrateCount) + { + s32VencBitrateLevel = g_stINIPara.stIniH264Venc.s32BitrateCount - 1; + } + + if (s32VencBitrateLevel != s32LastVencBitrateLevel) + { + s32LastVencBitrateLevel = s32VencBitrateLevel; + + s32Ret = SceneAuto_SetH264Trans(s32VencChn, s32VencBitrateLevel); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetH264Trans failed\n"); + } + + s32Ret = SceneAuto_SetH264Debolck(s32VencChn, s32VencBitrateLevel); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetH264Debolck failed\n"); + } + + s32Ret = SceneAuto_SetH264RcParam(s32VencChn, s32VencBitrateLevel); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetH264RcParam failed\n"); + } + } + break; + case ADPT_SCENEAUTO_RCMODE_H265: + for (s32VencBitrateLevel = 0; s32VencBitrateLevel < g_stINIPara.stIniH265Venc.stIniH265VencRcParam.s32BitrateCount; s32VencBitrateLevel++) + { + if (u32Bitrate <= g_stINIPara.stIniH265Venc.stIniH265VencRcParam.pu32BitrateThresh[s32VencBitrateLevel]) + { + break; + } + } + if (s32VencBitrateLevel == g_stINIPara.stIniH265Venc.stIniH265VencRcParam.s32BitrateCount) + { + s32VencBitrateLevel = g_stINIPara.stIniH265Venc.stIniH265VencRcParam.s32BitrateCount - 1; + } + if (s32VencBitrateLevel != s32LastVencBitrateLevel) + { + s32LastVencBitrateLevel = s32VencBitrateLevel; + s32Ret = SceneAuto_SetH265RcParam(s32VencChn, s32VencBitrateLevel); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetH265RcParam failed\n"); + } + } + break; + default: + break; + } + + for (s32AEBitrateLevel = 0; s32AEBitrateLevel < g_stINIPara.stIniAE.s32BitrateCount; s32AEBitrateLevel++) + { + if (u32Bitrate <= g_stINIPara.stIniAE.pu32BitrateThresh[s32AEBitrateLevel]) + { + break; + } + + } + if (s32AEBitrateLevel == g_stINIPara.stIniAE.s32BitrateCount) + { + s32AEBitrateLevel = g_stINIPara.stIniAE.s32BitrateCount - 1; + } + + if (s32AEBitrateLevel != s32LastAEBitrateLevel) + { + s32LastAEBitrateLevel = s32AEBitrateLevel; + + s32Ret = SceneAuto_SetAERealtedBit(s32IspDev, s32AEBitrateLevel); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetAERealtedBit failed\n"); + } + } + } + + if ((u32Bitrate != u32LastBitrate) || (u32Exposure != u32LastExposure)) + { + s32Ret = CommSceneautoGetVencAttr(s32VencChn, &stAdptVencAttr); + if (HI_SUCCESS != s32Ret) + { + printf("HI_SceneAuto_GetBitrate failed\n"); + } + if (ADPT_SCENEAUTO_RCMODE_H265 == stAdptVencAttr.eRcMode) + { + for (s32H265FaceCfgBitrateLevel = 0; s32H265FaceCfgBitrateLevel < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32BitrateCount; s32H265FaceCfgBitrateLevel++) + { + if (u32Bitrate <= g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32BitrateThresh[s32H265FaceCfgBitrateLevel]) + { + break; + } + + } + if (s32H265FaceCfgBitrateLevel == g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32BitrateCount) + { + s32H265FaceCfgBitrateLevel = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32BitrateCount - 1; + } + for (s32H265FaceCfgExpLevel = 0; s32H265FaceCfgExpLevel < g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount; s32H265FaceCfgExpLevel++) + { + if (u32Exposure <= g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.pu32ExpThresh[s32H265FaceCfgExpLevel]) + { + break; + } + } + if (s32H265FaceCfgExpLevel == g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount) + { + s32H265FaceCfgExpLevel = g_stINIPara.stIniH265Venc.stIniH265VencFaceCfg.s32ExpCount - 1; + } + if ((s32H265FaceCfgBitrateLevel != s32LastH265FaceCfgBitrateLevel) || (s32H265FaceCfgExpLevel!= s32LastH265FaceCfgExpLevel)) + { + s32LastH265FaceCfgBitrateLevel = s32H265FaceCfgBitrateLevel; + s32LastH265FaceCfgExpLevel = s32H265FaceCfgExpLevel; + s32Ret = SceneAuto_SetH265FaceCfg(s32VencChn, s32H265FaceCfgExpLevel, s32H265FaceCfgBitrateLevel); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetH265FaceCfg failed\n"); + } + } + } + } + + u32LastExposure = u32Exposure; + u32LastBitrate = u32Bitrate; + usleep(1000000); + + //DCI param when defog is on + s32Ret = CommSceneautoGetDefogAttr(s32IspDev, &stAdptDefogAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDefogAttr failed\n"); + } + if (stAdptDefogAttr.bEnable == HI_TRUE) + { + s32Ret = CommSceneautoGetQueryInnerStateInfo(s32IspDev, &stAdptStatInfo); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetQueryInnerStateInfo failed\n"); + } + + if((stAdptStatInfo.u32DefogStrengthActual <= 128)||(stAdptStatInfo.u32DefogStrengthActual >= 240)) + { + u8DciStrength = 32; + } + else + { + u8DciStrength = g_stINIPara.au8DciStrengthLut[stAdptStatInfo.u32DefogStrengthActual - 129]; + } + + s32Ret = CommSceneautoGetDCIParam(s32ViDev, &stAdptDciParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDCIParam failed\n"); + } + if (HI_FALSE == bDefogState) + { + bDciEnable = stAdptDciParam.bEnable; + u32BlackGain = stAdptDciParam.u32BlackGain; + u32ContrastGain = stAdptDciParam.u32ContrastGain; + u32LightGain = stAdptDciParam.u32LightGain; + bDefogState = HI_TRUE; + } + stAdptDciParam.bEnable = HI_TRUE; + stAdptDciParam.u32BlackGain = u8DciStrength; + stAdptDciParam.u32ContrastGain = u8DciStrength; + stAdptDciParam.u32LightGain = u8DciStrength; + s32Ret = CommSceneautoSetDCIParam(s32ViDev, &stAdptDciParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDCIParam failed\n"); + } + } + else + { + if (HI_TRUE == bDefogState) + { + s32Ret = CommSceneautoGetDCIParam(s32ViDev, &stAdptDciParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDCIParam failed\n"); + } + stAdptDciParam.bEnable = bDciEnable; + stAdptDciParam.u32BlackGain = u32BlackGain; + stAdptDciParam.u32ContrastGain = u32ContrastGain; + stAdptDciParam.u32LightGain = u32LightGain; + s32Ret = CommSceneautoSetDCIParam(s32ViDev, &stAdptDciParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDCIParam failed\n"); + } + bDefogState = HI_FALSE; + } + } + } + return NULL; +} + +void *SceneAuto_SpecialThread(void *pVoid) +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 s32IspDev; + HI_U64 u64Temp; + HI_U32 u32Exposure = 0; + HI_U32 u32LastExposure = 0; + HI_U32 u32DeltaExposure = 0; + HI_U8 u8AveLum = 0; + HI_U8 u8LastAveLum = 0; + HI_U8 u8DelataAveLum = 0; + HI_U8 u8Count = 0; + HI_U32 u32HistSum = 0; + HI_U32 u32HLCDeltaExp = 0; + HI_BOOL bHLCState = HI_FALSE; + HI_U8 u8HLCCount = 0; + ADPT_SCENEAUTO_EXPOSUREINFO_S stAdptExposureInfo; + ADPT_SCENEAUTO_DIS_ATTR_S stAdptDisAttr; + stAdptDisAttr.bEnable = HI_TRUE; + prctl(PR_SET_NAME, (unsigned long)"SceneautoSpecialThread", 0,0,0); + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + + s32Ret = CommSceneautoGetExposureInfo(s32IspDev, &stAdptExposureInfo); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetExposureInfo failed\n"); + } + u64Temp = ((HI_U64)stAdptExposureInfo.u32AGain * (HI_U64)stAdptExposureInfo.u32DGain * (HI_U64)stAdptExposureInfo.u32ISPDGain) >> 30; + u32Exposure = (HI_U32)u64Temp * stAdptExposureInfo.u32ExpTime; + u8AveLum = stAdptExposureInfo.u8AveLum; + u32LastExposure = u32Exposure; + u8LastAveLum = u8AveLum; + + while (g_bSpecialThreadFlag == HI_TRUE) + { + s32Ret = CommSceneautoGetExposureInfo(s32IspDev, &stAdptExposureInfo); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetExposureInfo failed\n"); + } + u64Temp = ((HI_U64)stAdptExposureInfo.u32AGain * (HI_U64)stAdptExposureInfo.u32DGain * (HI_U64)stAdptExposureInfo.u32ISPDGain) >> 30; + u32Exposure = (HI_U32)u64Temp * stAdptExposureInfo.u32ExpTime; + u8AveLum = stAdptExposureInfo.u8AveLum; + + if (u32LastExposure == 0) + { + u32LastExposure = u32Exposure; + continue; + } + + //HLC start + if (HI_TRUE == g_stINIPara.stThreshValue.bHLCAutoEnable) + { + pthread_mutex_lock(&g_stSceneautoLock); + if (g_eSpecialScene == SRDK_SCENEAUTO_SPECIAL_SCENE_NONE) + { + if (u32Exposure > u32LastExposure) + { + u32HLCDeltaExp = u32Exposure - u32LastExposure; + } + else + { + u32HLCDeltaExp = u32LastExposure - u32Exposure; + } + + s32Ret = CommSceneautoGetExposureInfo(s32IspDev, &stAdptExposureInfo); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetExposureInfo failed\n"); + } + u32HistSum = stAdptExposureInfo.u32Hist256Value[0] + + stAdptExposureInfo.u32Hist256Value[1] + + stAdptExposureInfo.u32Hist256Value[2] + + stAdptExposureInfo.u32Hist256Value[3]; + + + if ((u32HLCDeltaExp < g_stINIPara.stThreshValue.u32HLCTolerance) + && (u32Exposure < g_stINIPara.stThreshValue.u32HLCExpThresh)) + { + if (HI_FALSE == bHLCState) + { + if (u32HistSum > g_stINIPara.stThreshValue.u32HLCOnThresh) + { + u8HLCCount++; + if (u8HLCCount > g_stINIPara.stThreshValue.u32HLCCount) + { + s32Ret = SceneAuto_HLCAutoOn(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetHLC failed\n"); + } + bHLCState = HI_TRUE; + u8HLCCount = 0; + printf("\n\n-----------------------HLC ON------------------------\n\n"); + } + } + else + { + u8HLCCount = 0; + } + + } + else + { + if (u32HistSum < g_stINIPara.stThreshValue.u32HLCOffThresh) + { + u8HLCCount++; + if (u8HLCCount > g_stINIPara.stThreshValue.u32HLCCount) + { + s32Ret = SceneAuto_HLCAutoOff(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetHLC failed\n"); + } + bHLCState = HI_FALSE; + printf("\n\n-----------------------HLC OFF------------------------\n\n"); + u8HLCCount = 0; + } + } + else + { + u8HLCCount = 0; + } + } + } + else + { + if ((HI_TRUE == bHLCState) && (u32HistSum < g_stINIPara.stThreshValue.u32HLCOffThresh)) + { + s32Ret = SceneAuto_HLCAutoOff(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_HLCOff failed\n"); + } + bHLCState = HI_FALSE; + u8HLCCount = 0; + printf("\n\n-----------------------HLC OFF------------------------\n\n"); + } + } + } + pthread_mutex_unlock(&g_stSceneautoLock); + } + + if ((u32LastExposure != u32Exposure) || (u8LastAveLum != u8AveLum)) + { + if (u32Exposure > u32LastExposure) + { + u32DeltaExposure = (u32Exposure * 256 / u32LastExposure) - 256; + } + else + { + u32DeltaExposure = (u32LastExposure * 256 / u32Exposure) - 256; + } + + if (u8AveLum >= u8LastAveLum) + { + u8DelataAveLum = u8AveLum - u8LastAveLum; + } + else + { + u8DelataAveLum = u8LastAveLum - u8AveLum; + } + + if (g_stPreviousPara.stDis.bEnable == HI_TRUE) + { + + + if ((u32DeltaExposure > g_stINIPara.stThreshValue.u32DeltaDisExpThreash) || (u8DelataAveLum > g_stINIPara.stThreshValue.u32AveLumThresh)) + { + + if (stAdptDisAttr.bEnable == HI_TRUE) + { + printf("\n\n----------------DIS DISABLE--------------------\n\n"); + stAdptDisAttr.bEnable = HI_FALSE; + s32Ret = CommSceneautoSetDISAttr(s32IspDev, &stAdptDisAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDISAttr failed\n"); + } + sleep(1); + } + u8Count = 0; + } + else + { + if (stAdptDisAttr.bEnable == HI_FALSE) + { + u8Count++; + if (u8Count > 7) + { + printf("\n\n----------------DIS ENABLE--------------------\n\n"); + stAdptDisAttr.bEnable = HI_TRUE; + s32Ret = CommSceneautoSetDISAttr(s32IspDev, &stAdptDisAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDISAttr failed\n"); + } + u8Count = 0; + } + } + + } + } + +#if 0 + if (u32Exposure > g_stINIPara.stThreshValue.u32FpnExpThresh) + { + stAdptFpnAttr.bEnable = HI_FALSE; + s32Ret = CommSceneautoSetFPNAttr(s32IspDev, &stAdptFpnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetFPNAttr failed\n"); + } + } + else + { + stAdptFpnAttr.bEnable = HI_TRUE; + s32Ret = CommSceneautoSetFPNAttr(s32IspDev, &stAdptFpnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetFPNAttr failed\n"); + } + } +#endif + + u8LastAveLum = u8AveLum; + u32LastExposure = u32Exposure; + } + + usleep(40000); + } + + return NULL; +} + +HI_S32 HI_SRDK_SCENEAUTO_GetSpecialMode(SRDK_SCENEAUTO_SEPCIAL_SCENE_E* peSpecialScene) +{ + pthread_mutex_lock(&g_stSceneautoLock); + *peSpecialScene = g_eSpecialScene; + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_SUCCESS; +} + +HI_S32 HI_SRDK_SCENEAUTO_SetSpecialMode(const SRDK_SCENEAUTO_SEPCIAL_SCENE_E* peSpecialScene) +{ + HI_S32 s32Ret = HI_SUCCESS; + CHECK_SCENEAUTO_INIT(); + CHECK_NULL_PTR(peSpecialScene); + + printf("*peSpecialScene = %d\n", *peSpecialScene); + + if ((*peSpecialScene != SRDK_SCENEAUTO_SPECIAL_SCENE_BLC) && + (*peSpecialScene != SRDK_SCENEAUTO_SPECIAL_SCENE_IR) && + (*peSpecialScene != SRDK_SCENEAUTO_SPECIAL_SCENE_HLC) && + (*peSpecialScene != SRDK_SCENEAUTO_SPECIAL_SCENE_DYNAMIC) && + (*peSpecialScene != SRDK_SCENEAUTO_SPECIAL_SCENE_NONE) && + (*peSpecialScene != SRDK_SCENEAUTO_SPECIAL_SCENE_DRC)) + { + printf("error input! unknow special scene!"); + return HI_FAILURE; + } + + pthread_mutex_lock(&g_stSceneautoLock); + SRDK_SCENEAUTO_SEPCIAL_SCENE_E eSpecialScene = *peSpecialScene; + + if (g_eSpecialScene != eSpecialScene) + { + if ((HI_TRUE != g_bSceneautoStart) && (SRDK_SCENEAUTO_SPECIAL_SCENE_NONE == g_eSpecialScene)) + { + s32Ret = Sceneauto_GetPreviousPara(); + if (HI_SUCCESS != s32Ret) + { + printf("Sceneauto_GetPreviousPara failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + } + else + { + s32Ret = SceneAuto_SetPreviousPara(); + if (HI_SUCCESS != s32Ret) + { + pthread_mutex_unlock(&g_stSceneautoLock); + printf("SceneAuto_SetPreviousPara failed\n"); + return HI_FAILURE; + } + } + + switch (eSpecialScene) + { + case SRDK_SCENEAUTO_SPECIAL_SCENE_BLC: + s32Ret = SceneAuto_SetBLC(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetBLC failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + + break; + case SRDK_SCENEAUTO_SPECIAL_SCENE_IR: + s32Ret = SceneAuto_SetIR(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetBLC failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + break; + case SRDK_SCENEAUTO_SPECIAL_SCENE_HLC: + s32Ret = SceneAuto_SetHLC(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetHLC failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + break; + case SRDK_SCENEAUTO_SPECIAL_SCENE_DYNAMIC: + s32Ret = SceneAuto_SetDynamic(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetDynamic failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + break; + case SRDK_SCENEAUTO_SPECIAL_SCENE_DRC: + s32Ret = SceneAuto_SetDRC(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetDRC failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + break; + case SRDK_SCENEAUTO_SPECIAL_SCENE_NONE: + s32Ret = SceneAuto_SetPreviousPara(); + if (HI_SUCCESS != s32Ret) + { + pthread_mutex_unlock(&g_stSceneautoLock); + printf("SceneAuto_SetPreviousPara failed\n"); + return HI_FAILURE; + } + break; + default: + printf("unkonw choice\n"); + break; + } + + g_eSpecialScene = eSpecialScene; + } + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_SUCCESS; +} + +HI_S32 HI_SRDK_SCENEAUTO_Stop() +{ + HI_S32 s32Ret = HI_SUCCESS; + pthread_mutex_lock(&g_stSceneautoLock); + if (HI_FALSE == g_bSceneautoStart) + { + printf("SRDK SCENEAUTO Module has been stopped already!\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_SUCCESS; + } + + g_bNormalThreadFlag = HI_FALSE; + + g_bSpecialThreadFlag = HI_FALSE; + (void)pthread_join(g_pthSceneAutoNormal, NULL); + (void)pthread_join(g_pthSceneAutoSpecial, NULL); + + if (HI_TRUE == g_stINIPara.stThreshValue.bIVEEnable) + { + s32Ret = Sceneauto_IVEStop(); + if (HI_SUCCESS != s32Ret) + { + pthread_mutex_unlock(&g_stSceneautoLock); + printf("SceneAuto_SetPreviousPara failed\n"); + return HI_FAILURE; + } + } + s32Ret = SceneAuto_SetPreviousPara(); + if (HI_SUCCESS != s32Ret) + { + pthread_mutex_unlock(&g_stSceneautoLock); + printf("SceneAuto_SetPreviousPara failed\n"); + return HI_FAILURE; + } + + g_bSceneautoStart = HI_FALSE; + pthread_mutex_unlock(&g_stSceneautoLock); + + printf("SRDK SCENEAUTO Module has been stopped successfully!\n"); + + return HI_SUCCESS; +} + +HI_S32 HI_SRDK_SCENEAUTO_Start() +{ + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 s32ViDev; + HI_S32 s32IspDev; + ADPT_SCENEAUTO_DCIPARAM_S stAdptDCIParam; + ADPT_SCENEAUTO_WDRATTR_S stAdptWdrAttr; + ADPT_SCENEAUTO_AEATTR_S stAdptAEAttr; + CHECK_SCENEAUTO_INIT(); + + pthread_mutex_lock(&g_stSceneautoLock); + if(HI_TRUE == g_bSceneautoStart) + { + printf("SRDK SCENEAUTO Module is start already!\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_SUCCESS; + } + + + s32IspDev = g_stINIPara.stMpInfo.s32IspDev; + s32ViDev = g_stINIPara.stMpInfo.s32ViDev; + + s32Ret = CommSceneautoGetWDRAttr(s32IspDev, &stAdptWdrAttr); + if (HI_SUCCESS) + { + printf("CommSceneautoGetWDRAttr failed\n"); + } + + s32Ret = CommSceneautoGetDCIParam(s32ViDev, &stAdptDCIParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetDCIParam failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + if (stAdptWdrAttr.u8WdrMode != 0) + { + stAdptDCIParam.bEnable = HI_FALSE; + } + else + { + stAdptDCIParam.bEnable = HI_TRUE; + } + stAdptDCIParam.u32BlackGain = 32; + stAdptDCIParam.u32ContrastGain = 32; + stAdptDCIParam.u32LightGain = 32; + s32Ret = CommSceneautoSetDCIParam(s32ViDev, &stAdptDCIParam); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetDCIParam failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + if (SRDK_SCENEAUTO_SPECIAL_SCENE_NONE == g_eSpecialScene) + { + s32Ret = Sceneauto_GetPreviousPara(); + if (HI_SUCCESS != s32Ret) + { + pthread_mutex_unlock(&g_stSceneautoLock); + printf("Sceneauto_GetPreviousPara failed\n"); + return HI_FAILURE; + } + } + s32Ret = SceneAuto_SetAERoute(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetAERoute failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + + s32Ret = SceneAuto_SetDefaultGamma(); + if (HI_SUCCESS != s32Ret) + { + printf("SceneAuto_SetDefaultGamma failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + + s32Ret = CommSceneautoGetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoGetAEAttr failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + stAdptAEAttr.u8AERunInterval = g_stINIPara.stIniAE.u8AERunInterval; + s32Ret = CommSceneautoSetAEAttr(s32IspDev, &stAdptAEAttr); + if (HI_SUCCESS != s32Ret) + { + printf("CommSceneautoSetAEAttr failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + + g_bNormalThreadFlag = HI_TRUE; + g_bSpecialThreadFlag = HI_TRUE; + + + s32Ret = pthread_create(&g_pthSceneAutoNormal, NULL, SceneAuto_NormalThread, NULL); + if (HI_SUCCESS != s32Ret) + { + printf("pthread_create SceneAuto_NormalThread failed \n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + + s32Ret = pthread_create(&g_pthSceneAutoSpecial, NULL, SceneAuto_SpecialThread, NULL); + if (HI_SUCCESS != s32Ret) + { + printf("pthread_create SceneAuto_SpecialThread failed \n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + + if (HI_TRUE == g_stINIPara.stThreshValue.bIVEEnable) + { + s32Ret = Sceneauto_IVEStart(); + if (HI_SUCCESS != s32Ret) + { + printf("Sceneauto_IVEStart failed\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + + } + g_bSceneautoStart = HI_TRUE; + pthread_mutex_unlock(&g_stSceneautoLock); + + printf("SRDK SCENEAUTO Module has been started successfully!\n"); + + return HI_SUCCESS; +} + +HI_S32 HI_SRDK_SCENEAUTO_DeInit() +{ + + pthread_mutex_lock(&g_stSceneautoLock); + if(HI_FALSE== g_bSceneautoInit) + { + printf("SRDK SCENEAUTO Module has not been inited !\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_SUCCESS; + } + + if (HI_TRUE == g_bNormalThreadFlag) + { + g_bNormalThreadFlag = HI_FALSE; + (void)pthread_join(g_pthSceneAutoNormal, NULL); + } + if (HI_TRUE == g_bSpecialThreadFlag) + { + g_bSpecialThreadFlag = HI_FALSE; + (void)pthread_join(g_pthSceneAutoSpecial, NULL); + } + Sceneauto_FreeDict(); + Sceneauto_FreeMem(); + g_bSceneautoInit = HI_FALSE; + pthread_mutex_unlock(&g_stSceneautoLock); + + printf("SRDK SCENEAUTO Module has been deinited successfully!\n"); + + return HI_SUCCESS; +} + +HI_S32 HI_SRDK_SCENEAUTO_Init(const HI_CHAR *pszFileName) +{ + HI_S32 s32Ret = HI_SUCCESS; + + CHECK_NULL_PTR(pszFileName); + + pthread_mutex_lock(&g_stSceneautoLock); + if (HI_TRUE == g_bSceneautoInit) + { + printf("SRDK SCENEAUTO Module has been inited already\n"); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_SUCCESS; + } + + s32Ret = Sceneauto_LoadFile(pszFileName); + if (HI_SUCCESS != s32Ret) + { + printf("Sceneauto_LoadFile failed\n"); + Sceneauto_FreeDict(); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + + s32Ret = Sceneauto_LoadINIPara(); + if (HI_SUCCESS != s32Ret) + { + printf("Sceneauto_LoadCommonPara failed\n"); + Sceneauto_FreeDict(); + Sceneauto_FreeMem(); + pthread_mutex_unlock(&g_stSceneautoLock); + return HI_FAILURE; + } + + g_bSceneautoInit = HI_TRUE; + g_eSpecialScene = SRDK_SCENEAUTO_SPECIAL_SCENE_NONE; + g_eVencRcMode = ADPT_SCENEAUTO_RCMODE_BUTT; + pthread_mutex_unlock(&g_stSceneautoLock); + + printf("SRDK SCENUAUTO Module has been inited successfully!\n"); + + return HI_SUCCESS; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ diff --git a/device/mpp/sample/scene_auto/src/include/hi_sceneauto_comm.h b/device/mpp/sample/scene_auto/src/include/hi_sceneauto_comm.h new file mode 100644 index 0000000..b3f011e --- /dev/null +++ b/device/mpp/sample/scene_auto/src/include/hi_sceneauto_comm.h @@ -0,0 +1,335 @@ +#ifndef __HI_SCENEAUTO_COMM_H__ +#define __HI_SCENEAUTO_COMM_H__ + +#include "hi_type.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#define AE_WEIGHT_ROW 15 +#define AE_WEIGHT_COLUMN 17 + +typedef enum hiADPT_VENC_RCMODE_E +{ + ADPT_SCENEAUTO_RCMODE_H264 = 0, + ADPT_SCENEAUTO_RCMODE_H265, + + ADPT_SCENEAUTO_RCMODE_BUTT, +}ADPT_SCENEAUTO_VENC_RCMODE_E; + + +typedef struct hiADPT_SCENEAUTO_DEMOSAIC_S +{ + HI_U8 u8VhSlope; + HI_U8 u8AaSlope; + HI_U8 u8VaSlope; + HI_U8 u8UuSlope; + HI_U8 au8LumThresh[16]; +}ADPT_SCENEAUTO_DEMOSAIC_S; + +typedef struct hiADPT_SCENEAUTO_SHARPEN_S +{ + HI_BOOL abEnLowLumaShoot[16]; + HI_U8 u8SharpenD[16]; + HI_U8 u8SharpenUd[16]; + HI_U8 u8OverShoot[16]; + HI_U8 u8UnderShoot[16]; + HI_U8 u8TextureNoiseThd[16]; + HI_U8 u8EdgeNoiseThd[16]; +}ADPT_SCENEAUTO_SHARPEN_S; + +typedef struct hiADPT_SCENEAUTO_DP_S +{ + HI_U16 u16Slope[16]; +}ADPT_SCENEAUTO_DP_S; + +typedef struct hiADPT_SCENEAUTO_PUBATTR_S +{ + HI_U32 u32Frame; +} ADPT_SCENEAUTO_PUBATTR_S; + +typedef struct hiADPT_SCENEAUTO_GAMMA_S +{ + HI_U8 u8CurveType; + HI_U16 au16GammaTable[257]; +}ADPT_SCENEAUTO_GAMMA_S; + +typedef struct hiADPT_SCENEAUTO_H264TRANS_S +{ + HI_S32 chroma_qp_index_offset; +}ADPT_SCENEAUTO_H264TRANS_S; + +typedef struct hiADPT_SCENEAUTO_H264_DEBLOCK_S +{ + HI_U32 disable_deblocking_filter_idc; + HI_S32 slice_alpha_c0_offset_div2; + HI_S32 slice_beta_offset_div2; +}ADPT_SCENEAUTO_H264_DEBLOCK_S; + +typedef struct hiADPT_SCENEAUTO_H264_RCPARAM_S +{ + HI_U32 u32ThrdI[12]; + HI_U32 u32ThrdP[12]; + HI_U32 u32QpDelta; + HI_S32 s32IPQPDelta; +}ADPT_SCENEAUTO_H264_RCPARAM_S; + +typedef struct hiADPT_SCENEAUTO_AEROUTE_NODE_S +{ + HI_U32 u32IntTime; + HI_U32 u32SysGain; +}ADPT_SCENEAUTO_AEROUTE_NODE_S; + +typedef struct hiADPT_SCENEAUTO_AEROUTE_S +{ + HI_U32 u32TotalNum; + ADPT_SCENEAUTO_AEROUTE_NODE_S astRouteNode[8]; +}ADPT_SCENEAUTO_AEROUTE_S; + +typedef struct hiADPT_SCENEAUTO_DCIPARAM_S +{ + HI_BOOL bEnable; + HI_U32 u32BlackGain; + HI_U32 u32ContrastGain; + HI_U32 u32LightGain; +}ADPT_SCENEAUTO_DCIPARAM_S; + +typedef struct hiADPT_SCENEAUTO_RGBIRPARAM_S +{ + HI_BOOL bEnable; + HI_BOOL bRemovelEn; +}ADPT_SCENEAUTO_RGBIRPARAM_S; + +typedef struct hiADPT_SCENEAUTO_DRCATTR_S +{ + HI_BOOL bEnable; + HI_BOOL bManulEnable; + HI_U8 u8Strength; + + HI_U8 u8SpatialVar; + HI_U8 u8RangeVar; + + HI_U8 u8Asymmetry; + HI_U8 u8SecondPole; + HI_U8 u8Stretch; + + HI_U8 u8LocalMixingBrigtht; + HI_U8 u8LocalMixingDark; + HI_U8 u8LocalMixingThres; + + HI_U16 u16DarkGainLmtY; + HI_U16 u16DarkGainLmtC; + HI_U16 u16BrightGainLmt; + +}ADPT_SCENEAUTO_DRCATTR_S; + +typedef struct hiADPT_SCENEAUTO_SATURATION_S +{ + HI_U8 u8OpType; + HI_U8 u8ManualSat; + HI_U8 au8AutoSat[16]; +}ADPT_SCENEAUTO_SATURATION_S; + +typedef struct hiADPT_SCENEAUTO_DIS_ATTR_S +{ + HI_BOOL bEnable; +}ADPT_SCENEAUTO_DIS_ATTR_S; + +typedef struct hiADPT_SCENEAUTO_AEATTR_S +{ + HI_U8 u8Speed; + HI_U8 u8Tolerance; + HI_U8 u8ExpCompensation; + HI_U16 u16BlackDelayFrame; + HI_U16 u16WhiteDelayFrame; + HI_U8 u8AEStrategyMode; + HI_U8 u8MaxHistOffset; + HI_U16 u16HistRatioSlope; + HI_U32 u32SysGainMax; + HI_U32 u8AERunInterval; + HI_U8 au8AeWeight[AE_WEIGHT_ROW][AE_WEIGHT_COLUMN]; +}ADPT_SCENEAUTO_AEATTR_S; + +typedef struct hiADPT_SCENEAUTO_EXPOSUREINFO_S +{ + HI_U32 u32Exposure; + HI_U32 u32AGain; + HI_U32 u32DGain; + HI_U32 u32ISPDGain; + HI_U32 u32ExpTime; + HI_U8 u8AveLum; + HI_U32 u32Hist256Value[256]; + HI_U16 u16RgbirGain; +}ADPT_SCENEAUTO_EXPOSUREINFO_S; + +typedef struct hiADPT_SCENEAUTO_WDRATTR_S +{ + HI_U8 u8WdrMode; +}ADPT_SCENEAUTO_WDRATTR_S; + +typedef struct hiADPT_SCENEAUTO_STATEINFO_S +{ + HI_U32 u32DRCStrengthActual; + HI_U32 u32DefogStrengthActual; +}ADPT_SCENEAUTO_STATEINFO_S; + +typedef struct hiADPT_SCENEAUTO_DEFOG_ATTR_S +{ + HI_BOOL bEnable; +}ADPT_SCENEAUTO_DEFOG_ATTR_S; + +typedef struct hiADPT_SCENEAUTO_3DNR_S +{ + HI_S32 s32YPKStr; /* [ 0 .. 63 ] */ + HI_S32 s32YSFStr; /* [ 0 .. 200 ] */ + HI_S32 s32YTFStr; /* [ 0 .. 128 ] */ + HI_S32 s32TFStrMax; /* [ 0 .. 15 ] */ + HI_S32 s32YSmthStr; /* [ 0 .. 200 ] */ + HI_S32 s32YSmthRat; /* [ 0 .. 32 ] */ + HI_S32 s32YSFStrDlt; /* [ -128 .. 127 ] */ + HI_S32 s32YTFStrDlt; /* [ -64 .. 63 ] */ + HI_S32 s32YTFStrDl; /* [ 0 .. 31 ] */ + HI_S32 s32YSFBriRat; /* [ 0 .. 64 ] */ + HI_S32 s32CSFStr; /* [ 0 .. 80 ] */ + HI_S32 s32CTFstr; /* [ 0 .. 32 ] */ +}ADPT_SCENEAUTO_3DNR_ATTR_S; + +typedef struct hiADPT_SCENEAUTO_FPN_ATTR_S +{ + HI_BOOL bEnable; +}ADPT_SCENEAUTO_FPN_ATTR_S; + +typedef struct hiADPT_SCENEAUTO_CCM_ATTR_S +{ + HI_U16 u16HighColorTemp; + HI_U16 au16HighCCM[9]; + HI_U16 u16MidColorTemp; + HI_U16 au16MidCCM[9]; + HI_U16 u16LowColorTemp; + HI_U16 au16LowCCM[9]; +}ADPT_SCENEAUTO_CCM_ATTR_S; + +typedef struct hiADPT_SCENEAUTO_ACM_ATTR_S +{ + HI_BOOL bEnable; + HI_U32 u32CbcrThr; + HI_U32 u32GainLuma; + HI_U32 u32GainHue; + HI_U32 u32GainSat; +}ADPT_SCENEAUTO_ACM_ATTR_S; + + +typedef struct hiADPT_SCENEAUTO_VENC_ATTR_S +{ + ADPT_SCENEAUTO_VENC_RCMODE_E eRcMode; + HI_U32 u32BitRate; +}ADPT_SCENEAUTO_VENC_ATTR_S; + +typedef struct hiADPT_SCENEAUTO_H265_RCPARAM_S +{ + HI_U32 u32ThrdI[12]; + HI_U32 u32ThrdP[12]; + HI_U32 u32QpDelta; + HI_S32 s32IPQPDelta; +}ADPT_SCENEAUTO_H265_RCPARAM_S; +typedef struct hiADPT_SCENEAUTO_H265_FACE_CFG_S +{ + HI_U8 u8NormIntra4RdCost_I; + HI_U8 u8NormIntra8RdCost_I; + HI_U8 u8NormIntra16RdCost_I; + HI_U8 u8NormIntra32RdCost_I; + HI_U8 u8SkinIntra4RdCost_I; + HI_U8 u8SkinIntra8RdCost_I; + HI_U8 u8SkinIntra16RdCost_I; + HI_U8 u8SkinIntra32RdCost_I; + HI_U8 u8HedgeIntra4RdCost_I; + HI_U8 u8HedgeIntra8RdCost_I; + HI_U8 u8HedgeIntra16RdCost_I; + HI_U8 u8HedgeIntra32RdCost_I; + HI_U8 u8NormIntra4RdCost_P; + HI_U8 u8NormIntra8RdCost_P; + HI_U8 u8NormIntra16RdCost_P; + HI_U8 u8NormIntra32RdCost_P; + HI_U8 u8SkinIntra4RdCost_P; + HI_U8 u8SkinIntra8RdCost_P; + HI_U8 u8SkinIntra16RdCost_P; + HI_U8 u8SkinIntra32RdCost_P; + HI_U8 u8HedgeIntra4RdCost_P; + HI_U8 u8HedgeIntra8RdCost_P; + HI_U8 u8HedgeIntra16RdCost_P; + HI_U8 u8HedgeIntra32RdCost_P; + HI_U8 u8NormFme8RdCost_P; + HI_U8 u8NormFme16RdCost_P; + HI_U8 u8NormFme32RdCost_P; + HI_U8 u8NormFme64RdCost_P; + HI_U8 u8SkinFme8RdCost_P; + HI_U8 u8SkinFme16RdCost_P; + HI_U8 u8SkinFme32RdCost_P; + HI_U8 u8SkinFme64RdCost_P; + HI_U8 u8HedgeFme8RdCost_P; + HI_U8 u8HedgeFme16RdCost_P; + HI_U8 u8HedgeFme32RdCost_P; + HI_U8 u8HedgeFme64RdCost_P; + HI_U8 u8NormMerg8RdCost_P; + HI_U8 u8NormMerg16RdCost_P; + HI_U8 u8NormMerg32RdCost_P; + HI_U8 u8NormMerg64RdCost_P; + HI_U8 u8SkinMerg8RdCost_P; + HI_U8 u8SkinMerg16RdCost_P; + HI_U8 u8SkinMerg32RdCost_P; + HI_U8 u8SkinMerg64RdCost_P; + HI_U8 u8HedgeMerg8RdCost_P; + HI_U8 u8HedgeMerg16RdCost_P; + HI_U8 u8HedgeMerg32RdCost_P; + HI_U8 u8HedgeMerg64RdCost_P; + HI_BOOL bSkinEn_I; + HI_U32 u32SkinQpDelta_I; + HI_U8 u8SkinUMax_I; + HI_U8 u8SkinUMin_I; + HI_U8 u8SkinVMax_I; + HI_U8 u8SkinVMin_I; + HI_U32 u32SkinNum_I; + HI_BOOL bSkinEn_P; + HI_U32 u32SkinQpDelta_P; + HI_U8 u8SkinUMax_P; + HI_U8 u8SkinUMin_P; + HI_U8 u8SkinVMax_P; + HI_U8 u8SkinVMin_P; + HI_U32 u32SkinNum_P; + HI_U8 u8HedgeThr_I; + HI_U8 u8HedgeCnt_I; + HI_BOOL bStroEdgeEn_I; + HI_U32 u32StroEdgeQpDelta_I; + HI_U8 u8HedgeThr_P; + HI_U8 u8HedgeCnt_P; + HI_BOOL bStroEdgeEn_P; + HI_U32 u32StroEdgeQpDelta_P; + HI_BOOL bImproveEn_I; + HI_BOOL bImproveEn_P; + HI_U32 u32Norm32MaxNum_P; + HI_U32 u32Norm16MaxNum_P; + HI_U32 u32Norm32ProtectNum_P; + HI_U32 u32Norm16ProtectNum_P; + HI_U32 u32Skin32MaxNum_P; + HI_U32 u32Skin16MaxNum_P; + HI_U32 u32Skin32ProtectNum_P; + HI_U32 u32Skin16ProtectNum_P; + HI_U32 u32Still32MaxNum_P; + HI_U32 u32Still16MaxNum_P; + HI_U32 u32Still32ProtectNum_P; + HI_U32 u32Still16ProtectNum_P; + HI_U32 u32Hedge32MaxNum_P; + HI_U32 u32Hedge16MaxNum_P; + HI_U32 u32Hedge32ProtectNum_P; + HI_U32 u32Hedge16ProtectNum_P; +}ADPT_SCENEAUTO_H265_FACE_CFG_S; +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif diff --git a/device/mpp/sample/scene_auto/src/include/hi_sceneauto_comm_ext.h b/device/mpp/sample/scene_auto/src/include/hi_sceneauto_comm_ext.h new file mode 100644 index 0000000..bc5e758 --- /dev/null +++ b/device/mpp/sample/scene_auto/src/include/hi_sceneauto_comm_ext.h @@ -0,0 +1,70 @@ +#ifndef __HI_SCENEAUTO_COMM_EXT_H__ +#define __HI_SCENEAUTO_COMM_EXT_H__ + +#include "hi_type.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +HI_S32 CommSceneautoGetDemosaic(HI_S32 s32IspDev, ADPT_SCENEAUTO_DEMOSAIC_S *pstAdptDemosaic); +HI_S32 CommSceneautoSetDemosaic(HI_S32 s32IspDev, const ADPT_SCENEAUTO_DEMOSAIC_S *pstAdptDemosaic); +HI_S32 CommSceneautoGetSharpen(HI_S32 s32IspDev, ADPT_SCENEAUTO_SHARPEN_S *pstAdptSharpen); +HI_S32 CommSceneautoSetSharpen(HI_S32 s32IspDev, const ADPT_SCENEAUTO_SHARPEN_S *pstAdptSharpen); +HI_S32 CommSceneautoGetDP(HI_S32 s32IspDev, ADPT_SCENEAUTO_DP_S *pstAdptDP); +HI_S32 CommSceneautoSetDP(HI_S32 s32IspDev, const ADPT_SCENEAUTO_DP_S *pstAdptDP); +HI_S32 CommSceneautoGetGamma(HI_S32 s32IspDev, ADPT_SCENEAUTO_GAMMA_S *pstAdptGamma); +HI_S32 CommSceneautoSetGamma(HI_S32 s32IspDev, const ADPT_SCENEAUTO_GAMMA_S *pstAdptGamma); +HI_S32 CommSceneautoGetH264Trans(HI_S32 s32VencChn, ADPT_SCENEAUTO_H264TRANS_S *pstAdptH264Trans); +HI_S32 CommSceneautoSetH264Trans(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H264TRANS_S *pstAdptH264Trans); +HI_S32 CommSceneautoGetH24Deblock(HI_S32 s32VencChn, ADPT_SCENEAUTO_H264_DEBLOCK_S *pstAdptH264Deblock); +HI_S32 CommSceneautoSetH24Deblock(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H264_DEBLOCK_S *pstAdptH264Deblock); +HI_S32 CommSceneautoGetH264RcParam(HI_S32 s32VencChn, ADPT_SCENEAUTO_H264_RCPARAM_S *pstAdptRCParam); +HI_S32 CommSceneautoSetH264RcParam(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H264_RCPARAM_S *pstAdptRCParam); +HI_S32 CommSceneautoGetAERoute(HI_S32 s32IspDev, ADPT_SCENEAUTO_AEROUTE_S *pstAdptAERoute); +HI_S32 CommSceneautoSetAERoute(HI_S32 s32IspDev, const ADPT_SCENEAUTO_AEROUTE_S *pstAdptAERoute); +HI_S32 CommSceneautoGetDCIParam(HI_S32 s32ViDev, ADPT_SCENEAUTO_DCIPARAM_S *pstAdptDCIPara); +HI_S32 CommSceneautoGetRgbirParam(HI_S32 s32IspDev, ADPT_SCENEAUTO_RGBIRPARAM_S *pstAdptRgbirPara); +HI_S32 CommSceneautoSetRgbirParam(HI_S32 s32IspDev, ADPT_SCENEAUTO_RGBIRPARAM_S *pstAdptRgbirPara); +HI_S32 CommSceneautoSetDCIParam(HI_S32 s32ViDev, const ADPT_SCENEAUTO_DCIPARAM_S *pstAdptDCIPara); +HI_S32 CommSceneautoGetDRCAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_DRCATTR_S *pstAdptDRCAttr); +HI_S32 CommSceneautoSetDRCAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_DRCATTR_S *pstAdptDRCAttr); +HI_S32 CommSceneautoGetSaturation(HI_S32 s32IspDev, ADPT_SCENEAUTO_SATURATION_S *pstAdptSaturation); +HI_S32 CommSceneautoSetSaturation(HI_S32 s32IspDev, const ADPT_SCENEAUTO_SATURATION_S *pstAdptSaturation); +HI_S32 CommSceneautoGetDISAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_DIS_ATTR_S *pstAdptDisAttr); +HI_S32 CommSceneautoSetDISAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_DIS_ATTR_S *pstAdptDisAttr); +HI_S32 CommSceneautoGetAEAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_AEATTR_S *pstAdptAEAttr); +HI_S32 CommSceneautoSetAEAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_AEATTR_S *pstAdptAEAttr); +HI_S32 CommSceneautoGetExposureInfo(HI_S32 s32IspDev, ADPT_SCENEAUTO_EXPOSUREINFO_S *pstAdptExposureInfo); +HI_S32 CommSceneautoGetWDRAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_WDRATTR_S *pstAdptWDRAttr); +HI_S32 CommSceneautoGetQueryInnerStateInfo(HI_S32 s32IspDev, ADPT_SCENEAUTO_STATEINFO_S *pstAdptStatInfo); +HI_S32 CommSceneautoGetBitrate(HI_S32 s32VencChn, HI_U32 *pu32Bitrate); +HI_S32 CommSceneautoGetDefogAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_DEFOG_ATTR_S *pstAdptDefogAttr); +HI_S32 CommSceneautoGet3DNRAttr(HI_S32 s32VpssGrp, ADPT_SCENEAUTO_3DNR_ATTR_S * pstAdpt3dnrAttr); +HI_S32 CommSceneautoSet3DNRAttr(HI_S32 s32VpssGrp, ADPT_SCENEAUTO_3DNR_ATTR_S * pstAdpt3dnrAttr); +HI_S32 CommSceneautoSetFPNAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_FPN_ATTR_S* pstAdptFpnAttr); +HI_S32 CommSceneautoGetVencAttr(HI_S32 s32VencChn, ADPT_SCENEAUTO_VENC_ATTR_S* pstAdptVencAttr); +HI_S32 CommSceneautoGetH265FaceCfg(HI_S32 s32VencChn, ADPT_SCENEAUTO_H265_FACE_CFG_S* pstAdptH265FaceCfg); +HI_S32 CommSceneautoSetH265FaceCfg(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H265_FACE_CFG_S* pstAdptH265FaceCfg); +HI_S32 CommSceneautoGetH265RcParam(HI_S32 s32VencChn, ADPT_SCENEAUTO_H265_RCPARAM_S* pstAdptH265RCParam); +HI_S32 CommSceneautoSetH265RcParam(HI_S32 s32VencChn, const ADPT_SCENEAUTO_H265_RCPARAM_S* pstAdptH265RCParam); +HI_S32 CommSceneautoGetCcmAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_CCM_ATTR_S* pstAdptCcmAttr); +HI_S32 CommSceneautoSetCcmAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_CCM_ATTR_S* pstAdptCcmAttr); +HI_S32 CommSceneautoGetAcmAttr(HI_S32 s32IspDev, ADPT_SCENEAUTO_ACM_ATTR_S* pstAdptAcmAttr); +HI_S32 CommSceneautoSetAcmAttr(HI_S32 s32IspDev, const ADPT_SCENEAUTO_ACM_ATTR_S* pstAdptAcmAttr); +HI_S32 CommSceneautoSetRegister(HI_S32 s32IspDev, HI_U32 u32Addr, HI_U32 u32Vaule); +HI_S32 CommSceneautoIVEStart(HI_S32 s32VpssGrp, HI_S32 s32VpssChn); +HI_S32 CommSceneautoIVEStop(); +HI_S32 CommSceneautoGetRgbirParam(HI_S32 s32IspDev, ADPT_SCENEAUTO_RGBIRPARAM_S *pstAdptRgbirPara); +HI_S32 CommSceneautoSetRgbirParam(HI_S32 s32IspDev, ADPT_SCENEAUTO_RGBIRPARAM_S *pstAdptRgbirPara); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif diff --git a/device/mpp/sample/scene_auto/src/include/hi_sceneauto_define.h b/device/mpp/sample/scene_auto/src/include/hi_sceneauto_define.h new file mode 100644 index 0000000..e15e195 --- /dev/null +++ b/device/mpp/sample/scene_auto/src/include/hi_sceneauto_define.h @@ -0,0 +1,583 @@ +#ifndef _HI_SCENEAUTO_DEFINE_H_ +#define _HI_SCENEAUTO_DEFINE_H_ + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* __cplusplus */ + +#define EXPOSURE_LEVEL 16 +#define AE_WEIGHT_ROW 15 +#define AE_WEIGHT_COLUMN 17 + +typedef struct hiSCENEAUTO_INIPARAM_MPINFO_S +{ + HI_S32 s32IspDev; + HI_S32 s32ViDev; + HI_S32 s32ViChn; + HI_S32 s32VpssGrp; + HI_S32 s32VpssChn; + HI_S32 s32VencGrp; + HI_S32 s32VencChn; +} SCENEAUTO_INIPARAM_MPINFO_S; + +typedef struct hiSCENEAUTO_DEMOSAIC_S +{ + HI_U8 u8VhSlope; + HI_U8 u8AaSlope; + HI_U8 u8VaSlope; + HI_U8 u8UuSlope; + HI_U8 au8LumThresh[16]; +} SCENEAUTO_DEMOSAIC_S; + +typedef struct hiSCENEAUTO_AERELATEDBIT_S +{ + HI_U8 u8Speed; + HI_U8 u8Tolerance; + HI_U16 u16BlackDelayFrame; + HI_U16 u16WhiteDelayFrame; + HI_U32 u32SysGainMax; +}SCENEAUTO_AERELATEDBIT_S; + +typedef struct hiSCENEAUTO_AERELATEDEXP_S +{ + HI_U8 u8AECompesation; + HI_U8 u8AEHistOffset; +}SCENEAUTO_AERELATEDEXP_S; + +//modified by z00271306,2015/01/27 +typedef struct hiSCENEAUTO_SHARPEN_S +{ + HI_BOOL abEnLowLumaShoot[16]; + HI_U8 u8SharpenD[16]; + HI_U8 u8SharpenUd[16]; + HI_U8 u8OverShoot[16]; + HI_U8 u8UnderShoot[16]; + HI_U8 u8TextureNoiseThd[16]; + HI_U8 u8EdgeNoiseThd[16]; +}SCENEAUTO_SHARPEN_S; + +typedef struct hiSCENEAUTO_DEPATTR_S +{ + HI_U16 u16Slope[16]; +}SCENEAUTO_DEPATTR_S; + +typedef struct hiSCENEAUTO_GAMMA_S +{ + HI_U8 u8CurveType; + HI_U16 u16Table[257]; +}SCENEAUTO_GAMMA_S; + +typedef struct hiSCENEAUTO_ACM_S +{ + HI_BOOL bEnable; + HI_U32 u32CbcrThr; + HI_U32 u32GainLuma; + HI_U32 u32GainHue; + HI_U32 u32GainSat; +}SCENEAUTO_ACM_S; + +typedef struct hiSCENEAUTO_CCM_S +{ + HI_U16 u16HighColorTemp; + HI_U16 au16HighCCM[9]; + HI_U16 u16MidColorTemp; + HI_U16 au16MidCCM[9]; + HI_U16 u16LowColorTemp; + HI_U16 au16LowCCM[9]; +}SCENEAUTO_CCM_S; + +typedef struct hiSCENEAUTO_H264DBLK_S +{ + HI_U32 disable_deblocking_filter_idc; + HI_S32 slice_alpha_c0_offset_div2; + HI_S32 slice_beta_offset_div2; +}SCENEAUTO_H264DBLK_S; + + +typedef struct hiSCENEAUTO_H264VENC_S +{ + HI_U32 u32ThrdI[12]; + HI_U32 u32ThrdP[12]; + HI_U32 u32DeltaQP; + HI_S32 s32IPQPDelta; + HI_S32 s32chroma_qp_index_offset; + SCENEAUTO_H264DBLK_S stH264Dblk; +}SCENEAUTO_H264VENC_S; + +typedef struct hiSCENEAUTO_ROUTE_NODE_S +{ + HI_U32 u32IntTime; + HI_U32 u32SysGain; +}SCENEAUTO_ROUTE_NODE_S; + +typedef struct hiSCENEAUTO_INIPARAM_DRC_S +{ + HI_BOOL bDRCEnable; + HI_BOOL bDRCManulEnable; + HI_U8 u8Strength; + + HI_U8 u8SpatialVar; + HI_U8 u8RangeVar; + + HI_U8 u8Asymmetry; + HI_U8 u8SecondPole; + HI_U8 u8Stretch; + + HI_U8 u8LocalMixingBrigtht; + HI_U8 u8LocalMixingDark; + HI_U8 u8LocalMixingThres; + + HI_U16 u16DarkGainLmtY; + HI_U16 u16DarkGainLmtC; + HI_U16 u16BrightGainLmt; +}SCENEAUTO_INIPARAM_DRC_S; + +typedef struct hiSCENEAUTO_INIPARAM_DYNAMIC_S +{ + HI_S32 s32TotalNum; + SCENEAUTO_ROUTE_NODE_S *pstRouteNode; +}SCENEAUTO_INIPARAM_DYNAMIC_S; + +typedef struct hiSCENEAUTO_INIPARAM_BLC_S +{ + HI_U8 u8AEStrategyMode; + HI_U8 u8MaxHistOffset; + HI_U16 u16HistRatioSlope; +}SCENEAUTO_INIPARAM_BLC_S; + +typedef struct hiSCENEAUTO_INIPARAM_3DNRCFG_S +{ + HI_S32 s32YPKStr; /* [ 0 .. 63 ] */ + + HI_S32 s32YSFStr; /* [ 0 .. 200 ] */ + HI_S32 s32YTFStr; /* [ 0 .. 128 ] */ + + HI_S32 s32TFStrMax /* [ 0 .. 15 ] */; + + HI_S32 s32YSmthStr; /* [ 0 .. 200 ] */ + HI_S32 s32YSmthRat; /* [ 0 .. 32 ] */ + + HI_S32 s32YSFStrDlt; /* [ -128 .. 127 ] */ + HI_S32 s32YTFStrDlt; /* [ -64 .. 63 ] */ + HI_S32 s32YTFStrDl; /* [ 0 .. 31 ] */ + + HI_S32 s32YSFBriRat; /* [ 0 .. 64 ] */ + + HI_S32 s32CSFStr; /* [ 0 .. 80 ] */ + HI_S32 s32CTFstr; /* [ 0 .. 32 ] */ +}SCENEAUTO_INIPARAM_3DNRCFG_S; + +typedef struct hiSCENEAUTO_INIPARAM_IR_S +{ + HI_S32 s32ExpCount; + HI_U32* pu32ExpThreshLtoH; + HI_U32* pu32ExpThreshHtoL; + HI_U8* pu8ExpCompensation; + HI_U8* pu8MaxHistOffset; + + HI_U16 u16HistRatioSlope; + HI_U16 u16BlackDelayFrame; + HI_U16 u16WhiteDelayFrame; + HI_U8 u8Speed; + HI_U8 u8Tolerance; + HI_BOOL bDCIEnable; + HI_U32 u32DCIBlackGain; + HI_U32 u32DCIContrastGain; + HI_U32 u32DCILightGain; + HI_U16 u16Slope[16]; + HI_BOOL abEnLowLumaShoot[16]; + HI_U8 u8SharpenD[16]; + HI_U8 u8SharpenUd[16]; + HI_U8 u8OverShoot[16]; + HI_U8 u8UnderShoot[16]; + HI_U8 u8TextureNoiseThd[16]; + HI_U8 u8EdgeNoiseThd[16]; + HI_U16 u16GammaTable[257]; + HI_U8 au8Weight[AE_WEIGHT_ROW][AE_WEIGHT_COLUMN]; + HI_S32 s323DnrIsoCount; + HI_U32 *pu323DnrIsoThresh; + SCENEAUTO_INIPARAM_3DNRCFG_S *pst3dnrParam; +}SCENEAUTO_INIPARAM_IR_S; + +typedef struct hiSCENEAUTO_INIPARAM_HLC_S +{ + HI_U8 u8ExpCompensation; + HI_U8 u8Saturation[16]; + HI_U16 u16BlackDelayFrame; + HI_U16 u16WhiteDelayFrame; + HI_U8 u8Speed; + HI_U16 u16HistRatioSlope; + HI_U8 u8MaxHistOffset; + HI_U8 u8Tolerance; + HI_BOOL bDCIEnable; + HI_U32 u32DCIBlackGain; + HI_U32 u32DCIContrastGain; + HI_U32 u32DCILightGain; + HI_BOOL bDRCEnable; + HI_BOOL bDRCManulEnable; + HI_U32 u32DRCStrengthTarget; + HI_U16 u16GammaTable[257]; + HI_BOOL abEnLowLumaShoot[16]; + HI_U8 u8SharpenD[16]; + HI_U8 u8SharpenUd[16]; + HI_U8 u8OverShoot[16]; + HI_U8 u8UnderShoot[16]; + HI_U8 u8TextureNoiseThd[16]; + HI_U8 u8EdgeNoiseThd[16]; + HI_S32 s323DnrIsoCount; + HI_U32 *pu323DnrIsoThresh; + SCENEAUTO_INIPARAM_3DNRCFG_S *pst3dnrParam; +}SCENEAUTO_INIPARAM_HLC_S; + +typedef struct hiSCENEAUTO_INIPARAM_3DNR_S +{ + HI_S32 s323DnrIsoCount; + HI_U32 *pu323DnrIsoThresh; + SCENEAUTO_INIPARAM_3DNRCFG_S *pst3dnrParam; +} SCENEAUTO_INIPARAM_3DNR_S; + +typedef struct hiSCENEAUTO_H265VENC_FACECFG_S +{ + HI_U8 u8NormIntra4RdCost_I; + HI_U8 u8NormIntra8RdCost_I; + HI_U8 u8NormIntra16RdCost_I; + HI_U8 u8NormIntra32RdCost_I; + HI_U8 u8SkinIntra4RdCost_I; + HI_U8 u8SkinIntra8RdCost_I; + HI_U8 u8SkinIntra16RdCost_I; + HI_U8 u8SkinIntra32RdCost_I; + HI_U8 u8HedgeIntra4RdCost_I; + HI_U8 u8HedgeIntra8RdCost_I; + HI_U8 u8HedgeIntra16RdCost_I; + HI_U8 u8HedgeIntra32RdCost_I; + HI_U8 u8NormIntra4RdCost_P; + HI_U8 u8NormIntra8RdCost_P; + HI_U8 u8NormIntra16RdCost_P; + HI_U8 u8NormIntra32RdCost_P; + HI_U8 u8SkinIntra4RdCost_P; + HI_U8 u8SkinIntra8RdCost_P; + HI_U8 u8SkinIntra16RdCost_P; + HI_U8 u8SkinIntra32RdCost_P; + HI_U8 u8HedgeIntra4RdCost_P; + HI_U8 u8HedgeIntra8RdCost_P; + HI_U8 u8HedgeIntra16RdCost_P; + HI_U8 u8HedgeIntra32RdCost_P; + HI_U8 u8NormFme8RdCost_P; + HI_U8 u8NormFme16RdCost_P; + HI_U8 u8NormFme32RdCost_P; + HI_U8 u8NormFme64RdCost_P; + HI_U8 u8SkinFme8RdCost_P; + HI_U8 u8SkinFme16RdCost_P; + HI_U8 u8SkinFme32RdCost_P; + HI_U8 u8SkinFme64RdCost_P; + HI_U8 u8HedgeFme8RdCost_P; + HI_U8 u8HedgeFme16RdCost_P; + HI_U8 u8HedgeFme32RdCost_P; + HI_U8 u8HedgeFme64RdCost_P; + HI_U8 u8NormMerg8RdCost_P; + HI_U8 u8NormMerg16RdCost_P; + HI_U8 u8NormMerg32RdCost_P; + HI_U8 u8NormMerg64RdCost_P; + HI_U8 u8SkinMerg8RdCost_P; + HI_U8 u8SkinMerg16RdCost_P; + HI_U8 u8SkinMerg32RdCost_P; + HI_U8 u8SkinMerg64RdCost_P; + HI_U8 u8HedgeMerg8RdCost_P; + HI_U8 u8HedgeMerg16RdCost_P; + HI_U8 u8HedgeMerg32RdCost_P; + HI_U8 u8HedgeMerg64RdCost_P; + HI_BOOL bSkinEn_I; + HI_U32 u32SkinQpDelta_I; + HI_U8 u8SkinUMax_I; + HI_U8 u8SkinUMin_I; + HI_U8 u8SkinVMax_I; + HI_U8 u8SkinVMin_I; + HI_U32 u32SkinNum_I; + HI_BOOL bSkinEn_P; + HI_U32 u32SkinQpDelta_P; + HI_U8 u8SkinUMax_P; + HI_U8 u8SkinUMin_P; + HI_U8 u8SkinVMax_P; + HI_U8 u8SkinVMin_P; + HI_U32 u32SkinNum_P; + HI_U8 u8HedgeThr_I; + HI_U8 u8HedgeCnt_I; + HI_BOOL bStroEdgeEn_I; + HI_U32 u32StroEdgeQpDelta_I; + HI_U8 u8HedgeThr_P; + HI_U8 u8HedgeCnt_P; + HI_BOOL bStroEdgeEn_P; + HI_U32 u32StroEdgeQpDelta_P; + HI_BOOL bImproveEn_I; + HI_BOOL bImproveEn_P; + HI_U32 u32Norm32MaxNum_P; + HI_U32 u32Norm16MaxNum_P; + HI_U32 u32Norm32ProtectNum_P; + HI_U32 u32Norm16ProtectNum_P; + HI_U32 u32Skin32MaxNum_P; + HI_U32 u32Skin16MaxNum_P; + HI_U32 u32Skin32ProtectNum_P; + HI_U32 u32Skin16ProtectNum_P; + HI_U32 u32Still32MaxNum_P; + HI_U32 u32Still16MaxNum_P; + HI_U32 u32Still32ProtectNum_P; + HI_U32 u32Still16ProtectNum_P; + HI_U32 u32Hedge32MaxNum_P; + HI_U32 u32Hedge16MaxNum_P; + HI_U32 u32Hedge32ProtectNum_P; + HI_U32 u32Hedge16ProtectNum_P; +}SCENEAUTO_H265VENC_FACECFG_S; +typedef struct hiSCENEAUTO_H265VENC_RCPARAM_S +{ + HI_U32 u32ThrdI[12]; + HI_U32 u32ThrdP[12]; + HI_U32 u32DeltaQP; + HI_S32 s32IPQPDelta; +}SCENEAUTO_H265VENC_RCPARAM_S; +typedef struct hiSCENEAUTO_INIPARAM_H265VENC_FACECFG_S +{ + HI_S32 s32BitrateCount; + HI_U32 *pu32BitrateThresh; + HI_S32 s32ExpCount; + HI_U32 *pu32ExpThresh; + SCENEAUTO_H265VENC_FACECFG_S *pstH265VencFaceCfg; +}SCENEAUTO_INIPARAM_H265VENC_FACECFG_S; +typedef struct hiSCENEAUTO_INIPARAM_H265VENC_RCPARAM_S +{ + HI_S32 s32BitrateCount; + HI_U32 *pu32BitrateThresh; + SCENEAUTO_H265VENC_RCPARAM_S *pstH265VencRcParam; +}SCENEAUTO_INIPARAM_H265VENC_RCPARAM_S; +typedef struct hiSCENEAUTO_INIPARAM_H265VENC_S +{ + SCENEAUTO_INIPARAM_H265VENC_RCPARAM_S stIniH265VencRcParam; + SCENEAUTO_INIPARAM_H265VENC_FACECFG_S stIniH265VencFaceCfg; +}SCENEAUTO_INIPARAM_H265VENC_S; +typedef struct hiSCENEAUTO_H265VENC_S +{ + SCENEAUTO_H265VENC_RCPARAM_S stH265VencRcParam; + SCENEAUTO_H265VENC_FACECFG_S stH265VencFaceCfg; +}SCENEAUTO_H265VENC_S; + +typedef struct hiSCENEAUTO_INIPARAM_H264VENC_S +{ + HI_S32 s32BitrateCount; + HI_U32 *pu32BitrateThresh; + SCENEAUTO_H264VENC_S *pstH264Venc; +}SCENEAUTO_INIPARAM_H264VENC_S; + +typedef struct hiSCENEAUTO_INIPARAM_ACM_S +{ + HI_BOOL bAcmEnable; + + HI_U16 u16HighColorTempAcmOn; + HI_U16 u16MidColorTempAcmOn; + HI_U16 u16LowColorTempAcmOn; + HI_U16 au16HighCCMAcmOn[9]; + HI_U16 au16MidCCMAcmOn[9]; + HI_U16 au16LowCCMAcmOn[9]; + + HI_U16 u16HighColorTempAcmOff; + HI_U16 u16MidColorTempAcmOff; + HI_U16 u16LowColorTempAcmOff; + HI_U16 au16HighCCMAcmOff[9]; + HI_U16 au16MidCCMAcmOff[9]; + HI_U16 au16LowCCMAcmOff[9]; +}SCENEAUTO_INIPARAM_CCM_S; + +typedef struct hiSCENEAUTO_INIPARAM_GAMMA_S +{ + HI_S32 s32ExpCount; + HI_U32 u32DelayCount; + HI_S32 s32Interval; + HI_U32* pu32ExpThreshLtoD; + HI_U32* pu32ExpThreshDtoL; + SCENEAUTO_GAMMA_S* pstGamma; +}SCENEAUTO_INIPARAM_GAMMA_S; + +typedef struct hiSCENEAUTO_INIPARAM_DP_S +{ + HI_S32 s32ExpCount; + HI_U32 *pu32ExpThresh; + SCENEAUTO_DEPATTR_S *pstDPAttr; +}SCENEAUTO_INIPARAM_DP_S; + +typedef struct hiSCENEAUTO_INIPARAM_SHARPEN_S +{ + HI_S32 s32BitrateCount; + HI_S32 s32IsoThresh; + HI_S32 s32ExpCount; + HI_U32 *pu32BitrateThresh; + HI_U32 *pu32ExpThresh; + SCENEAUTO_SHARPEN_S *pstSharpen; +}SCENEAUTO_INIPARAM_SHARPEN_S; + +typedef struct hiSCENEAUTO_INIPARAM_DEMOSAIC_S +{ + HI_S32 s32BitrateCount; + HI_U32 *pu32BitrateThresh; + HI_S32 s32ExpCount; + HI_U32 *pu32ExpThresh; + SCENEAUTO_DEMOSAIC_S *pstDemosaic; +}SCENEAUTO_INIPARAM_DEMOSAIC_S; + +typedef struct hiSCENEAUTO_INIPARAM_AE_S +{ + HI_U8 u8AERunInterval; + HI_S32 s32BitrateCount; + HI_U32 *pu32BitrateThresh; + SCENEAUTO_AERELATEDBIT_S *pstAERelatedBit; + HI_S32 s32ExpCount; + HI_U32 *pu32AEExpDtoLThresh; + HI_U32 *pu32AEExpLtoDThresh; + SCENEAUTO_AERELATEDEXP_S *pstAERelatedExp; +}SCENEAUTO_INIPARAM_AE_S; + +typedef struct hiSCENEAUTO_INIPARAM_NRPROFILE_S +{ + HI_U8 au8NpDefault1[128]; + HI_U8 au8NpDefault2[128]; + HI_U8 au8Np1[128]; + HI_U8 au8Np2[128]; + HI_U32 u32ExpLow; + HI_U32 u32ExpHigh; +}SCENEAUTO_INIPARAM_NRPROFILE_S; + +typedef struct hiSCENEAUTO_INIPARAM_THRESHVALUE_S +{ + HI_BOOL bIVEEnable; + HI_BOOL bHLCAutoEnable; + HI_U32 u32HLCOnThresh; + HI_U32 u32HLCOffThresh; + HI_U32 u32HLCTolerance; + HI_U32 u32HLCExpThresh; + HI_U32 u32HLCCount; + HI_U32 u32AveLumThresh; + HI_U32 u32DeltaDisExpThreash; + HI_U32 u32FpnExpThresh; + HI_U32 u32DRCStrengthThresh; +}SCENEAUTO_INIPARAM_THRESHVALUE_S; + +typedef struct hiSCENEAUTO_INIPARA_S +{ + HI_U8 au8DciStrengthLut[111]; + SCENEAUTO_INIPARAM_MPINFO_S stMpInfo; + SCENEAUTO_INIPARAM_THRESHVALUE_S stThreshValue; + SCENEAUTO_INIPARAM_NRPROFILE_S stIniNRProfile; + SCENEAUTO_INIPARAM_AE_S stIniAE; + SCENEAUTO_INIPARAM_DEMOSAIC_S stIniDemosaic; + SCENEAUTO_INIPARAM_SHARPEN_S stIniSharpen; + SCENEAUTO_INIPARAM_DP_S stIniDP; + SCENEAUTO_INIPARAM_GAMMA_S stIniGamma; + SCENEAUTO_INIPARAM_CCM_S stIniCcm; + SCENEAUTO_INIPARAM_H264VENC_S stIniH264Venc; + SCENEAUTO_INIPARAM_H265VENC_S stIniH265Venc; + SCENEAUTO_INIPARAM_3DNR_S stIni3dnr; + SCENEAUTO_INIPARAM_HLC_S stHLC; + SCENEAUTO_INIPARAM_IR_S stIR; + SCENEAUTO_INIPARAM_BLC_S stBLC; + SCENEAUTO_INIPARAM_DYNAMIC_S stFastDynamic; + SCENEAUTO_INIPARAM_DYNAMIC_S stNormalDynamic; + SCENEAUTO_INIPARAM_DRC_S stDRC; +}SCENEAUTO_INIPARA_S; + +typedef struct hiSCENEAUTO_AEATTR_S +{ + HI_U8 u8Speed; + HI_U8 u8Tolerance; + HI_U16 u16BlackDelayFrame; + HI_U16 u16WhiteDelayFrame; + HI_U8 u8ExpCompensation; + HI_U8 u8AEStrategyMode; + HI_U8 u8MaxHistOffset; + HI_U16 u16HistRatioSlope; + HI_U32 u32SysGainMax; + HI_U8 u8AERunInterval; + HI_U8 au8AeWeight[AE_WEIGHT_ROW][AE_WEIGHT_COLUMN]; +}SCENEAUTO_AEATTR_S; + +typedef struct hiSCENEAUTO_DIS_S +{ + HI_BOOL bEnable; +}SCENEAUTO_DIS_S; + +typedef struct hiSCENEAUTO_SATURATION_S +{ + HI_U8 u8OpType; + HI_U8 u8ManualSat; + HI_U8 au8AutoSat[16]; +}SCENEAUTO_SATURATION_S; + +typedef struct hiSCENEAUTO_DRCATTR_S +{ + HI_BOOL bEnable; + HI_BOOL bManulEnable; + HI_U8 u8Strength; + + HI_U8 u8SpatialVar; + HI_U8 u8RangeVar; + + HI_U8 u8Asymmetry; + HI_U8 u8SecondPole; + HI_U8 u8Stretch; + + HI_U8 u8LocalMixingBrigtht; + HI_U8 u8LocalMixingDark; + HI_U8 u8LocalMixingThres; + + HI_U16 u16DarkGainLmtY; + HI_U16 u16DarkGainLmtC; + HI_U16 u16BrightGainLmt; +}SCENEAUTO_DRCATTR_S; + +typedef struct hiSCENEAUTO_DCIPARAM_S +{ + HI_BOOL bEnable; + HI_U32 u32BlackGain; + HI_U32 u32ContrastGain; + HI_U32 u32LightGain; +}SCENEAUTO_DCIPARAM_S; + +typedef struct hiSCENEAUTO_AEROUTE_NODE_S +{ + HI_U32 u32IntTime; + HI_U32 u32SysGain; +}SCENEAUTO_AEROUTE_NODE_S; + +typedef struct hiSCENEAUTO_AEROUTE_S +{ + HI_U32 u32TotalNum; + SCENEAUTO_AEROUTE_NODE_S astRouteNode[8]; +}SCENEAUTO_AEROUTE_S; + +typedef struct hiSCENEAUTO_PREVIOUSPARA_S +{ + SCENEAUTO_DEMOSAIC_S stDemosaic; + SCENEAUTO_SHARPEN_S stSharpen; + SCENEAUTO_DEPATTR_S stDP; + SCENEAUTO_GAMMA_S stGamma; + SCENEAUTO_CCM_S stCcm; + SCENEAUTO_ACM_S stAcm; + SCENEAUTO_H264VENC_S stH264Venc; + SCENEAUTO_H265VENC_S stH265Venc; + SCENEAUTO_AEROUTE_S stAERoute; + SCENEAUTO_DCIPARAM_S stDCIParam; + SCENEAUTO_DRCATTR_S stDRCAttr; + SCENEAUTO_SATURATION_S stSaturation; + SCENEAUTO_DIS_S stDis; + SCENEAUTO_AEATTR_S stAEAttr; + ADPT_SCENEAUTO_RGBIRPARAM_S stRgbirParam; + ADPT_SCENEAUTO_3DNR_ATTR_S st3dnr; +}SCENEAUTO_PREVIOUSPARA_S; + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif + diff --git a/device/mpp/sample/scene_auto/src/include/hi_srdk_sceneauto_define_ext.h b/device/mpp/sample/scene_auto/src/include/hi_srdk_sceneauto_define_ext.h new file mode 100644 index 0000000..ad320c6 --- /dev/null +++ b/device/mpp/sample/scene_auto/src/include/hi_srdk_sceneauto_define_ext.h @@ -0,0 +1,45 @@ +/****************************************************************************** + + Copyright (C), 2013-2023, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_srdk_sceneauto_define_ext.h + Version : Initial Draft + Author : Hisilicon BVR REF + Created : 2014/07/10 + History : + 1.Date : 2014/07/10 + Author : noodle + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_SRDK_SCENEAUTO_DEFINE_EXT_H__ +#define __HI_SRDK_SCENEAUTO_DEFINE_EXT_H__ + +typedef enum hiSRDK_SCENEAUTO_SEPCIAL_SCENE_E +{ + SRDK_SCENEAUTO_SPECIAL_SCENE_NONE = 0, + SRDK_SCENEAUTO_SPECIAL_SCENE_BLC, + SRDK_SCENEAUTO_SPECIAL_SCENE_IR, + SRDK_SCENEAUTO_SPECIAL_SCENE_HLC, + SRDK_SCENEAUTO_SPECIAL_SCENE_DYNAMIC, + SRDK_SCENEAUTO_SPECIAL_SCENE_DRC, + + SRDK_SCENEAUTO_SPECIAL_SCENE_BUTT +} SRDK_SCENEAUTO_SEPCIAL_SCENE_E; + +#ifdef __cplusplus +#if __cplusplus + extern "C"{ +#endif +#endif /* __cplusplus */ + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif diff --git a/device/mpp/sample/scene_auto/src/include/hi_srdk_sceneauto_ext.h b/device/mpp/sample/scene_auto/src/include/hi_srdk_sceneauto_ext.h new file mode 100644 index 0000000..2cb599a --- /dev/null +++ b/device/mpp/sample/scene_auto/src/include/hi_srdk_sceneauto_ext.h @@ -0,0 +1,94 @@ +/****************************************************************************** + + Copyright (C), 2013-2023, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : hi_srdk_sceneauto_ext.h + Version : Initial Draft + Author : Hisilicon BVR REF + Created : 2014/09/10 + History : + 1.Date : 2014/09/10 + Author : noodle + Modification: Created file + +******************************************************************************/ + +#ifndef __HI_SRDK_SCENEAUTO_EXT_H__ +#define __HI_SRDK_SCENEAUTO_EXT_H__ + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/***************************************************************************** +\brief SCENEAUTO init +\attention \n +\param[in] const HI_CHAR *pszFileName +\retval ::HI_SUCCESS +\retval ::HI_FAILURE +\see \n +:: \n +******************************************************************************/ +HI_S32 HI_SRDK_SCENEAUTO_Init(const HI_CHAR* pszFileName); + +/***************************************************************************** +\brief SCENEAUTO deinit +\attention \n +\retval ::HI_SUCCESS +\retval ::HI_FAILURE +\see \n +:: \n +******************************************************************************/ +HI_S32 HI_SRDK_SCENEAUTO_DeInit(); + +/***************************************************************************** +\brief SCENEAUTO start +\attention \n +\retval ::HI_SUCCESS +\retval ::HI_FAILURE +\see \n +:: \n +******************************************************************************/ +HI_S32 HI_SRDK_SCENEAUTO_Start(); + +/***************************************************************************** +\brief SCENEAUTO stop +\attention \n +\retval ::HI_SUCCESS +\retval ::HI_FAILURE +\see \n +:: \n +******************************************************************************/ +HI_S32 HI_SRDK_SCENEAUTO_Stop(); + +/***************************************************************************** +\brief SCENEAUTO set special scenemode +\attention \n +\retval ::HI_SUCCESS +\retval ::HI_FAILURE +\see \n +:: \n +******************************************************************************/ +HI_S32 HI_SRDK_SCENEAUTO_SetSpecialMode(const SRDK_SCENEAUTO_SEPCIAL_SCENE_E* peSpecialScene); + +/***************************************************************************** +\brief SCENEAUTO get special scenemode +\attention \n +\retval ::HI_SUCCESS +\retval ::HI_FAILURE +\see \n +:: \n +******************************************************************************/ +HI_S32 HI_SRDK_SCENEAUTO_GetSpecialMode(SRDK_SCENEAUTO_SEPCIAL_SCENE_E* peSpecialScene); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif diff --git a/device/mpp/sample/tde/Makefile b/device/mpp/sample/tde/Makefile new file mode 100644 index 0000000..d8093b3 --- /dev/null +++ b/device/mpp/sample/tde/Makefile @@ -0,0 +1,22 @@ +# Hisilicon Hi3531 sample Makefile + +include ../Makefile.param + + +# target source +SRC := $(wildcard *.c) +OBJ := $(SRC:%.c=%.o) + +MPI_LIBS += $(REL_LIB)/libtde.a $(SENSOR_LIBS) $(AUDIO_LIBA) + +TARGET := $(OBJ:%.o=%) +.PHONY : clean all + +all: $(TARGET) + +$(TARGET):%:%.o $(COMM_OBJ) + $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) + +clean: + @-rm -f $(TARGET) + @-rm -f $(OBJ) diff --git a/device/mpp/sample/tde/res/apple.bits b/device/mpp/sample/tde/res/apple.bits new file mode 100644 index 0000000..543c7e0 Binary files /dev/null and b/device/mpp/sample/tde/res/apple.bits differ diff --git a/device/mpp/sample/tde/res/apple.bmp b/device/mpp/sample/tde/res/apple.bmp new file mode 100644 index 0000000..62e513b Binary files /dev/null and b/device/mpp/sample/tde/res/apple.bmp differ diff --git a/device/mpp/sample/tde/res/applets.bits b/device/mpp/sample/tde/res/applets.bits new file mode 100644 index 0000000..0e2f4cd Binary files /dev/null and b/device/mpp/sample/tde/res/applets.bits differ diff --git a/device/mpp/sample/tde/res/applets.bmp b/device/mpp/sample/tde/res/applets.bmp new file mode 100644 index 0000000..ce86a91 Binary files /dev/null and b/device/mpp/sample/tde/res/applets.bmp differ diff --git a/device/mpp/sample/tde/res/background.bits b/device/mpp/sample/tde/res/background.bits new file mode 100644 index 0000000..f81e5d2 Binary files /dev/null and b/device/mpp/sample/tde/res/background.bits differ diff --git a/device/mpp/sample/tde/res/background.bmp b/device/mpp/sample/tde/res/background.bmp new file mode 100644 index 0000000..60418fb Binary files /dev/null and b/device/mpp/sample/tde/res/background.bmp differ diff --git a/device/mpp/sample/tde/res/calendar.bits b/device/mpp/sample/tde/res/calendar.bits new file mode 100644 index 0000000..0459276 Binary files /dev/null and b/device/mpp/sample/tde/res/calendar.bits differ diff --git a/device/mpp/sample/tde/res/calendar.bmp b/device/mpp/sample/tde/res/calendar.bmp new file mode 100644 index 0000000..54d5e0b Binary files /dev/null and b/device/mpp/sample/tde/res/calendar.bmp differ diff --git a/device/mpp/sample/tde/res/foot.bits b/device/mpp/sample/tde/res/foot.bits new file mode 100644 index 0000000..a975f01 Binary files /dev/null and b/device/mpp/sample/tde/res/foot.bits differ diff --git a/device/mpp/sample/tde/res/foot.bmp b/device/mpp/sample/tde/res/foot.bmp new file mode 100644 index 0000000..c8e88de Binary files /dev/null and b/device/mpp/sample/tde/res/foot.bmp differ diff --git a/device/mpp/sample/tde/res/gimp.bits b/device/mpp/sample/tde/res/gimp.bits new file mode 100644 index 0000000..4a0c855 Binary files /dev/null and b/device/mpp/sample/tde/res/gimp.bits differ diff --git a/device/mpp/sample/tde/res/gimp.bmp b/device/mpp/sample/tde/res/gimp.bmp new file mode 100644 index 0000000..0b4118a Binary files /dev/null and b/device/mpp/sample/tde/res/gimp.bmp differ diff --git a/device/mpp/sample/tde/res/gmush.bits b/device/mpp/sample/tde/res/gmush.bits new file mode 100644 index 0000000..2666d45 Binary files /dev/null and b/device/mpp/sample/tde/res/gmush.bits differ diff --git a/device/mpp/sample/tde/res/gmush.bmp b/device/mpp/sample/tde/res/gmush.bmp new file mode 100644 index 0000000..3ff1adc Binary files /dev/null and b/device/mpp/sample/tde/res/gmush.bmp differ diff --git a/device/mpp/sample/tde/res/gsame.bits b/device/mpp/sample/tde/res/gsame.bits new file mode 100644 index 0000000..f005d79 Binary files /dev/null and b/device/mpp/sample/tde/res/gsame.bits differ diff --git a/device/mpp/sample/tde/res/gsame.bmp b/device/mpp/sample/tde/res/gsame.bmp new file mode 100644 index 0000000..b14a0f7 Binary files /dev/null and b/device/mpp/sample/tde/res/gsame.bmp differ diff --git a/device/mpp/sample/tde/res/keys.bits b/device/mpp/sample/tde/res/keys.bits new file mode 100644 index 0000000..49f7a3c Binary files /dev/null and b/device/mpp/sample/tde/res/keys.bits differ diff --git a/device/mpp/sample/tde/res/keys.bmp b/device/mpp/sample/tde/res/keys.bmp new file mode 100644 index 0000000..63a8775 Binary files /dev/null and b/device/mpp/sample/tde/res/keys.bmp differ diff --git a/device/mpp/sample/tde/sample_tde b/device/mpp/sample/tde/sample_tde new file mode 100644 index 0000000..53cc089 Binary files /dev/null and b/device/mpp/sample/tde/sample_tde differ diff --git a/device/mpp/sample/tde/sample_tde.c b/device/mpp/sample/tde/sample_tde.c new file mode 100644 index 0000000..793db06 --- /dev/null +++ b/device/mpp/sample/tde/sample_tde.c @@ -0,0 +1,448 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hi_tde_api.h" +#include "hi_tde_type.h" +#include "hi_tde_errcode.h" +#include "hifb.h" + +#include "hi_comm_vo.h" +#include "mpi_sys.h" + +#include "mpi_vo.h" +#include "sample_comm.h" + + +#define TDE_PRINT printf + +#define VoDev 0 +#define VoChn 0 + + +#define MIN(x,y) ((x) > (y) ? (y) : (x)) +#define MAX(x,y) ((x) > (y) ? (x) : (y)) + +static const HI_CHAR *pszImageNames[] = +{ + "res/apple.bits", + "res/applets.bits", + "res/calendar.bits", + "res/foot.bits", + "res/gmush.bits", + "res/gimp.bits", + "res/gsame.bits", + "res/keys.bits" +}; + +#define N_IMAGES (HI_S32)((sizeof (pszImageNames) / sizeof (pszImageNames[0]))) + + +#define BACKGROUND_NAME "res/background.bits" + +#define PIXFMT TDE2_COLOR_FMT_ARGB1555 +#define BPP 2 +#define SCREEN_WIDTH 720 +#define SCREEN_HEIGHT 576 +#define CYCLE_LEN 60 + +static HI_S32 g_s32FrameNum; +static TDE2_SURFACE_S g_stScreen[2]; +static TDE2_SURFACE_S g_stBackGround; +static TDE2_SURFACE_S g_stImgSur[N_IMAGES]; + +HI_VOID SAMPLE_TDE_Usage(HI_CHAR *sPrgNm) +{ + printf("Usage : %s \n", sPrgNm); + printf("intf:\n"); + printf("\t 0) vo BT656 output, default.\n"); + printf("\t 1) vo LCD output.\n"); + + return; +} + +static HI_S32 TDE_CreateSurfaceByFile(const HI_CHAR *pszFileName, TDE2_SURFACE_S *pstSurface, HI_U8 *pu8Virt) +{ + FILE *fp; + HI_U32 colorfmt, w, h, stride; + + if((NULL == pszFileName) || (NULL == pstSurface)) + { + printf("%s, LINE %d, NULL ptr!\n", __FUNCTION__, __LINE__); + return -1; + } + + fp = fopen(pszFileName, "rb"); + if(NULL == fp) + { + printf("error when open pszFileName %s, line:%d\n", pszFileName, __LINE__); + return -1; + } + + fread(&colorfmt, 1, 4, fp); + fread(&w, 1, 4, fp); + fread(&h, 1, 4, fp); + fread(&stride, 1, 4, fp); + + pstSurface->enColorFmt = colorfmt; + pstSurface->u32Width = w; + pstSurface->u32Height = h; + pstSurface->u32Stride = stride; + pstSurface->u8Alpha0 = 0xff; + pstSurface->u8Alpha1 = 0xff; + pstSurface->bAlphaMax255 = HI_TRUE; + pstSurface->bAlphaExt1555 = HI_TRUE; + + fread(pu8Virt, 1, stride*h, fp); + + fclose(fp); + + return 0; +} + +static HI_VOID circumrotate (HI_U32 u32CurOnShow) +{ + TDE_HANDLE s32Handle; + TDE2_OPT_S stOpt = {0}; + HI_FLOAT eXMid, eYMid; + HI_FLOAT eRadius; + HI_U32 i; + HI_FLOAT f; + HI_U32 u32NextOnShow; + TDE2_RECT_S stSrcRect; + TDE2_RECT_S stDstRect; + HI_S32 s32Ret = HI_SUCCESS; + + u32NextOnShow = !u32CurOnShow; + + stOpt.enOutAlphaFrom = TDE2_COLORKEY_MODE_FOREGROUND; + stOpt.unColorKeyValue.struCkARGB.stRed.u8CompMask = 0xff; + stOpt.unColorKeyValue.struCkARGB.stGreen.u8CompMask = 0xff; + stOpt.unColorKeyValue.struCkARGB.stBlue.u8CompMask = 0xff; + stOpt.enColorKeyMode = TDE2_COLORKEY_MODE_FOREGROUND; + stOpt.unColorKeyValue.struCkARGB.stAlpha.bCompIgnore = HI_TRUE; + + f = (float) (g_s32FrameNum % CYCLE_LEN) / CYCLE_LEN; + + stSrcRect.s32Xpos = 0; + stSrcRect.s32Ypos = 0; + stSrcRect.u32Width = g_stBackGround.u32Width; + stSrcRect.u32Height = g_stBackGround.u32Height; + + eXMid = g_stBackGround.u32Width/2.16f; + eYMid = g_stBackGround.u32Height/2.304f; + + eRadius = MIN (eXMid, eYMid) / 2.0f; + + /* 1. start job */ + s32Handle = HI_TDE2_BeginJob(); + if(HI_ERR_TDE_INVALID_HANDLE == s32Handle) + { + TDE_PRINT("start job failed!\n"); + return ; + } + + /* 2. bitblt background to screen */ + s32Ret = HI_TDE2_QuickCopy(s32Handle, &g_stBackGround, &stSrcRect, + &g_stScreen[u32NextOnShow], &stSrcRect); + if(s32Ret < 0) + { + TDE_PRINT("Line:%d failed,ret=0x%x!\n", __LINE__, s32Ret); + HI_TDE2_CancelJob(s32Handle); + return ; + } + + for(i = 0; i < N_IMAGES; i++) + { + HI_FLOAT ang; + HI_FLOAT r; + + stSrcRect.s32Xpos = 0; + stSrcRect.s32Ypos = 0; + stSrcRect.u32Width = g_stImgSur[i].u32Width; + stSrcRect.u32Height = g_stImgSur[i].u32Height; + + /* 3. calculate new pisition */ + ang = 2.0f * (HI_FLOAT) M_PI * (HI_FLOAT) i / N_IMAGES - f * 2.0f * (HI_FLOAT) M_PI; + r = eRadius + (eRadius / 3.0f) * sinf (f * 2.0 * M_PI); + + stDstRect.s32Xpos = eXMid + r * cosf (ang) - g_stImgSur[i].u32Width / 2.0f; + stDstRect.s32Ypos = eYMid + r * sinf (ang) - g_stImgSur[i].u32Height / 2.0f; + stDstRect.u32Width = g_stImgSur[i].u32Width; + stDstRect.u32Height = g_stImgSur[i].u32Height; + + /* 4. bitblt image to screen */ + s32Ret = HI_TDE2_Bitblit(s32Handle, &g_stScreen[u32NextOnShow], &stDstRect, + &g_stImgSur[i], &stSrcRect, &g_stScreen[u32NextOnShow], &stDstRect, &stOpt); + if(s32Ret < 0) + { + TDE_PRINT("Line:%d,HI_TDE2_Bitblit failed,ret=0x%x!\n", __LINE__, s32Ret); + HI_TDE2_CancelJob(s32Handle); + return ; + } + } + + /* 5. submit job */ + s32Ret = HI_TDE2_EndJob(s32Handle, HI_FALSE, HI_TRUE, 10); + if(s32Ret < 0) + { + TDE_PRINT("Line:%d,HI_TDE2_EndJob failed,ret=0x%x!\n", __LINE__, s32Ret); + HI_TDE2_CancelJob(s32Handle); + return ; + } + + g_s32FrameNum++; + return; +} + +HI_S32 TDE_DrawGraphicSample(HI_U32 u32VoIntf) +{ + HI_U32 u32Size; + HI_S32 s32Fd; + HI_U32 u32Times; + HI_U8* pu8Screen; + HI_U8* pu8BackGroundVir; + + HI_U32 u32PhyAddr; + HI_S32 s32Ret = -1; + HI_U32 i = 0; + HI_BOOL bShow, bCompress; + HIFB_ALPHA_S stAlpha = {0}; + + struct fb_fix_screeninfo stFixInfo; + struct fb_var_screeninfo stVarInfo; + struct fb_bitfield stR32 = {10, 5, 0}; + struct fb_bitfield stG32 = {5, 5, 0}; + struct fb_bitfield stB32 = {0, 5, 0}; + struct fb_bitfield stA32 = {15, 1, 0}; + + /* 1. open tde device */ + HI_TDE2_Open(); + + /* 2. framebuffer operation */ + s32Fd = open("/dev/fb0", O_RDWR); + if (s32Fd == -1) + { + printf("open frame buffer device error\n"); + goto FB_OPEN_ERROR; + } + + bCompress = HI_FALSE ; + if (ioctl(s32Fd, FBIOPUT_COMPRESSION_HIFB, &bCompress) < 0) + { + printf(" FBIOPUT_COMPRESSION_HIFB failed!\n"); + close(s32Fd); + goto FB_PROCESS_ERROR2; + } + stAlpha.bAlphaChannel = HI_FALSE; + stAlpha.bAlphaEnable = HI_FALSE; + if (ioctl(s32Fd, FBIOPUT_ALPHA_HIFB, &stAlpha) < 0) + { + printf("Put alpha info failed!\n"); + goto FB_PROCESS_ERROR0; + } + + /* get the variable screen info */ + if (ioctl(s32Fd, FBIOGET_VSCREENINFO, &stVarInfo) < 0) + { + printf("Get variable screen info failed!\n"); + goto FB_PROCESS_ERROR0; + } + + if (0 == u32VoIntf) + { + stVarInfo.xres = SCREEN_WIDTH; + stVarInfo.yres = SCREEN_HEIGHT; + } + else + { + stVarInfo.xres = WIDTH_LCD; + stVarInfo.yres = HEIGHT_LCD; + } + + stVarInfo.xres_virtual = SCREEN_WIDTH; + stVarInfo.yres_virtual = SCREEN_HEIGHT * 2; + stVarInfo.activate = FB_ACTIVATE_NOW; + stVarInfo.bits_per_pixel = 16; + stVarInfo.xoffset = 0; + stVarInfo.yoffset = 0; + stVarInfo.red = stR32; + stVarInfo.green = stG32; + stVarInfo.blue = stB32; + stVarInfo.transp = stA32; + + if (ioctl(s32Fd, FBIOPUT_VSCREENINFO, &stVarInfo) < 0) + { + printf("process frame buffer device error\n"); + goto FB_PROCESS_ERROR0; + } + + if (ioctl(s32Fd, FBIOGET_FSCREENINFO, &stFixInfo) < 0) + { + printf("process frame buffer device error\n"); + goto FB_PROCESS_ERROR0; + } + + u32Size = stFixInfo.smem_len; + u32PhyAddr = stFixInfo.smem_start; + pu8Screen = mmap(NULL, u32Size, PROT_READ | PROT_WRITE, MAP_SHARED, s32Fd, 0); + if (NULL == pu8Screen) + { + printf("mmap fb0 failed!\n"); + goto FB_PROCESS_ERROR0; + } + memset(pu8Screen, 0x00, stFixInfo.smem_len); + + /* 3. create surface */ + g_stScreen[0].enColorFmt = PIXFMT; + g_stScreen[0].u32PhyAddr = u32PhyAddr; + g_stScreen[0].u32Width = SCREEN_WIDTH; + g_stScreen[0].u32Height = SCREEN_HEIGHT; + g_stScreen[0].u32Stride = stFixInfo.line_length; + g_stScreen[0].bAlphaMax255 = HI_TRUE; + + g_stScreen[1] = g_stScreen[0]; + g_stScreen[1].u32PhyAddr = g_stScreen[0].u32PhyAddr + g_stScreen[0].u32Stride * g_stScreen[0].u32Height; + + /* allocate memory (720*576*2*N_IMAGES bytes) to save Images' infornation */ + if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&(g_stBackGround.u32PhyAddr), ((void**)&pu8BackGroundVir), + NULL, NULL, 720 * 576 * 2 * N_IMAGES)) + { + TDE_PRINT("allocate memory (720*576*2*N_IMAGES bytes) failed\n"); + goto FB_PROCESS_ERROR1; + } + + TDE_CreateSurfaceByFile(BACKGROUND_NAME, &g_stBackGround, pu8BackGroundVir); + + g_stImgSur[0].u32PhyAddr = g_stBackGround.u32PhyAddr + g_stBackGround.u32Stride * g_stBackGround.u32Height; + for (i = 0; i < N_IMAGES - 1; i++) + { + TDE_CreateSurfaceByFile(pszImageNames[i], &g_stImgSur[i], + pu8BackGroundVir + ((HI_U32)g_stImgSur[i].u32PhyAddr - g_stBackGround.u32PhyAddr)); + g_stImgSur[i + 1].u32PhyAddr = g_stImgSur[i].u32PhyAddr + g_stImgSur[i].u32Stride * g_stImgSur[i].u32Height; + } + TDE_CreateSurfaceByFile(pszImageNames[i], &g_stImgSur[i], + pu8BackGroundVir + ((HI_U32)g_stImgSur[i].u32PhyAddr - g_stBackGround.u32PhyAddr)); + + bShow = HI_TRUE; + if (ioctl(s32Fd, FBIOPUT_SHOW_HIFB, &bShow) < 0) + { + fprintf (stderr, "Couldn't show fb\n"); + goto FB_PROCESS_ERROR2; + } + + g_s32FrameNum = 0; + + /* 3. use tde and framebuffer to realize rotational effect */ + for (u32Times = 0; u32Times < 20; u32Times++) + { + circumrotate(u32Times % 2); + stVarInfo.yoffset = (u32Times % 2) ? 0 : 576; + + /*set frame buffer start position*/ + if (ioctl(s32Fd, FBIOPAN_DISPLAY, &stVarInfo) < 0) + { + TDE_PRINT("process frame buffer device error\n"); + goto FB_PROCESS_ERROR2; + } + + sleep(1); + } + + s32Ret = 0; + +FB_PROCESS_ERROR2: + HI_MPI_SYS_MmzFree(g_stBackGround.u32PhyAddr, pu8BackGroundVir); +FB_PROCESS_ERROR1: + munmap(pu8Screen, u32Size); +FB_PROCESS_ERROR0: + close(s32Fd); +FB_OPEN_ERROR: + HI_TDE2_Close(); + + return s32Ret; +} + +/***************************************************************************** +description: this sample shows how to use TDE interface to draw graphic. + +note : for showing graphic layer, VO device should be enabled first. + This sample draws graphic on layer G0 which belongs to HD VO device. + (here we insmod HiFB.ko like 'insmod hifb.ko video="hifb:vram0_size=XXX" ' + so opening hifb sub-device '/dev/fb0' means to opening G0, + and G0 was fixed binded to HD VO device in Hi3520) +*****************************************************************************/ +int main(int argc, char *argv[]) +{ + HI_S32 s32Ret = 0; + VO_PUB_ATTR_S stPubAttr; + VB_CONF_S stVbConf; + VO_CSC_S stCSC; + + if ( (argc < 2) || (1 != strlen(argv[1]))) + { + SAMPLE_TDE_Usage(argv[0]); + return HI_FAILURE; + } + + stPubAttr.u32BgColor = 0x000000ff; + stPubAttr.enIntfType = VO_INTF_BT656; + stPubAttr.enIntfSync = VO_OUTPUT_PAL; + + if ((argc > 1) && *argv[1] == '1') /* '0': VO_INTF_BT656, else: LCD */ + { + stPubAttr.enIntfType = INTF_LCD; + stPubAttr.enIntfSync = SYNC_LCD; + + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + stVbConf.u32MaxPoolCnt = 16; + /*no need common video buffer!*/ + + /*1 enable Vo device first*/ + if (HI_SUCCESS != SAMPLE_COMM_SYS_Init(&stVbConf)) + { + goto SAMPLE_TDE_ERR0; + } + if (HI_SUCCESS != SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr)) + { + goto SAMPLE_TDE_ERR0; + } + + /*2 run tde sample which draw grahpic on HiFB memory*/ + + if (VO_INTF_BT656 == stPubAttr.enIntfType) + { + s32Ret = TDE_DrawGraphicSample(0); + } + else + { + s32Ret = TDE_DrawGraphicSample(1); + } + if (s32Ret != HI_SUCCESS) + { + goto SAMPLE_TDE_ERR1; + } + +SAMPLE_TDE_ERR1: + SAMPLE_COMM_VO_StopDev(VoDev); +SAMPLE_TDE_ERR0: + SAMPLE_COMM_SYS_Exit(); + return 0; +} + + diff --git a/device/mpp/sample/venc/Makefile b/device/mpp/sample/venc/Makefile new file mode 100644 index 0000000..88d76fa --- /dev/null +++ b/device/mpp/sample/venc/Makefile @@ -0,0 +1,32 @@ +# Hisilicon Hi3516 sample Makefile + +include ../Makefile.param +$(warning CPP $(CPP)) +$(warning CC $(CC)) + +#ifeq ($(SAMPLE_PARAM_FILE), ) +# SAMPLE_PARAM_FILE:=../Makefile.param +# include $(SAMPLE_PARAM_FILE) +#endif + +# target source +SRC := $(wildcard *.c) +OBJ := $(SRC:%.c=%.o) + +TARGET := $(OBJ:%.o=%) +.PHONY : clean all + +all: $(TARGET) +$(TARGET):%:%.o $(COMM_OBJ) + $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(SENSOR_LIBS) + +clean: + @rm -f $(TARGET) + @rm -f $(OBJ) + @rm -f $(COMM_OBJ) + +cleanstream: + @rm -f *.h264 + @rm -f *.jpg + @rm -f *.mjp + @rm -f *.mp4 diff --git a/device/mpp/sample/venc/sample_venc b/device/mpp/sample/venc/sample_venc new file mode 100644 index 0000000..4891b4f Binary files /dev/null and b/device/mpp/sample/venc/sample_venc differ diff --git a/device/mpp/sample/venc/sample_venc.c b/device/mpp/sample/venc/sample_venc.c new file mode 100644 index 0000000..a280b1e --- /dev/null +++ b/device/mpp/sample/venc/sample_venc.c @@ -0,0 +1,1563 @@ +/****************************************************************************** + A simple program of Hisilicon HI3531 video encode implementation. + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-2 Created +******************************************************************************/ +#ifdef __cplusplus + +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include +#include "sample_comm.h" + +VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_NTSC; + +/****************************************************************************** +* function : show usage +******************************************************************************/ +void SAMPLE_VENC_Usage(char *sPrgNm) +{ + printf("Usage : %s \n", sPrgNm); + printf("index:\n"); + printf("\t 0) 1*1080p H264 + 1*VGA H264.\n"); + printf("\t 1) 1*1080p MJPEG encode + 1*1080p jpeg.\n"); + printf("\t 2) low delay encode(only vi-vpss online).\n"); + printf("\t 3) roi background framerate.\n"); + printf("\t 4) svc-t H264\n"); + + return; +} + +/****************************************************************************** +* function : to process abnormal case +******************************************************************************/ +void SAMPLE_VENC_HandleSig(HI_S32 signo) +{ + if (SIGINT == signo || SIGTSTP == signo) + { + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram termination abnormally!\033[0;39m\n"); + } + exit(-1); +} + +/****************************************************************************** +* function : to process abnormal case - the case of stream venc +******************************************************************************/ +void SAMPLE_VENC_StreamHandleSig(HI_S32 signo) +{ + + if (SIGINT == signo || SIGTSTP == signo) + { + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram exit abnormally!\033[0;39m\n"); + } + + exit(0); +} + + +/****************************************************************************** +* function : H.264@1080p@30fps+H.264@VGA@30fps + + +******************************************************************************/ +HI_S32 SAMPLE_VENC_1080P_CLASSIC(HI_VOID) +{ + PAYLOAD_TYPE_E enPayLoad[3]= {PT_H264, PT_H264,PT_H264}; + PIC_SIZE_E enSize[3] = {PIC_HD1080, PIC_VGA,PIC_QVGA}; + HI_U32 u32Profile = 0; + + VB_CONF_S stVbConf; + SAMPLE_VI_CONFIG_S stViConfig = {APTINA_AR0130_DC_720P_30FPS}; + + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + + VENC_CHN VencChn; + SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; + + HI_S32 s32ChnNum=0; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + char c; + + + /****************************************** + step 1: init sys variable + ******************************************/ + memset(&stVbConf,0,sizeof(VB_CONF_S)); + + switch(SENSOR_TYPE) + { + case SONY_IMX122_DC_1080P_30FPS: + case APTINA_AR0230_HISPI_1080P_30FPS: + enSize[0] = PIC_HD1080; + enSize[1] = PIC_VGA; + s32ChnNum = 2; + break; + case APTINA_9M034_DC_720P_30FPS: + case APTINA_AR0130_DC_720P_30FPS: + case SONY_IMX122_DC_720P_30FPS: + enSize[0] = PIC_HD720; + enSize[1] = PIC_VGA; + enSize[2] = PIC_QVGA; + s32ChnNum = 3; + break; + + default: + printf("not support this sensor\n"); + break; + } + + stVbConf.u32MaxPoolCnt = 128; + + /*video buffer*/ + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 4; + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt =3; + if(s32ChnNum >= 3) + { + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[2], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[2].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[2].u32BlkCnt = 3; + } + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_VENC_1080P_CLASSIC_0; + } + + /****************************************** + step 3: start vi dev & chn to capture + ******************************************/ + stViConfig.enViMode = SENSOR_TYPE; + stViConfig.enRotate = ROTATE_NONE; + stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; + stViConfig.enViChnSet = VI_CHN_SET_NORMAL; + stViConfig.enWDRMode = WDR_MODE_NONE; + s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + + /****************************************** + step 4: start vpss and vi bind vpss + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + if(s32ChnNum >= 1) + { + VpssGrp = 0; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT; + + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_2; + } + + s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Vi bind Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_3; + } + + VpssChn = 0; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; + memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + } + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[1], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + if(s32ChnNum >= 2) + { + VpssChn = 1; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + } + + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[2], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + if(s32ChnNum >= 3) + { + VpssChn = 2; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + } + /****************************************** + step 5: start stream venc + ******************************************/ + /*** HD1080P **/ + printf("\t c) cbr.\n"); + printf("\t v) vbr.\n"); + printf("\t f) fixQp\n"); + printf("please input choose rc mode!\n"); + c = (char)getchar(); + switch(c) + { + case 'c': + enRcMode = SAMPLE_RC_CBR; + break; + case 'v': + enRcMode = SAMPLE_RC_VBR; + break; + case 'f': + enRcMode = SAMPLE_RC_FIXQP; + break; + default: + printf("rc mode! is invaild!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + + /*** enSize[0] **/ + if(s32ChnNum >= 1) + { + VpssGrp = 0; + VpssChn = 0; + VencChn = 0; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[0],\ + gs_enNorm, enSize[0], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + } + + /*** enSize[1] **/ + if(s32ChnNum >= 2) + { + VpssChn = 1; + VencChn = 1; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[1], \ + gs_enNorm, enSize[1], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + } + /*** enSize[2] **/ + if(s32ChnNum >= 3) + { + VpssChn = 2; + VencChn = 2; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[2], \ + gs_enNorm, enSize[2], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + } + /****************************************** + step 6: stream venc process -- get stream, then save it to file. + ******************************************/ + s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + printf("please press twice ENTER to exit this sample\n"); + getchar(); + getchar(); + + /****************************************** + step 7: exit process + ******************************************/ + SAMPLE_COMM_VENC_StopGetStream(); + +END_VENC_1080P_CLASSIC_5: + + VpssGrp = 0; + switch(s32ChnNum) + { + case 3: + VpssChn = 2; + VencChn = 2; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + case 2: + VpssChn = 1; + VencChn = 1; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + case 1: + VpssChn = 0; + VencChn = 0; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + break; + + } + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); + +END_VENC_1080P_CLASSIC_4: //vpss stop + + VpssGrp = 0; + switch(s32ChnNum) + { + case 3: + VpssChn = 2; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + case 2: + VpssChn = 1; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + case 1: + VpssChn = 0; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + break; + + } + +END_VENC_1080P_CLASSIC_3: //vpss stop + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_1080P_CLASSIC_2: //vpss stop + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_VENC_1080P_CLASSIC_1: //vi stop + SAMPLE_COMM_VI_StopVi(&stViConfig); +END_VENC_1080P_CLASSIC_0: //system exit + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + + + +/****************************************************************************** +* function : 1·1080p MJPEG encode and 1·1080p JPEG snap +******************************************************************************/ +HI_S32 SAMPLE_VENC_1080P_MJPEG_JPEG(HI_VOID) +{ + PAYLOAD_TYPE_E enPayLoad = PT_MJPEG; + PIC_SIZE_E enSize = PIC_HD1080; + HI_U32 u32Profile = 0; + + VB_CONF_S stVbConf; + SAMPLE_VI_CONFIG_S stViConfig = {APTINA_AR0130_DC_720P_30FPS}; + + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + + VENC_CHN VencChn; + SAMPLE_RC_E enRcMode = SAMPLE_RC_CBR; + HI_S32 s32ChnNum = 1; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + HI_S32 i = 0; + char ch; + + /****************************************** + step 1: init sys variable + ******************************************/ + memset(&stVbConf,0,sizeof(VB_CONF_S)); + + stVbConf.u32MaxPoolCnt = 128; + + switch(SENSOR_TYPE) + { + case SONY_IMX122_DC_1080P_30FPS: + case APTINA_AR0230_HISPI_1080P_30FPS: + enSize = PIC_HD1080; + break; + case APTINA_9M034_DC_720P_30FPS: + case APTINA_AR0130_DC_720P_30FPS: + case SONY_IMX122_DC_720P_30FPS: + enSize = PIC_HD720; + break; + + default: + printf("not support this sensor\n"); + break; + } + + + /*video buffer*/ + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize, SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 8; + + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_VENC_MJPEG_JPEG_0; + } + + /****************************************** + step 3: start vi dev & chn to capture + ******************************************/ + stViConfig.enViMode = SENSOR_TYPE; + stViConfig.enRotate = ROTATE_NONE; + stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; + stViConfig.enViChnSet = VI_CHN_SET_NORMAL; + s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_VENC_MJPEG_JPEG_1; + } + + /****************************************** + step 4: start vpss and vi bind vpss + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_MJPEG_JPEG_1; + } + + VpssGrp = 0; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT; + stVpssGrpAttr.bDciEn = HI_FALSE; + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Vpss failed!\n"); + goto END_VENC_MJPEG_JPEG_2; + } + + s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Vi bind Vpss failed!\n"); + goto END_VENC_MJPEG_JPEG_3; + } + + + VpssChn = 0; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + + memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_MJPEG_JPEG_4; + } + + + VpssChn = 1; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + + memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_MJPEG_JPEG_4; + } + + /****************************************** + step 5: start stream venc + ******************************************/ + VpssGrp = 0; + VpssChn = 0; + VencChn = 0; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad,\ + gs_enNorm, enSize, enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_MJPEG_JPEG_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_MJPEG_JPEG_5; + } + // chanel 1 means jpeg snap + VpssGrp = 0; + VpssChn = 1; + VencChn = 1; + s32Ret = SAMPLE_COMM_VENC_SnapStart(VencChn, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start snap failed!\n"); + goto END_VENC_MJPEG_JPEG_5; + } + + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_MJPEG_JPEG_5; + } + + /****************************************** + step 6: stream venc process -- get stream, then save it to file. + ******************************************/ + /* + printf("venc stream count is %d\r\n",s32ChnNum); + s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_MJPEG_JPEG_5; + } + */ + printf("press 'q' to exit sample!\nperess ENTER to capture one picture to file\n"); + i = 0; + //while ((ch = (char)getchar()) != 'q') + while(1) + { + HI_U32 depth0,depth1; + HI_MPI_VPSS_GetDepth(0,1,&depth0); + HI_MPI_VPSS_GetDepth(0,0,&depth1); + printf("vpss depth is %d %d\r\n",depth0,depth1); + s32Ret = SAMPLE_COMM_VENC_SnapProcess(VencChn); + if (HI_SUCCESS != s32Ret) + { + printf("%s: sanp process failed!\n", __FUNCTION__); + //break; + } + printf("snap %d success!\n", i); + i++; + } + + printf("please press ENTER to exit this sample\n"); + getchar(); + getchar(); + + /****************************************** + step 8: exit process + ******************************************/ + SAMPLE_COMM_VENC_StopGetStream(); + +END_VENC_MJPEG_JPEG_5: + VpssGrp = 0; + VpssChn = 0; + VencChn = 0; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + + VpssChn = 1; + VencChn = 1; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); +END_VENC_MJPEG_JPEG_4: //vpss stop + VpssGrp = 0; + VpssChn = 0; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + VpssChn = 1; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); +END_VENC_MJPEG_JPEG_3: //vpss stop + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_MJPEG_JPEG_2: //vpss stop + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_VENC_MJPEG_JPEG_1: //vi stop + SAMPLE_COMM_VI_StopVi(&stViConfig); +END_VENC_MJPEG_JPEG_0: //system exit + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +/****************************************************************************** +* function : 720p snap +******************************************************************************/ +HI_S32 SAMPLE_VENC_LOW_DELAY(HI_VOID) +{ + PAYLOAD_TYPE_E enPayLoad[2]= {PT_H264, PT_H264}; + PIC_SIZE_E enSize[2] = {PIC_HD1080, PIC_VGA}; + HI_U32 u32Profile = 0; + + VB_CONF_S stVbConf; + SAMPLE_VI_CONFIG_S stViConfig = {APTINA_AR0130_DC_720P_30FPS}; + HI_U32 u32Priority; + + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + VPSS_LOW_DELAY_INFO_S stLowDelayInfo; + + VENC_CHN VencChn; + SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; + HI_S32 s32ChnNum = 2; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + char c; + + /****************************************** + step 1: init sys variable + ******************************************/ + memset(&stVbConf,0,sizeof(VB_CONF_S)); + + switch(SENSOR_TYPE) + { + case SONY_IMX122_DC_1080P_30FPS: + case APTINA_AR0230_HISPI_1080P_30FPS: + enSize[0] = PIC_HD1080; + enSize[1] = PIC_VGA; + s32ChnNum = 2; + break; + case APTINA_9M034_DC_720P_30FPS: + case APTINA_AR0130_DC_720P_30FPS: + case SONY_IMX122_DC_720P_30FPS: + enSize[0] = PIC_HD720; + enSize[1] = PIC_VGA; + s32ChnNum = 2; + break; + + default: + printf("not support this sensor\n"); + break; + } + + + stVbConf.u32MaxPoolCnt = 128; + + /*video buffer*/ + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + + printf("u32BlkSize: %d\n", u32BlkSize); + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 4; + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 3; + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_VENC_LOW_DELAY_0; + } + + /****************************************** + step 3: start vi dev & chn to capture + ******************************************/ + stViConfig.enViMode = SENSOR_TYPE; + stViConfig.enRotate = ROTATE_NONE; + stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; + stViConfig.enViChnSet = VI_CHN_SET_NORMAL; + s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_VENC_LOW_DELAY_1; + } + + /****************************************** + step 4: start vpss and vi bind vpss + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_LOW_DELAY_1; + } + + VpssGrp = 0; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT; + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Vpss failed!\n"); + goto END_VENC_LOW_DELAY_2; + } + + s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Vi bind Vpss failed!\n"); + goto END_VENC_LOW_DELAY_3; + } + + VpssChn = 0; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_LOW_DELAY_4; + } + + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[1], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_LOW_DELAY_4; + } + VpssChn = 1; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_LOW_DELAY_4; + } + + /****************************************** + step 5: start stream venc + ******************************************/ + /*** HD1080P **/ + printf("\t c) cbr.\n"); + printf("\t v) vbr.\n"); + printf("\t f) fixQp\n"); + printf("please input choose rc mode!\n"); + c = (char)getchar(); + switch(c) + { + case 'c': + enRcMode = SAMPLE_RC_CBR; + break; + case 'v': + enRcMode = SAMPLE_RC_VBR; + break; + case 'f': + enRcMode = SAMPLE_RC_FIXQP; + break; + default: + printf("rc mode! is invaild!\n"); + goto END_VENC_LOW_DELAY_4; + } + VpssGrp = 0; + VpssChn = 0; + VencChn = 0; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[0],\ + gs_enNorm, enSize[0], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_LOW_DELAY_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_LOW_DELAY_5; + } + + /*set chnl Priority*/ + s32Ret = HI_MPI_VENC_GetChnlPriority(VencChn,&u32Priority); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Get Chnl Priority failed!\n"); + goto END_VENC_LOW_DELAY_5; + } + + u32Priority = 1; + + s32Ret = HI_MPI_VENC_SetChnlPriority(VencChn,u32Priority); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Set Chnl Priority failed!\n"); + goto END_VENC_LOW_DELAY_5; + } + + /*set low delay*/ + #if 1 + s32Ret = HI_MPI_VPSS_GetLowDelayAttr(VpssGrp,VpssChn,&stLowDelayInfo); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VPSS_GetLowDelayAttr failed!\n"); + goto END_VENC_LOW_DELAY_5; + } + stLowDelayInfo.bEnable = HI_TRUE; + stLowDelayInfo.u32LineCnt = stVpssChnMode.u32Height/2; + s32Ret = HI_MPI_VPSS_SetLowDelayAttr(VpssGrp,VpssChn,&stLowDelayInfo); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VPSS_SetLowDelayAttr failed!\n"); + goto END_VENC_LOW_DELAY_5; + } + #endif + /*** 1080p **/ + VpssChn = 1; + VencChn = 1; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[1], \ + gs_enNorm, enSize[1], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_LOW_DELAY_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_LOW_DELAY_5; + } + + /****************************************** + step 6: stream venc process -- get stream, then save it to file. + ******************************************/ + s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_LOW_DELAY_5; + } + + printf("please press twice ENTER to exit this sample\n"); + getchar(); + getchar(); + + /****************************************** + step 7: exit process + ******************************************/ + SAMPLE_COMM_VENC_StopGetStream(); + +END_VENC_LOW_DELAY_5: + VpssGrp = 0; + + VpssChn = 0; + VencChn = 0; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + + VpssChn = 1; + VencChn = 1; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_LOW_DELAY_4: //vpss stop + VpssGrp = 0; + VpssChn = 0; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + VpssChn = 1; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); +END_VENC_LOW_DELAY_3: //vpss stop + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_LOW_DELAY_2: //vpss stop + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_VENC_LOW_DELAY_1: //vi stop + SAMPLE_COMM_VI_StopVi(&stViConfig); +END_VENC_LOW_DELAY_0: //system exit + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + + +HI_S32 SAMPLE_VENC_ROIBG_CLASSIC(HI_VOID) +{ + PAYLOAD_TYPE_E enPayLoad= PT_H264; + PIC_SIZE_E enSize[3] = {PIC_HD1080,PIC_VGA,PIC_QVGA}; + HI_U32 u32Profile = 0; + + VB_CONF_S stVbConf; + SAMPLE_VI_CONFIG_S stViConfig = {APTINA_AR0130_DC_720P_30FPS}; + + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + VENC_ROI_CFG_S stVencRoiCfg; + VENC_ROIBG_FRAME_RATE_S stRoiBgFrameRate; + + VENC_CHN VencChn; + SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; + HI_S32 s32ChnNum = 1; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + char c; + + /****************************************** + step 1: init sys variable + ******************************************/ + memset(&stVbConf,0,sizeof(VB_CONF_S)); + + switch(SENSOR_TYPE) + { + case SONY_IMX122_DC_1080P_30FPS: + case APTINA_AR0230_HISPI_1080P_30FPS: + enSize[0] = PIC_HD1080; + s32ChnNum = 1; + break; + case APTINA_9M034_DC_720P_30FPS: + case APTINA_AR0130_DC_720P_30FPS: + case SONY_IMX122_DC_720P_30FPS: + enSize[0] = PIC_HD720; + s32ChnNum = 1; + break; + + default: + printf("not support this sensor\n"); + break; + } + + stVbConf.u32MaxPoolCnt = 128; + + /*video buffer*/ + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 4; + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 0; + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[2], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[2].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[2].u32BlkCnt = 0; + + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_VENC_1080P_CLASSIC_0; + } + + /****************************************** + step 3: start vi dev & chn to capture + ******************************************/ + stViConfig.enViMode = SENSOR_TYPE; + stViConfig.enRotate = ROTATE_NONE; + stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; + stViConfig.enViChnSet = VI_CHN_SET_NORMAL; + s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + + /****************************************** + step 4: start vpss and vi bind vpss + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + + VpssGrp = 0; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT; + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_2; + } + + s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Vi bind Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_3; + } + + VpssChn = 0; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + + /****************************************** + step 5: start stream venc + ******************************************/ + /*** HD1080P **/ + printf("\t c) cbr.\n"); + printf("\t v) vbr.\n"); + printf("\t f) fixQp\n"); + printf("please input choose rc mode!\n"); + c = (char)getchar(); + switch(c) + { + case 'c': + enRcMode = SAMPLE_RC_CBR; + break; + case 'v': + enRcMode = SAMPLE_RC_VBR; + break; + case 'f': + enRcMode = SAMPLE_RC_FIXQP; + break; + default: + printf("rc mode! is invaild!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + VpssGrp = 0; + VpssChn = 0; + VencChn = 0; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad,\ + gs_enNorm, enSize[0], enRcMode,u32Profile); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + stVencRoiCfg.bAbsQp = HI_TRUE; + stVencRoiCfg.bEnable = HI_TRUE; + stVencRoiCfg.s32Qp = 30; + stVencRoiCfg.u32Index = 0; + stVencRoiCfg.stRect.s32X = 64; + stVencRoiCfg.stRect.s32Y = 64; + stVencRoiCfg.stRect.u32Height =256; + stVencRoiCfg.stRect.u32Width =256; + s32Ret = HI_MPI_VENC_SetRoiCfg(VencChn,&stVencRoiCfg); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = HI_MPI_VENC_GetRoiBgFrameRate(VencChn,&stRoiBgFrameRate); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_GetRoiBgFrameRate failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + stRoiBgFrameRate.s32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL== gs_enNorm)?25:30; + stRoiBgFrameRate.s32DstFrmRate = (VIDEO_ENCODING_MODE_PAL== gs_enNorm)?5:15; + + s32Ret = HI_MPI_VENC_SetRoiBgFrameRate(VencChn,&stRoiBgFrameRate); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VENC_SetRoiBgFrameRate!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + /****************************************** + step 6: stream venc process -- get stream, then save it to file. + ******************************************/ + s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + printf("please press ENTER to exit this sample\n"); + getchar(); + getchar(); + + /****************************************** + step 7: exit process + ******************************************/ + SAMPLE_COMM_VENC_StopGetStream(); + +END_VENC_1080P_CLASSIC_5: + VpssGrp = 0; + + VpssChn = 0; + VencChn = 0; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + + + + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_1080P_CLASSIC_4: //vpss stop + VpssGrp = 0; + VpssChn = 0; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); +END_VENC_1080P_CLASSIC_3: //vpss stop + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_1080P_CLASSIC_2: //vpss stop + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_VENC_1080P_CLASSIC_1: //vi stop + SAMPLE_COMM_VI_StopVi(&stViConfig); +END_VENC_1080P_CLASSIC_0: //system exit + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +HI_S32 SAMPLE_VENC_SVC_H264(HI_VOID) +{ + PAYLOAD_TYPE_E enPayLoad= PT_H264; + PIC_SIZE_E enSize[3] = {PIC_HD1080,PIC_HD720,PIC_D1}; + HI_U32 u32Profile = 3;/* Svc-t */ + + VB_CONF_S stVbConf; + SAMPLE_VI_CONFIG_S stViConfig = {APTINA_AR0130_DC_720P_30FPS}; + + VPSS_GRP VpssGrp; + VPSS_CHN VpssChn; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + + + VENC_CHN VencChn; + SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR; + HI_S32 s32ChnNum = 1; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + char c; + + /****************************************** + step 1: init sys variable + ******************************************/ + memset(&stVbConf,0,sizeof(VB_CONF_S)); + switch(SENSOR_TYPE) + { + case SONY_IMX122_DC_1080P_30FPS: + case APTINA_AR0230_HISPI_1080P_30FPS: + enSize[0] = PIC_HD1080; + s32ChnNum = 1; + break; + case APTINA_9M034_DC_720P_30FPS: + case APTINA_AR0130_DC_720P_30FPS: + case SONY_IMX122_DC_720P_30FPS: + enSize[0] = PIC_HD720; + s32ChnNum = 1; + break; + default: + printf("not support this sensor\n"); + break; + } + + + stVbConf.u32MaxPoolCnt = 128; + + /*video buffer*/ + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 4; + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 0; + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ + enSize[2], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[2].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[2].u32BlkCnt = 0; + + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_VENC_1080P_CLASSIC_0; + } + + /****************************************** + step 3: start vi dev & chn to capture + ******************************************/ + stViConfig.enViMode = SENSOR_TYPE; + stViConfig.enRotate = ROTATE_NONE; + stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO; + stViConfig.enViChnSet = VI_CHN_SET_NORMAL; + s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + + /****************************************** + step 4: start vpss and vi bind vpss + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_VENC_1080P_CLASSIC_1; + } + + VpssGrp = 0; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT; + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_2; + } + + s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Vi bind Vpss failed!\n"); + goto END_VENC_1080P_CLASSIC_3; + } + + VpssChn = 0; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr)); + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnAttr.s32DstFrameRate = -1; + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Enable vpss chn failed!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + + /****************************************** + step 5: start stream venc + ******************************************/ + /*** HD1080P **/ + printf("\t c) cbr.\n"); + printf("\t v) vbr.\n"); + printf("\t f) fixQp\n"); + printf("please input choose rc mode!\n"); + c = (char)getchar(); + switch(c) + { + case 'c': + enRcMode = SAMPLE_RC_CBR; + break; + case 'v': + enRcMode = SAMPLE_RC_VBR; + break; + case 'f': + enRcMode = SAMPLE_RC_FIXQP; + break; + default: + printf("rc mode! is invaild!\n"); + goto END_VENC_1080P_CLASSIC_4; + } + VpssGrp = 0; + VpssChn = 0; + VencChn = 0; + s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad,\ + gs_enNorm, enSize[0], enRcMode,u32Profile); + + printf("SAMPLE_COMM_VENC_Start is ok\n"); + + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); + + printf("SAMPLE_COMM_VENC_BindVpss is ok\n"); + + + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + /****************************************** + step 6: stream venc process -- get stream, then save it to file. + ******************************************/ + s32Ret = SAMPLE_COMM_VENC_StartGetStream_Svc_t(s32ChnNum); + + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("Start Venc failed!\n"); + goto END_VENC_1080P_CLASSIC_5; + } + + printf("please press ENTER to exit this sample\n"); + getchar(); + getchar(); + + /****************************************** + step 7: exit process + ******************************************/ + SAMPLE_COMM_VENC_StopGetStream(); + + printf("SAMPLE_COMM_VENC_StopGetStream is ok\n"); +END_VENC_1080P_CLASSIC_5: + VpssGrp = 0; + + VpssChn = 0; + VencChn = 0; + SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn); + SAMPLE_COMM_VENC_Stop(VencChn); + + + + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_1080P_CLASSIC_4: //vpss stop + VpssGrp = 0; + VpssChn = 0; + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); +END_VENC_1080P_CLASSIC_3: //vpss stop + SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode); +END_VENC_1080P_CLASSIC_2: //vpss stop + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_VENC_1080P_CLASSIC_1: //vi stop + SAMPLE_COMM_VI_StopVi(&stViConfig); +END_VENC_1080P_CLASSIC_0: //system exit + SAMPLE_COMM_SYS_Exit(); + return s32Ret; +} + + + + +/****************************************************************************** +* function : main() +* Description : video venc sample +******************************************************************************/ +int main(int argc, char *argv[]) { + HI_S32 s32Ret; + if ( (argc < 2) || (1 != strlen(argv[1]))) + { + SAMPLE_VENC_Usage(argv[0]); + return HI_FAILURE; + } + signal(SIGINT, SAMPLE_VENC_HandleSig); + signal(SIGTERM, SAMPLE_VENC_HandleSig); + + switch (*argv[1]) + { + case '0':/* H.264@1080p@30fps+H.265@1080p@30fps+H.264@D1@30fps */ + s32Ret = SAMPLE_VENC_1080P_CLASSIC(); + break; + case '1':/* 1*1080p mjpeg encode + 1*1080p jpeg */ + s32Ret = SAMPLE_VENC_1080P_MJPEG_JPEG(); + break; + case '2':/* low delay */ + s32Ret = SAMPLE_VENC_LOW_DELAY(); + break; + case '3':/* roibg framerate */ + s32Ret = SAMPLE_VENC_ROIBG_CLASSIC(); + break; + case '4':/* H.264 Svc-t */ + s32Ret = SAMPLE_VENC_SVC_H264(); + break; + default: + printf("the index is invaild!\n"); + SAMPLE_VENC_Usage(argv[0]); + return HI_FAILURE; + } + + if (HI_SUCCESS == s32Ret) + printf("program exit normally!\n"); + else + printf("program exit abnormally!\n"); + exit(s32Ret); +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ diff --git a/device/mpp/sample/venc/stream_chn0.mjp b/device/mpp/sample/venc/stream_chn0.mjp new file mode 100644 index 0000000..dc3eaec Binary files /dev/null and b/device/mpp/sample/venc/stream_chn0.mjp differ diff --git a/device/mpp/sample/venc/su.IAB b/device/mpp/sample/venc/su.IAB new file mode 100644 index 0000000..e247b84 Binary files /dev/null and b/device/mpp/sample/venc/su.IAB differ diff --git a/device/mpp/sample/venc/su.IAD b/device/mpp/sample/venc/su.IAD new file mode 100644 index 0000000..1d127c0 Binary files /dev/null and b/device/mpp/sample/venc/su.IAD differ diff --git a/device/mpp/sample/venc/su.IMB b/device/mpp/sample/venc/su.IMB new file mode 100644 index 0000000..b6ca0c5 Binary files /dev/null and b/device/mpp/sample/venc/su.IMB differ diff --git a/device/mpp/sample/venc/su.IMD b/device/mpp/sample/venc/su.IMD new file mode 100644 index 0000000..1146b0c Binary files /dev/null and b/device/mpp/sample/venc/su.IMD differ diff --git a/device/mpp/sample/venc/su.PFI b/device/mpp/sample/venc/su.PFI new file mode 100644 index 0000000..7910bd0 Binary files /dev/null and b/device/mpp/sample/venc/su.PFI differ diff --git a/device/mpp/sample/venc/su.PO b/device/mpp/sample/venc/su.PO new file mode 100644 index 0000000..fffca12 Binary files /dev/null and b/device/mpp/sample/venc/su.PO differ diff --git a/device/mpp/sample/venc/su.PR b/device/mpp/sample/venc/su.PR new file mode 100644 index 0000000..b7d14bc Binary files /dev/null and b/device/mpp/sample/venc/su.PR differ diff --git a/device/mpp/sample/venc/su.PRI b/device/mpp/sample/venc/su.PRI new file mode 100644 index 0000000..abff1c3 Binary files /dev/null and b/device/mpp/sample/venc/su.PRI differ diff --git a/device/mpp/sample/venc/su.PS b/device/mpp/sample/venc/su.PS new file mode 100644 index 0000000..0f36bf7 Binary files /dev/null and b/device/mpp/sample/venc/su.PS differ diff --git a/device/mpp/sample/venc/su.SearchResults b/device/mpp/sample/venc/su.SearchResults new file mode 100644 index 0000000..7f9ff49 --- /dev/null +++ b/device/mpp/sample/venc/su.SearchResults @@ -0,0 +1,3 @@ +---- SAMPLE_COMM_VENC_SnapProcess Matches (2 in 2 files) ---- +Sample_comm.h (\\192.168.2.102\phoenix\mpp\sample\common):HI_S32 SAMPLE_COMM_VENC_SnapProcess(VENC_CHN VencChn); +Sample_venc.c: s32Ret = SAMPLE_COMM_VENC_SnapProcess(VencChn); diff --git a/device/mpp/sample/venc/su.WK3 b/device/mpp/sample/venc/su.WK3 new file mode 100644 index 0000000..cf96a41 Binary files /dev/null and b/device/mpp/sample/venc/su.WK3 differ diff --git a/device/mpp/sample/venc/tutk/libAVAPIs.a b/device/mpp/sample/venc/tutk/libAVAPIs.a new file mode 100644 index 0000000..5ca2b5b Binary files /dev/null and b/device/mpp/sample/venc/tutk/libAVAPIs.a differ diff --git a/device/mpp/sample/venc/tutk/libAVAPIs.so b/device/mpp/sample/venc/tutk/libAVAPIs.so new file mode 100644 index 0000000..c6133b2 Binary files /dev/null and b/device/mpp/sample/venc/tutk/libAVAPIs.so differ diff --git a/device/mpp/sample/venc/tutk/libAVAPIsT.a b/device/mpp/sample/venc/tutk/libAVAPIsT.a new file mode 100644 index 0000000..05fa247 Binary files /dev/null and b/device/mpp/sample/venc/tutk/libAVAPIsT.a differ diff --git a/device/mpp/sample/venc/tutk/libAVAPIsT.so b/device/mpp/sample/venc/tutk/libAVAPIsT.so new file mode 100644 index 0000000..dd5811e Binary files /dev/null and b/device/mpp/sample/venc/tutk/libAVAPIsT.so differ diff --git a/device/mpp/sample/venc/tutk/libIOTCAPIs.a b/device/mpp/sample/venc/tutk/libIOTCAPIs.a new file mode 100644 index 0000000..30285c2 Binary files /dev/null and b/device/mpp/sample/venc/tutk/libIOTCAPIs.a differ diff --git a/device/mpp/sample/venc/tutk/libIOTCAPIs.so b/device/mpp/sample/venc/tutk/libIOTCAPIs.so new file mode 100644 index 0000000..89e04cc Binary files /dev/null and b/device/mpp/sample/venc/tutk/libIOTCAPIs.so differ diff --git a/device/mpp/sample/venc/tutk/libIOTCAPIsT.a b/device/mpp/sample/venc/tutk/libIOTCAPIsT.a new file mode 100644 index 0000000..c310f79 Binary files /dev/null and b/device/mpp/sample/venc/tutk/libIOTCAPIsT.a differ diff --git a/device/mpp/sample/venc/tutk/libIOTCAPIsT.so b/device/mpp/sample/venc/tutk/libIOTCAPIsT.so new file mode 100644 index 0000000..9818134 Binary files /dev/null and b/device/mpp/sample/venc/tutk/libIOTCAPIsT.so differ diff --git a/device/mpp/sample/venc/tutk/libP2PTunnelAPIs.a b/device/mpp/sample/venc/tutk/libP2PTunnelAPIs.a new file mode 100644 index 0000000..f25765f Binary files /dev/null and b/device/mpp/sample/venc/tutk/libP2PTunnelAPIs.a differ diff --git a/device/mpp/sample/venc/tutk/libP2PTunnelAPIs.so b/device/mpp/sample/venc/tutk/libP2PTunnelAPIs.so new file mode 100644 index 0000000..fe9493f Binary files /dev/null and b/device/mpp/sample/venc/tutk/libP2PTunnelAPIs.so differ diff --git a/device/mpp/sample/venc/tutk/libP2PTunnelAPIsT.a b/device/mpp/sample/venc/tutk/libP2PTunnelAPIsT.a new file mode 100644 index 0000000..a7af2fe Binary files /dev/null and b/device/mpp/sample/venc/tutk/libP2PTunnelAPIsT.a differ diff --git a/device/mpp/sample/venc/tutk/libP2PTunnelAPIsT.so b/device/mpp/sample/venc/tutk/libP2PTunnelAPIsT.so new file mode 100644 index 0000000..991ec6d Binary files /dev/null and b/device/mpp/sample/venc/tutk/libP2PTunnelAPIsT.so differ diff --git a/device/mpp/sample/venc/tutk/libRDTAPIs.a b/device/mpp/sample/venc/tutk/libRDTAPIs.a new file mode 100644 index 0000000..7647360 Binary files /dev/null and b/device/mpp/sample/venc/tutk/libRDTAPIs.a differ diff --git a/device/mpp/sample/venc/tutk/libRDTAPIs.so b/device/mpp/sample/venc/tutk/libRDTAPIs.so new file mode 100644 index 0000000..5c0001c Binary files /dev/null and b/device/mpp/sample/venc/tutk/libRDTAPIs.so differ diff --git a/device/mpp/sample/venc/tutk/libRDTAPIsT.a b/device/mpp/sample/venc/tutk/libRDTAPIsT.a new file mode 100644 index 0000000..a6943f0 Binary files /dev/null and b/device/mpp/sample/venc/tutk/libRDTAPIsT.a differ diff --git a/device/mpp/sample/venc/tutk/libRDTAPIsT.so b/device/mpp/sample/venc/tutk/libRDTAPIsT.so new file mode 100644 index 0000000..faed74e Binary files /dev/null and b/device/mpp/sample/venc/tutk/libRDTAPIsT.so differ diff --git a/device/mpp/sample/vio/Makefile b/device/mpp/sample/vio/Makefile new file mode 100644 index 0000000..3108948 --- /dev/null +++ b/device/mpp/sample/vio/Makefile @@ -0,0 +1,31 @@ +# Hisilicon Hi3516 sample Makefile + +include ../Makefile.param +#ifeq ($(SAMPLE_PARAM_FILE), ) +# SAMPLE_PARAM_FILE:=../Makefile.param +# include $(SAMPLE_PARAM_FILE) +#endif + +# target source +SRC := $(wildcard *.c) +OBJ := $(SRC:%.c=%.o) + +TARGET := $(OBJ:%.o=%) +.PHONY : clean all + +all: $(TARGET) + + +$(TARGET):%:%.o $(COMM_OBJ) + $(CC) $(CFLAGS) -lpthread -lm -o $@ $^ $(MPI_LIBS) $(AUDIO_LIBA) $(SENSOR_LIBS) + +clean: + @rm -f $(TARGET) + @rm -f $(OBJ) + @rm -f $(COMM_OBJ) + +cleanstream: + @rm -f *.h264 + @rm -f *.jpg + @rm -f *.mjp + @rm -f *.mp4 diff --git a/device/mpp/sample/vio/sample_vio b/device/mpp/sample/vio/sample_vio new file mode 100644 index 0000000..9096742 Binary files /dev/null and b/device/mpp/sample/vio/sample_vio differ diff --git a/device/mpp/sample/vio/sample_vio.c b/device/mpp/sample/vio/sample_vio.c new file mode 100644 index 0000000..5190ac0 --- /dev/null +++ b/device/mpp/sample/vio/sample_vio.c @@ -0,0 +1,2836 @@ +/****************************************************************************** + A simple program of Hisilicon HI3531 video input and output implementation. + Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd. + ****************************************************************************** + Modification: 2011-8 Created +******************************************************************************/ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sample_comm.h" + + +VIDEO_NORM_E gs_enNorm = VIDEO_ENCODING_MODE_PAL; +VO_INTF_TYPE_E g_enVoIntfType = VO_INTF_LCD; +PIC_SIZE_E g_enPicSize = PIC_HD1080; + +SAMPLE_VIDEO_LOSS_S gs_stVideoLoss; +HI_U32 gs_u32ViFrmRate = 0; + +SAMPLE_VI_CONFIG_S g_stViChnConfig = +{ + APTINA_AR0130_DC_720P_30FPS, + VIDEO_ENCODING_MODE_AUTO, + + ROTATE_NONE, + VI_CHN_SET_NORMAL, + WDR_MODE_NONE +}; + +/****************************************************************************** +* function : show usage +******************************************************************************/ +void SAMPLE_VIO_Usage(char* sPrgNm) +{ + printf("Usage : %s \n", sPrgNm); + printf("index:\n"); + printf("\t 0)online mode VI/VPSS,1080P; VO(0:LCD, 1:BT656). Embeded isp, phychn channel preview.\n"); + printf("\t 1)online mode VI(FPN)/VPSS,1080P; VO(0:LCD), 1:BT656).frame mode FPN,Embeded isp,phychn channel preview.\n"); + printf("\t 2)online mode VI/VPSS(ROTATE),1080P; VO(0:LCD, 1:BT656).Embeded isp, online, rotate, phychn channel preview.\n"); + printf("\t 3)offline mode VI(ROTATE),1080P; VO(0:LCD, 1:BT656).Embeded isp, offline, rotate, phychn channel preview.\n"); + printf("\t 4)offline mode VI(LDC),1080P; VO(0:LCD, 1:BT656).Embeded isp, offline, LDC, phychn channel preview.\n"); + printf("\t 5)offline mode VI(DIS),1080P; VO(0:LCD, 1:BT656).Embeded isp, offline, DIS, phychn channel preview.\n"); + printf("\t 6)offline mode VI: BT1120; VO(0:LCD, 1:BT656).Isp bypass, phychn channel preview.\n"); + printf("\t 7)offline mode VI; VO(0:LCD, 1:BT656).Embeded isp, resolution switch.\n"); + printf("intf:\n"); + printf("\t 0) vo LCD output.\n"); + printf("\t 1) vo BT656 output, default.\n"); + return; +} + +/****************************************************************************** +* function : to process abnormal case +******************************************************************************/ +void SAMPLE_VIO_HandleSig(HI_S32 signo) +{ + if (SIGINT == signo || SIGTERM == signo) + { + SAMPLE_COMM_ISP_Stop(); + SAMPLE_COMM_SYS_Exit(); + printf("\033[0;31mprogram termination abnormally!\033[0;39m\n"); + } + exit(-1); +} + + +/****************************************************************************** +* function : vi/vpss: online mode VI: DC(1080P); VO: SD0(CVBS). Embeded isp, phychn channel preview. +******************************************************************************/ +HI_S32 SAMPLE_VIO_1080P_PreView(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + HI_U32 u32ViChnCnt = 2; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + VPSS_GRP VpssGrp = 0; + VPSS_CHN VpssChn = 0; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + VPSS_EXT_CHN_ATTR_S stVpssExtChnAttr; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + ROTATE_E enRotate = ROTATE_NONE; + + VO_CSC_S stCSC = {0}; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8; + stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 2; + + /****************************************** + step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_0; + } + + if (pstViConfig) + { + enRotate = pstViConfig->enRotate; + if (ROTATE_90 == enRotate || ROTATE_270 == enRotate) + { + u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \ + CEILING_2_POWER(stSize.u32Height, SAMPLE_SYS_ALIGN_WIDTH) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5)); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 1; + } + } + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + + + /****************************************** + step 5: start vpss group + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS GROUP failed!\n"); + goto END_1080P_1; + } + + stVpssChnAttr.bBorderEn = 0; + stVpssChnAttr.bFlip = 0; + stVpssChnAttr.bMirror = 0; + stVpssChnAttr.bSpEn = 0 ; + stVpssChnAttr.s32DstFrameRate = -1; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + + /****************************************** + step 6: start vpss chn + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, &stVpssExtChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS CHN failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 7: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n"); + goto END_1080P_2; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_2; + } + + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_FALSE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_3; + } + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_4; + } + + + s32Ret = SAMPLE_COMM_VO_BindVpss(VoDev, VoChn, VpssGrp, VpssChn); + //s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss(vo:%d)-(VpssChn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_5; + } + + VI_PAUSE(); + /****************************************** + step 8: exit process + ******************************************/ +END_1080P_5: + SAMPLE_COMM_VO_UnBindVpss(VoDev, VoChn, VpssGrp, VpssChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_4: + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_3: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_2: + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + return s32Ret; +} + +#if 0 +/****************************************************************************** +* function : vi/vpss: online mode VI(WDR): DC(1080P); VO: SD0(CVBS). Embeded isp, phychn channel preview. +******************************************************************************/ +HI_S32 SAMPLE_VIO_LINE_WDR_PreView(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + HI_U32 u32ViChnCnt = 2; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + VPSS_GRP VpssGrp = 0; + VPSS_CHN VpssChn = 0; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + VPSS_EXT_CHN_ATTR_S stVpssExtChnAttr; + HI_U32 u32Mode = 0; + //ISP_WDR_MODE_S stWdrMode; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + ROTATE_E enRotate = ROTATE_NONE; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8; + + /****************************************** + step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_0; + } + + if (pstViConfig) + { + enRotate = pstViConfig->enRotate; + if (ROTATE_90 == enRotate || ROTATE_270 == enRotate) + { + u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \ + CEILING_2_POWER(stSize.u32Height, SAMPLE_SYS_ALIGN_WIDTH) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5)); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 8; + } + } + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: isp wdr mode config; + ******************************************/ +#if 0 + stWdrMode.enWDRMode = WDR_MODE_2To1_LINE; + s32Ret = HI_MPI_ISP_SetWDRMode(0, &stWdrMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start WDR failed!\n"); + goto END_1080P_0; + } +#endif + + /****************************************** + step 5: start vi dev & chn to capture + vi wdr attr should be set; + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + + /****************************************** + step 5: start vpss group + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS GROUP failed!\n"); + goto END_1080P_1; + } + + stVpssChnAttr.bBorderEn = 0; + stVpssChnAttr.bFlip = 0; + stVpssChnAttr.bMirror = 0; + stVpssChnAttr.bSpEn = 0 ; + stVpssChnAttr.s32DstFrameRate = -1; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + + /****************************************** + step 6: start vpss chn + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, &stVpssExtChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS CHN failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 7: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + if (VO_INTF_BT1120 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_1080P30; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + } + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n"); + goto END_1080P_2; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_2; + } + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_3; + } + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_4; + } + + HI_MPI_SYS_GetViVpssMode(&u32Mode); + if (!u32Mode) //off-line + { + s32Ret = SAMPLE_COMM_VI_BindVpss(pstViConfig->enViMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VI_BindVpss failed with %#x!\n", s32Ret); + goto END_1080P_5; + } + } + + s32Ret = SAMPLE_COMM_VO_BindVpss(VoDev, VoChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss(vo:%d)-(VpssChn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_6; + } + + VI_PAUSE(); + /****************************************** + step 8: exit process + ******************************************/ +END_1080P_6: + SAMPLE_COMM_VO_UnBindVpss(VoDev, VoChn, VpssGrp, VpssChn); +END_1080P_5: + if (!u32Mode) + { + SAMPLE_COMM_VI_UnBindVpss(pstViConfig->enViMode); + } + + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_4: + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_3: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_2: + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + return s32Ret; +} +#endif + +/****************************************************************************** +* function : vi/vpss: online mode VI(FPN): DC(1080P); VO: SD0(CVBS). Embeded isp, phychn channel preview. +******************************************************************************/ +HI_S32 SAMPLE_VIO_FRAME_FPN_PreView(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + //HI_U32 u32ViChnCnt = 2; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0; + VO_CHN VoChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + VPSS_GRP VpssGrp = 0; + VPSS_CHN VpssChn = 0; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + VPSS_EXT_CHN_ATTR_S stVpssExtChnAttr; + + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + ROTATE_E enRotate = ROTATE_NONE; + + VO_CSC_S stCSC = {0}; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + PIXEL_FORMAT_YUV_SEMIPLANAR_422, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8; + stVbConf.astCommPool[0].u32BlkCnt = 5; + + /****************************************** + step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_0; + } + + if (pstViConfig) + { + enRotate = pstViConfig->enRotate; + if (ROTATE_90 == enRotate || ROTATE_270 == enRotate) + { + u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \ + CEILING_2_POWER(stSize.u32Height, SAMPLE_SYS_ALIGN_WIDTH) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5)); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 1; + } + } + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + + /****************************************** + step 5: start vpss group + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS GROUP failed!\n"); + goto END_1080P_1; + } + + stVpssChnAttr.bBorderEn = 0; + stVpssChnAttr.bFlip = 0; + stVpssChnAttr.bMirror = 0; + stVpssChnAttr.bSpEn = 0 ; + stVpssChnAttr.s32DstFrameRate = -1; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + + /****************************************** + step 6: start vpss chn + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, &stVpssExtChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS CHN failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 7: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n"); + goto END_1080P_2; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_2; + } + + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_FALSE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_3; + } + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_4; + } + + s32Ret = SAMPLE_COMM_VO_BindVpss(VoDev, VoChn, VpssGrp, VpssChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss(vo:%d)-(VpssChn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_5; + } + + const char* fpn_file = "sample"; /* fpn file name */ + ISP_FPN_TYPE_E enFpnType = ISP_FPN_TYPE_FRAME; /* line/frame */ + PIXEL_FORMAT_E enPixelFormat = PIXEL_FORMAT_RGB_BAYER; + COMPRESS_MODE_E enCompressMode = COMPRESS_MODE_NONE; + HI_U32 u32FrmNum = 16; + HI_U32 u32Threshold = 4095; + char fileName[256] = {0}; + VI_CHN_ATTR_S stTempChnAttr; + VI_CHN ViChn = 0; + + + /* fpn calibrate, save dark frame file */ + s32Ret = SAMPLE_COMM_VI_FPN_CALIBRATE_CONFIG(fpn_file, enFpnType, + enPixelFormat, enCompressMode, + u32FrmNum, u32Threshold); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("FPN calibrate failed %#x!\n", s32Ret); + goto END_1080P_5; + } + + ISP_OP_TYPE_E enOpType = OP_TYPE_MANUAL; /* auto/manual */ + HI_U32 u32Strength = 0X100; /* strength */ + + /* fpn correction, read dark frame file */ + + + s32Ret = HI_MPI_VI_GetChnAttr(ViChn, &stTempChnAttr); + if (HI_SUCCESS != s32Ret) + { + printf("get vi chn attr failed!"); + return HI_FAILURE; + } + snprintf(fileName, sizeof(fileName), "./%s_%d_%d_%dbit.raw", fpn_file, stTempChnAttr.stDestSize.u32Width, + stTempChnAttr.stDestSize.u32Height , 16); + s32Ret = SAMPLE_COMM_VI_CORRECTION_CONFIG(fileName, enFpnType, enOpType, + u32Strength, enPixelFormat); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("FPN correction failed %#x!\n", s32Ret); + goto END_1080P_5; + } + + + /****************************************** + step 8: exit process + ******************************************/ +END_1080P_5: + SAMPLE_COMM_VO_UnBindVpss(VoDev, VoChn, VpssGrp, VpssChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_4: + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_3: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_2: + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + return s32Ret; +} + +#if 0 +/****************************************************************************** +* function : vi/vpss: online mode VI: DC(1080P);VPSS(LDC) VO: SD0(CVBS). Embeded isp, phychn channel preview. +******************************************************************************/ +HI_S32 SAMPLE_VI_VPSS_LDC_VO_1080P_PreView(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + HI_U32 u32ViChnCnt = 2; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + VPSS_GRP VpssGrp = 0; + VPSS_CHN VpssChn = 0; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + VPSS_EXT_CHN_ATTR_S stVpssExtChnAttr; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + ROTATE_E enRotate = ROTATE_NONE; + VPSS_LDC_ATTR_S stLDCAttr; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 15; + + /****************************************** + step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_0; + } + + if (pstViConfig) + { + enRotate = pstViConfig->enRotate; + if (ROTATE_90 == enRotate || ROTATE_270 == enRotate) + { + u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \ + CEILING_2_POWER(stSize.u32Height, SAMPLE_SYS_ALIGN_WIDTH) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5)); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 8; + } + } + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + + /****************************************** + step 5: start vpss group + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS GROUP failed!\n"); + goto END_1080P_1; + } + + stVpssChnAttr.bBorderEn = 0; + stVpssChnAttr.bFlip = 0; + stVpssChnAttr.bMirror = 0; + stVpssChnAttr.bSpEn = 0 ; + stVpssChnAttr.s32DstFrameRate = -1; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + + stLDCAttr.bEnable = HI_TRUE; + stLDCAttr.stAttr.enViewType = LDC_VIEW_TYPE_ALL; + stLDCAttr.stAttr.s32CenterXOffset = 0; + stLDCAttr.stAttr.s32CenterYOffset = 0; + stLDCAttr.stAttr.s32Ratio = 168; + + s32Ret = HI_MPI_VPSS_SetLDCAttr(VpssGrp, VpssChn, &stLDCAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("set LDC failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 6: start vpss chn + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, &stVpssExtChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS CHN failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 7: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + if (VO_INTF_BT1120 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_1080P30; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + } + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n"); + goto END_1080P_2; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_2; + } + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_3; + } + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_4; + } + + s32Ret = SAMPLE_COMM_VO_BindVpss(VoDev, VoChn, VpssGrp, VpssChn); + //s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss(vo:%d)-(VpssChn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_5; + } + + VI_PAUSE(); + /****************************************** + step 8: exit process + ******************************************/ +END_1080P_5: + SAMPLE_COMM_VO_UnBindVpss(VoDev, VoChn, VpssGrp, VpssChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_4: + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_3: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_2: + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + return s32Ret; + +} +#endif + +/****************************************************************************** +* function : vi/vpss: online mode VI: DC(1080P);VPSS(ROTATE);VO: SD0(CVBS). Embeded isp, phychn channel preview. +******************************************************************************/ +HI_S32 SAMPLE_VI_VPSS_ROTATE_VO_1080P_PreView(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + HI_U32 u32ViChnCnt = 2; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + VPSS_GRP VpssGrp = 0; + VPSS_CHN VpssChn = 0; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + VPSS_EXT_CHN_ATTR_S stVpssExtChnAttr; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + ROTATE_E enRotate = ROTATE_90; + + VO_CSC_S stCSC = {0}; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8; + stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 2; + + /****************************************** + step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_0; + } + + if (pstViConfig) + { + //enRotate = pstViConfig->enRotate; + if (ROTATE_90 == enRotate || ROTATE_270 == enRotate) + { + u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \ + CEILING_2_POWER(stSize.u32Height, SAMPLE_SYS_ALIGN_WIDTH) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5)); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[1].u32BlkCnt = 20; + stVbConf.astCommPool[1].u32BlkCnt = 1; + } + } + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_TRUE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssGrpAttr.u32MaxW = stSize.u32Width; + stVpssGrpAttr.u32MaxH = stSize.u32Height; + + /****************************************** + step 5: start vpss group + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS GROUP failed!\n"); + goto END_1080P_1; + } + + stVpssChnAttr.bBorderEn = 0; + stVpssChnAttr.bFlip = 0; + stVpssChnAttr.bMirror = 0; + stVpssChnAttr.bSpEn = 0 ; + stVpssChnAttr.s32DstFrameRate = -1; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = stSize.u32Width; + stVpssChnMode.u32Height = stSize.u32Height; + + s32Ret = HI_MPI_VPSS_SetRotate(VpssGrp, VpssChn, enRotate); + + /****************************************** + step 6: start vpss chn + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, &stVpssExtChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS CHN failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 7: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n"); + goto END_1080P_2; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_2; + } + + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_FALSE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_3; + } + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_4; + } + + s32Ret = SAMPLE_COMM_VO_BindVpss(VoDev, VoChn, VpssGrp, VpssChn); + //s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss(vo:%d)-(VpssChn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_5; + } + + VI_PAUSE(); + /****************************************** + step 8: exit process + ******************************************/ +END_1080P_5: + SAMPLE_COMM_VO_UnBindVpss(VoDev, VoChn, VpssGrp, VpssChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_4: + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_3: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_2: + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + return s32Ret; +} + + + +/****************************************************************************** +* function : vi/vpss: offline mode VI: DC(1080P),ROTATE;VO: SD0(CVBS). Embeded isp, phychn channel preview. +******************************************************************************/ +HI_S32 SAMPLE_VI_ROTATE_VO_1080P_PreView(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + //HI_U32 u32ViChnCnt = 2; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VI_CHN ViChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + ROTATE_E enRotate = ROTATE_90; + + VO_CSC_S stCSC = {0}; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8; + stVbConf.astCommPool[0].u32BlkCnt = 5; + + /****************************************** + step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_0; + } + + if (pstViConfig) + { + enRotate = pstViConfig->enRotate; + if (ROTATE_90 == enRotate || ROTATE_270 == enRotate) + { + u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \ + CEILING_2_POWER(stSize.u32Height, SAMPLE_SYS_ALIGN_WIDTH) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5)); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[1].u32BlkCnt = 8; + stVbConf.astCommPool[1].u32BlkCnt = 1; + } + } + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + + + /****************************************** + step 7: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n"); + goto END_1080P_1; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + printf("w = %d, h = %d\n", stLayerAttr.stDispRect.u32Width, stLayerAttr.stDispRect.u32Height); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_1; + } + + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_FALSE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_2; + } + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_3; + } + + //s32Ret = SAMPLE_COMM_VO_BindVpss(VoDev, VoChn, VpssGrp, VpssChn); + s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss(vo:%d)-(VpssChn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_4; + } + + VI_PAUSE(); + /****************************************** + step 8: exit process + ******************************************/ +END_1080P_4: + SAMPLE_COMM_VO_UnBindVi(VoDev, VoChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_3: + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_2: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + + + +/****************************************************************************** +* function : vi/vpss: offline mode VI: DC(1080P),LDC;VO: SD0(CVBS). Embeded isp, phychn channel preview. +******************************************************************************/ +HI_S32 SAMPLE_VI_LDC_VO_1080P_PreView(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + //HI_U32 u32ViChnCnt = 2; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0; + VO_CHN VoChn = 0; + VI_CHN ViChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + ROTATE_E enRotate = ROTATE_90; + VI_LDC_ATTR_S stLDCAttr; + + VO_CSC_S stCSC = {0}; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8; + stVbConf.astCommPool[0].u32BlkCnt = 4; + + /****************************************** + step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_0; + } + + if (pstViConfig) + { + //enRotate = pstViConfig->enRotate; + if (ROTATE_90 == enRotate || ROTATE_270 == enRotate) + { + u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \ + CEILING_2_POWER(stSize.u32Height, SAMPLE_SYS_ALIGN_WIDTH) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5)); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[1].u32BlkCnt = 8; + stVbConf.astCommPool[1].u32BlkCnt = 0; + } + } + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + + + stLDCAttr.bEnable = HI_TRUE; + stLDCAttr.stAttr.enViewType = LDC_VIEW_TYPE_ALL; + stLDCAttr.stAttr.s32CenterXOffset = 0; + stLDCAttr.stAttr.s32CenterYOffset = 0; + stLDCAttr.stAttr.s32Ratio = 100; + + s32Ret = HI_MPI_VI_SetLDCAttr(ViChn, &stLDCAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("set LDC failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 7: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n"); + goto END_1080P_1; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_1; + } + + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_FALSE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_2; + } + + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_3; + } + + //s32Ret = SAMPLE_COMM_VO_BindVpss(VoDev, VoChn, VpssGrp, VpssChn); + s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss(vo:%d)-(VpssChn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_4; + } + + printf("\nplease hit any key, disable LDC\n\n"); + VI_PAUSE(); + stLDCAttr.bEnable = HI_FALSE; + + s32Ret = HI_MPI_VI_SetLDCAttr(ViChn, &stLDCAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("set LDC failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + + printf("\nplease hit any key, enable LDC\n"); + VI_PAUSE(); + + stLDCAttr.bEnable = HI_TRUE; + + s32Ret = HI_MPI_VI_SetLDCAttr(ViChn, &stLDCAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("set LDC failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + + VI_PAUSE(); + /****************************************** + step 8: exit process + ******************************************/ +END_1080P_4: + SAMPLE_COMM_VO_UnBindVi(VoDev, VoChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_3: + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_2: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + + return HI_SUCCESS; +} + + +/****************************************************************************** +* function : vi/vpss: offline mode VI: DC(1080P),DIS; VPSS:3DNR; VO: SD0(CVBS). Embeded isp, phychn channel preview. +******************************************************************************/ + +HI_S32 SAMPLE_VI_DIS_VPSS_VO_1080P_PreView(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + //HI_U32 u32ViChnCnt = 2; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VI_CHN ViChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_2MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + VPSS_GRP VpssGrp = 0; + VPSS_CHN VpssChn = 1; + VPSS_GRP_ATTR_S stVpssGrpAttr; + VPSS_CHN_ATTR_S stVpssChnAttr; + VPSS_CHN_MODE_S stVpssChnMode; + VI_CHN_ATTR_S stChnAttr; + VPSS_EXT_CHN_ATTR_S stVpssExtChnAttr; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + ROTATE_E enRotate = ROTATE_NONE; + + VO_CSC_S stCSC = {0}; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 15; + stVbConf.astCommPool[0].u32BlkCnt = 5; + + /****************************************** + step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_0; + } + + if (pstViConfig) + { + enRotate = pstViConfig->enRotate; + if (ROTATE_90 == enRotate || ROTATE_270 == enRotate) + { + u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \ + CEILING_2_POWER(stSize.u32Height, SAMPLE_SYS_ALIGN_WIDTH) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5)); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 0; + } + } + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + /* crop vi chn */ + s32Ret = HI_MPI_VI_DisableChn(ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("disable vi chn failed!\n"); + goto END_1080P_0; + } + stChnAttr.stCapRect.s32X = 0; + stChnAttr.stCapRect.s32Y = 0; + stChnAttr.stCapRect.u32Width = 1180 + 100; + stChnAttr.stCapRect.u32Height = 620 + 100; + stChnAttr.bFlip = HI_FALSE; + stChnAttr.bMirror = HI_FALSE; + stChnAttr.enCapSel = VI_CAPSEL_BOTH; + stChnAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stChnAttr.enCompressMode = COMPRESS_MODE_NONE; + stChnAttr.s32SrcFrameRate = 30; + stChnAttr.s32DstFrameRate = 30; + + stChnAttr.stDestSize.u32Width = stChnAttr.stCapRect.u32Width; + stChnAttr.stDestSize.u32Height = stChnAttr.stCapRect.u32Height; + s32Ret = HI_MPI_VI_SetChnAttr(ViChn, &stChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("set vi chn failed!\n"); + goto END_1080P_0; + } + + s32Ret = HI_MPI_VI_EnableChn(ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("enable vi chn failed!\n"); + goto END_1080P_0; + } + + stVpssGrpAttr.bDciEn = HI_FALSE; + stVpssGrpAttr.bHistEn = HI_FALSE; + stVpssGrpAttr.bIeEn = HI_FALSE; + stVpssGrpAttr.bNrEn = HI_FALSE; + stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; + stVpssGrpAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssGrpAttr.u32MaxH = 720 + 100; + stVpssGrpAttr.u32MaxW = 1280 + 100; + + + /****************************************** + step 5: start vpss group + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS GROUP failed!\n"); + goto END_1080P_1; + } + + stVpssChnAttr.bBorderEn = 0; + stVpssChnAttr.bFlip = 0; + stVpssChnAttr.bMirror = 0; + stVpssChnAttr.bSpEn = 0 ; + stVpssChnAttr.s32DstFrameRate = -1; + stVpssChnAttr.s32SrcFrameRate = -1; + stVpssChnMode.bDouble = HI_FALSE; + stVpssChnMode.enChnMode = VPSS_CHN_MODE_USER; + stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE; + stVpssChnMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + stVpssChnMode.u32Width = 1180; + stVpssChnMode.u32Height = 620; + + + VPSS_CROP_INFO_S stVpssCropInfo; + + stVpssCropInfo.bEnable = HI_TRUE; + stVpssCropInfo.enCropCoordinate = VPSS_CROP_ABS_COOR; + stVpssCropInfo.stCropRect.s32X = 50; + stVpssCropInfo.stCropRect.s32Y = 50; + stVpssCropInfo.stCropRect.u32Width = 1180; + stVpssCropInfo.stCropRect.u32Height = 620; + s32Ret = HI_MPI_VPSS_SetGrpCrop(VpssGrp, &stVpssCropInfo); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("set VPSS group crop failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 6: start vpss chn + ******************************************/ + s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, &stVpssExtChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start VPSS CHN failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 7: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n"); + goto END_1080P_2; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_2; + } + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_FALSE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_3; + } + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, enVoMode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_4; + } + + s32Ret = SAMPLE_COMM_VI_BindVpss(pstViConfig->enViMode); + + s32Ret = SAMPLE_COMM_VO_BindVpss(VoDev, VoChn + 1, VpssGrp, VpssChn); + s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss(vo:%d)-(VpssChn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_5; + } + + + ISP_DIS_ATTR_S stDisAttr; + stDisAttr.bEnable = HI_TRUE; + + int IspDev = 0; + s32Ret = HI_MPI_ISP_SetDISAttr(IspDev, &stDisAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("set DIS atrr failed!\n"); + goto END_1080P_5; + } + + printf("\n\npress key to disable dis ------\n"); + VI_PAUSE(); + + s32Ret = HI_MPI_ISP_GetDISAttr(IspDev, &stDisAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("get DIS atrr failed!\n"); + goto END_1080P_5; + } + stDisAttr.bEnable = HI_FALSE; + s32Ret = HI_MPI_ISP_SetDISAttr(IspDev, &stDisAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("set DIS atrr failed!\n"); + goto END_1080P_5; + } + printf("\n\npress key to enable dis ------\n"); + VI_PAUSE(); + + s32Ret = HI_MPI_ISP_GetDISAttr(IspDev, &stDisAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("get DIS atrr failed!\n"); + goto END_1080P_5; + } + + stDisAttr.bEnable = HI_TRUE; + s32Ret = HI_MPI_ISP_SetDISAttr(IspDev, &stDisAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("set DIS atrr failed!\n"); + goto END_1080P_5; + } + VI_PAUSE(); + + /****************************************** + step 8: exit process + ******************************************/ +END_1080P_5: + SAMPLE_COMM_VO_UnBindVi(VoDev, VoChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_4: + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_3: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_2: + SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn); + SAMPLE_COMM_VPSS_StopGroup(VpssGrp); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + + + +/****************************************************************************** +* function : VI: BT1120(1080I); VO: SD0(CVBS). bypass isp, phychn channel preview. +******************************************************************************/ +HI_S32 SAMPLE_VIO_BT1120_1080P_PreView(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + HI_U32 u32ViChnCnt = 1; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VI_CHN ViChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + + VO_CSC_S stCSC = {0}; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, PIC_HD1080, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 4; + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 3: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + /****************************************** + step 4: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 5: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + stVoPubAttr.u32BgColor = 0x000000ff; + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDevLayer failed!\n"); + goto END_1080P_1; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_1; + } + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_FALSE); + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_2; + } + + s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVi(vo:%d)-(vichn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_3; + } + + VI_PAUSE(); + /****************************************** + step 6: exit process + ******************************************/ +END_1080P_3: + SAMPLE_COMM_VO_UnBindVi(VoDev, VoChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_2: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +/****************************************************************************** +* function : VI: DC(720P); VO: SD0(CVBS). Embeded isp, one ExtChn preview. +******************************************************************************/ +HI_S32 SAMPLE_VIO_720P_Extchn_Preview(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VI_CHN ViChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + SIZE_S stSize; + VI_EXT_CHN_ATTR_S stExtChnAttr; + VI_CHN ExtChn = 1; + PIC_SIZE_E enPicSize = g_enPicSize; + + VO_CSC_S stCSC = {0}; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 5; + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, PIC_D1, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 2; + + + /****************************************** + step 2: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 3: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + stExtChnAttr.enPixFormat = SAMPLE_PIXEL_FORMAT; + stExtChnAttr.s32BindChn = ViChn; + stExtChnAttr.stDestSize.u32Width = 720; + stExtChnAttr.stDestSize.u32Height = 576; + stExtChnAttr.s32DstFrameRate = -1; + stExtChnAttr.s32SrcFrameRate = -1; + + s32Ret = HI_MPI_VI_SetExtChnAttr(ExtChn, &stExtChnAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_SetExtChnAttr failed!\n"); + goto END_1080P_0; + } + s32Ret = HI_MPI_VI_EnableChn(ExtChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("HI_MPI_VI_EnableChn failed!\n"); + goto END_1080P_0; + } + + /****************************************** + step 4: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_1; + } + + /****************************************** + step 5: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; +#ifndef HI_FPGA + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } +#else + if (VO_INTF_BT1120 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_1080P30; + gs_u32ViFrmRate = 50; + } +#endif + + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + stVoPubAttr.u32BgColor = 0x000000ff; + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDevLayer failed!\n"); + goto END_1080P_1; + } + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_2; + } + + s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ExtChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVi(vo:%d)-(vichn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_3; + } + + VI_PAUSE(); + /****************************************** + step 6: exit process + ******************************************/ +END_1080P_3: + SAMPLE_COMM_VO_UnBindVi(VoDev, VoChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_2: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_1: + s32Ret = HI_MPI_VI_DisableChn(ExtChn); + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +/****************************************************************************************************** +* function : VI: DC(720P); VO: SD0(CVBS). Embeded isp, linear/wdr change, phychn channel preview. +******************************************************************************************************/ +HI_S32 SAMPLE_VIO_720P_SensorModeChange_Preview(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VI_CHN ViChn = 0; + VO_PUB_ATTR_S stVoPubAttr; + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + + HI_S32 s32Ret = HI_SUCCESS; + HI_S32 s32GetC; + HI_U8 u8Mode; + HI_U32 u32BlkSize; + SIZE_S stSize; + ROTATE_E enRotate = ROTATE_NONE; + + VO_CSC_S stCSC = {0}; + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[0].u32BlkCnt = 5; + + /****************************************** + step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode) + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n"); + goto END_1080P_1; + } + + if (pstViConfig) + { + enRotate = pstViConfig->enRotate; + if (ROTATE_90 == enRotate || ROTATE_270 == enRotate) + { + u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \ + CEILING_2_POWER(stSize.u32Height, SAMPLE_SYS_ALIGN_WIDTH) * \ + ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5)); + stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; + stVbConf.astCommPool[1].u32BlkCnt = 0; + } + } + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + /****************************************** + step 5: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; +#ifndef HI_FPGA + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } +#else + if (VO_INTF_BT1120 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_1080P30; + gs_u32ViFrmRate = 50; + } +#endif + + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDevLayer failed!\n"); + goto END_1080P_1; + } + + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_2; + } + + s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVi(vo:%d)-(vichn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_3; + } + + printf("---------quit(q)/linear(l)/wdr(w)---------\n"); + while ((s32GetC = (char)getchar()) != 'q') + { + if ('l' == s32GetC) + { + u8Mode = 0; + } + else if ('w' == s32GetC) + { + u8Mode = 1; + } + else + { + continue; + } + + s32Ret = SAMPLE_COMM_ISP_ChangeSensorMode(u8Mode); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_ISP_ChangeSensorMode failed!\n"); + break; + } + } + + + /****************************************** + step 6: exit process + ******************************************/ +END_1080P_3: + SAMPLE_COMM_VO_UnBindVi(VoDev, VoChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_2: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); + + return s32Ret; +} + +HI_S32 SAMLE_VIO_ResolutionSwitch_Preview(SAMPLE_VI_CONFIG_S* pstViConfig) +{ + //HI_U32 u32ViChnCnt = 2; + VB_CONF_S stVbConf; + VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;; + VO_CHN VoChn = 0; + VI_DEV ViDev = 0; + VI_CHN ViChn = 0; + ISP_DEV IspDev = 0; + VO_PUB_ATTR_S stVoPubAttr; + ISP_INNER_STATE_INFO_S stInnerStateInfo; + + SIZE_S stTargetSize; + RECT_S stCapRect; + + SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX; + PIC_SIZE_E enPicSize = g_enPicSize; + VO_LAYER VoLayer = 0; + VO_VIDEO_LAYER_ATTR_S stLayerAttr; + ISP_PUB_ATTR_S stPubAttr; + + HI_S32 s32Ret = HI_SUCCESS; + HI_U32 u32BlkSize; + + VO_CSC_S stCSC = {0}; + + if ( SONY_IMX122_DC_1080P_30FPS == pstViConfig->enViMode + || SONY_IMX122_DC_720P_30FPS == pstViConfig->enViMode ) + { + enPicSize = PIC_HD1080; + } + else + { + SAMPLE_PRT("Not support this sensor type!\n"); + goto END_1080P; + } + + /****************************************** + step 1: init global variable + ******************************************/ + gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm) ? 25 : 30; + memset(&stVbConf, 0, sizeof(VB_CONF_S)); + + u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize, + SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH); + stVbConf.u32MaxPoolCnt = 128; + + /*ddr0 video buffer*/ + stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; + //stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8; + stVbConf.astCommPool[0].u32BlkCnt = 5; + + /****************************************** + step 3: mpp system init. + ******************************************/ + s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("system init failed with %d!\n", s32Ret); + goto END_1080P_0; + } + + /****************************************** + step 4: start vi dev & chn to capture + ******************************************/ + s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("start vi failed!\n"); + goto END_1080P_0; + } + + /****************************************** + step 5: start VO SD0 (bind * vi ) + ******************************************/ + stVoPubAttr.enIntfType = g_enVoIntfType; + + if (VO_INTF_BT656 == g_enVoIntfType) + { + stVoPubAttr.enIntfSync = VO_OUTPUT_PAL; + gs_u32ViFrmRate = 50; + } + else + { + stVoPubAttr.enIntfType = INTF_LCD; + stVoPubAttr.enIntfSync = SYNC_LCD; + stCSC.enCscMatrix = VO_CSC_MATRIX_BT709_TO_RGB_PC; + stCSC.u32Contrast = 50; + stCSC.u32Hue = 50; + stCSC.u32Luma = 50; + stCSC.u32Satuature = 50; + HI_MPI_VO_SetVideoLayerCSC(0, &stCSC); + } + + stVoPubAttr.u32BgColor = 0x000000ff; + + /* In HD, this item should be set to HI_FALSE */ + s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartDev failed!\n"); + goto END_1080P_1; + } + + stLayerAttr.bClusterMode = HI_FALSE; + stLayerAttr.bDoubleFrame = HI_FALSE; + stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + + stLayerAttr.stDispRect.s32X = 0; + stLayerAttr.stDispRect.s32Y = 0; + + s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, + &stLayerAttr.stDispRect.u32Width, &stLayerAttr.stDispRect.u32Height, + &stLayerAttr.u32DispFrmRt); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_GetWH failed!\n"); + goto END_1080P_1; + } + + stLayerAttr.stImageSize.u32Width = stLayerAttr.stDispRect.u32Width; + stLayerAttr.stImageSize.u32Height = stLayerAttr.stDispRect.u32Height; + + s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_2; + } + s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, VO_MODE_1MUX); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n"); + goto END_1080P_3; + } + + //s32Ret = SAMPLE_COMM_VO_BindVpss(VoDev, VoChn, VpssGrp, VpssChn); + s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn); + if (HI_SUCCESS != s32Ret) + { + SAMPLE_PRT("SAMPLE_COMM_VO_BindVpss(vo:%d)-(VpssChn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret); + goto END_1080P_4; + } + + VI_PAUSE(); + + s32Ret = HI_MPI_ISP_GetPubAttr(IspDev, &stPubAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + + SAMPLE_COMM_VI_SwitchResParam(pstViConfig, &stPubAttr, &stCapRect); + + s32Ret = HI_MPI_VI_DisableChn(ViChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + s32Ret = HI_MPI_VI_DisableDev(ViDev); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + s32Ret = SAMPLE_COMM_VI_StartMIPI(pstViConfig); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + + s32Ret = HI_MPI_ISP_SetPubAttr(IspDev, &stPubAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + while (1) + { + HI_MPI_ISP_QueryInnerStateInfo(IspDev, &stInnerStateInfo); + if (HI_TRUE == stInnerStateInfo.bResSwitchFinish) + { + SAMPLE_PRT("Res switch finish!\n"); + break; + } + usleep(1000); + } + + s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, pstViConfig->enViMode); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + + stTargetSize.u32Width = stCapRect.u32Width; + stTargetSize.u32Height = stCapRect.u32Height; + s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, pstViConfig); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + + + VI_PAUSE(); + s32Ret = HI_MPI_ISP_GetPubAttr(IspDev, &stPubAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + + SAMPLE_COMM_VI_SwitchResParam(pstViConfig, &stPubAttr, &stCapRect); + + s32Ret = HI_MPI_VI_DisableChn(ViChn); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + s32Ret = HI_MPI_VI_DisableDev(ViDev); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + s32Ret = SAMPLE_COMM_VI_StartMIPI(pstViConfig); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + s32Ret = HI_MPI_ISP_SetPubAttr(IspDev, &stPubAttr); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + + while (1) + { + HI_MPI_ISP_QueryInnerStateInfo(IspDev, &stInnerStateInfo); + if (HI_TRUE == stInnerStateInfo.bResSwitchFinish) + { + SAMPLE_PRT("Res switch finish!\n"); + break; + } + usleep(1000); + } + + s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, pstViConfig->enViMode); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + + stTargetSize.u32Width = stCapRect.u32Width; + stTargetSize.u32Height = stCapRect.u32Height; + s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, pstViConfig); + if (s32Ret != HI_SUCCESS) + { + SAMPLE_PRT("failed with %#x!\n", s32Ret); + goto END_1080P_4; + } + VI_PAUSE(); + + /****************************************** + step 8: exit process + ******************************************/ +END_1080P_4: + SAMPLE_COMM_VO_UnBindVi(VoDev, VoChn); + SAMPLE_COMM_VO_StopChn(VoDev, enVoMode); +END_1080P_3: + SAMPLE_COMM_VO_StopLayer(VoLayer); +END_1080P_2: + SAMPLE_COMM_VO_StopDev(VoDev); +END_1080P_1: + SAMPLE_COMM_VI_StopVi(pstViConfig); +END_1080P_0: + SAMPLE_COMM_SYS_Exit(); +END_1080P: + return s32Ret; +} + +/****************************************************************************** +* function : main() +* Description : video preview sample +******************************************************************************/ +int main(int argc, char* argv[]) +{ + HI_S32 s32Ret = HI_FAILURE; + + if ( (argc < 2) || (1 != strlen(argv[1]))) + { + SAMPLE_VIO_Usage(argv[0]); + return HI_FAILURE; + } + + signal(SIGINT, SAMPLE_VIO_HandleSig); + signal(SIGTERM, SAMPLE_VIO_HandleSig); + + if ((argc > 2) && *argv[2] == '1') /* '1': VO_INTF_BT656, else: VO_INTF_LCD */ + { + g_enVoIntfType = VO_INTF_BT656; + } + + g_stViChnConfig.enViMode = SENSOR_TYPE; + SAMPLE_COMM_VI_GetSizeBySensor(&g_enPicSize); + + switch (*argv[1]) + { + /* VI: DC(720P); VO: SD0(CVBS). Embeded isp, phychn channel preview. */ + case '0': + s32Ret = SAMPLE_VIO_1080P_PreView(&g_stViChnConfig); + break; + + case '1': + s32Ret = SAMPLE_VIO_FRAME_FPN_PreView(&g_stViChnConfig); + break; + + case '2': + s32Ret = SAMPLE_VI_VPSS_ROTATE_VO_1080P_PreView(&g_stViChnConfig); + break; + case '3': + g_stViChnConfig.enRotate = ROTATE_90; + s32Ret = SAMPLE_VI_ROTATE_VO_1080P_PreView(&g_stViChnConfig); + break; + case '4': + s32Ret = SAMPLE_VI_LDC_VO_1080P_PreView(&g_stViChnConfig); + break; + case '5': + s32Ret = SAMPLE_VI_DIS_VPSS_VO_1080P_PreView(&g_stViChnConfig); + break; + + /* VI: BT1120(1080I); VO:HD0(HDMI). Isp bypass, phychn channel preview. */ + case '6': + g_stViChnConfig.enViMode = SAMPLE_VI_MODE_BT1120_1080P; + g_stViChnConfig.enNorm = VIDEO_ENCODING_MODE_PAL; + s32Ret = SAMPLE_VIO_BT1120_1080P_PreView(&g_stViChnConfig); + break; + case '7': + s32Ret = SAMLE_VIO_ResolutionSwitch_Preview(&g_stViChnConfig); + break; + default: + SAMPLE_PRT("the index is invaild!\n"); + SAMPLE_VIO_Usage(argv[0]); + return HI_FAILURE; + } + + if (HI_SUCCESS == s32Ret) + { SAMPLE_PRT("program exit normally!\n"); } + else + { SAMPLE_PRT("program exit abnormally!\n"); } + exit(s32Ret); +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + diff --git a/device/mpp/tools/Makefile b/device/mpp/tools/Makefile new file mode 100644 index 0000000..dd56785 --- /dev/null +++ b/device/mpp/tools/Makefile @@ -0,0 +1,123 @@ +ifeq ($(PARAM_FILE), ) + PARAM_FILE:=../Makefile.param + include $(PARAM_FILE) +endif + +SRC := $(wildcard *.c) +OBJ := $(SRC:%.c=%.o) + +INC_FLAGS := -I$(REL_INC) +INC_FLAGS += -I$(SDK_PATH)/mpp/code/include/inner_inc +CFLAGS += -Wall -g -ldl -lpthread $(INC_FLAGS) + +LIBS += $(REL_LIB)/lib_hiae.a +LIBS += $(REL_LIB)/libisp.a + +LIBS += $(REL_LIB)/lib_hiawb.a +LIBS += $(REL_LIB)/lib_hiaf.a +LIBS += $(REL_LIB)/lib_hidefog.a + +LIBS += $(REL_LIB)/libmpi.a + + +# sensor input type: ar130 mn34031 +SNS:=$(MAKECMDGOALS) + +CFLAGS += $(LIBS_CFLAGS) + +ifeq ($(SNS),) +SNS:=imx222 +endif + +ifeq ($(SNS), mn34220) +LIBS += $(REL_LIB)/libsns_mn34220.a +CFLAGS += -DSNS_MN34220 +endif + +ifeq ($(SNS), mn34220_mipi) +LIBS += $(REL_LIB)/libsns_mn34220_mipi.a +CFLAGS += -DSNS_MN34220_MIPI +endif + +ifeq ($(SNS), imx178) +LIBS += $(REL_LIB)/libsns_imx178.a +CFLAGS += -DSNS_IMX178 +endif + +ifeq ($(SNS), imx185) +LIBS += $(REL_LIB)/libsns_imx185.a +CFLAGS += -DSNS_IMX185 +endif + +ifeq ($(SNS), ar0130) +LIBS += $(REL_LIB)/libsns_ar0130_720p.a +CFLAGS += -DSNS_AR0130 +endif + +ifeq ($(SNS), ar0130_960p) +LIBS += $(REL_LIB)/libsns_ar0130_960p.a +CFLAGS += -DSNS_AR0130_960P +endif + +ifeq ($(SNS), 9m034) +LIBS += $(REL_LIB)/libsns_9m034.a +CFLAGS += -DSNS_9M034 +endif + +ifeq ($(SNS), 9m034_960p) +LIBS += $(REL_LIB)/libsns_9m034_960p.a +CFLAGS += -DSNS_9M034_960P +endif + +ifeq ($(SNS), imx104) +LIBS += $(REL_LIB)/libsns_imx104.a +CFLAGS += -DSNS_IMX104 +endif + +ifeq ($(SNS), imx122) +LIBS += $(REL_LIB)/libsns_imx122.a +CFLAGS += -DSNS_IMX122 +endif + +ifeq ($(SNS), ov4682) +LIBS += $(REL_LIB)/libsns_ov4682.a +CFLAGS += -DSNS_ov4682 +endif + +ifeq ($(SNS), mn34031) +LIBS += $(REL_LIB)/libsns_mn34031_720p.a +CFLAGS += -DSNS_MN34031 +endif + +ifeq ($(SNS), ov9712) +LIBS += $(REL_LIB)/libsns_ov9712.a +CFLAGS += -DSNS_OV9712 +endif + +ifeq ($(SNS), mt9p006) +LIBS += $(REL_LIB)/libsns_mt9p006.a +CFLAGS += -DSNS_MT9P006 +endif + +ifeq ($(SNS), mt9v139) +LIBS += $(REL_LIB)/libsns_mt9v139_d1.a +CFLAGS += -DSNS_MT9V139_D1 +endif + +CFLAGS += -lm +TARGET := $(OBJ:%.o=%) + +.PHONY : clean all $(SNS) + +all: $(TARGET) + +$(TARGET):%:%.o + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) $(AUDIO_LIBA) + @rm *.o +clean: + @rm -f $(TARGET) + @rm -f $(OBJ) +ifneq ($(SNS), clean) +$(SNS): all + @echo +endif diff --git a/device/mpp/tools/aenc_dump b/device/mpp/tools/aenc_dump new file mode 100644 index 0000000..0c5ecec Binary files /dev/null and b/device/mpp/tools/aenc_dump differ diff --git a/device/mpp/tools/aenc_dump.c b/device/mpp/tools/aenc_dump.c new file mode 100644 index 0000000..c3bffff --- /dev/null +++ b/device/mpp/tools/aenc_dump.c @@ -0,0 +1,145 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_aio.h" +#include "mpi_aenc.h" + + +#define VALUE_BETWEEN(x,min,max) (((x)>=(min)) && ((x) <= (max))) + +HI_S32 main(int argc, char *argv[]) +{ + AENC_CHN AencChn; + HI_U32 u32Size = 1024; + AUDIO_SAVE_FILE_INFO_S stSaveFileInfo; + HI_S32 s32Ret; + FILE *fp = NULL; + HI_CHAR aCurPath[258]; /*256 + '\n'+'\0'*/ + HI_S32 s32CurrentPath = -1; + + printf("Usage: ./aenc_dump [chn] [name] [size] [path]\n"); + printf("chn: aenc chn id.\n"); + printf("name: file name (default).\n"); + printf("size: file size(KB)(defaultly 1M).\n"); + printf("path: path for saving(current path if NULL).\n\n\n"); + + if ((argc < 2)||(argc > 5)) + { + printf("wrong arg!!!!\n\n"); + return -1; + } + + AencChn = atoi(argv[1]);/* chn id*/ + if (!VALUE_BETWEEN(AencChn, 0, AENC_MAX_CHN_NUM)) + { + printf("chn id must be [0,32]!!!!\n\n"); + return -1; + } + + if (argc>=3) + { + if (!VALUE_BETWEEN(strlen(argv[2]), 0, 256)) + { + printf("path lenth must be [0,256]!!!!\n\n"); + return -1; + } + memcpy(stSaveFileInfo.aFileName, argv[2], strlen(argv[2])); + stSaveFileInfo.aFileName[strlen(argv[2])] = '\0'; + } + else + { + memcpy(stSaveFileInfo.aFileName, "default", strlen("default")+1); + } + + if (argc>=4) + { + if (!VALUE_BETWEEN(atoi(argv[3]), 1, 10*1024)) + { + printf("file size must be [1, 10*1024]!!!!\n\n"); + return -1; + } + u32Size = atoi(argv[3]);/* frame count*/ + } + + if (argc>=5) + { + if (!VALUE_BETWEEN(strlen(argv[4]), 0, 256)) + { + printf("path lenth must be [0, 256]!!!!\n\n"); + return -1; + } + memcpy(stSaveFileInfo.aFilePath,argv[4],strlen(argv[4])); + stSaveFileInfo.aFilePath[strlen(argv[4])] = '\0'; + + if (stSaveFileInfo.aFilePath[0] == '.' && (stSaveFileInfo.aFilePath[1] == '\0' || stSaveFileInfo.aFilePath[1] == '/')) + { + s32CurrentPath = 0; + } + } + else + { + s32CurrentPath = 1; + } + + if (s32CurrentPath != -1) + { + fp = popen("pwd", "r"); + fgets(aCurPath, sizeof(aCurPath), fp); + if (!VALUE_BETWEEN(strlen(aCurPath), 0, 256)) + { + printf("path lenth must be [0,256]!!!!\n\n"); + return -1; + } + aCurPath[strlen(aCurPath) - 1] = '/'; /*replace '\n' with '/'*/ + + if (s32CurrentPath == 0) + { + HI_U32 i = 2; + HI_U32 u32Len = strlen(aCurPath); + if (!VALUE_BETWEEN(strlen(aCurPath)+strlen(stSaveFileInfo.aFilePath), 0, 256)) + { + printf("path lenth must be [0,256]!!!!\n\n"); + return -1; + } + + while (strlen(stSaveFileInfo.aFilePath) > 1 && stSaveFileInfo.aFilePath[i] != '\0') + { + + aCurPath[u32Len+i-2] = stSaveFileInfo.aFilePath[i]; + + i ++; + } + + aCurPath[u32Len+i-2] = '\0'; + } + snprintf(stSaveFileInfo.aFilePath, 256, "%s", aCurPath); + + pclose(fp); + //memcpy(stSaveFileInfo.aFilePath,"./",strlen("./")+1); + } + + stSaveFileInfo.u32FileSize = u32Size; + stSaveFileInfo.bCfg = HI_TRUE; + + printf("File path:%s, file name:%s, file size:%d*1024\n\n", stSaveFileInfo.aFilePath, stSaveFileInfo.aFileName, stSaveFileInfo.u32FileSize); + s32Ret = HI_MPI_AENC_SaveFile(AencChn,&stSaveFileInfo); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_AENC_SaveFile() error,ret=%x!!!!\n\n",s32Ret); + return -1; + } + + return HI_SUCCESS; +} + diff --git a/device/mpp/tools/ai_dump b/device/mpp/tools/ai_dump new file mode 100644 index 0000000..48ceb21 Binary files /dev/null and b/device/mpp/tools/ai_dump differ diff --git a/device/mpp/tools/ai_dump.c b/device/mpp/tools/ai_dump.c new file mode 100644 index 0000000..b5e37c8 --- /dev/null +++ b/device/mpp/tools/ai_dump.c @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_aio.h" +#include "mpi_ai.h" + + +#define VALUE_BETWEEN(x,min,max) (((x)>=(min)) && ((x) <= (max))) + +HI_S32 main(int argc, char *argv[]) +{ + AUDIO_DEV AiDevId; + AI_CHN AiChn; + HI_U32 u32Size = 1024; + AUDIO_SAVE_FILE_INFO_S stSaveFileInfo; + HI_S32 s32Ret; + FILE *fp = NULL; + HI_CHAR aCurPath[258]; /*256 + '\n'+'\0'*/ + HI_S32 s32CurrentPath = -1; + + printf("Usage: ./ai_dump [dev] [chn] [name] [size] [path]\n"); + printf("dev: ai dev id.\n"); + printf("chn: ai chn id.\n"); + printf("name: file name (default).\n"); + printf("size: file size(KB)(defalutly 1M).\n"); + printf("path: path for saving(current path if NULL).\n\n\n"); + + if ((argc < 3)||(argc > 6)) + { + printf("wrong arg!!!!\n\n"); + return -1; + } + + AiDevId = atoi(argv[1]); + if (!VALUE_BETWEEN(AiDevId, 0, AI_DEV_MAX_NUM)) + { + printf("grp id must be [0,1]!!!!\n\n"); + return -1; + } + + AiChn = atoi(argv[2]);/* chn id*/ + if (!VALUE_BETWEEN(AiDevId, 0, AIO_MAX_CHN_NUM)) + { + printf("chn id must be [0,16]!!!!\n\n"); + return -1; + } + + if (argc>=4) + { + if (!VALUE_BETWEEN(strlen(argv[3]), 0, 256)) + { + printf("path name lenth must be [0,256]!!!!\n\n"); + return -1; + } + + memcpy(stSaveFileInfo.aFileName, argv[3], strlen(argv[3])); + stSaveFileInfo.aFileName[strlen(argv[3])] = '\0'; + } + else + { + memcpy(stSaveFileInfo.aFileName, "default", strlen("default")+1); + } + + if (argc>=5) + { + if (!VALUE_BETWEEN(atoi(argv[4]), 1, 10*1024)) + { + printf("file size must be [1, 10*1024]!!!!\n\n"); + return -1; + } + u32Size = atoi(argv[4]);/* frame count*/ + } + + if (argc>=6) + { + if (!VALUE_BETWEEN(strlen(argv[5]), 0, 256)) + { + printf("path lenth must be [0,256]!!!!\n\n"); + return -1; + } + memcpy(stSaveFileInfo.aFilePath,argv[5],strlen(argv[5])); + stSaveFileInfo.aFilePath[strlen(argv[5])] = '\0'; + + if (stSaveFileInfo.aFilePath[0] == '.' && (stSaveFileInfo.aFilePath[1] == '\0' || stSaveFileInfo.aFilePath[1] == '/')) + { + s32CurrentPath = 0; + } + } + else + { + s32CurrentPath = 1; + } + + if (s32CurrentPath != -1) + { + fp = popen("pwd", "r"); + fgets(aCurPath, sizeof(aCurPath), fp); + if (!VALUE_BETWEEN(strlen(aCurPath), 0, 256)) + { + printf("path lenth must be [0,256]!!!!\n\n"); + return -1; + } + aCurPath[strlen(aCurPath) - 1] = '/'; /*replace '\n' with '/'*/ + + if (s32CurrentPath == 0) + { + HI_U32 i = 2; + HI_U32 u32Len = strlen(aCurPath); + if (!VALUE_BETWEEN(strlen(aCurPath)+strlen(stSaveFileInfo.aFilePath), 0, 256)) + { + printf("path lenth must be [0,256]!!!!\n\n"); + return -1; + } + + while (strlen(stSaveFileInfo.aFilePath) > 1 && stSaveFileInfo.aFilePath[i] != '\0') + { + + aCurPath[u32Len+i-2] = stSaveFileInfo.aFilePath[i]; + + i ++; + } + + aCurPath[u32Len+i-2] = '\0'; + } + snprintf(stSaveFileInfo.aFilePath, 256, "%s", aCurPath); + + pclose(fp); + //memcpy(stSaveFileInfo.aFilePath,"./",strlen("./")+1); + } + + stSaveFileInfo.u32FileSize = u32Size; + stSaveFileInfo.bCfg = HI_TRUE; + + printf("File path:%s, file name:%s, file size:%d*1024\n\n", stSaveFileInfo.aFilePath, stSaveFileInfo.aFileName, stSaveFileInfo.u32FileSize); + s32Ret = HI_MPI_AI_SaveFile(AiDevId, AiChn, &stSaveFileInfo); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_AI_SaveFile() error,ret=%x!!!!\n\n",s32Ret); + return -1; + } + + return HI_SUCCESS; +} + diff --git a/device/mpp/tools/ao_dump b/device/mpp/tools/ao_dump new file mode 100644 index 0000000..f74345d Binary files /dev/null and b/device/mpp/tools/ao_dump differ diff --git a/device/mpp/tools/ao_dump.c b/device/mpp/tools/ao_dump.c new file mode 100644 index 0000000..d8d37e5 --- /dev/null +++ b/device/mpp/tools/ao_dump.c @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_aio.h" +#include "mpi_ao.h" + + +#define VALUE_BETWEEN(x,min,max) (((x)>=(min)) && ((x) <= (max))) + +HI_S32 main(int argc, char *argv[]) +{ + AUDIO_DEV AoDevId; + AO_CHN AoChn; + HI_U32 u32Size = 1024; + AUDIO_SAVE_FILE_INFO_S stSaveFileInfo; + HI_S32 s32Ret; + FILE *fp = NULL; + HI_CHAR aCurPath[258]; /*256 + '\n'+'\0'*/ + HI_S32 s32CurrentPath = -1; + + printf("Usage: ./ao_dump [dev] [chn] [name] [size] [path]\n"); + printf("dev: ao dev id.\n"); + printf("chn: ao chn id.\n"); + printf("name: file name (default).\n"); + printf("size: file size(KB)(defalutly 1M).\n"); + printf("path: path for saving(current path if NULL).\n\n\n"); + + if ((argc < 3)||(argc > 6)) + { + printf("wrong arg!!!!\n\n"); + return -1; + } + + AoDevId = atoi(argv[1]); + if (!VALUE_BETWEEN(AoDevId, 0, AO_DEV_MAX_NUM)) + { + printf("grp id must be [0,1]!!!!\n\n"); + return -1; + } + + AoChn = atoi(argv[2]);/* chn id*/ + if (!VALUE_BETWEEN(AoDevId, 0, AIO_MAX_CHN_NUM)) + { + printf("chn id must be [0,16]!!!!\n\n"); + return -1; + } + + if (argc>=4) + { + if (!VALUE_BETWEEN(strlen(argv[3]), 0, 256)) + { + printf("path name lenth must be [0,256]!!!!\n\n"); + return -1; + } + + memcpy(stSaveFileInfo.aFileName, argv[3], strlen(argv[3])); + stSaveFileInfo.aFileName[strlen(argv[3])] = '\0'; + } + else + { + memcpy(stSaveFileInfo.aFileName, "default", strlen("default")+1); + } + + if (argc>=5) + { + if (!VALUE_BETWEEN(atoi(argv[4]), 1, 10*1024)) + { + printf("file size must be [1, 10*1024]!!!!\n\n"); + return -1; + } + u32Size = atoi(argv[4]);/* frame count*/ + } + + if (argc>=6) + { + if (!VALUE_BETWEEN(strlen(argv[5]), 0, 256)) + { + printf("path lenth must be [0,256]!!!!\n\n"); + return -1; + } + memcpy(stSaveFileInfo.aFilePath,argv[5],strlen(argv[5])); + stSaveFileInfo.aFilePath[strlen(argv[5])] = '\0'; + + if (stSaveFileInfo.aFilePath[0] == '.' && (stSaveFileInfo.aFilePath[1] == '\0' || stSaveFileInfo.aFilePath[1] == '/')) + { + s32CurrentPath = 0; + } + } + else + { + s32CurrentPath = 1; + } + + if (s32CurrentPath != -1) + { + fp = popen("pwd", "r"); + fgets(aCurPath, sizeof(aCurPath), fp); + if (!VALUE_BETWEEN(strlen(aCurPath), 0, 256)) + { + printf("path lenth must be [0,256]!!!!\n\n"); + return -1; + } + aCurPath[strlen(aCurPath) - 1] = '/'; /*replace '\n' with '/'*/ + + if (s32CurrentPath == 0) + { + HI_U32 i = 2; + HI_U32 u32Len = strlen(aCurPath); + if (!VALUE_BETWEEN(strlen(aCurPath)+strlen(stSaveFileInfo.aFilePath), 0, 256)) + { + printf("path lenth must be [0,256]!!!!\n\n"); + return -1; + } + + while (strlen(stSaveFileInfo.aFilePath) > 1 && stSaveFileInfo.aFilePath[i] != '\0') + { + + aCurPath[u32Len+i-2] = stSaveFileInfo.aFilePath[i]; + + i ++; + } + + aCurPath[u32Len+i-2] = '\0'; + } + snprintf(stSaveFileInfo.aFilePath, 256, "%s", aCurPath); + + pclose(fp); + //memcpy(stSaveFileInfo.aFilePath,"./",strlen("./")+1); + } + + stSaveFileInfo.u32FileSize = u32Size; + stSaveFileInfo.bCfg = HI_TRUE; + + printf("File path:%s, file name:%s, file size:%d*1024\n\n", stSaveFileInfo.aFilePath, stSaveFileInfo.aFileName, stSaveFileInfo.u32FileSize); + s32Ret = HI_MPI_AO_SaveFile(AoDevId, AoChn, &stSaveFileInfo); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_AO_SaveFile() error,ret=%x!!!!\n\n",s32Ret); + return -1; + } + + return HI_SUCCESS; +} + diff --git a/device/mpp/tools/isp_debug b/device/mpp/tools/isp_debug new file mode 100644 index 0000000..6f1f43b Binary files /dev/null and b/device/mpp/tools/isp_debug differ diff --git a/device/mpp/tools/isp_debug.c b/device/mpp/tools/isp_debug.c new file mode 100644 index 0000000..8ae47b6 --- /dev/null +++ b/device/mpp/tools/isp_debug.c @@ -0,0 +1,307 @@ +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "hi_comm_isp.h" +#include "mpi_isp.h" +#include "hi_sns_ctrl.h" +#include "hi_ae_comm.h" +#include "hi_awb_comm.h" +#include "mpi_ae.h" +#include "mpi_awb.h" + +HI_U32 au32Size[3] = {0}; +HI_U32 au32PhyAddr[3] = {0}; +HI_VOID* apVitAddr[3] = {HI_NULL}; /* virt addr malloc memory */ +HI_VOID* apVirtAddr[3] = {HI_NULL}; /* virt addr mmap */ +FILE* afp[3] = {HI_NULL}; + +extern HI_S32 HI_MPI_AE_Ctrl(ALG_LIB_S* pstAeLib, HI_U32 u32Cmd, HI_VOID* pValue); +extern HI_S32 HI_MPI_AWB_Ctrl(ALG_LIB_S* pstAwbLib, HI_U32 u32Cmd, HI_VOID* pValue); + +static inline HI_VOID Useage(HI_VOID) +{ + printf("\nNOTICE: This tool only can be used for DEBUG_ING !!!\n"); + printf("usage: ./Isp debug [ispdepth] [aedepth] [awbdepth]. sample: ./isp_debug 10 10 10\n"); + printf("[ispdepth]----------the frame number of isp\n"); + printf("[aedepth] ----------the frame number of ae\n"); + printf("[awbdepth]----------the frame number of awb\n\n"); + + return; +} + +HI_S32 ISP_DEBUG_Exit(HI_VOID) +{ + HI_S32 i, s32Ret = 0; + ISP_DEBUG_INFO_S stDebug; + ALG_LIB_S stLib; + + // stop isp debug + stDebug.bDebugEn = 0; + stDebug.u32Depth = 0; + stDebug.u32PhyAddr = 0; + s32Ret = HI_MPI_ISP_SetDebug(0, &stDebug); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetDebug failed 0x%x! Line: %d\n", s32Ret, __LINE__); + return HI_FAILURE; + } + + // stop AE debug + stDebug.bDebugEn = 0; + stDebug.u32Depth = 0; + stDebug.u32PhyAddr = 0; + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AE_LIB_NAME); + s32Ret = HI_MPI_AE_Ctrl(&stLib, AE_DEBUG_ATTR_SET, (HI_VOID*)&stDebug); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_AE_Ctrl failed 0x%x!\n", s32Ret); + return HI_FAILURE; + } + + // stop AWB debug + stDebug.bDebugEn = 0; + stDebug.u32Depth = 0; + stDebug.u32PhyAddr = 0; + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AWB_LIB_NAME); + s32Ret = HI_MPI_AWB_Ctrl(&stLib, AWB_DEBUG_ATTR_SET, (HI_VOID*)&stDebug); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_AwbCtrl failed 0x%x!\n", s32Ret); + return HI_FAILURE; + } + + sleep(1); + + for (i = 0; i < 3; i++) + { + if (HI_NULL != afp[i]) + { + fclose(afp[i]); + afp[i] = HI_NULL; + } + + if ((HI_NULL != apVirtAddr[i]) && (0 != au32Size[i])) + { + HI_MPI_SYS_Munmap(apVirtAddr[i], au32Size[i]); + apVirtAddr[i] = HI_NULL; + au32Size[i] = 0; + } + + if ((0 != au32PhyAddr[i]) && (HI_NULL != apVitAddr[i])) + { + HI_MPI_SYS_MmzFree(au32PhyAddr[i], apVitAddr[i]); + au32PhyAddr[i] = 0; + apVitAddr[i] = HI_NULL; + } + } + + return HI_SUCCESS; +} + +HI_VOID ISP_DEBUG_HandleSig(HI_S32 s32SigNo) +{ + if (SIGINT == s32SigNo || SIGTERM == s32SigNo) + { + ISP_DEBUG_Exit(); + } + + exit(0); +} + +HI_S32 main(int argc, char* argv[]) +{ + HI_S32 i, s32Ret = 0; + + HI_U32 au32Depth[3] = {0}; + HI_CHAR* acFilename[3] = {HI_NULL}; + ISP_DEBUG_INFO_S stDebug; + ALG_LIB_S stLib; + + signal(SIGINT, ISP_DEBUG_HandleSig); + signal(SIGTERM, ISP_DEBUG_HandleSig); + + Useage(); + + if ((argc <= 1) || (argc > 4)) + { + Useage(); + return HI_FAILURE; + } + + if (argc > 1) + { + au32Depth[0] = atoi(argv[1]);/* the frame depth */ + if (0 == au32Depth[0]) + { + Useage(); + return HI_FAILURE; + } + } + + if (argc > 2) + { + au32Depth[1] = atoi(argv[2]);/* the frame depth */ + if (0 == au32Depth[1]) + { + Useage(); + return HI_FAILURE; + } + } + + if (argc > 3) + { + au32Depth[2] = atoi(argv[3]);/* the frame depth */ + if (0 == au32Depth[2]) + { + Useage(); + return HI_FAILURE; + } + } + + if (argc > 1) + { + au32Size[0] = sizeof(ISP_DBG_ATTR_S) + sizeof(ISP_DBG_STATUS_S) * au32Depth[0]; + s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&au32PhyAddr[0], &apVitAddr[0], HI_NULL, HI_NULL, au32Size[0]); + if (HI_SUCCESS != s32Ret) + { + printf("Buf not enough!\n"); + return HI_FAILURE; + } + + stDebug.bDebugEn = HI_TRUE; + stDebug.u32Depth = au32Depth[0]; + stDebug.u32PhyAddr = au32PhyAddr[0]; + s32Ret = HI_MPI_ISP_SetDebug(0, &stDebug); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_SetDebug failed 0x%x!\n", s32Ret); + return HI_FAILURE; + } + } + + if (argc > 2) + { + au32Size[1] = sizeof(AE_DBG_ATTR_S) + sizeof(AE_DBG_STATUS_S) * au32Depth[1]; + s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&au32PhyAddr[1], &apVitAddr[1], HI_NULL, HI_NULL, au32Size[1]); + if (HI_SUCCESS != s32Ret) + { + printf("Buf not enough!\n"); + return HI_FAILURE; + } + + stDebug.bDebugEn = HI_TRUE; + stDebug.u32Depth = au32Depth[1]; + stDebug.u32PhyAddr = au32PhyAddr[1]; + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AE_LIB_NAME); + s32Ret = HI_MPI_AE_Ctrl(&stLib, AE_DEBUG_ATTR_SET, (HI_VOID*)&stDebug); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_AE_Ctrl failed 0x%x!\n", s32Ret); + return HI_FAILURE; + } + } + + if (argc > 3) + { + au32Size[2] = sizeof(AWB_DBG_ATTR_S) + sizeof(AWB_DBG_STATUS_S) * au32Depth[2]; + s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&au32PhyAddr[2], &apVitAddr[2], HI_NULL, HI_NULL, au32Size[2]); + if (HI_SUCCESS != s32Ret) + { + printf("Buf not enough!\n"); + return HI_FAILURE; + } + + stDebug.bDebugEn = HI_TRUE; + stDebug.u32Depth = au32Depth[2]; + stDebug.u32PhyAddr = au32PhyAddr[2]; + stLib.s32Id = 0; + strcpy(stLib.acLibName, HI_AWB_LIB_NAME); + s32Ret = HI_MPI_AWB_Ctrl(&stLib, AWB_DEBUG_ATTR_SET, (HI_VOID*)&stDebug); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_ISP_AwbCtrl failed 0x%x!\n", s32Ret); + return HI_FAILURE; + } + } + + printf("Waiting, press any key to stop write debug info!\n"); + getchar(); + + for (i = 0; i < argc - 1; i++) + { + apVirtAddr[i] = HI_MPI_SYS_Mmap(au32PhyAddr[i], au32Size[i]); + if (HI_NULL == apVirtAddr[i]) + { + printf("HI_MPI_SYS_Mmap failed!\n"); + return HI_FAILURE; + } + + if (0 == i) + { + acFilename[i] = "isp_debug_sys.dat"; + } + else if (1 == i) + { + acFilename[i] = "isp_debug_ae.dat"; + } + else if (2 == i) + { + acFilename[i] = "isp_debug_awb.dat"; + } + else + { + } + + afp[i] = fopen(acFilename[i], "wb"); + if (afp[i] == HI_NULL) + { + printf("open file %s error \n", acFilename[i]); + return HI_FAILURE; + } + else + { + fwrite(apVirtAddr[i], 1, au32Size[i], afp[i]); + } + } + + ISP_DEBUG_Exit(); + + return HI_SUCCESS; +} + + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + + diff --git a/device/mpp/tools/isp_debug_ae.dat b/device/mpp/tools/isp_debug_ae.dat new file mode 100644 index 0000000..726092f Binary files /dev/null and b/device/mpp/tools/isp_debug_ae.dat differ diff --git a/device/mpp/tools/isp_debug_awb.dat b/device/mpp/tools/isp_debug_awb.dat new file mode 100644 index 0000000..ab292cb Binary files /dev/null and b/device/mpp/tools/isp_debug_awb.dat differ diff --git a/device/mpp/tools/isp_debug_sys.dat b/device/mpp/tools/isp_debug_sys.dat new file mode 100644 index 0000000..65dcf04 Binary files /dev/null and b/device/mpp/tools/isp_debug_sys.dat differ diff --git a/device/mpp/tools/rc_attr b/device/mpp/tools/rc_attr new file mode 100644 index 0000000..7fdbca0 Binary files /dev/null and b/device/mpp/tools/rc_attr differ diff --git a/device/mpp/tools/rc_attr.c b/device/mpp/tools/rc_attr.c new file mode 100644 index 0000000..e061d4c --- /dev/null +++ b/device/mpp/tools/rc_attr.c @@ -0,0 +1,223 @@ +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_vo.h" +#include "hi_comm_rc.h" +#include "hi_comm_venc.h" + +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_vi.h" +#include "mpi_vo.h" +#include "mpi_venc.h" + +#define USAGE_HELP(void)\ + {\ + printf("\n\tusage : %s group para value\n", argv[0]); \ + printf("\n\t para: \n"); \ + printf("\tstattime [ͳʱ,λ:\n"); \ + printf("\t bitrate ʣλ:kbps\n"); \ + printf("\tgop I֡ļλ:֡\n"); \ + printf("\tqpdelta I֡P֡QP죬ԽЧõЧӦ\n"); \ + printf("\tmqpdelta ں鼶ʿʱÿһкʼQp֡ʼQpIJֵ\n"); \ + printf("\tmaxqp QPԼ\n"); \ + } + +#define CHECK_RET(express,name)\ + do{\ + if (HI_SUCCESS != express)\ + {\ + printf("%s failed at %s: LINE: %d ! errno:%d \n",\ + name, __FUNCTION__, __LINE__, express);\ + return HI_FAILURE;\ + }\ + }while(0) + + +HI_S32 main(int argc, char* argv[]) +{ + HI_S32 s32Ret; + HI_S32 s32EncChn; + HI_CHAR para[16]; + HI_U32 value = 0; + HI_U32 i; + VENC_RC_MODE_E eMode; + + VENC_RC_PARAM_S stVencRcParam; + VENC_CHN_ATTR_S stVencChnAttr; + + if (argc < 3) + { + USAGE_HELP(); + return -1; + } + s32EncChn = 0; + s32EncChn = atoi(argv[1]); + strcpy(para, argv[2]); + + s32Ret = HI_MPI_VENC_GetRcParam(s32EncChn, &stVencRcParam); + CHECK_RET(s32Ret, "get Rc param"); + s32Ret = HI_MPI_VENC_GetChnAttr(s32EncChn, &stVencChnAttr); + CHECK_RET(s32Ret, "get Rc Attr"); + + eMode = stVencChnAttr.stRcAttr.enRcMode; + + + if (0 == strcmp(para, "?")) + { + if (eMode == VENC_RC_MODE_H264CBR) + { + printf("\tstattime %d\n", stVencChnAttr.stRcAttr.stAttrH264Cbr.u32StatTime); + printf("\tbitrate %d\n", stVencChnAttr.stRcAttr.stAttrH264Cbr.u32BitRate); + printf("\tgop %d\n", stVencChnAttr.stRcAttr.stAttrH264Cbr.u32Gop); + printf("\tqpdelta %d\n", stVencRcParam.stParamH264Cbr.s32IPQPDelta); + printf("\tmaxqp %d\n", stVencRcParam.stParamH264Cbr.u32MaxQp); + } + else + { + printf("\tstattime %d\n", stVencChnAttr.stRcAttr.stAttrH265Cbr.u32StatTime); + printf("\tbitrate %d\n", stVencChnAttr.stRcAttr.stAttrH265Cbr.u32BitRate); + printf("\tgop %d\n", stVencChnAttr.stRcAttr.stAttrH265Cbr.u32Gop); + printf("\tqpdelta %d\n", stVencRcParam.stParamH265Cbr.s32IPQPDelta); + printf("\tmaxqp %d\n", stVencRcParam.stParamH265Cbr.u32MaxQp); + } + + printf("\tmqpdelta %d\n", stVencRcParam.u32RowQpDelta); + return 0; + } + value = atoi(argv[3]); + printf("chn %d, para %s, value %d\n", s32EncChn, para, value); + if (0 == strcmp(para, "stattime")) + { + if (eMode == VENC_RC_MODE_H264CBR) + { + stVencChnAttr.stRcAttr.stAttrH264Cbr.u32StatTime = value; + } + else + { + stVencChnAttr.stRcAttr.stAttrH265Cbr.u32StatTime = value; + } + } + if (0 == strcmp(para, "thresh") && argc == 15) + { + for (i = 0; i < 12; i++) + { + stVencRcParam.u32ThrdI[i] = atoi(argv[i + 3]); + stVencRcParam.u32ThrdP[i] = atoi(argv[i + 3]); + } + } + if (0 == strcmp(para, "pthresh") && argc == 15) + { + for (i = 0; i < 12; i++) + { + stVencRcParam.u32ThrdP[i] = atoi(argv[i + 3]); + } + } + else if (0 == strcmp(para, "bitrate")) + { + if (eMode == VENC_RC_MODE_H264CBR) + { + stVencChnAttr.stRcAttr.stAttrH264Cbr.u32BitRate = value; + } + else + { + stVencChnAttr.stRcAttr.stAttrH265Cbr.u32BitRate = value; + } + } + else if ( 0 == strcmp(para, "framerate")) + { + if (eMode == VENC_RC_MODE_H264CBR) + { + stVencChnAttr.stRcAttr.stAttrH264Cbr.fr32DstFrmRate = value; + } + else + { + stVencChnAttr.stRcAttr.stAttrH265Cbr.fr32DstFrmRate = value; + } + } + else if (0 == strcmp(para, "gop")) + { + if (eMode == VENC_RC_MODE_H264CBR) + { + stVencChnAttr.stRcAttr.stAttrH264Cbr.u32Gop = value; + } + else + { + + stVencChnAttr.stRcAttr.stAttrH265Cbr.u32Gop = value; + } + } + else if (0 == strcmp(para, "flut")) + { + if (eMode == VENC_RC_MODE_H264CBR) + { + stVencChnAttr.stRcAttr.stAttrH264Cbr.u32FluctuateLevel = value; + } + else + { + stVencChnAttr.stRcAttr.stAttrH265Cbr.u32FluctuateLevel = value; + } + } + else if (0 == strcmp(para, "qpdelta")) + { + if (eMode == VENC_RC_MODE_H264CBR) + { + stVencRcParam.stParamH264Cbr.s32IPQPDelta = value; + } + else + { + stVencRcParam.stParamH265Cbr.s32IPQPDelta = value; + } + } + else if (0 == strcmp(para, "maxqp")) + { + if (eMode == VENC_RC_MODE_H264CBR) + { + stVencRcParam.stParamH264Cbr.u32MaxQp = value; + + } + else + { + stVencRcParam.stParamH265Cbr.u32MaxQp = value; + } + } + else if (0 == strcmp(para, "level")) + { + if (eMode == VENC_RC_MODE_H264CBR) + { + stVencRcParam.stParamH264Cbr.s32QualityLevel = value; + } + else + { + stVencRcParam.stParamH265Cbr.s32QualityLevel = value; + } + } + else if (0 == strcmp(para, "mqpdelta")) + { + stVencRcParam.u32RowQpDelta = value; + } + else if ( 0 == strcmp(para, "deblock")) + { + VENC_PARAM_H264_DBLK_S stH264Dblk; + s32Ret = HI_MPI_VENC_GetH264Dblk(0, &stH264Dblk); + CHECK_RET(s32Ret, "get deblock"); + stH264Dblk.disable_deblocking_filter_idc = 2; + stH264Dblk.slice_alpha_c0_offset_div2 = value; + stH264Dblk.slice_beta_offset_div2 = value; + s32Ret = HI_MPI_VENC_SetH264Dblk(0, &stH264Dblk); + CHECK_RET(s32Ret, "get deblock"); + } + + s32Ret = HI_MPI_VENC_SetChnAttr(s32EncChn, &stVencChnAttr); + CHECK_RET(s32Ret, "set Chn Attr"); + + s32Ret = HI_MPI_VENC_SetRcParam(s32EncChn, &stVencRcParam); + CHECK_RET(s32Ret, "set Rc param"); + + return 0; +} + diff --git a/device/mpp/tools/readme.txt b/device/mpp/tools/readme.txt new file mode 100644 index 0000000..0d24249 --- /dev/null +++ b/device/mpp/tools/readme.txt @@ -0,0 +1,5 @@ +iq_debug ޸ļ¼ + +һѡο֡ԴIJ REF +1REF = 0ʱο֡ع֡д +2REF = 1ʱο֡ڴͨд \ No newline at end of file diff --git a/device/mpp/tools/vi_bayerdump b/device/mpp/tools/vi_bayerdump new file mode 100644 index 0000000..3fedf27 Binary files /dev/null and b/device/mpp/tools/vi_bayerdump differ diff --git a/device/mpp/tools/vi_bayerdump.c b/device/mpp/tools/vi_bayerdump.c new file mode 100644 index 0000000..d2cb7c8 --- /dev/null +++ b/device/mpp/tools/vi_bayerdump.c @@ -0,0 +1,414 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_vi.h" +#include "hi_comm_vo.h" +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_vi.h" +#include "mpi_vo.h" + +#include "hi_comm_isp.h" +#include "mpi_isp.h" +#include "hi_sns_ctrl.h" + +#include "mpi_af.h" +#include "mpi_awb.h" +#include "mpi_ae.h" + + +#define MAX_FRM_CNT 256 +#define MAX_FRM_WIDTH 4096 //ֵ̫СͼܴĻ治 + + +#define ALIGN_BACK(x, a) ((a) * (((x) / (a)))) + + +#if 1 +static HI_S32 s_s32MemDev = -1; + +#define MEM_DEV_OPEN() \ + do {\ + if (s_s32MemDev <= 0)\ + {\ + s_s32MemDev = open("/dev/mem", O_CREAT|O_RDWR|O_SYNC);\ + if (s_s32MemDev < 0)\ + {\ + perror("Open dev/mem error");\ + return -1;\ + }\ + }\ + }while(0) + +#define MEM_DEV_CLOSE() \ + do {\ + HI_S32 s32Ret;\ + if (s_s32MemDev > 0)\ + {\ + s32Ret = close(s_s32MemDev);\ + if(HI_SUCCESS != s32Ret)\ + {\ + perror("Close mem/dev Fail");\ + return s32Ret;\ + }\ + s_s32MemDev = -1;\ + }\ + }while(0) + +void usage(void) +{ + printf( + "\n" + "*************************************************\n" + "Usage: ./vi_bayerdump [DataType] [nbit] [FrmCnt]\n" + "DataType: \n" + " -r(R) dump raw data\n" + " -i(I) dump ir data\n" + "nbit: \n" + " The bit num to be dump\n" + "FrmCnt: \n" + " the count of frame to be dump\n" + "e.g : ./vi_bayerdump -r 16 1 (dump one raw)\n" + "e.g : ./vi_bayerdump -i 16 1 (dump one ir)\n" + "*************************************************\n" + "\n"); + exit(1); +} + +HI_VOID* COMM_SYS_Mmap(HI_U32 u32PhyAddr, HI_U32 u32Size) +{ + HI_U32 u32Diff; + HI_U32 u32PagePhy; + HI_U32 u32PageSize; + HI_U8* pPageAddr; + + /* The mmap address should align with page */ + u32PagePhy = u32PhyAddr & 0xfffff000; + u32Diff = u32PhyAddr - u32PagePhy; + + /* The mmap size shuld be mutliples of 1024 */ + u32PageSize = ((u32Size + u32Diff - 1) & 0xfffff000) + 0x1000; + pPageAddr = mmap ((void*)0, u32PageSize, PROT_READ | PROT_WRITE, + MAP_SHARED, s_s32MemDev, u32PagePhy); + if (MAP_FAILED == pPageAddr ) + { + perror("mmap error"); + return NULL; + } + return (HI_VOID*) (pPageAddr + u32Diff); +} + +HI_S32 COMM_SYS_Munmap(HI_VOID* pVirAddr, HI_U32 u32Size) +{ + HI_U32 u32PageAddr; + HI_U32 u32PageSize; + HI_U32 u32Diff; + + u32PageAddr = (((HI_U32)pVirAddr) & 0xfffff000); + u32Diff = (HI_U32)pVirAddr - u32PageAddr; + u32PageSize = ((u32Size + u32Diff - 1) & 0xfffff000) + 0x1000; + + return munmap((HI_VOID*)u32PageAddr, u32PageSize); +} +#endif + + + +int sample_bayer_dump(VIDEO_FRAME_S* pVBuf, HI_U32 u32Nbit, FILE* pfd) +{ + unsigned int w, h; + HI_U16* pVBufVirt_Y; + HI_U8 au8Data[MAX_FRM_WIDTH]; + HI_U16 au16Data[MAX_FRM_WIDTH]; + HI_U32 phy_addr, size; + HI_U8* pUserPageAddr[2]; + + size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 2; + + phy_addr = pVBuf->u32PhyAddr[0]; + + MEM_DEV_OPEN(); + + pUserPageAddr[0] = (HI_U8*) COMM_SYS_Mmap(phy_addr, size); + if (NULL == pUserPageAddr[0]) + { + return -1; + } + + pVBufVirt_Y = (HI_U16*)pUserPageAddr[0]; + + /* save Y ----------------------------------------------------------------*/ + fprintf(stderr, "saving......dump data......u32Stride[0]: %d, width: %d\n", pVBuf->u32Stride[0], pVBuf->u32Width); + fflush(stderr); + for (h = 0; h < pVBuf->u32Height; h++) + { + HI_U16 u16Data; + for (w = 0; w < pVBuf->u32Width; w++) + { + if (8 == u32Nbit) + { + au8Data[w] = (pVBufVirt_Y[h * pVBuf->u32Width + w] >> 8); + } + else if (10 == u32Nbit) + { + u16Data = (pVBufVirt_Y[h * pVBuf->u32Width + w] >> 6); + au16Data[w] = u16Data; + } + else if (12 == u32Nbit) //12bit ڸλ + { + u16Data = (pVBufVirt_Y[h * pVBuf->u32Width + w] >> 4); + au16Data[w] = u16Data; + } + else if (14 == u32Nbit) //14bit ڸλ + { + u16Data = (pVBufVirt_Y[h * pVBuf->u32Width + w] >> 2); + au16Data[w] = u16Data; + } + else if (16 == u32Nbit) + { + u16Data = pVBufVirt_Y[h * pVBuf->u32Width + w]; + au16Data[w] = u16Data; + } + else + { + printf("Err! Bayer data can't support %d bits!eg: 8bits;10bits;12bits.\n", u32Nbit); + return -1; + } + } + + if (8 == u32Nbit) + { + fwrite(au8Data, pVBuf->u32Width, 1, pfd); + } + else + { + fwrite(au16Data, pVBuf->u32Width, 2, pfd); + } + + } + fflush(pfd); + + fprintf(stderr, "done u32TimeRef: %d!\n", pVBuf->u32TimeRef); + fflush(stderr); + + COMM_SYS_Munmap(pUserPageAddr[0], size); + + MEM_DEV_CLOSE(); + + return 0; +} + +HI_S32 VI_DumpBayer(VI_DEV ViDev, VI_DUMP_ATTR_S* pstViDumpAttr, HI_U32 u32Nbit, HI_U32 u32Cnt) +{ + int i, j; + VI_FRAME_INFO_S stFrame; + VI_FRAME_INFO_S astFrame[MAX_FRM_CNT]; + HI_CHAR szYuvName[128]; + FILE* pfd; + HI_S32 s32MilliSec = 2000; + VI_CHN ViChn; + HI_U32 u32CapCnt; + + VIU_GET_RAW_CHN(ViDev, ViChn); + + if (HI_MPI_VI_SetFrameDepth(ViChn, 1)) + { + printf("HI_MPI_VI_SetFrameDepth err, vi chn %d \n", ViChn); + return -1; + } + + usleep(5000); + + if (HI_MPI_VI_GetFrame(ViChn, &stFrame.stViFrmInfo, s32MilliSec)) + { + printf("HI_MPI_VI_GetFrame err, vi chn %d \n", ViChn); + return -1; + } + + /* get VI frame */ + for (i = 0; i < u32Cnt; i++) + { + if (HI_MPI_VI_GetFrame(ViChn, &astFrame[i].stViFrmInfo, s32MilliSec) < 0) + { + printf("get vi chn %d frame err\n", ViChn); + printf("only get %d frame\n", i); + break; + } + } + u32CapCnt = i; + + /* make file name */ + if (VI_DUMP_TYPE_RAW == pstViDumpAttr->enDumpType) + { + sprintf(szYuvName, "./vi_dev_%d_%d_%d_%d_%dbits.raw", ViDev, + stFrame.stViFrmInfo.stVFrame.u32Width, stFrame.stViFrmInfo.stVFrame.u32Height, + u32CapCnt, u32Nbit); + printf("Dump raw frame of vi chn %d to file: \"%s\"\n", ViChn, szYuvName); + } + else if (VI_DUMP_TYPE_IR == pstViDumpAttr->enDumpType) + { + u32Nbit = 16; + sprintf(szYuvName, "./vi_dev_%d_%d_%d_%d_%dbits.ir", ViDev, + stFrame.stViFrmInfo.stVFrame.u32Width, stFrame.stViFrmInfo.stVFrame.u32Height, + u32CapCnt, u32Nbit); + printf("Dump ir frame of vi chn %d to file: \"%s\"\n", ViChn, szYuvName); + } + else + { + printf("Invalid dump type %d\n", pstViDumpAttr->enDumpType); + } + HI_MPI_VI_ReleaseFrame(ViChn, &stFrame.stViFrmInfo); + + /* open file */ + pfd = fopen(szYuvName, "wb"); + if (NULL == pfd) + { + printf("open file failed:%s!\n", strerror(errno)); + return -1; + } + + for (j = 0; j < i; j++) + { + /* save VI frame to file */ + sample_bayer_dump(&astFrame[j].stViFrmInfo.stVFrame, u32Nbit, pfd); + + /* release frame after using */ + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j].stViFrmInfo); + } + + fclose(pfd); + + return 0; +} + +HI_S32 main(int argc, char* argv[]) +{ + VI_DEV ViDev = 0; + ISP_DEV IspDev = 0; + HI_S32 s32Ret = 0; + HI_U32 u32Nbit = 8; + HI_U32 u32FrmCnt = 1; + HI_CHAR au8Type[20] = "-r"; + VI_DUMP_ATTR_S stViDumpAttr = {0}; + ISP_RGBIR_ATTR_S stRgbirAttr = + { + 1, + ISP_IRPOS_TYPE_GR, + 4028, + }; + ISP_RGBIR_CTRL_S stRgbirCtrl = + { + 1, + 1, + 1, + OP_TYPE_AUTO, + 0x100, + {264, -1, 21, 8, 258, 9, -20, 26, 238, -261, -255, -229, 19, 12, 15} + }; + ISP_RGBIR_ATTR_S stRgbirBkAttr; + ISP_RGBIR_CTRL_S stRgbirBkCtrl; + + printf("\nNOTICE: This tool only can be used for TESTING !!!\n"); + if (argc < 2) + { + printf("usage: ./vi_bayerdump [Type] [nbit] [frmcnt]. sample: ./vi_bayerdump -r 12 1\n"); + printf("[nbit]----------Raw data:8bit;10bit;12bit;16bit\r\n"); + printf("[frmcnt]----------the frame number \r\n\n\n"); + + return s32Ret; + } + + if (argc > 1) + { + strcpy(au8Type, argv[1]); + } + if (argc > 2) + { + u32Nbit = atoi(argv[2]); /* nbit of Raw data:8bit;10bit;12bit;16bit */ + } + if (argc > 3) + { + u32FrmCnt = atoi(argv[3]);/* the frame number */ + } + + if (!strcmp("-r", au8Type) || !strcmp("-R", au8Type)) + { + stViDumpAttr.enDumpType = VI_DUMP_TYPE_RAW; + HI_MPI_VI_SetDevDumpAttr(ViDev, &stViDumpAttr); + } + else if (!strcmp("-i", au8Type) || !strcmp("-I", au8Type)) + { + s32Ret = HI_MPI_ISP_GetRgbirAttr(IspDev, &stRgbirBkAttr); + if (s32Ret != HI_SUCCESS) + { + printf("Get RGBIR Attr failed, errcode: %#x\n", s32Ret); + return s32Ret; + } + s32Ret = HI_MPI_ISP_GetRgbirCtrl(IspDev, &stRgbirBkCtrl); + if (s32Ret != HI_SUCCESS) + { + printf("Get RGBIR Ctrl failed, errcode: %#x\n", s32Ret); + return s32Ret; + } + + stViDumpAttr.enDumpType = VI_DUMP_TYPE_IR; + HI_MPI_ISP_SetRgbirAttr(IspDev, &stRgbirAttr); + HI_MPI_ISP_SetRgbirCtrl(IspDev, &stRgbirCtrl); + HI_MPI_VI_SetDevDumpAttr(ViDev, &stViDumpAttr); + } + else + { + usage(); + } + + s32Ret = HI_MPI_VI_EnableBayerDump(ViDev); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VI_EnableBayerDump failed(0x%x)!\n", s32Ret); + return s32Ret; + } + + printf("===press any key to continue.\n"); + getchar(); + + s32Ret = VI_DumpBayer(ViDev, &stViDumpAttr, u32Nbit, u32FrmCnt); + if (HI_SUCCESS != s32Ret) + { + printf("VI_StartBayerData failed!\n"); + goto EXIT; + } + +EXIT: + s32Ret = HI_MPI_VI_DisableBayerDump(0); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VI_DisableBayerDump failed!\n"); + } + + if (!strcmp("-i", au8Type) || !strcmp("-I", au8Type)) + { + HI_MPI_ISP_SetRgbirAttr(IspDev, &stRgbirBkAttr); + HI_MPI_ISP_SetRgbirCtrl(IspDev, &stRgbirBkCtrl); + } + + return HI_SUCCESS; +} + + + diff --git a/device/mpp/tools/vi_dump b/device/mpp/tools/vi_dump new file mode 100644 index 0000000..a4c87bc Binary files /dev/null and b/device/mpp/tools/vi_dump differ diff --git a/device/mpp/tools/vi_dump.c b/device/mpp/tools/vi_dump.c new file mode 100644 index 0000000..9a83c46 --- /dev/null +++ b/device/mpp/tools/vi_dump.c @@ -0,0 +1,879 @@ +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_vi.h" +#include "mpi_vi.h" +#include "hi_comm_vgs.h" +#include "mpi_vgs.h" + +////////////////////////////////////////////////////////////// +//#define DIS_DATA_DEBUG + +#define MAX_FRM_CNT 256 +#define MAX_FRM_WIDTH 4096 + +VI_CHN_ATTR_S stChnAttrBackup; + +#if 1 +static HI_S32 s_s32MemDev = -1; + +#define MEM_DEV_OPEN() \ + do {\ + if (s_s32MemDev <= 0)\ + {\ + s_s32MemDev = open("/dev/mem", O_CREAT|O_RDWR|O_SYNC);\ + if (s_s32MemDev < 0)\ + {\ + perror("Open dev/mem error");\ + return -1;\ + }\ + }\ + }while(0) + +#define MEM_DEV_CLOSE() \ + do {\ + HI_S32 s32Ret;\ + if (s_s32MemDev > 0)\ + {\ + s32Ret = close(s_s32MemDev);\ + if(HI_SUCCESS != s32Ret)\ + {\ + perror("Close mem/dev Fail");\ + return s32Ret;\ + }\ + s_s32MemDev = -1;\ + }\ + }while(0) + +void usage(void) +{ + printf( + "\n" + "*************************************************\n" + "Usage: ./vi_dump [DataType] [ViChn] [FrmCnt]\n" + "DataType: \n" + " -y(YUV) dump YUV\n" + " -r(RAW) dump RAW\n" + "ViChn: \n" + " which chn to be dump\n" + "FrmCnt: \n" + " the count of frame to be dump\n" + "e.g : ./vi_dump -y 0 1 (dump one YUV)\n" + "e.g : ./vi_dump -r 0 1 (dump one RAW)\n" + "*************************************************\n" + "\n"); + exit(1); +} + +HI_VOID* COMM_SYS_Mmap(HI_U32 u32PhyAddr, HI_U32 u32Size) +{ + HI_U32 u32Diff; + HI_U32 u32PagePhy; + HI_U32 u32PageSize; + HI_U8* pPageAddr; + + /* The mmap address should align with page */ + u32PagePhy = u32PhyAddr & 0xfffff000; + u32Diff = u32PhyAddr - u32PagePhy; + + /* The mmap size shuld be mutliples of 1024 */ + u32PageSize = ((u32Size + u32Diff - 1) & 0xfffff000) + 0x1000; + pPageAddr = mmap ((void*)0, u32PageSize, PROT_READ | PROT_WRITE, + MAP_SHARED, s_s32MemDev, u32PagePhy); + if (MAP_FAILED == pPageAddr ) + { + perror("mmap error"); + return NULL; + } + return (HI_VOID*) (pPageAddr + u32Diff); +} + +HI_S32 COMM_SYS_Munmap(HI_VOID* pVirAddr, HI_U32 u32Size) +{ + HI_U32 u32PageAddr; + HI_U32 u32PageSize; + HI_U32 u32Diff; + + u32PageAddr = (((HI_U32)pVirAddr) & 0xfffff000); + u32Diff = (HI_U32)pVirAddr - u32PageAddr; + u32PageSize = ((u32Size + u32Diff - 1) & 0xfffff000) + 0x1000; + + return munmap((HI_VOID*)u32PageAddr, u32PageSize); +} +#endif + + +#ifdef DIS_DATA_DEBUG +#define DIS_STATS_NUM 9 +typedef struct hiVI_DIS_STATS_S +{ + HI_S32 as32HDelta[DIS_STATS_NUM]; + HI_S32 as32HSad[DIS_STATS_NUM]; + HI_S32 as32HMv[DIS_STATS_NUM]; + HI_S32 as32VDelta[DIS_STATS_NUM]; + HI_S32 as32VSad[DIS_STATS_NUM]; + HI_S32 as32VMv[DIS_STATS_NUM]; + HI_U32 u32HMotion; + HI_U32 u32VMotion; + HI_U32 u32HOffset; + HI_U32 u32VOffset; +} VI_DIS_STATS_S; + +void vi_dump_save_one_dis(VI_CHN ViChn, VIDEO_FRAME_S* pVBuf) +{ + char g_strDisBuff[256] = {'\0'}; + char szDisFileName[128]; + static FILE* pstDisFd = NULL; + HI_U32 u32DisBufOffset; + VI_DIS_STATS_S* pstDisStats; + int j; + HI_U32 u32BufSize; + int iBufSize = 0; + int size = 256; + + if (pstDisFd == NULL) + { + sprintf(szDisFileName, "./vi_%dp_01_dis_result.txt", pVBuf->u32Width); + + pstDisFd = fopen(szDisFileName, "wb"); + if (NULL == pstDisFd) + { + printf("open file failed:%s!\n", strerror(errno)); + return -1; + } + } + + u32BufSize = pVBuf->u32Stride[0] * pVBuf->u32Height; + if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == pVBuf->enPixelFormat) + { + u32BufSize *= 2; + } + else + { + u32BufSize = u32BufSize * 3 >> 1; + } + + u32DisBufOffset = pVBuf->u32PhyAddr[0] + u32BufSize; + pstDisStats = (VI_DIS_STATS_S*) COMM_SYS_Mmap(u32DisBufOffset, size); + + sprintf(g_strDisBuff, "%s\n", \ + "v_delta[i], v_sad[i], v_mv[i], h_delta[i], h_sad[i], h_mv[i]"); + iBufSize = strlen(g_strDisBuff) + 1; + fwrite(g_strDisBuff, iBufSize, 1, pstDisFd); + + + for (j = 0; j < 9; j++) + { + sprintf(g_strDisBuff, "%8d, %8d, %8d, %8d, %8d, %8d\n", \ + pstDisStats->as32VDelta[j], pstDisStats->as32VSad[j], pstDisStats->as32VMv[j], \ + pstDisStats->as32HDelta[j], pstDisStats->as32HSad[j], pstDisStats->as32HMv[j]); + iBufSize = strlen(g_strDisBuff) + 1; + fwrite(g_strDisBuff, iBufSize, 1, pstDisFd); + } + + sprintf(g_strDisBuff, "%s\n", "H_Motion, V_Motion, *H_Offset, *V_Offset"); + iBufSize = strlen(g_strDisBuff) + 1; + fwrite(g_strDisBuff, iBufSize, 1, pstDisFd); + + sprintf(g_strDisBuff, "%8d %8d %8d %8d\n\n", \ + pstDisStats->u32HMotion, pstDisStats->u32VMotion, + pstDisStats->u32HOffset, pstDisStats->u32VOffset); + iBufSize = strlen(g_strDisBuff) + 1; + fwrite(g_strDisBuff, iBufSize, 1, pstDisFd); + fflush(pstDisFd); + + COMM_SYS_Munmap((HI_VOID*)pstDisStats, size); +} +#endif + + +/* sp420 תΪ p420 ; sp422 תΪ p422 */ +void vi_dump_save_one_frame(VIDEO_FRAME_S* pVBuf, FILE* pfd) +{ + unsigned int w, h; + char* pVBufVirt_Y; + char* pVBufVirt_C; + char* pMemContent; + unsigned char TmpBuff[MAX_FRM_WIDTH]; //ֵ̫СͼܴĻ治 + HI_U32 phy_addr, size; + HI_CHAR* pUserPageAddr[2]; + PIXEL_FORMAT_E enPixelFormat = pVBuf->enPixelFormat; + HI_U32 u32UvHeight;/* Ϊplanar ʽʱUVĸ߶ */ + + if (pVBuf->u32Width > MAX_FRM_WIDTH) + { + printf("Over max frame width: %d, can't support.\n", MAX_FRM_WIDTH); + return; + } + + if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat) + { + size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 3 / 2; + u32UvHeight = pVBuf->u32Height / 2; + } + else if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == enPixelFormat) + { + size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 2; + u32UvHeight = pVBuf->u32Height; + } + else if (PIXEL_FORMAT_SINGLE == enPixelFormat) + { + size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + u32UvHeight = 0; + } + + phy_addr = pVBuf->u32PhyAddr[0]; + + pUserPageAddr[0] = (HI_CHAR*) COMM_SYS_Mmap(phy_addr, size); + if (NULL == pUserPageAddr[0]) + { + return; + } + printf("stride: %d,%d\n", pVBuf->u32Stride[0], pVBuf->u32Stride[1] ); + + pVBufVirt_Y = pUserPageAddr[0]; + pVBufVirt_C = pVBufVirt_Y + (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + + /* save Y ----------------------------------------------------------------*/ + fprintf(stderr, "saving......Y......"); + fflush(stderr); + for (h = 0; h < pVBuf->u32Height; h++) + { + pMemContent = pVBufVirt_Y + h * pVBuf->u32Stride[0]; + fwrite(pMemContent, pVBuf->u32Width, 1, pfd); + } + fflush(pfd); + + /* save U ----------------------------------------------------------------*/ + fprintf(stderr, "U......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + pMemContent += 1; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + + /* save V ----------------------------------------------------------------*/ + fprintf(stderr, "V......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + + fprintf(stderr, "done %d!\n", pVBuf->u32TimeRef); + fflush(stderr); + + COMM_SYS_Munmap(pUserPageAddr[0], size); +} + +void vi_dump_save_one_raw(VIDEO_FRAME_S* pVBuf, FILE* pfd) +{ + unsigned int w, h; + HI_U16* pVBufVirt_Y; + HI_U16 au16Data[MAX_FRM_WIDTH]; + HI_U32 phy_addr, size; + HI_U8* pUserPageAddr[2]; + + size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + + phy_addr = pVBuf->u32PhyAddr[0]; + + pUserPageAddr[0] = (HI_U8*) COMM_SYS_Mmap(phy_addr, size); + if (NULL == pUserPageAddr[0]) + { + return; + } + + pVBufVirt_Y = (HI_U16*)pUserPageAddr[0]; + + /* save Y ----------------------------------------------------------------*/ + fprintf(stderr, "saving......Raw data......u32Stride[0]: %d, width: %d\n", pVBuf->u32Stride[0], pVBuf->u32Width); + fflush(stderr); + for (h = 0; h < pVBuf->u32Height; h++) + { + HI_U16 u16Data; + for (w = 0; w < pVBuf->u32Width; w++) + { + u16Data = pVBufVirt_Y[h * pVBuf->u32Width + w]; + au16Data[w] = u16Data; + } + + fwrite(au16Data, pVBuf->u32Width, 2, pfd); + } + fflush(pfd); + + fprintf(stderr, "done u32TimeRef: %d!\n", pVBuf->u32TimeRef); + fflush(stderr); + + COMM_SYS_Munmap(pUserPageAddr[0], size); + + return; + +} + + +HI_S32 SAMPLE_VI_BackupAttr(VI_CHN ViChn) +{ + VI_CHN_ATTR_S stChnAttr; + + MEM_DEV_OPEN(); + + if (ViChn != 0) + { + return 0; + } + + if (HI_MPI_VI_GetChnAttr(ViChn, &stChnAttrBackup)) + { + printf("HI_MPI_VI_GetChnAttr err, vi chn %d \n", ViChn); + return -1; + } + + /* */ + HI_MPI_VI_SetFrameDepth(ViChn, 0); + sleep(1); + + printf("compress mode: %d -> %d. \n", stChnAttrBackup.enCompressMode, COMPRESS_MODE_NONE); + /* óɷѹ */ + memcpy(&stChnAttr, &stChnAttrBackup, sizeof(VI_CHN_ATTR_S)); + + stChnAttr.enCompressMode = COMPRESS_MODE_NONE; + + + if (HI_MPI_VI_SetChnAttr(ViChn, &stChnAttr)) + { + printf("HI_MPI_VI_SetChnAttr err, vi chn %d \n", ViChn); + return -1; + } + + return 0; +} + +HI_S32 SAMPLE_VI_RestoreAttr(VI_CHN ViChn) +{ + MEM_DEV_CLOSE(); + + if (ViChn != 0) + { + return 0; + } + + printf("restore compress mode: %d\n", stChnAttrBackup.enCompressMode); + if (HI_MPI_VI_SetChnAttr(ViChn, &stChnAttrBackup)) + { + printf("HI_MPI_VI_SetChnAttr err, vi chn %d \n", ViChn); + return -1; + } + + return 0; +} + +HI_S32 SAMPLE_MISC_GETVB(VIDEO_FRAME_INFO_S* pstOutFrame, VIDEO_FRAME_INFO_S* pstInFrame, + VB_BLK* pstVbBlk, VB_POOL pool) +{ + HI_U32 u32Size; + VB_BLK VbBlk = VB_INVALID_HANDLE; + HI_U32 u32PhyAddr; + HI_VOID* pVirAddr; + HI_U32 u32LumaSize, u32ChrmSize; + HI_U32 u32LStride, u32CStride; + HI_U32 u32Width, u32Height; + + + u32Width = pstInFrame->stVFrame.u32Width; + u32Height = pstInFrame->stVFrame.u32Height; + u32LStride = pstInFrame->stVFrame.u32Stride[0]; + u32CStride = pstInFrame->stVFrame.u32Stride[1]; + if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == pstInFrame->stVFrame.enPixelFormat) + { + u32Size = u32LStride * u32Height << 1; + u32LumaSize = u32LStride * u32Height; + u32ChrmSize = u32LumaSize; + } + else if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == pstInFrame->stVFrame.enPixelFormat) + { + u32Size = (3 * u32LStride * u32Height) >> 1; + u32LumaSize = u32LStride * u32Height; + u32ChrmSize = u32LumaSize >> 1; + } + else if (PIXEL_FORMAT_RGB_BAYER == pstInFrame->stVFrame.enPixelFormat) + { + u32Size = u32LStride * u32Height; + u32LumaSize = u32LStride * u32Height; + u32ChrmSize = 0; + } + else if (PIXEL_FORMAT_SINGLE == pstInFrame->stVFrame.enPixelFormat) + { + u32Size = u32LStride * u32Height; + u32LumaSize = u32LStride * u32Height; + u32ChrmSize = 0; + } + else + { + printf("Error!!!, not support PixelFormat: %d\n", pstInFrame->stVFrame.enPixelFormat); + return HI_FAILURE; + } + + VbBlk = HI_MPI_VB_GetBlock(pool, u32Size, HI_NULL); + *pstVbBlk = VbBlk; + + if (VB_INVALID_HANDLE == VbBlk) + { + printf("HI_MPI_VB_GetBlock err! size:%d\n", u32Size); + return HI_FAILURE; + } + + u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk); + if (0 == u32PhyAddr) + { + printf("HI_MPI_VB_Handle2PhysAddr err!\n"); + return HI_FAILURE; + } + + pVirAddr = (HI_U8*) HI_MPI_SYS_Mmap(u32PhyAddr, u32Size); + if (NULL == pVirAddr) + { + printf("HI_MPI_SYS_Mmap err!\n"); + return HI_FAILURE; + } + + pstOutFrame->u32PoolId = HI_MPI_VB_Handle2PoolId(VbBlk); + if (VB_INVALID_POOLID == pstOutFrame->u32PoolId) + { + printf("u32PoolId err!\n"); + return HI_FAILURE; + } + + pstOutFrame->stVFrame.u32PhyAddr[0] = u32PhyAddr; + + //printf("\nuser u32phyaddr = 0x%x\n", pstOutFrame->stVFrame.u32PhyAddr[0]); + pstOutFrame->stVFrame.u32PhyAddr[1] = pstOutFrame->stVFrame.u32PhyAddr[0] + u32LumaSize; + pstOutFrame->stVFrame.u32PhyAddr[2] = pstOutFrame->stVFrame.u32PhyAddr[1] + u32ChrmSize; + + pstOutFrame->stVFrame.pVirAddr[0] = pVirAddr; + pstOutFrame->stVFrame.pVirAddr[1] = pstOutFrame->stVFrame.pVirAddr[0] + u32LumaSize; + pstOutFrame->stVFrame.pVirAddr[2] = pstOutFrame->stVFrame.pVirAddr[1] + u32ChrmSize; + + pstOutFrame->stVFrame.u32Width = u32Width; + pstOutFrame->stVFrame.u32Height = u32Height; + pstOutFrame->stVFrame.u32Stride[0] = u32LStride; + pstOutFrame->stVFrame.u32Stride[1] = u32CStride; + pstOutFrame->stVFrame.u32Stride[2] = u32CStride; + pstOutFrame->stVFrame.u32Field = VIDEO_FIELD_FRAME; + pstOutFrame->stVFrame.enCompressMode = COMPRESS_MODE_NONE; + pstOutFrame->stVFrame.enPixelFormat = pstInFrame->stVFrame.enPixelFormat; + + return HI_SUCCESS; +} + + +HI_S32 SAMPLE_MISC_ViDump(VI_CHN ViChn, HI_U32 u32Cnt) +{ + HI_S32 i, j, s32Ret; + VIDEO_FRAME_INFO_S stFrame; + VIDEO_FRAME_INFO_S* pstOutFrame; + VIDEO_FRAME_INFO_S astFrame[MAX_FRM_CNT]; + HI_CHAR szYuvName[128] = {0}; + HI_CHAR szPixFrm[10] = {0}; + FILE* pfd; + HI_S32 s32MilliSec = 2000; + VGS_TASK_ATTR_S stTask; + VGS_HANDLE hHandle; + VB_BLK VbBlk = VB_INVALID_HANDLE; + VB_POOL hPool = VB_INVALID_POOLID; + HI_U32 u32BlkSize = 0; + + if (HI_MPI_VI_SetFrameDepth(ViChn, 1)) + { + printf("HI_MPI_VI_SetFrameDepth err, vi chn %d \n", ViChn); + return -1; + } + + usleep(90000); + + if (HI_MPI_VI_GetFrame(ViChn, &stFrame, s32MilliSec)) + { + printf("HI_MPI_VI_GetFrame err, vi chn %d \n", ViChn); + return -1; + } + + /* make file name */ + strcpy(szPixFrm, + ( PIXEL_FORMAT_SINGLE == stFrame.stVFrame.enPixelFormat ) ? "single" : + ( (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat) ? "p420" : "p422" ) + ); + sprintf(szYuvName, "./vi_chn_%d_%d_%d_%s_%d.yuv", ViChn, + stFrame.stVFrame.u32Width, stFrame.stVFrame.u32Height, szPixFrm, u32Cnt); + printf("Dump YUV frame of vi chn %d to file: \"%s\"\n", ViChn, szYuvName); + + s32Ret = HI_MPI_VI_ReleaseFrame(ViChn, &stFrame); + if (s32Ret != HI_SUCCESS) + { + printf("release frame failed\n"); + goto END1; + } + + if (COMPRESS_MODE_NONE != stFrame.stVFrame.enCompressMode) + { + if (PIXEL_FORMAT_SINGLE == stFrame.stVFrame.enPixelFormat) + { + u32BlkSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height; + } + else if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat) + { + u32BlkSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height * 3 >> 1; + } + else if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == stFrame.stVFrame.enPixelFormat) + { + u32BlkSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height * 2; + } + else + { + printf("Not support this pix format!\n"); + } + + /*create comm vb pool*/ + hPool = HI_MPI_VB_CreatePool(u32BlkSize, 2 , NULL); + if (hPool == VB_INVALID_POOLID) + { + printf("HI_MPI_VB_CreatePool failed! \n"); + goto END1; + } + } + + /* open file */ + pfd = fopen(szYuvName, "wb"); + if (NULL == pfd) + { + printf("open file failed:%s!\n", strerror(errno)); + return -1; + } + + /* get VI frame */ + for (i = 0; i < u32Cnt; i++) + { + if (HI_MPI_VI_GetFrame(ViChn, &astFrame[i], s32MilliSec) < 0) + { + printf("get vi chn %d frame err\n", ViChn); + printf("only get %d frame\n", i); + break; + } + } + + for (j = 0; j < i; j++) + { + if (COMPRESS_MODE_NONE != astFrame[j].stVFrame.enCompressMode) + { + pstOutFrame = &stTask.stImgOut; + memcpy(&stTask.stImgIn.stVFrame, &astFrame[j].stVFrame, sizeof(VIDEO_FRAME_S)); + stTask.stImgIn.u32PoolId = astFrame[j].u32PoolId; + if (HI_SUCCESS != SAMPLE_MISC_GETVB(pstOutFrame, &astFrame[j], &VbBlk, hPool)) + { + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + + if (VB_INVALID_HANDLE != VbBlk) + { + HI_MPI_VB_ReleaseBlock(VbBlk); + } + continue; + } + + s32Ret = HI_MPI_VGS_BeginJob(&hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_BeginJob failed\n"); + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + HI_MPI_VB_ReleaseBlock(VbBlk); + goto END2; + } + + s32Ret = HI_MPI_VGS_AddScaleTask(hHandle, &stTask); + + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_AddScaleTask failed\n"); + HI_MPI_VGS_CancelJob(hHandle); + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + HI_MPI_VB_ReleaseBlock(VbBlk); + goto END2; + } + + + s32Ret = HI_MPI_VGS_EndJob(hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_EndJob failed\n"); + HI_MPI_VGS_CancelJob(hHandle); + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + HI_MPI_VB_ReleaseBlock(VbBlk); + goto END2; + } + /* save VI frame to file */ + vi_dump_save_one_frame(&pstOutFrame->stVFrame, pfd); + } + else + { + vi_dump_save_one_frame(&astFrame[j].stVFrame, pfd); + } + +#ifdef DIS_DATA_DEBUG + vi_dump_save_one_dis(ViChn, &astFrame[j].stVFrame); +#endif + + /* release frame after using */ + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + HI_MPI_VB_ReleaseBlock(VbBlk); + } + +END2: + if (hPool != VB_INVALID_POOLID) + { + HI_MPI_VB_DestroyPool(hPool); + } +END1: + fclose(pfd); + + return 0; +} + +HI_S32 SAMPLE_MISC_ViDumpRaw(VI_CHN ViChn, HI_U32 u32Cnt) +{ + HI_S32 i, j, s32Ret; + VIDEO_FRAME_INFO_S stFrame; + VIDEO_FRAME_INFO_S* pstOutFrame; + VIDEO_FRAME_INFO_S astFrame[MAX_FRM_CNT]; + HI_CHAR szYuvName[128]; + HI_CHAR szPixFrm[10]; + FILE* pfd; + HI_S32 s32MilliSec = 2000; + VGS_TASK_ATTR_S stTask; + VGS_HANDLE hHandle; + VB_BLK VbBlk = VB_INVALID_HANDLE; + VB_POOL hPool = VB_INVALID_POOLID; + HI_U32 u32BlkSize = 0; + + VI_CHN_ATTR_S stChnAttr = {{0}}; + VI_CHN_ATTR_S stChnAttrBackup = {{0}}; + HI_MPI_VI_GetChnAttr(ViChn, &stChnAttr); + memcpy(&stChnAttrBackup, &stChnAttr, sizeof(stChnAttrBackup)); + stChnAttr.enPixFormat = PIXEL_FORMAT_RGB_BAYER; + stChnAttr.enCompressMode = COMPRESS_MODE_NONE; + HI_MPI_VI_SetChnAttr(ViChn, &stChnAttr); + + if (HI_MPI_VI_SetFrameDepth(ViChn, 1)) + { + printf("HI_MPI_VI_SetFrameDepth err, vi chn %d \n", ViChn); + return -1; + } + + usleep(90000); + + if (HI_MPI_VI_GetFrame(ViChn, &stFrame, s32MilliSec)) + { + printf("HI_MPI_VI_GetFrame err, vi chn %d \n", ViChn); + return -1; + } + + /* make file name */ + strcpy(szPixFrm, + (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat) ? "p420" : "p422"); + sprintf(szYuvName, "./vi_chn_%d_%d_%d_%d_16bit.raw", ViChn, + stFrame.stVFrame.u32Width, stFrame.stVFrame.u32Height, u32Cnt); + printf("Dump raw frame of vi chn %d to file: \"%s\"\n", ViChn, szYuvName); + + s32Ret = HI_MPI_VI_ReleaseFrame(ViChn, &stFrame); + if (s32Ret != HI_SUCCESS) + { + printf("release frame failed\n"); + goto END1; + } + + if (COMPRESS_MODE_NONE != stFrame.stVFrame.enCompressMode) + { + u32BlkSize = (stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height * 2); + + /*create comm vb pool*/ + hPool = HI_MPI_VB_CreatePool(u32BlkSize, 2 , NULL); + if (hPool == VB_INVALID_POOLID) + { + printf("HI_MPI_VB_CreatePool failed! \n"); + goto END1; + } + } + + /* open file */ + pfd = fopen(szYuvName, "wb"); + if (NULL == pfd) + { + printf("open file failed:%s!\n", strerror(errno)); + return -1; + } + + /* get VI frame */ + for (i = 0; i < u32Cnt; i++) + { + if (HI_MPI_VI_GetFrame(ViChn, &astFrame[i], s32MilliSec) < 0) + { + printf("get vi chn %d frame err\n", ViChn); + printf("only get %d frame\n", i); + break; + } + } + + for (j = 0; j < i; j++) + { + if (COMPRESS_MODE_NONE != astFrame[j].stVFrame.enCompressMode) + { + pstOutFrame = &stTask.stImgOut; + memcpy(&stTask.stImgIn.stVFrame, &astFrame[j].stVFrame, sizeof(VIDEO_FRAME_S)); + stTask.stImgIn.u32PoolId = astFrame[j].u32PoolId; + if (HI_SUCCESS != SAMPLE_MISC_GETVB(pstOutFrame, &astFrame[j], &VbBlk, hPool)) + { + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + + if (VB_INVALID_HANDLE != VbBlk) + { + HI_MPI_VB_ReleaseBlock(VbBlk); + } + continue; + } + + s32Ret = HI_MPI_VGS_BeginJob(&hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_BeginJob failed\n"); + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + HI_MPI_VB_ReleaseBlock(VbBlk); + goto END2; + } + + s32Ret = HI_MPI_VGS_AddScaleTask(hHandle, &stTask); + + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_AddScaleTask failed\n"); + HI_MPI_VGS_CancelJob(hHandle); + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + HI_MPI_VB_ReleaseBlock(VbBlk); + goto END2; + } + + + s32Ret = HI_MPI_VGS_EndJob(hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_EndJob failed\n"); + HI_MPI_VGS_CancelJob(hHandle); + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + HI_MPI_VB_ReleaseBlock(VbBlk); + goto END2; + } + /* save VI frame to file */ + vi_dump_save_one_raw(&pstOutFrame->stVFrame, pfd); + } + else + { + vi_dump_save_one_raw(&astFrame[j].stVFrame, pfd); + } + +#ifdef DIS_DATA_DEBUG + vi_dump_save_one_dis(ViChn, &astFrame[j].stVFrame); +#endif + + /* release frame after using */ + HI_MPI_VI_ReleaseFrame(ViChn, &astFrame[j]); + HI_MPI_VB_ReleaseBlock(VbBlk); + } + +END2: + if (hPool != VB_INVALID_POOLID) + { + HI_MPI_VB_DestroyPool(hPool); + } +END1: + fclose(pfd); + + HI_MPI_VI_SetChnAttr(ViChn, &stChnAttrBackup); + + return 0; +} + + +HI_S32 main(int argc, char* argv[]) +{ + VI_CHN ViChn = 0; + HI_U32 u32FrmCnt = 1; + HI_CHAR au8Type[20] = "-y"; + + printf("\nNOTICE: This tool only can be used for TESTING !!!\n"); + printf("usage: ./vi_dump [DataType] [ViChn] [FrmCnt]. sample: ./vi_dump -y 0 5\n\t To see more usage, please enter: ./vi_dump -h\n\n"); + + if (argc > 1) + { + strcpy(au8Type, argv[1]);/* Ҫɼ֡*/ + } + + if (argc > 2)/* VIͨ*/ + { + ViChn = atoi(argv[2]); + } + + if (argc > 3) + { + u32FrmCnt = atoi(argv[3]);/* Ҫɼ֡Ŀ*/ + } + + MEM_DEV_OPEN(); + + if (!strcmp("-y", au8Type) || !strcmp("-Y", au8Type)) + { + SAMPLE_MISC_ViDump(ViChn, u32FrmCnt); + } + else if (!strcmp("-r", au8Type) || !strcmp("-R", au8Type)) + { + SAMPLE_MISC_ViDumpRaw(ViChn, u32FrmCnt); + } + else + { + usage(); + } + + MEM_DEV_CLOSE(); + + + return HI_SUCCESS; +} + + + diff --git a/device/mpp/tools/vo_video_csc_config b/device/mpp/tools/vo_video_csc_config new file mode 100644 index 0000000..0171862 Binary files /dev/null and b/device/mpp/tools/vo_video_csc_config differ diff --git a/device/mpp/tools/vo_video_csc_config.c b/device/mpp/tools/vo_video_csc_config.c new file mode 100644 index 0000000..8c90537 --- /dev/null +++ b/device/mpp/tools/vo_video_csc_config.c @@ -0,0 +1,145 @@ +/****************************************************************************** + + Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd. + + ****************************************************************************** + File Name : vga_csc.c + Version : Initial Draft + Author : Hisilicon multimedia software group + Created : 2012/03/15 + Description : + History : + 1.Date : 2012/03/15 + Author : n00168968 + Modification: Created file + +******************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_vo.h" +#include "mpi_vo.h" +#include "hi_defines.h" + +#define VO_CHECK_RET(express,name)\ + do{\ + HI_S32 Ret;\ + Ret = express;\ + if (HI_SUCCESS != Ret)\ + {\ + printf("%s failed at %s: LINE: %d with %#x!\n", name, __FUNCTION__, __LINE__, Ret);\ + }\ + }while(0) + +HI_VOID usage(HI_VOID) +{ + printf("\nNOTICE: This tool only can be used for TESTING !!!\n"); + printf("NOTICE: Luma/Contrast/Hue/Satuature [0,100], enCscMatrix[0,4]\n"); + printf("enCscMatrix : 0-(identity); 1-(601-709); 2-(709-601); 3-(601-RGB); 4-(709-RGB).\n"); + printf("usage: ./vo_video_csc_config [LayerId][enCscMatrix] [Luma] [Contrast] [Hue] [Satuature]. sample: ./vo_video_csc_config 0 1 50 50 50 50\n\n"); +} + +HI_S32 vo_video_csc_config(HI_U32 u32LayerId, HI_U32 enCscMatrix, HI_U32 u32Luma, HI_U32 u32Contrast, HI_U32 u32Hue, HI_U32 u32Satuature) +{ + VO_CSC_S stVideoCSC; + usage(); + + if (u32LayerId < 0 || u32LayerId > 4) + { + printf ("layer err \n"); + return -1; + } + + if (u32Contrast < 0 || u32Contrast > 100) + { + printf ("u32Contrast err \n"); + return -1; + } + if (u32Hue < 0 || u32Hue > 100) + { + printf ("u32Hue err \n"); + return -1; + } + if (u32Luma < 0 || u32Luma > 100) + { + printf ("u32Luma err \n"); + return -1; + } + if (u32Satuature < 0 || u32Satuature > 100) + { + printf ("u32Satuature err \n"); + return -1; + } + if (enCscMatrix < 0 || enCscMatrix > 4) + { + printf ("enCscMatrix err \n"); + return -1; + } + stVideoCSC.enCscMatrix = enCscMatrix; + stVideoCSC.u32Contrast = u32Contrast; + stVideoCSC.u32Hue = u32Hue; + stVideoCSC.u32Luma = u32Luma; + stVideoCSC.u32Satuature = u32Satuature; + VO_CHECK_RET(HI_MPI_VO_SetVideoLayerCSC(u32LayerId, &stVideoCSC), "HI_MPI_VO_SetVideoLayerCSC"); + VO_CHECK_RET(HI_MPI_VO_GetVideoLayerCSC(u32LayerId, &stVideoCSC), "HI_MPI_VO_GetVideoLayerCSC"); + printf("matrix %d, con %d, hue %d, luma %d, stu %d\n", stVideoCSC.enCscMatrix, + stVideoCSC.u32Contrast, stVideoCSC.u32Hue, stVideoCSC.u32Luma, stVideoCSC.u32Satuature); + return HI_SUCCESS; +} + +HI_S32 main(int argc, char* argv[]) +{ + HI_U32 u32LayerId; + HI_U32 u32Luma; + HI_U32 u32Contrast; + HI_U32 u32Hue; + HI_U32 u32Satuature; + HI_U32 enCscMatrix; + + if (argc > 1) + { + u32LayerId = atoi(argv[1]); + } + + if (argc > 2) + { + enCscMatrix = atoi(argv[2]); + } + + if (argc > 3) + { + u32Luma = atoi(argv[3]); + } + + if (argc > 4) + { + u32Contrast = atoi(argv[4]); + } + + if (argc > 5) + { + u32Hue = atoi(argv[5]); + } + + if (argc > 6) + { + u32Satuature = atoi(argv[6]); + } + + vo_video_csc_config(u32LayerId, enCscMatrix, u32Luma, u32Contrast, u32Hue, u32Satuature); + + return HI_SUCCESS; +} + + diff --git a/device/mpp/tools/vou_chn_dump b/device/mpp/tools/vou_chn_dump new file mode 100644 index 0000000..5263965 Binary files /dev/null and b/device/mpp/tools/vou_chn_dump differ diff --git a/device/mpp/tools/vou_chn_dump.c b/device/mpp/tools/vou_chn_dump.c new file mode 100644 index 0000000..2169670 --- /dev/null +++ b/device/mpp/tools/vou_chn_dump.c @@ -0,0 +1,386 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_vo.h" +#include "mpi_vo.h" +#include "mpi_vgs.h" + +#define MAX_FRM_CNT 256 + +typedef struct hiDUMP_MEMBUF_S +{ + VB_BLK hBlock; + VB_POOL hPool; + HI_U32 u32PoolId; + + HI_U32 u32PhyAddr; + HI_U8* pVirAddr; + HI_S32 s32Mdev; +} DUMP_MEMBUF_S; + + +/* sp420 תΪ p420 ; sp422 תΪ p422 */ +void sample_yuv_dump(VIDEO_FRAME_S* pVBuf, FILE* pfd) +{ + unsigned int w, h; + char* pVBufVirt_Y; + char* pVBufVirt_C; + char* pMemContent; + unsigned char TmpBuff[4096]; //ֵ̫СͼܴĻ治 + HI_U32 phy_addr, Ysize, Csize; + PIXEL_FORMAT_E enPixelFormat = pVBuf->enPixelFormat; + HI_U32 u32UvHeight;/* Ϊplanar ʽʱUVĸ߶ */ + + Ysize = (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat) + { + Csize = (pVBuf->u32Stride[1]) * (pVBuf->u32Height) / 2; + u32UvHeight = pVBuf->u32Height / 2; + } + else if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == enPixelFormat) + { + Csize = (pVBuf->u32Stride[1]) * (pVBuf->u32Height); + u32UvHeight = pVBuf->u32Height; + } + else + { + Csize = 0; + u32UvHeight = 0; + } + + phy_addr = pVBuf->u32PhyAddr[0]; + + //printf("phy_addr:%x, size:%d\n", phy_addr, size); + pVBufVirt_Y = (HI_CHAR*) HI_MPI_SYS_Mmap(phy_addr, Ysize); + if (NULL == pVBufVirt_Y) + { + return; + } + + /* save Y ----------------------------------------------------------------*/ + fprintf(stderr, "saving......Y......"); + fflush(stderr); + for (h = 0; h < pVBuf->u32Height; h++) + { + pMemContent = pVBufVirt_Y + h * pVBuf->u32Stride[0]; + fwrite(pMemContent, pVBuf->u32Width, 1, pfd); + } + fflush(pfd); + + + if (PIXEL_FORMAT_SINGLE != enPixelFormat) + { + pVBufVirt_C = (HI_CHAR*) HI_MPI_SYS_Mmap(pVBuf->u32PhyAddr[1], Csize); + if (NULL == pVBufVirt_C) + { + HI_MPI_SYS_Munmap(pVBufVirt_Y, Ysize); + return; + } + /* save U ----------------------------------------------------------------*/ + fprintf(stderr, "U......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + pMemContent += 1; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + + /* save V ----------------------------------------------------------------*/ + fprintf(stderr, "V......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + HI_MPI_SYS_Munmap(pVBufVirt_C, Csize); + } + + fprintf(stderr, "done %d!\n", pVBuf->u32TimeRef); + fflush(stderr); + + HI_MPI_SYS_Munmap(pVBufVirt_Y, Ysize); + +} + +HI_S32 SAMPLE_MISC_VoDump(VO_DEV VoDev, VO_CHN VoChn, HI_U32 u32Cnt) +{ + HI_S32 i, s32Ret; + VIDEO_FRAME_INFO_S stFrame; + //VIDEO_FRAME_INFO_S astFrame[256]; + HI_CHAR szYuvName[128]; + HI_CHAR szPixFrm[10]; + FILE* pfd; + VB_POOL hPool = VB_INVALID_POOLID; + HI_U32 u32BlkSize = 0; + + DUMP_MEMBUF_S stMem = {0}; + VIDEO_FRAME_INFO_S stFrmInfo; + VGS_HANDLE hHandle; + VGS_TASK_ATTR_S stTask; + HI_U32 u32LumaSize = 0; + HI_U32 u32ChrmSize = 0; + HI_U32 u32PicLStride = 0; + HI_U32 u32PicCStride = 0; + HI_U32 u32Width = 0; + HI_U32 u32Height = 0; + HI_BOOL bSendToVgs = HI_FALSE; + + printf("\nNOTICE: This tool only can be used for TESTING !!!\n"); + printf("usage: ./vou_chn_dump [vodev] [vochn] [frmcnt]. sample: ./vou_chn_dump 0 0 5\n\n"); + + /* Get Frame to make file name*/ + s32Ret = HI_MPI_VO_GetChnFrame(VoDev, VoChn, &stFrame, 0); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO(%d)_GetChnFrame errno %#x\n", VoDev, s32Ret); + return -1; + } + + /* make file name */ + if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat) + { + strcpy(szPixFrm, "p420"); + } + else if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == stFrame.stVFrame.enPixelFormat) + { + strcpy(szPixFrm, "p422"); + } + else if (PIXEL_FORMAT_SINGLE == stFrame.stVFrame.enPixelFormat) + { + strcpy(szPixFrm, "single"); + } + else + { + return -1; + } + + sprintf(szYuvName, "./vo(%d,%d)_%d_%d_%s_%d.yuv", VoDev, VoChn, + stFrame.stVFrame.u32Width, stFrame.stVFrame.u32Height, szPixFrm, u32Cnt); + printf("Dump YUV frame of vo(%d,%d) to file: \"%s\"\n", VoDev, VoChn, szYuvName); + + bSendToVgs = (stFrame.stVFrame.enCompressMode > 0) || (stFrame.stVFrame.enVideoFormat > 0); + + HI_MPI_VO_ReleaseChnFrame(VoDev, VoChn, &stFrame); + + /* open file */ + pfd = fopen(szYuvName, "wb"); + + if (NULL == pfd) + { + return -1; + } + + u32PicLStride = stFrame.stVFrame.u32Stride[0]; + u32PicCStride = stFrame.stVFrame.u32Stride[0]; + u32LumaSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height; + u32Width = stFrame.stVFrame.u32Width; + u32Height = stFrame.stVFrame.u32Height; + if (PIXEL_FORMAT_SINGLE == stFrame.stVFrame.enPixelFormat) + { + u32ChrmSize = 0; + } + else + { + u32ChrmSize = (stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height) >> (1 + (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat)); + } + + if (bSendToVgs) + { + if (PIXEL_FORMAT_SINGLE == stFrame.stVFrame.enPixelFormat) + { + u32BlkSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height; + } + else + { + u32BlkSize = (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat) + ? (stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height * 3 >> 1) : (stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height * 2); + } + + /*create comm vb pool*/ + hPool = HI_MPI_VB_CreatePool( u32BlkSize, 2, NULL); + if (hPool == VB_INVALID_POOLID) + { + printf("HI_MPI_VB_CreatePool failed! \n"); + goto END1; + } + + stMem.hPool = hPool; + } + + /* get VO frame */ + for (i = 0; i < u32Cnt; i++) + { + s32Ret = HI_MPI_VO_GetChnFrame(VoDev, VoChn, &stFrame, 20); + if (HI_SUCCESS != s32Ret) + { + printf("get vo(%d,%d) frame err\n", VoDev, VoChn); + printf("only get %d frame\n", i); + break; + } + + if (bSendToVgs) + { + while ((stMem.hBlock = HI_MPI_VB_GetBlock(stMem.hPool, u32BlkSize, NULL)) == VB_INVALID_HANDLE) + { + ; + } + + stMem.u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(stMem.hBlock); + + + stMem.pVirAddr = (HI_U8*) HI_MPI_SYS_Mmap( stMem.u32PhyAddr, u32BlkSize ); + if (stMem.pVirAddr == NULL) + { + printf("Mem dev may not open\n"); + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + goto END2; + } + + memset(&stFrmInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S)); + stFrmInfo.stVFrame.u32PhyAddr[0] = stMem.u32PhyAddr; + stFrmInfo.stVFrame.u32PhyAddr[1] = stFrmInfo.stVFrame.u32PhyAddr[0] + u32LumaSize; + stFrmInfo.stVFrame.u32PhyAddr[2] = stFrmInfo.stVFrame.u32PhyAddr[1] + u32ChrmSize; + + stFrmInfo.stVFrame.pVirAddr[0] = stMem.pVirAddr; + stFrmInfo.stVFrame.pVirAddr[1] = (HI_U8*) stFrmInfo.stVFrame.pVirAddr[0] + u32LumaSize; + stFrmInfo.stVFrame.pVirAddr[2] = (HI_U8*) stFrmInfo.stVFrame.pVirAddr[1] + u32ChrmSize; + + stFrmInfo.stVFrame.u32Width = u32Width; + stFrmInfo.stVFrame.u32Height = u32Height; + stFrmInfo.stVFrame.u32Stride[0] = u32PicLStride; + stFrmInfo.stVFrame.u32Stride[1] = u32PicCStride; + stFrmInfo.stVFrame.u32Stride[2] = u32PicCStride; + + stFrmInfo.stVFrame.enCompressMode = COMPRESS_MODE_NONE; + stFrmInfo.stVFrame.enPixelFormat = stFrame.stVFrame.enPixelFormat; + stFrmInfo.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR; + + stFrmInfo.stVFrame.u64pts = (i * 40); + stFrmInfo.stVFrame.u32TimeRef = (i * 2); + + stFrmInfo.u32PoolId = hPool; + + s32Ret = HI_MPI_VGS_BeginJob(&hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_BeginJob failed\n"); + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + HI_MPI_VO_ReleaseChnFrame(VoDev, VoChn, &stFrame); + goto END2; + } + + memcpy(&stTask.stImgIn, &stFrame.stVFrame, sizeof(VIDEO_FRAME_INFO_S)); + memcpy(&stTask.stImgOut , &stFrmInfo, sizeof(VIDEO_FRAME_INFO_S)); + s32Ret = HI_MPI_VGS_AddScaleTask(hHandle, &stTask); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_AddScaleTask failed\n"); + HI_MPI_VGS_CancelJob(hHandle); + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + HI_MPI_VO_ReleaseChnFrame(VoDev, VoChn, &stFrame); + goto END2; + } + + s32Ret = HI_MPI_VGS_EndJob(hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_EndJob failed\n"); + HI_MPI_VGS_CancelJob(hHandle); + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + HI_MPI_VO_ReleaseChnFrame(VoDev, VoChn, &stFrame); + goto END2; + } + + /* save VO frame to file */ + sample_yuv_dump(&stFrmInfo.stVFrame, pfd); + + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + } + else + { + /* save VO frame to file */ + sample_yuv_dump(&stFrame.stVFrame, pfd); + } + + /* release frame after using */ + s32Ret = HI_MPI_VO_ReleaseChnFrame(VoDev, VoChn, &stFrame); + if (HI_SUCCESS != s32Ret) + { + printf("Release vo(%d,%d) frame err\n", VoDev, VoChn); + printf("only get %d frame\n", i); + break; + } + } + + +END2: + if (hPool != VB_INVALID_POOLID) + { + HI_MPI_VB_DestroyPool( hPool ); + } + +END1: + + fclose(pfd); + + return 0; +} + +HI_S32 main(int argc, char* argv[]) +{ + VO_DEV VoDev = 0; + VO_CHN VoChn = 0; + HI_U32 u32FrmCnt = 1; + + /* VO豸*/ + if (argc > 1) + { + VoDev = atoi(argv[1]); + } + + /* VOͨ */ + if (argc > 2) + { + VoChn = atoi(argv[2]); + } + + /* Ҫɼ֡Ŀ*/ + if (argc > 3) + { + u32FrmCnt = atoi(argv[3]); + } + + SAMPLE_MISC_VoDump(VoDev, VoChn, u32FrmCnt); + + return HI_SUCCESS; +} + + diff --git a/device/mpp/tools/vou_screen_dump b/device/mpp/tools/vou_screen_dump new file mode 100644 index 0000000..e0a7efb Binary files /dev/null and b/device/mpp/tools/vou_screen_dump differ diff --git a/device/mpp/tools/vou_screen_dump.c b/device/mpp/tools/vou_screen_dump.c new file mode 100644 index 0000000..14e3f35 --- /dev/null +++ b/device/mpp/tools/vou_screen_dump.c @@ -0,0 +1,218 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_vo.h" +#include "mpi_vo.h" + +#define MAX_FRM_CNT 256 + +/* sp420 תΪ p420 ; sp422 תΪ p422 */ +void sample_yuv_dump(VIDEO_FRAME_S* pVBuf, FILE* pfd) +{ + unsigned int w, h; + char* pVBufVirt_Y; + char* pVBufVirt_C; + char* pMemContent; + unsigned char TmpBuff[4096]; //ֵ̫СͼܴĻ治 + HI_U32 phy_addr, Ysize, Csize; + PIXEL_FORMAT_E enPixelFormat = pVBuf->enPixelFormat; + HI_U32 u32UvHeight;/* Ϊplanar ʽʱUVĸ߶ */ + + Ysize = (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat) + { + Csize = (pVBuf->u32Stride[1]) * (pVBuf->u32Height) / 2; + u32UvHeight = pVBuf->u32Height / 2; + } + else if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == enPixelFormat) + { + Csize = (pVBuf->u32Stride[1]) * (pVBuf->u32Height); + u32UvHeight = pVBuf->u32Height; + } + else + { + Csize = 0; + u32UvHeight = 0; + } + + phy_addr = pVBuf->u32PhyAddr[0]; + + pVBufVirt_Y = (HI_CHAR*) HI_MPI_SYS_Mmap(phy_addr, Ysize); + if (NULL == pVBufVirt_Y) + { + return; + } + + /* save Y ----------------------------------------------------------------*/ + fprintf(stderr, "saving......Y......"); + fflush(stderr); + for (h = 0; h < pVBuf->u32Height; h++) + { + pMemContent = pVBufVirt_Y + h * pVBuf->u32Stride[0]; + fwrite(pMemContent, pVBuf->u32Width, 1, pfd); + } + fflush(pfd); + + if (PIXEL_FORMAT_SINGLE != enPixelFormat) + { + pVBufVirt_C = (HI_CHAR*) HI_MPI_SYS_Mmap(pVBuf->u32PhyAddr[1], Csize); + if (NULL == pVBufVirt_C) + { + HI_MPI_SYS_Munmap(pVBufVirt_Y, Ysize); + return; + } + + /* save U ----------------------------------------------------------------*/ + fprintf(stderr, "U......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + pMemContent += 1; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + + /* save V ----------------------------------------------------------------*/ + fprintf(stderr, "V......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + HI_MPI_SYS_Munmap(pVBufVirt_C, Csize); + } + fprintf(stderr, "done %d!\n", pVBuf->u32TimeRef); + fflush(stderr); + + HI_MPI_SYS_Munmap(pVBufVirt_Y, Ysize); + +} + +HI_S32 SAMPLE_MISC_VoDump(VO_LAYER VoLayer, HI_U32 u32Cnt) +{ + HI_S32 i, s32Ret; + VIDEO_FRAME_INFO_S stFrame; + //VIDEO_FRAME_INFO_S astFrame[256]; + HI_CHAR szYuvName[128]; + HI_CHAR szPixFrm[10]; + FILE* pfd; + + printf("\nNOTICE: This tool only can be used for TESTING !!!\n"); + printf("usage: ./vou_screen_dump [VoLayer] [frmcnt]. sample: ./vou_screen_dump 0 1\n\n"); + + /* Get Frame to make file name*/ + s32Ret = HI_MPI_VO_GetScreenFrame(VoLayer, &stFrame, 0); + if (HI_SUCCESS != s32Ret) + { + printf("HI_MPI_VO(%d)_GetScreenFrame errno %#x\n", VoLayer, s32Ret); + return -1; + } + + /* make file name */ + if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat) + { + strcpy(szPixFrm, "p420"); + } + else if (PIXEL_FORMAT_YUV_SEMIPLANAR_422 == stFrame.stVFrame.enPixelFormat) + { + strcpy(szPixFrm, "p422"); + } + else if (PIXEL_FORMAT_SINGLE == stFrame.stVFrame.enPixelFormat) + { + strcpy(szPixFrm, "single"); + } + else + { + return -1; + } + + sprintf(szYuvName, "./vo(%d)_%d_%d_%s_%d.yuv", VoLayer, + stFrame.stVFrame.u32Width, stFrame.stVFrame.u32Height, szPixFrm, u32Cnt); + printf("Dump YUV frame of vo(%d) to file: \"%s\"\n", VoLayer, szYuvName); + + HI_MPI_VO_ReleaseScreenFrame(VoLayer, &stFrame); + + /* open file */ + pfd = fopen(szYuvName, "wb"); + + if (NULL == pfd) + { + return -1; + } + + /* get VO frame */ + for (i = 0; i < u32Cnt; i++) + { + s32Ret = HI_MPI_VO_GetScreenFrame(VoLayer, &stFrame, 0); + if (HI_SUCCESS != s32Ret) + { + printf("get vo(%d) frame err\n", VoLayer); + printf("only get %d frame\n", i); + break; + } + /* save VO frame to file */ + sample_yuv_dump(&stFrame.stVFrame, pfd); + + /* release frame after using */ + s32Ret = HI_MPI_VO_ReleaseScreenFrame(VoLayer, &stFrame); + if (HI_SUCCESS != s32Ret) + { + printf("Release vo(%d) frame err\n", VoLayer); + printf("only get %d frame\n", i); + break; + } + } + + fclose(pfd); + + return 0; +} + +HI_S32 main(int argc, char* argv[]) +{ + VO_LAYER VoLayer = 0; + HI_U32 u32FrmCnt = 1; + + /* VOƵID*/ + if (argc > 1) + { + VoLayer = atoi(argv[1]); + } + /* Ҫɼ֡Ŀ*/ + if (argc > 2) + { + u32FrmCnt = atoi(argv[2]); + } + + SAMPLE_MISC_VoDump(VoLayer, u32FrmCnt); + + return HI_SUCCESS; +} + diff --git a/device/mpp/tools/vpss_attr b/device/mpp/tools/vpss_attr new file mode 100644 index 0000000..3a72599 Binary files /dev/null and b/device/mpp/tools/vpss_attr differ diff --git a/device/mpp/tools/vpss_attr.c b/device/mpp/tools/vpss_attr.c new file mode 100644 index 0000000..e47e8ef --- /dev/null +++ b/device/mpp/tools/vpss_attr.c @@ -0,0 +1,135 @@ +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "hi_comm_vo.h" +#include "hi_comm_vi.h" +#include "hi_comm_vpss.h" +#include "hi_type.h" + +#include "mpi_vb.h" +#include "mpi_sys.h" +#include "mpi_vi.h" +#include "mpi_vo.h" +#include "mpi_vpss.h" + +#define USAGE_HELP(void)\ + {\ + printf("\n\tusage : %s para value group [chn] \n", argv[0]); \ + printf("\n\t para: \n"); \ + printf("\t\tenNR [0, disable; 1,enable]\n"); \ + printf("\t\tcon [Աȶȣvalue:0~48, default:8]\n"); \ + printf("\t\tglob [NRǿȣvalue:0~1408, default:128]\n"); \ + printf("\t\tie [IEǿȣvalue:-1~100, default:-1]\n"); \ + printf("\t\tysf [ȿȥǿȣvalue:-1~9999, default:-1]\n"); \ + printf("\t\tytf [ʱȥǿȣvalue:-1~35, default:-1]\n"); \ + printf("\t\tcsf [ɫȿȥǿȣvalue:-1~255, default:-1]\n"); \ + printf("\t\tctf [ɫʱȥǿȣvalue:-1~32, default:-1]\n"); \ + printf("\t\tmdz [˶жֵvalue:-1~511, default:-1]\n"); \ + } + +#define CHECK_RET(express,name)\ + do{\ + if (HI_SUCCESS != express)\ + {\ + printf("%s failed at %s: LINE: %d ! errno:%#x \n", \ + name, __FUNCTION__, __LINE__, express);\ + return HI_FAILURE;\ + }\ + }while(0) + + +HI_S32 main(int argc, char* argv[]) +{ + HI_S32 s32Ret; + VPSS_GRP_ATTR_S stVpssGrpAttr = {0}; + VPSS_GRP_PARAM_S stVpssGrpParam = {0}; + + char paraTemp[16]; + HI_U32 value = 0; + VPSS_GRP VpssGrp = 0; + const char* para = paraTemp; + + if (argc < 4) + { + USAGE_HELP(); + return -1; + } + + strcpy(paraTemp, argv[1]); + value = atoi(argv[2]); + VpssGrp = atoi(argv[3]); + + s32Ret = HI_MPI_VPSS_GetGrpAttr(VpssGrp, &stVpssGrpAttr); + CHECK_RET(s32Ret, "HI_MPI_VPSS_GetGrpAttr"); + + + s32Ret = HI_MPI_VPSS_GetGrpParam(VpssGrp, &stVpssGrpParam); + CHECK_RET(s32Ret, "HI_MPI_VPSS_GetGrpParam"); + + if (0 == strcmp(para, "enNR")) + { + stVpssGrpAttr.bNrEn = value; + } + else if (0 == strcmp(para, "con")) + { + stVpssGrpParam.u32Contrast = value; + } + else if (0 == strcmp(para, "glob")) + { + stVpssGrpParam.s32GlobalStrength = value; + } + else if (0 == strcmp(para, "ie")) + { + stVpssGrpParam.s32IeStrength = value; + } + else if (0 == strcmp(para, "ysf")) + { + stVpssGrpParam.s32YSFStrength = value; + } + else if (0 == strcmp(para, "ytf")) + { + stVpssGrpParam.s32YTFStrength = value; + } + else if (0 == strcmp(para, "csf")) + { + stVpssGrpParam.s32CSFStrength = value; + } + else if (0 == strcmp(para, "ctf")) + { + stVpssGrpParam.s32CTFStrength = value; + } + else if (0 == strcmp(para, "mdz")) + { + stVpssGrpParam.s32MotionLimen = value; + } + else + { + printf("err para\n"); + USAGE_HELP(); + } + + s32Ret = HI_MPI_VPSS_SetGrpAttr(VpssGrp, &stVpssGrpAttr); + CHECK_RET(s32Ret, "HI_MPI_VPSS_SetGrpAttr"); + + + s32Ret = HI_MPI_VPSS_SetGrpParam(VpssGrp, &stVpssGrpParam); + CHECK_RET(s32Ret, "HI_MPI_VPSS_SetGrpParam"); + + + printf("\t\tenNR %d\n", stVpssGrpAttr.bNrEn); + printf("\t\tcon %d\n", stVpssGrpParam.u32Contrast); + printf("\t\tglob %d\n", stVpssGrpParam.s32GlobalStrength); + printf("\t\tie %d\n", stVpssGrpParam.s32IeStrength); + printf("\t\tysf %d\n", stVpssGrpParam.s32YSFStrength); + printf("\t\tytf %d\n", stVpssGrpParam.s32YTFStrength); + printf("\t\tcsf %d\n", stVpssGrpParam.s32CSFStrength); + printf("\t\tctf %d\n", stVpssGrpParam.s32CTFStrength); + printf("\t\tmdz %d\n", stVpssGrpParam.s32MotionLimen); + + return 0; +} + diff --git a/device/mpp/tools/vpss_chn_dump b/device/mpp/tools/vpss_chn_dump new file mode 100644 index 0000000..2994095 Binary files /dev/null and b/device/mpp/tools/vpss_chn_dump differ diff --git a/device/mpp/tools/vpss_chn_dump.c b/device/mpp/tools/vpss_chn_dump.c new file mode 100644 index 0000000..8ee5912 --- /dev/null +++ b/device/mpp/tools/vpss_chn_dump.c @@ -0,0 +1,319 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_vpss.h" +#include "mpi_vpss.h" + +#define VALUE_BETWEEN(x,min,max) (((x)>=(min)) && ((x) <= (max))) + +#if 1 +static HI_S32 s_s32MemDev = -1; + +#define MEM_DEV_OPEN() \ + do {\ + if (s_s32MemDev <= 0)\ + {\ + s_s32MemDev = open("/dev/mem", O_CREAT|O_RDWR|O_SYNC);\ + if (s_s32MemDev < 0)\ + {\ + perror("Open dev/mem error");\ + return -1;\ + }\ + }\ + }while(0) + +#define MEM_DEV_CLOSE() \ + do {\ + HI_S32 s32Ret;\ + if (s_s32MemDev > 0)\ + {\ + s32Ret = close(s_s32MemDev);\ + if(HI_SUCCESS != s32Ret)\ + {\ + perror("Close mem/dev Fail");\ + return s32Ret;\ + }\ + s_s32MemDev = -1;\ + }\ + }while(0) + +HI_VOID* COMM_SYS_Mmap(HI_U32 u32PhyAddr, HI_U32 u32Size) +{ + HI_U32 u32Diff; + HI_U32 u32PagePhy; + HI_U32 u32PageSize; + HI_U8* pPageAddr; + + /* The mmap address should align with page */ + u32PagePhy = u32PhyAddr & 0xfffff000; + u32Diff = u32PhyAddr - u32PagePhy; + + /* The mmap size shuld be mutliples of 1024 */ + u32PageSize = ((u32Size + u32Diff - 1) & 0xfffff000) + 0x1000; + pPageAddr = mmap ((void*)0, u32PageSize, PROT_READ | PROT_WRITE, + MAP_SHARED, s_s32MemDev, u32PagePhy); + if (MAP_FAILED == pPageAddr ) + { + perror("mmap error"); + return NULL; + } + return (HI_VOID*) (pPageAddr + u32Diff); +} + +HI_S32 COMM_SYS_Munmap(HI_VOID* pVirAddr, HI_U32 u32Size) +{ + HI_U32 u32PageAddr; + HI_U32 u32PageSize; + HI_U32 u32Diff; + + u32PageAddr = (((HI_U32)pVirAddr) & 0xfffff000); + u32Diff = (HI_U32)pVirAddr - u32PageAddr; + u32PageSize = ((u32Size + u32Diff - 1) & 0xfffff000) + 0x1000; + + return munmap((HI_VOID*)u32PageAddr, u32PageSize); +} +#endif + +/* sp420 תΪ p420 ; sp422 תΪ p422 */ +void sample_yuv_dump(VIDEO_FRAME_S* pVBuf, FILE* pfd) +{ + unsigned int w, h; + char* pVBufVirt_Y; + char* pVBufVirt_C; + char* pMemContent; + unsigned char TmpBuff[2000]; //ֵ̫СͼܴĻ治 + HI_U32 phy_addr, size; + HI_CHAR* pUserPageAddr[2]; + PIXEL_FORMAT_E enPixelFormat = pVBuf->enPixelFormat; + HI_U32 u32UvHeight;/* Ϊplanar ʽʱUVĸ߶ */ + + if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat) + { + size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 3 / 2; + u32UvHeight = pVBuf->u32Height / 2; + } + else + { + size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 2; + u32UvHeight = pVBuf->u32Height; + } + + phy_addr = pVBuf->u32PhyAddr[0]; + + //printf("phy_addr:%x, size:%d\n", phy_addr, size); + pUserPageAddr[0] = (HI_CHAR*) HI_MPI_SYS_Mmap(phy_addr, size); + if (NULL == pUserPageAddr[0]) + { + return; + } + //printf("stride: %d,%d\n",pVBuf->u32Stride[0],pVBuf->u32Stride[1] ); + + pVBufVirt_Y = pUserPageAddr[0]; + pVBufVirt_C = pVBufVirt_Y + (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + + /* save Y ----------------------------------------------------------------*/ + fprintf(stderr, "saving......Y......"); + fflush(stderr); + for (h = 0; h < pVBuf->u32Height; h++) + { + pMemContent = pVBufVirt_Y + h * pVBuf->u32Stride[0]; + fwrite(pMemContent, pVBuf->u32Width, 1, pfd); + } + fflush(pfd); + + + /* save U ----------------------------------------------------------------*/ + fprintf(stderr, "U......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + pMemContent += 1; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + + /* save V ----------------------------------------------------------------*/ + fprintf(stderr, "V......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + + fprintf(stderr, "done %d!\n", pVBuf->u32TimeRef); + fflush(stderr); + + HI_MPI_SYS_Munmap(pUserPageAddr[0], size); +} + + +HI_VOID* SAMPLE_MISC_VpssDump(VPSS_GRP Grp, VPSS_CHN Chn, HI_U32 u32FrameCnt) +{ + VIDEO_FRAME_INFO_S stFrame; + HI_CHAR szYuvName[128]; + HI_CHAR szPixFrm[10]; + FILE* pfd; + VPSS_GRP VpssGrp = Grp; + VPSS_CHN VpssChn = Chn; + HI_U32 u32Cnt = u32FrameCnt; + HI_U32 u32Depth = 2; + HI_U32 u32OrigDepth = 0; + VPSS_CHN_MODE_S stOrigVpssMode, stVpssMode; + HI_S32 s32MilliSec = 200; + + if (HI_MPI_VPSS_GetChnMode(VpssGrp, VpssChn, &stOrigVpssMode) != HI_SUCCESS) + { + printf("get mode error!!!\n"); + return (HI_VOID*) - 1; + } + + if (HI_MPI_VPSS_GetDepth(VpssGrp, VpssChn, &u32OrigDepth) != HI_SUCCESS) + { + printf("get depth error!!!\n"); + return (HI_VOID*) - 1; + } + + stVpssMode.enChnMode = stOrigVpssMode.enChnMode; + stVpssMode.enPixelFormat = stOrigVpssMode.enPixelFormat; + + stVpssMode.u32Width = stOrigVpssMode.u32Width; + stVpssMode.u32Height = stOrigVpssMode.u32Height; + stVpssMode.enCompressMode = COMPRESS_MODE_NONE; + stVpssMode.bDouble = HI_FALSE; + if (HI_MPI_VPSS_SetChnMode(VpssGrp, VpssChn, &stVpssMode) != HI_SUCCESS) + { + printf("set mode error!!!\n"); + return (HI_VOID*) - 1; + } + if (HI_MPI_VPSS_SetDepth(VpssGrp, VpssChn, u32Depth) != HI_SUCCESS) + { + printf("set depth error!!!\n"); + return (HI_VOID*) - 1; + } + + memset(&stFrame, 0, sizeof(stFrame)); + while (HI_MPI_VPSS_GetChnFrame(VpssGrp, VpssChn, &stFrame, s32MilliSec) != HI_SUCCESS) + { + printf("get frame error!!!\n"); + usleep(40000); + } + + + switch (stFrame.stVFrame.enPixelFormat) + { + case PIXEL_FORMAT_YUV_SEMIPLANAR_420: + snprintf(szPixFrm, 10, "P420"); + break; + case PIXEL_FORMAT_YUV_SEMIPLANAR_422: + snprintf(szPixFrm, 10, "P422"); + break; + case PIXEL_FORMAT_SINGLE: + snprintf(szPixFrm, 10, "Single"); + break; + default: + snprintf(szPixFrm, 10, "--"); + break; + } + + /* make file name */ + sprintf(szYuvName, "./vpss_grp%d_chn%d_w%d_h%d_%s_%d.yuv", VpssGrp, VpssChn, + stFrame.stVFrame.u32Width, stFrame.stVFrame.u32Height, szPixFrm, u32Cnt); + printf("Dump YUV frame of vpss chn %d to file: \"%s\"\n", VpssChn, szYuvName); + fflush(stdout); + + HI_MPI_VPSS_ReleaseChnFrame(VpssGrp, VpssChn, &stFrame); + /* open file */ + pfd = fopen(szYuvName, "wb"); + + if (NULL == pfd) + { + return (HI_VOID*) - 1; + } + + /* get frame */ + while (u32Cnt--) + { + if (HI_MPI_VPSS_GetChnFrame(VpssGrp, VpssChn, &stFrame, s32MilliSec) != HI_SUCCESS) + { + printf("Get frame fail \n"); + usleep(1000); + continue; + } + sample_yuv_dump(&stFrame.stVFrame, pfd); + + printf("Get VpssGrp %d frame %d!!\n", VpssGrp, u32Cnt); + /* release frame after using */ + HI_MPI_VPSS_ReleaseChnFrame(VpssGrp, VpssChn, &stFrame); + } + fclose(pfd); + + HI_MPI_VPSS_SetDepth(VpssGrp, VpssChn, u32OrigDepth); + HI_MPI_VPSS_SetChnMode(VpssGrp, VpssChn, &stOrigVpssMode); + + return (HI_VOID*)0; +} + +HI_S32 main(int argc, char* argv[]) +{ + VPSS_GRP VpssGrp = 0; + VPSS_CHN VpssChn = 0; + HI_U32 u32FrmCnt = 1; + + printf("Usage: ./vpss_dump [Grp] [Chn] [Count] \n"); + printf("Grp: vpss Grp id.\n"); + printf("Chn: vpss Chn id.\n"); + printf("Count: frame count.\n"); + if (argc < 4) + { + printf("wrong arg!!!!\n\n"); + return -1; + } + + VpssGrp = atoi(argv[1]); + if (!VALUE_BETWEEN(VpssGrp, 0, VPSS_MAX_GRP_NUM - 1)) + { + printf("grp id must be [0,%d]!!!!\n\n",VPSS_MAX_GRP_NUM - 1); + return -1; + } + + VpssChn = atoi(argv[2]);/* chn id*/ + if (!VALUE_BETWEEN(VpssChn, 0, VPSS_MAX_PHY_CHN_NUM - 1)) + { + printf("chn id must be [0,%d]!!!!\n\n",VPSS_MAX_PHY_CHN_NUM - 1); + return -1; + } + u32FrmCnt = atoi(argv[3]);/* frame count*/ + + MEM_DEV_OPEN(); + SAMPLE_MISC_VpssDump(VpssGrp, VpssChn, u32FrmCnt); + MEM_DEV_CLOSE(); + + return HI_SUCCESS; +} diff --git a/device/mpp/tools/vpss_src_dump b/device/mpp/tools/vpss_src_dump new file mode 100644 index 0000000..3f99dc4 Binary files /dev/null and b/device/mpp/tools/vpss_src_dump differ diff --git a/device/mpp/tools/vpss_src_dump.c b/device/mpp/tools/vpss_src_dump.c new file mode 100644 index 0000000..dee462b --- /dev/null +++ b/device/mpp/tools/vpss_src_dump.c @@ -0,0 +1,344 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "hi_common.h" +#include "hi_comm_video.h" +#include "hi_comm_sys.h" +#include "mpi_sys.h" +#include "hi_comm_vb.h" +#include "mpi_vb.h" +#include "hi_comm_vpss.h" +#include "mpi_vpss.h" +#include "mpi_vgs.h" + +#define VALUE_BETWEEN(x,min,max) (((x)>=(min)) && ((x) <= (max))) + +static HI_S32 s_s32MemDev = 0; + +typedef struct hiDUMP_MEMBUF_S +{ + VB_BLK hBlock; + VB_POOL hPool; + HI_U32 u32PoolId; + + HI_U32 u32PhyAddr; + HI_U8* pVirAddr; + HI_S32 s32Mdev; +} DUMP_MEMBUF_S; + +HI_S32 memopen( void ) +{ + if (s_s32MemDev <= 0) + { + s_s32MemDev = open ("/dev/mem", O_CREAT | O_RDWR | O_SYNC); + if (s_s32MemDev <= 0) + { + return -1; + } + } + return 0; +} + +HI_VOID memclose() +{ + close(s_s32MemDev); +} + + +/* sp420 תΪ p420 ; sp422 תΪ p422 */ +void sample_yuv_dump(VIDEO_FRAME_S* pVBuf, FILE* pfd) +{ + unsigned int w, h; + char* pVBufVirt_Y; + char* pVBufVirt_C; + char* pMemContent; + unsigned char TmpBuff[2000]; //ֵ̫СͼܴĻ治 + HI_U32 phy_addr, size; + HI_CHAR* pUserPageAddr[2]; + PIXEL_FORMAT_E enPixelFormat = pVBuf->enPixelFormat; + HI_U32 u32UvHeight;/* Ϊplanar ʽʱUVĸ߶ */ + + if (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == enPixelFormat) + { + size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 3 / 2; + u32UvHeight = pVBuf->u32Height / 2; + } + else + { + size = (pVBuf->u32Stride[0]) * (pVBuf->u32Height) * 2; + u32UvHeight = pVBuf->u32Height; + } + + phy_addr = pVBuf->u32PhyAddr[0]; + + //printf("phy_addr:%x, size:%d\n", phy_addr, size); + pUserPageAddr[0] = (HI_CHAR*) HI_MPI_SYS_Mmap(phy_addr, size); + if (NULL == pUserPageAddr[0]) + { + return; + } + //printf("stride: %d,%d\n",pVBuf->u32Stride[0],pVBuf->u32Stride[1] ); + + pVBufVirt_Y = pUserPageAddr[0]; + pVBufVirt_C = pVBufVirt_Y + (pVBuf->u32Stride[0]) * (pVBuf->u32Height); + + /* save Y ----------------------------------------------------------------*/ + fprintf(stderr, "saving......Y......"); + fflush(stderr); + for (h = 0; h < pVBuf->u32Height; h++) + { + pMemContent = pVBufVirt_Y + h * pVBuf->u32Stride[0]; + fwrite(pMemContent, pVBuf->u32Width, 1, pfd); + } + fflush(pfd); + + + /* save U ----------------------------------------------------------------*/ + fprintf(stderr, "U......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + pMemContent += 1; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + + /* save V ----------------------------------------------------------------*/ + fprintf(stderr, "V......"); + fflush(stderr); + for (h = 0; h < u32UvHeight; h++) + { + pMemContent = pVBufVirt_C + h * pVBuf->u32Stride[1]; + + for (w = 0; w < pVBuf->u32Width / 2; w++) + { + TmpBuff[w] = *pMemContent; + pMemContent += 2; + } + fwrite(TmpBuff, pVBuf->u32Width / 2, 1, pfd); + } + fflush(pfd); + + fprintf(stderr, "done %d!\n", pVBuf->u32TimeRef); + fflush(stderr); + + HI_MPI_SYS_Munmap(pUserPageAddr[0], size); +} + + +HI_S32 SAMPLE_MISC_VpssDumpSrcImage(VPSS_GRP Grp) +{ + HI_S32 i = 0; + HI_S32 s32Ret; + VIDEO_FRAME_INFO_S stFrame; + HI_CHAR szYuvName[128]; + HI_CHAR szPixFrm[10]; + FILE* pfd; + VB_POOL hPool = VB_INVALID_POOLID; + HI_U32 u32BlkSize = 0; + + DUMP_MEMBUF_S stMem = {0}; + VIDEO_FRAME_INFO_S stFrmInfo; + VGS_HANDLE hHandle; + VGS_TASK_ATTR_S stTask; + HI_U32 u32LumaSize = 0; + HI_U32 u32ChrmSize = 0; + HI_U32 u32PicLStride = 0; + HI_U32 u32PicCStride = 0; + HI_U32 u32Width = 0; + HI_U32 u32Height = 0; + HI_BOOL bSendToVgs = HI_FALSE; + VPSS_GRP VpssGrp = Grp; + + if(HI_MPI_VPSS_EnableBackupFrame(VpssGrp) != HI_SUCCESS) + { + printf(">>>>>> Grp %d enable backup Frame error\n", VpssGrp); + return -1; + } + /* get frame */ + while ((HI_MPI_VPSS_GetGrpFrame(VpssGrp, &stFrame, 0) != HI_SUCCESS)) + { + printf("get frame error!!!\n"); + sleep(1); + } + + /* make file name */ + strcpy(szPixFrm, (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat) ? "p420" : "p422"); + sprintf(szYuvName, "./vpss%d_%d_%d_%s.yuv", VpssGrp, + stFrame.stVFrame.u32Width, stFrame.stVFrame.u32Height, szPixFrm); + + printf("Dump YUV frame of vpss%d to file: \"%s\"\n", VpssGrp, szYuvName); + + bSendToVgs = ((stFrame.stVFrame.enCompressMode > 0) || (stFrame.stVFrame.enVideoFormat > 0)); + + /* open file */ + pfd = fopen(szYuvName, "wb"); + + if (NULL == pfd) + { + HI_MPI_VPSS_DisableBackupFrame(VpssGrp); + return -1; + } + + //memopen(); + + u32PicLStride = stFrame.stVFrame.u32Stride[0]; + u32PicCStride = stFrame.stVFrame.u32Stride[0]; + u32LumaSize = stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height; + u32ChrmSize = (stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height) >> (1 + (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat)); + u32Width = stFrame.stVFrame.u32Width; + u32Height = stFrame.stVFrame.u32Height; + + if (bSendToVgs) + { + u32BlkSize = (PIXEL_FORMAT_YUV_SEMIPLANAR_420 == stFrame.stVFrame.enPixelFormat) + ? (stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height * 3 >> 1) : (stFrame.stVFrame.u32Stride[0] * stFrame.stVFrame.u32Height * 2); + + /*create comm vb pool*/ + hPool = HI_MPI_VB_CreatePool( u32BlkSize, 1, NULL); + if (hPool == VB_INVALID_POOLID) + { + printf("HI_MPI_VB_CreatePool failed! \n"); + goto END1; + } + + stMem.hPool = hPool; + } + + if (bSendToVgs) + { + while ((stMem.hBlock = HI_MPI_VB_GetBlock(stMem.hPool, u32BlkSize, NULL)) == VB_INVALID_HANDLE) + { + ; + } + + stMem.u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(stMem.hBlock); + + + stMem.pVirAddr = (HI_U8*) HI_MPI_SYS_Mmap( stMem.u32PhyAddr, u32BlkSize ); + if (stMem.pVirAddr == NULL) + { + printf("Mem dev may not open\n"); + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + goto END2; + } + + memset(&stFrmInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S)); + stFrmInfo.stVFrame.u32PhyAddr[0] = stMem.u32PhyAddr; + stFrmInfo.stVFrame.u32PhyAddr[1] = stFrmInfo.stVFrame.u32PhyAddr[0] + u32LumaSize; + stFrmInfo.stVFrame.u32PhyAddr[2] = stFrmInfo.stVFrame.u32PhyAddr[1] + u32ChrmSize; + + stFrmInfo.stVFrame.pVirAddr[0] = stMem.pVirAddr; + stFrmInfo.stVFrame.pVirAddr[1] = (HI_U8*) stFrmInfo.stVFrame.pVirAddr[0] + u32LumaSize; + stFrmInfo.stVFrame.pVirAddr[2] = (HI_U8*) stFrmInfo.stVFrame.pVirAddr[1] + u32ChrmSize; + + stFrmInfo.stVFrame.u32Width = u32Width; + stFrmInfo.stVFrame.u32Height = u32Height; + stFrmInfo.stVFrame.u32Stride[0] = u32PicLStride; + stFrmInfo.stVFrame.u32Stride[1] = u32PicCStride; + stFrmInfo.stVFrame.u32Stride[2] = u32PicCStride; + + stFrmInfo.stVFrame.enCompressMode = COMPRESS_MODE_NONE; + stFrmInfo.stVFrame.enPixelFormat = stFrame.stVFrame.enPixelFormat; + stFrmInfo.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR; + + stFrmInfo.stVFrame.u64pts = (i * 40); + stFrmInfo.stVFrame.u32TimeRef = (i * 2); + + stFrmInfo.u32PoolId = hPool; + + s32Ret = HI_MPI_VGS_BeginJob(&hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_BeginJob failed\n"); + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + goto END2; + } + + memcpy(&stTask.stImgIn, &stFrame.stVFrame, sizeof(VIDEO_FRAME_INFO_S)); + memcpy(&stTask.stImgOut , &stFrmInfo, sizeof(VIDEO_FRAME_INFO_S)); + s32Ret = HI_MPI_VGS_AddScaleTask(hHandle, &stTask); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_AddScaleTask failed\n"); + HI_MPI_VGS_CancelJob(hHandle); + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + goto END2; + } + + s32Ret = HI_MPI_VGS_EndJob(hHandle); + if (s32Ret != HI_SUCCESS) + { + printf("HI_MPI_VGS_EndJob failed\n"); + HI_MPI_VGS_CancelJob(hHandle); + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + goto END2; + } + sleep(1); + /* save VO frame to file */ + sample_yuv_dump(&stFrmInfo.stVFrame, pfd); + + HI_MPI_VB_ReleaseBlock(stMem.hBlock); + } + else + { + /* save VO frame to file */ + sample_yuv_dump(&stFrame.stVFrame, pfd); + } + + +END2: + if (hPool != VB_INVALID_POOLID) + { + HI_MPI_VB_DestroyPool( hPool ); + } + +END1: + + //memclose(); + + fclose(pfd); + HI_MPI_VPSS_DisableBackupFrame(VpssGrp); + HI_MPI_VPSS_ReleaseGrpFrame(VpssGrp, &stFrame); + + return 0; +} + +HI_S32 main(int argc, char* argv[]) +{ + VPSS_GRP VpssGrp = 0; + + printf("Usage: ./vpss_dump [Grp] \n"); + printf("Grp: vpss Grp id.\n"); + + + if (argc < 2) + { + printf("wrong arg!!!!\n\n"); + return -1; + } + + VpssGrp = atoi(argv[1]); + if (!VALUE_BETWEEN(VpssGrp, 0, 127)) + { + printf("grp id must be [0,127]!!!!\n\n"); + return -1; + } + + SAMPLE_MISC_VpssDumpSrcImage(VpssGrp); + + return HI_SUCCESS; +}