summaryrefslogtreecommitdiff
authorKieth Liu <kieth.liu@amlogic.com>2016-01-27 08:15:44 (GMT)
committer Kieth Liu <kieth.liu@amlogic.com>2016-01-27 08:19:06 (GMT)
commitcf1739e82e35a4eb1fc57b14e7f4f21bedddf511 (patch)
treeb72cef16b903d4fc83a02a7d022e2b710c0f0821
parenta5cdf136c98ab8b66bc4696f8094491096cc2392 (diff)
downloadtv_input-cf1739e82e35a4eb1fc57b14e7f4f21bedddf511.zip
tv_input-cf1739e82e35a4eb1fc57b14e7f4f21bedddf511.tar.gz
tv_input-cf1739e82e35a4eb1fc57b14e7f4f21bedddf511.tar.bz2
PD#118637: support android M
Change-Id: I3a32df9af17b7b1a2d64f331ddb1bd3697a3ece3
Diffstat
-rw-r--r--Android.mk14
-rw-r--r--screen_source/Android.mk31
-rw-r--r--screen_source/aml_screen.cpp296
-rw-r--r--screen_source/v4l2_vdin.cpp676
-rw-r--r--screen_source/v4l2_vdin.h144
-rw-r--r--tv_callback.h18
-rw-r--r--tv_input.cpp263
-rw-r--r--tvapi/android/Android.mk2
-rw-r--r--tvapi/android/include/ITv.h98
-rw-r--r--tvapi/android/include/ITvClient.h56
-rw-r--r--tvapi/android/include/ITvService.h66
-rw-r--r--tvapi/android/include/Tv.h158
-rw-r--r--tvapi/android/include/tvcmd.h1212
-rw-r--r--tvapi/android/jni/Android.mk135
-rw-r--r--tvapi/android/jni/cfbc_jni.cpp18
-rw-r--r--tvapi/android/jni/cfbc_test.cpp86
-rw-r--r--tvapi/android/jni/com_droidlogic_app_tv_TvControlManager.cpp (renamed from tvapi/android/jni/android_amlogic_tv.cpp)929
-rw-r--r--tvapi/android/libtvbinder/Android.mk48
-rw-r--r--tvapi/android/libtvbinder/ITv.cpp292
-rw-r--r--tvapi/android/libtvbinder/ITvClient.cpp116
-rw-r--r--tvapi/android/libtvbinder/ITvService.cpp100
-rw-r--r--tvapi/android/libtvbinder/Tv.cpp378
-rw-r--r--tvapi/android/tv/Android.mk23
-rw-r--r--tvapi/android/tv/CTv.cpp104
-rw-r--r--tvapi/android/tv/CTv.h54
-rw-r--r--tvapi/android/tvserver/Android.mk164
-rw-r--r--tvapi/android/tvserver/TvService.cpp8911
-rw-r--r--tvapi/android/tvserver/TvService.h170
-rw-r--r--tvapi/android/tvserver/main.cpp46
-rw-r--r--tvapi/android/tvserver/tv_callback.h18
-rw-r--r--[-rwxr-xr-x]tvapi/build/include/.gitignore0
-rw-r--r--tvapi/build/include/xxxconfig.h1
-rw-r--r--tvapi/docs/tv.uml12156
-rw-r--r--tvapi/libtv/Android.mk12
-rw-r--r--tvapi/libtv/audio/CAudioCustomerCtrl.cpp126
-rw-r--r--tvapi/libtv/audio/CAudioCustomerCtrl.h31
-rw-r--r--tvapi/libtv/audio/CTvAudio.cpp30
-rw-r--r--tvapi/libtv/audio/CTvAudio.h76
-rw-r--r--tvapi/libtv/audio/audio_alsa.cpp2073
-rw-r--r--tvapi/libtv/audio/audio_alsa.h257
-rw-r--r--tvapi/libtv/audio/audio_android.cpp1035
-rw-r--r--tvapi/libtv/audio/audio_android.h78
-rw-r--r--tvapi/libtv/audio/audio_android_effect.cpp591
-rw-r--r--tvapi/libtv/audio/audio_android_effect.h65
-rw-r--r--tvapi/libtv/audio/audio_api.cpp2470
-rw-r--r--tvapi/libtv/audio/audio_api.h323
-rw-r--r--tvapi/libtv/audio/audio_effect.cpp356
-rw-r--r--tvapi/libtv/audio/audio_effect.h58
-rw-r--r--tvapi/libtv/include/amstream.h526
-rw-r--r--tvapi/libtv/include/amvecm.h136
-rw-r--r--tvapi/libtv/include/cm.h308
-rw-r--r--tvapi/libtv/include/hdmirx_cec.h316
-rw-r--r--tvapi/libtv/include/ve.h461
-rw-r--r--tvapi/libtv/tv/AutoBackLight.cpp425
-rw-r--r--tvapi/libtv/tv/CAutoPQparam.cpp150
-rw-r--r--tvapi/libtv/tv/CAutoPQparam.h41
-rw-r--r--tvapi/libtv/tv/CAv.cpp116
-rw-r--r--tvapi/libtv/tv/CAv.h24
-rw-r--r--tvapi/libtv/tv/CFbcCommunication.cpp443
-rw-r--r--tvapi/libtv/tv/CFbcCommunication.h25
-rw-r--r--tvapi/libtv/tv/CFrontEnd.cpp198
-rw-r--r--tvapi/libtv/tv/CFrontEnd.h19
-rw-r--r--tvapi/libtv/tv/CTv.cpp13003
-rw-r--r--tvapi/libtv/tv/CTv.h1453
-rw-r--r--tvapi/libtv/tv/CTvBooking.cpp324
-rw-r--r--tvapi/libtv/tv/CTvBooking.h166
-rw-r--r--tvapi/libtv/tv/CTvEpg.cpp24
-rw-r--r--tvapi/libtv/tv/CTvEv.h12
-rw-r--r--tvapi/libtv/tv/CTvLog.h8
-rw-r--r--tvapi/libtv/tv/CTvRecord.cpp552
-rw-r--r--tvapi/libtv/tv/CTvRecord.h92
-rw-r--r--tvapi/libtv/tv/CTvSatellite.h42
-rw-r--r--tvapi/libtv/tv/CTvScanner.cpp335
-rw-r--r--tvapi/libtv/tv/CTvScanner.h26
-rw-r--r--tvapi/libtv/tv/CTvScreenCapture.cpp1279
-rw-r--r--tvapi/libtv/tv/CTvScreenCapture.h351
-rw-r--r--tvapi/libtv/tv/CTvSubtitle.cpp361
-rw-r--r--tvapi/libtv/tv/CTvSubtitle.h484
-rw-r--r--tvapi/libtv/tv/CTvVchipCheck.cpp6
-rw-r--r--tvapi/libtv/tv/CUpgradeFBC.cpp4
-rw-r--r--tvapi/libtv/tv/CUpgradeFBC.h282
-rw-r--r--tvapi/libtv/tv/ScreenCatch.cpp379
-rw-r--r--tvapi/libtv/tvconfig/CIniFile.cpp706
-rw-r--r--tvapi/libtv/tvconfig/tvconfig.conf58
-rw-r--r--tvapi/libtv/tvconfig/tvconfig.cpp106
-rw-r--r--tvapi/libtv/tvconfig/tvconfig.h40
-rw-r--r--tvapi/libtv/tvdb/CTvChannel.cpp694
-rw-r--r--tvapi/libtv/tvdb/CTvChannel.h574
-rw-r--r--tvapi/libtv/tvdb/CTvDatabase.cpp25
-rw-r--r--tvapi/libtv/tvdb/CTvDatabase.h188
-rw-r--r--tvapi/libtv/tvdb/CTvDimension.cpp86
-rw-r--r--tvapi/libtv/tvdb/CTvDimension.h194
-rw-r--r--tvapi/libtv/tvdb/CTvEvent.cpp483
-rw-r--r--tvapi/libtv/tvdb/CTvEvent.h170
-rw-r--r--tvapi/libtv/tvdb/CTvGroup.cpp88
-rw-r--r--tvapi/libtv/tvdb/CTvGroup.h60
-rw-r--r--tvapi/libtv/tvdb/CTvProgram.cpp1806
-rw-r--r--tvapi/libtv/tvdb/CTvProgram.h1066
-rw-r--r--tvapi/libtv/tvdb/CTvRegion.cpp366
-rw-r--r--tvapi/libtv/tvdb/CTvRegion.h84
-rw-r--r--tvapi/libtv/tvin/CHDMIRxCEC.cpp38
-rw-r--r--tvapi/libtv/tvin/CSourceConnectDetect.cpp478
-rw-r--r--tvapi/libtv/tvin/CSourceConnectDetect.h73
-rw-r--r--tvapi/libtv/tvin/CTvin.cpp203
-rw-r--r--tvapi/libtv/tvin/CTvin.h191
-rw-r--r--tvapi/libtv/tvsetting/CBlobDevice.cpp54
-rw-r--r--tvapi/libtv/tvsetting/CBlobDevice.h100
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp403
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceE2prom.h152
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceFile.cpp160
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceFile.h52
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceRam.cpp258
-rw-r--r--tvapi/libtv/tvsetting/CBlobDeviceRam.h74
-rw-r--r--tvapi/libtv/tvsetting/CTvSetting.cpp4658
-rw-r--r--tvapi/libtv/tvsetting/CTvSetting.h30
-rw-r--r--tvapi/libtv/tvsetting/CTvSettingCfg.h782
-rw-r--r--tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp10
-rw-r--r--tvapi/libtv/tvsetting/TvKeyData.cpp2726
-rw-r--r--tvapi/libtv/tvsetting/TvKeyData.h64
-rw-r--r--tvapi/libtv/tvsetting/audio_cfg.cpp2575
-rw-r--r--tvapi/libtv/tvsetting/audio_cfg.h239
-rw-r--r--tvapi/libtv/tvutils/CCondition.h2
-rw-r--r--tvapi/libtv/tvutils/CFile.cpp65
-rw-r--r--tvapi/libtv/tvutils/CFile.h3
-rw-r--r--tvapi/libtv/tvutils/CHdmiCecCmd.cpp2
-rw-r--r--tvapi/libtv/tvutils/CMsgQueue.cpp31
-rw-r--r--tvapi/libtv/tvutils/CMsgQueue.h3
-rw-r--r--tvapi/libtv/tvutils/CSerialCommunication.h96
-rw-r--r--tvapi/libtv/tvutils/CSerialPort.cpp18
-rw-r--r--tvapi/libtv/tvutils/CSqlite.cpp8
-rw-r--r--tvapi/libtv/tvutils/CSqlite.h12
-rw-r--r--tvapi/libtv/tvutils/CThread.cpp2
-rw-r--r--tvapi/libtv/tvutils/CTvInput.cpp25
-rw-r--r--tvapi/libtv/tvutils/CTvInput.h4
-rw-r--r--tvapi/libtv/tvutils/serial_base.h34
-rw-r--r--tvapi/libtv/tvutils/serial_operate.cpp66
-rw-r--r--tvapi/libtv/tvutils/serial_operate.h70
-rw-r--r--tvapi/libtv/tvutils/tvutils.cpp3931
-rw-r--r--tvapi/libtv/tvutils/tvutils.h222
-rw-r--r--tvapi/libtv/tvutils/zepoll.cpp2
-rw-r--r--tvapi/libtv/version/version.cpp188
-rw-r--r--tvapi/libtv/version/version.h22
-rw-r--r--tvapi/libtv/vpp/CPQdb.cpp3509
-rw-r--r--tvapi/libtv/vpp/CPQdb.h340
-rw-r--r--tvapi/libtv/vpp/CVpp.cpp5602
-rw-r--r--tvapi/libtv/vpp/CVpp.h230
-rw-r--r--tvapi/tvtests/Android.mk98
-rw-r--r--tvapi/tvtests/android_tvtest.cpp2
-rw-r--r--tvapi/tvtests/comm_test.cpp4
-rw-r--r--tvapi/tvtests/ssm_test.cpp420
-rw-r--r--tvapi/tvtests/tvconfig_test.cpp854
151 files changed, 45277 insertions, 47437 deletions
diff --git a/Android.mk b/Android.mk
index b7040c8..7d867ca 100644
--- a/Android.mk
+++ b/Android.mk
@@ -20,12 +20,10 @@ endif
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SHARED_LIBRARIES := libcutils liblog
-LOCAL_SRC_FILES := tv_input.cpp \
-screen_source/v4l2_vdin.cpp
+LOCAL_SRC_FILES := tv_input.cpp
LOCAL_MODULE := tv_input.amlogic
LOCAL_MODULE_TAGS := optional
LOCAL_C_INCLUDES += \
- $(TVAPI_PATH)/libtv \
$(TVAPI_PATH)/android \
$(DVB_PATH)/android/ndk/include \
$(DVB_PATH)/include/am_adp \
@@ -43,14 +41,14 @@ LOCAL_C_INCLUDES += \
system/media/audio_effects/include \
system/core/libion/include \
system/core/libion/kernel-headers \
- $(GRALLOC_DIR) \
- screen_source
+ $(GRALLOC_DIR)
+
+LOCAL_C_INCLUDES += hardware/amlogic/audio/libTVaudio
LOCAL_SHARED_LIBRARIES += \
- libtv \
- libtvserver \
- libtv_jni
+ libtvplay \
+ libbinder
LOCAL_SHARED_LIBRARIES += libutils liblog libui
diff --git a/screen_source/Android.mk b/screen_source/Android.mk
deleted file mode 100644
index a40269f..0000000
--- a/screen_source/Android.mk
+++ b/dev/null
@@ -1,31 +0,0 @@
-# Copyright (C) 2013 Amlogic
-#
-#
-
-LOCAL_PATH := $(call my-dir)
-
-# HAL module implemenation, not prelinked and stored in
-# /system/lib/hw/screen_source.amlogic.so
-include $(CLEAR_VARS)
-LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_SRC_FILES := aml_screen.cpp v4l2_vdin.cpp
-
-ifneq (,$(wildcard hardware/amlogic/gralloc))
- GRALLOC_DIR := hardware/amlogic/gralloc
-else
- GRALLOC_DIR := hardware/libhardware/modules/gralloc
-endif
-
-LOCAL_C_INCLUDES += frameworks/native/include/utils \
- frameworks/native/include/android \
- system/core/include/utils \
- system/core/libion/include \
- system/core/libion/kernel-headers \
- $(GRALLOC_DIR)
-
-LOCAL_SHARED_LIBRARIES:= libutils liblog libui
-
-LOCAL_MODULE := screen_source.amlogic
-LOCAL_CFLAGS:= -DLOG_TAG=\"screen_source\"
-LOCAL_MODULE_TAGS := optional
-include $(BUILD_SHARED_LIBRARY)
diff --git a/screen_source/aml_screen.cpp b/screen_source/aml_screen.cpp
deleted file mode 100644
index 62fb94b..0000000
--- a/screen_source/aml_screen.cpp
+++ b/dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "screen_source"
-#include <hardware/hardware.h>
-#include <hardware/aml_screen.h>
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/select.h>
-#include <linux/videodev2.h>
-#include <sys/time.h>
-
-
-#include <errno.h>
-#include <cutils/log.h>
-#include <cutils/atomic.h>
-
-#include "v4l2_vdin.h"
-
-#ifndef LOGD
-#define LOGD ALOGD
-#endif
-#ifndef LOGV
-#define LOGV ALOGV
-#endif
-#ifndef LOGE
-#define LOGE ALOGE
-#endif
-#ifndef LOGI
-#define LOGI ALOGI
-#endif
-
-static unsigned int gAmlScreenOpen = 0;
-static android::Mutex gAmlScreenLock;
-
-/*****************************************************************************/
-
-static int aml_screen_device_open(const struct hw_module_t *module, const char *name,
- struct hw_device_t **device);
-
-static struct hw_module_methods_t aml_screen_module_methods = {
-open:
- aml_screen_device_open
-};
-
-aml_screen_module_t HAL_MODULE_INFO_SYM = {
-common:
- {
-tag:
- HARDWARE_MODULE_TAG,
- version_major: 1,
- version_minor: 0,
-id:
- AML_SCREEN_HARDWARE_MODULE_ID,
-name: "aml screen source module"
- ,
-author: "Amlogic"
- ,
-methods:
- &aml_screen_module_methods,
-dso :
- NULL,
-reserved :
- {0},
- }
-};
-
-/*****************************************************************************/
-
-static int aml_screen_device_close(struct hw_device_t *dev)
-{
- android::vdin_screen_source *source = NULL;
- aml_screen_device_t *ctx = (aml_screen_device_t *)dev;
-
- android::Mutex::Autolock lock(gAmlScreenLock);
- if (ctx) {
- if (ctx->priv) {
- source = (android::vdin_screen_source *)ctx->priv;
- delete source;
- source = NULL;
- }
- free(ctx);
- }
- gAmlScreenOpen--;
- return 0;
-}
-
-int screen_source_start(struct aml_screen_device *dev)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->start();
-}
-
-int screen_source_stop(struct aml_screen_device *dev)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->stop();
-}
-
-int screen_source_pause(struct aml_screen_device *dev)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->pause();
-}
-
-int screen_source_get_format(struct aml_screen_device *dev)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->get_format();
-}
-
-int screen_source_set_format(struct aml_screen_device *dev, int width, int height, int pix_format)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
-
- if ((width > 0) && (height > 0) && ((pix_format == V4L2_PIX_FMT_NV21) || (pix_format == V4L2_PIX_FMT_YUV420))) {
- return source->set_format(width, height, pix_format);
- } else {
- return source->set_format();
- }
-}
-
-int screen_source_set_rotation(struct aml_screen_device *dev, int degree)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->set_rotation(degree);
-}
-
-int screen_source_set_crop(struct aml_screen_device *dev, int x, int y, int width, int height)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
-
- if ((x >= 0) && (y >= 0) && (width > 0) && (height > 0))
- return source->set_crop(x, y, width, height);
-
- return android::BAD_VALUE;
-}
-
-int screen_source_set_amlvideo2_crop(struct aml_screen_device *dev, int x, int y, int width, int height)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
-
- if ((x >= 0) && (y >= 0) && (width > 0) && (height > 0))
- return source->set_amlvideo2_crop(x, y, width, height);
-
- return android::BAD_VALUE;
-}
-
-int screen_source_aquire_buffer(struct aml_screen_device *dev, aml_screen_buffer_info_t *buff_info)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
-
- return source->aquire_buffer(buff_info);
-}
-
-int screen_source_release_buffer(struct aml_screen_device *dev, long *ptr)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->release_buffer(ptr);
-}
-
-int screen_source_set_state_callback(struct aml_screen_device *dev, olStateCB callback)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->set_state_callback(callback);
-}
-
-int screen_source_set_preview_window(struct aml_screen_device *dev, ANativeWindow *window)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->set_preview_window(window);
-}
-
-int screen_source_set_data_callback(struct aml_screen_device *dev, app_data_callback callback, void *user)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->set_data_callback(callback, user);
-}
-
-int screen_source_set_frame_rate(struct aml_screen_device *dev, int frameRate)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->set_frame_rate(frameRate);
-}
-
-int screen_source_set_source_type(struct aml_screen_device *dev, SOURCETYPE sourceType)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->set_source_type(sourceType);
-}
-
-int screen_source_get_source_type(struct aml_screen_device *dev)
-{
- android::vdin_screen_source *source = (android::vdin_screen_source *)dev->priv;
- return source->get_source_type();
-}
-
-/* int screen_source_inc_buffer_refcount(struct aml_screen_device* dev, int* ptr)
-{
- android::vdin_screen_source* source = (android::vdin_screen_source*)dev->priv;
- return source->inc_buffer_refcount(ptr);
-} */
-
-/*****************************************************************************/
-
-static int aml_screen_device_open(const struct hw_module_t *module, const char *name,
- struct hw_device_t **device)
-{
- int status = -EINVAL;
- android::vdin_screen_source *source = NULL;
- android::Mutex::Autolock lock(gAmlScreenLock);
-
- LOGV("aml_screen_device_open");
-
- if (!strcmp(name, AML_SCREEN_SOURCE)) {
- if (gAmlScreenOpen > 1) {
- ALOGD("aml screen device already open");
- *device = NULL;
- return -EINVAL;
- }
-
- aml_screen_device_t *dev = (aml_screen_device_t *)malloc(sizeof(aml_screen_device_t));
-
- if (!dev) {
- LOGE("no memory for the screen source device");
- return -ENOMEM;
- }
- /* initialize handle here */
- memset(dev, 0, sizeof(*dev));
-
- source = new android::vdin_screen_source;
- if (!source) {
- LOGE("no memory for class of vdin_screen_source");
- free (dev);
- return -ENOMEM;
- }
-
- if (source->init() != 0) {
- LOGE("open vdin_screen_source failed!");
- free (dev);
- return -1;
- }
-
- dev->priv = (void *)source;
-
- /* initialize the procs */
- dev->common.tag = HARDWARE_DEVICE_TAG;
- dev->common.version = 0;
- dev->common.module = const_cast<hw_module_t *>(module);
- dev->common.close = aml_screen_device_close;
-
- dev->ops.start = screen_source_start;
- dev->ops.stop = screen_source_stop;
- dev->ops.pause = screen_source_pause;
- dev->ops.get_format = screen_source_get_format;
- dev->ops.set_format = screen_source_set_format;
- dev->ops.set_rotation = screen_source_set_rotation;
- dev->ops.set_crop = screen_source_set_crop;
- dev->ops.set_amlvideo2_crop = screen_source_set_amlvideo2_crop;
- dev->ops.aquire_buffer = screen_source_aquire_buffer;
- dev->ops.release_buffer = screen_source_release_buffer;
- dev->ops.setStateCallBack = screen_source_set_state_callback;
- dev->ops.setPreviewWindow = screen_source_set_preview_window;
- dev->ops.setDataCallBack = screen_source_set_data_callback;
- dev->ops.set_frame_rate = screen_source_set_frame_rate;
- dev->ops.set_source_type = screen_source_set_source_type;
- dev->ops.get_source_type = screen_source_get_source_type;
- // dev->ops.inc_buffer_refcount = screen_source_inc_buffer_refcount;
- *device = &dev->common;
- status = 0;
- gAmlScreenOpen++;
- }
- return status;
-}
diff --git a/screen_source/v4l2_vdin.cpp b/screen_source/v4l2_vdin.cpp
deleted file mode 100644
index bd63166..0000000
--- a/screen_source/v4l2_vdin.cpp
+++ b/dev/null
@@ -1,676 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-//reinclude because of a bug with the log macros
-//#define LOG_NDEBUG 0
-#define LOG_TAG "V4L2VINSOURCE"
-#include <utils/Log.h>
-#include <utils/String8.h>
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/select.h>
-#include <linux/videodev2.h>
-#include <sys/time.h>
-
-#include <cutils/properties.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "v4l2_vdin.h"
-#include <ui/GraphicBufferMapper.h>
-#include <ui/GraphicBuffer.h>
-#include <linux/videodev2.h>
-
-namespace android {
-
-#define V4L2_ROTATE_ID 0x980922
-
-#ifndef container_of
-#define container_of(ptr, type, member) ({ \
- const typeof(((type *) 0)->member) *__mptr = (ptr); \
- (type *) ((char *) __mptr - (char *)(&((type *)0)->member)); })
-#endif
-
-#define BOUNDRY 32
-
-#define ALIGN(x) (x + (BOUNDRY) - 1)& ~((BOUNDRY) - 1)
-
- static size_t getBufSize(int format, int width, int height)
- {
- size_t buf_size = 0;
-
- switch (format) {
- case V4L2_PIX_FMT_YVU420:
- case V4L2_PIX_FMT_NV21:
- buf_size = width * height * 3 / 2;
- break;
- case V4L2_PIX_FMT_YUYV:
- case V4L2_PIX_FMT_RGB565:
- buf_size = width * height * 2;
- break;
- case V4L2_PIX_FMT_RGB24:
- buf_size = width * height * 3;
- break;
- case V4L2_PIX_FMT_RGB32:
- buf_size = width * height * 4;
- break;
- default:
- ALOGE("Invalid format");
- buf_size = 0;
- }
- return buf_size;
- }
-
- static int getNativeWindowFormat(int format)
- {
- int nativeFormat = HAL_PIXEL_FORMAT_YCbCr_422_I;
-
- switch (format) {
- case V4L2_PIX_FMT_YVU420:
- nativeFormat = HAL_PIXEL_FORMAT_YV12;
- break;
- case V4L2_PIX_FMT_NV21:
- nativeFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
- break;
- case V4L2_PIX_FMT_YUYV:
- nativeFormat = HAL_PIXEL_FORMAT_YCbCr_422_I;
- break;
- case V4L2_PIX_FMT_RGB565:
- nativeFormat = HAL_PIXEL_FORMAT_RGB_565;
- break;
- case V4L2_PIX_FMT_RGB24:
- nativeFormat = HAL_PIXEL_FORMAT_RGB_888;
- break;
- case V4L2_PIX_FMT_RGB32:
- nativeFormat = HAL_PIXEL_FORMAT_RGBA_8888;
- break;
- default:
- ALOGE("Invalid format,Use default format");
- }
- return nativeFormat;
- }
-
-
- static ANativeWindowBuffer *handle_to_buffer(buffer_handle_t *handle)
- {
- return container_of(handle, ANativeWindowBuffer, handle);
- }
-
- vdin_screen_source::vdin_screen_source()
- : mCameraHandle(-1),
- mVideoInfo(NULL)
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- }
-
- int vdin_screen_source::init()
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- mCameraHandle = open("/dev/video11", O_RDWR | O_NONBLOCK);
- if (mCameraHandle < 0) {
- ALOGE("[%s %d] mCameraHandle:%x [%s]", __FUNCTION__, __LINE__, mCameraHandle, strerror(errno));
- return -1;
- }
- mVideoInfo = (struct VideoInfo *) calloc (1, sizeof (struct VideoInfo));
- if (mVideoInfo == NULL) {
- ALOGE("[%s %d] no memory for mVideoInfo", __FUNCTION__, __LINE__);
- close(mCameraHandle);
- return NO_MEMORY;
- }
- mBufferCount = 4;
- mPixelFormat = V4L2_PIX_FMT_NV21;
- mNativeWindowPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
- mFrameWidth = 1280;
- mFrameHeight = 720;
- mBufferSize = mFrameWidth * mFrameHeight * 3 / 2;
- mSetStateCB = NULL;
- mState = STOP;
- mANativeWindow = NULL;
- mFrameType = 0;
- mWorkThread = NULL;
- mDataCB = NULL;
- mOpen = false;
- return NO_ERROR;
- }
-
- vdin_screen_source::~vdin_screen_source()
- {
- if (mVideoInfo) {
- free (mVideoInfo);
- }
- if (mCameraHandle >= 0) {
- close(mCameraHandle);
- }
- }
-
- int vdin_screen_source::start_v4l2_device()
- {
- int ret = -1;
-
- ALOGV("[%s %d] mCameraHandle:%x", __FUNCTION__, __LINE__, mCameraHandle);
-
- ioctl(mCameraHandle, VIDIOC_QUERYCAP, &mVideoInfo->cap);
-
- mVideoInfo->rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- mVideoInfo->rb.memory = V4L2_MEMORY_MMAP;
- mVideoInfo->rb.count = mBufferCount;
-
- ret = ioctl(mCameraHandle, VIDIOC_REQBUFS, &mVideoInfo->rb);
-
- if (ret < 0) {
- ALOGE("[%s %d] VIDIOC_REQBUFS:%d mCameraHandle:%x", __FUNCTION__, __LINE__, ret, mCameraHandle);
- return ret;
- }
-
- for (int i = 0; i < mBufferCount; i++) {
- memset (&mVideoInfo->buf, 0, sizeof (struct v4l2_buffer));
-
- mVideoInfo->buf.index = i;
- mVideoInfo->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- mVideoInfo->buf.memory = V4L2_MEMORY_MMAP;
-
- ret = ioctl (mCameraHandle, VIDIOC_QUERYBUF, &mVideoInfo->buf);
- if (ret < 0) {
- ALOGE("[%s %d]VIDIOC_QUERYBUF %d failed", __FUNCTION__, __LINE__, i);
- return ret;
- }
- mVideoInfo->canvas[i] = mVideoInfo->buf.reserved;
- mVideoInfo->mem[i] = (long *)mmap (0, mVideoInfo->buf.length, PROT_READ | PROT_WRITE,
- MAP_SHARED, mCameraHandle, mVideoInfo->buf.m.offset);
-
- if (mVideoInfo->mem[i] == MAP_FAILED) {
- ALOGE("[%s %d] MAP_FAILED", __FUNCTION__, __LINE__);
- return -1;
- }
- mVideoInfo->refcount[i] = 0;
- mBufs.add(mVideoInfo->mem[i], i);
- }
- ALOGV("[%s %d] VIDIOC_QUERYBUF successful", __FUNCTION__, __LINE__);
-
- for (int i = 0; i < mBufferCount; i++) {
- mVideoInfo->buf.index = i;
- mVideoInfo->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- mVideoInfo->buf.memory = V4L2_MEMORY_MMAP;
- ret = ioctl(mCameraHandle, VIDIOC_QBUF, &mVideoInfo->buf);
- if (ret < 0) {
- ALOGE("VIDIOC_QBUF Failed");
- return -1;
- }
- }
- enum v4l2_buf_type bufType;
- bufType = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
- ret = ioctl (mCameraHandle, VIDIOC_STREAMON, &bufType);
-
- ALOGV("[%s %d] VIDIOC_STREAMON:%x", __FUNCTION__, __LINE__, ret);
- return ret;
- }
-
- int vdin_screen_source::stop_v4l2_device()
- {
- int ret;
- enum v4l2_buf_type bufType = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
- ret = ioctl (mCameraHandle, VIDIOC_STREAMOFF, &bufType);
- if (ret < 0) {
- ALOGE("StopStreaming: Unable to stop capture: %s", strerror(errno));
- }
- for (int i = 0; i < mBufferCount; i++) {
- if (munmap(mVideoInfo->mem[i], mVideoInfo->buf.length) < 0) {
- ALOGE("Unmap failed");
- }
- }
- return ret;
- }
-
- int vdin_screen_source::start()
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- int ret;
- if (mOpen == true) {
- ALOGI("already open");
- return NO_ERROR;
- }
-
- ret = start_v4l2_device();
- if (ret != NO_ERROR) {
- ALOGE("Start v4l2 device failed:%d", ret);
- return ret;
- }
- if (mFrameType & NATIVE_WINDOW_DATA) {
- ret = init_native_window();
- if (ret != NO_ERROR) {
- ALOGE("Init Native Window Failed:%d", ret);
- return ret;
- }
- }
- if (mFrameType & NATIVE_WINDOW_DATA || mFrameType & CALL_BACK_DATA) {
- ALOGD("Create Work Thread");
- mWorkThread = new WorkThread(this);
- }
- if (mSetStateCB != NULL) {
- mSetStateCB(START);
- }
- mState = START;
- mOpen = true;
- ALOGV("%s %d ret:%d", __FUNCTION__, __LINE__, ret);
- return NO_ERROR;
- }
-
- int vdin_screen_source::pause()
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- mState = PAUSE;
- if (mSetStateCB != NULL) {
- mSetStateCB(PAUSE);
- }
- return NO_ERROR;
- }
- int vdin_screen_source::stop()
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- int ret;
- mState = STOPING;
-
- if (mWorkThread != NULL) {
- mWorkThread->requestExitAndWait();
- mWorkThread.clear();
- }
-
- mBufferCount = 0;
- mState = STOP;
- if (mSetStateCB != NULL) {
- mSetStateCB(STOP);
- }
- mOpen = false;
- return ret;
- }
-
- int vdin_screen_source::set_state_callback(olStateCB callback)
- {
- if (!callback) {
- ALOGE("NULL state callback pointer");
- return BAD_VALUE;
- }
- mSetStateCB = callback;
- return NO_ERROR;
- }
-
- int vdin_screen_source::set_preview_window(ANativeWindow *window)
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- if (mOpen == true) {
- return NO_ERROR;
- }
- //can work without a valid window object ?
- if (window == NULL) {
- ALOGD("NULL window object passed to ScreenSource");
- if (mWorkThread != NULL) {
- mWorkThread->requestExitAndWait();
- mWorkThread.clear();
- }
- mFrameType &= ~NATIVE_WINDOW_DATA;
- return NO_ERROR;
- }
- mFrameType |= NATIVE_WINDOW_DATA;
- mANativeWindow = window;
- return NO_ERROR;
- }
-
- int vdin_screen_source::set_data_callback(app_data_callback callback, void *user)
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- if (callback == NULL) {
- ALOGE("NULL data callback pointer");
- return BAD_VALUE;
- }
- mDataCB = callback;
- mUser = user;
- mFrameType |= CALL_BACK_DATA;
- return NO_ERROR;
- }
-
- int vdin_screen_source::get_format()
- {
- return mPixelFormat;
- }
-
- int vdin_screen_source::set_format(int width, int height, int color_format)
- {
- ALOGV("[%s %d]", __FUNCTION__, __LINE__);
- if (mOpen == true) {
- return NO_ERROR;
- }
- int ret;
- mVideoInfo->width = ALIGN(width);
- mVideoInfo->height = height;
- mVideoInfo->framesizeIn = (mVideoInfo->width * mVideoInfo->height << 3); //note color format
- mVideoInfo->formatIn = color_format;
-
- mVideoInfo->format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- mVideoInfo->format.fmt.pix.width = ALIGN(width);
- mVideoInfo->format.fmt.pix.height = height;
- mVideoInfo->format.fmt.pix.pixelformat = color_format;
- mPixelFormat = color_format;
- mNativeWindowPixelFormat = getNativeWindowFormat(color_format);
- mFrameWidth = ALIGN(width);
- mFrameHeight = height;
- mBufferSize = getBufSize(color_format, mFrameWidth, mFrameHeight);
- ALOGD("mFrameWidth:%d,mFrameHeight:%d", mFrameWidth, mFrameHeight);
- ALOGD("mPixelFormat:%x,mNativeWindowPixelFormat:%x,mBufferSize:%d", mPixelFormat, mNativeWindowPixelFormat, mBufferSize);
- ret = ioctl(mCameraHandle, VIDIOC_S_FMT, &mVideoInfo->format);
- if (ret < 0) {
- ALOGE("[%s %d]VIDIOC_S_FMT %d", __FUNCTION__, __LINE__, ret);
- return ret;
- }
- return ret;
- }
-
- int vdin_screen_source::set_rotation(int degree)
- {
- ALOGV("[%s %d]", __FUNCTION__, __LINE__);
-
- int ret = 0;
- struct v4l2_control ctl;
-
- if (mCameraHandle < 0) {
- return -1;
- }
-
- if ((degree != 0) && (degree != 90) && (degree != 180) && (degree != 270)) {
- ALOGE("Set rotate value invalid: %d.", degree);
- return -1;
- }
-
- memset( &ctl, 0, sizeof(ctl));
- ctl.value = degree;
- ctl.id = V4L2_ROTATE_ID;
- ret = ioctl(mCameraHandle, VIDIOC_S_CTRL, &ctl);
-
- if (ret < 0) {
- ALOGE("Set rotate value fail: %s. ret=%d", strerror(errno), ret);
- }
- return ret ;
- }
-
- int vdin_screen_source::set_crop(int x, int y, int width, int height)
- {
- ALOGV("[%s %d]", __FUNCTION__, __LINE__);
- if (NULL == mANativeWindow.get())
- return BAD_VALUE;
-
- int err = NO_ERROR;
- android_native_rect_t crop = { x, y, x + width - 1, y + height - 1 };
- err = native_window_set_crop(mANativeWindow.get(), &crop);
- if (err != 0) {
- ALOGW("Failed to set crop!");
- return err;
- }
- return NO_ERROR;
- }
-
- int vdin_screen_source::set_frame_rate(int frameRate)
- {
- ALOGV("[%s %d]", __FUNCTION__, __LINE__);
- int ret = 0;
- struct v4l2_control ctl;
-
- if (mCameraHandle < 0) {
- return -1;
- }
-
- struct v4l2_streamparm sparm;
- memset(&sparm, 0, sizeof( sparm ));
- sparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;//stream_flag;
- sparm.parm.output.timeperframe.denominator = frameRate;
- sparm.parm.output.timeperframe.numerator = 1;
-
- ret = ioctl(mCameraHandle, VIDIOC_S_PARM, &sparm);
- if (ret < 0) {
- ALOGE("Set frame rate fail: %s. ret=%d", strerror(errno), ret);
- }
- return ret ;
- }
-
- int vdin_screen_source::set_amlvideo2_crop(int x, int y, int width, int height)
- {
- ALOGV("[%s %d]", __FUNCTION__, __LINE__);
- int ret = 0;
-
- struct v4l2_crop crop;
- memset(&crop, 0, sizeof(struct v4l2_crop));
-
- crop.type = V4L2_BUF_TYPE_VIDEO_OVERLAY;
- crop.c.left = x;
- crop.c.top = y;
- crop.c.width = width;
- crop.c.height = height;
- ret = ioctl(mCameraHandle, VIDIOC_S_CROP, &crop);
- if (ret) {
- ALOGE("Set frame rate fail: %s. ret=%d", strerror(errno), ret);
- }
-
- return ret ;
- }
-
- int vdin_screen_source::set_source_type(int sourceType)
- {
- ALOGV("[%s %d]", __FUNCTION__, __LINE__);
- int ret = 0;
-
- ret = ioctl(mCameraHandle, VIDIOC_S_INPUT, &sourceType);
- if (ret < 0) {
- ALOGE("Set source type fail: %s. ret:%d", strerror(errno), ret);
- }
- return ret;
- }
-
- int vdin_screen_source::get_source_type()
- {
- ALOGV("[%s %d]", __FUNCTION__, __LINE__);
- int ret = -1;
- int sourceType;
-
- ret = ioctl(mCameraHandle, VIDIOC_G_INPUT, &sourceType);
- if (ret < 0) {
- ALOGE("Set source type fail: %s. ret:%d", strerror(errno), ret);
- return ret;
- }
- return sourceType;
- }
-
- int vdin_screen_source::aquire_buffer(aml_screen_buffer_info_t *buff_info)
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- int ret = -1;
- mVideoInfo->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- mVideoInfo->buf.memory = V4L2_MEMORY_MMAP;
-
- ret = ioctl(mCameraHandle, VIDIOC_DQBUF, &mVideoInfo->buf);
- if (ret < 0) {
- if (EAGAIN == errno) {
- ret = -EAGAIN;
- } else {
- ALOGE("[%s %d]aquire_buffer %d", __FUNCTION__, __LINE__, ret);
- }
- buff_info->buffer_mem = 0;
- buff_info->buffer_canvas = 0;
- return ret;
- }
- buff_info->buffer_mem = mVideoInfo->mem[mVideoInfo->buf.index];
- buff_info->buffer_canvas = mVideoInfo->canvas[mVideoInfo->buf.index];
- buff_info->tv_sec = mVideoInfo->buf.timestamp.tv_sec;
- buff_info->tv_usec = mVideoInfo->buf.timestamp.tv_usec;
- return ret;
- }
-
- /* int vdin_screen_source::inc_buffer_refcount(int *ptr){
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- int ret = -1;
- int index;
- index = mBufs.valueFor((unsigned int)ptr);
- mVideoInfo->refcount[index] += 1;
- return true;
- } */
-
- int vdin_screen_source::release_buffer(long *ptr)
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- int ret = -1;
- int currentIndex;
- v4l2_buffer hbuf_query;
-
- Mutex::Autolock autoLock(mLock);
-
- currentIndex = mBufs.valueFor(ptr);
- if (mVideoInfo->refcount[currentIndex] > 0) {
- mVideoInfo->refcount[currentIndex] -= 1;
- } else {
- ALOGE("return buffer when refcount already zero");
- return 0;
- }
- if (mVideoInfo->refcount[currentIndex] == 0) {
- memset(&hbuf_query, 0, sizeof(v4l2_buffer));
- hbuf_query.index = currentIndex;
- hbuf_query.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- hbuf_query.memory = V4L2_MEMORY_MMAP;
- ALOGV("return buffer :%d", currentIndex);
- ret = ioctl(mCameraHandle, VIDIOC_QBUF, &hbuf_query);
- if (ret != 0) {
- ALOGE("Return Buffer :%d failed", currentIndex);
- }
- }
- return 0;
- }
-
- int vdin_screen_source::init_native_window()
- {
- ALOGV("%s %d", __FUNCTION__, __LINE__);
- int err = NO_ERROR;
-
- if (NULL == mANativeWindow.get()) {
- return BAD_VALUE;
- }
-
- // Set gralloc usage bits for window.
- err = native_window_set_usage(mANativeWindow.get(), SCREENSOURCE_GRALLOC_USAGE);
- if (err != 0) {
- ALOGE("native_window_set_usage failed: %s\n", strerror(-err));
- if (ENODEV == err ) {
- ALOGE("Preview surface abandoned!");
- mANativeWindow = NULL;
- }
- return err;
- }
-
- ALOGD("Number of buffers set to ANativeWindow %d", mBufferCount);
- ///Set the number of buffers needed for camera preview
- err = native_window_set_buffer_count(mANativeWindow.get(), mBufferCount);
- if (err != 0) {
- ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), -err);
- if (ENODEV == err) {
- ALOGE("Preview surface abandoned!");
- mANativeWindow = NULL;
- }
- return err;
- }
-
- ALOGD("native_window_set_buffers_geometry format:0x%x", mNativeWindowPixelFormat);
- // Set window geometry
- err = native_window_set_buffers_geometry(
- mANativeWindow.get(),
- mFrameWidth,
- mFrameHeight,
- mNativeWindowPixelFormat);
-
- if (err != 0) {
- ALOGE("native_window_set_buffers_geometry failed: %s", strerror(-err));
- if ( ENODEV == err ) {
- ALOGE("Surface abandoned!");
- mANativeWindow = NULL;
- }
- return err;
- }
- err = native_window_set_scaling_mode(mANativeWindow.get(), NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
- if (err != 0) {
- ALOGW("Failed to set scaling mode: %d", err);
- return err;
- }
- return NO_ERROR;
- }
-
- int vdin_screen_source::workThread()
- {
- bool buff_keep = false;
- int index;
- aml_screen_buffer_info_t buff_info;
- int ret;
- long *src = NULL;
- unsigned char *dest = NULL;
- uint8_t *handle = NULL;
- ANativeWindowBuffer *buf;
- if (mState == START) {
- usleep(5000);
- ret = aquire_buffer(&buff_info);
- if (ret != 0 || (buff_info.buffer_mem == 0)) {
- ALOGV("Get V4l2 buffer failed");
- return ret;
- }
- src = (long *)buff_info.buffer_mem;
- index = mBufs.valueFor(src);
- if (mFrameType & NATIVE_WINDOW_DATA) {
- mVideoInfo->refcount[index] += 1;
- if (mANativeWindow.get() == NULL) {
- ALOGE("Null window");
- return BAD_VALUE;
- }
- ret = mANativeWindow->dequeueBuffer_DEPRECATED(mANativeWindow.get(), &buf);
- if (ret != 0) {
- ALOGE("dequeue buffer failed :%s (%d)", strerror(-ret), -ret);
- return BAD_VALUE;
- }
- mANativeWindow->lockBuffer_DEPRECATED(mANativeWindow.get(), buf);
- sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false));
- graphicBuffer->lock(SCREENSOURCE_GRALLOC_USAGE, (void **)&dest);
- if (dest == NULL) {
- ALOGE("Invalid Gralloc Handle");
- return BAD_VALUE;
- }
- memcpy(dest, src, mBufferSize);
- graphicBuffer->unlock();
- mANativeWindow->queueBuffer_DEPRECATED(mANativeWindow.get(), buf);
- graphicBuffer.clear();
- ALOGV("queue one buffer to native window");
- release_buffer(src);
- }
- if (mFrameType & CALL_BACK_DATA && mDataCB != NULL && mState == START) {
- mVideoInfo->refcount[index] += 1;
- mDataCB(mUser, &buff_info);
- }
- }
- return NO_ERROR;
- }
-
-}
diff --git a/screen_source/v4l2_vdin.h b/screen_source/v4l2_vdin.h
deleted file mode 100644
index 0277884..0000000
--- a/screen_source/v4l2_vdin.h
+++ b/dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/select.h>
-#include <linux/videodev2.h>
-#include <sys/time.h>
-
-#include <utils/KeyedVector.h>
-#include <cutils/properties.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <utils/threads.h>
-#include <android/native_window.h>
-#include <gralloc_priv.h>
-
-#include <hardware/aml_screen.h>
-
-namespace android {
-
-#define NB_BUFFER 6
-
- struct VideoInfo {
- struct v4l2_capability cap;
- struct v4l2_format format;
- struct v4l2_buffer buf;
- struct v4l2_requestbuffers rb;
- long *mem[NB_BUFFER];
- unsigned canvas[NB_BUFFER];
- unsigned refcount[NB_BUFFER];
- bool isStreaming;
- int width;
- int height;
- int formatIn;
- int framesizeIn;
- };
- enum State {
- START,
- PAUSE,
- STOPING,
- STOP,
- };
-
- enum FrameType {
- NATIVE_WINDOW_DATA = 0x1,
- CALL_BACK_DATA = 0x2,
- };
-
- typedef void (*olStateCB)(int state);
-
- typedef void (*app_data_callback)(void *user, aml_screen_buffer_info_t *buff_info);
-
-#define SCREENSOURCE_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \
- GRALLOC_USAGE_HW_RENDER | \
- GRALLOC_USAGE_SW_READ_RARELY | \
- GRALLOC_USAGE_SW_WRITE_NEVER
-
- class vdin_screen_source {
- public:
- vdin_screen_source();
- ~vdin_screen_source();
- int init();
- int start();
- int stop();
- int pause();
- int get_format();
- int set_format(int width = 640, int height = 480, int color_format = V4L2_PIX_FMT_NV21);
- int set_rotation(int degree);
- int set_crop(int x, int y, int width, int height);
- int set_amlvideo2_crop(int x, int y, int width, int height);
- int aquire_buffer(aml_screen_buffer_info_t *buff_info);
- // int inc_buffer_refcount(int* ptr);
- int release_buffer(long *ptr);
- int set_state_callback(olStateCB callback);
- int set_data_callback(app_data_callback callback, void *user);
- int set_preview_window(ANativeWindow *window);
- int set_frame_rate(int frameRate);
- int set_source_type(int sourceType);
- int get_source_type();
- int start_v4l2_device();
- int stop_v4l2_device();
- private:
- int init_native_window();
- int workThread();
- private:
- class WorkThread : public Thread {
- vdin_screen_source *mSource;
- public:
- WorkThread(vdin_screen_source *source) :
- Thread(false), mSource(source) { }
- virtual void onFirstRef()
- {
- run("vdin screen source work thread", PRIORITY_URGENT_DISPLAY);
- }
- virtual bool threadLoop()
- {
- mSource->workThread();
- // loop until we need to quit
- return true;
- }
- };
- private:
- int mCurrentIndex;
- KeyedVector<long *, long> mBufs;
- int mBufferCount;
- int mFrameWidth;
- int mFrameHeight;
- int mBufferSize;
- volatile int mState;
- olStateCB mSetStateCB;
- int mPixelFormat;
- int mNativeWindowPixelFormat;
- sp<ANativeWindow> mANativeWindow;
- sp<WorkThread> mWorkThread;
- mutable Mutex mLock;
- int mCameraHandle;
- struct VideoInfo *mVideoInfo;
- int mFrameType;
- app_data_callback mDataCB;
- bool mOpen;
- void *mUser;
- };
-
-}
diff --git a/tv_callback.h b/tv_callback.h
new file mode 100644
index 0000000..ef97442
--- a/dev/null
+++ b/tv_callback.h
@@ -0,0 +1,18 @@
+#ifndef TV_CALLBACK
+#define TV_CALLBACK
+#include "tvapi/android/tv/CTv.h"
+class TvCallback : public CTv::TvIObserver
+{
+ public:
+ TvCallback(void* data)
+ {
+ mPri = data;
+ }
+ ~TvCallback()
+ {
+ }
+ void onTvEvent (int32_t msgType, const Parcel &p);
+ private:
+ void* mPri;
+};
+#endif
diff --git a/tv_input.cpp b/tv_input.cpp
index 44c9500..9eb4781 100644
--- a/tv_input.cpp
+++ b/tv_input.cpp
@@ -22,35 +22,38 @@
#include <cutils/native_handle.h>
#include <hardware/tv_input.h>
-#include <tv/CTv.h>
-#include <tvin/CTvin.h>
-#include <tvserver/TvService.h>
-#include <screen_source/v4l2_vdin.h>
+#include "tvapi/android/tv/CTv.h"
+#include "tv_callback.h"
+#include "tvapi/android/include/tvcmd.h"
#include <ui/GraphicBufferMapper.h>
#include <ui/GraphicBuffer.h>
/*****************************************************************************/
#define LOGD(...) \
{ \
-__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__); }
+__android_log_print(ANDROID_LOG_DEBUG, "tv_input", __VA_ARGS__); }
#ifndef container_of
#define container_of(ptr, type, member) ({ \
- const typeof(((type *) 0)->member) *__mptr = (ptr); \
- (type *) ((char *) __mptr - (char *)(&((type *)0)->member)); })
+ const typeof(((type *) 0)->member) *__mptr = (ptr); \
+ (type *) ((char *) __mptr - (char *)(&((type *)0)->member)); })
#endif
+struct sideband_handle_t {
+ native_handle_t nativeHandle;
+ int identflag;
+ int usage;
+};
+
typedef struct tv_input_private {
tv_input_device_t device;
-
- // Callback related data
const tv_input_callback_ops_t *callback;
void *callback_data;
- //TvService* pTvService;
- CTv *pTv;
- vdin_screen_source *pScreen;
+ CTv *mpTv;
+ TvCallback *tvcallback;
} tv_input_private_t;
+
static int notify_ATV_device_available(tv_input_private_t *priv)
{
tv_input_event_t event;
@@ -58,6 +61,7 @@ static int notify_ATV_device_available(tv_input_private_t *priv)
event.device_info.type = TV_INPUT_TYPE_TUNER;
event.type = TV_INPUT_EVENT_DEVICE_AVAILABLE;
event.device_info.audio_type = AUDIO_DEVICE_NONE;
+ event.device_info.audio_address = NULL;
priv->callback->notify(&priv->device, &event, priv->callback_data);
return 0;
}
@@ -69,6 +73,7 @@ static int notify_ATV_stream_configurations_change(tv_input_private_t *priv)
event.device_info.type = TV_INPUT_TYPE_TUNER;
event.type = TV_INPUT_EVENT_STREAM_CONFIGURATIONS_CHANGED;
event.device_info.audio_type = AUDIO_DEVICE_NONE;
+ event.device_info.audio_address = NULL;
priv->callback->notify(&priv->device, &event, priv->callback_data);
return 0;
}
@@ -80,6 +85,7 @@ static int notify_DTV_device_available(tv_input_private_t *priv)
event.device_info.type = TV_INPUT_TYPE_TUNER;
event.type = TV_INPUT_EVENT_DEVICE_AVAILABLE;
event.device_info.audio_type = AUDIO_DEVICE_NONE;
+ event.device_info.audio_address = NULL;
priv->callback->notify(&priv->device, &event, priv->callback_data);
return 0;
}
@@ -91,56 +97,130 @@ static int notify_DTV_stream_configurations_change(tv_input_private_t *priv)
event.device_info.type = TV_INPUT_TYPE_TUNER;
event.type = TV_INPUT_EVENT_STREAM_CONFIGURATIONS_CHANGED;
event.device_info.audio_type = AUDIO_DEVICE_NONE;
+ event.device_info.audio_address = NULL;
priv->callback->notify(&priv->device, &event, priv->callback_data);
return 0;
}
-static int notify_AV_device_available(tv_input_private_t *priv)
+void TvIputHal_ChannelConl(tv_input_private_t *priv, int ops_type, int device_id)
+{
+ if (priv->mpTv) {
+ if (ops_type) {
+ LOGD ( "%s\, OpenSourceSwitchInput id = %d\n", __FUNCTION__, device_id );
+ priv->mpTv->StartTv();
+ priv->mpTv->SwitchSourceInput((tv_source_input_t) device_id);
+ } else {
+ if (priv->mpTv->GetCurrentSourceInput() == device_id) {
+ LOGD ( "%s\, StopSourceSwitchInput id = %d\n", __FUNCTION__, device_id );
+ priv->mpTv->StopTv();
+ }
+ }
+ }
+}
+
+static int notify_AV_device_available(tv_input_private_t *priv, tv_source_input_t source_input, int type)
{
tv_input_event_t event;
- event.device_info.device_id = SOURCE_AV1;
+ event.device_info.device_id = source_input;
event.device_info.type = TV_INPUT_TYPE_COMPONENT;
- event.type = TV_INPUT_EVENT_DEVICE_AVAILABLE;
+ event.type = type;
event.device_info.audio_type = AUDIO_DEVICE_NONE;
+ event.device_info.audio_address = NULL;
priv->callback->notify(&priv->device, &event, priv->callback_data);
return 0;
}
-static int notify_AV_stream_configurations_change(tv_input_private_t *priv)
+static int notify_AV_stream_configurations_change(tv_input_private_t *priv, tv_source_input_t source_input)
{
tv_input_event_t event;
- event.device_info.device_id = SOURCE_AV1;
+ event.device_info.device_id = source_input;
event.device_info.type = TV_INPUT_TYPE_COMPONENT;
event.type = TV_INPUT_EVENT_STREAM_CONFIGURATIONS_CHANGED;
event.device_info.audio_type = AUDIO_DEVICE_NONE;
+ event.device_info.audio_address = NULL;
priv->callback->notify(&priv->device, &event, priv->callback_data);
return 0;
}
-static int notify_HDMI_device_available(tv_input_private_t *priv, int dev_id, uint32_t port_id)
+static int notify_HDMI_device_available(tv_input_private_t *priv, tv_source_input_t source_input, uint32_t port_id, int type)
{
tv_input_event_t event;
- event.device_info.device_id = dev_id;
+ event.device_info.device_id = source_input;
event.device_info.type = TV_INPUT_TYPE_HDMI;
- event.type = TV_INPUT_EVENT_DEVICE_AVAILABLE;
+ event.type = type;
event.device_info.hdmi.port_id = port_id;
event.device_info.audio_type = AUDIO_DEVICE_NONE;
+ event.device_info.audio_address = NULL;
priv->callback->notify(&priv->device, &event, priv->callback_data);
return 0;
}
-static int notify_HDMI_stream_configurations_change(tv_input_private_t *priv, int dev_id, uint32_t port_id)
+static int notify_HDMI_stream_configurations_change(tv_input_private_t *priv, tv_source_input_t source_input, uint32_t port_id)
{
tv_input_event_t event;
- event.device_info.device_id = dev_id;
+ event.device_info.device_id = source_input;
event.device_info.type = TV_INPUT_TYPE_HDMI;
event.type = TV_INPUT_EVENT_STREAM_CONFIGURATIONS_CHANGED;
event.device_info.hdmi.port_id = port_id;
event.device_info.audio_type = AUDIO_DEVICE_NONE;
+ event.device_info.audio_address = NULL;
priv->callback->notify(&priv->device, &event, priv->callback_data);
return 0;
}
+
+void TvCallback::onTvEvent (int32_t msgType, const Parcel &p)
+{
+ tv_input_private_t *priv = (tv_input_private_t *)(mPri);
+ switch (msgType) {
+ case SOURCE_CONNECT_CALLBACK: {
+ int source = p.readInt32();
+ int connectState = p.readInt32();
+ LOGD("TvCallback::onTvEvent source = %d, status = %d", source, connectState)
+ if ( connectState == 1) {
+ switch (source) {
+ case SOURCE_HDMI1:
+ case SOURCE_HDMI2:
+ case SOURCE_HDMI3: {
+ notify_HDMI_device_available(priv, (tv_source_input_t)source, 1, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_HDMI_stream_configurations_change(priv, (tv_source_input_t)source, 1);
+ break;
+ }
+ case SOURCE_AV1:
+ case SOURCE_AV2: {
+ notify_AV_device_available(priv, (tv_source_input_t)source, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_AV_stream_configurations_change(priv, (tv_source_input_t)source);
+ break;
+ }
+ default:
+ break;
+ }
+ } else {//out
+ switch (source) {
+ case SOURCE_HDMI1:
+ case SOURCE_HDMI2:
+ case SOURCE_HDMI3: {
+ notify_HDMI_device_available(priv, (tv_source_input_t)source, 1, TV_INPUT_EVENT_DEVICE_UNAVAILABLE);
+ break;
+ }
+ case SOURCE_AV1:
+ case SOURCE_AV2: {
+ notify_AV_device_available(priv, (tv_source_input_t)source, TV_INPUT_EVENT_DEVICE_UNAVAILABLE);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ //tv_input_event_t event;
+
+ break;
+ }
+ default:
+ break;
+ }
+}
+
#define NORMAL_STREAM_ID 1
#define FRAME_CAPTURE_STREAM_ID 2
static tv_stream_config_t mconfig[2];
@@ -172,6 +252,7 @@ static int get_stream_configs(int dev_id, int *num_configurations, const tv_stre
*configs = mconfig;
break;
case SOURCE_AV1:
+ case SOURCE_AV2:
mconfig[0].stream_id = NORMAL_STREAM_ID;
mconfig[0].type = TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE ;
mconfig[0].max_video_width = 1920;
@@ -227,13 +308,18 @@ static int get_stream_configs(int dev_id, int *num_configurations, const tv_stre
static int get_tv_stream(tv_stream_t *stream)
{
+ static struct sideband_handle_t *tvstream = NULL;
if (stream->stream_id == NORMAL_STREAM_ID) {
- native_handle *h = native_handle_create(0, 0);
- if (!h) {
- return -EINVAL;
+ if ( !tvstream ) {
+ tvstream = (struct sideband_handle_t *)native_handle_create(0, 2);
+ if ( !tvstream ) {
+ return -EINVAL;
+ }
}
+ tvstream->identflag = 0xabcdcdef; //magic word
+ tvstream->usage = GRALLOC_USAGE_AML_VIDEO_OVERLAY;
stream->type = TV_STREAM_TYPE_INDEPENDENT_VIDEO_SOURCE;
- stream->sideband_stream_source_handle = h;
+ stream->sideband_stream_source_handle = (native_handle_t *)tvstream;
} else if (stream->stream_id == NORMAL_STREAM_ID) {
stream->type = TV_STREAM_TYPE_BUFFER_PRODUCER;
}
@@ -278,7 +364,6 @@ static int tv_input_initialize(struct tv_input_device *dev,
if (priv->callback != NULL) {
return -EEXIST;
}
-
priv->callback = callback;
priv->callback_data = data;
/* ATV_DEVICE_AVAILABLE */
@@ -287,19 +372,61 @@ static int tv_input_initialize(struct tv_input_device *dev,
/* DTV_DEVICE_AVAILABLE */
notify_DTV_device_available(priv);
notify_DTV_stream_configurations_change(priv);
- /* AV_DEVICE_AVAILABLE */
- notify_AV_device_available(priv);
- notify_AV_stream_configurations_change(priv);
- /* HDMI1_DEVICE_AVAILABLE */
- notify_HDMI_device_available(priv, SOURCE_HDMI1, 1);
- notify_HDMI_stream_configurations_change(priv, SOURCE_HDMI1, 1);
- /* HDMI2_DEVICE_AVAILABLE */
- notify_HDMI_device_available(priv, SOURCE_HDMI2, 1);
- notify_HDMI_stream_configurations_change(priv, SOURCE_HDMI2, 1);
- /* HDMI3_DEVICE_AVAILABLE */
- notify_HDMI_device_available(priv, SOURCE_HDMI3, 1);
- notify_HDMI_stream_configurations_change(priv, SOURCE_HDMI3, 1);
- //
+
+ if (priv->mpTv->GetHdmiAvHotplugDetectOnoff()) {
+ /* AV1_DEVICE_AVAILABLE */
+ int status = priv->mpTv->GetSourceConnectStatus(SOURCE_AV1);
+ if (status == 1) { //IN
+ notify_AV_device_available(priv, SOURCE_AV1, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_AV_stream_configurations_change(priv, SOURCE_AV1);
+ }
+
+ /* AV2_DEVICE_AVAILABLE */
+ status = priv->mpTv->GetSourceConnectStatus(SOURCE_AV2);
+ if (status == 1) { //IN
+ notify_AV_device_available(priv, SOURCE_AV2, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_AV_stream_configurations_change(priv, SOURCE_AV2);
+ }
+
+ /* HDMI1_DEVICE_AVAILABLE */
+ status = priv->mpTv->GetSourceConnectStatus(SOURCE_HDMI1);
+ if (status == 1) { //IN
+ notify_HDMI_device_available(priv, SOURCE_HDMI1, 1, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_HDMI_stream_configurations_change(priv, SOURCE_HDMI1, 0);
+ }
+
+ /* HDMI2_DEVICE_AVAILABLE */
+ status = priv->mpTv->GetSourceConnectStatus(SOURCE_HDMI2);
+ if (status == 1) { //IN
+ notify_HDMI_device_available(priv, SOURCE_HDMI2, 1, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_HDMI_stream_configurations_change(priv, SOURCE_HDMI2, 1);
+ }
+
+ /* HDMI3_DEVICE_AVAILABLE */
+ status = priv->mpTv->GetSourceConnectStatus(SOURCE_HDMI3);
+ if (status == 1) { //IN
+ notify_HDMI_device_available(priv, SOURCE_HDMI3, 2, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_HDMI_stream_configurations_change(priv, SOURCE_HDMI3, 2);
+ }
+
+ priv->mpTv->setTvObserver(priv->tvcallback);
+ } else {
+ /* AV1_DEVICE_AVAILABLE */
+ notify_AV_device_available(priv, SOURCE_AV1, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_AV_stream_configurations_change(priv, SOURCE_AV1);
+ /* AV2_DEVICE_AVAILABLE */
+ notify_AV_device_available(priv, SOURCE_AV2, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_AV_stream_configurations_change(priv, SOURCE_AV2);
+ /* HDMI1_DEVICE_AVAILABLE */
+ notify_HDMI_device_available(priv, SOURCE_HDMI1, 1, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_HDMI_stream_configurations_change(priv, SOURCE_HDMI1, 0);
+ /* HDMI2_DEVICE_AVAILABLE */
+ notify_HDMI_device_available(priv, SOURCE_HDMI2, 1, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_HDMI_stream_configurations_change(priv, SOURCE_HDMI2, 1);
+ /* HDMI3_DEVICE_AVAILABLE */
+ notify_HDMI_device_available(priv, SOURCE_HDMI3, 2, TV_INPUT_EVENT_DEVICE_AVAILABLE);
+ notify_HDMI_stream_configurations_change(priv, SOURCE_HDMI3, 2);
+ }
return 0;
}
@@ -322,13 +449,9 @@ static int tv_input_open_stream(struct tv_input_device *dev, int device_id,
return -EINVAL;
}
if (stream->stream_id == NORMAL_STREAM_ID) {
- LOGD ( "%s, SetSourceSwitchInput id = %d\n", __FUNCTION__, device_id );
- priv->pTv->StartTvLock();
- priv->pTv->SetSourceSwitchInput((tv_source_input_t) device_id);
+ TvIputHal_ChannelConl(priv, 1, device_id);
return 0;
} else if (stream->stream_id == FRAME_CAPTURE_STREAM_ID) {
- priv->pScreen->set_format(1920, 1080, V4L2_PIX_FMT_NV21);
- priv->pScreen->start_v4l2_device();
return 0;
}
}
@@ -340,11 +463,9 @@ static int tv_input_close_stream(struct tv_input_device *dev, int device_id,
{
tv_input_private_t *priv = (tv_input_private_t *)dev;
if (stream_id == NORMAL_STREAM_ID) {
- LOGD ( "%s, SetSourceSwitchInput id = %d\n", __FUNCTION__, device_id );
- //priv->pTv->StopTvLock();
+ TvIputHal_ChannelConl(priv, 0, device_id);
return 0;
} else if (stream_id == FRAME_CAPTURE_STREAM_ID) {
- priv->pScreen->stop_v4l2_device();
return 0;
}
return -EINVAL;
@@ -353,35 +474,7 @@ static int tv_input_close_stream(struct tv_input_device *dev, int device_id,
static int tv_input_request_capture(
struct tv_input_device *dev, int device_id, int stream_id, buffer_handle_t buffer, uint32_t seq)
{
- tv_input_private_t *priv = (tv_input_private_t *)dev;
- int index;
- aml_screen_buffer_info_t buff_info;
- int mFrameWidth , mFrameHeight ;
- int ret;
- long *src = NULL;
- unsigned char *dest = NULL;
- ANativeWindowBuffer *buf;
- ret = priv->pScreen->aquire_buffer(&buff_info);
- if (ret != 0 || (buff_info.buffer_mem == 0)) {
- LOGD("Get V4l2 buffer failed");
- return -EWOULDBLOCK;
- }
- src = (long *)buff_info.buffer_mem;
-
- buf = container_of(&buffer, ANativeWindowBuffer, handle);
-
- sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false));
- graphicBuffer->lock(SCREENSOURCE_GRALLOC_USAGE, (void **)&dest);
- if (dest == NULL) {
- LOGD("Invalid Gralloc Handle");
- return -EWOULDBLOCK;
- }
- memcpy(dest, src, mFrameWidth * mFrameHeight * 3 / 2);
- graphicBuffer->unlock();
- graphicBuffer.clear();
- LOGD("queue one buffer to native window");
- priv->pScreen->release_buffer(src);
- return 0;
+ return -EINVAL;
}
static int tv_input_cancel_capture(struct tv_input_device *, int, int, uint32_t)
@@ -394,10 +487,10 @@ static int tv_input_cancel_capture(struct tv_input_device *, int, int, uint32_t)
static int tv_input_device_close(struct hw_device_t *dev)
{
tv_input_private_t *priv = (tv_input_private_t *)dev;
- if (priv->pTv != NULL) {
- delete priv->pTv;
- }
if (priv) {
+ if (priv->mpTv) {
+ delete priv->mpTv;
+ }
free(priv);
}
return 0;
@@ -414,14 +507,8 @@ static int tv_input_device_open(const struct hw_module_t *module,
/* initialize our state here */
memset(dev, 0, sizeof(*dev));
- /*intialize tv*/
- dev->pTv = new CTv();
- TvService::instantiate(dev->pTv);
- dev->pTv->OpenTv();
- dev->pScreen = new vdin_screen_source();
- if (dev->pScreen->init() != 0 ) {
- LOGD("init screen source not ok!");
- }
+ dev->mpTv = new CTv();
+ dev->tvcallback = new TvCallback(dev);
/* initialize the procs */
dev->device.common.tag = HARDWARE_DEVICE_TAG;
dev->device.common.version = TV_INPUT_DEVICE_API_VERSION_0_1;
diff --git a/tvapi/android/Android.mk b/tvapi/android/Android.mk
index 7ae3545..5053e7d 100644
--- a/tvapi/android/Android.mk
+++ b/tvapi/android/Android.mk
@@ -1 +1 @@
-include $(call all-subdir-makefiles)
+include $(call all-subdir-makefiles)
diff --git a/tvapi/android/include/ITv.h b/tvapi/android/include/ITv.h
index 39cd654..9b80586 100644
--- a/tvapi/android/include/ITv.h
+++ b/tvapi/android/include/ITv.h
@@ -1,49 +1,49 @@
-#ifndef ANDROID_AMLOGIC_ITV_H
-#define ANDROID_AMLOGIC_ITV_H
-
-#include <utils/RefBase.h>
-#include <binder/IInterface.h>
-#include <binder/Parcel.h>
-#include <binder/IMemory.h>
-#include <utils/String8.h>
-#include <include/Tv.h>
-
-using namespace android;
-
-class ITvClient;
-
-class ITv: public IInterface {
-public:
- DECLARE_META_INTERFACE(Tv);
-
- virtual void disconnect() = 0;
-
- // connect new client with existing tv remote
- virtual status_t connect(const sp<ITvClient> &client) = 0;
-
- // prevent other processes from using this ITv interface
- virtual status_t lock() = 0;
-
- // allow other processes to use this ITv interface
- virtual status_t unlock() = 0;
-
- virtual status_t processCmd(const Parcel &p, Parcel *r) = 0;
-
- //share mem for subtitle bmp
- virtual status_t createSubtitle(const sp<IMemory> &share_mem) = 0;
- //share mem for video/hdmi bmp
- virtual status_t createVideoFrame(const sp<IMemory> &share_mem) = 0;
-
-};
-
-// ----------------------------------------------------------------------------
-
-class BnTv: public BnInterface<ITv> {
-public:
- virtual status_t onTransact( uint32_t code,
- const Parcel &data,
- Parcel *reply,
- uint32_t flags = 0);
-};
-
-#endif
+#ifndef ANDROID_AMLOGIC_ITV_H
+#define ANDROID_AMLOGIC_ITV_H
+
+#include <utils/RefBase.h>
+#include <binder/IInterface.h>
+#include <binder/Parcel.h>
+#include <binder/IMemory.h>
+#include <utils/String8.h>
+#include <include/Tv.h>
+
+using namespace android;
+
+class ITvClient;
+
+class ITv: public IInterface {
+public:
+ DECLARE_META_INTERFACE(Tv);
+
+ virtual void disconnect() = 0;
+
+ // connect new client with existing tv remote
+ virtual status_t connect(const sp<ITvClient> &client) = 0;
+
+ // prevent other processes from using this ITv interface
+ virtual status_t lock() = 0;
+
+ // allow other processes to use this ITv interface
+ virtual status_t unlock() = 0;
+
+ virtual status_t processCmd(const Parcel &p, Parcel *r) = 0;
+
+ //share mem for subtitle bmp
+ virtual status_t createSubtitle(const sp<IMemory> &share_mem) = 0;
+ //share mem for video/hdmi bmp
+ virtual status_t createVideoFrame(const sp<IMemory> &share_mem, int iSourceMode, int iCapVideoLayerOnly) = 0;
+
+};
+
+// ----------------------------------------------------------------------------
+
+class BnTv: public BnInterface<ITv> {
+public:
+ virtual status_t onTransact( uint32_t code,
+ const Parcel &data,
+ Parcel *reply,
+ uint32_t flags = 0);
+};
+
+#endif
diff --git a/tvapi/android/include/ITvClient.h b/tvapi/android/include/ITvClient.h
index 7142f04..26794be 100644
--- a/tvapi/android/include/ITvClient.h
+++ b/tvapi/android/include/ITvClient.h
@@ -1,28 +1,28 @@
-#ifndef ANDROID_AMLOGIC_ITV_CLIENT_H
-#define ANDROID_AMLOGIC_ITV_CLIENT_H
-
-#include <utils/RefBase.h>
-#include <binder/IInterface.h>
-#include <binder/Parcel.h>
-#include <binder/IMemory.h>
-#include <utils/Timers.h>
-
-using namespace android;
-
-class ITvClient: public IInterface {
-public:
- DECLARE_META_INTERFACE(TvClient);
-
- virtual void notifyCallback(int32_t msgType, const Parcel &p) = 0;
-};
-
-
-class BnTvClient: public BnInterface<ITvClient> {
-public:
- virtual status_t onTransact(uint32_t code,
- const Parcel &data,
- Parcel *reply,
- uint32_t flags = 0);
-};
-
-#endif
+#ifndef ANDROID_AMLOGIC_ITV_CLIENT_H
+#define ANDROID_AMLOGIC_ITV_CLIENT_H
+
+#include <utils/RefBase.h>
+#include <binder/IInterface.h>
+#include <binder/Parcel.h>
+#include <binder/IMemory.h>
+#include <utils/Timers.h>
+
+using namespace android;
+
+class ITvClient: public IInterface {
+public:
+ DECLARE_META_INTERFACE(TvClient);
+
+ virtual void notifyCallback(int32_t msgType, const Parcel &p) = 0;
+};
+
+
+class BnTvClient: public BnInterface<ITvClient> {
+public:
+ virtual status_t onTransact(uint32_t code,
+ const Parcel &data,
+ Parcel *reply,
+ uint32_t flags = 0);
+};
+
+#endif
diff --git a/tvapi/android/include/ITvService.h b/tvapi/android/include/ITvService.h
index a4ce989..8803809 100644
--- a/tvapi/android/include/ITvService.h
+++ b/tvapi/android/include/ITvService.h
@@ -1,33 +1,33 @@
-#ifndef ANDROID_AMLOGIC_ITVSERVICE_H
-#define ANDROID_AMLOGIC_ITVSERVICE_H
-
-#include <utils/RefBase.h>
-#include <binder/IInterface.h>
-#include <binder/Parcel.h>
-#include <include/ITvClient.h>
-#include <include/ITv.h>
-
-using namespace android;
-
-
-class ITvService : public IInterface {
-public:
- enum {
- CONNECT = IBinder::FIRST_CALL_TRANSACTION,
- };
-
-public:
- DECLARE_META_INTERFACE(TvService);
-
- virtual sp<ITv> connect(const sp<ITvClient> &tvClient) = 0;
-};
-
-class BnTvService: public BnInterface<ITvService> {
-public:
- virtual status_t onTransact(uint32_t code,
- const Parcel &data,
- Parcel *reply,
- uint32_t flags = 0);
-};
-
-#endif
+#ifndef ANDROID_AMLOGIC_ITVSERVICE_H
+#define ANDROID_AMLOGIC_ITVSERVICE_H
+
+#include <utils/RefBase.h>
+#include <binder/IInterface.h>
+#include <binder/Parcel.h>
+#include <include/ITvClient.h>
+#include <include/ITv.h>
+
+using namespace android;
+
+
+class ITvService : public IInterface {
+public:
+ enum {
+ CONNECT = IBinder::FIRST_CALL_TRANSACTION,
+ };
+
+public:
+ DECLARE_META_INTERFACE(TvService);
+
+ virtual sp<ITv> connect(const sp<ITvClient> &tvClient) = 0;
+};
+
+class BnTvService: public BnInterface<ITvService> {
+public:
+ virtual status_t onTransact(uint32_t code,
+ const Parcel &data,
+ Parcel *reply,
+ uint32_t flags = 0);
+};
+
+#endif
diff --git a/tvapi/android/include/Tv.h b/tvapi/android/include/Tv.h
index f620b21..e39b5a1 100644
--- a/tvapi/android/include/Tv.h
+++ b/tvapi/android/include/Tv.h
@@ -1,79 +1,79 @@
-#ifndef ANDROID_AMLOGIC_TV_H
-#define ANDROID_AMLOGIC_TV_H
-
-#include <utils/Timers.h>
-#include <include/ITvClient.h>
-#include <binder/MemoryHeapBase.h>
-#include <binder/MemoryBase.h>
-#include <utils/threads.h>
-
-using namespace android;
-
-class ITvService;
-class ITv;
-
-// ref-counted object for callbacks
-class TvListener: virtual public RefBase {
-public:
- virtual void notify(int32_t msgType, const Parcel &ext) = 0;
-};
-
-class Tv : public BnTvClient, public IBinder::DeathRecipient {
-public:
- // construct a tv client from an existing remote
- static sp<Tv> create(const sp<ITv> &tv);
- static sp<Tv> connect();
- ~Tv();
- void init();
- status_t reconnect();
- void disconnect();
- status_t lock();
- status_t unlock();
-
- status_t getStatus()
- {
- return mStatus;
- }
- status_t processCmd(const Parcel &p, Parcel *r);
- status_t createSubtitle(const sp<IMemory> &share_mem);
- status_t createVideoFrame(const sp<IMemory> &share_mem);
- void setListener(const sp<TvListener> &listener);
-
- // ITvClient interface
- virtual void notifyCallback(int32_t msgType, const Parcel &p);
-
- sp<ITv> remote();
-
-private:
- Tv();
- Tv(const Tv &);
- Tv &operator = (const Tv);
- virtual void binderDied(const wp<IBinder> &who);
-
- class DeathNotifier: public IBinder::DeathRecipient {
- public:
- DeathNotifier() {}
- virtual void binderDied(const wp<IBinder> &who);
- };
-
- static sp<DeathNotifier> mDeathNotifier;
-
- // helper function to obtain tv service handle
- static const sp<ITvService> &getTvService();
-
- sp<ITv> mTv;
- status_t mStatus;
-
- sp<TvListener> mListener;
-
- friend class DeathNotifier;
-
- static Mutex mLock;
- static sp<ITvService> mTvService;
-
- sp<MemoryHeapBase> mBmpMemHeap;
- sp<MemoryBase> mBmpMemBase;
-};
-
-
-#endif
+#ifndef ANDROID_AMLOGIC_TV_H
+#define ANDROID_AMLOGIC_TV_H
+
+#include <utils/Timers.h>
+#include <include/ITvClient.h>
+#include <binder/MemoryHeapBase.h>
+#include <binder/MemoryBase.h>
+#include <utils/threads.h>
+
+using namespace android;
+
+class ITvService;
+class ITv;
+
+// ref-counted object for callbacks
+class TvListener: virtual public RefBase {
+public:
+ virtual void notify(int32_t msgType, const Parcel &ext) = 0;
+};
+
+class Tv : public BnTvClient, public IBinder::DeathRecipient {
+public:
+ // construct a tv client from an existing remote
+ static sp<Tv> create(const sp<ITv> &tv);
+ static sp<Tv> connect();
+ ~Tv();
+ void init();
+ status_t reconnect();
+ void disconnect();
+ status_t lock();
+ status_t unlock();
+
+ status_t getStatus()
+ {
+ return mStatus;
+ }
+ status_t processCmd(const Parcel &p, Parcel *r);
+ status_t createSubtitle(const sp<IMemory> &share_mem);
+ status_t createVideoFrame(const sp<IMemory> &share_mem, int iSourceMode, int iCapVideoLayerOnly);
+ void setListener(const sp<TvListener> &listener);
+
+ // ITvClient interface
+ virtual void notifyCallback(int32_t msgType, const Parcel &p);
+
+ sp<ITv> remote();
+
+private:
+ Tv();
+ Tv(const Tv &);
+ Tv &operator = (const Tv);
+ virtual void binderDied(const wp<IBinder> &who);
+
+ class DeathNotifier: public IBinder::DeathRecipient {
+ public:
+ DeathNotifier() {}
+ virtual void binderDied(const wp<IBinder> &who);
+ };
+
+ static sp<DeathNotifier> mDeathNotifier;
+
+ // helper function to obtain tv service handle
+ static const sp<ITvService> &getTvService();
+
+ sp<ITv> mTv;
+ status_t mStatus;
+
+ sp<TvListener> mListener;
+
+ friend class DeathNotifier;
+
+ static Mutex mLock;
+ static sp<ITvService> mTvService;
+
+ sp<MemoryHeapBase> mBmpMemHeap;
+ sp<MemoryBase> mBmpMemBase;
+};
+
+
+#endif
diff --git a/tvapi/android/include/tvcmd.h b/tvapi/android/include/tvcmd.h
index 5a3f28a..8415171 100644
--- a/tvapi/android/include/tvcmd.h
+++ b/tvapi/android/include/tvcmd.h
@@ -1,594 +1,618 @@
-#ifndef ANDROID_AMLOGIC_TVCMD_H
-#define ANDROID_AMLOGIC_TVCMD_H
-
-enum tvcmd_e {
- // Tv function
- OPEN_TV = 1,
- CLOSE_TV = 2,
- START_TV = 3,
- STOP_TV = 4,
- GET_TV_STATUS = 5,
- GET_LAST_SOURCE_INPUT = 6,
- GET_CURRENT_SOURCE_INPUT = 7,
- GET_CURRENT_SOURCE_INPUT_TYPE = 8,
- GET_CURRENT_SIGNAL_INFO = 9,
- IS_SOURCE_SWTICH_DONE = 10,
- SET_SOURCE_INPUT = 11,
- RUN_ADC_AUTO_CALIBRATION = 12,
- IS_DVI_SIGNAL = 13,
- IS_VGA_TIMEING_IN_HDMI = 14,
- GET_VIDEO_PATH_STATUS = 15,
- GET_VIDEO_STREAM_STATUS = 16,
- GET_FIRST_START_SWITCH_TYPE = 17,
- SET_PREVIEW_WINDOW = 18,
- GET_SOURCE_CONNECT_STATUS = 19,
- //Tv function END
-
- // VGA
- RUN_VGA_AUTO_ADJUST = 20,
- GET_VGA_AUTO_ADJUST_STATUS = 21,
- IS_VGA_AUTO_ADJUST_DONE = 22,
- SET_VGA_HPOS = 23,
- GET_VGA_HPOS = 24,
- SET_VGA_VPOS = 25,
- GET_VGA_VPOS = 26,
- SET_VGA_CLOCK = 27,
- GET_VGA_CLOCK = 28,
- SET_VGA_PHASE = 29,
- GET_VGA_PHASE = 30,
- SET_VGA_AJUST_PARA = 31,
- GET_VGA_AJUST_PARA = 32,
- SET_VGAPARAM_DEFAULT = 33,
-
- // 3D
- SET_3D_MODE = 61,
- GET_3D_MODE = 62,
- SET_3D_LR_SWITH = 63,
- GET_3D_LR_SWITH = 64,
- SET_3D_TO_2D_MODE = 65,
- GET_3D_TO_2D_MODE = 66,
- SET_3D_DEPTH = 67,
- GET_3D_DEPTH = 68,
- GET_3D_AUTO_DETECT = 69,
- SET_3D_AUTO_DETECT = 70,
- // 3D END
-
- //Screen related
- SET_VIDEO_DISABLE = 80,
-
- // PQ
- SET_SCENEMODE = 192,
- GET_SCENEMODE = 193,
- SET_BRIGHTNESS = 194,
- GET_BRIGHTNESS = 195,
- SAVE_BRIGHTNESS = 196,
- SET_CONTRAST = 197,
- GET_CONTRAST = 198,
- SAVE_CONTRAST = 199,
- SET_SATUATION = 200,
- GET_SATUATION = 201,
- SAVE_SATUATION = 202,
- SET_HUE = 203,
- GET_HUE = 204,
- SAVE_HUE = 205,
- SET_PQMODE = 206,
- GET_PQMODE = 207,
- SAVE_PQMODE = 208,
- SET_SHARPNESS = 209,
- GET_SHARPNESS = 210,
- SAVE_SHARPNESS = 211,
- SET_BACKLIGHT = 212,
- GET_BACKLIGHT = 213,
- SAVE_BACKLIGHT = 214,
- SET_COLOR_MODE = 215,
- GET_COLOR_MODE = 216,
- SAVE_COLOR_MODE = 217,
- SET_COLOR_TEMPERATURE = 218,
- GET_COLOR_TEMPERATURE = 219,
- SAVE_COLOR_TEMPERATURE = 220,
- SET_DISPLAY_MODE = 221,
- GET_DISPLAY_MODE = 222,
- SAVE_DISPLAY_MODE = 223,
- SET_NOISE_REDUCTION_MODE = 224,
- GET_NOISE_REDUCTION_MODE = 225,
- SAVE_NOISE_REDUCTION_MODE = 226,
- SETRGBOGO_POSTOFFSET = 227,
- //SETRGBOGO_POSTOFFSET_G = 228,
- //SETRGBOGO_POSTOFFSET_B = 229,
- SETRGBOGO_GAIN = 230,
- //SETRGBOGO_GAIN_G = 231,
- //SETRGBOGO_GAIN_B = 232,
- GETRGBOGO_POSTOFFSET = 233,
- //GETRGBOGO_POSTOFFSET_G = 234,
- //GETRGBOGO_POSTOFFSET_B = 235,
- GETRGBOGO_GAIN = 236,
- //GETRGBOGO_GAIN_G = 237,
- //GETRGBOGO_GAIN_B = 238,
-
- // FACTORY
- FACTORY_SETPQMODE_BRIGHTNESS = 240,
- FACTORY_GETPQMODE_BRIGHTNESS = 241,
- FACTORY_SETPQMODE_CONTRAST = 242,
- FACTORY_GETPQMODE_CONTRAST = 243,
- FACTORY_SETPQMODE_SATURATION = 244,
- FACTORY_GETPQMODE_SATURATION = 245,
- FACTORY_SETPQMODE_HUE = 246,
- FACTORY_GETPQMODE_HUE = 247,
- FACTORY_SETPQMODE_SHARPNESS = 248,
- FACTORY_GETPQMODE_SHARPNESS = 249,
- FACTORY_SETCOLORTEMP_RGAIN = 250,
- FACTORY_SAVECOLORTEMP_RGAIN = 251,
- FACTORY_GETCOLORTEMP_RGAIN = 252,
- FACTORY_SETCOLORTEMP_GGAIN = 253,
- FACTORY_SAVECOLORTEMP_GGAIN = 254,
- FACTORY_GETCOLORTEMP_GGAIN = 255,
- FACTORY_SETCOLORTEMP_BGAIN = 256,
- FACTORY_SAVECOLORTEMP_BGAIN = 257,
- FACTORY_GETCOLORTEMP_BGAIN = 258,
- FACTORY_SETCOLORTEMP_ROFFSET = 259,
- FACTORY_SAVECOLORTEMP_ROFFSET = 260,
- FACTORY_GETCOLORTEMP_ROFFSET = 261,
- FACTORY_SETCOLORTEMP_GOFFSET = 262,
- FACTORY_SAVECOLORTEMP_GOFFSET = 263,
- FACTORY_GETCOLORTEMP_GOFFSET = 264,
- FACTORY_SETCOLORTEMP_BOFFSET = 265,
- FACTORY_SAVECOLORTEMP_BOFFSET = 266,
- FACTORY_GETCOLORTEMP_BOFFSET = 267,
- FACTORY_SETTESTPATTERN = 268,
- FACTORY_GETTESTPATTERN = 269,
- FACTORY_RESETPQMODE = 270,
- FACTORY_RESETCOLORTEMP = 271,
- FACTORY_RESETPAMAMSDEFAULT = 272,
- FACTORY_SETDDRSSC = 273,
- FACTORY_GETDDRSSC = 274,
- FACTORY_SETLVDSSSC = 275,
- FACTORY_GETLVDSSSC = 276,
- FACTORY_SETNOLINEPARAMS = 277,
- FACTORY_GETNOLINEPARAMS = 278,
- FACTORY_SETOVERSCAN = 279,
- FACTORY_GETOVERSCAN = 280,
- FACTORY_SET_OUT_DEFAULT = 281,
- FACTORY_GETGLOBALOGO_RGAIN = 282,
- FACTORY_GETGLOBALOGO_GGAIN = 283,
- FACTORY_GETGLOBALOGO_BGAIN = 284,
- FACTORY_GETGLOBALOGO_ROFFSET = 285,
- FACTORY_GETGLOBALOGO_GOFFSET = 286,
- FACTORY_GETGLOBALOGO_BOFFSET = 287,
- FACTORY_SETGLOBALOGO_RGAIN = 288,
- FACTORY_SETGLOBALOGO_GGAIN = 289,
- FACTORY_SETGLOBALOGO_BGAIN = 290,
- FACTORY_SETGLOBALOGO_ROFFSET = 291,
- FACTORY_SETGLOBALOGO_GOFFSET = 292,
- FACTORY_SETGLOBALOGO_BOFFSET = 293,
- FACTORY_CLEAN_ALL_TABLE_FOR_PROGRAM = 294,
-
-
- // FACTORY END
-
- // AUDIO
- // AUDIO MUTE
- SET_AUDIO_MUTEKEY_STATUS = 301,
- GET_AUDIO_MUTEKEY_STATUS = 302,
- SET_AUDIO_FORCE_MUTE_STATUS = 303,
- GET_AUDIO_FORCE_MUTE_STATUS = 304,
- SET_AUDIO_AVOUT_MUTE_STATUS = 305,
- GET_AUDIO_AVOUT_MUTE_STATUS = 306,
- SET_AUDIO_SPDIF_MUTE_STATUS = 307,
- GET_AUDIO_SPDIF_MUTE_STATUS = 308,
- // AUDIO MASTER VOLUME
- SET_AUDIO_MASTER_VOLUME = 309,
- GET_AUDIO_MASTER_VOLUME = 310,
- SAVE_CUR_AUDIO_MASTER_VOLUME = 311,
- GET_CUR_AUDIO_MASTER_VOLUME = 312,
- // AUDIO BALANCE
- SET_AUDIO_BALANCE = 313,
- GET_AUDIO_BALANCE = 314,
- SAVE_CUR_AUDIO_BALANCE = 315,
- GET_CUR_AUDIO_BALANCE = 316,
- // AUDIO SUPPERBASS VOLUME
- SET_AUDIO_SUPPER_BASS_VOLUME = 317,
- GET_AUDIO_SUPPER_BASS_VOLUME = 318,
- SAVE_CUR_AUDIO_SUPPER_BASS_VOLUME = 319,
- GET_CUR_AUDIO_SUPPER_BASS_VOLUME = 320,
- // AUDIO SUPPERBASS SWITCH
- SET_AUDIO_SUPPER_BASS_SWITCH = 321,
- GET_AUDIO_SUPPER_BASS_SWITCH = 322,
- SAVE_CUR_AUDIO_SUPPER_BASS_SWITCH = 323,
- GET_CUR_AUDIO_SUPPER_BASS_SWITCH = 324,
- // AUDIO SRS SURROUND SWITCH
- SET_AUDIO_SRS_SURROUND = 325,
- GET_AUDIO_SRS_SURROUND = 326,
- SAVE_CUR_AUDIO_SRS_SURROUND = 327,
- GET_CUR_AUDIO_SRS_SURROUND = 328,
- // AUDIO SRS DIALOG CLARITY
- SET_AUDIO_SRS_DIALOG_CLARITY = 329,
- GET_AUDIO_SRS_DIALOG_CLARITY = 330,
- SAVE_CUR_AUDIO_SRS_DIALOG_CLARITY = 331,
- GET_CUR_AUDIO_SRS_DIALOG_CLARITY = 332,
- // AUDIO SRS TRUBASS
- SET_AUDIO_SRS_TRU_BASS = 333,
- GET_AUDIO_SRS_TRU_BASS = 334,
- SAVE_CUR_AUDIO_SRS_TRU_BASS = 335,
- GET_CUR_AUDIO_SRS_TRU_BASS = 336,
- // AUDIO BASS
- SET_AUDIO_BASS_VOLUME = 337,
- GET_AUDIO_BASS_VOLUME = 338,
- SAVE_CUR_AUDIO_BASS_VOLUME = 339,
- GET_CUR_AUDIO_BASS_VOLUME = 340,
- // AUDIO TREBLE
- SET_AUDIO_TREBLE_VOLUME = 341,
- GET_AUDIO_TREBLE_VOLUME = 342,
- SAVE_CUR_AUDIO_TREBLE_VOLUME = 343,
- GET_CUR_AUDIO_TREBLE_VOLUME = 344,
- // AUDIO SOUND MODE
- SET_AUDIO_SOUND_MODE = 345,
- GET_AUDIO_SOUND_MODE = 346,
- SAVE_CUR_AUDIO_SOUND_MODE = 347,
- GET_CUR_AUDIO_SOUND_MODE = 348,
- // AUDIO WALL EFFECT
- SET_AUDIO_WALL_EFFECT = 349,
- GET_AUDIO_WALL_EFFECT = 350,
- SAVE_CUR_AUDIO_WALL_EFFECT = 351,
- GET_CUR_AUDIO_WALL_EFFECT = 352,
- // AUDIO EQ MODE
- SET_AUDIO_EQ_MODE = 353,
- GET_AUDIO_EQ_MODE = 354,
- SAVE_CUR_AUDIO_EQ_MODE = 355,
- GET_CUR_AUDIO_EQ_MODE = 356,
- // AUDIO EQ GAIN
- GET_AUDIO_EQ_RANGE = 357,
- GET_AUDIO_EQ_BAND_COUNT = 358,
- SET_AUDIO_EQ_GAIN = 359,
- GET_AUDIO_EQ_GAIN = 360,
- GET_CUR_EQ_GAIN = 361,
- SAVE_CUR_AUDIO_EQ_GAIN = 362,
- SET_AUDIO_EQ_SWITCH = 363,
- // AUDIO SPDIF SWITCH
- SET_AUDIO_SPDIF_SWITCH = 364,
- GET_AUDIO_SPDIF_SWITCH = 365,
- SAVE_CUR_AUDIO_SPDIF_SWITCH = 366,
- GET_CUR_AUDIO_SPDIF_SWITCH = 367,
- // AUDIO SPDIF MODE
- SET_AUDIO_SPDIF_MODE = 368,
- GET_AUDIO_SPDIF_MODE = 369,
- SAVE_CUR_AUDIO_SPDIF_MODE = 370,
- GET_CUR_AUDIO_SPDIF_MODE = 371,
- // amAudio
- OPEN_AMAUDIO = 372,
- CLOSE_AMAUDIO = 373,
- SET_AMAUDIO_INPUT_SR = 374,
- SET_AMAUDIO_OUTPUT_MODE = 375,
- SET_AMAUDIO_MUSIC_GAIN = 376,
- SET_AMAUDIO_LEFT_GAIN = 377,
- SET_AMAUDIO_RIGHT_GAIN = 378,
- SET_AMAUDIO_REV1 = 379,
- SET_AMAUDIO_REV2 = 380,
- SET_AMAUDIO_REV3 = 381,
- SET_AMAUDIO_REV4 = 382,
- SET_AMAUDIO_REV5 = 383,
- //AUDIO INPUT LEVEL SWITCH
- SELECT_LINE_IN_CHANNEL = 384,
- SET_LINE_IN_CAPTURE_VOL = 385,
- HANDLE_AUDIO_HEADSET_PLUG_IN = 386,
- HANDLE_AUDIO_HEADSET_PULL_OUT = 387,
- SET_AUDIO_VOL_COMP = 388,
- GET_AUDIO_VOL_COMP = 389,
- SET_NOISE_GATE_THRESHOLD = 390,
- SAVE_AUDIO_VOL_COMP = 391,
- SET_KALAOK_IO_LEVEL = 392,
- AUDIO_SET_DOUBLE_OUTPUT_ENABLE = 393,
- USB_AUDIO_OUPUT_MODULE_ENABLE = 394,
- GET_USB_AUDIO_DOUBLE_OUPUT_MODULE_ENABLE = 395,
- GET_USB_AUDIO_OUPUT_MODULE_ENABLE = 396,
- SET_AUDIO_SOURCE_FOR_KARAOKE = 397,
- //AUDIO END
-
- // CALLBACK
- SEARCH_CALLBACK = 501,
- SIGLE_DETECT_CALLBACK = 502,
- VGA_CALLBACK = 503,
- DREAM_PANEL_CALLBACK = 504,
- ADC_CALIBRATION_CALLBACK = 505,
- SOURCE_SWITCH_CALLBACK = 506,
- CHANNEL_SELECT_CALLBACK = 507,
- STATUS_3D_CALLBACK = 508,
- DTV_AV_PLAYBACK_CALLBACK = 509,
- SOURCE_CONNECT_CALLBACK = 510,
- HDMIRX_CEC_CALLBACK = 511,
- SERIAL_COMMUNICATION_CALLBACK = 512,
- CLOSE_CAPTION_CALLBACK = 514,
- VCHIP_CALLBACK = 515,
- UPGRADE_FBC_CALLBACK = 516,
- HEADSET_STATUS_CALLBACK = 517,
-
- RELEASE_RESOURCE_CALLBACK = 530,
- RESOURCES_STATE_CHANGED_CALLBACK = 531,
- RESOURCE_STATE_CHANGED_LISTEN_NOFIFY_CALLBACK = 532,
-
- SUBTITLE_UPDATE_CALLBACK = 540,
- SCAN_EVENT_CALLBACK = 541,
- EPG_EVENT_CALLBACK = 542,
- VFRAME_BMP_EVENT_CALLBACK = 543,
- // CALLBACK END
-
- // SSM
- SSM_INIT_DEVICE = 600,
- SSM_SAVE_ONE_BYTE = 601,
- SSM_READ_ONE_BYTE = 602,
- SSM_SAVE_N_BYTES = 603,
- SSM_READ_N_BYTES = 604,
- SSM_SAVE_POWER_ON_OFF_CHANNEL = 605,
- SSM_READ_POWER_ON_OFF_CHANNEL = 606,
- SSM_SAVE_SOURCE_INPUT = 607,
- SSM_READ_SOURCE_INPUT = 608,
- SSM_SAVE_LAST_SOURCE_INPUT = 609,
- SSM_READ_LAST_SOURCE_INPUT = 610,
- SSM_SAVE_SYS_LANGUAGE = 611,
- SSM_READ_SYS_LANGUAGE = 612,
- SSM_SAVE_AGING_MODE = 613,
- SSM_READ_AGING_MODE = 614,
- SSM_SAVE_PANEL_TYPE = 615,
- SSM_READ_PANEL_TYPE = 616,
- SSM_SAVE_MAC_ADDR = 617,
- SSM_READ_MAC_ADDR = 618,
- SSM_SAVE_BAR_CODE = 619,
- SSM_READ_BAR_CODE = 620,
- SSM_SAVE_POWER_ON_MUSIC_SWITCH = 623,
- SSM_READ_POWER_ON_MUSIC_SWITCH = 624,
- SSM_SAVE_POWER_ON_MUSIC_VOL = 625,
- SSM_READ_POWER_ON_MUSIC_VOL = 626,
- SSM_SAVE_SYS_SLEEP_TIMER = 627,
- SSM_READ_SYS_SLEEP_TIMER = 628,
- SSM_SET_BUS_STATUS = 629,
- SSM_GET_BUS_STATUS = 630,
- SSM_SAVE_INPUT_SRC_PARENTAL_CTL = 631,
- SSM_READ_INPUT_SRC_PARENTAL_CTL = 632,
- SSM_SAVE_PARENTAL_CTL_SWITCH = 633,
- SSM_READ_PARENTAL_CTL_SWITCH = 634,
- SSM_SAVE_PARENTAL_CTL_PASS_WORD = 635,
- SSM_READ_PARENTAL_CTL_PASS_WORD = 636,
- SSM_SAVE_USING_DEF_HDCP_KEY_FLAG = 637,
- SSM_READ_USING_DEF_HDCP_KEY_FLAG = 638,
- SSM_GET_CUSTOMER_DATA_START = 639,
- SSM_GET_CUSTOMER_DATA_LEN = 640,
- SSM_SAVE_STANDBY_MODE = 641,
- SSM_READ_STANDBY_MODE = 642,
- SSM_SAVE_LOGO_ON_OFF_FLAG = 643,
- SSM_READ_LOGO_ON_OFF_FLAG = 644,
- SSM_SAVE_HDMIEQ_MODE = 645,
- SSM_READ_HDMIEQ_MODE = 646,
- SSM_SAVE_HDMIINTERNAL_MODE = 647,
- SSM_READ_HDMIINTERNAL_MODE = 648,
- SSM_SAVE_DISABLE_3D = 649,
- SSM_READ_DISABLE_3D = 650,
- SSM_SAVE_GLOBAL_OGOENABLE = 651,
- SSM_READ_GLOBAL_OGOENABLE = 652,
- SSM_SAVE_LOCAL_DIMING_STATUS = 653,
- SSM_READ_LOCAL_DIMING_STATUS = 654,
- SSM_SAVE_NON_STANDARD_STATUS = 655,
- SSM_READ_NON_STANDARD_STATUS = 656,
- SSM_SAVE_ADB_SWITCH_STATUS = 657,
- SSM_READ_ADB_SWITCH_STATUS = 658,
- SSM_SAVE_SERIAL_CMD_SWITCH_STATUS = 659,
- SSM_READ_SERIAL_CMD_SWITCH_STATUS = 660,
- SSM_SET_HDCP_KEY = 661,
- SSM_SAVE_CHROMA_STATUS = 662,
- SSM_SAVE_CA_BUFFER_SIZE = 663,
- SSM_READ_CA_BUFFER_SIZE = 664,
- SSM_GET_ATV_DATA_START = 665,
- SSM_GET_ATV_DATA_LEN = 666,
- SSM_GET_VPP_DATA_START = 667,
- SSM_GET_VPP_DATA_LEN = 668,
- SSM_SAVE_NOISE_GATE_THRESHOLD_STATUS = 669,
- SSM_READ_NOISE_GATE_THRESHOLD_STATUS = 670,
- SSM_SAVE_PROJECT_ID = 673,
- SSM_READ_PROJECT_ID = 674,
- SSM_SAVE_HDCPKEY = 675,
- SSM_READ_HDCPKEY = 676,
- SSM_READ_BLACKOUT_ENABLE = 677,
- SSM_REFRESH_HDCPKEY = 678,
-
- // Misc
- MISC_PROP_SET = 701,
- MISC_PROP_GET = 702,
- MISC_CFG_SET = 703,
- MISC_CFG_GET = 704,
- MISC_READ_ADC_VAL = 707,
- MISC_SET_WDT_USER_PET = 708,
- MISC_SET_WDT_USER_COUNTER = 709,
- MISC_SET_WDT_USER_PET_RESET_ENABLE = 710,
- MISC_GET_TV_API_VERSION = 713,
- MISC_GET_DVB_API_VERSION = 714,
- MISC_SERIAL_SWITCH = 715,
- MISC_SERIAL_SEND_DATA = 716,
- MISC_CHANNEL_EXPORT = 721,
- MISC_CHANNEL_IMPORT = 722,
- MISC_GET_PROJECT_INFO = 723,
- MISC_GET_PLATFORM_TYPE = 724,
-
- //Extra
- FORMAT_PARTITION = 801,
- DELETE_DIR_FILES = 802,
- REQUEST_RESOURCES = 803,
- RELEASED_RESOURCES = 804,
- SET_LISTEN_TO_RESOURCE = 805,
- QUERY_RESOURCE_STATE = 806,
- GET_DISPLAY_RESOLUTION_CONFIG = 808,
- GET_DISPLAY_RESOLUTION_INFO = 809,
- HDMIRX_CEC_SEND_CUSTOM_MESSAGE = 810,
- HDMIRX_CEC_SEND_CUSTOM_WAIT_REPLY_MESSAGE = 811,
- HDMIRX_CEC_SEND_BROADCAST_STANDBY_MESSAGE = 812,
- HDMIRX_CEC_SEND_GIVE_CEC_VERSION_MESSAGE = 813,
- HDMIRX_CEC_SEND_GIVE_DEV_VENDOR_ID_MESSAGE = 814,
- HDMIRX_CEC_SEND_GIVE_OSD_NAME_MESSAGE = 815,
- GET_HDMI_KSV_INFO = 816,
-
- //Fac_FBC
- FACTORY_FBC_UPGRADE = 900,
- FACTORY_FBC_SET_BRIGHTNESS = 901,
- FACTORY_FBC_GET_BRIGHTNESS = 902,
- FACTORY_FBC_SET_CONTRAST = 903,
- FACTORY_FBC_GET_CONTRAST = 904,
- FACTORY_FBC_SET_SATURATION = 905,
- FACTORY_FBC_GET_SATURATION = 906,
- FACTORY_FBC_SET_HUE = 907,
- FACTORY_FBC_GET_HUE = 908,
- FACTORY_FBC_SET_BACKLIGHT = 909,
- FACTORY_FBC_GET_BACKLIGHT = 910,
- FACTORY_FBC_SET_PIC_MODE = 911,
- FACTORY_FBC_GET_PIC_MODE = 912,
- FACTORY_FBC_SET_GAIN_RED = 913,
- FACTORY_FBC_GET_GAIN_RED = 914,
- FACTORY_FBC_SET_GAIN_GREEN = 915,
- FACTORY_FBC_GET_GAIN_GREEN = 916,
- FACTORY_FBC_SET_GAIN_BLUE = 917,
- FACTORY_FBC_GET_GAIN_BLUE = 918,
- FACTORY_FBC_SET_OFFSET_RED = 919,
- FACTORY_FBC_GET_OFFSET_RED = 920,
- FACTORY_FBC_SET_OFFSET_GREEN = 921,
- FACTORY_FBC_GET_OFFSET_GREEN = 922,
- FACTORY_FBC_SET_OFFSET_BLUE = 923,
- FACTORY_FBC_GET_OFFSET_BLUE = 924,
- FACTORY_FBC_SET_COLORTEMP_MODE = 925,
- FACTORY_FBC_GET_COLORTEMP_MODE = 926,
- FACTORY_FBC_SET_WB_INIT = 927,
- FACTORY_FBC_GET_WB_INIT = 928,
- FACTORY_FBC_SET_TEST_PATTERN = 929,
- FACTORY_FBC_GET_TEST_PATTERN = 930,
- FACTORY_FBC_SET_BACKLIGHT_EN = 931,
- FACTORY_FBC_GET_BACKLIGHT_EN = 932,
- FACTORY_FBC_SET_LVDS_SSG = 933,
- FACTORY_FBC_SET_ELEC_MODE = 934,
- FACTORY_FBC_GET_MAINCODE_VERSION = 935,
- FACTORY_FBC_PANEL_POWER_SWITCH = 936,
- FACTORY_FBC_PANEL_GET_INFO = 937,
- FACTORY_FBC_PANEL_SUSPEND = 938,
- FACTORY_FBC_SEND_KEY_TO_FBC = 939,
- FACTORY_FBC_POWER_REBOOT = 940,
- FACTORY_FBC_GET_ELEC_MODE = 941,
- FACTORY_FBC_PANEL_USER_SETTING_DEFAULT = 942,
- FACTORY_FBC_SET_BACKLIGHT_N360 = 943,
- FACTORY_FBC_GET_BACKLIGHT_N360 = 944,
- FACTORY_FBC_SET_COLORTEMP_MODE_N360 = 945,
- FACTORY_FBC_GET_COLORTEMP_MODE_N360 = 946,
-
- //T868 for cvt
- FACTORY_SETBACKLIGHT_PWM_FREQUENCY = 1000,
- FACTORY_GETBACKLIGHT_PWM_FREQUENCY = 1001,
- FACTORY_SETBACKLIGHT_SWITCH_STATUS = 1002,
- FACTORY_GETBACKLIGHT_SWITCH_STATUS = 1003,
- FACTORY_SETBACKLIGHT_PWM_DUTY = 1004,
- FACTORY_GETBACKLIGHT_PWM_DUTY = 1005,
- FACTORY_SETLVDS_COLOR_DEPTH = 1006,
- FACTORY_GETLVDS_COLOR_DEPTH = 1007,
- FACTORY_SETLVDS_DITHER_STATUS = 1008,
- FACTORY_GETLVDS_DITHER_STATUS = 1009,
- FACTORY_SETLVDS_MAPPING_STATUS = 1010,
- FACTORY_GETLVDS_MAPPING_STATUS = 1011,
- FACTORY_SETLVDS_PORT_SWAP_STATUS = 1012,
- FACTORY_GETLVDS_PORT_SWAP_STATUS = 1013,
- FACTORY_SET_SN = 1014,
- FACTORY_GET_SN = 1015,
-
- //Uniform White Balance
- FACTORY_WHITE_BALANCE_SET_GAIN_RED = 1100,
- FACTORY_WHITE_BALANCE_GET_GAIN_RED = 1101,
- FACTORY_WHITE_BALANCE_SET_GAIN_GREEN = 1102,
- FACTORY_WHITE_BALANCE_GET_GAIN_GREEN = 1103,
- FACTORY_WHITE_BALANCE_SET_GAIN_BLUE = 1104,
- FACTORY_WHITE_BALANCE_GET_GAIN_BLUE = 1105,
- FACTORY_WHITE_BALANCE_SET_OFFSET_RED = 1106,
- FACTORY_WHITE_BALANCE_GET_OFFSET_RED = 1107,
- FACTORY_WHITE_BALANCE_SET_OFFSET_GREEN = 1108,
- FACTORY_WHITE_BALANCE_GET_OFFSET_GREEN = 1109,
- FACTORY_WHITE_BALANCE_SET_OFFSET_BLUE = 1110,
- FACTORY_WHITE_BALANCE_GET_OFFSET_BLUE = 1111,
- FACTORY_WHITE_BALANCE_GET_COLOR_TMP = 1112,
- FACTORY_WHITE_BALANCE_SET_COLOR_TMP = 1113,
- FACTORY_WHITE_BALANCE_SAVE_PRAMAS = 1114,
- FACTORY_WHITE_BALANCE_SET_WB_INIT = 1115,
- FACTORY_WHITE_BALANCE_GET_WB_INIT = 1116,
- FACTORY_WHITE_BALANCE_SET_GRAY_PATTERN = 1117,
- FACTORY_WHITE_BALANCE_GET_GRAY_PATTERN = 1118,
- FACTORY_WHITE_BALANCE_OPEN_GRAY_PATTERN = 1119,
- FACTORY_WHITE_BALANCE_CLOSE_GRAY_PATTERN = 1120,
- FACTORY_WHITE_BALANCE_GET_ALL_PRAMAS = 1121,
-
- //dtv
- ATV_GET_CURRENT_PROGRAM_ID = 1389,
- DTV_GET_CURRENT_PROGRAM_ID = 1390,
- ATV_SAVE_PROGRAM_ID = 1391,
- DTV_SCAN_MANUAL_BETWEEN_FREQ = 1392,
- ATV_GET_MIN_MAX_FREQ = 1393,
- DTV_GET_SCAN_FREQUENCY_LIST = 1394,
- DTV_GET_CHANNEL_INFO = 1395,
- ATV_GET_CHANNEL_INFO = 1396,
- ATV_SCAN_MANUAL = 1397,
- ATV_SCAN_MANUAL_BY_NUMBER = 1387,
- ATV_SCAN_AUTO = 1398,
- DTV_SCAN_MANUAL = 1399,
- DTV_SCAN_AUTO = 1400,
- TV_SUBTITLE_DRAW_END = 1401,
- PLAY_PROGRAM = 1402,
- STOP_PROGRAM_PLAY = 1403,
- GET_PROGRAM_LIST = 1404,
- STOP_SCAN = 1405,
- DTV_GET_SNR = 1406,
- DTV_GET_BER = 1407,
- DTV_GET_STRENGTH = 1408,
- DTV_GET_AUDIO_TRACK_NUM = 1409,
- DTV_GET_AUDIO_TRACK_INFO = 1410,
- DTV_SWITCH_AUDIO_TRACK = 1411,
- DTV_GET_EPG_UTC_TIME = 1412,
- DTV_GET_CUR_FREQ = 1413,
- DTV_GET_EPG_INFO_POINT_IN_TIME = 1414,
- DTV_GET_EPG_INFO_DURATION = 1415,
- SET_FRONTEND_PARA = 1416,
- DTV_SET_PROGRAM_NAME = 1417,
- DTV_SET_PROGRAM_SKIPPED = 1418,
- DTV_SET_PROGRAM_FAVORITE = 1419,
- DTV_DETELE_PROGRAM = 1420,
- DTV_SWAP_PROGRAM = 1421,
- DTV_SET_PROGRAM_LOCKED = 1422,
- DTV_SET_BOOKING_FLAG = 1423,
- DTV_GET_BOOKED_EVENT = 1424,
- DTV_GET_CURR_AUDIO_TRACK_INDEX = 1425,
- DTV_SET_AUDIO_CHANNEL_MOD = 1426,
- DTV_GET_AUDIO_CHANNEL_MOD = 1427,
- DTV_GET_FREQ_BY_PROG_ID = 1428,
- DTV_GET_VIDEO_FMT_INFO = 1429,
- DTV_START_RECORD = 1430,
- DTV_STOP_RECORD = 1431,
- DTV_SET_RECORD_ALL_TS = 1432,
- DTV_SCAN_AUTO_ATSC = 1433,
- DTV_TEST_1 = 1451,
- DTV_TEST_2 = 1452,
- DTV_TEST_3 = 1453,
- TV_CLEAR_ALL_PROGRAM = 1454,
- SET_BLACKOUT_ENABLE = 1455,
- START_AUTO_BACKLIGHT = 1456,
- STOP_AUTO_BACKLIGHT = 1457,
- IS_AUTO_BACKLIGHTING = 1458,
- TV_PRINT_DEBUG_INFO = 2000,
-
- //customer interface
- FACTROY_FBC_SET_LIGHT_SENSOR_STATUS_N310 = 3000,
- FACTROY_FBC_GET_LIGHT_SENSOR_STATUS_N310 = 3001,
- FACTROY_FBC_SET_DREAM_PANEL_STATUS_N310 = 3002,
- FACTROY_FBC_GET_DREAM_PANEL_STATUS_N310 = 3003,
- SSM_EEPROM_SAVE_ONE_BYTE_N310_N311 = 3004,
- SSM_EEPROM_READ_ONE_BYTE_N310_N311 = 3005,
- SSM_EEPROM_SAVE_N_BYTES_N310_N311 = 3006,
- SSM_EEPROM_READ_N_BYTES_N310_N311 = 3007,
- SSM_FLASH_SAVE_ONE_BYTE_N310_N311 = 3008,
- SSM_FLASH_READ_ONE_BYTE_N310_N311 = 3009,
- SSM_FLASH_SAVE_N_BYTES_N310_N311 = 3010,
- SSM_FLASH_READ_N_BYTES_N310_N311 = 3011,
- FACTROY_FBC_SET_MULT_PQ_STATUS_N310 = 3012,
- FACTROY_FBC_GET_MULT_PQ_STATUS_N310 = 3013,
- FACTROY_FBC_SET_MEMC_STATUS_N310 = 3014,
- FACTROY_FBC_GET_MEMC_STATUS_N310 = 3015,
-
-};
-
-#endif //ANDROID_AMLOGIC_TVCMD_H
+#ifndef ANDROID_AMLOGIC_TVCMD_H
+#define ANDROID_AMLOGIC_TVCMD_H
+
+enum tvcmd_e {
+ // Tv function
+ OPEN_TV = 1,
+ CLOSE_TV = 2,
+ START_TV = 3,
+ STOP_TV = 4,
+ GET_TV_STATUS = 5,
+ GET_LAST_SOURCE_INPUT = 6,
+ GET_CURRENT_SOURCE_INPUT = 7,
+ GET_CURRENT_SOURCE_INPUT_TYPE = 8,
+ GET_CURRENT_SIGNAL_INFO = 9,
+ IS_SOURCE_SWTICH_DONE = 10,
+ SET_SOURCE_INPUT = 11,
+ RUN_ADC_AUTO_CALIBRATION = 12,
+ IS_DVI_SIGNAL = 13,
+ IS_VGA_TIMEING_IN_HDMI = 14,
+ GET_VIDEO_PATH_STATUS = 15,
+ GET_VIDEO_STREAM_STATUS = 16,
+ GET_FIRST_START_SWITCH_TYPE = 17,
+ SET_PREVIEW_WINDOW = 18,
+ GET_SOURCE_CONNECT_STATUS = 19,
+ //Tv function END
+
+ // VGA
+ RUN_VGA_AUTO_ADJUST = 20,
+ GET_VGA_AUTO_ADJUST_STATUS = 21,
+ IS_VGA_AUTO_ADJUST_DONE = 22,
+ SET_VGA_HPOS = 23,
+ GET_VGA_HPOS = 24,
+ SET_VGA_VPOS = 25,
+ GET_VGA_VPOS = 26,
+ SET_VGA_CLOCK = 27,
+ GET_VGA_CLOCK = 28,
+ SET_VGA_PHASE = 29,
+ GET_VGA_PHASE = 30,
+ SET_VGA_AJUST_PARA = 31,
+ GET_VGA_AJUST_PARA = 32,
+ SET_VGAPARAM_DEFAULT = 33,
+
+ // 3D
+ SET_3D_MODE = 61,
+ GET_3D_MODE = 62,
+ SET_3D_LR_SWITH = 63,
+ GET_3D_LR_SWITH = 64,
+ SET_3D_TO_2D_MODE = 65,
+ GET_3D_TO_2D_MODE = 66,
+ SET_3D_DEPTH = 67,
+ GET_3D_DEPTH = 68,
+ GET_3D_AUTO_DETECT = 69,
+ SET_3D_AUTO_DETECT = 70,
+ // 3D END
+
+ //Screen related
+ SET_VIDEO_DISABLE = 80,
+
+ // PQ
+ SET_SCENEMODE = 192,
+ GET_SCENEMODE = 193,
+ SET_BRIGHTNESS = 194,
+ GET_BRIGHTNESS = 195,
+ SAVE_BRIGHTNESS = 196,
+ SET_CONTRAST = 197,
+ GET_CONTRAST = 198,
+ SAVE_CONTRAST = 199,
+ SET_SATUATION = 200,
+ GET_SATUATION = 201,
+ SAVE_SATUATION = 202,
+ SET_HUE = 203,
+ GET_HUE = 204,
+ SAVE_HUE = 205,
+ SET_PQMODE = 206,
+ GET_PQMODE = 207,
+ SAVE_PQMODE = 208,
+ SET_SHARPNESS = 209,
+ GET_SHARPNESS = 210,
+ SAVE_SHARPNESS = 211,
+ SET_BACKLIGHT = 212,
+ GET_BACKLIGHT = 213,
+ SAVE_BACKLIGHT = 214,
+ SET_COLOR_MODE = 215,
+ GET_COLOR_MODE = 216,
+ SAVE_COLOR_MODE = 217,
+ SET_COLOR_TEMPERATURE = 218,
+ GET_COLOR_TEMPERATURE = 219,
+ SAVE_COLOR_TEMPERATURE = 220,
+ SET_DISPLAY_MODE = 221,
+ GET_DISPLAY_MODE = 222,
+ SAVE_DISPLAY_MODE = 223,
+ SET_NOISE_REDUCTION_MODE = 224,
+ GET_NOISE_REDUCTION_MODE = 225,
+ VPP_SPLIT_SCREEN_EFFECT = 226,
+ SET_BACKLIGHT_SWITCH = 227,
+ GET_BACKLIGHT_SWITCH = 228,
+ SAVE_NOISE_REDUCTION_MODE = 229,
+ //GETRGBOGO_GAIN_G = 237,
+ //GETRGBOGO_GAIN_B = 238,
+
+ // FACTORY
+ FACTORY_SETPQMODE_BRIGHTNESS = 240,
+ FACTORY_GETPQMODE_BRIGHTNESS = 241,
+ FACTORY_SETPQMODE_CONTRAST = 242,
+ FACTORY_GETPQMODE_CONTRAST = 243,
+ FACTORY_SETPQMODE_SATURATION = 244,
+ FACTORY_GETPQMODE_SATURATION = 245,
+ FACTORY_SETPQMODE_HUE = 246,
+ FACTORY_GETPQMODE_HUE = 247,
+ FACTORY_SETPQMODE_SHARPNESS = 248,
+ FACTORY_GETPQMODE_SHARPNESS = 249,
+ FACTORY_SETTESTPATTERN = 268,
+ FACTORY_GETTESTPATTERN = 269,
+ FACTORY_RESETPQMODE = 270,
+ FACTORY_RESETCOLORTEMP = 271,
+ FACTORY_RESETPAMAMSDEFAULT = 272,
+ FACTORY_SETDDRSSC = 273,
+ FACTORY_GETDDRSSC = 274,
+ FACTORY_SETLVDSSSC = 275,
+ FACTORY_GETLVDSSSC = 276,
+ FACTORY_SETNOLINEPARAMS = 277,
+ FACTORY_GETNOLINEPARAMS = 278,
+ FACTORY_SETOVERSCAN = 279,
+ FACTORY_GETOVERSCAN = 280,
+ FACTORY_SET_OUT_DEFAULT = 281,
+ FACTORY_GETGLOBALOGO_RGAIN = 282,
+ FACTORY_GETGLOBALOGO_GGAIN = 283,
+ FACTORY_GETGLOBALOGO_BGAIN = 284,
+ FACTORY_GETGLOBALOGO_ROFFSET = 285,
+ FACTORY_GETGLOBALOGO_GOFFSET = 286,
+ FACTORY_GETGLOBALOGO_BOFFSET = 287,
+ FACTORY_SETGLOBALOGO_RGAIN = 288,
+ FACTORY_SETGLOBALOGO_GGAIN = 289,
+ FACTORY_SETGLOBALOGO_BGAIN = 290,
+ FACTORY_SETGLOBALOGO_ROFFSET = 291,
+ FACTORY_SETGLOBALOGO_GOFFSET = 292,
+ FACTORY_SETGLOBALOGO_BOFFSET = 293,
+ FACTORY_CLEAN_ALL_TABLE_FOR_PROGRAM = 294,
+
+ DELETE_PARAM_PQ_DB = 295,
+ REPLACE_PARAM_PQ_DB = 296,
+ FACTORY_SETPATTERN_YUV = 297,
+
+ // FACTORY END
+
+ // AUDIO
+ // AUDIO MUTE
+ SET_AUDIO_MUTEKEY_STATUS = 301,
+ GET_AUDIO_MUTEKEY_STATUS = 302,
+ SET_AUDIO_FORCE_MUTE_STATUS = 303,
+ GET_AUDIO_FORCE_MUTE_STATUS = 304,
+ SET_AUDIO_AVOUT_MUTE_STATUS = 305,
+ GET_AUDIO_AVOUT_MUTE_STATUS = 306,
+ SET_AUDIO_SPDIF_MUTE_STATUS = 307,
+ GET_AUDIO_SPDIF_MUTE_STATUS = 308,
+ // AUDIO MASTER VOLUME
+ SET_AUDIO_MASTER_VOLUME = 309,
+ GET_AUDIO_MASTER_VOLUME = 310,
+ SAVE_CUR_AUDIO_MASTER_VOLUME = 311,
+ GET_CUR_AUDIO_MASTER_VOLUME = 312,
+ // AUDIO BALANCE
+ SET_AUDIO_BALANCE = 313,
+ GET_AUDIO_BALANCE = 314,
+ SAVE_CUR_AUDIO_BALANCE = 315,
+ GET_CUR_AUDIO_BALANCE = 316,
+ // AUDIO SUPPERBASS VOLUME
+ SET_AUDIO_SUPPER_BASS_VOLUME = 317,
+ GET_AUDIO_SUPPER_BASS_VOLUME = 318,
+ SAVE_CUR_AUDIO_SUPPER_BASS_VOLUME = 319,
+ GET_CUR_AUDIO_SUPPER_BASS_VOLUME = 320,
+ // AUDIO SUPPERBASS SWITCH
+ SET_AUDIO_SUPPER_BASS_SWITCH = 321,
+ GET_AUDIO_SUPPER_BASS_SWITCH = 322,
+ SAVE_CUR_AUDIO_SUPPER_BASS_SWITCH = 323,
+ GET_CUR_AUDIO_SUPPER_BASS_SWITCH = 324,
+ // AUDIO SRS SURROUND SWITCH
+ SET_AUDIO_SRS_SURROUND = 325,
+ GET_AUDIO_SRS_SURROUND = 326,
+ SAVE_CUR_AUDIO_SRS_SURROUND = 327,
+ GET_CUR_AUDIO_SRS_SURROUND = 328,
+ // AUDIO SRS DIALOG CLARITY
+ SET_AUDIO_SRS_DIALOG_CLARITY = 329,
+ GET_AUDIO_SRS_DIALOG_CLARITY = 330,
+ SAVE_CUR_AUDIO_SRS_DIALOG_CLARITY = 331,
+ GET_CUR_AUDIO_SRS_DIALOG_CLARITY = 332,
+ // AUDIO SRS TRUBASS
+ SET_AUDIO_SRS_TRU_BASS = 333,
+ GET_AUDIO_SRS_TRU_BASS = 334,
+ SAVE_CUR_AUDIO_SRS_TRU_BASS = 335,
+ GET_CUR_AUDIO_SRS_TRU_BASS = 336,
+ // AUDIO BASS
+ SET_AUDIO_BASS_VOLUME = 337,
+ GET_AUDIO_BASS_VOLUME = 338,
+ SAVE_CUR_AUDIO_BASS_VOLUME = 339,
+ GET_CUR_AUDIO_BASS_VOLUME = 340,
+ // AUDIO TREBLE
+ SET_AUDIO_TREBLE_VOLUME = 341,
+ GET_AUDIO_TREBLE_VOLUME = 342,
+ SAVE_CUR_AUDIO_TREBLE_VOLUME = 343,
+ GET_CUR_AUDIO_TREBLE_VOLUME = 344,
+ // AUDIO SOUND MODE
+ SET_AUDIO_SOUND_MODE = 345,
+ GET_AUDIO_SOUND_MODE = 346,
+ SAVE_CUR_AUDIO_SOUND_MODE = 347,
+ GET_CUR_AUDIO_SOUND_MODE = 348,
+ // AUDIO WALL EFFECT
+ SET_AUDIO_WALL_EFFECT = 349,
+ GET_AUDIO_WALL_EFFECT = 350,
+ SAVE_CUR_AUDIO_WALL_EFFECT = 351,
+ GET_CUR_AUDIO_WALL_EFFECT = 352,
+ // AUDIO EQ MODE
+ SET_AUDIO_EQ_MODE = 353,
+ GET_AUDIO_EQ_MODE = 354,
+ SAVE_CUR_AUDIO_EQ_MODE = 355,
+ GET_CUR_AUDIO_EQ_MODE = 356,
+ // AUDIO EQ GAIN
+ GET_AUDIO_EQ_RANGE = 357,
+ GET_AUDIO_EQ_BAND_COUNT = 358,
+ SET_AUDIO_EQ_GAIN = 359,
+ GET_AUDIO_EQ_GAIN = 360,
+ GET_CUR_EQ_GAIN = 361,
+ SAVE_CUR_AUDIO_EQ_GAIN = 362,
+ SET_AUDIO_EQ_SWITCH = 363,
+ // AUDIO SPDIF SWITCH
+ SET_AUDIO_SPDIF_SWITCH = 364,
+ GET_AUDIO_SPDIF_SWITCH = 365,
+ SAVE_CUR_AUDIO_SPDIF_SWITCH = 366,
+ GET_CUR_AUDIO_SPDIF_SWITCH = 367,
+ // AUDIO SPDIF MODE
+ SET_AUDIO_SPDIF_MODE = 368,
+ GET_AUDIO_SPDIF_MODE = 369,
+ SAVE_CUR_AUDIO_SPDIF_MODE = 370,
+ GET_CUR_AUDIO_SPDIF_MODE = 371,
+ // amAudio
+ OPEN_AMAUDIO = 372,
+ CLOSE_AMAUDIO = 373,
+ SET_AMAUDIO_INPUT_SR = 374,
+ SET_AMAUDIO_OUTPUT_MODE = 375,
+ SET_AMAUDIO_MUSIC_GAIN = 376,
+ SET_AMAUDIO_LEFT_GAIN = 377,
+ SET_AMAUDIO_RIGHT_GAIN = 378,
+ SET_AMAUDIO_REV1 = 379,
+ SET_AMAUDIO_REV2 = 380,
+ SET_AMAUDIO_REV3 = 381,
+ SET_AMAUDIO_REV4 = 382,
+ SET_AMAUDIO_REV5 = 383,
+ //AUDIO INPUT LEVEL SWITCH
+ SELECT_LINE_IN_CHANNEL = 384,
+ SET_LINE_IN_CAPTURE_VOL = 385,
+ HANDLE_AUDIO_HEADSET_PLUG_IN = 386,
+ HANDLE_AUDIO_HEADSET_PULL_OUT = 387,
+ SET_AUDIO_VOL_COMP = 388,
+ GET_AUDIO_VOL_COMP = 389,
+ SET_NOISE_GATE_THRESHOLD = 390,
+ SAVE_AUDIO_VOL_COMP = 391,
+ SET_KALAOK_IO_LEVEL = 392,
+ AUDIO_SET_DOUBLE_OUTPUT_ENABLE = 393,
+ USB_AUDIO_OUPUT_MODULE_ENABLE = 394,
+ GET_USB_AUDIO_DOUBLE_OUPUT_MODULE_ENABLE = 395,
+ GET_USB_AUDIO_OUPUT_MODULE_ENABLE = 396,
+ SET_AUDIO_SOURCE_FOR_KARAOKE = 397,
+ SET_DBX_TV_MODE = 398,
+ SET_DRC_ONOFF = 399,
+ GET_DRC_ONOFF = 400,
+ GET_DBX_TV_MODE = 401,
+ //AUDIO END
+
+ // CALLBACK
+ SEARCH_CALLBACK = 501,
+ SIGLE_DETECT_CALLBACK = 502,
+ VGA_CALLBACK = 503,
+ DREAM_PANEL_CALLBACK = 504,
+ ADC_CALIBRATION_CALLBACK = 505,
+ SOURCE_SWITCH_CALLBACK = 506,
+ CHANNEL_SELECT_CALLBACK = 507,
+ STATUS_3D_CALLBACK = 508,
+ DTV_AV_PLAYBACK_CALLBACK = 509,
+ SOURCE_CONNECT_CALLBACK = 510,
+ HDMIRX_CEC_CALLBACK = 511,
+ SERIAL_COMMUNICATION_CALLBACK = 512,
+ CLOSE_CAPTION_CALLBACK = 514,
+ VCHIP_CALLBACK = 515,
+ UPGRADE_FBC_CALLBACK = 516,
+ HEADSET_STATUS_CALLBACK = 517,
+
+ RELEASE_RESOURCE_CALLBACK = 530,
+ RESOURCES_STATE_CHANGED_CALLBACK = 531,
+ RESOURCE_STATE_CHANGED_LISTEN_NOFIFY_CALLBACK = 532,
+
+ SUBTITLE_UPDATE_CALLBACK = 540,
+ SCAN_EVENT_CALLBACK = 541,
+ EPG_EVENT_CALLBACK = 542,
+ VFRAME_BMP_EVENT_CALLBACK = 543,
+ // CALLBACK END
+
+ // SSM
+ SSM_INIT_DEVICE = 600,
+ SSM_SAVE_ONE_BYTE = 601,
+ SSM_READ_ONE_BYTE = 602,
+ SSM_SAVE_N_BYTES = 603,
+ SSM_READ_N_BYTES = 604,
+ SSM_SAVE_POWER_ON_OFF_CHANNEL = 605,
+ SSM_READ_POWER_ON_OFF_CHANNEL = 606,
+ SSM_SAVE_SOURCE_INPUT = 607,
+ SSM_READ_SOURCE_INPUT = 608,
+ SSM_SAVE_LAST_SOURCE_INPUT = 609,
+ SSM_READ_LAST_SOURCE_INPUT = 610,
+ SSM_SAVE_SYS_LANGUAGE = 611,
+ SSM_READ_SYS_LANGUAGE = 612,
+ SSM_SAVE_AGING_MODE = 613,
+ SSM_READ_AGING_MODE = 614,
+ SSM_SAVE_PANEL_TYPE = 615,
+ SSM_READ_PANEL_TYPE = 616,
+ SSM_SAVE_MAC_ADDR = 617,
+ SSM_READ_MAC_ADDR = 618,
+ SSM_SAVE_BAR_CODE = 619,
+ SSM_READ_BAR_CODE = 620,
+ SSM_SAVE_POWER_ON_MUSIC_SWITCH = 623,
+ SSM_READ_POWER_ON_MUSIC_SWITCH = 624,
+ SSM_SAVE_POWER_ON_MUSIC_VOL = 625,
+ SSM_READ_POWER_ON_MUSIC_VOL = 626,
+ SSM_SAVE_SYS_SLEEP_TIMER = 627,
+ SSM_READ_SYS_SLEEP_TIMER = 628,
+ SSM_SET_BUS_STATUS = 629,
+ SSM_GET_BUS_STATUS = 630,
+ SSM_SAVE_INPUT_SRC_PARENTAL_CTL = 631,
+ SSM_READ_INPUT_SRC_PARENTAL_CTL = 632,
+ SSM_SAVE_PARENTAL_CTL_SWITCH = 633,
+ SSM_READ_PARENTAL_CTL_SWITCH = 634,
+ SSM_SAVE_PARENTAL_CTL_PASS_WORD = 635,
+ SSM_READ_PARENTAL_CTL_PASS_WORD = 636,
+ SSM_SAVE_USING_DEF_HDCP_KEY_FLAG = 637,
+ SSM_READ_USING_DEF_HDCP_KEY_FLAG = 638,
+ SSM_GET_CUSTOMER_DATA_START = 639,
+ SSM_GET_CUSTOMER_DATA_LEN = 640,
+ SSM_SAVE_STANDBY_MODE = 641,
+ SSM_READ_STANDBY_MODE = 642,
+ SSM_SAVE_LOGO_ON_OFF_FLAG = 643,
+ SSM_READ_LOGO_ON_OFF_FLAG = 644,
+ SSM_SAVE_HDMIEQ_MODE = 645,
+ SSM_READ_HDMIEQ_MODE = 646,
+ SSM_SAVE_HDMIINTERNAL_MODE = 647,
+ SSM_READ_HDMIINTERNAL_MODE = 648,
+ SSM_SAVE_DISABLE_3D = 649,
+ SSM_READ_DISABLE_3D = 650,
+ SSM_SAVE_GLOBAL_OGOENABLE = 651,
+ SSM_READ_GLOBAL_OGOENABLE = 652,
+ SSM_SAVE_LOCAL_DIMING_STATUS = 653,
+ SSM_READ_LOCAL_DIMING_STATUS = 654,
+ SSM_SAVE_NON_STANDARD_STATUS = 655,
+ SSM_READ_NON_STANDARD_STATUS = 656,
+ SSM_SAVE_ADB_SWITCH_STATUS = 657,
+ SSM_READ_ADB_SWITCH_STATUS = 658,
+ SSM_SAVE_SERIAL_CMD_SWITCH_STATUS = 659,
+ SSM_READ_SERIAL_CMD_SWITCH_STATUS = 660,
+ SSM_SET_HDCP_KEY = 661,
+ SSM_SAVE_CHROMA_STATUS = 662,
+ SSM_SAVE_CA_BUFFER_SIZE = 663,
+ SSM_READ_CA_BUFFER_SIZE = 664,
+ SSM_GET_ATV_DATA_START = 665,
+ SSM_GET_ATV_DATA_LEN = 666,
+ SSM_GET_VPP_DATA_START = 667,
+ SSM_GET_VPP_DATA_LEN = 668,
+ SSM_SAVE_NOISE_GATE_THRESHOLD_STATUS = 669,
+ SSM_READ_NOISE_GATE_THRESHOLD_STATUS = 670,
+ SSM_SAVE_PROJECT_ID = 673,
+ SSM_READ_PROJECT_ID = 674,
+ SSM_SAVE_HDCPKEY = 675,
+ SSM_READ_HDCPKEY = 676,
+ SSM_READ_BLACKOUT_ENABLE = 677,
+ SSM_REFRESH_HDCPKEY = 678,
+
+ // Misc
+ MISC_PROP_SET = 701,
+ MISC_PROP_GET = 702,
+ MISC_CFG_SET = 703,
+ MISC_CFG_GET = 704,
+ MISC_READ_ADC_VAL = 707,
+ MISC_SET_WDT_USER_PET = 708,
+ MISC_SET_WDT_USER_COUNTER = 709,
+ MISC_SET_WDT_USER_PET_RESET_ENABLE = 710,
+ MISC_GET_TV_API_VERSION = 713,
+ MISC_GET_DVB_API_VERSION = 714,
+ MISC_SERIAL_SWITCH = 715,
+ MISC_SERIAL_SEND_DATA = 716,
+ MISC_CHANNEL_EXPORT = 721,
+ MISC_CHANNEL_IMPORT = 722,
+ MISC_GET_PROJECT_INFO = 723,
+ MISC_GET_PLATFORM_TYPE = 724,
+
+ //Extra
+ FORMAT_PARTITION = 801,
+ DELETE_DIR_FILES = 802,
+ REQUEST_RESOURCES = 803,
+ RELEASED_RESOURCES = 804,
+ SET_LISTEN_TO_RESOURCE = 805,
+ QUERY_RESOURCE_STATE = 806,
+ GET_DISPLAY_RESOLUTION_CONFIG = 808,
+ GET_DISPLAY_RESOLUTION_INFO = 809,
+ HDMIRX_CEC_SEND_CUSTOM_MESSAGE = 810,
+ HDMIRX_CEC_SEND_CUSTOM_WAIT_REPLY_MESSAGE = 811,
+ HDMIRX_CEC_SEND_BROADCAST_STANDBY_MESSAGE = 812,
+ HDMIRX_CEC_SEND_GIVE_CEC_VERSION_MESSAGE = 813,
+ HDMIRX_CEC_SEND_GIVE_DEV_VENDOR_ID_MESSAGE = 814,
+ HDMIRX_CEC_SEND_GIVE_OSD_NAME_MESSAGE = 815,
+ GET_HDMI_KSV_INFO = 816,
+ HDMI_OUT_TOWHAT = 817,
+ SET_DEBUG_SERIAL_PORT_ONOFF = 818,
+ GET_DEBUG_SERIAL_PORT_ONOFF = 819,
+ DO_SUSPEND = 820,
+ DO_RESUME = 821,
+
+ //Fac_FBC
+ FACTORY_FBC_UPGRADE = 900,
+ FACTORY_FBC_SET_BRIGHTNESS = 901,
+ FACTORY_FBC_GET_BRIGHTNESS = 902,
+ FACTORY_FBC_SET_CONTRAST = 903,
+ FACTORY_FBC_GET_CONTRAST = 904,
+ FACTORY_FBC_SET_SATURATION = 905,
+ FACTORY_FBC_GET_SATURATION = 906,
+ FACTORY_FBC_SET_HUE = 907,
+ FACTORY_FBC_GET_HUE = 908,
+ FACTORY_FBC_SET_BACKLIGHT = 909,
+ FACTORY_FBC_GET_BACKLIGHT = 910,
+ FACTORY_FBC_SET_PIC_MODE = 911,
+ FACTORY_FBC_GET_PIC_MODE = 912,
+ FACTORY_FBC_SET_GAIN_RED = 913,
+ FACTORY_FBC_GET_GAIN_RED = 914,
+ FACTORY_FBC_SET_GAIN_GREEN = 915,
+ FACTORY_FBC_GET_GAIN_GREEN = 916,
+ FACTORY_FBC_SET_GAIN_BLUE = 917,
+ FACTORY_FBC_GET_GAIN_BLUE = 918,
+ FACTORY_FBC_SET_OFFSET_RED = 919,
+ FACTORY_FBC_GET_OFFSET_RED = 920,
+ FACTORY_FBC_SET_OFFSET_GREEN = 921,
+ FACTORY_FBC_GET_OFFSET_GREEN = 922,
+ FACTORY_FBC_SET_OFFSET_BLUE = 923,
+ FACTORY_FBC_GET_OFFSET_BLUE = 924,
+ FACTORY_FBC_SET_COLORTEMP_MODE = 925,
+ FACTORY_FBC_GET_COLORTEMP_MODE = 926,
+ FACTORY_FBC_SET_WB_INIT = 927,
+ FACTORY_FBC_GET_WB_INIT = 928,
+ FACTORY_FBC_SET_TEST_PATTERN = 929,
+ FACTORY_FBC_GET_TEST_PATTERN = 930,
+ FACTORY_FBC_SET_BACKLIGHT_EN = 931,
+ FACTORY_FBC_GET_BACKLIGHT_EN = 932,
+ FACTORY_FBC_SET_LVDS_SSG = 933,
+ FACTORY_FBC_SET_ELEC_MODE = 934,
+ FACTORY_FBC_GET_MAINCODE_VERSION = 935,
+ FACTORY_FBC_PANEL_POWER_SWITCH = 936,
+ FACTORY_FBC_PANEL_GET_INFO = 937,
+ FACTORY_FBC_PANEL_SUSPEND = 938,
+ FACTORY_FBC_SEND_KEY_TO_FBC = 939,
+ FACTORY_FBC_POWER_REBOOT = 940,
+ FACTORY_FBC_GET_ELEC_MODE = 941,
+ FACTORY_FBC_PANEL_USER_SETTING_DEFAULT = 942,
+ FACTORY_FBC_SET_BACKLIGHT_N360 = 943,
+ FACTORY_FBC_GET_BACKLIGHT_N360 = 944,
+ FACTORY_FBC_SET_COLORTEMP_MODE_N360 = 945,
+ FACTORY_FBC_GET_COLORTEMP_MODE_N360 = 946,
+ FACTORY_FBC_SET_LOCKN_STATE_N360 = 947,
+ FACTORY_FBC_TEST_PATTERN = 950,
+ FACTORY_FBC_VIDEO_MUTE = 951,
+
+ //T868 for cvt
+ FACTORY_SETBACKLIGHT_PWM_FREQUENCY = 1000,
+ FACTORY_GETBACKLIGHT_PWM_FREQUENCY = 1001,
+ FACTORY_SETBACKLIGHT_SWITCH_STATUS = 1002,
+ FACTORY_GETBACKLIGHT_SWITCH_STATUS = 1003,
+ FACTORY_SETBACKLIGHT_PWM_DUTY = 1004,
+ FACTORY_GETBACKLIGHT_PWM_DUTY = 1005,
+ FACTORY_SETLVDS_COLOR_DEPTH = 1006,
+ FACTORY_GETLVDS_COLOR_DEPTH = 1007,
+ FACTORY_SETLVDS_DITHER_STATUS = 1008,
+ FACTORY_GETLVDS_DITHER_STATUS = 1009,
+ FACTORY_SETLVDS_MAPPING_STATUS = 1010,
+ FACTORY_GETLVDS_MAPPING_STATUS = 1011,
+ FACTORY_SETLVDS_PORT_SWAP_STATUS = 1012,
+ FACTORY_GETLVDS_PORT_SWAP_STATUS = 1013,
+ FACTORY_SET_SN = 1014,
+ FACTORY_GET_SN = 1015,
+
+ //Uniform White Balance
+ FACTORY_WHITE_BALANCE_SET_GAIN_RED = 1100,
+ FACTORY_WHITE_BALANCE_GET_GAIN_RED = 1101,
+ FACTORY_WHITE_BALANCE_SET_GAIN_GREEN = 1102,
+ FACTORY_WHITE_BALANCE_GET_GAIN_GREEN = 1103,
+ FACTORY_WHITE_BALANCE_SET_GAIN_BLUE = 1104,
+ FACTORY_WHITE_BALANCE_GET_GAIN_BLUE = 1105,
+ FACTORY_WHITE_BALANCE_SET_OFFSET_RED = 1106,
+ FACTORY_WHITE_BALANCE_GET_OFFSET_RED = 1107,
+ FACTORY_WHITE_BALANCE_SET_OFFSET_GREEN = 1108,
+ FACTORY_WHITE_BALANCE_GET_OFFSET_GREEN = 1109,
+ FACTORY_WHITE_BALANCE_SET_OFFSET_BLUE = 1110,
+ FACTORY_WHITE_BALANCE_GET_OFFSET_BLUE = 1111,
+ FACTORY_WHITE_BALANCE_GET_COLOR_TMP = 1112,
+ FACTORY_WHITE_BALANCE_SET_COLOR_TMP = 1113,
+ FACTORY_WHITE_BALANCE_SAVE_PRAMAS = 1114,
+ FACTORY_WHITE_BALANCE_SET_WB_INIT = 1115,
+ FACTORY_WHITE_BALANCE_GET_WB_INIT = 1116,
+ FACTORY_WHITE_BALANCE_SET_GRAY_PATTERN = 1117,
+ FACTORY_WHITE_BALANCE_GET_GRAY_PATTERN = 1118,
+ FACTORY_WHITE_BALANCE_OPEN_GRAY_PATTERN = 1119,
+ FACTORY_WHITE_BALANCE_CLOSE_GRAY_PATTERN = 1120,
+ FACTORY_WHITE_BALANCE_GET_ALL_PRAMAS = 1121,
+
+ //dtv
+ DTV_GET_SUBTITLE_SWITCH = 1380,
+ DTV_SUBTITLE_INIT = 1381,
+ DTV_SUBTITLE_LOCK = 1382,
+ DTV_SUBTITLE_UNLOCK = 1383,
+ DTV_START_SUBTITLE = 1384,
+ DTV_STOP_SUBTITLE = 1385,
+ DTV_GET_SUBTITLE_INDEX = 1386,
+ DTV_SET_SUBTITLE_INDEX = 1387,
+ ATV_GET_CURRENT_PROGRAM_ID = 1389,
+ DTV_GET_CURRENT_PROGRAM_ID = 1390,
+ ATV_SAVE_PROGRAM_ID = 1391,
+ DTV_SCAN_MANUAL_BETWEEN_FREQ = 1392,
+ ATV_GET_MIN_MAX_FREQ = 1393,
+ DTV_GET_SCAN_FREQUENCY_LIST = 1394,
+ DTV_GET_CHANNEL_INFO = 1395,
+ ATV_GET_CHANNEL_INFO = 1396,
+ ATV_SCAN_MANUAL = 1397,
+ ATV_SCAN_AUTO = 1398,
+ DTV_SCAN_MANUAL = 1399,
+ DTV_SCAN_AUTO = 1400,
+ TV_SUBTITLE_DRAW_END = 1401,
+ PLAY_PROGRAM = 1402,
+ STOP_PROGRAM_PLAY = 1403,
+ GET_PROGRAM_LIST = 1404,
+ STOP_SCAN = 1405,
+ DTV_GET_SNR = 1406,
+ DTV_GET_BER = 1407,
+ DTV_GET_STRENGTH = 1408,
+ DTV_GET_AUDIO_TRACK_NUM = 1409,
+ DTV_GET_AUDIO_TRACK_INFO = 1410,
+ DTV_SWITCH_AUDIO_TRACK = 1411,
+ DTV_GET_EPG_UTC_TIME = 1412,
+ DTV_GET_CUR_FREQ = 1413,
+ DTV_GET_EPG_INFO_POINT_IN_TIME = 1414,
+ DTV_GET_EPG_INFO_DURATION = 1415,
+ SET_FRONTEND_PARA = 1416,
+ DTV_SET_PROGRAM_NAME = 1417,
+ DTV_SET_PROGRAM_SKIPPED = 1418,
+ DTV_SET_PROGRAM_FAVORITE = 1419,
+ DTV_DETELE_PROGRAM = 1420,
+ DTV_SWAP_PROGRAM = 1421,
+ DTV_SET_PROGRAM_LOCKED = 1422,
+ DTV_SET_BOOKING_FLAG = 1423,
+ DTV_GET_BOOKED_EVENT = 1424,
+ DTV_GET_CURR_AUDIO_TRACK_INDEX = 1425,
+ DTV_SET_AUDIO_CHANNEL_MOD = 1426,
+ DTV_GET_AUDIO_CHANNEL_MOD = 1427,
+ DTV_GET_FREQ_BY_PROG_ID = 1428,
+ DTV_GET_VIDEO_FMT_INFO = 1429,
+ DTV_START_RECORD = 1430,
+ DTV_STOP_RECORD = 1431,
+ DTV_SET_RECORD_ALL_TS = 1432,
+ DTV_SCAN_AUTO_ATSC = 1433,
+ DTV_TEST_1 = 1451,
+ DTV_TEST_2 = 1452,
+ DTV_TEST_3 = 1453,
+ TV_CLEAR_ALL_PROGRAM = 1454,
+ SET_BLACKOUT_ENABLE = 1455,
+ START_AUTO_BACKLIGHT = 1456,
+ STOP_AUTO_BACKLIGHT = 1457,
+ IS_AUTO_BACKLIGHTING = 1458,
+ HDMIAV_HOTPLUGDETECT_ONOFF = 1459,
+ GET_AVERAGE_LUMA = 1480,
+ GET_AUTO_BACKLIGHT_DATA = 1481,
+ SET_AUTO_BACKLIGHT_DATA = 1482,
+ TV_PRINT_DEBUG_INFO = 2000,
+
+ //customer interface
+ FACTROY_FBC_SET_LIGHT_SENSOR_STATUS_N310 = 3000,
+ FACTROY_FBC_GET_LIGHT_SENSOR_STATUS_N310 = 3001,
+ FACTROY_FBC_SET_DREAM_PANEL_STATUS_N310 = 3002,
+ FACTROY_FBC_GET_DREAM_PANEL_STATUS_N310 = 3003,
+ SSM_EEPROM_SAVE_ONE_BYTE_N310_N311 = 3004,
+ SSM_EEPROM_READ_ONE_BYTE_N310_N311 = 3005,
+ SSM_EEPROM_SAVE_N_BYTES_N310_N311 = 3006,
+ SSM_EEPROM_READ_N_BYTES_N310_N311 = 3007,
+ SSM_FLASH_SAVE_ONE_BYTE_N310_N311 = 3008,
+ SSM_FLASH_READ_ONE_BYTE_N310_N311 = 3009,
+ SSM_FLASH_SAVE_N_BYTES_N310_N311 = 3010,
+ SSM_FLASH_READ_N_BYTES_N310_N311 = 3011,
+ FACTROY_FBC_SET_MULT_PQ_STATUS_N310 = 3012,
+ FACTROY_FBC_GET_MULT_PQ_STATUS_N310 = 3013,
+ FACTROY_FBC_SET_MEMC_STATUS_N310 = 3014,
+ FACTROY_FBC_GET_MEMC_STATUS_N310 = 3015,
+ FACTROY_FBC_SET_BACKLIGNT_N310 = 3016,
+ FACTROY_FBC_GET_BACKLIGNT_N310 = 3017,
+ FACTROY_FBC_SET_COLORTEMP_MODE_N310 = 3018,
+ FACTROY_FBC_GET_COLORTEMP_MODE_N310 = 3019,
+ FACTROY_SET_VBYONE_SPREAD_SPECTRUM_N311 = 3020,
+ FACTROY_GET_VBYONE_SPREAD_SPECTRUM_N311 = 3021,
+ GET_HISTGRAM_N311 = 3022,
+ FACTROY_SET_IIC_BUS_ONOFF_N311 = 3023,
+ FACTROY_GET_IIC_BUS_ONOFF_N311 = 3024,
+ SET_SPLIT_SCREEN_DEMO_ONOFF_N390 = 3025,
+ GET_SPLIT_SCREEN_DEMO_ONOFF_N390 = 3026,
+ FACTROY_FBC_SET_BLUETOOTH_IIS_N310 = 3027,
+ FACTROY_FBC_GET_BLUETOOTH_IIS_N310 = 3028,
+ FACTROY_FBC_SET_LED_N310 = 3029,
+ MISC_SET_2K_TO_4K_SCALE_UP_MODE = 3030,
+ MISC_GET_2K_TO_4K_SCALE_UP_MODE = 3031,
+ MISC_SET_FBC_AP_STANDBY_N310 = 3032,
+ MISC_GET_FBC_AP_STANDBY_N310 = 3033,
+ MISC_SET_BLUETOOTH_VOL_N311_N310 = 3034,
+ MISC_GET_BLUETOOTH_VOL_N311_N310 = 3035,
+
+ // 2.4G headset
+ START_OPEN_HEADSET_DETECT = 4000,
+
+};
+
+#endif //ANDROID_AMLOGIC_TVCMD_H
diff --git a/tvapi/android/jni/Android.mk b/tvapi/android/jni/Android.mk
index 2c1d863..1d71943 100644
--- a/tvapi/android/jni/Android.mk
+++ b/tvapi/android/jni/Android.mk
@@ -1,66 +1,69 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES:= \
- android_amlogic_tv.cpp
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libutils \
- libbinder \
- libtvbinder \
- libnativehelper \
- libandroid_runtime \
- liblog \
- libskia
-
-LOCAL_C_INCLUDES += \
- frameworks/base/core/jni \
- $(LOCAL_PATH)/../ \
- external/skia/include \
-
-LOCAL_MODULE:= libtv_jni
-LOCAL_PRELINK_MODULE := false
-include $(BUILD_SHARED_LIBRARY)
-
-
-
-
-#cfbc communication jni lib
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_C_INCLUDES += \
- frameworks/base/core/jni \
- $(LOCAL_PATH)/../../libtv \
- $(LOCAL_PATH)/../../libtv/tv \
- bionic/libc/include \
- bionic/libc/private \
- system/extras/ext4_utils \
- bionic/libc/include
-
-LOCAL_SRC_FILES := \
- ../../libtv/tv/CTvLog.cpp \
- ../../libtv/tvutils/CFile.cpp \
- ../../libtv/tvutils/CThread.cpp \
- ../../libtv/tvutils/CMsgQueue.cpp \
- ../../libtv/tvutils/zepoll.cpp \
- ../../libtv/tv/CFbcCommunication.cpp \
- ../../libtv/tvutils/serial_base.cpp \
- ../../libtv/tvutils/CSerialPort.cpp \
- ../../libtv/tvutils/CHdmiCecCmd.cpp \
- cfbc_jni.cpp \
- cfbc_test.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libutils \
- libandroid_runtime \
- liblog \
- libdl
-
-LOCAL_MODULE:= libcfbc_jni
-LOCAL_PRELINK_MODULE := false
-#include $(BUILD_EXECUTABLE)
-#include $(BUILD_SHARED_LIBRARY)
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES:= \
+ com_droidlogic_app_tv_TvControlManager.cpp
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libutils \
+ libbinder \
+ libtvbinder \
+ libnativehelper \
+ libandroid_runtime \
+ liblog \
+ libskia
+
+LOCAL_C_INCLUDES += \
+ frameworks/base/core/jni \
+ frameworks/base/core/jni/android/graphics \
+ frameworks/base/libs/hwui \
+ $(LOCAL_PATH)/../ \
+ external/skia/include \
+
+LOCAL_MODULE:= libtv_jni
+LOCAL_PRELINK_MODULE := false
+include $(BUILD_SHARED_LIBRARY)
+
+
+
+
+#cfbc communication jni lib
+include $(CLEAR_VARS)
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_C_INCLUDES += \
+ frameworks/base/core/jni \
+ $(LOCAL_PATH)/../../libtv \
+ external/skia/include \
+ $(LOCAL_PATH)/../../libtv/tv \
+ bionic/libc/include \
+ bionic/libc/private \
+ system/extras/ext4_utils \
+ bionic/libc/include
+
+LOCAL_SRC_FILES := \
+ ../../libtv/tv/CTvLog.cpp \
+ ../../libtv/tvutils/CFile.cpp \
+ ../../libtv/tvutils/CThread.cpp \
+ ../../libtv/tvutils/CMsgQueue.cpp \
+ ../../libtv/tvutils/zepoll.cpp \
+ ../../libtv/tv/CFbcCommunication.cpp \
+ ../../libtv/tvutils/serial_base.cpp \
+ ../../libtv/tvutils/CSerialPort.cpp \
+ ../../libtv/tvutils/CHdmiCecCmd.cpp \
+ cfbc_jni.cpp \
+ cfbc_test.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libutils \
+ libandroid_runtime \
+ liblog \
+ libdl
+
+LOCAL_MODULE:= libcfbc_jni
+LOCAL_PRELINK_MODULE := false
+#include $(BUILD_EXECUTABLE)
+#include $(BUILD_SHARED_LIBRARY)
diff --git a/tvapi/android/jni/cfbc_jni.cpp b/tvapi/android/jni/cfbc_jni.cpp
index edfb575..e531de7 100644
--- a/tvapi/android/jni/cfbc_jni.cpp
+++ b/tvapi/android/jni/cfbc_jni.cpp
@@ -54,17 +54,17 @@ void java_jni_callback(char *str, int cnt, int data_buf[])
{
char temp_str[MAX_CNT];
int idx = 0;
- if(str != NULL && cnt > 0) {
+ if (str != NULL && cnt > 0) {
memset(temp_str, 0, sizeof(temp_str));
JNI_DBG("java jni string is:\n%s, cnt:%d.", str, cnt);
//strcpy(temp_str, "Call From C/C++!");
memcpy(temp_str, str, strlen(str) % MAX_CNT);
- if(NULL != jni_local_obj) {
+ if (NULL != jni_local_obj) {
bool needsDetach = false;
jint j_cnt = data_buf[1];
jint j_data_buf[MAX_CNT];
- for(idx = 0; idx < j_cnt; idx++) {
+ for (idx = 0; idx < j_cnt; idx++) {
idx %= MAX_CNT;
j_data_buf[idx] = data_buf[idx];
JNI_DBG("java_jni_callback the %d data is:0x%x, %d.", idx, j_data_buf[idx], data_buf[idx]);
@@ -89,7 +89,7 @@ void java_jni_callback(char *str, int cnt, int data_buf[])
//jni_local_env->ReleaseIntArrayElements(cc_cmd_arr, temp_cmd, 0);
JNI_DBG("%s %d be called.", __FUNCTION__, __LINE__);
- if(needsDetach) {
+ if (needsDetach) {
detachJNI();
}
}
@@ -105,12 +105,12 @@ static jint jni_java_exec_cmd(JNIEnv *env, jobject obj, jintArray cmdArray)
int cmd_cnt = arry[1], idx = 0;
int cmd_array[MAX_CNT];
memset(cmd_array, 0, sizeof(cmd_array));
- for(idx = 0; idx < cmd_cnt; idx++)
+ for (idx = 0; idx < cmd_cnt; idx++)
cmd_array[idx] = arry[idx];
JNI_DBG("%s %s %d be called.", __FILE__, __FUNCTION__, __LINE__);
- if(g_cfbc_handle == NULL) {
+ if (g_cfbc_handle == NULL) {
g_cfbc_handle = new CFbcCommunication();
g_cfbc_handle->run("cfbc_thread", 0, 0);
}
@@ -118,7 +118,7 @@ static jint jni_java_exec_cmd(JNIEnv *env, jobject obj, jintArray cmdArray)
//g_cfbc_handle->handleCmd(COMM_DEV_CEC, cmd_array);
//c_exec_cmd(cmd_array);
- if(NULL == jni_local_obj) {
+ if (NULL == jni_local_obj) {
jni_local_obj = env->NewGlobalRef(obj);
}
@@ -126,8 +126,8 @@ static jint jni_java_exec_cmd(JNIEnv *env, jobject obj, jintArray cmdArray)
/* this is used to terminate the jni call if needed
** and we should handle the pthread we create in c layer
*/
- if(cmd_array[0] == 0x1002) {
- if(NULL != jni_local_obj)
+ if (cmd_array[0] == 0x1002) {
+ if (NULL != jni_local_obj)
env->DeleteGlobalRef(jni_local_obj);
}
#endif
diff --git a/tvapi/android/jni/cfbc_test.cpp b/tvapi/android/jni/cfbc_test.cpp
index 03f716b..00efa84 100644
--- a/tvapi/android/jni/cfbc_test.cpp
+++ b/tvapi/android/jni/cfbc_test.cpp
@@ -1,43 +1,43 @@
-#include "stdlib.h"
-#include "stdio.h"
-#include "tv/CFbcCommunication.h"
-
-int main(int argc, char **argv)
-{
- int idx = 0, send_buf[128], recv_buf[128], cmd_value = 1, run_flag = 0, run_cnt = 0, cmd_type = 0, read_flag = 0;
- printf("run begin.......\n");
- if(argc < 4) {
- printf("usage:./libcfbc_jni cmd_type cmd_value run_cnt(all hex mode)\n");
- return 0;
- }
-
- cmd_type = strtol(argv[1], NULL, 16);
- cmd_value = strtol(argv[2], NULL, 16);
- run_cnt = strtol(argv[3], NULL, 16);
-
- CFbcCommunication *cfbcHandle = new CFbcCommunication();
- printf("to test.......\n");
- cfbcHandle->run();
- sleep(0.2);
-
- switch(cmd_type) {
- default:
- for(idx = 0; idx < run_cnt; idx++) {
- memset(send_buf, 0, sizeof(send_buf));
- memset(recv_buf, 0, sizeof(recv_buf));
- send_buf[0] = cmd_type;
- send_buf[1] = 3;
- send_buf[2] = cmd_value;
- printf("\n\n======%d to set value is:0x%02x\n", idx, cmd_value);
- cfbcHandle->handleCmd(COMM_DEV_SERIAL, send_buf, recv_buf);
- sleep(1);
- }
- break;
- }
-
- printf("wait to exit......\n");
- cfbcHandle->requestExitAndWait();
- delete cfbcHandle;
- printf("program exited\n");
- return 0;
-}
+#include "stdlib.h"
+#include "stdio.h"
+#include "tv/CFbcCommunication.h"
+
+int main(int argc, char **argv)
+{
+ int idx = 0, send_buf[128], recv_buf[128], cmd_value = 1, run_flag = 0, run_cnt = 0, cmd_type = 0, read_flag = 0;
+ printf("run begin.......\n");
+ if (argc < 4) {
+ printf("usage:./libcfbc_jni cmd_type cmd_value run_cnt(all hex mode)\n");
+ return 0;
+ }
+
+ cmd_type = strtol(argv[1], NULL, 16);
+ cmd_value = strtol(argv[2], NULL, 16);
+ run_cnt = strtol(argv[3], NULL, 16);
+
+ CFbcCommunication *cfbcHandle = new CFbcCommunication();
+ printf("to test.......\n");
+ cfbcHandle->run();
+ sleep(0.2);
+
+ switch (cmd_type) {
+ default:
+ for (idx = 0; idx < run_cnt; idx++) {
+ memset(send_buf, 0, sizeof(send_buf));
+ memset(recv_buf, 0, sizeof(recv_buf));
+ send_buf[0] = cmd_type;
+ send_buf[1] = 3;
+ send_buf[2] = cmd_value;
+ printf("\n\n======%d to set value is:0x%02x\n", idx, cmd_value);
+ cfbcHandle->handleCmd(COMM_DEV_SERIAL, send_buf, recv_buf);
+ sleep(1);
+ }
+ break;
+ }
+
+ printf("wait to exit......\n");
+ cfbcHandle->requestExitAndWait();
+ delete cfbcHandle;
+ printf("program exited\n");
+ return 0;
+}
diff --git a/tvapi/android/jni/android_amlogic_tv.cpp b/tvapi/android/jni/com_droidlogic_app_tv_TvControlManager.cpp
index 28dc318..56ad946 100644
--- a/tvapi/android/jni/android_amlogic_tv.cpp
+++ b/tvapi/android/jni/com_droidlogic_app_tv_TvControlManager.cpp
@@ -1,455 +1,474 @@
-#define LOG_TAG "Tv-JNI"
-#include <utils/Log.h>
-
-#include "jni.h"
-#include "JNIHelp.h"
-#include "android_runtime/AndroidRuntime.h"
-#include <utils/Vector.h>
-#include <include/Tv.h>
-#include <binder/IMemory.h>
-#include <binder/Parcel.h>
-#include <binder/MemoryHeapBase.h>
-#include <binder/MemoryBase.h>
-#include <core/SkBitmap.h>
-#include "android_util_Binder.h"
-#include "android_os_Parcel.h"
-using namespace android;
-
-struct fields_t {
- jfieldID context;
- jmethodID post_event;
-};
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#define LOG_TAG "TvJNI"
-#endif
-
-static fields_t fields;
-static Mutex sLock;
-class JNITvContext: public TvListener {
-public:
- JNITvContext(JNIEnv *env, jobject weak_this, jclass clazz, const sp<Tv> &tv);
- ~JNITvContext()
- {
- release();
- }
- virtual void notify(int32_t msgType, const Parcel &p);
- void addCallbackBuffer(JNIEnv *env, jbyteArray cbb);
- sp<Tv> getTv()
- {
- Mutex::Autolock _l(mLock);
- return mTv;
- }
- void release();
- Parcel *mExtParcel;
-private:
- jobject mTvJObjectWeak; // weak reference to java object
- jclass mTvJClass; // strong reference to java class
- sp<Tv> mTv; // strong reference to native object
- Mutex mLock;
-
- Vector<jbyteArray> mCallbackBuffers; // Global reference application managed byte[]
- bool mManualBufferMode; // Whether to use application managed buffers.
- bool mManualTvCallbackSet; // Whether the callback has been set, used to reduce unnecessary calls to set the callback.
-};
-
-sp<Tv> get_native_tv(JNIEnv *env, jobject thiz, JNITvContext **pContext)
-{
- sp<Tv> tv;
- Mutex::Autolock _l(sLock);
- JNITvContext *context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context));
- if (context != NULL) {
- tv = context->getTv();
- }
- if (tv == 0) {
- jniThrowException(env, "java/lang/RuntimeException", "Method called after release()");
- }
-
- if (pContext != NULL) *pContext = context;
- return tv;
-}
-
-JNITvContext::JNITvContext(JNIEnv *env, jobject weak_this, jclass clazz, const sp<Tv> &tv)
-{
- mTvJObjectWeak = env->NewGlobalRef(weak_this);
- mTvJClass = (jclass)env->NewGlobalRef(clazz);
- mTv = tv;
- ALOGD("tvjni----------------------JNITvContext::JNITvContext(");
- mManualBufferMode = false;
- mManualTvCallbackSet = false;
- //mExtParcel = parcelForJavaObject(env, ext_parcel);
-}
-
-void JNITvContext::release()
-{
- ALOGD("release");
- Mutex::Autolock _l(mLock);
- JNIEnv *env = AndroidRuntime::getJNIEnv();
-
- if (mTvJObjectWeak != NULL) {
- env->DeleteGlobalRef(mTvJObjectWeak);
- mTvJObjectWeak = NULL;
- }
- if (mTvJClass != NULL) {
- env->DeleteGlobalRef(mTvJClass);
- mTvJClass = NULL;
- }
- mTv.clear();
-}
-
-// connect to tv service
-static void android_amlogic_Tv_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)
-{
- sp<Tv> tv = Tv::connect();
-
- ALOGD("android_amlogic_Tv_native_setup.");
-
- if (tv == NULL) {
- jniThrowException(env, "java/lang/RuntimeException", "Fail to connect to tv service");
- return;
- }
-
- // make sure tv amlogic is alive
- if (tv->getStatus() != NO_ERROR) {
- jniThrowException(env, "java/lang/RuntimeException", "Tv initialization failed!");
- return;
- }
-
- jclass clazz = env->GetObjectClass(thiz);
- if (clazz == NULL) {
- jniThrowException(env, "java/lang/RuntimeException", "Can't find android/amlogic/Tv!");
- return;
- }
-
- sp<JNITvContext> context = new JNITvContext(env, weak_this, clazz, tv);
- context->incStrong(thiz);
- tv->setListener(context);
-
- env->SetIntField(thiz, fields.context, (int)context.get());
-}
-
-
-static void android_amlogic_Tv_release(JNIEnv *env, jobject thiz)
-{
- // TODO: Change to LOGE
- JNITvContext *context = NULL;
- sp<Tv> tv;
- {
- Mutex::Autolock _l(sLock);
- context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context));
-
- // Make sure we do not attempt to callback on a deleted Java object.
- env->SetIntField(thiz, fields.context, 0);
- }
-
- ALOGD("release tv");
-
- // clean up if release has not been called before
- if (context != NULL) {
- tv = context->getTv();
- context->release();
- ALOGD("native_release: context=%p tv=%p", context, tv.get());
-
- // clear callbacks
- if (tv != NULL) {
- //tv->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_NOOP);
- tv->disconnect();
- }
-
- // remove context to prevent further Java access
- context->decStrong(thiz);
- }
-}
-
-void JNITvContext::notify(int32_t msgType, const Parcel &p)
-{
- // VM pointer will be NULL if object is released
- Mutex::Autolock _l(mLock);
- if (mTvJObjectWeak == NULL) {
- ALOGW("callback on dead tv object");
- return;
- }
-
- JNIEnv *env = AndroidRuntime::getJNIEnv();
-
- jobject jParcel = createJavaParcelObject(env);
- if (jParcel != NULL) {
- Parcel *nativeParcel = parcelForJavaObject(env, jParcel);
- nativeParcel->write(p.data(), p.dataSize());
- env->CallStaticVoidMethod(mTvJClass, fields.post_event, mTvJObjectWeak, msgType, jParcel);
- env->DeleteLocalRef(jParcel);
- }
-}
-
-
-void JNITvContext::addCallbackBuffer(JNIEnv *env, jbyteArray cbb)
-{
- if (cbb != NULL) {
- Mutex::Autolock _l(mLock);
- jbyteArray callbackBuffer = (jbyteArray)env->NewGlobalRef(cbb);
- mCallbackBuffers.push(cbb);
- ALOGD("Adding callback buffer to queue, %d total", mCallbackBuffers.size());
- } else {
- ALOGE("Null byte array!");
- }
-}
-
-static jint android_amlogic_Tv_processCmd(JNIEnv *env, jobject thiz, jobject pObj, jobject rObj)
-{
- sp<Tv> tv = get_native_tv(env, thiz, NULL);
- if (tv == 0) return -1;
-
- Parcel *p = parcelForJavaObject(env, pObj);
- //jclass clazz;
- //clazz = env->FindClass("android/os/Parcel");
- //LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Parcel");
-
-
- //jmethodID mConstructor = env->GetMethodID(clazz, "<init>", "(I)V");
- //jobject replayobj = env->NewObject(clazz, mConstructor, 0);
- Parcel *r = parcelForJavaObject(env, rObj);
-
-
- return tv->processCmd(*p, r);
- //if ( != NO_ERROR) {
- // jniThrowException(env, "java/lang/RuntimeException", "StartTv failed");
- // return -1;
- // }
- //return 0;
-}
-
-static void android_amlogic_Tv_addCallbackBuffer(JNIEnv *env, jobject thiz, jbyteArray bytes)
-{
- JNITvContext *context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context));
-
- ALOGD("addCallbackBuffer");
- if (context != NULL) {
- context->addCallbackBuffer(env, bytes);
- }
-}
-
-static void android_amlogic_Tv_reconnect(JNIEnv *env, jobject thiz)
-{
- sp<Tv> tv = get_native_tv(env, thiz, NULL);
- if (tv == 0) return;
-
- if (tv->reconnect() != NO_ERROR) {
- jniThrowException(env, "java/io/IOException", "reconnect failed");
- return;
- }
-}
-
-static void android_amlogic_Tv_lock(JNIEnv *env, jobject thiz)
-{
- sp<Tv> tv = get_native_tv(env, thiz, NULL);
- if (tv == 0) return;
-
- ALOGD("lock");
-
- if (tv->lock() != NO_ERROR) {
- jniThrowException(env, "java/lang/RuntimeException", "lock failed");
- }
-}
-
-static void android_amlogic_Tv_unlock(JNIEnv *env, jobject thiz)
-{
- sp<Tv> tv = get_native_tv(env, thiz, NULL);
- if (tv == 0) return;
-
- ALOGD("unlock");
-
- if (tv->unlock() != NO_ERROR) {
- jniThrowException(env, "java/lang/RuntimeException", "unlock failed");
- }
-}
-
-static void android_amlogic_Tv_create_subtitle_bitmap(JNIEnv *env, jobject thiz, jobject bmpobj)
-{
- ALOGD("create subtitle bmp");
- sp<Tv> tv = get_native_tv(env, thiz, NULL);
- if (tv == 0) return;
-
- //get skbitmap
- jclass bmp_clazz;
- jfieldID skbmp_fid;
- jint hbmp;
- bmp_clazz = env->FindClass("android/graphics/Bitmap");
- skbmp_fid = env->GetFieldID(bmp_clazz, "mNativeBitmap", "I");
- hbmp = env->GetIntField(bmpobj, skbmp_fid);
- SkBitmap *pSkBmp = reinterpret_cast<SkBitmap *>(hbmp);
- ALOGD("pSkBmp = %d", hbmp);
- ALOGD("bmp width = %d height = %d", pSkBmp->width(), pSkBmp->height());
- env->DeleteLocalRef(bmp_clazz);
-
- //alloc share mem
- sp<MemoryHeapBase> MemHeap = new MemoryHeapBase(1920 * 1080 * 4, 0, "subtitle bmp");
- ALOGD("heap id = %d", MemHeap->getHeapID());
- if (MemHeap->getHeapID() < 0) {
- return;
- }
- sp<MemoryBase> MemBase = new MemoryBase(MemHeap, 0, 1920 * 1080 * 4);
- pSkBmp->setPixels(MemBase->pointer());
-
-
- //send share mem to server
- tv->createSubtitle(MemBase);
- return;
-}
-
-static void android_amlogic_Tv_create_video_frame_bitmap(JNIEnv *env, jobject thiz, jobject bmpobj )
-{
- ALOGD("create video frame bmp");
- sp<Tv> tv = get_native_tv(env, thiz, NULL);
- if (tv == 0) return;
-
- //get skbitmap
- jclass bmp_clazz;
- jfieldID skbmp_fid;
- jint hbmp;
- bmp_clazz = env->FindClass("android/graphics/Bitmap");
- skbmp_fid = env->GetFieldID(bmp_clazz, "mNativeBitmap", "I");
- hbmp = env->GetIntField(bmpobj, skbmp_fid);
- SkBitmap *pSkBmp = reinterpret_cast<SkBitmap *>(hbmp);
- ALOGD("pSkBmp = %d", hbmp);
- ALOGD("bmp width = %d height = %d", pSkBmp->width(), pSkBmp->height());
- env->DeleteLocalRef(bmp_clazz);
-
- //alloc share mem
- sp<MemoryHeapBase> MemHeap = new MemoryHeapBase(1280 * 720 * 4 + 1, 0, "video frame bmp");
- ALOGD("heap id = %d", MemHeap->getHeapID());
- if (MemHeap->getHeapID() < 0) {
- return;
- }
- sp<MemoryBase> MemBase = new MemoryBase(MemHeap, 0, 1280 * 720 * 4 + 1);
- pSkBmp->setPixels(MemBase->pointer());
-
-
- //send share mem to server
- tv->createVideoFrame(MemBase);
- return;
-}
-
-//-------------------------------------------------
-
-static JNINativeMethod camMethods[] = {
- {
- "native_setup",
- "(Ljava/lang/Object;)V",
- (void *)android_amlogic_Tv_native_setup
- },
- {
- "native_release",
- "()V",
- (void *)android_amlogic_Tv_release
- },
- {
- "processCmd",
- "(Landroid/os/Parcel;Landroid/os/Parcel;)I",
- (void *)android_amlogic_Tv_processCmd
- },
- {
- "addCallbackBuffer",
- "([B)V",
- (void *)android_amlogic_Tv_addCallbackBuffer
- },
- {
- "reconnect",
- "()V",
- (void *)android_amlogic_Tv_reconnect
- },
- {
- "lock",
- "()V",
- (void *)android_amlogic_Tv_lock
- },
- {
- "unlock",
- "()V",
- (void *)android_amlogic_Tv_unlock
- },
- {
- "native_create_subtitle_bitmap",
- "(Ljava/lang/Object;)V",
- (void *)android_amlogic_Tv_create_subtitle_bitmap
- },
- {
- "native_create_video_frame_bitmap",
- "(Ljava/lang/Object;)V",
- (void *)android_amlogic_Tv_create_video_frame_bitmap
- },
-
-};
-
-struct field {
- const char *class_name;
- const char *field_name;
- const char *field_type;
- jfieldID *jfield;
-};
-
-static int find_fields(JNIEnv *env, field *fields, int count)
-{
- for (int i = 0; i < count; i++) {
- field *f = &fields[i];
- jclass clazz = env->FindClass(f->class_name);
- if (clazz == NULL) {
- ALOGE("Can't find %s", f->class_name);
- return -1;
- }
-
- jfieldID field = env->GetFieldID(clazz, f->field_name, f->field_type);
- if (field == NULL) {
- ALOGE("Can't find %s.%s", f->class_name, f->field_name);
- return -1;
- }
-
- *(f->jfield) = field;
- }
-
- return 0;
-}
-
-// Get all the required offsets in java class and register native functions
-int register_android_amlogic_Tv(JNIEnv *env)
-{
- field fields_to_find[] = {
- { "android/amlogic/Tv", "mNativeContext", "I", &fields.context }
- };
-
- ALOGD("register_android_amlogic_Tv.");
-
- if (find_fields(env, fields_to_find, NELEM(fields_to_find)) < 0)
- return -1;
-
- jclass clazz = env->FindClass("android/amlogic/Tv");
- fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative", "(Ljava/lang/Object;ILandroid/os/Parcel;)V");
- if (fields.post_event == NULL) {
- ALOGE("Can't find android/amlogic/Tv.postEventFromNative");
- return -1;
- }
-
- // Register native functions
- return AndroidRuntime::registerNativeMethods(env, "android/amlogic/Tv", camMethods, NELEM(camMethods));
-}
-
-
-jint JNI_OnLoad(JavaVM *vm, void *reserved)
-{
- JNIEnv *env = NULL;
- jint result = -1;
-
- if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
- ALOGE("ERROR: GetEnv failed\n");
- goto bail;
- }
- assert(env != NULL);
-
- register_android_amlogic_Tv(env);
-
- /* success -- return valid version number */
- result = JNI_VERSION_1_4;
-bail:
- return result;
-}
-
+#define LOG_TAG "Tv-JNI"
+#include <utils/Log.h>
+
+#include "../include/tvcmd.h"
+#include "jni.h"
+#include "JNIHelp.h"
+#include "GraphicsJNI.h"
+#include "android_runtime/AndroidRuntime.h"
+#include <utils/Vector.h>
+#include <include/Tv.h>
+#include <binder/IMemory.h>
+#include <binder/Parcel.h>
+#include <binder/MemoryHeapBase.h>
+#include <binder/MemoryBase.h>
+#include <core/SkBitmap.h>
+#include "android_util_Binder.h"
+#include "android_os_Parcel.h"
+using namespace android;
+
+struct fields_t {
+ jfieldID context;
+ jmethodID post_event;
+};
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "TvJNI"
+#endif
+
+static fields_t fields;
+static Mutex sLock;
+class JNITvContext: public TvListener {
+public:
+ JNITvContext(JNIEnv *env, jobject weak_this, jclass clazz, const sp<Tv> &tv);
+ ~JNITvContext()
+ {
+ release();
+ }
+ virtual void notify(int32_t msgType, const Parcel &p);
+ void addCallbackBuffer(JNIEnv *env, jbyteArray cbb);
+ sp<Tv> getTv()
+ {
+ Mutex::Autolock _l(mLock);
+ return mTv;
+ }
+ void release();
+ Parcel *mExtParcel;
+ SkBitmap *pSubBmp;//for UI subtitle Bitmap
+ sp<MemoryBase> mSubMemBase;//for subtitle shar memory to tvapi
+private:
+ jobject mTvJObjectWeak; // weak reference to java object
+ jclass mTvJClass; // strong reference to java class
+ sp<Tv> mTv; // strong reference to native object
+ Mutex mLock;
+
+ Vector<jbyteArray> mCallbackBuffers; // Global reference application managed byte[]
+ bool mManualBufferMode; // Whether to use application managed buffers.
+ bool mManualTvCallbackSet; // Whether the callback has been set, used to reduce unnecessary calls to set the callback.
+};
+
+sp<Tv> get_native_tv(JNIEnv *env, jobject thiz, JNITvContext **pContext)
+{
+ sp<Tv> tv;
+ Mutex::Autolock _l(sLock);
+ JNITvContext *context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context));
+ if (context != NULL) {
+ tv = context->getTv();
+ }
+ if (tv == 0) {
+ jniThrowException(env, "java/lang/RuntimeException", "Method called after release()");
+ }
+
+ if (pContext != NULL) *pContext = context;
+ return tv;
+}
+
+JNITvContext::JNITvContext(JNIEnv *env, jobject weak_this, jclass clazz, const sp<Tv> &tv)
+{
+ mTvJObjectWeak = env->NewGlobalRef(weak_this);
+ mTvJClass = (jclass)env->NewGlobalRef(clazz);
+ mTv = tv;
+ ALOGD("tvjni----------------------JNITvContext::JNITvContext(");
+ mManualBufferMode = false;
+ mManualTvCallbackSet = false;
+ pSubBmp = NULL;
+ mSubMemBase = NULL;
+ //mExtParcel = parcelForJavaObject(env, ext_parcel);
+}
+
+void JNITvContext::release()
+{
+ ALOGD("release");
+ Mutex::Autolock _l(mLock);
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+
+ if (mTvJObjectWeak != NULL) {
+ env->DeleteGlobalRef(mTvJObjectWeak);
+ mTvJObjectWeak = NULL;
+ }
+ if (mTvJClass != NULL) {
+ env->DeleteGlobalRef(mTvJClass);
+ mTvJClass = NULL;
+ }
+ if (pSubBmp != NULL) {
+ pSubBmp = NULL;
+ }
+ mTv.clear();
+}
+
+// connect to tv service
+static void com_droidlogic_app_tv_TvControlManager_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)
+{
+ sp<Tv> tv = Tv::connect();
+
+ ALOGD("com_droidlogic_app_tv_TvControlManager_native_setup.");
+
+ if (tv == NULL) {
+ jniThrowException(env, "java/lang/RuntimeException", "Fail to connect to tv service");
+ return;
+ }
+
+ // make sure tv amlogic is alive
+ if (tv->getStatus() != NO_ERROR) {
+ jniThrowException(env, "java/lang/RuntimeException", "Tv initialization failed!");
+ return;
+ }
+
+ jclass clazz = env->GetObjectClass(thiz);
+ if (clazz == NULL) {
+ jniThrowException(env, "java/lang/RuntimeException", "Can't find com/droidlogic/app/tv/TvControlManager!");
+ return;
+ }
+
+ sp<JNITvContext> context = new JNITvContext(env, weak_this, clazz, tv);
+ context->incStrong(thiz);
+ tv->setListener(context);
+
+ env->SetIntField(thiz, fields.context, (int)context.get());
+}
+
+
+static void com_droidlogic_app_tv_TvControlManager_release(JNIEnv *env, jobject thiz)
+{
+ // TODO: Change to LOGE
+ JNITvContext *context = NULL;
+ sp<Tv> tv;
+ {
+ Mutex::Autolock _l(sLock);
+ context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context));
+
+ // Make sure we do not attempt to callback on a deleted Java object.
+ env->SetIntField(thiz, fields.context, 0);
+ }
+
+ ALOGD("release tv");
+
+ // clean up if release has not been called before
+ if (context != NULL) {
+ tv = context->getTv();
+ context->release();
+ ALOGD("native_release: context=%p tv=%p", context, tv.get());
+
+ // clear callbacks
+ if (tv != NULL) {
+ //tv->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_NOOP);
+ tv->disconnect();
+ }
+
+ // remove context to prevent further Java access
+ context->decStrong(thiz);
+ }
+}
+
+void JNITvContext::notify(int32_t msgType, const Parcel &p)
+{
+ // VM pointer will be NULL if object is released
+ Mutex::Autolock _l(mLock);
+ if (mTvJObjectWeak == NULL) {
+ ALOGW("callback on dead tv object");
+ return;
+ }
+ if (msgType == SUBTITLE_UPDATE_CALLBACK) {
+ if (pSubBmp) {
+ SkAutoLockPixels alp(*pSubBmp);
+ char *pDst = (char *) pSubBmp->getPixels();
+ char *pBuf = (char *) mSubMemBase->pointer();
+ for (int i = 0; i < pSubBmp->width() * pSubBmp->height() * 4; i++) {
+ pDst[i] = pBuf[i];
+ }
+ pSubBmp->notifyPixelsChanged();
+ }
+ }
+
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+
+ jobject jParcel = createJavaParcelObject(env);
+ if (jParcel != NULL) {
+ Parcel *nativeParcel = parcelForJavaObject(env, jParcel);
+ nativeParcel->write(p.data(), p.dataSize());
+ env->CallStaticVoidMethod(mTvJClass, fields.post_event, mTvJObjectWeak, msgType, jParcel);
+ env->DeleteLocalRef(jParcel);
+ }
+}
+
+
+void JNITvContext::addCallbackBuffer(JNIEnv *env, jbyteArray cbb)
+{
+ if (cbb != NULL) {
+ Mutex::Autolock _l(mLock);
+ jbyteArray callbackBuffer = (jbyteArray)env->NewGlobalRef(cbb);
+ mCallbackBuffers.push(cbb);
+ ALOGD("Adding callback buffer to queue, %d total", mCallbackBuffers.size());
+ } else {
+ ALOGE("Null byte array!");
+ }
+}
+
+static jint com_droidlogic_app_tv_TvControlManager_processCmd(JNIEnv *env, jobject thiz, jobject pObj, jobject rObj)
+{
+ sp<Tv> tv = get_native_tv(env, thiz, NULL);
+ if (tv == 0) return -1;
+
+ Parcel *p = parcelForJavaObject(env, pObj);
+ //jclass clazz;
+ //clazz = env->FindClass("android/os/Parcel");
+ //LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Parcel");
+
+
+ //jmethodID mConstructor = env->GetMethodID(clazz, "<init>", "(I)V");
+ //jobject replayobj = env->NewObject(clazz, mConstructor, 0);
+ Parcel *r = parcelForJavaObject(env, rObj);
+
+
+ return tv->processCmd(*p, r);
+ //if ( != NO_ERROR) {
+ // jniThrowException(env, "java/lang/RuntimeException", "StartTv failed");
+ // return -1;
+ // }
+ //return 0;
+}
+
+static void com_droidlogic_app_tv_TvControlManager_addCallbackBuffer(JNIEnv *env, jobject thiz, jbyteArray bytes)
+{
+ JNITvContext *context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context));
+
+ ALOGD("addCallbackBuffer");
+ if (context != NULL) {
+ context->addCallbackBuffer(env, bytes);
+ }
+}
+
+static void com_droidlogic_app_tv_TvControlManager_reconnect(JNIEnv *env, jobject thiz)
+{
+ sp<Tv> tv = get_native_tv(env, thiz, NULL);
+ if (tv == 0) return;
+
+ if (tv->reconnect() != NO_ERROR) {
+ jniThrowException(env, "java/io/IOException", "reconnect failed");
+ return;
+ }
+}
+
+static void com_droidlogic_app_tv_TvControlManager_lock(JNIEnv *env, jobject thiz)
+{
+ sp<Tv> tv = get_native_tv(env, thiz, NULL);
+ if (tv == 0) return;
+
+ ALOGD("lock");
+
+ if (tv->lock() != NO_ERROR) {
+ jniThrowException(env, "java/lang/RuntimeException", "lock failed");
+ }
+}
+
+static void com_droidlogic_app_tv_TvControlManager_unlock(JNIEnv *env, jobject thiz)
+{
+ sp<Tv> tv = get_native_tv(env, thiz, NULL);
+ if (tv == 0) return;
+
+ ALOGD("unlock");
+
+ if (tv->unlock() != NO_ERROR) {
+ jniThrowException(env, "java/lang/RuntimeException", "unlock failed");
+ }
+}
+
+static void com_droidlogic_app_tv_TvControlManager_create_subtitle_bitmap(JNIEnv *env, jobject thiz, jobject bmpobj)
+{
+ ALOGD("create subtitle bmp");
+ JNITvContext *context = reinterpret_cast<JNITvContext *>(env->GetIntField(thiz, fields.context));
+ sp<Tv> tv = get_native_tv(env, thiz, NULL);
+ if (tv == 0) return;
+
+ //get skbitmap
+ jclass bmp_clazz;
+ jfieldID skbmp_fid;
+ jint hbmp;
+ bmp_clazz = env->FindClass("android/graphics/Bitmap");
+ skbmp_fid = env->GetFieldID(bmp_clazz, "mNativeBitmap", "I");
+ hbmp = env->GetIntField(bmpobj, skbmp_fid);
+ context->pSubBmp = reinterpret_cast<SkBitmap *>(hbmp);
+ env->DeleteLocalRef(bmp_clazz);
+
+ //alloc share mem
+ sp<MemoryHeapBase> MemHeap = new MemoryHeapBase(context->pSubBmp->width()*context->pSubBmp->height() * 4, 0, "subtitle bmp");
+ ALOGD("heap id = %d", MemHeap->getHeapID());
+ if (MemHeap->getHeapID() < 0) {
+ return;
+ }
+ context->pSubBmp->lockPixels();
+ context->mSubMemBase = new MemoryBase(MemHeap, 0, context->pSubBmp->width()*context->pSubBmp->height() * 4);
+
+
+ //send share mem to server
+ tv->createSubtitle(context->mSubMemBase);
+ return;
+}
+
+static void com_droidlogic_app_tv_TvControlManager_create_video_frame_bitmap(JNIEnv *env, jobject thiz, jobject bmpobj, jint inputSourceMode, jint iCapVideoLayer )
+{
+ ALOGD("create video frame bmp");
+ sp<Tv> tv = get_native_tv(env, thiz, NULL);
+ if (tv == 0) return;
+
+ //get skbitmap
+ jclass bmp_clazz;
+ jfieldID skbmp_fid;
+ jint hbmp;
+ bmp_clazz = env->FindClass("android/graphics/Bitmap");
+ skbmp_fid = env->GetFieldID(bmp_clazz, "mNativeBitmap", "I");
+ hbmp = env->GetIntField(bmpobj, skbmp_fid);
+ SkBitmap *pSkBmp = reinterpret_cast<SkBitmap *>(hbmp);
+ ALOGD("pSkBmp = %d", hbmp);
+ ALOGD("bmp width = %d height = %d", pSkBmp->width(), pSkBmp->height());
+ env->DeleteLocalRef(bmp_clazz);
+
+ //alloc share mem
+ sp<MemoryHeapBase> MemHeap = new MemoryHeapBase(1920 * 1080 * 4, 0, "video frame bmp");
+ ALOGD("heap id = %d", MemHeap->getHeapID());
+ if (MemHeap->getHeapID() < 0) {
+ return;
+ }
+ sp<MemoryBase> MemBase = new MemoryBase(MemHeap, 0, 1920 * 1080 * 4);
+ pSkBmp->setPixels(MemBase->pointer());
+
+
+ //send share mem to server
+ tv->createVideoFrame(MemBase, inputSourceMode, iCapVideoLayer);
+ return;
+}
+
+//-------------------------------------------------
+
+static JNINativeMethod camMethods[] = {
+ {
+ "native_setup",
+ "(Ljava/lang/Object;)V",
+ (void *)com_droidlogic_app_tv_TvControlManager_native_setup
+ },
+ {
+ "native_release",
+ "()V",
+ (void *)com_droidlogic_app_tv_TvControlManager_release
+ },
+ {
+ "processCmd",
+ "(Landroid/os/Parcel;Landroid/os/Parcel;)I",
+ (void *)com_droidlogic_app_tv_TvControlManager_processCmd
+ },
+ {
+ "addCallbackBuffer",
+ "([B)V",
+ (void *)com_droidlogic_app_tv_TvControlManager_addCallbackBuffer
+ },
+ {
+ "reconnect",
+ "()V",
+ (void *)com_droidlogic_app_tv_TvControlManager_reconnect
+ },
+ {
+ "lock",
+ "()V",
+ (void *)com_droidlogic_app_tv_TvControlManager_lock
+ },
+ {
+ "unlock",
+ "()V",
+ (void *)com_droidlogic_app_tv_TvControlManager_unlock
+ },
+ {
+ "native_create_subtitle_bitmap",
+ "(Ljava/lang/Object;)V",
+ (void *)com_droidlogic_app_tv_TvControlManager_create_subtitle_bitmap
+ },
+ {
+ "native_create_video_frame_bitmap",
+ "(Ljava/lang/Object;)V",
+ (void *)com_droidlogic_app_tv_TvControlManager_create_video_frame_bitmap
+ },
+
+};
+
+struct field {
+ const char *class_name;
+ const char *field_name;
+ const char *field_type;
+ jfieldID *jfield;
+};
+
+static int find_fields(JNIEnv *env, field *fields, int count)
+{
+ for (int i = 0; i < count; i++) {
+ field *f = &fields[i];
+ jclass clazz = env->FindClass(f->class_name);
+ if (clazz == NULL) {
+ ALOGE("Can't find %s", f->class_name);
+ return -1;
+ }
+
+ jfieldID field = env->GetFieldID(clazz, f->field_name, f->field_type);
+ if (field == NULL) {
+ ALOGE("Can't find %s.%s", f->class_name, f->field_name);
+ return -1;
+ }
+
+ *(f->jfield) = field;
+ }
+
+ return 0;
+}
+
+// Get all the required offsets in java class and register native functions
+int register_com_droidlogic_app_tv_TvControlManager(JNIEnv *env)
+{
+ field fields_to_find[] = {
+ { "com/droidlogic/app/tv/TvControlManager", "mNativeContext", "I", &fields.context }
+ };
+
+ ALOGD("register_com_droidlogic_app_tv_TvControlManager.");
+
+ if (find_fields(env, fields_to_find, NELEM(fields_to_find)) < 0)
+ return -1;
+
+ jclass clazz = env->FindClass("com/droidlogic/app/tv/TvControlManager");
+ fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative", "(Ljava/lang/Object;ILandroid/os/Parcel;)V");
+ if (fields.post_event == NULL) {
+ ALOGE("Can't find com/droidlogic/app/tv/TvControlManager.postEventFromNative");
+ return -1;
+ }
+
+ // Register native functions
+ return AndroidRuntime::registerNativeMethods(env, "com/droidlogic/app/tv/TvControlManager", camMethods, NELEM(camMethods));
+}
+
+
+jint JNI_OnLoad(JavaVM *vm, void *reserved)
+{
+ JNIEnv *env = NULL;
+ jint result = -1;
+
+ if (vm->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
+ ALOGE("ERROR: GetEnv failed\n");
+ goto bail;
+ }
+ assert(env != NULL);
+
+ register_com_droidlogic_app_tv_TvControlManager(env);
+
+ /* success -- return valid version number */
+ result = JNI_VERSION_1_4;
+bail:
+ return result;
+}
+
diff --git a/tvapi/android/libtvbinder/Android.mk b/tvapi/android/libtvbinder/Android.mk
index 061bec7..e7820a3 100644
--- a/tvapi/android/libtvbinder/Android.mk
+++ b/tvapi/android/libtvbinder/Android.mk
@@ -1,24 +1,24 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES:= \
- Tv.cpp \
- ITv.cpp \
- ITvClient.cpp \
- ITvService.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libutils \
- libbinder \
- libui
-
-LOCAL_MODULE:= libtvbinder
-
-LOCAL_C_INCLUDES += \
- $(LOCAL_PATH)/../
-
-LOCAL_PRELINK_MODULE := false
-include $(BUILD_SHARED_LIBRARY)
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES:= \
+ Tv.cpp \
+ ITv.cpp \
+ ITvClient.cpp \
+ ITvService.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libutils \
+ libbinder \
+ libui
+
+LOCAL_MODULE:= libtvbinder
+
+LOCAL_C_INCLUDES += \
+ $(LOCAL_PATH)/../
+
+LOCAL_PRELINK_MODULE := false
+include $(BUILD_SHARED_LIBRARY)
diff --git a/tvapi/android/libtvbinder/ITv.cpp b/tvapi/android/libtvbinder/ITv.cpp
index f32a1af..0be4f87 100644
--- a/tvapi/android/libtvbinder/ITv.cpp
+++ b/tvapi/android/libtvbinder/ITv.cpp
@@ -1,144 +1,148 @@
-//#define LOG_NDEBUG 0
-#define LOG_TAG "ITv"
-#include <utils/Log.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <binder/Parcel.h>
-#include <include/ITv.h>
-
-enum {
- DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
- START_PREVIEW,
- SEND_COMMAND,
- CONNECT,
- LOCK,
- UNLOCK,
- TV_CMD,
- TV_CREATE_SUBTITLE,
- TV_CREATE_VIDEO_FRAME,
-};
-
-class BpTv: public BpInterface<ITv> {
-public:
- BpTv(const sp<IBinder> &impl)
- : BpInterface<ITv>(impl)
- {
- }
-
- // disconnect from tv service
- void disconnect()
- {
- Parcel data, reply;
- data.writeInterfaceToken(ITv::getInterfaceDescriptor());
- remote()->transact(DISCONNECT, data, &reply);
- }
-
- status_t processCmd(const Parcel &p, Parcel *r)
- {
- Parcel data, reply;
- data.writeInterfaceToken(ITv::getInterfaceDescriptor());
- data.write(p.data(), p.dataSize());
- remote()->transact(TV_CMD, data, &reply);
- r->write(reply.data(), reply.dataSize());
- r->setDataPosition(0);
- return 0;
- }
-
- virtual status_t createVideoFrame(const sp<IMemory> &share_mem)
- {
- Parcel data, reply;
- data.writeInterfaceToken(ITv::getInterfaceDescriptor());
- data.writeStrongBinder(share_mem->asBinder());
- remote()->transact(TV_CREATE_VIDEO_FRAME, data, &reply);
- return reply.readInt32();
- }
-
- virtual status_t createSubtitle(const sp<IMemory> &share_mem)
- {
- Parcel data, reply;
- data.writeInterfaceToken(ITv::getInterfaceDescriptor());
- data.writeStrongBinder(share_mem->asBinder());
- remote()->transact(TV_CREATE_SUBTITLE, data, &reply);
- return reply.readInt32();
- }
- virtual status_t connect(const sp<ITvClient> &tvClient)
- {
- Parcel data, reply;
- data.writeInterfaceToken(ITv::getInterfaceDescriptor());
- data.writeStrongBinder(tvClient->asBinder());
- remote()->transact(CONNECT, data, &reply);
- return reply.readInt32();
- }
- virtual status_t lock()
- {
- Parcel data, reply;
- data.writeInterfaceToken(ITv::getInterfaceDescriptor());
- remote()->transact(LOCK, data, &reply);
- return reply.readInt32();
- }
- virtual status_t unlock()
- {
- Parcel data, reply;
- data.writeInterfaceToken(ITv::getInterfaceDescriptor());
- remote()->transact(UNLOCK, data, &reply);
- return reply.readInt32();
- }
-};
-
-IMPLEMENT_META_INTERFACE(Tv, "android.amlogic.ITv");
-
-status_t BnTv::onTransact(
- uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags)
-{
- switch(code) {
- case DISCONNECT: {
- CHECK_INTERFACE(ITv, data, reply);
- disconnect();
- return NO_ERROR;
- }
- break;
- case CONNECT: {
- CHECK_INTERFACE(ITv, data, reply);
- sp<ITvClient> tvClient = interface_cast<ITvClient>(data.readStrongBinder());
- reply->writeInt32(connect(tvClient));
- return NO_ERROR;
- }
- break;
- case LOCK: {
- CHECK_INTERFACE(ITv, data, reply);
- reply->writeInt32(lock());
- return NO_ERROR;
- }
- break;
- case UNLOCK: {
- CHECK_INTERFACE(ITv, data, reply);
- reply->writeInt32(unlock());
- return NO_ERROR;
- }
- break;
- case TV_CMD: {
- CHECK_INTERFACE(ITv, data, reply);
- processCmd(data, reply);
- //reply->write(tmp.data(), tmp.dataSize());
- return NO_ERROR;
- }
- case TV_CREATE_SUBTITLE: {
- CHECK_INTERFACE(ITv, data, reply);
- sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
- createSubtitle(buffer);
- //reply->write(tmp.data(), tmp.dataSize());
- return NO_ERROR;
- }
- case TV_CREATE_VIDEO_FRAME: {
- CHECK_INTERFACE(ITv, data, reply);
- sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
- createVideoFrame(buffer);
- //reply->write(tmp.data(), tmp.dataSize());
- return NO_ERROR;
- }
- break;
- default:
- return BBinder::onTransact(code, data, reply, flags);
- }
-}
-
+//#define LOG_NDEBUG 0
+#define LOG_TAG "ITv"
+#include <utils/Log.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <binder/Parcel.h>
+#include <include/ITv.h>
+
+enum {
+ DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
+ START_PREVIEW,
+ SEND_COMMAND,
+ CONNECT,
+ LOCK,
+ UNLOCK,
+ TV_CMD,
+ TV_CREATE_SUBTITLE,
+ TV_CREATE_VIDEO_FRAME,
+};
+
+class BpTv: public BpInterface<ITv> {
+public:
+ BpTv(const sp<IBinder> &impl)
+ : BpInterface<ITv>(impl)
+ {
+ }
+
+ // disconnect from tv service
+ void disconnect()
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(ITv::getInterfaceDescriptor());
+ remote()->transact(DISCONNECT, data, &reply);
+ }
+
+ status_t processCmd(const Parcel &p, Parcel *r)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(ITv::getInterfaceDescriptor());
+ data.write(p.data(), p.dataSize());
+ remote()->transact(TV_CMD, data, &reply);
+ r->write(reply.data(), reply.dataSize());
+ r->setDataPosition(0);
+ return 0;
+ }
+
+ virtual status_t createVideoFrame(const sp<IMemory> &share_mem, int iSourceMode, int iCapVideoLayerOnly)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(ITv::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(share_mem));
+ data.writeInt32(iSourceMode);
+ data.writeInt32(iCapVideoLayerOnly);
+ remote()->transact(TV_CREATE_VIDEO_FRAME, data, &reply);
+ return reply.readInt32();
+ }
+
+ virtual status_t createSubtitle(const sp<IMemory> &share_mem)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(ITv::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(share_mem));
+ remote()->transact(TV_CREATE_SUBTITLE, data, &reply);
+ return reply.readInt32();
+ }
+ virtual status_t connect(const sp<ITvClient> &tvClient)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(ITv::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(tvClient));
+ remote()->transact(CONNECT, data, &reply);
+ return reply.readInt32();
+ }
+ virtual status_t lock()
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(ITv::getInterfaceDescriptor());
+ remote()->transact(LOCK, data, &reply);
+ return reply.readInt32();
+ }
+ virtual status_t unlock()
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(ITv::getInterfaceDescriptor());
+ remote()->transact(UNLOCK, data, &reply);
+ return reply.readInt32();
+ }
+};
+
+IMPLEMENT_META_INTERFACE(Tv, "android.amlogic.ITv");
+
+status_t BnTv::onTransact(
+ uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags)
+{
+ switch (code) {
+ case DISCONNECT: {
+ CHECK_INTERFACE(ITv, data, reply);
+ disconnect();
+ return NO_ERROR;
+ }
+ break;
+ case CONNECT: {
+ CHECK_INTERFACE(ITv, data, reply);
+ sp<ITvClient> tvClient = interface_cast<ITvClient>(data.readStrongBinder());
+ reply->writeInt32(connect(tvClient));
+ return NO_ERROR;
+ }
+ break;
+ case LOCK: {
+ CHECK_INTERFACE(ITv, data, reply);
+ reply->writeInt32(lock());
+ return NO_ERROR;
+ }
+ break;
+ case UNLOCK: {
+ CHECK_INTERFACE(ITv, data, reply);
+ reply->writeInt32(unlock());
+ return NO_ERROR;
+ }
+ break;
+ case TV_CMD: {
+ CHECK_INTERFACE(ITv, data, reply);
+ processCmd(data, reply);
+ //reply->write(tmp.data(), tmp.dataSize());
+ return NO_ERROR;
+ }
+ case TV_CREATE_SUBTITLE: {
+ CHECK_INTERFACE(ITv, data, reply);
+ sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
+ createSubtitle(buffer);
+ //reply->write(tmp.data(), tmp.dataSize());
+ return NO_ERROR;
+ }
+ case TV_CREATE_VIDEO_FRAME: {
+ CHECK_INTERFACE(ITv, data, reply);
+ sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder());
+ int srcMode = data.readInt32();
+ int capVideoLayerOnly = data.readInt32();
+ createVideoFrame(buffer, srcMode, capVideoLayerOnly);
+ //reply->write(tmp.data(), tmp.dataSize());
+ return NO_ERROR;
+ }
+ break;
+ default:
+ return BBinder::onTransact(code, data, reply, flags);
+ }
+}
+
diff --git a/tvapi/android/libtvbinder/ITvClient.cpp b/tvapi/android/libtvbinder/ITvClient.cpp
index f348132..8ade96e 100644
--- a/tvapi/android/libtvbinder/ITvClient.cpp
+++ b/tvapi/android/libtvbinder/ITvClient.cpp
@@ -1,58 +1,58 @@
-#define LOG_TAG "ITvClient"
-#include <utils/Log.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <include/ITvClient.h>
-#include "../include/tvcmd.h"
-enum {
- NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION,
-};
-
-class BpTvClient: public BpInterface<ITvClient> {
-public:
- BpTvClient(const sp<IBinder> &impl) :
- BpInterface<ITvClient> (impl)
- {
- }
-
- // generic callback from tv service to app
- void notifyCallback(int32_t msgType, const Parcel &p)
- {
- ALOGV("BpTvClient notifyCallback datasize = %d pos = %d", p.dataSize(), p.dataPosition());
- Parcel data, reply;
- data.writeInterfaceToken(ITvClient::getInterfaceDescriptor());
- data.writeInt32(msgType);
- data.write(p.data(), p.dataSize());
- remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY);
- }
-};
-
-IMPLEMENT_META_INTERFACE(TvClient, "android.amlogic.ITvClient");
-
-// ----------------------------------------------------------------------
-status_t BnTvClient::onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags)
-{
- int i = 0, loop_count = 0;
-
- switch (code) {
- case NOTIFY_CALLBACK: {
- CHECK_INTERFACE(ITvClient, data, reply);
- Parcel ext;
- int32_t msgType = data.readInt32();
-
- ext.appendFrom(const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
-
-
- switch (msgType) {
- default:
- ALOGE("BnTvClient::onTransact NOTIFY_CALLBACK msg type ----= %d", msgType);
- break;
- }
- notifyCallback(msgType, ext);
- return NO_ERROR;
- }
- break;
- default:
- return BBinder::onTransact(code, data, reply, flags);
- }
-}
+#define LOG_TAG "ITvClient"
+#include <utils/Log.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <include/ITvClient.h>
+#include "../include/tvcmd.h"
+enum {
+ NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION,
+};
+
+class BpTvClient: public BpInterface<ITvClient> {
+public:
+ BpTvClient(const sp<IBinder> &impl) :
+ BpInterface<ITvClient> (impl)
+ {
+ }
+
+ // generic callback from tv service to app
+ void notifyCallback(int32_t msgType, const Parcel &p)
+ {
+ ALOGV("BpTvClient notifyCallback datasize = %d pos = %d", p.dataSize(), p.dataPosition());
+ Parcel data, reply;
+ data.writeInterfaceToken(ITvClient::getInterfaceDescriptor());
+ data.writeInt32(msgType);
+ data.write(p.data(), p.dataSize());
+ remote()->transact(NOTIFY_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY);
+ }
+};
+
+IMPLEMENT_META_INTERFACE(TvClient, "android.amlogic.ITvClient");
+
+// ----------------------------------------------------------------------
+status_t BnTvClient::onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags)
+{
+ int i = 0, loop_count = 0;
+
+ switch (code) {
+ case NOTIFY_CALLBACK: {
+ CHECK_INTERFACE(ITvClient, data, reply);
+ Parcel ext;
+ int32_t msgType = data.readInt32();
+
+ ext.appendFrom(const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
+
+
+ switch (msgType) {
+ default:
+ ALOGE("BnTvClient::onTransact NOTIFY_CALLBACK msg type ----= %d", msgType);
+ break;
+ }
+ notifyCallback(msgType, ext);
+ return NO_ERROR;
+ }
+ break;
+ default:
+ return BBinder::onTransact(code, data, reply, flags);
+ }
+}
diff --git a/tvapi/android/libtvbinder/ITvService.cpp b/tvapi/android/libtvbinder/ITvService.cpp
index b56fea0..041f660 100644
--- a/tvapi/android/libtvbinder/ITvService.cpp
+++ b/tvapi/android/libtvbinder/ITvService.cpp
@@ -1,50 +1,50 @@
-
-#include <stdint.h>
-#include <sys/types.h>
-#include <utils/Log.h>
-#include <binder/Parcel.h>
-#include <binder/IPCThreadState.h>
-#include <binder/IServiceManager.h>
-
-#include <include/ITvService.h>
-
-class BpTvService: public BpInterface<ITvService> {
-public:
- BpTvService(const sp<IBinder> &impl)
- : BpInterface<ITvService>(impl)
- {
- }
-
- // connect to tv service
- virtual sp<ITv> connect(const sp<ITvClient> &tvClient)
- {
- Parcel data, reply;
- data.writeInterfaceToken(ITvService::getInterfaceDescriptor());
- data.writeStrongBinder(tvClient->asBinder());
- remote()->transact(BnTvService::CONNECT, data, &reply);
- return interface_cast<ITv>(reply.readStrongBinder());
- }
-};
-
-IMPLEMENT_META_INTERFACE(TvService, "android.amlogic.ITvService");
-
-// ----------------------------------------------------------------------
-
-status_t BnTvService::onTransact(
- uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags)
-{
- switch(code) {
- case CONNECT: {
- CHECK_INTERFACE(ITvService, data, reply);
- sp<ITvClient> tvClient = interface_cast<ITvClient>(data.readStrongBinder());
- sp<ITv> tv = connect(tvClient);
- ALOGD("BnTvService::onTransact( sp<ITv> tv = connect(tvClient);");
- reply->writeStrongBinder(tv->asBinder());
- return NO_ERROR;
- }
- break;
- default:
- return BBinder::onTransact(code, data, reply, flags);
- }
-}
-
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <utils/Log.h>
+#include <binder/Parcel.h>
+#include <binder/IPCThreadState.h>
+#include <binder/IServiceManager.h>
+
+#include <include/ITvService.h>
+
+class BpTvService: public BpInterface<ITvService> {
+public:
+ BpTvService(const sp<IBinder> &impl)
+ : BpInterface<ITvService>(impl)
+ {
+ }
+
+ // connect to tv service
+ virtual sp<ITv> connect(const sp<ITvClient> &tvClient)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(ITvService::getInterfaceDescriptor());
+ data.writeStrongBinder(IInterface::asBinder(tvClient));
+ remote()->transact(BnTvService::CONNECT, data, &reply);
+ return interface_cast<ITv>(reply.readStrongBinder());
+ }
+};
+
+IMPLEMENT_META_INTERFACE(TvService, "android.amlogic.ITvService");
+
+// ----------------------------------------------------------------------
+
+status_t BnTvService::onTransact(
+ uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags)
+{
+ switch (code) {
+ case CONNECT: {
+ CHECK_INTERFACE(ITvService, data, reply);
+ sp<ITvClient> tvClient = interface_cast<ITvClient>(data.readStrongBinder());
+ sp<ITv> tv = connect(tvClient);
+ ALOGD("BnTvService::onTransact( sp<ITv> tv = connect(tvClient);");
+ reply->writeStrongBinder(IInterface::asBinder(tv));
+ return NO_ERROR;
+ }
+ break;
+ default:
+ return BBinder::onTransact(code, data, reply, flags);
+ }
+}
+
diff --git a/tvapi/android/libtvbinder/Tv.cpp b/tvapi/android/libtvbinder/Tv.cpp
index c3348c9..0882edb 100644
--- a/tvapi/android/libtvbinder/Tv.cpp
+++ b/tvapi/android/libtvbinder/Tv.cpp
@@ -1,189 +1,189 @@
-#define LOG_TAG "Tv"
-#include <utils/Log.h>
-#include <utils/threads.h>
-#include <signal.h>
-#include <binder/IServiceManager.h>
-#include <binder/IMemory.h>
-
-#include <include/Tv.h>
-#include <include/ITvService.h>
-
-// client singleton for tv service binder interface
-Mutex Tv::mLock;
-sp<ITvService> Tv::mTvService;
-sp<Tv::DeathNotifier> Tv::mDeathNotifier;
-
-// establish binder interface to tv service
-const sp<ITvService> &Tv::getTvService()
-{
- Mutex::Autolock _l(mLock);
- if (mTvService.get() == 0) {
- sp<IServiceManager> sm = defaultServiceManager();
- sp<IBinder> binder;
- do {
- binder = sm->getService(String16("aml.tvserver"));
- if (binder != 0)
- break;
- ALOGW("TvService not published, waiting...");
- usleep(500000); // 0.5 s
- } while(true);
- if (mDeathNotifier == NULL) {
- mDeathNotifier = new DeathNotifier();
- }
- binder->linkToDeath(mDeathNotifier);
- mTvService = interface_cast<ITvService>(binder);
- }
- ALOGE_IF(mTvService == 0, "no TvService!?");
- return mTvService;
-}
-
-Tv::Tv()
-{
- init();
-}
-
-// construct a tv client from an existing tv remote
-sp<Tv> Tv::create(const sp<ITv> &tv)
-{
- ALOGD("create");
- if (tv == 0) {
- ALOGE("tv remote is a NULL pointer");
- return 0;
- }
-
- sp<Tv> c = new Tv();
- if (tv->connect(c) == NO_ERROR) {
- c->mStatus = NO_ERROR;
- c->mTv = tv;
- tv->asBinder()->linkToDeath(c);
- }
- return c;
-}
-
-void Tv::init()
-{
- mStatus = UNKNOWN_ERROR;
-}
-
-Tv::~Tv()
-{
- disconnect();
-}
-
-sp<Tv> Tv::connect()
-{
- ALOGD("Tv::connect------------------------------------------");
- sp<Tv> c = new Tv();
- const sp<ITvService> &cs = getTvService();
- if (cs != 0) {
- c->mTv = cs->connect(c);
- }
- if (c->mTv != 0) {
- c->mTv->asBinder()->linkToDeath(c);
- c->mStatus = NO_ERROR;
- } else {
- c.clear();
- }
- return c;
-}
-
-void Tv::disconnect()
-{
- ALOGD("disconnect");
- if (mTv != 0) {
- mTv->disconnect();
- mTv->asBinder()->unlinkToDeath(this);
- mTv = 0;
- }
-}
-
-status_t Tv::reconnect()
-{
- ALOGD("reconnect");
- sp <ITv> c = mTv;
- if (c == 0) return NO_INIT;
- return c->connect(this);
-}
-
-sp<ITv> Tv::remote()
-{
- return mTv;
-}
-
-status_t Tv::lock()
-{
- sp <ITv> c = mTv;
- if (c == 0) return NO_INIT;
- return c->lock();
-}
-
-status_t Tv::unlock()
-{
- sp <ITv> c = mTv;
- if (c == 0) return NO_INIT;
- return c->unlock();
-}
-
-status_t Tv::processCmd(const Parcel &p, Parcel *r)
-{
- sp <ITv> c = mTv;
- if (c == 0) return NO_INIT;
- return c->processCmd(p, r);
-}
-
-//
-status_t Tv::createSubtitle(const sp<IMemory> &share_mem)
-{
- sp <ITv> c = mTv;
- if (c == 0) return NO_INIT;
- return c->createSubtitle(share_mem);
-}
-
-status_t Tv::createVideoFrame(const sp<IMemory> &share_mem)
-{
- sp <ITv> c = mTv;
- if (c == 0) return NO_INIT;
- return c->createVideoFrame(share_mem);
-}
-
-
-void Tv::setListener(const sp<TvListener> &listener)
-{
- ALOGD("tv------------Tv::setListener");
- Mutex::Autolock _l(mLock);
- mListener = listener;
-}
-
-
-// callback from tv service
-void Tv::notifyCallback(int32_t msgType, const Parcel &p)
-{
- int size = p.dataSize();
- int pos = p.dataPosition();
- p.setDataPosition(0);
- sp<TvListener> listener;
- {
- Mutex::Autolock _l(mLock);
- listener = mListener;
- }
- if (listener != NULL) {
- listener->notify(msgType, p);
- }
-}
-
-void Tv::binderDied(const wp<IBinder> &who)
-{
- ALOGW("ITv died");
- //notifyCallback(1, 2, 0);
-}
-
-void Tv::DeathNotifier::binderDied(const wp<IBinder> &who)
-{
- ALOGW("-----------------binderDied");
- Mutex::Autolock _l(Tv::mLock);
- Tv::mTvService.clear();
- ALOGW("kill myself");
- kill(getpid(), SIGKILL);
- ALOGW("----------------Tv server died!");
-}
-
+#define LOG_TAG "Tv"
+#include <utils/Log.h>
+#include <utils/threads.h>
+#include <signal.h>
+#include <binder/IServiceManager.h>
+#include <binder/IMemory.h>
+
+#include <include/Tv.h>
+#include <include/ITvService.h>
+
+// client singleton for tv service binder interface
+Mutex Tv::mLock;
+sp<ITvService> Tv::mTvService;
+sp<Tv::DeathNotifier> Tv::mDeathNotifier;
+
+// establish binder interface to tv service
+const sp<ITvService> &Tv::getTvService()
+{
+ Mutex::Autolock _l(mLock);
+ if (mTvService.get() == 0) {
+ sp<IServiceManager> sm = defaultServiceManager();
+ sp<IBinder> binder;
+ do {
+ binder = sm->getService(String16("aml.tvserver"));
+ if (binder != 0)
+ break;
+ ALOGW("TvService not published, waiting...");
+ usleep(500000); // 0.5 s
+ } while (true);
+ if (mDeathNotifier == NULL) {
+ mDeathNotifier = new DeathNotifier();
+ }
+ binder->linkToDeath(mDeathNotifier);
+ mTvService = interface_cast<ITvService>(binder);
+ }
+ ALOGE_IF(mTvService == 0, "no TvService!?");
+ return mTvService;
+}
+
+Tv::Tv()
+{
+ init();
+}
+
+// construct a tv client from an existing tv remote
+sp<Tv> Tv::create(const sp<ITv> &tv)
+{
+ ALOGD("create");
+ if (tv == 0) {
+ ALOGE("tv remote is a NULL pointer");
+ return 0;
+ }
+
+ sp<Tv> c = new Tv();
+ if (tv->connect(c) == NO_ERROR) {
+ c->mStatus = NO_ERROR;
+ c->mTv = tv;
+ IInterface::asBinder(tv)->linkToDeath(c);
+ }
+ return c;
+}
+
+void Tv::init()
+{
+ mStatus = UNKNOWN_ERROR;
+}
+
+Tv::~Tv()
+{
+ disconnect();
+}
+
+sp<Tv> Tv::connect()
+{
+ ALOGD("Tv::connect------------------------------------------");
+ sp<Tv> c = new Tv();
+ const sp<ITvService> &cs = getTvService();
+ if (cs != 0) {
+ c->mTv = cs->connect(c);
+ }
+ if (c->mTv != 0) {
+ IInterface::asBinder(c->mTv)->linkToDeath(c);
+ c->mStatus = NO_ERROR;
+ } else {
+ c.clear();
+ }
+ return c;
+}
+
+void Tv::disconnect()
+{
+ ALOGD("disconnect");
+ if (mTv != 0) {
+ mTv->disconnect();
+ IInterface::asBinder(mTv)->unlinkToDeath(this);
+ mTv = 0;
+ }
+}
+
+status_t Tv::reconnect()
+{
+ ALOGD("reconnect");
+ sp <ITv> c = mTv;
+ if (c == 0) return NO_INIT;
+ return c->connect(this);
+}
+
+sp<ITv> Tv::remote()
+{
+ return mTv;
+}
+
+status_t Tv::lock()
+{
+ sp <ITv> c = mTv;
+ if (c == 0) return NO_INIT;
+ return c->lock();
+}
+
+status_t Tv::unlock()
+{
+ sp <ITv> c = mTv;
+ if (c == 0) return NO_INIT;
+ return c->unlock();
+}
+
+status_t Tv::processCmd(const Parcel &p, Parcel *r)
+{
+ sp <ITv> c = mTv;
+ if (c == 0) return NO_INIT;
+ return c->processCmd(p, r);
+}
+
+//
+status_t Tv::createSubtitle(const sp<IMemory> &share_mem)
+{
+ sp <ITv> c = mTv;
+ if (c == 0) return NO_INIT;
+ return c->createSubtitle(share_mem);
+}
+
+status_t Tv::createVideoFrame(const sp<IMemory> &share_mem, int iSourceMode, int iCapVideoLayerOnly)
+{
+ sp <ITv> c = mTv;
+ if (c == 0) return NO_INIT;
+ return c->createVideoFrame(share_mem, iSourceMode, iCapVideoLayerOnly);
+}
+
+
+void Tv::setListener(const sp<TvListener> &listener)
+{
+ ALOGD("tv------------Tv::setListener");
+ Mutex::Autolock _l(mLock);
+ mListener = listener;
+}
+
+
+// callback from tv service
+void Tv::notifyCallback(int32_t msgType, const Parcel &p)
+{
+ int size = p.dataSize();
+ int pos = p.dataPosition();
+ p.setDataPosition(0);
+ sp<TvListener> listener;
+ {
+ Mutex::Autolock _l(mLock);
+ listener = mListener;
+ }
+ if (listener != NULL) {
+ listener->notify(msgType, p);
+ }
+}
+
+void Tv::binderDied(const wp<IBinder> &who)
+{
+ ALOGW("ITv died");
+ //notifyCallback(1, 2, 0);
+}
+
+void Tv::DeathNotifier::binderDied(const wp<IBinder> &who)
+{
+ ALOGW("-----------------binderDied");
+ Mutex::Autolock _l(Tv::mLock);
+ Tv::mTvService.clear();
+ ALOGW("kill myself");
+ kill(getpid(), SIGKILL);
+ ALOGW("----------------Tv server died!");
+}
+
diff --git a/tvapi/android/tv/Android.mk b/tvapi/android/tv/Android.mk
new file mode 100644
index 0000000..8aa9f68
--- a/dev/null
+++ b/tvapi/android/tv/Android.mk
@@ -0,0 +1,23 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES:= \
+ CTv.cpp \
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libutils \
+ libtvbinder \
+ libbinder \
+ libui \
+
+
+LOCAL_MODULE:= libtvplay
+
+LOCAL_C_INCLUDES += \
+ $(LOCAL_PATH)/../
+
+LOCAL_PRELINK_MODULE := false
+include $(BUILD_SHARED_LIBRARY)
diff --git a/tvapi/android/tv/CTv.cpp b/tvapi/android/tv/CTv.cpp
new file mode 100644
index 0000000..cdfc52b
--- a/dev/null
+++ b/tvapi/android/tv/CTv.cpp
@@ -0,0 +1,104 @@
+#include <utils/Log.h>
+#include "CTv.h"
+#include "../include/tvcmd.h"
+
+CTv::CTv() {
+ mpObserver = NULL;
+ tv = Tv::connect();
+ tv->setListener(this);
+}
+
+CTv::~CTv() {
+ tv.clear();
+}
+
+int CTv::setTvObserver ( TvIObserver *ob )
+{
+ mpObserver = ob;
+ return 0;
+}
+
+void CTv::notify(int32_t msgType, const Parcel &p)
+{
+ ALOGD("CTv-------notify-------");
+ //if(mpObserver)
+ //mpObserver->onTvEvent(msgType, p);
+ if (mpObserver != NULL)
+ mpObserver->onTvEvent(msgType, p);
+}
+
+int CTv::StartTv()
+{
+ Parcel p, r;
+ p.writeInt32(START_TV);
+ tv->processCmd(p, &r);
+ int ret = r.readInt32();
+ return ret;
+}
+
+int CTv::StopTv()
+{
+ Parcel p, r;
+ p.writeInt32(STOP_TV);
+ tv->processCmd(p, &r);
+ int ret = r.readInt32();
+ return ret;
+}
+
+int CTv::SwitchSourceInput(tv_source_input_t source_input)
+{
+ Parcel p, r;
+ p.writeInt32(SET_SOURCE_INPUT);
+ p.writeInt32(source_input);
+ tv->processCmd(p, &r);
+ int ret = r.readInt32();
+ return ret;
+}
+
+int CTv::DoSuspend(int type)
+{
+ Parcel p, r;
+ p.writeInt32(DO_SUSPEND);
+ p.writeInt32(type);
+ tv->processCmd(p, &r);
+ int ret = r.readInt32();
+ return ret;
+}
+
+int CTv::DoResume(int type)
+{
+ Parcel p, r;
+ p.writeInt32(DO_RESUME);
+ p.writeInt32(type);
+ tv->processCmd(p, &r);
+ int ret = r.readInt32();
+ return ret;
+}
+
+int CTv::GetSourceConnectStatus(tv_source_input_t source_input)
+{
+ Parcel p, r;
+ p.writeInt32(GET_SOURCE_CONNECT_STATUS);
+ p.writeInt32(source_input);
+ tv->processCmd(p, &r);
+ int ret = r.readInt32();
+ return ret;
+}
+
+int CTv::GetCurrentSourceInput()
+{
+ Parcel p, r;
+ p.writeInt32(SSM_READ_SOURCE_INPUT);
+ tv->processCmd(p, &r);
+ int ret = r.readInt32();
+ return ret;
+}
+
+int CTv::GetHdmiAvHotplugDetectOnoff()
+{
+ Parcel p, r;
+ p.writeInt32(HDMIAV_HOTPLUGDETECT_ONOFF);
+ tv->processCmd(p, &r);
+ int ret = r.readInt32();
+ return ret;
+}
diff --git a/tvapi/android/tv/CTv.h b/tvapi/android/tv/CTv.h
new file mode 100644
index 0000000..00caabb
--- a/dev/null
+++ b/tvapi/android/tv/CTv.h
@@ -0,0 +1,54 @@
+#ifndef ANDROID_AMLOGIC_CTV_H
+#define ANDROID_AMLOGIC_CTV_H
+
+#include <include/Tv.h>
+
+typedef enum tv_source_input_e {
+ SOURCE_INVALID = -1,
+ SOURCE_TV = 0,
+ SOURCE_AV1,
+ SOURCE_AV2,
+ SOURCE_YPBPR1,
+ SOURCE_YPBPR2,
+ SOURCE_HDMI1,
+ SOURCE_HDMI2,
+ SOURCE_HDMI3,
+ SOURCE_VGA,
+ SOURCE_MPEG,
+ SOURCE_DTV,
+ SOURCE_SVIDEO,
+ SOURCE_IPTV,
+ SOURCE_DUMMY,
+ SOURCE_MAX,
+} tv_source_input_t;
+
+class CTv : public TvListener{
+public:
+ class TvIObserver
+ {
+ public:
+ TvIObserver() {};
+ virtual ~TvIObserver() {};
+ virtual void onTvEvent (int32_t msgType, const Parcel &p) = 0;
+ };
+ CTv();
+ ~CTv();
+ int StartTv();
+ int StopTv();
+ int SwitchSourceInput(tv_source_input_t source_input);
+ //type , 1 is instaboot suspend
+ int DoSuspend(int type);
+ int DoResume(int type);
+ int GetSourceConnectStatus(tv_source_input_t source_input);
+ int GetCurrentSourceInput();
+ int GetHdmiAvHotplugDetectOnoff();
+ int setTvObserver (TvIObserver *ob);
+ virtual void notify(int32_t msgType, const Parcel &p);
+
+ sp<Tv> tv;
+
+private:
+ TvIObserver *mpObserver;
+};
+
+#endif
diff --git a/tvapi/android/tvserver/Android.mk b/tvapi/android/tvserver/Android.mk
index ccb6aad..7f9e5f1 100644
--- a/tvapi/android/tvserver/Android.mk
+++ b/tvapi/android/tvserver/Android.mk
@@ -1,81 +1,83 @@
-LOCAL_PATH:= $(call my-dir)
-
-
-DVB_PATH := $(wildcard external/dvb)
-
-ifeq ($(DVB_PATH), )
- DVB_PATH := $(wildcard vendor/amlogic/dvb)
-endif
-
-AM_LIBPLAYER_PATH := $(wildcard vendor/amlogic/frameworks/av/LibPlayer)
-LIB_ZVBI_PATH := $(wildcard external/libzvbi)
-LIB_SQLITE_PATH := $(wildcard external/sqlite)
-
-
-#tvserver
-include $(CLEAR_VARS)
-
-
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES:= \
- TvService.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libtv
-
-LOCAL_SHARED_LIBRARIES += \
- libui \
- libutils \
- libbinder \
- libcutils \
- libsqlite \
- libmedia \
- libtvbinder \
- libhardware_legacy \
- libdl \
- libskia \
- libtinyxml
-
-LOCAL_SHARED_LIBRARIES += \
- libzvbi \
- libntsc_decode \
- libam_mw \
- libam_adp \
- libam_ver
-
-LOCAL_C_INCLUDES := \
- $(LOCAL_PATH)/../../libtv \
- $(LOCAL_PATH)/../ \
- $(LOCAL_PATH)/../../libtv/tvdb \
- $(LOCAL_PATH)/../../libtv/tv \
- $(LOCAL_PATH)/../../libtv/include \
- $(LOCAL_PATH)/../../build/include \
-
-LOCAL_C_INCLUDES += \
- bionic/libc/include \
- bionic/libc/private \
- system/extras/ext4_utils \
- $(LOCAL_PATH)/../ \
- $(LIB_SQLITE_PATH)/dist \
- system/media/audio_effects/include
-
-
-LOCAL_C_INCLUDES += \
- $(LIB_ZVBI_PATH)/ntsc_decode/include \
- $(LIB_ZVBI_PATH)/ntsc_decode/include/ntsc_dmx \
- $(LIB_ZVBI_PATH)/src \
- $(DVB_PATH)/include/am_adp \
- $(DVB_PATH)/include/am_mw \
- $(DVB_PATH)/include/am_ver \
- $(DVB_PATH)/android/ndk/include \
- $(AM_LIBPLAYER_PATH)/amadec/include \
- $(AM_LIBPLAYER_PATH)/amcodec/include \
- $(AM_LIBPLAYER_PATH)/amffmpeg \
- $(AM_LIBPLAYER_PATH)/amplayer
-
-
-LOCAL_MODULE:= libtvserver
-
-include $(BUILD_SHARED_LIBRARY)
+LOCAL_PATH:= $(call my-dir)
+
+
+DVB_PATH := $(wildcard external/dvb)
+
+ifeq ($(DVB_PATH), )
+ DVB_PATH := $(wildcard vendor/amlogic/dvb)
+endif
+
+AM_LIBPLAYER_PATH := $(wildcard vendor/amlogic/frameworks/av/LibPlayer)
+LIB_ZVBI_PATH := $(wildcard external/libzvbi)
+LIB_SQLITE_PATH := $(wildcard external/sqlite)
+
+
+#tvserver
+include $(CLEAR_VARS)
+
+
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES:= \
+ main.cpp \
+ TvService.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libtv
+
+LOCAL_SHARED_LIBRARIES += \
+ libui \
+ libutils \
+ libbinder \
+ libcutils \
+ libsqlite \
+ libmedia \
+ libtvbinder \
+ libhardware_legacy \
+ libdl \
+ libskia \
+ libtinyxml
+
+LOCAL_SHARED_LIBRARIES += \
+ libzvbi \
+ libntsc_decode \
+ libam_mw \
+ libam_adp \
+ libam_ver
+
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH)/../../libtv \
+ $(LOCAL_PATH)/../ \
+ $(LOCAL_PATH)/../../libtv/tvdb \
+ $(LOCAL_PATH)/../../libtv/tv \
+ $(LOCAL_PATH)/../../libtv/include \
+ $(LOCAL_PATH)/../../build/include \
+
+LOCAL_C_INCLUDES += \
+ bionic/libc/include \
+ bionic/libc/private \
+ system/extras/ext4_utils \
+ $(LOCAL_PATH)/../ \
+ $(LIB_SQLITE_PATH)/dist \
+ system/media/audio_effects/include
+
+
+LOCAL_C_INCLUDES += \
+ $(LIB_ZVBI_PATH)/ntsc_decode/include \
+ $(LIB_ZVBI_PATH)/ntsc_decode/include/ntsc_dmx \
+ $(LIB_ZVBI_PATH)/src \
+ $(DVB_PATH)/include/am_adp \
+ $(DVB_PATH)/include/am_mw \
+ $(DVB_PATH)/include/am_ver \
+ $(DVB_PATH)/android/ndk/include \
+ $(AM_LIBPLAYER_PATH)/amadec/include \
+ $(AM_LIBPLAYER_PATH)/amcodec/include \
+ $(AM_LIBPLAYER_PATH)/amffmpeg \
+ $(AM_LIBPLAYER_PATH)/amplayer
+LOCAL_C_INCLUDES += hardware/amlogic/audio/libTVaudio
+LOCAL_CFLAGS += -DTARGET_BOARD_$(strip $(TVAPI_TARGET_BOARD_VERSION))
+
+LOCAL_MODULE:= tvserver
+
+include $(BUILD_EXECUTABLE)
diff --git a/tvapi/android/tvserver/TvService.cpp b/tvapi/android/tvserver/TvService.cpp
index 13a90f6..9de4fb8 100644
--- a/tvapi/android/tvserver/TvService.cpp
+++ b/tvapi/android/tvserver/TvService.cpp
@@ -1,4416 +1,4495 @@
-#include <utils/Log.h>
-#include <binder/IServiceManager.h>
-#include <binder/IPCThreadState.h>
-#include <utils/String16.h>
-#include <utils/Errors.h>
-#include <binder/MemoryBase.h>
-#include <binder/MemoryHeapBase.h>
-#include <include/ITvService.h>
-#include <hardware/hardware.h>
-#include "TvService.h"
-#include <cutils/atomic.h>
-#include <cutils/properties.h>
-#include <stdint.h>
-#include <tvconfig/tvconfig.h>
-#include <tvsetting/CTvSetting.h>
-#include <audio/audio_api.h>
-#include <tvutils/tvutils.h>
-#include <version/version.h>
-#include "../include/tvcmd.h"
-#include "tv/CTvLog.h"
-#include <tvdb/CTvRegion.h>
-extern "C" {
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <signal.h>
-#include "make_ext4fs.h"
-#include "am_ver.h"
-}
-#define LOG_TAG "TvService"
-
-#define PICTURE_TIMEOUT seconds(5)
-
-static int getCallingPid()
-{
- return IPCThreadState::self()->getCallingPid();
-}
-
-void TvService::instantiate(CTv *pTv)
-{
- defaultServiceManager()->addService(String16("aml.tvserver"), new TvService( pTv));
-}
-
-TvService::TvService(CTv *pTv) :
- BnTvService()
-{
- mpStartTvClient = NULL;
- mpScannerClient = NULL;
- mUsers = 0;
- mpTv = pTv;
- mpTv->setTvObserver(this);
- mCapVidFrame.setObserver(this);
- mpTv->OpenTv();
-}
-
-
-TvService::~TvService()
-{
- mpStartTvClient = NULL;
- mpScannerClient = NULL;
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- LOGW("some client still connect it!");
- }
- }
- if(mpTv != NULL) {
- delete mpTv;
- mpTv = NULL;
- }
-}
-
-void TvService::onTvEvent(const CTvEv &ev)
-{
- int type = ev.getEvType();
- LOGD("TvService::onTvEvent ev type = %d", type);
- switch(type) {
- case CTvEv::TV_EVENT_COMMOM: {
- break;
- }
- case CTvEv::TV_EVENT_SCANNER: {
- CTvScanner::ScannerEvent *pScannerEv = (CTvScanner::ScannerEvent *) (&ev);
- if(mpScannerClient != NULL) {
- sp<Client> ScannerClient = mpScannerClient.promote();
- if(ScannerClient != 0) {
- Parcel p;
- LOGD("scanner evt type:%d freq:%d vid:%d acnt:%d",
- pScannerEv->mType, pScannerEv->mFrequency, pScannerEv->mVid, pScannerEv->mAcnt);
- p.writeInt32(pScannerEv->mType);
- p.writeInt32(pScannerEv->mPercent);
- p.writeInt32(pScannerEv->mTotalChannelCount);
- p.writeInt32(pScannerEv->mLockedStatus);
- p.writeInt32(pScannerEv->mChannelNumber);
- p.writeInt32(pScannerEv->mFrequency);
- p.writeString16(String16(pScannerEv->mProgramName));
- p.writeInt32(pScannerEv->mprogramType);
- p.writeString16(String16(pScannerEv->mMSG));
- p.writeInt32(pScannerEv->mStrength);
- p.writeInt32(pScannerEv->mSnr);
- //ATV
- p.writeInt32(pScannerEv->mVideoStd);
- p.writeInt32(pScannerEv->mAudioStd);
- p.writeInt32(pScannerEv->mIsAutoStd);
- //DTV
- p.writeInt32(pScannerEv->mMode);
- p.writeInt32(pScannerEv->mSymbolRate);
- p.writeInt32(pScannerEv->mModulation);
- p.writeInt32(pScannerEv->mBandwidth);
- p.writeInt32(pScannerEv->mOfdm_mode);
- p.writeInt32(pScannerEv->mTsId);
- p.writeInt32(pScannerEv->mONetId);
- p.writeInt32(pScannerEv->mServiceId);
- p.writeInt32(pScannerEv->mVid);
- p.writeInt32(pScannerEv->mVfmt);
- p.writeInt32(pScannerEv->mAcnt);
- for (int i = 0; i < pScannerEv->mAcnt; i++)
- p.writeInt32(pScannerEv->mAid[i]);
- for (int i = 0; i < pScannerEv->mAcnt; i++)
- p.writeInt32(pScannerEv->mAfmt[i]);
- for (int i = 0; i < pScannerEv->mAcnt; i++)
- p.writeString16(String16(pScannerEv->mAlang[i]));
- for (int i = 0; i < pScannerEv->mAcnt; i++)
- p.writeInt32(pScannerEv->mAtype[i]);
- p.writeInt32(pScannerEv->mPcr);
- ScannerClient->notifyCallback(SCAN_EVENT_CALLBACK, p);
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_EPG: {
- CTvEpg::EpgEvent *pEpgEvent = (CTvEpg::EpgEvent *) (&ev);
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
- p.writeInt32(pEpgEvent->type);
- p.writeInt32(pEpgEvent->time);
- p.writeInt32(pEpgEvent->programID);
- p.writeInt32(pEpgEvent->channelID);
- currentClient->getTvClient()->notifyCallback(EPG_EVENT_CALLBACK, p);
- }
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_HDMI_IN_CAP: {
- CTvScreenCapture::CapEvent *pCapEvt = (CTvScreenCapture::CapEvent *)(&ev);
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
- p.writeInt32(pCapEvt->mFrameNum);
- p.writeInt32(pCapEvt->mFrameSize);
- p.writeInt32(pCapEvt->mFrameWide);
- p.writeInt32(pCapEvt->mFrameHeight);
- currentClient->getTvClient()->notifyCallback(VFRAME_BMP_EVENT_CALLBACK, p);
- }
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_AV_PLAYBACK: {
- TvEvent::AVPlaybackEvent *pEv = (TvEvent::AVPlaybackEvent *)(&ev);
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
- p.writeInt32(pEv->mMsgType);
- p.writeInt32(pEv->mProgramId);
- currentClient->getTvClient()->notifyCallback(DTV_AV_PLAYBACK_CALLBACK, p);
- }
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_SIGLE_DETECT: {
- TvEvent::SignalInfoEvent *pEv = (TvEvent::SignalInfoEvent *)(&ev);
-
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
- p.writeInt32(pEv->mTrans_fmt);
- p.writeInt32(pEv->mFmt);
- p.writeInt32(pEv->mStatus);
- p.writeInt32(pEv->mReserved);
- currentClient->getTvClient()->notifyCallback(SIGLE_DETECT_CALLBACK, p);
- }
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_ADC_CALIBRATION: {
- TvEvent::ADCCalibrationEvent *pEv = (TvEvent::ADCCalibrationEvent *)(&ev);
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
- p.writeInt32(pEv->mState);
- currentClient->getTvClient()->notifyCallback(ADC_CALIBRATION_CALLBACK, p);
- }
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_VGA: { //VGA
- TvEvent::VGAEvent *pEv = (TvEvent::VGAEvent *)(&ev);
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
- p.writeInt32(pEv->mState);
- currentClient->getTvClient()->notifyCallback(VGA_CALLBACK, p);
- }
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_SOURCE_CONNECT: {
- TvEvent::SourceConnectEvent *pEv = (TvEvent::SourceConnectEvent *)(&ev);
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
- p.writeInt32(pEv->mSourceInput);
- p.writeInt32(pEv->connectionState);
- currentClient->getTvClient()->notifyCallback(SOURCE_CONNECT_CALLBACK, p);
- }
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_HDMIRX_CEC: {
- TvEvent::HDMIRxCECEvent *pEv = (TvEvent::HDMIRxCECEvent *)(&ev);
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
-
- p.writeInt32(pEv->mDataCount);
- for(int j = 0; j < pEv->mDataCount; j++) {
- p.writeInt32(pEv->mDataBuf[j]);
- }
-
- currentClient->getTvClient()->notifyCallback(HDMIRX_CEC_CALLBACK, p);
- }
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_UPGRADE_FBC: {
- TvEvent::UpgradeFBCEvent *pEv = (TvEvent::UpgradeFBCEvent *)(&ev);
-
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
- p.writeInt32(pEv->mState);
- p.writeInt32(pEv->param);
- currentClient->getTvClient()->notifyCallback(UPGRADE_FBC_CALLBACK, p);
- }
- }
- }
- break;
- }
- case CTvEv::TV_EVENT_SERIAL_COMMUNICATION: {
- TvEvent::SerialCommunicationEvent *pEv = (TvEvent::SerialCommunicationEvent *)(&ev);
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
-
- p.writeInt32(pEv->mDevId);
- p.writeInt32(pEv->mDataCount);
- for(int j = 0; j < pEv->mDataCount; j++) {
- p.writeInt32(pEv->mDataBuf[j]);
- }
-
- currentClient->getTvClient()->notifyCallback(SERIAL_COMMUNICATION_CALLBACK, p);
- }
- }
- }
- break;
- }
-
- case CTvEv::TV_EVENT_2d4G_HEADSET: {
- TvEvent::HeadSetOf2d4GEvent *pEv = (TvEvent::HeadSetOf2d4GEvent *)(&ev);
- LOGD("SendDtvStats status: =%d para2: =%d", pEv->state, pEv->para);
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- Parcel p;
- p.writeInt32(pEv->state);
- p.writeInt32(pEv->para);
- currentClient->getTvClient()->notifyCallback(HEADSET_STATUS_CALLBACK, p);
- }
- }
- }
- break;
- }
-
- default:
- break;
- }
-}
-
-sp<ITv> TvService::connect(const sp<ITvClient> &tvClient)
-{
- int callingPid = getCallingPid();
- LOGD("TvService::connect E (pid %d, client %p)", callingPid, tvClient->asBinder().get());
-
- Mutex::Autolock lock(mServiceLock);
-
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- sp<ITvClient> currentTvClient(currentClient->getTvClient());
- if (tvClient->asBinder() == currentTvClient->asBinder()) {
- LOGD("TvService::connect X (pid %d, same client %p) is reconnecting...", callingPid, tvClient->asBinder().get());
- return currentClient;
- } else {
- //LOGD("TvService::connect X (pid %d, new client %p) rejected. "
- // "(old pid %d, old client %p)", callingPid, tvClient->asBinder().get(), currentClient->mClientPid, currentTvClient->asBinder().get());
- // if (kill(currentClient->mClientPid, 0) == -1 && errno == ESRCH) {
- // LOGE("The old client is dead!");
- // }
- //return client;
- //return currentClient;
- continue;
- }
- } else {
- LOGE("client (pid %d) have delete ------------not exist", callingPid);
- client.clear();
- m_v_Clients.removeAt(i);
- client_size--;
- continue;
- }
- }
- }
-
- if (mUsers > 0) {
- LOGE("Still have client, rejected");
- //return client;
- }
- LOGD("TvService::connect X 3");
- // client = new Client(this, tvClient, callingPid);
- //mClient = client;
-
- sp<Client> newclient = new Client(this, tvClient, callingPid, mpTv);
- m_v_Clients.add(newclient);
-
-#if DEBUG_CLIENT_REFERENCES
- //client->trackMe(true, true);
-#endif
- //mCurClient = client;
- LOGD("TvService::connect X 4");
- return newclient;
-}
-
-void TvService::removeClient(const sp<ITvClient> &tvClient)
-{
- int callingPid = getCallingPid();
-
- Mutex::Autolock lock(mServiceLock);
-
- int client_size = m_v_Clients.size();
- wp<Client> client;
- for(int i = 0; i < client_size; i++) {
- client = m_v_Clients[i];
- if (client != 0) {
- sp<Client> currentClient = client.promote();
- if (currentClient != 0) {
- sp<ITvClient> currentTvClient(currentClient->getTvClient());
- if (tvClient->asBinder() == currentTvClient->asBinder()) {
- LOGD("find client , and remove it pid = %d, client = %p i=%d", callingPid, tvClient->asBinder().get(), i);
- client.clear();
- LOGD("find client , and remove it pid1 ");
- m_v_Clients.removeAt(i);
- LOGD("find client , and remove it pid2 ");
- break;
- } else {
- LOGW("removeClient (pid %d): mClient doesn't match!", callingPid);
- continue;
- }
- } else {
- LOGW("removeclient currentClient == 0 (pid %d)", callingPid);
- client.clear();
- m_v_Clients.removeAt(i);
- client_size--;
- continue;
- }
- } else {
- LOGW("removeclient client == 0 (pid %d)", callingPid);
- client.clear();
- m_v_Clients.removeAt(i);
- client_size--;
- continue;
- }
- }
-
- LOGD("removeClient (pid %d) done", callingPid);
-}
-
-void TvService::incUsers()
-{
- android_atomic_inc(&mUsers);
-}
-
-void TvService::decUsers()
-{
- android_atomic_dec(&mUsers);
-}
-
-TvService::Client::Client(const sp<TvService> &tvService, const sp<ITvClient> &tvClient, pid_t clientPid, CTv *pTv)
-{
- int callingPid = getCallingPid();
- LOGD("Client::Client E (pid %d)", callingPid);
- mTvService = tvService;
- mTvClient = tvClient;
- mClientPid = clientPid;
- tvService->incUsers();
- mpTv = pTv;
- mIsStartTv = false;
-}
-
-status_t TvService::Client::checkPid()
-{
- int callingPid = getCallingPid();
- if (mClientPid == callingPid)
- return NO_ERROR;
- LOGD("Attempt to use locked tv (client %p) from different process "
- " (old pid %d, new pid %d)", getTvClient()->asBinder().get(), mClientPid, callingPid);
- return -EBUSY;
-}
-
-status_t TvService::Client::lock()
-{
- int callingPid = getCallingPid();
- LOGD("lock from pid %d (mClientPid %d)", callingPid, mClientPid);
- Mutex::Autolock _l(mLock);
- // lock tv to this client if the the tv is unlocked
- if (mClientPid == 0) {
- mClientPid = callingPid;
- return NO_ERROR;
- }
- // returns NO_ERROR if the client already owns the tv, -EBUSY otherwise
- return checkPid();
-}
-
-status_t TvService::Client::unlock()
-{
- int callingPid = getCallingPid();
- LOGD("unlock from pid %d (mClientPid %d)", callingPid, mClientPid);
- Mutex::Autolock _l(mLock);
- // allow anyone to use tv
- status_t result = checkPid();
- if (result == NO_ERROR) {
- mClientPid = 0;
- LOGD("clear mTvClient (pid %d)", callingPid);
- // we need to remove the reference so that when app goes
- // away, the reference count goes to 0.
- mTvClient.clear();
- }
- return result;
-}
-
-status_t TvService::Client::connect(const sp<ITvClient> &client)
-{
- int callingPid = getCallingPid();
- LOGD("Client::connect E (pid %d, client %p)", callingPid, client->asBinder().get());
- {
- sp<ITvClient> oldClient;
- {
- Mutex::Autolock _l(mLock);
- if (mClientPid != 0 && checkPid() != NO_ERROR) {
- LOGW("Tried to connect to locked tv (old pid %d, new pid %d)", mClientPid, callingPid);
- return -EBUSY;
- }
- oldClient = mTvClient;
-
- // did the client actually change?
- if ((mTvClient != NULL) && (client->asBinder() == mTvClient->asBinder())) {
- LOGD("Connect to the same client");
- return NO_ERROR;
- }
-
- mTvClient = client;
- mClientPid = -1;
- LOGD("Connect to the new client (pid %d, client %p)", callingPid, mTvClient->asBinder().get());
- }
-
- }
- mClientPid = callingPid;
- return NO_ERROR;
-}
-
-TvService::Client::~Client()
-{
- if(mIsStartTv) mpTv->StopTvLock();
-
- int callingPid = getCallingPid();
- // tear down client
- LOGD("Client::~Client E (pid %d, client %p)", callingPid, getTvClient()->asBinder().get());
- // make sure we tear down the hardware
- mClientPid = callingPid;
- disconnect();
- LOGD("Client::~Client X (pid %d)", mClientPid);
-}
-
-void TvService::Client::disconnect()
-{
- int callingPid = getCallingPid();
-
- LOGD("Client::disconnect() E (pid %d client %p)", callingPid, getTvClient()->asBinder().get());
-
- Mutex::Autolock lock(mLock);
- if (mClientPid <= 0) {
- LOGE("tv is unlocked (mClientPid = %d), don't tear down hardware", mClientPid);
- return;
- }
- if (checkPid() != NO_ERROR) {
- LOGE("Different client - don't disconnect");
- return;
- }
-
- mTvService->removeClient(mTvClient);
- mTvService->decUsers();
-
- LOGD("Client::disconnect() X (pid %d)", callingPid);
-}
-
-status_t TvService::Client::createVideoFrame(const sp<IMemory> &share_mem)
-{
- LOGD(" mem=%p size=%d", share_mem->pointer() == NULL, share_mem->size());
- int Len = 0;
- Mutex::Autolock lock(mLock);
- mTvService->mCapVidFrame.InitVCap(share_mem);
- mTvService->mCapVidFrame.SetVideoParameter(1280, 720, 50);
-
- mTvService->mCapVidFrame.VideoStart();
- mTvService->mCapVidFrame.GetVideoData(&Len);
- mTvService->mCapVidFrame.VideoStop();
- mTvService->mCapVidFrame.DeinitVideoCap();
-
- return 0;
-}
-
-status_t TvService::Client::createSubtitle(const sp<IMemory> &share_mem)
-{
- LOGD("TvService::Client::createSubtitle mem=%d size=%d", share_mem->pointer() == NULL, share_mem->size());
- //pSub = new CTvSubtitle(share_mem, this);
- //pSub->run();
- return 0;
-}
-status_t TvService::Client::processCmd(const Parcel &p, Parcel *r)
-{
- int tmp_i_buf[128] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
- unsigned char tmp_uc_buf[512] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
- unsigned char tmp_uc_buf2[512] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
- int8_t tmp_int8_buf[512] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
- static int source_input = 0;
- int *data_ptr = NULL;
-
- int cmd = p.readInt32();
-
- LOGD("client=%d cmd=%d", getCallingPid(), cmd);
- switch (cmd) {
- // Tv function
- case OPEN_TV: {
- break;
- }
- case CLOSE_TV: {
- int ret = mpTv->CloseTv();
- r->writeInt32(ret);
- break;
- }
- case START_TV: {
- int mode = p.readInt32();
- int ret = mpTv->StartTvLock();
- //mTvService->mpStartTvClient = this;
- mIsStartTv = true;
- r->writeInt32(ret);
- break;
- }
- case STOP_TV: {
- int ret = mpTv->StopTvLock();
- r->writeInt32(ret);
- mIsStartTv = false;
- break;
- }
- case GET_TV_STATUS: {
- int ret = 0;
- ret = (int)mpTv->GetTvStatus();
- r->writeInt32(ret);
- break;
- }
- case GET_LAST_SOURCE_INPUT: {
- int ret = (int)mpTv->GetLastSourceInput();
- r->writeInt32(ret);
- break;
- }
- case GET_CURRENT_SOURCE_INPUT: {
- int ret = (int)mpTv->GetCurrentSourceInputLock();
- r->writeInt32(ret);
- break;
- }
- case GET_CURRENT_SOURCE_INPUT_TYPE: {
- int ret = 0;//(int)mpTv->Tvin_GetSrcInputType();
- r->writeInt32(ret);
- break;
- }
- case GET_CURRENT_SIGNAL_INFO: {
- tvin_info_t siginfo = mpTv->GetCurrentSignalInfo();
- int frame_rate = mpTv->getHDMIFrameRate();
- LOGD("superman--frame_rate = %d", frame_rate);
- r->writeInt32(siginfo.trans_fmt);
- r->writeInt32(siginfo.fmt);
- r->writeInt32(siginfo.status);
- r->writeInt32(frame_rate);
- break;
- }
- case IS_SOURCE_SWTICH_DONE: {
- //int ret = mpTv->Tv_IsSourceSwtichDone();
- r->writeInt32(0);
- break;
- }
- case SET_SOURCE_INPUT: {
- int sourceinput = p.readInt32();
- tvin_window_pos_t win_pos;
- LOGD(" SetSourceInput sourceId= %x", sourceinput);
- source_input = sourceinput;
- /*win_pos.x1 = p.readInt32();
- win_pos.y1 = p.readInt32();
- win_pos.x2 = p.readInt32();
- win_pos.y2 = p.readInt32();*/
- int ret = mpTv->SetSourceSwitchInput((tv_source_input_t)sourceinput);
- r->writeInt32(ret);
- break;
- }
- case RUN_ADC_AUTO_CALIBRATION: {
- // int ret = mpTv->Tv_RunADCAutoCalibration();
- // r->writeInt32(ret);
- break;
- }
- case IS_DVI_SIGNAL: {
- int ret = mpTv->IsDVISignal();
- r->writeInt32(ret);
- break;
- }
- case IS_VGA_TIMEING_IN_HDMI: {
- int ret = mpTv->isVgaFmtInHdmi();
- r->writeInt32(ret);
- break;
- }
- case GET_VIDEO_PATH_STATUS: {
- int path_type = p.readInt32();
- int ret = 0;//(int)mpTv->Tvin_CheckPathActive((tv_path_type_t)path_type);
- r->writeInt32(ret);
- break;
- }
- case GET_VIDEO_STREAM_STATUS: {
- // int ret = (int)mpTv->Tvin_CheckVideoStreamStatus();
- // r->writeInt32(ret);
- break;
- }
- case GET_FIRST_START_SWITCH_TYPE: {
- //int tmp_val = 0;
- //int ret = (int)mpTv->Tv_GetFirstStartSwitchType(&tmp_val);
- //r->writeInt32(ret);
- r->writeInt32(1);
- break;
- }
- case SET_PREVIEW_WINDOW: {
- tvin_window_pos_t win_pos;
- win_pos.x1 = p.readInt32();
- win_pos.y1 = p.readInt32();
- win_pos.x2 = p.readInt32();
- win_pos.y2 = p.readInt32();
- int ret = (int)mpTv->SetPreviewWindow(win_pos);
- r->writeInt32(ret);
- break;
- }
-
- case SET_VIDEO_DISABLE: {
- int value = p.readInt32();
- int ret = 0;//(int)mpTv->Tv_SetVideoDisable(value);
- r->writeInt32(ret);
- break;
- }
-
- case GET_SOURCE_CONNECT_STATUS: {
- int source_input = p.readInt32();
- int ret = mpTv->GetSourceConnectStatus(source_input);
- r->writeInt32(ret);
- break;
- }
- //Tv function END
-
- //VGA
- case RUN_VGA_AUTO_ADJUST: {
- //int ret = mpTv->Tv_RunVGAAutoAdjust();
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case GET_VGA_AUTO_ADJUST_STATUS: {
- // int fmt = p.readInt32();
- //int ret = (int) mpTv->Tv_GetVagAutoAdjustStatus();
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case IS_VGA_AUTO_ADJUST_DONE: {
- int fmt = p.readInt32();
- int ret = 0;//mpTv->Tv_IsVGAAutoAdjustDone((tvin_sig_fmt_t)fmt);
- r->writeInt32(ret);
- break;
- }
- case SET_VGA_HPOS: {
- // int value = p.readInt32();
- // int fmt = p.readInt32();
- //int ret = mpTv->Tv_SetVGAHPos(value, (tvin_sig_fmt_t)fmt);
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case GET_VGA_HPOS: {
- // int fmt = p.readInt32();
- // int ret = mpTv->Tv_GetVGAHPos((tvin_sig_fmt_t)fmt);
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
-
- case SET_VGA_VPOS: {
- // int value = p.readInt32();
- // int fmt = p.readInt32();
- // int ret = mpTv->Tv_SetVGAVPos(value, (tvin_sig_fmt_t)fmt);
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case GET_VGA_VPOS: {
- // int fmt = p.readInt32();
- // int ret = mpTv->Tv_GetVGAVPos((tvin_sig_fmt_t)fmt);
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
-
- case SET_VGA_CLOCK: {
- // int value = p.readInt32();
- // int fmt = p.readInt32();
- // int ret = mpTv->Tv_SetVGAClock(value, (tvin_sig_fmt_t)fmt);
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case GET_VGA_CLOCK: {
- // int fmt = p.readInt32();
- // int ret = mpTv->Tv_GetVGAClock((tvin_sig_fmt_t)fmt);
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
-
- case SET_VGA_PHASE: {
- // int value = p.readInt32();
- // int fmt = p.readInt32();
- // int ret = mpTv->Tv_SetVGAPhase(value, (tvin_sig_fmt_t)fmt);
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case GET_VGA_PHASE: {
- // int fmt = p.readInt32();
- // int ret = mpTv->Tv_GetVGAPhase((tvin_sig_fmt_t)fmt);
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case SET_VGA_AJUST_PARA: {
- tvafe_vga_parm_t adjparam;
- adjparam.clk_step = p.readInt32();
- adjparam.phase = p.readInt32();
- adjparam.hpos_step = p.readInt32();
- adjparam.vpos_step = p.readInt32();
- adjparam.vga_in_clean = p.readInt32();
- int fmt = p.readInt32();
- int ret = 0/*SetVGAAjustPara(adjparam, (tvin_sig_fmt_t)fmt)*/;
- r->writeInt32(ret);
- break;
- }
- case GET_VGA_AJUST_PARA: {
- tvafe_vga_parm_t adjparam;
- int fmt = p.readInt32();
- int ret = 0/*GetVGAAjustPara(&adjparam, (tvin_sig_fmt_t)fmt)*/;
- r->writeInt32(adjparam.clk_step);
- r->writeInt32(adjparam.phase);
- r->writeInt32(adjparam.hpos_step);
- r->writeInt32(adjparam.vpos_step);
- r->writeInt32(adjparam.vga_in_clean);
- r->writeInt32(ret);
- break;
- }
- case SET_VGAPARAM_DEFAULT: {
- // int ret = (int)mpTv->TvinResetVgaAjustParam();
- // r->writeInt32(ret);
- break;
- }
- // VGA END
-
- // 3D
-
- case SET_3D_MODE: {
- int mode = p.readInt32();
- int ret = mpTv->Tv_Set3DMode((VIDEO_3D_MODE_T)mode);
- r->writeInt32(ret);
- break;
- }
- case GET_3D_MODE: {
- int ret = (int)mpTv->Tv_Get3DMode();
- r->writeInt32(ret);
- break;
- }
- case SET_3D_LR_SWITH: {
- int on_off = p.readInt32();
- //int status = p.readInt32();
- int ret = mpTv->Tv_Set3DLRSwith(on_off);
- r->writeInt32(ret);
- break;
- }
- case GET_3D_LR_SWITH: {
- int ret = mpTv->Tv_Get3DLRSwith();
- r->writeInt32(ret);
- break;
- }
- case SET_3D_TO_2D_MODE: {
- int mode = p.readInt32();
- //int status = p.readInt32();
- int ret = mpTv->Tv_Set3DTo2DMode(mode);
- r->writeInt32(ret);
- break;
- }
- case GET_3D_TO_2D_MODE: {
- int ret = mpTv->Tv_Get3DTo2DMode();
- r->writeInt32(ret);
- break;
- }
- case SET_3D_DEPTH: {
- int value = p.readInt32();
- int ret = mpTv->Tv_Set3DDepth(value);
- r->writeInt32(ret);
- break;
- }
- case GET_3D_DEPTH: {
- int ret = mpTv->GetSave3DDepth();
- r->writeInt32(ret);
- break;
- }
- // 3D END
-
- // PQ
- case SET_BRIGHTNESS: {
- int brightness = p.readInt32();
- int source_type = p.readInt32();
- int is_save = p.readInt32();
- int ret = mpTv->Tv_SetBrightness(brightness, (tv_source_input_type_t)source_type, is_save);
- r->writeInt32(ret);
- break;
- }
- case GET_BRIGHTNESS: {
- int source_type = p.readInt32();
- LOGD("GET_BRIGHTNESS------------=%d", source_type);
- int ret = mpTv->Tv_GetBrightness((tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
-
- case SET_CONTRAST: {
- int contrast = p.readInt32();
- int source_type = p.readInt32();
- int is_save = p.readInt32();
- int ret = mpTv->Tv_SetContrast(contrast, (tv_source_input_type_t)source_type, is_save);
- r->writeInt32(ret);
- break;
- }
- case GET_CONTRAST: {
- int source_type = p.readInt32();
- int ret = mpTv->Tv_GetContrast((tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SET_SATUATION: {
- int satuation = p.readInt32();
- int source_type = p.readInt32();
- int fmt = p.readInt32();
- int is_save = p.readInt32();
- int ret = mpTv->Tv_SetSaturation(satuation, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, is_save);
- r->writeInt32(ret);
- break;
- }
- case GET_SATUATION: {
- int source_type = p.readInt32();
- int ret = mpTv->Tv_GetSaturation((tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SET_HUE: {
- int hue = p.readInt32();
- int source_type = p.readInt32();
- int fmt = p.readInt32();
- int is_save = p.readInt32();
- int ret = mpTv->Tv_SetHue(hue, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, is_save);
- r->writeInt32(ret);
- break;
- }
- case GET_HUE: {
- int source_type = p.readInt32();
- int ret = mpTv->Tv_GetHue((tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SET_SCENEMODE: {
- int mode = p.readInt32();
- int is_save = p.readInt32();
- int ret = 0;//mpTv->Tv_SetSceneMode((vpp_scene_mode_t)mode,is_save);
- r->writeInt32(ret);
- break;
- }
- case GET_SCENEMODE: {
- int ret = 0;//(int)mpTv->Tv_GetSceneMode();
- r->writeInt32(ret);
- break;
- }
- case SET_PQMODE: {
- int mode = p.readInt32();
- int source_type = p.readInt32();
- int is_save = p.readInt32();
- int ret = mpTv->Tv_SetPQMode((vpp_picture_mode_t)mode, (tv_source_input_type_t)source_type, is_save);
- r->writeInt32(ret);
- break;
- }
- case GET_PQMODE: {
- int source_type = p.readInt32();
- int ret = (int)mpTv->Tv_GetPQMode((tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SET_SHARPNESS: {
- int value = p.readInt32();
- int source_type = p.readInt32();
- int en = p.readInt32();
- int status_3d = p.readInt32();
- int is_save = p.readInt32();
- int ret = mpTv->Tv_SetSharpness(value, (tv_source_input_type_t)source_type, en, is_save);
- r->writeInt32(ret);
- break;
- }
- case GET_SHARPNESS: {
- int source_type = p.readInt32();
- int ret = mpTv->Tv_GetSharpness((tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SAVE_SHARPNESS: {
- int value = p.readInt32();
- int source_type = p.readInt32();
- int en = p.readInt32();
- int ret = mpTv->Tv_SaveSharpness(value, (tv_source_input_type_t)source_type, en);
- r->writeInt32(ret);
- break;
- }
- case SET_BACKLIGHT: {
- int value = p.readInt32();
- int source_type = p.readInt32();
- int is_save = p.readInt32();
- int ret = -1;
- if (GetPlatformHaveFBCFlag() == 0) {
- ret = mpTv->Tv_SetBacklight(value, (tv_source_input_type_t)source_type, is_save);
- } else {
- ret = mpTv->Tv_FactorySet_FBC_Backlight(value);
- }
- r->writeInt32(ret);
- break;
- }
- case GET_BACKLIGHT: {
- int source_type = p.readInt32();
- int ret = 0;
- if (GetPlatformHaveFBCFlag() == 0) {
- ret = mpTv->Tv_GetBacklight((tv_source_input_type_t)source_type);
- } else {
- ret = mpTv->Tv_FactoryGet_FBC_Backlight();
- }
- r->writeInt32(ret);
- break;
- }
- case SET_COLOR_TEMPERATURE: {
- int mode = p.readInt32();
- int source_type = p.readInt32();
- int is_save = p.readInt32();
- int ret = -1;
- if (GetPlatformHaveFBCFlag() == 0) {
- ret = mpTv->Tv_SetColorTemperature((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type, is_save);
- } else {
- mode = mpTv->Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(mode);
- ret = mpTv->Tv_FactorySet_FBC_ColorTemp_Mode(mode);
- }
- r->writeInt32(ret);
- break;
- }
- case GET_COLOR_TEMPERATURE: {
- int source_type = p.readInt32();
- int ret = 0;
- if (GetPlatformHaveFBCFlag() == 0) {
- ret = mpTv->Tv_GetColorTemperature((tv_source_input_type_t)source_type);
- } else {
- ret = mpTv->Tv_FactoryGet_FBC_ColorTemp_Mode();
- ret = mpTv->Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(ret);
- }
- r->writeInt32(ret);
- break;
- }
- case SAVE_COLOR_TEMPERATURE: {
- int mode = p.readInt32();
- int source_type = p.readInt32();
- int ret = mpTv->Tv_SaveColorTemp((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SET_DISPLAY_MODE: {
- int mode = p.readInt32();
- int source_type = p.readInt32();
- int fmt = p.readInt32();
- int is_save = p.readInt32();
- int ret = mpTv->Tv_SetDisplayMode((vpp_display_mode_t)mode, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, is_save);
- r->writeInt32(ret);
- break;
- }
- case GET_DISPLAY_MODE: {
- int source_type = p.readInt32();
- int ret = (int)mpTv->Tv_GetDisplayMode((tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SAVE_DISPLAY_MODE: {
- int mode = p.readInt32();
- int source_type = p.readInt32();
- int ret = mpTv->Tv_SaveDisplayMode((vpp_display_mode_t)mode, (tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SET_NOISE_REDUCTION_MODE: {
- int mode = p.readInt32();
- int source_type = p.readInt32();
- int is_save = p.readInt32();
- int ret = mpTv->Tv_SetNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type, is_save);
- r->writeInt32(ret);
- break;
- }
- case GET_NOISE_REDUCTION_MODE: {
- int source_type = p.readInt32();
- int ret = mpTv->Tv_GetNoiseReductionMode((tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SAVE_NOISE_REDUCTION_MODE: {
- int mode = p.readInt32();
- int source_type = p.readInt32();
- int ret = mpTv->Tv_SaveNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type);
- r->writeInt32(ret);
- break;
- }
- case SETRGBOGO_POSTOFFSET: {
- int type = p.readInt32();
- int offset = p.readInt32();
- int ret = 0;
- ret = mpTv->Tv_SetRGBOGO_PostOffset(type, offset);
- r->writeInt32(ret);
- break;
- }
- case SETRGBOGO_GAIN: {
- int type = p.readInt32();
- int mode = p.readInt32();
- int ret = 0;
- ret = mpTv->Tv_SetRGBOGO_Gain(type, mode);
- r->writeInt32(ret);
- break;
- }
- case GETRGBOGO_POSTOFFSET: {
- int ret = 0;
- int type = p.readInt32();
- ret = mpTv->Tv_GetRGBOGO_PostOffset(type);
- r->writeInt32(ret);
- break;
- }
- case GETRGBOGO_GAIN: {
- int type = p.readInt32();
- int ret = 0;
- ret = mpTv->Tv_GetRGBOGO_Gain(type);
- r->writeInt32(ret);
- break;
- }
- // PQ END
-
- // FACTORY
- case FACTORY_SETPQMODE_BRIGHTNESS: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int brightness = p.readInt32();
- int ret = mpTv->Tv_FactorySetPQMode_Brightness(source_type, pq_mode, brightness);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETPQMODE_BRIGHTNESS: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetPQMode_Brightness(source_type, pq_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETPQMODE_CONTRAST: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int contrast = p.readInt32();
- int ret = mpTv->Tv_FactorySetPQMode_Contrast(source_type, pq_mode, contrast);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETPQMODE_CONTRAST: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetPQMode_Contrast(source_type, pq_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETPQMODE_SATURATION: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int saturation = p.readInt32();
- int ret = mpTv->Tv_FactorySetPQMode_Saturation(source_type, pq_mode, saturation);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETPQMODE_SATURATION: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetPQMode_Saturation(source_type, pq_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETPQMODE_HUE: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int hue = p.readInt32();
- int ret = mpTv->Tv_FactorySetPQMode_Hue(source_type, pq_mode, hue);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETPQMODE_HUE: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetPQMode_Hue(source_type, pq_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETPQMODE_SHARPNESS: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int sharpness = p.readInt32();
- int ret = mpTv->Tv_FactorySetPQMode_Sharpness(source_type, pq_mode, sharpness);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETPQMODE_SHARPNESS: {
- int source_type = p.readInt32();
- int pq_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetPQMode_Sharpness(source_type, pq_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETCOLORTEMP_RGAIN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int rgain = p.readInt32();
- int ret = mpTv->Tv_FactorySetColorTemp_Rgain(source_type, colortemp_mode, rgain);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SAVECOLORTEMP_RGAIN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int rgain = p.readInt32();
- int ret = mpTv->Tv_FactorySaveColorTemp_Rgain(source_type, colortemp_mode, rgain);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETCOLORTEMP_RGAIN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetColorTemp_Rgain(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETCOLORTEMP_GGAIN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ggain = p.readInt32();
- int ret = mpTv->Tv_FactorySetColorTemp_Ggain(source_type, colortemp_mode, ggain);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SAVECOLORTEMP_GGAIN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ggain = p.readInt32();
- int ret = mpTv->Tv_FactorySaveColorTemp_Ggain(source_type, colortemp_mode, ggain);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETCOLORTEMP_GGAIN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetColorTemp_Ggain(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETCOLORTEMP_BGAIN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int bgain = p.readInt32();
- int ret = mpTv->Tv_FactorySetColorTemp_Bgain(source_type, colortemp_mode, bgain);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SAVECOLORTEMP_BGAIN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int bgain = p.readInt32();
- int ret = mpTv->Tv_FactorySaveColorTemp_Bgain(source_type, colortemp_mode, bgain);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETCOLORTEMP_BGAIN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetColorTemp_Bgain(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETCOLORTEMP_ROFFSET: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int roffset = p.readInt32();
- int ret = mpTv->Tv_FactorySetColorTemp_Roffset(source_type, colortemp_mode, roffset);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SAVECOLORTEMP_ROFFSET: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int roffset = p.readInt32();
- int ret = mpTv->Tv_FactorySaveColorTemp_Roffset(source_type, colortemp_mode, roffset);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETCOLORTEMP_ROFFSET: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetColorTemp_Roffset(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETCOLORTEMP_GOFFSET: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int goffset = p.readInt32();
- int ret = mpTv->Tv_FactorySetColorTemp_Goffset(source_type, colortemp_mode, goffset);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SAVECOLORTEMP_GOFFSET: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int goffset = p.readInt32();
- int ret = mpTv->Tv_FactorySaveColorTemp_Goffset(source_type, colortemp_mode, goffset);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETCOLORTEMP_GOFFSET: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetColorTemp_Goffset(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETCOLORTEMP_BOFFSET: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int boffset = p.readInt32();
- int ret = mpTv->Tv_FactorySetColorTemp_Boffset(source_type, colortemp_mode, boffset);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SAVECOLORTEMP_BOFFSET: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int boffset = p.readInt32();
- int ret = mpTv->Tv_FactorySaveColorTemp_Boffset(source_type, colortemp_mode, boffset);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETCOLORTEMP_BOFFSET: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetColorTemp_Boffset(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETTESTPATTERN: {
- int pattern = p.readInt32();
- int ret = mpTv->Tv_FactorySetTestPattern(pattern);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETTESTPATTERN: {
- int ret = mpTv->Tv_FactoryGetTestPattern();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_RESETPQMODE: {
- int ret = mpTv->Tv_FactoryResetPQMode();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_RESETCOLORTEMP: {
- int ret = mpTv->Tv_FactoryResetColorTemp();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_RESETPAMAMSDEFAULT: {
- int ret = mpTv->Tv_FactorySetParamsDefault();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETDDRSSC: {
- int setp = p.readInt32();
- int ret = mpTv->Tv_FactorySetDDRSSC(setp);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETDDRSSC: {
- int ret = mpTv->Tv_FactoryGetDDRSSC();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETLVDSSSC: {
- int setp = p.readInt32();
- int ret = mpTv->Tv_FactorySetLVDSSSC(setp);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETLVDSSSC: {
- int ret = mpTv->Tv_FactoryGetLVDSSSC();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETNOLINEPARAMS: {
- noline_params_t params;
- int noline_params_type = p.readInt32();
- int source_type = p.readInt32();
- params.osd0 = p.readInt32();
- params.osd25 = p.readInt32();
- params.osd50 = p.readInt32();
- params.osd75 = p.readInt32();
- params.osd100 = p.readInt32();
- int ret = mpTv->Tv_FactorySetNolineParams(noline_params_type, source_type, params);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETNOLINEPARAMS: {
- int noline_params_type = p.readInt32();
- int source_type = p.readInt32();
- noline_params_t params = mpTv->Tv_FactoryGetNolineParams(noline_params_type, source_type);
- r->writeInt32(params.osd0);
- r->writeInt32(params.osd25);
- r->writeInt32(params.osd50);
- r->writeInt32(params.osd75);
- r->writeInt32(params.osd100);
- break;
- }
- case FACTORY_SETOVERSCAN: {
- tvin_cutwin_t cutwin_t;
- int source_type = p.readInt32();
- int fmt = p.readInt32();
- int status_3d = p.readInt32();
- int trans_fmt = p.readInt32();
- cutwin_t.hs = p.readInt32();
- cutwin_t.he = p.readInt32();
- cutwin_t.vs = p.readInt32();
- cutwin_t.ve = p.readInt32();
- int ret = mpTv->Tv_FactorySetOverscan(source_type, fmt, status_3d, trans_fmt, cutwin_t);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETOVERSCAN: {
- int source_type = p.readInt32();
- int fmt = p.readInt32();
- int status_3d = p.readInt32();
- int trans_fmt = p.readInt32();
- tvin_cutwin_t cutwin_t = mpTv->Tv_FactoryGetOverscan(source_type, fmt, status_3d, trans_fmt);
- r->writeInt32(cutwin_t.hs);
- r->writeInt32(cutwin_t.he);
- r->writeInt32(cutwin_t.vs);
- r->writeInt32(cutwin_t.ve);
- break;
- }
- case FACTORY_SET_OUT_DEFAULT: {
- int ret = 0;
- ret = mpTv->Tv_SSMFacRestoreDefaultSetting();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETGLOBALOGO_RGAIN: {
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETGLOBALOGO_GGAIN: {
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETGLOBALOGO_BGAIN: {
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETGLOBALOGO_ROFFSET: {
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETGLOBALOGO_GOFFSET: {
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETGLOBALOGO_BOFFSET: {
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETGLOBALOGO_RGAIN: {
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETGLOBALOGO_GGAIN: {
- int p1 = p.readInt32();
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETGLOBALOGO_BGAIN: {
- int p1 = p.readInt32();
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETGLOBALOGO_ROFFSET: {
- int p1 = p.readInt32();
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETGLOBALOGO_GOFFSET: {
- int p1 = p.readInt32();
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETGLOBALOGO_BOFFSET: {
- int p1 = p.readInt32();
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case FACTORY_CLEAN_ALL_TABLE_FOR_PROGRAM: {
- int ret = mpTv->ClearAnalogFrontEnd();
- mpTv->clearDbAllProgramInfoTable();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETBACKLIGHT_PWM_FREQUENCY: {
- int value = p.readInt32();
- int ret = 0;//mpTv->GetVpp().Tv_FactorySetBacklightPWM_Frequency(value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETBACKLIGHT_PWM_FREQUENCY: {
- int ret = 0;//mpTv->GetVpp().Tv_FactoryGetBacklightPWM_Frequency();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETBACKLIGHT_SWITCH_STATUS: {
- int value = p.readInt32();
- int ret = 0;//mpTv->GetVpp().Tv_FactorySetBacklight_Switch_status(value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETBACKLIGHT_SWITCH_STATUS: {
- int ret = 0;//mpTv->GetVpp().Tv_FactoryGetBacklight_Switch_status();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETBACKLIGHT_PWM_DUTY: {
- int value = p.readInt32();
- int ret = 0;//mpTv->GetVpp().Tv_FactorySetBacklightPWM_Duty(value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETBACKLIGHT_PWM_DUTY: {
- int ret = 0;//mpTv->GetVpp().Tv_FactoryGetBacklightPWM_Duty();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_SETLVDS_COLOR_DEPTH: {
- int value = p.readInt32();
- int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_ColorDepth(value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETLVDS_COLOR_DEPTH: {
- int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_ColorDepth();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETLVDS_DITHER_STATUS: {
- int value = p.readInt32();
- int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_ColorDither_status(value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETLVDS_DITHER_STATUS: {
- int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_ColorDither_status();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETLVDS_MAPPING_STATUS: {
- int value = p.readInt32();
- int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_Mapping_status(value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETLVDS_MAPPING_STATUS: {
- int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_Mapping_status();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_SETLVDS_PORT_SWAP_STATUS: {
- int value = p.readInt32();
- int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_PortSwap_status(value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_GETLVDS_PORT_SWAP_STATUS: {
- int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_PortSwap_status();
- r->writeInt32(ret);
- break;
- }
- // FACTORY END
-
- // AUDIO
- // AUDIO MUTE
- case SET_AUDIO_MUTEKEY_STATUS: {
- int status = p.readInt32();
- int ret = mpTv->SetAudioMuteForSystem(status);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_MUTEKEY_STATUS: {
- int ret = mpTv->GetAudioMuteForSystem();
- r->writeInt32(ret);
- break;
- }
- case SET_AUDIO_FORCE_MUTE_STATUS: {
- int status = p.readInt32();
- int ret = 0;//pTv->getTvAudio().AudioSetForceMuteStatus(status);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_FORCE_MUTE_STATUS: {
- int ret = 0;//mpTv->AudioGetForceMuteStatus();
- r->writeInt32(ret);
- break;
- }
- case SET_AUDIO_AVOUT_MUTE_STATUS: {
- int status = p.readInt32();
- int ret = mpTv->SetAudioAVOutMute(status);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_AVOUT_MUTE_STATUS: {
- int ret = mpTv->GetAudioAVOutMute();
- r->writeInt32(ret);
- break;
- }
- case SET_AUDIO_SPDIF_MUTE_STATUS: {
- int status = p.readInt32();
- int ret = mpTv->SetAudioSPDIFMute(status);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_SPDIF_MUTE_STATUS: {
- int ret = mpTv->GetAudioSPDIFMute();
- r->writeInt32(ret);
- break;
- }
- // AUDIO MASTER VOLUME
- case SET_AUDIO_MASTER_VOLUME: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioMasterVolume(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_MASTER_VOLUME: {
- int ret = mpTv->GetAudioMasterVolume();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_MASTER_VOLUME: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioMasterVolume(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_MASTER_VOLUME: {
- int ret = mpTv->GetCurAudioMasterVolume();
- r->writeInt32(ret);
- break;
- }
- //AUDIO BALANCE
- case SET_AUDIO_BALANCE: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioBalance(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_BALANCE: {
- int ret = mpTv->GetAudioBalance();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_BALANCE: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioBalance(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_BALANCE: {
- int ret = mpTv->GetCurAudioBalance();
- r->writeInt32(ret);
- break;
- }
- //AUDIO SUPPERBASS VOLUME
- case SET_AUDIO_SUPPER_BASS_VOLUME: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioSupperBassVolume(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_SUPPER_BASS_VOLUME: {
- int ret = mpTv->GetAudioSupperBassVolume();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_SUPPER_BASS_VOLUME: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioSupperBassVolume(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_SUPPER_BASS_VOLUME: {
- int ret = mpTv->GetCurAudioSupperBassVolume();
- r->writeInt32(ret);
- break;
- }
- //AUDIO SUPPERBASS SWITCH
- case SET_AUDIO_SUPPER_BASS_SWITCH: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioSupperBassSwitch(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_SUPPER_BASS_SWITCH: {
- int ret = mpTv->GetAudioSupperBassSwitch();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_SUPPER_BASS_SWITCH: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioSupperBassSwitch(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_SUPPER_BASS_SWITCH: {
- int ret = mpTv->GetCurAudioSupperBassSwitch();
- r->writeInt32(ret);
- break;
- }
- //AUDIO SRS SURROUND SWITCH
- case SET_AUDIO_SRS_SURROUND: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioSRSSurround(vol);
- mpTv->RefreshAudioMasterVolume(SOURCE_MAX);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_SRS_SURROUND: {
- int ret = mpTv->GetAudioSRSSurround();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_SRS_SURROUND: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioSrsSurround(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_SRS_SURROUND: {
- int ret = mpTv->GetCurAudioSRSSurround();
- r->writeInt32(ret);
- break;
- }
- //AUDIO SRS DIALOG CLARITY
- case SET_AUDIO_SRS_DIALOG_CLARITY: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioSrsDialogClarity(vol);
- mpTv->RefreshAudioMasterVolume(SOURCE_MAX);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_SRS_DIALOG_CLARITY: {
- int ret = mpTv->GetAudioSrsDialogClarity();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_SRS_DIALOG_CLARITY: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioSrsDialogClarity(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_SRS_DIALOG_CLARITY: {
- int ret = mpTv->GetCurAudioSrsDialogClarity();
- r->writeInt32(ret);
- break;
- }
- //AUDIO SRS TRUBASS
- case SET_AUDIO_SRS_TRU_BASS: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioSrsTruBass(vol);
- mpTv->RefreshAudioMasterVolume(SOURCE_MAX);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_SRS_TRU_BASS: {
- int ret = mpTv->GetAudioSrsTruBass();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_SRS_TRU_BASS: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioSrsTruBass(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_SRS_TRU_BASS: {
- int ret = mpTv->GetCurAudioSrsTruBass();
- r->writeInt32(ret);
- break;
- }
- //AUDIO BASS
- case SET_AUDIO_BASS_VOLUME: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioBassVolume(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_BASS_VOLUME: {
- int ret = mpTv->GetAudioBassVolume();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_BASS_VOLUME: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioBassVolume(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_BASS_VOLUME: {
- int ret = mpTv->GetCurAudioBassVolume();
- r->writeInt32(ret);
- break;
- }
- //AUDIO TREBLE
- case SET_AUDIO_TREBLE_VOLUME: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioTrebleVolume(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_TREBLE_VOLUME: {
- int ret = mpTv->GetAudioTrebleVolume();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_TREBLE_VOLUME: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioTrebleVolume(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_TREBLE_VOLUME: {
- int ret = mpTv->GetCurAudioTrebleVolume();
- r->writeInt32(ret);
- break;
- }
- //AUDIO SOUND MODE
- case SET_AUDIO_SOUND_MODE: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioSoundMode(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_SOUND_MODE: {
- int ret = mpTv->GetAudioSoundMode();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_SOUND_MODE: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioSoundMode(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_SOUND_MODE: {
- int ret = mpTv->GetCurAudioSoundMode();
- r->writeInt32(ret);
- break;
- }
- //AUDIO WALL EFFECT
- case SET_AUDIO_WALL_EFFECT: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioWallEffect(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_WALL_EFFECT: {
- int ret = mpTv->GetAudioWallEffect();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_WALL_EFFECT: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioWallEffect(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_WALL_EFFECT: {
- int ret = mpTv->GetCurAudioWallEffect();
- r->writeInt32(ret);
- break;
- }
- //AUDIO EQ MODE
- case SET_AUDIO_EQ_MODE: {
- int vol = p.readInt32();
- int ret = mpTv->SetAudioEQMode(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_EQ_MODE: {
- int ret = mpTv->GetAudioEQMode();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_EQ_MODE: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioEQMode(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_EQ_MODE: {
- int ret = mpTv->GetCurAudioEQMode();
- r->writeInt32(ret);
- break;
- }
- //AUDIO EQ GAIN
- case GET_AUDIO_EQ_RANGE: {
- int buf[2];
- int ret = mpTv->GetAudioEQRange(buf);
- r->writeInt32(2);
- r->writeInt32(buf[0]);
- r->writeInt32(buf[1]);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_EQ_BAND_COUNT: {
- int ret = mpTv->GetAudioEQBandCount();
- r->writeInt32(ret);
- break;
- }
- case SET_AUDIO_EQ_GAIN: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- tmp_buf_size = p.readInt32();
- for (i = 0; i < tmp_buf_size; i++) {
- tmp_i_buf[i] = p.readInt32();
- }
- ret = mpTv->SetAudioEQGain(tmp_i_buf);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_EQ_GAIN: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- ret = mpTv->GetAudioEQGain(tmp_i_buf);
- tmp_buf_size = mpTv->GetAudioEQBandCount();
- r->writeInt32(tmp_buf_size);
- for (i = 0; i < tmp_buf_size; i++) {
- r->writeInt32(tmp_i_buf[i]);
- }
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_EQ_GAIN: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- tmp_buf_size = p.readInt32();
- for (i = 0; i < tmp_buf_size; i++) {
- tmp_i_buf[i] = p.readInt32();
- }
- ret = mpTv->SaveCurAudioEQGain(tmp_i_buf);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_EQ_GAIN: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- ret = mpTv->GetCurAudioEQGain(tmp_i_buf);
- tmp_buf_size = mpTv->GetAudioEQBandCount();
- r->writeInt32(tmp_buf_size);
- for (i = 0; i < tmp_buf_size; i++) {
- r->writeInt32(tmp_i_buf[i]);
- }
- r->writeInt32(ret);
- break;
- }
- case SET_AUDIO_EQ_SWITCH: {
- int tmpVal = p.readInt32();
- int ret = mpTv->SetAudioEQSwitch(tmpVal);
- r->writeInt32(ret);
- break;
- }
- // AUDIO SPDIF SWITCH
- case SET_AUDIO_SPDIF_SWITCH: {
- int tmp_val = p.readInt32();
- int ret = mpTv->SetAudioSPDIFSwitch(tmp_val);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_SPDIF_SWITCH: {
- int ret = 0;//mpTv->GetAudioSPDIFSwitch();
- r->writeInt32(ret);
- break;
- }
- case AUDIO_SET_DOUBLE_OUTPUT_ENABLE: {
- int tmp_val = p.readInt32();
- int ret = mpTv->amAudioSetDoubleOutputSwitch(tmp_val);
- r->writeInt32(ret);
- break;
- }
- case USB_AUDIO_OUPUT_MODULE_ENABLE: {
- int tmp_val = p.readInt32();
- int ret = mpTv->UsbAudioOuputModuleSwitch(tmp_val);
- r->writeInt32(ret);
- break;
- }
-
- case GET_USB_AUDIO_DOUBLE_OUPUT_MODULE_ENABLE: {
- int ret = mpTv->GetAmAudioSetDoubleOutputSwitch();
- r->writeInt32(ret);
- break;
- }
-
- case GET_USB_AUDIO_OUPUT_MODULE_ENABLE: {
- int ret = mpTv->GetCurUsbAudioOuputModuleSwitch();
- r->writeInt32(ret);
- break;
- }
-
- case SAVE_CUR_AUDIO_SPDIF_SWITCH: {
- int tmp_val = p.readInt32();
- int ret = mpTv->SaveCurAudioSPDIFSwitch(tmp_val);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_SPDIF_SWITCH: {
- int ret = mpTv->GetCurAudioSPDIFSwitch();
- r->writeInt32(ret);
- break;
- }
- //AUDIO SPDIF MODE
- case SET_AUDIO_SPDIF_MODE: {
- int vol = p.readInt32();
- int progId = p.readInt32();
- int audioTrackId = p.readInt32();
- int ret = mpTv->SetAudioSPDIFMode(vol);
- mpTv->ResetAudioDecoderForPCMOutput();
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_SPDIF_MODE: {
- int ret = 0;//mpTv->GetAudioSPDIFMode();
- r->writeInt32(ret);
- break;
- }
- case SAVE_CUR_AUDIO_SPDIF_MODE: {
- int vol = p.readInt32();
- int ret = mpTv->SaveCurAudioSPDIFMode(vol);
- r->writeInt32(ret);
- break;
- }
- case GET_CUR_AUDIO_SPDIF_MODE: {
- int ret = mpTv->GetCurAudioSPDIFMode();
- r->writeInt32(ret);
- break;
- }
- case OPEN_AMAUDIO: {
- int sr = p.readInt32();
- int output_dev = p.readInt32();
- int ret = mpTv->OpenAmAudio(sr, output_dev);
- r->writeInt32(ret);
- break;
- }
- case CLOSE_AMAUDIO: {
- int ret = mpTv->CloseAmAudio();
- r->writeInt32(ret);
- break;
- }
- case SET_AMAUDIO_INPUT_SR: {
- int sr = p.readInt32();
- int output_dev = p.readInt32();
- int ret = mpTv->SetAmAudioInputSr(sr, output_dev);
- r->writeInt32(ret);
- break;
- }
- case SET_AMAUDIO_OUTPUT_MODE: {
- int tmp_val = p.readInt32();
- int ret = mpTv->SetAmAudioOutputMode(tmp_val);
- r->writeInt32(ret);
- break;
- }
- case SET_AMAUDIO_MUSIC_GAIN: {
- int tmp_val = p.readInt32();
- int ret = mpTv->SetAmAudioMusicGain(tmp_val);
- r->writeInt32(ret);
- break;
- }
- case SET_AMAUDIO_LEFT_GAIN: {
- int tmp_val = p.readInt32();
- int ret = mpTv->SetAmAudioLeftGain(tmp_val);
- r->writeInt32(ret);
- break;
- }
- case SET_AMAUDIO_RIGHT_GAIN: {
- int tmp_val = p.readInt32();
- int ret = mpTv->SetAmAudioRightGain(tmp_val);
- r->writeInt32(ret);
- break;
- }
- case SELECT_LINE_IN_CHANNEL: {
- int channel = p.readInt32();
- int ret = mpTv->AudioLineInSelectChannel(channel);
- r->writeInt32(ret);
- LOGD("SELECT_LINE_IN_CHANNEL: channel = %d; ret = %d.\n", channel, ret);
- break;
- }
- case SET_KALAOK_IO_LEVEL: {
- int level = p.readInt32();
- int ret = mpTv->SetKalaokIO(level);
- r->writeInt32(ret);
- mpTv->AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN);
- LOGD("SET KALAOK H LEVEL: level = %d; ret = %d.\n", level, ret);
- break;
- }
-
- case SET_LINE_IN_CAPTURE_VOL: {
- int l_vol = p.readInt32();
- int r_vol = p.readInt32();
- int ret = mpTv->AudioSetLineInCaptureVolume(l_vol, r_vol);
- r->writeInt32(ret);
- break;
- }
- case HANDLE_AUDIO_HEADSET_PLUG_IN: {
- int ret = mpTv->AudioHandleHeadsetPlugIn();
- r->writeInt32(ret);
- break;
- }
- case HANDLE_AUDIO_HEADSET_PULL_OUT: {
- int ret = mpTv->AudioHandleHeadsetPullOut();
- r->writeInt32(ret);
- break;
- }
- case SET_AUDIO_VOL_COMP: {
- int tmpVal = p.readInt32();
- int ret = mpTv->SetCurProgramAudioVolumeCompensationVal(tmpVal);
- r->writeInt32(ret);
- break;
- }
- case GET_AUDIO_VOL_COMP: {
- int ret = mpTv->GetAudioVolumeCompensationVal(-1);
- r->writeInt32(ret);
- break;
- }
- case SAVE_AUDIO_VOL_COMP: {
- int tmpVal = p.readInt32();
- int ret = -1;//mpTv->atvSaveAudioVolumeCompensationVal(tmpVal);
- LOGD("this cmd is empty!!!!!!!!!!!!!!!!!!!");
- r->writeInt32(ret);
- break;
- }
- case SET_NOISE_GATE_THRESHOLD: {
- int ret = 0;
- r->writeInt32(ret);
- break;
- }
- case SET_AUDIO_SOURCE_FOR_KARAOKE: {
- int sourceinput = p.readInt32();
- int ret = mpTv->Tv_SetAudioSourceType((tv_source_input_t)sourceinput);
- r->writeInt32(ret);
- break;
- }
- // AUDIO END
-
- // SSM
- case SSM_INIT_DEVICE: {
- int tmpRet = 0;
- tmpRet = mpTv->Tv_SSMRestoreDefaultSetting();//mpTv->Tv_SSMInitDevice();
- r->writeInt32(tmpRet);
- break;
- }
- /*case SSM_SAVE_ONE_BYTE: {
- int tmpOffset = p.readInt32();
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = SSMWriteOneByte(tmpOffset, tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_ONE_BYTE: {
- int tmpOffset = p.readInt32();
- int tmpRet = 0;
- SSMReadOneByte(tmpOffset, &tmpRet);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_N_BYTES: {
- int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
-
- tmp_offset = p.readInt32();
- tmp_data_len = p.readInt32();
-
- if (tmp_data_len > 0) {
- data_ptr = new int[tmp_data_len];
-
- if (data_ptr != NULL) {
- for (i = 0; i < tmp_data_len; i++) {
- data_ptr[i] = p.readInt32();
- }
-
- ret = SSMWriteNTypes(tmp_offset, tmp_data_len, data_ptr);
-
- delete data_ptr;
- data_ptr = NULL;
- }
- }
-
- r->writeInt32(ret);
- break;
- }
- case SSM_READ_N_BYTES: {
- int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
- tmp_offset = p.readInt32();
- tmp_data_len = p.readInt32();
-
- if (tmp_data_len > 0) {
- data_ptr = new int[tmp_data_len];
- if (data_ptr != NULL) {
- ret = SSMReadNTypes(tmp_offset, tmp_data_len, data_ptr);
- if (ret < 0) {
- tmp_data_len = 0;
- }
- r->writeInt32(tmp_data_len);
- for (i = 0; i < tmp_data_len; i++) {
- r->writeInt32(data_ptr[i]);
- }
- delete data_ptr;
- data_ptr = NULL;
- }
- }
- r->writeInt32(ret);
- break;
- }*/
- case SSM_SAVE_POWER_ON_OFF_CHANNEL: {
- int tmpPowerChanNum = p.readInt32();
- int tmpRet;
- tmpRet = SSMSavePowerOnOffChannel(tmpPowerChanNum);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_POWER_ON_OFF_CHANNEL: {
- int tmpRet = 0;
- tmpRet = SSMReadPowerOnOffChannel();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_SOURCE_INPUT: {
- int tmpSouceInput = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveSourceInput(tmpSouceInput);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_SOURCE_INPUT: {
- int tmpRet = 0;
- tmpRet = SSMReadSourceInput();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_LAST_SOURCE_INPUT: {
- int tmpLastSouceInput = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveLastSelectSourceInput(tmpLastSouceInput);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_LAST_SOURCE_INPUT: {
- int tmpRet = 0;
- tmpRet = SSMReadLastSelectSourceInput();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_SYS_LANGUAGE: {
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveSystemLanguage(tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_SYS_LANGUAGE: {
- int tmpRet = 0;
- tmpRet = SSMReadSystemLanguage();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_AGING_MODE: {
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveAgingMode(tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_AGING_MODE: {
- int tmpRet = 0;
- tmpRet = SSMReadAgingMode();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_PANEL_TYPE: {
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = SSMSavePanelType(tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_PANEL_TYPE: {
- int tmpRet = 0;
- tmpRet = SSMReadPanelType();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_MAC_ADDR: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- tmp_buf_size = p.readInt32();
- for (i = 0; i < tmp_buf_size; i++) {
- tmp_uc_buf[i] = p.readInt32();
- }
- ret = KeyData_SaveMacAddress(tmp_uc_buf);
- r->writeInt32(ret);
- break;
- }
- case SSM_READ_MAC_ADDR: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- ret = KeyData_ReadMacAddress(tmp_uc_buf);
- tmp_buf_size = KeyData_GetMacAddressDataLen();
- r->writeInt32(tmp_buf_size);
- for (i = 0; i < tmp_buf_size; i++) {
- r->writeInt32(tmp_uc_buf[i]);
- }
- r->writeInt32(ret);
- break;
- }
- case SSM_SAVE_BAR_CODE: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- tmp_buf_size = p.readInt32();
- for (i = 0; i < tmp_buf_size; i++) {
- tmp_uc_buf[i] = p.readInt32();
- }
- ret = KeyData_SaveBarCode(tmp_uc_buf);
- r->writeInt32(ret);
- break;
- }
- case SSM_READ_BAR_CODE: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- ret = KeyData_ReadBarCode(tmp_uc_buf);
- tmp_buf_size = KeyData_GetBarCodeDataLen();
- r->writeInt32(tmp_buf_size);
- for (i = 0; i < tmp_buf_size; i++) {
- r->writeInt32(tmp_uc_buf[i]);
- }
- r->writeInt32(ret);
- break;
- }
- case SSM_SAVE_PROJECT_ID: {
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = KeyData_SaveProjectID(tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_PROJECT_ID: {
- int tmpRet = 0;
- tmpRet = KeyData_ReadProjectID();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_HDCPKEY: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- tmp_buf_size = p.readInt32();
- for (i = 0; i < tmp_buf_size; i++) {
- tmp_uc_buf[i] = p.readInt32();
- }
- ret = SSMSaveHDCPKey(tmp_uc_buf);
- r->writeInt32(ret);
- break;
- }
- case SSM_READ_HDCPKEY: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- ret = SSMReadHDCPKey(tmp_uc_buf);
- tmp_buf_size = SSMGetHDCPKeyDataLen();
- r->writeInt32(tmp_buf_size);
- for (i = 0; i < tmp_buf_size; i++) {
- r->writeInt32(tmp_uc_buf[i]);
- }
- r->writeInt32(ret);
- break;
- }
- case SSM_SAVE_POWER_ON_MUSIC_SWITCH: {
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = SSMSavePowerOnMusicSwitch(tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_POWER_ON_MUSIC_SWITCH: {
- int tmpRet = 0;
- tmpRet = SSMReadPowerOnMusicSwitch();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_POWER_ON_MUSIC_VOL: {
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = SSMSavePowerOnMusicVolume(tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_POWER_ON_MUSIC_VOL: {
- int tmpRet = 0;
- tmpRet = SSMReadPowerOnMusicVolume();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_SYS_SLEEP_TIMER: {
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveSystemSleepTimer(tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_SYS_SLEEP_TIMER: {
- int tmpRet = 0;
- tmpRet = SSMReadSystemSleepTimer();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SET_BUS_STATUS: {
- int tmpVal = p.readInt32();
- int tmpRet = 0;
- //showboz
- //tmpRet = SSMSetBusStatus(tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_GET_BUS_STATUS: {
- int tmpRet = 0;
- //showboz
- //tmpRet = SSMGetBusStatus();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_INPUT_SRC_PARENTAL_CTL: {
- int tmpSourceIndex = p.readInt32();
- int tmpCtlFlag = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveInputSourceParentalControl(tmpSourceIndex, tmpCtlFlag);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_INPUT_SRC_PARENTAL_CTL: {
- int tmpSourceIndex = p.readInt32();
- int tmpRet = 0;
- tmpRet = SSMReadInputSourceParentalControl(tmpSourceIndex);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_PARENTAL_CTL_SWITCH: {
- int tmpSwitchFlag = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveParentalControlSwitch(tmpSwitchFlag);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_PARENTAL_CTL_SWITCH: {
- int tmpRet = 0;
- tmpRet = SSMReadParentalControlSwitch();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_PARENTAL_CTL_PASS_WORD: {
- String16 pass_wd_str = p.readString16();
- int tmpRet;
- tmpRet = SSMSaveParentalControlPassWord((unsigned char *)pass_wd_str.string(), pass_wd_str.size() * sizeof(unsigned short));
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_PARENTAL_CTL_PASS_WORD: {
- int tmpChanID = p.readInt32();
- unsigned short tmp_buf [SSM_RW_PARENTAL_CTL_PASSWORD_LEN + 1];
- String16 pass_wd_str;
- SSMReadParentalControlPassWord(tmp_buf);
- tmp_buf[SSM_RW_PARENTAL_CTL_PASSWORD_LEN / sizeof(unsigned short)] = 0;
- pass_wd_str.setTo((const unsigned short *) tmp_buf);
- r->writeString16(pass_wd_str);
- break;
- }
- case SSM_SAVE_USING_DEF_HDCP_KEY_FLAG: {
- break;
- }
- case SSM_READ_USING_DEF_HDCP_KEY_FLAG: {
- break;
- }
- case SSM_GET_CUSTOMER_DATA_START: {
- int tmpRet = 0;
- tmpRet = SSMGetCustomerDataStart();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_GET_CUSTOMER_DATA_LEN: {
- int tmpRet = 0;
- tmpRet = SSMGetCustomerDataLen();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_STANDBY_MODE: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveStandbyMode(tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_STANDBY_MODE: {
- int tmpRet = 0;
- tmpRet = SSMReadStandbyMode();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_LOGO_ON_OFF_FLAG: {
- int tmpSwitchFlag = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveLogoOnOffFlag(tmpSwitchFlag);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_LOGO_ON_OFF_FLAG: {
- int tmpRet = 0;
- tmpRet = SSMReadLogoOnOffFlag();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_HDMIEQ_MODE: {
- int tmpSwitchFlag = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveHDMIEQMode(tmpSwitchFlag);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_HDMIEQ_MODE: {
- int tmpRet = 0;
- tmpRet = SSMReadHDMIEQMode();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_HDMIINTERNAL_MODE: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveHDMIInternalMode(tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_HDMIINTERNAL_MODE: {
- int tmpRet = 0;
- tmpRet = SSMReadHDMIInternalMode();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_DISABLE_3D: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveDisable3D(tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_DISABLE_3D: {
- int tmpRet = 0;
- tmpRet = SSMReadDisable3D();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_GLOBAL_OGOENABLE: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveGlobalOgoEnable(tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_GLOBAL_OGOENABLE: {
- int tmpRet = 0;
- tmpRet = SSMReadGlobalOgoEnable();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_NON_STANDARD_STATUS: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveNonStandardValue(tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_NON_STANDARD_STATUS: {
- int tmpRet = 0;
- tmpRet = SSMReadNonStandardValue();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_ADB_SWITCH_STATUS: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveAdbSwitchValue(tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_ADB_SWITCH_STATUS: {
- int tmpRet = 0;
- tmpRet = SSMReadAdbSwitchValue();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_SERIAL_CMD_SWITCH_STATUS: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveSerialCMDSwitchValue(tmp_val);
- tmpRet |= mpTv->SetSerialSwitch(SERIAL_A, tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_SERIAL_CMD_SWITCH_STATUS: {
- int tmpRet = 0;
- tmpRet = SSMReadSerialCMDSwitchValue();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SET_HDCP_KEY: {
- int tmpRet = 0;
- tmpRet = SSMSetHDCPKey();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_REFRESH_HDCPKEY: {
- int tmpRet = 0;
- tmpRet = SSMRefreshHDCPKey();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_CHROMA_STATUS: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveChromaStatus(tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_CA_BUFFER_SIZE: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveCABufferSizeValue(tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_CA_BUFFER_SIZE: {
- int tmpRet = 0;
- tmpRet = SSMReadCABufferSizeValue();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_GET_ATV_DATA_START: {
- int tmpRet = 0;
- tmpRet = SSMGetATVDataStart();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_GET_ATV_DATA_LEN: {
- int tmpRet = 0;
- tmpRet = SSMGetATVDataLen();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_GET_VPP_DATA_START: {
- int tmpRet = 0;
- tmpRet = SSMGetVPPDataStart();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_GET_VPP_DATA_LEN: {
- int tmpRet = 0;
- tmpRet = SSMGetVPPDataLen();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_SAVE_NOISE_GATE_THRESHOLD_STATUS: {
- int tmp_val = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveNoiseGateThresholdValue(tmp_val);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_READ_NOISE_GATE_THRESHOLD_STATUS: {
- int tmpRet = 0;
- tmpRet = SSMReadNoiseGateThresholdValue();
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_EEPROM_SAVE_ONE_BYTE_N310_N311: {
- int tmpOffset = p.readInt32();
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveEEP_One_N310_N311(tmpOffset, tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_EEPROM_READ_ONE_BYTE_N310_N311: {
- int tmpOffset = p.readInt32();
- int tmpRet = 0;
- tmpRet = SSMReadEEP_One_N310_N311(tmpOffset);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_EEPROM_SAVE_N_BYTES_N310_N311: {
- int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
-
- tmp_offset = p.readInt32();
- tmp_data_len = p.readInt32();
-
- if (tmp_data_len > 0) {
- data_ptr = new int[tmp_data_len];
-
- if (data_ptr != NULL) {
- for (i = 0; i < tmp_data_len; i++) {
- data_ptr[i] = p.readInt32();
- }
-
- ret = SSMSaveEEP_N_N310_N311(tmp_offset, tmp_data_len, data_ptr);
-
- delete data_ptr;
- data_ptr = NULL;
- }
- }
-
- r->writeInt32(ret);
- break;
- }
- case SSM_EEPROM_READ_N_BYTES_N310_N311: {
- int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
- tmp_offset = p.readInt32();
- tmp_data_len = p.readInt32();
-
- if (tmp_data_len > 0) {
- data_ptr = new int[tmp_data_len];
- if (data_ptr != NULL) {
- ret = SSMReadEEP_N_N310_N311(tmp_offset, tmp_data_len, data_ptr);
- if (ret < 0) {
- tmp_data_len = 0;
- }
- r->writeInt32(tmp_data_len);
- for (i = 0; i < tmp_data_len; i++) {
- r->writeInt32(data_ptr[i]);
- }
- delete data_ptr;
- data_ptr = NULL;
- }
- }
- r->writeInt32(ret);
- break;
- }
- case SSM_FLASH_SAVE_ONE_BYTE_N310_N311: {
- int tmpOffset = p.readInt32();
- int tmpVal = p.readInt32();
- int tmpRet;
- tmpRet = SSMSaveFlash_One_N310_N311(tmpOffset, tmpVal);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_FLASH_READ_ONE_BYTE_N310_N311: {
- int tmpOffset = p.readInt32();
- int tmpRet = 0;
- tmpRet = SSMReadFlash_One_N310_N311(tmpOffset);
- r->writeInt32(tmpRet);
- break;
- }
- case SSM_FLASH_SAVE_N_BYTES_N310_N311: {
- int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
-
- tmp_offset = p.readInt32();
- tmp_data_len = p.readInt32();
-
- if (tmp_data_len > 0) {
- data_ptr = new int[tmp_data_len];
-
- if (data_ptr != NULL) {
- for (i = 0; i < tmp_data_len; i++) {
- data_ptr[i] = p.readInt32();
- }
-
- ret = SSMSaveFlash_N_N310_N311(tmp_offset, tmp_data_len, data_ptr);
-
- delete data_ptr;
- data_ptr = NULL;
- }
- }
-
- r->writeInt32(ret);
- break;
- }
- case SSM_FLASH_READ_N_BYTES_N310_N311: {
- int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
- tmp_offset = p.readInt32();
- tmp_data_len = p.readInt32();
-
- if (tmp_data_len > 0) {
- data_ptr = new int[tmp_data_len];
- if (data_ptr != NULL) {
- ret = SSMReadFlash_N_N310_N311(tmp_offset, tmp_data_len, data_ptr);
- if (ret < 0) {
- tmp_data_len = 0;
- }
- r->writeInt32(tmp_data_len);
- for (i = 0; i < tmp_data_len; i++) {
- r->writeInt32(data_ptr[i]);
- }
- delete data_ptr;
- data_ptr = NULL;
- }
- }
- r->writeInt32(ret);
- break;
- }
- // SSM END
-
- //MISC
- case MISC_PROP_SET: {
- int tmpRet;
- String16 tmp_str16;
- String8 key_str, value_str;
-
- tmp_str16 = p.readString16();
- key_str = String8(tmp_str16);
- tmp_str16 = p.readString16();
- value_str = String8(tmp_str16);
-
- tmpRet = property_set(key_str.string(), value_str.string());
- r->writeInt32(tmpRet);
- break;
- }
- case MISC_PROP_GET: {
- char prop_value[PROPERTY_VALUE_MAX];
- String16 tmp_str16;
- String8 key_str, def_str;
-
- tmp_str16 = p.readString16();
- key_str = String8(tmp_str16);
- tmp_str16 = p.readString16();
- def_str = String8(tmp_str16);
-
- memset(prop_value, '\0', PROPERTY_VALUE_MAX);
- property_get(key_str.string(), prop_value, def_str.string());
- tmp_str16 = String16(prop_value);
-
- r->writeString16(tmp_str16);
- break;
- }
- case MISC_CFG_SET: {
- int tmpRet;
- String16 tmp_str16;
- String8 key_str, value_str;
-
- tmp_str16 = p.readString16();
- key_str = String8(tmp_str16);
- tmp_str16 = p.readString16();
- value_str = String8(tmp_str16);
-
- tmpRet = config_set_str("TV", key_str.string(), value_str.string());
- r->writeInt32(tmpRet);
- break;
- }
- case MISC_CFG_GET: {
- const char *prop_value;
- String16 tmp_str16;
- String8 key_str, def_str;
-
- tmp_str16 = p.readString16();
- key_str = String8(tmp_str16);
- tmp_str16 = p.readString16();
- def_str = String8(tmp_str16);
-
- prop_value = config_get_str("TV", key_str.string(), def_str.string());
- tmp_str16 = String16(prop_value);
-
- r->writeString16(tmp_str16);
- break;
- }
- case MISC_READ_ADC_VAL: {
- int tmpChanNum = p.readInt32();
- int tmpRet = 0;
- tmpRet = ReadADCSpecialChannelValue(tmpChanNum);
- r->writeInt32(tmpRet);
- break;
- }
- case MISC_SET_WDT_USER_PET: {
- int counter = p.readInt32();
- int ret = TvMisc_SetUserCounter(counter);
- r->writeInt32(ret);
- break;
- }
- case MISC_SET_WDT_USER_COUNTER: {
- int counter_time_out = p.readInt32();
- int ret = TvMisc_SetUserCounterTimeOut(counter_time_out);
- r->writeInt32(ret);
- break;
- }
- case MISC_SET_WDT_USER_PET_RESET_ENABLE: {
- int enable = p.readInt32();
- int ret = TvMisc_SetUserPetResetEnable(enable);
- r->writeInt32(ret);
- break;
- }
- case MISC_GET_TV_API_VERSION: {
- const char *tmp_str8;
- String16 tmp_str16;
-
- // write tvapi version info
- tmp_str8 = tvservice_get_git_branch_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
-
- tmp_str8 = tvservice_get_git_version_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
-
- tmp_str8 = tvservice_get_last_chaned_time_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
-
- tmp_str8 = tvservice_get_build_time_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
-
- tmp_str8 = tvservice_get_build_name_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
- break;
- }
- case MISC_GET_DVB_API_VERSION: {
- const char *tmp_str8;
- String16 tmp_str16;
-
- // write dvb version info
- tmp_str8 = dvb_get_git_branch_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
-
- tmp_str8 = dvb_get_git_version_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
-
- tmp_str8 = dvb_get_last_chaned_time_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
-
- tmp_str8 = dvb_get_build_time_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
-
- tmp_str8 = dvb_get_build_name_info();
- tmp_str16 = String16(tmp_str8);
- r->writeString16(tmp_str16);
-
- break;
- }
- case MISC_SERIAL_SWITCH: {
- int dev_id = p.readInt32();
- int switch_val = p.readInt32();
- int ret = mpTv->SetSerialSwitch(dev_id, switch_val);
- r->writeInt32(ret);
- break;
- }
- case MISC_SERIAL_SEND_DATA: {
- int i = 0, tmp_buf_size = 0, ret = 0;
-
- int dev_id = p.readInt32();
-
- tmp_buf_size = p.readInt32();
- if (tmp_buf_size > sizeof(tmp_uc_buf)) {
- tmp_buf_size = sizeof(tmp_uc_buf);
- }
-
- for (i = 0; i < tmp_buf_size; i++) {
- tmp_uc_buf[i] = p.readInt32() & 0xFF;
- }
-
- ret = mpTv->SendSerialData(dev_id, tmp_buf_size, tmp_uc_buf);
- r->writeInt32(ret);
- break;
- }
- case MISC_CHANNEL_EXPORT: {
- LOGD("MISC_CHANNEL_EXPORT");
- int ret = 0;
- String16 tmp_str16;
- String8 tmp_str;
-
- tmp_str16 = p.readString16();
- tmp_str = String8(tmp_str16);
-
- ret = mpTv->ChannelExport(tmp_str.string());
- r->writeInt32(ret);
- break;
- }
- case MISC_CHANNEL_IMPORT: {
- LOGD("MISC_CHANNEL_IMPORT");
- String16 tmp_str16;
- String8 tmp_str;
-
- tmp_str16 = p.readString16();
- tmp_str = String8(tmp_str16);
- int ret = 0;
- ret = mpTv->ChannelImport(tmp_str.string());
- r->writeInt32(ret);
- break;
- }
- case MISC_GET_PROJECT_INFO: {
- String16 tmp_str16;
- project_info_t tmpInfo;
-
- if (mpTv->Tv_GetProjectInfo(&tmpInfo) < 0) {
- strcpy(tmpInfo.version, "UNKOWN");
- strcpy(tmpInfo.panel_type, "UNKOWN");
- strcpy(tmpInfo.panel_outputmode, "UNKOWN");
- strcpy(tmpInfo.panel_rev, "UNKOWN");
- strcpy(tmpInfo.panel_name, "UNKOWN");
- strcpy(tmpInfo.amp_curve_name, "UNKOWN");
- }
-
- r->writeString16(String16(tmpInfo.version));
- r->writeString16(String16(tmpInfo.panel_type));
- r->writeString16(String16(tmpInfo.panel_outputmode));
- r->writeString16(String16(tmpInfo.panel_rev));
- r->writeString16(String16(tmpInfo.panel_name));
- r->writeString16(String16(tmpInfo.amp_curve_name));
- break;
- }
- case MISC_GET_PLATFORM_TYPE: {
- int ret = mpTv->Tv_GetPlatformType();
- r->writeInt32(ret);
- break;
- }
- //MISC END
-
- // EXTAR
- case DELETE_DIR_FILES: {
- String16 strPath = p.readString16();
- if(strPath.size() <= 0) {
- r->writeInt32(-1);
- break;
- }
- String8 strP8 = String8(strPath);
- int tmp_flag = p.readInt32();
- int ret = TvMisc_DeleteDirFiles(strP8.string(), tmp_flag);
- r->writeInt32(ret);
- break;
- }
- case ATV_GET_CURRENT_PROGRAM_ID: {
- int atvLastProgramId = mpTv->getATVProgramID();
- r->writeInt32(atvLastProgramId);
- break;
- }
- case DTV_GET_CURRENT_PROGRAM_ID: {
- int dtvLastProgramId = mpTv->getDTVProgramID();
- r->writeInt32(dtvLastProgramId);
- break;
- }
- case ATV_SAVE_PROGRAM_ID: {
- int progID = p.readInt32();
- int retCnt = 0;
- mpTv->saveATVProgramID(progID);
- r->writeInt32(retCnt);
- break;
- }
- case ATV_GET_MIN_MAX_FREQ: {
- int min, max;
- int tmpRet = mpTv->getATVMinMaxFreq(&min, &max);
- r->writeInt32(min);
- r->writeInt32(max);
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_GET_SCAN_FREQUENCY_LIST: {
- Vector<sp<CTvChannel> > out;
- int tmpRet = CTvRegion::getChannelListByName("CHINA,Default DTMB ALL", out);
- r->writeInt32(out.size());
- for(int i = 0; i < out.size(); i++) {
- r->writeInt32(out[i]->getID());
- r->writeInt32(out[i]->getFrequency());
- }
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_GET_CHANNEL_INFO: {
- int dbID = p.readInt32();
- channel_info_t chan_info;
- int ret = mpTv->getChannelInfoBydbID(dbID, chan_info);
- r->writeInt32(chan_info.freq);
- r->writeInt32(chan_info.uInfo.dtvChanInfo.strength);
- r->writeInt32(chan_info.uInfo.dtvChanInfo.quality);
- r->writeInt32(chan_info.uInfo.dtvChanInfo.ber);
- r->writeInt32(ret);
- break;
- }
- case ATV_GET_CHANNEL_INFO: {
- int dbID = p.readInt32();
- channel_info_t chan_info;
- int ret = mpTv->getChannelInfoBydbID(dbID, chan_info);
- r->writeInt32(chan_info.freq);
- r->writeInt32(chan_info.uInfo.atvChanInfo.finefreq);
- r->writeInt32(chan_info.uInfo.atvChanInfo.videoStd);
- r->writeInt32(chan_info.uInfo.atvChanInfo.audioStd);
- r->writeInt32(chan_info.uInfo.atvChanInfo.isAutoStd);
- r->writeInt32(ret);
- break;
- }
- case ATV_SCAN_MANUAL: {
- int tmpRet = 0;
- int startFreq = p.readInt32();
- int endFreq = p.readInt32();
- int videoStd = p.readInt32();
- int audioStd = p.readInt32();
- tmpRet = mpTv->atvMunualScan(startFreq, endFreq, videoStd, audioStd);
- mTvService->mpScannerClient = this;
- r->writeInt32(tmpRet);
- break;
- }
- case ATV_SCAN_MANUAL_BY_NUMBER: {
- int tmpRet = 0;
- int startFreq = p.readInt32();
- int endFreq = p.readInt32();
- int videoStd = p.readInt32();
- int audioStd = p.readInt32();
- int storeType = p.readInt32();
- int currentNum = p.readInt32();
- tmpRet = mpTv->atvMunualScan(startFreq, endFreq, videoStd, audioStd, storeType, currentNum);
- mTvService->mpScannerClient = this;
- r->writeInt32(tmpRet);
- break;
- }
-
- case ATV_SCAN_AUTO: {
- int tmpRet = 0;
- LOGD("%s, atv auto scan!!!\n", "TV");
- int videoStd = p.readInt32();
- int audioStd = p.readInt32();
- int searchType = p.readInt32();
- tmpRet = mpTv->atvAutoScan(videoStd, audioStd, searchType);
- mTvService->mpScannerClient = this;
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_SCAN_MANUAL: {
- int tmpRet = 0;
- int freq = p.readInt32();
- tmpRet = mpTv->dtvManualScan(freq, freq);
- mTvService->mpScannerClient = this;
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_SCAN_MANUAL_BETWEEN_FREQ: {
- int tmpRet = 0;
- int beginFreq = p.readInt32();
- int endFreq = p.readInt32();
- int modulation = p.readInt32();
- tmpRet = mpTv->dtvManualScan(beginFreq, endFreq, modulation);
- mTvService->mpScannerClient = this;
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_SCAN_AUTO: {
- int tmpRet = 0;
- tmpRet = mpTv->dtvAutoScan();
- mTvService->mpScannerClient = this;
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_SCAN_AUTO_ATSC: {
- int tmpRet = 0;
- int attenna = p.readInt32();
- int vstd = p.readInt32();
- int astd = p.readInt32();
- tmpRet = mpTv->dtvAutoScanAtscLock(attenna, vstd, astd);
- mTvService->mpScannerClient = this;
- r->writeInt32(tmpRet);
- break;
- }
- case TV_SUBTITLE_DRAW_END: {
- int tmpRet = 0;
- //if(pSub)pSub->lock.unlock();
- r->writeInt32(tmpRet);
- break;
- }
- case STOP_PROGRAM_PLAY: {
- int tmpRet = -1;
- tmpRet = mpTv->stopPlayingLock();
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_TEST_1: {
- // int progid = p.readInt32();
- //CTvProgram prog;
- // int ret = CTvProgram::selectByID(progid, prog);
- //CTvEvent ev;
- //ret = ev.getProgPresentEvent(prog.getSrc(), prog.getID(), mpTv->getTvTime(), ev);
- //r->writeString16(String16(ev.getName()));
- break;
- }
- case DTV_TEST_2: {
- //int cmd = p.readInt32();
- //CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml");
- //r->writeString16(String16("xml"));
- break;
- }
-
- case TV_CLEAR_ALL_PROGRAM: {
- int tmpRet = 0;
- int arg0 = p.readInt32();
-
- tmpRet = mpTv->clearAllProgram(arg0);
- mTvService->mpScannerClient = this;
- r->writeInt32(tmpRet);
- break;
- }
-
- case GET_DISPLAY_RESOLUTION_CONFIG: {
- int tmpRet = 0;
- tmpRet = mpTv->GetDisplayResolutionConfig();
- r->writeInt32(tmpRet);
- break;
- }
-
- case GET_DISPLAY_RESOLUTION_INFO: {
- int tmpRet = 0;
- tmpRet = mpTv->GetDisplayResolutionInfo();
- r->writeInt32(tmpRet);
- break;
- }
-
- case HDMIRX_CEC_SEND_CUSTOM_MESSAGE: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- tmp_buf_size = p.readInt32();
- for (i = 0; i < tmp_buf_size; i++) {
- tmp_uc_buf[i] = p.readInt32();
- }
-
- int tmpRet = 0;
- tmpRet = mpTv->SendHDMIRxCECCustomMessage(tmp_uc_buf);
- r->writeInt32(tmpRet);
- break;
- }
-
- case HDMIRX_CEC_SEND_CUSTOM_WAIT_REPLY_MESSAGE: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- int WaitCmd = 0, timeout = 0;
- tmp_buf_size = p.readInt32();
- for (i = 0; i < tmp_buf_size; i++) {
- tmp_uc_buf[i] = p.readInt32();
- }
-
- WaitCmd = p.readInt32();
- timeout = p.readInt32();
-
- int tmpRet = 0;
- tmpRet = mpTv->SendHDMIRxCECCustomMessageAndWaitReply(tmp_uc_buf, tmp_uc_buf2, WaitCmd, timeout);
-
- r->writeInt32(tmpRet);
- if(tmpRet > 0) {
- for (i = 0; i < tmpRet; i++) {
- r->writeInt32(tmp_uc_buf2[i]);
- }
- }
-
- r->writeInt32(tmpRet);
- break;
- }
-
- case HDMIRX_CEC_SEND_BROADCAST_STANDBY_MESSAGE: {
- int tmpRet = 0;
- tmpRet = mpTv->SendHDMIRxCECBoradcastStandbyMessage();
- r->writeInt32(tmpRet);
- break;
- }
-
- case HDMIRX_CEC_SEND_GIVE_CEC_VERSION_MESSAGE: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- int sourceinput = p.readInt32();
- LOGD("HDMIRX_CEC_SEND_GIVE_CEC_VERSION_MESSAGE: sourceinput = %x", sourceinput);
- tmp_buf_size = mpTv->SendHDMIRxCECGiveCECVersionMessage((tv_source_input_t)sourceinput, tmp_uc_buf);
- r->writeInt32(tmp_buf_size);
- for (i = 0; i < tmp_buf_size; i++) {
- r->writeInt32(tmp_uc_buf[i]);
- }
- r->writeInt32(tmp_buf_size);
- break;
- }
-
- case HDMIRX_CEC_SEND_GIVE_DEV_VENDOR_ID_MESSAGE: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- int sourceinput = p.readInt32();
- LOGD("HDMIRX_CEC_SEND_GIVE_DEV_VENDOR_ID_MESSAGE: sourceinput = %x", sourceinput);
- tmp_buf_size = mpTv->SendHDMIRxCECGiveDeviceVendorIDMessage((tv_source_input_t)sourceinput, tmp_uc_buf);
- r->writeInt32(tmp_buf_size);
- for (i = 0; i < tmp_buf_size; i++) {
- r->writeInt32(tmp_uc_buf[i]);
- }
- r->writeInt32(tmp_buf_size);
- break;
- }
-
- case HDMIRX_CEC_SEND_GIVE_OSD_NAME_MESSAGE: {
- int i = 0, tmp_buf_size = 0, ret = 0;
- int sourceinput = p.readInt32();
- LOGD("HDMIRX_CEC_SEND_GIVE_OSD_NAME_MESSAGE: sourceinput = %x", sourceinput);
- tmp_buf_size = mpTv->SendHDMIRxCECGiveOSDNameMessage((tv_source_input_t)sourceinput, tmp_uc_buf);
- r->writeInt32(tmp_buf_size);
- for (i = 0; i < tmp_buf_size; i++) {
- r->writeInt32(tmp_uc_buf[i]);
- }
- r->writeInt32(tmp_buf_size);
- break;
- }
-
- case GET_HDMI_KSV_INFO: {
- int tmpRet = 0;
- int ksv_data[2] = {0, 0};
- tmpRet = mpTv->GetHdmiHdcpKeyKsvInfo(ksv_data);
- r->writeInt32(tmpRet);
- r->writeInt32(ksv_data[0]);
- r->writeInt32(ksv_data[1]);
- break;
- }
-
- case FACTORY_FBC_UPGRADE: {
- String16 tmpName = p.readString16();
- String8 strName = String8(tmpName);
- sprintf((char *)tmp_uc_buf, "%s", strName.string());
- int mode = p.readInt32();
- int upgrade_blk_size = p.readInt32();
- int ret = mpTv->StartUpgradeFBC((char *)tmp_uc_buf, mode, upgrade_blk_size);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_BRIGHTNESS: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Brightness(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_BRIGHTNESS: {
- int ret = mpTv->Tv_FactoryGet_FBC_Brightness();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_CONTRAST: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Contrast(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_CONTRAST: {
- int ret = mpTv->Tv_FactoryGet_FBC_Contrast();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_SATURATION: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Saturation(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_SATURATION: {
- int ret = mpTv->Tv_FactoryGet_FBC_Saturation();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_HUE: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_HueColorTint(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_HUE: {
- int ret = mpTv->Tv_FactoryGet_FBC_HueColorTint();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_BACKLIGHT: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Backlight(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_BACKLIGHT: {
- int ret = mpTv->Tv_FactoryGet_FBC_Backlight();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_FBC_SET_BACKLIGHT_N360: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Backlight_N360(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_BACKLIGHT_N360: {
- int ret = mpTv->Tv_FactoryGet_FBC_Backlight_N360();
- r->writeInt32(ret);
- break;
- }
- case FACTROY_FBC_SET_LIGHT_SENSOR_STATUS_N310: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_LightSensor_Status_N310(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTROY_FBC_GET_LIGHT_SENSOR_STATUS_N310: {
- int ret = mpTv->Tv_FactoryGet_FBC_LightSensor_Status_N310();
- r->writeInt32(ret);
- break;
- }
- case FACTROY_FBC_SET_DREAM_PANEL_STATUS_N310: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Dream_Panel_Status_N310(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTROY_FBC_GET_DREAM_PANEL_STATUS_N310: {
- int ret = mpTv->Tv_FactoryGet_FBC_Dream_Panel_Status_N310();
- r->writeInt32(ret);
- break;
- }
- case FACTROY_FBC_SET_MULT_PQ_STATUS_N310: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_MULT_PQ_Status_N310(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTROY_FBC_GET_MULT_PQ_STATUS_N310: {
- int ret = mpTv->Tv_FactoryGet_FBC_MULT_PQ_Status_N310();
- r->writeInt32(ret);
- break;
- }
- case FACTROY_FBC_SET_MEMC_STATUS_N310: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_MEMC_Status_N310(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTROY_FBC_GET_MEMC_STATUS_N310: {
- int ret = mpTv->Tv_FactoryGet_FBC_MEMC_Status_N310();
- r->writeInt32(ret);
- break;
- }
-
-
- case FACTORY_FBC_SET_BACKLIGHT_EN : {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_backlight_onoff(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_BACKLIGHT_EN: {
- int ret = mpTv->Tv_FactoryGet_FBC_backlight_onoff();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_LVDS_SSG: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_LVDS_SSG_Set(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_ELEC_MODE: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_ELEC_MODE(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_ELEC_MODE: {
- int ret = mpTv->Tv_FactoryGet_FBC_ELEC_MODE();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_PIC_MODE: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Picture_Mode(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_PIC_MODE: {
- int ret = mpTv->Tv_FactoryGet_FBC_Picture_Mode();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_TEST_PATTERN: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Set_Test_Pattern(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_TEST_PATTERN: {
- int ret = mpTv->Tv_FactoryGet_FBC_Get_Test_Pattern();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_GAIN_RED: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Gain_Red(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_GAIN_RED: {
- int ret = mpTv->Tv_FactoryGet_FBC_Gain_Red();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_GAIN_GREEN: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Gain_Green(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_GAIN_GREEN: {
- int ret = mpTv->Tv_FactoryGet_FBC_Gain_Green();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_GAIN_BLUE: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Gain_Blue(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_GAIN_BLUE: {
- int ret = mpTv->Tv_FactoryGet_FBC_Gain_Blue();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_OFFSET_RED: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Offset_Red(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_OFFSET_RED: {
- int ret = mpTv->Tv_FactoryGet_FBC_Offset_Red();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_OFFSET_GREEN: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Offset_Green(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_OFFSET_GREEN: {
- int ret = mpTv->Tv_FactoryGet_FBC_Offset_Green();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_OFFSET_BLUE: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_Offset_Blue(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_OFFSET_BLUE: {
- int ret = mpTv->Tv_FactoryGet_FBC_Offset_Blue();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_COLORTEMP_MODE: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_ColorTemp_Mode(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_COLORTEMP_MODE: {
- int ret = mpTv->Tv_FactoryGet_FBC_ColorTemp_Mode();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_COLORTEMP_MODE_N360: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_ColorTemp_Mode_N360(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_COLORTEMP_MODE_N360: {
- int ret = mpTv->Tv_FactoryGet_FBC_ColorTemp_Mode_N360();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_SET_WB_INIT: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySet_FBC_WB_Initial(value);
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_WB_INIT: {
- int ret = mpTv->Tv_FactoryGet_FBC_WB_Initial();
- r->writeInt32(ret);
- break;
- }
-
- case FACTORY_FBC_GET_MAINCODE_VERSION: {
- char sw_version[64];
- char build_time[64];
- char git_version[64];
- char git_branch[64];
- char build_name[64];
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_FBC_MAINCODE_Version(COMM_DEV_SERIAL, sw_version, build_time, git_version, git_branch, build_name);
- r->writeString16(String16(sw_version));
- r->writeString16(String16(build_time));
- r->writeString16(String16(git_version));
- r->writeString16(String16(git_branch));
- r->writeString16(String16(build_name));
- } else {
- r->writeString16(String16("No FBC"));
- r->writeString16(String16("No FBC"));
- r->writeString16(String16("No FBC"));
- r->writeString16(String16("No FBC"));
- r->writeString16(String16("No FBC"));
- }
- break;
- }
- case FACTORY_SET_SN: {
- char StrFactSN[64] = {0};
- String16 strTemFactorySn = p.readString16();
- String8 strFactorySn = String8(strTemFactorySn);
- sprintf((char *)StrFactSN, "%s", strFactorySn.string());
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- int iRet = fbcIns->cfbc_Set_FBC_Factory_SN(COMM_DEV_SERIAL, (const char *)StrFactSN);
- r->writeInt32(iRet);
- } else {
- r->writeInt32(-1);
- }
- break;
- }
- case FACTORY_GET_SN: {
- char factorySerialNumber[64] = {0};
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_FBC_Factory_SN(COMM_DEV_SERIAL, factorySerialNumber);
- r->writeString16(String16(factorySerialNumber));
- } else {
- r->writeString16(String16("No FBC"));
- }
- break;
- }
- case FACTORY_FBC_PANEL_GET_INFO: {
- char panel_model[64];
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_SERIAL, panel_model);
- r->writeString16(String16(panel_model));
- } else {
- r->writeString16(String16(""));
- }
- break;
- }
- case FACTORY_FBC_PANEL_POWER_SWITCH: {
- int value = p.readInt32();
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- int ret = fbcIns->cfbc_Set_FBC_panel_power_switch(COMM_DEV_SERIAL, value);
- r->writeInt32(ret);
- } else {
- r->writeInt32(-1);
- }
- break;
- }
- case FACTORY_FBC_PANEL_SUSPEND: {
- int value = p.readInt32();
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- int ret = fbcIns->cfbc_Set_FBC_suspend(COMM_DEV_SERIAL, value);
- r->writeInt32(ret);
- } else {
- r->writeInt32(-1);
- }
- break;
- }
- case FACTORY_FBC_PANEL_USER_SETTING_DEFAULT: {
- int value = p.readInt32();
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- int ret = fbcIns->cfbc_Set_FBC_User_Setting_Default(COMM_DEV_SERIAL, value);
- r->writeInt32(ret);
- } else {
- r->writeInt32(-1);
- }
- break;
- }
- case FACTORY_FBC_POWER_REBOOT: {
- int value = p.readInt32();
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- int ret = fbcIns->cfbc_SendRebootToUpgradeCmd(COMM_DEV_SERIAL, value);
- r->writeInt32(ret);
- } else {
- r->writeInt32(-1);
- }
- break;
- }
- case FACTORY_FBC_SEND_KEY_TO_FBC: {
- int keyCode = p.readInt32();
- int param = p.readInt32();
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- int ret = fbcIns->cfbc_FBC_Send_Key_To_Fbc(COMM_DEV_SERIAL, keyCode, param);
- r->writeInt32(ret);
- } else {
- r->writeInt32(-1);
- }
- break;
- }
- case FACTORY_WHITE_BALANCE_SET_GAIN_RED: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySetWhiteBalanceRedGain(source_type, colortemp_mode, value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_GET_GAIN_RED: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetWhiteBalanceRedGain(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_SET_GAIN_GREEN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySetWhiteBalanceGreenGain(source_type, colortemp_mode, value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_GET_GAIN_GREEN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetWhiteBalanceGreenGain(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_SET_GAIN_BLUE: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySetWhiteBalanceBlueGain(source_type, colortemp_mode, value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_GET_GAIN_BLUE: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetWhiteBalanceBlueGain(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_SET_OFFSET_RED: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySetWhiteBalanceRedOffset(source_type, colortemp_mode, value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_GET_OFFSET_RED: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetWhiteBalanceRedOffset(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_SET_OFFSET_GREEN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySetWhiteBalanceGreenOffset(source_type, colortemp_mode, value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_GET_OFFSET_GREEN: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetWhiteBalanceGreenOffset(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_SET_OFFSET_BLUE: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySetWhiteBalanceBlueOffset(source_type, colortemp_mode, value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_GET_OFFSET_BLUE: {
- int source_type = p.readInt32();
- int colortemp_mode = p.readInt32();
- int ret = mpTv->Tv_FactoryGetWhiteBalanceBlueOffset(source_type, colortemp_mode);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_GET_COLOR_TMP: {
- int source_type = p.readInt32();
- int ret = mpTv->Tv_FactoryGetWhiteBalanceColorTempMode(source_type);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_SET_COLOR_TMP: {
- int source_type = p.readInt32();
- int Tempmode = p.readInt32();
- int is_save = p.readInt32();
- int ret = mpTv->Tv_FactorySetWhiteBalanceColorTempMode(source_type, Tempmode, is_save);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_SAVE_PRAMAS: {
- int source_type = p.readInt32();
- int mode = p.readInt32();
- int r_gain = p.readInt32();
- int g_gain = p.readInt32();
- int b_gain = p.readInt32();
- int r_offset = p.readInt32();
- int g_offset = p.readInt32();
- int b_offset = p.readInt32();
- int ret = mpTv->Tv_FactorySaveWhiteBalancePramas(source_type, mode, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_OPEN_GRAY_PATTERN: {
- int ret = mpTv->Tv_FactoryOpenWhiteBalanceGrayPattern();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_CLOSE_GRAY_PATTERN: {
- int ret = mpTv->Tv_FactoryCloseWhiteBalanceGrayPattern();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_SET_GRAY_PATTERN: {
- int value = p.readInt32();
- int ret = mpTv->Tv_FactorySetWhiteBalanceGrayPattern(value);
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_GET_GRAY_PATTERN: {
- int ret = mpTv->Tv_FactoryGetWhiteBalanceGrayPattern();
- r->writeInt32(ret);
- break;
- }
- case FACTORY_WHITE_BALANCE_GET_ALL_PRAMAS: {
- int Tempmode = p.readInt32();
- int ret = -1;
- tcon_rgb_ogo_t params;
- if (GetPlatformHaveFBCFlag() == 0) { //T868
- ret = mpTv->GetColorTemperatureParams((vpp_color_temperature_mode_t)Tempmode, &params);
- } else { //T866
- ret = mpTv->Tv_FactoryWhiteBalanceGetAllParams(Tempmode, &params);
- }
- r->writeInt32(ret);
- r->writeInt32(params.r_gain);
- r->writeInt32(params.g_gain);
- r->writeInt32(params.b_gain);
- r->writeInt32(params.r_post_offset);
- r->writeInt32(params.g_post_offset);
- r->writeInt32(params.b_post_offset);
- }
- case STOP_SCAN: {
- mpTv->stopScanLock();
- break;
- }
- case DTV_GET_SNR: {
- int tmpRet = 0;
- tmpRet = mpTv->getFrontendSNR();
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_GET_BER: {
- int tmpRet = 0;
- tmpRet = mpTv->getFrontendBER();
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_GET_STRENGTH: {
- int tmpRet = 0;
- tmpRet = mpTv->getFrontendSignalStrength();
- r->writeInt32(tmpRet);
- break;
- }
- case DTV_GET_AUDIO_TRACK_NUM: {
- int programId = p.readInt32();
- int retCnt = 0;
- retCnt = mpTv->getAudioTrackNum(programId);
- r->writeInt32(retCnt);
- break;
- }
- case DTV_GET_AUDIO_TRACK_INFO: {
- int progId = p.readInt32();
- int aIdx = p.readInt32();
- int aFmt = -1;
- int iRet = -1;
- String8 lang;
- iRet = mpTv->getAudioInfoByIndex(progId, aIdx, &aFmt, lang);
- r->writeInt32(aFmt);
- r->writeString16(String16(lang));
- break;
- }
- case DTV_SWITCH_AUDIO_TRACK: {
- int progId = p.readInt32();
- int aTackIdx = p.readInt32();
- int ret = -1;
- ret = mpTv->switchAudioTrack(progId, aTackIdx);
- r->writeInt32(ret);
- if(0 == ret) {
- CTvProgram prog;
- prog.setCurrAudioTrackIndex(progId, aTackIdx);
- }
- break;
- }
- case DTV_GET_CURR_AUDIO_TRACK_INDEX: {
- int currAduIdx = -1;
- int progId = p.readInt32();
- CTvProgram prog;
- CTvProgram::selectByID(progId, prog);
- currAduIdx = prog.getCurrAudioTrackIndex();
- r->writeInt32(currAduIdx);
- break;
- }
- case DTV_SET_AUDIO_CHANNEL_MOD: {
- int audioChannelIdx = p.readInt32();
- mpTv->setAudioChannel(audioChannelIdx);
- break;
- }
- case DTV_GET_AUDIO_CHANNEL_MOD: {
- int currChannelMod;
- currChannelMod = mpTv->getAudioChannel();
- r->writeInt32(currChannelMod);
- break;
- }
- case DTV_GET_CUR_FREQ: {
- int progId = p.readInt32();
- int freq = 0;
- int iRet = -1;
- CTvProgram prog;
- CTvChannel channel;
-
- iRet = CTvProgram::selectByID(progId, prog);
- if(0 != iRet) return -1;
- prog.getChannel(channel);
- freq = channel.getFrequency();
- r->writeInt32(freq);
- break;
- }
- case DTV_GET_EPG_UTC_TIME: {
- int iRet = -1;
- int utcTime = 0;
-
- utcTime = mpTv->getTvTime();
-
- r->writeInt32(utcTime);
- break;
- }
- case DTV_GET_EPG_INFO_POINT_IN_TIME: {
- int progid = p.readInt32();
- int utcTime = p.readInt32();
- CTvProgram prog;
- int ret = CTvProgram::selectByID(progid, prog);
- CTvEvent ev;
- ret = ev.getProgPresentEvent(prog.getSrc(), prog.getID(), utcTime, ev);
- r->writeString16(String16(ev.getName()));
- r->writeString16(String16(ev.getDescription()));
- r->writeString16(String16(ev.getExtDescription()));
- r->writeInt32(ev.getStartTime());
- r->writeInt32(ev.getEndTime());
- r->writeInt32(ev.getSubFlag());
- r->writeInt32(ev.getEventId());
- break;
- }
- case DTV_GET_EPG_INFO_DURATION: {
- int iRet = -1;
- int iObOutSize = 0;
- Vector<sp<CTvEvent> > epgOut;
- int progid = p.readInt32();
- int iUtcStartTime = p.readInt32();
- int iDurationTime = p.readInt32();
- CTvProgram prog;
- CTvEvent ev;
- iRet = CTvProgram::selectByID(progid, prog);
- if(0 != iRet) {
- break;
- }
- iRet = ev.getProgScheduleEvents(prog.getSrc(), prog.getID(), iUtcStartTime, iDurationTime, epgOut);
- if(0 != iRet) {
- break;
- }
- iObOutSize = epgOut.size();
- if(0 == iObOutSize) {
- break;
- }
-
- r->writeInt32(iObOutSize);
- for(int i = 0; i < iObOutSize; i ++) {
- r->writeString16(String16(epgOut[i]->getName()));
- r->writeString16(String16(epgOut[i]->getDescription()));
- r->writeString16(String16(ev.getExtDescription()));
- r->writeInt32(epgOut[i]->getStartTime());
- r->writeInt32(epgOut[i]->getEndTime());
- r->writeInt32(epgOut[i]->getSubFlag());
- r->writeInt32(epgOut[i]->getEventId());
- }
- break;
- }
- case DTV_SET_PROGRAM_NAME: {
- CTvProgram prog;
- int progid = p.readInt32();
- String16 tmpName = p.readString16();
- String8 strName = String8(tmpName);
- prog.updateProgramName(progid, strName);
- break;
- }
- case DTV_SET_PROGRAM_SKIPPED: {
- CTvProgram prog;
- int progid = p.readInt32();
- bool bSkipFlag = p.readInt32();
- prog.setSkipFlag(progid, bSkipFlag);
- break;
- }
- case DTV_SET_PROGRAM_FAVORITE: {
- CTvProgram prog;
- int progid = p.readInt32();
- bool bFavorite = p.readInt32();
- prog.setFavoriteFlag(progid, bFavorite);
- break;
- }
- case DTV_DETELE_PROGRAM: {
- CTvProgram prog;
- int progid = p.readInt32();
- prog.deleteProgram(progid);
- break;
- }
- case SET_BLACKOUT_ENABLE: {
- int enable = p.readInt32();
- mpTv->setBlackoutEnable(enable);
- break;
- }
- case START_AUTO_BACKLIGHT: {
- mpTv->startAutoBackLight();
- break;
- }
- case STOP_AUTO_BACKLIGHT: {
- mpTv->stopAutoBackLight();
- break;
- }
- case IS_AUTO_BACKLIGHTING: {
- int on = mpTv->getAutoBackLight_on_off();
- r->writeInt32(on);
- break;
- }
- case SSM_READ_BLACKOUT_ENABLE: {
- int enable = mpTv->getSaveBlackoutEnable();
- r->writeInt32(enable);
- break;
- }
- case DTV_SWAP_PROGRAM: {
- CTvProgram prog;
- int firstProgId = p.readInt32();
- int secondProgId = p.readInt32();
- CTvProgram::selectByID(firstProgId, prog);
- int firstChanOrderNum = prog.getChanOrderNum();
- CTvProgram::selectByID(secondProgId, prog);
- int secondChanOrderNum = prog.getChanOrderNum();
- prog.swapChanOrder(firstProgId, firstChanOrderNum, secondProgId, secondChanOrderNum);
- break;
- }
- case DTV_SET_PROGRAM_LOCKED: {
- CTvProgram prog;
- int progid = p.readInt32();
- bool bLocked = p.readInt32();
- prog.setLockFlag(progid, bLocked);
- break;
- }
- case DTV_SET_BOOKING_FLAG: {
- CTvEvent ev;
- int iEvtId = p.readInt32();
- bool iBookFlag = (bool)p.readInt32();
- ev.bookEvent(iEvtId, iBookFlag);
- break;
- }
- case DTV_GET_FREQ_BY_PROG_ID: {
- int freq = 0;
- int progid = p.readInt32();
- CTvProgram prog;
- int ret = CTvProgram::selectByID(progid, prog);
- if(ret != 0) return -1;
- CTvChannel channel;
- prog.getChannel(channel);
- freq = channel.getFrequency();
- r->writeInt32(freq);
- break;
- }
- case DTV_GET_BOOKED_EVENT: {
- CTvBooking tvBook;
- Vector<sp<CTvBooking> > vTvBookOut;
- tvBook.getBookedEventList(vTvBookOut);
- int iObOutSize = vTvBookOut.size();
- if(0 == iObOutSize) {
- break;
- }
- r->writeInt32(iObOutSize);
- for(int i = 0; i < iObOutSize; i ++) {
- r->writeString16(String16(vTvBookOut[i]->getProgName()));
- r->writeString16(String16(vTvBookOut[i]->getEvtName()));
- r->writeInt32(vTvBookOut[i]->getStartTime());
- r->writeInt32(vTvBookOut[i]->getDurationTime());
- r->writeInt32(vTvBookOut[i]->getBookId());
- r->writeInt32(vTvBookOut[i]->getProgramId());
- r->writeInt32(vTvBookOut[i]->getEventId());
- }
- break;
- }
- case SET_FRONTEND_PARA: {
- int ret = -1;
- frontend_para_set_t feParms;
- feParms.mode = (fe_type_t)p.readInt32();
- feParms.freq = p.readInt32();
- feParms.videoStd = (atv_video_std_t)p.readInt32();
- feParms.audioStd = (atv_audio_std_t)p.readInt32();
- feParms.para1 = p.readInt32();
- feParms.para2 = p.readInt32();
- mpTv->resetFrontEndPara(feParms);
- r->writeInt32(ret);
- break;
- }
- case PLAY_PROGRAM: {
- int mode = p.readInt32();
- int freq = p.readInt32();
- if (mode == FE_ANALOG) {
- int videoStd = p.readInt32();
- int audioStd = p.readInt32();
- int fineTune = p.readInt32();
- mpTv->playAtvProgram(freq, videoStd, audioStd, fineTune);
- } else {
- int para1 = p.readInt32();
- int para2 = p.readInt32();
- int vid = p.readInt32();
- int vfmt = p.readInt32();
- int aid = p.readInt32();
- int afmt = p.readInt32();
- int pcr = p.readInt32();
- mpTv->playDtvProgram(mode, freq, para1, para2, vid, vfmt, aid, afmt, pcr);
- }
- break;
- }
- case GET_PROGRAM_LIST: {
- Vector<sp<CTvProgram> > out;
- int type = p.readInt32();
- int skip = p.readInt32();
- CTvProgram::selectByType(type, skip, out);
- r->writeInt32(out.size());
- for(int i = 0; i < out.size(); i++) {
- r->writeInt32(out[i]->getID());
- r->writeInt32(out[i]->getChanOrderNum());
- r->writeInt32(out[i]->getMajor());
- r->writeInt32(out[i]->getMinor());
- r->writeInt32(out[i]->getProgType());
- r->writeString16(String16(out[i]->getName()));
- r->writeInt32(out[i]->getProgSkipFlag());
- r->writeInt32(out[i]->getFavoriteFlag());
- r->writeInt32(out[i]->getVideo()->getFormat());
- CTvChannel ch;
- out[i]->getChannel(ch);
- r->writeInt32(ch.getDVBTSID());
- r->writeInt32(out[i]->getServiceId());
- r->writeInt32(out[i]->getVideo()->getPID());
- r->writeInt32(out[i]->getVideo()->getPID());
-
- int audioTrackSize = out[i]->getAudioTrackSize();
- r->writeInt32(audioTrackSize);
- for(int j = 0; j < audioTrackSize; j++) {
- r->writeString16(String16(out[i]->getAudio(j)->getLang()));
- r->writeInt32(out[i]->getAudio(j)->getFormat());
- r->writeInt32(out[i]->getAudio(j)->getPID());
- }
- r->writeInt32(ch.getFrequency());
- }
- break;
- }
- case DTV_GET_VIDEO_FMT_INFO: {
- int srcWidth = 0;
- int srcHeight = 0;
- int srcFps = 0;
- int srcInterlace = 0;
- int iRet = -1;
-
- iRet == mpTv->getVideoFormatInfo(&srcWidth, &srcHeight, &srcFps, &srcInterlace);
- r->writeInt32(srcWidth);
- r->writeInt32(srcHeight);
- r->writeInt32(srcFps);
- r->writeInt32(srcInterlace);
- r->writeInt32(iRet);
- }
- break;
-
- case DTV_START_RECORD: {
- char buf[256];
- String16 tmpName = p.readString16();
- String8 strName = String8(tmpName);
- sprintf(buf, "%s", strName.string());
- mpTv->SetRecordFileName(buf);
- mpTv->StartToRecord();
- }
- break;
- case DTV_STOP_RECORD:
- mpTv->StopRecording();
- break;
- case DTV_SET_RECORD_ALL_TS: {
- int sel = p.readInt32();
- mpTv->SetRecCurTsOrCurProgram(sel);
- }
- break;
- case TV_PRINT_DEBUG_INFO:
- mpTv->printDebugInfo();
- break;
- // EXTAR END
- default:
- LOGD("default");
- break;
- }
- return 0;
-}
-
-sp<TvService::Client> TvService::Client::getClientFromCookie(void *user)
-{
- sp<Client> client = 0;
- /*
- TvService *service = static_cast<TvService*> (user);
- if (service != NULL) {
- Mutex::Autolock ourLock(service->mServiceLock);
- if (service->mClient != 0) {
- client = service->mClient.promote();
- if (client == 0) {
- LOGE("getClientFromCookie: client appears to have died");
- service->mClient.clear();
- }
- } else {
- LOGE("getClientFromCookie: got callback but client was NULL");
- }
- }*/
- return client;
-}
-
-void TvService::Client::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2, void *user)
-{
- LOGD("notifyCallback(%d)", msgType);
-
- sp<Client> client = getClientFromCookie(user);
- if (client == 0) {
- return;
- }
-
- switch (msgType) {
- //case TV_MSG_SHUTTER:
- // ext1 is the dimension of the yuv picture.
- // client->handleShutter((image_rect_type *)ext1);
- // break;
- default:
- sp<ITvClient> c = client->mTvClient;
- if (c != NULL) {
- //c->notifyCallback(msgType, ext1, ext2);
- }
- break;
- }
-
-#if DEBUG_CLIENT_REFERENCES
- if (client->getStrongCount() == 1) {
- LOGE("++++++++++++++++ (NOTIFY CALLBACK) THIS WILL CAUSE A LOCKUP!");
- client->printRefs();
- }
-#endif
-}
-
-int TvService::Client::notifyCallback(const int &msgtype, const Parcel &p)
-{
- mTvClient->notifyCallback(msgtype, p);
- return 0;
-}
-
-status_t TvService::onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags)
-{
- // permission checks...
- switch (code) {
- case BnTvService::CONNECT:
- IPCThreadState *ipc = IPCThreadState::self();
- const int pid = ipc->getCallingPid();
- const int self_pid = getpid();
- if (pid != self_pid) {
- // we're called from a different process, do the real check
- /*if (!checkCallingPermission(
- String16("android.permission.TV")))
- {
- const int uid = ipc->getCallingUid();
- LOGE("Permission Denial: "
- "can't use the tv pid=%d, uid=%d", pid, uid);
- return PERMISSION_DENIED;
- }*/
- }
- break;
- }
-
- status_t err = BnTvService::onTransact(code, data, reply, flags);
-
-#if DEBUG_HEAP_LEAKS
- LOGE("+++ onTransact err %d code %d", err, code);
-
- if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
- LOGE("+++ onTransact code %d", code);
-
- CHECK_INTERFACE(ITvService, data, reply);
-
- switch(code) {
- case 1000: {
- if (gWeakHeap != 0) {
- sp<IMemoryHeap> h = gWeakHeap.promote();
- IMemoryHeap *p = gWeakHeap.unsafe_get();
- LOGE("CHECKING WEAK REFERENCE %p (%p)", h.get(), p);
- if (h != 0)
- h->printRefs();
- bool attempt_to_delete = data.readInt32() == 1;
- if (attempt_to_delete) {
- // NOT SAFE!
- LOGE("DELETING WEAK REFERENCE %p (%p)", h.get(), p);
- if (p) delete p;
- }
- return NO_ERROR;
- }
- }
- break;
- default:
- break;
- }
- }
-#endif // DEBUG_HEAP_LEAKS
- return err;
-}
-
+#include <utils/Log.h>
+#include <binder/IServiceManager.h>
+#include <binder/IPCThreadState.h>
+#include <utils/String16.h>
+#include <utils/Errors.h>
+#include <binder/MemoryBase.h>
+#include <binder/MemoryHeapBase.h>
+#include <include/ITvService.h>
+#include <hardware/hardware.h>
+#include "TvService.h"
+#include <cutils/atomic.h>
+#include <cutils/properties.h>
+#include <stdint.h>
+#include <tvconfig/tvconfig.h>
+#include <tvsetting/CTvSetting.h>
+#include <audio/CTvAudio.h>
+#include <tvutils/tvutils.h>
+#include <version/version.h>
+#include "../include/tvcmd.h"
+#include "tv/CTvLog.h"
+#include <tvdb/CTvRegion.h>
+#include <xxxconfig.h>
+extern "C" {
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <signal.h>
+#include "make_ext4fs.h"
+#include "am_ver.h"
+}
+#define LOG_TAG "TvService"
+
+#define PICTURE_TIMEOUT seconds(5)
+
+static int getCallingPid()
+{
+ return IPCThreadState::self()->getCallingPid();
+}
+
+TvService *TvService::mTvService = NULL;
+CTv* TvService::mpTv = NULL;
+
+void TvService::instantiate()
+{
+ defaultServiceManager()->addService(String16("aml.tvserver"), TvService::getIntance());
+}
+
+TvService::TvService() :
+ BnTvService()
+{
+ mpStartTvClient = NULL;
+ mpScannerClient = NULL;
+ mUsers = 0;
+ mpTv = new CTv();
+ mpTv->setTvObserver(this);
+ mCapVidFrame.setObserver(this);
+ mpTv->OpenTv();
+}
+
+TvService::~TvService()
+{
+ mpStartTvClient = NULL;
+ mpScannerClient = NULL;
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ LOGW("some client still connect it!");
+ }
+ }
+ if (mpTv != NULL) {
+ delete mpTv;
+ mpTv = NULL;
+ }
+}
+
+void TvService::onTvEvent(const CTvEv &ev)
+{
+ int type = ev.getEvType();
+ LOGD("TvService::onTvEvent ev type = %d", type);
+ switch (type) {
+ case CTvEv::TV_EVENT_COMMOM: {
+ break;
+ }
+ case CTvEv::TV_EVENT_SCANNER: {
+ CTvScanner::ScannerEvent *pScannerEv = (CTvScanner::ScannerEvent *) (&ev);
+ if (mpScannerClient != NULL) {
+ sp<Client> ScannerClient = mpScannerClient.promote();
+ if (ScannerClient != 0) {
+ Parcel p;
+ LOGD("scanner evt type:%d freq:%d vid:%d acnt:%d",
+ pScannerEv->mType, pScannerEv->mFrequency, pScannerEv->mVid, pScannerEv->mAcnt);
+ p.writeInt32(pScannerEv->mType);
+ p.writeInt32(pScannerEv->mPercent);
+ p.writeInt32(pScannerEv->mTotalChannelCount);
+ p.writeInt32(pScannerEv->mLockedStatus);
+ p.writeInt32(pScannerEv->mChannelNumber);
+ p.writeInt32(pScannerEv->mFrequency);
+ p.writeString16(String16(pScannerEv->mProgramName));
+ p.writeInt32(pScannerEv->mprogramType);
+ p.writeString16(String16(pScannerEv->mMSG));
+ p.writeInt32(pScannerEv->mStrength);
+ p.writeInt32(pScannerEv->mSnr);
+ //ATV
+ p.writeInt32(pScannerEv->mVideoStd);
+ p.writeInt32(pScannerEv->mAudioStd);
+ p.writeInt32(pScannerEv->mIsAutoStd);
+ //DTV
+ p.writeInt32(pScannerEv->mMode);
+ p.writeInt32(pScannerEv->mSymbolRate);
+ p.writeInt32(pScannerEv->mModulation);
+ p.writeInt32(pScannerEv->mBandwidth);
+ p.writeInt32(pScannerEv->mOfdm_mode);
+ p.writeInt32(pScannerEv->mTsId);
+ p.writeInt32(pScannerEv->mONetId);
+ p.writeInt32(pScannerEv->mServiceId);
+ p.writeInt32(pScannerEv->mVid);
+ p.writeInt32(pScannerEv->mVfmt);
+ p.writeInt32(pScannerEv->mAcnt);
+ for (int i = 0; i < pScannerEv->mAcnt; i++)
+ p.writeInt32(pScannerEv->mAid[i]);
+ for (int i = 0; i < pScannerEv->mAcnt; i++)
+ p.writeInt32(pScannerEv->mAfmt[i]);
+ for (int i = 0; i < pScannerEv->mAcnt; i++)
+ p.writeString16(String16(pScannerEv->mAlang[i]));
+ for (int i = 0; i < pScannerEv->mAcnt; i++)
+ p.writeInt32(pScannerEv->mAtype[i]);
+ p.writeInt32(pScannerEv->mPcr);
+ p.writeInt32(pScannerEv->mScnt);
+ for (int i = 0; i < pScannerEv->mScnt; i++)
+ p.writeInt32(pScannerEv->mStype[i]);
+ for (int i = 0; i < pScannerEv->mScnt; i++)
+ p.writeInt32(pScannerEv->mSid[i]);
+ for (int i = 0; i < pScannerEv->mScnt; i++)
+ p.writeInt32(pScannerEv->mSstype[i]);
+ for (int i = 0; i < pScannerEv->mScnt; i++)
+ p.writeInt32(pScannerEv->mSid1[i]);
+ for (int i = 0; i < pScannerEv->mScnt; i++)
+ p.writeInt32(pScannerEv->mSid2[i]);
+ for (int i = 0; i < pScannerEv->mScnt; i++)
+ p.writeString16(String16(pScannerEv->mSlang[i]));
+ ScannerClient->notifyCallback(SCAN_EVENT_CALLBACK, p);
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_EPG: {
+ CTvEpg::EpgEvent *pEpgEvent = (CTvEpg::EpgEvent *) (&ev);
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pEpgEvent->type);
+ p.writeInt32(pEpgEvent->time);
+ p.writeInt32(pEpgEvent->programID);
+ p.writeInt32(pEpgEvent->channelID);
+ currentClient->getTvClient()->notifyCallback(EPG_EVENT_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_HDMI_IN_CAP: {
+ CTvScreenCapture::CapEvent *pCapEvt = (CTvScreenCapture::CapEvent *)(&ev);
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pCapEvt->mFrameNum);
+ p.writeInt32(pCapEvt->mFrameSize);
+ p.writeInt32(pCapEvt->mFrameWide);
+ p.writeInt32(pCapEvt->mFrameHeight);
+ currentClient->getTvClient()->notifyCallback(VFRAME_BMP_EVENT_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_AV_PLAYBACK: {
+ TvEvent::AVPlaybackEvent *pEv = (TvEvent::AVPlaybackEvent *)(&ev);
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pEv->mMsgType);
+ p.writeInt32(pEv->mProgramId);
+ currentClient->getTvClient()->notifyCallback(DTV_AV_PLAYBACK_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_SIGLE_DETECT: {
+ TvEvent::SignalInfoEvent *pEv = (TvEvent::SignalInfoEvent *)(&ev);
+
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pEv->mTrans_fmt);
+ p.writeInt32(pEv->mFmt);
+ p.writeInt32(pEv->mStatus);
+ p.writeInt32(pEv->mReserved);
+ currentClient->getTvClient()->notifyCallback(SIGLE_DETECT_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_SUBTITLE: {
+ TvEvent::SubtitleEvent *pEv = (TvEvent::SubtitleEvent *)(&ev);
+ sp<Client> pSubtitleClient = mpSubClient.promote();
+ if (pSubtitleClient != NULL) {
+ Parcel p;
+ p.writeInt32(pEv->pic_width);
+ p.writeInt32(pEv->pic_height);
+ pSubtitleClient->notifyCallback(SUBTITLE_UPDATE_CALLBACK, p);
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_ADC_CALIBRATION: {
+ TvEvent::ADCCalibrationEvent *pEv = (TvEvent::ADCCalibrationEvent *)(&ev);
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pEv->mState);
+ currentClient->getTvClient()->notifyCallback(ADC_CALIBRATION_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_VGA: { //VGA
+ TvEvent::VGAEvent *pEv = (TvEvent::VGAEvent *)(&ev);
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pEv->mState);
+ currentClient->getTvClient()->notifyCallback(VGA_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_SOURCE_CONNECT: {
+ TvEvent::SourceConnectEvent *pEv = (TvEvent::SourceConnectEvent *)(&ev);
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pEv->mSourceInput);
+ p.writeInt32(pEv->connectionState);
+ currentClient->getTvClient()->notifyCallback(SOURCE_CONNECT_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_HDMIRX_CEC: {
+ TvEvent::HDMIRxCECEvent *pEv = (TvEvent::HDMIRxCECEvent *)(&ev);
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+
+ p.writeInt32(pEv->mDataCount);
+ for (int j = 0; j < pEv->mDataCount; j++) {
+ p.writeInt32(pEv->mDataBuf[j]);
+ }
+
+ currentClient->getTvClient()->notifyCallback(HDMIRX_CEC_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_UPGRADE_FBC: {
+ TvEvent::UpgradeFBCEvent *pEv = (TvEvent::UpgradeFBCEvent *)(&ev);
+
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pEv->mState);
+ p.writeInt32(pEv->param);
+ currentClient->getTvClient()->notifyCallback(UPGRADE_FBC_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+ case CTvEv::TV_EVENT_SERIAL_COMMUNICATION: {
+ TvEvent::SerialCommunicationEvent *pEv = (TvEvent::SerialCommunicationEvent *)(&ev);
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pEv->mDevId);
+ p.writeInt32(pEv->mDataCount);
+ for (int j = 0; j < pEv->mDataCount; j++) {
+ p.writeInt32(pEv->mDataBuf[j]);
+ }
+
+ currentClient->getTvClient()->notifyCallback(SERIAL_COMMUNICATION_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+
+ case CTvEv::TV_EVENT_2d4G_HEADSET: {
+ TvEvent::HeadSetOf2d4GEvent *pEv = (TvEvent::HeadSetOf2d4GEvent *)(&ev);
+ LOGD("SendDtvStats status: =%d para2: =%d", pEv->state, pEv->para);
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ Parcel p;
+ p.writeInt32(pEv->state);
+ p.writeInt32(pEv->para);
+ currentClient->getTvClient()->notifyCallback(HEADSET_STATUS_CALLBACK, p);
+ }
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+}
+
+sp<ITv> TvService::connect(const sp<ITvClient> &tvClient)
+{
+ int callingPid = getCallingPid();
+ LOGD("TvService::connect E (pid %d, client %p)", callingPid, IInterface::asBinder(tvClient).get());
+
+ Mutex::Autolock lock(mServiceLock);
+
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ sp<ITvClient> currentTvClient(currentClient->getTvClient());
+ if (IInterface::asBinder(tvClient) == IInterface::asBinder(currentTvClient)) {
+ LOGD("TvService::connect X (pid %d, same client %p) is reconnecting...", callingPid, IInterface::asBinder(tvClient).get());
+ return currentClient;
+ } else {
+ //LOGD("TvService::connect X (pid %d, new client %p) rejected. "
+ // "(old pid %d, old client %p)", callingPid, tvClient->asBinder().get(), currentClient->mClientPid, currentTvClient->asBinder().get());
+ // if (kill(currentClient->mClientPid, 0) == -1 && errno == ESRCH) {
+ // LOGE("The old client is dead!");
+ // }
+ //return client;
+ //return currentClient;
+ continue;
+ }
+ } else {
+ LOGE("client (pid %d) have delete ------------not exist", callingPid);
+ client.clear();
+ m_v_Clients.removeAt(i);
+ client_size--;
+ continue;
+ }
+ }
+ }
+
+ if (mUsers > 0) {
+ LOGE("Still have client, rejected");
+ //return client;
+ }
+ LOGD("TvService::connect X 3");
+ // client = new Client(this, tvClient, callingPid);
+ //mClient = client;
+
+ sp<Client> newclient = new Client(this, tvClient, callingPid, mpTv);
+ m_v_Clients.add(newclient);
+
+#if DEBUG_CLIENT_REFERENCES
+ //client->trackMe(true, true);
+#endif
+ //mCurClient = client;
+ LOGD("TvService::connect X 4");
+ return newclient;
+}
+
+void TvService::removeClient(const sp<ITvClient> &tvClient)
+{
+ int callingPid = getCallingPid();
+
+ Mutex::Autolock lock(mServiceLock);
+
+ int client_size = m_v_Clients.size();
+ wp<Client> client;
+ for (int i = 0; i < client_size; i++) {
+ client = m_v_Clients[i];
+ if (client != 0) {
+ sp<Client> currentClient = client.promote();
+ if (currentClient != 0) {
+ sp<ITvClient> currentTvClient(currentClient->getTvClient());
+ if (IInterface::asBinder(tvClient) == IInterface::asBinder(currentTvClient)) {
+ LOGD("find client , and remove it pid = %d, client = %p i=%d", callingPid, IInterface::asBinder(tvClient).get(), i);
+ client.clear();
+ LOGD("find client , and remove it pid1 ");
+ m_v_Clients.removeAt(i);
+ LOGD("find client , and remove it pid2 ");
+ break;
+ } else {
+ LOGW("removeClient (pid %d): mClient doesn't match!", callingPid);
+ continue;
+ }
+ } else {
+ LOGW("removeclient currentClient == 0 (pid %d)", callingPid);
+ client.clear();
+ m_v_Clients.removeAt(i);
+ client_size--;
+ continue;
+ }
+ } else {
+ LOGW("removeclient client == 0 (pid %d)", callingPid);
+ client.clear();
+ m_v_Clients.removeAt(i);
+ client_size--;
+ continue;
+ }
+ }
+
+ LOGD("removeClient (pid %d) done", callingPid);
+}
+
+void TvService::incUsers()
+{
+ android_atomic_inc(&mUsers);
+}
+
+void TvService::decUsers()
+{
+ android_atomic_dec(&mUsers);
+}
+
+TvService::Client::Client(const sp<TvService> &tvService, const sp<ITvClient> &tvClient, pid_t clientPid, CTv *pTv)
+{
+ int callingPid = getCallingPid();
+ LOGD("Client::Client E (pid %d)", callingPid);
+ mTvService = tvService;
+ mTvClient = tvClient;
+ mClientPid = clientPid;
+ tvService->incUsers();
+ mpTv = pTv;
+ mIsStartTv = false;
+}
+
+status_t TvService::Client::checkPid()
+{
+ int callingPid = getCallingPid();
+ if (mClientPid == callingPid)
+ return NO_ERROR;
+ LOGD("Attempt to use locked tv (client %p) from different process "
+ " (old pid %d, new pid %d)", IInterface::asBinder(getTvClient()).get(), mClientPid, callingPid);
+ return -EBUSY;
+}
+
+status_t TvService::Client::lock()
+{
+ int callingPid = getCallingPid();
+ LOGD("lock from pid %d (mClientPid %d)", callingPid, mClientPid);
+ Mutex::Autolock _l(mLock);
+ // lock tv to this client if the the tv is unlocked
+ if (mClientPid == 0) {
+ mClientPid = callingPid;
+ return NO_ERROR;
+ }
+ // returns NO_ERROR if the client already owns the tv, -EBUSY otherwise
+ return checkPid();
+}
+
+status_t TvService::Client::unlock()
+{
+ int callingPid = getCallingPid();
+ LOGD("unlock from pid %d (mClientPid %d)", callingPid, mClientPid);
+ Mutex::Autolock _l(mLock);
+ // allow anyone to use tv
+ status_t result = checkPid();
+ if (result == NO_ERROR) {
+ mClientPid = 0;
+ LOGD("clear mTvClient (pid %d)", callingPid);
+ // we need to remove the reference so that when app goes
+ // away, the reference count goes to 0.
+ mTvClient.clear();
+ }
+ return result;
+}
+
+status_t TvService::Client::connect(const sp<ITvClient> &client)
+{
+ int callingPid = getCallingPid();
+ LOGD("Client::connect E (pid %d, client %p)", callingPid, IInterface::asBinder(client).get());
+ {
+ sp<ITvClient> oldClient;
+ {
+ Mutex::Autolock _l(mLock);
+ if (mClientPid != 0 && checkPid() != NO_ERROR) {
+ LOGW("Tried to connect to locked tv (old pid %d, new pid %d)", mClientPid, callingPid);
+ return -EBUSY;
+ }
+ oldClient = mTvClient;
+
+ // did the client actually change?
+ if ((mTvClient != NULL) && (IInterface::asBinder(client) == IInterface::asBinder(mTvClient))) {
+ LOGD("Connect to the same client");
+ return NO_ERROR;
+ }
+
+ mTvClient = client;
+ mClientPid = -1;
+ LOGD("Connect to the new client (pid %d, client %p)", callingPid, IInterface::asBinder(mTvClient).get());
+ }
+
+ }
+ mClientPid = callingPid;
+ return NO_ERROR;
+}
+
+TvService::Client::~Client()
+{
+ if (mIsStartTv) mpTv->StopTvLock();
+
+ int callingPid = getCallingPid();
+ // tear down client
+ LOGD("Client::~Client E (pid %d, client %p)", callingPid, IInterface::asBinder(getTvClient()).get());
+ // make sure we tear down the hardware
+ mClientPid = callingPid;
+ disconnect();
+ LOGD("Client::~Client X (pid %d)", mClientPid);
+}
+
+void TvService::Client::disconnect()
+{
+ int callingPid = getCallingPid();
+
+ LOGD("Client::disconnect() E (pid %d client %p)", callingPid, IInterface::asBinder(getTvClient()).get());
+
+ Mutex::Autolock lock(mLock);
+ if (mClientPid <= 0) {
+ LOGE("tv is unlocked (mClientPid = %d), don't tear down hardware", mClientPid);
+ return;
+ }
+ if (checkPid() != NO_ERROR) {
+ LOGE("Different client - don't disconnect");
+ return;
+ }
+
+ mTvService->removeClient(mTvClient);
+ mTvService->decUsers();
+
+ LOGD("Client::disconnect() X (pid %d)", callingPid);
+}
+
+status_t TvService::Client::createVideoFrame(const sp<IMemory> &share_mem, int iSourceMode, int iCapVideoLayerOnly)
+{
+ LOGD(" mem=%p size=%d", share_mem->pointer() == NULL, share_mem->size());
+ LOGD("iSourceMode :%d iCapVideoLayerOnly = %d \n", iSourceMode, iCapVideoLayerOnly);
+ int Len = 0;
+ Mutex::Autolock lock(mLock);
+ mTvService->mCapVidFrame.InitVCap(share_mem);
+
+ if ((1 == iSourceMode) && (1 == iCapVideoLayerOnly)) {
+ mTvService->mCapVidFrame.CapMediaPlayerVideoLayerOnly(1920, 1080);
+#if 0
+ mTvService->mCapVidFrame.SetVideoParameter(1920, 1080, 50);
+ mTvService->mCapVidFrame.VideoStart();
+ mTvService->mCapVidFrame.GetVideoData(&Len);
+ mTvService->mCapVidFrame.VideoStop();
+#endif
+ } else if (2 == iSourceMode && 0 == iCapVideoLayerOnly) {
+ mTvService->mCapVidFrame.CapOsdAndVideoLayer(1920, 1080);
+ } else if (2 == iSourceMode && 1 == iCapVideoLayerOnly) {
+ mTvService->mCapVidFrame.CapMediaPlayerVideoLayerOnly(1920, 1080);
+ } else {
+ LOGD("=============== NOT SUPPORT=======================\n");
+ }
+ mTvService->mCapVidFrame.DeinitVideoCap();
+
+ return 0;
+}
+
+status_t TvService::Client::createSubtitle(const sp<IMemory> &share_mem)
+{
+ mSubBmpBuf = share_mem;
+ LOGD("createSubtitle pid = %d, mem=%d size=%d", getCallingPid(), share_mem->pointer() == NULL, share_mem->size());
+ mpTv->setSubtitleBuffer((char *)mSubBmpBuf->pointer());
+ mTvService->mpSubClient = this;
+ //pSub = new CTvSubtitle(share_mem, this);
+ //pSub->run();
+ return 0;
+}
+status_t TvService::Client::processCmd(const Parcel &p, Parcel *r)
+{
+ int tmp_i_buf[128] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
+ unsigned char tmp_uc_buf[512] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
+ unsigned char tmp_uc_buf2[512] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
+ int8_t tmp_int8_buf[512] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
+ static int source_input = 0;
+ int *data_ptr = NULL;
+
+ int cmd = p.readInt32();
+
+ LOGD("enter client=%d cmd=%d", getCallingPid(), cmd);
+ switch (cmd) {
+ // Tv function
+ case OPEN_TV: {
+ break;
+ }
+ case CLOSE_TV: {
+ int ret = mpTv->CloseTv();
+ r->writeInt32(ret);
+ break;
+ }
+ case START_TV: {
+ int mode = p.readInt32();
+ int ret = mpTv->StartTvLock();
+ //mTvService->mpStartTvClient = this;
+ mIsStartTv = true;
+ r->writeInt32(ret);
+ break;
+ }
+ case STOP_TV: {
+ int ret = mpTv->StopTvLock();
+ r->writeInt32(ret);
+ mIsStartTv = false;
+ break;
+ }
+ case GET_TV_STATUS: {
+ int ret = 0;
+ ret = (int)mpTv->GetTvStatus();
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_LAST_SOURCE_INPUT: {
+ int ret = (int)mpTv->GetLastSourceInput();
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CURRENT_SOURCE_INPUT: {
+ int ret = (int)mpTv->GetCurrentSourceInputLock();
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CURRENT_SOURCE_INPUT_TYPE: {
+ int ret = 0;//(int)mpTv->Tvin_GetSrcInputType();
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CURRENT_SIGNAL_INFO: {
+ tvin_info_t siginfo = mpTv->GetCurrentSignalInfo();
+ int frame_rate = mpTv->getHDMIFrameRate();
+ r->writeInt32(siginfo.trans_fmt);
+ r->writeInt32(siginfo.fmt);
+ r->writeInt32(siginfo.status);
+ r->writeInt32(frame_rate);
+ break;
+ }
+ case IS_SOURCE_SWTICH_DONE: {
+ //int ret = mpTv->Tv_IsSourceSwtichDone();
+ r->writeInt32(0);
+ break;
+ }
+ case SET_SOURCE_INPUT: {
+ int sourceinput = p.readInt32();
+ tvin_window_pos_t win_pos;
+ LOGD(" SetSourceInput sourceId= %x", sourceinput);
+ source_input = sourceinput;
+ int ret = mpTv->SetSourceSwitchInput((tv_source_input_t)sourceinput);
+ r->writeInt32(ret);
+ break;
+ }
+ case DO_SUSPEND: {
+ int type = p.readInt32();
+ int ret = mpTv->DoSuspend(type);
+ r->writeInt32(ret);
+ break;
+ }
+ case DO_RESUME: {
+ int type = p.readInt32();
+ int ret = mpTv->DoResume(type);
+ r->writeInt32(ret);
+ break;
+ }
+ case RUN_ADC_AUTO_CALIBRATION: {
+ // int ret = mpTv->Tv_RunADCAutoCalibration();
+ // r->writeInt32(ret);
+ break;
+ }
+ case IS_DVI_SIGNAL: {
+ int ret = mpTv->IsDVISignal();
+ r->writeInt32(ret);
+ break;
+ }
+ case IS_VGA_TIMEING_IN_HDMI: {
+ int ret = mpTv->isVgaFmtInHdmi();
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_VIDEO_PATH_STATUS: {
+ int path_type = p.readInt32();
+ int ret = 0;//(int)mpTv->Tvin_CheckPathActive((tv_path_type_t)path_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_VIDEO_STREAM_STATUS: {
+ // int ret = (int)mpTv->Tvin_CheckVideoStreamStatus();
+ // r->writeInt32(ret);
+ break;
+ }
+ case GET_FIRST_START_SWITCH_TYPE: {
+ //int tmp_val = 0;
+ //int ret = (int)mpTv->Tv_GetFirstStartSwitchType(&tmp_val);
+ //r->writeInt32(ret);
+ r->writeInt32(1);
+ break;
+ }
+ case SET_PREVIEW_WINDOW: {
+ tvin_window_pos_t win_pos;
+ win_pos.x1 = p.readInt32();
+ win_pos.y1 = p.readInt32();
+ win_pos.x2 = p.readInt32();
+ win_pos.y2 = p.readInt32();
+ int ret = (int)mpTv->SetPreviewWindow(win_pos);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case SET_VIDEO_DISABLE: {
+ int value = p.readInt32();
+ int ret = 0;//(int)mpTv->Tv_SetVideoDisable(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case GET_SOURCE_CONNECT_STATUS: {
+ int source_input = p.readInt32();
+ int ret = mpTv->GetSourceConnectStatus((tv_source_input_t)source_input);
+ r->writeInt32(ret);
+ break;
+ }
+ //Tv function END
+
+ //VGA
+ case RUN_VGA_AUTO_ADJUST: {
+ //int ret = mpTv->Tv_RunVGAAutoAdjust();
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_VGA_AUTO_ADJUST_STATUS: {
+ // int fmt = p.readInt32();
+ //int ret = (int) mpTv->Tv_GetVagAutoAdjustStatus();
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case IS_VGA_AUTO_ADJUST_DONE: {
+ int fmt = p.readInt32();
+ int ret = 0;//mpTv->Tv_IsVGAAutoAdjustDone((tvin_sig_fmt_t)fmt);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_VGA_HPOS: {
+ // int value = p.readInt32();
+ // int fmt = p.readInt32();
+ //int ret = mpTv->Tv_SetVGAHPos(value, (tvin_sig_fmt_t)fmt);
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_VGA_HPOS: {
+ // int fmt = p.readInt32();
+ // int ret = mpTv->Tv_GetVGAHPos((tvin_sig_fmt_t)fmt);
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+
+ case SET_VGA_VPOS: {
+ // int value = p.readInt32();
+ // int fmt = p.readInt32();
+ // int ret = mpTv->Tv_SetVGAVPos(value, (tvin_sig_fmt_t)fmt);
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_VGA_VPOS: {
+ // int fmt = p.readInt32();
+ // int ret = mpTv->Tv_GetVGAVPos((tvin_sig_fmt_t)fmt);
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+
+ case SET_VGA_CLOCK: {
+ // int value = p.readInt32();
+ // int fmt = p.readInt32();
+ // int ret = mpTv->Tv_SetVGAClock(value, (tvin_sig_fmt_t)fmt);
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_VGA_CLOCK: {
+ // int fmt = p.readInt32();
+ // int ret = mpTv->Tv_GetVGAClock((tvin_sig_fmt_t)fmt);
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+
+ case SET_VGA_PHASE: {
+ // int value = p.readInt32();
+ // int fmt = p.readInt32();
+ // int ret = mpTv->Tv_SetVGAPhase(value, (tvin_sig_fmt_t)fmt);
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_VGA_PHASE: {
+ // int fmt = p.readInt32();
+ // int ret = mpTv->Tv_GetVGAPhase((tvin_sig_fmt_t)fmt);
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_VGA_AJUST_PARA: {
+ tvafe_vga_parm_t adjparam;
+ adjparam.clk_step = p.readInt32();
+ adjparam.phase = p.readInt32();
+ adjparam.hpos_step = p.readInt32();
+ adjparam.vpos_step = p.readInt32();
+ adjparam.vga_in_clean = p.readInt32();
+ int fmt = p.readInt32();
+ int ret = 0/*SetVGAAjustPara(adjparam, (tvin_sig_fmt_t)fmt)*/;
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_VGA_AJUST_PARA: {
+ tvafe_vga_parm_t adjparam;
+ int fmt = p.readInt32();
+ int ret = 0/*GetVGAAjustPara(&adjparam, (tvin_sig_fmt_t)fmt)*/;
+ r->writeInt32(adjparam.clk_step);
+ r->writeInt32(adjparam.phase);
+ r->writeInt32(adjparam.hpos_step);
+ r->writeInt32(adjparam.vpos_step);
+ r->writeInt32(adjparam.vga_in_clean);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_VGAPARAM_DEFAULT: {
+ // int ret = (int)mpTv->TvinResetVgaAjustParam();
+ // r->writeInt32(ret);
+ break;
+ }
+ // VGA END
+
+ // 3D
+
+ case SET_3D_MODE: {
+ int mode = p.readInt32();
+ int ret = mpTv->Tv_Set3DMode((VIDEO_3D_MODE_T)mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_3D_MODE: {
+ int ret = (int)mpTv->Tv_Get3DMode();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_3D_LR_SWITH: {
+ int on_off = p.readInt32();
+ //int status = p.readInt32();
+ int ret = mpTv->Tv_Set3DLRSwith(on_off);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_3D_LR_SWITH: {
+ int ret = mpTv->Tv_Get3DLRSwith();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_3D_TO_2D_MODE: {
+ int mode = p.readInt32();
+ //int status = p.readInt32();
+ int ret = mpTv->Tv_Set3DTo2DMode(mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_3D_TO_2D_MODE: {
+ int ret = mpTv->Tv_Get3DTo2DMode();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_3D_DEPTH: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_Set3DDepth(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_3D_DEPTH: {
+ int ret = mpTv->GetSave3DDepth();
+ r->writeInt32(ret);
+ break;
+ }
+ // 3D END
+
+ // PQ
+ case SET_BRIGHTNESS: {
+ int brightness = p.readInt32();
+ int source_type = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetBrightness(brightness, (tv_source_input_type_t)source_type, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_BRIGHTNESS: {
+ int source_type = p.readInt32();
+ LOGD("GET_BRIGHTNESS------------=%d", source_type);
+ int ret = mpTv->Tv_GetBrightness((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_BRIGHTNESS: {
+ int brightness = p.readInt32();
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_SaveBrightness(brightness, (tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case SET_CONTRAST: {
+ int contrast = p.readInt32();
+ int source_type = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetContrast(contrast, (tv_source_input_type_t)source_type, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CONTRAST: {
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_GetContrast((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CONTRAST: {
+ int contrast = p.readInt32();
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_SaveContrast(contrast, (tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_SATUATION: {
+ int satuation = p.readInt32();
+ int source_type = p.readInt32();
+ int fmt = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetSaturation(satuation, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_SATUATION: {
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_GetSaturation((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_SATUATION: {
+ int satuation = p.readInt32();
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_SaveSaturation(satuation, (tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_HUE: {
+ int hue = p.readInt32();
+ int source_type = p.readInt32();
+ int fmt = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetHue(hue, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_HUE: {
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_GetHue((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_HUE: {
+ int hue = p.readInt32();
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_SaveHue(hue, (tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_SCENEMODE: {
+ int mode = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = 0;//mpTv->Tv_SetSceneMode((vpp_scene_mode_t)mode,is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_SCENEMODE: {
+ int ret = 0;//(int)mpTv->Tv_GetSceneMode();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_PQMODE: {
+ int mode = p.readInt32();
+ int source_type = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetPQMode((vpp_picture_mode_t)mode, (tv_source_input_type_t)source_type, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_PQMODE: {
+ int source_type = p.readInt32();
+ int ret = (int)mpTv->Tv_GetPQMode((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_PQMODE: {
+ int mode = p.readInt32();
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_SavePQMode((vpp_picture_mode_t)mode, (tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_SHARPNESS: {
+ int value = p.readInt32();
+ int source_type = p.readInt32();
+ int en = p.readInt32();
+ int status_3d = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetSharpness(value, (tv_source_input_type_t)source_type, en, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_SHARPNESS: {
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_GetSharpness((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_SHARPNESS: {
+ int value = p.readInt32();
+ int source_type = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SaveSharpness(value, (tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_BACKLIGHT: {
+ int value = p.readInt32();
+ int source_type = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetBacklight(value, (tv_source_input_type_t)source_type, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_BACKLIGHT: {
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_GetBacklight((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_BACKLIGHT: {
+ int value = p.readInt32();
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_SaveBacklight ( value, (tv_source_input_type_t)source_type );
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_BACKLIGHT_SWITCH: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_SetBacklight_Switch(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_BACKLIGHT_SWITCH: {
+ int ret = mpTv->Tv_GetBacklight_Switch();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_COLOR_TEMPERATURE: {
+ int mode = p.readInt32();
+ int source_type = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetColorTemperature((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_COLOR_TEMPERATURE: {
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_GetColorTemperature((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_COLOR_TEMPERATURE: {
+ int mode = p.readInt32();
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_SaveColorTemperature ( (vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type );
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_DISPLAY_MODE: {
+ int mode = p.readInt32();
+ int source_type = p.readInt32();
+ int fmt = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetDisplayMode((vpp_display_mode_t)mode, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_DISPLAY_MODE: {
+ int source_type = p.readInt32();
+ int ret = (int)mpTv->Tv_GetDisplayMode((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_DISPLAY_MODE: {
+ int mode = p.readInt32();
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_SaveDisplayMode((vpp_display_mode_t)mode, (tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_NOISE_REDUCTION_MODE: {
+ int mode = p.readInt32();
+ int source_type = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_SetNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_NOISE_REDUCTION_MODE: {
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_GetNoiseReductionMode((tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_NOISE_REDUCTION_MODE: {
+ int mode = p.readInt32();
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_SaveNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case VPP_SPLIT_SCREEN_EFFECT: {
+ int mode = p.readInt32();
+ int width = p.readInt32();
+ int reverse = p.readInt32();
+ int ret = mpTv->Tv_SplitScreenEffect(mode, width, reverse);
+ r->writeInt32(ret);
+ break;
+ }
+ // PQ END
+
+ // FACTORY
+ case FACTORY_SETPQMODE_BRIGHTNESS: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int brightness = p.readInt32();
+ int ret = mpTv->Tv_FactorySetPQMode_Brightness(source_type, pq_mode, brightness);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETPQMODE_BRIGHTNESS: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetPQMode_Brightness(source_type, pq_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETPQMODE_CONTRAST: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int contrast = p.readInt32();
+ int ret = mpTv->Tv_FactorySetPQMode_Contrast(source_type, pq_mode, contrast);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETPQMODE_CONTRAST: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetPQMode_Contrast(source_type, pq_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETPQMODE_SATURATION: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int saturation = p.readInt32();
+ int ret = mpTv->Tv_FactorySetPQMode_Saturation(source_type, pq_mode, saturation);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETPQMODE_SATURATION: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetPQMode_Saturation(source_type, pq_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETPQMODE_HUE: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int hue = p.readInt32();
+ int ret = mpTv->Tv_FactorySetPQMode_Hue(source_type, pq_mode, hue);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETPQMODE_HUE: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetPQMode_Hue(source_type, pq_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETPQMODE_SHARPNESS: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int sharpness = p.readInt32();
+ int ret = mpTv->Tv_FactorySetPQMode_Sharpness(source_type, pq_mode, sharpness);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETPQMODE_SHARPNESS: {
+ int source_type = p.readInt32();
+ int pq_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetPQMode_Sharpness(source_type, pq_mode);
+
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETTESTPATTERN: {
+ int pattern = p.readInt32();
+ int ret = mpTv->Tv_FactorySetTestPattern(pattern);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETTESTPATTERN: {
+ int ret = mpTv->Tv_FactoryGetTestPattern();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETPATTERN_YUV: {
+ int blend = p.readInt32();
+ int y = p.readInt32();
+ int u = p.readInt32();
+ int v = p.readInt32();
+ int ret = mpTv->Tv_FactorySetScreenColor(blend,y,u,v);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_RESETPQMODE: {
+ int ret = mpTv->Tv_FactoryResetPQMode();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_RESETCOLORTEMP: {
+ int ret = mpTv->Tv_FactoryResetColorTemp();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_RESETPAMAMSDEFAULT: {
+ int ret = mpTv->Tv_FactorySetParamsDefault();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETDDRSSC: {
+ int setp = p.readInt32();
+ int ret = mpTv->Tv_FactorySetDDRSSC(setp);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETDDRSSC: {
+ int ret = mpTv->Tv_FactoryGetDDRSSC();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETLVDSSSC: {
+ int setp = p.readInt32();
+ int ret = mpTv->Tv_FactorySetLVDSSSC(setp);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETLVDSSSC: {
+ int ret = mpTv->Tv_FactoryGetLVDSSSC();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETNOLINEPARAMS: {
+ noline_params_t params;
+ int noline_params_type = p.readInt32();
+ int source_type = p.readInt32();
+ params.osd0 = p.readInt32();
+ params.osd25 = p.readInt32();
+ params.osd50 = p.readInt32();
+ params.osd75 = p.readInt32();
+ params.osd100 = p.readInt32();
+ int ret = mpTv->Tv_FactorySetNolineParams(noline_params_type, source_type, params);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETNOLINEPARAMS: {
+ int noline_params_type = p.readInt32();
+ int source_type = p.readInt32();
+ noline_params_t params = mpTv->Tv_FactoryGetNolineParams(noline_params_type, source_type);
+ r->writeInt32(params.osd0);
+ r->writeInt32(params.osd25);
+ r->writeInt32(params.osd50);
+ r->writeInt32(params.osd75);
+ r->writeInt32(params.osd100);
+ break;
+ }
+ case FACTORY_SETOVERSCAN: {
+ tvin_cutwin_t cutwin_t;
+ int source_type = p.readInt32();
+ int fmt = p.readInt32();
+ int status_3d = p.readInt32();
+ int trans_fmt = p.readInt32();
+ cutwin_t.hs = p.readInt32();
+ cutwin_t.he = p.readInt32();
+ cutwin_t.vs = p.readInt32();
+ cutwin_t.ve = p.readInt32();
+ int ret = mpTv->Tv_FactorySetOverscan(source_type, fmt, status_3d, trans_fmt, cutwin_t);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETOVERSCAN: {
+ int source_type = p.readInt32();
+ int fmt = p.readInt32();
+ int status_3d = p.readInt32();
+ int trans_fmt = p.readInt32();
+ tvin_cutwin_t cutwin_t = mpTv->Tv_FactoryGetOverscan(source_type, fmt, status_3d, trans_fmt);
+ r->writeInt32(cutwin_t.hs);
+ r->writeInt32(cutwin_t.he);
+ r->writeInt32(cutwin_t.vs);
+ r->writeInt32(cutwin_t.ve);
+ break;
+ }
+ case DELETE_PARAM_PQ_DB: {
+ int tmpRet = mpTv->Tv_ReplacePqDb();
+ r->writeInt32(tmpRet);
+ }
+ case REPLACE_PARAM_PQ_DB: {
+ int tmpRet;
+ String16 tmp_str16;
+ String8 value_str;
+
+ tmp_str16 = p.readString16();
+ value_str = String8(tmp_str16);
+
+ tmpRet = mpTv->Tv_ReplacePqDb(value_str.string());
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case FACTORY_SET_OUT_DEFAULT: {
+ int ret = 0;
+ ret = mpTv->Tv_SSMFacRestoreDefaultSetting();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETGLOBALOGO_RGAIN: {
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETGLOBALOGO_GGAIN: {
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETGLOBALOGO_BGAIN: {
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETGLOBALOGO_ROFFSET: {
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETGLOBALOGO_GOFFSET: {
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETGLOBALOGO_BOFFSET: {
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETGLOBALOGO_RGAIN: {
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETGLOBALOGO_GGAIN: {
+ int p1 = p.readInt32();
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETGLOBALOGO_BGAIN: {
+ int p1 = p.readInt32();
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETGLOBALOGO_ROFFSET: {
+ int p1 = p.readInt32();
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETGLOBALOGO_GOFFSET: {
+ int p1 = p.readInt32();
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETGLOBALOGO_BOFFSET: {
+ int p1 = p.readInt32();
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_CLEAN_ALL_TABLE_FOR_PROGRAM: {
+ int ret = mpTv->ClearAnalogFrontEnd();
+ mpTv->clearDbAllProgramInfoTable();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETBACKLIGHT_PWM_FREQUENCY: {
+ int value = p.readInt32();
+ int ret = 0;//mpTv->GetVpp().Tv_FactorySetBacklightPWM_Frequency(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETBACKLIGHT_PWM_FREQUENCY: {
+ int ret = 0;//mpTv->GetVpp().Tv_FactoryGetBacklightPWM_Frequency();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETBACKLIGHT_SWITCH_STATUS: {
+ int value = p.readInt32();
+ int ret = 0;//mpTv->GetVpp().Tv_FactorySetBacklight_Switch_status(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETBACKLIGHT_SWITCH_STATUS: {
+ int ret = 0;//mpTv->GetVpp().Tv_FactoryGetBacklight_Switch_status();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETBACKLIGHT_PWM_DUTY: {
+ int value = p.readInt32();
+ int ret = 0;//mpTv->GetVpp().Tv_FactorySetBacklightPWM_Duty(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETBACKLIGHT_PWM_DUTY: {
+ int ret = 0;//mpTv->GetVpp().Tv_FactoryGetBacklightPWM_Duty();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_SETLVDS_COLOR_DEPTH: {
+ int value = p.readInt32();
+ int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_ColorDepth(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETLVDS_COLOR_DEPTH: {
+ int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_ColorDepth();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETLVDS_DITHER_STATUS: {
+ int value = p.readInt32();
+ int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_ColorDither_status(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETLVDS_DITHER_STATUS: {
+ int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_ColorDither_status();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETLVDS_MAPPING_STATUS: {
+ int value = p.readInt32();
+ int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_Mapping_status(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETLVDS_MAPPING_STATUS: {
+ int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_Mapping_status();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_SETLVDS_PORT_SWAP_STATUS: {
+ int value = p.readInt32();
+ int ret = 0;//mpTv->GetVpp().Tv_FactorySetLVDS_PortSwap_status(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_GETLVDS_PORT_SWAP_STATUS: {
+ int ret = 0;//mpTv->GetVpp().Tv_FactoryGetLVDS_PortSwap_status();
+ r->writeInt32(ret);
+ break;
+ }
+ // FACTORY END
+
+ // AUDIO
+ // AUDIO MUTE
+ case SET_AUDIO_MUTEKEY_STATUS: {
+ int status = p.readInt32();
+ int ret = mpTv->SetAudioMuteForSystem(status);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_MUTEKEY_STATUS: {
+ int ret = mpTv->GetAudioMuteForSystem();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AUDIO_FORCE_MUTE_STATUS: {
+ int status = p.readInt32();
+ int ret = 0;//pTv->getTvAudio().AudioSetForceMuteStatus(status);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_FORCE_MUTE_STATUS: {
+ int ret = 0;//mpTv->AudioGetForceMuteStatus();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AUDIO_AVOUT_MUTE_STATUS: {
+ int status = p.readInt32();
+ int ret = mpTv->SetAudioAVOutMute(status);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_AVOUT_MUTE_STATUS: {
+ int ret = mpTv->GetAudioAVOutMute();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AUDIO_SPDIF_MUTE_STATUS: {
+ int status = p.readInt32();
+ int ret = mpTv->SetAudioSPDIFMute(status);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_SPDIF_MUTE_STATUS: {
+ int ret = mpTv->GetAudioSPDIFMute();
+ r->writeInt32(ret);
+ break;
+ }
+ // AUDIO MASTER VOLUME
+ case SET_AUDIO_MASTER_VOLUME: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioMasterVolume(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_MASTER_VOLUME: {
+ int ret = mpTv->GetAudioMasterVolume();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_MASTER_VOLUME: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioMasterVolume(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_MASTER_VOLUME: {
+ int ret = mpTv->GetCurAudioMasterVolume();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO BALANCE
+ case SET_AUDIO_BALANCE: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioBalance(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_BALANCE: {
+ int ret = mpTv->GetAudioBalance();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_BALANCE: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioBalance(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_BALANCE: {
+ int ret = mpTv->GetCurAudioBalance();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO SUPPERBASS VOLUME
+ case SET_AUDIO_SUPPER_BASS_VOLUME: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioSupperBassVolume(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_SUPPER_BASS_VOLUME: {
+ int ret = mpTv->GetAudioSupperBassVolume();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_SUPPER_BASS_VOLUME: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioSupperBassVolume(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_SUPPER_BASS_VOLUME: {
+ int ret = mpTv->GetCurAudioSupperBassVolume();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO SUPPERBASS SWITCH
+ case SET_AUDIO_SUPPER_BASS_SWITCH: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioSupperBassSwitch(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_SUPPER_BASS_SWITCH: {
+ int ret = mpTv->GetAudioSupperBassSwitch();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_SUPPER_BASS_SWITCH: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioSupperBassSwitch(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_SUPPER_BASS_SWITCH: {
+ int ret = mpTv->GetCurAudioSupperBassSwitch();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO SRS SURROUND SWITCH
+ case SET_AUDIO_SRS_SURROUND: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioSRSSurround(vol);
+ mpTv->RefreshAudioMasterVolume(SOURCE_MAX);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_SRS_SURROUND: {
+ int ret = mpTv->GetAudioSRSSurround();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_SRS_SURROUND: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioSrsSurround(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_SRS_SURROUND: {
+ int ret = mpTv->GetCurAudioSRSSurround();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO SRS DIALOG CLARITY
+ case SET_AUDIO_SRS_DIALOG_CLARITY: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioSrsDialogClarity(vol);
+ mpTv->RefreshAudioMasterVolume(SOURCE_MAX);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_SRS_DIALOG_CLARITY: {
+ int ret = mpTv->GetAudioSrsDialogClarity();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_SRS_DIALOG_CLARITY: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioSrsDialogClarity(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_SRS_DIALOG_CLARITY: {
+ int ret = mpTv->GetCurAudioSrsDialogClarity();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO SRS TRUBASS
+ case SET_AUDIO_SRS_TRU_BASS: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioSrsTruBass(vol);
+ mpTv->RefreshAudioMasterVolume(SOURCE_MAX);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_SRS_TRU_BASS: {
+ int ret = mpTv->GetAudioSrsTruBass();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_SRS_TRU_BASS: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioSrsTruBass(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_SRS_TRU_BASS: {
+ int ret = mpTv->GetCurAudioSrsTruBass();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO BASS
+ case SET_AUDIO_BASS_VOLUME: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioBassVolume(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_BASS_VOLUME: {
+ int ret = mpTv->GetAudioBassVolume();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_BASS_VOLUME: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioBassVolume(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_BASS_VOLUME: {
+ int ret = mpTv->GetCurAudioBassVolume();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO TREBLE
+ case SET_AUDIO_TREBLE_VOLUME: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioTrebleVolume(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_TREBLE_VOLUME: {
+ int ret = mpTv->GetAudioTrebleVolume();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_TREBLE_VOLUME: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioTrebleVolume(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_TREBLE_VOLUME: {
+ int ret = mpTv->GetCurAudioTrebleVolume();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO SOUND MODE
+ case SET_AUDIO_SOUND_MODE: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioSoundMode(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_SOUND_MODE: {
+ int ret = mpTv->GetAudioSoundMode();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_SOUND_MODE: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioSoundMode(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_SOUND_MODE: {
+ int ret = mpTv->GetCurAudioSoundMode();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO WALL EFFECT
+ case SET_AUDIO_WALL_EFFECT: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioWallEffect(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_WALL_EFFECT: {
+ int ret = mpTv->GetAudioWallEffect();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_WALL_EFFECT: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioWallEffect(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_WALL_EFFECT: {
+ int ret = mpTv->GetCurAudioWallEffect();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO EQ MODE
+ case SET_AUDIO_EQ_MODE: {
+ int vol = p.readInt32();
+ int ret = mpTv->SetAudioEQMode(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_EQ_MODE: {
+ int ret = mpTv->GetAudioEQMode();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_EQ_MODE: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioEQMode(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_EQ_MODE: {
+ int ret = mpTv->GetCurAudioEQMode();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO EQ GAIN
+ case GET_AUDIO_EQ_RANGE: {
+ int buf[2];
+ int ret = mpTv->GetAudioEQRange(buf);
+ r->writeInt32(2);
+ r->writeInt32(buf[0]);
+ r->writeInt32(buf[1]);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_EQ_BAND_COUNT: {
+ int ret = mpTv->GetAudioEQBandCount();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AUDIO_EQ_GAIN: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ tmp_buf_size = p.readInt32();
+ for (i = 0; i < tmp_buf_size; i++) {
+ tmp_i_buf[i] = p.readInt32();
+ }
+ ret = mpTv->SetAudioEQGain(tmp_i_buf);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_EQ_GAIN: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ ret = mpTv->GetAudioEQGain(tmp_i_buf);
+ tmp_buf_size = mpTv->GetAudioEQBandCount();
+ r->writeInt32(tmp_buf_size);
+ for (i = 0; i < tmp_buf_size; i++) {
+ r->writeInt32(tmp_i_buf[i]);
+ }
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_EQ_GAIN: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ tmp_buf_size = p.readInt32();
+ for (i = 0; i < tmp_buf_size; i++) {
+ tmp_i_buf[i] = p.readInt32();
+ }
+ ret = mpTv->SaveCurAudioEQGain(tmp_i_buf);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_EQ_GAIN: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ ret = mpTv->GetCurAudioEQGain(tmp_i_buf);
+ tmp_buf_size = mpTv->GetAudioEQBandCount();
+ r->writeInt32(tmp_buf_size);
+ for (i = 0; i < tmp_buf_size; i++) {
+ r->writeInt32(tmp_i_buf[i]);
+ }
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AUDIO_EQ_SWITCH: {
+ int tmpVal = p.readInt32();
+ int ret = mpTv->SetAudioEQSwitch(tmpVal);
+ r->writeInt32(ret);
+ break;
+ }
+ // AUDIO SPDIF SWITCH
+ case SET_AUDIO_SPDIF_SWITCH: {
+ int tmp_val = p.readInt32();
+ int ret = mpTv->SetAudioSPDIFSwitch(tmp_val);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_SPDIF_SWITCH: {
+ int ret = 0;//mpTv->GetAudioSPDIFSwitch();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_SPDIF_SWITCH: {
+ int tmp_val = p.readInt32();
+ int ret = mpTv->SaveCurAudioSPDIFSwitch(tmp_val);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_SPDIF_SWITCH: {
+ int ret = mpTv->GetCurAudioSPDIFSwitch();
+ r->writeInt32(ret);
+ break;
+ }
+ //AUDIO SPDIF MODE
+ case SET_AUDIO_SPDIF_MODE: {
+ int vol = p.readInt32();
+ int progId = p.readInt32();
+ int audioTrackId = p.readInt32();
+ int ret = mpTv->SetAudioSPDIFMode(vol);
+ mpTv->ResetAudioDecoderForPCMOutput();
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_SPDIF_MODE: {
+ int ret = 0;//mpTv->GetAudioSPDIFMode();
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_CUR_AUDIO_SPDIF_MODE: {
+ int vol = p.readInt32();
+ int ret = mpTv->SaveCurAudioSPDIFMode(vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_CUR_AUDIO_SPDIF_MODE: {
+ int ret = mpTv->GetCurAudioSPDIFMode();
+ r->writeInt32(ret);
+ break;
+ }
+ case OPEN_AMAUDIO: {
+ int sr = p.readInt32();
+ int output_dev = p.readInt32();
+ int ret = 0;//mpTv->OpenAmAudio(sr, output_dev);
+ r->writeInt32(ret);
+ break;
+ }
+ case CLOSE_AMAUDIO: {
+ int ret = 0;//mpTv->CloseAmAudio();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AMAUDIO_INPUT_SR: {
+ int sr = p.readInt32();
+ int output_dev = p.readInt32();
+ int ret = 0;//mpTv->SetAmAudioInputSr(sr, output_dev);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AMAUDIO_OUTPUT_MODE: {
+ int tmp_val = p.readInt32();
+ int ret = mpTv->SetAmAudioOutputMode(tmp_val);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AMAUDIO_MUSIC_GAIN: {
+ int tmp_val = p.readInt32();
+ int ret = mpTv->SetAmAudioMusicGain(tmp_val);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AMAUDIO_LEFT_GAIN: {
+ int tmp_val = p.readInt32();
+ int ret = mpTv->SetAmAudioLeftGain(tmp_val);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AMAUDIO_RIGHT_GAIN: {
+ int tmp_val = p.readInt32();
+ int ret = mpTv->SetAmAudioRightGain(tmp_val);
+ r->writeInt32(ret);
+ break;
+ }
+ case SELECT_LINE_IN_CHANNEL: {
+ int channel = p.readInt32();
+ int ret = mpTv->AudioLineInSelectChannel(channel);
+ r->writeInt32(ret);
+ LOGD("SELECT_LINE_IN_CHANNEL: channel = %d; ret = %d.\n", channel, ret);
+ break;
+ }
+ case SET_KALAOK_IO_LEVEL: {
+ int level = p.readInt32();
+ int ret = mpTv->SetKalaokIO(level);
+ ret =mpTv->AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN);
+ r->writeInt32(ret);
+ LOGD("set line in source CC_AUDIO_IN_SOURCE_LINEIN\n");
+ break;
+ }
+
+ case SET_LINE_IN_CAPTURE_VOL: {
+ int l_vol = p.readInt32();
+ int r_vol = p.readInt32();
+ int ret = mpTv->AudioSetLineInCaptureVolume(l_vol, r_vol);
+ r->writeInt32(ret);
+ break;
+ }
+ case HANDLE_AUDIO_HEADSET_PLUG_IN: {
+ int ret = mpTv->AudioHandleHeadsetPlugIn();
+ r->writeInt32(ret);
+ break;
+ }
+ case HANDLE_AUDIO_HEADSET_PULL_OUT: {
+ int ret = mpTv->AudioHandleHeadsetPullOut();
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AUDIO_VOL_COMP: {
+ int tmpVal = p.readInt32();
+ int ret = mpTv->SetCurProgramAudioVolumeCompensationVal(tmpVal);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUDIO_VOL_COMP: {
+ int ret = mpTv->GetAudioVolumeCompensationVal(-1);
+ r->writeInt32(ret);
+ break;
+ }
+ case SAVE_AUDIO_VOL_COMP: {
+ int tmpVal = p.readInt32();
+ int ret = -1;//mpTv->atvSaveAudioVolumeCompensationVal(tmpVal);
+ LOGD("this cmd is empty!!!!!!!!!!!!!!!!!!!");
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_NOISE_GATE_THRESHOLD: {
+ int ret = 0;
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_AUDIO_SOURCE_FOR_KARAOKE: {
+ int sourceinput = p.readInt32();
+ int ret = mpTv->Tv_SetAudioSourceType((tv_source_input_t)sourceinput);
+ r->writeInt32(ret);
+ break;
+ }
+ case SET_DBX_TV_MODE: {
+ int mode = p.readInt32();
+ int son_value = p.readInt32();
+ int vol_value = p.readInt32();
+ int sur_value = p.readInt32();
+ int ret = mpTv->SetDbxTvMode(mode, son_value, vol_value, sur_value);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_DBX_TV_MODE: {
+ int mode ;
+ int son_value ;
+ int vol_value ;
+ int sur_value ;
+ int ret = mpTv->GetDbxTvMode(&mode, &son_value, &vol_value, &sur_value);
+ r->writeInt32(mode);
+ r->writeInt32(son_value);
+ r->writeInt32(vol_value);
+ r->writeInt32(sur_value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case SET_DRC_ONOFF: {
+ int val = p.readInt32();
+ int ret = mpTv->Tv_SetDRC_OnOff(val);
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_DRC_ONOFF: {
+ int ret = mpTv->Tv_GetDRC_OnOff();
+ r->writeInt32(ret);
+ break;
+ }
+ // AUDIO END
+
+ // SSM
+ case SSM_INIT_DEVICE: {
+ int tmpRet = 0;
+ tmpRet = mpTv->Tv_SSMRestoreDefaultSetting();//mpTv->Tv_SSMInitDevice();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ /*case SSM_SAVE_ONE_BYTE: {
+ int tmpOffset = p.readInt32();
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMWriteOneByte(tmpOffset, tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_ONE_BYTE: {
+ int tmpOffset = p.readInt32();
+ int tmpRet = 0;
+ SSMReadOneByte(tmpOffset, &tmpRet);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_N_BYTES: {
+ int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
+
+ tmp_offset = p.readInt32();
+ tmp_data_len = p.readInt32();
+
+ if (tmp_data_len > 0) {
+ data_ptr = new int[tmp_data_len];
+
+ if (data_ptr != NULL) {
+ for (i = 0; i < tmp_data_len; i++) {
+ data_ptr[i] = p.readInt32();
+ }
+
+ ret = SSMWriteNTypes(tmp_offset, tmp_data_len, data_ptr);
+
+ delete data_ptr;
+ data_ptr = NULL;
+ }
+ }
+
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_READ_N_BYTES: {
+ int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
+ tmp_offset = p.readInt32();
+ tmp_data_len = p.readInt32();
+
+ if (tmp_data_len > 0) {
+ data_ptr = new int[tmp_data_len];
+ if (data_ptr != NULL) {
+ ret = SSMReadNTypes(tmp_offset, tmp_data_len, data_ptr);
+ if (ret < 0) {
+ tmp_data_len = 0;
+ }
+ r->writeInt32(tmp_data_len);
+ for (i = 0; i < tmp_data_len; i++) {
+ r->writeInt32(data_ptr[i]);
+ }
+ delete data_ptr;
+ data_ptr = NULL;
+ }
+ }
+ r->writeInt32(ret);
+ break;
+ }*/
+ case SSM_SAVE_POWER_ON_OFF_CHANNEL: {
+ int tmpPowerChanNum = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSavePowerOnOffChannel(tmpPowerChanNum);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_POWER_ON_OFF_CHANNEL: {
+ int tmpRet = 0;
+ tmpRet = SSMReadPowerOnOffChannel();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_SOURCE_INPUT: {
+ int tmpSouceInput = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveSourceInput(tmpSouceInput);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_SOURCE_INPUT: {
+ int tmpRet = 0;
+ tmpRet = SSMReadSourceInput();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_LAST_SOURCE_INPUT: {
+ int tmpLastSouceInput = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveLastSelectSourceInput(tmpLastSouceInput);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_LAST_SOURCE_INPUT: {
+ int tmpRet = 0;
+ tmpRet = SSMReadLastSelectSourceInput();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_SYS_LANGUAGE: {
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveSystemLanguage(tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_SYS_LANGUAGE: {
+ int tmpRet = 0;
+ tmpRet = SSMReadSystemLanguage();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_AGING_MODE: {
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveAgingMode(tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_AGING_MODE: {
+ int tmpRet = 0;
+ tmpRet = SSMReadAgingMode();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_PANEL_TYPE: {
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSavePanelType(tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_PANEL_TYPE: {
+ int tmpRet = 0;
+ tmpRet = SSMReadPanelType();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_MAC_ADDR: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ tmp_buf_size = p.readInt32();
+ for (i = 0; i < tmp_buf_size; i++) {
+ tmp_uc_buf[i] = p.readInt32();
+ }
+ ret = KeyData_SaveMacAddress(tmp_uc_buf);
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_READ_MAC_ADDR: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ ret = KeyData_ReadMacAddress(tmp_uc_buf);
+ tmp_buf_size = KeyData_GetMacAddressDataLen();
+ r->writeInt32(tmp_buf_size);
+ for (i = 0; i < tmp_buf_size; i++) {
+ r->writeInt32(tmp_uc_buf[i]);
+ }
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_SAVE_BAR_CODE: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ tmp_buf_size = p.readInt32();
+ for (i = 0; i < tmp_buf_size; i++) {
+ tmp_uc_buf[i] = p.readInt32();
+ }
+ ret = KeyData_SaveBarCode(tmp_uc_buf);
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_READ_BAR_CODE: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ ret = KeyData_ReadBarCode(tmp_uc_buf);
+ tmp_buf_size = KeyData_GetBarCodeDataLen();
+ r->writeInt32(tmp_buf_size);
+ for (i = 0; i < tmp_buf_size; i++) {
+ r->writeInt32(tmp_uc_buf[i]);
+ }
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_SAVE_PROJECT_ID: {
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = KeyData_SaveProjectID(tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_PROJECT_ID: {
+ int tmpRet = 0;
+ tmpRet = KeyData_ReadProjectID();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_HDCPKEY: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ tmp_buf_size = p.readInt32();
+ for (i = 0; i < tmp_buf_size; i++) {
+ tmp_uc_buf[i] = p.readInt32();
+ }
+ ret = SSMSaveHDCPKey(tmp_uc_buf);
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_READ_HDCPKEY: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ ret = SSMReadHDCPKey(tmp_uc_buf);
+ tmp_buf_size = SSMGetHDCPKeyDataLen();
+ r->writeInt32(tmp_buf_size);
+ for (i = 0; i < tmp_buf_size; i++) {
+ r->writeInt32(tmp_uc_buf[i]);
+ }
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_SAVE_POWER_ON_MUSIC_SWITCH: {
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSavePowerOnMusicSwitch(tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_POWER_ON_MUSIC_SWITCH: {
+ int tmpRet = 0;
+ tmpRet = SSMReadPowerOnMusicSwitch();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_POWER_ON_MUSIC_VOL: {
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSavePowerOnMusicVolume(tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_POWER_ON_MUSIC_VOL: {
+ int tmpRet = 0;
+ tmpRet = SSMReadPowerOnMusicVolume();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_SYS_SLEEP_TIMER: {
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveSystemSleepTimer(tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_SYS_SLEEP_TIMER: {
+ int tmpRet = 0;
+ tmpRet = SSMReadSystemSleepTimer();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SET_BUS_STATUS: {
+ int tmpVal = p.readInt32();
+ int tmpRet = 0;
+ //showboz
+ //tmpRet = SSMSetBusStatus(tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_GET_BUS_STATUS: {
+ int tmpRet = 0;
+ //showboz
+ //tmpRet = SSMGetBusStatus();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_INPUT_SRC_PARENTAL_CTL: {
+ int tmpSourceIndex = p.readInt32();
+ int tmpCtlFlag = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveInputSourceParentalControl(tmpSourceIndex, tmpCtlFlag);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_INPUT_SRC_PARENTAL_CTL: {
+ int tmpSourceIndex = p.readInt32();
+ int tmpRet = 0;
+ tmpRet = SSMReadInputSourceParentalControl(tmpSourceIndex);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_PARENTAL_CTL_SWITCH: {
+ int tmpSwitchFlag = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveParentalControlSwitch(tmpSwitchFlag);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_PARENTAL_CTL_SWITCH: {
+ int tmpRet = 0;
+ tmpRet = SSMReadParentalControlSwitch();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_PARENTAL_CTL_PASS_WORD: {
+ String16 pass_wd_str = p.readString16();
+ int tmpRet;
+ tmpRet = SSMSaveParentalControlPassWord((unsigned char *)pass_wd_str.string(), pass_wd_str.size() * sizeof(unsigned short));
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_PARENTAL_CTL_PASS_WORD: {
+ int tmpChanID = p.readInt32();
+ unsigned short tmp_buf [SSM_RW_PARENTAL_CTL_PASSWORD_LEN + 1];
+ String16 pass_wd_str;
+ SSMReadParentalControlPassWord(tmp_buf);
+ tmp_buf[SSM_RW_PARENTAL_CTL_PASSWORD_LEN / sizeof(unsigned short)] = 0;
+ //pass_wd_str.setTo((const unsigned short *) tmp_buf);
+ //r->writeString16(pass_wd_str);
+ break;
+ }
+ case SSM_SAVE_USING_DEF_HDCP_KEY_FLAG: {
+ break;
+ }
+ case SSM_READ_USING_DEF_HDCP_KEY_FLAG: {
+ break;
+ }
+ case SSM_GET_CUSTOMER_DATA_START: {
+ int tmpRet = 0;
+ tmpRet = SSMGetCustomerDataStart();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_GET_CUSTOMER_DATA_LEN: {
+ int tmpRet = 0;
+ tmpRet = SSMGetCustomerDataLen();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_STANDBY_MODE: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveStandbyMode(tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_STANDBY_MODE: {
+ int tmpRet = 0;
+ tmpRet = SSMReadStandbyMode();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_LOGO_ON_OFF_FLAG: {
+ int tmpSwitchFlag = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveLogoOnOffFlag(tmpSwitchFlag);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_LOGO_ON_OFF_FLAG: {
+ int tmpRet = 0;
+ tmpRet = SSMReadLogoOnOffFlag();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_HDMIEQ_MODE: {
+ int tmpSwitchFlag = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveHDMIEQMode(tmpSwitchFlag);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_HDMIEQ_MODE: {
+ int tmpRet = 0;
+ tmpRet = SSMReadHDMIEQMode();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_HDMIINTERNAL_MODE: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveHDMIInternalMode(tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_HDMIINTERNAL_MODE: {
+ int tmpRet = 0;
+ tmpRet = SSMReadHDMIInternalMode();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_DISABLE_3D: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveDisable3D(tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_DISABLE_3D: {
+ int tmpRet = 0;
+ tmpRet = SSMReadDisable3D();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_GLOBAL_OGOENABLE: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveGlobalOgoEnable(tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_GLOBAL_OGOENABLE: {
+ int tmpRet = 0;
+ tmpRet = SSMReadGlobalOgoEnable();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_NON_STANDARD_STATUS: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveNonStandardValue(tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_NON_STANDARD_STATUS: {
+ int tmpRet = 0;
+ tmpRet = SSMReadNonStandardValue();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_ADB_SWITCH_STATUS: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveAdbSwitchValue(tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_ADB_SWITCH_STATUS: {
+ int tmpRet = 0;
+ tmpRet = SSMReadAdbSwitchValue();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_SERIAL_CMD_SWITCH_STATUS: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveSerialCMDSwitchValue(tmp_val);
+ tmpRet |= mpTv->SetSerialSwitch(SERIAL_A, tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_SERIAL_CMD_SWITCH_STATUS: {
+ int tmpRet = 0;
+ tmpRet = SSMReadSerialCMDSwitchValue();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SET_HDCP_KEY: {
+ int tmpRet = 0;
+ tmpRet = SSMSetHDCPKey();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_REFRESH_HDCPKEY: {
+ int tmpRet = 0;
+ tmpRet = SSMRefreshHDCPKey();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_CHROMA_STATUS: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveChromaStatus(tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_CA_BUFFER_SIZE: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveCABufferSizeValue(tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_CA_BUFFER_SIZE: {
+ int tmpRet = 0;
+ tmpRet = SSMReadCABufferSizeValue();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_GET_ATV_DATA_START: {
+ int tmpRet = 0;
+ tmpRet = SSMGetATVDataStart();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_GET_ATV_DATA_LEN: {
+ int tmpRet = 0;
+ tmpRet = SSMGetATVDataLen();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_GET_VPP_DATA_START: {
+ int tmpRet = 0;
+ tmpRet = SSMGetVPPDataStart();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_GET_VPP_DATA_LEN: {
+ int tmpRet = 0;
+ tmpRet = SSMGetVPPDataLen();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_SAVE_NOISE_GATE_THRESHOLD_STATUS: {
+ int tmp_val = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveNoiseGateThresholdValue(tmp_val);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_READ_NOISE_GATE_THRESHOLD_STATUS: {
+ int tmpRet = 0;
+ tmpRet = SSMReadNoiseGateThresholdValue();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_EEPROM_SAVE_ONE_BYTE_N310_N311: {
+ int tmpOffset = p.readInt32();
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveEEP_One_N310_N311(tmpOffset, tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_EEPROM_READ_ONE_BYTE_N310_N311: {
+ int tmpOffset = p.readInt32();
+ int tmpRet = 0;
+ tmpRet = SSMReadEEP_One_N310_N311(tmpOffset);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_EEPROM_SAVE_N_BYTES_N310_N311: {
+ int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
+
+ tmp_offset = p.readInt32();
+ tmp_data_len = p.readInt32();
+
+ if (tmp_data_len > 0) {
+ data_ptr = new int[tmp_data_len];
+
+ if (data_ptr != NULL) {
+ for (i = 0; i < tmp_data_len; i++) {
+ data_ptr[i] = p.readInt32();
+ }
+
+ ret = SSMSaveEEP_N_N310_N311(tmp_offset, tmp_data_len, data_ptr);
+
+ delete data_ptr;
+ data_ptr = NULL;
+ }
+ }
+
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_EEPROM_READ_N_BYTES_N310_N311: {
+ int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
+ tmp_offset = p.readInt32();
+ tmp_data_len = p.readInt32();
+
+ if (tmp_data_len > 0) {
+ data_ptr = new int[tmp_data_len];
+ if (data_ptr != NULL) {
+ ret = SSMReadEEP_N_N310_N311(tmp_offset, tmp_data_len, data_ptr);
+ if (ret < 0) {
+ tmp_data_len = 0;
+ }
+ r->writeInt32(tmp_data_len);
+ for (i = 0; i < tmp_data_len; i++) {
+ r->writeInt32(data_ptr[i]);
+ }
+ delete data_ptr;
+ data_ptr = NULL;
+ }
+ }
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_FLASH_SAVE_ONE_BYTE_N310_N311: {
+ int tmpOffset = p.readInt32();
+ int tmpVal = p.readInt32();
+ int tmpRet;
+ tmpRet = SSMSaveFlash_One_N310_N311(tmpOffset, tmpVal);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_FLASH_READ_ONE_BYTE_N310_N311: {
+ int tmpOffset = p.readInt32();
+ int tmpRet = 0;
+ tmpRet = SSMReadFlash_One_N310_N311(tmpOffset);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case SSM_FLASH_SAVE_N_BYTES_N310_N311: {
+ int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
+
+ tmp_offset = p.readInt32();
+ tmp_data_len = p.readInt32();
+
+ if (tmp_data_len > 0) {
+ data_ptr = new int[tmp_data_len];
+
+ if (data_ptr != NULL) {
+ for (i = 0; i < tmp_data_len; i++) {
+ data_ptr[i] = p.readInt32();
+ }
+
+ ret = SSMSaveFlash_N_N310_N311(tmp_offset, tmp_data_len, data_ptr);
+
+ delete data_ptr;
+ data_ptr = NULL;
+ }
+ }
+
+ r->writeInt32(ret);
+ break;
+ }
+ case SSM_FLASH_READ_N_BYTES_N310_N311: {
+ int i = 0, tmp_offset = 0, tmp_data_len = 0, ret = -1;
+ tmp_offset = p.readInt32();
+ tmp_data_len = p.readInt32();
+
+ if (tmp_data_len > 0) {
+ data_ptr = new int[tmp_data_len];
+ if (data_ptr != NULL) {
+ ret = SSMReadFlash_N_N310_N311(tmp_offset, tmp_data_len, data_ptr);
+ if (ret < 0) {
+ tmp_data_len = 0;
+ }
+ r->writeInt32(tmp_data_len);
+ for (i = 0; i < tmp_data_len; i++) {
+ r->writeInt32(data_ptr[i]);
+ }
+ delete data_ptr;
+ data_ptr = NULL;
+ }
+ }
+ r->writeInt32(ret);
+ break;
+ }
+ // SSM END
+
+ //MISC
+ case MISC_PROP_SET: {
+ int tmpRet;
+ String16 tmp_str16;
+ String8 key_str, value_str;
+
+ tmp_str16 = p.readString16();
+ key_str = String8(tmp_str16);
+ tmp_str16 = p.readString16();
+ value_str = String8(tmp_str16);
+
+ tmpRet = property_set(key_str.string(), value_str.string());
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case MISC_PROP_GET: {
+ char prop_value[PROPERTY_VALUE_MAX];
+ String16 tmp_str16;
+ String8 key_str, def_str;
+
+ tmp_str16 = p.readString16();
+ key_str = String8(tmp_str16);
+ tmp_str16 = p.readString16();
+ def_str = String8(tmp_str16);
+
+ memset(prop_value, '\0', PROPERTY_VALUE_MAX);
+ property_get(key_str.string(), prop_value, def_str.string());
+ tmp_str16 = String16(prop_value);
+
+ r->writeString16(tmp_str16);
+ break;
+ }
+ case MISC_CFG_SET: {
+ int tmpRet;
+ String16 tmp_str16;
+ String8 key_str, value_str;
+
+ tmp_str16 = p.readString16();
+ key_str = String8(tmp_str16);
+ tmp_str16 = p.readString16();
+ value_str = String8(tmp_str16);
+
+ tmpRet = config_set_str("TV", key_str.string(), value_str.string());
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case MISC_CFG_GET: {
+ const char *prop_value;
+ String16 tmp_str16;
+ String8 key_str, def_str;
+
+ tmp_str16 = p.readString16();
+ key_str = String8(tmp_str16);
+ tmp_str16 = p.readString16();
+ def_str = String8(tmp_str16);
+
+ prop_value = config_get_str("TV", key_str.string(), def_str.string());
+ tmp_str16 = String16(prop_value);
+
+ r->writeString16(tmp_str16);
+ break;
+ }
+ case MISC_READ_ADC_VAL: {
+ int tmpChanNum = p.readInt32();
+ int tmpRet = 0;
+ tmpRet = ReadADCSpecialChannelValue(tmpChanNum);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case MISC_SET_WDT_USER_PET: {
+ int counter = p.readInt32();
+ int ret = TvMisc_SetUserCounter(counter);
+ r->writeInt32(ret);
+ break;
+ }
+ case MISC_SET_WDT_USER_COUNTER: {
+ int counter_time_out = p.readInt32();
+ int ret = TvMisc_SetUserCounterTimeOut(counter_time_out);
+ r->writeInt32(ret);
+ break;
+ }
+ case MISC_SET_WDT_USER_PET_RESET_ENABLE: {
+ int enable = p.readInt32();
+ int ret = TvMisc_SetUserPetResetEnable(enable);
+ r->writeInt32(ret);
+ break;
+ }
+ case MISC_GET_TV_API_VERSION: {
+ const char *tmp_str8;
+ String16 tmp_str16;
+
+ // write tvapi version info
+ tmp_str8 = tvservice_get_git_branch_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+
+ tmp_str8 = tvservice_get_git_version_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+
+ tmp_str8 = tvservice_get_last_chaned_time_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+
+ tmp_str8 = tvservice_get_build_time_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+
+ tmp_str8 = tvservice_get_build_name_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+ break;
+ }
+ case MISC_GET_DVB_API_VERSION: {
+ const char *tmp_str8;
+ String16 tmp_str16;
+
+ // write dvb version info
+ tmp_str8 = dvb_get_git_branch_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+
+ tmp_str8 = dvb_get_git_version_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+
+ tmp_str8 = dvb_get_last_chaned_time_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+
+ tmp_str8 = dvb_get_build_time_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+
+ tmp_str8 = dvb_get_build_name_info();
+ tmp_str16 = String16(tmp_str8);
+ r->writeString16(tmp_str16);
+
+ break;
+ }
+ case MISC_SERIAL_SWITCH: {
+ int dev_id = p.readInt32();
+ int switch_val = p.readInt32();
+ int ret = mpTv->SetSerialSwitch(dev_id, switch_val);
+ r->writeInt32(ret);
+ break;
+ }
+ case MISC_SERIAL_SEND_DATA: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+
+ int dev_id = p.readInt32();
+
+ tmp_buf_size = p.readInt32();
+ if (tmp_buf_size > sizeof(tmp_uc_buf)) {
+ tmp_buf_size = sizeof(tmp_uc_buf);
+ }
+
+ for (i = 0; i < tmp_buf_size; i++) {
+ tmp_uc_buf[i] = p.readInt32() & 0xFF;
+ }
+
+ ret = mpTv->SendSerialData(dev_id, tmp_buf_size, tmp_uc_buf);
+ r->writeInt32(ret);
+ break;
+ }
+ case MISC_CHANNEL_EXPORT: {
+ LOGD("MISC_CHANNEL_EXPORT");
+ int ret = 0;
+ String16 tmp_str16;
+ String8 tmp_str;
+
+ tmp_str16 = p.readString16();
+ tmp_str = String8(tmp_str16);
+
+ ret = mpTv->ChannelExport(tmp_str.string());
+ r->writeInt32(ret);
+ break;
+ }
+ case MISC_CHANNEL_IMPORT: {
+ LOGD("MISC_CHANNEL_IMPORT");
+ String16 tmp_str16;
+ String8 tmp_str;
+
+ tmp_str16 = p.readString16();
+ tmp_str = String8(tmp_str16);
+ int ret = 0;
+ ret = mpTv->ChannelImport(tmp_str.string());
+ r->writeInt32(ret);
+ break;
+ }
+ case MISC_GET_PROJECT_INFO: {
+ String16 tmp_str16;
+ project_info_t tmpInfo;
+
+ if (mpTv->Tv_GetProjectInfo(&tmpInfo) < 0) {
+ strcpy(tmpInfo.version, "UNKOWN");
+ strcpy(tmpInfo.panel_type, "UNKOWN");
+ strcpy(tmpInfo.panel_outputmode, "UNKOWN");
+ strcpy(tmpInfo.panel_rev, "UNKOWN");
+ strcpy(tmpInfo.panel_name, "UNKOWN");
+ strcpy(tmpInfo.amp_curve_name, "UNKOWN");
+ }
+
+ r->writeString16(String16(tmpInfo.version));
+ r->writeString16(String16(tmpInfo.panel_type));
+ r->writeString16(String16(tmpInfo.panel_outputmode));
+ r->writeString16(String16(tmpInfo.panel_rev));
+ r->writeString16(String16(tmpInfo.panel_name));
+ r->writeString16(String16(tmpInfo.amp_curve_name));
+ break;
+ }
+ case MISC_GET_PLATFORM_TYPE: {
+ int ret = mpTv->Tv_GetPlatformType();
+ r->writeInt32(ret);
+ break;
+ }
+ //MISC END
+
+ // EXTAR
+ case SET_DEBUG_SERIAL_PORT_ONOFF: {
+ int on_off = p.readInt32();
+ int ret = mpTv->SetDebugSerialOnOff(on_off);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case GET_DEBUG_SERIAL_PORT_ONOFF: {
+ int ret = mpTv->GetDebugSerialOnOff();
+ r->writeInt32(ret);
+ break;
+ }
+ case DELETE_DIR_FILES: {
+ String16 strPath = p.readString16();
+ if (strPath.size() <= 0) {
+ r->writeInt32(-1);
+ break;
+ }
+ String8 strP8 = String8(strPath);
+ int tmp_flag = p.readInt32();
+ int ret = TvMisc_DeleteDirFiles(strP8.string(), tmp_flag);
+ r->writeInt32(ret);
+ break;
+ }
+ case DTV_SUBTITLE_INIT: {
+ int bitmapWidth = p.readInt32();
+ int bitmapHeight = p.readInt32();
+ r->writeInt32(mpTv->initSubtitle(bitmapWidth, bitmapHeight));
+ break;
+ }
+ case DTV_SUBTITLE_LOCK: {
+ r->writeInt32(mpTv->lockSubtitle());
+ break;
+ }
+ case DTV_SUBTITLE_UNLOCK: {
+ r->writeInt32(mpTv->unlockSubtitle());
+ break;
+ }
+ case DTV_GET_SUBTITLE_SWITCH: {
+ r->writeInt32(mpTv->getSubSwitchStatus());
+ break;
+ }
+ case DTV_START_SUBTITLE: {
+ int dmx_id = p.readInt32();
+ int pid = p.readInt32();
+ int page_id = p.readInt32();
+ int anc_page_id = p.readInt32();
+ r->writeInt32(mpTv->startSubtitle(dmx_id, pid, page_id, anc_page_id));
+ break;
+ }
+ case DTV_STOP_SUBTITLE: {
+ r->writeInt32(mpTv->stopSubtitle());
+ break;
+ }
+ case DTV_GET_SUBTITLE_INDEX: {
+ int progId = p.readInt32();
+ CTvProgram prog;
+ CTvProgram::selectByID(progId, prog);
+ r->writeInt32(prog.getSubtitleIndex(progId));
+ break;
+ }
+ case DTV_SET_SUBTITLE_INDEX: {
+ int progId = p.readInt32();
+ int index = p.readInt32();
+ CTvProgram prog;
+ CTvProgram::selectByID(progId, prog);
+ r->writeInt32(prog.setSubtitleIndex(progId, index));
+ break;
+ }
+ case ATV_GET_CURRENT_PROGRAM_ID: {
+ int atvLastProgramId = mpTv->getATVProgramID();
+ r->writeInt32(atvLastProgramId);
+ break;
+ }
+ case DTV_GET_CURRENT_PROGRAM_ID: {
+ int dtvLastProgramId = mpTv->getDTVProgramID();
+ r->writeInt32(dtvLastProgramId);
+ break;
+ }
+ case ATV_SAVE_PROGRAM_ID: {
+ int progID = p.readInt32();
+ int retCnt = 0;
+ mpTv->saveATVProgramID(progID);
+ r->writeInt32(retCnt);
+ break;
+ }
+ case ATV_GET_MIN_MAX_FREQ: {
+ int min, max;
+ int tmpRet = mpTv->getATVMinMaxFreq(&min, &max);
+ r->writeInt32(min);
+ r->writeInt32(max);
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_GET_SCAN_FREQUENCY_LIST: {
+ Vector<sp<CTvChannel> > out;
+ int tmpRet = CTvRegion::getChannelListByName("CHINA,Default DTMB ALL", out);
+ r->writeInt32(out.size());
+ for (int i = 0; i < out.size(); i++) {
+ r->writeInt32(out[i]->getID());
+ r->writeInt32(out[i]->getFrequency());
+ }
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_GET_CHANNEL_INFO: {
+ int dbID = p.readInt32();
+ channel_info_t chan_info;
+ int ret = mpTv->getChannelInfoBydbID(dbID, chan_info);
+ r->writeInt32(chan_info.freq);
+ r->writeInt32(chan_info.uInfo.dtvChanInfo.strength);
+ r->writeInt32(chan_info.uInfo.dtvChanInfo.quality);
+ r->writeInt32(chan_info.uInfo.dtvChanInfo.ber);
+ r->writeInt32(ret);
+ break;
+ }
+ case ATV_GET_CHANNEL_INFO: {
+ int dbID = p.readInt32();
+ channel_info_t chan_info;
+ int ret = mpTv->getChannelInfoBydbID(dbID, chan_info);
+ r->writeInt32(chan_info.freq);
+ r->writeInt32(chan_info.uInfo.atvChanInfo.finefreq);
+ r->writeInt32(chan_info.uInfo.atvChanInfo.videoStd);
+ r->writeInt32(chan_info.uInfo.atvChanInfo.audioStd);
+ r->writeInt32(chan_info.uInfo.atvChanInfo.isAutoStd);
+ r->writeInt32(ret);
+ break;
+ }
+ case ATV_SCAN_MANUAL: {
+ int tmpRet = 0;
+ int startFreq = p.readInt32();
+ int endFreq = p.readInt32();
+ int videoStd = p.readInt32();
+ int audioStd = p.readInt32();
+ tmpRet = mpTv->atvMunualScan(startFreq, endFreq, videoStd, audioStd);
+ mTvService->mpScannerClient = this;
+ r->writeInt32(tmpRet);
+ break;
+ }
+
+
+ case ATV_SCAN_AUTO: {
+ int tmpRet = 0;
+ LOGD("%s, atv auto scan!!!\n", "TV");
+ int videoStd = p.readInt32();
+ int audioStd = p.readInt32();
+ int searchType = p.readInt32();
+ tmpRet = mpTv->atvAutoScan(videoStd, audioStd, searchType);
+ mTvService->mpScannerClient = this;
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_SCAN_MANUAL: {
+ int tmpRet = 0;
+ int freq = p.readInt32();
+ tmpRet = mpTv->dtvManualScan(freq, freq);
+ mTvService->mpScannerClient = this;
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_SCAN_MANUAL_BETWEEN_FREQ: {
+ int tmpRet = 0;
+ int beginFreq = p.readInt32();
+ int endFreq = p.readInt32();
+ int modulation = p.readInt32();
+ tmpRet = mpTv->dtvManualScan(beginFreq, endFreq, modulation);
+ mTvService->mpScannerClient = this;
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_SCAN_AUTO: {
+ int tmpRet = 0;
+ tmpRet = mpTv->dtvAutoScan();
+ mTvService->mpScannerClient = this;
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_SCAN_AUTO_ATSC: {
+ int tmpRet = 0;
+ int attenna = p.readInt32();
+ int vstd = p.readInt32();
+ int astd = p.readInt32();
+ tmpRet = mpTv->dtvAutoScanAtscLock(attenna, vstd, astd);
+ mTvService->mpScannerClient = this;
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case TV_SUBTITLE_DRAW_END: {
+ int tmpRet = 0;
+ //if(pSub)pSub->lock.unlock();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case STOP_PROGRAM_PLAY: {
+ int tmpRet = -1;
+ tmpRet = mpTv->stopPlayingLock();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_TEST_1: {
+ // int progid = p.readInt32();
+ //CTvProgram prog;
+ // int ret = CTvProgram::selectByID(progid, prog);
+ //CTvEvent ev;
+ //ret = ev.getProgPresentEvent(prog.getSrc(), prog.getID(), mpTv->getTvTime(), ev);
+ //r->writeString16(String16(ev.getName()));
+ break;
+ }
+ case DTV_TEST_2: {
+ //int cmd = p.readInt32();
+ //CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml");
+ //r->writeString16(String16("xml"));
+ break;
+ }
+
+ case TV_CLEAR_ALL_PROGRAM: {
+ int tmpRet = 0;
+ int arg0 = p.readInt32();
+
+ tmpRet = mpTv->clearAllProgram(arg0);
+ mTvService->mpScannerClient = this;
+ r->writeInt32(tmpRet);
+ break;
+ }
+
+ case GET_DISPLAY_RESOLUTION_CONFIG: {
+ int tmpRet = 0;
+ tmpRet = mpTv->GetDisplayResolutionConfig();
+ r->writeInt32(tmpRet);
+ break;
+ }
+
+ case GET_DISPLAY_RESOLUTION_INFO: {
+ int tmpRet = 0;
+ tmpRet = mpTv->GetDisplayResolutionInfo();
+ r->writeInt32(tmpRet);
+ break;
+ }
+
+ case HDMIRX_CEC_SEND_CUSTOM_MESSAGE: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ tmp_buf_size = p.readInt32();
+ for (i = 0; i < tmp_buf_size; i++) {
+ tmp_uc_buf[i] = p.readInt32();
+ }
+
+ int tmpRet = 0;
+ tmpRet = mpTv->SendHDMIRxCECCustomMessage(tmp_uc_buf);
+ r->writeInt32(tmpRet);
+ break;
+ }
+
+ case HDMIRX_CEC_SEND_CUSTOM_WAIT_REPLY_MESSAGE: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ int WaitCmd = 0, timeout = 0;
+ tmp_buf_size = p.readInt32();
+ for (i = 0; i < tmp_buf_size; i++) {
+ tmp_uc_buf[i] = p.readInt32();
+ }
+
+ WaitCmd = p.readInt32();
+ timeout = p.readInt32();
+
+ int tmpRet = 0;
+ tmpRet = mpTv->SendHDMIRxCECCustomMessageAndWaitReply(tmp_uc_buf, tmp_uc_buf2, WaitCmd, timeout);
+
+ r->writeInt32(tmpRet);
+ if (tmpRet > 0) {
+ for (i = 0; i < tmpRet; i++) {
+ r->writeInt32(tmp_uc_buf2[i]);
+ }
+ }
+
+ r->writeInt32(tmpRet);
+ break;
+ }
+
+ case HDMIRX_CEC_SEND_BROADCAST_STANDBY_MESSAGE: {
+ int tmpRet = 0;
+ tmpRet = mpTv->SendHDMIRxCECBoradcastStandbyMessage();
+ r->writeInt32(tmpRet);
+ break;
+ }
+
+ case HDMIRX_CEC_SEND_GIVE_CEC_VERSION_MESSAGE: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ int sourceinput = p.readInt32();
+ LOGD("HDMIRX_CEC_SEND_GIVE_CEC_VERSION_MESSAGE: sourceinput = %x", sourceinput);
+ tmp_buf_size = mpTv->SendHDMIRxCECGiveCECVersionMessage((tv_source_input_t)sourceinput, tmp_uc_buf);
+ r->writeInt32(tmp_buf_size);
+ for (i = 0; i < tmp_buf_size; i++) {
+ r->writeInt32(tmp_uc_buf[i]);
+ }
+ r->writeInt32(tmp_buf_size);
+ break;
+ }
+
+ case HDMIRX_CEC_SEND_GIVE_DEV_VENDOR_ID_MESSAGE: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ int sourceinput = p.readInt32();
+ LOGD("HDMIRX_CEC_SEND_GIVE_DEV_VENDOR_ID_MESSAGE: sourceinput = %x", sourceinput);
+ tmp_buf_size = mpTv->SendHDMIRxCECGiveDeviceVendorIDMessage((tv_source_input_t)sourceinput, tmp_uc_buf);
+ r->writeInt32(tmp_buf_size);
+ for (i = 0; i < tmp_buf_size; i++) {
+ r->writeInt32(tmp_uc_buf[i]);
+ }
+ r->writeInt32(tmp_buf_size);
+ break;
+ }
+
+ case HDMIRX_CEC_SEND_GIVE_OSD_NAME_MESSAGE: {
+ int i = 0, tmp_buf_size = 0, ret = 0;
+ int sourceinput = p.readInt32();
+ LOGD("HDMIRX_CEC_SEND_GIVE_OSD_NAME_MESSAGE: sourceinput = %x", sourceinput);
+ tmp_buf_size = mpTv->SendHDMIRxCECGiveOSDNameMessage((tv_source_input_t)sourceinput, tmp_uc_buf);
+ r->writeInt32(tmp_buf_size);
+ for (i = 0; i < tmp_buf_size; i++) {
+ r->writeInt32(tmp_uc_buf[i]);
+ }
+ r->writeInt32(tmp_buf_size);
+ break;
+ }
+
+ case GET_HDMI_KSV_INFO: {
+ int tmpRet = 0;
+ int ksv_data[2] = {0, 0};
+ tmpRet = mpTv->GetHdmiHdcpKeyKsvInfo(ksv_data);
+ r->writeInt32(tmpRet);
+ r->writeInt32(ksv_data[0]);
+ r->writeInt32(ksv_data[1]);
+ break;
+ }
+
+ case HDMI_OUT_TOWHAT: {
+ int tmpRet = mpTv->hdmi_out_towhat();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case FACTORY_FBC_UPGRADE: {
+ String16 tmpName = p.readString16();
+ String8 strName = String8(tmpName);
+ sprintf((char *)tmp_uc_buf, "%s", strName.string());
+ int mode = p.readInt32();
+ int upgrade_blk_size = p.readInt32();
+ int ret = mpTv->StartUpgradeFBC((char *)tmp_uc_buf, mode, upgrade_blk_size);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_BRIGHTNESS: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Brightness(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_BRIGHTNESS: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Brightness();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_CONTRAST: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Contrast(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_CONTRAST: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Contrast();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_SATURATION: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Saturation(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_SATURATION: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Saturation();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_HUE: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_HueColorTint(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_HUE: {
+ int ret = mpTv->Tv_FactoryGet_FBC_HueColorTint();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_BACKLIGHT: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Backlight(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_BACKLIGHT: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Backlight();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTROY_FBC_SET_LIGHT_SENSOR_STATUS_N310: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_LightSensor_Status_N310(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTROY_FBC_GET_LIGHT_SENSOR_STATUS_N310: {
+ int ret = mpTv->Tv_FactoryGet_FBC_LightSensor_Status_N310();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTROY_FBC_SET_DREAM_PANEL_STATUS_N310: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Dream_Panel_Status_N310(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTROY_FBC_GET_DREAM_PANEL_STATUS_N310: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Dream_Panel_Status_N310();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTROY_FBC_SET_MULT_PQ_STATUS_N310: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_MULT_PQ_Status_N310(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTROY_FBC_GET_MULT_PQ_STATUS_N310: {
+ int ret = mpTv->Tv_FactoryGet_FBC_MULT_PQ_Status_N310();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTROY_FBC_SET_MEMC_STATUS_N310: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_MEMC_Status_N310(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTROY_FBC_GET_MEMC_STATUS_N310: {
+ int ret = mpTv->Tv_FactoryGet_FBC_MEMC_Status_N310();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case MISC_SET_2K_TO_4K_SCALE_UP_MODE : {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_Set2k4k_ScalerUp_Mode(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case MISC_GET_2K_TO_4K_SCALE_UP_MODE: {
+ int ret = mpTv->Tv_Get2k4k_ScalerUp_Mode();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_FBC_SET_BACKLIGHT_EN : {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_backlight_onoff(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_BACKLIGHT_EN: {
+ int ret = mpTv->Tv_FactoryGet_FBC_backlight_onoff();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_FBC_TEST_PATTERN: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_SetTestPattern(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_FBC_SET_LVDS_SSG: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_LVDS_SSG_Set(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_ELEC_MODE: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_ELEC_MODE(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_ELEC_MODE: {
+ int ret = mpTv->Tv_FactoryGet_FBC_ELEC_MODE();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_BACKLIGHT_N360: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_BACKLIGHT_N360(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_BACKLIGHT_N360: {
+ int ret = mpTv->Tv_FactoryGet_FBC_BACKLIGHT_N360();
+ r->writeInt32(ret);
+ break;
+ }
+
+
+ case FACTORY_FBC_SET_PIC_MODE: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Picture_Mode(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_PIC_MODE: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Picture_Mode();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_TEST_PATTERN: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Set_Test_Pattern(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_TEST_PATTERN: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Get_Test_Pattern();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_GAIN_RED: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Gain_Red(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_GAIN_RED: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Gain_Red();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_GAIN_GREEN: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Gain_Green(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_GAIN_GREEN: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Gain_Green();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_GAIN_BLUE: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Gain_Blue(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_GAIN_BLUE: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Gain_Blue();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_OFFSET_RED: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Offset_Red(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_OFFSET_RED: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Offset_Red();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_OFFSET_GREEN: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Offset_Green(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_OFFSET_GREEN: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Offset_Green();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_OFFSET_BLUE: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_Offset_Blue(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_OFFSET_BLUE: {
+ int ret = mpTv->Tv_FactoryGet_FBC_Offset_Blue();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_COLORTEMP_MODE: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_ColorTemp_Mode(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_COLORTEMP_MODE: {
+ int ret = mpTv->Tv_FactoryGet_FBC_ColorTemp_Mode();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_COLORTEMP_MODE_N360: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_ColorTemp_Mode_N360(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_COLORTEMP_MODE_N360: {
+ int ret = mpTv->Tv_FactoryGet_FBC_ColorTemp_Mode_N360();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_SET_WB_INIT: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySet_FBC_WB_Initial(value);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_WB_INIT: {
+ int ret = mpTv->Tv_FactoryGet_FBC_WB_Initial();
+ r->writeInt32(ret);
+ break;
+ }
+
+ case FACTORY_FBC_GET_MAINCODE_VERSION: {
+ char sw_version[64];
+ char build_time[64];
+ char git_version[64];
+ char git_branch[64];
+ char build_name[64];
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_FBC_MAINCODE_Version(COMM_DEV_SERIAL, sw_version, build_time, git_version, git_branch, build_name);
+ r->writeString16(String16(sw_version));
+ r->writeString16(String16(build_time));
+ r->writeString16(String16(git_version));
+ r->writeString16(String16(git_branch));
+ r->writeString16(String16(build_name));
+ } else {
+ r->writeString16(String16("No FBC"));
+ r->writeString16(String16("No FBC"));
+ r->writeString16(String16("No FBC"));
+ r->writeString16(String16("No FBC"));
+ r->writeString16(String16("No FBC"));
+ }
+ break;
+ }
+ case FACTORY_SET_SN: {
+ char StrFactSN[256] = {0};
+ String16 strTemFactorySn = p.readString16();
+ String8 strFactorySn = String8(strTemFactorySn);
+ sprintf((char *)StrFactSN, "%s", strFactorySn.string());
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ int iRet = fbcIns->cfbc_Set_FBC_Factory_SN(COMM_DEV_SERIAL, (const char *)StrFactSN);
+ r->writeInt32(iRet);
+ } else {
+ r->writeInt32(-1);
+ }
+ break;
+ }
+ case FACTORY_GET_SN: {
+ char factorySerialNumber[256] = {0};
+ memset((void *)factorySerialNumber, 0, 256);
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_FBC_Factory_SN(COMM_DEV_SERIAL, factorySerialNumber);
+ r->writeString16(String16(factorySerialNumber));
+ } else {
+ r->writeString16(String16("No FBC"));
+ }
+ break;
+ }
+ case FACTORY_FBC_PANEL_GET_INFO: {
+ char panel_model[64];
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_SERIAL, panel_model);
+ r->writeString16(String16(panel_model));
+ } else {
+ r->writeString16(String16(""));
+ }
+ break;
+ }
+ case FACTORY_FBC_PANEL_POWER_SWITCH: {
+ int value = p.readInt32();
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ int ret = fbcIns->cfbc_Set_FBC_panel_power_switch(COMM_DEV_SERIAL, value);
+ r->writeInt32(ret);
+ } else {
+ r->writeInt32(-1);
+ }
+ break;
+ }
+ case FACTORY_FBC_PANEL_SUSPEND: {
+ int value = p.readInt32();
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ int ret = fbcIns->cfbc_Set_FBC_suspend(COMM_DEV_SERIAL, value);
+ r->writeInt32(ret);
+ } else {
+ r->writeInt32(-1);
+ }
+ break;
+ }
+ case FACTORY_FBC_PANEL_USER_SETTING_DEFAULT: {
+ int value = p.readInt32();
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ int ret = fbcIns->cfbc_Set_FBC_User_Setting_Default(COMM_DEV_SERIAL, value);
+ r->writeInt32(ret);
+ } else {
+ r->writeInt32(-1);
+ }
+ break;
+ }
+ case FACTORY_FBC_VIDEO_MUTE: {
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ int ret = fbcIns->cfbc_Set_VMute(COMM_DEV_SERIAL, 1);
+ r->writeInt32(ret);
+ } else {
+ r->writeInt32(-1);
+ }
+ break;
+ }
+ case FACTORY_FBC_POWER_REBOOT: {
+ int value = p.readInt32();
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ int ret = fbcIns->cfbc_SendRebootToUpgradeCmd(COMM_DEV_SERIAL, value);
+ r->writeInt32(ret);
+ } else {
+ r->writeInt32(-1);
+ }
+ break;
+ }
+ case FACTORY_FBC_SEND_KEY_TO_FBC: {
+ int keyCode = p.readInt32();
+ int param = p.readInt32();
+ CFbcCommunication *fbcIns = GetSingletonFBC();
+ if (fbcIns != NULL) {
+ int ret = fbcIns->cfbc_FBC_Send_Key_To_Fbc(COMM_DEV_SERIAL, keyCode, param);
+ r->writeInt32(ret);
+ } else {
+ r->writeInt32(-1);
+ }
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_SET_GAIN_RED: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySetWhiteBalanceRedGain(source_type, colortemp_mode, value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_GET_GAIN_RED: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetWhiteBalanceRedGain(source_type, colortemp_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_SET_GAIN_GREEN: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySetWhiteBalanceGreenGain(source_type, colortemp_mode, value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_GET_GAIN_GREEN: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetWhiteBalanceGreenGain(source_type, colortemp_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_SET_GAIN_BLUE: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySetWhiteBalanceBlueGain(source_type, colortemp_mode, value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_GET_GAIN_BLUE: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetWhiteBalanceBlueGain(source_type, colortemp_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_SET_OFFSET_RED: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySetWhiteBalanceRedOffset(source_type, colortemp_mode, value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_GET_OFFSET_RED: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetWhiteBalanceRedOffset(source_type, colortemp_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_SET_OFFSET_GREEN: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySetWhiteBalanceGreenOffset(source_type, colortemp_mode, value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_GET_OFFSET_GREEN: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetWhiteBalanceGreenOffset(source_type, colortemp_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_SET_OFFSET_BLUE: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySetWhiteBalanceBlueOffset(source_type, colortemp_mode, value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_GET_OFFSET_BLUE: {
+ int source_type = p.readInt32();
+ int colortemp_mode = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetWhiteBalanceBlueOffset(source_type, colortemp_mode);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_GET_COLOR_TMP: {
+ int source_type = p.readInt32();
+ int ret = mpTv->Tv_FactoryGetWhiteBalanceColorTempMode(source_type);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_SET_COLOR_TMP: {
+ int source_type = p.readInt32();
+ int Tempmode = p.readInt32();
+ int is_save = p.readInt32();
+ int ret = mpTv->Tv_FactorySetWhiteBalanceColorTempMode(source_type, Tempmode, is_save);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_SAVE_PRAMAS: {
+ int source_type = p.readInt32();
+ int mode = p.readInt32();
+ int r_gain = p.readInt32();
+ int g_gain = p.readInt32();
+ int b_gain = p.readInt32();
+ int r_offset = p.readInt32();
+ int g_offset = p.readInt32();
+ int b_offset = p.readInt32();
+ int ret = mpTv->Tv_FactorySaveWhiteBalancePramas(source_type, mode, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_OPEN_GRAY_PATTERN: {
+ int ret = mpTv->Tv_FactoryOpenWhiteBalanceGrayPattern();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_CLOSE_GRAY_PATTERN: {
+ int ret = mpTv->Tv_FactoryCloseWhiteBalanceGrayPattern();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_SET_GRAY_PATTERN: {
+ int value = p.readInt32();
+ int ret = mpTv->Tv_FactorySetWhiteBalanceGrayPattern(value);
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_GET_GRAY_PATTERN: {
+ int ret = mpTv->Tv_FactoryGetWhiteBalanceGrayPattern();
+ r->writeInt32(ret);
+ break;
+ }
+ case FACTORY_WHITE_BALANCE_GET_ALL_PRAMAS: {
+ int Tempmode = p.readInt32();
+ tcon_rgb_ogo_t params;
+ int ret = mpTv->GetColorTemperatureParams((vpp_color_temperature_mode_t)Tempmode, &params);
+ r->writeInt32(ret);
+ r->writeInt32(params.r_gain);
+ r->writeInt32(params.g_gain);
+ r->writeInt32(params.b_gain);
+ r->writeInt32(params.r_post_offset);
+ r->writeInt32(params.g_post_offset);
+ r->writeInt32(params.b_post_offset);
+ }
+ case STOP_SCAN: {
+ mpTv->stopScanLock();
+ break;
+ }
+ case DTV_GET_SNR: {
+ int tmpRet = 0;
+ tmpRet = mpTv->getFrontendSNR();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_GET_BER: {
+ int tmpRet = 0;
+ tmpRet = mpTv->getFrontendBER();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_GET_STRENGTH: {
+ int tmpRet = 0;
+ tmpRet = mpTv->getFrontendSignalStrength();
+ r->writeInt32(tmpRet);
+ break;
+ }
+ case DTV_GET_AUDIO_TRACK_NUM: {
+ int programId = p.readInt32();
+ int retCnt = 0;
+ retCnt = mpTv->getAudioTrackNum(programId);
+ r->writeInt32(retCnt);
+ break;
+ }
+ case DTV_GET_AUDIO_TRACK_INFO: {
+ int progId = p.readInt32();
+ int aIdx = p.readInt32();
+ int aFmt = -1;
+ int iRet = -1;
+ String8 lang;
+ iRet = mpTv->getAudioInfoByIndex(progId, aIdx, &aFmt, lang);
+ r->writeInt32(aFmt);
+ r->writeString16(String16(lang));
+ break;
+ }
+ case DTV_SWITCH_AUDIO_TRACK: {
+ int aPid = p.readInt32();
+ int aFmt = p.readInt32();
+ int aParam = p.readInt32();
+ int ret = -1;
+ ret = mpTv->switchAudioTrack(aPid, aFmt, aParam);
+ r->writeInt32(ret);
+ break;
+ }
+ case DTV_GET_CURR_AUDIO_TRACK_INDEX: {
+ int currAduIdx = -1;
+ int progId = p.readInt32();
+ CTvProgram prog;
+ CTvProgram::selectByID(progId, prog);
+ currAduIdx = prog.getCurrAudioTrackIndex();
+ r->writeInt32(currAduIdx);
+ break;
+ }
+ case DTV_SET_AUDIO_CHANNEL_MOD: {
+ int audioChannelIdx = p.readInt32();
+ mpTv->setAudioChannel(audioChannelIdx);
+ break;
+ }
+ case DTV_GET_AUDIO_CHANNEL_MOD: {
+ int currChannelMod;
+ currChannelMod = mpTv->getAudioChannel();
+ r->writeInt32(currChannelMod);
+ break;
+ }
+ case DTV_GET_CUR_FREQ: {
+ int progId = p.readInt32();
+ int freq = 0;
+ int iRet = -1;
+ CTvProgram prog;
+ CTvChannel channel;
+
+ iRet = CTvProgram::selectByID(progId, prog);
+ if (0 != iRet) return -1;
+ prog.getChannel(channel);
+ freq = channel.getFrequency();
+ r->writeInt32(freq);
+ break;
+ }
+ case DTV_GET_EPG_UTC_TIME: {
+ int iRet = -1;
+ int utcTime = 0;
+
+ utcTime = mpTv->getTvTime();
+
+ r->writeInt32(utcTime);
+ break;
+ }
+ case DTV_GET_EPG_INFO_POINT_IN_TIME: {
+ int progid = p.readInt32();
+ int utcTime = p.readInt32();
+ CTvProgram prog;
+ int ret = CTvProgram::selectByID(progid, prog);
+ CTvEvent ev;
+ ret = ev.getProgPresentEvent(prog.getSrc(), prog.getID(), utcTime, ev);
+ r->writeString16(String16(ev.getName()));
+ r->writeString16(String16(ev.getDescription()));
+ r->writeString16(String16(ev.getExtDescription()));
+ r->writeInt32(ev.getStartTime());
+ r->writeInt32(ev.getEndTime());
+ r->writeInt32(ev.getSubFlag());
+ r->writeInt32(ev.getEventId());
+ break;
+ }
+ case DTV_GET_EPG_INFO_DURATION: {
+ int iRet = -1;
+ int iObOutSize = 0;
+ Vector<sp<CTvEvent> > epgOut;
+ int progid = p.readInt32();
+ int iUtcStartTime = p.readInt32();
+ int iDurationTime = p.readInt32();
+ CTvProgram prog;
+ CTvEvent ev;
+ iRet = CTvProgram::selectByID(progid, prog);
+ if (0 != iRet) {
+ break;
+ }
+ iRet = ev.getProgScheduleEvents(prog.getSrc(), prog.getID(), iUtcStartTime, iDurationTime, epgOut);
+ if (0 != iRet) {
+ break;
+ }
+ iObOutSize = epgOut.size();
+ if (0 == iObOutSize) {
+ break;
+ }
+
+ r->writeInt32(iObOutSize);
+ for (int i = 0; i < iObOutSize; i ++) {
+ r->writeString16(String16(epgOut[i]->getName()));
+ r->writeString16(String16(epgOut[i]->getDescription()));
+ r->writeString16(String16(ev.getExtDescription()));
+ r->writeInt32(epgOut[i]->getStartTime());
+ r->writeInt32(epgOut[i]->getEndTime());
+ r->writeInt32(epgOut[i]->getSubFlag());
+ r->writeInt32(epgOut[i]->getEventId());
+ }
+ break;
+ }
+ case DTV_SET_PROGRAM_NAME: {
+ CTvProgram prog;
+ int progid = p.readInt32();
+ String16 tmpName = p.readString16();
+ String8 strName = String8(tmpName);
+ prog.updateProgramName(progid, strName);
+ break;
+ }
+ case DTV_SET_PROGRAM_SKIPPED: {
+ CTvProgram prog;
+ int progid = p.readInt32();
+ bool bSkipFlag = p.readInt32();
+ prog.setSkipFlag(progid, bSkipFlag);
+ break;
+ }
+ case DTV_SET_PROGRAM_FAVORITE: {
+ CTvProgram prog;
+ int progid = p.readInt32();
+ bool bFavorite = p.readInt32();
+ prog.setFavoriteFlag(progid, bFavorite);
+ break;
+ }
+ case DTV_DETELE_PROGRAM: {
+ CTvProgram prog;
+ int progid = p.readInt32();
+ prog.deleteProgram(progid);
+ break;
+ }
+ case SET_BLACKOUT_ENABLE: {
+ int enable = p.readInt32();
+ mpTv->setBlackoutEnable(enable);
+ break;
+ }
+ case START_AUTO_BACKLIGHT: {
+ mpTv->startAutoBackLight();
+ break;
+ }
+ case STOP_AUTO_BACKLIGHT: {
+ mpTv->stopAutoBackLight();
+ break;
+ }
+ case IS_AUTO_BACKLIGHTING: {
+ int on = mpTv->getAutoBackLight_on_off();
+ r->writeInt32(on);
+ break;
+ }
+ case GET_AVERAGE_LUMA: {
+ int ret = mpTv->getAverageLuma();
+ r->writeInt32(ret);
+ break;
+ }
+ case GET_AUTO_BACKLIGHT_DATA: {
+ int i;
+ int size = mpTv->getAutoBacklightData(tmp_i_buf);
+ r->writeInt32(size);
+ for (i = 0; i < size; i++) {
+ r->writeInt32(tmp_i_buf[i]);
+ }
+ break;
+ }
+ case SET_AUTO_BACKLIGHT_DATA: {
+ String16 tmp_str16;
+ String8 value_str;
+
+ tmp_str16 = p.readString16();
+ value_str = String8(tmp_str16);
+
+ int ret = mpTv->setAutobacklightData(value_str);
+ r->writeInt32(ret);
+ break;
+ }
+
+ case SSM_READ_BLACKOUT_ENABLE: {
+ int enable = mpTv->getSaveBlackoutEnable();
+ r->writeInt32(enable);
+ break;
+ }
+ case DTV_SWAP_PROGRAM: {
+ CTvProgram prog;
+ int firstProgId = p.readInt32();
+ int secondProgId = p.readInt32();
+ CTvProgram::selectByID(firstProgId, prog);
+ int firstChanOrderNum = prog.getChanOrderNum();
+ CTvProgram::selectByID(secondProgId, prog);
+ int secondChanOrderNum = prog.getChanOrderNum();
+ prog.swapChanOrder(firstProgId, firstChanOrderNum, secondProgId, secondChanOrderNum);
+ break;
+ }
+ case DTV_SET_PROGRAM_LOCKED: {
+ CTvProgram prog;
+ int progid = p.readInt32();
+ bool bLocked = p.readInt32();
+ prog.setLockFlag(progid, bLocked);
+ break;
+ }
+ case DTV_SET_BOOKING_FLAG: {
+ CTvEvent ev;
+ int iEvtId = p.readInt32();
+ bool iBookFlag = (bool)p.readInt32();
+ ev.bookEvent(iEvtId, iBookFlag);
+ break;
+ }
+ case DTV_GET_FREQ_BY_PROG_ID: {
+ int freq = 0;
+ int progid = p.readInt32();
+ CTvProgram prog;
+ int ret = CTvProgram::selectByID(progid, prog);
+ if (ret != 0) return -1;
+ CTvChannel channel;
+ prog.getChannel(channel);
+ freq = channel.getFrequency();
+ r->writeInt32(freq);
+ break;
+ }
+ case DTV_GET_BOOKED_EVENT: {
+ CTvBooking tvBook;
+ Vector<sp<CTvBooking> > vTvBookOut;
+ tvBook.getBookedEventList(vTvBookOut);
+ int iObOutSize = vTvBookOut.size();
+ if (0 == iObOutSize) {
+ break;
+ }
+ r->writeInt32(iObOutSize);
+ for (int i = 0; i < iObOutSize; i ++) {
+ r->writeString16(String16(vTvBookOut[i]->getProgName()));
+ r->writeString16(String16(vTvBookOut[i]->getEvtName()));
+ r->writeInt32(vTvBookOut[i]->getStartTime());
+ r->writeInt32(vTvBookOut[i]->getDurationTime());
+ r->writeInt32(vTvBookOut[i]->getBookId());
+ r->writeInt32(vTvBookOut[i]->getProgramId());
+ r->writeInt32(vTvBookOut[i]->getEventId());
+ }
+ break;
+ }
+ case SET_FRONTEND_PARA: {
+ int ret = -1;
+ frontend_para_set_t feParms;
+ feParms.mode = (fe_type_t)p.readInt32();
+ feParms.freq = p.readInt32();
+ feParms.videoStd = (atv_video_std_t)p.readInt32();
+ feParms.audioStd = (atv_audio_std_t)p.readInt32();
+ feParms.para1 = p.readInt32();
+ feParms.para2 = p.readInt32();
+ mpTv->resetFrontEndPara(feParms);
+ r->writeInt32(ret);
+ break;
+ }
+ case PLAY_PROGRAM: {
+ int mode = p.readInt32();
+ int freq = p.readInt32();
+ if (mode == FE_ANALOG) {
+ int videoStd = p.readInt32();
+ int audioStd = p.readInt32();
+ int fineTune = p.readInt32();
+ int audioCompetation = p.readInt32();
+ mpTv->playAtvProgram(freq, videoStd, audioStd, fineTune, audioCompetation);
+ } else {
+ int para1 = p.readInt32();
+ int para2 = p.readInt32();
+ int vid = p.readInt32();
+ int vfmt = p.readInt32();
+ int aid = p.readInt32();
+ int afmt = p.readInt32();
+ int pcr = p.readInt32();
+ int audioCompetation = p.readInt32();
+ mpTv->playDtvProgram(mode, freq, para1, para2, vid, vfmt, aid, afmt, pcr, audioCompetation);
+ }
+ break;
+ }
+ case GET_PROGRAM_LIST: {
+ Vector<sp<CTvProgram> > out;
+ int type = p.readInt32();
+ int skip = p.readInt32();
+ CTvProgram::selectByType(type, skip, out);
+ r->writeInt32(out.size());
+ for (int i = 0; i < out.size(); i++) {
+ r->writeInt32(out[i]->getID());
+ r->writeInt32(out[i]->getChanOrderNum());
+ r->writeInt32(out[i]->getMajor());
+ r->writeInt32(out[i]->getMinor());
+ r->writeInt32(out[i]->getProgType());
+ r->writeString16(String16(out[i]->getName()));
+ r->writeInt32(out[i]->getProgSkipFlag());
+ r->writeInt32(out[i]->getFavoriteFlag());
+ r->writeInt32(out[i]->getVideo()->getFormat());
+ CTvChannel ch;
+ out[i]->getChannel(ch);
+ r->writeInt32(ch.getDVBTSID());
+ r->writeInt32(out[i]->getServiceId());
+ r->writeInt32(out[i]->getVideo()->getPID());
+ r->writeInt32(out[i]->getVideo()->getPID());
+
+ int audioTrackSize = out[i]->getAudioTrackSize();
+ r->writeInt32(audioTrackSize);
+ for (int j = 0; j < audioTrackSize; j++) {
+ r->writeString16(String16(out[i]->getAudio(j)->getLang()));
+ r->writeInt32(out[i]->getAudio(j)->getFormat());
+ r->writeInt32(out[i]->getAudio(j)->getPID());
+ }
+ Vector<CTvProgram::Subtitle *> mvSubtitles = out[i]->getSubtitles();
+ int subTitleSize = mvSubtitles.size();
+ r->writeInt32(subTitleSize);
+ if (subTitleSize > 0) {
+ for (int k = 0; k < subTitleSize; k++) {
+ r->writeInt32(mvSubtitles[k]->getPID());
+ r->writeString16(String16(mvSubtitles[k]->getLang()));
+ r->writeInt32(mvSubtitles[k]->getCompositionPageID());
+ r->writeInt32(mvSubtitles[k]->getAncillaryPageID());
+ }
+ }
+ r->writeInt32(ch.getFrequency());
+ }
+ break;
+ }
+ case DTV_GET_VIDEO_FMT_INFO: {
+ int srcWidth = 0;
+ int srcHeight = 0;
+ int srcFps = 0;
+ int srcInterlace = 0;
+ int iRet = -1;
+
+ iRet == mpTv->getVideoFormatInfo(&srcWidth, &srcHeight, &srcFps, &srcInterlace);
+ r->writeInt32(srcWidth);
+ r->writeInt32(srcHeight);
+ r->writeInt32(srcFps);
+ r->writeInt32(srcInterlace);
+ r->writeInt32(iRet);
+ }
+ break;
+
+ case DTV_START_RECORD: {
+ char buf[256];
+ String16 tmpName = p.readString16();
+ String8 strName = String8(tmpName);
+ sprintf(buf, "%s", strName.string());
+ mpTv->SetRecordFileName(buf);
+ mpTv->StartToRecord();
+ }
+ break;
+ case DTV_STOP_RECORD:
+ mpTv->StopRecording();
+ break;
+ case DTV_SET_RECORD_ALL_TS: {
+ int sel = p.readInt32();
+ mpTv->SetRecCurTsOrCurProgram(sel);
+ }
+ break;
+ case TV_PRINT_DEBUG_INFO:
+ mpTv->printDebugInfo();
+ break;
+ case HDMIAV_HOTPLUGDETECT_ONOFF: {
+ int flag = mpTv->GetHdmiAvHotplugDetectOnoff();
+ r->writeInt32(flag);
+ }
+ break;
+
+ // 2.4G headset
+ case START_OPEN_HEADSET_DETECT: {
+ int flag = mpTv->StartHeadSetDetect();
+ r->writeInt32(flag);
+ }
+ break;
+
+ // EXTAR END
+ default:
+ LOGD("default");
+ break;
+ }
+
+ LOGD("exit client=%d cmd=%d", getCallingPid(), cmd);
+ return 0;
+}
+
+sp<TvService::Client> TvService::Client::getClientFromCookie(void *user)
+{
+ sp<Client> client = 0;
+ /*
+ TvService *service = static_cast<TvService*> (user);
+ if (service != NULL) {
+ Mutex::Autolock ourLock(service->mServiceLock);
+ if (service->mClient != 0) {
+ client = service->mClient.promote();
+ if (client == 0) {
+ LOGE("getClientFromCookie: client appears to have died");
+ service->mClient.clear();
+ }
+ } else {
+ LOGE("getClientFromCookie: got callback but client was NULL");
+ }
+ }*/
+ return client;
+}
+
+void TvService::Client::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2, void *user)
+{
+ LOGD("notifyCallback(%d)", msgType);
+
+ sp<Client> client = getClientFromCookie(user);
+ if (client == 0) {
+ return;
+ }
+
+ switch (msgType) {
+ //case TV_MSG_SHUTTER:
+ // ext1 is the dimension of the yuv picture.
+ // client->handleShutter((image_rect_type *)ext1);
+ // break;
+ default:
+ sp<ITvClient> c = client->mTvClient;
+ if (c != NULL) {
+ //c->notifyCallback(msgType, ext1, ext2);
+ }
+ break;
+ }
+
+#if DEBUG_CLIENT_REFERENCES
+ if (client->getStrongCount() == 1) {
+ LOGE("++++++++++++++++ (NOTIFY CALLBACK) THIS WILL CAUSE A LOCKUP!");
+ client->printRefs();
+ }
+#endif
+}
+
+int TvService::Client::notifyCallback(const int &msgtype, const Parcel &p)
+{
+ mTvClient->notifyCallback(msgtype, p);
+ return 0;
+}
+
+status_t TvService::onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags)
+{
+ // permission checks...
+ switch (code) {
+ case BnTvService::CONNECT:
+ IPCThreadState *ipc = IPCThreadState::self();
+ const int pid = ipc->getCallingPid();
+ const int self_pid = getpid();
+ if (pid != self_pid) {
+ // we're called from a different process, do the real check
+ /*if (!checkCallingPermission(
+ String16("android.permission.TV")))
+ {
+ const int uid = ipc->getCallingUid();
+ LOGE("Permission Denial: "
+ "can't use the tv pid=%d, uid=%d", pid, uid);
+ return PERMISSION_DENIED;
+ }*/
+ }
+ break;
+ }
+
+ status_t err = BnTvService::onTransact(code, data, reply, flags);
+
+#if DEBUG_HEAP_LEAKS
+ LOGE("+++ onTransact err %d code %d", err, code);
+
+ if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
+ LOGE("+++ onTransact code %d", code);
+
+ CHECK_INTERFACE(ITvService, data, reply);
+
+ switch (code) {
+ case 1000: {
+ if (gWeakHeap != 0) {
+ sp<IMemoryHeap> h = gWeakHeap.promote();
+ IMemoryHeap *p = gWeakHeap.unsafe_get();
+ LOGE("CHECKING WEAK REFERENCE %p (%p)", h.get(), p);
+ if (h != 0)
+ h->printRefs();
+ bool attempt_to_delete = data.readInt32() == 1;
+ if (attempt_to_delete) {
+ // NOT SAFE!
+ LOGE("DELETING WEAK REFERENCE %p (%p)", h.get(), p);
+ if (p) delete p;
+ }
+ return NO_ERROR;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+#endif // DEBUG_HEAP_LEAKS
+ return err;
+}
+
diff --git a/tvapi/android/tvserver/TvService.h b/tvapi/android/tvserver/TvService.h
index 3345ccf..5356d49 100644
--- a/tvapi/android/tvserver/TvService.h
+++ b/tvapi/android/tvserver/TvService.h
@@ -1,81 +1,89 @@
-#ifndef ANDROID_SERVERS_TV_TVSERVICE_H
-#define ANDROID_SERVERS_TV_TVSERVICE_H
-
-#include <include/ITvService.h>
-#include <include/Tv.h>
-#include <utils/threads.h>
-#include <utils/Vector.h>
-#include <stdint.h>
-#include <tv/CTv.h>
-#include "tv/CTvScreenCapture.h"
-
-using namespace android;
-
-#define DEBUG_HEAP_LEAKS 0
-#define RESOURCE_NUMS 5
-
-class TvService: public BnTvService , public CTv::TvIObserver, public CTvScreenCapture::TvIObserver {
-public:
- class Client: public BnTv {
- public:
- Client(const sp<TvService> &tvService, const sp<ITvClient> &tvClient, pid_t clientPid, CTv *pTv);
- Client();
- virtual ~Client();
- virtual void disconnect();
- virtual status_t connect(const sp<ITvClient> &client);
- virtual status_t lock();
- virtual status_t unlock();
- virtual status_t processCmd(const Parcel &p, Parcel *r);
- virtual status_t createSubtitle(const sp<IMemory> &share_mem);
- virtual status_t createVideoFrame(const sp<IMemory> &share_mem);
-
- // our client...
- const sp<ITvClient> &getTvClient() const
- {
- return mTvClient;
- }
-
- int notifyCallback(const int &msgtype, const Parcel &p);
- String16 mStrName;
- static void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2, void *user);
- private:
- friend class CTv;
- friend class TvService;
- status_t checkPid();
- static sp<Client> getClientFromCookie(void *user);
-
- mutable Mutex mLock;
- mutable Condition mReady;
- sp<TvService> mTvService;
- sp<ITvClient> mTvClient;
- pid_t mClientPid;
- int mGetNotifyFlag;
- int mCurProgIndex;
- CTv *mpTv;
- bool mIsStartTv;
- };//end client
-
- virtual sp<ITv> connect(const sp<ITvClient> &tvClient);
-
- virtual void onTvEvent(const CTvEv &ev);
- void removeClient(const sp<ITvClient> &tvClient);
-
- Client *mpStartTvClient;
- wp<Client> mpScannerClient;
- static void instantiate(CTv *pTv);
- Vector< wp<Client> > m_v_Clients;
-
-private:
- TvService(CTv *pTv);
- virtual ~TvService();
- virtual status_t onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags);
- volatile int32_t mUsers;
- virtual void incUsers();
- virtual void decUsers();
- mutable Mutex mServiceLock;
- CTv *mpTv;
- CTvScreenCapture mCapVidFrame;
-
-};
-
-#endif
+#ifndef ANDROID_SERVERS_TV_TVSERVICE_H
+#define ANDROID_SERVERS_TV_TVSERVICE_H
+
+#include <include/ITvService.h>
+#include <include/Tv.h>
+#include <utils/threads.h>
+#include <utils/Vector.h>
+#include <stdint.h>
+#include <tv/CTv.h>
+#include "tv/CTvScreenCapture.h"
+
+using namespace android;
+
+#define DEBUG_HEAP_LEAKS 0
+#define RESOURCE_NUMS 5
+
+class TvService: public BnTvService , public CTv::TvIObserver, public CTvScreenCapture::TvIObserver {
+public:
+ class Client: public BnTv {
+ public:
+ Client(const sp<TvService> &tvService, const sp<ITvClient> &tvClient, pid_t clientPid, CTv *pTv);
+ Client();
+ virtual ~Client();
+ virtual void disconnect();
+ virtual status_t connect(const sp<ITvClient> &client);
+ virtual status_t lock();
+ virtual status_t unlock();
+ virtual status_t processCmd(const Parcel &p, Parcel *r);
+ virtual status_t createSubtitle(const sp<IMemory> &share_mem);
+ virtual status_t createVideoFrame(const sp<IMemory> &share_mem, int iSourceMode, int iCapVideoLayerOnly);
+
+ // our client...
+ const sp<ITvClient> &getTvClient() const
+ {
+ return mTvClient;
+ }
+
+ int notifyCallback(const int &msgtype, const Parcel &p);
+ String16 mStrName;
+ static void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2, void *user);
+ private:
+ friend class CTv;
+ friend class TvService;
+ status_t checkPid();
+ static sp<Client> getClientFromCookie(void *user);
+
+ mutable Mutex mLock;
+ mutable Condition mReady;
+ sp<TvService> mTvService;
+ sp<ITvClient> mTvClient;
+ pid_t mClientPid;
+ int mGetNotifyFlag;
+ int mCurProgIndex;
+ CTv *mpTv;
+ bool mIsStartTv;
+ sp<IMemory> mSubBmpBuf;
+ };//end client
+
+ static void instantiate();
+ static TvService* mTvService;
+ static TvService* getIntance() {
+ if (mTvService == NULL)
+ mTvService = new TvService();
+ return mTvService;
+ }
+ virtual sp<ITv> connect(const sp<ITvClient> &tvClient);
+
+ virtual void onTvEvent(const CTvEv &ev);
+ void removeClient(const sp<ITvClient> &tvClient);
+
+ Client *mpStartTvClient;
+ wp<Client> mpScannerClient;
+ wp<Client> mpSubClient;
+ Vector< wp<Client> > m_v_Clients;
+
+private:
+ TvService();
+ virtual ~TvService();
+ virtual status_t onTransact(uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags);
+ volatile int32_t mUsers;
+ virtual void incUsers();
+ virtual void decUsers();
+ mutable Mutex mServiceLock;
+ static CTv *mpTv;
+ CTvScreenCapture mCapVidFrame;
+
+};
+
+#endif
diff --git a/tvapi/android/tvserver/main.cpp b/tvapi/android/tvserver/main.cpp
index 07baf34..ed9847c 100644
--- a/tvapi/android/tvserver/main.cpp
+++ b/tvapi/android/tvserver/main.cpp
@@ -1,23 +1,23 @@
-#include <sys/types.h>
-#include <unistd.h>
-#include <grp.h>
-#include <binder/IPCThreadState.h>
-#include <binder/ProcessState.h>
-#include <binder/IServiceManager.h>
-#include <utils/Log.h>
-#include "TvService.h"
-
-using namespace android;
-
-int main(int argc, char **argv)
-{
- sp<ProcessState> proc(ProcessState::self());
- sp<IServiceManager> sm = defaultServiceManager();
- TvService::instantiate();
-
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
-
- return 0;
-}
-
+#include <sys/types.h>
+#include <unistd.h>
+#include <grp.h>
+#include <binder/IPCThreadState.h>
+#include <binder/ProcessState.h>
+#include <binder/IServiceManager.h>
+#include <utils/Log.h>
+#include "TvService.h"
+
+using namespace android;
+
+int main(int argc, char **argv)
+{
+ sp<ProcessState> proc(ProcessState::self());
+ sp<IServiceManager> sm = defaultServiceManager();
+ TvService::instantiate();
+
+ ProcessState::self()->startThreadPool();
+ IPCThreadState::self()->joinThreadPool();
+
+ return 0;
+}
+
diff --git a/tvapi/android/tvserver/tv_callback.h b/tvapi/android/tvserver/tv_callback.h
new file mode 100644
index 0000000..ef97442
--- a/dev/null
+++ b/tvapi/android/tvserver/tv_callback.h
@@ -0,0 +1,18 @@
+#ifndef TV_CALLBACK
+#define TV_CALLBACK
+#include "tvapi/android/tv/CTv.h"
+class TvCallback : public CTv::TvIObserver
+{
+ public:
+ TvCallback(void* data)
+ {
+ mPri = data;
+ }
+ ~TvCallback()
+ {
+ }
+ void onTvEvent (int32_t msgType, const Parcel &p);
+ private:
+ void* mPri;
+};
+#endif
diff --git a/tvapi/build/include/.gitignore b/tvapi/build/include/.gitignore
index e69de29..e69de29 100755..100644
--- a/tvapi/build/include/.gitignore
+++ b/tvapi/build/include/.gitignore
diff --git a/tvapi/build/include/xxxconfig.h b/tvapi/build/include/xxxconfig.h
index 2f305c9..e69de29 100644
--- a/tvapi/build/include/xxxconfig.h
+++ b/tvapi/build/include/xxxconfig.h
@@ -1 +0,0 @@
-#include <ref_n300_v1/ref_n300_v1.h>
diff --git a/tvapi/docs/tv.uml b/tvapi/docs/tv.uml
index 112c881..15238f7 100644
--- a/tvapi/docs/tv.uml
+++ b/tvapi/docs/tv.uml
@@ -1,6093 +1,6093 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
-<XPD:HEADER>
-<XPD:SUBUNITS>
-</XPD:SUBUNITS>
-<XPD:PROFILES>
-<XPD:PROFILE>UMLStandard</XPD:PROFILE>
-<XPD:PROFILE>Java</XPD:PROFILE>
-<XPD:PROFILE>Cpp</XPD:PROFILE>
-</XPD:PROFILES>
-</XPD:HEADER>
-<XPD:BODY>
-<XPD:OBJ name="DocumentElement" type="UMLProject" guid="CoZuu0bDp0eooW1pQg6aQwAA">
-<XPD:ATTR name="Title" type="string">tv</XPD:ATTR>
-<XPD:ATTR name="#OwnedElements" type="integer">5</XPD:ATTR>
-<XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="6Ncym1qqME6Qmj4IRHZMIQAA">
-<XPD:ATTR name="Name" type="string">Use Case Model</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">useCaseModel</XPD:ATTR>
-<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
-<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="OwnedDiagrams[0]" type="UMLUseCaseDiagram" guid="nzFiqgF5PEKC+zYpaFKlCQAA">
-<XPD:ATTR name="Name" type="string">tv功</XPD:ATTR>
-<XPD:REF name="DiagramOwner">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:OBJ name="DiagramView" type="UMLUseCaseDiagramView" guid="nx0lwQzrskWozLI1S3LzQgAA">
-<XPD:REF name="Diagram">nzFiqgF5PEKC+zYpaFKlCQAA</XPD:REF>
-<XPD:ATTR name="#OwnedViews" type="integer">17</XPD:ATTR>
-<XPD:OBJ name="OwnedViews[0]" type="UMLActorView" guid="gvI3mIExBEmaszVtF0V6bwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">116</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">40</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">78</XPD:ATTR>
-<XPD:REF name="Model">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="FSYMWbRzs0mJbYfl9CkXfAAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="+Fy828Qip0uc61sSAd0UwQAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">user</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="TbdT9IJSLU+fl/JTxDnxxQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="aTiAvGpnHUGxIA1FbazntAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="UA5dbT7GVU2OqjVX9PXuWAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="9c90i0MrUkKipskFCo8wlgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[1]" type="UMLUseCaseView" guid="gjXEJSzeBk24cBss5DrAhAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">396</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">125</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
-<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="WQwWYMpQtUCP6CaPlCcltQAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="Nbu2DNQyW0K3OkEns8o8FgAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">æœå°</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="k8VZH0rfeUaxBRl8mSLwDAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="EL3VwTjdHkCZndTAtu6x0QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="FCs4dSUL6ES18h1zCz8l6AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="sTCdfdSS0UiUUNZ/B2e/FAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="GczyMXZXJEmnDD4a7NAunwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[2]" type="UMLUseCaseView" guid="Frl6rGi4ekOSrHn6gJ5XLQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">452</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">64</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">124</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
-<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="k0GCedKioUeNGvdENFUs4AAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="GZ0SKDfylkCAWEwMblBG9gAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">æ¢å°</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="zw9u23HITU+F7D/MPgZyoQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="ZaIixThNIkGc744Tm3CsugAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="aH6LRR4We0O3VrbkDZF2cwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="HAEKTxJSV0uP4v52ffOFQwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="bSOUAy1Buk+obB82eUrFSQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[3]" type="UMLUseCaseView" guid="Hyu7+1e/cES0Ae1OqV75fwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">428</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">124</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">237</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
-<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="3d2gFNlI6EK+jsWimDIS+QAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="SVBydeRF006GMrAfC3ETqwAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">得到当å‰å°çš„ä¿¡æ¯/å±æ˜¾</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="SU3HDI+ru0WNDK77syR/GQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="CS3PuOwuBkW7+xAe2clbBAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="6VTL4WFMHEigYGfaMrdGYwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="7rrGYYen40CFqpViVSVmAQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="18I+62RrWEOFbvJ7hjlg4AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[4]" type="UMLUseCaseView" guid="JsuyLQhZc0Sm5Tx7vxV+jAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">416</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">212</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">178</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
-<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="kfnOa+AQV0Kj4BKPF56htAAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="6bLEGGIsiU6zFFc9j4F49wAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">得到全部å°çš„列表</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="ADRdb9imSEChWP9jDiJFWgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Gp396ZK3MUyBaxd1WCTOIQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="c8pFLtSKjE+idXYMkFpEQAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="8s4aZ7v9JkWne3xJfZ0IqgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="qTH2RWpVvkyOG5CaahXI1AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[5]" type="UMLAssociationView" guid="VKBbewCQmUyNjzWZhk3pLQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">201,70;396,34</XPD:ATTR>
-<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
-<XPD:REF name="Head">gjXEJSzeBk24cBss5DrAhAAA</XPD:REF>
-<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="dgQAXdF4ZESvmtHR7mV1eAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="nl0ivvTPhk6+ZWGNY3Z7QQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="21Re8Yow20OMsCn0YuNvyQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="g4iIuaL510KG496BLjSxFAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="gJVKivaSkUOMWN8rIdDn4gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="TwLEoTMD10ehV8UPEkC8GAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="xB9CaPtaBEGmmoo1GYSHmAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="9JL65E1Ll0K/gBYTvW27ggAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="bGKgfsVj9UqvRKTQT54jnwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="W8FWavR8aUaHm9U8dXz4VgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="hx6u1xKLF028b6Yykl/JVwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="T2Ct5boioEq1zBkQPfP1uAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">201,79;452,85</XPD:ATTR>
-<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
-<XPD:REF name="Head">Frl6rGi4ekOSrHn6gJ5XLQAA</XPD:REF>
-<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="itC6+9KIkUOoqvWzhIL9eAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="yn7EMIRfMUivZuavba1QKgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="qp8dQ4Cl50OUly+002LHkwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="K/CL0noaSEeVxfiH/AYdPQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Cko4gh6CNESvzEaGX7xrTwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="gJsX46E8OEivWSn9FKGyIgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="YXCHfhVdWUSEN2ZT/RAgUwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="+sQ4dyQOwEyKXN3Siy8SeAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="3/az9bmrj0OrABD1RgT7zgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="g0gSj9MvXEy5XaeQkbjoOwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="QhKdEmGlb021SYaW2m8l2AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="AyvrWm4rVU2nEQ3SaHF+pwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">201,86;428,125</XPD:ATTR>
-<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
-<XPD:REF name="Head">Hyu7+1e/cES0Ae1OqV75fwAA</XPD:REF>
-<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Ic1rMSlGuEiOmC74Gs5VPgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="LmeDzwQ4WE+N9ctpkvJC2QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="/4mMqWe3yUWrZLbs6l2tZwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="/DGBSl3cJ0S8W6nJJJGcfwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="m94XoFukck+27/0mViZU2gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="QQK2e0FGJkigWh9ObCBDRgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="rl15HxW7wUGsb4vRn7Al9wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="WxqNKB0NhUqZpADhZw+P3QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="A1ODeRbq4kaOK4HMvaTeRQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="Tj9w6ngJfUqetSitERQ8NQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="LFchLERMEE2qPO6m3DpPuQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="QIXdxKII/kqOJOJMY5AcogAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">201,97;455,212</XPD:ATTR>
-<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
-<XPD:REF name="Head">JsuyLQhZc0Sm5Tx7vxV+jAAA</XPD:REF>
-<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Xq0mZflYI0KV42hvumdugQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="vwdwId1yNkaUtmkTI1YWuQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="1uoVEwi+dkyCZb5M7Pve2wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="4paVVhhoOU2GUrsd9Xm/FwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="kbnyVybMKEKdAdKhGeseZgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="66pNRRmKjku3rnBmhfUBCgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="g5PdiNFseUGXOynpmdruGwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="i3/GDxY4DU6ZMPvt2/tUdgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="71PEDgUjsU+2i57rKSIWiQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="Bn3vSuvCAEGkNyVyOiDjtAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="WnuHsx6mVUGcSN3xCQss6QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[9]" type="UMLUseCaseView" guid="B39+MGxIAUu2bla4M15wGQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">428</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">344</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">182</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
-<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="G5wIehwq+0eIoXt5370UvgAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="+OT5iGpyX0mfkpXaUy+lWgAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">设置å„ç§å‚æ•°ä¿¡æ¯</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="liywRdQGmEmxnhyRBal4rAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="7R4zEmy7t0WDv/dHHBAF0AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="kRxUjogV4k2YkluNvawsMAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="u8URrWr/hkiwdkqgLJdW+wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="KOSNG5KSM0CFIOZucCSmlwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="xD4JWSKF3EOTqNmsPzbc5QAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">201,112;491,344</XPD:ATTR>
-<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
-<XPD:REF name="Head">B39+MGxIAUu2bla4M15wGQAA</XPD:REF>
-<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Aug+XiD/L0C98F0lb8QKAgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="+HDBsjEDKEqWUJZ9hnAU4QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="8N0unm4hwUy3Q/ipJnkyXAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="0NmimauDo0yxCgPn4bFExgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="evKHrFVG9kazUYsWGKYoRQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="YPI7wcCBTUybTm1Spbgg8QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="JgCUSElncUaW/Ryki1kRMQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="ntmWchFV+UqAdPT3cz9/JQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="vquz6rX3pkKrylGBjx30IAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="edAtn71weU2/fvAr2uihoQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="CXIajd5ee06Zf7q4GbpG1QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[11]" type="UMLUseCaseView" guid="grqGSNiheUuwFijgmxch+gAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">236</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">280</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">130</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
-<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="yd3L6GZKLkeQZ1rwi7QUdwAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="kTZxfY7VPkO7bRwo+0E/QgAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">预约</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="bjVlyswu/kSF04Iq8TwUcwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="xcQ9Vgj+k0eBpJoVYqjU+QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="54HAvDvDa06v58oCDBCKXwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="H5TD/VVzokWAABxo66dDiwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="qqfU97a8nUqfLL2CFuWnjQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[12]" type="UMLAssociationView" guid="kVRyhJmyWEyyp5wuc+OXngAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">183,117;286,280</XPD:ATTR>
-<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
-<XPD:REF name="Head">grqGSNiheUuwFijgmxch+gAA</XPD:REF>
-<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="FypCN9NIE0C9ShWHmH/yxQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="UYBImTsT3kmMLO4UVo7iDgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Dv0knjRPxEiA3FR76MzcQgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="qZ6wG2yUdUCrkCtj+ADq5gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="oRaZRwRR1E+ugfvMU7Mx7AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="5xmhglHNPkebUvE0zYQ+1QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Rf4Y2d2tx0eAEgaVNgix1gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="TJu7E2BYn0e7KDkLvMy6zQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="e0J/wN1wUUGY7r7RQqgfrQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="HuuHMInFx0awxMfN0WO7nAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="LK/960VLGUqFEI3dQB55GgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[13]" type="UMLUseCaseView" guid="1rgOrFraekaSjgPeaxo6VQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">44</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">276</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">121</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
-<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="gO3lj/0VEkmcGBM22vSVygAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="5VgGyt6LmU26Ugzte0ke+QAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">回放</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="OYamm5Q5wEmGKhCOoHHMVQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="SG00AIBfJE6CGLnrfQ6vHAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="rgrH2S52KUirNQUR897hjAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="/Uw/TQZhfEa2XXCMAwNycQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="c8C4qOOrcUa+n6I+x3qsmwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="FyWt2ux4n0C/jIWXlvGepAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">148,117;109,276</XPD:ATTR>
-<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
-<XPD:REF name="Head">1rgOrFraekaSjgPeaxo6VQAA</XPD:REF>
-<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="tzUYyPqymkyQTrpQ3ESfLQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="WsC4wpiLwESJvBADsJOD0QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="240EHYi+MUSGtsZ2MH9vbAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="HGprZSDtFUGe58XLDa/llAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="jriPICawik+i/5uQ1tPPJQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="sgsEShSJaUa0m4iY/pH+kgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="oHna4JnixU6x5HHrqy8Y0gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="zD5xP/cAIkyWZDkkr5ToygAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="CcjzfOb/A06oYHNBWwMyYAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="k/ixsOc3uECBJHIoPEzSCQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="eJcfvTsAsUKZSOjduilFwAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[15]" type="UMLUseCaseView" guid="mlqnICP04kuE2DQduAxCnAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">676</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">208</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">121</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
-<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="SRnkj+mMmkOMwzyxJwTibAAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="2afuLG9SqEymSxMJuyHxJgAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">ä¿å­˜æ•°æ®</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="wUkUa3V6VU6SXo+560ZANAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="eeGzvESJskW2qRwldE4o8gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="ZBT2RXZyKE2KgZdND0TQCwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ayKElX0k9EWwlzIjQHBReAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="TjYDD4DDi06is7FTfdSgGgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[16]" type="UMLActorView" guid="8+OH6W5lhU2orgFp9fejxAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">896</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">36</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">72</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">78</XPD:ATTR>
-<XPD:REF name="Model">EIFC2d0E6EScGB1xXji93AAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="n/aO4ZyhvEOJuT58CBcC5gAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="2ZhkQxFuGk2UQcb3DISJAQAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">å¼€å‘人员</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="y1MqUzbc4UeDdpEsqrK3GwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="0Oeejnt4GEuk0csGmClAQAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="55svG5LVmEayI1yOLF/hYgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">EIFC2d0E6EScGB1xXji93AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="qt7RVSofskyCOe4IXevE3gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">EIFC2d0E6EScGB1xXji93AAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:ATTR name="#OwnedElements" type="integer">17</XPD:ATTR>
-<XPD:OBJ name="OwnedElements[0]" type="UMLActor" guid="jE6Hh4xWzk+ss1P1I88QbQAA">
-<XPD:ATTR name="Name" type="string">user</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">3</XPD:ATTR>
-<XPD:REF name="Views[0]">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
-<XPD:REF name="Views[1]">UA5dbT7GVU2OqjVX9PXuWAAA</XPD:REF>
-<XPD:REF name="Views[2]">9c90i0MrUkKipskFCo8wlgAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">7</XPD:ATTR>
-<XPD:REF name="Associations[0]">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
-<XPD:REF name="Associations[1]">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
-<XPD:REF name="Associations[2]">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
-<XPD:REF name="Associations[3]">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
-<XPD:REF name="Associations[4]">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
-<XPD:REF name="Associations[5]">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
-<XPD:REF name="Associations[6]">teHN23xRpE6lugxstCxsawAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[1]" type="UMLUseCase" guid="nAsf5tia702zzSQAu6L6VwAA">
-<XPD:ATTR name="Name" type="string">æœå°</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">gjXEJSzeBk24cBss5DrAhAAA</XPD:REF>
-<XPD:REF name="Views[1]">FCs4dSUL6ES18h1zCz8l6AAA</XPD:REF>
-<XPD:REF name="Views[2]">sTCdfdSS0UiUUNZ/B2e/FAAA</XPD:REF>
-<XPD:REF name="Views[3]">GczyMXZXJEmnDD4a7NAunwAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[2]" type="UMLUseCase" guid="yCRgNkRB+EGAwzfBjdJbqwAA">
-<XPD:ATTR name="Name" type="string">æ¢å°</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Frl6rGi4ekOSrHn6gJ5XLQAA</XPD:REF>
-<XPD:REF name="Views[1]">aH6LRR4We0O3VrbkDZF2cwAA</XPD:REF>
-<XPD:REF name="Views[2]">HAEKTxJSV0uP4v52ffOFQwAA</XPD:REF>
-<XPD:REF name="Views[3]">bSOUAy1Buk+obB82eUrFSQAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[3]" type="UMLUseCase" guid="W59J2q05J0K29agobcVJpwAA">
-<XPD:ATTR name="Name" type="string">得到当å‰å°çš„ä¿¡æ¯/å±æ˜¾</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Hyu7+1e/cES0Ae1OqV75fwAA</XPD:REF>
-<XPD:REF name="Views[1]">6VTL4WFMHEigYGfaMrdGYwAA</XPD:REF>
-<XPD:REF name="Views[2]">7rrGYYen40CFqpViVSVmAQAA</XPD:REF>
-<XPD:REF name="Views[3]">18I+62RrWEOFbvJ7hjlg4AAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[4]" type="UMLUseCase" guid="ExhZCRayVUq9VZBeXyOzSgAA">
-<XPD:ATTR name="Name" type="string">得到全部å°çš„列表</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">JsuyLQhZc0Sm5Tx7vxV+jAAA</XPD:REF>
-<XPD:REF name="Views[1]">c8pFLtSKjE+idXYMkFpEQAAA</XPD:REF>
-<XPD:REF name="Views[2]">8s4aZ7v9JkWne3xJfZ0IqgAA</XPD:REF>
-<XPD:REF name="Views[3]">qTH2RWpVvkyOG5CaahXI1AAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[5]" type="UMLAssociation" guid="hXa1Ze5PcEWvFq3WssbumAAA">
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">VKBbewCQmUyNjzWZhk3pLQAA</XPD:REF>
-<XPD:REF name="Views[1]">dgQAXdF4ZESvmtHR7mV1eAAA</XPD:REF>
-<XPD:REF name="Views[2]">nl0ivvTPhk6+ZWGNY3Z7QQAA</XPD:REF>
-<XPD:REF name="Views[3]">21Re8Yow20OMsCn0YuNvyQAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="2RBODiwfOUCUVzGJ/32wAAAA">
-<XPD:REF name="Association">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
-<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">gJVKivaSkUOMWN8rIdDn4gAA</XPD:REF>
-<XPD:REF name="Views[1]">xB9CaPtaBEGmmoo1GYSHmAAA</XPD:REF>
-<XPD:REF name="Views[2]">bGKgfsVj9UqvRKTQT54jnwAA</XPD:REF>
-<XPD:REF name="Views[3]">hx6u1xKLF028b6Yykl/JVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="1h+kSCXpe0eWYNVJ4SXvTQAA">
-<XPD:REF name="Association">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
-<XPD:REF name="Participant">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">g4iIuaL510KG496BLjSxFAAA</XPD:REF>
-<XPD:REF name="Views[1]">TwLEoTMD10ehV8UPEkC8GAAA</XPD:REF>
-<XPD:REF name="Views[2]">9JL65E1Ll0K/gBYTvW27ggAA</XPD:REF>
-<XPD:REF name="Views[3]">W8FWavR8aUaHm9U8dXz4VgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="GWeTbEaAQUO+r17c6TtqcAAA">
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">T2Ct5boioEq1zBkQPfP1uAAA</XPD:REF>
-<XPD:REF name="Views[1]">itC6+9KIkUOoqvWzhIL9eAAA</XPD:REF>
-<XPD:REF name="Views[2]">yn7EMIRfMUivZuavba1QKgAA</XPD:REF>
-<XPD:REF name="Views[3]">qp8dQ4Cl50OUly+002LHkwAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="LAvKrCSTOk+Idehr21cMIwAA">
-<XPD:REF name="Association">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
-<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Cko4gh6CNESvzEaGX7xrTwAA</XPD:REF>
-<XPD:REF name="Views[1]">YXCHfhVdWUSEN2ZT/RAgUwAA</XPD:REF>
-<XPD:REF name="Views[2]">3/az9bmrj0OrABD1RgT7zgAA</XPD:REF>
-<XPD:REF name="Views[3]">QhKdEmGlb021SYaW2m8l2AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="7KhVXW2jsUGTY2YhCHULSAAA">
-<XPD:REF name="Association">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
-<XPD:REF name="Participant">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">K/CL0noaSEeVxfiH/AYdPQAA</XPD:REF>
-<XPD:REF name="Views[1]">gJsX46E8OEivWSn9FKGyIgAA</XPD:REF>
-<XPD:REF name="Views[2]">+sQ4dyQOwEyKXN3Siy8SeAAA</XPD:REF>
-<XPD:REF name="Views[3]">g0gSj9MvXEy5XaeQkbjoOwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="R+Mv7uh5kEuKr/Bia3KOhAAA">
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">AyvrWm4rVU2nEQ3SaHF+pwAA</XPD:REF>
-<XPD:REF name="Views[1]">Ic1rMSlGuEiOmC74Gs5VPgAA</XPD:REF>
-<XPD:REF name="Views[2]">LmeDzwQ4WE+N9ctpkvJC2QAA</XPD:REF>
-<XPD:REF name="Views[3]">/4mMqWe3yUWrZLbs6l2tZwAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="BPqYWvTNKEOfCOeMpPA44AAA">
-<XPD:REF name="Association">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
-<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">m94XoFukck+27/0mViZU2gAA</XPD:REF>
-<XPD:REF name="Views[1]">rl15HxW7wUGsb4vRn7Al9wAA</XPD:REF>
-<XPD:REF name="Views[2]">A1ODeRbq4kaOK4HMvaTeRQAA</XPD:REF>
-<XPD:REF name="Views[3]">LFchLERMEE2qPO6m3DpPuQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="X1+FYBSOWkaYgLu2FjOTXwAA">
-<XPD:REF name="Association">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
-<XPD:REF name="Participant">W59J2q05J0K29agobcVJpwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">/DGBSl3cJ0S8W6nJJJGcfwAA</XPD:REF>
-<XPD:REF name="Views[1]">QQK2e0FGJkigWh9ObCBDRgAA</XPD:REF>
-<XPD:REF name="Views[2]">WxqNKB0NhUqZpADhZw+P3QAA</XPD:REF>
-<XPD:REF name="Views[3]">Tj9w6ngJfUqetSitERQ8NQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="WrC8vAeUYkO3tLCoOTTa7gAA">
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">QIXdxKII/kqOJOJMY5AcogAA</XPD:REF>
-<XPD:REF name="Views[1]">Xq0mZflYI0KV42hvumdugQAA</XPD:REF>
-<XPD:REF name="Views[2]">vwdwId1yNkaUtmkTI1YWuQAA</XPD:REF>
-<XPD:REF name="Views[3]">1uoVEwi+dkyCZb5M7Pve2wAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="uJNUdzUQLUu2aPlejTqjNwAA">
-<XPD:REF name="Association">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
-<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">kbnyVybMKEKdAdKhGeseZgAA</XPD:REF>
-<XPD:REF name="Views[1]">g5PdiNFseUGXOynpmdruGwAA</XPD:REF>
-<XPD:REF name="Views[2]">71PEDgUjsU+2i57rKSIWiQAA</XPD:REF>
-<XPD:REF name="Views[3]">WnuHsx6mVUGcSN3xCQss6QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="pVT44Y4IlkCvW0rXC+dzRgAA">
-<XPD:REF name="Association">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
-<XPD:REF name="Participant">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">4paVVhhoOU2GUrsd9Xm/FwAA</XPD:REF>
-<XPD:REF name="Views[1]">66pNRRmKjku3rnBmhfUBCgAA</XPD:REF>
-<XPD:REF name="Views[2]">i3/GDxY4DU6ZMPvt2/tUdgAA</XPD:REF>
-<XPD:REF name="Views[3]">Bn3vSuvCAEGkNyVyOiDjtAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[9]" type="UMLUseCase" guid="5KAC2LjvX0qQF9lBa5DyCwAA">
-<XPD:ATTR name="Name" type="string">设置å„ç§å‚æ•°ä¿¡æ¯</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">B39+MGxIAUu2bla4M15wGQAA</XPD:REF>
-<XPD:REF name="Views[1]">kRxUjogV4k2YkluNvawsMAAA</XPD:REF>
-<XPD:REF name="Views[2]">u8URrWr/hkiwdkqgLJdW+wAA</XPD:REF>
-<XPD:REF name="Views[3]">KOSNG5KSM0CFIOZucCSmlwAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="y+qwgLasMEm0UKrVQN8iJQAA">
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">xD4JWSKF3EOTqNmsPzbc5QAA</XPD:REF>
-<XPD:REF name="Views[1]">Aug+XiD/L0C98F0lb8QKAgAA</XPD:REF>
-<XPD:REF name="Views[2]">+HDBsjEDKEqWUJZ9hnAU4QAA</XPD:REF>
-<XPD:REF name="Views[3]">8N0unm4hwUy3Q/ipJnkyXAAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="jJgG/r4rjE2qAhy/U/lg2wAA">
-<XPD:REF name="Association">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
-<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">evKHrFVG9kazUYsWGKYoRQAA</XPD:REF>
-<XPD:REF name="Views[1]">JgCUSElncUaW/Ryki1kRMQAA</XPD:REF>
-<XPD:REF name="Views[2]">vquz6rX3pkKrylGBjx30IAAA</XPD:REF>
-<XPD:REF name="Views[3]">CXIajd5ee06Zf7q4GbpG1QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="iK2QfBiThkWwoji6bSWtswAA">
-<XPD:REF name="Association">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
-<XPD:REF name="Participant">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">0NmimauDo0yxCgPn4bFExgAA</XPD:REF>
-<XPD:REF name="Views[1]">YPI7wcCBTUybTm1Spbgg8QAA</XPD:REF>
-<XPD:REF name="Views[2]">ntmWchFV+UqAdPT3cz9/JQAA</XPD:REF>
-<XPD:REF name="Views[3]">edAtn71weU2/fvAr2uihoQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[11]" type="UMLUseCase" guid="eLOxpsSp0EC08r5lL9rsZAAA">
-<XPD:ATTR name="Name" type="string">预约</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">grqGSNiheUuwFijgmxch+gAA</XPD:REF>
-<XPD:REF name="Views[1]">54HAvDvDa06v58oCDBCKXwAA</XPD:REF>
-<XPD:REF name="Views[2]">H5TD/VVzokWAABxo66dDiwAA</XPD:REF>
-<XPD:REF name="Views[3]">qqfU97a8nUqfLL2CFuWnjQAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="0s9c8w+QxUaASZ+fMtRSqQAA">
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">kVRyhJmyWEyyp5wuc+OXngAA</XPD:REF>
-<XPD:REF name="Views[1]">FypCN9NIE0C9ShWHmH/yxQAA</XPD:REF>
-<XPD:REF name="Views[2]">UYBImTsT3kmMLO4UVo7iDgAA</XPD:REF>
-<XPD:REF name="Views[3]">Dv0knjRPxEiA3FR76MzcQgAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="HQZk+9nVI02CjFsZTEmJFgAA">
-<XPD:REF name="Association">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
-<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">oRaZRwRR1E+ugfvMU7Mx7AAA</XPD:REF>
-<XPD:REF name="Views[1]">Rf4Y2d2tx0eAEgaVNgix1gAA</XPD:REF>
-<XPD:REF name="Views[2]">e0J/wN1wUUGY7r7RQqgfrQAA</XPD:REF>
-<XPD:REF name="Views[3]">LK/960VLGUqFEI3dQB55GgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="rXVVaNhetUi+zkmUpV2EJAAA">
-<XPD:REF name="Association">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
-<XPD:REF name="Participant">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">qZ6wG2yUdUCrkCtj+ADq5gAA</XPD:REF>
-<XPD:REF name="Views[1]">5xmhglHNPkebUvE0zYQ+1QAA</XPD:REF>
-<XPD:REF name="Views[2]">TJu7E2BYn0e7KDkLvMy6zQAA</XPD:REF>
-<XPD:REF name="Views[3]">HuuHMInFx0awxMfN0WO7nAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[13]" type="UMLUseCase" guid="DfNIoYa4GU+CP71/W8SrWwAA">
-<XPD:ATTR name="Name" type="string">回放</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">1rgOrFraekaSjgPeaxo6VQAA</XPD:REF>
-<XPD:REF name="Views[1]">rgrH2S52KUirNQUR897hjAAA</XPD:REF>
-<XPD:REF name="Views[2]">/Uw/TQZhfEa2XXCMAwNycQAA</XPD:REF>
-<XPD:REF name="Views[3]">c8C4qOOrcUa+n6I+x3qsmwAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[14]" type="UMLAssociation" guid="oYdSRRagC0OKiYHxCgS7CAAA">
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">FyWt2ux4n0C/jIWXlvGepAAA</XPD:REF>
-<XPD:REF name="Views[1]">tzUYyPqymkyQTrpQ3ESfLQAA</XPD:REF>
-<XPD:REF name="Views[2]">WsC4wpiLwESJvBADsJOD0QAA</XPD:REF>
-<XPD:REF name="Views[3]">240EHYi+MUSGtsZ2MH9vbAAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="teHN23xRpE6lugxstCxsawAA">
-<XPD:REF name="Association">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
-<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">jriPICawik+i/5uQ1tPPJQAA</XPD:REF>
-<XPD:REF name="Views[1]">oHna4JnixU6x5HHrqy8Y0gAA</XPD:REF>
-<XPD:REF name="Views[2]">CcjzfOb/A06oYHNBWwMyYAAA</XPD:REF>
-<XPD:REF name="Views[3]">eJcfvTsAsUKZSOjduilFwAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="AeXEiqTUjkaieSlGxTKX+QAA">
-<XPD:REF name="Association">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
-<XPD:REF name="Participant">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">HGprZSDtFUGe58XLDa/llAAA</XPD:REF>
-<XPD:REF name="Views[1]">sgsEShSJaUa0m4iY/pH+kgAA</XPD:REF>
-<XPD:REF name="Views[2]">zD5xP/cAIkyWZDkkr5ToygAA</XPD:REF>
-<XPD:REF name="Views[3]">k/ixsOc3uECBJHIoPEzSCQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[15]" type="UMLUseCase" guid="eVrNXR8NqEC5uMEFgGKQ1gAA">
-<XPD:ATTR name="Name" type="string">ä¿å­˜æ•°æ®</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">mlqnICP04kuE2DQduAxCnAAA</XPD:REF>
-<XPD:REF name="Views[1]">ZBT2RXZyKE2KgZdND0TQCwAA</XPD:REF>
-<XPD:REF name="Views[2]">ayKElX0k9EWwlzIjQHBReAAA</XPD:REF>
-<XPD:REF name="Views[3]">TjYDD4DDi06is7FTfdSgGgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[16]" type="UMLActor" guid="EIFC2d0E6EScGB1xXji93AAA">
-<XPD:ATTR name="Name" type="string">å¼€å‘人员</XPD:ATTR>
-<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">3</XPD:ATTR>
-<XPD:REF name="Views[0]">8+OH6W5lhU2orgFp9fejxAAA</XPD:REF>
-<XPD:REF name="Views[1]">55svG5LVmEayI1yOLF/hYgAA</XPD:REF>
-<XPD:REF name="Views[2]">qt7RVSofskyCOe4IXevE3gAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[1]" type="UMLModel" guid="GSh70Nz8XUWNmgnjTARh/gAA">
-<XPD:ATTR name="Name" type="string">Analysis Model</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
-<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
-<XPD:ATTR name="#OwnedElements" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="OwnedElements[0]" type="UMLAssociation" guid="rIQWVfPr7E24Tt4ljeTZ4wAA">
-<XPD:REF name="Namespace">GSh70Nz8XUWNmgnjTARh/gAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">G0kUvklDf0uhBeIUoV+srgAA</XPD:REF>
-<XPD:REF name="Views[1]">6o6l7Ax4b0uvR1w70cdJiAAA</XPD:REF>
-<XPD:REF name="Views[2]">3ZsGQfCQIk+ZPFC1FyyVeQAA</XPD:REF>
-<XPD:REF name="Views[3]">BCGhRmtL7kmoY1iXaapJOwAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="jLzV7XdHP0Ogmb7/6IPCtgAA">
-<XPD:REF name="Association">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
-<XPD:REF name="Participant">7dRihysn8kefkb+6mJlwzgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">zqmFgnNCJ0mU+9gnrH18SwAA</XPD:REF>
-<XPD:REF name="Views[1]">QE0xM9HZIUK4iQSOifSKDQAA</XPD:REF>
-<XPD:REF name="Views[2]">yt3drhX0N0aispBa+C83TAAA</XPD:REF>
-<XPD:REF name="Views[3]">L3X2M2UWvECpCLZj42krJAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="XKFQZaAIH0SxD7YBXgkK0wAA">
-<XPD:REF name="Association">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
-<XPD:REF name="Participant">ZRumjrTwgUamBDOstkagPgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">SuRONY2jREyvBHGP7nheBQAA</XPD:REF>
-<XPD:REF name="Views[1]">8rSGjmyTy0iar869slrlPgAA</XPD:REF>
-<XPD:REF name="Views[2]">l9UCuL7VoEm7vFLWkobdoAAA</XPD:REF>
-<XPD:REF name="Views[3]">NYMZ1wuIcUy7G5VODIYIDQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[1]" type="UMLAssociation" guid="0hCZfIhV4EOpKXcVPwcUnAAA">
-<XPD:REF name="Namespace">GSh70Nz8XUWNmgnjTARh/gAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">+dr3aeLg8k2RQ8khsHmmqAAA</XPD:REF>
-<XPD:REF name="Views[1]">eiIT0uNCpUywEWk7FrhutgAA</XPD:REF>
-<XPD:REF name="Views[2]">m5vcHblPLUe9VZHiD1lPzgAA</XPD:REF>
-<XPD:REF name="Views[3]">dHGIMYC9dUeyteDUvxEuNgAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="DGWju3i/80ObxLedRPIIEwAA">
-<XPD:REF name="Association">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
-<XPD:REF name="Participant">7dRihysn8kefkb+6mJlwzgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">DGGWcQw7xESguDo8y8c9JwAA</XPD:REF>
-<XPD:REF name="Views[1]">RjfRt8utjEiWYhIQFBxLqgAA</XPD:REF>
-<XPD:REF name="Views[2]">YyNOaiAWMU6urAt6uMo51wAA</XPD:REF>
-<XPD:REF name="Views[3]">HRQ1wVKzDUe1hazbUuDnVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="TolxJOTDCkO5nyLC6ipkAwAA">
-<XPD:REF name="Association">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
-<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">bVRmxC4LeEivBU8rO/l1IwAA</XPD:REF>
-<XPD:REF name="Views[1]">/6WmiwEpmUGnLzBRc6lCzwAA</XPD:REF>
-<XPD:REF name="Views[2]">Brf+/LZbFEamowtJ6zGOAgAA</XPD:REF>
-<XPD:REF name="Views[3]">eme8PTCUYkiREXPCAN1ACgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[2]" type="UMLModel" guid="dZ4UyetzSE+rDT9vQthF9wAA">
-<XPD:ATTR name="Name" type="string">Design Model</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">designModel</XPD:ATTR>
-<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
-<XPD:ATTR name="#OwnedDiagrams" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="qjYhNoiY1kqmGvfSf6HTOAAA">
-<XPD:ATTR name="Name" type="string">dtvclass</XPD:ATTR>
-<XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
-<XPD:REF name="DiagramOwner">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="P51EDp27mEuFUgKS4BG9TgAA">
-<XPD:REF name="Diagram">qjYhNoiY1kqmGvfSf6HTOAAA</XPD:REF>
-<XPD:ATTR name="#OwnedViews" type="integer">33</XPD:ATTR>
-<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="a8FG7H9SzUelkRx52q1d5AAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">312</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">568</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">53</XPD:ATTR>
-<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="JQh3Wiuct0GpOwtZi9ZTpgAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="uNhK2xLegUaBu+NFKaBbSwAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvDatabase</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="hhHle2OI4Uu0405GJDfGVwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="jkWfDES3TkmlCIFIs5xizAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="k1LHywt4TEe6bHJwUzft/QAA">
-<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="hc7Nc/x4iE+k/Ee76MBxMgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Pwafosd7ik6mD1kxdwntngAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="Y9zMsiXlQEuyiSGOmpswRwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">780</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">528</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">102</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
-<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="/mSRKoE2+U2BADYjjBN3tQAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="IXnfaLgTKEGGdpX37KpTHgAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvSubtitle</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="+DeDbUnm+02usH1UojzZyQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="TObRQcYR6UWZmkjnkVEugwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="3kCRXwUbYEOaB2YVqs3CMQAA">
-<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="2pFBVEb3NUu3IhdJeNfBWAAA">
-<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="xx5BbdZ+6Eehp04cM6fnfwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="9Ld1pTeBF0CZmoVdEfEBMQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">324</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">228</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">83</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
-<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="KKCqrHWJXUyPtjvhGK6nTAAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="VODhD4+mz0yMbBwwjb3fXAAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CDtv</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="0OuB7ZzwGEqA8drjlJeNBgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Zc9FQRwP2Uuj8JJg74Jt3QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="mxcpZDUEI0aTfXvfNUP8/QAA">
-<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="0p/pTktl+kimPcmFJ4/wywAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="kWtX8dZWikSHi3kCydMHCAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="BVNqLhbhP06y98++NgmxAwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">284</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">388</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">147</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">33</XPD:ATTR>
-<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="juDswX7uL0W7bBJuRk06AgAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="ICbKIhrn50Gwq1GIFxbJYAAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvProgram</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="YHcJ0obYSEWbDvvepjISuwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="27Jf3klYvE2MAvnGgH8YqAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="muUyRePjd0qlQqM/tvfrmQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="3aWGjpGXTkqRn+NbEzYu5QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="ylciM87U9keZe9hSnVequAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[4]" type="UMLClassView" guid="iEgH+6H6kkG++neKuToTSgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">100</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">420</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">97</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
-<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="lnKxD1DyGEOj9cd46nB84QAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="FHfQpxZydUGiBASqFcX2dAAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvChannel</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="fd0gByAKXkisiM6J7MwdtAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="9r4OqNYuVUegwaUPTkv1pgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="Yo0KShxzIk2FSTydUse5OQAA">
-<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="rmKV7ZtcVEudbDw02LTB/wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="+jiKzSIz/UuhSFnnJkuIEgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="vYDCfUgYq0KaBSDnxbpYVgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">704</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">244</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
-<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="+QL9bkNaPUyTOdUO4yAR6AAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="eT33Wt7M8kiSrhmhuXGtCgAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvConfig</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="iBlTL0B9OEevQofD0ibRjwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="cFIMtDWroUOFGL0NgRigMAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="KTNQfnqIy0q3wV+ARVtV9gAA">
-<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="7Pq+TJVLy06gA8T6r5wMawAA">
-<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Fn0oKpD7lUyNbDw59UyRygAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="12BWSnVhhUOUuox7tdL41gAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">284,417;196,433</XPD:ATTR>
-<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
-<XPD:REF name="Head">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
-<XPD:REF name="Tail">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="4F+C2zwwrEOjx/qCnLXWPAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="lXf6uq0JtkK3YNXTxTyP7wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="8jym3kotyE2sBWD5KjhUiQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ioK1huVib0u6ILv3kHAeeQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="awNg1wfSGU22on1C+XpBlgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="cwfxPIXUd06ShM9BEivzxQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="cGTSA3bQb0S81NQzsTj+QQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="DBsnRjqoj0W9eAN/Flu+jwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="LWsKT6dOQUKXma9Eoh+sUwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="DUu549wQM0qPn9dAjjrLZgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="l9TSA+eftkCY2p6qZDMGKAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="Qa1PhzSwWkyS1rm6eapfLwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">354,568;357,420</XPD:ATTR>
-<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
-<XPD:REF name="Head">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
-<XPD:REF name="Tail">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="QAoFSXFK+0S+5kDYAQ0LsgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="rsOqshNVOkut6r+wW0Sp/wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0wZW9IH3y0OEPMfN5FyHQAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ySD9HMBWmEWoJg+/6boBZgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="TM3RNruxzEezNhF8XO/FmwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="LXz8D2AdoE6ojzgkYCO0qAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="NpASusGGKU+/KwcKkTAMogAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="ia8j06EduUmxgB5smbA9hQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="3dtXpNLbXka7wekzvAWsXQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="/JYlnmhzTk66TicK0RjYaQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Mvk2196ldk+5GLgct+OKuwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="UmHHYiIr3k+gNNomjLpgwwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">319,568;179,465</XPD:ATTR>
-<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
-<XPD:REF name="Head">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
-<XPD:REF name="Tail">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ZBlvBeIE2UGGPTML4sQ7SgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="UDn5R84weEayOYl6QVFj1wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="OApAa7HXz0aTiMZGZ/g2tAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="W1YT5dqwMUSUI29zCC2LZQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="24RGLobteEil7cUdAcyUcAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="X96IIfOZSE2FAliwKkCNYgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="6Uw1pdad6kC8N8S0Rf1HxwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="tr7uiHRKz0e//ValH5GU+AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="CuUsJAcsAUWwVZJzegOegAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="zdcHIs6dNEmxQNtCK5uHIQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="AST9GWgDTEWR07o7yUcgIQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="oYsj3yhzJkCKmOBcWIHNDwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">357,420;354,568</XPD:ATTR>
-<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
-<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:REF name="Tail">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="GT6R2h3HkU6LThPKaghC1QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="eWMr3v5Qb0y/nXu2s/EP5wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="GR9gxzUjNkKmujWHFobLtAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="+SSR3TM1z0m5UkTLiuMrGwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="UuRRAQf+y0OdXTOvWu7nUAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Uvo2ryiBg0Oa5GJF4TRyhQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="vI5c+acLSk6IfCcdqlaBggAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="QBI1NHwjWU2dkj+SLUFZ+AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="w3rpxhxEsEu0y7myhFrrkQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="IYVJT/RjPUqjv8rl6ZIQiwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="8Ip2rQJRaEaPAOW0cJSd/wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="Vcgjd9eKakOjuUAjwzzhJgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">179,465;319,568</XPD:ATTR>
-<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
-<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:REF name="Tail">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="+iIIR1mEnUynEPEjuGAd7AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="bZn71kXJQUOP3yAyCa5RvgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="O36co7nFz0elpJnbKtsYMwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="yjjLYCXJjUqX0IHnpKwHwQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Hv4K+XlgIkqDgqEz3aQWNQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="k1XiyO9mlke/IAq5UuYI9gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="4o7M8jakfkixRwVgESrUnwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Xtc7Jqe6N0+JAzLg1RxYLwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="rCPaxzL0LEuk9Jjbqi+D2gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="W0UPJtBpLU6Y5SjscWTiVAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="HKXhPda/vUuVwv4sR9ZR9QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[11]" type="UMLClassView" guid="8HnvkQxPk0OLqQXLeJ5MUgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">820</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">316</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
-<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="5gKeR33bd0K1R/QeIX+ZgQAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="tQ3eg1803UmmapVr5/mMKgAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvGroup</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="qwHtvoH6qk6Aj/xMPfoprQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="txC1zWyhHUKgVTvu0N6VDwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="50xz0k8rgU+WfODoAi8aeQAA">
-<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="TR1rTShyhEG7ngh596L0kgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="GPl78wz82UaLho5xwfMqrQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[12]" type="UMLAssociationView" guid="VjZwKWmCoUO5wNRGJGVShAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">820,364;397,573</XPD:ATTR>
-<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
-<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:REF name="Tail">8HnvkQxPk0OLqQXLeJ5MUgAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="6e9pHkpPaUyLDCYYnUYAOAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="QA7tnAAMA0e3tCDRlkB/JwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="gdUdn5u5x0KDsDKM41p2CQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="rqoTwNlD20Gou9xOLQ2RNgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="d/3xrtQ+nU69mQYepo7NvQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="ox9r7npaB0in7/ygfG1ZMwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="HcOo4bUmbUqLEjVUm2L2AQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="exLwGLRY306J0CEcqxlOrgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="tQj+naSiJ0mB4W89ahH5ygAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="qxZgk8R36k2S3vGRfQegfwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="LNFybtIVIkOXnQ/9QC5jEwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[13]" type="UMLClassView" guid="7aPHkO59WEubHbpM/Djq/AAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">456</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">396</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">89</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">41</XPD:ATTR>
-<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="DSv+CNOMnUKyGF5bfoGDowAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="Fy6x/w12H0K3LtAtk0/MuwAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvEvent</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="xy2kKdqewEerLbDFtu0jAwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="ZxuiiS0/6EiXhRO/StIWPgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="+EOWTA5PrUyAEwB/ZHVnPAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="f0xyghRma028ShVYc8tbfwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qpXdkd1nJ0ajRru7gzDFJwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="QHk4xsvJRUGhKn0p+sReaAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">484,436;375,568</XPD:ATTR>
-<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
-<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:REF name="Tail">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ezGCtUA0dUOn10D5pUOtoAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="QcGPzg741ki4yTGfoKvK9AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="ioZQYN39bEu/gy37UfkhmQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="mZFBakBXmE6Gj5qumz51gwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="VrmcPyj2oUyEm5i/AG7/KgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="KHpH30oHrEew1AGquvXiEQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="odMtivppNUOccWtC85AVCQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="W7KAnZMmjEKAxuaUXA4D6AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="2IiGGrbDkUiobp5CJnME1QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="jsiact/gpUS21gy1IeSlZQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="+70t9Os6zUWhIAhufEQsBAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[15]" type="UMLAssociationView" guid="l3oAx6sfA0ScCOouvAFKYwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">430,410;456,412</XPD:ATTR>
-<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
-<XPD:REF name="Head">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF>
-<XPD:REF name="Tail">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="pM/XXFo9Ikq+kK5++HoZ0QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="igklIYxpfka7OH5oAnRbPwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="RtZQfGM0uUqohb/WlARRpwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="lDsB+MeNlUy+OEBCbfs0OAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="pr9mkVSNO0KasNMsFvgDuQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="EeUDIEWsnkO5HzTU6L6kZQAA">
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">1</XPD:ATTR>
-<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="4fUHmnlcd0WplogWZWqPRQAA">
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">1..*</XPD:ATTR>
-<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="TuyQdZk0H0+ai9Mg3ZtK3AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="kKRq4K1cvEup70Oz2UFd8QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NKw56kYvx0W0KlwhXPYWMwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="DS2eOvXKXku93Y4x950QPgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[16]" type="UMLClassView" guid="Th+ZwPCIw0CZjtawrnGPrQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">756</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">440</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">88</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">41</XPD:ATTR>
-<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="sEpK+JymS02lZlpXniSRjAAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="Gfl9bfM73kq+EYU5hOwDUQAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvBooking</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="dWzJpyjDIE6y0Sx/YmBzlwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Ak99xRpzJ0+K3Y8Z70NTWQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="LL3KL7SUuEyu4pY6NT57NAAA">
-<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="dCkq+XCQgkaH1Q901KclHQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="+Bzptjmx3kWzAYT9fN/rxQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[17]" type="UMLClassView" guid="ybciiFK3jEO6SdfdRt6uAgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">68</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">332</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">41</XPD:ATTR>
-<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="VEgafHzMKkem+RzIfaWBnQAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="605ap6gGgUGE85kGWYWaKgAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvRegion</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="6TZwhHYPs0mXP+dvmVvxnwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="eHeyWsrCgUeI8XUSaf0Y5QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="AL2e0wMT+0K0AC6gZuuhdwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="zIfIWkZ3Lkiq2O9aOGiU/gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="exyb4FNp+Ue9ROAGwoQFcwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[18]" type="UMLClassView" guid="tzICJ64LmUSx1fvEy4dHZQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">580</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">396</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
-<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="6w5B2Z+R1kG+mt3vZl3lVQAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="Cl9ObgtVFEmfwYkvLw0YHwAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvSatellite</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="GhJezIVJAUO7cg/A/n5EdQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="JwksgiMMQ0GQ6xqrv6I4jgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="yCTnlkoiRkSszYJDHrqQuwAA">
-<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="phU5m2tyh0yMlhsYRPe6dwAA">
-<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="S8DZ5jxQq0+WFWPFnQy7iAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[19]" type="UMLAssociationView" guid="5vCGUSmlwUWKkjul/i5CoAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">588,438;393,568</XPD:ATTR>
-<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
-<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:REF name="Tail">tzICJ64LmUSx1fvEy4dHZQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ihIaZz5p+0Cte+Zqg1wUKgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="XyhhchGH70uYaM5UdGboKQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="+N+OW0LtoEyevYQ++bVO1gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="vLsrualWRkO0QI8PcBWGAAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="blnGfW4UCk6tS0veRc88xAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="vWndJmxhrkKfipX/zAAt4AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="jGRa3FaTrUWVhYVG834fjwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="lKgJhvwP/Eygz7oPLvwsxwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="olvLmzjsfka5YmNEOntQDAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="AdMO10glEEWGGHqpzKNvewAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="H/do1s5Rh02ETrOyjtaoaAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[20]" type="UMLClassView" guid="hzoiTuCQqEuArZEejfwdnQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">684</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">344</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">102</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
-<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="bGpo24CeZkuczyv74zkRtAAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="M/nbdX/wf0SiKKXamCKy2gAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvDimension</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="mW7NW23ux06laiKhpkTD7wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="gVAZHA+LzE+/vXDeqIkJrgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="PdTrEGRJOEiEJyD2I9IzJgAA">
-<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="VbdqX2NLOkK2DTLhOA91OwAA">
-<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="K00/VzyqZUmltiuaKWLgAQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[21]" type="UMLAssociationView" guid="EWnB2mjt6ke3pnsnQFRgJwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">699,386;397,568</XPD:ATTR>
-<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
-<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:REF name="Tail">hzoiTuCQqEuArZEejfwdnQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="dM3yo1oYRUWNB1JawgFnywAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="/IP55LSMZUCRoa77gkMh9gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Og4FQYOz9kOr8LF43j+ySwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="zHiCXVqqgE6r2lDdnVDI1gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Ggu7vb3GMU2vn9mS8bGZpwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="19Ii9g15zUmLLURud9e9XAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="wMyvwGpZQUmJ2a2lXlkc/AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="KLCf1m7tBkGvkM3iOxLhJgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="rn/sn4ErGkyYnwDUlnpmTAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="1+qZEhcpyk6RHirwjBjalgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="wElMDINXY0esqBl7AwoyfQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[22]" type="UMLAssociationView" guid="DbUG5zy8r0yq6L/I1naVdQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">324,266;147,336</XPD:ATTR>
-<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
-<XPD:REF name="Head">ybciiFK3jEO6SdfdRt6uAgAA</XPD:REF>
-<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="1qY9qbCT1ka5tmfuL9yaJgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="bnG59/mNjk+fcthvMQG2VAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="wovrqiKgc0qw9BUyPaGuBQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="hytVQ6VnmEaHnFV5o9fQ0AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="JbJSjKTBikyT++rY1XVCtwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="eYodfuyOKEK7WC9dBBlaigAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="wUtw7zNylEK+wDvPOsUtGwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="BEEaANsP0UCbPpRjMWyndwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="/cBBOvztgE6Kd7yvemxXPwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="JKx2O2r/H0y9NJ3+4rup1QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="uj1vGzCGtkGielBw0Bxi4QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[23]" type="UMLAssociationView" guid="l2Yo1ObIG0WVx7IS2a/B3QAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">340,272;173,420</XPD:ATTR>
-<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
-<XPD:REF name="Head">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
-<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Bt1whnZV8ke93vkLSyNq6wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="fqRKs5ARzUGsdlKFgCFhWQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5M/QRFEaxUa0SktETbkRSwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="oOLw6a4XNk6oN6yvhlsf7QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="51OtH+Gyy0+XZJVSgV/KuQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="kMLAHkAn9EKw71vpw3PgHQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="V2pqj6nPg0SqB+TNOQI5PwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="FYDexLT3eUK3X5xdW3Qq/gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="1rWGuTeEqEm+RdcskXCo9gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="VJLq9UMlJE2EqLEbDm23HQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="90vol1uY7U27TcNYwOdZBQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[24]" type="UMLAssociationView" guid="dSXCMAUeXkaVaOqAa4KDAQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">364,272;358,388</XPD:ATTR>
-<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
-<XPD:REF name="Head">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
-<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="AXtWRmQ/j0G8KsAfZc/QeQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="pxhqUzjCEkqTLYfXynALEwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0nagXXOSFk+hHuMBpdFBLwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="z3Q2FaOZNUa329RgqNTDpgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="+0LMOuMUukS68snSkLSsTwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="bIZ0y/4MSEGDbNvxAP+XjAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="ow67AFPFhk2P92GHjX8x6gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="C8AG2Zjc9UCIEaei4/obTgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="cLLrD3Z3uUyN5TkuZIiYvQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="q1TRTMmCmEuxq3mV3WwE9wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="RpANS2KKQEiX7rWNn+sFQQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[25]" type="UMLAssociationView" guid="ALV9IpRzikWc38x/4t62CgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">383,272;484,396</XPD:ATTR>
-<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
-<XPD:REF name="Head">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF>
-<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="8t8bSCYvGkO28nJZE2y4nwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="3EywKQmkOE2KjbjVh2NmDgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="BbqpqccVf0Wg7tVha614JAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="YVFZpgGB/0O96quX2udZDwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="TSgUJz4gCUSqn+dKKulHoAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pIexnuTBiUiEhhq44l4rCwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="bB0rInPRJES1Fi1mh9FCEAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="yT+paMjNpkaG1OKJL+sYCAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Te1GttqM50mrkMzGYceWLQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="znNxDO7m6E6nvS/FYUZ9OAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="XUHdjv1boEaqvLcg553dbwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[26]" type="UMLAssociationView" guid="hBsdq7HI/EWiSzAGC7VcegAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">398,272;587,396</XPD:ATTR>
-<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
-<XPD:REF name="Head">tzICJ64LmUSx1fvEy4dHZQAA</XPD:REF>
-<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="AW09hEar3Einy0/8DRC44wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="GL4o+Jwo9kafQcdPg1ZCtgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="kNZhsHL9skazmf+MM+oIKwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="5T2cPS5X+UykejaXNX6mSAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="VipQilP5w0axs39cx9OCsgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="P16FQXg1DEOld8DfGFfSxQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="m6SZNVehm06iGtccsj43wAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="FcWiwQTsx02Ku0N5G3bjSgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="x2e4QwAQ50Sn6Io3k6B2tAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="d3kqRYSWSUSKKTZ+56sZkwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4MO5fs8bNkahA1cEAQY9zAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[27]" type="UMLAssociationView" guid="Gfgt2UdXqE2QrN+Jzf+QvQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">406,263;684,349</XPD:ATTR>
-<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
-<XPD:REF name="Head">hzoiTuCQqEuArZEejfwdnQAA</XPD:REF>
-<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="/p9rmIUUo0mUctVF/yhY5AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="P5QKAYFqikOaJu107L2QDwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="y/WNtKBGo0q8OYbjC0evjgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="cGwksZvEz0aSTFoED5zuJQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="lELIUkkOg0a4b0G8373BcAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pF9hWJbSZkCUq/C5qcS+7gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="R1FSACG6EkWd7DK8ihYAQAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="/NvtextfvUyZKtMbQ1urHAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="WXg43X5+gEiu4atePea88gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="4pUvTStSU0yU0BtcF8HyfQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="z+QrSf59lkSSqK+c5yKgcwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[28]" type="UMLAssociationView" guid="Z3PDc4i/1UCiaxni9RpD2wAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">756,473;397,581</XPD:ATTR>
-<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
-<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:REF name="Tail">Th+ZwPCIw0CZjtawrnGPrQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="mhm++LaJkk6lJzcTz7hSFgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="IxT95vhnIEyr12fdRQskKQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="d+KXspkLsEa/YezZSZ7YZAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="HxD2Y75aWkSp4d/0R6KiBgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="08HUrDXL5EahpEFi9GJ9yQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="K5rMwb6Iyka5HDC+pxIZOwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="QRLcMMAOqES9/c4itcB3vAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="GfMJbs1/nkShjuqnA/8BBAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="mQFH13/vQUucR5en5l/dUwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="jXmYJVpZxkCkrM3yJ0eHmgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="m0oKw9kT5k2CSLEOl9tV+gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[29]" type="UMLAssociationView" guid="JFsYjMcrU0GkgX8jFqUVZAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">406,252;704,263</XPD:ATTR>
-<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
-<XPD:REF name="Head">vYDCfUgYq0KaBSDnxbpYVgAA</XPD:REF>
-<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="R57gZgKnBkm8aQCFy90fiQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="GznyP+sffEKB3m9dw8jftQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="NM8M6o1EGkWwEmKdXXKpPAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="AoZLFazfK0WqZzhHukFsAwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="vVViwylf/Ei9ld6xTj7WdQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pDauXlrgH0KfuJt30X8zxgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="fhSnklGoSEqMAzQOJY57vwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="QGcntempZkeGNA54l7y1rAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="A5rd4V90HkCp3dmD7wYTbwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NKRAWeqgBEKgb6cHnYpt9QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="n4gqVjygvUK59/wDDHYNJgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[30]" type="UMLClassView" guid="wu+9+Z2tqE2B3qchWKoWdQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">20</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">500</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">119</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">63</XPD:ATTR>
-<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="zRZpHvisoUiNkQtlLufy/AAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="z/By7OpfokuCMZMimH2OSQAA">
-<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
-<XPD:ATTR name="Text" type="string">CTvChannelParams</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="PKd1BAj8BkWUWLwbCv4oegAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="zu1bY/47U0eoDJhSjdTYNAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="KAuxxnmqhkmQ7MLBFq8lRgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Ynggyopqt02II9Rzg7q1VQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="PmvllpBms0ifaPkwzqXvOAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[31]" type="UMLAssociationView" guid="Q/k+TeR21UWA0JPwiSZAnwAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">130,465;103,500</XPD:ATTR>
-<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
-<XPD:REF name="Head">wu+9+Z2tqE2B3qchWKoWdQAA</XPD:REF>
-<XPD:REF name="Tail">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="C2jwipMyN0iMiEays2pVbQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="MxF6R3nqrk+nOid9gUoepAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5CzND/56UUuAy2C5OXPJGAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="VSR1os7RckKbbg+wZ6UPWwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="2P5BNH8K/UKYeriBTZAbSgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="+gO4BIQphEShtlup7FhfcgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="nbxLBw93Oka1PVwDZftA2QAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="3yHNXWsgu0eaPzi0F9a3dgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="X0Z4arOj+EWceCda6Sj0vgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="laRXvwF4WE2wUODF6aCNSQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="lKhOSy40pUOJhnfmNzIx5AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[32]" type="UMLAssociationView" guid="2tALOFJiukSZiwAj9gBDIQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">138,545;312,584</XPD:ATTR>
-<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
-<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:REF name="Tail">wu+9+Z2tqE2B3qchWKoWdQAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="BM0ZC/TOp0CzIS/dSFOgMQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="911s2zFZYUCPtLOmXSDdDgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="bOeJui9AgkWX+he6KT6czQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="lMa33WFxzU2ojAIXkT9IwAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="2U407qHmXE+0VHF/y4trXwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="MAu3FLtcFkOt8a9+Yj8MBAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="16BTtqnINEq6DZln/1Uc4AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Ehl7/9ciY0mjVGRlJGzTegAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="dAD5Dd+Px0eU/Z7MNaXtWgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="FstmADGG7k2p8GVFXyT/GAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="1RtPOXDsOEuSNTqKSxFAKAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedDiagrams[1]" type="UMLClassDiagram" guid="KQsibHBE0E+iq5h5Fks0CQAA">
-<XPD:ATTR name="Name" type="string">tvpackage</XPD:ATTR>
-<XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
-<XPD:ATTR name="DiagramType" type="string">RobustnessDiagram</XPD:ATTR>
-<XPD:REF name="DiagramOwner">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="x/A73wV6JUGNNCNYoihDDgAA">
-<XPD:REF name="Diagram">KQsibHBE0E+iq5h5Fks0CQAA</XPD:REF>
-<XPD:ATTR name="#OwnedViews" type="integer">10</XPD:ATTR>
-<XPD:OBJ name="OwnedViews[0]" type="UMLPackageView" guid="R7RBkUeb+E+5S8gvJN8+QQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">28</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">228</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
-<XPD:REF name="Model">ZRumjrTwgUamBDOstkagPgAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Hex0jIlJWk2QTHp5TF36MwAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="155YNS2IsE2b46plldDuZwAA">
-<XPD:ATTR name="Text" type="string">atv</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="gqZ/H0j6nkqKMGqx1OqzOgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="mK5kp4doeUC6dn5S5jvPHAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[1]" type="UMLPackageView" guid="fCE1/LJF8k+yzWx4bHj2WgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">336</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">224</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
-<XPD:REF name="Model">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="N9Ut8OrmLU6VnX16D13WOwAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="Yz9HR5DzxEuE9o9uHImtSQAA">
-<XPD:ATTR name="Text" type="string">dtv</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="LDxg9fdTakmhArzVxsd2GQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="L/ePjmLKwUeEeTrRhsEKMgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[2]" type="UMLPackageView" guid="H1zFqxbUzEqKqOJUsjP9UgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">260</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">72</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
-<XPD:REF name="Model">7dRihysn8kefkb+6mJlwzgAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="f7UEhckiS0qQAoQ5jk3q5wAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="J4t7wKCRQk6ZH6fs1Q9YrgAA">
-<XPD:ATTR name="Text" type="string">tvjava</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="9qa1Yi+fukyu0We9ci5u/AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="+iZgsEiKfUmY0m8L9nAURwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[3]" type="UMLAssociationView" guid="G0kUvklDf0uhBeIUoV+srgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">267,141;138,228</XPD:ATTR>
-<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
-<XPD:REF name="Head">R7RBkUeb+E+5S8gvJN8+QQAA</XPD:REF>
-<XPD:REF name="Tail">H1zFqxbUzEqKqOJUsjP9UgAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="6o6l7Ax4b0uvR1w70cdJiAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="3ZsGQfCQIk+ZPFC1FyyVeQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="BCGhRmtL7kmoY1iXaapJOwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="SuRONY2jREyvBHGP7nheBQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="zqmFgnNCJ0mU+9gnrH18SwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="l9UCuL7VoEm7vFLWkobdoAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="yt3drhX0N0aispBa+C83TAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="8rSGjmyTy0iar869slrlPgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="QE0xM9HZIUK4iQSOifSKDQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NYMZ1wuIcUy7G5VODIYIDQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="L3X2M2UWvECpCLZj42krJAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="+dr3aeLg8k2RQ8khsHmmqAAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">336,141;378,224</XPD:ATTR>
-<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
-<XPD:REF name="Head">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF>
-<XPD:REF name="Tail">H1zFqxbUzEqKqOJUsjP9UgAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="eiIT0uNCpUywEWk7FrhutgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="m5vcHblPLUe9VZHiD1lPzgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="dHGIMYC9dUeyteDUvxEuNgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="bVRmxC4LeEivBU8rO/l1IwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="DGGWcQw7xESguDo8y8c9JwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Brf+/LZbFEamowtJ6zGOAgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="YyNOaiAWMU6urAt6uMo51wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="/6WmiwEpmUGnLzBRc6lCzwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="RjfRt8utjEiWYhIQFBxLqgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="eme8PTCUYkiREXPCAN1ACgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="HRQ1wVKzDUe1hazbUuDnVwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[5]" type="UMLPackageView" guid="HUFrn02Id0u4EHrKc4mxVgAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">528</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">308</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
-<XPD:REF name="Model">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="I7oFyXOyn0ap6db6aB27kQAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="UZqAJSuU3kSCM+H7F0CJAwAA">
-<XPD:ATTR name="Text" type="string">am_mw</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="uBO1MGx+MkeMvQYhb1C2NQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="kl+qD1R9/USAxQT6CzXArgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[6]" type="UMLPackageView" guid="I+6GQQgDxUay2yh9EH63ugAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">296</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">428</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
-<XPD:REF name="Model">y05IqzZQzU2XtiSPAXk7QgAA</XPD:REF>
-<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="9hBSRpfEY02ywkAvNDqTXQAA">
-<XPD:OBJ name="NameLabel" type="LabelView" guid="h6PfAdCi8kytI+NLcAHmLAAA">
-<XPD:ATTR name="Text" type="string">am_adp</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="lQixSy3pSUqBMXv0rFJpcQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="LabelView" guid="GkA9EEwFZkyyC6WEJrJkMAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="jyEOqiMx5kuOhl2RypG5igAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">455,284;528,316</XPD:ATTR>
-<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
-<XPD:REF name="Head">HUFrn02Id0u4EHrKc4mxVgAA</XPD:REF>
-<XPD:REF name="Tail">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="CPHJazCBZ06NtAVR2VK7OQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="APOmD3psFUyWhRAnwzCajwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="QMsE3esBJk6sDRS6x5DJkQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="5/4cIerJAUmV49IBGwpo+AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Pet1Wl/5g0+pU9Kd2fc7SwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="xdfe8bjolEChoIUMuakZ8gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Dx+9oTBsHEO70cjv4b2azAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="BoU11LZqBk2U9D1Ai1YY2AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="GAWp04mbX0+qBItsdvgjYwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="fBqd46+r3kqJEpg8jQ4//wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="EDyc+T9/p0uT65Az3US0YgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="YWFKeOxwm0mHujDlyTbolQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">388,293;362,428</XPD:ATTR>
-<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
-<XPD:REF name="Head">I+6GQQgDxUay2yh9EH63ugAA</XPD:REF>
-<XPD:REF name="Tail">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="zrsbj2XE/EayNVwoOloIDAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="pIYrJ7JAAUSz3n/qiGAv0gAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="qoKs5KXOckiwAYzN24SMoQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="5Y/PPNFnoUOKREH8OSaNBwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="88cAHmNV00eS5otEvuUQZAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="OURlWAjS10SUcdK4oeUXcwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="+YTxAPro+k+Ev3Qa9Td+KAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="NJe8vUJOvEixN2Md5vRGkgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="BuekzgD4P0aqdOzNBAVkYAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="5Y0Wg3PhS06h+5PmVU/QJAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="zTwLHGMcZUaH/kCRcMqJlQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="G47JdG1ivEWpCS5+NGRUWQAA">
-<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
-<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
-<XPD:ATTR name="Points" type="Points">528,373;415,431</XPD:ATTR>
-<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
-<XPD:REF name="Head">I+6GQQgDxUay2yh9EH63ugAA</XPD:REF>
-<XPD:REF name="Tail">HUFrn02Id0u4EHrKc4mxVgAA</XPD:REF>
-<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="u6LdVCjKbEaIGLn56/w1QQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ona2Ko0szEK+2FIv3L6R1wAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="fST4kYS4rkicfRLiq6BrYQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
-<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="AnTjwQSX4UO3xjKGm9U1PAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="GtS+L0c22kmmx+S6raeEAAAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Rx+SX1Ukc0WijFhZRJ2tbgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="r48AH3NG+kGYdG2dItOtqwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="OMlcQeewVkyEmkWpq768pgAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
-<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="C6OdcHaGUEG0WccqDQbNoQAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
-<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
-<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
-<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="61/4k03iIkWp5ZY6aFMm4AAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-912</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="aRw7UJOi9kaUwJX2uJ1tDwAA">
-<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
-<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
-<XPD:ATTR name="Top" type="integer">-912</XPD:ATTR>
-<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
-<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
-<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:ATTR name="#OwnedElements" type="integer">31</XPD:ATTR>
-<XPD:OBJ name="OwnedElements[0]" type="UMLAssociation" guid="av0s6EXaYUKyooee2y6sdgAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">12BWSnVhhUOUuox7tdL41gAA</XPD:REF>
-<XPD:REF name="Views[1]">4F+C2zwwrEOjx/qCnLXWPAAA</XPD:REF>
-<XPD:REF name="Views[2]">lXf6uq0JtkK3YNXTxTyP7wAA</XPD:REF>
-<XPD:REF name="Views[3]">8jym3kotyE2sBWD5KjhUiQAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="IEnUwW74QkSkdRZGqdKvaAAA">
-<XPD:REF name="Association">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
-<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">awNg1wfSGU22on1C+XpBlgAA</XPD:REF>
-<XPD:REF name="Views[1]">cGTSA3bQb0S81NQzsTj+QQAA</XPD:REF>
-<XPD:REF name="Views[2]">LWsKT6dOQUKXma9Eoh+sUwAA</XPD:REF>
-<XPD:REF name="Views[3]">l9TSA+eftkCY2p6qZDMGKAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="GZcPUasbnkG3pyGKV6NFnAAA">
-<XPD:REF name="Association">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
-<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">ioK1huVib0u6ILv3kHAeeQAA</XPD:REF>
-<XPD:REF name="Views[1]">cwfxPIXUd06ShM9BEivzxQAA</XPD:REF>
-<XPD:REF name="Views[2]">DBsnRjqoj0W9eAN/Flu+jwAA</XPD:REF>
-<XPD:REF name="Views[3]">DUu549wQM0qPn9dAjjrLZgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[1]" type="UMLAssociation" guid="cNCsWS2hgkeaGhYJv9oONgAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Qa1PhzSwWkyS1rm6eapfLwAA</XPD:REF>
-<XPD:REF name="Views[1]">QAoFSXFK+0S+5kDYAQ0LsgAA</XPD:REF>
-<XPD:REF name="Views[2]">rsOqshNVOkut6r+wW0Sp/wAA</XPD:REF>
-<XPD:REF name="Views[3]">0wZW9IH3y0OEPMfN5FyHQAAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="PFZlUbzZu02nTTLsYZBoDgAA">
-<XPD:REF name="Association">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">TM3RNruxzEezNhF8XO/FmwAA</XPD:REF>
-<XPD:REF name="Views[1]">NpASusGGKU+/KwcKkTAMogAA</XPD:REF>
-<XPD:REF name="Views[2]">3dtXpNLbXka7wekzvAWsXQAA</XPD:REF>
-<XPD:REF name="Views[3]">Mvk2196ldk+5GLgct+OKuwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="2JZlFpDZPkGgaoWrrPAGXAAA">
-<XPD:REF name="Association">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
-<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">ySD9HMBWmEWoJg+/6boBZgAA</XPD:REF>
-<XPD:REF name="Views[1]">LXz8D2AdoE6ojzgkYCO0qAAA</XPD:REF>
-<XPD:REF name="Views[2]">ia8j06EduUmxgB5smbA9hQAA</XPD:REF>
-<XPD:REF name="Views[3]">/JYlnmhzTk66TicK0RjYaQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[2]" type="UMLAssociation" guid="CVx7QaOEd0iJQ6USdSCilwAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">UmHHYiIr3k+gNNomjLpgwwAA</XPD:REF>
-<XPD:REF name="Views[1]">ZBlvBeIE2UGGPTML4sQ7SgAA</XPD:REF>
-<XPD:REF name="Views[2]">UDn5R84weEayOYl6QVFj1wAA</XPD:REF>
-<XPD:REF name="Views[3]">OApAa7HXz0aTiMZGZ/g2tAAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="q5Ko0bXKcE6uj05NJPSddwAA">
-<XPD:REF name="Association">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">24RGLobteEil7cUdAcyUcAAA</XPD:REF>
-<XPD:REF name="Views[1]">6Uw1pdad6kC8N8S0Rf1HxwAA</XPD:REF>
-<XPD:REF name="Views[2]">CuUsJAcsAUWwVZJzegOegAAA</XPD:REF>
-<XPD:REF name="Views[3]">AST9GWgDTEWR07o7yUcgIQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="XvxorIQvl0aKnzyznjd1uwAA">
-<XPD:REF name="Association">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
-<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">W1YT5dqwMUSUI29zCC2LZQAA</XPD:REF>
-<XPD:REF name="Views[1]">X96IIfOZSE2FAliwKkCNYgAA</XPD:REF>
-<XPD:REF name="Views[2]">tr7uiHRKz0e//ValH5GU+AAA</XPD:REF>
-<XPD:REF name="Views[3]">zdcHIs6dNEmxQNtCK5uHIQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[3]" type="UMLAssociation" guid="hBOTE33GDUO/X8s5oHlAmQAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">oYsj3yhzJkCKmOBcWIHNDwAA</XPD:REF>
-<XPD:REF name="Views[1]">GT6R2h3HkU6LThPKaghC1QAA</XPD:REF>
-<XPD:REF name="Views[2]">eWMr3v5Qb0y/nXu2s/EP5wAA</XPD:REF>
-<XPD:REF name="Views[3]">GR9gxzUjNkKmujWHFobLtAAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="qOlPMeLYpUC4lTEl3Hsc8QAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
-<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">UuRRAQf+y0OdXTOvWu7nUAAA</XPD:REF>
-<XPD:REF name="Views[1]">vI5c+acLSk6IfCcdqlaBggAA</XPD:REF>
-<XPD:REF name="Views[2]">w3rpxhxEsEu0y7myhFrrkQAA</XPD:REF>
-<XPD:REF name="Views[3]">8Ip2rQJRaEaPAOW0cJSd/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Yo1IoB0X3ka1C+a/6xk1/gAA">
-<XPD:REF name="Association">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">+SSR3TM1z0m5UkTLiuMrGwAA</XPD:REF>
-<XPD:REF name="Views[1]">Uvo2ryiBg0Oa5GJF4TRyhQAA</XPD:REF>
-<XPD:REF name="Views[2]">QBI1NHwjWU2dkj+SLUFZ+AAA</XPD:REF>
-<XPD:REF name="Views[3]">IYVJT/RjPUqjv8rl6ZIQiwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[4]" type="UMLAssociation" guid="/X1BIuClXkywNV1vNa/LWwAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Vcgjd9eKakOjuUAjwzzhJgAA</XPD:REF>
-<XPD:REF name="Views[1]">+iIIR1mEnUynEPEjuGAd7AAA</XPD:REF>
-<XPD:REF name="Views[2]">bZn71kXJQUOP3yAyCa5RvgAA</XPD:REF>
-<XPD:REF name="Views[3]">O36co7nFz0elpJnbKtsYMwAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="BVpPYPY4V0KsTBJTRoLjyAAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
-<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Hv4K+XlgIkqDgqEz3aQWNQAA</XPD:REF>
-<XPD:REF name="Views[1]">4o7M8jakfkixRwVgESrUnwAA</XPD:REF>
-<XPD:REF name="Views[2]">rCPaxzL0LEuk9Jjbqi+D2gAA</XPD:REF>
-<XPD:REF name="Views[3]">HKXhPda/vUuVwv4sR9ZR9QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="RoKhf4Bw3kmRk2O2D4GlxQAA">
-<XPD:REF name="Association">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">yjjLYCXJjUqX0IHnpKwHwQAA</XPD:REF>
-<XPD:REF name="Views[1]">k1XiyO9mlke/IAq5UuYI9gAA</XPD:REF>
-<XPD:REF name="Views[2]">Xtc7Jqe6N0+JAzLg1RxYLwAA</XPD:REF>
-<XPD:REF name="Views[3]">W0UPJtBpLU6Y5SjscWTiVAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[5]" type="UMLAssociation" guid="PudswW77eEShTMEdcK5BCAAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">VjZwKWmCoUO5wNRGJGVShAAA</XPD:REF>
-<XPD:REF name="Views[1]">6e9pHkpPaUyLDCYYnUYAOAAA</XPD:REF>
-<XPD:REF name="Views[2]">QA7tnAAMA0e3tCDRlkB/JwAA</XPD:REF>
-<XPD:REF name="Views[3]">gdUdn5u5x0KDsDKM41p2CQAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="Io3cINfhiE23pmiSxpS6swAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
-<XPD:REF name="Participant">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">d/3xrtQ+nU69mQYepo7NvQAA</XPD:REF>
-<XPD:REF name="Views[1]">HcOo4bUmbUqLEjVUm2L2AQAA</XPD:REF>
-<XPD:REF name="Views[2]">tQj+naSiJ0mB4W89ahH5ygAA</XPD:REF>
-<XPD:REF name="Views[3]">LNFybtIVIkOXnQ/9QC5jEwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="vyoQZGl3UECBMhf7+IDQUwAA">
-<XPD:REF name="Association">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">rqoTwNlD20Gou9xOLQ2RNgAA</XPD:REF>
-<XPD:REF name="Views[1]">ox9r7npaB0in7/ygfG1ZMwAA</XPD:REF>
-<XPD:REF name="Views[2]">exLwGLRY306J0CEcqxlOrgAA</XPD:REF>
-<XPD:REF name="Views[3]">qxZgk8R36k2S3vGRfQegfwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="q5PurOmOUUOX8hzj5CINYQAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">QHk4xsvJRUGhKn0p+sReaAAA</XPD:REF>
-<XPD:REF name="Views[1]">ezGCtUA0dUOn10D5pUOtoAAA</XPD:REF>
-<XPD:REF name="Views[2]">QcGPzg741ki4yTGfoKvK9AAA</XPD:REF>
-<XPD:REF name="Views[3]">ioZQYN39bEu/gy37UfkhmQAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="PhlKgbqPt0OClpwk2m9vswAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
-<XPD:REF name="Participant">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">VrmcPyj2oUyEm5i/AG7/KgAA</XPD:REF>
-<XPD:REF name="Views[1]">odMtivppNUOccWtC85AVCQAA</XPD:REF>
-<XPD:REF name="Views[2]">2IiGGrbDkUiobp5CJnME1QAA</XPD:REF>
-<XPD:REF name="Views[3]">+70t9Os6zUWhIAhufEQsBAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="iy8GVdK11EmKnmJ6LivVVQAA">
-<XPD:REF name="Association">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">mZFBakBXmE6Gj5qumz51gwAA</XPD:REF>
-<XPD:REF name="Views[1]">KHpH30oHrEew1AGquvXiEQAA</XPD:REF>
-<XPD:REF name="Views[2]">W7KAnZMmjEKAxuaUXA4D6AAA</XPD:REF>
-<XPD:REF name="Views[3]">jsiact/gpUS21gy1IeSlZQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="8zCqordbBESBaPJH8SIoOQAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">l3oAx6sfA0ScCOouvAFKYwAA</XPD:REF>
-<XPD:REF name="Views[1]">pM/XXFo9Ikq+kK5++HoZ0QAA</XPD:REF>
-<XPD:REF name="Views[2]">igklIYxpfka7OH5oAnRbPwAA</XPD:REF>
-<XPD:REF name="Views[3]">RtZQfGM0uUqohb/WlARRpwAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="72fG4kbiM0eyczFPq2MtVAAA">
-<XPD:ATTR name="Multiplicity" type="string">1..*</XPD:ATTR>
-<XPD:REF name="Association">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
-<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">pr9mkVSNO0KasNMsFvgDuQAA</XPD:REF>
-<XPD:REF name="Views[1]">4fUHmnlcd0WplogWZWqPRQAA</XPD:REF>
-<XPD:REF name="Views[2]">kKRq4K1cvEup70Oz2UFd8QAA</XPD:REF>
-<XPD:REF name="Views[3]">DS2eOvXKXku93Y4x950QPgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="zefo1Bu+v0e4gn9nUL+bSQAA">
-<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
-<XPD:REF name="Association">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
-<XPD:REF name="Participant">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">lDsB+MeNlUy+OEBCbfs0OAAA</XPD:REF>
-<XPD:REF name="Views[1]">EeUDIEWsnkO5HzTU6L6kZQAA</XPD:REF>
-<XPD:REF name="Views[2]">TuyQdZk0H0+ai9Mg3ZtK3AAA</XPD:REF>
-<XPD:REF name="Views[3]">NKw56kYvx0W0KlwhXPYWMwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="3RrM1HB71kyHO0jB4JI4zgAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">5vCGUSmlwUWKkjul/i5CoAAA</XPD:REF>
-<XPD:REF name="Views[1]">ihIaZz5p+0Cte+Zqg1wUKgAA</XPD:REF>
-<XPD:REF name="Views[2]">XyhhchGH70uYaM5UdGboKQAA</XPD:REF>
-<XPD:REF name="Views[3]">+N+OW0LtoEyevYQ++bVO1gAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="ULQw0JNjPE2758pFWlo+MQAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
-<XPD:REF name="Participant">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">blnGfW4UCk6tS0veRc88xAAA</XPD:REF>
-<XPD:REF name="Views[1]">jGRa3FaTrUWVhYVG834fjwAA</XPD:REF>
-<XPD:REF name="Views[2]">olvLmzjsfka5YmNEOntQDAAA</XPD:REF>
-<XPD:REF name="Views[3]">H/do1s5Rh02ETrOyjtaoaAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="DkcX/fIec029p5Da5gYToAAA">
-<XPD:REF name="Association">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">vLsrualWRkO0QI8PcBWGAAAA</XPD:REF>
-<XPD:REF name="Views[1]">vWndJmxhrkKfipX/zAAt4AAA</XPD:REF>
-<XPD:REF name="Views[2]">lKgJhvwP/Eygz7oPLvwsxwAA</XPD:REF>
-<XPD:REF name="Views[3]">AdMO10glEEWGGHqpzKNvewAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[9]" type="UMLAssociation" guid="GjMZbUwaMkGOkbxOXau26AAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">EWnB2mjt6ke3pnsnQFRgJwAA</XPD:REF>
-<XPD:REF name="Views[1]">dM3yo1oYRUWNB1JawgFnywAA</XPD:REF>
-<XPD:REF name="Views[2]">/IP55LSMZUCRoa77gkMh9gAA</XPD:REF>
-<XPD:REF name="Views[3]">Og4FQYOz9kOr8LF43j+ySwAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="aYL27tYOR02se3g//aEBeAAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
-<XPD:REF name="Participant">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Ggu7vb3GMU2vn9mS8bGZpwAA</XPD:REF>
-<XPD:REF name="Views[1]">wMyvwGpZQUmJ2a2lXlkc/AAA</XPD:REF>
-<XPD:REF name="Views[2]">rn/sn4ErGkyYnwDUlnpmTAAA</XPD:REF>
-<XPD:REF name="Views[3]">wElMDINXY0esqBl7AwoyfQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="gc0GlJ6ewUOpiyya+XPqjQAA">
-<XPD:REF name="Association">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">zHiCXVqqgE6r2lDdnVDI1gAA</XPD:REF>
-<XPD:REF name="Views[1]">19Ii9g15zUmLLURud9e9XAAA</XPD:REF>
-<XPD:REF name="Views[2]">KLCf1m7tBkGvkM3iOxLhJgAA</XPD:REF>
-<XPD:REF name="Views[3]">1+qZEhcpyk6RHirwjBjalgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="m6lnHtsBL02A4Oup+IzVEAAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">DbUG5zy8r0yq6L/I1naVdQAA</XPD:REF>
-<XPD:REF name="Views[1]">1qY9qbCT1ka5tmfuL9yaJgAA</XPD:REF>
-<XPD:REF name="Views[2]">bnG59/mNjk+fcthvMQG2VAAA</XPD:REF>
-<XPD:REF name="Views[3]">wovrqiKgc0qw9BUyPaGuBQAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="kdbNMfgoG02cJO0UFJeeLwAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
-<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">JbJSjKTBikyT++rY1XVCtwAA</XPD:REF>
-<XPD:REF name="Views[1]">wUtw7zNylEK+wDvPOsUtGwAA</XPD:REF>
-<XPD:REF name="Views[2]">/cBBOvztgE6Kd7yvemxXPwAA</XPD:REF>
-<XPD:REF name="Views[3]">uj1vGzCGtkGielBw0Bxi4QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="l6Lg/NJG5UWu+7ALxaVP3gAA">
-<XPD:REF name="Association">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
-<XPD:REF name="Participant">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">hytVQ6VnmEaHnFV5o9fQ0AAA</XPD:REF>
-<XPD:REF name="Views[1]">eYodfuyOKEK7WC9dBBlaigAA</XPD:REF>
-<XPD:REF name="Views[2]">BEEaANsP0UCbPpRjMWyndwAA</XPD:REF>
-<XPD:REF name="Views[3]">JKx2O2r/H0y9NJ3+4rup1QAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[11]" type="UMLAssociation" guid="gmKjyBaRB0SfVd2p3FDOTwAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">l2Yo1ObIG0WVx7IS2a/B3QAA</XPD:REF>
-<XPD:REF name="Views[1]">Bt1whnZV8ke93vkLSyNq6wAA</XPD:REF>
-<XPD:REF name="Views[2]">fqRKs5ARzUGsdlKFgCFhWQAA</XPD:REF>
-<XPD:REF name="Views[3]">5M/QRFEaxUa0SktETbkRSwAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="X5VvOi2uGkGYzMMS5nWm2AAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
-<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">51OtH+Gyy0+XZJVSgV/KuQAA</XPD:REF>
-<XPD:REF name="Views[1]">V2pqj6nPg0SqB+TNOQI5PwAA</XPD:REF>
-<XPD:REF name="Views[2]">1rWGuTeEqEm+RdcskXCo9gAA</XPD:REF>
-<XPD:REF name="Views[3]">90vol1uY7U27TcNYwOdZBQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="QwwfXlN26EahMaF2XDAvLAAA">
-<XPD:REF name="Association">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
-<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">oOLw6a4XNk6oN6yvhlsf7QAA</XPD:REF>
-<XPD:REF name="Views[1]">kMLAHkAn9EKw71vpw3PgHQAA</XPD:REF>
-<XPD:REF name="Views[2]">FYDexLT3eUK3X5xdW3Qq/gAA</XPD:REF>
-<XPD:REF name="Views[3]">VJLq9UMlJE2EqLEbDm23HQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="iBQV0DXX90uUjMTGr6FFjQAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">dSXCMAUeXkaVaOqAa4KDAQAA</XPD:REF>
-<XPD:REF name="Views[1]">AXtWRmQ/j0G8KsAfZc/QeQAA</XPD:REF>
-<XPD:REF name="Views[2]">pxhqUzjCEkqTLYfXynALEwAA</XPD:REF>
-<XPD:REF name="Views[3]">0nagXXOSFk+hHuMBpdFBLwAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="xf4XKZpxx0iF7C4H+oOABwAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
-<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">+0LMOuMUukS68snSkLSsTwAA</XPD:REF>
-<XPD:REF name="Views[1]">ow67AFPFhk2P92GHjX8x6gAA</XPD:REF>
-<XPD:REF name="Views[2]">cLLrD3Z3uUyN5TkuZIiYvQAA</XPD:REF>
-<XPD:REF name="Views[3]">RpANS2KKQEiX7rWNn+sFQQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="IMPiiZPlxkaJkH8N2NGOggAA">
-<XPD:REF name="Association">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
-<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">z3Q2FaOZNUa329RgqNTDpgAA</XPD:REF>
-<XPD:REF name="Views[1]">bIZ0y/4MSEGDbNvxAP+XjAAA</XPD:REF>
-<XPD:REF name="Views[2]">C8AG2Zjc9UCIEaei4/obTgAA</XPD:REF>
-<XPD:REF name="Views[3]">q1TRTMmCmEuxq3mV3WwE9wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[13]" type="UMLAssociation" guid="9P0hz9Bq2U6gDVowATxiWAAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">ALV9IpRzikWc38x/4t62CgAA</XPD:REF>
-<XPD:REF name="Views[1]">8t8bSCYvGkO28nJZE2y4nwAA</XPD:REF>
-<XPD:REF name="Views[2]">3EywKQmkOE2KjbjVh2NmDgAA</XPD:REF>
-<XPD:REF name="Views[3]">BbqpqccVf0Wg7tVha614JAAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="yVknRLQq7U2nj3bRfizyAgAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
-<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">TSgUJz4gCUSqn+dKKulHoAAA</XPD:REF>
-<XPD:REF name="Views[1]">bB0rInPRJES1Fi1mh9FCEAAA</XPD:REF>
-<XPD:REF name="Views[2]">Te1GttqM50mrkMzGYceWLQAA</XPD:REF>
-<XPD:REF name="Views[3]">XUHdjv1boEaqvLcg553dbwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="BSJLLgAd4kCusm/8BFZQMQAA">
-<XPD:REF name="Association">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
-<XPD:REF name="Participant">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">YVFZpgGB/0O96quX2udZDwAA</XPD:REF>
-<XPD:REF name="Views[1]">pIexnuTBiUiEhhq44l4rCwAA</XPD:REF>
-<XPD:REF name="Views[2]">yT+paMjNpkaG1OKJL+sYCAAA</XPD:REF>
-<XPD:REF name="Views[3]">znNxDO7m6E6nvS/FYUZ9OAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[14]" type="UMLAssociation" guid="sBsUoQYdEkCsxRTpPtknYAAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">hBsdq7HI/EWiSzAGC7VcegAA</XPD:REF>
-<XPD:REF name="Views[1]">AW09hEar3Einy0/8DRC44wAA</XPD:REF>
-<XPD:REF name="Views[2]">GL4o+Jwo9kafQcdPg1ZCtgAA</XPD:REF>
-<XPD:REF name="Views[3]">kNZhsHL9skazmf+MM+oIKwAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="6CsrL0wlVEKI657OoEev1gAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
-<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">VipQilP5w0axs39cx9OCsgAA</XPD:REF>
-<XPD:REF name="Views[1]">m6SZNVehm06iGtccsj43wAAA</XPD:REF>
-<XPD:REF name="Views[2]">x2e4QwAQ50Sn6Io3k6B2tAAA</XPD:REF>
-<XPD:REF name="Views[3]">4MO5fs8bNkahA1cEAQY9zAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="bObyymjPEkeQZSoHCKpP2QAA">
-<XPD:REF name="Association">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
-<XPD:REF name="Participant">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">5T2cPS5X+UykejaXNX6mSAAA</XPD:REF>
-<XPD:REF name="Views[1]">P16FQXg1DEOld8DfGFfSxQAA</XPD:REF>
-<XPD:REF name="Views[2]">FcWiwQTsx02Ku0N5G3bjSgAA</XPD:REF>
-<XPD:REF name="Views[3]">d3kqRYSWSUSKKTZ+56sZkwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[15]" type="UMLAssociation" guid="5JmzC90ylki6klhVRRibGAAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Gfgt2UdXqE2QrN+Jzf+QvQAA</XPD:REF>
-<XPD:REF name="Views[1]">/p9rmIUUo0mUctVF/yhY5AAA</XPD:REF>
-<XPD:REF name="Views[2]">P5QKAYFqikOaJu107L2QDwAA</XPD:REF>
-<XPD:REF name="Views[3]">y/WNtKBGo0q8OYbjC0evjgAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="be+eScBkV0Cn4n2XjSojvgAA">
-<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
-<XPD:REF name="Association">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
-<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">lELIUkkOg0a4b0G8373BcAAA</XPD:REF>
-<XPD:REF name="Views[1]">R1FSACG6EkWd7DK8ihYAQAAA</XPD:REF>
-<XPD:REF name="Views[2]">WXg43X5+gEiu4atePea88gAA</XPD:REF>
-<XPD:REF name="Views[3]">z+QrSf59lkSSqK+c5yKgcwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="zCPl48BYx0CFRkp8Jj5mogAA">
-<XPD:REF name="Association">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
-<XPD:REF name="Participant">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">cGwksZvEz0aSTFoED5zuJQAA</XPD:REF>
-<XPD:REF name="Views[1]">pF9hWJbSZkCUq/C5qcS+7gAA</XPD:REF>
-<XPD:REF name="Views[2]">/NvtextfvUyZKtMbQ1urHAAA</XPD:REF>
-<XPD:REF name="Views[3]">4pUvTStSU0yU0BtcF8HyfQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[16]" type="UMLPackage" guid="7dRihysn8kefkb+6mJlwzgAA">
-<XPD:ATTR name="Name" type="string">tvjava</XPD:ATTR>
-<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPackage</XPD:ATTR>
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
-<XPD:REF name="Views[0]">H1zFqxbUzEqKqOJUsjP9UgAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
-<XPD:REF name="Associations[0]">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
-<XPD:REF name="Associations[1]">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
-<XPD:REF name="Associations[2]">frvBY5I3t0yZgEqYHUhfEQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[17]" type="UMLPackage" guid="CN6L5smMd0u/4SQDgGuxlAAA">
-<XPD:ATTR name="Name" type="string">am_mw</XPD:ATTR>
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
-<XPD:REF name="Views[0]">HUFrn02Id0u4EHrKc4mxVgAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
-<XPD:REF name="Associations[0]">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
-<XPD:REF name="Associations[1]">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
-<XPD:REF name="Associations[2]">0RZNIMepB0W9fkd6pMCEZwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[18]" type="UMLPackage" guid="y05IqzZQzU2XtiSPAXk7QgAA">
-<XPD:ATTR name="Name" type="string">am_adp</XPD:ATTR>
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
-<XPD:REF name="Views[0]">I+6GQQgDxUay2yh9EH63ugAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
-<XPD:REF name="Associations[0]">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
-<XPD:REF name="Associations[1]">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[19]" type="UMLAssociation" guid="Yy1zZGFqjUCrfxwigF/GpgAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">jyEOqiMx5kuOhl2RypG5igAA</XPD:REF>
-<XPD:REF name="Views[1]">CPHJazCBZ06NtAVR2VK7OQAA</XPD:REF>
-<XPD:REF name="Views[2]">APOmD3psFUyWhRAnwzCajwAA</XPD:REF>
-<XPD:REF name="Views[3]">QMsE3esBJk6sDRS6x5DJkQAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="KeKc5deyJkKjIbzodSAF8QAA">
-<XPD:REF name="Association">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
-<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Pet1Wl/5g0+pU9Kd2fc7SwAA</XPD:REF>
-<XPD:REF name="Views[1]">Dx+9oTBsHEO70cjv4b2azAAA</XPD:REF>
-<XPD:REF name="Views[2]">GAWp04mbX0+qBItsdvgjYwAA</XPD:REF>
-<XPD:REF name="Views[3]">EDyc+T9/p0uT65Az3US0YgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="MOhicSFw0kKsC3+R+Reo0AAA">
-<XPD:REF name="Association">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
-<XPD:REF name="Participant">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">5/4cIerJAUmV49IBGwpo+AAA</XPD:REF>
-<XPD:REF name="Views[1]">xdfe8bjolEChoIUMuakZ8gAA</XPD:REF>
-<XPD:REF name="Views[2]">BoU11LZqBk2U9D1Ai1YY2AAA</XPD:REF>
-<XPD:REF name="Views[3]">fBqd46+r3kqJEpg8jQ4//wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[20]" type="UMLAssociation" guid="+rFPRw7qR0aoTGBGytrjDAAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">YWFKeOxwm0mHujDlyTbolQAA</XPD:REF>
-<XPD:REF name="Views[1]">zrsbj2XE/EayNVwoOloIDAAA</XPD:REF>
-<XPD:REF name="Views[2]">pIYrJ7JAAUSz3n/qiGAv0gAA</XPD:REF>
-<XPD:REF name="Views[3]">qoKs5KXOckiwAYzN24SMoQAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="osliKvkWrU6Jd0FLz/mZngAA">
-<XPD:REF name="Association">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
-<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">88cAHmNV00eS5otEvuUQZAAA</XPD:REF>
-<XPD:REF name="Views[1]">+YTxAPro+k+Ev3Qa9Td+KAAA</XPD:REF>
-<XPD:REF name="Views[2]">BuekzgD4P0aqdOzNBAVkYAAA</XPD:REF>
-<XPD:REF name="Views[3]">zTwLHGMcZUaH/kCRcMqJlQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="n4pg4fd/GUuaJaSzXBirOAAA">
-<XPD:REF name="Association">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
-<XPD:REF name="Participant">y05IqzZQzU2XtiSPAXk7QgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">5Y/PPNFnoUOKREH8OSaNBwAA</XPD:REF>
-<XPD:REF name="Views[1]">OURlWAjS10SUcdK4oeUXcwAA</XPD:REF>
-<XPD:REF name="Views[2]">NJe8vUJOvEixN2Md5vRGkgAA</XPD:REF>
-<XPD:REF name="Views[3]">5Y0Wg3PhS06h+5PmVU/QJAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[21]" type="UMLAssociation" guid="eNd3z1weKEWCnlfqPTDLIgAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">G47JdG1ivEWpCS5+NGRUWQAA</XPD:REF>
-<XPD:REF name="Views[1]">u6LdVCjKbEaIGLn56/w1QQAA</XPD:REF>
-<XPD:REF name="Views[2]">ona2Ko0szEK+2FIv3L6R1wAA</XPD:REF>
-<XPD:REF name="Views[3]">fST4kYS4rkicfRLiq6BrYQAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="elujImCAXkaoOjRAKkuxUAAA">
-<XPD:REF name="Association">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
-<XPD:REF name="Participant">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">GtS+L0c22kmmx+S6raeEAAAA</XPD:REF>
-<XPD:REF name="Views[1]">r48AH3NG+kGYdG2dItOtqwAA</XPD:REF>
-<XPD:REF name="Views[2]">C6OdcHaGUEG0WccqDQbNoQAA</XPD:REF>
-<XPD:REF name="Views[3]">aRw7UJOi9kaUwJX2uJ1tDwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="SVDzdW2e/kG2il66SgxQ1wAA">
-<XPD:REF name="Association">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
-<XPD:REF name="Participant">y05IqzZQzU2XtiSPAXk7QgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">AnTjwQSX4UO3xjKGm9U1PAAA</XPD:REF>
-<XPD:REF name="Views[1]">Rx+SX1Ukc0WijFhZRJ2tbgAA</XPD:REF>
-<XPD:REF name="Views[2]">OMlcQeewVkyEmkWpq768pgAA</XPD:REF>
-<XPD:REF name="Views[3]">61/4k03iIkWp5ZY6aFMm4AAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[22]" type="UMLPackage" guid="bnJ8ggSchket3/t1l7Kx4wAA">
-<XPD:ATTR name="Name" type="string">tv</XPD:ATTR>
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#OwnedElements" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="OwnedElements[0]" type="UMLPackage" guid="T1P4Xv7L+UuEzFqU+iyS5wAA">
-<XPD:ATTR name="Name" type="string">dtv</XPD:ATTR>
-<XPD:REF name="Namespace">bnJ8ggSchket3/t1l7Kx4wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
-<XPD:REF name="Views[0]">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF>
-<XPD:ATTR name="#OwnedElements" type="integer">14</XPD:ATTR>
-<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="xAj1pchzIEeSaRcR2+aFTwAA">
-<XPD:ATTR name="Name" type="string">CDtv</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
-<XPD:REF name="Views[1]">mxcpZDUEI0aTfXvfNUP8/QAA</XPD:REF>
-<XPD:REF name="Views[2]">0p/pTktl+kimPcmFJ4/wywAA</XPD:REF>
-<XPD:REF name="Views[3]">kWtX8dZWikSHi3kCydMHCAAA</XPD:REF>
-<XPD:ATTR name="#Operations" type="integer">32</XPD:ATTR>
-<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="dmYYHpECE0G9dWsxqVRqVgAA">
-<XPD:ATTR name="Name" type="string">startScan</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">开始频é“æœç´¢</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="XpPbBfTfWU2kqA1mr/vbJgAA">
-<XPD:ATTR name="Name" type="string">stopScan</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="UkrKc9f59kSDyV/AaLMH+gAA">
-<XPD:ATTR name="Name" type="string">startBooking</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="JcvijNcflkmNK8+KOhdCggAA">
-<XPD:ATTR name="Name" type="string">pause</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">æš‚åœæ’­æ”¾(回放和时移播放时有效)</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="i8IvkFjbqUCCSXorAzUdRAAA">
-<XPD:ATTR name="Name" type="string">resume</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">æ¢å¤æ’­æ”¾(回放和时移播放时有效)</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="dQd++JYYo0amx+JlLdJFWQAA">
-<XPD:ATTR name="Name" type="string">playProgram</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="zO9p84LeHUGvoLEQTCAS3QAA">
-<XPD:ATTR name="Name" type="string">num</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">dQd++JYYo0amx+JlLdJFWQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="eEq01zCgM0aZvokMO+SqkQAA">
-<XPD:ATTR name="Name" type="string">fastForward</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">快进播放(回放和时移播放时有效)</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="MU6Fk6s7TUi43t3TzPmDYAAA">
-<XPD:ATTR name="Name" type="string">fastBackward</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">快退播放(回放和时移播放时有效)</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="+JpQ6Kv+wUetg2ukud8xAAAA">
-<XPD:ATTR name="Name" type="string">setVideoWindow</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="Urh1T97yF0qVB2qrq91V/AAA">
-<XPD:ATTR name="Name" type="string">getTime</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="+OoQqX2+hEy7+IGpcoRO6wAA">
-<XPD:ATTR name="Name" type="string">stopPlaying</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="5AWp11enzE2zKYbJKwZ4SgAA">
-<XPD:ATTR name="Name" type="string">startTimeshifting</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">开始时移播放</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="Tt9RCFNm7USWaJVzeiQO4wAA">
-<XPD:ATTR name="Name" type="string">stopTimeshifting</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[13]" type="UMLOperation" guid="9gabibFFh0+pG1jLLre65AAA">
-<XPD:ATTR name="Name" type="string">startRecording</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[14]" type="UMLOperation" guid="3d/CswBBrEy2IUoFJUC4zAAA">
-<XPD:ATTR name="Name" type="string">switchAudioTrack</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">切æ¢å£°é“</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[15]" type="UMLOperation" guid="IGijEoer5kSmMkA+Fo3ArwAA">
-<XPD:ATTR name="Name" type="string">stopRecording</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[16]" type="UMLOperation" guid="Zb4VlxMHWkS/g4Mf01SYQAAA">
-<XPD:ATTR name="Name" type="string">startPlayback</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">开始录制节目回放</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[17]" type="UMLOperation" guid="YMsIpjPwskyU47Z7OFZGswAA">
-<XPD:ATTR name="Name" type="string">stopPlayback</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[18]" type="UMLOperation" guid="KYZZjRnW+E6fVbHlCQJHLgAA">
-<XPD:ATTR name="Name" type="string">startBooking</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">开始一个预约处ç†</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[19]" type="UMLOperation" guid="+mKhDWf/OkWW6S8s1fQrdAAA">
-<XPD:ATTR name="Name" type="string">getFrontendStatus</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">å–å¾—å‰ç«¯é”定状æ€</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[20]" type="UMLOperation" guid="4LuPht07CEyB+RsryYpq8wAA">
-<XPD:ATTR name="Name" type="string">getFrontendSignalStrength</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">å–å¾—å‰ç«¯ä¿¡å·å¼ºåº¦</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[21]" type="UMLOperation" guid="auftPPtm9ESAf8dNdwpO8wAA">
-<XPD:ATTR name="Name" type="string">getFrontendSNR</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">å–å¾—å‰ç«¯SNR值</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[22]" type="UMLOperation" guid="SkFMqj2tAkCHB6YzXb25VAAA">
-<XPD:ATTR name="Name" type="string">getFrontendBER</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">å–å¾—å‰ç«¯BER值</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[23]" type="UMLOperation" guid="1Kkg1e8Eq0yMsbrLqj30vAAA">
-<XPD:ATTR name="Name" type="string">restoreFactorySetting</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">æ¢å¤å‡ºåŽ‚设置</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[24]" type="UMLOperation" guid="0F6QZhvGnEi9TAKhwr5gqAAA">
-<XPD:ATTR name="Name" type="string">setCvbsAmpOut</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">模拟CVBS AMP OUT</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[25]" type="UMLOperation" guid="H0pDJxWBtUeDplA7FSzwhQAA">
-<XPD:ATTR name="Name" type="string">unblock</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">解é”并播放当å‰å·²åŠ é”的频é“,例如密ç éªŒè¯é€šè¿‡åŽï¼Œè°ƒç”¨è¯¥æ–¹æ³•è¿›è¡Œè§£é”播放</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[26]" type="UMLOperation" guid="UdoijIW/80yYKWWst/w35AAA">
-<XPD:ATTR name="Name" type="string">lock</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">é”频,用于信å·æµ‹è¯•ç­‰</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[27]" type="UMLOperation" guid="7rGFPyAzzUe2jTVqsr5TPwAA">
-<XPD:ATTR name="Name" type="string">getChannelInfo</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">一些相关信æ¯,一个节目的相关信æ¯</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[28]" type="UMLOperation" guid="Pa5rqUzWwEaNHn5Ws2ScXQAA">
-<XPD:ATTR name="Name" type="string">getChannelList</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">得到所有或者æŸä¸€ç±»çš„所以节目信æ¯è¡¨,...include EPG?</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[29]" type="UMLOperation" guid="UYN2BdmAh0OwWr6FMv/4+gAA">
-<XPD:ATTR name="Name" type="string">editChannelList</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">编辑节目信æ¯</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[30]" type="UMLOperation" guid="W+xUDLU830SOa/MaA8+q9gAA">
-<XPD:ATTR name="Name" type="string">getEvent</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[31]" type="UMLOperation" guid="wX/iXD/If0yyRjn7rC8n9wAA">
-<XPD:ATTR name="Name" type="string">EpgScanner</XPD:ATTR>
-<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:ATTR name="#Associations" type="integer">7</XPD:ATTR>
-<XPD:REF name="Associations[0]">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
-<XPD:REF name="Associations[1]">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
-<XPD:REF name="Associations[2]">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
-<XPD:REF name="Associations[3]">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
-<XPD:REF name="Associations[4]">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
-<XPD:REF name="Associations[5]">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
-<XPD:REF name="Associations[6]">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="SX+aNGg0j0WtdR26+LZ7OgAA">
-<XPD:ATTR name="Name" type="string">CTvDatabase</XPD:ATTR>
+<?xml version="1.0" encoding="UTF-8"?>
+<XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
+<XPD:HEADER>
+<XPD:SUBUNITS>
+</XPD:SUBUNITS>
+<XPD:PROFILES>
+<XPD:PROFILE>UMLStandard</XPD:PROFILE>
+<XPD:PROFILE>Java</XPD:PROFILE>
+<XPD:PROFILE>Cpp</XPD:PROFILE>
+</XPD:PROFILES>
+</XPD:HEADER>
+<XPD:BODY>
+<XPD:OBJ name="DocumentElement" type="UMLProject" guid="CoZuu0bDp0eooW1pQg6aQwAA">
+<XPD:ATTR name="Title" type="string">tv</XPD:ATTR>
+<XPD:ATTR name="#OwnedElements" type="integer">5</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="6Ncym1qqME6Qmj4IRHZMIQAA">
+<XPD:ATTR name="Name" type="string">Use Case Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">useCaseModel</XPD:ATTR>
+<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLUseCaseDiagram" guid="nzFiqgF5PEKC+zYpaFKlCQAA">
+<XPD:ATTR name="Name" type="string">tv功</XPD:ATTR>
+<XPD:REF name="DiagramOwner">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLUseCaseDiagramView" guid="nx0lwQzrskWozLI1S3LzQgAA">
+<XPD:REF name="Diagram">nzFiqgF5PEKC+zYpaFKlCQAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">17</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLActorView" guid="gvI3mIExBEmaszVtF0V6bwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">116</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">40</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">78</XPD:ATTR>
+<XPD:REF name="Model">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="FSYMWbRzs0mJbYfl9CkXfAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="+Fy828Qip0uc61sSAd0UwQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">user</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="TbdT9IJSLU+fl/JTxDnxxQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="aTiAvGpnHUGxIA1FbazntAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="UA5dbT7GVU2OqjVX9PXuWAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="9c90i0MrUkKipskFCo8wlgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLUseCaseView" guid="gjXEJSzeBk24cBss5DrAhAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">396</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">125</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="WQwWYMpQtUCP6CaPlCcltQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Nbu2DNQyW0K3OkEns8o8FgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">æœå°</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="k8VZH0rfeUaxBRl8mSLwDAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="EL3VwTjdHkCZndTAtu6x0QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="FCs4dSUL6ES18h1zCz8l6AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="sTCdfdSS0UiUUNZ/B2e/FAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="GczyMXZXJEmnDD4a7NAunwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLUseCaseView" guid="Frl6rGi4ekOSrHn6gJ5XLQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">452</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">64</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="k0GCedKioUeNGvdENFUs4AAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="GZ0SKDfylkCAWEwMblBG9gAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">æ¢å°</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="zw9u23HITU+F7D/MPgZyoQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="ZaIixThNIkGc744Tm3CsugAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="aH6LRR4We0O3VrbkDZF2cwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="HAEKTxJSV0uP4v52ffOFQwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="bSOUAy1Buk+obB82eUrFSQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLUseCaseView" guid="Hyu7+1e/cES0Ae1OqV75fwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">428</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">237</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="3d2gFNlI6EK+jsWimDIS+QAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="SVBydeRF006GMrAfC3ETqwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">得到当å‰å°çš„ä¿¡æ¯/å±æ˜¾</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="SU3HDI+ru0WNDK77syR/GQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="CS3PuOwuBkW7+xAe2clbBAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="6VTL4WFMHEigYGfaMrdGYwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="7rrGYYen40CFqpViVSVmAQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="18I+62RrWEOFbvJ7hjlg4AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">W59J2q05J0K29agobcVJpwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLUseCaseView" guid="JsuyLQhZc0Sm5Tx7vxV+jAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">416</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">212</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">178</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="kfnOa+AQV0Kj4BKPF56htAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="6bLEGGIsiU6zFFc9j4F49wAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">得到全部å°çš„列表</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="ADRdb9imSEChWP9jDiJFWgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Gp396ZK3MUyBaxd1WCTOIQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="c8pFLtSKjE+idXYMkFpEQAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="8s4aZ7v9JkWne3xJfZ0IqgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="qTH2RWpVvkyOG5CaahXI1AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLAssociationView" guid="VKBbewCQmUyNjzWZhk3pLQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">201,70;396,34</XPD:ATTR>
+<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
+<XPD:REF name="Head">gjXEJSzeBk24cBss5DrAhAAA</XPD:REF>
+<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="dgQAXdF4ZESvmtHR7mV1eAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="nl0ivvTPhk6+ZWGNY3Z7QQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="21Re8Yow20OMsCn0YuNvyQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="g4iIuaL510KG496BLjSxFAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="gJVKivaSkUOMWN8rIdDn4gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="TwLEoTMD10ehV8UPEkC8GAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="xB9CaPtaBEGmmoo1GYSHmAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="9JL65E1Ll0K/gBYTvW27ggAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="bGKgfsVj9UqvRKTQT54jnwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="W8FWavR8aUaHm9U8dXz4VgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="hx6u1xKLF028b6Yykl/JVwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="T2Ct5boioEq1zBkQPfP1uAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">201,79;452,85</XPD:ATTR>
+<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
+<XPD:REF name="Head">Frl6rGi4ekOSrHn6gJ5XLQAA</XPD:REF>
+<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="itC6+9KIkUOoqvWzhIL9eAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="yn7EMIRfMUivZuavba1QKgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="qp8dQ4Cl50OUly+002LHkwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="K/CL0noaSEeVxfiH/AYdPQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Cko4gh6CNESvzEaGX7xrTwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="gJsX46E8OEivWSn9FKGyIgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="YXCHfhVdWUSEN2ZT/RAgUwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="+sQ4dyQOwEyKXN3Siy8SeAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="3/az9bmrj0OrABD1RgT7zgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="g0gSj9MvXEy5XaeQkbjoOwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="QhKdEmGlb021SYaW2m8l2AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="AyvrWm4rVU2nEQ3SaHF+pwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">201,86;428,125</XPD:ATTR>
+<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
+<XPD:REF name="Head">Hyu7+1e/cES0Ae1OqV75fwAA</XPD:REF>
+<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Ic1rMSlGuEiOmC74Gs5VPgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="LmeDzwQ4WE+N9ctpkvJC2QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="/4mMqWe3yUWrZLbs6l2tZwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="/DGBSl3cJ0S8W6nJJJGcfwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="m94XoFukck+27/0mViZU2gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="QQK2e0FGJkigWh9ObCBDRgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="rl15HxW7wUGsb4vRn7Al9wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="WxqNKB0NhUqZpADhZw+P3QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="A1ODeRbq4kaOK4HMvaTeRQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="Tj9w6ngJfUqetSitERQ8NQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="LFchLERMEE2qPO6m3DpPuQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="QIXdxKII/kqOJOJMY5AcogAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">201,97;455,212</XPD:ATTR>
+<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
+<XPD:REF name="Head">JsuyLQhZc0Sm5Tx7vxV+jAAA</XPD:REF>
+<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Xq0mZflYI0KV42hvumdugQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="vwdwId1yNkaUtmkTI1YWuQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="1uoVEwi+dkyCZb5M7Pve2wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="4paVVhhoOU2GUrsd9Xm/FwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="kbnyVybMKEKdAdKhGeseZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="66pNRRmKjku3rnBmhfUBCgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="g5PdiNFseUGXOynpmdruGwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="i3/GDxY4DU6ZMPvt2/tUdgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="71PEDgUjsU+2i57rKSIWiQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="Bn3vSuvCAEGkNyVyOiDjtAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="WnuHsx6mVUGcSN3xCQss6QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLUseCaseView" guid="B39+MGxIAUu2bla4M15wGQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">428</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">344</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">182</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="G5wIehwq+0eIoXt5370UvgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="+OT5iGpyX0mfkpXaUy+lWgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">设置å„ç§å‚æ•°ä¿¡æ¯</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="liywRdQGmEmxnhyRBal4rAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="7R4zEmy7t0WDv/dHHBAF0AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="kRxUjogV4k2YkluNvawsMAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="u8URrWr/hkiwdkqgLJdW+wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="KOSNG5KSM0CFIOZucCSmlwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="xD4JWSKF3EOTqNmsPzbc5QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">201,112;491,344</XPD:ATTR>
+<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
+<XPD:REF name="Head">B39+MGxIAUu2bla4M15wGQAA</XPD:REF>
+<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Aug+XiD/L0C98F0lb8QKAgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="+HDBsjEDKEqWUJZ9hnAU4QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="8N0unm4hwUy3Q/ipJnkyXAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="0NmimauDo0yxCgPn4bFExgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="evKHrFVG9kazUYsWGKYoRQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="YPI7wcCBTUybTm1Spbgg8QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="JgCUSElncUaW/Ryki1kRMQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="ntmWchFV+UqAdPT3cz9/JQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="vquz6rX3pkKrylGBjx30IAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="edAtn71weU2/fvAr2uihoQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="CXIajd5ee06Zf7q4GbpG1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLUseCaseView" guid="grqGSNiheUuwFijgmxch+gAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">236</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">280</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">130</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="yd3L6GZKLkeQZ1rwi7QUdwAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="kTZxfY7VPkO7bRwo+0E/QgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">预约</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="bjVlyswu/kSF04Iq8TwUcwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="xcQ9Vgj+k0eBpJoVYqjU+QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="54HAvDvDa06v58oCDBCKXwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="H5TD/VVzokWAABxo66dDiwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="qqfU97a8nUqfLL2CFuWnjQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[12]" type="UMLAssociationView" guid="kVRyhJmyWEyyp5wuc+OXngAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">183,117;286,280</XPD:ATTR>
+<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
+<XPD:REF name="Head">grqGSNiheUuwFijgmxch+gAA</XPD:REF>
+<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="FypCN9NIE0C9ShWHmH/yxQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="UYBImTsT3kmMLO4UVo7iDgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Dv0knjRPxEiA3FR76MzcQgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="qZ6wG2yUdUCrkCtj+ADq5gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="oRaZRwRR1E+ugfvMU7Mx7AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="5xmhglHNPkebUvE0zYQ+1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Rf4Y2d2tx0eAEgaVNgix1gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="TJu7E2BYn0e7KDkLvMy6zQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="e0J/wN1wUUGY7r7RQqgfrQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="HuuHMInFx0awxMfN0WO7nAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="LK/960VLGUqFEI3dQB55GgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[13]" type="UMLUseCaseView" guid="1rgOrFraekaSjgPeaxo6VQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">44</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">276</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">121</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="gO3lj/0VEkmcGBM22vSVygAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="5VgGyt6LmU26Ugzte0ke+QAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">回放</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="OYamm5Q5wEmGKhCOoHHMVQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="SG00AIBfJE6CGLnrfQ6vHAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="rgrH2S52KUirNQUR897hjAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="/Uw/TQZhfEa2XXCMAwNycQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="c8C4qOOrcUa+n6I+x3qsmwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="FyWt2ux4n0C/jIWXlvGepAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">148,117;109,276</XPD:ATTR>
+<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
+<XPD:REF name="Head">1rgOrFraekaSjgPeaxo6VQAA</XPD:REF>
+<XPD:REF name="Tail">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="tzUYyPqymkyQTrpQ3ESfLQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="WsC4wpiLwESJvBADsJOD0QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="240EHYi+MUSGtsZ2MH9vbAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="HGprZSDtFUGe58XLDa/llAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="jriPICawik+i/5uQ1tPPJQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="sgsEShSJaUa0m4iY/pH+kgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="oHna4JnixU6x5HHrqy8Y0gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="zD5xP/cAIkyWZDkkr5ToygAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="CcjzfOb/A06oYHNBWwMyYAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="k/ixsOc3uECBJHIoPEzSCQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="eJcfvTsAsUKZSOjduilFwAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">teHN23xRpE6lugxstCxsawAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[15]" type="UMLUseCaseView" guid="mlqnICP04kuE2DQduAxCnAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">676</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">208</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">121</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="SRnkj+mMmkOMwzyxJwTibAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="2afuLG9SqEymSxMJuyHxJgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ä¿å­˜æ•°æ®</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="wUkUa3V6VU6SXo+560ZANAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="eeGzvESJskW2qRwldE4o8gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="ZBT2RXZyKE2KgZdND0TQCwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ayKElX0k9EWwlzIjQHBReAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ExtensionPointCompartment" type="UMLExtensionPointCompartmentView" guid="TjYDD4DDi06is7FTfdSgGgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eVrNXR8NqEC5uMEFgGKQ1gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[16]" type="UMLActorView" guid="8+OH6W5lhU2orgFp9fejxAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">896</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">36</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">72</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">78</XPD:ATTR>
+<XPD:REF name="Model">EIFC2d0E6EScGB1xXji93AAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="n/aO4ZyhvEOJuT58CBcC5gAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="2ZhkQxFuGk2UQcb3DISJAQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">å¼€å‘人员</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="y1MqUzbc4UeDdpEsqrK3GwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="0Oeejnt4GEuk0csGmClAQAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="55svG5LVmEayI1yOLF/hYgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">EIFC2d0E6EScGB1xXji93AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="qt7RVSofskyCOe4IXevE3gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">EIFC2d0E6EScGB1xXji93AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">17</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLActor" guid="jE6Hh4xWzk+ss1P1I88QbQAA">
+<XPD:ATTR name="Name" type="string">user</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">3</XPD:ATTR>
+<XPD:REF name="Views[0]">gvI3mIExBEmaszVtF0V6bwAA</XPD:REF>
+<XPD:REF name="Views[1]">UA5dbT7GVU2OqjVX9PXuWAAA</XPD:REF>
+<XPD:REF name="Views[2]">9c90i0MrUkKipskFCo8wlgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">7</XPD:ATTR>
+<XPD:REF name="Associations[0]">2RBODiwfOUCUVzGJ/32wAAAA</XPD:REF>
+<XPD:REF name="Associations[1]">LAvKrCSTOk+Idehr21cMIwAA</XPD:REF>
+<XPD:REF name="Associations[2]">BPqYWvTNKEOfCOeMpPA44AAA</XPD:REF>
+<XPD:REF name="Associations[3]">uJNUdzUQLUu2aPlejTqjNwAA</XPD:REF>
+<XPD:REF name="Associations[4]">jJgG/r4rjE2qAhy/U/lg2wAA</XPD:REF>
+<XPD:REF name="Associations[5]">HQZk+9nVI02CjFsZTEmJFgAA</XPD:REF>
+<XPD:REF name="Associations[6]">teHN23xRpE6lugxstCxsawAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLUseCase" guid="nAsf5tia702zzSQAu6L6VwAA">
+<XPD:ATTR name="Name" type="string">æœå°</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">gjXEJSzeBk24cBss5DrAhAAA</XPD:REF>
+<XPD:REF name="Views[1]">FCs4dSUL6ES18h1zCz8l6AAA</XPD:REF>
+<XPD:REF name="Views[2]">sTCdfdSS0UiUUNZ/B2e/FAAA</XPD:REF>
+<XPD:REF name="Views[3]">GczyMXZXJEmnDD4a7NAunwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">1h+kSCXpe0eWYNVJ4SXvTQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLUseCase" guid="yCRgNkRB+EGAwzfBjdJbqwAA">
+<XPD:ATTR name="Name" type="string">æ¢å°</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Frl6rGi4ekOSrHn6gJ5XLQAA</XPD:REF>
+<XPD:REF name="Views[1]">aH6LRR4We0O3VrbkDZF2cwAA</XPD:REF>
+<XPD:REF name="Views[2]">HAEKTxJSV0uP4v52ffOFQwAA</XPD:REF>
+<XPD:REF name="Views[3]">bSOUAy1Buk+obB82eUrFSQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">7KhVXW2jsUGTY2YhCHULSAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLUseCase" guid="W59J2q05J0K29agobcVJpwAA">
+<XPD:ATTR name="Name" type="string">得到当å‰å°çš„ä¿¡æ¯/å±æ˜¾</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Hyu7+1e/cES0Ae1OqV75fwAA</XPD:REF>
+<XPD:REF name="Views[1]">6VTL4WFMHEigYGfaMrdGYwAA</XPD:REF>
+<XPD:REF name="Views[2]">7rrGYYen40CFqpViVSVmAQAA</XPD:REF>
+<XPD:REF name="Views[3]">18I+62RrWEOFbvJ7hjlg4AAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">X1+FYBSOWkaYgLu2FjOTXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLUseCase" guid="ExhZCRayVUq9VZBeXyOzSgAA">
+<XPD:ATTR name="Name" type="string">得到全部å°çš„列表</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">JsuyLQhZc0Sm5Tx7vxV+jAAA</XPD:REF>
+<XPD:REF name="Views[1]">c8pFLtSKjE+idXYMkFpEQAAA</XPD:REF>
+<XPD:REF name="Views[2]">8s4aZ7v9JkWne3xJfZ0IqgAA</XPD:REF>
+<XPD:REF name="Views[3]">qTH2RWpVvkyOG5CaahXI1AAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">pVT44Y4IlkCvW0rXC+dzRgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLAssociation" guid="hXa1Ze5PcEWvFq3WssbumAAA">
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VKBbewCQmUyNjzWZhk3pLQAA</XPD:REF>
+<XPD:REF name="Views[1]">dgQAXdF4ZESvmtHR7mV1eAAA</XPD:REF>
+<XPD:REF name="Views[2]">nl0ivvTPhk6+ZWGNY3Z7QQAA</XPD:REF>
+<XPD:REF name="Views[3]">21Re8Yow20OMsCn0YuNvyQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="2RBODiwfOUCUVzGJ/32wAAAA">
+<XPD:REF name="Association">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
+<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">gJVKivaSkUOMWN8rIdDn4gAA</XPD:REF>
+<XPD:REF name="Views[1]">xB9CaPtaBEGmmoo1GYSHmAAA</XPD:REF>
+<XPD:REF name="Views[2]">bGKgfsVj9UqvRKTQT54jnwAA</XPD:REF>
+<XPD:REF name="Views[3]">hx6u1xKLF028b6Yykl/JVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="1h+kSCXpe0eWYNVJ4SXvTQAA">
+<XPD:REF name="Association">hXa1Ze5PcEWvFq3WssbumAAA</XPD:REF>
+<XPD:REF name="Participant">nAsf5tia702zzSQAu6L6VwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">g4iIuaL510KG496BLjSxFAAA</XPD:REF>
+<XPD:REF name="Views[1]">TwLEoTMD10ehV8UPEkC8GAAA</XPD:REF>
+<XPD:REF name="Views[2]">9JL65E1Ll0K/gBYTvW27ggAA</XPD:REF>
+<XPD:REF name="Views[3]">W8FWavR8aUaHm9U8dXz4VgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="GWeTbEaAQUO+r17c6TtqcAAA">
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">T2Ct5boioEq1zBkQPfP1uAAA</XPD:REF>
+<XPD:REF name="Views[1]">itC6+9KIkUOoqvWzhIL9eAAA</XPD:REF>
+<XPD:REF name="Views[2]">yn7EMIRfMUivZuavba1QKgAA</XPD:REF>
+<XPD:REF name="Views[3]">qp8dQ4Cl50OUly+002LHkwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="LAvKrCSTOk+Idehr21cMIwAA">
+<XPD:REF name="Association">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
+<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Cko4gh6CNESvzEaGX7xrTwAA</XPD:REF>
+<XPD:REF name="Views[1]">YXCHfhVdWUSEN2ZT/RAgUwAA</XPD:REF>
+<XPD:REF name="Views[2]">3/az9bmrj0OrABD1RgT7zgAA</XPD:REF>
+<XPD:REF name="Views[3]">QhKdEmGlb021SYaW2m8l2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="7KhVXW2jsUGTY2YhCHULSAAA">
+<XPD:REF name="Association">GWeTbEaAQUO+r17c6TtqcAAA</XPD:REF>
+<XPD:REF name="Participant">yCRgNkRB+EGAwzfBjdJbqwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">K/CL0noaSEeVxfiH/AYdPQAA</XPD:REF>
+<XPD:REF name="Views[1]">gJsX46E8OEivWSn9FKGyIgAA</XPD:REF>
+<XPD:REF name="Views[2]">+sQ4dyQOwEyKXN3Siy8SeAAA</XPD:REF>
+<XPD:REF name="Views[3]">g0gSj9MvXEy5XaeQkbjoOwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="R+Mv7uh5kEuKr/Bia3KOhAAA">
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">AyvrWm4rVU2nEQ3SaHF+pwAA</XPD:REF>
+<XPD:REF name="Views[1]">Ic1rMSlGuEiOmC74Gs5VPgAA</XPD:REF>
+<XPD:REF name="Views[2]">LmeDzwQ4WE+N9ctpkvJC2QAA</XPD:REF>
+<XPD:REF name="Views[3]">/4mMqWe3yUWrZLbs6l2tZwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="BPqYWvTNKEOfCOeMpPA44AAA">
+<XPD:REF name="Association">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
+<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">m94XoFukck+27/0mViZU2gAA</XPD:REF>
+<XPD:REF name="Views[1]">rl15HxW7wUGsb4vRn7Al9wAA</XPD:REF>
+<XPD:REF name="Views[2]">A1ODeRbq4kaOK4HMvaTeRQAA</XPD:REF>
+<XPD:REF name="Views[3]">LFchLERMEE2qPO6m3DpPuQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="X1+FYBSOWkaYgLu2FjOTXwAA">
+<XPD:REF name="Association">R+Mv7uh5kEuKr/Bia3KOhAAA</XPD:REF>
+<XPD:REF name="Participant">W59J2q05J0K29agobcVJpwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">/DGBSl3cJ0S8W6nJJJGcfwAA</XPD:REF>
+<XPD:REF name="Views[1]">QQK2e0FGJkigWh9ObCBDRgAA</XPD:REF>
+<XPD:REF name="Views[2]">WxqNKB0NhUqZpADhZw+P3QAA</XPD:REF>
+<XPD:REF name="Views[3]">Tj9w6ngJfUqetSitERQ8NQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="WrC8vAeUYkO3tLCoOTTa7gAA">
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">QIXdxKII/kqOJOJMY5AcogAA</XPD:REF>
+<XPD:REF name="Views[1]">Xq0mZflYI0KV42hvumdugQAA</XPD:REF>
+<XPD:REF name="Views[2]">vwdwId1yNkaUtmkTI1YWuQAA</XPD:REF>
+<XPD:REF name="Views[3]">1uoVEwi+dkyCZb5M7Pve2wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="uJNUdzUQLUu2aPlejTqjNwAA">
+<XPD:REF name="Association">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
+<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">kbnyVybMKEKdAdKhGeseZgAA</XPD:REF>
+<XPD:REF name="Views[1]">g5PdiNFseUGXOynpmdruGwAA</XPD:REF>
+<XPD:REF name="Views[2]">71PEDgUjsU+2i57rKSIWiQAA</XPD:REF>
+<XPD:REF name="Views[3]">WnuHsx6mVUGcSN3xCQss6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="pVT44Y4IlkCvW0rXC+dzRgAA">
+<XPD:REF name="Association">WrC8vAeUYkO3tLCoOTTa7gAA</XPD:REF>
+<XPD:REF name="Participant">ExhZCRayVUq9VZBeXyOzSgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">4paVVhhoOU2GUrsd9Xm/FwAA</XPD:REF>
+<XPD:REF name="Views[1]">66pNRRmKjku3rnBmhfUBCgAA</XPD:REF>
+<XPD:REF name="Views[2]">i3/GDxY4DU6ZMPvt2/tUdgAA</XPD:REF>
+<XPD:REF name="Views[3]">Bn3vSuvCAEGkNyVyOiDjtAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLUseCase" guid="5KAC2LjvX0qQF9lBa5DyCwAA">
+<XPD:ATTR name="Name" type="string">设置å„ç§å‚æ•°ä¿¡æ¯</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">B39+MGxIAUu2bla4M15wGQAA</XPD:REF>
+<XPD:REF name="Views[1]">kRxUjogV4k2YkluNvawsMAAA</XPD:REF>
+<XPD:REF name="Views[2]">u8URrWr/hkiwdkqgLJdW+wAA</XPD:REF>
+<XPD:REF name="Views[3]">KOSNG5KSM0CFIOZucCSmlwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">iK2QfBiThkWwoji6bSWtswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="y+qwgLasMEm0UKrVQN8iJQAA">
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">xD4JWSKF3EOTqNmsPzbc5QAA</XPD:REF>
+<XPD:REF name="Views[1]">Aug+XiD/L0C98F0lb8QKAgAA</XPD:REF>
+<XPD:REF name="Views[2]">+HDBsjEDKEqWUJZ9hnAU4QAA</XPD:REF>
+<XPD:REF name="Views[3]">8N0unm4hwUy3Q/ipJnkyXAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="jJgG/r4rjE2qAhy/U/lg2wAA">
+<XPD:REF name="Association">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
+<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">evKHrFVG9kazUYsWGKYoRQAA</XPD:REF>
+<XPD:REF name="Views[1]">JgCUSElncUaW/Ryki1kRMQAA</XPD:REF>
+<XPD:REF name="Views[2]">vquz6rX3pkKrylGBjx30IAAA</XPD:REF>
+<XPD:REF name="Views[3]">CXIajd5ee06Zf7q4GbpG1QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="iK2QfBiThkWwoji6bSWtswAA">
+<XPD:REF name="Association">y+qwgLasMEm0UKrVQN8iJQAA</XPD:REF>
+<XPD:REF name="Participant">5KAC2LjvX0qQF9lBa5DyCwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">0NmimauDo0yxCgPn4bFExgAA</XPD:REF>
+<XPD:REF name="Views[1]">YPI7wcCBTUybTm1Spbgg8QAA</XPD:REF>
+<XPD:REF name="Views[2]">ntmWchFV+UqAdPT3cz9/JQAA</XPD:REF>
+<XPD:REF name="Views[3]">edAtn71weU2/fvAr2uihoQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[11]" type="UMLUseCase" guid="eLOxpsSp0EC08r5lL9rsZAAA">
+<XPD:ATTR name="Name" type="string">预约</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">grqGSNiheUuwFijgmxch+gAA</XPD:REF>
+<XPD:REF name="Views[1]">54HAvDvDa06v58oCDBCKXwAA</XPD:REF>
+<XPD:REF name="Views[2]">H5TD/VVzokWAABxo66dDiwAA</XPD:REF>
+<XPD:REF name="Views[3]">qqfU97a8nUqfLL2CFuWnjQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">rXVVaNhetUi+zkmUpV2EJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="0s9c8w+QxUaASZ+fMtRSqQAA">
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">kVRyhJmyWEyyp5wuc+OXngAA</XPD:REF>
+<XPD:REF name="Views[1]">FypCN9NIE0C9ShWHmH/yxQAA</XPD:REF>
+<XPD:REF name="Views[2]">UYBImTsT3kmMLO4UVo7iDgAA</XPD:REF>
+<XPD:REF name="Views[3]">Dv0knjRPxEiA3FR76MzcQgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="HQZk+9nVI02CjFsZTEmJFgAA">
+<XPD:REF name="Association">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
+<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">oRaZRwRR1E+ugfvMU7Mx7AAA</XPD:REF>
+<XPD:REF name="Views[1]">Rf4Y2d2tx0eAEgaVNgix1gAA</XPD:REF>
+<XPD:REF name="Views[2]">e0J/wN1wUUGY7r7RQqgfrQAA</XPD:REF>
+<XPD:REF name="Views[3]">LK/960VLGUqFEI3dQB55GgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="rXVVaNhetUi+zkmUpV2EJAAA">
+<XPD:REF name="Association">0s9c8w+QxUaASZ+fMtRSqQAA</XPD:REF>
+<XPD:REF name="Participant">eLOxpsSp0EC08r5lL9rsZAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">qZ6wG2yUdUCrkCtj+ADq5gAA</XPD:REF>
+<XPD:REF name="Views[1]">5xmhglHNPkebUvE0zYQ+1QAA</XPD:REF>
+<XPD:REF name="Views[2]">TJu7E2BYn0e7KDkLvMy6zQAA</XPD:REF>
+<XPD:REF name="Views[3]">HuuHMInFx0awxMfN0WO7nAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[13]" type="UMLUseCase" guid="DfNIoYa4GU+CP71/W8SrWwAA">
+<XPD:ATTR name="Name" type="string">回放</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">1rgOrFraekaSjgPeaxo6VQAA</XPD:REF>
+<XPD:REF name="Views[1]">rgrH2S52KUirNQUR897hjAAA</XPD:REF>
+<XPD:REF name="Views[2]">/Uw/TQZhfEa2XXCMAwNycQAA</XPD:REF>
+<XPD:REF name="Views[3]">c8C4qOOrcUa+n6I+x3qsmwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">AeXEiqTUjkaieSlGxTKX+QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[14]" type="UMLAssociation" guid="oYdSRRagC0OKiYHxCgS7CAAA">
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">FyWt2ux4n0C/jIWXlvGepAAA</XPD:REF>
+<XPD:REF name="Views[1]">tzUYyPqymkyQTrpQ3ESfLQAA</XPD:REF>
+<XPD:REF name="Views[2]">WsC4wpiLwESJvBADsJOD0QAA</XPD:REF>
+<XPD:REF name="Views[3]">240EHYi+MUSGtsZ2MH9vbAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="teHN23xRpE6lugxstCxsawAA">
+<XPD:REF name="Association">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
+<XPD:REF name="Participant">jE6Hh4xWzk+ss1P1I88QbQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">jriPICawik+i/5uQ1tPPJQAA</XPD:REF>
+<XPD:REF name="Views[1]">oHna4JnixU6x5HHrqy8Y0gAA</XPD:REF>
+<XPD:REF name="Views[2]">CcjzfOb/A06oYHNBWwMyYAAA</XPD:REF>
+<XPD:REF name="Views[3]">eJcfvTsAsUKZSOjduilFwAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="AeXEiqTUjkaieSlGxTKX+QAA">
+<XPD:REF name="Association">oYdSRRagC0OKiYHxCgS7CAAA</XPD:REF>
+<XPD:REF name="Participant">DfNIoYa4GU+CP71/W8SrWwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">HGprZSDtFUGe58XLDa/llAAA</XPD:REF>
+<XPD:REF name="Views[1]">sgsEShSJaUa0m4iY/pH+kgAA</XPD:REF>
+<XPD:REF name="Views[2]">zD5xP/cAIkyWZDkkr5ToygAA</XPD:REF>
+<XPD:REF name="Views[3]">k/ixsOc3uECBJHIoPEzSCQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[15]" type="UMLUseCase" guid="eVrNXR8NqEC5uMEFgGKQ1gAA">
+<XPD:ATTR name="Name" type="string">ä¿å­˜æ•°æ®</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">mlqnICP04kuE2DQduAxCnAAA</XPD:REF>
+<XPD:REF name="Views[1]">ZBT2RXZyKE2KgZdND0TQCwAA</XPD:REF>
+<XPD:REF name="Views[2]">ayKElX0k9EWwlzIjQHBReAAA</XPD:REF>
+<XPD:REF name="Views[3]">TjYDD4DDi06is7FTfdSgGgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[16]" type="UMLActor" guid="EIFC2d0E6EScGB1xXji93AAA">
+<XPD:ATTR name="Name" type="string">å¼€å‘人员</XPD:ATTR>
+<XPD:REF name="Namespace">6Ncym1qqME6Qmj4IRHZMIQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">3</XPD:ATTR>
+<XPD:REF name="Views[0]">8+OH6W5lhU2orgFp9fejxAAA</XPD:REF>
+<XPD:REF name="Views[1]">55svG5LVmEayI1yOLF/hYgAA</XPD:REF>
+<XPD:REF name="Views[2]">qt7RVSofskyCOe4IXevE3gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLModel" guid="GSh70Nz8XUWNmgnjTARh/gAA">
+<XPD:ATTR name="Name" type="string">Analysis Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
+<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
+<XPD:ATTR name="#OwnedElements" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLAssociation" guid="rIQWVfPr7E24Tt4ljeTZ4wAA">
+<XPD:REF name="Namespace">GSh70Nz8XUWNmgnjTARh/gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">G0kUvklDf0uhBeIUoV+srgAA</XPD:REF>
+<XPD:REF name="Views[1]">6o6l7Ax4b0uvR1w70cdJiAAA</XPD:REF>
+<XPD:REF name="Views[2]">3ZsGQfCQIk+ZPFC1FyyVeQAA</XPD:REF>
+<XPD:REF name="Views[3]">BCGhRmtL7kmoY1iXaapJOwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="jLzV7XdHP0Ogmb7/6IPCtgAA">
+<XPD:REF name="Association">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
+<XPD:REF name="Participant">7dRihysn8kefkb+6mJlwzgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">zqmFgnNCJ0mU+9gnrH18SwAA</XPD:REF>
+<XPD:REF name="Views[1]">QE0xM9HZIUK4iQSOifSKDQAA</XPD:REF>
+<XPD:REF name="Views[2]">yt3drhX0N0aispBa+C83TAAA</XPD:REF>
+<XPD:REF name="Views[3]">L3X2M2UWvECpCLZj42krJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="XKFQZaAIH0SxD7YBXgkK0wAA">
+<XPD:REF name="Association">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
+<XPD:REF name="Participant">ZRumjrTwgUamBDOstkagPgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">SuRONY2jREyvBHGP7nheBQAA</XPD:REF>
+<XPD:REF name="Views[1]">8rSGjmyTy0iar869slrlPgAA</XPD:REF>
+<XPD:REF name="Views[2]">l9UCuL7VoEm7vFLWkobdoAAA</XPD:REF>
+<XPD:REF name="Views[3]">NYMZ1wuIcUy7G5VODIYIDQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLAssociation" guid="0hCZfIhV4EOpKXcVPwcUnAAA">
+<XPD:REF name="Namespace">GSh70Nz8XUWNmgnjTARh/gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">+dr3aeLg8k2RQ8khsHmmqAAA</XPD:REF>
+<XPD:REF name="Views[1]">eiIT0uNCpUywEWk7FrhutgAA</XPD:REF>
+<XPD:REF name="Views[2]">m5vcHblPLUe9VZHiD1lPzgAA</XPD:REF>
+<XPD:REF name="Views[3]">dHGIMYC9dUeyteDUvxEuNgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="DGWju3i/80ObxLedRPIIEwAA">
+<XPD:REF name="Association">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
+<XPD:REF name="Participant">7dRihysn8kefkb+6mJlwzgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">DGGWcQw7xESguDo8y8c9JwAA</XPD:REF>
+<XPD:REF name="Views[1]">RjfRt8utjEiWYhIQFBxLqgAA</XPD:REF>
+<XPD:REF name="Views[2]">YyNOaiAWMU6urAt6uMo51wAA</XPD:REF>
+<XPD:REF name="Views[3]">HRQ1wVKzDUe1hazbUuDnVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="TolxJOTDCkO5nyLC6ipkAwAA">
+<XPD:REF name="Association">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
+<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">bVRmxC4LeEivBU8rO/l1IwAA</XPD:REF>
+<XPD:REF name="Views[1]">/6WmiwEpmUGnLzBRc6lCzwAA</XPD:REF>
+<XPD:REF name="Views[2]">Brf+/LZbFEamowtJ6zGOAgAA</XPD:REF>
+<XPD:REF name="Views[3]">eme8PTCUYkiREXPCAN1ACgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLModel" guid="dZ4UyetzSE+rDT9vQthF9wAA">
+<XPD:ATTR name="Name" type="string">Design Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">designModel</XPD:ATTR>
+<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="qjYhNoiY1kqmGvfSf6HTOAAA">
+<XPD:ATTR name="Name" type="string">dtvclass</XPD:ATTR>
+<XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
+<XPD:REF name="DiagramOwner">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="P51EDp27mEuFUgKS4BG9TgAA">
+<XPD:REF name="Diagram">qjYhNoiY1kqmGvfSf6HTOAAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">33</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="a8FG7H9SzUelkRx52q1d5AAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">312</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">568</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">53</XPD:ATTR>
+<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="JQh3Wiuct0GpOwtZi9ZTpgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="uNhK2xLegUaBu+NFKaBbSwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvDatabase</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="hhHle2OI4Uu0405GJDfGVwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="jkWfDES3TkmlCIFIs5xizAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="k1LHywt4TEe6bHJwUzft/QAA">
+<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="hc7Nc/x4iE+k/Ee76MBxMgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Pwafosd7ik6mD1kxdwntngAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="Y9zMsiXlQEuyiSGOmpswRwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">780</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">528</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">102</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="/mSRKoE2+U2BADYjjBN3tQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="IXnfaLgTKEGGdpX37KpTHgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvSubtitle</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="+DeDbUnm+02usH1UojzZyQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="TObRQcYR6UWZmkjnkVEugwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="3kCRXwUbYEOaB2YVqs3CMQAA">
+<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="2pFBVEb3NUu3IhdJeNfBWAAA">
+<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="xx5BbdZ+6Eehp04cM6fnfwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5BXVsgqK1kanN/l0hNx/IQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="9Ld1pTeBF0CZmoVdEfEBMQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">324</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">228</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">83</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="KKCqrHWJXUyPtjvhGK6nTAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="VODhD4+mz0yMbBwwjb3fXAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CDtv</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="0OuB7ZzwGEqA8drjlJeNBgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Zc9FQRwP2Uuj8JJg74Jt3QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="mxcpZDUEI0aTfXvfNUP8/QAA">
+<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="0p/pTktl+kimPcmFJ4/wywAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="kWtX8dZWikSHi3kCydMHCAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="BVNqLhbhP06y98++NgmxAwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">284</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">388</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">147</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">33</XPD:ATTR>
+<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="juDswX7uL0W7bBJuRk06AgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="ICbKIhrn50Gwq1GIFxbJYAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvProgram</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="YHcJ0obYSEWbDvvepjISuwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="27Jf3klYvE2MAvnGgH8YqAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="muUyRePjd0qlQqM/tvfrmQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="3aWGjpGXTkqRn+NbEzYu5QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="ylciM87U9keZe9hSnVequAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLClassView" guid="iEgH+6H6kkG++neKuToTSgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">100</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">420</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">97</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="lnKxD1DyGEOj9cd46nB84QAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="FHfQpxZydUGiBASqFcX2dAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvChannel</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="fd0gByAKXkisiM6J7MwdtAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="9r4OqNYuVUegwaUPTkv1pgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="Yo0KShxzIk2FSTydUse5OQAA">
+<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="rmKV7ZtcVEudbDw02LTB/wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="+jiKzSIz/UuhSFnnJkuIEgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="vYDCfUgYq0KaBSDnxbpYVgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">704</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">244</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="+QL9bkNaPUyTOdUO4yAR6AAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="eT33Wt7M8kiSrhmhuXGtCgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvConfig</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="iBlTL0B9OEevQofD0ibRjwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="cFIMtDWroUOFGL0NgRigMAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="KTNQfnqIy0q3wV+ARVtV9gAA">
+<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="7Pq+TJVLy06gA8T6r5wMawAA">
+<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Fn0oKpD7lUyNbDw59UyRygAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="12BWSnVhhUOUuox7tdL41gAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">284,417;196,433</XPD:ATTR>
+<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
+<XPD:REF name="Head">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
+<XPD:REF name="Tail">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="4F+C2zwwrEOjx/qCnLXWPAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="lXf6uq0JtkK3YNXTxTyP7wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="8jym3kotyE2sBWD5KjhUiQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ioK1huVib0u6ILv3kHAeeQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="awNg1wfSGU22on1C+XpBlgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="cwfxPIXUd06ShM9BEivzxQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="cGTSA3bQb0S81NQzsTj+QQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="DBsnRjqoj0W9eAN/Flu+jwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="LWsKT6dOQUKXma9Eoh+sUwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="DUu549wQM0qPn9dAjjrLZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="l9TSA+eftkCY2p6qZDMGKAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="Qa1PhzSwWkyS1rm6eapfLwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">354,568;357,420</XPD:ATTR>
+<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
+<XPD:REF name="Head">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
+<XPD:REF name="Tail">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="QAoFSXFK+0S+5kDYAQ0LsgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="rsOqshNVOkut6r+wW0Sp/wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0wZW9IH3y0OEPMfN5FyHQAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ySD9HMBWmEWoJg+/6boBZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="TM3RNruxzEezNhF8XO/FmwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="LXz8D2AdoE6ojzgkYCO0qAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="NpASusGGKU+/KwcKkTAMogAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="ia8j06EduUmxgB5smbA9hQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="3dtXpNLbXka7wekzvAWsXQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="/JYlnmhzTk66TicK0RjYaQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Mvk2196ldk+5GLgct+OKuwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="UmHHYiIr3k+gNNomjLpgwwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">319,568;179,465</XPD:ATTR>
+<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
+<XPD:REF name="Head">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
+<XPD:REF name="Tail">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ZBlvBeIE2UGGPTML4sQ7SgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="UDn5R84weEayOYl6QVFj1wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="OApAa7HXz0aTiMZGZ/g2tAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="W1YT5dqwMUSUI29zCC2LZQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="24RGLobteEil7cUdAcyUcAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="X96IIfOZSE2FAliwKkCNYgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="6Uw1pdad6kC8N8S0Rf1HxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="tr7uiHRKz0e//ValH5GU+AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="CuUsJAcsAUWwVZJzegOegAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="zdcHIs6dNEmxQNtCK5uHIQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="AST9GWgDTEWR07o7yUcgIQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="oYsj3yhzJkCKmOBcWIHNDwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">357,420;354,568</XPD:ATTR>
+<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
+<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:REF name="Tail">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="GT6R2h3HkU6LThPKaghC1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="eWMr3v5Qb0y/nXu2s/EP5wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="GR9gxzUjNkKmujWHFobLtAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="+SSR3TM1z0m5UkTLiuMrGwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="UuRRAQf+y0OdXTOvWu7nUAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Uvo2ryiBg0Oa5GJF4TRyhQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="vI5c+acLSk6IfCcdqlaBggAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="QBI1NHwjWU2dkj+SLUFZ+AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="w3rpxhxEsEu0y7myhFrrkQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="IYVJT/RjPUqjv8rl6ZIQiwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="8Ip2rQJRaEaPAOW0cJSd/wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="Vcgjd9eKakOjuUAjwzzhJgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">179,465;319,568</XPD:ATTR>
+<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
+<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:REF name="Tail">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="+iIIR1mEnUynEPEjuGAd7AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="bZn71kXJQUOP3yAyCa5RvgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="O36co7nFz0elpJnbKtsYMwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="yjjLYCXJjUqX0IHnpKwHwQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Hv4K+XlgIkqDgqEz3aQWNQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="k1XiyO9mlke/IAq5UuYI9gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="4o7M8jakfkixRwVgESrUnwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Xtc7Jqe6N0+JAzLg1RxYLwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="rCPaxzL0LEuk9Jjbqi+D2gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="W0UPJtBpLU6Y5SjscWTiVAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="HKXhPda/vUuVwv4sR9ZR9QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLClassView" guid="8HnvkQxPk0OLqQXLeJ5MUgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">820</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">316</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
+<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="5gKeR33bd0K1R/QeIX+ZgQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="tQ3eg1803UmmapVr5/mMKgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvGroup</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="qwHtvoH6qk6Aj/xMPfoprQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="txC1zWyhHUKgVTvu0N6VDwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="50xz0k8rgU+WfODoAi8aeQAA">
+<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="TR1rTShyhEG7ngh596L0kgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="GPl78wz82UaLho5xwfMqrQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[12]" type="UMLAssociationView" guid="VjZwKWmCoUO5wNRGJGVShAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">820,364;397,573</XPD:ATTR>
+<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
+<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:REF name="Tail">8HnvkQxPk0OLqQXLeJ5MUgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="6e9pHkpPaUyLDCYYnUYAOAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="QA7tnAAMA0e3tCDRlkB/JwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="gdUdn5u5x0KDsDKM41p2CQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="rqoTwNlD20Gou9xOLQ2RNgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="d/3xrtQ+nU69mQYepo7NvQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="ox9r7npaB0in7/ygfG1ZMwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="HcOo4bUmbUqLEjVUm2L2AQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="exLwGLRY306J0CEcqxlOrgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="tQj+naSiJ0mB4W89ahH5ygAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="qxZgk8R36k2S3vGRfQegfwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="LNFybtIVIkOXnQ/9QC5jEwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[13]" type="UMLClassView" guid="7aPHkO59WEubHbpM/Djq/AAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">456</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">396</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">89</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">41</XPD:ATTR>
+<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="DSv+CNOMnUKyGF5bfoGDowAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Fy6x/w12H0K3LtAtk0/MuwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvEvent</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="xy2kKdqewEerLbDFtu0jAwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="ZxuiiS0/6EiXhRO/StIWPgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="+EOWTA5PrUyAEwB/ZHVnPAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="f0xyghRma028ShVYc8tbfwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qpXdkd1nJ0ajRru7gzDFJwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="QHk4xsvJRUGhKn0p+sReaAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">484,436;375,568</XPD:ATTR>
+<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
+<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:REF name="Tail">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ezGCtUA0dUOn10D5pUOtoAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="QcGPzg741ki4yTGfoKvK9AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="ioZQYN39bEu/gy37UfkhmQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="mZFBakBXmE6Gj5qumz51gwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="VrmcPyj2oUyEm5i/AG7/KgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="KHpH30oHrEew1AGquvXiEQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="odMtivppNUOccWtC85AVCQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="W7KAnZMmjEKAxuaUXA4D6AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="2IiGGrbDkUiobp5CJnME1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="jsiact/gpUS21gy1IeSlZQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="+70t9Os6zUWhIAhufEQsBAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[15]" type="UMLAssociationView" guid="l3oAx6sfA0ScCOouvAFKYwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">430,410;456,412</XPD:ATTR>
+<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
+<XPD:REF name="Head">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF>
+<XPD:REF name="Tail">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="pM/XXFo9Ikq+kK5++HoZ0QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="igklIYxpfka7OH5oAnRbPwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="RtZQfGM0uUqohb/WlARRpwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="lDsB+MeNlUy+OEBCbfs0OAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="pr9mkVSNO0KasNMsFvgDuQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="EeUDIEWsnkO5HzTU6L6kZQAA">
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1</XPD:ATTR>
+<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="4fUHmnlcd0WplogWZWqPRQAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1..*</XPD:ATTR>
+<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="TuyQdZk0H0+ai9Mg3ZtK3AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="kKRq4K1cvEup70Oz2UFd8QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NKw56kYvx0W0KlwhXPYWMwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="DS2eOvXKXku93Y4x950QPgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[16]" type="UMLClassView" guid="Th+ZwPCIw0CZjtawrnGPrQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">756</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">440</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">88</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">41</XPD:ATTR>
+<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="sEpK+JymS02lZlpXniSRjAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Gfl9bfM73kq+EYU5hOwDUQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvBooking</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="dWzJpyjDIE6y0Sx/YmBzlwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Ak99xRpzJ0+K3Y8Z70NTWQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="LL3KL7SUuEyu4pY6NT57NAAA">
+<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="dCkq+XCQgkaH1Q901KclHQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="+Bzptjmx3kWzAYT9fN/rxQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[17]" type="UMLClassView" guid="ybciiFK3jEO6SdfdRt6uAgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">68</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">332</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">41</XPD:ATTR>
+<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="VEgafHzMKkem+RzIfaWBnQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="605ap6gGgUGE85kGWYWaKgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvRegion</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="6TZwhHYPs0mXP+dvmVvxnwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="eHeyWsrCgUeI8XUSaf0Y5QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="AL2e0wMT+0K0AC6gZuuhdwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="zIfIWkZ3Lkiq2O9aOGiU/gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="exyb4FNp+Ue9ROAGwoQFcwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[18]" type="UMLClassView" guid="tzICJ64LmUSx1fvEy4dHZQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">580</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">396</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="6w5B2Z+R1kG+mt3vZl3lVQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Cl9ObgtVFEmfwYkvLw0YHwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvSatellite</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="GhJezIVJAUO7cg/A/n5EdQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="JwksgiMMQ0GQ6xqrv6I4jgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="yCTnlkoiRkSszYJDHrqQuwAA">
+<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="phU5m2tyh0yMlhsYRPe6dwAA">
+<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="S8DZ5jxQq0+WFWPFnQy7iAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[19]" type="UMLAssociationView" guid="5vCGUSmlwUWKkjul/i5CoAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">588,438;393,568</XPD:ATTR>
+<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
+<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:REF name="Tail">tzICJ64LmUSx1fvEy4dHZQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ihIaZz5p+0Cte+Zqg1wUKgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="XyhhchGH70uYaM5UdGboKQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="+N+OW0LtoEyevYQ++bVO1gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="vLsrualWRkO0QI8PcBWGAAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="blnGfW4UCk6tS0veRc88xAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="vWndJmxhrkKfipX/zAAt4AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="jGRa3FaTrUWVhYVG834fjwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="lKgJhvwP/Eygz7oPLvwsxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="olvLmzjsfka5YmNEOntQDAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="AdMO10glEEWGGHqpzKNvewAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="H/do1s5Rh02ETrOyjtaoaAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-848</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-720</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[20]" type="UMLClassView" guid="hzoiTuCQqEuArZEejfwdnQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">684</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">344</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">102</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="bGpo24CeZkuczyv74zkRtAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="M/nbdX/wf0SiKKXamCKy2gAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvDimension</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="mW7NW23ux06laiKhpkTD7wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="gVAZHA+LzE+/vXDeqIkJrgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="PdTrEGRJOEiEJyD2I9IzJgAA">
+<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="VbdqX2NLOkK2DTLhOA91OwAA">
+<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="K00/VzyqZUmltiuaKWLgAQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[21]" type="UMLAssociationView" guid="EWnB2mjt6ke3pnsnQFRgJwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">699,386;397,568</XPD:ATTR>
+<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
+<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:REF name="Tail">hzoiTuCQqEuArZEejfwdnQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="dM3yo1oYRUWNB1JawgFnywAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="/IP55LSMZUCRoa77gkMh9gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Og4FQYOz9kOr8LF43j+ySwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="zHiCXVqqgE6r2lDdnVDI1gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Ggu7vb3GMU2vn9mS8bGZpwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="19Ii9g15zUmLLURud9e9XAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="wMyvwGpZQUmJ2a2lXlkc/AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="KLCf1m7tBkGvkM3iOxLhJgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="rn/sn4ErGkyYnwDUlnpmTAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="1+qZEhcpyk6RHirwjBjalgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="wElMDINXY0esqBl7AwoyfQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[22]" type="UMLAssociationView" guid="DbUG5zy8r0yq6L/I1naVdQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">324,266;147,336</XPD:ATTR>
+<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
+<XPD:REF name="Head">ybciiFK3jEO6SdfdRt6uAgAA</XPD:REF>
+<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="1qY9qbCT1ka5tmfuL9yaJgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="bnG59/mNjk+fcthvMQG2VAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="wovrqiKgc0qw9BUyPaGuBQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="hytVQ6VnmEaHnFV5o9fQ0AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="JbJSjKTBikyT++rY1XVCtwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="eYodfuyOKEK7WC9dBBlaigAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="wUtw7zNylEK+wDvPOsUtGwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="BEEaANsP0UCbPpRjMWyndwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="/cBBOvztgE6Kd7yvemxXPwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="JKx2O2r/H0y9NJ3+4rup1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="uj1vGzCGtkGielBw0Bxi4QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[23]" type="UMLAssociationView" guid="l2Yo1ObIG0WVx7IS2a/B3QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">340,272;173,420</XPD:ATTR>
+<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
+<XPD:REF name="Head">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
+<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Bt1whnZV8ke93vkLSyNq6wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="fqRKs5ARzUGsdlKFgCFhWQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5M/QRFEaxUa0SktETbkRSwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="oOLw6a4XNk6oN6yvhlsf7QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="51OtH+Gyy0+XZJVSgV/KuQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="kMLAHkAn9EKw71vpw3PgHQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="V2pqj6nPg0SqB+TNOQI5PwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="FYDexLT3eUK3X5xdW3Qq/gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="1rWGuTeEqEm+RdcskXCo9gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="VJLq9UMlJE2EqLEbDm23HQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="90vol1uY7U27TcNYwOdZBQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[24]" type="UMLAssociationView" guid="dSXCMAUeXkaVaOqAa4KDAQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">364,272;358,388</XPD:ATTR>
+<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
+<XPD:REF name="Head">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
+<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="AXtWRmQ/j0G8KsAfZc/QeQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="pxhqUzjCEkqTLYfXynALEwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0nagXXOSFk+hHuMBpdFBLwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="z3Q2FaOZNUa329RgqNTDpgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="+0LMOuMUukS68snSkLSsTwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="bIZ0y/4MSEGDbNvxAP+XjAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="ow67AFPFhk2P92GHjX8x6gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="C8AG2Zjc9UCIEaei4/obTgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="cLLrD3Z3uUyN5TkuZIiYvQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="q1TRTMmCmEuxq3mV3WwE9wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="RpANS2KKQEiX7rWNn+sFQQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[25]" type="UMLAssociationView" guid="ALV9IpRzikWc38x/4t62CgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">383,272;484,396</XPD:ATTR>
+<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
+<XPD:REF name="Head">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF>
+<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="8t8bSCYvGkO28nJZE2y4nwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="3EywKQmkOE2KjbjVh2NmDgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="BbqpqccVf0Wg7tVha614JAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="YVFZpgGB/0O96quX2udZDwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="TSgUJz4gCUSqn+dKKulHoAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pIexnuTBiUiEhhq44l4rCwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="bB0rInPRJES1Fi1mh9FCEAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="yT+paMjNpkaG1OKJL+sYCAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Te1GttqM50mrkMzGYceWLQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="znNxDO7m6E6nvS/FYUZ9OAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="XUHdjv1boEaqvLcg553dbwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[26]" type="UMLAssociationView" guid="hBsdq7HI/EWiSzAGC7VcegAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">398,272;587,396</XPD:ATTR>
+<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
+<XPD:REF name="Head">tzICJ64LmUSx1fvEy4dHZQAA</XPD:REF>
+<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="AW09hEar3Einy0/8DRC44wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="GL4o+Jwo9kafQcdPg1ZCtgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="kNZhsHL9skazmf+MM+oIKwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="5T2cPS5X+UykejaXNX6mSAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="VipQilP5w0axs39cx9OCsgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="P16FQXg1DEOld8DfGFfSxQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="m6SZNVehm06iGtccsj43wAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="FcWiwQTsx02Ku0N5G3bjSgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="x2e4QwAQ50Sn6Io3k6B2tAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="d3kqRYSWSUSKKTZ+56sZkwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4MO5fs8bNkahA1cEAQY9zAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[27]" type="UMLAssociationView" guid="Gfgt2UdXqE2QrN+Jzf+QvQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">406,263;684,349</XPD:ATTR>
+<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
+<XPD:REF name="Head">hzoiTuCQqEuArZEejfwdnQAA</XPD:REF>
+<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="/p9rmIUUo0mUctVF/yhY5AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="P5QKAYFqikOaJu107L2QDwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="y/WNtKBGo0q8OYbjC0evjgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="cGwksZvEz0aSTFoED5zuJQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="lELIUkkOg0a4b0G8373BcAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pF9hWJbSZkCUq/C5qcS+7gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="R1FSACG6EkWd7DK8ihYAQAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="/NvtextfvUyZKtMbQ1urHAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="WXg43X5+gEiu4atePea88gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="4pUvTStSU0yU0BtcF8HyfQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="z+QrSf59lkSSqK+c5yKgcwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1028</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1004</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[28]" type="UMLAssociationView" guid="Z3PDc4i/1UCiaxni9RpD2wAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">756,473;397,581</XPD:ATTR>
+<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
+<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:REF name="Tail">Th+ZwPCIw0CZjtawrnGPrQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="mhm++LaJkk6lJzcTz7hSFgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="IxT95vhnIEyr12fdRQskKQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="d+KXspkLsEa/YezZSZ7YZAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="HxD2Y75aWkSp4d/0R6KiBgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="08HUrDXL5EahpEFi9GJ9yQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="K5rMwb6Iyka5HDC+pxIZOwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="QRLcMMAOqES9/c4itcB3vAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="GfMJbs1/nkShjuqnA/8BBAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="mQFH13/vQUucR5en5l/dUwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="jXmYJVpZxkCkrM3yJ0eHmgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="m0oKw9kT5k2CSLEOl9tV+gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[29]" type="UMLAssociationView" guid="JFsYjMcrU0GkgX8jFqUVZAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">406,252;704,263</XPD:ATTR>
+<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
+<XPD:REF name="Head">vYDCfUgYq0KaBSDnxbpYVgAA</XPD:REF>
+<XPD:REF name="Tail">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="R57gZgKnBkm8aQCFy90fiQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="GznyP+sffEKB3m9dw8jftQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="NM8M6o1EGkWwEmKdXXKpPAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="AoZLFazfK0WqZzhHukFsAwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="vVViwylf/Ei9ld6xTj7WdQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pDauXlrgH0KfuJt30X8zxgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="fhSnklGoSEqMAzQOJY57vwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="QGcntempZkeGNA54l7y1rAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="A5rd4V90HkCp3dmD7wYTbwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NKRAWeqgBEKgb6cHnYpt9QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="n4gqVjygvUK59/wDDHYNJgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[30]" type="UMLClassView" guid="wu+9+Z2tqE2B3qchWKoWdQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">20</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">500</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">119</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">63</XPD:ATTR>
+<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="zRZpHvisoUiNkQtlLufy/AAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="z/By7OpfokuCMZMimH2OSQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">CTvChannelParams</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="PKd1BAj8BkWUWLwbCv4oegAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="zu1bY/47U0eoDJhSjdTYNAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="KAuxxnmqhkmQ7MLBFq8lRgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Ynggyopqt02II9Rzg7q1VQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="PmvllpBms0ifaPkwzqXvOAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[31]" type="UMLAssociationView" guid="Q/k+TeR21UWA0JPwiSZAnwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">130,465;103,500</XPD:ATTR>
+<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
+<XPD:REF name="Head">wu+9+Z2tqE2B3qchWKoWdQAA</XPD:REF>
+<XPD:REF name="Tail">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="C2jwipMyN0iMiEays2pVbQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="MxF6R3nqrk+nOid9gUoepAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5CzND/56UUuAy2C5OXPJGAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="VSR1os7RckKbbg+wZ6UPWwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="2P5BNH8K/UKYeriBTZAbSgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="+gO4BIQphEShtlup7FhfcgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="nbxLBw93Oka1PVwDZftA2QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="3yHNXWsgu0eaPzi0F9a3dgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="X0Z4arOj+EWceCda6Sj0vgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="laRXvwF4WE2wUODF6aCNSQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="lKhOSy40pUOJhnfmNzIx5AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[32]" type="UMLAssociationView" guid="2tALOFJiukSZiwAj9gBDIQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">138,545;312,584</XPD:ATTR>
+<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
+<XPD:REF name="Head">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:REF name="Tail">wu+9+Z2tqE2B3qchWKoWdQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="BM0ZC/TOp0CzIS/dSFOgMQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="911s2zFZYUCPtLOmXSDdDgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="bOeJui9AgkWX+he6KT6czQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="lMa33WFxzU2ojAIXkT9IwAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="2U407qHmXE+0VHF/y4trXwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="MAu3FLtcFkOt8a9+Yj8MBAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="16BTtqnINEq6DZln/1Uc4AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Ehl7/9ciY0mjVGRlJGzTegAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="dAD5Dd+Px0eU/Z7MNaXtWgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="FstmADGG7k2p8GVFXyT/GAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="1RtPOXDsOEuSNTqKSxFAKAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedDiagrams[1]" type="UMLClassDiagram" guid="KQsibHBE0E+iq5h5Fks0CQAA">
+<XPD:ATTR name="Name" type="string">tvpackage</XPD:ATTR>
+<XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
+<XPD:ATTR name="DiagramType" type="string">RobustnessDiagram</XPD:ATTR>
+<XPD:REF name="DiagramOwner">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="x/A73wV6JUGNNCNYoihDDgAA">
+<XPD:REF name="Diagram">KQsibHBE0E+iq5h5Fks0CQAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">10</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLPackageView" guid="R7RBkUeb+E+5S8gvJN8+QQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">28</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">228</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
+<XPD:REF name="Model">ZRumjrTwgUamBDOstkagPgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Hex0jIlJWk2QTHp5TF36MwAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="155YNS2IsE2b46plldDuZwAA">
+<XPD:ATTR name="Text" type="string">atv</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="gqZ/H0j6nkqKMGqx1OqzOgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="mK5kp4doeUC6dn5S5jvPHAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLPackageView" guid="fCE1/LJF8k+yzWx4bHj2WgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">336</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">224</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
+<XPD:REF name="Model">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="N9Ut8OrmLU6VnX16D13WOwAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Yz9HR5DzxEuE9o9uHImtSQAA">
+<XPD:ATTR name="Text" type="string">dtv</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="LDxg9fdTakmhArzVxsd2GQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="L/ePjmLKwUeEeTrRhsEKMgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLPackageView" guid="H1zFqxbUzEqKqOJUsjP9UgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">260</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">72</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
+<XPD:REF name="Model">7dRihysn8kefkb+6mJlwzgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="f7UEhckiS0qQAoQ5jk3q5wAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="J4t7wKCRQk6ZH6fs1Q9YrgAA">
+<XPD:ATTR name="Text" type="string">tvjava</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="9qa1Yi+fukyu0We9ci5u/AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="+iZgsEiKfUmY0m8L9nAURwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLAssociationView" guid="G0kUvklDf0uhBeIUoV+srgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">267,141;138,228</XPD:ATTR>
+<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
+<XPD:REF name="Head">R7RBkUeb+E+5S8gvJN8+QQAA</XPD:REF>
+<XPD:REF name="Tail">H1zFqxbUzEqKqOJUsjP9UgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="6o6l7Ax4b0uvR1w70cdJiAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="3ZsGQfCQIk+ZPFC1FyyVeQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="BCGhRmtL7kmoY1iXaapJOwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">rIQWVfPr7E24Tt4ljeTZ4wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="SuRONY2jREyvBHGP7nheBQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="zqmFgnNCJ0mU+9gnrH18SwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="l9UCuL7VoEm7vFLWkobdoAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="yt3drhX0N0aispBa+C83TAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="8rSGjmyTy0iar869slrlPgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="QE0xM9HZIUK4iQSOifSKDQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NYMZ1wuIcUy7G5VODIYIDQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="L3X2M2UWvECpCLZj42krJAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="+dr3aeLg8k2RQ8khsHmmqAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">336,141;378,224</XPD:ATTR>
+<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
+<XPD:REF name="Head">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF>
+<XPD:REF name="Tail">H1zFqxbUzEqKqOJUsjP9UgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="eiIT0uNCpUywEWk7FrhutgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="m5vcHblPLUe9VZHiD1lPzgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="dHGIMYC9dUeyteDUvxEuNgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">0hCZfIhV4EOpKXcVPwcUnAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="bVRmxC4LeEivBU8rO/l1IwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="DGGWcQw7xESguDo8y8c9JwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Brf+/LZbFEamowtJ6zGOAgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="YyNOaiAWMU6urAt6uMo51wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="/6WmiwEpmUGnLzBRc6lCzwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="RjfRt8utjEiWYhIQFBxLqgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="eme8PTCUYkiREXPCAN1ACgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="HRQ1wVKzDUe1hazbUuDnVwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1020</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLPackageView" guid="HUFrn02Id0u4EHrKc4mxVgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">528</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">308</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
+<XPD:REF name="Model">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="I7oFyXOyn0ap6db6aB27kQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="UZqAJSuU3kSCM+H7F0CJAwAA">
+<XPD:ATTR name="Text" type="string">am_mw</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="uBO1MGx+MkeMvQYhb1C2NQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="kl+qD1R9/USAxQT6CzXArgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLPackageView" guid="I+6GQQgDxUay2yh9EH63ugAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">296</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">428</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">120</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">70</XPD:ATTR>
+<XPD:REF name="Model">y05IqzZQzU2XtiSPAXk7QgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="9hBSRpfEY02ywkAvNDqTXQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="h6PfAdCi8kytI+NLcAHmLAAA">
+<XPD:ATTR name="Text" type="string">am_adp</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="lQixSy3pSUqBMXv0rFJpcQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="GkA9EEwFZkyyC6WEJrJkMAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="jyEOqiMx5kuOhl2RypG5igAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">455,284;528,316</XPD:ATTR>
+<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
+<XPD:REF name="Head">HUFrn02Id0u4EHrKc4mxVgAA</XPD:REF>
+<XPD:REF name="Tail">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="CPHJazCBZ06NtAVR2VK7OQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="APOmD3psFUyWhRAnwzCajwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="QMsE3esBJk6sDRS6x5DJkQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="5/4cIerJAUmV49IBGwpo+AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Pet1Wl/5g0+pU9Kd2fc7SwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="xdfe8bjolEChoIUMuakZ8gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Dx+9oTBsHEO70cjv4b2azAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="BoU11LZqBk2U9D1Ai1YY2AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="GAWp04mbX0+qBItsdvgjYwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="fBqd46+r3kqJEpg8jQ4//wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="EDyc+T9/p0uT65Az3US0YgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="YWFKeOxwm0mHujDlyTbolQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">388,293;362,428</XPD:ATTR>
+<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
+<XPD:REF name="Head">I+6GQQgDxUay2yh9EH63ugAA</XPD:REF>
+<XPD:REF name="Tail">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="zrsbj2XE/EayNVwoOloIDAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="pIYrJ7JAAUSz3n/qiGAv0gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="qoKs5KXOckiwAYzN24SMoQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="5Y/PPNFnoUOKREH8OSaNBwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="88cAHmNV00eS5otEvuUQZAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="OURlWAjS10SUcdK4oeUXcwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="+YTxAPro+k+Ev3Qa9Td+KAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="NJe8vUJOvEixN2Md5vRGkgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="BuekzgD4P0aqdOzNBAVkYAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="5Y0Wg3PhS06h+5PmVU/QJAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="zTwLHGMcZUaH/kCRcMqJlQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-984</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1076</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="G47JdG1ivEWpCS5+NGRUWQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">528,373;415,431</XPD:ATTR>
+<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
+<XPD:REF name="Head">I+6GQQgDxUay2yh9EH63ugAA</XPD:REF>
+<XPD:REF name="Tail">HUFrn02Id0u4EHrKc4mxVgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="u6LdVCjKbEaIGLn56/w1QQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ona2Ko0szEK+2FIv3L6R1wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="fST4kYS4rkicfRLiq6BrYQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="AnTjwQSX4UO3xjKGm9U1PAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="GtS+L0c22kmmx+S6raeEAAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Rx+SX1Ukc0WijFhZRJ2tbgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="r48AH3NG+kGYdG2dItOtqwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="OMlcQeewVkyEmkWpq768pgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="C6OdcHaGUEG0WccqDQbNoQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="61/4k03iIkWp5ZY6aFMm4AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-912</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="aRw7UJOi9kaUwJX2uJ1tDwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-912</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">31</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLAssociation" guid="av0s6EXaYUKyooee2y6sdgAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">12BWSnVhhUOUuox7tdL41gAA</XPD:REF>
+<XPD:REF name="Views[1]">4F+C2zwwrEOjx/qCnLXWPAAA</XPD:REF>
+<XPD:REF name="Views[2]">lXf6uq0JtkK3YNXTxTyP7wAA</XPD:REF>
+<XPD:REF name="Views[3]">8jym3kotyE2sBWD5KjhUiQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="IEnUwW74QkSkdRZGqdKvaAAA">
+<XPD:REF name="Association">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
+<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">awNg1wfSGU22on1C+XpBlgAA</XPD:REF>
+<XPD:REF name="Views[1]">cGTSA3bQb0S81NQzsTj+QQAA</XPD:REF>
+<XPD:REF name="Views[2]">LWsKT6dOQUKXma9Eoh+sUwAA</XPD:REF>
+<XPD:REF name="Views[3]">l9TSA+eftkCY2p6qZDMGKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="GZcPUasbnkG3pyGKV6NFnAAA">
+<XPD:REF name="Association">av0s6EXaYUKyooee2y6sdgAA</XPD:REF>
+<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ioK1huVib0u6ILv3kHAeeQAA</XPD:REF>
+<XPD:REF name="Views[1]">cwfxPIXUd06ShM9BEivzxQAA</XPD:REF>
+<XPD:REF name="Views[2]">DBsnRjqoj0W9eAN/Flu+jwAA</XPD:REF>
+<XPD:REF name="Views[3]">DUu549wQM0qPn9dAjjrLZgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLAssociation" guid="cNCsWS2hgkeaGhYJv9oONgAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Qa1PhzSwWkyS1rm6eapfLwAA</XPD:REF>
+<XPD:REF name="Views[1]">QAoFSXFK+0S+5kDYAQ0LsgAA</XPD:REF>
+<XPD:REF name="Views[2]">rsOqshNVOkut6r+wW0Sp/wAA</XPD:REF>
+<XPD:REF name="Views[3]">0wZW9IH3y0OEPMfN5FyHQAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="PFZlUbzZu02nTTLsYZBoDgAA">
+<XPD:REF name="Association">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">TM3RNruxzEezNhF8XO/FmwAA</XPD:REF>
+<XPD:REF name="Views[1]">NpASusGGKU+/KwcKkTAMogAA</XPD:REF>
+<XPD:REF name="Views[2]">3dtXpNLbXka7wekzvAWsXQAA</XPD:REF>
+<XPD:REF name="Views[3]">Mvk2196ldk+5GLgct+OKuwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="2JZlFpDZPkGgaoWrrPAGXAAA">
+<XPD:REF name="Association">cNCsWS2hgkeaGhYJv9oONgAA</XPD:REF>
+<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ySD9HMBWmEWoJg+/6boBZgAA</XPD:REF>
+<XPD:REF name="Views[1]">LXz8D2AdoE6ojzgkYCO0qAAA</XPD:REF>
+<XPD:REF name="Views[2]">ia8j06EduUmxgB5smbA9hQAA</XPD:REF>
+<XPD:REF name="Views[3]">/JYlnmhzTk66TicK0RjYaQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLAssociation" guid="CVx7QaOEd0iJQ6USdSCilwAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">UmHHYiIr3k+gNNomjLpgwwAA</XPD:REF>
+<XPD:REF name="Views[1]">ZBlvBeIE2UGGPTML4sQ7SgAA</XPD:REF>
+<XPD:REF name="Views[2]">UDn5R84weEayOYl6QVFj1wAA</XPD:REF>
+<XPD:REF name="Views[3]">OApAa7HXz0aTiMZGZ/g2tAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="q5Ko0bXKcE6uj05NJPSddwAA">
+<XPD:REF name="Association">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">24RGLobteEil7cUdAcyUcAAA</XPD:REF>
+<XPD:REF name="Views[1]">6Uw1pdad6kC8N8S0Rf1HxwAA</XPD:REF>
+<XPD:REF name="Views[2]">CuUsJAcsAUWwVZJzegOegAAA</XPD:REF>
+<XPD:REF name="Views[3]">AST9GWgDTEWR07o7yUcgIQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="XvxorIQvl0aKnzyznjd1uwAA">
+<XPD:REF name="Association">CVx7QaOEd0iJQ6USdSCilwAA</XPD:REF>
+<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">W1YT5dqwMUSUI29zCC2LZQAA</XPD:REF>
+<XPD:REF name="Views[1]">X96IIfOZSE2FAliwKkCNYgAA</XPD:REF>
+<XPD:REF name="Views[2]">tr7uiHRKz0e//ValH5GU+AAA</XPD:REF>
+<XPD:REF name="Views[3]">zdcHIs6dNEmxQNtCK5uHIQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLAssociation" guid="hBOTE33GDUO/X8s5oHlAmQAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">oYsj3yhzJkCKmOBcWIHNDwAA</XPD:REF>
+<XPD:REF name="Views[1]">GT6R2h3HkU6LThPKaghC1QAA</XPD:REF>
+<XPD:REF name="Views[2]">eWMr3v5Qb0y/nXu2s/EP5wAA</XPD:REF>
+<XPD:REF name="Views[3]">GR9gxzUjNkKmujWHFobLtAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="qOlPMeLYpUC4lTEl3Hsc8QAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
+<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">UuRRAQf+y0OdXTOvWu7nUAAA</XPD:REF>
+<XPD:REF name="Views[1]">vI5c+acLSk6IfCcdqlaBggAA</XPD:REF>
+<XPD:REF name="Views[2]">w3rpxhxEsEu0y7myhFrrkQAA</XPD:REF>
+<XPD:REF name="Views[3]">8Ip2rQJRaEaPAOW0cJSd/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Yo1IoB0X3ka1C+a/6xk1/gAA">
+<XPD:REF name="Association">hBOTE33GDUO/X8s5oHlAmQAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">+SSR3TM1z0m5UkTLiuMrGwAA</XPD:REF>
+<XPD:REF name="Views[1]">Uvo2ryiBg0Oa5GJF4TRyhQAA</XPD:REF>
+<XPD:REF name="Views[2]">QBI1NHwjWU2dkj+SLUFZ+AAA</XPD:REF>
+<XPD:REF name="Views[3]">IYVJT/RjPUqjv8rl6ZIQiwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLAssociation" guid="/X1BIuClXkywNV1vNa/LWwAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Vcgjd9eKakOjuUAjwzzhJgAA</XPD:REF>
+<XPD:REF name="Views[1]">+iIIR1mEnUynEPEjuGAd7AAA</XPD:REF>
+<XPD:REF name="Views[2]">bZn71kXJQUOP3yAyCa5RvgAA</XPD:REF>
+<XPD:REF name="Views[3]">O36co7nFz0elpJnbKtsYMwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="BVpPYPY4V0KsTBJTRoLjyAAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
+<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Hv4K+XlgIkqDgqEz3aQWNQAA</XPD:REF>
+<XPD:REF name="Views[1]">4o7M8jakfkixRwVgESrUnwAA</XPD:REF>
+<XPD:REF name="Views[2]">rCPaxzL0LEuk9Jjbqi+D2gAA</XPD:REF>
+<XPD:REF name="Views[3]">HKXhPda/vUuVwv4sR9ZR9QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="RoKhf4Bw3kmRk2O2D4GlxQAA">
+<XPD:REF name="Association">/X1BIuClXkywNV1vNa/LWwAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">yjjLYCXJjUqX0IHnpKwHwQAA</XPD:REF>
+<XPD:REF name="Views[1]">k1XiyO9mlke/IAq5UuYI9gAA</XPD:REF>
+<XPD:REF name="Views[2]">Xtc7Jqe6N0+JAzLg1RxYLwAA</XPD:REF>
+<XPD:REF name="Views[3]">W0UPJtBpLU6Y5SjscWTiVAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLAssociation" guid="PudswW77eEShTMEdcK5BCAAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VjZwKWmCoUO5wNRGJGVShAAA</XPD:REF>
+<XPD:REF name="Views[1]">6e9pHkpPaUyLDCYYnUYAOAAA</XPD:REF>
+<XPD:REF name="Views[2]">QA7tnAAMA0e3tCDRlkB/JwAA</XPD:REF>
+<XPD:REF name="Views[3]">gdUdn5u5x0KDsDKM41p2CQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="Io3cINfhiE23pmiSxpS6swAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
+<XPD:REF name="Participant">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">d/3xrtQ+nU69mQYepo7NvQAA</XPD:REF>
+<XPD:REF name="Views[1]">HcOo4bUmbUqLEjVUm2L2AQAA</XPD:REF>
+<XPD:REF name="Views[2]">tQj+naSiJ0mB4W89ahH5ygAA</XPD:REF>
+<XPD:REF name="Views[3]">LNFybtIVIkOXnQ/9QC5jEwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="vyoQZGl3UECBMhf7+IDQUwAA">
+<XPD:REF name="Association">PudswW77eEShTMEdcK5BCAAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">rqoTwNlD20Gou9xOLQ2RNgAA</XPD:REF>
+<XPD:REF name="Views[1]">ox9r7npaB0in7/ygfG1ZMwAA</XPD:REF>
+<XPD:REF name="Views[2]">exLwGLRY306J0CEcqxlOrgAA</XPD:REF>
+<XPD:REF name="Views[3]">qxZgk8R36k2S3vGRfQegfwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="q5PurOmOUUOX8hzj5CINYQAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">QHk4xsvJRUGhKn0p+sReaAAA</XPD:REF>
+<XPD:REF name="Views[1]">ezGCtUA0dUOn10D5pUOtoAAA</XPD:REF>
+<XPD:REF name="Views[2]">QcGPzg741ki4yTGfoKvK9AAA</XPD:REF>
+<XPD:REF name="Views[3]">ioZQYN39bEu/gy37UfkhmQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="PhlKgbqPt0OClpwk2m9vswAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
+<XPD:REF name="Participant">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VrmcPyj2oUyEm5i/AG7/KgAA</XPD:REF>
+<XPD:REF name="Views[1]">odMtivppNUOccWtC85AVCQAA</XPD:REF>
+<XPD:REF name="Views[2]">2IiGGrbDkUiobp5CJnME1QAA</XPD:REF>
+<XPD:REF name="Views[3]">+70t9Os6zUWhIAhufEQsBAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="iy8GVdK11EmKnmJ6LivVVQAA">
+<XPD:REF name="Association">q5PurOmOUUOX8hzj5CINYQAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">mZFBakBXmE6Gj5qumz51gwAA</XPD:REF>
+<XPD:REF name="Views[1]">KHpH30oHrEew1AGquvXiEQAA</XPD:REF>
+<XPD:REF name="Views[2]">W7KAnZMmjEKAxuaUXA4D6AAA</XPD:REF>
+<XPD:REF name="Views[3]">jsiact/gpUS21gy1IeSlZQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="8zCqordbBESBaPJH8SIoOQAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">l3oAx6sfA0ScCOouvAFKYwAA</XPD:REF>
+<XPD:REF name="Views[1]">pM/XXFo9Ikq+kK5++HoZ0QAA</XPD:REF>
+<XPD:REF name="Views[2]">igklIYxpfka7OH5oAnRbPwAA</XPD:REF>
+<XPD:REF name="Views[3]">RtZQfGM0uUqohb/WlARRpwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="72fG4kbiM0eyczFPq2MtVAAA">
+<XPD:ATTR name="Multiplicity" type="string">1..*</XPD:ATTR>
+<XPD:REF name="Association">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
+<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">pr9mkVSNO0KasNMsFvgDuQAA</XPD:REF>
+<XPD:REF name="Views[1]">4fUHmnlcd0WplogWZWqPRQAA</XPD:REF>
+<XPD:REF name="Views[2]">kKRq4K1cvEup70Oz2UFd8QAA</XPD:REF>
+<XPD:REF name="Views[3]">DS2eOvXKXku93Y4x950QPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="zefo1Bu+v0e4gn9nUL+bSQAA">
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Association">8zCqordbBESBaPJH8SIoOQAA</XPD:REF>
+<XPD:REF name="Participant">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">lDsB+MeNlUy+OEBCbfs0OAAA</XPD:REF>
+<XPD:REF name="Views[1]">EeUDIEWsnkO5HzTU6L6kZQAA</XPD:REF>
+<XPD:REF name="Views[2]">TuyQdZk0H0+ai9Mg3ZtK3AAA</XPD:REF>
+<XPD:REF name="Views[3]">NKw56kYvx0W0KlwhXPYWMwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="3RrM1HB71kyHO0jB4JI4zgAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">5vCGUSmlwUWKkjul/i5CoAAA</XPD:REF>
+<XPD:REF name="Views[1]">ihIaZz5p+0Cte+Zqg1wUKgAA</XPD:REF>
+<XPD:REF name="Views[2]">XyhhchGH70uYaM5UdGboKQAA</XPD:REF>
+<XPD:REF name="Views[3]">+N+OW0LtoEyevYQ++bVO1gAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="ULQw0JNjPE2758pFWlo+MQAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
+<XPD:REF name="Participant">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">blnGfW4UCk6tS0veRc88xAAA</XPD:REF>
+<XPD:REF name="Views[1]">jGRa3FaTrUWVhYVG834fjwAA</XPD:REF>
+<XPD:REF name="Views[2]">olvLmzjsfka5YmNEOntQDAAA</XPD:REF>
+<XPD:REF name="Views[3]">H/do1s5Rh02ETrOyjtaoaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="DkcX/fIec029p5Da5gYToAAA">
+<XPD:REF name="Association">3RrM1HB71kyHO0jB4JI4zgAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vLsrualWRkO0QI8PcBWGAAAA</XPD:REF>
+<XPD:REF name="Views[1]">vWndJmxhrkKfipX/zAAt4AAA</XPD:REF>
+<XPD:REF name="Views[2]">lKgJhvwP/Eygz7oPLvwsxwAA</XPD:REF>
+<XPD:REF name="Views[3]">AdMO10glEEWGGHqpzKNvewAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLAssociation" guid="GjMZbUwaMkGOkbxOXau26AAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">EWnB2mjt6ke3pnsnQFRgJwAA</XPD:REF>
+<XPD:REF name="Views[1]">dM3yo1oYRUWNB1JawgFnywAA</XPD:REF>
+<XPD:REF name="Views[2]">/IP55LSMZUCRoa77gkMh9gAA</XPD:REF>
+<XPD:REF name="Views[3]">Og4FQYOz9kOr8LF43j+ySwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="aYL27tYOR02se3g//aEBeAAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
+<XPD:REF name="Participant">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Ggu7vb3GMU2vn9mS8bGZpwAA</XPD:REF>
+<XPD:REF name="Views[1]">wMyvwGpZQUmJ2a2lXlkc/AAA</XPD:REF>
+<XPD:REF name="Views[2]">rn/sn4ErGkyYnwDUlnpmTAAA</XPD:REF>
+<XPD:REF name="Views[3]">wElMDINXY0esqBl7AwoyfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="gc0GlJ6ewUOpiyya+XPqjQAA">
+<XPD:REF name="Association">GjMZbUwaMkGOkbxOXau26AAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">zHiCXVqqgE6r2lDdnVDI1gAA</XPD:REF>
+<XPD:REF name="Views[1]">19Ii9g15zUmLLURud9e9XAAA</XPD:REF>
+<XPD:REF name="Views[2]">KLCf1m7tBkGvkM3iOxLhJgAA</XPD:REF>
+<XPD:REF name="Views[3]">1+qZEhcpyk6RHirwjBjalgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="m6lnHtsBL02A4Oup+IzVEAAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">DbUG5zy8r0yq6L/I1naVdQAA</XPD:REF>
+<XPD:REF name="Views[1]">1qY9qbCT1ka5tmfuL9yaJgAA</XPD:REF>
+<XPD:REF name="Views[2]">bnG59/mNjk+fcthvMQG2VAAA</XPD:REF>
+<XPD:REF name="Views[3]">wovrqiKgc0qw9BUyPaGuBQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="kdbNMfgoG02cJO0UFJeeLwAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
+<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">JbJSjKTBikyT++rY1XVCtwAA</XPD:REF>
+<XPD:REF name="Views[1]">wUtw7zNylEK+wDvPOsUtGwAA</XPD:REF>
+<XPD:REF name="Views[2]">/cBBOvztgE6Kd7yvemxXPwAA</XPD:REF>
+<XPD:REF name="Views[3]">uj1vGzCGtkGielBw0Bxi4QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="l6Lg/NJG5UWu+7ALxaVP3gAA">
+<XPD:REF name="Association">m6lnHtsBL02A4Oup+IzVEAAA</XPD:REF>
+<XPD:REF name="Participant">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">hytVQ6VnmEaHnFV5o9fQ0AAA</XPD:REF>
+<XPD:REF name="Views[1]">eYodfuyOKEK7WC9dBBlaigAA</XPD:REF>
+<XPD:REF name="Views[2]">BEEaANsP0UCbPpRjMWyndwAA</XPD:REF>
+<XPD:REF name="Views[3]">JKx2O2r/H0y9NJ3+4rup1QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[11]" type="UMLAssociation" guid="gmKjyBaRB0SfVd2p3FDOTwAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">l2Yo1ObIG0WVx7IS2a/B3QAA</XPD:REF>
+<XPD:REF name="Views[1]">Bt1whnZV8ke93vkLSyNq6wAA</XPD:REF>
+<XPD:REF name="Views[2]">fqRKs5ARzUGsdlKFgCFhWQAA</XPD:REF>
+<XPD:REF name="Views[3]">5M/QRFEaxUa0SktETbkRSwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="X5VvOi2uGkGYzMMS5nWm2AAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
+<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">51OtH+Gyy0+XZJVSgV/KuQAA</XPD:REF>
+<XPD:REF name="Views[1]">V2pqj6nPg0SqB+TNOQI5PwAA</XPD:REF>
+<XPD:REF name="Views[2]">1rWGuTeEqEm+RdcskXCo9gAA</XPD:REF>
+<XPD:REF name="Views[3]">90vol1uY7U27TcNYwOdZBQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="QwwfXlN26EahMaF2XDAvLAAA">
+<XPD:REF name="Association">gmKjyBaRB0SfVd2p3FDOTwAA</XPD:REF>
+<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">oOLw6a4XNk6oN6yvhlsf7QAA</XPD:REF>
+<XPD:REF name="Views[1]">kMLAHkAn9EKw71vpw3PgHQAA</XPD:REF>
+<XPD:REF name="Views[2]">FYDexLT3eUK3X5xdW3Qq/gAA</XPD:REF>
+<XPD:REF name="Views[3]">VJLq9UMlJE2EqLEbDm23HQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="iBQV0DXX90uUjMTGr6FFjQAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">dSXCMAUeXkaVaOqAa4KDAQAA</XPD:REF>
+<XPD:REF name="Views[1]">AXtWRmQ/j0G8KsAfZc/QeQAA</XPD:REF>
+<XPD:REF name="Views[2]">pxhqUzjCEkqTLYfXynALEwAA</XPD:REF>
+<XPD:REF name="Views[3]">0nagXXOSFk+hHuMBpdFBLwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="xf4XKZpxx0iF7C4H+oOABwAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
+<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">+0LMOuMUukS68snSkLSsTwAA</XPD:REF>
+<XPD:REF name="Views[1]">ow67AFPFhk2P92GHjX8x6gAA</XPD:REF>
+<XPD:REF name="Views[2]">cLLrD3Z3uUyN5TkuZIiYvQAA</XPD:REF>
+<XPD:REF name="Views[3]">RpANS2KKQEiX7rWNn+sFQQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="IMPiiZPlxkaJkH8N2NGOggAA">
+<XPD:REF name="Association">iBQV0DXX90uUjMTGr6FFjQAA</XPD:REF>
+<XPD:REF name="Participant">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">z3Q2FaOZNUa329RgqNTDpgAA</XPD:REF>
+<XPD:REF name="Views[1]">bIZ0y/4MSEGDbNvxAP+XjAAA</XPD:REF>
+<XPD:REF name="Views[2]">C8AG2Zjc9UCIEaei4/obTgAA</XPD:REF>
+<XPD:REF name="Views[3]">q1TRTMmCmEuxq3mV3WwE9wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[13]" type="UMLAssociation" guid="9P0hz9Bq2U6gDVowATxiWAAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ALV9IpRzikWc38x/4t62CgAA</XPD:REF>
+<XPD:REF name="Views[1]">8t8bSCYvGkO28nJZE2y4nwAA</XPD:REF>
+<XPD:REF name="Views[2]">3EywKQmkOE2KjbjVh2NmDgAA</XPD:REF>
+<XPD:REF name="Views[3]">BbqpqccVf0Wg7tVha614JAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="yVknRLQq7U2nj3bRfizyAgAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
+<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">TSgUJz4gCUSqn+dKKulHoAAA</XPD:REF>
+<XPD:REF name="Views[1]">bB0rInPRJES1Fi1mh9FCEAAA</XPD:REF>
+<XPD:REF name="Views[2]">Te1GttqM50mrkMzGYceWLQAA</XPD:REF>
+<XPD:REF name="Views[3]">XUHdjv1boEaqvLcg553dbwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="BSJLLgAd4kCusm/8BFZQMQAA">
+<XPD:REF name="Association">9P0hz9Bq2U6gDVowATxiWAAA</XPD:REF>
+<XPD:REF name="Participant">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">YVFZpgGB/0O96quX2udZDwAA</XPD:REF>
+<XPD:REF name="Views[1]">pIexnuTBiUiEhhq44l4rCwAA</XPD:REF>
+<XPD:REF name="Views[2]">yT+paMjNpkaG1OKJL+sYCAAA</XPD:REF>
+<XPD:REF name="Views[3]">znNxDO7m6E6nvS/FYUZ9OAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[14]" type="UMLAssociation" guid="sBsUoQYdEkCsxRTpPtknYAAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">hBsdq7HI/EWiSzAGC7VcegAA</XPD:REF>
+<XPD:REF name="Views[1]">AW09hEar3Einy0/8DRC44wAA</XPD:REF>
+<XPD:REF name="Views[2]">GL4o+Jwo9kafQcdPg1ZCtgAA</XPD:REF>
+<XPD:REF name="Views[3]">kNZhsHL9skazmf+MM+oIKwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="6CsrL0wlVEKI657OoEev1gAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
+<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VipQilP5w0axs39cx9OCsgAA</XPD:REF>
+<XPD:REF name="Views[1]">m6SZNVehm06iGtccsj43wAAA</XPD:REF>
+<XPD:REF name="Views[2]">x2e4QwAQ50Sn6Io3k6B2tAAA</XPD:REF>
+<XPD:REF name="Views[3]">4MO5fs8bNkahA1cEAQY9zAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="bObyymjPEkeQZSoHCKpP2QAA">
+<XPD:REF name="Association">sBsUoQYdEkCsxRTpPtknYAAA</XPD:REF>
+<XPD:REF name="Participant">iUy0YZgyREC+o54lTQptaAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">5T2cPS5X+UykejaXNX6mSAAA</XPD:REF>
+<XPD:REF name="Views[1]">P16FQXg1DEOld8DfGFfSxQAA</XPD:REF>
+<XPD:REF name="Views[2]">FcWiwQTsx02Ku0N5G3bjSgAA</XPD:REF>
+<XPD:REF name="Views[3]">d3kqRYSWSUSKKTZ+56sZkwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[15]" type="UMLAssociation" guid="5JmzC90ylki6klhVRRibGAAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Gfgt2UdXqE2QrN+Jzf+QvQAA</XPD:REF>
+<XPD:REF name="Views[1]">/p9rmIUUo0mUctVF/yhY5AAA</XPD:REF>
+<XPD:REF name="Views[2]">P5QKAYFqikOaJu107L2QDwAA</XPD:REF>
+<XPD:REF name="Views[3]">y/WNtKBGo0q8OYbjC0evjgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="be+eScBkV0Cn4n2XjSojvgAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
+<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">lELIUkkOg0a4b0G8373BcAAA</XPD:REF>
+<XPD:REF name="Views[1]">R1FSACG6EkWd7DK8ihYAQAAA</XPD:REF>
+<XPD:REF name="Views[2]">WXg43X5+gEiu4atePea88gAA</XPD:REF>
+<XPD:REF name="Views[3]">z+QrSf59lkSSqK+c5yKgcwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="zCPl48BYx0CFRkp8Jj5mogAA">
+<XPD:REF name="Association">5JmzC90ylki6klhVRRibGAAA</XPD:REF>
+<XPD:REF name="Participant">/LI4+1GTjEagI/wLEFpVSQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">cGwksZvEz0aSTFoED5zuJQAA</XPD:REF>
+<XPD:REF name="Views[1]">pF9hWJbSZkCUq/C5qcS+7gAA</XPD:REF>
+<XPD:REF name="Views[2]">/NvtextfvUyZKtMbQ1urHAAA</XPD:REF>
+<XPD:REF name="Views[3]">4pUvTStSU0yU0BtcF8HyfQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[16]" type="UMLPackage" guid="7dRihysn8kefkb+6mJlwzgAA">
+<XPD:ATTR name="Name" type="string">tvjava</XPD:ATTR>
+<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPackage</XPD:ATTR>
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
+<XPD:REF name="Views[0]">H1zFqxbUzEqKqOJUsjP9UgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">jLzV7XdHP0Ogmb7/6IPCtgAA</XPD:REF>
+<XPD:REF name="Associations[1]">DGWju3i/80ObxLedRPIIEwAA</XPD:REF>
+<XPD:REF name="Associations[2]">frvBY5I3t0yZgEqYHUhfEQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[17]" type="UMLPackage" guid="CN6L5smMd0u/4SQDgGuxlAAA">
+<XPD:ATTR name="Name" type="string">am_mw</XPD:ATTR>
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
+<XPD:REF name="Views[0]">HUFrn02Id0u4EHrKc4mxVgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">MOhicSFw0kKsC3+R+Reo0AAA</XPD:REF>
+<XPD:REF name="Associations[1]">elujImCAXkaoOjRAKkuxUAAA</XPD:REF>
+<XPD:REF name="Associations[2]">0RZNIMepB0W9fkd6pMCEZwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[18]" type="UMLPackage" guid="y05IqzZQzU2XtiSPAXk7QgAA">
+<XPD:ATTR name="Name" type="string">am_adp</XPD:ATTR>
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
+<XPD:REF name="Views[0]">I+6GQQgDxUay2yh9EH63ugAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">n4pg4fd/GUuaJaSzXBirOAAA</XPD:REF>
+<XPD:REF name="Associations[1]">SVDzdW2e/kG2il66SgxQ1wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[19]" type="UMLAssociation" guid="Yy1zZGFqjUCrfxwigF/GpgAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">jyEOqiMx5kuOhl2RypG5igAA</XPD:REF>
+<XPD:REF name="Views[1]">CPHJazCBZ06NtAVR2VK7OQAA</XPD:REF>
+<XPD:REF name="Views[2]">APOmD3psFUyWhRAnwzCajwAA</XPD:REF>
+<XPD:REF name="Views[3]">QMsE3esBJk6sDRS6x5DJkQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="KeKc5deyJkKjIbzodSAF8QAA">
+<XPD:REF name="Association">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
+<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Pet1Wl/5g0+pU9Kd2fc7SwAA</XPD:REF>
+<XPD:REF name="Views[1]">Dx+9oTBsHEO70cjv4b2azAAA</XPD:REF>
+<XPD:REF name="Views[2]">GAWp04mbX0+qBItsdvgjYwAA</XPD:REF>
+<XPD:REF name="Views[3]">EDyc+T9/p0uT65Az3US0YgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="MOhicSFw0kKsC3+R+Reo0AAA">
+<XPD:REF name="Association">Yy1zZGFqjUCrfxwigF/GpgAA</XPD:REF>
+<XPD:REF name="Participant">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">5/4cIerJAUmV49IBGwpo+AAA</XPD:REF>
+<XPD:REF name="Views[1]">xdfe8bjolEChoIUMuakZ8gAA</XPD:REF>
+<XPD:REF name="Views[2]">BoU11LZqBk2U9D1Ai1YY2AAA</XPD:REF>
+<XPD:REF name="Views[3]">fBqd46+r3kqJEpg8jQ4//wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[20]" type="UMLAssociation" guid="+rFPRw7qR0aoTGBGytrjDAAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">YWFKeOxwm0mHujDlyTbolQAA</XPD:REF>
+<XPD:REF name="Views[1]">zrsbj2XE/EayNVwoOloIDAAA</XPD:REF>
+<XPD:REF name="Views[2]">pIYrJ7JAAUSz3n/qiGAv0gAA</XPD:REF>
+<XPD:REF name="Views[3]">qoKs5KXOckiwAYzN24SMoQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="osliKvkWrU6Jd0FLz/mZngAA">
+<XPD:REF name="Association">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
+<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">88cAHmNV00eS5otEvuUQZAAA</XPD:REF>
+<XPD:REF name="Views[1]">+YTxAPro+k+Ev3Qa9Td+KAAA</XPD:REF>
+<XPD:REF name="Views[2]">BuekzgD4P0aqdOzNBAVkYAAA</XPD:REF>
+<XPD:REF name="Views[3]">zTwLHGMcZUaH/kCRcMqJlQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="n4pg4fd/GUuaJaSzXBirOAAA">
+<XPD:REF name="Association">+rFPRw7qR0aoTGBGytrjDAAA</XPD:REF>
+<XPD:REF name="Participant">y05IqzZQzU2XtiSPAXk7QgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">5Y/PPNFnoUOKREH8OSaNBwAA</XPD:REF>
+<XPD:REF name="Views[1]">OURlWAjS10SUcdK4oeUXcwAA</XPD:REF>
+<XPD:REF name="Views[2]">NJe8vUJOvEixN2Md5vRGkgAA</XPD:REF>
+<XPD:REF name="Views[3]">5Y0Wg3PhS06h+5PmVU/QJAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[21]" type="UMLAssociation" guid="eNd3z1weKEWCnlfqPTDLIgAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">G47JdG1ivEWpCS5+NGRUWQAA</XPD:REF>
+<XPD:REF name="Views[1]">u6LdVCjKbEaIGLn56/w1QQAA</XPD:REF>
+<XPD:REF name="Views[2]">ona2Ko0szEK+2FIv3L6R1wAA</XPD:REF>
+<XPD:REF name="Views[3]">fST4kYS4rkicfRLiq6BrYQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="elujImCAXkaoOjRAKkuxUAAA">
+<XPD:REF name="Association">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
+<XPD:REF name="Participant">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">GtS+L0c22kmmx+S6raeEAAAA</XPD:REF>
+<XPD:REF name="Views[1]">r48AH3NG+kGYdG2dItOtqwAA</XPD:REF>
+<XPD:REF name="Views[2]">C6OdcHaGUEG0WccqDQbNoQAA</XPD:REF>
+<XPD:REF name="Views[3]">aRw7UJOi9kaUwJX2uJ1tDwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="SVDzdW2e/kG2il66SgxQ1wAA">
+<XPD:REF name="Association">eNd3z1weKEWCnlfqPTDLIgAA</XPD:REF>
+<XPD:REF name="Participant">y05IqzZQzU2XtiSPAXk7QgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">AnTjwQSX4UO3xjKGm9U1PAAA</XPD:REF>
+<XPD:REF name="Views[1]">Rx+SX1Ukc0WijFhZRJ2tbgAA</XPD:REF>
+<XPD:REF name="Views[2]">OMlcQeewVkyEmkWpq768pgAA</XPD:REF>
+<XPD:REF name="Views[3]">61/4k03iIkWp5ZY6aFMm4AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[22]" type="UMLPackage" guid="bnJ8ggSchket3/t1l7Kx4wAA">
+<XPD:ATTR name="Name" type="string">tv</XPD:ATTR>
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#OwnedElements" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLPackage" guid="T1P4Xv7L+UuEzFqU+iyS5wAA">
+<XPD:ATTR name="Name" type="string">dtv</XPD:ATTR>
+<XPD:REF name="Namespace">bnJ8ggSchket3/t1l7Kx4wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
+<XPD:REF name="Views[0]">fCE1/LJF8k+yzWx4bHj2WgAA</XPD:REF>
+<XPD:ATTR name="#OwnedElements" type="integer">14</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="xAj1pchzIEeSaRcR2+aFTwAA">
+<XPD:ATTR name="Name" type="string">CDtv</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">9Ld1pTeBF0CZmoVdEfEBMQAA</XPD:REF>
+<XPD:REF name="Views[1]">mxcpZDUEI0aTfXvfNUP8/QAA</XPD:REF>
+<XPD:REF name="Views[2]">0p/pTktl+kimPcmFJ4/wywAA</XPD:REF>
+<XPD:REF name="Views[3]">kWtX8dZWikSHi3kCydMHCAAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">32</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="dmYYHpECE0G9dWsxqVRqVgAA">
+<XPD:ATTR name="Name" type="string">startScan</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">开始频é“æœç´¢</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="XpPbBfTfWU2kqA1mr/vbJgAA">
+<XPD:ATTR name="Name" type="string">stopScan</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="UkrKc9f59kSDyV/AaLMH+gAA">
+<XPD:ATTR name="Name" type="string">startBooking</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="JcvijNcflkmNK8+KOhdCggAA">
+<XPD:ATTR name="Name" type="string">pause</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">æš‚åœæ’­æ”¾(回放和时移播放时有效)</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="i8IvkFjbqUCCSXorAzUdRAAA">
+<XPD:ATTR name="Name" type="string">resume</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">æ¢å¤æ’­æ”¾(回放和时移播放时有效)</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="dQd++JYYo0amx+JlLdJFWQAA">
+<XPD:ATTR name="Name" type="string">playProgram</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="zO9p84LeHUGvoLEQTCAS3QAA">
+<XPD:ATTR name="Name" type="string">num</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">dQd++JYYo0amx+JlLdJFWQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="eEq01zCgM0aZvokMO+SqkQAA">
+<XPD:ATTR name="Name" type="string">fastForward</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">快进播放(回放和时移播放时有效)</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="MU6Fk6s7TUi43t3TzPmDYAAA">
+<XPD:ATTR name="Name" type="string">fastBackward</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">快退播放(回放和时移播放时有效)</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="+JpQ6Kv+wUetg2ukud8xAAAA">
+<XPD:ATTR name="Name" type="string">setVideoWindow</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="Urh1T97yF0qVB2qrq91V/AAA">
+<XPD:ATTR name="Name" type="string">getTime</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="+OoQqX2+hEy7+IGpcoRO6wAA">
+<XPD:ATTR name="Name" type="string">stopPlaying</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="5AWp11enzE2zKYbJKwZ4SgAA">
+<XPD:ATTR name="Name" type="string">startTimeshifting</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">开始时移播放</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="Tt9RCFNm7USWaJVzeiQO4wAA">
+<XPD:ATTR name="Name" type="string">stopTimeshifting</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[13]" type="UMLOperation" guid="9gabibFFh0+pG1jLLre65AAA">
+<XPD:ATTR name="Name" type="string">startRecording</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[14]" type="UMLOperation" guid="3d/CswBBrEy2IUoFJUC4zAAA">
+<XPD:ATTR name="Name" type="string">switchAudioTrack</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">切æ¢å£°é“</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[15]" type="UMLOperation" guid="IGijEoer5kSmMkA+Fo3ArwAA">
+<XPD:ATTR name="Name" type="string">stopRecording</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[16]" type="UMLOperation" guid="Zb4VlxMHWkS/g4Mf01SYQAAA">
+<XPD:ATTR name="Name" type="string">startPlayback</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">开始录制节目回放</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[17]" type="UMLOperation" guid="YMsIpjPwskyU47Z7OFZGswAA">
+<XPD:ATTR name="Name" type="string">stopPlayback</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[18]" type="UMLOperation" guid="KYZZjRnW+E6fVbHlCQJHLgAA">
+<XPD:ATTR name="Name" type="string">startBooking</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">开始一个预约处ç†</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[19]" type="UMLOperation" guid="+mKhDWf/OkWW6S8s1fQrdAAA">
+<XPD:ATTR name="Name" type="string">getFrontendStatus</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">å–å¾—å‰ç«¯é”定状æ€</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[20]" type="UMLOperation" guid="4LuPht07CEyB+RsryYpq8wAA">
+<XPD:ATTR name="Name" type="string">getFrontendSignalStrength</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">å–å¾—å‰ç«¯ä¿¡å·å¼ºåº¦</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[21]" type="UMLOperation" guid="auftPPtm9ESAf8dNdwpO8wAA">
+<XPD:ATTR name="Name" type="string">getFrontendSNR</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">å–å¾—å‰ç«¯SNR值</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[22]" type="UMLOperation" guid="SkFMqj2tAkCHB6YzXb25VAAA">
+<XPD:ATTR name="Name" type="string">getFrontendBER</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">å–å¾—å‰ç«¯BER值</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[23]" type="UMLOperation" guid="1Kkg1e8Eq0yMsbrLqj30vAAA">
+<XPD:ATTR name="Name" type="string">restoreFactorySetting</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">æ¢å¤å‡ºåŽ‚设置</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[24]" type="UMLOperation" guid="0F6QZhvGnEi9TAKhwr5gqAAA">
+<XPD:ATTR name="Name" type="string">setCvbsAmpOut</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">模拟CVBS AMP OUT</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[25]" type="UMLOperation" guid="H0pDJxWBtUeDplA7FSzwhQAA">
+<XPD:ATTR name="Name" type="string">unblock</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">解é”并播放当å‰å·²åŠ é”的频é“,例如密ç éªŒè¯é€šè¿‡åŽï¼Œè°ƒç”¨è¯¥æ–¹æ³•è¿›è¡Œè§£é”播放</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[26]" type="UMLOperation" guid="UdoijIW/80yYKWWst/w35AAA">
+<XPD:ATTR name="Name" type="string">lock</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">é”频,用于信å·æµ‹è¯•ç­‰</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[27]" type="UMLOperation" guid="7rGFPyAzzUe2jTVqsr5TPwAA">
+<XPD:ATTR name="Name" type="string">getChannelInfo</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">一些相关信æ¯,一个节目的相关信æ¯</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[28]" type="UMLOperation" guid="Pa5rqUzWwEaNHn5Ws2ScXQAA">
+<XPD:ATTR name="Name" type="string">getChannelList</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">得到所有或者æŸä¸€ç±»çš„所以节目信æ¯è¡¨,...include EPG?</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[29]" type="UMLOperation" guid="UYN2BdmAh0OwWr6FMv/4+gAA">
+<XPD:ATTR name="Name" type="string">editChannelList</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">编辑节目信æ¯</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[30]" type="UMLOperation" guid="W+xUDLU830SOa/MaA8+q9gAA">
+<XPD:ATTR name="Name" type="string">getEvent</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[31]" type="UMLOperation" guid="wX/iXD/If0yyRjn7rC8n9wAA">
+<XPD:ATTR name="Name" type="string">EpgScanner</XPD:ATTR>
+<XPD:REF name="Owner">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#Associations" type="integer">7</XPD:ATTR>
+<XPD:REF name="Associations[0]">kdbNMfgoG02cJO0UFJeeLwAA</XPD:REF>
+<XPD:REF name="Associations[1]">X5VvOi2uGkGYzMMS5nWm2AAA</XPD:REF>
+<XPD:REF name="Associations[2]">xf4XKZpxx0iF7C4H+oOABwAA</XPD:REF>
+<XPD:REF name="Associations[3]">yVknRLQq7U2nj3bRfizyAgAA</XPD:REF>
+<XPD:REF name="Associations[4]">6CsrL0wlVEKI657OoEev1gAA</XPD:REF>
+<XPD:REF name="Associations[5]">be+eScBkV0Cn4n2XjSojvgAA</XPD:REF>
+<XPD:REF name="Associations[6]">PP9nsgv4Vkmbk1zEfct4VAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="SX+aNGg0j0WtdR26+LZ7OgAA">
+<XPD:ATTR name="Name" type="string">CTvDatabase</XPD:ATTR>
<XPD:ATTR name="Documentation" type="string">使用AM_DB
æ“作:
SELECT --
INSERT --
DELETE --
-UPDATE --</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
-<XPD:REF name="Views[1]">k1LHywt4TEe6bHJwUzft/QAA</XPD:REF>
-<XPD:REF name="Views[2]">hc7Nc/x4iE+k/Ee76MBxMgAA</XPD:REF>
-<XPD:REF name="Views[3]">Pwafosd7ik6mD1kxdwntngAA</XPD:REF>
-<XPD:ATTR name="#Operations" type="integer">5</XPD:ATTR>
-<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="eujhNjd7X0OXZG7TspyZqAAA">
-<XPD:ATTR name="Name" type="string">select</XPD:ATTR>
-<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="NHwUxL9yUkyP+nuyACBPRAAA">
-<XPD:ATTR name="Name" type="string">insert</XPD:ATTR>
-<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="cmY3ij4BnES+HvUtnuKW0wAA">
-<XPD:ATTR name="Name" type="string">del</XPD:ATTR>
-<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="UNsa63AKqU6E5RGSTo+clgAA">
-<XPD:ATTR name="Name" type="string">update</XPD:ATTR>
-<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="YwBo0pVRWEevayMrI8sH+AAA">
-<XPD:ATTR name="Name" type="string">xxtable</XPD:ATTR>
-<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:ATTR name="#TypedParameters" type="integer">4</XPD:ATTR>
-<XPD:REF name="TypedParameters[0]">J5mDMInaY0G18Fx0eB6MsAAA</XPD:REF>
-<XPD:REF name="TypedParameters[1]">lSipwxb9AEu7dKbkvn8bCwAA</XPD:REF>
-<XPD:REF name="TypedParameters[2]">eQIZ7HOvJESQdc0nGhqnrwAA</XPD:REF>
-<XPD:REF name="TypedParameters[3]">lc6uST5/Mk6WfIuIfATlsgAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">10</XPD:ATTR>
-<XPD:REF name="Associations[0]">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
-<XPD:REF name="Associations[1]">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
-<XPD:REF name="Associations[2]">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
-<XPD:REF name="Associations[3]">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
-<XPD:REF name="Associations[4]">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
-<XPD:REF name="Associations[5]">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
-<XPD:REF name="Associations[6]">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
-<XPD:REF name="Associations[7]">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
-<XPD:REF name="Associations[8]">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
-<XPD:REF name="Associations[9]">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="5BXVsgqK1kanN/l0hNx/IQAA">
-<XPD:ATTR name="Name" type="string">CTvSubtitle</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Y9zMsiXlQEuyiSGOmpswRwAA</XPD:REF>
-<XPD:REF name="Views[1]">3kCRXwUbYEOaB2YVqs3CMQAA</XPD:REF>
-<XPD:REF name="Views[2]">2pFBVEb3NUu3IhdJeNfBWAAA</XPD:REF>
-<XPD:REF name="Views[3]">xx5BbdZ+6Eehp04cM6fnfwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="9naBHAA+hkmkNtZzyXP1/wAA">
-<XPD:ATTR name="Name" type="string">CTvProgram</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">Program对应ATV中的一个频é“,DTV中的一个service</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
-<XPD:REF name="Views[1]">muUyRePjd0qlQqM/tvfrmQAA</XPD:REF>
-<XPD:REF name="Views[2]">3aWGjpGXTkqRn+NbEzYu5QAA</XPD:REF>
-<XPD:REF name="Views[3]">ylciM87U9keZe9hSnVequAAA</XPD:REF>
-<XPD:ATTR name="#Operations" type="integer">29</XPD:ATTR>
-<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="YYAlKwYwAkum0/0/V8VSfAAA">
-<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="J5mDMInaY0G18Fx0eB6MsAAA">
-<XPD:ATTR name="Name" type="string">db</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">YYAlKwYwAkum0/0/V8VSfAAA</XPD:REF>
-<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="MO9Z8u42Ck+RSnezotFx6gAA">
-<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="I7Tahi7CMEWsF5E1eyHYIwAA">
-<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">创建并å‘æ•°æ®åº“添加一个Program</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="uoElE3D4I0KE+CLUBhlBmAAA">
-<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">I7Tahi7CMEWsF5E1eyHYIwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="R7F9l39IqkWdzSgaYK9tQAAA">
-<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">I7Tahi7CMEWsF5E1eyHYIwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="c5Mq32YFGk6fa8RKqgPtRgAA">
-<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">adding a Playback program</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="JNEvi/3wp0OBIRiyz8YftgAA">
-<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="AkhDSecO8E2/EoFulZe5iAAA">
-<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">JNEvi/3wp0OBIRiyz8YftgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="lmgbU9AACUCXuVDuiBNNpwAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">JNEvi/3wp0OBIRiyz8YftgAA</XPD:REF>
-<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="c4hDH4Wl4EC1nupSKD7ECQAA">
-<XPD:ATTR name="Name" type="string">selectByNumber</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">3</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="+naqez7eJ0Gt7lrOPAtRhwAA">
-<XPD:ATTR name="Name" type="string">num</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">代指一个节目å·ç±»</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">c4hDH4Wl4EC1nupSKD7ECQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="TGg03aSXFk6f/K55VhZZ4AAA">
-<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">c4hDH4Wl4EC1nupSKD7ECQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[2]" type="UMLParameter" guid="JwSDsmXVS02yCU8rmbNT+gAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">c4hDH4Wl4EC1nupSKD7ECQAA</XPD:REF>
-<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="yeJSdWpKskaFq49HK5+/4wAA">
-<XPD:ATTR name="Name" type="string">selectUp</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">æ ¹æ®èŠ‚ç›®å·é€‰æ‹©ä¸‹ä¸€èŠ‚ç›®</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="z7wJx+cu9U6OwVLUgjkczgAA">
-<XPD:ATTR name="Name" type="string">num</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">yeJSdWpKskaFq49HK5+/4wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="Qv4GcTZ/w0GgrJcc/XNMQAAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">yeJSdWpKskaFq49HK5+/4wAA</XPD:REF>
-<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="LTDhnEPkWE6psd+d5WLFWwAA">
-<XPD:ATTR name="Name" type="string">selectDown</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">æ ¹æ®èŠ‚ç›®å·é€‰æ‹©ä¸Šä¸€èŠ‚ç›®</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="JwS8/J1pU0ixPx2Gtv9PswAA">
-<XPD:ATTR name="Name" type="string">num</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">LTDhnEPkWE6psd+d5WLFWwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="p3gaswKAtEmlrHF0SJQaJQAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">LTDhnEPkWE6psd+d5WLFWwAA</XPD:REF>
-<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="25tmOHxHGkmZu/nQh+mDnwAA">
-<XPD:ATTR name="Name" type="string">selectFirstValid</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">选择一个有效的节目,先查找频é“å·æœ€å°çš„电视节目,如果没有电视,å†æŸ¥æ‰¾é¢‘é“å·æœ€å°çš„广播节目</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="LRGUd6QwL02qGj2EBYZ86QAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">25tmOHxHGkmZu/nQh+mDnwAA</XPD:REF>
-<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="9VZ9jSrONEOU5G5ov0HotwAA">
-<XPD:ATTR name="Name" type="string">selectAll</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">列出全部TVProgram</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="75rhon2Jo0CUX2eeQJLflgAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">vector&lt;CTvProgram&gt;</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">9VZ9jSrONEOU5G5ov0HotwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="bFQUubUtYkClhu6k44lX2wAA">
-<XPD:ATTR name="Name" type="string">selectByChannel</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="ghACz+/RMk6PwXHevQHrKgAA">
-<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">bFQUubUtYkClhu6k44lX2wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="3MSYvjBf4k+QHn22Q8eg7AAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">vector&lt;CTvProgram&gt;</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">bFQUubUtYkClhu6k44lX2wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="+1TV2QUUtUKhshvxqFDzNAAA">
-<XPD:ATTR name="Name" type="string">selectByName</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">æ ¹æ®èŠ‚ç›®å称中的关键字查找指定TVProgram</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="6l3x+N+XpkKTQss5baAQuwAA">
-<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">+1TV2QUUtUKhshvxqFDzNAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="eG1miZaCQk6agFaTX6TwVAAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">vector&lt;CTvProgram&gt;</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">+1TV2QUUtUKhshvxqFDzNAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="ZYi+bCDmv0C3n5svMsg6OAAA">
-<XPD:ATTR name="Name" type="string">tvProgramDelByChannelID</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="jqLk5a2Xh0mhzw9HIwhkTwAA">
-<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">ZYi+bCDmv0C3n5svMsg6OAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[13]" type="UMLOperation" guid="ACVxjvFDC0yCpTUl109bFwAA">
-<XPD:ATTR name="Name" type="string">getID</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[14]" type="UMLOperation" guid="HdyeyQ/bRESko2FrqkZbcgAA">
-<XPD:ATTR name="Name" type="string">getName</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="p/P9yxCMgk+7553zQk/digAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">HdyeyQ/bRESko2FrqkZbcgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[15]" type="UMLOperation" guid="JwHR21A3wE+c3ID5+O7HqAAA">
-<XPD:ATTR name="Name" type="string">getCurrentSubtitle</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[16]" type="UMLOperation" guid="dwF0iyGWbU+EGkjX1GDTpAAA">
-<XPD:ATTR name="Name" type="string">getCurrentTeletext</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[17]" type="UMLOperation" guid="k/2NPLI6skm2+zWBikSQIgAA">
-<XPD:ATTR name="Name" type="string">getChannel</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="A7QPUTtNz0O45ex/ZBEL3wAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvChannel</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">k/2NPLI6skm2+zWBikSQIgAA</XPD:REF>
-<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[18]" type="UMLOperation" guid="e28O5Ud6AkiFQ2Whw+g5PAAA">
-<XPD:ATTR name="Name" type="string">getPresentEvent</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">å–得节目正在播放事件</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="JMu9kCbPeUOqYnb8+XprhgAA">
-<XPD:ATTR name="Name" type="string">now</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">long</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">e28O5Ud6AkiFQ2Whw+g5PAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="+v9VB9kIH02VZ9TgNHJJfQAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvEvent</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">e28O5Ud6AkiFQ2Whw+g5PAAA</XPD:REF>
-<XPD:REF name="Type_">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[19]" type="UMLOperation" guid="/N5EpSRqt0miI+sRfUySzQAA">
-<XPD:ATTR name="Name" type="string">getFollowingEvent</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[20]" type="UMLOperation" guid="dF2yMKnmeUmHMTQ3n59OfgAA">
-<XPD:ATTR name="Name" type="string">getScheduleEvents</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">å–得节目在一个时间段内的事件</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[21]" type="UMLOperation" guid="unjofe5xCEG64AlRNpC6lAAA">
-<XPD:ATTR name="Name" type="string">selectByFavorite</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">列出喜爱节目组TVProgram</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[22]" type="UMLOperation" guid="Yf/ivoCbnU2TvnC8p98iwAAA">
-<XPD:ATTR name="Name" type="string">addProgramToGroup</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">添加节目到指定节目分组</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[23]" type="UMLOperation" guid="hrNkpY6nlU+EwIWtvCj7TwAA">
-<XPD:ATTR name="Name" type="string">deleteFromGroup</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">从指定节目分组删除当å‰èŠ‚ç›®</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[24]" type="UMLOperation" guid="t2BjZT6On0+sFvxzq4g8ggAA">
-<XPD:ATTR name="Name" type="string">checkIsGroup</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">检测当å‰èŠ‚目是å¦å±žäºŽåˆ†ç»„</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[25]" type="UMLOperation" guid="P9TAD4y/o0KU9vLyJ9OV4AAA">
-<XPD:ATTR name="Name" type="string">modifyChanOrder</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">修改节目排åº</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[26]" type="UMLOperation" guid="ajleTvMjZ0eZ0eAHzHaalwAA">
-<XPD:ATTR name="Name" type="string">setProgramName</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">修改节目å称</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[27]" type="UMLOperation" guid="elSJfx5P9Ui4sQvrJy9lsAAA">
-<XPD:ATTR name="Name" type="string">setProgramNumber</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">修改节目number</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[28]" type="UMLOperation" guid="SmcQMrAyCE+xl1JXzNgH/gAA">
-<XPD:ATTR name="Name" type="string">setProgramVolume</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:ATTR name="#TypedFeatures" type="integer">1</XPD:ATTR>
-<XPD:REF name="TypedFeatures[0]">xT0LK2eQ9EGzJfCHW9IJ9wAA</XPD:REF>
-<XPD:ATTR name="#TypedParameters" type="integer">6</XPD:ATTR>
-<XPD:REF name="TypedParameters[0]">lmgbU9AACUCXuVDuiBNNpwAA</XPD:REF>
-<XPD:REF name="TypedParameters[1]">JwSDsmXVS02yCU8rmbNT+gAA</XPD:REF>
-<XPD:REF name="TypedParameters[2]">Qv4GcTZ/w0GgrJcc/XNMQAAA</XPD:REF>
-<XPD:REF name="TypedParameters[3]">p3gaswKAtEmlrHF0SJQaJQAA</XPD:REF>
-<XPD:REF name="TypedParameters[4]">LRGUd6QwL02qGj2EBYZ86QAA</XPD:REF>
-<XPD:REF name="TypedParameters[5]">w4A7LCg5RUitVRoJ8EF5DwAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">5</XPD:ATTR>
-<XPD:REF name="Associations[0]">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
-<XPD:REF name="Associations[1]">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
-<XPD:REF name="Associations[2]">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
-<XPD:REF name="Associations[3]">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
-<XPD:REF name="Associations[4]">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
-<XPD:ATTR name="#Attributes" type="integer">15</XPD:ATTR>
-<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="uXjsbosYkke28aZWg65AOwAA">
-<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="+NxzFOFWPEqKmFfNqTdx8QAA">
-<XPD:ATTR name="Name" type="string">dvbServiceID</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="JIJ3w5q9AEq5pH8jxW/gOAAA">
-<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="JOINtcM+u0qVqfxy1LsTdwAA">
-<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">char</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="U6dOwxN6VkKvkKCowD7yxQAA">
-<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[5]" type="UMLAttribute" guid="Zh90wWMTSUm6ew2qIiAjFAAA">
-<XPD:ATTR name="Name" type="string">channel</XPD:ATTR>
-<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvChannel</XPD:ATTR>
-<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[6]" type="UMLAttribute" guid="on0gPuAz4U686Sy93eQ2cgAA">
-<XPD:ATTR name="Name" type="string">skip</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[7]" type="UMLAttribute" guid="bIOnmWt5I0yApBHA5XFN+gAA">
-<XPD:ATTR name="Name" type="string">favorite</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[8]" type="UMLAttribute" guid="x9TcSSHftEmulDVv3sJK1wAA">
-<XPD:ATTR name="Name" type="string">volume</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[9]" type="UMLAttribute" guid="QeKA3IlVykyPEjmBPYFTpQAA">
-<XPD:ATTR name="Name" type="string">sourceID</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[10]" type="UMLAttribute" guid="kb0pZw6ZkE2OolX+iMKt8gAA">
-<XPD:ATTR name="Name" type="string">pmtPID</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[11]" type="UMLAttribute" guid="RZ6B0lWtR0m+vSVJBlDoigAA">
-<XPD:ATTR name="Name" type="string">video</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">videoä¿¡æ¯,类型ä¸å®š</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[12]" type="UMLAttribute" guid="BihGmjGNQ0mzaFwgnsKAWQAA">
-<XPD:ATTR name="Name" type="string">audioes</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">audioä¿¡æ¯,类型ä¸å®š</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[13]" type="UMLAttribute" guid="/qxd9kIZyU+tZ4SClIWWmQAA">
-<XPD:ATTR name="Name" type="string">subtitles</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">subtitleä¿¡æ¯ç±»åž‹ä¸å®š</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[14]" type="UMLAttribute" guid="zvplUrX8lUGsjB9WCZ2PcAAA">
-<XPD:ATTR name="Name" type="string">teletexts</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">teletextä¿¡æ¯,类型ä¸å®š</XPD:ATTR>
-<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="JCgv4vk16U6BbVcoQFmlVwAA">
-<XPD:ATTR name="Name" type="string">CTvChannel</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">对应模拟电视中的一个频点,数字电视中的一个频点调制的TSæµ</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
-<XPD:REF name="Views[1]">Yo0KShxzIk2FSTydUse5OQAA</XPD:REF>
-<XPD:REF name="Views[2]">rmKV7ZtcVEudbDw02LTB/wAA</XPD:REF>
-<XPD:REF name="Views[3]">+jiKzSIz/UuhSFnnJkuIEgAA</XPD:REF>
-<XPD:ATTR name="#Operations" type="integer">23</XPD:ATTR>
-<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="+k2keRjKq0Kcp2LH8FqiVwAA">
-<XPD:ATTR name="Name" type="string">TvChannel</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="bLasrnFvT0mJOlVtuIWeVwAA">
-<XPD:ATTR name="Name" type="string">TvChannel</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Uo205gWA4UyYN/g3FxOFmQAA">
-<XPD:ATTR name="Name" type="string">TvChannel</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">æ ¹æ®TVChannelParams,å‘æ•°æ®åº“添加一个Channel</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="So08mUV3uUGzB96ampUmnQAA">
-<XPD:ATTR name="Name" type="string">Params</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">TvChannelParams</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">Uo205gWA4UyYN/g3FxOFmQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="RN5b/cypXUivfIl6CeiRrgAA">
-<XPD:ATTR name="Name" type="string">tvChannelList</XPD:ATTR>
+UPDATE --</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">a8FG7H9SzUelkRx52q1d5AAA</XPD:REF>
+<XPD:REF name="Views[1]">k1LHywt4TEe6bHJwUzft/QAA</XPD:REF>
+<XPD:REF name="Views[2]">hc7Nc/x4iE+k/Ee76MBxMgAA</XPD:REF>
+<XPD:REF name="Views[3]">Pwafosd7ik6mD1kxdwntngAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">5</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="eujhNjd7X0OXZG7TspyZqAAA">
+<XPD:ATTR name="Name" type="string">select</XPD:ATTR>
+<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="NHwUxL9yUkyP+nuyACBPRAAA">
+<XPD:ATTR name="Name" type="string">insert</XPD:ATTR>
+<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="cmY3ij4BnES+HvUtnuKW0wAA">
+<XPD:ATTR name="Name" type="string">del</XPD:ATTR>
+<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="UNsa63AKqU6E5RGSTo+clgAA">
+<XPD:ATTR name="Name" type="string">update</XPD:ATTR>
+<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="YwBo0pVRWEevayMrI8sH+AAA">
+<XPD:ATTR name="Name" type="string">xxtable</XPD:ATTR>
+<XPD:REF name="Owner">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#TypedParameters" type="integer">4</XPD:ATTR>
+<XPD:REF name="TypedParameters[0]">J5mDMInaY0G18Fx0eB6MsAAA</XPD:REF>
+<XPD:REF name="TypedParameters[1]">lSipwxb9AEu7dKbkvn8bCwAA</XPD:REF>
+<XPD:REF name="TypedParameters[2]">eQIZ7HOvJESQdc0nGhqnrwAA</XPD:REF>
+<XPD:REF name="TypedParameters[3]">lc6uST5/Mk6WfIuIfATlsgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">10</XPD:ATTR>
+<XPD:REF name="Associations[0]">PFZlUbzZu02nTTLsYZBoDgAA</XPD:REF>
+<XPD:REF name="Associations[1]">q5Ko0bXKcE6uj05NJPSddwAA</XPD:REF>
+<XPD:REF name="Associations[2]">Yo1IoB0X3ka1C+a/6xk1/gAA</XPD:REF>
+<XPD:REF name="Associations[3]">RoKhf4Bw3kmRk2O2D4GlxQAA</XPD:REF>
+<XPD:REF name="Associations[4]">vyoQZGl3UECBMhf7+IDQUwAA</XPD:REF>
+<XPD:REF name="Associations[5]">iy8GVdK11EmKnmJ6LivVVQAA</XPD:REF>
+<XPD:REF name="Associations[6]">DkcX/fIec029p5Da5gYToAAA</XPD:REF>
+<XPD:REF name="Associations[7]">gc0GlJ6ewUOpiyya+XPqjQAA</XPD:REF>
+<XPD:REF name="Associations[8]">Fd/cvRV12USE+Vu6oJsMOgAA</XPD:REF>
+<XPD:REF name="Associations[9]">AM/xtV731kSTTZbv0mmefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="5BXVsgqK1kanN/l0hNx/IQAA">
+<XPD:ATTR name="Name" type="string">CTvSubtitle</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Y9zMsiXlQEuyiSGOmpswRwAA</XPD:REF>
+<XPD:REF name="Views[1]">3kCRXwUbYEOaB2YVqs3CMQAA</XPD:REF>
+<XPD:REF name="Views[2]">2pFBVEb3NUu3IhdJeNfBWAAA</XPD:REF>
+<XPD:REF name="Views[3]">xx5BbdZ+6Eehp04cM6fnfwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="9naBHAA+hkmkNtZzyXP1/wAA">
+<XPD:ATTR name="Name" type="string">CTvProgram</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">Program对应ATV中的一个频é“,DTV中的一个service</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">BVNqLhbhP06y98++NgmxAwAA</XPD:REF>
+<XPD:REF name="Views[1]">muUyRePjd0qlQqM/tvfrmQAA</XPD:REF>
+<XPD:REF name="Views[2]">3aWGjpGXTkqRn+NbEzYu5QAA</XPD:REF>
+<XPD:REF name="Views[3]">ylciM87U9keZe9hSnVequAAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">29</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="YYAlKwYwAkum0/0/V8VSfAAA">
+<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="J5mDMInaY0G18Fx0eB6MsAAA">
+<XPD:ATTR name="Name" type="string">db</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">YYAlKwYwAkum0/0/V8VSfAAA</XPD:REF>
+<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="MO9Z8u42Ck+RSnezotFx6gAA">
+<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="I7Tahi7CMEWsF5E1eyHYIwAA">
+<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">创建并å‘æ•°æ®åº“添加一个Program</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="uoElE3D4I0KE+CLUBhlBmAAA">
+<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">I7Tahi7CMEWsF5E1eyHYIwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="R7F9l39IqkWdzSgaYK9tQAAA">
+<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">I7Tahi7CMEWsF5E1eyHYIwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="c5Mq32YFGk6fa8RKqgPtRgAA">
+<XPD:ATTR name="Name" type="string">TVProgram</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">adding a Playback program</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="JNEvi/3wp0OBIRiyz8YftgAA">
+<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="AkhDSecO8E2/EoFulZe5iAAA">
+<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">JNEvi/3wp0OBIRiyz8YftgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="lmgbU9AACUCXuVDuiBNNpwAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">JNEvi/3wp0OBIRiyz8YftgAA</XPD:REF>
+<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="c4hDH4Wl4EC1nupSKD7ECQAA">
+<XPD:ATTR name="Name" type="string">selectByNumber</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="+naqez7eJ0Gt7lrOPAtRhwAA">
+<XPD:ATTR name="Name" type="string">num</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">代指一个节目å·ç±»</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">c4hDH4Wl4EC1nupSKD7ECQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="TGg03aSXFk6f/K55VhZZ4AAA">
+<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">c4hDH4Wl4EC1nupSKD7ECQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[2]" type="UMLParameter" guid="JwSDsmXVS02yCU8rmbNT+gAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">c4hDH4Wl4EC1nupSKD7ECQAA</XPD:REF>
+<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="yeJSdWpKskaFq49HK5+/4wAA">
+<XPD:ATTR name="Name" type="string">selectUp</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">æ ¹æ®èŠ‚ç›®å·é€‰æ‹©ä¸‹ä¸€èŠ‚ç›®</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="z7wJx+cu9U6OwVLUgjkczgAA">
+<XPD:ATTR name="Name" type="string">num</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">yeJSdWpKskaFq49HK5+/4wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="Qv4GcTZ/w0GgrJcc/XNMQAAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">yeJSdWpKskaFq49HK5+/4wAA</XPD:REF>
+<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="LTDhnEPkWE6psd+d5WLFWwAA">
+<XPD:ATTR name="Name" type="string">selectDown</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">æ ¹æ®èŠ‚ç›®å·é€‰æ‹©ä¸Šä¸€èŠ‚ç›®</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="JwS8/J1pU0ixPx2Gtv9PswAA">
+<XPD:ATTR name="Name" type="string">num</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">LTDhnEPkWE6psd+d5WLFWwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="p3gaswKAtEmlrHF0SJQaJQAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">LTDhnEPkWE6psd+d5WLFWwAA</XPD:REF>
+<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="25tmOHxHGkmZu/nQh+mDnwAA">
+<XPD:ATTR name="Name" type="string">selectFirstValid</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">选择一个有效的节目,先查找频é“å·æœ€å°çš„电视节目,如果没有电视,å†æŸ¥æ‰¾é¢‘é“å·æœ€å°çš„广播节目</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="LRGUd6QwL02qGj2EBYZ86QAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">25tmOHxHGkmZu/nQh+mDnwAA</XPD:REF>
+<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="9VZ9jSrONEOU5G5ov0HotwAA">
+<XPD:ATTR name="Name" type="string">selectAll</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">列出全部TVProgram</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="75rhon2Jo0CUX2eeQJLflgAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">vector&lt;CTvProgram&gt;</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">9VZ9jSrONEOU5G5ov0HotwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="bFQUubUtYkClhu6k44lX2wAA">
+<XPD:ATTR name="Name" type="string">selectByChannel</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="ghACz+/RMk6PwXHevQHrKgAA">
+<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">bFQUubUtYkClhu6k44lX2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="3MSYvjBf4k+QHn22Q8eg7AAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">vector&lt;CTvProgram&gt;</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">bFQUubUtYkClhu6k44lX2wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="+1TV2QUUtUKhshvxqFDzNAAA">
+<XPD:ATTR name="Name" type="string">selectByName</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">æ ¹æ®èŠ‚ç›®å称中的关键字查找指定TVProgram</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="6l3x+N+XpkKTQss5baAQuwAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">+1TV2QUUtUKhshvxqFDzNAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="eG1miZaCQk6agFaTX6TwVAAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">vector&lt;CTvProgram&gt;</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">+1TV2QUUtUKhshvxqFDzNAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="ZYi+bCDmv0C3n5svMsg6OAAA">
+<XPD:ATTR name="Name" type="string">tvProgramDelByChannelID</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="jqLk5a2Xh0mhzw9HIwhkTwAA">
+<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">ZYi+bCDmv0C3n5svMsg6OAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[13]" type="UMLOperation" guid="ACVxjvFDC0yCpTUl109bFwAA">
+<XPD:ATTR name="Name" type="string">getID</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[14]" type="UMLOperation" guid="HdyeyQ/bRESko2FrqkZbcgAA">
+<XPD:ATTR name="Name" type="string">getName</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="p/P9yxCMgk+7553zQk/digAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">HdyeyQ/bRESko2FrqkZbcgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[15]" type="UMLOperation" guid="JwHR21A3wE+c3ID5+O7HqAAA">
+<XPD:ATTR name="Name" type="string">getCurrentSubtitle</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[16]" type="UMLOperation" guid="dwF0iyGWbU+EGkjX1GDTpAAA">
+<XPD:ATTR name="Name" type="string">getCurrentTeletext</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[17]" type="UMLOperation" guid="k/2NPLI6skm2+zWBikSQIgAA">
+<XPD:ATTR name="Name" type="string">getChannel</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="A7QPUTtNz0O45ex/ZBEL3wAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvChannel</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">k/2NPLI6skm2+zWBikSQIgAA</XPD:REF>
+<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[18]" type="UMLOperation" guid="e28O5Ud6AkiFQ2Whw+g5PAAA">
+<XPD:ATTR name="Name" type="string">getPresentEvent</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">å–得节目正在播放事件</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="JMu9kCbPeUOqYnb8+XprhgAA">
+<XPD:ATTR name="Name" type="string">now</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">long</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">e28O5Ud6AkiFQ2Whw+g5PAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="+v9VB9kIH02VZ9TgNHJJfQAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvEvent</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">e28O5Ud6AkiFQ2Whw+g5PAAA</XPD:REF>
+<XPD:REF name="Type_">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[19]" type="UMLOperation" guid="/N5EpSRqt0miI+sRfUySzQAA">
+<XPD:ATTR name="Name" type="string">getFollowingEvent</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[20]" type="UMLOperation" guid="dF2yMKnmeUmHMTQ3n59OfgAA">
+<XPD:ATTR name="Name" type="string">getScheduleEvents</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">å–得节目在一个时间段内的事件</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[21]" type="UMLOperation" guid="unjofe5xCEG64AlRNpC6lAAA">
+<XPD:ATTR name="Name" type="string">selectByFavorite</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">列出喜爱节目组TVProgram</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[22]" type="UMLOperation" guid="Yf/ivoCbnU2TvnC8p98iwAAA">
+<XPD:ATTR name="Name" type="string">addProgramToGroup</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">添加节目到指定节目分组</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[23]" type="UMLOperation" guid="hrNkpY6nlU+EwIWtvCj7TwAA">
+<XPD:ATTR name="Name" type="string">deleteFromGroup</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">从指定节目分组删除当å‰èŠ‚ç›®</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[24]" type="UMLOperation" guid="t2BjZT6On0+sFvxzq4g8ggAA">
+<XPD:ATTR name="Name" type="string">checkIsGroup</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">检测当å‰èŠ‚目是å¦å±žäºŽåˆ†ç»„</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[25]" type="UMLOperation" guid="P9TAD4y/o0KU9vLyJ9OV4AAA">
+<XPD:ATTR name="Name" type="string">modifyChanOrder</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">修改节目排åº</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[26]" type="UMLOperation" guid="ajleTvMjZ0eZ0eAHzHaalwAA">
+<XPD:ATTR name="Name" type="string">setProgramName</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">修改节目å称</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[27]" type="UMLOperation" guid="elSJfx5P9Ui4sQvrJy9lsAAA">
+<XPD:ATTR name="Name" type="string">setProgramNumber</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">修改节目number</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[28]" type="UMLOperation" guid="SmcQMrAyCE+xl1JXzNgH/gAA">
+<XPD:ATTR name="Name" type="string">setProgramVolume</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#TypedFeatures" type="integer">1</XPD:ATTR>
+<XPD:REF name="TypedFeatures[0]">xT0LK2eQ9EGzJfCHW9IJ9wAA</XPD:REF>
+<XPD:ATTR name="#TypedParameters" type="integer">6</XPD:ATTR>
+<XPD:REF name="TypedParameters[0]">lmgbU9AACUCXuVDuiBNNpwAA</XPD:REF>
+<XPD:REF name="TypedParameters[1]">JwSDsmXVS02yCU8rmbNT+gAA</XPD:REF>
+<XPD:REF name="TypedParameters[2]">Qv4GcTZ/w0GgrJcc/XNMQAAA</XPD:REF>
+<XPD:REF name="TypedParameters[3]">p3gaswKAtEmlrHF0SJQaJQAA</XPD:REF>
+<XPD:REF name="TypedParameters[4]">LRGUd6QwL02qGj2EBYZ86QAA</XPD:REF>
+<XPD:REF name="TypedParameters[5]">w4A7LCg5RUitVRoJ8EF5DwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">5</XPD:ATTR>
+<XPD:REF name="Associations[0]">IEnUwW74QkSkdRZGqdKvaAAA</XPD:REF>
+<XPD:REF name="Associations[1]">2JZlFpDZPkGgaoWrrPAGXAAA</XPD:REF>
+<XPD:REF name="Associations[2]">qOlPMeLYpUC4lTEl3Hsc8QAA</XPD:REF>
+<XPD:REF name="Associations[3]">72fG4kbiM0eyczFPq2MtVAAA</XPD:REF>
+<XPD:REF name="Associations[4]">IMPiiZPlxkaJkH8N2NGOggAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">15</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="uXjsbosYkke28aZWg65AOwAA">
+<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="+NxzFOFWPEqKmFfNqTdx8QAA">
+<XPD:ATTR name="Name" type="string">dvbServiceID</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="JIJ3w5q9AEq5pH8jxW/gOAAA">
+<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="JOINtcM+u0qVqfxy1LsTdwAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">char</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="U6dOwxN6VkKvkKCowD7yxQAA">
+<XPD:ATTR name="Name" type="string">channelID</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[5]" type="UMLAttribute" guid="Zh90wWMTSUm6ew2qIiAjFAAA">
+<XPD:ATTR name="Name" type="string">channel</XPD:ATTR>
+<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvChannel</XPD:ATTR>
+<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[6]" type="UMLAttribute" guid="on0gPuAz4U686Sy93eQ2cgAA">
+<XPD:ATTR name="Name" type="string">skip</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[7]" type="UMLAttribute" guid="bIOnmWt5I0yApBHA5XFN+gAA">
+<XPD:ATTR name="Name" type="string">favorite</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[8]" type="UMLAttribute" guid="x9TcSSHftEmulDVv3sJK1wAA">
+<XPD:ATTR name="Name" type="string">volume</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[9]" type="UMLAttribute" guid="QeKA3IlVykyPEjmBPYFTpQAA">
+<XPD:ATTR name="Name" type="string">sourceID</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[10]" type="UMLAttribute" guid="kb0pZw6ZkE2OolX+iMKt8gAA">
+<XPD:ATTR name="Name" type="string">pmtPID</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[11]" type="UMLAttribute" guid="RZ6B0lWtR0m+vSVJBlDoigAA">
+<XPD:ATTR name="Name" type="string">video</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">videoä¿¡æ¯,类型ä¸å®š</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[12]" type="UMLAttribute" guid="BihGmjGNQ0mzaFwgnsKAWQAA">
+<XPD:ATTR name="Name" type="string">audioes</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">audioä¿¡æ¯,类型ä¸å®š</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[13]" type="UMLAttribute" guid="/qxd9kIZyU+tZ4SClIWWmQAA">
+<XPD:ATTR name="Name" type="string">subtitles</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">subtitleä¿¡æ¯ç±»åž‹ä¸å®š</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[14]" type="UMLAttribute" guid="zvplUrX8lUGsjB9WCZ2PcAAA">
+<XPD:ATTR name="Name" type="string">teletexts</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">teletextä¿¡æ¯,类型ä¸å®š</XPD:ATTR>
+<XPD:REF name="Owner">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="JCgv4vk16U6BbVcoQFmlVwAA">
+<XPD:ATTR name="Name" type="string">CTvChannel</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">对应模拟电视中的一个频点,数字电视中的一个频点调制的TSæµ</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">iEgH+6H6kkG++neKuToTSgAA</XPD:REF>
+<XPD:REF name="Views[1]">Yo0KShxzIk2FSTydUse5OQAA</XPD:REF>
+<XPD:REF name="Views[2]">rmKV7ZtcVEudbDw02LTB/wAA</XPD:REF>
+<XPD:REF name="Views[3]">+jiKzSIz/UuhSFnnJkuIEgAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">23</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="+k2keRjKq0Kcp2LH8FqiVwAA">
+<XPD:ATTR name="Name" type="string">TvChannel</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="bLasrnFvT0mJOlVtuIWeVwAA">
+<XPD:ATTR name="Name" type="string">TvChannel</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Uo205gWA4UyYN/g3FxOFmQAA">
+<XPD:ATTR name="Name" type="string">TvChannel</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">æ ¹æ®TVChannelParams,å‘æ•°æ®åº“添加一个Channel</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="So08mUV3uUGzB96ampUmnQAA">
+<XPD:ATTR name="Name" type="string">Params</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">TvChannelParams</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">Uo205gWA4UyYN/g3FxOFmQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="RN5b/cypXUivfIl6CeiRrgAA">
+<XPD:ATTR name="Name" type="string">tvChannelList</XPD:ATTR>
<XPD:ATTR name="Documentation" type="string">*创建当å‰å«æ˜Ÿæ‰€æœ‰é€šé“
*@param sat_id å«æ˜Ÿid
-*@return 返回创建的通é“</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="ATajQMblVE2J+9tPqnDGIQAA">
-<XPD:ATTR name="Name" type="string">sat_id</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">int</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">RN5b/cypXUivfIl6CeiRrgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="x7A2ohl0v0WHXUc8UDHW6AAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">vector&lt;TvChannel&gt;</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">RN5b/cypXUivfIl6CeiRrgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="THncZsTd2EaQgMWP8ukavAAA">
-<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="7U3T/Mh9gEGdFQ58AaydXQAA">
-<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">int</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">THncZsTd2EaQgMWP8ukavAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="ZpRrlyhz802QY2ObgoUqmwAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">TvChannel</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">THncZsTd2EaQgMWP8ukavAAA</XPD:REF>
-<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="FkLzL9wZQUqTW/xy345ifgAA">
-<XPD:ATTR name="Name" type="string">selectByParams</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="/9TUXJr3nkaE3sNOYEA7AwAA">
-<XPD:ATTR name="Name" type="string">param</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">TvChannelParams</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">FkLzL9wZQUqTW/xy345ifgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="NFnoGSrnCk6OIIsCI5hKAAAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">TvChannel</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">FkLzL9wZQUqTW/xy345ifgAA</XPD:REF>
-<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="2BWR7hLxq0qnCE/w/RGNJQAA">
-<XPD:ATTR name="Name" type="string">tvChannelDel</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="hLAGGAR0S02yy3pwOmM1YgAA">
-<XPD:ATTR name="Name" type="string">tvChannelDelBySatID</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="Se/I3L6vA0mlcLXlxgCKvAAA">
-<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">int</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">hLAGGAR0S02yy3pwOmM1YgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="ZuqLn6kcZkCuwI1pleD9aAAA">
-<XPD:ATTR name="Name" type="string">getID</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="jTykhLmNTkeBOYQWw2ruYgAA">
-<XPD:ATTR name="Name" type="string">getDVBTSID</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="MatpiHkzdk2wjbBq+aAUWgAA">
-<XPD:ATTR name="Name" type="string">getDVBOrigNetID</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="FI7G+6zrRESU1oT9AJMPeQAA">
-<XPD:ATTR name="Name" type="string">getFrontendID</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="jjFnFzfEc02zGI29lwfBowAA">
-<XPD:ATTR name="Name" type="string">getTSSourceID</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[13]" type="UMLOperation" guid="ZV2LPyYw8E6IN0sEDpXjmAAA">
-<XPD:ATTR name="Name" type="string">getParams</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="79kvlpEjWUOei2KGS0rnzAAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">TvChannelParams</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">ZV2LPyYw8E6IN0sEDpXjmAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[14]" type="UMLOperation" guid="J2ss0Osk0UKtERrsNkIiBAAA">
-<XPD:ATTR name="Name" type="string">isDVBCMode</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[15]" type="UMLOperation" guid="1+Z8ijSmXUCS12XqcbMI8gAA">
-<XPD:ATTR name="Name" type="string">setFrequency</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[16]" type="UMLOperation" guid="wvTcWulSY0Cufl7PzpJmGAAA">
-<XPD:ATTR name="Name" type="string">setSymbolRate</XPD:ATTR>
+*@return 返回创建的通é“</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="ATajQMblVE2J+9tPqnDGIQAA">
+<XPD:ATTR name="Name" type="string">sat_id</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">int</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">RN5b/cypXUivfIl6CeiRrgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="x7A2ohl0v0WHXUc8UDHW6AAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">vector&lt;TvChannel&gt;</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">RN5b/cypXUivfIl6CeiRrgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="THncZsTd2EaQgMWP8ukavAAA">
+<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="7U3T/Mh9gEGdFQ58AaydXQAA">
+<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">int</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">THncZsTd2EaQgMWP8ukavAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="ZpRrlyhz802QY2ObgoUqmwAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">TvChannel</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">THncZsTd2EaQgMWP8ukavAAA</XPD:REF>
+<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="FkLzL9wZQUqTW/xy345ifgAA">
+<XPD:ATTR name="Name" type="string">selectByParams</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="/9TUXJr3nkaE3sNOYEA7AwAA">
+<XPD:ATTR name="Name" type="string">param</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">TvChannelParams</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">FkLzL9wZQUqTW/xy345ifgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="NFnoGSrnCk6OIIsCI5hKAAAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">TvChannel</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">FkLzL9wZQUqTW/xy345ifgAA</XPD:REF>
+<XPD:REF name="Type_">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="2BWR7hLxq0qnCE/w/RGNJQAA">
+<XPD:ATTR name="Name" type="string">tvChannelDel</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="hLAGGAR0S02yy3pwOmM1YgAA">
+<XPD:ATTR name="Name" type="string">tvChannelDelBySatID</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="Se/I3L6vA0mlcLXlxgCKvAAA">
+<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">int</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">hLAGGAR0S02yy3pwOmM1YgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="ZuqLn6kcZkCuwI1pleD9aAAA">
+<XPD:ATTR name="Name" type="string">getID</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="jTykhLmNTkeBOYQWw2ruYgAA">
+<XPD:ATTR name="Name" type="string">getDVBTSID</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="MatpiHkzdk2wjbBq+aAUWgAA">
+<XPD:ATTR name="Name" type="string">getDVBOrigNetID</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="FI7G+6zrRESU1oT9AJMPeQAA">
+<XPD:ATTR name="Name" type="string">getFrontendID</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="jjFnFzfEc02zGI29lwfBowAA">
+<XPD:ATTR name="Name" type="string">getTSSourceID</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[13]" type="UMLOperation" guid="ZV2LPyYw8E6IN0sEDpXjmAAA">
+<XPD:ATTR name="Name" type="string">getParams</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="79kvlpEjWUOei2KGS0rnzAAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">TvChannelParams</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">ZV2LPyYw8E6IN0sEDpXjmAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[14]" type="UMLOperation" guid="J2ss0Osk0UKtERrsNkIiBAAA">
+<XPD:ATTR name="Name" type="string">isDVBCMode</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[15]" type="UMLOperation" guid="1+Z8ijSmXUCS12XqcbMI8gAA">
+<XPD:ATTR name="Name" type="string">setFrequency</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[16]" type="UMLOperation" guid="wvTcWulSY0Cufl7PzpJmGAAA">
+<XPD:ATTR name="Name" type="string">setSymbolRate</XPD:ATTR>
<XPD:ATTR name="Documentation" type="string">设置符å·çŽ‡(QPSK/QAM模å¼)
-@param symbolRate 符å·çŽ‡</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[17]" type="UMLOperation" guid="l/0TFp9Q8UKX15QErAbvMgAA">
-<XPD:ATTR name="Name" type="string">setPolarisation</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">设置æžæ€§(QPSK模å¼)</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[18]" type="UMLOperation" guid="b9Wu1ldLi0S2Z8NKmKvesgAA">
-<XPD:ATTR name="Name" type="string">setATVAudio</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[19]" type="UMLOperation" guid="GdCCR2raz0+G3e4/bN7OZQAA">
-<XPD:ATTR name="Name" type="string">setATVVideoFormat</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">修改模拟视频制å¼</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[20]" type="UMLOperation" guid="dSQ9xkQnBECjeLi09iGfaQAA">
-<XPD:ATTR name="Name" type="string">setATVAudioFormat</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[21]" type="UMLOperation" guid="9soE8Pso6EmGPUSAU1p4fgAA">
-<XPD:ATTR name="Name" type="string">setATVFreq</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[22]" type="UMLOperation" guid="mlHUjain7UyPF/GHGuUEQgAA">
-<XPD:ATTR name="Name" type="string">setATVAfcData</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:ATTR name="#TypedFeatures" type="integer">1</XPD:ATTR>
-<XPD:REF name="TypedFeatures[0]">Zh90wWMTSUm6ew2qIiAjFAAA</XPD:REF>
-<XPD:ATTR name="#TypedParameters" type="integer">3</XPD:ATTR>
-<XPD:REF name="TypedParameters[0]">ZpRrlyhz802QY2ObgoUqmwAA</XPD:REF>
-<XPD:REF name="TypedParameters[1]">NFnoGSrnCk6OIIsCI5hKAAAA</XPD:REF>
-<XPD:REF name="TypedParameters[2]">A7QPUTtNz0O45ex/ZBEL3wAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">5</XPD:ATTR>
-<XPD:REF name="Associations[0]">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
-<XPD:REF name="Associations[1]">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
-<XPD:REF name="Associations[2]">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
-<XPD:REF name="Associations[3]">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
-<XPD:REF name="Associations[4]">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
-<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="Z9Ui4868AE++l0of4VxduQAA">
-<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
-<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="gx40XIC9FkOG3iX3Oyxw8wAA">
-<XPD:ATTR name="Name" type="string">CTvGroup</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">Group对应DTV中的一个节目分组</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">8HnvkQxPk0OLqQXLeJ5MUgAA</XPD:REF>
-<XPD:REF name="Views[1]">50xz0k8rgU+WfODoAi8aeQAA</XPD:REF>
-<XPD:REF name="Views[2]">TR1rTShyhEG7ngh596L0kgAA</XPD:REF>
-<XPD:REF name="Views[3]">GPl78wz82UaLho5xwfMqrQAA</XPD:REF>
-<XPD:ATTR name="#Operations" type="integer">4</XPD:ATTR>
-<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="fRgLJCGVDUK1RuJPwHSaGwAA">
-<XPD:ATTR name="Name" type="string">selectByGroup</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">å–得所有节目分组信æ¯</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="A3kmDTyc/0aEXqkXlCeAFAAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">vector&lt;TvGroup&gt;</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">fRgLJCGVDUK1RuJPwHSaGwAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="DqeBCx0GukCwnvjLeUhcogAA">
-<XPD:ATTR name="Name" type="string">addGroup</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Hq5DfJkwqUmxLMkjmPj4qQAA">
-<XPD:ATTR name="Name" type="string">deleteGroup</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="5xVs/C/ycES9RQlY9VAsCgAA">
-<XPD:ATTR name="Name" type="string">editGroup</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
-<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="e9OE1kuwcUuhtDW6AZvH1wAA">
-<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[6]" type="UMLClass" guid="26RSzf3jmEWkDlRiFhl4OAAA">
-<XPD:ATTR name="Name" type="string">CTvEvent</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">对应æ¯ä¸ªProgram一个时段的节目</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF>
-<XPD:REF name="Views[1]">+EOWTA5PrUyAEwB/ZHVnPAAA</XPD:REF>
-<XPD:REF name="Views[2]">f0xyghRma028ShVYc8tbfwAA</XPD:REF>
-<XPD:REF name="Views[3]">qpXdkd1nJ0ajRru7gzDFJwAA</XPD:REF>
-<XPD:ATTR name="#Operations" type="integer">6</XPD:ATTR>
-<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="0db/IAr++UOdZquo78fTbgAA">
-<XPD:ATTR name="Name" type="string">TVEvent</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
-<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="lSipwxb9AEu7dKbkvn8bCwAA">
-<XPD:ATTR name="Name" type="string">db</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">0db/IAr++UOdZquo78fTbgAA</XPD:REF>
-<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="IaJ2KyC/H0W4mE3T5XcaJQAA">
-<XPD:ATTR name="Name" type="string">TVEvent</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
-<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="n6dU85krq0+Oca0Y2wayfAAA">
-<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="JOwE9Bjhf0229aBZv0thuwAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvEvent</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">n6dU85krq0+Oca0Y2wayfAAA</XPD:REF>
-<XPD:REF name="Type_">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="E97BMkERRU2lIzjyqz++tAAA">
-<XPD:ATTR name="Name" type="string">getProgram</XPD:ATTR>
-<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="w4A7LCg5RUitVRoJ8EF5DwAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">E97BMkERRU2lIzjyqz++tAAA</XPD:REF>
-<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="R/cQwE4hs0yRPnKVjTffUQAA">
-<XPD:ATTR name="Name" type="string">getDVBViewAge</XPD:ATTR>
+@param symbolRate 符å·çŽ‡</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[17]" type="UMLOperation" guid="l/0TFp9Q8UKX15QErAbvMgAA">
+<XPD:ATTR name="Name" type="string">setPolarisation</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">设置æžæ€§(QPSK模å¼)</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[18]" type="UMLOperation" guid="b9Wu1ldLi0S2Z8NKmKvesgAA">
+<XPD:ATTR name="Name" type="string">setATVAudio</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[19]" type="UMLOperation" guid="GdCCR2raz0+G3e4/bN7OZQAA">
+<XPD:ATTR name="Name" type="string">setATVVideoFormat</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">修改模拟视频制å¼</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[20]" type="UMLOperation" guid="dSQ9xkQnBECjeLi09iGfaQAA">
+<XPD:ATTR name="Name" type="string">setATVAudioFormat</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[21]" type="UMLOperation" guid="9soE8Pso6EmGPUSAU1p4fgAA">
+<XPD:ATTR name="Name" type="string">setATVFreq</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[22]" type="UMLOperation" guid="mlHUjain7UyPF/GHGuUEQgAA">
+<XPD:ATTR name="Name" type="string">setATVAfcData</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#TypedFeatures" type="integer">1</XPD:ATTR>
+<XPD:REF name="TypedFeatures[0]">Zh90wWMTSUm6ew2qIiAjFAAA</XPD:REF>
+<XPD:ATTR name="#TypedParameters" type="integer">3</XPD:ATTR>
+<XPD:REF name="TypedParameters[0]">ZpRrlyhz802QY2ObgoUqmwAA</XPD:REF>
+<XPD:REF name="TypedParameters[1]">NFnoGSrnCk6OIIsCI5hKAAAA</XPD:REF>
+<XPD:REF name="TypedParameters[2]">A7QPUTtNz0O45ex/ZBEL3wAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">5</XPD:ATTR>
+<XPD:REF name="Associations[0]">GZcPUasbnkG3pyGKV6NFnAAA</XPD:REF>
+<XPD:REF name="Associations[1]">XvxorIQvl0aKnzyznjd1uwAA</XPD:REF>
+<XPD:REF name="Associations[2]">BVpPYPY4V0KsTBJTRoLjyAAA</XPD:REF>
+<XPD:REF name="Associations[3]">QwwfXlN26EahMaF2XDAvLAAA</XPD:REF>
+<XPD:REF name="Associations[4]">C7X0ILbZrkWDVQ5Vc+PT/wAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="Z9Ui4868AE++l0of4VxduQAA">
+<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
+<XPD:REF name="Owner">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="gx40XIC9FkOG3iX3Oyxw8wAA">
+<XPD:ATTR name="Name" type="string">CTvGroup</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">Group对应DTV中的一个节目分组</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">8HnvkQxPk0OLqQXLeJ5MUgAA</XPD:REF>
+<XPD:REF name="Views[1]">50xz0k8rgU+WfODoAi8aeQAA</XPD:REF>
+<XPD:REF name="Views[2]">TR1rTShyhEG7ngh596L0kgAA</XPD:REF>
+<XPD:REF name="Views[3]">GPl78wz82UaLho5xwfMqrQAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">4</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="fRgLJCGVDUK1RuJPwHSaGwAA">
+<XPD:ATTR name="Name" type="string">selectByGroup</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">å–得所有节目分组信æ¯</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="A3kmDTyc/0aEXqkXlCeAFAAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">vector&lt;TvGroup&gt;</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">fRgLJCGVDUK1RuJPwHSaGwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="DqeBCx0GukCwnvjLeUhcogAA">
+<XPD:ATTR name="Name" type="string">addGroup</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Hq5DfJkwqUmxLMkjmPj4qQAA">
+<XPD:ATTR name="Name" type="string">deleteGroup</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="5xVs/C/ycES9RQlY9VAsCgAA">
+<XPD:ATTR name="Name" type="string">editGroup</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">Io3cINfhiE23pmiSxpS6swAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="e9OE1kuwcUuhtDW6AZvH1wAA">
+<XPD:REF name="Owner">gx40XIC9FkOG3iX3Oyxw8wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLClass" guid="26RSzf3jmEWkDlRiFhl4OAAA">
+<XPD:ATTR name="Name" type="string">CTvEvent</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">对应æ¯ä¸ªProgram一个时段的节目</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">7aPHkO59WEubHbpM/Djq/AAA</XPD:REF>
+<XPD:REF name="Views[1]">+EOWTA5PrUyAEwB/ZHVnPAAA</XPD:REF>
+<XPD:REF name="Views[2]">f0xyghRma028ShVYc8tbfwAA</XPD:REF>
+<XPD:REF name="Views[3]">qpXdkd1nJ0ajRru7gzDFJwAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">6</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="0db/IAr++UOdZquo78fTbgAA">
+<XPD:ATTR name="Name" type="string">TVEvent</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
+<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="lSipwxb9AEu7dKbkvn8bCwAA">
+<XPD:ATTR name="Name" type="string">db</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">0db/IAr++UOdZquo78fTbgAA</XPD:REF>
+<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="IaJ2KyC/H0W4mE3T5XcaJQAA">
+<XPD:ATTR name="Name" type="string">TVEvent</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
+<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="n6dU85krq0+Oca0Y2wayfAAA">
+<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="JOwE9Bjhf0229aBZv0thuwAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvEvent</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">n6dU85krq0+Oca0Y2wayfAAA</XPD:REF>
+<XPD:REF name="Type_">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="E97BMkERRU2lIzjyqz++tAAA">
+<XPD:ATTR name="Name" type="string">getProgram</XPD:ATTR>
+<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="w4A7LCg5RUitVRoJ8EF5DwAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">E97BMkERRU2lIzjyqz++tAAA</XPD:REF>
+<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="R/cQwE4hs0yRPnKVjTffUQAA">
+<XPD:ATTR name="Name" type="string">getDVBViewAge</XPD:ATTR>
<XPD:ATTR name="Documentation" type="string">å–得观看年龄(DVB)
-@return 返回观看年龄,0表示无年龄é™åˆ¶</XPD:ATTR>
-<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="3SmucpKb9ESg9TT4SKAe3AAA">
-<XPD:ATTR name="Name" type="string">getVChipRatings</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">å–å¾—V-Chip级别信æ¯</XPD:ATTR>
-<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:ATTR name="#TypedParameters" type="integer">2</XPD:ATTR>
-<XPD:REF name="TypedParameters[0]">+v9VB9kIH02VZ9TgNHJJfQAA</XPD:REF>
-<XPD:REF name="TypedParameters[1]">JOwE9Bjhf0229aBZv0thuwAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
-<XPD:REF name="Associations[0]">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
-<XPD:REF name="Associations[1]">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
-<XPD:REF name="Associations[2]">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
-<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
-<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="PMItdyz77UuIZwzHxmOd3AAA">
-<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
-<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="nCSrn+xVyUGe6iyd/E/GDwAA">
-<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
-<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="xT0LK2eQ9EGzJfCHW9IJ9wAA">
-<XPD:ATTR name="Name" type="string">program</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
-<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
-<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="UiYOh8D78E22qQeFeDZpLAAA">
-<XPD:ATTR name="Name" type="string">CTvConfig</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">vYDCfUgYq0KaBSDnxbpYVgAA</XPD:REF>
-<XPD:REF name="Views[1]">KTNQfnqIy0q3wV+ARVtV9gAA</XPD:REF>
-<XPD:REF name="Views[2]">7Pq+TJVLy06gA8T6r5wMawAA</XPD:REF>
-<XPD:REF name="Views[3]">Fn0oKpD7lUyNbDw59UyRygAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[8]" type="UMLClass" guid="b8JuO/0C0Eq0GnJ0Q/tEWQAA">
-<XPD:ATTR name="Name" type="string">CTvBooking</XPD:ATTR>
+@return 返回观看年龄,0表示无年龄é™åˆ¶</XPD:ATTR>
+<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="3SmucpKb9ESg9TT4SKAe3AAA">
+<XPD:ATTR name="Name" type="string">getVChipRatings</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">å–å¾—V-Chip级别信æ¯</XPD:ATTR>
+<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#TypedParameters" type="integer">2</XPD:ATTR>
+<XPD:REF name="TypedParameters[0]">+v9VB9kIH02VZ9TgNHJJfQAA</XPD:REF>
+<XPD:REF name="TypedParameters[1]">JOwE9Bjhf0229aBZv0thuwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">PhlKgbqPt0OClpwk2m9vswAA</XPD:REF>
+<XPD:REF name="Associations[1]">zefo1Bu+v0e4gn9nUL+bSQAA</XPD:REF>
+<XPD:REF name="Associations[2]">BSJLLgAd4kCusm/8BFZQMQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="PMItdyz77UuIZwzHxmOd3AAA">
+<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
+<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="nCSrn+xVyUGe6iyd/E/GDwAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
+<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="xT0LK2eQ9EGzJfCHW9IJ9wAA">
+<XPD:ATTR name="Name" type="string">program</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvProgram</XPD:ATTR>
+<XPD:REF name="Type_">9naBHAA+hkmkNtZzyXP1/wAA</XPD:REF>
+<XPD:REF name="Owner">26RSzf3jmEWkDlRiFhl4OAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="UiYOh8D78E22qQeFeDZpLAAA">
+<XPD:ATTR name="Name" type="string">CTvConfig</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vYDCfUgYq0KaBSDnxbpYVgAA</XPD:REF>
+<XPD:REF name="Views[1]">KTNQfnqIy0q3wV+ARVtV9gAA</XPD:REF>
+<XPD:REF name="Views[2]">7Pq+TJVLy06gA8T6r5wMawAA</XPD:REF>
+<XPD:REF name="Views[3]">Fn0oKpD7lUyNbDw59UyRygAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">usmo/t5V5UGA31IdVHUKyQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLClass" guid="b8JuO/0C0Eq0GnJ0Q/tEWQAA">
+<XPD:ATTR name="Name" type="string">CTvBooking</XPD:ATTR>
<XPD:ATTR name="Documentation" type="string">预约播放
-预约录åƒ</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Th+ZwPCIw0CZjtawrnGPrQAA</XPD:REF>
-<XPD:REF name="Views[1]">LL3KL7SUuEyu4pY6NT57NAAA</XPD:REF>
-<XPD:REF name="Views[2]">dCkq+XCQgkaH1Q901KclHQAA</XPD:REF>
-<XPD:REF name="Views[3]">+Bzptjmx3kWzAYT9fN/rxQAA</XPD:REF>
-<XPD:ATTR name="#Operations" type="integer">8</XPD:ATTR>
-<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="m+gfn/ntpkybEdFBM5znlgAA">
-<XPD:ATTR name="Name" type="string">TVBooking</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
-<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="lc6uST5/Mk6WfIuIfATlsgAA">
-<XPD:ATTR name="Name" type="string">db</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">m+gfn/ntpkybEdFBM5znlgAA</XPD:REF>
-<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="QqLeWhZJc0CLub0IjxjyywAA">
-<XPD:ATTR name="Name" type="string">TVBooking</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
-<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Tn9evQiVdUWS5ClifY+LnwAA">
-<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">æ ¹æ®è®°å½•ID查找指定TVBooking</XPD:ATTR>
-<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="LZuyv0amBUa1JHWrCnDVeAAA">
-<XPD:ATTR name="Name" type="string">selectRecordBookingsByStatus</XPD:ATTR>
-<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="GmUmSDVcrEabb38Mr6otqQAA">
-<XPD:ATTR name="Name" type="string">selectPlayBookingsByStatus</XPD:ATTR>
-<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="/JwIOjuS30SKen+tINIeIQAA">
-<XPD:ATTR name="Name" type="string">bookProgram</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">预约一个Program</XPD:ATTR>
-<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="06m4LFRvq0WqF2UaQPilJwAA">
-<XPD:ATTR name="Name" type="string">bookEvent</XPD:ATTR>
-<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="5r22Uycz1E6G3LtVFBjRzQAA">
-<XPD:ATTR name="Name" type="string">delete</XPD:ATTR>
-<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-</XPD:OBJ>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="3uD8ZK44vEi6X3Yo5n4G3wAA">
-<XPD:ATTR name="Name" type="string">CTvRegion</XPD:ATTR>
+预约录åƒ</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Th+ZwPCIw0CZjtawrnGPrQAA</XPD:REF>
+<XPD:REF name="Views[1]">LL3KL7SUuEyu4pY6NT57NAAA</XPD:REF>
+<XPD:REF name="Views[2]">dCkq+XCQgkaH1Q901KclHQAA</XPD:REF>
+<XPD:REF name="Views[3]">+Bzptjmx3kWzAYT9fN/rxQAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">8</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="m+gfn/ntpkybEdFBM5znlgAA">
+<XPD:ATTR name="Name" type="string">TVBooking</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
+<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="lc6uST5/Mk6WfIuIfATlsgAA">
+<XPD:ATTR name="Name" type="string">db</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">m+gfn/ntpkybEdFBM5znlgAA</XPD:REF>
+<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="QqLeWhZJc0CLub0IjxjyywAA">
+<XPD:ATTR name="Name" type="string">TVBooking</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
+<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Tn9evQiVdUWS5ClifY+LnwAA">
+<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">æ ¹æ®è®°å½•ID查找指定TVBooking</XPD:ATTR>
+<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="LZuyv0amBUa1JHWrCnDVeAAA">
+<XPD:ATTR name="Name" type="string">selectRecordBookingsByStatus</XPD:ATTR>
+<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="GmUmSDVcrEabb38Mr6otqQAA">
+<XPD:ATTR name="Name" type="string">selectPlayBookingsByStatus</XPD:ATTR>
+<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="/JwIOjuS30SKen+tINIeIQAA">
+<XPD:ATTR name="Name" type="string">bookProgram</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">预约一个Program</XPD:ATTR>
+<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="06m4LFRvq0WqF2UaQPilJwAA">
+<XPD:ATTR name="Name" type="string">bookEvent</XPD:ATTR>
+<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="5r22Uycz1E6G3LtVFBjRzQAA">
+<XPD:ATTR name="Name" type="string">delete</XPD:ATTR>
+<XPD:REF name="Owner">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">AfVgLfyALEyP98guAbYHUAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="3uD8ZK44vEi6X3Yo5n4G3wAA">
+<XPD:ATTR name="Name" type="string">CTvRegion</XPD:ATTR>
<XPD:ATTR name="Documentation" type="string"> TV 区域
- å¯ä»¥èŽ·å¾—æ¯ä¸ªåŒºåŸŸçš„频率列表等信æ¯</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">ybciiFK3jEO6SdfdRt6uAgAA</XPD:REF>
-<XPD:REF name="Views[1]">AL2e0wMT+0K0AC6gZuuhdwAA</XPD:REF>
-<XPD:REF name="Views[2]">zIfIWkZ3Lkiq2O9aOGiU/gAA</XPD:REF>
-<XPD:REF name="Views[3]">exyb4FNp+Ue9ROAGwoQFcwAA</XPD:REF>
-<XPD:ATTR name="#Operations" type="integer">7</XPD:ATTR>
-<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="ujBTxs7XQU2sxrOeErOlLAAA">
-<XPD:ATTR name="Name" type="string">TVRegion</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="eQIZ7HOvJESQdc0nGhqnrwAA">
-<XPD:ATTR name="Name" type="string">db</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">ujBTxs7XQU2sxrOeErOlLAAA</XPD:REF>
-<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="AIgKz2rgMU2bWNgoO2rmngAA">
-<XPD:ATTR name="Name" type="string">TVRegion</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="1mlb6r4cZkSv6mS9OhiHiAAA">
-<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="KaZtVGGTiEm4B9lL22FEtgAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvRegion</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">1mlb6r4cZkSv6mS9OhiHiAAA</XPD:REF>
-<XPD:REF name="Type_">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="d7lFBHriY0e22/gy989mbgAA">
-<XPD:ATTR name="Name" type="string">selectByName</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="4bMFZq1Ayk+uxljdLs5nigAA">
-<XPD:ATTR name="Name" type="string">selectByCountry</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="gN4TbpRxGkS8N+OPpekKxQAA">
-<XPD:ATTR name="Name" type="string">getAllCountry</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="owFuhgapFk+E9YYtCGoeqgAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">vector&lt;String&gt;</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">gN4TbpRxGkS8N+OPpekKxQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="jk0qAxv5u0yw7WgwL+rscQAA">
-<XPD:ATTR name="Name" type="string">getChannelParams</XPD:ATTR>
+ å¯ä»¥èŽ·å¾—æ¯ä¸ªåŒºåŸŸçš„频率列表等信æ¯</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ybciiFK3jEO6SdfdRt6uAgAA</XPD:REF>
+<XPD:REF name="Views[1]">AL2e0wMT+0K0AC6gZuuhdwAA</XPD:REF>
+<XPD:REF name="Views[2]">zIfIWkZ3Lkiq2O9aOGiU/gAA</XPD:REF>
+<XPD:REF name="Views[3]">exyb4FNp+Ue9ROAGwoQFcwAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">7</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="ujBTxs7XQU2sxrOeErOlLAAA">
+<XPD:ATTR name="Name" type="string">TVRegion</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="eQIZ7HOvJESQdc0nGhqnrwAA">
+<XPD:ATTR name="Name" type="string">db</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvDatabase</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">ujBTxs7XQU2sxrOeErOlLAAA</XPD:REF>
+<XPD:REF name="Type_">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="AIgKz2rgMU2bWNgoO2rmngAA">
+<XPD:ATTR name="Name" type="string">TVRegion</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="1mlb6r4cZkSv6mS9OhiHiAAA">
+<XPD:ATTR name="Name" type="string">selectByID</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="KaZtVGGTiEm4B9lL22FEtgAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvRegion</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">1mlb6r4cZkSv6mS9OhiHiAAA</XPD:REF>
+<XPD:REF name="Type_">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="d7lFBHriY0e22/gy989mbgAA">
+<XPD:ATTR name="Name" type="string">selectByName</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="4bMFZq1Ayk+uxljdLs5nigAA">
+<XPD:ATTR name="Name" type="string">selectByCountry</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="gN4TbpRxGkS8N+OPpekKxQAA">
+<XPD:ATTR name="Name" type="string">getAllCountry</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="owFuhgapFk+E9YYtCGoeqgAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">vector&lt;String&gt;</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">gN4TbpRxGkS8N+OPpekKxQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="jk0qAxv5u0yw7WgwL+rscQAA">
+<XPD:ATTR name="Name" type="string">getChannelParams</XPD:ATTR>
<XPD:ATTR name="Documentation" type="string">å–得该Regionçš„ä¿¡å·æºé¢‘率å‚数列表
-@return 返回信å·æºé¢‘率å‚数列表</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="cgdkfeW2SE21ZEOaHuLc7gAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">TVChannelParams</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">jk0qAxv5u0yw7WgwL+rscQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:ATTR name="#TypedParameters" type="integer">1</XPD:ATTR>
-<XPD:REF name="TypedParameters[0]">KaZtVGGTiEm4B9lL22FEtgAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
-<XPD:REF name="Associations[0]">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
-<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
-<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="qz9HpzuB70u9CKoB8GAVTQAA">
-<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="20sWt8adtki4R3t6aKZcXQAA">
-<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="ubg2Td5H2E6xsn9yTlb4FgAA">
-<XPD:ATTR name="Name" type="string">country</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
-<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[10]" type="UMLClass" guid="iUy0YZgyREC+o54lTQptaAAA">
-<XPD:ATTR name="Name" type="string">CTvSatellite</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">TV Satellite相关信æ¯</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">tzICJ64LmUSx1fvEy4dHZQAA</XPD:REF>
-<XPD:REF name="Views[1]">yCTnlkoiRkSszYJDHrqQuwAA</XPD:REF>
-<XPD:REF name="Views[2]">phU5m2tyh0yMlhsYRPe6dwAA</XPD:REF>
-<XPD:REF name="Views[3]">S8DZ5jxQq0+WFWPFnQy7iAAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
-<XPD:REF name="Associations[0]">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
-<XPD:REF name="Associations[1]">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[11]" type="UMLClass" guid="/LI4+1GTjEagI/wLEFpVSQAA">
-<XPD:ATTR name="Name" type="string">CTvDimension</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">TV ATSC rating dimension</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">hzoiTuCQqEuArZEejfwdnQAA</XPD:REF>
-<XPD:REF name="Views[1]">PdTrEGRJOEiEJyD2I9IzJgAA</XPD:REF>
-<XPD:REF name="Views[2]">VbdqX2NLOkK2DTLhOA91OwAA</XPD:REF>
-<XPD:REF name="Views[3]">K00/VzyqZUmltiuaKWLgAQAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
-<XPD:REF name="Associations[0]">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
-<XPD:REF name="Associations[1]">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[12]" type="UMLClass" guid="K+kTKNnFak+/Lo9L/RD0ugAA">
-<XPD:ATTR name="Name" type="string">CTvChannelParams</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">wu+9+Z2tqE2B3qchWKoWdQAA</XPD:REF>
-<XPD:REF name="Views[1]">KAuxxnmqhkmQ7MLBFq8lRgAA</XPD:REF>
-<XPD:REF name="Views[2]">Ynggyopqt02II9Rzg7q1VQAA</XPD:REF>
-<XPD:REF name="Views[3]">PmvllpBms0ifaPkwzqXvOAAA</XPD:REF>
-<XPD:ATTR name="#Operations" type="integer">13</XPD:ATTR>
-<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="kX5mh2hT8UCWJLBSwRAVcgAA">
-<XPD:ATTR name="Name" type="string">TVChannelParams</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="Lv2eTshDS0qHu/TtzYTS/QAA">
-<XPD:ATTR name="Name" type="string">mode</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">kX5mh2hT8UCWJLBSwRAVcgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="bqibYQS6Yk2XKFVNjvPY/QAA">
-<XPD:ATTR name="Name" type="string">TVChannelParams</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="g8684eMuVEODZq64tkbFKwAA">
-<XPD:ATTR name="Name" type="string">CreatedvbcParams</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">类似还有其它channelå‚数创建é™æ€æŽ¥å£</XPD:ATTR>
-<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="dgzVycSB3EK9p7gNlVzXuAAA">
-<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
-<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvChannelParams</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">g8684eMuVEODZq64tkbFKwAA</XPD:REF>
-<XPD:REF name="Type_">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="qzQZnEnCj0edzMmQ9W+TUgAA">
-<XPD:ATTR name="Name" type="string">channelCurAllbandParams</XPD:ATTR>
+@return 返回信å·æºé¢‘率å‚数列表</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="cgdkfeW2SE21ZEOaHuLc7gAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">TVChannelParams</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">jk0qAxv5u0yw7WgwL+rscQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#TypedParameters" type="integer">1</XPD:ATTR>
+<XPD:REF name="TypedParameters[0]">KaZtVGGTiEm4B9lL22FEtgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">l6Lg/NJG5UWu+7ALxaVP3gAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="qz9HpzuB70u9CKoB8GAVTQAA">
+<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="20sWt8adtki4R3t6aKZcXQAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="ubg2Td5H2E6xsn9yTlb4FgAA">
+<XPD:ATTR name="Name" type="string">country</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">String</XPD:ATTR>
+<XPD:REF name="Owner">3uD8ZK44vEi6X3Yo5n4G3wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLClass" guid="iUy0YZgyREC+o54lTQptaAAA">
+<XPD:ATTR name="Name" type="string">CTvSatellite</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">TV Satellite相关信æ¯</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">tzICJ64LmUSx1fvEy4dHZQAA</XPD:REF>
+<XPD:REF name="Views[1]">yCTnlkoiRkSszYJDHrqQuwAA</XPD:REF>
+<XPD:REF name="Views[2]">phU5m2tyh0yMlhsYRPe6dwAA</XPD:REF>
+<XPD:REF name="Views[3]">S8DZ5jxQq0+WFWPFnQy7iAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">ULQw0JNjPE2758pFWlo+MQAA</XPD:REF>
+<XPD:REF name="Associations[1]">bObyymjPEkeQZSoHCKpP2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[11]" type="UMLClass" guid="/LI4+1GTjEagI/wLEFpVSQAA">
+<XPD:ATTR name="Name" type="string">CTvDimension</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">TV ATSC rating dimension</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">hzoiTuCQqEuArZEejfwdnQAA</XPD:REF>
+<XPD:REF name="Views[1]">PdTrEGRJOEiEJyD2I9IzJgAA</XPD:REF>
+<XPD:REF name="Views[2]">VbdqX2NLOkK2DTLhOA91OwAA</XPD:REF>
+<XPD:REF name="Views[3]">K00/VzyqZUmltiuaKWLgAQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">aYL27tYOR02se3g//aEBeAAA</XPD:REF>
+<XPD:REF name="Associations[1]">zCPl48BYx0CFRkp8Jj5mogAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[12]" type="UMLClass" guid="K+kTKNnFak+/Lo9L/RD0ugAA">
+<XPD:ATTR name="Name" type="string">CTvChannelParams</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">wu+9+Z2tqE2B3qchWKoWdQAA</XPD:REF>
+<XPD:REF name="Views[1]">KAuxxnmqhkmQ7MLBFq8lRgAA</XPD:REF>
+<XPD:REF name="Views[2]">Ynggyopqt02II9Rzg7q1VQAA</XPD:REF>
+<XPD:REF name="Views[3]">PmvllpBms0ifaPkwzqXvOAAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">13</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="kX5mh2hT8UCWJLBSwRAVcgAA">
+<XPD:ATTR name="Name" type="string">TVChannelParams</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">create</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="Lv2eTshDS0qHu/TtzYTS/QAA">
+<XPD:ATTR name="Name" type="string">mode</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">kX5mh2hT8UCWJLBSwRAVcgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="bqibYQS6Yk2XKFVNjvPY/QAA">
+<XPD:ATTR name="Name" type="string">TVChannelParams</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">destroy</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="g8684eMuVEODZq64tkbFKwAA">
+<XPD:ATTR name="Name" type="string">CreatedvbcParams</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">类似还有其它channelå‚数创建é™æ€æŽ¥å£</XPD:ATTR>
+<XPD:ATTR name="OwnerScope" type="UMLScopeKind">skClassifier</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="dgzVycSB3EK9p7gNlVzXuAAA">
+<XPD:ATTR name="Name" type="string">ret</XPD:ATTR>
+<XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvChannelParams</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">g8684eMuVEODZq64tkbFKwAA</XPD:REF>
+<XPD:REF name="Type_">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="qzQZnEnCj0edzMmQ9W+TUgAA">
+<XPD:ATTR name="Name" type="string">channelCurAllbandParams</XPD:ATTR>
<XPD:ATTR name="Documentation" type="string">创建当å‰æ‰€æœ‰é€šé“å‚æ•°
@param region 区域
@param mode 通é“模å¼
-@return 返回新创建的å‚æ•°</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="sUoQkkeSDUicDjvihzE17wAA">
-<XPD:ATTR name="Name" type="string">setATVAudio</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">修改模拟音频</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="Zp/uaKhNykq6I0DLIqMs6QAA">
-<XPD:ATTR name="Name" type="string">setATVVideoFormat</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">修改模拟视频制å¼</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="W6/Dh7vCMEOK5gCFWgvBuQAA">
-<XPD:ATTR name="Name" type="string">setATVAudioFormat</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string">修改模拟音频制å¼</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="q3e/rtfy+kSDpxAL+JLUAwAA">
-<XPD:ATTR name="Name" type="string">getMode</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="21JdwhpouEyYG3lZnsC7PQAA">
-<XPD:ATTR name="Name" type="string">isDVBMode</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="MCre8DdGnEO6NtacO4PxcwAA">
-<XPD:ATTR name="Name" type="string">getFrequency</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="kb+kpTCHVEKx7jv8aHBGTQAA">
-<XPD:ATTR name="Name" type="string">getAudioMode</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="tYagO7r1C0yRLvAhDROpOQAA">
-<XPD:ATTR name="Name" type="string">getBandwidth</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="ugcb6A9/j02nfYGa/WNK2QAA">
-<XPD:ATTR name="Name" type="string">==</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">Cpp</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">CppOperator</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="WRmMAQd1vkKgOwOy5hHXbwAA">
-<XPD:ATTR name="Name" type="string">param</XPD:ATTR>
-<XPD:ATTR name="TypeExpression" type="string">CTvChannelParams</XPD:ATTR>
-<XPD:REF name="BehavioralFeature">ugcb6A9/j02nfYGa/WNK2QAA</XPD:REF>
-<XPD:REF name="Type_">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:ATTR name="#TypedParameters" type="integer">2</XPD:ATTR>
-<XPD:REF name="TypedParameters[0]">dgzVycSB3EK9p7gNlVzXuAAA</XPD:REF>
-<XPD:REF name="TypedParameters[1]">WRmMAQd1vkKgOwOy5hHXbwAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
-<XPD:REF name="Associations[0]">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
-<XPD:REF name="Associations[1]">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
-<XPD:ATTR name="#Attributes" type="integer">11</XPD:ATTR>
-<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="vd9GmSHi8kmIG7Uv183sQwAA">
-<XPD:ATTR name="Name" type="string">mode</XPD:ATTR>
-<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="8PpQj0CQ8UaM6aUQTqHY+wAA">
-<XPD:ATTR name="Name" type="string">frequency</XPD:ATTR>
-<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="mixkGHhILEOQrR9Hbe6XtwAA">
-<XPD:ATTR name="Name" type="string">symbolRate</XPD:ATTR>
-<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="2yJw+lrLQE26CKqlL4qTawAA">
-<XPD:ATTR name="Name" type="string">modulation</XPD:ATTR>
-<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="nFx/MMjsyEq2iVvWRpY1pwAA">
-<XPD:ATTR name="Name" type="string">bandwidth</XPD:ATTR>
-<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[5]" type="UMLAttribute" guid="0Zj58ngjk0KvB5ZV2+v12gAA">
-<XPD:ATTR name="Name" type="string">audio</XPD:ATTR>
-<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[6]" type="UMLAttribute" guid="1CdqUE68HkCKHC0wHU0OugAA">
-<XPD:ATTR name="Name" type="string">standard</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[7]" type="UMLAttribute" guid="qCoIFqRZckuS8ETuBEJ63gAA">
-<XPD:ATTR name="Name" type="string">afc_data</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[8]" type="UMLAttribute" guid="RXpFXMpRb0G050iBJ169CQAA">
-<XPD:ATTR name="Name" type="string">sat_id</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[9]" type="UMLAttribute" guid="KbUJ3zQudkuMliodZgdwoAAA">
-<XPD:ATTR name="Name" type="string">sat_polarisation</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Attributes[10]" type="UMLAttribute" guid="I6rm/D6pekmaDTzLw9FT/wAA">
-<XPD:ATTR name="Name" type="string">Attribute2</XPD:ATTR>
-<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[13]" type="UMLSignal" guid="IK4ie4RbI0mW+299Nj4+3AAA">
-<XPD:ATTR name="Name" type="string">CListen</XPD:ATTR>
-<XPD:ATTR name="Documentation" type="string"> /**正在播放的节目因收看等级ä¸å¤Ÿè¢«åœæ­¢*/
- public static final int TYPE_PROGRAM_BLOCK = 1;
- /**正在播放的节目从BLOCK状æ€æ¢å¤*/
- public static final int TYPE_PROGRAM_UNBLOCK = 2;
- /**没有信å·*/
- public static final int TYPE_SIGNAL_LOST = 3;
- /**ä¿¡å·æ¢å¤*/
- public static final int TYPE_SIGNAL_RESUME = 4;
- /**节目数æ®åœæ­¢*/
- public static final int TYPE_DATA_LOST = 5;
- /**节目数æ®æ¢å¤*/
- public static final int TYPE_DATA_RESUME = 6;
- /**预约æ醒*/
- public static final int TYPE_BOOKING_REMIND = 7;
- /**预约开始*/
- public static final int TYPE_BOOKING_START = 8;
- /**é…置项被修改*/
- public static final int TYPE_CONFIG_CHANGED = 9;
- /**频é“æœç´¢è¿›åº¦*/
- public static final int TYPE_SCAN_PROGRESS = 10;
- /**频é“æœç´¢ç»“æŸï¼Œå¼€å§‹å­˜å‚¨ */
- public static final int TYPE_SCAN_STORE_BEGIN = 11;
- /**频é“æœç´¢å­˜å‚¨å®Œæ¯•*/
- public static final int TYPE_SCAN_STORE_END = 12;
- /**频é“æœç´¢å®Œæˆ*/
- public static final int TYPE_SCAN_END = 13;
- /**正在播放节目相关信æ¯æ›´æ–°*/
- public static final int TYPE_PROGRAM_UPDATE = 14;
- /**节目开始播放*/
- public static final int TYPE_PROGRAM_START = 15;
- /**节目åœæ­¢æ’­æ”¾*/
- public static final int TYPE_PROGRAM_STOP = 16;
- /**TV系统时间更新*/
- public static final int TYPE_TIME_UPDATE = 17;
- /**事件信æ¯æ›´æ–°*/
- public static final int TYPE_EVENT_UPDATE = 18;
- /**输入æºåˆ‡æ¢*/
- public static final int TYPE_INPUT_SOURCE_CHANGED = 19;
- /**请求播放节目å·*/
- public static final int TYPE_PROGRAM_NUMBER = 20;
- /**录åƒåˆ—表更新*/
- public static final int TYPE_RECORDS_UPDATE = 21;
- /**录åƒå†²çª*/
- public static final int TYPE_RECORD_CONFLICT = 22;
- /**录åƒå·²ç»“æŸ*/
- public static final int TYPE_RECORD_END = 23;
- /**VGAä¿¡å·è°ƒæ•´æˆåŠŸ*/
- public static final int TYPE_VGA_ADJUST_OK = 24;
- /**VGAä¿¡å·è°ƒæ•´å¤±è´¥*/
- public static final int TYPE_VGA_ADJUST_FAILED = 25;
- /**VGAä¿¡å·è°ƒæ•´ä¸­*/
- public static final int TYPE_VGA_ADJUST_DOING = 26;
- /**ä¿¡å·æ”¹å˜*/
- public static final int TYPE_SIG_CHANGE = 27;
- /**盲扫进度*/
- public static final int TYPE_BLINDSCAN_PROGRESS = 28;
- /**盲扫新Channel*/
- public static final int TYPE_BLINDSCAN_NEWCHANNEL = 29;
- /**盲扫结æŸ*/
- public static final int TYPE_BLINDSCAN_END = 30;
- /**å«æ˜Ÿè®¾å¤‡LNB与Switché…置生效*/
- public static final int TYPE_SEC_LNBSSWITCHCFGVALID = 31;
- /**diseqc马达åœæ­¢è½¬åŠ¨*/
- public static final int TYPE_SEC_POSITIONERSTOP= 32;
- /**diseqc马达ç¦æ­¢é™åˆ¶*/
- public static final int TYPE_SEC_POSITIONERDISABLELIMIT= 33;
- /**diseqc马达东å‘é™åˆ¶è®¾ç½®*/
- public static final int TYPE_SEC_POSITIONEREASTLIMIT= 34;
- /**diseqc马达西å‘é™åˆ¶è®¾ç½®*/
- public static final int TYPE_SEC_POSITIONERWESTLIMIT= 35;
- /**diseqc马达东å‘转动*/
- public static final int TYPE_SEC_POSITIONEREAST= 36;
- /**diseqc马达西å‘转动*/
- public static final int TYPE_SEC_POSITIONERWEST= 37;
- /**diseqc马达存储ä½ç½®*/
- public static final int TYPE_SEC_POSITIONERSTORE= 38;
- /**diseqc马达转动到指定ä½ç½®*/
- public static final int TYPE_SEC_POSITIONERGOTO= 39;
- /**diseqc马达转动根æ®æœ¬åœ°ç»çº¬åº¦ä»¥åŠå«æ˜Ÿç»åº¦*/
- public static final int TYPE_SEC_POSITIONERGOTOX= 40;
- /**切æ¢è‡³æ–°èŠ‚ç›®*/
- public static final int TYPE_PROGRAM_SWITCH = 41;
- /**在当å‰é¢‘点æœç´¢DTV频é“*/
- public static final int TYPE_SCAN_DTV_CHANNEL = 42;
- /**æ•°æ®åº“导入/导出转æ¢æ“作开始*/
- public static final int TYPE_TRANSFORM_DB_START = 43;
- /**æ•°æ®åº“导入/导出转æ¢æ“作完æˆ*/
- public static final int TYPE_TRANSFORM_DB_END = 44;
- /**pvr/timeshifting回放开始*/
- public static final int TYPE_PLAYBACK_START = 45;
- /**pvr/timeshifting回放结æŸ*/
- public static final int TYPE_PLAYBACK_STOP = 46;
- /**节目音视频因被加扰而无法正常播放*/
- public static final int TYPE_PROGRAM_SCRAMBLED = 47;
-
-
-
-æµçš„å˜åŒ–
-</XPD:ATTR>
-<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:ATTR name="#Associations" type="integer">4</XPD:ATTR>
-<XPD:REF name="Associations[0]">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
-<XPD:REF name="Associations[1]">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
-<XPD:REF name="Associations[2]">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
-<XPD:REF name="Associations[3]">0WvOUzDyAEKgjZCRSx5J8gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[1]" type="UMLPackage" guid="ZRumjrTwgUamBDOstkagPgAA">
-<XPD:ATTR name="Name" type="string">atv</XPD:ATTR>
-<XPD:REF name="Namespace">bnJ8ggSchket3/t1l7Kx4wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
-<XPD:REF name="Views[0]">R7RBkUeb+E+5S8gvJN8+QQAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
-<XPD:REF name="Associations[0]">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
-<XPD:REF name="Associations[1]">nzRPyOcacU2J9Jf/0lCmawAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[23]" type="UMLAssociation" guid="1PikxOdVcU2P6grgcwgRvQAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Z3PDc4i/1UCiaxni9RpD2wAA</XPD:REF>
-<XPD:REF name="Views[1]">mhm++LaJkk6lJzcTz7hSFgAA</XPD:REF>
-<XPD:REF name="Views[2]">IxT95vhnIEyr12fdRQskKQAA</XPD:REF>
-<XPD:REF name="Views[3]">d+KXspkLsEa/YezZSZ7YZAAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="AfVgLfyALEyP98guAbYHUAAA">
-<XPD:REF name="Association">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
-<XPD:REF name="Participant">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">08HUrDXL5EahpEFi9GJ9yQAA</XPD:REF>
-<XPD:REF name="Views[1]">QRLcMMAOqES9/c4itcB3vAAA</XPD:REF>
-<XPD:REF name="Views[2]">mQFH13/vQUucR5en5l/dUwAA</XPD:REF>
-<XPD:REF name="Views[3]">m0oKw9kT5k2CSLEOl9tV+gAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Fd/cvRV12USE+Vu6oJsMOgAA">
-<XPD:REF name="Association">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">HxD2Y75aWkSp4d/0R6KiBgAA</XPD:REF>
-<XPD:REF name="Views[1]">K5rMwb6Iyka5HDC+pxIZOwAA</XPD:REF>
-<XPD:REF name="Views[2]">GfMJbs1/nkShjuqnA/8BBAAA</XPD:REF>
-<XPD:REF name="Views[3]">jXmYJVpZxkCkrM3yJ0eHmgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[24]" type="UMLAssociation" guid="6uW6VAT+jEG9Vy3cmRxPvgAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="0WvOUzDyAEKgjZCRSx5J8gAA">
-<XPD:REF name="Association">6uW6VAT+jEG9Vy3cmRxPvgAA</XPD:REF>
-<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="nzRPyOcacU2J9Jf/0lCmawAA">
-<XPD:REF name="Association">6uW6VAT+jEG9Vy3cmRxPvgAA</XPD:REF>
-<XPD:REF name="Participant">ZRumjrTwgUamBDOstkagPgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[25]" type="UMLAssociation" guid="3PUgTTrP3U+LofrDCso/eAAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">JFsYjMcrU0GkgX8jFqUVZAAA</XPD:REF>
-<XPD:REF name="Views[1]">R57gZgKnBkm8aQCFy90fiQAA</XPD:REF>
-<XPD:REF name="Views[2]">GznyP+sffEKB3m9dw8jftQAA</XPD:REF>
-<XPD:REF name="Views[3]">NM8M6o1EGkWwEmKdXXKpPAAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="PP9nsgv4Vkmbk1zEfct4VAAA">
-<XPD:REF name="Association">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
-<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">vVViwylf/Ei9ld6xTj7WdQAA</XPD:REF>
-<XPD:REF name="Views[1]">A5rd4V90HkCp3dmD7wYTbwAA</XPD:REF>
-<XPD:REF name="Views[2]">fhSnklGoSEqMAzQOJY57vwAA</XPD:REF>
-<XPD:REF name="Views[3]">n4gqVjygvUK59/wDDHYNJgAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="usmo/t5V5UGA31IdVHUKyQAA">
-<XPD:REF name="Association">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
-<XPD:REF name="Participant">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">AoZLFazfK0WqZzhHukFsAwAA</XPD:REF>
-<XPD:REF name="Views[1]">QGcntempZkeGNA54l7y1rAAA</XPD:REF>
-<XPD:REF name="Views[2]">pDauXlrgH0KfuJt30X8zxgAA</XPD:REF>
-<XPD:REF name="Views[3]">NKRAWeqgBEKgb6cHnYpt9QAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[26]" type="UMLPackage" guid="YAejusdLDUikLT0VX+S31wAA">
-<XPD:ATTR name="Name" type="string">MW</XPD:ATTR>
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
-<XPD:REF name="Associations[0]">OmNL/SOM7k6GhKEEqGF0RgAA</XPD:REF>
-<XPD:REF name="Associations[1]">j/oong2hbUCcfqfb/9L1PwAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[27]" type="UMLAssociation" guid="vd4u72TMwkKCHYSmzMvXNQAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="OmNL/SOM7k6GhKEEqGF0RgAA">
-<XPD:REF name="Association">vd4u72TMwkKCHYSmzMvXNQAA</XPD:REF>
-<XPD:REF name="Participant">YAejusdLDUikLT0VX+S31wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="0RZNIMepB0W9fkd6pMCEZwAA">
-<XPD:REF name="Association">vd4u72TMwkKCHYSmzMvXNQAA</XPD:REF>
-<XPD:REF name="Participant">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[28]" type="UMLAssociation" guid="n5b/e2YQYka0DNd4RWbgbgAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="j/oong2hbUCcfqfb/9L1PwAA">
-<XPD:REF name="Association">n5b/e2YQYka0DNd4RWbgbgAA</XPD:REF>
-<XPD:REF name="Participant">YAejusdLDUikLT0VX+S31wAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="frvBY5I3t0yZgEqYHUhfEQAA">
-<XPD:REF name="Association">n5b/e2YQYka0DNd4RWbgbgAA</XPD:REF>
-<XPD:REF name="Participant">7dRihysn8kefkb+6mJlwzgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[29]" type="UMLAssociation" guid="7aJQb5j/+kWV9Kb/0dqoJAAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">Q/k+TeR21UWA0JPwiSZAnwAA</XPD:REF>
-<XPD:REF name="Views[1]">C2jwipMyN0iMiEays2pVbQAA</XPD:REF>
-<XPD:REF name="Views[2]">MxF6R3nqrk+nOid9gUoepAAA</XPD:REF>
-<XPD:REF name="Views[3]">5CzND/56UUuAy2C5OXPJGAAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="C7X0ILbZrkWDVQ5Vc+PT/wAA">
-<XPD:REF name="Association">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
-<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">2P5BNH8K/UKYeriBTZAbSgAA</XPD:REF>
-<XPD:REF name="Views[1]">X0Z4arOj+EWceCda6Sj0vgAA</XPD:REF>
-<XPD:REF name="Views[2]">nbxLBw93Oka1PVwDZftA2QAA</XPD:REF>
-<XPD:REF name="Views[3]">lKhOSy40pUOJhnfmNzIx5AAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Dzfwehs+P0e8CyC/holLewAA">
-<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
-<XPD:REF name="Association">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
-<XPD:REF name="Participant">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">VSR1os7RckKbbg+wZ6UPWwAA</XPD:REF>
-<XPD:REF name="Views[1]">3yHNXWsgu0eaPzi0F9a3dgAA</XPD:REF>
-<XPD:REF name="Views[2]">+gO4BIQphEShtlup7FhfcgAA</XPD:REF>
-<XPD:REF name="Views[3]">laRXvwF4WE2wUODF6aCNSQAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[30]" type="UMLAssociation" guid="6r7WWefo1kK4HXJ46+UuHwAA">
-<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">2tALOFJiukSZiwAj9gBDIQAA</XPD:REF>
-<XPD:REF name="Views[1]">BM0ZC/TOp0CzIS/dSFOgMQAA</XPD:REF>
-<XPD:REF name="Views[2]">911s2zFZYUCPtLOmXSDdDgAA</XPD:REF>
-<XPD:REF name="Views[3]">bOeJui9AgkWX+he6KT6czQAA</XPD:REF>
-<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
-<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="+M+2f65R0UCJH6UP90YGAQAA">
-<XPD:REF name="Association">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
-<XPD:REF name="Participant">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">2U407qHmXE+0VHF/y4trXwAA</XPD:REF>
-<XPD:REF name="Views[1]">dAD5Dd+Px0eU/Z7MNaXtWgAA</XPD:REF>
-<XPD:REF name="Views[2]">16BTtqnINEq6DZln/1Uc4AAA</XPD:REF>
-<XPD:REF name="Views[3]">1RtPOXDsOEuSNTqKSxFAKAAA</XPD:REF>
-</XPD:OBJ>
-<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="AM/xtV731kSTTZbv0mmefgAA">
-<XPD:REF name="Association">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
-<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
-<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
-<XPD:REF name="Views[0]">lMa33WFxzU2ojAIXkT9IwAAA</XPD:REF>
-<XPD:REF name="Views[1]">Ehl7/9ciY0mjVGRlJGzTegAA</XPD:REF>
-<XPD:REF name="Views[2]">MAu3FLtcFkOt8a9+Yj8MBAAA</XPD:REF>
-<XPD:REF name="Views[3]">FstmADGG7k2p8GVFXyT/GAAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[3]" type="UMLModel" guid="PS0LMSpdO0O+FHz16P77KAAA">
-<XPD:ATTR name="Name" type="string">Implementation Model</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">implementationModel</XPD:ATTR>
-<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
-<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="OwnedDiagrams[0]" type="UMLComponentDiagram" guid="8lc98jz+106sHki62uo59wAA">
-<XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
-<XPD:REF name="DiagramOwner">PS0LMSpdO0O+FHz16P77KAAA</XPD:REF>
-<XPD:OBJ name="DiagramView" type="UMLComponentDiagramView" guid="0wCA7NA3N0ei/8mtv/tB+gAA">
-<XPD:REF name="Diagram">8lc98jz+106sHki62uo59wAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-<XPD:OBJ name="OwnedElements[4]" type="UMLModel" guid="Br3gILarcEaGGLO+RQTdrAAA">
-<XPD:ATTR name="Name" type="string">Deployment Model</XPD:ATTR>
-<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
-<XPD:ATTR name="StereotypeName" type="string">deploymentModel</XPD:ATTR>
-<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
-<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
-<XPD:OBJ name="OwnedDiagrams[0]" type="UMLDeploymentDiagram" guid="etpVb7W50ECVJjSyvN9PGgAA">
-<XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
-<XPD:REF name="DiagramOwner">Br3gILarcEaGGLO+RQTdrAAA</XPD:REF>
-<XPD:OBJ name="DiagramView" type="UMLDeploymentDiagramView" guid="I2wMY5Xl20qJVJcTZ7SuMgAA">
-<XPD:REF name="Diagram">etpVb7W50ECVJjSyvN9PGgAA</XPD:REF>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:OBJ>
-</XPD:BODY>
-</XPD:PROJECT>
+@return 返回新创建的å‚æ•°</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="sUoQkkeSDUicDjvihzE17wAA">
+<XPD:ATTR name="Name" type="string">setATVAudio</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">修改模拟音频</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="Zp/uaKhNykq6I0DLIqMs6QAA">
+<XPD:ATTR name="Name" type="string">setATVVideoFormat</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">修改模拟视频制å¼</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="W6/Dh7vCMEOK5gCFWgvBuQAA">
+<XPD:ATTR name="Name" type="string">setATVAudioFormat</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string">修改模拟音频制å¼</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[7]" type="UMLOperation" guid="q3e/rtfy+kSDpxAL+JLUAwAA">
+<XPD:ATTR name="Name" type="string">getMode</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[8]" type="UMLOperation" guid="21JdwhpouEyYG3lZnsC7PQAA">
+<XPD:ATTR name="Name" type="string">isDVBMode</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[9]" type="UMLOperation" guid="MCre8DdGnEO6NtacO4PxcwAA">
+<XPD:ATTR name="Name" type="string">getFrequency</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[10]" type="UMLOperation" guid="kb+kpTCHVEKx7jv8aHBGTQAA">
+<XPD:ATTR name="Name" type="string">getAudioMode</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[11]" type="UMLOperation" guid="tYagO7r1C0yRLvAhDROpOQAA">
+<XPD:ATTR name="Name" type="string">getBandwidth</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[12]" type="UMLOperation" guid="ugcb6A9/j02nfYGa/WNK2QAA">
+<XPD:ATTR name="Name" type="string">==</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">Cpp</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">CppOperator</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+<XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="WRmMAQd1vkKgOwOy5hHXbwAA">
+<XPD:ATTR name="Name" type="string">param</XPD:ATTR>
+<XPD:ATTR name="TypeExpression" type="string">CTvChannelParams</XPD:ATTR>
+<XPD:REF name="BehavioralFeature">ugcb6A9/j02nfYGa/WNK2QAA</XPD:REF>
+<XPD:REF name="Type_">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#TypedParameters" type="integer">2</XPD:ATTR>
+<XPD:REF name="TypedParameters[0]">dgzVycSB3EK9p7gNlVzXuAAA</XPD:REF>
+<XPD:REF name="TypedParameters[1]">WRmMAQd1vkKgOwOy5hHXbwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">Dzfwehs+P0e8CyC/holLewAA</XPD:REF>
+<XPD:REF name="Associations[1]">+M+2f65R0UCJH6UP90YGAQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">11</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="vd9GmSHi8kmIG7Uv183sQwAA">
+<XPD:ATTR name="Name" type="string">mode</XPD:ATTR>
+<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="8PpQj0CQ8UaM6aUQTqHY+wAA">
+<XPD:ATTR name="Name" type="string">frequency</XPD:ATTR>
+<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="mixkGHhILEOQrR9Hbe6XtwAA">
+<XPD:ATTR name="Name" type="string">symbolRate</XPD:ATTR>
+<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="2yJw+lrLQE26CKqlL4qTawAA">
+<XPD:ATTR name="Name" type="string">modulation</XPD:ATTR>
+<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="nFx/MMjsyEq2iVvWRpY1pwAA">
+<XPD:ATTR name="Name" type="string">bandwidth</XPD:ATTR>
+<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[5]" type="UMLAttribute" guid="0Zj58ngjk0KvB5ZV2+v12gAA">
+<XPD:ATTR name="Name" type="string">audio</XPD:ATTR>
+<XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkPrivate</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[6]" type="UMLAttribute" guid="1CdqUE68HkCKHC0wHU0OugAA">
+<XPD:ATTR name="Name" type="string">standard</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[7]" type="UMLAttribute" guid="qCoIFqRZckuS8ETuBEJ63gAA">
+<XPD:ATTR name="Name" type="string">afc_data</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[8]" type="UMLAttribute" guid="RXpFXMpRb0G050iBJ169CQAA">
+<XPD:ATTR name="Name" type="string">sat_id</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[9]" type="UMLAttribute" guid="KbUJ3zQudkuMliodZgdwoAAA">
+<XPD:ATTR name="Name" type="string">sat_polarisation</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[10]" type="UMLAttribute" guid="I6rm/D6pekmaDTzLw9FT/wAA">
+<XPD:ATTR name="Name" type="string">Attribute2</XPD:ATTR>
+<XPD:REF name="Owner">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[13]" type="UMLSignal" guid="IK4ie4RbI0mW+299Nj4+3AAA">
+<XPD:ATTR name="Name" type="string">CListen</XPD:ATTR>
+<XPD:ATTR name="Documentation" type="string"> /**正在播放的节目因收看等级ä¸å¤Ÿè¢«åœæ­¢*/
+ public static final int TYPE_PROGRAM_BLOCK = 1;
+ /**正在播放的节目从BLOCK状æ€æ¢å¤*/
+ public static final int TYPE_PROGRAM_UNBLOCK = 2;
+ /**没有信å·*/
+ public static final int TYPE_SIGNAL_LOST = 3;
+ /**ä¿¡å·æ¢å¤*/
+ public static final int TYPE_SIGNAL_RESUME = 4;
+ /**节目数æ®åœæ­¢*/
+ public static final int TYPE_DATA_LOST = 5;
+ /**节目数æ®æ¢å¤*/
+ public static final int TYPE_DATA_RESUME = 6;
+ /**预约æ醒*/
+ public static final int TYPE_BOOKING_REMIND = 7;
+ /**预约开始*/
+ public static final int TYPE_BOOKING_START = 8;
+ /**é…置项被修改*/
+ public static final int TYPE_CONFIG_CHANGED = 9;
+ /**频é“æœç´¢è¿›åº¦*/
+ public static final int TYPE_SCAN_PROGRESS = 10;
+ /**频é“æœç´¢ç»“æŸï¼Œå¼€å§‹å­˜å‚¨ */
+ public static final int TYPE_SCAN_STORE_BEGIN = 11;
+ /**频é“æœç´¢å­˜å‚¨å®Œæ¯•*/
+ public static final int TYPE_SCAN_STORE_END = 12;
+ /**频é“æœç´¢å®Œæˆ*/
+ public static final int TYPE_SCAN_END = 13;
+ /**正在播放节目相关信æ¯æ›´æ–°*/
+ public static final int TYPE_PROGRAM_UPDATE = 14;
+ /**节目开始播放*/
+ public static final int TYPE_PROGRAM_START = 15;
+ /**节目åœæ­¢æ’­æ”¾*/
+ public static final int TYPE_PROGRAM_STOP = 16;
+ /**TV系统时间更新*/
+ public static final int TYPE_TIME_UPDATE = 17;
+ /**事件信æ¯æ›´æ–°*/
+ public static final int TYPE_EVENT_UPDATE = 18;
+ /**输入æºåˆ‡æ¢*/
+ public static final int TYPE_INPUT_SOURCE_CHANGED = 19;
+ /**请求播放节目å·*/
+ public static final int TYPE_PROGRAM_NUMBER = 20;
+ /**录åƒåˆ—表更新*/
+ public static final int TYPE_RECORDS_UPDATE = 21;
+ /**录åƒå†²çª*/
+ public static final int TYPE_RECORD_CONFLICT = 22;
+ /**录åƒå·²ç»“æŸ*/
+ public static final int TYPE_RECORD_END = 23;
+ /**VGAä¿¡å·è°ƒæ•´æˆåŠŸ*/
+ public static final int TYPE_VGA_ADJUST_OK = 24;
+ /**VGAä¿¡å·è°ƒæ•´å¤±è´¥*/
+ public static final int TYPE_VGA_ADJUST_FAILED = 25;
+ /**VGAä¿¡å·è°ƒæ•´ä¸­*/
+ public static final int TYPE_VGA_ADJUST_DOING = 26;
+ /**ä¿¡å·æ”¹å˜*/
+ public static final int TYPE_SIG_CHANGE = 27;
+ /**盲扫进度*/
+ public static final int TYPE_BLINDSCAN_PROGRESS = 28;
+ /**盲扫新Channel*/
+ public static final int TYPE_BLINDSCAN_NEWCHANNEL = 29;
+ /**盲扫结æŸ*/
+ public static final int TYPE_BLINDSCAN_END = 30;
+ /**å«æ˜Ÿè®¾å¤‡LNB与Switché…置生效*/
+ public static final int TYPE_SEC_LNBSSWITCHCFGVALID = 31;
+ /**diseqc马达åœæ­¢è½¬åŠ¨*/
+ public static final int TYPE_SEC_POSITIONERSTOP= 32;
+ /**diseqc马达ç¦æ­¢é™åˆ¶*/
+ public static final int TYPE_SEC_POSITIONERDISABLELIMIT= 33;
+ /**diseqc马达东å‘é™åˆ¶è®¾ç½®*/
+ public static final int TYPE_SEC_POSITIONEREASTLIMIT= 34;
+ /**diseqc马达西å‘é™åˆ¶è®¾ç½®*/
+ public static final int TYPE_SEC_POSITIONERWESTLIMIT= 35;
+ /**diseqc马达东å‘转动*/
+ public static final int TYPE_SEC_POSITIONEREAST= 36;
+ /**diseqc马达西å‘转动*/
+ public static final int TYPE_SEC_POSITIONERWEST= 37;
+ /**diseqc马达存储ä½ç½®*/
+ public static final int TYPE_SEC_POSITIONERSTORE= 38;
+ /**diseqc马达转动到指定ä½ç½®*/
+ public static final int TYPE_SEC_POSITIONERGOTO= 39;
+ /**diseqc马达转动根æ®æœ¬åœ°ç»çº¬åº¦ä»¥åŠå«æ˜Ÿç»åº¦*/
+ public static final int TYPE_SEC_POSITIONERGOTOX= 40;
+ /**切æ¢è‡³æ–°èŠ‚ç›®*/
+ public static final int TYPE_PROGRAM_SWITCH = 41;
+ /**在当å‰é¢‘点æœç´¢DTV频é“*/
+ public static final int TYPE_SCAN_DTV_CHANNEL = 42;
+ /**æ•°æ®åº“导入/导出转æ¢æ“作开始*/
+ public static final int TYPE_TRANSFORM_DB_START = 43;
+ /**æ•°æ®åº“导入/导出转æ¢æ“作完æˆ*/
+ public static final int TYPE_TRANSFORM_DB_END = 44;
+ /**pvr/timeshifting回放开始*/
+ public static final int TYPE_PLAYBACK_START = 45;
+ /**pvr/timeshifting回放结æŸ*/
+ public static final int TYPE_PLAYBACK_STOP = 46;
+ /**节目音视频因被加扰而无法正常播放*/
+ public static final int TYPE_PROGRAM_SCRAMBLED = 47;
+
+
+
+æµçš„å˜åŒ–
+</XPD:ATTR>
+<XPD:REF name="Namespace">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#Associations" type="integer">4</XPD:ATTR>
+<XPD:REF name="Associations[0]">TolxJOTDCkO5nyLC6ipkAwAA</XPD:REF>
+<XPD:REF name="Associations[1]">KeKc5deyJkKjIbzodSAF8QAA</XPD:REF>
+<XPD:REF name="Associations[2]">osliKvkWrU6Jd0FLz/mZngAA</XPD:REF>
+<XPD:REF name="Associations[3]">0WvOUzDyAEKgjZCRSx5J8gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLPackage" guid="ZRumjrTwgUamBDOstkagPgAA">
+<XPD:ATTR name="Name" type="string">atv</XPD:ATTR>
+<XPD:REF name="Namespace">bnJ8ggSchket3/t1l7Kx4wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
+<XPD:REF name="Views[0]">R7RBkUeb+E+5S8gvJN8+QQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">XKFQZaAIH0SxD7YBXgkK0wAA</XPD:REF>
+<XPD:REF name="Associations[1]">nzRPyOcacU2J9Jf/0lCmawAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[23]" type="UMLAssociation" guid="1PikxOdVcU2P6grgcwgRvQAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Z3PDc4i/1UCiaxni9RpD2wAA</XPD:REF>
+<XPD:REF name="Views[1]">mhm++LaJkk6lJzcTz7hSFgAA</XPD:REF>
+<XPD:REF name="Views[2]">IxT95vhnIEyr12fdRQskKQAA</XPD:REF>
+<XPD:REF name="Views[3]">d+KXspkLsEa/YezZSZ7YZAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="AfVgLfyALEyP98guAbYHUAAA">
+<XPD:REF name="Association">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
+<XPD:REF name="Participant">b8JuO/0C0Eq0GnJ0Q/tEWQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">08HUrDXL5EahpEFi9GJ9yQAA</XPD:REF>
+<XPD:REF name="Views[1]">QRLcMMAOqES9/c4itcB3vAAA</XPD:REF>
+<XPD:REF name="Views[2]">mQFH13/vQUucR5en5l/dUwAA</XPD:REF>
+<XPD:REF name="Views[3]">m0oKw9kT5k2CSLEOl9tV+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Fd/cvRV12USE+Vu6oJsMOgAA">
+<XPD:REF name="Association">1PikxOdVcU2P6grgcwgRvQAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">HxD2Y75aWkSp4d/0R6KiBgAA</XPD:REF>
+<XPD:REF name="Views[1]">K5rMwb6Iyka5HDC+pxIZOwAA</XPD:REF>
+<XPD:REF name="Views[2]">GfMJbs1/nkShjuqnA/8BBAAA</XPD:REF>
+<XPD:REF name="Views[3]">jXmYJVpZxkCkrM3yJ0eHmgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[24]" type="UMLAssociation" guid="6uW6VAT+jEG9Vy3cmRxPvgAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="0WvOUzDyAEKgjZCRSx5J8gAA">
+<XPD:REF name="Association">6uW6VAT+jEG9Vy3cmRxPvgAA</XPD:REF>
+<XPD:REF name="Participant">T1P4Xv7L+UuEzFqU+iyS5wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="nzRPyOcacU2J9Jf/0lCmawAA">
+<XPD:REF name="Association">6uW6VAT+jEG9Vy3cmRxPvgAA</XPD:REF>
+<XPD:REF name="Participant">ZRumjrTwgUamBDOstkagPgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[25]" type="UMLAssociation" guid="3PUgTTrP3U+LofrDCso/eAAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">JFsYjMcrU0GkgX8jFqUVZAAA</XPD:REF>
+<XPD:REF name="Views[1]">R57gZgKnBkm8aQCFy90fiQAA</XPD:REF>
+<XPD:REF name="Views[2]">GznyP+sffEKB3m9dw8jftQAA</XPD:REF>
+<XPD:REF name="Views[3]">NM8M6o1EGkWwEmKdXXKpPAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="PP9nsgv4Vkmbk1zEfct4VAAA">
+<XPD:REF name="Association">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
+<XPD:REF name="Participant">xAj1pchzIEeSaRcR2+aFTwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vVViwylf/Ei9ld6xTj7WdQAA</XPD:REF>
+<XPD:REF name="Views[1]">A5rd4V90HkCp3dmD7wYTbwAA</XPD:REF>
+<XPD:REF name="Views[2]">fhSnklGoSEqMAzQOJY57vwAA</XPD:REF>
+<XPD:REF name="Views[3]">n4gqVjygvUK59/wDDHYNJgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="usmo/t5V5UGA31IdVHUKyQAA">
+<XPD:REF name="Association">3PUgTTrP3U+LofrDCso/eAAA</XPD:REF>
+<XPD:REF name="Participant">UiYOh8D78E22qQeFeDZpLAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">AoZLFazfK0WqZzhHukFsAwAA</XPD:REF>
+<XPD:REF name="Views[1]">QGcntempZkeGNA54l7y1rAAA</XPD:REF>
+<XPD:REF name="Views[2]">pDauXlrgH0KfuJt30X8zxgAA</XPD:REF>
+<XPD:REF name="Views[3]">NKRAWeqgBEKgb6cHnYpt9QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[26]" type="UMLPackage" guid="YAejusdLDUikLT0VX+S31wAA">
+<XPD:ATTR name="Name" type="string">MW</XPD:ATTR>
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">OmNL/SOM7k6GhKEEqGF0RgAA</XPD:REF>
+<XPD:REF name="Associations[1]">j/oong2hbUCcfqfb/9L1PwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[27]" type="UMLAssociation" guid="vd4u72TMwkKCHYSmzMvXNQAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="OmNL/SOM7k6GhKEEqGF0RgAA">
+<XPD:REF name="Association">vd4u72TMwkKCHYSmzMvXNQAA</XPD:REF>
+<XPD:REF name="Participant">YAejusdLDUikLT0VX+S31wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="0RZNIMepB0W9fkd6pMCEZwAA">
+<XPD:REF name="Association">vd4u72TMwkKCHYSmzMvXNQAA</XPD:REF>
+<XPD:REF name="Participant">CN6L5smMd0u/4SQDgGuxlAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[28]" type="UMLAssociation" guid="n5b/e2YQYka0DNd4RWbgbgAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="j/oong2hbUCcfqfb/9L1PwAA">
+<XPD:REF name="Association">n5b/e2YQYka0DNd4RWbgbgAA</XPD:REF>
+<XPD:REF name="Participant">YAejusdLDUikLT0VX+S31wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="frvBY5I3t0yZgEqYHUhfEQAA">
+<XPD:REF name="Association">n5b/e2YQYka0DNd4RWbgbgAA</XPD:REF>
+<XPD:REF name="Participant">7dRihysn8kefkb+6mJlwzgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[29]" type="UMLAssociation" guid="7aJQb5j/+kWV9Kb/0dqoJAAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Q/k+TeR21UWA0JPwiSZAnwAA</XPD:REF>
+<XPD:REF name="Views[1]">C2jwipMyN0iMiEays2pVbQAA</XPD:REF>
+<XPD:REF name="Views[2]">MxF6R3nqrk+nOid9gUoepAAA</XPD:REF>
+<XPD:REF name="Views[3]">5CzND/56UUuAy2C5OXPJGAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="C7X0ILbZrkWDVQ5Vc+PT/wAA">
+<XPD:REF name="Association">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
+<XPD:REF name="Participant">JCgv4vk16U6BbVcoQFmlVwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">2P5BNH8K/UKYeriBTZAbSgAA</XPD:REF>
+<XPD:REF name="Views[1]">X0Z4arOj+EWceCda6Sj0vgAA</XPD:REF>
+<XPD:REF name="Views[2]">nbxLBw93Oka1PVwDZftA2QAA</XPD:REF>
+<XPD:REF name="Views[3]">lKhOSy40pUOJhnfmNzIx5AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Dzfwehs+P0e8CyC/holLewAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">7aJQb5j/+kWV9Kb/0dqoJAAA</XPD:REF>
+<XPD:REF name="Participant">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VSR1os7RckKbbg+wZ6UPWwAA</XPD:REF>
+<XPD:REF name="Views[1]">3yHNXWsgu0eaPzi0F9a3dgAA</XPD:REF>
+<XPD:REF name="Views[2]">+gO4BIQphEShtlup7FhfcgAA</XPD:REF>
+<XPD:REF name="Views[3]">laRXvwF4WE2wUODF6aCNSQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[30]" type="UMLAssociation" guid="6r7WWefo1kK4HXJ46+UuHwAA">
+<XPD:REF name="Namespace">dZ4UyetzSE+rDT9vQthF9wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">2tALOFJiukSZiwAj9gBDIQAA</XPD:REF>
+<XPD:REF name="Views[1]">BM0ZC/TOp0CzIS/dSFOgMQAA</XPD:REF>
+<XPD:REF name="Views[2]">911s2zFZYUCPtLOmXSDdDgAA</XPD:REF>
+<XPD:REF name="Views[3]">bOeJui9AgkWX+he6KT6czQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="+M+2f65R0UCJH6UP90YGAQAA">
+<XPD:REF name="Association">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
+<XPD:REF name="Participant">K+kTKNnFak+/Lo9L/RD0ugAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">2U407qHmXE+0VHF/y4trXwAA</XPD:REF>
+<XPD:REF name="Views[1]">dAD5Dd+Px0eU/Z7MNaXtWgAA</XPD:REF>
+<XPD:REF name="Views[2]">16BTtqnINEq6DZln/1Uc4AAA</XPD:REF>
+<XPD:REF name="Views[3]">1RtPOXDsOEuSNTqKSxFAKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="AM/xtV731kSTTZbv0mmefgAA">
+<XPD:REF name="Association">6r7WWefo1kK4HXJ46+UuHwAA</XPD:REF>
+<XPD:REF name="Participant">SX+aNGg0j0WtdR26+LZ7OgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">lMa33WFxzU2ojAIXkT9IwAAA</XPD:REF>
+<XPD:REF name="Views[1]">Ehl7/9ciY0mjVGRlJGzTegAA</XPD:REF>
+<XPD:REF name="Views[2]">MAu3FLtcFkOt8a9+Yj8MBAAA</XPD:REF>
+<XPD:REF name="Views[3]">FstmADGG7k2p8GVFXyT/GAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLModel" guid="PS0LMSpdO0O+FHz16P77KAAA">
+<XPD:ATTR name="Name" type="string">Implementation Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">implementationModel</XPD:ATTR>
+<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLComponentDiagram" guid="8lc98jz+106sHki62uo59wAA">
+<XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
+<XPD:REF name="DiagramOwner">PS0LMSpdO0O+FHz16P77KAAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLComponentDiagramView" guid="0wCA7NA3N0ei/8mtv/tB+gAA">
+<XPD:REF name="Diagram">8lc98jz+106sHki62uo59wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLModel" guid="Br3gILarcEaGGLO+RQTdrAAA">
+<XPD:ATTR name="Name" type="string">Deployment Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">deploymentModel</XPD:ATTR>
+<XPD:REF name="Namespace">CoZuu0bDp0eooW1pQg6aQwAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLDeploymentDiagram" guid="etpVb7W50ECVJjSyvN9PGgAA">
+<XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
+<XPD:REF name="DiagramOwner">Br3gILarcEaGGLO+RQTdrAAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLDeploymentDiagramView" guid="I2wMY5Xl20qJVJcTZ7SuMgAA">
+<XPD:REF name="Diagram">etpVb7W50ECVJjSyvN9PGgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:BODY>
+</XPD:PROJECT>
diff --git a/tvapi/libtv/Android.mk b/tvapi/libtv/Android.mk
index 30aaed3..ae56c3d 100644
--- a/tvapi/libtv/Android.mk
+++ b/tvapi/libtv/Android.mk
@@ -21,7 +21,8 @@ BOARD_TV_AUDIO_AMAUDIO_LIB_TYPE := external
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := \
- tv/AutoBackLight.cpp \
+ tv/CAutoPQparam.cpp \
+ tv/AutoBackLight.cpp \
tv/CTvLog.cpp \
tv/CTvEv.cpp \
tv/CTvEpg.cpp \
@@ -59,11 +60,11 @@ LOCAL_SRC_FILES := \
vpp/CPQdb.cpp \
tvconfig/tvconfig.cpp \
tvconfig/CIniFile.cpp \
- audio/audio_api.cpp \
+ audio/CTvAudio.cpp \
tvsetting/audio_cfg.cpp \
audio/audio_effect.cpp \
audio/audio_alsa.cpp \
- audio/audio_android_effect.cpp \
+ audio/CAudioCustomerCtrl.cpp \
tvsetting/CBlobDevice.cpp \
tvsetting/CBlobDeviceE2prom.cpp \
tvsetting/CBlobDeviceFile.cpp \
@@ -99,7 +100,8 @@ LOCAL_SHARED_LIBRARIES += \
libntsc_decode \
libam_mw \
libam_adp \
- libam_ver
+ libam_ver \
+ libsystemcontrolservice
ifeq ($(strip $(BOARD_TV_AUDIO_AMAUDIO_LIB_TYPE)), external)
LOCAL_SHARED_LIBRARIES += libTVaudio
@@ -186,6 +188,7 @@ LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/tv \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/../build/include \
+ $(TOP)/vendor/amlogic/frameworks/services \
@@ -213,6 +216,7 @@ ifeq ($(strip $(BOARD_TVAPI_NO_VERSION)),)
LOCAL_CFLAGS+=-DTVAPI_BOARD_VERSION=\"$(TVAPI_TARGET_BOARD_VERSION)\"
endif
+LOCAL_CFLAGS += -DTARGET_BOARD_$(strip $(TVAPI_TARGET_BOARD_VERSION))
LOCAL_MODULE:= libtv
include $(BUILD_SHARED_LIBRARY)
diff --git a/tvapi/libtv/audio/CAudioCustomerCtrl.cpp b/tvapi/libtv/audio/CAudioCustomerCtrl.cpp
new file mode 100644
index 0000000..2f6edf0
--- a/dev/null
+++ b/tvapi/libtv/audio/CAudioCustomerCtrl.cpp
@@ -0,0 +1,126 @@
+#include "CAudioCustomerCtrl.h"
+#include <dlfcn.h>
+#include "CTvLog.h"
+#include "tvsetting/audio_cfg.h"
+
+CAudioCustomerCtrl::CAudioCustomerCtrl()
+{
+ gExternalDacLibHandler = NULL;
+ mpDacMuteFun = NULL;
+ mpDacMainVolFun = NULL;
+ mpDacBalanceFun = NULL;
+ mpSetSourceTypeFun = NULL;
+}
+
+CAudioCustomerCtrl::~CAudioCustomerCtrl()
+{
+ UnLoadExternalDacLib();
+}
+
+int CAudioCustomerCtrl::UnLoadExternalDacLib(void)
+{
+ if (gExternalDacLibHandler != NULL) {
+ dlclose(gExternalDacLibHandler);
+ gExternalDacLibHandler = NULL;
+ }
+
+ mpDacMuteFun = NULL;
+ mpDacMainVolFun = NULL;
+ mpDacBalanceFun = NULL;
+ mpSetSourceTypeFun = NULL;
+
+ return 0;
+}
+
+int CAudioCustomerCtrl::LoadExternalDacLib(void)
+{
+ char *error;
+
+ LOGD("%s, entering...\n", __FUNCTION__);
+
+ if (gExternalDacLibHandler != NULL) {
+ return 0;
+ }
+
+ const char *config_value = GetAudExtDacLibPath();
+ gExternalDacLibHandler = dlopen(config_value, RTLD_NOW);
+ if (!gExternalDacLibHandler) {
+ LOGE("%s, failed to load external dac lib (%s)\n", __FUNCTION__, config_value);
+ goto Error;
+ }
+
+ mpDacMuteFun = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleDacMute");
+ if (mpDacMuteFun == NULL) {
+ LOGE("%s, fail find fun mpDacMuteFun()\n", __FUNCTION__);
+ goto Error;
+ }
+ mpDacMainVolFun = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleDacMainVolume");
+ if (mpDacMainVolFun == NULL) {
+ LOGE("%s, fail find fun HandleDacMainVolume()\n", __FUNCTION__);
+ goto Error;
+ }
+ mpDacBalanceFun = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleDacBalance");
+ if (mpDacBalanceFun == NULL) {
+ LOGE("%s, fail find fun HandleDacBalance()\n", __FUNCTION__);
+ goto Error;
+ }
+ mpSetSourceTypeFun = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleAudioSourceType");
+ if (mpSetSourceTypeFun == NULL) {
+ LOGE("%s, fail find fun HandleAudioSourceType()\n", __FUNCTION__);
+ goto Error;
+ }
+
+ return 0;
+
+Error: //
+ mpDacMuteFun = NULL;
+ mpDacMainVolFun = NULL;
+ mpDacBalanceFun = NULL;
+ mpSetSourceTypeFun = NULL;
+
+ if (gExternalDacLibHandler != NULL) {
+ dlclose(gExternalDacLibHandler);
+ gExternalDacLibHandler = NULL;
+ }
+ return -1;
+}
+
+// 0 mute, 1 unmute
+int CAudioCustomerCtrl::SetMute(int mute)
+{
+ int ret = LoadExternalDacLib();
+ if (mpDacMuteFun != NULL) {
+ ret = (*mpDacMuteFun)(mute);
+ }
+ return ret;
+}
+
+int CAudioCustomerCtrl::SetVolumeBar(int vol)
+{
+ int ret = LoadExternalDacLib();
+ if (mpDacMainVolFun != NULL) {
+ LOGD("%s, call external dac lib HandleDacMainVolume (para = %d).\n", __FUNCTION__, vol);
+ ret = (*mpDacMainVolFun)(vol);
+ }
+ return ret;
+}
+
+int CAudioCustomerCtrl::SetBlance(int balance)
+{
+ int ret = LoadExternalDacLib();
+ if (mpDacBalanceFun != NULL) {
+ LOGD("%s, call external dac lib HandleDacBalance (para = %d).\n", __FUNCTION__, balance);
+ ret = (*mpDacBalanceFun)(balance);
+ }
+ return ret;
+}
+
+int CAudioCustomerCtrl::SetSource(int source)
+{
+ int ret = LoadExternalDacLib();
+ if (mpSetSourceTypeFun != NULL) {
+ LOGD("%s, call external dac lib HandleAudioSourceType (para = %d).\n", __FUNCTION__, source);
+ ret = (*mpSetSourceTypeFun)(source);
+ }
+ return ret;
+}
diff --git a/tvapi/libtv/audio/CAudioCustomerCtrl.h b/tvapi/libtv/audio/CAudioCustomerCtrl.h
new file mode 100644
index 0000000..dc98889
--- a/dev/null
+++ b/tvapi/libtv/audio/CAudioCustomerCtrl.h
@@ -0,0 +1,31 @@
+#ifndef __AUDIO_CUSTOMER_CTRL_H__
+#define __AUDIO_CUSTOMER_CTRL_H__
+
+typedef int (*TYPE_DacMute_FUN)(int mute_state);
+typedef int (*TYPE_DacMainVolume_FUN)(int vol);
+typedef int (*TYPE_DacBalance_FUN)(int balance_val);
+typedef int (*TYPE_AudioSourceType_FUN)(int source_type);
+
+class CAudioCustomerCtrl {
+public:
+ static const int MUTE = 0;
+ static const int UNMUTE = 1;
+
+ CAudioCustomerCtrl();
+ ~CAudioCustomerCtrl();
+ int LoadExternalDacLib(void);
+ int UnLoadExternalDacLib(void);
+ int SendCmdToOffBoardCustomerLibExternalDac(int, int);
+ int SetMute(int mute);
+ int SetVolumeBar(int vol);
+ int SetBlance(int balance);
+ int SetSource(int source);
+
+private:
+ void *gExternalDacLibHandler;
+ TYPE_DacMute_FUN mpDacMuteFun;
+ TYPE_DacMainVolume_FUN mpDacMainVolFun;
+ TYPE_DacBalance_FUN mpDacBalanceFun;
+ TYPE_AudioSourceType_FUN mpSetSourceTypeFun;
+};
+#endif
diff --git a/tvapi/libtv/audio/CTvAudio.cpp b/tvapi/libtv/audio/CTvAudio.cpp
new file mode 100644
index 0000000..ac3d594
--- a/dev/null
+++ b/tvapi/libtv/audio/CTvAudio.cpp
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <fcntl.h>
+
+#include <android/log.h>
+#include <cutils/properties.h>
+
+#include "../tvsetting/CTvSetting.h"
+#include "../tvutils/tvutils.h"
+#include "../tvutils/CFile.h"
+#include "audio_effect.h"
+#include "CTvAudio.h"
+
+#include <xxxconfig.h>
+
+#define LOG_TAG "CTvAudio"
+#include "CTvLog.h"
+
+CTvAudio::CTvAudio()
+{
+
+}
+
+CTvAudio::~CTvAudio()
+{
+
+}
diff --git a/tvapi/libtv/audio/CTvAudio.h b/tvapi/libtv/audio/CTvAudio.h
new file mode 100644
index 0000000..50ccfec
--- a/dev/null
+++ b/tvapi/libtv/audio/CTvAudio.h
@@ -0,0 +1,76 @@
+#ifndef __TV_AUDIO_API_H__
+#define __TV_AUDIO_API_H__
+
+
+#include "tvsetting/audio_cfg.h"
+#include "audio_alsa.h"
+#include "audio_effect.h"
+#include <audio_amaudio.h>
+#include "CAudioCustomerCtrl.h"
+
+enum CC_AUDIO_SWITCH_STATUS {
+ CC_SWITCH_OFF,
+ CC_SWITCH_ON,
+};
+
+enum CC_AMAUDIO_OUT_MODE {
+ CC_AMAUDIO_OUT_MODE_DIRECT,
+ CC_AMAUDIO_OUT_MODE_INTER_MIX,
+ CC_AMAUDIO_OUT_MODE_DIRECT_MIX,
+};
+
+static const int CC_SPDIF_MODE_PCM = 0;
+static const int CC_SPDIF_MODE_RAW = 1;
+
+static const int CC_MIN_SOUND_VOL = 0;
+static const int CC_MAX_SOUND_VOL = 100;
+static const int CC_DEF_SOUND_VOL = 10;
+static const int CC_MIN_SUPPERBASS_VOL = 0;
+static const int CC_MAX_SUPPERBASS_VOL = 100;
+static const int CC_DEF_SUPPERBASS_VOL = 50;
+
+static const int CC_DEF_BASS_TREBLE_VOL = 50;
+static const int CC_EQ_BASS_IND = 1;
+static const int CC_EQ_TREBLE_IND = 3;
+static const int CC_EQ_DEF_UI_MIN_GAIN = 0;
+static const int CC_EQ_DEF_UI_MAX_GAIN = 100;
+static const int CC_MIN_EQ_GAIN_VAL = -10;
+static const int CC_MAX_EQ_GAIN_VAL = 10;
+
+static const int CC_LUT_BUF_MASTER = 0;
+static const int CC_LUT_BUF_SUPPERBASS = 1;
+static const int CC_LUT_BUF_SIZE = 101;
+static const int CC_NO_LINE_POINTS_MAX_CNT = 101;
+
+
+enum CC_AUD_SOUND_MODE {
+ CC_SOUND_MODE_START = 0,
+ CC_SOUND_MODE_STD = 0,
+ CC_SOUND_MODE_MUSIC,
+ CC_SOUND_MODE_NEWS,
+ CC_SOUND_MODE_THEATER,
+ CC_SOUND_MODE_USER,
+ CC_SOUND_MODE_END = CC_SOUND_MODE_USER
+};
+
+enum CC_AUD_EQ_MODE {
+ CC_EQ_MODE_START = 0,
+ CC_EQ_MODE_NOMAL = 0,
+ CC_EQ_MODE_POP,
+ CC_EQ_MODE_JAZZ,
+ CC_EQ_MODE_ROCK,
+ CC_EQ_MODE_CLASSIC,
+ CC_EQ_MODE_DANCE,
+ CC_EQ_MODE_PARTY,
+ CC_EQ_MODE_BASS,
+ CC_EQ_MODE_TREBLE,
+ CC_EQ_MODE_CUSTOM,
+ CC_EQ_MODE_END = CC_EQ_MODE_CUSTOM
+};
+
+class CTvAudio {
+public:
+ CTvAudio();
+ ~CTvAudio();
+};
+#endif //__TV_AUDIO_API_H__
diff --git a/tvapi/libtv/audio/audio_alsa.cpp b/tvapi/libtv/audio/audio_alsa.cpp
index 84ce046..1a65ef9 100644
--- a/tvapi/libtv/audio/audio_alsa.cpp
+++ b/tvapi/libtv/audio/audio_alsa.cpp
@@ -1,1213 +1,860 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
-#include <pthread.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <math.h>
-#include <errno.h>
-#include <assert.h>
-#include <fcntl.h>
-#include <dlfcn.h>
-#include <tinyalsa/asoundlib.h>
-#include "CFbcCommunication.h"
-#include <sys/poll.h>
-#include <android/log.h>
-#include "tvsetting/audio_cfg.h"
-#include "audio_alsa.h"
-#include <cutils/properties.h>
-#define LOG_TAG "CAudioAlsa"
-#include "CTvLog.h"
-#include "audio_amaudio.h"
-
-static const int MainDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE] = {
- //
- 0, 40, 50, 60, 70, 87, 110, 120, 130, 140, // 0~9
- 150, 152, 155, 158, 161, 164, 167, 170, 173, 174, // 10~19
- 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, // 20~29
- 191, 191, 192, 193, 194, 195, 196, 196, 197, 197, // 30~39
- 198, 198, 198, 199, 199, 200, 200, 201, 201, 201, // 40~49
- 202, 202, 202, 203, 203, 203, 203, 204, 204, 204, // 50~59
- 205, 205, 205, 205, 206, 206, 206, 206, 206, 207, // 60~69
- 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, // 70~79
- 208, 208, 208, 208, 208, 208, 208, 208, 208, 209, // 80~89
- 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, // 90~99
- 209, // 100
-};
-
-static const int SupperBassDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE] = {
- //
- 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, // 0~9
- 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, // 10~19
- 141, 142, 143, 144, 145, 147, 147, 148, 148, 149, // 20~29
- 149, 150, 150, 151, 151, 152, 152, 153, 153, 154, // 30~39
- 154, 155, 155, 156, 156, 157, 157, 158, 158, 159, // 40~49
- 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, // 50~59
- 162, 163, 163, 163, 163, 164, 164, 164, 165, 165, // 60~69
- 165, 165, 166, 166, 166, 167, 168, 169, 170, 171, // 70~79
- 173, 174, 175, 176, 177, 179, 180, 181, 182, 183, // 80~89
- 185, 186, 187, 188, 189, 191, 192, 193, 194, 195, // 90~99
- 197 // 100
-};
-
-CAudioAlsa::CAudioAlsa()
-{
- int card_id;
- card_id = get_aml_card();
- LOGD("[%s:%d] card_id:%d\n", __FUNCTION__, __LINE__, card_id);
- mpMixer = mixer_open(card_id);
-
- card_id = get_USB_Audio_card();
- LOGD("[%s:%d] card_id:%d\n", __FUNCTION__, __LINE__, card_id);
- mpUsbMixer = mixer_open(card_id);
- mMainVolumeBalanceVal = 0;
- mMainVolumeGainVal = 0;
- mSupperBassVolumeGainVal = 0;
- memcpy(mMainDigitLutBuf, MainDigitLutBuf, CC_VOL_TRANS_LUT_BUF_SIZE);
- memcpy(mSupperBassDigitLutBuf, SupperBassDigitLutBuf, CC_VOL_TRANS_LUT_BUF_SIZE);
-}
-
-CAudioAlsa::~CAudioAlsa()
-{
- if (NULL != mpMixer) {
- mixer_close(mpMixer);
- }
-
- if (NULL != mpUsbMixer) {
- mixer_close(mpUsbMixer);
- }
-}
-
-int CAudioAlsa::get_aml_card()
-{
- int card = -1, err = 0;
- int fd = -1;
- char read_buf[512], *pd = NULL;
- static const char *const SOUND_CARDS_PATH = "/proc/asound/cards";
- fd = open(SOUND_CARDS_PATH, O_RDONLY);
- if (fd < 0) {
- ALOGE("ERROR: failed to open config file %s error: %d\n", SOUND_CARDS_PATH, errno);
- close(fd);
- return -EINVAL;
- }
- memset(read_buf, 0x0, 512);
- err = read(fd, read_buf, 512);
- if (fd < 0) {
- ALOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno);
- close(fd);
- return -EINVAL;
- }
- pd = strstr(read_buf, "AML");
- card = *(pd - 3) - '0';
- close(fd);
- return card;
-}
-
-int CAudioAlsa::AudioControlSetValue(int val_count, int data_buf[], char *match_names)
-{
- struct mixer_ctl *pctl;
- unsigned int expected_val_count;
- unsigned int value_index;
-
- if (NULL == mpMixer) {
- LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__);
- goto err_exit;
- }
-
- pctl = mixer_get_ctl_by_name(mpMixer, match_names);
- if (NULL == pctl) {
- LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names);
- goto err_exit;
- }
- expected_val_count = mixer_ctl_get_num_values(pctl);
- if (expected_val_count != (unsigned int)val_count) {
- LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__);
- goto err_exit;
- }
- for (value_index = 0; value_index < expected_val_count; value_index++) {
- if (mixer_ctl_set_value(pctl, value_index, data_buf[value_index]) != 0) {
- LOGE("[%s:%d] Failed to set value:%d\n", __FUNCTION__, __LINE__, value_index);
- goto err_exit;
- }
- }
- return 0;
-err_exit:
- return -1;
-}
-
-int CAudioAlsa::AudioControlGetValue(int val_count, int ret_buf[], char *match_names)
-{
- struct mixer_ctl *pctl;
- unsigned int expected_val_count;
- unsigned int value_index;
-
- if (NULL == mpMixer) {
- LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__);
- goto err_exit;
- }
- pctl = mixer_get_ctl_by_name(mpMixer, match_names);
- if (NULL == pctl) {
- LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names);
- goto err_exit;
- }
- expected_val_count = mixer_ctl_get_num_values(pctl);
- if (expected_val_count != (unsigned int)val_count) {
- LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__);
- goto err_exit;
- }
- for (value_index = 0; value_index < expected_val_count; value_index++) {
- ret_buf[value_index] = mixer_ctl_get_value(pctl, value_index);
- }
- return 0;
-err_exit:
- return -1;
-}
-
-int CAudioAlsa::get_USB_Audio_card()
-{
- int card = -1, err = 0;
- int fd = -1;
- char read_buf[512], *pd = NULL;
- static const char *const SOUND_CARDS_PATH = "/proc/asound/cards";
- fd = open(SOUND_CARDS_PATH, O_RDONLY);
- if (fd < 0) {
- ALOGE("ERROR: failed to open config file %s error: %d\n", SOUND_CARDS_PATH, errno);
- close(fd);
- return -EINVAL;
- }
- memset(read_buf, 0x0, 512);
- err = read(fd, read_buf, 512);
- if (fd < 0) {
- ALOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno);
- close(fd);
- return -EINVAL;
- }
- pd = strstr(read_buf, "Receiver");
- if (pd == NULL) {
- ALOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno);
- close(fd);
- return -EINVAL;
- }
-
- card = *(pd - 3) - '0';
- close(fd);
- return card;
-}
-
-int CAudioAlsa::HandleUSBAudioControlValue(int val_count, int data_buf[], int match_count, char **match_names)
-{
-
- struct mixer_ctl *pctl;
- unsigned int expected_val_count;
- unsigned int match_index;
- unsigned int value_index;
- char card_id_str[9] = {0};
-
- if (NULL == mpUsbMixer) {
- LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__);
- goto err_exit;
- }
-
- for (match_index = 0; match_index < match_count; match_index++) {
- pctl = mixer_get_ctl_by_name(mpUsbMixer, match_names[match_index]);
- if (NULL == pctl) {
- LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names[match_index]);
- goto err_exit;
- }
- expected_val_count = mixer_ctl_get_num_values(pctl);
- if (expected_val_count != (unsigned int)val_count) {
- LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__);
- goto err_exit;
- }
- for (value_index = 0; value_index < expected_val_count; value_index++) {
- if (mixer_ctl_set_value(pctl, value_index, data_buf[value_index]) != 0) {
- LOGE("[%s:%d] Failed to set value:%d\n", __FUNCTION__, __LINE__, value_index);
- goto err_exit;
- }
- }
- }
-
- return 0;
-err_exit:
- return -1;
-}
-
-int CAudioAlsa::CheckVolume(int digit_vol, int digit_min, int digit_max, int hd_min,
- int hd_max)
-{
- int tmp_val = digit_vol;
-
- if (digit_vol < hd_min) {
- return hd_min;
- } else if (digit_vol > hd_max) {
- return hd_max;
- }
-
- return digit_vol;
-}
-
-int CAudioAlsa::GetTwoChannelVolume(int vol_buf[], int l_min_vol, int l_max_vol,
- int r_min_vol, int r_max_vol, char *match_names, int hd_min,
- int hd_max)
-{
- vol_buf[0] = 0;
- vol_buf[1] = 0;
- return AudioControlGetValue(2, vol_buf, match_names);
-}
-
-int CAudioAlsa::GetLineInMaxVol()
-{
- if (GetAudioArchitectureTypeCFG() == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) {
- return 84;
- }
-
- return 127;
-}
-
-int CAudioAlsa::GetLineOutMaxVol()
-{
- if (GetAudioArchitectureTypeCFG() == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) {
- return 84;
- }
-
- return 255;
-}
-
-#define CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME (0)
-#define CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME (1)
-#define CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME (2)
-#define CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME (3)
-#define CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME (4)
-#define CC_GET_ALSA_CTL_I2S_MUTE_NAME (5)
-#define CC_GET_ALSA_CTL_SPDIF_MUTE_NAME (6)
-#define CC_GET_ALSA_CTL_HW_RESAMPLE_NAME (7)
-#define CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME (8)
-#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME (9)
-#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME (10)
-#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME (11)
-#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME (12)
-#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME (13)
-#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME (14)
-#define CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME (15)
-#define CC_GET_ALSA_CTL_PCM_PLAYBACK_VOLUME (16)
-#define CC_GET_ALSA_CTL_PCM_PLAYBACK_SWITCH (17)
-#define CC_GET_ALSA_CTL_SETOUTPUT_SWAP (18)
-#define CC_GET_ALSA_CTL_AUDIO_IN_SWITCH (19)
-
-static char gG9AlsaNames[32][48] = {
- {"Audio In Source"},//0
- {"Linein right switch"},//1
- {"Linein left switch"},
- {"ADC Digital Capture Volume"},
- {"DAC Digital Playback Volume"},
- {"Audio i2s mute"},//5
- {"Audio spdif mute"},
- {"Hardware resample enable"},//8
- {"AMP Master Volume"},
- {"AMP Ch1 Volume"},//10
- {"AMP Ch2 Volume"},
- {"AMP Ch3 Volume"},
- {"AMP Ch1 Switch"},
- {"AMP Ch2 Switch"},
- {"AMP Ch3 Switch"},//15
- {"AMP EQ Mode"},
- {"PCM Playback Volume"},
- {"PCM Playback Switch"},
- {"Output Swap"},
- {"AudioIn Switch"},//19
-};
-
-
-char *CAudioAlsa::GetAlsaControlName(int get_type)
-{
- if (GetAudioArchitectureTypeCFG() == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) {
- /*if(get_type == CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME) {
- return gAudioInSourceNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME) {
- strcpy(gInternalDacLeftLineInSelNameBuf, "Left LINEIN Select");
- return gInternalDacLeftLineInSelNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME) {
- strcpy(gInternalDacRightLineInSelNameBuf, "Right LINEIN Select");
- return gInternalDacRightLineInSelNameBuf;
- } else if (get_type == CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME) {
- strcpy(gInternalDacLineInCaptureVolumeNameBuf, "LINEIN Capture Volume");
- return gInternalDacLineInCaptureVolumeNameBuf;
- } else if (get_type == CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME) {
- strcpy(gInternalDacLineOutCaptureVolumeNameBuf, "LINEOUT Playback Volume");
- return gInternalDacLineOutCaptureVolumeNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_I2S_MUTE_NAME) {
- strcpy(gI2SMuteNameBuf, "Audio i2s mute");
- return gI2SMuteNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_SPDIF_MUTE_NAME) {
- strcpy(gSpdifMuteNameBuf, "Audio spdif mute");
- return gSpdifMuteNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_HW_RESAMPLE_NAME) {
- strcpy(gHWResampleNameBuf, "Hardware resample enable");
- return gHWResampleNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME) {
- strcpy(gExternalDacMasterVolumeNameBuf, "AMP Master Volume");
- return gExternalDacMasterVolumeNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME) {
- strcpy(gExternalDacCh1VolumeNameBuf, "AMP Ch1 Volume");
- return gExternalDacCh1VolumeNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME) {
- strcpy(gExternalDacCh2VolumeNameBuf, "AMP Ch2 Volume");
- return gExternalDacCh2VolumeNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME) {
- strcpy(gExternalDacCh3VolumeNameBuf, "AMP Ch3 Volume");
- return gExternalDacCh3VolumeNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME) {
- strcpy(gExternalDacCh1SwitchNameBuf, "AMP Ch1 Switch");
- return gExternalDacCh1SwitchNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME) {
- strcpy(gExternalDacCh2SwitchNameBuf, "AMP Ch2 Switch");
- return gExternalDacCh2SwitchNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME) {
- strcpy(gExternalDacCh3SwitchNameBuf, "AMP Ch3 Switch");
- return gExternalDacCh3SwitchNameBuf;
- } else if(get_type == CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME) {
- strcpy(gExternalDacEQModeNameBuf, "AMP EQ Mode");
- return gExternalDacEQModeNameBuf;
- }*/
- } else {
- return gG9AlsaNames[get_type];
- }
-
- return NULL;
-}
-
-int gAudioInSource = -1;
-
-int CAudioAlsa::SetAudioInSource(int source_type)
-{
- int set_val = 0;
- char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME);
-
- if (GetAudioArchitectureTypeCFG() == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) {
- if (source_type != 0 && source_type != 1) {
- return -1;
- }
-
- if (source_type == CC_AUDIO_IN_SOURCE_LINEIN) {
- set_val = 0;
- } else if (source_type == CC_AUDIO_IN_SOURCE_HDMI) {
- set_val = 1;
- }
- } else {
- if (source_type != 0 && source_type != 1 && source_type != 2) {
- return -1;
- }
-
- set_val = source_type;
- }
-
- gAudioInSource = set_val;
-
- return AudioControlSetValue(1, &set_val, match_names);
-}
-
-int CAudioAlsa::GetAudioInSource(void)
-{
- char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME);
- int source_type = 0;
-
- source_type = gAudioInSource;
- if (source_type == -1) {
- AudioControlGetValue(1, &source_type, match_names);
- }
-
- return source_type;
-}
-
-int CAudioAlsa::SetInternalDacLineInSelectChannel(int line_in_number)
-{
- int tmp_ret = 0;
- char *match_names = NULL;
-
- if (line_in_number < 0 || line_in_number > 7) {
- return -1;
- }
-
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME);
- tmp_ret |= AudioControlSetValue(1, &line_in_number, match_names);
-
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME);
- tmp_ret |= AudioControlSetValue(1, &line_in_number, match_names);
-
- return tmp_ret;
-}
-
-int CAudioAlsa::SetInternalDacLineInCaptureVolume(int l_vol, int r_vol)
-{
- int max_val = GetLineInMaxVol();
- char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME);
- int VolumeBuf[2];
-
- VolumeBuf[0] = CheckVolume(l_vol, 0, max_val, 0, max_val);
- VolumeBuf[1] = CheckVolume(r_vol, 0, max_val, 0, max_val);
-
- return AudioControlSetValue(2, VolumeBuf, match_names);
-}
-
-int CAudioAlsa::GetInternalDacLineInCaptureVolume(int vol_buf[])
-{
- int max_val = GetLineInMaxVol();
- char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME);
-
- return GetTwoChannelVolume(vol_buf, 0, max_val, 0, max_val, match_names, 0, max_val);
-}
-
-int CAudioAlsa::SetInternalDacLineOutPlayBackVolume(int l_vol, int r_vol)
-{
- int max_val = GetLineOutMaxVol();
- char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME);
- int VolumeBuf[2];
-
- VolumeBuf[0] = CheckVolume(l_vol, 0, max_val, 0, max_val);
- VolumeBuf[1] = CheckVolume(r_vol, 0, max_val, 0, max_val);
-
- return AudioControlSetValue(2, VolumeBuf, match_names);
-}
-
-int CAudioAlsa::GetInternalDacLineOutPlayBackVolume(int vol_buf[])
-{
- int max_val = GetLineOutMaxVol();
- char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME);
-
- return GetTwoChannelVolume(vol_buf, 0, max_val, 0, max_val, match_names, 0, max_val);
-}
-
-int CAudioAlsa::SetAudioPcmPlaybackVolume(int vol)
-{
- if(get_USB_Audio_card() == -EINVAL) return 0;
- char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_PCM_PLAYBACK_VOLUME);
- return HandleUSBAudioControlValue(1, &vol, 1, &match_names);
-}
-
-int CAudioAlsa::SetAudioPcmPlaybackSwitch(int vol)
-{
- if(get_USB_Audio_card() == -EINVAL) return 0;
- char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_PCM_PLAYBACK_SWITCH);
- return HandleUSBAudioControlValue(1, &vol, 1, &match_names);
-}
-
-int CAudioAlsa::SetExternalDacChannelSwitch(int chan_ind, int switch_val)
-{
- char *match_names = NULL;
-
- if (chan_ind == 1) {
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME);
- } else if (chan_ind == 2) {
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME);
- } else if (chan_ind == 3) {
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME);
- } else {
- return -1;
- }
-
- return AudioControlSetValue(1, &switch_val, match_names);
-}
-
-int CAudioAlsa::SetExternalDacChannelVolume(int chan_ind, int main_vol)
-{
- int tmp_ret = 0;
- char *match_names = NULL;
-
- if (chan_ind == 0) {
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME);
- } else if (chan_ind == 1) {
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME);
- } else if (chan_ind == 2) {
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME);
- } else if (chan_ind == 3) {
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME);
- } else {
- return -1;
- }
-
- return AudioControlSetValue(1, &main_vol, match_names);
-}
-int CAudioAlsa::SetAudioSwitchIO(int value)
-{
- char *match_names = gG9AlsaNames[CC_GET_ALSA_CTL_AUDIO_IN_SWITCH];
-
- return AudioControlSetValue(1, &value, match_names);
-}
-int CAudioAlsa::SetOutput_Swap(int value)
-{
- char *match_names = gG9AlsaNames[CC_GET_ALSA_CTL_SETOUTPUT_SWAP];
-
- return AudioControlSetValue(1, &value, match_names);
-}
-
-int CAudioAlsa::SetExternalDacEQMode(int mode_val)
-{
- char *match_names = NULL;
-
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME);
- return AudioControlSetValue(1, &mode_val, match_names);
-}
-
-int CAudioAlsa::SetI2SMute(int mute_status)
-{
- char *match_names = NULL;
-
- if (mute_status != CC_I2S_MUTE_ON && mute_status != CC_I2S_MUTE_OFF) {
- LOGE("%s, I2S mute value (%d) error!\n", __FUNCTION__, mute_status);
- return -1;
- }
-
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_I2S_MUTE_NAME);
- return AudioControlSetValue(1, &mute_status, match_names);
-}
-
-int CAudioAlsa::SetSPDIFMute(int mute_status)
-{
- char *match_names = NULL;
-
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_SPDIF_MUTE_NAME);
- return AudioControlSetValue(1, &mute_status, match_names);
-}
-
-#define CC_SAMPLE_BUF_SIZE (32)
-
-enum CC_HW_RESAMPLE_TYPE {
- CC_HW_RESAMPLE_DISABLE,
- CC_HW_RESAMPLE_48K,
- CC_HW_RESAMPLE_44K,
- CC_HW_RESAMPLE_32K,
-};
-
-int CAudioAlsa::SetHardwareResample(int sr)
-{
- int i = 0, set_val = 0, tmp_val = 0;
- int diff_val = 0x7FFFFFFF, diff_ind = -1;
- char *match_names = NULL;
- int sample_buf[CC_SAMPLE_BUF_SIZE] = {48000, 44000, 32000, -1};
-
- if (sr < 0) {
- set_val = 0;
- } else {
- for (i = 0; i < CC_SAMPLE_BUF_SIZE; i++) {
- if (sample_buf[i] < 0) {
- break;
- }
-
- if (sample_buf[i] >= sr) {
- tmp_val = sample_buf[i] - sr;
- } else {
- tmp_val = sr - sample_buf[i];
- }
-
- if (tmp_val <= diff_val) {
- diff_val = tmp_val;
- diff_ind = i;
- }
- }
-
- if (diff_ind < 0) {
- set_val = 0;
- } else {
- set_val = diff_ind + 1;
- }
- }
-
- LOGD("%s, set_val = %d.\n", __FUNCTION__, set_val);
- match_names = GetAlsaControlName(CC_GET_ALSA_CTL_HW_RESAMPLE_NAME);
- return AudioControlSetValue(1, &set_val, match_names);
-}
-
-int CAudioAlsa::SetMixerBypassSwitch(int switch_val)
-{
- char match_names[48] = "Output Mixer Bypass Switch" ;
- int ctl_buf[2];
-
- if (switch_val != 0 && switch_val != 1) {
- return -1;
- }
-
- ctl_buf[0] = switch_val;
- ctl_buf[1] = switch_val;
-
- return AudioControlSetValue(2, ctl_buf, match_names);
-}
-
-int CAudioAlsa::GetMixerBypassSwitch(void)
-{
- char match_names[48] = "Output Mixer Bypass Switch" ;
- int ctl_buf[2];
-
- AudioControlSetValue(2, ctl_buf, match_names);
-
- return ctl_buf[0];
-}
-
-int CAudioAlsa::SetMixerDacSwitch(int switch_val)
-{
- char match_names[48] = "Output Mixer DAC Switch" ;
- int ctl_buf[2];
-
- if (switch_val != 0 && switch_val != 1) {
- return -1;
- }
-
- ctl_buf[0] = switch_val;
- ctl_buf[1] = switch_val;
-
- return AudioControlSetValue(2, ctl_buf, match_names);
-}
-
-int CAudioAlsa::GetMixerDacSwitch(void)
-{
- char *match_names = "Output Mixer DAC Switch" ;
- int ctl_buf[2];
-
- AudioControlGetValue(2, ctl_buf, match_names);
-
- return ctl_buf[0];
-}
-
-int CAudioAlsa::TransVolumeBarVolToDigitalVol(int digit_lut_buf[], int digit_vol,
- int digit_min, int digit_max, int hd_min, int hd_max)
-{
- if (digit_vol >= CC_VOL_TRANS_LUT_BUF_SIZE) {
- return digit_lut_buf[CC_VOL_TRANS_LUT_BUF_SIZE - 1];
- } else if (digit_vol < 0) {
- return digit_lut_buf[CC_VOL_TRANS_LUT_BUF_SIZE - 1];
- }
-
- return digit_lut_buf[digit_vol];
-}
-
-int CAudioAlsa::TransDigitalVolToVolumeBarVol(int digit_lut_buf[], int hd_vol, int hd_min,
- int hd_max, int digit_min, int digit_max)
-{
- int i;
-
- for (i = 0; i < CC_VOL_TRANS_LUT_BUF_SIZE; i++) {
- if (digit_lut_buf[i] == hd_vol)
- break;
- }
-
- if (i < CC_VOL_TRANS_LUT_BUF_SIZE)
- return i;
-
- for (i = 0; i < CC_VOL_TRANS_LUT_BUF_SIZE - 1; i++) {
- if (digit_lut_buf[i] > hd_vol && digit_lut_buf[i + 1] < hd_vol)
- break;
- }
-
- if (i < CC_VOL_TRANS_LUT_BUF_SIZE - 1)
- return i;
-
- return digit_max;
-}
-
-void CAudioAlsa::SetMainVolDigitLutBuf(int digit_lut_buf[])
-{
- memcpy((void *) mMainDigitLutBuf, digit_lut_buf,
- CC_VOL_TRANS_LUT_BUF_SIZE * sizeof(int));
-}
-
-void CAudioAlsa::SetSupperBassVolDigitLutBuf(int digit_lut_buf[])
-{
- memcpy((void *) mSupperBassDigitLutBuf, digit_lut_buf,
- CC_VOL_TRANS_LUT_BUF_SIZE * sizeof(int));
-}
-
-int CAudioAlsa::SetDacMute(int mute_state, int mute_type)
-{
- int tmp_ret = 0;
-
- if (mute_type & CC_DAC_MUTE_TYPE_INTERNAL) {
- tmp_ret |= SetInternalDacMute(mute_state);
- }
-
- if (mute_type & CC_DAC_MUTE_TYPE_EXTERNAL) {
- tmp_ret |= SetExternalDacMute(mute_state);
- setAudioPcmPlaybackMute(mute_state);
- }
-
- return tmp_ret;
-}
-
-int CAudioAlsa::SetDacMainVolume(int main_vol)
-{
- int tmp_ret = 0;
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- if (aud_arch_type == CC_DAC_T866_INTERNAL_DAC) {
- tmp_ret = SetInternalDacMainVolume(main_vol);
- } else {
- tmp_ret = SetExternalDacMainVolume(main_vol);
- }
-
- return tmp_ret;
-}
-
-int CAudioAlsa::SetDacSupperBassVolume(int tmp_vol)
-{
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- if (aud_arch_type == CC_DAC_T866_INTERNAL_DAC) {
- return 0;
- }
-
- return SetExternalDacSupperBassVolume(tmp_vol);
-}
-
-int CAudioAlsa::SetDacEQMode(int mode_val)
-{
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- if (aud_arch_type == CC_DAC_T866_INTERNAL_DAC) {
- return 0;
- }
-
- return SetExternalDacEQ(mode_val);
-}
-
-int CAudioAlsa::SetBalanceValue(int balance_val)
-{
- int tmp_val = 0;
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- tmp_val = mMainVolumeBalanceVal;
- mMainVolumeBalanceVal = balance_val;
-
- if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) {
- SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_BALANCE, balance_val);
- return 0;
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) {
- SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_BALANCE, balance_val);
- return 0;
- }
-
- return -1;
-}
-
-int CAudioAlsa::GetBalanceValue()
-{
- int tmp_val = 0;
- tmp_val = mMainVolumeBalanceVal;
- return tmp_val;
-}
-
-int CAudioAlsa::SetMainVolumeGain(int gain_val)
-{
- int tmp_val = 0;
- tmp_val = mMainVolumeGainVal;
- mMainVolumeGainVal = gain_val;
- return tmp_val;
-}
-
-int CAudioAlsa::GetMainVolumeGain()
-{
- int tmp_val = 0;
- tmp_val = mMainVolumeGainVal;
- return tmp_val;
-}
-
-int CAudioAlsa::SetSupperBassVolumeGain(int gain_val)
-{
- int tmp_val = 0;
- tmp_val = mSupperBassVolumeGainVal;
- mSupperBassVolumeGainVal = gain_val;
- return tmp_val;
-}
-
-int CAudioAlsa::GetSupperBassVolumeGain()
-{
- int tmp_val = 0;
- tmp_val = mSupperBassVolumeGainVal;
- return tmp_val;
-}
-
-int CAudioAlsa::SetDacAudioSourceType(int source_type)
-{
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) {
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) {
- SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_SOURCE, source_type);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) {
- SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_SOURCE, source_type);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL) {
- }
-
- return 0;
-}
-
-int CAudioAlsa::CalculateBalanceVol(int max_vol, int balance_val, int vol_buf[])
-{
- int bal_mid_vol = 0, bal_cal_len = 0;
- int tmp_val = 0;
-
- if (balance_val < CC_MIN_SOUND_BALANCE_VAL
- || balance_val > CC_MAX_SOUND_BALANCE_VAL) {
- return -1;
- }
-
- vol_buf[0] = max_vol;
- vol_buf[1] = max_vol;
-
- bal_mid_vol = (CC_MIN_SOUND_BALANCE_VAL + CC_MAX_SOUND_BALANCE_VAL) / 2;
- bal_cal_len = (CC_MAX_SOUND_BALANCE_VAL - CC_MIN_SOUND_BALANCE_VAL) / 2;
-
- if (balance_val == bal_mid_vol) {
- LOGD(
- "%s, balance value = %d, bal_mid_vol = %d, vol_buf[0] = %d, vol_buf[1] = %d.\n",
- __FUNCTION__, balance_val, bal_mid_vol, vol_buf[0], vol_buf[1]);
- return 0;
- } else if (balance_val < bal_mid_vol) {
- vol_buf[1] = (bal_cal_len - (bal_mid_vol - balance_val)) * max_vol / bal_cal_len;
- } else if (balance_val > bal_mid_vol) {
- vol_buf[0] = (bal_cal_len - (balance_val - bal_mid_vol)) * max_vol / bal_cal_len;
- }
-
- if (GetAudioAmplifierBalanceExchangeCFG() != 0) {
- tmp_val = vol_buf[0];
- vol_buf[0] = vol_buf[1];
- vol_buf[1] = tmp_val;
- }
-
- LOGD(
- "%s, balance value = %d, bal_mid_vol = %d, vol_buf[0] = %d, vol_buf[1] = %d.\n",
- __FUNCTION__, balance_val, bal_mid_vol, vol_buf[0], vol_buf[1]);
- return 0;
-}
-
-int CAudioAlsa::SetExternalDacMute(int mute_state)
-{
- int tmp_ret = 0;
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) {
- SetExternalDacChannelSwitch(1, mute_state);
- SetExternalDacChannelSwitch(2, mute_state);
-
- if (GetAudioSupperBassModuleDisableCFG() == 0) {
- SetExternalDacChannelSwitch(3, mute_state);
- }
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) {
- SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_MUTE, mute_state);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) {
- SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_MUTE, mute_state);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL) {
- SetDigitalMute(mute_state);
- }
-
- return tmp_ret;
-}
-
-int CAudioAlsa::SetInternalDacMute(int mute_state)
-{
- return 0;
-}
-
-int CAudioAlsa::setAudioPcmPlaybackMute(int mute_state)
-{
- const char *value;
- char prop[256];
- value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" );
- property_get("audio.output.double_output", prop, "null");
- if ( strcmp ( value, "enable" ) == 0 && (strcmp(prop, "0") == 0 || strcmp(prop, "null") == 0)) {
- SetAudioPcmPlaybackSwitch(mute_state);
- }
- return 0;
-}
-
-int CAudioAlsa::SetExternalDacMainVolume(int main_vol)
-{
- int tmp_ret = 0;
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) {
- int digit_vol = 0;
- int vol_gain_val = 0;
- int balance_val = 0, vol_buf[2] = {0, 0};
-
- //handle l&r channel volume for balance
- balance_val = GetBalanceValue();
- CalculateBalanceVol(255, balance_val, vol_buf);
-
- tmp_ret |= SetExternalDacChannelVolume(1, vol_buf[0]);
- tmp_ret |= SetExternalDacChannelVolume(2, vol_buf[1]);
-
- //handle master channel volume
- digit_vol = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, main_vol,
- 0, 100, CC_MIN_DAC_VOLUME, CC_MAX_DAC_VOLUME);
-
- vol_gain_val = GetMainVolumeGain();
- digit_vol += vol_gain_val;
- if (digit_vol < CC_MIN_DAC_VOLUME) {
- digit_vol = CC_MIN_DAC_VOLUME;
- } else if (digit_vol > CC_MAX_DAC_VOLUME) {
- digit_vol = CC_MAX_DAC_VOLUME;
- }
- tmp_ret |= SetExternalDacChannelVolume(0, digit_vol);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) {
- tmp_ret = SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_VOLUME_BAR, main_vol);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) {
- tmp_ret = SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_VOLUME_BAR, main_vol);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL) {
- tmp_ret = SetDigitalMainVolume(main_vol);
- }
-
- return tmp_ret;
-}
-
-int CAudioAlsa::SetInternalDacMainVolume(int main_vol)
-{
- int tmp_ret = 0, digit_vol = 0;
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- if (aud_arch_type == CC_DAC_T866_INTERNAL_DAC) {
- digit_vol = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, main_vol,
- 0, 100, CC_MIN_DAC_VOLUME, CC_MAX_DAC_VOLUME);
-
- if (digit_vol < CC_MIN_DAC_VOLUME) {
- digit_vol = CC_MIN_DAC_VOLUME;
- } else if (digit_vol > CC_MAX_DAC_VOLUME) {
- digit_vol = CC_MAX_DAC_VOLUME;
- }
-
- return SetInternalDacLineOutPlayBackVolume(digit_vol, digit_vol);
- }
-
- return 0;
-}
-
-int CAudioAlsa::SetExternalDacSupperBassVolume(int tmp_vol)
-{
- int tmp_ret = 0;
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- if (GetAudioSupperBassModuleDisableCFG() != 0) {
- return 0;
- }
-
- if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) {
- int digit_vol = 0;
- int vol_gain_val = 0;
-
- digit_vol = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, tmp_vol,
- 0, 100, CC_MIN_DAC_SUB_WOOFER_VOLUME,
- CC_MAX_DAC_SUB_WOOFER_VOLUME);
-
- vol_gain_val = GetSupperBassVolumeGain();
- digit_vol += vol_gain_val;
- if (digit_vol < CC_MIN_DAC_SUB_WOOFER_VOLUME) {
- digit_vol = CC_MIN_DAC_SUB_WOOFER_VOLUME;
- } else if (digit_vol > CC_MAX_DAC_SUB_WOOFER_VOLUME) {
- digit_vol = CC_MAX_DAC_SUB_WOOFER_VOLUME;
- }
-
- tmp_ret = SetExternalDacChannelVolume(3, digit_vol);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) {
- tmp_ret = SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_SUBCHANNEL_VOLUME, tmp_vol);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) {
- tmp_ret = SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_SUBCHANNEL_VOLUME, tmp_vol);
- }
-
- return tmp_ret;
-}
-
-int CAudioAlsa::SetExternalDacEQ(int mode_val)
-{
- int tmp_ret = 0;
- int aud_arch_type = GetAudioArchitectureTypeCFG();
-
- if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_ON_BOARD || aud_arch_type == CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD) {
- SetExternalDacEQMode(mode_val);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC) {
- SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_EQ_MODE, mode_val);
- } else if (aud_arch_type == CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB) {
- SendCmdToOffBoardCustomerLibExternalDac(AUDIO_CMD_SET_EQ_MODE, mode_val);
- }
-
- return tmp_ret;
-}
-
-int (*HandleDacMute)(int mute_state);
-int (*HandleDacMainVolume)(int vol);
-int (*HandleDacBalance)(int balance_val);
-int (*HandleAudioSourceType)(int source_type);
-
-static void *gExternalDacLibHandler = NULL;
-int CAudioAlsa::LoadExternalDacLib(void)
-{
- char *error;
-
- ALOGD("%s, entering...\n", __FUNCTION__);
-
- if (gExternalDacLibHandler != NULL) {
- return 0;
- }
-
- const char *config_value = config_get_str("TV", "audio.external.dac.libpath", "/system/lib/libdac.so");
- gExternalDacLibHandler = dlopen(config_value, RTLD_NOW);
- if (!gExternalDacLibHandler) {
- ALOGE("%s, failed to load external dac lib (%s)\n", __FUNCTION__, config_value);
- goto Error;
- }
-
-
- HandleDacMute = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleDacMute");
- if (HandleDacMute == NULL) {
- ALOGE("%s, fail find fun HandleDacMute()\n", __FUNCTION__);
- goto Error;
- }
- HandleDacMainVolume = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleDacMainVolume");
- if (HandleDacMainVolume == NULL) {
- ALOGE("%s, fail find fun HandleDacMainVolume()\n", __FUNCTION__);
- goto Error;
- }
- HandleDacBalance = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleDacBalance");
- if (HandleDacBalance == NULL) {
- ALOGE("%s, fail find fun HandleDacBalance()\n", __FUNCTION__);
- goto Error;
- }
- HandleAudioSourceType = (int(*)(int))dlsym(gExternalDacLibHandler, "HandleAudioSourceType");
- if (HandleAudioSourceType == NULL) {
- ALOGE("%s, fail find fun HandleAudioSourceType()\n", __FUNCTION__);
- goto Error;
- }
-
- return 0;
-
-Error: //
- HandleDacMute = NULL;
- HandleDacMainVolume = NULL;
- HandleDacBalance = NULL;
- HandleAudioSourceType = NULL;
-
- if (gExternalDacLibHandler != NULL) {
- dlclose(gExternalDacLibHandler);
- gExternalDacLibHandler = NULL;
- }
- return -1;
-}
-
-int CAudioAlsa::SendCmdToOffBoardCustomerLibExternalDac(int cmd, int para)
-{
- LoadExternalDacLib();
- if (gExternalDacLibHandler != NULL) {
- if (cmd == AUDIO_CMD_SET_MUTE) {
- if (HandleDacMute != NULL) {
- LOGD("%s, call external dac lib HandleDacMute (para = %d).\n", __FUNCTION__, para);
- return (*HandleDacMute)(para);
- }
- } else if (cmd == AUDIO_CMD_SET_VOLUME_BAR) {
- if (HandleDacMainVolume != NULL) {
- LOGD("%s, call external dac lib HandleDacMainVolume (para = %d).\n", __FUNCTION__, para);
- return (*HandleDacMainVolume)(para);
- }
- } else if (cmd == AUDIO_CMD_SET_BALANCE) {
- if (HandleDacBalance != NULL) {
- LOGD("%s, call external dac lib HandleDacBalance (para = %d).\n", __FUNCTION__, para);
- return (*HandleDacBalance)(para);
- }
- } else if (cmd == AUDIO_CMD_SET_SOURCE) {
- if (HandleAudioSourceType != NULL) {
- LOGD("%s, call external dac lib HandleAudioSourceType (para = %d).\n", __FUNCTION__, para);
- return (*HandleAudioSourceType)(para);
- }
- }
- }
-
- return 0;
-}
-
-int CAudioAlsa::SendCmdToOffBoardFBCExternalDac(int cmd, int para)
-{
- CFbcCommunication *pFBC = GetSingletonFBC();
- if (pFBC != NULL) {
- if (cmd == AUDIO_CMD_SET_MUTE) {
- int fbc_mute = 0;//0 is mute,1 is unmute
- if(para == CC_AUDIO_MUTE) {
- fbc_mute = 0;
- } else {
- fbc_mute = 1;
- }
- //int fbcIsBute;
- //pFBC->cfbc_Get_Mute(COMM_DEV_SERIAL, &fbcIsBute);
- //LOGD("fbc is mute = %d", fbcIsBute);
- return pFBC->cfbc_Set_Mute(COMM_DEV_SERIAL, fbc_mute);
- } else if (cmd == AUDIO_CMD_SET_VOLUME_BAR) {
- LOGD("%s, send AUDIO_CMD_SET_VOLUME_BAR (para = %d) to fbc.\n", __FUNCTION__, para);
- return pFBC->cfbc_Set_Volume_Bar(COMM_DEV_SERIAL, para);
- } else if (cmd == AUDIO_CMD_SET_BALANCE) {
- LOGD("%s, send AUDIO_CMD_SET_BALANCE (para = %d) to fbc.\n", __FUNCTION__, para);
- return pFBC->cfbc_Set_Balance(COMM_DEV_SERIAL, para);
- } else if (cmd == AUDIO_CMD_SET_SOURCE) {
- LOGD("%s, send AUDIO_CMD_SET_SOURCE (para = %d) to fbc.\n", __FUNCTION__, para);
- return pFBC->cfbc_Set_FBC_Audio_Source(COMM_DEV_SERIAL, para);
- }
- }
-
- return 0;
-}
-
-static int gDigitalMuteStatus = CC_AUDIO_UNMUTE;
-static int gDigitalLeftVol = 0;
-static int gDigitalRightVol = 0;
-
-int CAudioAlsa::HandleDigitalVolume(int l_val, int r_val)
-{
- amAudioSetLeftGain(l_val);
- amAudioSetRightGain(r_val);
-
- amAudioSetAndroidVolumeEnable(1);
- amAudioSetAndroidVolume(l_val, r_val);
-
- LOGD("%s, l_val = %d, r_val = %d.\n", __FUNCTION__, l_val, r_val);
- return 0;
-}
-
-int CAudioAlsa::HandleDigitalMute(int mute_status)
-{
- if (mute_status == CC_AUDIO_MUTE) {
- HandleDigitalVolume(0, 0);
- } else if (mute_status == CC_AUDIO_UNMUTE) {
- HandleDigitalVolume(gDigitalLeftVol, gDigitalRightVol);
- }
-
- return 0;
-}
-
-int CAudioAlsa::SetDigitalMainVolume(int main_vol)
-{
- int tmp_ret = 0, l_val = 0, r_val = 0;
- int balance_val = 0, vol_buf[2] = {0, 0};
-
- //handle l&r channel volume for balance
- balance_val = GetBalanceValue();
- CalculateBalanceVol(main_vol, balance_val, vol_buf);
-
- //handle master channel volume
- l_val = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, vol_buf[0],
- 0, 100, CC_MIN_DAC_VOLUME, CC_MAX_DAC_VOLUME);
- r_val = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, vol_buf[1],
- 0, 100, CC_MIN_DAC_VOLUME, CC_MAX_DAC_VOLUME);
-
- gDigitalLeftVol = l_val;
- gDigitalRightVol = r_val;
- if (gDigitalMuteStatus == CC_AUDIO_UNMUTE) {
- HandleDigitalVolume(l_val, r_val);
- }
-
- return tmp_ret;
-}
-
-int CAudioAlsa::SetDigitalMute(int mute_status)
-{
- if (mute_status == CC_AUDIO_MUTE || mute_status == CC_AUDIO_UNMUTE) {
- gDigitalMuteStatus = mute_status;
- return HandleDigitalMute(mute_status);
- }
-
- return 0;
-}
-
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <pthread.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <math.h>
+#include <errno.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <tinyalsa/asoundlib.h>
+#include "CFbcCommunication.h"
+#include <sys/poll.h>
+#include "tvsetting/audio_cfg.h"
+#include "audio_alsa.h"
+#include <cutils/properties.h>
+#define LOG_TAG "CAudioAlsa"
+#include "CTvLog.h"
+#include "audio_amaudio.h"
+
+static const int DEFAULT_MAIN_DIGIT_LUT[] = {
+ //
+ 0, 40, 50, 60, 70, 87, 110, 120, 130, 140, // 0~9
+ 150, 152, 155, 158, 161, 164, 167, 170, 173, 174, // 10~19
+ 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, // 20~29
+ 191, 191, 192, 193, 194, 195, 196, 196, 197, 197, // 30~39
+ 198, 198, 198, 199, 199, 200, 200, 201, 201, 201, // 40~49
+ 202, 202, 202, 203, 203, 203, 203, 204, 204, 204, // 50~59
+ 205, 205, 205, 205, 206, 206, 206, 206, 206, 207, // 60~69
+ 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, // 70~79
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 209, // 80~89
+ 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, // 90~99
+ 209, // 100
+};
+
+static const int DEFAULT_SUPPER_BASS_DIGIT_LUT_BUF[] = {
+ //
+ 0, 122, 123, 124, 125, 126, 127, 128, 129, 130, // 0~9
+ 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, // 10~19
+ 141, 142, 143, 144, 145, 147, 147, 148, 148, 149, // 20~29
+ 149, 150, 150, 151, 151, 152, 152, 153, 153, 154, // 30~39
+ 154, 155, 155, 156, 156, 157, 157, 158, 158, 159, // 40~49
+ 160, 160, 160, 160, 161, 161, 161, 161, 162, 162, // 50~59
+ 162, 163, 163, 163, 163, 164, 164, 164, 165, 165, // 60~69
+ 165, 165, 166, 166, 166, 167, 168, 169, 170, 171, // 70~79
+ 173, 174, 175, 176, 177, 179, 180, 181, 182, 183, // 80~89
+ 185, 186, 187, 188, 189, 191, 192, 193, 194, 195, // 90~99
+ 197 // 100
+};
+
+CAudioAlsa::CAudioAlsa()
+{
+ int card_id;
+ card_id = get_aml_card();
+ LOGD("[%s:%d] card_id:%d\n", __FUNCTION__, __LINE__, card_id);
+ mpMixer = mixer_open(card_id);
+
+ card_id = get_USB_Audio_card();
+ LOGD("[%s:%d] card_id:%d\n", __FUNCTION__, __LINE__, card_id);
+ mpUsbMixer = mixer_open(card_id);
+ mMainVolumeGainVal = 0;
+ mSupperBassVolumeGainVal = 0;
+ ArrayCopy(mMainDigitLutBuf, DEFAULT_MAIN_DIGIT_LUT, CC_VOL_TRANS_LUT_BUF_SIZE);
+ ArrayCopy(mSupperBassDigitLutBuf, DEFAULT_SUPPER_BASS_DIGIT_LUT_BUF, CC_VOL_TRANS_LUT_BUF_SIZE);
+}
+
+CAudioAlsa::~CAudioAlsa()
+{
+ if (NULL != mpMixer) {
+ mixer_close(mpMixer);
+ }
+
+ if (NULL != mpUsbMixer) {
+ mixer_close(mpUsbMixer);
+ }
+}
+
+int CAudioAlsa::get_aml_card()
+{
+ int card = -1, err = 0;
+ int fd = -1;
+ char read_buf[512], *pd = NULL;
+ static const char *const SOUND_CARDS_PATH = "/proc/asound/cards";
+ fd = open(SOUND_CARDS_PATH, O_RDONLY);
+ if (fd < 0) {
+ LOGE("ERROR: failed to open config file %s error: %d\n", SOUND_CARDS_PATH, errno);
+ close(fd);
+ return -EINVAL;
+ }
+ memset(read_buf, 0x0, 512);
+ err = read(fd, read_buf, 512);
+ if (fd < 0) {
+ LOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno);
+ close(fd);
+ return -EINVAL;
+ }
+ pd = strstr(read_buf, "AML");
+ card = *(pd - 3) - '0';
+ close(fd);
+ return card;
+}
+
+int CAudioAlsa::AudioControlSetValue(int val_count, int data_buf[], char *match_names)
+{
+ struct mixer_ctl *pctl;
+ unsigned int expected_val_count;
+ unsigned int value_index;
+
+ if (NULL == mpMixer) {
+ LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__);
+ goto err_exit;
+ }
+
+ pctl = mixer_get_ctl_by_name(mpMixer, match_names);
+ if (NULL == pctl) {
+ LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names);
+ goto err_exit;
+ }
+ expected_val_count = mixer_ctl_get_num_values(pctl);
+ if (expected_val_count != (unsigned int)val_count) {
+ LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__);
+ goto err_exit;
+ }
+ for (value_index = 0; value_index < expected_val_count; value_index++) {
+ if (mixer_ctl_set_value(pctl, value_index, data_buf[value_index]) != 0) {
+ LOGE("[%s:%d] Failed to set value:%d\n", __FUNCTION__, __LINE__, value_index);
+ goto err_exit;
+ }
+ }
+ return 0;
+err_exit:
+ return -1;
+}
+
+int CAudioAlsa::AudioControlGetValue(int val_count, int ret_buf[], char *match_names)
+{
+ struct mixer_ctl *pctl;
+ unsigned int expected_val_count;
+ unsigned int value_index;
+
+ if (NULL == mpMixer) {
+ LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__);
+ goto err_exit;
+ }
+ pctl = mixer_get_ctl_by_name(mpMixer, match_names);
+ if (NULL == pctl) {
+ LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names);
+ goto err_exit;
+ }
+ expected_val_count = mixer_ctl_get_num_values(pctl);
+ if (expected_val_count != (unsigned int)val_count) {
+ LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__);
+ goto err_exit;
+ }
+ for (value_index = 0; value_index < expected_val_count; value_index++) {
+ ret_buf[value_index] = mixer_ctl_get_value(pctl, value_index);
+ }
+ return 0;
+err_exit:
+ return -1;
+}
+
+int CAudioAlsa::get_USB_Audio_card()
+{
+ int card = -1, err = 0;
+ int fd = -1;
+ char read_buf[512], *pd = NULL;
+ static const char *const SOUND_CARDS_PATH = "/proc/asound/cards";
+ fd = open(SOUND_CARDS_PATH, O_RDONLY);
+ if (fd < 0) {
+ LOGE("ERROR: failed to open config file %s error: %d\n", SOUND_CARDS_PATH, errno);
+ close(fd);
+ return -EINVAL;
+ }
+ memset(read_buf, 0x0, 512);
+ err = read(fd, read_buf, 512);
+ if (fd < 0) {
+ LOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno);
+ close(fd);
+ return -EINVAL;
+ }
+ pd = strstr(read_buf, "Receiver");
+ if (pd == NULL) {
+ LOGE("ERROR: failed to read config file %s error: %d\n", SOUND_CARDS_PATH, errno);
+ close(fd);
+ return -EINVAL;
+ }
+
+ card = *(pd - 3) - '0';
+ close(fd);
+ return card;
+}
+
+int CAudioAlsa::HandleUSBAudioControlValue(int val_count, int data_buf[], int match_count, char **match_names)
+{
+
+ struct mixer_ctl *pctl;
+ unsigned int expected_val_count;
+ unsigned int match_index;
+ unsigned int value_index;
+ char card_id_str[9] = {0};
+
+ if (NULL == mpUsbMixer) {
+ LOGE("[%s:%d] Failed to open mixer\n", __FUNCTION__, __LINE__);
+ goto err_exit;
+ }
+
+ for (match_index = 0; match_index < match_count; match_index++) {
+ pctl = mixer_get_ctl_by_name(mpUsbMixer, match_names[match_index]);
+ if (NULL == pctl) {
+ LOGE("[%s:%d] Failed to get mixer control for:%s\n", __FUNCTION__, __LINE__, match_names[match_index]);
+ goto err_exit;
+ }
+ expected_val_count = mixer_ctl_get_num_values(pctl);
+ if (expected_val_count != (unsigned int)val_count) {
+ LOGE("[%s:%d] val_count != expected_val_count\n", __FUNCTION__, __LINE__);
+ goto err_exit;
+ }
+ for (value_index = 0; value_index < expected_val_count; value_index++) {
+ if (mixer_ctl_set_value(pctl, value_index, data_buf[value_index]) != 0) {
+ LOGE("[%s:%d] Failed to set value:%d\n", __FUNCTION__, __LINE__, value_index);
+ goto err_exit;
+ }
+ }
+ }
+
+ return 0;
+err_exit:
+ return -1;
+}
+
+int CAudioAlsa::CheckVolume(int digit_vol, int digit_min, int digit_max, int hd_min,
+ int hd_max)
+{
+ int tmp_val = digit_vol;
+
+ if (digit_vol < hd_min) {
+ return hd_min;
+ } else if (digit_vol > hd_max) {
+ return hd_max;
+ }
+
+ return digit_vol;
+}
+
+int CAudioAlsa::GetTwoChannelVolume(int vol_buf[], int l_min_vol, int l_max_vol,
+ int r_min_vol, int r_max_vol, char *match_names, int hd_min,
+ int hd_max)
+{
+ vol_buf[0] = 0;
+ vol_buf[1] = 0;
+ return AudioControlGetValue(2, vol_buf, match_names);
+}
+
+int CAudioAlsa::GetLineInMaxVol()
+{
+
+ return 127;
+}
+
+int CAudioAlsa::GetLineOutMaxVol()
+{
+
+ return 255;
+}
+
+#define CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME (0)
+#define CC_GET_ALSA_CTL_INTERNAL_DAC_PGA_IN_GAIN (1)
+#define CC_GET_ALSA_CTL_INTERNAL_DAC_ADC_DIGITAL_CAPTURE_VOLUME_NAME (2)
+#define CC_GET_ALSA_CTL_INTERNAL_DAC_DAC_DIGITAL_PLAYBACK_VOLUME_NAME (3)
+#define CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME (4)
+#define CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME (5)
+#define CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME (6)
+#define CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME (7)
+#define CC_GET_ALSA_CTL_I2S_MUTE_NAME (8)
+#define CC_GET_ALSA_CTL_SPDIF_MUTE_NAME (9)
+#define CC_GET_ALSA_CTL_HW_RESAMPLE_NAME (10)
+#define CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME (11)
+#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME (12)
+#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME (13)
+#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME (14)
+#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME (15)
+#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME (16)
+#define CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME (17)
+#define CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME (18)
+#define CC_GET_ALSA_CTL_PCM_PLAYBACK_VOLUME (19)
+#define CC_GET_ALSA_CTL_PCM_PLAYBACK_SWITCH (20)
+#define CC_GET_ALSA_CTL_SETOUTPUT_SWAP (21)
+#define CC_GET_ALSA_CTL_AUDIO_IN_SWITCH (22)
+
+static char gG9AlsaNames[32][48] = {
+ {"Audio In Source"},//0
+ {"PGA IN Gain"},//1
+ {"ADC Digital Capture Volume"},//2
+ {"DAC Digital Playback Volume"},//3
+ {"Linein right switch"},//4
+ {"Linein left switch"},
+ {"ADC Digital Capture Volume"},
+ {"DAC Digital Playback Volume"},
+ {"Audio i2s mute"},//8
+ {"Audio spdif mute"},
+ {"Hardware resample enable"},//10
+ {"AMP Master Volume"},
+ {"AMP Ch1 Volume"},//12
+ {"AMP Ch2 Volume"},
+ {"AMP Ch3 Volume"},
+ {"AMP Ch1 Switch"},
+ {"AMP Ch2 Switch"},
+ {"AMP Ch3 Switch"},//17
+ {"AMP EQ Mode"},
+ {"PCM Playback Volume"},
+ {"PCM Playback Switch"},
+ {"Output Swap"},
+ {"AudioIn Switch"},//22
+};
+
+
+char *CAudioAlsa::GetAlsaControlName(int get_type)
+{
+ return gG9AlsaNames[get_type];
+}
+
+
+int CAudioAlsa::SetAudioInSource(int source_type)
+{
+ int set_val = 0;
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME);
+ set_val = source_type;
+ return AudioControlSetValue(1, &set_val, match_names);
+}
+
+int CAudioAlsa::GetAudioInSource(void)
+{
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_AUDIO_IN_SOURCE_NAME);
+ int source_type = 0;
+ AudioControlGetValue(1, &source_type, match_names);
+ return source_type;
+}
+
+int CAudioAlsa::SetAudioInternalDacPGAInGain(int gain_l_val, int gain_r_val)
+{
+ int GainBuf[2] = {0, 0};
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_PGA_IN_GAIN);
+
+ GainBuf[0] = gain_l_val;
+ GainBuf[1] = gain_r_val;
+ if (gain_l_val < 0 || gain_l_val > 31) {
+ GainBuf[0] = 16;
+ }
+ if (gain_r_val < 0 || gain_r_val > 31) {
+ GainBuf[1] = 16;
+ }
+
+ return AudioControlSetValue(2, GainBuf, match_names);
+}
+
+int CAudioAlsa::GetAudioInternalDacPGAInGain(int *gain_l_val, int *gain_r_val)
+{
+ int GainBuf[2] = {0, 0};
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_PGA_IN_GAIN);
+
+ AudioControlGetValue(2, GainBuf, match_names);
+
+ *gain_l_val = GainBuf[0];
+ *gain_r_val = GainBuf[1];
+
+ return 0;
+}
+
+int CAudioAlsa::SetAudioInternalDacADCDigitalCaptureVolume(int vol_l_val, int vol_r_val)
+{
+ int VolumeBuf[2] = {0, 0};
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_ADC_DIGITAL_CAPTURE_VOLUME_NAME);
+
+ VolumeBuf[0] = vol_l_val;
+ VolumeBuf[1] = vol_r_val;
+ if (vol_l_val < 0 || vol_l_val > 127) {
+ VolumeBuf[0] = 82;
+ }
+ if (vol_r_val < 0 || vol_r_val > 127) {
+ VolumeBuf[1] = 82;
+ }
+
+ return AudioControlSetValue(2, VolumeBuf, match_names);
+}
+
+int CAudioAlsa::GetAudioInternalDacADCDigitalCaptureVolume(int *vol_l_val, int *vol_r_val)
+{
+ int VolumeBuf[2] = {0, 0};
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_ADC_DIGITAL_CAPTURE_VOLUME_NAME);
+
+ AudioControlGetValue(2, VolumeBuf, match_names);
+
+ *vol_l_val = VolumeBuf[0];
+ *vol_r_val = VolumeBuf[1];
+
+ return 0;
+}
+
+int CAudioAlsa::SetAudioInternalDacDACDigitalPlayBackVolume(int vol_l_val, int vol_r_val)
+{
+ int VolumeBuf[2] = {0, 0};
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_DAC_DIGITAL_PLAYBACK_VOLUME_NAME);
+
+ VolumeBuf[0] = vol_l_val;
+ VolumeBuf[1] = vol_r_val;
+ if (vol_l_val < 0 || vol_l_val > 255) {
+ VolumeBuf[0] = 255;
+ }
+ if (vol_r_val < 0 || vol_r_val > 255) {
+ VolumeBuf[1] = 255;
+ }
+
+ return AudioControlSetValue(2, VolumeBuf, match_names);
+}
+
+int CAudioAlsa::GetAudioInternalDacDACDigitalPlayBackVolume(int *vol_l_val, int *vol_r_val)
+{
+ int VolumeBuf[2] = {0, 0};
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_DAC_DIGITAL_PLAYBACK_VOLUME_NAME);
+
+ AudioControlGetValue(2, VolumeBuf, match_names);
+
+ *vol_l_val = VolumeBuf[0];
+ *vol_r_val = VolumeBuf[1];
+
+ return 0;
+}
+
+int CAudioAlsa::SetInternalDacLineInSelectChannel(int line_in_number)
+{
+ int tmp_ret = 0;
+ char *match_names = NULL;
+
+ if (line_in_number < 0 || line_in_number > 7) {
+ return -1;
+ }
+
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LEFT_LINEIN_SEL_NAME);
+ tmp_ret |= AudioControlSetValue(1, &line_in_number, match_names);
+
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_RIGHT_LINEIN_SEL_NAME);
+ tmp_ret |= AudioControlSetValue(1, &line_in_number, match_names);
+
+ return tmp_ret;
+}
+
+int CAudioAlsa::SetInternalDacLineInCaptureVolume(int l_vol, int r_vol)
+{
+ int max_val = GetLineInMaxVol();
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME);
+ int VolumeBuf[2];
+
+ VolumeBuf[0] = CheckVolume(l_vol, 0, max_val, 0, max_val);
+ VolumeBuf[1] = CheckVolume(r_vol, 0, max_val, 0, max_val);
+
+ return AudioControlSetValue(2, VolumeBuf, match_names);
+}
+
+int CAudioAlsa::GetInternalDacLineInCaptureVolume(int vol_buf[])
+{
+ int max_val = GetLineInMaxVol();
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEIN_CAPTURE_VOLUME_NAME);
+
+ return GetTwoChannelVolume(vol_buf, 0, max_val, 0, max_val, match_names, 0, max_val);
+}
+
+int CAudioAlsa::SetInternalDacLineOutPlayBackVolume(int l_vol, int r_vol)
+{
+ int max_val = GetLineOutMaxVol();
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME);
+ int VolumeBuf[2];
+
+ VolumeBuf[0] = CheckVolume(l_vol, 0, max_val, 0, max_val);
+ VolumeBuf[1] = CheckVolume(r_vol, 0, max_val, 0, max_val);
+
+ return AudioControlSetValue(2, VolumeBuf, match_names);
+}
+
+int CAudioAlsa::GetInternalDacLineOutPlayBackVolume(int vol_buf[])
+{
+ int max_val = GetLineOutMaxVol();
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_INTERNAL_DAC_LINEOUT_PLAYBACK_VOLUME_NAME);
+
+ return GetTwoChannelVolume(vol_buf, 0, max_val, 0, max_val, match_names, 0, max_val);
+}
+
+int CAudioAlsa::SetAudioPcmPlaybackVolume(int vol)
+{
+ if (get_USB_Audio_card() == -EINVAL) return 0;
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_PCM_PLAYBACK_VOLUME);
+ return HandleUSBAudioControlValue(1, &vol, 1, &match_names);
+}
+
+int CAudioAlsa::SetAudioPcmPlaybackSwitch(int vol)
+{
+ if (get_USB_Audio_card() == -EINVAL) return 0;
+ char *match_names = GetAlsaControlName(CC_GET_ALSA_CTL_PCM_PLAYBACK_SWITCH);
+ return HandleUSBAudioControlValue(1, &vol, 1, &match_names);
+}
+
+int CAudioAlsa::SetExternalDacChannelSwitch(int chan_ind, int switch_val)
+{
+ char *match_names = NULL;
+
+ if (chan_ind == 1) {
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_SWITCH_NAME);
+ } else if (chan_ind == 2) {
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_SWITCH_NAME);
+ } else if (chan_ind == 3) {
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_SWITCH_NAME);
+ } else {
+ return -1;
+ }
+
+ return AudioControlSetValue(1, &switch_val, match_names);
+}
+
+int CAudioAlsa::SetExternalDacChannelVolume(int chan_ind, int main_vol)
+{
+ int tmp_ret = 0;
+ char *match_names = NULL;
+
+ if (chan_ind == 0) {
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_MASTER_VOLUME_NAME);
+ } else if (chan_ind == 1) {
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH1_VOLUME_NAME);
+ } else if (chan_ind == 2) {
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH2_VOLUME_NAME);
+ } else if (chan_ind == 3) {
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_CH3_VOLUME_NAME);
+ } else {
+ return -1;
+ }
+
+ return AudioControlSetValue(1, &main_vol, match_names);
+}
+int CAudioAlsa::SetAudioSwitchIO(int value)
+{
+ char *match_names = gG9AlsaNames[CC_GET_ALSA_CTL_AUDIO_IN_SWITCH];
+
+ return AudioControlSetValue(1, &value, match_names);
+}
+int CAudioAlsa::SetOutput_Swap(int value)
+{
+ char *match_names = gG9AlsaNames[CC_GET_ALSA_CTL_SETOUTPUT_SWAP];
+
+ return AudioControlSetValue(1, &value, match_names);
+}
+
+int CAudioAlsa::SetExternalDacEQMode(int mode_val)
+{
+ char *match_names = NULL;
+
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_EXTERNAL_DAC_EQ_MODE_NAME);
+ return AudioControlSetValue(1, &mode_val, match_names);
+}
+
+int CAudioAlsa::SetI2SMute(int mute_status)
+{
+ char *match_names = NULL;
+
+ if (mute_status != CC_I2S_MUTE_ON && mute_status != CC_I2S_MUTE_OFF) {
+ LOGE("%s, I2S mute value (%d) error!\n", __FUNCTION__, mute_status);
+ return -1;
+ }
+
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_I2S_MUTE_NAME);
+ return AudioControlSetValue(1, &mute_status, match_names);
+}
+
+int CAudioAlsa::SetSPDIFMute(int mute_status)
+{
+ int set_val = 0;
+ char *match_names = NULL;
+
+ if (mute_status == CC_AUDIO_MUTE) {
+ set_val = CC_SPDIF_MUTE_ON;
+ } else if (mute_status == CC_AUDIO_UNMUTE) {
+ set_val = CC_SPDIF_MUTE_OFF;
+ } else {
+ return -1;
+ }
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_SPDIF_MUTE_NAME);
+ return AudioControlSetValue(1, &mute_status, match_names);
+}
+
+#define CC_SAMPLE_BUF_SIZE (32)
+
+enum CC_HW_RESAMPLE_TYPE {
+ CC_HW_RESAMPLE_DISABLE,
+ CC_HW_RESAMPLE_48K,
+ CC_HW_RESAMPLE_44K,
+ CC_HW_RESAMPLE_32K,
+};
+
+int CAudioAlsa::SetHardwareResample(int sr)
+{
+ int i = 0, set_val = 0, tmp_val = 0;
+ int diff_val = 0x7FFFFFFF, diff_ind = -1;
+ char *match_names = NULL;
+ int sample_buf[CC_SAMPLE_BUF_SIZE] = {48000, 44100, 32000, -1};
+
+ if (sr < 0) {
+ set_val = 0;
+ } else {
+ for (i = 0; i < CC_SAMPLE_BUF_SIZE; i++) {
+ if (sample_buf[i] < 0) {
+ break;
+ }
+
+ if (sample_buf[i] >= sr) {
+ tmp_val = sample_buf[i] - sr;
+ } else {
+ tmp_val = sr - sample_buf[i];
+ }
+
+ if (tmp_val <= diff_val) {
+ diff_val = tmp_val;
+ diff_ind = i;
+ }
+ }
+
+ if (diff_ind < 0) {
+ set_val = 0;
+ } else {
+ set_val = diff_ind + 1;
+ }
+ }
+
+ LOGD("%s, set_val = %d.\n", __FUNCTION__, set_val);
+ match_names = GetAlsaControlName(CC_GET_ALSA_CTL_HW_RESAMPLE_NAME);
+ return AudioControlSetValue(1, &set_val, match_names);
+}
+
+int CAudioAlsa::SetMixerBypassSwitch(int switch_val)
+{
+ char match_names[48] = "Output Mixer Bypass Switch" ;
+ int ctl_buf[2];
+
+ if (switch_val != 0 && switch_val != 1) {
+ return -1;
+ }
+
+ ctl_buf[0] = switch_val;
+ ctl_buf[1] = switch_val;
+
+ return AudioControlSetValue(2, ctl_buf, match_names);
+}
+
+int CAudioAlsa::GetMixerBypassSwitch(void)
+{
+ char match_names[48] = "Output Mixer Bypass Switch" ;
+ int ctl_buf[2];
+
+ AudioControlSetValue(2, ctl_buf, match_names);
+
+ return ctl_buf[0];
+}
+
+int CAudioAlsa::SetMixerDacSwitch(int switch_val)
+{
+ char match_names[48] = "Output Mixer DAC Switch" ;
+ int ctl_buf[2];
+
+ if (switch_val != 0 && switch_val != 1) {
+ return -1;
+ }
+
+ ctl_buf[0] = switch_val;
+ ctl_buf[1] = switch_val;
+
+ return AudioControlSetValue(2, ctl_buf, match_names);
+}
+
+int CAudioAlsa::GetMixerDacSwitch(void)
+{
+ char *match_names = "Output Mixer DAC Switch" ;
+ int ctl_buf[2];
+
+ AudioControlGetValue(2, ctl_buf, match_names);
+
+ return ctl_buf[0];
+}
+
+int CAudioAlsa::TransVolumeBarVolToDigitalVol(int digit_lut_buf[], int digit_vol)
+{
+
+ return digit_lut_buf[digit_vol];
+}
+
+int CAudioAlsa::TransDigitalVolToVolumeBarVol(int digit_lut_buf[], int hd_vol, int hd_min,
+ int hd_max, int digit_min, int digit_max)
+{
+ int i;
+
+
+ for (i = 0; i < CC_VOL_TRANS_LUT_BUF_SIZE - 1; i++) {
+ if (digit_lut_buf[i] >= hd_vol && digit_lut_buf[i + 1] < hd_vol)
+ break;
+ }
+
+ if (i < CC_VOL_TRANS_LUT_BUF_SIZE - 1)
+ return i;
+
+ return digit_max;
+}
+
+void CAudioAlsa::SetMainVolDigitLutBuf(int digit_lut_buf[])
+{
+ memcpy((void *) mMainDigitLutBuf, digit_lut_buf,
+ CC_VOL_TRANS_LUT_BUF_SIZE * sizeof(int));
+}
+
+int *CAudioAlsa::GetMainVolDigitLutBuf()
+{
+ return mMainDigitLutBuf;
+}
+void CAudioAlsa::SetSupperBassVolDigitLutBuf(int digit_lut_buf[])
+{
+ memcpy((void *) mSupperBassDigitLutBuf, digit_lut_buf,
+ CC_VOL_TRANS_LUT_BUF_SIZE * sizeof(int));
+}
+
+
+int CAudioAlsa::SetMainVolumeGain(int gain_val)
+{
+ mMainVolumeGainVal = gain_val;
+ return mMainVolumeGainVal;
+}
+
+int CAudioAlsa::GetMainVolumeGain()
+{
+ return mMainVolumeGainVal;
+}
+
+int CAudioAlsa::SetSupperBassVolumeGain(int gain_val)
+{
+ int tmp_val = 0;
+ tmp_val = mSupperBassVolumeGainVal;
+ mSupperBassVolumeGainVal = gain_val;
+ return tmp_val;
+}
+
+int CAudioAlsa::GetSupperBassVolumeGain()
+{
+ int tmp_val = 0;
+ tmp_val = mSupperBassVolumeGainVal;
+ return tmp_val;
+}
+
+
+int CAudioAlsa::CalculateBalanceVol(int max_vol, int balance_val, int vol_buf[])
+{
+ int bal_mid_vol = 0, bal_cal_len = 0;
+ int tmp_val = 0;
+
+
+ vol_buf[0] = max_vol;
+ vol_buf[1] = max_vol;
+
+ bal_mid_vol = (CC_MIN_SOUND_BALANCE_VAL + CC_MAX_SOUND_BALANCE_VAL) / 2;
+ bal_cal_len = (CC_MAX_SOUND_BALANCE_VAL - CC_MIN_SOUND_BALANCE_VAL) / 2;
+
+ if (balance_val == bal_mid_vol) {
+ LOGD(
+ "%s, balance value = %d, bal_mid_vol = %d, vol_buf[0] = %d, vol_buf[1] = %d.\n",
+ __FUNCTION__, balance_val, bal_mid_vol, vol_buf[0], vol_buf[1]);
+ return 0;
+ } else if (balance_val < bal_mid_vol) {
+ vol_buf[1] = (bal_cal_len - (bal_mid_vol - balance_val)) * max_vol / bal_cal_len;
+ } else if (balance_val > bal_mid_vol) {
+ vol_buf[0] = (bal_cal_len - (balance_val - bal_mid_vol)) * max_vol / bal_cal_len;
+ }
+
+ if (GetAudioAmplifierBalanceExchangeCFG() != 0) {
+ tmp_val = vol_buf[0];
+ vol_buf[0] = vol_buf[1];
+ vol_buf[1] = tmp_val;
+ }
+
+ LOGD(
+ "%s, balance value = %d, bal_mid_vol = %d, vol_buf[0] = %d, vol_buf[1] = %d.\n",
+ __FUNCTION__, balance_val, bal_mid_vol, vol_buf[0], vol_buf[1]);
+ return 0;
+}
+
+
+int CAudioAlsa::SetInternalDacMute(int mute_state)
+{
+ int ret = 0;
+ if (mute_state == CC_AUDIO_MUTE)
+ ret = SetAudioInternalDacDACDigitalPlayBackVolume(0, 0);
+ else
+ ret = SetAudioInternalDacDACDigitalPlayBackVolume(255, 255);
+ return ret;
+}
+
+int CAudioAlsa::setAudioPcmPlaybackMute(int mute_state)
+{
+ char prop[256];
+ property_get("audio.output.double_output", prop, "null");
+ if ( Get2d4gHeadsetEnable() == 1 && (strcmp(prop, "0") == 0 || strcmp(prop, "null") == 0)) {
+ SetAudioPcmPlaybackSwitch(mute_state);
+ }
+ return 0;
+}
+
+
+int CAudioAlsa::SetInternalDacMainVolume(int main_vol)
+{
+ int tmp_ret = 0, digit_vol = 0;
+ digit_vol = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, main_vol);
+
+ return SetInternalDacLineOutPlayBackVolume(digit_vol, digit_vol);
+}
+
+
+static int gDigitalMuteStatus = CC_AUDIO_UNMUTE;
+static int gDigitalLeftVol = 0;
+static int gDigitalRightVol = 0;
+
+int CAudioAlsa::SetDigitalVolume(int l_val, int r_val)
+{
+ amAudioSetLeftGain(l_val);
+ amAudioSetRightGain(r_val);
+ LOGD("%s, l_val = %d, r_val = %d.\n", __FUNCTION__, l_val, r_val);
+ return 0;
+}
+
+int CAudioAlsa::SetDigitalMainVolume(int l_vol, int r_vol)
+{
+ int tmp_ret = 0, l_val = 0, r_val = 0;
+
+ //handle l&r channel volume for balance
+ l_val = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, l_vol);
+ r_val = TransVolumeBarVolToDigitalVol(mMainDigitLutBuf, r_vol);
+
+ gDigitalLeftVol = l_val;
+ gDigitalRightVol = r_val;
+ if (gDigitalMuteStatus == CC_AUDIO_UNMUTE) {
+ SetDigitalVolume(l_val, r_val);
+ }
+
+ return tmp_ret;
+}
+
+int CAudioAlsa::SetDigitalMute(int mute_status)
+{
+ gDigitalMuteStatus = mute_status;
+ if (mute_status == CC_AUDIO_MUTE) {
+ SetDigitalVolume(0, 0);
+ } else if (mute_status == CC_AUDIO_UNMUTE) {
+ SetDigitalVolume(gDigitalLeftVol, gDigitalRightVol);
+ }
+
+ return 0;
+}
+
diff --git a/tvapi/libtv/audio/audio_alsa.h b/tvapi/libtv/audio/audio_alsa.h
index 1a0f1e9..6cd0198 100644
--- a/tvapi/libtv/audio/audio_alsa.h
+++ b/tvapi/libtv/audio/audio_alsa.h
@@ -1,130 +1,127 @@
-#ifndef __TV_AUDIO_ALSA_H__
-#define __TV_AUDIO_ALSA_H__
-
-enum CC_AUD_I2S_MUTE {
- CC_I2S_MUTE_OFF,
- CC_I2S_MUTE_ON,
-};
-
-enum CC_AUD_SPDIF_MUTE {
- CC_SPDIF_MUTE_OFF,
- CC_SPDIF_MUTE_ON,
-};
-
-enum CC_AUD_IN_TYPE {
- CC_AUDIO_IN_SOURCE_LINEIN,
- CC_AUDIO_IN_SOURCE_ATV,
- CC_AUDIO_IN_SOURCE_HDMI,
-};
-
-
-#define CC_MIN_DAC_VOLUME (0)
-#define CC_MAX_DAC_VOLUME (255)
-#define CC_MIN_DAC_SUB_WOOFER_VOLUME (0)
-#define CC_MAX_DAC_SUB_WOOFER_VOLUME (255)
-
-#define CC_MIN_SOUND_BALANCE_VAL (0)
-#define CC_MAX_SOUND_BALANCE_VAL (100)
-#define CC_DEF_SOUND_BALANCE_VAL (50)
-
-#define CC_DAC_MUTE_TYPE_EXTERNAL (1)
-#define CC_DAC_MUTE_TYPE_INTERNAL (2)
-
-#define CC_VOL_TRANS_LUT_BUF_SIZE (101)
-
-static const int CC_AUDIO_MUTE = 1;
-static const int CC_AUDIO_UNMUTE = 0;
-
-enum CC_AUDIO_SOURCE_TYPE {
- AUDIO_HDMI_SOURCE,
- AUDIO_ATV_SOURCE,
- AUDIO_AV_SOURCE,
- AUDIO_MPEG_SOURCE,
- AUDIO_MAX_SOURCE
-};
-
-
-//use tinyalsa,is a like alsa-lib for android
-class CAudioAlsa {
-public:
- CAudioAlsa();
- ~CAudioAlsa();
- int SetAudioInSource(int source_type);
- int GetAudioInSource(void);
- int SetInternalDacLineInSelectChannel(int line_in_number);
- int SetInternalDacLineInCaptureVolume(int l_vol, int r_vol);
- int GetInternalDacLineInCaptureVolume(int vol_buf[]);
- int SetInternalDacLineOutPlayBackVolume(int l_vol, int r_vol);
- int GetInternalDacLineOutPlayBackVolume(int vol_buf[]);
- int SetExternalDacChannelSwitch(int chan_ind, int switch_val);
- int SetExternalDacChannelVolume(int chan_ind, int main_vol);
- int SetExternalDacEQMode(int mode_val);
- int SetI2SMute(int mute_status);
- int SetSPDIFMute(int mute_status);
- int SetHardwareResample(int sr);
- int SetAudioSwitchIO(int value);
- int SetAudioPcmPlaybackVolume(int val);
- int SetAudioPcmPlaybackSwitch(int vol);
-
- int SetOutput_Swap(int value);
-
-
- int SetMixerBypassSwitch(int switch_val);
- int GetMixerBypassSwitch(void);
- int SetMixerDacSwitch(int switch_val);
- int GetMixerDacSwitch(void);
- //dac
- void SetMainVolDigitLutBuf(int digit_lut_buf[]);
- void SetSupperBassVolDigitLutBuf(int digit_lut_buf[]);
- int SetDacMute(int mute_state, int mute_type);
- int SetDacMainVolume(int main_vol);
- int SetDacSupperBassVolume(int tmp_vol);
- int SetDacEQMode(int mode_val);
- int SetBalanceValue(int balance_val);
- int GetBalanceValue();
- int SetMainVolumeGain(int gain_val);
- int GetMainVolumeGain();
- int SetSupperBassVolumeGain(int gain_val);
- int GetSupperBassVolumeGain();
- int SetDacAudioSourceType(int source_type);
- //end dac
-private:
- int get_aml_card();
- int AudioControlSetValue(int val_count, int data_buf[], char *match_names);
- int AudioControlGetValue(int val_count, int ret_buf[], char *match_names);
- int get_USB_Audio_card();
- int HandleUSBAudioControlValue(int val_count, int data_buf[], int match_count, char **match_names);
- int CheckVolume(int digit_vol, int digit_min, int digit_max, int hd_min, int hd_max);
- int GetTwoChannelVolume(int vol_buf[], int l_min_vol, int l_max_vol, int r_min_vol, int r_max_vol, char *match_names, int hd_min, int hd_max);
- int GetLineInMaxVol();
- int GetLineOutMaxVol();
- char *GetAlsaControlName(int get_type);
- //
- int TransVolumeBarVolToDigitalVol(int *, int, int, int, int, int);
- int TransDigitalVolToVolumeBarVol(int *, int, int, int, int, int);
- int CalculateBalanceVol(int, int, int *);
- int SetExternalDacMute(int);
- int SetInternalDacMute(int);
- int setAudioPcmPlaybackMute(int);
- int SetExternalDacMainVolume(int);
- int SetInternalDacMainVolume(int);
- int SetExternalDacSupperBassVolume(int);
- int SetExternalDacEQ(int);
- int LoadExternalDacLib();
- int SendCmdToOffBoardCustomerLibExternalDac(int, int);
- int SendCmdToOffBoardFBCExternalDac(int, int);
- int HandleDigitalVolume(int, int);
- int HandleDigitalMute(int);
- int SetDigitalMainVolume(int);
- int SetDigitalMute(int);
- //
- //mem
- struct mixer *mpMixer;
- struct mixer *mpUsbMixer;
- volatile int mMainVolumeBalanceVal;
- volatile int mMainVolumeGainVal;
- volatile int mSupperBassVolumeGainVal;
- int mMainDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE];
- int mSupperBassDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE];
-};
-#endif //__TV_AUDIO_ALSA_H__
+#ifndef __TV_AUDIO_ALSA_H__
+#define __TV_AUDIO_ALSA_H__
+
+enum CC_AUD_I2S_MUTE {
+ CC_I2S_MUTE_OFF,
+ CC_I2S_MUTE_ON,
+};
+
+enum CC_AUDIO_MUTE_STATUS {
+ CC_MUTE_ON,
+ CC_MUTE_OFF,
+};
+enum CC_AUD_SPDIF_MUTE {
+ CC_SPDIF_MUTE_OFF,
+ CC_SPDIF_MUTE_ON,
+};
+
+enum CC_AUD_IN_TYPE {
+ CC_AUDIO_IN_SOURCE_LINEIN,
+ CC_AUDIO_IN_SOURCE_ATV,
+ CC_AUDIO_IN_SOURCE_HDMI,
+};
+
+
+#define CC_MIN_DAC_VOLUME (0)
+#define CC_MAX_DAC_VOLUME (255)
+#define CC_MIN_DAC_SUB_WOOFER_VOLUME (0)
+#define CC_MAX_DAC_SUB_WOOFER_VOLUME (255)
+
+#define CC_MIN_SOUND_BALANCE_VAL (0)
+#define CC_MAX_SOUND_BALANCE_VAL (100)
+#define CC_DEF_SOUND_BALANCE_VAL (50)
+
+#define CC_DAC_MUTE_TYPE_EXTERNAL (1)
+#define CC_DAC_MUTE_TYPE_INTERNAL (2)
+
+#define CC_VOL_TRANS_LUT_BUF_SIZE (101)
+
+static const int CC_AUDIO_MUTE = 1;
+static const int CC_AUDIO_UNMUTE = 0;
+
+enum CC_AUDIO_SOURCE_TYPE {
+ AUDIO_HDMI_SOURCE,
+ AUDIO_ATV_SOURCE,
+ AUDIO_AV_SOURCE,
+ AUDIO_MPEG_SOURCE,
+ AUDIO_MAX_SOURCE
+};
+
+
+//use tinyalsa,is a like alsa-lib for android
+class CAudioAlsa {
+public:
+ CAudioAlsa();
+ ~CAudioAlsa();
+ int SetAudioInSource(int source_type);
+ int GetAudioInSource(void);
+ int SetAudioInternalDacPGAInGain(int gain_l_val, int gain_r_val);
+ int GetAudioInternalDacPGAInGain(int *gain_l_val, int *gain_r_val);
+ int SetAudioInternalDacADCDigitalCaptureVolume(int vol_l_val, int vol_r_val);
+ int GetAudioInternalDacADCDigitalCaptureVolume(int *vol_l_val, int *vol_r_val);
+ int SetAudioInternalDacDACDigitalPlayBackVolume(int vol_l_val, int vol_r_val);
+ int GetAudioInternalDacDACDigitalPlayBackVolume(int *vol_l_val, int *vol_r_val);
+ int SetInternalDacLineInSelectChannel(int line_in_number);
+ int SetInternalDacLineInCaptureVolume(int l_vol, int r_vol);
+ int GetInternalDacLineInCaptureVolume(int vol_buf[]);
+ int SetInternalDacLineOutPlayBackVolume(int l_vol, int r_vol);
+ int GetInternalDacLineOutPlayBackVolume(int vol_buf[]);
+ int SetExternalDacChannelSwitch(int chan_ind, int switch_val);
+ int SetExternalDacChannelVolume(int chan_ind, int main_vol);
+ int SetExternalDacEQMode(int mode_val);
+ int SetI2SMute(int mute_status);
+ int SetSPDIFMute(int mute_status);
+ int SetHardwareResample(int sr);
+ int SetAudioSwitchIO(int value);
+ int SetAudioPcmPlaybackVolume(int val);
+ int SetAudioPcmPlaybackSwitch(int vol);
+
+ int SetOutput_Swap(int value);
+
+
+ int SetMixerBypassSwitch(int switch_val);
+ int GetMixerBypassSwitch(void);
+ int SetMixerDacSwitch(int switch_val);
+ int GetMixerDacSwitch(void);
+ //dac
+ void SetMainVolDigitLutBuf(int digit_lut_buf[]);
+ int *GetMainVolDigitLutBuf();
+ void SetSupperBassVolDigitLutBuf(int digit_lut_buf[]);
+ int SetMainVolumeGain(int gain_val);
+ int GetMainVolumeGain();
+ int SetSupperBassVolumeGain(int gain_val);
+ int GetSupperBassVolumeGain();
+ int SetInternalDacMute(int);
+ int setAudioPcmPlaybackMute(int);
+ //end dac
+ int TransVolumeBarVolToDigitalVol(int *, int);
+ int TransDigitalVolToVolumeBarVol(int *, int, int, int, int, int);
+ int CalculateBalanceVol(int, int, int *);
+ int SetExternalDacMainVolume(int);
+ int SetInternalDacMainVolume(int);
+ int SetDigitalVolume(int, int);
+ int SetDigitalMainVolume(int, int);
+ int SetDigitalMute(int);
+private:
+ int get_aml_card();
+ int AudioControlSetValue(int val_count, int data_buf[], char *match_names);
+ int AudioControlGetValue(int val_count, int ret_buf[], char *match_names);
+ int get_USB_Audio_card();
+ int HandleUSBAudioControlValue(int val_count, int data_buf[], int match_count, char **match_names);
+ int CheckVolume(int digit_vol, int digit_min, int digit_max, int hd_min, int hd_max);
+ int GetTwoChannelVolume(int vol_buf[], int l_min_vol, int l_max_vol, int r_min_vol, int r_max_vol, char *match_names, int hd_min, int hd_max);
+ int GetLineInMaxVol();
+ int GetLineOutMaxVol();
+ char *GetAlsaControlName(int get_type);
+ //
+ //
+ //mem
+ struct mixer *mpMixer;
+ struct mixer *mpUsbMixer;
+ int mMainVolumeBalanceVal;
+ int mMainVolumeGainVal;
+ int mSupperBassVolumeGainVal;
+ int mMainDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE];
+ int mSupperBassDigitLutBuf[CC_VOL_TRANS_LUT_BUF_SIZE];
+};
+#endif //__TV_AUDIO_ALSA_H__
diff --git a/tvapi/libtv/audio/audio_android.cpp b/tvapi/libtv/audio/audio_android.cpp
deleted file mode 100644
index dc973b4..0000000
--- a/tvapi/libtv/audio/audio_android.cpp
+++ b/dev/null
@@ -1,1035 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <malloc.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <sys/stat.h>
-#include <media/mediarecorder.h>
-#include <system/audio.h>
-#include <android/log.h>
-#include <cutils/properties.h>
-#include <media/AudioSystem.h>
-#include <sys/prctl.h>
-#include <math.h>
-
-#include "audio_cfg.h"
-#include "audio_api.h"
-#include "audio_android.h"
-#include "audio_android_effect.h"
-
-#define msleep(x) usleep(x*1000)
-
-#define LOG_TAG "AndroidAudio"
-#include "CTvLog.h"
-
-#define SOFTWARE_RESAMPLE
-
-#define HDMI_PERIOD_SIZE 1024
-#define PERIOD_SIZE 512
-
-#define debug 0
-//temp buffer between record thread and playback thread
-#define temp_buffer_size 1024*14
-#define mid_buffer_size 1024*7 //reset distance for HDMI
-#define reset_distance 1024*2 //reset distance for atv
-
-
-#ifdef SOFTWARE_RESAMPLE
-#define Upresample_distance 1024*10
-#define Downresample_distance 1024*4
-
-#define period_size 2 //1024*periodsize
-#define resample_ratio 16 // unit:one in a thousand
-#define fraction_bit 16 //16.16 type
-#define upsample_framecount (1024 + resample_ratio)
-#define upsample_ratio (unsigned int)((float)downsample_framecount*65536.0f/(float)1024)
-#define downsample_framecount (1024 - resample_ratio)
-#define downsample_ratio (unsigned int)((float)upsample_framecount*65536.0f/(float)1024)
-#define resample_counter (1024/resample_ratio)
-
-short *resample_temp_buffer = NULL;
-
-const unsigned int FractionStep_up = upsample_ratio;
-const unsigned int FractionStep_down = downsample_ratio;
-unsigned int Upsample_Fraction = 0;
-unsigned int Downsample_Fraction = 0;
-#endif
-
-#if debug == 1
-int record_counter = 0;
-int playback_counter = 0;
-#endif
-
-
-#define HISTORY_BASE (12)
-#define HISTORY_NUM (1<<12)
-static signed history[2][HISTORY_NUM];
-
-//showbo
-static const int CC_AUDIO_SOURCE_IN_HDMI = 0;//just test,not true value
-
-CAndroidAudio::CAndroidAudio(CAudioAlsa *p): mpAudioAlsa(p)
-{
- int mDumpDataFlag = 0;
- int mDumpDataFd = -1;
- mlpRecorder = NULL;
- mlpTracker = NULL;
- temp_buffer = NULL;
- end_temp_buffer = NULL;
- record_write_pointer = NULL;
- playback_read_pointer = NULL;
- gEnableNoiseGate = false;
- gUserSetEnableNoiseGate = false;
- zero_count_left = 2000;
- zero_count_right = 2000;
- NOISE_HIS = 48000 * 5;
- gNoiseGateThresh = 0;
-}
-CAndroidAudio::~CAndroidAudio()
-{
-}
-
-void CAndroidAudio::noise_filter_init()
-{
- memset(history, 0, sizeof(history));
- zero_count_left = 2000;
- zero_count_right = 2000;
-}
-
-signed CAndroidAudio::noise_filter_left(signed sample)
-{
- //if(!enable_noise_filter ||hdmi_src_in)
- // return sample;
- signed sum_left = 0;
- signed sum_right = 0;
- unsigned left_pos = 0;
- unsigned right_pos = 0;
- signed y = 0;
- int i = 0;
- signed sum = 0;
- signed ret_sample;
- signed zero = 0;
- sample <<= 16;
- sample >>= 16;
-#if 0
- if(hdmi_src_in) { //for hdmi src,not use filter and -6db for prevent clip of SRS/other post process.
- ret_sample = Mul28(sample, M3DB);
- return ret_sample;
- } else {
- ret_sample = Mul28(sample, M3DB);
- sample = ret_sample;
- }
-#endif
- sum_left -= history[0][left_pos];
- sum_left += history[0][(left_pos + HISTORY_NUM - 1)
- & ((1 << HISTORY_BASE) - 1)];
- sum = sum_left >> HISTORY_BASE;
- left_pos = (left_pos + 1) & ((1 << HISTORY_BASE) - 1);
- history[0][(left_pos + HISTORY_NUM - 1) & ((1 << HISTORY_BASE) - 1)] =
- sample;
-
- zero = abs(sample - sum);
- if (zero < gNoiseGateThresh) {
- zero_count_left++;
- if (zero_count_left > NOISE_HIS) {
- zero_count_left = NOISE_HIS;
- y = 0;
- } else {
- y = sample;
- }
- } else {
- y = sample;
- zero_count_left = 0;
- }
- return y;
-}
-
-signed CAndroidAudio::noise_filter_right(signed sample)
-{
- //if(!enable_noise_filter ||hdmi_src_in)
- // return sample;
- signed y = 0;
- int i = 0;
- signed ret_sample;
- signed sum = 0;
- sample <<= 16;
- sample >>= 16;
-#if 0
- if(hdmi_src_in) { //for hdmi src,not use filter and -6db for prevent clip of SRS/other post process.
- ret_sample = Mul28(sample, M3DB);
- return ret_sample;
- } else {
- ret_sample = Mul28(sample, M3DB);
- sample = ret_sample;
- }
-#endif
- sum_right -= history[1][right_pos];
- sum_right += history[1][(right_pos + HISTORY_NUM - 1)
- & ((1 << HISTORY_BASE) - 1)];
- sum = sum_right >> HISTORY_BASE;
- right_pos = (right_pos + 1) & ((1 << HISTORY_BASE) - 1);
- history[1][(right_pos + HISTORY_NUM - 1) & ((1 << HISTORY_BASE) - 1)] =
- sample;
-
- if (abs(sample - sum) < gNoiseGateThresh) {
- zero_count_right++;
- if (zero_count_right > NOISE_HIS) {
- zero_count_right = NOISE_HIS;
- y = 0;
- } else {
- y = sample;
- }
- } else {
- y = sample;
- zero_count_right = 0;
- }
- return y;
-}
-
-void CAndroidAudio::DeleteAudioRecorder(void)
-{
-#if ANDROID_PLATFORM_SDK_VERSION < 19
- if (mlpRecorder != NULL) {
- delete mlpRecorder;
- mlpRecorder = NULL;
- }
-#else
- if (mlpRecorder != NULL ) {
- mlpRecorder = NULL;
- }
-
- if (mmpAudioRecorder != NULL ) {
- mmpAudioRecorder.clear();
- }
-#endif
-}
-
-void CAndroidAudio::FreeAudioRecorder(void)
-{
- if (mlpRecorder != NULL) {
- mlpRecorder->stop();
- }
-
- DeleteAudioRecorder();
-}
-
-void CAndroidAudio::DeleteAudioTracker(void)
-{
-#if ANDROID_PLATFORM_SDK_VERSION < 19
- if (mlpTracker != NULL) {
- delete mlpTracker;
- mlpTracker = NULL;
- }
-#else
- if (mlpTracker != NULL ) {
- mlpTracker = NULL;
- }
-
- if (mmpAudioTracker != NULL ) {
- mmpAudioTracker.clear();
- }
-#endif
-}
-
-void CAndroidAudio::FreeAudioTracker(void)
-{
- if (mlpTracker != NULL) {
- mlpTracker->stop();
- }
-
- DeleteAudioTracker();
-}
-
-int CAndroidAudio::InitTempBuffer()
-{
- int tmp_size = 0;
-
- if (NULL == temp_buffer) {
- tmp_size = temp_buffer_size;
- temp_buffer = new short[tmp_size];
- if (NULL == temp_buffer) {
- return -1;
- }
- memset(temp_buffer, 0, tmp_size * sizeof(short));
- end_temp_buffer = temp_buffer + tmp_size;
- record_write_pointer = temp_buffer;
- playback_read_pointer = temp_buffer;
- }
-#ifdef SOFTWARE_RESAMPLE
- if (NULL == resample_temp_buffer) {
- tmp_size = upsample_framecount * 2 * period_size + 10;
- resample_temp_buffer = new short[tmp_size];
- if (NULL == resample_temp_buffer) {
- return -1;
- }
- memset(temp_buffer, 0, tmp_size * sizeof(short));
- }
-#endif
- return 0;
-}
-
-static void MuteTempBuffer()
-{
- if ((NULL != temp_buffer) && (NULL != mlpTracker)) {
- playback_read_pointer = record_write_pointer;
- memset(temp_buffer, 0, temp_buffer_size * sizeof(short));
- for (int i = 0; i < 10; i++) {
- mlpTracker->write(temp_buffer, temp_buffer_size);
- }
- }
-}
-
-void CAndroidAudio::FreeTempBuffer()
-{
- if (temp_buffer != NULL) {
- delete[] temp_buffer;
- temp_buffer = NULL;
- end_temp_buffer = NULL;
- record_write_pointer = NULL;
- playback_read_pointer = NULL;
- }
-#ifdef SOFTWARE_RESAMPLE
- if (resample_temp_buffer != NULL) {
- delete[] resample_temp_buffer;
- resample_temp_buffer = NULL;
- }
-#endif
-}
-
-void CAndroidAudio::ResetRecordWritePointer()
-{
- record_write_pointer = playback_read_pointer;
-}
-
-void CAndroidAudio::ResetPlaybackReadPointer()
-{
- record_write_pointer = playback_read_pointer;
-}
-
-void CAndroidAudio::ResetPointer()
-{
- if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) {
- playback_read_pointer = record_write_pointer - mid_buffer_size;
- if (playback_read_pointer < temp_buffer) {
- playback_read_pointer += temp_buffer_size;
- }
- } else {
- playback_read_pointer = record_write_pointer - reset_distance;
- if (playback_read_pointer < temp_buffer) {
- playback_read_pointer += temp_buffer_size;
- }
- }
-}
-
-// 0: LINEIN 1: HDMI
-void CAndroidAudio::reset_system_framesize(int input_sample_rate, int output_sample_rate)
-{
- int frame_size = 0;
-
- audio_io_handle_t handle = -1;
-
- if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) {
- frame_size = HDMI_PERIOD_SIZE * 4;
- LOGE("Source In:HDMI, Android system audio out framecount: %d \n",
- frame_size);
- } else {
- //msleep(500);
- frame_size = PERIOD_SIZE * 4;
- LOGE("Source In:LIENIN, Android system audio out framecount: %d \n",
- frame_size);
- }
-
- handle = AudioSystem::getInput(AUDIO_SOURCE_MIC, input_sample_rate,
- AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_IN_STEREO, 0);
-
- if (handle > 0) {
- char str[64];
- memset(str, 0, sizeof(str));
- sprintf(str, "frame_count=%d", frame_size);
- LOGE("input handle number: %d \n", handle);
- AudioSystem::setParameters(handle, String8(str));
- } else {
- LOGE("Can't get input handle! \n");
- }
-
- handle = -1;
-
- handle = AudioSystem::getOutput(AUDIO_STREAM_MUSIC, output_sample_rate,
- AUDIO_FORMAT_PCM_16_BIT, AUDIO_CHANNEL_OUT_STEREO,
- AUDIO_OUTPUT_FLAG_NONE);
-
- if (handle > 0) {
- char str[64];
- memset(str, 0, sizeof(str));
- sprintf(str, "frame_count=%d", frame_size);
- LOGE("output handle number: %d \n", handle);
- AudioSystem::setParameters(handle, String8(str));
- } else {
- LOGE("Can't get output handle! \n");
- }
-}
-
-inline short CAndroidAudio::clip(int x) //Clip from 16.16 fixed-point to 0.15 fixed-point.
-{
- if (x < -32768)
- return -32768;
- else if (x > 32767)
- return 32767;
- else
- return x;
-}
-
-int CAndroidAudio::upsample(short *input, short *output, unsigned int FractionStep,
- unsigned int input_frame_size, unsigned int frac)
-{
- unsigned int inputIndex = 1;
- unsigned int outputIndex = 0;
-
- while (inputIndex < input_frame_size) {
- *output++ = clip(
- input[2 * inputIndex - 2]
- + (((input[2 * inputIndex] - input[2 * inputIndex - 2])
- * (int32_t) frac) >> 16));
- *output++ = clip(
- input[2 * inputIndex - 1]
- + (((input[2 * inputIndex + 1]
- - input[2 * inputIndex - 1]) * (int32_t) frac)
- >> 16));
-
- frac += FractionStep;
- inputIndex += (frac >> 16);
- frac = (frac & 0xffff);
- outputIndex++;
- }
-
- return outputIndex;
-}
-
-int CAndroidAudio::downsample(short *input, short *output, unsigned int FractionStep,
- unsigned int input_frame_size, unsigned int frac)
-{
- unsigned int inputIndex = 1;
- unsigned int outputIndex = 0;
-
- while (inputIndex < input_frame_size) {
- *output++ = clip(
- input[2 * inputIndex - 2]
- + (((input[2 * inputIndex] - input[2 * inputIndex - 2])
- * (int32_t) frac) >> 16));
- *output++ = clip(
- input[2 * inputIndex - 1]
- + (((input[2 * inputIndex + 1]
- - input[2 * inputIndex - 1]) * (int32_t) frac)
- >> 16));
-
- frac += FractionStep;
- inputIndex += (frac >> 16);
- frac = (frac & 0xffff);
- outputIndex++;
- }
-
- return outputIndex;
-}
-
-int CAndroidAudio::GetWriteSpace(short volatile *WritePoint,
- short volatile *ReadPoint)
-{
- unsigned int space;
-
- if (WritePoint >= ReadPoint)
- space = temp_buffer_size - (WritePoint - ReadPoint);
- else
- space = ReadPoint - WritePoint;
-
- return space;
-}
-int CAndroidAudio::GetReadSpace(short volatile *WritePoint, short volatile *ReadPoint)
-{
- unsigned int space;
-
- if (WritePoint >= ReadPoint)
- space = WritePoint - ReadPoint;
- else
- space = temp_buffer_size - (ReadPoint - WritePoint);
-
- return space;
-}
-
-void CAndroidAudio::recorderCallback(int event, void *user, void *info)
-{
- if (AudioRecord::EVENT_MORE_DATA == event) {
- AudioRecord::Buffer *pbuf = (AudioRecord::Buffer *) info;
-
- if (NULL == mlpRecorder)
- return;
-
- unsigned int offset_bytes = 2
- * (end_temp_buffer - record_write_pointer);
- unsigned int copy_bytes;
- unsigned int output_bytes;
-
- int available_write_space;
- available_write_space = GetWriteSpace(record_write_pointer,
- playback_read_pointer);
-
- //LOGE("~~~~~available_write_space = %d \n", available_write_space);
-
- if (available_write_space < pbuf->size / 2) {
- LOGE(
- "[%s]: ***** FULL! *****\n\trd=0x%x, wr=0x%x, wr_lvl = 0x%x, wr_req = 0x%x\n",
- __FUNCTION__, playback_read_pointer, record_write_pointer,
- available_write_space, pbuf->size / 2);
-
- if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) {
- playback_read_pointer += mid_buffer_size;
- if (playback_read_pointer >= end_temp_buffer) {
- playback_read_pointer -= temp_buffer_size;
- }
- } else {
- playback_read_pointer += (temp_buffer_size - reset_distance);
- if (playback_read_pointer >= end_temp_buffer) {
- playback_read_pointer -= temp_buffer_size;
- }
- }
- return;
- }
-#if debug == 1
- if(record_counter > 500) {
- LOGE("~~~~~RecordCallback, pbuf->size:%d, pbuf->frameCount:%d", pbuf->size, pbuf->frameCount);
- record_counter = 0;
- } else {
- record_counter++;
- }
-#endif
-
-#ifdef SOFTWARE_RESAMPLE
- if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) {
- if (available_write_space <= Downresample_distance) {
- output_bytes = 4
- * downsample((short *) pbuf->raw, resample_temp_buffer,
- FractionStep_down, pbuf->frameCount,
- Downsample_Fraction);
-
- LOGE(
- "downsample: output_framecount = %d, input_frameCount = %d\n",
- output_bytes / 4, pbuf->frameCount);
-
- if (offset_bytes >= output_bytes) {
- memcpy((short *) record_write_pointer, resample_temp_buffer,
- output_bytes);
- record_write_pointer += output_bytes / 2;
-
- if (record_write_pointer == end_temp_buffer)
- record_write_pointer = temp_buffer;
- } else {
- memcpy((short *) record_write_pointer, resample_temp_buffer,
- offset_bytes);
- copy_bytes = offset_bytes;
- offset_bytes = output_bytes - copy_bytes;
- record_write_pointer = temp_buffer;
- memcpy((short *) record_write_pointer,
- resample_temp_buffer + (copy_bytes / 2),
- offset_bytes);
- record_write_pointer += offset_bytes / 2;
- }
- return;
- } else if (available_write_space >= Upresample_distance) {
- output_bytes = 4
- * upsample((short *) pbuf->raw, resample_temp_buffer,
- FractionStep_up, pbuf->frameCount,
- Upsample_Fraction);
-
- LOGE(
- "upsample: output_framecount = %d, input_frameCount = %d\n",
- output_bytes / 4, pbuf->frameCount);
-
- if (offset_bytes >= output_bytes) {
- memcpy((short *) record_write_pointer, resample_temp_buffer,
- output_bytes);
- record_write_pointer += output_bytes / 2;
-
- if (record_write_pointer == end_temp_buffer)
- record_write_pointer = temp_buffer;
- } else {
- memcpy((short *) record_write_pointer, resample_temp_buffer,
- offset_bytes);
- copy_bytes = offset_bytes;
- offset_bytes = output_bytes - copy_bytes;
- record_write_pointer = temp_buffer;
- memcpy((short *) record_write_pointer,
- resample_temp_buffer + (copy_bytes / 2),
- offset_bytes);
- record_write_pointer += offset_bytes / 2;
- }
- return;
- }
-
- Upsample_Fraction = 0;
- Downsample_Fraction = 0;
- }
-#endif
-
- if (offset_bytes >= pbuf->size) {
- memcpy((short *) record_write_pointer, pbuf->raw, pbuf->size);
- record_write_pointer += pbuf->size / 2;
-
- if (record_write_pointer == end_temp_buffer)
- record_write_pointer = temp_buffer;
- } else {
- memcpy((short *) record_write_pointer, pbuf->raw, offset_bytes);
- copy_bytes = offset_bytes;
- offset_bytes = pbuf->size - copy_bytes;
- record_write_pointer = temp_buffer;
- memcpy((short *) record_write_pointer,
- (short *) pbuf->raw + (copy_bytes / 2), offset_bytes);
- record_write_pointer += offset_bytes / 2;
- }
-
- //LOGD("--------RecordCallback, pbuf->size:%d, pbuf->frameCount:%d\n", pbuf->size, pbuf->frameCount);
- //LOGD("--------Record----offset_bytes:%d\n", 2*(record_write_pointer-temp_buffer));
-
- } else if (AudioRecord::EVENT_OVERRUN == event) {
- LOGE("[%s]: AudioRecord::EVENT_OVERRUN\n", __FUNCTION__);
- } else if (AudioRecord::EVENT_MARKER == event) {
- LOGD("[%s]: AudioRecord::EVENT_MARKER\n", __FUNCTION__);
- } else if (AudioRecord::EVENT_NEW_POS == event) {
- LOGD("[%s]: AudioRecord::EVENT_NEW_POS\n", __FUNCTION__);
- }
-}
-
-void CAndroidAudio::trackerCallback(int event, void *user, void *info)
-{
- if (AudioTrack::EVENT_MORE_DATA == event) {
- AudioTrack::Buffer *pbuf = (AudioTrack::Buffer *) info;
-
- if (NULL == mlpTracker)
- return;
-
- int available_read_space;
- available_read_space = GetReadSpace(record_write_pointer,
- playback_read_pointer);
-
- //LOGE("~~~~~available_read_space = %d input_bytes = %d \n", available_read_space,input_bytes);
-
- if (available_read_space < pbuf->size / 2) {
- LOGE(
- "[%s]: ***** EMPTY *****\n\trd=0x%x, wr=0x%x, rd_lvl=0x%x, rd_req=0x%x*****\n",
- __FUNCTION__, playback_read_pointer, record_write_pointer,
- available_read_space, pbuf->size / 2);
-
- if (mpAudioAlsa->GetAudioInSource() == CC_AUDIO_SOURCE_IN_HDMI) {
- playback_read_pointer -= mid_buffer_size;
- if (playback_read_pointer < temp_buffer)
- playback_read_pointer += temp_buffer_size;
- } else {
- playback_read_pointer -= reset_distance;
- if (playback_read_pointer < temp_buffer)
- playback_read_pointer += temp_buffer_size;
- }
-
- } else {
- unsigned int offset_bytes = 2
- * (end_temp_buffer - playback_read_pointer);
- unsigned int copy_bytes;
- int sampNum;
-
- if (offset_bytes >= pbuf->size) {
- if (gEnableNoiseGate) {
- sampNum = pbuf->size / 2;
- for (int i = 0; i < sampNum; i++) {
- pbuf->i16[i] = (short) noise_filter_left(
- (signed) (playback_read_pointer[i]));
- i++;
- pbuf->i16[i] = (short) noise_filter_left(
- (signed) (playback_read_pointer[i]));
- }
- } else {
- memcpy(pbuf->raw, (short *) playback_read_pointer,
- pbuf->size);
- }
-
- memset((void *) playback_read_pointer, 0, pbuf->size);
- playback_read_pointer += pbuf->size / 2;
-
- if (playback_read_pointer == end_temp_buffer)
- playback_read_pointer = temp_buffer;
- } else {
- if (gEnableNoiseGate) {
- sampNum = offset_bytes / 2;
- for (int i = 0; i < sampNum; i++) {
- pbuf->i16[i] = (short) noise_filter_left(
- (signed) (playback_read_pointer[i]));
- i++;
- pbuf->i16[i] = (short) noise_filter_left(
- (signed) (playback_read_pointer[i]));
- }
- } else {
- memcpy(pbuf->raw, (short *) playback_read_pointer,
- offset_bytes);
- }
-
- memset((void *) playback_read_pointer, 0, offset_bytes);
- copy_bytes = offset_bytes;
- offset_bytes = pbuf->size - copy_bytes;
- playback_read_pointer = temp_buffer;
-
- if (gEnableNoiseGate) {
- short *pSrcPtr = &(pbuf->i16[copy_bytes / 2]);
- sampNum = offset_bytes / 2;
- for (int i = 0; i < sampNum; i++) {
- pSrcPtr[i] = (short) noise_filter_left(
- (signed) (playback_read_pointer[i]));
- i++;
- pSrcPtr[i] = (short) noise_filter_left(
- (signed) (playback_read_pointer[i]));
- }
- } else {
- memcpy((short *) pbuf->raw + (copy_bytes / 2),
- (short *) playback_read_pointer, offset_bytes);
- }
- memset((void *) playback_read_pointer, 0, offset_bytes);
- playback_read_pointer += offset_bytes / 2;
- }
- DoDumpData(pbuf->raw, pbuf->size);
-
-#if debug == 1
- if(playback_counter > 500) {
- LOGE("----PlaybackCallback, pbuf->size:%d, pbuf->frameCount:%d", pbuf->size, pbuf->frameCount);
- playback_counter = 0;
- } else {
- playback_counter++;
- }
-#endif
-
- }
- //LOGE("---Playback---offset_bytes:%d\n", 2*(playback_read_pointer-temp_buffer));
- } else if (AudioTrack::EVENT_UNDERRUN == event) {
- LOGE("[%s]: AudioTrack::EVENT_UNDERRUN\n", __FUNCTION__);
- } else if (AudioTrack::EVENT_LOOP_END == event) {
- LOGD("[%s]: AudioTrack::EVENT_LOOP_END\n", __FUNCTION__);
- } else if (AudioTrack::EVENT_MARKER == event) {
- LOGD("[%s]: AudioTrack::EVENT_MARKER\n", __FUNCTION__);
- } else if (AudioTrack::EVENT_NEW_POS == event) {
- LOGD("[%s]: AudioTrack::EVENT_NEW_POS\n", __FUNCTION__);
- } else if (AudioTrack::EVENT_BUFFER_END == event) {
- LOGD("[%s]: AudioTrack::EVENT_BUFFER_END\n", __FUNCTION__);
- }
-}
-
-int CAndroidAudio::initAudioTracker(int sr)
-{
- status_t ret;
- int tmp_session_id = 0;
-
- if (NULL != mlpTracker) {
- LOGE("[%s:%d] Trying to new AudioTrack while it's still not NULL.\n",
- __FUNCTION__, __LINE__);
- goto err_exit;
- }
-
-#if ANDROID_PLATFORM_SDK_VERSION < 19
- mlpTracker = new AudioTrack();
- if (NULL == mlpTracker) {
- LOGE("[%s:%d] Failed to new AudioTrack.\n", __FUNCTION__, __LINE__);
- goto err_exit;
- }
-#else
- mmpAudioTracker = new AudioTrack();
- mlpTracker = mmpAudioTracker.get();
-#endif
-
- tmp_session_id = amAndroidGetAudioSessionId();
- ret = mlpTracker->set(AUDIO_STREAM_DEFAULT, //inputSource
- sr, //sampleRate
- AUDIO_FORMAT_PCM_16_BIT, //format
- AUDIO_CHANNEL_IN_STEREO, //channelMask
- 0, //frameCount
- AUDIO_OUTPUT_FLAG_NONE, //flags
- trackerCallback, //trackerCallback,
- NULL, //user when callback
- 0, //notificationFrames
- NULL, //shared buffer
- false, //threadCanCallJava
- tmp_session_id //sessionId
- );
-
- if (NO_ERROR != ret) {
- LOGE("[%s:%d] Failed to set AudioTrack parameters. status=%d\n",
- __FUNCTION__, __LINE__, ret);
- goto err_exit;
- }
-
- ret = mlpTracker->initCheck();
- if (NO_ERROR != ret) {
- LOGE("[%s:%d] Failed to init AudioTrack. status=%d\n", __FUNCTION__,
- __LINE__, ret);
- goto err_exit;
- }
-
- mlpTracker->start();
- ResetPointer();
-
-#if debug == 1
- uint32_t frame_count;
- frame_count = mlpTracker->frameCount();
- LOGE("~~~~~~[%s:%d] frame_count = %u\n", __FUNCTION__, __LINE__, frame_count);
-#endif
-
- return 0;
-
-err_exit: //
- DeleteAudioTracker();
-
- return -1;
-}
-
-int CAndroidAudio::initAudioRecorder(int sr)
-{
- status_t ret;
-
- if (NULL != mlpRecorder) {
- LOGE("[%s:%d] Trying to new AudioRecord while it's still not NULL.\n",
- __FUNCTION__, __LINE__);
- goto err_exit;
- }
-
-#if ANDROID_PLATFORM_SDK_VERSION < 19
- mlpRecorder = new AudioRecord();
- if (NULL == mlpRecorder) {
- LOGE("[%s:%d] Failed to new AudioRecord.\n", __FUNCTION__, __LINE__);
- goto err_exit;
- }
-#else
- mmpAudioRecorder = new AudioRecord();
- mlpRecorder = mmpAudioRecorder.get();
-#endif
-
- ret = mlpRecorder->set(AUDIO_SOURCE_DEFAULT, //inputSource
- sr, //sampleRate
- AUDIO_FORMAT_PCM_16_BIT, //format
- AUDIO_CHANNEL_IN_STEREO, //channelMask
- 0, //frameCount
- recorderCallback, //callback_t
- NULL, //void* user
- 0, //notificationFrames,
- false, //threadCanCallJava
- 0 //sessionId
- );
-
- if (NO_ERROR != ret) {
- LOGE("[%s:%d] Failed to set AudioRecord parameters. status=%d\n",
- __FUNCTION__, __LINE__, ret);
- goto err_exit;
- }
-
- ret = mlpRecorder->initCheck();
- if (NO_ERROR != ret) {
- LOGE("[%s:%d] Failed to init AudioRecord. status=%d\n", __FUNCTION__,
- __LINE__, ret);
- goto err_exit;
- }
-
- ret = mlpRecorder->start();
- if (NO_ERROR != ret) {
- LOGE("[%s:%d] Failed to start AudioRecord. status=%d\n", __FUNCTION__,
- __LINE__, ret);
- goto err_exit;
- }
-#if debug == 1
- uint32_t frame_count;
- frame_count = mlpRecorder->frameCount();
- LOGE("~~~~~~[%s:%d] frame_count = %u\n", __FUNCTION__, __LINE__, frame_count);
-#endif
-
- return 0;
-err_exit: //
- DeleteAudioRecorder();
- return -1;
-}
-
-int CAndroidAudio::amAndroidInit(int tm_sleep, int init_flag, int recordSr, int trackSr,
- bool enable_noise_gate)
-{
- int tmp_ret;
- LOGD("Enter amAndroidInit function.\n");
-
- amAndroidUninit(0);
-
- // Init the noise gate filter
- gUserSetEnableNoiseGate = enable_noise_gate;
- if (enable_noise_gate && (gNoiseGateThresh > 0)
- && GetAudioNoiseGateEnableCFG()) {
- gEnableNoiseGate = true;
- noise_filter_init();
- } else {
- gEnableNoiseGate = false;
- }
- LOGE("[%s:%d] noise gate enabled:%d!\n", __FUNCTION__, __LINE__,
- gEnableNoiseGate);
-
- if (InitTempBuffer() != 0) {
- LOGE("[%s:%d] Failed to create temp_buffer!\n", __FUNCTION__, __LINE__);
- return 0;
- }
-
- if (init_flag & CC_FLAG_CREATE_RECORD) {
- //LOGD("Start to create Recorder. RecordSr:%d\n", recordSr);
- if (0 != initAudioRecorder(recordSr)) {
- LOGE(" [%s:%d] Created AudioRecorder disable !\n", __FUNCTION__,
- __LINE__);
- return -1;
- }
- //LOGD("[%s:%d] End to create recorder.\n", __FUNCTION__, __LINE__);
- }
-
- if (init_flag & CC_FLAG_CREATE_TRACK) {
- //LOGD("Start to create Tracker. TrackSr:%d\n", trackSr);
- if (0 != initAudioTracker(trackSr)) {
- //FreeAudioRecorder();
- //FreeAudioTracker();
- LOGE(" [%s:%d] Created AudioTrack disable !\n", __FUNCTION__,
- __LINE__);
- return -1;
- }
- //LOGD("[%s:%d] End to create recorder.\n", __FUNCTION__, __LINE__);
- }
-
- if (tm_sleep > 0)
- sleep(tm_sleep);
-
- LOGD("Exit amAndroidInit function sucess.\n");
-
- return 0;
-}
-
-int CAndroidAudio::amAndroidUninit(int tm_sleep)
-{
- LOGD("Enter amAndroidUninit function.\n");
-
- FreeAudioRecorder();
- // MuteTempBuffer();
- FreeAudioTracker();
- FreeTempBuffer();
-
- if (tm_sleep > 0)
- sleep(tm_sleep);
-
- LOGD("Exit amAndroidUninit function sucess.\n");
-
- return 0;
-}
-
-int CAndroidAudio::amAndroidSetRecorderSr(int sr)
-{
- int ret;
- FreeAudioRecorder();
- ResetRecordWritePointer();
- return initAudioRecorder(sr);
-}
-
-int CAndroidAudio::amAndroidSetTrackerSr(int sr)
-{
- FreeAudioTracker();
- ResetPlaybackReadPointer();
- return initAudioTracker(sr);
-}
-
-//
-// Set the noise gate threshold.
-// If it's set to 0, the noise gate filter is disabled.
-// Theoretically, this variable should be protected by mutex. But this API
-// is designed to be called once on system boot, or for debug purpose, and it's
-// set only through this API. To improve the performance of the filters, we
-// don't utilize any mutex here.
-void CAndroidAudio::amAndroidSetNoiseGateThreshold(int thresh)
-{
- int upperBound = GetAudioNoiseGateUpperBoundCFG();
- int forcedThresh = GetAudioNoiseGateThresholdCFG();
- if (forcedThresh >= 0) {
- LOGE("Force noise gate threshold from %d to %d\n", thresh,
- forcedThresh);
- thresh = forcedThresh;
- }
-
- if ((thresh >= 0) && (thresh <= upperBound)) {
- gNoiseGateThresh = thresh;
- } else {
- gNoiseGateThresh = 0;
- }
-
- if (gUserSetEnableNoiseGate && (gNoiseGateThresh > 0)
- && GetAudioNoiseGateEnableCFG()) {
- gEnableNoiseGate = true;
- } else {
- gEnableNoiseGate = false;
- }
- LOGE(
- "[%s:%d] thresh:%d, upperBound:%d, gNoiseGateThresh:%d, gEnableNoiseGate:%d\n",
- __FUNCTION__, __LINE__, thresh, upperBound, gNoiseGateThresh,
- gEnableNoiseGate);
-}
-
-int CAndroidAudio::amAndroidSetDumpDataFlag(int tmp_flag)
-{
- mDumpDataFlag = tmp_flag;
- return mDumpDataFlag;
-}
-
-int CAndroidAudio::amAndroidGetDumpDataFlag()
-{
- return mDumpDataFlag;
-}
-
-void CAndroidAudio::DoDumpData(void *data_buf, int size)
-{
- int tmp_flag = 0;
- char prop_value[PROPERTY_VALUE_MAX];
-
- if (amAndroidGetDumpDataFlag() == 0) {
- return;
- }
-
- memset(prop_value, '\0', PROPERTY_VALUE_MAX);
-
- property_get("audio.dumpdata.en", prop_value, "null");
- if (strcasecmp(prop_value, "null") == 0
- || strcasecmp(prop_value, "0") == 0) {
- if (mDumpDataFd >= 0) {
- close(mDumpDataFd);
- mDumpDataFd = -1;
- }
-
- return;
- }
-
- memset(prop_value, '\0', PROPERTY_VALUE_MAX);
-
- property_get("audio.dumpdata.path", prop_value, "null");
- if (strcasecmp(prop_value, "null") == 0) {
- return;
- }
-
- if (mDumpDataFd < 0) {
- if (access(prop_value, 0) == 0) {
- mDumpDataFd = open(prop_value, O_RDWR | O_SYNC);
- if (mDumpDataFd < 0) {
- LOGE("%s, Open device file \"%s\" error: %s.\n", __FUNCTION__,
- prop_value, strerror(errno));
- return;
- }
- } else {
- mDumpDataFd = open(prop_value, O_WRONLY | O_CREAT | O_EXCL,
- S_IRUSR | S_IWUSR);
- if (mDumpDataFd < 0) {
- LOGE("%s, Create device file \"%s\" error: %s.\n", __FUNCTION__,
- prop_value, strerror(errno));
- return;
- }
- }
- }
-
- write(mDumpDataFd, data_buf, size);
-}
-
diff --git a/tvapi/libtv/audio/audio_android.h b/tvapi/libtv/audio/audio_android.h
deleted file mode 100644
index 298ab8f..0000000
--- a/tvapi/libtv/audio/audio_android.h
+++ b/dev/null
@@ -1,78 +0,0 @@
-#ifndef __TV_AUDIO_ANDROID_H__
-#define __TV_AUDIO_ANDROID_H__
-
-#define CC_FLAG_CREATE_RECORD (0x0001)
-#define CC_FLAG_CREATE_TRACK (0x0002)
-#include "audio_alsa.h"
-#include <media/AudioRecord.h>
-#include <media/AudioTrack.h>
-
-using namespace android;
-
-
-class CAndroidAudio {
-public:
- CAndroidAudio(CAudioAlsa *);
- ~CAndroidAudio();
- int amAndroidInit(int tm_sleep, int init_flag, int recordSr, int trackSr,
- bool enable_noise_gat);
- int amAndroidUninit(int tm_sleep);
- int amAndroidSetRecorderSr(int sr);
- int amAndroidSetTrackerSr(int sr);
- int amAndroidSetDumpDataFlag(int tmp_flag);
- int amAndroidGetDumpDataFlag();
- void amAndroidSetNoiseGateThreshold(int thresh);
- void reset_system_framesize(int input_sample_rate, int output_sample_rate);
-
-private:
- void DoDumpData(void *data_buf, int size);
- void noise_filter_init();
- int noise_filter_left(int);
- int noise_filter_right(int);
- void DeleteAudioRecorder();
- void FreeAudioRecorder();
- void DeleteAudioTracker();
- void FreeAudioTracker();
- int InitTempBuffer();
- void FreeTempBuffer();
- void ResetRecordWritePointer();
- void ResetPlaybackReadPointer();
- void ResetPointer();
- short int clip(int);
- int upsample(short int *, short int *, unsigned int, unsigned int, unsigned int);
- int downsample(short int *, short int *, unsigned int, unsigned int, unsigned int);
- int GetWriteSpace(volatile short int *, volatile short int *);
- int GetReadSpace(volatile short int *, volatile short int *);
- void recorderCallback(int, void *, void *);
- void trackerCallback(int, void *, void *);
- int initAudioTracker(int);
- int initAudioRecorder(int);
-
- CAudioAlsa *mpAudioAlsa;
- int mDumpDataFlag;
- int mDumpDataFd;
- AudioRecord *mlpRecorder;
- AudioTrack *mlpTracker;
-
-#if ANDROID_PLATFORM_SDK_VERSION >= 19
- sp<AudioTrack> mmpAudioTracker;
- sp<AudioRecord> mmpAudioRecorder;
-#endif
-
- short *temp_buffer;
- short *end_temp_buffer;
- short volatile *record_write_pointer;
- short volatile *playback_read_pointer;
-
- ///////////////////////////////////////////////////////////////////////////////
- // Helpers for the noise gate.
- bool gEnableNoiseGate;
- bool gUserSetEnableNoiseGate;
- unsigned zero_count_left;
- unsigned zero_count_right;
- unsigned NOISE_HIS;
- signed gNoiseGateThresh;
-};
-
-
-#endif //__TV_AUDIO_ANDROID_H__
diff --git a/tvapi/libtv/audio/audio_android_effect.cpp b/tvapi/libtv/audio/audio_android_effect.cpp
deleted file mode 100644
index aeb42eb..0000000
--- a/tvapi/libtv/audio/audio_android_effect.cpp
+++ b/dev/null
@@ -1,591 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <malloc.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <sys/stat.h>
-#include <android/log.h>
-#include <sys/prctl.h>
-
-#include "audio_android_effect.h"
-
-#define msleep(x) usleep(x*1000)
-
-#define INVALID_EQ_FORCED_GAIN (0x7FFFFFFF)
-
-#define LOG_TAG "CAndroidEffect"
-#include "CTvLog.h"
-
-using namespace android;
-
-// For some special cases, we want some band of the EQ to be forced to a specific
-// gain. When the value in this array is not invalid, the gain of the corresponding
-// band will be forced to this value.
-CAndroidEffect::CAndroidEffect()
-{
- mplpAudioEffectSrs = NULL;
- mplpAudioEffectEq = NULL;
- mTrackerSessionId = 0;
-}
-
-CAndroidEffect::~CAndroidEffect()
-{
-}
-
-static void audioEffectCallback(int32_t event, void *user, void *info)
-{
- LOGD("[%s:%d]", __FUNCTION__, __LINE__);
-}
-
-void CAndroidEffect::FreeAudioEffect(AudioEffect **pEffect)
-{
- if ((*pEffect) != NULL) {
- (*pEffect)->setEnabled(false);
- delete (*pEffect);
- (*pEffect) = NULL;
- }
-}
-
-void CAndroidEffect::initAudioEffect(AudioEffect **pEffect,
- const effect_uuid_t *const pEffectType,
- const effect_uuid_t *const pEffectUuid, int sessionId)
-{
- if (NULL != (*pEffect)) {
- LOGE("[%s:%d] AudioEffect is not NULL. Free it first.\n", __FUNCTION__,
- __LINE__);
- FreeAudioEffect(pEffect);
- }
-
- status_t status;
-
- (*pEffect) = new AudioEffect();
- if (NULL == (*pEffect)) {
- LOGE("[%s:%d] Failed to create audio effect.\n", __FUNCTION__,
- __LINE__);
- goto err_exit;
- }
-
- status = (*pEffect)->set(pEffectType, //type
- pEffectUuid, //uuid
- 0, //priority
- audioEffectCallback, //cbf
- NULL, //user
- sessionId, //sessionId
- 0 // default output device
- );
-
- if (NO_ERROR != status) {
- LOGE("[%s:%d] Failed to set audio effect parameters.\n", __FUNCTION__,
- __LINE__);
- goto err_exit;
- }
-
- status = (*pEffect)->initCheck();
- if (NO_ERROR != status) {
- LOGE("[%s:%d] Failed to init audio effect.\n", __FUNCTION__, __LINE__);
- goto err_exit;
- }
-
- status = (*pEffect)->setEnabled(true);
- if (NO_ERROR != status) {
- LOGE("[%s:%d] Failed to enable audio effect.\n", __FUNCTION__,
- __LINE__);
- goto err_exit;
- }
-
- return;
-
-err_exit:
- if (NULL != (*pEffect)) {
- delete (*pEffect);
- (*pEffect) = NULL;
- }
-}
-
-int CAndroidEffect::setSrsParameterInt(tshd_srs_param_t param, unsigned value)
-{
- if (NULL == mplpAudioEffectSrs) {
- return -1;
- }
-
- status_t status;
- effect_param_t *pParam = (effect_param_t *) malloc(
- sizeof(effect_param_t) + sizeof(unsigned) + sizeof(unsigned));
- if (NULL == pParam) {
- LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__);
- return -1;
- }
- pParam->status = 0;
- pParam->psize = sizeof(unsigned);
- pParam->vsize = sizeof(unsigned);
- *(unsigned *) (&pParam->data[0]) = (unsigned) param;
- *(unsigned *) (&pParam->data[sizeof(unsigned)]) = value;
- status = mplpAudioEffectSrs->setParameter(pParam);
- if (NO_ERROR != status) {
- LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__, __LINE__,
- param);
- free(pParam);
- return -1;
- } else {
- free(pParam);
- return 0;
- }
-}
-
-int CAndroidEffect::getSrsParameterInt(tshd_srs_param_t param, unsigned *value)
-{
- if (NULL == mplpAudioEffectSrs) {
- return -1;
- }
-
- status_t status;
- effect_param_t *pParam = (effect_param_t *) malloc(
- sizeof(effect_param_t) + sizeof(unsigned) + sizeof(unsigned));
- if (NULL == pParam) {
- LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__);
- return -1;
- }
- pParam->status = 0;
- pParam->psize = sizeof(unsigned);
- pParam->vsize = sizeof(unsigned);
- *(unsigned *) (&pParam->data[0]) = (unsigned) param;
- status = mplpAudioEffectSrs->getParameter(pParam);
- if (NO_ERROR != status) {
- LOGE("[%s:%d]Failed to get parameter:%d!\n", __FUNCTION__, __LINE__,
- param);
- *value = 0;
- free(pParam);
- return -1;
- } else {
- *value = *(unsigned *) (&pParam->data[sizeof(unsigned)]);
- free(pParam);
- return 0;
- }
-}
-
-int CAndroidEffect::setSrsParameterFloat(tshd_srs_param_t param, float value)
-{
- if (NULL == mplpAudioEffectSrs) {
- return -1;
- }
-
- status_t status;
- effect_param_t *pParam = (effect_param_t *) malloc(
- sizeof(effect_param_t) + sizeof(unsigned) + sizeof(float));
- if (NULL == pParam) {
- LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__);
- return -1;
- }
- pParam->status = 0;
- pParam->psize = sizeof(unsigned);
- pParam->vsize = sizeof(float);
- *(unsigned *) (&pParam->data[0]) = (unsigned) param;
- *(float *) (&pParam->data[sizeof(unsigned)]) = value;
- status = mplpAudioEffectSrs->setParameter(pParam);
- if (NO_ERROR != status) {
- LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__, __LINE__,
- param);
- free(pParam);
- return -1;
- } else {
- free(pParam);
- return 0;
- }
-}
-
-int CAndroidEffect::getSrsParameterFloat(tshd_srs_param_t param, float *value)
-{
- if (NULL == mplpAudioEffectSrs) {
- return -1;
- }
-
- status_t status;
- effect_param_t *pParam = (effect_param_t *) malloc(
- sizeof(effect_param_t) + sizeof(unsigned) + sizeof(float));
- if (NULL == pParam) {
- LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__);
- return -1;
- }
- pParam->status = 0;
- pParam->psize = sizeof(unsigned);
- pParam->vsize = sizeof(float);
- *(unsigned *) (&pParam->data[0]) = (unsigned) param;
- status = mplpAudioEffectSrs->getParameter(pParam);
- if (NO_ERROR != status) {
- LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__, __LINE__,
- param);
- *value = 0.0f;
- free(pParam);
- return -1;
- } else {
- *value = *(float *) (&pParam->data[sizeof(unsigned)]);
- free(pParam);
- return 0;
- }
-}
-
-int CAndroidEffect::amAndroidSetSrsParameterInt(tshd_srs_param_t param, unsigned value)
-{
- return setSrsParameterInt(param, value);
-}
-
-int CAndroidEffect::amAndroidGetSrsParameterInt(tshd_srs_param_t param,
- unsigned *value)
-{
- return getSrsParameterInt(param, value);
-}
-
-int CAndroidEffect::amAndroidSetSrsParameterFloat(tshd_srs_param_t param, float value)
-{
- return setSrsParameterFloat(param, value);
-}
-
-int CAndroidEffect::amAndroidGetSrsParameterFloat(tshd_srs_param_t param, float *value)
-{
- return getSrsParameterFloat(param, value);
-}
-
-int CAndroidEffect::amAndroidNewSRSAudioEffect(void)
-{
- if ((NULL == mplpAudioEffectSrs) && (GetAudioSRSModuleDisableCFG() == 0)) {
- initAudioEffect(&mplpAudioEffectSrs, NULL, SL_IID_SRS,
- mTrackerSessionId);
- if (NULL == mplpAudioEffectSrs) {
- LOGE("[%s:%d] Failed to create audio effect SRS!\n", __FUNCTION__,
- __LINE__);
- return -1;
- }
- }
-
- return 0;
-}
-
-int CAndroidEffect::amAndroidNewEQAudioEffect(void)
-{
- if ((NULL == mplpAudioEffectEq) && (GetAudioEqModuleDisableCFG() == 0)) {
- if (GetAudioEqUsingAndroidCFG()) {
- initAudioEffect(&mplpAudioEffectEq, SL_IID_EQUALIZER, NULL,
- mTrackerSessionId);
- } else {
- initAudioEffect(&mplpAudioEffectEq, NULL, SL_IID_HPEQ,
- mTrackerSessionId);
- }
-
- if (NULL == mplpAudioEffectEq) {
- LOGE("[%s:%d] Failed to create audio effect EQ(android:%d)!\n",
- __FUNCTION__, __LINE__, GetAudioEqUsingAndroidCFG());
- return -1;
- } else {
- // Init all forced gains to be invalid.
- for (int i = 0; i < EQ_BAND_COUNT; i++) {
- gEqForcedGain[i] = INVALID_EQ_FORCED_GAIN;
- }
- getEqGain(gEqUserSetGain, EQ_BAND_COUNT);
- LOGD(
- "[%s:%d] Audio effect EQ(android:%d) was created successfully!\n",
- __FUNCTION__, __LINE__, GetAudioEqUsingAndroidCFG());
- }
- }
-
- return 0;
-}
-
-int CAndroidEffect::amAndroidNewAudioEffects(void)
-{
- int tmp_ret = 0;
-
- tmp_ret |= amAndroidNewSRSAudioEffect();
- tmp_ret |= amAndroidNewEQAudioEffect();
-
- return tmp_ret;
-}
-
-void CAndroidEffect::amAndroidFreeAudioEffects(void)
-{
- {
- FreeAudioEffect(&mplpAudioEffectEq);
- FreeAudioEffect(&mplpAudioEffectSrs);
-
- if (mTrackerSessionId != 0) {
- AudioSystem::releaseAudioSessionId(mTrackerSessionId, -1);
- mTrackerSessionId = 0;
- }
- }
-}
-
-int CAndroidEffect::amAndroidGetAudioSessionId(void)
-{
- return mTrackerSessionId;
-}
-
-int CAndroidEffect::amAndroidSetSRSSurroundSwitch(int switch_val)
-{
- return amAndroidSetSrsParameterInt(SRS_PARAM_SURROUND_ENABLE,
- (unsigned) switch_val);
-}
-
-int CAndroidEffect::amAndroidSetSRSSurroundGain(int gain_val)
-{
- return amAndroidSetSrsParameterFloat(SRS_PARAM_SURROUND_GAIN,
- (float) gain_val / 100.0f);
-}
-
-int CAndroidEffect::amAndroidSetSRSTrubassSwitch(int switch_val)
-{
- return amAndroidSetSrsParameterInt(SRS_PARAM_TRUEBASS_ENABLE,
- (unsigned) switch_val);
-}
-
-int CAndroidEffect::amAndroidSetSRSTrubassGain(int gain_val)
-{
- return amAndroidSetSrsParameterFloat(SRS_PARAM_TRUEBASS_GAIN,
- (float) gain_val / 100.0f);
-}
-
-int CAndroidEffect::amAndroidSetSRSDialogClaritySwitch(int switch_val)
-{
- return amAndroidSetSrsParameterInt(SRS_PARAM_DIALOGCLARITY_ENABLE,
- (unsigned) switch_val);
-}
-
-int CAndroidEffect::amAndroidSetSRSDialogClarityGain(int gain_val)
-{
- return amAndroidSetSrsParameterFloat(SRS_PARAM_DIALOGCLARTY_GAIN,
- (float) gain_val / 100.0f);
-}
-
-int CAndroidEffect::amAndroidSetSRSDefinitionGain(int gain_val)
-{
- return amAndroidSetSrsParameterFloat(SRS_PARAM_DEFINITION_GAIN,
- (float) gain_val / 100.0f);
-}
-
-int CAndroidEffect::amAndroidSetSRSTrubassSpeakerSize(int tmp_val)
-{
- int tmp_buf[8] = { 40, 60, 100, 150, 200, 250, 300, 400 };
- int set_val = 40;
-
- if (tmp_val >= 0 && tmp_val < sizeof(tmp_buf)) {
- set_val = tmp_buf[tmp_val];
- }
-
- return amAndroidSetSrsParameterInt(SRS_PARAM_TRUEBASS_SPKER_SIZE, set_val);
-}
-
-int CAndroidEffect::setEqGain(const int gain_val_buf[], int band_count)
-{
- if (NULL == mplpAudioEffectEq) {
- LOGE("[%s:%d]\n", __FUNCTION__, __LINE__);
- return -1;
- }
-
- status_t status;
- int i;
- int gain;
- effect_param_t *pParam;
- int bAndroidEq = GetAudioEqUsingAndroidCFG();
-
- if (bAndroidEq) {
- pParam = (effect_param_t *) malloc(
- sizeof(effect_param_t) + sizeof(int) + sizeof(int)
- + sizeof(short));
- } else {
- pParam = (effect_param_t *) malloc(
- sizeof(effect_param_t) + sizeof(int) + sizeof(int));
- }
-
- if (NULL == pParam) {
- LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__);
- return -1;
- }
-
- for (i = 0; i < band_count; i++) {
- if (gEqForcedGain[i] != INVALID_EQ_FORCED_GAIN) {
- gain = gEqForcedGain[i];
- } else {
- gain = gain_val_buf[i];
- }
-
- if (bAndroidEq) {
- pParam->status = 0;
- pParam->psize = sizeof(int) * 2;
- pParam->vsize = sizeof(short);
- *(int *) (&pParam->data[0]) = EQ_PARAM_BAND_LEVEL;
- *(int *) (&pParam->data[sizeof(int)]) = i;
- *(short *) (&pParam->data[sizeof(int) * 2]) = (short) gain;
- } else {
- pParam->status = 0;
- pParam->psize = sizeof(int);
- pParam->vsize = sizeof(int);
- *(int *) (&pParam->data[0]) = i;
- *(int *) (&pParam->data[sizeof(int)]) = gain;
- }
-
- status = mplpAudioEffectEq->setParameter(pParam);
- if (NO_ERROR != status) {
- LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__, __LINE__,
- i);
- free(pParam);
- return -1;
- }
- }
-
- free(pParam);
- return 0;
-}
-
-int CAndroidEffect::getEqGain(int gain_val_buf[], int band_count)
-{
- if (NULL == mplpAudioEffectEq) {
- return -1;
- }
-
- status_t status;
- effect_param_t *pParam;
- int bAndroidEq = GetAudioEqUsingAndroidCFG();
-
- if (bAndroidEq) {
- pParam = (effect_param_t *) malloc(
- sizeof(effect_param_t) + sizeof(int) + sizeof(int)
- + sizeof(short));
- } else {
- pParam = (effect_param_t *) malloc(
- sizeof(effect_param_t) + sizeof(int) + sizeof(int));
- }
-
- if (NULL == pParam) {
- LOGE("[%s:%d]Failed to allocate memory!\n", __FUNCTION__, __LINE__);
- return -1;
- }
-
- for (int i = 0; i < EQ_BAND_COUNT; i++) {
- if (gEqForcedGain[i] != INVALID_EQ_FORCED_GAIN) {
- gain_val_buf[i] = gEqUserSetGain[i];
- } else {
- if (bAndroidEq) {
- pParam->status = 0;
- pParam->psize = sizeof(int) * 2;
- pParam->vsize = sizeof(short);
- *(int *) (&pParam->data[0]) = EQ_PARAM_BAND_LEVEL;
- *(int *) (&pParam->data[sizeof(int)]) = i;
- } else {
- pParam->status = 0;
- pParam->psize = sizeof(int);
- pParam->vsize = sizeof(int);
- *(int *) (&pParam->data[0]) = i;
- }
- status = mplpAudioEffectEq->getParameter(pParam);
- if (NO_ERROR != status) {
- LOGE("[%s:%d]Failed to set parameter:%d!\n", __FUNCTION__,
- __LINE__, i);
- free(pParam);
- return -1;
- }
-
- if (bAndroidEq) {
- gain_val_buf[i] = *(short *) (&pParam->data[sizeof(int) * 2]);
- } else {
- gain_val_buf[i] = *(int *) (&pParam->data[sizeof(int)]);
- }
- }
- }
-
- free(pParam);
- return 0;
-}
-
-int CAndroidEffect::amAndroidSetEQGain(const int gain_val_buf[], int band_count)
-{
- int i;
- int gain_factor = 1;
-
- if (band_count > EQ_BAND_COUNT) {
- band_count = EQ_BAND_COUNT;
- }
-
- // convert dB to 100th dB for android EQ
- if (GetAudioEqUsingAndroidCFG()) {
- gain_factor = 100;
- }
-
- // store the gains set by the user, and convert it to the internal representation.
- for (i = 0; i < band_count; i++) {
- gEqUserSetGain[i] = gain_val_buf[i] * gain_factor;
- }
-
- return setEqGain(gEqUserSetGain, band_count);
-}
-
-int CAndroidEffect::amAndroidGetEQGain(int gain_val_buf[], int band_count)
-{
- int i;
- int ret;
-
- if (band_count > EQ_BAND_COUNT) {
- band_count = EQ_BAND_COUNT;
- }
-
- ret = getEqGain(gain_val_buf, band_count);
-
- // convert 100th dB to dB for android EQ
- if (GetAudioEqUsingAndroidCFG()) {
- for (i = 0; i < band_count; i++) {
- gain_val_buf[i] /= 100;
- }
- }
-
- return ret;
-}
-
-int CAndroidEffect::amAndroidSetEQEnable(int enabled)
-{
- if (NULL == mplpAudioEffectEq) {
- return -1;
- }
-
- if (NO_ERROR != mplpAudioEffectEq->setEnabled(enabled)) {
- return -1;
- } else {
- return 0;
- }
-}
-
-int CAndroidEffect::amAndroidGetEQEnabled()
-{
- if (NULL == mplpAudioEffectEq) {
- return 0;
- }
-
- if (mplpAudioEffectEq->getEnabled()) {
- return 1;
- } else {
- return 0;
- }
-}
-
-int CAndroidEffect::amAndroidForceEQGain(int band, int gain)
-{
- if (band >= EQ_BAND_COUNT) {
- LOGE("[%s:%d] band(%d) is out of bound!\n", __FUNCTION__, __LINE__,
- band);
- return -1;
- } else {
- if (GetAudioEqUsingAndroidCFG() && (gain != INVALID_EQ_FORCED_GAIN)) {
- gEqForcedGain[band] = gain * 100;
- } else {
- gEqForcedGain[band] = gain;
- }
-
- // reset the EQ bands to take effect of the forced one.
- if (setEqGain(gEqUserSetGain, EQ_BAND_COUNT) != 0) {
- LOGE("[%s:%d]Failed to reset EQ gain!\n", __FUNCTION__, __LINE__);
- return -1;
- }
-
- LOGD("[%s:%d] band(%d) is forced to %d!\n", __FUNCTION__, __LINE__,
- band, gain);
- return 0;
- }
-}
diff --git a/tvapi/libtv/audio/audio_android_effect.h b/tvapi/libtv/audio/audio_android_effect.h
deleted file mode 100644
index ca0abdd..0000000
--- a/tvapi/libtv/audio/audio_android_effect.h
+++ b/dev/null
@@ -1,65 +0,0 @@
-#ifndef __TV_AUDIO_ANDROID_EFFECT_H__
-#define __TV_AUDIO_ANDROID_EFFECT_H__
-
-
-
-#include <media/AudioEffect.h>
-#include <hardware/audio_effect.h>
-#include <audio_effects/effect_srs.h>
-#include <audio_effects/effect_hpeq.h>
-#include <audio_effects/effect_equalizer.h>
-#include "tvsetting/audio_cfg.h"
-
-#define EQ_BAND_COUNT (5)
-using namespace android;
-
-class CAndroidEffect {
-public:
- CAndroidEffect();
- ~CAndroidEffect();
- int amAndroidNewAudioEffects(void);
- void amAndroidFreeAudioEffects(void);
- int amAndroidGetAudioSessionId(void);
-
- //EQ
- int amAndroidSetEQGain(const int gain_val_buf[], int band_count);
- int amAndroidGetEQGain(int gain_val_buf[], int band_count);
- int amAndroidSetEQEnable(int enabled);
- int amAndroidGetEQEnabled();
-
- //SRS
- int amAndroidSetSRSSurroundSwitch(int switch_val);
- int amAndroidSetSRSSurroundGain(int gain_val);
- int amAndroidSetSRSTrubassSwitch(int switch_val);
- int amAndroidSetSRSTrubassGain(int gain_val);
- int amAndroidSetSRSDialogClaritySwitch(int switch_val);
- int amAndroidSetSRSDialogClarityGain(int gain_val);
- int amAndroidSetSRSDefinitionGain(int gain_val);
- int amAndroidSetSRSTrubassSpeakerSize(int tmp_val);
-
-
-private:
- int gEqForcedGain[EQ_BAND_COUNT];
- int gEqUserSetGain[EQ_BAND_COUNT];
- void FreeAudioEffect(AudioEffect **pEffect);
- void initAudioEffect(AudioEffect **pEffect, const effect_uuid_t *const pEffectType, const effect_uuid_t *const pEffectUuid, int sessionId);
- int setSrsParameterInt(tshd_srs_param_t param, unsigned value);
- int getSrsParameterInt(tshd_srs_param_t param, unsigned *value);
- int setSrsParameterFloat(tshd_srs_param_t param, float value);
- int getSrsParameterFloat(tshd_srs_param_t param, float *value);
- int amAndroidSetSrsParameterInt(tshd_srs_param_t param, unsigned value);
- int amAndroidGetSrsParameterInt(tshd_srs_param_t param, unsigned *value);
- int amAndroidSetSrsParameterFloat(tshd_srs_param_t param, float value);
- int amAndroidGetSrsParameterFloat(tshd_srs_param_t param, float *value);
- int getEqGain(int gain_val_buf[], int band_count);
- int setEqGain(const int gain_val_buf[], int band_count);
- int amAndroidNewSRSAudioEffect(void);
- int amAndroidNewEQAudioEffect(void);
- int amAndroidForceEQGain(int band, int gain);
-
- AudioEffect *mplpAudioEffectSrs;
- AudioEffect *mplpAudioEffectEq;
- int mTrackerSessionId;
-};
-
-#endif //__TV_AUDIO_ANDROID_EFFECT_H__
diff --git a/tvapi/libtv/audio/audio_api.cpp b/tvapi/libtv/audio/audio_api.cpp
deleted file mode 100644
index 20db36b..0000000
--- a/tvapi/libtv/audio/audio_api.cpp
+++ b/dev/null
@@ -1,2470 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <fcntl.h>
-
-#include <android/log.h>
-#include <cutils/properties.h>
-
-#include "../tvsetting/CTvSetting.h"
-#include "../tvutils/tvutils.h"
-
-#include "audio_effect.h"
-#include "audio_android.h"
-#include "audio_android_effect.h"
-#include "audio_amaudio.h"
-
-#include "audio_api.h"
-
-#define LOG_TAG "audio_api"
-#include "CTvLog.h"
-
-static int mCustomEQGainBuf[] = { 0, 0, 0, 0, 0, 0 };
-
-static int mCurEQGainBuf[] = { 0, 0, 0, 0, 0, 0 };
-
-static int8_t mCurEQGainChBuf[] = { 0, 0, 0, 0, 0, 0 };
-
-static int mWallEffectValueBuf[] = { 0, 0, 1, 2, 2, 0 };
-
-static const int CC_MUTE_TYPE_KEY_MUTE = (0);
-static const int CC_MUTE_TYPE_SYS_MUTE = (1);
-
-
-//extern int audio_device_switch;
-int audio_device_switch = 1;//showboz
-
-CTvAudio::CTvAudio()
-{
- mAudioMuteStatusForSystem = CC_AUDIO_UNMUTE;
- mAudioMuteStatusForTv = CC_AUDIO_UNMUTE;
- mCurAudioMasterVolume = CC_DEF_SOUND_VOL;
- mCurAudioBalance = CC_DEF_SOUND_BALANCE_VAL;
- mCurAudioSupperBassVolume = CC_DEF_SUPPERBASS_VOL;
- mCurAudioSupperBassSwitch = CC_SWITCH_OFF;
- mCurAudioSRSSurround = CC_SWITCH_OFF;
- mCurAudioSrsDialogClarity = CC_SWITCH_OFF;
- mCurAudioSrsTruBass = CC_SWITCH_OFF;
- mCurAudioSPDIFSwitch = CC_SWITCH_ON;
- mCurAudioSPDIFMode = CC_SPDIF_MODE_PCM;
- mCurAudioBassVolume = CC_DEF_BASS_TREBLE_VOL;
- mCurAudioTrebleVolume = CC_DEF_BASS_TREBLE_VOL;
- mCurAudioSoundMode = CC_SOUND_MODE_END;
- mCurAudioWallEffect = CC_SWITCH_OFF;
- mCurAudioEQMode = CC_EQ_MODE_START;
- mCustomAudioMasterVolume = CC_DEF_SOUND_VOL;
- mCustomAudioBalance = CC_DEF_SOUND_BALANCE_VAL;
- mCustomAudioSupperBassVolume = CC_DEF_SUPPERBASS_VOL;
- mCustomAudioSupperBassSwitch = CC_SWITCH_OFF;
- mCustomAudioSRSSurround = CC_SWITCH_OFF;
- mCustomAudioSrsDialogClarity = CC_SWITCH_OFF;
- mCustomAudioSrsTruBass = CC_SWITCH_OFF;
- mCustomAudioBassVolume = CC_DEF_BASS_TREBLE_VOL;
- mCustomAudioTrebleVolume = CC_DEF_BASS_TREBLE_VOL;
- mCustomAudioSoundMode = CC_SOUND_MODE_END;
- mCustomAudioWallEffect = CC_SWITCH_OFF;
- mCustomAudioEQMode = CC_EQ_MODE_START;
- mCustomAudioSoundEnhancementSwitch = CC_SWITCH_OFF;
- mVolumeCompensationVal = CC_VOLUME_COMPENSATION_DEF_VAL;
-}
-
-CTvAudio::~CTvAudio()
-{
-
-}
-
-template<typename T1, typename T2>
-int AudioArrayCopy(T1 dst_buf[], T2 src_buf[], int copy_size)
-{
- int i = 0;
-
- for (i = 0; i < copy_size; i++) {
- dst_buf[i] = src_buf[i];
- }
-
- return 0;
-}
-
-//Audio Mute
-int CTvAudio::SetAudioMuteForSystem(int muteOrUnmute)
-{
- int ret = 0;
- LOGD("SetAudioMuteForSystem sysMuteStats=%d, tvMuteStatus=%d, toMute=%d", mAudioMuteStatusForSystem, mAudioMuteStatusForTv, muteOrUnmute);
- mAudioMuteStatusForSystem = muteOrUnmute;
- ret |= mAudioAlsa.SetDacMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv, CC_DAC_MUTE_TYPE_EXTERNAL | CC_DAC_MUTE_TYPE_INTERNAL);
- ret |= SetAudioSPDIFMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv);
- return ret;
-}
-
-int CTvAudio::GetAudioMuteForSystem()
-{
- return mAudioMuteStatusForSystem;
-}
-
-int CTvAudio::SetAudioMuteForTv(int Mute)
-{
- int ret = 0;
- mAudioMuteStatusForTv = Mute;
- LOGD("SetAudioMuteForTv sysMuteStats=%d, tvMuteStatus=%d, toMute=%d", mAudioMuteStatusForSystem, mAudioMuteStatusForTv, Mute);
- ret |= mAudioAlsa.SetDacMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv, CC_DAC_MUTE_TYPE_EXTERNAL | CC_DAC_MUTE_TYPE_INTERNAL);
- ret |= SetAudioSPDIFMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv);
- return ret;
-}
-
-int CTvAudio::GetAudioMuteForTv()
-{
- return mAudioMuteStatusForTv;
-}
-
-int CTvAudio::SetAudioAVOutMute(int muteStatus)
-{
- return mAudioAlsa.SetDacMute(muteStatus, CC_DAC_MUTE_TYPE_INTERNAL);
-}
-
-int CTvAudio::GetAudioAVOutMute()
-{
- return CC_AUDIO_UNMUTE;
-}
-
-int CTvAudio::handleAudioSPDIFMute(int muteStatus)
-{
- int set_val = 0;
-
- if (muteStatus == CC_AUDIO_MUTE) {
- set_val = CC_SPDIF_MUTE_ON;
- } else if (muteStatus == CC_AUDIO_UNMUTE) {
- set_val = CC_SPDIF_MUTE_OFF;
- } else {
- return -1;
- }
-
- return mAudioAlsa.SetSPDIFMute(set_val);
-}
-
-int CTvAudio::SetAudioSPDIFMute(int muteStatus)
-{
- if (GetCurAudioSPDIFSwitch() == CC_SWITCH_OFF) {
- muteStatus = CC_AUDIO_MUTE;
- }
-
- return handleAudioSPDIFMute(muteStatus);
-}
-
-int CTvAudio::GetAudioSPDIFMute()
-{
- return CC_AUDIO_UNMUTE;
-}
-
-//Audio SPDIF switch
-int CTvAudio::SetAudioSPDIFSwitch(int tmp_val)
-{
- int muteStatus = CC_AUDIO_UNMUTE;
-
- mCurAudioSPDIFSwitch = tmp_val;
-
- if (tmp_val == CC_SWITCH_OFF || mAudioMuteStatusForSystem == CC_AUDIO_MUTE || mAudioMuteStatusForTv == CC_AUDIO_MUTE) {
- muteStatus = CC_AUDIO_MUTE;
- } else {
- muteStatus = CC_AUDIO_UNMUTE;
- }
-
- handleAudioSPDIFMute(muteStatus);
- return 0;
-}
-
-int CTvAudio::GetCurAudioSPDIFSwitch()
-{
- return mCurAudioSPDIFSwitch;
-}
-
-int CTvAudio::SaveCurAudioSPDIFSwitch(int tmp_val)
-{
- int8_t tmp_ch = 0;
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_ON;
- }
-
- mCurAudioSPDIFSwitch = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioSPDIFSwitchVal(tmp_ch);
-
- return mCurAudioSPDIFSwitch;
-}
-
-int CTvAudio::LoadCurAudioSPDIFSwitch()
-{
- int8_t tmp_ch = 0;
- SSMReadAudioSPDIFSwitchVal(&tmp_ch);
- mCurAudioSPDIFSwitch = tmp_ch;
- if (mCurAudioSPDIFSwitch != CC_SWITCH_ON
- && mCurAudioSPDIFSwitch != CC_SWITCH_OFF) {
- SaveCurAudioSPDIFSwitch (CC_SWITCH_ON);
- }
- return mCurAudioSPDIFSwitch;
-}
-
-//Audio SPDIF Mode
-int CTvAudio::SetAudioSPDIFMode(int tmp_val)
-{
- LOGD("%s : tmp_val = %d\n", __FUNCTION__, tmp_val);
- mCurAudioSPDIFMode = tmp_val;
-
- SetSPDIFMode(mCurAudioSPDIFMode);
-
- return 0;
-}
-
-int CTvAudio::GetCurAudioSPDIFMode()
-{
- return mCurAudioSPDIFMode;
-}
-
-int CTvAudio::SaveCurAudioSPDIFMode(int tmp_val)
-{
- int8_t tmp_ch = 0;
- if (tmp_val != CC_SPDIF_MODE_PCM && tmp_val != CC_SPDIF_MODE_RAW) {
- tmp_val = CC_SPDIF_MODE_PCM;
- }
-
- mCurAudioSPDIFMode = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioSPDIFModeVal(tmp_ch);
-
- return mCurAudioSPDIFMode;
-}
-
-int CTvAudio::LoadCurAudioSPDIFMode()
-{
- int8_t tmp_ch = 0;
- SSMReadAudioSPDIFModeVal(&tmp_ch);
- mCurAudioSPDIFMode = tmp_ch;
- if (mCurAudioSPDIFMode != CC_SPDIF_MODE_PCM
- && mCurAudioSPDIFMode != CC_SPDIF_MODE_RAW) {
- SaveCurAudioSPDIFMode (CC_SPDIF_MODE_PCM);
- }
- return mCurAudioSPDIFMode;
-}
-
-//Audio Master Volume
-int CTvAudio::SetAudioMasterVolume(int tmp_vol)
-{
- const char *value;
- if (tmp_vol < CC_MIN_SOUND_VOL || tmp_vol > CC_MAX_SOUND_VOL) {
- tmp_vol = CC_DEF_SOUND_VOL;
- }
-
- mCustomAudioMasterVolume = tmp_vol;
-
- //Volume Compensation
- if (tmp_vol != CC_MIN_SOUND_VOL) {
- tmp_vol += GetAudioVolumeCompensationVal();
- }
-
- if (tmp_vol > CC_MAX_SOUND_VOL) {
- tmp_vol = CC_MAX_SOUND_VOL;
- }
-
- if (tmp_vol < CC_MIN_SOUND_VOL) {
- tmp_vol = CC_MIN_SOUND_VOL;
- }
-
- mAudioAlsa.SetDacMainVolume(tmp_vol);
- value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" );
- if ( strcmp ( value, "enable" ) == 0 ) {
- setAudioPcmPlaybackVolume(tmp_vol);
- }
- return 0;
-}
-
-int CTvAudio::GetAudioMasterVolume()
-{
- return mCustomAudioMasterVolume;
-}
-
-int CTvAudio::GetCurAudioMasterVolume()
-{
- return mCurAudioMasterVolume;
-}
-
-int CTvAudio::SaveCurAudioMasterVolume(int tmp_vol)
-{
- int8_t tmp_ch = 0;
-
- if (tmp_vol < CC_MIN_SOUND_VOL || tmp_vol > CC_MAX_SOUND_VOL) {
- tmp_vol = CC_DEF_SOUND_VOL;
- }
-
- mCurAudioMasterVolume = tmp_vol;
- tmp_ch = tmp_vol;
- SSMSaveAudioMasterVolume(tmp_ch);
-
- return mCurAudioMasterVolume;
-}
-
-int CTvAudio::LoadCurAudioMasterVolume()
-{
- int8_t tmp_ch = 0;
- SSMReadAudioMasterVolume(&tmp_ch);
- mCurAudioMasterVolume = tmp_ch;
- if (mCurAudioMasterVolume < CC_MIN_SOUND_VOL
- || mCurAudioMasterVolume > CC_MAX_SOUND_VOL) {
- SaveCurAudioMasterVolume (CC_DEF_SOUND_VOL);
- }
-
- mCustomAudioMasterVolume = mCurAudioMasterVolume;
-
- return mCurAudioMasterVolume;
-}
-
-//Audio Balance
-int CTvAudio::SetAudioBalance(int tmp_val)
-{
- if (tmp_val < CC_MIN_SOUND_BALANCE_VAL
- || tmp_val > CC_MAX_SOUND_BALANCE_VAL) {
- tmp_val = CC_DEF_SOUND_BALANCE_VAL;
- }
-
- mCustomAudioBalance = tmp_val;
-
- if (mAudioAlsa.SetBalanceValue(mCustomAudioBalance) < 0) {
- return SetAudioMasterVolume(GetAudioMasterVolume());
- }
-
- return 0;
-}
-
-int CTvAudio::GetAudioBalance()
-{
- return mCustomAudioBalance;
-}
-
-int CTvAudio::GetCurAudioBalance()
-{
- return mCurAudioBalance;
-}
-
-int CTvAudio::SaveCurAudioBalance(int tmp_val)
-{
- int8_t tmp_ch = 0;
-
- if (tmp_val < CC_MIN_SOUND_BALANCE_VAL
- || tmp_val > CC_MAX_SOUND_BALANCE_VAL) {
- tmp_val = CC_DEF_SOUND_BALANCE_VAL;
- }
-
- mCurAudioBalance = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioBalanceVal(tmp_ch);
-
- return mCurAudioBalance;
-}
-
-int CTvAudio::LoadCurAudioBalance()
-{
- int8_t tmp_ch = 0;
- SSMReadAudioBalanceVal(&tmp_ch);
- mCurAudioBalance = tmp_ch;
- if (mCurAudioBalance < CC_MIN_SOUND_BALANCE_VAL
- || mCurAudioBalance > CC_MAX_SOUND_BALANCE_VAL) {
- SaveCurAudioBalance (CC_DEF_SOUND_BALANCE_VAL);
- }
-
- mCustomAudioBalance = mCurAudioBalance;
-
- return mCurAudioBalance;
-}
-
-int CTvAudio::SetAudioVolumeCompensationVal(int tmp_vol_comp_val)
-{
- int tmp_val = 0;
- tmp_val = mVolumeCompensationVal;
- mVolumeCompensationVal = tmp_vol_comp_val;
- LOGD("%s, old vol comp value = %d, new vol comp value = %d.\n",
- __FUNCTION__, tmp_val, tmp_vol_comp_val);
- return tmp_val;
-}
-
-int CTvAudio::GetAudioVolumeCompensationVal()
-{
- int tmp_vol_comp_val = 0;
- tmp_vol_comp_val = mVolumeCompensationVal;
- if (tmp_vol_comp_val < CC_VOLUME_COMPENSATION_MIN_VAL
- || tmp_vol_comp_val > CC_VOLUME_COMPENSATION_MAX_VAL) {
- tmp_vol_comp_val = CC_VOLUME_COMPENSATION_DEF_VAL;
- }
- LOGD("%s, vol comp value = %d, return value = %d.\n", __FUNCTION__,
- mVolumeCompensationVal, tmp_vol_comp_val);
-
- return tmp_vol_comp_val;
-}
-
-//Audio SupperBass Volume
-int CTvAudio::SetAudioSupperBassVolume(int tmp_vol)
-{
- if (tmp_vol < CC_MIN_SUPPERBASS_VOL || tmp_vol > CC_MAX_SUPPERBASS_VOL) {
- tmp_vol = CC_DEF_SUPPERBASS_VOL;
- }
-
- mCustomAudioSupperBassVolume = tmp_vol;
-
- return mAudioAlsa.SetDacSupperBassVolume(mCustomAudioSupperBassVolume);
-}
-
-int CTvAudio::GetAudioSupperBassVolume()
-{
- return mCustomAudioSupperBassVolume;
-}
-
-int CTvAudio::GetCurAudioSupperBassVolume()
-{
- return mCurAudioSupperBassVolume;
-}
-
-int CTvAudio::SaveCurAudioSupperBassVolume(int tmp_vol)
-{
- int8_t tmp_ch = 0;
- if (tmp_vol < CC_MIN_SUPPERBASS_VOL || tmp_vol > CC_MAX_SUPPERBASS_VOL) {
- tmp_vol = CC_DEF_SUPPERBASS_VOL;
- }
-
- mCurAudioSupperBassVolume = tmp_vol;
- tmp_ch = tmp_vol;
- SSMSaveAudioSupperBassVolume(tmp_ch);
-
- return mCurAudioSupperBassVolume;
-}
-
-int CTvAudio::LoadCurAudioSupperBassVolume()
-{
- int8_t tmp_ch = 0;
- SSMReadAudioSupperBassVolume(&tmp_ch);
- mCurAudioSupperBassVolume = tmp_ch;
- if (mCurAudioSupperBassVolume < CC_MIN_SUPPERBASS_VOL
- || mCurAudioSupperBassVolume > CC_MAX_SUPPERBASS_VOL) {
- SaveCurAudioSupperBassVolume (CC_DEF_SUPPERBASS_VOL);
- }
-
- mCustomAudioSupperBassVolume = mCurAudioSupperBassVolume;
-
- return mCurAudioSupperBassVolume;
-}
-
-//Audio SupperBass Switch
-int CTvAudio::SetAudioSupperBassSwitch(int tmp_val)
-{
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCustomAudioSupperBassSwitch = tmp_val;
-
- if (GetAudioSupperBassSwitch() == CC_SWITCH_OFF) {
- return mAudioAlsa.SetDacSupperBassVolume(CC_MIN_SUPPERBASS_VOL);
- }
-
- return mAudioAlsa.SetDacSupperBassVolume(GetAudioSupperBassVolume());
-}
-
-int CTvAudio::GetAudioSupperBassSwitch()
-{
- if (GetAudioSupperBassSwitchDisableCFG() != 0) {
- return CC_SWITCH_ON;
- }
-
- return mCustomAudioSupperBassSwitch;
-}
-
-int CTvAudio::GetCurAudioSupperBassSwitch()
-{
- if (GetAudioSupperBassSwitchDisableCFG() != 0) {
- return CC_SWITCH_ON;
- }
-
- return mCurAudioSupperBassSwitch;
-}
-
-int CTvAudio::SaveCurAudioSupperBassSwitch(int tmp_val)
-{
- int8_t tmp_ch = 0;
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCurAudioSupperBassSwitch = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioSupperBassSwitch(tmp_ch);
-
- HandleSupperBassSwicth();
-
- return mCurAudioSupperBassSwitch;
-}
-
-int CTvAudio::LoadCurAudioSupperBassSwitch()
-{
- int8_t tmp_ch = 0;
- SSMReadAudioSupperBassSwitch(&tmp_ch);
- mCurAudioSupperBassSwitch = tmp_ch;
- if (mCurAudioSupperBassSwitch != CC_SWITCH_ON
- && mCurAudioSupperBassSwitch != CC_SWITCH_OFF) {
- SaveCurAudioSupperBassSwitch (CC_SWITCH_OFF);
- }
-
- mCustomAudioSupperBassSwitch = mCurAudioSupperBassSwitch;
-
- HandleSupperBassSwicth();
-
- return mCurAudioSupperBassSwitch;
-}
-
-void CTvAudio::HanldeSupperBassSRSSpeakerSize()
-{
- int tmp_speakersize = -1;
-
- if (GetAudioSrsTruBass() == CC_SWITCH_ON) {
- if (GetAudioSupperBassSwitch() == CC_SWITCH_ON) {
- tmp_speakersize = GetAudioSRSSupperBassTrubassSpeakerSizeCfg(1);
- } else {
- tmp_speakersize = GetAudioSRSSupperBassTrubassSpeakerSizeCfg(0);
- }
-
- if (tmp_speakersize >= 0) {
- mAudioEffect.SetSrsTrubassSpeakerSize(tmp_speakersize);
- }
- }
-}
-
-void CTvAudio::HandleSupperBassSwicth()
-{
- if (GetAudioSupperBassModuleDisableCFG() != 0) {
- return;
- }
-
- HanldeSupperBassSRSSpeakerSize();
-}
-
-//Audio SRS Surround switch
-int CTvAudio::SetAudioSRSSurround(int tmp_val)
-{
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return 0;
- }
-
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCustomAudioSRSSurround = tmp_val;
-
- RealSetSRS();
- return 0;
-}
-
-int CTvAudio::GetAudioSRSSurround()
-{
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return CC_SWITCH_OFF;
- }
-
- return mCustomAudioSRSSurround;
-}
-
-int CTvAudio::GetCurAudioSRSSurround()
-{
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return CC_SWITCH_OFF;
- }
-
- return mCurAudioSRSSurround;
-}
-
-int CTvAudio::SaveCurAudioSrsSurround(int tmp_val)
-{
- int8_t tmp_ch = 0;
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return 0;
- }
-
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCurAudioSRSSurround = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioSRSSurroundSwitch(tmp_ch);
-
- return mCurAudioSRSSurround;
-}
-
-int CTvAudio::LoadCurAudioSrsSurround()
-{
- int8_t tmp_ch = 0;
- if (GetAudioSRSModuleDisableCFG() == 1) {
- mCustomAudioSRSSurround = CC_SWITCH_OFF;
- mCustomAudioSRSSurround = mCurAudioSRSSurround;
- return mCurAudioSRSSurround;
- }
-
- SSMReadAudioSRSSurroundSwitch(&tmp_ch);
- mCurAudioSRSSurround = tmp_ch;
- if (mCurAudioSRSSurround != CC_SWITCH_ON
- && mCurAudioSRSSurround != CC_SWITCH_OFF) {
- SaveCurAudioSrsSurround (CC_SWITCH_OFF);
- }
-
- mCustomAudioSRSSurround = mCurAudioSRSSurround;
-
- return mCurAudioSRSSurround;
-}
-
-//Audio SRS Dialog Clarity
-int CTvAudio::SetAudioSrsDialogClarity(int tmp_val)
-{
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return 0;
- }
-
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCustomAudioSrsDialogClarity = tmp_val;
- RealSetSRS();
-
- return 0;
-}
-
-int CTvAudio::GetAudioSrsDialogClarity()
-{
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return CC_SWITCH_OFF;
- }
-
- return mCustomAudioSrsDialogClarity;
-}
-
-int CTvAudio::GetCurAudioSrsDialogClarity()
-{
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return CC_SWITCH_OFF;
- }
-
- return mCurAudioSrsDialogClarity;
-}
-
-int CTvAudio::SaveCurAudioSrsDialogClarity(int tmp_val)
-{
- int8_t tmp_ch = 0;
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return 0;
- }
-
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCurAudioSrsDialogClarity = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioSRSDialogClaritySwitch(tmp_ch);
-
- return mCurAudioSrsDialogClarity;
-}
-
-int CTvAudio::LoadCurAudioSrsDialogClarity()
-{
- int8_t tmp_ch = 0;
- if (GetAudioSRSModuleDisableCFG() == 1) {
- mCurAudioSrsDialogClarity = CC_SWITCH_OFF;
- mCustomAudioSrsDialogClarity = mCurAudioSrsDialogClarity;
- return mCurAudioSRSSurround;
- }
-
- SSMReadAudioSRSDialogClaritySwitch(&tmp_ch);
- mCurAudioSrsDialogClarity = tmp_ch;
- if (mCurAudioSrsDialogClarity != CC_SWITCH_ON
- && mCurAudioSrsDialogClarity != CC_SWITCH_OFF) {
- SaveCurAudioSrsDialogClarity (CC_SWITCH_OFF);
- }
-
- mCustomAudioSrsDialogClarity = mCurAudioSrsDialogClarity;
-
- return mCurAudioSrsDialogClarity;
-}
-
-//Audio SRS Trubass
-int CTvAudio::SetAudioSrsTruBass(int tmp_val)
-{
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return 0;
- }
-
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCustomAudioSrsTruBass = tmp_val;
- RealSetSRS();
-
- return 0;
-}
-
-int CTvAudio::GetAudioSrsTruBass()
-{
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return CC_SWITCH_OFF;
- }
-
- return mCustomAudioSrsTruBass;
-}
-
-int CTvAudio::GetCurAudioSrsTruBass()
-{
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return CC_SWITCH_OFF;
- }
-
- return mCurAudioSrsTruBass;
-}
-
-int CTvAudio::SaveCurAudioSrsTruBass(int tmp_val)
-{
- int8_t tmp_ch = 0;
- if (GetAudioSRSModuleDisableCFG() == 1) {
- return 0;
- }
-
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCurAudioSrsTruBass = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioSRSTruBassSwitch(tmp_ch);
-
- return mCurAudioSrsTruBass;
-}
-
-int CTvAudio::LoadCurAudioSrsTruBass()
-{
- int8_t tmp_ch = 0;
- if (GetAudioSRSModuleDisableCFG() == 1) {
- mCurAudioSrsTruBass = CC_SWITCH_OFF;
- mCustomAudioSrsTruBass = mCurAudioSrsTruBass;
- return mCurAudioSRSSurround;
- }
-
- SSMReadAudioSRSTruBassSwitch(&tmp_ch);
- mCurAudioSrsTruBass = tmp_ch;
- if (mCurAudioSrsTruBass != CC_SWITCH_ON
- && mCurAudioSrsTruBass != CC_SWITCH_OFF) {
- SaveCurAudioSrsTruBass (CC_SWITCH_OFF);
- }
-
- mCustomAudioSrsTruBass = mCurAudioSrsTruBass;
-
- return mCurAudioSrsTruBass;
-}
-
-void CTvAudio::RealSetSRS()
-{
- int tmp_gain_val = 0;
- int surround_switch = CC_SWITCH_OFF;
- int trubass_switch = CC_SWITCH_OFF;
- int dialogclarity_switch = CC_SWITCH_OFF;
-
- surround_switch = GetAudioSRSSurround();
- if (surround_switch == CC_SWITCH_ON) {
- mAudioEffect.SetSrsSurroundSwitch(surround_switch);
- tmp_gain_val = GetAudioSRSSourroundGainCfg();
- if (tmp_gain_val >= 0 && tmp_gain_val <= 100) {
- mAudioEffect.SetSrsSurroundGain(tmp_gain_val);
- }
-
- trubass_switch = GetAudioSrsTruBass();
- dialogclarity_switch = GetAudioSrsDialogClarity();
- if (trubass_switch == CC_SWITCH_ON
- && dialogclarity_switch == CC_SWITCH_OFF) {
- mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_ON);
-
- tmp_gain_val = GetAudioSRSTrubassOnlyGainCfg();
- if (tmp_gain_val >= 0 && tmp_gain_val <= 100) {
- mAudioEffect.SetSrsTruBassGain(tmp_gain_val);
- }
-
- mAudioEffect.SetSrsDialogClaritySwitch (CC_SWITCH_OFF);
- } else if (trubass_switch == CC_SWITCH_OFF
- && dialogclarity_switch == CC_SWITCH_ON) {
- mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_OFF);
-
- mAudioEffect.SetSrsDialogClaritySwitch (CC_SWITCH_ON);
-
- tmp_gain_val = GetAudioSRSDialogClarityOnlyDefinitionGainCfg();
- if (tmp_gain_val >= 0 && tmp_gain_val <= 100) {
- mAudioEffect.SetSrsDefinitionGain(tmp_gain_val);
- }
-
- tmp_gain_val = GetAudioSRSDialogClarityOnlyGainCfg();
- if (tmp_gain_val >= 0 && tmp_gain_val <= 100) {
- mAudioEffect.SetSrsDialogClarityGain(tmp_gain_val);
- }
- } else if (trubass_switch == CC_SWITCH_ON
- && dialogclarity_switch == CC_SWITCH_ON) {
- mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_ON);
-
- tmp_gain_val = GetAudioSRSTrubassAndDialogClarityTrubassGainCfg();
- if (tmp_gain_val >= 0 && tmp_gain_val <= 100) {
- mAudioEffect.SetSrsTruBassGain(tmp_gain_val);
- }
-
- mAudioEffect.SetSrsDialogClaritySwitch(CC_SWITCH_ON);
-
- tmp_gain_val =
- GetAudioSRSTrubassAndDialogClarityDefinitionGainCfg();
- if (tmp_gain_val >= 0 && tmp_gain_val <= 100) {
- mAudioEffect.SetSrsDefinitionGain(tmp_gain_val);
- }
-
- tmp_gain_val =
- GetAudioSRSTrubassAndDialogClarityDialogClarityGainCfg();
- if (tmp_gain_val >= 0 && tmp_gain_val <= 100) {
- mAudioEffect.SetSrsDialogClarityGain(tmp_gain_val);
- }
- } else if (trubass_switch == CC_SWITCH_OFF
- && dialogclarity_switch == CC_SWITCH_OFF) {
- mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_OFF);
- mAudioEffect.SetSrsDialogClaritySwitch(CC_SWITCH_OFF);
- }
-
- HanldeSupperBassSRSSpeakerSize();
- } else {
- mAudioEffect.SetSrsSurroundSwitch (CC_SWITCH_OFF);
- mAudioEffect.SetSrsTruBassSwitch(CC_SWITCH_OFF);
- mAudioEffect.SetSrsDialogClaritySwitch(CC_SWITCH_OFF);
- }
-
- SetDacGain();
-}
-
-int CTvAudio::SetDacGain()
-{
- int main_gain_val = 0, sb_gain_val = 0;
- int sourround_switch, trubass_switch, dialogclarity_switch;
-
- sourround_switch = GetAudioSRSSurround();
- trubass_switch = GetAudioSrsTruBass();
- dialogclarity_switch = GetAudioSrsDialogClarity();
-
- if (sourround_switch == CC_SWITCH_ON) {
- main_gain_val = GetAudioSRSSourroundAmplifierMasterGainCfg();
- sb_gain_val = GetAudioSRSSourroundAmplifierSupperBassGainCfg();
-
- if (dialogclarity_switch == CC_SWITCH_ON
- && trubass_switch == CC_SWITCH_OFF) {
- main_gain_val = GetAudioSRSDialogClarityOnlyAmplifierMasterGainCfg();
- sb_gain_val = GetAudioSRSDialogClarityOnlyAmplifierSupperBassGainCfg();
- } else if (dialogclarity_switch == CC_SWITCH_OFF
- && trubass_switch == CC_SWITCH_ON) {
- main_gain_val = GetAudioSRSTrubassOnlyAmplifierMasterGainCfg();
- sb_gain_val = GetAudioSRSTrubassOnlyAmplifierSupperBassGainCfg();
- } else if (dialogclarity_switch == CC_SWITCH_ON
- && trubass_switch == CC_SWITCH_ON) {
- main_gain_val = GetAudioSRSTrubassAndDialogClarityAmplifierMasterGainCfg();
- sb_gain_val = GetAudioSRSTrubassAndDialogClarityAmplifierSupperBassGainCfg();
- }
- }
-
- mAudioAlsa.SetMainVolumeGain(main_gain_val);
- mAudioAlsa.SetSupperBassVolumeGain(sb_gain_val);
-
- return 0;
-}
-
-//Audio Bass
-int CTvAudio::SetAudioBassVolume(int tmp_vol)
-{
- int nMinBassVol = 0, nMaxBassVol = 0;
-
- nMinBassVol = GetBassUIMinGainVal();
- nMaxBassVol = GetBassUIMaxGainVal();
-
- if (tmp_vol < nMinBassVol || tmp_vol > nMaxBassVol) {
- tmp_vol = (nMaxBassVol + nMinBassVol) / 2;
- }
-
- mCustomAudioBassVolume = tmp_vol;
-
- tmp_vol = MappingTrebleBassAndEqualizer(GetAudioBassVolume(), 0,
- nMinBassVol, nMaxBassVol);
-
- return SetSpecialIndexEQGain(CC_EQ_BASS_IND, tmp_vol);
-}
-
-int CTvAudio::GetAudioBassVolume()
-{
- return mCustomAudioBassVolume;
-}
-
-int CTvAudio::GetCurAudioBassVolume()
-{
- return mCurAudioBassVolume;
-}
-
-int CTvAudio::SaveCurAudioBassVolume(int tmp_vol)
-{
- int nMinBassVol = 0, nMaxBassVol = 0;
-
- nMinBassVol = GetBassUIMinGainVal();
- nMaxBassVol = GetBassUIMaxGainVal();
-
- if (tmp_vol < nMinBassVol || tmp_vol > nMaxBassVol) {
- tmp_vol = (nMaxBassVol + nMinBassVol) / 2;
- }
-
- RealSaveCurAudioBassVolume(tmp_vol, 1);
-
- tmp_vol = MappingTrebleBassAndEqualizer(GetCurAudioBassVolume(), 0,
- nMinBassVol, nMaxBassVol);
-
- return SaveSpecialIndexEQGain(CC_EQ_BASS_IND, tmp_vol);
-}
-
-int CTvAudio::RealSaveCurAudioBassVolume(int tmp_vol, int sound_mode_judge)
-{
- int8_t tmp_ch = 0;
- mCurAudioBassVolume = tmp_vol;
- tmp_ch = tmp_vol;
- SSMSaveAudioBassVolume(tmp_ch);
-
- if (sound_mode_judge == 1) {
- if (GetAudioSoundMode() != CC_SOUND_MODE_USER) {
- SaveCurAudioSoundMode (CC_SOUND_MODE_USER);
- mCustomAudioSoundMode = mCurAudioSoundMode;
- }
- }
-
- return mCurAudioBassVolume;
-}
-
-int CTvAudio::LoadCurAudioBassVolume()
-{
- int nMinBassVol = 0, nMaxBassVol = 0;
- int8_t tmp_ch = 0;
-
- nMinBassVol = GetBassUIMinGainVal();
- nMaxBassVol = GetBassUIMaxGainVal();
-
- SSMReadAudioBassVolume(&tmp_ch);
- mCurAudioBassVolume = tmp_ch;
- if (mCurAudioBassVolume < nMinBassVol
- || mCurAudioBassVolume > nMaxBassVol) {
- RealSaveCurAudioBassVolume((nMaxBassVol + nMinBassVol) / 2, 0);
- }
-
- mCustomAudioBassVolume = mCurAudioBassVolume;
-
- return mCurAudioBassVolume;
-}
-
-//Audio Treble
-int CTvAudio::SetAudioTrebleVolume(int tmp_vol)
-{
- int nMinTrebleVol = 0, nMaxTrebleVol = 0;
-
- nMinTrebleVol = GetTrebleUIMinGainVal();
- nMaxTrebleVol = GetTrebleUIMaxGainVal();
-
- if (tmp_vol < nMinTrebleVol || tmp_vol > nMaxTrebleVol) {
- tmp_vol = (nMaxTrebleVol + nMinTrebleVol) / 2;
- }
-
- mCustomAudioTrebleVolume = tmp_vol;
-
- tmp_vol = MappingTrebleBassAndEqualizer(GetAudioTrebleVolume(), 0,
- nMinTrebleVol, nMaxTrebleVol);
-
- return SetSpecialIndexEQGain(CC_EQ_TREBLE_IND, tmp_vol);
-}
-
-int CTvAudio::GetAudioTrebleVolume()
-{
- return mCustomAudioTrebleVolume;
-}
-
-int CTvAudio::GetCurAudioTrebleVolume()
-{
- return mCurAudioTrebleVolume;
-}
-
-int CTvAudio::SaveCurAudioTrebleVolume(int tmp_vol)
-{
- int nMinTrebleVol = 0, nMaxTrebleVol = 0;
-
- nMinTrebleVol = GetTrebleUIMinGainVal();
- nMaxTrebleVol = GetTrebleUIMaxGainVal();
-
- if (tmp_vol < nMinTrebleVol || tmp_vol > nMaxTrebleVol) {
- tmp_vol = (nMaxTrebleVol + nMinTrebleVol) / 2;
- }
-
- RealSaveCurAudioTrebleVolume(tmp_vol, 1);
-
- tmp_vol = MappingTrebleBassAndEqualizer(GetCurAudioTrebleVolume(), 0,
- nMinTrebleVol, nMaxTrebleVol);
-
- return SaveSpecialIndexEQGain(CC_EQ_TREBLE_IND, tmp_vol);
-}
-
-int CTvAudio::RealSaveCurAudioTrebleVolume(int tmp_vol, int sound_mode_judge)
-{
- int8_t tmp_ch = 0;
- mCurAudioTrebleVolume = tmp_vol;
- tmp_ch = tmp_vol;
- SSMSaveAudioTrebleVolume(tmp_ch);
-
- if (sound_mode_judge == 1) {
- if (GetAudioSoundMode() != CC_SOUND_MODE_USER) {
- SaveCurAudioSoundMode (CC_SOUND_MODE_USER);
- mCustomAudioSoundMode = mCurAudioSoundMode;
- }
- }
-
- return mCurAudioTrebleVolume;
-}
-
-int CTvAudio::LoadCurAudioTrebleVolume()
-{
- int nMinTrebleVol = 0, nMaxTrebleVol = 0;
- int8_t tmp_ch = 0;
-
- nMinTrebleVol = GetTrebleUIMinGainVal();
- nMaxTrebleVol = GetTrebleUIMaxGainVal();
-
- SSMReadAudioTrebleVolume(&tmp_ch);
- mCurAudioTrebleVolume = tmp_ch;
- if (mCurAudioTrebleVolume < nMinTrebleVol
- || mCurAudioTrebleVolume > nMaxTrebleVol) {
- RealSaveCurAudioTrebleVolume((nMaxTrebleVol + nMinTrebleVol) / 2, 0);
- }
-
- mCustomAudioTrebleVolume = mCurAudioTrebleVolume;
-
- return mCurAudioTrebleVolume;
-}
-
-//Audio Sound Mode
-int CTvAudio::SetAudioSoundMode(int tmp_val)
-{
- if (tmp_val < CC_SOUND_MODE_START || tmp_val > CC_SOUND_MODE_END) {
- tmp_val = CC_SOUND_MODE_STD;
- }
-
- LOGD("%s : sound mode = %d\n", __FUNCTION__, tmp_val);
-
- mCustomAudioSoundMode = tmp_val;
- SetSpecialModeEQGain(mCustomAudioSoundMode);
-
- HandleTrebleBassVolume();
-
- return 0;
-}
-
-int CTvAudio::GetAudioSoundMode()
-{
- return mCustomAudioSoundMode;
-}
-
-int CTvAudio::GetCurAudioSoundMode()
-{
- return mCurAudioSoundMode;
-}
-
-int CTvAudio::SaveCurAudioSoundMode(int tmp_val)
-{
- int8_t tmp_ch = 0;
- if (tmp_val < CC_SOUND_MODE_START || tmp_val > CC_SOUND_MODE_END) {
- tmp_val = CC_SOUND_MODE_STD;
- }
-
- mCurAudioSoundMode = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioSoundModeVal(tmp_ch);
-
- return mCurAudioSoundMode;
-}
-
-int CTvAudio::LoadCurAudioSoundMode()
-{
- int8_t tmp_ch = 0;
- SSMReadAudioSoundModeVal(&tmp_ch);
- mCurAudioSoundMode = tmp_ch;
- if (mCurAudioSoundMode < CC_SOUND_MODE_START
- || mCurAudioSoundMode > CC_SOUND_MODE_END) {
- SaveCurAudioSoundMode (CC_SOUND_MODE_STD);
- }
-
- mCustomAudioSoundMode = mCurAudioSoundMode;
-
- return mCurAudioSoundMode;
-}
-
-int CTvAudio::HandleTrebleBassVolume()
-{
- int tmp_vol = 0;
- int tmpEQGainBuf[128] = { 0 };
- int8_t tmp_ch = 0;
-
- GetCustomEQGain(tmpEQGainBuf);
-
- tmp_vol = MappingTrebleBassAndEqualizer(tmpEQGainBuf[CC_EQ_TREBLE_IND], 1,
- GetTrebleUIMinGainVal(), GetTrebleUIMaxGainVal());
- mCustomAudioTrebleVolume = tmp_vol;
- mCurAudioTrebleVolume = mCustomAudioTrebleVolume;
- tmp_ch = mCustomAudioTrebleVolume;
- SSMSaveAudioTrebleVolume(tmp_ch);
-
- tmp_vol = MappingTrebleBassAndEqualizer(tmpEQGainBuf[CC_EQ_BASS_IND], 1,
- GetBassUIMinGainVal(), GetBassUIMaxGainVal());
- mCustomAudioBassVolume = tmp_vol;
- mCurAudioBassVolume = mCustomAudioBassVolume;
- tmp_ch = mCustomAudioBassVolume;
- SSMSaveAudioBassVolume(tmp_ch);
-
- return 0;
-}
-
-//Audio Wall Effect
-int CTvAudio::SetAudioWallEffect(int tmp_val)
-{
- int tmp_treble_val;
- int tmp_type = 0;
-
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCustomAudioWallEffect = tmp_val;
-
- tmp_type = GetAudioWallEffectTypeCfg();
- if (tmp_type == 0) {
- SetCustomEQGain();
- } else if (tmp_type == 1) {
- mAudioAlsa.SetDacEQMode(tmp_val);
- }
-
- return 0;
-}
-
-int CTvAudio::GetAudioWallEffect()
-{
- return mCustomAudioWallEffect;
-}
-
-int CTvAudio::GetCurAudioWallEffect()
-{
- return mCurAudioWallEffect;
-}
-
-int CTvAudio::SaveCurAudioWallEffect(int tmp_val)
-{
- int8_t tmp_ch = 0;
- if (tmp_val != CC_SWITCH_ON && tmp_val != CC_SWITCH_OFF) {
- tmp_val = CC_SWITCH_OFF;
- }
-
- mCurAudioWallEffect = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioWallEffectSwitch(tmp_ch);
-
- return mCurAudioWallEffect;
-}
-
-int CTvAudio::LoadCurAudioWallEffect()
-{
- int8_t tmp_ch = 0;
- SSMReadAudioWallEffectSwitch(&tmp_ch);
- mCurAudioWallEffect = tmp_ch;
- if (mCurAudioWallEffect != CC_SWITCH_ON
- && mCurAudioWallEffect != CC_SWITCH_OFF) {
- SaveCurAudioWallEffect (CC_SWITCH_OFF);
- }
-
- mCustomAudioWallEffect = mCurAudioWallEffect;
-
- return mCurAudioWallEffect;
-}
-
-//Audio EQ Mode
-int CTvAudio::SetAudioEQMode(int tmp_val)
-{
- if (tmp_val < CC_EQ_MODE_START || tmp_val > CC_EQ_MODE_END) {
- tmp_val = CC_EQ_MODE_START;
- }
-
- mCustomAudioEQMode = tmp_val;
-
- return 0;
-}
-
-int CTvAudio::GetAudioEQMode()
-{
- return mCustomAudioEQMode;
-}
-
-int CTvAudio::GetCurAudioEQMode()
-{
- return mCurAudioEQMode;
-}
-
-int CTvAudio::SaveCurAudioEQMode(int tmp_val)
-{
- int8_t tmp_ch = 0;
- if (tmp_val < CC_EQ_MODE_START || tmp_val > CC_EQ_MODE_END) {
- tmp_val = CC_EQ_MODE_START;
- }
-
- mCurAudioEQMode = tmp_val;
- tmp_ch = tmp_val;
- SSMSaveAudioEQModeVal(tmp_ch);
-
- return tmp_val;
-}
-
-int CTvAudio::LoadCurAudioEQMode()
-{
- int8_t tmp_ch = 0;
- SSMReadAudioEQModeVal(&tmp_ch);
- mCurAudioEQMode = tmp_ch;
- if (mCurAudioEQMode < CC_EQ_MODE_START
- || mCurAudioEQMode > CC_EQ_MODE_END) {
- SaveCurAudioEQMode (CC_EQ_MODE_START);
- }
-
- mCustomAudioEQMode = mCurAudioEQMode;
-
- return mCurAudioEQMode;
-}
-
-//Audio EQ Gain
-int CTvAudio::GetAudioEQRange(int range_buf[])
-{
- range_buf[0] = GetEQMinGainVal();
- range_buf[1] = GetEQMaxGainVal();
- return 0;
-}
-
-int CTvAudio::GetAudioEQBandCount()
-{
- return mAudioEffect.GetEQBandCount();
-}
-
-int CTvAudio::SetAudioEQGain(int gain_buf[])
-{
- return AudioSetEQGain(gain_buf);
-}
-
-int CTvAudio::GetAudioEQGain(int gain_buf[])
-{
- return GetCustomEQGain(gain_buf);
-}
-
-int CTvAudio::GetCurAudioEQGain(int gain_buf[])
-{
- RealReadCurAudioEQGain(gain_buf);
- return 0;
-}
-
-int CTvAudio::SaveCurAudioEQGain(int gain_buf[])
-{
- return RealSaveCurAudioEQGain(gain_buf, 1);
-}
-
-int CTvAudio::RealReadCurAudioEQGain(int gain_buf[])
-{
- if (CheckAudioEQGain(mCurEQGainBuf, 0) < 0) {
- RestoreToAudioDefEQGain(mCurEQGainBuf);
- }
-
- AudioArrayCopy(gain_buf, mCurEQGainBuf, GetAudioEQBandCount());
-
- return 0;
-}
-
-int CTvAudio::RealSaveCurAudioEQGain(int gain_buf[], int sound_mode_judge)
-{
- if (CheckAudioEQGain(gain_buf, 0) < 0) {
- RestoreToAudioDefEQGain(gain_buf);
- SetAudioEQGain(gain_buf);
- return -1;
- }
-
- AudioArrayCopy(mCurEQGainBuf, gain_buf, GetAudioEQBandCount());
- AudioArrayCopy(mCurEQGainChBuf, gain_buf, GetAudioEQBandCount());
- SSMSaveAudioEQGain(0, GetAudioEQBandCount(), mCurEQGainChBuf);
-
- if (sound_mode_judge == 1) {
- HandleTrebleBassVolume();
- SaveCurAudioSoundMode (CC_SOUND_MODE_USER);
- mCustomAudioSoundMode = mCurAudioSoundMode;
- }
-
- return 0;
-}
-
-int CTvAudio::LoadCurAudioEQGain()
-{
- int i = 0;
-
- SSMReadAudioEQGain(0, GetAudioEQBandCount(), mCurEQGainChBuf);
- AudioArrayCopy(mCurEQGainBuf, mCurEQGainChBuf, GetAudioEQBandCount());
-
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- if (mCurEQGainBuf[i] & 0x80) {
- mCurEQGainBuf[i] = mCurEQGainBuf[i] - 256;
- }
- }
-
- if (CheckAudioEQGain(mCurEQGainBuf, 0) < 0) {
- RestoreToAudioDefEQGain(mCurEQGainBuf);
- SetAudioEQGain(mCurEQGainBuf);
- return -1;
- }
-
- return 0;
-}
-
-int CTvAudio::SetAudioEQSwitch(int switch_val)
-{
- return mAudioEffect.SetEQSwitch(switch_val);
-}
-
-int CTvAudio::GetEQMinGainVal()
-{
- int min_val = 0, max_val = 0;
-
- if (GetAudioEQGainRangeCFG(&min_val, &max_val) < 0) {
- return mAudioEffect.GetEQMinGain();
- }
-
- return min_val;
-}
-
-int CTvAudio::GetEQMaxGainVal()
-{
- int min_val = 0, max_val = 0;
-
- if (GetAudioEQGainRangeCFG(&min_val, &max_val) < 0) {
- return mAudioEffect.GetEQMaxGain();
- }
-
- return max_val;
-}
-
-int CTvAudio::GetEQUIMinGainVal()
-{
- int min_val = 0, max_val = 0;
-
- if (GetAudioEQUIGainRangeCFG(&min_val, &max_val) < 0) {
- return CC_EQ_DEF_UI_MIN_GAIN;
- }
-
- return min_val;
-}
-
-int CTvAudio::GetEQUIMaxGainVal()
-{
- int min_val = 0, max_val = 0;
-
- if (GetAudioEQUIGainRangeCFG(&min_val, &max_val) < 0) {
- return CC_EQ_DEF_UI_MAX_GAIN;
- }
-
- return max_val;
-}
-
-int CTvAudio::GetBassUIMinGainVal()
-{
- return 0;
-}
-
-int CTvAudio::GetBassUIMaxGainVal()
-{
- return 100;
-}
-
-int CTvAudio::GetTrebleUIMinGainVal()
-{
- return 0;
-}
-
-int CTvAudio::GetTrebleUIMaxGainVal()
-{
- return 100;
-}
-
-int CTvAudio::MappingLine(int map_val, int src_min, int src_max, int dst_min,
- int dst_max)
-{
- if (dst_min < 0) {
- return (map_val - (src_max + src_min) / 2) * (dst_max - dst_min)
- / (src_max - src_min);
- } else {
- return (map_val - src_min) * (dst_max - dst_min) / (src_max - src_min);
- }
-}
-
-int CTvAudio::MappingTrebleBassAndEqualizer(int tmp_vol, int direct, int tb_min,
- int tb_max)
-{
- int tmp_ret = 0;
-
- if (direct == 0) {
- tmp_ret = MappingLine(tmp_vol, tb_min, tb_max, GetEQUIMinGainVal(),
- GetEQUIMaxGainVal());
- } else {
- tmp_ret = MappingLine(tmp_vol, GetEQUIMinGainVal(), GetEQUIMaxGainVal(),
- tb_min, tb_max);
- }
-
- LOGD("%s, tmp_vol = %d, direct = %d, tmp_ret = %d\n", __FUNCTION__, tmp_vol,
- direct, tmp_ret);
-
- return tmp_ret;
-}
-
-int CTvAudio::MappingEQGain(int src_gain_buf[], int dst_gain_buf[], int direct)
-{
- int i = 0;
- int nMinUIVal = 0, nMaxUIVal = 0, nMinVal = 0, nMaxVal = 0;
-
- nMinUIVal = GetEQUIMinGainVal();
- nMaxUIVal = GetEQUIMaxGainVal();
- nMinVal = GetEQMinGainVal();
- nMaxVal = GetEQMaxGainVal();
-
- if (CheckAudioEQGain(src_gain_buf, direct) < 0) {
- return -1;
- }
-
- if (nMinUIVal >= nMinVal && nMaxUIVal <= nMaxVal) {
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- dst_gain_buf[i] = src_gain_buf[i];
- }
- } else {
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- if (direct == 0) {
- dst_gain_buf[i] = MappingLine(src_gain_buf[i], nMinUIVal,
- nMaxUIVal, nMinVal, nMaxVal);
- } else {
- dst_gain_buf[i] = MappingLine(src_gain_buf[i], nMinVal, nMaxVal,
- nMinUIVal, nMaxUIVal);
- }
- }
- }
-
- return 0;
-}
-
-int CTvAudio::RestoreToAudioDefEQGain(int gain_buf[])
-{
- int i = 0;
- int *tmpEQPresetBufPtr = GetAudioEQPresetBufferPtr();
-
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- gain_buf[i] = (GetEQUIMaxGainVal() + GetEQUIMinGainVal()) / 2;
- }
-
- AudioArrayCopy(mCurEQGainBuf, gain_buf, GetAudioEQBandCount());
- AudioArrayCopy(mCurEQGainChBuf, gain_buf, GetAudioEQBandCount());
- SSMSaveAudioEQGain(0, GetAudioEQBandCount(), mCurEQGainChBuf);
-
- HandleTrebleBassVolume();
- SaveCurAudioSoundMode (CC_SOUND_MODE_STD);
- mCustomAudioSoundMode = mCurAudioSoundMode;
-
- return 0;
-}
-
-int CTvAudio::CheckAudioEQGain(int gain_buf[], int direct)
-{
- int i;
-
- if (direct == 0) {
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- if (gain_buf[i] < GetEQUIMinGainVal()
- || gain_buf[i] > GetEQUIMaxGainVal()) {
- return -1;
- }
- }
- } else {
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- if (gain_buf[i] < GetEQMinGainVal()
- || gain_buf[i] > GetEQMaxGainVal()) {
- return -1;
- }
- }
- }
-
- return 0;
-}
-
-int CTvAudio::GetCustomEQGain(int gain_buf[])
-{
- AudioArrayCopy(gain_buf, mCustomEQGainBuf, GetAudioEQBandCount());
- return 0;
-}
-
-int CTvAudio::SetCustomEQGain()
-{
- int tmpEQGainBuf[128] = { 0 };
-
- if (MappingEQGain(mCustomEQGainBuf, tmpEQGainBuf, 0) < 0) {
- return -1;
- }
-
- return RealSetEQGain(tmpEQGainBuf);
-}
-
-int CTvAudio::AudioSetEQGain(int gain_buf[])
-{
- int tmpEQGainBuf[128] = { 0 };
-
- AudioArrayCopy(mCustomEQGainBuf, gain_buf, GetAudioEQBandCount());
-
- if (MappingEQGain(mCustomEQGainBuf, tmpEQGainBuf, 0) < 0) {
- return -1;
- }
-
- return RealSetEQGain(tmpEQGainBuf);
-}
-
-int CTvAudio::handleEQGainBeforeSet(int src_buf[], int dst_buf[])
-{
- int i = 0, nMinGain, nMaxGain, handle_wall_effect_flag;
-
- nMinGain = GetEQMinGainVal();
- nMaxGain = GetEQMaxGainVal();
-
- handle_wall_effect_flag = 0;
-
- if (GetAudioWallEffect() == CC_SWITCH_ON) {
- if (GetAudioWallEffectTypeCfg() == 0) {
- handle_wall_effect_flag = 1;
- }
- }
-
- if (handle_wall_effect_flag) {
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- dst_buf[i] = mWallEffectValueBuf[i] + src_buf[i];
- }
- } else {
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- dst_buf[i] = src_buf[i];
- }
- }
-
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- if (dst_buf[i] < nMinGain) {
- dst_buf[i] = nMinGain;
- }
-
- if (dst_buf[i] > nMaxGain) {
- dst_buf[i] = nMaxGain;
- }
-
- LOGD("%s, dst_buf[%d] = %d\n", __FUNCTION__, i, dst_buf[i]);
- }
-
- return 0;
-}
-
-int CTvAudio::RealSetEQGain(int gain_buf[])
-{
- int tmpEQGainBuf[128] = { 0 };
-
- if (CheckAudioEQGain(gain_buf, 1) < 0) {
- return -1;
- }
-
- handleEQGainBeforeSet(gain_buf, tmpEQGainBuf);
-
- mAudioEffect.SetEQValue(tmpEQGainBuf);
-
- return 0;
-}
-
-int CTvAudio::SetSpecialModeEQGain(int tmp_val)
-{
- int i = 0;
- int *tmpEQPresetBufPtr = GetAudioEQPresetBufferPtr();
- int tmpEQGainBuf[128] = { 0 };
-
- if (tmp_val < CC_SOUND_MODE_START || tmp_val > CC_SOUND_MODE_END) {
- tmp_val = CC_SOUND_MODE_STD;
- }
-
- if (tmp_val == CC_SOUND_MODE_USER) {
- RealReadCurAudioEQGain(tmpEQGainBuf);
- } else {
- AudioArrayCopy(tmpEQGainBuf,
- tmpEQPresetBufPtr + tmp_val * GetAudioEQBandCount(),
- GetAudioEQBandCount());
-
- for (i = 0; i < GetAudioEQBandCount(); i++) {
- if (GetEQUIMinGainVal() != CC_EQ_DEF_UI_MIN_GAIN
- || GetEQUIMaxGainVal() != CC_EQ_DEF_UI_MAX_GAIN) {
- tmpEQGainBuf[i] = MappingLine(tmpEQGainBuf[i],
- CC_EQ_DEF_UI_MIN_GAIN, CC_EQ_DEF_UI_MAX_GAIN,
- GetEQUIMinGainVal(), GetEQUIMaxGainVal());
- }
- }
- }
-
- AudioSetEQGain(tmpEQGainBuf);
-
- return tmp_val;
-}
-
-int CTvAudio::SetSpecialIndexEQGain(int buf_index, int w_val)
-{
- int tmpEQGainBuf[128] = { 0 };
-
- if (buf_index >= 0 && buf_index < GetAudioEQBandCount()) {
- RealReadCurAudioEQGain(tmpEQGainBuf);
- tmpEQGainBuf[buf_index] = w_val;
-
- return AudioSetEQGain(tmpEQGainBuf);
- }
-
- return -1;
-}
-
-int CTvAudio::SaveSpecialIndexEQGain(int buf_index, int w_val)
-{
- int tmpEQGainBuf[128] = { 0 };
-
- if (buf_index >= 0 && buf_index < GetAudioEQBandCount()) {
- RealReadCurAudioEQGain(tmpEQGainBuf);
- tmpEQGainBuf[buf_index] = w_val;
-
- return RealSaveCurAudioEQGain(tmpEQGainBuf, 0);
- }
-
- return 0;
-}
-
-// amAudio
-int CTvAudio::OpenAmAudio(unsigned int sr, int output_device)
-{
- if (GetamAudioDisableFlagCFG() == 1) {
- return 0;
- }
-
- return amAudioOpen(sr, CC_IN_USE_I2S_DEVICE, output_device);
-}
-
-int CTvAudio::CloseAmAudio(void)
-{
- if (GetamAudioDisableFlagCFG() == 1) {
- return 0;
- }
-
- return amAudioClose();
-}
-
-int CTvAudio::SetAmAudioInputSr(unsigned int sr, int output_device)
-{
- return amAudioSetInputSr(sr, CC_IN_USE_I2S_DEVICE, output_device);
-}
-
-int CTvAudio::SetAmAudioOutputMode(int mode)
-{
- if (mode != CC_AMAUDIO_OUT_MODE_MIX && mode != CC_AMAUDIO_OUT_MODE_DIRECT) {
- LOGE("%s, mode error, it should be mix or direct!\n", __FUNCTION__);
- return -1;
- }
-
- return amAudioSetOutputMode(mode);
-}
-
-int CTvAudio::SetAmAudioMusicGain(int gain)
-{
- return amAudioSetMusicGain(gain);
-}
-
-int CTvAudio::SetAmAudioLeftGain(int gain)
-{
- return amAudioSetLeftGain(gain);
-}
-
-int CTvAudio::SetAmAudioRightGain(int gain)
-{
- return amAudioSetRightGain(gain);
-}
-
-//dump data
-int CTvAudio::SetAudioDumpDataFlag(int tmp_flag)
-{
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return amAndroidSetDumpDataFlag(tmp_flag);
-#endif
-
-#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1
- return amAudioSetDumpDataFlag(tmp_flag);
-#endif
-}
-
-int GetAudioDumpDataFlag()
-{
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return amAndroidGetDumpDataFlag();
-#endif
-
-#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1
- return amAudioGetDumpDataFlag();
-#endif
-}
-
-//LUT buffer
-static int RealCalVolDigitLUTBuf(int start_ind, int end_ind, int start_val,
- int end_val, int lut_buf[])
-{
- int i = 0;
- float tmp_step = 0;
-
- if (end_ind < start_ind) {
- return 0;
- }
-
- tmp_step = (float) (end_val - start_val) / (float) (end_ind - start_ind);
-
- for (i = start_ind; i < end_ind; i++) {
- lut_buf[i] = start_val + (int) (tmp_step * (i - start_ind));
- }
-
- lut_buf[end_ind] = end_val;
-
- return 1;
-}
-
-static int CalVolumeDigitLUTBuf(int lut_buf_type, int lut_sel_flag, int lut_buf[])
-{
- int i = 0, point_cnt = 0;
- int *tmpNoLinePointsDataBuffer = NULL;
- int *tmpNoLinePointsIndexBuffer = NULL;
-
- if (lut_sel_flag == CC_LUT_SEL_TV) {
- tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer(
- lut_buf_type, CC_GET_LUT_TV);
- tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer(
- lut_buf_type, CC_GET_LUT_TV);
- } else if (lut_sel_flag == CC_LUT_SEL_AV) {
- tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer(
- lut_buf_type, CC_GET_LUT_AV);
- tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer(
- lut_buf_type, CC_GET_LUT_AV);
- } else if (lut_sel_flag == CC_LUT_SEL_COMP) {
- tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer(
- lut_buf_type, CC_GET_LUT_COMP);
- tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer(
- lut_buf_type, CC_GET_LUT_COMP);
- } else if (lut_sel_flag == CC_LUT_SEL_HDMI) {
- tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer(
- lut_buf_type, CC_GET_LUT_HDMI);
- tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer(
- lut_buf_type, CC_GET_LUT_HDMI);
- } else if (lut_sel_flag == CC_LUT_SEL_VGA) {
- tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer(
- lut_buf_type, CC_GET_LUT_VGA);
- tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer(
- lut_buf_type, CC_GET_LUT_VGA);
- } else if (lut_sel_flag == CC_LUT_SEL_MPEG) {
- tmpNoLinePointsIndexBuffer = GetAudioAmplifierNoLinePointsIndexBuffer(
- lut_buf_type, CC_GET_LUT_MPEG);
- tmpNoLinePointsDataBuffer = GetAudioAmplifierNoLinePointsDataBuffer(
- lut_buf_type, CC_GET_LUT_MPEG);
- }
-
- lut_buf[0] = CC_MIN_DAC_VOLUME;
- point_cnt = GetAudioAmplifierMasterNoLinePointsCount();
-
- if (tmpNoLinePointsIndexBuffer != NULL
- && tmpNoLinePointsDataBuffer != NULL) {
- for (i = 0; i < (point_cnt - 1); i++) {
- RealCalVolDigitLUTBuf(tmpNoLinePointsIndexBuffer[i],
- tmpNoLinePointsIndexBuffer[i + 1],
- tmpNoLinePointsDataBuffer[i],
- tmpNoLinePointsDataBuffer[i + 1], lut_buf);
- }
- }
-
- return 1;
-}
-
-void CTvAudio::RealHandleVolumeDigitLUTBuf(int lut_buf_type, int lut_sel_flag,
- int vol_buf[], int add_srs_gain_flag, int add_eq_gain_flag)
-{
- int i;
- int TempVolumeDigitLutBuf[CC_LUT_BUF_SIZE] = { 0 };
-
- if (vol_buf == NULL) {
- CalVolumeDigitLUTBuf(lut_buf_type, lut_sel_flag, TempVolumeDigitLutBuf);
- } else {
- for (i = 0; i < CC_LUT_BUF_SIZE; i++) {
- TempVolumeDigitLutBuf[i] = vol_buf[i];
- }
- }
-
- if (lut_buf_type == CC_LUT_BUF_MASTER) {
- mAudioAlsa.SetMainVolDigitLutBuf(TempVolumeDigitLutBuf);
- } else if (lut_buf_type == CC_LUT_BUF_SUPPERBASS) {
- mAudioAlsa.SetSupperBassVolDigitLutBuf(TempVolumeDigitLutBuf);
- }
-}
-
-void CTvAudio::AudioSetVolumeDigitLUTBuf(int lut_sel_flag, int add_srs_gain_flag,
- int add_eq_gain_flag, int audio_std)
-{
- int cfg_get_index = CC_LUT_SEL_MPEG;
- int *tmpDefDigitLutBuf = NULL;
-
- if (lut_sel_flag == CC_LUT_SEL_TV) {
- cfg_get_index = CC_GET_LUT_TV;
- } else if (lut_sel_flag == CC_LUT_SEL_AV) {
- cfg_get_index = CC_GET_LUT_AV;
- } else if (lut_sel_flag == CC_LUT_SEL_COMP) {
- cfg_get_index = CC_GET_LUT_COMP;
- } else if (lut_sel_flag == CC_LUT_SEL_HDMI) {
- cfg_get_index = CC_GET_LUT_HDMI;
- } else if (lut_sel_flag == CC_LUT_SEL_VGA) {
- cfg_get_index = CC_GET_LUT_VGA;
- } else if (lut_sel_flag == CC_LUT_SEL_MPEG) {
- cfg_get_index = CC_GET_LUT_MPEG;
- }
-
- if (GetAudioAmplifierMasterNoLineSwitchFlag() == 0) {
- tmpDefDigitLutBuf = GetAudioAmplifierMasterVolumeLUTBufferPtr(
- cfg_get_index, audio_std);
- if (tmpDefDigitLutBuf != NULL) {
- RealHandleVolumeDigitLUTBuf(CC_LUT_BUF_MASTER, lut_sel_flag,
- tmpDefDigitLutBuf, add_srs_gain_flag, add_eq_gain_flag);
- }
- } else {
- RealHandleVolumeDigitLUTBuf(CC_LUT_BUF_MASTER, lut_sel_flag, NULL,
- add_srs_gain_flag, add_eq_gain_flag);
- }
-
- if (GetAudioSupperBassModuleDisableCFG() == 0) {
- if (GetAudioAmplifierSupperBassNoLineSwitchFlag() == 0) {
- tmpDefDigitLutBuf = GetAudioAmplifierSupperBassVolumeLUTBufferPtr(
- cfg_get_index, audio_std);
- if (tmpDefDigitLutBuf != NULL) {
- RealHandleVolumeDigitLUTBuf(CC_LUT_BUF_SUPPERBASS, lut_sel_flag,
- tmpDefDigitLutBuf, add_srs_gain_flag, add_eq_gain_flag);
- }
- } else {
- RealHandleVolumeDigitLUTBuf(CC_LUT_BUF_SUPPERBASS, lut_sel_flag,
- NULL, add_srs_gain_flag, add_eq_gain_flag);
- }
- }
-}
-
-int CTvAudio::openTvAudio(int sr)
-{
-
- char prop1[256];
- char prop2[256];
- property_get("audio.headset_plug.enable", prop1, "null");
- property_get("audio.output.double_output", prop2, "null");
- if(strcmp(prop1, "1") == 0) {
- if(strcmp(prop2, "1") == 0) {
- amAudioSetTvDoubleOutput(1, sr, CC_IN_USE_I2S_DEVICE, CC_OUT_USE_AMAUDIO);
- audio_device_switch = 1;
- } else {
- amAudioSetTvDoubleOutput(0, sr, CC_IN_USE_I2S_DEVICE, CC_OUT_USE_ANDROID);
- audio_device_switch = 0;
- }
- } else {
- amAudioSetTvDoubleOutput(1, sr, CC_IN_USE_I2S_DEVICE, CC_OUT_USE_AMAUDIO);
- audio_device_switch = 1;
- }
- return 0;
-}
-
-// audio data init & uninit
-int CTvAudio::AudioDataInitForDtv()
-{
- RealSetSRS();
- SetCustomEQGain();
-
- return 0;
-}
-
-int CTvAudio::AudioDataInit(int sr, bool enableNoiseGate)
-{
- const char *value;
- sr = HanldeAudioInputSr(sr);
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- if (GetDisableResetSystemFrameSize() == 0) {
- if (GetDisableReset_System_framesizeCFG() != 0x55)
- reset_system_framesize(48000, sr);
- }
-
- amAndroidInit(0, CC_FLAG_CREATE_RECORD | CC_FLAG_CREATE_TRACK, 48000, sr, enableNoiseGate);
-#endif
-
-#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1
- value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" );
- if ( strcmp ( value, "enable" ) == 0 )
- openTvAudio(sr);
- else
- OpenAmAudio(sr, CC_OUT_USE_AMAUDIO);
-#endif
-
- RealSetSRS();
- SetCustomEQGain();
-
- return 0;
-}
-
-int CTvAudio::AudioDataUnInit()
-{
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return amAndroidUninit(0);
-#endif
-
-#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1
- return CloseAmAudio();
-#endif
-}
-
-int CTvAudio::AudioChangeSampleRate(int sr)
-{
- sr = HanldeAudioInputSr(sr);
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- if (amAndroidSetTrackerSr(sr) != 0) {
- return -1;
- }
-#endif
-
-#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1
- if (SetAmAudioInputSr(sr, CC_OUT_USE_AMAUDIO) != 0) {
- return -1;
- }
-#endif
-
- RealSetSRS();
- SetCustomEQGain();
-
- return 0;
-}
-
-int CTvAudio::AudioNewAudioEffects(void)
-{
- return mAudioEffect.amAndroidNewAudioEffects();
-}
-
-void CTvAudio::AudioFreeAudioEffects(void)
-{
- return mAudioEffect.amAndroidFreeAudioEffects();
-}
-
-int CTvAudio::AudioSetAudioInSource(int audio_src_in_type)
-{
- return mAudioAlsa.SetAudioInSource(audio_src_in_type);
-}
-
-int CTvAudio::AudioSetAudioSourceType(int source_type)
-{
- return mAudioAlsa.SetDacAudioSourceType(source_type);
-}
-
-int CTvAudio::AudioLineInSelectChannel(int audio_channel)
-{
- LOGD ("%s, audio_channel = %d", __FUNCTION__, audio_channel);
- mAudioAlsa.SetInternalDacLineInSelectChannel(audio_channel);
- return 0;
-}
-int CTvAudio::SetKalaokIO(int level)
-{
- LOGD ("%s, SetKalaokIO = %d", __FUNCTION__, level);
- {
- const char *config_value;
- config_value = config_get_str("TV", "audio.switch.karaok.av.enable", "null");
-
- if (strtoul(config_value, NULL, 10) == 1) {
- mAudioAlsa.SetAudioSwitchIO(level);
- }
- }
- return 0;
-}
-
-int CTvAudio::AudioSetLineInCaptureVolume(int l_vol, int r_vol)
-{
- mAudioAlsa.SetInternalDacLineInCaptureVolume(l_vol, r_vol);
- return 0;
-}
-
-// Audio Ctl Init
-void CTvAudio::AudioCtlInitializeLoad()
-{
- int tmp_val = 0;
- int init_mute_type = 0;
-
- LOGD("%s, entering...\n", __FUNCTION__);
-
- createMonitorUsbHostBusThread();
-
- init_mute_type = GetAudioAVOutInitMuteStatusCFG();
-
- UnInitSetTvAudioCard();
-
- if (init_mute_type == 1) {
- SetAudioAVOutMute (CC_AUDIO_MUTE);
- } else {
- SetAudioAVOutMute (CC_AUDIO_UNMUTE);
- }
-
- SetAudioSPDIFMute (CC_AUDIO_UNMUTE);
-
- tmp_val = GetAudioDumpDataEnableFlagCfg();
- SetAudioDumpDataFlag(tmp_val);
-
- mAudioAlsa.SetMixerBypassSwitch (CC_SWITCH_OFF);
- mAudioAlsa.SetMixerDacSwitch (CC_SWITCH_ON);
-
- LoadAudioCtl();
-
- AudioSetVolumeDigitLUTBuf(CC_LUT_SEL_MPEG, 1, 1, -1);
-
- AudioCtlInitializeSet();
-}
-
-void CTvAudio::LoadAudioCtl()
-{
- // Get Current Audio Volume
- LoadCurAudioMasterVolume();
-
- // Get Current Audio Balance
- LoadCurAudioBalance();
-
- // Get Current Supper Bass Switch
- LoadCurAudioSupperBassSwitch();
-
- // Get Current Supper Bass Volume
- LoadCurAudioSupperBassVolume();
-
- // Get Current SRSSurround
- LoadCurAudioSrsSurround();
-
- // Get Current SRS DialogClarity
- LoadCurAudioSrsDialogClarity();
-
- // Get Current SRS TruBass
- LoadCurAudioSrsTruBass();
-
- // Get Current Audio Sound Mode
- LoadCurAudioSoundMode();
-
- // Get Current Audio Bass and Treble
- LoadCurAudioBassVolume();
- LoadCurAudioTrebleVolume();
-
- // Get Current Wall Effect
- LoadCurAudioWallEffect();
-
- // Get Current spdif switch
- LoadCurAudioSPDIFSwitch();
-
- // Get Current spdif mode
- LoadCurAudioSPDIFMode();
-
- // Get Current EQ mode
- LoadCurAudioEQMode();
-
- // Get Current EQ Gain
- LoadCurAudioEQGain();
-}
-
-void CTvAudio::InitSetAudioCtl()
-{
- // Set Current Audio balance value
- SetAudioBalance(GetAudioBalance());
-
- // Set Current Audio Volume
- SetAudioMasterVolume(GetAudioMasterVolume());
-
- // Set Current Supper Bass Volume
- SetAudioSupperBassVolume(GetAudioSupperBassVolume());
-
- // Set Current Audio Sound Mode
- SetAudioSoundMode(GetAudioSoundMode());
-
- // Set Current Audio SPDIF Switch
- SetAudioSPDIFSwitch(GetCurAudioSPDIFSwitch());
-
- // Set Current Audio SPDIF mode
- SetAudioSPDIFMode(GetCurAudioSPDIFMode());
-}
-
-static int gAudioFirstInitSetFlag = 0;
-static pthread_mutex_t first_init_set_flag_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-int CTvAudio::GetAudioFirstInitSetFlag()
-{
- int tmp_val = 0;
-
- pthread_mutex_lock(&first_init_set_flag_mutex);
- tmp_val = gAudioFirstInitSetFlag;
- pthread_mutex_unlock(&first_init_set_flag_mutex);
-
- return tmp_val;
-}
-
-void *CTvAudio::AudioCtlInitSetMain(void *data)
-{
- char prop_value[PROPERTY_VALUE_MAX];
-
- LOGD("%s, entering...\n", __FUNCTION__);
- pthread_mutex_lock(&first_init_set_flag_mutex);
-
- if (gAudioFirstInitSetFlag == 0) {
- AudioNewAudioEffects();
- RealSetSRS();
- AudioSetVolumeDigitLUTBuf(CC_LUT_SEL_MPEG, 1, 1, -1);
- InitSetAudioCtl();
- gAudioFirstInitSetFlag = 1;
- }
-
- pthread_mutex_unlock(&first_init_set_flag_mutex);
-
- LOGD("%s, exiting...\n", __FUNCTION__);
-
- return NULL;
-}
-
-void CTvAudio::AudioCtlInitializeSet()
-{
- AudioCtlInitSetMain (NULL);
- return;
-}
-
-void CTvAudio::AudioCtlInit()
-{
- InitSetTvAudioCard();
-}
-
-void CTvAudio::AudioCtlUninit()
-{
- int l_vol = 0, r_vol = 0;
- int audio_channel = -1;
- int oldMuteStatus;
-
- oldMuteStatus = GetAudioMuteForTv();
- SetAudioMuteForTv (CC_AUDIO_MUTE);
-
- AudioSetAudioInSource (CC_AUDIO_IN_SOURCE_LINEIN);
- AudioSetAudioSourceType (AUDIO_MPEG_SOURCE);
-
- AudioDataUnInit();
-
- SetAudioVolumeCompensationVal(0);
-
- AudioSetVolumeDigitLUTBuf(CC_LUT_SEL_MPEG, 1, 1, -1);
- SetAudioMasterVolume(GetAudioMasterVolume());
-
- SetAudioMuteForTv(oldMuteStatus);
-
- UnInitSetTvAudioCard();
-}
-
-int CTvAudio::AudioSetRecordDataZero(bool flag)
-{
- return 0;
-}
-
-int CTvAudio::AudioHandleHeadsetPlugIn()
-{
- return 0;
-}
-
-int CTvAudio::AudioHandleHeadsetPullOut()
-{
- return 0;
-}
-
-int CTvAudio::amAudioSetDoubleOutputSwitch(int en_val)
-{
- if(en_val == 1) {
- property_set("audio.output.enable", "1");
- property_set("audio.output.double_output", "1");
- }
- if(en_val == 0) {
- property_set("audio.output.enable", "0");
- property_set("audio.output.double_output", "0");
- }
- return 0;
-}
-
-int CTvAudio::setAudioPcmPlaybackVolume(int val)
-{
- int pcm_volume = 0;
- pcm_volume = val / 2;
- if(pcm_volume > 24) pcm_volume = 24;
- //return SetAudioPcmPlaybackVolume(pcm_volume);
- return 0;
-}
-
-int CTvAudio::UsbAudioOuputModuleSwitch(int sw)
-{
- if(sw == 1)
- property_set("persist.tv.audio_output_enable", "1");
- if(sw == 0)
- property_set("persist.tv.audio_output_enable", "0");
- return 0;
-}
-
-int CTvAudio::GetAmAudioSetDoubleOutputSwitch()
-{
- char prop2[256];
- property_get("audio.output.double_output", prop2, "null");
- if (strcmp(prop2, "0") == 0 || strcmp(prop2, "null") == 0) {
- return 0;
- } else if (strcmp(prop2, "1") == 0) {
- return 1;
- }
- return 0;
-}
-
-int CTvAudio::GetCurUsbAudioOuputModuleSwitch()
-{
- char prop1[256];
- property_get("audio.output.enable", prop1, "null");
- if (strcmp(prop1, "0") == 0 || strcmp(prop1, "null") == 0) {
- return 0;
- } else if (strcmp(prop1, "1") == 0) {
- return 1;
- }
- return 0;
-}
-
-int CTvAudio::amAudioSetTvDoubleOutput(int en_val, unsigned int sr, int input_device,
- int output_device)
-{
- return amAudioSetDoubleOutput(en_val, sr, input_device, output_device);
-}
-int CTvAudio::HanldeAudioInputSr(unsigned int sr)
-{
- int tmp_cfg = 0;
-
- tmp_cfg = GetAudioResampleTypeCFG();
- if (tmp_cfg & CC_AUD_RESAMPLE_TYPE_HW) {
- mAudioAlsa.SetHardwareResample(sr);
- } else {
- mAudioAlsa.SetHardwareResample(-1);
- }
-
- if (!(tmp_cfg & CC_AUD_RESAMPLE_TYPE_SW)) {
- sr = 48000;
- }
-
- return sr;
-}
-
-void CTvAudio::AudioSetNoiseGateThreshold(int thresh)
-{
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- amAndroidSetNoiseGateThreshold(thresh);
-#endif
-
-#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1
- return;
-#endif
-}
-
-int CTvAudio::AudioSSMRestoreDefaultSetting()
-{
- int i = 0, tmp_val = 0;
- int nMinUIVol = 0, nMaxUIVol = 0;
- int *tmp_ptr = NULL;
- int tmpEQGainBuf[128] = { 0 };
- unsigned char tmp_buf[CC_NO_LINE_POINTS_MAX_CNT] = { 0 };
-
- // Save noline points
- tmp_val = GetAudioAmplifierMasterNoLinePointsCount();
-
- for (i = 0; i < CC_LUT_SEL_COUNT; i++) {
- tmp_ptr = GetAudioAmplifierMasterNoLinePointsDefDataBuffer(i);
- AudioArrayCopy(tmp_buf, tmp_ptr, CC_NO_LINE_POINTS_MAX_CNT);
- SSMSaveAudioNoLinePoints(i * tmp_val, tmp_val, tmp_buf);
- }
-
- // Save Current Audio Volume
- SaveCurAudioMasterVolume (CC_DEF_SOUND_VOL);
-
- // Save Current Audio Balance
- SaveCurAudioBalance (CC_DEF_SOUND_BALANCE_VAL);
-
- // Save Current Supper Bass Switch
- SaveCurAudioSupperBassSwitch (CC_SWITCH_OFF);
-
- // Save Current Supper Bass Volume
- SaveCurAudioSupperBassVolume (CC_DEF_SUPPERBASS_VOL);
-
- // Save Current SRSSurround
- SaveCurAudioSrsSurround(CC_SWITCH_OFF);
-
- // Save Current SRS DialogClarity
- SaveCurAudioSrsDialogClarity(CC_SWITCH_OFF);
-
- // Save Current SRS TruBass
- SaveCurAudioSrsTruBass(CC_SWITCH_OFF);
-
- // Save Current Audio Sound Mode
- SaveCurAudioSoundMode (CC_SOUND_MODE_STD);
-
- // Save Current Wall Effect
- SaveCurAudioWallEffect(CC_SWITCH_OFF);
-
- // Save Current spdif switch
- SaveCurAudioSPDIFSwitch (CC_SWITCH_ON);
-
- // Save Current spdif mode
- SaveCurAudioSPDIFMode (CC_SPDIF_MODE_PCM);
-
- // Save Current EQ mode
- SaveCurAudioEQMode (CC_EQ_MODE_NOMAL);
-
- // Save Current EQ Gain
- RestoreToAudioDefEQGain(tmpEQGainBuf);
-
- // Save Current Audio Bass and Treble
- nMinUIVol = GetBassUIMinGainVal();
- nMaxUIVol = GetBassUIMaxGainVal();
- RealSaveCurAudioBassVolume((nMinUIVol + nMaxUIVol) / 2, 0);
-
- nMinUIVol = GetTrebleUIMinGainVal();
- nMaxUIVol = GetTrebleUIMaxGainVal();
- RealSaveCurAudioTrebleVolume((nMinUIVol + nMaxUIVol) / 2, 0);
-
- return 0;
-}
-
-
-static const char *gDefCapturePropName = "snd.card.default.card.capture";
-
-int CTvAudio::InitSetTvAudioCard()
-{
- int i = 0, totle_num = 0, capture_ind = 0;
- char tmp_buf[32] = { 0 };
- char tv_card_name[64] = { 0 };
- char prop_value[PROPERTY_VALUE_MAX];
-
-#ifdef BOARD_ALSA_AUDIO_TINY
-#else // legacy alsa lib
- snd_card_refresh_info();
-#endif
-
- if (GetTvAudioCardNeedSet()) {
- memset(prop_value, '\0', PROPERTY_VALUE_MAX);
- property_get("snd.card.totle.num", prop_value, "0");
-
- totle_num = strtoul(prop_value, NULL, 10);
- LOGD("%s, totle number = %d\n", __FUNCTION__, totle_num);
- totle_num = 8;
-
- GetTvAudioCardName(tv_card_name);
-
- for (i = 0; i < totle_num; i++) {
- sprintf(tmp_buf, "snd.card.%d.name", i);
- memset(prop_value, '\0', PROPERTY_VALUE_MAX);
- property_get(tmp_buf, prop_value, "null");
-
- LOGD("%s, key string \"%s\", value string \"%s\".\n", __FUNCTION__,
- tmp_buf, prop_value);
-
- if (strcmp(prop_value, tv_card_name) == 0) {
- break;
- }
- }
-
- capture_ind = i;
-
- if (capture_ind == totle_num) {
- capture_ind = -1;
- LOGE("%s, can't find tv card \"%s\".\n", __FUNCTION__,
- tv_card_name);
- }
- } else {
- capture_ind = -1;
- }
-
- sprintf(tmp_buf, "%d", capture_ind);
- property_set(gDefCapturePropName, tmp_buf);
- LOGD("%s, set \"%s\" as \"%s\".\n", __FUNCTION__, gDefCapturePropName,
- tmp_buf);
-
- return 0;
-}
-
-int CTvAudio::UnInitSetTvAudioCard()
-{
- char tmp_buf[32] = { 0 };
-
-#ifdef BOARD_ALSA_AUDIO_TINY
-#else // legacy alsa lib
- snd_card_refresh_info();
-#endif // BOARD_ALSA_AUDIO_TINY
- sprintf(tmp_buf, "%d", -1);
- property_set(gDefCapturePropName, tmp_buf);
- LOGD("%s, set \"%s\" as \"%s\".\n", __FUNCTION__, gDefCapturePropName,
- tmp_buf);
-
- return 0;
-}
-
-#define CS_SPDIF_MODE_DEV_PATH "/sys/class/audiodsp/digital_raw"
-
-int CTvAudio::SetSPDIFMode(int mode_val)
-{
- FILE *spdif_mode_fp = NULL;
-
- spdif_mode_fp = fopen(CS_SPDIF_MODE_DEV_PATH, "w");
- if (spdif_mode_fp == NULL) {
- LOGE("%s, Open file %s error(%s)!\n", __FUNCTION__, CS_SPDIF_MODE_DEV_PATH, strerror(errno));
- return -1;
- }
-
- if (mode_val == CC_SPDIF_MODE_PCM) {
- fprintf(spdif_mode_fp, "%d", 0);
- } else if(mode_val == CC_SPDIF_MODE_RAW ) {
- fprintf(spdif_mode_fp, "%d", 1);
- }
-
- fclose(spdif_mode_fp);
- spdif_mode_fp = NULL;
-
- return 0;
-}
-//0 is ??? 1 is ????????
-int CTvAudio::SwitchAVOutBypass(int sw)
-{
- if (sw == 0 ) {
- mAudioAlsa.SetMixerBypassSwitch ( CC_SWITCH_OFF );
- mAudioAlsa.SetMixerDacSwitch ( CC_SWITCH_ON );
- } else {
- mAudioAlsa.SetMixerBypassSwitch ( CC_SWITCH_ON );
- mAudioAlsa.SetMixerDacSwitch ( CC_SWITCH_OFF );
- }
- return 0;
-}
-
-int CTvAudio::SetAudioSwitchIO(int value)
-{
- return mAudioAlsa.SetAudioSwitchIO( value);
-}
-int CTvAudio::SetOutput_Swap(int value)
-{
- return mAudioAlsa.SetOutput_Swap( value);
-}
diff --git a/tvapi/libtv/audio/audio_api.h b/tvapi/libtv/audio/audio_api.h
deleted file mode 100644
index 23918be..0000000
--- a/tvapi/libtv/audio/audio_api.h
+++ b/dev/null
@@ -1,323 +0,0 @@
-#ifndef __TV_AUDIO_API_H__
-#define __TV_AUDIO_API_H__
-
-#include "tvsetting/audio_cfg.h"
-#include "audio_alsa.h"
-#include "audio_effect.h"
-
-enum CC_AUDIO_SWITCH_STATUS {
- CC_SWITCH_OFF,
- CC_SWITCH_ON,
-};
-
-enum CC_AMAUDIO_OUT_MODE {
- CC_AMAUDIO_OUT_MODE_DIRECT,
- CC_AMAUDIO_OUT_MODE_MIX,
-};
-
-static const int CC_SPDIF_MODE_PCM = 0;
-static const int CC_SPDIF_MODE_RAW = 1;
-
-static const int CC_MIN_SOUND_VOL = 0;
-static const int CC_MAX_SOUND_VOL = (100);
-static const int CC_DEF_SOUND_VOL = (30);
-static const int CC_MIN_SUPPERBASS_VOL = (0);
-static const int CC_MAX_SUPPERBASS_VOL = (100);
-static const int CC_DEF_SUPPERBASS_VOL = (50);
-
-static const int CC_VOLUME_COMPENSATION_MIN_VAL = (-20);
-static const int CC_VOLUME_COMPENSATION_MAX_VAL = (20);
-static const int CC_VOLUME_COMPENSATION_DEF_VAL = (0);
-
-static const int CC_DEF_BASS_TREBLE_VOL = 50;
-static const int CC_EQ_BASS_IND = 1;
-static const int CC_EQ_TREBLE_IND = 3;
-static const int CC_EQ_DEF_UI_MIN_GAIN = 0;
-static const int CC_EQ_DEF_UI_MAX_GAIN = 100;
-static const int CC_LUT_SEL_TV = 0;
-static const int CC_LUT_SEL_AV = 1;
-static const int CC_LUT_SEL_COMP = 2;
-static const int CC_LUT_SEL_HDMI = 3;
-static const int CC_LUT_SEL_VGA = 4;
-static const int CC_LUT_SEL_MPEG = 5;
-static const int CC_LUT_SEL_COUNT = 6;
-
-
-enum CC_AUD_SOUND_MODE {
- CC_SOUND_MODE_START = 0,
- CC_SOUND_MODE_STD = 0,
- CC_SOUND_MODE_MUSIC,
- CC_SOUND_MODE_NEWS,
- CC_SOUND_MODE_THEATER,
- CC_SOUND_MODE_USER,
- CC_SOUND_MODE_END = CC_SOUND_MODE_USER
-};
-
-enum CC_AUD_EQ_MODE {
- CC_EQ_MODE_START = 0,
- CC_EQ_MODE_NOMAL = 0,
- CC_EQ_MODE_POP,
- CC_EQ_MODE_JAZZ,
- CC_EQ_MODE_ROCK,
- CC_EQ_MODE_CLASSIC,
- CC_EQ_MODE_DANCE,
- CC_EQ_MODE_PARTY,
- CC_EQ_MODE_BASS,
- CC_EQ_MODE_TREBLE,
- CC_EQ_MODE_CUSTOM,
- CC_EQ_MODE_END = CC_EQ_MODE_CUSTOM
-};
-class CTvAudio {
-public:
- CTvAudio();
- ~CTvAudio();
- //Audio Mute
- int SetAudioMuteForSystem(int);
- int GetAudioMuteForSystem();
- int SetAudioMuteForTv(int );
- int GetAudioMuteForTv();
- int SetAudioAVOutMute(int muteStatus);
- int GetAudioAVOutMute();
- int SetAudioSPDIFMute(int muteStatus);
- int GetAudioSPDIFMute();
-
- //Audio Master Volume
- int SetAudioMasterVolume(int tmp_vol);
- int GetAudioMasterVolume();
- int SaveCurAudioMasterVolume(int tmp_vol);
- int GetCurAudioMasterVolume();
-
- //Audio Balance
- int SetAudioBalance(int tmp_val);
- int GetAudioBalance();
- int SaveCurAudioBalance(int tmp_val);
- int GetCurAudioBalance();
-
- //Audio SupperBass Volume
- int SetAudioSupperBassVolume(int tmp_vol);
- int GetAudioSupperBassVolume();
- int SaveCurAudioSupperBassVolume(int tmp_vol);
- int GetCurAudioSupperBassVolume();
-
- //Audio SupperBass Switch
- int SetAudioSupperBassSwitch(int tmp_val);
- int GetAudioSupperBassSwitch();
- int SaveCurAudioSupperBassSwitch(int tmp_val);
- int GetCurAudioSupperBassSwitch();
-
- //Audio SRS Surround switch
- int SetAudioSRSSurround(int tmp_val);
- int GetAudioSRSSurround();
- int SaveCurAudioSrsSurround(int tmp_val);
- int GetCurAudioSRSSurround();
-
- //Audio SRS Dialog Clarity
- int SetAudioSrsDialogClarity(int tmp_val);
- int GetAudioSrsDialogClarity();
- int SaveCurAudioSrsDialogClarity(int tmp_val);
- int GetCurAudioSrsDialogClarity();
-
- //Audio SRS Trubass
- int SetAudioSrsTruBass(int tmp_val);
- int GetAudioSrsTruBass();
- int SaveCurAudioSrsTruBass(int tmp_val);
- int GetCurAudioSrsTruBass();
-
- //Audio SPDIF switch
- int SetAudioSPDIFSwitch(int tmp_val);
- int GetCurAudioSPDIFSwitch();
- int SaveCurAudioSPDIFSwitch(int tmp_val);
-
- //Audio SPDIF Mode
- int SetAudioSPDIFMode(int tmp_val);
- int GetCurAudioSPDIFMode();
- int SaveCurAudioSPDIFMode(int tmp_val);
-
- //Audio Bass
- int SetAudioBassVolume(int tmp_vol);
- int GetAudioBassVolume();
- int SaveCurAudioBassVolume(int tmp_vol);
- int GetCurAudioBassVolume();
-
- //Audio Treble
- int SetAudioTrebleVolume(int tmp_vol);
- int GetAudioTrebleVolume();
- int SaveCurAudioTrebleVolume(int tmp_vol);
- int GetCurAudioTrebleVolume();
-
- //Audio Sound Mode
- int SetAudioSoundMode(int tmp_val);
- int GetAudioSoundMode();
- int SaveCurAudioSoundMode(int tmp_val);
- int GetCurAudioSoundMode();
-
- //Audio Wall Effect
- int SetAudioWallEffect(int tmp_val);
- int GetAudioWallEffect();
- int SaveCurAudioWallEffect(int tmp_val);
- int GetCurAudioWallEffect();
-
- //Audio EQ Mode
- int SetAudioEQMode(int tmp_val);
- int GetAudioEQMode();
- int SaveCurAudioEQMode(int tmp_val);
- int GetCurAudioEQMode();
-
- //Audio EQ Gain
- int GetAudioEQRange(int range_buf[]);
- int GetAudioEQBandCount();
- int SetAudioEQGain(int gain_buf[]);
- int GetAudioEQGain(int gain_buf[]);
- int GetCurAudioEQGain(int gain_buf[]);
- int SaveCurAudioEQGain(int gain_buf[]);
- int SetAudioEQSwitch(int switch_val);
-
- // amAudio
- int OpenAmAudio(unsigned int sr, int output_device);
- int CloseAmAudio(void);
- int SetAmAudioInputSr(unsigned int sr, int output_device);
- int SetAmAudioOutputMode(int mode);
- int SetAmAudioMusicGain(int gain);
- int SetAmAudioLeftGain(int gain);
- int SetAmAudioRightGain(int gain);
-
- int SetAudioVolumeCompensationVal(int tmp_vol_comp_val);
- int GetAudioVolumeCompensationVal();
-
- int AudioLineInSelectChannel(int audio_channel);
- int AudioSetLineInCaptureVolume(int l_vol, int r_vol);
- int SetKalaokIO(int level);
-
- int AudioHandleHeadsetPlugIn();
- int AudioHandleHeadsetPullOut();
- int amAudioSetDoubleOutputSwitch(int en_val);
- int setAudioPcmPlaybackVolume(int val);
- int UsbAudioOuputModuleSwitch(int sw);
- int GetAmAudioSetDoubleOutputSwitch();
- int GetCurUsbAudioOuputModuleSwitch();
- int amAudioSetTvDoubleOutput(int en_val, unsigned int sr, int input_device, int output_device);
-
- void AudioCtlInitializeLoad();
- void AudioCtlInit();
- void AudioCtlUninit();
- void AudioSetVolumeDigitLUTBuf(int lut_sel_flag, int add_srs_gain_flag, int add_eq_gain_flag, int audio_std);
- int openTvAudio(int sr);
-
- int AudioDataInitForDtv();
- int AudioDataInit(int sr, bool enableNoiseGate);
- int AudioDataUnInit();
- int AudioChangeSampleRate(int sr);
- int AudioSetAudioInSource(int audio_src_in_type);
- int AudioSetAudioSourceType(int source_type);
- int AudioSSMRestoreDefaultSetting();
- int AudioRegisterInterface();
- int AudioGetSessionId();
- int AudioNewAudioEffects(void);
- void AudioFreeAudioEffects(void);
- int SetAudioDumpDataFlag(int tmp_flag);
- int GetAudioDumpDataFlag();
- int SetAudioLeftRightMode(unsigned int mode);
- unsigned int GetAudioLeftRightMode();
- int AudioSetMicroPhoneSwitch(int switch_val);
- void AudioSetNoiseGateThreshold(int thresh);
- int AudioSetRecordDataZero(bool flag);
- int SwitchAVOutBypass (int);
- int SetAudioSwitchIO(int value);
- int SetOutput_Swap(int value);
-
-private:
- void RealHandleVolumeDigitLUTBuf(int lut_buf_type, int lut_sel_flag,
- int vol_buf[], int add_srs_gain_flag, int add_eq_gain_flag);
- int handleAudioSPDIFMute(int muteStatus);
- int LoadCurAudioSPDIFMode();
- int LoadCurAudioMasterVolume();
- int LoadCurAudioBalance();
- int LoadCurAudioSupperBassVolume();
- int LoadCurAudioSupperBassSwitch();
- int LoadCurAudioSrsSurround();
- int LoadCurAudioSrsDialogClarity();
- void RealSetSRS();
- int LoadCurAudioSPDIFSwitch();
- void HanldeSupperBassSRSSpeakerSize();
- int LoadCurAudioSoundMode();
- int LoadCurAudioEQMode();
- int LoadCurAudioSrsTruBass();
- int SetDacGain();
- int RealSaveCurAudioBassVolume(int, int);
- int LoadCurAudioBassVolume();
- int RealSaveCurAudioTrebleVolume(int, int);
- int LoadCurAudioTrebleVolume();
- int HandleTrebleBassVolume();
- int LoadCurAudioWallEffect();
- int RealReadCurAudioEQGain(int *);
- int RealSaveCurAudioEQGain(int *, int);
- int LoadCurAudioEQGain();
- int MappingEQGain(int *, int *, int);
- int RestoreToAudioDefEQGain(int *);
- int CheckAudioEQGain(int *, int);
- int GetCustomEQGain(int *);
- int SetCustomEQGain();
- int AudioSetEQGain(int *);
- int handleEQGainBeforeSet(int *, int *);
- int RealSetEQGain(int *);
- int SetSpecialModeEQGain(int);
- int SetSpecialIndexEQGain(int, int);
- int SaveSpecialIndexEQGain(int, int);
- void LoadAudioCtl();
- void InitSetAudioCtl();
- int GetAudioFirstInitSetFlag();
- int HanldeAudioInputSr(unsigned int);
- int waitServiceManager();
- void *AudioCtlInitSetMain(void *);
- void AudioCtlInitializeSet();
- int GetEQMinGainVal();
- int GetEQMaxGainVal();
- int GetEQUIMinGainVal();
- int GetEQUIMaxGainVal();
- int GetBassUIMinGainVal();
- int GetBassUIMaxGainVal();
- int GetTrebleUIMinGainVal();
- int GetTrebleUIMaxGainVal();
- int MappingLine(int, int, int, int, int);
- int MappingTrebleBassAndEqualizer(int, int, int, int);
- void HandleSupperBassSwicth();
- int InitSetTvAudioCard();
- int UnInitSetTvAudioCard();
- int SetSPDIFMode(int mode_val);
-
-
- CAudioAlsa mAudioAlsa;
- CAudioEffect mAudioEffect;
- int mAudioMuteStatusForSystem;
- int mAudioMuteStatusForTv;
-
- int mCurAudioMasterVolume;
- int mCurAudioBalance;
- int mCurAudioSupperBassVolume;
- int mCurAudioSupperBassSwitch;
- int mCurAudioSRSSurround;
- int mCurAudioSrsDialogClarity;
- int mCurAudioSrsTruBass;
- int mCurAudioSPDIFSwitch;
- int mCurAudioSPDIFMode;
- int mCurAudioBassVolume;
- int mCurAudioTrebleVolume;
- int mCurAudioSoundMode;
- int mCurAudioWallEffect;
- int mCurAudioEQMode;
- int mCustomAudioMasterVolume;
- int mCustomAudioBalance;
- int mCustomAudioSupperBassVolume;
- int mCustomAudioSupperBassSwitch;
- int mCustomAudioSRSSurround;
- int mCustomAudioSrsDialogClarity;
- int mCustomAudioSrsTruBass;
- int mCustomAudioBassVolume;
- int mCustomAudioTrebleVolume;
- int mCustomAudioSoundMode;
- int mCustomAudioWallEffect;
- int mCustomAudioEQMode;
- int mCustomAudioSoundEnhancementSwitch;
- volatile int mVolumeCompensationVal;
-};
-#endif //__TV_AUDIO_API_H__
diff --git a/tvapi/libtv/audio/audio_effect.cpp b/tvapi/libtv/audio/audio_effect.cpp
index d55fbe8..659b966 100644
--- a/tvapi/libtv/audio/audio_effect.cpp
+++ b/tvapi/libtv/audio/audio_effect.cpp
@@ -1,228 +1,128 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <malloc.h>
-#include <unistd.h>
-#include <pthread.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/poll.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-
-#include "audio_amaudio.h"
-#include "audio_effect.h"
-
-#define LOG_TAG "CAudioEffect"
-#include "CTvLog.h"
-
-#define CC_BAND_ITEM_CNT ( 6 )
-#define CC_MIN_EQ_GAIN_VAL ( -10 )
-#define CC_MAX_EQ_GAIN_VAL ( 10 )
-CAudioEffect::CAudioEffect()
-{
-}
-CAudioEffect::~CAudioEffect()
-{
-}
-
-int CAudioEffect::amAndroidNewAudioEffects()
-{
- return mAndroidEffect.amAndroidNewAudioEffects();
-}
-
-void CAudioEffect::amAndroidFreeAudioEffects()
-{
- return mAndroidEffect.amAndroidFreeAudioEffects();
-}
-
-int CAudioEffect::GetEQBandCount()
-{
- return CC_BAND_ITEM_CNT;
-}
-
-int CAudioEffect::GetEQMinGain()
-{
- return CC_MIN_EQ_GAIN_VAL;
-}
-
-int CAudioEffect::GetEQMaxGain()
-{
- return CC_MAX_EQ_GAIN_VAL;
-}
-
-int CAudioEffect::SetEQSwitch(int switch_val)
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidSetEQEnable(switch_val);
-#endif
-
-#ifdef CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetEQEnable(switch_val);
- tmp_ret |= mAndroidEffect.amAndroidSetEQEnable(switch_val);
- return tmp_ret;
-#endif
-}
-
-int CAudioEffect::GetEQSwitch()
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidGetEQEnabled();
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- return mAndroidEffect.amAndroidGetEQEnabled();
-#endif
-}
-
-int CAudioEffect::SetEQValue(int gain_val_buf[])
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidSetEQGain(gain_val_buf, CC_BAND_ITEM_CNT);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetEQGain(gain_val_buf, CC_BAND_ITEM_CNT);
- tmp_ret |= mAndroidEffect.amAndroidSetEQGain(gain_val_buf, CC_BAND_ITEM_CNT);
- return tmp_ret;
-#endif
-}
-
-int CAudioEffect::GetEQValue(int gain_val_buf[])
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidGetEQGain(gain_val_buf, CC_BAND_ITEM_CNT);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- return mAndroidEffect.amAndroidGetEQGain(gain_val_buf, CC_BAND_ITEM_CNT);
-#endif
-}
-
-int CAudioEffect::SetSrsSurroundSwitch(int switch_val)
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidSetSRSSurroundSwitch(switch_val);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetSRSSurroundSwitch(switch_val);
- tmp_ret |= mAndroidEffect.amAndroidSetSRSSurroundSwitch(switch_val);
- return tmp_ret;
-#endif
-}
-
-int CAudioEffect::SetSrsSurroundGain(int gain_val)
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidSetSRSSurroundGain(gain_val);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetSRSSurroundGain(gain_val);
- tmp_ret |= mAndroidEffect.amAndroidSetSRSSurroundGain(gain_val);
- return tmp_ret;
-#endif
-}
-
-int CAudioEffect::SetSrsTruBassSwitch(int switch_val)
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidSetSRSTrubassSwitch(switch_val);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetSRSTrubassSwitch(switch_val);
- tmp_ret |= mAndroidEffect.amAndroidSetSRSTrubassSwitch(switch_val);
- return tmp_ret;
-#endif
-}
-
-int CAudioEffect::SetSrsTruBassGain(int gain_val)
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return amAndroidSetSRSTrubassGain(gain_val);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetSRSTrubassGain(gain_val);
- tmp_ret |= mAndroidEffect.amAndroidSetSRSTrubassGain(gain_val);
- return tmp_ret;
-#endif
-}
-
-int CAudioEffect::SetSrsDialogClaritySwitch(int switch_val)
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidSetSRSDialogClaritySwitch(switch_val);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetSRSDialogClaritySwitch(switch_val);
- tmp_ret |= mAndroidEffect.amAndroidSetSRSDialogClaritySwitch(switch_val);
- return tmp_ret;
-#endif
-}
-
-int CAudioEffect::SetSrsDialogClarityGain(int gain_val)
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidSetSRSDialogClarityGain(gain_val);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetSRSDialogClarityGain(gain_val);
- tmp_ret |= mAndroidEffect.amAndroidSetSRSDialogClarityGain(gain_val);
- return tmp_ret;
-#endif
-}
-
-int CAudioEffect::SetSrsDefinitionGain(int gain_val)
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidSetSRSDefinitionGain(gain_val);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetSRSDefinitionGain(gain_val);
- tmp_ret |= mAndroidEffect.amAndroidSetSRSDefinitionGain(gain_val);
- return tmp_ret;
-#endif
-}
-
-int CAudioEffect::SetSrsTrubassSpeakerSize(int set_val)
-{
- int tmp_ret = 0;
-
-#if CC_TV_AUDIO_TYPE_ANDROID == 1
- return mAndroidEffect.amAndroidSetSRSTrubassSpeakerSize(set_val);
-#endif
-
-#if CC_TV_AUDIO_TYPE_AMAUDIO == 1
- tmp_ret |= amAudioSetSRSTrubassSpeakerSize(set_val);
- tmp_ret |= mAndroidEffect.amAndroidSetSRSTrubassSpeakerSize(set_val);
- return tmp_ret;
-#endif
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/poll.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+
+#include "audio_amaudio.h"
+#include "audio_effect.h"
+
+#include <xxxconfig.h>
+#define LOG_TAG "CAudioEffect"
+#include "CTvLog.h"
+
+CAudioEffect::CAudioEffect()
+{
+}
+CAudioEffect::~CAudioEffect()
+{
+}
+
+int CAudioEffect::GetEQBandCount()
+{
+ return CC_BAND_ITEM_CNT;
+}
+
+
+int CAudioEffect::SetEQSwitch(int switch_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetEQEnable(switch_val);
+ return tmp_ret;
+}
+
+int CAudioEffect::GetEQSwitch()
+{
+ int tmp_ret = 0;
+ return 0;
+}
+
+int CAudioEffect::SetEQValue(int gain_val_buf[])
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetEQGain(gain_val_buf, CC_BAND_ITEM_CNT);
+ return tmp_ret;
+}
+
+int CAudioEffect::GetEQValue(int gain_val_buf[])
+{
+ int tmp_ret = 0;
+ return 0;
+}
+
+int CAudioEffect::SetSrsSurroundSwitch(int switch_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetSRSSurroundSwitch(switch_val);
+ return tmp_ret;
+}
+
+int CAudioEffect::SetSrsSurroundGain(int gain_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetSRSSurroundGain(gain_val);
+ return tmp_ret;
+}
+
+int CAudioEffect::SetSrsInputOutputGain(int input_gain_val, int output_gain_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetSRSGain(input_gain_val, output_gain_val);
+ return tmp_ret;
+}
+int CAudioEffect::SetSrsTruBassSwitch(int switch_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetSRSTrubassSwitch(switch_val);
+ return tmp_ret;
+}
+
+int CAudioEffect::SetSrsTruBassGain(int gain_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetSRSTrubassGain(gain_val);
+ return tmp_ret;
+}
+
+int CAudioEffect::SetSrsDialogClaritySwitch(int switch_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetSRSDialogClaritySwitch(switch_val);
+ return tmp_ret;
+}
+
+int CAudioEffect::SetSrsDialogClarityGain(int gain_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetSRSDialogClarityGain(gain_val);
+ return tmp_ret;
+}
+
+int CAudioEffect::SetSrsDefinitionGain(int gain_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetSRSDefinitionGain(gain_val);
+ return tmp_ret;
+}
+
+int CAudioEffect::SetSrsTrubassSpeakerSize(int set_val)
+{
+ int tmp_ret = 0;
+ tmp_ret |= amAudioSetSRSTrubassSpeakerSize(set_val);
+ return tmp_ret;
+}
+
+int CAudioEffect::DbxTv_SetMode(int mode, int son_value, int vol_value, int sur_value)
+{
+ int ret = 0;
+#ifdef TV_AUDIO_USE_DBX_TV
+ ret |= amAudioSetDBXTVParameter( son_value, vol_value, sur_value);
+#endif
+ return ret;
+}
diff --git a/tvapi/libtv/audio/audio_effect.h b/tvapi/libtv/audio/audio_effect.h
index 6420092..6ff398a 100644
--- a/tvapi/libtv/audio/audio_effect.h
+++ b/tvapi/libtv/audio/audio_effect.h
@@ -1,31 +1,27 @@
-#ifndef __TV_AUDIO_EFFECT_H__
-#define __TV_AUDIO_EFFECT_H__
-#include "audio_android_effect.h"
-
-class CAudioEffect {
-public:
- CAudioEffect();
- virtual ~CAudioEffect();
- int amAndroidNewAudioEffects();
- void amAndroidFreeAudioEffects();
- virtual int GetEQBandCount();
- virtual int GetEQMinGain();
- virtual int GetEQMaxGain();
- virtual int SetEQSwitch(int switch_val);
- virtual int GetEQSwitch();
- virtual int SetEQValue(int gain_val_buf[]);
- virtual int GetEQValue(int gain_val_buf[]);
-
- virtual int SetSrsSurroundSwitch(int switch_val);
- virtual int SetSrsSurroundGain(int gain_val);
- virtual int SetSrsTruBassSwitch(int switch_val);
- virtual int SetSrsTruBassGain(int gain_val);
- virtual int SetSrsDialogClaritySwitch(int switch_val);
- virtual int SetSrsDialogClarityGain(int gain_val);
- virtual int SetSrsDefinitionGain(int gain_val);
- virtual int SetSrsTrubassSpeakerSize(int tmp_val);
-
-private:
- CAndroidEffect mAndroidEffect;
-};
-#endif //__TV_AUDIO_EFFECT_H__
+#ifndef __TV_AUDIO_EFFECT_H__
+#define __TV_AUDIO_EFFECT_H__
+#define CC_BAND_ITEM_CNT ( 6 )
+class CAudioEffect {
+public:
+ CAudioEffect();
+ ~CAudioEffect();
+ int GetEQBandCount();
+ int SetEQSwitch(int switch_val);
+ int GetEQSwitch();
+ int SetEQValue(int gain_val_buf[]);
+ int GetEQValue(int gain_val_buf[]);
+
+ int SetSrsSurroundSwitch(int switch_val);
+ int SetSrsInputOutputGain(int input_gain_val, int output_gain_val);
+ int SetSrsSurroundGain(int gain_val);
+ int SetSrsTruBassSwitch(int switch_val);
+ int SetSrsTruBassGain(int gain_val);
+ int SetSrsDialogClaritySwitch(int switch_val);
+ int SetSrsDialogClarityGain(int gain_val);
+ int SetSrsDefinitionGain(int gain_val);
+ int SetSrsTrubassSpeakerSize(int tmp_val);
+ int DbxTv_SetMode(int mode, int son_value, int vol_value, int sur_value);
+
+private:
+};
+#endif //__TV_AUDIO_EFFECT_H__
diff --git a/tvapi/libtv/include/amstream.h b/tvapi/libtv/include/amstream.h
index c82aae3..14282fd 100644
--- a/tvapi/libtv/include/amstream.h
+++ b/tvapi/libtv/include/amstream.h
@@ -1,263 +1,263 @@
-#ifndef __AMSTREAM_H__
-#define __AMSTREAM_H__
-
-#include "ve.h"
-
-#define AMSTREAM_IOC_MAGIC 'S'
-
-#define AMSTREAM_IOC_VB_START _IOW(AMSTREAM_IOC_MAGIC, 0x00, int)
-#define AMSTREAM_IOC_VB_SIZE _IOW(AMSTREAM_IOC_MAGIC, 0x01, int)
-#define AMSTREAM_IOC_AB_START _IOW(AMSTREAM_IOC_MAGIC, 0x02, int)
-#define AMSTREAM_IOC_AB_SIZE _IOW(AMSTREAM_IOC_MAGIC, 0x03, int)
-#define AMSTREAM_IOC_VFORMAT _IOW(AMSTREAM_IOC_MAGIC, 0x04, int)
-#define AMSTREAM_IOC_AFORMAT _IOW(AMSTREAM_IOC_MAGIC, 0x05, int)
-#define AMSTREAM_IOC_VID _IOW(AMSTREAM_IOC_MAGIC, 0x06, int)
-#define AMSTREAM_IOC_AID _IOW(AMSTREAM_IOC_MAGIC, 0x07, int)
-#define AMSTREAM_IOC_VB_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x08, unsigned long)
-#define AMSTREAM_IOC_AB_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x09, unsigned long)
-#define AMSTREAM_IOC_SYSINFO _IOW(AMSTREAM_IOC_MAGIC, 0x0a, int)
-#define AMSTREAM_IOC_ACHANNEL _IOW(AMSTREAM_IOC_MAGIC, 0x0b, int)
-#define AMSTREAM_IOC_SAMPLERATE _IOW(AMSTREAM_IOC_MAGIC, 0x0c, int)
-#define AMSTREAM_IOC_DATAWIDTH _IOW(AMSTREAM_IOC_MAGIC, 0x0d, int)
-#define AMSTREAM_IOC_TSTAMP _IOW(AMSTREAM_IOC_MAGIC, 0x0e, unsigned long)
-#define AMSTREAM_IOC_VDECSTAT _IOR(AMSTREAM_IOC_MAGIC, 0x0f, unsigned long)
-#define AMSTREAM_IOC_ADECSTAT _IOR(AMSTREAM_IOC_MAGIC, 0x10, unsigned long)
-
-#define AMSTREAM_IOC_PORT_INIT _IO(AMSTREAM_IOC_MAGIC, 0x11)
-#define AMSTREAM_IOC_TRICKMODE _IOW(AMSTREAM_IOC_MAGIC, 0x12, unsigned long)
-
-#define AMSTREAM_IOC_AUDIO_INFO _IOW(AMSTREAM_IOC_MAGIC, 0x13, unsigned long)
-#define AMSTREAM_IOC_TRICK_STAT _IOR(AMSTREAM_IOC_MAGIC, 0x14, unsigned long)
-#define AMSTREAM_IOC_AUDIO_RESET _IO(AMSTREAM_IOC_MAGIC, 0x15)
-#define AMSTREAM_IOC_SID _IOW(AMSTREAM_IOC_MAGIC, 0x16, int)
-#define AMSTREAM_IOC_VPAUSE _IOW(AMSTREAM_IOC_MAGIC, 0x17, int)
-#define AMSTREAM_IOC_AVTHRESH _IOW(AMSTREAM_IOC_MAGIC, 0x18, int)
-#define AMSTREAM_IOC_SYNCTHRESH _IOW(AMSTREAM_IOC_MAGIC, 0x19, int)
-#define AMSTREAM_IOC_SUB_RESET _IOW(AMSTREAM_IOC_MAGIC, 0x1a, int)
-#define AMSTREAM_IOC_SUB_LENGTH _IOR(AMSTREAM_IOC_MAGIC, 0x1b, unsigned long)
-#define AMSTREAM_IOC_SET_DEC_RESET _IOW(AMSTREAM_IOC_MAGIC, 0x1c, int)
-#define AMSTREAM_IOC_TS_SKIPBYTE _IOW(AMSTREAM_IOC_MAGIC, 0x1d, int)
-#define AMSTREAM_IOC_SUB_TYPE _IOW(AMSTREAM_IOC_MAGIC, 0x1e, int)
-#define AMSTREAM_IOC_CLEAR_VIDEO _IOW(AMSTREAM_IOC_MAGIC, 0x1f, int)
-
-#define AMSTREAM_IOC_APTS _IOR(AMSTREAM_IOC_MAGIC, 0x40, unsigned long)
-#define AMSTREAM_IOC_VPTS _IOR(AMSTREAM_IOC_MAGIC, 0x41, unsigned long)
-#define AMSTREAM_IOC_PCRSCR _IOR(AMSTREAM_IOC_MAGIC, 0x42, unsigned long)
-#define AMSTREAM_IOC_SYNCENABLE _IOW(AMSTREAM_IOC_MAGIC, 0x43, unsigned long)
-#define AMSTREAM_IOC_GET_SYNC_ADISCON _IOR(AMSTREAM_IOC_MAGIC, 0x44, unsigned long)
-#define AMSTREAM_IOC_SET_SYNC_ADISCON _IOW(AMSTREAM_IOC_MAGIC, 0x45, unsigned long)
-#define AMSTREAM_IOC_GET_SYNC_VDISCON _IOR(AMSTREAM_IOC_MAGIC, 0x46, unsigned long)
-#define AMSTREAM_IOC_SET_SYNC_VDISCON _IOW(AMSTREAM_IOC_MAGIC, 0x47, unsigned long)
-#define AMSTREAM_IOC_GET_VIDEO_DISABLE _IOR(AMSTREAM_IOC_MAGIC, 0x48, unsigned long)
-#define AMSTREAM_IOC_SET_VIDEO_DISABLE _IOW(AMSTREAM_IOC_MAGIC, 0x49, unsigned long)
-#define AMSTREAM_IOC_SET_PCRSCR _IOW(AMSTREAM_IOC_MAGIC, 0x4a, unsigned long)
-#define AMSTREAM_IOC_GET_VIDEO_AXIS _IOR(AMSTREAM_IOC_MAGIC, 0x4b, unsigned long)
-#define AMSTREAM_IOC_SET_VIDEO_AXIS _IOW(AMSTREAM_IOC_MAGIC, 0x4c, unsigned long)
-#define AMSTREAM_IOC_GET_VIDEO_CROP _IOR(AMSTREAM_IOC_MAGIC, 0x4d, unsigned long)
-#define AMSTREAM_IOC_SET_VIDEO_CROP _IOW(AMSTREAM_IOC_MAGIC, 0x4e, unsigned long)
-
-// VPP.VE IOCTL command list
-#define AMSTREAM_IOC_VE_BEXT _IOW(AMSTREAM_IOC_MAGIC, 0x20, struct ve_bext_s )
-#define AMSTREAM_IOC_VE_DNLP _IOW(AMSTREAM_IOC_MAGIC, 0x21, struct ve_dnlp_s )
-#define AMSTREAM_IOC_VE_HSVS _IOW(AMSTREAM_IOC_MAGIC, 0x22, struct ve_hsvs_s )
-#define AMSTREAM_IOC_VE_CCOR _IOW(AMSTREAM_IOC_MAGIC, 0x23, struct ve_ccor_s )
-#define AMSTREAM_IOC_VE_BENH _IOW(AMSTREAM_IOC_MAGIC, 0x24, struct ve_benh_s )
-#define AMSTREAM_IOC_VE_DEMO _IOW(AMSTREAM_IOC_MAGIC, 0x25, struct ve_demo_s )
-#define AMSTREAM_IOC_VE_VDO_MEAS _IOW(AMSTREAM_IOC_MAGIC, 0x27, struct vdo_meas_s )
-#define AMSTREAM_IOC_VE_DEBUG _IOWR(AMSTREAM_IOC_MAGIC, 0x28, unsigned long long)
-#define AMSTREAM_IOC_VE_REGMAP _IOW(AMSTREAM_IOC_MAGIC, 0x29, struct ve_regmap_s)
-
-// VPP.CM IOCTL command list
-#define AMSTREAM_IOC_CM_REGION _IOW(AMSTREAM_IOC_MAGIC, 0x30, struct cm_region_s)
-#define AMSTREAM_IOC_CM_TOP _IOW(AMSTREAM_IOC_MAGIC, 0x31, struct cm_top_s )
-#define AMSTREAM_IOC_CM_DEMO _IOW(AMSTREAM_IOC_MAGIC, 0x32, struct cm_demo_s )
-#define AMSTREAM_IOC_CM_DEBUG _IOWR(AMSTREAM_IOC_MAGIC, 0x33, unsigned long long)
-#define AMSTREAM_IOC_CM_REGMAP _IOW(AMSTREAM_IOC_MAGIC, 0x34, struct cm_regmap_s)
-
-//VPP.3D IOCTL command list
-#define AMSTREAM_IOC_SET_3D_TYPE _IOW(AMSTREAM_IOC_MAGIC, 0x3c, unsigned int)
-#define AMSTREAM_IOC_GET_3D_TYPE _IOW(AMSTREAM_IOC_MAGIC, 0x3d, unsigned int)
-
-#define AMSTREAM_IOC_SUB_NUM _IOR(AMSTREAM_IOC_MAGIC, 0x50, unsigned long)
-#define AMSTREAM_IOC_SUB_INFO _IOR(AMSTREAM_IOC_MAGIC, 0x51, unsigned long)
-#define AMSTREAM_IOC_GET_BLACKOUT_POLICY _IOR(AMSTREAM_IOC_MAGIC, 0x52, unsigned long)
-#define AMSTREAM_IOC_SET_BLACKOUT_POLICY _IOW(AMSTREAM_IOC_MAGIC, 0x53, unsigned long)
-#define AMSTREAM_IOC_GET_SCREEN_MODE _IOR(AMSTREAM_IOC_MAGIC, 0x58, int)
-#define AMSTREAM_IOC_SET_SCREEN_MODE _IOW(AMSTREAM_IOC_MAGIC, 0x59, int)
-#define AMSTREAM_IOC_GET_VIDEO_DISCONTINUE_REPORT _IOR(AMSTREAM_IOC_MAGIC, 0x5a, int)
-#define AMSTREAM_IOC_SET_VIDEO_DISCONTINUE_REPORT _IOW(AMSTREAM_IOC_MAGIC, 0x5b, int)
-#define AMSTREAM_IOC_VF_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x60, unsigned long)
-#define AMSTREAM_IOC_CLEAR_VBUF _IO(AMSTREAM_IOC_MAGIC, 0x80)
-
-#define AMSTREAM_IOC_APTS_LOOKUP _IOR(AMSTREAM_IOC_MAGIC, 0x81, unsigned long)
-#define GET_FIRST_APTS_FLAG _IOR(AMSTREAM_IOC_MAGIC, 0x82, long)
-
-#define AMSTREAM_IOC_GET_SYNC_ADISCON_DIFF _IOR(AMSTREAM_IOC_MAGIC, 0x83, unsigned long)
-#define AMSTREAM_IOC_GET_SYNC_VDISCON_DIFF _IOR(AMSTREAM_IOC_MAGIC, 0x84, unsigned long)
-#define AMSTREAM_IOC_SET_SYNC_ADISCON_DIFF _IOW(AMSTREAM_IOC_MAGIC, 0x85, unsigned long)
-#define AMSTREAM_IOC_SET_SYNC_VDISCON_DIFF _IOW(AMSTREAM_IOC_MAGIC, 0x86, unsigned long)
-#define AMSTREAM_IOC_GET_FREERUN_MODE _IOR(AMSTREAM_IOC_MAGIC, 0x87, unsigned long)
-#define AMSTREAM_IOC_SET_FREERUN_MODE _IOW(AMSTREAM_IOC_MAGIC, 0x88, unsigned long)
-#define AMSTREAM_IOC_SET_DEMUX _IOW(AMSTREAM_IOC_MAGIC, 0x90, unsigned long)
-
-#define AMSTREAM_IOC_SET_VIDEO_DELAY_LIMIT_MS _IOW(AMSTREAM_IOC_MAGIC, 0xa0, unsigned long)
-#define AMSTREAM_IOC_GET_VIDEO_DELAY_LIMIT_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa1, unsigned long)
-#define AMSTREAM_IOC_SET_AUDIO_DELAY_LIMIT_MS _IOW(AMSTREAM_IOC_MAGIC, 0xa2, unsigned long)
-#define AMSTREAM_IOC_GET_AUDIO_DELAY_LIMIT_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa3, unsigned long)
-#define AMSTREAM_IOC_GET_AUDIO_CUR_DELAY_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa4, unsigned long)
-#define AMSTREAM_IOC_GET_VIDEO_CUR_DELAY_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa5, unsigned long)
-#define AMSTREAM_IOC_GET_AUDIO_AVG_BITRATE_BPS _IOR(AMSTREAM_IOC_MAGIC, 0xa6, unsigned long)
-#define AMSTREAM_IOC_GET_VIDEO_AVG_BITRATE_BPS _IOR(AMSTREAM_IOC_MAGIC, 0xa7, unsigned long)
-
-#define TRICKMODE_NONE 0x00
-#define TRICKMODE_I 0x01
-#define TRICKMODE_FFFB 0x02
-
-#define TRICK_STAT_DONE 0x01
-#define TRICK_STAT_WAIT 0x00
-
-#define AUDIO_EXTRA_DATA_SIZE (4096)
-#define MAX_SUB_NUM 32
-/*
-enum VIDEO_DEC_TYPE
-{
- VIDEO_DEC_FORMAT_UNKNOW,
- VIDEO_DEC_FORMAT_MPEG4_3,
- VIDEO_DEC_FORMAT_MPEG4_4,
- VIDEO_DEC_FORMAT_MPEG4_5,
- VIDEO_DEC_FORMAT_H264,
- VIDEO_DEC_FORMAT_MJPEG,
- VIDEO_DEC_FORMAT_MP4,
- VIDEO_DEC_FORMAT_H263,
- VIDEO_DEC_FORMAT_REAL_8,
- VIDEO_DEC_FORMAT_REAL_9,
- VIDEO_DEC_FORMAT_WMV3,
- VIDEO_DEC_FORMAT_WVC1,
- VIDEO_DEC_FORMAT_SW,
- VIDEO_DEC_FORMAT_MAX
-};
-*/
-struct buf_status {
- int size;
- int data_len;
- int free_len;
- unsigned int read_pointer;
- unsigned int write_pointer;
-};
-
-
-struct vdec_status {
- unsigned int width;
- unsigned int height;
- unsigned int fps;
- unsigned int error_count;
- unsigned int status;
-};
-
-struct adec_status {
- unsigned int channels;
- unsigned int sample_rate;
- unsigned int resolution;
- unsigned int error_count;
- unsigned int status;
-};
-
-struct am_io_param {
- union {
- int data;
- int id;//get bufstatus? //or others
- };
-
- int len; //buffer size;
-
- union {
- char buf[1];
- struct buf_status status;
- struct vdec_status vstatus;
- struct adec_status astatus;
- };
-};
-struct audio_info {
- int valid;
- int sample_rate;
- int channels;
- int bitrate;
- int codec_id;
- int block_align;
- int extradata_size;
- char extradata[AUDIO_EXTRA_DATA_SIZE];
-};
-
-struct dec_sysinfo {
- unsigned int format;
- unsigned int width;
- unsigned int height;
- unsigned int rate;
- unsigned int extra;
- unsigned int status;
- unsigned int ratio;
- void *param;
- unsigned long long ratio64;
-};
-
-struct subtitle_info {
- unsigned char id;
- unsigned char width;
- unsigned char height;
- unsigned char type;
-};
-
-struct codec_profile_t {
- char *name; // video codec short name
- char *profile; // Attributes,seperated by commas
-};
-#define SUPPORT_VDEC_NUM (8)
-
-int vcodec_profile_register(const struct codec_profile_t *vdec_profile);
-int vcodec_profile_read(char *buf);
-
-#ifdef __KERNEL__
-#ifdef ENABLE_DEMUX_DRIVER
-/*TS demux operation interface*/
-struct tsdemux_ops {
- int (*reset)(void);
- int (*set_reset_flag)(void);
- int (*request_irq)(irq_handler_t handler, void *data);
- int (*free_irq)(void);
- int (*set_vid)(int vpid);
- int (*set_aid)(int apid);
- int (*set_sid)(int spid);
- int (*set_skipbyte)(int skipbyte);
- int (*set_demux)(int dev);
-};
-
-void tsdemux_set_ops(struct tsdemux_ops *ops);
-int tsdemux_set_reset_flag(void);
-
-#endif /*ENABLE_DEMUX_DRIVER*/
-void set_vdec_func(int (*vdec_func)(struct vdec_status *));
-void set_adec_func(int (*adec_func)(struct adec_status *));
-void set_trickmode_func(int (*trickmode_func)(unsigned long trickmode));
-void wakeup_sub_poll(void);
-int wakeup_userdata_poll(int wp, int start_phyaddr, int buf_size);
-int get_sub_type(void);
-#endif
-
-typedef struct tcon_gamma_table_s {
- unsigned short data[256];
-} tcon_gamma_table_t;
-
-typedef struct tcon_rgb_ogo_s {
- unsigned int en;
- int r_pre_offset; // s11.0, range -1024~+1023, default is 0
- int g_pre_offset; // s11.0, range -1024~+1023, default is 0
- int b_pre_offset; // s11.0, range -1024~+1023, default is 0
- unsigned int r_gain; // u1.10, range 0~2047, default is 1024 (1.0x)
- unsigned int g_gain; // u1.10, range 0~2047, default is 1024 (1.0x)
- unsigned int b_gain; // u1.10, range 0~2047, default is 1024 (1.0x)
- int r_post_offset; // s11.0, range -1024~+1023, default is 0
- int g_post_offset; // s11.0, range -1024~+1023, default is 0
- int b_post_offset; // s11.0, range -1024~+1023, default is 0
-} tcon_rgb_ogo_t;
-
-#endif //__AMSTREAM_H__
+#ifndef __AMSTREAM_H__
+#define __AMSTREAM_H__
+
+#include "ve.h"
+
+#define AMSTREAM_IOC_MAGIC 'S'
+
+#define AMSTREAM_IOC_VB_START _IOW(AMSTREAM_IOC_MAGIC, 0x00, int)
+#define AMSTREAM_IOC_VB_SIZE _IOW(AMSTREAM_IOC_MAGIC, 0x01, int)
+#define AMSTREAM_IOC_AB_START _IOW(AMSTREAM_IOC_MAGIC, 0x02, int)
+#define AMSTREAM_IOC_AB_SIZE _IOW(AMSTREAM_IOC_MAGIC, 0x03, int)
+#define AMSTREAM_IOC_VFORMAT _IOW(AMSTREAM_IOC_MAGIC, 0x04, int)
+#define AMSTREAM_IOC_AFORMAT _IOW(AMSTREAM_IOC_MAGIC, 0x05, int)
+#define AMSTREAM_IOC_VID _IOW(AMSTREAM_IOC_MAGIC, 0x06, int)
+#define AMSTREAM_IOC_AID _IOW(AMSTREAM_IOC_MAGIC, 0x07, int)
+#define AMSTREAM_IOC_VB_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x08, unsigned long)
+#define AMSTREAM_IOC_AB_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x09, unsigned long)
+#define AMSTREAM_IOC_SYSINFO _IOW(AMSTREAM_IOC_MAGIC, 0x0a, int)
+#define AMSTREAM_IOC_ACHANNEL _IOW(AMSTREAM_IOC_MAGIC, 0x0b, int)
+#define AMSTREAM_IOC_SAMPLERATE _IOW(AMSTREAM_IOC_MAGIC, 0x0c, int)
+#define AMSTREAM_IOC_DATAWIDTH _IOW(AMSTREAM_IOC_MAGIC, 0x0d, int)
+#define AMSTREAM_IOC_TSTAMP _IOW(AMSTREAM_IOC_MAGIC, 0x0e, unsigned long)
+#define AMSTREAM_IOC_VDECSTAT _IOR(AMSTREAM_IOC_MAGIC, 0x0f, unsigned long)
+#define AMSTREAM_IOC_ADECSTAT _IOR(AMSTREAM_IOC_MAGIC, 0x10, unsigned long)
+
+#define AMSTREAM_IOC_PORT_INIT _IO(AMSTREAM_IOC_MAGIC, 0x11)
+#define AMSTREAM_IOC_TRICKMODE _IOW(AMSTREAM_IOC_MAGIC, 0x12, unsigned long)
+
+#define AMSTREAM_IOC_AUDIO_INFO _IOW(AMSTREAM_IOC_MAGIC, 0x13, unsigned long)
+#define AMSTREAM_IOC_TRICK_STAT _IOR(AMSTREAM_IOC_MAGIC, 0x14, unsigned long)
+#define AMSTREAM_IOC_AUDIO_RESET _IO(AMSTREAM_IOC_MAGIC, 0x15)
+#define AMSTREAM_IOC_SID _IOW(AMSTREAM_IOC_MAGIC, 0x16, int)
+#define AMSTREAM_IOC_VPAUSE _IOW(AMSTREAM_IOC_MAGIC, 0x17, int)
+#define AMSTREAM_IOC_AVTHRESH _IOW(AMSTREAM_IOC_MAGIC, 0x18, int)
+#define AMSTREAM_IOC_SYNCTHRESH _IOW(AMSTREAM_IOC_MAGIC, 0x19, int)
+#define AMSTREAM_IOC_SUB_RESET _IOW(AMSTREAM_IOC_MAGIC, 0x1a, int)
+#define AMSTREAM_IOC_SUB_LENGTH _IOR(AMSTREAM_IOC_MAGIC, 0x1b, unsigned long)
+#define AMSTREAM_IOC_SET_DEC_RESET _IOW(AMSTREAM_IOC_MAGIC, 0x1c, int)
+#define AMSTREAM_IOC_TS_SKIPBYTE _IOW(AMSTREAM_IOC_MAGIC, 0x1d, int)
+#define AMSTREAM_IOC_SUB_TYPE _IOW(AMSTREAM_IOC_MAGIC, 0x1e, int)
+#define AMSTREAM_IOC_CLEAR_VIDEO _IOW(AMSTREAM_IOC_MAGIC, 0x1f, int)
+
+#define AMSTREAM_IOC_APTS _IOR(AMSTREAM_IOC_MAGIC, 0x40, unsigned long)
+#define AMSTREAM_IOC_VPTS _IOR(AMSTREAM_IOC_MAGIC, 0x41, unsigned long)
+#define AMSTREAM_IOC_PCRSCR _IOR(AMSTREAM_IOC_MAGIC, 0x42, unsigned long)
+#define AMSTREAM_IOC_SYNCENABLE _IOW(AMSTREAM_IOC_MAGIC, 0x43, unsigned long)
+#define AMSTREAM_IOC_GET_SYNC_ADISCON _IOR(AMSTREAM_IOC_MAGIC, 0x44, unsigned long)
+#define AMSTREAM_IOC_SET_SYNC_ADISCON _IOW(AMSTREAM_IOC_MAGIC, 0x45, unsigned long)
+#define AMSTREAM_IOC_GET_SYNC_VDISCON _IOR(AMSTREAM_IOC_MAGIC, 0x46, unsigned long)
+#define AMSTREAM_IOC_SET_SYNC_VDISCON _IOW(AMSTREAM_IOC_MAGIC, 0x47, unsigned long)
+#define AMSTREAM_IOC_GET_VIDEO_DISABLE _IOR(AMSTREAM_IOC_MAGIC, 0x48, unsigned long)
+#define AMSTREAM_IOC_SET_VIDEO_DISABLE _IOW(AMSTREAM_IOC_MAGIC, 0x49, unsigned long)
+#define AMSTREAM_IOC_SET_PCRSCR _IOW(AMSTREAM_IOC_MAGIC, 0x4a, unsigned long)
+#define AMSTREAM_IOC_GET_VIDEO_AXIS _IOR(AMSTREAM_IOC_MAGIC, 0x4b, unsigned long)
+#define AMSTREAM_IOC_SET_VIDEO_AXIS _IOW(AMSTREAM_IOC_MAGIC, 0x4c, unsigned long)
+#define AMSTREAM_IOC_GET_VIDEO_CROP _IOR(AMSTREAM_IOC_MAGIC, 0x4d, unsigned long)
+#define AMSTREAM_IOC_SET_VIDEO_CROP _IOW(AMSTREAM_IOC_MAGIC, 0x4e, unsigned long)
+
+// VPP.VE IOCTL command list
+#define AMSTREAM_IOC_VE_BEXT _IOW(AMSTREAM_IOC_MAGIC, 0x20, struct ve_bext_s )
+#define AMSTREAM_IOC_VE_DNLP _IOW(AMSTREAM_IOC_MAGIC, 0x21, struct ve_dnlp_s )
+#define AMSTREAM_IOC_VE_HSVS _IOW(AMSTREAM_IOC_MAGIC, 0x22, struct ve_hsvs_s )
+#define AMSTREAM_IOC_VE_CCOR _IOW(AMSTREAM_IOC_MAGIC, 0x23, struct ve_ccor_s )
+#define AMSTREAM_IOC_VE_BENH _IOW(AMSTREAM_IOC_MAGIC, 0x24, struct ve_benh_s )
+#define AMSTREAM_IOC_VE_DEMO _IOW(AMSTREAM_IOC_MAGIC, 0x25, struct ve_demo_s )
+#define AMSTREAM_IOC_VE_VDO_MEAS _IOW(AMSTREAM_IOC_MAGIC, 0x27, struct vdo_meas_s )
+#define AMSTREAM_IOC_VE_DEBUG _IOWR(AMSTREAM_IOC_MAGIC, 0x28, unsigned long long)
+#define AMSTREAM_IOC_VE_REGMAP _IOW(AMSTREAM_IOC_MAGIC, 0x29, struct ve_regmap_s)
+
+// VPP.CM IOCTL command list
+#define AMSTREAM_IOC_CM_REGION _IOW(AMSTREAM_IOC_MAGIC, 0x30, struct cm_region_s)
+#define AMSTREAM_IOC_CM_TOP _IOW(AMSTREAM_IOC_MAGIC, 0x31, struct cm_top_s )
+#define AMSTREAM_IOC_CM_DEMO _IOW(AMSTREAM_IOC_MAGIC, 0x32, struct cm_demo_s )
+#define AMSTREAM_IOC_CM_DEBUG _IOWR(AMSTREAM_IOC_MAGIC, 0x33, unsigned long long)
+#define AMSTREAM_IOC_CM_REGMAP _IOW(AMSTREAM_IOC_MAGIC, 0x34, struct cm_regmap_s)
+
+//VPP.3D IOCTL command list
+#define AMSTREAM_IOC_SET_3D_TYPE _IOW(AMSTREAM_IOC_MAGIC, 0x3c, unsigned int)
+#define AMSTREAM_IOC_GET_3D_TYPE _IOW(AMSTREAM_IOC_MAGIC, 0x3d, unsigned int)
+
+#define AMSTREAM_IOC_SUB_NUM _IOR(AMSTREAM_IOC_MAGIC, 0x50, unsigned long)
+#define AMSTREAM_IOC_SUB_INFO _IOR(AMSTREAM_IOC_MAGIC, 0x51, unsigned long)
+#define AMSTREAM_IOC_GET_BLACKOUT_POLICY _IOR(AMSTREAM_IOC_MAGIC, 0x52, unsigned long)
+#define AMSTREAM_IOC_SET_BLACKOUT_POLICY _IOW(AMSTREAM_IOC_MAGIC, 0x53, unsigned long)
+#define AMSTREAM_IOC_GET_SCREEN_MODE _IOR(AMSTREAM_IOC_MAGIC, 0x58, int)
+#define AMSTREAM_IOC_SET_SCREEN_MODE _IOW(AMSTREAM_IOC_MAGIC, 0x59, int)
+#define AMSTREAM_IOC_GET_VIDEO_DISCONTINUE_REPORT _IOR(AMSTREAM_IOC_MAGIC, 0x5a, int)
+#define AMSTREAM_IOC_SET_VIDEO_DISCONTINUE_REPORT _IOW(AMSTREAM_IOC_MAGIC, 0x5b, int)
+#define AMSTREAM_IOC_VF_STATUS _IOR(AMSTREAM_IOC_MAGIC, 0x60, unsigned long)
+#define AMSTREAM_IOC_CLEAR_VBUF _IO(AMSTREAM_IOC_MAGIC, 0x80)
+
+#define AMSTREAM_IOC_APTS_LOOKUP _IOR(AMSTREAM_IOC_MAGIC, 0x81, unsigned long)
+#define GET_FIRST_APTS_FLAG _IOR(AMSTREAM_IOC_MAGIC, 0x82, long)
+
+#define AMSTREAM_IOC_GET_SYNC_ADISCON_DIFF _IOR(AMSTREAM_IOC_MAGIC, 0x83, unsigned long)
+#define AMSTREAM_IOC_GET_SYNC_VDISCON_DIFF _IOR(AMSTREAM_IOC_MAGIC, 0x84, unsigned long)
+#define AMSTREAM_IOC_SET_SYNC_ADISCON_DIFF _IOW(AMSTREAM_IOC_MAGIC, 0x85, unsigned long)
+#define AMSTREAM_IOC_SET_SYNC_VDISCON_DIFF _IOW(AMSTREAM_IOC_MAGIC, 0x86, unsigned long)
+#define AMSTREAM_IOC_GET_FREERUN_MODE _IOR(AMSTREAM_IOC_MAGIC, 0x87, unsigned long)
+#define AMSTREAM_IOC_SET_FREERUN_MODE _IOW(AMSTREAM_IOC_MAGIC, 0x88, unsigned long)
+#define AMSTREAM_IOC_SET_DEMUX _IOW(AMSTREAM_IOC_MAGIC, 0x90, unsigned long)
+
+#define AMSTREAM_IOC_SET_VIDEO_DELAY_LIMIT_MS _IOW(AMSTREAM_IOC_MAGIC, 0xa0, unsigned long)
+#define AMSTREAM_IOC_GET_VIDEO_DELAY_LIMIT_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa1, unsigned long)
+#define AMSTREAM_IOC_SET_AUDIO_DELAY_LIMIT_MS _IOW(AMSTREAM_IOC_MAGIC, 0xa2, unsigned long)
+#define AMSTREAM_IOC_GET_AUDIO_DELAY_LIMIT_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa3, unsigned long)
+#define AMSTREAM_IOC_GET_AUDIO_CUR_DELAY_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa4, unsigned long)
+#define AMSTREAM_IOC_GET_VIDEO_CUR_DELAY_MS _IOR(AMSTREAM_IOC_MAGIC, 0xa5, unsigned long)
+#define AMSTREAM_IOC_GET_AUDIO_AVG_BITRATE_BPS _IOR(AMSTREAM_IOC_MAGIC, 0xa6, unsigned long)
+#define AMSTREAM_IOC_GET_VIDEO_AVG_BITRATE_BPS _IOR(AMSTREAM_IOC_MAGIC, 0xa7, unsigned long)
+
+#define TRICKMODE_NONE 0x00
+#define TRICKMODE_I 0x01
+#define TRICKMODE_FFFB 0x02
+
+#define TRICK_STAT_DONE 0x01
+#define TRICK_STAT_WAIT 0x00
+
+#define AUDIO_EXTRA_DATA_SIZE (4096)
+#define MAX_SUB_NUM 32
+/*
+enum VIDEO_DEC_TYPE
+{
+ VIDEO_DEC_FORMAT_UNKNOW,
+ VIDEO_DEC_FORMAT_MPEG4_3,
+ VIDEO_DEC_FORMAT_MPEG4_4,
+ VIDEO_DEC_FORMAT_MPEG4_5,
+ VIDEO_DEC_FORMAT_H264,
+ VIDEO_DEC_FORMAT_MJPEG,
+ VIDEO_DEC_FORMAT_MP4,
+ VIDEO_DEC_FORMAT_H263,
+ VIDEO_DEC_FORMAT_REAL_8,
+ VIDEO_DEC_FORMAT_REAL_9,
+ VIDEO_DEC_FORMAT_WMV3,
+ VIDEO_DEC_FORMAT_WVC1,
+ VIDEO_DEC_FORMAT_SW,
+ VIDEO_DEC_FORMAT_MAX
+};
+*/
+struct buf_status {
+ int size;
+ int data_len;
+ int free_len;
+ unsigned int read_pointer;
+ unsigned int write_pointer;
+};
+
+
+struct vdec_status {
+ unsigned int width;
+ unsigned int height;
+ unsigned int fps;
+ unsigned int error_count;
+ unsigned int status;
+};
+
+struct adec_status {
+ unsigned int channels;
+ unsigned int sample_rate;
+ unsigned int resolution;
+ unsigned int error_count;
+ unsigned int status;
+};
+
+struct am_io_param {
+ union {
+ int data;
+ int id;//get bufstatus? //or others
+ };
+
+ int len; //buffer size;
+
+ union {
+ char buf[1];
+ struct buf_status status;
+ struct vdec_status vstatus;
+ struct adec_status astatus;
+ };
+};
+struct audio_info {
+ int valid;
+ int sample_rate;
+ int channels;
+ int bitrate;
+ int codec_id;
+ int block_align;
+ int extradata_size;
+ char extradata[AUDIO_EXTRA_DATA_SIZE];
+};
+
+struct dec_sysinfo {
+ unsigned int format;
+ unsigned int width;
+ unsigned int height;
+ unsigned int rate;
+ unsigned int extra;
+ unsigned int status;
+ unsigned int ratio;
+ void *param;
+ unsigned long long ratio64;
+};
+
+struct subtitle_info {
+ unsigned char id;
+ unsigned char width;
+ unsigned char height;
+ unsigned char type;
+};
+
+struct codec_profile_t {
+ char *name; // video codec short name
+ char *profile; // Attributes,seperated by commas
+};
+#define SUPPORT_VDEC_NUM (8)
+
+int vcodec_profile_register(const struct codec_profile_t *vdec_profile);
+int vcodec_profile_read(char *buf);
+
+#ifdef __KERNEL__
+#ifdef ENABLE_DEMUX_DRIVER
+/*TS demux operation interface*/
+struct tsdemux_ops {
+ int (*reset)(void);
+ int (*set_reset_flag)(void);
+ int (*request_irq)(irq_handler_t handler, void *data);
+ int (*free_irq)(void);
+ int (*set_vid)(int vpid);
+ int (*set_aid)(int apid);
+ int (*set_sid)(int spid);
+ int (*set_skipbyte)(int skipbyte);
+ int (*set_demux)(int dev);
+};
+
+void tsdemux_set_ops(struct tsdemux_ops *ops);
+int tsdemux_set_reset_flag(void);
+
+#endif /*ENABLE_DEMUX_DRIVER*/
+void set_vdec_func(int (*vdec_func)(struct vdec_status *));
+void set_adec_func(int (*adec_func)(struct adec_status *));
+void set_trickmode_func(int (*trickmode_func)(unsigned long trickmode));
+void wakeup_sub_poll(void);
+int wakeup_userdata_poll(int wp, int start_phyaddr, int buf_size);
+int get_sub_type(void);
+#endif
+
+typedef struct tcon_gamma_table_s {
+ unsigned short data[256];
+} tcon_gamma_table_t;
+
+typedef struct tcon_rgb_ogo_s {
+ unsigned int en;
+ int r_pre_offset; // s11.0, range -1024~+1023, default is 0
+ int g_pre_offset; // s11.0, range -1024~+1023, default is 0
+ int b_pre_offset; // s11.0, range -1024~+1023, default is 0
+ unsigned int r_gain; // u1.10, range 0~2047, default is 1024 (1.0x)
+ unsigned int g_gain; // u1.10, range 0~2047, default is 1024 (1.0x)
+ unsigned int b_gain; // u1.10, range 0~2047, default is 1024 (1.0x)
+ int r_post_offset; // s11.0, range -1024~+1023, default is 0
+ int g_post_offset; // s11.0, range -1024~+1023, default is 0
+ int b_post_offset; // s11.0, range -1024~+1023, default is 0
+} tcon_rgb_ogo_t;
+
+#endif //__AMSTREAM_H__
diff --git a/tvapi/libtv/include/amvecm.h b/tvapi/libtv/include/amvecm.h
index 1797607..1b488f6 100644
--- a/tvapi/libtv/include/amvecm.h
+++ b/tvapi/libtv/include/amvecm.h
@@ -1,68 +1,68 @@
-#ifndef __AMVECM_H
-#define __AMVECM_H
-
-#include "ve.h"
-#include "cm.h"
-#include "amstream.h"
-
-
-//struct ve_dnlp_s video_ve_dnlp;
-
-#define FLAG_RSV31 (1 << 31)
-#define FLAG_RSV30 (1 << 30)
-#define FLAG_VE_DNLP (1 << 29)
-#define FLAG_VE_NEW_DNLP (1 << 28)
-#define FLAG_RSV27 (1 << 27)
-#define FLAG_RSV26 (1 << 26)
-#define FLAG_RSV25 (1 << 25)
-#define FLAG_RSV24 (1 << 24)
-#define FLAG_3D_SYNC_DIS (1 << 23)
-#define FLAG_3D_SYNC_EN (1 << 22)
-#define FLAG_VLOCK_PLL (1 << 21)
-#define FLAG_VLOCK_ENC (1 << 20)
-#define FLAG_VE_DNLP_EN (1 << 19)
-#define FLAG_VE_DNLP_DIS (1 << 18)
-#define FLAG_RSV17 (1 << 17)
-#define FLAG_RSV16 (1 << 16)
-#define FLAG_GAMMA_TABLE_EN (1 << 15)
-#define FLAG_GAMMA_TABLE_DIS (1 << 14)
-#define FLAG_GAMMA_TABLE_R (1 << 13)
-#define FLAG_GAMMA_TABLE_G (1 << 12)
-#define FLAG_GAMMA_TABLE_B (1 << 11)
-#define FLAG_RGB_OGO (1 << 10)
-#define FLAG_RSV9 (1 << 9)
-#define FLAG_RSV8 (1 << 8)
-#define FLAG_BRI_CON (1 << 7)
-#define FLAG_LVDS_FREQ_SW (1 << 6)
-#define FLAG_REG_MAP5 (1 << 5)
-#define FLAG_REG_MAP4 (1 << 4)
-#define FLAG_REG_MAP3 (1 << 3)
-#define FLAG_REG_MAP2 (1 << 2)
-#define FLAG_REG_MAP1 (1 << 1)
-#define FLAG_REG_MAP0 (1 << 0)
-
-
-#define AMVECM_IOC_MAGIC 'C'
-
-#define AMVECM_IOC_VE_DNLP _IOW(AMVECM_IOC_MAGIC, 0x21, struct ve_dnlp_s )
-#define AMVECM_IOC_G_HIST_AVG _IOW(AMVECM_IOC_MAGIC, 0x22, struct ve_hist_s )
-#define AMVECM_IOC_VE_DNLP_EN _IO(AMVECM_IOC_MAGIC, 0x23)
-#define AMVECM_IOC_VE_DNLP_DIS _IO(AMVECM_IOC_MAGIC, 0x24)
-#define AMVECM_IOC_VE_NEW_DNLP _IOW(AMVECM_IOC_MAGIC, 0x25, struct ve_dnlp_table_s )
-
-
-// VPP.CM IOCTL command list
-#define AMVECM_IOC_LOAD_REG _IOW(AMVECM_IOC_MAGIC, 0x30, struct am_regs_s)
-
-
-// VPP.GAMMA IOCTL command list
-#define AMVECM_IOC_GAMMA_TABLE_EN _IO(AMVECM_IOC_MAGIC, 0x40)
-#define AMVECM_IOC_GAMMA_TABLE_DIS _IO(AMVECM_IOC_MAGIC, 0x41)
-#define AMVECM_IOC_GAMMA_TABLE_R _IOW(AMVECM_IOC_MAGIC, 0x42, struct tcon_gamma_table_s)
-#define AMVECM_IOC_GAMMA_TABLE_G _IOW(AMVECM_IOC_MAGIC, 0x43, struct tcon_gamma_table_s)
-#define AMVECM_IOC_GAMMA_TABLE_B _IOW(AMVECM_IOC_MAGIC, 0x44, struct tcon_gamma_table_s)
-#define AMVECM_IOC_S_RGB_OGO _IOW(AMVECM_IOC_MAGIC, 0x45, struct tcon_rgb_ogo_s)
-#define AMVECM_IOC_G_RGB_OGO _IOR(AMVECM_IOC_MAGIC, 0x46, struct tcon_rgb_ogo_s)
-
-#endif /* __AMVECM_H */
-
+#ifndef __AMVECM_H
+#define __AMVECM_H
+
+#include "ve.h"
+#include "cm.h"
+#include "amstream.h"
+
+
+//struct ve_dnlp_s video_ve_dnlp;
+
+#define FLAG_RSV31 (1 << 31)
+#define FLAG_RSV30 (1 << 30)
+#define FLAG_VE_DNLP (1 << 29)
+#define FLAG_VE_NEW_DNLP (1 << 28)
+#define FLAG_RSV27 (1 << 27)
+#define FLAG_RSV26 (1 << 26)
+#define FLAG_RSV25 (1 << 25)
+#define FLAG_RSV24 (1 << 24)
+#define FLAG_3D_SYNC_DIS (1 << 23)
+#define FLAG_3D_SYNC_EN (1 << 22)
+#define FLAG_VLOCK_PLL (1 << 21)
+#define FLAG_VLOCK_ENC (1 << 20)
+#define FLAG_VE_DNLP_EN (1 << 19)
+#define FLAG_VE_DNLP_DIS (1 << 18)
+#define FLAG_RSV17 (1 << 17)
+#define FLAG_RSV16 (1 << 16)
+#define FLAG_GAMMA_TABLE_EN (1 << 15)
+#define FLAG_GAMMA_TABLE_DIS (1 << 14)
+#define FLAG_GAMMA_TABLE_R (1 << 13)
+#define FLAG_GAMMA_TABLE_G (1 << 12)
+#define FLAG_GAMMA_TABLE_B (1 << 11)
+#define FLAG_RGB_OGO (1 << 10)
+#define FLAG_RSV9 (1 << 9)
+#define FLAG_RSV8 (1 << 8)
+#define FLAG_BRI_CON (1 << 7)
+#define FLAG_LVDS_FREQ_SW (1 << 6)
+#define FLAG_REG_MAP5 (1 << 5)
+#define FLAG_REG_MAP4 (1 << 4)
+#define FLAG_REG_MAP3 (1 << 3)
+#define FLAG_REG_MAP2 (1 << 2)
+#define FLAG_REG_MAP1 (1 << 1)
+#define FLAG_REG_MAP0 (1 << 0)
+
+
+#define AMVECM_IOC_MAGIC 'C'
+
+#define AMVECM_IOC_VE_DNLP _IOW(AMVECM_IOC_MAGIC, 0x21, struct ve_dnlp_s )
+#define AMVECM_IOC_G_HIST_AVG _IOW(AMVECM_IOC_MAGIC, 0x22, struct ve_hist_s )
+#define AMVECM_IOC_VE_DNLP_EN _IO(AMVECM_IOC_MAGIC, 0x23)
+#define AMVECM_IOC_VE_DNLP_DIS _IO(AMVECM_IOC_MAGIC, 0x24)
+#define AMVECM_IOC_VE_NEW_DNLP _IOW(AMVECM_IOC_MAGIC, 0x25, struct ve_dnlp_table_s )
+
+
+// VPP.CM IOCTL command list
+#define AMVECM_IOC_LOAD_REG _IOW(AMVECM_IOC_MAGIC, 0x30, struct am_regs_s)
+
+
+// VPP.GAMMA IOCTL command list
+#define AMVECM_IOC_GAMMA_TABLE_EN _IO(AMVECM_IOC_MAGIC, 0x40)
+#define AMVECM_IOC_GAMMA_TABLE_DIS _IO(AMVECM_IOC_MAGIC, 0x41)
+#define AMVECM_IOC_GAMMA_TABLE_R _IOW(AMVECM_IOC_MAGIC, 0x42, struct tcon_gamma_table_s)
+#define AMVECM_IOC_GAMMA_TABLE_G _IOW(AMVECM_IOC_MAGIC, 0x43, struct tcon_gamma_table_s)
+#define AMVECM_IOC_GAMMA_TABLE_B _IOW(AMVECM_IOC_MAGIC, 0x44, struct tcon_gamma_table_s)
+#define AMVECM_IOC_S_RGB_OGO _IOW(AMVECM_IOC_MAGIC, 0x45, struct tcon_rgb_ogo_s)
+#define AMVECM_IOC_G_RGB_OGO _IOR(AMVECM_IOC_MAGIC, 0x46, struct tcon_rgb_ogo_s)
+
+#endif /* __AMVECM_H */
+
diff --git a/tvapi/libtv/include/cm.h b/tvapi/libtv/include/cm.h
index 085e466..4d5bd86 100644
--- a/tvapi/libtv/include/cm.h
+++ b/tvapi/libtv/include/cm.h
@@ -1,153 +1,155 @@
-#ifndef _TVOUT_CM_H
-#define _TVOUT_CM_H
-
-// ***************************************************************************
-// *** enum definitions *********************************************
-// ***************************************************************************
-
-typedef enum cm_region_idx_e {
- CM_REGION_IDX_0 = 0,
- CM_REGION_IDX_1,
- CM_REGION_IDX_2,
- CM_REGION_IDX_3,
- CM_REGION_IDX_4,
- CM_REGION_IDX_5,
- CM_REGION_IDX_6,
- CM_REGION_IDX_7,
-} cm_region_idx_t;
-
-typedef enum cm_sat_shape_e {
- CM_SAT_SHAPE_RIGHT_BIGGEST = 0,
- CM_SAT_SHAPE_LEFT_BIGGEST,
-} cm_sat_shape_t;
-
-typedef enum cm_hue_shape_e {
- CM_HUE_SHAPE_LEFT_MORE = 0,
- CM_HUE_SHAPE_RIGHT_MORE,
-} cm_hue_shape_t;
-
-typedef enum cm_demo_pos_e {
- CM_DEMO_POS_TOP = 0,
- CM_DEMO_POS_BOTTOM,
- CM_DEMO_POS_LEFT,
- CM_DEMO_POS_RIGHT,
-} cm_demo_pos_t;
-
-typedef enum cm_sat_sel_e {
- CM_SAT_SEL_U2_V2 = 0,
- CM_SAT_SEL_UV_MAX,
-} cm_sat_sel_t;
-
-typedef enum cm_csc_e {
- CM_CSC_601 = 0,
- CM_CSC_709,
- CM_CSC_FULL_601,
- CM_CSC_FULL_709,
-} cm_csc_t;
-
-// ***************************************************************************
-// *** struct definitions *********************************************
-// ***************************************************************************
-
-typedef struct cm_region_s {
- enum cm_region_idx_e region_idx;
- // sym
- unsigned char sym_en;
- // sat - top
- unsigned char sat_en;
- unsigned char sat_central_en;
- enum cm_sat_shape_e sat_shape;
- unsigned char sat_gain;
- unsigned char sat_inc;
- // sat - lum
- unsigned char sat_lum_h_slope;
- unsigned char sat_lum_l_slope;
- unsigned char sat_lum_h;
- unsigned char sat_lum_l;
- // sat - sat
- unsigned char sat_sat_h_slope;
- unsigned char sat_sat_l_slope;
- unsigned char sat_sat_h;
- unsigned char sat_sat_l;
- // hue - top
- unsigned char hue_en;
- unsigned char hue_central_en;
- enum cm_hue_shape_e hue_shape;
- unsigned char hue_gain;
- unsigned char hue_clockwise;
- unsigned char hue_shf_ran;
- unsigned short hue_shf_sta;
- // hue - lum
- unsigned char hue_lum_h_slope;
- unsigned char hue_lum_l_slope;
- unsigned char hue_lum_h;
- unsigned char hue_lum_l;
- // hue - sat
- unsigned char hue_sat_h_slope;
- unsigned char hue_sat_l_slope;
- unsigned char hue_sat_h;
- unsigned char hue_sat_l;
-} cm_region_t;
-
-typedef struct cm_top_s {
- unsigned char chroma_en;
- enum cm_sat_sel_e sat_sel;
- unsigned char uv_adj_en;
- unsigned char rgb_to_hue_en;
- enum cm_csc_e csc_sel;
-} cm_top_t;
-
-typedef struct cm_cbar_s {
- unsigned char en;
- unsigned char wid;
- unsigned char cr;
- unsigned char cb;
- unsigned char y;
-} cm_cbar_t;
-typedef struct cm_demo_s {
- unsigned char en;
- enum cm_demo_pos_e pos;
- unsigned char hlight_adj;
- unsigned short wid;
- struct cm_cbar_s cbar;
-} cm_demo_t;
-
-typedef struct cm_regmap_s {
- unsigned long reg[50];
-} cm_regmap_t;
-
-typedef enum reg_bus_type_e {
- REG_TYPE_PHY = 0,
- REG_TYPE_CBUS,
- REG_TYPE_APB,
- REG_TYPE_AXI,
- REG_TYPE_AHB,
- REG_TYPE_MPEG,
- REG_TYPE_INDEX_VPPCHROMA,
- REG_TYPE_INDEX_GAMMA,
- VALUE_TYPE_CONTRAST_BRIGHTNESS,
- REG_TYPE_INDEX_VPP_COEF,
- REG_TYPE_MAX,
-} reg_bus_type_t;
-
-/* Register table structure */
-typedef struct am_reg_s {
- unsigned int type; //32-bits; 0: CBUS; 1: APB BUS...
- unsigned int addr; //32-bits; Register address
- unsigned int mask; //32-bits; Valid bits
- unsigned int val; //32-bits; Register Value
-} am_reg_t;
-
-#ifdef AMVIDEO_REG_TABLE_DYNAMIC
-typedef struct am_regs_s {
- unsigned int length; // Length of total am_reg
- struct am_reg_s *am_reg;
-} am_regs_t;
-#else
-typedef struct am_regs_s {
- unsigned int length; // Length of total am_reg
- struct am_reg_s am_reg[512];
-} am_regs_t;
-#endif
-
-#endif // _TVOUT_CM_H
+#ifndef _TVOUT_CM_H
+#define _TVOUT_CM_H
+
+#define REGS_MAX_NUMBER 900
+
+// ***************************************************************************
+// *** enum definitions *********************************************
+// ***************************************************************************
+
+typedef enum cm_region_idx_e {
+ CM_REGION_IDX_0 = 0,
+ CM_REGION_IDX_1,
+ CM_REGION_IDX_2,
+ CM_REGION_IDX_3,
+ CM_REGION_IDX_4,
+ CM_REGION_IDX_5,
+ CM_REGION_IDX_6,
+ CM_REGION_IDX_7,
+} cm_region_idx_t;
+
+typedef enum cm_sat_shape_e {
+ CM_SAT_SHAPE_RIGHT_BIGGEST = 0,
+ CM_SAT_SHAPE_LEFT_BIGGEST,
+} cm_sat_shape_t;
+
+typedef enum cm_hue_shape_e {
+ CM_HUE_SHAPE_LEFT_MORE = 0,
+ CM_HUE_SHAPE_RIGHT_MORE,
+} cm_hue_shape_t;
+
+typedef enum cm_demo_pos_e {
+ CM_DEMO_POS_TOP = 0,
+ CM_DEMO_POS_BOTTOM,
+ CM_DEMO_POS_LEFT,
+ CM_DEMO_POS_RIGHT,
+} cm_demo_pos_t;
+
+typedef enum cm_sat_sel_e {
+ CM_SAT_SEL_U2_V2 = 0,
+ CM_SAT_SEL_UV_MAX,
+} cm_sat_sel_t;
+
+typedef enum cm_csc_e {
+ CM_CSC_601 = 0,
+ CM_CSC_709,
+ CM_CSC_FULL_601,
+ CM_CSC_FULL_709,
+} cm_csc_t;
+
+// ***************************************************************************
+// *** struct definitions *********************************************
+// ***************************************************************************
+
+typedef struct cm_region_s {
+ enum cm_region_idx_e region_idx;
+ // sym
+ unsigned char sym_en;
+ // sat - top
+ unsigned char sat_en;
+ unsigned char sat_central_en;
+ enum cm_sat_shape_e sat_shape;
+ unsigned char sat_gain;
+ unsigned char sat_inc;
+ // sat - lum
+ unsigned char sat_lum_h_slope;
+ unsigned char sat_lum_l_slope;
+ unsigned char sat_lum_h;
+ unsigned char sat_lum_l;
+ // sat - sat
+ unsigned char sat_sat_h_slope;
+ unsigned char sat_sat_l_slope;
+ unsigned char sat_sat_h;
+ unsigned char sat_sat_l;
+ // hue - top
+ unsigned char hue_en;
+ unsigned char hue_central_en;
+ enum cm_hue_shape_e hue_shape;
+ unsigned char hue_gain;
+ unsigned char hue_clockwise;
+ unsigned char hue_shf_ran;
+ unsigned short hue_shf_sta;
+ // hue - lum
+ unsigned char hue_lum_h_slope;
+ unsigned char hue_lum_l_slope;
+ unsigned char hue_lum_h;
+ unsigned char hue_lum_l;
+ // hue - sat
+ unsigned char hue_sat_h_slope;
+ unsigned char hue_sat_l_slope;
+ unsigned char hue_sat_h;
+ unsigned char hue_sat_l;
+} cm_region_t;
+
+typedef struct cm_top_s {
+ unsigned char chroma_en;
+ enum cm_sat_sel_e sat_sel;
+ unsigned char uv_adj_en;
+ unsigned char rgb_to_hue_en;
+ enum cm_csc_e csc_sel;
+} cm_top_t;
+
+typedef struct cm_cbar_s {
+ unsigned char en;
+ unsigned char wid;
+ unsigned char cr;
+ unsigned char cb;
+ unsigned char y;
+} cm_cbar_t;
+typedef struct cm_demo_s {
+ unsigned char en;
+ enum cm_demo_pos_e pos;
+ unsigned char hlight_adj;
+ unsigned short wid;
+ struct cm_cbar_s cbar;
+} cm_demo_t;
+
+typedef struct cm_regmap_s {
+ unsigned long reg[50];
+} cm_regmap_t;
+
+typedef enum reg_bus_type_e {
+ REG_TYPE_PHY = 0,
+ REG_TYPE_CBUS,
+ REG_TYPE_APB,
+ REG_TYPE_AXI,
+ REG_TYPE_AHB,
+ REG_TYPE_MPEG,
+ REG_TYPE_INDEX_VPPCHROMA,
+ REG_TYPE_INDEX_GAMMA,
+ VALUE_TYPE_CONTRAST_BRIGHTNESS,
+ REG_TYPE_INDEX_VPP_COEF,
+ REG_TYPE_MAX,
+} reg_bus_type_t;
+
+/* Register table structure */
+typedef struct am_reg_s {
+ unsigned int type; //32-bits; 0: CBUS; 1: APB BUS...
+ unsigned int addr; //32-bits; Register address
+ unsigned int mask; //32-bits; Valid bits
+ unsigned int val; //32-bits; Register Value
+} am_reg_t;
+
+#ifdef AMVIDEO_REG_TABLE_DYNAMIC
+typedef struct am_regs_s {
+ unsigned int length; // Length of total am_reg
+ struct am_reg_s *am_reg;
+} am_regs_t;
+#else
+typedef struct am_regs_s {
+ unsigned int length; // Length of total am_reg
+ struct am_reg_s am_reg[REGS_MAX_NUMBER];
+} am_regs_t;
+#endif
+
+#endif // _TVOUT_CM_H
diff --git a/tvapi/libtv/include/hdmirx_cec.h b/tvapi/libtv/include/hdmirx_cec.h
index 45e60ed..495e210 100644
--- a/tvapi/libtv/include/hdmirx_cec.h
+++ b/tvapi/libtv/include/hdmirx_cec.h
@@ -42,70 +42,70 @@ typedef enum _cec_dev_type {
E_DEVICE_TYPE_TUNER = 3,
E_DEVICE_TYPE_PLAYBACK_DEVICE = 4,
E_DEVICE_TYPE_AUDIO_SYSTEM = 5,
- E_DEVICE_TYPE_PURE_CEC_SWITCH = 6,
- E_DEVICE_TYPE_VIDEO_PROCESSOR = 7
+ E_DEVICE_TYPE_PURE_CEC_SWITCH = 6,
+ E_DEVICE_TYPE_VIDEO_PROCESSOR = 7
} _cec_dev_type;
typedef enum _cec_cmd {
//----- One Touch Play ----------------------------
E_MSG_ACTIVE_SOURCE = 0x82,
- E_MSG_IMAGE_VIEW_ON = 0x04,
- E_MSG_TEXT_VIEW_ON = 0x0D,
+ E_MSG_IMAGE_VIEW_ON = 0x04,
+ E_MSG_TEXT_VIEW_ON = 0x0D,
//----- Routing Control ---------------------------
//E_MSG_RC_ACTIVE_SOURCE = 0x82,
- E_MSG_INACTIVE_SOURCE = 0x9D,
- E_MSG_REQUEST_ACTIVE_SOURCE = 0x85,
- E_MSG_ROUTING_CHANGE = 0x80,
- E_MSG_ROUTING_INFO = 0x81,
- E_MSG_SET_STREM_PATH = 0x86,
+ E_MSG_INACTIVE_SOURCE = 0x9D,
+ E_MSG_REQUEST_ACTIVE_SOURCE = 0x85,
+ E_MSG_ROUTING_CHANGE = 0x80,
+ E_MSG_ROUTING_INFO = 0x81,
+ E_MSG_SET_STREM_PATH = 0x86,
//----- Standby Command ---------------------------
E_MSG_STANDBY = 0x36,
//----- One Touch Record---------------------------
- E_MSG_RECORD_ON = 0x09,
- E_MSG_RECORD_OFF = 0x0B,
- E_MSG_RECORD_STATUS = 0x0A,
- E_MSG_RECORD_TV_SCREEN = 0x0F,
+ E_MSG_RECORD_ON = 0x09,
+ E_MSG_RECORD_OFF = 0x0B,
+ E_MSG_RECORD_STATUS = 0x0A,
+ E_MSG_RECORD_TV_SCREEN = 0x0F,
//----- Timer programmer -------------------------- CEC1.3a
- E_MSG_CLEAR_ANALOG_TIMER = 0x33,
- E_MSG_CLEAR_DIGITAL_TIMER = 0x99,
- E_MSG_CLEAR_EXT_TIMER = 0xA1,
- E_MSG_SET_ANALOG_TIMER = 0x34,
- E_MSG_SET_DIGITAL_TIMER = 0x97,
- E_MSG_SET_EXT_TIMER = 0xA2,
- E_MSG_SET_TIMER_PROGRAM_TITLE = 0x67,
- E_MSG_TIMER_CLEARD_STATUS = 0x43,
- E_MSG_TIMER_STATUS = 0x35,
+ E_MSG_CLEAR_ANALOG_TIMER = 0x33,
+ E_MSG_CLEAR_DIGITAL_TIMER = 0x99,
+ E_MSG_CLEAR_EXT_TIMER = 0xA1,
+ E_MSG_SET_ANALOG_TIMER = 0x34,
+ E_MSG_SET_DIGITAL_TIMER = 0x97,
+ E_MSG_SET_EXT_TIMER = 0xA2,
+ E_MSG_SET_TIMER_PROGRAM_TITLE = 0x67,
+ E_MSG_TIMER_CLEARD_STATUS = 0x43,
+ E_MSG_TIMER_STATUS = 0x35,
//----- System Information ------------------------
- E_MSG_CEC_VERSION = 0x9E, //1.3a
- E_MSG_GET_CEC_VERSION = 0x9F, //1.3a
- E_MSG_GIVE_PHYSICAL_ADDRESS = 0x83,
- E_MSG_REPORT_PHYSICAL_ADDRESS = 0x84,
- E_MSG_GET_MENU_LANGUAGE = 0x91,
- E_MSG_SET_MENU_LANGUAGE = 0x32,
- //E_MSG_POLLING_MESSAGE = ?,
- //E_MSG_REC_TYPE_PRESET = 0x00, //parameter ?
- //E_MSG_REC_TYPE_OWNSRC = 0x01, //parameter ?
+ E_MSG_CEC_VERSION = 0x9E, //1.3a
+ E_MSG_GET_CEC_VERSION = 0x9F, //1.3a
+ E_MSG_GIVE_PHYSICAL_ADDRESS = 0x83,
+ E_MSG_REPORT_PHYSICAL_ADDRESS = 0x84,
+ E_MSG_GET_MENU_LANGUAGE = 0x91,
+ E_MSG_SET_MENU_LANGUAGE = 0x32,
+ //E_MSG_POLLING_MESSAGE = ?,
+ //E_MSG_REC_TYPE_PRESET = 0x00, //parameter ?
+ //E_MSG_REC_TYPE_OWNSRC = 0x01, //parameter ?
//----- Deck Control Feature-----------------------
- E_MSG_DECK_CTRL = 0x42,
- E_MSG_DECK_STATUS = 0x1B,
- E_MSG_GIVE_DECK_STATUS = 0x1A,
- E_MSG_PLAY = 0x41,
+ E_MSG_DECK_CTRL = 0x42,
+ E_MSG_DECK_STATUS = 0x1B,
+ E_MSG_GIVE_DECK_STATUS = 0x1A,
+ E_MSG_PLAY = 0x41,
//----- Tuner Control ------------------------------
- E_MSG_GIVE_TUNER_STATUS = 0x08,
- E_MSG_SEL_ANALOG_SERVICE = 0x92,
- E_MSG_SEL_DIGITAL_SERVICE = 0x93,
- E_MSG_TUNER_DEVICE_STATUS = 0x07,
- E_MSG_TUNER_STEP_DEC = 0x06,
- E_MSG_TUNER_STEP_INC = 0x05,
+ E_MSG_GIVE_TUNER_STATUS = 0x08,
+ E_MSG_SEL_ANALOG_SERVICE = 0x92,
+ E_MSG_SEL_DIGITAL_SERVICE = 0x93,
+ E_MSG_TUNER_DEVICE_STATUS = 0x07,
+ E_MSG_TUNER_STEP_DEC = 0x06,
+ E_MSG_TUNER_STEP_INC = 0x05,
//---------Vendor Specific -------------------------
- //E_MSG_CEC_VERSION = 0x9E, //1.3a
- //E_MSG_GET_CEC_VERSION = 0x9F, //1.3a
- E_MSG_DEVICE_VENDOR_ID = 0x87,
- E_MSG_GIVE_DEVICE_VENDOR_ID = 0x8C,
- E_MSG_VENDOR_COMMAND = 0x89,
- E_MSG_VENDOR_COMMAND_WITH_ID = 0xA0, //1.3a
- E_MSG_VENDOR_RC_BUT_DOWN = 0x8A,
- E_MSG_VENDOR_RC_BUT_UP = 0x8B,
+ //E_MSG_CEC_VERSION = 0x9E, //1.3a
+ //E_MSG_GET_CEC_VERSION = 0x9F, //1.3a
+ E_MSG_DEVICE_VENDOR_ID = 0x87,
+ E_MSG_GIVE_DEVICE_VENDOR_ID = 0x8C,
+ E_MSG_VENDOR_COMMAND = 0x89,
+ E_MSG_VENDOR_COMMAND_WITH_ID = 0xA0, //1.3a
+ E_MSG_VENDOR_RC_BUT_DOWN = 0x8A,
+ E_MSG_VENDOR_RC_BUT_UP = 0x8B,
//----- OSD Display --------------------------------
E_MSG_SET_OSD_STRING = 0x64,
//----- Device OSD Name Transfer -------------------------
@@ -117,14 +117,14 @@ typedef enum _cec_cmd {
E_MSG_UI_PRESS = 0x44,
E_MSG_UI_RELEASE = 0x45,
//----- Remote Control Passthrough ----------------
- //E_MSG_UI_PRESS = 0x44,
- //E_MSG_UI_RELEASE = 0x45,
+ //E_MSG_UI_PRESS = 0x44,
+ //E_MSG_UI_RELEASE = 0x45,
//----- Power Status ------------------------------
- E_MSG_GIVE_DEVICE_POWER_STATUS = 0x8F,
- E_MSG_REPORT_POWER_STATUS = 0x90,
+ E_MSG_GIVE_DEVICE_POWER_STATUS = 0x8F,
+ E_MSG_REPORT_POWER_STATUS = 0x90,
//----- General Protocal Message ------------------
- E_MSG_ABORT_MESSAGE = 0xFF, //Abort msg
- E_MSG_FEATURE_ABORT = 0x00, //Feature Abort
+ E_MSG_ABORT_MESSAGE = 0xFF, //Abort msg
+ E_MSG_FEATURE_ABORT = 0x00, //Feature Abort
//----- System Audio Control ----------------------
E_MSG_ARC_GIVE_AUDIO_STATUS = 0x71,
E_MSG_ARC_GIVE_SYSTEM_AUDIO_MODE_STATUS = 0x7D,
@@ -144,103 +144,103 @@ typedef enum _cec_cmd {
E_MSG_CDC_MESSAGE = 0xF8,
//amlogic cmd
//TCL
- CMD_TCL_WIFI = 0x01,
- CMD_TCL_ETHERNET = 0x02,
- CMD_TCL_3D = 0x03,
- CMD_TCL_PANEL_REVERSE = 0x04,
- CMD_RESERVE1 = 0x05,
- CMD_RESERVE2 = 0x06,
- CMD_RESERVE3 = 0x07,
+ CMD_TCL_WIFI = 0x01,
+ CMD_TCL_ETHERNET = 0x02,
+ CMD_TCL_3D = 0x03,
+ CMD_TCL_PANEL_REVERSE = 0x04,
+ CMD_RESERVE1 = 0x05,
+ CMD_RESERVE2 = 0x06,
+ CMD_RESERVE3 = 0x07,
//VPU
- CMD_VPU_INIT = 0x08,
- CMD_VPU_ENABLE = 0x09,
- CMD_VPU_BYPASS = 0x0a,
- CMD_VPU_OUTPUT_MUX = 0x0b,
- CMD_VPU_TIMING = 0x0c,
- CMD_VPU_SOURCE = 0x0d,
- CMD_RESERVE4 = 0x0e,
- CMD_RESERVE5 = 0x0f,
+ CMD_VPU_INIT = 0x08,
+ CMD_VPU_ENABLE = 0x09,
+ CMD_VPU_BYPASS = 0x0a,
+ CMD_VPU_OUTPUT_MUX = 0x0b,
+ CMD_VPU_TIMING = 0x0c,
+ CMD_VPU_SOURCE = 0x0d,
+ CMD_RESERVE4 = 0x0e,
+ CMD_RESERVE5 = 0x0f,
//TCL || AML
- CMD_TCL_BRIDGE_SW_VER = 0x10,
- //CMD_G9_MAINCODE_VER = 0x10,
- CMD_TCL_DEVICE_ID = 0x11,
- //CMD_G9_BOOTCODE_VER = 0x11,
- CMD_TCL_CLIENT_TYPE = 0x12,
- //CMD_INFO_G9_TO_FBC = 0x12,
- CMD_TCL_DEVICE_NUM = 0x13,
- //CMD_INFO_FBC_TO_G9 = 0x13,
- CMD_TCL_ACTIVE_KEY = 0x14,
- //CMD_TIME_SYNC = 0x14,
- CMD_TCL_ACTIVE_STATUS = 0x15,
- //CMD_KEY_TRANSLATION = 0x15,
- CMD_RESERVE6 = 0x16,
- CMD_RESERVE7 = 0x17,
+ CMD_TCL_BRIDGE_SW_VER = 0x10,
+ //CMD_G9_MAINCODE_VER = 0x10,
+ CMD_TCL_DEVICE_ID = 0x11,
+ //CMD_G9_BOOTCODE_VER = 0x11,
+ CMD_TCL_CLIENT_TYPE = 0x12,
+ //CMD_INFO_G9_TO_FBC = 0x12,
+ CMD_TCL_DEVICE_NUM = 0x13,
+ //CMD_INFO_FBC_TO_G9 = 0x13,
+ CMD_TCL_ACTIVE_KEY = 0x14,
+ //CMD_TIME_SYNC = 0x14,
+ CMD_TCL_ACTIVE_STATUS = 0x15,
+ //CMD_KEY_TRANSLATION = 0x15,
+ CMD_RESERVE6 = 0x16,
+ CMD_RESERVE7 = 0x17,
//DEBUG READ
- CMD_DBG_RD_REGISTER_ACCESS = 0x18,
- CMD_DBG_RD_MEMORY_ACCESS = 0x19,
- CMD_DBG_RD_SPI_ACCESS = 0x1a,
- CMD_DBG_RD_VPU_MEMORY_ACCESS = 0x1b,
- CMD_DBG_RD_MEMORY_TRANSFER = 0x1c,
- CMD_DBG_INPUT_KEY_DOWN = 0x1d,
- CMD_DBG_INPUT_KEY_UP = 0x1e,
- CMD_DBG_INPUT_REBOOT = 0x1f,
+ CMD_DBG_RD_REGISTER_ACCESS = 0x18,
+ CMD_DBG_RD_MEMORY_ACCESS = 0x19,
+ CMD_DBG_RD_SPI_ACCESS = 0x1a,
+ CMD_DBG_RD_VPU_MEMORY_ACCESS = 0x1b,
+ CMD_DBG_RD_MEMORY_TRANSFER = 0x1c,
+ CMD_DBG_INPUT_KEY_DOWN = 0x1d,
+ CMD_DBG_INPUT_KEY_UP = 0x1e,
+ CMD_DBG_INPUT_REBOOT = 0x1f,
//DEBUG WRITE
- CMD_DBG_WR_REGISTER_ACCESS = 0x98,
- CMD_DBG_WR_MEMORY_ACCESS = 0x99,
- CMD_DBG_WR_SPI_ACCESS = 0x9a,
- CMD_DBG_WR_VPU_MEMORY_ACCESS = 0x9b,
- CMD_DBG_WR_MEMORY_TRANSFER = 0x9c,
+ CMD_DBG_WR_REGISTER_ACCESS = 0x98,
+ CMD_DBG_WR_MEMORY_ACCESS = 0x99,
+ CMD_DBG_WR_SPI_ACCESS = 0x9a,
+ CMD_DBG_WR_VPU_MEMORY_ACCESS = 0x9b,
+ CMD_DBG_WR_MEMORY_TRANSFER = 0x9c,
//USER
- CMD_NATURE_LIGHT_ONOFF = 0x20,
- CMD_USR_BACKLIGHT_ONOFF = 0x21,
- CMD_USR_BRIGHTNESS = 0x22,
- CMD_USR_CONTRAST = 0x23,
- CMD_USR_BACKLIGHT = 0x24,
- CMD_RESERVE25 = 0x25,
- CMD_USR_SATURATION = 0x26,
- CMD_USR_DYNAMIC_CONTRAST = 0x27,
- CMD_USR_PICTURE_MODE = 0x28,
- CMD_TEST_PATTERN_ONOFF = 0x29,
- CMD_TEST_PATTERN_SELECT = 0x2a,
- CMD_RESERVE8 = 0x2b,
- CMD_RESERVE9 = 0x2c,
- CMD_RESERVE10 = 0x2d,
- CMD_RESERVE11 = 0x2e,
- CMD_USR_GAMMA = 0x2f,
+ CMD_NATURE_LIGHT_ONOFF = 0x20,
+ CMD_USR_BACKLIGHT_ONOFF = 0x21,
+ CMD_USR_BRIGHTNESS = 0x22,
+ CMD_USR_CONTRAST = 0x23,
+ CMD_USR_BACKLIGHT = 0x24,
+ CMD_RESERVE25 = 0x25,
+ CMD_USR_SATURATION = 0x26,
+ CMD_USR_DYNAMIC_CONTRAST = 0x27,
+ CMD_USR_PICTURE_MODE = 0x28,
+ CMD_TEST_PATTERN_ONOFF = 0x29,
+ CMD_TEST_PATTERN_SELECT = 0x2a,
+ CMD_RESERVE8 = 0x2b,
+ CMD_RESERVE9 = 0x2c,
+ CMD_RESERVE10 = 0x2d,
+ CMD_RESERVE11 = 0x2e,
+ CMD_USR_GAMMA = 0x2f,
//FACTORY
- CMD_DEF_SOUND_MODE = 0x30,
- CMD_DEF_COLOR_TEMPERATURE = 0x31,
- CMD_DEF_BRIGHTNESS = 0x32,
- CMD_DEF_CONTRAST = 0x33,
- CMD_DEF_COLOR = 0x34,
- CMD_RESERVE12 = 0x35,
- CMD_DEF_BACKLIGHT = 0x36,
- CMD_RESERVE13 = 0x37,
- CMD_AUTO_LUMA_ONOFF = 0x38,
- CMD_HISTOGRAM = 0x39,
- CMD_BLEND = 0x3a,
- CMD_DEMULA = 0x3b,
- CMD_COLORSPACE_CONVERSION = 0x3c,
- CMD_CM2 = 0x3d,
- CMD_RESERVE14 = 0x3e,
- CMD_RESERVE15 = 0x3f,
+ CMD_DEF_SOUND_MODE = 0x30,
+ CMD_DEF_COLOR_TEMPERATURE = 0x31,
+ CMD_DEF_BRIGHTNESS = 0x32,
+ CMD_DEF_CONTRAST = 0x33,
+ CMD_DEF_COLOR = 0x34,
+ CMD_RESERVE12 = 0x35,
+ CMD_DEF_BACKLIGHT = 0x36,
+ CMD_RESERVE13 = 0x37,
+ CMD_AUTO_LUMA_ONOFF = 0x38,
+ CMD_HISTOGRAM = 0x39,
+ CMD_BLEND = 0x3a,
+ CMD_DEMULA = 0x3b,
+ CMD_COLORSPACE_CONVERSION = 0x3c,
+ CMD_CM2 = 0x3d,
+ CMD_RESERVE14 = 0x3e,
+ CMD_RESERVE15 = 0x3f,
// GAIN & OFFSET & WHITEBLANCE
- CMD_DEF_RED_GAIN = 0x40,
- CMD_DEF_GREEN_GAIN = 0x41,
- CMD_DEF_BLUE_GAIN = 0x42,
- CMD_DEF_RED_OFFSET = 0x43,
- CMD_DEF_GREEN_OFFSET = 0x44,
- CMD_DEF_BLUE_OFFSET = 0x45,
- CMD_DEF_PRE_RED_OFFSET = 0x46,
- CMD_DEF_PRE_GREEN_OFFSET = 0x47,
- CMD_DEF_PRE_BLUE_OFFSET = 0x48,
- CMD_RESERVE16 = 0x49,
- CMD_WHITEBLANCE = 0x4a,
+ CMD_DEF_RED_GAIN = 0x40,
+ CMD_DEF_GREEN_GAIN = 0x41,
+ CMD_DEF_BLUE_GAIN = 0x42,
+ CMD_DEF_RED_OFFSET = 0x43,
+ CMD_DEF_GREEN_OFFSET = 0x44,
+ CMD_DEF_BLUE_OFFSET = 0x45,
+ CMD_DEF_PRE_RED_OFFSET = 0x46,
+ CMD_DEF_PRE_GREEN_OFFSET = 0x47,
+ CMD_DEF_PRE_BLUE_OFFSET = 0x48,
+ CMD_RESERVE16 = 0x49,
+ CMD_WHITEBLANCE = 0x4a,
- CMD_SET_SW_VERSION = 0x57,
- CMD_3D = 0xd0,
+ CMD_SET_SW_VERSION = 0x57,
+ CMD_3D = 0xd0,
- CMD_MAX = 0xff
+ CMD_MAX = 0xff
} _cec_cmd;
typedef struct _cec_msg {
@@ -284,24 +284,24 @@ typedef enum _cec_status {
typedef enum _cec_map_status {
- E_CEC_MAP_UPDATE_START = 0,
- E_CEC_MAP_POLLLING = 1,
- E_CEC_MAP_GET_VENDOR_ID = 2,
- E_CEC_MAP_GET_PHYSICAL_ADDR = 3,
- E_CEC_MAP_GET_OSD_NAME = 4,
- E_CEC_MAP_GET_CEC_VERSION = 5,
- E_CEC_MAP_UPDATE_COMPLETED = 6,
+ E_CEC_MAP_UPDATE_START = 0,
+ E_CEC_MAP_POLLLING = 1,
+ E_CEC_MAP_GET_VENDOR_ID = 2,
+ E_CEC_MAP_GET_PHYSICAL_ADDR = 3,
+ E_CEC_MAP_GET_OSD_NAME = 4,
+ E_CEC_MAP_GET_CEC_VERSION = 5,
+ E_CEC_MAP_UPDATE_COMPLETED = 6,
} _cec_map_status;
#define HDMI_IOC_MAGIC 'H'
-#define HDMI_IOC_CEC_ON _IO(HDMI_IOC_MAGIC, 0x01)
-#define HDMI_IOC_CEC_OFF _IO(HDMI_IOC_MAGIC, 0x02)
-#define HDMI_IOC_CEC_ARC_ON _IO(HDMI_IOC_MAGIC, 0x03)
-#define HDMI_IOC_CEC_ARC_OFF _IO(HDMI_IOC_MAGIC, 0x04)
-#define HDMI_IOC_CEC_CLEAR_BUFFER _IO(HDMI_IOC_MAGIC, 0x05)
-#define HDMI_IOC_CEC_GET_MSG_CNT _IOR(HDMI_IOC_MAGIC, 0x06, int)
-#define HDMI_IOC_CEC_GET_MSG _IOR(HDMI_IOC_MAGIC, 0x07, struct _cec_msg)
-#define HDMI_IOC_CEC_SENT_MSG _IOW(HDMI_IOC_MAGIC, 0x08, struct _cec_msg)
+#define HDMI_IOC_CEC_ON _IO(HDMI_IOC_MAGIC, 0x01)
+#define HDMI_IOC_CEC_OFF _IO(HDMI_IOC_MAGIC, 0x02)
+#define HDMI_IOC_CEC_ARC_ON _IO(HDMI_IOC_MAGIC, 0x03)
+#define HDMI_IOC_CEC_ARC_OFF _IO(HDMI_IOC_MAGIC, 0x04)
+#define HDMI_IOC_CEC_CLEAR_BUFFER _IO(HDMI_IOC_MAGIC, 0x05)
+#define HDMI_IOC_CEC_GET_MSG_CNT _IOR(HDMI_IOC_MAGIC, 0x06, int)
+#define HDMI_IOC_CEC_GET_MSG _IOR(HDMI_IOC_MAGIC, 0x07, struct _cec_msg)
+#define HDMI_IOC_CEC_SENT_MSG _IOW(HDMI_IOC_MAGIC, 0x08, struct _cec_msg)
//#include <linux/tvin/tvin.h>
//#include "../tvin_global.h"
diff --git a/tvapi/libtv/include/ve.h b/tvapi/libtv/include/ve.h
index 8eb8c10..a54c44c 100644
--- a/tvapi/libtv/include/ve.h
+++ b/tvapi/libtv/include/ve.h
@@ -1,219 +1,242 @@
-#ifndef __VE_H
-#define __VE_H
-
-// ***************************************************************************
-// *** enum definitions *********************************************
-// ***************************************************************************
-
-typedef enum ve_demo_pos_e {
- VE_DEMO_POS_TOP = 0,
- VE_DEMO_POS_BOTTOM,
- VE_DEMO_POS_LEFT,
- VE_DEMO_POS_RIGHT,
-} ve_demo_pos_t;
-
-typedef enum ve_dnlp_rt_e {
- VE_DNLP_RT_0S = 0,
- VE_DNLP_RT_1S = 6,
- VE_DNLP_RT_2S,
- VE_DNLP_RT_4S,
- VE_DNLP_RT_8S,
- VE_DNLP_RT_16S,
- VE_DNLP_RT_32S,
- VE_DNLP_RT_64S,
- VE_DNLP_RT_FREEZE,
-} ve_dnlp_rt_t;
-
-// ***************************************************************************
-// *** struct definitions *********************************************
-// ***************************************************************************
-
-typedef enum ve_dnlp_rl_e {
- VE_DNLP_RL_01 = 1, // max_contrast = 1.0625x
- VE_DNLP_RL_02, // max_contrast = 1.1250x
- VE_DNLP_RL_03, // max_contrast = 1.1875x
- VE_DNLP_RL_04, // max_contrast = 1.2500x
- VE_DNLP_RL_05, // max_contrast = 1.3125x
- VE_DNLP_RL_06, // max_contrast = 1.3750x
- VE_DNLP_RL_07, // max_contrast = 1.4375x
- VE_DNLP_RL_08, // max_contrast = 1.5000x
- VE_DNLP_RL_09, // max_contrast = 1.5625x
- VE_DNLP_RL_10, // max_contrast = 1.6250x
- VE_DNLP_RL_11, // max_contrast = 1.6875x
- VE_DNLP_RL_12, // max_contrast = 1.7500x
- VE_DNLP_RL_13, // max_contrast = 1.8125x
- VE_DNLP_RL_14, // max_contrast = 1.8750x
- VE_DNLP_RL_15, // max_contrast = 1.9375x
- VE_DNLP_RL_16, // max_contrast = 2.0000x
-} ve_dnlp_rl_t;
-
-typedef enum ve_dnlp_ext_e {
- VE_DNLP_EXT_00 = 0, // weak
- VE_DNLP_EXT_01,
- VE_DNLP_EXT_02,
- VE_DNLP_EXT_03,
- VE_DNLP_EXT_04,
- VE_DNLP_EXT_05,
- VE_DNLP_EXT_06,
- VE_DNLP_EXT_07,
- VE_DNLP_EXT_08,
- VE_DNLP_EXT_09,
- VE_DNLP_EXT_10,
- VE_DNLP_EXT_11,
- VE_DNLP_EXT_12,
- VE_DNLP_EXT_13,
- VE_DNLP_EXT_14,
- VE_DNLP_EXT_15,
- VE_DNLP_EXT_16, // strong
-} ve_dnlp_ext_t;
-
-typedef struct ve_bext_s {
- unsigned char en;
- unsigned char start;
- unsigned char slope1;
- unsigned char midpt;
- unsigned char slope2;
-} ve_bext_t;
-
-typedef struct ve_dnlp_s {
- unsigned int en;
- enum ve_dnlp_rt_e rt;
- enum ve_dnlp_rl_e rl;
- enum ve_dnlp_ext_e black;
- enum ve_dnlp_ext_e white;
-} ve_dnlp_t;
-typedef struct ve_hist_s {
- unsigned long sum;
- int width;
- int height;
- int ave;
-} ve_hist_t;
-typedef struct ve_dnlp_table_s {
- unsigned int en;
- unsigned int method;
- unsigned int cliprate;
- unsigned int lowrange;
- unsigned int hghrange;
- unsigned int lowalpha;
- unsigned int midalpha;
- unsigned int hghalpha;
-} ve_dnlp_table_t;
-typedef struct ve_hsvs_s {
- unsigned char en;
- unsigned char peak_gain_h1;
- unsigned char peak_gain_h2;
- unsigned char peak_gain_h3;
- unsigned char peak_gain_h4;
- unsigned char peak_gain_h5;
- unsigned char peak_gain_v1;
- unsigned char peak_gain_v2;
- unsigned char peak_gain_v3;
- unsigned char peak_gain_v4;
- unsigned char peak_gain_v5;
- unsigned char peak_gain_v6;
- unsigned char hpeak_slope1;
- unsigned char hpeak_slope2;
- unsigned char hpeak_thr1;
- unsigned char hpeak_thr2;
- unsigned char hpeak_nlp_cor_thr;
- unsigned char hpeak_nlp_gain_pos;
- unsigned char hpeak_nlp_gain_neg;
- unsigned char vpeak_slope1;
- unsigned char vpeak_slope2;
- unsigned char vpeak_thr1;
- unsigned char vpeak_thr2;
- unsigned char vpeak_nlp_cor_thr;
- unsigned char vpeak_nlp_gain_pos;
- unsigned char vpeak_nlp_gain_neg;
- unsigned char speak_slope1;
- unsigned char speak_slope2;
- unsigned char speak_thr1;
- unsigned char speak_thr2;
- unsigned char speak_nlp_cor_thr;
- unsigned char speak_nlp_gain_pos;
- unsigned char speak_nlp_gain_neg;
- unsigned char peak_cor_gain;
- unsigned char peak_cor_thr_l;
- unsigned char peak_cor_thr_h;
- unsigned char vlti_step;
- unsigned char vlti_step2;
- unsigned char vlti_thr;
- unsigned char vlti_gain_pos;
- unsigned char vlti_gain_neg;
- unsigned char vlti_blend_factor;
- unsigned char hlti_step;
- unsigned char hlti_thr;
- unsigned char hlti_gain_pos;
- unsigned char hlti_gain_neg;
- unsigned char hlti_blend_factor;
- unsigned char vlimit_coef_h;
- unsigned char vlimit_coef_l;
- unsigned char hlimit_coef_h;
- unsigned char hlimit_coef_l;
- unsigned char cti_444_422_en;
- unsigned char cti_422_444_en;
- unsigned char cti_blend_factor;
- unsigned char vcti_buf_en;
- unsigned char vcti_buf_mode_c5l;
- unsigned char vcti_filter;
- unsigned char hcti_step;
- unsigned char hcti_step2;
- unsigned char hcti_thr;
- unsigned char hcti_gain;
- unsigned char hcti_mode_median;
-} ve_hsvs_t;
-
-typedef struct ve_ccor_s {
- unsigned char en;
- unsigned char slope;
- unsigned char thr;
-} ve_ccor_t;
-
-typedef struct ve_benh_s {
- unsigned char en;
- unsigned char cb_inc;
- unsigned char cr_inc;
- unsigned char gain_cr;
- unsigned char gain_cb4cr;
- unsigned char luma_h;
- unsigned char err_crp;
- unsigned char err_crn;
- unsigned char err_cbp;
- unsigned char err_cbn;
-} ve_benh_t;
-
-typedef struct ve_cbar_s {
- unsigned char en;
- unsigned char wid;
- unsigned char cr;
- unsigned char cb;
- unsigned char y;
-} ve_cbar_t;
-typedef struct ve_demo_s {
- unsigned char bext;
- unsigned char dnlp;
- unsigned char hsvs;
- unsigned char ccor;
- unsigned char benh;
- enum ve_demo_pos_e pos;
- unsigned long wid;
- struct ve_cbar_s cbar;
-} ve_demo_t;
-
-typedef struct vdo_meas_s {
- //...
-} vdo_meas_t;
-
-typedef struct ve_regmap_s {
- unsigned long reg[43];
-} ve_regmap_t;
-
-// ***************************************************************************
-// *** MACRO definitions **********
-// ***************************************************************************
-
-// ***************************************************************************
-// *** FUNCTION definitions **********
-// ***************************************************************************
-
-#endif // _VE_H
+#ifndef __VE_H
+#define __VE_H
+
+// ***************************************************************************
+// *** enum definitions *********************************************
+// ***************************************************************************
+
+typedef enum ve_demo_pos_e {
+ VE_DEMO_POS_TOP = 0,
+ VE_DEMO_POS_BOTTOM,
+ VE_DEMO_POS_LEFT,
+ VE_DEMO_POS_RIGHT,
+} ve_demo_pos_t;
+
+typedef enum ve_dnlp_rt_e {
+ VE_DNLP_RT_0S = 0,
+ VE_DNLP_RT_1S = 6,
+ VE_DNLP_RT_2S,
+ VE_DNLP_RT_4S,
+ VE_DNLP_RT_8S,
+ VE_DNLP_RT_16S,
+ VE_DNLP_RT_32S,
+ VE_DNLP_RT_64S,
+ VE_DNLP_RT_FREEZE,
+} ve_dnlp_rt_t;
+
+// ***************************************************************************
+// *** struct definitions *********************************************
+// ***************************************************************************
+
+typedef enum ve_dnlp_rl_e {
+ VE_DNLP_RL_01 = 1, // max_contrast = 1.0625x
+ VE_DNLP_RL_02, // max_contrast = 1.1250x
+ VE_DNLP_RL_03, // max_contrast = 1.1875x
+ VE_DNLP_RL_04, // max_contrast = 1.2500x
+ VE_DNLP_RL_05, // max_contrast = 1.3125x
+ VE_DNLP_RL_06, // max_contrast = 1.3750x
+ VE_DNLP_RL_07, // max_contrast = 1.4375x
+ VE_DNLP_RL_08, // max_contrast = 1.5000x
+ VE_DNLP_RL_09, // max_contrast = 1.5625x
+ VE_DNLP_RL_10, // max_contrast = 1.6250x
+ VE_DNLP_RL_11, // max_contrast = 1.6875x
+ VE_DNLP_RL_12, // max_contrast = 1.7500x
+ VE_DNLP_RL_13, // max_contrast = 1.8125x
+ VE_DNLP_RL_14, // max_contrast = 1.8750x
+ VE_DNLP_RL_15, // max_contrast = 1.9375x
+ VE_DNLP_RL_16, // max_contrast = 2.0000x
+} ve_dnlp_rl_t;
+
+typedef enum ve_dnlp_ext_e {
+ VE_DNLP_EXT_00 = 0, // weak
+ VE_DNLP_EXT_01,
+ VE_DNLP_EXT_02,
+ VE_DNLP_EXT_03,
+ VE_DNLP_EXT_04,
+ VE_DNLP_EXT_05,
+ VE_DNLP_EXT_06,
+ VE_DNLP_EXT_07,
+ VE_DNLP_EXT_08,
+ VE_DNLP_EXT_09,
+ VE_DNLP_EXT_10,
+ VE_DNLP_EXT_11,
+ VE_DNLP_EXT_12,
+ VE_DNLP_EXT_13,
+ VE_DNLP_EXT_14,
+ VE_DNLP_EXT_15,
+ VE_DNLP_EXT_16, // strong
+} ve_dnlp_ext_t;
+
+typedef struct ve_bext_s {
+ unsigned char en;
+ unsigned char start;
+ unsigned char slope1;
+ unsigned char midpt;
+ unsigned char slope2;
+} ve_bext_t;
+
+typedef struct ve_dnlp_s {
+ unsigned int en;
+ enum ve_dnlp_rt_e rt;
+ enum ve_dnlp_rl_e rl;
+ enum ve_dnlp_ext_e black;
+ enum ve_dnlp_ext_e white;
+} ve_dnlp_t;
+typedef struct ve_hist_s {
+ unsigned long sum;
+ int width;
+ int height;
+ int ave;
+} ve_hist_t;
+/*typedef struct ve_dnlp_table_s {
+ unsigned int en;
+ unsigned int method;
+ unsigned int cliprate;
+ unsigned int lowrange;
+ unsigned int hghrange;
+ unsigned int lowalpha;
+ unsigned int midalpha;
+ unsigned int hghalpha;
+} ve_dnlp_table_t;*/
+typedef struct ve_dnlp_table_s {
+ unsigned int en;
+ unsigned int method;
+ unsigned int cliprate;
+ unsigned int lowrange;
+ unsigned int hghrange;
+ unsigned int lowalpha;
+ unsigned int midalpha;
+ unsigned int hghalpha;
+ unsigned int adj_level;
+ unsigned int new_adj_level;
+ unsigned int new_mvreflsh;
+ unsigned int new_gmma_rate;
+ unsigned int new_lowalpha;
+ unsigned int new_hghalpha;
+ unsigned int new_sbgnbnd;
+ unsigned int new_sendbnd;
+ unsigned int new_clashBgn;
+ unsigned int new_clashEnd;
+ unsigned int new_cliprate;
+ unsigned int new_mtdbld_rate;
+ unsigned int new_blkgma_rate;
+} ve_dnlp_table_t;
+typedef struct ve_hsvs_s {
+ unsigned char en;
+ unsigned char peak_gain_h1;
+ unsigned char peak_gain_h2;
+ unsigned char peak_gain_h3;
+ unsigned char peak_gain_h4;
+ unsigned char peak_gain_h5;
+ unsigned char peak_gain_v1;
+ unsigned char peak_gain_v2;
+ unsigned char peak_gain_v3;
+ unsigned char peak_gain_v4;
+ unsigned char peak_gain_v5;
+ unsigned char peak_gain_v6;
+ unsigned char hpeak_slope1;
+ unsigned char hpeak_slope2;
+ unsigned char hpeak_thr1;
+ unsigned char hpeak_thr2;
+ unsigned char hpeak_nlp_cor_thr;
+ unsigned char hpeak_nlp_gain_pos;
+ unsigned char hpeak_nlp_gain_neg;
+ unsigned char vpeak_slope1;
+ unsigned char vpeak_slope2;
+ unsigned char vpeak_thr1;
+ unsigned char vpeak_thr2;
+ unsigned char vpeak_nlp_cor_thr;
+ unsigned char vpeak_nlp_gain_pos;
+ unsigned char vpeak_nlp_gain_neg;
+ unsigned char speak_slope1;
+ unsigned char speak_slope2;
+ unsigned char speak_thr1;
+ unsigned char speak_thr2;
+ unsigned char speak_nlp_cor_thr;
+ unsigned char speak_nlp_gain_pos;
+ unsigned char speak_nlp_gain_neg;
+ unsigned char peak_cor_gain;
+ unsigned char peak_cor_thr_l;
+ unsigned char peak_cor_thr_h;
+ unsigned char vlti_step;
+ unsigned char vlti_step2;
+ unsigned char vlti_thr;
+ unsigned char vlti_gain_pos;
+ unsigned char vlti_gain_neg;
+ unsigned char vlti_blend_factor;
+ unsigned char hlti_step;
+ unsigned char hlti_thr;
+ unsigned char hlti_gain_pos;
+ unsigned char hlti_gain_neg;
+ unsigned char hlti_blend_factor;
+ unsigned char vlimit_coef_h;
+ unsigned char vlimit_coef_l;
+ unsigned char hlimit_coef_h;
+ unsigned char hlimit_coef_l;
+ unsigned char cti_444_422_en;
+ unsigned char cti_422_444_en;
+ unsigned char cti_blend_factor;
+ unsigned char vcti_buf_en;
+ unsigned char vcti_buf_mode_c5l;
+ unsigned char vcti_filter;
+ unsigned char hcti_step;
+ unsigned char hcti_step2;
+ unsigned char hcti_thr;
+ unsigned char hcti_gain;
+ unsigned char hcti_mode_median;
+} ve_hsvs_t;
+
+typedef struct ve_ccor_s {
+ unsigned char en;
+ unsigned char slope;
+ unsigned char thr;
+} ve_ccor_t;
+
+typedef struct ve_benh_s {
+ unsigned char en;
+ unsigned char cb_inc;
+ unsigned char cr_inc;
+ unsigned char gain_cr;
+ unsigned char gain_cb4cr;
+ unsigned char luma_h;
+ unsigned char err_crp;
+ unsigned char err_crn;
+ unsigned char err_cbp;
+ unsigned char err_cbn;
+} ve_benh_t;
+
+typedef struct ve_cbar_s {
+ unsigned char en;
+ unsigned char wid;
+ unsigned char cr;
+ unsigned char cb;
+ unsigned char y;
+} ve_cbar_t;
+typedef struct ve_demo_s {
+ unsigned char bext;
+ unsigned char dnlp;
+ unsigned char hsvs;
+ unsigned char ccor;
+ unsigned char benh;
+ enum ve_demo_pos_e pos;
+ unsigned long wid;
+ struct ve_cbar_s cbar;
+} ve_demo_t;
+
+typedef struct vdo_meas_s {
+ //...
+} vdo_meas_t;
+
+typedef struct ve_regmap_s {
+ unsigned long reg[43];
+} ve_regmap_t;
+
+// ***************************************************************************
+// *** MACRO definitions **********
+// ***************************************************************************
+
+// ***************************************************************************
+// *** FUNCTION definitions **********
+// ***************************************************************************
+
+#endif // _VE_H
diff --git a/tvapi/libtv/tv/AutoBackLight.cpp b/tvapi/libtv/tv/AutoBackLight.cpp
index d00f931..c87635a 100644
--- a/tvapi/libtv/tv/AutoBackLight.cpp
+++ b/tvapi/libtv/tv/AutoBackLight.cpp
@@ -1,213 +1,212 @@
-#include "AutoBackLight.h"
-#include "../tvsetting/CTvSetting.h"
-#include "../tvconfig/tvconfig.h"
-#include "../tvutils/tvutils.h"
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-#include <dlfcn.h>
-#include <linux/fb.h>
-#include <stdlib.h>
-#include <cutils/properties.h>
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#define LOG_TAG "AutoBackLight"
-#endif
-
-AutoBackLight::AutoBackLight( CVpp *mVpp, CTvin *pTvin )
-{
- mAutoBacklightSource = SOURCE_TYPE_TV;
- myVpp = mVpp;
- myTvin = pTvin;
- mCur_source_default_backlight = 100;
- mCur_sig_state == SIG_STATE_NOSIG;
- mAutoBacklight_OnOff_Flag = false;
- mCurrent_backlight = 100;
- mCur_dest_backlight = 100;
-}
-
-AutoBackLight::~AutoBackLight()
-{
- mAutoBacklight_OnOff_Flag = false;
-}
-
-bool AutoBackLight::isAutoBacklightOn()
-{
- return mAutoBacklight_OnOff_Flag;
-}
-
-void AutoBackLight::updateSigState(int state)
-{
- mCur_sig_state = state;
- LOGD("updateSigState = %d", mCur_sig_state);
-}
-
-void AutoBackLight::startAutoBacklight( tv_source_input_type_t source_type )
-{
- mAutoBacklightSource = source_type;
- mCur_source_default_backlight = myVpp->Tv_GetBacklight(source_type);
- mCurrent_backlight = mCur_source_default_backlight;
- myVpp->Tv_SetBacklight(mCur_source_default_backlight, source_type, 1);
-
- /*
- mDefault_auto_bl_value = def_source_bl_value;
- dynamicGamma = mDefault_auto_bl_value * mCur_source_default_backlight / 100;
- // this if should not happen
- if (dynamicGamma > mCur_source_default_backlight) {
- dynamicGamma = mCur_source_default_backlight;
- }
- */
-
- if (!mAutoBacklight_OnOff_Flag) {
- mAutoBacklight_OnOff_Flag = true;
- this->run();
- }
-}
-
-void AutoBackLight::stopAutoBacklight()
-{
- if (mAutoBacklight_OnOff_Flag) {
- mAutoBacklight_OnOff_Flag = false;
- myVpp->Tv_SetBacklight(mCur_source_default_backlight, mAutoBacklightSource, 1);
- }
-}
-
-/**
- * @ description: tpv project
- * @ return:value
- * value <= 20: mCur_dest_backlight is 14
- * 20 < value <= 160: mCur_dest_backlight is 57
- *160 < value: mCur_dest_backlight is 100
- */
-void AutoBackLight::adjustDstBacklight()
-{
- if (mCur_sig_state == SIG_STATE_STABLE) {
- //the node is used to adjust current ts is static or dynamtic frame
- char temp_str = 0;
- int fd = open("/sys/module/di/parameters/frame_dynamic", O_RDWR);
- if (fd <= 0) {
- LOGE("open /sys/module/di/parameters/frame_dynamic ERROR!!\n");
- return;
- }
-
- if (read(fd, &temp_str, 1) > 0) {
-
- if (temp_str == 'N') {
- mCurrent_backlight = mCur_dest_backlight = mCur_source_default_backlight;
- myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0);
- } else if (temp_str == 'Y') {
- int pwm = HistogramGet_AVE();
- if (pwm <= 20) {
- mCur_dest_backlight = 14;
- } else if (pwm > 20 && pwm <= 160) {
- mCur_dest_backlight = 57;
- } else {
- mCur_dest_backlight = 100;
- }
- //LOGD("pwm = %d, mCur_dest_backlight = %d", pwm, mCur_dest_backlight);
- }
- }
- close(fd);
- } else {
- mCurrent_backlight = mCur_dest_backlight = mCur_source_default_backlight;
- myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0);
- }
-
- /*
- if (pwm > 0)
- pwm_max = pwm;
- else
- pwm_min = pwm;
- pwm = 255 - pwm;
- int average = (pwm_min + pwm_max) / 2;
- dynamicGammaOffset = (pwm - average) / 10;
- dynamicGammaOffset = dynamicGammaOffset * mDefault_auto_bl_value / 100;
-
- //the node is used to adjust current ts is static or dynamtic frame
- char temp_str = 0;
- int fd = open("/sys/module/di/parameters/frame_dynamic", O_RDWR);
- if (fd <= 0) {
- LOGE("open /sys/module/di/parameters/frame_dynamic ERROR!!\n");
- return;
- }
-
- if (read(fd, &temp_str, 1) > 0) {
- if (temp_str== 'N') {
- mCur_dest_backlight = mCur_source_default_backlight;
- }
- else if (temp_str == 'Y') {
- mCur_dest_backlight = dynamicGamma + dynamicGammaOffset;
-
- if (mCur_dest_backlight > mCur_source_default_backlight) {
- mCur_dest_backlight = mCur_source_default_backlight;
- }
- else if (mCur_dest_backlight < 0) {
- mCur_dest_backlight = 0;
- }
- }
- }
- close(fd);
- */
-}
-
-void AutoBackLight::adjustBacklight()
-{
- if (mCurrent_backlight == mCur_dest_backlight) {
- return;
- } else if ((mCurrent_backlight - mCur_dest_backlight) > -2 && (mCurrent_backlight - mCur_dest_backlight) < 2) {
- mCurrent_backlight = mCur_dest_backlight;
- myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0);
- } else if (mCurrent_backlight < mCur_dest_backlight) {
- mCurrent_backlight = mCurrent_backlight + 2;
- myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0);
- } else if (mCurrent_backlight > mCur_dest_backlight) {
- mCurrent_backlight = mCurrent_backlight - 2;
- myVpp->Tv_SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0);
- }
-
- //LOGD("mCurrent_backlight = %d", mCurrent_backlight);
-}
-
-/**
- * @ description: get current picture's average brightness
- * @ return: 0~255,0 is darkest,255 is brightest
- */
-int AutoBackLight::HistogramGet_AVE()
-{
- int hist_ave = 0;
- tvin_parm_t vdinParam;
- if (0 == myTvin->VDIN_GetVdinParam(&vdinParam)) {
- if(vdinParam.pixel_sum != 0) {
- hist_ave = vdinParam.luma_sum / vdinParam.pixel_sum;
- LOGD("[hist_ave][%d].", hist_ave);
- return hist_ave;
- }
- LOGE("vdinParam.pixel_sum is zero, so the value is infinity\n");
- return -1;
- }
- LOGE("VDIN_GetVdinParam get data error!!!\n");
- return -1;
-}
-
-bool AutoBackLight::threadLoop()
-{
- int sleeptime = 50;//ms
- int adjustBacklightCount = 0;
- while ( mAutoBacklight_OnOff_Flag ) {
- usleep ( sleeptime * 1000 );
- adjustBacklightCount++;
- if (adjustBacklightCount == 24) {
- adjustBacklightCount = 0;
- adjustDstBacklight();
- }
- adjustBacklight();
- }
-
- return false;//return true, run again, return false,not run.
-}
+#include "AutoBackLight.h"
+#include "../tvsetting/CTvSetting.h"
+#include "../tvconfig/tvconfig.h"
+#include "../tvutils/tvutils.h"
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+#include <dlfcn.h>
+#include <linux/fb.h>
+#include <stdlib.h>
+#include <cutils/properties.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "AutoBackLight"
+#endif
+
+AutoBackLight::AutoBackLight( CVpp *mVpp, CTvin *pTvin )
+{
+ mAutoBacklightSource = SOURCE_TYPE_TV;
+ myVpp = mVpp;
+ myTvin = pTvin;
+ mCur_source_default_backlight = 100;
+ mCur_sig_state == SIG_STATE_NOSIG;
+ mAutoBacklight_OnOff_Flag = false;
+ mCurrent_backlight = 100;
+ mCur_dest_backlight = 100;
+}
+
+AutoBackLight::~AutoBackLight()
+{
+ mAutoBacklight_OnOff_Flag = false;
+}
+
+bool AutoBackLight::isAutoBacklightOn()
+{
+ return mAutoBacklight_OnOff_Flag;
+}
+
+void AutoBackLight::updateSigState(int state)
+{
+ mCur_sig_state = state;
+ LOGD("updateSigState = %d", mCur_sig_state);
+}
+
+void AutoBackLight::startAutoBacklight( tv_source_input_type_t source_type )
+{
+ mAutoBacklightSource = source_type;
+ mCur_source_default_backlight = myVpp->GetBacklight(source_type);
+ mCurrent_backlight = mCur_source_default_backlight;
+ myVpp->SetBacklight(mCur_source_default_backlight, source_type, 1);
+
+ /*
+ mDefault_auto_bl_value = def_source_bl_value;
+ dynamicGamma = mDefault_auto_bl_value * mCur_source_default_backlight / 100;
+ // this if should not happen
+ if (dynamicGamma > mCur_source_default_backlight) {
+ dynamicGamma = mCur_source_default_backlight;
+ }
+ */
+
+ if (!mAutoBacklight_OnOff_Flag) {
+ mAutoBacklight_OnOff_Flag = true;
+ this->run();
+ }
+}
+
+void AutoBackLight::stopAutoBacklight()
+{
+ if (mAutoBacklight_OnOff_Flag) {
+ mAutoBacklight_OnOff_Flag = false;
+ myVpp->SetBacklight(mCur_source_default_backlight, mAutoBacklightSource, 1);
+ }
+}
+
+/**
+ * @ description: tpv project
+ * @ return:value
+ * value <= 20: mCur_dest_backlight is 14
+ * 20 < value <= 160: mCur_dest_backlight is 57
+ *160 < value: mCur_dest_backlight is 100
+ */
+void AutoBackLight::adjustDstBacklight()
+{
+ if (mCur_sig_state == SIG_STATE_STABLE) {
+ //the node is used to adjust current ts is static or dynamtic frame
+ char temp_str = 0;
+ int fd = open("/sys/module/di/parameters/frame_dynamic", O_RDWR);
+ if (fd <= 0) {
+ LOGE("open /sys/module/di/parameters/frame_dynamic ERROR!!\n");
+ return;
+ }
+
+ if (read(fd, &temp_str, 1) > 0) {
+
+ if (temp_str == 'N') {
+ mCur_dest_backlight = mCur_source_default_backlight;
+ } else if (temp_str == 'Y') {
+ int pwm = HistogramGet_AVE();
+ if (pwm <= 20) {
+ mCur_dest_backlight = 14;
+ } else if (pwm > 20 && pwm <= 160) {
+ mCur_dest_backlight = 57;
+ } else {
+ mCur_dest_backlight = 100;
+ }
+ //LOGD("pwm = %d, mCur_dest_backlight = %d", pwm, mCur_dest_backlight);
+ }
+ }
+ close(fd);
+ } else {
+ mCurrent_backlight = mCur_dest_backlight = mCur_source_default_backlight;
+ myVpp->SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0);
+ }
+
+ /*
+ if (pwm > 0)
+ pwm_max = pwm;
+ else
+ pwm_min = pwm;
+ pwm = 255 - pwm;
+ int average = (pwm_min + pwm_max) / 2;
+ dynamicGammaOffset = (pwm - average) / 10;
+ dynamicGammaOffset = dynamicGammaOffset * mDefault_auto_bl_value / 100;
+
+ //the node is used to adjust current ts is static or dynamtic frame
+ char temp_str = 0;
+ int fd = open("/sys/module/di/parameters/frame_dynamic", O_RDWR);
+ if (fd <= 0) {
+ LOGE("open /sys/module/di/parameters/frame_dynamic ERROR!!\n");
+ return;
+ }
+
+ if (read(fd, &temp_str, 1) > 0) {
+ if (temp_str== 'N') {
+ mCur_dest_backlight = mCur_source_default_backlight;
+ }
+ else if (temp_str == 'Y') {
+ mCur_dest_backlight = dynamicGamma + dynamicGammaOffset;
+
+ if (mCur_dest_backlight > mCur_source_default_backlight) {
+ mCur_dest_backlight = mCur_source_default_backlight;
+ }
+ else if (mCur_dest_backlight < 0) {
+ mCur_dest_backlight = 0;
+ }
+ }
+ }
+ close(fd);
+ */
+}
+
+void AutoBackLight::adjustBacklight()
+{
+ if (mCurrent_backlight == mCur_dest_backlight) {
+ return;
+ } else if ((mCurrent_backlight - mCur_dest_backlight) > -2 && (mCurrent_backlight - mCur_dest_backlight) < 2) {
+ mCurrent_backlight = mCur_dest_backlight;
+ myVpp->SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0);
+ } else if (mCurrent_backlight < mCur_dest_backlight) {
+ mCurrent_backlight = mCurrent_backlight + 2;
+ myVpp->SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0);
+ } else if (mCurrent_backlight > mCur_dest_backlight) {
+ mCurrent_backlight = mCurrent_backlight - 2;
+ myVpp->SetBacklight(mCurrent_backlight, mAutoBacklightSource, 0);
+ }
+
+ //LOGD("mCurrent_backlight = %d", mCurrent_backlight);
+}
+
+/**
+ * @ description: get current picture's average brightness
+ * @ return: 0~255,0 is darkest,255 is brightest
+ */
+int AutoBackLight::HistogramGet_AVE()
+{
+ int hist_ave = 0;
+ tvin_parm_t vdinParam;
+ if (0 == myTvin->VDIN_GetVdinParam(&vdinParam)) {
+ if (vdinParam.pixel_sum != 0) {
+ hist_ave = vdinParam.luma_sum / vdinParam.pixel_sum;
+ LOGD("[hist_ave][%d].", hist_ave);
+ return hist_ave;
+ }
+ LOGE("vdinParam.pixel_sum is zero, so the value is infinity\n");
+ return -1;
+ }
+ LOGE("VDIN_GetVdinParam get data error!!!\n");
+ return -1;
+}
+
+bool AutoBackLight::threadLoop()
+{
+ int sleeptime = 50;//ms
+ int adjustBacklightCount = 0;
+ while ( mAutoBacklight_OnOff_Flag ) {
+ usleep ( sleeptime * 1000 );
+ adjustBacklightCount++;
+ if (adjustBacklightCount == 24) {
+ adjustBacklightCount = 0;
+ adjustDstBacklight();
+ }
+ adjustBacklight();
+ }
+
+ return false;//return true, run again, return false,not run.
+}
diff --git a/tvapi/libtv/tv/CAutoPQparam.cpp b/tvapi/libtv/tv/CAutoPQparam.cpp
new file mode 100644
index 0000000..2737c0d
--- a/dev/null
+++ b/tvapi/libtv/tv/CAutoPQparam.cpp
@@ -0,0 +1,150 @@
+#include "CAutoPQparam.h"
+#include "../tvsetting/CTvSetting.h"
+#include "../tvconfig/tvconfig.h"
+#include "../tvutils/tvutils.h"
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+#include <dlfcn.h>
+#include <linux/fb.h>
+#include <stdlib.h>
+#include <cutils/properties.h>
+
+#include <xxxconfig.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "CAutoPQ"
+#endif
+
+CAutoPQparam::CAutoPQparam( CVpp *mVpp, CTvin *pTvin, CAv *mAv)
+{
+ myVpp = mVpp;
+ myTvin = pTvin;
+ myAv = mAv;
+ preFmtType = 0;
+ curFmtType = 0;
+ autofreq_checkcount = 0;
+ autofreq_checkflag = 0;
+ mAutoPQ_OnOff_Flag = false;
+}
+
+CAutoPQparam::~CAutoPQparam()
+{
+ mAutoPQ_OnOff_Flag = false;
+}
+
+bool CAutoPQparam::isAutoPQing()
+{
+ return mAutoPQ_OnOff_Flag;
+}
+
+void CAutoPQparam::startAutoPQ( tv_source_input_type_t source_type )
+{
+#ifndef CC_PROJECT_DISABLE_AUTO_PQ
+ mAutoPQSource = source_type;
+
+ LOGD("---------startAutoPQParameters --------mAutoPQ_OnOff_Flag = %d", mAutoPQ_OnOff_Flag);
+ if (!mAutoPQ_OnOff_Flag) {
+ mAutoPQ_OnOff_Flag = true;
+ this->run();
+ }
+#else
+ LOGD("AutoPQparam disable.\n");
+#endif
+}
+
+void CAutoPQparam::stopAutoPQ()
+{
+#ifndef CC_PROJECT_DISABLE_AUTO_PQ
+ LOGD("---------stopAutoPQParameters -------- mAutoPQ_OnOff_Flag = %d", mAutoPQ_OnOff_Flag);
+ if (mAutoPQ_OnOff_Flag) {
+ mAutoPQ_OnOff_Flag = false;
+ }
+#else
+ LOGD("AutoPQparam disable.\n");
+#endif
+}
+
+/**
+TVIN_SIG_FMT_HDMI_720X480P_60HZ = 0x402 nodeVal<900
+TVIN_SIG_FMT_HDMI_1920X1080P_60HZ = 0x40a 900<nodeVal<2000
+TVIN_SIG_FMT_HDMI_3840_2160_00HZ = 0x445 nodeVal>2000
+*/
+int CAutoPQparam::adjustPQparameters()
+{
+ int fd = -1;
+ int nodeVal = 0, ret = 0;
+ int new_frame_count = 0;
+ float frame_rate = 0;
+ float frame_rate_ave = 0;
+ char s[21];
+ char str[10];
+ tvin_sig_fmt_e sig_fmt;
+ is_3d_type_t _3d_type = INDEX_2D;
+ tvin_trans_fmt trans_fmt = TVIN_TFMT_2D;
+
+ fd = open("/sys/module/amvideo/parameters/new_frame_count", O_RDONLY);
+ if (fd <= 0) {
+ LOGE("open /sys/module/amvideo/parameters/new_frame_count ERROR!!error = -%s- \n", strerror ( errno ));
+ return -1;
+ }
+ memset(s, 0, sizeof(s));
+ read(fd, s, sizeof(s));
+ close(fd);
+ new_frame_count = atoi(s);
+
+ if (new_frame_count != 0) {
+
+ fd = open("/sys/class/video/frame_height", O_RDONLY);
+ if (fd <= 0) {
+ LOGE("open /sys/class/video/frame_height ERROR!!error = -%s- \n", strerror ( errno ));
+ return -1;
+ }
+ memset(s, 0, sizeof(s));
+ read(fd, s, sizeof(s));
+ close(fd);
+ nodeVal = atoi(s);
+
+ if (nodeVal <= 576) {
+ curFmtType = 1;
+ sig_fmt = TVIN_SIG_FMT_HDMI_720X480P_60HZ;
+ } else if (nodeVal > 567 && nodeVal <= 1088) {
+ curFmtType = 2;
+ sig_fmt = TVIN_SIG_FMT_HDMI_1920X1080P_60HZ;
+ } else {
+ curFmtType = 3;
+ sig_fmt = TVIN_SIG_FMT_HDMI_3840_2160_00HZ;
+ }
+
+ if (curFmtType != preFmtType) {
+ LOGD("adjustPQparameters: nodeVal = %d, sig_fmt = %d.", nodeVal, sig_fmt);
+ ret = myVpp->LoadVppSettings (mAutoPQSource, sig_fmt, _3d_type, trans_fmt);
+ }
+
+ preFmtType = curFmtType;
+
+ } else {
+ if (preFmtType != 0 || curFmtType != 0) {
+ preFmtType = 0;
+ curFmtType = 0;
+ }
+ }
+ return ret;
+}
+
+bool CAutoPQparam::threadLoop()
+{
+ int sleeptime = 1000;//ms
+ while ( mAutoPQ_OnOff_Flag ) {
+ usleep ( sleeptime * 1000 );
+ adjustPQparameters();
+ }
+
+ return false;//return true, run again, return false,not run.
+}
diff --git a/tvapi/libtv/tv/CAutoPQparam.h b/tvapi/libtv/tv/CAutoPQparam.h
new file mode 100644
index 0000000..323694f
--- a/dev/null
+++ b/tvapi/libtv/tv/CAutoPQparam.h
@@ -0,0 +1,41 @@
+//
+//
+// amlogic 2015
+//
+// @ Project : tv
+// @ File Name :
+// @ Date : 2015 -9
+// @ Author : hao.fu
+//
+//
+
+
+#if !defined(_CAUTOPQPARAM_H)
+#define _CAUTOPQPARAM_H
+#include "CAv.h"
+#include "../tvin/CTvin.h"
+#include "../tvutils/CThread.h"
+#include "../vpp/CVpp.h"
+#include "../tvconfig/tvconfig.h"
+
+class CAutoPQparam: public CThread {
+private:
+ tv_source_input_type_t mAutoPQSource;
+ bool mAutoPQ_OnOff_Flag;
+ int preFmtType, curFmtType, autofreq_checkcount, autofreq_checkflag;
+ int adjustPQparameters();
+ bool threadLoop();
+
+public:
+
+ CVpp *myVpp;
+ CTvin *myTvin;
+ CAv *myAv;
+
+ CAutoPQparam( CVpp *mVpp, CTvin *pTvin, CAv *mAV );
+ ~CAutoPQparam();
+ void startAutoPQ( tv_source_input_type_t source_type );
+ void stopAutoPQ();
+ bool isAutoPQing();
+};
+#endif
diff --git a/tvapi/libtv/tv/CAv.cpp b/tvapi/libtv/tv/CAv.cpp
index 20e1c31..655b281 100644
--- a/tvapi/libtv/tv/CAv.cpp
+++ b/tvapi/libtv/tv/CAv.cpp
@@ -1,6 +1,7 @@
#include "CAv.h"
#define LOG_TAG "CAv"
#include "../tvutils/tvutils.h"
+#include "../tvconfig/tvconfig.h"
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
@@ -64,7 +65,7 @@ int CAv::Close()
int iRet;
iRet = AM_AV_Close ( mTvPlayDevId );
iRet = AM_AOUT_Close ( mTvPlayDevId );
- if(mFdAmVideo > 0) {
+ if (mFdAmVideo > 0) {
close(mFdAmVideo);
mFdAmVideo = -1;
}
@@ -125,7 +126,7 @@ int CAv::DisableVideoBlackout()
int CAv::DisableVideoWithBlueColor()
{
LOGD("DisableVideoWithBlueColor");
- if(mCurVideoLayerMuteState == 1 && mCurDisableVideoColor == DISABLE_VIDEO_COLOR_BLUE) {
+ if (mCurVideoLayerMuteState == 1 && mCurDisableVideoColor == DISABLE_VIDEO_COLOR_BLUE) {
LOGD("video is disable with blue, return");
return 0;
}
@@ -138,7 +139,7 @@ int CAv::DisableVideoWithBlueColor()
int CAv::DisableVideoWithBlackColor()
{
LOGD("DisableVideoWithBlackColor");
- if(mCurVideoLayerMuteState == 1 && mCurDisableVideoColor == DISABLE_VIDEO_COLOR_BLACK) {
+ if (mCurVideoLayerMuteState == 1 && mCurDisableVideoColor == DISABLE_VIDEO_COLOR_BLACK) {
LOGD("video is disable with black, return");
return 0;
}
@@ -151,28 +152,106 @@ int CAv::DisableVideoWithBlackColor()
int CAv::EnableVideoAuto()
{
LOGD("EnableVideo");
- if(mCurVideoLayerMuteState == 0) {
+ if (mCurVideoLayerMuteState == 0) {
LOGD("video is enable, return");
return 0;
}
mCurVideoLayerMuteState = 0;
SetVideoScreenColor ( 0, 16, 128, 128 ); // Show black with vdin0, postblending disabled
- return ClearVideoBuffer();//disable video 2
+ ClearVideoBuffer();//disable video 2
+ return 0;
}
//just enable video
int CAv::EnableVideoNow()
{
LOGD("EnableVideoNow");
- if(mCurVideoLayerMuteState == 0) {
+ const char *config_value = NULL;
+ if (mCurVideoLayerMuteState == 0) {
LOGD("video is enable, return");
return 0;
}
mCurVideoLayerMuteState = 0;
- SetVideoScreenColor ( 3, 16, 128, 128 ); // Show blue with vdin0, postblending disabled
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ } else {
+ SetVideoScreenColor ( 0, 16, 128, 128 ); // Show blue with vdin0, postblending disabled
+ }
return AM_AV_EnableVideo(mTvPlayDevId);
}
+int CAv::WaittingVideoPlaying(int minFrameCount , int waitTime )
+{
+ //EnableVideoNow();
+ static const int COUNT_FOR_TIME = 20;
+ int times = waitTime / COUNT_FOR_TIME;
+ int ret = -1;
+ int i = 0;
+ for (i = 0; i < times; i++) {
+ if (videoIsPlaying(minFrameCount)) {
+ ret = 0;
+ break;
+ }
+ }
+ if (i == times) {
+ LOGD("EnableVideoWhenVideoPlaying time out!!!!!!!!!!!!!");
+ ret = -2;
+ }
+ return ret;
+}
+
+int CAv::EnableVideoWhenVideoPlaying(int minFrameCount, int waitTime)
+{
+ int ret = WaittingVideoPlaying(minFrameCount, waitTime);
+ if (ret == 0) { //ok to playing
+ EnableVideoNow();
+ }
+ return ret;
+}
+
+bool CAv::videoIsPlaying(int minFrameCount)
+{
+ int value[3];
+ value[0] = getVideoFrameCount();
+ usleep(20 * 1000);
+ value[1] = getVideoFrameCount();
+ //usleep(20*1000);
+ //value[2] = getVideoFrameCount();
+ LOGD("---videoIsPlaying framecount =%d = %d = %d", value[0], value[1], value[2]);
+ if (value[1] >= minFrameCount && (value[1] > value[0])) return true;
+ else return false;
+}
+
+int CAv::getVideoFrameCount()
+{
+ char buf[32];
+ int fd = -1;
+ fd = open(PATH_FRAME_COUNT, O_RDWR);
+ if (fd < 0) {
+ LOGW("Open %s error(%s)!\n", PATH_FRAME_COUNT, strerror(errno));
+ return -1;
+ }
+ read(fd, buf, sizeof(buf));
+ int value = 0;
+ sscanf ( buf, "%d", &value );
+ close ( fd );
+ return value;
+}
+
+tvin_sig_fmt_t CAv::getVideoResolutionToFmt()
+{
+ tvin_sig_fmt_e sig_fmt = TVIN_SIG_FMT_HDMI_1920X1080P_60HZ;
+ int height = CFile::getFileAttrValue(PATH_VIDEO_HEIGHT);
+ LOGD("---------getVideoResolutionToFmt -------- height = %d", height);
+ if (height <= 576) {
+ sig_fmt = TVIN_SIG_FMT_HDMI_720X480P_60HZ;
+ } else if (height >576 && height <= 1088) {
+ sig_fmt = TVIN_SIG_FMT_HDMI_1920X1080P_60HZ;
+ } else {
+ sig_fmt = TVIN_SIG_FMT_HDMI_3840_2160_00HZ;
+ }
+ return sig_fmt;
+}
//call disable video 2
int CAv::ClearVideoBuffer()
{
@@ -337,7 +416,7 @@ void CAv::av_evt_callback ( long dev_no, int event_type, void *param, void *user
int CAv::set3DMode(VIDEO_3D_MODE_T mode, int LR_switch, int mode_3D_TO_2D)
{
unsigned int cmd = MODE_3D_DISABLE;
- switch(mode) {
+ switch (mode) {
case VIDEO_3D_MODE_DISABLE:
cmd = MODE_3D_DISABLE;
break;
@@ -361,21 +440,34 @@ int CAv::set3DMode(VIDEO_3D_MODE_T mode, int LR_switch, int mode_3D_TO_2D)
break;
}
- if(LR_switch == 1) {
+ if (LR_switch == 1) {
cmd = cmd | MODE_3D_LR_SWITCH;
}
- if(mode_3D_TO_2D == 1) {
+ if (mode_3D_TO_2D == 1) {
cmd = cmd | MODE_3D_TO_2D_L;
}
- if(mode_3D_TO_2D == 2) {
+ if (mode_3D_TO_2D == 2) {
cmd = cmd | MODE_3D_TO_2D_R;
}
LOGD("set 3d mode fd = %d cmd = 0x%x", mFdAmVideo, cmd);
int ret = ioctl(mFdAmVideo, AMSTREAM_IOC_SET_3D_TYPE , cmd);
- if(ret < 0) {
+ if (ret < 0) {
LOGE("set3DMode error ( %s )", strerror ( errno ));
}
return 0;
}
+
+int CAv::setLookupPtsForDtmb(int enable)
+{
+ FILE *fp = fopen ( PATH_MEPG_DTMB_LOOKUP_PTS_FLAG, "w" );
+ LOGD ( "setLookupPtsForDtmb %d ##" , enable);
+ if ( fp == NULL ) {
+ LOGE ( "Open %s error(%s)!\n", PATH_MEPG_DTMB_LOOKUP_PTS_FLAG, strerror ( errno ) );
+ return -1;
+ }
+ fprintf ( fp, "%d", enable );
+ fclose ( fp );
+ return 0;
+}
diff --git a/tvapi/libtv/tv/CAv.h b/tvapi/libtv/tv/CAv.h
index e394e49..04a3cc9 100644
--- a/tvapi/libtv/tv/CAv.h
+++ b/tvapi/libtv/tv/CAv.h
@@ -4,6 +4,7 @@
#include "am_aout.h"
#include "CTvEv.h"
#include "CTvLog.h"
+#include "../tvin/CTvin.h"
static const char *PATH_FRAME_COUNT = "/sys/module/di/parameters/frame_count";
//3D=====================================================================
static const char *PATH_SET_3D_TYPE = "/sys/class/video/threedim_mode";
@@ -13,6 +14,8 @@ static const char *PATH_3D_SCALER = "/sys/module/amvideo/parameters/force_3d_sca
//0是ä¸åš3dscaler 1是åš3dscaler
static const char *PATH_VIDEO_SCALER = "/sys/class/video/stereo_scaler";
+static const char *PATH_MEPG_DTMB_LOOKUP_PTS_FLAG = "/sys/module/amvdec_mpeg12/parameters/dtmb_flag";
+static const char *PATH_VIDEO_HEIGHT = "/sys/class/video/frame_height";
/*cmd use for 3d operation*/
#define MODE_3D_DISABLE 0x00000000
#define MODE_3D_ENABLE 0x00000001
@@ -24,17 +27,17 @@ static const char *PATH_VIDEO_SCALER = "/sys/class/video/stereo_scaler";
#define MODE_3D_LR_SWITCH 0x00000100
#define MODE_3D_TO_2D_L 0x00000200
#define MODE_3D_TO_2D_R 0x00000400
-#define MODE_3D_MVC 0x00000800
-#define MODE_3D_OUT_TB 0x00010000
-#define MODE_3D_OUT_LR 0x00020000
+#define MODE_3D_MVC 0x00000800
+#define MODE_3D_OUT_TB 0x00010000
+#define MODE_3D_OUT_LR 0x00020000
/*when the output mode is field alterlative*/
//LRLRLRLRL mode
-#define MODE_3D_OUT_FA_L_FIRST 0x00001000
-#define MODE_3D_OUT_FA_R_FIRST 0x00002000
+#define MODE_3D_OUT_FA_L_FIRST 0x00001000
+#define MODE_3D_OUT_FA_R_FIRST 0x00002000
//LBRBLBRB
#define MODE_3D_OUT_FA_LB_FIRST 0x00004000
-#define MODE_3D_OUT_FA_RB_FIRST 0x00008000
+#define MODE_3D_OUT_FA_RB_FIRST 0x00008000
typedef enum VIDEO_3D_MODE_E {
@@ -78,8 +81,7 @@ public:
};
~AVEvent()
- {
- };
+ {};
static const int EVENT_AV_STOP = 1;
static const int EVENT_AV_RESUEM = 2;
static const int EVENT_AV_SCAMBLED = 3;
@@ -121,11 +123,14 @@ public:
int DisableVideoWithBlackColor();
int EnableVideoAuto();
int EnableVideoNow();
+ int EnableVideoWhenVideoPlaying(int minFrameCount = 8, int waitTime = 5000);
+ int WaittingVideoPlaying(int minFrameCount = 8, int waitTime = 5000);
int EnableVideoBlackout();
int DisableVideoBlackout();
int getVideoDisableValue();
int SetVideoLayerDisable ( int value );
int ClearVideoBuffer();
+ bool videoIsPlaying(int minFrameCount = 8);
int setVideoScreenMode ( int value );
int getVideoScreenMode();
int setVideoAxis ( int h, int v, int width, int height );
@@ -133,8 +138,11 @@ public:
//LR_switch: 1 is enable, 3D_TO_2D:1 is L , 2 is R
int set3DMode(VIDEO_3D_MODE_T mode, int LR_switch, int mode_3D_TO_2D);
//
+ int setLookupPtsForDtmb(int enable);
+ tvin_sig_fmt_t getVideoResolutionToFmt();
private:
static void av_evt_callback ( long dev_no, int event_type, void *param, void *user_data );
+ int getVideoFrameCount();
int mTvPlayDevId;
IObserver *mpObserver;
AVEvent mCurAvEvent;
diff --git a/tvapi/libtv/tv/CFbcCommunication.cpp b/tvapi/libtv/tv/CFbcCommunication.cpp
index 08bc0e3..cf63278 100644
--- a/tvapi/libtv/tv/CFbcCommunication.cpp
+++ b/tvapi/libtv/tv/CFbcCommunication.cpp
@@ -8,17 +8,13 @@
static CFbcCommunication *gSingletonFBC = NULL;
CFbcCommunication *GetSingletonFBC()
{
- if (GetPlatformHaveFBCFlag() == 1) {
- if (gSingletonFBC == NULL) {
- gSingletonFBC = new CFbcCommunication();
- gSingletonFBC->start();
- }
-
- return gSingletonFBC;
+ if (gSingletonFBC == NULL) {
+ gSingletonFBC = new CFbcCommunication();
+ gSingletonFBC->start();
}
- LOGE("%s, the platform has no fbc!!!\n", __FUNCTION__);
- return NULL;
+ return gSingletonFBC;
+
}
CFbcCommunication::CFbcCommunication()
@@ -61,7 +57,7 @@ int CFbcCommunication::start()
#endif
}
- if(mEpoll.create() < 0) {
+ if (mEpoll.create() < 0) {
return -1;
}
@@ -109,7 +105,7 @@ void CFbcCommunication::testUart()
sleep(1);
//LOGD("to read........\n");
mSerialPort.readFile(read_buf, 12);
- for(idx = 0; idx < 12; idx++)
+ for (idx = 0; idx < 12; idx++)
LOGD("the data is:0x%x\n", read_buf[idx]);
LOGD("end....\n");
}
@@ -118,23 +114,23 @@ void CFbcCommunication::showTime(struct timeval *_time)
{
struct timeval curTime;
- if(_time == NULL) {
+ if (_time == NULL) {
gettimeofday(&curTime, NULL);
} else {
curTime.tv_sec = _time->tv_sec;
curTime.tv_usec = _time->tv_usec;
}
- if(curTime.tv_usec > 100000) {
+ if (curTime.tv_usec > 100000) {
LOGD("[%d.%d]", curTime.tv_sec, curTime.tv_usec);
- } else if(curTime.tv_usec > 10000) {
+ } else if (curTime.tv_usec > 10000) {
LOGD("[%d.0%d]", curTime.tv_sec, curTime.tv_usec);
- } else if(curTime.tv_usec > 1000) {
+ } else if (curTime.tv_usec > 1000) {
LOGD("[%d.00%d]", curTime.tv_sec, curTime.tv_usec);
- } else if(curTime.tv_usec > 100) {
+ } else if (curTime.tv_usec > 100) {
LOGD("[%d.000%d]", curTime.tv_sec, curTime.tv_usec);
- } else if(curTime.tv_usec > 10) {
+ } else if (curTime.tv_usec > 10) {
LOGD("[%d.0000%d]", curTime.tv_sec, curTime.tv_usec);
- } else if(curTime.tv_usec > 1) {
+ } else if (curTime.tv_usec > 1) {
LOGD("[%d.00000%d]", curTime.tv_sec, curTime.tv_usec);
}
}
@@ -171,7 +167,7 @@ void CFbcCommunication::sendAckCmd(bool isOk)
ackcmd[3] = 0x00;
ackcmd[4] = 0x80;//ack flag
ackcmd[5] = 0xff;//cmd id
- if(isOk) {
+ if (isOk) {
ackcmd[6] = 0xfe;
ackcmd[7] = 0x7f;
} else {
@@ -195,7 +191,7 @@ unsigned int CFbcCommunication::GetCrc32(unsigned char *InStr, unsigned int len)
{
//开始计算CRC32校验便
unsigned int Crc = 0xffffffff;
- for(int i = 0; i < len; i++) {
+ for (int i = 0; i < len; i++) {
Crc = (Crc >> 8) ^ mCrc32Table[(Crc & 0xFF) ^ InStr[i]];
}
@@ -209,7 +205,7 @@ unsigned int CFbcCommunication::Calcrc32(unsigned int crc, const unsigned char *
0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
};
unsigned int crcu32 = crc;
- if(buf_len < 0)
+ if (buf_len < 0)
return 0;
if (!ptr) return 0;
crcu32 = ~crcu32;
@@ -224,7 +220,7 @@ unsigned int CFbcCommunication::Calcrc32(unsigned int crc, const unsigned char *
int CFbcCommunication::sendDataOneway(int devno, unsigned char *pData, int dataLen, int flags)
{
int ret = -1;
- switch(devno) {
+ switch (devno) {
case COMM_DEV_CEC: {
ret = mHdmiCec.writeFile(pData, dataLen);
break;
@@ -252,7 +248,7 @@ int CFbcCommunication::addToRequestList()
int CFbcCommunication::sendDataAndWaitReply(int devno, int waitForDevno, int waitForCmd, unsigned char *pData, int dataLen, int timeout, unsigned char *pReData, int *reDataLen, int flags)
{
int ret = sendDataOneway(devno, pData, dataLen, flags);
- if(ret < 0) return ret;
+ if (ret < 0) return ret;
mReplyList.WaitDevNo = waitForDevno;
mReplyList.WaitCmd = waitForCmd;
@@ -268,7 +264,7 @@ int CFbcCommunication::sendDataAndWaitReply(int devno, int waitForDevno, int wai
mLock.unlock();
//
- if(mReplyList.reDataLen > 0) { //data have come in
+ if (mReplyList.reDataLen > 0) { //data have come in
*reDataLen = mReplyList.reDataLen;
memcpy(pReData, mReplyList.replyData, mReplyList.reDataLen);
mReplyList.reDataLen = 0;
@@ -302,14 +298,14 @@ int CFbcCommunication::handleCmd(COMM_DEV_TYPE_E fromDev, int *pData, int *pRetV
fbc_command_t cmd_type = VPU_CMD_NULL;
int ret_value = 0;
- if((fromDev != COMM_DEV_SERIAL && fromDev != COMM_DEV_CEC) || pData == NULL || pRetValue == NULL) {
+ if ((fromDev != COMM_DEV_SERIAL && fromDev != COMM_DEV_CEC) || pData == NULL || pRetValue == NULL) {
//LOGD("para error and returned!");
return -1;
}
cmd_type = (fbc_command_t)pData[0];
LOGD("the cmd type is:0x%02x\n", cmd_type);
- switch(cmd_type) {
+ switch (cmd_type) {
case VPU_CMD_RED_GAIN_DEF:
cfbc_Set_Gain_Red(fromDev, pData[2]);
break;
@@ -352,7 +348,7 @@ int CFbcCommunication::uartReadStream(unsigned char *retData, int rd_max_len, in
readLen = mSerialPort.readFile(retData + bufIndex, rd_max_len - haveRead);
haveRead += readLen;
bufIndex += readLen;
- if(haveRead == rd_max_len) {
+ if (haveRead == rd_max_len) {
return haveRead;
}
@@ -361,7 +357,7 @@ int CFbcCommunication::uartReadStream(unsigned char *retData, int rd_max_len, in
if (((clock() - start_tm) / (CLOCKS_PER_SEC / 1000)) > timeout) {
return haveRead;
}
- } while(true);
+ } while (true);
return haveRead;
}
@@ -373,7 +369,7 @@ int CFbcCommunication::uartReadData(unsigned char *retData, int *retLen)
int bufIndex = 0;
int readLen = 0;
- if(retData == NULL) {
+ if (retData == NULL) {
LOGD("the retData is NULL\n");
return 0;
}
@@ -382,10 +378,10 @@ int CFbcCommunication::uartReadData(unsigned char *retData, int *retLen)
memset(tempBuf, 0, sizeof(tempBuf));
do {
readLen = mSerialPort.readFile(tempBuf + 0, 1);
- if(tempBuf[0] == 0x5A) {
+ if (tempBuf[0] == 0x5A) {
bufIndex = 1;
readLen = mSerialPort.readFile(tempBuf + 1, 1);
- if(tempBuf[1] == 0x5A) {
+ if (tempBuf[1] == 0x5A) {
bufIndex = 2;
LOGD("leading code coming...\n");
break;
@@ -395,7 +391,7 @@ int CFbcCommunication::uartReadData(unsigned char *retData, int *retLen)
} else {
continue;
}
- } while(true);
+ } while (true);
//data len 2 byte
int needRead = 2, haveRead = 0;
@@ -403,10 +399,10 @@ int CFbcCommunication::uartReadData(unsigned char *retData, int *retLen)
readLen = mSerialPort.readFile(tempBuf + bufIndex, needRead - haveRead);
haveRead += readLen;
bufIndex += readLen;
- if(haveRead == needRead) {
+ if (haveRead == needRead) {
break;
}
- } while(true);
+ } while (true);
//little endian
cmdLen = (tempBuf[3] << 8) + tempBuf[2];
@@ -418,16 +414,16 @@ int CFbcCommunication::uartReadData(unsigned char *retData, int *retLen)
readLen = mSerialPort.readFile(tempBuf + bufIndex, needRead - haveRead);
haveRead += readLen;
bufIndex += readLen;
- if(readLen > 0) {
+ if (readLen > 0) {
LOGD("data readLen is:%d\n", readLen);
}
- if(haveRead == needRead) {
+ if (haveRead == needRead) {
break;
}
- } while(true);
+ } while (true);
unsigned int crc = 0;
- if(cmdLen > 4) {
+ if (cmdLen > 4) {
crc = Calcrc32(0, tempBuf, cmdLen - 4);//not include crc 4byte
}
unsigned int bufCrc = tempBuf[cmdLen - 4] |
@@ -436,7 +432,7 @@ int CFbcCommunication::uartReadData(unsigned char *retData, int *retLen)
tempBuf[cmdLen - 1] << 24;
int idx = 0;
- if(crc == bufCrc) {
+ if (crc == bufCrc) {
memcpy(retData, tempBuf, cmdLen % 512);
*retLen = cmdLen;
return cmdLen;
@@ -447,19 +443,19 @@ int CFbcCommunication::uartReadData(unsigned char *retData, int *retLen)
int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData, int dataLen)
{
- switch(fromDev) {
+ switch (fromDev) {
case COMM_DEV_CEC: {
- if(mReplyList.WaitDevNo == fromDev && mReplyList.WaitCmd == pData[1]) {
+ if (mReplyList.WaitDevNo == fromDev && mReplyList.WaitCmd == pData[1]) {
mReplyList.reDataLen = dataLen;
memcpy(mReplyList.replyData, pData, dataLen);
mReplyList.WaitReplyCondition.signal();
- } else if(0) {
+ } else if (0) {
}
break;
}
case COMM_DEV_SERIAL: {
LOGD("to signal wait dataLen:0x%x, cmdId:0x%x\n", dataLen, pData[5]);
- if(mReplyList.WaitDevNo == fromDev && mReplyList.WaitCmd == pData[5]) {
+ if (mReplyList.WaitDevNo == fromDev && mReplyList.WaitCmd == pData[5]) {
mReplyList.reDataLen = dataLen;
memcpy(mReplyList.replyData, pData, dataLen);
mReplyList.WaitReplyCondition.signal();
@@ -467,7 +463,7 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
unsigned char cmd = pData[5];
//just test
const char *value;
- if(!mbSendKeyCode) {
+ if (!mbSendKeyCode) {
value = config_get_str("FBCUART", "fbc_key_event_handle", "null");
if ( strcmp ( value, "true" ) == 0 )
mbSendKeyCode = true;
@@ -477,7 +473,7 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
switch (cmd) {
case 0x14:
if (mbSendKeyCode ) {
- if(pData[6] >= 12 && pData[6] <= 16 ) { //left ---enter
+ if (pData[6] >= 12 && pData[6] <= 16 ) { //left ---enter
unsigned char key = pData[6] ;
LOGD(" key:0x%x\n", key);
@@ -487,15 +483,15 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
//14 key 105 DPAD_LEFT
//15 key 106 DPAD_RIGHT
int checkKey = 0;
- if(key == 16)
+ if (key == 16)
checkKey = 28 ;
- else if(key == 12)
+ else if (key == 12)
checkKey = 103 ;
- else if(key == 13)
+ else if (key == 13)
checkKey = 108 ;
- else if(key == 14)
+ else if (key == 14)
checkKey = 105 ;
- else if(key == 15)
+ else if (key == 15)
checkKey = 106 ;
mTvInput.sendkeyCode(checkKey);
}
@@ -515,14 +511,14 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
static int checkKey = 0, last_checkKey = 0;
- switch(pData[6]) { //different key
+ switch (pData[6]) { //different key
case 12: //DPAD_UP
st_key_up = pData[5];
- if(st_key_up == 0x1D) { //CMD_INPUT_DOWN
+ if (st_key_up == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 103;
mTvInput.sendkeyCode(checkKey);
- } else if(st_key_up == 0x1E) { //CMD_INPUT_UP
+ } else if (st_key_up == 0x1E) { //CMD_INPUT_UP
//checkKey = 103;
//mTvInput.sendkeyCode_Up(checkKey);
}
@@ -530,23 +526,37 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
case 13: //DPAD_DOWN
st_key_down = pData[5];
- if(st_key_down == 0x1D) { //CMD_INPUT_DOWN
+ if (st_key_down == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 108;
mTvInput.sendkeyCode(checkKey);
- } else if(st_key_down == 0x1E) { //CMD_INPUT_UP
+ } else if (st_key_down == 0x1E) { //CMD_INPUT_UP
//checkKey = 108;
//mTvInput.sendkeyCode_Up(checkKey);
}
break;
case 14: //DPAD_LEFT
- st_key_left = pData[5];
- if(st_key_left == 0x1D) { //CMD_INPUT_DOWN
+ st = pData[5];
+ if (st == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 105;
- mTvInput.sendkeyCode(checkKey);
- } else if(st_key_left == 0x1E) { //CMD_INPUT_UP
+ lastTime = 0;
+ mbFbcKeyEnterDown = 1;//true
+ mFbcEnterKeyDownTime = mTvInput.getNowMs();
+ mTvInput.sendKeyRepeatStart(15, 1200, 1500);//code 4, dis 3, repeatTime 2
+ } else if (st == 0x1E) { //CMD_INPUT_UP
+ checkKey = 105;
+ if (mbFbcKeyEnterDown == 1) {
+ mbFbcKeyEnterDown = 0;//false
+ mTvInput.sendKeyRepeatStop();
+ int disFbcEnterKeyDown = mTvInput.getNowMs() - mFbcEnterKeyDownTime;
+ LOGD("disFbcEnterKeyDown = %d", disFbcEnterKeyDown);
+ if (disFbcEnterKeyDown > 1200) { //long down
+ } else {
+ mTvInput.sendkeyCode(105);
+ }
+ }
//checkKey = 105;
//mTvInput.sendkeyCode_Up(checkKey);
}
@@ -554,11 +564,11 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
case 15: //DPAD_RIGHT
st_key_right = pData[5];
- if(st_key_right == 0x1D) { //CMD_INPUT_DOWN
+ if (st_key_right == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 106;
mTvInput.sendkeyCode(checkKey);
- } else if(st_key_right == 0x1E) { //CMD_INPUT_UP
+ } else if (st_key_right == 0x1E) { //CMD_INPUT_UP
//checkKey = 106;
//mTvInput.sendkeyCode_Up(checkKey);
}
@@ -566,21 +576,21 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
case 16: //DPAD_ENTER
st = pData[5];
- if(st == 0x1D) { //CMD_INPUT_DOWN
+ if (st == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 28;
lastTime = 0;
mbFbcKeyEnterDown = 1;//true
mFbcEnterKeyDownTime = mTvInput.getNowMs();
mTvInput.sendKeyRepeatStart(158, 1200, 1500);//code 4, dis 3, repeatTime 2
- } else if(st == 0x1E) { //CMD_INPUT_UP
+ } else if (st == 0x1E) { //CMD_INPUT_UP
checkKey = 28;
- if(mbFbcKeyEnterDown == 1) {
+ if (mbFbcKeyEnterDown == 1) {
mbFbcKeyEnterDown = 0;//false
mTvInput.sendKeyRepeatStop();
int disFbcEnterKeyDown = mTvInput.getNowMs() - mFbcEnterKeyDownTime;
LOGD("disFbcEnterKeyDown = %d", disFbcEnterKeyDown);
- if(disFbcEnterKeyDown > 1200) { //long down
+ if (disFbcEnterKeyDown > 1200) { //long down
} else {
mTvInput.sendkeyCode(28);
}
@@ -590,12 +600,12 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
case 20: //7key power
st_key_right = pData[5];
- if(st_key_right == 0x1D) { //CMD_INPUT_DOWN
+ if (st_key_right == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 116;
//mTvInput.sendIRkeyCode_Down(checkKey);
mTvInput.sendIRkeyCode(checkKey);
- } else if(st_key_right == 0x1E) { //CMD_INPUT_UP
+ } else if (st_key_right == 0x1E) { //CMD_INPUT_UP
checkKey = 116;
//mTvInput.sendIRkeyCode_Up(checkKey);
}
@@ -603,11 +613,11 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
case 26: //7key source
st_key_right = pData[5];
- if(st_key_right == 0x1D) { //CMD_INPUT_DOWN
+ if (st_key_right == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 466;
mTvInput.sendIRkeyCode_Down(checkKey);
- } else if(st_key_right == 0x1E) { //CMD_INPUT_UP
+ } else if (st_key_right == 0x1E) { //CMD_INPUT_UP
checkKey = 466;
mTvInput.sendIRkeyCode_Up(checkKey);
}
@@ -615,11 +625,11 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
case 27: //7key menu
st_key_right = pData[5];
- if(st_key_right == 0x1D) { //CMD_INPUT_DOWN
+ if (st_key_right == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 139;
mTvInput.sendkeyCode(checkKey);
- } else if(st_key_right == 0x1E) { //CMD_INPUT_UP
+ } else if (st_key_right == 0x1E) { //CMD_INPUT_UP
//checkKey = 139;
//mTvInput.sendkeyCode_Up(checkKey);
}
@@ -627,11 +637,11 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
case 40: //7key vol -
st_key_right = pData[5];
- if(st_key_right == 0x1D) { //CMD_INPUT_DOWN
+ if (st_key_right == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 114;
mTvInput.sendIRkeyCode_Down(checkKey);
- } else if(st_key_right == 0x1E) { //CMD_INPUT_UP
+ } else if (st_key_right == 0x1E) { //CMD_INPUT_UP
checkKey = 114;
mTvInput.sendIRkeyCode_Up(checkKey);
}
@@ -639,15 +649,88 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
case 41: //7key vol +
st_key_right = pData[5];
- if(st_key_right == 0x1D) { //CMD_INPUT_DOWN
+ if (st_key_right == 0x1D) { //CMD_INPUT_DOWN
last_checkKey = checkKey;
checkKey = 115;
mTvInput.sendIRkeyCode_Down(checkKey);
- } else if(st_key_right == 0x1E) { //CMD_INPUT_UP
+ } else if (st_key_right == 0x1E) { //CMD_INPUT_UP
checkKey = 115;
mTvInput.sendIRkeyCode_Up(checkKey);
}
break;
+ case 201: //SARADC_DPAD_UP
+ st_key_up = pData[5];
+ if (st_key_up == 0x1D) { //CMD_INPUT_DOWN
+ last_checkKey = checkKey;
+ checkKey = 950;
+ mTvInput.sendkeyCode_Down(checkKey);
+ } else if (st_key_up == 0x1E) { //CMD_INPUT_UP
+ mTvInput.sendkeyCode_Up(checkKey);
+ }
+ break;
+
+ case 202: //SARADC_DOWN
+ st_key_down = pData[5];
+ if (st_key_down == 0x1D) { //CMD_INPUT_DOWN
+ last_checkKey = checkKey;
+ checkKey = 951;
+ mTvInput.sendkeyCode_Down(checkKey);
+ } else if (st_key_down == 0x1E) { //CMD_INPUT_UP
+ mTvInput.sendkeyCode_Up(checkKey);
+ }
+ break;
+
+ case 203: //SARADC_LEFT
+ st = pData[5];
+ if (st == 0x1D) { //CMD_INPUT_DOWN
+ last_checkKey = checkKey;
+ checkKey = 952;
+ lastTime = 0;
+ mbFbcKeyEnterDown = 1;//true
+ mFbcEnterKeyDownTime = mTvInput.getNowMs();
+ mTvInput.sendkeyCode_Down(checkKey);
+ mTvInput.sendKeyRepeatStart(955, 1200, 1500);//code 4, dis 3, repeatTime 2
+ } else if (st == 0x1E) { //CMD_INPUT_UP
+ checkKey = 952;
+ if (mbFbcKeyEnterDown == 1) {
+ mbFbcKeyEnterDown = 0;//false
+ mTvInput.sendKeyRepeatStop();
+ int disFbcEnterKeyDown = mTvInput.getNowMs() - mFbcEnterKeyDownTime;
+ LOGD("disFbcEnterKeyDown = %d", disFbcEnterKeyDown);
+ if (disFbcEnterKeyDown > 1200) { //long down
+ mTvInput.sendkeyCode_Up(955);
+ mTvInput.sendkeyCode_Up(952);
+ } else {
+ mTvInput.sendkeyCode_Up(checkKey);
+ }
+ }
+ }
+ break;
+
+
+ case 204: //SARADC_RIGHT
+ st_key_right = pData[5];
+ if (st_key_right == 0x1D) { //CMD_INPUT_DOWN
+ last_checkKey = checkKey;
+ checkKey = 953;
+ mTvInput.sendkeyCode_Down(checkKey);
+ } else if (st_key_right == 0x1E) { //CMD_INPUT_UP
+ mTvInput.sendkeyCode_Up(checkKey);
+
+ }
+ break;
+
+ case 205: //SARADC_ENTER
+ st_key_right = pData[5];
+ if (st_key_right == 0x1D) { //CMD_INPUT_DOWN
+ last_checkKey = checkKey;
+ checkKey = 954;
+ mTvInput.sendkeyCode_Down(checkKey);
+ } else if (st_key_right == 0x1E) { //CMD_INPUT_UP
+ mTvInput.sendkeyCode_Up(checkKey);
+ }
+
+ break;
}
#endif
}
@@ -662,14 +745,14 @@ int CFbcCommunication::processData(COMM_DEV_TYPE_E fromDev, unsigned char *pData
bool CFbcCommunication::threadLoop()
{
unsigned char readFrameBuf[512];
- while(!exitPending()) { //requietexit() or requietexitWait() not call
- while(mUpgradeFlag == 1) {
+ while (!exitPending()) { //requietexit() or requietexitWait() not call
+ while (mUpgradeFlag == 1) {
usleep(1000 * 1000);
}
int num = mEpoll.wait();
- while(mUpgradeFlag == 1) {
+ while (mUpgradeFlag == 1) {
usleep(1000 * 1000);
}
@@ -679,7 +762,7 @@ bool CFbcCommunication::threadLoop()
* EPOLLIN event
*/
if ((mEpoll)[i].events & EPOLLIN) {
- if(fd == mHdmiCec.getFd()) { //ce-----------------------------c
+ if (fd == mHdmiCec.getFd()) { //ce-----------------------------c
int bufIndex = 0;
int needRead = 4;
int haveRead = 0;
@@ -689,23 +772,30 @@ bool CFbcCommunication::threadLoop()
haveRead += readLen;
bufIndex += readLen;
//if(haveRead == needRead) break;
- } while(0);
+ } while (0);
- if(readLen > 0) {
+ if (readLen > 0) {
processData(COMM_DEV_CEC, readFrameBuf, readLen);
} else {
}
- } else if(fd == mSerialPort.getFd()) {
+ } else if (fd == mSerialPort.getFd()) {
//seria---------------------------l
int cmdLen = 0, idx = 0;
LOGD("serial data come");
memset(readFrameBuf, 0, 512);
int ret = uartReadData(readFrameBuf, &cmdLen);
- if(ret == -1) { //data error
+ if (ret == -1) { //data error
sendAckCmd(false);
- } else if(readFrameBuf[4] == 0x80) { //ack
+ } else if (readFrameBuf[4] == 0x80) { //ack
LOGD("is ack come");
+#ifdef TV_RESEND_UMUTE_TO_FBC
+ if (((readFrameBuf[7] << 8) | readFrameBuf[6]) == 0x8001 &&
+ readFrameBuf[5] == AUDIO_CMD_SET_MUTE) {
+ LOGD("resend unmute to 101 avoid 101 receiving unmute timeout\n");
+ Fbc_Set_Value_INT8(COMM_DEV_SERIAL, AUDIO_CMD_SET_MUTE, 1);
+ }
+#endif
} else { //not ack
sendAckCmd(true);
processData(COMM_DEV_SERIAL, readFrameBuf, cmdLen);
@@ -735,7 +825,7 @@ int CFbcCommunication::Fbc_Set_Value_INT8(COMM_DEV_TYPE_E toDev, int cmd_type, i
return 0;
}
LOGD("%s cmd =0x%x, value=%d", __FUNCTION__, cmd_type, value);
- if(toDev == COMM_DEV_CEC) {
+ if (toDev == COMM_DEV_CEC) {
unsigned char cmd[16], rxbuf[16];
int rxlen = 0, idx = 0;
memset(cmd, 0, 16);
@@ -744,7 +834,7 @@ int CFbcCommunication::Fbc_Set_Value_INT8(COMM_DEV_TYPE_E toDev, int cmd_type, i
cmd[1] = cmd_type;
cmd[2] = value;
sendDataOneway(COMM_DEV_CEC, cmd, 4, 0);
- } else if(toDev == COMM_DEV_SERIAL) {
+ } else if (toDev == COMM_DEV_SERIAL) {
int crc32value = 0;
unsigned char write_buf[512];
unsigned char rxbuf[512];
@@ -778,7 +868,7 @@ int CFbcCommunication::Fbc_Set_Value_INT32(COMM_DEV_TYPE_E toDev, int cmd_type,
return 0;
}
- if(toDev == COMM_DEV_SERIAL) {
+ if (toDev == COMM_DEV_SERIAL) {
int crc32value = 0;
unsigned char write_buf[512];
unsigned char rxbuf[512];
@@ -818,7 +908,7 @@ int CFbcCommunication::Fbc_Get_Value_INT8(COMM_DEV_TYPE_E fromDev, int cmd_type,
LOGD("%s cmd =0x%x", __FUNCTION__, cmd_type);
- if(fromDev == COMM_DEV_CEC) {
+ if (fromDev == COMM_DEV_CEC) {
unsigned char cmd[16], rxbuf[16];
int rxlen = 0, idx = 0;
memset(cmd, 0, 16);
@@ -827,7 +917,7 @@ int CFbcCommunication::Fbc_Get_Value_INT8(COMM_DEV_TYPE_E fromDev, int cmd_type,
cmd[1] = cmd_type;
sendDataAndWaitReply(COMM_DEV_CEC, COMM_DEV_CEC, cmd[1], cmd, 4, 0, rxbuf, &rxlen, 0);
*value = rxbuf[6];
- } else if(fromDev == COMM_DEV_SERIAL) {
+ } else if (fromDev == COMM_DEV_SERIAL) {
int crc32value = 0, idx = 0, rxlen = 0;
unsigned char write_buf[16];
unsigned char rxbuf[16];
@@ -863,21 +953,21 @@ int CFbcCommunication::Fbc_Set_BatchValue(COMM_DEV_TYPE_E toDev, unsigned char *
return 0;
}
- if( 512 <= count) {
+ if ( 512 <= count) {
return -1;
}
- if(toDev == COMM_DEV_CEC) {
+ if (toDev == COMM_DEV_CEC) {
unsigned char cmd[512], rxbuf[512];
int rxlen = 0, idx = 0;
memset(cmd, 0, 512);
memset(rxbuf, 0, 512);
cmd[0] = 0x40;
- for(idx = 0; idx < count; idx++) {
+ for (idx = 0; idx < count; idx++) {
cmd[idx + 1] = cmd_buf[idx];
}
sendDataOneway(COMM_DEV_CEC, cmd, count + 1, 0);
- } else if(toDev == COMM_DEV_SERIAL) {
+ } else if (toDev == COMM_DEV_SERIAL) {
int crc32value = 0;
unsigned char write_buf[512];
unsigned char rxbuf[512];
@@ -892,7 +982,7 @@ int CFbcCommunication::Fbc_Set_BatchValue(COMM_DEV_TYPE_E toDev, unsigned char *
//Ack byte : 0x80-> ack package;0x00->normal package;
write_buf[4] = 0x00;
- for(idx = 0; idx < count; idx++) {
+ for (idx = 0; idx < count; idx++) {
write_buf[idx + 5] = cmd_buf[idx];
}
//crc32 little Endian
@@ -912,12 +1002,12 @@ int CFbcCommunication::Fbc_Get_BatchValue(COMM_DEV_TYPE_E fromDev, unsigned char
return 0;
}
- if( 512 <= count) {
+ if ( 512 <= count) {
return -1;
}
int ret = 0;
// TODO: read value
- if(fromDev == COMM_DEV_CEC) {
+ if (fromDev == COMM_DEV_CEC) {
unsigned char cmd[512], rxbuf[512];
int rxlen = 0, idx = 0;
memset(cmd, 0, 512);
@@ -926,8 +1016,8 @@ int CFbcCommunication::Fbc_Get_BatchValue(COMM_DEV_TYPE_E fromDev, unsigned char
cmd[1] = cmd_buf[0];
sendDataAndWaitReply(COMM_DEV_CEC, COMM_DEV_CEC, cmd[1], cmd, count + 1, 0, rxbuf, &rxlen, 0);
- if(rxlen > 2) {
- for(idx = 0; idx < rxlen; idx++) {
+ if (rxlen > 2) {
+ for (idx = 0; idx < rxlen; idx++) {
cmd_buf[idx] = cmd[idx + 1];
}
}
@@ -947,7 +1037,7 @@ int CFbcCommunication::Fbc_Get_BatchValue(COMM_DEV_TYPE_E fromDev, unsigned char
//Ack byte
write_buf[4] = 0x00;
//cmd ID
- for(idx = 0; idx < count; idx++) {
+ for (idx = 0; idx < count; idx++) {
write_buf[idx + 5] = cmd_buf[idx];
}
//crc32 little Endian
@@ -958,8 +1048,8 @@ int CFbcCommunication::Fbc_Get_BatchValue(COMM_DEV_TYPE_E fromDev, unsigned char
write_buf[count + 8] = (crc32value >> 24) & 0xFF;
sendDataAndWaitReply(COMM_DEV_SERIAL, COMM_DEV_SERIAL, write_buf[5], write_buf, write_buf[2], 2000, rxbuf, &rxlen, 0);
- if(rxlen > 9) {
- for(idx = 0; idx < (rxlen - 9); idx++) {
+ if (rxlen > 9) {
+ for (idx = 0; idx < (rxlen - 9); idx++) {
cmd_buf[idx] = rxbuf[idx + 5];
}
}
@@ -1041,12 +1131,43 @@ int CFbcCommunication::cfbc_Get_WB_Initial(COMM_DEV_TYPE_E fromDev, int *value)
int CFbcCommunication::cfbc_Set_ColorTemp_Mode(COMM_DEV_TYPE_E fromDev, int value)
{
- return Fbc_Set_Value_INT8(fromDev, VPU_CMD_COLOR_TEMPERATURE_DEF, value);
+ int fbcValue = value;
+ switch (value) {
+ case 0: //standard
+ fbcValue = 1;
+ break;
+ case 1: //warm
+ fbcValue = 2;
+ break;
+ case 2: //cold
+ fbcValue = 0;
+ break;
+ default:
+ break;
+ }
+ LOGD("before set fbcValue = %d", fbcValue);
+ return Fbc_Set_Value_INT8(fromDev, VPU_CMD_COLOR_TEMPERATURE_DEF, fbcValue);
}
int CFbcCommunication::cfbc_Get_ColorTemp_Mode(COMM_DEV_TYPE_E fromDev, int *value)
{
- return Fbc_Get_Value_INT8(fromDev, VPU_CMD_COLOR_TEMPERATURE_DEF | 0x80, value);
+ Fbc_Get_Value_INT8(fromDev, VPU_CMD_COLOR_TEMPERATURE_DEF | 0x80, value);
+
+ switch (*value) {
+ case 0: //cold
+ *value = 2;
+ break;
+ case 1: //standard
+ *value = 0;
+ break;
+ case 2: //warm
+ *value = 1;
+ break;
+ default:
+ break;
+ }
+
+ return 0;
}
int CFbcCommunication::cfbc_Set_Test_Pattern(COMM_DEV_TYPE_E fromDev, int value)
@@ -1302,7 +1423,7 @@ int CFbcCommunication::cfbc_Get_FBC_Factory_SN(COMM_DEV_TYPE_E fromDev, char Fac
if (rx_len <= 0) {
return -1;
}
- strncpy(FactorySN, (char *)(cmd + 1), 17);
+ strncpy(FactorySN, (char *)(cmd + 1), rx_len);
LOGD("panelModel=%s", FactorySN);
return 0;
@@ -1455,6 +1576,17 @@ int CFbcCommunication::cfbc_Get_Gamma(COMM_DEV_TYPE_E fromDev, int *value)
return 0;
}
+int CFbcCommunication::cfbc_Set_VMute(COMM_DEV_TYPE_E fromDev, unsigned char value)
+{
+ unsigned char cmd[512];
+ memset(cmd, 0, 512);
+
+ cmd[0] = VPU_CMD_USER_VMUTE;
+ cmd[1] = value;
+ LOGD("cfbc_Set_VMute=%d", cmd[1]);
+
+ return Fbc_Set_BatchValue(fromDev, cmd, 2);
+}
int CFbcCommunication::cfbc_Set_WhiteBalance_OnOff(COMM_DEV_TYPE_E fromDev, unsigned char value)
{
unsigned char cmd[512];
@@ -1498,6 +1630,35 @@ int CFbcCommunication::cfbc_Set_WB_Batch(COMM_DEV_TYPE_E fromDev, unsigned char
return Fbc_Set_BatchValue(fromDev, cmd, 8);
}
+int CFbcCommunication::cfbc_TestPattern_Select(COMM_DEV_TYPE_E fromDev, int value)
+{
+ int ret = -1;
+ unsigned char cmd[512];
+ memset(cmd, 0, 512);
+
+ LOGD("Call vpp 63 2 1\n");
+ cmd[0] = VPU_CMD_SRCIF;
+ cmd[1] = 2;
+ cmd[2] = 1;
+
+ ret = Fbc_Set_BatchValue(fromDev, cmd, 3);//close csc0
+
+ if (ret == 0) {
+ LOGD("Call vpp 9 11 1\n");
+ memset(cmd, 0, 512);
+ cmd[0] = VPU_CMD_ENABLE;
+ cmd[1] = 11;
+ cmd[2] = 1;
+ ret = Fbc_Set_BatchValue(fromDev, cmd, 3);
+ if (ret == 0) {
+ memset(cmd, 0, 512);
+ LOGD("Call vpp 42 1-17\n");
+ Fbc_Set_Value_INT8(fromDev, VPU_CMD_PATTEN_SEL, value);
+ }
+ }
+
+ return ret;
+}
int CFbcCommunication::cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_TYPE_E fromDev, int onOff)
{
int ret = -1;
@@ -1575,6 +1736,22 @@ int CFbcCommunication::cfbc_WhiteBalance_SetGrayPattern(COMM_DEV_TYPE_E fromDev,
return ret;
}
+int CFbcCommunication::cfbc_Set_Auto_Backlight_OnOff(COMM_DEV_TYPE_E fromDev, unsigned char value)
+{
+ unsigned char cmd[512];
+ memset(cmd, 0, 512);
+
+ cmd[0] = CMD_SET_AUTO_BACKLIGHT_ONFF;
+ cmd[1] = value;
+ LOGD("cfbc_Set_naturelight_onoff\n");
+ return Fbc_Set_BatchValue(fromDev, cmd, 2);
+}
+
+int CFbcCommunication::cfbc_Get_Auto_Backlight_OnOff(COMM_DEV_TYPE_E fromDev, int *value)
+{
+ LOGD("cfbc_get_naturelight_onoff\n");
+ return Fbc_Get_Value_INT8(fromDev, CMD_GET_AUTO_BACKLIGHT_ONFF, value);
+}
int CFbcCommunication::cfbc_Get_WB_Batch(COMM_DEV_TYPE_E fromDev, unsigned char mode, unsigned char *r_gain, unsigned char *g_gain, unsigned char *b_gain, unsigned char *r_offset, unsigned char *g_offset, unsigned char *b_offset)
{
unsigned char cmd[512];
@@ -1618,8 +1795,7 @@ int CFbcCommunication::cfbc_Set_AUTO_ELEC_MODE(COMM_DEV_TYPE_E fromDev, int valu
int CFbcCommunication::cfbc_Get_AUTO_ELEC_MODE(COMM_DEV_TYPE_E fromDev, int *value)
{
- LOGD("%s cmd =0x%x~~~~~~~~~", __FUNCTION__, VPU_CMD_SET_ELEC_MODE);
- return Fbc_Get_Value_INT8(fromDev, VPU_CMD_GET_ELEC_MODE, value);
+ return 0;
}
int CFbcCommunication::cfbc_Set_Thermal_state(COMM_DEV_TYPE_E fromDev, int value)
@@ -1631,8 +1807,8 @@ int CFbcCommunication::cfbc_Set_Thermal_state(COMM_DEV_TYPE_E fromDev, int value
int CFbcCommunication::cfbc_Set_LightSensor_N310(COMM_DEV_TYPE_E fromDev, int value)
{
+ return Fbc_Set_Value_INT8(fromDev, 0x84, value);
// return Fbc_Set_Value_INT8(fromDev, CMD_LIGHT_SENSOR, value);
- return 0;
}
int CFbcCommunication::cfbc_Get_LightSensor_N310(COMM_DEV_TYPE_E fromDev, int *value)
@@ -1643,8 +1819,8 @@ int CFbcCommunication::cfbc_Get_LightSensor_N310(COMM_DEV_TYPE_E fromDev, int *v
int CFbcCommunication::cfbc_Set_Dream_Panel_N310(COMM_DEV_TYPE_E fromDev, int value)
{
+ return Fbc_Set_Value_INT8(fromDev, 0x83, value);
// return Fbc_Set_Value_INT8(fromDev, CMD_DREAM_PANEL, value);
- return 0;
}
int CFbcCommunication::cfbc_Get_Dream_Panel_N310(COMM_DEV_TYPE_E fromDev, int *value)
@@ -1655,8 +1831,8 @@ int CFbcCommunication::cfbc_Get_Dream_Panel_N310(COMM_DEV_TYPE_E fromDev, int *v
int CFbcCommunication::cfbc_Set_MULT_PQ_N310(COMM_DEV_TYPE_E fromDev, int value)
{
+ return Fbc_Set_Value_INT8(fromDev, 0x81, value);
// return Fbc_Set_Value_INT8(fromDev, CMD_MUTI_PQ, value);
- return 0;
}
int CFbcCommunication::cfbc_Get_MULT_PQ_N310(COMM_DEV_TYPE_E fromDev, int *value)
@@ -1667,8 +1843,8 @@ int CFbcCommunication::cfbc_Get_MULT_PQ_N310(COMM_DEV_TYPE_E fromDev, int *value
int CFbcCommunication::cfbc_Set_MEMC_N310(COMM_DEV_TYPE_E fromDev, int value)
{
+ return Fbc_Set_Value_INT8(fromDev, 0x82, value);
// return Fbc_Set_Value_INT8(fromDev, CMD_MEMC, value);
- return 0;
}
int CFbcCommunication::cfbc_Get_MEMC_N310(COMM_DEV_TYPE_E fromDev, int *value)
@@ -1676,7 +1852,54 @@ int CFbcCommunication::cfbc_Get_MEMC_N310(COMM_DEV_TYPE_E fromDev, int *value)
// return Fbc_Get_Value_INT8(fromDev, CMD_MEMC|0x80, value);
return 0;
}
+int CFbcCommunication::cfbc_Set_Bluetooth_IIS_onoff(COMM_DEV_TYPE_E fromDev, int value)
+{
+ return Fbc_Set_Value_INT8(fromDev, CMD_BLUETOOTH_I2S_STATUS, value);
+}
+int CFbcCommunication::cfbc_Get_Bluetooth_IIS_onoff(COMM_DEV_TYPE_E fromDev, int *value)
+{
+ return Fbc_Get_Value_INT8(fromDev, CMD_BLUETOOTH_I2S_STATUS | 0x80, value);
+}
+int CFbcCommunication::cfbc_Set_Led_onoff(COMM_DEV_TYPE_E fromDev, int val_1, int val_2, int val_3)
+{
+ unsigned char cmd[512];
+ memset(cmd, 0, 512);
+
+ cmd[0] = CMD_SET_LED_MODE;
+ cmd[1] = val_1;
+ cmd[2] = val_2;
+ cmd[3] = val_3;
+
+ return Fbc_Set_BatchValue(fromDev, cmd, 4);
+}
+int CFbcCommunication::cfbc_Set_LockN_state(COMM_DEV_TYPE_E fromDev, int value)
+{
+ LOGD("%s cmd =0x%x, data%d ~~~~~~~~~\n", __FUNCTION__, CMD_SET_LOCKN_DISABLE, value);
+ return Fbc_Set_Value_INT8(fromDev, CMD_SET_LOCKN_DISABLE, value);
+}
+
+int CFbcCommunication::cfbc_SET_SPLIT_SCREEN_DEMO(COMM_DEV_TYPE_E fromDev, int value)
+{
+ LOGD("%s,cmd[%#x], data[%d]\n", __FUNCTION__, CMD_SET_SPLIT_SCREEN_DEMO, value);
+ return Fbc_Set_Value_INT8(fromDev, CMD_SET_SPLIT_SCREEN_DEMO, value);
+}
+
+int CFbcCommunication::cfbc_Set_AP_STANDBY_N310(COMM_DEV_TYPE_E fromDev, int value)
+{
+ return Fbc_Set_Value_INT8(fromDev, CMD_PANEL_ON_OFF, value);
+ // return 0;
+}
+
+int CFbcCommunication::cfbc_Get_AP_STANDBY_N310(COMM_DEV_TYPE_E fromDev, int *value)
+{
+ return Fbc_Get_Value_INT8(fromDev, CMD_PANEL_ON_OFF | 0x80, value);
+ // return 0;
+}
+int CFbcCommunication::cfbc_Set_Fbc_Uboot_Stage(COMM_DEV_TYPE_E fromDev, int value)
+{
+ return Fbc_Set_Value_INT8(fromDev, CMD_SET_UBOOT_STAGE, value);
+}
void CFbcCommunication::CFbcMsgQueue::handleMessage ( CMessage &msg )
{
diff --git a/tvapi/libtv/tv/CFbcCommunication.h b/tvapi/libtv/tv/CFbcCommunication.h
index b3db768..ba8b270 100644
--- a/tvapi/libtv/tv/CFbcCommunication.h
+++ b/tvapi/libtv/tv/CFbcCommunication.h
@@ -86,7 +86,8 @@ typedef enum fbc_command_e {
VPU_CMD_RES3,
VPU_CMD_RES4,
VPU_CMD_RES5,
- VPU_CMD_USER_GAMMA = 0x2f,
+ VPU_CMD_USER_VMUTE = 0x2e,
+ VPU_CMD_USER_GAMMA ,
//0x30:sound_mode_def
VPU_CMD_COLOR_TEMPERATURE_DEF = 0x31, //def:factory setting
VPU_CMD_BRIGHTNESS_DEF,
@@ -149,16 +150,24 @@ typedef enum fbc_command_e {
AUDIO_CMD_GET_BALANCE,
VPU_CMD_SET_ELEC_MODE = 0x64,
- VPU_CMD_GET_ELEC_MODE,
+ CMD_SET_LED_MODE = 0x65,
CMD_SET_FACTORY_SN = 0x66,
CMD_GET_FACTORY_SN,
CMD_COMMUNICATION_TEST,
CMD_CLR_SETTINGS_DEFAULT,
+ CMD_BLUETOOTH_I2S_STATUS = 0x6a,
+ CMD_PANEL_ON_OFF = 0x6b,
CMD_HDMI_REG = 0x70,
CMD_SET_PROJECT_SELECT = 0x71,
CMD_GET_PROJECT_SELECT = 0x72,
+ CMD_SET_LOCKN_DISABLE = 0x73, //0x73
+ CMD_SET_SPLIT_SCREEN_DEMO = 0X74,
+ CMD_SET_UBOOT_STAGE = 0x7b,
+
+ CMD_SET_AUTO_BACKLIGHT_ONFF = 0x85,
+ CMD_GET_AUTO_BACKLIGHT_ONFF = 0x86,
} fbc_command_t;
typedef struct REQUEST_REPLY_CMD {
@@ -303,7 +312,10 @@ public:
int cfbc_Get_Gamma(COMM_DEV_TYPE_E fromDev, int *value);
int cfbc_Set_WhiteBalance_OnOff(COMM_DEV_TYPE_E fromDev, unsigned char value);
int cfbc_Get_WhiteBalance_OnOff(COMM_DEV_TYPE_E fromDev, int *value);
+ int cfbc_Set_Auto_Backlight_OnOff(COMM_DEV_TYPE_E fromDev, unsigned char value);
+ int cfbc_Get_Auto_Backlight_OnOff(COMM_DEV_TYPE_E fromDev, int *value);
int cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_TYPE_E fromDev, int onOff);
+ int cfbc_TestPattern_Select(COMM_DEV_TYPE_E fromDev, int value);
int cfbc_WhiteBalance_SetGrayPattern(COMM_DEV_TYPE_E fromDev, unsigned char value);
int cfbc_Get_WB_Batch(COMM_DEV_TYPE_E fromDev, unsigned char mode, unsigned char *r_gain, unsigned char *g_gain, unsigned char *b_gain, unsigned char *r_offset, unsigned char *g_offset, unsigned char *b_offset);
int cfbc_Set_WB_Batch(COMM_DEV_TYPE_E fromDev, unsigned char mode, unsigned char r_gain, unsigned char g_gain, unsigned char b_gain, unsigned char r_offset, unsigned char g_offset, unsigned char b_offset);
@@ -336,6 +348,15 @@ public:
int cfbc_Get_MULT_PQ_N310(COMM_DEV_TYPE_E fromDev, int *value);
int cfbc_Set_MEMC_N310(COMM_DEV_TYPE_E fromDev, int value);
int cfbc_Get_MEMC_N310(COMM_DEV_TYPE_E fromDev, int *value);
+ int cfbc_Set_LockN_state(COMM_DEV_TYPE_E fromDev, int value);
+ int cfbc_Set_VMute(COMM_DEV_TYPE_E fromDev, unsigned char value);
+ int cfbc_SET_SPLIT_SCREEN_DEMO(COMM_DEV_TYPE_E fromDev, int value);
+ int cfbc_Set_Bluetooth_IIS_onoff(COMM_DEV_TYPE_E fromDev, int value);
+ int cfbc_Get_Bluetooth_IIS_onoff(COMM_DEV_TYPE_E fromDev, int *value);
+ int cfbc_Set_Led_onoff(COMM_DEV_TYPE_E fromDev, int val_1, int val_2, int val_3);
+ int cfbc_Set_AP_STANDBY_N310(COMM_DEV_TYPE_E fromDev, int value);
+ int cfbc_Get_AP_STANDBY_N310(COMM_DEV_TYPE_E fromDev, int *value);
+ virtual int cfbc_Set_Fbc_Uboot_Stage(COMM_DEV_TYPE_E fromDev, int value);
private:
//now,just one item in list,haha...
diff --git a/tvapi/libtv/tv/CFrontEnd.cpp b/tvapi/libtv/tv/CFrontEnd.cpp
index a11d979..86c4a0c 100644
--- a/tvapi/libtv/tv/CFrontEnd.cpp
+++ b/tvapi/libtv/tv/CFrontEnd.cpp
@@ -28,12 +28,16 @@ CFrontEnd::CFrontEnd()
mpObserver = NULL;
mCurFineFreq = 0;
mCurMode = FE_ANALOG;
+ mCurFreq = -1;
+ mCurPara1 = -1;
+ mCurPara2 = -1;
+ mbFEOpened = false;
}
CFrontEnd::~CFrontEnd()
{
AM_EVT_Unsubscribe(mFrontDevID, AM_FEND_EVT_STATUS_CHANGED, dmd_fend_callback, NULL);
- if(mFrontDevID == FE_DEV_ID)
+ if (mFrontDevID == FE_DEV_ID)
AM_FEND_Close(mFrontDevID);
mFrontDevID = -1;
}
@@ -43,10 +47,15 @@ int CFrontEnd::Open(int mode)
AM_FEND_OpenPara_t para;
int rc = 0;
+ if (mbFEOpened) {
+ LOGD("FrontEnd have opened, return");
+ return 0;
+ }
+ mbFEOpened = true;
memset(&para, 0, sizeof(AM_FEND_OpenPara_t));
para.mode = mode;
rc = AM_FEND_Open(mFrontDevID, &para);
- if((rc == AM_FEND_ERR_BUSY) || (rc == 0)) {
+ if ((rc == AM_FEND_ERR_BUSY) || (rc == 0)) {
AM_EVT_Subscribe(mFrontDevID, AM_FEND_EVT_STATUS_CHANGED, dmd_fend_callback, this);
LOGD("%s,frontend dev open success!\n", __FUNCTION__);
return 0;
@@ -54,14 +63,25 @@ int CFrontEnd::Open(int mode)
LOGD("%s,frontend dev open failed! dvb error id is %d\n", __FUNCTION__, rc);
return -1;
}
+ mCurMode = mode;
+ mCurFreq = -1;
+ mCurPara1 = -1;
+ mCurPara2 = -1;
}
int CFrontEnd::Close()
{
int rc = 0;
+ if (!mbFEOpened) {
+ LOGD("FrontEnd have close, but not return");
+ }
rc = AM_FEND_Close(mFrontDevID);
-
- if(rc != 0) {
+ mbFEOpened = false;
+ mCurMode = -1;
+ mCurFreq = -1;
+ mCurPara1 = -1;
+ mCurPara2 = -1;
+ if (rc != 0) {
LOGD("%s,frontend_close fail! dvb error id is %d\n", __FUNCTION__, rc);
return -1;
} else {
@@ -73,10 +93,10 @@ int CFrontEnd::Close()
int CFrontEnd::setMode(int mode)
{
int rc = 0;
- if(mCurMode == mode) return 0;
+ if (mCurMode == mode) return 0;
rc = AM_FEND_SetMode(mFrontDevID, mode);
- if(rc != 0) {
+ if (rc != 0) {
LOGD("%s,front dev set mode failed! dvb error id is %d\n", __FUNCTION__, rc);
return -1;
}
@@ -89,12 +109,20 @@ int CFrontEnd::setPara(int mode, int freq, int para1, int para2)
int buff_size = 32;
char VideoStdBuff[buff_size];
char audioStdBuff[buff_size];
+ if (mCurMode == mode && mCurFreq == freq && mCurPara1 == para1 && mCurPara2 == para2) {
+ LOGD("fe setpara is same return");
+ return 0;
+ }
+ mCurMode = mode;
+ mCurFreq = freq;
+ mCurPara1 = para1;
+ mCurPara2 = para2;
AM_FENDCTRL_DVBFrontendParameters_t dvbfepara;
memset(&dvbfepara, 0, sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
LOGD("%s,set fe para mode = %d freq=%d p1=%d p2=%d", __FUNCTION__, mode, freq, para1, para2);
dvbfepara.m_type = mode;
- switch(mode) {
+ switch (mode) {
case FE_OFDM:
dvbfepara.terrestrial.para.frequency = freq;
dvbfepara.terrestrial.para.u.ofdm.bandwidth = (fe_bandwidth_t)para1;
@@ -120,10 +148,11 @@ int CFrontEnd::setPara(int mode, int freq, int para1, int para2)
dvbfepara.analog.para.frequency = freq;
dvbfepara.analog.para.u.analog.std = para1;
dvbfepara.analog.para.u.analog.afc_range = AFC_RANGE;
- if(para2 == 0) {
+ if (para2 == 0) {
dvbfepara.analog.para.u.analog.flag |= ANALOG_FLAG_ENABLE_AFC;
} else {
dvbfepara.analog.para.u.analog.flag &= ~ANALOG_FLAG_ENABLE_AFC;
+ dvbfepara.analog.para.u.analog.afc_range = 0;
}
printAudioStdStr(para1, audioStdBuff, buff_size);
@@ -146,12 +175,12 @@ int CFrontEnd::setPara(int mode, int freq, int para1, int para2)
int CFrontEnd::fineTune(int fineFreq)
{
int ret = 0;
- if(mCurFineFreq == fineFreq) return -1;
+ if (mCurFineFreq == fineFreq) return -1;
mCurFineFreq = fineFreq;
ret = AM_FEND_FineTune(FE_DEV_ID, fineFreq);
- if(ret != 0) {
+ if (ret != 0) {
LOGD("%s, fail! dvb error id is %d", __FUNCTION__, ret);
return -1;
}
@@ -167,11 +196,11 @@ int CFrontEnd::GetTSSource(AM_DMX_Source_t *src)
void CFrontEnd::dmd_fend_callback(long dev_no, int event_type, void *param, void *user_data)
{
CFrontEnd *pFront = (CFrontEnd *)user_data;
- if(NULL == pFront) {
+ if (NULL == pFront) {
LOGD("%s,warnning : dmd_fend_callback NULL == pFront\n", __FUNCTION__);
return ;
}
- if(pFront->mpObserver == NULL) {
+ if (pFront->mpObserver == NULL) {
LOGD("%s,warnning : mpObserver NULL == mpObserver\n", __FUNCTION__);
return;
}
@@ -193,19 +222,19 @@ void CFrontEnd::dmd_fend_callback(long dev_no, int event_type, void *param, void
int CFrontEnd::stdAndColorToAudioEnum(int data)
{
atv_audio_std_t std = CC_ATV_AUDIO_STD_DK;
- if(((data & V4L2_STD_PAL_DK) == V4L2_STD_PAL_DK) ||
+ if (((data & V4L2_STD_PAL_DK) == V4L2_STD_PAL_DK) ||
((data & V4L2_STD_SECAM_DK) == V4L2_STD_SECAM_DK)) {
std = CC_ATV_AUDIO_STD_DK;
- } else if((data & V4L2_STD_PAL_I) == V4L2_STD_PAL_I) {
+ } else if ((data & V4L2_STD_PAL_I) == V4L2_STD_PAL_I) {
std = CC_ATV_AUDIO_STD_I;
- } else if(((data & V4L2_STD_PAL_BG) == V4L2_STD_PAL_BG) ||
- ((data & V4L2_STD_SECAM_B) == V4L2_STD_SECAM_B) ||
- ((data & V4L2_STD_SECAM_G) == V4L2_STD_SECAM_G )) {
+ } else if (((data & V4L2_STD_PAL_BG) == V4L2_STD_PAL_BG) ||
+ ((data & V4L2_STD_SECAM_B) == V4L2_STD_SECAM_B) ||
+ ((data & V4L2_STD_SECAM_G) == V4L2_STD_SECAM_G )) {
std = CC_ATV_AUDIO_STD_BG;
- } else if(((data & V4L2_STD_PAL_M) == V4L2_STD_PAL_M) ||
- ((data & V4L2_STD_NTSC_M) == V4L2_STD_NTSC_M)) {
+ } else if (((data & V4L2_STD_PAL_M) == V4L2_STD_PAL_M) ||
+ ((data & V4L2_STD_NTSC_M) == V4L2_STD_NTSC_M)) {
std = CC_ATV_AUDIO_STD_M;
- } else if((data & V4L2_STD_SECAM_L) == V4L2_STD_SECAM_L) {
+ } else if ((data & V4L2_STD_SECAM_L) == V4L2_STD_SECAM_L) {
std = CC_ATV_AUDIO_STD_L;
}
return std ;
@@ -214,16 +243,25 @@ int CFrontEnd::stdAndColorToAudioEnum(int data)
int CFrontEnd::stdAndColorToVideoEnum(int std)
{
atv_video_std_t video_standard = CC_ATV_VIDEO_STD_PAL;
- if((std & V4L2_COLOR_STD_PAL) == V4L2_COLOR_STD_PAL) {
+ if ((std & V4L2_COLOR_STD_PAL) == V4L2_COLOR_STD_PAL) {
video_standard = CC_ATV_VIDEO_STD_PAL;
- } else if((std & V4L2_COLOR_STD_NTSC) == V4L2_COLOR_STD_NTSC) {
+ } else if ((std & V4L2_COLOR_STD_NTSC) == V4L2_COLOR_STD_NTSC) {
video_standard = CC_ATV_VIDEO_STD_NTSC;
- } else if((std & V4L2_COLOR_STD_SECAM) == V4L2_COLOR_STD_SECAM) {
+ } else if ((std & V4L2_COLOR_STD_SECAM) == V4L2_COLOR_STD_SECAM) {
video_standard = CC_ATV_VIDEO_STD_SECAM;
}
return video_standard;
}
+bool CFrontEnd::stdIsColorAuto(int std)
+{
+ return ((std & V4L2_COLOR_STD_AUTO) == V4L2_COLOR_STD_AUTO) ? true : false;
+}
+
+int CFrontEnd::addColorAutoFlag(int std)
+{
+ return std | V4L2_COLOR_STD_AUTO;
+}
v4l2_std_id CFrontEnd::enumToStdAndColor(int videoStd, int audioStd)
{
v4l2_std_id tmpTunerStd = 0;
@@ -238,7 +276,7 @@ v4l2_std_id CFrontEnd::enumToStdAndColor(int videoStd, int audioStd)
} else if (audioStd == CC_ATV_AUDIO_STD_M) {
tmpTunerStd |= V4L2_STD_PAL_M;
}
- } else if (videoStd == CC_ATV_VIDEO_STD_NTSC) {
+ } else if (videoStd == CC_ATV_VIDEO_STD_NTSC || videoStd == CC_ATV_VIDEO_STD_AUTO) {
tmpTunerStd |= V4L2_COLOR_STD_NTSC;
if (audioStd == CC_ATV_AUDIO_STD_DK) {
tmpTunerStd |= V4L2_STD_PAL_DK;
@@ -262,27 +300,27 @@ v4l2_std_id CFrontEnd::enumToStdAndColor(int videoStd, int audioStd)
} else if (audioStd == CC_ATV_AUDIO_STD_L) {
tmpTunerStd |= V4L2_STD_SECAM_L;
}
- } else if(videoStd == CC_ATV_VIDEO_STD_AUTO) {
- tmpTunerStd |= V4L2_COLOR_STD_AUTO;
- tmpTunerStd |= V4L2_STD_PAL_DK;
+
}
return tmpTunerStd;
}
-int CFrontEnd::getPara(frontend_para_set_t *fpara)
+int CFrontEnd::getPara(int *mode, int *freq, int *para1, int *para2)
{
- int mode;
- int ret1, ret2;
struct dvb_frontend_parameters para;
memset(&para, 0, sizeof(struct dvb_frontend_parameters));
- if((ret1 = AM_FEND_GetPara(mFrontDevID, &para)) < 0) {
- LOGD("%s,getPara faiture\n", __FUNCTION__ );
- return -1;
+ /*if((ret1=AM_FEND_GetPara(mFrontDevID, &para))<0) {
+ LOGD("%s,getPara faiture\n", __FUNCTION__ );
+ return -1;
- //fpara->mode = fend_mode ;
+ //fpara->mode = fend_mode ;
- }
+ }*/
+ *mode = mCurMode;
+ *freq = mCurFreq;
+ *para1 = mCurPara1;
+ *para2 = mCurPara2;
return 0;
}
@@ -309,20 +347,24 @@ int CFrontEnd::getStrength()
int CFrontEnd::formatATVFreq(int tmp_freq)
{
- int tmp_val = 25;
- int ATV_1MHZ = 1000000;
- int ATV_10KHZ = 10000;
-
- tmp_freq = (tmp_freq / ATV_1MHZ) * ATV_1MHZ + tmp_val * ATV_10KHZ;
-
- return tmp_freq;
+ const int ATV_1MHZ = 1000000;
+ const int ATV_50KHZ = 50 * 1000;
+ const int ATV_25KHZ = 25 * 1000;
+ int mastar = (tmp_freq / ATV_50KHZ) * ATV_50KHZ;
+ int follow = tmp_freq % ATV_50KHZ;
+ if (follow >= ATV_25KHZ) {
+ follow = ATV_50KHZ;
+ } else {
+ follow = 0;
+ }
+ return mastar + follow;
}
int CFrontEnd::printVideoStdStr(int compStd, char strBuffer[], int buff_size)
{
memset(strBuffer, 0, buff_size);
int videoStd = stdAndColorToVideoEnum(compStd);
- switch(videoStd) {
+ switch (videoStd) {
case CC_ATV_VIDEO_STD_AUTO:
strcpy(strBuffer, "AUTO");
break;
@@ -347,7 +389,7 @@ int CFrontEnd::printAudioStdStr(int compStd, char strBuffer[], int buff_size)
{
memset(strBuffer, 0, buff_size);
int audioStd = stdAndColorToAudioEnum(compStd);
- switch(audioStd) {
+ switch (audioStd) {
case CC_ATV_AUDIO_STD_DK:
strcpy(strBuffer, "DK");
break;
@@ -402,7 +444,7 @@ int CFrontEnd::setCvbsAmpOut(int tmp)
{
int rc = AM_SUCCESS;
rc = AM_FEND_SetCvbsAmpOut(mFrontDevID, tmp);
- if(rc == AM_SUCCESS) {
+ if (rc == AM_SUCCESS) {
LOGD("%s, sucessful!", __FUNCTION__);
rc = 0;
} else {
@@ -417,7 +459,7 @@ int CFrontEnd::setThreadDelay(int delay)
int rc = AM_SUCCESS;
rc = AM_FEND_SetThreadDelay(mFrontDevID, delay);
- if(rc == AM_SUCCESS) {
+ if (rc == AM_SUCCESS) {
LOGD("frontend_setThreadDelay sucessful!\n");
return 0;
} else {
@@ -441,7 +483,7 @@ int CFrontEnd::lock(int frequency, int symbol_rate, int modulation, int bandwidt
return -1;
fparam.frequency = frequency;
- switch(finfo.type) {
+ switch (finfo.type) {
case FE_QAM:
default:
@@ -476,7 +518,7 @@ int CFrontEnd::lock(int frequency, int symbol_rate, int modulation, int bandwidt
rt = AM_FEND_Lock(FE_DEV_ID, &fparam, &status);
- if((!rt) && (status & FE_HAS_LOCK)) {
+ if ((!rt) && (status & FE_HAS_LOCK)) {
LOGD("frontend_lock sucessful!\n");
return true;
} else {
@@ -495,6 +537,11 @@ int CFrontEnd::getInfo()
return 0;
}
+int CFrontEnd::setTunerAfc(int afc)
+{
+ AM_FEND_SetAfc(FE_DEV_ID, afc);
+ return 0;
+}
int CFrontEnd::getStatus()
{
@@ -525,6 +572,7 @@ int CFrontEnd::stdEnumToCvbsFmt (int videoStd, int audioStd)
tvin_sig_fmt_e cvbs_fmt = TVIN_SIG_FMT_NULL;
if ( videoStd == CC_ATV_VIDEO_STD_PAL ) {
+ cvbs_fmt = TVIN_SIG_FMT_CVBS_PAL_I;
if ( audioStd == CC_ATV_AUDIO_STD_DK ) {
cvbs_fmt = TVIN_SIG_FMT_CVBS_PAL_I;
} else if ( audioStd == CC_ATV_AUDIO_STD_I ) {
@@ -535,6 +583,7 @@ int CFrontEnd::stdEnumToCvbsFmt (int videoStd, int audioStd)
cvbs_fmt = TVIN_SIG_FMT_CVBS_PAL_M;
}
} else if ( videoStd == CC_ATV_VIDEO_STD_NTSC ) {
+ cvbs_fmt = TVIN_SIG_FMT_CVBS_NTSC_M;
if ( audioStd == CC_ATV_AUDIO_STD_DK ) {
cvbs_fmt = TVIN_SIG_FMT_CVBS_NTSC_M;
} else if ( audioStd == CC_ATV_AUDIO_STD_I ) {
@@ -556,8 +605,6 @@ int CFrontEnd::stdEnumToCvbsFmt (int videoStd, int audioStd)
} else if ( audioStd == CC_ATV_AUDIO_STD_L ) {
cvbs_fmt = TVIN_SIG_FMT_CVBS_SECAM;
}
- } else if(CC_ATV_VIDEO_STD_AUTO == videoStd) {
- cvbs_fmt = TVIN_SIG_FMT_NULL;
}
return cvbs_fmt;
}
@@ -566,3 +613,54 @@ int CFrontEnd::ClearAnalogFrontEnd()
{
return this->setPara ( FE_ANALOG, 44250000, V4L2_COLOR_STD_PAL | V4L2_STD_PAL_DK, 0 );
}
+
+/*to control afc function*/
+int CFrontEnd::SetAnalogFrontEndTimerSwitch(int onOff)
+{
+ FILE *fp = NULL;
+ int ret = -1;
+
+ fp = fopen ( "/sys/module/aml_fe/parameters/aml_timer_en", "w" );
+
+ if ( fp == NULL ) {
+ LOGW ( "Open /sys/module/aml_fe/parameters/aml_timer_en error(%s)!\n", strerror ( errno ) );
+ return -1;
+ }
+ if (onOff)
+ ret = fprintf(fp, "%s", "1");
+ else
+ ret = fprintf(fp, "%s", "0");
+ if ( ret < 0 ) {
+ LOGW ( "set aml_timer_en error(%s)!\n", strerror ( errno ) );
+ }
+ LOGD("SetAnalogFrontEndTimerSwitch %d", onOff);
+ fclose ( fp );
+ fp = NULL;
+
+ return ret;
+}
+
+int CFrontEnd::SetAnalogFrontEndSearhSlowMode(int onOff)
+{
+ FILE *fp = NULL;
+ int ret = -1;
+
+ fp = fopen ( "/sys/module/aml_fe/parameters/slow_mode", "w" );
+
+ if ( fp == NULL ) {
+ LOGW ( "Open /sys/module/aml_fe/parameters/slow_mode error(%s)!\n", strerror ( errno ) );
+ return -1;
+ }
+ if (onOff)
+ ret = fprintf(fp, "%s", "1");
+ else
+ ret = fprintf(fp, "%s", "0");
+ if ( ret < 0 ) {
+ LOGW ( "set aml_timer_en error(%s)!\n", strerror ( errno ) );
+ }
+ LOGD("SetAnalogFrontEndSearhSlowMode %d", onOff);
+ fclose ( fp );
+ fp = NULL;
+
+ return ret;
+}
diff --git a/tvapi/libtv/tv/CFrontEnd.h b/tvapi/libtv/tv/CFrontEnd.h
index b3ce6f4..86c526e 100644
--- a/tvapi/libtv/tv/CFrontEnd.h
+++ b/tvapi/libtv/tv/CFrontEnd.h
@@ -36,9 +36,9 @@ typedef enum atv_video_std_s {
//from kernel
/*COLOR MODULATION TYPE*/
-static const v4l2_std_id V4L2_COLOR_STD_PAL = ((v4l2_std_id)0x04000000);
+static const v4l2_std_id V4L2_COLOR_STD_PAL = ((v4l2_std_id)0x04000000);
static const v4l2_std_id V4L2_COLOR_STD_NTSC = ((v4l2_std_id)0x08000000);
-static const v4l2_std_id V4L2_COLOR_STD_SECAM = ((v4l2_std_id)0x10000000);
+static const v4l2_std_id V4L2_COLOR_STD_SECAM = ((v4l2_std_id)0x10000000);
//virtual
static const v4l2_std_id V4L2_COLOR_STD_AUTO = ((v4l2_std_id)0x02000000);
@@ -85,14 +85,18 @@ public:
int Close();
int setMode(int mode);
int fineTune(int freq);
- int formatATVFreq(int freq);
+ static int formatATVFreq(int freq);
int GetTSSource(AM_DMX_Source_t *src);
- int setPara(int frequency, int symbol_rate, int modulation, int bandwidth);
+ int setPara(int mode, int freq, int para1, int para2);
int ClearAnalogFrontEnd();
int autoLoadFE();
+ int SetAnalogFrontEndTimerSwitch(int onOff);
+ int SetAnalogFrontEndSearhSlowMode(int onOff);
static int stdAndColorToAudioEnum(int std);
static int stdAndColorToVideoEnum(int std);
+ static bool stdIsColorAuto(int std);
+ static int addColorAutoFlag(int std);
static int printVideoStdStr(int videoStd, char strBuffer[], int buff_size);
static int printAudioStdStr(int audioStd, char strBuffer[], int buff_size);
static v4l2_std_id enumToStdAndColor(int videoStd, int audioStd);
@@ -141,8 +145,9 @@ public:
int getStrength();
int setCvbsAmpOut(int amp);
int setThreadDelay(int delay) ;
- int getPara(frontend_para_set_t *fpara);
+ int getPara(int *mode, int *freq, int *para1, int *para2);
int lock(int frequency, int symbol_rate, int modulation, int bandwidth);
+ int setTunerAfc(int afc);
private:
int mFrontDevID;
int mDemuxDevID;
@@ -151,6 +156,10 @@ private:
IObserver *mpObserver;
FEEvent mCurSigEv;
int mCurMode;
+ int mCurFreq;
+ int mCurPara1;
+ int mCurPara2;
+ bool mbFEOpened;
static void dmd_fend_callback(long dev_no, int event_type, void *param, void *user_data);
};
#endif // ANDROID_FRONTEND_H
diff --git a/tvapi/libtv/tv/CTv.cpp b/tvapi/libtv/tv/CTv.cpp
index 078021b..c167ea0 100644
--- a/tvapi/libtv/tv/CTv.cpp
+++ b/tvapi/libtv/tv/CTv.cpp
@@ -1,5386 +1,7617 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTv.cpp
-// @ Date : 2013-11
-// @ Author :
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <am_epg.h>
-#include <am_mem.h>
-#include "CTvDatabase.h"
-#include <stdlib.h>
-#include <string.h>
-#include <malloc.h>
-#include <pthread.h>
-#include <sys/types.h>
-#include <errno.h>
-#include <dlfcn.h>
-#include <cutils/properties.h>
-#include <cutils/log.h>
-#include <cutils/android_reboot.h>
-#include <utils/threads.h>
-#include <time.h>
-#include <sys/prctl.h>
-#include <getopt.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#ifdef ANDROID
-#include <termios.h>
-#endif
-#include <string.h>
-#include <signal.h>
-
-#include "../version/version.h"
-#include "../tvsetting/CTvSetting.h"
-#include "../tvutils/tvutils.h"
-#include "../tvconfig/tvconfig.h"
-#include "../tvutils/CFile.h"
-#include <hardware_legacy/power.h>
-#include "../tvutils/serial_operate.h"
-
-extern "C" {
-#include "am_ver.h"
-#include "am_misc.h"
-#include "am_debug.h"
-#include "am_fend.h"
-}
-
-#include <math.h>
-#include <sys/ioctl.h>
-
-#include "CTv.h"
-
-#define LOG_TAG "CTv"
-
-
-using namespace android;
-
-// Called each time a message is logged.
-static void sqliteLogCallback(void *data, int iErrCode, const char *zMsg)
-{
- LOGD( "showbo sqlite (%d) %s\n", iErrCode, zMsg);
-}
-
-
-
-CTv::CTv() : mSigDetectThread ( &mTvin ), mSourceConnectDetectThread(&mTvin), mHDMIRxCEC ( &mTvin ), mTvScanner ( &mTvin ), mTvMsgQueue(this), mAutoBackLight( &mVpp, &mTvin )
-{
- //mpClient = pClient;
- //copy file to param
- if ( Tv_Utils_IsFileExist ( TV_CONFIG_FILE_SYSTEM_PATH ) == 0 ) {
- if ( Tv_Utils_IsFileExist ( TV_CONFIG_FILE_PARAM_PATH ) != 0 ) {
- CFile file ( TV_CONFIG_FILE_SYSTEM_PATH );
-
- if ( file.copyTo ( TV_CONFIG_FILE_PARAM_PATH ) != 0 ) {
- LOGE ( "%s, copy file = %s , error", __FUNCTION__, TV_CONFIG_FILE_PARAM_PATH );
- }
- }
- }
-
- if ( Tv_Utils_IsFileExist ( TV_CHANNEL_LIST_SYSTEM_PATH ) == 0 ) {
- if ( Tv_Utils_IsFileExist ( TV_CHANNEL_LIST_PARAM_PATH ) != 0 ) {
- CFile file ( TV_CHANNEL_LIST_SYSTEM_PATH );
-
- if ( file.copyTo ( TV_CHANNEL_LIST_PARAM_PATH ) != 0 ) {
- LOGE ( "%s, copy file = %s , error", __FUNCTION__, TV_CHANNEL_LIST_PARAM_PATH );
- }
- }
- }
-
- //ssm
- if ( Tv_Utils_IsFileExist ( TV_SSM_DATA_SYSTEM_PATH ) == 0 ) {
- if ( Tv_Utils_IsFileExist ( TV_SSM_DATA_PARAM_PATH ) != 0 ) {
- CFile file ( TV_SSM_DATA_SYSTEM_PATH );
-
- if ( file.copyTo ( TV_SSM_DATA_PARAM_PATH ) != 0 ) {
- LOGE ( "%s, copy file = %s , error", __FUNCTION__, TV_SSM_DATA_PARAM_PATH );
- }
- }
- }
-
- AM_EVT_Init();
- mTvEpg.setObserver ( &mTvMsgQueue );
- mpObserver = NULL;
- audio_sr = 0;
- mIsFbc = false;
- dtv_auto_3d_flag = 0;
- m_autoset_displayfreq = false;
- m_cur_set_info_fmt = TVIN_SIG_FMT_CVBS_PAL_I;
-
- tv_config_load ( TV_CONFIG_FILE_PATH );
- sqlite3_config (SQLITE_CONFIG_SERIALIZED);
- //sqlite3_config(SQLITE_CONFIG_LOG, &sqliteLogCallback, (void*)1);
- sqlite3_soft_heap_limit(8 * 1024 * 1024);
- // Initialize SQLite.
- sqlite3_initialize();
- CTvDatabase::GetTvDb()->InitTvDb ( TV_DB_PATH );
-
- if ( CTvDimension::isDimensionTblExist() == false ) {
- CTvDimension::builtinAtscDimensions();
- }
-
- CTvSettingLoad();
-
- mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
-
- m_sig_stable_nums = 0;
- m_is_set_hdmi_edid = false;
- m_cur_playing_prog_id = -1;
-
- mSigDetectThread.setObserver ( this );
- mSourceConnectDetectThread.setObserver ( this );
- mHDMIRxCEC.setObserver(this);
- mFrontDev.setObserver ( &mTvMsgQueue );
- mpUpgradeFBC = NULL;
- if (GetPlatformHaveFBCFlag() == 1) {
- mIsFbc = true;
-
- mpUpgradeFBC = new CUpgradeFBC();
- mpUpgradeFBC->setObserver(this);
- }
- mSerialA.setObserver(this);
- mSerialB.setObserver(this);
- mSerialC.setObserver(this);
- mAv.setObserver(&mTvMsgQueue);
- mTvScanner.setGlobalScanerObject(&mTvScanner);
- mTvAction = mTvAction & TV_ACTION_NULL;
- mTvStatus = TV_INIT_ED;
- print_version_info();
-};
-
-CTv::~CTv()
-{
- int iRet;
- mpObserver = NULL;
- CTvSettingunLoad();
- CTvDatabase::deleteTvDb();
- tv_config_unload();
- mAv.Close();
- mTvStatus = TV_INIT_ED;
- mFrontDev.Close();
-
- if (mpUpgradeFBC != NULL) {
- delete mpUpgradeFBC;
- mpUpgradeFBC = NULL;
- }
-}
-
-void CTv::onEvent ( const CTvScanner::ScannerEvent &ev )
-{
- LOGD ( "%s, CTv::onEvent lockStatus = %d type = %d\n", __FUNCTION__, ev.mLockedStatus, ev.mType );
-
- if ( mDtvScanRunningStatus == DTV_SCAN_RUNNING_ANALYZE_CHANNEL ) {
- if ( ev.mType == CTvScanner::ScannerEvent::EVENT_SCAN_END ) {
- CMessage msg;
- msg.mType = CTvMsgQueue::TV_MSG_STOP_ANALYZE_TS;
- msg.mpData = this;
- mTvMsgQueue.sendMsg ( msg );
- } else if ( ev.mType == CTvScanner::ScannerEvent::EVENT_STORE_END ) {
- CTvEpg::EpgEvent epgev;
- epgev.type = CTvEpg::EpgEvent::EVENT_CHANNEL_UPDATE_END;
- mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
- sendTvEvent ( epgev );
- }
- } else {
- sendTvEvent ( ev );
- }
-}
-
-void CTv::onEvent ( const CFrontEnd::FEEvent &ev )
-{
- LOGD ( "%s, FE event type = %d tvaction=%x", __FUNCTION__, ev.mCurSigStaus, mTvAction);
- if(mTvAction & TV_ACTION_SCANNING) return;
-
- //å‰ç«¯äº‹ä»¶å“应处ç†
- if ( ev.mCurSigStaus == CFrontEnd::FEEvent::EVENT_FE_HAS_SIG ) { //作为信å·ç¨³å®š
- if(/*m_source_input == SOURCE_TV || */m_source_input == SOURCE_DTV && (mTvAction & TV_ACTION_PLAYING)) { //atv and other tvin source not to use it, and if not playing, not use have sig
- Vpp_SetDisplayMode ( mVpp.Tv_GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt);
- if ( m_win_mode == PREVIEW_WONDOW ) {
- mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2);
- mAv.setVideoScreenMode ( CAv::VIDEO_WIDEOPTION_FULL_STRETCH );
- }
-
- if ( m_autoset_displayfreq) {
- mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution() , mIsFbc);
- }
- TvEvent::SignalInfoEvent ev;
- ev.mStatus = TVIN_SIG_STATUS_STABLE;
- ev.mTrans_fmt = TVIN_TFMT_2D;
- ev.mFmt = TVIN_SIG_FMT_NULL;
- ev.mReserved = 0;
- sendTvEvent ( ev );
- mAv.EnableVideoAuto();
- mTvAudio.SetAudioMuteForTv ( CC_AUDIO_UNMUTE );
- }
- } else if ( ev.mCurSigStaus == CFrontEnd::FEEvent::EVENT_FE_NO_SIG ) { //作为信å·æ¶ˆå¤±
- if(/*m_source_input == SOURCE_TV || */m_source_input == SOURCE_DTV && (mTvAction & TV_ACTION_PLAYING)) { //just playing
- mAv.DisableVideoWithBlueColor();
- //
- TvEvent::SignalInfoEvent ev;
- ev.mStatus = TVIN_SIG_STATUS_NOSIG;
- ev.mTrans_fmt = TVIN_TFMT_2D;
- ev.mFmt = TVIN_SIG_FMT_NULL;
- ev.mReserved = 0;
- sendTvEvent ( ev );
- }
- }
-
-}
-
-void CTv::onEvent ( const CTvEpg::EpgEvent &ev )
-{
- switch ( ev.type ) {
- case CTvEpg::EpgEvent::EVENT_TDT_END:
- LOGD ( "%s, CTv::onEvent epg time = %ld", __FUNCTION__, ev.time );
- mTvTime.setTime ( ev.time );
- break;
-
- case CTvEpg::EpgEvent::EVENT_CHANNEL_UPDATE: {
- LOGD ( "%s, CTv:: onEvent channel update", __FUNCTION__ );
- CMessage msg;
- msg.mType = CTvMsgQueue::TV_MSG_START_ANALYZE_TS;
- msg.mpData = this;
- mCurAnalyzeTsChannelID = ev.channelID;
- mTvMsgQueue.sendMsg ( msg );
- break;
- }
-
- default:
- break;
- }
-
- sendTvEvent ( ev );
-}
-
-
-void CTv::onEvent(const CAv::AVEvent &ev)
-{
- LOGD("AVEvent = %d", ev.type);
- switch ( ev.type ) {
- case CAv::AVEvent::EVENT_AV_STOP: {
- break;
- }
- case CAv::AVEvent::EVENT_AV_RESUEM: {
- mAv.EnableVideoAuto();
- TvEvent::AVPlaybackEvent AvPlayBackEvt;
- AvPlayBackEvt.mMsgType = TvEvent::AVPlaybackEvent::EVENT_AV_PLAYBACK_RESUME;
- AvPlayBackEvt.mProgramId = ( int ) ev.param;
- sendTvEvent(AvPlayBackEvt );
- break;
- }
- case CAv::AVEvent::EVENT_AV_SCAMBLED: {
- mAv.DisableVideoWithBlueColor();
- TvEvent::AVPlaybackEvent AvPlayBackEvt;
- AvPlayBackEvt.mMsgType = TvEvent::AVPlaybackEvent::EVENT_AV_SCAMBLED;
- AvPlayBackEvt.mProgramId = ( int ) ev.param;
- sendTvEvent(AvPlayBackEvt );
- break;
- }
- case CAv::AVEvent::EVENT_AV_UNSUPPORT: {
- LOGD("To AVS or AVS+ format");//just avs format, not unsupport, and avs avs+
- break;
- }
- default:
- break;
- }
-}
-
-CTv::CTvMsgQueue::CTvMsgQueue(CTv *tv)
-{
- mpTv = tv;
-}
-
-CTv::CTvMsgQueue::~CTvMsgQueue()
-{
-}
-
-void CTv::CTvMsgQueue::handleMessage ( CMessage &msg )
-{
- LOGD ( "%s, CTv::CTvMsgQueue::handleMessage type = %d", __FUNCTION__, msg.mType );
-
- switch ( msg.mType ) {
- case TV_MSG_COMMON:
- break;
-
- case TV_MSG_STOP_ANALYZE_TS: {
- //mpTv->Tv_Stop_Analyze_Ts();
- break;
- }
-
- case TV_MSG_START_ANALYZE_TS: {
- //mpTv->Tv_Start_Analyze_Ts ( pTv->mCurAnalyzeTsChannelID );
- break;
- }
-
- case TV_MSG_CHECK_FE_DELAY: {
- mpTv->mFrontDev.checkStatusOnce();
- break;
- }
- case TV_MSG_AV_EVENT: {
- mpTv->onEvent(*((CAv::AVEvent *)(msg.mpPara)));
- break;
- }
- case TV_MSG_FE_EVENT: {
- mpTv->onEvent(*((CFrontEnd::FEEvent *)(msg.mpPara)));
- break;
- }
- case TV_MSG_SCAN_EVENT: {
- mpTv->onEvent(*((CTvScanner::ScannerEvent *)(msg.mpPara)));
- break;
- }
- case TV_MSG_EPG_EVENT: {
- mpTv->onEvent(*((CTvEpg::EpgEvent *)(msg.mpPara)));
- break;
- }
-
- default:
- break;
- }
-}
-
-
-void CTv::CTvMsgQueue::onEvent ( const CTvScanner::ScannerEvent &ev )
-{
- CMessage msg;
- msg.mDelayMs = 0;
- msg.mType = CTvMsgQueue::TV_MSG_SCAN_EVENT;
- memcpy(msg.mpPara, &ev, sizeof(ev));
- this->sendMsg ( msg );
-}
-
-void CTv::CTvMsgQueue::onEvent ( const CFrontEnd::FEEvent &ev )
-{
- CMessage msg;
- msg.mDelayMs = 0;
- msg.mType = CTvMsgQueue::TV_MSG_FE_EVENT;
- memcpy(msg.mpPara, &ev, sizeof(ev));
- this->sendMsg ( msg );
-}
-
-void CTv::CTvMsgQueue::onEvent ( const CTvEpg::EpgEvent &ev )
-{
- CMessage msg;
- msg.mDelayMs = 0;
- msg.mType = CTvMsgQueue::TV_MSG_EPG_EVENT;
- memcpy(msg.mpPara, &ev, sizeof(ev));
- this->sendMsg ( msg );
-}
-
-
-void CTv::CTvMsgQueue::onEvent(const CAv::AVEvent &ev)
-{
- CMessage msg;
- msg.mDelayMs = 0;
- msg.mType = CTvMsgQueue::TV_MSG_AV_EVENT;
- memcpy(msg.mpPara, &ev, sizeof(ev));
- this->sendMsg ( msg );
-}
-
-int CTv::setTvObserver ( TvIObserver *ob )
-{
- mpObserver = ob;
- return 0;
-}
-
-void CTv::sendTvEvent ( const CTvEv &ev )
-{
- //AutoMutex lock(mLock);
- /* send sigstate to AutoBackLight */
- if (ev.getEvType() == CTvEv::TV_EVENT_SIGLE_DETECT) {
- TvEvent::SignalInfoEvent *pEv = (TvEvent::SignalInfoEvent *)(&ev);
- if (pEv->mStatus == TVIN_SIG_STATUS_STABLE) {
- mAutoBackLight.updateSigState(mAutoBackLight.SIG_STATE_STABLE);
- } else {
- mAutoBackLight.updateSigState(mAutoBackLight.SIG_STATE_NOSIG);
- }
- }
-
- LOGD ( "%s, tvaction=%x", __FUNCTION__, mTvAction);
- if((mTvAction & TV_ACTION_SCANNING) && (ev.getEvType() == CTvEv::TV_EVENT_SIGLE_DETECT)) {
- LOGD("%s, when scanning, not send sig detect event", __FUNCTION__);
- return;
- }
- if ( mpObserver != NULL ) {
- mpObserver->onTvEvent ( ev );
- }
-
- return;
-}
-
-int CTv::ClearAnalogFrontEnd()
-{
- return mFrontDev.ClearAnalogFrontEnd ();
-}
-
-int CTv::dtvAutoScan()
-{
- AutoMutex lock ( mLock );
- mTvAction = mTvAction | TV_ACTION_SCANNING;
- mTvEpg.leaveChannel();
- mAv.StopTS ();
- mAv.DisableVideoWithBlueColor();
- CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_DTV );
- CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_RADIO );
- CTvEvent::CleanAllEvent();
- mTvScanner.setObserver ( &mTvMsgQueue );
- mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
- mFrontDev.Open(FE_DTMB);
- mTvScanner.autoDtmbScan();//dtmb
- return 0;
-}
-
-int CTv::dtvCleanProgramByFreq ( int freq )
-{
- int iOutRet = 0;
- CTvChannel channel;
- iOutRet = CTvChannel::SelectByFreq ( freq, channel );
- if ( -1 == iOutRet ) {
- LOGD ( "%s, Warnning: Current Freq not have program info in the ts_table\n", __FUNCTION__ );
- }
-
- iOutRet == CTvProgram::deleteChannelsProgram ( channel );
- return iOutRet;
-}
-
-int CTv::dtvManualScan (int beginFreq, int endFreq, int modulation)
-{
- AutoMutex lock ( mLock );
- mTvAction = mTvAction | TV_ACTION_SCANNING;
- mTvEpg.leaveChannel();
- mAv.StopTS ();
- mAv.DisableVideoWithBlueColor();
- CTvChannel::DeleteBetweenFreq(beginFreq, endFreq);
- mTvScanner.setObserver ( &mTvMsgQueue );
- mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
- mFrontDev.Open(FE_DTMB);
- int iOutRet = mTvScanner.manualDtmbScan (beginFreq, endFreq, modulation); //dtmb
- return iOutRet;
-}
-
-int CTv::dtvAutoScanAtscLock(int attenna, int videoStd, int audioStd)
-{
- //showboz
- /* int minScanFreq, maxScanFreq, vStd, aStd;
- vStd = CC_ATV_VIDEO_STD_PAL;
- aStd = CC_ATV_AUDIO_STD_DK;
- v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd);
-
- AutoMutex lock ( mLock );
- mTvAction = mTvAction | TV_ACTION_SCANNING;
- mTvEpg.leaveChannel();
- mAv.StopTS ();
- mAv.DisableVideoWithBlueColor();
- CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_DTV );
- CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_RADIO );
- CTvEvent::CleanAllEvent();
- mTvScanner.setObserver ( &mTvMsgQueue );
- mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
- mFrontDev.Open(FE_ATSC);
- mTvScanner.autoAtscScan(CTvScanner::AM_ATSC_ATTENNA_TYPE_AIR, stdAndColor);//dtmb*/
- return 0;
-}
-
-//searchType 0:not 256 1:is 256 Program
-int CTv::atvAutoScan(int videoStd, int audioStd, int searchType)
-{
- int minScanFreq, maxScanFreq, vStd, aStd;
- AutoMutex lock ( mLock );
- mAv.DisableVideoWithBlueColor();
- mTvAction = mTvAction | TV_ACTION_SCANNING;
- mTvScanner.setObserver ( &mTvMsgQueue );
- mTvAudio.SetAudioMuteForTv ( CC_AUDIO_MUTE );
- getATVMinMaxFreq (&minScanFreq, &maxScanFreq );
- if ( minScanFreq == 0 || maxScanFreq == 0 || minScanFreq > maxScanFreq ) {
- LOGE ( "%s, auto scan freq set is error min=%d, max=%d", __FUNCTION__, minScanFreq, maxScanFreq );
- return -1;
- }
- //if set std null AUTO, use default PAL/DK
- //if(videoStd == CC_ATV_VIDEO_STD_AUTO) {
- // vStd = CC_ATV_VIDEO_STD_PAL;
- // aStd = CC_ATV_AUDIO_STD_DK;
- //} else {
- vStd = videoStd;
- aStd = audioStd;
- //}
- tvin_port_t source_port = mTvin.Tvin_GetSourcePortBySourceInput(SOURCE_TV);
- mTvin.VDIN_OpenPort ( source_port );
- LOGD("%s, atv auto scan vstd=%d, astd=%d ", __FUNCTION__, vStd, aStd);
- v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd);
-
- int fmt = CFrontEnd::stdEnumToCvbsFmt (vStd, aStd);
- mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt );
- m_cur_set_info_fmt = ( tvin_sig_fmt_t )fmt;
-
- if (searchType == 0) {
- CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_ATV );
- } else if (searchType == 1) { //type for skyworth, and insert 256 prog, and just update ts table
- }
- minScanFreq = mFrontDev.formatATVFreq ( minScanFreq );
- maxScanFreq = mFrontDev.formatATVFreq ( maxScanFreq );
- LOGD("%s, atv auto scan vstd=%d, astd=%d stdandcolor=%lld", __FUNCTION__, vStd, aStd, stdAndColor);
- mSigDetectThread.setVdinNoSigCheckKeepTimes(1000, false);
- mFrontDev.Open(FE_ANALOG);
- mTvScanner.autoAtvScan ( minScanFreq, maxScanFreq, stdAndColor, searchType );
- return 0;
-}
-
-int CTv::clearAllProgram(int arg0)
-{
- CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_ATV );
- CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_TV );
- CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_DTV );
- CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_RADIO);
- return 0;
-}
-
-int CTv::atvMunualScan ( int startFreq, int endFreq, int videoStd, int audioStd, int store_Type , int channel_num )
-{
- int minScanFreq, maxScanFreq, vStd, aStd;
-
- minScanFreq = mFrontDev.formatATVFreq ( startFreq );
- maxScanFreq = mFrontDev.formatATVFreq ( endFreq );
- if ( minScanFreq == 0 || maxScanFreq == 0 ) {
- LOGE ( "%s, munual scan freq set is error min=%d, max=%d", __FUNCTION__, minScanFreq, maxScanFreq );
- return -1;
- }
-
- //if set std null AUTO, use default PAL/DK
- //if(videoStd == CC_ATV_VIDEO_STD_AUTO) {
- // vStd = CC_ATV_VIDEO_STD_PAL;
- // aStd = CC_ATV_AUDIO_STD_DK;
- // } else {
- vStd = videoStd;
- aStd = audioStd;
- // }
-
- AutoMutex lock ( mLock );
- mAv.DisableVideoWithBlueColor();
- mTvAction = mTvAction | TV_ACTION_SCANNING;
- mTvScanner.setObserver ( &mTvMsgQueue );
-
- mTvAudio.SetAudioMuteForTv ( CC_AUDIO_MUTE );
- v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd);
-
-
- tvin_port_t source_port = mTvin.Tvin_GetSourcePortBySourceInput(SOURCE_TV);
- mTvin.VDIN_OpenPort ( source_port );
-
- int fmt = CFrontEnd::stdEnumToCvbsFmt (vStd, aStd);
- mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt );
- m_cur_set_info_fmt = ( tvin_sig_fmt_t )fmt;
- LOGD("%s, atv manual scan vstd=%d, astd=%d stdandcolor=%lld", __FUNCTION__, videoStd, audioStd, stdAndColor);
- mFrontDev.Open(FE_ANALOG);
- return mTvScanner.ATVManualScan ( minScanFreq, maxScanFreq, stdAndColor, store_Type, channel_num);
-}
-
-int CTv::getVideoFormatInfo ( int *pWidth, int *pHeight, int *pFPS, int *pInterlace )
-{
- int iOutRet = -1;
- AM_AV_VideoStatus_t video_status;
-
- do {
- if ( NULL == pWidth || NULL == pHeight || NULL == pFPS || NULL == pInterlace ) {
- break;
- }
-
- iOutRet = mAv.GetVideoStatus (&video_status );
-
- if ( AM_SUCCESS != iOutRet ) {
- LOGD ( "%s, ERROR: Cann't Get video format info\n", __FUNCTION__);
- break;
- }
-
- *pWidth = video_status.src_w;
- *pHeight = video_status.src_h;
- *pFPS = video_status.fps;
- *pInterlace = video_status.interlaced;
- //LOGD("%s, w : %d h : %d fps : %d interlaced: %d\n", __FUNCTION__, video_status.src_w,video_status.src_h,video_status.fps,video_status.interlaced);
- } while ( false );
-
- return iOutRet;
-
-}
-
-int CTv::stopScanLock()
-{
- AutoMutex lock ( mLock );
- return stopScan();
-}
-
-int CTv::stopScan()
-{
- if(!(mTvAction & TV_ACTION_SCANNING)) {
- LOGD("%s, tv not scanning ,return\n", __FUNCTION__);
- return 0;
- }
- mSigDetectThread.requestAndWaitPauseDetect();
- mTvEpg.leaveChannel();
- mTvScanner.stopScan();
- mFrontDev.Close();
- mTvAction = mTvAction & ~TV_ACTION_SCANNING;
- return 0;
-}
-
-int CTv::playProgramLock ( int progId )
-{
- /* AutoMutex lock ( mLock );
- CTvProgram prog;
- int ret = CTvProgram::selectByID ( progId, prog );
-
- if ( ret != 0 ) {
- return -1;
- }
- int type = prog.getProgType();
- LOGD ( "%s, blackout = %dprog type = %d id = %d name = %s\n", __FUNCTION__, m_blackout_enable, type, progId, prog.getName().string() );
- if(m_blackout_enable == 1){
- mAv.EnableVideoBlackout();
- }else if(m_blackout_enable == 0){
- mAv.DisableVideoBlackout();
- }
-
- mTvAction = mTvAction | TV_ACTION_PLAYING;
- m_cur_playing_prog_id = progId;
- mFrontDev.Open(FE_ANALOG);
- if ( m_source_input == SOURCE_TV && type == CTvProgram::TYPE_ATV ) {
- playAtvProgram ( progId );
- } else if ( m_source_input == SOURCE_DTV && ( type == CTvProgram::TYPE_DTV || type == CTvProgram::TYPE_RADIO ) ) {
- playDtmbProgram ( progId );
- } else {
- LOGD ( "%s, source(%d) != type(%d),not play\n", __FUNCTION__, m_source_input, type );
- }
- //just for ui,left/right/stereo
- setAudioChannel((int)AM_AOUT_OUTPUT_STEREO);*/
- return 0;
-}
-
-int CTv::playDvbcProgram ( int progId )
-{
- LOGD ( "%s, progId = %d\n", __FUNCTION__, progId );
-
- CTvProgram prog;
- int ret = CTvProgram::selectByID ( progId, prog );
-
- if ( ret != 0 ) {
- return -1;
- }
-
- LOGD ( "%s, prog name = %s\n", __FUNCTION__, prog.getName().string() );
- CTvChannel channel;
- prog.getChannel ( channel );
-
- mFrontDev.setPara ( channel.getMode(), channel.getFrequency(), channel.getSymbolRate(), channel.getModulation() );
-
- int vpid = 0x1fff, apid = 0x1fff, vfmt = -1, afmt = -1;
-
- CTvProgram::Video *pV = prog.getVideo();
- CTvProgram::Audio *pA;
-
- if ( pV != NULL ) {
- vpid = pV->getPID();
- vfmt = pV->getFormat();
- }
-
- int aindex = prog.getCurrentAudio ( String8 ( "eng" ) );
-
- if ( aindex >= 0 ) {
- pA = prog.getAudio ( aindex );
-
- if ( pA != NULL ) {
- apid = pA->getPID();
- afmt = pA->getFormat();
- }
- }
- mTvEpg.leaveProgram();
- mTvEpg.leaveChannel();
- startPlayTv ( SOURCE_DTV, vpid, apid, vfmt, afmt );
-
- mTvEpg.enterChannel ( channel.getID() );
- mTvEpg.enterProgram ( prog.getID() );
- return 0;
-}
-
-int CTv::getAudioTrackNum ( int progId )
-{
- int iRet, iOutCnt = 0;
- CTvProgram prog;
-
- do {
- if ( 0 > progId ) {
- break;
- }
-
- iRet = CTvProgram::selectByID ( progId, prog );
-
- if ( 0 != iRet ) {
- break;
- }
-
- iOutCnt = prog.getAudioTrackSize();
-
- } while ( false );
-
- return iOutCnt;
-}
-
-int CTv::getAudioInfoByIndex ( int progId, int idx, int *pAFmt, String8 &lang )
-{
- int iRet, iOutRet = -1;
- CTvProgram prog;
- CTvProgram::Audio *pA = NULL;
-
- do {
- if ( NULL == pAFmt || idx < 0 ) {
- break;
- }
-
- iRet = CTvProgram::selectByID ( progId, prog );
-
- if ( 0 != iRet ) {
- break;
- }
-
- if ( idx >= prog.getAudioTrackSize() ) {
- break;
- }
-
- pA = prog.getAudio ( idx );
-
- if ( NULL == pA ) {
- break;
- }
-
- *pAFmt = pA->getFormat();
- lang = pA->getLang();
- } while ( false );
-
- return iOutRet;
-}
-
-int CTv::switchAudioTrack ( int progId, int idx )
-{
- int iOutRet = 0;
- CTvProgram prog;
- CTvProgram::Audio *pAudio = NULL;
- int aPid = -1;
- int aFmt = -1;
-
- do {
- if ( idx < 0 ) {
- break;
- }
-
- iOutRet = CTvProgram::selectByID ( progId, prog );
-
- if ( 0 != iOutRet ) {
- break;
- }
- if(prog.getAudioTrackSize() <= 1) {
- LOGD("%s, just one audio track, not to switch", __FUNCTION__);
- break;
- }
- if ( idx >= prog.getAudioTrackSize() ) {
- break;
- }
-
- pAudio = prog.getAudio ( idx );
-
- if ( NULL == pAudio ) {
- break;
- }
-
- aPid = pAudio->getPID();
- aFmt = pAudio->getFormat();
-
- if ( aPid < 0 || aFmt < 0 ) {
- break;
- }
-
- iOutRet = mAv.SwitchTSAudio (( uint16_t ) aPid, ( AM_AV_AFormat_t ) aFmt );
-
- LOGD ( "%s, iOutRet = %d AM_AV_SwitchTSAudio\n", __FUNCTION__, iOutRet );
- } while ( false );
-
- return iOutRet;
-}
-
-int CTv::ResetAudioDecoderForPCMOutput()
-{
- int iOutRet = 0;
-
- iOutRet = mAv.ResetAudioDecoder ();
- LOGD ( "%s, iOutRet = %d AM_AV_ResetAudioDecoder\n", __FUNCTION__, iOutRet );
- return iOutRet;
-}
-
-int CTv::playDtvProgram ( int mode, int freq, int para1, int para2, int vpid, int vfmt, int apid, int afmt, int pcr)
-{
-
- mFrontDev.setPara ( mode, freq, para1, para2);
- mTvAction = mTvAction | TV_ACTION_PLAYING;
- startPlayTv ( SOURCE_DTV, vpid, apid, vfmt, afmt );
-
- return 0;
-}
-
-
-int CTv::playDtmbProgram ( int progId )
-{
- CTvProgram prog;
- CTvChannel channel;
- int vpid = 0x1fff, apid = 0x1fff, vfmt = -1, afmt = -1;
- int aindex;
- CTvProgram::Audio *pA;
- CTvProgram::Video *pV;
- int ret = CTvProgram::selectByID ( progId, prog );
-
- saveDTVProgramID ( progId );
- prog.getChannel ( channel );
- //音é‡è¡¥å¿
- int chanVolCompValue = 0;
- chanVolCompValue = GetAudioVolumeCompensationVal(progId);
- SetCurProgramAudioVolumeCompensationVal ( chanVolCompValue );
-
- mFrontDev.setPara ( channel.getMode(), channel.getFrequency(), channel.getBandwidth(), 0 );
-
- pV = prog.getVideo();
-
- if ( pV != NULL ) {
- vpid = pV->getPID();
- vfmt = pV->getFormat();
- }
-
- aindex = prog.getCurrAudioTrackIndex();
-
- if ( -1 == aindex ) { //db is default
- aindex = prog.getCurrentAudio ( String8 ( "eng" ) );
-
- if ( aindex >= 0 ) {
- prog.setCurrAudioTrackIndex ( progId, aindex );
- }
- }
-
- if ( aindex >= 0 ) {
- pA = prog.getAudio ( aindex );
-
- if ( pA != NULL ) {
- apid = pA->getPID();
- afmt = pA->getFormat();
- }
- }
-
- mTvEpg.leaveProgram();
- mTvEpg.leaveChannel();
- startPlayTv ( SOURCE_DTV, vpid, apid, vfmt, afmt );
- mTvEpg.enterChannel ( channel.getID() );
- mTvEpg.enterProgram ( prog.getID() );
- return 0;
-}
-
-int CTv::playAtvProgram (int freq, int videoStd, int audioStd, int fineTune)
-{
- mTvAction = mTvAction | TV_ACTION_PLAYING;
-
- //image selecting channel
- mSigDetectThread.requestAndWaitPauseDetect();
- mTvin.Tvin_StopDecoder();
-
- //set CVBS
- int fmt = CFrontEnd::stdEnumToCvbsFmt (videoStd, audioStd);
- mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt );
- m_cur_set_info_fmt = ( tvin_sig_fmt_t )fmt;
-
- v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor (videoStd, audioStd);
- //set TUNER
- mFrontDev.setPara (FE_ANALOG, freq, stdAndColor, fineTune);
-
- if ( fineTune != 0 ) {
- mFrontDev.fineTune ( fineTune / 1000 );
- }
-
- mSigDetectThread.initSigState();
- mSigDetectThread.resumeDetect();
- return 0;
-}
-
-int CTv::resetFrontEndPara ( frontend_para_set_t feParms )
-{
- if ( feParms.mode == FE_ANALOG ) {
- int progID = -1;
- int tmpFreq = feParms.freq;
- int tmpfineFreq = feParms.para2;
- int mode = feParms.mode;
-
- //get tunerStd from videoStd and audioStd
- v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor (feParms.videoStd, feParms.audioStd);
-
- //get program dbID saved by last time,if dbID is -1, it shows program hasn't played
- progID = getATVProgramID();
-
- LOGD("%s, resetFrontEndPara- vstd=%d astd=%d stdandcolor=%lld", __FUNCTION__, feParms.videoStd, feParms.audioStd, stdAndColor);
-
- //judge progID matching db's or not
- CTvProgram prog;
-
- if ( CTvProgram::selectByID ( progID, prog ) != 0 ) {
- LOGE ( "%s, atv progID is not matching the db's\n", __FUNCTION__);
- return 0;
- }
-
- //channel fine tune and save freq, std, fineFreq into DB
- CTvChannel channel;
- prog.upDateChannel ( channel, stdAndColor, tmpFreq, tmpfineFreq );
- mFrontDev.fineTune ( tmpfineFreq / 1000 ); //driver fine tune freq khz
-
-
- //set frontend parameters to tuner dev
- mSigDetectThread.requestAndWaitPauseDetect();
- mTvin.Tvin_StopDecoder();
-
- //set CVBS
- int fmt = CFrontEnd::stdEnumToCvbsFmt (feParms.videoStd, feParms.audioStd );
- mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt );
- m_cur_set_info_fmt = ( tvin_sig_fmt_t )fmt;
-
- //set TUNER
- usleep(400 * 1000);
- mFrontDev.setPara ( FE_ANALOG, tmpFreq, stdAndColor, tmpfineFreq );
- usleep(400 * 1000);
- if ( tmpfineFreq != 0 ) {
- mFrontDev.fineTune ( tmpfineFreq / 1000 );
- }
-
- mSigDetectThread.initSigState();
- mSigDetectThread.resumeDetect();
- } else if ( feParms.mode == FE_DTMB ) {
- mFrontDev.setPara ( FE_DTMB, feParms.freq, feParms.para1, feParms.para2 );
- }
-
- return 0;
-}
-
-int CTv::resetDmxAndAvSource()
-{
- AM_DMX_Source_t curdmxSource;
- mFrontDev.GetTSSource ( &curdmxSource );
- LOGD ( "%s, AM_FEND_GetTSSource %d", __FUNCTION__, curdmxSource );
- mTvDmx.Close();
- AM_DMX_OpenPara_t para;
- memset ( &para, 0, sizeof ( para ) );
- mTvDmx.Open (para);
- mTvDmx.SetSource(curdmxSource );
- AM_AV_TSSource_t ts_source = ( AM_AV_TSSource_t ) curdmxSource;
- mAv.SetTSSource (ts_source );
- return 0;
-}
-
-int CTv::SetCurProgramAudioVolumeCompensationVal ( int tmpVal )
-{
- mTvAudio.SetAudioVolumeCompensationVal ( tmpVal );
- mTvAudio.SetAudioMasterVolume (mTvAudio.GetAudioMasterVolume() );
-
- LOGD ( "%s, VolumeCompensationVal = %d, id = %d\n", __FUNCTION__, tmpVal, m_cur_playing_prog_id );
- CTvProgram prog;
- if ( CTvProgram::selectByID ( m_cur_playing_prog_id, prog ) != 0 ) {
- LOGE ( "%s, atv progID is not matching the db's ret = 0\n", __FUNCTION__ );
- return -1;
- }
-
- if (prog.updateVolComp ( m_cur_playing_prog_id, tmpVal ) != 0 ) {
- LOGE ( "%s, atv progID is not matching the db's\n", __FUNCTION__);
- return -1;
- }
- return 0;
-}
-
-int CTv::GetAudioVolumeCompensationVal(int progxxId)
-{
- int tmpVolValue = 0;
- CTvProgram prog;
- if ( CTvProgram::selectByID ( m_cur_playing_prog_id, prog ) != 0 ) {
- LOGE ( "%s, atv progID is not matching the db's ret = 0\n", __FUNCTION__ );
- return tmpVolValue;
- }
- tmpVolValue = prog.getChanVolume ();
- LOGD ( "%s,progid = %d CompensationVal = %d\n", __FUNCTION__, m_cur_playing_prog_id, tmpVolValue );
- if(tmpVolValue > 20 || tmpVolValue < -20) tmpVolValue = 0;
- return tmpVolValue;
-}
-
-int CTv::startPlayTv ( int source, int vid, int aid, int vfat, int afat )
-{
- int ret = 0;
-
- if ( source == SOURCE_DTV ) {
- AM_FileEcho ( DEVICE_CLASS_TSYNC_AV_THRESHOLD_MIN, AV_THRESHOLD_MIN_MS );
- LOGD ( "%s, startPlayTv", __FUNCTION__);
- mAv.StartTS (vid, aid, ( AM_AV_VFormat_t ) vfat, ( AM_AV_AFormat_t ) afat );
- } else {
-
- }
- return ret;
-}
-
-int CTv::stopPlayingLock()
-{
- AutoMutex lock ( mLock );
- return stopPlaying();
-}
-
-int CTv::stopPlaying()
-{
- if(!(mTvAction & TV_ACTION_PLAYING)) {
- LOGD("%s, stopplay cur action = %x not playing , return", __FUNCTION__, mTvAction);
- return 0;
- }
- mAv.EnableVideoBlackout();
- if(m_source_input == SOURCE_TV) {
- //first mute
- mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE);
- ClearAnalogFrontEnd();
- } else if(m_source_input == SOURCE_DTV) {
- //mFrontDev.setPara(FE_DTMB, 51000000, 0, 0);
- mAv.StopTS ();
- mTvEpg.leaveChannel();
- mTvEpg.leaveProgram();
- }
- mAv.DisableVideoWithBlueColor();
- mTvAction = mTvAction & ~TV_ACTION_PLAYING;
- return 0;
-}
-
-int CTv::getAudioChannel()
-{
- int iRet = -1;
- AM_AOUT_OutputMode_t audioChanneleMod;
- do {
- iRet = mAv.AudioGetOutputMode (&audioChanneleMod );
- if ( AM_SUCCESS != iRet ) {
- LOGD ( "%s, jianfei.lan GetOutputMode is FAILED %d\n", __FUNCTION__, iRet );
- break;
- }
- LOGD ( "%s, jianfei.lan getAudioChannel iRet : %d audioChanneleMod %d\n", __FUNCTION__, iRet, audioChanneleMod );
- } while ( 0 );
- return audioChanneleMod;
-}
-
-int CTv::setAudioChannel ( int channelIdx )
-{
- int iOutRet = 0;
- AM_AOUT_OutputMode_t audioChanneleMod;
- LOGD ( "%s, channelIdx : %d\n", __FUNCTION__, channelIdx );
- audioChanneleMod = ( AM_AOUT_OutputMode_t ) channelIdx;
- iOutRet = mAv.AudioSetOutputMode (audioChanneleMod );
- if ( AM_SUCCESS != iOutRet) {
- LOGD ( "%s, jianfei.lan %s AM_AOUT_SetOutputMode device is FAILED %d\n", __FUNCTION__, "TV", iOutRet );
- }
- return 0;
-}
-
-int CTv::getFrontendSignalStrength()
-{
- int Strength = 0;
- Strength = mFrontDev.getStatus();
- return Strength;
-}
-
-int CTv::getFrontendSNR()
-{
- int snr = 0;
- snr = mFrontDev.getSNR();
- return snr;
-}
-
-int CTv::getFrontendBER()
-{
- int ber = 0;
- ber = mFrontDev.getBER();
- return ber;
-
-}
-
-int CTv::getChannelInfoBydbID ( int dbID, channel_info_t &chan_info )
-{
- CTvProgram prog;
- CTvChannel channel;
- Vector<sp<CTvProgram> > out;
- memset ( &chan_info, sizeof ( chan_info ), 0 );
- chan_info.freq = 44250000;
- chan_info.uInfo.atvChanInfo.videoStd = CC_ATV_VIDEO_STD_PAL;
- chan_info.uInfo.atvChanInfo.audioStd = CC_ATV_AUDIO_STD_DK;
-
- int ret = CTvProgram::selectByID ( dbID, prog );
- if ( ret != 0 ) {
- LOGD ( "getChannelinfo , select dbid=%d,is not exist", dbID);
- return -1;
- }
- prog.getChannel ( channel );
-
- if ( CTvProgram::TYPE_ATV == prog.getProgType() ) {
- chan_info.freq = channel.getFrequency();
- chan_info.uInfo.atvChanInfo.finefreq = channel.getAfcData();
- LOGD("%s, get channel std = %lld", __FUNCTION__, channel.getStd());
- chan_info.uInfo.atvChanInfo.videoStd =
- ( atv_video_std_t ) CFrontEnd::stdAndColorToVideoEnum ( channel.getStd() );
- chan_info.uInfo.atvChanInfo.audioStd =
- ( atv_audio_std_t ) CFrontEnd::stdAndColorToAudioEnum ( channel.getStd() );
- chan_info.uInfo.atvChanInfo.isAutoStd = ((channel.getStd() & V4L2_COLOR_STD_AUTO) == V4L2_COLOR_STD_AUTO) ? 1 : 0;
- } else if ( CTvProgram::TYPE_DTV == prog.getProgType() || CTvProgram::TYPE_RADIO == prog.getProgType()) {
- chan_info.freq = channel.getFrequency();
- chan_info.uInfo.dtvChanInfo.strength = getFrontendSignalStrength();
- chan_info.uInfo.dtvChanInfo.quality = getFrontendSNR();
- chan_info.uInfo.dtvChanInfo.ber = getFrontendBER();
- }
-
- return 0;
-}
-
-bool CTv::Tv_Start_Analyze_Ts ( int channelID )
-{
- int freq, ret;
- CTvChannel channel;
-
- AutoMutex lock ( mLock );
- mAv.StopTS ();
- mAv.DisableVideoWithBlueColor();
- ret = CTvChannel::selectByID ( channelID, channel );
-
- if ( ret != 0 ) {
- LOGD ( "%s, CTv tv_updatats can not get freq by channel ID", __FUNCTION__ );
- return false;
- }
-
- mTvAction = mTvAction | TV_ACTION_SCANNING;
- freq = channel.getFrequency();
- LOGD ( "%s, the freq = %d", __FUNCTION__, freq );
- mDtvScanRunningStatus = DTV_SCAN_RUNNING_ANALYZE_CHANNEL;
- mTvScanner.setObserver ( &mTvMsgQueue );
- mTvScanner.manualDtmbScan ( freq, freq ); //dtmb
- return true;
-}
-
-bool CTv::Tv_Stop_Analyze_Ts()
-{
- stopScanLock();
- return true;
-}
-
-
-int CTv::saveATVProgramID ( int dbID )
-{
- config_set_int ( "TV", "atv.get.program.id", dbID );
- return 0;
-}
-
-int CTv::getATVProgramID ( void )
-{
- return config_get_int ( "TV", "atv.get.program.id", -1 );
-}
-
-int CTv::saveDTVProgramID ( int dbID )
-{
- config_set_int ( "TV", "dtv.get.program.id", dbID );
- return 0;;
-}
-
-int CTv::getDTVProgramID ( void )
-{
- return config_get_int ( "TV", "dtv.get.program.id", -1 );
-}
-
-int CTv::getATVMinMaxFreq ( int *scanMinFreq, int *scanMaxFreq )
-{
- int tmpVal, i = 0;
- const char *config_value;
- const char *strDelimit = ",";
- char *token = NULL;
-
- *scanMinFreq = 44250000;
- *scanMaxFreq = 868250000;
-
- config_value = config_get_str ( "ATV", "atv.get.min.max.freq", "null" );
-
- if ( strcmp ( config_value, "null" ) == 0 ) {
- LOGD ( "%s, atv.get.min.max.freq not set config\n", __FUNCTION__ );
- return -1;
- }
-
- char data_str[512];
- memset ( ( void * ) data_str, 0, sizeof ( data_str ) );
- strncpy ( data_str, config_value, sizeof ( data_str ) - 1 );
-
- token = strtok ( data_str, strDelimit );
- sscanf ( token, "%d", scanMinFreq );
- token = strtok ( NULL, strDelimit );
-
- if ( token != NULL ) {
- sscanf ( token, "%d", scanMaxFreq );
- return 0;
- }
- return 0;
-}
-
-int CTv::IsDVISignal()
-{
- return ( ( TVIN_SIG_FMT_NULL != mSigDetectThread.getCurSigInfo().fmt ) && ( mSigDetectThread.getCurSigInfo().reserved & 0x1 ) );
-}
-
-int CTv::getHDMIFrameRate()
-{
- int ConstRate[5] = {24, 25, 30, 50, 60};
- float ConstRateDiffHz[5] = {0.5, 0.5, 0.5, 2, 2}; //å差值
- int fps = mSigDetectThread.getCurSigInfo().fps;
- int i = 0;
- for(; i < 5; i++) {
- if(abs(ConstRate[i] - fps) < ConstRateDiffHz[i])
- fps = ConstRate[i];
- }
- return fps;
-}
-
-tv_source_input_t CTv::GetLastSourceInput ( void )
-{
- return m_last_source_input;
-}
-
-int CTv::isVgaFmtInHdmi ( void )
-{
- tvin_sig_fmt_t fmt = mSigDetectThread.getCurSigInfo().fmt;
-
- if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_HDMI ) {
- return -1;
- }
-
- return CTvin::isVgaFmtInHdmi ( fmt );
-}
-
-int CTv::SetBypassModulesFor3D ( VIDEO_3D_MODE_E mode )
-{
- LOGD ( "%s, ----> Set mode(%d) <----", __FUNCTION__, mode );
- const char *config_value = NULL;
-
- int DIBypassAllFlag = 0;
- config_value = config_get_str ( "TV", "tvin.di.bypass_all", "null" );//bypass , if
- if (strcasecmp(config_value, "true") == 0 || strcasecmp(config_value, "1") == 0) {
- DIBypassAllFlag = 1;
- } else {
- DIBypassAllFlag = 0;
- }
-
-
- switch (mode) {
- case VIDEO_3D_MODE_DISABLE: {
- mTvin.VDIN_SetDIBypassAll ( 0 );
- mTvin.VDIN_SetDIBypassPost ( 0 );
- // mTvin.VDIN_SetDISip_Top_Bot ( 0 );
- }
- break;
- case VIDEO_3D_MODE_AUTO: {
- mTvin.VDIN_SetDIBypassAll ( 0 );
- mTvin.VDIN_SetDIBypassPost ( 1 );
- // mTvin.VDIN_SetDISip_Top_Bot ( 0 );
-
-
- }
- break;
- case VIDEO_3D_MODE_LR:
- case VIDEO_3D_MODE_TB: {
- mTvin.VDIN_SetDIBypassPost ( 1 );
- usleep ( 20 * 1000 );
- mTvin.VDIN_SetDIBypassAll ( 1 | DIBypassAllFlag );
- //mTvin.VDIN_SetDISip_Top_Bot ( 1 );
- }
- break;
- case VIDEO_3D_MODE_LA:
- case VIDEO_3D_MODE_FA: {
- mTvin.VDIN_SetDIBypassPost ( 1 );
- usleep ( 20 * 1000 );
- mTvin.VDIN_SetDIBypassAll ( 0 );
- //mTvin.VDIN_SetDISip_Top_Bot ( 0 );
- }
- break;
- default:
- break;
- }
-
- if (CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_DTV ) {
- if ( mode == VIDEO_3D_MODE_DISABLE ) {
- mTvin.VDIN_SetVdinFlag ( MEMP_DCDR_WITHOUT_3D );
- } else {
- mTvin.VDIN_SetVdinFlag ( MEMP_DCDR_WITH_3D );
- }
- } else {
- if ( mode == VIDEO_3D_MODE_DISABLE ) {
- if ( m_source_input == SOURCE_TV ) {
- mTvin.VDIN_SetVdinFlag ( MEMP_ATV_WITHOUT_3D );
- } else {
- mTvin.VDIN_SetVdinFlag ( MEMP_VDIN_WITHOUT_3D );
- }
- } else {
- if ( m_source_input == SOURCE_TV ) {
- mTvin.VDIN_SetVdinFlag ( MEMP_ATV_WITH_3D );
- } else {
- mTvin.VDIN_SetVdinFlag ( MEMP_VDIN_WITH_3D );
- }
- }
- }
-
- return 0;
-}
-
-void CTv::print_version_info ( void )
-{
- // print tvapi version info
- LOGD ( "libtvservice git branch:%s\n", tvservice_get_git_branch_info() );
- LOGD ( "libtvservice git version:%s\n", tvservice_get_git_version_info() );
- LOGD ( "libtvservice Last Changed:%s\n", tvservice_get_last_chaned_time_info() );
- LOGD ( "libtvservice Last Build:%s\n", tvservice_get_build_time_info() );
- LOGD ( "libtvservice Builer Name:%s\n", tvservice_get_build_name_info() );
- LOGD ( "libtvservice board version:%s\n", tvservice_get_board_version_info() );
- LOGD ( "\n\n");
- // print dvb version info
- LOGD ( "libdvb git branch:%s\n", dvb_get_git_branch_info() );
- LOGD ( "libdvb git version:%s\n", dvb_get_git_version_info() );
- LOGD ( "libdvb Last Changed:%s\n", dvb_get_last_chaned_time_info() );
- LOGD ( "libdvb Last Build:%s\n", dvb_get_build_time_info() );
- LOGD ( "libdvb Builer Name:%s\n", dvb_get_build_name_info() );
-}
-
-int CTv::Tvin_GetTvinConfig ( void )
-{
- const char *config_value;
- int i = 0;
-
- config_value = config_get_str ( "TV", "tvin.overscan.3d", "null" );
-
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- gTvinConfig.overscan_3d = 1;
- } else {
- gTvinConfig.overscan_3d = 0;
- }
-
- config_value = config_get_str ( "TV", "tvin.tv.out.counter", "null" );
- gTvinConfig.tv_out_counter = ( unsigned int ) strtol ( config_value, NULL, 6 );
-
- if ( gTvinConfig.tv_out_counter <= 0 || gTvinConfig.tv_out_counter > 8 ) {
- gTvinConfig.tv_out_counter = 6;
- }
-
- config_value = config_get_str ( "TV", "tvin.kernelpet_disable", "null" );
-
- if ( strcmp ( config_value, "disable" ) == 0 ) {
- gTvinConfig.kernelpet_disable = true;
- } else {
- gTvinConfig.kernelpet_disable = false;
- }
-
- config_value = config_get_str ( "TV", "tvin.kernelpet.timeout", "null" );
- gTvinConfig.userpet_timeout = ( unsigned int ) strtol ( config_value, NULL, 10 );
-
- if ( gTvinConfig.kernelpet_timeout <= 0 || gTvinConfig.kernelpet_timeout > 40 ) {
- gTvinConfig.kernelpet_timeout = 10;
- }
-
-
- config_value = config_get_str ( "TV", "tvin.userpet", "null" );
-
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- gTvinConfig.userpet = true;
- } else {
- gTvinConfig.userpet = false;
- }
-
- config_value = config_get_str ( "TV", "tvin.userpet.timeout", "null" );
- gTvinConfig.userpet_timeout = ( unsigned int ) strtol ( config_value, NULL, 10 );
-
- if ( gTvinConfig.userpet_timeout <= 0 || gTvinConfig.userpet_timeout > 100 ) {
- gTvinConfig.userpet_timeout = 10;
- }
-
- config_value = config_get_str ( "TV", "tvin.userpet.reset", "null" );
-
- if ( strcmp ( config_value, "disable" ) == 0 ) {
- gTvinConfig.userpet_reset = 0;
- } else {
- gTvinConfig.userpet_reset = 1;
- }
-
- config_value = config_get_str ( "TV", "tvin.title_shake", "null" );
-
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- gTvinConfig.title_shake = true;
- } else {
- gTvinConfig.title_shake = false;
- }
-
- return 0;
-}
-
-int CTv::SetAudioMainVolLutBufName()
-{
- int i = 0;
- const char *tmp_ptr = NULL;
- int get_type_buf[6] = { CC_GET_LUT_TV, CC_GET_LUT_AV, CC_GET_LUT_COMP, CC_GET_LUT_HDMI, CC_GET_LUT_VGA, CC_GET_LUT_MPEG };
- const char *end_str_buf[6] = { ".tv", ".av", ".comp", ".hdmi", ".vga", ".mpeg", };
- project_info_t tmp_info;
- char tmp_buf[128];
- char value_buf[128];
- char key_buf[128];
-
- int name_en = GetAudioMainVolLutBufNameModifyEnableCFG();
-
- if (name_en == 1) {
- strcpy(tmp_buf, "null");
- if (GetProjectInfo(&tmp_info) == 0) {
- strncpy(tmp_buf, tmp_info.amp_curve_name, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
- }
-
- if (strcmp(tmp_buf, "null") != 0) {
- for ( i = 0; i < 6; i++ ) {
- memset(value_buf, '\0', sizeof(value_buf));
- memset(key_buf, '\0', sizeof(key_buf));
-
- GetAudioMainVolLutBufNameCFG(get_type_buf[i], key_buf);
-
- strcpy(value_buf, tmp_buf);
- strcat(value_buf, end_str_buf[i]);
-
- tmp_ptr = config_get_str("TV", key_buf, "null");
- if (strcmp(tmp_ptr, value_buf) != 0) {
- config_set_str("TV", key_buf, value_buf);
- LOGD("%s, config string now set as: %s \n", __FUNCTION__, value_buf);
- } else {
- LOGD("%s, config string has been set as: %s \n", __FUNCTION__, value_buf);
- }
- }
- }
- }
-
- return 0;
-}
-
-int CTv::SetAudioSupperBassVolLutBufName()
-{
- int i = 0;
- const char *tmp_ptr = NULL;
- int get_type_buf[6] = { CC_GET_LUT_TV, CC_GET_LUT_AV, CC_GET_LUT_COMP, CC_GET_LUT_HDMI, CC_GET_LUT_VGA, CC_GET_LUT_MPEG };
- const char *end_str_buf[6] = { ".tv", ".av", ".comp", ".hdmi", ".vga", ".mpeg", };
- project_info_t tmp_info;
- char tmp_buf[128];
- char value_buf[128];
- char key_buf[128];
-
- int name_en = GetAudioSupperBassVolLutBufNameModifyEnableCFG();
-
- if (name_en == 1) {
- strcpy(tmp_buf, "null");
- if (GetProjectInfo(&tmp_info) == 0) {
- strncpy(tmp_buf, tmp_info.amp_curve_name, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
- }
-
- if (strcmp(tmp_buf, "null") != 0) {
- for ( i = 0; i < 6; i++ ) {
- memset(value_buf, '\0', sizeof(value_buf));
- memset(key_buf, '\0', sizeof(key_buf));
-
- GetAudioSupperBassVolLutBufNameCFG(get_type_buf[i], key_buf);
-
- strcpy(value_buf, tmp_buf);
- strcat(value_buf, ".sup");
- strcat(value_buf, end_str_buf[i]);
-
- tmp_ptr = config_get_str("TV", key_buf, "null");
- if (strcmp(tmp_ptr, value_buf) != 0) {
- config_set_str("TV", key_buf, value_buf);
- LOGD("%s, config string now set as: %s \n", __FUNCTION__, value_buf);
- } else {
- LOGD("%s, config string has been set as: %s \n", __FUNCTION__, value_buf);
- }
- }
- }
- }
-
- return 0;
-}
-
-TvRunStatus_t CTv::GetTvStatus()
-{
- return mTvStatus;
-}
-
-int CTv::OpenTv ( void )
-{
- int tmp_val = 0;
- const char *value;
- //reboot system by fbc setting.
- value = config_get_str ( "TV", "fbc.get.panelinfo", "null" );
- LOGD("%s fbc-------------------\n", value);
- if ( strcmp ( value, "edid" ) == 0 ) {
- if(reboot_sys_by_fbc_edid_info() == 0) {
- }
- } else if ( strcmp ( value, "uart" ) == 0 ) {
- if(reboot_sys_by_fbc_uart_panel_info() == 0) {
- }
- }
-
- LOGD ( "%s, tv open\n", __FUNCTION__);
- char prop_value[PROPERTY_VALUE_MAX];
- memset ( prop_value, '\0', PROPERTY_VALUE_MAX );
-
- mTvin.Tvin_LoadSourceInputToPortMap();
-
- SSMSave3DLRSwitch ( 0 );
- SSMSave3DTO2D ( 0 );
- //
- SSMHandlePreCopying();
- if ( SSMDeviceMarkCheck() < 0 ) {
- SSMRestoreDeviceMarkValues();
- Tv_SSMRestoreDefaultSetting();
- }
- mTvin.OpenTvin();
- mTvin.init_vdin();
- mTvin.Tv_init_afe();
- mVpp.Vpp_Init();
- SetAudioSupperBassVolLutBufName();
- SetAudioMainVolLutBufName();
- mTvAudio.AudioCtlInitializeLoad();
-
- SSMSetHDCPKey();
- system ( "/system/bin/dec" );
-
- //set color filter
- // SetFileAttrValue ( "/sys/module/amvideo/parameters/filt_mode", "0x2100" );
-
- if ( gTvinConfig.title_shake) {
- SetFileAttrValue ( "/sys/module/di/parameters/di_new_mode_mask", "0x10000" );
- }
-
- value = config_get_str ( "TV", "tvin.autoset.displayfreq", "null" );
-
- if ( strcmp ( value, "enable" ) == 0 ) {
- m_autoset_displayfreq = true;
- } else {
- m_autoset_displayfreq = false;
- }
-
- if (mTvin.VDIN_GetDisplayVFreq() == 30) {
- m_autoset_displayfreq = false;
- }
-
- if (GetPlatformHaveDDFlag() == 1) {
- SetFileAttrValue ("/sys/module/tvin_hdmirx/parameters/edid_mode", "0x109");
- }
-
- value = config_get_str ( "TV", "ssm.handle.hdmi.edid.en", "null" );
-
- if ( strtoul(value, NULL, 10) == 1 ) {
- LOGD( "%s, get config \"%s\" is \"%s\".\n",
- __FUNCTION__, "ssm.handle.hdmi.edid.en", value );
- //get hdmi edid use mode
- char prop_value[256];
- memset( prop_value, '\0', 256 );
- property_get( "ubootenv.var.outputmode", prop_value, "null" );
- LOGD( "%s, get property \"%s\" is \"%s\".\n",
- __FUNCTION__, "ubootenv.var.outputmode", prop_value );
- if ( strcmp ( prop_value, "null" ) != 0 ) {
- config_set_str ( "TV", "ssm.handle.hdmi.edid.use", prop_value );
- int i;
- char edid_path[256];
- char edid_path_cfg[256];
- //set file's path for hdmi edid of each port
- for ( i = 1; i <= SSM_HDMI_PORT_MAX; i++ ) {
- memset( edid_path, '\0', 256 );
- memset( edid_path_cfg, '\0', 256 );
- sprintf ( edid_path, "/system/etc/%s_port%d.bin", prop_value, i );
- sprintf ( edid_path_cfg, "ssm.handle.hdmi.port%d.edid.file.path", i );
- config_set_str ( "TV", edid_path_cfg, edid_path );
- }
- } else {
- //set default hdmi edid
- config_set_str ( "TV", "ssm.handle.hdmi.edid.use", "hdmi_edid" );
- int i;
- char edid_path[256];
- char edid_path_cfg[256];
- //set file's path for hdmi edid of each port
- for ( i = 1; i <= SSM_HDMI_PORT_MAX; i++ ) {
- memset( edid_path, '\0', 256 );
- memset( edid_path_cfg, '\0', 256 );
- sprintf ( edid_path, "/system/etc/%s_port%d.bin", "hdmi_edid", i );
- sprintf ( edid_path_cfg, "ssm.handle.hdmi.port%d.edid.file.path", i );
- config_set_str ( "TV", edid_path_cfg, edid_path );
- }
- }
- m_is_set_hdmi_edid = true;
- }
- //
- unsigned char val = 0;
- Tvin_GetTvinConfig();
- m_last_source_input = SOURCE_INVALID;
- m_source_input = SOURCE_INVALID;
- m_mode_3d = VIDEO_3D_MODE_DISABLE;
- m_is_hdmi_sr_detect_start = false;
- m_hdmi_sampling_rate = 0;
- int8_t blackout_enable;
- SSMReadBlackoutEnable(&blackout_enable);
- m_blackout_enable = blackout_enable;
-
-
- //
- //dtv init
- int rt = -1;
- //opendemux();
- rt = mFrontDev.Open(FE_ANALOG);
- mFrontDev.autoLoadFE();
- AM_DMX_OpenPara_t para_dmx;
- memset ( &para_dmx, 0, sizeof ( AM_DMX_OpenPara_t ) );
- mTvDmx.Open(para_dmx );
- mTvDmx.SetSource (AM_DMX_SRC_TS2);
- mAv.Open();
- mTvEpg.Init ( 0, 0, 1, "eng zho chi", "GB2312" );
- resetDmxAndAvSource();
- mSourceConnectDetectThread.startDetect();
-
- if (SSMReadSerialCMDSwitchValue() == 1) {
- SetSerialSwitch(SERIAL_A, 1);
- }
- mTvin.VDIN_SetVdinFlag ( MEMP_DCDR_WITHOUT_3D );
- mTvin.VDIN_SetMVCViewMode(0);//for not 3d screen
- ClearAnalogFrontEnd();
-
- mTvStatus = TV_OPEN_ED;
-
- mHDMIRxCEC.start();
-
- return 0;
-}
-
-int CTv::CloseTv ( void )
-{
- LOGD ( "tv close");
- mSigDetectThread.stopDetect();
- if (mpUpgradeFBC != NULL) {
- mpUpgradeFBC->stop();
- }
- mTvin.Tv_uninit_afe();
- mTvin.uninit_vdin();
- mVpp.Vpp_Uninit();
- TvMisc_DisableWDT ( gTvinConfig.userpet );
- mTvStatus = TV_CLOSE_ED;
- return 0;
-}
-
-
-int CTv::StartTvLock ()
-{
- LOGD ( "%s, tv start status = %d", __FUNCTION__, mTvStatus);
- if(mTvStatus == TV_START_ED)
- return 0;
-
- Mutex::Autolock _l ( mLock );
- mTvAction = mTvAction | TV_ACTION_STARTING;
- mTvAudio.SwitchAVOutBypass(0);
- mTvAudio.AudioCtlInit();
- mFrontDev.Open(FE_ANALOG);
- mSigDetectThread.startDetect();
- mSigDetectThread.pauseDetect();
- mSigDetectThread.initSigState();
- mTvMsgQueue.startMsgQueue();
- resetDmxAndAvSource();
- Vpp_SetDisplayMode ( mVpp.Tv_GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt);
- TvMisc_EnableWDT ( gTvinConfig.kernelpet_disable, gTvinConfig.userpet, gTvinConfig.kernelpet_timeout, gTvinConfig.userpet_timeout, gTvinConfig.userpet_reset );
- am_phase_t am_phase;
- if (mVpp.getPqData()->PQ_GetPhaseArray ( &am_phase ) == 0 ) {
- mTvin.TvinApi_SetCompPhase(am_phase);
- }
- mTvin.TvinApi_SetCompPhaseEnable ( 1 );
- mTvin.VDIN_EnableRDMA ( 1 );
- mTvin.VDIN_SetDIBypasshd ( 0 );
-
- SetBypassModulesFor3D ( VIDEO_3D_MODE_DISABLE );
- //win pos
- tvin_window_pos_t win_pos;
- Vpp_GetDisplayResolutionInfo(&win_pos);
- SetPreviewWindow ( win_pos );
-
- mTvin.Tvin_RemovePath ( TV_PATH_TYPE_TVIN );
- if ( mTvin.Tvin_RemovePath ( TV_PATH_TYPE_DEFAULT ) ) {
- mTvin.Tvin_AddPath ( TV_PATH_DECODER_NEW3D_WITHOUTPPMGR_AMVIDEO );
- }
- mTvin.VDIN_SetVdinFlag ( MEMP_DCDR_WITHOUT_3D );
-
- mAv.SetVideoWindow (0, 0, 0, 0 );
-
- mTvAction = mTvAction & ~TV_ACTION_STARTING;
- mTvStatus = TV_START_ED;
- return 0;
-}
-int CTv::StopTvLock ( void )
-{
- LOGD("%s, call Tv_Stop status = %d \n", __FUNCTION__, mTvStatus);
- const char *value;
- Mutex::Autolock _l ( mLock );
- //we should stop audio first for audio mute.
- mTvAction = mTvAction | TV_ACTION_STOPING;
- mSigDetectThread.requestAndWaitPauseDetect();
- mAv.EnableVideoBlackout();
- //stop scan if scanning
- if(mTvAction & TV_ACTION_SCANNING) {
- LOGD("%s, scanning first stop it\n", __FUNCTION__)
- mTvEpg.leaveChannel();
- mTvScanner.stopScan();
- mTvAction = mTvAction & ~TV_ACTION_SCANNING;
- }
- //first stop play(if playing)
- stopPlaying();
- //
- mTvAudio.SwitchAVOutBypass(0);
- tv_audio_channel_e audio_channel = mTvin.Tvin_GetInputSourceAudioChannelIndex (SOURCE_MPEG);
- mTvAudio.AudioLineInSelectChannel( audio_channel );
- mTvAudio.AudioCtlUninit();
- mTvin.Tvin_StopDecoder();
- mTvin.Tvin_RemovePath ( TV_PATH_TYPE_TVIN );
- Tv_Set3DMode(VIDEO_3D_MODE_DISABLE);
- mTvAudio.SetAudioMuteForTv ( CC_AUDIO_UNMUTE );
- tvin_window_pos_t win_pos;
- Vpp_GetDisplayResolutionInfo(&win_pos);
- SetPreviewWindow (win_pos );
- mVpp.Tv_LoadVppSettings ( SOURCE_TYPE_MPEG, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D );
- Vpp_SetDisplayMode ( mVpp.Tv_GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(SOURCE_MPEG) ), CTvin::Tvin_SourceInputToSourceInputType(SOURCE_MPEG), mSigDetectThread.getCurSigInfo().fmt);
- RefreshAudioMasterVolume ( SOURCE_MPEG );
- mVpp.VPP_SetVideoCrop ( 0, 0, 0, 0 );
- m_last_source_input = SOURCE_INVALID;
- m_source_input = SOURCE_INVALID;
- mAv.DisableVideoWithBlackColor();
- mAv.ClearVideoBuffer();
- mFrontDev.Close();
- mTvAction = mTvAction & ~TV_ACTION_STOPING;
- mTvStatus = TV_STOP_ED;
- value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" );
- if ( strcmp ( value, "enable" ) == 0 ) {
- property_set("audio.tv_open.flg", "0");
- }
-
- Tv_SetDDDRCMode(SOURCE_MPEG);
- return 0;
-}
-
-int CTv::Tv_MiscSetBySource ( tv_source_input_t source_input )
-{
- int ret = -1;
-
- switch ( source_input ) {
- case SOURCE_TV:
- ret = SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "4" );
- break;
-
- case SOURCE_HDMI1:
- case SOURCE_HDMI2:
- case SOURCE_HDMI3:
- //ret = mVpp.Tv_SavePanoramaMode ( VPP_PANORAMA_MODE_FULL, SOURCE_TYPE_HDMI );
- ret |= SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "5" );
- break;
-
- case SOURCE_DTV:
- if ( m_autoset_displayfreq) {
- ret = mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution() , mIsFbc);
- }
-
- case SOURCE_AV1:
- case SOURCE_AV2:
- case SOURCE_VGA:
- ret |= SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "5" );
- break;
-
- case SOURCE_SVIDEO:
- case SOURCE_IPTV:
- default:
- ret |= SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "5" );
- break;
- }
-
- return ret;
-}
-
-int CTv::SetSourceSwitchInput (tv_source_input_t source_input )
-{
- Mutex::Autolock _l ( mLock );
- LOGD ( "%s, source input = %d", __FUNCTION__, source_input );
- tv_source_input_t cur_source_input = m_source_input;
- tvin_port_t cur_port;
-
- Tv_SetDDDRCMode(source_input);
-
- if (source_input == cur_source_input ) {
- LOGW ( "%s,same input change display mode", __FUNCTION__ );
- return 0;
- }
-
- //if HDMI, need to set EDID of each port
- if (m_is_set_hdmi_edid) {
- int tmp_ret = 0;
- switch ( source_input ) {
- case SOURCE_HDMI1:
- tmp_ret = SSMSetHDMIEdid(1);
- break;
- case SOURCE_HDMI2:
- tmp_ret = SSMSetHDMIEdid(2);
- break;
- case SOURCE_HDMI3:
- tmp_ret = SSMSetHDMIEdid(3);
- break;
- default:
- tmp_ret = -1;
- break;
- }
- if (tmp_ret < 0)
- LOGE ( "%s, do not set hdmi port%d edid.ret=%d", __FUNCTION__, source_input - 4, tmp_ret );
- }
- mTvAction = mTvAction | TV_ACTION_SOURCE_SWITCHING;
- m_cur_playing_prog_id = -1;
- //
- CMessage msg;
- msg.mType = CTvMsgQueue::TV_MSG_CHECK_FE_DELAY;
- msg.mpData = this;
- msg.mDelayMs = 3500;//ms
- mTvMsgQueue.removeMsg ( msg );
- //mute first
- mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE);
- mSigDetectThread.requestAndWaitPauseDetect();
- mAv.DisableVideoWithBlueColor();
- //enable blackout, when play,disable it
- mAv.EnableVideoBlackout();
- //set front dev mode
- if ( source_input == SOURCE_TV ) {
- mFrontDev.Close();
- mFrontDev.Open(FE_ANALOG);
- //mFrontDev.setMode ( FE_ANALOG );
- } else if ( source_input == SOURCE_DTV ) {
- mFrontDev.Close();
- mFrontDev.Open(FE_ANALOG);
- //mFrontDev.setMode ( FE_DTMB);
- } else {
- mFrontDev.Close();
- }
-
- //ok
- m_last_source_input = m_source_input;
- m_source_input = source_input;
- SSMSaveSourceInput ( source_input );
-
- tv_source_input_t pre_source_input = cur_source_input;//change
- cur_source_input = source_input;
-
- mTvAudio.SetAudioVolumeCompensationVal ( 0 );
-
- if ( source_input == SOURCE_DTV ) {
- //we should stop audio first for audio mute.
- mTvAudio.SwitchAVOutBypass(0);
- tv_audio_channel_e audio_channel = mTvin.Tvin_GetInputSourceAudioChannelIndex (SOURCE_MPEG);
- mTvAudio.AudioLineInSelectChannel( audio_channel );
- mTvAudio.AudioCtlUninit();
- //
- mTvin.Tvin_StopDecoder();
- mTvin.Tvin_RemovePath ( TV_PATH_TYPE_TVIN );
- Tv_Set3DMode(VIDEO_3D_MODE_DISABLE);
- //double confirm we set the main volume lut buffer to mpeg
- RefreshAudioMasterVolume ( SOURCE_MPEG );
- mTvAudio.AudioDataInitForDtv();
- mTvin.setMpeg2Vdin(1);
- mVpp.Tv_LoadVppSettings ( SOURCE_TYPE_DTV, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D );
- } else {
- mTvin.setMpeg2Vdin(0);
- mTvin.Tvin_AddPath ( TV_PATH_VDIN_NEW3D_WITHOUTPPMGR_AMVIDEO );
- mTvin.VDIN_SetVdinFlag ( MEMP_VDIN_WITHOUT_3D );
- }
- cur_port = mTvin.Tvin_GetSourcePortBySourceInput ( cur_source_input );
- Tv_MiscSetBySource ( source_input );
-
- //only DTV->TVIN or TVIN->DTV need start resource detect thread
- if ( ( pre_source_input == SOURCE_DTV || cur_source_input == SOURCE_DTV ) && ( cur_source_input != pre_source_input ) ) {
- LOGD ( "%s, dtv need resource detect\n", __FUNCTION__ );
- int isNeedCheckD2D3 = ( gTvinConfig.memory512m) ? 1 : 0;
- static int sigchkcnt = 0;
- while ( true ) {
- if ( ( mTvin.Tvin_CheckPathActive ( TV_PATH_TYPE_DEFAULT, isNeedCheckD2D3 ) == TV_PATH_STATUS_INACTIVE )
- && ( mTvin.Tvin_CheckPathActive ( TV_PATH_TYPE_TVIN, isNeedCheckD2D3 ) == TV_PATH_STATUS_INACTIVE ) ) {
- LOGD("%s, path check is ok, and break\n", __FUNCTION__)
- break;
- } else {
- if(sigchkcnt++ > 20) {
- sigchkcnt = 0;
- break;
- }
-
- LOGW ( "%s,resource is busy.", __FUNCTION__);
- }
- }//while
- }//if need check,and check return
-
- if ( source_input != SOURCE_DTV ) {
- // Uninit data
- mTvAudio.AudioDataUnInit();
- if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3 ||
- source_input == SOURCE_MPEG || source_input == SOURCE_DTV ) {
- mTvAudio.SwitchAVOutBypass(0);
- } else {
- mTvAudio.SwitchAVOutBypass(1);
- }
-
- tv_audio_channel_e audio_channel = mTvin.Tvin_GetInputSourceAudioChannelIndex (source_input);
- mTvAudio.AudioLineInSelectChannel( audio_channel );
-
- Tv_SetAudioInSource ( source_input );
- if ( source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3 ) {
- m_is_hdmi_sr_detect_start = true;
- m_hdmi_sampling_rate = 0;
- } else {
- mTvAudio.AudioDataInit ( 48000, true );
- audio_sr = 48000;
- }
- //===========================================
- if ( mTvin.SwitchPort ( cur_port ) == 0 ) { //ok
- //==========================================
- SSMSave3DDepth ( 0 );
- mTvin.Tvin_SetDepthOf2Dto3D ( 0 ); // set default depth
- Tv_Set3DMode(VIDEO_3D_MODE_DISABLE);
- SSMSave3DLRSwitch ( 0 );
- SSMSave3DTO2D (0);
-
- //for HDMI source connect detect
- mTvin.VDIN_OpenHDMIPinMuxOn(true);
- mTvAudio.AudioSetRecordDataZero ( false ); //make AudioRecord data avaliable
- mVpp.Vpp_ResetLastVppSettingsSourceType();
- //==========================================
- m_sig_stable_nums = 0;
- mSigDetectThread.initSigState();
- if(source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
- mSigDetectThread.setVdinNoSigCheckKeepTimes(5000, true);
- } else {
- mSigDetectThread.setVdinNoSigCheckKeepTimes(3000, true);
- }
- mSigDetectThread.resumeDetect();
- } else {
- }
- }
-
- Tv_SetAudioSourceType(source_input);
- RefreshAudioMasterVolume(source_input);
- Tv_SetAudioOutputSwap_Type(source_input);
-
- mTvAction = mTvAction & ~ TV_ACTION_SOURCE_SWITCHING;
- return 0;
-}
-
-void CTv::onSigToStable()
-{
- if ( ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_TV ) ) {
- mSigDetectThread.getCurSigInfo().fmt = m_cur_set_info_fmt;
- }
- if ( m_autoset_displayfreq) {
- if ( CTvin::Tvin_is50HzFrameRateFmt ( mSigDetectThread.getCurSigInfo().fmt ) ) {
- mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution(), mIsFbc );
- LOGD ( "%s, SetDisplayVFreq 50HZ.", __FUNCTION__);
- } else {
- mTvin.VDIN_SetDisplayVFreq ( 60, mAv.getVideoDisplayResolution(), mIsFbc );
- LOGD ( "%s, SetDisplayVFreq 60HZ.", __FUNCTION__);
- }
- }
- //showbo mark hdmi auto 3d, tran fmt is 3d, so switch to 3d
- LOGD("hdmi trans_fmt = %d", mSigDetectThread.getCurSigInfo().trans_fmt);
- if (mSigDetectThread.getCurSigInfo().trans_fmt != TVIN_TFMT_2D) {
- Tv_Set3DMode(VIDEO_3D_MODE_AUTO);
- }
-
- LOGD("onSigToStable --- trans_fmt = %d", mSigDetectThread.getCurSigInfo().trans_fmt);
- //load pq parameters
- mVpp.Tv_LoadVppSettings (CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt );
-
- if ( m_win_mode == PREVIEW_WONDOW ) {
- mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2);
- mAv.setVideoScreenMode ( CAv::VIDEO_WIDEOPTION_FULL_STRETCH );
- } else {
- Vpp_SetDisplayMode ( mVpp.Tv_GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt);
- }
- m_sig_stable_nums = 0;
-
-}
-void CTv::onSigStableToUnstable()
-{
- LOGD ( "%s, stable to unstable\n", __FUNCTION__);
- mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE);
- mAv.DisableVideoWithBlackColor();
- mTvin.Tvin_StopDecoder();
-}
-void CTv::onSigStableToUnSupport()
-{
- mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE);
- mAv.DisableVideoWithBlackColor();
- mTvin.Tvin_StopDecoder();
-
- tvin_info_t info = mSigDetectThread.getCurSigInfo();
- TvEvent::SignalInfoEvent ev;
- ev.mTrans_fmt = info.trans_fmt;
- ev.mFmt = info.fmt;
- ev.mStatus = info.status;
- ev.mReserved = info.reserved;
- sendTvEvent ( ev );
- LOGD ( "%s, Enable blackscreen for signal change in StableToUnSupport!", __FUNCTION__ );
-}
-void CTv::onSigStableToNoSig()
-{
- mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE);
- mAv.DisableVideoWithBlueColor();
- //SetAudioMuteForTv(CC_AUDIO_MUTE);
- mTvin.Tvin_StopDecoder();
-
- tvin_info_t info = mSigDetectThread.getCurSigInfo();
- TvEvent::SignalInfoEvent ev;
- ev.mTrans_fmt = info.trans_fmt;
- ev.mFmt = info.fmt;
- ev.mStatus = info.status;
- ev.mReserved = info.reserved;
- sendTvEvent ( ev );
- LOGD ( "%s, Enable bluescreen for signal change in StableToNoSig!", __FUNCTION__);
-}
-void CTv::onSigUnStableToUnSupport()
-{
- mAv.DisableVideoWithBlackColor();
- mTvin.Tvin_StopDecoder();
- tvin_info_t info = mSigDetectThread.getCurSigInfo();
-
-
- TvEvent::SignalInfoEvent ev;
- ev.mTrans_fmt = info.trans_fmt;
- ev.mFmt = info.fmt;
- ev.mStatus = info.status;
- ev.mReserved = info.reserved;
- sendTvEvent ( ev );
- LOGD ( "%s, Enable blackscreen for signal change in UnStableToUnSupport!", __FUNCTION__);
-}
-void CTv::onSigUnStableToNoSig()
-{
- mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE);
- mAv.DisableVideoWithBlueColor();
- //SetAudioMuteForTv(CC_AUDIO_MUTE);
- mTvin.Tvin_StopDecoder();
-
- tvin_info_t info = mSigDetectThread.getCurSigInfo();
- TvEvent::SignalInfoEvent ev;
- ev.mTrans_fmt = info.trans_fmt;
- ev.mFmt = info.fmt;
- ev.mStatus = info.status;
- ev.mReserved = info.reserved;
- sendTvEvent ( ev );
- LOGD ( "%s, Enable bluescreen for signal change in UnStableToNoSig! status = %d", __FUNCTION__, ev.mStatus );
-}
-void CTv::onSigNullToNoSig()
-{
- mTvAudio.SetAudioMuteForTv(CC_AUDIO_MUTE);
- mAv.DisableVideoWithBlueColor();
- //SetAudioMuteForTv(CC_AUDIO_MUTE);
- mTvin.Tvin_StopDecoder();
-
- tvin_info_t info = mSigDetectThread.getCurSigInfo();
-
-
- TvEvent::SignalInfoEvent ev;
- ev.mTrans_fmt = info.trans_fmt;
- ev.mFmt = info.fmt;
- ev.mStatus = info.status;
- ev.mReserved = info.reserved;
- sendTvEvent ( ev );
- LOGD ( "%s, Enable bluescreen for signal change in NullToNoSig!", __FUNCTION__);
-}
-
-void CTv::onSigNoSigToUnstable()
-{
- mAv.DisableVideoWithBlueColor();
- LOGD("Enable bluescreen for signal change in NoSigToUnstable\n");
-}
-
-void CTv::onSigStillStable()
-{
- if ( m_sig_stable_nums == 20) {
- tvin_info_t info = mSigDetectThread.getCurSigInfo();
- TvEvent::SignalInfoEvent ev;
- ev.mTrans_fmt = info.trans_fmt;
- ev.mFmt = info.fmt;
- ev.mStatus = info.status;
- ev.mReserved = info.reserved;
- sendTvEvent ( ev );
- }
- if(m_sig_stable_nums == 2) {
- int startdec_status = mTvin.Tvin_StartDecoder ( mSigDetectThread.getCurSigInfo() );
- if ( startdec_status == 0 ) { //showboz codes from start decode fun
- const char *value;
- value = config_get_str ( "TV", "tvin.db.reg.en", "null" );
- if ( strcmp ( value, "enable" ) == 0 ) {
- usleep ( 20 * 1000 );
- Tvin_SetPLLValues ();
- usleep ( 20 * 1000 );
- SetCVD2Values ();
- }
- }
- }
- if ( m_sig_stable_nums == 25 ) {
- if(!(mTvAction & TV_ACTION_SCANNING))
- mTvAudio.SetAudioMuteForTv ( CC_AUDIO_UNMUTE );
- mAv.EnableVideoAuto();
- }
-
- m_sig_stable_nums++;
-}
-void CTv::onSigStillUnstable()
-{
-}
-void CTv::onSigStillNosig()
-{
-
-}
-void CTv::onSigStillNoSupport()
-{
-
- tvin_info_t info = mSigDetectThread.getCurSigInfo();
- TvEvent::SignalInfoEvent SigEv;
- SigEv.mTrans_fmt = info.trans_fmt;
- SigEv.mFmt = info.fmt;
- SigEv.mStatus = info.status;
- SigEv.mReserved = info.reserved;
- sendTvEvent ( SigEv );
- LOGD ( "%s, Unsupport signal", __FUNCTION__);
-}
-void CTv::onSigStillNull()
-{
-}
-void CTv::onStableSigFmtChange()
-{
-}
-void CTv::onStableTransFmtChange()
-{
-}
-void CTv::onSigDetectEnter()
-{
- struct timeval time;
- gettimeofday ( &time, NULL );
-}
-
-void CTv::onLoop()
-{
- if ( ( m_is_hdmi_sr_detect_start == true )
- && ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_HDMI ) ) {
- int sr = mTvin.get_hdmi_sampling_rate();
-
- if ( ( sr > 0 ) && ( sr != m_hdmi_sampling_rate ) ) {
- if ( 0 == m_hdmi_sampling_rate ) {
- LOGD ( "%s, Init HDMI audio, sampling rate:%d", __FUNCTION__, sr );
- mTvAudio.AudioDataInit ( sr, false );
- audio_sr = sr;
- } else {
- LOGD ( "%s, Reset HDMI sampling rate to %d", __FUNCTION__, sr );
- mTvAudio.AudioChangeSampleRate ( sr );
- }
-
- m_hdmi_sampling_rate = sr;
- }
- }
-}
-
-void CTv::onSourceConnect(int source_type, int connect_status)
-{
- TvEvent::SourceConnectEvent ev;
- ev.mSourceInput = source_type;
- ev.connectionState = connect_status;
- sendTvEvent(ev);
-}
-
-int CTv::GetSourceConnectStatus(int source_input)
-{
- return mSourceConnectDetectThread.GetSourceConnectStatus(source_input);
-}
-
-tv_source_input_t CTv::GetCurrentSourceInputLock ( void )
-{
- Mutex::Autolock _l ( mLock );
- return m_source_input;
-}
-
-//dtv and tvin
-tvin_info_t CTv::GetCurrentSignalInfo ( void )
-{
- tvin_trans_fmt det_fmt = TVIN_TFMT_2D;
- tvin_sig_status_t signalState = TVIN_SIG_STATUS_NULL;
- tvin_info_t signal_info = mSigDetectThread.getCurSigInfo();
-
- if ( (CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_DTV ) ) {
- for ( int i = 0; i < 10; i++ ) {
- det_fmt = mTvin.TvinApi_Get3DDectMode();
- signal_info.status = TVIN_SIG_STATUS_STABLE;
-
- if ( det_fmt != TVIN_TFMT_2D ) {
- signal_info.trans_fmt = det_fmt;
- break;
- }
- }
- }
- return signal_info;
-}
-
-int CTv::Tv_Set3DMode ( VIDEO_3D_MODE_T mode )
-{
- if (mode == VIDEO_3D_MODE_AUTO) {
- mTvin.VDIN_SetDI3DDetc (1);
- } else {
- mTvin.VDIN_SetDI3DDetc (0);
- }
-
- mAv.set3DMode(mode, 0, 0);
- m_mode_3d = mode;
- SSMSave3DMode ( ( unsigned char ) mode );
- SetBypassModulesFor3D ( mode );
- return 0;
-}
-
-VIDEO_3D_MODE_T CTv::Tv_Get3DMode ( void )
-{
- return m_mode_3d;
-}
-
-int CTv::Tv_Set3DLRSwith ( int on_off)
-{
- LOGW ( "%s,Set3D LRSwith on_off %d ,status %d !!! ", __FUNCTION__, on_off);
- mAv.set3DMode(m_mode_3d, on_off, 0);
- SSMSave3DLRSwitch(on_off);
- return 0;
-}
-
-int CTv::Tv_Get3DLRSwith ( void )
-{
- unsigned char val = 0;
- SSMRead3DLRSwitch ( &val );
- return ( int ) val;
-}
-
-int CTv::Tv_Set3DTo2DMode ( int mode)
-{
- LOGW ( "%s,Set3D to 2D mode %d ,status %d !!! ", __FUNCTION__ , mode);
- mAv.set3DMode(m_mode_3d, 0, mode);
- SSMSave3DTO2D ( mode );
- return 0;
-}
-
-int CTv::Tv_Get3DTo2DMode ( void )
-{
- unsigned char val = 0;
- SSMRead3DTO2D ( &val );
- return val;
-}
-
-int CTv::Tv_Set3DDepth ( int value )
-{
- mTvin.Tvin_SetDepthOf2Dto3D( value );
- SSMSave3DDepth ( value );
- return 0;
-}
-
-int CTv::GetSave3DDepth ( void )
-{
- unsigned char val = 0;
- SSMRead3DDepth ( &val );
- return val;
-}
-
-is_3d_type_t CTv::Check2Dor3D ( VIDEO_3D_MODE_T mode3d, tvin_trans_fmt_t trans_fmt )
-{
- if ( mode3d == VIDEO_3D_MODE_DISABLE ) {
- return INDEX_2D;
- } else if ( mode3d == VIDEO_3D_MODE_AUTO ) {
- if ( trans_fmt == TVIN_TFMT_2D ) {
- return INDEX_2D;
- } else {
- return INDEX_3D;
- }
- } else {
- return INDEX_3D;
- }
-}
-
-
-int CTv::Tvin_SetPLLValues ()
-{
- tvin_sig_fmt_t sig_fmt = mSigDetectThread.getCurSigInfo().fmt;
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceInput(m_source_input);
- am_regs_t regs;
-
- if ( mVpp.getPqData()->PQ_GetPLLParams ( source_port, sig_fmt, &regs ) == 0 ) {
- LOGD ("%s,PQ_GetPLLParams(source_port[%d], sig_fmt[%d],&regs).\n", __FUNCTION__, source_port, sig_fmt );
-
- if ( mTvin.TvinApi_LoadPLLValues ( regs ) < 0 ) {
- LOGE ( "%s, TvinApi_LoadPLLValues failed!\n", __FUNCTION__ );
- return -1;
- }
- } else {
- LOGE ( "%s, PQ_GetPLLParams failed!\n", __FUNCTION__ );
- return -1;
- }
-
- return 0;
-}
-int CTv::SetCVD2Values ()
-{
- tvin_sig_fmt_t sig_fmt = mSigDetectThread.getCurSigInfo().fmt;
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceInput(m_source_input);
- am_regs_t regs;
-
- if (mVpp.getPqData()->PQ_GetCVD2Params ( source_port, sig_fmt, &regs ) == 0) {
- LOGD ( "%s, PQ_GetCVD2Params(source_port[%d], sig_fmt[%d],&regs).\n", __FUNCTION__,
- source_port, sig_fmt );
-
- if ( mTvin.TvinApi_LoadCVD2Values ( regs ) < 0 ) {
- LOGE ( "%s, TvinApi_LoadCVD2Values failed!\n", __FUNCTION__);
- return -1;
- }
- } else {
- LOGE ( "%s, PQ_GetCVD2Params failed!\n", __FUNCTION__);
- return -1;
- }
-
- return 0;
-}
-
-int CTv::SetPreviewWindow ( tvin_window_pos_t pos )
-{
- m_win_pos.x1 = pos.x1;
- m_win_pos.y1 = pos.y1;
- m_win_pos.x2 = pos.x2;
- m_win_pos.y2 = pos.y2;
- LOGD ( "%s, SetPreviewWindow x = %d y=%d", __FUNCTION__, pos.x2, pos.y2 );
-
- tvin_window_pos_t def_pos;
- Vpp_GetDisplayResolutionInfo(&def_pos);
-
- if (pos.x1 != 0 || pos.y1 != 0 || pos.x2 != def_pos.x2 || pos.y2 != def_pos.y2) {
- m_win_mode = PREVIEW_WONDOW;
- } else {
- m_win_mode = NORMAL_WONDOW;
- }
-
- return mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2);;
-}
-
-/*********************** Audio start **********************/
-int CTv::SetAudioVolDigitLUTBuf ( tv_source_input_t source_input )
-{
- if (source_input == SOURCE_TV) {
- mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_TV, 1, 1, -1 );
- } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) {
- mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_AV, 1, 1, -1 );
- } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2) {
- mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_COMP, 1, 1, -1 );
- } else if (source_input == SOURCE_VGA) {
- mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_VGA, 1, 1, -1 );
- } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
- mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_HDMI, 1, 1, -1 );
- } else if ( source_input == SOURCE_MPEG ) {
- mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_MPEG, 1, 1, -1 );
- } else if ( source_input == SOURCE_DTV ) {
- mTvAudio.AudioSetVolumeDigitLUTBuf ( CC_LUT_SEL_MPEG, 1, 1, -1 );
- }
- return 0;
-}
-
-void CTv::RefreshAudioMasterVolume ( tv_source_input_t source_input )
-{
- if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
- if ( GetAudioDVISupportEnable() == 1 ) {
- if ( IsDVISignal() ) {
- SetAudioVolDigitLUTBuf ( SOURCE_MPEG );
- mTvAudio.SetAudioMasterVolume ( mTvAudio.GetAudioMasterVolume() );
- return;
- }
- }
- }
-
- SetAudioVolDigitLUTBuf ( source_input );
- mTvAudio.SetAudioMasterVolume ( mTvAudio.GetAudioMasterVolume() );
-}
-
-int CTv::Tv_SetAudioInSource (tv_source_input_t source_input)
-{
- if (source_input == SOURCE_TV) {
- if (mTvin.Tvin_GetAudioInSourceType(source_input) == TV_AUDIO_IN_SOURCE_TYPE_ATV) {
- return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_ATV);
- } else {
- return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN);
- }
- } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) {
- return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN);
- } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
- return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_HDMI);
- } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2 ||
- source_input == SOURCE_TYPE_VGA) {
- return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN);
- }
-
- return 0;
-}
-
-int CTv::Tv_SetAudioSourceType (tv_source_input_t source_input)
-{
- int audio_source = -1;
-
- if (source_input == SOURCE_TV) {
- audio_source = AUDIO_ATV_SOURCE;
- } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) {
- audio_source = AUDIO_AV_SOURCE;
- } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
- audio_source = AUDIO_HDMI_SOURCE;
- } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2 ||
- source_input == SOURCE_TYPE_VGA) {
- audio_source = AUDIO_AV_SOURCE;
- } else if (source_input == SOURCE_DTV) {
- audio_source = AUDIO_MPEG_SOURCE;
- } else {
- audio_source = AUDIO_MPEG_SOURCE;
- }
-
- return mTvAudio.AudioSetAudioSourceType(audio_source);
-}
-void CTv::Tv_SetAudioOutputSwap_Type (tv_source_input_t source_input)
-{
- const char *config_value;
- config_value = config_get_str("TV", "audio.output.swap.enable", "null");
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- int sw_status = 0;
-
- LOGD("%s, audio.output.swap.enable\n", __FUNCTION__);
-
- switch(source_input) {
- case SOURCE_AV1:
- config_value = config_get_str("TV", "audio.output.swap.av1", "null");
- sw_status = atoi ( config_value );
- mTvAudio.SetOutput_Swap(sw_status);
- LOGD("%s, av1 %d\n", __FUNCTION__, sw_status);
- break;
- case SOURCE_AV2:
- config_value = config_get_str("TV", "audio.output.swap.av2", "null");
- sw_status = atoi ( config_value );
- mTvAudio.SetOutput_Swap(sw_status);
- LOGD("%s, av2 %d\n", __FUNCTION__, sw_status);
- break;
- case SOURCE_HDMI1:
- config_value = config_get_str("TV", "audio.output.swap.hdmi1", "null");
- sw_status = atoi ( config_value );
- mTvAudio.SetOutput_Swap(sw_status);
- LOGD("%s, hdmi1 %d\n", __FUNCTION__, sw_status);
- break;
- case SOURCE_HDMI2:
- config_value = config_get_str("TV", "audio.output.swap.hdmi2", "null");
- sw_status = atoi ( config_value );
- mTvAudio.SetOutput_Swap(sw_status);
- LOGD("%s, hdmi2 %d\n", __FUNCTION__, sw_status);
- break;
- case SOURCE_HDMI3:
- config_value = config_get_str("TV", "audio.output.swap.hdmi3", "null");
- sw_status = atoi ( config_value );
- mTvAudio.SetOutput_Swap(sw_status);
- LOGD("%s, hdmi3 %d\n", __FUNCTION__, sw_status);
- break;
- case SOURCE_TV:
- config_value = config_get_str("TV", "audio.output.swap.tv", "null");
- sw_status = atoi ( config_value );
- mTvAudio.SetOutput_Swap(sw_status);
- LOGD("%s, tv %d\n", __FUNCTION__, sw_status);
- break;
- case SOURCE_DTV:
- config_value = config_get_str("TV", "audio.output.swap.dtv", "null");
- sw_status = atoi ( config_value );
- mTvAudio.SetOutput_Swap(sw_status);
- LOGD("%s, dtv %d\n", __FUNCTION__, sw_status);
- break;
- case SOURCE_MPEG:
- config_value = config_get_str("TV", "audio.output.swap.mpeg", "null");
- sw_status = atoi ( config_value );
- mTvAudio.SetOutput_Swap(sw_status);
- LOGD("%s, mpeg %d\n", __FUNCTION__, sw_status);
- break;
- default:
- mTvAudio.SetOutput_Swap(sw_status);
- LOGD("%s, default %d\n", __FUNCTION__, sw_status);
- break;
- }
- }
-
-}
-
-/*********************** Audio end **********************/
-
-unsigned int CTv::Vpp_GetDisplayResolutionInfo(tvin_window_pos_t *win_pos)
-{
- int display_resolution = mAv.getVideoDisplayResolution();
- unsigned int tmp_ret = 0;
-
- switch(display_resolution) {
- case VPP_DISPLAY_RESOLUTION_1366X768:
- tmp_ret |= (CC_RESOLUTION_1366X768_W << 16);
- tmp_ret |= (CC_RESOLUTION_1366X768_H << 0);
- break;
- case VPP_DISPLAY_RESOLUTION_1920X1080:
- tmp_ret |= (CC_RESOLUTION_1920X1080_W << 16);
- tmp_ret |= (CC_RESOLUTION_1920X1080_H << 0);
- break;
- case VPP_DISPLAY_RESOLUTION_3840X2160:
- tmp_ret |= (CC_RESOLUTION_3840X2160_W << 16);
- tmp_ret |= (CC_RESOLUTION_3840X2160_H << 0);
- break;
- default:
- tmp_ret |= (CC_RESOLUTION_3840X2160_W << 16);
- tmp_ret |= (CC_RESOLUTION_3840X2160_H << 0);
- break;
- }
-
- if (win_pos != NULL) {
- win_pos->x1 = 0;
- win_pos->y1 = 0;
- win_pos->x2 = ((tmp_ret >> 16) & 0xFFFF) - 1;
- win_pos->y2 = ((tmp_ret >> 0) & 0xFFFF) - 1;
- }
-
- return 0;
-}
-
-
-int CTv::setBlackoutEnable(int enable)
-{
- m_blackout_enable = enable;
- return SSMSaveBlackoutEnable(enable);
-}
-
-int CTv::getSaveBlackoutEnable()
-{
- int8_t enable;
- SSMReadBlackoutEnable(&enable);
- return enable;
-}
-void CTv::startAutoBackLight()
-{
- mAutoBackLight.startAutoBacklight(CTvin::Tvin_SourceInputToSourceInputType(m_source_input));
-}
-
-void CTv::stopAutoBackLight()
-{
- mAutoBackLight.stopAutoBacklight();
-}
-
-int CTv::getAutoBackLight_on_off()
-{
- return mAutoBackLight.isAutoBacklightOn() ? 1 : 0;
-}
-/*********************** SSM start **********************/
-int CTv::Tv_SSMRestoreDefaultSetting()
-{
- SSMRestoreDeviceMarkValues();
- mTvAudio.AudioSSMRestoreDefaultSetting();
- mVpp.VPPSSMRestoreDefault();
- MiscSSMRestoreDefault();
- ReservedSSMRestoreDefault();
- SSMSaveCVBSStd ( 0 );
- SSMSaveLastSelectSourceInput ( SOURCE_TV );
- SSMSavePanelType ( 0 );
- //tvconfig default
- saveDTVProgramID ( -1 );
- saveATVProgramID ( -1 );
- return 0;
-}
-
-int CTv::clearDbAllProgramInfoTable()
-{
- return CTvDatabase::GetTvDb()->clearDbAllProgramInfoTable();
-}
-
-int CTv::Tv_SSMFacRestoreDefaultSetting()
-{
- mVpp.VPPSSMFacRestoreDefault();
- mTvAudio.AudioSSMRestoreDefaultSetting();
- MiscSSMFacRestoreDefault();
-
- return 0;
-}
-/*********************** SSM End **********************/
-//not in CTv, not use lock
-void CTv::setSourceSwitchAndPlay()
-{
- int progID = 0;
- LOGD ( "%s\n", __FUNCTION__ );
- static const int POWERON_SOURCE_TYPE_NONE = 0;//not play source
- static const int POWERON_SOURCE_TYPE_LAST = 1;//play last save source
- static const int POWERON_SOURCE_TYPE_SETTING = 2;//play ui set source
- int to_play_source = -1;
- int powerup_type = SSMReadPowerOnOffChannel();
- LOGD("read power on source type = %d", powerup_type);
- if(powerup_type == POWERON_SOURCE_TYPE_NONE) {
- return ;
- } else if(powerup_type == POWERON_SOURCE_TYPE_LAST) {
- to_play_source = SSMReadSourceInput();
- } else if(powerup_type == POWERON_SOURCE_TYPE_SETTING) {
- to_play_source = SSMReadLastSelectSourceInput();
- }
- SetSourceSwitchInput (( tv_source_input_t ) to_play_source );
- if ( to_play_source == SOURCE_TV ) {
- progID = getATVProgramID();
- } else if ( to_play_source == SOURCE_DTV ) {
- progID = getDTVProgramID();
- }
- playProgramLock(progID);
- return;
-}
-
-int CTv::startCC(int country, int src, int channel, int service)
-{
- //turn_on_cc = true;
- return mTvSub.sub_start_atsc_cc((enum cc_param_country)country, (enum cc_param_source_type)src, channel, (enum cc_param_caption_type)service);
-}
-
-int CTv::stopCC()
-{
- //because cc,vchip data both come from vbi thread , here judge cc, vchip is whether both turn off
- /*turn_on_cc = false;
- if(config_get_int("TV","tv.vchip.enable", 0))
- {
- return 0; //at ATV if vchip is on, turn off CC, just set flag not display CC, but vchip still running
- }*/
- return mTvSub.sub_stop_atsc_cc();
-}
-
-void CTv::printDebugInfo()
-{
- print_version_info();
- LOGD("%s, TvAction = %x", __FUNCTION__, mTvAction);
- LOGD("%s, TvRunStatus = %d", __FUNCTION__, mTvStatus);
- LOGD("%s, TvCurSourceInput = %d", __FUNCTION__, m_source_input);
- LOGD("%s, TvLastSourceInput = %d", __FUNCTION__, m_last_source_input);
-}
-//==============vchip end================================
-//----------------DVR API============================
-void CTv::SetRecordFileName ( char *name )
-{
- char tmp[256];
- strcpy ( tmp, name );
- mTvRec.SetRecordFileName ( tmp );
-}
-void CTv::StartToRecord()
-{
- int progID = getDTVProgramID();
- mTvRec.StartRecord ( progID );
-}
-void CTv::StopRecording()
-{
- mTvRec.StopRecord();
-}
-void CTv::SetRecCurTsOrCurProgram ( int sel )
-{
- mTvRec.SetRecCurTsOrCurProgram ( sel );
-}
-
-int CTv::GetDisplayResolutionConfig()
-{
- return mAv.getVideoDisplayResolution();
-}
-
-int CTv::GetDisplayResolutionInfo()
-{
- return Vpp_GetDisplayResolutionInfo(NULL);
-}
-
-void CTv::onHDMIRxCECMessage(int msg_len, unsigned char msg_buf[])
-{
- int i = 0;
- TvEvent::HDMIRxCECEvent ev;
- ev.mDataCount = msg_len;
- for(i = 0; i < msg_len; i++) {
- ev.mDataBuf[i] = msg_buf[i];
- }
- sendTvEvent(ev);
-}
-
-int CTv::SendHDMIRxCECCustomMessage(unsigned char data_buf[])
-{
- tv_source_input_t source_input = m_source_input;
-
- return mHDMIRxCEC.SendCustomMessage(source_input, data_buf);
-}
-
-int CTv::SendHDMIRxCECCustomMessageAndWaitReply(unsigned char data_buf[], unsigned char reply_buf[], int WaitCmd, int timeout)
-{
- tv_source_input_t source_input = m_source_input;
-
- return mHDMIRxCEC.SendCustomMessageAndWaitReply(source_input, data_buf, reply_buf, WaitCmd, timeout);
-}
-
-int CTv::SendHDMIRxCECBoradcastStandbyMessage(void)
-{
- tv_source_input_t source_input = m_source_input;
-
- return mHDMIRxCEC.SendBoradcastStandbyMessage(source_input);
-}
-
-int CTv::SendHDMIRxCECGiveCECVersionMessage(tv_source_input_t source_input, unsigned char data_buf[])
-{
- if (mHDMIRxCEC.processRefreshSrcDevice(source_input) == 0) {
- return mHDMIRxCEC.SendGiveCECVersionMessage(source_input, data_buf);
- }
-
- return -1;
-}
-
-int CTv::SendHDMIRxCECGiveDeviceVendorIDMessage(tv_source_input_t source_input, unsigned char data_buf[])
-{
- if (mHDMIRxCEC.processRefreshSrcDevice(source_input) == 0) {
- return mHDMIRxCEC.SendGiveDeviceVendorIDMessage(source_input, data_buf);
- }
-
- return -1;
-}
-
-int CTv::SendHDMIRxCECGiveOSDNameMessage(tv_source_input_t source_input, unsigned char data_buf[])
-{
- if (mHDMIRxCEC.processRefreshSrcDevice(source_input) == 0) {
- return mHDMIRxCEC.SendGiveOSDNameMessage(source_input, data_buf);
- }
-
- return -1;
-}
-
-int CTv::GetHdmiHdcpKeyKsvInfo(int data_buf[])
-{
- return mTvin.get_hdmi_ksv_info(m_source_input, data_buf);
-}
-
-void CTv::onUpgradeStatus(int state, int param)
-{
- TvEvent::UpgradeFBCEvent ev;
- ev.mState = state;
- ev.param = param;
- sendTvEvent(ev);
-}
-
-int CTv::StartUpgradeFBC(char *file_name, int mode, int upgrade_blk_size)
-{
- if (mpUpgradeFBC != NULL) {
- mpUpgradeFBC->SetUpgradeFileName(file_name);
- mpUpgradeFBC->SetUpgradeMode(mode);
- mpUpgradeFBC->SetUpgradeBlockSize(upgrade_blk_size);
- mpUpgradeFBC->start();
- return 0;
- }
-
- return -1;
-}
-
-void CTv::onSerialCommunication(int dev_id, int rd_len, unsigned char data_buf[])
-{
- int i = 0;
- TvEvent::SerialCommunicationEvent ev;
- ev.mDevId = dev_id;
- ev.mDataCount = rd_len;
- for(i = 0; i < rd_len; i++) {
- ev.mDataBuf[i] = data_buf[i];
- }
- sendTvEvent(ev);
-}
-
-void CTv::onThermalDetect(int state)
-{
- const char *value;
- const char *value_normal;
- const char *value_cold;
- int threshold = 0, val = 0;
- static int pre_val = -1;
-
- value = config_get_str ( "TV", "tvin.thermal.threshold.enable", "null" );
-
- if ( strcmp ( value, "enable" ) == 0 ) {
-
- value = config_get_str ( "TV", "tvin.thermal.threshold.value", "null" );
-
- threshold = atoi(value);
- LOGD ( "%s, threshold value: %d\n", __FUNCTION__, threshold);
-
- if(state > threshold) {
- value_normal = config_get_str ( "TV", "tvin.thermal.fbc.normal.value", "null" );
- val = atoi(value_normal);
- if(val == 0) {
- val = 0x4210000; //normal default
- }
- LOGD ( "%s, current temp: %d set 1\n", __FUNCTION__, state);
- } else {
- value_cold = config_get_str ( "TV", "tvin.thermal.fbc.cold.value", "null" );
- val = atoi(value_cold);
- if(val == 0) {
- val = 0x8210000; //cold default
- }
- LOGD ( "%s, current temp: 0x%x set 0\n", __FUNCTION__, state);
- }
-
- if(pre_val == val) {
- LOGD ( "%s, pre_val == val : 0x%x,bypass\n", __FUNCTION__, val);
- } else {
- pre_val = val;
- Tv_FactorySet_FBC_Thermal_State(val);
- LOGD ( "%s, pre_val :0x%x,bypass\n", __FUNCTION__, pre_val);
- }
- } else {
- LOGD ( "%s, tvin.thermal.threshold.enable == disable\n", __FUNCTION__);
- }
-}
-
-int CTv::SetSerialSwitch(int dev_id, int switch_val)
-{
- int tmp_ret = 0;
-
- if (dev_id == SERIAL_A) {
- if (switch_val == 0) {
- tmp_ret |= mSerialA.stop();
- tmp_ret |= mSerialA.CloseModule();
-
- tmp_ret |= system("start console");
- } else {
- tmp_ret |= system("stop console");
-
- mSerialA.OpenModule(dev_id);
- tmp_ret |= mSerialA.start();
- }
- } else if (dev_id == SERIAL_B) {
- if (switch_val == 0) {
- tmp_ret |= mSerialB.stop();
- tmp_ret |= mSerialB.CloseModule();
- } else {
- mSerialB.OpenModule(dev_id);
- tmp_ret = mSerialB.start();
- }
- } else if (dev_id == SERIAL_C) {
- if (switch_val == 0) {
- tmp_ret |= mSerialC.stop();
- tmp_ret |= mSerialC.CloseModule();
- } else {
- mSerialC.OpenModule(dev_id);
- tmp_ret = mSerialC.start();
- }
- }
-
- return tmp_ret;
-}
-
-int CTv::SendSerialData(int dev_id, int data_len, unsigned char data_buf[])
-{
- int tmp_ret = 0;
-
- if (dev_id == SERIAL_A) {
- tmp_ret = mSerialA.sendData(data_len, data_buf);
- } else if (dev_id == SERIAL_B) {
- tmp_ret = mSerialB.sendData(data_len, data_buf);
- } else if (dev_id == SERIAL_C) {
- tmp_ret = mSerialC.sendData(data_len, data_buf);
- }
-
- return tmp_ret;
-}
-
-int CTv::ChannelExport(const char *destPath)
-{
- //DIR *dirptr = NULL;
- //dirptr = opendir("/storage/external_storage/sda1/");
- //if(NULL == dirptr) {
- // LOGD("%s, please insert the udisk !",__FUNCTION__);
- // return -2;
- // } else {
- char tmp[256];
- FILE *fp = NULL;
- if(destPath == NULL) {
- destPath = "/storage/external_storage/sda1/";
- }
-
- //LOGD("%s, udisk exist !",__FUNCTION__);
- sprintf(tmp, "cp /param/dtv.db %s", destPath);
- if(system(tmp) >= 0) {
- LOGD("%s, copy dtv.db from /param to udisk success !", __FUNCTION__);
- system("sync");
- fp = fopen(destPath, "r");
- if (fp == NULL) {
- return -1;
- } else {
- fclose(fp);
- fp = NULL;
- return 0;
- }
- } else {
- return -1;
- }
- //}
-}
-
-int CTv::ChannelImport(const char *srcPath)
-{
- if(srcPath == NULL) {
- srcPath = "/storage/external_storage/sda1/dvb.db";
- }
-
- if(Tv_Utils_IsFileExist(srcPath) == 0) {
- char tmp[256];
- LOGD("%s, file exist !" , srcPath);
- CTvDatabase::GetTvDb()->UnInitTvDb();
- sprintf(tmp, "rm /param/dtv.db");
- if(system(tmp) >= 0) {
- LOGD("%s, rm /param/dtv.db success !", __FUNCTION__);
- memset(tmp, 0, sizeof(tmp));
- sprintf(tmp, "cp %s /param/dtv.db", srcPath);
- if(system(tmp) >= 0) {
- LOGD("%s, copy to /param/dtv.db success !", srcPath);
- system("sync");
- CTvDatabase::GetTvDb()->InitTvDb(TV_DB_PATH);
- return 0;
- } else {
- LOGD("%s, copy dtv.db from udisk to /param failed !", __FUNCTION__);
- return -1;
- }
- } else {
- LOGD("%s, rm /param/dtv.db failed !", __FUNCTION__);
- return -2;
- }
- } else {
- LOGD("%s, dtv.db file does not exist in the udisk!" , srcPath);
- return -2;
- }
-
-}
-
-int CTv::Tv_GetProjectInfo(project_info_t *ptrInfo)
-{
- return GetProjectInfo(ptrInfo);
-}
-
-int CTv::Tv_GetPlatformType()
-{
- return GetPlatformHaveFBCFlag();
-}
-
-int CTv::Tv_SetDDDRCMode(tv_source_input_t source_input)
-{
- if (source_input == SOURCE_DTV) {
- if (GetPlatformHaveDDFlag() == 1) {
- Tv_Utils_SetFileAttrStr("/sys/class/audiodsp/ac3_drc_control", "drcmode 3");
- }
- } else {
- if (GetPlatformHaveDDFlag() == 1) {
- Tv_Utils_SetFileAttrStr("/sys/class/audiodsp/ac3_drc_control", "drcmode 2");
- }
- }
-
- return 0;
-}
-
-//PQ
-int CTv::Tv_SetBrightness ( int brightness, tv_source_input_type_t source_type, int is_save )
-{
- return mVpp.Tv_SetBrightness(brightness, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
-}
-
-int CTv::Tv_GetBrightness ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetBrightness((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SetContrast ( int contrast, tv_source_input_type_t source_type, int is_save )
-{
- return mVpp.Tv_SetContrast(contrast, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
-}
-
-int CTv::Tv_GetContrast ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetContrast((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SetSaturation ( int satuation, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save )
-{
- return mVpp.Tv_SetSaturation(satuation, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
-}
-
-int CTv::Tv_GetSaturation ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetSaturation((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SetHue ( int hue, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save )
-{
- return mVpp.Tv_SetHue(hue, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
-}
-
-int CTv::Tv_GetHue ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetHue((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SetPQMode ( vpp_picture_mode_t mode, tv_source_input_type_t source_type, int is_save )
-{
- return mVpp.Tv_SetPQMode((vpp_picture_mode_t)mode, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
-}
-
-vpp_picture_mode_t CTv::Tv_GetPQMode ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetPQMode((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int en, int is_save )
-{
- return mVpp.Tv_SetSharpness(value, (tv_source_input_type_t)source_type, en, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, is_save);
-}
-
-int CTv::Tv_GetSharpness ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetSharpness((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SaveSharpness ( int value, tv_source_input_type_t source_type, int en )
-{
- if ( en == 1 ) {
- return SSMSaveSharpness( (tv_source_input_type_t)source_type, value );
- } else {
- return 0;
- }
-}
-
-int CTv::Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save )
-{
- return mVpp.Tv_SetBacklight(value, (tv_source_input_type_t)source_type, is_save);
-}
-
-int CTv::Tv_GetBacklight ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetBacklight((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SetColorTemperature ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type, int is_save )
-{
- return mVpp.Tv_SetColorTemperature((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type, is_save);
-}
-
-vpp_color_temperature_mode_t CTv::Tv_GetColorTemperature ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetColorTemperature((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SaveColorTemp ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type )
-{
- return mVpp.Tv_SaveColorTemp((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SetDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save )
-{
- int ret = Vpp_SetDisplayMode((vpp_display_mode_t)mode, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt);
- if(ret == 0) {
- if(is_save == 1) {
- ret = ret | SSMSaveDisplayMode ( source_type, (int)mode );
- }
- }
- return ret;
-}
-
-int CTv::Vpp_SetDisplayMode ( vpp_display_mode_t display_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt )
-{
- LOGD("%s, display_mode = %d, source_type = %d. \n", __FUNCTION__, display_mode, source_type);
-
- tvin_cutwin_t cutwin = mVpp.Tv_GetOverscan ( source_type, sig_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt);
- int video_screen_mode = CAv::VIDEO_WIDEOPTION_16_9;
- tvin_window_pos_t win_pos;
- int display_resolution = Vpp_GetDisplayResolutionInfo(&win_pos);
-
-
- if ( source_type == SOURCE_TYPE_HDMI ) {
- if ( sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_60HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_50HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_A
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_B
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_25HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_100HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_120HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_100HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_120HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_FRAME_PACKING
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_FRAME_PACKING
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_FRAME_PACKING
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ_ALTERNATIVE
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_ALTERNATIVE
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_ALTERNATIVE
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_ALTERNATIVE
- || sig_fmt == TVIN_SIG_FMT_HDMI_3840_2160_00HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_4096_2160_00HZ
-
- ) {
- if ( display_mode == VPP_DISPLAY_MODE_NOSCALEUP ) {
- cutwin.vs = 0;
- cutwin.hs = 1;
- cutwin.ve = 0;
- cutwin.he = 1;
- }
- }
- }
-
- switch ( display_mode ) {
- case VPP_DISPLAY_MODE_169:
- video_screen_mode = CAv::VIDEO_WIDEOPTION_16_9;
- break;
- case VPP_DISPLAY_MODE_MODE43:
- video_screen_mode = CAv::VIDEO_WIDEOPTION_4_3;
- break;
- case VPP_DISPLAY_MODE_NORMAL:
- video_screen_mode = CAv::VIDEO_WIDEOPTION_NORMAL;
- break;
- case VPP_DISPLAY_MODE_FULL:
- break;
- case VPP_DISPLAY_MODE_NOSCALEUP: {
- if ( source_type == SOURCE_TYPE_HDMI ) {
- int retValue = GetFileAttrIntValue ( "/sys/module/tvin_hdmirx/parameters/cur_colorspace" );
- switch ( retValue ) {
- case RGB_FORMAT:
- mVpp.Tv_SetColorSpaceMode ( VPP_COLOR_SPACE_RGB );
- cutwin.vs = 0;
- cutwin.hs = 0;
- cutwin.ve = 0;
- cutwin.he = 0;
- break;
-
- default:
- mVpp.Tv_SetColorSpaceMode ( VPP_COLOR_SPACE_YUV );
- break;
- }
- } else {
- video_screen_mode = CAv::VIDEO_WIDEOPTION_NORMAL_NOSCALEUP;
- }
- break;
- }
- case VPP_DISPLAY_MODE_FULL_REAL:
- video_screen_mode = CAv::VIDEO_WIDEOPTION_16_9; //added for N360 by haifeng.liu
- break;
- case VPP_DISPLAY_MODE_PERSON:
- if ( display_resolution == VPP_DISPLAY_RESOLUTION_1366X768 ) {
- win_pos.y1 = -45;
- win_pos.y2 = win_pos.y2 - win_pos.y1;
- } else {
- win_pos.y1 = -65;
- win_pos.y2 = win_pos.y2 - win_pos.y1;
- }
- video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH;
- break;
- case VPP_DISPLAY_MODE_MOVIE:
- if ( display_resolution == VPP_DISPLAY_RESOLUTION_1366X768 ) {
- win_pos.y1 = -61;
- win_pos.y2 = win_pos.y2 - win_pos.y1;
- } else {
- win_pos.y1 = -86;
- win_pos.y2 = win_pos.y2 - win_pos.y1;
- }
- video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH;
- break;
- case VPP_DISPLAY_MODE_CAPTION:
- if (display_resolution == VPP_DISPLAY_RESOLUTION_1366X768 ) {
- win_pos.y1 = -61;
- win_pos.y2 = win_pos.y2 + 2;
- } else {
- win_pos.y1 = -86;
- win_pos.y2 = win_pos.y2 + 4;
- }
- video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH;
- break;
- case VPP_DISPLAY_MODE_ZOOM:
- if (display_resolution == VPP_DISPLAY_RESOLUTION_1366X768 ) {
- win_pos.y1 = -128;
- win_pos.y2 = win_pos.y2 - win_pos.y1;
- } else {
- win_pos.y1 = -180;
- win_pos.y2 = win_pos.y2 - win_pos.y1;
- }
- video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH;
- break;
- default:
- break;
- }
-
- if ( display_mode == VPP_DISPLAY_MODE_FULL ) {
- if ( source_type == SOURCE_TYPE_HDMI ) {
- if ( sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_60HZ
- //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_50HZ
- //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_A
- //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_B
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_25HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ
- //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_100HZ
- //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_120HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_100HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_120HZ
- //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_FRAME_PACKING
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_FRAME_PACKING
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_FRAME_PACKING
- //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_60HZ_ALTERNATIVE
- //|| sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080I_50HZ_ALTERNATIVE
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_24HZ_ALTERNATIVE
- || sig_fmt == TVIN_SIG_FMT_HDMI_1920X1080P_30HZ_ALTERNATIVE
- || sig_fmt == TVIN_SIG_FMT_HDMI_3840_2160_00HZ
- || sig_fmt == TVIN_SIG_FMT_HDMI_4096_2160_00HZ ) {
- const char *config_value = config_get_str ( "TV", "vpp.hdmi.nonlinear.scaling", "null" );
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- video_screen_mode = CAv::VIDEO_WIDEOPTION_NONLINEAR;
- mVpp.VPP_SetNonLinearFactor ( 20 );
- }
- } else {
- video_screen_mode = CAv::VIDEO_WIDEOPTION_NONLINEAR;
- mVpp.VPP_SetNonLinearFactor ( 20 );
- }
- cutwin.vs = 0;
- cutwin.hs = 1;
- cutwin.ve = 0;
- cutwin.he = 1;
- }
- }
-
- if ( m_mode_3d == VIDEO_3D_MODE_DISABLE ) {
- if(display_mode == VPP_DISPLAY_MODE_FULL_REAL && source_type == SOURCE_TYPE_HDMI) {
- //added for N360 by haifeng.liu
- cutwin.vs = 0;
- cutwin.hs = 0;
- cutwin.ve = 0;
- cutwin.he = 0;
- }
- } else {
- cutwin.vs = 0;
- cutwin.hs = 0;
- cutwin.ve = 0;
- cutwin.he = 0;
- video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH;
- }
-
- mAv.setVideoAxis ( win_pos.x1, win_pos.y1, win_pos.x2, win_pos.y2 );
- mAv.setVideoScreenMode(video_screen_mode);
- mVpp.VPP_SetVideoCrop(cutwin.vs, cutwin.hs, cutwin.ve, cutwin.he);
- return 0;
-}
-
-vpp_display_mode_t CTv::Tv_GetDisplayMode ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetDisplayMode((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SaveDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type )
-{
- return SSMSaveDisplayMode ( source_type, (int)mode );
-}
-
-int CTv::Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type, int is_save )
-{
- return mVpp.Tv_SetNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt, is_save);
-}
-
-vpp_noise_reduction_mode_t CTv::Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type )
-{
- return mVpp.Tv_GetNoiseReductionMode((tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type )
-{
- return mVpp.Tv_SaveNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type);
-}
-
-int CTv::Tv_SetRGBOGO_PostOffset(int type, int offset)
-{
- return mVpp.Tv_SetRGBOGO_PostOffset(type, offset);
-}
-
-int CTv::Tv_SetRGBOGO_Gain(int type, int mode)
-{
- return mVpp.Tv_SetRGBOGO_Gain(type, mode);
-}
-
-int CTv::Tv_GetRGBOGO_PostOffset ( int type )
-{
- return mVpp.Tv_GetRGBOGO_PostOffset(type);
-}
-
-int CTv::Tv_GetRGBOGO_Gain ( int type )
-{
- return mVpp.Tv_GetRGBOGO_Gain(type);
-}
-
-int CTv::Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness )
-{
- return mVpp.Tv_FactorySetPQMode_Brightness(source_type, pq_mode, brightness);
-}
-
-int CTv::Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode )
-{
- return mVpp.Tv_FactoryGetPQMode_Brightness(source_type, pq_mode);
-}
-
-int CTv::Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast )
-{
- return mVpp.Tv_FactorySetPQMode_Contrast(source_type, pq_mode, contrast);
-}
-
-int CTv::Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode )
-{
- return mVpp.Tv_FactoryGetPQMode_Contrast(source_type, pq_mode);
-}
-
-int CTv::Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation )
-{
- return mVpp.Tv_FactorySetPQMode_Saturation(source_type, pq_mode, saturation);
-}
-
-int CTv::Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode )
-{
- return mVpp.Tv_FactoryGetPQMode_Saturation(source_type, pq_mode);
-}
-
-int CTv::Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue )
-{
- return mVpp.Tv_FactorySetPQMode_Hue(source_type, pq_mode, hue);
-}
-
-int CTv::Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode )
-{
- return mVpp.Tv_FactoryGetPQMode_Hue(source_type, pq_mode);
-}
-
-int CTv::Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness )
-{
- return mVpp.Tv_FactorySetPQMode_Sharpness(source_type, pq_mode, sharpness);
-}
-
-int CTv::Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode )
-{
- return mVpp.Tv_FactoryGetPQMode_Sharpness(source_type, pq_mode);
-}
-
-int CTv::Tv_FactorySetColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain )
-{
- return mVpp.Tv_FactorySetColorTemp_Rgain(source_type, colortemp_mode, rgain);
-}
-
-int CTv::Tv_FactorySaveColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain )
-{
- return mVpp.Tv_FactorySaveColorTemp_Rgain(source_type, colortemp_mode, rgain);
-}
-
-int CTv::Tv_FactoryGetColorTemp_Rgain ( int source_type, int colortemp_mode )
-{
- return mVpp.Tv_FactoryGetColorTemp_Rgain(source_type, colortemp_mode);
-}
-
-int CTv::Tv_FactorySetColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain )
-{
- return mVpp.Tv_FactorySetColorTemp_Ggain(source_type, colortemp_mode, ggain);
-}
-
-int CTv::Tv_FactorySaveColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain )
-{
- return mVpp.Tv_FactorySaveColorTemp_Ggain(source_type, colortemp_mode, ggain);
-}
-
-int CTv::Tv_FactoryGetColorTemp_Ggain ( int source_type, int colortemp_mode )
-{
- return mVpp.Tv_FactoryGetColorTemp_Ggain(source_type, colortemp_mode);
-}
-
-int CTv::Tv_FactorySetColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain )
-{
- return mVpp.Tv_FactorySetColorTemp_Bgain(source_type, colortemp_mode, bgain);
-}
-
-int CTv::Tv_FactorySaveColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain )
-{
- return mVpp.Tv_FactorySaveColorTemp_Bgain(source_type, colortemp_mode, bgain);
-}
-
-int CTv::Tv_FactoryGetColorTemp_Bgain ( int source_type, int colortemp_mode )
-{
- return mVpp.Tv_FactoryGetColorTemp_Bgain(source_type, colortemp_mode);
-}
-
-int CTv::Tv_FactorySetColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset )
-{
- return mVpp.Tv_FactorySetColorTemp_Roffset(source_type, colortemp_mode, roffset);
-}
-
-int CTv::Tv_FactorySaveColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset )
-{
- return mVpp.Tv_FactorySaveColorTemp_Roffset(source_type, colortemp_mode, roffset);
-}
-
-int CTv::Tv_FactoryGetColorTemp_Roffset ( int source_type, int colortemp_mode )
-{
- return mVpp.Tv_FactoryGetColorTemp_Roffset(source_type, colortemp_mode);
-}
-
-int CTv::Tv_FactorySetColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset )
-{
- return mVpp.Tv_FactorySetColorTemp_Goffset(source_type, colortemp_mode, goffset);
-}
-
-int CTv::Tv_FactorySaveColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset )
-{
- return mVpp.Tv_FactorySaveColorTemp_Goffset(source_type, colortemp_mode, goffset);
-}
-
-int CTv::Tv_FactoryGetColorTemp_Goffset ( int source_type, int colortemp_mode )
-{
- return mVpp.Tv_FactoryGetColorTemp_Goffset(source_type, colortemp_mode);
-}
-
-int CTv::Tv_FactorySetColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset )
-{
- return mVpp.Tv_FactorySetColorTemp_Boffset(source_type, colortemp_mode, boffset);
-}
-
-int CTv::Tv_FactorySaveColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset )
-{
- return mVpp.Tv_FactorySaveColorTemp_Boffset(source_type, colortemp_mode, boffset);
-}
-
-int CTv::Tv_FactoryGetColorTemp_Boffset ( int source_type, int colortemp_mode )
-{
- return mVpp.Tv_FactoryGetColorTemp_Boffset(source_type, colortemp_mode);
-}
-
-int CTv::GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params )
-{
- return mVpp.GetColorTemperatureParams(Tempmode, params);
-}
-
-int CTv::Tv_FactorySetTestPattern ( int pattern )
-{
- switch ( pattern ) {
- case VPP_TEST_PATTERN_NONE:
- mAv.SetVideoScreenColor ( 3, 16, 128, 128 );
- break;
-
- case VPP_TEST_PATTERN_RED:
- mAv.SetVideoScreenColor ( 0, 81, 90, 240 );
- break;
-
- case VPP_TEST_PATTERN_GREEN:
- mAv.SetVideoScreenColor ( 0, 145, 54, 34 );
- break;
-
- case VPP_TEST_PATTERN_BLUE:
- mAv.SetVideoScreenColor ( 0, 41, 240, 110 );
- break;
-
- case VPP_TEST_PATTERN_WHITE:
- mAv.SetVideoScreenColor ( 0, 235, 128, 128 );
- break;
-
- case VPP_TEST_PATTERN_BLACK:
- mAv.SetVideoScreenColor ( 0, 16, 128, 128 );
- break;
-
- default:
- return -1;
- }
- return SSMSaveTestPattern ( pattern );
-}
-
-int CTv::Tv_FactoryGetTestPattern ( void )
-{
- return mVpp.Tv_FactoryGetTestPattern();
-}
-
-int CTv::Tv_FactoryResetPQMode ( void )
-{
- return mVpp.Tv_FactoryResetPQMode();
-}
-
-int CTv::Tv_FactoryResetColorTemp ( void )
-{
- return mVpp.Tv_FactoryResetColorTemp();
-}
-
-int CTv::Tv_FactorySetParamsDefault ( void )
-{
- return mVpp.Tv_FactorySetParamsDefault();
-}
-
-int CTv::Tv_FactorySetDDRSSC ( int step )
-{
- return mVpp.Tv_FactorySetDDRSSC(step);
-}
-
-int CTv::Tv_FactoryGetDDRSSC ( void )
-{
- return mVpp.Tv_FactoryGetDDRSSC();
-}
-
-int CTv::Tv_FactorySetLVDSSSC ( int step )
-{
- return mVpp.Tv_FactorySetLVDSSSC(step);
-}
-
-int CTv::Tv_FactoryGetLVDSSSC ( void )
-{
- return mVpp.Tv_FactoryGetLVDSSSC();
-}
-
-int CTv::Tv_FactorySetNolineParams ( int noline_params_type, int source_type, noline_params_t noline_params )
-{
- return mVpp.Tv_FactorySetNolineParams(noline_params_type, source_type, noline_params);
-}
-
-noline_params_t CTv::Tv_FactoryGetNolineParams ( int noline_params_type, int source_type )
-{
- return mVpp.Tv_FactoryGetNolineParams(noline_params_type, source_type);
-}
-
-int CTv::Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t )
-{
- //tvin_cutwin_t cutwin_t = mVpp.Tv_FactoryGetOverscan(source_type, fmt, status_3d, trans_fmt);
- return mVpp.VPP_SetVideoCrop ( ( int ) cutwin_t.vs, ( int ) cutwin_t.hs, ( int ) cutwin_t.ve, ( int ) cutwin_t.he );
-}
-
-tvin_cutwin_t CTv::Tv_FactoryGetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt )
-{
- return mVpp.Tv_FactoryGetOverscan(source_type, fmt, Check2Dor3D(m_mode_3d, (tvin_trans_fmt_t)trans_fmt), trans_fmt);
-}
-
-int CTv::Tv_FactorySet_FBC_Brightness ( int value )
-{
- //int temp_value = (255*value)/100;
- int temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Brightness(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Brightness ( void )
-{
- int temp_value = 0;
- int data = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Brightness(COMM_DEV_SERIAL, &temp_value);
- //data = (temp_value*100)/255;
- data = temp_value;
-
- return data;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Contrast ( int value )
-{
- //int temp_value = (255*value)/100;
- int temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Contrast(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Contrast ( void )
-{
- int temp_value = 0;
- int data = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Contrast(COMM_DEV_SERIAL, &temp_value);
- //data = (temp_value*100)/255;
- data = temp_value;
-
- return data;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Saturation ( int value )
-{
- //int temp_value = (255*value)/100;
- int temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Saturation(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Saturation ( void )
-{
- int temp_value = 0;
- int data = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Saturation(COMM_DEV_SERIAL, &temp_value);
- //data = (temp_value*100)/255;
- data = temp_value;
-
- return data;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_HueColorTint ( int value )
-{
- //int temp_value = (255*value)/100;
- int temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_HueColorTint(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_HueColorTint ( void )
-{
- int temp_value = 0;
- int data = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_HueColorTint(COMM_DEV_SERIAL, &temp_value);
- //data = (temp_value*100)/255;
- data = temp_value;
-
- return data;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Backlight ( int value )
-{
- int temp_value = value;
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Backlight(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Backlight ( void )
-{
- int temp_value = 0;
- int data = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Backlight(COMM_DEV_SERIAL, &temp_value);
- data = temp_value;
-
- return data;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Backlight_N360 ( int value )
-{
- int val = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_AUTO_ELEC_MODE(COMM_DEV_SERIAL, value);
- val = value;
- SSMSaveFBCN360BackLightVal(val);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Backlight_N360 ( void )
-{
- int temp_value = 0;
- int val = 0;
-
- SSMReadFBCN360BackLightVal(&val);
-
- return val;
-
-}
-
-
-int CTv::Tv_FactorySet_FBC_ELEC_MODE( int value )
-{
- int val = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_AUTO_ELEC_MODE(COMM_DEV_SERIAL, value);
- val = value;
- SSMSaveFBCELECmodeVal(val);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_ELEC_MODE( void )
-{
- int val = 0;
-
- SSMReadFBCELECmodeVal(&val);
-
- return val;
-}
-
-int CTv::Tv_FactorySet_FBC_Thermal_State( int value )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Thermal_state(COMM_DEV_SERIAL, value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactorySet_FBC_Picture_Mode ( int mode )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Picture_Mode(COMM_DEV_SERIAL, mode);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Picture_Mode ( void )
-{
- int mode = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Picture_Mode(COMM_DEV_SERIAL, &mode);
- return mode;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Set_Test_Pattern ( int mode )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Test_Pattern(COMM_DEV_SERIAL, mode);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Get_Test_Pattern ( void )
-{
- int mode = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Test_Pattern(COMM_DEV_SERIAL, &mode);
- return mode;
- }
-
- return 0;
-}
-
-
-int CTv::Tv_FactorySet_FBC_Gain_Red( int value )
-{
- int temp_value = 0;
-
- //temp_value = (value*255)/2047;
- //value 0 ~ 2047
- temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Gain_Red(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Gain_Red ( void )
-{
- int temp_value = 0, value = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Gain_Red(COMM_DEV_SERIAL, &temp_value);
- //value 0 ~ 2047
- //value = (temp_value*2047)/255;
- value = temp_value;
-
- return value;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Gain_Green( int value )
-{
- int temp_value = 0;
-
- //temp_value = (value*255)/2047;
- //value 0 ~ 2047
- temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Gain_Green(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Gain_Green ( void )
-{
- int temp_value = 0, value = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Gain_Green(COMM_DEV_SERIAL, &temp_value);
- //value 0 ~ 2047
- //value = (temp_value*2047)/255;
- value = temp_value;
-
- return value;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Gain_Blue( int value )
-{
- int temp_value = 0;
-
- //temp_value = (value*255)/2047;
- //value 0 ~ 2047
- temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Gain_Blue(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Gain_Blue ( void )
-{
- int temp_value = 0, value = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Gain_Blue(COMM_DEV_SERIAL, &temp_value);
- //value 0 ~ 2047
- //value = (temp_value*2047)/255;
- value = temp_value;
-
- return value;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Offset_Red( int value )
-{
- //value -1024~+1023
- int temp_value = 0;
-
- //temp_value = (value+1024)*255/2047;
- temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Offset_Red(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Offset_Red ( void )
-{
- int temp_value = 0, value = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Offset_Red(COMM_DEV_SERIAL, &temp_value);
- //value -1024~+1023
- //value = (temp_value*2047)/255 - 1024;
- value = temp_value;
-
- return value;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Offset_Green( int value )
-{
- //value -1024~+1023
- int temp_value = 0;
-
- //temp_value = (value+1024)*255/2047;
- temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Offset_Green(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Offset_Green ( void )
-{
- int temp_value = 0, value = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Offset_Green(COMM_DEV_SERIAL, &temp_value);
- //value -1024~+1023
- //value = (temp_value*2047)/255 - 1024;
- value = temp_value;
-
- return value;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Offset_Blue( int value )
-{
- //value -1024~+1023
- int temp_value = 0;
-
- //temp_value = (value+1024)*255/2047;
- temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Offset_Blue(COMM_DEV_SERIAL, value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Offset_Blue ( void )
-{
- int temp_value = 0, value = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Offset_Blue(COMM_DEV_SERIAL, &temp_value);
- //value -1024~+1023
- //value = (temp_value*2047)/255 - 1024;
- value = temp_value;
-
- return value;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactoryGetWhiteBalanceRedGain(int source_type, int colortemp_mode)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- LOGD("--------- call none fbc method ---------");
- ret = mVpp.Tv_FactoryGetColorTemp_Rgain(source_type, colortemp_mode);
- } else { //use fbc store the white balance params
- LOGD("--------- call fbc method ---------");
- colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode);
- ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 0);
- }
- return ret;
-}
-
-int CTv::Tv_FactoryGetWhiteBalanceGreenGain(int source_type, int colortemp_mode)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactoryGetColorTemp_Ggain(source_type, colortemp_mode);
- } else { //use fbc store the white balance params
- colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode);
- ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 1);
- }
- return ret;
-}
-
-int CTv::Tv_FactoryGetWhiteBalanceBlueGain(int source_type, int colortemp_mode)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactoryGetColorTemp_Bgain(source_type, colortemp_mode);
- } else { //use fbc store the white balance params
- colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode);
- ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 2);
- }
- return ret;
-}
-
-int CTv::Tv_FactoryGetWhiteBalanceRedOffset(int source_type, int colortemp_mode)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactoryGetColorTemp_Roffset(source_type, colortemp_mode);
- } else { //use fbc store the white balance params
- colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode);
- ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 3);
- }
- return ret;
-}
-
-int CTv::Tv_FactoryGetWhiteBalanceGreenOffset(int source_type, int colortemp_mode)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactoryGetColorTemp_Goffset(source_type, colortemp_mode);
- } else { //use fbc store the white balance params
- colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode);
- ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 4);
- }
- return ret;
-}
-
-int CTv::Tv_FactoryGetWhiteBalanceBlueOffset(int source_type, int colortemp_mode)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactoryGetColorTemp_Boffset(source_type, colortemp_mode);
- } else { //use fbc store the white balance params
- colortemp_mode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode);
- ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 5);
- }
- return ret;
-}
-
-int CTv::Tv_FactorySetWhiteBalanceRedGain(int source_type, int colortemp_mode, int value)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (value < 0) {
- value = 0;
- } else if (value > 2047) {
- value = 2047;
- }
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactorySetColorTemp_Rgain(source_type, colortemp_mode, value);
- if (ret != -1) {
- LOGD("save the red gain to flash")
- ret = mVpp.Tv_FactorySaveColorTemp_Rgain(source_type, colortemp_mode, value);
- }
- } else { //use fbc store the white balance params
- value = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(value);
- ret = Tv_FactorySet_FBC_Gain_Red(value);
- }
- return ret;
-}
-
-int CTv::Tv_FactorySetWhiteBalanceGreenGain(int source_type, int colortemp_mode, int value)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (value < 0) {
- value = 0;
- } else if (value > 2047) {
- value = 2047;
- }
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactorySetColorTemp_Ggain(source_type, colortemp_mode, value);
- if (ret != -1) {
- LOGD("save the green gain to flash")
- ret = mVpp.Tv_FactorySaveColorTemp_Ggain(source_type, colortemp_mode, value);
- }
- } else { //use fbc store the white balance params
- value = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(value);
- ret = Tv_FactorySet_FBC_Gain_Green(value);
- }
- return ret;
-}
-
-int CTv::Tv_FactorySetWhiteBalanceBlueGain(int source_type, int colortemp_mode, int value)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (value < 0) {
- value = 0;
- } else if (value > 2047) {
- value = 2047;
- }
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactorySetColorTemp_Bgain(source_type, colortemp_mode, value);
- if (ret != -1) {
- LOGD("save the blue gain to flash")
- ret = mVpp.Tv_FactorySaveColorTemp_Bgain(source_type, colortemp_mode, value);
- }
- } else { //use fbc store the white balance params
- value = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(value);
- ret = Tv_FactorySet_FBC_Gain_Blue(value);
- }
- return ret;
-}
-
-int CTv::Tv_FactorySetWhiteBalanceRedOffset(int source_type, int colortemp_mode, int value)
-{
- int useFbc = 0;
- int ret = -1;
- if (value < -1024) {
- value = -1024;
- } else if (value > 1023) {
- value = 1023;
- }
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactorySetColorTemp_Roffset(source_type, colortemp_mode, value);
- if (ret != -1) {
- LOGD("save the red offset to flash")
- ret = mVpp.Tv_FactorySaveColorTemp_Roffset(source_type, colortemp_mode, value);
- }
- } else { //use fbc store the white balance params
- value = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(value);
- ret = Tv_FactorySet_FBC_Offset_Red(value);
- }
- return ret;
-}
-
-int CTv::Tv_FactorySetWhiteBalanceGreenOffset(int source_type, int colortemp_mode, int value)
-{
- int useFbc = 0;
- int ret = -1;
- if (value < -1024) {
- value = -1024;
- } else if (value > 1023) {
- value = 1023;
- }
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactorySetColorTemp_Goffset(source_type, colortemp_mode, value);
- if (ret != -1) {
- LOGD("save the green offset to flash")
- ret = mVpp.Tv_FactorySaveColorTemp_Goffset(source_type, colortemp_mode, value);
- }
- } else { //use fbc store the white balance params
- value = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(value);
- ret = Tv_FactorySet_FBC_Offset_Green(value);
- }
- return ret;
-}
-
-int CTv::Tv_FactorySetWhiteBalanceBlueOffset(int source_type, int colortemp_mode, int value)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (value < -1024) {
- value = -1024;
- } else if (value > 1023) {
- value = 1023;
- }
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_FactorySetColorTemp_Boffset(source_type, colortemp_mode, value);
- if (ret != -1) {
- LOGD("save the blue offset to flash")
- ret = mVpp.Tv_FactorySaveColorTemp_Boffset(source_type, colortemp_mode, value);
- }
- } else { //use fbc store the white balance params
- value = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(value);
- ret = Tv_FactorySet_FBC_Offset_Blue(value);
- }
- return ret;
-}
-
-
-int CTv::Tv_FactorySetWhiteBalanceColorTempMode(int source_type, int colortemp_mode, int is_save)
-{
- int useFbc = 0;
- int ret = -1;
- int colorTemp = 0;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_SetColorTemperature((vpp_color_temperature_mode_t)colortemp_mode, (tv_source_input_type_t)source_type, is_save);
- } else { //use fbc store the white balance params
- colorTemp = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(colortemp_mode);
- ret = Tv_FactorySet_FBC_ColorTemp_Mode(colorTemp);
- }
- return ret;
-}
-
-int CTv::Tv_FactoryGetWhiteBalanceColorTempMode(int source_type )
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.Tv_GetColorTemperature((tv_source_input_type_t)source_type);
- } else { //use fbc store the white balance params
- ret = Tv_FactoryGet_FBC_ColorTemp_Mode();
- ret = Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(ret);
- }
- return ret;
-}
-
-int CTv::Tv_FactoryWhiteBalanceFormatInputFbcGainParams(int value)
-{
- int ret = 1024;
- if (value < 0) {
- ret = 0;
- } else if (value > 2047) {
- ret = 2047;
- } else {
- ret = value;
- }
- ret = ret >> 3;
- return ret;
-}
-
-int CTv::Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(int value)
-{
- int ret = 0;
- if (value < -1024) {
- ret = -1024;
- } else if (value > 1023) {
- ret = 1023;
- } else {
- ret = value;
- }
- ret += 1024;
- ret = ret >> 3;
- return ret;
-}
-
-int CTv::Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(int value)
-{
- if (value == 255) {
- value = 1023;
- } else {
- value = value << 3;
- value -= 1024;
- }
- return value;
-}
-
-int CTv::Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(int value)
-{
- value = value << 3;
- if (value < 0) {
- value = 0;
- } else if (value > 2047) {
- value = 2047;
- }
- return value;
-}
-
-
-int CTv::Tv_FactorySaveWhiteBalancePramas(int source_type, int tempmode, int r_gain, int g_gain, int b_gain, int r_offset, int g_offset, int b_offset)
-{
- int useFbc = 0;
- int ret = 0;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- mVpp.Tv_SaveColorTemp((vpp_color_temperature_mode_t) tempmode, (tv_source_input_type_t) source_type);
- mVpp.Tv_FactorySaveColorTemp_Rgain(source_type, tempmode, r_gain);
- mVpp.Tv_FactorySaveColorTemp_Ggain(source_type, tempmode, g_gain);
- mVpp.Tv_FactorySaveColorTemp_Bgain(source_type, tempmode, b_gain);
- mVpp.Tv_FactorySaveColorTemp_Roffset(source_type, tempmode, r_offset);
- mVpp.Tv_FactorySaveColorTemp_Goffset(source_type, tempmode, g_offset);
- mVpp.Tv_FactorySaveColorTemp_Boffset(source_type, tempmode, b_offset);
- } else { //use fbc store the white balance params
- tcon_rgb_ogo_t params;
-
- params.r_gain = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(r_gain);
- params.g_gain = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(g_gain);
- params.b_gain = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(b_gain);
- params.r_post_offset = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(r_offset);
- params.g_post_offset = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(g_offset);
- params.b_post_offset = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(b_offset);
- tempmode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(tempmode);
- ret = Tv_FactorySet_FBC_ColorTemp_Batch((vpp_color_temperature_mode_t)tempmode, params);
- }
- return ret;
-}
-
-
-int CTv::Tv_FactoryCloseWhiteBalanceGrayPattern()
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = mVpp.VPP_SetGrayPattern(0);
- } else { //use fbc store the white balance params
- ret = Tv_FactoryClose_FBC_GrayPattern();
- }
- return ret;
-}
-
-int CTv::Tv_FactoryOpenWhiteBalanceGrayPattern()
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) { // not use fbc store the white balance params
- ret = 0;
- } else { //use fbc store the white balance params
- ret = Tv_FactoryOpen_FBC_GrayPattern();
- }
- return ret;
-}
-
-int CTv::Tv_FactorySetWhiteBalanceGrayPattern(int value)
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) {
- ret = mVpp.VPP_SetGrayPattern(value);
- } else {
- ret = Tv_FactorySet_FBC_GrayPattern(value);
- }
- return ret;
-}
-
-int CTv:: Tv_FactoryGetWhiteBalanceGrayPattern()
-{
- int useFbc = 0;
- int ret = -1;
- useFbc = GetPlatformHaveFBCFlag();
- if (useFbc == 0) {
- ret = mVpp.VPP_GetGrayPattern();
- } else {
-
- }
- return ret;
-}
-
-
-/**
-* The color temperature enum order is diffrent bettewn G9 and Fbc, so we have to make a mapping
-**/
-int CTv::Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(int Tempmode)
-{
- int ret = Tempmode;
- switch (Tempmode) {
- case 0: //standard
- ret = 1;
- break;
- case 1: //warm
- ret = 2;
- break;
- case 2: //cold
- ret = 0;
- break;
- default:
- break;
- }
- return ret;
-}
-
-/**
-* The color temperature enum order is diffrent bettewn G9 and Fbc, so we have to make a mapping
-**/
-int CTv::Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(int Tempmode)
-{
- int ret = Tempmode;
- switch (Tempmode) {
- case 0: //cold
- ret = 2;
- break;
- case 1: //standard
- ret = 0;
- break;
- case 2: //warm
- ret = 1;
- break;
- default:
- break;
- }
- return ret;
-}
-
-int CTv::Tv_FactoryWhiteBalanceGetAllParams(int Tempmode, tcon_rgb_ogo_t *params)
-{
- int ret = -1;
- Tempmode = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(Tempmode);
- ret = Tv_FactoryGet_FBC_ColorTemp_Batch((vpp_color_temperature_mode_t)Tempmode, params);
- params->r_gain = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(params->r_gain);
- params->g_gain = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(params->g_gain);
- params->b_gain = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(params->b_gain);
- params->r_post_offset = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(params->r_post_offset);
- params->g_post_offset = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(params->g_post_offset);
- params->b_post_offset = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(params->b_post_offset);
- return ret;
-}
-
-int CTv::Tv_FactorySet_FBC_GrayPattern(int value)
-{
- int ret = -1;
- unsigned char grayValue = 0;
- if (value > 255) {
- grayValue = 255;
- } else if (value < 0) {
- grayValue = 0;
- } else {
- grayValue = (unsigned char)(0xFF & value);
- }
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- ret = fbcIns->cfbc_WhiteBalance_SetGrayPattern(COMM_DEV_SERIAL, grayValue);
- }
- return ret;
-}
-
-int CTv::Tv_FactoryOpen_FBC_GrayPattern()
-{
- int ret = -1;
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- ret = fbcIns->cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_SERIAL, 0);
- }
- return ret;
-}
-
-int CTv::Tv_FactoryClose_FBC_GrayPattern()
-{
- int ret = -1;
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- ret = fbcIns->cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_SERIAL, 1);
- }
- return ret;
-}
-
-int CTv::Tv_FactorySet_FBC_ColorTemp_Mode( int mode )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_ColorTemp_Mode(COMM_DEV_SERIAL, mode);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_ColorTemp_Mode ( void )
-{
- int temp_mode = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_ColorTemp_Mode(COMM_DEV_SERIAL, &temp_mode);
- return temp_mode;
- }
-
- return 0;
-}
-int CTv::Tv_FactorySet_FBC_ColorTemp_Mode_N360( int mode )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_ColorTemp_Mode(COMM_DEV_SERIAL, mode);
- SSMSaveFBCN360ColorTempVal(mode);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_ColorTemp_Mode_N360 ( void )
-{
- int temp_mode = 0;
-
- SSMReadFBCN360ColorTempVal(&temp_mode);
-
- return temp_mode;
-}
-
-int CTv::Tv_FactorySet_FBC_WB_Initial( int status )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_WB_Initial(COMM_DEV_SERIAL, status);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_WB_Initial ( void )
-{
- int temp_status = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_WB_Initial(COMM_DEV_SERIAL, &temp_status);
- return temp_status;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_ColorTemp_Batch(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params)
-{
- unsigned char mode = 0, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset;
- switch(Tempmode) {
- case VPP_COLOR_TEMPERATURE_MODE_STANDARD:
- mode = 1; //COLOR_TEMP_STD
- break;
- case VPP_COLOR_TEMPERATURE_MODE_WARM:
- mode = 2; //COLOR_TEMP_WARM
- break;
- case VPP_COLOR_TEMPERATURE_MODE_COLD:
- mode = 3; //COLOR_TEMP_COLD
- break;
- case VPP_COLOR_TEMPERATURE_MODE_USER:
- mode = 3; //COLOR_TEMP_USER
- break;
- }
- r_gain = (params.r_gain * 255) / 2047; // u1.10, range 0~2047, default is 1024 (1.0x)
- g_gain = (params.g_gain * 255) / 2047;
- b_gain = (params.b_gain * 255) / 2047;
- r_offset = (params.r_post_offset + 1024) * 255 / 2047; // s11.0, range -1024~+1023, default is 0
- g_offset = (params.g_post_offset + 1024) * 255 / 2047;
- b_offset = (params.b_post_offset + 1024) * 255 / 2047;
- LOGD ( "~Tv_FactorySet_FBC_ColorTemp_Batch##%d,%d,%d,%d,%d,%d,##", r_gain, g_gain, b_gain, r_offset, g_offset, b_offset );
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_WB_Batch(COMM_DEV_SERIAL, mode, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_ColorTemp_Batch ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params )
-{
- unsigned char mode = 0, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset;
- switch(Tempmode) {
- case VPP_COLOR_TEMPERATURE_MODE_STANDARD:
- mode = 1; //COLOR_TEMP_STD
- break;
- case VPP_COLOR_TEMPERATURE_MODE_WARM:
- mode = 2; //COLOR_TEMP_WARM
- break;
- case VPP_COLOR_TEMPERATURE_MODE_COLD:
- mode = 3; //COLOR_TEMP_COLD
- break;
- case VPP_COLOR_TEMPERATURE_MODE_USER:
- mode = 3; //COLOR_TEMP_USER
- break;
- }
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_WB_Batch(COMM_DEV_SERIAL, mode, &r_gain, &g_gain, &b_gain, &r_offset, &g_offset, &b_offset);
- LOGD ( "~Tv_FactoryGet_FBC_ColorTemp_Batch##%d,%d,%d,%d,%d,%d,##", r_gain, g_gain, b_gain, r_offset, g_offset, b_offset );
-
- params->r_gain = (r_gain * 2047) / 255;
- params->g_gain = (g_gain * 2047) / 255;
- params->b_gain = (b_gain * 2047) / 255;
- params->r_post_offset = (r_offset * 2047) / 255 - 1024;
- params->g_post_offset = (g_offset * 2047) / 255 - 1024;
- params->b_post_offset = (b_offset * 2047) / 255 - 1024;
-
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactorySet_WB_G9_To_FBC( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params )
-{
- Tv_FactorySet_FBC_ColorTemp_Batch(Tempmode, params);
-
- return 0;
-}
-
-int CTv::Tv_FactoryGet_WB_G9_To_FBC ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params )
-{
- int temp_status = 0;
-
- Tv_FactoryGet_FBC_ColorTemp_Batch(Tempmode, params);
-
- return temp_status;
-}
-
-int CTv::Tv_FactoryGetItemFromBatch(vpp_color_temperature_mode_t colortemp_mode, int item)
-{
- tcon_rgb_ogo_t params;
- int ret = 0;
-
- Tv_FactoryGet_FBC_ColorTemp_Batch((vpp_color_temperature_mode_t)colortemp_mode, &params);
- switch(item) {
- case 0:
- ret = params.r_gain;
- ret = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(ret);
- break;
- case 1:
- ret = params.g_gain;
- ret = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(ret);
- break;
- case 2:
- ret = params.b_gain;
- ret = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(ret);
- break;
- case 3:
- ret = params.r_post_offset;
- ret = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(ret);
- break;
- case 4:
- ret = params.g_post_offset;
- ret = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(ret);
- break;
- case 5:
- ret = params.b_post_offset;
- ret = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(ret);
- break;
- default:
- ret = 0;
- }
- return ret;
-
-}
-
-
-int CTv::Tv_FactorySet_FBC_CM_OnOff( unsigned char status )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_CM(COMM_DEV_SERIAL, status);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_CM_OnOff (void)
-{
- int temp_status = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_CM(COMM_DEV_SERIAL, &temp_status);
- return temp_status;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_DNLP_OnOff( unsigned char status )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_DNLP(COMM_DEV_SERIAL, status);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_DNLP_OnOff (void)
-{
- int temp_status = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_DNLP(COMM_DEV_SERIAL, &temp_status);
- return temp_status;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_Gamma_OnOff( unsigned char status )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Gamma(COMM_DEV_SERIAL, status);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Gamma_OnOff (void)
-{
- int temp_status = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Gamma(COMM_DEV_SERIAL, &temp_status);
- return temp_status;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_WhiteBalance_OnOff( unsigned char status )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_WhiteBalance_OnOff(COMM_DEV_SERIAL, status);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_WhiteBalance_OnOff (void)
-{
- int temp_status = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_WhiteBalance_OnOff(COMM_DEV_SERIAL, &temp_status);
- return temp_status;
- }
-
- return 0;
-}
-
-
-int CTv::Tv_FactorySet_FBC_backlight_onoff ( int value )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_backlight_onoff(COMM_DEV_SERIAL, value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_backlight_onoff ( void )
-{
- int temp_value = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_backlight_onoff(COMM_DEV_SERIAL, &temp_value);
- return temp_value;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_LVDS_SSG_Set( int value )
-{
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_LVDS_SSG_Set(COMM_DEV_SERIAL, value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactorySet_FBC_LightSensor_Status_N310 ( int value )
-{
- int temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_LightSensor_N310(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_LightSensor_Status_N310 ( void )
-{
- int temp_value = 0;
- int data = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_LightSensor_N310(COMM_DEV_SERIAL, &temp_value);
-
- data = temp_value;
-
- return data;
- }
-
- return 0;
-}
-int CTv::Tv_FactorySet_FBC_Dream_Panel_Status_N310 ( int value )
-{
- int temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_Dream_Panel_N310(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_Dream_Panel_Status_N310 ( void )
-{
- int temp_value = 0;
- int data = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_Dream_Panel_N310(COMM_DEV_SERIAL, &temp_value);
-
- data = temp_value;
-
- return data;
- }
-
- return 0;
-}
-
-int CTv::Tv_FactorySet_FBC_MULT_PQ_Status_N310 ( int value )
-{
- int temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_MULT_PQ_N310(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_MULT_PQ_Status_N310 ( void )
-{
- int temp_value = 0;
- int data = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_MULT_PQ_N310(COMM_DEV_SERIAL, &temp_value);
-
- data = temp_value;
-
- return data;
- }
-
- return 0;
-}
-int CTv::Tv_FactorySet_FBC_MEMC_Status_N310 ( int value )
-{
- int temp_value = value;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Set_MEMC_N310(COMM_DEV_SERIAL, temp_value);
- return 0;
- }
-
- return -1;
-}
-
-int CTv::Tv_FactoryGet_FBC_MEMC_Status_N310 ( void )
-{
- int temp_value = 0;
- int data = 0;
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- fbcIns->cfbc_Get_MEMC_N310(COMM_DEV_SERIAL, &temp_value);
-
- data = temp_value;
-
- return data;
- }
-
- return 0;
-}
-
-
-
-//audio
-int CTv::SetAudioMuteForSystem(int muteOrUnmute)
-{
- return mTvAudio.SetAudioMuteForSystem(muteOrUnmute);
-}
-
-int CTv::GetAudioMuteForSystem()
-{
- return mTvAudio.GetAudioMuteForSystem();
-}
-
-int CTv::SetAudioAVOutMute(int muteStatus)
-{
- return mTvAudio.SetAudioAVOutMute(muteStatus);
-}
-
-int CTv::GetAudioAVOutMute()
-{
- return mTvAudio.GetAudioAVOutMute();
-}
-
-int CTv::SetAudioSPDIFMute(int muteStatus)
-{
- return mTvAudio.SetAudioSPDIFMute(muteStatus);
-}
-
-int CTv::GetAudioSPDIFMute()
-{
- return mTvAudio.GetAudioSPDIFMute();
-}
-int CTv::SetAudioMasterVolume(int tmp_vol)
-{
- return mTvAudio.SetAudioMasterVolume(tmp_vol);
-}
-
-int CTv::GetAudioMasterVolume()
-{
- return mTvAudio.GetAudioMasterVolume();
-}
-
-int CTv::SaveCurAudioMasterVolume(int tmp_vol)
-{
- return mTvAudio.SaveCurAudioMasterVolume(tmp_vol);
-}
-
-int CTv::GetCurAudioMasterVolume()
-{
- return mTvAudio.GetCurAudioMasterVolume();
-}
-
-int CTv::SetAudioBalance(int tmp_val)
-{
- return mTvAudio.SetAudioBalance(tmp_val);
-}
-
-int CTv::GetAudioBalance()
-{
- return mTvAudio.GetAudioBalance();
-}
-
-int CTv::SaveCurAudioBalance(int tmp_val)
-{
- return mTvAudio.SaveCurAudioBalance(tmp_val);
-}
-
-int CTv::GetCurAudioBalance()
-{
- return mTvAudio.GetCurAudioBalance();
-}
-
-
-int CTv::SetAudioSupperBassVolume(int tmp_vol)
-{
- return mTvAudio.SetAudioSupperBassVolume(tmp_vol);
-}
-
-int CTv::GetAudioSupperBassVolume()
-{
- return mTvAudio.GetAudioSupperBassVolume();
-}
-
-int CTv::SaveCurAudioSupperBassVolume(int tmp_vol)
-{
- return mTvAudio.SaveCurAudioSupperBassVolume(tmp_vol);
-}
-
-int CTv::GetCurAudioSupperBassVolume()
-{
- return mTvAudio.GetCurAudioSupperBassVolume();
-}
-int CTv::SetAudioSupperBassSwitch(int tmp_val)
-{
- return mTvAudio.SetAudioSupperBassSwitch(tmp_val);
-}
-
-int CTv::GetAudioSupperBassSwitch()
-{
- return mTvAudio.GetAudioSupperBassSwitch();
-}
-
-int CTv::SaveCurAudioSupperBassSwitch(int tmp_val)
-{
- return mTvAudio.SaveCurAudioSupperBassSwitch(tmp_val);
-}
-
-int CTv::GetCurAudioSupperBassSwitch()
-{
- return mTvAudio.GetCurAudioSupperBassSwitch();
-}
-
-int CTv::SetAudioSRSSurround(int tmp_val)
-{
- return mTvAudio.SetAudioSRSSurround(tmp_val);
-}
-
-int CTv::GetAudioSRSSurround()
-{
- return mTvAudio.GetAudioSRSSurround();
-}
-
-int CTv::SaveCurAudioSrsSurround(int tmp_val)
-{
- return mTvAudio.SaveCurAudioSrsSurround(tmp_val);
-}
-
-int CTv::GetCurAudioSRSSurround()
-{
- return mTvAudio.GetCurAudioSRSSurround();
-}
-
-int CTv::SetAudioSrsDialogClarity(int tmp_val)
-{
- return mTvAudio.SetAudioSrsDialogClarity(tmp_val);
-}
-
-int CTv::GetAudioSrsDialogClarity()
-{
- return mTvAudio.GetAudioSrsDialogClarity();
-}
-
-int CTv::SaveCurAudioSrsDialogClarity(int tmp_val)
-{
- return mTvAudio.SaveCurAudioSrsDialogClarity(tmp_val);
-}
-
-int CTv::GetCurAudioSrsDialogClarity()
-{
- return mTvAudio.GetCurAudioSrsDialogClarity();
-}
-
-int CTv::SetAudioSrsTruBass(int tmp_val)
-{
- return mTvAudio.SetAudioSrsTruBass(tmp_val);
-}
-
-int CTv::GetAudioSrsTruBass()
-{
- return mTvAudio.GetAudioSrsTruBass();
-}
-
-int CTv::SaveCurAudioSrsTruBass(int tmp_val)
-{
- return mTvAudio.SaveCurAudioSrsTruBass(tmp_val);
-}
-
-int CTv::GetCurAudioSrsTruBass()
-{
- return mTvAudio.GetCurAudioSrsTruBass();
-}
-
-int CTv::SetAudioBassVolume(int tmp_vol)
-{
- return mTvAudio.SetAudioBassVolume(tmp_vol);
-}
-
-int CTv::GetAudioBassVolume()
-{
- return mTvAudio.GetAudioBassVolume();
-}
-
-int CTv::SaveCurAudioBassVolume(int tmp_vol)
-{
- return mTvAudio.SaveCurAudioBassVolume(tmp_vol);
-}
-
-int CTv::GetCurAudioBassVolume()
-{
- return mTvAudio.GetCurAudioBassVolume();
-}
-
-int CTv::SetAudioTrebleVolume(int tmp_vol)
-{
- return mTvAudio.SetAudioTrebleVolume(tmp_vol);
-}
-
-int CTv::GetAudioTrebleVolume()
-{
- return mTvAudio.GetAudioTrebleVolume();
-}
-
-int CTv::SaveCurAudioTrebleVolume(int tmp_vol)
-{
- return mTvAudio.SaveCurAudioTrebleVolume(tmp_vol);
-}
-
-int CTv::GetCurAudioTrebleVolume()
-{
- return mTvAudio.GetCurAudioTrebleVolume();
-}
-
-int CTv::SetAudioSoundMode(int tmp_val)
-{
- return mTvAudio.SetAudioSoundMode(tmp_val);
-}
-
-int CTv::GetAudioSoundMode()
-{
- return mTvAudio.GetAudioSoundMode();
-}
-
-int CTv::SaveCurAudioSoundMode(int tmp_val)
-{
- return mTvAudio.SaveCurAudioSoundMode(tmp_val);
-}
-
-int CTv::GetCurAudioSoundMode()
-{
- return mTvAudio.GetCurAudioSoundMode();
-}
-
-int CTv::SetAudioWallEffect(int tmp_val)
-{
- return mTvAudio.SetAudioWallEffect(tmp_val);
-}
-
-int CTv::GetAudioWallEffect()
-{
- return mTvAudio.GetAudioWallEffect();
-}
-
-int CTv::SaveCurAudioWallEffect(int tmp_val)
-{
- return mTvAudio.SaveCurAudioWallEffect(tmp_val);
-}
-
-int CTv::GetCurAudioWallEffect()
-{
- return mTvAudio.GetCurAudioWallEffect();
-}
-
-
-int CTv::SetAudioEQMode(int tmp_val)
-{
- return mTvAudio.SetAudioEQMode(tmp_val);
-}
-
-int CTv::GetAudioEQMode()
-{
- return mTvAudio.GetAudioEQMode();
-}
-
-int CTv::SaveCurAudioEQMode(int tmp_val)
-{
- return mTvAudio.SaveCurAudioEQMode(tmp_val);
-}
-
-int CTv::GetCurAudioEQMode()
-{
- return mTvAudio.GetCurAudioEQMode();
-}
-
-int CTv::GetAudioEQRange(int range_buf[])
-{
- return mTvAudio.GetAudioEQRange(range_buf);
-}
-
-int CTv::SetAudioEQGain(int gain_buf[])
-{
- return mTvAudio.SetAudioEQGain(gain_buf);
-}
-
-int CTv::GetAudioEQGain(int gain_buf[])
-{
- return mTvAudio.GetAudioEQGain(gain_buf);
-}
-
-int CTv::SaveCurAudioEQGain(int gain_buf[])
-{
- return mTvAudio.SaveCurAudioEQGain(gain_buf);
-}
-
-int CTv::GetCurAudioEQGain(int gain_buf[])
-{
- return mTvAudio.GetCurAudioEQGain(gain_buf);
-}
-
-int CTv::GetAudioEQBandCount()
-{
- return mTvAudio.GetAudioEQBandCount();
-}
-
-
-
-int CTv::SetAudioEQSwitch(int switch_val)
-{
- return mTvAudio.SetAudioEQSwitch(switch_val);
-}
-
-int CTv::SetAudioSPDIFSwitch(int tmp_val)
-{
- return mTvAudio.SetAudioSPDIFSwitch(tmp_val);
-}
-
-/*showboz public int GetAudioSPDIFSwitch() {
- mTvAudio.GetAudioSPDIFSwitch();
-}*/
-
-int CTv::amAudioSetDoubleOutputSwitch(int en_val)
-{
- return mTvAudio.amAudioSetDoubleOutputSwitch(en_val);
-}
-int CTv::UsbAudioOuputModuleSwitch(int sw)
-{
- return mTvAudio.UsbAudioOuputModuleSwitch(sw);
-}
-
-int CTv::GetAmAudioSetDoubleOutputSwitch()
-{
- return mTvAudio.GetAmAudioSetDoubleOutputSwitch();
-}
-
-int CTv::GetCurUsbAudioOuputModuleSwitch()
-{
- return mTvAudio.GetCurUsbAudioOuputModuleSwitch();
-}
-
-int CTv::SaveCurAudioSPDIFSwitch(int tmp_val)
-{
- return mTvAudio.SaveCurAudioSPDIFSwitch(tmp_val);
-}
-
-int CTv::GetCurAudioSPDIFSwitch()
-{
- return mTvAudio.GetCurAudioSPDIFSwitch();
-}
-int CTv::SetAudioSPDIFMode(int tmp_val)
-{
- return mTvAudio.SetAudioSPDIFMode(tmp_val);
-}
-
-/* public int GetAudioSPDIFMode() {
-mTvAudio.GetAudioSPDIFMode();
-showboz */
-
-
-int CTv::SaveCurAudioSPDIFMode(int tmp_val)
-{
- return mTvAudio.SaveCurAudioSPDIFMode(tmp_val);
-}
-
-int CTv::GetCurAudioSPDIFMode()
-{
- return mTvAudio.GetCurAudioSPDIFMode();
-}
-
-int CTv::OpenAmAudio(unsigned int sr, int output_device)
-{
- return mTvAudio.OpenAmAudio(sr, output_device);
-}
-
-int CTv::CloseAmAudio(void)
-{
- return mTvAudio.CloseAmAudio();
-}
-
-int CTv::SetAmAudioInputSr(unsigned int sr, int output_device)
-{
- return mTvAudio.SetAmAudioInputSr(sr, output_device);
-}
-
-int CTv::SetAmAudioOutputMode(int mode)
-{
- return mTvAudio.SetAmAudioOutputMode(mode);
-}
-
-int CTv::SetAmAudioMusicGain(int gain)
-{
- return mTvAudio.SetAmAudioMusicGain(gain);
-}
-
-int CTv::SetAmAudioLeftGain(int gain)
-{
- return mTvAudio.SetAmAudioLeftGain(gain);
-}
-
-
-int CTv::SetAmAudioRightGain(int gain)
-{
- return mTvAudio.SetAmAudioRightGain(gain);
-}
-
-int CTv::AudioLineInSelectChannel(int audio_channel)
-{
- return mTvAudio.AudioLineInSelectChannel(audio_channel);
-}
-
-int CTv::SetKalaokIO(int level)
-{
- return mTvAudio.SetKalaokIO(level);
-}
-int CTv::AudioSetAudioInSource(int audio_src_in_type)
-{
- return mTvAudio.AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN);
-}
-
-int CTv::AudioSetLineInCaptureVolume(int l_vol, int r_vol)
-{
- return mTvAudio.AudioSetLineInCaptureVolume(l_vol, r_vol);
-}
-
-int CTv::AudioHandleHeadsetPlugIn()
-{
- return mTvAudio.AudioHandleHeadsetPlugIn();
-}
-
-int CTv::AudioHandleHeadsetPullOut()
-{
- return mTvAudio.AudioHandleHeadsetPullOut();
-}
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTv.cpp
+// @ Date : 2013-11
+// @ Author :
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <am_epg.h>
+#include <am_mem.h>
+#include "CTvDatabase.h"
+#include <stdlib.h>
+#include <string.h>
+#include <malloc.h>
+#include <pthread.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <dlfcn.h>
+#include <cutils/properties.h>
+#include <cutils/log.h>
+#include <cutils/android_reboot.h>
+#include <utils/threads.h>
+#include <time.h>
+#include <sys/prctl.h>
+#include <getopt.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#ifdef ANDROID
+#include <termios.h>
+#endif
+#include <string.h>
+#include <signal.h>
+
+#include "../version/version.h"
+#include "../tvsetting/CTvSetting.h"
+#include "../tvutils/tvutils.h"
+#include "../tvconfig/tvconfig.h"
+#include "../tvutils/CFile.h"
+#include <hardware_legacy/power.h>
+#include "../tvutils/serial_operate.h"
+#include <xxxconfig.h>
+
+extern "C" {
+#include "am_ver.h"
+#include "am_misc.h"
+#include "am_debug.h"
+#include "am_fend.h"
+}
+
+#include <math.h>
+#include <sys/ioctl.h>
+
+#include "CTv.h"
+
+#define LOG_TAG "CTv"
+
+
+using namespace android;
+
+// Called each time a message is logged.
+static void sqliteLogCallback(void *data, int iErrCode, const char *zMsg)
+{
+ LOGD( "showbo sqlite (%d) %s\n", iErrCode, zMsg);
+}
+
+
+
+CTv::CTv() : mSigDetectThread ( &mTvin ), mSourceConnectDetectThread(&mTvin), mHDMIRxCEC ( &mTvin ), mTvScanner ( &mTvin ), mTvMsgQueue(this), mAutoBackLight( &mVpp, &mTvin ), mTvScannerDetectObserver(this), mAutoPQparam( &mVpp, &mTvin, &mAv )
+{
+ mAudioMuteStatusForTv = CC_AUDIO_UNMUTE;
+ mAudioMuteStatusForSystem = CC_AUDIO_UNMUTE;
+ //mpClient = pClient;
+ //copy file to param
+ if ( Tv_Utils_IsFileExist ( TV_CONFIG_FILE_SYSTEM_PATH ) == 0 ) {
+ if ( Tv_Utils_IsFileExist ( TV_CONFIG_FILE_PARAM_PATH ) != 0 ) {
+ CFile file ( TV_CONFIG_FILE_SYSTEM_PATH );
+
+ if ( file.copyTo ( TV_CONFIG_FILE_PARAM_PATH ) != 0 ) {
+ LOGE ( "%s, copy file = %s , error", __FUNCTION__, TV_CONFIG_FILE_PARAM_PATH );
+ }
+ }
+ }
+
+ if ( Tv_Utils_IsFileExist ( TV_CHANNEL_LIST_SYSTEM_PATH ) == 0 ) {
+ if ( Tv_Utils_IsFileExist ( TV_CHANNEL_LIST_PARAM_PATH ) != 0 ) {
+ CFile file ( TV_CHANNEL_LIST_SYSTEM_PATH );
+
+ if ( file.copyTo ( TV_CHANNEL_LIST_PARAM_PATH ) != 0 ) {
+ LOGE ( "%s, copy file = %s , error", __FUNCTION__, TV_CHANNEL_LIST_PARAM_PATH );
+ }
+ }
+ }
+
+ //ssm
+ if ( Tv_Utils_IsFileExist ( TV_SSM_DATA_SYSTEM_PATH ) == 0 ) {
+ if ( Tv_Utils_IsFileExist ( TV_SSM_DATA_PARAM_PATH ) != 0 ) {
+ CFile file ( TV_SSM_DATA_SYSTEM_PATH );
+
+ if ( file.copyTo ( TV_SSM_DATA_PARAM_PATH ) != 0 ) {
+ LOGE ( "%s, copy file = %s , error", __FUNCTION__, TV_SSM_DATA_PARAM_PATH );
+ }
+ }
+ }
+
+ AM_EVT_Init();
+ mTvEpg.setObserver ( &mTvMsgQueue );
+ mpObserver = NULL;
+ mB_hdmiout_fbc = false;
+ fbcIns = NULL;
+ dtv_auto_3d_flag = 0;
+ m_autoset_displayfreq = false;
+
+ tv_config_load ( TV_CONFIG_FILE_PATH );
+ sqlite3_config (SQLITE_CONFIG_SERIALIZED);
+ //sqlite3_config(SQLITE_CONFIG_LOG, &sqliteLogCallback, (void*)1);
+ sqlite3_soft_heap_limit(8 * 1024 * 1024);
+ // Initialize SQLite.
+ sqlite3_initialize();
+ CTvDatabase::GetTvDb()->InitTvDb ( TV_DB_PATH );
+
+ if ( CTvDimension::isDimensionTblExist() == false ) {
+ CTvDimension::builtinAtscDimensions();
+ }
+
+ CTvSettingLoad();
+
+ mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
+ if (hdmi_out_towhat() == 1) {
+ mB_hdmiout_fbc = true;
+ } else {
+ mB_hdmiout_fbc = false;
+ }
+
+ m_sig_stable_nums = 0;
+ m_is_set_hdmi_edid = false;
+ m_cur_playing_prog_id = -1;
+
+ m_hdmi_audio_data = 0;
+ mSigDetectThread.setObserver ( this );
+ mSourceConnectDetectThread.setObserver ( this );
+ mHDMIRxCEC.setObserver(this);
+ mFrontDev.setObserver ( &mTvMsgQueue );
+ mpUpgradeFBC = NULL;
+ if (mB_hdmiout_fbc) {
+ fbcIns = GetSingletonFBC();
+
+ mpUpgradeFBC = new CUpgradeFBC();
+ mpUpgradeFBC->setObserver(this);
+ }
+ mSerialA.setObserver(this);
+ mSerialB.setObserver(this);
+ mSerialC.setObserver(this);
+ mSubtitle.setObserver(this);
+ mHeadSet.setObserver(this);
+ mTvScanner.setGlobalScanerObject(&mTvScanner);
+ mAv.setObserver(&mTvMsgQueue);
+ mMainVolLutTableExtraName[0] = '\0';
+ //-----------------------------------------------------------
+ mCurAudioMasterVolume = CC_DEF_SOUND_VOL;
+ mCurAudioBalance = CC_DEF_SOUND_BALANCE_VAL;
+ mCurAudioSupperBassVolume = CC_DEF_SUPPERBASS_VOL;
+ mCurAudioSupperBassSwitch = CC_SWITCH_OFF;
+ mCurAudioSRSSurround = CC_SWITCH_OFF;
+ mCurAudioSrsDialogClarity = CC_SWITCH_OFF;
+ mCurAudioSrsTruBass = CC_SWITCH_OFF;
+ mCurAudioSPDIFSwitch = CC_SWITCH_ON;
+ mCurAudioSPDIFMode = CC_SPDIF_MODE_PCM;
+ mCurAudioBassVolume = CC_DEF_BASS_TREBLE_VOL;
+ mCurAudioTrebleVolume = CC_DEF_BASS_TREBLE_VOL;
+ mCurAudioSoundMode = CC_SOUND_MODE_END;
+ mCurAudioWallEffect = CC_SWITCH_OFF;
+ mCurAudioEQMode = CC_EQ_MODE_START;
+ mCustomAudioMasterVolume = CC_DEF_SOUND_VOL;
+ mCustomAudioBalance = CC_DEF_SOUND_BALANCE_VAL;
+ mCustomAudioSupperBassVolume = CC_DEF_SUPPERBASS_VOL;
+ mCustomAudioSupperBassSwitch = CC_SWITCH_OFF;
+ mCustomAudioSRSSurround = CC_SWITCH_OFF;
+ mCustomAudioSrsDialogClarity = CC_SWITCH_OFF;
+ mCustomAudioSrsTruBass = CC_SWITCH_OFF;
+ mCustomAudioBassVolume = CC_DEF_BASS_TREBLE_VOL;
+ mCustomAudioTrebleVolume = CC_DEF_BASS_TREBLE_VOL;
+ mCustomAudioSoundMode = CC_SOUND_MODE_END;
+ mCustomAudioWallEffect = CC_SWITCH_OFF;
+ mCustomAudioEQMode = CC_EQ_MODE_START;
+ mCustomAudioSoundEnhancementSwitch = CC_SWITCH_OFF;
+ mVolumeCompensationVal = 0;
+
+ mMainVolumeBalanceVal = 0;
+ for (int i = 0; i < CC_BAND_ITEM_CNT; i++) {
+ mCustomEQGainBuf[i] = 0;
+ mCurEQGainBuf[i] = 0;
+ mCurEQGainChBuf[i] = 0;
+ }
+ static const int WALL_EFFECT_VALUE[CC_BAND_ITEM_CNT] = { 0, 0, 1, 2, 2, 0 };
+ for (int i = 0; i < CC_BAND_ITEM_CNT; i++) {
+ mWallEffectValueBuf[i] = WALL_EFFECT_VALUE[i];
+ }
+ mTvAction = mTvAction & TV_ACTION_NULL;
+ mTvStatus = TV_INIT_ED;
+ print_version_info();
+};
+
+CTv::~CTv()
+{
+ int iRet;
+ mpObserver = NULL;
+ CTvSettingunLoad();
+ CTvDatabase::deleteTvDb();
+ tv_config_unload();
+ mAv.Close();
+ mTvStatus = TV_INIT_ED;
+ mFrontDev.Close();
+
+ if (mpUpgradeFBC != NULL) {
+ delete mpUpgradeFBC;
+ mpUpgradeFBC = NULL;
+ }
+}
+
+void CTv::onEvent ( const CTvScanner::ScannerEvent &ev )
+{
+ LOGD ( "%s, CTv::onEvent lockStatus = %d type = %d\n", __FUNCTION__, ev.mLockedStatus, ev.mType );
+
+ if ( mDtvScanRunningStatus == DTV_SCAN_RUNNING_ANALYZE_CHANNEL ) {
+ if ( ev.mType == CTvScanner::ScannerEvent::EVENT_SCAN_END ) {
+ CMessage msg;
+ msg.mType = CTvMsgQueue::TV_MSG_STOP_ANALYZE_TS;
+ msg.mpData = this;
+ mTvMsgQueue.sendMsg ( msg );
+ } else if ( ev.mType == CTvScanner::ScannerEvent::EVENT_STORE_END ) {
+ CTvEpg::EpgEvent epgev;
+ epgev.type = CTvEpg::EpgEvent::EVENT_CHANNEL_UPDATE_END;
+ mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
+ sendTvEvent ( epgev );
+ }
+ } else {
+ sendTvEvent ( ev );
+ }
+}
+
+void CTv::onEvent ( const CFrontEnd::FEEvent &ev )
+{
+ const char *config_value = NULL;
+ LOGD ( "%s, FE event type = %d tvaction=%x", __FUNCTION__, ev.mCurSigStaus, mTvAction);
+ if (mTvAction & TV_ACTION_SCANNING) return;
+
+ //å‰ç«¯äº‹ä»¶å“应处ç†
+ if ( ev.mCurSigStaus == CFrontEnd::FEEvent::EVENT_FE_HAS_SIG ) { //作为信å·ç¨³å®š
+ if (/*m_source_input == SOURCE_TV || */m_source_input == SOURCE_DTV && (mTvAction & TV_ACTION_PLAYING)) { //atv and other tvin source not to use it, and if not playing, not use have sig
+ if ( m_win_mode == PREVIEW_WONDOW ) {
+ //mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2);
+ mAv.setVideoScreenMode ( CAv::VIDEO_WIDEOPTION_FULL_STRETCH );
+ }
+
+ if ( m_autoset_displayfreq) {
+ mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution() , mB_hdmiout_fbc);
+ }
+ TvEvent::SignalInfoEvent ev;
+ ev.mStatus = TVIN_SIG_STATUS_STABLE;
+ ev.mTrans_fmt = TVIN_TFMT_2D;
+ ev.mFmt = TVIN_SIG_FMT_NULL;
+ ev.mReserved = 0;
+ sendTvEvent ( ev );
+ //if (mAv.WaittingVideoPlaying() == 0) {
+ SetDisplayMode ( mVpp.GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mAv.getVideoResolutionToFmt());
+ usleep(50 * 1000);
+ mAv.EnableVideoNow();
+ SetAudioMuteForTv ( CC_AUDIO_UNMUTE );
+ //}
+ Tv_SetAudioInSource(SOURCE_DTV);
+ }
+ } else if ( ev.mCurSigStaus == CFrontEnd::FEEvent::EVENT_FE_NO_SIG ) { //作为信å·æ¶ˆå¤±
+ if (/*m_source_input == SOURCE_TV || */m_source_input == SOURCE_DTV && (mTvAction & TV_ACTION_PLAYING)) { //just playing
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mAv.DisableVideoWithBlackColor();
+ } else {
+ mAv.DisableVideoWithBlueColor();
+ }
+ SetAudioMuteForTv ( CC_AUDIO_MUTE );
+ //
+ TvEvent::SignalInfoEvent ev;
+ ev.mStatus = TVIN_SIG_STATUS_NOSIG;
+ ev.mTrans_fmt = TVIN_TFMT_2D;
+ ev.mFmt = TVIN_SIG_FMT_NULL;
+ ev.mReserved = 0;
+ sendTvEvent ( ev );
+ }
+ }
+
+}
+
+void CTv::onEvent ( const CTvEpg::EpgEvent &ev )
+{
+ switch ( ev.type ) {
+ case CTvEpg::EpgEvent::EVENT_TDT_END:
+ LOGD ( "%s, CTv::onEvent epg time = %ld", __FUNCTION__, ev.time );
+ mTvTime.setTime ( ev.time );
+ break;
+
+ case CTvEpg::EpgEvent::EVENT_CHANNEL_UPDATE: {
+ LOGD ( "%s, CTv:: onEvent channel update", __FUNCTION__ );
+ CMessage msg;
+ msg.mType = CTvMsgQueue::TV_MSG_START_ANALYZE_TS;
+ msg.mpData = this;
+ mCurAnalyzeTsChannelID = ev.channelID;
+ mTvMsgQueue.sendMsg ( msg );
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ sendTvEvent ( ev );
+}
+
+
+void CTv::onEvent(const CAv::AVEvent &ev)
+{
+ const char *config_value = NULL;
+ LOGD("AVEvent = %d", ev.type);
+ switch ( ev.type ) {
+ case CAv::AVEvent::EVENT_AV_STOP: {
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mAv.DisableVideoWithBlackColor();
+ } else {
+ mAv.DisableVideoWithBlueColor();
+ }
+ SetAudioMuteForTv ( CC_AUDIO_MUTE );
+ //
+ TvEvent::SignalInfoEvent ev;
+ ev.mStatus = TVIN_SIG_STATUS_NOSIG;
+ ev.mTrans_fmt = TVIN_TFMT_2D;
+ ev.mFmt = TVIN_SIG_FMT_NULL;
+ ev.mReserved = 0;
+ sendTvEvent ( ev );
+ break;
+ }
+ case CAv::AVEvent::EVENT_AV_RESUEM: {
+ //if (mAv.WaittingVideoPlaying() == 0) {
+ SetDisplayMode ( mVpp.GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mAv.getVideoResolutionToFmt());
+ usleep(50 * 1000);
+ mAv.EnableVideoNow();
+ SetAudioMuteForTv ( CC_AUDIO_UNMUTE );
+ //}
+ TvEvent::AVPlaybackEvent AvPlayBackEvt;
+ AvPlayBackEvt.mMsgType = TvEvent::AVPlaybackEvent::EVENT_AV_PLAYBACK_RESUME;
+ AvPlayBackEvt.mProgramId = ( int ) ev.param;
+ sendTvEvent(AvPlayBackEvt );
+ break;
+ }
+ case CAv::AVEvent::EVENT_AV_SCAMBLED: {
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mAv.DisableVideoWithBlackColor();
+ } else {
+ mAv.DisableVideoWithBlueColor();
+ }
+ TvEvent::AVPlaybackEvent AvPlayBackEvt;
+ AvPlayBackEvt.mMsgType = TvEvent::AVPlaybackEvent::EVENT_AV_SCAMBLED;
+ AvPlayBackEvt.mProgramId = ( int ) ev.param;
+ sendTvEvent(AvPlayBackEvt );
+ break;
+ }
+ case CAv::AVEvent::EVENT_AV_UNSUPPORT: {
+ LOGD("To AVS or AVS+ format");//just avs format, not unsupport, and avs avs+
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+CTv::CTvMsgQueue::CTvMsgQueue(CTv *tv)
+{
+ mpTv = tv;
+}
+
+CTv::CTvMsgQueue::~CTvMsgQueue()
+{
+}
+
+void CTv::CTvMsgQueue::handleMessage ( CMessage &msg )
+{
+ LOGD ( "%s, CTv::CTvMsgQueue::handleMessage type = %d", __FUNCTION__, msg.mType );
+
+ switch ( msg.mType ) {
+ case TV_MSG_COMMON:
+ break;
+
+ case TV_MSG_STOP_ANALYZE_TS: {
+ //mpTv->Tv_Stop_Analyze_Ts();
+ break;
+ }
+
+ case TV_MSG_START_ANALYZE_TS: {
+ //mpTv->Tv_Start_Analyze_Ts ( pTv->mCurAnalyzeTsChannelID );
+ break;
+ }
+
+ case TV_MSG_CHECK_FE_DELAY: {
+ mpTv->mFrontDev.checkStatusOnce();
+ break;
+ }
+ case TV_MSG_AV_EVENT: {
+ mpTv->onEvent(*((CAv::AVEvent *)(msg.mpPara)));
+ break;
+ }
+ case TV_MSG_FE_EVENT: {
+ mpTv->onEvent(*((CFrontEnd::FEEvent *)(msg.mpPara)));
+ break;
+ }
+ case TV_MSG_SCAN_EVENT: {
+ mpTv->onEvent(*((CTvScanner::ScannerEvent *)(msg.mpPara)));
+ break;
+ }
+ case TV_MSG_EPG_EVENT: {
+ mpTv->onEvent(*((CTvEpg::EpgEvent *)(msg.mpPara)));
+ break;
+ }
+
+ case TV_MSG_HDMI_SR_CHANGED: {
+ int sr = ((int *)(msg.mpPara))[0];
+ mpTv->onHdmiSrChanged(sr, (((int *)(msg.mpPara))[1] == 0) ? true : false);
+ break;
+ }
+ case TV_MSG_ENABLE_VIDEO_LATER: {
+ int fc = msg.mpPara[0];
+ mpTv->onEnableVideoLater(fc);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+void CTv::onHdmiSrChanged(int sr, bool bInit)
+{
+ if (bInit) {
+ LOGD ( "%s, Init HDMI audio, sampling rate:%d", __FUNCTION__, sr );
+ sr = HanldeAudioInputSr(sr);
+ InitTvAudio (sr, CC_IN_USE_SPDIF_DEVICE);
+ } else {
+ LOGD ( "%s, Reset HDMI sampling rate to %d", __FUNCTION__, sr );
+ AudioChangeSampleRate ( sr );
+ }
+}
+
+void CTv::onHMDIAudioStatusChanged(int status)
+{
+ if (status == 0) {//change to no audio data
+ SetAudioMuteForTv ( CC_AUDIO_MUTE );
+ } else if (status == 1) {//change to audio data come
+ Tv_SetAudioInSource(m_source_input);
+ usleep(200 * 1000);
+ SetAudioMuteForTv ( CC_AUDIO_UNMUTE );
+ }
+}
+
+void CTv::CTvMsgQueue::onEvent ( const CTvScanner::ScannerEvent &ev )
+{
+ CMessage msg;
+ msg.mDelayMs = 0;
+ msg.mType = CTvMsgQueue::TV_MSG_SCAN_EVENT;
+ memcpy(msg.mpPara, &ev, sizeof(ev));
+ this->sendMsg ( msg );
+}
+
+void CTv::CTvMsgQueue::onEvent ( const CFrontEnd::FEEvent &ev )
+{
+ CMessage msg;
+ msg.mDelayMs = 0;
+ msg.mType = CTvMsgQueue::TV_MSG_FE_EVENT;
+ memcpy(msg.mpPara, &ev, sizeof(ev));
+ this->sendMsg ( msg );
+}
+
+void CTv::CTvMsgQueue::onEvent ( const CTvEpg::EpgEvent &ev )
+{
+ CMessage msg;
+ msg.mDelayMs = 0;
+ msg.mType = CTvMsgQueue::TV_MSG_EPG_EVENT;
+ memcpy(msg.mpPara, &ev, sizeof(ev));
+ this->sendMsg ( msg );
+}
+
+
+void CTv::CTvMsgQueue::onEvent(const CAv::AVEvent &ev)
+{
+ CMessage msg;
+ msg.mDelayMs = 0;
+ msg.mType = CTvMsgQueue::TV_MSG_AV_EVENT;
+ memcpy(msg.mpPara, &ev, sizeof(ev));
+ this->sendMsg ( msg );
+}
+
+int CTv::setTvObserver ( TvIObserver *ob )
+{
+ mpObserver = ob;
+ return 0;
+}
+
+void CTv::sendTvEvent ( const CTvEv &ev )
+{
+ //AutoMutex lock(mLock);
+ /* send sigstate to AutoBackLight */
+ if (ev.getEvType() == CTvEv::TV_EVENT_SIGLE_DETECT) {
+ TvEvent::SignalInfoEvent *pEv = (TvEvent::SignalInfoEvent *)(&ev);
+ if (pEv->mStatus == TVIN_SIG_STATUS_STABLE) {
+ mAutoBackLight.updateSigState(mAutoBackLight.SIG_STATE_STABLE);
+ } else {
+ mAutoBackLight.updateSigState(mAutoBackLight.SIG_STATE_NOSIG);
+ }
+ }
+
+ LOGD ( "%s, tvaction=%x", __FUNCTION__, mTvAction);
+ if ((mTvAction & TV_ACTION_SCANNING) && (ev.getEvType() == CTvEv::TV_EVENT_SIGLE_DETECT)) {
+ LOGD("%s, when scanning, not send sig detect event", __FUNCTION__);
+ return;
+ }
+ if ( mpObserver != NULL ) {
+ mpObserver->onTvEvent ( ev );
+ }
+
+ return;
+}
+
+int CTv::ClearAnalogFrontEnd()
+{
+ return mFrontDev.ClearAnalogFrontEnd ();
+}
+
+int CTv::dtvAutoScan()
+{
+ AutoMutex lock ( mLock );
+ mTvAction = mTvAction | TV_ACTION_SCANNING;
+ mTvEpg.leaveChannel();
+ mAv.StopTS ();
+ mAv.DisableVideoWithBlueColor();
+ CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_DTV );
+ CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_RADIO );
+ CTvEvent::CleanAllEvent();
+ mTvScanner.setObserver ( &mTvMsgQueue );
+ mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
+ mFrontDev.Open(FE_DTMB);
+ mTvScanner.autoDtmbScan();//dtmb
+ return 0;
+}
+
+int CTv::dtvCleanProgramByFreq ( int freq )
+{
+ int iOutRet = 0;
+ CTvChannel channel;
+ iOutRet = CTvChannel::SelectByFreq ( freq, channel );
+ if ( -1 == iOutRet ) {
+ LOGD ( "%s, Warnning: Current Freq not have program info in the ts_table\n", __FUNCTION__ );
+ }
+
+ iOutRet == CTvProgram::deleteChannelsProgram ( channel );
+ return iOutRet;
+}
+
+int CTv::dtvManualScan (int beginFreq, int endFreq, int modulation)
+{
+ AutoMutex lock ( mLock );
+ mTvAction = mTvAction | TV_ACTION_SCANNING;
+ mTvEpg.leaveChannel();
+ mAv.StopTS ();
+ mAv.DisableVideoWithBlueColor();
+ CTvChannel::DeleteBetweenFreq(beginFreq, endFreq);
+ mTvScanner.setObserver ( &mTvMsgQueue );
+ mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
+ mFrontDev.Open(FE_DTMB);
+ int iOutRet = mTvScanner.manualDtmbScan (beginFreq, endFreq, modulation); //dtmb
+ return iOutRet;
+}
+
+int CTv::dtvAutoScanAtscLock(int attenna, int videoStd, int audioStd)
+{
+ //showboz
+ /* int minScanFreq, maxScanFreq, vStd, aStd;
+ vStd = CC_ATV_VIDEO_STD_PAL;
+ aStd = CC_ATV_AUDIO_STD_DK;
+ v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd);
+
+ AutoMutex lock ( mLock );
+ mTvAction = mTvAction | TV_ACTION_SCANNING;
+ mTvEpg.leaveChannel();
+ mAv.StopTS ();
+ mAv.DisableVideoWithBlueColor();
+ CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_DTV );
+ CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_RADIO );
+ CTvEvent::CleanAllEvent();
+ mTvScanner.setObserver ( &mTvMsgQueue );
+ mDtvScanRunningStatus = DTV_SCAN_RUNNING_NORMAL;
+ mFrontDev.Open(FE_ATSC);
+ mTvScanner.autoAtscScan(CTvScanner::AM_ATSC_ATTENNA_TYPE_AIR, stdAndColor);//dtmb*/
+ return 0;
+}
+
+//searchType 0:not 256 1:is 256 Program
+int CTv::atvAutoScan(int videoStd, int audioStd, int searchType)
+{
+ int minScanFreq, maxScanFreq, vStd, aStd;
+ AutoMutex lock ( mLock );
+ mAv.DisableVideoWithBlueColor();
+ mTvAction = mTvAction | TV_ACTION_SCANNING;
+ stopPlaying();
+ mTvScanner.setObserver ( &mTvMsgQueue );
+ SetAudioMuteForTv ( CC_AUDIO_MUTE );
+ getATVMinMaxFreq (&minScanFreq, &maxScanFreq );
+ if ( minScanFreq == 0 || maxScanFreq == 0 || minScanFreq > maxScanFreq ) {
+ LOGE ( "%s, auto scan freq set is error min=%d, max=%d", __FUNCTION__, minScanFreq, maxScanFreq );
+ return -1;
+ }
+ mSigDetectThread.setVdinNoSigCheckKeepTimes(1000, false);
+ mSigDetectThread.requestAndWaitPauseDetect();
+ mSigDetectThread.setObserver(&mTvScannerDetectObserver);
+ mTvin.Tvin_StopDecoder();
+ //if set std null AUTO, use default PAL/DK
+ //if(videoStd == CC_ATV_VIDEO_STD_AUTO) {
+ // vStd = CC_ATV_VIDEO_STD_PAL;
+ // aStd = CC_ATV_AUDIO_STD_DK;
+ //} else {
+ vStd = CC_ATV_VIDEO_STD_PAL;
+ aStd = CC_ATV_AUDIO_STD_DK;
+ //}
+ tvin_port_t source_port = mTvin.Tvin_GetSourcePortBySourceInput(SOURCE_TV);
+ mTvin.VDIN_OpenPort ( source_port );
+ v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd);
+
+ int fmt = CFrontEnd::stdEnumToCvbsFmt (vStd, aStd);
+ mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) TVIN_SIG_FMT_NULL );
+
+ if (searchType == 0) {
+ CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_ATV );
+ } else if (searchType == 1) { //type for skyworth, and insert 256 prog, and just update ts table
+ }
+ minScanFreq = mFrontDev.formatATVFreq ( minScanFreq );
+ maxScanFreq = mFrontDev.formatATVFreq ( maxScanFreq );
+ LOGD("%s, atv auto scan vstd=%d, astd=%d stdandcolor=%lld", __FUNCTION__, vStd, aStd, stdAndColor);
+ mFrontDev.Open(FE_ANALOG);
+ mSigDetectThread.initSigState();
+ mSigDetectThread.resumeDetect();
+ mTvScanner.autoAtvScan ( minScanFreq, maxScanFreq, stdAndColor, searchType);
+ return 0;
+}
+
+int CTv::clearAllProgram(int arg0)
+{
+ CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_ATV );
+ CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_TV );
+ CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_DTV );
+ CTvProgram::CleanAllProgramBySrvType ( CTvProgram::TYPE_RADIO);
+ return 0;
+}
+
+int CTv::atvMunualScan ( int startFreq, int endFreq, int videoStd, int audioStd, int store_Type , int channel_num )
+{
+ int minScanFreq, maxScanFreq, vStd, aStd;
+
+ minScanFreq = mFrontDev.formatATVFreq ( startFreq );
+ maxScanFreq = mFrontDev.formatATVFreq ( endFreq );
+ if ( minScanFreq == 0 || maxScanFreq == 0 ) {
+ LOGE ( "%s, munual scan freq set is error min=%d, max=%d", __FUNCTION__, minScanFreq, maxScanFreq );
+ return -1;
+ }
+
+ //if set std null AUTO, use default PAL/DK
+ //if(videoStd == CC_ATV_VIDEO_STD_AUTO) {
+ // vStd = CC_ATV_VIDEO_STD_PAL;
+ // aStd = CC_ATV_AUDIO_STD_DK;
+ // } else {
+ vStd = videoStd;
+ aStd = audioStd;
+ // }
+
+ AutoMutex lock ( mLock );
+ mAv.DisableVideoWithBlueColor();
+ mTvAction = mTvAction | TV_ACTION_SCANNING;
+ mTvScanner.setObserver ( &mTvMsgQueue );
+
+ SetAudioMuteForTv ( CC_AUDIO_MUTE );
+ v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor(vStd, aStd);
+
+
+ tvin_port_t source_port = mTvin.Tvin_GetSourcePortBySourceInput(SOURCE_TV);
+ mTvin.VDIN_OpenPort ( source_port );
+
+ int fmt = CFrontEnd::stdEnumToCvbsFmt (vStd, aStd);
+ mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) TVIN_SIG_FMT_NULL );
+ LOGD("%s, atv manual scan vstd=%d, astd=%d stdandcolor=%lld", __FUNCTION__, vStd, aStd, stdAndColor);
+ mFrontDev.Open(FE_ANALOG);
+ return mTvScanner.ATVManualScan ( minScanFreq, maxScanFreq, stdAndColor, store_Type, channel_num);
+}
+
+int CTv::getVideoFormatInfo ( int *pWidth, int *pHeight, int *pFPS, int *pInterlace )
+{
+ int iOutRet = -1;
+ AM_AV_VideoStatus_t video_status;
+
+ do {
+ if ( NULL == pWidth || NULL == pHeight || NULL == pFPS || NULL == pInterlace ) {
+ break;
+ }
+
+ iOutRet = mAv.GetVideoStatus (&video_status );
+
+ if ( AM_SUCCESS != iOutRet ) {
+ LOGD ( "%s, ERROR: Cann't Get video format info\n", __FUNCTION__);
+ break;
+ }
+
+ *pWidth = video_status.src_w;
+ *pHeight = video_status.src_h;
+ *pFPS = video_status.fps;
+ *pInterlace = video_status.interlaced;
+ //LOGD("%s, w : %d h : %d fps : %d interlaced: %d\n", __FUNCTION__, video_status.src_w,video_status.src_h,video_status.fps,video_status.interlaced);
+ } while ( false );
+
+ return iOutRet;
+
+}
+
+int CTv::stopScanLock()
+{
+ AutoMutex lock ( mLock );
+ return stopScan();
+}
+
+int CTv::stopScan()
+{
+ const char *config_value = NULL;
+ if (!(mTvAction & TV_ACTION_SCANNING)) {
+ LOGD("%s, tv not scanning ,return\n", __FUNCTION__);
+ return 0;
+ } else {
+ LOGD("%s, tv scanning , stop it\n", __FUNCTION__);
+ }
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mAv.DisableVideoWithBlackColor();
+ } else {
+ mAv.DisableVideoWithBlueColor();
+ }
+ mSigDetectThread.requestAndWaitPauseDetect();
+ mSigDetectThread.setObserver(this);
+ mTvEpg.leaveChannel();
+ mTvScanner.stopScan();
+ mFrontDev.Close();
+ mTvAction = mTvAction & ~TV_ACTION_SCANNING;
+ return 0;
+}
+
+int CTv::playProgramLock ( int progId )
+{
+ /*AutoMutex lock ( mLock );
+ CTvProgram prog;
+ int ret = CTvProgram::selectByID ( progId, prog );
+
+ if ( ret != 0 ) {
+ return -1;
+ }
+ int type = prog.getProgType();
+ LOGD ( "%s, blackout = %dprog type = %d id = %d name = %s\n", __FUNCTION__, m_blackout_enable, type, progId, prog.getName().string() );
+ if (m_blackout_enable == 1) {
+ mAv.EnableVideoBlackout();
+ }else if (m_blackout_enable == 0){
+ mAv.DisableVideoBlackout();
+ }
+
+ mTvAction = mTvAction | TV_ACTION_PLAYING;
+ m_cur_playing_prog_id = progId;
+ mFrontDev.Open(FE_ANALOG);
+ if ( m_source_input == SOURCE_TV && type == CTvProgram::TYPE_ATV ) {
+ playAtvProgram ( progId );
+ } else if ( m_source_input == SOURCE_DTV && ( type == CTvProgram::TYPE_DTV || type == CTvProgram::TYPE_RADIO ) ) {
+ playDtmbProgram ( progId );
+ } else {
+ LOGD ( "%s, source(%d) != type(%d),not play\n", __FUNCTION__, m_source_input, type );
+ }
+ //just for ui,left/right/stereo
+ int audio_ch = prog.getAudioChannel();
+ AM_AOUT_OutputMode_t channel = AM_AOUT_OUTPUT_STEREO;
+ if (audio_ch == 1) {
+ channel = AM_AOUT_OUTPUT_STEREO;
+ } else if (audio_ch == 2) {
+ channel = AM_AOUT_OUTPUT_DUAL_LEFT;
+ } else if (audio_ch == 3) {
+ channel = AM_AOUT_OUTPUT_DUAL_RIGHT;
+ }
+ setAudioChannel((int)channel);*/
+ return 0;
+}
+
+int CTv::playDvbcProgram ( int progId )
+{
+ LOGD ( "%s, progId = %d\n", __FUNCTION__, progId );
+
+ CTvProgram prog;
+ int ret = CTvProgram::selectByID ( progId, prog );
+
+ if ( ret != 0 ) {
+ return -1;
+ }
+
+ LOGD ( "%s, prog name = %s\n", __FUNCTION__, prog.getName().string() );
+ CTvChannel channel;
+ prog.getChannel ( channel );
+
+ mFrontDev.setPara ( channel.getMode(), channel.getFrequency(), channel.getSymbolRate(), channel.getModulation() );
+
+ int vpid = 0x1fff, apid = 0x1fff, vfmt = -1, afmt = -1;
+
+ CTvProgram::Video *pV = prog.getVideo();
+ CTvProgram::Audio *pA;
+
+ if ( pV != NULL ) {
+ vpid = pV->getPID();
+ vfmt = pV->getFormat();
+ }
+
+ int aindex = prog.getCurrentAudio ( String8 ( "eng" ) );
+
+ if ( aindex >= 0 ) {
+ pA = prog.getAudio ( aindex );
+
+ if ( pA != NULL ) {
+ apid = pA->getPID();
+ afmt = pA->getFormat();
+ }
+ }
+ mTvEpg.leaveProgram();
+ mTvEpg.leaveChannel();
+ startPlayTv ( SOURCE_DTV, vpid, apid, vfmt, afmt );
+
+ mTvEpg.enterChannel ( channel.getID() );
+ mTvEpg.enterProgram ( prog.getID() );
+ return 0;
+}
+
+int CTv::getAudioTrackNum ( int progId )
+{
+ int iRet, iOutCnt = 0;
+ CTvProgram prog;
+
+ do {
+ if ( 0 > progId ) {
+ break;
+ }
+
+ iRet = CTvProgram::selectByID ( progId, prog );
+
+ if ( 0 != iRet ) {
+ break;
+ }
+
+ iOutCnt = prog.getAudioTrackSize();
+
+ } while ( false );
+
+ return iOutCnt;
+}
+
+int CTv::getAudioInfoByIndex ( int progId, int idx, int *pAFmt, String8 &lang )
+{
+ int iRet, iOutRet = -1;
+ CTvProgram prog;
+ CTvProgram::Audio *pA = NULL;
+
+ do {
+ if ( NULL == pAFmt || idx < 0 ) {
+ break;
+ }
+
+ iRet = CTvProgram::selectByID ( progId, prog );
+
+ if ( 0 != iRet ) {
+ break;
+ }
+
+ if ( idx >= prog.getAudioTrackSize() ) {
+ break;
+ }
+
+ pA = prog.getAudio ( idx );
+
+ if ( NULL == pA ) {
+ break;
+ }
+
+ *pAFmt = pA->getFormat();
+ lang = pA->getLang();
+ } while ( false );
+
+ return iOutRet;
+}
+
+int CTv::switchAudioTrack ( int aPid, int aFmt, int aParam )
+{
+ int iOutRet = 0;
+
+ do {
+ if ( aPid < 0 || aFmt < 0 ) {
+ break;
+ }
+
+ iOutRet = mAv.SwitchTSAudio (( uint16_t ) aPid, ( AM_AV_AFormat_t ) aFmt );
+
+ LOGD ( "%s, iOutRet = %d AM_AV_SwitchTSAudio\n", __FUNCTION__, iOutRet );
+ } while ( false );
+
+ return iOutRet;
+}
+
+int CTv::switchAudioTrack ( int progId, int idx )
+{
+ int iOutRet = 0;
+ CTvProgram prog;
+ CTvProgram::Audio *pAudio = NULL;
+ int aPid = -1;
+ int aFmt = -1;
+
+ do {
+ if ( idx < 0 ) {
+ break;
+ }
+
+ iOutRet = CTvProgram::selectByID ( progId, prog );
+
+ if ( 0 != iOutRet ) {
+ break;
+ }
+ if (prog.getAudioTrackSize() <= 1) {
+ LOGD("%s, just one audio track, not to switch", __FUNCTION__);
+ break;
+ }
+ if ( idx >= prog.getAudioTrackSize() ) {
+ break;
+ }
+
+ pAudio = prog.getAudio ( idx );
+
+ if ( NULL == pAudio ) {
+ break;
+ }
+
+ aPid = pAudio->getPID();
+ aFmt = pAudio->getFormat();
+
+ if ( aPid < 0 || aFmt < 0 ) {
+ break;
+ }
+
+ iOutRet = mAv.SwitchTSAudio (( uint16_t ) aPid, ( AM_AV_AFormat_t ) aFmt );
+
+ LOGD ( "%s, iOutRet = %d AM_AV_SwitchTSAudio\n", __FUNCTION__, iOutRet );
+ } while ( false );
+
+ return iOutRet;
+}
+
+int CTv::ResetAudioDecoderForPCMOutput()
+{
+ int iOutRet = 0;
+
+ iOutRet = mAv.ResetAudioDecoder ();
+ LOGD ( "%s, iOutRet = %d AM_AV_ResetAudioDecoder\n", __FUNCTION__, iOutRet );
+ return iOutRet;
+}
+
+int CTv::playDtvProgram ( int mode, int freq, int para1, int para2, int vpid, int vfmt, int apid, int afmt, int pcr, int audioCompetation)
+{
+ AutoMutex lock ( mLock );
+ mTvAction = mTvAction | TV_ACTION_PLAYING;
+ if ( m_blackout_enable == 1 ) {
+ mAv.EnableVideoBlackout();
+ } else if ( m_blackout_enable == 0 ) {
+ mAv.DisableVideoBlackout();
+ }
+ mFrontDev.Open(FE_ANALOG);
+ mFrontDev.setPara ( mode, freq, para1, para2);
+ mTvAction = mTvAction | TV_ACTION_PLAYING;
+ startPlayTv ( SOURCE_DTV, vpid, apid, vfmt, afmt );
+ //
+ CMessage msg;
+ msg.mDelayMs = 2000;
+ msg.mType = CTvMsgQueue::TV_MSG_CHECK_FE_DELAY;
+ mTvMsgQueue.sendMsg ( msg );
+ SetCurProgramAudioVolumeCompensationVal ( audioCompetation );
+ return 0;
+}
+
+
+int CTv::playDtmbProgram ( int progId )
+{
+ CTvProgram prog;
+ CTvChannel channel;
+ int vpid = 0x1fff, apid = 0x1fff, vfmt = -1, afmt = -1;
+ int aindex;
+ CTvProgram::Audio *pA;
+ CTvProgram::Video *pV;
+ int ret = CTvProgram::selectByID ( progId, prog );
+
+ SetAudioMuteForTv ( CC_AUDIO_MUTE );
+ saveDTVProgramID ( progId );
+ prog.getChannel ( channel );
+ //音é‡è¡¥å¿
+ int chanVolCompValue = 0;
+ chanVolCompValue = GetAudioVolumeCompensationVal(progId);
+ SetCurProgramAudioVolumeCompensationVal ( chanVolCompValue );
+
+ mFrontDev.setPara ( channel.getMode(), channel.getFrequency(), channel.getBandwidth(), 0 );
+
+ pV = prog.getVideo();
+
+ if ( pV != NULL ) {
+ vpid = pV->getPID();
+ vfmt = pV->getFormat();
+ }
+
+ aindex = prog.getCurrAudioTrackIndex();
+
+ if ( -1 == aindex ) { //db is default
+ aindex = prog.getCurrentAudio ( String8 ( "eng" ) );
+
+ if ( aindex >= 0 ) {
+ prog.setCurrAudioTrackIndex ( progId, aindex );
+ }
+ }
+
+ if ( aindex >= 0 ) {
+ pA = prog.getAudio ( aindex );
+
+ if ( pA != NULL ) {
+ apid = pA->getPID();
+ afmt = pA->getFormat();
+ }
+ }
+
+ mTvEpg.leaveProgram();
+ mTvEpg.leaveChannel();
+ startPlayTv ( SOURCE_DTV, vpid, apid, vfmt, afmt );
+ mTvEpg.enterChannel ( channel.getID() );
+ mTvEpg.enterProgram ( prog.getID() );
+ return 0;
+}
+
+int CTv::playAtvProgram (int freq, int videoStd, int audioStd, int fineTune, int audioCompetation)
+{
+ mTvAction = mTvAction | TV_ACTION_PLAYING;
+ if ( m_blackout_enable == 1 ) {
+ mAv.EnableVideoBlackout();
+ } else if ( m_blackout_enable == 0 ) {
+ mAv.DisableVideoBlackout();
+ }
+ SetAudioMuteForTv ( CC_AUDIO_MUTE );
+ //image selecting channel
+ mSigDetectThread.requestAndWaitPauseDetect();
+ mTvin.Tvin_StopDecoder();
+ mFrontDev.Open(FE_ANALOG);
+ //set CVBS
+ int fmt = CFrontEnd::stdEnumToCvbsFmt (videoStd, audioStd);
+ mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt );
+
+ v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor (videoStd, audioStd);
+ //set TUNER
+ mFrontDev.setPara (FE_ANALOG, freq, stdAndColor, 1);
+
+
+ mSigDetectThread.setObserver ( this );
+ mSigDetectThread.initSigState();
+ mSigDetectThread.resumeDetect(1000);
+
+ SetCurProgramAudioVolumeCompensationVal ( audioCompetation );
+ return 0;
+}
+
+int CTv::resetFrontEndPara ( frontend_para_set_t feParms )
+{
+ if ( feParms.mode == FE_ANALOG ) {
+ int progID = -1;
+ int tmpFreq = feParms.freq;
+ int tmpfineFreq = feParms.para2;
+ int mode = feParms.mode;
+
+ //get tunerStd from videoStd and audioStd
+ v4l2_std_id stdAndColor = mFrontDev.enumToStdAndColor (feParms.videoStd, feParms.audioStd);
+
+ LOGD("%s, resetFrontEndPara- vstd=%d astd=%d stdandcolor=%lld", __FUNCTION__, feParms.videoStd, feParms.audioStd, stdAndColor);
+
+ //set frontend parameters to tuner dev
+ mSigDetectThread.requestAndWaitPauseDetect();
+ mTvin.Tvin_StopDecoder();
+
+ //set CVBS
+ int fmt = CFrontEnd::stdEnumToCvbsFmt (feParms.videoStd, feParms.audioStd );
+ mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt );
+
+ //set TUNER
+ usleep(400 * 1000);
+ mFrontDev.setPara ( FE_ANALOG, tmpFreq, stdAndColor, 1 );
+ usleep(400 * 1000);
+ if ( tmpfineFreq != 0 ) {
+ mFrontDev.fineTune ( tmpfineFreq / 1000 );
+ }
+
+ mSigDetectThread.initSigState();
+ mSigDetectThread.resumeDetect();
+ } else if ( feParms.mode == FE_DTMB ) {
+ mFrontDev.setPara ( FE_DTMB, feParms.freq, feParms.para1, feParms.para2 );
+ }
+
+ return 0;
+}
+
+int CTv::resetDmxAndAvSource()
+{
+ AM_DMX_Source_t curdmxSource;
+ mFrontDev.GetTSSource ( &curdmxSource );
+ LOGD ( "%s, AM_FEND_GetTSSource %d", __FUNCTION__, curdmxSource );
+ mTvDmx.Close();
+ AM_DMX_OpenPara_t para;
+ memset ( &para, 0, sizeof ( para ) );
+ mTvDmx.Open (para);
+ mTvDmx.SetSource(curdmxSource );
+ AM_AV_TSSource_t ts_source = ( AM_AV_TSSource_t ) curdmxSource;
+ mAv.SetTSSource (ts_source );
+ return 0;
+}
+
+int CTv::SetCurProgramAudioVolumeCompensationVal ( int tmpVal )
+{
+ SetAudioVolumeCompensationVal ( tmpVal );
+ SetAudioMasterVolume (GetAudioMasterVolume() );
+
+ LOGD ( "%s, VolumeCompensationVal = %d, id = %d\n", __FUNCTION__, tmpVal, m_cur_playing_prog_id );
+ CTvProgram prog;
+ if ( CTvProgram::selectByID ( m_cur_playing_prog_id, prog ) != 0 ) {
+ LOGE ( "%s, atv progID is not matching the db's ret = 0\n", __FUNCTION__ );
+ return -1;
+ }
+
+ if (prog.updateVolComp ( m_cur_playing_prog_id, tmpVal ) != 0 ) {
+ LOGE ( "%s, atv progID is not matching the db's\n", __FUNCTION__);
+ return -1;
+ }
+ return 0;
+}
+
+int CTv::GetAudioVolumeCompensationVal(int progxxId)
+{
+ int tmpVolValue = 0;
+ CTvProgram prog;
+ if ( CTvProgram::selectByID ( m_cur_playing_prog_id, prog ) != 0 ) {
+ LOGE ( "%s, atv progID is not matching the db's ret = 0\n", __FUNCTION__ );
+ return tmpVolValue;
+ }
+ tmpVolValue = prog.getChanVolume ();
+ LOGD ( "%s,progid = %d CompensationVal = %d\n", __FUNCTION__, m_cur_playing_prog_id, tmpVolValue );
+ if (tmpVolValue > 20 || tmpVolValue < -20) tmpVolValue = 0;
+ return tmpVolValue;
+}
+
+int CTv::startPlayTv ( int source, int vid, int aid, int vfat, int afat )
+{
+ int ret = 0;
+
+ if ( source == SOURCE_DTV ) {
+ AM_FileEcho ( DEVICE_CLASS_TSYNC_AV_THRESHOLD_MIN, AV_THRESHOLD_MIN_MS );
+ LOGD ( "%s, startPlayTv", __FUNCTION__);
+ mAv.StartTS (vid, aid, ( AM_AV_VFormat_t ) vfat, ( AM_AV_AFormat_t ) afat );
+ } else {
+
+ }
+ return ret;
+}
+
+int CTv::stopPlayingLock()
+{
+ AutoMutex lock ( mLock );
+ if (getSubSwitchStatus() == 1)
+ stopSubtitle();
+ return stopPlaying();
+}
+
+int CTv::stopPlaying()
+{
+ const char *config_value = NULL;
+ if (!(mTvAction & TV_ACTION_PLAYING)) {
+ LOGD("%s, stopplay cur action = %x not playing , return", __FUNCTION__, mTvAction);
+ return 0;
+ }
+ mSigDetectThread.requestAndWaitPauseDetect();
+ mAv.EnableVideoBlackout();
+ if (m_source_input == SOURCE_TV) {
+ //first mute
+ SetAudioMuteForTv(CC_AUDIO_MUTE);
+ ClearAnalogFrontEnd();
+ } else if (m_source_input == SOURCE_DTV) {
+ //mFrontDev.setPara(FE_DTMB, 51000000, 0, 0);
+ mAv.StopTS ();
+ mTvEpg.leaveChannel();
+ mTvEpg.leaveProgram();
+ }
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mAv.DisableVideoWithBlackColor();
+ } else {
+ mAv.DisableVideoWithBlueColor();
+ }
+ mTvAction = mTvAction & ~TV_ACTION_PLAYING;
+ return 0;
+}
+
+int CTv::GetATVAFCType()
+{
+ return 1;
+}
+
+int CTv::GetATVSourceTimerSwitch()
+{
+ return 1;
+}
+int CTv::getAudioChannel()
+{
+ int iRet = -1;
+ AM_AOUT_OutputMode_t audioChanneleMod;
+ do {
+ iRet = mAv.AudioGetOutputMode (&audioChanneleMod );
+ if ( AM_SUCCESS != iRet ) {
+ LOGD ( "%s, jianfei.lan GetOutputMode is FAILED %d\n", __FUNCTION__, iRet );
+ break;
+ }
+ LOGD ( "%s, jianfei.lan getAudioChannel iRet : %d audioChanneleMod %d\n", __FUNCTION__, iRet, audioChanneleMod );
+ } while ( 0 );
+ return audioChanneleMod;
+}
+
+int CTv::setAudioChannel ( int channelIdx )
+{
+ int iOutRet = 0;
+ AM_AOUT_OutputMode_t audioChanneleMod;
+ LOGD ( "%s, channelIdx : %d\n", __FUNCTION__, channelIdx );
+ audioChanneleMod = ( AM_AOUT_OutputMode_t ) channelIdx;
+ iOutRet = mAv.AudioSetOutputMode (audioChanneleMod );
+ int aud_ch = 1;
+ if (audioChanneleMod == AM_AOUT_OUTPUT_STEREO) {
+ aud_ch = 1;
+ } else if (audioChanneleMod == AM_AOUT_OUTPUT_DUAL_LEFT) {
+ aud_ch = 2;
+ } else if (audioChanneleMod == AM_AOUT_OUTPUT_DUAL_RIGHT) {
+ aud_ch = 3;
+ }
+ CTvProgram::updateAudioChannel(m_cur_playing_prog_id, aud_ch);
+ if ( AM_SUCCESS != iOutRet) {
+ LOGD ( "%s, jianfei.lan %s AM_AOUT_SetOutputMode device is FAILED %d\n", __FUNCTION__, "TV", iOutRet );
+ }
+ return 0;
+}
+
+int CTv::getFrontendSignalStrength()
+{
+ int Strength = 0;
+ Strength = mFrontDev.getStrength();
+ return Strength;
+}
+
+int CTv::getFrontendSNR()
+{
+ int snr = 0;
+ snr = mFrontDev.getSNR();
+ return snr;
+}
+
+int CTv::getFrontendBER()
+{
+ int ber = 0;
+ ber = mFrontDev.getBER();
+ return ber;
+
+}
+
+int CTv::getChannelInfoBydbID ( int dbID, channel_info_t &chan_info )
+{
+ CTvProgram prog;
+ CTvChannel channel;
+ Vector<sp<CTvProgram> > out;
+ memset ( &chan_info, sizeof ( chan_info ), 0 );
+ chan_info.freq = 44250000;
+ chan_info.uInfo.atvChanInfo.videoStd = CC_ATV_VIDEO_STD_PAL;
+ chan_info.uInfo.atvChanInfo.audioStd = CC_ATV_AUDIO_STD_DK;
+ static const int CVBS_ID = -1;
+ if (dbID == CVBS_ID) {
+ unsigned char std;
+ SSMReadCVBSStd(&std);
+ chan_info.uInfo.atvChanInfo.videoStd = (atv_video_std_t)std;
+ chan_info.uInfo.atvChanInfo.audioStd = CC_ATV_AUDIO_STD_DK;
+ chan_info.uInfo.atvChanInfo.isAutoStd = (std == CC_ATV_VIDEO_STD_AUTO) ? 1 : 0;
+ return 0;
+ }
+
+ int ret = CTvProgram::selectByID ( dbID, prog );
+ if ( ret != 0 ) {
+ LOGD ( "getChannelinfo , select dbid=%d,is not exist", dbID);
+ return -1;
+ }
+ prog.getChannel ( channel );
+
+ if ( CTvProgram::TYPE_ATV == prog.getProgType() ) {
+ chan_info.freq = channel.getFrequency();
+ chan_info.uInfo.atvChanInfo.finefreq = channel.getAfcData();
+ LOGD("%s, get channel std = %lld", __FUNCTION__, channel.getStd());
+ chan_info.uInfo.atvChanInfo.videoStd =
+ ( atv_video_std_t ) CFrontEnd::stdAndColorToVideoEnum ( channel.getStd() );
+ chan_info.uInfo.atvChanInfo.audioStd =
+ ( atv_audio_std_t ) CFrontEnd::stdAndColorToAudioEnum ( channel.getStd() );
+ chan_info.uInfo.atvChanInfo.isAutoStd = ((channel.getStd() & V4L2_COLOR_STD_AUTO) == V4L2_COLOR_STD_AUTO) ? 1 : 0;
+ } else if ( CTvProgram::TYPE_DTV == prog.getProgType() || CTvProgram::TYPE_RADIO == prog.getProgType()) {
+ chan_info.freq = channel.getFrequency();
+ chan_info.uInfo.dtvChanInfo.strength = getFrontendSignalStrength();
+ chan_info.uInfo.dtvChanInfo.quality = getFrontendSNR();
+ chan_info.uInfo.dtvChanInfo.ber = getFrontendBER();
+ }
+
+ return 0;
+}
+
+bool CTv::Tv_Start_Analyze_Ts ( int channelID )
+{
+ int freq, ret;
+ CTvChannel channel;
+
+ AutoMutex lock ( mLock );
+ mAv.StopTS ();
+ mAv.DisableVideoWithBlueColor();
+ ret = CTvChannel::selectByID ( channelID, channel );
+
+ if ( ret != 0 ) {
+ LOGD ( "%s, CTv tv_updatats can not get freq by channel ID", __FUNCTION__ );
+ return false;
+ }
+
+ mTvAction = mTvAction | TV_ACTION_SCANNING;
+ freq = channel.getFrequency();
+ LOGD ( "%s, the freq = %d", __FUNCTION__, freq );
+ mDtvScanRunningStatus = DTV_SCAN_RUNNING_ANALYZE_CHANNEL;
+ mTvScanner.setObserver ( &mTvMsgQueue );
+ mTvScanner.manualDtmbScan ( freq, freq ); //dtmb
+ return true;
+}
+
+bool CTv::Tv_Stop_Analyze_Ts()
+{
+ stopScanLock();
+ return true;
+}
+
+
+int CTv::saveATVProgramID ( int dbID )
+{
+ config_set_int ( "TV", "atv.get.program.id", dbID );
+ return 0;
+}
+
+int CTv::getATVProgramID ( void )
+{
+ return config_get_int ( "TV", "atv.get.program.id", -1 );
+}
+
+int CTv::saveDTVProgramID ( int dbID )
+{
+ config_set_int ( "TV", "dtv.get.program.id", dbID );
+ return 0;;
+}
+
+int CTv::getDTVProgramID ( void )
+{
+ return config_get_int ( "TV", "dtv.get.program.id", -1 );
+}
+
+int CTv::getATVMinMaxFreq ( int *scanMinFreq, int *scanMaxFreq )
+{
+ int tmpVal, i = 0;
+ const char *config_value;
+ const char *strDelimit = ",";
+ char *token = NULL;
+
+ *scanMinFreq = 44250000;
+ *scanMaxFreq = 868250000;
+
+ config_value = config_get_str ( "ATV", "atv.get.min.max.freq", "null" );
+
+ if ( strcmp ( config_value, "null" ) == 0 ) {
+ LOGD ( "%s, atv.get.min.max.freq not set config\n", __FUNCTION__ );
+ return -1;
+ }
+
+ char data_str[512];
+ memset ( ( void * ) data_str, 0, sizeof ( data_str ) );
+ strncpy ( data_str, config_value, sizeof ( data_str ) - 1 );
+
+ char *pSave;
+ token = strtok_r ( data_str, strDelimit, &pSave);
+ sscanf ( token, "%d", scanMinFreq );
+ token = strtok_r ( NULL, strDelimit , &pSave);
+
+ if ( token != NULL ) {
+ sscanf ( token, "%d", scanMaxFreq );
+ return 0;
+ }
+ return 0;
+}
+
+int CTv::IsDVISignal()
+{
+ return ( ( TVIN_SIG_FMT_NULL != mSigDetectThread.getCurSigInfo().fmt ) && ( mSigDetectThread.getCurSigInfo().reserved & 0x1 ) );
+}
+
+int CTv::getHDMIFrameRate()
+{
+ int ConstRate[5] = {24, 25, 30, 50, 60};
+ float ConstRateDiffHz[5] = {0.5, 0.5, 0.5, 2, 2}; //å差便
+ int fps = mSigDetectThread.getCurSigInfo().fps;
+ int i = 0;
+ for (; i < 5; i++) {
+ if (abs(ConstRate[i] - fps) < ConstRateDiffHz[i])
+ fps = ConstRate[i];
+ }
+ return fps;
+}
+
+tv_source_input_t CTv::GetLastSourceInput ( void )
+{
+ return m_last_source_input;
+}
+
+int CTv::isVgaFmtInHdmi ( void )
+{
+ tvin_sig_fmt_t fmt = mSigDetectThread.getCurSigInfo().fmt;
+
+ if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_HDMI ) {
+ return -1;
+ }
+
+ return CTvin::isVgaFmtInHdmi ( fmt );
+}
+
+int CTv::isSDFmtInHdmi ( void )
+{
+ tvin_sig_fmt_t fmt = mSigDetectThread.getCurSigInfo().fmt;
+
+ if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_HDMI ) {
+ return -1;
+ }
+
+
+ return CTvin::isSDFmtInHdmi ( fmt );
+}
+
+void CTv::print_version_info ( void )
+{
+ // print tvapi version info
+ LOGD ( "libtvservice git branch:%s\n", tvservice_get_git_branch_info() );
+ LOGD ( "libtvservice git version:%s\n", tvservice_get_git_version_info() );
+ LOGD ( "libtvservice Last Changed:%s\n", tvservice_get_last_chaned_time_info() );
+ LOGD ( "libtvservice Last Build:%s\n", tvservice_get_build_time_info() );
+ LOGD ( "libtvservice Builer Name:%s\n", tvservice_get_build_name_info() );
+ LOGD ( "libtvservice board version:%s\n", tvservice_get_board_version_info() );
+ LOGD ( "\n\n");
+ // print dvb version info
+ LOGD ( "libdvb git branch:%s\n", dvb_get_git_branch_info() );
+ LOGD ( "libdvb git version:%s\n", dvb_get_git_version_info() );
+ LOGD ( "libdvb Last Changed:%s\n", dvb_get_last_chaned_time_info() );
+ LOGD ( "libdvb Last Build:%s\n", dvb_get_build_time_info() );
+ LOGD ( "libdvb Builer Name:%s\n", dvb_get_build_name_info() );
+}
+
+int CTv::Tvin_GetTvinConfig ( void )
+{
+ const char *config_value;
+ int i = 0;
+
+
+ config_value = config_get_str ( "TV", "tvin.kernelpet_disable", "null" );
+
+ if ( strcmp ( config_value, "disable" ) == 0 ) {
+ gTvinConfig.kernelpet_disable = true;
+ } else {
+ gTvinConfig.kernelpet_disable = false;
+ }
+
+ config_value = config_get_str ( "TV", "tvin.kernelpet.timeout", "null" );
+ gTvinConfig.userpet_timeout = ( unsigned int ) strtol ( config_value, NULL, 10 );
+
+ if ( gTvinConfig.kernelpet_timeout <= 0 || gTvinConfig.kernelpet_timeout > 40 ) {
+ gTvinConfig.kernelpet_timeout = 10;
+ }
+
+
+ config_value = config_get_str ( "TV", "tvin.userpet", "null" );
+
+ if ( strcmp ( config_value, "enable" ) == 0 ) {
+ gTvinConfig.userpet = true;
+ } else {
+ gTvinConfig.userpet = false;
+ }
+
+ config_value = config_get_str ( "TV", "tvin.userpet.timeout", "null" );
+ gTvinConfig.userpet_timeout = ( unsigned int ) strtol ( config_value, NULL, 10 );
+
+ if ( gTvinConfig.userpet_timeout <= 0 || gTvinConfig.userpet_timeout > 100 ) {
+ gTvinConfig.userpet_timeout = 10;
+ }
+
+ config_value = config_get_str ( "TV", "tvin.userpet.reset", "null" );
+
+ if ( strcmp ( config_value, "disable" ) == 0 ) {
+ gTvinConfig.userpet_reset = 0;
+ } else {
+ gTvinConfig.userpet_reset = 1;
+ }
+
+
+
+ return 0;
+}
+
+TvRunStatus_t CTv::GetTvStatus()
+{
+ Mutex::Autolock _l ( mLock );
+ return mTvStatus;
+}
+
+int CTv::OpenTv ( void )
+{
+ int tmp_val = 0;
+ const char *value;
+ Tv_Spread_Spectrum();
+ //reboot system by fbc setting.
+ value = config_get_str ( "TV", "fbc.get.panelinfo", "null" );
+ LOGD("%s fbc-------------------\n", value);
+ if ( strcmp ( value, "edid" ) == 0 ) {
+ if (reboot_sys_by_fbc_edid_info() == 0) {
+ }
+ } else if ( strcmp ( value, "uart" ) == 0 ) {
+ if (reboot_sys_by_fbc_uart_panel_info(fbcIns) == 0) {
+ }
+ }
+
+ LOGD ( "%s, tv open\n", __FUNCTION__);
+ char prop_value[PROPERTY_VALUE_MAX];
+ memset ( prop_value, '\0', PROPERTY_VALUE_MAX );
+
+ mTvin.Tvin_LoadSourceInputToPortMap();
+
+ SSMHandlePreCopying();
+ //
+ if ( SSMDeviceMarkCheck() < 0 ) {
+ SSMRestoreDeviceMarkValues();
+ Tv_SSMRestoreDefaultSetting();
+ }
+ mTvin.OpenTvin();
+ mTvin.init_vdin();
+ mTvin.Tv_init_afe();
+ mVpp.Vpp_Init(getPqDbPath());
+ TvAudioOpen();
+ SetAudioVolDigitLUTTable(SOURCE_MPEG);
+
+ SSMSetHDCPKey();
+ system ( "/system/bin/dec" );
+
+ //set color filter
+ // SetFileAttrValue ( "/sys/module/amvideo/parameters/filt_mode", "0x2100" );
+
+
+ value = config_get_str ( "TV", "ssm.hdmi_av.hotplug.detect.en", "null" );
+ if ( strtoul(value, NULL, 10) == 1 ) {
+ m_hdmiav_hotplugdetect_en = 1;
+ } else {
+ m_hdmiav_hotplugdetect_en = 0;
+ }
+
+ value = config_get_str ( "TV", "tvin.autoset.displayfreq", "null" );
+
+ if ( strcmp ( value, "enable" ) == 0 ) {
+ m_autoset_displayfreq = true;
+ } else {
+ m_autoset_displayfreq = false;
+ }
+
+ if (mTvin.VDIN_GetDisplayVFreq() == 30) {
+ m_autoset_displayfreq = false;
+ }
+
+ Tv_HandeHDMIEDIDFilePathConfig();
+
+ value = config_get_str ( "TV", "ssm.handle.hdmi.edid.en", "null" );
+
+ if ( strtoul(value, NULL, 10) == 1 ) {
+ LOGD( "%s, get config \"%s\" is \"%s\".\n",
+ __FUNCTION__, "ssm.handle.hdmi.edid.en", value );
+ //get hdmi edid use mode
+ char prop_value[256];
+ memset( prop_value, '\0', 256 );
+ property_get( "ubootenv.var.outputmode", prop_value, "null" );
+ LOGD( "%s, get property \"%s\" is \"%s\".\n",
+ __FUNCTION__, "ubootenv.var.outputmode", prop_value );
+ if ( strcmp ( prop_value, "null" ) != 0 ) {
+ config_set_str ( "TV", "ssm.handle.hdmi.edid.use", prop_value );
+ int i;
+ char edid_path[256];
+ char edid_path_cfg[256];
+ //set file's path for hdmi edid of each port
+ for ( i = 1; i <= SSM_HDMI_PORT_MAX; i++ ) {
+ memset( edid_path, '\0', 256 );
+ memset( edid_path_cfg, '\0', 256 );
+ sprintf ( edid_path, "/system/etc/%s_port%d.bin", prop_value, i );
+ sprintf ( edid_path_cfg, "ssm.handle.hdmi.port%d.edid.file.path", i );
+ config_set_str ( "TV", edid_path_cfg, edid_path );
+ }
+ } else {
+ //set default hdmi edid
+ config_set_str ( "TV", "ssm.handle.hdmi.edid.use", "hdmi_edid" );
+ int i;
+ char edid_path[256];
+ char edid_path_cfg[256];
+ //set file's path for hdmi edid of each port
+ for ( i = 1; i <= SSM_HDMI_PORT_MAX; i++ ) {
+ memset( edid_path, '\0', 256 );
+ memset( edid_path_cfg, '\0', 256 );
+ sprintf ( edid_path, "/system/etc/%s_port%d.bin", "hdmi_edid", i );
+ sprintf ( edid_path_cfg, "ssm.handle.hdmi.port%d.edid.file.path", i );
+ config_set_str ( "TV", edid_path_cfg, edid_path );
+ }
+ }
+ m_is_set_hdmi_edid = true;
+ }
+ //
+ unsigned char val = 0;
+ Tvin_GetTvinConfig();
+ m_last_source_input = SOURCE_INVALID;
+ m_source_input = SOURCE_INVALID;
+ m_mode_3d = VIDEO_3D_MODE_DISABLE;
+ m_hdmi_sampling_rate = 0;
+ int8_t blackout_enable;
+ SSMReadBlackoutEnable(&blackout_enable);
+ m_blackout_enable = blackout_enable;
+
+
+ //
+ //dtv init
+ int rt = -1;
+ //opendemux();
+ //rt = mFrontDev.Open(FE_ANALOG);
+ //mFrontDev.autoLoadFE();
+ //rt = mFrontDev.Open(FE_ANALOG);
+ AM_DMX_OpenPara_t para_dmx;
+ memset ( &para_dmx, 0, sizeof ( AM_DMX_OpenPara_t ) );
+ mTvDmx.Open(para_dmx );
+ mTvDmx.SetSource (AM_DMX_SRC_TS2);
+ mAv.Open();
+ mTvEpg.Init ( 0, 0, 1, "eng zho chi", "GB2312" );
+ resetDmxAndAvSource();
+// mSourceConnectDetectThread.startDetect();
+ mSourceConnectDetectThread.startDetect();
+
+ if (SSMReadSerialCMDSwitchValue() == 1) {
+ SetSerialSwitch(SERIAL_A, 1);
+ }
+ ClearAnalogFrontEnd();
+
+ mTvStatus = TV_OPEN_ED;
+
+ mHDMIRxCEC.start();
+ mAutoPQparam.startAutoPQ(CTvin::Tvin_SourceInputToSourceInputType(SOURCE_MPEG));
+ return 0;
+}
+
+int CTv::CloseTv ( void )
+{
+ LOGD ( "tv close");
+ mSigDetectThread.stopDetect();
+ if (mpUpgradeFBC != NULL) {
+ mpUpgradeFBC->stop();
+ }
+ mTvin.Tv_uninit_afe();
+ mTvin.uninit_vdin();
+ mVpp.Vpp_Uninit();
+ TvMisc_DisableWDT ( gTvinConfig.userpet );
+ mTvStatus = TV_CLOSE_ED;
+ return 0;
+}
+
+
+int CTv::StartTvLock ()
+{
+ LOGD ( "%s, tv start status = %d", __FUNCTION__, mTvStatus);
+ if (mTvStatus == TV_START_ED)
+ return 0;
+
+ Mutex::Autolock _l ( mLock );
+ mTvAction = mTvAction | TV_ACTION_STARTING;
+ mAv.ClearVideoBuffer();
+ SwitchAVOutBypass(0);
+ InitSetTvAudioCard();
+ SetAudioMuteForTv(CC_AUDIO_MUTE);
+ mFrontDev.Open(FE_ANALOG);
+ mFrontDev.autoLoadFE();
+ mSigDetectThread.startDetect();
+ mSigDetectThread.initSigState();
+ mTvMsgQueue.startMsgQueue();
+ resetDmxAndAvSource();
+ SetDisplayMode ( mVpp.GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt);
+ TvMisc_EnableWDT ( gTvinConfig.kernelpet_disable, gTvinConfig.userpet, gTvinConfig.kernelpet_timeout, gTvinConfig.userpet_timeout, gTvinConfig.userpet_reset );
+ am_phase_t am_phase;
+ if (mVpp.getPqData()->PQ_GetPhaseArray ( &am_phase ) == 0 ) {
+ mTvin.TvinApi_SetCompPhase(am_phase);
+ }
+ mTvin.TvinApi_SetCompPhaseEnable ( 1 );
+ mTvin.VDIN_EnableRDMA ( 1 );
+
+ //win pos
+ tvin_window_pos_t win_pos;
+ Vpp_GetDisplayResolutionInfo(&win_pos);
+ SetPreviewWindow ( win_pos );
+
+ mTvin.Tvin_RemovePath ( TV_PATH_TYPE_TVIN );
+ if ( mTvin.Tvin_RemovePath ( TV_PATH_TYPE_DEFAULT ) ) {
+ mTvin.Tvin_AddPath ( TV_PATH_DECODER_NEW3D_WITHOUTPPMGR_AMVIDEO );
+ }
+
+ mAv.SetVideoWindow (0, 0, 0, 0 );
+
+ mTvAction = mTvAction & ~TV_ACTION_STARTING;
+ mTvStatus = TV_START_ED;
+ return 0;
+}
+
+int CTv::DoInstabootSuspend()
+{
+ CTvDatabase::GetTvDb()->UnInitTvDb();
+ CTvSettingdoSuspend();
+ mVpp.doSuspend();
+ LOGD("%s, \n", __FUNCTION__);
+ return 0;
+}
+
+int CTv::DoInstabootResume()
+{
+ CTvDatabase::GetTvDb()->InitTvDb(TV_DB_PATH);
+ CTvSettingdoResume();
+ mVpp.doResume();
+ LOGD("%s, \n", __FUNCTION__);
+ return 0;
+}
+
+int CTv::DoSuspend(int type)
+{
+ if (type == 1)
+ {
+ DoInstabootSuspend();
+ }
+ return 0;
+}
+
+int CTv::DoResume(int type)
+{
+ if (type == 1)
+ {
+ DoInstabootResume();
+ }
+ return 0;
+}
+
+int CTv::StopTvLock ( void )
+{
+ LOGD("%s, call Tv_Stop status = %d \n", __FUNCTION__, mTvStatus);
+ const char *value;
+ Mutex::Autolock _l ( mLock );
+ mAv.DisableVideoWithBlackColor();
+ mVpp.LoadVppSettings ( SOURCE_TYPE_MPEG, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D );
+ //we should stop audio first for audio mute.
+ mTvAction = mTvAction | TV_ACTION_STOPING;
+ mTvin.Tvin_StopDecoder();
+ mTvin.Tvin_RemovePath ( TV_PATH_TYPE_TVIN );
+ mTvin.VDIN_ClosePort();
+ mTvMsgQueue.clearMsg();
+ mSigDetectThread.requestAndWaitPauseDetect();
+ //stop scan if scanning
+ stopScan();
+ mFrontDev.SetAnalogFrontEndTimerSwitch(0);
+ //first stop play(if playing)
+ stopPlaying();
+ //
+ setAudioChannel(AM_AOUT_OUTPUT_STEREO);
+ mTvin.setMpeg2Vdin(0);
+ mAv.setLookupPtsForDtmb(0);
+ SwitchAVOutBypass(0);
+ tv_audio_channel_e audio_channel = mTvin.Tvin_GetInputSourceAudioChannelIndex (SOURCE_MPEG);
+ AudioLineInSelectChannel( audio_channel );
+ AudioCtlUninit();
+ SetAudioVolDigitLUTTable(SOURCE_MPEG);
+ Tv_SetAudioInSource(SOURCE_MPEG);
+ tvin_window_pos_t win_pos;
+ Vpp_GetDisplayResolutionInfo(&win_pos);
+ SetPreviewWindow (win_pos );
+ //mVpp.LoadVppSettings ( SOURCE_TYPE_MPEG, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D );
+ SetDisplayMode ( mVpp.GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(SOURCE_MPEG) ), CTvin::Tvin_SourceInputToSourceInputType(SOURCE_MPEG), mSigDetectThread.getCurSigInfo().fmt);
+ RefreshAudioMasterVolume ( SOURCE_MPEG );
+ mVpp.VPP_SetScalerPathSel(0);
+ mVpp.VPP_SetVideoCrop ( 0, 0, 0, 0 );
+ m_last_source_input = SOURCE_INVALID;
+ m_source_input = SOURCE_INVALID;
+ mFrontDev.Close();
+ mTvAction = mTvAction & ~TV_ACTION_STOPING;
+ mTvStatus = TV_STOP_ED;
+ if ( Get2d4gHeadsetEnable() == 1 ) {
+ property_set("audio.tv_open.flg", "0");
+ }
+
+ Tv_SetDDDRCMode(SOURCE_MPEG);
+ mAv.DisableVideoWithBlackColor();
+ //mAutoPQparam.startAutoPQ(CTvin::Tvin_SourceInputToSourceInputType(SOURCE_MPEG));
+ mAv.ClearVideoBuffer();
+ mAv.EnableVideoBlackout();
+ SetAudioMuteForTv ( CC_AUDIO_UNMUTE );
+ return 0;
+}
+
+const char *CTv::getPqDbPath()
+{
+ return config_get_str("TV", "pq_db_path", "/param/pq.db");
+}
+int CTv::Tv_MiscSetBySource ( tv_source_input_t source_input )
+{
+ int ret = -1;
+
+ switch ( source_input ) {
+ case SOURCE_TV:
+ mVpp.VPP_SetScalerPathSel(1);
+ ret = SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "4" );
+ break;
+
+ case SOURCE_HDMI1:
+ case SOURCE_HDMI2:
+ case SOURCE_HDMI3:
+ mVpp.VPP_SetScalerPathSel(0);
+ //ret = mVpp.Tv_SavePanoramaMode ( VPP_PANORAMA_MODE_FULL, SOURCE_TYPE_HDMI );
+ ret |= SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "5" );
+ break;
+
+ case SOURCE_DTV:
+ mVpp.VPP_SetScalerPathSel(0);
+
+ case SOURCE_AV1:
+ case SOURCE_AV2:
+ case SOURCE_VGA:
+ mVpp.VPP_SetScalerPathSel(1);
+ ret |= SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "5" );
+ break;
+
+ case SOURCE_SVIDEO:
+ case SOURCE_IPTV:
+ mVpp.VPP_SetScalerPathSel(1);
+ default:
+ mVpp.VPP_SetScalerPathSel(0);
+ ret |= SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_adj_level", "5" );
+ break;
+ }
+
+ return ret;
+}
+
+int CTv::SetSourceSwitchInput (tv_source_input_t source_input )
+{
+ Mutex::Autolock _l ( mLock );
+ LOGD ( "%s, source input = %d", __FUNCTION__, source_input );
+ tv_source_input_t cur_source_input = m_source_input;
+ tvin_port_t cur_port;
+ const char *config_value = NULL;
+
+ Tv_SetDDDRCMode(source_input);
+
+ if (source_input == cur_source_input ) {
+ LOGW ( "%s,same input change display mode", __FUNCTION__ );
+ return 0;
+ }
+
+ //if HDMI, need to set EDID of each port
+ if (m_is_set_hdmi_edid) {
+ int tmp_ret = 0;
+ switch ( source_input ) {
+ case SOURCE_HDMI1:
+ tmp_ret = SSMSetHDMIEdid(1);
+ break;
+ case SOURCE_HDMI2:
+ tmp_ret = SSMSetHDMIEdid(2);
+ break;
+ case SOURCE_HDMI3:
+ tmp_ret = SSMSetHDMIEdid(3);
+ break;
+ default:
+ tmp_ret = -1;
+ break;
+ }
+ if (tmp_ret < 0)
+ LOGE ( "%s, do not set hdmi port%d edid.ret=%d", __FUNCTION__, source_input - 4, tmp_ret );
+ }
+ mTvAction = mTvAction | TV_ACTION_SOURCE_SWITCHING;
+ m_cur_playing_prog_id = -1;
+ //
+ SetAudioMuteForTv(CC_AUDIO_MUTE);
+ mSigDetectThread.requestAndWaitPauseDetect();
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ //if ( strcmp ( config_value, "black" ) == 0 ) {
+ // mAv.DisableVideoWithBlackColor();
+ //} else {
+ // mAv.DisableVideoWithBlueColor();
+ //}
+ mAv.DisableVideoWithBlackColor();
+ //enable blackout, when play,disable it
+ mAv.EnableVideoBlackout();
+ //set front dev mode
+ if ( source_input == SOURCE_TV ) {
+ mFrontDev.Close();
+ mFrontDev.Open(FE_ANALOG);
+ mFrontDev.SetAnalogFrontEndTimerSwitch(GetATVSourceTimerSwitch());
+ //mFrontDev.setMode ( FE_ANALOG );
+ } else if ( source_input == SOURCE_DTV ) {
+ mFrontDev.Close();
+ mFrontDev.Open(FE_ANALOG);
+ //mFrontDev.setMode ( FE_DTMB);
+ mFrontDev.SetAnalogFrontEndTimerSwitch(0);
+ } else {
+ mFrontDev.Close();
+ mFrontDev.SetAnalogFrontEndTimerSwitch(0);
+ }
+
+ //ok
+ m_last_source_input = m_source_input;
+ m_source_input = source_input;
+ SSMSaveSourceInput ( source_input );
+
+ tv_source_input_t pre_source_input = cur_source_input;//change
+ cur_source_input = source_input;
+
+ SetAudioVolumeCompensationVal ( 0 );
+
+ if ( source_input == SOURCE_DTV ) {
+ //we should stop audio first for audio mute.
+ SwitchAVOutBypass(0);
+ tv_audio_channel_e audio_channel = mTvin.Tvin_GetInputSourceAudioChannelIndex (SOURCE_MPEG);
+ AudioLineInSelectChannel( audio_channel );
+ AudioCtlUninit();
+ SetAudioVolDigitLUTTable(SOURCE_MPEG);
+ //
+ mTvin.Tvin_StopDecoder();
+ mTvin.Tvin_RemovePath ( TV_PATH_TYPE_TVIN );
+ mTvin.VDIN_ClosePort();
+ //double confirm we set the main volume lut buffer to mpeg
+ RefreshAudioMasterVolume ( SOURCE_MPEG );
+ RefreshSrsEffectAndDacGain();
+ SetCustomEQGain();
+ mTvin.setMpeg2Vdin(1);
+ mAv.setLookupPtsForDtmb(1);
+ //mVpp.LoadVppSettings ( SOURCE_TYPE_DTV, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D );
+ //mAutoPQparam.startAutoPQ(CTvin::Tvin_SourceInputToSourceInputType(SOURCE_DTV));
+ Tv_SetAudioInSource ( source_input );
+ } else {
+ mAutoPQparam.stopAutoPQ();
+ mTvin.setMpeg2Vdin(0);
+ mAv.setLookupPtsForDtmb(0);
+ mTvin.Tvin_AddPath ( TV_PATH_VDIN_NEW3D_WITHOUTPPMGR_AMVIDEO );
+ }
+ cur_port = mTvin.Tvin_GetSourcePortBySourceInput ( cur_source_input );
+ Tv_MiscSetBySource ( source_input );
+
+ //only DTV->TVIN or TVIN->DTV need start resource detect thread
+ if ( ( pre_source_input == SOURCE_DTV || cur_source_input == SOURCE_DTV ) && ( cur_source_input != pre_source_input ) ) {
+ LOGD ( "%s, dtv need resource detect\n", __FUNCTION__ );
+ int isNeedCheckD2D3 = ( gTvinConfig.memory512m) ? 1 : 0;
+ static int sigchkcnt = 0;
+ while ( true ) {
+ if ( ( mTvin.Tvin_CheckPathActive ( TV_PATH_TYPE_DEFAULT, isNeedCheckD2D3 ) == TV_PATH_STATUS_INACTIVE )
+ && ( mTvin.Tvin_CheckPathActive ( TV_PATH_TYPE_TVIN, isNeedCheckD2D3 ) == TV_PATH_STATUS_INACTIVE ) ) {
+ LOGD("%s, path check is ok, and break\n", __FUNCTION__)
+ break;
+ } else {
+ if (sigchkcnt++ > 20) {
+ sigchkcnt = 0;
+ break;
+ }
+
+ LOGW ( "%s,resource is busy.", __FUNCTION__);
+ }
+ }//while
+ }//if need check,and check return
+
+ if ( source_input != SOURCE_DTV ) {
+ // Uninit data
+ UnInitTvAudio();
+ if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3 ||
+ source_input == SOURCE_MPEG || source_input == SOURCE_DTV ) {
+ SwitchAVOutBypass(0);
+ } else {
+ SwitchAVOutBypass(1);
+ }
+
+ tv_audio_channel_e audio_channel = mTvin.Tvin_GetInputSourceAudioChannelIndex (source_input);
+ AudioLineInSelectChannel( audio_channel );
+
+ Tv_SetAudioInSource ( source_input );
+ if ( source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3 ) {
+ m_hdmi_sampling_rate = 0;
+ m_hdmi_audio_data = 0;
+ } else {
+ InitTvAudio ( 48000, CC_IN_USE_I2S_DEVICE);
+ HanldeAudioInputSr(-1);
+ }
+ //===========================================
+ if ( mTvin.SwitchPort ( cur_port ) == 0 ) { //ok
+ //==========================================
+ unsigned char std;
+ SSMReadCVBSStd(&std);
+ int fmt = CFrontEnd::stdEnumToCvbsFmt (std, CC_ATV_AUDIO_STD_AUTO);
+ mTvin.AFE_SetCVBSStd ( ( tvin_sig_fmt_t ) fmt );
+
+ //for HDMI source connect detect
+ mTvin.VDIN_OpenHDMIPinMuxOn(true);
+ mVpp.Vpp_ResetLastVppSettingsSourceType();
+ //==========================================
+ m_sig_stable_nums = 0;
+ mSigDetectThread.setObserver ( this );
+ mSigDetectThread.initSigState();
+ int resumeLater = 0;
+ if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
+ resumeLater = 1000;
+ } else {
+ resumeLater = 1500;
+ }
+ mSigDetectThread.setVdinNoSigCheckKeepTimes(150, true);
+ mSigDetectThread.resumeDetect(resumeLater);
+ } else {
+ }
+ }
+
+ Tv_SetAudioSourceType(source_input);
+ RefreshAudioMasterVolume(source_input);
+ Tv_SetAudioOutputSwap_Type(source_input);
+ //Tv_ADCDigitalCapture_Volume();
+ Tv_SetAVOutPut_Input_gain(source_input);
+
+ mTvAction = mTvAction & ~ TV_ACTION_SOURCE_SWITCHING;
+ return 0;
+}
+
+void CTv::onSigToStable()
+{
+ if ( m_autoset_displayfreq) {
+ if (CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_HDMI ) {
+ int fps = getHDMIFrameRate();
+ LOGD("onSigToStable HDMI fps get = %d", fps);
+ if ((30 == fps) || (60 == fps)) {
+ mTvin.VDIN_SetDisplayVFreq ( 60, mAv.getVideoDisplayResolution(), mB_hdmiout_fbc );
+ LOGD ( "%s, SetDisplayVFreq 60HZ.", __FUNCTION__);
+ } else {
+ mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution(), mB_hdmiout_fbc );
+ LOGD ( "%s, SetDisplayVFreq 50HZ.", __FUNCTION__);
+ }
+ } else if ( CTvin::Tvin_is50HzFrameRateFmt ( mSigDetectThread.getCurSigInfo().fmt ) ) {
+ mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution(), mB_hdmiout_fbc );
+ LOGD ( "%s, SetDisplayVFreq 50HZ.", __FUNCTION__);
+ } else {
+ mTvin.VDIN_SetDisplayVFreq ( 60, mAv.getVideoDisplayResolution(), mB_hdmiout_fbc );
+ LOGD ( "%s, SetDisplayVFreq 60HZ.", __FUNCTION__);
+ }
+ }
+ //showbo mark hdmi auto 3d, tran fmt is 3d, so switch to 3d
+
+ mVpp.LoadVppSettings (CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt );
+
+ if ( m_win_mode == PREVIEW_WONDOW ) {
+ mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2);
+ mAv.setVideoScreenMode ( CAv::VIDEO_WIDEOPTION_FULL_STRETCH );
+ } else {
+ SetDisplayMode ( mVpp.GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt);
+ }
+ m_sig_stable_nums = 0;
+}
+
+void CTv::onSigStillStable()
+{
+ if ( m_sig_stable_nums == 20) {
+ tvin_info_t info = mSigDetectThread.getCurSigInfo();
+ TvEvent::SignalInfoEvent ev;
+ ev.mTrans_fmt = info.trans_fmt;
+ ev.mFmt = info.fmt;
+ ev.mStatus = info.status;
+ ev.mReserved = getHDMIFrameRate();
+ sendTvEvent ( ev );
+ }
+ if (m_sig_stable_nums == 2) {
+ LOGD("still stable , to start decoder");
+ int startdec_status = mTvin.Tvin_StartDecoder ( mSigDetectThread.getCurSigInfo() );
+ if ( startdec_status == 0 ) { //showboz codes from start decode fun
+ const char *value;
+ value = config_get_str ( "TV", "tvin.db.reg.en", "null" );
+ if ( strcmp ( value, "enable" ) == 0 ) {
+ usleep ( 20 * 1000 );
+ Tvin_SetPLLValues ();
+ usleep ( 20 * 1000 );
+ SetCVD2Values ();
+ }
+ }
+ }
+ if ( m_sig_stable_nums == 3) {
+ LOGD("still stable , to unmute audio/video");
+ CMessage msg;
+ msg.mDelayMs = 0;
+ msg.mType = CTvMsgQueue::TV_MSG_ENABLE_VIDEO_LATER;
+ msg.mpPara[0] = 2;
+ mTvMsgQueue.sendMsg ( msg );
+ m_hdmi_audio_data = 0;
+ }
+ m_sig_stable_nums++;
+}
+
+void CTv::onEnableVideoLater(int framecount)
+{
+ LOGD("onEnableVideoLater framecount = %d", framecount);
+ mAv.EnableVideoWhenVideoPlaying(2);
+ //if(CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_HDMI ){
+ if (CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_HDMI ) {
+ SetAudioMuteForTv ( CC_AUDIO_UNMUTE );
+ Tv_SetAudioInSource(m_source_input);
+ //}
+ }
+}
+
+void CTv::Tv_SetAVOutPut_Input_gain(tv_source_input_t source_input)
+{
+ int nPgaValueIndex = 0;
+ int nAdcValueIndex = 0;
+ int nDdcValueIndex= 0;
+ int tmpAvoutBufPtr[9];
+
+ if (GetAvOutGainBuf_Cfg(tmpAvoutBufPtr) != 0)
+ {
+ GetDefaultAvOutGainBuf(tmpAvoutBufPtr);
+ }
+
+ switch (source_input)
+ {
+ case SOURCE_AV1:
+ case SOURCE_AV2:
+ nPgaValueIndex = 0;
+ nAdcValueIndex = 1;
+ nDdcValueIndex = 2;
+ break;
+ case SOURCE_HDMI1:
+ case SOURCE_HDMI2:
+ case SOURCE_HDMI3:
+ case SOURCE_DTV:
+ case SOURCE_MPEG:
+ nPgaValueIndex = 3;
+ nAdcValueIndex = 4;
+ nDdcValueIndex = 5;
+ break;
+ case SOURCE_TV:
+ nPgaValueIndex = 6;
+ nAdcValueIndex = 7;
+ nDdcValueIndex = 8;
+ break;
+ default:
+ break;
+ }
+
+ SetPGA_IN_Value(tmpAvoutBufPtr[nPgaValueIndex]);
+ SetADC_Digital_Capture_Volume(tmpAvoutBufPtr[nAdcValueIndex]);
+ SetDAC_Digital_PlayBack_Volume(tmpAvoutBufPtr[nDdcValueIndex]);
+}
+
+void CTv::onSigStableToUnstable()
+{
+ LOGD ( "%s, stable to unstable\n", __FUNCTION__);
+ SetAudioMuteForTv(CC_AUDIO_MUTE);
+ mAv.DisableVideoWithBlackColor();
+ mTvin.Tvin_StopDecoder();
+}
+void CTv::onSigStableToUnSupport()
+{
+ SetAudioMuteForTv(CC_AUDIO_MUTE);
+ mAv.DisableVideoWithBlackColor();
+ mTvin.Tvin_StopDecoder();
+
+ tvin_info_t info = mSigDetectThread.getCurSigInfo();
+ TvEvent::SignalInfoEvent ev;
+ ev.mTrans_fmt = info.trans_fmt;
+ ev.mFmt = info.fmt;
+ ev.mStatus = info.status;
+ ev.mReserved = info.reserved;
+ sendTvEvent ( ev );
+ LOGD ( "%s, Enable blackscreen for signal change in StableToUnSupport!", __FUNCTION__ );
+}
+void CTv::onSigStableToNoSig()
+{
+ const char *config_value = NULL;
+ SetAudioMuteForTv(CC_AUDIO_MUTE);
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mAv.DisableVideoWithBlackColor();
+ } else {
+ mAv.DisableVideoWithBlueColor();
+ }
+ //SetAudioMuteForTv(CC_AUDIO_MUTE);
+ mTvin.Tvin_StopDecoder();
+
+ tvin_info_t info = mSigDetectThread.getCurSigInfo();
+ TvEvent::SignalInfoEvent ev;
+ ev.mTrans_fmt = info.trans_fmt;
+ ev.mFmt = info.fmt;
+ ev.mStatus = info.status;
+ ev.mReserved = info.reserved;
+ sendTvEvent ( ev );
+ LOGD ( "%s, Enable bluescreen for signal change in StableToNoSig!", __FUNCTION__);
+}
+void CTv::onSigUnStableToUnSupport()
+{
+ mAv.DisableVideoWithBlackColor();
+ mTvin.Tvin_StopDecoder();
+ tvin_info_t info = mSigDetectThread.getCurSigInfo();
+
+
+ TvEvent::SignalInfoEvent ev;
+ ev.mTrans_fmt = info.trans_fmt;
+ ev.mFmt = info.fmt;
+ ev.mStatus = info.status;
+ ev.mReserved = info.reserved;
+ sendTvEvent ( ev );
+ LOGD ( "%s, Enable blackscreen for signal change in UnStableToUnSupport!", __FUNCTION__);
+}
+void CTv::onSigUnStableToNoSig()
+{
+ const char *config_value = NULL;
+ SetAudioMuteForTv(CC_AUDIO_MUTE);
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mAv.DisableVideoWithBlackColor();
+ } else {
+ mAv.DisableVideoWithBlueColor();
+ //SetAudioMuteForTv(CC_AUDIO_MUTE);
+ }
+ mTvin.Tvin_StopDecoder();
+
+ tvin_info_t info = mSigDetectThread.getCurSigInfo();
+ TvEvent::SignalInfoEvent ev;
+ ev.mTrans_fmt = info.trans_fmt;
+ ev.mFmt = info.fmt;
+ ev.mStatus = info.status;
+ ev.mReserved = info.reserved;
+ sendTvEvent ( ev );
+ LOGD ( "%s, Enable bluescreen for signal change in UnStableToNoSig! status = %d", __FUNCTION__, ev.mStatus );
+}
+void CTv::onSigNullToNoSig()
+{
+ const char *config_value = NULL;
+ SetAudioMuteForTv(CC_AUDIO_MUTE);
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mAv.DisableVideoWithBlackColor();
+ } else {
+ mAv.DisableVideoWithBlueColor();
+ //SetAudioMuteForTv(CC_AUDIO_MUTE);
+ }
+ mTvin.Tvin_StopDecoder();
+
+ tvin_info_t info = mSigDetectThread.getCurSigInfo();
+
+
+ TvEvent::SignalInfoEvent ev;
+ ev.mTrans_fmt = info.trans_fmt;
+ ev.mFmt = info.fmt;
+ ev.mStatus = info.status;
+ ev.mReserved = info.reserved;
+ sendTvEvent ( ev );
+ LOGD ( "%s, Enable bluescreen for signal change in NullToNoSig!", __FUNCTION__);
+}
+
+void CTv::onSigNoSigToUnstable()
+{
+ const char *config_value = NULL;
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mAv.DisableVideoWithBlackColor();
+ } else {
+ mAv.DisableVideoWithBlueColor();
+ }
+ LOGD("Enable bluescreen for signal change in NoSigToUnstable\n");
+}
+
+
+void CTv::onSigStillUnstable()
+{
+}
+void CTv::onSigStillNosig()
+{
+
+}
+void CTv::onSigStillNoSupport()
+{
+ return;//change for gxtvbb, don't send event when sitll not support
+ tvin_info_t info = mSigDetectThread.getCurSigInfo();
+ TvEvent::SignalInfoEvent SigEv;
+ SigEv.mTrans_fmt = info.trans_fmt;
+ SigEv.mFmt = info.fmt;
+ SigEv.mStatus = info.status;
+ SigEv.mReserved = info.reserved;
+ sendTvEvent ( SigEv );
+ LOGD ( "%s, Unsupport signal", __FUNCTION__);
+}
+void CTv::onSigStillNull()
+{
+}
+void CTv::onStableSigFmtChange()
+{
+ if ( m_autoset_displayfreq) {
+ if (CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_HDMI ) {
+ int fps = getHDMIFrameRate();
+ LOGD("onSigToStable HDMI fps get = %d", fps);
+ }
+ if ( CTvin::Tvin_is50HzFrameRateFmt ( mSigDetectThread.getCurSigInfo().fmt ) ) {
+ mTvin.VDIN_SetDisplayVFreq ( 50, mAv.getVideoDisplayResolution(), mB_hdmiout_fbc );
+ LOGD ( "%s, SetDisplayVFreq 50HZ.", __FUNCTION__);
+ } else {
+ mTvin.VDIN_SetDisplayVFreq ( 60, mAv.getVideoDisplayResolution(), mB_hdmiout_fbc );
+ LOGD ( "%s, SetDisplayVFreq 60HZ.", __FUNCTION__);
+ }
+ }
+ //showbo mark hdmi auto 3d, tran fmt is 3d, so switch to 3d
+ LOGD("hdmi trans_fmt = %d", mSigDetectThread.getCurSigInfo().trans_fmt);
+
+ //load pq parameters
+ mVpp.LoadVppSettings (CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt );
+
+ if ( m_win_mode == PREVIEW_WONDOW ) {
+ mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2);
+ mAv.setVideoScreenMode ( CAv::VIDEO_WIDEOPTION_FULL_STRETCH );
+ } else {
+ SetDisplayMode ( mVpp.GetDisplayMode ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) ), CTvin::Tvin_SourceInputToSourceInputType(m_source_input), mSigDetectThread.getCurSigInfo().fmt);
+ }
+}
+void CTv::onStableTransFmtChange()
+{
+ LOGD("onStableTransFmtChange trans_fmt = %d", mSigDetectThread.getCurSigInfo().trans_fmt);
+}
+void CTv::onSigDetectEnter()
+{
+}
+
+void CTv::onSigDetectLoop()
+{
+ if (( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_HDMI ) ) {
+ int sr = mTvin.get_hdmi_sampling_rate();
+ if ( ( sr > 0 ) && ( sr != m_hdmi_sampling_rate ) ) {
+ LOGD("HDMI SR CHANGED");
+ CMessage msg;
+ msg.mDelayMs = 0;
+ msg.mType = CTvMsgQueue::TV_MSG_HDMI_SR_CHANGED;
+ ((int *)(msg.mpPara))[0] = sr;
+ ((int *)(msg.mpPara))[1] = m_hdmi_sampling_rate;
+ mTvMsgQueue.sendMsg ( msg );
+ m_hdmi_sampling_rate = sr;
+ }
+
+ //
+ int hdmi_audio_data = mTvin.TvinApi_GetHDMIAudioStatus();
+ if (hdmi_audio_data != m_hdmi_audio_data)//m_hdmi_audio_data init is 0, not audio data , when switch to HDMI
+ {
+ LOGD("HDMI auds_rcv_sts CHANGED = %d", hdmi_audio_data);
+ m_hdmi_audio_data = hdmi_audio_data;
+ onHMDIAudioStatusChanged(m_hdmi_audio_data);
+ }
+ }
+}
+
+CTv::CTvDetectObserverForScanner::CTvDetectObserverForScanner(CTv *pTv)
+{
+ mpTv = pTv;
+ m_sig_stable_nums = 0;
+}
+
+void CTv::CTvDetectObserverForScanner::onSigStableToUnstable()
+{
+ const char *config_value = NULL;
+ LOGD ( "%s, stable to unstable\n", __FUNCTION__);
+ mpTv->SetAudioMuteForTv(CC_AUDIO_MUTE);
+ mpTv->SetAudioMuteForTv(CC_AUDIO_MUTE);
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mpTv->mAv.DisableVideoWithBlackColor();
+ } else {
+ mpTv->mAv.DisableVideoWithBlueColor();
+ }
+ mpTv->mTvin.Tvin_StopDecoder();
+}
+
+void CTv::CTvDetectObserverForScanner::onSigUnStableToNoSig()
+{
+ const char *config_value = NULL;
+ mpTv->SetAudioMuteForTv(CC_AUDIO_MUTE);
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mpTv->mAv.DisableVideoWithBlackColor();
+ } else {
+ mpTv->mAv.DisableVideoWithBlueColor();
+ }
+ mpTv->mTvin.Tvin_StopDecoder();
+}
+void CTv::CTvDetectObserverForScanner::onSigStableToNoSig()
+{
+ const char *config_value = NULL;
+ mpTv->SetAudioMuteForTv(CC_AUDIO_MUTE);
+ config_value = config_get_str ( "TV", "tvin.bluescreen.color", "null" );
+ if ( strcmp ( config_value, "black" ) == 0 ) {
+ mpTv->mAv.DisableVideoWithBlackColor();
+ } else {
+ mpTv->mAv.DisableVideoWithBlueColor();
+ }
+ mpTv->mTvin.Tvin_StopDecoder();
+ LOGD ( "%s, Enable bluescreen for signal change in StableToNoSig!", __FUNCTION__);
+}
+
+void CTv::CTvDetectObserverForScanner::onSigToStable()
+{
+ mpTv->mAv.setVideoScreenMode ( CAv::VIDEO_WIDEOPTION_16_9 );
+ m_sig_stable_nums = 0;
+}
+
+void CTv::CTvDetectObserverForScanner::onSigStillStable()
+{
+ if (m_sig_stable_nums == 1) {
+ LOGD("%s still stable , to start decoder", __FUNCTION__);
+ int startdec_status = mpTv->mTvin.Tvin_StartDecoder (mpTv->mSigDetectThread.getCurSigInfo() );
+ if ( startdec_status == 0 ) {
+ const char *value;
+ value = config_get_str ( "TV", "tvin.db.reg.en", "null" );
+ if ( strcmp ( value, "enable" ) == 0 ) {
+ usleep ( 20 * 1000 );
+ mpTv->Tvin_SetPLLValues ();
+ usleep ( 20 * 1000 );
+ mpTv->SetCVD2Values ();
+ }
+ }
+ }
+ if ( m_sig_stable_nums == 10 ) {
+ mpTv->mAv.EnableVideoWhenVideoPlaying();
+ }
+ m_sig_stable_nums++;
+}
+
+void CTv::onSourceConnect(int source_type, int connect_status)
+{
+ TvEvent::SourceConnectEvent ev;
+ ev.mSourceInput = source_type;
+ ev.connectionState = connect_status;
+ sendTvEvent(ev);
+}
+
+void CTv::onVframeSizeChange()
+{
+ if (m_source_input == SOURCE_DTV) {
+ mVpp.LoadVppSettings ( SOURCE_TYPE_DTV, mAv.getVideoResolutionToFmt(), INDEX_2D, TVIN_TFMT_2D );
+ }else if (m_source_input == SOURCE_INVALID) {
+ mVpp.LoadVppSettings ( SOURCE_TYPE_MPEG, mAv.getVideoResolutionToFmt(), INDEX_2D, TVIN_TFMT_2D );
+ }
+}
+
+
+int CTv::GetSourceConnectStatus(tv_source_input_t source_input)
+{
+ return mSourceConnectDetectThread.GetSourceConnectStatus((tv_source_input_t)source_input);
+}
+
+tv_source_input_t CTv::GetCurrentSourceInputLock ( void )
+{
+ Mutex::Autolock _l ( mLock );
+ return m_source_input;
+}
+
+//dtv and tvin
+tvin_info_t CTv::GetCurrentSignalInfo ( void )
+{
+ tvin_trans_fmt det_fmt = TVIN_TFMT_2D;
+ tvin_sig_status_t signalState = TVIN_SIG_STATUS_NULL;
+ tvin_info_t signal_info = mSigDetectThread.getCurSigInfo();
+
+ int feState = mFrontDev.getStatus();
+ if ( (CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_DTV ) ) {
+ det_fmt = mTvin.TvinApi_Get3DDectMode();
+ if ((feState & FE_HAS_LOCK) == FE_HAS_LOCK) {
+ signal_info.status = TVIN_SIG_STATUS_STABLE;
+
+ } else if ((feState & FE_TIMEDOUT) == FE_TIMEDOUT) {
+ signal_info.status = TVIN_SIG_STATUS_NOSIG;
+ }
+ if ( det_fmt != TVIN_TFMT_2D ) {
+ signal_info.trans_fmt = det_fmt;
+ }
+ signal_info.fmt = mAv.getVideoResolutionToFmt();
+ }
+ return signal_info;
+}
+
+int CTv::Tv_GetHistgram(int *histgram_buf)
+{
+ if (histgram_buf == NULL) {
+ return -1;
+ }
+ return mTvin.VDIN_GetHistgram(histgram_buf);
+}
+
+int CTv::Tv_Set3DMode ( VIDEO_3D_MODE_T mode )
+{
+ if (mode == VIDEO_3D_MODE_AUTO) {
+ mTvin.VDIN_SetDI3DDetc (1);
+ } else {
+ mTvin.VDIN_SetDI3DDetc (0);
+ }
+
+ mAv.set3DMode(mode, 0, 0);
+ m_mode_3d = mode;
+ SSMSave3DMode ( ( unsigned char ) mode );
+ return 0;
+}
+
+VIDEO_3D_MODE_T CTv::Tv_Get3DMode ( void )
+{
+ return m_mode_3d;
+}
+
+int CTv::Tv_Set3DLRSwith ( int on_off)
+{
+ LOGW ( "%s,Set3D LRSwith on_off %d ,status %d !!! ", __FUNCTION__, on_off);
+ mAv.set3DMode(m_mode_3d, on_off, 0);
+ SSMSave3DLRSwitch(on_off);
+ return 0;
+}
+
+int CTv::Tv_Get3DLRSwith ( void )
+{
+ unsigned char val = 0;
+ SSMRead3DLRSwitch ( &val );
+ return ( int ) val;
+}
+
+int CTv::Tv_Set3DTo2DMode ( int mode)
+{
+ LOGW ( "%s,Set3D to 2D mode %d ,status %d !!! ", __FUNCTION__ , mode);
+ mAv.set3DMode(m_mode_3d, 0, mode);
+ SSMSave3DTO2D ( mode );
+ return 0;
+}
+
+int CTv::Tv_Get3DTo2DMode ( void )
+{
+ unsigned char val = 0;
+ SSMRead3DTO2D ( &val );
+ return val;
+}
+
+int CTv::Tv_Set3DDepth ( int value )
+{
+ mTvin.Tvin_SetDepthOf2Dto3D( value );
+ SSMSave3DDepth ( value );
+ return 0;
+}
+
+int CTv::GetSave3DDepth ( void )
+{
+ unsigned char val = 0;
+ SSMRead3DDepth ( &val );
+ return val;
+}
+
+is_3d_type_t CTv::Check2Dor3D ( VIDEO_3D_MODE_T mode3d, tvin_trans_fmt_t trans_fmt )
+{
+ if ( mode3d == VIDEO_3D_MODE_DISABLE ) {
+ return INDEX_2D;
+ } else if ( mode3d == VIDEO_3D_MODE_AUTO ) {
+ if ( trans_fmt == TVIN_TFMT_2D ) {
+ return INDEX_2D;
+ } else {
+ return INDEX_3D;
+ }
+ } else {
+ return INDEX_3D;
+ }
+}
+
+
+int CTv::Tvin_SetPLLValues ()
+{
+ tvin_sig_fmt_t sig_fmt = mSigDetectThread.getCurSigInfo().fmt;
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceInput(m_source_input);
+ am_regs_t regs;
+
+ if ( mVpp.getPqData()->PQ_GetPLLParams ( source_port, sig_fmt, &regs ) == 0 ) {
+ LOGD ("%s,PQ_GetPLLParams(source_port[%d], sig_fmt[%d],&regs).\n", __FUNCTION__, source_port, sig_fmt );
+
+ if ( mTvin.TvinApi_LoadPLLValues ( regs ) < 0 ) {
+ LOGE ( "%s, TvinApi_LoadPLLValues failed!\n", __FUNCTION__ );
+ return -1;
+ }
+ } else {
+ LOGE ( "%s, PQ_GetPLLParams failed!\n", __FUNCTION__ );
+ return -1;
+ }
+
+ return 0;
+}
+int CTv::SetCVD2Values ()
+{
+ tvin_sig_fmt_t sig_fmt = mSigDetectThread.getCurSigInfo().fmt;
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceInput(m_source_input);
+ am_regs_t regs;
+
+ if (mVpp.getPqData()->PQ_GetCVD2Params ( source_port, sig_fmt, &regs ) == 0) {
+ LOGD ( "%s, PQ_GetCVD2Params(source_port[%d], sig_fmt[%d],&regs).\n", __FUNCTION__,
+ source_port, sig_fmt );
+
+ if ( mTvin.TvinApi_LoadCVD2Values ( regs ) < 0 ) {
+ LOGE ( "%s, TvinApi_LoadCVD2Values failed!\n", __FUNCTION__);
+ return -1;
+ }
+ } else {
+ LOGE ( "%s, PQ_GetCVD2Params failed!\n", __FUNCTION__);
+ return -1;
+ }
+
+ return 0;
+}
+
+int CTv::SetPreviewWindow ( tvin_window_pos_t pos )
+{
+ m_win_pos.x1 = pos.x1;
+ m_win_pos.y1 = pos.y1;
+ m_win_pos.x2 = pos.x2;
+ m_win_pos.y2 = pos.y2;
+ LOGD ( "%s, SetPreviewWindow x = %d y=%d", __FUNCTION__, pos.x2, pos.y2 );
+
+ tvin_window_pos_t def_pos;
+ Vpp_GetDisplayResolutionInfo(&def_pos);
+
+ if (pos.x1 != 0 || pos.y1 != 0 || pos.x2 != def_pos.x2 || pos.y2 != def_pos.y2) {
+ m_win_mode = PREVIEW_WONDOW;
+ } else {
+ m_win_mode = NORMAL_WONDOW;
+ }
+
+ return mAv.setVideoAxis(m_win_pos.x1, m_win_pos.y1, m_win_pos.x2, m_win_pos.y2);
+}
+
+/*********************** Audio start **********************/
+int CTv::SetAudioVolDigitLUTTable ( tv_source_input_t source_input )
+{
+ int tmpDefDigitLutBuf[CC_LUT_BUF_SIZE] = { 0 };
+ int lut_table_index = 0;
+ if (source_input == SOURCE_TV) {
+ lut_table_index = CC_GET_LUT_TV;
+ } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) {
+ lut_table_index = CC_GET_LUT_AV;
+ } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2) {
+ lut_table_index = CC_GET_LUT_COMP;
+ } else if (source_input == SOURCE_VGA) {
+ lut_table_index = CC_GET_LUT_VGA;
+ } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
+ lut_table_index = CC_GET_LUT_HDMI;
+ } else if ( source_input == SOURCE_MPEG ) {
+ lut_table_index = CC_GET_LUT_MPEG;
+ } else if ( source_input == SOURCE_DTV ) {
+ lut_table_index = CC_GET_LUT_MPEG;
+ } else if ( source_input == SOURCE_MAX) {
+ return 0;
+ }
+ char MainVolLutTableName[128];
+ const char *baseName = GetAudioAmpMainvolTableBaseName(lut_table_index);
+ strcpy(MainVolLutTableName, baseName);
+ char *dName = ".";
+ strcat(MainVolLutTableName, dName);
+ strcat(MainVolLutTableName, GetMainVolLutTableExtraName());
+ if ( GetAudioAmpMainvolBuf(MainVolLutTableName, tmpDefDigitLutBuf) == 0) {
+ AudioSetVolumeDigitLUTBuf ( lut_table_index, tmpDefDigitLutBuf);
+ }
+ return 0;
+}
+
+void CTv::RefreshAudioMasterVolume ( tv_source_input_t source_input )
+{
+ if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
+ if ( GetAudioDVISupportEnable() == 1 ) {
+ if ( IsDVISignal() ) {
+ SetAudioVolDigitLUTTable ( SOURCE_MPEG );
+ SetAudioMasterVolume ( GetAudioMasterVolume() );
+ return;
+ }
+ }
+ }
+
+ SetAudioVolDigitLUTTable ( source_input );
+ SetAudioMasterVolume ( GetAudioMasterVolume() );
+}
+
+int CTv::Tv_SetAudioInSource (tv_source_input_t source_input)
+{
+ int vol = 255;
+ if (source_input == SOURCE_TV) {
+ if (mTvin.Tvin_GetAudioInSourceType(source_input) == TV_AUDIO_IN_SOURCE_TYPE_ATV) {
+ AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_ATV);
+ vol = GetAudioInternalDACDigitalPlayBackVolume_Cfg(CC_AUDIO_IN_SOURCE_ATV);
+ LOGD("%s, atv DAC_Digital_PlayBack_Volume = %d\n", __FUNCTION__, vol);
+ } else {
+ LOGD("%s, dtv DAC_Digital_PlayBack_Volume = %d\n", __FUNCTION__, vol);
+ AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN);
+ vol = GetAudioInternalDACDigitalPlayBackVolume_Cfg(CC_AUDIO_IN_SOURCE_LINEIN);
+ }
+ } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) {
+ AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN);
+ vol = GetAudioInternalDACDigitalPlayBackVolume_Cfg(CC_AUDIO_IN_SOURCE_LINEIN);
+ } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
+ AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_HDMI);
+ vol = GetAudioInternalDACDigitalPlayBackVolume_Cfg(CC_AUDIO_IN_SOURCE_HDMI);
+ } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2 ||
+ source_input == SOURCE_TYPE_VGA) {
+ AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_LINEIN);
+ vol = GetAudioInternalDACDigitalPlayBackVolume_Cfg(CC_AUDIO_IN_SOURCE_LINEIN);
+ } else if (source_input == SOURCE_MPEG) {
+ AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_HDMI);
+ vol = GetAudioInternalDACDigitalPlayBackVolume_Cfg(CC_AUDIO_IN_SOURCE_HDMI);
+ } else if (source_input == SOURCE_DTV) {
+
+ AudioSetAudioInSource(CC_AUDIO_IN_SOURCE_HDMI);
+ vol = GetAudioInternalDACDigitalPlayBackVolume_Cfg(CC_AUDIO_IN_SOURCE_HDMI);
+ LOGD("%s, dtv DAC_Digital_PlayBack_Volume = %d\n", __FUNCTION__, vol);
+ }
+ LOGD("%s, we have read SetDAC_Digital_PlayBack_Volume = %d\n", __FUNCTION__, vol);
+
+ return 0;
+}
+
+int CTv::Tv_SetAudioSourceType (tv_source_input_t source_input)
+{
+ int audio_source = -1;
+
+ if (source_input == SOURCE_TV) {
+ audio_source = AUDIO_ATV_SOURCE;
+ } else if (source_input == SOURCE_AV1 || source_input == SOURCE_AV2) {
+ audio_source = AUDIO_AV_SOURCE;
+ } else if (source_input == SOURCE_HDMI1 || source_input == SOURCE_HDMI2 || source_input == SOURCE_HDMI3) {
+ audio_source = AUDIO_HDMI_SOURCE;
+ } else if (source_input == SOURCE_YPBPR1 || source_input == SOURCE_YPBPR2 ||
+ source_input == SOURCE_TYPE_VGA) {
+ audio_source = AUDIO_AV_SOURCE;
+ } else if (source_input == SOURCE_DTV) {
+ audio_source = AUDIO_MPEG_SOURCE;
+ } else {
+ audio_source = AUDIO_MPEG_SOURCE;
+ }
+
+ return AudioSetAudioSourceType(audio_source);
+}
+void CTv::Tv_SetAudioOutputSwap_Type (tv_source_input_t source_input)
+{
+ int sw_status = GetAudioOutputSwapStatus(source_input);
+ SetOutput_Swap(sw_status);
+}
+void CTv::Tv_ADCDigitalCapture_Volume (void)
+{
+ int capture_vol = GetADCDigitalCaptureVol_Cfg();
+ LOGD("%s, we have read ADCDigitalCaptureVol_Config = %d \n", __FUNCTION__, capture_vol);
+ SetADC_Digital_Capture_Volume(capture_vol);
+}
+
+void CTv::Tv_SetPGAIn_Gain (void)
+{
+ int gain_val = GetAudioInternalDacPGAInGain_Cfg();
+ LOGD("%s, we have read ADCDigitalCaptureVol_Config = %d \n", __FUNCTION__, gain_val);
+ SetPGA_IN_Value(gain_val);
+}
+
+void CTv::Tv_SetDACDigitalPlayBack_Volume (int audio_src_in_type)
+{
+ int vol = GetAudioInternalDACDigitalPlayBackVolume_Cfg(audio_src_in_type);
+ LOGD("%s, we have read DACDigitalPlayBackVolume config = %d \n", __FUNCTION__, vol);
+ SetDAC_Digital_PlayBack_Volume(vol);
+}
+/*********************** Audio end **********************/
+
+unsigned int CTv::Vpp_GetDisplayResolutionInfo(tvin_window_pos_t *win_pos)
+{
+ int display_resolution = mAv.getVideoDisplayResolution();
+ unsigned int tmp_ret = 0;
+
+ switch (display_resolution) {
+ case VPP_DISPLAY_RESOLUTION_1366X768:
+ tmp_ret |= (CC_RESOLUTION_1366X768_W << 16);
+ tmp_ret |= (CC_RESOLUTION_1366X768_H << 0);
+ break;
+ case VPP_DISPLAY_RESOLUTION_1920X1080:
+ tmp_ret |= (CC_RESOLUTION_1920X1080_W << 16);
+ tmp_ret |= (CC_RESOLUTION_1920X1080_H << 0);
+ break;
+ case VPP_DISPLAY_RESOLUTION_3840X2160:
+ tmp_ret |= (CC_RESOLUTION_3840X2160_W << 16);
+ tmp_ret |= (CC_RESOLUTION_3840X2160_H << 0);
+ break;
+ default:
+ tmp_ret |= (CC_RESOLUTION_3840X2160_W << 16);
+ tmp_ret |= (CC_RESOLUTION_3840X2160_H << 0);
+ break;
+ }
+
+ if (win_pos != NULL) {
+ win_pos->x1 = 0;
+ win_pos->y1 = 0;
+ win_pos->x2 = ((tmp_ret >> 16) & 0xFFFF) - 1;
+ win_pos->y2 = ((tmp_ret >> 0) & 0xFFFF) - 1;
+ }
+
+ return 0;
+}
+
+
+int CTv::setBlackoutEnable(int enable)
+{
+ m_blackout_enable = enable;
+ return SSMSaveBlackoutEnable(enable);
+}
+
+int CTv::getSaveBlackoutEnable()
+{
+ int8_t enable;
+ SSMReadBlackoutEnable(&enable);
+ return enable;
+}
+void CTv::startAutoBackLight()
+{
+ if (mB_hdmiout_fbc) {
+ Tv_FactorySet_FBC_Auto_Backlight_OnOff(1);
+ } else {
+ mAutoBackLight.startAutoBacklight(CTvin::Tvin_SourceInputToSourceInputType(m_source_input));
+ }
+
+}
+void CTv::stopAutoBackLight()
+{
+ if (mB_hdmiout_fbc) {
+ Tv_FactorySet_FBC_Auto_Backlight_OnOff(0);
+ } else {
+ mAutoBackLight.stopAutoBacklight();
+ }
+}
+
+int CTv::getAutoBackLight_on_off()
+{
+ if (mB_hdmiout_fbc) {
+ return Tv_FactoryGet_FBC_Auto_Backlight_OnOff();
+ } else {
+ return mAutoBackLight.isAutoBacklightOn() ? 1 : 0;
+ }
+}
+
+int CTv::getAverageLuma()
+{
+ return mTvin.VDIN_Get_avg_luma();
+}
+
+int CTv::setAutobacklightData(const char* value){
+ int i = 0;
+ const char *tmp_ptr = NULL;
+ const char *end_str_buf =".opc";
+ project_info_t tmp_info;
+ char tmp_buf[128];
+ const char* key_buf ="haier.autobacklight.mp.data";
+
+ tmp_ptr = config_get_str("TV", key_buf, "null");
+ if (strcmp(tmp_ptr, value) != 0) {
+ config_set_str("TV", key_buf, value);
+ LOGD("%s, config string now set as: %s \n", __FUNCTION__, tmp_buf);
+ } else {
+ LOGD("%s, config string has been set as: %s \n", __FUNCTION__, tmp_buf);
+ }
+ return 0;
+}
+
+int CTv::getAutoBacklightData(int* data){
+ const char *opc_buf;
+ char str_data[512] ={0,};
+ char delims[] = ",";
+ char *result = NULL;
+ const char* key_buf ="haier.autobacklight.mp.data";
+ int i=0;
+
+ if (NULL == data) {
+ LOGD("%s, data is null", __FUNCTION__);
+ }
+
+ opc_buf = config_get_str("TV", key_buf, (char *) "null");
+ if (strcmp(opc_buf,"null") == 0) {
+ LOGD("%s, value is NULL\n",__FUNCTION__);
+ return -1;
+ }
+
+ memset( str_data,0, sizeof(str_data));
+ strncpy(str_data,opc_buf,sizeof(str_data)-1);
+ result = strtok( str_data, delims );
+ while ( result != NULL ) {
+ char *pd =NULL;
+ pd = strstr(result, ":");
+ if (pd != NULL) {
+ data[i] =strtol(pd+1, NULL, 10 );
+ i++;
+ }
+ result = strtok( NULL, delims );
+ }
+ return i;
+}
+
+
+/*********************** SSM start **********************/
+int CTv::Tv_SSMRestoreDefaultSetting()
+{
+ SSMRestoreDeviceMarkValues();
+ AudioSSMRestoreDefaultSetting();
+ mVpp.VPPSSMRestoreDefault();
+ MiscSSMRestoreDefault();
+ ReservedSSMRestoreDefault();
+ SSMSaveCVBSStd ( 0 );
+ SSMSaveLastSelectSourceInput ( SOURCE_TV );
+ SSMSavePanelType ( 0 );
+ //tvconfig default
+ saveDTVProgramID ( -1 );
+ saveATVProgramID ( -1 );
+ SSMSaveStandbyMode( 0 );
+ return 0;
+}
+
+int CTv::clearDbAllProgramInfoTable()
+{
+ return CTvDatabase::GetTvDb()->clearDbAllProgramInfoTable();
+}
+
+int CTv::Tv_SSMFacRestoreDefaultSetting()
+{
+ mVpp.VPPSSMFacRestoreDefault();
+ AudioSSMRestoreDefaultSetting();
+ MiscSSMFacRestoreDefault();
+
+ return 0;
+}
+/*********************** SSM End **********************/
+//not in CTv, not use lock
+void CTv::setSourceSwitchAndPlay()
+{
+ int progID = 0, ret = -1;
+ CTvProgram prog;
+ LOGD ( "%s\n", __FUNCTION__ );
+ static const int POWERON_SOURCE_TYPE_NONE = 0;//not play source
+ static const int POWERON_SOURCE_TYPE_LAST = 1;//play last save source
+ static const int POWERON_SOURCE_TYPE_SETTING = 2;//play ui set source
+ int to_play_source = -1;
+ int powerup_type = SSMReadPowerOnOffChannel();
+ LOGD("read power on source type = %d", powerup_type);
+ if (powerup_type == POWERON_SOURCE_TYPE_NONE) {
+ return ;
+ } else if (powerup_type == POWERON_SOURCE_TYPE_LAST) {
+ to_play_source = SSMReadSourceInput();
+ } else if (powerup_type == POWERON_SOURCE_TYPE_SETTING) {
+ to_play_source = SSMReadLastSelectSourceInput();
+ }
+ SetSourceSwitchInput (( tv_source_input_t ) to_play_source );
+ if ( to_play_source == SOURCE_TV ) {
+ progID = getATVProgramID();
+ } else if ( to_play_source == SOURCE_DTV ) {
+ progID = getDTVProgramID();
+ }
+ playProgramLock(progID);
+ return;
+}
+
+int CTv::startCC(int country, int src, int channel, int service)
+{
+ //turn_on_cc = true;
+ return mSubtitle.sub_start_atsc_cc((enum cc_param_country)country, (enum cc_param_source_type)src, channel, (enum cc_param_caption_type)service);
+}
+
+int CTv::stopCC()
+{
+ //because cc,vchip data both come from vbi thread , here judge cc, vchip is whether both turn off
+ /*turn_on_cc = false;
+ if (config_get_int("TV","tv.vchip.enable", 0))
+ {
+ return 0; //at ATV if vchip is on, turn off CC, just set flag not display CC, but vchip still running
+ }*/
+ return mSubtitle.sub_stop_atsc_cc();
+}
+
+void CTv::printDebugInfo()
+{
+ print_version_info();
+ LOGD("%s, TvAction = %x", __FUNCTION__, mTvAction);
+ LOGD("%s, TvRunStatus = %d", __FUNCTION__, mTvStatus);
+ LOGD("%s, TvCurSourceInput = %d", __FUNCTION__, m_source_input);
+ LOGD("%s, TvLastSourceInput = %d", __FUNCTION__, m_last_source_input);
+}
+//==============vchip end================================
+//----------------DVR API============================
+void CTv::SetRecordFileName ( char *name )
+{
+ char tmp[256];
+ strcpy ( tmp, name );
+ mTvRec.SetRecordFileName ( tmp );
+}
+void CTv::StartToRecord()
+{
+ int progID = getDTVProgramID();
+ mTvRec.StartRecord ( progID );
+}
+void CTv::StopRecording()
+{
+ mTvRec.StopRecord();
+}
+void CTv::SetRecCurTsOrCurProgram ( int sel )
+{
+ mTvRec.SetRecCurTsOrCurProgram ( sel );
+}
+
+int CTv::GetDisplayResolutionConfig()
+{
+ return mAv.getVideoDisplayResolution();
+}
+
+int CTv::GetDisplayResolutionInfo()
+{
+ return Vpp_GetDisplayResolutionInfo(NULL);
+}
+
+void CTv::onHDMIRxCECMessage(int msg_len, unsigned char msg_buf[])
+{
+ int i = 0;
+ TvEvent::HDMIRxCECEvent ev;
+ ev.mDataCount = msg_len;
+ for (i = 0; i < msg_len; i++) {
+ ev.mDataBuf[i] = msg_buf[i];
+ }
+ sendTvEvent(ev);
+}
+
+int CTv::SendHDMIRxCECCustomMessage(unsigned char data_buf[])
+{
+ tv_source_input_t source_input = m_source_input;
+
+ return mHDMIRxCEC.SendCustomMessage(source_input, data_buf);
+}
+
+int CTv::SendHDMIRxCECCustomMessageAndWaitReply(unsigned char data_buf[], unsigned char reply_buf[], int WaitCmd, int timeout)
+{
+ tv_source_input_t source_input = m_source_input;
+
+ return mHDMIRxCEC.SendCustomMessageAndWaitReply(source_input, data_buf, reply_buf, WaitCmd, timeout);
+}
+
+int CTv::SendHDMIRxCECBoradcastStandbyMessage(void)
+{
+ tv_source_input_t source_input = m_source_input;
+
+ return mHDMIRxCEC.SendBoradcastStandbyMessage(source_input);
+}
+
+int CTv::SendHDMIRxCECGiveCECVersionMessage(tv_source_input_t source_input, unsigned char data_buf[])
+{
+ if (mHDMIRxCEC.processRefreshSrcDevice(source_input) == 0) {
+ return mHDMIRxCEC.SendGiveCECVersionMessage(source_input, data_buf);
+ }
+
+ return -1;
+}
+
+int CTv::SendHDMIRxCECGiveDeviceVendorIDMessage(tv_source_input_t source_input, unsigned char data_buf[])
+{
+ if (mHDMIRxCEC.processRefreshSrcDevice(source_input) == 0) {
+ return mHDMIRxCEC.SendGiveDeviceVendorIDMessage(source_input, data_buf);
+ }
+
+ return -1;
+}
+
+int CTv::SendHDMIRxCECGiveOSDNameMessage(tv_source_input_t source_input, unsigned char data_buf[])
+{
+ if (mHDMIRxCEC.processRefreshSrcDevice(source_input) == 0) {
+ return mHDMIRxCEC.SendGiveOSDNameMessage(source_input, data_buf);
+ }
+
+ return -1;
+}
+
+int CTv::GetHdmiHdcpKeyKsvInfo(int data_buf[])
+{
+ return mTvin.get_hdmi_ksv_info(m_source_input, data_buf);
+}
+
+int CTv::hdmi_out_towhat()
+{
+ const char *config_value;
+ config_value = config_get_str("TV", "platform.havefbc", "true");
+ if (strcmp(config_value, "true") == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+void CTv::onUpgradeStatus(int state, int param)
+{
+ TvEvent::UpgradeFBCEvent ev;
+ ev.mState = state;
+ ev.param = param;
+ sendTvEvent(ev);
+}
+
+int CTv::StartUpgradeFBC(char *file_name, int mode, int upgrade_blk_size)
+{
+ if (mpUpgradeFBC != NULL) {
+ mpUpgradeFBC->SetUpgradeFileName(file_name);
+ mpUpgradeFBC->SetUpgradeMode(mode);
+ mpUpgradeFBC->SetUpgradeBlockSize(upgrade_blk_size);
+ mpUpgradeFBC->start();
+ return 0;
+ }
+
+ return -1;
+}
+
+void CTv::onSerialCommunication(int dev_id, int rd_len, unsigned char data_buf[])
+{
+ int i = 0;
+ TvEvent::SerialCommunicationEvent ev;
+ ev.mDevId = dev_id;
+ ev.mDataCount = rd_len;
+ for (i = 0; i < rd_len; i++) {
+ ev.mDataBuf[i] = data_buf[i];
+ }
+ sendTvEvent(ev);
+}
+
+int CTv::StartHeadSetDetect()
+{
+ mHeadSet.startDetect();
+ return 0;
+}
+
+void CTv::onHeadSetDetect(int state,int para)
+{
+ TvEvent::HeadSetOf2d4GEvent ev;
+ if (state == 1)
+ property_set("audio.headset_plug.enable", "1");
+ else
+ property_set("audio.headset_plug.enable", "0");
+ ev.state = state;
+ ev.para = para;
+ sendTvEvent(ev);
+}
+
+void CTv::onThermalDetect(int state)
+{
+ const char *value;
+ const char *value_normal;
+ const char *value_cold;
+ int threshold = 0, val = 0;
+ static int pre_val = -1;
+
+ value = config_get_str ( "TV", "tvin.thermal.threshold.enable", "null" );
+
+ if ( strcmp ( value, "enable" ) == 0 ) {
+
+ value = config_get_str ( "TV", "tvin.thermal.threshold.value", "null" );
+
+ threshold = atoi(value);
+ LOGD ( "%s, threshold value: %d\n", __FUNCTION__, threshold);
+
+ if (state > threshold) {
+ value_normal = config_get_str ( "TV", "tvin.thermal.fbc.normal.value", "null" );
+ val = atoi(value_normal);
+ if (val == 0) {
+ val = 0x4210000; //normal default
+ }
+ LOGD ( "%s, current temp: %d set 1\n", __FUNCTION__, state);
+ } else {
+ value_cold = config_get_str ( "TV", "tvin.thermal.fbc.cold.value", "null" );
+ val = atoi(value_cold);
+ if (val == 0) {
+ val = 0x8210000; //cold default
+ }
+ LOGD ( "%s, current temp: 0x%x set 0\n", __FUNCTION__, state);
+ }
+
+ if (pre_val == val) {
+ LOGD ( "%s, pre_val == val : 0x%x,bypass\n", __FUNCTION__, val);
+ } else {
+ pre_val = val;
+ Tv_FactorySet_FBC_Thermal_State(val);
+ LOGD ( "%s, pre_val :0x%x,bypass\n", __FUNCTION__, pre_val);
+ }
+ } else {
+ LOGD ( "%s, tvin.thermal.threshold.enable == disable\n", __FUNCTION__);
+ }
+}
+
+int CTv::SetDebugSerialOnOff(int on_off)
+{
+ if (on_off) {
+ property_set("ubootenv.var.console", "ttyS0,115200n8");
+ } else {
+ property_set("ubootenv.var.console", "off");
+ }
+ return 0;
+}
+
+int CTv::GetDebugSerialOnOff()
+{
+ char prop[256];
+ memset(prop, '\0', 256);
+ property_get("ubootenv.var.console", prop, "null" );
+
+ if (!strcmp(prop, "ttyS0,115200n8")) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+int CTv::SetSerialSwitch(int dev_id, int switch_val)
+{
+ int tmp_ret = 0;
+ if (dev_id == SERIAL_A) {
+ if (switch_val == 0) {
+ tmp_ret |= mSerialA.stop();
+ tmp_ret |= mSerialA.CloseModule();
+
+ tmp_ret |= system("start console");
+ tmp_ret |= system("echo 7 > /proc/sys/kernel/printk");
+ } else {
+ tmp_ret |= system("echo 0 > /proc/sys/kernel/printk");
+ tmp_ret |= system("stop console");
+
+ mSerialA.OpenModule(dev_id);
+ tmp_ret |= mSerialA.start();
+ }
+ } else if (dev_id == SERIAL_B) {
+ if (switch_val == 0) {
+ tmp_ret |= mSerialB.stop();
+ tmp_ret |= mSerialB.CloseModule();
+ } else {
+ mSerialB.OpenModule(dev_id);
+ tmp_ret = mSerialB.start();
+ }
+ } else if (dev_id == SERIAL_C) {
+ if (switch_val == 0) {
+ tmp_ret |= mSerialC.stop();
+ tmp_ret |= mSerialC.CloseModule();
+ } else {
+ mSerialC.OpenModule(dev_id);
+ tmp_ret = mSerialC.start();
+ }
+ }
+
+ return tmp_ret;
+}
+
+int CTv::SendSerialData(int dev_id, int data_len, unsigned char data_buf[])
+{
+ int tmp_ret = 0;
+
+ if (dev_id == SERIAL_A) {
+ tmp_ret = mSerialA.sendData(data_len, data_buf);
+ } else if (dev_id == SERIAL_B) {
+ tmp_ret = mSerialB.sendData(data_len, data_buf);
+ } else if (dev_id == SERIAL_C) {
+ tmp_ret = mSerialC.sendData(data_len, data_buf);
+ }
+
+ return tmp_ret;
+}
+
+int CTv::ChannelExport(const char *destPath)
+{
+ //DIR *dirptr = NULL;
+ //dirptr = opendir("/storage/external_storage/sda1/");
+ //if(NULL == dirptr) {
+ // LOGD("%s, please insert the udisk !",__FUNCTION__);
+ // return -2;
+ // } else {
+ char tmp[256];
+ FILE *fp = NULL;
+ if (destPath == NULL) {
+ destPath = "/storage/external_storage/sda1/";
+ }
+
+ //LOGD("%s, udisk exist !",__FUNCTION__);
+ sprintf(tmp, "cp /param/dtv.db %s", destPath);
+ if (system(tmp) >= 0) {
+ LOGD("%s, copy dtv.db from /param to udisk success !", __FUNCTION__);
+ system("sync");
+ fp = fopen(destPath, "r");
+ if (fp == NULL) {
+ return -1;
+ } else {
+ fclose(fp);
+ fp = NULL;
+ return 0;
+ }
+ } else {
+ return -1;
+ }
+ //}
+}
+
+int CTv::ChannelImport(const char *srcPath)
+{
+ if (srcPath == NULL) {
+ srcPath = "/storage/external_storage/sda1/dvb.db";
+ }
+
+ if (Tv_Utils_IsFileExist(srcPath) == 0) {
+ char tmp[256];
+ const char *destPath = config_get_str("TV", "tv.channel.db", (char *) "/param/dtv.db");
+
+ LOGD("%s, file exist !" , srcPath);
+ CTvDatabase::GetTvDb()->UnInitTvDb();
+ sprintf(tmp, "rm %s", destPath);
+ if (system(tmp) >= 0) {
+ LOGD("%s, rm %s success !", __FUNCTION__, destPath);
+ memset(tmp, 0, sizeof(tmp));
+ sprintf(tmp, "cp %s %s", srcPath, destPath);
+ if (system(tmp) >= 0) {
+ LOGD("%s, copy to %s success !", srcPath, destPath);
+ memset(tmp, 0, sizeof(tmp));
+ sprintf(tmp, "chmod 777 %s", destPath);
+ if (system(tmp) >= 0) {
+ LOGD("chmod 777 %s success !", destPath);
+ system("sync");
+ CTvDatabase::GetTvDb()->InitTvDb(TV_DB_PATH);
+ return 0;
+ } else {
+ LOGD("%s, %s chmod failed !", __FUNCTION__, destPath);
+ return -1;
+ }
+ } else {
+ LOGD("%s, copy dtv.db from udisk to %s failed !", __FUNCTION__, destPath);
+ return -1;
+ }
+ } else {
+ LOGD("%s, rm %s failed !", __FUNCTION__, destPath);
+ return -2;
+ }
+ } else {
+ LOGD("%s, dtv.db file does not exist in the udisk!" , srcPath);
+ return -2;
+ }
+
+}
+
+int CTv::Tv_GetProjectInfo(project_info_t *ptrInfo)
+{
+ return GetProjectInfo(ptrInfo, fbcIns);
+}
+
+int CTv::Tv_GetPlatformType()
+{
+ return mB_hdmiout_fbc ? 1 : 0;
+}
+
+int CTv::Tv_HandeHDMIEDIDFilePathConfig()
+{
+ int i, file_exist_flag = 1;
+ const char *value = NULL;
+ char val_buf[256];
+ char edid_path[256];
+ char edid_path_cfg[256];
+
+ value = config_get_str("TV", "ssm.handle.hdmi.edid.en", "null");
+
+ if (strtoul(value, NULL, 10) == 1) {
+ LOGD( "%s, get config \"%s\" is \"%s\".\n",
+ __FUNCTION__, "ssm.handle.hdmi.edid.en", value);
+ //get hdmi edid use mode
+
+ memset(val_buf, '\0', 256);
+ property_get("ubootenv.var.outputmode", val_buf, "null");
+ LOGD( "%s, get property \"%s\" is \"%s\".\n",
+ __FUNCTION__, "ubootenv.var.outputmode", val_buf);
+ if (strcmp(val_buf, "null") != 0) {
+ config_set_str ( "TV", "ssm.handle.hdmi.edid.use", val_buf);
+
+ file_exist_flag = 1;
+ //set file's path for hdmi edid of each port
+ for (i = 1; i <= SSM_HDMI_PORT_MAX; i++) {
+ memset( edid_path, '\0', 256);
+ memset( edid_path_cfg, '\0', 256);
+ sprintf(edid_path, "/system/etc/%s_port%d.bin", val_buf, i);
+ sprintf(edid_path_cfg, "ssm.handle.hdmi.port%d.edid.file.path", i);
+ if (access(edid_path, 0) < 0) {
+ file_exist_flag = 0;
+ break;
+ }
+ config_set_str("TV", edid_path_cfg, edid_path);
+ }
+
+ if (file_exist_flag == 0) {
+ //set default hdmi edid
+ config_set_str("TV", "ssm.handle.hdmi.edid.use", "hdmi_edid");
+ //set file's path for hdmi edid of each port
+ for (i = 1; i <= SSM_HDMI_PORT_MAX; i++) {
+ memset(edid_path, '\0', 256);
+ memset(edid_path_cfg, '\0', 256);
+ sprintf(edid_path, "/system/etc/%s_port%d.bin", "hdmi_edid", i);
+ sprintf(edid_path_cfg, "ssm.handle.hdmi.port%d.edid.file.path", i);
+
+ value = config_get_str("TV", edid_path_cfg, "null");
+ if (strcmp(value, edid_path) != 0) {
+ config_set_str("TV", edid_path_cfg, edid_path);
+ }
+ }
+ }
+ } else {
+ //set default hdmi edid
+ config_set_str("TV", "ssm.handle.hdmi.edid.use", "hdmi_edid");
+ //set file's path for hdmi edid of each port
+ for (i = 1; i <= SSM_HDMI_PORT_MAX; i++) {
+ memset(edid_path, '\0', 256);
+ memset(edid_path_cfg, '\0', 256);
+ sprintf(edid_path, "/system/etc/%s_port%d.bin", "hdmi_edid", i);
+ sprintf(edid_path_cfg, "ssm.handle.hdmi.port%d.edid.file.path", i);
+
+ value = config_get_str("TV", edid_path_cfg, "null");
+ if (strcmp(value, edid_path) != 0) {
+ config_set_str("TV", edid_path_cfg, edid_path);
+ }
+ }
+ }
+ m_is_set_hdmi_edid = true;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_SetDDDRCMode(tv_source_input_t source_input)
+{
+ if (source_input == SOURCE_DTV) {
+ if (GetPlatformHaveDDFlag() == 1) {
+ Tv_Utils_SetFileAttrStr("/sys/class/audiodsp/ac3_drc_control", "drcmode 3");
+ }
+ } else {
+ if (GetPlatformHaveDDFlag() == 1) {
+ Tv_Utils_SetFileAttrStr("/sys/class/audiodsp/ac3_drc_control", "drcmode 2");
+ }
+ }
+
+ return 0;
+}
+
+//PQ
+int CTv::Tv_SetBrightness ( int brightness, tv_source_input_type_t source_type, int is_save )
+{
+ return mVpp.SetBrightness(brightness, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
+}
+
+int CTv::Tv_GetBrightness ( tv_source_input_type_t source_type )
+{
+ return mVpp.GetBrightness((tv_source_input_type_t)source_type);
+}
+
+int CTv::Tv_SaveBrightness ( int brightness, tv_source_input_type_t source_type )
+{
+ return SSMSaveBrightness ( source_type, brightness );
+}
+
+int CTv::Tv_SetContrast ( int contrast, tv_source_input_type_t source_type, int is_save )
+{
+ return mVpp.SetContrast(contrast, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
+}
+
+int CTv::Tv_GetContrast ( tv_source_input_type_t source_type )
+{
+ return mVpp.GetContrast((tv_source_input_type_t)source_type);
+}
+
+int CTv::Tv_SaveContrast ( int contrast, tv_source_input_type_t source_type )
+{
+ return SSMSaveContrast ( source_type, contrast );
+}
+int CTv::Tv_SetSaturation ( int satuation, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save )
+{
+ return mVpp.SetSaturation(satuation, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
+}
+
+int CTv::Tv_GetSaturation ( tv_source_input_type_t source_type )
+{
+ return mVpp.GetSaturation((tv_source_input_type_t)source_type);
+}
+
+int CTv::Tv_SaveSaturation ( int satuation, tv_source_input_type_t source_type )
+{
+ return SSMSaveSaturation ( source_type, satuation );
+}
+int CTv::Tv_SetHue ( int hue, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save )
+{
+ return mVpp.SetHue(hue, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
+}
+
+int CTv::Tv_GetHue ( tv_source_input_type_t source_type )
+{
+ return mVpp.GetHue((tv_source_input_type_t)source_type);
+}
+
+int CTv::Tv_SaveHue ( int hue, tv_source_input_type_t source_type )
+{
+ return SSMSaveHue ( source_type, hue );
+}
+int CTv::Tv_SetPQMode ( vpp_picture_mode_t mode, tv_source_input_type_t source_type, int is_save )
+{
+ return mVpp.SetPQMode((vpp_picture_mode_t)mode, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), is_save);
+}
+
+vpp_picture_mode_t CTv::Tv_GetPQMode ( tv_source_input_type_t source_type )
+{
+ return mVpp.GetPQMode((tv_source_input_type_t)source_type);
+}
+
+int CTv::Tv_SavePQMode ( vpp_picture_mode_t mode, tv_source_input_type_t source_type )
+{
+ return mVpp.SavePQMode ( mode, source_type );
+}
+int CTv::Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int en, int is_save )
+{
+ return mVpp.SetSharpness(value, (tv_source_input_type_t)source_type, en, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().fmt, mSigDetectThread.getCurSigInfo().trans_fmt, is_save);
+}
+
+int CTv::Tv_GetSharpness ( tv_source_input_type_t source_type )
+{
+ return mVpp.GetSharpness((tv_source_input_type_t)source_type);
+}
+
+int CTv::Tv_SaveSharpness ( int value, tv_source_input_type_t source_type )
+{
+ return SSMSaveSharpness ( source_type, value );
+}
+int CTv::Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save )
+{
+ if (mB_hdmiout_fbc) {
+ return Tv_FactorySet_FBC_Backlight(value);
+ } else {
+ return mVpp.SetBacklight(value, (tv_source_input_type_t)source_type, is_save);
+ }
+}
+
+int CTv::Tv_GetBacklight ( tv_source_input_type_t source_type )
+{
+ if (mB_hdmiout_fbc) {
+ return Tv_FactoryGet_FBC_Backlight();
+ } else {
+ return mVpp.GetBacklight((tv_source_input_type_t)source_type);
+ }
+}
+int CTv::Tv_SaveBacklight ( int value, tv_source_input_type_t source_type )
+{
+ return mVpp.SaveBacklight ( value, source_type );
+}
+int CTv::Tv_SetBacklight_Switch ( int value )
+{
+ if (mB_hdmiout_fbc) {
+ return Tv_FactorySet_FBC_backlight_onoff(value);
+ } else {
+ return mVpp.VPP_SetBackLight_Switch(value);
+ }
+}
+
+int CTv::Tv_GetBacklight_Switch ( void )
+{
+ if (mB_hdmiout_fbc) {
+ return Tv_FactoryGet_FBC_backlight_onoff();
+ } else {
+ return mVpp.VPP_GetBackLight_Switch();
+ }
+}
+
+int CTv::Tv_SetColorTemperature ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type, int is_save )
+{
+ if (mB_hdmiout_fbc) {
+ return Tv_FactorySet_FBC_ColorTemp_Mode(mode);
+ } else {
+ return mVpp.SetColorTemperature((vpp_color_temperature_mode_t)mode, (tv_source_input_type_t)source_type, is_save);
+ }
+}
+
+vpp_color_temperature_mode_t CTv::Tv_GetColorTemperature ( tv_source_input_type_t source_type )
+{
+ if (mB_hdmiout_fbc) {
+ return (vpp_color_temperature_mode_t)Tv_FactoryGet_FBC_ColorTemp_Mode();
+ } else {
+ return mVpp.GetColorTemperature((tv_source_input_type_t)source_type);
+ }
+
+}
+int CTv::Tv_SaveColorTemperature ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type )
+{
+ return mVpp.SaveColorTemp ( mode, source_type );
+}
+
+int CTv::Tv_SetDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save )
+{
+ int ret = 0;
+ if (m_mode_3d == VIDEO_3D_MODE_DISABLE) {
+ ret = SetDisplayMode((vpp_display_mode_t)mode, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt);
+ } else { //3D
+ ret = SetDisplayMode(VPP_DISPLAY_MODE_PERSON, (tv_source_input_type_t)source_type, (tvin_sig_fmt_t)fmt);
+ }
+ if (ret == 0) {
+ if (is_save == 1) {
+ ret = ret | SSMSaveDisplayMode ( source_type, (int)mode );
+ }
+ }
+ return ret;
+}
+
+int CTv::SetDisplayMode ( vpp_display_mode_t display_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt )
+{
+ LOGD("SetDisplayMode, display_mode = %d, source_type = %d fmt = %d tranfmt = %d\n", display_mode, source_type, sig_fmt, mSigDetectThread.getCurSigInfo().trans_fmt);
+
+ tvin_cutwin_t cutwin = mVpp.GetOverscan ( source_type, sig_fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt);
+ LOGD("SetDisplayMode , get crop %d %d %d %d \n", cutwin.vs, cutwin.hs, cutwin.ve, cutwin.he);
+ int video_screen_mode = CAv::VIDEO_WIDEOPTION_16_9;
+ tvin_window_pos_t win_pos;
+ int display_resolution = Vpp_GetDisplayResolutionInfo(&win_pos);
+
+ switch ( display_mode ) {
+ case VPP_DISPLAY_MODE_169:
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_16_9;
+ break;
+ case VPP_DISPLAY_MODE_MODE43:
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_4_3;
+ break;
+ case VPP_DISPLAY_MODE_NORMAL:
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_NORMAL;
+ break;
+ case VPP_DISPLAY_MODE_FULL:
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_NONLINEAR;
+ mVpp.VPP_SetNonLinearFactor ( 20 );
+ //mVpp.VPP_SetNonLinearFactor ( 20 );
+ break;
+ case VPP_DISPLAY_MODE_CROP_FULL:
+ cutwin.vs = 0;
+ cutwin.hs = 0;
+ cutwin.ve = 0;
+ cutwin.he = 0;
+ break;
+ case VPP_DISPLAY_MODE_NOSCALEUP: {
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_NORMAL_NOSCALEUP;
+ break;
+ }
+ case VPP_DISPLAY_MODE_FULL_REAL:
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_16_9; //added for N360 by haifeng.liu
+ break;
+ case VPP_DISPLAY_MODE_PERSON:
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH;
+ cutwin.vs = cutwin.vs + 20;
+ cutwin.ve = cutwin.ve + 20;
+ break;
+ case VPP_DISPLAY_MODE_MOVIE:
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH;
+ cutwin.vs = cutwin.vs + 40;
+ cutwin.ve = cutwin.ve + 40;
+ break;
+ case VPP_DISPLAY_MODE_CAPTION:
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH;
+ cutwin.vs = cutwin.vs + 55;
+ cutwin.ve = cutwin.ve + 55;
+ break;
+ case VPP_DISPLAY_MODE_ZOOM:
+ video_screen_mode = CAv::VIDEO_WIDEOPTION_FULL_STRETCH;
+ cutwin.vs = cutwin.vs + 70;
+ cutwin.ve = cutwin.ve + 70;
+ break;
+ default:
+ break;
+ }
+ if (source_type == SOURCE_TYPE_DTV || source_type == SOURCE_TYPE_MPEG) {
+ cutwin.vs = cutwin.vs + 12;
+ cutwin.ve = cutwin.ve + 12;
+ cutwin.hs = cutwin.hs + 12;
+ cutwin.he = cutwin.he + 12;
+ }
+ if (source_type == SOURCE_TYPE_HDMI) {
+ if ((IsDVISignal()) || (mTvin.GetITContent() == 1)) {
+ cutwin.vs = 0;
+ cutwin.hs = 0;
+ cutwin.ve = 0;
+ cutwin.he = 0;
+ }
+
+ if (display_mode == VPP_DISPLAY_MODE_FULL_REAL) {
+ cutwin.vs = 0;
+ cutwin.hs = 0;
+ cutwin.ve = 0;
+ cutwin.he = 0;
+ }
+ }
+
+ //mAv.setVideoAxis ( win_pos.x1, win_pos.y1, win_pos.x2, win_pos.y2 );
+ mAv.setVideoScreenMode(video_screen_mode);
+ mVpp.VPP_SetVideoCrop(cutwin.vs, cutwin.hs, cutwin.ve, cutwin.he);
+ return 0;
+}
+
+vpp_display_mode_t CTv::Tv_GetDisplayMode ( tv_source_input_type_t source_type )
+{
+ return mVpp.GetDisplayMode((tv_source_input_type_t)source_type);
+}
+
+int CTv::Tv_SaveDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type )
+{
+ return SSMSaveDisplayMode ( source_type, (int)mode );
+}
+
+int CTv::Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type, int is_save )
+{
+ return mVpp.SetNoiseReductionMode((vpp_noise_reduction_mode_t)mode, (tv_source_input_type_t)source_type, mSigDetectThread.getCurSigInfo().fmt, Check2Dor3D(m_mode_3d, mSigDetectThread.getCurSigInfo().trans_fmt ), mSigDetectThread.getCurSigInfo().trans_fmt, is_save);
+}
+
+int CTv::Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type )
+{
+ return mVpp.SaveNoiseReductionMode ( mode, source_type );
+}
+
+int CTv::Tv_Set2k4k_ScalerUp_Mode ( int value )
+{
+ int ret = 0, fmt_hd_sd = 0;
+ int nodeVal = 0;
+ char s[8];
+
+ LOGD("%s, value [%d]\n", __FUNCTION__ , value);
+
+
+ if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_HDMI && CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_AV
+ && CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_TV) {
+ int fd = open("/sys/class/video/frame_height", O_RDONLY);
+ if (fd <= 0) {
+ LOGE("open /sys/class/video/frame_height ERROR!!error = -%s- \n", strerror ( errno ));
+ return -1;
+ }
+ read(fd, s, sizeof(s));
+ close(fd);
+ nodeVal = atoi(s);
+ if (nodeVal < 900) {
+ fmt_hd_sd = 0;
+ } else {
+ fmt_hd_sd = 1;
+ }
+
+ } else if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_HDMI ) {
+ if (isSDFmtInHdmi()) {
+ fmt_hd_sd = 0;
+ } else {
+ fmt_hd_sd = 1;
+ }
+
+ } else if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_AV || CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_TV) {
+ fmt_hd_sd = 0;
+ }
+
+ switch (value) {
+ case 1: // on
+ if (fmt_hd_sd) {
+ ret = Tv_Utils_SetFileAttrStr("/sys/class/video/video_scaler_path_sel", "0");
+ //LOGD("%s, enable, set 0.\n", __FUNCTION__);
+ } else {
+ ret = Tv_Utils_SetFileAttrStr("/sys/class/video/video_scaler_path_sel", "1");
+ }
+ break;
+
+ case 0: // off
+ default:
+ if (fmt_hd_sd) {
+ ret = Tv_Utils_SetFileAttrStr("/sys/class/video/video_scaler_path_sel", "1");
+ //LOGD("%s, disable, set 1.\n", __FUNCTION__);
+ } else {
+ ret = Tv_Utils_SetFileAttrStr("/sys/class/video/video_scaler_path_sel", "0");
+ //LOGD("%s, disable, set 0.\n", __FUNCTION__);
+ }
+ break;
+ }
+
+ return ret;
+}
+
+int CTv::Tv_Get2k4k_ScalerUp_Mode ( void )
+{
+ char attrV[64];
+ int ret = 0, fmt_hd_sd = 0;
+ int nodeVal = 0;
+ char s[8];
+
+ memset (attrV, '\0', 64);
+
+ if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_HDMI && CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_AV
+ && CTvin::Tvin_SourceInputToSourceInputType(m_source_input) != SOURCE_TYPE_TV) {
+ int fd = open("/sys/class/video/frame_height", O_RDONLY);
+ if (fd <= 0) {
+ LOGE("open /sys/class/video/frame_height ERROR!!error = -%s- \n", strerror ( errno ));
+ return -1;
+ }
+ read(fd, s, sizeof(s));
+ close(fd);
+ nodeVal = atoi(s);
+ if (nodeVal < 900) {
+ fmt_hd_sd = 0;
+ } else {
+ fmt_hd_sd = 1;
+ }
+
+ } else if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_HDMI ) {
+ if (isSDFmtInHdmi()) {
+ fmt_hd_sd = 0;
+ } else {
+ fmt_hd_sd = 1;
+ }
+
+ } else if ( CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_AV || CTvin::Tvin_SourceInputToSourceInputType(m_source_input) == SOURCE_TYPE_TV) {
+ fmt_hd_sd = 0;
+ }
+
+ Tv_Utils_GetFileAttrStr("/sys/class/video/video_scaler_path_sel", 64, attrV);
+ //LOGD("%s, 11111111scaler_path_sel[%s].\n", __FUNCTION__ , attrV);
+ if (strncasecmp(attrV, "1", strlen ("1")) == 0) {
+ if (fmt_hd_sd) {
+ ret = 0;
+ } else {
+ ret = 1;
+ }
+ } else if (strncasecmp(attrV, "0", strlen ("0")) == 0) {
+ if (fmt_hd_sd) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ } else {
+
+ ret = -1;
+ }
+
+ return ret;
+}
+
+int CTv::Tv_SetSplitScreenDemoStatus(tv_source_input_type_t source_type, int onoff_status)
+{
+ int ret = 0;
+ LOGD("%s, split screen demo status source[%d],onoff_stauts[%d]\n", __FUNCTION__ , source_type, onoff_status);
+ if (1 == onoff_status) {
+ ret = Tv_Utils_SetFileAttrStr("/sys/class/amlogic/debug", "w 0x503c0 v 0x31d6");//sharpness screen left
+ ret |= Tv_Utils_SetFileAttrStr("/sys/class/amlogic/debug", "w 0x07 v 0x174d");//nr screen left
+ } else if (0 == onoff_status) {
+ ret = Tv_Utils_SetFileAttrStr("/sys/class/amlogic/debug", "w 0x503c0 v 0x31d6");//sharpness screen left
+ ret |= Tv_Utils_SetFileAttrStr("/sys/class/amlogic/debug", "w 0x07 v 0x174d");//nr screen left
+ }
+
+ if (fbcIns != NULL && 0 == ret) {
+ ret |= fbcIns->cfbc_SET_SPLIT_SCREEN_DEMO(COMM_DEV_SERIAL, onoff_status);
+ }
+
+ return ret;
+}
+
+int CTv::Tv_GetSplitScreenDemoStatus(tv_source_input_type_t source_type)
+{
+ return 0;
+}
+
+vpp_noise_reduction_mode_t CTv::Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type )
+{
+ return mVpp.GetNoiseReductionMode((tv_source_input_type_t)source_type);
+}
+
+/**
+ * @parameter mode : 0:sharpness; 1:NR
+ *
+ 1.sharpness分å±ï¼ˆå¯ä»¥æŽ§åˆ¶å®½åº¦ï¼‰
+ 分å±å¤§å° 寄存器范围是0x50000 冿x50780,左效果的范围越æ¥è¶Šå¤§?0x70780 冿x70000也是一样?
+ å·¦å³è°ƒæ¢æŽ§åˆ¶ bit 17. 开僿控制 bit 16. 0-11bit 是控制宽度的。范围是0-0x780?920åƒç´ ?
+ å·¦åšæ•ˆæžœå¤„ç† echo w 0x503c0 v 0x31d6 > /sys/class/amlogic/debug
+ å³åšæ•ˆæžœå¤„ç† echo w 0x703c0 v 0x31d6 > /sys/class/amlogic/debug
+ echo w 0x403c0 v 0x31d6 > /sys/class/amlogic/debug
+
+ 2. NR分å±(ä¸èƒ½æŽ§åˆ¶å®½åº¦)
+ å·¦åšæ•ˆæžœå¤„ç† echo w 0x07 v 0x174d > /sys /class/amlogic/debug
+ å³åšæ•ˆæžœå¤„ç† echo w 0x70 v 0x174d > /sys /class/amlogic/debug
+ 僿 echo w 0x77 v 0x174d > /sys/class/amlogic/debug
+
+ */
+int CTv::Tv_SplitScreenEffect(int mode, int width, int reverse)
+{
+ int ret = -1;
+
+ if (mode == 0) {
+ if (width == 0) {//close
+ ret = mVpp.VPP_SplitScreenEffect(0x403c0, 0x31d6);
+ } else {
+ int val = 0;
+ if (reverse == 0) {//left effect
+ val = width + 0x50000;
+ } else {//right effect
+ val = 0x70780 - width;
+ }
+ ret = mVpp.VPP_SplitScreenEffect(val, 0x31d6);
+ }
+ } else if (mode == 1) {
+ if (width == 0) {//close
+ ret = mVpp.VPP_SplitScreenEffect(0x77, 0x174d);
+ } else {
+ if (reverse == 0)
+ ret = mVpp.VPP_SplitScreenEffect(0x07, 0x174d);
+ else
+ ret = mVpp.VPP_SplitScreenEffect(0x70, 0x174d);
+ }
+ } else if (mode == 2) {
+ if (mB_hdmiout_fbc) {//hava fbc
+
+ } else {//not have fbc
+
+ }
+ }
+
+ return ret;
+}
+
+int CTv::Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness )
+{
+ return mVpp.FactorySetPQMode_Brightness(source_type, pq_mode, brightness);
+}
+
+int CTv::Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode )
+{
+ return mVpp.FactoryGetPQMode_Brightness(source_type, pq_mode);
+}
+
+int CTv::Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast )
+{
+ return mVpp.FactorySetPQMode_Contrast(source_type, pq_mode, contrast);
+}
+
+int CTv::Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode )
+{
+ return mVpp.FactoryGetPQMode_Contrast(source_type, pq_mode);
+}
+
+int CTv::Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation )
+{
+ return mVpp.FactorySetPQMode_Saturation(source_type, pq_mode, saturation);
+}
+
+int CTv::Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode )
+{
+ return mVpp.FactoryGetPQMode_Saturation(source_type, pq_mode);
+}
+
+int CTv::Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue )
+{
+ return mVpp.FactorySetPQMode_Hue(source_type, pq_mode, hue);
+}
+
+int CTv::Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode )
+{
+ return mVpp.FactoryGetPQMode_Hue(source_type, pq_mode);
+}
+
+int CTv::Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness )
+{
+ return mVpp.FactorySetPQMode_Sharpness(source_type, pq_mode, sharpness);
+}
+
+int CTv::Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode )
+{
+ return mVpp.FactoryGetPQMode_Sharpness(source_type, pq_mode);
+}
+
+int CTv::GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params )
+{
+ if (mB_hdmiout_fbc) {
+ int ret = Tv_FactoryGet_FBC_ColorTemp_Batch((vpp_color_temperature_mode_t)Tempmode, params);
+ params->r_gain = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(params->r_gain);
+ params->g_gain = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(params->g_gain);
+ params->b_gain = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(params->b_gain);
+ params->r_post_offset = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(params->r_post_offset);
+ params->g_post_offset = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(params->g_post_offset);
+ params->b_post_offset = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(params->b_post_offset);
+ return ret;
+ } else {
+ return mVpp.GetColorTemperatureParams(Tempmode, params);
+ }
+}
+
+int CTv::Tv_FactorySetTestPattern ( int pattern )
+{
+ switch ( pattern ) {
+ case VPP_TEST_PATTERN_NONE:
+ mAv.SetVideoScreenColor ( 3, 16, 128, 128 );
+ break;
+
+ case VPP_TEST_PATTERN_RED:
+ mAv.SetVideoScreenColor ( 0, 81, 90, 240 );
+ break;
+
+ case VPP_TEST_PATTERN_GREEN:
+ mAv.SetVideoScreenColor ( 0, 145, 54, 34 );
+ break;
+
+ case VPP_TEST_PATTERN_BLUE:
+ mAv.SetVideoScreenColor ( 0, 41, 240, 110 );
+ break;
+
+ case VPP_TEST_PATTERN_WHITE:
+ mAv.SetVideoScreenColor ( 0, 235, 128, 128 );
+ break;
+
+ case VPP_TEST_PATTERN_BLACK:
+ mAv.SetVideoScreenColor ( 0, 16, 128, 128 );
+ break;
+
+ default:
+ return -1;
+ }
+ return SSMSaveTestPattern ( pattern );
+}
+
+int CTv::Tv_FactoryGetTestPattern ( void )
+{
+ return mVpp.FactoryGetTestPattern();
+}
+int CTv::Tv_FactorySetScreenColor ( int vdin_blending_mask, int y, int u, int v )
+{
+ return mAv.SetVideoScreenColor ( vdin_blending_mask, y, u, v );
+}
+int CTv::Tv_FactoryResetPQMode ( void )
+{
+ return mVpp.FactoryResetPQMode();
+}
+
+int CTv::Tv_FactoryResetColorTemp ( void )
+{
+ return mVpp.FactoryResetColorTemp();
+}
+
+int CTv::Tv_FactorySetParamsDefault ( void )
+{
+ return mVpp.FactorySetParamsDefault();
+}
+
+int CTv::Tv_FactorySetDDRSSC ( int step )
+{
+ return mVpp.FactorySetDDRSSC(step);
+}
+
+int CTv::Tv_FactoryGetDDRSSC ( void )
+{
+ return mVpp.FactoryGetDDRSSC();
+}
+
+int CTv::Tv_FactorySetLVDSSSC ( int step )
+{
+ return mVpp.FactorySetLVDSSSC(step);
+}
+
+int CTv::Tv_FactoryGetLVDSSSC ( void )
+{
+ return mVpp.FactoryGetLVDSSSC();
+}
+void CTv::Tv_Spread_Spectrum()
+{
+ int value= 0;
+ value = mVpp.FactoryGetLVDSSSC();
+ mVpp.FactorySetLVDSSSC(value);
+}
+
+int CTv::Tv_FactorySetNolineParams ( int noline_params_type, int source_type, noline_params_t noline_params )
+{
+ return mVpp.FactorySetNolineParams(noline_params_type, source_type, noline_params);
+}
+
+noline_params_t CTv::Tv_FactoryGetNolineParams ( int noline_params_type, int source_type )
+{
+ return mVpp.FactoryGetNolineParams(noline_params_type, source_type);
+}
+
+int CTv::Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t )
+{
+ //tvin_cutwin_t cutwin_t = mVpp.Tv_FactoryGetOverscan(source_type, fmt, status_3d, trans_fmt);
+ mVpp.FactorySetOverscan(source_type, fmt, status_3d, trans_fmt, cutwin_t);
+ //} else {
+#if 0
+ char val_buf[256];
+ memset(val_buf, '\0', 256);
+ LOGD("%s,%d: %d,%d,%d,%d", __FUNCTION__, __LINE__, ( int ) cutwin_t.vs, ( int ) cutwin_t.hs, ( int ) cutwin_t.ve, ( int ) cutwin_t.he);
+ sprintf(val_buf, "%d,%d,%d,%d", ( int ) cutwin_t.vs, ( int ) cutwin_t.hs, ( int ) cutwin_t.ve, ( int ) cutwin_t.he );
+ config_set_str("TV", "vpp.overscan.dtv", val_buf);
+ //}
+#endif
+ return mVpp.VPP_SetVideoCrop ( ( int ) cutwin_t.vs, ( int ) cutwin_t.hs, ( int ) cutwin_t.ve, ( int ) cutwin_t.he );
+}
+
+tvin_cutwin_t CTv::Tv_FactoryGetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt )
+{
+ return mVpp.FactoryGetOverscan(source_type, fmt, Check2Dor3D(m_mode_3d, (tvin_trans_fmt_t)trans_fmt), trans_fmt);
+#if 0
+ else {
+ tvin_cutwin_t cutwin;
+ int ret = 0;
+ char tmp_buf[16];
+ tmp_buf[0] = 0;
+
+ if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 0, tmp_buf)) == 0) {
+ cutwin.vs = strtol(tmp_buf, NULL, 10);
+ }
+ if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 1, tmp_buf)) == 0) {
+ cutwin.hs = strtol(tmp_buf, NULL, 10);
+ }
+ if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 2, tmp_buf)) == 0) {
+ cutwin.ve = strtol(tmp_buf, NULL, 10);
+ }
+ if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 3, tmp_buf)) == 0) {
+ cutwin.he = strtol(tmp_buf, NULL, 10);
+ }
+ LOGD("%s,%d: %d,%d,%d,%d", __FUNCTION__, __LINE__, ( int ) cutwin.vs, ( int ) cutwin.hs, ( int ) cutwin.ve, ( int ) cutwin.he);
+ return cutwin;
+ }
+#endif
+}
+
+int CTv::Tv_ReplacePqDb(const char *newFilePath)
+{
+ return mVpp.getPqData()->replacePqDb(newFilePath);
+}
+
+int CTv::Tv_FactorySet_FBC_Brightness ( int value )
+{
+ //int temp_value = (255*value)/100;
+ int temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Brightness(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Brightness ( void )
+{
+ int temp_value = 0;
+ int data = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Brightness(COMM_DEV_SERIAL, &temp_value);
+ //data = (temp_value*100)/255;
+ data = temp_value;
+
+ return data;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Contrast ( int value )
+{
+ //int temp_value = (255*value)/100;
+ int temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Contrast(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Contrast ( void )
+{
+ int temp_value = 0;
+ int data = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Contrast(COMM_DEV_SERIAL, &temp_value);
+ //data = (temp_value*100)/255;
+ data = temp_value;
+
+ return data;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Saturation ( int value )
+{
+ //int temp_value = (255*value)/100;
+ int temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Saturation(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Saturation ( void )
+{
+ int temp_value = 0;
+ int data = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Saturation(COMM_DEV_SERIAL, &temp_value);
+ //data = (temp_value*100)/255;
+ data = temp_value;
+
+ return data;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_HueColorTint ( int value )
+{
+ //int temp_value = (255*value)/100;
+ int temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_HueColorTint(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_HueColorTint ( void )
+{
+ int temp_value = 0;
+ int data = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_HueColorTint(COMM_DEV_SERIAL, &temp_value);
+ //data = (temp_value*100)/255;
+ data = temp_value;
+
+ return data;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Backlight ( int value )
+{
+ int temp_value = value;
+ if (fbcIns != NULL) {
+ temp_value = temp_value * 255 / 100;
+ fbcIns->cfbc_Set_Backlight(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Backlight ( void )
+{
+ int temp_value = 0;
+ int data = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Backlight(COMM_DEV_SERIAL, &temp_value);
+ if (temp_value * 100 % 255 == 0)
+ temp_value = temp_value * 100 / 255;
+ else
+ temp_value = temp_value * 100 / 255 + 1;
+ data = temp_value;
+
+ return data;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Auto_Backlight_OnOff( unsigned char status)
+{
+ if (fbcIns != NULL) {
+ return fbcIns->cfbc_Set_Auto_Backlight_OnOff(COMM_DEV_SERIAL, status);
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Auto_Backlight_OnOff( void )
+{
+ int temp_status = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Auto_Backlight_OnOff(COMM_DEV_SERIAL, &temp_status);
+ return temp_status;
+ }
+ return 0;
+
+}
+
+
+int CTv::Tv_FactorySet_FBC_ELEC_MODE( int value )
+{
+ int val = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_AUTO_ELEC_MODE(COMM_DEV_SERIAL, value);
+ val = value;
+ SSMSaveFBCELECmodeVal(val);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_ELEC_MODE( void )
+{
+ int val = 0;
+
+ SSMReadFBCELECmodeVal(&val);
+
+ return val;
+}
+
+int CTv::Tv_FactorySet_FBC_BACKLIGHT_N360( int value )
+{
+ int val = 0;
+
+ val = value;
+ SSMSaveFBCELECmodeVal(val);
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_BACKLIGHT_N360( void )
+{
+ int val = 0;
+
+ SSMReadFBCELECmodeVal(&val);
+
+ return val;
+}
+
+int CTv::Tv_FactorySet_FBC_Thermal_State( int value )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Thermal_state(COMM_DEV_SERIAL, value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactorySet_FBC_Picture_Mode ( int mode )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Picture_Mode(COMM_DEV_SERIAL, mode);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Picture_Mode ( void )
+{
+ int mode = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Picture_Mode(COMM_DEV_SERIAL, &mode);
+ return mode;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Set_Test_Pattern ( int mode )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Test_Pattern(COMM_DEV_SERIAL, mode);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Get_Test_Pattern ( void )
+{
+ int mode = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Test_Pattern(COMM_DEV_SERIAL, &mode);
+ return mode;
+ }
+
+ return 0;
+}
+
+
+int CTv::Tv_FactorySet_FBC_Gain_Red( int value )
+{
+ int temp_value = 0;
+
+ //temp_value = (value*255)/2047;
+ //value 0 ~ 2047
+ temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Gain_Red(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Gain_Red ( void )
+{
+ int temp_value = 0, value = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Gain_Red(COMM_DEV_SERIAL, &temp_value);
+ //value 0 ~ 2047
+ //value = (temp_value*2047)/255;
+ value = temp_value;
+
+ return value;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Gain_Green( int value )
+{
+ int temp_value = 0;
+
+ //temp_value = (value*255)/2047;
+ //value 0 ~ 2047
+ temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Gain_Green(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Gain_Green ( void )
+{
+ int temp_value = 0, value = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Gain_Green(COMM_DEV_SERIAL, &temp_value);
+ //value 0 ~ 2047
+ //value = (temp_value*2047)/255;
+ value = temp_value;
+
+ return value;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactoryGet_FBC_VIDEO_MUTE ( void )
+{
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_VMute(COMM_DEV_SERIAL, 1);
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Gain_Blue( int value )
+{
+ int temp_value = 0;
+
+ //temp_value = (value*255)/2047;
+ //value 0 ~ 2047
+ temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Gain_Blue(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Gain_Blue ( void )
+{
+ int temp_value = 0, value = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Gain_Blue(COMM_DEV_SERIAL, &temp_value);
+ //value 0 ~ 2047
+ //value = (temp_value*2047)/255;
+ value = temp_value;
+
+ return value;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Offset_Red( int value )
+{
+ //value -1024~+1023
+ int temp_value = 0;
+
+ //temp_value = (value+1024)*255/2047;
+ temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Offset_Red(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Offset_Red ( void )
+{
+ int temp_value = 0, value = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Offset_Red(COMM_DEV_SERIAL, &temp_value);
+ //value -1024~+1023
+ //value = (temp_value*2047)/255 - 1024;
+ value = temp_value;
+
+ return value;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Offset_Green( int value )
+{
+ //value -1024~+1023
+ int temp_value = 0;
+
+ //temp_value = (value+1024)*255/2047;
+ temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Offset_Green(COMM_DEV_SERIAL, temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Offset_Green ( void )
+{
+ int temp_value = 0, value = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Offset_Green(COMM_DEV_SERIAL, &temp_value);
+ //value -1024~+1023
+ //value = (temp_value*2047)/255 - 1024;
+ value = temp_value;
+
+ return value;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Offset_Blue( int value )
+{
+ //value -1024~+1023
+ int temp_value = 0;
+
+ //temp_value = (value+1024)*255/2047;
+ temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Offset_Blue(COMM_DEV_SERIAL, value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Offset_Blue ( void )
+{
+ int temp_value = 0, value = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Offset_Blue(COMM_DEV_SERIAL, &temp_value);
+ //value -1024~+1023
+ //value = (temp_value*2047)/255 - 1024;
+ value = temp_value;
+
+ return value;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactoryGetWhiteBalanceRedGain(int source_type, int colortemp_mode)
+{
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ LOGD("--------- call none fbc method ---------");
+ ret = mVpp.FactoryGetColorTemp_Rgain(source_type, colortemp_mode);
+ } else { //use fbc store the white balance params
+ LOGD("--------- call fbc method ---------");
+ ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 0);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryGetWhiteBalanceGreenGain(int source_type, int colortemp_mode)
+{
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactoryGetColorTemp_Ggain(source_type, colortemp_mode);
+ } else { //use fbc store the white balance params
+ ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 1);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryGetWhiteBalanceBlueGain(int source_type, int colortemp_mode)
+{
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactoryGetColorTemp_Bgain(source_type, colortemp_mode);
+ } else { //use fbc store the white balance params
+ ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 2);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryGetWhiteBalanceRedOffset(int source_type, int colortemp_mode)
+{
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactoryGetColorTemp_Roffset(source_type, colortemp_mode);
+ } else { //use fbc store the white balance params
+ ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 3);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryGetWhiteBalanceGreenOffset(int source_type, int colortemp_mode)
+{
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactoryGetColorTemp_Goffset(source_type, colortemp_mode);
+ } else { //use fbc store the white balance params
+ ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 4);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryGetWhiteBalanceBlueOffset(int source_type, int colortemp_mode)
+{
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactoryGetColorTemp_Boffset(source_type, colortemp_mode);
+ } else { //use fbc store the white balance params
+ ret = Tv_FactoryGetItemFromBatch((vpp_color_temperature_mode_t)colortemp_mode, 5);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactorySetWhiteBalanceRedGain(int source_type, int colortemp_mode, int value)
+{
+ int ret = -1;
+ if (value < 0) {
+ value = 0;
+ } else if (value > 2047) {
+ value = 2047;
+ }
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactorySetColorTemp_Rgain(source_type, colortemp_mode, value);
+ if (ret != -1) {
+ LOGD("save the red gain to flash")
+ ret = mVpp.FactorySaveColorTemp_Rgain(source_type, colortemp_mode, value);
+ }
+ } else { //use fbc store the white balance params
+ value = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(value);
+ ret = Tv_FactorySet_FBC_Gain_Red(value);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactorySetWhiteBalanceGreenGain(int source_type, int colortemp_mode, int value)
+{
+ int ret = -1;
+ if (value < 0) {
+ value = 0;
+ } else if (value > 2047) {
+ value = 2047;
+ }
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactorySetColorTemp_Ggain(source_type, colortemp_mode, value);
+ if (ret != -1) {
+ LOGD("save the green gain to flash")
+ ret = mVpp.FactorySaveColorTemp_Ggain(source_type, colortemp_mode, value);
+ }
+ } else { //use fbc store the white balance params
+ value = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(value);
+ ret = Tv_FactorySet_FBC_Gain_Green(value);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactorySetWhiteBalanceBlueGain(int source_type, int colortemp_mode, int value)
+{
+ int ret = -1;
+ if (value < 0) {
+ value = 0;
+ } else if (value > 2047) {
+ value = 2047;
+ }
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactorySetColorTemp_Bgain(source_type, colortemp_mode, value);
+ if (ret != -1) {
+ LOGD("save the blue gain to flash")
+ ret = mVpp.FactorySaveColorTemp_Bgain(source_type, colortemp_mode, value);
+ }
+ } else { //use fbc store the white balance params
+ value = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(value);
+ ret = Tv_FactorySet_FBC_Gain_Blue(value);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactorySetWhiteBalanceRedOffset(int source_type, int colortemp_mode, int value)
+{
+ int ret = -1;
+ if (value < -1024) {
+ value = -1024;
+ } else if (value > 1023) {
+ value = 1023;
+ }
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactorySetColorTemp_Roffset(source_type, colortemp_mode, value);
+ if (ret != -1) {
+ LOGD("save the red offset to flash")
+ ret = mVpp.FactorySaveColorTemp_Roffset(source_type, colortemp_mode, value);
+ }
+ } else { //use fbc store the white balance params
+ value = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(value);
+ ret = Tv_FactorySet_FBC_Offset_Red(value);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactorySetWhiteBalanceGreenOffset(int source_type, int colortemp_mode, int value)
+{
+ int ret = -1;
+ if (value < -1024) {
+ value = -1024;
+ } else if (value > 1023) {
+ value = 1023;
+ }
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactorySetColorTemp_Goffset(source_type, colortemp_mode, value);
+ if (ret != -1) {
+ LOGD("save the green offset to flash")
+ ret = mVpp.FactorySaveColorTemp_Goffset(source_type, colortemp_mode, value);
+ }
+ } else { //use fbc store the white balance params
+ value = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(value);
+ ret = Tv_FactorySet_FBC_Offset_Green(value);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactorySetWhiteBalanceBlueOffset(int source_type, int colortemp_mode, int value)
+{
+ int ret = -1;
+ if (value < -1024) {
+ value = -1024;
+ } else if (value > 1023) {
+ value = 1023;
+ }
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.FactorySetColorTemp_Boffset(source_type, colortemp_mode, value);
+ if (ret != -1) {
+ LOGD("save the blue offset to flash")
+ ret = mVpp.FactorySaveColorTemp_Boffset(source_type, colortemp_mode, value);
+ }
+ } else { //use fbc store the white balance params
+ value = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(value);
+ ret = Tv_FactorySet_FBC_Offset_Blue(value);
+ }
+ return ret;
+}
+
+
+int CTv::Tv_FactorySetWhiteBalanceColorTempMode(int source_type, int colortemp_mode, int is_save)
+{
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.SetColorTemperature((vpp_color_temperature_mode_t)colortemp_mode, (tv_source_input_type_t)source_type, is_save);
+ } else { //use fbc store the white balance params
+ ret = Tv_FactorySet_FBC_ColorTemp_Mode(colortemp_mode);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryGetWhiteBalanceColorTempMode(int source_type )
+{
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.GetColorTemperature((tv_source_input_type_t)source_type);
+ } else { //use fbc store the white balance params
+ ret = Tv_FactoryGet_FBC_ColorTemp_Mode();
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryWhiteBalanceFormatInputFbcGainParams(int value)
+{
+ int ret = 1024;
+ if (value < 0) {
+ ret = 0;
+ } else if (value > 2047) {
+ ret = 2047;
+ } else {
+ ret = value;
+ }
+ ret = ret >> 3;
+ return ret;
+}
+
+int CTv::Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(int value)
+{
+ int ret = 0;
+ if (value < -1024) {
+ ret = -1024;
+ } else if (value > 1023) {
+ ret = 1023;
+ } else {
+ ret = value;
+ }
+ ret += 1024;
+ ret = ret >> 3;
+ return ret;
+}
+
+int CTv::Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(int value)
+{
+ if (value == 255) {
+ value = 1023;
+ } else {
+ value = value << 3;
+ value -= 1024;
+ }
+ return value;
+}
+
+int CTv::Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(int value)
+{
+ value = value << 3;
+ if (value < 0) {
+ value = 0;
+ } else if (value > 2047) {
+ value = 2047;
+ }
+ return value;
+}
+
+
+int CTv::Tv_FactorySaveWhiteBalancePramas(int source_type, int tempmode, int r_gain, int g_gain, int b_gain, int r_offset, int g_offset, int b_offset)
+{
+ int ret = 0;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ mVpp.SaveColorTemp((vpp_color_temperature_mode_t) tempmode, (tv_source_input_type_t) source_type);
+ mVpp.FactorySaveColorTemp_Rgain(source_type, tempmode, r_gain);
+ mVpp.FactorySaveColorTemp_Ggain(source_type, tempmode, g_gain);
+ mVpp.FactorySaveColorTemp_Bgain(source_type, tempmode, b_gain);
+ mVpp.FactorySaveColorTemp_Roffset(source_type, tempmode, r_offset);
+ mVpp.FactorySaveColorTemp_Goffset(source_type, tempmode, g_offset);
+ mVpp.FactorySaveColorTemp_Boffset(source_type, tempmode, b_offset);
+ } else { //use fbc store the white balance params
+ tcon_rgb_ogo_t params;
+
+ params.r_gain = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(r_gain);
+ params.g_gain = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(g_gain);
+ params.b_gain = Tv_FactoryWhiteBalanceFormatInputFbcGainParams(b_gain);
+ params.r_post_offset = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(r_offset);
+ params.g_post_offset = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(g_offset);
+ params.b_post_offset = Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(b_offset);
+ ret = Tv_FactorySet_FBC_ColorTemp_Batch((vpp_color_temperature_mode_t)tempmode, params);
+ }
+ return ret;
+}
+
+
+
+
+
+/**
+* The color temperature enum order is diffrent bettewn G9 and Fbc, so we have to make a mapping
+**/
+int CTv::Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(int Tempmode)
+{
+ int ret = Tempmode;
+ switch (Tempmode) {
+ case 0: //standard
+ ret = 1;
+ break;
+ case 1: //warm
+ ret = 2;
+ break;
+ case 2: //cold
+ ret = 0;
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
+
+/**
+* The color temperature enum order is diffrent bettewn G9 and Fbc, so we have to make a mapping
+**/
+int CTv::Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(int Tempmode)
+{
+ int ret = Tempmode;
+ switch (Tempmode) {
+ case 0: //cold
+ ret = 2;
+ break;
+ case 1: //standard
+ ret = 0;
+ break;
+ case 2: //warm
+ ret = 1;
+ break;
+ default:
+ break;
+ }
+ return ret;
+}
+
+int CTv::Tv_SetTestPattern(int value)
+{
+ int ret = -1;
+ if (fbcIns != NULL) {
+ LOGD("%s, value is %d\n", __FUNCTION__, value);
+ ret = fbcIns->cfbc_TestPattern_Select(COMM_DEV_SERIAL, value);
+ }
+
+ return ret;
+}
+
+int CTv::Tv_FactoryCloseWhiteBalanceGrayPattern()
+{
+ int useFbc = 0;
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = mVpp.VPP_SetGrayPattern(0);
+ } else { //use fbc store the white balance params
+ ret = Tv_FactoryClose_FBC_GrayPattern();
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryOpenWhiteBalanceGrayPattern()
+{
+ int useFbc = 0;
+ int ret = -1;
+ if (!mB_hdmiout_fbc) { // not use fbc store the white balance params
+ ret = 0;
+ } else { //use fbc store the white balance params
+ ret = Tv_FactoryOpen_FBC_GrayPattern();
+ }
+ return ret;
+}
+
+int CTv::Tv_FactorySetWhiteBalanceGrayPattern(int value)
+{
+ int useFbc = 0;
+ int ret = -1;
+ if (!mB_hdmiout_fbc) {
+ ret = mVpp.VPP_SetGrayPattern(value);
+ } else {
+ ret = Tv_FactorySet_FBC_GrayPattern(value);
+ }
+ return ret;
+}
+
+int CTv:: Tv_FactoryGetWhiteBalanceGrayPattern()
+{
+ int useFbc = 0;
+ int ret = -1;
+ if (!mB_hdmiout_fbc) {
+ ret = mVpp.VPP_GetGrayPattern();
+ } else {
+
+ }
+ return ret;
+}
+
+int CTv::Tv_FactorySet_FBC_GrayPattern(int value)
+{
+ int ret = -1;
+ unsigned char grayValue = 0;
+ if (value > 255) {
+ grayValue = 255;
+ } else if (value < 0) {
+ grayValue = 0;
+ } else {
+ grayValue = (unsigned char)(0xFF & value);
+ }
+ if (fbcIns != NULL) {
+ ret = fbcIns->cfbc_WhiteBalance_SetGrayPattern(COMM_DEV_SERIAL, grayValue);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryOpen_FBC_GrayPattern()
+{
+ int ret = -1;
+ if (fbcIns != NULL) {
+ ret = fbcIns->cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_SERIAL, 0);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactoryClose_FBC_GrayPattern()
+{
+ int ret = -1;
+ if (fbcIns != NULL) {
+ ret = fbcIns->cfbc_WhiteBalance_GrayPattern_OnOff(COMM_DEV_SERIAL, 1);
+ }
+ return ret;
+}
+
+int CTv::Tv_FactorySet_FBC_ColorTemp_Mode( int mode )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_ColorTemp_Mode(COMM_DEV_SERIAL, mode);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_ColorTemp_Mode ( void )
+{
+ int temp_mode = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_ColorTemp_Mode(COMM_DEV_SERIAL, &temp_mode);
+ return temp_mode;
+ }
+
+ return -1;
+}
+int CTv::Tv_FactorySet_FBC_ColorTemp_Mode_N360( int mode )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_ColorTemp_Mode(COMM_DEV_SERIAL, mode);
+ SSMSaveFBCN360ColorTempVal(mode);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_ColorTemp_Mode_N360 ( void )
+{
+ int temp_mode = 0;
+
+ SSMReadFBCN360ColorTempVal(&temp_mode);
+
+ return temp_mode;
+}
+
+int CTv::Tv_FactorySet_FBC_LockN_state(int value)
+{
+ int val = 0;
+ LOGE ( "%s, Tv_FactorySet_FBC_LockN_state %d!!!\n", "TV" , value);
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_LockN_state(COMM_DEV_SERIAL, value);
+ return 0;
+ };
+ return -1;
+}
+
+int CTv::Tv_FactorySet_FBC_WB_Initial( int status )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_WB_Initial(COMM_DEV_SERIAL, status);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_WB_Initial ( void )
+{
+ int temp_status = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_WB_Initial(COMM_DEV_SERIAL, &temp_status);
+ return temp_status;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_ColorTemp_Batch(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params)
+{
+ unsigned char mode = 0, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset;
+ switch (Tempmode) {
+ case VPP_COLOR_TEMPERATURE_MODE_STANDARD:
+ mode = 1; //COLOR_TEMP_STD
+ break;
+ case VPP_COLOR_TEMPERATURE_MODE_WARM:
+ mode = 2; //COLOR_TEMP_WARM
+ break;
+ case VPP_COLOR_TEMPERATURE_MODE_COLD:
+ mode = 0; //COLOR_TEMP_COLD
+ break;
+ case VPP_COLOR_TEMPERATURE_MODE_USER:
+ mode = 3; //COLOR_TEMP_USER
+ break;
+ }
+ r_gain = (params.r_gain * 255) / 2047; // u1.10, range 0~2047, default is 1024 (1.0x)
+ g_gain = (params.g_gain * 255) / 2047;
+ b_gain = (params.b_gain * 255) / 2047;
+ r_offset = (params.r_post_offset + 1024) * 255 / 2047; // s11.0, range -1024~+1023, default is 0
+ g_offset = (params.g_post_offset + 1024) * 255 / 2047;
+ b_offset = (params.b_post_offset + 1024) * 255 / 2047;
+ LOGD ( "~Tv_FactorySet_FBC_ColorTemp_Batch##%d,%d,%d,%d,%d,%d,##", r_gain, g_gain, b_gain, r_offset, g_offset, b_offset );
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_WB_Batch(COMM_DEV_SERIAL, mode, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_ColorTemp_Batch ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params )
+{
+ unsigned char mode = 0, r_gain, g_gain, b_gain, r_offset, g_offset, b_offset;
+ switch (Tempmode) {
+ case VPP_COLOR_TEMPERATURE_MODE_STANDARD:
+ mode = 1; //COLOR_TEMP_STD
+ break;
+ case VPP_COLOR_TEMPERATURE_MODE_WARM:
+ mode = 2; //COLOR_TEMP_WARM
+ break;
+ case VPP_COLOR_TEMPERATURE_MODE_COLD:
+ mode = 0; //COLOR_TEMP_COLD
+ break;
+ case VPP_COLOR_TEMPERATURE_MODE_USER:
+ mode = 3; //COLOR_TEMP_USER
+ break;
+ }
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_WB_Batch(COMM_DEV_SERIAL, mode, &r_gain, &g_gain, &b_gain, &r_offset, &g_offset, &b_offset);
+ LOGD ( "~Tv_FactoryGet_FBC_ColorTemp_Batch##%d,%d,%d,%d,%d,%d,##", r_gain, g_gain, b_gain, r_offset, g_offset, b_offset );
+
+ params->r_gain = (r_gain * 2047) / 255;
+ params->g_gain = (g_gain * 2047) / 255;
+ params->b_gain = (b_gain * 2047) / 255;
+ params->r_post_offset = (r_offset * 2047) / 255 - 1024;
+ params->g_post_offset = (g_offset * 2047) / 255 - 1024;
+ params->b_post_offset = (b_offset * 2047) / 255 - 1024;
+
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactorySet_WB_G9_To_FBC( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params )
+{
+ Tv_FactorySet_FBC_ColorTemp_Batch(Tempmode, params);
+
+ return 0;
+}
+
+int CTv::Tv_FactoryGet_WB_G9_To_FBC ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params )
+{
+ int temp_status = 0;
+
+ Tv_FactoryGet_FBC_ColorTemp_Batch(Tempmode, params);
+
+ return temp_status;
+}
+
+int CTv::Tv_FactoryGetItemFromBatch(vpp_color_temperature_mode_t colortemp_mode, int item)
+{
+ tcon_rgb_ogo_t params;
+ int ret = 0;
+
+ Tv_FactoryGet_FBC_ColorTemp_Batch((vpp_color_temperature_mode_t)colortemp_mode, &params);
+ switch (item) {
+ case 0:
+ ret = params.r_gain;
+ ret = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(ret);
+ break;
+ case 1:
+ ret = params.g_gain;
+ ret = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(ret);
+ break;
+ case 2:
+ ret = params.b_gain;
+ ret = Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(ret);
+ break;
+ case 3:
+ ret = params.r_post_offset;
+ ret = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(ret);
+ break;
+ case 4:
+ ret = params.g_post_offset;
+ ret = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(ret);
+ break;
+ case 5:
+ ret = params.b_post_offset;
+ ret = Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(ret);
+ break;
+ default:
+ ret = 0;
+ }
+ return ret;
+
+}
+
+
+int CTv::Tv_FactorySet_FBC_CM_OnOff( unsigned char status )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_CM(COMM_DEV_SERIAL, status);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_CM_OnOff (void)
+{
+ int temp_status = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_CM(COMM_DEV_SERIAL, &temp_status);
+ return temp_status;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_DNLP_OnOff( unsigned char status )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_DNLP(COMM_DEV_SERIAL, status);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_DNLP_OnOff (void)
+{
+ int temp_status = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_DNLP(COMM_DEV_SERIAL, &temp_status);
+ return temp_status;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_Gamma_OnOff( unsigned char status )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Gamma(COMM_DEV_SERIAL, status);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Gamma_OnOff (void)
+{
+ int temp_status = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Gamma(COMM_DEV_SERIAL, &temp_status);
+ return temp_status;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_WhiteBalance_OnOff( unsigned char status )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_WhiteBalance_OnOff(COMM_DEV_SERIAL, status);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_WhiteBalance_OnOff (void)
+{
+ int temp_status = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_WhiteBalance_OnOff(COMM_DEV_SERIAL, &temp_status);
+ return temp_status;
+ }
+
+ return 0;
+}
+
+
+int CTv::Tv_FactorySet_FBC_backlight_onoff ( int value )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_backlight_onoff(COMM_DEV_SERIAL, value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_backlight_onoff ( void )
+{
+ int temp_value = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_backlight_onoff(COMM_DEV_SERIAL, &temp_value);
+ return temp_value;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_LVDS_SSG_Set( int value )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_LVDS_SSG_Set(COMM_DEV_SERIAL, value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactorySet_FBC_LightSensor_Status_N310 ( int value )
+{
+ int temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_LightSensor_N310(COMM_DEV_SERIAL, temp_value);
+ SSMSaveFBCN310LightsensorVal(temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_LightSensor_Status_N310 ( void )
+{
+ int temp_value = 0;
+ int data = 0;
+
+ if (fbcIns != NULL) {
+
+ SSMReadFBCN310LightsensorVal(&temp_value);
+ data = temp_value;
+
+ return data;
+ }
+
+ return 0;
+}
+int CTv::Tv_FactorySet_FBC_Dream_Panel_Status_N310 ( int value )
+{
+ int temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Dream_Panel_N310(COMM_DEV_SERIAL, temp_value);
+ SSMSaveFBCN310Dream_PanelVal(temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Dream_Panel_Status_N310 ( void )
+{
+ int temp_value = 0;
+ int data = 0;
+
+ if (fbcIns != NULL) {
+
+ SSMReadFBCN310Dream_PanelVal(&temp_value);
+ data = temp_value;
+
+ return data;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_FBC_MULT_PQ_Status_N310 ( int value )
+{
+ int temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_MULT_PQ_N310(COMM_DEV_SERIAL, temp_value);
+ SSMSaveFBCN310MULT_PQVal(temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_MULT_PQ_Status_N310 ( void )
+{
+ int temp_value = 0;
+ int data = 0;
+
+ if (fbcIns != NULL) {
+
+ SSMReadFBCN310MULT_PQVal(&temp_value);
+ data = temp_value;
+
+ return data;
+ }
+
+ return 0;
+}
+int CTv::Tv_FactorySet_FBC_MEMC_Status_N310 ( int value )
+{
+ int temp_value = value;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_MEMC_N310(COMM_DEV_SERIAL, temp_value);
+ SSMSaveFBCN310MEMCVal(temp_value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_MEMC_Status_N310 ( void )
+{
+ int temp_value = 0;
+ int data = 0;
+
+ if (fbcIns != NULL) {
+
+ SSMReadFBCN310MEMCVal(&temp_value);
+ data = temp_value;
+
+ return data;
+ }
+
+ return -1;
+}
+int CTv::Tv_FactorySet_FBC_ColorTemp_Mode_N310( int mode )
+{
+ //int colorTemp = 0;
+ if (fbcIns != NULL) {
+ //colorTemp = Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(mode);
+ fbcIns->cfbc_Set_ColorTemp_Mode(COMM_DEV_SERIAL, mode);
+ SSMSaveFBCN310ColorTempVal(mode);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_ColorTemp_Mode_N310 ( void )
+{
+
+ int mode = 0;
+
+ if (fbcIns != NULL) {
+ SSMReadFBCN310ColorTempVal(&mode);
+ //mode = Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(temp_mode);
+
+ return mode;
+ }
+ return -1;
+}
+
+int CTv::Tv_FactorySet_FBC_Backlight_N310 ( int value )
+{
+ int val = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Backlight(COMM_DEV_SERIAL, value);
+ val = value;
+ SSMSaveFBCN310BackLightVal(val);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Backlight_N310 ( void )
+{
+ int val = 0;
+
+ if (fbcIns != NULL) {
+ SSMReadFBCN310BackLightVal(&val);
+
+ return val;
+ }
+
+ return -1;
+
+}
+
+int CTv::Tv_FactorySet_FBC_Bluetooth_IIS_N310 ( int value )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Bluetooth_IIS_onoff(COMM_DEV_SERIAL, value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_Bluetooth_IIS_N310 ( void )
+{
+ int temp_value = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_Bluetooth_IIS_onoff(COMM_DEV_SERIAL, &temp_value);
+ return temp_value;
+ }
+
+ return 0;
+}
+int CTv::Tv_FactorySet_FBC_Led_N310 ( int val_1, int val_2, int val_3 )
+{
+ int val = 0;
+
+ if (fbcIns != NULL) {
+ val = fbcIns->cfbc_Set_Led_onoff(COMM_DEV_SERIAL, val_1, val_2, val_3);
+ return val;
+ }
+
+ return -1;
+}
+int CTv::Tv_FactorySet_VbyOne_Spread_Spectrum_N311 ( int value )
+{
+ if (fbcIns != NULL) {
+ return -1;
+ } else {
+ LOGD("%s, Set spectrum for T868 V-by-one....%d....\n", __FUNCTION__ , value);
+ SSMSaveN311_VbyOne_Spread_Spectrum_Val(value);
+
+ switch (value) {
+ case 0:
+ //SetFileAttrValue ( "/sys/class/amlogic/debug" ,"w 0x135c5091 c 0x10ca");
+ //SetFileAttrValue ( "/sys/class/amlogic/debug" ,"w 0x801da72c c 0x10cb");
+ break;
+ case 1:
+ SetFileAttrValue ( "/sys/class/amlogic/debug" , "w 0x1ba05091 c 0x10ca");
+ SetFileAttrValue ( "/sys/class/amlogic/debug" , "w 0x80bda72c c 0x10cb");
+ break;
+ default:
+ LOGD("%s, Set spectrum for T868 V-by-one....%d....\n", __FUNCTION__ , value);
+ break;
+ }
+
+ return 0;
+ }
+
+}
+
+int CTv::Tv_FactoryGet_VbyOne_Spread_Spectrum_N311 ( void )
+{
+ int val = 0;
+ if (fbcIns != NULL) {
+ return -1;
+ } else {
+ SSMReadN311_VbyOne_Spread_Spectrum_Val(&val);
+
+ return val;
+ }
+
+}
+int CTv::Tv_FactorySet_FBC_AP_STANDBY_N310 ( int value )
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_AP_STANDBY_N310(COMM_DEV_SERIAL, value);
+ return 0;
+ }
+
+ return -1;
+}
+
+int CTv::Tv_FactoryGet_FBC_AP_STANDBY_N310( void )
+{
+ int temp_value = 0;
+
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Get_AP_STANDBY_N310(COMM_DEV_SERIAL, &temp_value);
+ return temp_value;
+ }
+
+ return 0;
+}
+
+int CTv::Tv_FactorySet_Uboot_Stage(int value)
+{
+ if (fbcIns != NULL) {
+ fbcIns->cfbc_Set_Fbc_Uboot_Stage(COMM_DEV_SERIAL, value);
+ return 0;
+ }
+
+ return -1;
+}
+
+//audio
+void CTv::TvAudioOpen()
+{
+ SetAudioAVOutMute(CC_AUDIO_UNMUTE);
+ SetAudioSPDIFMute(CC_AUDIO_UNMUTE);
+ project_info_t tmp_info;
+ if (GetProjectInfo(&tmp_info) == 0) {
+ strncpy(mMainVolLutTableExtraName, tmp_info.amp_curve_name, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ }
+ openTvAudio();
+}
+
+void CTv::AudioCtlUninit()
+{
+ int oldMuteStatus;
+
+ oldMuteStatus = GetAudioMuteForTv();
+ SetAudioMuteForTv(CC_AUDIO_MUTE);
+
+ //AudioCtlUninit();
+ AudioSetAudioInSource (CC_AUDIO_IN_SOURCE_HDMI);
+ SetDAC_Digital_PlayBack_Volume(255);
+ AudioSetAudioSourceType (AUDIO_MPEG_SOURCE);
+ UnInitTvAudio();
+ SetAudioVolumeCompensationVal(0);
+ SetAudioMasterVolume(GetAudioMasterVolume());
+ UnInitSetTvAudioCard();
+
+ SetAudioMuteForTv(oldMuteStatus);
+}
+
+char *CTv::GetMainVolLutTableExtraName()
+{
+ return mMainVolLutTableExtraName;
+}
+//audio
+int CTv::SetAudioMuteForSystem(int muteOrUnmute)
+{
+ int ret = 0;
+ LOGD("SetAudioMuteForSystem sysMuteStats=%d, tvMuteStatus=%d, toMute=%d", mAudioMuteStatusForSystem, mAudioMuteStatusForTv, muteOrUnmute);
+ mAudioMuteStatusForSystem = muteOrUnmute;
+ ret |= SetDacMute(mAudioMuteStatusForSystem, CC_DAC_MUTE_TYPE_EXTERNAL);
+ ret |= SetAudioI2sMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv);
+ return ret;
+}
+
+int CTv::GetAudioMuteForSystem()
+{
+ return mAudioMuteStatusForSystem;
+}
+
+int CTv::SetAudioMuteForTv(int muteOrUnmute)
+{
+ int ret = 0;
+ mAudioMuteStatusForTv = muteOrUnmute;
+ LOGD("SetAudioMuteForTv sysMuteStats=%d, tvMuteStatus=%d, toMute=%d", mAudioMuteStatusForSystem, mAudioMuteStatusForTv, muteOrUnmute);
+ ret |= SetDacMute(mAudioMuteStatusForSystem | mAudioMuteStatusForTv, CC_DAC_MUTE_TYPE_EXTERNAL | CC_DAC_MUTE_TYPE_INTERNAL);
+ ret |= SetAudioI2sMute(mAudioMuteStatusForTv);
+ return ret;
+}
+
+int CTv::GetAudioMuteForTv()
+{
+ return mAudioMuteStatusForTv;
+}
+
+int CTv::GetDbxTvMode(int *mode, int *son_value, int *vol_value, int *sur_value)
+{
+ *mode = 0;
+ return SSMReadAudioDbxTvValue(son_value, vol_value, sur_value);
+}
+
+int CTv::SetAudioSPDIFSwitch(int tmp_val)
+{
+ int muteStatus = CC_AUDIO_UNMUTE;
+
+ SaveCurAudioSPDIFSwitch(tmp_val);
+
+ if (tmp_val == CC_SWITCH_OFF /*|| mAudioMuteStatusForSystem == CC_AUDIO_MUTE || mAudioMuteStatusForTv == CC_AUDIO_MUTE*/) {
+ muteStatus = CC_AUDIO_MUTE;
+ } else {
+ muteStatus = CC_AUDIO_UNMUTE;
+ }
+
+ SetAudioSPDIFMute(muteStatus);
+ return 0;
+}
+
+int CTv::AudioHandleHeadsetPlugIn()
+{
+ return 0;
+}
+
+int CTv::AudioHandleHeadsetPullOut()
+{
+ return 0;
+}
+
+int CTv::Tv_SetDRC_OnOff(int on_off)
+{
+ return 0;
+}
+int CTv::Tv_GetDRC_OnOff(void)
+{
+ return 0;
+}
+
+void CTv::updateSubtitle(int pic_width, int pic_height)
+{
+ TvEvent::SubtitleEvent ev;
+ ev.pic_width = pic_width;
+ ev.pic_height = pic_height;
+ sendTvEvent(ev);
+}
+
+int CTv::setSubtitleBuffer(char *share_mem)
+{
+ mSubtitle.setBuffer(share_mem);
+ return 0;
+}
+
+int CTv::initSubtitle(int bitmapWidth, int bitmapHeight)
+{
+ return mSubtitle.sub_init(bitmapWidth, bitmapHeight);
+}
+
+int CTv::lockSubtitle()
+{
+ return mSubtitle.sub_lock();
+}
+
+int CTv::unlockSubtitle()
+{
+ return mSubtitle.sub_unlock();
+}
+
+int CTv::getSubSwitchStatus()
+{
+ return mSubtitle.sub_switch_status();
+}
+
+int CTv::startSubtitle(int dmx_id, int pid, int page_id, int anc_page_id)
+{
+ return mSubtitle.sub_start_dvb_sub(dmx_id, pid, page_id, anc_page_id);
+}
+
+int CTv::stopSubtitle()
+{
+ return mSubtitle.sub_stop_dvb_sub();
+}
+
+//--------------------------------------------------
+
+
+//Audio Mute
+int CTv::SetAudioI2sMute(int muteStatus)
+{
+ int vol = 256;
+ if (muteStatus == CC_AUDIO_MUTE) {
+ vol = 0;
+ } else {
+ vol = 256;
+ }
+ CFile::setFileAttrValue("/sys/class/amaudio2/aml_direct_right_gain", vol);
+ CFile::setFileAttrValue("/sys/class/amaudio2/aml_direct_left_gain", vol);
+ return 0;
+}
+
+int CTv::SetDacMute(int muteStatus, int mute_type)
+{
+ int tmp_ret = 0;
+ if (mute_type & CC_DAC_MUTE_TYPE_INTERNAL) {
+ tmp_ret |= mAudioAlsa.SetInternalDacMute(muteStatus);
+ }
+
+ if (mute_type & CC_DAC_MUTE_TYPE_EXTERNAL) {
+ int tmp_ret = 0, set_val = 0;
+ int aud_arch_type = GetAudioArchitectureTypeCFG();
+
+ if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_ON_BOARD) {
+ if (muteStatus == CC_AUDIO_MUTE) {
+ set_val = CC_MUTE_ON;
+ } else if (muteStatus == CC_AUDIO_UNMUTE) {
+ set_val = CC_MUTE_OFF;
+ } else {
+ return -1;
+ }
+
+ mAudioAlsa.SetExternalDacChannelSwitch(1, set_val);
+ mAudioAlsa.SetExternalDacChannelSwitch(2, set_val);
+ //showboz: can disable it
+ mAudioAlsa.SetExternalDacChannelSwitch(3, set_val);
+
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_OFF_BOARD_FBC) {
+ SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_MUTE, muteStatus);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_CUSTOMER_LIB) {
+ mCustomerCtrl.SetMute((muteStatus == CC_AUDIO_MUTE) ? CAudioCustomerCtrl::MUTE : CAudioCustomerCtrl::UNMUTE);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_DIGITAL) {
+ mAudioAlsa.SetDigitalMute(muteStatus);
+ }
+ mAudioAlsa.setAudioPcmPlaybackMute(muteStatus);
+ }
+ return tmp_ret;
+}
+
+int CTv::SetAudioAVOutMute(int muteStatus)
+{
+ SSMSaveAudioAVOutMuteVal(muteStatus);
+ return mAudioAlsa.SetInternalDacMute(muteStatus);
+}
+
+int CTv::GetAudioAVOutMute()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioAVOutMuteVal(&tmp_ch);
+ return tmp_ch;
+}
+
+int CTv::SetAudioSPDIFMute(int muteStatus)
+{
+ if (GetCurAudioSPDIFSwitch() == CC_SWITCH_OFF) {
+ muteStatus = CC_AUDIO_MUTE;
+ }
+
+ SSMSaveAudioSPIDFMuteVal(muteStatus);
+ return mAudioAlsa.SetSPDIFMute(muteStatus);
+}
+
+int CTv::GetAudioSPDIFMute()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioSPIDFMuteVal(&tmp_ch);
+ return tmp_ch;
+}
+int CTv::GetCurAudioSPDIFSwitch()
+{
+ return mCurAudioSPDIFSwitch;
+}
+
+int CTv::SaveCurAudioSPDIFSwitch(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioSPDIFSwitch = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioSPDIFSwitchVal(tmp_ch);
+
+ return mCurAudioSPDIFSwitch;
+}
+
+int CTv::LoadCurAudioSPDIFSwitch()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioSPDIFSwitchVal(&tmp_ch);
+ mCurAudioSPDIFSwitch = tmp_ch;
+ if (mCurAudioSPDIFSwitch != CC_SWITCH_ON
+ && mCurAudioSPDIFSwitch != CC_SWITCH_OFF) {
+ SaveCurAudioSPDIFSwitch (CC_SWITCH_ON);
+ }
+ return mCurAudioSPDIFSwitch;
+}
+
+//Audio SPDIF Mode
+int CTv::SetAudioSPDIFMode(int tmp_val)
+{
+ LOGD("%s : tmp_val = %d\n", __FUNCTION__, tmp_val);
+ mCurAudioSPDIFMode = tmp_val;
+
+ SetSPDIFMode(mCurAudioSPDIFMode);
+
+ return 0;
+}
+
+int CTv::GetCurAudioSPDIFMode()
+{
+ return mCurAudioSPDIFMode;
+}
+
+int CTv::SaveCurAudioSPDIFMode(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioSPDIFMode = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioSPDIFModeVal(tmp_ch);
+
+ return mCurAudioSPDIFMode;
+}
+
+int CTv::LoadCurAudioSPDIFMode()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioSPDIFModeVal(&tmp_ch);
+ mCurAudioSPDIFMode = tmp_ch;
+ if (mCurAudioSPDIFMode != CC_SPDIF_MODE_PCM
+ && mCurAudioSPDIFMode != CC_SPDIF_MODE_RAW) {
+ SaveCurAudioSPDIFMode (CC_SPDIF_MODE_PCM);
+ }
+ return mCurAudioSPDIFMode;
+}
+int CTv::SetAudioMasterVolume(int tmp_vol)
+{
+ mCustomAudioMasterVolume = tmp_vol;
+
+ //Volume Compensation
+ tmp_vol += mVolumeCompensationVal;
+
+ if (tmp_vol > CC_MAX_SOUND_VOL) {
+ tmp_vol = CC_MAX_SOUND_VOL;
+ }
+
+ if (tmp_vol < CC_MIN_SOUND_VOL) {
+ tmp_vol = CC_MIN_SOUND_VOL;
+ }
+
+ int tmp_ret = 0;
+ int aud_arch_type = GetAudioArchitectureTypeCFG();
+
+ if (aud_arch_type == CC_DAC_G9TV_INTERNAL_DAC) {
+ tmp_ret = mAudioAlsa.SetInternalDacMainVolume(tmp_vol);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_ON_BOARD) {
+ int digit_vol = 0;
+ int vol_gain_val = 0;
+ int vol_buf[2] = {0, 0};
+
+ //handle l&r channel volume for balance
+ mAudioAlsa.CalculateBalanceVol(255, mMainVolumeBalanceVal, vol_buf);
+
+ tmp_ret |= mAudioAlsa.SetExternalDacChannelVolume(1, vol_buf[0]);
+ tmp_ret |= mAudioAlsa.SetExternalDacChannelVolume(2, vol_buf[1]);
+
+ //handle master channel volume
+ digit_vol = mAudioAlsa.TransVolumeBarVolToDigitalVol(mAudioAlsa.GetMainVolDigitLutBuf(), tmp_vol);
+
+ vol_gain_val = mAudioAlsa.GetMainVolumeGain();
+ digit_vol += vol_gain_val;
+ tmp_ret |= mAudioAlsa.SetExternalDacChannelVolume(0, digit_vol);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_OFF_BOARD_FBC) {
+ tmp_ret = SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_VOLUME_BAR, tmp_vol);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_CUSTOMER_LIB) {
+ tmp_ret = mCustomerCtrl.SetVolumeBar(tmp_vol);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_DIGITAL) {
+ int vol_buf[2] = {0, 0};
+ mAudioAlsa.CalculateBalanceVol(tmp_vol, mMainVolumeBalanceVal, vol_buf);
+ tmp_ret = mAudioAlsa.SetDigitalMainVolume(vol_buf[0], vol_buf[1]);
+ }
+ if ( Get2d4gHeadsetEnable() == 1 ) {
+ setAudioPcmPlaybackVolume(tmp_vol);
+ }
+ return 0;
+}
+
+int CTv::GetAudioMasterVolume()
+{
+ return mCustomAudioMasterVolume;
+}
+
+int CTv::GetCurAudioMasterVolume()
+{
+ return mCurAudioMasterVolume;
+}
+
+int CTv::SaveCurAudioMasterVolume(int tmp_vol)
+{
+ mCurAudioMasterVolume = tmp_vol;
+ SSMSaveAudioMasterVolume(tmp_vol);
+ return mCurAudioMasterVolume;
+}
+
+int CTv::LoadCurAudioMasterVolume()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioMasterVolume(&tmp_ch);
+ mCurAudioMasterVolume = tmp_ch;
+ if (mCurAudioMasterVolume < CC_MIN_SOUND_VOL
+ || mCurAudioMasterVolume > CC_MAX_SOUND_VOL) {
+ SaveCurAudioMasterVolume (CC_DEF_SOUND_VOL);
+ }
+ mCustomAudioMasterVolume = mCurAudioMasterVolume;
+
+ return mCurAudioMasterVolume;
+}
+
+int CTv::SetAudioBalance(int tmp_val)
+{
+ mCustomAudioBalance = tmp_val;
+
+ int aud_arch_type = GetAudioArchitectureTypeCFG();
+
+ mMainVolumeBalanceVal = tmp_val;
+
+ if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_OFF_BOARD_FBC) {
+ SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_BALANCE, mMainVolumeBalanceVal);
+ return 0;
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_CUSTOMER_LIB) {
+ mCustomerCtrl.SetBlance(mMainVolumeBalanceVal);
+ return 0;
+ } else {
+ SetAudioMasterVolume(GetAudioMasterVolume());
+ }
+ return 0;
+}
+
+int CTv::GetAudioBalance()
+{
+ return mCustomAudioBalance;
+}
+
+int CTv::GetCurAudioBalance()
+{
+ return mCurAudioBalance;
+}
+
+int CTv::SaveCurAudioBalance(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioBalance = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioBalanceVal(tmp_ch);
+
+ return mCurAudioBalance;
+}
+
+int CTv::LoadCurAudioBalance()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioBalanceVal(&tmp_ch);
+ mCurAudioBalance = tmp_ch;
+ if (mCurAudioBalance < CC_MIN_SOUND_BALANCE_VAL
+ || mCurAudioBalance > CC_MAX_SOUND_BALANCE_VAL) {
+ SaveCurAudioBalance (CC_DEF_SOUND_BALANCE_VAL);
+ }
+
+ mCustomAudioBalance = mCurAudioBalance;
+
+ return mCurAudioBalance;
+}
+
+int CTv::SetAudioVolumeCompensationVal(int tmp_vol_comp_val)
+{
+ mVolumeCompensationVal = tmp_vol_comp_val;
+ LOGD("%s, new vol comp value = %d.\n",
+ __FUNCTION__, tmp_vol_comp_val);
+ return mVolumeCompensationVal;
+}
+
+
+int CTv::SetAudioSupperBassVolume(int tmp_vol)
+{
+ mCustomAudioSupperBassVolume = tmp_vol;
+
+ int aud_arch_type = GetAudioArchitectureTypeCFG();
+ int tmp_ret = 0;
+
+ if (aud_arch_type == CC_DAC_G9TV_INTERNAL_DAC) {
+ return 0;
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_ON_BOARD) {
+ int digit_vol = 0;
+ int vol_gain_val = 0;
+
+ digit_vol = mAudioAlsa.TransVolumeBarVolToDigitalVol(mAudioAlsa.GetMainVolDigitLutBuf(), tmp_vol);
+
+ vol_gain_val = mAudioAlsa.GetSupperBassVolumeGain();
+ digit_vol += vol_gain_val;
+ if (digit_vol < CC_MIN_DAC_SUB_WOOFER_VOLUME) {
+ digit_vol = CC_MIN_DAC_SUB_WOOFER_VOLUME;
+ } else if (digit_vol > CC_MAX_DAC_SUB_WOOFER_VOLUME) {
+ digit_vol = CC_MAX_DAC_SUB_WOOFER_VOLUME;
+ }
+
+ tmp_ret = mAudioAlsa.SetExternalDacChannelVolume(3, digit_vol);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_OFF_BOARD_FBC) {
+ tmp_ret = SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_SUBCHANNEL_VOLUME, tmp_vol);
+ }
+
+ return tmp_ret;
+}
+
+int CTv::GetAudioSupperBassVolume()
+{
+ return mCustomAudioSupperBassVolume;
+}
+
+int CTv::GetCurAudioSupperBassVolume()
+{
+ return mCurAudioSupperBassVolume;
+}
+
+int CTv::SaveCurAudioSupperBassVolume(int tmp_vol)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioSupperBassVolume = tmp_vol;
+ tmp_ch = tmp_vol;
+ SSMSaveAudioSupperBassVolume(tmp_ch);
+
+ return mCurAudioSupperBassVolume;
+}
+
+int CTv::LoadCurAudioSupperBassVolume()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioSupperBassVolume(&tmp_ch);
+ mCurAudioSupperBassVolume = tmp_ch;
+ if (mCurAudioSupperBassVolume < CC_MIN_SUPPERBASS_VOL
+ || mCurAudioSupperBassVolume > CC_MAX_SUPPERBASS_VOL) {
+ SaveCurAudioSupperBassVolume (CC_DEF_SUPPERBASS_VOL);
+ }
+ mCustomAudioSupperBassVolume = mCurAudioSupperBassVolume;
+
+ return mCurAudioSupperBassVolume;
+}
+int CTv::SetAudioSupperBassSwitch(int tmp_val)
+{
+ mCustomAudioSupperBassSwitch = tmp_val;
+
+ if (GetAudioSupperBassSwitch() == CC_SWITCH_OFF) {
+ return SetAudioSupperBassVolume(CC_MIN_SUPPERBASS_VOL);
+ }
+
+ return SetAudioSupperBassVolume(GetAudioSupperBassVolume());
+}
+
+int CTv::GetAudioSupperBassSwitch()
+{
+ if (GetAudioSupperBassSwitchDisableCFG() != 0) {
+ return CC_SWITCH_ON;
+ }
+
+ return mCustomAudioSupperBassSwitch;
+}
+
+int CTv::GetCurAudioSupperBassSwitch()
+{
+ if (GetAudioSupperBassSwitchDisableCFG() != 0) {
+ return CC_SWITCH_ON;
+ }
+
+ return mCurAudioSupperBassSwitch;
+}
+
+int CTv::SaveCurAudioSupperBassSwitch(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioSupperBassSwitch = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioSupperBassSwitch(tmp_ch);
+
+ SetSupperBassSRSSpeakerSize();
+
+ return mCurAudioSupperBassSwitch;
+}
+
+int CTv::LoadCurAudioSupperBassSwitch()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioSupperBassSwitch(&tmp_ch);
+ mCurAudioSupperBassSwitch = tmp_ch;
+ if (mCurAudioSupperBassSwitch != CC_SWITCH_ON
+ && mCurAudioSupperBassSwitch != CC_SWITCH_OFF) {
+ SaveCurAudioSupperBassSwitch (CC_SWITCH_OFF);
+ }
+ mCustomAudioSupperBassSwitch = mCurAudioSupperBassSwitch;
+
+ return mCurAudioSupperBassSwitch;
+}
+
+void CTv::SetSupperBassSRSSpeakerSize()
+{
+ int tmp_speakersize = -1;
+
+ if (GetAudioSrsTruBass() == CC_SWITCH_ON) {
+ tmp_speakersize = GetAudioSRSSupperBassTrubassSpeakerSizeCfg();
+ if (tmp_speakersize >= 0) {
+ mAudioEffect.SetSrsTrubassSpeakerSize(tmp_speakersize);
+ }
+ }
+}
+
+int CTv::SetAudioSRSSurround(int tmp_val)
+{
+ mCustomAudioSRSSurround = tmp_val;
+
+ RefreshSrsEffectAndDacGain();
+ return 0;
+}
+
+int CTv::GetAudioSRSSurround()
+{
+ return mCustomAudioSRSSurround;
+}
+
+int CTv::GetCurAudioSRSSurround()
+{
+ return mCurAudioSRSSurround;
+}
+
+int CTv::SaveCurAudioSrsSurround(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioSRSSurround = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioSRSSurroundSwitch(tmp_ch);
+
+ return mCurAudioSRSSurround;
+}
+
+int CTv::LoadCurAudioSrsSurround()
+{
+ int8_t tmp_ch = 0;
+
+ SSMReadAudioSRSSurroundSwitch(&tmp_ch);
+ mCurAudioSRSSurround = tmp_ch;
+ if (mCurAudioSRSSurround != CC_SWITCH_ON
+ && mCurAudioSRSSurround != CC_SWITCH_OFF) {
+ SaveCurAudioSrsSurround (CC_SWITCH_OFF);
+ }
+ mCustomAudioSRSSurround = mCurAudioSRSSurround;
+
+ return mCurAudioSRSSurround;
+}
+
+int CTv::SetAudioSrsDialogClarity(int tmp_val)
+{
+ mCustomAudioSrsDialogClarity = tmp_val;
+ RefreshSrsEffectAndDacGain();
+
+ return 0;
+}
+
+int CTv::GetAudioSrsDialogClarity()
+{
+ return mCustomAudioSrsDialogClarity;
+}
+
+int CTv::GetCurAudioSrsDialogClarity()
+{
+
+ return mCurAudioSrsDialogClarity;
+}
+
+int CTv::SaveCurAudioSrsDialogClarity(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioSrsDialogClarity = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioSRSDialogClaritySwitch(tmp_ch);
+
+ return mCurAudioSrsDialogClarity;
+}
+
+int CTv::LoadCurAudioSrsDialogClarity()
+{
+ int8_t tmp_ch = 0;
+
+ SSMReadAudioSRSDialogClaritySwitch(&tmp_ch);
+ mCurAudioSrsDialogClarity = tmp_ch;
+ if (mCurAudioSrsDialogClarity != CC_SWITCH_ON
+ && mCurAudioSrsDialogClarity != CC_SWITCH_OFF) {
+ SaveCurAudioSrsDialogClarity (CC_SWITCH_OFF);
+ }
+ mCustomAudioSrsDialogClarity = mCurAudioSrsDialogClarity;
+
+ return mCurAudioSrsDialogClarity;
+}
+
+int CTv::SetAudioSrsTruBass(int tmp_val)
+{
+ mCustomAudioSrsTruBass = tmp_val;
+ RefreshSrsEffectAndDacGain();
+
+ return 0;
+}
+
+int CTv::GetAudioSrsTruBass()
+{
+ return mCustomAudioSrsTruBass;
+}
+
+int CTv::GetCurAudioSrsTruBass()
+{
+
+ return mCurAudioSrsTruBass;
+}
+
+int CTv::SaveCurAudioSrsTruBass(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioSrsTruBass = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioSRSTruBassSwitch(tmp_ch);
+
+ return mCurAudioSrsTruBass;
+}
+
+int CTv::LoadCurAudioSrsTruBass()
+{
+ int8_t tmp_ch = 0;
+
+ SSMReadAudioSRSTruBassSwitch(&tmp_ch);
+ mCurAudioSrsTruBass = tmp_ch;
+ if (mCurAudioSrsTruBass != CC_SWITCH_ON
+ && mCurAudioSrsTruBass != CC_SWITCH_OFF) {
+ SaveCurAudioSrsTruBass (CC_SWITCH_OFF);
+ }
+ mCustomAudioSrsTruBass = mCurAudioSrsTruBass;
+
+ return mCurAudioSrsTruBass;
+}
+
+void CTv::RefreshSrsEffectAndDacGain()
+{
+ int tmp_gain_val = 0;
+ int surround_switch = CC_SWITCH_OFF;
+ int trubass_switch = CC_SWITCH_OFF;
+ int dialogclarity_switch = CC_SWITCH_OFF;
+ trubass_switch = GetAudioSrsTruBass();
+ dialogclarity_switch = GetAudioSrsDialogClarity();
+ surround_switch = GetAudioSRSSurround();
+
+ if (GetAudioSRSSourroundEnableCFG() == 0) {
+ return;
+ }
+
+ if (surround_switch == CC_SWITCH_ON) {
+ mAudioEffect.SetSrsSurroundSwitch(CC_SWITCH_ON);
+ tmp_gain_val = GetAudioSRSGainCfg("audio.srs.sourround.gain", 50);
+ mAudioEffect.SetSrsSurroundGain(tmp_gain_val);
+
+ int input_gain_val = GetAudioSRSGainCfg("audio.srs.input.gain", 50);
+ int out_gain_val = GetAudioSRSGainCfg("audio.srs.output.gain", 50);
+ mAudioEffect.SetSrsInputOutputGain(input_gain_val, out_gain_val);
+
+ if (trubass_switch == CC_SWITCH_ON
+ && dialogclarity_switch == CC_SWITCH_OFF) {
+
+ mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_ON);
+ tmp_gain_val = GetAudioSRSGainCfg("audio.srs.trubass.gain", 50);
+ mAudioEffect.SetSrsTruBassGain(tmp_gain_val);
+ tmp_gain_val = GetAudioSRSGainCfg("audio.srs.trubass.speakersize", 2);
+ mAudioEffect.SetSrsTrubassSpeakerSize(tmp_gain_val);
+
+ mAudioEffect.SetSrsDialogClaritySwitch (CC_SWITCH_OFF);
+
+ } else if (trubass_switch == CC_SWITCH_OFF
+ && dialogclarity_switch == CC_SWITCH_ON) {
+
+ mAudioEffect.SetSrsDialogClaritySwitch (CC_SWITCH_ON);
+ tmp_gain_val = GetAudioSRSGainCfg("audio.srs.dialogclarity.gain", 30);
+ mAudioEffect.SetSrsDialogClarityGain(tmp_gain_val);
+ tmp_gain_val = GetAudioSRSGainCfg("audio.srs.definition.gain", 20);
+ mAudioEffect.SetSrsDefinitionGain(tmp_gain_val);
+
+ mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_OFF);
+
+ } else if (trubass_switch == CC_SWITCH_ON
+ && dialogclarity_switch == CC_SWITCH_ON) {
+
+ mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_ON);
+ tmp_gain_val = GetAudioSRSGainCfg("audio.srs.trubass.gain", 50);
+ mAudioEffect.SetSrsTruBassGain(tmp_gain_val);
+ tmp_gain_val = GetAudioSRSGainCfg("audio.srs.trubass.speakersize", 2);
+ mAudioEffect.SetSrsTrubassSpeakerSize(tmp_gain_val);
+
+ mAudioEffect.SetSrsDialogClaritySwitch(CC_SWITCH_ON);
+ tmp_gain_val = GetAudioSRSGainCfg("audio.srs.dialogclarity.gain", 30);
+ mAudioEffect.SetSrsDialogClarityGain(tmp_gain_val);
+ tmp_gain_val = GetAudioSRSGainCfg("audio.srs.definition.gain", 20);
+ mAudioEffect.SetSrsDefinitionGain(tmp_gain_val);
+
+ } else if (trubass_switch == CC_SWITCH_OFF
+ && dialogclarity_switch == CC_SWITCH_OFF) {
+ mAudioEffect.SetSrsTruBassSwitch (CC_SWITCH_OFF);
+ mAudioEffect.SetSrsDialogClaritySwitch(CC_SWITCH_OFF);
+ }
+ SetSupperBassSRSSpeakerSize();
+ } else {
+ mAudioEffect.SetSrsSurroundSwitch (CC_SWITCH_OFF);
+ mAudioEffect.SetSrsTruBassSwitch(CC_SWITCH_OFF);
+ mAudioEffect.SetSrsDialogClaritySwitch(CC_SWITCH_OFF);
+ }
+ //Refesh DAC gain
+ int main_gain_val = 0;
+ if (surround_switch == CC_SWITCH_ON) {
+ main_gain_val = GetAudioEffectAmplifierGainCfg("audio.srs.sourround.ampmaster.gain", 6, 24);
+ if (dialogclarity_switch == CC_SWITCH_ON
+ && trubass_switch == CC_SWITCH_OFF) {
+ main_gain_val = GetAudioEffectAmplifierGainCfg("audio.srs.dialogclarity.ampmaster.gain", 6, 24);
+ } else if (dialogclarity_switch == CC_SWITCH_OFF
+ && trubass_switch == CC_SWITCH_ON) {
+ main_gain_val = GetAudioEffectAmplifierGainCfg("audio.srs.trubass.ampmaster.gain", 6, 24);
+ } else if (dialogclarity_switch == CC_SWITCH_ON
+ && trubass_switch == CC_SWITCH_ON) {
+ main_gain_val = GetAudioEffectAmplifierGainCfg("audio.srs.trubass.dialogclarity.ampmaster.gain", 6, 24);
+ }
+ }
+ mAudioAlsa.SetMainVolumeGain(main_gain_val);
+}
+
+int CTv::SetAudioBassVolume(int tmp_vol)
+{
+ int nMinBassVol = 0, nMaxBassVol = 0;
+
+ nMinBassVol = GetBassUIMinGainVal();
+ nMaxBassVol = GetBassUIMaxGainVal();
+
+ if (tmp_vol < nMinBassVol || tmp_vol > nMaxBassVol) {
+ tmp_vol = (nMaxBassVol + nMinBassVol) / 2;
+ }
+
+ mCustomAudioBassVolume = tmp_vol;
+
+ tmp_vol = MappingTrebleBassAndEqualizer(GetAudioBassVolume(), 0,
+ nMinBassVol, nMaxBassVol);
+
+ return SetSpecialIndexEQGain(CC_EQ_BASS_IND, tmp_vol);
+}
+
+int CTv::GetAudioBassVolume()
+{
+ return mCustomAudioBassVolume;
+}
+
+int CTv::GetCurAudioBassVolume()
+{
+ return mCurAudioBassVolume;
+}
+
+int CTv::SaveCurAudioBassVolume(int tmp_vol)
+{
+ int nMinBassVol = 0, nMaxBassVol = 0;
+
+ nMinBassVol = GetBassUIMinGainVal();
+ nMaxBassVol = GetBassUIMaxGainVal();
+
+ if (tmp_vol < nMinBassVol || tmp_vol > nMaxBassVol) {
+ tmp_vol = (nMaxBassVol + nMinBassVol) / 2;
+ }
+
+ RealSaveCurAudioBassVolume(tmp_vol, 1);
+
+ tmp_vol = MappingTrebleBassAndEqualizer(GetCurAudioBassVolume(), 0,
+ nMinBassVol, nMaxBassVol);
+
+ return SaveSpecialIndexEQGain(CC_EQ_BASS_IND, tmp_vol);
+}
+
+int CTv::RealSaveCurAudioBassVolume(int tmp_vol, int sound_mode_judge)
+{
+ int8_t tmp_ch = 0;
+ mCurAudioBassVolume = tmp_vol;
+ tmp_ch = tmp_vol;
+ SSMSaveAudioBassVolume(tmp_ch);
+
+ if (sound_mode_judge == 1) {
+ if (GetAudioSoundMode() != CC_SOUND_MODE_USER) {
+ SaveCurAudioSoundMode (CC_SOUND_MODE_USER);
+ mCustomAudioSoundMode = mCurAudioSoundMode;
+ }
+ }
+
+ return mCurAudioBassVolume;
+}
+
+int CTv::LoadCurAudioBassVolume()
+{
+ int nMinBassVol = 0, nMaxBassVol = 0;
+ int8_t tmp_ch = 0;
+
+ nMinBassVol = GetBassUIMinGainVal();
+ nMaxBassVol = GetBassUIMaxGainVal();
+
+ SSMReadAudioBassVolume(&tmp_ch);
+ mCurAudioBassVolume = tmp_ch;
+ if (mCurAudioBassVolume < nMinBassVol
+ || mCurAudioBassVolume > nMaxBassVol) {
+ RealSaveCurAudioBassVolume((nMaxBassVol + nMinBassVol) / 2, 0);
+ }
+
+ mCustomAudioBassVolume = mCurAudioBassVolume;
+
+ return mCurAudioBassVolume;
+}
+
+int CTv::SetAudioTrebleVolume(int tmp_vol)
+{
+ int nMinTrebleVol = 0, nMaxTrebleVol = 0;
+
+ nMinTrebleVol = GetTrebleUIMinGainVal();
+ nMaxTrebleVol = GetTrebleUIMaxGainVal();
+
+ if (tmp_vol < nMinTrebleVol || tmp_vol > nMaxTrebleVol) {
+ tmp_vol = (nMaxTrebleVol + nMinTrebleVol) / 2;
+ }
+
+ mCustomAudioTrebleVolume = tmp_vol;
+
+ tmp_vol = MappingTrebleBassAndEqualizer(GetAudioTrebleVolume(), 0,
+ nMinTrebleVol, nMaxTrebleVol);
+
+ return SetSpecialIndexEQGain(CC_EQ_TREBLE_IND, tmp_vol);
+}
+
+int CTv::GetAudioTrebleVolume()
+{
+ return mCustomAudioTrebleVolume;
+}
+
+int CTv::GetCurAudioTrebleVolume()
+{
+ return mCurAudioTrebleVolume;
+}
+
+int CTv::SaveCurAudioTrebleVolume(int tmp_vol)
+{
+ int nMinTrebleVol = 0, nMaxTrebleVol = 0;
+
+ nMinTrebleVol = GetTrebleUIMinGainVal();
+ nMaxTrebleVol = GetTrebleUIMaxGainVal();
+
+ if (tmp_vol < nMinTrebleVol || tmp_vol > nMaxTrebleVol) {
+ tmp_vol = (nMaxTrebleVol + nMinTrebleVol) / 2;
+ }
+
+ RealSaveCurAudioTrebleVolume(tmp_vol, 1);
+
+ tmp_vol = MappingTrebleBassAndEqualizer(GetCurAudioTrebleVolume(), 0,
+ nMinTrebleVol, nMaxTrebleVol);
+
+ return SaveSpecialIndexEQGain(CC_EQ_TREBLE_IND, tmp_vol);
+}
+
+int CTv::RealSaveCurAudioTrebleVolume(int tmp_vol, int sound_mode_judge)
+{
+ int8_t tmp_ch = 0;
+ mCurAudioTrebleVolume = tmp_vol;
+ tmp_ch = tmp_vol;
+ SSMSaveAudioTrebleVolume(tmp_ch);
+
+ if (sound_mode_judge == 1) {
+ if (GetAudioSoundMode() != CC_SOUND_MODE_USER) {
+ SaveCurAudioSoundMode (CC_SOUND_MODE_USER);
+ mCustomAudioSoundMode = mCurAudioSoundMode;
+ }
+ }
+
+ return mCurAudioTrebleVolume;
+}
+
+int CTv::LoadCurAudioTrebleVolume()
+{
+ int nMinTrebleVol = 0, nMaxTrebleVol = 0;
+ int8_t tmp_ch = 0;
+
+ nMinTrebleVol = GetTrebleUIMinGainVal();
+ nMaxTrebleVol = GetTrebleUIMaxGainVal();
+
+ SSMReadAudioTrebleVolume(&tmp_ch);
+ mCurAudioTrebleVolume = tmp_ch;
+ if (mCurAudioTrebleVolume < nMinTrebleVol
+ || mCurAudioTrebleVolume > nMaxTrebleVol) {
+ RealSaveCurAudioTrebleVolume((nMaxTrebleVol + nMinTrebleVol) / 2, 0);
+ }
+
+ mCustomAudioTrebleVolume = mCurAudioTrebleVolume;
+
+ return mCurAudioTrebleVolume;
+}
+
+int CTv::SetAudioSoundMode(int tmp_val)
+{
+ mCustomAudioSoundMode = tmp_val;
+ SetSpecialModeEQGain(mCustomAudioSoundMode);
+
+ HandleTrebleBassVolume();
+
+ return 0;
+}
+
+int CTv::GetAudioSoundMode()
+{
+ return mCustomAudioSoundMode;
+}
+
+int CTv::GetCurAudioSoundMode()
+{
+ return mCurAudioSoundMode;
+}
+
+int CTv::SaveCurAudioSoundMode(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioSoundMode = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioSoundModeVal(tmp_ch);
+
+ return mCurAudioSoundMode;
+}
+
+int CTv::LoadCurAudioSoundMode()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioSoundModeVal(&tmp_ch);
+ mCurAudioSoundMode = tmp_ch;
+ if (mCurAudioSoundMode < CC_SOUND_MODE_START
+ || mCurAudioSoundMode > CC_SOUND_MODE_END) {
+ SaveCurAudioSoundMode (CC_SOUND_MODE_STD);
+ }
+ mCustomAudioSoundMode = mCurAudioSoundMode;
+
+ return mCurAudioSoundMode;
+}
+
+int CTv::HandleTrebleBassVolume()
+{
+ int tmp_vol = 0;
+ int tmpEQGainBuf[128] = { 0 };
+ int8_t tmp_ch = 0;
+
+ GetCustomEQGain(tmpEQGainBuf);
+
+ tmp_vol = MappingTrebleBassAndEqualizer(tmpEQGainBuf[CC_EQ_TREBLE_IND], 1,
+ GetTrebleUIMinGainVal(), GetTrebleUIMaxGainVal());
+ mCustomAudioTrebleVolume = tmp_vol;
+ mCurAudioTrebleVolume = mCustomAudioTrebleVolume;
+ tmp_ch = mCustomAudioTrebleVolume;
+ SSMSaveAudioTrebleVolume(tmp_ch);
+
+ tmp_vol = MappingTrebleBassAndEqualizer(tmpEQGainBuf[CC_EQ_BASS_IND], 1,
+ GetBassUIMinGainVal(), GetBassUIMaxGainVal());
+ mCustomAudioBassVolume = tmp_vol;
+ mCurAudioBassVolume = mCustomAudioBassVolume;
+ tmp_ch = mCustomAudioBassVolume;
+ SSMSaveAudioBassVolume(tmp_ch);
+
+ return 0;
+}
+
+int CTv::SetAudioWallEffect(int tmp_val)
+{
+ int tmp_treble_val;
+ int tmp_type = 0;
+
+ mCustomAudioWallEffect = tmp_val;
+
+ tmp_type = GetAudioWallEffectTypeCfg();
+ if (tmp_type == 0) {
+ SetCustomEQGain();
+ } else if (tmp_type == 1) {
+ int aud_arch_type = GetAudioArchitectureTypeCFG();
+ if (aud_arch_type == CC_DAC_G9TV_INTERNAL_DAC) {
+ return 0;
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_ON_BOARD) {
+ mAudioAlsa.SetExternalDacEQMode(tmp_val);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_OFF_BOARD_FBC) {
+ SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_EQ_MODE, tmp_val);
+ }
+ }
+ return 0;
+}
+
+int CTv::GetAudioWallEffect()
+{
+ return mCustomAudioWallEffect;
+}
+
+int CTv::GetCurAudioWallEffect()
+{
+ return mCurAudioWallEffect;
+}
+
+int CTv::SaveCurAudioWallEffect(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioWallEffect = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioWallEffectSwitch(tmp_ch);
+
+ return mCurAudioWallEffect;
+}
+
+int CTv::LoadCurAudioWallEffect()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioWallEffectSwitch(&tmp_ch);
+ mCurAudioWallEffect = tmp_ch;
+ if (mCurAudioWallEffect != CC_SWITCH_ON
+ && mCurAudioWallEffect != CC_SWITCH_OFF) {
+ SaveCurAudioWallEffect (CC_SWITCH_OFF);
+ }
+
+ mCustomAudioWallEffect = mCurAudioWallEffect;
+
+ return mCurAudioWallEffect;
+}
+
+
+int CTv::SetAudioEQMode(int tmp_val)
+{
+ mCustomAudioEQMode = tmp_val;
+
+ return 0;
+}
+
+int CTv::GetAudioEQMode()
+{
+ return mCustomAudioEQMode;
+}
+
+int CTv::GetCurAudioEQMode()
+{
+ return mCurAudioEQMode;
+}
+
+int CTv::SaveCurAudioEQMode(int tmp_val)
+{
+ int8_t tmp_ch = 0;
+
+ mCurAudioEQMode = tmp_val;
+ tmp_ch = tmp_val;
+ SSMSaveAudioEQModeVal(tmp_ch);
+
+ return tmp_val;
+}
+
+int CTv::LoadCurAudioEQMode()
+{
+ int8_t tmp_ch = 0;
+ SSMReadAudioEQModeVal(&tmp_ch);
+ mCurAudioEQMode = tmp_ch;
+ if (mCurAudioEQMode < CC_EQ_MODE_START
+ || mCurAudioEQMode > CC_EQ_MODE_END) {
+ SaveCurAudioEQMode (CC_EQ_MODE_START);
+ }
+ mCustomAudioEQMode = mCurAudioEQMode;
+
+ return mCurAudioEQMode;
+}
+
+int CTv::GetAudioEQRange(int range_buf[])
+{
+ range_buf[0] = CC_MIN_EQ_GAIN_VAL;
+ range_buf[1] = CC_MAX_EQ_GAIN_VAL;
+ return 0;
+}
+
+int CTv::GetAudioEQBandCount()
+{
+ return mAudioEffect.GetEQBandCount();
+}
+
+int CTv::SetAudioEQGain(int gain_buf[])
+{
+ return AudioSetEQGain(gain_buf);
+}
+
+int CTv::GetAudioEQGain(int gain_buf[])
+{
+ return GetCustomEQGain(gain_buf);
+}
+
+int CTv::GetCurAudioEQGain(int gain_buf[])
+{
+ RealReadCurAudioEQGain(gain_buf);
+ return 0;
+}
+
+int CTv::SaveCurAudioEQGain(int gain_buf[])
+{
+ return RealSaveCurAudioEQGain(gain_buf, 1);
+}
+
+int CTv::RealReadCurAudioEQGain(int gain_buf[])
+{
+ ArrayCopy(gain_buf, mCurEQGainBuf, GetAudioEQBandCount());
+ return 0;
+}
+
+int CTv::RealSaveCurAudioEQGain(int gain_buf[], int sound_mode_judge)
+{
+ ArrayCopy(mCurEQGainBuf, gain_buf, GetAudioEQBandCount());
+ ArrayCopy(mCurEQGainChBuf, gain_buf, GetAudioEQBandCount());
+ SSMSaveAudioEQGain(0, GetAudioEQBandCount(), mCurEQGainChBuf);
+
+ if (sound_mode_judge == 1) {
+ HandleTrebleBassVolume();
+ SaveCurAudioSoundMode (CC_SOUND_MODE_USER);
+ mCustomAudioSoundMode = mCurAudioSoundMode;
+ }
+
+ return 0;
+}
+
+int CTv::LoadCurAudioEQGain()
+{
+ int i = 0;
+
+ SSMReadAudioEQGain(0, GetAudioEQBandCount(), mCurEQGainChBuf);
+ ArrayCopy(mCurEQGainBuf, mCurEQGainChBuf, GetAudioEQBandCount());
+
+ for (i = 0; i < GetAudioEQBandCount(); i++) {
+ if (mCurEQGainBuf[i] & 0x80) {
+ mCurEQGainBuf[i] = mCurEQGainBuf[i] - 256;
+ }
+ }
+
+ return 0;
+}
+
+int CTv::SetAudioEQSwitch(int switch_val)
+{
+ return mAudioEffect.SetEQSwitch(switch_val);
+}
+
+int CTv::SetDbxTvMode(int mode, int son_value, int vol_value, int sur_value)
+{
+ return mAudioEffect.DbxTv_SetMode(mode, son_value, vol_value, sur_value);
+}
+
+int CTv::GetBassUIMinGainVal()
+{
+ return 0;
+}
+
+int CTv::GetBassUIMaxGainVal()
+{
+ return 100;
+}
+int CTv::GetTrebleUIMinGainVal()
+{
+ return 0;
+}
+
+int CTv::GetTrebleUIMaxGainVal()
+{
+ return 100;
+}
+
+int CTv::MappingLine(int map_val, int src_min, int src_max, int dst_min,
+ int dst_max)
+{
+ if (dst_min < 0) {
+ return (map_val - (src_max + src_min) / 2) * (dst_max - dst_min)
+ / (src_max - src_min);
+ } else {
+ return (map_val - src_min) * (dst_max - dst_min) / (src_max - src_min);
+ }
+}
+
+int CTv::MappingTrebleBassAndEqualizer(int tmp_vol, int direct, int tb_min,
+ int tb_max)
+{
+ int tmp_ret = 0;
+
+ if (direct == 0) {
+ tmp_ret = MappingLine(tmp_vol, tb_min, tb_max, CC_EQ_DEF_UI_MIN_GAIN, CC_EQ_DEF_UI_MAX_GAIN);
+ } else {
+ tmp_ret = MappingLine(tmp_vol, CC_EQ_DEF_UI_MIN_GAIN, CC_EQ_DEF_UI_MAX_GAIN, tb_min, tb_max);
+ }
+
+ LOGD("%s, tmp_vol = %d, direct = %d, tmp_ret = %d\n", __FUNCTION__, tmp_vol,
+ direct, tmp_ret);
+
+ return tmp_ret;
+}
+
+int CTv::MappingEQGain(int src_gain_buf[], int dst_gain_buf[], int direct)
+{
+ int i = 0;
+ int nMinUIVal = 0, nMaxUIVal = 0, nMinVal = 0, nMaxVal = 0;
+
+ nMinUIVal = CC_EQ_DEF_UI_MIN_GAIN;
+ nMaxUIVal = CC_EQ_DEF_UI_MAX_GAIN;
+ nMinVal = CC_MIN_EQ_GAIN_VAL;
+ nMaxVal = CC_MAX_EQ_GAIN_VAL;
+
+ if (nMinUIVal >= nMinVal && nMaxUIVal <= nMaxVal) {
+ for (i = 0; i < GetAudioEQBandCount(); i++) {
+ dst_gain_buf[i] = src_gain_buf[i];
+ }
+ } else {
+ for (i = 0; i < GetAudioEQBandCount(); i++) {
+ if (direct == 0) {
+ dst_gain_buf[i] = MappingLine(src_gain_buf[i], nMinUIVal,
+ nMaxUIVal, nMinVal, nMaxVal);
+ } else {
+ dst_gain_buf[i] = MappingLine(src_gain_buf[i], nMinVal, nMaxVal,
+ nMinUIVal, nMaxUIVal);
+ }
+ }
+ }
+
+ return 0;
+}
+
+int CTv::RestoreToAudioDefEQGain(int gain_buf[])
+{
+ int i = 0;
+
+ for (i = 0; i < GetAudioEQBandCount(); i++) {
+ gain_buf[i] = (CC_EQ_DEF_UI_MAX_GAIN + CC_EQ_DEF_UI_MIN_GAIN) / 2;
+ }
+
+ ArrayCopy(mCurEQGainBuf, gain_buf, GetAudioEQBandCount());
+ ArrayCopy(mCurEQGainChBuf, gain_buf, GetAudioEQBandCount());
+ SSMSaveAudioEQGain(0, GetAudioEQBandCount(), mCurEQGainChBuf);
+
+ HandleTrebleBassVolume();
+ SaveCurAudioSoundMode (CC_SOUND_MODE_STD);
+ mCustomAudioSoundMode = mCurAudioSoundMode;
+
+ return 0;
+}
+
+int CTv::GetCustomEQGain(int gain_buf[])
+{
+ ArrayCopy(gain_buf, mCustomEQGainBuf, GetAudioEQBandCount());
+ return 0;
+}
+
+int CTv::SetCustomEQGain()
+{
+ int tmpEQGainBuf[128] = { 0 };
+
+ if (MappingEQGain(mCustomEQGainBuf, tmpEQGainBuf, 0) < 0) {
+ return -1;
+ }
+
+ return RealSetEQGain(tmpEQGainBuf);
+}
+
+int CTv::AudioSetEQGain(int gain_buf[])
+{
+ int tmpEQGainBuf[128] = { 0 };
+
+ ArrayCopy(mCustomEQGainBuf, gain_buf, GetAudioEQBandCount());
+
+ if (MappingEQGain(mCustomEQGainBuf, tmpEQGainBuf, 0) < 0) {
+ return -1;
+ }
+
+ return RealSetEQGain(tmpEQGainBuf);
+}
+
+int CTv::handleEQGainBeforeSet(int src_buf[], int dst_buf[])
+{
+ int i = 0, nMinGain, nMaxGain;
+
+ nMinGain = CC_MIN_EQ_GAIN_VAL;
+ nMaxGain = CC_MAX_EQ_GAIN_VAL;
+
+ if (GetAudioWallEffect() == CC_SWITCH_ON && GetAudioWallEffectTypeCfg() == 0) {
+ for (i = 0; i < GetAudioEQBandCount(); i++) {
+ dst_buf[i] = mWallEffectValueBuf[i] + src_buf[i];
+
+ if (dst_buf[i] < nMinGain) {
+ dst_buf[i] = nMinGain;
+ }
+
+ if (dst_buf[i] > nMaxGain) {
+ dst_buf[i] = nMaxGain;
+ }
+ }
+ } else {
+ for (i = 0; i < GetAudioEQBandCount(); i++) {
+ dst_buf[i] = src_buf[i];
+ }
+ }
+
+ return 0;
+}
+
+int CTv::RealSetEQGain(int gain_buf[])
+{
+
+ if (GetAudioWallEffect() == CC_SWITCH_ON && GetAudioWallEffectTypeCfg() == 0) {
+ for (int i = 0; i < GetAudioEQBandCount(); i++) {
+ gain_buf[i] = mWallEffectValueBuf[i] + gain_buf[i];
+
+ if (gain_buf[i] < CC_MIN_EQ_GAIN_VAL) {
+ gain_buf[i] = CC_MIN_EQ_GAIN_VAL;
+ }
+
+ if (gain_buf[i] > CC_MAX_EQ_GAIN_VAL) {
+ gain_buf[i] = CC_MAX_EQ_GAIN_VAL;
+ }
+ }
+ }
+
+ mAudioEffect.SetEQValue(gain_buf);
+
+ return 0;
+}
+
+int CTv::SetAtvInGain(int gain_val)
+{
+ int ret = -1;
+
+ char set_str[32];
+ memset ( set_str, 0, 32 );
+
+ sprintf ( set_str, "audio_gain_set %x", gain_val );
+
+ return SetFileAttrValue ( "/sys/class/amlatvdemod/atvdemod_debug", set_str );
+}
+
+
+int CTv::SetSpecialModeEQGain(int tmp_val)
+{
+ int i = 0;
+ int tmpEQPresetBufPtr[24];
+ if (GetAudioEQPresetBufferPtr(tmpEQPresetBufPtr) != 0) {
+ GetDefault_EQGain_Table(tmpEQPresetBufPtr);
+ }
+ int tmpEQGainBuf[128] = { 0 };
+
+ if (tmp_val == CC_SOUND_MODE_USER) {
+ RealReadCurAudioEQGain(tmpEQGainBuf);
+ } else {
+ ArrayCopy(tmpEQGainBuf,
+ tmpEQPresetBufPtr + tmp_val * GetAudioEQBandCount(),
+ GetAudioEQBandCount());
+ }
+
+ AudioSetEQGain(tmpEQGainBuf);
+
+ return tmp_val;
+}
+
+int CTv::SetSpecialIndexEQGain(int buf_index, int w_val)
+{
+ int tmpEQGainBuf[128] = { 0 };
+
+ if (buf_index >= 0 && buf_index < GetAudioEQBandCount()) {
+ RealReadCurAudioEQGain(tmpEQGainBuf);
+ tmpEQGainBuf[buf_index] = w_val;
+
+ return AudioSetEQGain(tmpEQGainBuf);
+ }
+
+ return -1;
+}
+
+int CTv::SaveSpecialIndexEQGain(int buf_index, int w_val)
+{
+ int tmpEQGainBuf[128] = { 0 };
+
+ if (buf_index >= 0 && buf_index < GetAudioEQBandCount()) {
+ RealReadCurAudioEQGain(tmpEQGainBuf);
+ tmpEQGainBuf[buf_index] = w_val;
+
+ return RealSaveCurAudioEQGain(tmpEQGainBuf, 0);
+ }
+
+ return 0;
+}
+
+// amAudio
+int CTv::OpenAmAudio(unsigned int sr, int input_device, int output_device)
+{
+ LOGD("OpenAmAudio input_device = %d", input_device);
+ return amAudioOpen(sr, input_device, output_device);
+}
+
+int CTv::CloseAmAudio(void)
+{
+ return amAudioClose();
+}
+
+int CTv::SetAmAudioInputSr(unsigned int sr, int output_device)
+{
+ LOGD("SetAmAudioInputSr ");
+ return amAudioSetInputSr(sr, CC_IN_USE_SPDIF_DEVICE, output_device);
+}
+
+int CTv::SetAmAudioOutputMode(int mode)
+{
+ if (mode != CC_AMAUDIO_OUT_MODE_DIRECT && mode != CC_AMAUDIO_OUT_MODE_INTER_MIX
+ && mode != CC_AMAUDIO_OUT_MODE_DIRECT_MIX) {
+ LOGE("%s, mode error, it should be mix or direct!\n", __FUNCTION__);
+ return -1;
+ }
+
+ return amAudioSetOutputMode(mode);
+}
+
+int CTv::SetAmAudioMusicGain(int gain)
+{
+ return amAudioSetMusicGain(gain);
+}
+
+int CTv::SetAmAudioLeftGain(int gain)
+{
+ return amAudioSetLeftGain(gain);
+}
+
+
+int CTv::SetAmAudioRightGain(int gain)
+{
+ return amAudioSetRightGain(gain);
+}
+
+int CTv::SetAudioDumpDataFlag(int tmp_flag)
+{
+ return amAudioSetDumpDataFlag(tmp_flag);
+}
+
+int GetAudioDumpDataFlag()
+{
+ return amAudioGetDumpDataFlag();
+}
+static int RealCalVolDigitLUTBuf(int start_ind, int end_ind, int start_val,
+ int end_val, int lut_buf[])
+{
+ int i = 0;
+ float tmp_step = 0;
+
+ if (end_ind < start_ind) {
+ return 0;
+ }
+
+ tmp_step = (float) (end_val - start_val) / (float) (end_ind - start_ind);
+
+ for (i = start_ind; i < end_ind; i++) {
+ lut_buf[i] = start_val + (int) (tmp_step * (i - start_ind));
+ }
+
+ lut_buf[end_ind] = end_val;
+
+ return 1;
+}
+
+void CTv::AudioSetVolumeDigitLUTBuf(int lut_table_index, int *MainVolLutBuf)
+{
+
+ int tmpDefDigitLutBuf[CC_LUT_BUF_SIZE] = { 0 };
+ mAudioAlsa.SetMainVolDigitLutBuf(MainVolLutBuf);
+
+ GetAudioAmpSupbassvolBuf(lut_table_index, tmpDefDigitLutBuf);
+ mAudioAlsa.SetSupperBassVolDigitLutBuf(tmpDefDigitLutBuf);
+ return;
+}
+
+int CTv::InitTvAudio(int sr, int input_device)
+{
+ OpenAmAudio(sr, input_device, CC_OUT_USE_AMAUDIO);
+
+ RefreshSrsEffectAndDacGain();
+ SetCustomEQGain();
+
+ return 0;
+}
+
+int CTv::UnInitTvAudio()
+{
+ return CloseAmAudio();
+}
+
+int CTv::AudioChangeSampleRate(int sr)
+{
+ sr = HanldeAudioInputSr(sr);
+
+ if (SetAmAudioInputSr(sr, CC_OUT_USE_AMAUDIO) != 0) {
+ return -1;
+ }
+
+ RefreshSrsEffectAndDacGain();
+ SetCustomEQGain();
+
+ return 0;
+}
+
+int CTv::AudioSetAudioInSource(int audio_src_in_type)
+{
+ return mAudioAlsa.SetAudioInSource(audio_src_in_type);
+}
+
+int CTv::AudioSetAudioSourceType(int source_type)
+{
+ int aud_arch_type = GetAudioArchitectureTypeCFG();
+
+ if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_ON_BOARD) {
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_OFF_BOARD_FBC) {
+ SendCmdToOffBoardFBCExternalDac(AUDIO_CMD_SET_SOURCE, source_type);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_CUSTOMER_LIB) {
+ mCustomerCtrl.SetSource(source_type);
+ } else if (aud_arch_type == CC_DAC_G9TV_EXTERNAL_DAC_DIGITAL) {
+ }
+ return 0;
+}
+
+int CTv::AudioLineInSelectChannel(int audio_channel)
+{
+ LOGD ("%s, audio_channel = %d", __FUNCTION__, audio_channel);
+ mAudioAlsa.SetInternalDacLineInSelectChannel(audio_channel);
+ return 0;
+}
+int CTv::SetKalaokIO(int level)
+{
+ LOGD ("%s, SetKalaokIO = %d", __FUNCTION__, level);
+ if (GetKaraokAvEnable() == 1) {
+ mAudioAlsa.SetAudioSwitchIO(level);
+ }
+ return 0;
+}
+
+int CTv::AudioSetLineInCaptureVolume(int l_vol, int r_vol)
+{
+ mAudioAlsa.SetInternalDacLineInCaptureVolume(l_vol, r_vol);
+ return 0;
+}
+
+int CTv::openTvAudio()
+{
+ int tmp_val = 0;
+
+ LOGD("%s, entering...\n", __FUNCTION__);
+ UnInitSetTvAudioCard();
+
+ tmp_val = GetAudioDumpDataEnableFlagCfg();
+ SetAudioDumpDataFlag(tmp_val);
+
+ tmp_val = GetAudioInternalDacPGAInGain_Cfg();
+ mAudioAlsa.SetAudioInternalDacPGAInGain(tmp_val, tmp_val);
+
+ mAudioAlsa.SetMixerBypassSwitch (CC_SWITCH_OFF);
+ mAudioAlsa.SetMixerDacSwitch (CC_SWITCH_ON);
+
+ LoadAudioCtl();
+
+ RefreshSrsEffectAndDacGain();
+ InitSetAudioCtl();
+ return 0;
+}
+
+int CTv::closeTvAudio()
+{
+ return 0;
+}
+void CTv::LoadAudioCtl()
+{
+ // Get Current Audio Volume
+ LoadCurAudioMasterVolume();
+
+ // Get Current Audio Balance
+ LoadCurAudioBalance();
+
+ // Get Current Supper Bass Switch
+ LoadCurAudioSupperBassSwitch();
+
+ // Get Current Supper Bass Volume
+ LoadCurAudioSupperBassVolume();
+
+ // Get Current SRSSurround
+ LoadCurAudioSrsSurround();
+
+ // Get Current SRS DialogClarity
+ LoadCurAudioSrsDialogClarity();
+
+ // Get Current SRS TruBass
+ LoadCurAudioSrsTruBass();
+
+ // Get Current Audio Sound Mode
+ LoadCurAudioSoundMode();
+
+ // Get Current Audio Bass and Treble
+ LoadCurAudioBassVolume();
+ LoadCurAudioTrebleVolume();
+
+ // Get Current Wall Effect
+ LoadCurAudioWallEffect();
+
+ // Get Current spdif switch
+ LoadCurAudioSPDIFSwitch();
+
+ // Get Current spdif mode
+ LoadCurAudioSPDIFMode();
+
+ // Get Current EQ mode
+ LoadCurAudioEQMode();
+
+ // Get Current EQ Gain
+ LoadCurAudioEQGain();
+}
+
+void CTv::InitSetAudioCtl()
+{
+ // Set Current Audio balance value
+ SetAudioBalance(GetAudioBalance());
+
+ // Set Current Audio Volume
+ SetAudioMasterVolume(GetAudioMasterVolume());
+
+ // Set Current Supper Bass Volume
+ SetAudioSupperBassVolume(GetAudioSupperBassVolume());
+
+ // Set Current Audio Sound Mode
+ SetAudioSoundMode(GetAudioSoundMode());
+
+ // Set Current Audio SPDIF Switch
+ SetAudioSPDIFSwitch(GetCurAudioSPDIFSwitch());
+
+ // Set Current Audio SPDIF mode
+ SetAudioSPDIFMode(GetCurAudioSPDIFMode());
+}
+
+int CTv::SetADC_Digital_Capture_Volume(int value)
+{
+ return mAudioAlsa.SetAudioInternalDacADCDigitalCaptureVolume( value, value);
+}
+int CTv::SetPGA_IN_Value(int value)
+{
+ return mAudioAlsa.SetAudioInternalDacPGAInGain( value, value);
+}
+int CTv::SetDAC_Digital_PlayBack_Volume(int value)
+{
+ return mAudioAlsa.SetAudioInternalDacDACDigitalPlayBackVolume( value, value);
+}
+
+int CTv::setAudioPcmPlaybackVolume(int val)
+{
+ int pcm_volume = 0;
+ pcm_volume = val / 2;
+ if (pcm_volume > 24) pcm_volume = 24;
+ //return SetAudioPcmPlaybackVolume(pcm_volume);
+ return 0;
+}
+
+int CTv::HanldeAudioInputSr(unsigned int sr)
+{
+ int tmp_cfg = 0;
+
+ tmp_cfg = GetAudioResampleTypeCFG();
+ if (tmp_cfg & CC_AUD_RESAMPLE_TYPE_HW) {
+ mAudioAlsa.SetHardwareResample(sr);
+ } else {
+ mAudioAlsa.SetHardwareResample(-1);
+ }
+
+ if (!(tmp_cfg & CC_AUD_RESAMPLE_TYPE_SW)) {
+ sr = 48000;
+ }
+
+ return sr;
+}
+
+int CTv::AudioSSMRestoreDefaultSetting()
+{
+ int i = 0, tmp_val = 0;
+ int nMinUIVol = 0, nMaxUIVol = 0;
+ int *tmp_ptr = NULL;
+ int tmpEQGainBuf[128] = { 0 };
+ unsigned char tmp_buf[CC_NO_LINE_POINTS_MAX_CNT] = { 0 };
+
+ // Save Current Audio Volume
+ SaveCurAudioMasterVolume (CC_DEF_SOUND_VOL);
+
+ // Save Current Audio Balance
+ SaveCurAudioBalance (CC_DEF_SOUND_BALANCE_VAL);
+
+ // Save Current Supper Bass Switch
+ SaveCurAudioSupperBassSwitch (CC_SWITCH_OFF);
+
+ // Save Current Supper Bass Volume
+ SaveCurAudioSupperBassVolume (CC_DEF_SUPPERBASS_VOL);
+
+ // Save Current SRSSurround
+ SaveCurAudioSrsSurround(CC_SWITCH_OFF);
+
+ // Save Current SRS DialogClarity
+ SaveCurAudioSrsDialogClarity(CC_SWITCH_OFF);
+
+ // Save Current SRS TruBass
+ SaveCurAudioSrsTruBass(CC_SWITCH_OFF);
+
+ // Save Current Audio Sound Mode
+ SaveCurAudioSoundMode (CC_SOUND_MODE_STD);
+
+ // Save Current Wall Effect
+ SaveCurAudioWallEffect(CC_SWITCH_OFF);
+
+ // Save Current spdif switch
+ SaveCurAudioSPDIFSwitch (CC_SWITCH_ON);
+
+ // Save Current spdif mode
+ SaveCurAudioSPDIFMode (CC_SPDIF_MODE_PCM);
+
+ // Save Current avout and spidif mute state
+ SSMSaveAudioSPIDFMuteVal(CC_AUDIO_MUTE);
+ SSMSaveAudioAVOutMuteVal(CC_AUDIO_MUTE);
+
+ // Save Current EQ mode
+ SaveCurAudioEQMode (CC_EQ_MODE_NOMAL);
+
+ // Save Current EQ Gain
+ RestoreToAudioDefEQGain(tmpEQGainBuf);
+
+ // Save Current Audio Bass and Treble
+ nMinUIVol = GetBassUIMinGainVal();
+ nMaxUIVol = GetBassUIMaxGainVal();
+ RealSaveCurAudioBassVolume((nMinUIVol + nMaxUIVol) / 2, 0);
+
+ nMinUIVol = GetTrebleUIMinGainVal();
+ nMaxUIVol = GetTrebleUIMaxGainVal();
+ RealSaveCurAudioTrebleVolume((nMinUIVol + nMaxUIVol) / 2, 0);
+
+ return 0;
+}
+
+static const char *gDefCapturePropName = "snd.card.default.card.capture";
+
+int CTv::InitSetTvAudioCard()
+{
+ int i = 0, totle_num = 0, capture_ind = 0;
+ char tmp_buf[32] = { 0 };
+ char tv_card_name[64] = { 0 };
+ char prop_value[PROPERTY_VALUE_MAX];
+
+#ifndef BOARD_ALSA_AUDIO_TINY
+ snd_card_refresh_info();
+#endif
+
+ if (GetTvAudioCardNeedSet()) {
+ memset(prop_value, '\0', PROPERTY_VALUE_MAX);
+ property_get("snd.card.totle.num", prop_value, "0");
+
+ totle_num = strtoul(prop_value, NULL, 10);
+ LOGD("%s, totle number = %d\n", __FUNCTION__, totle_num);
+ totle_num = 8;
+
+ GetTvAudioCardName(tv_card_name);
+
+ for (i = 0; i < totle_num; i++) {
+ sprintf(tmp_buf, "snd.card.%d.name", i);
+ memset(prop_value, '\0', PROPERTY_VALUE_MAX);
+ property_get(tmp_buf, prop_value, "null");
+
+ LOGD("%s, key string \"%s\", value string \"%s\".\n", __FUNCTION__,
+ tmp_buf, prop_value);
+
+ if (strcmp(prop_value, tv_card_name) == 0) {
+ break;
+ }
+ }
+
+ capture_ind = i;
+
+ if (capture_ind == totle_num) {
+ capture_ind = -1;
+ LOGE("%s, can't find tv card \"%s\".\n", __FUNCTION__,
+ tv_card_name);
+ }
+ } else {
+ capture_ind = -1;
+ }
+
+ sprintf(tmp_buf, "%d", capture_ind);
+ property_set(gDefCapturePropName, tmp_buf);
+ LOGD("%s, set \"%s\" as \"%s\".\n", __FUNCTION__, gDefCapturePropName,
+ tmp_buf);
+
+ return 0;
+}
+
+int CTv::UnInitSetTvAudioCard()
+{
+ char tmp_buf[32] = { 0 };
+
+#ifndef BOARD_ALSA_AUDIO_TINY
+ snd_card_refresh_info();
+#endif
+ sprintf(tmp_buf, "%d", -1);
+ property_set(gDefCapturePropName, tmp_buf);
+ LOGD("%s, set \"%s\" as \"%s\".\n", __FUNCTION__, gDefCapturePropName,
+ tmp_buf);
+
+ return 0;
+}
+
+#define CS_SPDIF_MODE_DEV_PATH "/sys/class/audiodsp/digital_raw"
+
+int CTv::SetSPDIFMode(int mode_val)
+{
+ FILE *spdif_mode_fp = NULL;
+
+ spdif_mode_fp = fopen(CS_SPDIF_MODE_DEV_PATH, "w");
+ if (spdif_mode_fp == NULL) {
+ LOGE("%s, Open file %s error(%s)!\n", __FUNCTION__, CS_SPDIF_MODE_DEV_PATH, strerror(errno));
+ return -1;
+ }
+
+ if (mode_val == CC_SPDIF_MODE_PCM) {
+ fprintf(spdif_mode_fp, "%d", 0);
+ } else if (mode_val == CC_SPDIF_MODE_RAW ) {
+ fprintf(spdif_mode_fp, "%d", 1);
+ }
+
+ fclose(spdif_mode_fp);
+ spdif_mode_fp = NULL;
+
+ return 0;
+}
+
+int CTv::SwitchAVOutBypass(int sw)
+{
+ if (sw == 0 ) {
+ mAudioAlsa.SetMixerBypassSwitch ( CC_SWITCH_OFF );
+ mAudioAlsa.SetMixerDacSwitch ( CC_SWITCH_ON );
+ } else {
+ mAudioAlsa.SetMixerBypassSwitch ( CC_SWITCH_ON );
+ mAudioAlsa.SetMixerDacSwitch ( CC_SWITCH_OFF );
+ }
+ return 0;
+}
+
+int CTv::SetAudioSwitchIO(int value)
+{
+ return mAudioAlsa.SetAudioSwitchIO( value);
+}
+int CTv::SetOutput_Swap(int value)
+{
+ return mAudioAlsa.SetOutput_Swap( value);
+}
+
+int CTv::SendCmdToOffBoardFBCExternalDac(int cmd, int para)
+{
+ int set_val = 0;
+ CFbcCommunication *pFBC = GetSingletonFBC();
+ if (pFBC != NULL) {
+ if (cmd == AUDIO_CMD_SET_MUTE) {
+ if (para == CC_AUDIO_MUTE) {
+ set_val = CC_MUTE_ON;
+ } else if (para == CC_AUDIO_UNMUTE) {
+ set_val = CC_MUTE_OFF;
+ } else {
+ return -1;
+ }
+
+ return pFBC->cfbc_Set_Mute(COMM_DEV_SERIAL, set_val);
+ } else if (cmd == AUDIO_CMD_SET_VOLUME_BAR) {
+ LOGD("%s, send AUDIO_CMD_SET_VOLUME_BAR (para = %d) to fbc.\n", __FUNCTION__, para);
+ return pFBC->cfbc_Set_Volume_Bar(COMM_DEV_SERIAL, para);
+ } else if (cmd == AUDIO_CMD_SET_BALANCE) {
+ LOGD("%s, send AUDIO_CMD_SET_BALANCE (para = %d) to fbc.\n", __FUNCTION__, para);
+ return pFBC->cfbc_Set_Balance(COMM_DEV_SERIAL, para);
+ } else if (cmd == AUDIO_CMD_SET_SOURCE) {
+ LOGD("%s, send AUDIO_CMD_SET_SOURCE (para = %d) to fbc.\n", __FUNCTION__, para);
+ return pFBC->cfbc_Set_FBC_Audio_Source(COMM_DEV_SERIAL, para);
+ }
+ }
+
+ return 0;
+}
+
+int CTv::GetHdmiAvHotplugDetectOnoff()
+{
+ return m_hdmiav_hotplugdetect_en;
+}
diff --git a/tvapi/libtv/tv/CTv.h b/tvapi/libtv/tv/CTv.h
index 5dd4bf2..7210f40 100644
--- a/tvapi/libtv/tv/CTv.h
+++ b/tvapi/libtv/tv/CTv.h
@@ -1,634 +1,819 @@
-
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CDtv.h
-// @ Date : 2013-11
-// @ Author :
-
-#if !defined(_CDTV_H)
-#define _CDTV_H
-#include <stdint.h>
-#include <sys/time.h>
-#include <am_epg.h>
-#include <am_mem.h>
-#include <utils/threads.h>
-#include "CTvProgram.h"
-#include "CTvEpg.h"
-#include "CTvScanner.h"
-#include "CTvLog.h"
-#include "CTvTime.h"
-#include "CTvEvent.h"
-#include "CTvEv.h"
-#include "CTvBooking.h"
-#include "CFrontEnd.h"
-#include "../vpp/CVpp.h"
-#include "../vpp/CPQdb.h"
-#include "../tvin/CTvin.h"
-#include "../tvutils/CMsgQueue.h"
-#include "../tvutils/CSerialCommunication.h"
-#include "../tvutils/serial_operate.h"
-#include "CTvRecord.h"
-#include "CTvSubtitle.h"
-#include "CUpgradeFBC.h"
-#include "CAv.h"
-#include "CTvDmx.h"
-#include "../audio/audio_api.h"
-#include "AutoBackLight.h"
-using namespace android;
-
-static const char *TV_CONFIG_FILE_PATH = "/param/tvconfig.conf";
-static const char *TV_DB_PATH = "/param/dtv.db";
-static const char *TV_CONFIG_FILE_SYSTEM_PATH = "/system/etc/tvconfig.conf";
-static const char *TV_CONFIG_FILE_PARAM_PATH = "/param/tvconfig.conf";
-static const char *TV_CHANNEL_LIST_SYSTEM_PATH = "/system/etc/tv_default.xml";
-static const char *TV_CHANNEL_LIST_PARAM_PATH = "/param/tv_default.xml";
-static const char *TV_SSM_DATA_SYSTEM_PATH = "/system/etc/ssm_data";
-static const char *TV_SSM_DATA_PARAM_PATH = "/param/ssm_data";
-
-#define DEVICE_CLASS_TSYNC_AV_THRESHOLD_MIN "/sys/class/tsync/av_threshold_min"
-#define AV_THRESHOLD_MIN_MS "540000" //6S = 6*90000
-
-#define DEFAULT_COMPENSATION_VALUE 0
-
-
-typedef enum tv_fmt_ratio_e {
- RATIO_43,
- RATIO_169,
- RATIO_MAX,
-} tv_fmt_ratio_t;
-
-typedef enum tv_color_fmt_e {
- COLOR_RGB444,
- COLOR_YUV422,
- COLOR_YUV444,
- COLOR_MAX,
-} tv_color_fmt_t;
-
-
-
-typedef enum tv_window_mode_e {
- NORMAL_WONDOW,
- PREVIEW_WONDOW,
-} tv_window_mode_t;
-
-typedef enum tv_dtv_scan_running_status_e {
- DTV_SCAN_RUNNING_NORMAL,
- DTV_SCAN_RUNNING_ANALYZE_CHANNEL,
-} tv_dtv_scan_running_status_t;
-
-typedef struct tv_config_s {
- unsigned int overscan_3d;
- unsigned int tv_out_counter;
- bool kernelpet_disable;
- unsigned int kernelpet_timeout;
- bool userpet;
- unsigned int userpet_timeout;
- unsigned int userpet_reset;
- unsigned int dtv_videopath_switch;
- bool title_shake;
- bool memory512m;
-} tv_config_t;
-
-typedef enum TvRunStatus_s {
- TV_INIT_ED = -1,
- TV_OPEN_ED = 0,
- TV_START_ED ,
- TV_RESUME_ED,
- TV_PAUSE_ED,
- TV_STOP_ED,
- TV_CLOSE_ED,
-} TvRunStatus_t;
-
-class CTv : public CTvin::CTvinSigDetect::ISigDetectObserver, public CTvin::CSourceConnectDetect::ISourceConnectObserver, public CTvin::CHDMIRxCEC::IHDMIRxCECObserver, public CUpgradeFBC::IUpgradeFBCObserver, public CSerialCommunication::ISerialCommunicationObserver {
-public:
- static const int TV_ACTION_NULL = 0x0000;
- static const int TV_ACTION_STARTING = 0x0001;
- static const int TV_ACTION_STOPING = 0x0002;
- static const int TV_ACTION_SCANNING = 0x0004;
- static const int TV_ACTION_PLAYING = 0x0008;
- static const int TV_ACTION_RECORDING = 0x0010;
- static const int TV_ACTION_SOURCE_SWITCHING = 0x0020;
-public:
- class TvIObserver {
- public:
- TvIObserver() {};
- virtual ~TvIObserver() {};
- virtual void onTvEvent ( const CTvEv &ev ) = 0;
- };
- //main
- CTv();
- virtual ~CTv();
- virtual int OpenTv ( void );
- virtual int CloseTv ( void );
- virtual int StartTvLock ();
- virtual int StopTvLock ( void );
- virtual TvRunStatus_t GetTvStatus();
- virtual int ClearAnalogFrontEnd();
- virtual tv_source_input_t GetLastSourceInput (void);
- virtual int SetSourceSwitchInput (tv_source_input_t source_input );
- virtual tv_source_input_t GetCurrentSourceInputLock ( void );
- virtual tvin_info_t GetCurrentSignalInfo ( void );
- virtual int SetPreviewWindow ( tvin_window_pos_t pos );
- virtual int dtvAutoScan();
- virtual int dtvManualScan (int beginFreq, int endFreq, int modulation = -1);
- virtual int atvAutoScan(int videoStd, int audioStd, int searchType);
- virtual int clearAllProgram(int arg0);
- virtual int clearDbAllProgramInfoTable();
- virtual void setSourceSwitchAndPlay();
- virtual int GetDisplayResolutionConfig();
- virtual int GetDisplayResolutionInfo();
- virtual int atvMunualScan ( int startFreq, int endFreq, int videoStd, int audioStd, int store_Type = 0, int channel_num = 0 );
- virtual int stopScanLock();
- virtual int dtvAutoScanAtscLock(int attenna, int videoStd, int audioStd);
- virtual void SetRecordFileName ( char *name );
- virtual void StartToRecord();
- virtual void StopRecording();
- virtual void SetRecCurTsOrCurProgram ( int sel );
- virtual int startCC(int country, int src, int channel, int service);
- virtual int stopCC();
- virtual void printDebugInfo();
- virtual int playProgramLock ( int progId );
- virtual int playDvbcProgram ( int progId );
- virtual int playDtmbProgram ( int progId );
- virtual int playAtvProgram ( int, int, int, int);
- virtual int playDtvProgram ( int, int, int, int, int, int, int, int, int);
- virtual int stopPlayingLock();
- virtual int resetFrontEndPara ( frontend_para_set_t feParms );
- int SetCurProgramAudioVolumeCompensationVal ( int tmpVal );
- int GetAudioVolumeCompensationVal(int progDbId);
- //dtv audio track info
- int getAudioTrackNum ( int progId );
- int getAudioInfoByIndex ( int progId, int idx, int *pAFmt, String8 &lang );
- int switchAudioTrack ( int progId, int idx );
- int getVideoFormatInfo ( int *pWidth, int *pHeight, int *pFPS, int *pInterlace );
- int ResetAudioDecoderForPCMOutput();
- int setAudioChannel ( int channelIdx );
- int getAudioChannel();
- int setTvObserver (TvIObserver *ob);
- int getAtscAttenna();
- long getTvTime()
- {
- return mTvTime.getTime();
- };
- void getFrontendStatus();
- int getFrontendSignalStrength();
- int getFrontendSNR();
- int getFrontendBER();
- int getChannelInfoBydbID ( int dbID, channel_info_t &chan_info );
- int setBlackoutEnable(int enable);
- int getSaveBlackoutEnable();
- void startAutoBackLight();
- void stopAutoBackLight();
- int getAutoBackLight_on_off();
- int saveATVProgramID ( int dbID );
- int getATVProgramID ( void );
- int saveDTVProgramID ( int dbID );
- int getDTVProgramID ( void );
- int getCurPlayProgId();
- int getATVMinMaxFreq ( int *scanMinFreq, int *scanMaxFreq );
-
- int Tv_SSMRestoreDefaultSetting();
-
- //
- int GetSourceConnectStatus(int source_input);
- int IsDVISignal();
- int isVgaFmtInHdmi();
- //
- int getHDMIFrameRate ( void );
- void RefreshAudioMasterVolume ( tv_source_input_t source_input );
-
- int Tv_Set3DMode ( VIDEO_3D_MODE_T mode );
- VIDEO_3D_MODE_T Tv_Get3DMode ( void );
- int Tv_Set3DLRSwith ( int on_off);
- int Tv_Get3DLRSwith ( void );
- int Tv_Set3DTo2DMode ( int mode);
- int Tv_Get3DTo2DMode ( void );
- int Tv_Set3DDepth ( int value );
- int GetSave3DDepth ( void );
- is_3d_type_t Check2Dor3D ( VIDEO_3D_MODE_T mode3d, tvin_trans_fmt_t trans_fmt );
- int Tvin_SetPLLValues ();
- int SetCVD2Values ();
- unsigned int Vpp_GetDisplayResolutionInfo(tvin_window_pos_t *win_pos);
- int get_hdmi_sampling_rate();
- //SSM
- int Tv_SSMFacRestoreDefaultSetting();
-
- CTvin::CTvinSigDetect mSigDetectThread;
- CTvin::CSourceConnectDetect mSourceConnectDetectThread;
- CTvin::CHDMIRxCEC mHDMIRxCEC;
- CUpgradeFBC *mpUpgradeFBC;
- CSerialCommunication mSerialA;
- CSerialCommunication mSerialB;
- CSerialCommunication mSerialC;
-
- int SendHDMIRxCECCustomMessage(unsigned char data_buf[]);
- int SendHDMIRxCECCustomMessageAndWaitReply(unsigned char data_buf[], unsigned char reply_buf[], int WaitCmd, int timeout);
- int SendHDMIRxCECBoradcastStandbyMessage();
- int SendHDMIRxCECGiveCECVersionMessage(tv_source_input_t source_input, unsigned char data_buf[]);
- int SendHDMIRxCECGiveDeviceVendorIDMessage(tv_source_input_t source_input, unsigned char data_buf[]);
- int SendHDMIRxCECGiveOSDNameMessage(tv_source_input_t source_input, unsigned char data_buf[]);
-
- int GetHdmiHdcpKeyKsvInfo(int data_buf[]);
- int StartUpgradeFBC(char *file_name, int mode, int upgrade_blk_size);
- int SetSerialSwitch(int dev_id, int switch_val);
- int SendSerialData(int dev_id, int data_len, unsigned char data_buf[]);
- int ChannelExport(const char *destPath);
- int ChannelImport(const char *srcPath);
- int Tv_GetProjectInfo(project_info_t *ptrInfo);
- int Tv_GetPlatformType();
- int Tv_SetDDDRCMode(tv_source_input_t source_input);
- int Tv_SetAudioSourceType (tv_source_input_t source_input);
-
- //PQ
- int Tv_SetBrightness ( int brightness, tv_source_input_type_t source_type, int is_save );
- int Tv_GetBrightness ( tv_source_input_type_t source_type );
- int Tv_SetContrast ( int contrast, tv_source_input_type_t source_type, int is_save );
- int Tv_GetContrast ( tv_source_input_type_t source_type );
- int Tv_SetSaturation ( int satuation, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, int is_save );
- int Tv_GetSaturation ( tv_source_input_type_t source_type );
- int Tv_SetHue ( int hue, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, int is_save );
- int Tv_GetHue ( tv_source_input_type_t source_type );
- int Tv_SetPQMode ( vpp_picture_mode_t mode, tv_source_input_type_t source_type, int is_save );
- vpp_picture_mode_t Tv_GetPQMode ( tv_source_input_type_t source_type );
- int Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int en, int is_save );
- int Tv_GetSharpness ( tv_source_input_type_t source_type );
- int Tv_SaveSharpness ( int value, tv_source_input_type_t source_type, int is_enable );
- int Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save );
- int Tv_GetBacklight ( tv_source_input_type_t source_type );
- int Tv_SetColorTemperature ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type, int is_save );
- vpp_color_temperature_mode_t Tv_GetColorTemperature ( tv_source_input_type_t source_type );
- int Tv_SaveColorTemp ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type );
- int Tv_SetDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save );
- vpp_display_mode_t Tv_GetDisplayMode ( tv_source_input_type_t source_type );
- int Tv_SaveDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type );
- int Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type, int is_save );
- vpp_noise_reduction_mode_t Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type );
- int Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type );
- int Tv_SetRGBOGO_PostOffset(int type, int offset);
- int Tv_SetRGBOGO_Gain(int type, int gain);
- int Tv_GetRGBOGO_PostOffset ( int type );
- int Tv_GetRGBOGO_Gain ( int type );
- //
- int Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness );
- int Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode );
- int Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast );
- int Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode );
- int Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation );
- int Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode );
- int Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue );
- int Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode );
- int Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness );
- int Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode );
- int Tv_FactorySetColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain );
- int Tv_FactorySaveColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain );
- int Tv_FactoryGetColorTemp_Rgain ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain );
- int Tv_FactorySaveColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain );
- int Tv_FactoryGetColorTemp_Ggain ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain );
- int Tv_FactorySaveColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain );
- int Tv_FactoryGetColorTemp_Bgain ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset );
- int Tv_FactorySaveColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset );
- int Tv_FactoryGetColorTemp_Roffset ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset );
- int Tv_FactorySaveColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset );
- int Tv_FactoryGetColorTemp_Goffset ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset );
- int Tv_FactorySaveColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset );
- int Tv_FactoryGetColorTemp_Boffset ( int source_type, int colortemp_mode );
- int GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params );
- int Tv_FactorySetTestPattern ( int pattern );
- int Tv_FactoryGetTestPattern ( void );
- int Tv_FactoryResetPQMode ( void );
- int Tv_FactoryResetColorTemp ( void );
- int Tv_FactorySetParamsDefault ( void );
- int Tv_FactorySetDDRSSC ( int step );
- int Tv_FactoryGetDDRSSC ( void );
- int Tv_FactorySetLVDSSSC ( int step );
- int Tv_FactoryGetLVDSSSC ( void );
- int Tv_FactorySetNolineParams ( int noline_params_type, int source_type, noline_params_t noline_params );
- noline_params_t Tv_FactoryGetNolineParams ( int noline_params_type, int source_type );
- int Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t );
- tvin_cutwin_t Tv_FactoryGetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt );
- //end PQ
-
- //TV TO FBC
- int Tv_FactorySet_FBC_Brightness ( int value );
- int Tv_FactoryGet_FBC_Brightness ( void );
- int Tv_FactorySet_FBC_Contrast( int value );
- int Tv_FactoryGet_FBC_Contrast ( void );
- int Tv_FactorySet_FBC_Saturation( int value );
- int Tv_FactoryGet_FBC_Saturation ( void );
- int Tv_FactorySet_FBC_HueColorTint( int value );
- int Tv_FactoryGet_FBC_HueColorTint ( void );
- int Tv_FactorySet_FBC_Backlight ( int value );
- int Tv_FactoryGet_FBC_Backlight ( void );
- int Tv_FactorySet_FBC_Backlight_N360 ( int value );
- int Tv_FactoryGet_FBC_Backlight_N360 ( void );
- int Tv_FactorySet_FBC_ELEC_MODE( int value );
- int Tv_FactoryGet_FBC_ELEC_MODE( void );
- int Tv_FactorySet_FBC_Picture_Mode ( int mode );
- int Tv_FactoryGet_FBC_Picture_Mode ( void );
- int Tv_FactorySet_FBC_Set_Test_Pattern ( int mode );
- int Tv_FactoryGet_FBC_Get_Test_Pattern ( void );
- int Tv_FactorySet_FBC_Gain_Red( int value );
- int Tv_FactoryGet_FBC_Gain_Red ( void );
- int Tv_FactorySet_FBC_Gain_Green( int value );
- int Tv_FactoryGet_FBC_Gain_Green( void );
- int Tv_FactorySet_FBC_Gain_Blue( int value );
- int Tv_FactoryGet_FBC_Gain_Blue ( void );
- int Tv_FactorySet_FBC_Offset_Red( int value );
- int Tv_FactoryGet_FBC_Offset_Red ( void );
- int Tv_FactorySet_FBC_Offset_Green( int value );
- int Tv_FactoryGet_FBC_Offset_Green( void );
- int Tv_FactorySet_FBC_Offset_Blue( int value );
- int Tv_FactoryGet_FBC_Offset_Blue ( void );
- int Tv_FactoryGetWhiteBalanceRedGain(int source_type, int colortemp_mode);
- int Tv_FactoryGetWhiteBalanceGreenGain(int source_type, int colortemp_mode);
- int Tv_FactoryGetWhiteBalanceBlueGain(int source_type, int colortemp_mode);
- int Tv_FactoryGetWhiteBalanceRedOffset(int source_type, int colortemp_mode);
- int Tv_FactoryGetWhiteBalanceGreenOffset(int source_type, int colortemp_mode);
- int Tv_FactoryGetWhiteBalanceBlueOffset(int source_type, int colortemp_mode);
- int Tv_FactorySetWhiteBalanceRedGain(int source_type, int colortemp_mode, int value);
- int Tv_FactorySetWhiteBalanceGreenGain(int source_type, int colortemp_mode, int value);
- int Tv_FactorySetWhiteBalanceBlueGain(int source_type, int colortemp_mode, int value);
- int Tv_FactorySetWhiteBalanceRedOffset(int source_type, int colortemp_mode, int value);
- int Tv_FactorySetWhiteBalanceGreenOffset(int source_type, int colortemp_mode, int value);
- int Tv_FactorySetWhiteBalanceBlueOffset(int source_type, int colortemp_mode, int value);
- int Tv_FactorySetWhiteBalanceColorTempMode(int source_type, int colortemp_mode, int is_save);
- int Tv_FactoryGetWhiteBalanceColorTempMode(int source_type );
- int Tv_FactoryWhiteBalanceFormatInputFbcGainParams(int value);
- int Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(int value);
- int Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(int value);
- int Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(int value);
- int Tv_FactorySaveWhiteBalancePramas(int source_type, int tempmode, int r_gain, int g_gain, int b_gain, int r_offset, int g_offset, int b_offset);
- int Tv_FactoryCloseWhiteBalanceGrayPattern();
- int Tv_FactoryOpenWhiteBalanceGrayPattern();
- int Tv_FactorySetWhiteBalanceGrayPattern(int value);
- int Tv_FactoryGetWhiteBalanceGrayPattern();
- int Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(int Tempmode);
- int Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(int Tempmode);
- int Tv_FactoryWhiteBalanceGetAllParams(int Tempmode, tcon_rgb_ogo_t *params);
- int Tv_FactorySet_FBC_GrayPattern(int value);
- int Tv_FactoryOpen_FBC_GrayPattern();
- int Tv_FactoryClose_FBC_GrayPattern();
- int Tv_FactorySet_FBC_ColorTemp_Mode( int mode );
- int Tv_FactoryGet_FBC_ColorTemp_Mode ( void );
- int Tv_FactorySet_FBC_ColorTemp_Mode_N360( int mode );
- int Tv_FactoryGet_FBC_ColorTemp_Mode_N360 ( void );
- int Tv_FactorySet_FBC_WB_Initial( int status );
- int Tv_FactoryGet_FBC_WB_Initial ( void );
- int Tv_FactorySet_FBC_ColorTemp_Batch(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params);
- int Tv_FactoryGet_FBC_ColorTemp_Batch ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params );
- int Tv_FactorySet_WB_G9_To_FBC( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params );
- int Tv_FactoryGet_WB_G9_To_FBC ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params );
- int Tv_FactoryGetItemFromBatch(vpp_color_temperature_mode_t colortemp_mode, int item);
- int Tv_FactorySet_FBC_CM_OnOff( unsigned char status );
- int Tv_FactoryGet_FBC_CM_OnOff (void);
- int Tv_FactorySet_FBC_DNLP_OnOff( unsigned char status );
- int Tv_FactoryGet_FBC_DNLP_OnOff (void);
- int Tv_FactorySet_FBC_Gamma_OnOff( unsigned char status );
- int Tv_FactoryGet_FBC_Gamma_OnOff (void);
- int Tv_FactorySet_FBC_WhiteBalance_OnOff( unsigned char status );
- int Tv_FactoryGet_FBC_WhiteBalance_OnOff (void);
- int Tv_FactorySet_FBC_Thermal_State( int value );
- int Tv_FactorySet_FBC_backlight_onoff(int value);
- int Tv_FactoryGet_FBC_backlight_onoff ( void );
- int Tv_FactorySet_FBC_LVDS_SSG_Set( int value );
- int Tv_FactorySet_FBC_LightSensor_Status_N310 ( int value );
- int Tv_FactoryGet_FBC_LightSensor_Status_N310 ( void );
- int Tv_FactorySet_FBC_Dream_Panel_Status_N310 ( int value );
- int Tv_FactoryGet_FBC_Dream_Panel_Status_N310 ( void );
- int Tv_FactorySet_FBC_MULT_PQ_Status_N310 ( int value );
- int Tv_FactoryGet_FBC_MULT_PQ_Status_N310 ( void );
- int Tv_FactorySet_FBC_MEMC_Status_N310 ( int value );
- int Tv_FactoryGet_FBC_MEMC_Status_N310 ( void );
- //end TV TO FBC
-
- //audio
- int SetAudioMuteForSystem(int muteOrUnmute);
- int GetAudioMuteForSystem();
- int SetAudioAVOutMute(int muteStatus);
- int GetAudioAVOutMute();
- int SetAudioSPDIFMute(int muteStatus);
- int GetAudioSPDIFMute();
- int SetAudioMasterVolume(int tmp_vol);
- int GetAudioMasterVolume();
- int SaveCurAudioMasterVolume(int tmp_vol);
- int GetCurAudioMasterVolume();
- int SetAudioBalance(int tmp_val);
- int GetAudioBalance();
- int SaveCurAudioBalance(int tmp_val);
- int GetCurAudioBalance();
- int SetAudioSupperBassVolume(int tmp_vol);
- int GetAudioSupperBassVolume();
- int SaveCurAudioSupperBassVolume(int tmp_vol);
- int GetCurAudioSupperBassVolume();
- int SetAudioSupperBassSwitch(int tmp_val);
- int GetAudioSupperBassSwitch();
- int SaveCurAudioSupperBassSwitch(int tmp_val);
- int GetCurAudioSupperBassSwitch();
- int SetAudioSRSSurround(int tmp_val);
- int GetAudioSRSSurround();
- int SaveCurAudioSrsSurround(int tmp_val);
- int GetCurAudioSRSSurround();
- int SetAudioSrsDialogClarity(int tmp_val);
- int GetAudioSrsDialogClarity();
- int SaveCurAudioSrsDialogClarity(int tmp_val);
- int GetCurAudioSrsDialogClarity();
- int SetAudioSrsTruBass(int tmp_val);
- int GetAudioSrsTruBass();
- int SaveCurAudioSrsTruBass(int tmp_val);
- int GetCurAudioSrsTruBass();
- int SetAudioBassVolume(int tmp_vol);
- int GetAudioBassVolume();
- int SaveCurAudioBassVolume(int tmp_vol);
- int GetCurAudioBassVolume();
- int SetAudioTrebleVolume(int tmp_vol);
- int GetAudioTrebleVolume();
- int SaveCurAudioTrebleVolume(int tmp_vol);
- int GetCurAudioTrebleVolume();
- int SetAudioSoundMode(int tmp_val);
- int GetAudioSoundMode();
- int SaveCurAudioSoundMode(int tmp_val);
- int GetCurAudioSoundMode();
- int SetAudioWallEffect(int tmp_val);
- int GetAudioWallEffect();
- int SaveCurAudioWallEffect(int tmp_val);
- int GetCurAudioWallEffect();
- int SetAudioEQMode(int tmp_val);
- int GetAudioEQMode();
- int SaveCurAudioEQMode(int tmp_val);
- int GetCurAudioEQMode();
- int GetAudioEQRange(int range_buf[]);
- int SetAudioEQGain(int gain_buf[]);
- int GetAudioEQGain(int gain_buf[]);
- int SaveCurAudioEQGain(int gain_buf[]);
- int GetCurAudioEQGain(int gain_buf[]);
- int GetAudioEQBandCount();
- int SetAudioEQSwitch(int switch_val);
- int SetAudioSPDIFSwitch(int tmp_val);
- int amAudioSetDoubleOutputSwitch(int en_val);
- int UsbAudioOuputModuleSwitch(int sw);
- int GetAmAudioSetDoubleOutputSwitch();
- int GetCurUsbAudioOuputModuleSwitch();
- int SaveCurAudioSPDIFSwitch(int tmp_val);
- int GetCurAudioSPDIFSwitch();
- int SetAudioSPDIFMode(int tmp_val);
- int SaveCurAudioSPDIFMode(int tmp_val);
- int GetCurAudioSPDIFMode();
- int OpenAmAudio(unsigned int sr, int output_device);
- int CloseAmAudio(void);
- int SetAmAudioInputSr(unsigned int sr, int output_device);
- int SetAmAudioOutputMode(int mode);
- int SetAmAudioMusicGain(int gain);
- int SetAmAudioLeftGain(int gain);
- int SetAmAudioRightGain(int gain);
- int AudioLineInSelectChannel(int audio_channel);
- int SetKalaokIO(int level);
- int AudioSetAudioInSource(int audio_src_in_type);
- int AudioSetLineInCaptureVolume(int l_vol, int r_vol);
- int AudioHandleHeadsetPlugIn();
- int AudioHandleHeadsetPullOut();
- //end audio
-
-protected:
- class CTvMsgQueue: public CMsgQueueThread, public CAv::IObserver, public CTvScanner::IObserver , public CTvEpg::IObserver, public CFrontEnd::IObserver {
- public:
- static const int TV_MSG_COMMON = 0;
- static const int TV_MSG_STOP_ANALYZE_TS = 1;
- static const int TV_MSG_START_ANALYZE_TS = 2;
- static const int TV_MSG_CHECK_FE_DELAY = 3;
- static const int TV_MSG_AV_EVENT = 4;
- static const int TV_MSG_FE_EVENT = 5;
- static const int TV_MSG_SCAN_EVENT = 6;
- static const int TV_MSG_EPG_EVENT = 7;
-
- CTvMsgQueue(CTv *tv);
- ~CTvMsgQueue();
- //scan observer
- void onEvent ( const CTvScanner::ScannerEvent &ev );
- //epg observer
- void onEvent ( const CTvEpg::EpgEvent &ev );
- //FE observer
- void onEvent ( const CFrontEnd::FEEvent &ev );
- //AV
- void onEvent(const CAv::AVEvent &ev);
- private:
- virtual void handleMessage ( CMessage &msg );
- CTv *mpTv;
- };
-
-
- int resetDmxAndAvSource();
- int stopScan();
- int stopPlaying();
- void sendTvEvent ( const CTvEv &ev );
- int startPlayTv ( int source, int vid, int aid, int vfat, int afat );
- //scan observer
- void onEvent ( const CTvScanner::ScannerEvent &ev );
- //epg observer
- void onEvent ( const CTvEpg::EpgEvent &ev );
- //FE observer
- void onEvent ( const CFrontEnd::FEEvent &ev );
- //AV
- void onEvent(const CAv::AVEvent &ev);
- bool Tv_Start_Analyze_Ts ( int channelID );
- bool Tv_Stop_Analyze_Ts();
- int Tvin_Stop ( void );
- int SetBypassModulesFor3D ( VIDEO_3D_MODE_E );
- int Vpp_SetDisplayMode ( vpp_display_mode_t display_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt );
- int Tvin_GetTvinConfig();
- int Tv_init_audio();
- int Tv_MiscSetBySource ( tv_source_input_t );
- void print_version_info ( void );
- int dtvCleanProgramByFreq ( int freq );
- /*********************** Audio start **********************/
- int SetAudioMainVolLutBufName();
- int SetAudioSupperBassVolLutBufName();
- int SetAudioVolDigitLUTBuf ( tv_source_input_t source_input );
- int Tv_SetAudioInSource (tv_source_input_t source_input);
- void Tv_SetAudioOutputSwap_Type (tv_source_input_t source_input);
- /*********************** Audio end **********************/
-
- //
- virtual void onSigToStable();
- virtual void onSigStableToUnstable();
- virtual void onSigStableToUnSupport();
- virtual void onSigStableToNoSig();
- virtual void onSigUnStableToUnSupport();
- virtual void onSigUnStableToNoSig();
- virtual void onSigNullToNoSig();
- virtual void onSigNoSigToUnstable();
- virtual void onSigStillStable();
- virtual void onSigStillUnstable();
- virtual void onSigStillNosig();
- virtual void onSigStillNoSupport();
- virtual void onSigStillNull();
- virtual void onStableSigFmtChange();
- virtual void onStableTransFmtChange();
- virtual void onSigDetectEnter();
- virtual void onLoop();
-
- virtual void onSourceConnect(int source_type, int connect_status);
- virtual void onHDMIRxCECMessage(int msg_len, unsigned char msg_buf[]);
- virtual void onUpgradeStatus(int status, int progress);
- virtual void onSerialCommunication(int dev_id, int rd_len, unsigned char data_buf[]);
- virtual void onThermalDetect(int state);
-
- CTvEpg mTvEpg;
- CTvScanner mTvScanner;
- mutable Mutex mLock;
- CTvTime mTvTime;
- CVpp mVpp;
- CTvin mTvin;
- CTvRecord mTvRec;
- CFrontEnd mFrontDev;
- CTvDimension mTvVchip;
- CTvSubtitle mTvSub;
- CTvAudio mTvAudio;
- CAv mAv;
- CTvDmx mTvDmx;
- CTvMsgQueue mTvMsgQueue;
- AutoBackLight mAutoBackLight;
- //
- volatile int mTvAction;
- volatile TvRunStatus_t mTvStatus;
- volatile tv_source_input_t m_source_input;
- volatile tv_source_input_t m_last_source_input;
- /* for tvin window mode and pos*/
- tvin_window_pos_t m_win_pos;
- tv_window_mode_t m_win_mode;
- int m_blackout_enable;//1 enable 0 disable
- int m_cur_playing_prog_id;
- tvin_sig_fmt_t m_cur_set_info_fmt;
- bool mIsFbc;
-
-
- bool mlastlockstatus;
- String8 mlastdm;
- String8 mlastabbrev;
- String8 mlastabbtext;
- pthread_t vchipthread;
- int mvchip_running;
- friend class CTvMsgQueue;
- int mCurAnalyzeTsChannelID;
- int audio_sr;
- TvIObserver *mpObserver;
- tv_dtv_scan_running_status_t mDtvScanRunningStatus;
- volatile tv_config_t gTvinConfig;
- int dtv_auto_3d_flag;
- bool m_autoset_displayfreq;
- int m_sig_stable_nums;
- bool m_is_set_hdmi_edid;
- /** for L/R or B/T 3d mode overscan **/
- /** for 3D **/
- VIDEO_3D_MODE_T m_mode_3d;
- /** for HDMI-in sampling detection. **/
- volatile bool m_is_hdmi_sr_detect_start;
- int m_hdmi_sampling_rate;
-};
-
-#endif //_CDTV_H
+
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CDtv.h
+// @ Date : 2013-11
+// @ Author :
+
+#if !defined(_CDTV_H)
+#define _CDTV_H
+#include <stdint.h>
+#include <sys/time.h>
+#include <am_epg.h>
+#include <am_mem.h>
+#include <utils/threads.h>
+#include "CTvProgram.h"
+#include "CTvEpg.h"
+#include "CTvScanner.h"
+#include "CTvLog.h"
+#include "CTvTime.h"
+#include "CTvEvent.h"
+#include "CTvEv.h"
+#include "CTvBooking.h"
+#include "CFrontEnd.h"
+#include "../vpp/CVpp.h"
+#include "../vpp/CPQdb.h"
+#include "../tvin/CTvin.h"
+#include "../tvutils/CMsgQueue.h"
+#include "../tvutils/CSerialCommunication.h"
+#include "../tvutils/serial_operate.h"
+#include "CTvRecord.h"
+#include "CTvSubtitle.h"
+#include "CUpgradeFBC.h"
+#include "CAv.h"
+#include "CTvDmx.h"
+#include "../audio/CTvAudio.h"
+#include "AutoBackLight.h"
+#include "CAutoPQparam.h"
+#include "tvin/CSourceConnectDetect.h"
+using namespace android;
+
+static const char *TV_CONFIG_FILE_PATH = "/param/tvconfig.conf";
+static const char *TV_DB_PATH = "/param/dtv.db";
+static const char *TV_CONFIG_FILE_SYSTEM_PATH = "/system/etc/tvconfig.conf";
+static const char *TV_CONFIG_FILE_PARAM_PATH = "/param/tvconfig.conf";
+static const char *TV_CHANNEL_LIST_SYSTEM_PATH = "/system/etc/tv_default.xml";
+static const char *TV_CHANNEL_LIST_PARAM_PATH = "/param/tv_default.xml";
+static const char *TV_SSM_DATA_SYSTEM_PATH = "/system/etc/ssm_data";
+static const char *TV_SSM_DATA_PARAM_PATH = "/param/ssm_data";
+
+#define DEVICE_CLASS_TSYNC_AV_THRESHOLD_MIN "/sys/class/tsync/av_threshold_min"
+#define AV_THRESHOLD_MIN_MS "540000" //6S = 6*90000
+
+
+
+
+typedef enum tv_fmt_ratio_e {
+ RATIO_43,
+ RATIO_169,
+ RATIO_MAX,
+} tv_fmt_ratio_t;
+
+typedef enum tv_color_fmt_e {
+ COLOR_RGB444,
+ COLOR_YUV422,
+ COLOR_YUV444,
+ COLOR_MAX,
+} tv_color_fmt_t;
+
+
+
+typedef enum tv_window_mode_e {
+ NORMAL_WONDOW,
+ PREVIEW_WONDOW,
+} tv_window_mode_t;
+
+typedef enum tv_dtv_scan_running_status_e {
+ DTV_SCAN_RUNNING_NORMAL,
+ DTV_SCAN_RUNNING_ANALYZE_CHANNEL,
+} tv_dtv_scan_running_status_t;
+
+typedef struct tv_config_s {
+ bool kernelpet_disable;
+ unsigned int kernelpet_timeout;
+ bool userpet;
+ unsigned int userpet_timeout;
+ unsigned int userpet_reset;
+ bool memory512m;
+} tv_config_t;
+
+typedef enum TvRunStatus_s {
+ TV_INIT_ED = -1,
+ TV_OPEN_ED = 0,
+ TV_START_ED ,
+ TV_RESUME_ED,
+ TV_PAUSE_ED,
+ TV_STOP_ED,
+ TV_CLOSE_ED,
+} TvRunStatus_t;
+
+class CTv : public CTvin::CTvinSigDetect::ISigDetectObserver, public CSourceConnectDetect::ISourceConnectObserver, public CTvin::CHDMIRxCEC::IHDMIRxCECObserver, public CUpgradeFBC::IUpgradeFBCObserver, public CSerialCommunication::ISerialCommunicationObserver, public CTvSubtitle::IObserver,public CTv2d4GHeadSetDetect::IHeadSetObserver{
+public:
+ static const int TV_ACTION_NULL = 0x0000;
+ static const int TV_ACTION_STARTING = 0x0001;
+ static const int TV_ACTION_STOPING = 0x0002;
+ static const int TV_ACTION_SCANNING = 0x0004;
+ static const int TV_ACTION_PLAYING = 0x0008;
+ static const int TV_ACTION_RECORDING = 0x0010;
+ static const int TV_ACTION_SOURCE_SWITCHING = 0x0020;
+public:
+ class TvIObserver {
+ public:
+ TvIObserver() {};
+ virtual ~TvIObserver() {};
+ virtual void onTvEvent ( const CTvEv &ev ) = 0;
+ };
+ //main
+ CTv();
+ virtual ~CTv();
+ virtual int OpenTv ( void );
+ virtual int CloseTv ( void );
+ virtual int StartTvLock ();
+ virtual int StopTvLock ( void );
+ virtual int DoSuspend(int type);
+ virtual int DoResume(int type);
+ virtual int DoInstabootSuspend();
+ virtual int DoInstabootResume();
+ virtual TvRunStatus_t GetTvStatus();
+ virtual int ClearAnalogFrontEnd();
+ virtual tv_source_input_t GetLastSourceInput (void);
+ virtual int SetSourceSwitchInput (tv_source_input_t source_input );
+ virtual tv_source_input_t GetCurrentSourceInputLock ( void );
+ virtual tvin_info_t GetCurrentSignalInfo ( void );
+ virtual int SetPreviewWindow ( tvin_window_pos_t pos );
+ virtual int dtvAutoScan();
+ virtual int dtvManualScan (int beginFreq, int endFreq, int modulation = -1);
+ virtual int atvAutoScan(int videoStd, int audioStd, int searchType);
+ virtual int clearAllProgram(int arg0);
+ virtual int clearDbAllProgramInfoTable();
+ virtual void setSourceSwitchAndPlay();
+ virtual int GetDisplayResolutionConfig();
+ virtual int GetDisplayResolutionInfo();
+ virtual int atvMunualScan ( int startFreq, int endFreq, int videoStd, int audioStd, int store_Type = 0, int channel_num = 0 );
+ virtual int stopScanLock();
+ virtual int dtvAutoScanAtscLock(int attenna, int videoStd, int audioStd);
+ virtual void SetRecordFileName ( char *name );
+ virtual void StartToRecord();
+ virtual void StopRecording();
+ virtual void SetRecCurTsOrCurProgram ( int sel );
+ virtual int startCC(int country, int src, int channel, int service);
+ virtual int stopCC();
+ virtual void printDebugInfo();
+ virtual int playProgramLock ( int progId );
+ virtual int playDvbcProgram ( int progId );
+ virtual int playDtmbProgram ( int progId );
+ virtual int playAtvProgram ( int, int, int, int, int);
+ virtual int playDtvProgram ( int, int, int, int, int, int, int, int, int, int);
+ virtual int stopPlayingLock();
+ virtual int resetFrontEndPara ( frontend_para_set_t feParms );
+ virtual int SetDisplayMode ( vpp_display_mode_t display_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt );
+ virtual void startAutoBackLight();
+ virtual void stopAutoBackLight();
+ virtual const char *getPqDbPath();
+ virtual void onHdmiSrChanged(int sr, bool bInit);
+ virtual void onHMDIAudioStatusChanged(int status);
+ virtual int GetATVAFCType();
+ virtual int GetATVSourceTimerSwitch();
+ int SetCurProgramAudioVolumeCompensationVal ( int tmpVal );
+ int GetAudioVolumeCompensationVal(int progDbId);
+ //dtv audio track info
+ int getAudioTrackNum ( int progId );
+ int getAudioInfoByIndex ( int progId, int idx, int *pAFmt, String8 &lang );
+ int switchAudioTrack ( int progId, int idx );
+ int switchAudioTrack ( int aPid, int aFmt, int aParam );
+ int getVideoFormatInfo ( int *pWidth, int *pHeight, int *pFPS, int *pInterlace );
+ int ResetAudioDecoderForPCMOutput();
+ int setAudioChannel ( int channelIdx );
+ int getAudioChannel();
+ int setTvObserver (TvIObserver *ob);
+ int getAtscAttenna();
+ long getTvTime()
+ {
+ return mTvTime.getTime();
+ };
+ void getFrontendStatus();
+ int getFrontendSignalStrength();
+ int getFrontendSNR();
+ int getFrontendBER();
+ int getChannelInfoBydbID ( int dbID, channel_info_t &chan_info );
+ int setBlackoutEnable(int enable);
+ int getSaveBlackoutEnable();
+ int getAutoBackLight_on_off();
+ int saveATVProgramID ( int dbID );
+ int getATVProgramID ( void );
+ int saveDTVProgramID ( int dbID );
+ int getDTVProgramID ( void );
+ int getCurPlayProgId();
+ int getATVMinMaxFreq ( int *scanMinFreq, int *scanMaxFreq );
+ int getAverageLuma();
+ int setAutobacklightData(const char* value);
+ int getAutoBacklightData(int* data);
+
+ virtual int Tv_SSMRestoreDefaultSetting();
+
+ //
+ int GetSourceConnectStatus(tv_source_input_t source_input);
+ int IsDVISignal();
+ int isVgaFmtInHdmi();
+ int isSDFmtInHdmi ( void );
+ //
+ int getHDMIFrameRate ( void );
+ void RefreshAudioMasterVolume ( tv_source_input_t source_input );
+
+ int Tv_Set3DMode ( VIDEO_3D_MODE_T mode );
+ VIDEO_3D_MODE_T Tv_Get3DMode ( void );
+ int Tv_Set3DLRSwith ( int on_off);
+ int Tv_Get3DLRSwith ( void );
+ int Tv_Set3DTo2DMode ( int mode);
+ int Tv_Get3DTo2DMode ( void );
+ int Tv_Set3DDepth ( int value );
+ int GetSave3DDepth ( void );
+ is_3d_type_t Check2Dor3D ( VIDEO_3D_MODE_T mode3d, tvin_trans_fmt_t trans_fmt );
+ int Tvin_SetPLLValues ();
+ int SetCVD2Values ();
+ unsigned int Vpp_GetDisplayResolutionInfo(tvin_window_pos_t *win_pos);
+ int get_hdmi_sampling_rate();
+ //SSM
+ virtual int Tv_SSMFacRestoreDefaultSetting();
+ int Tv_GetHistgram(int *histgram_buf);
+ int StartHeadSetDetect();
+ virtual void onHeadSetDetect(int state,int para);
+
+ CTvin::CTvinSigDetect mSigDetectThread;
+ CSourceConnectDetect mSourceConnectDetectThread;
+ CTvin::CHDMIRxCEC mHDMIRxCEC;
+ CUpgradeFBC *mpUpgradeFBC;
+ CSerialCommunication mSerialA;
+ CSerialCommunication mSerialB;
+ CSerialCommunication mSerialC;
+ CTvSubtitle mSubtitle;
+ CTv2d4GHeadSetDetect mHeadSet;
+
+ int SendHDMIRxCECCustomMessage(unsigned char data_buf[]);
+ int SendHDMIRxCECCustomMessageAndWaitReply(unsigned char data_buf[], unsigned char reply_buf[], int WaitCmd, int timeout);
+ int SendHDMIRxCECBoradcastStandbyMessage();
+ int SendHDMIRxCECGiveCECVersionMessage(tv_source_input_t source_input, unsigned char data_buf[]);
+ int SendHDMIRxCECGiveDeviceVendorIDMessage(tv_source_input_t source_input, unsigned char data_buf[]);
+ int SendHDMIRxCECGiveOSDNameMessage(tv_source_input_t source_input, unsigned char data_buf[]);
+
+ int GetHdmiHdcpKeyKsvInfo(int data_buf[]);
+ virtual int hdmi_out_towhat();
+ int StartUpgradeFBC(char *file_name, int mode, int upgrade_blk_size);
+ int SetSerialSwitch(int dev_id, int switch_val);
+ int SendSerialData(int dev_id, int data_len, unsigned char data_buf[]);
+ int SetDebugSerialOnOff(int on_off);
+ int GetDebugSerialOnOff();
+ int ChannelExport(const char *destPath);
+ int ChannelImport(const char *srcPath);
+ int Tv_GetProjectInfo(project_info_t *ptrInfo);
+ int Tv_GetPlatformType();
+ int Tv_HandeHDMIEDIDFilePathConfig();
+ int Tv_SetDDDRCMode(tv_source_input_t source_input);
+ int Tv_SetAudioSourceType (tv_source_input_t source_input);
+
+ //PQ
+ virtual int Tv_SetBrightness ( int brightness, tv_source_input_type_t source_type, int is_save );
+ virtual int Tv_GetBrightness ( tv_source_input_type_t source_type );
+ virtual int Tv_SaveBrightness ( int brightness, tv_source_input_type_t source_type );
+ virtual int Tv_SetContrast ( int contrast, tv_source_input_type_t source_type, int is_save );
+ virtual int Tv_GetContrast ( tv_source_input_type_t source_type );
+ virtual int Tv_SaveContrast ( int contrast, tv_source_input_type_t source_type );
+ virtual int Tv_SetSaturation ( int satuation, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, int is_save );
+ virtual int Tv_GetSaturation ( tv_source_input_type_t source_type );
+ virtual int Tv_SaveSaturation ( int satuation, tv_source_input_type_t source_type );
+ virtual int Tv_SetHue ( int hue, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, int is_save );
+ virtual int Tv_GetHue ( tv_source_input_type_t source_type );
+ virtual int Tv_SaveHue ( int hue, tv_source_input_type_t source_type );
+ virtual int Tv_SetPQMode ( vpp_picture_mode_t mode, tv_source_input_type_t source_type, int is_save );
+ virtual vpp_picture_mode_t Tv_GetPQMode ( tv_source_input_type_t source_type );
+ virtual int Tv_SavePQMode ( vpp_picture_mode_t mode, tv_source_input_type_t source_type );
+ virtual int Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int en, int is_save );
+ virtual int Tv_GetSharpness ( tv_source_input_type_t source_type );
+ virtual int Tv_SaveSharpness ( int value, tv_source_input_type_t source_type );
+ virtual int Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save );
+ virtual int Tv_GetBacklight ( tv_source_input_type_t source_type );
+ virtual int Tv_SaveBacklight ( int value, tv_source_input_type_t source_type );
+ int Tv_SetBacklight_Switch ( int value );
+ int Tv_GetBacklight_Switch ( void );
+ int Tv_SetColorTemperature ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type, int is_save );
+ vpp_color_temperature_mode_t Tv_GetColorTemperature ( tv_source_input_type_t source_type );
+ virtual int Tv_SetDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, int is_save );
+ virtual int Tv_SaveDisplayMode ( vpp_display_mode_t mode, tv_source_input_type_t source_type );
+ virtual int Tv_SaveColorTemperature ( vpp_color_temperature_mode_t mode, tv_source_input_type_t source_type );
+ virtual vpp_display_mode_t Tv_GetDisplayMode ( tv_source_input_type_t source_type );
+ virtual int Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type, int is_save );
+ virtual vpp_noise_reduction_mode_t Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type );
+ virtual int Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t mode, tv_source_input_type_t source_type );
+ int Tv_SetSplitScreenDemoStatus(tv_source_input_type_t source_type, int onoff_status);
+ int Tv_GetSplitScreenDemoStatus(tv_source_input_type_t source_type);
+ int Tv_SplitScreenEffect(int mode, int width, int reverse = 0);
+ //
+ int Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness );
+ int Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode );
+ int Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast );
+ int Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode );
+ int Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation );
+ int Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode );
+ int Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue );
+ int Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode );
+ int Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness );
+ int Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode );
+
+ int GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params );
+ int Tv_FactorySetTestPattern ( int pattern );
+ int Tv_FactoryGetTestPattern ( void );
+ int Tv_FactorySetScreenColor ( int vdin_blending_mask, int y, int u, int v );
+ int Tv_FactoryResetPQMode ( void );
+ int Tv_FactoryResetColorTemp ( void );
+ int Tv_FactorySetParamsDefault ( void );
+ int Tv_FactorySetDDRSSC ( int step );
+ int Tv_FactoryGetDDRSSC ( void );
+ int Tv_FactorySetLVDSSSC ( int step );
+ int Tv_FactoryGetLVDSSSC ( void );
+ void Tv_Spread_Spectrum(void);
+ int Tv_FactorySetNolineParams ( int noline_params_type, int source_type, noline_params_t noline_params );
+ noline_params_t Tv_FactoryGetNolineParams ( int noline_params_type, int source_type );
+ int Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t );
+ tvin_cutwin_t Tv_FactoryGetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt );
+ int Tv_ReplacePqDb(const char *newFilePath = NULL);
+ //end PQ
+
+ //TV TO FBC
+ int Tv_FactorySet_FBC_Brightness ( int value );
+ int Tv_FactoryGet_FBC_Brightness ( void );
+ int Tv_FactorySet_FBC_Contrast( int value );
+ int Tv_FactoryGet_FBC_Contrast ( void );
+ int Tv_FactorySet_FBC_Saturation( int value );
+ int Tv_FactoryGet_FBC_Saturation ( void );
+ int Tv_FactorySet_FBC_HueColorTint( int value );
+ int Tv_FactoryGet_FBC_HueColorTint ( void );
+ virtual int Tv_FactorySet_FBC_Backlight ( int value );
+ virtual int Tv_FactoryGet_FBC_Backlight ( void );
+ int Tv_FactorySet_FBC_Backlight_N360 ( int value );
+ int Tv_FactoryGet_FBC_Backlight_N360 ( void );
+ int Tv_FactorySet_FBC_ELEC_MODE( int value );
+ int Tv_FactoryGet_FBC_ELEC_MODE( void );
+ int Tv_FactorySet_FBC_BACKLIGHT_N360( int value );
+ int Tv_FactoryGet_FBC_BACKLIGHT_N360( void );
+ int Tv_FactorySet_FBC_Picture_Mode ( int mode );
+ int Tv_FactoryGet_FBC_Picture_Mode ( void );
+ int Tv_FactorySet_FBC_Set_Test_Pattern ( int mode );
+ int Tv_FactoryGet_FBC_Get_Test_Pattern ( void );
+ int Tv_FactorySet_FBC_Gain_Red( int value );
+ int Tv_FactoryGet_FBC_Gain_Red ( void );
+ int Tv_FactorySet_FBC_Gain_Green( int value );
+ int Tv_FactoryGet_FBC_Gain_Green( void );
+ int Tv_FactorySet_FBC_Gain_Blue( int value );
+ int Tv_FactoryGet_FBC_Gain_Blue ( void );
+ int Tv_FactorySet_FBC_Offset_Red( int value );
+ int Tv_FactoryGet_FBC_Offset_Red ( void );
+ int Tv_FactorySet_FBC_Offset_Green( int value );
+ int Tv_FactoryGet_FBC_Offset_Green( void );
+ int Tv_FactorySet_FBC_Offset_Blue( int value );
+ int Tv_FactoryGet_FBC_Offset_Blue ( void );
+ int Tv_FactoryGetWhiteBalanceRedGain(int source_type, int colortemp_mode);
+ int Tv_FactoryGetWhiteBalanceGreenGain(int source_type, int colortemp_mode);
+ int Tv_FactoryGetWhiteBalanceBlueGain(int source_type, int colortemp_mode);
+ int Tv_FactoryGetWhiteBalanceRedOffset(int source_type, int colortemp_mode);
+ int Tv_FactoryGetWhiteBalanceGreenOffset(int source_type, int colortemp_mode);
+ int Tv_FactoryGetWhiteBalanceBlueOffset(int source_type, int colortemp_mode);
+ int Tv_FactorySetWhiteBalanceRedGain(int source_type, int colortemp_mode, int value);
+ int Tv_FactorySetWhiteBalanceGreenGain(int source_type, int colortemp_mode, int value);
+ int Tv_FactorySetWhiteBalanceBlueGain(int source_type, int colortemp_mode, int value);
+ int Tv_FactorySetWhiteBalanceRedOffset(int source_type, int colortemp_mode, int value);
+ int Tv_FactorySetWhiteBalanceGreenOffset(int source_type, int colortemp_mode, int value);
+ int Tv_FactorySetWhiteBalanceBlueOffset(int source_type, int colortemp_mode, int value);
+ int Tv_FactorySetWhiteBalanceColorTempMode(int source_type, int colortemp_mode, int is_save);
+ int Tv_FactoryGetWhiteBalanceColorTempMode(int source_type );
+ int Tv_FactoryWhiteBalanceFormatInputFbcGainParams(int value);
+ int Tv_FactoryWhiteBalanceFormatInputFbcOffsetParams(int value);
+ int Tv_FactoryWhiteBalanceFormatOutputFbcOffsetParams(int value);
+ int Tv_FactoryWhiteBalanceFormatOutputFbcGainParams(int value);
+ int Tv_FactorySaveWhiteBalancePramas(int source_type, int tempmode, int r_gain, int g_gain, int b_gain, int r_offset, int g_offset, int b_offset);
+ int Tv_FactoryCloseWhiteBalanceGrayPattern();
+ int Tv_FactoryOpenWhiteBalanceGrayPattern();
+ int Tv_FactorySetWhiteBalanceGrayPattern(int value);
+ int Tv_FactoryGetWhiteBalanceGrayPattern();
+ int Tv_FactoryWhiteBalanceColorTempMappingG92Fbc(int Tempmode);
+ int Tv_FactoryWhiteBalanceColorTempMappingFbc2G9(int Tempmode);
+ int Tv_FactorySet_FBC_GrayPattern(int value);
+ int Tv_FactoryOpen_FBC_GrayPattern();
+ int Tv_FactoryClose_FBC_GrayPattern();
+ int Tv_FactorySet_FBC_ColorTemp_Mode( int mode );
+ int Tv_FactoryGet_FBC_ColorTemp_Mode ( void );
+ int Tv_FactorySet_FBC_ColorTemp_Mode_N360( int mode );
+ int Tv_FactoryGet_FBC_ColorTemp_Mode_N360 ( void );
+ int Tv_FactorySet_FBC_LockN_state(int value);
+ int Tv_FactorySet_FBC_WB_Initial( int status );
+ int Tv_FactoryGet_FBC_WB_Initial ( void );
+ virtual int Tv_FactorySet_FBC_ColorTemp_Batch(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params);
+ virtual int Tv_FactoryGet_FBC_ColorTemp_Batch ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params );
+ int Tv_FactorySet_WB_G9_To_FBC( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params );
+ int Tv_FactoryGet_WB_G9_To_FBC ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params );
+ int Tv_FactoryGetItemFromBatch(vpp_color_temperature_mode_t colortemp_mode, int item);
+ int Tv_FactorySet_FBC_CM_OnOff( unsigned char status );
+ int Tv_FactoryGet_FBC_CM_OnOff (void);
+ int Tv_FactorySet_FBC_DNLP_OnOff( unsigned char status );
+ int Tv_FactoryGet_FBC_DNLP_OnOff (void);
+ int Tv_FactorySet_FBC_Gamma_OnOff( unsigned char status );
+ int Tv_FactoryGet_FBC_Gamma_OnOff (void);
+ int Tv_FactorySet_FBC_WhiteBalance_OnOff( unsigned char status );
+ int Tv_FactoryGet_FBC_WhiteBalance_OnOff (void);
+ int Tv_FactorySet_FBC_Thermal_State( int value );
+ int Tv_FactorySet_FBC_backlight_onoff(int value);
+ int Tv_FactoryGet_FBC_backlight_onoff ( void );
+ int Tv_FactorySet_FBC_Auto_Backlight_OnOff(unsigned char status);
+ int Tv_FactoryGet_FBC_Auto_Backlight_OnOff ( void );
+ int Tv_FactoryGet_FBC_VIDEO_MUTE ( void );
+ int Tv_FactorySet_FBC_LVDS_SSG_Set( int value );
+ int Tv_FactorySet_FBC_LightSensor_Status_N310 ( int value );
+ int Tv_FactoryGet_FBC_LightSensor_Status_N310 ( void );
+ int Tv_FactorySet_FBC_Dream_Panel_Status_N310 ( int value );
+ int Tv_FactoryGet_FBC_Dream_Panel_Status_N310 ( void );
+ int Tv_FactorySet_FBC_MULT_PQ_Status_N310 ( int value );
+ int Tv_FactoryGet_FBC_MULT_PQ_Status_N310 ( void );
+ int Tv_FactorySet_FBC_MEMC_Status_N310 ( int value );
+ int Tv_FactoryGet_FBC_MEMC_Status_N310 ( void );
+ int Tv_FactorySet_FBC_ColorTemp_Mode_N310( int mode );
+ int Tv_FactoryGet_FBC_ColorTemp_Mode_N310 ( void );
+ virtual int Tv_FactorySet_FBC_Backlight_N310 ( int value );
+ virtual int Tv_FactoryGet_FBC_Backlight_N310 ( void );
+ int Tv_FactorySet_FBC_Bluetooth_IIS_N310 ( int value );
+ int Tv_FactoryGet_FBC_Bluetooth_IIS_N310 ( void );
+ int Tv_FactorySet_FBC_Led_N310 ( int val_1, int val_2, int val_3 );
+ int Tv_FactorySet_VbyOne_Spread_Spectrum_N311 ( int value );
+ int Tv_FactoryGet_VbyOne_Spread_Spectrum_N311 ( void );
+ int Tv_FactorySet_FBC_AP_STANDBY_N310 ( int value );
+ int Tv_FactoryGet_FBC_AP_STANDBY_N310( void );
+ int Tv_FactorySet_Uboot_Stage(int value);
+ //end TV TO FBC
+
+ int Tv_SetTestPattern(int value);
+ int Tv_Set2k4k_ScalerUp_Mode ( int value );
+ int Tv_Get2k4k_ScalerUp_Mode ( void );
+ //audio
+ virtual int Tv_SetDRC_OnOff(int on_off);
+ virtual int Tv_GetDRC_OnOff(void);
+ virtual void updateSubtitle(int, int);
+ int setSubtitleBuffer(char *);
+ int initSubtitle(int, int) ;
+ int lockSubtitle();
+ int unlockSubtitle();
+ int getSubSwitchStatus();
+ int startSubtitle(int dmx_id, int pid, int page_id, int anc_page_id) ;
+ int stopSubtitle() ;
+
+ //audio
+ virtual void TvAudioOpen();
+ virtual void AudioCtlUninit();
+ virtual int SetAudioMuteForSystem(int muteOrUnmute);
+ virtual int GetAudioMuteForSystem();
+ virtual int SetAudioMuteForTv(int muteOrUnmute);
+ virtual int GetAudioMuteForTv();
+ virtual char *GetMainVolLutTableExtraName();
+ virtual int SetDbxTvMode(int mode, int son_value, int vol_value, int sur_value);
+ virtual int GetDbxTvMode(int *mode, int *son_value, int *vol_value, int *sur_value);
+ int AudioHandleHeadsetPlugIn();
+ int AudioHandleHeadsetPullOut();
+ int SetAudioAVOutMute(int muteStatus);
+ int GetAudioAVOutMute();
+ int SetAudioSPDIFMute(int muteStatus);
+ int GetAudioSPDIFMute();
+ int SetDacMute(int muteStatus, int mute_type);
+ int SetAudioI2sMute(int);
+ int SetAudioMasterVolume(int tmp_vol);
+ int GetAudioMasterVolume();
+ int SaveCurAudioMasterVolume(int tmp_vol);
+ int GetCurAudioMasterVolume();
+ int SetAudioBalance(int tmp_val);
+ int GetAudioBalance();
+ int SaveCurAudioBalance(int tmp_val);
+ int GetCurAudioBalance();
+ int SetAudioSupperBassVolume(int tmp_vol);
+ int GetAudioSupperBassVolume();
+ int SaveCurAudioSupperBassVolume(int tmp_vol);
+ int GetCurAudioSupperBassVolume();
+ int SetAudioSupperBassSwitch(int tmp_val);
+ int GetAudioSupperBassSwitch();
+ int SaveCurAudioSupperBassSwitch(int tmp_val);
+ int GetCurAudioSupperBassSwitch();
+ int SetAudioSRSSurround(int tmp_val);
+ int GetAudioSRSSurround();
+ int SaveCurAudioSrsSurround(int tmp_val);
+ int GetCurAudioSRSSurround();
+ int SetAudioSrsDialogClarity(int tmp_val);
+ int GetAudioSrsDialogClarity();
+ int SaveCurAudioSrsDialogClarity(int tmp_val);
+ int GetCurAudioSrsDialogClarity();
+ int SetAudioSrsTruBass(int tmp_val);
+ int GetAudioSrsTruBass();
+ int SaveCurAudioSrsTruBass(int tmp_val);
+ int GetCurAudioSrsTruBass();
+ int SetAudioSPDIFSwitch(int tmp_val);
+ int GetCurAudioSPDIFSwitch();
+ int SaveCurAudioSPDIFSwitch(int tmp_val);
+
+ //Audio SPDIF Mode
+ int SetAudioSPDIFMode(int tmp_val);
+ int GetCurAudioSPDIFMode();
+ int SaveCurAudioSPDIFMode(int tmp_val);
+ int SetAudioBassVolume(int tmp_vol);
+ int GetAudioBassVolume();
+ int SaveCurAudioBassVolume(int tmp_vol);
+ int GetCurAudioBassVolume();
+ int SetAudioTrebleVolume(int tmp_vol);
+ int GetAudioTrebleVolume();
+ int SaveCurAudioTrebleVolume(int tmp_vol);
+ int GetCurAudioTrebleVolume();
+ int SetAudioSoundMode(int tmp_val);
+ int GetAudioSoundMode();
+ int SaveCurAudioSoundMode(int tmp_val);
+ int GetCurAudioSoundMode();
+ int SetAudioWallEffect(int tmp_val);
+ int GetAudioWallEffect();
+ int SaveCurAudioWallEffect(int tmp_val);
+ int GetCurAudioWallEffect();
+ int SetAudioEQMode(int tmp_val);
+ int GetAudioEQMode();
+ int SaveCurAudioEQMode(int tmp_val);
+ int GetCurAudioEQMode();
+ int GetAudioEQRange(int range_buf[]);
+ int GetAudioEQBandCount();
+ int SetAudioEQGain(int gain_buf[]);
+ int GetAudioEQGain(int gain_buf[]);
+ int GetCurAudioEQGain(int gain_buf[]);
+ int SaveCurAudioEQGain(int gain_buf[]);
+ int SetAudioEQSwitch(int switch_val);
+ int OpenAmAudio(unsigned int sr, int input_device, int output_device);
+ int CloseAmAudio(void);
+ int SetAmAudioInputSr(unsigned int sr, int output_device);
+ int SetAmAudioOutputMode(int mode);
+ int SetAmAudioMusicGain(int gain);
+ int SetAmAudioLeftGain(int gain);
+ int SetAmAudioRightGain(int gain);
+ int SetAudioVolumeCompensationVal(int tmp_vol_comp_val);
+ int AudioLineInSelectChannel(int audio_channel);
+ int AudioSetLineInCaptureVolume(int l_vol, int r_vol);
+ int SetKalaokIO(int level);
+ int setAudioPcmPlaybackVolume(int val);
+
+ int openTvAudio();
+ int closeTvAudio();
+
+ int InitTvAudio(int sr, int input_device);
+ int UnInitTvAudio();
+ int AudioChangeSampleRate(int sr);
+ int AudioSetAudioInSource(int audio_src_in_type);
+ int AudioSetAudioSourceType(int source_type);
+ int AudioSSMRestoreDefaultSetting();
+ int SetAudioDumpDataFlag(int tmp_flag);
+ int GetAudioDumpDataFlag();
+ int SetAudioLeftRightMode(unsigned int mode);
+ unsigned int GetAudioLeftRightMode();
+ int SwitchAVOutBypass (int);
+ int SetAudioSwitchIO(int value);
+ int SetOutput_Swap(int value);
+ int HanldeAudioInputSr(unsigned int);
+ void AudioSetVolumeDigitLUTBuf(int lut_sel_flag, int *MainVolLutBuf);
+ int SetADC_Digital_Capture_Volume(int value);
+ int SetPGA_IN_Value(int value);
+ int SetDAC_Digital_PlayBack_Volume(int value);
+ int InitSetTvAudioCard();
+ int UnInitSetTvAudioCard();
+ void RefreshSrsEffectAndDacGain();
+ int SetCustomEQGain();
+ int SetAtvInGain(int gain_val);
+ int GetHdmiAvHotplugDetectOnoff();
+private:
+ int SendCmdToOffBoardFBCExternalDac(int, int);
+ int LoadCurAudioSPDIFMode();
+ int LoadCurAudioMasterVolume();
+ int LoadCurAudioBalance();
+ int LoadCurAudioSupperBassVolume();
+ int LoadCurAudioSupperBassSwitch();
+ int LoadCurAudioSrsSurround();
+ int LoadCurAudioSrsDialogClarity();
+ int LoadCurAudioSPDIFSwitch();
+ void SetSupperBassSRSSpeakerSize();
+ int LoadCurAudioSoundMode();
+ int LoadCurAudioEQMode();
+ int LoadCurAudioSrsTruBass();
+ int RealSaveCurAudioBassVolume(int, int);
+ int LoadCurAudioBassVolume();
+ int RealSaveCurAudioTrebleVolume(int, int);
+ int LoadCurAudioTrebleVolume();
+ int HandleTrebleBassVolume();
+ int LoadCurAudioWallEffect();
+ int RealReadCurAudioEQGain(int *);
+ int RealSaveCurAudioEQGain(int *, int);
+ int LoadCurAudioEQGain();
+ int MappingEQGain(int *, int *, int);
+ int RestoreToAudioDefEQGain(int *);
+ int GetCustomEQGain(int *);
+ int AudioSetEQGain(int *);
+ int handleEQGainBeforeSet(int *, int *);
+ int RealSetEQGain(int *);
+ int SetSpecialModeEQGain(int);
+ int SetSpecialIndexEQGain(int, int);
+ int SaveSpecialIndexEQGain(int, int);
+ void LoadAudioCtl();
+ void InitSetAudioCtl();
+ int GetBassUIMinGainVal();
+ int GetBassUIMaxGainVal();
+ int GetTrebleUIMinGainVal();
+ int GetTrebleUIMaxGainVal();
+ int MappingLine(int, int, int, int, int);
+ int MappingTrebleBassAndEqualizer(int, int, int, int);
+ int SetSPDIFMode(int mode_val);
+
+ CAudioAlsa mAudioAlsa;
+ CAudioEffect mAudioEffect;
+
+ CAudioCustomerCtrl mCustomerCtrl;
+ int mCurAudioMasterVolume;
+ int mCurAudioBalance;
+ int mCurAudioSupperBassVolume;
+ int mCurAudioSupperBassSwitch;
+ int mCurAudioSRSSurround;
+ int mCurAudioSrsDialogClarity;
+ int mCurAudioSrsTruBass;
+ int mCurAudioSPDIFSwitch;
+ int mCurAudioSPDIFMode;
+ int mCurAudioBassVolume;
+ int mCurAudioTrebleVolume;
+ int mCurAudioSoundMode;
+ int mCurAudioWallEffect;
+ int mCurAudioEQMode;
+ int mCustomAudioMasterVolume;
+ int mCustomAudioBalance;
+ int mCustomAudioSupperBassVolume;
+ int mCustomAudioSupperBassSwitch;
+ int mCustomAudioSRSSurround;
+ int mCustomAudioSrsDialogClarity;
+ int mCustomAudioSrsTruBass;
+ int mCustomAudioBassVolume;
+ int mCustomAudioTrebleVolume;
+ int mCustomAudioSoundMode;
+ int mCustomAudioWallEffect;
+ int mCustomAudioEQMode;
+ int mCustomAudioSoundEnhancementSwitch;
+ int mCustomEQGainBuf[CC_BAND_ITEM_CNT];
+ int mCurEQGainBuf[CC_BAND_ITEM_CNT] ;
+ int8_t mCurEQGainChBuf[CC_BAND_ITEM_CNT];
+ int mWallEffectValueBuf[CC_BAND_ITEM_CNT];
+ int mVolumeCompensationVal;
+ int mMainVolumeBalanceVal;
+ //end audio
+
+protected:
+ class CTvMsgQueue: public CMsgQueueThread, public CAv::IObserver, public CTvScanner::IObserver , public CTvEpg::IObserver, public CFrontEnd::IObserver {
+ public:
+ static const int TV_MSG_COMMON = 0;
+ static const int TV_MSG_STOP_ANALYZE_TS = 1;
+ static const int TV_MSG_START_ANALYZE_TS = 2;
+ static const int TV_MSG_CHECK_FE_DELAY = 3;
+ static const int TV_MSG_AV_EVENT = 4;
+ static const int TV_MSG_FE_EVENT = 5;
+ static const int TV_MSG_SCAN_EVENT = 6;
+ static const int TV_MSG_EPG_EVENT = 7;
+ static const int TV_MSG_HDMI_SR_CHANGED = 8;
+ static const int TV_MSG_ENABLE_VIDEO_LATER = 9;
+ CTvMsgQueue(CTv *tv);
+ ~CTvMsgQueue();
+ //scan observer
+ void onEvent ( const CTvScanner::ScannerEvent &ev );
+ //epg observer
+ void onEvent ( const CTvEpg::EpgEvent &ev );
+ //FE observer
+ void onEvent ( const CFrontEnd::FEEvent &ev );
+ //AV
+ void onEvent(const CAv::AVEvent &ev);
+ private:
+ virtual void handleMessage ( CMessage &msg );
+ CTv *mpTv;
+ };
+
+ class CTvDetectObserverForScanner: public CTvin::CTvinSigDetect::ISigDetectObserver {
+ public:
+ CTvDetectObserverForScanner(CTv *);
+ ~CTvDetectObserverForScanner() {};
+ virtual void onSigToStable();
+ virtual void onSigStableToUnstable();
+ virtual void onSigStableToNoSig();
+ virtual void onSigUnStableToNoSig();
+ virtual void onSigStillStable();
+ private:
+ CTv *mpTv;
+ int m_sig_stable_nums;
+ };
+ void onEnableVideoLater(int framecount);
+ int resetDmxAndAvSource();
+ int stopScan();
+ int stopPlaying();
+ void sendTvEvent ( const CTvEv &ev );
+ int startPlayTv ( int source, int vid, int aid, int vfat, int afat );
+ //scan observer
+ void onEvent ( const CTvScanner::ScannerEvent &ev );
+ //epg observer
+ void onEvent ( const CTvEpg::EpgEvent &ev );
+ //FE observer
+ void onEvent ( const CFrontEnd::FEEvent &ev );
+ //AV
+ void onEvent(const CAv::AVEvent &ev);
+ bool Tv_Start_Analyze_Ts ( int channelID );
+ bool Tv_Stop_Analyze_Ts();
+ int Tvin_Stop ( void );
+ int Tvin_GetTvinConfig();
+ int Tv_init_audio();
+ int Tv_MiscSetBySource ( tv_source_input_t );
+ void print_version_info ( void );
+ int dtvCleanProgramByFreq ( int freq );
+ /*********************** Audio start **********************/
+ int SetAudioVolDigitLUTTable ( tv_source_input_t source_input );
+ virtual int Tv_SetAudioInSource (tv_source_input_t source_input);
+ void Tv_SetAudioOutputSwap_Type (tv_source_input_t source_input);
+ void Tv_ADCDigitalCapture_Volume (void);
+ void Tv_SetPGAIn_Gain (void);
+ void Tv_SetDACDigitalPlayBack_Volume (int audio_src_in_type);
+ void Tv_SetAVOutPut_Input_gain(tv_source_input_t source_input);
+ /*********************** Audio end **********************/
+
+ //
+ virtual void onSigToStable();
+ virtual void onSigStableToUnstable();
+ virtual void onSigStableToUnSupport();
+ virtual void onSigStableToNoSig();
+ virtual void onSigUnStableToUnSupport();
+ virtual void onSigUnStableToNoSig();
+ virtual void onSigNullToNoSig();
+ virtual void onSigNoSigToUnstable();
+ virtual void onSigStillStable();
+ virtual void onSigStillUnstable();
+ virtual void onSigStillNosig();
+ virtual void onSigStillNoSupport();
+ virtual void onSigStillNull();
+ virtual void onStableSigFmtChange();
+ virtual void onStableTransFmtChange();
+ virtual void onSigDetectEnter();
+ virtual void onSigDetectLoop();
+
+ virtual void onSourceConnect(int source_type, int connect_status);
+ virtual void onHDMIRxCECMessage(int msg_len, unsigned char msg_buf[]);
+ virtual void onUpgradeStatus(int status, int progress);
+ virtual void onSerialCommunication(int dev_id, int rd_len, unsigned char data_buf[]);
+ virtual void onThermalDetect(int state);
+ virtual void onVframeSizeChange();
+
+ CTvEpg mTvEpg;
+ CTvScanner mTvScanner;
+ mutable Mutex mLock;
+ CTvTime mTvTime;
+ CVpp mVpp;
+ CTvin mTvin;
+ CTvRecord mTvRec;
+ CFrontEnd mFrontDev;
+ CTvDimension mTvVchip;
+ CTvSubtitle mTvSub;
+ CAv mAv;
+ CTvDmx mTvDmx;
+ CTvMsgQueue mTvMsgQueue;
+ AutoBackLight mAutoBackLight;
+ CAutoPQparam mAutoPQparam;
+ CTvDetectObserverForScanner mTvScannerDetectObserver;
+ //
+ volatile int mTvAction;
+ volatile TvRunStatus_t mTvStatus;
+ volatile tv_source_input_t m_source_input;
+ volatile tv_source_input_t m_last_source_input;
+ /* for tvin window mode and pos*/
+ tvin_window_pos_t m_win_pos;
+ tv_window_mode_t m_win_mode;
+ int m_blackout_enable;//1 enable 0 disable
+ int m_cur_playing_prog_id;
+ bool mB_hdmiout_fbc;
+ CFbcCommunication *fbcIns;
+
+
+ bool mlastlockstatus;
+ String8 mlastdm;
+ String8 mlastabbrev;
+ String8 mlastabbtext;
+ pthread_t vchipthread;
+ int mvchip_running;
+ friend class CTvMsgQueue;
+ int mCurAnalyzeTsChannelID;
+ TvIObserver *mpObserver;
+ tv_dtv_scan_running_status_t mDtvScanRunningStatus;
+ volatile tv_config_t gTvinConfig;
+ int dtv_auto_3d_flag;
+ int m_hdmiav_hotplugdetect_en;
+ bool m_autoset_displayfreq;
+ int m_sig_stable_nums;
+ bool m_is_set_hdmi_edid;
+ /** for L/R or B/T 3d mode overscan **/
+ /** for 3D **/
+ VIDEO_3D_MODE_T m_mode_3d;
+ /** for HDMI-in sampling detection. **/
+ int m_hdmi_sampling_rate;
+ int m_hdmi_audio_data;
+ /** for display mode to bottom **/
+ int screen_mode;
+
+ //audio mute
+ int mAudioMuteStatusForTv;
+ int mAudioMuteStatusForSystem;
+ char mMainVolLutTableExtraName[16];
+};
+
+#endif //_CDTV_H
diff --git a/tvapi/libtv/tv/CTvBooking.cpp b/tvapi/libtv/tv/CTvBooking.cpp
index ad696f3..e821809 100644
--- a/tvapi/libtv/tv/CTvBooking.cpp
+++ b/tvapi/libtv/tv/CTvBooking.cpp
@@ -1,162 +1,162 @@
-
-#include "CTvBooking.h"
-#include "CTvDatabase.h"
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#define LOG_TAG "CTvBooking"
-#endif
-int CTvBooking::InitFromCursor(CTvDatabase::Cursor &c)
-{
- int col;
-
- col = c.getColumnIndex("db_id");
- this->id = c.getInt(col);
-
- col = c.getColumnIndex("db_srv_id");
- this->programId = c.getInt(col);
-
- col = c.getColumnIndex("db_evt_id");
- this->eventId = c.getInt(col);
-
- col = c.getColumnIndex("flag");
- this->flag = c.getInt(col);
-
- col = c.getColumnIndex("status");
- this->status = c.getInt(col);
-
- col = c.getColumnIndex("repeat");
- this->repeat = c.getInt(col);
-
- col = c.getColumnIndex("start");
- this->start = (long)c.getInt(col);
-
- col = c.getColumnIndex("duration");
- this->duration = (long)c.getInt(col) ;
-
- col = c.getColumnIndex("srv_name");
- this->progName = c.getString(col);
-
- col = c.getColumnIndex("evt_name");
- this->evtName = c.getString(col);
-
- return 0;
-}
-
-int CTvBooking::selectByID(int id, CTvBooking &CtvBook)
-{
- CTvDatabase::Cursor c;
- String8 sql;
-
- sql = String8("select * from booking_table where booking_table.db_evt_id = ") + String8::format("%d", id);
- CTvDatabase::GetTvDb()->select(sql.string(), c);
- if(c.moveToFirst()) {
- CtvBook.InitFromCursor(c);
- } else {
- c.close();
- return -1;
- }
-
- c.close();
- return 0;
-}
-
-int CTvBooking::getBookedEventList(Vector<sp<CTvBooking> > &vBv)
-{
- String8 cmd;
-
- cmd = String8("select * from booking_table order by start");
-
- CTvDatabase::Cursor c;
- int ret = CTvDatabase::GetTvDb()->select(cmd, c);
-
- if(c.moveToFirst()) {
- do {
- vBv.add(new CTvBooking(c));
- } while(c.moveToNext());
-
-
- } else {
- c.close();
- return -1;
- }
-
- c.close();
- return 0;
-
-}
-
-int CTvBooking::bookProgram(CTvProgram &prog, CTvEvent &evt)
-{
- String8 cmd;
- String8 progName = String8(prog.getName());
- String8 evtName = String8(evt.getName());
-
-
- /*book this program*/
- cmd = String8("insert into booking_table(db_srv_id, db_evt_id, srv_name, evt_name,")
- + String8("start,duration,flag,status,file_name,vid_pid,vid_fmt,aud_pids,aud_fmts,aud_languages,")
- + String8("sub_pids,sub_types,sub_composition_page_ids,sub_ancillary_page_ids,sub_languages,")
- + String8("ttx_pids,ttx_types,ttx_magazine_numbers,ttx_page_numbers,ttx_languages, other_pids,from_storage,repeat)")
- + String8("values(") + String8::format("%d,", prog.getID()) + String8::format("%d,", evt.getEventId()) + progName.string() + String8(",") + evtName.string()
- + String8::format("%d,", evt.getStartTime()) + String8::format("%d,", evt.getEndTime() - evt.getStartTime()) + String8::format("%d,", flag)
- + String8::format("%d,", status) + String8(",") + String8::format("%d,", prog.getVideo()->getPID()) + String8::format("%d,", prog.getVideo()->getFormat())
- + String8::format("%d,", prog.getAudio(0)->getPID()) + String8::format("%d,", prog.getAudio(0)->getFormat()) + prog.getAudio(0)->getLang().string()
- + String8(" , , , , , , , , , , , , ,)");
-
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
- return 0;
-}
-
-int CTvBooking::deleteBook(int evtIdFlag)
-{
- String8 cmd;
-
- cmd = String8("delete from booking_table where db_evt_id=")
- + String8::format("%d", evtIdFlag);
-
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
- return 0;
-}
-
-int CTvBooking::bookEvent(int evtId, bool bBookFlag)
-{
- String8 cmd;
-
- cmd = String8("update evt_table set sub_flag=") + String8::format("%d", bBookFlag)
- + String8(" where db_id=") + String8::format("%d", evtId);
-
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
- if(true == bBookFlag) {
- CTvEvent evt;
- CTvEvent::selectByID(evtId, evt);
-
- CTvProgram prog;
- CTvProgram::selectByID(evt.getProgramId(), prog);
-
- bookProgram(prog, evt);
- } else {
- deleteBook(evtId);
- }
-
- return 0;
-
-}
-
-CTvBooking::CTvBooking(CTvDatabase::Cursor &c)
-{
- InitFromCursor(c);
-}
-
-CTvBooking::CTvBooking()
-{
-}
-
-CTvBooking::~CTvBooking()
-{
-}
-
-
+
+#include "CTvBooking.h"
+#include "CTvDatabase.h"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "CTvBooking"
+#endif
+int CTvBooking::InitFromCursor(CTvDatabase::Cursor &c)
+{
+ int col;
+
+ col = c.getColumnIndex("db_id");
+ this->id = c.getInt(col);
+
+ col = c.getColumnIndex("db_srv_id");
+ this->programId = c.getInt(col);
+
+ col = c.getColumnIndex("db_evt_id");
+ this->eventId = c.getInt(col);
+
+ col = c.getColumnIndex("flag");
+ this->flag = c.getInt(col);
+
+ col = c.getColumnIndex("status");
+ this->status = c.getInt(col);
+
+ col = c.getColumnIndex("repeat");
+ this->repeat = c.getInt(col);
+
+ col = c.getColumnIndex("start");
+ this->start = (long)c.getInt(col);
+
+ col = c.getColumnIndex("duration");
+ this->duration = (long)c.getInt(col) ;
+
+ col = c.getColumnIndex("srv_name");
+ this->progName = c.getString(col);
+
+ col = c.getColumnIndex("evt_name");
+ this->evtName = c.getString(col);
+
+ return 0;
+}
+
+int CTvBooking::selectByID(int id, CTvBooking &CtvBook)
+{
+ CTvDatabase::Cursor c;
+ String8 sql;
+
+ sql = String8("select * from booking_table where booking_table.db_evt_id = ") + String8::format("%d", id);
+ CTvDatabase::GetTvDb()->select(sql.string(), c);
+ if (c.moveToFirst()) {
+ CtvBook.InitFromCursor(c);
+ } else {
+ c.close();
+ return -1;
+ }
+
+ c.close();
+ return 0;
+}
+
+int CTvBooking::getBookedEventList(Vector<sp<CTvBooking> > &vBv)
+{
+ String8 cmd;
+
+ cmd = String8("select * from booking_table order by start");
+
+ CTvDatabase::Cursor c;
+ int ret = CTvDatabase::GetTvDb()->select(cmd, c);
+
+ if (c.moveToFirst()) {
+ do {
+ vBv.add(new CTvBooking(c));
+ } while (c.moveToNext());
+
+
+ } else {
+ c.close();
+ return -1;
+ }
+
+ c.close();
+ return 0;
+
+}
+
+int CTvBooking::bookProgram(CTvProgram &prog, CTvEvent &evt)
+{
+ String8 cmd;
+ String8 progName = String8(prog.getName());
+ String8 evtName = String8(evt.getName());
+
+
+ /*book this program*/
+ cmd = String8("insert into booking_table(db_srv_id, db_evt_id, srv_name, evt_name,")
+ + String8("start,duration,flag,status,file_name,vid_pid,vid_fmt,aud_pids,aud_fmts,aud_languages,")
+ + String8("sub_pids,sub_types,sub_composition_page_ids,sub_ancillary_page_ids,sub_languages,")
+ + String8("ttx_pids,ttx_types,ttx_magazine_numbers,ttx_page_numbers,ttx_languages, other_pids,from_storage,repeat)")
+ + String8("values(") + String8::format("%d,", prog.getID()) + String8::format("%d,", evt.getEventId()) + progName.string() + String8(",") + evtName.string()
+ + String8::format("%d,", evt.getStartTime()) + String8::format("%d,", evt.getEndTime() - evt.getStartTime()) + String8::format("%d,", flag)
+ + String8::format("%d,", status) + String8(",") + String8::format("%d,", prog.getVideo()->getPID()) + String8::format("%d,", prog.getVideo()->getFormat())
+ + String8::format("%d,", prog.getAudio(0)->getPID()) + String8::format("%d,", prog.getAudio(0)->getFormat()) + prog.getAudio(0)->getLang().string()
+ + String8(" , , , , , , , , , , , , ,)");
+
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+ return 0;
+}
+
+int CTvBooking::deleteBook(int evtIdFlag)
+{
+ String8 cmd;
+
+ cmd = String8("delete from booking_table where db_evt_id=")
+ + String8::format("%d", evtIdFlag);
+
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+ return 0;
+}
+
+int CTvBooking::bookEvent(int evtId, bool bBookFlag)
+{
+ String8 cmd;
+
+ cmd = String8("update evt_table set sub_flag=") + String8::format("%d", bBookFlag)
+ + String8(" where db_id=") + String8::format("%d", evtId);
+
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+ if (true == bBookFlag) {
+ CTvEvent evt;
+ CTvEvent::selectByID(evtId, evt);
+
+ CTvProgram prog;
+ CTvProgram::selectByID(evt.getProgramId(), prog);
+
+ bookProgram(prog, evt);
+ } else {
+ deleteBook(evtId);
+ }
+
+ return 0;
+
+}
+
+CTvBooking::CTvBooking(CTvDatabase::Cursor &c)
+{
+ InitFromCursor(c);
+}
+
+CTvBooking::CTvBooking()
+{
+}
+
+CTvBooking::~CTvBooking()
+{
+}
+
+
diff --git a/tvapi/libtv/tv/CTvBooking.h b/tvapi/libtv/tv/CTvBooking.h
index e40561e..bf01afd 100644
--- a/tvapi/libtv/tv/CTvBooking.h
+++ b/tvapi/libtv/tv/CTvBooking.h
@@ -1,83 +1,83 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvBooking.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#if !defined(_CTVBOOKING_H)
-#define _CTVBOOKING_H
-
-#include "CTvDatabase.h"
-#include "CTvProgram.h"
-#include "CTvEvent.h"
-#include <utils/String8.h>
-#include <utils/RefBase.h>
-#include <stdlib.h>
-#include "CTvLog.h"
-#define LOG_TAG "CTvBooking"
-
-// ??????/ ???
-class CTvBooking : public LightRefBase<CTvBooking> {
-public:
- CTvBooking(CTvDatabase::Cursor &c);
- CTvBooking();
- ~CTvBooking();
-
- static int selectByID(int id, CTvBooking &CtvBook);
-
- int bookEvent(int evtId, bool bBookFlag);
- int getBookedEventList(Vector<sp<CTvBooking> > &vBv);
-
- int getBookId()
- {
- return id;
- };
- int getProgramId()
- {
- return programId;
- };
- int getEventId()
- {
- return eventId;
- };
- int getStartTime()
- {
- return start;
- };
- int getDurationTime()
- {
- return duration;
- };
- String8 &getProgName()
- {
- return progName;
- };
- String8 &getEvtName()
- {
- return evtName;
- };
-
-private:
- int deleteBook(int evtIdFlag) ;
- int bookProgram(CTvProgram &prog, CTvEvent &evt);
- int InitFromCursor(CTvDatabase::Cursor &c);
-private:
- int id;
- int programId;
- int eventId;
- int flag;
- int status;
- int repeat;
- long start;
- long duration;
- String8 progName;
- String8 evtName;
-};
-
-#endif //_CTVBOOKING_H
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvBooking.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#if !defined(_CTVBOOKING_H)
+#define _CTVBOOKING_H
+
+#include "CTvDatabase.h"
+#include "CTvProgram.h"
+#include "CTvEvent.h"
+#include <utils/String8.h>
+#include <utils/RefBase.h>
+#include <stdlib.h>
+#include "CTvLog.h"
+#define LOG_TAG "CTvBooking"
+
+// ??????/ ???
+class CTvBooking : public LightRefBase<CTvBooking> {
+public:
+ CTvBooking(CTvDatabase::Cursor &c);
+ CTvBooking();
+ ~CTvBooking();
+
+ static int selectByID(int id, CTvBooking &CtvBook);
+
+ int bookEvent(int evtId, bool bBookFlag);
+ int getBookedEventList(Vector<sp<CTvBooking> > &vBv);
+
+ int getBookId()
+ {
+ return id;
+ };
+ int getProgramId()
+ {
+ return programId;
+ };
+ int getEventId()
+ {
+ return eventId;
+ };
+ int getStartTime()
+ {
+ return start;
+ };
+ int getDurationTime()
+ {
+ return duration;
+ };
+ String8 &getProgName()
+ {
+ return progName;
+ };
+ String8 &getEvtName()
+ {
+ return evtName;
+ };
+
+private:
+ int deleteBook(int evtIdFlag) ;
+ int bookProgram(CTvProgram &prog, CTvEvent &evt);
+ int InitFromCursor(CTvDatabase::Cursor &c);
+private:
+ int id;
+ int programId;
+ int eventId;
+ int flag;
+ int status;
+ int repeat;
+ long start;
+ long duration;
+ String8 progName;
+ String8 evtName;
+};
+
+#endif //_CTVBOOKING_H
diff --git a/tvapi/libtv/tv/CTvEpg.cpp b/tvapi/libtv/tv/CTvEpg.cpp
index fa75931..9726ed7 100644
--- a/tvapi/libtv/tv/CTvEpg.cpp
+++ b/tvapi/libtv/tv/CTvEpg.cpp
@@ -17,12 +17,12 @@ void CTvEpg::epg_evt_callback(long dev_no, int event_type, void *param, void *us
AM_EPG_GetUserData((AM_EPG_Handle_t)dev_no, (void **)&pEpg);
- if(pEpg == NULL) return;
+ if (pEpg == NULL) return;
- if(pEpg->mpObserver == NULL) {
+ if (pEpg->mpObserver == NULL) {
return;
}
- switch(event_type) {
+ switch (event_type) {
case AM_EPG_EVT_NEW_TDT:
case AM_EPG_EVT_NEW_STT: {
int utc_time;
@@ -87,7 +87,7 @@ void CTvEpg::epg_create(int fend_id, int dmx_id, int src, char *textLangs)
ret = AM_EPG_Create(&para, &mEpgScanHandle);
- if(ret != AM_SUCCESS) {
+ if (ret != AM_SUCCESS) {
LOGD("AM_EPG_Create failed");
return;
}
@@ -122,7 +122,7 @@ void CTvEpg::epg_change_mode(int op, int mode)
{
AM_ErrorCode_t ret;
ret = AM_EPG_ChangeMode(mEpgScanHandle, op, mode);
- if(ret != AM_SUCCESS)
+ if (ret != AM_SUCCESS)
LOGD("AM_EPG_ChangeMode failed");
}
@@ -131,7 +131,7 @@ void CTvEpg::epg_change_mode(int op, int mode)
void CTvEpg::epg_monitor_service(int srv_id)
{
int ret = AM_EPG_MonitorService(mEpgScanHandle, srv_id);
- if(ret != AM_SUCCESS)
+ if (ret != AM_SUCCESS)
LOGD("AM_EPG_MonitorService failed");
}
@@ -165,14 +165,14 @@ void CTvEpg::stopScan(int mode)
void CTvEpg::enterChannel(int chan_id)
{
- if(chan_id == mCurScanChannelId)
+ if (chan_id == mCurScanChannelId)
return;
//already enter,leave it
- if(mCurScanChannelId != INVALID_ID) {
+ if (mCurScanChannelId != INVALID_ID) {
leaveChannel();
}
- if(mFend_mod == CTvChannel::MODE_ATSC) {
+ if (mFend_mod == CTvChannel::MODE_ATSC) {
startScan(SCAN_PSIP_ETT | SCAN_PSIP_EIT | SCAN_MGT | SCAN_VCT | SCAN_RRT | SCAN_STT);
} else {
startScan(SCAN_EIT_ALL | SCAN_SDT | SCAN_NIT | SCAN_TDT | SCAN_CAT);
@@ -192,10 +192,10 @@ void CTvEpg::leaveChannel()
/*Enter the program.*/
void CTvEpg::enterProgram(int prog_id)
{
- if(prog_id == mCurScanProgramId)
+ if (prog_id == mCurScanProgramId)
return;
- if(mCurScanProgramId != INVALID_ID) {
+ if (mCurScanProgramId != INVALID_ID) {
leaveProgram();
}
@@ -207,7 +207,7 @@ void CTvEpg::enterProgram(int prog_id)
/*Leave the program.*/
void CTvEpg::leaveProgram()
{
- if(mCurScanProgramId == INVALID_ID)
+ if (mCurScanProgramId == INVALID_ID)
return;
stopScan(SCAN_PAT | SCAN_PMT);
diff --git a/tvapi/libtv/tv/CTvEv.h b/tvapi/libtv/tv/CTvEv.h
index 9db3483..c364656 100644
--- a/tvapi/libtv/tv/CTvEv.h
+++ b/tvapi/libtv/tv/CTvEv.h
@@ -32,6 +32,7 @@ public:
static const int TV_EVENT_UPGRADE_FBC = 16;
static const int TV_EVENT_2d4G_HEADSET = 17;
static const int TV_EVENT_AV = 18;
+ static const int TV_EVENT_SUBTITLE = 19;
CTvEv(int type);
virtual ~CTvEv() {};
@@ -176,5 +177,16 @@ namespace TvEvent {
int state;
int para;
};
+ class SubtitleEvent: public CTvEv {
+ public:
+ SubtitleEvent(): CTvEv(CTvEv::TV_EVENT_SUBTITLE)
+ {
+ }
+ ~SubtitleEvent()
+ {
+ }
+ int pic_width;
+ int pic_height;
+ };
};
#endif
diff --git a/tvapi/libtv/tv/CTvLog.h b/tvapi/libtv/tv/CTvLog.h
index 2dbd933..79c6fc7 100644
--- a/tvapi/libtv/tv/CTvLog.h
+++ b/tvapi/libtv/tv/CTvLog.h
@@ -27,9 +27,9 @@ __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__); }
//class CTvLog{
-// public:
-// inline static void LOGD();
-// inline static void LOGW();
-// inline static void LOGE();
+// public:
+// inline static void LOGD();
+// inline static void LOGW();
+// inline static void LOGE();
//};
#endif //
diff --git a/tvapi/libtv/tv/CTvRecord.cpp b/tvapi/libtv/tv/CTvRecord.cpp
index b43970f..0327c96 100644
--- a/tvapi/libtv/tv/CTvRecord.cpp
+++ b/tvapi/libtv/tv/CTvRecord.cpp
@@ -1,276 +1,276 @@
-#include <string.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <am_debug.h>
-#include <am_dmx.h>
-#include <am_av.h>
-
-#include <am_misc.h>
-
-#include <am_fend.h>
-#include <am_dvr.h>
-#include <errno.h>
-#include "CTvProgram.h"
-#include "../tvconfig/tvconfig.h"
-#include "CTvRecord.h"
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-#define LOG_TAG "CTvRecord"
-
-#define FEND_DEV_NO 0
-#define DVR_DEV_NO 0
-#define DVR_BUF_SIZE 1024*1024
-#define DVR_DEV_COUNT (2)
-
-typedef struct {
- int id;
- char file_name[256];
- pthread_t thread;
- int running;
- int fd;
-} DVRData;
-
-static DVRData data_threads[DVR_DEV_COUNT];
-int pvr_init = 0;
-CTvRecord::CTvRecord()
-{
- AM_DVR_OpenPara_t dpara;
- memset(&dpara, 0, sizeof(dpara));
- AM_DVR_Open(DVR_DEV_NO, &dpara);
- data_threads[DVR_DEV_NO].id = 0;
- data_threads[DVR_DEV_NO].fd = -1;
- data_threads[DVR_DEV_NO].running = 0;
-
- AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0);
- AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE);
-
- memset(filename, 0, sizeof(filename));
- progid = 0xFFFF;
- vpid = 0x1fff;
- apid = 0x1fff;
-}
-CTvRecord::~CTvRecord()
-{
- AM_DVR_Close(DVR_DEV_NO);
-
-}
-void CTvRecord::dvr_init(void)
-{
- AM_DVR_OpenPara_t para;
- char buf[32];
-
- if(pvr_init)
- return;
-
- memset(&para, 0, sizeof(para));
- LOGD("%s,%d", "TV", __LINE__);
-
- AM_DVR_Open(DVR_DEV_NO, &para);
- AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0);
- AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE);
-
- snprintf(buf, sizeof(buf), "%d", (512 * 1024));
- AM_FileEcho("/sys/class/dmx/asyncfifo_len", buf);
-
- pvr_init = 1;
-}
-
-char *CTvRecord::GetRecordFileName()
-{
- return filename;
-}
-void CTvRecord::SetRecordFileName(char *name)
-{
- strcpy(filename, name);
-}
-void CTvRecord::SetCurRecProgramId(int id)
-{
- progid = id;
-}
-
-int CTvRecord::dvr_data_write(int fd, uint8_t *buf, int size)
-{
- int ret;
- int left = size;
- uint8_t *p = buf;
- LOGD("%s,%d", "TV", __LINE__);
-
- while (left > 0) {
- ret = write(fd, p, left);
- if (ret == -1) {
- if (errno != EINTR) {
- LOGD("Write DVR data failed: %s", strerror(errno));
- break;
- }
- ret = 0;
- }
-
- left -= ret;
- p += ret;
- }
-
- return (size - left);
-}
-void *CTvRecord::dvr_data_thread(void *arg)
-{
- DVRData *dd = (DVRData *)arg;
- int cnt;
- uint8_t buf[256 * 1024];
-
- LOGD("Data thread for DVR%d start ,record file will save to '%s'", dd->id, dd->file_name);
- LOGD("%s,%d", "TV", __LINE__);
-
- while (dd->running) {
- cnt = AM_DVR_Read(dd->id, buf, sizeof(buf), 1000);
- if (cnt <= 0) {
- LOGD("No data available from DVR%d", dd->id);
- usleep(200 * 1000);
- continue;
- }
- //AM_DEBUG(1, "read from DVR%d return %d bytes", dd->id, cnt);
- if (dd->fd != -1) {
- dvr_data_write(dd->fd, buf, cnt);
- }
- }
-
- if (dd->fd != -1) {
- close(dd->fd);
- dd->fd = -1;
- }
- LOGD("Data thread for DVR%d now exit", dd->id);
-
- return NULL;
-}
-
-void CTvRecord::start_data_thread(int dev_no)
-{
- DVRData *dd = &data_threads[dev_no];
-
- if (dd->running)
- return;
- LOGD("%s,%d,dev=%d", "TV", __LINE__, dev_no);
- dd->fd = open(dd->file_name, O_TRUNC | O_WRONLY | O_CREAT, 0666);
- if (dd->fd == -1) {
- LOGD("Cannot open record file '%s' for DVR%d, %s", dd->file_name, dd->id, strerror(errno));
- return;
- }
- dd->running = 1;
- pthread_create(&dd->thread, NULL, dvr_data_thread, dd);
-}
-void CTvRecord::get_cur_program_pid(int progId)
-{
- CTvProgram prog;
- int aindex;
- CTvProgram::Audio *pA;
- CTvProgram::Video *pV;
- int ret = CTvProgram::selectByID(progId, prog);
- if(ret != 0) return;
-
- LOGD("%s,%d", "TV", __LINE__);
- pV = prog.getVideo();
- if(pV != NULL) {
- setvpid(pV->getPID());
- }
-
- aindex = prog.getCurrAudioTrackIndex();
- if(-1 == aindex) { //db is default
- aindex = prog.getCurrentAudio(String8("eng"));
- if(aindex >= 0) {
- prog.setCurrAudioTrackIndex(progId, aindex);
- }
- }
-
- if(aindex >= 0) {
- pA = prog.getAudio(aindex);
- if(pA != NULL) {
- setapid(pA->getPID());
- }
- }
-
-}
-int CTvRecord::start_dvr()
-{
- AM_DVR_StartRecPara_t spara;
- int pid_cnt;
- int pids[2];
-
- /**½ö²âÊÔ×î¶à8¸öPID*/
- get_cur_program_pid(progid);
- pids[0] = getvpid();
- pids[1] = getapid();
-
- strcpy(data_threads[DVR_DEV_NO].file_name, GetRecordFileName());
- LOGD("%s,%d", "TV", __LINE__);
- //sprintf(data_threads[DVR_DEV_NO].file_name,"%s","/storage/external_storage/sda4/testdvr.ts");
- spara.pid_count = 2;
- memcpy(&spara.pids, pids, sizeof(pids));
-
- if (AM_DVR_StartRecord(DVR_DEV_NO, &spara) == AM_SUCCESS) {
- start_data_thread(DVR_DEV_NO);
- }
-
- return 0;
-}
-void CTvRecord::stop_data_thread(int dev_no)
-{
- DVRData *dd = &data_threads[dev_no];
- LOGD("%s,%d", "TV", __LINE__);
-
- if (! dd->running)
- return;
- dd->running = 0;
- pthread_join(dd->thread, NULL);
- LOGD("Data thread for DVR%d has exit", dd->id);
-}
-
-
-void CTvRecord::StartRecord(int id)
-{
- AM_DVR_OpenPara_t dpara;
- fe_status_t status;
- char buf[32];
-
- AM_FEND_GetStatus(FEND_DEV_NO, &status);
-
- if(status & FE_HAS_LOCK) {
- LOGD("locked\n");
- } else {
- LOGD("unlocked\n");
- return ;
- }
- SetCurRecProgramId(id);
- start_dvr();
-
- return;
-}
-void CTvRecord::StopRecord()
-{
- int i = 0;
- LOGD("stop record for %d", DVR_DEV_NO);
- AM_DVR_StopRecord(DVR_DEV_NO);
-
- //for (i=0; i< DVR_DEV_COUNT; i++)
- {
- if (data_threads[DVR_DEV_NO].running)
- stop_data_thread(DVR_DEV_NO);
- //LOGD("Closing DMX%d...", i);
- }
-
-
-}
-void CTvRecord::SetRecCurTsOrCurProgram(int sel)
-{
- int i = 0;
- char buf[50];
- memset(buf, 0, sizeof(buf));
- for(; i < 3; i++) {
- snprintf(buf, sizeof(buf), "/sys/class/stb/dvr%d_mode", i);
- if(sel)
- AM_FileEcho(buf, "ts");
- else
- AM_FileEcho(buf, "pid");
- }
-}
-
+#include <string.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <am_debug.h>
+#include <am_dmx.h>
+#include <am_av.h>
+
+#include <am_misc.h>
+
+#include <am_fend.h>
+#include <am_dvr.h>
+#include <errno.h>
+#include "CTvProgram.h"
+#include "../tvconfig/tvconfig.h"
+#include "CTvRecord.h"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "CTvRecord"
+
+#define FEND_DEV_NO 0
+#define DVR_DEV_NO 0
+#define DVR_BUF_SIZE 1024*1024
+#define DVR_DEV_COUNT (2)
+
+typedef struct {
+ int id;
+ char file_name[256];
+ pthread_t thread;
+ int running;
+ int fd;
+} DVRData;
+
+static DVRData data_threads[DVR_DEV_COUNT];
+int pvr_init = 0;
+CTvRecord::CTvRecord()
+{
+ AM_DVR_OpenPara_t dpara;
+ memset(&dpara, 0, sizeof(dpara));
+ AM_DVR_Open(DVR_DEV_NO, &dpara);
+ data_threads[DVR_DEV_NO].id = 0;
+ data_threads[DVR_DEV_NO].fd = -1;
+ data_threads[DVR_DEV_NO].running = 0;
+
+ AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0);
+ AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE);
+
+ memset(filename, 0, sizeof(filename));
+ progid = 0xFFFF;
+ vpid = 0x1fff;
+ apid = 0x1fff;
+}
+CTvRecord::~CTvRecord()
+{
+ AM_DVR_Close(DVR_DEV_NO);
+
+}
+void CTvRecord::dvr_init(void)
+{
+ AM_DVR_OpenPara_t para;
+ char buf[32];
+
+ if (pvr_init)
+ return;
+
+ memset(&para, 0, sizeof(para));
+ LOGD("%s,%d", "TV", __LINE__);
+
+ AM_DVR_Open(DVR_DEV_NO, &para);
+ AM_DVR_SetSource(DVR_DEV_NO, AM_DVR_SRC_ASYNC_FIFO0);
+ AM_DVR_SetBufferSize(DVR_DEV_NO, DVR_BUF_SIZE);
+
+ snprintf(buf, sizeof(buf), "%d", (512 * 1024));
+ AM_FileEcho("/sys/class/dmx/asyncfifo_len", buf);
+
+ pvr_init = 1;
+}
+
+char *CTvRecord::GetRecordFileName()
+{
+ return filename;
+}
+void CTvRecord::SetRecordFileName(char *name)
+{
+ strcpy(filename, name);
+}
+void CTvRecord::SetCurRecProgramId(int id)
+{
+ progid = id;
+}
+
+int CTvRecord::dvr_data_write(int fd, uint8_t *buf, int size)
+{
+ int ret;
+ int left = size;
+ uint8_t *p = buf;
+ LOGD("%s,%d", "TV", __LINE__);
+
+ while (left > 0) {
+ ret = write(fd, p, left);
+ if (ret == -1) {
+ if (errno != EINTR) {
+ LOGD("Write DVR data failed: %s", strerror(errno));
+ break;
+ }
+ ret = 0;
+ }
+
+ left -= ret;
+ p += ret;
+ }
+
+ return (size - left);
+}
+void *CTvRecord::dvr_data_thread(void *arg)
+{
+ DVRData *dd = (DVRData *)arg;
+ int cnt;
+ uint8_t buf[256 * 1024];
+
+ LOGD("Data thread for DVR%d start ,record file will save to '%s'", dd->id, dd->file_name);
+ LOGD("%s,%d", "TV", __LINE__);
+
+ while (dd->running) {
+ cnt = AM_DVR_Read(dd->id, buf, sizeof(buf), 1000);
+ if (cnt <= 0) {
+ LOGD("No data available from DVR%d", dd->id);
+ usleep(200 * 1000);
+ continue;
+ }
+ //AM_DEBUG(1, "read from DVR%d return %d bytes", dd->id, cnt);
+ if (dd->fd != -1) {
+ dvr_data_write(dd->fd, buf, cnt);
+ }
+ }
+
+ if (dd->fd != -1) {
+ close(dd->fd);
+ dd->fd = -1;
+ }
+ LOGD("Data thread for DVR%d now exit", dd->id);
+
+ return NULL;
+}
+
+void CTvRecord::start_data_thread(int dev_no)
+{
+ DVRData *dd = &data_threads[dev_no];
+
+ if (dd->running)
+ return;
+ LOGD("%s,%d,dev=%d", "TV", __LINE__, dev_no);
+ dd->fd = open(dd->file_name, O_TRUNC | O_WRONLY | O_CREAT, 0666);
+ if (dd->fd == -1) {
+ LOGD("Cannot open record file '%s' for DVR%d, %s", dd->file_name, dd->id, strerror(errno));
+ return;
+ }
+ dd->running = 1;
+ pthread_create(&dd->thread, NULL, dvr_data_thread, dd);
+}
+void CTvRecord::get_cur_program_pid(int progId)
+{
+ CTvProgram prog;
+ int aindex;
+ CTvProgram::Audio *pA;
+ CTvProgram::Video *pV;
+ int ret = CTvProgram::selectByID(progId, prog);
+ if (ret != 0) return;
+
+ LOGD("%s,%d", "TV", __LINE__);
+ pV = prog.getVideo();
+ if (pV != NULL) {
+ setvpid(pV->getPID());
+ }
+
+ aindex = prog.getCurrAudioTrackIndex();
+ if (-1 == aindex) { //db is default
+ aindex = prog.getCurrentAudio(String8("eng"));
+ if (aindex >= 0) {
+ prog.setCurrAudioTrackIndex(progId, aindex);
+ }
+ }
+
+ if (aindex >= 0) {
+ pA = prog.getAudio(aindex);
+ if (pA != NULL) {
+ setapid(pA->getPID());
+ }
+ }
+
+}
+int CTvRecord::start_dvr()
+{
+ AM_DVR_StartRecPara_t spara;
+ int pid_cnt;
+ int pids[2];
+
+ /**½ö²âÊÔ×î¶à8¸öPID*/
+ get_cur_program_pid(progid);
+ pids[0] = getvpid();
+ pids[1] = getapid();
+
+ strcpy(data_threads[DVR_DEV_NO].file_name, GetRecordFileName());
+ LOGD("%s,%d", "TV", __LINE__);
+ //sprintf(data_threads[DVR_DEV_NO].file_name,"%s","/storage/external_storage/sda4/testdvr.ts");
+ spara.pid_count = 2;
+ memcpy(&spara.pids, pids, sizeof(pids));
+
+ if (AM_DVR_StartRecord(DVR_DEV_NO, &spara) == AM_SUCCESS) {
+ start_data_thread(DVR_DEV_NO);
+ }
+
+ return 0;
+}
+void CTvRecord::stop_data_thread(int dev_no)
+{
+ DVRData *dd = &data_threads[dev_no];
+ LOGD("%s,%d", "TV", __LINE__);
+
+ if (! dd->running)
+ return;
+ dd->running = 0;
+ pthread_join(dd->thread, NULL);
+ LOGD("Data thread for DVR%d has exit", dd->id);
+}
+
+
+void CTvRecord::StartRecord(int id)
+{
+ AM_DVR_OpenPara_t dpara;
+ fe_status_t status;
+ char buf[32];
+
+ AM_FEND_GetStatus(FEND_DEV_NO, &status);
+
+ if (status & FE_HAS_LOCK) {
+ LOGD("locked\n");
+ } else {
+ LOGD("unlocked\n");
+ return ;
+ }
+ SetCurRecProgramId(id);
+ start_dvr();
+
+ return;
+}
+void CTvRecord::StopRecord()
+{
+ int i = 0;
+ LOGD("stop record for %d", DVR_DEV_NO);
+ AM_DVR_StopRecord(DVR_DEV_NO);
+
+ //for (i=0; i< DVR_DEV_COUNT; i++)
+ {
+ if (data_threads[DVR_DEV_NO].running)
+ stop_data_thread(DVR_DEV_NO);
+ //LOGD("Closing DMX%d...", i);
+ }
+
+
+}
+void CTvRecord::SetRecCurTsOrCurProgram(int sel)
+{
+ int i = 0;
+ char buf[50];
+ memset(buf, 0, sizeof(buf));
+ for (; i < 3; i++) {
+ snprintf(buf, sizeof(buf), "/sys/class/stb/dvr%d_mode", i);
+ if (sel)
+ AM_FileEcho(buf, "ts");
+ else
+ AM_FileEcho(buf, "pid");
+ }
+}
+
diff --git a/tvapi/libtv/tv/CTvRecord.h b/tvapi/libtv/tv/CTvRecord.h
index db8599b..e63581d 100644
--- a/tvapi/libtv/tv/CTvRecord.h
+++ b/tvapi/libtv/tv/CTvRecord.h
@@ -1,46 +1,46 @@
-
-
-class CTvRecord {
-private :
- char filename[256];
- int progid;
- int vpid;
- int apid;
- static void dvr_init(void);
- void setvpid(int vid)
- {
- this->vpid = vid;
- }
- int getvpid()
- {
- return vpid;
- }
- void setapid(int aid)
- {
- this->apid = aid;
- }
- int getapid()
- {
- return apid;
- }
- static int dvr_data_write(int fd, uint8_t *buf, int size);
- static void *dvr_data_thread(void *arg);
- char *GetRecordFileName();
- void SetCurRecProgramId(int id);
- void start_data_thread(int dev_no);
- void get_cur_program_pid(int progId);
- int start_dvr(void);
- void stop_data_thread(int dev_no);
-
-
-public:
- CTvRecord();
- ~CTvRecord();
- void SetRecordFileName(char *name);
- void StartRecord(int id);
- void StopRecord();
- void SetRecCurTsOrCurProgram(int sel); // 1: all program in the Ts; 0:current program
-
-
-
-};
+
+
+class CTvRecord {
+private :
+ char filename[256];
+ int progid;
+ int vpid;
+ int apid;
+ static void dvr_init(void);
+ void setvpid(int vid)
+ {
+ this->vpid = vid;
+ }
+ int getvpid()
+ {
+ return vpid;
+ }
+ void setapid(int aid)
+ {
+ this->apid = aid;
+ }
+ int getapid()
+ {
+ return apid;
+ }
+ static int dvr_data_write(int fd, uint8_t *buf, int size);
+ static void *dvr_data_thread(void *arg);
+ char *GetRecordFileName();
+ void SetCurRecProgramId(int id);
+ void start_data_thread(int dev_no);
+ void get_cur_program_pid(int progId);
+ int start_dvr(void);
+ void stop_data_thread(int dev_no);
+
+
+public:
+ CTvRecord();
+ ~CTvRecord();
+ void SetRecordFileName(char *name);
+ void StartRecord(int id);
+ void StopRecord();
+ void SetRecCurTsOrCurProgram(int sel); // 1: all program in the Ts; 0:current program
+
+
+
+};
diff --git a/tvapi/libtv/tv/CTvSatellite.h b/tvapi/libtv/tv/CTvSatellite.h
index 06a7481..df008ad 100644
--- a/tvapi/libtv/tv/CTvSatellite.h
+++ b/tvapi/libtv/tv/CTvSatellite.h
@@ -1,21 +1,21 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvSatellite.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#if !defined(_CTVSATELLITE_H)
-#define _CTVSATELLITE_H
-
-
-// TV SatelliteÏà¹ØÐÅÏ¢
-class CTvSatellite {
-};
-
-#endif //_CTVSATELLITE_H
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvSatellite.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#if !defined(_CTVSATELLITE_H)
+#define _CTVSATELLITE_H
+
+
+// TV SatelliteÏà¹ØÐÅÏ¢
+class CTvSatellite {
+};
+
+#endif //_CTVSATELLITE_H
diff --git a/tvapi/libtv/tv/CTvScanner.cpp b/tvapi/libtv/tv/CTvScanner.cpp
index ecfd6f9..1800808 100644
--- a/tvapi/libtv/tv/CTvScanner.cpp
+++ b/tvapi/libtv/tv/CTvScanner.cpp
@@ -69,7 +69,7 @@ AM_Bool_t CTvScanner::atv_cvbs_lock_check(v4l2_std_id *colorStd)
AM_Bool_t CTvScanner::s_atv_cvbs_lock_check(void *data)
{
- if(data == NULL) return false;
+ if (data == NULL) return false;
AM_SCAN_ATV_LOCK_PARA_t *pAtvPara = (AM_SCAN_ATV_LOCK_PARA_t *)data;
CTvScanner *pScan = (CTvScanner *)(pAtvPara->pData);
v4l2_std_id std;
@@ -81,13 +81,13 @@ AM_Bool_t CTvScanner::s_atv_cvbs_lock_check(void *data)
int CTvScanner::ATVManualScan(int min_freq, int max_freq, int std, int store_Type, int channel_num)
{
stopScan();
- if(min_freq <= 0 || max_freq <= 0 || min_freq == max_freq) {
+ if (min_freq <= 0 || max_freq <= 0 || min_freq == max_freq) {
LOGD("atv manual scan freq error start = %d end = %d", min_freq, max_freq);
return -1;
}
int direction = (max_freq >= min_freq) ? 1 : 0;
- if(!mbScanStart) { //not start or stop
+ if (!mbScanStart) { //not start or stop
//
mCurScanStartFreq = min_freq;
mCurScanEndFreq = max_freq;
@@ -107,7 +107,7 @@ int CTvScanner::ATVManualScan(int min_freq, int max_freq, int std, int store_Typ
para.atv_para.fe_cnt = 3;
para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)));
- if(para.atv_para.fe_paras != NULL) {
+ if (para.atv_para.fe_paras != NULL) {
memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
para.atv_para.fe_paras[0].m_type = FE_ANALOG;
para.atv_para.fe_paras[0].analog.para.frequency = min_freq;
@@ -176,15 +176,16 @@ void CTvScanner::am_scan_atv_store(AM_SCAN_Result_t *result)
AM_SCAN_TS_t *ts;
int i, ret, db_sat_id = -1;
//AM_SCAN_RecTab_t srv_tab;
- for(ts = result->tses; ts != NULL; ts = ts->p_next) {
+ for (ts = result->tses; ts != NULL; ts = ts->p_next) {
//
+ m_s_Scanner->mCurEv.clear();
m_s_Scanner->mCurEv.mType = ScannerEvent::EVENT_ATV_PROG_DATA;
m_s_Scanner->mCurEv.mVideoStd = CFrontEnd::stdAndColorToVideoEnum(ts->analog.std);
m_s_Scanner->mCurEv.mAudioStd = CFrontEnd::stdAndColorToAudioEnum(ts->analog.std);
m_s_Scanner->mCurEv.mIsAutoStd = ((ts->analog.std & V4L2_COLOR_STD_AUTO) == V4L2_COLOR_STD_AUTO) ? 1 : 0;
m_s_Scanner->mCurEv.mFrequency = ts->analog.freq;
//
- m_s_Scanner->mpObserver->onEvent(m_s_Scanner->mCurEv);
+ m_s_Scanner->sendEvent(m_s_Scanner->mCurEv);
}
}
@@ -196,9 +197,9 @@ void CTvScanner::setGlobalScanerObject(CTvScanner *s)
int CTvScanner::autoAtvScan(int min_freq, int max_freq, int std, int search_type)
{
stopScan();
- if(min_freq <= 0 || max_freq <= 0 || min_freq > max_freq)
+ if (min_freq <= 0 || max_freq <= 0 || min_freq > max_freq)
return -1;
- if(!mbScanStart) { //not start or stop
+ if (!mbScanStart) { //not start or stop
mCurScanStartFreq = min_freq;
mCurScanEndFreq = max_freq;
@@ -210,6 +211,7 @@ int CTvScanner::autoAtvScan(int min_freq, int max_freq, int std, int search_type
para.fend_dev_id = 0;//default
para.mode = AM_SCAN_MODE_ATV_DTV;//
+ para.atv_para.mode = AM_SCAN_ATVMODE_AUTO;
if (search_type == 1)
para.atv_para.storeMode = 1;
else
@@ -220,7 +222,7 @@ int CTvScanner::autoAtvScan(int min_freq, int max_freq, int std, int search_type
para.atv_para.fe_cnt = 3;
para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)));
- if(para.atv_para.fe_paras != NULL) {
+ if (para.atv_para.fe_paras != NULL) {
memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
para.atv_para.fe_paras[0].m_type = FE_ANALOG;
para.atv_para.fe_paras[0].analog.para.frequency = min_freq;
@@ -289,118 +291,116 @@ int CTvScanner::autoAtvScan(int min_freq, int max_freq, int std, int search_type
return 0;
}
-/*int CTvScanner::manualAtscScan(int channelID,int attennaType,int std)
+/*
+int CTvScanner::manualAtscScan(int channelID, int attennaType, int std)
{
stopScan();
- if(!mbScanStart) { //not start or stop
- AM_SCAN_CreatePara_t para;
- AM_DMX_OpenPara_t dmx_para;
- AM_SCAN_Handle_t handle = 0;
- int i;
- // Create the scan
- memset(&para, 0, sizeof(para));
-
- //strcpy(para.default_text_lang,"eng");//config
- //strcpy(para.text_langs, "local eng zho chi chs first");//config
- para.fend_dev_id = 0;//default
- para.mode = AM_SCAN_MODE_ADTV;//DTV
- para.atv_para.mode = AM_SCAN_ATVMODE_NONE;
-
+ if (!mbScanStart) { //not start or stop
+ AM_SCAN_CreatePara_t para;
+ AM_DMX_OpenPara_t dmx_para;
+ AM_SCAN_Handle_t handle = 0;
+ int i;
+ // Create the scan
+ memset(&para, 0, sizeof(para));
- para.atv_para.default_std= std;
+ //strcpy(para.default_text_lang,"eng");//config
+ //strcpy(para.text_langs, "local eng zho chi chs first");//config
+ para.fend_dev_id = 0;//default
+ para.mode = AM_SCAN_MODE_ADTV;//DTV
+ para.atv_para.mode = AM_SCAN_ATVMODE_NONE;
+ para.atv_para.default_std = std;
- para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL;//DTV_MODE_ALLBAND
- //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略
- para.dtv_para.source = FE_ATSC;//fe_type
- para.dtv_para.dmx_dev_id = 0;//default 0
- para.dtv_para.resort_all = AM_TRUE;
+ para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL;//DTV_MODE_ALLBAND
+ //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略
+ para.dtv_para.source = FE_ATSC;//fe_type
+ para.dtv_para.dmx_dev_id = 0;//default 0
+ para.dtv_para.resort_all = AM_TRUE;
para.dtv_para.clear_source = AM_FALSE;
para.dtv_para.mix_tv_radio = AM_FALSE;
para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
- para.store_cb = NULL;
+ para.store_cb = NULL;
//para.dtv_para.attenna = attennaType;
para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC;
mSource = para.dtv_para.source;
- Vector<sp<CTvChannel> > vcp;
- //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db
- getAtscChannelPara(attennaType,vcp);
- LOGD("ANDESEN test attenna type is %d",attennaType);
+ Vector<sp<CTvChannel> > vcp;
- int size = vcp.size();
- LOGD("channel list size = %d", size);
- //showboz
- if(size == 0) {
- CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml");
- getAtscChannelPara(attennaType,vcp);
- size = vcp.size();
- }
+ //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db
+ getAtscChannelPara(attennaType, vcp);
+ LOGD("ANDESEN test attenna type is %d", attennaType);
- if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(1, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
- return -1;
+ int size = vcp.size();
+ LOGD("channel list size = %d", size);
+ //showboz
+ if (size == 0) {
+ CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml");
+ getAtscChannelPara(attennaType, vcp);
+ size = vcp.size();
+ }
- //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
+ if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(1, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
+ return -1;
- for (i = 0; i < size; i++) {
- if(channelID == vcp[i]->getLogicalChannelNum())
- {
- para.dtv_para.fe_paras[0].m_type = 3;//MODE_ATSC
- para.dtv_para.fe_paras[0].m_logicalChannelNum = vcp[i]->getLogicalChannelNum();
- para.dtv_para.fe_paras[0].atsc.para.frequency = vcp[i]->getFrequency();
- para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation());
+ //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
+
+ for (i = 0; i < size; i++) {
+ if (channelID == vcp[i]->getLogicalChannelNum()) {
+ para.dtv_para.fe_paras[0].m_type = 3;//MODE_ATSC
+ para.dtv_para.fe_paras[0].atsc.para.frequency = vcp[i]->getFrequency();
+ para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation());
LOGD("andesen test atsc manual type=%d,num=%d,freq=%d,modu=%d",
- para.dtv_para.fe_paras[0].m_type,para.dtv_para.fe_paras[0].m_logicalChannelNum,
- para.dtv_para.fe_paras[0].atsc.para.frequency,para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation);
+ para.dtv_para.fe_paras[0].m_type, para.dtv_para.fe_paras[0].m_logicalChannelNum,
+ para.dtv_para.fe_paras[0].atsc.para.frequency, para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation);
}
- }
- //allband
- para.dtv_para.fe_cnt = 1;
- memset(&dmx_para, 0, sizeof(dmx_para));
- AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
-
- if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) {
- AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
- tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
- }
-
- // prog->dmx_id = para.dtv_para.dmx_dev_id;
- // prog->fend_id = para.fend_dev_id;
- // prog->mode = para.dtv_para.mode;
- // Start Scan
- if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
- LOGD("SCAN CREATE fail");
- handle = 0;
- } else {
- mScanHandle = handle;
- AM_SCAN_SetUserData(handle, (void*)this);
- //注册æœç´¢äº‹ä»¶
- AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
- //注册信å·è´¨é‡é€šçŸ¥äº‹ä»¶
- AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
- if (AM_SCAN_Start(handle) != AM_SUCCESS) {
- AM_SCAN_Destroy(handle, AM_FALSE);
- AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
- AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
- handle = 0;
- }
- }
- if (para.atv_para.fe_paras != NULL)
- free(para.atv_para.fe_paras);
- if (para.dtv_para.fe_paras != NULL)
- free(para.dtv_para.fe_paras);
+ }
+ //allband
+ para.dtv_para.fe_cnt = 1;
+ memset(&dmx_para, 0, sizeof(dmx_para));
+ AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para);
- if (handle == 0) {
- return -1;
- }
- mbScanStart = true;//start call ok
- } else {
- LOGD("scanning and not stop");
- } return 0;
-}*/
+ if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) {
+ AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source);
+ tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id);
+ }
+ // prog->dmx_id = para.dtv_para.dmx_dev_id;
+ // prog->fend_id = para.fend_dev_id;
+ // prog->mode = para.dtv_para.mode;
+ // Start Scan
+ if (AM_SCAN_Create(&para, &handle) != AM_SUCCESS) {
+ LOGD("SCAN CREATE fail");
+ handle = 0;
+ } else {
+ mScanHandle = handle;
+ AM_SCAN_SetUserData(handle, (void *)this);
+ //注册æœç´¢äº‹ä»¶
+ AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
+ //注册信å·è´¨é‡é€šçŸ¥äº‹ä»¶
+ AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
+ if (AM_SCAN_Start(handle) != AM_SUCCESS) {
+ AM_SCAN_Destroy(handle, AM_FALSE);
+ AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
+ AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
+ handle = 0;
+ }
+ }
+ if (para.atv_para.fe_paras != NULL)
+ free(para.atv_para.fe_paras);
+ if (para.dtv_para.fe_paras != NULL)
+ free(para.dtv_para.fe_paras);
+ if (handle == 0) {
+ return -1;
+ }
+ mbScanStart = true;//start call ok
+ } else {
+ LOGD("scanning and not stop");
+ }
+ return 0;
+}
+*/
#define dvb_fend_para(_p) ((struct dvb_frontend_parameters*)(&_p))
#define IS_DVBT2_TS(_para) (_para.m_type == FE_OFDM && _para.terrestrial.para.u.ofdm.ofdm_mode == OFDM_DVBT2)
@@ -458,7 +458,7 @@ void CTvScanner::scan_process_ts_info(AM_SCAN_Result_t *result, AM_SCAN_TS_t *ts
evt->mOfdm_mode = (int)dvb_fend_para(ts->digital.fend_para)->u.ofdm.ofdm_mode;
else if ((ts->digital.fend_para.m_type == FE_DTMB) || (ts->digital.fend_para.m_type == FE_OFDM))
evt->mBandwidth = (int)dvb_fend_para(ts->digital.fend_para)->u.ofdm.bandwidth;
- else if(ts->digital.fend_para.m_type == FE_QAM) {
+ else if (ts->digital.fend_para.m_type == FE_QAM) {
evt->mSymbolRate = (int)dvb_fend_para(ts->digital.fend_para)->u.qam.symbol_rate;
evt->mModulation = (int)dvb_fend_para(ts->digital.fend_para)->u.qam.modulation;
}
@@ -518,7 +518,7 @@ void CTvScanner::scan_extract_srv_info_from_sdt(AM_SCAN_Result_t *result, dvbpsi
#define COPY_NAME(_s, _slen)\
AM_MACRO_BEGIN\
- int copy_len = ((curr_name_len+_slen)>=name_size) ? (name_size-curr_name_len) : _slen;\
+ int copy_len = ((curr_name_len+_slen)>=name_size) ? (name_size-curr_name_len) : _slen;\
if (copy_len > 0) {\
memcpy(srv_info->name+curr_name_len, _s, copy_len);\
curr_name_len += copy_len;\
@@ -665,6 +665,7 @@ void CTvScanner::scan_update_service_info(AM_SCAN_Result_t *result, SCAN_Service
void CTvScanner::scan_store_dvb_ts_evt_service(SCAN_ServiceInfo_t *srv)
{
LOGD("scan_store_dvb_ts_evt_service freq:%d, sid:%d", m_s_Scanner->mCurEv.mFrequency, srv->srv_id);
+ m_s_Scanner->mCurEv.clear();
m_s_Scanner->mCurEv.mServiceId = srv->srv_id;
strncpy(m_s_Scanner->mCurEv.mProgramName, srv->name, 1024);
m_s_Scanner->mCurEv.mprogramType = srv->srv_type;
@@ -678,11 +679,36 @@ void CTvScanner::scan_store_dvb_ts_evt_service(SCAN_ServiceInfo_t *srv)
m_s_Scanner->mCurEv.mAtype[i] = srv->aud_info.audios[i].audio_type;
}
m_s_Scanner->mCurEv.mPcr = srv->pcr_pid;
+ m_s_Scanner->mCurEv.mScnt = srv->sub_info.subtitle_count;
+ for (int i = 0; i < srv->sub_info.subtitle_count; i++) {
+ m_s_Scanner->mCurEv.mStype[i] = TYPE_DVB_SUBTITLE;
+ m_s_Scanner->mCurEv.mSid[i] = srv->sub_info.subtitles[i].pid;
+ m_s_Scanner->mCurEv.mSstype[i] = srv->sub_info.subtitles[i].type;
+ m_s_Scanner->mCurEv.mSid1[i] = srv->sub_info.subtitles[i].comp_page_id;
+ m_s_Scanner->mCurEv.mSid2[i] = srv->sub_info.subtitles[i].anci_page_id;
+ strncpy(m_s_Scanner->mCurEv.mSlang[i], srv->sub_info.subtitles[i].lang, 10);
+ }
+ int scnt = m_s_Scanner->mCurEv.mScnt;
+ for (int i = 0; i < srv->ttx_info.teletext_count; i++) {
+ if (srv->ttx_info.teletexts[i].type == 0x2 ||
+ srv->ttx_info.teletexts[i].type == 0x5){
+ if (scnt >= (sizeof(m_s_Scanner->mCurEv.mStype)/sizeof(int)))
+ break;
+ m_s_Scanner->mCurEv.mStype[scnt] = TYPE_DTV_TELETEXT;
+ m_s_Scanner->mCurEv.mSid[scnt] = srv->ttx_info.teletexts[i].pid;
+ m_s_Scanner->mCurEv.mSstype[scnt] = srv->ttx_info.teletexts[i].type;
+ m_s_Scanner->mCurEv.mSid1[scnt] = srv->ttx_info.teletexts[i].magazine_no;
+ m_s_Scanner->mCurEv.mSid2[scnt] = srv->ttx_info.teletexts[i].page_no;
+ strncpy(m_s_Scanner->mCurEv.mSlang[scnt], srv->ttx_info.teletexts[i].lang, 10);
+ scnt++;
+ }
+ }
+ m_s_Scanner->mCurEv.mScnt = scnt;
m_s_Scanner->mCurEv.mMSG[0] = '\0';
m_s_Scanner->mCurEv.mType = ScannerEvent::EVENT_DTV_PROG_DATA;
- m_s_Scanner->mpObserver->onEvent(m_s_Scanner->mCurEv);
+ m_s_Scanner->sendEvent(m_s_Scanner->mCurEv);
}
void CTvScanner::scan_store_dvb_ts(AM_SCAN_Result_t *result, AM_SCAN_TS_t *ts)
@@ -822,7 +848,7 @@ int CTvScanner::manualDtmbScan(int beginFreq, int endFreq, int modulation)
{
stopScan();
- if(!mbScanStart) { //not start or stop
+ if (!mbScanStart) { //not start or stop
AM_SCAN_CreatePara_t para;
AM_DMX_OpenPara_t dmx_para;
AM_SCAN_Handle_t handle = 0;
@@ -842,11 +868,11 @@ int CTvScanner::manualDtmbScan(int beginFreq, int endFreq, int modulation)
int size = vcp.size();
//@author:hao.fu
- if(size == 0) {
+ if (size == 0) {
return -1;
}
- if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
+ if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
return -1;
for (i = 0; i < size; i++) {
@@ -1090,7 +1116,7 @@ int CTvScanner::autoDtmbScan()
{
stopScan();
- if(!mbScanStart) { //not start or stop
+ if (!mbScanStart) { //not start or stop
AM_SCAN_CreatePara_t para;
AM_DMX_OpenPara_t dmx_para;
AM_SCAN_Handle_t handle = 0;
@@ -1113,13 +1139,13 @@ int CTvScanner::autoDtmbScan()
int size = vcp.size();
LOGD("channel list size = %d", size);
//showboz
- if(size == 0) {
+ if (size == 0) {
CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml");
CTvRegion::getChannelListByName("CHINA,Default DTMB ALL", vcp);
size = vcp.size();
}
- if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
+ if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t)))))
return -1;
//memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t));
@@ -1199,7 +1225,7 @@ int CTvScanner::autoDtmbScan()
para.atv_para.mode = AM_SCAN_ATVMODE_NONE;
- para.atv_para.default_std= std;
+ para.atv_para.default_std= std;
para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND
@@ -1207,20 +1233,20 @@ int CTvScanner::autoDtmbScan()
para.dtv_para.source = FE_ATSC;//fe_type
para.dtv_para.dmx_dev_id = 0;//default 0
para.dtv_para.resort_all = AM_TRUE;
- para.dtv_para.clear_source = AM_TRUE;
- para.dtv_para.mix_tv_radio = AM_FALSE;
- para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
+ para.dtv_para.clear_source = AM_TRUE;
+ para.dtv_para.mix_tv_radio = AM_FALSE;
+ para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID;
para.store_cb = NULL;
- //para.dtv_para.attenna = attennaType;//see dvb atsc-cnc
+ //para.dtv_para.attenna = attennaType;//see dvb atsc-cnc
- para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC;
+ para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC;
- mSource = para.dtv_para.source;
+ mSource = para.dtv_para.source;
Vector<sp<CTvChannel> > vcp;
//CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db
- getAtscChannelPara(attennaType,vcp);
- LOGD("ANDESEN test attenna type is %d",attennaType);
+ getAtscChannelPara(attennaType,vcp);
+ LOGD("ANDESEN test attenna type is %d",attennaType);
int size = vcp.size();
LOGD("channel list size = %d", size);
@@ -1295,7 +1321,7 @@ int CTvScanner::stopScan()
{
LOGD("StopScan mScanHandle=%d", mScanHandle);
//requestExit();
- if(mbScanStart) { //if start ok and not stop
+ if (mbScanStart) { //if start ok and not stop
int ret = AM_SCAN_Destroy(mScanHandle, AM_TRUE);
AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL);
AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL);
@@ -1316,13 +1342,15 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
LOGD("evt evt:%d", event_type);
AM_SCAN_GetUserData((AM_SCAN_Handle_t)dev_no, (void **)&pT);
- if(pT == NULL) {
+ if (pT == NULL) {
return;
}
+ pT->mCurEv.clear();
memset(pT->mCurEv.mProgramName, '\0', sizeof(pT->mCurEv.mProgramName));
memset(pT->mCurEv.mMSG, '\0', sizeof(pT->mCurEv.mMSG));
if (event_type == AM_SCAN_EVT_PROGRESS) {
AM_SCAN_Progress_t *evt = (AM_SCAN_Progress_t *)param;
+ LOGD("progress evt:%d", evt->evt);
switch (evt->evt) {
case AM_SCAN_PROGRESS_SCAN_BEGIN:
pT->mCurEv.mPercent = 0;
@@ -1348,7 +1376,7 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mStandard = tp->fend_para.analog.para.u.analog.std;
pT->mCurEv.mSat_polarisation = tp->fend_para.sat.polarisation;
if (pT->mCurEv.mMode == FE_ANALOG) {
- if(pT->mSource == FE_ATSC) {
+ if (pT->mSource == FE_ATSC) {
pT->mCurEv.mPercent = (tp->index * 100) / tp->total;
} else {
pT->mCurEv.mPercent = 0;
@@ -1363,22 +1391,24 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mPercent = 99;
pT->mCurEv.mLockedStatus = 0;
+ pT->mCurEv.mStrength = 0;
+ pT->mCurEv.mSnr = 0;
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
break;
case AM_SCAN_PROGRESS_TS_END: {
/*pT->mCurEv.mLockedStatus = 0;
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);*/
+ pT->sendEvent(pT->mCurEv);*/
}
break;
case AM_SCAN_PROGRESS_PAT_DONE: /*{
if(pT->mCurEv.mTotalChannelCount == 1) {
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
}*/
break;
@@ -1392,7 +1422,7 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mPercent = 99;
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
}*/
break;
@@ -1405,7 +1435,7 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
}*/
break;
@@ -1417,7 +1447,7 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mPercent = 99;
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
}*/
break;
@@ -1431,7 +1461,7 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
}
break;
@@ -1443,7 +1473,7 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mPercent = 99;
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
}
break;
@@ -1456,7 +1486,7 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
}
break;
@@ -1473,7 +1503,7 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
if (bs_prog->new_tp_cnt > 0) {
int i = 0;
@@ -1487,14 +1517,14 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_NEWCHANNEL;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
}
if (bs_prog->progress >= 100) {
pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_END;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
pT->mCurEv.mPercent = 0;
}
@@ -1504,21 +1534,26 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
case AM_SCAN_PROGRESS_STORE_BEGIN: {
pT->mCurEv.mType = ScannerEvent::EVENT_STORE_BEGIN;
pT->mCurEv.mLockedStatus = 0;
- if(pT->mpObserver != NULL)
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
break;
case AM_SCAN_PROGRESS_STORE_END: {
pT->mCurEv.mLockedStatus = 0;
pT->mCurEv.mType = ScannerEvent::EVENT_STORE_END;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
break;
case AM_SCAN_PROGRESS_SCAN_END: {
pT->mCurEv.mPercent = 100;
pT->mCurEv.mLockedStatus = 0;
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_END;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
+ }
+ break;
+ case AM_SCAN_PROGRESS_SCAN_EXIT: {
+ pT->mCurEv.mLockedStatus = 0;
+ pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_EXIT;
+ pT->sendEvent(pT->mCurEv);
}
break;
case AM_SCAN_PROGRESS_ATV_TUNING: {
@@ -1527,7 +1562,7 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
tmpFreq = (pT->mCurEv.mFrequency - pT->mCurScanStartFreq) / 1000000;
pT->mCurEv.mPercent = tmpFreq * 100UL / ((pT->mCurScanEndFreq - pT->mCurScanStartFreq) / 1000000);
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- pT->mpObserver->onEvent(pT->mCurEv);
+ pT->sendEvent(pT->mCurEv);
}
break;
@@ -1536,12 +1571,15 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
}
} else if (event_type == AM_SCAN_EVT_SIGNAL) {
AM_SCAN_DTVSignalInfo_t *evt = (AM_SCAN_DTVSignalInfo_t *)param;
- pT->mCurEv.mprogramType = 0xff;
+ //pT->mCurEv.mprogramType = 0xff;
pT->mCurEv.mFrequency = (int)evt->frequency;
pT->mCurEv.mLockedStatus = (evt->locked ? 1 : 0);
+ if (pT->mCurEv.mMode == FE_ANALOG && evt->locked)//trick here for atv new prog
+ pT->mCurEv.mLockedStatus |= 0x10;
+
pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS;
- if(pT->mCurEv.mMode != FE_ANALOG && evt->locked) {
+ if (pT->mCurEv.mMode != FE_ANALOG && evt->locked) {
pT->mCurEv.mStrength = evt->strength;
pT->mCurEv.mSnr = evt->snr;
} else {
@@ -1549,8 +1587,10 @@ void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param,
pT->mCurEv.mSnr = 0;
}
- if (pT->mCurEv.mMode == FE_ANALOG)
- pT->mpObserver->onEvent(pT->mCurEv);
+ //if (pT->mCurEv.mMode == FE_ANALOG)
+ pT->sendEvent(pT->mCurEv);
+
+ pT->mCurEv.mLockedStatus &= ~0x10;
}
}
@@ -1568,7 +1608,7 @@ void CTvScanner::tv_scan_reconnect_dmx_to_fend(int dmx_no, int fend_no)
int CTvScanner::getAtscChannelPara(int attennaType, Vector<sp<CTvChannel> > &vcp)
{
- switch(attennaType) { //region name should be remove to config file and read here
+ switch (attennaType) { //region name should be remove to config file and read here
case 1:
CTvRegion::getChannelListByName("U.S.,ATSC Air", vcp);
break;
@@ -1588,3 +1628,14 @@ int CTvScanner::getAtscChannelPara(int attennaType, Vector<sp<CTvChannel> > &vcp
return 0;
}
+void CTvScanner::sendEvent(ScannerEvent &evt)
+{
+ if (mpObserver) {
+ if (evt.mType != ScannerEvent::EVENT_DTV_PROG_DATA) {
+ evt.mAcnt = 0;//avoid invalid count confused the array.
+ evt.mScnt = 0;
+ }
+ mpObserver->onEvent(evt);
+ }
+}
+
diff --git a/tvapi/libtv/tv/CTvScanner.h b/tvapi/libtv/tv/CTvScanner.h
index 85d8617..8176ad1 100644
--- a/tvapi/libtv/tv/CTvScanner.h
+++ b/tvapi/libtv/tv/CTvScanner.h
@@ -52,9 +52,19 @@ public:
static const int EVENT_BLINDSCAN_END = 6;
static const int EVENT_ATV_PROG_DATA = 7;
static const int EVENT_DTV_PROG_DATA = 8;
+ static const int EVENT_SCAN_EXIT = 9;
ScannerEvent(): CTvEv(CTvEv::TV_EVENT_SCANNER)
{
+ clear();
+ }
+ void clear()
+ {
+ mType = -1;
+ mProgramName[0] = '\0';
+ mMSG[0] = '\0';
+ mAcnt = 0;
+ mScnt = 0;
}
~ScannerEvent()
{
@@ -103,6 +113,14 @@ public:
int mAtype[32];
int mPcr;
+ int mScnt;
+ int mStype[32];
+ int mSid[32];
+ int mSstype[32];
+ int mSid1[32];
+ int mSid2[32];
+ char mSlang[32][10];
+
// ScannerEvent(int type){
// this->mType = type;
// }
@@ -131,6 +149,7 @@ private:
static void am_scan_atv_store(AM_SCAN_Result_t *result);
void tv_scan_reconnect_dmx_to_fend(int dmx_no, int fend_no);
int getAtscChannelPara(int attennaType, Vector<sp<CTvChannel> > &vcp);
+ void sendEvent(ScannerEvent &evt);
//
AM_SCAN_Handle_t mScanHandle;
volatile bool mbScanStart;
@@ -157,6 +176,13 @@ private:
static const int ATV_MODE_MANUAL = 2;
//
+ /*subtitle*/
+ static const int TYPE_DVB_SUBTITLE = 1;
+ static const int TYPE_DTV_TELETEXT = 2;
+ static const int TYPE_ATV_TELETEXT = 3;
+ static const int TYPE_DTV_CC = 4;
+ static const int TYPE_ATV_CC = 5;
+
#define AM_SCAN_MAX_SRV_NAME_LANG 4
typedef struct {
diff --git a/tvapi/libtv/tv/CTvScreenCapture.cpp b/tvapi/libtv/tv/CTvScreenCapture.cpp
index 0bd1985..cec4e70 100644
--- a/tvapi/libtv/tv/CTvScreenCapture.cpp
+++ b/tvapi/libtv/tv/CTvScreenCapture.cpp
@@ -1,530 +1,749 @@
-
-#include <stdlib.h>
-#include <fcntl.h>
-#include <strings.h>
-#include <sys/ioctl.h>
-#include <asm/types.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <malloc.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <time.h>
-#include <sys/mman.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <linux/videodev2.h>
-#include <dirent.h>
-
-#include <binder/MemoryHeapBase.h>
-#include <binder/MemoryBase.h>
-
-using namespace android;
-
-
-#include "CTvScreenCapture.h"
-
-#define CLEAR(x) memset (&(x), 0, sizeof (x))
-
-int CTvScreenCapture::xioctl(int fd, int request, void *arg)
-{
- int r = 0;
-
- do {
- r = ioctl(fd, request, arg);
- } while (-1 == r && EINTR == errno);
-
- return r;
-}
-
-int CTvScreenCapture::OpenCamera(struct camera *pCameraDev)
-{
- int iOutRet = 0, iRet;
- struct stat st;
-
- do {
- if(-1 == stat(pCameraDev->device_name, &st)) {
- LOGD( "Cannot identify '%s'\n", pCameraDev->device_name);
- iOutRet = FAILED;
- break;
- }
-
- if (!S_ISCHR(st.st_mode)) {
- LOGD("%s is no device\n", pCameraDev->device_name);
- iOutRet = FAILED;
- break;
- }
-
- pCameraDev->fd = open(pCameraDev->device_name, O_RDWR | O_NONBLOCK, 0); // O_NONBLOCK
- if (SUCCEED > pCameraDev->fd) {
- LOGD("Cannot open '%s'\n", pCameraDev->device_name);
- iOutRet = FAILED;
- break;
- }
- } while(FALSE);
-
- return iOutRet;
-}
-
-
-int CTvScreenCapture::InitVCap(sp<IMemory> Mem)
-{
- int iOutRet = FAILED;
-
- do {
- m_pMem = Mem;
- m_pData = (char *)m_pMem->pointer();
- LOGD("VVVVVVVVVVVVVVVVVVVVVVVVVVVVV %p\n", m_pData);
- //default
- m_capV4l2Cam.device_name = "/dev/video11";
- m_capV4l2Cam.buffers = NULL;
- m_capV4l2Cam.width = 640;
- m_capV4l2Cam.height = 480;
- m_capV4l2Cam.display_depth = 16; //5; /* RGB24 */
- m_capV4l2Cam.frame_number = 25; //fps
- iOutRet = OpenCamera(&m_capV4l2Cam) ;
- if(SUCCEED != iOutRet) {
- LOGD("ERROR:::Open Camera device failed\n");
- break;
- }
- } while(FALSE);
-
- return iOutRet;
-}
-
-int CTvScreenCapture::InitMmap(struct camera *cam)
-{
- int iOutRet = SUCCEED, iRet;
- struct v4l2_requestbuffers req;
-
- do {
- CLEAR(req);
-
- req.count = 4;
- req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- req.memory = V4L2_MEMORY_MMAP;
-
- iRet = xioctl(cam->fd, VIDIOC_REQBUFS, &req);
- if (FAILED == iRet) {
- if (EINVAL == errno) {
- LOGD("VIDIOC_REQBUFS %s does not support memory mapping\n", cam->device_name);
- }
- iOutRet = iRet;
- break;
- }
-
- if (req.count < 2) {
- LOGD("Insufficient buffer memory on %s\n", cam->device_name);
- iOutRet = FAILED;
- break;
- }
-
- cam->buffers = (struct buffer *)calloc(req.count, sizeof(*(cam->buffers)));
- if (!cam->buffers) {
- LOGD("Out of memory\n");
- iOutRet = FAILED;
- break;
- }
-
- for (m_capNumBuffers = 0; m_capNumBuffers < req.count; ++m_capNumBuffers) {
- struct v4l2_buffer buf;
-
- CLEAR(buf);
-
- buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- buf.memory = V4L2_MEMORY_MMAP;
- buf.index = m_capNumBuffers;
-
- if (FAILED == xioctl(cam->fd, VIDIOC_QUERYBUF, &buf)) {
- LOGD("VIDIOC_QUERYBUF ERROR\n");
- iOutRet = FAILED;
- goto IS_ERROR;
- }
-
- cam->buffers[m_capNumBuffers].length = buf.length;
- cam->buffers[m_capNumBuffers].start = mmap(NULL /* start anywhere */,
- buf.length, PROT_READ | PROT_WRITE /* required */,
- MAP_SHARED /* recommended */, cam->fd, buf.m.offset);
-
- if (MAP_FAILED == cam->buffers[m_capNumBuffers].start) {
- iOutRet = FAILED;
- break;
- }
-
-
- }
-
- LOGD("END m_capNumBuffers : %d\n", m_capNumBuffers);
- } while(FALSE);
-IS_ERROR:
- return iOutRet;
-}
-
-int CTvScreenCapture::InitCamera(struct camera *cam)
-{
- int iOutRet = SUCCEED, iRet;
- struct v4l2_capability *cap = &(cam->v4l2_cap);
- struct v4l2_cropcap *cropcap = &(cam->v4l2_cropcap);
- struct v4l2_crop *crop = &(cam->crop);
- struct v4l2_format *fmt = &(cam->v4l2_fmt);
- unsigned int min;
-
- do {
- iRet = xioctl(cam->fd, VIDIOC_QUERYCAP, cap);
- if(FAILED == iRet) {
- if(EINVAL == errno) {
- LOGD("%s is no V4L2 device\n", cam->device_name);
- }
- iOutRet = iRet;
- break;
- }
-
- if(!(cap->capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
- LOGD("%s is no video capture device\n", cam->device_name);
- iOutRet = FAILED;
- break;
- }
-
- if(!(cap->capabilities & V4L2_CAP_STREAMING)) {
- LOGD("%s does not support streaming i/o\n", cam->device_name);
- iOutRet = FAILED;
- break;
- }
-
- LOGD("VIDOOC_QUERYCAP camera driver is [%s] card is [%s] businfo is [%s] version is [%d]\n", cap->driver,
- cap->card, cap->bus_info, cap->version);
-
- /* Select video input, video standard and tune here. */
-
- CLEAR(*cropcap);
- cropcap->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
- crop->c.width = cam->width;
- crop->c.height = cam->height;
- crop->c.left = 0;
- crop->c.top = 0;
- crop->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
- CLEAR(*fmt);
- fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- fmt->fmt.pix.width = cam->width;
- fmt->fmt.pix.height = cam->height;
- fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_NV21;
- fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
- iRet = xioctl(cam->fd, VIDIOC_S_FMT, fmt);
- if (FAILED == iRet) {
- iOutRet = iRet;
- LOGD("VIDIOC_S_FMT is ERROR\n");
- break;
- }
-
- /* Note VIDIOC_S_FMT may change width and height. */
- /* Buggy driver paranoia. */
- min = fmt->fmt.pix.width * 2;
- if (fmt->fmt.pix.bytesperline < min) {
- fmt->fmt.pix.bytesperline = min;
- }
-
- min = fmt->fmt.pix.bytesperline * fmt->fmt.pix.height;
- if (fmt->fmt.pix.sizeimage < min) {
- fmt->fmt.pix.sizeimage = min;
- }
-
- iRet = InitMmap(cam);
- if(FAILED == iRet) {
- LOGD("INIT MMAP FAILED\n");
- iOutRet = iRet;
- break;
- }
-
- } while(FALSE);
-
- return iOutRet;
-
-}
-
-
-int CTvScreenCapture::SetVideoParameter(int width, int height, int frame)
-{
- int iOutRet = SUCCEED, iRet;
-
- do {
- m_capV4l2Cam.width = width;
- m_capV4l2Cam.height = height;
- m_capV4l2Cam.frame_number = frame;
-
- iRet = InitCamera(&m_capV4l2Cam);
- if(SUCCEED != iRet) {
- iOutRet = iRet;
- break;
- }
-
- } while(FALSE);
-
- return iOutRet ;
-}
-
-int CTvScreenCapture::StartCapturing(struct camera *cam)
-{
- unsigned int i;
- int iOutRet = SUCCEED, iRet;
- enum v4l2_buf_type type;
-
- do {
- for (i = 0; i < m_capNumBuffers; ++i) {
- struct v4l2_buffer buf;
-
- //CLEAR(buf);
-
- buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- buf.memory = V4L2_MEMORY_MMAP;
- buf.index = i;
-
- iRet = xioctl(cam->fd, VIDIOC_QBUF, &buf);
- if(FAILED == iRet) {
- iOutRet = iRet;
- goto IS_ERROR;
- }
- }
-
-
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- iRet = xioctl(cam->fd, VIDIOC_STREAMON, &type);
- if(FAILED == iRet) {
- iOutRet = iRet;
- break;
- }
- } while(FALSE);
-IS_ERROR:
-
- return iOutRet;
-}
-
-int CTvScreenCapture::VideoStart()
-{
- int iOutRet = SUCCEED, iRet;
-
- do {
- iRet = StartCapturing(&m_capV4l2Cam);
- if(FAILED == iRet) {
- iOutRet = iRet;
- break;
- }
-
- } while(FALSE);
-
- return iOutRet;
-}
-
-void CTvScreenCapture::yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb)
-{
- register int r, g, b;
- int rgb24;
-
- r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10;
- g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u - 128) ) >> 10;
- b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10;
-
- r = r > 255 ? 255 : r < 0 ? 0 : r;
- g = g > 255 ? 255 : g < 0 ? 0 : g;
- b = b > 255 ? 255 : b < 0 ? 0 : b;
-
- rgb24 = (int)((r << 16) | (g << 8) | b);
-
- /*ARGB*/
- *rgb = (unsigned char)r;
- rgb ++;
- *rgb = (unsigned char)g;
- rgb++;
- *rgb = (unsigned char)b;
- rgb++;
- *rgb = 0xff;
-}
-
-
-void CTvScreenCapture::nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height, int *len)
-{
- int x, y, z = 0;
- int h, w;
- int blocks;
- unsigned char Y1, Y2, U, V;
-
- *len = 0;
-
- blocks = (width * height) * 2;
-
- for(h = 0, z = 0; h < height; h += 2) {
- for (y = 0; y < width * 2; y += 2) {
-
- Y1 = buf[ h * width + y + 0];
- V = buf[ blocks / 2 + h * width / 2 + y % width + 0 ];
- Y2 = buf[ h * width + y + 1];
- U = buf[ blocks / 2 + h * width / 2 + y % width + 1 ];
-
- yuv_to_rgb32(Y1, U, V, &rgb[z]);
- yuv_to_rgb32(Y2, U, V, &rgb[z + 4]);
- z += 8;
- }
- }
- *len = z;
- LOGD("z +++++++++++++++++++++++++++++++++ z %d\n", z);
-}
-
-
-int CTvScreenCapture::GetVideoData(int *length)
-{
- int iOutRet = SUCCEED, iRet;
-
- *length = 0;
- while(true) {
- fd_set fds;
- struct timeval tv;
- FD_ZERO(&fds);
- FD_SET(m_capV4l2Cam.fd, &fds);
- /* Timeout. */
- tv.tv_sec = 0;
- tv.tv_usec = 30000;
- iRet = select(m_capV4l2Cam.fd + 1, &fds, NULL, NULL, &tv);
- if (FAILED == iRet) {
- LOGD("select FAILED\n");
- if (EINTR == errno) {
- LOGD("select FAILED Continue\n");
- continue;
- }
-
- }
-
- if (0 == iRet) {
- LOGD("select timeout\n");
- continue ;
- }
-
- struct v4l2_buffer buf;
- CLEAR(buf);
-
- buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- buf.memory = V4L2_MEMORY_MMAP;
- iRet = xioctl(m_capV4l2Cam.fd, VIDIOC_DQBUF, &buf);
- if(FAILED == iRet) {
- if(errno == EAGAIN) {
- LOGD("GetVideoData EAGAIN \n");
- }
-
- continue;
- }
-
- LOGD("DDDDDDDDDDAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAA %d %d\n", buf.length, iRet);
- int tmpLen = 0;
- nv21_to_rgb32((unsigned char *)m_capV4l2Cam.buffers[buf.index].start, (unsigned char *)m_pData, m_capV4l2Cam.width, m_capV4l2Cam.height, &tmpLen);
- //memcpy(m_pData,m_capV4l2Cam.buffers[buf.index].start, buf.length +1);
- *length = buf.length;
- break;
-
- }
-
- if(*length > 0) {
- mCapEvt.mFrameWide = m_capV4l2Cam.width;
- mCapEvt.mFrameHeight = m_capV4l2Cam.height;
- mCapEvt.mFrameNum = 1;
- mCapEvt.mFrameSize = *length;
- } else {
- mCapEvt.mFrameWide = 0;
- mCapEvt.mFrameHeight = 0;
- mCapEvt.mFrameNum = 0;
- mCapEvt.mFrameSize = 0;
- }
-
- if(NULL != mpObserver) {
- mpObserver->onTvEvent(mCapEvt);
- }
-
- return iOutRet;
-}
-
-int CTvScreenCapture::StopCapturing(struct camera *cam)
-{
- int iOutRet = SUCCEED, iRet;
- enum v4l2_buf_type type;
-
- do {
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
- iRet = xioctl(cam->fd, VIDIOC_STREAMOFF, &type);
- if(FAILED == iRet) {
- iOutRet = iRet;
- break;
- }
- } while(FALSE);
-
- return iOutRet;
-}
-
-int CTvScreenCapture::VideoStop()
-{
- StopCapturing(&m_capV4l2Cam);
- return SUCCEED;
-}
-
-int CTvScreenCapture::UninitCamera(struct camera *cam)
-{
- unsigned int i;
-
- for (i = 0; i < m_capNumBuffers; ++i) {
- if(cam->buffers[i].start == NULL) {
- break;
- }
-
- if (FAILED == munmap(cam->buffers[i].start, cam->buffers[i].length)) {
- LOGD("ERROR::munmap cam buffer failed\n");
- break;
- }
- }
-
- if(NULL != cam->buffers)
- free(cam->buffers);
-
- cam->buffers = NULL;
-
- return SUCCEED;
-}
-
-int CTvScreenCapture::CloseCamera(struct camera *cam)
-{
- int iOutRet = SUCCEED, iRet;
-
- do {
- iRet = close(cam->fd);
- if(FAILED == iRet) {
- iOutRet = iRet;
- break;
- }
-
- cam->fd = -1;
- } while(FALSE);
-
- return iOutRet;
-}
-
-int CTvScreenCapture::DeinitVideoCap()
-{
- UninitCamera(&m_capV4l2Cam);
- CloseCamera(&m_capV4l2Cam);
- return SUCCEED ;
-}
-
-
-CTvScreenCapture::CTvScreenCapture()
-{
- m_capNumBuffers = 0;
- memset(&m_capV4l2Cam, 0x00, sizeof(camera));
- mpObserver = NULL;
-}
-CTvScreenCapture::~CTvScreenCapture()
-{
- memset(&m_capV4l2Cam, 0x00, sizeof(camera));
- m_pData = NULL;
-}
-
+
+#include <stdlib.h>
+#include <fcntl.h>
+#include <strings.h>
+#include <sys/ioctl.h>
+#include <asm/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <malloc.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <time.h>
+#include <sys/mman.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <linux/videodev2.h>
+#include <dirent.h>
+
+#include <binder/MemoryHeapBase.h>
+#include <binder/MemoryBase.h>
+
+//#include <media/stagefright/MediaSource.h>
+//#include <media/stagefright/MediaBuffer.h>
+//#include <OMX_IVCommon.h>
+//#include <media/stagefright/MetaData.h>
+//#include <media/stagefright/ScreenCatch.h>
+using namespace android;
+
+
+#include "CTvScreenCapture.h"
+
+#define CLEAR(x) memset (&(x), 0, sizeof (x))
+
+int CTvScreenCapture::xioctl(int fd, int request, void *arg)
+{
+ /* int r = 0;
+
+ do {
+ r = ioctl(fd, request, arg);
+ } while (-1 == r && EINTR == errno);
+
+ return r;*/
+ return 0;
+}
+
+int CTvScreenCapture::OpenCamera(struct camera *pCameraDev)
+{
+ /*
+ int iOutRet = 0, iRet;
+ struct stat st;
+
+ do {
+ if (-1 == stat(pCameraDev->device_name, &st)) {
+ LOGD( "Cannot identify '%s'\n", pCameraDev->device_name);
+ iOutRet = FAILED;
+ break;
+ }
+
+ if (!S_ISCHR(st.st_mode)) {
+ LOGD("%s is no device\n", pCameraDev->device_name);
+ iOutRet = FAILED;
+ break;
+ }
+
+ pCameraDev->fd = open(pCameraDev->device_name, O_RDWR | O_NONBLOCK, 0); // O_NONBLOCK
+ if (SUCCEED > pCameraDev->fd) {
+ LOGD("Cannot open '%s'\n", pCameraDev->device_name);
+ iOutRet = FAILED;
+ break;
+ }
+ } while (FALSE);
+
+ return iOutRet;*/
+ return 0;
+}
+
+
+int CTvScreenCapture::InitVCap(sp<IMemory> Mem)
+{
+ /* int iOutRet = FAILED;
+
+ do {
+ m_pMem = Mem;
+ m_pData = (char *)m_pMem->pointer();
+ LOGD("VVVVVVVVVVVVVVVVVVVVVVVVVVVVV %p\n", m_pData);
+ //default
+ } while (FALSE);
+
+ return iOutRet;*/
+ return 0;
+}
+
+int CTvScreenCapture::InitMmap(struct camera *cam)
+{
+ /* int iOutRet = SUCCEED, iRet;
+ struct v4l2_requestbuffers req;
+
+ do {
+ CLEAR(req);
+
+ req.count = 4;
+ req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ req.memory = V4L2_MEMORY_MMAP;
+
+ iRet = xioctl(cam->fd, VIDIOC_REQBUFS, &req);
+ if (FAILED == iRet) {
+ if (EINVAL == errno) {
+ LOGD("VIDIOC_REQBUFS %s does not support memory mapping\n", cam->device_name);
+ }
+ iOutRet = iRet;
+ break;
+ }
+
+ if (req.count < 2) {
+ LOGD("Insufficient buffer memory on %s\n", cam->device_name);
+ iOutRet = FAILED;
+ break;
+ }
+
+ cam->buffers = (struct buffer *)calloc(req.count, sizeof(*(cam->buffers)));
+ if (!cam->buffers) {
+ LOGD("Out of memory\n");
+ iOutRet = FAILED;
+ break;
+ }
+
+ for (m_capNumBuffers = 0; m_capNumBuffers < req.count; ++m_capNumBuffers) {
+ struct v4l2_buffer buf;
+
+ CLEAR(buf);
+
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ buf.memory = V4L2_MEMORY_MMAP;
+ buf.index = m_capNumBuffers;
+
+ if (FAILED == xioctl(cam->fd, VIDIOC_QUERYBUF, &buf)) {
+ LOGD("VIDIOC_QUERYBUF ERROR\n");
+ iOutRet = FAILED;
+ goto IS_ERROR;
+ }
+
+ cam->buffers[m_capNumBuffers].length = buf.length;
+ cam->buffers[m_capNumBuffers].start = mmap(NULL \,
+ buf.length, PROT_READ | PROT_WRITE,
+ MAP_SHARED, cam->fd, buf.m.offset);
+
+ if (MAP_FAILED == cam->buffers[m_capNumBuffers].start) {
+ iOutRet = FAILED;
+ break;
+ }
+
+
+ }
+
+ LOGD("END m_capNumBuffers : %d\n", m_capNumBuffers);
+ } while (FALSE);
+ IS_ERROR:
+ return iOutRet;*/
+ return 0;
+}
+
+int CTvScreenCapture::InitCamera(struct camera *cam)
+{
+ /*
+ int iOutRet = SUCCEED, iRet;
+ struct v4l2_capability *cap = &(cam->v4l2_cap);
+ struct v4l2_cropcap *cropcap = &(cam->v4l2_cropcap);
+ struct v4l2_crop *crop = &(cam->crop);
+ struct v4l2_format *fmt = &(cam->v4l2_fmt);
+ unsigned int min;
+
+ do {
+ iRet = xioctl(cam->fd, VIDIOC_QUERYCAP, cap);
+ if (FAILED == iRet) {
+ if (EINVAL == errno) {
+ LOGD("%s is no V4L2 device\n", cam->device_name);
+ }
+ iOutRet = iRet;
+ break;
+ }
+
+ if (!(cap->capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
+ LOGD("%s is no video capture device\n", cam->device_name);
+ iOutRet = FAILED;
+ break;
+ }
+
+ if (!(cap->capabilities & V4L2_CAP_STREAMING)) {
+ LOGD("%s does not support streaming i/o\n", cam->device_name);
+ iOutRet = FAILED;
+ break;
+ }
+
+ LOGD("VIDOOC_QUERYCAP camera driver is [%s] card is [%s] businfo is [%s] version is [%d]\n", cap->driver,
+ cap->card, cap->bus_info, cap->version);
+
+ //* Select video input, video standard and tune here.
+
+ CLEAR(*cropcap);
+ cropcap->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+
+ crop->c.width = cam->width;
+ crop->c.height = cam->height;
+ crop->c.left = 0;
+ crop->c.top = 0;
+ crop->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+
+ CLEAR(*fmt);
+ fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ fmt->fmt.pix.width = cam->width;
+ fmt->fmt.pix.height = cam->height;
+ fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_NV21;
+ fmt->fmt.pix.field = V4L2_FIELD_INTERLACED;
+ iRet = xioctl(cam->fd, VIDIOC_S_FMT, fmt);
+ if (FAILED == iRet) {
+ iOutRet = iRet;
+ LOGD("VIDIOC_S_FMT is ERROR\n");
+ break;
+ }
+
+ //* Note VIDIOC_S_FMT may change width and height.
+ //* Buggy driver paranoia.
+ min = fmt->fmt.pix.width * 2;
+ LOGD("bytesperline : %d w:h [%d %d]\n", fmt->fmt.pix.bytesperline, fmt->fmt.pix.width, fmt->fmt.pix.height);
+ if (fmt->fmt.pix.bytesperline < min) {
+ fmt->fmt.pix.bytesperline = min;
+ }
+
+ min = fmt->fmt.pix.bytesperline * fmt->fmt.pix.height;
+ if (fmt->fmt.pix.sizeimage < min) {
+ fmt->fmt.pix.sizeimage = min;
+ }
+
+ iRet = InitMmap(cam);
+ if (FAILED == iRet) {
+ LOGD("INIT MMAP FAILED\n");
+ iOutRet = iRet;
+ break;
+ }
+
+ } while (FALSE);
+
+ return iOutRet;
+ */
+ return 0;
+}
+
+
+int CTvScreenCapture::SetVideoParameter(int width, int height, int frame)
+{
+ /*
+ int iOutRet = SUCCEED, iRet;
+
+ do {
+ m_capV4l2Cam.device_name = "/dev/video11";
+ m_capV4l2Cam.buffers = NULL;
+ m_capV4l2Cam.width = 1280;
+ m_capV4l2Cam.height = 720;
+ m_capV4l2Cam.display_depth = 24; //5; //* RGB24
+ m_capV4l2Cam.frame_number = 1; //fps
+ iOutRet = OpenCamera(&m_capV4l2Cam) ;
+ if (SUCCEED != iOutRet) {
+ LOGD("ERROR:::Open Camera device failed\n");
+ break;
+ }
+ m_capV4l2Cam.width = width;
+ m_capV4l2Cam.height = height;
+ m_capV4l2Cam.frame_number = frame;
+
+ iRet = InitCamera(&m_capV4l2Cam);
+ if (SUCCEED != iRet) {
+ iOutRet = iRet;
+ break;
+ }
+
+ } while (FALSE);
+
+ return iOutRet ;*/
+ return 0;
+}
+
+int CTvScreenCapture::StartCapturing(struct camera *cam)
+{
+ /*
+ unsigned int i;
+ int iOutRet = SUCCEED, iRet;
+ enum v4l2_buf_type type;
+
+ do {
+ for (i = 0; i < m_capNumBuffers; ++i) {
+ struct v4l2_buffer buf;
+
+ //CLEAR(buf);
+
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ buf.memory = V4L2_MEMORY_MMAP;
+ buf.index = i;
+
+ iRet = xioctl(cam->fd, VIDIOC_QBUF, &buf);
+ if (FAILED == iRet) {
+ iOutRet = iRet;
+ goto IS_ERROR;
+ }
+ }
+
+
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ iRet = xioctl(cam->fd, VIDIOC_STREAMON, &type);
+ if (FAILED == iRet) {
+ iOutRet = iRet;
+ break;
+ }
+ } while (FALSE);
+ IS_ERROR:
+
+ return iOutRet;*/
+ return 0;
+}
+
+int CTvScreenCapture::VideoStart()
+{
+ /*
+ int iOutRet = SUCCEED, iRet;
+
+ do {
+ iRet = StartCapturing(&m_capV4l2Cam);
+ if (FAILED == iRet) {
+ iOutRet = iRet;
+ break;
+ }
+
+ } while (FALSE);
+
+ return iOutRet;*/
+ return 0;
+}
+
+void CTvScreenCapture::yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb)
+{
+ /*
+ register int r, g, b;
+ int rgb24;
+
+ r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10;
+ g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u - 128) ) >> 10;
+ b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10;
+
+ r = r > 255 ? 255 : r < 0 ? 0 : r;
+ g = g > 255 ? 255 : g < 0 ? 0 : g;
+ b = b > 255 ? 255 : b < 0 ? 0 : b;
+
+ rgb24 = (int)((r << 16) | (g << 8) | b);
+
+ //*ARGB
+ *rgb = (unsigned char)r;
+ rgb ++;
+ *rgb = (unsigned char)g;
+ rgb++;
+ *rgb = (unsigned char)b;
+ rgb++;
+ *rgb = 0xff;*/
+ return;
+}
+
+
+void CTvScreenCapture::nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height, int *len)
+{
+ /*
+ int x, y, z = 0;
+ int h, w;
+ int blocks;
+ unsigned char Y1, Y2, U, V;
+
+ *len = 0;
+
+ blocks = (width * height) * 2;
+
+ for (h = 0, z = 0; h < height; h += 2) {
+ for (y = 0; y < width * 2; y += 2) {
+
+ Y1 = buf[ h * width + y + 0];
+ V = buf[ blocks / 2 + h * width / 2 + y % width + 0 ];
+ Y2 = buf[ h * width + y + 1];
+ U = buf[ blocks / 2 + h * width / 2 + y % width + 1 ];
+
+ yuv_to_rgb32(Y1, U, V, &rgb[z]);
+ yuv_to_rgb32(Y2, U, V, &rgb[z + 4]);
+ z += 8;
+ }
+ }
+ *len = z;
+ LOGD("z +++++++++++++++++++++++++++++++++ z %d\n", z);*/
+ return;
+}
+
+
+int CTvScreenCapture::GetVideoData(int *length)
+{
+ /*
+ int iOutRet = SUCCEED, iRet;
+
+ *length = 0;
+ while (true) {
+ fd_set fds;
+ struct timeval tv;
+ FD_ZERO(&fds);
+ FD_SET(m_capV4l2Cam.fd, &fds);
+ //* Timeout.
+ tv.tv_sec = 0;
+ tv.tv_usec = 30000;
+ iRet = select(m_capV4l2Cam.fd + 1, &fds, NULL, NULL, &tv);
+ if (FAILED == iRet) {
+ LOGD("select FAILED\n");
+ if (EINTR == errno) {
+ LOGD("select FAILED Continue\n");
+ continue;
+ }
+
+ }
+
+ if (0 == iRet) {
+ LOGD("select timeout\n");
+ continue ;
+ }
+
+ struct v4l2_buffer buf;
+ CLEAR(buf);
+
+ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ buf.memory = V4L2_MEMORY_MMAP;
+ iRet = xioctl(m_capV4l2Cam.fd, VIDIOC_DQBUF, &buf);
+ if (FAILED == iRet) {
+ if (errno == EAGAIN) {
+ LOGD("GetVideoData EAGAIN \n");
+ }
+
+ continue;
+ }
+
+ LOGD("DDDDDDDDDDAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAA %d %d [width:%d] [height:%d]\n", buf.length, iRet,
+ m_capV4l2Cam.width, m_capV4l2Cam.height);
+ int tmpLen = 0;
+ nv21_to_rgb32((unsigned char *)m_capV4l2Cam.buffers[buf.index].start, (unsigned char *)m_pData, m_capV4l2Cam.width, m_capV4l2Cam.height, &tmpLen);
+ //memcpy(m_pData,m_capV4l2Cam.buffers[buf.index].start, buf.length +1);
+ *length = buf.length;
+ break;
+
+ }
+
+ if (*length > 0) {
+ mCapEvt.mFrameWide = m_capV4l2Cam.width;
+ mCapEvt.mFrameHeight = m_capV4l2Cam.height;
+ mCapEvt.mFrameNum = 1;
+ mCapEvt.mFrameSize = *length;
+ } else {
+ mCapEvt.mFrameWide = 0;
+ mCapEvt.mFrameHeight = 0;
+ mCapEvt.mFrameNum = 0;
+ mCapEvt.mFrameSize = 0;
+ }
+
+ if (NULL != mpObserver) {
+ mpObserver->onTvEvent(mCapEvt);
+ }
+
+ return iOutRet;*/
+ return 0;
+}
+
+int CTvScreenCapture::StopCapturing(struct camera *cam)
+{
+ /*
+ int iOutRet = SUCCEED, iRet;
+ enum v4l2_buf_type type;
+
+ do {
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+
+ iRet = xioctl(cam->fd, VIDIOC_STREAMOFF, &type);
+ if (FAILED == iRet) {
+ iOutRet = iRet;
+ break;
+ }
+ } while (FALSE);
+
+ return iOutRet;*/
+ return 0;
+}
+
+int CTvScreenCapture::VideoStop()
+{
+ /*
+ StopCapturing(&m_capV4l2Cam);
+ UninitCamera(&m_capV4l2Cam);
+ return SUCCEED;*/
+ return 0;
+}
+
+int CTvScreenCapture::UninitCamera(struct camera *cam)
+{
+ /*
+ unsigned int i;
+
+ for (i = 0; i < m_capNumBuffers; ++i) {
+ if (cam->buffers[i].start == NULL) {
+ break;
+ }
+
+ if (FAILED == munmap(cam->buffers[i].start, cam->buffers[i].length)) {
+ LOGD("ERROR::munmap cam buffer failed\n");
+ break;
+ }
+ }
+
+ if (NULL != cam->buffers)
+ free(cam->buffers);
+
+ cam->buffers = NULL;
+
+ return SUCCEED;*/
+ return 0;
+}
+
+int CTvScreenCapture::CloseCamera(struct camera *cam)
+{
+ /*
+ int iOutRet = SUCCEED, iRet;
+
+ do {
+ if (cam->fd > 0) {
+ iRet = close(cam->fd);
+ if (FAILED == iRet) {
+ iOutRet = iRet;
+ break;
+ }
+
+ cam->fd = -1;
+ }
+ } while (FALSE);
+
+ return iOutRet;*/
+ return 0;
+}
+
+int CTvScreenCapture::DeinitVideoCap()
+{
+ /*
+ CloseCamera(&m_capV4l2Cam);
+ return SUCCEED ;
+ */
+ return 0;
+}
+
+int CTvScreenCapture::AmvideocapCapFrame(char *buf, int size, int *w, int *h, int *ret_size)
+{
+ /*
+ int iOutRet = SUCCEED, iRet;
+ int iDevFd = -1;
+ int format = FORMAT_S32_ABGR;
+
+ do {
+ iDevFd = open(VIDEOCAPDEV, O_RDWR);
+ if (iDevFd < 0) {
+ LOGD("ERROR,open amvideocap0 failed\n");
+ iOutRet = FAILED;
+ break;
+ }
+
+ if ((w != NULL) && (*w > 0)) {
+ iRet = ioctl(iDevFd, AMVIDEOCAP_IOW_SET_WANTFRAME_WIDTH, *w);
+ if (iRet < 0) {
+ iOutRet = iRet;
+ break;
+ }
+ }
+
+ if ((h != NULL) && (*h > 0)) {
+
+ iRet = ioctl(iDevFd, AMVIDEOCAP_IOW_SET_WANTFRAME_HEIGHT, *h);
+ if (iRet < 0) {
+ iOutRet = iRet;
+ break;
+ }
+ }
+
+ iRet = ioctl(iDevFd, AMVIDEOCAP_IOW_SET_WANTFRAME_FORMAT, format);
+ if (iRet < 0) {
+ iOutRet = iRet;
+ break;
+ }
+
+ *ret_size = read(iDevFd, buf, size);
+ if (0 == *ret_size) {
+ LOGD("ERROR:: Cann't Read video data\n");
+ iOutRet = FAILED;
+ *ret_size = 0;
+ break;
+ }
+
+ LOGD("========== Got Data Size : %d ==============\n", *ret_size);
+ #if 0
+ if (w != NULL) {
+ iRet = ioctl(iDevFd, AMVIDEOCAP_IOR_GET_FRAME_WIDTH, w);
+ }
+
+ if (h != NULL) {
+ iRet = ioctl(iDevFd, AMVIDEOCAP_IOR_GET_FRAME_HEIGHT, h);
+ }
+ #endif
+ } while (FALSE);
+
+ close(iDevFd);
+
+ return iOutRet;*/
+ return 0;
+}
+
+int CTvScreenCapture::CapOsdAndVideoLayer(int width, int height)
+{
+ /*
+ int iOutRet = SUCCEED, iRet;
+ status_t iStatus;
+ ScreenCatch *mScreenCatch = NULL;
+ MetaData *pMeta = NULL;
+ MediaBuffer *buffer = NULL;
+ int dataLen = 0;
+
+ do {
+ mScreenCatch = new ScreenCatch(width, height, 32);
+ if (NULL == mScreenCatch) {
+ LOGD("ERROR!!! mScreenCatch is NULL\n");
+ iOutRet = FAILED;
+ break;
+ }
+
+ pMeta = new MetaData();
+ if (NULL == pMeta) {
+ LOGD("ERROR!!! pMeta is NULL\n");
+ iOutRet = FAILED;
+ break;
+ }
+ pMeta->setInt32(kKeyColorFormat, OMX_COLOR_Format32bitARGB8888);
+
+ mScreenCatch->start(pMeta);
+
+ while (true) {
+ iStatus = mScreenCatch->read(&buffer);
+ if (iStatus != OK ) {
+ usleep(1000);
+ continue;
+ }
+
+ if (NULL == buffer) {
+ iOutRet = FAILED;
+ break;
+ }
+
+ LOGD("DDDDDDDDDDAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAA %d %d\n", buffer->size(), iStatus);
+ //nv21_to_rgb32((unsigned char*)buffer->data(),(unsigned char *)m_pData,width,height,&dataLen);
+ memcpy((unsigned char *)m_pData, (unsigned char *)buffer->data(), buffer->size());
+ break;
+ }
+
+ } while (FALSE);
+
+ if (dataLen > 0) {
+ mCapEvt.mFrameWide = width;
+ mCapEvt.mFrameHeight = height;
+ mCapEvt.mFrameNum = 1;
+ mCapEvt.mFrameSize = dataLen;
+ } else {
+ mCapEvt.mFrameWide = 0;
+ mCapEvt.mFrameHeight = 0;
+ mCapEvt.mFrameNum = 0;
+ mCapEvt.mFrameSize = 0;
+ }
+
+ if (NULL != mpObserver) {
+ mpObserver->onTvEvent(mCapEvt);
+ }
+
+ mScreenCatch->stop();
+
+ mScreenCatch->free(buffer);
+ buffer = NULL;
+ return iOutRet;*/
+ return 0;
+}
+
+int CTvScreenCapture::CapMediaPlayerVideoLayerOnly(int width, int height)
+{
+ /*
+ int iOutRet = SUCCEED, iRet;
+ int ibufSize, iDataSize = 0;
+ int w, h;
+
+ do {
+ ibufSize = width * height * 4;
+ w = width;
+ h = height;
+
+ iRet = AmvideocapCapFrame(m_pData, ibufSize, &w, &h, &iDataSize);
+ if (SUCCEED != iRet) {
+ LOGD("AmvideocapCapFrame Cannt CapFram\n");
+ iOutRet = iRet;
+ break;
+ }
+
+ LOGD("GOT DDDDDDDDDAAAAAAAATTTTTTTTTTTAAAAAA Size : %d w:%d h: %d\n", iDataSize, w, h);
+
+ if (iDataSize > 0) {
+ mCapEvt.mFrameWide = w;
+ mCapEvt.mFrameHeight = h;
+ mCapEvt.mFrameNum = 1;
+ mCapEvt.mFrameSize = iDataSize;
+ } else {
+ mCapEvt.mFrameWide = 0;
+ mCapEvt.mFrameHeight = 0;
+ mCapEvt.mFrameNum = 0;
+ mCapEvt.mFrameSize = 0;
+ }
+
+ if (NULL != mpObserver) {
+ mpObserver->onTvEvent(mCapEvt);
+ }
+ } while (FALSE);
+
+ return iOutRet;*/
+ return 0;
+}
+
+CTvScreenCapture::CTvScreenCapture()
+{
+ /*
+ m_capNumBuffers = 0;
+ memset(&m_capV4l2Cam, 0x00, sizeof(camera));
+ mpObserver = NULL;*/
+ return ;
+}
+CTvScreenCapture::~CTvScreenCapture()
+{
+ /*
+ memset(&m_capV4l2Cam, 0x00, sizeof(camera));
+ m_pData = NULL;*/
+}
+
diff --git a/tvapi/libtv/tv/CTvScreenCapture.h b/tvapi/libtv/tv/CTvScreenCapture.h
index 09a4bbb..194fa44 100644
--- a/tvapi/libtv/tv/CTvScreenCapture.h
+++ b/tvapi/libtv/tv/CTvScreenCapture.h
@@ -1,174 +1,177 @@
-#ifndef CTVSCREENCAPTURE_H__
-#define CTVSCREENCAPTURE_H__
-
-#define VIDEOCAPDEV "/dev/amvideocap0"
-
-#define AMVIDEOCAP_IOC_MAGIC 'V'
-#include <linux/videodev2.h>
-#include <binder/MemoryHeapBase.h>
-#include <binder/MemoryBase.h>
-#include "CTvLog.h"
-#include "CTvEv.h"
-
-#define CAP_FLAG_AT_CURRENT 0
-#define CAP_FLAG_AT_TIME_WINDOW 1
-#define CAP_FLAG_AT_END 2
-
-
-#define FALSE 0
-#define SUCCEED 0
-#define FAILED -1
-
-using namespace android;
-
-struct buffer {
- void *start;
- size_t length;
-};
-
-
-struct camera {
- char *device_name;
- int fd;
- int width;
- int height;
- int display_depth;
- int image_size;
- int frame_number; //fps
- int bitrate ; // bitrate
- struct v4l2_capability v4l2_cap;
- struct v4l2_cropcap v4l2_cropcap;
- struct v4l2_format v4l2_fmt;
- struct v4l2_crop crop;
- struct buffer *buffers;
-};
-
-/*
-format see linux/ge2d/ge2d.h
-like:
-GE2D_FORMAT_S24_RGB
-*/
-#define ENDIAN_SHIFT 24
-#define LITTLE_ENDIAN (1 << ENDIAN_SHIFT)
-#define FMT_S24_RGB (LITTLE_ENDIAN|0x00200) /* 10_00_0_00_0_00 */
-#define FMT_S16_RGB (LITTLE_ENDIAN|0x00100) /* 01_00_0_00_0_00 */
-#define FMT_S32_RGBA (LITTLE_ENDIAN|0x00300) /* 11_00_0_00_0_00 */
-
-#define COLOR_MAP_SHIFT 20
-#define COLOR_MAP_MASK (0xf << COLOR_MAP_SHIFT)
-/* 16 bit */
-#define COLOR_MAP_RGB565 (5 << COLOR_MAP_SHIFT)
-/* 24 bit */
-#define COLOR_MAP_RGB888 (0 << COLOR_MAP_SHIFT)
-#define COLOR_MAP_BGR888 (5 << COLOR_MAP_SHIFT)
-/* 32 bit */
-#define COLOR_MAP_RGBA8888 (0 << COLOR_MAP_SHIFT)
-#define COLOR_MAP_ARGB8888 (1 << COLOR_MAP_SHIFT)
-#define COLOR_MAP_ABGR8888 (2 << COLOR_MAP_SHIFT)
-#define COLOR_MAP_BGRA8888 (3 << COLOR_MAP_SHIFT)
-
-/*16 bit*/
-#define FORMAT_S16_RGB_565 (FMT_S16_RGB | COLOR_MAP_RGB565)
-/*24 bit*/
-#define FORMAT_S24_BGR (FMT_S24_RGB | COLOR_MAP_BGR888)
-#define FORMAT_S24_RGB (FMT_S24_RGB | COLOR_MAP_RGB888)
-/*32 bit*/
-#define FORMAT_S32_ARGB (FMT_S32_RGBA | COLOR_MAP_ARGB8888)
-#define FORMAT_S32_ABGR (FMT_S32_RGBA | COLOR_MAP_ABGR8888)
-#define FORMAT_S32_BGRA (FMT_S32_RGBA | COLOR_MAP_BGRA8888)
-#define FORMAT_S32_RGBA (FMT_S32_RGBA | COLOR_MAP_RGBA8888)
-
-#define AMVIDEOCAP_IOW_SET_WANTFRAME_FORMAT _IOW(AMVIDEOCAP_IOC_MAGIC, 0x01, int)
-#define AMVIDEOCAP_IOW_SET_WANTFRAME_WIDTH _IOW(AMVIDEOCAP_IOC_MAGIC, 0x02, int)
-#define AMVIDEOCAP_IOW_SET_WANTFRAME_HEIGHT _IOW(AMVIDEOCAP_IOC_MAGIC, 0x03, int)
-#define AMVIDEOCAP_IOW_SET_WANTFRAME_TIMESTAMP_MS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x04, u64)
-#define AMVIDEOCAP_IOW_SET_WANTFRAME_WAIT_MAX_MS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x05, u64)
-#define AMVIDEOCAP_IOW_SET_WANTFRAME_AT_FLAGS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x06, int)
-
-
-#define AMVIDEOCAP_IOR_GET_FRAME_FORMAT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x10, int)
-#define AMVIDEOCAP_IOR_GET_FRAME_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x11, int)
-#define AMVIDEOCAP_IOR_GET_FRAME_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x12, int)
-#define AMVIDEOCAP_IOR_GET_FRAME_TIMESTAMP_MS _IOR(AMVIDEOCAP_IOC_MAGIC, 0x13, int)
-
-
-#define AMVIDEOCAP_IOR_GET_SRCFRAME_FORMAT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x20, int)
-#define AMVIDEOCAP_IOR_GET_SRCFRAME_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x21, int)
-#define AMVIDEOCAP_IOR_GET_SRCFRAME_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x22, int)
-
-
-#define AMVIDEOCAP_IOR_GET_STATE _IOR(AMVIDEOCAP_IOC_MAGIC, 0x31, int)
-#define AMVIDEOCAP_IOW_SET_START_CAPTURE _IOW(AMVIDEOCAP_IOC_MAGIC, 0x32, int)
-#define AMVIDEOCAP_IOW_SET_CANCEL_CAPTURE _IOW(AMVIDEOCAP_IOC_MAGIC, 0x33, int)
-
-#define AMVIDEOCAP_IOR_SET_SRC_X _IOR(AMVIDEOCAP_IOC_MAGIC, 0x40, int)
-#define AMVIDEOCAP_IOR_SET_SRC_Y _IOR(AMVIDEOCAP_IOC_MAGIC, 0x41, int)
-#define AMVIDEOCAP_IOR_SET_SRC_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x42, int)
-#define AMVIDEOCAP_IOR_SET_SRC_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x43, int)
-
-enum amvideocap_state {
- AMVIDEOCAP_STATE_INIT = 0,
- AMVIDEOCAP_STATE_ON_CAPTURE = 200,
- AMVIDEOCAP_STATE_FINISHED_CAPTURE = 300,
- AMVIDEOCAP_STATE_ERROR = 0xffff,
-};
-
-class CTvScreenCapture {
-public:
- CTvScreenCapture();
- ~CTvScreenCapture();
-
- int InitVCap(sp<IMemory> Mem);
- int SetVideoParameter(int width, int height, int frame);
- int VideoStart();
- int GetVideoData( int *length);
- int VideoStop();
- int DeinitVideoCap();
- class CapEvent : public CTvEv {
- public:
- CapEvent(): CTvEv(CTvEv::TV_EVENT_HDMI_IN_CAP) {};
- ~CapEvent() {};
-
- int mFrameNum;
- int mFrameWide;
- int mFrameHeight;
- int mFrameSize;
- };
-
- class TvIObserver {
- public:
- TvIObserver() {};
- virtual ~TvIObserver() {};
- virtual void onTvEvent ( const CTvEv &ev ) = 0;
- };
-
- int setObserver(TvIObserver *ob)
- {
- mpObserver = ob;
- return 0;
- }
-
-private:
-
- int xioctl(int fd, int request, void *arg);
- int OpenCamera(struct camera *pCameraDev);
- int InitMmap(struct camera *cam) ;
- //int SetFrameRate( struct camera *cam);
- int InitCamera(struct camera *cam) ;
- int StartCapturing(struct camera *cam);
- int StopCapturing(struct camera *cam);
- int UninitCamera(struct camera *cam);
- int CloseCamera(struct camera *cam);
- void yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb);
- void nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height, int *len);
-private:
- sp<IMemory> m_pMem;
- camera m_capV4l2Cam;
- unsigned int m_capNumBuffers;
-
- char *m_pData;
- TvIObserver *mpObserver;
- CapEvent mCapEvt;
-};
-#endif
-
+#ifndef CTVSCREENCAPTURE_H__
+#define CTVSCREENCAPTURE_H__
+
+#define VIDEOCAPDEV "/dev/amvideocap0"
+
+#define AMVIDEOCAP_IOC_MAGIC 'V'
+#include <linux/videodev2.h>
+#include <binder/MemoryHeapBase.h>
+#include <binder/MemoryBase.h>
+#include "CTvLog.h"
+#include "CTvEv.h"
+
+#define CAP_FLAG_AT_CURRENT 0
+#define CAP_FLAG_AT_TIME_WINDOW 1
+#define CAP_FLAG_AT_END 2
+
+
+#define FALSE 0
+#define SUCCEED 0
+#define FAILED -1
+
+using namespace android;
+
+struct buffer {
+ void *start;
+ size_t length;
+};
+
+
+struct camera {
+ char *device_name;
+ int fd;
+ int width;
+ int height;
+ int display_depth;
+ int image_size;
+ int frame_number; //fps
+ int bitrate ; // bitrate
+ struct v4l2_capability v4l2_cap;
+ struct v4l2_cropcap v4l2_cropcap;
+ struct v4l2_format v4l2_fmt;
+ struct v4l2_crop crop;
+ struct buffer *buffers;
+};
+
+/*
+format see linux/ge2d/ge2d.h
+like:
+GE2D_FORMAT_S24_RGB
+*/
+#define ENDIAN_SHIFT 24
+#define LITTLE_ENDIAN (1 << ENDIAN_SHIFT)
+#define FMT_S24_RGB (LITTLE_ENDIAN|0x00200) /* 10_00_0_00_0_00 */
+#define FMT_S16_RGB (LITTLE_ENDIAN|0x00100) /* 01_00_0_00_0_00 */
+#define FMT_S32_RGBA (LITTLE_ENDIAN|0x00300) /* 11_00_0_00_0_00 */
+
+#define COLOR_MAP_SHIFT 20
+#define COLOR_MAP_MASK (0xf << COLOR_MAP_SHIFT)
+/* 16 bit */
+#define COLOR_MAP_RGB565 (5 << COLOR_MAP_SHIFT)
+/* 24 bit */
+#define COLOR_MAP_RGB888 (0 << COLOR_MAP_SHIFT)
+#define COLOR_MAP_BGR888 (5 << COLOR_MAP_SHIFT)
+/* 32 bit */
+#define COLOR_MAP_RGBA8888 (0 << COLOR_MAP_SHIFT)
+#define COLOR_MAP_ARGB8888 (1 << COLOR_MAP_SHIFT)
+#define COLOR_MAP_ABGR8888 (2 << COLOR_MAP_SHIFT)
+#define COLOR_MAP_BGRA8888 (3 << COLOR_MAP_SHIFT)
+
+/*16 bit*/
+#define FORMAT_S16_RGB_565 (FMT_S16_RGB | COLOR_MAP_RGB565)
+/*24 bit*/
+#define FORMAT_S24_BGR (FMT_S24_RGB | COLOR_MAP_BGR888)
+#define FORMAT_S24_RGB (FMT_S24_RGB | COLOR_MAP_RGB888)
+/*32 bit*/
+#define FORMAT_S32_ARGB (FMT_S32_RGBA | COLOR_MAP_ARGB8888)
+#define FORMAT_S32_ABGR (FMT_S32_RGBA | COLOR_MAP_ABGR8888)
+#define FORMAT_S32_BGRA (FMT_S32_RGBA | COLOR_MAP_BGRA8888)
+#define FORMAT_S32_RGBA (FMT_S32_RGBA | COLOR_MAP_RGBA8888)
+
+#define AMVIDEOCAP_IOW_SET_WANTFRAME_FORMAT _IOW(AMVIDEOCAP_IOC_MAGIC, 0x01, int)
+#define AMVIDEOCAP_IOW_SET_WANTFRAME_WIDTH _IOW(AMVIDEOCAP_IOC_MAGIC, 0x02, int)
+#define AMVIDEOCAP_IOW_SET_WANTFRAME_HEIGHT _IOW(AMVIDEOCAP_IOC_MAGIC, 0x03, int)
+#define AMVIDEOCAP_IOW_SET_WANTFRAME_TIMESTAMP_MS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x04, u64)
+#define AMVIDEOCAP_IOW_SET_WANTFRAME_WAIT_MAX_MS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x05, u64)
+#define AMVIDEOCAP_IOW_SET_WANTFRAME_AT_FLAGS _IOW(AMVIDEOCAP_IOC_MAGIC, 0x06, int)
+
+
+#define AMVIDEOCAP_IOR_GET_FRAME_FORMAT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x10, int)
+#define AMVIDEOCAP_IOR_GET_FRAME_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x11, int)
+#define AMVIDEOCAP_IOR_GET_FRAME_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x12, int)
+#define AMVIDEOCAP_IOR_GET_FRAME_TIMESTAMP_MS _IOR(AMVIDEOCAP_IOC_MAGIC, 0x13, int)
+
+
+#define AMVIDEOCAP_IOR_GET_SRCFRAME_FORMAT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x20, int)
+#define AMVIDEOCAP_IOR_GET_SRCFRAME_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x21, int)
+#define AMVIDEOCAP_IOR_GET_SRCFRAME_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x22, int)
+
+
+#define AMVIDEOCAP_IOR_GET_STATE _IOR(AMVIDEOCAP_IOC_MAGIC, 0x31, int)
+#define AMVIDEOCAP_IOW_SET_START_CAPTURE _IOW(AMVIDEOCAP_IOC_MAGIC, 0x32, int)
+#define AMVIDEOCAP_IOW_SET_CANCEL_CAPTURE _IOW(AMVIDEOCAP_IOC_MAGIC, 0x33, int)
+
+#define AMVIDEOCAP_IOR_SET_SRC_X _IOR(AMVIDEOCAP_IOC_MAGIC, 0x40, int)
+#define AMVIDEOCAP_IOR_SET_SRC_Y _IOR(AMVIDEOCAP_IOC_MAGIC, 0x41, int)
+#define AMVIDEOCAP_IOR_SET_SRC_WIDTH _IOR(AMVIDEOCAP_IOC_MAGIC, 0x42, int)
+#define AMVIDEOCAP_IOR_SET_SRC_HEIGHT _IOR(AMVIDEOCAP_IOC_MAGIC, 0x43, int)
+
+enum amvideocap_state {
+ AMVIDEOCAP_STATE_INIT = 0,
+ AMVIDEOCAP_STATE_ON_CAPTURE = 200,
+ AMVIDEOCAP_STATE_FINISHED_CAPTURE = 300,
+ AMVIDEOCAP_STATE_ERROR = 0xffff,
+};
+
+class CTvScreenCapture {
+public:
+ CTvScreenCapture();
+ ~CTvScreenCapture();
+
+ int InitVCap(sp<IMemory> Mem);
+ int SetVideoParameter(int width, int height, int frame);
+ int VideoStart();
+ int GetVideoData( int *length);
+ int VideoStop();
+ int DeinitVideoCap();
+ int CapMediaPlayerVideoLayerOnly(int width, int height);
+ int CapOsdAndVideoLayer(int width, int height);
+ class CapEvent : public CTvEv {
+ public:
+ CapEvent(): CTvEv(CTvEv::TV_EVENT_HDMI_IN_CAP) {};
+ ~CapEvent() {};
+
+ int mFrameNum;
+ int mFrameWide;
+ int mFrameHeight;
+ int mFrameSize;
+ };
+
+ class TvIObserver {
+ public:
+ TvIObserver() {};
+ virtual ~TvIObserver() {};
+ virtual void onTvEvent ( const CTvEv &ev ) = 0;
+ };
+
+ int setObserver(TvIObserver *ob)
+ {
+ mpObserver = ob;
+ return 0;
+ }
+
+private:
+
+ int xioctl(int fd, int request, void *arg);
+ int OpenCamera(struct camera *pCameraDev);
+ int InitMmap(struct camera *cam) ;
+ //int SetFrameRate( struct camera *cam);
+ int InitCamera(struct camera *cam) ;
+ int StartCapturing(struct camera *cam);
+ int StopCapturing(struct camera *cam);
+ int UninitCamera(struct camera *cam);
+ int CloseCamera(struct camera *cam);
+ void yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb);
+ void nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height, int *len);
+ int AmvideocapCapFrame(char *buf, int size, int *w, int *h, int *ret_size);
+private:
+ sp<IMemory> m_pMem;
+ camera m_capV4l2Cam;
+ unsigned int m_capNumBuffers;
+
+ char *m_pData;
+ TvIObserver *mpObserver;
+ CapEvent mCapEvt;
+};
+#endif
+
diff --git a/tvapi/libtv/tv/CTvSubtitle.cpp b/tvapi/libtv/tv/CTvSubtitle.cpp
index 1442dad..4ee991c 100644
--- a/tvapi/libtv/tv/CTvSubtitle.cpp
+++ b/tvapi/libtv/tv/CTvSubtitle.cpp
@@ -1,13 +1,15 @@
//
//
-// amlogic 2013
+// amlogic 2013
//
-// @ Project : tv
-// @ Date : 2013-11
-// @ Author :
+// @ Project : tv
+// @ Date : 2013-11
+// @ Author :
//
//
#include "CTvSubtitle.h"
+#include "am_misc.h"
+#include "am_dmx.h"
CTvSubtitle::CTvSubtitle()
{
mpObser = NULL;
@@ -15,10 +17,17 @@ CTvSubtitle::CTvSubtitle()
CTvSubtitle::~CTvSubtitle()
{
}
-void CTvSubtitle::setObser(IObserver *pObser)
+void CTvSubtitle::setObserver(IObserver *pObser)
{
+ isSubOpen = false;
mpObser = pObser;
}
+void CTvSubtitle::setBuffer(char *share_mem)
+{
+ pthread_mutex_lock(&lock);
+ buffer = (unsigned char *)share_mem;
+ pthread_mutex_unlock(&lock);
+}
void CTvSubtitle::stopDecoder()
{
}
@@ -79,9 +88,9 @@ void CTvSubtitle::goHome()
/**
* 在图文模å¼ä¸‹æ ¹æ®é¢œè‰²è·³è½¬åˆ°æŒ‡å®šé“¾æŽ¥
- * @param color 颜色,COLOR_RED/COLOR_GREEN/COLOR_YELLOW/COLOR_BLUE
+ * @param color 颜色,COLOR_RED/COLOR_GREEN/COLOR_YELLOW/COLOR_BLUE
*/
-void CTvSubtitle::colorLink(int color)
+void CTvSubtitle::colorLink(int color)
{
}
@@ -110,77 +119,360 @@ void CTvSubtitle::searchPrevious()
{
}
-int CTvSubtitle::sub_init()
+int CTvSubtitle::sub_init(int bmp_width, int bmp_height)
{
+ pthread_mutex_init(&lock, NULL);
+ bmp_w = bmp_width;
+ bmp_h = bmp_height;
+ sub_w = 720;
+ sub_h = 576;
+ bmp_pitch = bmp_w * 4;
return 0;
}
-int CTvSubtitle::sub_destroy()
+int CTvSubtitle::sub_destroy()
{
return 0;
}
-int CTvSubtitle::sub_lock()
+int CTvSubtitle::sub_lock()
{
+ pthread_mutex_lock(&lock);
return 0;
}
-int CTvSubtitle::sub_unlock()
+int CTvSubtitle::sub_unlock()
{
+ pthread_mutex_unlock(&lock);
return 0;
}
-int CTvSubtitle::sub_clear()
+int CTvSubtitle::sub_clear()
{
return 0;
}
-int CTvSubtitle::sub_start_dvb_sub(int dmx_id, int pid, int page_id, int anc_page_id)
+static void clear_bitmap(CTvSubtitle *pSub)
+{
+ unsigned char *ptr = pSub->buffer;
+ int y = pSub->bmp_h;
+
+ while (y--) {
+ memset(ptr, 0, pSub->bmp_pitch);
+ ptr += pSub->bmp_pitch;
+ }
+
+}
+
+static void show_sub_cb(AM_SUB2_Handle_t handle, AM_SUB2_Picture_t *pic)
+{
+ LOGD("dvb callback-----------");
+
+ CTvSubtitle *pSub = ((CTvSubtitle *) AM_SUB2_GetUserData(handle));
+ pthread_mutex_lock(&pSub->lock);
+ clear_bitmap(pSub);
+
+ if (pic) {
+ AM_SUB2_Region_t *rgn = pic->p_region;
+ pSub->sub_w = pic->original_width;
+ pSub->sub_h = pic->original_height;
+ while (rgn) {
+ int sx, sy, dx, dy, rw, rh;
+
+ // ensure we have a valid buffer
+ if (! rgn->p_buf) {
+ rgn = rgn->p_next;
+ continue;
+ }
+
+ sx = 0;
+ sy = 0;
+ dx = pic->original_x + rgn->left;
+ dy = pic->original_y + rgn->top;
+ rw = rgn->width;
+ rh = rgn->height;
+
+ if (dx < 0) {
+ sx = -dx;
+ dx = 0;
+ rw += dx;
+ }
+
+ if (dx + rw > pSub->bmp_w) {
+ rw = pSub->bmp_w - dx;
+ }
+
+ if (dy < 0) {
+ sy = -dy;
+ dy = 0;
+ rh += dy;
+ }
+
+ if (dy + rh > pSub->bmp_h) {
+ rh = pSub->bmp_h - dy;
+ }
+
+ if ((rw > 0) && (rh > 0)) {
+ unsigned char *sbegin = (unsigned char *)rgn->p_buf + sy * rgn->width + sx;
+ unsigned char *dbegin = pSub->buffer + dy * pSub->bmp_pitch + dx * 4;
+ unsigned char *src, *dst;
+ int size;
+
+ while (rh) {
+ src = sbegin;
+ dst = dbegin;
+ size = rw;
+ while (size--) {
+ int c = src[0];
+
+ if (c < (int)rgn->entry) {
+ if (rgn->clut[c].a) {
+ *dst++ = rgn->clut[c].r;
+ *dst++ = rgn->clut[c].g;
+ *dst++ = rgn->clut[c].b;
+ } else {
+ dst += 3;
+ }
+ *dst++ = rgn->clut[c].a;
+ } else {
+ dst += 4;
+ }
+ src ++;
+ }
+ sbegin += rgn->width;
+ dbegin += pSub->bmp_pitch;
+ rh--;
+ }
+ }
+
+ rgn = rgn->p_next;
+ }
+ pSub->mpObser->updateSubtitle(pic->original_width, pic->original_height);
+ }
+ pthread_mutex_unlock(&pSub->lock);
+
+}
+
+static uint64_t get_pts_cb(void *handle, uint64_t pts)
+{
+ char buf[32];
+ AM_ErrorCode_t ret;
+ uint32_t v;
+ uint64_t r;
+
+ ret = AM_FileRead("/sys/class/tsync/pts_pcrscr", buf, sizeof(buf));
+ if (!ret) {
+ v = strtoul(buf, 0, 16);
+ if (pts & (1LL << 32)) {
+ r = ((uint64_t)v) | (1LL << 32);
+ } else {
+ r = (uint64_t)v;
+ }
+ } else {
+ r = 0LL;
+ }
+
+ return r;
+}
+
+static void pes_data_cb(int dev_no, int fhandle, const uint8_t *data, int len, void *user_data)
+{
+ CTvSubtitle *pSub = ((CTvSubtitle *) user_data);
+ AM_PES_Decode(pSub->pes_handle, (uint8_t *)data, len);
+}
+
+static int close_dmx(CTvSubtitle *pSub)
{
+ AM_DMX_FreeFilter(pSub->dmx_id, pSub->filter_handle);
+ AM_DMX_Close(pSub->dmx_id);
+ pSub->dmx_id = -1;
+ pSub->filter_handle = -1;
+
return 0;
}
-int CTvSubtitle::sub_start_dtv_tt(int dmx_id, int region_id, int pid, int page, int sub_page, bool is_sub)
+static int open_dmx(CTvSubtitle *pSub, int dmx_id, int pid)
{
+ close_dmx(pSub);
+ AM_DMX_OpenPara_t op;
+ struct dmx_pes_filter_params pesp;
+ AM_ErrorCode_t ret;
+
+ pSub->dmx_id = -1;
+ pSub->filter_handle = -1;
+ memset(&op, 0, sizeof(op));
+
+ ret = AM_DMX_Open(dmx_id, &op);
+ if (ret != AM_SUCCESS) {
+ LOGD("error AM_DMX_Open != AM_SUCCESS");
+ goto error;
+ }
+ pSub->dmx_id = dmx_id;
+
+ ret = AM_DMX_AllocateFilter(dmx_id, &pSub->filter_handle);
+ if (ret != AM_SUCCESS) {
+ LOGD("error AM_DMX_AllocateFilter != AM_SUCCESS");
+ goto error;
+ }
+
+ ret = AM_DMX_SetBufferSize(dmx_id, pSub->filter_handle, 0x80000);
+ if (ret != AM_SUCCESS) {
+ LOGD("error AM_DMX_SetBufferSize != AM_SUCCESS");
+ goto error;
+ }
+
+ memset(&pesp, 0, sizeof(pesp));
+ pesp.pid = pid;
+ pesp.output = DMX_OUT_TAP;
+ pesp.pes_type = DMX_PES_TELETEXT0;
+
+ ret = AM_DMX_SetPesFilter(dmx_id, pSub->filter_handle, &pesp);
+ if (ret != AM_SUCCESS) {
+ LOGD("error AM_DMX_SetPesFilter != AM_SUCCESS, err = %d", strerror(errno));
+ goto error;
+ }
+
+ ret = AM_DMX_SetCallback(dmx_id, pSub->filter_handle, pes_data_cb, pSub);
+ if (ret != AM_SUCCESS) {
+ LOGD("error AM_DMX_SetCallback != AM_SUCCESS");
+ goto error;
+ }
+
+ ret = AM_DMX_StartFilter(dmx_id, pSub->filter_handle);
+ if (ret != AM_SUCCESS) {
+ LOGD("error AM_DMX_StartFilter != AM_SUCCESS,dmx_id=%d,filter_handle=%d, ret = %d", dmx_id, pSub->filter_handle, ret);
+ goto error;
+ }
+
return 0;
+error:
+ if (pSub->filter_handle != -1) {
+ AM_DMX_FreeFilter(dmx_id, pSub->filter_handle);
+ }
+ if (pSub->dmx_id != -1) {
+ AM_DMX_Close(dmx_id);
+ }
+
+ return -1;
}
-int CTvSubtitle::sub_stop_dvb_sub()
+static void pes_sub_cb(AM_PES_Handle_t handle, uint8_t *buf, int size)
{
+ CTvSubtitle *pSub = ((CTvSubtitle *) AM_SUB2_GetUserData(handle));
+ AM_SUB2_Decode(pSub->sub_handle, buf, size);
+}
+
+int CTvSubtitle::sub_switch_status()
+{
+ return isSubOpen ? 1 : 0;
+}
+int CTvSubtitle::sub_start_dvb_sub(int dmx_id, int pid, int page_id, int anc_page_id)
+{
+ LOGD("start dvb subtitle=----------------");
+
+ AM_PES_Para_t pesp;
+ AM_SUB2_Para_t subp;
+ int ret;
+
+ memset(&pesp, 0, sizeof(pesp));
+ pesp.packet = pes_sub_cb;
+ pesp.user_data = this;
+ ret = AM_PES_Create(&pes_handle, &pesp);
+ if (ret != AM_SUCCESS) {
+ LOGD("error AM_PES_Create != AM_SUCCESS");
+ goto error;
+ }
+
+ memset(&subp, 0, sizeof(subp));
+ subp.show = show_sub_cb;
+ subp.get_pts = get_pts_cb;
+ subp.composition_id = page_id;
+ subp.ancillary_id = anc_page_id;
+ subp.user_data = this;
+ ret = AM_SUB2_Create(&sub_handle, &subp);
+ if (ret != AM_SUCCESS) {
+ LOGD("error AM_SUB2_Create != AM_SUCCESS");
+ goto error;
+ }
+
+ ret = AM_SUB2_Start(sub_handle);
+ if (ret != AM_SUCCESS) {
+ LOGD("error AM_SUB2_Start != AM_SUCCESS");
+ goto error;
+ }
+
+ ret = open_dmx(this, dmx_id, pid);
+ if (ret < 0) {
+ LOGD("error open_dmx != AM_SUCCESS");
+ goto error;
+ }
+ isSubOpen = true;
+ return 0;
+error:
+ if (sub_handle) {
+ AM_SUB2_Destroy(sub_handle);
+ sub_handle = NULL;
+ }
+ if (pes_handle) {
+ AM_PES_Destroy(pes_handle);
+ pes_handle = NULL;
+ }
+ return -1;
+}
+
+int CTvSubtitle::sub_start_dtv_tt(int dmx_id, int region_id, int pid, int page, int sub_page, bool is_sub)
+{
+ return 0;
+}
+
+int CTvSubtitle::sub_stop_dvb_sub()
+{
+ pthread_mutex_lock(&lock);
+ close_dmx(this);
+ AM_SUB2_Destroy(sub_handle);
+ AM_PES_Destroy(pes_handle);
+
+ clear_bitmap(this);
+ mpObser->updateSubtitle(0, 0);
+
+ sub_handle = NULL;
+ pes_handle = NULL;
+ isSubOpen = false;
+ pthread_mutex_unlock(&lock);
return 0;
}
-int CTvSubtitle::sub_stop_dtv_tt()
+int CTvSubtitle::sub_stop_dtv_tt()
{
return 0;
}
-int CTvSubtitle::sub_tt_goto(int page)
+int CTvSubtitle::sub_tt_goto(int page)
{
return 0;
}
-int CTvSubtitle::sub_tt_color_link(int color)
+int CTvSubtitle::sub_tt_color_link(int color)
{
return 0;
}
-int CTvSubtitle::sub_tt_home_link()
+int CTvSubtitle::sub_tt_home_link()
{
return 0;
}
-int CTvSubtitle::sub_tt_next(int dir)
+int CTvSubtitle::sub_tt_next(int dir)
{
return 0;
}
-int CTvSubtitle::sub_tt_set_search_pattern(char *pattern, bool casefold)
+int CTvSubtitle::sub_tt_set_search_pattern(char *pattern, bool casefold)
{
return 0;
}
-int CTvSubtitle::sub_tt_search(int dir)
+int CTvSubtitle::sub_tt_search(int dir)
{
return 0;
}
@@ -230,10 +522,10 @@ program, no signal, blocked...*/
//channel_num == 0 ,if frontend is dtv
//else != 0
-int CTvSubtitle::sub_start_atsc_cc(enum cc_param_country country, enum cc_param_source_type src_type, int channel_num, enum cc_param_caption_type caption_type)
+int CTvSubtitle::sub_start_atsc_cc(enum cc_param_country country, enum cc_param_source_type src_type, int channel_num, enum cc_param_caption_type caption_type)
{
LOGD("----sub_start_atsc_cc-1--- country=%d,src=%d,ctype=%d", country, src_type, caption_type);
- switch(country) {
+ switch (country) {
case CC_PARAM_COUNTRY_USA:
AM_CC_Cmd(CMD_SET_COUNTRY_USA);
break;
@@ -245,7 +537,7 @@ int CTvSubtitle::sub_start_atsc_cc(enum cc_param_country country, enum cc_param_
break;
}
- switch(src_type) {
+ switch (src_type) {
case CC_PARAM_SOURCE_VBIDATA:
AM_CC_Cmd(CMD_CC_SET_VBIDATA);
break;
@@ -258,13 +550,13 @@ int CTvSubtitle::sub_start_atsc_cc(enum cc_param_country country, enum cc_param_
}
//just for test
- if(channel_num == 0) {
+ if (channel_num == 0) {
} else {
//AM_CC_Cmd(CMD_CC_SET_CHAN_NUM);
}
AM_CLOSECAPTION_cmd_t cc_t_cmd;
- switch(caption_type) {
+ switch (caption_type) {
case CC_PARAM_ANALOG_CAPTION_TYPE_CC1:
cc_t_cmd = CMD_CC_1;
break;
@@ -303,13 +595,13 @@ int CTvSubtitle::sub_start_atsc_cc(enum cc_param_country country, enum cc_param_
return 0;
}
-int CTvSubtitle::sub_stop_atsc_cc()
+int CTvSubtitle::sub_stop_atsc_cc()
{
LOGD("----sub_stop_atsc_cc----");
AM_CC_Cmd(CMD_CC_STOP);
return 0;
}
-int CTvSubtitle::ResetVchipChgStat()
+int CTvSubtitle::ResetVchipChgStat()
{
avchip_chg = 0;
AM_CC_Cmd(CMD_VCHIP_RST_CHGSTAT);
@@ -325,14 +617,16 @@ int CTvSubtitle::IsVchipChange()
void CTvSubtitle::close_caption_callback(char *str, int cnt, int data_buf[], int cmd_buf[], void *user_data)
{
+ /*
CTvSubtitle *pSub = (CTvSubtitle *)user_data;
- if(pSub == NULL) {
- LOGD("sub cc callback is null user data for this");
- return;
+ if (pSub == NULL)
+ {
+ LOGD("sub cc callback is null user data for this");
+ return;
}
- if(pSub->mpObser == NULL) return;
+ if (pSub->mpObser == NULL) return;
pSub->mCurCCEv.mDataBufSize = cnt;
pSub->mCurCCEv.mpDataBuffer = data_buf;
@@ -340,6 +634,7 @@ void CTvSubtitle::close_caption_callback(char *str, int cnt, int data_buf[], int
pSub->mCurCCEv.mpCmdBuffer = cmd_buf;
pSub->mpObser->onEvent(pSub->mCurCCEv);
+ */
}
void CTvSubtitle::atv_vchip_callback(int Is_chg, void *user_data)
{
diff --git a/tvapi/libtv/tv/CTvSubtitle.h b/tvapi/libtv/tv/CTvSubtitle.h
index 8bb8a82..8acd48a 100644
--- a/tvapi/libtv/tv/CTvSubtitle.h
+++ b/tvapi/libtv/tv/CTvSubtitle.h
@@ -1,233 +1,251 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvSubtitle.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-#if !defined(_CTVSUBTITLE_H)
-#define _CTVSUBTITLE_H
-#include <stdlib.h>
-#include "CTvLog.h"
-using namespace android;
-#include "am_cc.h"
-#include "CTvEv.h"
-#define LOG_TAG "CTvSubtitle"
-
-
-typedef enum cc_param_country {
- CC_PARAM_COUNTRY_USA = 0,
- CC_PARAM_COUNTRY_KOREA,
-};
-
-typedef enum cc_param_source_type {
- CC_PARAM_SOURCE_VBIDATA = 0,
- CC_PARAM_SOURCE_USERDATA,
-};
-
-typedef enum cc_param_caption_type {
- CC_PARAM_ANALOG_CAPTION_TYPE_CC1 = 0,
- CC_PARAM_ANALOG_CAPTION_TYPE_CC2,
- CC_PARAM_ANALOG_CAPTION_TYPE_CC3,
- CC_PARAM_ANALOG_CAPTION_TYPE_CC4,
- CC_PARAM_ANALOG_CAPTION_TYPE_TEXT1,
- CC_PARAM_ANALOG_CAPTION_TYPE_TEXT2,
- CC_PARAM_ANALOG_CAPTION_TYPE_TEXT3,
- CC_PARAM_ANALOG_CAPTION_TYPE_TEXT4,
- //
- CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE1,
- CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE2,
- CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE3,
- CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE4,
- CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE5,
- CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE6,
-};
-class CTvSubtitle {
-public:
- CTvSubtitle();
- ~CTvSubtitle();
-
- class CloseCaptionEvent: public CTvEv {
- public:
- //static const int CC_CMD_LEN = 128;
- //static const int CC_DATA_LEN = 512;
- CloseCaptionEvent(): CTvEv(CTvEv::TV_EVENT_CC)
- {
- }
- ~CloseCaptionEvent()
- {
- }
- public:
- int mCmdBufSize;
- int *mpCmdBuffer;
- int mDataBufSize;
- int *mpDataBuffer;
- };
-
- class IObserver {
- public:
- IObserver() {};
- virtual ~IObserver() {};
- virtual void onEvent(const CloseCaptionEvent &ev) = 0;
- };
-
- void setObser(IObserver *pObser);
- void stopDecoder();
- /**
- * 开始字幕信æ¯è§£æžshowboz sync
- */
- void startSub();
- /**
- * åœæ­¢å›¾æ–‡/字幕信æ¯è§£æž
- */
- void stop();
-
- /**
- * åœæ­¢å›¾æ–‡/字幕信æ¯è§£æžå¹¶æ¸…除缓存数æ®
- */
- void clear();
- /**
- * 在图文模å¼ä¸‹è¿›å…¥ä¸‹ä¸€é¡µ
- */
- void nextPage();
- /**
- * 在图文模å¼ä¸‹è¿›å…¥ä¸Šä¸€é¡µ
- */
- void previousPage();
- /**
- * 在图文模å¼ä¸‹è·³è½¬åˆ°æŒ‡å®šé¡µ
- * @param page è¦è·³è½¬åˆ°çš„页å·
- */
- void gotoPage(int page);
-
- /**
- * 在图文模å¼ä¸‹è·³è½¬åˆ°home页
- */
- void goHome();
- /**
- * 在图文模å¼ä¸‹æ ¹æ®é¢œè‰²è·³è½¬åˆ°æŒ‡å®šé“¾æŽ¥
- * @param color 颜色,COLOR_RED/COLOR_GREEN/COLOR_YELLOW/COLOR_BLUE
- */
- void colorLink(int color);
-
- /**
- * 在图文模å¼ä¸‹è®¾å®šæœç´¢å­—符串
- * @param pattern æœç´¢åŒ¹é…字符串
- * @param casefold 是å¦åŒºåˆ†å¤§å°å†™
- */
- void setSearchPattern(char *pattern, bool casefold);
- /**
- * æœç´¢ä¸‹ä¸€é¡µ
- */
- void searchNext();
- /**
- * æœç´¢ä¸Šä¸€é¡µ
- */
- void searchPrevious();
-
- int sub_init();
- //
- int sub_destroy();
- //
- int sub_lock();
- //
- int sub_unlock();
- //
- int sub_clear();
- //
- int sub_start_dvb_sub(int dmx_id, int pid, int page_id, int anc_page_id);
- //
- int sub_start_dtv_tt(int dmx_id, int region_id, int pid, int page, int sub_page, bool is_sub);
- //
- int sub_stop_dvb_sub();
- //
- int sub_stop_dtv_tt();
- //
- int sub_tt_goto(int page);
- //
- int sub_tt_color_link(int color);
- //
- int sub_tt_home_link();
- //
- int sub_tt_next(int dir);
- //
- int sub_tt_set_search_pattern(char *pattern, bool casefold);
- //
- int sub_tt_search(int dir);
- //
- int sub_start_atsc_cc(enum cc_param_country country, enum cc_param_source_type src_type, int channel_num, enum cc_param_caption_type caption_type);
- //
- int sub_stop_atsc_cc();
- static void close_caption_callback(char *str, int cnt, int data_buf[], int cmd_buf[], void *user_data);
- static void atv_vchip_callback(int Is_chg, void *user_data);
- int IsVchipChange();
- int ResetVchipChgStat();
-private:
-
- /**
- * DVB subtitle å‚æ•°
- */
- struct DVBSubParams {
- int mDmx_id;
- int mPid;
- int mComposition_page_id;
- int mAncillary_page_id;
-
- /**
- * 创建DVB subtitleå‚æ•°
- * @param dmx_id 接收使用demux设备的ID
- * @param pid subtitleæµçš„PID
- * @param page_id 字幕的page_id
- * @param anc_page_id 字幕的ancillary_page_id
- */
- DVBSubParams()
- {
- }
- DVBSubParams(int dmx_id, int pid, int page_id, int anc_page_id)
- {
- mDmx_id = dmx_id;
- mPid = pid;
- mComposition_page_id = page_id;
- mAncillary_page_id = anc_page_id;
- }
- };
-
- /**
- * 数字电视teletext图文å‚æ•°
- */
- struct DTVTTParams {
- int mDmx_id;
- int mPid;
- int mPage_no;
- int mSub_page_no;
- int mRegion_id;
-
- DTVTTParams()
- {
- }
- /**
- * 创建数字电视teletext图文å‚æ•°
- * @param dmx_id 接收使用demux设备的ID
- * @param pid 图文信æ¯æµçš„PID
- * @param page_no è¦æ˜¾ç¤ºé¡µå·
- * @param sub_page_no è¦æ˜¾ç¤ºçš„å­é¡µå·
- */
- DTVTTParams(int dmx_id, int pid, int page_no, int sub_page_no, int region_id)
- {
- mDmx_id = dmx_id;
- mPid = pid;
- mPage_no = page_no;
- mSub_page_no = sub_page_no;
- mRegion_id = region_id;
- }
- };
-
- int mSubType;
- CloseCaptionEvent mCurCCEv;
- IObserver *mpObser;
- int avchip_chg;
-};
-#endif //_CTVSUBTITLE_H
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvSubtitle.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+#if !defined(_CTVSUBTITLE_H)
+#define _CTVSUBTITLE_H
+#include <stdlib.h>
+#include "CTvLog.h"
+using namespace android;
+#include "am_cc.h"
+#include "am_sub2.h"
+#include "am_pes.h"
+#include "CTvEv.h"
+#define LOG_TAG "CTvSubtitle"
+
+
+typedef enum cc_param_country {
+ CC_PARAM_COUNTRY_USA = 0,
+ CC_PARAM_COUNTRY_KOREA,
+};
+
+typedef enum cc_param_source_type {
+ CC_PARAM_SOURCE_VBIDATA = 0,
+ CC_PARAM_SOURCE_USERDATA,
+};
+
+typedef enum cc_param_caption_type {
+ CC_PARAM_ANALOG_CAPTION_TYPE_CC1 = 0,
+ CC_PARAM_ANALOG_CAPTION_TYPE_CC2,
+ CC_PARAM_ANALOG_CAPTION_TYPE_CC3,
+ CC_PARAM_ANALOG_CAPTION_TYPE_CC4,
+ CC_PARAM_ANALOG_CAPTION_TYPE_TEXT1,
+ CC_PARAM_ANALOG_CAPTION_TYPE_TEXT2,
+ CC_PARAM_ANALOG_CAPTION_TYPE_TEXT3,
+ CC_PARAM_ANALOG_CAPTION_TYPE_TEXT4,
+ //
+ CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE1,
+ CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE2,
+ CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE3,
+ CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE4,
+ CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE5,
+ CC_PARAM_DIGITAL_CAPTION_TYPE_SERVICE6,
+};
+class CTvSubtitle {
+public:
+ class IObserver {
+ public:
+ IObserver() {};
+ virtual ~IObserver() {};
+ //virtual void onEvent(const CloseCaptionEvent &ev);
+ virtual void updateSubtitle(int, int) {};
+ };
+
+ AM_SUB2_Handle_t sub_handle;
+ AM_PES_Handle_t pes_handle;
+ int dmx_id;
+ int filter_handle;
+ int bmp_w;
+ int bmp_h;
+ int bmp_pitch;
+ unsigned char *buffer;
+ int sub_w;
+ int sub_h;
+ pthread_mutex_t lock;
+
+ IObserver *mpObser;
+ CTvSubtitle();
+ ~CTvSubtitle();
+
+ class CloseCaptionEvent: public CTvEv {
+ public:
+ //static const int CC_CMD_LEN = 128;
+ //static const int CC_DATA_LEN = 512;
+ CloseCaptionEvent(): CTvEv(CTvEv::TV_EVENT_CC)
+ {
+ }
+ ~CloseCaptionEvent()
+ {
+ }
+ public:
+ int mCmdBufSize;
+ int *mpCmdBuffer;
+ int mDataBufSize;
+ int *mpDataBuffer;
+ };
+
+ void setObserver(IObserver *pObser);
+ void setBuffer(char *share_mem);
+ void stopDecoder();
+ /**
+ * 开始字幕信æ¯è§£æžshowboz sync
+ */
+ void startSub();
+ /**
+ * åœæ­¢å›¾æ–‡/字幕信æ¯è§£æž
+ */
+ void stop();
+
+ /**
+ * åœæ­¢å›¾æ–‡/字幕信æ¯è§£æžå¹¶æ¸…除缓存数æ®
+ */
+ void clear();
+ /**
+ * 在图文模å¼ä¸‹è¿›å…¥ä¸‹ä¸€é¡µ
+ */
+ void nextPage();
+ /**
+ * 在图文模å¼ä¸‹è¿›å…¥ä¸Šä¸€é¡µ
+ */
+ void previousPage();
+ /**
+ * 在图文模å¼ä¸‹è·³è½¬åˆ°æŒ‡å®šé¡µ
+ * @param page è¦è·³è½¬åˆ°çš„页å·
+ */
+ void gotoPage(int page);
+
+ /**
+ * 在图文模å¼ä¸‹è·³è½¬åˆ°home页
+ */
+ void goHome();
+ /**
+ * 在图文模å¼ä¸‹æ ¹æ®é¢œè‰²è·³è½¬åˆ°æŒ‡å®šé“¾æŽ¥
+ * @param color 颜色,COLOR_RED/COLOR_GREEN/COLOR_YELLOW/COLOR_BLUE
+ */
+ void colorLink(int color);
+
+ /**
+ * 在图文模å¼ä¸‹è®¾å®šæœç´¢å­—符串
+ * @param pattern æœç´¢åŒ¹é…字符串
+ * @param casefold 是å¦åŒºåˆ†å¤§å°å†™
+ */
+ void setSearchPattern(char *pattern, bool casefold);
+ /**
+ * æœç´¢ä¸‹ä¸€é¡µ
+ */
+ void searchNext();
+ /**
+ * æœç´¢ä¸Šä¸€é¡µ
+ */
+ void searchPrevious();
+
+ int sub_init(int, int);
+ //
+ int sub_destroy();
+ //
+ int sub_lock();
+ //
+ int sub_unlock();
+ //
+ int sub_clear();
+ //
+ int sub_switch_status();
+ int sub_start_dvb_sub(int dmx_id, int pid, int page_id, int anc_page_id);
+ //
+ int sub_start_dtv_tt(int dmx_id, int region_id, int pid, int page, int sub_page, bool is_sub);
+ //
+ int sub_stop_dvb_sub();
+ //
+ int sub_stop_dtv_tt();
+ //
+ int sub_tt_goto(int page);
+ //
+ int sub_tt_color_link(int color);
+ //
+ int sub_tt_home_link();
+ //
+ int sub_tt_next(int dir);
+ //
+ int sub_tt_set_search_pattern(char *pattern, bool casefold);
+ //
+ int sub_tt_search(int dir);
+ //
+ int sub_start_atsc_cc(enum cc_param_country country, enum cc_param_source_type src_type, int channel_num, enum cc_param_caption_type caption_type);
+ //
+ int sub_stop_atsc_cc();
+ static void close_caption_callback(char *str, int cnt, int data_buf[], int cmd_buf[], void *user_data);
+ static void atv_vchip_callback(int Is_chg, void *user_data);
+ int IsVchipChange();
+ int ResetVchipChgStat();
+private:
+
+ /**
+ * DVB subtitle å‚æ•°
+ */
+ struct DVBSubParams {
+ int mDmx_id;
+ int mPid;
+ int mComposition_page_id;
+ int mAncillary_page_id;
+
+ /**
+ * 创建DVB subtitleå‚æ•°
+ * @param dmx_id 接收使用demux设备的ID
+ * @param pid subtitleæµçš„PID
+ * @param page_id 字幕的page_id
+ * @param anc_page_id 字幕的ancillary_page_id
+ */
+ DVBSubParams()
+ {
+ }
+ DVBSubParams(int dmx_id, int pid, int page_id, int anc_page_id)
+ {
+ mDmx_id = dmx_id;
+ mPid = pid;
+ mComposition_page_id = page_id;
+ mAncillary_page_id = anc_page_id;
+ }
+ };
+
+ /**
+ * 数字电视teletext图文å‚æ•°
+ */
+ struct DTVTTParams {
+ int mDmx_id;
+ int mPid;
+ int mPage_no;
+ int mSub_page_no;
+ int mRegion_id;
+
+ DTVTTParams()
+ {
+ }
+ /**
+ * 创建数字电视teletext图文å‚æ•°
+ * @param dmx_id 接收使用demux设备的ID
+ * @param pid 图文信æ¯æµçš„PID
+ * @param page_no è¦æ˜¾ç¤ºé¡µå·
+ * @param sub_page_no è¦æ˜¾ç¤ºçš„å­é¡µå·
+ */
+ DTVTTParams(int dmx_id, int pid, int page_no, int sub_page_no, int region_id)
+ {
+ mDmx_id = dmx_id;
+ mPid = pid;
+ mPage_no = page_no;
+ mSub_page_no = sub_page_no;
+ mRegion_id = region_id;
+ }
+ };
+
+ int mSubType;
+ CloseCaptionEvent mCurCCEv;
+ int avchip_chg;
+ bool isSubOpen;
+};
+#endif //_CTVSUBTITLE_H
diff --git a/tvapi/libtv/tv/CTvVchipCheck.cpp b/tvapi/libtv/tv/CTvVchipCheck.cpp
index 34b7b74..9573e76 100644
--- a/tvapi/libtv/tv/CTvVchipCheck.cpp
+++ b/tvapi/libtv/tv/CTvVchipCheck.cpp
@@ -13,18 +13,18 @@ bool CTvVchipCheck::CheckProgramBlock(int id)
int ret = 0;
ret = CTvProgram::selectByID(id, prog);
- if(ret != 0) return false;
+ if (ret != 0) return false;
int type = prog.getProgType();
- if(type == CTvProgram::TYPE_ATV) {
+ if (type == CTvProgram::TYPE_ATV) {
ret = ev.getATVProgEvent(prog.getSrc(), prog.getID(), ev);
} else {
//long epgtime = mDmTime.getTime();
//ret = ev.getProgPresentEvent(prog.getSrc(),prog.getSourceId(), epgtime, ev);
}
if (ret == 0) {
- if(prog.isATSCMode()) {
+ if (prog.isATSCMode()) {
// ATSC V-Chip
Vector<CTvDimension::VChipRating *> definedRatings = ev.getVChipRatings();
for (int i = 0; i < definedRatings.size(); i++) {
diff --git a/tvapi/libtv/tv/CUpgradeFBC.cpp b/tvapi/libtv/tv/CUpgradeFBC.cpp
index 3fa295b..6710217 100644
--- a/tvapi/libtv/tv/CUpgradeFBC.cpp
+++ b/tvapi/libtv/tv/CUpgradeFBC.cpp
@@ -485,8 +485,8 @@ bool CUpgradeFBC::threadLoop()
tmp_flag = 0;
memset(mDataBuf, 0, CC_UPGRADE_DATA_BUF_SIZE);
rw_size = mCfbcIns->uartReadStream(mDataBuf, CC_UPGRADE_DATA_BUF_SIZE, 2000);
- for(i = 0; i < rw_size - 3; i++) {
- if((0x5A == mDataBuf[i]) && (0x5A == mDataBuf[i + 1]) && (0x5A == mDataBuf[i + 2])) {
+ for (i = 0; i < rw_size - 3; i++) {
+ if ((0x5A == mDataBuf[i]) && (0x5A == mDataBuf[i + 1]) && (0x5A == mDataBuf[i + 2])) {
LOGD("%s, fbc write data at 0x%x ok!\n", __FUNCTION__, old_off);
tmp_flag = 1;
break;
diff --git a/tvapi/libtv/tv/CUpgradeFBC.h b/tvapi/libtv/tv/CUpgradeFBC.h
index e7864a8..67eb115 100644
--- a/tvapi/libtv/tv/CUpgradeFBC.h
+++ b/tvapi/libtv/tv/CUpgradeFBC.h
@@ -1,141 +1,141 @@
-#ifndef __TV_UPGRADE_FBC_H__
-#define __TV_UPGRADE_FBC_H__
-
-#include "CFbcCommunication.h"
-#include "../tvutils/CThread.h"
-
-#define CC_FBC_V01_00_VAL (0x10000000)
-#define CC_FBC_V02_00_VAL (0x20000000)
-#define CC_FBC_V02_01_VAL (0x20000001)
-#define CC_FBC_V03_00_VAL (0x30000000)
-#define CC_FBC_V03_01_VAL (0x30000001)
-
-#define CC_FBC_V01_FILE_SIZE (655360)
-#define CC_FBC_V02_FILE_SIZE (786432)
-#define CC_FBC_V02_CUR_PQ_BIN_FILE_SIZE (0xB000)
-#define CC_FBC_V03_FILE_SIZE (2097152)
-#define CC_FBC_V03_CUR_PQ_BIN_FILE_SIZE (0xB000)
-
-#define CC_UPGRADE_MAX_BLOCK_LEN (0x10000)
-#define CC_UPGRADE_DATA_BUF_SIZE (CC_UPGRADE_MAX_BLOCK_LEN + 4)
-
-#define CC_UPGRADE_MODE_BOOT_MAIN (0)
-#define CC_UPGRADE_MODE_BOOT (1)
-#define CC_UPGRADE_MODE_MAIN (2)
-#define CC_UPGRADE_MODE_COMPACT_BOOT (3)
-#define CC_UPGRADE_MODE_ALL (4)
-
-#define CC_UPGRADE_MODE_MAIN_PQ_WB (5)
-#define CC_UPGRADE_MODE_ALL_PQ_WB (6)
-#define CC_UPGRADE_MODE_MAIN_WB (7)
-#define CC_UPGRADE_MODE_ALL_WB (8)
-#define CC_UPGRADE_MODE_MAIN_PQ (9)
-#define CC_UPGRADE_MODE_ALL_PQ (10)
-
-#define CC_UPGRADE_MODE_PQ_WB_ONLY (11)
-#define CC_UPGRADE_MODE_WB_ONLY (12)
-#define CC_UPGRADE_MODE_PQ_ONLY (13)
-
-#define CC_UPGRADE_MODE_CUR_PQ_BIN (14)
-#define CC_UPGRADE_MODE_ALL_PQ_BIN (15)
-
-#define CC_UPGRADE_MODE_BURN (16)
-
-#define CC_UPGRADE_MODE_DUMMY (17)
-
-#define CC_UPGRADE_V01_BOOT_OFFSET (0x0)
-#define CC_UPGRADE_V01_BOOT_LEN (0x20000)
-#define CC_UPGRADE_V01_MAIN_OFFSET (0x20000)
-#define CC_UPGRADE_V01_MAIN_LEN (CC_FBC_V01_FILE_SIZE - CC_UPGRADE_V01_MAIN_OFFSET)
-#define CC_UPGRADE_V01_ALL_LENGTH (CC_FBC_V01_FILE_SIZE)
-
-#define CC_UPGRADE_V02_COMPACT_BOOT_OFFSET (0x0)
-#define CC_UPGRADE_V02_COMPACT_BOOT_LEN (0x10000)
-#define CC_UPGRADE_V02_BOOT_OFFSET (0x10000)
-#define CC_UPGRADE_V02_BOOT_LEN (0x30000)
-#define CC_UPGRADE_V02_MAIN_OFFSET (0x40000)
-#define CC_UPGRADE_V02_MAIN_LEN (0x80000)
-#define CC_UPGRADE_V02_BOOT_BAK_OFFSET (0xC0000)
-#define CC_UPGRADE_V02_BOOT_BAK_LEN (0x30000)
-#define CC_UPGRADE_V02_MAIN_BAK_OFFSET (0xF0000)
-#define CC_UPGRADE_V02_MAIN_BAK_LEN (0x80000)
-#define CC_UPGRADE_V02_ALL_LENGTH (0x170000)
-
-#define CC_UPGRADE_V02_CUR_PQ_OFFSET (0xAF000)
-
-#define CC_UPGRADE_V03_COMPACT_BOOT_OFFSET (CC_UPGRADE_V02_COMPACT_BOOT_OFFSET)
-#define CC_UPGRADE_V03_COMPACT_BOOT_LEN (CC_UPGRADE_V02_COMPACT_BOOT_LEN)
-#define CC_UPGRADE_V03_BOOT_OFFSET (CC_UPGRADE_V02_BOOT_OFFSET)
-#define CC_UPGRADE_V03_BOOT_LEN (CC_UPGRADE_V02_BOOT_LEN)
-#define CC_UPGRADE_V03_MAIN_OFFSET (CC_UPGRADE_V02_MAIN_OFFSET)
-#define CC_UPGRADE_V03_MAIN_LEN (CC_UPGRADE_V02_MAIN_LEN)
-#define CC_UPGRADE_V03_BOOT_BAK_OFFSET (CC_UPGRADE_V02_BOOT_BAK_OFFSET)
-#define CC_UPGRADE_V03_BOOT_BAK_LEN (CC_UPGRADE_V02_BOOT_BAK_LEN)
-#define CC_UPGRADE_V03_MAIN_BAK_OFFSET (CC_UPGRADE_V02_MAIN_BAK_OFFSET)
-#define CC_UPGRADE_V03_MAIN_BAK_LEN (CC_UPGRADE_V02_MAIN_BAK_LEN)
-#define CC_UPGRADE_V03_PROTECT_DATA_START (0x1FF000)
-#define CC_UPGRADE_V03_PROTECT_DATA_LEN (0x1000)
-#define CC_UPGRADE_V03_ALL_LENGTH (CC_UPGRADE_V03_PROTECT_DATA_START)
-
-#define CC_UPGRADE_V03_CUR_PQ_OFFSET (CC_UPGRADE_V02_CUR_PQ_OFFSET)
-
-
-class CUpgradeFBC: public CThread {
-public:
- CUpgradeFBC();
- ~CUpgradeFBC();
-
- int start();
- int stop();
- int GetUpgradeFBCProgress();
- int SetUpgradeFileName(char *file_name);
- int SetUpgradeFileSize(int file_size);
- int SetUpgradeBlockSize(int block_size);
- int SetUpgradeMode(int mode);
-
- class IUpgradeFBCObserver {
- public:
- IUpgradeFBCObserver() {};
- virtual ~IUpgradeFBCObserver() {};
- virtual void onUpgradeStatus(int state, int param) {};
- };
- void setObserver(IUpgradeFBCObserver *pOb)
- {
- mpObserver = pOb;
- };
-
-private:
- bool threadLoop();
-
- int AddCRCToDataBuf(unsigned char data_buf[], int data_len);
-
- int mState;
- int mUpgradeMode;
- int mOPTotalSize;
- int mBinFileSize;
- int mUpgradeBlockSize;
- unsigned char *mBinFileBuf;
- char mFileName[256];
- unsigned char mDataBuf[CC_UPGRADE_DATA_BUF_SIZE];
- IUpgradeFBCObserver *mpObserver;
- CFbcCommunication *mCfbcIns;
-
- enum UpgradeState {
- STATE_STOPED = 0,
- STATE_RUNNING,
- STATE_FINISHED,
- STATE_ABORT,
- };
-
- enum FBCUpgradeErrorCode {
- ERR_SERIAL_CONNECT = -1,
- ERR_OPEN_BIN_FILE = -2,
- ERR_BIN_FILE_SIZE = -3,
- ERR_READ_BIN_FILE = -4,
- ERR_NOT_SUPPORT_UPGRADE_MDOE = -5,
- ERR_NOT_CORRECT_UPGRADE_BLKSIZE = -6,
- ERR_DATA_CRC_ERROR = -7,
- };
-};
-
-#endif //__TV_UPGRADE_FBC_H__
+#ifndef __TV_UPGRADE_FBC_H__
+#define __TV_UPGRADE_FBC_H__
+
+#include "CFbcCommunication.h"
+#include "../tvutils/CThread.h"
+
+#define CC_FBC_V01_00_VAL (0x10000000)
+#define CC_FBC_V02_00_VAL (0x20000000)
+#define CC_FBC_V02_01_VAL (0x20000001)
+#define CC_FBC_V03_00_VAL (0x30000000)
+#define CC_FBC_V03_01_VAL (0x30000001)
+
+#define CC_FBC_V01_FILE_SIZE (655360)
+#define CC_FBC_V02_FILE_SIZE (786432)
+#define CC_FBC_V02_CUR_PQ_BIN_FILE_SIZE (0xB000)
+#define CC_FBC_V03_FILE_SIZE (2097152)
+#define CC_FBC_V03_CUR_PQ_BIN_FILE_SIZE (0xB000)
+
+#define CC_UPGRADE_MAX_BLOCK_LEN (0x10000)
+#define CC_UPGRADE_DATA_BUF_SIZE (CC_UPGRADE_MAX_BLOCK_LEN + 4)
+
+#define CC_UPGRADE_MODE_BOOT_MAIN (0)
+#define CC_UPGRADE_MODE_BOOT (1)
+#define CC_UPGRADE_MODE_MAIN (2)
+#define CC_UPGRADE_MODE_COMPACT_BOOT (3)
+#define CC_UPGRADE_MODE_ALL (4)
+
+#define CC_UPGRADE_MODE_MAIN_PQ_WB (5)
+#define CC_UPGRADE_MODE_ALL_PQ_WB (6)
+#define CC_UPGRADE_MODE_MAIN_WB (7)
+#define CC_UPGRADE_MODE_ALL_WB (8)
+#define CC_UPGRADE_MODE_MAIN_PQ (9)
+#define CC_UPGRADE_MODE_ALL_PQ (10)
+
+#define CC_UPGRADE_MODE_PQ_WB_ONLY (11)
+#define CC_UPGRADE_MODE_WB_ONLY (12)
+#define CC_UPGRADE_MODE_PQ_ONLY (13)
+
+#define CC_UPGRADE_MODE_CUR_PQ_BIN (14)
+#define CC_UPGRADE_MODE_ALL_PQ_BIN (15)
+
+#define CC_UPGRADE_MODE_BURN (16)
+
+#define CC_UPGRADE_MODE_DUMMY (17)
+
+#define CC_UPGRADE_V01_BOOT_OFFSET (0x0)
+#define CC_UPGRADE_V01_BOOT_LEN (0x20000)
+#define CC_UPGRADE_V01_MAIN_OFFSET (0x20000)
+#define CC_UPGRADE_V01_MAIN_LEN (CC_FBC_V01_FILE_SIZE - CC_UPGRADE_V01_MAIN_OFFSET)
+#define CC_UPGRADE_V01_ALL_LENGTH (CC_FBC_V01_FILE_SIZE)
+
+#define CC_UPGRADE_V02_COMPACT_BOOT_OFFSET (0x0)
+#define CC_UPGRADE_V02_COMPACT_BOOT_LEN (0x10000)
+#define CC_UPGRADE_V02_BOOT_OFFSET (0x10000)
+#define CC_UPGRADE_V02_BOOT_LEN (0x30000)
+#define CC_UPGRADE_V02_MAIN_OFFSET (0x40000)
+#define CC_UPGRADE_V02_MAIN_LEN (0x80000)
+#define CC_UPGRADE_V02_BOOT_BAK_OFFSET (0xC0000)
+#define CC_UPGRADE_V02_BOOT_BAK_LEN (0x30000)
+#define CC_UPGRADE_V02_MAIN_BAK_OFFSET (0xF0000)
+#define CC_UPGRADE_V02_MAIN_BAK_LEN (0x80000)
+#define CC_UPGRADE_V02_ALL_LENGTH (0x170000)
+
+#define CC_UPGRADE_V02_CUR_PQ_OFFSET (0xAF000)
+
+#define CC_UPGRADE_V03_COMPACT_BOOT_OFFSET (CC_UPGRADE_V02_COMPACT_BOOT_OFFSET)
+#define CC_UPGRADE_V03_COMPACT_BOOT_LEN (CC_UPGRADE_V02_COMPACT_BOOT_LEN)
+#define CC_UPGRADE_V03_BOOT_OFFSET (CC_UPGRADE_V02_BOOT_OFFSET)
+#define CC_UPGRADE_V03_BOOT_LEN (CC_UPGRADE_V02_BOOT_LEN)
+#define CC_UPGRADE_V03_MAIN_OFFSET (CC_UPGRADE_V02_MAIN_OFFSET)
+#define CC_UPGRADE_V03_MAIN_LEN (CC_UPGRADE_V02_MAIN_LEN)
+#define CC_UPGRADE_V03_BOOT_BAK_OFFSET (CC_UPGRADE_V02_BOOT_BAK_OFFSET)
+#define CC_UPGRADE_V03_BOOT_BAK_LEN (CC_UPGRADE_V02_BOOT_BAK_LEN)
+#define CC_UPGRADE_V03_MAIN_BAK_OFFSET (CC_UPGRADE_V02_MAIN_BAK_OFFSET)
+#define CC_UPGRADE_V03_MAIN_BAK_LEN (CC_UPGRADE_V02_MAIN_BAK_LEN)
+#define CC_UPGRADE_V03_PROTECT_DATA_START (0x1FF000)
+#define CC_UPGRADE_V03_PROTECT_DATA_LEN (0x1000)
+#define CC_UPGRADE_V03_ALL_LENGTH (CC_UPGRADE_V03_PROTECT_DATA_START)
+
+#define CC_UPGRADE_V03_CUR_PQ_OFFSET (CC_UPGRADE_V02_CUR_PQ_OFFSET)
+
+
+class CUpgradeFBC: public CThread {
+public:
+ CUpgradeFBC();
+ ~CUpgradeFBC();
+
+ int start();
+ int stop();
+ int GetUpgradeFBCProgress();
+ int SetUpgradeFileName(char *file_name);
+ int SetUpgradeFileSize(int file_size);
+ int SetUpgradeBlockSize(int block_size);
+ int SetUpgradeMode(int mode);
+
+ class IUpgradeFBCObserver {
+ public:
+ IUpgradeFBCObserver() {};
+ virtual ~IUpgradeFBCObserver() {};
+ virtual void onUpgradeStatus(int state, int param) {};
+ };
+ void setObserver(IUpgradeFBCObserver *pOb)
+ {
+ mpObserver = pOb;
+ };
+
+private:
+ bool threadLoop();
+
+ int AddCRCToDataBuf(unsigned char data_buf[], int data_len);
+
+ int mState;
+ int mUpgradeMode;
+ int mOPTotalSize;
+ int mBinFileSize;
+ int mUpgradeBlockSize;
+ unsigned char *mBinFileBuf;
+ char mFileName[256];
+ unsigned char mDataBuf[CC_UPGRADE_DATA_BUF_SIZE];
+ IUpgradeFBCObserver *mpObserver;
+ CFbcCommunication *mCfbcIns;
+
+ enum UpgradeState {
+ STATE_STOPED = 0,
+ STATE_RUNNING,
+ STATE_FINISHED,
+ STATE_ABORT,
+ };
+
+ enum FBCUpgradeErrorCode {
+ ERR_SERIAL_CONNECT = -1,
+ ERR_OPEN_BIN_FILE = -2,
+ ERR_BIN_FILE_SIZE = -3,
+ ERR_READ_BIN_FILE = -4,
+ ERR_NOT_SUPPORT_UPGRADE_MDOE = -5,
+ ERR_NOT_CORRECT_UPGRADE_BLKSIZE = -6,
+ ERR_DATA_CRC_ERROR = -7,
+ };
+};
+
+#endif //__TV_UPGRADE_FBC_H__
diff --git a/tvapi/libtv/tv/ScreenCatch.cpp b/tvapi/libtv/tv/ScreenCatch.cpp
new file mode 100644
index 0000000..0ed084e
--- a/dev/null
+++ b/tvapi/libtv/tv/ScreenCatch.cpp
@@ -0,0 +1,379 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_NDEBUG 1
+#define LOG_TAG "ScreenCatch"
+
+#include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MetaData.h>
+#include <OMX_IVCommon.h>
+#include <MetadataBufferType.h>
+
+#include <ui/GraphicBuffer.h>
+#include <gui/ISurfaceComposer.h>
+#include <gui/IGraphicBufferAlloc.h>
+#include <OMX_Component.h>
+
+#include <utils/Log.h>
+#include <utils/String8.h>
+
+#include <private/gui/ComposerService.h>
+
+#include <media/stagefright/ScreenCatch.h>
+#include <media/stagefright/ScreenSource.h>
+
+#include <binder/IPCThreadState.h>
+#include <binder/MemoryBase.h>
+#include <binder/MemoryHeapBase.h>
+
+#include <stdio.h>
+#include <assert.h>
+#include <limits.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sched.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <binder/IServiceManager.h>
+
+#define BOUNDRY 32
+
+#define ALIGN(x) (x + (BOUNDRY) - 1)& ~((BOUNDRY) - 1)
+
+namespace android {
+
+ struct ScreenCatch::ScreenCatchClient : public BnScreenMediaSourceClient {
+ ScreenCatchClient(void *user)
+ {
+ mUser = user;
+ ALOGE("[%s %d] user:%x", __FUNCTION__, __LINE__, user);
+ }
+
+ virtual void notify(int msg, int ext1, int ext2, const Parcel *obj)
+ {
+ ALOGI("notify %d, %d, %d", msg, ext1, ext2);
+ }
+
+ virtual int dataCallback(const sp<IMemory> &data)
+ {
+ return 0;
+ }
+
+ protected:
+ void *mUser;
+ virtual ~ScreenCatchClient() {}
+
+ private:
+ DISALLOW_EVIL_CONSTRUCTORS(ScreenCatchClient);
+ };
+
+ ScreenCatch::ScreenCatch(uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bitSize) :
+ mWidth(ALIGN(bufferWidth)),
+ mHeight(bufferHeight),
+ mScreenMediaSourceService(NULL),
+ mColorFormat(OMX_COLOR_Format32bitARGB8888),
+ mBitSize(bitSize)
+ {
+ ALOGE("ScreenCatch: %dx%d", bufferWidth, bufferHeight);
+
+ if (bufferWidth <= 0 || bufferHeight <= 0 || bufferWidth > 1920 || bufferHeight > 1080) {
+ ALOGE("Invalid dimensions %dx%d", bufferWidth, bufferHeight);
+ }
+
+ if (bitSize != 24 || bitSize != 32)
+ bitSize = 32;
+
+ mCorpX = -1;
+ mCorpY = -1;
+ mCorpWidth = -1;
+ mCorpHeight = -1;
+
+ }
+
+ ScreenCatch::~ScreenCatch()
+ {
+ ALOGE("~ScreenCatch");
+ }
+
+ void ScreenCatch::setVideoRotation(int degree)
+ {
+ int angle;
+
+ ALOGI("[%s %d] setVideoRotation degree:%x", __FUNCTION__, __LINE__, degree);
+
+ }
+
+ void ScreenCatch::setVideoCrop(int x, int y, int width, int height)
+ {
+ mCorpX = x;
+ mCorpY = y;
+ mCorpWidth = width;
+ mCorpHeight = height;
+ }
+
+ static inline void yuv_to_rgb32(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb)
+ {
+ register int r, g, b;
+
+ r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10;
+ g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u - 128) ) >> 10;
+ b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10;
+
+ r = r > 255 ? 255 : r < 0 ? 0 : r;
+ g = g > 255 ? 255 : g < 0 ? 0 : g;
+ b = b > 255 ? 255 : b < 0 ? 0 : b;
+
+ /*ARGB*/
+ *rgb = (unsigned char)r;
+ rgb++;
+ *rgb = (unsigned char)g;
+ rgb++;
+ *rgb = (unsigned char)b;
+ rgb++;
+ *rgb = 0xff;
+
+ }
+
+ void nv21_to_rgb32(unsigned char *buf, unsigned char *rgb, int width, int height)
+ {
+ int x, y, z = 0;
+ int h, w;
+ int blocks;
+ unsigned char Y1, Y2, U, V;
+
+ blocks = (width * height) * 2;
+
+ for (h = 0, z = 0; h < height; h += 2) {
+ for (y = 0; y < width * 2; y += 2) {
+
+ Y1 = buf[ h * width + y + 0];
+ V = buf[ blocks / 2 + h * width / 2 + y % width + 0 ];
+ Y2 = buf[ h * width + y + 1];
+ U = buf[ blocks / 2 + h * width / 2 + y % width + 1 ];
+
+ yuv_to_rgb32(Y1, U, V, &rgb[z]);
+ yuv_to_rgb32(Y2, U, V, &rgb[z + 4]);
+ z += 8;
+ }
+ }
+ }
+
+ static inline void yuv_to_rgb24(unsigned char y, unsigned char u, unsigned char v, unsigned char *rgb)
+ {
+ register int r, g, b;
+
+ r = (1192 * (y - 16) + 1634 * (v - 128) ) >> 10;
+ g = (1192 * (y - 16) - 833 * (v - 128) - 400 * (u - 128) ) >> 10;
+ b = (1192 * (y - 16) + 2066 * (u - 128) ) >> 10;
+
+ r = r > 255 ? 255 : r < 0 ? 0 : r;
+ g = g > 255 ? 255 : g < 0 ? 0 : g;
+ b = b > 255 ? 255 : b < 0 ? 0 : b;
+
+ /*ARGB*/
+ *rgb = (unsigned char)r;
+ rgb++;
+ *rgb = (unsigned char)g;
+ rgb++;
+ *rgb = (unsigned char)b;
+ }
+
+ void nv21_to_rgb24(unsigned char *buf, unsigned char *rgb, int width, int height)
+ {
+ int x, y, z = 0;
+ int h, w;
+ int blocks;
+ unsigned char Y1, Y2, U, V;
+
+ blocks = (width * height) * 2;
+
+ for (h = 0, z = 0; h < height; h += 2) {
+ for (y = 0; y < width * 2; y += 2) {
+
+ Y1 = buf[ h * width + y + 0];
+ V = buf[ blocks / 2 + h * width / 2 + y % width + 0 ];
+ Y2 = buf[ h * width + y + 1];
+ U = buf[ blocks / 2 + h * width / 2 + y % width + 1 ];
+
+ yuv_to_rgb24(Y1, U, V, &rgb[z]);
+ yuv_to_rgb24(Y2, U, V, &rgb[z + 3]);
+ z += 6;
+ }
+ }
+ }
+
+ int ScreenCatch::threadFunc()
+ {
+ int64_t pts;
+ int status;
+
+ sp<MemoryHeapBase> newMemoryHeap = new MemoryHeapBase(mWidth * mHeight * 3 / 2);
+ sp<MemoryBase> buffer = new MemoryBase(newMemoryHeap, 0, mWidth * mHeight * 3 / 2);
+
+ ALOGV("[%s %d] empty:%d", __FUNCTION__, __LINE__, mRawBufferQueue.empty());
+
+ while (mStart == true) {
+
+ status = mScreenMediaSourceService->readBuffer(mClientId, buffer, &pts);
+
+ if (status != OK && mStart == true) {
+ usleep(10000);
+ continue;
+ }
+
+ if (mStart != true)
+ break;
+
+ MediaBuffer *accessUnit;
+
+ if (OMX_COLOR_Format24bitRGB888 == mColorFormat) { //rgb 24bit
+ accessUnit = new MediaBuffer(mWidth * mHeight * 3);
+ nv21_to_rgb24((unsigned char *)buffer->pointer(), (unsigned char *)accessUnit->data(), mWidth, mHeight);
+ accessUnit->set_range(0, mWidth * mHeight * 3);
+ } else if (OMX_COLOR_Format32bitARGB8888 == mColorFormat) { //rgba 32bit
+ accessUnit = new MediaBuffer(mWidth * mHeight * 4);
+ nv21_to_rgb32((unsigned char *)buffer->pointer(), (unsigned char *)accessUnit->data(), mWidth, mHeight);
+ accessUnit->set_range(0, mWidth * mHeight * 4);
+ } else if (OMX_COLOR_FormatYUV420SemiPlanar == mColorFormat) { //nv21
+ accessUnit = new MediaBuffer(mWidth * mHeight * 3 / 2);
+ memcpy((unsigned char *)accessUnit->data(), (unsigned char *)buffer->pointer(), mWidth * mHeight * 3 / 2);
+ accessUnit->set_range(0, mWidth * mHeight * 3 / 2);
+ }
+ mRawBufferQueue.push_back(accessUnit);
+ }
+
+ ALOGE("[%s %d] thread out", __FUNCTION__, __LINE__);
+
+ mThreadOutCondition.signal();
+
+ return 0;
+ }
+
+ void *ScreenCatch::ThreadWrapper(void *me)
+ {
+
+ ScreenCatch *Convertor = static_cast<ScreenCatch *>(me);
+ Convertor->threadFunc();
+ return NULL;
+ }
+
+ status_t ScreenCatch::start(MetaData *params)
+ {
+ ALOGE("[%s %d] mWidth:%d mHeight:%d", __FUNCTION__, __LINE__, mWidth, mHeight);
+ Mutex::Autolock autoLock(mLock);
+
+ status_t status;
+ int64_t pts;
+ int client_id;
+
+ sp<IServiceManager> sm = defaultServiceManager();
+ sp<IBinder> binder = sm->getService(String16("media.screenmediasource"));
+ mScreenMediaSourceService = interface_cast<IScreenMediaSource>(binder);
+
+ sp<ScreenCatchClient> mIScreenSourceClient = new ScreenCatchClient(this);
+
+ ALOGE("[%s %d] mWidth:%d mHeight:%d", __FUNCTION__, __LINE__, mWidth, mHeight);
+
+ mScreenMediaSourceService->registerClient(mIScreenSourceClient, mWidth, mHeight, 1, SCREENMEDIASOURC_RAWDATA_TYPE, &client_id, NULL);
+
+ ALOGE("[%s %d] client_id:%d", __FUNCTION__, __LINE__, client_id);
+
+ mClientId = client_id;
+
+ if (status != OK) {
+ ALOGE("setResolutionRatio fail");
+ return !OK;
+ }
+
+ ALOGV("[%s %d] mCorpX:%d mCorpY:%d mCorpWidth:%d mCorpHeight:%d", __FUNCTION__, __LINE__, mCorpX, mCorpY, mCorpWidth, mCorpHeight);
+
+ if (mCorpX != -1)
+ mScreenMediaSourceService->setVideoCrop(client_id, mCorpX, mCorpY, mCorpWidth, mCorpHeight);
+
+
+ status = mScreenMediaSourceService->start(client_id);
+
+ if (status != OK) {
+ mScreenMediaSourceService->unregisterClient(mClientId);
+ ALOGE("ScreenMediaSourceService start fail");
+ return !OK;
+ }
+
+ if (!(params->findInt32(kKeyColorFormat, &mColorFormat)
+ && (mColorFormat != OMX_COLOR_FormatYUV420SemiPlanar
+ || mColorFormat != OMX_COLOR_Format24bitRGB888
+ || mColorFormat != OMX_COLOR_Format32bitARGB8888)))
+ mColorFormat = OMX_COLOR_Format32bitARGB8888;
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+ pthread_create(&mThread, &attr, ThreadWrapper, this);
+ pthread_attr_destroy(&attr);
+
+ mStart = true;
+
+ ALOGV("[%s %d]", __FUNCTION__, __LINE__);
+ return OK;
+ }
+
+ status_t ScreenCatch::stop()
+ {
+ ALOGV("[%s %d]", __FUNCTION__, __LINE__);
+ Mutex::Autolock autoLock(mLock);
+ mStart = false;
+
+ mThreadOutCondition.waitRelative(mLock, 1000000000000);
+ ALOGV("[%s %d]", __FUNCTION__, __LINE__);
+
+ while (!mRawBufferQueue.empty()) {
+
+ ALOGV("[%s %d] free buffer", __FUNCTION__, __LINE__);
+
+ MediaBuffer *rawBuffer = *mRawBufferQueue.begin();
+ mRawBufferQueue.erase(mRawBufferQueue.begin());
+ rawBuffer->release();
+ }
+
+ mScreenMediaSourceService->stop(mClientId);
+ mScreenMediaSourceService->unregisterClient(mClientId);
+
+ return OK;
+ }
+
+ status_t ScreenCatch::read(MediaBuffer **buffer)
+ {
+ Mutex::Autolock autoLock(mLock);
+
+ if (!mRawBufferQueue.empty()) {
+ MediaBuffer *rawBuffer = *mRawBufferQueue.begin();
+ mRawBufferQueue.erase(mRawBufferQueue.begin());
+ *buffer = rawBuffer;
+ return OK;
+ }
+
+ return !OK;
+ }
+
+ status_t ScreenCatch::free(MediaBuffer *buffer)
+ {
+ Mutex::Autolock autoLock(mLock);
+ buffer->release();
+ return OK;
+ }
+
+} // end of namespace android
diff --git a/tvapi/libtv/tvconfig/CIniFile.cpp b/tvapi/libtv/tvconfig/CIniFile.cpp
index 1cd4cf8..2461a68 100644
--- a/tvapi/libtv/tvconfig/CIniFile.cpp
+++ b/tvapi/libtv/tvconfig/CIniFile.cpp
@@ -1,353 +1,353 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "CIniFile.h"
-
-CIniFile::CIniFile()
-{
- mpFirstSection = NULL;
- mpFileName[0] = '\0';
- m_pIniFile = NULL;
- mpFirstLine = NULL;
-}
-
-CIniFile::~CIniFile()
-{
- LOGD("CIniFile::~CIniFile()");
- FreeAllMem();
-}
-
-int CIniFile::LoadFromFile(const char *filename)
-{
- char lineStr[MAX_INI_FILE_LINE_LEN];
- char *pStr;
- LINE *pCurLINE = NULL;
- SECTION *pCurSection = NULL;
-
- FreeAllMem();
-
- int Len;
- if (filename == NULL) {
- return -1;
- }
-
- strcpy(mpFileName, filename);
- LOGD("LoadFromFile 2name = %s", mpFileName);
- if ((m_pIniFile = fopen (mpFileName, "r")) == NULL) {
- return -1;
- }
-
- while (fgets (lineStr, MAX_INI_FILE_LINE_LEN, m_pIniFile) != NULL) {
- //去掉多余字符
- allTrim(lineStr);
-
- LINE *pLINE = new LINE();
- pLINE->pKeyStart = pLINE->Text;
- pLINE->pKeyEnd = pLINE->Text;
- pLINE->pValueStart = pLINE->Text;
- pLINE->pValueEnd = pLINE->Text;
- pLINE->pNext = NULL;
- pLINE->type = getLineType(lineStr);
- //LOGD("getline=%s len=%d type=%d", lineStr, strlen(lineStr), pLINE->type);
- strcpy(pLINE->Text, lineStr);
- pLINE->LineLen = strlen(pLINE->Text);
-
- //head
- if(mpFirstLine == NULL) {
- mpFirstLine = pLINE;
- } else {
- pCurLINE->pNext = pLINE;
- }
-
- pCurLINE = pLINE;
-
- switch(pCurLINE->type) {
- case LINE_TYPE_SECTION: {
- SECTION *pSec = new SECTION();
- pSec->pLine = pLINE;
- pSec->pNext = NULL;
- if(mpFirstSection == NULL) { //first section
- mpFirstSection = pSec;
- } else {
- pCurSection->pNext = pSec;
- }
- pCurSection = pSec;
- break;
- }
- case LINE_TYPE_KEY: {
- char *pM = strchr(pCurLINE->Text, '=');
- pCurLINE->pKeyStart = pCurLINE->Text;
- pCurLINE->pKeyEnd = pM - 1;
- pCurLINE->pValueStart = pM + 1;
- pCurLINE->pValueEnd = pCurLINE->Text + pCurLINE->LineLen - 1;
- break;
- }
- case LINE_TYPE_COMMENT: {
- break;
- }
- default: {
- break;
- }
- }
- }
-
- fclose (m_pIniFile);
- m_pIniFile = NULL;
-
- return 0;
-}
-
-void CIniFile::printAll()
-{
- //line
- for(LINE *pline = mpFirstLine; pline != NULL; pline = pline->pNext) {
- LOGD("line = %s type = %d", pline->Text, pline->type);
- }
-
- //section
- for(SECTION *psec = mpFirstSection; psec != NULL; psec = psec->pNext) {
- LOGD("sec = %s", psec->pLine->Text);
- }
- return;
-}
-
-int CIniFile::LoadFromString(const char *str)
-{
- return 0;
-}
-
-int CIniFile::SaveToFile(const char *filename)
-{
- const char *file = NULL;
- if(m_pIniFile != NULL) {
- fclose (m_pIniFile);
- }
-
- if(filename == NULL) {
- if(strlen(mpFileName) == 0) {
- LOGD("error save file is null");
- return -1;
- } else {
- file = mpFileName;
- }
- } else {
- file = filename;
- }
- //LOGD("Save to file name = %s", file);
-
- if((m_pIniFile = fopen (file, "wb")) == NULL) {
- LOGD("Save to file open error = %s", file);
- return -1;
- }
-
- LINE *pCurLine = NULL;
- for(pCurLine = mpFirstLine; pCurLine != NULL; pCurLine = pCurLine->pNext) {
- fprintf (m_pIniFile, "%s\r\n", pCurLine->Text);
- }
-
- fflush(m_pIniFile);
- fsync(fileno(m_pIniFile));
-
- fclose(m_pIniFile);
- m_pIniFile = NULL;
- return 0;
-}
-
-//æš‚ä¸æ’å…¥æ“作
-int CIniFile::SetString(const char *section, const char *key, const char *value)
-{
- SECTION *pNewSec = NULL;
- LINE *pNewSecLine = NULL;
- LINE *pNewKeyLine = NULL;
-
- SECTION *pSec = getSection(section);
- if(pSec == NULL) {
- pNewSec = new SECTION();
- pNewSecLine = new LINE();
- pNewKeyLine = new LINE();
-
- pNewKeyLine->type = LINE_TYPE_KEY;
- pNewSecLine->type = LINE_TYPE_SECTION;
-
-
- sprintf(pNewSecLine->Text, "[%s]", section);
- pNewSec->pLine = pNewSecLine;
-
- InsertSection(pNewSec);
-
- int keylen = strlen(key);
- sprintf(pNewKeyLine->Text, "%s=%s", key, value);
- pNewKeyLine->LineLen = strlen(pNewKeyLine->Text);
- pNewKeyLine->pKeyStart = pNewKeyLine->Text;
- pNewKeyLine->pKeyEnd = pNewKeyLine->pKeyStart + keylen - 1;
- pNewKeyLine->pValueStart = pNewKeyLine->pKeyStart + keylen + 1;
- pNewKeyLine->pValueEnd = pNewKeyLine->Text + pNewKeyLine->LineLen - 1;
-
- InsertKeyLine(pNewSec, pNewKeyLine);
-
- } else { //find section
- LINE *pLine = getKeyLineAtSec(pSec, key);
- if(pLine == NULL) { //, not find key
- pNewKeyLine = new LINE();
- pNewKeyLine->type = LINE_TYPE_KEY;
-
- int keylen = strlen(key);
- sprintf(pNewKeyLine->Text, "%s=%s", key, value);
- pNewKeyLine->LineLen = strlen(pNewKeyLine->Text);
- pNewKeyLine->pKeyStart = pNewKeyLine->Text;
- pNewKeyLine->pKeyEnd = pNewKeyLine->pKeyStart + keylen - 1;
- pNewKeyLine->pValueStart = pNewKeyLine->pKeyStart + keylen + 1;
- pNewKeyLine->pValueEnd = pNewKeyLine->Text + pNewKeyLine->LineLen - 1;
-
- InsertKeyLine(pSec, pNewKeyLine);
- } else { //all find, change it
- sprintf(pLine->Text, "%s=%s", key, value);
- pLine->LineLen = strlen(pLine->Text);
- pLine->pValueEnd = pLine->Text + pLine->LineLen - 1;
- }
- }
-
- //save
- SaveToFile(NULL);
- return 0;
-}
-int CIniFile::SetInt(const char *section, const char *key, int value)
-{
- char tmp[64];
- sprintf(tmp, "%d", value);
- SetString(section, key, tmp);
- return 0;
-}
-const char *CIniFile::GetString(const char *section, const char *key, const char *def_value)
-{
- SECTION *pSec = getSection(section);
- if(pSec == NULL) return def_value;
- LINE *pLine = getKeyLineAtSec(pSec, key);
- if(pLine == NULL) return def_value;
-
- return pLine->pValueStart;
-}
-int CIniFile::GetInt(const char *section, const char *key, int def_value)
-{
- const char *num = GetString(section, key, NULL);
- if(num != NULL) {
- return atoi(num);
- }
- return def_value;
-}
-
-
-LINE_TYPE CIniFile::getLineType(char *Str)
-{
- LINE_TYPE type = LINE_TYPE_COMMENT;
- //åªè¦æœ‰#,就是注释
- if(strchr(Str, '#') != NULL) {
- type = LINE_TYPE_COMMENT;
- } else if ( (strstr (Str, "[") != NULL) && (strstr (Str, "]") != NULL) ) { /* Is Section */
- type = LINE_TYPE_SECTION;
- } else {
- if (strstr (Str, "=") != NULL) {
- type = LINE_TYPE_KEY;
- } else {
- type = LINE_TYPE_COMMENT;
- }
- }
- return type;
-}
-
-void CIniFile::FreeAllMem()
-{
- //line
- LINE *pCurLine = NULL;
- LINE *pNextLine = NULL;
- for(pCurLine = mpFirstLine; pCurLine != NULL;) {
- pNextLine = pCurLine->pNext;
- delete pCurLine;
- pCurLine = pNextLine;
- }
- mpFirstLine = NULL;
- //section
- SECTION *pCurSec = NULL;
- SECTION *pNextSec = NULL;
- for(pCurSec = mpFirstSection; pCurSec != NULL;) {
- pNextSec = pCurSec->pNext;
- delete pCurSec;
- pCurSec = pNextSec;
- }
- mpFirstSection = NULL;
-}
-
-int CIniFile::InsertSection(SECTION *pSec)
-{
- //insert it to sections list ,as first section
- pSec->pNext = mpFirstSection;
- mpFirstSection = pSec;
- //insert it to lines list, at first
- pSec->pLine->pNext = mpFirstLine;
- mpFirstLine = pSec->pLine;
- return 0;
-}
-int CIniFile::InsertKeyLine(SECTION *pSec, LINE *line)
-{
- LINE *line1 = pSec->pLine;
- LINE *line2 = line1->pNext;
- line1->pNext = line;
- line->pNext = line2;
- return 0;
-}
-SECTION *CIniFile::getSection(const char *section)
-{
- //section
- for(SECTION *psec = mpFirstSection; psec != NULL; psec = psec->pNext) {
- if(strncmp((psec->pLine->Text) + 1, section, strlen(section)) == 0)
- return psec;
- }
- return NULL;
-}
-LINE *CIniFile::getKeyLineAtSec(SECTION *pSec, const char *key)
-{
- //line
- for(LINE *pline = pSec->pLine->pNext; (pline != NULL && pline->type != LINE_TYPE_SECTION); pline = pline->pNext) {
- if(pline->type == LINE_TYPE_KEY) {
- if(strncmp(pline->Text, key, strlen(key)) == 0)
- return pline;
- }
- }
- return NULL;
-}
-//去掉串里é¢çš„,空格,回车,æ¢è¡Œ,s指å‘转æ¢å¤„ç†åŽçš„串的开头
-void CIniFile::allTrim(char *Str)
-{
- //去掉æ¢è¡Œ
- char *pStr;
- pStr = strchr (Str, '\n');
- if (pStr != NULL) {
- *pStr = 0;
- }
- //去掉尾部回车
- int Len = strlen(Str);
- if ( Len > 0 ) {
- if ( Str[Len - 1] == '\r' ) {
- Str[Len - 1] = '\0';
- }
- }
- //去掉空格
- pStr = Str;
- while(*pStr != '\0') { //没到尾部
- if(*pStr == ' ') { //é‡åˆ°ç©ºæ ¼
- char *pTmp = pStr;//从空格处开始
- while(*pTmp != '\0') {
- *pTmp = *(pTmp + 1);//å‰ç§»,包括移最åŽç»“æŸç¬¦
- pTmp++;
- }
- } else {
- pStr++;
- }
- }
- return;
-}
-
-
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "CIniFile.h"
+
+CIniFile::CIniFile()
+{
+ mpFirstSection = NULL;
+ mpFileName[0] = '\0';
+ m_pIniFile = NULL;
+ mpFirstLine = NULL;
+}
+
+CIniFile::~CIniFile()
+{
+ LOGD("CIniFile::~CIniFile()");
+ FreeAllMem();
+}
+
+int CIniFile::LoadFromFile(const char *filename)
+{
+ char lineStr[MAX_INI_FILE_LINE_LEN];
+ char *pStr;
+ LINE *pCurLINE = NULL;
+ SECTION *pCurSection = NULL;
+
+ FreeAllMem();
+
+ int Len;
+ if (filename == NULL) {
+ return -1;
+ }
+
+ strcpy(mpFileName, filename);
+ LOGD("LoadFromFile 2name = %s", mpFileName);
+ if ((m_pIniFile = fopen (mpFileName, "r")) == NULL) {
+ return -1;
+ }
+
+ while (fgets (lineStr, MAX_INI_FILE_LINE_LEN, m_pIniFile) != NULL) {
+ //去掉多余字符
+ allTrim(lineStr);
+
+ LINE *pLINE = new LINE();
+ pLINE->pKeyStart = pLINE->Text;
+ pLINE->pKeyEnd = pLINE->Text;
+ pLINE->pValueStart = pLINE->Text;
+ pLINE->pValueEnd = pLINE->Text;
+ pLINE->pNext = NULL;
+ pLINE->type = getLineType(lineStr);
+ //LOGD("getline=%s len=%d type=%d", lineStr, strlen(lineStr), pLINE->type);
+ strcpy(pLINE->Text, lineStr);
+ pLINE->LineLen = strlen(pLINE->Text);
+
+ //head
+ if (mpFirstLine == NULL) {
+ mpFirstLine = pLINE;
+ } else {
+ pCurLINE->pNext = pLINE;
+ }
+
+ pCurLINE = pLINE;
+
+ switch (pCurLINE->type) {
+ case LINE_TYPE_SECTION: {
+ SECTION *pSec = new SECTION();
+ pSec->pLine = pLINE;
+ pSec->pNext = NULL;
+ if (mpFirstSection == NULL) { //first section
+ mpFirstSection = pSec;
+ } else {
+ pCurSection->pNext = pSec;
+ }
+ pCurSection = pSec;
+ break;
+ }
+ case LINE_TYPE_KEY: {
+ char *pM = strchr(pCurLINE->Text, '=');
+ pCurLINE->pKeyStart = pCurLINE->Text;
+ pCurLINE->pKeyEnd = pM - 1;
+ pCurLINE->pValueStart = pM + 1;
+ pCurLINE->pValueEnd = pCurLINE->Text + pCurLINE->LineLen - 1;
+ break;
+ }
+ case LINE_TYPE_COMMENT: {
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ }
+
+ fclose (m_pIniFile);
+ m_pIniFile = NULL;
+
+ return 0;
+}
+
+void CIniFile::printAll()
+{
+ //line
+ for (LINE *pline = mpFirstLine; pline != NULL; pline = pline->pNext) {
+ LOGD("line = %s type = %d", pline->Text, pline->type);
+ }
+
+ //section
+ for (SECTION *psec = mpFirstSection; psec != NULL; psec = psec->pNext) {
+ LOGD("sec = %s", psec->pLine->Text);
+ }
+ return;
+}
+
+int CIniFile::LoadFromString(const char *str)
+{
+ return 0;
+}
+
+int CIniFile::SaveToFile(const char *filename)
+{
+ const char *file = NULL;
+ if (m_pIniFile != NULL) {
+ fclose (m_pIniFile);
+ }
+
+ if (filename == NULL) {
+ if (strlen(mpFileName) == 0) {
+ LOGD("error save file is null");
+ return -1;
+ } else {
+ file = mpFileName;
+ }
+ } else {
+ file = filename;
+ }
+ //LOGD("Save to file name = %s", file);
+
+ if ((m_pIniFile = fopen (file, "wb")) == NULL) {
+ LOGD("Save to file open error = %s", file);
+ return -1;
+ }
+
+ LINE *pCurLine = NULL;
+ for (pCurLine = mpFirstLine; pCurLine != NULL; pCurLine = pCurLine->pNext) {
+ fprintf (m_pIniFile, "%s\r\n", pCurLine->Text);
+ }
+
+ fflush(m_pIniFile);
+ fsync(fileno(m_pIniFile));
+
+ fclose(m_pIniFile);
+ m_pIniFile = NULL;
+ return 0;
+}
+
+//æš‚ä¸æ’å…¥æ“作
+int CIniFile::SetString(const char *section, const char *key, const char *value)
+{
+ SECTION *pNewSec = NULL;
+ LINE *pNewSecLine = NULL;
+ LINE *pNewKeyLine = NULL;
+
+ SECTION *pSec = getSection(section);
+ if (pSec == NULL) {
+ pNewSec = new SECTION();
+ pNewSecLine = new LINE();
+ pNewKeyLine = new LINE();
+
+ pNewKeyLine->type = LINE_TYPE_KEY;
+ pNewSecLine->type = LINE_TYPE_SECTION;
+
+
+ sprintf(pNewSecLine->Text, "[%s]", section);
+ pNewSec->pLine = pNewSecLine;
+
+ InsertSection(pNewSec);
+
+ int keylen = strlen(key);
+ sprintf(pNewKeyLine->Text, "%s=%s", key, value);
+ pNewKeyLine->LineLen = strlen(pNewKeyLine->Text);
+ pNewKeyLine->pKeyStart = pNewKeyLine->Text;
+ pNewKeyLine->pKeyEnd = pNewKeyLine->pKeyStart + keylen - 1;
+ pNewKeyLine->pValueStart = pNewKeyLine->pKeyStart + keylen + 1;
+ pNewKeyLine->pValueEnd = pNewKeyLine->Text + pNewKeyLine->LineLen - 1;
+
+ InsertKeyLine(pNewSec, pNewKeyLine);
+
+ } else { //find section
+ LINE *pLine = getKeyLineAtSec(pSec, key);
+ if (pLine == NULL) { //, not find key
+ pNewKeyLine = new LINE();
+ pNewKeyLine->type = LINE_TYPE_KEY;
+
+ int keylen = strlen(key);
+ sprintf(pNewKeyLine->Text, "%s=%s", key, value);
+ pNewKeyLine->LineLen = strlen(pNewKeyLine->Text);
+ pNewKeyLine->pKeyStart = pNewKeyLine->Text;
+ pNewKeyLine->pKeyEnd = pNewKeyLine->pKeyStart + keylen - 1;
+ pNewKeyLine->pValueStart = pNewKeyLine->pKeyStart + keylen + 1;
+ pNewKeyLine->pValueEnd = pNewKeyLine->Text + pNewKeyLine->LineLen - 1;
+
+ InsertKeyLine(pSec, pNewKeyLine);
+ } else { //all find, change it
+ sprintf(pLine->Text, "%s=%s", key, value);
+ pLine->LineLen = strlen(pLine->Text);
+ pLine->pValueEnd = pLine->Text + pLine->LineLen - 1;
+ }
+ }
+
+ //save
+ SaveToFile(NULL);
+ return 0;
+}
+int CIniFile::SetInt(const char *section, const char *key, int value)
+{
+ char tmp[64];
+ sprintf(tmp, "%d", value);
+ SetString(section, key, tmp);
+ return 0;
+}
+const char *CIniFile::GetString(const char *section, const char *key, const char *def_value)
+{
+ SECTION *pSec = getSection(section);
+ if (pSec == NULL) return def_value;
+ LINE *pLine = getKeyLineAtSec(pSec, key);
+ if (pLine == NULL) return def_value;
+
+ return pLine->pValueStart;
+}
+int CIniFile::GetInt(const char *section, const char *key, int def_value)
+{
+ const char *num = GetString(section, key, NULL);
+ if (num != NULL) {
+ return atoi(num);
+ }
+ return def_value;
+}
+
+
+LINE_TYPE CIniFile::getLineType(char *Str)
+{
+ LINE_TYPE type = LINE_TYPE_COMMENT;
+ //åªè¦æœ‰#,就是注释
+ if (strchr(Str, '#') != NULL) {
+ type = LINE_TYPE_COMMENT;
+ } else if ( (strstr (Str, "[") != NULL) && (strstr (Str, "]") != NULL) ) { /* Is Section */
+ type = LINE_TYPE_SECTION;
+ } else {
+ if (strstr (Str, "=") != NULL) {
+ type = LINE_TYPE_KEY;
+ } else {
+ type = LINE_TYPE_COMMENT;
+ }
+ }
+ return type;
+}
+
+void CIniFile::FreeAllMem()
+{
+ //line
+ LINE *pCurLine = NULL;
+ LINE *pNextLine = NULL;
+ for (pCurLine = mpFirstLine; pCurLine != NULL;) {
+ pNextLine = pCurLine->pNext;
+ delete pCurLine;
+ pCurLine = pNextLine;
+ }
+ mpFirstLine = NULL;
+ //section
+ SECTION *pCurSec = NULL;
+ SECTION *pNextSec = NULL;
+ for (pCurSec = mpFirstSection; pCurSec != NULL;) {
+ pNextSec = pCurSec->pNext;
+ delete pCurSec;
+ pCurSec = pNextSec;
+ }
+ mpFirstSection = NULL;
+}
+
+int CIniFile::InsertSection(SECTION *pSec)
+{
+ //insert it to sections list ,as first section
+ pSec->pNext = mpFirstSection;
+ mpFirstSection = pSec;
+ //insert it to lines list, at first
+ pSec->pLine->pNext = mpFirstLine;
+ mpFirstLine = pSec->pLine;
+ return 0;
+}
+int CIniFile::InsertKeyLine(SECTION *pSec, LINE *line)
+{
+ LINE *line1 = pSec->pLine;
+ LINE *line2 = line1->pNext;
+ line1->pNext = line;
+ line->pNext = line2;
+ return 0;
+}
+SECTION *CIniFile::getSection(const char *section)
+{
+ //section
+ for (SECTION *psec = mpFirstSection; psec != NULL; psec = psec->pNext) {
+ if (strncmp((psec->pLine->Text) + 1, section, strlen(section)) == 0)
+ return psec;
+ }
+ return NULL;
+}
+LINE *CIniFile::getKeyLineAtSec(SECTION *pSec, const char *key)
+{
+ //line
+ for (LINE *pline = pSec->pLine->pNext; (pline != NULL && pline->type != LINE_TYPE_SECTION); pline = pline->pNext) {
+ if (pline->type == LINE_TYPE_KEY) {
+ if (strncmp(pline->Text, key, strlen(key)) == 0)
+ return pline;
+ }
+ }
+ return NULL;
+}
+//去掉串里é¢çš„,空格,回车,æ¢è¡Œ,s指å‘转æ¢å¤„ç†åŽçš„串的开头
+void CIniFile::allTrim(char *Str)
+{
+ //去掉æ¢è¡Œ
+ char *pStr;
+ pStr = strchr (Str, '\n');
+ if (pStr != NULL) {
+ *pStr = 0;
+ }
+ //去掉尾部回车
+ int Len = strlen(Str);
+ if ( Len > 0 ) {
+ if ( Str[Len - 1] == '\r' ) {
+ Str[Len - 1] = '\0';
+ }
+ }
+ //去掉空格
+ pStr = Str;
+ while (*pStr != '\0') { //没到尾部
+ if (*pStr == ' ') { //é‡åˆ°ç©ºæ ¼
+ char *pTmp = pStr;//从空格处开始
+ while (*pTmp != '\0') {
+ *pTmp = *(pTmp + 1);//å‰ç§»,包括移最åŽç»“æŸç¬¦
+ pTmp++;
+ }
+ } else {
+ pStr++;
+ }
+ }
+ return;
+}
+
+
diff --git a/tvapi/libtv/tvconfig/tvconfig.conf b/tvapi/libtv/tvconfig/tvconfig.conf
index f892e29..d18fbca 100644
--- a/tvapi/libtv/tvconfig/tvconfig.conf
+++ b/tvapi/libtv/tvconfig/tvconfig.conf
@@ -1,30 +1,30 @@
-#ssm configure
-ro.tv.ssm.device_01_cfg = e2prom,/dev/i2c-0,0x1000,0,0xFFF,0x20,0x20,0x50,1,-1
-ssm.writeprotect.gpio = b,8,1
-
-#audio config
-audio.tv.card.id = hw:AMLM2
-audio.tv.card.name = AML-M2
-audio.amp.analog.mute.gpio = b,8,1
-audio.headset.mute.gpio = x,30,1
-audio.avout.mute.gpio = x,69,0
-audio.initaudio.gpioctl = b,8,1,x,30,0,b,5,1,x,69,1,x,68,0,x,67,1,x,66,0,x,65,1,x,64,0,x,63,1,x,62,0,x,61,1,x,60,0,x,59,1,x,58,0,x,57,1,x,56,0,x,55,1,x,54,0,x,53,1,x,52,0,x,51,1,x,50,0,x,49,1,x,48,0,x,47,1,x,46,0,x,45,1,x,44,0,x,43,1,x,42,0,x,41,1,x,40,0,x,39,0,x,38,0,x,37,1,x,36,0,x,35,1,x,34,0,x,33,1,x,32,0,x,31,1,x,30,0,x,29,1,x,28,0,x,27,1,x,26,0,x,25,1,x,24,0,x,23,1,x,22,0,x,21,1,x,20,0,x,19,1,x,18,0,x,17,1,x,16,0,x,15,1,x,14,0,x,13,1,x,12,0,x,11,1,x,10,0,x,9,1,x,8,0
-audio.amplifier.biquad00.data = 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,0x80, 0xC4, 0x96, 0x7F, 0x3B, 0x6A, 0x7F, 0x3A, 0xD3, 0x81, 0x87, 0xFD, 0x3F, 0x9D, 0xB5,0x8D, 0x18, 0x8C, 0x67, 0x10, 0x01, 0x72, 0xE7, 0x74, 0x96, 0x03, 0x40, 0x41, 0x76, 0x5F,0xAC, 0xE8, 0xCE, 0x32, 0x55, 0xB8, 0x53, 0x17, 0x32, 0xC1, 0xEA, 0x5F, 0x45, 0xDF, 0xF4,
-audio.amplifier.biquad01.data = 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,0x8D, 0x18, 0x8C, 0x67, 0x10, 0x01, 0x72, 0xE7, 0x74, 0x96, 0x03, 0x40, 0x41, 0x76, 0x5F,0xAC, 0xE8, 0xCE, 0x32, 0x55, 0xB8, 0x53, 0x17, 0x32, 0xC1, 0xEA, 0x5F, 0x45, 0xDF, 0xF4,
-
-#tvin config
-tvin.log.cfg = log_error,log_debug
-
-#vpp config
-vpp.log.cfg = log_error,log_debug
-
-#misc config
-misc.log.cfg = log_error,log_debug
-misc.lastselsrc.show.cfg = TV,AV1,AV2,YPBPR1,YPBPR2,HDMI1,HDMI1,HDMI2,VGA,MPEG,DTV
-
-#tvservice config
-tvservice.log.cfg = log_error
-
-#atv config
-atv.fac.defchaninfo = 13,8,49750000,0,1,0,0,0,0,0,136250000,2,1,0,0,0,0,0,160250000,0,1,0,0,0,0,0,168250000,0,1,0,0,0,0,0,416250000,0,1,0,0,0,0,0,456250000,1,1,0,0,0,0,0,471250000,3,2,0,0,0,0,0,863250000,0,1,0,0,0,0,0,49750000,0,1,0,0,0,0,0,217250000,2,1,0,0,0,0,0,471250000,3,2,0,0,0,0,0,527250000,1,1,0,0,0,0,0,783250000,0,1,0,0,0,0,0,
+#ssm configure
+ro.tv.ssm.device_01_cfg = e2prom,/dev/i2c-0,0x1000,0,0xFFF,0x20,0x20,0x50,1,-1
+ssm.writeprotect.gpio = b,8,1
+
+#audio config
+audio.tv.card.id = hw:AMLM2
+audio.tv.card.name = AML-M2
+audio.amp.analog.mute.gpio = b,8,1
+audio.headset.mute.gpio = x,30,1
+audio.avout.mute.gpio = x,69,0
+audio.initaudio.gpioctl = b,8,1,x,30,0,b,5,1,x,69,1,x,68,0,x,67,1,x,66,0,x,65,1,x,64,0,x,63,1,x,62,0,x,61,1,x,60,0,x,59,1,x,58,0,x,57,1,x,56,0,x,55,1,x,54,0,x,53,1,x,52,0,x,51,1,x,50,0,x,49,1,x,48,0,x,47,1,x,46,0,x,45,1,x,44,0,x,43,1,x,42,0,x,41,1,x,40,0,x,39,0,x,38,0,x,37,1,x,36,0,x,35,1,x,34,0,x,33,1,x,32,0,x,31,1,x,30,0,x,29,1,x,28,0,x,27,1,x,26,0,x,25,1,x,24,0,x,23,1,x,22,0,x,21,1,x,20,0,x,19,1,x,18,0,x,17,1,x,16,0,x,15,1,x,14,0,x,13,1,x,12,0,x,11,1,x,10,0,x,9,1,x,8,0
+audio.amplifier.biquad00.data = 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,0x80, 0xC4, 0x96, 0x7F, 0x3B, 0x6A, 0x7F, 0x3A, 0xD3, 0x81, 0x87, 0xFD, 0x3F, 0x9D, 0xB5,0x8D, 0x18, 0x8C, 0x67, 0x10, 0x01, 0x72, 0xE7, 0x74, 0x96, 0x03, 0x40, 0x41, 0x76, 0x5F,0xAC, 0xE8, 0xCE, 0x32, 0x55, 0xB8, 0x53, 0x17, 0x32, 0xC1, 0xEA, 0x5F, 0x45, 0xDF, 0xF4,
+audio.amplifier.biquad01.data = 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,0x8D, 0x18, 0x8C, 0x67, 0x10, 0x01, 0x72, 0xE7, 0x74, 0x96, 0x03, 0x40, 0x41, 0x76, 0x5F,0xAC, 0xE8, 0xCE, 0x32, 0x55, 0xB8, 0x53, 0x17, 0x32, 0xC1, 0xEA, 0x5F, 0x45, 0xDF, 0xF4,
+
+#tvin config
+tvin.log.cfg = log_error,log_debug
+
+#vpp config
+vpp.log.cfg = log_error,log_debug
+
+#misc config
+misc.log.cfg = log_error,log_debug
+misc.lastselsrc.show.cfg = TV,AV1,AV2,YPBPR1,YPBPR2,HDMI1,HDMI1,HDMI2,VGA,MPEG,DTV
+
+#tvservice config
+tvservice.log.cfg = log_error
+
+#atv config
+atv.fac.defchaninfo = 13,8,49750000,0,1,0,0,0,0,0,136250000,2,1,0,0,0,0,0,160250000,0,1,0,0,0,0,0,168250000,0,1,0,0,0,0,0,416250000,0,1,0,0,0,0,0,456250000,1,1,0,0,0,0,0,471250000,3,2,0,0,0,0,0,863250000,0,1,0,0,0,0,0,49750000,0,1,0,0,0,0,0,217250000,2,1,0,0,0,0,0,471250000,3,2,0,0,0,0,0,527250000,1,1,0,0,0,0,0,783250000,0,1,0,0,0,0,0,
atv.log.cfg = log_error,log_channelsearch_error,log_channelsearch_debug,log_channelselect_error,log_channelselect_debug \ No newline at end of file
diff --git a/tvapi/libtv/tvconfig/tvconfig.cpp b/tvapi/libtv/tvconfig/tvconfig.cpp
index 7619157..02b0afa 100644
--- a/tvapi/libtv/tvconfig/tvconfig.cpp
+++ b/tvapi/libtv/tvconfig/tvconfig.cpp
@@ -1,53 +1,53 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include "tvconfig.h"
-
-#define LOG_TAG "TVCONFIG"
-#include "CTvLog.h"
-#include "CIniFile.h"
-static const char *TV_SECTION = "TV";
-//INI_CONFIG* mpConfig = NULL;
-static char mpFilePath[256] = {0};
-
-static CIniFile *pIniFile = NULL;
-int tv_config_load(const char *file_name)
-{
- if(pIniFile != NULL)
- delete pIniFile;
-
- pIniFile = new CIniFile();
- pIniFile->LoadFromFile(file_name);
- strcpy(mpFilePath, file_name);
- return 0;
-}
-
-int tv_config_unload()
-{
- if(pIniFile != NULL)
- delete pIniFile;
- return 0;
-}
-
-
-int config_set_str(const char *section, const char *key, const char *value)
-{
- return pIniFile->SetString(section, key, value);
-}
-
-const char *config_get_str(const char *section, const char *key, const char *def_value)
-{
- return pIniFile->GetString(section, key, def_value);
-}
-
-int config_get_int(const char *section, const char *key, const int def_value)
-{
- return pIniFile->GetInt(section, key, def_value);
-}
-
-int config_set_int(const char *section, const char *key, const int value)
-{
- pIniFile->SetInt(section, key, value);
- return 0;
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include "tvconfig.h"
+
+#define LOG_TAG "TVCONFIG"
+#include "CTvLog.h"
+#include "CIniFile.h"
+static const char *TV_SECTION = "TV";
+//INI_CONFIG* mpConfig = NULL;
+static char mpFilePath[256] = {0};
+
+static CIniFile *pIniFile = NULL;
+int tv_config_load(const char *file_name)
+{
+ if (pIniFile != NULL)
+ delete pIniFile;
+
+ pIniFile = new CIniFile();
+ pIniFile->LoadFromFile(file_name);
+ strcpy(mpFilePath, file_name);
+ return 0;
+}
+
+int tv_config_unload()
+{
+ if (pIniFile != NULL)
+ delete pIniFile;
+ return 0;
+}
+
+
+int config_set_str(const char *section, const char *key, const char *value)
+{
+ return pIniFile->SetString(section, key, value);
+}
+
+const char *config_get_str(const char *section, const char *key, const char *def_value)
+{
+ return pIniFile->GetString(section, key, def_value);
+}
+
+int config_get_int(const char *section, const char *key, const int def_value)
+{
+ return pIniFile->GetInt(section, key, def_value);
+}
+
+int config_set_int(const char *section, const char *key, const int value)
+{
+ pIniFile->SetInt(section, key, value);
+ return 0;
+}
diff --git a/tvapi/libtv/tvconfig/tvconfig.h b/tvapi/libtv/tvconfig/tvconfig.h
index dfb0bd4..f2cf316 100644
--- a/tvapi/libtv/tvconfig/tvconfig.h
+++ b/tvapi/libtv/tvconfig/tvconfig.h
@@ -1,20 +1,20 @@
-#ifndef __TVCONFIG_API_H__
-#define __TVCONFIG_API_H__
-
-#define CC_CFG_KEY_STR_MAX_LEN (128)
-#define CC_CFG_VALUE_STR_MAX_LEN (512)
-
-
-extern int tv_config_load(const char *file_name);
-extern int tv_config_unload();
-extern int tv_config_save();
-
-//[TV] section
-
-extern int config_set_str(const char *section, const char *key, const char *value);
-extern const char *config_get_str(const char *section, const char *key, const char *def_value);
-extern int config_get_int(const char *section, const char *key, const int def_value);
-extern int config_set_int(const char *section, const char *key, const int value);
-
-
-#endif //__TVCONFIG_API_H__
+#ifndef __TVCONFIG_API_H__
+#define __TVCONFIG_API_H__
+
+#define CC_CFG_KEY_STR_MAX_LEN (128)
+#define CC_CFG_VALUE_STR_MAX_LEN (512)
+
+
+extern int tv_config_load(const char *file_name);
+extern int tv_config_unload();
+extern int tv_config_save();
+
+//[TV] section
+
+extern int config_set_str(const char *section, const char *key, const char *value);
+extern const char *config_get_str(const char *section, const char *key, const char *def_value);
+extern int config_get_int(const char *section, const char *key, const int def_value);
+extern int config_set_int(const char *section, const char *key, const int value);
+
+
+#endif //__TVCONFIG_API_H__
diff --git a/tvapi/libtv/tvdb/CTvChannel.cpp b/tvapi/libtv/tvdb/CTvChannel.cpp
index c01fea6..c8d8428 100644
--- a/tvapi/libtv/tvdb/CTvChannel.cpp
+++ b/tvapi/libtv/tvdb/CTvChannel.cpp
@@ -1,347 +1,347 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvChannel.cpp
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#include "CTvChannel.h"
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#define LOG_TAG "CTvChannel"
-#endif
-
-void CTvChannel::createFromCursor(CTvDatabase::Cursor &c)
-{
- int col;
- int src, freq, mod, symb, bw, satid, satpolar;
-
- col = c.getColumnIndex("db_id");
- this->id = c.getInt(col);
-
- col = c.getColumnIndex("ts_id");
- this->dvbTSID = c.getInt(col);
-
- col = c.getColumnIndex("src");
- src = c.getInt(col);
-
- col = c.getColumnIndex("freq");
- freq = c.getInt(col);
-
- if(src == MODE_QAM) {
- col = c.getColumnIndex("mod");
- mod = c.getInt(col);
-
- col = c.getColumnIndex("symb");
- symb = c.getInt(col);
-
- frequency = freq;
- modulation = mod;
- symbolRate = symb;
- mode = MODE_QAM;
-
- } else if(src == MODE_OFDM) {
- col = c.getColumnIndex("bw");
- bw = c.getInt(col);
-
- frequency = freq;
- bandwidth = bw;
- mode = MODE_OFDM;
-
- } else if(src == MODE_ATSC) {
- col = c.getColumnIndex("mod");
- mod = c.getInt(col);
-
- frequency = freq;
- modulation = mod;
- mode = MODE_ATSC;
- } else if(src == MODE_ANALOG) {
- col = c.getColumnIndex("std");
- int std = c.getInt(col);
- col = c.getColumnIndex("aud_mode");
- int aud_mode = c.getInt(col);
- col = c.getColumnIndex("flags");
- int afc_flag = c.getInt(col);
-
- frequency = freq;
- audio = aud_mode;
- standard = std;
- afc_data = afc_flag;
- mode = MODE_ANALOG;
- } else if(src == MODE_QPSK) {
- col = c.getColumnIndex("symb");
- symb = c.getInt(col);
-
- col = c.getColumnIndex("db_sat_para_id");
- satid = c.getInt(col);
-
- col = c.getColumnIndex("polar");
- satpolar = c.getInt(col);
-
- frequency = freq;
- symbolRate = symb;
- sat_id = satid;
- sat_polarisation = satpolar;
- mode = MODE_QPSK;
-
- /*new tv_satparams*/
- //showboz
- //TVSatellite sat = TVSatellite.tvSatelliteSelect(sat_id);
- //tv_satparams = sat.getParams();
- } else if(src == MODE_DTMB) {
- col = c.getColumnIndex("bw");
- bw = c.getInt(col);
-
- frequency = freq;
- bandwidth = bw;
- mode = MODE_DTMB;
- }
-
- this->fendID = 0;
-}
-
-
-CTvChannel::CTvChannel()
-{
-
-}
-
-CTvChannel::CTvChannel(int dbID, int mode, int freq, int bw, int mod, int symb, int ofdm, int channelNum)
-{
- //other member not init,just a paras
- if(mode == MODE_QAM) {
- id = dbID;
- frequency = freq;
- modulation = mod;
- symbolRate = symb;
- mode = MODE_QAM;
- } else if(mode == MODE_OFDM) {
- id = dbID;
- frequency = freq;
- bandwidth = bw;
- mode = MODE_OFDM;
- } else if(mode == MODE_ATSC) {
- id = dbID;
- frequency = freq;
- modulation = mod;
- logicalChannelNum = channelNum;
- mod = MODE_ATSC;
- } else if(mode == MODE_ANALOG) {
- id = dbID;
- frequency = freq;
- audio = 0;
- standard = 0;
- afc_data = 0;
- mode = MODE_ANALOG;
- } else if(mode == MODE_DTMB) {
- id = dbID;
- frequency = freq;
- bandwidth = bw;
- mode = MODE_DTMB;
- }
-}
-
-CTvChannel::~CTvChannel()
-{
-
-}
-
-Vector<CTvChannel> CTvChannel::tvChannelList(int sat_id)
-{
- Vector<CTvChannel> v_channel;
- return v_channel;
-}
-
-int CTvChannel::selectByID(int cid, CTvChannel &channel)
-{
- String8 cmd = String8("select * from ts_table where ts_table.db_id = ") + String8::format("%d", cid);
- CTvDatabase::Cursor c;
- CTvDatabase::GetTvDb()->select(cmd, c);
-
- if(c.moveToFirst()) {
- channel.createFromCursor(c);
- } else {
- c.close();
- return -1;
- }
- c.close();
-
- return 0;
-}
-
-int CTvChannel::SelectByFreq(int freq, CTvChannel &channel)
-{
- String8 cmd ;
- CTvDatabase::Cursor c;
- int iOutRet = 0;
-
- do {
- cmd = String8("select * from ts_table where ts_table.freq = ") + String8::format("%d", freq);
- CTvDatabase::GetTvDb()->select(cmd, c);
-
- if(c.moveToFirst()) {
- channel.createFromCursor(c);
- } else {
- iOutRet = -1;
- break;
- }
-
- cmd = String8("delete from ts_table where ts_table.freq = ") + String8::format("%d", freq);
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
- } while(false);
-
- c.close();
- return iOutRet;
-}
-
-int CTvChannel::DeleteBetweenFreq(int beginFreq, int endFreq)
-{
- String8 cmd ;
- CTvDatabase::Cursor c;
- int iOutRet = 0;
- CTvChannel channel;
-
- do {
- cmd = String8("select * from ts_table where ts_table.freq >= ") + String8::format("%d", beginFreq)
- + String8("and ts_table.freq <= ") + String8::format("%d", endFreq);
- CTvDatabase::GetTvDb()->select(cmd, c);
- if (c.moveToFirst()) {
- do {
- channel.createFromCursor(c);
- cmd = String8("delete from ts_table where ts_table.freq = ") + String8::format("%d", channel.frequency);
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
- } while(c.moveToNext());
- } else {
- iOutRet = -1;
- break;
- }
-
- } while(false);
-
- c.close();
- return iOutRet;
-}
-
-int CTvChannel::CleanAllChannelBySrc(int src)
-{
- String8 cmd = String8("delete from ts_table where src = ") + String8::format("%d", src);
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
- return 0;
-}
-
-int CTvChannel::getChannelListBySrc(int src, Vector< sp<CTvChannel> > &v_channel)
-{
- CTvDatabase::Cursor c;
- CTvChannel *channel;
- do {
- String8 cmd = String8("select * from ts_table where src = ") + String8::format("%d", src);
- CTvDatabase::GetTvDb()->select(cmd, c);
- if (c.moveToFirst()) {
- do {
- channel = new CTvChannel();
- channel->createFromCursor(c);
- v_channel.add(channel);
- } while(c.moveToNext());
- } else {
- break;
- }
- } while(false);
-
- return 0;
-}
-int CTvChannel::updateByID(int progID, int std, int freq, int fineFreq)
-{
-
- String8 cmd = String8("update ts_table set std = ") + String8::format("%d", std) +
- String8(", freq = ") + String8::format("%d", freq) +
- String8(", flags = ") + String8::format("%d", fineFreq) +
- String8(" where ts_table.db_id = ") + String8::format("%d", progID);
- LOGD("%s, cmd = %s\n", "TV", cmd.string());
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
- return 0;
-}
-
-
-void CTvChannel::tvChannelDel()
-{
-
-}
-
-void CTvChannel::tvChannelDelBySatID(int id)
-{
-
-}
-
-int CTvChannel::getDVBTSID()
-{
- return dvbTSID;
-}
-
-void CTvChannel::getDVBOrigNetID()
-{
-
-}
-
-void CTvChannel::getFrontendID()
-{
-
-}
-
-void CTvChannel::getTSSourceID()
-{
-
-}
-
-
-void CTvChannel::isDVBCMode()
-{
-
-}
-
-void CTvChannel::setFrequency()
-{
-
-}
-
-void CTvChannel::setSymbolRate()
-{
-
-}
-
-void CTvChannel::setPolarisation()
-{
-
-}
-
-void CTvChannel::setATVAudio()
-{
-
-}
-
-void CTvChannel::setATVVideoFormat()
-{
-
-}
-
-void CTvChannel::setATVAudioFormat()
-{
-
-}
-
-void CTvChannel::setATVFreq()
-{
-
-}
-
-void CTvChannel::setATVAfcData()
-{
-
-}
-
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvChannel.cpp
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#include "CTvChannel.h"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "CTvChannel"
+#endif
+
+void CTvChannel::createFromCursor(CTvDatabase::Cursor &c)
+{
+ int col;
+ int src, freq, mod, symb, bw, satid, satpolar;
+
+ col = c.getColumnIndex("db_id");
+ this->id = c.getInt(col);
+
+ col = c.getColumnIndex("ts_id");
+ this->dvbTSID = c.getInt(col);
+
+ col = c.getColumnIndex("src");
+ src = c.getInt(col);
+
+ col = c.getColumnIndex("freq");
+ freq = c.getInt(col);
+
+ if (src == MODE_QAM) {
+ col = c.getColumnIndex("mod");
+ mod = c.getInt(col);
+
+ col = c.getColumnIndex("symb");
+ symb = c.getInt(col);
+
+ frequency = freq;
+ modulation = mod;
+ symbolRate = symb;
+ mode = MODE_QAM;
+
+ } else if (src == MODE_OFDM) {
+ col = c.getColumnIndex("bw");
+ bw = c.getInt(col);
+
+ frequency = freq;
+ bandwidth = bw;
+ mode = MODE_OFDM;
+
+ } else if (src == MODE_ATSC) {
+ col = c.getColumnIndex("mod");
+ mod = c.getInt(col);
+
+ frequency = freq;
+ modulation = mod;
+ mode = MODE_ATSC;
+ } else if (src == MODE_ANALOG) {
+ col = c.getColumnIndex("std");
+ int std = c.getInt(col);
+ col = c.getColumnIndex("aud_mode");
+ int aud_mode = c.getInt(col);
+ col = c.getColumnIndex("flags");
+ int afc_flag = c.getInt(col);
+
+ frequency = freq;
+ audio = aud_mode;
+ standard = std;
+ afc_data = afc_flag;
+ mode = MODE_ANALOG;
+ } else if (src == MODE_QPSK) {
+ col = c.getColumnIndex("symb");
+ symb = c.getInt(col);
+
+ col = c.getColumnIndex("db_sat_para_id");
+ satid = c.getInt(col);
+
+ col = c.getColumnIndex("polar");
+ satpolar = c.getInt(col);
+
+ frequency = freq;
+ symbolRate = symb;
+ sat_id = satid;
+ sat_polarisation = satpolar;
+ mode = MODE_QPSK;
+
+ /*new tv_satparams*/
+ //showboz
+ //TVSatellite sat = TVSatellite.tvSatelliteSelect(sat_id);
+ //tv_satparams = sat.getParams();
+ } else if (src == MODE_DTMB) {
+ col = c.getColumnIndex("bw");
+ bw = c.getInt(col);
+
+ frequency = freq;
+ bandwidth = bw;
+ mode = MODE_DTMB;
+ }
+
+ this->fendID = 0;
+}
+
+
+CTvChannel::CTvChannel()
+{
+
+}
+
+CTvChannel::CTvChannel(int dbID, int mode, int freq, int bw, int mod, int symb, int ofdm, int channelNum)
+{
+ //other member not init,just a paras
+ if (mode == MODE_QAM) {
+ id = dbID;
+ frequency = freq;
+ modulation = mod;
+ symbolRate = symb;
+ mode = MODE_QAM;
+ } else if (mode == MODE_OFDM) {
+ id = dbID;
+ frequency = freq;
+ bandwidth = bw;
+ mode = MODE_OFDM;
+ } else if (mode == MODE_ATSC) {
+ id = dbID;
+ frequency = freq;
+ modulation = mod;
+ logicalChannelNum = channelNum;
+ mod = MODE_ATSC;
+ } else if (mode == MODE_ANALOG) {
+ id = dbID;
+ frequency = freq;
+ audio = 0;
+ standard = 0;
+ afc_data = 0;
+ mode = MODE_ANALOG;
+ } else if (mode == MODE_DTMB) {
+ id = dbID;
+ frequency = freq;
+ bandwidth = bw;
+ mode = MODE_DTMB;
+ }
+}
+
+CTvChannel::~CTvChannel()
+{
+
+}
+
+Vector<CTvChannel> CTvChannel::tvChannelList(int sat_id)
+{
+ Vector<CTvChannel> v_channel;
+ return v_channel;
+}
+
+int CTvChannel::selectByID(int cid, CTvChannel &channel)
+{
+ String8 cmd = String8("select * from ts_table where ts_table.db_id = ") + String8::format("%d", cid);
+ CTvDatabase::Cursor c;
+ CTvDatabase::GetTvDb()->select(cmd, c);
+
+ if (c.moveToFirst()) {
+ channel.createFromCursor(c);
+ } else {
+ c.close();
+ return -1;
+ }
+ c.close();
+
+ return 0;
+}
+
+int CTvChannel::SelectByFreq(int freq, CTvChannel &channel)
+{
+ String8 cmd ;
+ CTvDatabase::Cursor c;
+ int iOutRet = 0;
+
+ do {
+ cmd = String8("select * from ts_table where ts_table.freq = ") + String8::format("%d", freq);
+ CTvDatabase::GetTvDb()->select(cmd, c);
+
+ if (c.moveToFirst()) {
+ channel.createFromCursor(c);
+ } else {
+ iOutRet = -1;
+ break;
+ }
+
+ cmd = String8("delete from ts_table where ts_table.freq = ") + String8::format("%d", freq);
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+ } while (false);
+
+ c.close();
+ return iOutRet;
+}
+
+int CTvChannel::DeleteBetweenFreq(int beginFreq, int endFreq)
+{
+ String8 cmd ;
+ CTvDatabase::Cursor c;
+ int iOutRet = 0;
+ CTvChannel channel;
+
+ do {
+ cmd = String8("select * from ts_table where ts_table.freq >= ") + String8::format("%d", beginFreq)
+ + String8("and ts_table.freq <= ") + String8::format("%d", endFreq);
+ CTvDatabase::GetTvDb()->select(cmd, c);
+ if (c.moveToFirst()) {
+ do {
+ channel.createFromCursor(c);
+ cmd = String8("delete from ts_table where ts_table.freq = ") + String8::format("%d", channel.frequency);
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+ } while (c.moveToNext());
+ } else {
+ iOutRet = -1;
+ break;
+ }
+
+ } while (false);
+
+ c.close();
+ return iOutRet;
+}
+
+int CTvChannel::CleanAllChannelBySrc(int src)
+{
+ String8 cmd = String8("delete from ts_table where src = ") + String8::format("%d", src);
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+ return 0;
+}
+
+int CTvChannel::getChannelListBySrc(int src, Vector< sp<CTvChannel> > &v_channel)
+{
+ CTvDatabase::Cursor c;
+ CTvChannel *channel;
+ do {
+ String8 cmd = String8("select * from ts_table where src = ") + String8::format("%d", src);
+ CTvDatabase::GetTvDb()->select(cmd, c);
+ if (c.moveToFirst()) {
+ do {
+ channel = new CTvChannel();
+ channel->createFromCursor(c);
+ v_channel.add(channel);
+ } while (c.moveToNext());
+ } else {
+ break;
+ }
+ } while (false);
+
+ return 0;
+}
+int CTvChannel::updateByID(int progID, int std, int freq, int fineFreq)
+{
+
+ String8 cmd = String8("update ts_table set std = ") + String8::format("%d", std) +
+ String8(", freq = ") + String8::format("%d", freq) +
+ String8(", flags = ") + String8::format("%d", fineFreq) +
+ String8(" where ts_table.db_id = ") + String8::format("%d", progID);
+ LOGD("%s, cmd = %s\n", "TV", cmd.string());
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+ return 0;
+}
+
+
+void CTvChannel::tvChannelDel()
+{
+
+}
+
+void CTvChannel::tvChannelDelBySatID(int id)
+{
+
+}
+
+int CTvChannel::getDVBTSID()
+{
+ return dvbTSID;
+}
+
+void CTvChannel::getDVBOrigNetID()
+{
+
+}
+
+void CTvChannel::getFrontendID()
+{
+
+}
+
+void CTvChannel::getTSSourceID()
+{
+
+}
+
+
+void CTvChannel::isDVBCMode()
+{
+
+}
+
+void CTvChannel::setFrequency()
+{
+
+}
+
+void CTvChannel::setSymbolRate()
+{
+
+}
+
+void CTvChannel::setPolarisation()
+{
+
+}
+
+void CTvChannel::setATVAudio()
+{
+
+}
+
+void CTvChannel::setATVVideoFormat()
+{
+
+}
+
+void CTvChannel::setATVAudioFormat()
+{
+
+}
+
+void CTvChannel::setATVFreq()
+{
+
+}
+
+void CTvChannel::setATVAfcData()
+{
+
+}
+
diff --git a/tvapi/libtv/tvdb/CTvChannel.h b/tvapi/libtv/tvdb/CTvChannel.h
index 2f5e005..b1a4686 100644
--- a/tvapi/libtv/tvdb/CTvChannel.h
+++ b/tvapi/libtv/tvdb/CTvChannel.h
@@ -1,287 +1,287 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvChannel.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#if !defined(_CTVCHANNEL_H)
-#define _CTVCHANNEL_H
-#include <utils/Vector.h>
-#include "CTvDatabase.h"
-#include <utils/String8.h>
-#include <utils/RefBase.h>
-#include <stdlib.h>
-
-#include "CTvLog.h"
-using namespace android;
-// ¶ÔӦģÄâµçÊÓÖеÄÒ»¸öƵµã£¬Êý×ÖµçÊÓÖеÄÒ»¸öƵµãµ÷ÖƵÄTSÁ÷
-class CTvChannel: public LightRefBase<CTvChannel> {
-
-public :
- static const int FE_HAS_SIGNAL = 0x01;
- static const int FE_HAS_CARRIER = 0x02;
- static const int FE_HAS_VITERBI = 0x04;
- static const int FE_HAS_SYNC = 0x08;
- /**Ëø¶¨*/
- static const int FE_HAS_LOCK = 0x10;
- /**³¬Ê±*/
- static const int FE_TIMEDOUT = 0x20;
- static const int FE_REINIT = 0x40;
-
- /**QPSKģʽ*/
- static const int MODE_QPSK = 0;
- /**QAMģʽ*/
- static const int MODE_QAM = 1;
- /**OFDMģʽ*/
- static const int MODE_OFDM = 2;
- /**ATSCģʽ*/
- static const int MODE_ATSC = 3;
- /**Ä£Äâģʽ*/
- static const int MODE_ANALOG = 4;
- /**DTMBģʽ*/
- static const int MODE_DTMB = 5;
-
-
- /**8MHz´ø¿í*/
- static const int BANDWIDTH_8_MHZ = 0;
- /**7MHz´ø¿í*/
- static const int BANDWIDTH_7_MHZ = 1;
- /**6MHz´ø¿í*/
- static const int BANDWIDTH_6_MHZ = 2;
- /**×Ô¶¯´ø¿í¼ì²â*/
- static const int BANDWIDTH_AUTO = 3;
- /**5MHZ´ø¿í*/
- static const int BANDWIDTH_5_MHZ = 4;
- /**10MHZ´ø¿í*/
- static const int BANDWIDTH_10_MHZ = 5;
-
- /**QPSKµ÷ÖÆ*/
- static const int MODULATION_QPSK = 0;
- /**QAM16µ÷ÖÆ*/
- static const int MODULATION_QAM_16 = 1;
- /**QAM32µ÷ÖÆ*/
- static const int MODULATION_QAM_32 = 2;
- /**QAM64µ÷ÖÆ*/
- static const int MODULATION_QAM_64 = 3;
- /**QAM128µ÷ÖÆ*/
- static const int MODULATION_QAM_128 = 4;
- /**QAM256µ÷ÖÆ*/
- static const int MODULATION_QAM_256 = 5;
- /**QAMµ÷ÖÆ(×Ô¶¯¼ì²â)*/
- static const int MODULATION_QAM_AUTO = 6;
- /**VSB8µ÷ÖÆ*/
- static const int MODULATION_VSB_8 = 7;
- /**VSB16µ÷ÖÆ*/
- static const int MODULATION_VSB_16 = 8;
- /**PSK8µ÷ÖÆ*/
- static const int MODULATION_PSK_8 = 9;
- /**APSK16µ÷ÖÆ*/
- static const int MODULATION_APSK_16 = 10;
- /**APSK32µ÷ÖÆ*/
- static const int MODULATION_APSK_32 = 11;
- /**DQPSKµ÷ÖÆ*/
- static const int MODULATION_DQPSK = 12;
-
- /**µ¥ÉùµÀ*/
- static const int AUDIO_MONO = 0x0000;
- /**Á¢ÌåÉù*/
- static const int AUDIO_STEREO = 0x0001;
- /**ÓïÑÔ2*/
- static const int AUDIO_LANG2 = 0x0002;
- /**SAP*/
- static const int AUDIO_SAP = 0x0002;
- /**ÓïÑÔ1*/
- static const int AUDIO_LANG1 = 0x0003;
- /**ÓïÑÔ1/2*/
- static const int AUDIO_LANG1_LANG2 = 0x0004;
-
- /**PAL B*/
- static const int STD_PAL_B = 0x00000001;
- /**PAL B1*/
- static const int STD_PAL_B1 = 0x00000002;
- /**PAL G*/
- static const int STD_PAL_G = 0x00000004;
- /**PAL H*/
- static const int STD_PAL_H = 0x00000008;
- /**PAL I*/
- static const int STD_PAL_I = 0x00000010;
- /**PAL D*/
- static const int STD_PAL_D = 0x00000020;
- /**PAL D1*/
- static const int STD_PAL_D1 = 0x00000040;
- /**PAL K*/
- static const int STD_PAL_K = 0x00000080;
- /**PAL M*/
- static const int STD_PAL_M = 0x00000100;
- /**PAL N*/
- static const int STD_PAL_N = 0x00000200;
- /**PAL Nc*/
- static const int STD_PAL_Nc = 0x00000400;
- /**PAL 60*/
- static const int STD_PAL_60 = 0x00000800;
- /**NTSC M*/
- static const int STD_NTSC_M = 0x00001000;
- /**NTSC M JP*/
- static const int STD_NTSC_M_JP = 0x00002000;
- /**NTSC 443*/
- static const int STD_NTSC_443 = 0x00004000;
- /**NTSC M KR*/
- static const int STD_NTSC_M_KR = 0x00008000;
- /**SECAM B*/
- static const int STD_SECAM_B = 0x00010000;
- /**SECAM D*/
- static const int STD_SECAM_D = 0x00020000;
- /**SECAM G*/
- static const int STD_SECAM_G = 0x00040000;
- /**SECAM H*/
- static const int STD_SECAM_H = 0x00080000;
- /**SECAM K*/
- static const int STD_SECAM_K = 0x00100000;
- /**SECAM K1*/
- static const int STD_SECAM_K1 = 0x00200000;
- /**SECAM L*/
- static const int STD_SECAM_L = 0x00400000;
- /**SECAM LC*/
- static const int STD_SECAM_LC = 0x00800000;
- /**ATSC VSB8*/
- static const int STD_ATSC_8_VSB = 0x01000000;
- /**ATSC VSB16*/
- static const int STD_ATSC_16_VSB = 0x02000000;
- /**NTSC*/
- static const int STD_NTSC = STD_NTSC_M | STD_NTSC_M_JP | STD_NTSC_M_KR;
- /**SECAM DK*/
- static const int STD_SECAM_DK = STD_SECAM_D | STD_SECAM_K | STD_SECAM_K1;
- /**SECAM*/
- static const int STD_SECAM = STD_SECAM_B | STD_SECAM_G | STD_SECAM_H | STD_SECAM_DK | STD_SECAM_L | STD_SECAM_LC;
- /**PAL BG*/
- static const int STD_PAL_BG = STD_PAL_B | STD_PAL_B1 | STD_PAL_G;
- /**PAL DK*/
- static const int STD_PAL_DK = STD_PAL_D | STD_PAL_D1 | STD_PAL_K;
- /**PAL*/
- static const int STD_PAL = STD_PAL_BG | STD_PAL_DK | STD_PAL_H | STD_PAL_I;
-
- //static const int TUNER_STD_MN = STD_PAL_M|STD_PAL_N|STD_PAL_Nc| STD_NTSC
- static const int STD_B = STD_PAL_B | STD_PAL_B1 | STD_SECAM_B;
- static const int STD_GH = STD_PAL_G | STD_PAL_H | STD_SECAM_G | STD_SECAM_H;
- static const int STD_DK = STD_PAL_DK | STD_SECAM_DK;
- static const int STD_M = STD_PAL_M | STD_NTSC_M;
- static const int STD_BG = STD_PAL_BG | STD_SECAM_B | STD_SECAM_G ;
-
- static const int COLOR_AUTO = 0x02000000;
- static const int COLOR_PAL = 0x04000000;
- static const int COLOR_NTSC = 0x08000000;
- static const int COLOR_SECAM = 0x10000000;
-
- /**ˮƽ¼«ÐÔ*/
- static const int SAT_POLARISATION_H = 0;
- /**´¹Ö±¼«ÏÞ*/
- static const int SAT_POLARISATION_V = 1;
-
-public:
- CTvChannel();
- CTvChannel(int dbID, int mode, int freq, int bw, int mod, int sym, int ofdm, int channelNum);
- ~CTvChannel();
- // ¸ù¾ÝTVChannelParams,ÏòÊý¾Ý¿âÌí¼ÓÒ»¸öChannel
-
- // *´´½¨µ±Ç°ÎÀÐÇËùÓÐͨµÀ
- // *@param sat_id ÎÀÐÇid
- // *@return ·µ»Ø´´½¨µÄͨµÀ
- static Vector<CTvChannel> tvChannelList(int sat_id);
- static int selectByID(int id, CTvChannel &c);
- static int updateByID(int progID, int std, int freq, int fineFreq);
- static int SelectByFreq(int freq, CTvChannel &channel);
- static int DeleteBetweenFreq(int beginFreq, int endFreq);
- static int CleanAllChannelBySrc(int src);
- static int getChannelListBySrc(int src, Vector< sp<CTvChannel> > &v_channel);
- void tvChannelDel();
- static void tvChannelDelBySatID(int id);
- int getID()
- {
- return id;
- };
- int getDVBTSID();
- void getDVBOrigNetID();
- void getFrontendID();
- void getTSSourceID();
- void isDVBCMode();
- void setFrequency();
- int getFrequency()
- {
- return frequency;
- }
- int getSymbolRate()
- {
- return symbolRate;
- }
- int getModulation()
- {
- return modulation;
- }
- int getBandwidth()
- {
- return bandwidth;
- }
- int getMode()
- {
- return mode;
- }
-
- int getStd()
- {
- return standard;
- };
- int getAfcData()
- {
- return afc_data;
- };
- int getLogicalChannelNum()
- {
- return logicalChannelNum;
- };
- // ÉèÖ÷ûºÅÂÊ(QPSK/QAMģʽ)
- // @param symbolRate ·ûºÅÂÊ
- void setSymbolRate();
- // ÉèÖü«ÐÔ(QPSKģʽ)
- void setPolarisation();
- void setATVAudio();
- // ÐÞ¸ÄÄ£ÄâÊÓƵÖÆʽ
- void setATVVideoFormat();
- void setATVAudioFormat();
- void setATVFreq();
- void setATVAfcData();
- //
-private:
-
- void createFromCursor(CTvDatabase::Cursor &c);
-
- //
- int id;
- int dvbTSID;
- int dvbOrigNetID;
- int fendID;
- int tsSourceID;
-
- int mode;
- int frequency;
- int symbolRate;
- int modulation;
- int bandwidth;
- int audio;
- int standard;
- int afc_data;
- int sat_id;
- int logicalChannelNum;
- //showboz
- //public TVSatelliteParams tv_satparams;
- int sat_polarisation;
-
-};
-
-#endif //_CTVCHANNEL_H
-
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvChannel.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#if !defined(_CTVCHANNEL_H)
+#define _CTVCHANNEL_H
+#include <utils/Vector.h>
+#include "CTvDatabase.h"
+#include <utils/String8.h>
+#include <utils/RefBase.h>
+#include <stdlib.h>
+
+#include "CTvLog.h"
+using namespace android;
+// ¶ÔӦģÄâµçÊÓÖеÄÒ»¸öƵµã£¬Êý×ÖµçÊÓÖеÄÒ»¸öƵµãµ÷ÖƵÄTSÁ÷
+class CTvChannel: public LightRefBase<CTvChannel> {
+
+public :
+ static const int FE_HAS_SIGNAL = 0x01;
+ static const int FE_HAS_CARRIER = 0x02;
+ static const int FE_HAS_VITERBI = 0x04;
+ static const int FE_HAS_SYNC = 0x08;
+ /**Ëø¶¨*/
+ static const int FE_HAS_LOCK = 0x10;
+ /**³¬Ê±*/
+ static const int FE_TIMEDOUT = 0x20;
+ static const int FE_REINIT = 0x40;
+
+ /**QPSKģʽ*/
+ static const int MODE_QPSK = 0;
+ /**QAMģʽ*/
+ static const int MODE_QAM = 1;
+ /**OFDMģʽ*/
+ static const int MODE_OFDM = 2;
+ /**ATSCģʽ*/
+ static const int MODE_ATSC = 3;
+ /**Ä£Äâģʽ*/
+ static const int MODE_ANALOG = 4;
+ /**DTMBģʽ*/
+ static const int MODE_DTMB = 5;
+
+
+ /**8MHz´ø¿í*/
+ static const int BANDWIDTH_8_MHZ = 0;
+ /**7MHz´ø¿í*/
+ static const int BANDWIDTH_7_MHZ = 1;
+ /**6MHz´ø¿í*/
+ static const int BANDWIDTH_6_MHZ = 2;
+ /**×Ô¶¯´ø¿í¼ì²â*/
+ static const int BANDWIDTH_AUTO = 3;
+ /**5MHZ´ø¿í*/
+ static const int BANDWIDTH_5_MHZ = 4;
+ /**10MHZ´ø¿í*/
+ static const int BANDWIDTH_10_MHZ = 5;
+
+ /**QPSKµ÷ÖÆ*/
+ static const int MODULATION_QPSK = 0;
+ /**QAM16µ÷ÖÆ*/
+ static const int MODULATION_QAM_16 = 1;
+ /**QAM32µ÷ÖÆ*/
+ static const int MODULATION_QAM_32 = 2;
+ /**QAM64µ÷ÖÆ*/
+ static const int MODULATION_QAM_64 = 3;
+ /**QAM128µ÷ÖÆ*/
+ static const int MODULATION_QAM_128 = 4;
+ /**QAM256µ÷ÖÆ*/
+ static const int MODULATION_QAM_256 = 5;
+ /**QAMµ÷ÖÆ(×Ô¶¯¼ì²â)*/
+ static const int MODULATION_QAM_AUTO = 6;
+ /**VSB8µ÷ÖÆ*/
+ static const int MODULATION_VSB_8 = 7;
+ /**VSB16µ÷ÖÆ*/
+ static const int MODULATION_VSB_16 = 8;
+ /**PSK8µ÷ÖÆ*/
+ static const int MODULATION_PSK_8 = 9;
+ /**APSK16µ÷ÖÆ*/
+ static const int MODULATION_APSK_16 = 10;
+ /**APSK32µ÷ÖÆ*/
+ static const int MODULATION_APSK_32 = 11;
+ /**DQPSKµ÷ÖÆ*/
+ static const int MODULATION_DQPSK = 12;
+
+ /**µ¥ÉùµÀ*/
+ static const int AUDIO_MONO = 0x0000;
+ /**Á¢ÌåÉù*/
+ static const int AUDIO_STEREO = 0x0001;
+ /**ÓïÑÔ2*/
+ static const int AUDIO_LANG2 = 0x0002;
+ /**SAP*/
+ static const int AUDIO_SAP = 0x0002;
+ /**ÓïÑÔ1*/
+ static const int AUDIO_LANG1 = 0x0003;
+ /**ÓïÑÔ1/2*/
+ static const int AUDIO_LANG1_LANG2 = 0x0004;
+
+ /**PAL B*/
+ static const int STD_PAL_B = 0x00000001;
+ /**PAL B1*/
+ static const int STD_PAL_B1 = 0x00000002;
+ /**PAL G*/
+ static const int STD_PAL_G = 0x00000004;
+ /**PAL H*/
+ static const int STD_PAL_H = 0x00000008;
+ /**PAL I*/
+ static const int STD_PAL_I = 0x00000010;
+ /**PAL D*/
+ static const int STD_PAL_D = 0x00000020;
+ /**PAL D1*/
+ static const int STD_PAL_D1 = 0x00000040;
+ /**PAL K*/
+ static const int STD_PAL_K = 0x00000080;
+ /**PAL M*/
+ static const int STD_PAL_M = 0x00000100;
+ /**PAL N*/
+ static const int STD_PAL_N = 0x00000200;
+ /**PAL Nc*/
+ static const int STD_PAL_Nc = 0x00000400;
+ /**PAL 60*/
+ static const int STD_PAL_60 = 0x00000800;
+ /**NTSC M*/
+ static const int STD_NTSC_M = 0x00001000;
+ /**NTSC M JP*/
+ static const int STD_NTSC_M_JP = 0x00002000;
+ /**NTSC 443*/
+ static const int STD_NTSC_443 = 0x00004000;
+ /**NTSC M KR*/
+ static const int STD_NTSC_M_KR = 0x00008000;
+ /**SECAM B*/
+ static const int STD_SECAM_B = 0x00010000;
+ /**SECAM D*/
+ static const int STD_SECAM_D = 0x00020000;
+ /**SECAM G*/
+ static const int STD_SECAM_G = 0x00040000;
+ /**SECAM H*/
+ static const int STD_SECAM_H = 0x00080000;
+ /**SECAM K*/
+ static const int STD_SECAM_K = 0x00100000;
+ /**SECAM K1*/
+ static const int STD_SECAM_K1 = 0x00200000;
+ /**SECAM L*/
+ static const int STD_SECAM_L = 0x00400000;
+ /**SECAM LC*/
+ static const int STD_SECAM_LC = 0x00800000;
+ /**ATSC VSB8*/
+ static const int STD_ATSC_8_VSB = 0x01000000;
+ /**ATSC VSB16*/
+ static const int STD_ATSC_16_VSB = 0x02000000;
+ /**NTSC*/
+ static const int STD_NTSC = STD_NTSC_M | STD_NTSC_M_JP | STD_NTSC_M_KR;
+ /**SECAM DK*/
+ static const int STD_SECAM_DK = STD_SECAM_D | STD_SECAM_K | STD_SECAM_K1;
+ /**SECAM*/
+ static const int STD_SECAM = STD_SECAM_B | STD_SECAM_G | STD_SECAM_H | STD_SECAM_DK | STD_SECAM_L | STD_SECAM_LC;
+ /**PAL BG*/
+ static const int STD_PAL_BG = STD_PAL_B | STD_PAL_B1 | STD_PAL_G;
+ /**PAL DK*/
+ static const int STD_PAL_DK = STD_PAL_D | STD_PAL_D1 | STD_PAL_K;
+ /**PAL*/
+ static const int STD_PAL = STD_PAL_BG | STD_PAL_DK | STD_PAL_H | STD_PAL_I;
+
+ //static const int TUNER_STD_MN = STD_PAL_M|STD_PAL_N|STD_PAL_Nc| STD_NTSC
+ static const int STD_B = STD_PAL_B | STD_PAL_B1 | STD_SECAM_B;
+ static const int STD_GH = STD_PAL_G | STD_PAL_H | STD_SECAM_G | STD_SECAM_H;
+ static const int STD_DK = STD_PAL_DK | STD_SECAM_DK;
+ static const int STD_M = STD_PAL_M | STD_NTSC_M;
+ static const int STD_BG = STD_PAL_BG | STD_SECAM_B | STD_SECAM_G ;
+
+ static const int COLOR_AUTO = 0x02000000;
+ static const int COLOR_PAL = 0x04000000;
+ static const int COLOR_NTSC = 0x08000000;
+ static const int COLOR_SECAM = 0x10000000;
+
+ /**ˮƽ¼«ÐÔ*/
+ static const int SAT_POLARISATION_H = 0;
+ /**´¹Ö±¼«ÏÞ*/
+ static const int SAT_POLARISATION_V = 1;
+
+public:
+ CTvChannel();
+ CTvChannel(int dbID, int mode, int freq, int bw, int mod, int sym, int ofdm, int channelNum);
+ ~CTvChannel();
+ // ¸ù¾ÝTVChannelParams,ÏòÊý¾Ý¿âÌí¼ÓÒ»¸öChannel
+
+ // *´´½¨µ±Ç°ÎÀÐÇËùÓÐͨµÀ
+ // *@param sat_id ÎÀÐÇid
+ // *@return ·µ»Ø´´½¨µÄͨµÀ
+ static Vector<CTvChannel> tvChannelList(int sat_id);
+ static int selectByID(int id, CTvChannel &c);
+ static int updateByID(int progID, int std, int freq, int fineFreq);
+ static int SelectByFreq(int freq, CTvChannel &channel);
+ static int DeleteBetweenFreq(int beginFreq, int endFreq);
+ static int CleanAllChannelBySrc(int src);
+ static int getChannelListBySrc(int src, Vector< sp<CTvChannel> > &v_channel);
+ void tvChannelDel();
+ static void tvChannelDelBySatID(int id);
+ int getID()
+ {
+ return id;
+ };
+ int getDVBTSID();
+ void getDVBOrigNetID();
+ void getFrontendID();
+ void getTSSourceID();
+ void isDVBCMode();
+ void setFrequency();
+ int getFrequency()
+ {
+ return frequency;
+ }
+ int getSymbolRate()
+ {
+ return symbolRate;
+ }
+ int getModulation()
+ {
+ return modulation;
+ }
+ int getBandwidth()
+ {
+ return bandwidth;
+ }
+ int getMode()
+ {
+ return mode;
+ }
+
+ int getStd()
+ {
+ return standard;
+ };
+ int getAfcData()
+ {
+ return afc_data;
+ };
+ int getLogicalChannelNum()
+ {
+ return logicalChannelNum;
+ };
+ // ÉèÖ÷ûºÅÂÊ(QPSK/QAMģʽ)
+ // @param symbolRate ·ûºÅÂÊ
+ void setSymbolRate();
+ // ÉèÖü«ÐÔ(QPSKģʽ)
+ void setPolarisation();
+ void setATVAudio();
+ // ÐÞ¸ÄÄ£ÄâÊÓƵÖÆʽ
+ void setATVVideoFormat();
+ void setATVAudioFormat();
+ void setATVFreq();
+ void setATVAfcData();
+ //
+private:
+
+ void createFromCursor(CTvDatabase::Cursor &c);
+
+ //
+ int id;
+ int dvbTSID;
+ int dvbOrigNetID;
+ int fendID;
+ int tsSourceID;
+
+ int mode;
+ int frequency;
+ int symbolRate;
+ int modulation;
+ int bandwidth;
+ int audio;
+ int standard;
+ int afc_data;
+ int sat_id;
+ int logicalChannelNum;
+ //showboz
+ //public TVSatelliteParams tv_satparams;
+ int sat_polarisation;
+
+};
+
+#endif //_CTVCHANNEL_H
+
diff --git a/tvapi/libtv/tvdb/CTvDatabase.cpp b/tvapi/libtv/tvdb/CTvDatabase.cpp
index 02aa833..1a19976 100644
--- a/tvapi/libtv/tvdb/CTvDatabase.cpp
+++ b/tvapi/libtv/tvdb/CTvDatabase.cpp
@@ -61,27 +61,28 @@ int CTvDatabase::isFreqListExist()
int CTvDatabase::UnInitTvDb()
{
AM_DB_UnSetup();
+ closeDb();
return 0;
}
int CTvDatabase::InitTvDb(const char *path)
{
- if(path != NULL) {
- if(Tv_Utils_IsFileExist(path) == 0 && config_get_int("TV", "tv_db_created", 0) == 1) { //exist or created
+ if (path != NULL) {
+ if (Tv_Utils_IsFileExist(path) == 0 && config_get_int("TV", "tv_db_created", 0) == 1) { //exist or created
LOGD("tv db file(%s) exist and created, open it", path);
- if(openDb(path) < 0 ) {
+ if (openDb(path) < 0 ) {
LOGD("db(%s) open fail", path);
return -1;
}
//setup and path set
AM_DB_Setup((char *)path, getHandle());
- if(isFreqListExist() == false) {
+ if (isFreqListExist() == false) {
importXmlToDB("/etc/tv_default.xml");
LOGD("scan region table is NULL, so import freq XML again\n");
}
} else {
- if(Tv_Utils_IsFileExist(path) == 0) { // if just exist, create flag not set, delete it
+ if (Tv_Utils_IsFileExist(path) == 0) { // if just exist, create flag not set, delete it
LOGD("tv db file (%s) exist, but delete it", path);
- if(unlink(path) != 0) {
+ if (unlink(path) != 0) {
LOGD("delete tv db file(%s) err=%s", path, strerror(errno));
}
}
@@ -131,7 +132,7 @@ int CTvDatabase::getChannelParaList(char *path, Vector<sp<ChannelPara> > &vcp)
TiXmlElement *RootElement = myDocument.RootElement();
//dvbc
TiXmlElement *channel_list_element = RootElement->FirstChildElement("channel_list");
- for(TiXmlElement *channel_entry = channel_list_element->FirstChildElement("channel_entry") ; channel_entry != NULL; channel_entry = channel_entry->NextSiblingElement("channel_entry")) {
+ for (TiXmlElement *channel_entry = channel_list_element->FirstChildElement("channel_entry") ; channel_entry != NULL; channel_entry = channel_entry->NextSiblingElement("channel_entry")) {
sp<ChannelPara> pCp = new ChannelPara();
channel_entry->Attribute("frequency", &(pCp->freq));
channel_entry->Attribute("modulation", &(pCp->modulation));
@@ -186,13 +187,13 @@ int CTvDatabase::importXmlToDB(const char *xmlPath)
TiXmlElement *RootElement = myDocument.RootElement();
beginTransaction();//-----------------------------------------------
//list-->entry
- for(TiXmlElement *channel_list_element = RootElement->FirstChildElement("channel_list"); channel_list_element != NULL; channel_list_element = channel_list_element->NextSiblingElement("channel_list")) {
+ for (TiXmlElement *channel_list_element = RootElement->FirstChildElement("channel_list"); channel_list_element != NULL; channel_list_element = channel_list_element->NextSiblingElement("channel_list")) {
//LOGD("showboz-----channel_list =%d", channel_list_element);
const char *channel_name = channel_list_element->Attribute("name");
const char *channel_fe_type = channel_list_element->Attribute("fe_type");
//LOGD("showboz-----channel_list name = %s type=%s", channel_name, channel_fe_type);
- for(TiXmlElement *channel_entry = channel_list_element->FirstChildElement("channel_entry") ; channel_entry != NULL; channel_entry = channel_entry->NextSiblingElement("channel_entry")) {
+ for (TiXmlElement *channel_entry = channel_list_element->FirstChildElement("channel_entry") ; channel_entry != NULL; channel_entry = channel_entry->NextSiblingElement("channel_entry")) {
int freq, symb, channelNum;
String8 cmd = String8("insert into region_table(name,fe_type,frequency,symbol_rate,modulation,bandwidth,ofdm_mode,logical_channel_num)");
cmd += String8("values('") + channel_name + String8("',") + String8::format("%d", StringToIndex(feTypes, channel_fe_type)) + String8(",");
@@ -234,7 +235,7 @@ int CTvDatabase::insert256AtvProgForSkyworth()
insert_srv += String8::format("'%d'", i);
insert_srv += String8(" , '4', '-1', ");
insert_srv += String8::format("'%d'", i);
- insert_srv += String8(", 'xxxATV Program', '-1', '3', '-1', '-1', '-1', '-1', '50', '1', '-1', '-1', '-1', '0', '-1', '-1', '-1', 'Audio1', '0', '-1', ' ', ' ', ' ', ' ', ' ', '-1', ' ', ' ', ' ', ' ', ' ', '-1', '1', '0', '0', '-1', '-1', '-1', '1', ");
+ insert_srv += String8(", 'xxxATV Program', '-1', '3', '-1', '-1', '-1', '-1', '50', '1', '-1', '-1', '-1', '0', '-1', '-1', '-1', 'Audio1', '0', '-1', ' ', ' ', ' ', ' ', ' ', '-1', ' ', ' ', ' ', ' ', ' ', '-1', '1', '0', '0', '-1', '-1', '-1', '-1', ");
insert_srv += String8::format("'%d'", i);
insert_srv += String8(" , '0', '0', '0', '-1', '255', '0', '0', '0', '0', '0', '0', '255') ");
exeSql(insert_srv.string());
@@ -245,14 +246,14 @@ int CTvDatabase::insert256AtvProgForSkyworth()
void CTvDatabase::deleteTvDb()
{
- if(mpDb != NULL) {
+ if (mpDb != NULL) {
delete mpDb;
mpDb = NULL;
}
}
CTvDatabase *CTvDatabase::GetTvDb()
{
- if(mpDb == NULL) {
+ if (mpDb == NULL) {
mpDb = new CTvDatabase();
}
return mpDb;
diff --git a/tvapi/libtv/tvdb/CTvDatabase.h b/tvapi/libtv/tvdb/CTvDatabase.h
index 69f528d..be29f2a 100644
--- a/tvapi/libtv/tvdb/CTvDatabase.h
+++ b/tvapi/libtv/tvdb/CTvDatabase.h
@@ -1,94 +1,94 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvDatabase.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-#include <am_db.h>
-#if !defined(_CTVDATABASE_H)
-#define _CTVDATABASE_H
-// ʹÓÃAM_DB
-#include <unistd.h>
-#include <stdlib.h>
-#include <utils/String8.h>
-#include <utils/Log.h>
-#include <utils/Vector.h>
-#include <utils/RefBase.h>
-#include <tvutils/CSqlite.h>
-
-#include "CTvLog.h"
-
-
-using namespace android;
-//¸ù¾ÝÏÖÔÚÇé¿öÐèÇó,´ËÀàÖ»Õë¶ÔµçÊÓ¹¦Äܰ󶨵ĵ¥ÎļþÊý¾Ý¿â,ÓëAM_DBÓйØÁªÐÔ
-//ÎÞ½âµÄ¹ØÁª
-class CTvDatabase: public CSqlite {
-public:
- static const char *DEFAULT_DB_PATH;
- static const int DB_VERSION = 8;
- static const char *DB_VERSION_FIELD;
-
- static const char feTypes[][32];
- static const char srvTypes[][32];
- static const char vidFmts[][32];
- static const char audFmts[][32];
- static const char mods[][32];
- static const char bandwidths[][32];
- static const char lnbPowers[][32];
- static const char sig22K[][32];
- static const char tonebursts[][32];
- static const char diseqc10s[][32];
- static const char diseqc11s[][32];
- static const char motors[][32];
- static const char ofdmModes[][32];
- static const char atvVideoStds[][32];
- static const char atvAudioStds[][32];
- template<typename T>
- int StringToIndex(const T &t, const char *item)
- {
- if(item == NULL) return -1;
- int size = sizeof(t) / sizeof(t[0]);
- for(int i = 0; i < size; i++) {
- if(strcmp(t[i], item) == 0) return i;
- }
- return -1;
- }
-public:
- CTvDatabase();
- //Ö±½ÓÖ¸¶¨Êý¾Ý¿âÁ¬½Ó¾ä±ú
- //CTvDatabase(char* path, sqlite3 * h);
- static CTvDatabase *GetTvDb();
- static void deleteTvDb();
- ~CTvDatabase();
- //ÓÃÖ¸¶¨Â·¾¶´´½¨TVÊý¾Ý¿â.
- int UnInitTvDb();
- int InitTvDb(const char *path);
- //showboz test
- class ChannelPara : public LightRefBase<ChannelPara> {
- public:
- int mode;
- int freq;
- int symbol_rate;
- int modulation;
- int bandwidth;
- int polar;
- };
-
- static int getChannelParaList(char *path, Vector<sp<ChannelPara> > &vcp);
-
- int importDbToXml();
- int importXmlToDB(const char *xmlPath);
- bool isAtv256ProgInsertForSkyworth();
- int insert256AtvProgForSkyworth();
- int ClearDbTable();
- int clearDbAllProgramInfoTable();
-private:
- static CTvDatabase *mpDb;
- int isFreqListExist(void);
-};
-
-#endif //_CTVDATABASE_H
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvDatabase.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+#include <am_db.h>
+#if !defined(_CTVDATABASE_H)
+#define _CTVDATABASE_H
+// ʹÓÃAM_DB
+#include <unistd.h>
+#include <stdlib.h>
+#include <utils/String8.h>
+#include <utils/Log.h>
+#include <utils/Vector.h>
+#include <utils/RefBase.h>
+#include <tvutils/CSqlite.h>
+
+#include "CTvLog.h"
+
+
+using namespace android;
+//¸ù¾ÝÏÖÔÚÇé¿öÐèÇó,´ËÀàÖ»Õë¶ÔµçÊÓ¹¦Äܰ󶨵ĵ¥ÎļþÊý¾Ý¿â,ÓëAM_DBÓйØÁªÐÔ
+//ÎÞ½âµÄ¹ØÁª
+class CTvDatabase: public CSqlite {
+public:
+ static const char *DEFAULT_DB_PATH;
+ static const int DB_VERSION = 8;
+ static const char *DB_VERSION_FIELD;
+
+ static const char feTypes[][32];
+ static const char srvTypes[][32];
+ static const char vidFmts[][32];
+ static const char audFmts[][32];
+ static const char mods[][32];
+ static const char bandwidths[][32];
+ static const char lnbPowers[][32];
+ static const char sig22K[][32];
+ static const char tonebursts[][32];
+ static const char diseqc10s[][32];
+ static const char diseqc11s[][32];
+ static const char motors[][32];
+ static const char ofdmModes[][32];
+ static const char atvVideoStds[][32];
+ static const char atvAudioStds[][32];
+ template<typename T>
+ int StringToIndex(const T &t, const char *item)
+ {
+ if (item == NULL) return -1;
+ int size = sizeof(t) / sizeof(t[0]);
+ for (int i = 0; i < size; i++) {
+ if (strcmp(t[i], item) == 0) return i;
+ }
+ return -1;
+ }
+public:
+ CTvDatabase();
+ //Ö±½ÓÖ¸¶¨Êý¾Ý¿âÁ¬½Ó¾ä±ú
+ //CTvDatabase(char* path, sqlite3 * h);
+ static CTvDatabase *GetTvDb();
+ static void deleteTvDb();
+ ~CTvDatabase();
+ //ÓÃÖ¸¶¨Â·¾¶´´½¨TVÊý¾Ý¿â.
+ int UnInitTvDb();
+ int InitTvDb(const char *path);
+ //showboz test
+ class ChannelPara : public LightRefBase<ChannelPara> {
+ public:
+ int mode;
+ int freq;
+ int symbol_rate;
+ int modulation;
+ int bandwidth;
+ int polar;
+ };
+
+ static int getChannelParaList(char *path, Vector<sp<ChannelPara> > &vcp);
+
+ int importDbToXml();
+ int importXmlToDB(const char *xmlPath);
+ bool isAtv256ProgInsertForSkyworth();
+ int insert256AtvProgForSkyworth();
+ int ClearDbTable();
+ int clearDbAllProgramInfoTable();
+private:
+ static CTvDatabase *mpDb;
+ int isFreqListExist(void);
+};
+
+#endif //_CTVDATABASE_H
diff --git a/tvapi/libtv/tvdb/CTvDimension.cpp b/tvapi/libtv/tvdb/CTvDimension.cpp
index c10df5d..1863080 100644
--- a/tvapi/libtv/tvdb/CTvDimension.cpp
+++ b/tvapi/libtv/tvdb/CTvDimension.cpp
@@ -72,13 +72,13 @@ CTvDimension::CTvDimension()
}
CTvDimension::~CTvDimension()
{
- if(lockValues != NULL) {
+ if (lockValues != NULL) {
delete []lockValues;
}
- if(textValues != NULL) {
+ if (textValues != NULL) {
delete []textValues;
}
- if(abbrevValues != NULL) {
+ if (abbrevValues != NULL) {
delete []abbrevValues;
}
}
@@ -94,7 +94,7 @@ int CTvDimension::getUSPGAllLockStatus(String8 abbrev)
String8 dm5Abbrev[len - 1];
dm5.getAbbrev(dm5Abbrev);
for (j = 0; j < len - 1; j++) {
- if(dm5Abbrev[j] == abbrev) {
+ if (dm5Abbrev[j] == abbrev) {
return dm5.getLockStatus(j + 1);
}
}
@@ -104,7 +104,7 @@ int CTvDimension::getUSPGAllLockStatus(String8 abbrev)
String8 dm0Abbrev[len - 1];
dm0.getAbbrev(dm0Abbrev);
for (j = 0; j < len - 1; j++) {
- if(dm0Abbrev[j] == abbrev) {
+ if (dm0Abbrev[j] == abbrev) {
return dm0.getLockStatus(j + 1);
}
}
@@ -160,7 +160,7 @@ void CTvDimension::selectByID(CTvDimension &dm, int id)
CTvDatabase::Cursor c;
int ret = CTvDatabase::GetTvDb()->select(cmd, c);
- if(c.moveToFirst()) {
+ if (c.moveToFirst()) {
dm.createFromCursor(c);
LOGD("%s, %d success", "TV", __LINE__);
} else {
@@ -184,7 +184,7 @@ void CTvDimension::selectByRatingRegion(CTvDimension &dm, int ratingRegionID)
CTvDatabase::Cursor c;
int ret = CTvDatabase::GetTvDb()->select(cmd, c);
- if(c.moveToFirst()) {
+ if (c.moveToFirst()) {
dm.createFromCursor(c);
LOGD("%s, %d success", "TV", __LINE__);
} else {
@@ -209,7 +209,7 @@ int CTvDimension::selectByIndex(CTvDimension &dm, int ratingRegionID, int index)
CTvDatabase::Cursor c;
int ret = CTvDatabase::GetTvDb()->select(cmd, c);
- if(c.moveToFirst()) {
+ if (c.moveToFirst()) {
dm.createFromCursor(c);
LOGD("%s, %d success", "TV", __LINE__);
} else {
@@ -236,7 +236,7 @@ void CTvDimension::selectByName(CTvDimension &dm, int ratingRegionID, String8 di
CTvDatabase::Cursor c;
CTvDatabase::GetTvDb()->select(cmd, c);
- if(c.moveToFirst()) {
+ if (c.moveToFirst()) {
LOGD("%s, %d success", "TV", __LINE__);
dm.createFromCursor(c);
} else {
@@ -331,7 +331,7 @@ int *CTvDimension::getLockStatus()
} else {
int *lock = new int[len - 1];
//System.arraycopy(lockValues, 1, l, 0, l.length);
- for(int i = 0; i < len - 1; i++)
+ for (int i = 0; i < len - 1; i++)
lock[i] = lockValues[1 + i];
return lock;
}
@@ -388,7 +388,7 @@ int CTvDimension::getAbbrev(String8 abb[])
/* the first rating_value must be not visible to user */
int len = getDefinedValue();
if (len > 1) {
- for(int i = 0; i < len - 1; i++)
+ for (int i = 0; i < len - 1; i++)
abb[i] = abbrevValues[i + 1];
return 0;
} else {
@@ -417,7 +417,7 @@ int CTvDimension::getText(String8 tx[])
{
int len = getDefinedValue();
if (len > 1) {
- for(int i = 0; i < len - 1; i++)
+ for (int i = 0; i < len - 1; i++)
tx[i] = textValues[i + 1];
return 0;
} else {
@@ -570,69 +570,69 @@ void CTvDimension::builtinAtscDimensions()
/* Add U.S. Rating region 0x1 */
const char *abbrev0[] = {"", "None", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- const char *text0[] = {"", "None", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- int lock0[] = { -1, -1, 0, 0, 0, 0};
+ const char *text0[] = {"", "None", "TV-G", "TV-PG", "TV-14", "TV-MA"};
+ int lock0[] = { -1, -1, 0, 0, 0, 0};
const char *abbrev1[] = {"", "D", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- const char *text1[] = {"", "D", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- int lock1[] = { -1, -1, -1, 0, 0, -1};
+ const char *text1[] = {"", "D", "TV-G", "TV-PG", "TV-14", "TV-MA"};
+ int lock1[] = { -1, -1, -1, 0, 0, -1};
const char *abbrev2[] = {"", "L", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- const char *text2[] = {"", "L", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- int lock2[] = { -1, -1, -1, 0, 0, 0};
+ const char *text2[] = {"", "L", "TV-G", "TV-PG", "TV-14", "TV-MA"};
+ int lock2[] = { -1, -1, -1, 0, 0, 0};
const char *abbrev3[] = {"", "S", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- const char *text3[] = {"", "S", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- int lock3[] = { -1, -1, -1, 0, 0, 0};
+ const char *text3[] = {"", "S", "TV-G", "TV-PG", "TV-14", "TV-MA"};
+ int lock3[] = { -1, -1, -1, 0, 0, 0};
const char *abbrev4[] = {"", "V", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- const char *text4[] = {"", "V", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- int lock4[] = { -1, -1, -1, 0, 0, 0};
+ const char *text4[] = {"", "V", "TV-G", "TV-PG", "TV-14", "TV-MA"};
+ int lock4[] = { -1, -1, -1, 0, 0, 0};
const char *abbrev5[] = {"", "TV-Y", "TV-Y7"};
- const char *text5[] = {"", "TV-Y", "TV-Y7"};
- int lock5[] = { -1, 0, 0};
+ const char *text5[] = {"", "TV-Y", "TV-Y7"};
+ int lock5[] = { -1, 0, 0};
const char *abbrev6[] = {"", "FV", "TV-Y7"};
- const char *text6[] = {"", "FV", "TV-Y7"};
- int lock6[] = { -1, -1, 0};
+ const char *text6[] = {"", "FV", "TV-Y7"};
+ int lock6[] = { -1, -1, 0};
const char *abbrev7[] = {"", "N/A", "G", "PG", "PG-13", "R", "NC-17", "X", "NR"};
- const char *text7[] = {"", "MPAA Rating Not Applicable", "Suitable for AllAges",
+ const char *text7[] = {"", "MPAA Rating Not Applicable", "Suitable for AllAges",
"Parental GuidanceSuggested", "Parents Strongly Cautioned",
"Restricted, under 17 must be accompanied by adult",
"No One 17 and Under Admitted", "No One 17 and Under Admitted",
"no Rated by MPAA"
};
- int lock7[] = { -1, -1, 0, 0, 0, 0, 0, 0, 0};
+ int lock7[] = { -1, -1, 0, 0, 0, 0, 0, 0, 0};
/*Extra for 'All' */
const char *abbrevall[] = {"TV-Y", "TV-Y7", "TV-G", "TV-PG", "TV-14", "TV-MA"};
const char *textall[] = {"TV-Y", "TV-Y7", "TV-G", "TV-PG", "TV-14", "TV-MA"};
- int lockall[] = {0, 0, 0, 0, 0, 0};
+ int lockall[] = {0, 0, 0, 0, 0, 0};
insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"),
- String8("Entire Audience"), 0, lock0, abbrev0, text0, sizeof(lock0) / sizeof(int));
+ String8("Entire Audience"), 0, lock0, abbrev0, text0, sizeof(lock0) / sizeof(int));
insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"),
- String8("Dialogue"), 1, lock1, abbrev1, text1, sizeof(lock1) / sizeof(int));
+ String8("Dialogue"), 1, lock1, abbrev1, text1, sizeof(lock1) / sizeof(int));
insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"),
- String8("Language"), 2, lock2, abbrev2, text2, sizeof(lock2) / sizeof(int));
+ String8("Language"), 2, lock2, abbrev2, text2, sizeof(lock2) / sizeof(int));
insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"),
- String8("Sex"), 3, lock3, abbrev3, text3, sizeof(lock3) / sizeof(int));
+ String8("Sex"), 3, lock3, abbrev3, text3, sizeof(lock3) / sizeof(int));
insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"),
- String8("Violence"), 4, lock4, abbrev4, text4, sizeof(lock4) / sizeof(int));
+ String8("Violence"), 4, lock4, abbrev4, text4, sizeof(lock4) / sizeof(int));
insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"),
- String8("Children"), 5, lock5, abbrev5, text5, sizeof(lock5) / sizeof(int));
+ String8("Children"), 5, lock5, abbrev5, text5, sizeof(lock5) / sizeof(int));
insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"),
String8("Fantasy violence"), 6, lock6, abbrev6, text6, sizeof(lock6) / sizeof(int));
insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"),
- String8("MPAA"), 7, lock7, abbrev7, text7, sizeof(lock7) / sizeof(int));
+ String8("MPAA"), 7, lock7, abbrev7, text7, sizeof(lock7) / sizeof(int));
insertNewDimension(CTvDimension::REGION_US, String8("US (50 states + possessions)"),
- String8("All"), -1, lockall, abbrevall, textall, sizeof(lockall) / sizeof(int));
+ String8("All"), -1, lockall, abbrevall, textall, sizeof(lockall) / sizeof(int));
/* Add Canadian Rating region 0x2 */
- const char *cabbrev0[] = {"E", "C", "C8+", "G", "PG", "14+", "18+"};
+ const char *cabbrev0[] = {"E", "C", "C8+", "G", "PG", "14+", "18+"};
const char *ctext0[] = {"Exempt", "Children", "8+", "General", "PG", "14+", "18+"};
- int clock0[] = {0, 0, 0, 0, 0, 0, 0};
- const char *cabbrev1[] = {"E", "G", "8 ans+", "13 ans+", "16 ans+", "18 ans+"};
- const char *ctext1[] = {"Exempt??es", "Pour tous", "8+", "13+", "16+", "18+"};
- int clock1[] = {0, 0, 0, 0, 0, 0};
+ int clock0[] = {0, 0, 0, 0, 0, 0, 0};
+ const char *cabbrev1[] = {"E", "G", "8 ans+", "13 ans+", "16 ans+", "18 ans+"};
+ const char *ctext1[] = {"Exempt??es", "Pour tous", "8+", "13+", "16+", "18+"};
+ int clock1[] = {0, 0, 0, 0, 0, 0};
insertNewDimension(CTvDimension::REGION_CANADA, String8("Canada"),
String8("Canadian English Language Rating"), 0, clock0, cabbrev0, ctext0, sizeof(clock0) / sizeof(int));
insertNewDimension(CTvDimension::REGION_CANADA, String8("Canada"),
- String8("Codes francais du Canada"), 1, clock1, cabbrev1, ctext1, sizeof(clock1) / sizeof(int));
+ String8("Codes francais du Canada"), 1, clock1, cabbrev1, ctext1, sizeof(clock1) / sizeof(int));
}
int CTvDimension::isDimensionTblExist()
diff --git a/tvapi/libtv/tvdb/CTvDimension.h b/tvapi/libtv/tvdb/CTvDimension.h
index 0e6ea60..9ad9bad 100644
--- a/tvapi/libtv/tvdb/CTvDimension.h
+++ b/tvapi/libtv/tvdb/CTvDimension.h
@@ -1,97 +1,97 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvDimension.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-#if !defined(_CTVDIMENSION_H)
-#define _CTVDIMENSION_H
-#include <utils/Vector.h>
-#include "CTvDatabase.h"
-#include <utils/String8.h>
-#include <stdlib.h>
-
-#include "CTvLog.h"
-
-// TV ATSC rating dimension
-class CTvDimension {
-public:
- class VChipRating {
- private:
- int region;
- int dimension;
- int value;
-
- public:
- VChipRating(int region, int dimension, int value);
- VChipRating();
- ~VChipRating();
- int getRegion();
- int getDimension();
- int getValue()const;
- };
- /* 'All' is a very special case, it links to dimension0 & dimension5 */
- void createFromCursor(CTvDatabase::Cursor &c);
- static int getUSPGAllLockStatus(String8 abbrev);
- static void setUSPGAllLockStatus(String8 abbrev, int lock);
- static void selectByID(CTvDimension &dm, int id);
- static int selectByIndex(CTvDimension &dm, int ratingRegionID, int index);
- static void selectByName(CTvDimension &dm, int ratingRegionID, String8 dimensionName);
- static void selectByRatingRegion(CTvDimension &dm, int ratingRegionID);
- bool isBlocked(CTvDimension &dm, VChipRating *definedRating);
- int getID();
- int getRatingRegion();
- String8 getRatingRegionName();
- String8 getName();
- int getGraduatedScale();
- int getDefinedValue();
- //int* getLockStatus();
- int getLockStatus(int valueIndex);
- void getLockStatus(String8 abbrevs[], int lock[], int *array_len);
- int getAbbrev(String8 abb[]);
- String8 getAbbrev(int valueIndex);
- int getText(String8 tx[]);
- String8 getText(int valueIndex);
- void setLockStatus(int valueIndex, int status);
- void setLockStatus(int status[]);
- void setLockStatus(String8 abbrevs[], int locks[], int abb_size);
- /**Rating regions*/
-public:
- static const int REGION_US = 0x1;
- static const int REGION_CANADA = 0x2;
- static const int REGION_TAIWAN = 0x3;
- static const int REGION_SOUTHKOREA = 0x4;
-
- CTvDimension(CTvDatabase::Cursor &c);
- CTvDimension();
- ~CTvDimension();
-
- static void insertNewDimension(const int region, String8 regionName, String8 name,
- int indexj, int *lock, const char **abbrev, const char **text, int size);
- static void builtinAtscDimensions();
- static int isDimensionTblExist();
- String8 getCurdimension();
- String8 getCurAbbr();
- String8 getCurText();
-private:
- int id;
- int indexj;
- int ratingRegion;
- int graduatedScale;
- int valuesDefined;
- int *lockValues;
- String8 name;
- String8 ratingRegionName;
- String8 *abbrevValues;
- String8 *textValues;
- bool isPGAll;
- String8 CurvchipDimension;
- String8 CurvchipAbbrev;
- String8 CurvchipText;
-};
-#endif //_CTVDIMENSION_H
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvDimension.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+#if !defined(_CTVDIMENSION_H)
+#define _CTVDIMENSION_H
+#include <utils/Vector.h>
+#include "CTvDatabase.h"
+#include <utils/String8.h>
+#include <stdlib.h>
+
+#include "CTvLog.h"
+
+// TV ATSC rating dimension
+class CTvDimension {
+public:
+ class VChipRating {
+ private:
+ int region;
+ int dimension;
+ int value;
+
+ public:
+ VChipRating(int region, int dimension, int value);
+ VChipRating();
+ ~VChipRating();
+ int getRegion();
+ int getDimension();
+ int getValue()const;
+ };
+ /* 'All' is a very special case, it links to dimension0 & dimension5 */
+ void createFromCursor(CTvDatabase::Cursor &c);
+ static int getUSPGAllLockStatus(String8 abbrev);
+ static void setUSPGAllLockStatus(String8 abbrev, int lock);
+ static void selectByID(CTvDimension &dm, int id);
+ static int selectByIndex(CTvDimension &dm, int ratingRegionID, int index);
+ static void selectByName(CTvDimension &dm, int ratingRegionID, String8 dimensionName);
+ static void selectByRatingRegion(CTvDimension &dm, int ratingRegionID);
+ bool isBlocked(CTvDimension &dm, VChipRating *definedRating);
+ int getID();
+ int getRatingRegion();
+ String8 getRatingRegionName();
+ String8 getName();
+ int getGraduatedScale();
+ int getDefinedValue();
+ //int* getLockStatus();
+ int getLockStatus(int valueIndex);
+ void getLockStatus(String8 abbrevs[], int lock[], int *array_len);
+ int getAbbrev(String8 abb[]);
+ String8 getAbbrev(int valueIndex);
+ int getText(String8 tx[]);
+ String8 getText(int valueIndex);
+ void setLockStatus(int valueIndex, int status);
+ void setLockStatus(int status[]);
+ void setLockStatus(String8 abbrevs[], int locks[], int abb_size);
+ /**Rating regions*/
+public:
+ static const int REGION_US = 0x1;
+ static const int REGION_CANADA = 0x2;
+ static const int REGION_TAIWAN = 0x3;
+ static const int REGION_SOUTHKOREA = 0x4;
+
+ CTvDimension(CTvDatabase::Cursor &c);
+ CTvDimension();
+ ~CTvDimension();
+
+ static void insertNewDimension(const int region, String8 regionName, String8 name,
+ int indexj, int *lock, const char **abbrev, const char **text, int size);
+ static void builtinAtscDimensions();
+ static int isDimensionTblExist();
+ String8 getCurdimension();
+ String8 getCurAbbr();
+ String8 getCurText();
+private:
+ int id;
+ int indexj;
+ int ratingRegion;
+ int graduatedScale;
+ int valuesDefined;
+ int *lockValues;
+ String8 name;
+ String8 ratingRegionName;
+ String8 *abbrevValues;
+ String8 *textValues;
+ bool isPGAll;
+ String8 CurvchipDimension;
+ String8 CurvchipAbbrev;
+ String8 CurvchipText;
+};
+#endif //_CTVDIMENSION_H
diff --git a/tvapi/libtv/tvdb/CTvEvent.cpp b/tvapi/libtv/tvdb/CTvEvent.cpp
index 12f8352..b660fc9 100644
--- a/tvapi/libtv/tvdb/CTvEvent.cpp
+++ b/tvapi/libtv/tvdb/CTvEvent.cpp
@@ -1,241 +1,242 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvEvent.cpp
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-#include "CTvEvent.h"
-#include "CTvDatabase.h"
-#include "CTvProgram.h"
-#include <stdlib.h>
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#define LOG_TAG "CTvEvent"
-#endif
-
-void CTvEvent::InitFromCursor(CTvDatabase::Cursor &c)
-{
- int col;
-
- col = c.getColumnIndex("db_id");
- this->id = c.getInt(col);
-
- col = c.getColumnIndex("event_id");
- this->dvbEventID = c.getInt(col);
-
- col = c.getColumnIndex("name");
- this->name = c.getString(col);
-
- col = c.getColumnIndex("start");
- this->start = (long)c.getInt(col);
-
- col = c.getColumnIndex("end");
- this->end = (long)c.getInt(col) ;
-
- col = c.getColumnIndex("nibble_level");
- this->dvbContent = c.getInt(col);
-
- col = c.getColumnIndex("parental_rating");
- this->dvbViewAge = c.getInt(col);
-
- col = c.getColumnIndex("sub_flag");
- this->sub_flag = c.getInt(col);
-
- col = c.getColumnIndex("db_srv_id");
- this->programID = c.getInt(col);
-
- col = c.getColumnIndex("rrt_ratings");
- String8 rrtRatings = c.getString(col);
- char *tmp;
- Vector<String8> ratings;
- int l = 0;
- tmp = strtok(rrtRatings.lockBuffer(rrtRatings.size()), ",");
- LOGD("%s, %d, %s", "TV", __LINE__, tmp);
- while (tmp != NULL) {
- ratings.push_back(String8(tmp));
- tmp = strtok(NULL, ",");
- }
- rrtRatings.unlockBuffer();
- rating_len = ratings.size();
- if (!ratings.isEmpty()) {
- for (int i = 0; i < ratings.size(); i++) {
- Vector<String8> rating;
- tmp = strtok(ratings.editItemAt(i).lockBuffer(ratings.editItemAt(i).length()), " ");
- while (tmp != NULL) {
- rating.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- ratings.editItemAt(i).unlockBuffer();
- if (rating.size() >= 3) {
- int re = atoi(rating[0]);
- int dm = atoi(rating[1]);
- int vl = atoi(rating[2]);
- vchipRatings.add( new CTvDimension::VChipRating(re, dm, vl));
- } else
- vchipRatings.add(NULL);
- }
- }
-
- col = c.getColumnIndex("descr");
- this->description = c.getString(col);
-
- col = c.getColumnIndex("ext_descr");
- this->extDescription = c.getString(col);
-}
-
-//id; CTvChannel.MODE_ATSC sourceid , other id
-int CTvEvent::getProgPresentEvent(int progSrc, int progID, long nowTime, CTvEvent &ev)
-{
- String8 cmd;
- CTvDatabase::Cursor c;
-
- cmd = String8("select * from evt_table where evt_table.");
-
- if (progSrc == CTvChannel::MODE_ATSC) {
- cmd += String8("source_id = ") + String8::format("%d", progID);
- } else {
- cmd += String8("db_srv_id = ") + String8::format("%d", progID);
- }
-
- cmd += String8(" and evt_table.start <= ") + String8::format("%ld", nowTime) + String8(" and evt_table.end > ") + String8::format("%ld", nowTime);
-
- int ret = CTvDatabase::GetTvDb()->select(cmd, c);
-
- if(c.moveToFirst()) {
- ev.InitFromCursor(c);
- } else {
- c.close();
- return -1;
- }
-
- c.close();
-
- return 0;
-}
-
-int CTvEvent::getProgScheduleEvents(int progSrc, int progID, long start, long duration, Vector<sp<CTvEvent> > &vEv)
-{
- String8 cmd;
- long begin = start;
- long end = start + duration;
-
- cmd = String8("select * from evt_table where evt_table.");
- if (progSrc == CTvChannel::MODE_ATSC) {
- cmd += String8("source_id = ") + String8::format("%d", progID);
- } else {
- cmd += String8("db_srv_id = ") + String8::format("%d", progID);
- }
- cmd += String8(" and ");
- cmd += String8(" ((start < ") + String8::format("%ld", begin) + String8(" and end > ") + String8::format("%ld", begin) + String8(") ||");
- cmd += String8(" (start >= ") + String8::format("%ld", begin) + String8(" and start < ") + String8::format("%ld", end) + String8("))");
- cmd += String8(" order by evt_table.start");
-
- CTvDatabase::Cursor c;
- int ret = CTvDatabase::GetTvDb()->select(cmd, c);
-
- if(c.moveToFirst()) {
- do {
- vEv.add(new CTvEvent(c));
- } while(c.moveToNext());
-
- } else {
- c.close();
- return -1;
- }
-
- c.close();
- return 0;
-}
-int CTvEvent::getATVProgEvent(int progSrc, int progID, CTvEvent &ev)
-{
- String8 cmd;
- CTvDatabase::Cursor c;
-
- cmd = String8("select * from evt_table where evt_table.");
-
- if (progSrc == CTvChannel::MODE_ATSC) {
- LOGD("%s, %d MODE_ATSC", "TV", __LINE__);
- cmd += String8("source_id = ") + String8::format("%d", progID);
- } else {
- LOGD("%s, %d MODE_ANALOG", "TV", __LINE__);
- cmd += String8("db_srv_id = ") + String8::format("%d", progID);
- }
-
- //cmd += String8(" and evt_table.start <= ") + String8::format("%ld", nowTime) + String8(" and evt_table.end > ") + String8::format("%ld", nowTime);
-
- int ret = CTvDatabase::GetTvDb()->select(cmd, c);
-
- if(c.moveToFirst()) {
- ev.InitFromCursor(c);
- } else {
- c.close();
- return -1;
- }
-
- c.close();
-
- return 0;
-}
-
-int CTvEvent::CleanAllEvent()
-{
- CTvDatabase::GetTvDb()->exeSql("delete from evt_table");
- return 0;
-}
-
-int CTvEvent::selectByID(int id, CTvEvent &evt)
-{
- CTvDatabase::Cursor c;
- String8 sql;
-
- sql = String8("select * from evt_table where evt_table.db_id = ") + String8::format("%d", id);
- CTvDatabase::GetTvDb()->select(sql.string(), c);
- if(c.moveToFirst()) {
- evt.InitFromCursor(c);
- } else {
- c.close();
- return -1;
- }
-
- c.close();
- return 0;
-}
-
-int CTvEvent::bookEvent(int evtId, bool bBookFlag)
-{
- String8 cmd;
-
- cmd = String8("update evt_table set sub_flag=") + String8::format("%d", bBookFlag)
- + String8(" where event_id=") + String8::format("%d", evtId);
-
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
- return 0;
-}
-
-CTvEvent::CTvEvent(CTvDatabase::Cursor &c)
-{
- InitFromCursor(c);
-}
-
-CTvEvent::CTvEvent()
-{
-}
-
-CTvEvent::~CTvEvent()
-{
- int size = vchipRatings.size();
- for (int i = 0; i < size; i++)
- delete vchipRatings[i];
-}
-Vector<CTvDimension::VChipRating *> CTvEvent::getVChipRatings()
-{
- return vchipRatings;
-}
-
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvEvent.cpp
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+#include "CTvEvent.h"
+#include "CTvDatabase.h"
+#include "CTvProgram.h"
+#include <stdlib.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "CTvEvent"
+#endif
+
+void CTvEvent::InitFromCursor(CTvDatabase::Cursor &c)
+{
+ int col;
+
+ col = c.getColumnIndex("db_id");
+ this->id = c.getInt(col);
+
+ col = c.getColumnIndex("event_id");
+ this->dvbEventID = c.getInt(col);
+
+ col = c.getColumnIndex("name");
+ this->name = c.getString(col);
+
+ col = c.getColumnIndex("start");
+ this->start = (long)c.getInt(col);
+
+ col = c.getColumnIndex("end");
+ this->end = (long)c.getInt(col) ;
+
+ col = c.getColumnIndex("nibble_level");
+ this->dvbContent = c.getInt(col);
+
+ col = c.getColumnIndex("parental_rating");
+ this->dvbViewAge = c.getInt(col);
+
+ col = c.getColumnIndex("sub_flag");
+ this->sub_flag = c.getInt(col);
+
+ col = c.getColumnIndex("db_srv_id");
+ this->programID = c.getInt(col);
+
+ col = c.getColumnIndex("rrt_ratings");
+ String8 rrtRatings = c.getString(col);
+ char *tmp;
+ Vector<String8> ratings;
+ int l = 0;
+ char *pSave;
+ tmp = strtok_r(rrtRatings.lockBuffer(rrtRatings.size()), ",", &pSave);
+ LOGD("%s, %d, %s", "TV", __LINE__, tmp);
+ while (tmp != NULL) {
+ ratings.push_back(String8(tmp));
+ tmp = strtok_r(NULL, ",", &pSave);
+ }
+ rrtRatings.unlockBuffer();
+ rating_len = ratings.size();
+ if (!ratings.isEmpty()) {
+ for (int i = 0; i < ratings.size(); i++) {
+ Vector<String8> rating;
+ tmp = strtok_r(ratings.editItemAt(i).lockBuffer(ratings.editItemAt(i).length()), " ", &pSave);
+ while (tmp != NULL) {
+ rating.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ ratings.editItemAt(i).unlockBuffer();
+ if (rating.size() >= 3) {
+ int re = atoi(rating[0]);
+ int dm = atoi(rating[1]);
+ int vl = atoi(rating[2]);
+ vchipRatings.add( new CTvDimension::VChipRating(re, dm, vl));
+ } else
+ vchipRatings.add(NULL);
+ }
+ }
+
+ col = c.getColumnIndex("descr");
+ this->description = c.getString(col);
+
+ col = c.getColumnIndex("ext_descr");
+ this->extDescription = c.getString(col);
+}
+
+//id; CTvChannel.MODE_ATSC sourceid , other id
+int CTvEvent::getProgPresentEvent(int progSrc, int progID, long nowTime, CTvEvent &ev)
+{
+ String8 cmd;
+ CTvDatabase::Cursor c;
+
+ cmd = String8("select * from evt_table where evt_table.");
+
+ if (progSrc == CTvChannel::MODE_ATSC) {
+ cmd += String8("source_id = ") + String8::format("%d", progID);
+ } else {
+ cmd += String8("db_srv_id = ") + String8::format("%d", progID);
+ }
+
+ cmd += String8(" and evt_table.start <= ") + String8::format("%ld", nowTime) + String8(" and evt_table.end > ") + String8::format("%ld", nowTime);
+
+ int ret = CTvDatabase::GetTvDb()->select(cmd, c);
+
+ if (c.moveToFirst()) {
+ ev.InitFromCursor(c);
+ } else {
+ c.close();
+ return -1;
+ }
+
+ c.close();
+
+ return 0;
+}
+
+int CTvEvent::getProgScheduleEvents(int progSrc, int progID, long start, long duration, Vector<sp<CTvEvent> > &vEv)
+{
+ String8 cmd;
+ long begin = start;
+ long end = start + duration;
+
+ cmd = String8("select * from evt_table where evt_table.");
+ if (progSrc == CTvChannel::MODE_ATSC) {
+ cmd += String8("source_id = ") + String8::format("%d", progID);
+ } else {
+ cmd += String8("db_srv_id = ") + String8::format("%d", progID);
+ }
+ cmd += String8(" and ");
+ cmd += String8(" ((start < ") + String8::format("%ld", begin) + String8(" and end > ") + String8::format("%ld", begin) + String8(") ||");
+ cmd += String8(" (start >= ") + String8::format("%ld", begin) + String8(" and start < ") + String8::format("%ld", end) + String8("))");
+ cmd += String8(" order by evt_table.start");
+
+ CTvDatabase::Cursor c;
+ int ret = CTvDatabase::GetTvDb()->select(cmd, c);
+
+ if (c.moveToFirst()) {
+ do {
+ vEv.add(new CTvEvent(c));
+ } while (c.moveToNext());
+
+ } else {
+ c.close();
+ return -1;
+ }
+
+ c.close();
+ return 0;
+}
+int CTvEvent::getATVProgEvent(int progSrc, int progID, CTvEvent &ev)
+{
+ String8 cmd;
+ CTvDatabase::Cursor c;
+
+ cmd = String8("select * from evt_table where evt_table.");
+
+ if (progSrc == CTvChannel::MODE_ATSC) {
+ LOGD("%s, %d MODE_ATSC", "TV", __LINE__);
+ cmd += String8("source_id = ") + String8::format("%d", progID);
+ } else {
+ LOGD("%s, %d MODE_ANALOG", "TV", __LINE__);
+ cmd += String8("db_srv_id = ") + String8::format("%d", progID);
+ }
+
+ //cmd += String8(" and evt_table.start <= ") + String8::format("%ld", nowTime) + String8(" and evt_table.end > ") + String8::format("%ld", nowTime);
+
+ int ret = CTvDatabase::GetTvDb()->select(cmd, c);
+
+ if (c.moveToFirst()) {
+ ev.InitFromCursor(c);
+ } else {
+ c.close();
+ return -1;
+ }
+
+ c.close();
+
+ return 0;
+}
+
+int CTvEvent::CleanAllEvent()
+{
+ CTvDatabase::GetTvDb()->exeSql("delete from evt_table");
+ return 0;
+}
+
+int CTvEvent::selectByID(int id, CTvEvent &evt)
+{
+ CTvDatabase::Cursor c;
+ String8 sql;
+
+ sql = String8("select * from evt_table where evt_table.db_id = ") + String8::format("%d", id);
+ CTvDatabase::GetTvDb()->select(sql.string(), c);
+ if (c.moveToFirst()) {
+ evt.InitFromCursor(c);
+ } else {
+ c.close();
+ return -1;
+ }
+
+ c.close();
+ return 0;
+}
+
+int CTvEvent::bookEvent(int evtId, bool bBookFlag)
+{
+ String8 cmd;
+
+ cmd = String8("update evt_table set sub_flag=") + String8::format("%d", bBookFlag)
+ + String8(" where event_id=") + String8::format("%d", evtId);
+
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+ return 0;
+}
+
+CTvEvent::CTvEvent(CTvDatabase::Cursor &c)
+{
+ InitFromCursor(c);
+}
+
+CTvEvent::CTvEvent()
+{
+}
+
+CTvEvent::~CTvEvent()
+{
+ int size = vchipRatings.size();
+ for (int i = 0; i < size; i++)
+ delete vchipRatings[i];
+}
+Vector<CTvDimension::VChipRating *> CTvEvent::getVChipRatings()
+{
+ return vchipRatings;
+}
+
diff --git a/tvapi/libtv/tvdb/CTvEvent.h b/tvapi/libtv/tvdb/CTvEvent.h
index 65cf00f..61a89bf 100644
--- a/tvapi/libtv/tvdb/CTvEvent.h
+++ b/tvapi/libtv/tvdb/CTvEvent.h
@@ -1,85 +1,85 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvEvent.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#if !defined(_CTVEVENT_H)
-#define _CTVEVENT_H
-
-#include <utils/Vector.h>
-#include "CTvProgram.h"
-#include "CTvDatabase.h"
-#include "CTvDimension.h"
-
-class CTvEvent : public LightRefBase<CTvEvent> {
-public:
- CTvEvent(CTvDatabase::Cursor &c);
- CTvEvent();
- ~CTvEvent();
-
- int getProgPresentEvent(int progSrc, int progID, long nowTime, CTvEvent &ev);
- int getProgScheduleEvents(int progSrc, int progID, long start, long duration, Vector<sp<CTvEvent> > &vEv);
- int getATVProgEvent(int progSrc, int progID, CTvEvent &ev);
- int bookEvent(int evtId, bool bBookFlag);
- static int selectByID(int id, CTvEvent &p);
- static int CleanAllEvent();
- String8 &getName()
- {
- return name;
- };
- String8 &getDescription()
- {
- return description;
- };
- String8 &getExtDescription()
- {
- return extDescription;
- };
- long getStartTime()
- {
- return start;
- };
- long getEndTime()
- {
- return end;
- };
- int getSubFlag()
- {
- return sub_flag;
- };
- int getProgramId()
- {
- return programID;
- };
- int getEventId()
- {
- return dvbEventID;
- };
- Vector<CTvDimension::VChipRating *> getVChipRatings();
-
-private:
- void InitFromCursor(CTvDatabase::Cursor &c);
-
- int id;
- int dvbEventID;
- String8 name;
- String8 description;
- String8 extDescription;
- int programID;
- long start;
- long end;
- int dvbContent;
- int dvbViewAge;
- int sub_flag;
- int rating_len;
- Vector<CTvDimension::VChipRating *> vchipRatings;
-};
-
-#endif //_CTVEVENT_H
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvEvent.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#if !defined(_CTVEVENT_H)
+#define _CTVEVENT_H
+
+#include <utils/Vector.h>
+#include "CTvProgram.h"
+#include "CTvDatabase.h"
+#include "CTvDimension.h"
+
+class CTvEvent : public LightRefBase<CTvEvent> {
+public:
+ CTvEvent(CTvDatabase::Cursor &c);
+ CTvEvent();
+ ~CTvEvent();
+
+ int getProgPresentEvent(int progSrc, int progID, long nowTime, CTvEvent &ev);
+ int getProgScheduleEvents(int progSrc, int progID, long start, long duration, Vector<sp<CTvEvent> > &vEv);
+ int getATVProgEvent(int progSrc, int progID, CTvEvent &ev);
+ int bookEvent(int evtId, bool bBookFlag);
+ static int selectByID(int id, CTvEvent &p);
+ static int CleanAllEvent();
+ String8 &getName()
+ {
+ return name;
+ };
+ String8 &getDescription()
+ {
+ return description;
+ };
+ String8 &getExtDescription()
+ {
+ return extDescription;
+ };
+ long getStartTime()
+ {
+ return start;
+ };
+ long getEndTime()
+ {
+ return end;
+ };
+ int getSubFlag()
+ {
+ return sub_flag;
+ };
+ int getProgramId()
+ {
+ return programID;
+ };
+ int getEventId()
+ {
+ return dvbEventID;
+ };
+ Vector<CTvDimension::VChipRating *> getVChipRatings();
+
+private:
+ void InitFromCursor(CTvDatabase::Cursor &c);
+
+ int id;
+ int dvbEventID;
+ String8 name;
+ String8 description;
+ String8 extDescription;
+ int programID;
+ long start;
+ long end;
+ int dvbContent;
+ int dvbViewAge;
+ int sub_flag;
+ int rating_len;
+ Vector<CTvDimension::VChipRating *> vchipRatings;
+};
+
+#endif //_CTVEVENT_H
diff --git a/tvapi/libtv/tvdb/CTvGroup.cpp b/tvapi/libtv/tvdb/CTvGroup.cpp
index 4b8741e..dfb043f 100644
--- a/tvapi/libtv/tvdb/CTvGroup.cpp
+++ b/tvapi/libtv/tvdb/CTvGroup.cpp
@@ -1,44 +1,44 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvGroup.cpp
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#include "CTvGroup.h"
-
-Vector<CTvGroup> CTvGroup::selectByGroup()
-{
- Vector<CTvGroup> vGroup;
- return vGroup;
-}
-
-void CTvGroup::addGroup()
-{
-
-}
-
-CTvGroup::CTvGroup()
-{
-
-}
-CTvGroup::~CTvGroup()
-{
-
-}
-
-void CTvGroup::deleteGroup()
-{
-
-}
-
-void CTvGroup::editGroup()
-{
-
-}
-
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvGroup.cpp
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#include "CTvGroup.h"
+
+Vector<CTvGroup> CTvGroup::selectByGroup()
+{
+ Vector<CTvGroup> vGroup;
+ return vGroup;
+}
+
+void CTvGroup::addGroup()
+{
+
+}
+
+CTvGroup::CTvGroup()
+{
+
+}
+CTvGroup::~CTvGroup()
+{
+
+}
+
+void CTvGroup::deleteGroup()
+{
+
+}
+
+void CTvGroup::editGroup()
+{
+
+}
+
diff --git a/tvapi/libtv/tvdb/CTvGroup.h b/tvapi/libtv/tvdb/CTvGroup.h
index d92a6ac..251ca95 100644
--- a/tvapi/libtv/tvdb/CTvGroup.h
+++ b/tvapi/libtv/tvdb/CTvGroup.h
@@ -1,30 +1,30 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvGroup.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#if !defined(_CTVGROUP_H)
-#define _CTVGROUP_H
-
-#include <utils/Vector.h>
-using namespace android;
-// Group¶ÔÓ¦DTVÖеÄÒ»¸ö½ÚÄ¿·Ö×é
-class CTvGroup {
-public:
- CTvGroup();
- ~CTvGroup();
- // È¡µÃËùÓнÚÄ¿·Ö×éÐÅÏ¢
- static Vector<CTvGroup> selectByGroup();
- static void addGroup();
- static void deleteGroup();
- static void editGroup();
-};
-
-#endif //_CTVGROUP_H
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvGroup.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#if !defined(_CTVGROUP_H)
+#define _CTVGROUP_H
+
+#include <utils/Vector.h>
+using namespace android;
+// Group¶ÔÓ¦DTVÖеÄÒ»¸ö½ÚÄ¿·Ö×é
+class CTvGroup {
+public:
+ CTvGroup();
+ ~CTvGroup();
+ // È¡µÃËùÓнÚÄ¿·Ö×éÐÅÏ¢
+ static Vector<CTvGroup> selectByGroup();
+ static void addGroup();
+ static void deleteGroup();
+ static void editGroup();
+};
+
+#endif //_CTVGROUP_H
diff --git a/tvapi/libtv/tvdb/CTvProgram.cpp b/tvapi/libtv/tvdb/CTvProgram.cpp
index c71c757..fdd1c68 100644
--- a/tvapi/libtv/tvdb/CTvProgram.cpp
+++ b/tvapi/libtv/tvdb/CTvProgram.cpp
@@ -1,883 +1,923 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvProgram.cpp
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#include "CTvProgram.h"
-#include "CTvDatabase.h"
-#include "CTvChannel.h"
-#include "CTvEvent.h"
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#define LOG_TAG "CTvProgram"
-#endif
-
-CTvProgram::CTvProgram(CTvDatabase::Cursor &c)
-{
- CreateFromCursor(c);
-}
-
-CTvProgram::~CTvProgram()
-{
- //free mem
- // video
- if(mpVideo != NULL) delete mpVideo;
- // audios
- int size = mvAudios.size();
- for(int i = 0; i < size; i++)
- delete mvAudios[i];
- // subtitles
- size = mvSubtitles.size();
- for(int i = 0; i < size; i++)
- delete mvSubtitles[i];
- // teletexts
- size = mvTeletexts.size();
- for(int i = 0; i < size; i++)
- delete mvTeletexts[i];
-}
-
-CTvProgram::CTvProgram(int channelID, int type)
-{
- mpVideo = NULL;
-}
-
-CTvProgram::CTvProgram()
-{
- mpVideo = NULL;
-}
-int CTvProgram::CreateFromCursor(CTvDatabase::Cursor &c)
-{
- int i = 0;
- int col;
- int num, type;
- int major, minor;
- char tmp_buf[256];
- //LOGD("CTvProgram::CreateFromCursor");
- col = c.getColumnIndex("db_id");
- this->id = c.getInt(col);
-
- col = c.getColumnIndex("source_id");
- this->sourceID = c.getInt(col);
-
- col = c.getColumnIndex("src");
- this->src = c.getInt(col);
-
- col = c.getColumnIndex("service_id");
- this->dvbServiceID = c.getInt(col);
-
- col = c.getColumnIndex("db_ts_id");
- this->channelID = c.getInt(col);
-
- col = c.getColumnIndex("name");
- this->name = c.getString(col);
-
- col = c.getColumnIndex("chan_num");
- num = c.getInt(col);
-
- col = c.getColumnIndex("chan_order");
- this->chanOrderNum = c.getInt(col);
-
- col = c.getColumnIndex("major_chan_num");
- major = c.getInt(col);
-
- col = c.getColumnIndex("minor_chan_num");
- minor = c.getInt(col);
-
- col = c.getColumnIndex("aud_track");
- this->audioTrack = c.getInt(col);
-
- //节目å·ä¿¡æ¯åˆ??
- if (src == CTvChannel::MODE_ATSC || (src == CTvChannel::MODE_ANALOG && major > 0)) {
- this->major = major;
- this->minor = minor;
- this->atscMode = true;
- this->minorCheck = MINOR_CHECK_NONE;
- } else {
- this->major = num;
- this->minor = 0;
- this->atscMode = false;
- this->minorCheck = MINOR_CHECK_NONE;
- }
-
- col = c.getColumnIndex("service_type");
- this->type = c.getInt(col);
-
- col = c.getColumnIndex("pmt_pid");
- pmtPID = c.getInt(col);
-
- //LOGD("CTvProgram::CreateFromCursor type = %d", this->type);
- col = c.getColumnIndex("skip");
- this->skip = c.getInt(col);
-
- col = c.getColumnIndex("lock");
- this->lock = (c.getInt(col) != 0);
-
- col = c.getColumnIndex("scrambled_flag");
- this->scrambled = (c.getInt(col) != 0);
-
- col = c.getColumnIndex("favor");
- this->favorite = (c.getInt(col) != 0);
-
- col = c.getColumnIndex("volume");
- this->volume = c.getInt(col);
-
- //Video
- int pid, fmt;
- col = c.getColumnIndex("vid_pid");
- pid = c.getInt(col);
-
- col = c.getColumnIndex("vid_fmt");
- fmt = c.getInt(col);
-
- //LOGD("----------vpid = %d", pid);
- this->mpVideo = new Video(pid, fmt);
- //LOGD("----------vpid = %d", this->mpVideo->getPID());
-
-
- //Audio
- String8 strPids;
- String8 strFmts;
- String8 strLangs;
- int count = 0;
- col = c.getColumnIndex("aud_pids");
- strPids = c.getString(col);
-
- col = c.getColumnIndex("aud_fmts");
- strFmts = c.getString(col);
-
- col = c.getColumnIndex("aud_langs");
- strLangs = c.getString(col);
- col = c.getColumnIndex("current_aud");
- this->currAudTrackIndex = c.getInt(col);
-
- char *tmp;
- Vector<String8> vpid ;
- Vector<String8> vfmt ;
- Vector<String8> vlang;
-
- tmp = strtok(strPids.lockBuffer(strPids.length()), " ");
- while (tmp != NULL) {
- vpid.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- strPids.unlockBuffer();
-
- tmp = strtok(strFmts.lockBuffer(strFmts.length()), " ");
- while (tmp != NULL) {
- vfmt.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- strFmts.unlockBuffer();
-
- tmp = strtok(strLangs.lockBuffer(strLangs.length()), " ");
-
- while (tmp != NULL) {
- vlang.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- strLangs.unlockBuffer();
-
- //check empty aud_langs
- for(i = vlang.size(); i < vpid.size(); i++) {
- sprintf(tmp_buf, "Audio%d", i + 1);
- vlang.push_back(String8(tmp_buf));
- LOGE("%s, aud_langs is empty, add dummy data (%s).\n", "TV", tmp_buf);
- }
-
- //String8 l(vlang[i]);
- for(i = 0; i < vpid.size(); i++) {
- int i_pid = atoi(vpid[i]);
- int i_fmt = atoi(vfmt[i]);
- mvAudios.push_back(new Audio(i_pid, vlang[i], i_fmt));
- }
-
-
-
- /* parse subtitles */
- vpid.clear();
- vlang.clear();
- Vector<String8> vcid;
- Vector<String8> vaid;
- String8 strCids;
- String8 strAids;
-
- col = c.getColumnIndex("sub_pids");
- strPids = c.getString(col);
-
- col = c.getColumnIndex("sub_composition_page_ids");
- strCids = c.getString(col);
-
- col = c.getColumnIndex("sub_ancillary_page_ids");
- strAids = c.getString(col);
-
-
- col = c.getColumnIndex("sub_langs");
- strLangs = c.getString(col);
-
- tmp = strtok(strPids.lockBuffer(strPids.length()), " ");
- while (tmp != NULL) {
- vpid.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- strPids.unlockBuffer();
-
- tmp = strtok(strCids.lockBuffer(strCids.length()), " ");
- while (tmp != NULL) {
- vcid.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- strCids.unlockBuffer();
-
- tmp = strtok(strAids.lockBuffer(strAids.length()), " ");
- while (tmp != NULL) {
- vaid.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- strAids.unlockBuffer();
-
- tmp = strtok(strLangs.lockBuffer(strLangs.length()), " ");
- while (tmp != NULL) {
- vlang.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- strLangs.unlockBuffer();
-
- //Subtitle
- for(int i = 0; i < vpid.size(); i++) {
- this->mvSubtitles.push_back(new Subtitle(
- atoi(vpid[i]),
- String8(vlang[i]), Subtitle::TYPE_DVB_SUBTITLE,
- atoi(vcid[i]),
- atoi(vaid[i])));
- }
-
- /* parse teletexts */
- int ttx_count = 0, ttx_sub_count = 0;
- String8 str_ttx_pids, str_ttx_types, str_mag_nos, str_page_nos, str_ttx_langs;
- Vector<String8> v_ttx_pids, v_ttx_types, v_mag_nos, v_page_nos, v_ttx_langs;
- col = c.getColumnIndex("ttx_pids");
- str_ttx_pids = c.getString(col);
-
- col = c.getColumnIndex("ttx_types");
- str_ttx_types = c.getString(col);
-
- col = c.getColumnIndex("ttx_magazine_nos");
- str_mag_nos = c.getString(col);
-
- col = c.getColumnIndex("ttx_page_nos");
- str_page_nos = c.getString(col);
-
- col = c.getColumnIndex("ttx_langs");
- str_ttx_langs = c.getString(col);
-
- tmp = strtok(str_ttx_pids.lockBuffer(str_ttx_pids.length()), " ");
- while (tmp != NULL) {
- v_ttx_pids.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- str_ttx_pids.unlockBuffer();
-
- tmp = strtok(str_ttx_types.lockBuffer(str_ttx_types.length()), " ");
- while (tmp != NULL) {
- v_ttx_types.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- str_ttx_types.unlockBuffer();
-
- tmp = strtok(str_mag_nos.lockBuffer(str_mag_nos.length()), " ");
- while (tmp != NULL) {
- v_mag_nos.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- str_mag_nos.unlockBuffer();
-
- tmp = strtok(str_page_nos.lockBuffer(str_page_nos.length()), " ");
- while (tmp != NULL) {
- v_page_nos.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- str_page_nos.unlockBuffer();
-
- tmp = strtok(str_ttx_langs.lockBuffer(str_ttx_langs.length()), " ");
- while (tmp != NULL) {
- v_ttx_langs.push_back(String8(tmp));
- tmp = strtok(NULL, " ");
- }
- str_ttx_langs.unlockBuffer();
-
-
- for(int i = 0; i < v_ttx_pids.size(); i++) {
- int ttype = atoi(v_ttx_types[i]);
- if (ttype == 0x2 || ttype == 0x5) {
- this->mvSubtitles.push_back(new Subtitle(
- atoi(v_ttx_pids[i].string()),
- String8(v_ttx_langs[i]), Subtitle::TYPE_DTV_TELETEXT,
- atoi(v_mag_nos[i]),
- atoi(v_page_nos[i])));
- } else {
- this->mvTeletexts.push_back(new Teletext(
- atoi(v_ttx_pids[i]),
- String8(v_ttx_langs[i]),
- atoi(v_mag_nos[i]),
- atoi(v_page_nos[i])));
- }
- }
- return 0;
-}
-
-int CTvProgram::selectProgramInChannelByNumber(int channelID, int num, CTvDatabase::Cursor &c)
-{
- String8 cmd = String8("select * from srv_table where db_ts_id = ") + String8::format("%d", channelID) + String8(" and ");
- cmd += String8("chan_num = ") + String8::format("%d", num);
- return CTvDatabase::GetTvDb()->select(cmd, c);
-}
-
-
-int CTvProgram::selectProgramInChannelByNumber(int channelID, int major, int minor, CTvDatabase::Cursor &c)
-{
- String8 cmd = String8("select * from srv_table where db_ts_id = ") + String8::format("%d", channelID) + String8(" and ");
- cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num = ") + String8::format("%d", minor);
-
- return CTvDatabase::GetTvDb()->select(cmd, c);
-}
-
-/**
- *å‘æ•°æ®åº“添加一个Program,not atscMode
- */
-CTvProgram::CTvProgram(int channelID, int type, int num, int skipFlag)
-{
- CTvChannel channel;
- int ret = CTvChannel::selectByID(channelID, channel);
- if (ret != 0) {
- //Log.d(TAG, "Cannot add new program, invalid channel id "+channelID);
- this->id = -1;
- } else {
- CTvDatabase::Cursor c ;
- selectProgramInChannelByNumber(channelID, num, c);
-
- if(c.moveToFirst()) {
- /*Construct*/
- CreateFromCursor(c);
- } else {
- String8 tpids = String8(""), ttypes = String8(""), tmagnums = String8(""), tpgnums = String8(""), tlangs = String8("");
- String8 spids = String8(""), stypes = String8(""), scpgids = String8(""), sapgids = String8(""), slangs = String8("");
-
- /*add a new atv program to database*/
- String8 cmd = String8("insert into srv_table(db_net_id,db_ts_id,service_id,src,name,service_type,");
- cmd += String8("eit_schedule_flag,eit_pf_flag,running_status,free_ca_mode,volume,aud_track,vid_pid,");
- cmd += String8("vid_fmt,aud_pids,aud_fmts,aud_langs,skip,lock,chan_num,major_chan_num,");
- cmd += String8("minor_chan_num,access_controlled,hidden,hide_guide,source_id,favor,current_aud,");
- cmd += String8("current_sub,sub_pids,sub_types,sub_composition_page_ids,sub_ancillary_page_ids,sub_langs,");
- cmd += String8("current_ttx,ttx_pids,ttx_types,ttx_magazine_nos,ttx_page_nos,ttx_langs,");
- cmd += String8("db_sat_para_id,scrambled_flag,lcn,hd_lcn,sd_lcn,default_chan_num,chan_order) ");
- cmd += String8("values(-1,") + String8::format("%d", channelID) + String8(",65535,") + String8::format("%d", channel.getMode()) + String8(",'',") + String8::format("%d", type) + String8(",");
- cmd += String8("0,0,0,0,0,0,8191,");
- int chanNum = num;
- int majorNum = 0;
- cmd += String8("-1,'','','',") + String8::format("%d", skipFlag) + String8(",0,") + String8::format("%d", chanNum) + String8(",") + String8::format("%d", majorNum) + String8(",");
- cmd += String8("") + /*num.getMinor()*/String8("0") + String8(",0,0,0,-1,0,-1,");
- cmd += String8("-1,'") + spids + String8("','") + stypes + String8("','") + scpgids + String8("','") + sapgids + String8("','") + slangs + String8("',");
- cmd += String8("-1,'") + tpids + String8("','") + ttypes + String8("','") + tmagnums + String8("','") + tpgnums + String8("','") + tlangs + String8("',");
- cmd += String8("-1,0,-1,-1,-1,-1,0)");
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
- CTvDatabase::Cursor cr;
- selectProgramInChannelByNumber(channelID, num, cr);
- if(cr.moveToFirst()) {
- /*Construct*/
- CreateFromCursor(cr);
- } else {
- /*A critical error*/
- //Log.d(TAG, "Cannot add new program, sqlite error");
- this->id = -1;
- }
- cr.close();
- }
- c.close();
- }
-
-}
-
-
-/**
- *å‘æ•°æ®åº“添加一个Program,atscMode
- */
-CTvProgram::CTvProgram(int channelID, int type, int major, int minor, int skipFlag)
-{
- CTvChannel channel;
- int ret = CTvChannel::selectByID(channelID, channel);
- if (ret != 0) {
- //Log.d(TAG, "Cannot add new program, invalid channel id "+channelID);
- this->id = -1;
- } else {
- CTvDatabase::Cursor c ;
- selectProgramInChannelByNumber(channelID, major, minor, c);
-
- if(c.moveToFirst()) {
- /*Construct*/
- CreateFromCursor(c);
- } else {
- String8 tpids = String8(""), ttypes = String8(""), tmagnums = String8(""), tpgnums = String8(""), tlangs = String8("");
- String8 spids = String8(""), stypes = String8(""), scpgids = String8(""), sapgids = String8(""), slangs = String8("");
-
- /*add a new atv program to database*/
- String8 cmd = String8("insert into srv_table(db_net_id,db_ts_id,service_id,src,name,service_type,");
- cmd += String8("eit_schedule_flag,eit_pf_flag,running_status,free_ca_mode,volume,aud_track,vid_pid,");
- cmd += String8("vid_fmt,aud_pids,aud_fmts,aud_langs,skip,lock,chan_num,major_chan_num,");
- cmd += String8("minor_chan_num,access_controlled,hidden,hide_guide,source_id,favor,current_aud,");
- cmd += String8("current_sub,sub_pids,sub_types,sub_composition_page_ids,sub_ancillary_page_ids,sub_langs,");
- cmd += String8("current_ttx,ttx_pids,ttx_types,ttx_magazine_nos,ttx_page_nos,ttx_langs,");
- cmd += String8("db_sat_para_id,scrambled_flag,lcn,hd_lcn,sd_lcn,default_chan_num,chan_order) ");
- cmd += String8("values(-1,") + String8::format("%d", channelID) + String8(",65535,") + String8::format("%d", channel.getMode()) + String8(",'',") + String8::format("%d", type) + String8(",");
- cmd += String8("0,0,0,0,0,0,8191,");
- int chanNum = major << 16 | minor;
- int majorNum = major;
- cmd += String8("-1,'','','',") + String8::format("%d", skipFlag) + String8(",0,") + String8::format("%d", chanNum) + String8(",") + String8::format("%d", majorNum) + String8(",");
- cmd += String8("") + String8::format("%d", minor) + String8(",0,0,0,-1,0,-1,");
- cmd += String8("-1,'") + spids + String8("','") + stypes + String8("','") + scpgids + String8("','") + sapgids + String8("','") + slangs + String8("',");
- cmd += String8("-1,'") + tpids + String8("','") + ttypes + String8("','") + tmagnums + String8("','") + tpgnums + String8("','") + tlangs + String8("',");
- cmd += String8("-1,0,-1,-1,-1,-1,0)");
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
- CTvDatabase::Cursor cr;
- selectProgramInChannelByNumber(channelID, major, minor, cr);
- if(cr.moveToFirst()) {
- /*Construct*/
- CreateFromCursor(cr);
- } else {
- /*A critical error*/
- //Log.d(TAG, "Cannot add new program, sqlite error");
- this->id = -1;
- }
- cr.close();
- }
- c.close();
- }
-
-}
-/**
- *æ ¹æ®è®°å½•ID查找指定TVProgram
-*/
-
-int CTvProgram::selectByID(int id, CTvProgram &prog)
-{
-
- CTvDatabase::Cursor c;
- String8 sql;
- sql = String8("select * from srv_table where srv_table.db_id = ") + String8::format("%d", id);
- CTvDatabase::GetTvDb()->select(sql.string(), c) ;
- if(c.moveToFirst()) {
- prog.CreateFromCursor(c);
- } else {
- c.close();
- return -1;
- }
- c.close();
- return 0;
-}
-
-int CTvProgram::updateVolComp(int progID, int volValue)
-{
- String8 cmd = String8("update srv_table set volume = ") + String8::format("%d", volValue) +
- String8(" where srv_table.db_id = ") + String8::format("%d", progID);
- LOGD("%s, cmd = %s\n", "TV", cmd.string());
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
- return 0;
-}
-
-int CTvProgram::getChannel(CTvChannel &c)
-{
- return CTvChannel::selectByID(channelID, c);
-}
-
-int CTvProgram::upDateChannel(CTvChannel &c, int std, int Freq, int fineFreq)
-{
- return CTvChannel::updateByID(channelID, std, Freq, fineFreq);
-}
-
-int CTvProgram::deleteChannelsProgram(CTvChannel &c)
-{
- String8 cmd;
- cmd = String8("delete from srv_table where srv_table.db_ts_id = ") + String8::format("%d", c.getID());
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
- return 0;
-}
-
-
-/**
- *æ ¹æ®èŠ‚目类型和节目å·æŸ¥æ‰¾æŒ‡å®šTVProgram
-*/
-int CTvProgram::selectByNumber(int type, int num, CTvProgram &prog)
-{
- String8 cmd;
-
- cmd = String8("select * from srv_table where ");
- if(type != TYPE_UNKNOWN) {
- if(type == TYPE_DTV) {
- cmd += String8("(service_type = ") + String8::format("%d", TYPE_TV) + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + String8(") and ");
- } else {
- cmd += String8("service_type = ") + String8::format("%d", type) + String8(" and ");
- }
- }
-
- cmd += String8("chan_num = ") + String8::format("%d", num);
-
- CTvDatabase::Cursor c;
- CTvDatabase::GetTvDb()->select(cmd, c);
-
- if(c.moveToFirst()) {
- prog.CreateFromCursor(c);
- } else {
- c.close();
- return -1;
- }
- c.close();
-
- return 0;
-}
-
-/**
- *æ ¹æ®èŠ‚目类型和节目å·æŸ¥æ‰¾æŒ‡å®šTVProgram
-*/
-int CTvProgram::selectByNumber(int type, int major, int minor, CTvProgram &prog, int minor_check)
-{
- String8 cmd;
-
- cmd = String8("select * from srv_table where ");
- if(type != TYPE_UNKNOWN) {
- if(type == TYPE_DTV) {
- cmd += String8("(service_type = ") + String8::format("%d", TYPE_TV) + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + String8(") and ");
- } else {
- cmd += String8("service_type = ") + String8::format("%d", type) + String8(" and ");
- }
- }
-
- if (minor < 0) {
- /*recursive call*/
- /*select dtv program first*/
- //showbo
- int ret = selectByNumber(TYPE_DTV, major, 1, prog, MINOR_CHECK_NEAREST_UP);
- if (ret != 0) {
- /*then try atv program*/
- selectByNumber(TYPE_ATV, major, 0 , prog, MINOR_CHECK_NONE);
- }
- return 0;
- } else if (minor >= 1) {
- if (minor_check == MINOR_CHECK_UP) {
- cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num >= ") + String8::format("%d", minor) + String8(" ");
- cmd += String8("order by minor_chan_num DESC limit 1");
- } else if (minor_check == MINOR_CHECK_DOWN) {
- cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num <= ") + String8::format("%d", minor) + String8(" ");
- cmd += String8("order by minor_chan_num limit 1");
- } else if (minor_check == MINOR_CHECK_NEAREST_UP) {
- cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num >= ") + String8::format("%d", minor) + String8(" ");
- cmd += String8("order by minor_chan_num limit 1");
- } else if (minor_check == MINOR_CHECK_NEAREST_DOWN) {
- cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num <= ") + String8::format("%d", minor) + String8(" ");
- cmd += String8("order by minor_chan_num DESC limit 1");
- } else {
- cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num = ") + String8::format("%d", minor);
- }
- } else {
- cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num = ") + String8::format("%d", minor);
- }
-
-
- CTvDatabase::Cursor c;
- CTvDatabase::GetTvDb()->select(cmd, c);
-
- if(c.moveToFirst()) {
- prog.CreateFromCursor(c);
- } else {
- c.close();
- return -1;
- }
- c.close();
-
- return 0;
-}
-
-
-/**
- *列出一个channel的全部TVProgram
- *@param channelID channel id
- *@param type 节目类型
- */
-int CTvProgram::selectByChannel(int channelID, int type, Vector<sp<CTvProgram> > &out)
-{
-
- //Vector<CTvProgram*> vp;
- String8 cmd = String8("select * from srv_table ");
-
-
- if(type == TYPE_DTV) {
- cmd += String8("where (service_type = ") + String8::format("%d", TYPE_TV) + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + String8(") ");
- } else if(type != TYPE_UNKNOWN) {
- cmd += String8("where service_type = ") + String8::format("%d", type) + String8(" ");
- }
-
- cmd += String8(" and db_ts_id = ") + String8::format("%d", channelID) + String8(" order by chan_order");
-
- CTvDatabase::Cursor c;
- int ret = CTvDatabase::GetTvDb()->select(cmd, c);
-
- LOGD("selectByChannel select ret = %d", ret);
-
- if(c.moveToFirst()) {
- do {
- out.add(new CTvProgram(c));
- } while(c.moveToNext());
- }
- c.close();
-
- return 0;
-}
-
-void CTvProgram::deleteProgram(int progId)
-{
- String8 cmd;
-
- cmd = String8("delete from srv_table where srv_table.db_id = ") + String8::format("%d", progId);
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-}
-
-int CTvProgram::CleanAllProgramBySrvType(int srvType)
-{
- String8 cmd = String8("delete from srv_table where service_type = ") + String8::format("%d", srvType);
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
- return 0;
-}
-
-int CTvProgram::selectByType(int type, int skip, Vector<sp<CTvProgram> > &out)
-{
- String8 cmd = String8("select * from srv_table ");
- LOGD("%s, type= %d\n", "TV", (int)type);
-
- if (type == TYPE_UNKNOWN) {
- cmd += String8("where (service_type = ") + String8::format("%d", TYPE_ATV) +
- String8(" or service_type = ") + String8::format("%d", TYPE_DTV) +
- String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) +
- String8(") ");
- } else {
- cmd += String8("where service_type = ") + String8::format("%d", type) + String8(" ");
- }
-
- if(skip == PROGRAM_SKIP_NO || skip == PROGRAM_SKIP_YES)
- cmd += String8(" and skip = ") + String8::format("%d", skip) + String8(" ");
-
- cmd += String8(" order by chan_order");
-
- CTvDatabase::Cursor c;
- int ret = CTvDatabase::GetTvDb()->select(cmd, c);
-
- LOGD("selectByChannel select ret = %d", ret);
-
- if(c.moveToFirst()) {
- do {
- out.add(new CTvProgram(c));
- } while(c.moveToNext());
- }
- c.close();
-
- return 0;
-}
-
-int CTvProgram::selectByChanID(int type, int skip, Vector < sp < CTvProgram > > &out)
-{
- String8 cmd = String8("select * from srv_table ");
-
- if (type == TYPE_UNKNOWN) {
- cmd += String8("where (service_type = ") + String8::format("%d", TYPE_ATV) +
- String8(" or service_type = ") + String8::format("%d", TYPE_DTV) +
- String8(") ");
- } else {
- cmd += String8("where service_type = ") + String8::format("%d", type) + String8(" ");
- }
-
- if(skip == PROGRAM_SKIP_NO || skip == PROGRAM_SKIP_YES)
- cmd += String8(" and skip = ") + String8::format("%d", PROGRAM_SKIP_NO) +
- String8(" or skip = ") + String8::format("%d", PROGRAM_SKIP_YES) + String8(" ");
-
- cmd += String8(" order by db_id");
-
- CTvDatabase::Cursor c;
- int ret = CTvDatabase::GetTvDb()->select(cmd, c);
-
- if(c.moveToFirst()) {
- do {
- out.add(new CTvProgram(c));
- } while(c.moveToNext());
- }
- c.close();
-
- return 0;
-
-}
-
-int CTvProgram::selectAll(bool no_skip, Vector<sp<CTvProgram> > &out)
-{
- return selectByType(TYPE_UNKNOWN, no_skip, out);
-}
-
-Vector<CTvProgram> CTvProgram::selectByChannel(int channelID)
-{
- Vector<CTvProgram> vProg;
- return vProg;
-}
-
-Vector<CTvProgram> CTvProgram::selectByName(int name)
-{
- Vector<CTvProgram> vProg;
- return vProg;
-}
-
-void CTvProgram::tvProgramDelByChannelID(int channelID)
-{
-
-}
-
-
-String8 CTvProgram::getName()
-{
- return name;
-}
-int CTvProgram::getProgSkipFlag()
-{
- return skip;
-}
-
-/**
- *å–得当å‰çš„audio索引
- *@param defaultLang 用户未选择语言时,默认的全局语言
- *@return 当å‰çš„Audio索引
- */
-int CTvProgram::getCurrentAudio(String8 defaultLang)
-{
- CTvDatabase::Cursor c;
- String8 cmd;
- cmd = String8("select current_aud from srv_table where db_id = ") + String8::format("%d", this->id);
- int ret = CTvDatabase::GetTvDb()->select(cmd, c);
- LOGD("getCurrentAudio a size = %d", mvAudios.size());
- int id = 0;
- if(c.moveToFirst()) {
- id = c.getInt(0);
- LOGD("getCurrentAudio a id = %d", id);
- if (id < 0 && mvAudios.size() > 0) {
- LOGD("getCurrentAudio defaultLang.isEmpty() =%s= %d", defaultLang.string(), defaultLang.isEmpty());
- if(!defaultLang.isEmpty()) {
- for(int i = 0; i < mvAudios.size(); i++) {
- LOGD("getCurrentAudio a mvAudios[i] = %d", mvAudios[i]);
- if(mvAudios[i]->getLang() == defaultLang) {
- id = i;
- break;
- }
- }
- }
-
- if (id < 0) {
- /* still not found, using the first */
- id = 0;
- }
- }
- }
- LOGD("getCurrentAudio a idsss = %d", id);
- c.close();
-
- return id;
-}
-
-int CTvProgram::getCurrAudioTrackIndex()
-{
- int audTrackIdx = -1;
-
- if(-1 == currAudTrackIndex) { // no set field "current_aud"
- audTrackIdx = getCurrentAudio(String8("eng"));
- setCurrAudioTrackIndex(this->id, audTrackIdx);
- } else {
- audTrackIdx = currAudTrackIndex;
- }
-
- return audTrackIdx;
-}
-
-
-void CTvProgram::setCurrAudioTrackIndex(int programId, int audioIndex)
-{
- String8 cmd;
-
- cmd = String8("update srv_table set current_aud = ")
- + String8::format("%d", audioIndex) + String8(" where srv_table.db_id = ") + String8::format("%d", programId);
-
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-}
-
-void CTvProgram::setFavoriteFlag(int progId, bool bFavor)
-{
- String8 cmd;
-
- cmd = String8("update srv_table set favor = ")
- + String8::format("%d", bFavor ? 1 : 0) + String8(" where srv_table.db_id = ") + String8::format("%d", progId);
-
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
-}
-
-void CTvProgram::setSkipFlag(int progId, bool bSkipFlag)
-{
- String8 cmd;
-
- cmd = String8("update srv_table set skip = ") + String8::format("%d", bSkipFlag ? 1 : 0)
- + String8(" where srv_table.db_id = ") + String8::format("%d", progId);
-
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-}
-
-void CTvProgram::updateProgramName(int progId, String8 strName)
-{
- String8 newName = String8("xxx") + strName;
- String8 cmd;
-
- cmd = String8("update srv_table set name =") + "\'" + String8::format("%s", newName.string()) + "\'"
- + String8(" where srv_table.db_id = ") + String8::format("%d", progId);
-
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-}
-
-void CTvProgram::swapChanOrder(int ProgId1, int chanOrderNum1, int ProgId2, int chanOrderNum2)
-{
- String8 cmd;
-
- cmd = String8("update srv_table set chan_order = ") + String8::format("%d", chanOrderNum2)
- + String8(" where db_id = ") + String8::format("%d", ProgId1);
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-
- String8 cmd2;
- cmd2 = String8("update srv_table set chan_order = ") + String8::format("%d", chanOrderNum1)
- + String8(" where db_id = ") + String8::format("%d", ProgId2);
- CTvDatabase::GetTvDb()->exeSql(cmd2.string());
-}
-
-
-void CTvProgram::setLockFlag(int progId, bool bLockFlag)
-{
- String8 cmd;
-
- cmd = String8("update srv_table set lock = ") + String8::format("%d", bLockFlag ? 1 : 0)
- + String8(" where srv_table.db_id = ") + String8::format("%d", progId);
-
- CTvDatabase::GetTvDb()->exeSql(cmd.string());
-}
-bool CTvProgram::getLockFlag()
-{
- return lock;
-}
-
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvProgram.cpp
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#include "CTvProgram.h"
+#include "CTvDatabase.h"
+#include "CTvChannel.h"
+#include "CTvEvent.h"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "CTvProgram"
+#endif
+
+CTvProgram::CTvProgram(CTvDatabase::Cursor &c)
+{
+ CreateFromCursor(c);
+}
+
+CTvProgram::~CTvProgram()
+{
+ //free mem
+ // video
+ if (mpVideo != NULL) delete mpVideo;
+ // audios
+ int size = mvAudios.size();
+ for (int i = 0; i < size; i++)
+ delete mvAudios[i];
+ // subtitles
+ size = mvSubtitles.size();
+ for (int i = 0; i < size; i++)
+ delete mvSubtitles[i];
+ // teletexts
+ size = mvTeletexts.size();
+ for (int i = 0; i < size; i++)
+ delete mvTeletexts[i];
+}
+
+CTvProgram::CTvProgram(int channelID, int type)
+{
+ mpVideo = NULL;
+}
+
+CTvProgram::CTvProgram()
+{
+ mpVideo = NULL;
+}
+int CTvProgram::CreateFromCursor(CTvDatabase::Cursor &c)
+{
+ int i = 0;
+ int col;
+ int num, type;
+ int major, minor;
+ char tmp_buf[256];
+ //LOGD("CTvProgram::CreateFromCursor");
+ col = c.getColumnIndex("db_id");
+ this->id = c.getInt(col);
+
+ col = c.getColumnIndex("source_id");
+ this->sourceID = c.getInt(col);
+
+ col = c.getColumnIndex("src");
+ this->src = c.getInt(col);
+
+ col = c.getColumnIndex("service_id");
+ this->dvbServiceID = c.getInt(col);
+
+ col = c.getColumnIndex("db_ts_id");
+ this->channelID = c.getInt(col);
+
+ col = c.getColumnIndex("name");
+ this->name = c.getString(col);
+
+ col = c.getColumnIndex("chan_num");
+ num = c.getInt(col);
+
+ col = c.getColumnIndex("chan_order");
+ this->chanOrderNum = c.getInt(col);
+
+ col = c.getColumnIndex("major_chan_num");
+ major = c.getInt(col);
+
+ col = c.getColumnIndex("minor_chan_num");
+ minor = c.getInt(col);
+
+ col = c.getColumnIndex("aud_track");
+ this->audioTrack = c.getInt(col);
+
+ //节目å·ä¿¡æ¯åˆ??
+ if (src == CTvChannel::MODE_ATSC || (src == CTvChannel::MODE_ANALOG && major > 0)) {
+ this->major = major;
+ this->minor = minor;
+ this->atscMode = true;
+ this->minorCheck = MINOR_CHECK_NONE;
+ } else {
+ this->major = num;
+ this->minor = 0;
+ this->atscMode = false;
+ this->minorCheck = MINOR_CHECK_NONE;
+ }
+
+ col = c.getColumnIndex("service_type");
+ this->type = c.getInt(col);
+
+ col = c.getColumnIndex("pmt_pid");
+ pmtPID = c.getInt(col);
+
+ //LOGD("CTvProgram::CreateFromCursor type = %d", this->type);
+ col = c.getColumnIndex("skip");
+ this->skip = c.getInt(col);
+
+ col = c.getColumnIndex("lock");
+ this->lock = (c.getInt(col) != 0);
+
+ col = c.getColumnIndex("scrambled_flag");
+ this->scrambled = (c.getInt(col) != 0);
+
+ col = c.getColumnIndex("favor");
+ this->favorite = (c.getInt(col) != 0);
+
+ col = c.getColumnIndex("volume");
+ this->volume = c.getInt(col);
+
+ //Video
+ int pid, fmt;
+ col = c.getColumnIndex("vid_pid");
+ pid = c.getInt(col);
+
+ col = c.getColumnIndex("vid_fmt");
+ fmt = c.getInt(col);
+
+ //LOGD("----------vpid = %d", pid);
+ this->mpVideo = new Video(pid, fmt);
+ //LOGD("----------vpid = %d", this->mpVideo->getPID());
+
+
+ //Audio
+ String8 strPids;
+ String8 strFmts;
+ String8 strLangs;
+ int count = 0;
+ col = c.getColumnIndex("aud_pids");
+ strPids = c.getString(col);
+
+ col = c.getColumnIndex("aud_fmts");
+ strFmts = c.getString(col);
+
+ col = c.getColumnIndex("aud_langs");
+ strLangs = c.getString(col);
+ col = c.getColumnIndex("current_aud");
+ this->currAudTrackIndex = c.getInt(col);
+
+ char *tmp;
+ Vector<String8> vpid ;
+ Vector<String8> vfmt ;
+ Vector<String8> vlang;
+
+ char *pSave;
+ tmp = strtok_r(strPids.lockBuffer(strPids.length()), " ", &pSave);
+ while (tmp != NULL) {
+ vpid.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ strPids.unlockBuffer();
+
+ tmp = strtok_r(strFmts.lockBuffer(strFmts.length()), " ", &pSave);
+ while (tmp != NULL) {
+ vfmt.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ strFmts.unlockBuffer();
+
+ tmp = strtok_r(strLangs.lockBuffer(strLangs.length()), " ", &pSave);
+
+ while (tmp != NULL) {
+ vlang.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ strLangs.unlockBuffer();
+
+ //check empty aud_langs
+ for (i = vlang.size(); i < vpid.size(); i++) {
+ sprintf(tmp_buf, "Audio%d", i + 1);
+ vlang.push_back(String8(tmp_buf));
+ LOGE("%s, aud_langs is empty, add dummy data (%s).\n", "TV", tmp_buf);
+ }
+
+ //String8 l(vlang[i]);
+ for (i = 0; i < vpid.size(); i++) {
+ int i_pid = atoi(vpid[i]);
+ int i_fmt = atoi(vfmt[i]);
+ mvAudios.push_back(new Audio(i_pid, vlang[i], i_fmt));
+ }
+
+
+
+ /* parse subtitles */
+ vpid.clear();
+ vlang.clear();
+ Vector<String8> vcid;
+ Vector<String8> vaid;
+ String8 strCids;
+ String8 strAids;
+
+ col = c.getColumnIndex("sub_pids");
+ strPids = c.getString(col);
+
+ col = c.getColumnIndex("sub_composition_page_ids");
+ strCids = c.getString(col);
+
+ col = c.getColumnIndex("sub_ancillary_page_ids");
+ strAids = c.getString(col);
+
+
+ col = c.getColumnIndex("sub_langs");
+ strLangs = c.getString(col);
+
+ tmp = strtok_r(strPids.lockBuffer(strPids.length()), " ", &pSave);
+ while (tmp != NULL) {
+ vpid.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ strPids.unlockBuffer();
+
+ tmp = strtok_r(strCids.lockBuffer(strCids.length()), " ", &pSave);
+ while (tmp != NULL) {
+ vcid.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ strCids.unlockBuffer();
+
+ tmp = strtok_r(strAids.lockBuffer(strAids.length()), " ", &pSave);
+ while (tmp != NULL) {
+ vaid.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ strAids.unlockBuffer();
+
+ tmp = strtok_r(strLangs.lockBuffer(strLangs.length()), " ", &pSave);
+ while (tmp != NULL) {
+ vlang.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ strLangs.unlockBuffer();
+
+ //Subtitle
+ for (int i = 0; i < vpid.size(); i++) {
+ this->mvSubtitles.push_back(new Subtitle(
+ atoi(vpid[i]),
+ String8(vlang[i]), Subtitle::TYPE_DVB_SUBTITLE,
+ atoi(vcid[i]),
+ atoi(vaid[i])));
+ }
+
+ /*
+ parse teletexts
+ int ttx_count = 0, ttx_sub_count = 0;
+ String8 str_ttx_pids, str_ttx_types, str_mag_nos, str_page_nos, str_ttx_langs;
+ Vector<String8> v_ttx_pids, v_ttx_types, v_mag_nos, v_page_nos, v_ttx_langs;
+ col = c.getColumnIndex("ttx_pids");
+ str_ttx_pids = c.getString(col);
+
+ col = c.getColumnIndex("ttx_types");
+ str_ttx_types = c.getString(col);
+
+ col = c.getColumnIndex("ttx_magazine_nos");
+ str_mag_nos = c.getString(col);
+
+ col = c.getColumnIndex("ttx_page_nos");
+ str_page_nos = c.getString(col);
+
+ col = c.getColumnIndex("ttx_langs");
+ str_ttx_langs = c.getString(col);
+
+ tmp = strtok_r(str_ttx_pids.lockBuffer(str_ttx_pids.length()), " ", &pSave);
+ while (tmp != NULL) {
+ v_ttx_pids.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ str_ttx_pids.unlockBuffer();
+
+ tmp = strtok_r(str_ttx_types.lockBuffer(str_ttx_types.length()), " ", &pSave);
+ while (tmp != NULL) {
+ v_ttx_types.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ str_ttx_types.unlockBuffer();
+
+ tmp = strtok_r(str_mag_nos.lockBuffer(str_mag_nos.length()), " ", &pSave);
+ while (tmp != NULL) {
+ v_mag_nos.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ str_mag_nos.unlockBuffer();
+
+ tmp = strtok_r(str_page_nos.lockBuffer(str_page_nos.length()), " ", &pSave);
+ while (tmp != NULL) {
+ v_page_nos.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ str_page_nos.unlockBuffer();
+
+ tmp = strtok_r(str_ttx_langs.lockBuffer(str_ttx_langs.length()), " ", &pSave);
+ while (tmp != NULL) {
+ v_ttx_langs.push_back(String8(tmp));
+ tmp = strtok_r(NULL, " ", &pSave);
+ }
+ str_ttx_langs.unlockBuffer();
+
+
+ for (int i = 0; i < v_ttx_pids.size(); i++) {
+ int ttype = atoi(v_ttx_types[i]);
+ if (ttype == 0x2 || ttype == 0x5) {
+ this->mvSubtitles.push_back(new Subtitle(
+ atoi(v_ttx_pids[i].string()),
+ String8(v_ttx_langs[i]), Subtitle::TYPE_DTV_TELETEXT,
+ atoi(v_mag_nos[i]),
+ atoi(v_page_nos[i])));
+ } else {
+ this->mvTeletexts.push_back(new Teletext(
+ atoi(v_ttx_pids[i]),
+ String8(v_ttx_langs[i]),
+ atoi(v_mag_nos[i]),
+ atoi(v_page_nos[i])));
+ }
+ }
+ */
+ return 0;
+}
+
+int CTvProgram::selectProgramInChannelByNumber(int channelID, int num, CTvDatabase::Cursor &c)
+{
+ String8 cmd = String8("select * from srv_table where db_ts_id = ") + String8::format("%d", channelID) + String8(" and ");
+ cmd += String8("chan_num = ") + String8::format("%d", num);
+ return CTvDatabase::GetTvDb()->select(cmd, c);
+}
+
+
+int CTvProgram::selectProgramInChannelByNumber(int channelID, int major, int minor, CTvDatabase::Cursor &c)
+{
+ String8 cmd = String8("select * from srv_table where db_ts_id = ") + String8::format("%d", channelID) + String8(" and ");
+ cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num = ") + String8::format("%d", minor);
+
+ return CTvDatabase::GetTvDb()->select(cmd, c);
+}
+
+/**
+ *å‘æ•°æ®åº“添加一个Program,not atscMode
+ */
+CTvProgram::CTvProgram(int channelID, int type, int num, int skipFlag)
+{
+ CTvChannel channel;
+ int ret = CTvChannel::selectByID(channelID, channel);
+ if (ret != 0) {
+ //Log.d(TAG, "Cannot add new program, invalid channel id "+channelID);
+ this->id = -1;
+ } else {
+ CTvDatabase::Cursor c ;
+ selectProgramInChannelByNumber(channelID, num, c);
+
+ if (c.moveToFirst()) {
+ /*Construct*/
+ CreateFromCursor(c);
+ } else {
+ String8 tpids = String8(""), ttypes = String8(""), tmagnums = String8(""), tpgnums = String8(""), tlangs = String8("");
+ String8 spids = String8(""), stypes = String8(""), scpgids = String8(""), sapgids = String8(""), slangs = String8("");
+
+ /*add a new atv program to database*/
+ String8 cmd = String8("insert into srv_table(db_net_id,db_ts_id,service_id,src,name,service_type,");
+ cmd += String8("eit_schedule_flag,eit_pf_flag,running_status,free_ca_mode,volume,aud_track,vid_pid,");
+ cmd += String8("vid_fmt,aud_pids,aud_fmts,aud_langs,skip,lock,chan_num,major_chan_num,");
+ cmd += String8("minor_chan_num,access_controlled,hidden,hide_guide,source_id,favor,current_aud,");
+ cmd += String8("current_sub,sub_pids,sub_types,sub_composition_page_ids,sub_ancillary_page_ids,sub_langs,");
+ cmd += String8("current_ttx,ttx_pids,ttx_types,ttx_magazine_nos,ttx_page_nos,ttx_langs,");
+ cmd += String8("db_sat_para_id,scrambled_flag,lcn,hd_lcn,sd_lcn,default_chan_num,chan_order) ");
+ cmd += String8("values(-1,") + String8::format("%d", channelID) + String8(",65535,") + String8::format("%d", channel.getMode()) + String8(",'',") + String8::format("%d", type) + String8(",");
+ cmd += String8("0,0,0,0,0,0,8191,");
+ int chanNum = num;
+ int majorNum = 0;
+ cmd += String8("-1,'','','',") + String8::format("%d", skipFlag) + String8(",0,") + String8::format("%d", chanNum) + String8(",") + String8::format("%d", majorNum) + String8(",");
+ cmd += String8("") + /*num.getMinor()*/String8("0") + String8(",0,0,0,-1,0,-1,");
+ cmd += String8("-1,'") + spids + String8("','") + stypes + String8("','") + scpgids + String8("','") + sapgids + String8("','") + slangs + String8("',");
+ cmd += String8("-1,'") + tpids + String8("','") + ttypes + String8("','") + tmagnums + String8("','") + tpgnums + String8("','") + tlangs + String8("',");
+ cmd += String8("-1,0,-1,-1,-1,-1,0)");
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+ CTvDatabase::Cursor cr;
+ selectProgramInChannelByNumber(channelID, num, cr);
+ if (cr.moveToFirst()) {
+ /*Construct*/
+ CreateFromCursor(cr);
+ } else {
+ /*A critical error*/
+ //Log.d(TAG, "Cannot add new program, sqlite error");
+ this->id = -1;
+ }
+ cr.close();
+ }
+ c.close();
+ }
+
+}
+
+
+/**
+ *å‘æ•°æ®åº“添加一个Program,atscMode
+ */
+CTvProgram::CTvProgram(int channelID, int type, int major, int minor, int skipFlag)
+{
+ CTvChannel channel;
+ int ret = CTvChannel::selectByID(channelID, channel);
+ if (ret != 0) {
+ //Log.d(TAG, "Cannot add new program, invalid channel id "+channelID);
+ this->id = -1;
+ } else {
+ CTvDatabase::Cursor c ;
+ selectProgramInChannelByNumber(channelID, major, minor, c);
+
+ if (c.moveToFirst()) {
+ /*Construct*/
+ CreateFromCursor(c);
+ } else {
+ String8 tpids = String8(""), ttypes = String8(""), tmagnums = String8(""), tpgnums = String8(""), tlangs = String8("");
+ String8 spids = String8(""), stypes = String8(""), scpgids = String8(""), sapgids = String8(""), slangs = String8("");
+
+ /*add a new atv program to database*/
+ String8 cmd = String8("insert into srv_table(db_net_id,db_ts_id,service_id,src,name,service_type,");
+ cmd += String8("eit_schedule_flag,eit_pf_flag,running_status,free_ca_mode,volume,aud_track,vid_pid,");
+ cmd += String8("vid_fmt,aud_pids,aud_fmts,aud_langs,skip,lock,chan_num,major_chan_num,");
+ cmd += String8("minor_chan_num,access_controlled,hidden,hide_guide,source_id,favor,current_aud,");
+ cmd += String8("current_sub,sub_pids,sub_types,sub_composition_page_ids,sub_ancillary_page_ids,sub_langs,");
+ cmd += String8("current_ttx,ttx_pids,ttx_types,ttx_magazine_nos,ttx_page_nos,ttx_langs,");
+ cmd += String8("db_sat_para_id,scrambled_flag,lcn,hd_lcn,sd_lcn,default_chan_num,chan_order) ");
+ cmd += String8("values(-1,") + String8::format("%d", channelID) + String8(",65535,") + String8::format("%d", channel.getMode()) + String8(",'',") + String8::format("%d", type) + String8(",");
+ cmd += String8("0,0,0,0,0,0,8191,");
+ int chanNum = major << 16 | minor;
+ int majorNum = major;
+ cmd += String8("-1,'','','',") + String8::format("%d", skipFlag) + String8(",0,") + String8::format("%d", chanNum) + String8(",") + String8::format("%d", majorNum) + String8(",");
+ cmd += String8("") + String8::format("%d", minor) + String8(",0,0,0,-1,0,-1,");
+ cmd += String8("-1,'") + spids + String8("','") + stypes + String8("','") + scpgids + String8("','") + sapgids + String8("','") + slangs + String8("',");
+ cmd += String8("-1,'") + tpids + String8("','") + ttypes + String8("','") + tmagnums + String8("','") + tpgnums + String8("','") + tlangs + String8("',");
+ cmd += String8("-1,0,-1,-1,-1,-1,0)");
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+ CTvDatabase::Cursor cr;
+ selectProgramInChannelByNumber(channelID, major, minor, cr);
+ if (cr.moveToFirst()) {
+ /*Construct*/
+ CreateFromCursor(cr);
+ } else {
+ /*A critical error*/
+ //Log.d(TAG, "Cannot add new program, sqlite error");
+ this->id = -1;
+ }
+ cr.close();
+ }
+ c.close();
+ }
+
+}
+/**
+ *æ ¹æ®è®°å½•ID查找指定TVProgram
+*/
+
+int CTvProgram::selectByID(int id, CTvProgram &prog)
+{
+
+ CTvDatabase::Cursor c;
+ String8 sql;
+ sql = String8("select * from srv_table where srv_table.db_id = ") + String8::format("%d", id);
+ CTvDatabase::GetTvDb()->select(sql.string(), c) ;
+ if (c.moveToFirst()) {
+ prog.CreateFromCursor(c);
+ } else {
+ c.close();
+ return -1;
+ }
+ c.close();
+ return 0;
+}
+
+int CTvProgram::updateVolComp(int progID, int volValue)
+{
+ String8 cmd = String8("update srv_table set volume = ") + String8::format("%d", volValue) +
+ String8(" where srv_table.db_id = ") + String8::format("%d", progID);
+ LOGD("%s, cmd = %s\n", "TV", cmd.string());
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+ return 0;
+}
+
+int CTvProgram::getChannel(CTvChannel &c)
+{
+ return CTvChannel::selectByID(channelID, c);
+}
+
+int CTvProgram::upDateChannel(CTvChannel &c, int std, int Freq, int fineFreq)
+{
+ return CTvChannel::updateByID(channelID, std, Freq, fineFreq);
+}
+
+int CTvProgram::deleteChannelsProgram(CTvChannel &c)
+{
+ String8 cmd;
+ cmd = String8("delete from srv_table where srv_table.db_ts_id = ") + String8::format("%d", c.getID());
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+ return 0;
+}
+
+
+/**
+ *æ ¹æ®èŠ‚目类型和节目å·æŸ¥æ‰¾æŒ‡å®šTVProgram
+*/
+int CTvProgram::selectByNumber(int type, int num, CTvProgram &prog)
+{
+ String8 cmd;
+
+ cmd = String8("select * from srv_table where ");
+ if (type != TYPE_UNKNOWN) {
+ if (type == TYPE_DTV) {
+ cmd += String8("(service_type = ") + String8::format("%d", TYPE_DTV) + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + String8(") and ");
+ } else {
+ cmd += String8("service_type = ") + String8::format("%d", type) + String8(" and ");
+ }
+ }
+
+ cmd += String8("chan_num = ") + String8::format("%d", num);
+
+ CTvDatabase::Cursor c;
+ CTvDatabase::GetTvDb()->select(cmd, c);
+
+ if (c.moveToFirst()) {
+ prog.CreateFromCursor(c);
+ } else {
+ c.close();
+ return -1;
+ }
+ c.close();
+
+ return 0;
+}
+
+/**
+ *æ ¹æ®èŠ‚目类型和节目å·æŸ¥æ‰¾æŒ‡å®šTVProgram
+*/
+int CTvProgram::selectByNumber(int type, int major, int minor, CTvProgram &prog, int minor_check)
+{
+ String8 cmd;
+
+ cmd = String8("select * from srv_table where ");
+ if (type != TYPE_UNKNOWN) {
+ if (type == TYPE_DTV) {
+ cmd += String8("(service_type = ") + String8::format("%d", TYPE_TV) + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + String8(") and ");
+ } else {
+ cmd += String8("service_type = ") + String8::format("%d", type) + String8(" and ");
+ }
+ }
+
+ if (minor < 0) {
+ /*recursive call*/
+ /*select dtv program first*/
+ //showbo
+ int ret = selectByNumber(TYPE_DTV, major, 1, prog, MINOR_CHECK_NEAREST_UP);
+ if (ret != 0) {
+ /*then try atv program*/
+ selectByNumber(TYPE_ATV, major, 0 , prog, MINOR_CHECK_NONE);
+ }
+ return 0;
+ } else if (minor >= 1) {
+ if (minor_check == MINOR_CHECK_UP) {
+ cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num >= ") + String8::format("%d", minor) + String8(" ");
+ cmd += String8("order by minor_chan_num DESC limit 1");
+ } else if (minor_check == MINOR_CHECK_DOWN) {
+ cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num <= ") + String8::format("%d", minor) + String8(" ");
+ cmd += String8("order by minor_chan_num limit 1");
+ } else if (minor_check == MINOR_CHECK_NEAREST_UP) {
+ cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num >= ") + String8::format("%d", minor) + String8(" ");
+ cmd += String8("order by minor_chan_num limit 1");
+ } else if (minor_check == MINOR_CHECK_NEAREST_DOWN) {
+ cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num <= ") + String8::format("%d", minor) + String8(" ");
+ cmd += String8("order by minor_chan_num DESC limit 1");
+ } else {
+ cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num = ") + String8::format("%d", minor);
+ }
+ } else {
+ cmd += String8("major_chan_num = ") + String8::format("%d", major) + String8(" and minor_chan_num = ") + String8::format("%d", minor);
+ }
+
+
+ CTvDatabase::Cursor c;
+ CTvDatabase::GetTvDb()->select(cmd, c);
+
+ if (c.moveToFirst()) {
+ prog.CreateFromCursor(c);
+ } else {
+ c.close();
+ return -1;
+ }
+ c.close();
+
+ return 0;
+}
+
+
+/**
+ *列出一个channel的全部TVProgram
+ *@param channelID channel id
+ *@param type 节目类型
+ */
+int CTvProgram::selectByChannel(int channelID, int type, Vector<sp<CTvProgram> > &out)
+{
+
+ //Vector<CTvProgram*> vp;
+ String8 cmd = String8("select * from srv_table ");
+
+
+ if (type == TYPE_DTV) {
+ cmd += String8("where (service_type = ") + String8::format("%d", TYPE_TV) + String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) + String8(") ");
+ } else if (type != TYPE_UNKNOWN) {
+ cmd += String8("where service_type = ") + String8::format("%d", type) + String8(" ");
+ }
+
+ cmd += String8(" and db_ts_id = ") + String8::format("%d", channelID) + String8(" order by chan_order");
+
+ CTvDatabase::Cursor c;
+ int ret = CTvDatabase::GetTvDb()->select(cmd, c);
+
+ LOGD("selectByChannel select ret = %d", ret);
+
+ if (c.moveToFirst()) {
+ do {
+ out.add(new CTvProgram(c));
+ } while (c.moveToNext());
+ }
+ c.close();
+
+ return 0;
+}
+
+void CTvProgram::deleteProgram(int progId)
+{
+ String8 cmd;
+
+ cmd = String8("delete from srv_table where srv_table.db_id = ") + String8::format("%d", progId);
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+}
+
+int CTvProgram::CleanAllProgramBySrvType(int srvType)
+{
+ String8 cmd = String8("delete from srv_table where service_type = ") + String8::format("%d", srvType);
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+ return 0;
+}
+
+int CTvProgram::selectByType(int type, int skip, Vector<sp<CTvProgram> > &out)
+{
+ String8 cmd = String8("select * from srv_table ");
+ LOGD("%s, type= %d\n", "TV", (int)type);
+
+ if (type == TYPE_UNKNOWN) {
+ cmd += String8("where (service_type = ") + String8::format("%d", TYPE_ATV) +
+ String8(" or service_type = ") + String8::format("%d", TYPE_DTV) +
+ String8(" or service_type = ") + String8::format("%d", TYPE_RADIO) +
+ String8(") ");
+ } else {
+ cmd += String8("where service_type = ") + String8::format("%d", type) + String8(" ");
+ }
+
+ if (skip == PROGRAM_SKIP_NO || skip == PROGRAM_SKIP_YES)
+ cmd += String8(" and skip = ") + String8::format("%d", skip) + String8(" ");
+
+ if (type == TYPE_DTV || type == TYPE_RADIO) {
+ cmd += String8(" order by db_ts_id");
+ } else {
+ cmd += String8(" order by chan_order");
+ }
+
+ CTvDatabase::Cursor c;
+ int ret = CTvDatabase::GetTvDb()->select(cmd, c);
+
+ LOGD("selectByType select ret = %d", ret);
+
+ if (c.moveToFirst()) {
+ do {
+ out.add(new CTvProgram(c));
+ } while (c.moveToNext());
+ }
+ c.close();
+
+ return 0;
+}
+
+int CTvProgram::selectByChanID(int type, int skip, Vector < sp < CTvProgram > > &out)
+{
+ String8 cmd = String8("select * from srv_table ");
+
+ if (type == TYPE_UNKNOWN) {
+ cmd += String8("where (service_type = ") + String8::format("%d", TYPE_ATV) +
+ String8(" or service_type = ") + String8::format("%d", TYPE_DTV) +
+ String8(") ");
+ } else {
+ cmd += String8("where service_type = ") + String8::format("%d", type) + String8(" ");
+ }
+
+ if (skip == PROGRAM_SKIP_NO || skip == PROGRAM_SKIP_YES)
+ cmd += String8(" and skip = ") + String8::format("%d", PROGRAM_SKIP_NO) +
+ String8(" or skip = ") + String8::format("%d", PROGRAM_SKIP_YES) + String8(" ");
+
+ cmd += String8(" order by db_id");
+
+ CTvDatabase::Cursor c;
+ int ret = CTvDatabase::GetTvDb()->select(cmd, c);
+
+ if (c.moveToFirst()) {
+ do {
+ out.add(new CTvProgram(c));
+ } while (c.moveToNext());
+ }
+ c.close();
+
+ return 0;
+
+}
+
+int CTvProgram::selectAll(bool no_skip, Vector<sp<CTvProgram> > &out)
+{
+ return selectByType(TYPE_UNKNOWN, no_skip, out);
+}
+
+Vector<CTvProgram> CTvProgram::selectByChannel(int channelID)
+{
+ Vector<CTvProgram> vProg;
+ return vProg;
+}
+
+Vector<CTvProgram> CTvProgram::selectByName(int name)
+{
+ Vector<CTvProgram> vProg;
+ return vProg;
+}
+
+void CTvProgram::tvProgramDelByChannelID(int channelID)
+{
+
+}
+
+
+String8 CTvProgram::getName()
+{
+ return name;
+}
+int CTvProgram::getProgSkipFlag()
+{
+ return skip;
+}
+
+/**
+ *å–得当å‰çš„audio索引
+ *@param defaultLang 用户未选择语言时,默认的全局语言
+ *@return 当å‰çš„Audio索引
+ */
+int CTvProgram::getCurrentAudio(String8 defaultLang)
+{
+ CTvDatabase::Cursor c;
+ String8 cmd;
+ cmd = String8("select current_aud from srv_table where db_id = ") + String8::format("%d", this->id);
+ int ret = CTvDatabase::GetTvDb()->select(cmd, c);
+ LOGD("getCurrentAudio a size = %d", mvAudios.size());
+ int id = 0;
+ if (c.moveToFirst()) {
+ id = c.getInt(0);
+ LOGD("getCurrentAudio a id = %d", id);
+ if (id < 0 && mvAudios.size() > 0) {
+ LOGD("getCurrentAudio defaultLang.isEmpty() =%s= %d", defaultLang.string(), defaultLang.isEmpty());
+ if (!defaultLang.isEmpty()) {
+ for (int i = 0; i < mvAudios.size(); i++) {
+ LOGD("getCurrentAudio a mvAudios[i] = %d", mvAudios[i]);
+ if (mvAudios[i]->getLang() == defaultLang) {
+ id = i;
+ break;
+ }
+ }
+ }
+
+ if (id < 0) {
+ /* still not found, using the first */
+ id = 0;
+ }
+ }
+ }
+ LOGD("getCurrentAudio a idsss = %d", id);
+ c.close();
+
+ return id;
+}
+
+int CTvProgram::getAudioChannel()
+{
+ return audioTrack;
+}
+
+int CTvProgram::updateAudioChannel(int progId, int ch)
+{
+ String8 cmd;
+
+ cmd = String8("update srv_table set aud_track =") + "\'" + String8::format("%d", ch) + "\'"
+ + String8(" where srv_table.db_id = ") + String8::format("%d", progId);
+
+ return CTvDatabase::GetTvDb()->exeSql(cmd.string());
+}
+
+int CTvProgram::getSubtitleIndex(int progId)
+{
+ CTvDatabase::Cursor c;
+ String8 cmd = String8("select current_sub from srv_table where db_id = ") + String8::format("%d", progId);
+ int ret = CTvDatabase::GetTvDb()->select(cmd, c);
+ if (c.moveToFirst()) {
+ return c.getInt(0);
+ } else {
+ return -1;
+ }
+}
+
+int CTvProgram::setSubtitleIndex(int progId, int index)
+{
+ String8 cmd = String8("update srv_table set current_sub = ") + String8::format("%d", index) + String8(" where db_id = ") + String8::format("%d", progId);
+ return CTvDatabase::GetTvDb()->exeSql(cmd.string());
+}
+
+int CTvProgram::getCurrAudioTrackIndex()
+{
+ int audTrackIdx = -1;
+
+ if (-1 == currAudTrackIndex) { // no set field "current_aud"
+ audTrackIdx = getCurrentAudio(String8("eng"));
+ setCurrAudioTrackIndex(this->id, audTrackIdx);
+ } else {
+ audTrackIdx = currAudTrackIndex;
+ }
+
+ return audTrackIdx;
+}
+
+
+void CTvProgram::setCurrAudioTrackIndex(int programId, int audioIndex)
+{
+ String8 cmd;
+
+ cmd = String8("update srv_table set current_aud = ")
+ + String8::format("%d", audioIndex) + String8(" where srv_table.db_id = ") + String8::format("%d", programId);
+
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+}
+
+void CTvProgram::setFavoriteFlag(int progId, bool bFavor)
+{
+ String8 cmd;
+
+ cmd = String8("update srv_table set favor = ")
+ + String8::format("%d", bFavor ? 1 : 0) + String8(" where srv_table.db_id = ") + String8::format("%d", progId);
+
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+}
+
+void CTvProgram::setSkipFlag(int progId, bool bSkipFlag)
+{
+ String8 cmd;
+
+ cmd = String8("update srv_table set skip = ") + String8::format("%d", bSkipFlag ? 1 : 0)
+ + String8(" where srv_table.db_id = ") + String8::format("%d", progId);
+
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+}
+
+void CTvProgram::updateProgramName(int progId, String8 strName)
+{
+ String8 newName = String8("xxx") + strName;
+ String8 cmd;
+
+ cmd = String8("update srv_table set name =") + "\'" + String8::format("%s", newName.string()) + "\'"
+ + String8(" where srv_table.db_id = ") + String8::format("%d", progId);
+
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+}
+
+void CTvProgram::swapChanOrder(int ProgId1, int chanOrderNum1, int ProgId2, int chanOrderNum2)
+{
+ String8 cmd;
+
+ cmd = String8("update srv_table set chan_order = ") + String8::format("%d", chanOrderNum2)
+ + String8(" where db_id = ") + String8::format("%d", ProgId1);
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+
+ String8 cmd2;
+ cmd2 = String8("update srv_table set chan_order = ") + String8::format("%d", chanOrderNum1)
+ + String8(" where db_id = ") + String8::format("%d", ProgId2);
+ CTvDatabase::GetTvDb()->exeSql(cmd2.string());
+}
+
+
+void CTvProgram::setLockFlag(int progId, bool bLockFlag)
+{
+ String8 cmd;
+
+ cmd = String8("update srv_table set lock = ") + String8::format("%d", bLockFlag ? 1 : 0)
+ + String8(" where srv_table.db_id = ") + String8::format("%d", progId);
+
+ CTvDatabase::GetTvDb()->exeSql(cmd.string());
+}
+bool CTvProgram::getLockFlag()
+{
+ return lock;
+}
+
diff --git a/tvapi/libtv/tvdb/CTvProgram.h b/tvapi/libtv/tvdb/CTvProgram.h
index cd82b27..33d5e7c 100644
--- a/tvapi/libtv/tvdb/CTvProgram.h
+++ b/tvapi/libtv/tvdb/CTvProgram.h
@@ -1,529 +1,537 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvProgram.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#if !defined(_CTVPROGRAM_H)
-#define _CTVPROGRAM_H
-
-#include "CTvDatabase.h"
-#include "CTvChannel.h"
-#include <utils/String8.h>
-#include <utils/RefBase.h>
-#include <stdlib.h>
-#include "CTvLog.h"
-using namespace android;
-// Program¶ÔÓ¦ATVÖеÄÒ»¸öƵµÀ£¬DTVÖеÄÒ»¸öservice
-class CTvEvent;
-class CTvProgram : public LightRefBase<CTvProgram> {
-public:
- /*this type value is link to enum AM_SCAN_ServiceType in am_scan.h
- * enum AM_SCAN_ServiceType
- {
- AM_SCAN_SRV_UNKNOWN = 0, < δ֪ÀàÐÍ
- AM_SCAN_SRV_DTV = 1, < Êý×ÖµçÊÓÀàÐÍ
- AM_SCAN_SRV_DRADIO = 2, < Êý×ֹ㲥ÀàÐÍ
- AM_SCAN_SRV_ATV = 3, < Ä£ÄâµçÊÓÀàÐÍ
- };
- * /
- /**䶨ÒåÀàÐÍ*/
- static const int TYPE_UNKNOWN = 0;
- /**µçÊÓ½ÚÄ¿*/
- static const int TYPE_TV = 4;
- /**¹ã²¥½ÚÄ¿*/
- static const int TYPE_RADIO = 2;
- /**Ä£Äâ½ÚÄ¿*/
- static const int TYPE_ATV = 3;
- /**Êý¾Ý½ÚÄ¿*/
- static const int TYPE_DATA = 5;
- /**Êý×Ö½ÚÄ¿*/
- static const int TYPE_DTV = 1 ;
- /** PVR/Timeshifting playback program*/
- static const int TYPE_PLAYBACK = 6;
-
- static const int PROGRAM_SKIP_NO = 0;
- static const int PROGRAM_SKIP_YES = 1;
- static const int PROGRAM_SKIP_UNKOWN = 2;
-
- /**
- *ServiceÖеĻù´¡ÔªËØÐÅÏ¢
- */
-public:
- class Element {
- private :
- int mpid;
-
- public :
- Element(int pid)
- {
- this->mpid = pid;
- }
- /**
- *È¡µÃ»ù´¡ÔªËصÄPID
- *@return ·µ»ØPID
- */
- int getPID()
- {
- return mpid;
- }
- };
-
-
-
- /**
- *¶àÓïÑÔ»ù´¡ÔªËØÐÅÏ¢
- */
-public:
- class MultiLangElement : public Element {
- private :
- String8 mlang;
-
- public :
- MultiLangElement(int pid, String8 lang): Element(pid)
- {
- this->mlang = lang;
- }
-
- /**
- *È¡µÃÔªËضÔÓ¦µÄÓïÑÔ
- *@return ·µ»Ø3×Ö·ûÓïÑÔ×Ö·û´®
- */
- String8 getLang()
- {
- return mlang;
- }
- };
-
-
-
- /**
- *ÊÓƵÐÅÏ¢
- */
-public :
- class Video : public Element {
- public:
- /**MPEG1/2*/
- static const int FORMAT_MPEG12 = 0;
- /**MPEG4*/
- static const int FORMAT_MPEG4 = 1;
- /**H.264*/
- static const int FORMAT_H264 = 2;
- /**MJPEG*/
- static const int FORMAT_MJPEG = 3;
- /**Real video*/
- static const int FORMAT_REAL = 4;
- /**JPEG*/
- static const int FORMAT_JPEG = 5;
- /**Microsoft VC1*/
- static const int FORMAT_VC1 = 6;
- /**AVS*/
- static const int FORMAT_AVS = 7;
- /**YUV*/
- static const int FORMAT_YUV = 8;
- /**H.264 MVC*/
- static const int FORMAT_H264MVC = 9;
- /**QJPEG*/
- static const int FORMAT_QJPEG = 10;
-
- Video(int pid, int fmt): Element(pid)
- {
- this->mformat = fmt;
- }
-
- /**
- *È¡µÃÊÓƵ±àÂë¸ñʽ
- *@return ·µ»ØÊÓƵ±àÂë¸ñʽ
- */
- int getFormat()
- {
- return mformat;
- }
- private :
- int mformat;
- };
-
- /**
- *ÒôƵÐÅÏ¢
- */
-public :
- class Audio : public MultiLangElement {
- public :
- /**MPEG*/
- static const int FORMAT_MPEG = 0;
- /**PCM 16λС¶Ë*/
- static const int FORMAT_PCM_S16LE = 1;
- /**AAC*/
- static const int FORMAT_AAC = 2;
- /**AC3*/
- static const int FORMAT_AC3 = 3;
- /**ALAW*/
- static const int FORMAT_ALAW = 4;
- /**MULAW*/
- static const int FORMAT_MULAW = 5;
- /**DTS*/
- static const int FORMAT_DTS = 6;
- /**PCM 16λ´ó¶Ë*/
- static const int FORMAT_PCM_S16BE = 7;
- /**FLAC*/
- static const int FORMAT_FLAC = 8;
- /**COOK*/
- static const int FORMAT_COOK = 9;
- /**PCM 8λ*/
- static const int FORMAT_PCM_U8 = 10;
- /**ADPCM*/
- static const int FORMAT_ADPCM = 11;
- /**AMR*/
- static const int FORMAT_AMR = 12;
- /**RAAC*/
- static const int FORMAT_RAAC = 13;
- /**WMA*/
- static const int FORMAT_WMA = 14;
- /**WMA Pro*/
- static const int FORMAT_WMAPRO = 15;
- /**À¶¹âPCM*/
- static const int FORMAT_PCM_BLURAY = 16;
- /**ALAC*/
- static const int FORMAT_ALAC = 17;
- /**Vorbis*/
- static const int FORMAT_VORBIS = 18;
- /**AAC latm¸ñʽ*/
- static const int FORMAT_AAC_LATM = 19;
- /**APE*/
- static const int FORMAT_APE = 20;
-
-
- Audio(int pid, String8 lang, int fmt): MultiLangElement(pid, lang)
- {
- this->mformat = fmt;
- }
-
- /**
- *È¡µÃÒôƵ±àÂë¸ñʽ
- *@return ·µ»ØÒôƵ±àÂë¸ñʽ
- */
- int getFormat()
- {
- return mformat;
- }
- private :
- int mformat;
- };
-
- /**
- *×ÖÄ»ÐÅÏ¢
- */
-public :
- class Subtitle : public MultiLangElement {
- public :
- /**DVB subtitle*/
- static const int TYPE_DVB_SUBTITLE = 1;
- /**Êý×ÖµçÊÓTeletext*/
- static const int TYPE_DTV_TELETEXT = 2;
- /**Ä£ÄâµçÊÓTeletext*/
- static const int TYPE_ATV_TELETEXT = 3;
- /**Êý×ÖµçÊÓClosed caption*/
- static const int TYPE_DTV_CC = 4;
- /**Ä£ÄâµçÊÓClosed caption*/
- static const int TYPE_ATV_CC = 5;
-
-
-
- Subtitle(int pid, String8 lang, int type, int num1, int num2): MultiLangElement(pid, lang)
- {
-
- this->type = type;
- if(type == TYPE_DVB_SUBTITLE) {
- compositionPage = num1;
- ancillaryPage = num2;
- } else if(type == TYPE_DTV_TELETEXT) {
- magazineNo = num1;
- pageNo = num2;
- }
- }
-
- /**
- *È¡µÃ×ÖÄ»ÀàÐÍ
- *@return ·µ»Ø×ÖÄ»ÀàÐÍ
- */
- int getType()
- {
- return type;
- }
-
- /**
- *È¡µÃDVB subtitleµÄcomposition page ID
- *@return ·µ»Øcomposition page ID
- */
- int getCompositionPageID()
- {
- return compositionPage;
- }
-
- /**
- *È¡µÃDVB subtitleµÄancillary page ID
- *@return ·µ»Øancillary page ID
- */
- int getAncillaryPageID()
- {
- return ancillaryPage;
- }
-
- /**
- *È¡µÃteletextµÄmagazine number
- *@return ·µ»Ømagazine number
- */
- int getMagazineNumber()
- {
- return magazineNo;
- }
-
- /**
- *È¡µÃteletextµÄpage number
- *@return ·µ»Øpage number
- */
- int getPageNumber()
- {
- return pageNo;
- }
-
- private :
- int compositionPage;
- int ancillaryPage;
- int magazineNo;
- int pageNo;
- int type;
- };
-
- /**
- *TeletextÐÅÏ¢
- */
-public :
- class Teletext : public MultiLangElement {
- public:
- Teletext(int pid, String8 lang, int mag, int page): MultiLangElement(pid, lang)
- {
- magazineNo = mag;
- pageNo = page;
- }
-
- /**
- *È¡µÃteletextµÄmagazine number
- *@return ·µ»Ømagazine number
- */
- int getMagazineNumber()
- {
- return magazineNo;
- }
-
- /**
- *È¡µÃteletextµÄpage number
- *@return ·µ»Øpage number
- */
- int getPageNumber()
- {
- return pageNo;
- }
-
- private :
- int magazineNo;
- int pageNo;
- };
-
- //½ÚÄ¿ºÅÐÅÏ¢
-public:
- /**Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ºöÂÔÓû§µÄÊäÈë*/
- static const int MINOR_CHECK_NONE = 0;
- /**Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ÏòÉÏÑ°ÕÒ£¨×ÓƵµÀÊý×ÖÔö¼Ó£©,ÕÒµ½×ÓƵµÀºÅ×î´óµÄ*/
- static const int MINOR_CHECK_UP = 1;
- /**Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ÏòÏÂÑ°ÕÒ£¨×ÓƵµÀÊý×Ö¼õС£©,ÕÒµ½×ÓƵµÀºÅ×îСµÄ*/
- static const int MINOR_CHECK_DOWN = 2;
- /*Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ÏòÉÏÑ°ÕÒ£¬È»ºóÕÒµ½ÏòÉÏ×î½üµÄ.*/
- static const int MINOR_CHECK_NEAREST_UP = 3;
- /*Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ÏòÏÂÑ°ÕÒ£¬È»ºóÕÒµ½ÏòÏÂ×î½üµÄ.*/
- static const int MINOR_CHECK_NEAREST_DOWN = 4;
-
- /**
- *È¡µÃ½ÚÄ¿ºÅ
- *@return ·µ»Ø½ÚÄ¿ºÅ
- */
- int getNumber()
- {
- return major;
- }
-
- /**
- *È¡µÃÖ÷½ÚÄ¿ºÅ(ATSC)
- *@return ·µ»Ø½ÚÄ¿µÄÖ÷½ÚÄ¿ºÅ
- */
- int getMajor()
- {
- return major;
- }
-
- /**
- *È¡µÃ´Î½ÚÄ¿ºÅ(ATSC)
- *@return ·µ»Ø½ÚÄ¿µÄ´Î½ÚÄ¿ºÅ
- */
- int getMinor()
- {
- return minor;
- }
-
- /**
- *ÊÇ·ñΪATSCģʽ
- *@return Èç¹ûÊÇATSCģʽ·µ»Øtrue
- */
- bool isATSCMode()
- {
- return atscMode;
- }
-
- /**
- *È¡µÃ×ÓƵµÀºÅ×Ô¶¯²éÕÒ²ßÂÔ(ATSC)
- *@return ·µ»Ø×ÓƵµÀºÅ×Ô¶¯²éÕÒ²ßÂÔ
- */
- int getMinorCheck()
- {
- return minorCheck;
- }
-
-private:
- int major;
- int minor;
- int minorCheck;
- bool atscMode;
-
-
-public:
- CTvProgram(CTvDatabase::Cursor &c);
- CTvProgram(int channelID, int type, int num, int skipFlag);
- /**
- *ÏòÊý¾Ý¿âÌí¼ÓÒ»¸öProgram,atscMode
- */
- CTvProgram(int channelID, int type, int major, int minor, int skipFlag);
- ~CTvProgram();
- // ´´½¨²¢ÏòÊý¾Ý¿âÌí¼ÓÒ»¸öProgram
- CTvProgram(int channelID, int type);
-
- CTvProgram();
-
-
- int getCurrentAudio(String8 defaultLang);
- Video *getVideo()
- {
- return mpVideo;
- }
- Audio *getAudio(int id)
- {
- if(mvAudios.size() <= 0) return NULL;
- return mvAudios[id];
- }
-
- int getAudioTrackSize()
- {
- return mvAudios.size();
- }
- static int selectByID(int id, CTvProgram &p);
- static CTvProgram selectByNumber(int num, int type);
- int selectByNumber(int type, int major, int minor, CTvProgram &prog, int minor_check = MINOR_CHECK_NONE);
- int selectByNumber(int type, int num, CTvProgram &prog);
- static int selectByChannel(int channelID, int type, Vector<sp<CTvProgram> > &out);
- // ÁгöÈ«²¿TVProgram
- static int selectAll(bool no_skip, Vector<sp<CTvProgram> > &out);
- static int selectByType(int type, int skip, Vector<sp<CTvProgram> > &out);
- static int selectByChanID(int type, int skip, Vector<sp<CTvProgram> > &out);
- static Vector<CTvProgram> selectByChannel(int channelID);
- // ¸ù¾Ý½ÚÄ¿Ãû³ÆÖеĹؼü×Ö²éÕÒÖ¸¶¨TVProgram
- static Vector<CTvProgram> selectByName(int name);
- void tvProgramDelByChannelID(int channelID);
- int getID()
- {
- return id;
- };
- int getSrc()
- {
- return src;
- };
- int getProgType()
- {
- return type;
- };
- int getChanOrderNum()
- {
- return chanOrderNum;
- };
- int getChanVolume()
- {
- return volume;
- };
- int getSourceId()
- {
- return sourceID;
- };
- int getServiceId()
- {
- return dvbServiceID;
- };
- int getProgSkipFlag();
- void setCurrAudioTrackIndex(int programId, int audioIndex);
- int getCurrAudioTrackIndex();
-
- String8 getName();
- void getCurrentSubtitle();
- void getCurrentTeletext();
- int getChannel(CTvChannel &c);
- int upDateChannel(CTvChannel &c, int std, int freq, int fineFreq);
- int updateVolComp(int progID, int volValue);
- void updateProgramName(int progId, String8 strName);
- void setSkipFlag(int progId, bool bSkipFlag);
- void setFavoriteFlag(int progId, bool bFavor);
- int getFavoriteFlag()
- {
- return favorite;
- };
- void deleteProgram(int progId);
- static int CleanAllProgramBySrvType(int srvType);
- void setLockFlag(int progId, bool bLockFlag);
- bool getLockFlag();
- void swapChanOrder(int ProgId1, int chanOrderNum1, int ProgId2, int chanOrderNum2);
- static int deleteChannelsProgram(CTvChannel &c);
-private:
- int CreateFromCursor(CTvDatabase::Cursor &c);
- int selectProgramInChannelByNumber(int channelID, int num, CTvDatabase::Cursor &c);
- int selectProgramInChannelByNumber(int channelID, int major, int minor, CTvDatabase::Cursor &c);
- CTvChannel channel;
- int id;
- int dvbServiceID;
- int type;
- String8 name;
- int channelID;
- int skip;
- int favorite;
- int volume;
- int sourceID;
- int pmtPID;
- int src;
- int audioTrack;
- int chanOrderNum;
- int currAudTrackIndex;
- bool lock;
- bool scrambled;
- // videoÐÅÏ¢,ÀàÐͲ»¶¨
- Video *mpVideo;
- // audioÐÅÏ¢,ÀàÐͲ»¶¨
- Vector<Audio *> mvAudios;
- // subtitleÐÅÏ¢ÀàÐͲ»¶¨
- Vector<Subtitle *> mvSubtitles;
- // teletextÐÅÏ¢,ÀàÐͲ»¶¨
- Vector<Teletext *> mvTeletexts;
-
-};
-
-#endif //_CTVPROGRAM_H
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvProgram.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#if !defined(_CTVPROGRAM_H)
+#define _CTVPROGRAM_H
+
+#include "CTvDatabase.h"
+#include "CTvChannel.h"
+#include <utils/String8.h>
+#include <utils/RefBase.h>
+#include <stdlib.h>
+#include "CTvLog.h"
+using namespace android;
+// Program¶ÔÓ¦ATVÖеÄÒ»¸öƵµÀ£¬DTVÖеÄÒ»¸öservice
+class CTvEvent;
+class CTvProgram : public LightRefBase<CTvProgram> {
+public:
+ /*this type value is link to enum AM_SCAN_ServiceType in am_scan.h
+ * enum AM_SCAN_ServiceType
+ {
+ AM_SCAN_SRV_UNKNOWN = 0, < δ֪ÀàÐÍ
+ AM_SCAN_SRV_DTV = 1, < Êý×ÖµçÊÓÀàÐÍ
+ AM_SCAN_SRV_DRADIO = 2, < Êý×ֹ㲥ÀàÐÍ
+ AM_SCAN_SRV_ATV = 3, < Ä£ÄâµçÊÓÀàÐÍ
+ };
+ * /
+ /**䶨ÒåÀàÐÍ*/
+ static const int TYPE_UNKNOWN = 0;
+ /**µçÊÓ½ÚÄ¿*/
+ static const int TYPE_TV = 4;
+ /**¹ã²¥½ÚÄ¿*/
+ static const int TYPE_RADIO = 2;
+ /**Ä£Äâ½ÚÄ¿*/
+ static const int TYPE_ATV = 3;
+ /**Êý¾Ý½ÚÄ¿*/
+ static const int TYPE_DATA = 5;
+ /**Êý×Ö½ÚÄ¿*/
+ static const int TYPE_DTV = 1 ;
+ /** PVR/Timeshifting playback program*/
+ static const int TYPE_PLAYBACK = 6;
+
+ static const int PROGRAM_SKIP_NO = 0;
+ static const int PROGRAM_SKIP_YES = 1;
+ static const int PROGRAM_SKIP_UNKOWN = 2;
+
+ /**
+ *ServiceÖеĻù´¡ÔªËØÐÅÏ¢
+ */
+public:
+ class Element {
+ private :
+ int mpid;
+
+ public :
+ Element(int pid)
+ {
+ this->mpid = pid;
+ }
+ /**
+ *È¡µÃ»ù´¡ÔªËصÄPID
+ *@return ·µ»ØPID
+ */
+ int getPID()
+ {
+ return mpid;
+ }
+ };
+
+
+
+ /**
+ *¶àÓïÑÔ»ù´¡ÔªËØÐÅÏ¢
+ */
+public:
+ class MultiLangElement : public Element {
+ private :
+ String8 mlang;
+
+ public :
+ MultiLangElement(int pid, String8 lang): Element(pid)
+ {
+ this->mlang = lang;
+ }
+
+ /**
+ *È¡µÃÔªËضÔÓ¦µÄÓïÑÔ
+ *@return ·µ»Ø3×Ö·ûÓïÑÔ×Ö·û´®
+ */
+ String8 getLang()
+ {
+ return mlang;
+ }
+ };
+
+
+
+ /**
+ *ÊÓƵÐÅÏ¢
+ */
+public :
+ class Video : public Element {
+ public:
+ /**MPEG1/2*/
+ static const int FORMAT_MPEG12 = 0;
+ /**MPEG4*/
+ static const int FORMAT_MPEG4 = 1;
+ /**H.264*/
+ static const int FORMAT_H264 = 2;
+ /**MJPEG*/
+ static const int FORMAT_MJPEG = 3;
+ /**Real video*/
+ static const int FORMAT_REAL = 4;
+ /**JPEG*/
+ static const int FORMAT_JPEG = 5;
+ /**Microsoft VC1*/
+ static const int FORMAT_VC1 = 6;
+ /**AVS*/
+ static const int FORMAT_AVS = 7;
+ /**YUV*/
+ static const int FORMAT_YUV = 8;
+ /**H.264 MVC*/
+ static const int FORMAT_H264MVC = 9;
+ /**QJPEG*/
+ static const int FORMAT_QJPEG = 10;
+
+ Video(int pid, int fmt): Element(pid)
+ {
+ this->mformat = fmt;
+ }
+
+ /**
+ *È¡µÃÊÓƵ±àÂë¸ñʽ
+ *@return ·µ»ØÊÓƵ±àÂë¸ñʽ
+ */
+ int getFormat()
+ {
+ return mformat;
+ }
+ private :
+ int mformat;
+ };
+
+ /**
+ *ÒôƵÐÅÏ¢
+ */
+public :
+ class Audio : public MultiLangElement {
+ public :
+ /**MPEG*/
+ static const int FORMAT_MPEG = 0;
+ /**PCM 16λС¶Ë*/
+ static const int FORMAT_PCM_S16LE = 1;
+ /**AAC*/
+ static const int FORMAT_AAC = 2;
+ /**AC3*/
+ static const int FORMAT_AC3 = 3;
+ /**ALAW*/
+ static const int FORMAT_ALAW = 4;
+ /**MULAW*/
+ static const int FORMAT_MULAW = 5;
+ /**DTS*/
+ static const int FORMAT_DTS = 6;
+ /**PCM 16λ´ó¶Ë*/
+ static const int FORMAT_PCM_S16BE = 7;
+ /**FLAC*/
+ static const int FORMAT_FLAC = 8;
+ /**COOK*/
+ static const int FORMAT_COOK = 9;
+ /**PCM 8λ*/
+ static const int FORMAT_PCM_U8 = 10;
+ /**ADPCM*/
+ static const int FORMAT_ADPCM = 11;
+ /**AMR*/
+ static const int FORMAT_AMR = 12;
+ /**RAAC*/
+ static const int FORMAT_RAAC = 13;
+ /**WMA*/
+ static const int FORMAT_WMA = 14;
+ /**WMA Pro*/
+ static const int FORMAT_WMAPRO = 15;
+ /**À¶¹âPCM*/
+ static const int FORMAT_PCM_BLURAY = 16;
+ /**ALAC*/
+ static const int FORMAT_ALAC = 17;
+ /**Vorbis*/
+ static const int FORMAT_VORBIS = 18;
+ /**AAC latm¸ñʽ*/
+ static const int FORMAT_AAC_LATM = 19;
+ /**APE*/
+ static const int FORMAT_APE = 20;
+
+
+ Audio(int pid, String8 lang, int fmt): MultiLangElement(pid, lang)
+ {
+ this->mformat = fmt;
+ }
+
+ /**
+ *È¡µÃÒôƵ±àÂë¸ñʽ
+ *@return ·µ»ØÒôƵ±àÂë¸ñʽ
+ */
+ int getFormat()
+ {
+ return mformat;
+ }
+ private :
+ int mformat;
+ };
+
+ /**
+ *×ÖÄ»ÐÅÏ¢
+ */
+public :
+ class Subtitle : public MultiLangElement {
+ public :
+ /**DVB subtitle*/
+ static const int TYPE_DVB_SUBTITLE = 1;
+ /**Êý×ÖµçÊÓTeletext*/
+ static const int TYPE_DTV_TELETEXT = 2;
+ /**Ä£ÄâµçÊÓTeletext*/
+ static const int TYPE_ATV_TELETEXT = 3;
+ /**Êý×ÖµçÊÓClosed caption*/
+ static const int TYPE_DTV_CC = 4;
+ /**Ä£ÄâµçÊÓClosed caption*/
+ static const int TYPE_ATV_CC = 5;
+
+
+
+ Subtitle(int pid, String8 lang, int type, int num1, int num2): MultiLangElement(pid, lang)
+ {
+
+ this->type = type;
+ if (type == TYPE_DVB_SUBTITLE) {
+ compositionPage = num1;
+ ancillaryPage = num2;
+ } else if (type == TYPE_DTV_TELETEXT) {
+ magazineNo = num1;
+ pageNo = num2;
+ }
+ }
+
+ /**
+ *È¡µÃ×ÖÄ»ÀàÐÍ
+ *@return ·µ»Ø×ÖÄ»ÀàÐÍ
+ */
+ int getType()
+ {
+ return type;
+ }
+
+ /**
+ *È¡µÃDVB subtitleµÄcomposition page ID
+ *@return ·µ»Øcomposition page ID
+ */
+ int getCompositionPageID()
+ {
+ return compositionPage;
+ }
+
+ /**
+ *È¡µÃDVB subtitleµÄancillary page ID
+ *@return ·µ»Øancillary page ID
+ */
+ int getAncillaryPageID()
+ {
+ return ancillaryPage;
+ }
+
+ /**
+ *È¡µÃteletextµÄmagazine number
+ *@return ·µ»Ømagazine number
+ */
+ int getMagazineNumber()
+ {
+ return magazineNo;
+ }
+
+ /**
+ *È¡µÃteletextµÄpage number
+ *@return ·µ»Øpage number
+ */
+ int getPageNumber()
+ {
+ return pageNo;
+ }
+
+ private :
+ int compositionPage;
+ int ancillaryPage;
+ int magazineNo;
+ int pageNo;
+ int type;
+ };
+
+ /**
+ *TeletextÐÅÏ¢
+ */
+public :
+ class Teletext : public MultiLangElement {
+ public:
+ Teletext(int pid, String8 lang, int mag, int page): MultiLangElement(pid, lang)
+ {
+ magazineNo = mag;
+ pageNo = page;
+ }
+
+ /**
+ *È¡µÃteletextµÄmagazine number
+ *@return ·µ»Ømagazine number
+ */
+ int getMagazineNumber()
+ {
+ return magazineNo;
+ }
+
+ /**
+ *È¡µÃteletextµÄpage number
+ *@return ·µ»Øpage number
+ */
+ int getPageNumber()
+ {
+ return pageNo;
+ }
+
+ private :
+ int magazineNo;
+ int pageNo;
+ };
+
+ //½ÚÄ¿ºÅÐÅÏ¢
+public:
+ /**Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ºöÂÔÓû§µÄÊäÈë*/
+ static const int MINOR_CHECK_NONE = 0;
+ /**Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ÏòÉÏÑ°ÕÒ£¨×ÓƵµÀÊý×ÖÔö¼Ó£©,ÕÒµ½×ÓƵµÀºÅ×î´óµÄ*/
+ static const int MINOR_CHECK_UP = 1;
+ /**Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ÏòÏÂÑ°ÕÒ£¨×ÓƵµÀÊý×Ö¼õС£©,ÕÒµ½×ÓƵµÀºÅ×îСµÄ*/
+ static const int MINOR_CHECK_DOWN = 2;
+ /*Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ÏòÉÏÑ°ÕÒ£¬È»ºóÕÒµ½ÏòÉÏ×î½üµÄ.*/
+ static const int MINOR_CHECK_NEAREST_UP = 3;
+ /*Èç¹ûûÓз¢ÏÖ×ÓƵµÀ£¬ÏòÏÂÑ°ÕÒ£¬È»ºóÕÒµ½ÏòÏÂ×î½üµÄ.*/
+ static const int MINOR_CHECK_NEAREST_DOWN = 4;
+
+ /**
+ *È¡µÃ½ÚÄ¿ºÅ
+ *@return ·µ»Ø½ÚÄ¿ºÅ
+ */
+ int getNumber()
+ {
+ return major;
+ }
+
+ /**
+ *È¡µÃÖ÷½ÚÄ¿ºÅ(ATSC)
+ *@return ·µ»Ø½ÚÄ¿µÄÖ÷½ÚÄ¿ºÅ
+ */
+ int getMajor()
+ {
+ return major;
+ }
+
+ /**
+ *È¡µÃ´Î½ÚÄ¿ºÅ(ATSC)
+ *@return ·µ»Ø½ÚÄ¿µÄ´Î½ÚÄ¿ºÅ
+ */
+ int getMinor()
+ {
+ return minor;
+ }
+
+ /**
+ *ÊÇ·ñΪATSCģʽ
+ *@return Èç¹ûÊÇATSCģʽ·µ»Øtrue
+ */
+ bool isATSCMode()
+ {
+ return atscMode;
+ }
+
+ /**
+ *È¡µÃ×ÓƵµÀºÅ×Ô¶¯²éÕÒ²ßÂÔ(ATSC)
+ *@return ·µ»Ø×ÓƵµÀºÅ×Ô¶¯²éÕÒ²ßÂÔ
+ */
+ int getMinorCheck()
+ {
+ return minorCheck;
+ }
+
+private:
+ int major;
+ int minor;
+ int minorCheck;
+ bool atscMode;
+
+
+public:
+ CTvProgram(CTvDatabase::Cursor &c);
+ CTvProgram(int channelID, int type, int num, int skipFlag);
+ /**
+ *ÏòÊý¾Ý¿âÌí¼ÓÒ»¸öProgram,atscMode
+ */
+ CTvProgram(int channelID, int type, int major, int minor, int skipFlag);
+ ~CTvProgram();
+ // ´´½¨²¢ÏòÊý¾Ý¿âÌí¼ÓÒ»¸öProgram
+ CTvProgram(int channelID, int type);
+
+ CTvProgram();
+
+
+ int getCurrentAudio(String8 defaultLang);
+ Video *getVideo()
+ {
+ return mpVideo;
+ }
+ Audio *getAudio(int id)
+ {
+ if (mvAudios.size() <= 0) return NULL;
+ return mvAudios[id];
+ }
+
+ int getAudioTrackSize()
+ {
+ return mvAudios.size();
+ }
+ static int selectByID(int id, CTvProgram &p);
+ static CTvProgram selectByNumber(int num, int type);
+ int selectByNumber(int type, int major, int minor, CTvProgram &prog, int minor_check = MINOR_CHECK_NONE);
+ static int selectByNumber(int type, int num, CTvProgram &prog);
+ static int selectByChannel(int channelID, int type, Vector<sp<CTvProgram> > &out);
+ // ÁгöÈ«²¿TVProgram
+ static int selectAll(bool no_skip, Vector<sp<CTvProgram> > &out);
+ static int selectByType(int type, int skip, Vector<sp<CTvProgram> > &out);
+ static int selectByChanID(int type, int skip, Vector<sp<CTvProgram> > &out);
+ static Vector<CTvProgram> selectByChannel(int channelID);
+ // ¸ù¾Ý½ÚÄ¿Ãû³ÆÖеĹؼü×Ö²éÕÒÖ¸¶¨TVProgram
+ static Vector<CTvProgram> selectByName(int name);
+ void tvProgramDelByChannelID(int channelID);
+ int getID()
+ {
+ return id;
+ };
+ int getSrc()
+ {
+ return src;
+ };
+ int getProgType()
+ {
+ return type;
+ };
+ int getChanOrderNum()
+ {
+ return chanOrderNum;
+ };
+ int getChanVolume()
+ {
+ return volume;
+ };
+ int getSourceId()
+ {
+ return sourceID;
+ };
+ int getServiceId()
+ {
+ return dvbServiceID;
+ };
+ int getProgSkipFlag();
+ int getSubtitleIndex(int progId);
+ int setSubtitleIndex(int progId, int index);
+ void setCurrAudioTrackIndex(int programId, int audioIndex);
+ int getCurrAudioTrackIndex();
+
+ String8 getName();
+ void getCurrentSubtitle();
+ void getCurrentTeletext();
+ int getChannel(CTvChannel &c);
+ int upDateChannel(CTvChannel &c, int std, int freq, int fineFreq);
+ int updateVolComp(int progID, int volValue);
+ void updateProgramName(int progId, String8 strName);
+ void setSkipFlag(int progId, bool bSkipFlag);
+ void setFavoriteFlag(int progId, bool bFavor);
+ int getFavoriteFlag()
+ {
+ return favorite;
+ };
+ void deleteProgram(int progId);
+ static int CleanAllProgramBySrvType(int srvType);
+ void setLockFlag(int progId, bool bLockFlag);
+ bool getLockFlag();
+ void swapChanOrder(int ProgId1, int chanOrderNum1, int ProgId2, int chanOrderNum2);
+ int getAudioChannel();
+ static int updateAudioChannel(int progId, int ch);
+ static int deleteChannelsProgram(CTvChannel &c);
+ Vector<Subtitle *> getSubtitles()
+ {
+ return mvSubtitles;
+ }
+private:
+ int CreateFromCursor(CTvDatabase::Cursor &c);
+ int selectProgramInChannelByNumber(int channelID, int num, CTvDatabase::Cursor &c);
+ int selectProgramInChannelByNumber(int channelID, int major, int minor, CTvDatabase::Cursor &c);
+ CTvChannel channel;
+ int id;
+ int dvbServiceID;
+ int type;
+ String8 name;
+ int channelID;
+ int skip;
+ int favorite;
+ int volume;
+ int sourceID;
+ int pmtPID;
+ int src;
+ int audioTrack;
+ int chanOrderNum;
+ int currAudTrackIndex;
+ bool lock;
+ bool scrambled;
+ // videoÐÅÏ¢,ÀàÐͲ»¶¨
+ Video *mpVideo;
+ // audioÐÅÏ¢,ÀàÐͲ»¶¨
+ Vector<Audio *> mvAudios;
+ // subtitleÐÅÏ¢ÀàÐͲ»¶¨
+ Vector<Subtitle *> mvSubtitles;
+ // teletextÐÅÏ¢,ÀàÐͲ»¶¨
+ Vector<Teletext *> mvTeletexts;
+
+};
+
+#endif //_CTVPROGRAM_H
diff --git a/tvapi/libtv/tvdb/CTvRegion.cpp b/tvapi/libtv/tvdb/CTvRegion.cpp
index 966946a..b6c3ce0 100644
--- a/tvapi/libtv/tvdb/CTvRegion.cpp
+++ b/tvapi/libtv/tvdb/CTvRegion.cpp
@@ -1,183 +1,183 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvRegion.cpp
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#include "CTvRegion.h"
-#include "CTvDatabase.h"
-
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#define LOG_TAG "CTvRegion"
-#endif
-
-CTvRegion::CTvRegion(CTvDatabase db)
-{
-
-}
-
-CTvRegion::CTvRegion()
-{
-
-}
-CTvRegion::~CTvRegion()
-{
-
-}
-
-CTvRegion CTvRegion::selectByID()
-{
- CTvRegion r;
- return r;
-}
-
-int CTvRegion::getChannelListByName(char *name, Vector<sp<CTvChannel> > &vcp)
-{
-
- if (name == NULL)
- return -1;
-
- String8 cmd;
- cmd = String8("select * from region_table where name = ") + String8("\'") + name + String8("\'");
-
- CTvDatabase::Cursor c;
- CTvDatabase::GetTvDb()->select(cmd, c);
- int col, size = 0;
- int id;
- int mode;
- int frequency = 0;
- int bandwidth;
- int modulation;
- int symbolRate;
- int ofdmMode;
- int channelNum = 0;
-
- if(c.moveToFirst()) {
- do {
- col = c.getColumnIndex("db_id");
- id = c.getInt(col);
- col = c.getColumnIndex("fe_type");
- mode = c.getInt(col);
- col = c.getColumnIndex("frequency");
- frequency = c.getInt(col);
- col = c.getColumnIndex("modulation");
- modulation = c.getInt(col);
- col = c.getColumnIndex("bandwidth");
- bandwidth = c.getInt(col);
- col = c.getColumnIndex("symbol_rate");
- symbolRate = c.getInt(col);
- col = c.getColumnIndex("ofdm_mode");
- ofdmMode = c.getInt(col);
- col = c.getColumnIndex("logical_channel_num");
- channelNum = c.getInt(col);
- vcp.add(new CTvChannel(id, mode, frequency, bandwidth, modulation, symbolRate, ofdmMode, channelNum));
- size++;
- } while(c.moveToNext());
- }
- c.close();
-
- return size;
-}
-
-int CTvRegion::getChannelListByNameAndFreqRange(char *name, int beginFreq, int endFreq, Vector<sp<CTvChannel> > &vcp)
-{
- if (name == NULL)
- return -1;
- int ret = 0;
- String8 cmd;
- cmd = String8("select * from region_table where name = ") + String8("\'") + name + String8("\'")
- + String8(" and frequency >= ") + String8::format("%d", beginFreq) + String8(" and frequency <= ")
- + String8::format("%d", endFreq);
-
- CTvDatabase::Cursor c;
- CTvDatabase::GetTvDb()->select(cmd, c);
- int col, size = 0;
- int id;
- int mode;
- int frequency = 0;
- int bandwidth;
- int modulation;
- int symbolRate;
- int ofdmMode;
- int channelNum = 0;
-
- do {
- if(c.moveToFirst()) {
- do {
- col = c.getColumnIndex("db_id");
- id = c.getInt(col);
- col = c.getColumnIndex("fe_type");
- mode = c.getInt(col);
- col = c.getColumnIndex("frequency");
- frequency = c.getInt(col);
- col = c.getColumnIndex("modulation");
- modulation = c.getInt(col);
- col = c.getColumnIndex("bandwidth");
- bandwidth = c.getInt(col);
- col = c.getColumnIndex("symbol_rate");
- symbolRate = c.getInt(col);
- col = c.getColumnIndex("ofdm_mode");
- ofdmMode = c.getInt(col);
- col = c.getColumnIndex("logical_channel_num");
- channelNum = c.getInt(col);
- vcp.add(new CTvChannel(id, mode, frequency, bandwidth, modulation, symbolRate, ofdmMode, channelNum));
- size++;
- } while(c.moveToNext());
- } else {
- ret = -1;
- break;
- }
- } while(false);
-
- c.close();
- return ret;
-}
-void CTvRegion::selectByCountry()
-{
-
-}
-
-Vector<String8> CTvRegion::getAllCountry()
-{
- Vector<String8> vStr;
- return vStr;
-}
-
-CTvChannel CTvRegion::getChannels()
-{
- CTvChannel p;
- return p;
-}
-
-int CTvRegion::getLogicNumByNameAndfreq(char *name, int freq)
-{
- int ret = 0;
- int col = 0;
-
- if (name == NULL)
- return -1;
-
- String8 cmd;
- cmd = String8("select * from region_table where name = ") + String8("\'") + name + String8("\'");
- cmd += String8(" and frequency = ") + String8::format("%d", freq);
-
-
- CTvDatabase::Cursor c;
- CTvDatabase::GetTvDb()->select(cmd, c);
- if(c.moveToFirst()) {
- col = c.getColumnIndex("logical_channel_num");
- ret = c.getInt(col);
- }
- c.close();
-
- return ret;
-}
-
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvRegion.cpp
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#include "CTvRegion.h"
+#include "CTvDatabase.h"
+
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "CTvRegion"
+#endif
+
+CTvRegion::CTvRegion(CTvDatabase db)
+{
+
+}
+
+CTvRegion::CTvRegion()
+{
+
+}
+CTvRegion::~CTvRegion()
+{
+
+}
+
+CTvRegion CTvRegion::selectByID()
+{
+ CTvRegion r;
+ return r;
+}
+
+int CTvRegion::getChannelListByName(char *name, Vector<sp<CTvChannel> > &vcp)
+{
+
+ if (name == NULL)
+ return -1;
+
+ String8 cmd;
+ cmd = String8("select * from region_table where name = ") + String8("\'") + name + String8("\'");
+
+ CTvDatabase::Cursor c;
+ CTvDatabase::GetTvDb()->select(cmd, c);
+ int col, size = 0;
+ int id;
+ int mode;
+ int frequency = 0;
+ int bandwidth;
+ int modulation;
+ int symbolRate;
+ int ofdmMode;
+ int channelNum = 0;
+
+ if (c.moveToFirst()) {
+ do {
+ col = c.getColumnIndex("db_id");
+ id = c.getInt(col);
+ col = c.getColumnIndex("fe_type");
+ mode = c.getInt(col);
+ col = c.getColumnIndex("frequency");
+ frequency = c.getInt(col);
+ col = c.getColumnIndex("modulation");
+ modulation = c.getInt(col);
+ col = c.getColumnIndex("bandwidth");
+ bandwidth = c.getInt(col);
+ col = c.getColumnIndex("symbol_rate");
+ symbolRate = c.getInt(col);
+ col = c.getColumnIndex("ofdm_mode");
+ ofdmMode = c.getInt(col);
+ col = c.getColumnIndex("logical_channel_num");
+ channelNum = c.getInt(col);
+ vcp.add(new CTvChannel(id, mode, frequency, bandwidth, modulation, symbolRate, ofdmMode, channelNum));
+ size++;
+ } while (c.moveToNext());
+ }
+ c.close();
+
+ return size;
+}
+
+int CTvRegion::getChannelListByNameAndFreqRange(char *name, int beginFreq, int endFreq, Vector<sp<CTvChannel> > &vcp)
+{
+ if (name == NULL)
+ return -1;
+ int ret = 0;
+ String8 cmd;
+ cmd = String8("select * from region_table where name = ") + String8("\'") + name + String8("\'")
+ + String8(" and frequency >= ") + String8::format("%d", beginFreq) + String8(" and frequency <= ")
+ + String8::format("%d", endFreq);
+
+ CTvDatabase::Cursor c;
+ CTvDatabase::GetTvDb()->select(cmd, c);
+ int col, size = 0;
+ int id;
+ int mode;
+ int frequency = 0;
+ int bandwidth;
+ int modulation;
+ int symbolRate;
+ int ofdmMode;
+ int channelNum = 0;
+
+ do {
+ if (c.moveToFirst()) {
+ do {
+ col = c.getColumnIndex("db_id");
+ id = c.getInt(col);
+ col = c.getColumnIndex("fe_type");
+ mode = c.getInt(col);
+ col = c.getColumnIndex("frequency");
+ frequency = c.getInt(col);
+ col = c.getColumnIndex("modulation");
+ modulation = c.getInt(col);
+ col = c.getColumnIndex("bandwidth");
+ bandwidth = c.getInt(col);
+ col = c.getColumnIndex("symbol_rate");
+ symbolRate = c.getInt(col);
+ col = c.getColumnIndex("ofdm_mode");
+ ofdmMode = c.getInt(col);
+ col = c.getColumnIndex("logical_channel_num");
+ channelNum = c.getInt(col);
+ vcp.add(new CTvChannel(id, mode, frequency, bandwidth, modulation, symbolRate, ofdmMode, channelNum));
+ size++;
+ } while (c.moveToNext());
+ } else {
+ ret = -1;
+ break;
+ }
+ } while (false);
+
+ c.close();
+ return ret;
+}
+void CTvRegion::selectByCountry()
+{
+
+}
+
+Vector<String8> CTvRegion::getAllCountry()
+{
+ Vector<String8> vStr;
+ return vStr;
+}
+
+CTvChannel CTvRegion::getChannels()
+{
+ CTvChannel p;
+ return p;
+}
+
+int CTvRegion::getLogicNumByNameAndfreq(char *name, int freq)
+{
+ int ret = 0;
+ int col = 0;
+
+ if (name == NULL)
+ return -1;
+
+ String8 cmd;
+ cmd = String8("select * from region_table where name = ") + String8("\'") + name + String8("\'");
+ cmd += String8(" and frequency = ") + String8::format("%d", freq);
+
+
+ CTvDatabase::Cursor c;
+ CTvDatabase::GetTvDb()->select(cmd, c);
+ if (c.moveToFirst()) {
+ col = c.getColumnIndex("logical_channel_num");
+ ret = c.getInt(col);
+ }
+ c.close();
+
+ return ret;
+}
+
diff --git a/tvapi/libtv/tvdb/CTvRegion.h b/tvapi/libtv/tvdb/CTvRegion.h
index 82cb505..7f1c7a7 100644
--- a/tvapi/libtv/tvdb/CTvRegion.h
+++ b/tvapi/libtv/tvdb/CTvRegion.h
@@ -1,42 +1,42 @@
-//
-//
-// amlogic 2013
-//
-// @ Project : tv
-// @ File Name : CTvRegion.h
-// @ Date : 2013-11
-// @ Author :
-//
-//
-
-
-#if !defined(_CTVREGION_H)
-#define _CTVREGION_H
-
-#include "CTvDatabase.h"
-#include "CTvChannel.h"
-#include <utils/String8.h>
-#include <utils/Vector.h>
-// TV ÇøÓò
-// ¿ÉÒÔ»ñµÃÿ¸öÇøÓòµÄƵÂÊÁбíµÈÐÅÏ¢
-using namespace android;
-class CTvRegion {
-public:
- int id;
- String8 name;
- String8 country;
- CTvRegion(CTvDatabase db);
- CTvRegion();
- ~CTvRegion();
- static CTvRegion selectByID();
- static int getChannelListByName(char *name, Vector<sp<CTvChannel> > &vcp);
- static int getChannelListByNameAndFreqRange(char *name, int beginFreq, int endFreq, Vector<sp<CTvChannel> > &vcp);
- static int getLogicNumByNameAndfreq(char *name, int freq);
- void selectByCountry();
- Vector<String8> getAllCountry();
- // È¡µÃ¸ÃRegionµÄÐźÅԴƵÂʲÎÊýÁбí
- // @return ·µ»ØÐźÅԴƵÂʲÎÊýÁбí
- CTvChannel getChannels();
-};
-
-#endif //_CTVREGION_H
+//
+//
+// amlogic 2013
+//
+// @ Project : tv
+// @ File Name : CTvRegion.h
+// @ Date : 2013-11
+// @ Author :
+//
+//
+
+
+#if !defined(_CTVREGION_H)
+#define _CTVREGION_H
+
+#include "CTvDatabase.h"
+#include "CTvChannel.h"
+#include <utils/String8.h>
+#include <utils/Vector.h>
+// TV ÇøÓò
+// ¿ÉÒÔ»ñµÃÿ¸öÇøÓòµÄƵÂÊÁбíµÈÐÅÏ¢
+using namespace android;
+class CTvRegion {
+public:
+ int id;
+ String8 name;
+ String8 country;
+ CTvRegion(CTvDatabase db);
+ CTvRegion();
+ ~CTvRegion();
+ static CTvRegion selectByID();
+ static int getChannelListByName(char *name, Vector<sp<CTvChannel> > &vcp);
+ static int getChannelListByNameAndFreqRange(char *name, int beginFreq, int endFreq, Vector<sp<CTvChannel> > &vcp);
+ static int getLogicNumByNameAndfreq(char *name, int freq);
+ void selectByCountry();
+ Vector<String8> getAllCountry();
+ // È¡µÃ¸ÃRegionµÄÐźÅԴƵÂʲÎÊýÁбí
+ // @return ·µ»ØÐźÅԴƵÂʲÎÊýÁбí
+ CTvChannel getChannels();
+};
+
+#endif //_CTVREGION_H
diff --git a/tvapi/libtv/tvin/CHDMIRxCEC.cpp b/tvapi/libtv/tvin/CHDMIRxCEC.cpp
index b30bc26..8bf7d79 100644
--- a/tvapi/libtv/tvin/CHDMIRxCEC.cpp
+++ b/tvapi/libtv/tvin/CHDMIRxCEC.cpp
@@ -15,7 +15,7 @@ CTvin::CHDMIRxCEC::CHDMIRxCEC(CTvin *pTvin)
{
int i = 0;
- for(i = 0; i < CC_REQUEST_LIST_SIZE; i++) {
+ for (i = 0; i < CC_REQUEST_LIST_SIZE; i++) {
ClrReplyListItem(&mReplyList[i]);
memset((void *) &mMsgBuf[i], 0, sizeof(struct _cec_msg));
}
@@ -27,7 +27,7 @@ CTvin::CHDMIRxCEC::CHDMIRxCEC(CTvin *pTvin)
mpObserver = NULL;
mpTvin = pTvin;
- for(i = 0; i < CC_SOURCE_DEV_REFRESH_CNT; i++) {
+ for (i = 0; i < CC_SOURCE_DEV_REFRESH_CNT; i++) {
mSourceDevLogicAddrBuf[i] = -1;
mSourceDevRefreshBuf[i] = -1;
}
@@ -149,8 +149,8 @@ int CTvin::CHDMIRxCEC::PrintMessage(const char *func_name, int data_type, struct
LOGD("%s, msg_len = %d\n", func_name, msg->msg_len);
LOGD("%s, msg addr 0x%02X\n", func_name, msg->addr);
LOGD("%s, msg cmd 0x%02X\n", func_name, msg->cmd);
- for(int i = 0; i < msg->msg_len - 2; i++) {
- if(data_type == 0) {
+ for (int i = 0; i < msg->msg_len - 2; i++) {
+ if (data_type == 0) {
LOGD("%s, msg data[%d] = 0x%02X\n", func_name, i, msg->msg_data[i]);
} else {
LOGD("%s, msg data[%d] = %c\n", func_name, i, msg->msg_data[i]);
@@ -162,7 +162,7 @@ int CTvin::CHDMIRxCEC::PrintMessage(const char *func_name, int data_type, struct
int CTvin::CHDMIRxCEC::ClrReplyListItem(HDMIRxRequestReplyItem *reply_item)
{
- if(reply_item == NULL) {
+ if (reply_item == NULL) {
return -1;
}
@@ -178,17 +178,17 @@ int CTvin::CHDMIRxCEC::ClrReplyListItem(HDMIRxRequestReplyItem *reply_item)
int CTvin::CHDMIRxCEC::CopyMessageData(unsigned char data_buf[], unsigned char msg_data[], int msg_len)
{
- if(data_buf == NULL) {
+ if (data_buf == NULL) {
return 0;
}
memset((void *)data_buf, 0, CC_CEC_STREAM_SIZE);
- if(msg_len > CC_CEC_STREAM_SIZE) {
+ if (msg_len > CC_CEC_STREAM_SIZE) {
return 0;
}
- if(msg_len <= 2) {
+ if (msg_len <= 2) {
return 0;
}
@@ -217,7 +217,7 @@ int CTvin::CHDMIRxCEC::processRefreshSrcDevice(int source_input)
mSourceDevLogicAddrBuf[1] = E_LA_TV;
mSourceDevLogicAddrBuf[2] = E_LA_TV;
- for(i = 0; i < CC_SOURCE_DEV_REFRESH_CNT; i++) {
+ for (i = 0; i < CC_SOURCE_DEV_REFRESH_CNT; i++) {
if (mSourceDevRefreshBuf[i] < 0) {
continue;
}
@@ -278,7 +278,7 @@ int CTvin::CHDMIRxCEC::GetMessage(struct _cec_msg msg_buf[])
if (msg_cnt > 0) {
LOGD("%s, msg_cnt = %d\n", __FUNCTION__, msg_cnt);
- for(i = 0; i < msg_cnt; i++) {
+ for (i = 0; i < msg_cnt; i++) {
ioctl(m_cec_dev_fd, HDMI_IOC_CEC_GET_MSG, &msg_buf[i]);
PrintMessage(__FUNCTION__, 0, &msg_buf[i]);
}
@@ -341,7 +341,7 @@ int CTvin::CHDMIRxCEC::sendMessageAndWaitReply(struct _cec_msg *msg, struct _cec
mReplyList[tmp_ind].WaitReplyCondition.waitRelative(mReplyLock[tmp_ind], timeout);//wait reply
mReplyLock[tmp_ind].unlock();
- if(mReplyList[tmp_ind].DataFlag == 1) {
+ if (mReplyList[tmp_ind].DataFlag == 1) {
PrintMessage(__FUNCTION__, 0, &mReplyList[tmp_ind].msg);
*reply_msg = mReplyList[tmp_ind].msg;
} else {
@@ -415,7 +415,7 @@ int CTvin::CHDMIRxCEC::SendGiveCECVersionMessage(int source_input, unsigned char
return -1;
}
- if(data_buf == NULL) {
+ if (data_buf == NULL) {
return -1;
}
@@ -439,7 +439,7 @@ int CTvin::CHDMIRxCEC::SendGiveDeviceVendorIDMessage(int source_input, unsigned
return -1;
}
- if(data_buf == NULL) {
+ if (data_buf == NULL) {
return -1;
}
@@ -463,7 +463,7 @@ int CTvin::CHDMIRxCEC::SendGiveOSDNameMessage(int source_input, unsigned char da
return -1;
}
- if(data_buf == NULL) {
+ if (data_buf == NULL) {
return -1;
}
@@ -487,7 +487,7 @@ int CTvin::CHDMIRxCEC::SendGivePhysicalAddressMessage(int source_input, int logi
return -1;
}
- if(physical_addr == NULL) {
+ if (physical_addr == NULL) {
return -1;
}
@@ -518,7 +518,7 @@ int CTvin::CHDMIRxCEC::SendSetMenuLanguageMessage(int source_input, unsigned cha
return -1;
}
- if(data_buf == NULL) {
+ if (data_buf == NULL) {
return -1;
}
@@ -581,7 +581,7 @@ int CTvin::CHDMIRxCEC::addToRequestList(HDMIRxRequestReplyItem *reply_item)
mListLock.lock();
- for(i = 0; i < CC_REQUEST_LIST_SIZE; i++) {
+ for (i = 0; i < CC_REQUEST_LIST_SIZE; i++) {
if (mReplyList[i].WaitFlag == 0) {
mReplyList[i] = *reply_item;
mListLock.unlock();
@@ -599,7 +599,7 @@ int CTvin::CHDMIRxCEC::processData(int msg_cnt)
int i = 0, j = 0;
CECMsgStream msg_stream;
- for(i = 0; i < msg_cnt; i++) {
+ for (i = 0; i < msg_cnt; i++) {
for (j = 0; j < CC_REQUEST_LIST_SIZE; j++) {
if (mReplyList[j].WaitFlag) {
if (mMsgBuf[i].cmd == mReplyList[j].WaitCmd && ((mMsgBuf[i].addr & 0xF0) >> 4) == mReplyList[j].WaitLogicAddr) {
@@ -629,7 +629,7 @@ bool CTvin::CHDMIRxCEC::threadLoop()
mState = STATE_RUNNING;
- while(!exitPending()) { //requietexit() or requietexitWait() not call
+ while (!exitPending()) { //requietexit() or requietexitWait() not call
while (mRequestPause) {
mLock.lock();
mState = STATE_PAUSE;
diff --git a/tvapi/libtv/tvin/CSourceConnectDetect.cpp b/tvapi/libtv/tvin/CSourceConnectDetect.cpp
index ad44ad1..4399473 100644
--- a/tvapi/libtv/tvin/CSourceConnectDetect.cpp
+++ b/tvapi/libtv/tvin/CSourceConnectDetect.cpp
@@ -12,179 +12,161 @@
#include "../tvutils/tvutils.h"
#include "../tvconfig/tvconfig.h"
+#include "CSourceConnectDetect.h"
#ifdef LOG_TAG
#undef LOG_TAG
#define LOG_TAG "CSourceConnectDetect"
#endif
-#define CC_DETECT_SOURCE_AV2 (0)
-
-#define CC_DEBUG_AV_SAMPLE_BUF (1)
-
-#define CC_AV_PLUG_OUT_ADC_DEF_THRESHOLD (28) // voltage / 1800 * 1023
-#define CC_AV_PLUG_IN_ADC_DEF_THRESHOLD (70) // voltage / 1800 * 1023
-
-CTvin::CSourceConnectDetect::CSourceConnectDetect(CTvin *pTvin)
+CSourceConnectDetect::CSourceConnectDetect(CTvin *pTvin)
{
- for (int i = 0; i < SOURCE_MAX; i++) {
- mSourceDetectTable[i] = SOURCE_INVALID;
- mSourceDetectPreStatusBuf[i] = CC_SOURCE_PLUG_OUT;
- mSourceDetectCurStatusBuf[i] = CC_SOURCE_PLUG_OUT;
- }
-
- for (int i = 0; i < CC_AV_DETECT_SAMPLE_DATA_MAX_LEN; i++) {
- mAV1SampleDataBuf[i] = 0;
- mAV2SampleDataBuf[i] = 0;
- }
-
-#if CC_DETECT_SOURCE_AV2 == 1
- mSourceDetectTable[0] = SOURCE_AV1;
- mSourceDetectTable[1] = SOURCE_AV2;
- mSourceDetectTable[2] = SOURCE_HDMI1;
- mSourceDetectTable[3] = SOURCE_HDMI2;
- mSourceDetectTable[4] = SOURCE_HDMI3;
-#else
- mSourceDetectTable[0] = SOURCE_AV1;
- mSourceDetectTable[1] = SOURCE_HDMI1;
- mSourceDetectTable[2] = SOURCE_HDMI2;
- mSourceDetectTable[3] = SOURCE_HDMI3;
-#endif
-
- mSourceDetectSleepTime = 200; //default 200ms
-
- mAVDetectMethod = CC_AV_DETECT_METHOD_ADC_PLUG_OUT;
- mAVDetectPlugOutADCThreshold = CC_AV_PLUG_OUT_ADC_DEF_THRESHOLD;
- mAVDetectPlugInADCThreshold = CC_AV_PLUG_IN_ADC_DEF_THRESHOLD;
- mAVDetectPlugInDutyCycle = 70;
- mAVDetectPlugOutDutyCycle = 70;
- mAVDetectSampleSize = 15;
- mAV1DetectADCChan = 2;
- mAV2DetectADCChan = 3;
-
mpObserver = NULL;
mpTvin = pTvin;
+ if (mEpoll.create() < 0) {
+ return;
+ }
+ //avin
+ if (mAvinDetectFile.openFile(AVIN_DETECT_PATH) > 0)
+ {
+ m_event.data.fd = mAvinDetectFile.getFd();
+ m_event.events = EPOLLIN | EPOLLET;
+ mEpoll.add(mAvinDetectFile.getFd(), &m_event);
+ }
+ //HDMI
+ if (mHdmiDetectFile.openFile(HDMI_DETECT_PATH) > 0)
+ {
+ m_event.data.fd = mHdmiDetectFile.getFd();
+ m_event.events = EPOLLIN | EPOLLET;
+ mEpoll.add(mHdmiDetectFile.getFd(), &m_event);
+ }
+ //vfame size change
+ if (mVppPollFile.openFile(VPP_POLL_PATCH) > 0)
+ {
+ m_event.data.fd = mVppPollFile.getFd();
+ m_event.events = EPOLLIN | EPOLLET;
+ mEpoll.add(mVppPollFile.getFd(), &m_event);
+ }
}
-CTvin::CSourceConnectDetect::~CSourceConnectDetect()
+CSourceConnectDetect::~CSourceConnectDetect()
{
}
-int CTvin::CSourceConnectDetect::startDetect()
+int CSourceConnectDetect::startDetect()
{
- refreshDetectSources();
- refreshDetectAVInfo();
this->run();
return 0;
}
-int CTvin::CSourceConnectDetect::refreshDetectSources()
+int CSourceConnectDetect::SourceInputMaptoChipHdmiPort(tv_source_input_t source_input)
{
- int cur_index = 0;
- char *token = NULL;
- const char *strDelimit = ",";
- const char *config_value = NULL;
- char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
-
- config_value = config_get_str("TV", "tvin.SourceConnectDetect.sources", "null");
- if (strcasecmp(config_value, "null") == 0) {
- return 0;
- }
-
- for (int i = 0; i < SOURCE_MAX; i++) {
- mSourceDetectTable[i] = SOURCE_INVALID;
- mSourceDetectPreStatusBuf[i] = CC_SOURCE_PLUG_OUT;
- mSourceDetectCurStatusBuf[i] = CC_SOURCE_PLUG_OUT;
+ tvin_port_t source_port = TVIN_PORT_NULL;
+ source_port = mpTvin->Tvin_GetSourcePortBySourceInput(source_input);
+ switch (source_port)
+ {
+ case TVIN_PORT_HDMI0:
+ return HDMI_DETECT_STATUS_BIT_A;
+ break;
+ case TVIN_PORT_HDMI1:
+ return HDMI_DETECT_STATUS_BIT_B;
+ break;
+ case TVIN_PORT_HDMI2:
+ return HDMI_DETECT_STATUS_BIT_C;
+ break;
+ case TVIN_PORT_HDMI3:
+ return HDMI_DETECT_STATUS_BIT_D;
+ break;
+ default:
+ return HDMI_DETECT_STATUS_BIT_A;
+ break;
}
- cur_index = 0;
- memset((void *)data_str, 0, sizeof(data_str));
- strncpy(data_str, config_value, sizeof(data_str) - 1);
- token = strtok(data_str, strDelimit);
- while (token != NULL) {
- if (strcasecmp(token, "SOURCE_AV1") == 0) {
- mSourceDetectTable[cur_index] = SOURCE_AV1;
- cur_index += 1;
- //LOGD("%s, add detect source SOURCE_AV1.\n", __FUNCTION__);
- } else if (strcasecmp(token, "SOURCE_AV2") == 0) {
- mSourceDetectTable[cur_index] = SOURCE_AV2;
- cur_index += 1;
- //LOGD("%s, add detect source SOURCE_AV2.\n", __FUNCTION__);
- } else if (strcasecmp(token, "SOURCE_HDMI1") == 0) {
- mSourceDetectTable[cur_index] = SOURCE_HDMI1;
- cur_index += 1;
- //LOGD("%s, add detect source SOURCE_HDMI1.\n", __FUNCTION__);
- } else if (strcasecmp(token, "SOURCE_HDMI2") == 0) {
- mSourceDetectTable[cur_index] = SOURCE_HDMI2;
- cur_index += 1;
- //LOGD("%s, add detect source SOURCE_HDMI2.\n", __FUNCTION__);
- } else if (strcasecmp(token, "SOURCE_HDMI3") == 0) {
- mSourceDetectTable[cur_index] = SOURCE_HDMI3;
- cur_index += 1;
- //LOGD("%s, add detect source SOURCE_HDMI3.\n", __FUNCTION__);
- }
+}
- token = strtok(NULL, strDelimit);
+tv_source_input_t CSourceConnectDetect::ChipHdmiPortMaptoSourceInput(int port)
+{
+ switch (port)
+ {
+ case HDMI_DETECT_STATUS_BIT_A:
+ return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI0);
+ break;
+ case HDMI_DETECT_STATUS_BIT_B:
+ return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI1);
+ break;
+ case HDMI_DETECT_STATUS_BIT_C:
+ return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI2);
+ break;
+ case HDMI_DETECT_STATUS_BIT_D:
+ return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI3);
+ break;
+ default:
+ return mpTvin->Tvin_PortToSourceInput(TVIN_PORT_HDMI0);
+ break;
}
-
- return 0;
}
-int CTvin::CSourceConnectDetect::refreshDetectAVInfo()
+int CSourceConnectDetect::GetSourceConnectStatus(tv_source_input_t source_input)
{
- int cur_index = 0;
- char *token = NULL;
- const char *strDelimit = ",";
- const char *config_value = NULL;
- char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
+ int PlugStatus = -1;
+ int hdmi_status = 0;
+ int source = -1;
+ int HdmiDetectStatusBit = SourceInputMaptoChipHdmiPort((tv_source_input_t)source_input);
+ switch (source_input)
+ {
+ case SOURCE_AV2:
+ case SOURCE_AV1:
+ {
+ struct report_data_s status[2];
+ mAvinDetectFile.readFile((void *)(&status), sizeof(struct report_data_s) * 2);
+ for (int i = 0; i < 2; i++)
+ {
+ if (status[i].channel == AVIN_CHANNEL1)
+ {
+ source = SOURCE_AV1;
+ }else if (status[i].channel == AVIN_CHANNEL2)
+ {
+ source = SOURCE_AV2;
+ }
- config_value = config_get_str("TV", "tvin.SourceConnectDetect.av.info", "null");
- if (strcasecmp(config_value, "null") == 0) {
- return 0;
- }
+ if (source == source_input)
+ {
+ if (status[i].status == AVIN_STATUS_IN)
+ {
+ PlugStatus = CC_SOURCE_PLUG_IN;
+ }else {
+ PlugStatus = CC_SOURCE_PLUG_OUT;
+ }
+ break;
+ }
+ m_avin_status[i] = status[i];
+ }//end for
- cur_index = 0;
- memset((void *)data_str, 0, sizeof(data_str));
- strncpy(data_str, config_value, sizeof(data_str) - 1);
- token = strtok(data_str, strDelimit);
- while (token != NULL) {
- if (cur_index == 0) {
- mAV1DetectADCChan = strtol(token, NULL, 10);
- } else if (cur_index == 1) {
- mAV2DetectADCChan = strtol(token, NULL, 10);
- } else if (cur_index == 2) {
- mAVDetectSampleSize = strtol(token, NULL, 10);
- } else if (cur_index == 3) {
- mAVDetectMethod = strtol(token, NULL, 10);
- } else if (cur_index == 4) {
- mAVDetectPlugInDutyCycle = strtol(token, NULL, 10);
- } else if (cur_index == 5) {
- mAVDetectPlugOutDutyCycle = strtol(token, NULL, 10);
- } else if (cur_index == 6) {
- mAVDetectPlugInADCThreshold = strtol(token, NULL, 10);
- } else if (cur_index == 7) {
- mAVDetectPlugOutADCThreshold = strtol(token, NULL, 10);
+ break;
}
-
- cur_index += 1;
- token = strtok(NULL, strDelimit);
- }
-
- return 0;
-}
-
-int CTvin::CSourceConnectDetect::GetSourceConnectStatus(int source_input)
-{
- for (int i = 0; i < SOURCE_MAX; i++) {
- if (mSourceDetectTable[i] == source_input) {
- return mSourceDetectCurStatusBuf[i];
+ case SOURCE_HDMI1:
+ case SOURCE_HDMI2:
+ case SOURCE_HDMI3:
+ {
+ mHdmiDetectFile.readFile((void*)(&hdmi_status), sizeof(int));
+ if ((hdmi_status & HdmiDetectStatusBit) == HdmiDetectStatusBit)
+ {
+ PlugStatus = CC_SOURCE_PLUG_IN;
+ } else {
+ PlugStatus = CC_SOURCE_PLUG_OUT;
+ }
+ m_hdmi_status = hdmi_status;
+ break;
}
+ default:
+ LOGD("GetSourceConnectStatus not support source!!!!!!!!!!!!!!!1");
+ break;
}
- return CC_SOURCE_PLUG_OUT;
+ return PlugStatus;
}
-bool CTvin::CSourceConnectDetect::threadLoop()
+bool CSourceConnectDetect::threadLoop()
{
if ( mpObserver == NULL ) {
return false;
@@ -193,120 +175,122 @@ bool CTvin::CSourceConnectDetect::threadLoop()
LOGD("%s, entering...\n", "TV");
prctl(PR_SET_NAME, (unsigned long)"CSourceConnectDetect thread loop");
-
- mpTvin->VDIN_OpenHDMIPinMuxOn(true);
+ //init status
+ mHdmiDetectFile.readFile((void*)(&m_hdmi_status), sizeof(int));
+ mAvinDetectFile.readFile((void *)(&m_avin_status), sizeof(struct report_data_s) * 2);
+ LOGD("CSourceConnectDetect Loop, get init hdmi = 0x%x avin[0].status = %d, avin[1].status = %d", m_hdmi_status, m_avin_status[0].status, m_avin_status[1].status);
while (!exitPending()) { //requietexit() or requietexitWait() not call
- DetectSources();
-
- usleep(mSourceDetectSleepTime * 1000);
- }
-
- LOGD("%s, exiting...\n", "TV");
- //return true, run again, return false,not run.
- return false;
-}
-
-int CTvin::CSourceConnectDetect::DetectSources()
-{
- int i = 0, cur_source = 0;
-
- for (i = 0; i < SOURCE_MAX; i++) {
- cur_source = mSourceDetectTable[i];
- if (cur_source == SOURCE_AV1 || cur_source == SOURCE_AV2) {
- mSourceDetectCurStatusBuf[i] = DetectAVSource(cur_source);
- } else if (cur_source == SOURCE_HDMI1 || cur_source == SOURCE_HDMI2 || cur_source == SOURCE_HDMI3) {
- mSourceDetectCurStatusBuf[i] = DetectHDMISource(cur_source);
- }
- }
-
- for (i = 0; i < SOURCE_MAX; i++) {
- if (mSourceDetectCurStatusBuf[i] != mSourceDetectPreStatusBuf[i]) {
- mSourceDetectPreStatusBuf[i] = mSourceDetectCurStatusBuf[i];
- LOGD("%s, Source id = %d, Source plug status = %d\n", "TV", mSourceDetectTable[i], mSourceDetectCurStatusBuf[i]);
-
-#if CC_DEBUG_AV_SAMPLE_BUF == 1
- int *cur_sample_buf = NULL;
-
- if (mSourceDetectTable[i] == SOURCE_AV1) {
- cur_sample_buf = mAV1SampleDataBuf;
- } else if (mSourceDetectTable[i] == SOURCE_AV2) {
- cur_sample_buf = mAV2SampleDataBuf;
- }
+ int num = mEpoll.wait();
+ for (int i = 0; i < num; ++i) {
+ int fd = (mEpoll)[i].data.fd;
+ /**
+ * EPOLLIN event
+ */
+ if ((mEpoll)[i].events & EPOLLIN) {
+ if (fd == mAvinDetectFile.getFd()) {//avin
+ struct report_data_s status[2];
+ mAvinDetectFile.readFile((void *)(&status), sizeof(struct report_data_s) * 2);
+ for (int i = 0; i < 2; i++)
+ {
+ int source = -1, plug = -1;
+ if (/*status[i].channel == m_avin_status[i].channel &&*/ status[i].status != m_avin_status[i].status)
+ {
+ //LOGD("status[i].status != m_avin_status[i].status");
+ if (status[i].status == AVIN_STATUS_IN)
+ {
+ plug = CC_SOURCE_PLUG_IN;
+ }else {
+ plug = CC_SOURCE_PLUG_OUT;
+ }
+
+ if (status[i].channel == AVIN_CHANNEL1)
+ {
+ source = SOURCE_AV1;
+ }else if (status[i].channel == AVIN_CHANNEL2)
+ {
+ source = SOURCE_AV2;
+ }
+
+ if (mpObserver != NULL)
+ {
+ mpObserver->onSourceConnect(source, plug);
+ }
+ }//not equal
+ m_avin_status[i] = status[i];
+ }
+ }else if (fd == mHdmiDetectFile.getFd())//hdmi
+ {
+ int hdmi_status = 0;
+ mHdmiDetectFile.readFile((void*)(&hdmi_status), sizeof(int));
+ int source = -1, plug = -1;
+ if ((hdmi_status & HDMI_DETECT_STATUS_BIT_A) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_A) )
+ {
+ if ((hdmi_status & HDMI_DETECT_STATUS_BIT_A) == HDMI_DETECT_STATUS_BIT_A)
+ {
+ source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_A);
+ plug = CC_SOURCE_PLUG_IN;
+ } else {
+ source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_A);;
+ plug = CC_SOURCE_PLUG_OUT;
+ }
+ mpObserver->onSourceConnect(source, plug);
+ }
+
+ if ((hdmi_status & HDMI_DETECT_STATUS_BIT_B) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_B) )
+ {
+ if ((hdmi_status & HDMI_DETECT_STATUS_BIT_B) == HDMI_DETECT_STATUS_BIT_B)
+ {
+ source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_B);
+ plug = CC_SOURCE_PLUG_IN;
+ } else {
+ source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_B);;
+ plug = CC_SOURCE_PLUG_OUT;
+ }
+ mpObserver->onSourceConnect(source, plug);
+ }
+
+ if ((hdmi_status & HDMI_DETECT_STATUS_BIT_C) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_C) )
+ {
+ if ((hdmi_status & HDMI_DETECT_STATUS_BIT_C) == HDMI_DETECT_STATUS_BIT_C)
+ {
+ source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_C);
+ plug = CC_SOURCE_PLUG_IN;
+ } else {
+ source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_C);;
+ plug = CC_SOURCE_PLUG_OUT;
+ }
+ mpObserver->onSourceConnect(source, plug);
+ }
+
+ if ((hdmi_status & HDMI_DETECT_STATUS_BIT_D) != (m_hdmi_status & HDMI_DETECT_STATUS_BIT_D) )
+ {
+ if ((hdmi_status & HDMI_DETECT_STATUS_BIT_D) == HDMI_DETECT_STATUS_BIT_D)
+ {
+ source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_D);
+ plug = CC_SOURCE_PLUG_IN;
+ } else {
+ source = ChipHdmiPortMaptoSourceInput(HDMI_DETECT_STATUS_BIT_D);;
+ plug = CC_SOURCE_PLUG_OUT;
+ }
+ mpObserver->onSourceConnect(source, plug);
+ }
+ m_hdmi_status = hdmi_status;
+ }else if (fd == mVppPollFile.getFd())//vframe size change
+ {
+ mpObserver->onVframeSizeChange();
+ }
+ /**
+ * EPOLLOUT event
+ */
+ if ((mEpoll)[i].events & EPOLLOUT) {
- if (cur_sample_buf != NULL) {
- for (int j = 0; j < mAVDetectSampleSize; j++) {
- LOGD("%s, cur_sample_buf[%d] = %d\n", "TV", j, cur_sample_buf[j]);
}
- LOGD("%s, \n\n\n", "TV", i, cur_sample_buf[i]);
}
-#endif
-
- mpObserver->onSourceConnect(mSourceDetectTable[i], mSourceDetectCurStatusBuf[i]);
}
- }
-
- return 0;
-}
+ }//exit
-int CTvin::CSourceConnectDetect::DetectAVSource(int source_input)
-{
- int i = 0, plug_in_cnt = 0, plug_out_cnt = 0;
- int detect_adc_chan = -1, cur_adc_val = 0;
- int *cur_sample_ind = 0;
- int *cur_sample_buf = NULL;
-
- if (source_input == SOURCE_AV1) {
- detect_adc_chan = mAV1DetectADCChan;
- cur_sample_ind = &mAV1CurSampleInd;
- cur_sample_buf = mAV1SampleDataBuf;
- } else if (source_input == SOURCE_AV2) {
- detect_adc_chan = mAV2DetectADCChan;
- cur_sample_ind = &mAV2CurSampleInd;
- cur_sample_buf = mAV2SampleDataBuf;
- } else {
- return CC_SOURCE_PLUG_OUT;
- }
-
- cur_adc_val = ReadADCSpecialChannelValue(detect_adc_chan);
- *cur_sample_ind = *cur_sample_ind % mAVDetectSampleSize;
- cur_sample_buf[*cur_sample_ind] = cur_adc_val;
- *cur_sample_ind = (*cur_sample_ind + 1 ) % mAVDetectSampleSize;
-
- plug_in_cnt = 0;
- plug_out_cnt = 0;
- for (i = 0; i < mAVDetectSampleSize; i++) {
- if (cur_sample_buf[i] >= mAVDetectPlugInADCThreshold) {
- plug_in_cnt += 1;
- } else if (cur_sample_buf[i] <= mAVDetectPlugOutADCThreshold) {
- plug_out_cnt += 1;
- }
- }
-
- if (mAVDetectMethod == CC_AV_DETECT_METHOD_ADC_PLUG_IN) {
- if ((plug_in_cnt * 100 / mAVDetectSampleSize) >= mAVDetectPlugInDutyCycle) {
- return CC_SOURCE_PLUG_IN;
- }
-
- return CC_SOURCE_PLUG_OUT;
- } else if (mAVDetectMethod == CC_AV_DETECT_METHOD_ADC_PLUG_OUT) {
- if ((plug_out_cnt * 100 / mAVDetectSampleSize) >= mAVDetectPlugOutDutyCycle) {
- return CC_SOURCE_PLUG_OUT;
- }
-
- return CC_SOURCE_PLUG_IN;
- }
-
- return CC_SOURCE_PLUG_OUT;
-}
-
-int CTvin::CSourceConnectDetect::DetectHDMISource(int source_input)
-{
- int source_port = CTvin::Tvin_GetSourcePortBySourceInput((tv_source_input_t)source_input);
-
- if (mpTvin->VDIN_GetPortConnect(source_port) == true) {
- return CC_SOURCE_PLUG_IN;
- }
-
- return CC_SOURCE_PLUG_OUT;
+ LOGD("%s, exiting...\n", "CSourceConnectDetect");
+ //return true, run again, return false,not run.
+ return false;
}
diff --git a/tvapi/libtv/tvin/CSourceConnectDetect.h b/tvapi/libtv/tvin/CSourceConnectDetect.h
new file mode 100644
index 0000000..a1c4569
--- a/dev/null
+++ b/tvapi/libtv/tvin/CSourceConnectDetect.h
@@ -0,0 +1,73 @@
+#ifndef C_SOURCE_CONNECT_DETECT_H
+#define C_SOURCE_CONNECT_DETECT_H
+#include "../tvutils/CThread.h"
+#include "../tvutils/CFile.h"
+enum avin_status_e {
+ AVIN_STATUS_IN = 0,
+ AVIN_STATUS_OUT = 1,
+ AVIN_STATUS_UNKNOW = 2,
+};
+enum avin_channel_e {
+ AVIN_CHANNEL1 = 0,
+ AVIN_CHANNEL2 = 1,
+};
+
+struct report_data_s {
+ enum avin_channel_e channel;
+ enum avin_status_e status;
+};
+
+/*
+3 R 0 stat_5v_portD:
+Status of 5v power for port D.
+2 R 0 stat_5v_portC:
+Status of 5v power for port C.
+1 R 0 stat_5v_portB:
+Status of 5v power for port B.
+0 R 0 stat_5v_portA:
+Status of 5v power for port A.
+ */
+static const int HDMI_DETECT_STATUS_BIT_A = 0x01;
+static const int HDMI_DETECT_STATUS_BIT_B = 0x02;
+static const int HDMI_DETECT_STATUS_BIT_C = 0x04;
+static const int HDMI_DETECT_STATUS_BIT_D = 0x08;
+
+static const char* AVIN_DETECT_PATH = "/dev/avin_detect";
+static const char* HDMI_DETECT_PATH = "/dev/hdmirx0";
+static const char* VPP_POLL_PATCH = "/dev/amvideo_poll";
+
+class CSourceConnectDetect: public CThread {
+public:
+ CSourceConnectDetect(CTvin *pTvin);
+ ~CSourceConnectDetect();
+ int startDetect();
+ int GetSourceConnectStatus(tv_source_input_t source_input);
+ int SourceInputMaptoChipHdmiPort(tv_source_input_t source_input);
+ tv_source_input_t ChipHdmiPortMaptoSourceInput(int port);
+
+ class ISourceConnectObserver {
+ public:
+ ISourceConnectObserver() {};
+ virtual ~ISourceConnectObserver() {};
+ virtual void onSourceConnect(int source, int connect_status) {};
+ virtual void onVframeSizeChange() {};
+ };
+ void setObserver ( ISourceConnectObserver *pOb )
+ {
+ mpObserver = pOb;
+ };
+private:
+ bool threadLoop();
+
+ ISourceConnectObserver *mpObserver;
+ CTvin *mpTvin;
+ Epoll mEpoll;
+ mutable CMutex mLock;
+ epoll_event m_event;
+ CFile mAvinDetectFile;
+ CFile mHdmiDetectFile;
+ CFile mVppPollFile;
+ struct report_data_s m_avin_status[2];
+ int m_hdmi_status;
+};
+#endif
diff --git a/tvapi/libtv/tvin/CTvin.cpp b/tvapi/libtv/tvin/CTvin.cpp
index 4f27455..66a2a1f 100644
--- a/tvapi/libtv/tvin/CTvin.cpp
+++ b/tvapi/libtv/tvin/CTvin.cpp
@@ -20,6 +20,7 @@
#include "../tvsetting/CTvSetting.h"
#include "../tvutils/tvutils.h"
#include "../tvconfig/tvconfig.h"
+#include "CFbcCommunication.h"
#ifdef LOG_TAG
@@ -460,7 +461,7 @@ int CTvin::VDIN_GetSignalInfo ( struct tvin_info_s *SignalInfo )
if ( rt < 0 ) {
LOGW ( "Vdin get signal info, error(%s), ret = %d.\n", strerror ( errno ), rt );
- system("reboot");
+ //system("reboot");
}
return rt;
@@ -531,20 +532,14 @@ int CTvin::VDIN_GetDisplayVFreq (void)
memset(buf, 0, sizeof(buf));
read(fd, buf, sizeof(buf));
close(fd);
- if(strncmp("4k2k50hz420", buf, 11) == 0) {
- LOGD("VDIN_GetDisplayVFreq (%s)----1.\n", buf);
+ LOGD( "s%, VDIN_GetDisplayVFreq is %s\n", __FUNCTION__, buf);
+ if (strstr(buf, "50hz") != NULL) {
return 50;
- } else if (strncmp("4k2k60hz420", buf, 11) == 0) {
- LOGD("VDIN_GetDisplayVFreq (%s)----2.\n", buf);
+ } else if (strstr(buf, "60hz") != 0) {
return 60;
- } else if (strncmp("1080p", buf, 5) == 0) {
- LOGD("VDIN_GetDisplayVFreq (%s)----3.\n", buf);
- return 60;
- } else if (strncmp("4k2k30hz", buf, 8) == 0) {
- LOGD("VDIN_GetDisplayVFreq (%s)----4.\n", buf);
- return 30;
+ } else {
+ return 50;
}
- return 50;
}
int CTvin::VDIN_SetDisplayVFreq ( int freq, int display_resolution , bool isFbc)
@@ -552,6 +547,17 @@ int CTvin::VDIN_SetDisplayVFreq ( int freq, int display_resolution , bool isFbc)
FILE *fp = NULL;
const char *config_value = NULL;
static int display_mode_type = -1;
+ CFbcCommunication *pFBC = NULL;
+ static int last_freq = 50;
+
+ last_freq = VDIN_GetDisplayVFreq();
+ if (last_freq == freq) {
+ LOGD ( "%s, same freq, last_freq = %d, freq = %d.", __FUNCTION__, last_freq, freq);
+ return 0;
+ } else {
+ LOGD ( "%s, from last_freq[%d[ to new_freq[%d].", __FUNCTION__, last_freq, freq);
+ last_freq = freq;
+ }
if (display_mode_type == -1) {
config_value = config_get_str ( "TV", "tvin.display.mode.type", "null" );
@@ -571,6 +577,14 @@ int CTvin::VDIN_SetDisplayVFreq ( int freq, int display_resolution , bool isFbc)
return -1;
}
+ if ( isFbc ) {
+ pFBC = GetSingletonFBC();
+ if (pFBC != NULL) {
+ pFBC->cfbc_Set_VMute (COMM_DEV_SERIAL, 2);
+ usleep ( 300000 );
+ }
+ }
+
switch ( display_resolution ) {
case VPP_DISPLAY_RESOLUTION_1366X768:
if ( freq == 50 ) {
@@ -581,16 +595,16 @@ int CTvin::VDIN_SetDisplayVFreq ( int freq, int display_resolution , bool isFbc)
break;
case VPP_DISPLAY_RESOLUTION_3840X2160:
if ( freq == 50 ) {
- if(isFbc) {
- fprintf ( fp, "%s", "4k2k50hz420" );
+ if (isFbc) {
+ fprintf ( fp, "%s", "2160p50hz420" );
} else {
- fprintf ( fp, "%s", "4k2k50hz" );
+ fprintf ( fp, "%s", "2160p50hz" );
}
} else {
- if(isFbc) {
- fprintf ( fp, "%s", "4k2k60hz420" );
+ if (isFbc) {
+ fprintf ( fp, "%s", "2160p60hz420" );
} else {
- fprintf ( fp, "%s", "4k2k60hz" );
+ fprintf ( fp, "%s", "2160p60hz" );
}
}
break;
@@ -599,7 +613,7 @@ int CTvin::VDIN_SetDisplayVFreq ( int freq, int display_resolution , bool isFbc)
if ( freq == 50 ) {
fprintf ( fp, "%s", "1080p50hz" );
} else {
- fprintf ( fp, "%s", "1080p" );
+ fprintf ( fp, "%s", "1080p60hz" );
}
break;
}
@@ -655,6 +669,27 @@ int CTvin::VDIN_Set2Dto3D ( int on_off )
VdinParam.flag |= ( on_off ) ? ( TVIN_PARM_FLAG_2D_TO_3D ) : ( 0 );
return VDIN_SetVdinParam ( &VdinParam );
}
+
+int CTvin::VDIN_Get_avg_luma(void)
+{
+ unsigned int lum_sum,pixel_sum,luma_avg;
+ struct tvin_parm_s vdinParam;
+
+ if ( 0 == VDIN_GetVdinParam( &vdinParam )) {
+ lum_sum = vdinParam.luma_sum;
+ pixel_sum = vdinParam.pixel_sum*2;
+ if (pixel_sum != 0 && m_is_decoder_start) {
+ luma_avg = lum_sum/pixel_sum;
+ } else {
+ luma_avg = 116;
+ }
+ } else {
+ return -1;
+ }
+ LOGD ( "VDIN_get_avg_lut lum_sum =%d,pixel_sum=%d,lut_avg=%d\n", lum_sum,pixel_sum,luma_avg);
+ return luma_avg;
+}
+
int CTvin::VDIN_GetHistgram ( int *hisgram )
{
int i = 0;
@@ -1119,15 +1154,23 @@ int CTvin::set3D_FL_Frame(int value)
int CTvin::setLatchFlag(int value)
{
+ int fd = -1;
+ int nodeVal = 0;
+ char s[10];
FILE *fp = NULL;
+ memset(s, 0, sizeof(s));
+ read(fd, s, sizeof(s));
+ close(fd);
+ nodeVal = atoi(s);
fp = fopen ( "/sys/module/am_vecm/parameters/vecm_latch_flag", "w" );
if ( fp == NULL ) {
LOGW ( "/sys/module/am_vecm/parameters/vecm_latch_flag error(%s)!\n", strerror ( errno ) );
return -1;
}
- fprintf ( fp, "%d", value );
+ fprintf ( fp, "%d", value | nodeVal);
fclose ( fp );
fp = NULL;
+ LOGD ( "read vecm_latch_flag = (%s)====(0x%x), then set vecm_latch_flag | 0x%x = 0x%x.\n", s, nodeVal, value, value | nodeVal);
return 0;
}
@@ -1152,15 +1195,15 @@ int CTvin::VDIN_SetDIProg_Proc_Config ( int value )
return 0;
}
#if(1)
-int CTvin::VDIN_SetDISip_Top_Bot ( int value )
+int CTvin::VDIN_SetDIInput2Pre ( int value )
{
FILE *fp = NULL;
- fp = fopen ( "/sys/module/di/parameters/skip_top_bot", "w" );
+ fp = fopen ( "/sys/module/di/parameters/input2pre", "w" );
if ( fp == NULL ) {
- LOGW ( "Open /sys/module/di/parameters/skip_top_bot error(%s)!\n", strerror ( errno ) );
+ LOGW ( "Open /sys/module/di/parameters/input2pre error(%s)!\n", strerror ( errno ) );
return -1;
}
@@ -1812,7 +1855,7 @@ int CTvin::get_frame_average ( enum adc_cal_type_e calType, struct adc_cal_s *me
mem_data->cr_black /= CR_BLACK_SIZE;
/*
- for(j=COMP_BLACK_VS; j<=COMP_BLACK_VE; j++) {
+ for (j=COMP_BLACK_VS; j<=COMP_BLACK_VE; j++) {
for (i=COMP_BLACK_HS; i<=COMP_BLACK_HE;) {
//mem_data->cb_black += get_mem_data(dp, ((COMP_BUF_WID*j+i)*YCBCR422+CB422_POS));
mem_data->cr_black += get_mem_data(dp, ((COMP_BUF_WID*j+i)*YCBCR422+CR422_POS));
@@ -2611,6 +2654,40 @@ int CTvin::isVgaFmtInHdmi ( tvin_sig_fmt_t fmt )
return -1;
}
+int CTvin::isSDFmtInHdmi ( tvin_sig_fmt_t fmt )
+{
+ if ( fmt == TVIN_SIG_FMT_HDMI_640X480P_60HZ
+ || fmt == TVIN_SIG_FMT_HDMI_720X480P_60HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X480I_60HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X240P_60HZ
+ || fmt == TVIN_SIG_FMT_HDMI_2880X480I_60HZ
+ || fmt == TVIN_SIG_FMT_HDMI_2880X240P_60HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X480P_60HZ
+ || fmt == TVIN_SIG_FMT_HDMI_720X576P_50HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X576I_50HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X288P_50HZ
+ || fmt == TVIN_SIG_FMT_HDMI_2880X576I_50HZ
+ || fmt == TVIN_SIG_FMT_HDMI_2880X288P_50HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X576P_50HZ
+ || fmt == TVIN_SIG_FMT_HDMI_2880X480P_60HZ
+ || fmt == TVIN_SIG_FMT_HDMI_2880X576P_60HZ
+ || fmt == TVIN_SIG_FMT_HDMI_720X576P_100HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X576I_100HZ
+ || fmt == TVIN_SIG_FMT_HDMI_720X480P_120HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X480I_120HZ
+ || fmt == TVIN_SIG_FMT_HDMI_720X576P_200HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X576I_200HZ
+ || fmt == TVIN_SIG_FMT_HDMI_720X480P_240HZ
+ || fmt == TVIN_SIG_FMT_HDMI_1440X480I_240HZ
+ || fmt == TVIN_SIG_FMT_HDMI_800X600_00HZ
+ || fmt == TVIN_SIG_FMT_HDMI_720X400_00HZ ) {
+ LOGD ( "%s, SD format.", "TV" );
+ return true;
+ } else {
+ LOGD ( "%s, HD format.", "TV" );
+ return false;
+ }
+}
bool CTvin::Tvin_is50HzFrameRateFmt ( tvin_sig_fmt_t fmt )
{
@@ -3037,6 +3114,7 @@ CTvin::CTvinSigDetect::CTvinSigDetect ( CTvin *pTvin )
mpObserver = NULL;
mpTvin = pTvin;
mKeepNosigTime = 0;
+ mResumeLaterTime = 0;
m_is_nosig_checktimes_once_valid = false;
}
@@ -3045,7 +3123,7 @@ CTvin::CTvinSigDetect::~CTvinSigDetect()
}
-int CTvin::CTvinSigDetect::startDetect()
+int CTvin::CTvinSigDetect::startDetect(bool bPause)
{
LOGD ( "startDetect()" );
@@ -3061,7 +3139,7 @@ int CTvin::CTvinSigDetect::startDetect()
m_pre_sig_info = m_cur_sig_info;
//
- m_request_pause_detect = false;
+ m_request_pause_detect = bPause;
this->run();
return mDetectState;
}
@@ -3075,6 +3153,7 @@ int CTvin::CTvinSigDetect::initSigState()
m_pre_sig_info = m_cur_sig_info;
mKeepNosigTime = 0;
m_is_nosig_checktimes_once_valid = false;
+ mResumeLaterTime = 0;
return 0;
}
@@ -3107,10 +3186,11 @@ int CTvin::CTvinSigDetect::requestAndWaitPauseDetect()
return 0;
}
-int CTvin::CTvinSigDetect::resumeDetect()
+int CTvin::CTvinSigDetect::resumeDetect(int later)//ms
{
CMutex::Autolock _l ( mLock );
LOGD ( "resumeDetect()" );
+ mResumeLaterTime = later;
m_request_pause_detect = false;
mDetectPauseCondition.signal();
return 0;
@@ -3128,23 +3208,23 @@ int CTvin::CTvinSigDetect::Tv_TvinSigDetect ( int &sleeptime )
mpTvin->VDIN_GetSignalInfo ( &m_cur_sig_info ); //get info
//set no sig check times
static long long sNosigKeepTime = 0;
- //LOGD("stime=%d status=%d, sNosigKeepTime = %d, mKeepNosigTime = %d", sleeptime, m_cur_sig_info.status, sNosigKeepTime, mKeepNosigTime);
- if(m_cur_sig_info.status == TVIN_SIG_STATUS_NOSIG || m_cur_sig_info.status == TVIN_SIG_STATUS_NULL) {
+ //LOGD("stime=%d status=%d, fmt = %d sNosigKeepTime = %d, mKeepNosigTime = %d", sleeptime, m_cur_sig_info.status,m_cur_sig_info.fmt, sNosigKeepTime, mKeepNosigTime);
+ if ( m_cur_sig_info.status == TVIN_SIG_STATUS_NOSIG || m_cur_sig_info.status == TVIN_SIG_STATUS_NULL ) {
sNosigKeepTime += sleeptime;
- if(sNosigKeepTime > mKeepNosigTime) { //real no sig
+ if ( sNosigKeepTime > mKeepNosigTime ) { //real no sig
//cur is no sig
- if(m_is_nosig_checktimes_once_valid) { //just once change,is nosig, and default it
+ if ( m_is_nosig_checktimes_once_valid ) { //just once change,is nosig, and default it
m_is_nosig_checktimes_once_valid = false;
mKeepNosigTime = 0;
}
//
- } else { //not
+ } else {//not
m_cur_sig_info.status = m_pre_sig_info.status;
}
} else {
sNosigKeepTime = 0;
//
- if(m_is_nosig_checktimes_once_valid) { //just once change,not nosig,default is
+ if ( m_is_nosig_checktimes_once_valid ) { //just once change,not nosig,default is
m_is_nosig_checktimes_once_valid = false;
mKeepNosigTime = 0;
}
@@ -3157,7 +3237,7 @@ int CTvin::CTvinSigDetect::Tv_TvinSigDetect ( int &sleeptime )
if ( m_cur_sig_info.status == TVIN_SIG_STATUS_STABLE ) { // to stable
//
- sleeptime = 200;
+ sleeptime = 20;
mpObserver->onSigToStable();
} else if ( m_pre_sig_info.status == TVIN_SIG_STATUS_STABLE && m_cur_sig_info.status == TVIN_SIG_STATUS_UNSTABLE ) { //stable to unstable
//
@@ -3199,6 +3279,12 @@ int CTvin::CTvinSigDetect::Tv_TvinSigDetect ( int &sleeptime )
//
sleeptime = 20;//sleeptime = 500;
mpObserver->onSigStillStable();
+ if ( m_cur_sig_info.trans_fmt != m_pre_sig_info.trans_fmt ) {
+ mpObserver->onStableTransFmtChange();
+ }
+ if (m_cur_sig_info.fmt != m_pre_sig_info.fmt) {
+ mpObserver->onStableSigFmtChange();
+ }
break;
case TVIN_SIG_STATUS_NOTSUP:
@@ -3251,16 +3337,24 @@ bool CTvin::CTvinSigDetect::threadLoop()
while ( !exitPending() ) { //requietexit() or requietexitWait() not call
while ( m_request_pause_detect ) {
- mRequestPauseCondition.broadcast();
mLock.lock();
+ mRequestPauseCondition.broadcast();
mDetectState = STATE_PAUSE;
mDetectPauseCondition.wait ( mLock ); //first unlock,when return,lock again,so need,call unlock
mDetectState = STATE_RUNNING;
mLock.unlock();
+ //
+ while (!m_request_pause_detect && mResumeLaterTime > 0) {
+ //LOGD("mResumeLaterTime = %d", mResumeLaterTime);
+ usleep(10 * 1000);
+ mResumeLaterTime -= 10;
+ }
}
//
- mpObserver->onLoop();
+ mResumeLaterTime = 0;
+ //
+ mpObserver->onSigDetectLoop();
Tv_TvinSigDetect ( sleeptime );
//å¯ä»¥ä¼˜åŒ–
if ( !m_request_pause_detect ) {
@@ -3278,15 +3372,46 @@ bool CTvin::CTvinSigDetect::threadLoop()
v4l2_std_id CTvin::CvbsFtmToV4l2ColorStd(tvin_sig_fmt_t fmt)
{
v4l2_std_id v4l2_std;
- if(fmt == TVIN_SIG_FMT_CVBS_NTSC_M || fmt == TVIN_SIG_FMT_CVBS_NTSC_443) {
+ if (fmt == TVIN_SIG_FMT_CVBS_NTSC_M || fmt == TVIN_SIG_FMT_CVBS_NTSC_443) {
v4l2_std = V4L2_COLOR_STD_NTSC;
- } else if(fmt >= TVIN_SIG_FMT_CVBS_PAL_I && fmt <= TVIN_SIG_FMT_CVBS_PAL_CN) {
+ } else if (fmt >= TVIN_SIG_FMT_CVBS_PAL_I && fmt <= TVIN_SIG_FMT_CVBS_PAL_CN) {
v4l2_std = V4L2_COLOR_STD_PAL;
- } else if(fmt == TVIN_SIG_FMT_CVBS_SECAM) {
+ } else if (fmt == TVIN_SIG_FMT_CVBS_SECAM) {
v4l2_std = V4L2_COLOR_STD_SECAM;
} else {
v4l2_std = V4L2_COLOR_STD_PAL;
}
return v4l2_std;
}
+
+
+int CTvin::CvbsFtmToColorStdEnum(tvin_sig_fmt_t fmt)
+{
+ v4l2_std_id v4l2_std;
+ if (fmt == TVIN_SIG_FMT_CVBS_NTSC_M || fmt == TVIN_SIG_FMT_CVBS_NTSC_443) {
+ v4l2_std = CC_ATV_VIDEO_STD_NTSC;
+ } else if (fmt >= TVIN_SIG_FMT_CVBS_PAL_I && fmt <= TVIN_SIG_FMT_CVBS_PAL_CN) {
+ v4l2_std = CC_ATV_VIDEO_STD_PAL;
+ } else if (fmt == TVIN_SIG_FMT_CVBS_SECAM) {
+ v4l2_std = CC_ATV_VIDEO_STD_SECAM;
+ } else {
+ v4l2_std = CC_ATV_VIDEO_STD_PAL;
+ }
+ return v4l2_std;
+}
+
+int CTvin::GetITContent()
+{
+ FILE *fp = NULL;
+ int value = 0;
+ fp = fopen("/sys/module/tvin_hdmirx/parameters/it_content", "r");
+ if (fp == NULL) {
+ LOGE ( "Open /sys/module/tvin_hdmirx/parameters/it_content error(%s)!\n", strerror ( errno ) );
+ return -1;
+ }
+ fscanf(fp, "%d", &value );
+ fclose(fp);
+ fp = NULL;
+ return value;
+}
//**************************************************************************
diff --git a/tvapi/libtv/tvin/CTvin.h b/tvapi/libtv/tvin/CTvin.h
index 3d4b444..44af963 100644
--- a/tvapi/libtv/tvin/CTvin.h
+++ b/tvapi/libtv/tvin/CTvin.h
@@ -98,7 +98,7 @@ typedef enum tvin_port_e {
TVIN_PORT_CVBS0 = 0x00001000,
TVIN_PORT_CVBS1,
TVIN_PORT_CVBS2,
- TVIN_PORT_CVBS3, //as atv demod to tvafe
+ TVIN_PORT_CVBS3, //as atv demod to tvafe
TVIN_PORT_CVBS4,
TVIN_PORT_CVBS5,
TVIN_PORT_CVBS6,
@@ -463,7 +463,7 @@ typedef struct tvin_info_s {
enum tvin_sig_fmt_e fmt;
volatile enum tvin_sig_status_e status;
enum tvin_color_fmt_e cfmt;
- unsigned int fps;
+ unsigned int fps;
unsigned int reserved;
} tvin_info_t;
@@ -592,59 +592,59 @@ typedef enum tvafe_cvbs_video_e {
typedef enum tvafe_adc_pin_e {
TVAFE_ADC_PIN_NULL = 0,
#if (MESON_CPU_TYPE == MESON_CPU_TYPE_MESONG9TV)
- TVAFE_CVBS_IN0 = 1,
- TVAFE_CVBS_IN1 = 2,
- TVAFE_CVBS_IN2 = 3,
- TVAFE_CVBS_IN3 = 4,//as atvdemod to tvafe
+ TVAFE_CVBS_IN0 = 1,
+ TVAFE_CVBS_IN1 = 2,
+ TVAFE_CVBS_IN2 = 3,
+ TVAFE_CVBS_IN3 = 4,//as atvdemod to tvafe
#else
- TVAFE_ADC_PIN_A_PGA_0 = 1,
- TVAFE_ADC_PIN_A_PGA_1 = 2,
- TVAFE_ADC_PIN_A_PGA_2 = 3,
- TVAFE_ADC_PIN_A_PGA_3 = 4,
- TVAFE_ADC_PIN_A_PGA_4 = 5,
- TVAFE_ADC_PIN_A_PGA_5 = 6,
- TVAFE_ADC_PIN_A_PGA_6 = 7,
- TVAFE_ADC_PIN_A_PGA_7 = 8,
- TVAFE_ADC_PIN_A_0 = 9,
- TVAFE_ADC_PIN_A_1 = 10,
- TVAFE_ADC_PIN_A_2 = 11,
- TVAFE_ADC_PIN_A_3 = 12,
- TVAFE_ADC_PIN_A_4 = 13,
- TVAFE_ADC_PIN_A_5 = 14,
- TVAFE_ADC_PIN_A_6 = 15,
- TVAFE_ADC_PIN_A_7 = 16,
- TVAFE_ADC_PIN_B_0 = 17,
- TVAFE_ADC_PIN_B_1 = 18,
- TVAFE_ADC_PIN_B_2 = 19,
- TVAFE_ADC_PIN_B_3 = 20,
- TVAFE_ADC_PIN_B_4 = 21,
- TVAFE_ADC_PIN_B_5 = 22,
- TVAFE_ADC_PIN_B_6 = 23,
- TVAFE_ADC_PIN_B_7 = 24,
- TVAFE_ADC_PIN_C_0 = 25,
- TVAFE_ADC_PIN_C_1 = 26,
- TVAFE_ADC_PIN_C_2 = 27,
- TVAFE_ADC_PIN_C_3 = 28,
- TVAFE_ADC_PIN_C_4 = 29,
- TVAFE_ADC_PIN_C_5 = 30,
- TVAFE_ADC_PIN_C_6 = 31,
- TVAFE_ADC_PIN_C_7 = 32,
- TVAFE_ADC_PIN_D_0 = 33,
- TVAFE_ADC_PIN_D_1 = 34,
- TVAFE_ADC_PIN_D_2 = 35,
- TVAFE_ADC_PIN_D_3 = 36,
- TVAFE_ADC_PIN_D_4 = 37,
- TVAFE_ADC_PIN_D_5 = 38,
- TVAFE_ADC_PIN_D_6 = 39,
- TVAFE_ADC_PIN_D_7 = 40,
- TVAFE_ADC_PIN_SOG_0 = 41,
- TVAFE_ADC_PIN_SOG_1 = 42,
- TVAFE_ADC_PIN_SOG_2 = 43,
- TVAFE_ADC_PIN_SOG_3 = 44,
- TVAFE_ADC_PIN_SOG_4 = 45,
- TVAFE_ADC_PIN_SOG_5 = 46,
- TVAFE_ADC_PIN_SOG_6 = 47,
- TVAFE_ADC_PIN_SOG_7 = 48,
+ TVAFE_ADC_PIN_A_PGA_0 = 1,
+ TVAFE_ADC_PIN_A_PGA_1 = 2,
+ TVAFE_ADC_PIN_A_PGA_2 = 3,
+ TVAFE_ADC_PIN_A_PGA_3 = 4,
+ TVAFE_ADC_PIN_A_PGA_4 = 5,
+ TVAFE_ADC_PIN_A_PGA_5 = 6,
+ TVAFE_ADC_PIN_A_PGA_6 = 7,
+ TVAFE_ADC_PIN_A_PGA_7 = 8,
+ TVAFE_ADC_PIN_A_0 = 9,
+ TVAFE_ADC_PIN_A_1 = 10,
+ TVAFE_ADC_PIN_A_2 = 11,
+ TVAFE_ADC_PIN_A_3 = 12,
+ TVAFE_ADC_PIN_A_4 = 13,
+ TVAFE_ADC_PIN_A_5 = 14,
+ TVAFE_ADC_PIN_A_6 = 15,
+ TVAFE_ADC_PIN_A_7 = 16,
+ TVAFE_ADC_PIN_B_0 = 17,
+ TVAFE_ADC_PIN_B_1 = 18,
+ TVAFE_ADC_PIN_B_2 = 19,
+ TVAFE_ADC_PIN_B_3 = 20,
+ TVAFE_ADC_PIN_B_4 = 21,
+ TVAFE_ADC_PIN_B_5 = 22,
+ TVAFE_ADC_PIN_B_6 = 23,
+ TVAFE_ADC_PIN_B_7 = 24,
+ TVAFE_ADC_PIN_C_0 = 25,
+ TVAFE_ADC_PIN_C_1 = 26,
+ TVAFE_ADC_PIN_C_2 = 27,
+ TVAFE_ADC_PIN_C_3 = 28,
+ TVAFE_ADC_PIN_C_4 = 29,
+ TVAFE_ADC_PIN_C_5 = 30,
+ TVAFE_ADC_PIN_C_6 = 31,
+ TVAFE_ADC_PIN_C_7 = 32,
+ TVAFE_ADC_PIN_D_0 = 33,
+ TVAFE_ADC_PIN_D_1 = 34,
+ TVAFE_ADC_PIN_D_2 = 35,
+ TVAFE_ADC_PIN_D_3 = 36,
+ TVAFE_ADC_PIN_D_4 = 37,
+ TVAFE_ADC_PIN_D_5 = 38,
+ TVAFE_ADC_PIN_D_6 = 39,
+ TVAFE_ADC_PIN_D_7 = 40,
+ TVAFE_ADC_PIN_SOG_0 = 41,
+ TVAFE_ADC_PIN_SOG_1 = 42,
+ TVAFE_ADC_PIN_SOG_2 = 43,
+ TVAFE_ADC_PIN_SOG_3 = 44,
+ TVAFE_ADC_PIN_SOG_4 = 45,
+ TVAFE_ADC_PIN_SOG_5 = 46,
+ TVAFE_ADC_PIN_SOG_6 = 47,
+ TVAFE_ADC_PIN_SOG_7 = 48,
#endif
TVAFE_ADC_PIN_MAX,
} tvafe_adc_pin_t;
@@ -843,7 +843,7 @@ typedef struct tvafe_pin_mux_s {
#define TVIN_IOC_G_AFE_CVBS_LOCK _IOR(TVIN_IOC_MAGIC, 0x1a, enum tvafe_cvbs_video_e)
#define TVIN_IOC_S_AFE_CVBS_STD _IOW(TVIN_IOC_MAGIC, 0x1b, enum tvin_sig_fmt_e)
#define TVIN_IOC_CALLMASTER_SET _IOW(TVIN_IOC_MAGIC, 0x1c, enum tvin_port_e)
-#define TVIN_IOC_CALLMASTER_GET _IO( TVIN_IOC_MAGIC, 0x1d)
+#define TVIN_IOC_CALLMASTER_GET _IO( TVIN_IOC_MAGIC, 0x1d)
#define TVIN_IOC_S_AFE_ADC_COMP_CAL _IOW(TVIN_IOC_MAGIC, 0x1e, struct tvafe_adc_comp_cal_s)
#define TVIN_IOC_G_AFE_ADC_COMP_CAL _IOR(TVIN_IOC_MAGIC, 0x1f, struct tvafe_adc_comp_cal_s)
#define TVIN_IOC_LOAD_REG _IOW(TVIN_IOC_MAGIC, 0x20, struct am_regs_s)
@@ -983,8 +983,8 @@ typedef enum tv_audio_in_source_type_e {
#define CC_RESOLUTION_3840X2160_H (2160)
typedef enum tv_source_connect_detect_status_e {
- CC_SOURCE_PLUG_OUT,
- CC_SOURCE_PLUG_IN,
+ CC_SOURCE_PLUG_OUT = 0,
+ CC_SOURCE_PLUG_IN = 1,
} tv_source_connect_detect_status_t;
//HDMI rx cec
@@ -1079,7 +1079,7 @@ public:
int VDIN_Set2Dto3D ( int on_off );
int VDIN_Set3DCmd ( int cmd );
-
+ int VDIN_Get_avg_luma(void);
int VDIN_GetHistgram ( int *hisgram );
int VDIN_SetMVCViewMode ( int mode );
int VDIN_GetMVCViewMode ( void );
@@ -1101,7 +1101,7 @@ public:
int VDIN_SetDIBypass3D ( int enable );
int VDIN_SetDIBypassPost ( int enable );
int VDIN_SetDIProg_Proc_Config ( int value );
- int VDIN_SetDISip_Top_Bot ( int value );
+ int VDIN_SetDIInput2Pre ( int value );
int VDIN_SetVdinFlag ( int flag );
int VDIN_EnableRDMA ( int enable );
int VDIN_GetHdmiHdcpKeyKsvInfo(struct _hdcp_ksv *msg);
@@ -1130,10 +1130,11 @@ public:
struct adc_cal_s get_n_frame_average ( enum adc_cal_type_e calType ) ;
int AFE_GetMemData ( int typeSel, struct adc_cal_s *mem_data );
int AFE_GetCVBSLockStatus ( enum tvafe_cvbs_video_e *cvbs_lock_status );
- int AFE_SetCVBSStd ( unsigned int sig_fmt );
+ static int CvbsFtmToColorStdEnum(tvin_sig_fmt_t fmt);
int VDIN_GetPortConnect ( int port );
int VDIN_OpenHDMIPinMuxOn ( bool flag );
int TVAFE_EnablePlugInDetect ( bool flag );
+ int GetITContent();
/*******************************************extend funs*********************/
static tv_source_input_type_t Tvin_SourcePortToSourceInputType ( tvin_port_t source_port );
static tv_source_input_type_t Tvin_SourceInputToSourceInputType ( tv_source_input_t source_input );
@@ -1146,6 +1147,7 @@ public:
static tv_audio_in_source_type_t Tvin_GetAudioInSourceType ( tv_source_input_t source_input );
static tv_source_input_t Tvin_PortToSourceInput ( tvin_port_t port );
static int isVgaFmtInHdmi ( tvin_sig_fmt_t fmt );
+ static int isSDFmtInHdmi ( tvin_sig_fmt_t fmt );
static bool Tvin_is50HzFrameRateFmt ( tvin_sig_fmt_t fmt );
static bool Tvin_IsDeinterlaceFmt ( tvin_sig_fmt_t fmt );
static v4l2_std_id CvbsFtmToV4l2ColorStd(tvin_sig_fmt_t fmt);
@@ -1156,10 +1158,10 @@ public:
static const int VDIN_NOSIG_DEFAULT_CHECK_TIMES = 1;
CTvinSigDetect ( CTvin *pTvin );
~CTvinSigDetect();
- int startDetect();
+ int startDetect(bool bPause = true);
int stopDetect();
int pauseDetect();
- int resumeDetect();
+ int resumeDetect(int later = 0);
int initSigState();
void setVdinNoSigCheckKeepTimes(int times, bool isOnce);//times is time, ms
int requestAndWaitPauseDetect();
@@ -1171,14 +1173,11 @@ public:
class ISigDetectObserver {
public:
ISigDetectObserver()
- {
- };
+ {};
virtual ~ISigDetectObserver()
- {
- };
+ {};
virtual void onSigToStable()
- {
- };
+ {};
virtual void onSigStableToUnstable() {};
virtual void onSigStableToUnSupport() {};
virtual void onSigStableToNoSig() {};
@@ -1196,7 +1195,7 @@ public:
virtual void onStableTransFmtChange() {};
virtual void onSigDetectEnter() {};
- virtual void onLoop() {};
+ virtual void onSigDetectLoop() {};
};
void setObserver ( ISigDetectObserver *pOb )
{
@@ -1223,63 +1222,11 @@ public:
STATE_PAUSE
};
int mDetectState;
+ int mResumeLaterTime;
ISigDetectObserver *mpObserver;
};//
- class CSourceConnectDetect: public CThread {
- public:
- CSourceConnectDetect(CTvin *pTvin);
- ~CSourceConnectDetect();
-
- int startDetect();
- int refreshDetectSources();
- int refreshDetectAVInfo();
- int GetSourceConnectStatus(int source_input);
- class ISourceConnectObserver {
- public:
- ISourceConnectObserver() {};
- virtual ~ISourceConnectObserver() {};
- virtual void onSourceConnect(int source_type, int connect_status) {};
- };
- void setObserver ( ISourceConnectObserver *pOb )
- {
- mpObserver = pOb;
- };
- private:
-#define CC_AV_DETECT_METHOD_ADC_PLUG_IN (0)
-#define CC_AV_DETECT_METHOD_ADC_PLUG_OUT (1)
-#define CC_AV_DETECT_SAMPLE_DATA_MAX_LEN (512)
-
- bool threadLoop();
-
- ISourceConnectObserver *mpObserver;
- CTvin *mpTvin;
-
- volatile int mSourceDetectSleepTime;
-
- //AV detect variables
- int mAVDetectMethod;
- int mAVDetectPlugOutDutyCycle;
- int mAVDetectPlugInDutyCycle;
- int mAVDetectPlugOutADCThreshold;
- int mAVDetectPlugInADCThreshold;
- int mAVDetectSampleSize;
- int mAV1DetectADCChan;
- int mAV2DetectADCChan;
- int mAV1CurSampleInd;
- int mAV2CurSampleInd;
- int mAV1SampleDataBuf[CC_AV_DETECT_SAMPLE_DATA_MAX_LEN];
- int mAV2SampleDataBuf[CC_AV_DETECT_SAMPLE_DATA_MAX_LEN];
-
- int mSourceDetectTable[SOURCE_MAX];
- int mSourceDetectPreStatusBuf[SOURCE_MAX];
- int mSourceDetectCurStatusBuf[SOURCE_MAX];
-
- int DetectSources();
- int DetectAVSource(int source_input);
- int DetectHDMISource(int source_input);
- };
class CHDMIRxCEC: public CThread {
public:
diff --git a/tvapi/libtv/tvsetting/CBlobDevice.cpp b/tvapi/libtv/tvsetting/CBlobDevice.cpp
index 3a2dcdf..fa1fb9f 100644
--- a/tvapi/libtv/tvsetting/CBlobDevice.cpp
+++ b/tvapi/libtv/tvsetting/CBlobDevice.cpp
@@ -1,27 +1,27 @@
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include "CBlobDeviceE2prom.h"
-#include "CBlobDevice.h"
-#include "CTvLog.h"
-
-#define LOG_TAG "CBlobDevice"
-
-
-CBlobDevice::CBlobDevice()
-{
- m_dev_path[0] = '\0';
-}
-
-CBlobDevice::~CBlobDevice()
-{
-}
-
-int CBlobDevice::IsFileExist(const char *file_name)
-{
- struct stat tmp_st;
-
- return stat(file_name, &tmp_st);
-}
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include "CBlobDeviceE2prom.h"
+#include "CBlobDevice.h"
+#include "CTvLog.h"
+
+#define LOG_TAG "CBlobDevice"
+
+
+CBlobDevice::CBlobDevice()
+{
+ m_dev_path[0] = '\0';
+}
+
+CBlobDevice::~CBlobDevice()
+{
+}
+
+int CBlobDevice::IsFileExist(const char *file_name)
+{
+ struct stat tmp_st;
+
+ return stat(file_name, &tmp_st);
+}
diff --git a/tvapi/libtv/tvsetting/CBlobDevice.h b/tvapi/libtv/tvsetting/CBlobDevice.h
index 1772185..135ae7e 100644
--- a/tvapi/libtv/tvsetting/CBlobDevice.h
+++ b/tvapi/libtv/tvsetting/CBlobDevice.h
@@ -1,50 +1,50 @@
-#ifndef BLOB_BASE_DEVICE_H
-#define BLOB_BASE_DEVICE_H
-
-class CBlobDevice {
-
-public:
- static const int CC_MAX_FILE_PATH = 256;
- static const int CC_ERR_FILE_HANDLE = -1;
- static const int CC_INIT_BYTE_VAL = 0xFF;
- static const int CC_SSM_PROTECT_ON = 0;
- static const int CC_SSM_PROTECT_OFF = 1;
-
- static const int CC_DEVICE_E2PROM = (0);
- static const int CC_DEVICE_SPI = (1);
- static const int CC_DEVICE_FILE = (2);
- static const int CC_DEVICE_RAM = (3);
-
- CBlobDevice();
- virtual ~CBlobDevice();
-
- virtual int WriteBytes(int offset, int size, unsigned char *buf) = 0;
- virtual int ReadBytes(int offset, int size, unsigned char *buf) = 0;
- virtual int EraseAllData() = 0;
- virtual int InitCheck() = 0;
- virtual int OpenDevice() = 0;
- virtual int CloseDevice() = 0;
- int WriteOneByte(int offset, unsigned char val)
- {
- return WriteBytes(offset, 1, &val);
- }
- int ReadOneByte(int offset, unsigned char *ptrVal)
- {
- return ReadBytes(offset, 1, ptrVal);
- }
-
- int m_dev_type; //device type
- int m_dev_total_size; //device total size(Byte)
-
- char m_dev_path[CC_MAX_FILE_PATH]; //device path
- int m_dev_fd;
-
-protected:
- unsigned char *mDataBuf;
-
-private:
- int IsFileExist(const char *file_name);
-
-};
-
-#endif // ANDROID_SSM_BASE_H
+#ifndef BLOB_BASE_DEVICE_H
+#define BLOB_BASE_DEVICE_H
+
+class CBlobDevice {
+
+public:
+ static const int CC_MAX_FILE_PATH = 256;
+ static const int CC_ERR_FILE_HANDLE = -1;
+ static const int CC_INIT_BYTE_VAL = 0xFF;
+ static const int CC_SSM_PROTECT_ON = 0;
+ static const int CC_SSM_PROTECT_OFF = 1;
+
+ static const int CC_DEVICE_E2PROM = (0);
+ static const int CC_DEVICE_SPI = (1);
+ static const int CC_DEVICE_FILE = (2);
+ static const int CC_DEVICE_RAM = (3);
+
+ CBlobDevice();
+ virtual ~CBlobDevice();
+
+ virtual int WriteBytes(int offset, int size, unsigned char *buf) = 0;
+ virtual int ReadBytes(int offset, int size, unsigned char *buf) = 0;
+ virtual int EraseAllData() = 0;
+ virtual int InitCheck() = 0;
+ virtual int OpenDevice() = 0;
+ virtual int CloseDevice() = 0;
+ int WriteOneByte(int offset, unsigned char val)
+ {
+ return WriteBytes(offset, 1, &val);
+ }
+ int ReadOneByte(int offset, unsigned char *ptrVal)
+ {
+ return ReadBytes(offset, 1, ptrVal);
+ }
+
+ int m_dev_type; //device type
+ int m_dev_total_size; //device total size(Byte)
+
+ char m_dev_path[CC_MAX_FILE_PATH]; //device path
+ int m_dev_fd;
+
+protected:
+ unsigned char *mDataBuf;
+
+private:
+ int IsFileExist(const char *file_name);
+
+};
+
+#endif // ANDROID_SSM_BASE_H
diff --git a/tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp b/tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp
index 849c634..246f2ad 100644
--- a/tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp
+++ b/tvapi/libtv/tvsetting/CBlobDeviceE2prom.cpp
@@ -1,353 +1,50 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include "CBlobDeviceE2prom.h"
-#include "../tvconfig/tvconfig.h"
-#include "../tvutils/tvutils.h"
-#include "CTvLog.h"
-
-#define LOG_TAG "CBlobDeviceE2prom"
-
-#define msleep(x) usleep(x*1000)
-
-CBlobDeviceE2prom::CBlobDeviceE2prom()
-{
-
-}
-
-CBlobDeviceE2prom::~CBlobDeviceE2prom()
-{
-}
-
-int CBlobDeviceE2prom::WriteBytes(int offset, int size, unsigned char *buf)
-{
- return 0;
-}
-int CBlobDeviceE2prom::ReadBytes(int offset, int size, unsigned char *buf)
-{
- return 0;
-}
-int CBlobDeviceE2prom::EraseAllData()
-{
- return 0;
-}
-int CBlobDeviceE2prom::InitCheck()
-{
- return 0;
-}
-int CBlobDeviceE2prom::OpenDevice()
-{
- return 0;
-}
-int CBlobDeviceE2prom::CloseDevice()
-{
- return 0;
-}
-//int CBlobDeviceE2prom::InitCheck() {
-/* int i, tmp_dev_total_size = 0, tmp_offset = 0, rw_check_count = 4;
- unsigned char *tmp_buf = NULL;
- unsigned char w_ch = 0, r_ch = 0;
-
- SetWriteProtectStatus (CC_SSM_PROTECT_ON);
-
- if (ValidOperateCheck() < 0) {
- return -1;
- }
-
- tmp_offset = E2P_DEV_RW_TEST_OFFSET;
-
- if (tmp_offset >= 0) {
- for (i = 0; i < rw_check_count; i++) {
- w_ch = 0x5A;
- WriteNBytes(tmp_offset, 1, &w_ch);
-
- r_ch = 0x00;
- ReadNBytes(tmp_offset, 1, &r_ch);
-
- if (r_ch != w_ch) {
- LOGE("%s, Device rw check error, write %d, read %d.\n", "TV", w_ch, r_ch);
- return -1;
- }
-
- w_ch = 0xA5;
- WriteNBytes(tmp_offset, 1, &w_ch);
-
- r_ch = 0x00;
- ReadNBytes(tmp_offset, 1, &r_ch);
-
- if (r_ch != w_ch) {
- LOGE("%s, Device rw check error, write %d, read %d.\n", "TV", w_ch, r_ch);
- return -1;
- }
- }
- }
-
- if (device_buf != NULL) {
- delete device_buf;
- device_buf = NULL;
- }
-
- if (device_use_buffer) {
- tmp_dev_total_size = GetDeviceTotalSize();
- if (tmp_dev_total_size <= 0) {
- LOGE("%s, Device file size must be more than 0.\n", "TV");
- return -1;
- }
-
- tmp_buf = new unsigned char[tmp_dev_total_size];
- if (tmp_buf != NULL) {
- if (ReadNBytes(0, tmp_dev_total_size, tmp_buf) < 0) {
- delete tmp_buf;
- tmp_buf = NULL;
-
- LOGE("%s, Read data from device error when read data to device rw buffer!!!.\n", "TV");
- return -1;
- }
-
- device_buf = new unsigned char[tmp_dev_total_size];
- if (device_buf != NULL) {
- memcpy((void *) device_buf, (void *) tmp_buf, tmp_dev_total_size);
- }
-
- delete tmp_buf;
- tmp_buf = NULL;
- }
- }
-*/
-// return 0;
-//}
-
-//int CBlobDeviceE2prom::OpenDevice() {
-/*int device_fd = CC_ERR_FILE_HANDLE;
-
-if (gFilePathBuf == NULL) {
- LOGE("%s, Device file name is NULL.\n", "TV");
- return CC_ERR_FILE_HANDLE;
-}
-
-device_fd = open(gFilePathBuf, O_RDWR);
-if (device_fd < 0) {
- LOGE("%s, Open device file \"%s\" error: %s.\n", "TV", gFilePathBuf, strerror(errno));
- return CC_ERR_FILE_HANDLE;
-}
-
-return device_fd;*/
-// return 0;
-//}
-
-//int CBlobDeviceE2prom::CloseDevice() {
-/*if (*device_fd >= 0) {
- close(*device_fd);
- *device_fd = CC_ERR_FILE_HANDLE;
-}*/
-
-// return 0;
-//}
-
-/*int CBlobDeviceE2prom::SetWriteProtectStatus(int protect_status) {
-}*/
-
-/*int CBlobDeviceE2prom::CheckDeviceWrAvaliable(int offset, int len) {
- int tmp_dev_start_offset = 0;
- int tmp_dev_end_offset = 0;
-
- GetDeviceRWStartOffset(&tmp_dev_start_offset);
- if (tmp_dev_start_offset < 0) {
- LOGE("%s, Device file r/w start offset must be greater than or euqal to 0.\n", "TV");
- return -1;
- }
-
- GetDeviceRWEndOffset(&tmp_dev_end_offset);
- if (tmp_dev_end_offset < 0) {
- LOGE("%s, Device file r/w end offset must be more than 0.\n", "TV");
- return -1;
- }
-
- if (len <= 0) {
- LOGE("%s, The w/r length should be more than 0.\n", "TV");
- return -1;
- }
-
- if ((len + tmp_dev_start_offset + offset) > tmp_dev_end_offset + 1) {
- LOGE("%s, w/r would be overflow!!! len = %d, start offset = %d, offset = %d, end offset = %d.\n", "TV", len, tmp_dev_start_offset, offset, tmp_dev_end_offset);
- return -1;
- }
-
- if (ValidOperateCheck() < 0) {
- return -1;
- }
-
- return 0;
-}
-
-/*int CBlobDeviceE2prom::WriteSpecialBytes(int offset, int len, unsigned char data_buf[]) {
- int i = 0, tmp_ret = 0;
- int tmp_dev_w_page_size = 0;
- int tmp_dev_slave_addr = 0;
- int device_fd = CC_ERR_FILE_HANDLE;
- struct i2c_rdwr_ioctl_data ctl_data;
- struct i2c_msg msg;
- unsigned char msg_buf[E2P_MSG_BUF_SIZE];
-
- //GetDeviceWritePageSize(&tmp_dev_w_page_size);
- //if (len > tmp_dev_w_page_size) {
- // LOGE("%s, The write length should be less than page size(%d).\n", "TV", tmp_dev_w_page_size);
- // return -1;
- //}
-
- if (CheckDeviceWrAvaliable(offset, len) < 0) {
- return -1;
- }
-
- device_fd = OpenDevice();
- if (device_fd == CC_ERR_FILE_HANDLE) {
- return -1;
- }
-
- memset((void *) msg_buf, 0, E2P_MSG_BUF_SIZE);
-
- msg_buf[0] = (unsigned char) (offset >> 8);
- msg_buf[1] = (unsigned char) (offset & 0x00ff);
-
- memcpy((void *) &msg_buf[2], data_buf, len);
-
- //GetDeviceSlaveAddress(&tmp_dev_slave_addr);
-
- //showboz
- msg.addr = //
- //tmp_dev_slave_addr//0;
- msg.flags = I2C_M_WR;
- msg.len = 2 + len;
- msg.buf = msg_buf;
- ctl_data.nmsgs = 1;
- ctl_data.msgs = &msg;
-
- SetWriteProtectStatus (CC_SSM_PROTECT_OFF);
-
- tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data);
-
- SetWriteProtectStatus (CC_SSM_PROTECT_ON);
-
- if (tmp_ret < 0) {
- LOGE("%s, ioctl failed, error %d (%s).\n", "TV", errno, strerror(errno));
-
- CloseDevice(&device_fd);
- return -1;
- }
-
- if (device_use_buffer && device_buf != NULL) {
- memcpy((void *) (device_buf + offset), (void *) data_buf, len);
- }
-
- CloseDevice(&device_fd);
-
- msleep(10);
-
- return 0;
-}*/
-
-/*int CBlobDeviceE2prom::ReadSpecialBytes(int offset, int len, unsigned char data_buf[]) {
- int i = 0, tmp_ret = 0;
- int device_fd = CC_ERR_FILE_HANDLE;
- int tmp_dev_slave_addr = 0;
- struct i2c_rdwr_ioctl_data ctl_data;
- struct i2c_msg msg;
- unsigned char msg_buf[E2P_MSG_BUF_SIZE];
-
- if (CheckDeviceWrAvaliable(offset, len) < 0) {
- return -1;
- }
-
- if (device_use_buffer && device_buf != NULL) {
- memcpy((void *) data_buf, (void *) (device_buf + offset), len);
- return 0;
- }
-
- device_fd = OpenDevice();
- if (device_fd == CC_ERR_FILE_HANDLE) {
- return -1;
- }
-
- //GetDeviceSlaveAddress(&tmp_dev_slave_addr);
-
- msg_buf[0] = (unsigned char) (offset >> 8);
- msg_buf[1] = (unsigned char) (offset & 0x00ff);
- msg.addr = tmp_dev_slave_addr;
- msg.flags = I2C_M_WR;
- msg.len = 2;
- msg.buf = msg_buf;
- ctl_data.nmsgs = 1;
- ctl_data.msgs = &msg;
-
- tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data);
-
- if (tmp_ret < 0) {
- LOGE("%s, ioctl failed(erase), error %d (%s).\n", "TV", errno, strerror(errno));
- CloseDevice(&device_fd);
- return -1;
- }
-
- msg.addr = tmp_dev_slave_addr;
- msg.flags |= I2C_M_RD;
- msg.len = len;
- msg.buf = data_buf;
- ctl_data.nmsgs = 1;
- ctl_data.msgs = &msg;
- tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data);
- if (tmp_ret < 0) {
- LOGE("%s, ioctl failed, error %d (%s).\n", "TV", errno, strerror(errno));
- CloseDevice(&device_fd);
- return -1;
- }
-
- CloseDevice(&device_fd);
-
- msleep(10);
-
- return 0;
-}
-
-int CTvSettingDeviceE2prom::ValidOperateCheck() {
- int tmp_dev_total_size = 0;
- int tmp_dev_start_offset = 0;
- int tmp_dev_end_offset = 0;
-
- if (gFilePathBuf == NULL) {
- LOGE("%s, Device file name is NULL.\n", "TV");
- return -1;
- }
-
- if (IsFileExist(gFilePathBuf) < 0) {
- LOGE("%s, Device file is not exist.\n", "TV");
- return -1;
- }
-
- tmp_dev_total_size = GetDeviceTotalSize();
- if (tmp_dev_total_size < 0) {
- LOGE("%s, Device file total size must be greater than or euqal to 0.\n", "TV");
- return -1;
- }
-
- //GetDeviceRWStartOffset(&tmp_dev_start_offset);
- //if (tmp_dev_start_offset < 0) {
- // LOGE("%s, Device file r/w start offset must be greater than or euqal to 0.\n", "TV");
- // return -1;
- //}
-
- //GetDeviceRWEndOffset(&tmp_dev_end_offset);
- //if (tmp_dev_end_offset < 0) {
- // LOGE("%s, Device file r/w end offset must be more than 0.\n", "TV");
- // return -1;
- //}
-
- //if (tmp_dev_end_offset - tmp_dev_start_offset + 1 > tmp_dev_total_size) {
- // LOGE("%s, end offset (%d) - start offset (%d) + 1 is more than total size(%d).\n", "TV", tmp_dev_end_offset, tmp_dev_start_offset, tmp_dev_total_size);
- // return -1;
- //}
-
- return 0;
-}*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "CBlobDeviceE2prom.h"
+#include "../tvconfig/tvconfig.h"
+#include "../tvutils/tvutils.h"
+#include "CTvLog.h"
+
+#define LOG_TAG "CBlobDeviceE2prom"
+
+
+CBlobDeviceE2prom::CBlobDeviceE2prom()
+{
+
+}
+
+CBlobDeviceE2prom::~CBlobDeviceE2prom()
+{
+}
+
+int CBlobDeviceE2prom::WriteBytes(int offset, int size, unsigned char *buf)
+{
+ return 0;
+}
+int CBlobDeviceE2prom::ReadBytes(int offset, int size, unsigned char *buf)
+{
+ return 0;
+}
+int CBlobDeviceE2prom::EraseAllData()
+{
+ return 0;
+}
+int CBlobDeviceE2prom::InitCheck()
+{
+ return 0;
+}
+int CBlobDeviceE2prom::OpenDevice()
+{
+ return 0;
+}
+int CBlobDeviceE2prom::CloseDevice()
+{
+ return 0;
+}
+//int CBlobDeviceE2prom::InitCheck() {
+
diff --git a/tvapi/libtv/tvsetting/CBlobDeviceE2prom.h b/tvapi/libtv/tvsetting/CBlobDeviceE2prom.h
index 2e0e0c5..d237488 100644
--- a/tvapi/libtv/tvsetting/CBlobDeviceE2prom.h
+++ b/tvapi/libtv/tvsetting/CBlobDeviceE2prom.h
@@ -1,76 +1,76 @@
-#ifndef BLOB_E2PROM_H
-#define BLOB_E2PROM_H
-
-#include "CBlobDevice.h"
-
-#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 */
-
-struct i2c_msg {
- unsigned short addr; /* slave address */
- unsigned short flags;
-#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */
-#define I2C_M_WR 0x0000 /* write data, from master to slave */
-#define I2C_M_RD 0x0001 /* read data, from slave to master */
-#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */
-#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */
-#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
-#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
-#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
-
- unsigned short len; /* msg length */
- unsigned char *buf; /* pointer to msg data */
-};
-
-struct i2c_rdwr_ioctl_data {
- struct i2c_msg *msgs;
- unsigned int nmsgs;
-};
-
-// 24C64 eeprom
-#define E2P_MSG_BUF_SIZE (34)
-
-class CBlobDeviceE2prom: public CBlobDevice {
-
-public:
- CBlobDeviceE2prom();
- virtual ~CBlobDeviceE2prom();
-
- virtual int WriteBytes(int offset, int size, unsigned char *buf);
- virtual int ReadBytes(int offset, int size, unsigned char *buf);
- virtual int EraseAllData();
- virtual int InitCheck();
- virtual int OpenDevice();
- virtual int CloseDevice();
-
-private:
-
-private:
- /*int E2P_DEV_TOTAL_SIZE;
- int E2P_DEV_RW_START_OFFSET;
- int E2P_DEV_RW_END_OFFSET;
- int E2P_DEV_W_PAGE_SIZE;
- int E2P_DEV_R_PAGE_SIZE;
- int E2P_DEV_SLAVE_ADDR;
- int E2P_DEV_RW_TEST_OFFSET;
- int device_use_buffer;
- unsigned char *device_buf;
- char gFilePathBuf[CC_MAX_FILE_PATH];*/
-};
-
-
-#endif
+#ifndef BLOB_E2PROM_H
+#define BLOB_E2PROM_H
+
+#include "CBlobDevice.h"
+
+#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 */
+
+struct i2c_msg {
+ unsigned short addr; /* slave address */
+ unsigned short flags;
+#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */
+#define I2C_M_WR 0x0000 /* write data, from master to slave */
+#define I2C_M_RD 0x0001 /* read data, from slave to master */
+#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
+
+ unsigned short len; /* msg length */
+ unsigned char *buf; /* pointer to msg data */
+};
+
+struct i2c_rdwr_ioctl_data {
+ struct i2c_msg *msgs;
+ unsigned int nmsgs;
+};
+
+// 24C64 eeprom
+#define E2P_MSG_BUF_SIZE (34)
+
+class CBlobDeviceE2prom: public CBlobDevice {
+
+public:
+ CBlobDeviceE2prom();
+ virtual ~CBlobDeviceE2prom();
+
+ virtual int WriteBytes(int offset, int size, unsigned char *buf);
+ virtual int ReadBytes(int offset, int size, unsigned char *buf);
+ virtual int EraseAllData();
+ virtual int InitCheck();
+ virtual int OpenDevice();
+ virtual int CloseDevice();
+
+private:
+
+private:
+ /*int E2P_DEV_TOTAL_SIZE;
+ int E2P_DEV_RW_START_OFFSET;
+ int E2P_DEV_RW_END_OFFSET;
+ int E2P_DEV_W_PAGE_SIZE;
+ int E2P_DEV_R_PAGE_SIZE;
+ int E2P_DEV_SLAVE_ADDR;
+ int E2P_DEV_RW_TEST_OFFSET;
+ int device_use_buffer;
+ unsigned char *device_buf;
+ char gFilePathBuf[CC_MAX_FILE_PATH];*/
+};
+
+
+#endif
diff --git a/tvapi/libtv/tvsetting/CBlobDeviceFile.cpp b/tvapi/libtv/tvsetting/CBlobDeviceFile.cpp
index 2e7cf23..ea5d5b7 100644
--- a/tvapi/libtv/tvsetting/CBlobDeviceFile.cpp
+++ b/tvapi/libtv/tvsetting/CBlobDeviceFile.cpp
@@ -1,80 +1,80 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include "tvconfig/tvconfig.h"
-#include "CBlobDeviceFile.h"
-#include "CTvLog.h"
-
-
-
-#define LOG_TAG "BLOB_FILE"
-
-CBlobDeviceFile::CBlobDeviceFile()
-{
- m_dev_total_size = 4 * 1024;
- m_dev_fd = -1;
- mDataBuf = new unsigned char[m_dev_total_size];
-
- const char *device_path = config_get_str("SETTING", "device_path", "/param/default_data");
- const char *device_size = config_get_str("SETTING", "device_size", "0x1000");
- strcpy(m_dev_path, device_path);
-}
-
-CBlobDeviceFile::~CBlobDeviceFile()
-{
- if(mDataBuf != NULL) {
- delete mDataBuf;
- mDataBuf = NULL;
- }
- CloseDevice();
-}
-
-int CBlobDeviceFile::WriteBytes(int offset, int size, unsigned char *buf)
-{
-
- lseek(m_dev_fd, offset, SEEK_SET);
- write(m_dev_fd, buf, size);
- //not need
- //fsync(device_fd);
- return 0;
-}
-int CBlobDeviceFile::ReadBytes(int offset, int size, unsigned char *buf)
-{
- lseek(m_dev_fd, offset, SEEK_SET);
- read(m_dev_fd, buf, size);
- return 0;
-}
-int CBlobDeviceFile::EraseAllData()
-{
- return 0;
-}
-int CBlobDeviceFile::InitCheck()
-{
- return 0;
-}
-
-int CBlobDeviceFile::OpenDevice()
-{
- if(strlen(m_dev_path) <= 0) return -1;
-
- m_dev_fd = open(m_dev_path, O_RDWR | O_SYNC | O_CREAT, S_IRUSR | S_IWUSR);
-
- if (m_dev_fd < 0) {
- LOGE("%s, Open device file \"%s\" error: %s.\n", "TV", m_dev_path, strerror(errno));
- return -1;
- }
-
- return 0;
-}
-
-int CBlobDeviceFile::CloseDevice()
-{
- if (m_dev_fd >= 0) {
- close(m_dev_fd);
- m_dev_fd = -1;
- }
- return 0;
-}
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "tvconfig/tvconfig.h"
+#include "CBlobDeviceFile.h"
+#include "CTvLog.h"
+
+
+
+#define LOG_TAG "BLOB_FILE"
+
+CBlobDeviceFile::CBlobDeviceFile()
+{
+ m_dev_total_size = 4 * 1024;
+ m_dev_fd = -1;
+ mDataBuf = new unsigned char[m_dev_total_size];
+
+ const char *device_path = config_get_str("SETTING", "device_path", "/param/default_data");
+ const char *device_size = config_get_str("SETTING", "device_size", "0x1000");
+ strcpy(m_dev_path, device_path);
+}
+
+CBlobDeviceFile::~CBlobDeviceFile()
+{
+ if (mDataBuf != NULL) {
+ delete mDataBuf;
+ mDataBuf = NULL;
+ }
+ CloseDevice();
+}
+
+int CBlobDeviceFile::WriteBytes(int offset, int size, unsigned char *buf)
+{
+
+ lseek(m_dev_fd, offset, SEEK_SET);
+ write(m_dev_fd, buf, size);
+ //not need
+ //fsync(device_fd);
+ return 0;
+}
+int CBlobDeviceFile::ReadBytes(int offset, int size, unsigned char *buf)
+{
+ lseek(m_dev_fd, offset, SEEK_SET);
+ read(m_dev_fd, buf, size);
+ return 0;
+}
+int CBlobDeviceFile::EraseAllData()
+{
+ return 0;
+}
+int CBlobDeviceFile::InitCheck()
+{
+ return 0;
+}
+
+int CBlobDeviceFile::OpenDevice()
+{
+ if (strlen(m_dev_path) <= 0) return -1;
+
+ m_dev_fd = open(m_dev_path, O_RDWR | O_SYNC | O_CREAT, S_IRUSR | S_IWUSR);
+
+ if (m_dev_fd < 0) {
+ LOGE("%s, Open device file \"%s\" error: %s.\n", "TV", m_dev_path, strerror(errno));
+ return -1;
+ }
+
+ return 0;
+}
+
+int CBlobDeviceFile::CloseDevice()
+{
+ if (m_dev_fd >= 0) {
+ close(m_dev_fd);
+ m_dev_fd = -1;
+ }
+ return 0;
+}
diff --git a/tvapi/libtv/tvsetting/CBlobDeviceFile.h b/tvapi/libtv/tvsetting/CBlobDeviceFile.h
index caf6fda..7b63784 100644
--- a/tvapi/libtv/tvsetting/CBlobDeviceFile.h
+++ b/tvapi/libtv/tvsetting/CBlobDeviceFile.h
@@ -1,26 +1,26 @@
-#ifndef _BLOB_FILE_H_
-#define _BLOB_FILE_H_
-
-#include "CBlobDevice.h"
-class CBlobDeviceFile: public CBlobDevice {
-
-public:
- CBlobDeviceFile();
- virtual ~CBlobDeviceFile();
-
- virtual int WriteBytes(int offset, int size, unsigned char *buf);
- virtual int ReadBytes(int offset, int size, unsigned char *buf);
- virtual int EraseAllData();
- virtual int InitCheck();
- virtual int OpenDevice();
- virtual int CloseDevice();
-
-private:
- int ValidOperateCheck();
- int CreateNewFile(const char *file_name);
-
-private:
-
-};
-
-#endif // ANDROID_SSM_FILE_H
+#ifndef _BLOB_FILE_H_
+#define _BLOB_FILE_H_
+
+#include "CBlobDevice.h"
+class CBlobDeviceFile: public CBlobDevice {
+
+public:
+ CBlobDeviceFile();
+ virtual ~CBlobDeviceFile();
+
+ virtual int WriteBytes(int offset, int size, unsigned char *buf);
+ virtual int ReadBytes(int offset, int size, unsigned char *buf);
+ virtual int EraseAllData();
+ virtual int InitCheck();
+ virtual int OpenDevice();
+ virtual int CloseDevice();
+
+private:
+ int ValidOperateCheck();
+ int CreateNewFile(const char *file_name);
+
+private:
+
+};
+
+#endif // ANDROID_SSM_FILE_H
diff --git a/tvapi/libtv/tvsetting/CBlobDeviceRam.cpp b/tvapi/libtv/tvsetting/CBlobDeviceRam.cpp
index 0f50f73..4705486 100644
--- a/tvapi/libtv/tvsetting/CBlobDeviceRam.cpp
+++ b/tvapi/libtv/tvsetting/CBlobDeviceRam.cpp
@@ -1,129 +1,129 @@
-#include <stdio.h>
-#include <string.h>
-
-#include <android/log.h>
-
-#include "CTvSettingDeviceRam.h"
-
-#define LOG_TAG "ssmram"
-#include "CTvLog.h"
-
-CTvSettingDeviceRam::CTvSettingDeviceRam()
-{
- RAM_DEV_TOTAL_SIZE = 4 * 1024;
- RAM_DEV_RW_START_OFFSET = 0;
- RAM_DEV_RW_END_OFFSET = RAM_DEV_TOTAL_SIZE - 1;
- RAM_DEV_W_PAGE_SIZE = 32;
- RAM_DEV_R_PAGE_SIZE = 32;
- RAM_DEV_SLAVE_ADDR = (0xA0 >> 1);
- RAM_DEV_RW_TEST_OFFSET = -1;
- device_use_buffer = 0;
- device_buf = NULL;
- gFilePathBuf[0] = '\0';
-}
-
-CTvSettingDeviceRam::~CTvSettingDeviceRam()
-{
-}
-
-int CTvSettingDeviceRam::GetDeviceTotalSize()
-{
- return 0;
-}
-int CTvSettingDeviceRam::InitCheck()
-{
- int tmp_dev_total_size = 0;
-
- if (device_buf == NULL) {
- tmp_dev_total_size = GetDeviceTotalSize();
- if (tmp_dev_total_size <= 0) {
- LOGE("%s, Device file size must be more than 0.\n", "TV");
- return -1;
- }
-
- device_buf = new unsigned char[tmp_dev_total_size];
- if (device_buf == NULL) {
- return -1;
- }
-
- memset((void *) device_buf, CC_INIT_BYTE_VAL, tmp_dev_total_size);
- }
-
- return 0;
-}
-
-int CTvSettingDeviceRam::OpenDevice()
-{
- return 0;
-}
-
-int CTvSettingDeviceRam::CloseDevice(int *device_fd)
-{
-
-
- return 0;
-}
-
-int CTvSettingDeviceRam::CheckDeviceWrAvaliable(int offset, int len)
-{
- /*int tmp_dev_start_offset = 0;
- int tmp_dev_end_offset = 0;
-
- GetDeviceRWStartOffset(&tmp_dev_start_offset);
- if (tmp_dev_start_offset < 0) {
- LOGE("%s, Device file r/w start offset must be greater than or euqal to 0.\n", "TV");
- return -1;
- }
-
- GetDeviceRWEndOffset(&tmp_dev_end_offset);
- if (tmp_dev_end_offset < 0) {
- LOGE("%s, Device file r/w end offset must be more than 0.\n", "TV");
- return -1;
- }
-
- if (len <= 0) {
- LOGE("%s, The w/r length should be more than 0.\n", "TV");
- return -1;
- }
-
- if ((len + tmp_dev_start_offset + offset) > tmp_dev_end_offset + 1) {
- LOGE("%s, w/r would be overflow!!! len = %d, start offset = %d, offset = %d, end offset = %d.\n", "TV", len, tmp_dev_start_offset, offset, tmp_dev_end_offset);
- return -1;
- }
-
- if (ValidOperateCheck() < 0) {
- return -1;
- }*/
-
- return 0;
-}
-
-int CTvSettingDeviceRam::WriteSpecialBytes(int offset, int len, unsigned char data_buf[])
-{
- int tmp_dev_w_page_size = 0;
-
- //GetDeviceWritePageSize(&tmp_dev_w_page_size);
- //if (len > tmp_dev_w_page_size) {
- // LOGE("%s, The write length should be less than page size(%d).\n", "TV", tmp_dev_w_page_size);
- // return -1;
- // }
-
- if (CheckDeviceWrAvaliable(offset, len) < 0) {
- return -1;
- }
-
- memcpy((void *) (device_buf + offset), (void *) data_buf, len);
-
- return 0;
-}
-
-int CTvSettingDeviceRam::ReadSpecialBytes(int offset, int len, unsigned char data_buf[])
-{
- if (CheckDeviceWrAvaliable(offset, len) < 0) {
- return -1;
- }
-
- memcpy((void *) data_buf, (void *) (device_buf + offset), len);
-
- return 0;
-}
+#include <stdio.h>
+#include <string.h>
+
+#include <android/log.h>
+
+#include "CTvSettingDeviceRam.h"
+
+#define LOG_TAG "ssmram"
+#include "CTvLog.h"
+
+CTvSettingDeviceRam::CTvSettingDeviceRam()
+{
+ RAM_DEV_TOTAL_SIZE = 4 * 1024;
+ RAM_DEV_RW_START_OFFSET = 0;
+ RAM_DEV_RW_END_OFFSET = RAM_DEV_TOTAL_SIZE - 1;
+ RAM_DEV_W_PAGE_SIZE = 32;
+ RAM_DEV_R_PAGE_SIZE = 32;
+ RAM_DEV_SLAVE_ADDR = (0xA0 >> 1);
+ RAM_DEV_RW_TEST_OFFSET = -1;
+ device_use_buffer = 0;
+ device_buf = NULL;
+ gFilePathBuf[0] = '\0';
+}
+
+CTvSettingDeviceRam::~CTvSettingDeviceRam()
+{
+}
+
+int CTvSettingDeviceRam::GetDeviceTotalSize()
+{
+ return 0;
+}
+int CTvSettingDeviceRam::InitCheck()
+{
+ int tmp_dev_total_size = 0;
+
+ if (device_buf == NULL) {
+ tmp_dev_total_size = GetDeviceTotalSize();
+ if (tmp_dev_total_size <= 0) {
+ LOGE("%s, Device file size must be more than 0.\n", "TV");
+ return -1;
+ }
+
+ device_buf = new unsigned char[tmp_dev_total_size];
+ if (device_buf == NULL) {
+ return -1;
+ }
+
+ memset((void *) device_buf, CC_INIT_BYTE_VAL, tmp_dev_total_size);
+ }
+
+ return 0;
+}
+
+int CTvSettingDeviceRam::OpenDevice()
+{
+ return 0;
+}
+
+int CTvSettingDeviceRam::CloseDevice(int *device_fd)
+{
+
+
+ return 0;
+}
+
+int CTvSettingDeviceRam::CheckDeviceWrAvaliable(int offset, int len)
+{
+ /*int tmp_dev_start_offset = 0;
+ int tmp_dev_end_offset = 0;
+
+ GetDeviceRWStartOffset(&tmp_dev_start_offset);
+ if (tmp_dev_start_offset < 0) {
+ LOGE("%s, Device file r/w start offset must be greater than or euqal to 0.\n", "TV");
+ return -1;
+ }
+
+ GetDeviceRWEndOffset(&tmp_dev_end_offset);
+ if (tmp_dev_end_offset < 0) {
+ LOGE("%s, Device file r/w end offset must be more than 0.\n", "TV");
+ return -1;
+ }
+
+ if (len <= 0) {
+ LOGE("%s, The w/r length should be more than 0.\n", "TV");
+ return -1;
+ }
+
+ if ((len + tmp_dev_start_offset + offset) > tmp_dev_end_offset + 1) {
+ LOGE("%s, w/r would be overflow!!! len = %d, start offset = %d, offset = %d, end offset = %d.\n", "TV", len, tmp_dev_start_offset, offset, tmp_dev_end_offset);
+ return -1;
+ }
+
+ if (ValidOperateCheck() < 0) {
+ return -1;
+ }*/
+
+ return 0;
+}
+
+int CTvSettingDeviceRam::WriteSpecialBytes(int offset, int len, unsigned char data_buf[])
+{
+ int tmp_dev_w_page_size = 0;
+
+ //GetDeviceWritePageSize(&tmp_dev_w_page_size);
+ //if (len > tmp_dev_w_page_size) {
+ // LOGE("%s, The write length should be less than page size(%d).\n", "TV", tmp_dev_w_page_size);
+ // return -1;
+ // }
+
+ if (CheckDeviceWrAvaliable(offset, len) < 0) {
+ return -1;
+ }
+
+ memcpy((void *) (device_buf + offset), (void *) data_buf, len);
+
+ return 0;
+}
+
+int CTvSettingDeviceRam::ReadSpecialBytes(int offset, int len, unsigned char data_buf[])
+{
+ if (CheckDeviceWrAvaliable(offset, len) < 0) {
+ return -1;
+ }
+
+ memcpy((void *) data_buf, (void *) (device_buf + offset), len);
+
+ return 0;
+}
diff --git a/tvapi/libtv/tvsetting/CBlobDeviceRam.h b/tvapi/libtv/tvsetting/CBlobDeviceRam.h
index 88f27fb..b499dd2 100644
--- a/tvapi/libtv/tvsetting/CBlobDeviceRam.h
+++ b/tvapi/libtv/tvsetting/CBlobDeviceRam.h
@@ -1,37 +1,37 @@
-#ifndef TV_SETTING_RAM_H
-#define TV_SETTING_RAM_H
-
-#include "CTvSettingBaseDevice.h"
-
-class CTvSettingDeviceRam: public CTvSettingBaseDevice {
-
-public:
- CTvSettingDeviceRam();
- virtual ~CTvSettingDeviceRam();
-
- virtual int InitCheck();
- virtual int OpenDevice();
- virtual int CloseDevice(int *device_fd);
- virtual int GetDeviceTotalSize();
-
- virtual int CheckDeviceWrAvaliable(int offset, int len);
- virtual int WriteSpecialBytes(int offset, int len, unsigned char data_buf[]);
- virtual int ReadSpecialBytes(int offset, int len, unsigned char data_buf[]);
-
-private:
- int ValidOperateCheck();
-
-private:
- int RAM_DEV_TOTAL_SIZE;
- int RAM_DEV_RW_START_OFFSET;
- int RAM_DEV_RW_END_OFFSET;
- int RAM_DEV_W_PAGE_SIZE;
- int RAM_DEV_R_PAGE_SIZE;
- int RAM_DEV_SLAVE_ADDR;
- int RAM_DEV_RW_TEST_OFFSET;
- int device_use_buffer;
- unsigned char *device_buf;
- char gFilePathBuf[CC_MAX_FILE_PATH];
-};
-
-#endif // ANDROID_SSM_RAM_H
+#ifndef TV_SETTING_RAM_H
+#define TV_SETTING_RAM_H
+
+#include "CTvSettingBaseDevice.h"
+
+class CTvSettingDeviceRam: public CTvSettingBaseDevice {
+
+public:
+ CTvSettingDeviceRam();
+ virtual ~CTvSettingDeviceRam();
+
+ virtual int InitCheck();
+ virtual int OpenDevice();
+ virtual int CloseDevice(int *device_fd);
+ virtual int GetDeviceTotalSize();
+
+ virtual int CheckDeviceWrAvaliable(int offset, int len);
+ virtual int WriteSpecialBytes(int offset, int len, unsigned char data_buf[]);
+ virtual int ReadSpecialBytes(int offset, int len, unsigned char data_buf[]);
+
+private:
+ int ValidOperateCheck();
+
+private:
+ int RAM_DEV_TOTAL_SIZE;
+ int RAM_DEV_RW_START_OFFSET;
+ int RAM_DEV_RW_END_OFFSET;
+ int RAM_DEV_W_PAGE_SIZE;
+ int RAM_DEV_R_PAGE_SIZE;
+ int RAM_DEV_SLAVE_ADDR;
+ int RAM_DEV_RW_TEST_OFFSET;
+ int device_use_buffer;
+ unsigned char *device_buf;
+ char gFilePathBuf[CC_MAX_FILE_PATH];
+};
+
+#endif // ANDROID_SSM_RAM_H
diff --git a/tvapi/libtv/tvsetting/CTvSetting.cpp b/tvapi/libtv/tvsetting/CTvSetting.cpp
index f558cd5..27b842f 100644
--- a/tvapi/libtv/tvsetting/CTvSetting.cpp
+++ b/tvapi/libtv/tvsetting/CTvSetting.cpp
@@ -1,2212 +1,2446 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <cutils/properties.h>
-
-#include <netinet/ether.h>
-#include <netinet/if_ether.h>
-
-#include <netutils/ifc.h>
-#include <netutils/dhcp.h>
-
-#include "CTvSetting.h"
-
-#include "../tvconfig/tvconfig.h"
-#include "../audio/audio_api.h"
-
-#include "../tv/CTvLog.h"
-#define CC_DEF_CHARACTER_CHAR_VAL (0x8A)
-
-pthread_mutex_t ssm_r_w_op_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-/************************ Start APIs For UI ************************/
-
-CTvSettingDeviceFactory *mpSettingDeviceFactory = NULL;
-CBlobDevice *mpCurDevice = NULL;
-
-bool CTvSettingLoad()
-{
- mpSettingDeviceFactory = new CTvSettingDeviceFactory();
- mpCurDevice = mpSettingDeviceFactory->getSaveDeviceFromConfigFile();
- if (mpCurDevice == NULL) {
- LOGD("%s, CTvSettingLoad = NULL", "TV");
- return false;
- } else {
- mpCurDevice->OpenDevice();
- }
- return true;
-}
-
-bool CTvSettingunLoad()
-{
- if (mpSettingDeviceFactory != NULL) {
- delete mpSettingDeviceFactory;
- mpSettingDeviceFactory = NULL;
- }
- return true;
-}
-
-template<typename T>
-static int SSMWriteNTypes(int offset, int data_len, T *data_buf)
-{
- pthread_mutex_lock(&ssm_r_w_op_mutex);
-
- if (data_buf == NULL) {
- LOGE("%s, data_buf is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- if (mpCurDevice == NULL) {
- LOGE("%s, ssm_device is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- if (mpCurDevice->WriteBytes(offset, data_len * sizeof(T),
- (unsigned char *) data_buf) < 0) {
- LOGE("%s, device WriteNBytes error.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return 0;
-}
-
-template<typename T>
-static int SSMReadNTypes(int offset, int data_len, T *data_buf)
-{
- pthread_mutex_lock(&ssm_r_w_op_mutex);
-
- if (data_buf == NULL) {
- LOGE("%s, data_buf is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- if (mpCurDevice == NULL) {
- LOGE("%s, ssm_device is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- if (mpCurDevice->ReadBytes(offset, data_len * sizeof(T),
- (unsigned char *) data_buf) < 0) {
- LOGE("%s, device ReadNBytes error.\n", "TV");
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return 0;
-}
-int SSMSaveFlash_One_N310_N311(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
- LOGD ( "~~~ SSMSaveFlash_One ~~~##offset %d##rw_val %d##" , offset, rw_val);
-
- return SSMWriteNTypes(offset, 1, &tmp_val);
-}
-
-int SSMReadFlash_One_N310_N311(int offset)
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(offset, 1, &tmp_val) < 0) {
- return -1;
- }
- LOGD ( "~~~ SSMReadFlash_One ~~~##offset %d##rw_val %d##" , offset, tmp_val);
-
- return tmp_val;
-}
-
-int SSMSaveFlash_N_N310_N311(int offset, int data_len, int *data_buf)
-{
- int i = 0;
- unsigned char *ptr = NULL;
-
- ptr = new unsigned char[data_len];
-
- if(ptr != NULL) {
- for(i = 0; i < data_len; i++) {
- ptr[i] = data_buf[i];
- }
- } else {
- delete ptr;
- ptr = NULL;
-
- return -1;
- }
-
- if(SSMWriteNTypes(offset, data_len, ptr) < 0) {
- delete ptr;
- ptr = NULL;
-
- return -1;
- }
-
- delete ptr;
- ptr = NULL;
-
- return 0;
-}
-
-int SSMReadFlash_N_N310_N311(int offset, int data_len, int *data_buf)
-{
- int i = 0;
- unsigned char *ptr = NULL;
-
- ptr = new unsigned char[data_len];
-
- if(ptr != NULL) {
- if (SSMReadNTypes(offset, data_len, ptr) < 0) {
- delete ptr;
- ptr = NULL;
-
- return -1;
- }
- } else {
- delete ptr;
- ptr = NULL;
-
- return -1;
- }
-
- for(i = 0; i < data_len; i++) {
- data_buf[i] = ptr[i];
- }
-
- delete ptr;
- ptr = NULL;
-
- return 0;
-}
-int EEPWriteOneByte(int offset, unsigned char *data_buf)
-{
- int fd = 0;
- const char *device_path = config_get_str("SETTING", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom");
- pthread_mutex_lock(&ssm_r_w_op_mutex);
-
- LOGD ( "~~~EEPWriteOneByte~~~##offset %d##rw_val %s##" , offset, data_buf);
-
- if (data_buf == NULL) {
- LOGE("%s, data_buf is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- fd = open(device_path, O_RDWR);
-
- if (fd < 0) {
- LOGE("%s, ####i2c test device open failed####.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- lseek(fd, offset, SEEK_SET);
-
- if (write(fd, data_buf, 1) < 0) {
- LOGE("%s, device WriteOneBytes error.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- close(fd);
-
- LOGE("%s, device WriteOneBytes OK.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return 0;
-}
-
-int EEPReadOneByte(int offset , unsigned char *data_buf)
-{
- int fd = 0;
- //const char* device_type = config_get_str("SETTING", "peripheral.eeprom.device", "disable");
- const char *device_path = config_get_str("SETTING", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom");
-
- pthread_mutex_lock(&ssm_r_w_op_mutex);
-
- if (data_buf == NULL) {
- LOGE("%s, data_buf is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- fd = open(device_path, O_RDWR);
-
- if (fd < 0) {
- LOGE("%s, ssm_device is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
- lseek(fd, offset, SEEK_SET);
-
- if (read(fd, data_buf, 1) < 0) {
- LOGE("%s, device ReadOneBytes error.\n", "TV");
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- close(fd);
-
- LOGD ( "~~~EEPReadOneByte~~~##offset %d##rw_val %d##" , offset, data_buf);
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return 0;
-}
-
-int EEPWriteNByte(int offset, int data_len, unsigned char *data_buf)
-{
- int fd = 0;
- const char *device_path = config_get_str("SETTING", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom");
- pthread_mutex_lock(&ssm_r_w_op_mutex);
-
- LOGD ( "~~~EEPWriteNByte~~~##offset %d##data_len %d##" , offset, data_len);
-
- if (data_buf == NULL) {
- LOGE("%s, data_buf is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- fd = open(device_path, O_RDWR);
-
- if (fd < 0) {
- LOGE("%s, ####i2c test device open failed####.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- lseek(fd, offset, SEEK_SET);
-
- if (write(fd, data_buf, data_len) < 0) {
- LOGE("%s, device WriteNBytes error.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- close(fd);
-
- LOGE("%s, device WriteNBytes OK.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return 0;
-}
-int EEPReadNByte(int offset, int data_len, unsigned char *data_buf)
-{
- int fd = 0;
- const char *device_path = config_get_str("SETTING", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom");
- pthread_mutex_lock(&ssm_r_w_op_mutex);
-
- if (data_buf == NULL) {
- LOGE("%s, data_buf is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- fd = open(device_path, O_RDWR);
-
- if (fd < 0) {
- LOGE("%s, ssm_device is NULL.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
- lseek(fd, offset, SEEK_SET);
-
- if (read(fd, data_buf, data_len) < 0) {
- LOGE("%s, device ReadNBytes error.\n", "TV");
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return -1;
- }
-
- close(fd);
-
- LOGD ( "~~~EEPReadNByte~~~##offset %d##data_len %d##" , offset, data_len);
-
- pthread_mutex_unlock(&ssm_r_w_op_mutex);
- return 0;
-}
-
-
-int SSMSaveEEP_One_N310_N311(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
- const char *device_config = config_get_str("SETTING", "peripheral.eeprom.device", "disable");
-
- if(strcmp(device_config, "enable") != 0) {
- LOGD ( "~~~ SSMSaveEEP_One ~~~##peripheral.eeprom.device error##");
- return -1;
- }
- LOGD ( "~~~SSMSaveEEP_One~~~##offset %d##rw_val %d##" , offset, rw_val);
-
- return EEPWriteOneByte(offset, &tmp_val);
-}
-
-int SSMReadEEP_One_N310_N311(int offset)
-{
- unsigned char tmp_val = 0;
- const char *device_config = config_get_str("SETTING", "peripheral.eeprom.device", "disable");
-
- if(strcmp(device_config, "enable") != 0) {
- LOGD ( "~~~ SSMReadEEP_One ~~~##peripheral.eeprom.device error##");
- return -1;
- }
-
- if (EEPReadOneByte(offset, &tmp_val) < 0) {
- return -1;
- }
- LOGD ( "~~~SSMReadEEP_One~~~##offset %d##rw_val %d##" , offset, tmp_val);
-
- return tmp_val;
-}
-
-int SSMSaveEEP_N_N310_N311(int offset, int data_len, int *data_buf)
-{
- int i = 0;
- unsigned char *ptr = NULL;
- const char *device_config = config_get_str("SETTING", "peripheral.eeprom.device", "disable");
-
- if(strcmp(device_config, "enable") != 0) {
- LOGD ( "~~~ SSMSaveEEP_N ~~~##peripheral.eeprom.device error##");
- return -1;
- }
-
- ptr = new unsigned char[data_len];
-
- if(ptr != NULL) {
- for(i = 0; i < data_len; i++) {
- ptr[i] = data_buf[i];
- }
- } else {
- delete ptr;
- ptr = NULL;
-
- return -1;
- }
-
- if(EEPWriteNByte(offset, data_len, ptr) < 0) {
- delete ptr;
- ptr = NULL;
-
- return -1;
- }
-
- delete ptr;
- ptr = NULL;
-
- return 0;
-}
-
-int SSMReadEEP_N_N310_N311(int offset, int data_len, int *data_buf)
-{
- int i = 0;
- unsigned char *ptr = NULL;
- const char *device_config = config_get_str("SETTING", "peripheral.eeprom.device", "disable");
-
- if(strcmp(device_config, "enable") != 0) {
- LOGD ( "~~~ SSMReadEEP_N ~~~##peripheral.eeprom.device error##");
- return -1;
- }
- ptr = new unsigned char[data_len];
-
- if(ptr != NULL) {
- if (EEPReadNByte(offset, data_len, ptr) < 0) {
- delete ptr;
- ptr = NULL;
-
- return -1;
- }
- } else {
- delete ptr;
- ptr = NULL;
-
- return -1;
- }
-
- for(i = 0; i < data_len; i++) {
- data_buf[i] = ptr[i];
- }
-
- delete ptr;
- ptr = NULL;
-
- return 0;
-}
-/************************ Start APIs For UI ************************/
-int MiscSSMRestoreDefault()
-{
- SSMSaveFactoryBurnMode(0);
- SSMSavePowerOnOffChannel(0);
- SSMSaveSystemLanguage(0);
- SSMSaveAgingMode(0);
- SSMSavePanelType(0);
- SSMSavePowerOnMusicSwitch(0);
- SSMSavePowerOnMusicVolume(20);
- SSMSaveSystemSleepTimer(0xFFFFFFFF);
- SSMSaveInputSourceParentalControl(0, 0);
- SSMSaveParentalControlSwitch(0);
- SSMSaveSerialCMDSwitchValue(0);
- SSMSaveBlackoutEnable(0);
- return 0;
-}
-
-int MiscSSMFacRestoreDefault()
-{
- SSMSaveSystemLanguage(0);
- SSMSavePowerOnMusicSwitch(1);
- SSMSavePowerOnMusicVolume(20);
- SSMSaveSystemSleepTimer(0xFFFFFFFF);
- SSMSaveInputSourceParentalControl(0, 0);
- SSMSaveParentalControlSwitch(0);
- SSMSaveSearchNavigateFlag(1);
- SSMSaveInputNumLimit(2);
- SSMSaveLocalDimingOnOffFlg(0);
-
- return 0;
-}
-
-int ReservedSSMRestoreDefault()
-{
- SSMSaveBurnWriteCharaterChar(CC_DEF_CHARACTER_CHAR_VAL);
-
- return 0;
-}
-
-int SSMSaveBurnWriteCharaterChar(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RSV_W_CHARACTER_CHAR_START, 1, &tmp_val);
-}
-
-int SSMReadBurnWriteCharaterChar()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RSV_W_CHARACTER_CHAR_START, 1, &tmp_val) < 0) {
- return -1;
- }
-
- return tmp_val;
-}
-
-int SSMSaveFactoryBurnMode(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_FBMF_START, 1, &tmp_val);
-}
-
-int SSMReadFactoryBurnMode()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_FBMF_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val != 0) {
- return 1;
- }
-
- return 0;
-}
-
-int SSMSavePowerOnOffChannel(int rw_val)
-{
- unsigned char tmp_val = rw_val;
- return SSMWriteNTypes(SSM_RW_POWER_CHANNEL_START, 1, &tmp_val);
-}
-
-int SSMReadPowerOnOffChannel()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_POWER_CHANNEL_START, 1, &tmp_val) < 0) {
- return 0;
- }
- return tmp_val;
-}
-
-int SSMSaveLastSelectSourceInput(int rw_val)
-{
- unsigned char tmp_val = rw_val;
- return SSMWriteNTypes(SSM_RW_LAST_SOURCE_INPUT_START, 1, &tmp_val);
-}
-
-int SSMReadLastSelectSourceInput()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_LAST_SOURCE_INPUT_START, 1, &tmp_val) < 0) {
- return 0;
- }
- if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveSystemLanguage(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_SYS_LANGUAGE_START, 1, &tmp_val);
-}
-
-int SSMReadSystemLanguage()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_SYS_LANGUAGE_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveAgingMode(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_AGING_MODE_START, 1, &tmp_val);
-}
-
-int SSMReadAgingMode()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_AGING_MODE_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMSavePanelType(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_PANEL_TYPE_START, 1, &tmp_val);
-}
-
-int SSMReadPanelType()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_PANEL_TYPE_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMSavePowerOnMusicSwitch(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_POWER_ON_MUSIC_SWITCH_START, 1, &tmp_val);
-}
-
-int SSMReadPowerOnMusicSwitch()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_POWER_ON_MUSIC_SWITCH_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMSavePowerOnMusicVolume(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_POWER_ON_MUSIC_VOL_START, 1, &tmp_val);
-}
-
-int SSMReadPowerOnMusicVolume()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_POWER_ON_MUSIC_VOL_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveSystemSleepTimer(int rw_val)
-{
- return SSMWriteNTypes(SSM_RW_SYS_SLEEP_TIMER_START, 1, &rw_val);
-}
-
-int SSMReadSystemSleepTimer()
-{
- int tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_SYS_SLEEP_TIMER_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val < 0) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveInputSourceParentalControl(int source_index,
- unsigned char ctl_flag)
-{
- int tmp_val = 0;
-
- if (source_index < 0 || source_index > 31) {
- return -1;
- }
-
- if (ctl_flag != 0 && ctl_flag != 1) {
- return -1;
- }
-
- if (SSMReadNTypes(SSM_RW_INPUT_SRC_PARENTAL_CTL_START, 4,
- (unsigned char *) &tmp_val) < 0) {
- return -1;
- }
-
- tmp_val = (tmp_val & (~(1 << source_index))) | (ctl_flag << source_index);
-
- return SSMWriteNTypes(SSM_RW_INPUT_SRC_PARENTAL_CTL_START, 4,
- (unsigned char *) &tmp_val);
-}
-
-int SSMReadInputSourceParentalControl(int source_index)
-{
- int tmp_val = 0;
-
- if (SSMReadParentalControlSwitch() == 0) {
- return 0;
- }
-
- if (SSMReadNTypes(SSM_RW_INPUT_SRC_PARENTAL_CTL_START, 4,
- (unsigned char *) &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val & (1 << source_index)) {
- return 1;
- }
-
- return 0;
-}
-
-int SSMSaveParentalControlSwitch(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_PARENTAL_CTL_SWITCH_START, 1, &tmp_val);
-}
-
-int SSMReadParentalControlSwitch()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_PARENTAL_CTL_SWITCH_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val != 0) {
- tmp_val = 1;
- }
-
- return tmp_val;
-}
-
-int SSMGetCustomerDataStart()
-{
- return SSM_RW_CUSTOMER_DATA_START;
-}
-
-int SSMGetCustomerDataLen()
-{
- return SSM_RW_CUSTOMER_DATA_LEN;
-}
-
-int SSMGetATVDataStart()
-{
- return SSM_RW_ATV_START;
-}
-
-int SSMGetATVDataLen()
-{
- return SSM_RW_ATV_LEN;
-}
-
-int SSMGetVPPDataStart()
-{
- return SSM_RW_VPP_START;
-}
-
-int SSMGetVPPDataLen()
-{
- return SSM_RW_VPP_LEN;
-}
-
-int SSMSaveSearchNavigateFlag(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_SEARCH_NAVIGATE_FLAG_START, 1, &tmp_val);
-}
-
-int SSMReadSearchNavigateFlag()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_SEARCH_NAVIGATE_FLAG_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveInputNumLimit(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_INPUT_NUMBER_LIMIT_START, 1, &tmp_val);
-}
-
-int SSMReadInputNumLimit()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_INPUT_NUMBER_LIMIT_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveLocalDimingOnOffFlg(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_LOCAL_DIMING_START, 1, &tmp_val);
-}
-
-int SSMReadLocalDimingOnOffFlg()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_LOCAL_DIMING_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveVDac2DValue(unsigned short rw_val)
-{
- return SSMWriteNTypes(SSM_RW_VDAC_2D_START, 1, &rw_val);
-}
-
-int SSMReadVDac2DValue()
-{
- unsigned short tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_VDAC_2D_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveVDac3DValue(unsigned short rw_val)
-{
- return SSMWriteNTypes(SSM_RW_VDAC_3D_START, 1, &rw_val);
-}
-
-int SSMReadVDac3DValue()
-{
- unsigned short tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_VDAC_3D_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveChromaStatus(int mode)
-{
- int fd = -1, ret = -1;
- char value[20] = "";
-
- sprintf(value, "%d", mode);
-
- fd = open("/sys/class/tvafe/tvafe0/cvd_reg8a", O_RDWR);
-
- if (fd < 0) {
- LOGE("open /sys/class/tvafe/tvafe0/cvd_reg8a ERROR(%s)!!\n",
- strerror(errno));
- return -1;
- }
-
- ret = write(fd, value, strlen(value));
-
- close(fd);
-
- return ret;
-}
-
-int SSMSaveNonStandardValue(unsigned short rw_val)
-{
- int i = 0, tmp_ret = 0;
- unsigned char data[] = { 0, 0 };
-
- {
- data[0] = (unsigned char) rw_val;
- rw_val >>= 8;
- data[1] = (unsigned char) rw_val;
- }
-
- LOGD("%s, save NonStandard_value = %d", "TV", rw_val);
-
- return SSMWriteNTypes(SSM_RW_NON_STANDARD_START, 2, data);
-}
-
-int SSMReadNonStandardValue(void)
-{
- int i = 0, value = 0;
- int data[] = { 0, 0 };
-
- if (SSMReadNTypes(SSM_RW_NON_STANDARD_START, 2, data) < 0) {
- LOGE("%s, read NonStandard_value error.", "TV");
- return 0;
- }
-
- {
- value += data[1];
- value <<= 8;
- value += data[0];
- }
-
- LOGD("%s, read NonStandard_value = %d.", "TV", value);
-
- return value;
-}
-
-int SSMSaveAdbSwitchValue(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_ADB_SWITCH_START, 1, &tmp_val);
-}
-
-int SSMReadAdbSwitchValue(void)
-{
- unsigned char switch_val = 0;
-
- if (SSMReadNTypes(SSM_RW_ADB_SWITCH_START, 1, &switch_val) < 0) {
- LOGD("%s, read switch value error", "TV");
- return -1;
- }
-
- LOGD("%s, read switch value = %d", "TV", switch_val);
-
- return switch_val;
-}
-
-int SSMSaveSerialCMDSwitchValue(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_SERIAL_CMD_SWITCH_START, 1, &tmp_val);
-}
-
-int SSMReadSerialCMDSwitchValue(void)
-{
- unsigned char switch_val = 0;
-
- if (SSMReadNTypes(SSM_RW_SERIAL_CMD_SWITCH_START, 1, &switch_val) < 0) {
- LOGD("%s, read switch value error", "TV");
- return -1;
- }
-
- LOGD("%s, read switch value = %d", "TV", switch_val);
-
- return switch_val;
-}
-
-int SSMSaveNoiseGateThresholdValue(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_NOISE_GATE_THRESHOLD_START, 1, &tmp_val);
-}
-
-int SSMReadNoiseGateThresholdValue(void)
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_NOISE_GATE_THRESHOLD_START, 1, &tmp_val) < 0) {
- LOGD("%s, read NoiseGateThreshold error", "TV");
- return -1;
- }
-
- LOGD("%s, read NoiseGateThreshold = %d", "TV", tmp_val);
-
- return tmp_val;
-}
-
-int SSMSaveGraphyBacklight(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- if (rw_val < 0 || rw_val > 100) {
- return -1;
- }
-
- return SSMWriteNTypes(SSM_RW_UI_GRHPHY_BACKLIGHT_START, 1, &tmp_val);
-}
-
-int SSMReadGraphyBacklight(void)
-{
- unsigned char value = 0;
-
- if (SSMReadNTypes(SSM_RW_UI_GRHPHY_BACKLIGHT_START, 1, &value) < 0) {
- LOGD("%s, read graphybacklight error.\n", "TV");
- return -1;
- }
-
- if (/*value < 0 || */value > 100) {
- LOGD("%s, range of graphybacklight (%d) is not between 0-100.\n",
- "TV", value);
- return -1;
- }
-
- return value;
-}
-
-int SSMSaveFastSuspendFlag(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_FASTSUSPEND_FLAG_START, 1, &tmp_val);
-}
-
-int SSMReadFastSuspendFlag(void)
-{
- unsigned char value = 0;
-
- if (SSMReadNTypes(SSM_RW_FASTSUSPEND_FLAG_START, 1, &value) < 0) {
- LOGD("%s, read FastSuspendFlag error.\n", "TV");
- return -1;
- }
-
- return value;
-}
-
-int SSMSaveCABufferSizeValue(unsigned short rw_val)
-{
- int i = 0, tmp_ret = 0;
- unsigned char data[] = { 0, 0 };
-
- {
- data[0] = (unsigned char) rw_val;
- rw_val >>= 8;
- data[1] = (unsigned char) rw_val;
- }
-
- return SSMWriteNTypes(SSM_RW_CA_BUFFER_SIZE_START, 2, data);
-}
-
-int SSMReadCABufferSizeValue(void)
-{
- int i = 0, value = 0;
- unsigned char data[] = { 0, 0 };
-
- if (SSMReadNTypes(SSM_RW_CA_BUFFER_SIZE_START, 2, data) < 0) {
- LOGE("%s, read ca_buffer_size error", "TV");
- return 0;
- }
-
- {
- value += data[1];
- value <<= 8;
- value += data[0];
- }
-
- return value;
-}
-
-int SSMSaveStandbyMode(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_STANDBY_MODE_FLAG_START, 1, &tmp_val);
-}
-
-int SSMReadStandbyMode()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_STANDBY_MODE_FLAG_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveHDMIEQMode(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_HDMIEQ_MODE_START, 1, &tmp_val);
-}
-
-int SSMReadHDMIEQMode()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_HDMIEQ_MODE_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveLogoOnOffFlag(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_LOGO_ON_OFF_FLAG_START, 1, &tmp_val);
-}
-
-int SSMReadLogoOnOffFlag()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_LOGO_ON_OFF_FLAG_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveHDMIInternalMode(unsigned int rw_val)
-{
- int i = 0, tmp_ret = 0;
- unsigned char data[] = { 0, 0, 0, 0 };
-
- for (i = 3; i >= 0; i--) {
- data[i] = (unsigned char) rw_val;
- rw_val >>= 8;
- }
-
- return SSMWriteNTypes(SSM_RW_HDMIINTERNAL_MODE_START, 4, data);
-}
-
-int SSMReadHDMIInternalMode()
-{
- int i = 0, value = 0;
- int data[] = { 0, 0, 0, 0 };
-
- if (SSMReadNTypes(SSM_RW_HDMIINTERNAL_MODE_START, 4, data) < 0) {
- return 0;
- }
-
- for (i = 0; i < 4; i++) {
- value <<= 8;
- value += data[i];
- }
-
- return value;
-}
-
-int SSMSaveParentalControlPassWord(unsigned char *password, int size)
-{
- return SSMWriteNTypes(SSM_RW_PARENTAL_CTL_PASSWORD_START, size, password);
-}
-
-int SSMReadParentalControlPassWord(unsigned short *password)
-{
- if (SSMReadNTypes(SSM_RW_PARENTAL_CTL_PASSWORD_START,
- SSM_RW_PARENTAL_CTL_PASSWORD_LEN, (unsigned char *) password)
- < 0) {
- return -1;
- }
- return 0;
-}
-
-int SSMSaveDisable3D(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_DISABLE_3D_START, 1, &tmp_val);
-}
-
-int SSMReadDisable3D()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_DISABLE_3D_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveGlobalOgoEnable(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_GLOBAL_OGO_ENABLE_START, 1, &tmp_val);
-}
-
-int SSMReadGlobalOgoEnable()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(SSM_RW_GLOBAL_OGO_ENABLE_START, 1, &tmp_val) < 0) {
- return 0;
- }
-
- if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMDeviceMarkCheck()
-{
- int i = 0, failed_count = 0;
- int mark_offset[3] = { 0, 0, 0 };
- unsigned char mark_values[3] = { 0, 0, 0 };
- unsigned char tmp_ch = 0;
-
- //read temp one byte
- SSMReadNTypes(0, 1, &tmp_ch);
-
- mark_offset[0] = SSM_MARK_01_START;
- mark_offset[1] = SSM_MARK_02_START;
- mark_offset[2] = SSM_MARK_03_START;
-
- mark_values[0] = SSM_MARK_01_VALUE;
- mark_values[1] = SSM_MARK_02_VALUE;
- mark_values[2] = SSM_MARK_03_VALUE;
-
- if (SSMReadBurnWriteCharaterChar() != CC_DEF_CHARACTER_CHAR_VAL) {
- SSMSaveBurnWriteCharaterChar(CC_DEF_CHARACTER_CHAR_VAL);
- }
-
- failed_count = 0;
- for (i = 0; i < 3; i++) {
- tmp_ch = 0;
- if (SSMReadNTypes(mark_offset[i], 1, &tmp_ch) < 0) {
- LOGE("%s, SSMDeviceMarkCheck Read Mark failed!!!\n", "TV");
- break;
- }
-
- if (tmp_ch != mark_values[i]) {
- failed_count += 1;
- LOGE(
- "%s, SSMDeviceMarkCheck Mark[%d]'s offset = %d, Mark[%d]'s Value = %d, read value = %d.\n",
- "TV", i, mark_offset[i], i, mark_values[i], tmp_ch);
- }
- }
-
- if (failed_count >= 3) {
- return -1;
- }
-
- return 0;
-}
-
-int SSMRestoreDeviceMarkValues()
-{
- int i;
- int mark_offset[3] = {
- (int) SSM_MARK_01_START, //
- (int) SSM_MARK_02_START, //
- (int) SSM_MARK_03_START, //
- };
-
- unsigned char mark_values[3] = {
- //
- (unsigned char) SSM_MARK_01_VALUE, (unsigned char) SSM_MARK_02_VALUE,
- (unsigned char) SSM_MARK_03_VALUE, //
- };
-
- for (i = 0; i < 3; i++) {
- if (SSMWriteNTypes(mark_offset[i], 1, &(mark_values[i])) < 0) {
- LOGD("SSMRestoreDeviceMarkValues Write Mark failed.\n");
- break;
- }
- }
-
- if (i < 3) {
- return -1;
- }
-
- return 0;
-}
-
-static int SSMGetPreCopyingEnableCfg()
-{
- const char *prop_value;
-
- prop_value = config_get_str("TV", "ssm.precopying.en", "null");
- if (strcmp(prop_value, "null") == 0 || strcmp(prop_value, "0") == 0
- || strcmp(prop_value, "disable") == 0) {
- return 0;
- }
-
- return 1;
-}
-
-static int SSMGetPreCopyingDevicePathCfg(char dev_path[])
-{
- const char *prop_value;
-
- if (dev_path == NULL) {
- return -1;
- }
-
- prop_value = config_get_str("TV", "ssm.precopying.devpath", "null");
- if (strcmp(prop_value, "null") == 0) {
- return 1;
- }
-
- strcpy(dev_path, prop_value);
-
- return 0;
-}
-
-static unsigned char gTempDataBuf[4096] = { 0 };
-int SSMHandlePreCopying()
-{
- int device_fd = -1;
- int i = 0, tmp_size = 0;
- unsigned char tmp_ch = 0;
- char tmpPreCopyingDevicePath[256] = { '\0' };
-
- if (SSMGetPreCopyingEnableCfg() == 0) {
- LOGD("%s, Pre copying is disable now.\n", "TV");
- return 0;
- }
-
- //read temp one byte
- SSMReadNTypes(0, 1, &tmp_ch);
-
- SSMGetPreCopyingDevicePathCfg(tmpPreCopyingDevicePath);
-
- device_fd = open(tmpPreCopyingDevicePath, O_RDONLY);
- if (device_fd < 0) {
- LOGE("%s, Open device file \"%s\" error: %s.\n", "TV",
- tmpPreCopyingDevicePath, strerror(errno));
- return -1;
- }
-
- tmp_size = lseek(device_fd, 0, SEEK_END);
- if (tmp_size == 4096) {
- lseek(device_fd, 0, SEEK_SET);
- read(device_fd, gTempDataBuf, tmp_size);
-
- SSMWriteNTypes(0, tmp_size, gTempDataBuf);
- }
-
- close(device_fd);
-
- remove(tmpPreCopyingDevicePath);
-
- return 0;
-}
-
-int SSMSaveDTVType(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(SSM_RW_DTV_TYPE_START, 1, &tmp_val);
-}
-
-int SSMReadDTVType(int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(SSM_RW_DTV_TYPE_START, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-#ifndef NELEM
-# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
-#endif
-
-/************************ End APIs For UI ************************/
-
-// other api
-int GetSSMCfgBufferData(const char *key_str, int *buf_item_count, int radix,
- unsigned char data_buf[])
-{
- int cfg_item_count = 0;
- char *token = NULL;
- const char *strDelimit = ",";
- const char *config_value;
- char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
-
- config_value = config_get_str("TV", key_str, "null");
- if (strcasecmp(config_value, "null") == 0) {
- LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
- return -1;
- }
-
- cfg_item_count = 0;
-
- memset((void *)data_str, 0, sizeof(data_str));
- strncpy(data_str, config_value, sizeof(data_str) - 1);
-
- token = strtok(data_str, strDelimit);
- while (token != NULL) {
- if (cfg_item_count < *buf_item_count) {
- data_buf[cfg_item_count] = strtol(token, NULL, radix);
-
- token = strtok(NULL, strDelimit);
- cfg_item_count += 1;
- } else {
- LOGE("%s, we get data count more than desire count (%d)!!!\n",
- "TV", *buf_item_count);
- return -1;
- }
- }
-
- *buf_item_count = cfg_item_count;
-
- return 0;
-}
-
-int SSMSaveSourceInput(unsigned char rw_val)
-{
- return SSMWriteNTypes(TVIN_DATA_POS_SOURCE_INPUT_START, 1, &rw_val);
-}
-
-int SSMReadSourceInput()
-{
- unsigned char tmp_val = 0;
-
- if (SSMReadNTypes(TVIN_DATA_POS_SOURCE_INPUT_START, 1, &tmp_val) < 0) {
- return 0;
- }
- if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
- tmp_val = 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveCVBSStd(unsigned char rw_val)
-{
- return SSMWriteNTypes(TVIN_DATA_CVBS_STD_START, 1, &rw_val);
-}
-
-int SSMReadCVBSStd(unsigned char *rw_val)
-{
- return SSMReadNTypes(TVIN_DATA_CVBS_STD_START, 1, rw_val);
-}
-
-int SSMSave3DMode(unsigned char rw_val)
-{
- return SSMWriteNTypes(TVIN_DATA_POS_3D_MODE_START, 1, &rw_val);
-}
-
-int SSMRead3DMode(unsigned char *rw_val)
-{
- return SSMReadNTypes(TVIN_DATA_POS_3D_MODE_START, 1, rw_val);
-}
-
-int SSMSave3DLRSwitch(unsigned char rw_val)
-{
- return SSMWriteNTypes(TVIN_DATA_POS_3D_LRSWITCH_START, 1, &rw_val);
-}
-
-int SSMRead3DLRSwitch(unsigned char *rw_val)
-{
- return SSMReadNTypes(TVIN_DATA_POS_3D_LRSWITCH_START, 1, rw_val);
-}
-
-int SSMSave3DDepth(unsigned char rw_val)
-{
- return SSMWriteNTypes(TVIN_DATA_POS_3D_DEPTH_START, 1, &rw_val);
-}
-
-int SSMRead3DDepth(unsigned char *rw_val)
-{
- return SSMReadNTypes(TVIN_DATA_POS_3D_DEPTH_START, 1, rw_val);
-}
-
-int SSMSave3DTO2D(unsigned char rw_val)
-{
- return SSMWriteNTypes(TVIN_DATA_POS_3D_TO2D_START, 1, &rw_val);
-}
-
-int SSMRead3DTO2D(unsigned char *rw_val)
-{
- return SSMReadNTypes(TVIN_DATA_POS_3D_TO2D_START, 1, rw_val);
-}
-
-int SSMSaveBrightness(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_BRIGHTNESS_START + offset, 1, &tmp_val);
-}
-
-int SSMReadBrightness(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_BRIGHTNESS_START + offset, 1,
- &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveContrast(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_CONTRAST_START + offset, 1, &tmp_val);
-}
-
-int SSMReadContrast(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_CONTRAST_START + offset, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveSaturation(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_SATURATION_START + offset, 1, &tmp_val);
-}
-
-int SSMReadSaturation(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_SATURATION_START + offset, 1,
- &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveHue(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_HUE_START + offset, 1, &tmp_val);
-}
-
-int SSMReadHue(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_HUE_START + offset, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveSharpness(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_SHARPNESS_START + offset, 1, &tmp_val);
-}
-
-int SSMReadSharpness(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_SHARPNESS_START + offset, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveSceneMode(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_SCENE_MODE_START, 1, &tmp_val);
-}
-
-int SSMReadSceneMode(int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_SCENE_MODE_START, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSavePictureMode(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_PICTURE_MODE_START + offset, 1, &tmp_val);
-}
-
-int SSMReadPictureMode(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_PICTURE_MODE_START + offset, 1,
- &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveColorTemperature(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_COLOR_TEMP_START + offset, 1, &tmp_val);
-}
-
-int SSMReadColorTemperature(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_COLOR_TEMP_START + offset, 1,
- &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveNoiseReduction(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_NOISE_REDUCTION_START + offset, 1,
- &tmp_val);
-}
-
-int SSMReadNoiseReduction(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_NOISE_REDUCTION_START + offset, 1,
- &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveDisplayMode(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_DISPLAY_MODE_START + offset, 1, &tmp_val);
-}
-
-int SSMReadDisplayMode(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_DISPLAY_MODE_START + offset, 1,
- &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveBackLightVal(int offset, int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_BACKLIGHT_START + offset, 1, &tmp_val);
-}
-
-int SSMReadBackLightVal(int offset, int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_BACKLIGHT_START + offset, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveFBCN360BackLightVal(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_FBC_BACKLIGHT_START , 1, &tmp_val);
-}
-
-int SSMReadFBCN360BackLightVal(int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_BACKLIGHT_START, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveFBCN360ColorTempVal(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_POS_FBC_COLORTEMP_START , 1, &tmp_val);
-}
-
-int SSMReadFBCN360ColorTempVal(int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_COLORTEMP_START, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-
-int SSMSaveFBCELECmodeVal(int rw_val)
-{
- unsigned char tmp_val = rw_val;
- return SSMWriteNTypes(VPP_DATA_POS_FBC_ELECMODE_START , 1, &tmp_val);
-}
-
-int SSMReadFBCELECmodeVal(int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_ELECMODE_START, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-
-int SSMSaveColorDemoMode(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_COLOR_DEMO_MODE_START, 1, &rw_val);
-}
-
-int SSMReadColorDemoMode(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_COLOR_DEMO_MODE_START, 1, rw_val);
-}
-
-int SSMSaveColorBaseMode(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_COLOR_BASE_MODE_START, 1, &rw_val);
-}
-
-int SSMReadColorBaseMode(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_COLOR_BASE_MODE_START, 1, rw_val);
-}
-
-int SSMSaveRGBGainRStart(int offset, unsigned int rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_RGB_GAIN_R_START + offset, 1, &rw_val);
-}
-
-int SSMReadRGBGainRStart(int offset, unsigned int *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_RGB_GAIN_R_START + offset, 1, rw_val);
-}
-
-int SSMSaveRGBGainGStart(int offset, unsigned int rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_RGB_GAIN_G_START + offset, 1, &rw_val);
-}
-
-int SSMReadRGBGainGStart(int offset, unsigned int *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_RGB_GAIN_G_START + offset, 1, rw_val);
-}
-
-int SSMSaveRGBGainBStart(int offset, unsigned int rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_RGB_GAIN_B_START + offset, 1, &rw_val);
-}
-
-int SSMReadRGBGainBStart(int offset, unsigned int *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_RGB_GAIN_B_START + offset, 1, rw_val);
-}
-
-int SSMSaveRGBPostOffsetRStart(int offset, int rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_RGB_POST_OFFSET_R_START + offset, 1,
- &rw_val);
-}
-
-int SSMReadRGBPostOffsetRStart(int offset, int *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_RGB_POST_OFFSET_R_START + offset, 1,
- rw_val);
-}
-
-int SSMSaveRGBPostOffsetGStart(int offset, int rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_RGB_POST_OFFSET_G_START + offset, 1,
- &rw_val);
-}
-
-int SSMReadRGBPostOffsetGStart(int offset, int *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_RGB_POST_OFFSET_G_START + offset, 1,
- rw_val);
-}
-
-int SSMSaveRGBPostOffsetBStart(int offset, int rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_RGB_POST_OFFSET_B_START + offset, 1,
- &rw_val);
-}
-
-int SSMReadRGBPostOffsetBStart(int offset, int *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_RGB_POST_OFFSET_B_START + offset, 1,
- rw_val);
-}
-
-int SSMSaveRGBValueStart(int offset, int8_t rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_RGB_START + offset, 1, &rw_val);
-}
-
-int SSMReadRGBValueStart(int offset, int8_t *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_RGB_START + offset, 1, &rw_val);
-}
-
-int SSMSaveDBCStart(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_DBC_START, 1, &rw_val);
-}
-
-int SSMReadDBCStart(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_DBC_START, 1, rw_val);
-}
-
-int SSMSaveColorSpaceStart(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_COLOR_SPACE_START, 1, &rw_val);
-}
-
-int SSMReadColorSpaceStart(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_COLOR_SPACE_START, 1, rw_val);
-}
-
-int SSMSaveDnlpStart(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_DNLP_START, 1, &rw_val);
-}
-
-int SSMReadDnlpStart(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_DNLP_START, 1, rw_val);
-}
-
-int SSMSavePanoramaStart(int offset, unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_PANORAMA_START + offset, 1, &rw_val);
-}
-
-int SSMReadPanoramaStart(int offset, unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_PANORAMA_START + offset, 1, rw_val);
-}
-
-int SSMSaveTestPattern(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_TEST_PATTERN_START, 1, &rw_val);
-}
-
-int SSMReadTestPattern(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_TEST_PATTERN_START, 1, rw_val);
-}
-
-int SSMSaveAPL(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_APL_START, VPP_DATA_APL_SIZE, &rw_val);
-}
-
-int SSMReadAPL(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_APL_START, VPP_DATA_APL_SIZE, rw_val);
-}
-
-int SSMSaveAPL2(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_APL2_START, VPP_DATA_APL2_SIZE, &rw_val);
-}
-
-int SSMReadAPL2(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_APL2_START, VPP_DATA_APL2_SIZE, rw_val);
-}
-
-int SSMSaveBD(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_BD_START, VPP_DATA_BD_SIZE, &rw_val);
-}
-
-int SSMReadBD(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_BD_START, VPP_DATA_BD_SIZE, rw_val);
-}
-
-int SSMSaveBP(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_BP_START, VPP_DATA_BP_SIZE, &rw_val);
-}
-
-int SSMReadBP(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_BP_START, VPP_DATA_BP_SIZE, rw_val);
-}
-
-int SSMSaveDDRSSC(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_DDR_SSC_START, 1, &rw_val);
-}
-
-int SSMReadDDRSSC(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_DDR_SSC_START, 1, rw_val);
-}
-
-int SSMSaveLVDSSSC(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_LVDS_SSC_START, 1, &rw_val);
-}
-
-int SSMReadLVDSSSC(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_LVDS_SSC_START, 1, rw_val);
-}
-
-int SSMSaveDreamPanel(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_DREAM_PANEL_START, 1, &rw_val);
-}
-
-int SSMReadDreamPanel(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_DREAM_PANEL_START, 1, rw_val);
-}
-
-int SSMSaveUserNatureLightSwitch(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_USER_NATURE_SWITCH_START, 1, &rw_val);
-}
-
-int SSMReadUserNatureLightSwitch(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_USER_NATURE_SWITCH_START, 1, rw_val);
-}
-
-int SSMSaveDBCBacklightEnable(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_DBC_BACKLIGHT_START, 1, &rw_val);
-}
-
-int SSMReadDBCBacklightEnable(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_DBC_BACKLIGHT_START, 1, rw_val);
-}
-
-int SSMSaveDBCBacklightStd(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_DBC_STANDARD_START, 1, &rw_val);
-}
-
-int SSMReadDBCBacklightStd(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_DBC_STANDARD_START, 1, rw_val);
-}
-
-int SSMSaveDBCEnable(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_DBC_ENABLE_START, 1, &rw_val);
-}
-
-int SSMReadDBCEnable(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_DBC_ENABLE_START, 1, rw_val);
-}
-
-int SSMSaveGammaValue(int rw_val)
-{
- unsigned char tmp_val = rw_val;
-
- return SSMWriteNTypes(VPP_DATA_GAMMA_VALUE_START, 1, &tmp_val);
-}
-
-int SSMReadGammaValue(int *rw_val)
-{
- int tmp_ret = 0;
- unsigned char tmp_val = 0;
-
- tmp_ret = SSMReadNTypes(VPP_DATA_GAMMA_VALUE_START, 1, &tmp_val);
- *rw_val = tmp_val;
-
- return tmp_ret;
-}
-
-int SSMSaveBackLightReverse(unsigned char rw_val)
-{
- return SSMWriteNTypes(VPP_DATA_POS_BACKLIGHT_REVERSE_START, 1, &rw_val);
-}
-
-int SSMReadBackLightReverse(unsigned char *rw_val)
-{
- return SSMReadNTypes(VPP_DATA_POS_BACKLIGHT_REVERSE_START, 1, rw_val);
-}
-
-int SSMSaveAudioMasterVolume(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_MASTR_VOLUME_VAL, 1, &rw_val);
-}
-
-int SSMReadAudioMasterVolume(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_MASTR_VOLUME_VAL, 1, rw_val);
-}
-
-int SSMSaveAudioBalanceVal(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_BALANCE_VAL, 1, &rw_val);
-}
-
-int SSMReadAudioBalanceVal(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_BALANCE_VAL, 1, rw_val);
-}
-
-int SSMSaveAudioSupperBassVolume(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_SUPPERBASS_VOLUME_VAL, 1, &rw_val);
-}
-
-int SSMReadAudioSupperBassVolume(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_SUPPERBASS_VOLUME_VAL, 1, rw_val);
-}
-
-int SSMSaveAudioSupperBassSwitch(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_SUPPERBASS_SWITCH, 1, &rw_val);
-}
-
-int SSMReadAudioSupperBassSwitch(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_SUPPERBASS_SWITCH, 1, rw_val);
-}
-
-int SSMSaveAudioSRSSurroundSwitch(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_SRS_SURROUND_SWITCH, 1, &rw_val);
-}
-
-int SSMReadAudioSRSSurroundSwitch(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_SRS_SURROUND_SWITCH, 1, rw_val);
-}
-
-int SSMSaveAudioSRSDialogClaritySwitch(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_SRS_DIALOG_CLARITY_SWITCH, 1, &rw_val);
-}
-
-int SSMReadAudioSRSDialogClaritySwitch(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_SRS_DIALOG_CLARITY_SWITCH, 1, rw_val);
-}
-
-int SSMSaveAudioSRSTruBassSwitch(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_SRS_TRUEBASS_SWITCH, 1, &rw_val);
-}
-
-int SSMReadAudioSRSTruBassSwitch(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_SRS_TRUEBASS_SWITCH, 1, rw_val);
-}
-
-int SSMSaveAudioBassVolume(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_BASS_VOLUME_VAL, 1, &rw_val);
-}
-
-int SSMReadAudioBassVolume(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_BASS_VOLUME_VAL, 1, rw_val);
-}
-
-int SSMSaveAudioTrebleVolume(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_TREBLE_VOLUME_VAL, 1, &rw_val);
-}
-
-int SSMReadAudioTrebleVolume(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_TREBLE_VOLUME_VAL, 1, rw_val);
-}
-
-int SSMSaveAudioSoundModeVal(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_SOUND_MODE_VAL, 1, &rw_val);
-}
-
-int SSMReadAudioSoundModeVal(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_SOUND_MODE_VAL, 1, rw_val);
-}
-
-int SSMSaveAudioWallEffectSwitch(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_WALL_EFFCT_SWITCH, 1, &rw_val);
-}
-
-int SSMReadAudioWallEffectSwitch(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_WALL_EFFCT_SWITCH, 1, rw_val);
-}
-
-int SSMSaveAudioSPDIFSwitchVal(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_SPDIF_SWITCH, 1, &rw_val);
-}
-
-int SSMReadAudioSPDIFSwitchVal(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_SPDIF_SWITCH, 1, rw_val);
-}
-
-int SSMSaveAudioSPDIFModeVal(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_SPDIF_MODE_VAL, 1, &rw_val);
-}
-
-int SSMReadAudioSPDIFModeVal(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_SPDIF_MODE_VAL, 1, rw_val);
-}
-
-int SSMSaveAudioEQModeVal(int8_t rw_val)
-{
- return SSMWriteNTypes(SSM_AUD_EQ_MODE_VAL, 1, &rw_val);
-}
-
-int SSMReadAudioEQModeVal(int8_t *rw_val)
-{
- return SSMReadNTypes(SSM_AUD_EQ_MODE_VAL, 1, rw_val);
-}
-
-int SSMSaveAudioEQGain(int offset, int size, int8_t tmp_buf[])
-{
- return SSMWriteNTypes(SSM_AUD_EQ_GAIN + offset, size, tmp_buf);
-}
-
-int SSMReadAudioEQGain(int offset, int size, int8_t tmp_buf[])
-{
- return SSMReadNTypes(SSM_AUD_EQ_GAIN, size, tmp_buf);
-}
-
-int SSMSaveBlackoutEnable(int8_t enable)
-{
- return SSMWriteNTypes(SSM_RW_BLACKOUT_ENABLE_START, 1, &enable);
-}
-
-int SSMReadBlackoutEnable(int8_t *enable)
-{
- return SSMReadNTypes(SSM_RW_BLACKOUT_ENABLE_START, 1, enable);
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <cutils/properties.h>
+
+#include <netinet/ether.h>
+#include <netinet/if_ether.h>
+
+#include <netutils/ifc.h>
+#include <netutils/dhcp.h>
+
+#include "CTvSetting.h"
+
+#include "../tvconfig/tvconfig.h"
+#include "../tvutils/tvutils.h"
+
+#include "../tv/CTvLog.h"
+#define CC_DEF_CHARACTER_CHAR_VAL (0x8A)
+
+pthread_mutex_t ssm_r_w_op_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/************************ Start APIs For UI ************************/
+
+CTvSettingDeviceFactory *mpSettingDeviceFactory = NULL;
+CBlobDevice *mpCurDevice = NULL;
+
+bool CTvSettingLoad()
+{
+ mpSettingDeviceFactory = new CTvSettingDeviceFactory();
+ mpCurDevice = mpSettingDeviceFactory->getSaveDeviceFromConfigFile();
+ if (mpCurDevice == NULL) {
+ LOGD("%s, CTvSettingLoad = NULL", "TV");
+ return false;
+ } else {
+ mpCurDevice->OpenDevice();
+ }
+ return true;
+}
+
+bool CTvSettingunLoad()
+{
+ if (mpSettingDeviceFactory != NULL) {
+ delete mpSettingDeviceFactory;
+ mpSettingDeviceFactory = NULL;
+ }
+ return true;
+}
+
+int CTvSettingdoSuspend()
+{
+ return mpCurDevice->CloseDevice();
+}
+
+int CTvSettingdoResume()
+{
+ return mpCurDevice->OpenDevice();
+}
+template<typename T>
+static int SSMWriteNTypes(int offset, int data_len, T *data_buf)
+{
+ pthread_mutex_lock(&ssm_r_w_op_mutex);
+
+ if (data_buf == NULL) {
+ LOGE("%s, data_buf is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ if (mpCurDevice == NULL) {
+ LOGE("%s, ssm_device is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ if (mpCurDevice->WriteBytes(offset, data_len * sizeof(T),
+ (unsigned char *) data_buf) < 0) {
+ LOGE("%s, device WriteNBytes error.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return 0;
+}
+
+template<typename T>
+static int SSMReadNTypes(int offset, int data_len, T *data_buf)
+{
+ pthread_mutex_lock(&ssm_r_w_op_mutex);
+
+ if (data_buf == NULL) {
+ LOGE("%s, data_buf is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ if (mpCurDevice == NULL) {
+ LOGE("%s, ssm_device is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ if (mpCurDevice->ReadBytes(offset, data_len * sizeof(T),
+ (unsigned char *) data_buf) < 0) {
+ LOGE("%s, device ReadNBytes error.\n", "TV");
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return 0;
+}
+int SSMSaveFlash_One_N310_N311(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+ LOGD ( "~~~ SSMSaveFlash_One ~~~##offset %d##rw_val %d##" , offset, rw_val);
+
+ return SSMWriteNTypes(offset, 1, &tmp_val);
+}
+
+int SSMReadFlash_One_N310_N311(int offset)
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(offset, 1, &tmp_val) < 0) {
+ return -1;
+ }
+ LOGD ( "~~~ SSMReadFlash_One ~~~##offset %d##rw_val %d##" , offset, tmp_val);
+
+ return tmp_val;
+}
+
+int SSMSaveFlash_N_N310_N311(int offset, int data_len, int *data_buf)
+{
+ int i = 0;
+ unsigned char *ptr = NULL;
+
+ ptr = new unsigned char[data_len];
+
+ if (ptr != NULL) {
+ for (i = 0; i < data_len; i++) {
+ ptr[i] = data_buf[i];
+ }
+ } else {
+ delete ptr;
+ ptr = NULL;
+
+ return -1;
+ }
+
+ if (SSMWriteNTypes(offset, data_len, ptr) < 0) {
+ delete ptr;
+ ptr = NULL;
+
+ return -1;
+ }
+
+ delete ptr;
+ ptr = NULL;
+
+ return 0;
+}
+
+int SSMReadFlash_N_N310_N311(int offset, int data_len, int *data_buf)
+{
+ int i = 0;
+ unsigned char *ptr = NULL;
+
+ ptr = new unsigned char[data_len];
+
+ if (ptr != NULL) {
+ if (SSMReadNTypes(offset, data_len, ptr) < 0) {
+ delete ptr;
+ ptr = NULL;
+
+ return -1;
+ }
+ } else {
+ delete ptr;
+ ptr = NULL;
+
+ return -1;
+ }
+
+ for (i = 0; i < data_len; i++) {
+ data_buf[i] = ptr[i];
+ }
+
+ delete ptr;
+ ptr = NULL;
+
+ return 0;
+}
+int EEPWriteOneByte(int offset, unsigned char *data_buf)
+{
+ int fd = 0;
+ const char *device_path = config_get_str("TV", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom");
+ pthread_mutex_lock(&ssm_r_w_op_mutex);
+
+ LOGD ( "~~~EEPWriteOneByte~~~##offset %d##rw_val %s##" , offset, data_buf);
+
+ if (data_buf == NULL) {
+ LOGE("%s, data_buf is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ fd = open(device_path, O_RDWR);
+
+ if (fd < 0) {
+ LOGE("%s, ####i2c test device open failed####.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ lseek(fd, offset, SEEK_SET);
+
+ if (write(fd, data_buf, 1) < 0) {
+ LOGE("%s, device WriteOneBytes error.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ close(fd);
+
+ LOGE("%s, device WriteOneBytes OK.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return 0;
+}
+
+int EEPReadOneByte(int offset , unsigned char *data_buf)
+{
+ int fd = 0;
+ //const char* device_type = config_get_str("SETTING", "peripheral.eeprom.device", "disable");
+ const char *device_path = config_get_str("TV", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom");
+
+ pthread_mutex_lock(&ssm_r_w_op_mutex);
+
+ if (data_buf == NULL) {
+ LOGE("%s, data_buf is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ fd = open(device_path, O_RDWR);
+
+ if (fd < 0) {
+ LOGE("%s, ssm_device is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+ lseek(fd, offset, SEEK_SET);
+
+ if (read(fd, data_buf, 1) < 0) {
+ LOGE("%s, device ReadOneBytes error.\n", "TV");
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ close(fd);
+
+ LOGD ( "~~~EEPReadOneByte~~~##offset %d##rw_val %d##" , offset, data_buf);
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return 0;
+}
+
+int EEPWriteNByte(int offset, int data_len, unsigned char *data_buf)
+{
+ int fd = 0;
+ const char *device_path = config_get_str("TV", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom");
+ pthread_mutex_lock(&ssm_r_w_op_mutex);
+
+ LOGD ( "~~~EEPWriteNByte~~~##offset %d##data_len %d##" , offset, data_len);
+
+ if (data_buf == NULL) {
+ LOGE("%s, data_buf is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ fd = open(device_path, O_RDWR);
+
+ if (fd < 0) {
+ LOGE("%s, ####i2c test device open failed####.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ lseek(fd, offset, SEEK_SET);
+
+ if (write(fd, data_buf, data_len) < 0) {
+ LOGE("%s, device WriteNBytes error.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ close(fd);
+
+ LOGE("%s, device WriteNBytes OK.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return 0;
+}
+int EEPReadNByte(int offset, int data_len, unsigned char *data_buf)
+{
+ int fd = 0;
+ const char *device_path = config_get_str("TV", "peripheral.eeprom.path", "/sys/devices/i2c-2/2-0050/eeprom");
+ pthread_mutex_lock(&ssm_r_w_op_mutex);
+
+ if (data_buf == NULL) {
+ LOGE("%s, data_buf is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ fd = open(device_path, O_RDWR);
+
+ if (fd < 0) {
+ LOGE("%s, ssm_device is NULL.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+ lseek(fd, offset, SEEK_SET);
+
+ if (read(fd, data_buf, data_len) < 0) {
+ LOGE("%s, device ReadNBytes error.\n", "TV");
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return -1;
+ }
+
+ close(fd);
+
+ LOGD ( "~~~EEPReadNByte~~~##offset %d##data_len %d##" , offset, data_len);
+
+ pthread_mutex_unlock(&ssm_r_w_op_mutex);
+ return 0;
+}
+
+
+int SSMSaveEEP_One_N310_N311(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+ const char *device_config = config_get_str("TV", "peripheral.eeprom.device", "disable");
+
+ if (strcmp(device_config, "enable") != 0) {
+ LOGD ( "~~~ SSMSaveEEP_One ~~~##peripheral.eeprom.device error##");
+ return -1;
+ }
+ LOGD ( "~~~SSMSaveEEP_One~~~##offset %d##rw_val %d##" , offset, rw_val);
+
+ return EEPWriteOneByte(offset, &tmp_val);
+}
+
+int SSMReadEEP_One_N310_N311(int offset)
+{
+ unsigned char tmp_val = 0;
+ const char *device_config = config_get_str("TV", "peripheral.eeprom.device", "disable");
+
+ if (strcmp(device_config, "enable") != 0) {
+ LOGD ( "~~~ SSMReadEEP_One ~~~##peripheral.eeprom.device error##");
+ return -1;
+ }
+
+ if (EEPReadOneByte(offset, &tmp_val) < 0) {
+ return -1;
+ }
+ LOGD ( "~~~SSMReadEEP_One~~~##offset %d##rw_val %d##" , offset, tmp_val);
+
+ return tmp_val;
+}
+
+int SSMSaveEEP_N_N310_N311(int offset, int data_len, int *data_buf)
+{
+ int i = 0;
+ unsigned char *ptr = NULL;
+ const char *device_config = config_get_str("TV", "peripheral.eeprom.device", "disable");
+
+ if (strcmp(device_config, "enable") != 0) {
+ LOGD ( "~~~ SSMSaveEEP_N ~~~##peripheral.eeprom.device error##");
+ return -1;
+ }
+
+ ptr = new unsigned char[data_len];
+
+ if (ptr != NULL) {
+ for (i = 0; i < data_len; i++) {
+ ptr[i] = data_buf[i];
+ }
+ } else {
+ delete ptr;
+ ptr = NULL;
+
+ return -1;
+ }
+
+ if (EEPWriteNByte(offset, data_len, ptr) < 0) {
+ delete ptr;
+ ptr = NULL;
+
+ return -1;
+ }
+
+ delete ptr;
+ ptr = NULL;
+
+ return 0;
+}
+
+int SSMReadEEP_N_N310_N311(int offset, int data_len, int *data_buf)
+{
+ int i = 0;
+ unsigned char *ptr = NULL;
+ const char *device_config = config_get_str("TV", "peripheral.eeprom.device", "disable");
+
+ if (strcmp(device_config, "enable") != 0) {
+ LOGD ( "~~~ SSMReadEEP_N ~~~##peripheral.eeprom.device error##");
+ return -1;
+ }
+ ptr = new unsigned char[data_len];
+
+ if (ptr != NULL) {
+ if (EEPReadNByte(offset, data_len, ptr) < 0) {
+ delete ptr;
+ ptr = NULL;
+
+ return -1;
+ }
+ } else {
+ delete ptr;
+ ptr = NULL;
+
+ return -1;
+ }
+
+ for (i = 0; i < data_len; i++) {
+ data_buf[i] = ptr[i];
+ }
+
+ delete ptr;
+ ptr = NULL;
+
+ return 0;
+}
+/************************ Start APIs For UI ************************/
+int MiscSSMRestoreDefault()
+{
+ SSMSaveFactoryBurnMode(0);
+ SSMSavePowerOnOffChannel(1);
+ SSMSaveSystemLanguage(0);
+ SSMSaveAgingMode(0);
+ SSMSavePanelType(0);
+ SSMSavePowerOnMusicSwitch(0);
+ SSMSavePowerOnMusicVolume(20);
+ SSMSaveSystemSleepTimer(0xFFFFFFFF);
+ SSMSaveInputSourceParentalControl(0, 0);
+ SSMSaveParentalControlSwitch(0);
+ SSMSaveSerialCMDSwitchValue(0);
+ SSMSaveBlackoutEnable(0);
+ return 0;
+}
+
+int MiscSSMFacRestoreDefault()
+{
+ SSMSaveSystemLanguage(0);
+ SSMSavePowerOnMusicSwitch(1);
+ SSMSavePowerOnMusicVolume(20);
+ SSMSaveSystemSleepTimer(0xFFFFFFFF);
+ SSMSaveInputSourceParentalControl(0, 0);
+ SSMSaveParentalControlSwitch(0);
+ SSMSaveSearchNavigateFlag(1);
+ SSMSaveInputNumLimit(2);
+ SSMSaveLocalDimingOnOffFlg(0);
+
+ return 0;
+}
+
+int ReservedSSMRestoreDefault()
+{
+ SSMSaveBurnWriteCharaterChar(CC_DEF_CHARACTER_CHAR_VAL);
+
+ return 0;
+}
+
+int SSMSaveBurnWriteCharaterChar(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RSV_W_CHARACTER_CHAR_START, 1, &tmp_val);
+}
+
+int SSMReadBurnWriteCharaterChar()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RSV_W_CHARACTER_CHAR_START, 1, &tmp_val) < 0) {
+ return -1;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveFactoryBurnMode(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_FBMF_START, 1, &tmp_val);
+}
+
+int SSMReadFactoryBurnMode()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_FBMF_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val != 0) {
+ return 1;
+ }
+
+ return 0;
+}
+
+int SSMSavePowerOnOffChannel(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+ return SSMWriteNTypes(SSM_RW_POWER_CHANNEL_START, 1, &tmp_val);
+}
+
+int SSMReadPowerOnOffChannel()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_POWER_CHANNEL_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+ return tmp_val;
+}
+
+int SSMSaveLastSelectSourceInput(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+ return SSMWriteNTypes(SSM_RW_LAST_SOURCE_INPUT_START, 1, &tmp_val);
+}
+
+int SSMReadLastSelectSourceInput()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_LAST_SOURCE_INPUT_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+ if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveSystemLanguage(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_SYS_LANGUAGE_START, 1, &tmp_val);
+}
+
+int SSMReadSystemLanguage()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_SYS_LANGUAGE_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveAgingMode(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_AGING_MODE_START, 1, &tmp_val);
+}
+
+int SSMReadAgingMode()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_AGING_MODE_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSavePanelType(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_PANEL_TYPE_START, 1, &tmp_val);
+}
+
+int SSMReadPanelType()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_PANEL_TYPE_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSavePowerOnMusicSwitch(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_POWER_ON_MUSIC_SWITCH_START, 1, &tmp_val);
+}
+
+int SSMReadPowerOnMusicSwitch()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_POWER_ON_MUSIC_SWITCH_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSavePowerOnMusicVolume(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_POWER_ON_MUSIC_VOL_START, 1, &tmp_val);
+}
+
+int SSMReadPowerOnMusicVolume()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_POWER_ON_MUSIC_VOL_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveSystemSleepTimer(int rw_val)
+{
+ return SSMWriteNTypes(SSM_RW_SYS_SLEEP_TIMER_START, 1, &rw_val);
+}
+
+int SSMReadSystemSleepTimer()
+{
+ int tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_SYS_SLEEP_TIMER_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val < 0) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveInputSourceParentalControl(int source_index,
+ unsigned char ctl_flag)
+{
+ int tmp_val = 0;
+
+ if (source_index < 0 || source_index > 31) {
+ return -1;
+ }
+
+ if (ctl_flag != 0 && ctl_flag != 1) {
+ return -1;
+ }
+
+ if (SSMReadNTypes(SSM_RW_INPUT_SRC_PARENTAL_CTL_START, 4,
+ (unsigned char *) &tmp_val) < 0) {
+ return -1;
+ }
+
+ tmp_val = (tmp_val & (~(1 << source_index))) | (ctl_flag << source_index);
+
+ return SSMWriteNTypes(SSM_RW_INPUT_SRC_PARENTAL_CTL_START, 4,
+ (unsigned char *) &tmp_val);
+}
+
+int SSMReadInputSourceParentalControl(int source_index)
+{
+ int tmp_val = 0;
+
+ if (SSMReadParentalControlSwitch() == 0) {
+ return 0;
+ }
+
+ if (SSMReadNTypes(SSM_RW_INPUT_SRC_PARENTAL_CTL_START, 4,
+ (unsigned char *) &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val & (1 << source_index)) {
+ return 1;
+ }
+
+ return 0;
+}
+
+int SSMSaveParentalControlSwitch(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_PARENTAL_CTL_SWITCH_START, 1, &tmp_val);
+}
+
+int SSMReadParentalControlSwitch()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_PARENTAL_CTL_SWITCH_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val != 0) {
+ tmp_val = 1;
+ }
+
+ return tmp_val;
+}
+
+int SSMGetCustomerDataStart()
+{
+ return SSM_RW_CUSTOMER_DATA_START;
+}
+
+int SSMGetCustomerDataLen()
+{
+ return SSM_RW_CUSTOMER_DATA_LEN;
+}
+
+int SSMGetATVDataStart()
+{
+ return SSM_RW_ATV_START;
+}
+
+int SSMGetATVDataLen()
+{
+ return SSM_RW_ATV_LEN;
+}
+
+int SSMGetVPPDataStart()
+{
+ return SSM_RW_VPP_START;
+}
+
+int SSMGetVPPDataLen()
+{
+ return SSM_RW_VPP_LEN;
+}
+
+int SSMSaveSearchNavigateFlag(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_SEARCH_NAVIGATE_FLAG_START, 1, &tmp_val);
+}
+
+int SSMReadSearchNavigateFlag()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_SEARCH_NAVIGATE_FLAG_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveInputNumLimit(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_INPUT_NUMBER_LIMIT_START, 1, &tmp_val);
+}
+
+int SSMReadInputNumLimit()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_INPUT_NUMBER_LIMIT_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveLocalDimingOnOffFlg(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_LOCAL_DIMING_START, 1, &tmp_val);
+}
+
+int SSMReadLocalDimingOnOffFlg()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_LOCAL_DIMING_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveVDac2DValue(unsigned short rw_val)
+{
+ return SSMWriteNTypes(SSM_RW_VDAC_2D_START, 1, &rw_val);
+}
+
+int SSMReadVDac2DValue()
+{
+ unsigned short tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_VDAC_2D_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveVDac3DValue(unsigned short rw_val)
+{
+ return SSMWriteNTypes(SSM_RW_VDAC_3D_START, 1, &rw_val);
+}
+
+int SSMReadVDac3DValue()
+{
+ unsigned short tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_VDAC_3D_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveChromaStatus(int mode)
+{
+ int fd = -1, ret = -1;
+ char value[20] = "";
+
+ sprintf(value, "%d", mode);
+
+ fd = open("/sys/class/tvafe/tvafe0/cvd_reg8a", O_RDWR);
+
+ if (fd < 0) {
+ LOGE("open /sys/class/tvafe/tvafe0/cvd_reg8a ERROR(%s)!!\n",
+ strerror(errno));
+ return -1;
+ }
+
+ ret = write(fd, value, strlen(value));
+
+ close(fd);
+
+ return ret;
+}
+
+int SSMSaveNonStandardValue(unsigned short rw_val)
+{
+ int i = 0, tmp_ret = 0;
+ unsigned char data[] = { 0, 0 };
+
+ {
+ data[0] = (unsigned char) rw_val;
+ rw_val >>= 8;
+ data[1] = (unsigned char) rw_val;
+ }
+
+ LOGD("%s, save NonStandard_value = %d", "TV", rw_val);
+
+ return SSMWriteNTypes(SSM_RW_NON_STANDARD_START, 2, data);
+}
+
+int SSMReadNonStandardValue(void)
+{
+ int i = 0, value = 0;
+ int data[] = { 0, 0 };
+
+ if (SSMReadNTypes(SSM_RW_NON_STANDARD_START, 2, data) < 0) {
+ LOGE("%s, read NonStandard_value error.", "TV");
+ return 0;
+ }
+
+ {
+ value += data[1];
+ value <<= 8;
+ value += data[0];
+ }
+
+ LOGD("%s, read NonStandard_value = %d.", "TV", value);
+
+ return value;
+}
+
+int SSMSaveAdbSwitchValue(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_ADB_SWITCH_START, 1, &tmp_val);
+}
+
+int SSMReadAdbSwitchValue(void)
+{
+ unsigned char switch_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_ADB_SWITCH_START, 1, &switch_val) < 0) {
+ LOGD("%s, read switch value error", "TV");
+ return -1;
+ }
+
+ LOGD("%s, read switch value = %d", "TV", switch_val);
+
+ return switch_val;
+}
+
+int SSMSaveSerialCMDSwitchValue(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_SERIAL_CMD_SWITCH_START, 1, &tmp_val);
+}
+
+int SSMReadSerialCMDSwitchValue(void)
+{
+ unsigned char switch_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_SERIAL_CMD_SWITCH_START, 1, &switch_val) < 0) {
+ LOGD("%s, read switch value error", "TV");
+ return -1;
+ }
+
+ LOGD("%s, read switch value = %d", "TV", switch_val);
+
+ return switch_val;
+}
+
+int SSMSaveNoiseGateThresholdValue(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_NOISE_GATE_THRESHOLD_START, 1, &tmp_val);
+}
+
+int SSMReadNoiseGateThresholdValue(void)
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_NOISE_GATE_THRESHOLD_START, 1, &tmp_val) < 0) {
+ LOGD("%s, read NoiseGateThreshold error", "TV");
+ return -1;
+ }
+
+ LOGD("%s, read NoiseGateThreshold = %d", "TV", tmp_val);
+
+ return tmp_val;
+}
+
+int SSMSaveGraphyBacklight(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ if (rw_val < 0 || rw_val > 100) {
+ return -1;
+ }
+
+ return SSMWriteNTypes(SSM_RW_UI_GRHPHY_BACKLIGHT_START, 1, &tmp_val);
+}
+
+int SSMReadGraphyBacklight(void)
+{
+ unsigned char value = 0;
+
+ if (SSMReadNTypes(SSM_RW_UI_GRHPHY_BACKLIGHT_START, 1, &value) < 0) {
+ LOGD("%s, read graphybacklight error.\n", "TV");
+ return -1;
+ }
+
+ if (/*value < 0 || */value > 100) {
+ LOGD("%s, range of graphybacklight (%d) is not between 0-100.\n",
+ "TV", value);
+ return -1;
+ }
+
+ return value;
+}
+
+int SSMSaveFastSuspendFlag(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_FASTSUSPEND_FLAG_START, 1, &tmp_val);
+}
+
+int SSMReadFastSuspendFlag(void)
+{
+ unsigned char value = 0;
+
+ if (SSMReadNTypes(SSM_RW_FASTSUSPEND_FLAG_START, 1, &value) < 0) {
+ LOGD("%s, read FastSuspendFlag error.\n", "TV");
+ return -1;
+ }
+
+ return value;
+}
+
+int SSMSaveCABufferSizeValue(unsigned short rw_val)
+{
+ int i = 0, tmp_ret = 0;
+ unsigned char data[] = { 0, 0 };
+
+ {
+ data[0] = (unsigned char) rw_val;
+ rw_val >>= 8;
+ data[1] = (unsigned char) rw_val;
+ }
+
+ return SSMWriteNTypes(SSM_RW_CA_BUFFER_SIZE_START, 2, data);
+}
+
+int SSMReadCABufferSizeValue(void)
+{
+ int i = 0, value = 0;
+ unsigned char data[] = { 0, 0 };
+
+ if (SSMReadNTypes(SSM_RW_CA_BUFFER_SIZE_START, 2, data) < 0) {
+ LOGE("%s, read ca_buffer_size error", "TV");
+ return 0;
+ }
+
+ {
+ value += data[1];
+ value <<= 8;
+ value += data[0];
+ }
+
+ return value;
+}
+
+int SSMSaveStandbyMode(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_STANDBY_MODE_FLAG_START, 1, &tmp_val);
+}
+
+int SSMReadStandbyMode()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_STANDBY_MODE_FLAG_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveHDMIEQMode(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_HDMIEQ_MODE_START, 1, &tmp_val);
+}
+
+int SSMReadHDMIEQMode()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_HDMIEQ_MODE_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveLogoOnOffFlag(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_LOGO_ON_OFF_FLAG_START, 1, &tmp_val);
+}
+
+int SSMReadLogoOnOffFlag()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_LOGO_ON_OFF_FLAG_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveHDMIInternalMode(unsigned int rw_val)
+{
+ int i = 0, tmp_ret = 0;
+ unsigned char data[] = { 0, 0, 0, 0 };
+
+ for (i = 3; i >= 0; i--) {
+ data[i] = (unsigned char) rw_val;
+ rw_val >>= 8;
+ }
+
+ return SSMWriteNTypes(SSM_RW_HDMIINTERNAL_MODE_START, 4, data);
+}
+
+int SSMReadHDMIInternalMode()
+{
+ int i = 0, value = 0;
+ int data[] = { 0, 0, 0, 0 };
+
+ if (SSMReadNTypes(SSM_RW_HDMIINTERNAL_MODE_START, 4, data) < 0) {
+ return 0;
+ }
+
+ for (i = 0; i < 4; i++) {
+ value <<= 8;
+ value += data[i];
+ }
+
+ return value;
+}
+
+int SSMSaveParentalControlPassWord(unsigned char *password, int size)
+{
+ return SSMWriteNTypes(SSM_RW_PARENTAL_CTL_PASSWORD_START, size, password);
+}
+
+int SSMReadParentalControlPassWord(unsigned short *password)
+{
+ if (SSMReadNTypes(SSM_RW_PARENTAL_CTL_PASSWORD_START,
+ SSM_RW_PARENTAL_CTL_PASSWORD_LEN, (unsigned char *) password)
+ < 0) {
+ return -1;
+ }
+ return 0;
+}
+
+int SSMSaveDisable3D(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_DISABLE_3D_START, 1, &tmp_val);
+}
+
+int SSMReadDisable3D()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_DISABLE_3D_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveGlobalOgoEnable(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_GLOBAL_OGO_ENABLE_START, 1, &tmp_val);
+}
+
+int SSMReadGlobalOgoEnable()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(SSM_RW_GLOBAL_OGO_ENABLE_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+
+ if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMDeviceMarkCheck()
+{
+ int i = 0, failed_count = 0;
+ int mark_offset[3] = { 0, 0, 0 };
+ unsigned char mark_values[3] = { 0, 0, 0 };
+ unsigned char tmp_ch = 0;
+
+ //read temp one byte
+ SSMReadNTypes(0, 1, &tmp_ch);
+
+ mark_offset[0] = SSM_MARK_01_START;
+ mark_offset[1] = SSM_MARK_02_START;
+ mark_offset[2] = SSM_MARK_03_START;
+
+ mark_values[0] = SSM_MARK_01_VALUE;
+ mark_values[1] = SSM_MARK_02_VALUE;
+ mark_values[2] = SSM_MARK_03_VALUE;
+
+ if (SSMReadBurnWriteCharaterChar() != CC_DEF_CHARACTER_CHAR_VAL) {
+ SSMSaveBurnWriteCharaterChar(CC_DEF_CHARACTER_CHAR_VAL);
+ }
+
+ failed_count = 0;
+ for (i = 0; i < 3; i++) {
+ tmp_ch = 0;
+ if (SSMReadNTypes(mark_offset[i], 1, &tmp_ch) < 0) {
+ LOGE("%s, SSMDeviceMarkCheck Read Mark failed!!!\n", "TV");
+ break;
+ }
+
+ if (tmp_ch != mark_values[i]) {
+ failed_count += 1;
+ LOGE(
+ "%s, SSMDeviceMarkCheck Mark[%d]'s offset = %d, Mark[%d]'s Value = %d, read value = %d.\n",
+ "TV", i, mark_offset[i], i, mark_values[i], tmp_ch);
+ }
+ }
+
+ if (failed_count >= 3) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int SSMRestoreDeviceMarkValues()
+{
+ int i;
+ int mark_offset[3] = {
+ (int) SSM_MARK_01_START, //
+ (int) SSM_MARK_02_START, //
+ (int) SSM_MARK_03_START, //
+ };
+
+ unsigned char mark_values[3] = {
+ //
+ (unsigned char) SSM_MARK_01_VALUE, (unsigned char) SSM_MARK_02_VALUE,
+ (unsigned char) SSM_MARK_03_VALUE, //
+ };
+
+ for (i = 0; i < 3; i++) {
+ if (SSMWriteNTypes(mark_offset[i], 1, &(mark_values[i])) < 0) {
+ LOGD("SSMRestoreDeviceMarkValues Write Mark failed.\n");
+ break;
+ }
+ }
+
+ if (i < 3) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static int SSMGetPreCopyingEnableCfg()
+{
+ const char *prop_value;
+
+ prop_value = config_get_str("TV", "ssm.precopying.en", "null");
+ if (strcmp(prop_value, "null") == 0 || strcmp(prop_value, "0") == 0
+ || strcmp(prop_value, "disable") == 0) {
+ return 0;
+ }
+
+ return 1;
+}
+
+static int SSMGetPreCopyingDevicePathCfg(char dev_path[])
+{
+ const char *prop_value;
+
+ if (dev_path == NULL) {
+ return -1;
+ }
+
+ prop_value = config_get_str("TV", "ssm.precopying.devpath", "null");
+ if (strcmp(prop_value, "null") == 0) {
+ return 1;
+ }
+
+ strcpy(dev_path, prop_value);
+
+ return 0;
+}
+
+static unsigned char gTempDataBuf[4096] = { 0 };
+int SSMHandlePreCopying()
+{
+ int device_fd = -1;
+ int i = 0, tmp_size = 0;
+ unsigned char tmp_ch = 0;
+ char tmpPreCopyingDevicePath[256] = { '\0' };
+
+ if (SSMGetPreCopyingEnableCfg() == 0) {
+ LOGD("%s, Pre copying is disable now.\n", "TV");
+ return 0;
+ }
+
+ //read temp one byte
+ SSMReadNTypes(0, 1, &tmp_ch);
+
+ SSMGetPreCopyingDevicePathCfg(tmpPreCopyingDevicePath);
+
+ device_fd = open(tmpPreCopyingDevicePath, O_RDONLY);
+ if (device_fd < 0) {
+ LOGE("%s, Open device file \"%s\" error: %s.\n", "TV",
+ tmpPreCopyingDevicePath, strerror(errno));
+ return -1;
+ }
+
+ tmp_size = lseek(device_fd, 0, SEEK_END);
+ if (tmp_size == 4096) {
+ lseek(device_fd, 0, SEEK_SET);
+ read(device_fd, gTempDataBuf, tmp_size);
+
+ SSMWriteNTypes(0, tmp_size, gTempDataBuf);
+ }
+
+ close(device_fd);
+
+ remove(tmpPreCopyingDevicePath);
+
+ return 0;
+}
+
+int SSMSaveDTVType(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_RW_DTV_TYPE_START, 1, &tmp_val);
+}
+
+int SSMReadDTVType(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(SSM_RW_DTV_TYPE_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+#ifndef NELEM
+# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
+#endif
+
+/************************ End APIs For UI ************************/
+
+// other api
+int GetSSMCfgBufferData(const char *key_str, int *buf_item_count, int radix,
+ unsigned char data_buf[])
+{
+ int cfg_item_count = 0;
+ char *token = NULL;
+ const char *strDelimit = ",";
+ const char *config_value;
+ char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
+
+ config_value = config_get_str("TV", key_str, "null");
+ if (strcasecmp(config_value, "null") == 0) {
+ LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
+ return -1;
+ }
+
+ cfg_item_count = 0;
+
+ memset((void *)data_str, 0, sizeof(data_str));
+ strncpy(data_str, config_value, sizeof(data_str) - 1);
+
+ char *pSave;
+ token = strtok_r(data_str, strDelimit, &pSave);
+ while (token != NULL) {
+ if (cfg_item_count < *buf_item_count) {
+ data_buf[cfg_item_count] = strtol(token, NULL, radix);
+
+ token = strtok_r(NULL, strDelimit, &pSave);
+ cfg_item_count += 1;
+ } else {
+ LOGE("%s, we get data count more than desire count (%d)!!!\n",
+ "TV", *buf_item_count);
+ return -1;
+ }
+ }
+
+ *buf_item_count = cfg_item_count;
+
+ return 0;
+}
+
+int SSMSaveSourceInput(unsigned char rw_val)
+{
+ return SSMWriteNTypes(TVIN_DATA_POS_SOURCE_INPUT_START, 1, &rw_val);
+}
+
+int SSMReadSourceInput()
+{
+ unsigned char tmp_val = 0;
+
+ if (SSMReadNTypes(TVIN_DATA_POS_SOURCE_INPUT_START, 1, &tmp_val) < 0) {
+ return 0;
+ }
+ if (tmp_val == CBlobDevice::CC_INIT_BYTE_VAL) {
+ tmp_val = 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveCVBSStd(unsigned char rw_val)
+{
+ return SSMWriteNTypes(TVIN_DATA_CVBS_STD_START, 1, &rw_val);
+}
+
+int SSMReadCVBSStd(unsigned char *rw_val)
+{
+ return SSMReadNTypes(TVIN_DATA_CVBS_STD_START, 1, rw_val);
+}
+
+int SSMSave3DMode(unsigned char rw_val)
+{
+ return SSMWriteNTypes(TVIN_DATA_POS_3D_MODE_START, 1, &rw_val);
+}
+
+int SSMRead3DMode(unsigned char *rw_val)
+{
+ return SSMReadNTypes(TVIN_DATA_POS_3D_MODE_START, 1, rw_val);
+}
+
+int SSMSave3DLRSwitch(unsigned char rw_val)
+{
+ return SSMWriteNTypes(TVIN_DATA_POS_3D_LRSWITCH_START, 1, &rw_val);
+}
+
+int SSMRead3DLRSwitch(unsigned char *rw_val)
+{
+ return SSMReadNTypes(TVIN_DATA_POS_3D_LRSWITCH_START, 1, rw_val);
+}
+
+int SSMSave3DDepth(unsigned char rw_val)
+{
+ return SSMWriteNTypes(TVIN_DATA_POS_3D_DEPTH_START, 1, &rw_val);
+}
+
+int SSMRead3DDepth(unsigned char *rw_val)
+{
+ return SSMReadNTypes(TVIN_DATA_POS_3D_DEPTH_START, 1, rw_val);
+}
+
+int SSMSave3DTO2D(unsigned char rw_val)
+{
+ return SSMWriteNTypes(TVIN_DATA_POS_3D_TO2D_START, 1, &rw_val);
+}
+
+int SSMRead3DTO2D(unsigned char *rw_val)
+{
+ return SSMReadNTypes(TVIN_DATA_POS_3D_TO2D_START, 1, rw_val);
+}
+
+int SSMSaveBrightness(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_BRIGHTNESS_START + offset, 1, &tmp_val);
+}
+
+int SSMReadBrightness(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_BRIGHTNESS_START + offset, 1,
+ &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveContrast(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_CONTRAST_START + offset, 1, &tmp_val);
+}
+
+int SSMReadContrast(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_CONTRAST_START + offset, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveSaturation(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_SATURATION_START + offset, 1, &tmp_val);
+}
+
+int SSMReadSaturation(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_SATURATION_START + offset, 1,
+ &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveHue(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_HUE_START + offset, 1, &tmp_val);
+}
+
+int SSMReadHue(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_HUE_START + offset, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveSharpness(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_SHARPNESS_START + offset, 1, &tmp_val);
+}
+
+int SSMReadSharpness(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_SHARPNESS_START + offset, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveSceneMode(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_SCENE_MODE_START, 1, &tmp_val);
+}
+
+int SSMReadSceneMode(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_SCENE_MODE_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSavePictureMode(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_PICTURE_MODE_START + offset, 1, &tmp_val);
+}
+
+int SSMReadPictureMode(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_PICTURE_MODE_START + offset, 1,
+ &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveColorTemperature(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_COLOR_TEMP_START + offset, 1, &tmp_val);
+}
+
+int SSMReadColorTemperature(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_COLOR_TEMP_START + offset, 1,
+ &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveNoiseReduction(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_NOISE_REDUCTION_START + offset, 1,
+ &tmp_val);
+}
+
+int SSMReadNoiseReduction(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_NOISE_REDUCTION_START + offset, 1,
+ &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveDisplayMode(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_DISPLAY_MODE_START + offset, 1, &tmp_val);
+}
+
+int SSMReadDisplayMode(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_DISPLAY_MODE_START + offset, 1,
+ &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveBackLightVal(int offset, int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_BACKLIGHT_START + offset, 1, &tmp_val);
+}
+
+int SSMReadBackLightVal(int offset, int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_BACKLIGHT_START + offset, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveFBCN360BackLightVal(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_FBC_BACKLIGHT_START , 1, &tmp_val);
+}
+
+int SSMReadFBCN360BackLightVal(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_BACKLIGHT_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveFBCN360ColorTempVal(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_FBC_COLORTEMP_START , 1, &tmp_val);
+}
+
+int SSMReadFBCN360ColorTempVal(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_COLORTEMP_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+
+int SSMSaveFBCELECmodeVal(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+ return SSMWriteNTypes(VPP_DATA_POS_FBC_ELECMODE_START , 1, &tmp_val);
+}
+
+int SSMReadFBCELECmodeVal(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_ELECMODE_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+
+int SSMSaveColorDemoMode(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_COLOR_DEMO_MODE_START, 1, &rw_val);
+}
+
+int SSMReadColorDemoMode(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_COLOR_DEMO_MODE_START, 1, rw_val);
+}
+
+int SSMSaveColorBaseMode(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_COLOR_BASE_MODE_START, 1, &rw_val);
+}
+
+int SSMReadColorBaseMode(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_COLOR_BASE_MODE_START, 1, rw_val);
+}
+
+int SSMSaveRGBGainRStart(int offset, unsigned int rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_RGB_GAIN_R_START + offset, 1, &rw_val);
+}
+
+int SSMReadRGBGainRStart(int offset, unsigned int *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_RGB_GAIN_R_START + offset, 1, rw_val);
+}
+
+int SSMSaveRGBGainGStart(int offset, unsigned int rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_RGB_GAIN_G_START + offset, 1, &rw_val);
+}
+
+int SSMReadRGBGainGStart(int offset, unsigned int *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_RGB_GAIN_G_START + offset, 1, rw_val);
+}
+
+int SSMSaveRGBGainBStart(int offset, unsigned int rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_RGB_GAIN_B_START + offset, 1, &rw_val);
+}
+
+int SSMReadRGBGainBStart(int offset, unsigned int *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_RGB_GAIN_B_START + offset, 1, rw_val);
+}
+
+int SSMSaveRGBPostOffsetRStart(int offset, int rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_RGB_POST_OFFSET_R_START + offset, 1,
+ &rw_val);
+}
+
+int SSMReadRGBPostOffsetRStart(int offset, int *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_RGB_POST_OFFSET_R_START + offset, 1,
+ rw_val);
+}
+
+int SSMSaveRGBPostOffsetGStart(int offset, int rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_RGB_POST_OFFSET_G_START + offset, 1,
+ &rw_val);
+}
+
+int SSMReadRGBPostOffsetGStart(int offset, int *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_RGB_POST_OFFSET_G_START + offset, 1,
+ rw_val);
+}
+
+int SSMSaveRGBPostOffsetBStart(int offset, int rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_RGB_POST_OFFSET_B_START + offset, 1,
+ &rw_val);
+}
+
+int SSMReadRGBPostOffsetBStart(int offset, int *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_RGB_POST_OFFSET_B_START + offset, 1,
+ rw_val);
+}
+
+int SSMSaveRGBValueStart(int offset, int8_t rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_RGB_START + offset, 1, &rw_val);
+}
+
+int SSMReadRGBValueStart(int offset, int8_t *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_RGB_START + offset, 1, &rw_val);
+}
+
+int SSMSaveDBCStart(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_DBC_START, 1, &rw_val);
+}
+
+int SSMReadDBCStart(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_DBC_START, 1, rw_val);
+}
+
+int SSMSaveColorSpaceStart(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_COLOR_SPACE_START, 1, &rw_val);
+}
+
+int SSMReadColorSpaceStart(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_COLOR_SPACE_START, 1, rw_val);
+}
+
+int SSMSaveDnlpStart(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_DNLP_START, 1, &rw_val);
+}
+
+int SSMReadDnlpStart(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_DNLP_START, 1, rw_val);
+}
+
+int SSMSavePanoramaStart(int offset, unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_PANORAMA_START + offset, 1, &rw_val);
+}
+
+int SSMReadPanoramaStart(int offset, unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_PANORAMA_START + offset, 1, rw_val);
+}
+
+int SSMSaveTestPattern(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_TEST_PATTERN_START, 1, &rw_val);
+}
+
+int SSMReadTestPattern(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_TEST_PATTERN_START, 1, rw_val);
+}
+
+int SSMSaveAPL(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_APL_START, VPP_DATA_APL_SIZE, &rw_val);
+}
+
+int SSMReadAPL(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_APL_START, VPP_DATA_APL_SIZE, rw_val);
+}
+
+int SSMSaveAPL2(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_APL2_START, VPP_DATA_APL2_SIZE, &rw_val);
+}
+
+int SSMReadAPL2(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_APL2_START, VPP_DATA_APL2_SIZE, rw_val);
+}
+
+int SSMSaveBD(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_BD_START, VPP_DATA_BD_SIZE, &rw_val);
+}
+
+int SSMReadBD(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_BD_START, VPP_DATA_BD_SIZE, rw_val);
+}
+
+int SSMSaveBP(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_BP_START, VPP_DATA_BP_SIZE, &rw_val);
+}
+
+int SSMReadBP(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_BP_START, VPP_DATA_BP_SIZE, rw_val);
+}
+
+int SSMSaveDDRSSC(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_DDR_SSC_START, 1, &rw_val);
+}
+
+int SSMReadDDRSSC(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_DDR_SSC_START, 1, rw_val);
+}
+
+int SSMSaveLVDSSSC(unsigned char *rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_LVDS_SSC_START, 2, rw_val);
+}
+
+int SSMReadLVDSSSC(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_LVDS_SSC_START, 2, rw_val);
+}
+
+int SSMSaveDreamPanel(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_DREAM_PANEL_START, 1, &rw_val);
+}
+
+int SSMReadDreamPanel(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_DREAM_PANEL_START, 1, rw_val);
+}
+
+int SSMSaveUserNatureLightSwitch(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_USER_NATURE_SWITCH_START, 1, &rw_val);
+}
+
+int SSMReadUserNatureLightSwitch(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_USER_NATURE_SWITCH_START, 1, rw_val);
+}
+
+int SSMSaveDBCBacklightEnable(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_DBC_BACKLIGHT_START, 1, &rw_val);
+}
+
+int SSMReadDBCBacklightEnable(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_DBC_BACKLIGHT_START, 1, rw_val);
+}
+
+int SSMSaveDBCBacklightStd(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_DBC_STANDARD_START, 1, &rw_val);
+}
+
+int SSMReadDBCBacklightStd(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_DBC_STANDARD_START, 1, rw_val);
+}
+
+int SSMSaveDBCEnable(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_DBC_ENABLE_START, 1, &rw_val);
+}
+
+int SSMReadDBCEnable(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_DBC_ENABLE_START, 1, rw_val);
+}
+
+int SSMSaveGammaValue(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_GAMMA_VALUE_START, 1, &tmp_val);
+}
+
+int SSMReadGammaValue(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_GAMMA_VALUE_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveBackLightReverse(unsigned char rw_val)
+{
+ return SSMWriteNTypes(VPP_DATA_POS_BACKLIGHT_REVERSE_START, 1, &rw_val);
+}
+
+int SSMReadBackLightReverse(unsigned char *rw_val)
+{
+ return SSMReadNTypes(VPP_DATA_POS_BACKLIGHT_REVERSE_START, 1, rw_val);
+}
+
+int SSMSaveAudioMasterVolume(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_MASTR_VOLUME_VAL, 1, &rw_val);
+}
+
+int SSMReadAudioMasterVolume(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_MASTR_VOLUME_VAL, 1, rw_val);
+}
+
+int SSMSaveAudioBalanceVal(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_BALANCE_VAL, 1, &rw_val);
+}
+
+int SSMReadAudioBalanceVal(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_BALANCE_VAL, 1, rw_val);
+}
+
+int SSMSaveAudioSupperBassVolume(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_SUPPERBASS_VOLUME_VAL, 1, &rw_val);
+}
+
+int SSMReadAudioSupperBassVolume(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_SUPPERBASS_VOLUME_VAL, 1, rw_val);
+}
+
+int SSMSaveAudioSupperBassSwitch(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_SUPPERBASS_SWITCH, 1, &rw_val);
+}
+
+int SSMReadAudioSupperBassSwitch(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_SUPPERBASS_SWITCH, 1, rw_val);
+}
+
+int SSMSaveAudioSRSSurroundSwitch(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_SRS_SURROUND_SWITCH, 1, &rw_val);
+}
+
+int SSMReadAudioSRSSurroundSwitch(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_SRS_SURROUND_SWITCH, 1, rw_val);
+}
+
+int SSMSaveAudioSRSDialogClaritySwitch(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_SRS_DIALOG_CLARITY_SWITCH, 1, &rw_val);
+}
+
+int SSMSaveAudioDbxTvValue(int son_value, int vol_value, int sur_value)
+{
+ int8_t rw_val = son_value;
+ SSMWriteNTypes(SSM_AUD_DBX_TV_SON, 1, &rw_val);
+ rw_val = vol_value;
+ SSMWriteNTypes(SSM_AUD_DBX_TV_VAL, 1, &rw_val);
+ rw_val = sur_value;
+ SSMWriteNTypes(SSM_AUD_DBX_TV_SUR, 1, &rw_val);
+ return 0;
+}
+
+int SSMReadAudioDbxTvValue(int *son_value, int *vol_value, int *sur_value)
+{
+ unsigned char rw_val;
+ SSMReadNTypes(SSM_AUD_DBX_TV_SON, 1, &rw_val);
+ *son_value = rw_val;
+ SSMReadNTypes(SSM_AUD_DBX_TV_VAL, 1, &rw_val);
+ *vol_value = rw_val;
+ SSMReadNTypes(SSM_AUD_DBX_TV_SUR, 1, &rw_val);
+ *sur_value = rw_val;
+ return 0;
+}
+
+int SSMReadAudioSRSDialogClaritySwitch(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_SRS_DIALOG_CLARITY_SWITCH, 1, rw_val);
+}
+
+int SSMSaveAudioSRSTruBassSwitch(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_SRS_TRUEBASS_SWITCH, 1, &rw_val);
+}
+
+int SSMReadAudioSRSTruBassSwitch(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_SRS_TRUEBASS_SWITCH, 1, rw_val);
+}
+
+int SSMSaveAudioBassVolume(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_BASS_VOLUME_VAL, 1, &rw_val);
+}
+
+int SSMReadAudioBassVolume(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_BASS_VOLUME_VAL, 1, rw_val);
+}
+
+int SSMSaveAudioTrebleVolume(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_TREBLE_VOLUME_VAL, 1, &rw_val);
+}
+
+int SSMReadAudioTrebleVolume(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_TREBLE_VOLUME_VAL, 1, rw_val);
+}
+
+int SSMSaveAudioSoundModeVal(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_SOUND_MODE_VAL, 1, &rw_val);
+}
+
+int SSMReadAudioSoundModeVal(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_SOUND_MODE_VAL, 1, rw_val);
+}
+
+int SSMSaveAudioWallEffectSwitch(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_WALL_EFFCT_SWITCH, 1, &rw_val);
+}
+
+int SSMReadAudioWallEffectSwitch(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_WALL_EFFCT_SWITCH, 1, rw_val);
+}
+
+int SSMSaveAudioSPDIFSwitchVal(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_SPDIF_SWITCH, 1, &rw_val);
+}
+
+int SSMReadAudioSPDIFSwitchVal(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_SPDIF_SWITCH, 1, rw_val);
+}
+
+int SSMSaveAudioSPDIFModeVal(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_SPDIF_MODE_VAL, 1, &rw_val);
+}
+
+int SSMReadAudioSPDIFModeVal(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_SPDIF_MODE_VAL, 1, rw_val);
+}
+
+int SSMSaveAudioEQModeVal(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_EQ_MODE_VAL, 1, &rw_val);
+}
+
+int SSMReadAudioEQModeVal(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_EQ_MODE_VAL, 1, rw_val);
+}
+
+int SSMSaveAudioEQGain(int offset, int size, int8_t tmp_buf[])
+{
+ return SSMWriteNTypes(SSM_AUD_EQ_GAIN + offset, size, tmp_buf);
+}
+
+int SSMReadAudioEQGain(int offset, int size, int8_t tmp_buf[])
+{
+ return SSMReadNTypes(SSM_AUD_EQ_GAIN, size, tmp_buf);
+}
+
+int SSMSaveAudioAVOutMuteVal(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_AVOUT_MUTE, 1, &rw_val);
+}
+
+int SSMReadAudioAVOutMuteVal(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_AVOUT_MUTE, 1, rw_val);
+}
+
+int SSMSaveAudioSPIDFMuteVal(int8_t rw_val)
+{
+ return SSMWriteNTypes(SSM_AUD_SPIDF_MUTE, 1, &rw_val);
+}
+
+int SSMReadAudioSPIDFMuteVal(int8_t *rw_val)
+{
+ return SSMReadNTypes(SSM_AUD_SPIDF_MUTE, 1, rw_val);
+}
+int SSMSaveBlackoutEnable(int8_t enable)
+{
+ return SSMWriteNTypes(SSM_RW_BLACKOUT_ENABLE_START, 1, &enable);
+}
+
+int SSMReadBlackoutEnable(int8_t *enable)
+{
+ return SSMReadNTypes(SSM_RW_BLACKOUT_ENABLE_START, 1, enable);
+}
+int SSMSaveFBCN310BackLightVal(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_FBC_N310_BACKLIGHT_START , 1, &tmp_val);
+}
+
+int SSMReadFBCN310BackLightVal(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_N310_BACKLIGHT_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveFBCN310ColorTempVal(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_FBC_N310_COLORTEMP_START , 1, &tmp_val);
+}
+
+int SSMReadFBCN310ColorTempVal(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_N310_COLORTEMP_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveFBCN310LightsensorVal(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_FBC_N310_LIGHTSENSOR_START , 1, &tmp_val);
+}
+
+int SSMReadFBCN310LightsensorVal(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_N310_LIGHTSENSOR_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveFBCN310Dream_PanelVal(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_FBC_N310_DREAMPANEL_START , 1, &tmp_val);
+}
+
+int SSMReadFBCN310Dream_PanelVal(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_N310_DREAMPANEL_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveFBCN310MULT_PQVal(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_FBC_N310_MULTI_PQ_START , 1, &tmp_val);
+}
+
+int SSMReadFBCN310MULT_PQVal(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_N310_MULTI_PQ_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveFBCN310MEMCVal(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_FBC_N310_MEMC_START , 1, &tmp_val);
+}
+
+int SSMReadFBCN310MEMCVal(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_FBC_N310_MEMC_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+
+int SSMSaveN311_VbyOne_Spread_Spectrum_Val(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_N311_VBYONE_SPREAD_SPECTRUM_START , 1, &tmp_val);
+}
+
+int SSMReadN311_VbyOne_Spread_Spectrum_Val(int *rw_val)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_N311_VBYONE_SPREAD_SPECTRUM_START, 1, &tmp_val);
+ *rw_val = tmp_val;
+
+ return tmp_ret;
+}
+int SSMSaveN311_Bluetooth_Vol(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(VPP_DATA_POS_N311_BLUETOOTH_VAL_START , 1, &tmp_val);
+}
+
+int SSMReadN311_Bluetooth_Vol(void)
+{
+ int tmp_ret = 0;
+ unsigned char tmp_val = 0;
+
+ tmp_ret = SSMReadNTypes(VPP_DATA_POS_N311_BLUETOOTH_VAL_START, 1, &tmp_val);
+
+ if (tmp_ret < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+}
+int SSMSave_DRC_ONOFF_Val(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+
+ return SSMWriteNTypes(SSM_AUD_DRC_ONOFF , 1, &tmp_val);
+
+}
+int SSMRead_DRC_ONOFF_Val(void)
+{
+ unsigned char tmp_val = 0;
+ int tmp_ret = 0;
+
+ tmp_ret = SSMReadNTypes(SSM_AUD_DRC_ONOFF, 1, &tmp_val);
+
+ if (tmp_ret < 0) {
+ return 0;
+ }
+
+ return tmp_val;
+
+}
+
+int SSMSave_PANEL_ID_Val(int rw_val)
+{
+ unsigned char tmp_val = rw_val;
+ return SSMWriteNTypes(SSM_RW_PANEL_ID_START , 1, &tmp_val);
+}
+int SSMRead_PANEL_ID_Val(void)
+{
+ unsigned char tmp_val = 0;
+ int tmp_ret = 0;
+ tmp_ret = SSMReadNTypes(SSM_RW_PANEL_ID_START, 1, &tmp_val);
+ if (tmp_ret < 0) {
+ return 0;
+ }
+ return tmp_val;
+}
diff --git a/tvapi/libtv/tvsetting/CTvSetting.h b/tvapi/libtv/tvsetting/CTvSetting.h
index 0cf5086..22a2f9a 100644
--- a/tvapi/libtv/tvsetting/CTvSetting.h
+++ b/tvapi/libtv/tvsetting/CTvSetting.h
@@ -20,6 +20,8 @@ extern "C" {
bool CTvSettingLoad();
bool CTvSettingunLoad();
+int CTvSettingdoSuspend();
+int CTvSettingdoResume();
int MiscSSMRestoreDefault();
int MiscSSMFacRestoreDefault();
int ReservedSSMRestoreDefault();
@@ -194,7 +196,7 @@ int SSMSaveBP(unsigned char rw_val);
int SSMReadBP(unsigned char *rw_val);
int SSMSaveDDRSSC(unsigned char rw_val);
int SSMReadDDRSSC(unsigned char *rw_val);
-int SSMSaveLVDSSSC(unsigned char rw_val);
+int SSMSaveLVDSSSC(unsigned char *rw_val);
int SSMReadLVDSSSC(unsigned char *rw_val);
int SSMSaveDreamPanel(unsigned char rw_val);
int SSMReadDreamPanel(unsigned char *rw_val);
@@ -241,9 +243,35 @@ int SSMSaveAudioEQModeVal(int8_t rw_val);
int SSMReadAudioEQModeVal(int8_t *rw_val);
int SSMSaveAudioEQGain(int offset, int size, int8_t tmp_buf[]);
int SSMReadAudioEQGain(int offset, int size, int8_t tmp_buf[]);
+int SSMSaveAudioDbxTvValue(int son_value, int vol_value, int sur_value);
+int SSMReadAudioDbxTvValue(int *son_value, int *vol_value, int *sur_value);
+int SSMSaveAudioAVOutMuteVal(int8_t rw_val);
+int SSMReadAudioAVOutMuteVal(int8_t *rw_val);
+int SSMSaveAudioSPIDFMuteVal(int8_t rw_val);
+int SSMReadAudioSPIDFMuteVal(int8_t *rw_val);
int SSMSaveBlackoutEnable(int8_t enable);
int SSMReadBlackoutEnable(int8_t *enable);
+int SSMSaveFBCN310BackLightVal(int rw_val);
+int SSMReadFBCN310BackLightVal(int *rw_val);
+int SSMSaveFBCN310ColorTempVal(int rw_val);
+int SSMReadFBCN310ColorTempVal(int *rw_val);
+int SSMSaveFBCN310LightsensorVal(int rw_val);
+int SSMReadFBCN310LightsensorVal(int *rw_val);
+int SSMSaveFBCN310Dream_PanelVal(int rw_val);
+int SSMReadFBCN310Dream_PanelVal(int *rw_val);
+int SSMSaveFBCN310MULT_PQVal(int rw_val);
+int SSMReadFBCN310MULT_PQVal(int *rw_val);
+int SSMSaveFBCN310MEMCVal(int rw_val);
+int SSMReadFBCN310MEMCVal(int *rw_val) ;
+int SSMSaveN311_VbyOne_Spread_Spectrum_Val(int rw_val);
+int SSMReadN311_VbyOne_Spread_Spectrum_Val(int *rw_val);
+int SSMSaveN311_Bluetooth_Vol(int rw_val);
+int SSMReadN311_Bluetooth_Vol(void) ;
+int SSMSave_DRC_ONOFF_Val(int rw_val);
+int SSMRead_DRC_ONOFF_Val(void);
+int SSMSave_PANEL_ID_Val(int rw_val);
+int SSMRead_PANEL_ID_Val(void);
#ifdef __cplusplus
}
#endif
diff --git a/tvapi/libtv/tvsetting/CTvSettingCfg.h b/tvapi/libtv/tvsetting/CTvSettingCfg.h
index 3f1c0ea..09ee7b9 100644
--- a/tvapi/libtv/tvsetting/CTvSettingCfg.h
+++ b/tvapi/libtv/tvsetting/CTvSettingCfg.h
@@ -1,371 +1,411 @@
-#ifndef __TV_SETTING_CFG__H__
-#define __TV_SETTING_CFG__H__
-#include "../tvin/CTvin.h"
-
-//Sections
-static const int SSM_RES0_START = 0;
-static const int SSM_RES0_LEN = 32;
-static const int SSM_CR_START = SSM_RES0_START + SSM_RES0_LEN;
-static const int SSM_CR_LEN = 1536;
-static const int SSM_RW_START = SSM_CR_START + SSM_CR_LEN;
-static const int SSM_RW_LEN = 2048;
-static const int SSM_RES1_START = SSM_RW_START + SSM_RW_LEN;
-static const int SSM_RES1_LEN = 64;
-
-// reserved0 section
-static const int SSM_RSV_W_CHARACTER_CHAR_START = SSM_RES0_START + 0x0A;
-static const int SSM_RSV_W_CHARACTER_CHAR_LEN = 1;
-
-//Read & write section
-static const int SSM_MARK_01_START = SSM_RW_START + 0;
-static const int SSM_MARK_01_LEN = 1;
-
-static const int SSM_RW_AUDIO_START = SSM_MARK_01_START + SSM_MARK_01_LEN;
-static const int SSM_RW_AUDIO_LEN = 192;
-
-static const int SSM_RW_VPP_START = SSM_RW_AUDIO_START + SSM_RW_AUDIO_LEN;
-static const int SSM_RW_VPP_LEN = 230;
-
-static const int SSM_RW_VDIN_START = SSM_RW_VPP_START + SSM_RW_VPP_LEN;
-static const int SSM_RW_VDIN_LEN = 826;
-
-static const int SSM_RW_ATV_START = SSM_RW_VDIN_START + SSM_RW_VDIN_LEN;
-static const int SSM_RW_ATV_LEN = 0;
-
-static const int SSM_RW_MISC_START = SSM_RW_ATV_START + SSM_RW_ATV_LEN;
-static const int SSM_RW_MISC_LEN = 86;
-
-static const int SSM_RW_CUSTOMER_DATA_START = SSM_RW_MISC_START + SSM_RW_MISC_LEN;
-static const int SSM_RW_CUSTOMER_DATA_LEN = 100;
-
-static const int SSM_MARK_02_START = SSM_RW_CUSTOMER_DATA_START + SSM_RW_CUSTOMER_DATA_LEN;
-static const int SSM_MARK_02_LEN = 1;
-
-static const int SSM_RW_TEST_START = SSM_MARK_02_START + SSM_MARK_02_LEN;
-static const int SSM_RW_TEST_LEN = 3;
-
-static const int SSM_MARK_03_START = SSM_RW_TEST_START + SSM_RW_TEST_LEN;
-static const int SSM_MARK_03_LEN = 1;
-
-//Mark r/w values
-static const int SSM_MARK_01_VALUE = 0xDD;
-static const int SSM_MARK_02_VALUE = 0x88;
-static const int SSM_MARK_03_VALUE = 0xCC;
-
-
-//Read & write section(1824 Bytes)
-static const int SSM_RW_AUDIO_END = (SSM_RW_AUDIO_START + SSM_RW_AUDIO_LEN);
-static const int SSM_RW_VPP_END = (SSM_RW_VPP_START + SSM_RW_VPP_LEN);
-static const int SSM_RW_VDIN_END = (SSM_RW_VDIN_START + SSM_RW_VDIN_LEN);
-static const int SSM_RW_ATV_END = (SSM_RW_ATV_START + SSM_RW_ATV_LEN);
-static const int SSM_RW_MISC_END = (SSM_RW_MISC_START + SSM_RW_MISC_LEN);
-
-static const int SSM_CR_END = (SSM_CR_START + SSM_CR_LEN);
-
-//Read & write misc section
-static const int SSM_RW_FBMF_START = (SSM_RW_MISC_START); //Factory Burn Mode Flag
-static const int SSM_RW_FBMF_LEN = (1);
-static const int SSM_RW_DEF_HDCP_START = (SSM_RW_FBMF_START + SSM_RW_FBMF_LEN); //using default hdcp key flag
-static const int SSM_RW_DEF_HDCP_LEN = (1);
-static const int SSM_RW_POWER_CHANNEL_START = (SSM_RW_DEF_HDCP_START + SSM_RW_DEF_HDCP_LEN); //Power on/off channel type
-static const int SSM_RW_POWER_CHANNEL_LEN = (1);
-static const int SSM_RW_LAST_SOURCE_INPUT_START = (SSM_RW_POWER_CHANNEL_START + SSM_RW_POWER_CHANNEL_LEN); //Last tv select input source type
-static const int SSM_RW_LAST_SOURCE_INPUT_LEN = (1);
-static const int SSM_RW_SYS_LANGUAGE_START = (SSM_RW_LAST_SOURCE_INPUT_START + SSM_RW_LAST_SOURCE_INPUT_LEN); //system language
-static const int SSM_RW_SYS_LANGUAGE_LEN = (1);
-static const int SSM_RW_AGING_MODE_START = (SSM_RW_SYS_LANGUAGE_START + SSM_RW_SYS_LANGUAGE_LEN); //aging mode
-static const int SSM_RW_AGING_MODE_LEN = (1);
-static const int SSM_RW_PANEL_TYPE_START = (SSM_RW_AGING_MODE_START + SSM_RW_AGING_MODE_LEN); //panel type
-static const int SSM_RW_PANEL_TYPE_LEN = (1);
-static const int SSM_RW_POWER_ON_MUSIC_SWITCH_START = (SSM_RW_PANEL_TYPE_START + SSM_RW_PANEL_TYPE_LEN); //power on music switch
-static const int SSM_RW_POWER_ON_MUSIC_SWITCH_LEN = (1);
-static const int SSM_RW_POWER_ON_MUSIC_VOL_START = (SSM_RW_POWER_ON_MUSIC_SWITCH_START + SSM_RW_POWER_ON_MUSIC_SWITCH_LEN); //power on music volume
-static const int SSM_RW_POWER_ON_MUSIC_VOL_LEN = (1);
-static const int SSM_RW_SYS_SLEEP_TIMER_START = (SSM_RW_POWER_ON_MUSIC_VOL_START + SSM_RW_POWER_ON_MUSIC_VOL_LEN); //system sleep timer
-static const int SSM_RW_SYS_SLEEP_TIMER_LEN = (4);
-static const int SSM_RW_INPUT_SRC_PARENTAL_CTL_START = (SSM_RW_SYS_SLEEP_TIMER_START + SSM_RW_SYS_SLEEP_TIMER_LEN); //tv input source parental control
-static const int SSM_RW_INPUT_SRC_PARENTAL_CTL_LEN = (4);
-static const int SSM_RW_PARENTAL_CTL_SWITCH_START = (SSM_RW_INPUT_SRC_PARENTAL_CTL_START + SSM_RW_INPUT_SRC_PARENTAL_CTL_LEN); //parental control switch
-static const int SSM_RW_PARENTAL_CTL_SWITCH_LEN = (1);
-static const int SSM_RW_PARENTAL_CTL_PASSWORD_START = (SSM_RW_PARENTAL_CTL_SWITCH_START + SSM_RW_PARENTAL_CTL_SWITCH_LEN); //parental control pass word
-static const int SSM_RW_PARENTAL_CTL_PASSWORD_LEN = (16);
-static const int SSM_RW_SEARCH_NAVIGATE_FLAG_START = (SSM_RW_PARENTAL_CTL_PASSWORD_START + SSM_RW_PARENTAL_CTL_PASSWORD_LEN);
-static const int SSM_RW_SEARCH_NAVIGATE_FLAG_LEN = (1);
-static const int SSM_RW_INPUT_NUMBER_LIMIT_START = (SSM_RW_SEARCH_NAVIGATE_FLAG_START + SSM_RW_SEARCH_NAVIGATE_FLAG_LEN);
-static const int SSM_RW_INPUT_NUMBER_LIMIT_LEN = (1);
-static const int SSM_RW_SERIAL_ONOFF_FLAG_START = (SSM_RW_INPUT_NUMBER_LIMIT_START + SSM_RW_INPUT_NUMBER_LIMIT_LEN);
-static const int SSM_RW_SERIAL_ONOFF_FLAG_LEN = (1);
-static const int SSM_RW_STANDBY_MODE_FLAG_START = (SSM_RW_SERIAL_ONOFF_FLAG_START + SSM_RW_SERIAL_ONOFF_FLAG_LEN);
-static const int SSM_RW_STANDBY_MODE_FLAG_LEN = (1);
-static const int SSM_RW_HDMIEQ_MODE_START = (SSM_RW_STANDBY_MODE_FLAG_START + SSM_RW_STANDBY_MODE_FLAG_LEN);
-static const int SSM_RW_HDMIEQ_MODE_LEN = (1);
-static const int SSM_RW_LOGO_ON_OFF_FLAG_START = (SSM_RW_HDMIEQ_MODE_START + SSM_RW_HDMIEQ_MODE_LEN);
-static const int SSM_RW_LOGO_ON_OFF_FLAG_LEN = (1);
-static const int SSM_RW_HDMIINTERNAL_MODE_START = (SSM_RW_LOGO_ON_OFF_FLAG_START + SSM_RW_LOGO_ON_OFF_FLAG_LEN);
-static const int SSM_RW_HDMIINTERNAL_MODE_LEN = (4);
-static const int SSM_RW_DISABLE_3D_START = (SSM_RW_HDMIINTERNAL_MODE_START + SSM_RW_HDMIINTERNAL_MODE_LEN);
-static const int SSM_RW_DISABLE_3D_LEN = (1);
-static const int SSM_RW_GLOBAL_OGO_ENABLE_START = (SSM_RW_DISABLE_3D_START + SSM_RW_DISABLE_3D_LEN);
-static const int SSM_RW_GLOBAL_OGO_ENABLE_LEN = (1);
-static const int SSM_RW_LOCAL_DIMING_START = (SSM_RW_GLOBAL_OGO_ENABLE_START + SSM_RW_GLOBAL_OGO_ENABLE_LEN);
-static const int SSM_RW_LOCAL_DIMING_LEN = (1);
-static const int SSM_RW_VDAC_2D_START = (SSM_RW_LOCAL_DIMING_START + SSM_RW_LOCAL_DIMING_LEN);
-static const int SSM_RW_VDAC_2D_LEN = (2);
-static const int SSM_RW_VDAC_3D_START = (SSM_RW_VDAC_2D_START + SSM_RW_VDAC_2D_LEN);
-static const int SSM_RW_VDAC_3D_LEN = (2);
-
-static const int SSM_RW_NON_STANDARD_START = (SSM_RW_VDAC_3D_START + SSM_RW_VDAC_3D_LEN);
-static const int SSM_RW_NON_STANDARD_LEN = (2);
-static const int SSM_RW_ADB_SWITCH_START = (SSM_RW_NON_STANDARD_START + SSM_RW_NON_STANDARD_LEN);
-static const int SSM_RW_ADB_SWITCH_LEN = (1);
-static const int SSM_RW_SERIAL_CMD_SWITCH_START = (SSM_RW_ADB_SWITCH_START + SSM_RW_ADB_SWITCH_LEN);
-static const int SSM_RW_SERIAL_CMD_SWITCH_LEN = (1);
-
-static const int SSM_RW_CA_BUFFER_SIZE_START = (SSM_RW_SERIAL_CMD_SWITCH_START + SSM_RW_SERIAL_CMD_SWITCH_LEN);
-static const int SSM_RW_CA_BUFFER_SIZE_LEN = (2);
-
-static const int SSM_RW_NOISE_GATE_THRESHOLD_START = (SSM_RW_CA_BUFFER_SIZE_START + SSM_RW_CA_BUFFER_SIZE_LEN);
-static const int SSM_RW_NOISE_GATE_THRESHOLD_LEN = (1);
-
-static const int SSM_RW_DTV_TYPE_START = (SSM_RW_NOISE_GATE_THRESHOLD_START + SSM_RW_NOISE_GATE_THRESHOLD_LEN);
-static const int SSM_RW_DTV_TYPE_LEN = (1);
-
-static const int SSM_RW_UI_GRHPHY_BACKLIGHT_START = (SSM_RW_DTV_TYPE_START + SSM_RW_DTV_TYPE_LEN);
-static const int SSM_RW_UI_GRHPHY_BACKLIGHT_LEN = (1);
-
-static const int SSM_RW_FASTSUSPEND_FLAG_START = (SSM_RW_UI_GRHPHY_BACKLIGHT_START + SSM_RW_UI_GRHPHY_BACKLIGHT_LEN);
-static const int SSM_RW_FASTSUSPEND_FLAG_LEN = (1);
-
-static const int SSM_RW_BLACKOUT_ENABLE_START = (SSM_RW_FASTSUSPEND_FLAG_START + SSM_RW_FASTSUSPEND_FLAG_LEN);
-static const int SSM_RW_BLACKOUT_ENABLE__LEN = (1);
-
-//Audio data section
-static const int SSM_AUD_MASTR_VOLUME_VAL = (SSM_RW_AUDIO_START + 0);
-static const int SSM_AUD_BALANCE_VAL = (SSM_AUD_MASTR_VOLUME_VAL + 1);
-static const int SSM_AUD_SUPPERBASS_VOLUME_VAL = (SSM_AUD_BALANCE_VAL + 1);
-static const int SSM_AUD_SUPPERBASS_SWITCH = (SSM_AUD_SUPPERBASS_VOLUME_VAL + 1);
-static const int SSM_AUD_SRS_SURROUND_SWITCH = (SSM_AUD_SUPPERBASS_SWITCH + 1);
-static const int SSM_AUD_SRS_DIALOG_CLARITY_SWITCH = (SSM_AUD_SRS_SURROUND_SWITCH + 1);
-static const int SSM_AUD_SRS_TRUEBASS_SWITCH = (SSM_AUD_SRS_DIALOG_CLARITY_SWITCH + 1);
-static const int SSM_AUD_BASS_VOLUME_VAL = (SSM_AUD_SRS_TRUEBASS_SWITCH + 1);
-static const int SSM_AUD_TREBLE_VOLUME_VAL = (SSM_AUD_BASS_VOLUME_VAL + 1);
-static const int SSM_AUD_SOUND_MODE_VAL = (SSM_AUD_TREBLE_VOLUME_VAL + 1);
-static const int SSM_AUD_WALL_EFFCT_SWITCH = (SSM_AUD_SOUND_MODE_VAL + 1);
-static const int SSM_AUD_SPDIF_SWITCH = (SSM_AUD_WALL_EFFCT_SWITCH + 1);
-static const int SSM_AUD_SPDIF_MODE_VAL = (SSM_AUD_SPDIF_SWITCH + 1);
-static const int SSM_AUD_EQ_MODE_VAL = (SSM_RW_AUDIO_START + 32);
-static const int SSM_AUD_EQ_GAIN = (SSM_AUD_EQ_MODE_VAL + 1);
-static const int SSM_AUD_NOLINE_POINTS = (SSM_AUD_EQ_GAIN + 16);
-
-//VPP Data (115 bytes)
-//ColorDemoMode 1byte
-static const int VPP_DATA_POS_COLOR_DEMO_MODE_START = (SSM_RW_VPP_START + 0);
-static const int VPP_DATA_POS_COLOR_DEMO_MODE_SIZE = (1);
-static const int VPP_DATA_POS_COLOR_DEMO_MODE_END = (VPP_DATA_POS_COLOR_DEMO_MODE_START + VPP_DATA_POS_COLOR_DEMO_MODE_SIZE);
-//ColorBaseMode 1byte
-static const int VPP_DATA_POS_COLOR_BASE_MODE_START = (VPP_DATA_POS_COLOR_DEMO_MODE_END + 0);
-static const int VPP_DATA_POS_COLOR_BASE_MODE_SIZE = (1);
-static const int VPP_DATA_POS_COLOR_BASE_MODE_END = (VPP_DATA_POS_COLOR_BASE_MODE_START + VPP_DATA_POS_COLOR_BASE_MODE_SIZE);
-//TestPattern 1byte
-static const int VPP_DATA_POS_TEST_PATTERN_START = (VPP_DATA_POS_COLOR_BASE_MODE_END + 0);
-static const int VPP_DATA_POS_TEST_PATTERN_SIZE = (1);
-static const int VPP_DATA_POS_TEST_PATTERN_END = (VPP_DATA_POS_TEST_PATTERN_START + VPP_DATA_POS_TEST_PATTERN_SIZE);
-//DDR SSC 1byte
-static const int VPP_DATA_POS_DDR_SSC_START = (VPP_DATA_POS_TEST_PATTERN_END + 0);
-static const int VPP_DATA_POS_DDR_SSC_SIZE = (1);
-static const int VPP_DATA_POS_DDR_SSC_END = (VPP_DATA_POS_DDR_SSC_START + VPP_DATA_POS_DDR_SSC_SIZE);
-//LVDS SSC 1byte
-static const int VPP_DATA_POS_LVDS_SSC_START = (VPP_DATA_POS_DDR_SSC_END + 0);
-static const int VPP_DATA_POS_LVDS_SSC_SIZE = (1);
-static const int VPP_DATA_POS_LVDS_SSC_END = (VPP_DATA_POS_LVDS_SSC_START + VPP_DATA_POS_LVDS_SSC_SIZE);
-//dream panel 1byte
-static const int VPP_DATA_POS_DREAM_PANEL_START = (VPP_DATA_POS_LVDS_SSC_END + 0);
-static const int VPP_DATA_POS_DREAM_PANEL_SIZE = (1);
-static const int VPP_DATA_POS_DREAM_PANEL_END = (VPP_DATA_POS_DREAM_PANEL_START + VPP_DATA_POS_DREAM_PANEL_SIZE);
-//Backlight reverse 1byte
-static const int VPP_DATA_POS_BACKLIGHT_REVERSE_START = (VPP_DATA_POS_DREAM_PANEL_END + 0);
-static const int VPP_DATA_POS_BACKLIGHT_REVERSE_SIZE = (1);
-static const int VPP_DATA_POS_BACKLIGHT_REVERSE_END = (VPP_DATA_POS_BACKLIGHT_REVERSE_START + VPP_DATA_POS_BACKLIGHT_REVERSE_SIZE);
-//Brightness 1*7=7byte
-static const int VPP_DATA_POS_BRIGHTNESS_START = (VPP_DATA_POS_BACKLIGHT_REVERSE_END + 0);
-static const int VPP_DATA_POS_BRIGHTNESS_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_BRIGHTNESS_END = (VPP_DATA_POS_BRIGHTNESS_START + VPP_DATA_POS_BRIGHTNESS_SIZE);
-//Contrast 1*7=7byte
-static const int VPP_DATA_POS_CONTRAST_START = (VPP_DATA_POS_BRIGHTNESS_END + 0);
-static const int VPP_DATA_POS_CONTRAST_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_CONTRAST_END = (VPP_DATA_POS_CONTRAST_START + VPP_DATA_POS_CONTRAST_SIZE);
-//Saturation 1*7=7byte
-static const int VPP_DATA_POS_SATURATION_START = (VPP_DATA_POS_CONTRAST_END + 0);
-static const int VPP_DATA_POS_SATURATION_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_SATURATION_END = (VPP_DATA_POS_SATURATION_START + VPP_DATA_POS_SATURATION_SIZE);
-//Hue 1*7=7byte
-static const int VPP_DATA_POS_HUE_START = (VPP_DATA_POS_SATURATION_END + 0);
-static const int VPP_DATA_POS_HUE_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_HUE_END = (VPP_DATA_POS_HUE_START + VPP_DATA_POS_HUE_SIZE);
-//Sharpness 1*7=7byte
-static const int VPP_DATA_POS_SHARPNESS_START = (VPP_DATA_POS_HUE_END + 0);
-static const int VPP_DATA_POS_SHARPNESS_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_SHARPNESS_END = (VPP_DATA_POS_SHARPNESS_START + VPP_DATA_POS_SHARPNESS_SIZE);
-//ColorTemperature 1*7=7byte
-static const int VPP_DATA_POS_COLOR_TEMP_START = (VPP_DATA_POS_SHARPNESS_END + 0);
-static const int VPP_DATA_POS_COLOR_TEMP_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_COLOR_TEMP_END = (VPP_DATA_POS_COLOR_TEMP_START + VPP_DATA_POS_COLOR_TEMP_SIZE);
-//NoiseReduction 1*7=7byte
-static const int VPP_DATA_POS_NOISE_REDUCTION_START = (VPP_DATA_POS_COLOR_TEMP_END + 0);
-static const int VPP_DATA_POS_NOISE_REDUCTION_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_NOISE_REDUCTION_END = (VPP_DATA_POS_NOISE_REDUCTION_START + VPP_DATA_POS_NOISE_REDUCTION_SIZE);
-//SceneMode 1byte
-static const int VPP_DATA_POS_SCENE_MODE_START = (VPP_DATA_POS_NOISE_REDUCTION_END + 0);
-static const int VPP_DATA_POS_SCENE_MODE_SIZE = (1);
-static const int VPP_DATA_POS_SCENE_MODE_END = (VPP_DATA_POS_SCENE_MODE_START + VPP_DATA_POS_SCENE_MODE_SIZE);
-//PictureMode 1*7=7byte
-static const int VPP_DATA_POS_PICTURE_MODE_START = (VPP_DATA_POS_SCENE_MODE_END + 0);
-static const int VPP_DATA_POS_PICTURE_MODE_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_PICTURE_MODE_END = (VPP_DATA_POS_PICTURE_MODE_START + VPP_DATA_POS_PICTURE_MODE_SIZE);
-//DisplayMode 1*7=7byte
-static const int VPP_DATA_POS_DISPLAY_MODE_START = (VPP_DATA_POS_PICTURE_MODE_END + 0);
-static const int VPP_DATA_POS_DISPLAY_MODE_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_DISPLAY_MODE_END = (VPP_DATA_POS_DISPLAY_MODE_START + VPP_DATA_POS_DISPLAY_MODE_SIZE);
-//Backlight 1*7=7byte
-static const int VPP_DATA_POS_BACKLIGHT_START = (VPP_DATA_POS_DISPLAY_MODE_END + 0);
-static const int VPP_DATA_POS_BACKLIGHT_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_BACKLIGHT_END = (VPP_DATA_POS_BACKLIGHT_START + VPP_DATA_POS_BACKLIGHT_SIZE);
-//RGB_Gain_R 4byte
-static const int VPP_DATA_POS_RGB_GAIN_R_START = (VPP_DATA_POS_BACKLIGHT_END + 0);
-static const int VPP_DATA_POS_RGB_GAIN_R_SIZE = (sizeof(int));
-static const int VPP_DATA_POS_RGB_GAIN_R_END = (VPP_DATA_POS_RGB_GAIN_R_START + VPP_DATA_POS_RGB_GAIN_R_SIZE);
-//RGB_Gain_G 4byte
-static const int VPP_DATA_POS_RGB_GAIN_G_START = (VPP_DATA_POS_RGB_GAIN_R_END + 0);
-static const int VPP_DATA_POS_RGB_GAIN_G_SIZE = (sizeof(int));
-static const int VPP_DATA_POS_RGB_GAIN_G_END = (VPP_DATA_POS_RGB_GAIN_G_START + VPP_DATA_POS_RGB_GAIN_G_SIZE);
-//RGB_Gain_B 4byte
-static const int VPP_DATA_POS_RGB_GAIN_B_START = (VPP_DATA_POS_RGB_GAIN_G_END + 0);
-static const int VPP_DATA_POS_RGB_GAIN_B_SIZE = (sizeof(int));
-static const int VPP_DATA_POS_RGB_GAIN_B_END = (VPP_DATA_POS_RGB_GAIN_B_START + VPP_DATA_POS_RGB_GAIN_B_SIZE);
-//RGB_Post_Offset_R 4byte
-static const int VPP_DATA_POS_RGB_POST_OFFSET_R_START = (VPP_DATA_POS_RGB_GAIN_B_END + 0);
-static const int VPP_DATA_POS_RGB_POST_OFFSET_R_SIZE = (sizeof(int));
-static const int VPP_DATA_POS_RGB_POST_OFFSET_R_END = (VPP_DATA_POS_RGB_POST_OFFSET_R_START + VPP_DATA_POS_RGB_POST_OFFSET_R_SIZE);
-//RGB_Post_Offset_G 4byte
-static const int VPP_DATA_POS_RGB_POST_OFFSET_G_START = (VPP_DATA_POS_RGB_POST_OFFSET_R_END + 0);
-static const int VPP_DATA_POS_RGB_POST_OFFSET_G_SIZE = (sizeof(int));
-static const int VPP_DATA_POS_RGB_POST_OFFSET_G_END = (VPP_DATA_POS_RGB_POST_OFFSET_G_START + VPP_DATA_POS_RGB_POST_OFFSET_G_SIZE);
-//RGB_Post_Offset_B 4byte
-static const int VPP_DATA_POS_RGB_POST_OFFSET_B_START = (VPP_DATA_POS_RGB_POST_OFFSET_G_END + 0);
-static const int VPP_DATA_POS_RGB_POST_OFFSET_B_SIZE = (sizeof(int));
-static const int VPP_DATA_POS_RGB_POST_OFFSET_B_END = (VPP_DATA_POS_RGB_POST_OFFSET_B_START + VPP_DATA_POS_RGB_POST_OFFSET_B_SIZE);
-//dbc_Enable 1byte
-static const int VPP_DATA_POS_DBC_START = (VPP_DATA_POS_RGB_POST_OFFSET_B_END + 0);
-static const int VPP_DATA_POS_DBC_SIZE = (1);
-static const int VPP_DATA_POS_DBC_END = (VPP_DATA_POS_DBC_START + VPP_DATA_POS_DBC_SIZE);
-//project id 1byte
-static const int VPP_DATA_PROJECT_ID_START = (VPP_DATA_POS_DBC_END + 0);
-static const int VPP_DATA_PROJECT_ID_SIZE = (1);
-static const int VPP_DATA_PROJECT_ID_END = (VPP_DATA_PROJECT_ID_START + VPP_DATA_PROJECT_ID_SIZE);
-//dnlp 1byte
-static const int VPP_DATA_POS_DNLP_START = (VPP_DATA_PROJECT_ID_END + 0);
-static const int VPP_DATA_POS_DNLP_SIZE = (1);
-static const int VPP_DATA_POS_DNLP_END = (VPP_DATA_POS_DNLP_START + VPP_DATA_POS_DNLP_SIZE);
-//panorama 1*7 = 7byte
-static const int VPP_DATA_POS_PANORAMA_START = (VPP_DATA_POS_DNLP_END + 0);
-static const int VPP_DATA_POS_PANORAMA_SIZE = (1 * (SOURCE_TYPE_MAX));
-static const int VPP_DATA_POS_PANORAMA_END = (VPP_DATA_POS_PANORAMA_START + VPP_DATA_POS_PANORAMA_SIZE);
-//APL 1 byte
-static const int VPP_DATA_APL_START = (VPP_DATA_POS_PANORAMA_END + 0);
-static const int VPP_DATA_APL_SIZE = (1);
-static const int VPP_DATA_APL_END = (VPP_DATA_APL_START + VPP_DATA_APL_SIZE);
-//APL2 1 byte
-static const int VPP_DATA_APL2_START = (VPP_DATA_APL_END + 0);
-static const int VPP_DATA_APL2_SIZE = (1);
-static const int VPP_DATA_APL2_END = (VPP_DATA_APL2_START + VPP_DATA_APL2_SIZE);
-//BD 1 byte
-static const int VPP_DATA_BD_START = (VPP_DATA_APL2_END + 0);
-static const int VPP_DATA_BD_SIZE = (1);
-static const int VPP_DATA_BD_END = (VPP_DATA_BD_START + VPP_DATA_BD_SIZE);
-//BP 1 byte
-static const int VPP_DATA_BP_START = (VPP_DATA_BD_END + 0);
-static const int VPP_DATA_BP_SIZE = (1);
-static const int VPP_DATA_BP_END = (VPP_DATA_BP_START + VPP_DATA_BP_SIZE);
-
-//Factory RGB 3*6 = 18byte
-static const int VPP_DATA_RGB_START = (VPP_DATA_BP_END + 0);
-static const int VPP_DATA_RGB_SIZE = (18);
-static const int VPP_DATA_RGB_END = (VPP_DATA_RGB_START + VPP_DATA_RGB_SIZE);
-
-//COLOR_SPACE 1 byte
-static const int VPP_DATA_COLOR_SPACE_START = (VPP_DATA_RGB_END + 0);
-static const int VPP_DATA_COLOR_SPACE_SIZE = (1);
-static const int VPP_DATA_COLOR_SPACE_END = (VPP_DATA_COLOR_SPACE_START + VPP_DATA_COLOR_SPACE_SIZE);
-
-static const int VPP_DATA_USER_NATURE_SWITCH_START = (VPP_DATA_COLOR_SPACE_END + 0);
-static const int VPP_DATA_USER_NATURE_SWITCH_SIZE = (1);
-static const int VPP_DATA_USER_NATURE_SWITCH_END = (VPP_DATA_USER_NATURE_SWITCH_START + VPP_DATA_USER_NATURE_SWITCH_SIZE);
-
-//gamma value 1 byte
-static const int VPP_DATA_GAMMA_VALUE_START = (VPP_DATA_USER_NATURE_SWITCH_END + 0);
-static const int VPP_DATA_GAMMA_VALUE_SIZE = (1);
-static const int VPP_DATA_GAMMA_VALUE_END = (VPP_DATA_GAMMA_VALUE_START + VPP_DATA_GAMMA_VALUE_SIZE);
-
-//dbc backlight enable 1byte
-static const int VPP_DATA_DBC_BACKLIGHT_START = (VPP_DATA_GAMMA_VALUE_END + 0);
-static const int VPP_DATA_DBC_BACKLIGHT_SIZE = (1);
-static const int VPP_DATA_DBC_BACKLIGHT_END = (VPP_DATA_DBC_BACKLIGHT_START + VPP_DATA_DBC_BACKLIGHT_SIZE);
-//dbc backlight standard 1byte
-static const int VPP_DATA_DBC_STANDARD_START = (VPP_DATA_DBC_BACKLIGHT_END + 0);
-static const int VPP_DATA_DBC_STANDARD_SIZE = (1);
-static const int VPP_DATA_DBC_STANDARD_END = (VPP_DATA_DBC_STANDARD_START + VPP_DATA_DBC_STANDARD_SIZE);
-//dbc backlight enable 1byte
-static const int VPP_DATA_DBC_ENABLE_START = (VPP_DATA_DBC_STANDARD_END + 0);
-static const int VPP_DATA_DBC_ENABLE_SIZE = (1);
-static const int VPP_DATA_DBC_ENABLE_END = (VPP_DATA_DBC_ENABLE_START + VPP_DATA_DBC_ENABLE_SIZE);
-
-//fbc Backlight 1 byte
-static const int VPP_DATA_POS_FBC_BACKLIGHT_START = (VPP_DATA_DBC_ENABLE_END + 0);
-static const int VPP_DATA_POS_FBC_BACKLIGHT_SIZE = (1);
-static const int VPP_DATA_POS_FBC_BACKLIGHT_END = (VPP_DATA_POS_FBC_BACKLIGHT_START + VPP_DATA_POS_FBC_BACKLIGHT_SIZE);
-//fbc Elecmode 1 byte
-static const int VPP_DATA_POS_FBC_ELECMODE_START = (VPP_DATA_POS_FBC_BACKLIGHT_END + 0);
-static const int VPP_DATA_POS_FBC_ELECMODE_SIZE = (1);
-static const int VPP_DATA_POS_FBC_ELECMODE_END = (VPP_DATA_POS_FBC_ELECMODE_START + VPP_DATA_POS_FBC_ELECMODE_SIZE);
-//fbc colortemp 1 byte
-static const int VPP_DATA_POS_FBC_COLORTEMP_START = (VPP_DATA_POS_FBC_ELECMODE_END + 0);
-static const int VPP_DATA_POS_FBC_COLORTEMP_SIZE = (1);
-static const int VPP_DATA_POS_FBC_COLORTEMP_END = (VPP_DATA_POS_FBC_COLORTEMP_START + VPP_DATA_POS_FBC_COLORTEMP_SIZE);
-
-
-//Tvin data section (581 bytes)
-//SourceInput 1byte
-static const int TVIN_DATA_POS_SOURCE_INPUT_START = (SSM_RW_VDIN_START + 0);
-static const int TVIN_DATA_POS_SOURCE_INPUT_SIZE = (1);
-static const int TVIN_DATA_POS_SOURCE_INPUT_END = (TVIN_DATA_POS_SOURCE_INPUT_START + TVIN_DATA_POS_SOURCE_INPUT_SIZE);
-//CVBS Std 1byte
-static const int TVIN_DATA_CVBS_STD_START = (TVIN_DATA_POS_SOURCE_INPUT_END + 0);
-static const int TVIN_DATA_CVBS_STD_SIZE = (1);
-static const int TVIN_DATA_CVBS_STD_END = (TVIN_DATA_CVBS_STD_START + TVIN_DATA_CVBS_STD_SIZE);
-//3DMode 1byte
-static const int TVIN_DATA_POS_3D_MODE_START = (TVIN_DATA_CVBS_STD_END + 0);
-static const int TVIN_DATA_POS_3D_MODE_SIZE = (1);
-static const int TVIN_DATA_POS_3D_MODE_END = (TVIN_DATA_POS_3D_MODE_START + TVIN_DATA_POS_3D_MODE_SIZE);
-//3DLRSwitch 1byte
-static const int TVIN_DATA_POS_3D_LRSWITCH_START = (TVIN_DATA_POS_3D_MODE_END + 0);
-static const int TVIN_DATA_POS_3D_LRSWITCH_SIZE = (1);
-static const int TVIN_DATA_POS_3D_LRSWITCH_END = (TVIN_DATA_POS_3D_LRSWITCH_START + TVIN_DATA_POS_3D_LRSWITCH_SIZE);
-//3DDepth 1byte
-static const int TVIN_DATA_POS_3D_DEPTH_START = (TVIN_DATA_POS_3D_LRSWITCH_END + 0);
-static const int TVIN_DATA_POS_3D_DEPTH_SIZE = (1);
-static const int TVIN_DATA_POS_3D_DEPTH_END = (TVIN_DATA_POS_3D_DEPTH_START + TVIN_DATA_POS_3D_DEPTH_SIZE);
-//3DTo2D 1byte
-static const int TVIN_DATA_POS_3D_TO2D_START = (TVIN_DATA_POS_3D_DEPTH_END + 0);
-static const int TVIN_DATA_POS_3D_TO2D_SIZE = (1);
-static const int TVIN_DATA_POS_3D_TO2D_END = (TVIN_DATA_POS_3D_TO2D_START + TVIN_DATA_POS_3D_TO2D_SIZE);
-//3DTo2DNEW 1byte
-static const int TVIN_DATA_POS_3D_TO2DNEW_START = (TVIN_DATA_POS_3D_TO2D_END + 0);
-static const int TVIN_DATA_POS_3D_TO2DNEW_SIZE = (1);
-static const int TVIN_DATA_POS_3D_TO2DNEW_END = (TVIN_DATA_POS_3D_TO2DNEW_START + TVIN_DATA_POS_3D_TO2DNEW_SIZE);
-
-static const int CHKSUM_PROJECT_ID_OFFSET = (SSM_RES0_START + 0);
-static const int CHKSUM_MAC_ADDRESS_OFFSET = (SSM_RES0_START + 2);
-static const int CHKSUM_HDCP_KEY_OFFSET = (SSM_RES0_START + 4);
-static const int CHKSUM_BARCODE_OFFSET = (SSM_RES0_START + 6);
-
-#endif
+#ifndef __TV_SETTING_CFG__H__
+#define __TV_SETTING_CFG__H__
+#include "../tvin/CTvin.h"
+
+//Sections
+static const int SSM_RES0_START = 0;
+static const int SSM_RES0_LEN = 32;
+static const int SSM_CR_START = SSM_RES0_START + SSM_RES0_LEN;
+static const int SSM_CR_LEN = 1536;
+static const int SSM_RW_START = SSM_CR_START + SSM_CR_LEN;
+static const int SSM_RW_LEN = 2048;
+static const int SSM_RES1_START = SSM_RW_START + SSM_RW_LEN;
+static const int SSM_RES1_LEN = 64;
+
+// reserved0 section
+static const int SSM_RSV_W_CHARACTER_CHAR_START = SSM_RES0_START + 0x0A;
+static const int SSM_RSV_W_CHARACTER_CHAR_LEN = 1;
+
+//Read & write section
+static const int SSM_MARK_01_START = SSM_RW_START + 0;
+static const int SSM_MARK_01_LEN = 1;
+
+static const int SSM_RW_AUDIO_START = SSM_MARK_01_START + SSM_MARK_01_LEN;
+static const int SSM_RW_AUDIO_LEN = 192;
+
+static const int SSM_RW_VPP_START = SSM_RW_AUDIO_START + SSM_RW_AUDIO_LEN;
+static const int SSM_RW_VPP_LEN = 230;
+
+static const int SSM_RW_VDIN_START = SSM_RW_VPP_START + SSM_RW_VPP_LEN;
+static const int SSM_RW_VDIN_LEN = 826;
+
+static const int SSM_RW_ATV_START = SSM_RW_VDIN_START + SSM_RW_VDIN_LEN;
+static const int SSM_RW_ATV_LEN = 0;
+
+static const int SSM_RW_MISC_START = SSM_RW_ATV_START + SSM_RW_ATV_LEN;
+static const int SSM_RW_MISC_LEN = 86;
+
+static const int SSM_RW_CUSTOMER_DATA_START = SSM_RW_MISC_START + SSM_RW_MISC_LEN;
+static const int SSM_RW_CUSTOMER_DATA_LEN = 100;
+
+static const int SSM_MARK_02_START = SSM_RW_CUSTOMER_DATA_START + SSM_RW_CUSTOMER_DATA_LEN;
+static const int SSM_MARK_02_LEN = 1;
+
+static const int SSM_RW_TEST_START = SSM_MARK_02_START + SSM_MARK_02_LEN;
+static const int SSM_RW_TEST_LEN = 3;
+
+static const int SSM_MARK_03_START = SSM_RW_TEST_START + SSM_RW_TEST_LEN;
+static const int SSM_MARK_03_LEN = 1;
+
+//Mark r/w values
+static const int SSM_MARK_01_VALUE = 0xDD;
+static const int SSM_MARK_02_VALUE = 0x88;
+static const int SSM_MARK_03_VALUE = 0xCC;
+
+
+//Read & write section(1824 Bytes)
+static const int SSM_RW_AUDIO_END = (SSM_RW_AUDIO_START + SSM_RW_AUDIO_LEN);
+static const int SSM_RW_VPP_END = (SSM_RW_VPP_START + SSM_RW_VPP_LEN);
+static const int SSM_RW_VDIN_END = (SSM_RW_VDIN_START + SSM_RW_VDIN_LEN);
+static const int SSM_RW_ATV_END = (SSM_RW_ATV_START + SSM_RW_ATV_LEN);
+static const int SSM_RW_MISC_END = (SSM_RW_MISC_START + SSM_RW_MISC_LEN);
+
+static const int SSM_CR_END = (SSM_CR_START + SSM_CR_LEN);
+
+//Read & write misc section
+static const int SSM_RW_FBMF_START = (SSM_RW_MISC_START); //Factory Burn Mode Flag
+static const int SSM_RW_FBMF_LEN = (1);
+static const int SSM_RW_DEF_HDCP_START = (SSM_RW_FBMF_START + SSM_RW_FBMF_LEN); //using default hdcp key flag
+static const int SSM_RW_DEF_HDCP_LEN = (1);
+static const int SSM_RW_POWER_CHANNEL_START = (SSM_RW_DEF_HDCP_START + SSM_RW_DEF_HDCP_LEN); //Power on/off channel type
+static const int SSM_RW_POWER_CHANNEL_LEN = (1);
+static const int SSM_RW_LAST_SOURCE_INPUT_START = (SSM_RW_POWER_CHANNEL_START + SSM_RW_POWER_CHANNEL_LEN); //Last tv select input source type
+static const int SSM_RW_LAST_SOURCE_INPUT_LEN = (1);
+static const int SSM_RW_SYS_LANGUAGE_START = (SSM_RW_LAST_SOURCE_INPUT_START + SSM_RW_LAST_SOURCE_INPUT_LEN); //system language
+static const int SSM_RW_SYS_LANGUAGE_LEN = (1);
+static const int SSM_RW_AGING_MODE_START = (SSM_RW_SYS_LANGUAGE_START + SSM_RW_SYS_LANGUAGE_LEN); //aging mode
+static const int SSM_RW_AGING_MODE_LEN = (1);
+static const int SSM_RW_PANEL_TYPE_START = (SSM_RW_AGING_MODE_START + SSM_RW_AGING_MODE_LEN); //panel type
+static const int SSM_RW_PANEL_TYPE_LEN = (1);
+static const int SSM_RW_POWER_ON_MUSIC_SWITCH_START = (SSM_RW_PANEL_TYPE_START + SSM_RW_PANEL_TYPE_LEN); //power on music switch
+static const int SSM_RW_POWER_ON_MUSIC_SWITCH_LEN = (1);
+static const int SSM_RW_POWER_ON_MUSIC_VOL_START = (SSM_RW_POWER_ON_MUSIC_SWITCH_START + SSM_RW_POWER_ON_MUSIC_SWITCH_LEN); //power on music volume
+static const int SSM_RW_POWER_ON_MUSIC_VOL_LEN = (1);
+static const int SSM_RW_SYS_SLEEP_TIMER_START = (SSM_RW_POWER_ON_MUSIC_VOL_START + SSM_RW_POWER_ON_MUSIC_VOL_LEN); //system sleep timer
+static const int SSM_RW_SYS_SLEEP_TIMER_LEN = (4);
+static const int SSM_RW_INPUT_SRC_PARENTAL_CTL_START = (SSM_RW_SYS_SLEEP_TIMER_START + SSM_RW_SYS_SLEEP_TIMER_LEN); //tv input source parental control
+static const int SSM_RW_INPUT_SRC_PARENTAL_CTL_LEN = (4);
+static const int SSM_RW_PARENTAL_CTL_SWITCH_START = (SSM_RW_INPUT_SRC_PARENTAL_CTL_START + SSM_RW_INPUT_SRC_PARENTAL_CTL_LEN); //parental control switch
+static const int SSM_RW_PARENTAL_CTL_SWITCH_LEN = (1);
+static const int SSM_RW_PARENTAL_CTL_PASSWORD_START = (SSM_RW_PARENTAL_CTL_SWITCH_START + SSM_RW_PARENTAL_CTL_SWITCH_LEN); //parental control pass word
+static const int SSM_RW_PARENTAL_CTL_PASSWORD_LEN = (16);
+static const int SSM_RW_SEARCH_NAVIGATE_FLAG_START = (SSM_RW_PARENTAL_CTL_PASSWORD_START + SSM_RW_PARENTAL_CTL_PASSWORD_LEN);
+static const int SSM_RW_SEARCH_NAVIGATE_FLAG_LEN = (1);
+static const int SSM_RW_INPUT_NUMBER_LIMIT_START = (SSM_RW_SEARCH_NAVIGATE_FLAG_START + SSM_RW_SEARCH_NAVIGATE_FLAG_LEN);
+static const int SSM_RW_INPUT_NUMBER_LIMIT_LEN = (1);
+static const int SSM_RW_SERIAL_ONOFF_FLAG_START = (SSM_RW_INPUT_NUMBER_LIMIT_START + SSM_RW_INPUT_NUMBER_LIMIT_LEN);
+static const int SSM_RW_SERIAL_ONOFF_FLAG_LEN = (1);
+static const int SSM_RW_STANDBY_MODE_FLAG_START = (SSM_RW_SERIAL_ONOFF_FLAG_START + SSM_RW_SERIAL_ONOFF_FLAG_LEN);
+static const int SSM_RW_STANDBY_MODE_FLAG_LEN = (1);
+static const int SSM_RW_HDMIEQ_MODE_START = (SSM_RW_STANDBY_MODE_FLAG_START + SSM_RW_STANDBY_MODE_FLAG_LEN);
+static const int SSM_RW_HDMIEQ_MODE_LEN = (1);
+static const int SSM_RW_LOGO_ON_OFF_FLAG_START = (SSM_RW_HDMIEQ_MODE_START + SSM_RW_HDMIEQ_MODE_LEN);
+static const int SSM_RW_LOGO_ON_OFF_FLAG_LEN = (1);
+static const int SSM_RW_HDMIINTERNAL_MODE_START = (SSM_RW_LOGO_ON_OFF_FLAG_START + SSM_RW_LOGO_ON_OFF_FLAG_LEN);
+static const int SSM_RW_HDMIINTERNAL_MODE_LEN = (4);
+static const int SSM_RW_DISABLE_3D_START = (SSM_RW_HDMIINTERNAL_MODE_START + SSM_RW_HDMIINTERNAL_MODE_LEN);
+static const int SSM_RW_DISABLE_3D_LEN = (1);
+static const int SSM_RW_GLOBAL_OGO_ENABLE_START = (SSM_RW_DISABLE_3D_START + SSM_RW_DISABLE_3D_LEN);
+static const int SSM_RW_GLOBAL_OGO_ENABLE_LEN = (1);
+static const int SSM_RW_LOCAL_DIMING_START = (SSM_RW_GLOBAL_OGO_ENABLE_START + SSM_RW_GLOBAL_OGO_ENABLE_LEN);
+static const int SSM_RW_LOCAL_DIMING_LEN = (1);
+static const int SSM_RW_VDAC_2D_START = (SSM_RW_LOCAL_DIMING_START + SSM_RW_LOCAL_DIMING_LEN);
+static const int SSM_RW_VDAC_2D_LEN = (2);
+static const int SSM_RW_VDAC_3D_START = (SSM_RW_VDAC_2D_START + SSM_RW_VDAC_2D_LEN);
+static const int SSM_RW_VDAC_3D_LEN = (2);
+
+static const int SSM_RW_NON_STANDARD_START = (SSM_RW_VDAC_3D_START + SSM_RW_VDAC_3D_LEN);
+static const int SSM_RW_NON_STANDARD_LEN = (2);
+static const int SSM_RW_ADB_SWITCH_START = (SSM_RW_NON_STANDARD_START + SSM_RW_NON_STANDARD_LEN);
+static const int SSM_RW_ADB_SWITCH_LEN = (1);
+static const int SSM_RW_SERIAL_CMD_SWITCH_START = (SSM_RW_ADB_SWITCH_START + SSM_RW_ADB_SWITCH_LEN);
+static const int SSM_RW_SERIAL_CMD_SWITCH_LEN = (1);
+
+static const int SSM_RW_CA_BUFFER_SIZE_START = (SSM_RW_SERIAL_CMD_SWITCH_START + SSM_RW_SERIAL_CMD_SWITCH_LEN);
+static const int SSM_RW_CA_BUFFER_SIZE_LEN = (2);
+
+static const int SSM_RW_NOISE_GATE_THRESHOLD_START = (SSM_RW_CA_BUFFER_SIZE_START + SSM_RW_CA_BUFFER_SIZE_LEN);
+static const int SSM_RW_NOISE_GATE_THRESHOLD_LEN = (1);
+
+static const int SSM_RW_DTV_TYPE_START = (SSM_RW_NOISE_GATE_THRESHOLD_START + SSM_RW_NOISE_GATE_THRESHOLD_LEN);
+static const int SSM_RW_DTV_TYPE_LEN = (1);
+
+static const int SSM_RW_UI_GRHPHY_BACKLIGHT_START = (SSM_RW_DTV_TYPE_START + SSM_RW_DTV_TYPE_LEN);
+static const int SSM_RW_UI_GRHPHY_BACKLIGHT_LEN = (1);
+
+static const int SSM_RW_FASTSUSPEND_FLAG_START = (SSM_RW_UI_GRHPHY_BACKLIGHT_START + SSM_RW_UI_GRHPHY_BACKLIGHT_LEN);
+static const int SSM_RW_FASTSUSPEND_FLAG_LEN = (1);
+
+static const int SSM_RW_BLACKOUT_ENABLE_START = (SSM_RW_FASTSUSPEND_FLAG_START + SSM_RW_FASTSUSPEND_FLAG_LEN);
+static const int SSM_RW_BLACKOUT_ENABLE__LEN = (1);
+
+static const int SSM_RW_PANEL_ID_START = (SSM_RW_BLACKOUT_ENABLE_START + SSM_RW_BLACKOUT_ENABLE__LEN);
+static const int SSM_RW_PANEL_ID_LEN = (1);
+//Audio data section
+static const int SSM_AUD_MASTR_VOLUME_VAL = (SSM_RW_AUDIO_START + 0);
+static const int SSM_AUD_BALANCE_VAL = (SSM_AUD_MASTR_VOLUME_VAL + 1);
+static const int SSM_AUD_SUPPERBASS_VOLUME_VAL = (SSM_AUD_BALANCE_VAL + 1);
+static const int SSM_AUD_SUPPERBASS_SWITCH = (SSM_AUD_SUPPERBASS_VOLUME_VAL + 1);
+static const int SSM_AUD_SRS_SURROUND_SWITCH = (SSM_AUD_SUPPERBASS_SWITCH + 1);
+static const int SSM_AUD_SRS_DIALOG_CLARITY_SWITCH = (SSM_AUD_SRS_SURROUND_SWITCH + 1);
+static const int SSM_AUD_SRS_TRUEBASS_SWITCH = (SSM_AUD_SRS_DIALOG_CLARITY_SWITCH + 1);
+static const int SSM_AUD_BASS_VOLUME_VAL = (SSM_AUD_SRS_TRUEBASS_SWITCH + 1);
+static const int SSM_AUD_TREBLE_VOLUME_VAL = (SSM_AUD_BASS_VOLUME_VAL + 1);
+static const int SSM_AUD_SOUND_MODE_VAL = (SSM_AUD_TREBLE_VOLUME_VAL + 1);
+static const int SSM_AUD_WALL_EFFCT_SWITCH = (SSM_AUD_SOUND_MODE_VAL + 1);
+static const int SSM_AUD_SPDIF_SWITCH = (SSM_AUD_WALL_EFFCT_SWITCH + 1);
+static const int SSM_AUD_SPDIF_MODE_VAL = (SSM_AUD_SPDIF_SWITCH + 1);
+static const int SSM_AUD_EQ_MODE_VAL = (SSM_RW_AUDIO_START + 32);
+static const int SSM_AUD_EQ_GAIN = (SSM_AUD_EQ_MODE_VAL + 1);
+static const int SSM_AUD_NOLINE_POINTS = (SSM_AUD_EQ_GAIN + 16);
+static const int SSM_AUD_DBX_TV_SON = (SSM_AUD_NOLINE_POINTS + 2);
+static const int SSM_AUD_DBX_TV_VAL = (SSM_AUD_NOLINE_POINTS + 2 + 1);
+static const int SSM_AUD_DBX_TV_SUR = (SSM_AUD_NOLINE_POINTS + 2 + 2);
+static const int SSM_AUD_DBX_TV_SIZE = 3;
+static const int SSM_AUD_AVOUT_MUTE = (SSM_AUD_DBX_TV_SUR + 2);
+static const int SSM_AUD_SPIDF_MUTE = (SSM_AUD_AVOUT_MUTE + 1);
+static const int SSM_AUD_DRC_ONOFF = (SSM_AUD_SPIDF_MUTE + 1);
+
+//VPP Data (115 bytes)
+//ColorDemoMode 1byte
+static const int VPP_DATA_POS_COLOR_DEMO_MODE_START = (SSM_RW_VPP_START + 0);
+static const int VPP_DATA_POS_COLOR_DEMO_MODE_SIZE = (1);
+static const int VPP_DATA_POS_COLOR_DEMO_MODE_END = (VPP_DATA_POS_COLOR_DEMO_MODE_START + VPP_DATA_POS_COLOR_DEMO_MODE_SIZE);
+//ColorBaseMode 1byte
+static const int VPP_DATA_POS_COLOR_BASE_MODE_START = (VPP_DATA_POS_COLOR_DEMO_MODE_END + 0);
+static const int VPP_DATA_POS_COLOR_BASE_MODE_SIZE = (1);
+static const int VPP_DATA_POS_COLOR_BASE_MODE_END = (VPP_DATA_POS_COLOR_BASE_MODE_START + VPP_DATA_POS_COLOR_BASE_MODE_SIZE);
+//TestPattern 1byte
+static const int VPP_DATA_POS_TEST_PATTERN_START = (VPP_DATA_POS_COLOR_BASE_MODE_END + 0);
+static const int VPP_DATA_POS_TEST_PATTERN_SIZE = (1);
+static const int VPP_DATA_POS_TEST_PATTERN_END = (VPP_DATA_POS_TEST_PATTERN_START + VPP_DATA_POS_TEST_PATTERN_SIZE);
+//DDR SSC 1byte
+static const int VPP_DATA_POS_DDR_SSC_START = (VPP_DATA_POS_TEST_PATTERN_END + 0);
+static const int VPP_DATA_POS_DDR_SSC_SIZE = (1);
+static const int VPP_DATA_POS_DDR_SSC_END = (VPP_DATA_POS_DDR_SSC_START + VPP_DATA_POS_DDR_SSC_SIZE);
+//LVDS SSC 1byte
+static const int VPP_DATA_POS_LVDS_SSC_START = (VPP_DATA_POS_DDR_SSC_END + 0);
+static const int VPP_DATA_POS_LVDS_SSC_SIZE = (2);
+static const int VPP_DATA_POS_LVDS_SSC_END = (VPP_DATA_POS_LVDS_SSC_START + VPP_DATA_POS_LVDS_SSC_SIZE);
+//dream panel 1byte
+static const int VPP_DATA_POS_DREAM_PANEL_START = (VPP_DATA_POS_LVDS_SSC_END + 0);
+static const int VPP_DATA_POS_DREAM_PANEL_SIZE = (1);
+static const int VPP_DATA_POS_DREAM_PANEL_END = (VPP_DATA_POS_DREAM_PANEL_START + VPP_DATA_POS_DREAM_PANEL_SIZE);
+//Backlight reverse 1byte
+static const int VPP_DATA_POS_BACKLIGHT_REVERSE_START = (VPP_DATA_POS_DREAM_PANEL_END + 0);
+static const int VPP_DATA_POS_BACKLIGHT_REVERSE_SIZE = (1);
+static const int VPP_DATA_POS_BACKLIGHT_REVERSE_END = (VPP_DATA_POS_BACKLIGHT_REVERSE_START + VPP_DATA_POS_BACKLIGHT_REVERSE_SIZE);
+//Brightness 1*7=7byte
+static const int VPP_DATA_POS_BRIGHTNESS_START = (VPP_DATA_POS_BACKLIGHT_REVERSE_END + 0);
+static const int VPP_DATA_POS_BRIGHTNESS_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_BRIGHTNESS_END = (VPP_DATA_POS_BRIGHTNESS_START + VPP_DATA_POS_BRIGHTNESS_SIZE);
+//Contrast 1*7=7byte
+static const int VPP_DATA_POS_CONTRAST_START = (VPP_DATA_POS_BRIGHTNESS_END + 0);
+static const int VPP_DATA_POS_CONTRAST_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_CONTRAST_END = (VPP_DATA_POS_CONTRAST_START + VPP_DATA_POS_CONTRAST_SIZE);
+//Saturation 1*7=7byte
+static const int VPP_DATA_POS_SATURATION_START = (VPP_DATA_POS_CONTRAST_END + 0);
+static const int VPP_DATA_POS_SATURATION_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_SATURATION_END = (VPP_DATA_POS_SATURATION_START + VPP_DATA_POS_SATURATION_SIZE);
+//Hue 1*7=7byte
+static const int VPP_DATA_POS_HUE_START = (VPP_DATA_POS_SATURATION_END + 0);
+static const int VPP_DATA_POS_HUE_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_HUE_END = (VPP_DATA_POS_HUE_START + VPP_DATA_POS_HUE_SIZE);
+//Sharpness 1*7=7byte
+static const int VPP_DATA_POS_SHARPNESS_START = (VPP_DATA_POS_HUE_END + 0);
+static const int VPP_DATA_POS_SHARPNESS_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_SHARPNESS_END = (VPP_DATA_POS_SHARPNESS_START + VPP_DATA_POS_SHARPNESS_SIZE);
+//ColorTemperature 1*7=7byte
+static const int VPP_DATA_POS_COLOR_TEMP_START = (VPP_DATA_POS_SHARPNESS_END + 0);
+static const int VPP_DATA_POS_COLOR_TEMP_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_COLOR_TEMP_END = (VPP_DATA_POS_COLOR_TEMP_START + VPP_DATA_POS_COLOR_TEMP_SIZE);
+//NoiseReduction 1*7=7byte
+static const int VPP_DATA_POS_NOISE_REDUCTION_START = (VPP_DATA_POS_COLOR_TEMP_END + 0);
+static const int VPP_DATA_POS_NOISE_REDUCTION_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_NOISE_REDUCTION_END = (VPP_DATA_POS_NOISE_REDUCTION_START + VPP_DATA_POS_NOISE_REDUCTION_SIZE);
+//SceneMode 1byte
+static const int VPP_DATA_POS_SCENE_MODE_START = (VPP_DATA_POS_NOISE_REDUCTION_END + 0);
+static const int VPP_DATA_POS_SCENE_MODE_SIZE = (1);
+static const int VPP_DATA_POS_SCENE_MODE_END = (VPP_DATA_POS_SCENE_MODE_START + VPP_DATA_POS_SCENE_MODE_SIZE);
+//PictureMode 1*7=7byte
+static const int VPP_DATA_POS_PICTURE_MODE_START = (VPP_DATA_POS_SCENE_MODE_END + 0);
+static const int VPP_DATA_POS_PICTURE_MODE_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_PICTURE_MODE_END = (VPP_DATA_POS_PICTURE_MODE_START + VPP_DATA_POS_PICTURE_MODE_SIZE);
+//DisplayMode 1*7=7byte
+static const int VPP_DATA_POS_DISPLAY_MODE_START = (VPP_DATA_POS_PICTURE_MODE_END + 0);
+static const int VPP_DATA_POS_DISPLAY_MODE_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_DISPLAY_MODE_END = (VPP_DATA_POS_DISPLAY_MODE_START + VPP_DATA_POS_DISPLAY_MODE_SIZE);
+//Backlight 1*7=7byte
+static const int VPP_DATA_POS_BACKLIGHT_START = (VPP_DATA_POS_DISPLAY_MODE_END + 0);
+static const int VPP_DATA_POS_BACKLIGHT_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_BACKLIGHT_END = (VPP_DATA_POS_BACKLIGHT_START + VPP_DATA_POS_BACKLIGHT_SIZE);
+//RGB_Gain_R 4byte
+static const int VPP_DATA_POS_RGB_GAIN_R_START = (VPP_DATA_POS_BACKLIGHT_END + 0);
+static const int VPP_DATA_POS_RGB_GAIN_R_SIZE = (sizeof(int));
+static const int VPP_DATA_POS_RGB_GAIN_R_END = (VPP_DATA_POS_RGB_GAIN_R_START + VPP_DATA_POS_RGB_GAIN_R_SIZE);
+//RGB_Gain_G 4byte
+static const int VPP_DATA_POS_RGB_GAIN_G_START = (VPP_DATA_POS_RGB_GAIN_R_END + 0);
+static const int VPP_DATA_POS_RGB_GAIN_G_SIZE = (sizeof(int));
+static const int VPP_DATA_POS_RGB_GAIN_G_END = (VPP_DATA_POS_RGB_GAIN_G_START + VPP_DATA_POS_RGB_GAIN_G_SIZE);
+//RGB_Gain_B 4byte
+static const int VPP_DATA_POS_RGB_GAIN_B_START = (VPP_DATA_POS_RGB_GAIN_G_END + 0);
+static const int VPP_DATA_POS_RGB_GAIN_B_SIZE = (sizeof(int));
+static const int VPP_DATA_POS_RGB_GAIN_B_END = (VPP_DATA_POS_RGB_GAIN_B_START + VPP_DATA_POS_RGB_GAIN_B_SIZE);
+//RGB_Post_Offset_R 4byte
+static const int VPP_DATA_POS_RGB_POST_OFFSET_R_START = (VPP_DATA_POS_RGB_GAIN_B_END + 0);
+static const int VPP_DATA_POS_RGB_POST_OFFSET_R_SIZE = (sizeof(int));
+static const int VPP_DATA_POS_RGB_POST_OFFSET_R_END = (VPP_DATA_POS_RGB_POST_OFFSET_R_START + VPP_DATA_POS_RGB_POST_OFFSET_R_SIZE);
+//RGB_Post_Offset_G 4byte
+static const int VPP_DATA_POS_RGB_POST_OFFSET_G_START = (VPP_DATA_POS_RGB_POST_OFFSET_R_END + 0);
+static const int VPP_DATA_POS_RGB_POST_OFFSET_G_SIZE = (sizeof(int));
+static const int VPP_DATA_POS_RGB_POST_OFFSET_G_END = (VPP_DATA_POS_RGB_POST_OFFSET_G_START + VPP_DATA_POS_RGB_POST_OFFSET_G_SIZE);
+//RGB_Post_Offset_B 4byte
+static const int VPP_DATA_POS_RGB_POST_OFFSET_B_START = (VPP_DATA_POS_RGB_POST_OFFSET_G_END + 0);
+static const int VPP_DATA_POS_RGB_POST_OFFSET_B_SIZE = (sizeof(int));
+static const int VPP_DATA_POS_RGB_POST_OFFSET_B_END = (VPP_DATA_POS_RGB_POST_OFFSET_B_START + VPP_DATA_POS_RGB_POST_OFFSET_B_SIZE);
+//dbc_Enable 1byte
+static const int VPP_DATA_POS_DBC_START = (VPP_DATA_POS_RGB_POST_OFFSET_B_END + 0);
+static const int VPP_DATA_POS_DBC_SIZE = (1);
+static const int VPP_DATA_POS_DBC_END = (VPP_DATA_POS_DBC_START + VPP_DATA_POS_DBC_SIZE);
+//project id 1byte
+static const int VPP_DATA_PROJECT_ID_START = (VPP_DATA_POS_DBC_END + 0);
+static const int VPP_DATA_PROJECT_ID_SIZE = (1);
+static const int VPP_DATA_PROJECT_ID_END = (VPP_DATA_PROJECT_ID_START + VPP_DATA_PROJECT_ID_SIZE);
+//dnlp 1byte
+static const int VPP_DATA_POS_DNLP_START = (VPP_DATA_PROJECT_ID_END + 0);
+static const int VPP_DATA_POS_DNLP_SIZE = (1);
+static const int VPP_DATA_POS_DNLP_END = (VPP_DATA_POS_DNLP_START + VPP_DATA_POS_DNLP_SIZE);
+//panorama 1*7 = 7byte
+static const int VPP_DATA_POS_PANORAMA_START = (VPP_DATA_POS_DNLP_END + 0);
+static const int VPP_DATA_POS_PANORAMA_SIZE = (1 * (SOURCE_TYPE_MAX));
+static const int VPP_DATA_POS_PANORAMA_END = (VPP_DATA_POS_PANORAMA_START + VPP_DATA_POS_PANORAMA_SIZE);
+//APL 1 byte
+static const int VPP_DATA_APL_START = (VPP_DATA_POS_PANORAMA_END + 0);
+static const int VPP_DATA_APL_SIZE = (1);
+static const int VPP_DATA_APL_END = (VPP_DATA_APL_START + VPP_DATA_APL_SIZE);
+//APL2 1 byte
+static const int VPP_DATA_APL2_START = (VPP_DATA_APL_END + 0);
+static const int VPP_DATA_APL2_SIZE = (1);
+static const int VPP_DATA_APL2_END = (VPP_DATA_APL2_START + VPP_DATA_APL2_SIZE);
+//BD 1 byte
+static const int VPP_DATA_BD_START = (VPP_DATA_APL2_END + 0);
+static const int VPP_DATA_BD_SIZE = (1);
+static const int VPP_DATA_BD_END = (VPP_DATA_BD_START + VPP_DATA_BD_SIZE);
+//BP 1 byte
+static const int VPP_DATA_BP_START = (VPP_DATA_BD_END + 0);
+static const int VPP_DATA_BP_SIZE = (1);
+static const int VPP_DATA_BP_END = (VPP_DATA_BP_START + VPP_DATA_BP_SIZE);
+
+//Factory RGB 3*6 = 18byte
+static const int VPP_DATA_RGB_START = (VPP_DATA_BP_END + 0);
+static const int VPP_DATA_RGB_SIZE = (18);
+static const int VPP_DATA_RGB_END = (VPP_DATA_RGB_START + VPP_DATA_RGB_SIZE);
+
+//COLOR_SPACE 1 byte
+static const int VPP_DATA_COLOR_SPACE_START = (VPP_DATA_RGB_END + 0);
+static const int VPP_DATA_COLOR_SPACE_SIZE = (1);
+static const int VPP_DATA_COLOR_SPACE_END = (VPP_DATA_COLOR_SPACE_START + VPP_DATA_COLOR_SPACE_SIZE);
+
+static const int VPP_DATA_USER_NATURE_SWITCH_START = (VPP_DATA_COLOR_SPACE_END + 0);
+static const int VPP_DATA_USER_NATURE_SWITCH_SIZE = (1);
+static const int VPP_DATA_USER_NATURE_SWITCH_END = (VPP_DATA_USER_NATURE_SWITCH_START + VPP_DATA_USER_NATURE_SWITCH_SIZE);
+
+//gamma value 1 byte
+static const int VPP_DATA_GAMMA_VALUE_START = (VPP_DATA_USER_NATURE_SWITCH_END + 0);
+static const int VPP_DATA_GAMMA_VALUE_SIZE = (1);
+static const int VPP_DATA_GAMMA_VALUE_END = (VPP_DATA_GAMMA_VALUE_START + VPP_DATA_GAMMA_VALUE_SIZE);
+
+//dbc backlight enable 1byte
+static const int VPP_DATA_DBC_BACKLIGHT_START = (VPP_DATA_GAMMA_VALUE_END + 0);
+static const int VPP_DATA_DBC_BACKLIGHT_SIZE = (1);
+static const int VPP_DATA_DBC_BACKLIGHT_END = (VPP_DATA_DBC_BACKLIGHT_START + VPP_DATA_DBC_BACKLIGHT_SIZE);
+//dbc backlight standard 1byte
+static const int VPP_DATA_DBC_STANDARD_START = (VPP_DATA_DBC_BACKLIGHT_END + 0);
+static const int VPP_DATA_DBC_STANDARD_SIZE = (1);
+static const int VPP_DATA_DBC_STANDARD_END = (VPP_DATA_DBC_STANDARD_START + VPP_DATA_DBC_STANDARD_SIZE);
+//dbc backlight enable 1byte
+static const int VPP_DATA_DBC_ENABLE_START = (VPP_DATA_DBC_STANDARD_END + 0);
+static const int VPP_DATA_DBC_ENABLE_SIZE = (1);
+static const int VPP_DATA_DBC_ENABLE_END = (VPP_DATA_DBC_ENABLE_START + VPP_DATA_DBC_ENABLE_SIZE);
+
+//fbc Backlight 1 byte
+static const int VPP_DATA_POS_FBC_BACKLIGHT_START = (VPP_DATA_DBC_ENABLE_END + 0);
+static const int VPP_DATA_POS_FBC_BACKLIGHT_SIZE = (1);
+static const int VPP_DATA_POS_FBC_BACKLIGHT_END = (VPP_DATA_POS_FBC_BACKLIGHT_START + VPP_DATA_POS_FBC_BACKLIGHT_SIZE);
+//fbc Elecmode 1 byte
+static const int VPP_DATA_POS_FBC_ELECMODE_START = (VPP_DATA_POS_FBC_BACKLIGHT_END + 0);
+static const int VPP_DATA_POS_FBC_ELECMODE_SIZE = (1);
+static const int VPP_DATA_POS_FBC_ELECMODE_END = (VPP_DATA_POS_FBC_ELECMODE_START + VPP_DATA_POS_FBC_ELECMODE_SIZE);
+//fbc colortemp 1 byte
+static const int VPP_DATA_POS_FBC_COLORTEMP_START = (VPP_DATA_POS_FBC_ELECMODE_END + 0);
+static const int VPP_DATA_POS_FBC_COLORTEMP_SIZE = (1);
+static const int VPP_DATA_POS_FBC_COLORTEMP_END = (VPP_DATA_POS_FBC_COLORTEMP_START + VPP_DATA_POS_FBC_COLORTEMP_SIZE);
+
+static const int VPP_DATA_POS_FBC_N310_BACKLIGHT_START = (VPP_DATA_POS_FBC_COLORTEMP_END + 0);
+static const int VPP_DATA_POS_FBC_N310_BACKLIGHT_SIZE = (1);
+static const int VPP_DATA_POS_FBC_N310_BACKLIGHT_END = (VPP_DATA_POS_FBC_N310_BACKLIGHT_START + VPP_DATA_POS_FBC_N310_BACKLIGHT_SIZE);
+//fbc colortemp 1 byte N310
+static const int VPP_DATA_POS_FBC_N310_COLORTEMP_START = (VPP_DATA_POS_FBC_N310_BACKLIGHT_END + 0);
+static const int VPP_DATA_POS_FBC_N310_COLORTEMP_SIZE = (1);
+static const int VPP_DATA_POS_FBC_N310_COLORTEMP_END = (VPP_DATA_POS_FBC_N310_COLORTEMP_START + VPP_DATA_POS_FBC_N310_COLORTEMP_SIZE);
+//fbc lightsensor 1 byte N310
+static const int VPP_DATA_POS_FBC_N310_LIGHTSENSOR_START = (VPP_DATA_POS_FBC_N310_COLORTEMP_END + 0);
+static const int VPP_DATA_POS_FBC_N310_LIGHTSENSOR_SIZE = (1);
+static const int VPP_DATA_POS_FBC_N310_LIGHTSENSOR_END = (VPP_DATA_POS_FBC_N310_LIGHTSENSOR_START + VPP_DATA_POS_FBC_N310_LIGHTSENSOR_SIZE);
+//fbc MEMC 1 byte N310
+static const int VPP_DATA_POS_FBC_N310_MEMC_START = (VPP_DATA_POS_FBC_N310_LIGHTSENSOR_END + 0);
+static const int VPP_DATA_POS_FBC_N310_MEMC_SIZE = (1);
+static const int VPP_DATA_POS_FBC_N310_MEMC_END = (VPP_DATA_POS_FBC_N310_MEMC_START + VPP_DATA_POS_FBC_N310_MEMC_SIZE);
+//fbc DREAMPANEL 1 byte N310
+static const int VPP_DATA_POS_FBC_N310_DREAMPANEL_START = (VPP_DATA_POS_FBC_N310_MEMC_END + 0);
+static const int VPP_DATA_POS_FBC_N310_DREAMPANEL_SIZE = (1);
+static const int VPP_DATA_POS_FBC_N310_DREAMPANEL_END = (VPP_DATA_POS_FBC_N310_DREAMPANEL_START + VPP_DATA_POS_FBC_N310_DREAMPANEL_SIZE);
+//fbc Multi_pq 1 byte N310
+static const int VPP_DATA_POS_FBC_N310_MULTI_PQ_START = (VPP_DATA_POS_FBC_N310_DREAMPANEL_END + 0);
+static const int VPP_DATA_POS_FBC_N310_MULTI_PQ_SIZE = (1);
+static const int VPP_DATA_POS_FBC_N310_MULTI_PQ_END = (VPP_DATA_POS_FBC_N310_MULTI_PQ_START + VPP_DATA_POS_FBC_N310_MULTI_PQ_SIZE);
+//fbc Multi_pq 1 byte N310
+static const int VPP_DATA_POS_N311_VBYONE_SPREAD_SPECTRUM_START = (VPP_DATA_POS_FBC_N310_MULTI_PQ_END + 0);
+static const int VPP_DATA_POS_N311_VBYONE_SPREAD_SPECTRUM_SIZE = (1);
+static const int VPP_DATA_POS_N311_VBYONE_SPREAD_SPECTRUM_END = (VPP_DATA_POS_N311_VBYONE_SPREAD_SPECTRUM_START + VPP_DATA_POS_N311_VBYONE_SPREAD_SPECTRUM_SIZE);
+//bluetooth volume 1 byte N311
+static const int VPP_DATA_POS_N311_BLUETOOTH_VAL_START = (VPP_DATA_POS_N311_VBYONE_SPREAD_SPECTRUM_END + 0);
+static const int VPP_DATA_POS_N311_BLUETOOTH_VAL_SIZE = (1);
+static const int VPP_DATA_POS_N311_BLUETOOTH_VAL_END = (VPP_DATA_POS_N311_BLUETOOTH_VAL_START + VPP_DATA_POS_N311_BLUETOOTH_VAL_SIZE);
+
+//Tvin data section (581 bytes)
+//SourceInput 1byte
+static const int TVIN_DATA_POS_SOURCE_INPUT_START = (SSM_RW_VDIN_START + 0);
+static const int TVIN_DATA_POS_SOURCE_INPUT_SIZE = (1);
+static const int TVIN_DATA_POS_SOURCE_INPUT_END = (TVIN_DATA_POS_SOURCE_INPUT_START + TVIN_DATA_POS_SOURCE_INPUT_SIZE);
+//CVBS Std 1byte
+static const int TVIN_DATA_CVBS_STD_START = (TVIN_DATA_POS_SOURCE_INPUT_END + 0);
+static const int TVIN_DATA_CVBS_STD_SIZE = (1);
+static const int TVIN_DATA_CVBS_STD_END = (TVIN_DATA_CVBS_STD_START + TVIN_DATA_CVBS_STD_SIZE);
+//3DMode 1byte
+static const int TVIN_DATA_POS_3D_MODE_START = (TVIN_DATA_CVBS_STD_END + 0);
+static const int TVIN_DATA_POS_3D_MODE_SIZE = (1);
+static const int TVIN_DATA_POS_3D_MODE_END = (TVIN_DATA_POS_3D_MODE_START + TVIN_DATA_POS_3D_MODE_SIZE);
+//3DLRSwitch 1byte
+static const int TVIN_DATA_POS_3D_LRSWITCH_START = (TVIN_DATA_POS_3D_MODE_END + 0);
+static const int TVIN_DATA_POS_3D_LRSWITCH_SIZE = (1);
+static const int TVIN_DATA_POS_3D_LRSWITCH_END = (TVIN_DATA_POS_3D_LRSWITCH_START + TVIN_DATA_POS_3D_LRSWITCH_SIZE);
+//3DDepth 1byte
+static const int TVIN_DATA_POS_3D_DEPTH_START = (TVIN_DATA_POS_3D_LRSWITCH_END + 0);
+static const int TVIN_DATA_POS_3D_DEPTH_SIZE = (1);
+static const int TVIN_DATA_POS_3D_DEPTH_END = (TVIN_DATA_POS_3D_DEPTH_START + TVIN_DATA_POS_3D_DEPTH_SIZE);
+//3DTo2D 1byte
+static const int TVIN_DATA_POS_3D_TO2D_START = (TVIN_DATA_POS_3D_DEPTH_END + 0);
+static const int TVIN_DATA_POS_3D_TO2D_SIZE = (1);
+static const int TVIN_DATA_POS_3D_TO2D_END = (TVIN_DATA_POS_3D_TO2D_START + TVIN_DATA_POS_3D_TO2D_SIZE);
+//3DTo2DNEW 1byte
+static const int TVIN_DATA_POS_3D_TO2DNEW_START = (TVIN_DATA_POS_3D_TO2D_END + 0);
+static const int TVIN_DATA_POS_3D_TO2DNEW_SIZE = (1);
+static const int TVIN_DATA_POS_3D_TO2DNEW_END = (TVIN_DATA_POS_3D_TO2DNEW_START + TVIN_DATA_POS_3D_TO2DNEW_SIZE);
+
+static const int CHKSUM_PROJECT_ID_OFFSET = (SSM_RES0_START + 0);
+static const int CHKSUM_MAC_ADDRESS_OFFSET = (SSM_RES0_START + 2);
+static const int CHKSUM_HDCP_KEY_OFFSET = (SSM_RES0_START + 4);
+static const int CHKSUM_BARCODE_OFFSET = (SSM_RES0_START + 6);
+
+#endif
diff --git a/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp b/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp
index a46f192..7c26695 100644
--- a/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp
+++ b/tvapi/libtv/tvsetting/CTvSettingDeviceFactory.cpp
@@ -18,7 +18,7 @@ CTvSettingDeviceFactory::CTvSettingDeviceFactory()
CTvSettingDeviceFactory::~CTvSettingDeviceFactory()
{
- if(mpCurDevice != NULL) {
+ if (mpCurDevice != NULL) {
delete mpCurDevice;
mpCurDevice = NULL;
}
@@ -175,12 +175,12 @@ CBlobDevice *CTvSettingDeviceFactory::getSaveDeviceFromConfigFile()
LOGD("getSaveDeviceFromConfigFile type=%s path=%s size=%s", device_type, device_path, device_size);
//
- if(mpCurDevice != NULL) delete mpCurDevice;
+ if (mpCurDevice != NULL) delete mpCurDevice;
- if(strcmp(device_type, "file") == 0) {
+ if (strcmp(device_type, "file") == 0) {
mpCurDevice = new CBlobDeviceFile();
- } else if(strcmp(device_type, "e2prom") == 0) {
- } else if(strcmp(device_type, "ram") == 0) {
+ } else if (strcmp(device_type, "e2prom") == 0) {
+ } else if (strcmp(device_type, "ram") == 0) {
}
return mpCurDevice;
diff --git a/tvapi/libtv/tvsetting/TvKeyData.cpp b/tvapi/libtv/tvsetting/TvKeyData.cpp
index a7937fb..ac5ecb6 100644
--- a/tvapi/libtv/tvsetting/TvKeyData.cpp
+++ b/tvapi/libtv/tvsetting/TvKeyData.cpp
@@ -1,1392 +1,1334 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <cutils/properties.h>
-
-#include <netinet/ether.h>
-#include <netinet/if_ether.h>
-
-#include <netutils/ifc.h>
-#include <netutils/dhcp.h>
-
-#include "tvconfig/tvconfig.h"
-#include "CTvSettingCfg.h"
-#include "TvKeyData.h"
-
-#define CC_MAX_KEY_DATA_SIZE (2048)
-#define CC_MAX_FILE_PATH (256)
-
-#define CC_MAC_LEN (6)
-#define CC_HDCP_KEY_TOTAL_SIZE (368)
-#define CC_HDCP_KEY_HEAD_SIZE (40)
-#define CC_HDCP_KEY_CONTENT_SIZE (CC_HDCP_KEY_TOTAL_SIZE - CC_HDCP_KEY_HEAD_SIZE)
-
-#define CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE (SSM_HDMI_EDID_SIZE + 4)
-
-#define CS_MAC_ADDRESS_STARTWRK_EN_CFG "ssm.macaddr.startwork.en"
-#define CS_BARCODE_LEN_CFG "ssm.barcode.len"
-
-#define CS_HDCP_KEY_EN_CFG "ssm.handle.hdcpkey.en"
-#define CS_HDCP_KEY_DEMO_EN_CFG "ssm.handle.hdcpkey.demo.en"
-#define CS_HDCP_KEY_FILE_PATH_CFG "ssm.handle.hdcpkey.file.path"
-#define CS_HDCP_KEY_FILE_OFFSET_CFG "ssm.handle.hdcpkey.file.offset"
-#define CS_HDCP_KEY_HEADER_EN_CFG "ssm.handle.hdcpkey.header.en"
-
-
-#define CS_HDMI_EDID_EN_CFG "ssm.handle.hdmi.edid.en"
-#define CS_HDMI_EDID_USE_CFG "ssm.handle.hdmi.edid.use"
-#define CS_HDMI_EDID_FILE_PATH_CFG "ssm.handle.hdmi.edid.file.path"
-#define CS_HDMI_PORT1_EDID_FILE_PATH_CFG "ssm.handle.hdmi.port1.edid.file.path"
-#define CS_HDMI_PORT2_EDID_FILE_PATH_CFG "ssm.handle.hdmi.port2.edid.file.path"
-#define CS_HDMI_PORT3_EDID_FILE_PATH_CFG "ssm.handle.hdmi.port3.edid.file.path"
-#define CS_HDMI_EDID_FILE_OFFSET_CFG "ssm.handle.hdmi.edid.file.offset"
-
-#define CS_RGBOGO_FILE_PATH_CFG "ssm.rgbogo.file.path"
-#define CS_RGBOGO_FILE_OFFSET_CFG "ssm.rgbogo.file.offset"
-
-#define CS_AUDIO_NOLINEPOINTS_FILE_PATH_CFG "ssm.audio.nolinepoints.file.path"
-#define CS_AUDIO_NOLINEPOINTS_FILE_OFFSET_CFG "ssm.audio.nolinepoints.file.offset"
-
-static unsigned char mHDCPKeyDefHeaderBuf[CC_HDCP_KEY_HEAD_SIZE] = {
- //40 bytes
- 0x53, 0x4B, 0x59, 0x01, 0x00, 0x10, 0x0D, 0x15, 0x3A, 0x8E, // 000~009
- 0x99, 0xEE, 0x2A, 0x55, 0x58, 0xEE, 0xED, 0x4B, 0xBE, 0x00, // 010~019
- 0x74, 0xA9, 0x00, 0x10, 0x0A, 0x21, 0xE3, 0x30, 0x66, 0x34, // 020~029
- 0xCE, 0x9C, 0xC7, 0x8B, 0x51, 0x27, 0xF9, 0x0B, 0xAD, 0x09, // 030~039
-};
-
-static unsigned char mDefHDCPKeyContentBuf[CC_HDCP_KEY_CONTENT_SIZE] = {
- //328 bytes
- 0x5F, 0x4D, 0xC2, 0xCA, 0xA2, 0x13, 0x06, 0x18, 0x8D, 0x34, // 000~009
- 0x82, 0x46, 0x2D, 0xC9, 0x4B, 0xB0, 0x1C, 0xDE, 0x3D, 0x49, // 010~019
- 0x39, 0x58, 0xEF, 0x2B, 0x68, 0x39, 0x71, 0xC9, 0x4D, 0x25, // 020~029
- 0xE9, 0x75, 0x4D, 0xAC, 0x62, 0xF5, 0xF5, 0x87, 0xA0, 0xB2, // 030~039
- 0x4A, 0x60, 0xD3, 0xF1, 0x09, 0x3A, 0xB2, 0x3E, 0x19, 0x4F, // 040~049
- 0x3B, 0x1B, 0x2F, 0x85, 0x14, 0x28, 0x44, 0xFC, 0x69, 0x6F, // 050~059
- 0x50, 0x42, 0x81, 0xBF, 0x7C, 0x2B, 0x3A, 0x17, 0x2C, 0x15, // 060~069
- 0xE4, 0x93, 0x77, 0x74, 0xE8, 0x1F, 0x1C, 0x38, 0x54, 0x49, // 070~079
- 0x10, 0x64, 0x5B, 0x7D, 0x90, 0x3D, 0xA0, 0xE1, 0x8B, 0x67, // 080~089
- 0x5C, 0x19, 0xE6, 0xCA, 0x9D, 0xE9, 0x68, 0x5A, 0xB5, 0x62, // 090~099
- 0xDF, 0xA1, 0x28, 0xBC, 0x68, 0x82, 0x9A, 0x22, 0xC4, 0xDC, // 100~109
- 0x48, 0x85, 0x0F, 0xF1, 0x3E, 0x05, 0xDD, 0x1B, 0x2D, 0xF5, // 120~119
- 0x49, 0x3A, 0x15, 0x29, 0xE7, 0xB6, 0x0B, 0x2A, 0x40, 0xE3, // 120~129
- 0xB0, 0x89, 0xD5, 0x75, 0x84, 0x2E, 0x76, 0xE7, 0xBC, 0x63, // 130~139
- 0x67, 0xE3, 0x57, 0x67, 0x86, 0x81, 0xF4, 0xD7, 0xEA, 0x4D, // 140~149
- 0x89, 0x8E, 0x37, 0x95, 0x59, 0x1C, 0x8A, 0xCD, 0x79, 0xF8, // 150~159
- 0x4F, 0x82, 0xF2, 0x6C, 0x7E, 0x7F, 0x79, 0x8A, 0x6B, 0x90, // 160~169
- 0xC0, 0xAF, 0x4C, 0x8D, 0x43, 0x47, 0x1F, 0x9A, 0xF1, 0xBB, // 170~179
- 0x88, 0x64, 0x49, 0x14, 0x50, 0xD1, 0xC3, 0xDF, 0xA6, 0x87, // 180~189
- 0xA0, 0x15, 0x98, 0x51, 0x81, 0xF5, 0x97, 0x55, 0x10, 0x4A, // 190~199
- 0x99, 0x30, 0x54, 0xA4, 0xFC, 0xDA, 0x0E, 0xAC, 0x6A, 0xFA, // 200~209
- 0x90, 0xEE, 0x12, 0x70, 0x69, 0x74, 0x63, 0x46, 0x63, 0xFB, // 210~219
- 0xE6, 0x1F, 0x72, 0xEC, 0x43, 0x5D, 0x50, 0xFF, 0x03, 0x4F, // 220~229
- 0x05, 0x33, 0x88, 0x36, 0x93, 0xE4, 0x72, 0xD5, 0xCC, 0x34, // 230~239
- 0x52, 0x96, 0x15, 0xCE, 0xD0, 0x32, 0x52, 0x41, 0x4F, 0xBC, // 240~249
- 0x2D, 0xDF, 0xC5, 0xD6, 0x7F, 0xD5, 0x74, 0xCE, 0x51, 0xDC, // 250~259
- 0x10, 0x5E, 0xF7, 0xAA, 0x4A, 0x2D, 0x20, 0x9A, 0x17, 0xDD, // 260~269
- 0x30, 0x89, 0x71, 0x82, 0x36, 0x50, 0x09, 0x1F, 0x7C, 0xF3, // 270~279
- 0x12, 0xE9, 0x43, 0x10, 0x5F, 0x51, 0xBF, 0xB8, 0x45, 0xA8, // 280~289
- 0x5A, 0x8D, 0x3F, 0x77, 0xE5, 0x96, 0x73, 0x68, 0xAB, 0x73, // 290~299
- 0xE5, 0x4C, 0xFB, 0xE5, 0x98, 0xB9, 0xAE, 0x74, 0xEB, 0x51, // 300~309
- 0xDB, 0x91, 0x07, 0x7B, 0x66, 0x02, 0x9B, 0x79, 0x03, 0xC5, // 310~319
- 0x34, 0x1C, 0x58, 0x13, 0x31, 0xD2, 0x4A, 0xEC, // 320~327
-};
-
-static int CreateMacAddressStartWorkThread();
-
-static int GetSSMHandleHDCPKeyEnableCFG();
-static int GetSSMHandleHDCPKeyHeaderEnableCFG();
-static int GetSSMHandleHDCPKeyDemoEnableCFG();
-static int SSMSetDefaultHDCPKey(unsigned char hdcp_key_buf[]);
-static int RealHandleHDCPKey(unsigned char hdcp_key_buf[]);
-static int GetHDCPKeyFromFile(int rd_off, int rd_size,
- unsigned char data_buf[]);
-static int SaveHDCPKeyToFile(int wr_off, int wr_size, unsigned char data_buf[]);
-
-static int GetHDMIEdidFromFile(int rd_off, int rd_size, int port,
- unsigned char data_buf[]);
-static int RealHandleHDMIEdid(unsigned char hdmi_edid_buf[]);
-static int GetSSMHandleHDMIEdidByCustomerEnableCFG();
-static int AppendEdidPrefixCode(unsigned char customer_hdmi_edid_buf[],
- unsigned char hdmi_edid_buf[]);
-
-static int GetRGBOGOFromFile(int rd_off, int rd_size, unsigned char data_buf[]);
-static int SaveRGBOGOToFile(int wr_off, int wr_size, unsigned char data_buf[]);
-
-static int GetAudioNoLinePointsDataFromFile(int offset, int size,
- unsigned char data_buf[]);
-static int SaveAudioNoLinePointsDataToFile(int offset, int size,
- unsigned char data_buf[]);
-
-static int TransStringToHex(int data_cnt, char data_buf[],
- unsigned char hex_buf[])
-{
- int i = 0, j = 0, tmp_val = 0;
- char tmp_buf[3] = { 0, 0, 0 };
-
- while (i < data_cnt) {
- tmp_val = 0;
- tmp_buf[0] = data_buf[i];
- tmp_buf[1] = data_buf[i + 1];
- tmp_val = strtoul(tmp_buf, NULL, 16);
- hex_buf[j] = tmp_val;
- //LOGD("%s, hex_buf[%d] = 0x%x\n", __FUNCTION__, j, hex_buf[j]);
- i += 2;
- j += 1;
- }
-
- return j;
-}
-
-static int TransToHexString(int hex_cnt, char data_buf[],
- unsigned char hex_buf[])
-{
- int i = 0, j = 0;
- char tmp_buf[17] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-
- data_buf[0] = 0;
- for (i = 0; i < hex_cnt; i++) {
- sprintf(tmp_buf, "%02X", (unsigned char) hex_buf[i]);
- strcat(data_buf, tmp_buf);
- }
-
- return 2 * hex_cnt;
-}
-
-int ReadKeyData(const char *key_name, unsigned int rd_data_len, unsigned char data_buf[])
-{
- FILE *dev_fp = NULL;
- int i = 0, rd_cnt = 0;
- char tmp_ori_buf[CC_MAX_KEY_DATA_SIZE];
- unsigned char tmp_tran_buf[CC_MAX_KEY_DATA_SIZE];
-
- dev_fp = fopen(CS_KEY_DATA_NAME_DEV_PATH, "w");
- if (dev_fp == NULL) {
- LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__,
- CS_KEY_DATA_NAME_DEV_PATH, strerror(errno));
- return -1;
- }
-
- fprintf(dev_fp, "%s", key_name);
-
- fclose(dev_fp);
- dev_fp = NULL;
-
- dev_fp = fopen(CS_KEY_DATA_READ_DEV_PATH, "r");
- if (dev_fp == NULL) {
- LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__,
- CS_KEY_DATA_READ_DEV_PATH, strerror(errno));
- return -1;
- }
-
- memset((void *)tmp_ori_buf, 0, CC_MAX_KEY_DATA_SIZE);
- memset((void *)tmp_tran_buf, 0, CC_MAX_KEY_DATA_SIZE);
- fscanf(dev_fp, "%s", tmp_ori_buf);
-
- rd_cnt = strlen(tmp_ori_buf);
- rd_cnt = TransStringToHex(rd_cnt, tmp_ori_buf, tmp_tran_buf);
-
- fclose(dev_fp);
- dev_fp = NULL;
-
- if (rd_cnt != rd_data_len) {
- return 0;
- }
-
- memcpy(data_buf, tmp_tran_buf, rd_cnt);
- return rd_cnt;
-}
-
-int WriteKeyData(const char *key_name, int wr_size, char data_buf[])
-{
- FILE *dev_fp = NULL;
- int wr_cnt = 0;
-
- dev_fp = fopen(CS_KEY_DATA_NAME_DEV_PATH, "w");
- if (dev_fp == NULL) {
- LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__,
- CS_KEY_DATA_NAME_DEV_PATH, strerror(errno));
- return -1;
- }
-
- fprintf(dev_fp, "%s", key_name);
-
- fclose(dev_fp);
- dev_fp = NULL;
-
- dev_fp = fopen(CS_KEY_DATA_WRITE_DEV_PATH, "w");
- if (dev_fp == NULL) {
- LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__,
- CS_KEY_DATA_WRITE_DEV_PATH, strerror(errno));
- return -1;
- }
-
- wr_cnt = fwrite(data_buf, 1, wr_size, dev_fp);
-
- fclose(dev_fp);
- dev_fp = NULL;
-
- return wr_cnt;
-}
-
-int KeyData_GetMacAddressDataLen()
-{
- return CC_MAC_LEN;
-}
-
-int KeyData_ReadMacAddress(unsigned char data_buf[])
-{
- int i = 0, rd_size = 0;
- int data_i_buf[CC_MAC_LEN] = { 0, 0, 0, 0, 0, 0 };
- unsigned char tmp_buf[128] = { 0 };
-
- rd_size = ReadKeyData(CS_MAC_KEY_NAME, 17, tmp_buf);
- if (rd_size == 17) {
- sscanf((char *) tmp_buf, "%02x:%02x:%02x:%02x:%02x:%02x",
- &data_i_buf[0], &data_i_buf[1], &data_i_buf[2], &data_i_buf[3],
- &data_i_buf[4], &data_i_buf[5]);
- for (i = 0; i < sizeof(data_i_buf); i++) {
- data_buf[i] = data_i_buf[i] & 0xFF;
- }
- }
-
- return KeyData_GetMacAddressDataLen();
-}
-
-int KeyData_SaveMacAddress(unsigned char data_buf[])
-{
- int tmp_ret = 0, wr_size = 0;
- unsigned char hex_buf[128] = { 0 };
- char tmp_buf[128] = { 0 };
-
- sprintf((char *) hex_buf, "%02x:%02x:%02x:%02x:%02x:%02x", data_buf[0],
- data_buf[1], data_buf[2], data_buf[3], data_buf[4], data_buf[5]);
-
- TransToHexString(strlen((char *) hex_buf), tmp_buf, hex_buf);
-
- wr_size = strlen(tmp_buf);
- tmp_ret = WriteKeyData(CS_MAC_KEY_NAME, wr_size, tmp_buf);
- if (tmp_ret != wr_size) {
- return -1;
- }
-
- CreateMacAddressStartWorkThread();
-
- return 0;
-}
-
-static int gSSMBarCodeLen = -1;
-int KeyData_GetBarCodeDataLen()
-{
- const char *config_value;
-
- if (gSSMBarCodeLen <= 0) {
- config_value = config_get_str("TV", CS_BARCODE_LEN_CFG, "null");
- if (strcmp(config_value, "null") == 0) {
- gSSMBarCodeLen = 32;
- } else {
- gSSMBarCodeLen = strtol(config_value, NULL, 10);
- }
- }
-
- return gSSMBarCodeLen;
-}
-
-int KeyData_ReadBarCode(unsigned char data_buf[])
-{
- int rd_size = 0, tmp_len = 0;
- unsigned char tmp_buf[CC_MAX_KEY_DATA_SIZE] = { 0 };
-
- tmp_len = KeyData_GetBarCodeDataLen();
- rd_size = ReadKeyData(CS_BARCODE_KEY_NAME, tmp_len, tmp_buf);
- LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size);
- if (rd_size == tmp_len) {
- memcpy(data_buf, tmp_buf, tmp_len);
- }
-
- return rd_size;
-}
-
-int KeyData_SaveBarCode(unsigned char data_buf[])
-{
- int tmp_len = 0, wr_size = 0;
- char tmp_buf[512] = { 0 };
-
- tmp_len = KeyData_GetBarCodeDataLen();
-
- TransToHexString(tmp_len, tmp_buf, data_buf);
-
- wr_size = strlen(tmp_buf);
- tmp_len = WriteKeyData(CS_BARCODE_KEY_NAME, wr_size, tmp_buf);
- if (tmp_len != wr_size) {
- return -1;
- }
-
- return 0;
-}
-
-int SSMReadHDCPKey(unsigned char hdcp_key_buf[])
-{
- int tmp_ret = 0, rd_size = 0;
- unsigned char tmp_buf[CC_HDCP_KEY_TOTAL_SIZE] = { 0 };
-
- tmp_ret = GetHDCPKeyFromFile(0, CC_HDCP_KEY_TOTAL_SIZE, hdcp_key_buf);
- if (tmp_ret < 0) {
- rd_size = ReadKeyData(CS_RX_HDCP_KEY_NAME, CC_HDCP_KEY_TOTAL_SIZE, tmp_buf);
- LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size);
- if (rd_size == CC_HDCP_KEY_TOTAL_SIZE) {
- memcpy(hdcp_key_buf, tmp_buf, CC_HDCP_KEY_TOTAL_SIZE);
- }
-
- return rd_size;
- }
-
- return CC_HDCP_KEY_TOTAL_SIZE;
-}
-
-int SSMReadHDCPKeyExcludingHeader(unsigned char hdcp_key_buf[])
-{
- int tmp_ret = 0, rd_size = 0;
- unsigned char tmp_buf[CC_HDCP_KEY_CONTENT_SIZE] = { 0 };
-
- tmp_ret = GetHDCPKeyFromFile(0, CC_HDCP_KEY_CONTENT_SIZE, hdcp_key_buf);
- if (tmp_ret < 0) {
- LOGD("%s, GetHDCPKeyFromFile error = %d\n", __FUNCTION__, tmp_ret);
- return tmp_ret;
- }
-
- return CC_HDCP_KEY_CONTENT_SIZE;
-}
-
-
-int SSMSaveHDCPKey(unsigned char hdcp_key_buf[])
-{
- int tmp_ret = 0, wr_size = 0;
- char tmp_buf[CC_MAX_KEY_DATA_SIZE] = { 0 };
-
- tmp_ret = SaveHDCPKeyToFile(0, CC_HDCP_KEY_TOTAL_SIZE, hdcp_key_buf);
- if (tmp_ret < 0) {
- TransToHexString(CC_HDCP_KEY_TOTAL_SIZE, tmp_buf, hdcp_key_buf);
-
- wr_size = strlen(tmp_buf);
- tmp_ret = WriteKeyData(CS_RX_HDCP_KEY_NAME, wr_size, tmp_buf);
- if (tmp_ret != wr_size) {
- tmp_ret = -1;
- }
- }
-
- return tmp_ret;
-}
-
-int SSMSetHDCPKey()
-{
- int i = 0;
- unsigned char hdcp_key_buf[CC_HDCP_KEY_TOTAL_SIZE];
- unsigned char *hdcp_key_head_ptr = NULL;
-
- if (GetSSMHandleHDCPKeyEnableCFG() == 1) {
- if (GetSSMHandleHDCPKeyDemoEnableCFG() == 1) {
- return SSMSetDefaultHDCPKey(hdcp_key_buf);
- } else if (GetSSMHandleHDCPKeyHeaderEnableCFG() == 1) {
- LOGD("%s, handle hdcp key excluding header.\n", __FUNCTION__);
- //copy header
- hdcp_key_head_ptr = mHDCPKeyDefHeaderBuf;
- memcpy(hdcp_key_buf, hdcp_key_head_ptr, CC_HDCP_KEY_HEAD_SIZE);
- //load content and copy, then set
- unsigned char hdcp_key_content_buf[CC_HDCP_KEY_CONTENT_SIZE];
- if (SSMReadHDCPKeyExcludingHeader(hdcp_key_content_buf) == CC_HDCP_KEY_CONTENT_SIZE) {
- memcpy(hdcp_key_buf + 40, hdcp_key_content_buf, CC_HDCP_KEY_CONTENT_SIZE);
- LOGD("%s, using ssm's hdcp key.\n", __FUNCTION__);
- return RealHandleHDCPKey(hdcp_key_buf);
- }
- } else {
- if (SSMReadHDCPKey(hdcp_key_buf) == CC_HDCP_KEY_TOTAL_SIZE) {
- LOGD("%s, using ssm's hdcp key.\n", __FUNCTION__);
- return RealHandleHDCPKey(hdcp_key_buf);
- }
- }
- }
-
- return -1;
-}
-
-int SSMRefreshHDCPKey()
-{
- int ret = -1;
- ret = SSMSetHDCPKey();
- system ( "/system/bin/dec" );
- return ret;
-}
-
-int SSMGetHDCPKeyDataLen()
-{
- return CC_HDCP_KEY_TOTAL_SIZE;
-}
-
-//hdmi edid
-int SSMSetHDMIEdid(int port)
-{
- int i = 0;
- unsigned char customer_hdmi_edid_buf[CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE];
- unsigned char hdmi_edid_buf[SSM_HDMI_EDID_SIZE];
-
- if (port < 1 && port > SSM_HDMI_PORT_MAX) {
- LOGD("%s, hdmi port error.%d\n", __FUNCTION__, port);
- return -1;
- }
-
- if (GetSSMHandleHDMIEdidByCustomerEnableCFG() == 1) {
- if (SSMReadHDMIEdid(port, hdmi_edid_buf) == 0) {
- LOGD("%s, using ssm's hdmi edid.\n", __FUNCTION__);
- LOGD("%s, begin to write hdmi edid:0x%x, 0x%x, 0x%x, 0x%x.\n",
- __FUNCTION__, hdmi_edid_buf[8], hdmi_edid_buf[9],
- hdmi_edid_buf[10], hdmi_edid_buf[255]);
- if (AppendEdidPrefixCode(customer_hdmi_edid_buf, hdmi_edid_buf)
- == 0)
- ;
- return RealHandleHDMIEdid(customer_hdmi_edid_buf);
- }
- }
-
- return -1;
-}
-
-int SSMReadHDMIEdid(int port, unsigned char hdmi_edid_buf[])
-{
- int tmp_ret = 0;
- LOGD("%s, read hdmi edid from bin file.\n", __FUNCTION__);
- tmp_ret = GetHDMIEdidFromFile(0, SSM_HDMI_EDID_SIZE, port, hdmi_edid_buf);
- if (tmp_ret < 0) {
- LOGD("%s, read hdmi edid error.\n", __FUNCTION__);
- } else {
- LOGD("%s, 0x%x, 0x%x, 0x%x, 0x%x.\n", __FUNCTION__, hdmi_edid_buf[8],
- hdmi_edid_buf[9], hdmi_edid_buf[10], hdmi_edid_buf[255]);
- }
- return tmp_ret;
-}
-
-int KeyData_SaveProjectID(int rw_val)
-{
- int tmp_ret = 0, wr_size = 0;
- char tmp_buf[64] = { 0 };
-
- sprintf(tmp_buf, "%08X", rw_val);
-
- wr_size = strlen(tmp_buf);
- tmp_ret = WriteKeyData(CS_PROJECT_ID_KEY_NAME, wr_size, tmp_buf);
- if (tmp_ret != wr_size) {
- return -1;
- }
-
- return 0;
-}
-
-int KeyData_ReadProjectID()
-{
- int rd_size = 0, tmp_val = 0;
- unsigned char tmp_buf[64] = { 0 };
-
- rd_size = ReadKeyData(CS_PROJECT_ID_KEY_NAME, 4, tmp_buf);
- LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size);
- if (rd_size == 4) {
- tmp_val = 0;
- tmp_val |= tmp_buf[0] << 24;
- tmp_val |= tmp_buf[1] << 16;
- tmp_val |= tmp_buf[2] << 8;
- tmp_val |= tmp_buf[3] << 0;
- }
-
- return tmp_val;
-}
-
-int SSMSaveRGBOGOValue(int offset, int size, unsigned char data_buf[])
-{
- return SaveRGBOGOToFile(offset, size, data_buf);
-}
-
-int SSMReadRGBOGOValue(int offset, int size, unsigned char data_buf[])
-{
- return GetRGBOGOFromFile(offset, size, data_buf);
-}
-
-int SSMSaveAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[])
-{
- return SaveAudioNoLinePointsDataToFile(offset, size, tmp_buf);
-}
-
-int SSMReadAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[])
-{
- return GetAudioNoLinePointsDataFromFile(offset, size, tmp_buf);
-}
-
-/**************************** start mac address static functions ****************************/
-#define CC_ERR_THREAD_ID (0)
-
-static pthread_t mMacAddressStartWorkThreadID = CC_ERR_THREAD_ID;
-
-static volatile unsigned int mMacAddressLow = -1;
-static volatile unsigned int mMacAddressHigh = -1;
-static volatile int mMacAddressStartWorkThreadExecFlag = -1;
-static volatile int mMacAddressStartWorkThreadTurnOnFlag = -1;
-
-static pthread_mutex_t mac_address_low_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t mac_address_high_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t mac_address_exec_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t mac_address_turnon_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-static int GetSSMMacAddressStartWorkEnableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_MAC_ADDRESS_STARTWRK_EN_CFG, "null");
- if (strcmp(config_value, "null") == 0) {
- LOGD(
- "%s, get config is \"%s\", return 0 to not enable mac address start work.\n",
- __FUNCTION__, config_value);
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-static unsigned int SetMacAddressLow(unsigned int low_val)
-{
- unsigned int tmp_val;
-
- pthread_mutex_lock(&mac_address_low_mutex);
-
- tmp_val = mMacAddressLow;
-
- mMacAddressLow = low_val;
-
- pthread_mutex_unlock(&mac_address_low_mutex);
-
- return tmp_val;
-}
-
-static unsigned int GetMacAddressLow()
-{
- unsigned int tmp_val = 0;
-
- pthread_mutex_lock(&mac_address_low_mutex);
-
- tmp_val = mMacAddressLow;
-
- pthread_mutex_unlock(&mac_address_low_mutex);
-
- return tmp_val;
-}
-
-static unsigned int SetMacAddressHigh(unsigned int high_val)
-{
- unsigned int tmp_val;
-
- pthread_mutex_lock(&mac_address_high_mutex);
-
- tmp_val = mMacAddressHigh;
-
- mMacAddressHigh = high_val;
-
- pthread_mutex_unlock(&mac_address_high_mutex);
-
- return tmp_val;
-}
-
-static unsigned int GetMacAddressHigh()
-{
- int tmp_val = 0;
-
- pthread_mutex_lock(&mac_address_high_mutex);
-
- tmp_val = mMacAddressHigh;
-
- pthread_mutex_unlock(&mac_address_high_mutex);
-
- return tmp_val;
-}
-
-static int SetMacAddressStartWorkThreadExecFlag(int tmp_flag)
-{
- int tmp_val;
-
- pthread_mutex_lock(&mac_address_exec_mutex);
-
- tmp_val = mMacAddressStartWorkThreadExecFlag;
-
- mMacAddressStartWorkThreadExecFlag = tmp_flag;
-
- pthread_mutex_unlock(&mac_address_exec_mutex);
-
- return tmp_val;
-}
-
-static int GetMacAddressStartWorkThreadExecFlag()
-{
- int tmp_val = 0;
-
- pthread_mutex_lock(&mac_address_exec_mutex);
-
- tmp_val = mMacAddressStartWorkThreadExecFlag;
-
- pthread_mutex_unlock(&mac_address_exec_mutex);
-
- return tmp_val;
-}
-
-static int SetMacAddressStartWorkThreadTurnOnFlag(int tmp_flag)
-{
- int tmp_val;
-
- pthread_mutex_lock(&mac_address_turnon_mutex);
-
- tmp_val = mMacAddressStartWorkThreadTurnOnFlag;
-
- mMacAddressStartWorkThreadTurnOnFlag = tmp_flag;
-
- pthread_mutex_unlock(&mac_address_turnon_mutex);
-
- return tmp_val;
-}
-
-static int GetMacAddressStartWorkThreadTurnOnFlag()
-{
- int tmp_val = 0;
-
- pthread_mutex_lock(&mac_address_turnon_mutex);
-
- tmp_val = mMacAddressStartWorkThreadTurnOnFlag;
-
- pthread_mutex_unlock(&mac_address_turnon_mutex);
-
- return tmp_val;
-}
-
-static void *SSMMacAddressStartWorkMainApp(void *data)
-{
- unsigned int curMacAddrLow = 0, curMacAddrHigh = 0;
- int p_status;
- char ssm_addr_str[128];
- const char *iname = "eth0";
- pid_t pid;
-
- LOGD("%s, entering...\n", __FUNCTION__);
-
- if (GetSSMMacAddressStartWorkEnableCFG() == 0) {
- LOGE("%s, ssm mac address start work is not enable.\n", "TV");
- return NULL;
- }
-
- curMacAddrLow = GetMacAddressLow();
- curMacAddrHigh = GetMacAddressHigh();
-
- while (GetMacAddressStartWorkThreadTurnOnFlag() == 1) {
- pid = fork();
- if (pid == 0) {
- if (execl("/system/bin/stop", "stop_eth_dhcpcd", "eth_dhcpcd", NULL)
- < 0) {
- _exit(-1);
- }
- _exit(0);
- }
- waitpid(pid, &p_status, 0);
-
- ifc_init();
-
- ifc_down(iname);
-
- sprintf(ssm_addr_str, "%02x:%02x:%02x:%02x:%02x:%02x",
- ((curMacAddrLow >> 0) & 0xFF), ((curMacAddrLow >> 8) & 0xFF),
- ((curMacAddrLow >> 16) & 0xFF), ((curMacAddrLow >> 24) & 0xFF),
- ((curMacAddrHigh >> 0) & 0xFF), ((curMacAddrHigh >> 8) & 0xFF));
- struct ether_addr *addr = ether_aton(ssm_addr_str);
- if (addr) {
- ifc_set_hwaddr(iname, addr->ether_addr_octet);
- }
-
- ifc_up(iname);
-
- ifc_close();
-
- if (curMacAddrLow == GetMacAddressLow()
- && curMacAddrHigh == GetMacAddressHigh()) {
- break;
- }
-
- curMacAddrLow = GetMacAddressLow();
- curMacAddrHigh = GetMacAddressHigh();
- }
-
- return NULL;
-}
-
-static void *SSMMacAddressStartWorkThreadMain(void *data)
-{
- void *tmp_ret = NULL;
-
- SetMacAddressStartWorkThreadExecFlag(1);
-
- tmp_ret = SSMMacAddressStartWorkMainApp(NULL);
-
- SetMacAddressStartWorkThreadExecFlag(0);
-
- return tmp_ret;
-}
-
-static int KillMacAddressStartWorkThread()
-{
- int i = 0, tmp_timeout_count = 600;
-
- SetMacAddressStartWorkThreadTurnOnFlag(0);
- while (1) {
- if (GetMacAddressStartWorkThreadExecFlag() == 0) {
- break;
- }
-
- if (i >= tmp_timeout_count) {
- break;
- }
-
- i++;
-
- usleep(100 * 1000);
- }
-
- if (i == tmp_timeout_count) {
- LOGE(
- "%s, we have try %d times, but the mac address start work thread's exec flag is still(%d)!!!\n",
- "TV", tmp_timeout_count,
- GetMacAddressStartWorkThreadExecFlag());
- return -1;
- }
-
- pthread_join(mMacAddressStartWorkThreadID, NULL);
- mMacAddressStartWorkThreadID = CC_ERR_THREAD_ID;
-
- LOGD("%s, kill the mac address start work thread sucess.\n", __FUNCTION__);
-
- return 0;
-}
-
-static int CreateMacAddressStartWorkThread()
-{
- unsigned int macAddrLow = 0, macAddrHigh = 0;
- pthread_attr_t attr;
- struct sched_param param;
- unsigned char ssm_addr_buf[16] = { 0, 0, 0, 0, 0, 0 };
-
- if (KeyData_ReadMacAddress(ssm_addr_buf) < 0) {
- return -1;
- }
-
- macAddrLow = 0;
- macAddrLow |= ((ssm_addr_buf[0] & 0xFF) << 0);
- macAddrLow |= ((ssm_addr_buf[1] & 0xFF) << 8);
- macAddrLow |= ((ssm_addr_buf[2] & 0xFF) << 16);
- macAddrLow |= ((ssm_addr_buf[3] & 0xFF) << 24);
-
- macAddrHigh = 0;
- macAddrHigh |= ((ssm_addr_buf[4] & 0xFF) << 0);
- macAddrHigh |= ((ssm_addr_buf[5] & 0xFF) << 8);
-
- if (mMacAddressStartWorkThreadID != CC_ERR_THREAD_ID) {
- if (GetMacAddressStartWorkThreadExecFlag() == 1) {
- SetMacAddressLow(macAddrLow);
- SetMacAddressHigh(macAddrHigh);
- return 0;
- } else {
- KillMacAddressStartWorkThread();
- }
- }
-
- SetMacAddressLow(macAddrLow);
- SetMacAddressHigh(macAddrHigh);
- SetMacAddressStartWorkThreadTurnOnFlag(1);
-
- pthread_attr_init(&attr);
- pthread_attr_setschedpolicy(&attr, SCHED_RR);
- param.sched_priority = 20;
- pthread_attr_setschedparam(&attr, &param);
-
- if (pthread_create(&mMacAddressStartWorkThreadID, &attr,
- SSMMacAddressStartWorkThreadMain, NULL) < 0) {
- pthread_attr_destroy(&attr);
- mMacAddressStartWorkThreadID = CC_ERR_THREAD_ID;
- return -1;
- }
-
- pthread_attr_destroy(&attr);
-
- LOGD("%s, create channel select thread sucess.\n", __FUNCTION__);
-
- return 0;
-}
-/**************************** end mac address static functions ****************************/
-
-/**************************** start hdcp key static functions ****************************/
-static int GetSSMHandleHDCPKeyEnableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_HDCP_KEY_EN_CFG, "null");
-#if 0
- LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDCP_KEY_EN_CFG,
- config_value);
-#endif
- if (strcmp(config_value, "null") == 0) {
- LOGD(
- "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdcp key.\n",
- __FUNCTION__, CS_HDCP_KEY_EN_CFG, config_value);
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-static int GetSSMHandleHDCPKeyDemoEnableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_HDCP_KEY_DEMO_EN_CFG, "null");
-#if 0
- LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDCP_KEY_DEMO_EN_CFG,
- config_value);
-#endif
- if (strcmp(config_value, "null") == 0) {
- LOGD(
- "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdcp key demo.\n",
- __FUNCTION__, CS_HDCP_KEY_DEMO_EN_CFG, config_value);
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-static int GetSSMHandleHDCPKeyHeaderEnableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_HDCP_KEY_HEADER_EN_CFG, "null");
-#if 1
- LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDCP_KEY_HEADER_EN_CFG,
- config_value);
-#endif
- if (strcmp(config_value, "null") == 0) {
- LOGD(
- "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdcp key header.\n",
- __FUNCTION__, CS_HDCP_KEY_HEADER_EN_CFG, config_value);
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-
-static int SSMSetDefaultHDCPKey(unsigned char hdcp_key_buf[])
-{
- int i = 0;
-
- for (i = 0; i < CC_HDCP_KEY_HEAD_SIZE; i++) {
- hdcp_key_buf[i] = mHDCPKeyDefHeaderBuf[i];
- }
-
- for (i = 0; i < CC_HDCP_KEY_CONTENT_SIZE; i++) {
- hdcp_key_buf[i + CC_HDCP_KEY_HEAD_SIZE] = mDefHDCPKeyContentBuf[i];
- }
-
- LOGD("%s, using default hdcp key.\n", __FUNCTION__);
-
- return RealHandleHDCPKey(hdcp_key_buf);
-}
-
-static int RealHandleHDCPKey(unsigned char hdcp_key_buf[])
-{
- int i = 0, dev_fd = -1;
-
- if (hdcp_key_buf == NULL) {
- return -1;
- }
-
- dev_fd = open("/sys/class/hdmirx/hdmirx0/edid", O_RDWR);
- if (dev_fd < 0) {
- LOGE("%s, open edid file ERROR(%s)!!\n", "TV", strerror(errno));
- return -1;
- }
-
- if (write(dev_fd, hdcp_key_buf, CC_HDCP_KEY_TOTAL_SIZE) < 0) {
- close(dev_fd);
- dev_fd = -1;
- LOGE("%s, write edid file ERROR(%s)!!\n", "TV", strerror(errno));
-
- return -1;
- }
-
- close(dev_fd);
- dev_fd = -1;
- return 0;
-}
-
-/**************************** end hdcp key static functions ****************************/
-
-/**************************** start hdmi edid static functions ****************************/
-static int GetSSMHandleHDMIEdidByCustomerEnableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_HDMI_EDID_EN_CFG, "null");
-#if 0
- LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDMI_EDID_EN_CFG,
- config_value);
-#endif
- if (strcmp(config_value, "null") == 0) {
- LOGD(
- "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdmi edid by customer.\n",
- __FUNCTION__, CS_HDMI_EDID_EN_CFG, config_value);
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-static int RealHandleHDMIEdid(unsigned char customer_hdmi_edid_buf[])
-{
- int i = 0, dev_fd = -1;
-
- if (customer_hdmi_edid_buf == NULL) {
- return -1;
- }
-
- dev_fd = open("/sys/class/hdmirx/hdmirx0/edid", O_RDWR);
- if (dev_fd < 0) {
- LOGE("%s, open edid file ERROR(%s)!!\n", "TV", strerror(errno));
- return -1;
- }
-
- if (write(dev_fd, customer_hdmi_edid_buf, CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE)
- < 0) {
- close(dev_fd);
- dev_fd = -1;
- LOGE("%s, write edid file ERROR(%s)!!\n", "TV", strerror(errno));
-
- return -1;
- }
-
- close(dev_fd);
- dev_fd = -1;
- return 0;
-}
-
-static int AppendEdidPrefixCode(unsigned char customer_hdmi_edid_buf[],
- unsigned char hdmi_edid_buf[])
-{
- if (customer_hdmi_edid_buf == NULL || hdmi_edid_buf == NULL) {
- LOGE("%s, Append hdmi edid's prefixCode ERROR(%s)!!\n", "TV",
- strerror(errno));
- return -1;
- }
- memset(customer_hdmi_edid_buf, 0,
- sizeof(char) * CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE);
- customer_hdmi_edid_buf[0] = 'E';
- customer_hdmi_edid_buf[1] = 'D';
- customer_hdmi_edid_buf[2] = 'I';
- customer_hdmi_edid_buf[3] = 'D';
- memcpy(customer_hdmi_edid_buf + 4, hdmi_edid_buf,
- CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE - 4);
- /*
- LOGD("%s, customer_hdmi_edid_buf: %c,%c,%c,%c,%x,%x,%x,%x.\n", __FUNCTION__,
- customer_hdmi_edid_buf[0],customer_hdmi_edid_buf[1],customer_hdmi_edid_buf[2],customer_hdmi_edid_buf[3],
- customer_hdmi_edid_buf[12],customer_hdmi_edid_buf[13],customer_hdmi_edid_buf[14],customer_hdmi_edid_buf[15]);*/
- /*
- LOGD("%s, customer_hdmi_edid_buf: \n", __FUNCTION__);
- int i, j;
- for (i = 0; i < 16; i++) {
- LOGD("[%2d] ", i);
- for (j = 0; j < 16; j++) {
- LOGD("0x%02lx, ", customer_hdmi_edid_buf[4 + (i*16 + j)]);
- }
- LOGD("\n");
- }*/
- return 0;
-}
-
-/**************************** end hdmi edid static functions ****************************/
-
-/**************************** start critical data op functions ****************************/
-#define CC_OP_TYPE_READ (0)
-#define CC_OP_TYPE_SAVE (1)
-#define CC_DATA_TYPE_CHAR (0)
-#define CC_DATA_TYPE_INT (1)
-
-typedef int (*op_fun_ptr)(char *, int, int, unsigned char *);
-
-typedef struct tagRWDataInfo {
- int op_type;
- int data_type;
- int max_size;
- int rw_off;
- int rw_size;
- void *data_buf;
- char *path_cfg_name;
- char *off_cfg_name;
- op_fun_ptr op_cb;
-} RWDataInfo;
-
-static int GetFilePathCFG(char *key_str, char path_buf[])
-{
- int tmp_ret = 0;
- const char *cfg_value;
-
- path_buf[0] = '\0';
- cfg_value = config_get_str("TV", key_str, "");
- strcpy(path_buf, cfg_value);
-#if 0
- LOGD("%s, get \"%s\" is \"%s\".\n", "TV", key_str, path_buf);
-#endif
- return tmp_ret;
-}
-
-static int GetFileOffsetCFG(char *key_str)
-{
- const char *cfg_value;
-
- cfg_value = config_get_str("TV", key_str, "null");
-#if 0
- LOGD("%s, get \"%s\" is \"%s\".\n", "TV", key_str, cfg_value);
-#endif
- if (strcmp(cfg_value, "null") == 0) {
- LOGD("%s, get config \"%s\" is \"%s\", return 0 for default.\n", "TV",
- key_str, cfg_value);
- return 0;
- }
-
- return strtol(cfg_value, NULL, 10);
-}
-
-static int handleDataFilePath(char *file_name, int offset, int nsize,
- char file_path[])
-{
- if (file_name == NULL) {
- LOGE("%s, file_name is NULL!!!\n", "TV");
- return -1;
- }
-
- return 0;
-}
-
-static int ReadDataFromFile(char *file_name, int offset, int nsize,
- unsigned char data_buf[])
-{
- int device_fd = -1;
- int tmp_ret = 0;
- char *tmp_ptr = NULL;
- char file_path[512] = { '\0' };
-
- if (data_buf == NULL) {
- LOGE("%s, data_buf is NULL!!!\n", "TV");
- return -1;
- }
-
- tmp_ret = handleDataFilePath(file_name, offset, nsize, file_path);
- if (tmp_ret < 0) {
- tmp_ptr = NULL;
- } else if (tmp_ret == 0) {
- tmp_ptr = file_name;
- } else if (tmp_ret == 1) {
- tmp_ptr = file_path;
- }
-
- if (tmp_ptr == NULL) {
- return -1;
- }
-
- device_fd = open(tmp_ptr, O_RDONLY);
- if (device_fd < 0) {
- LOGE("%s: open file \"%s\" error(%s).\n", "TV", file_name,
- strerror(errno));
- return -1;
- }
-
- lseek(device_fd, offset, SEEK_SET);
- read(device_fd, data_buf, nsize);
-
- close(device_fd);
- device_fd = -1;
-
- return 0;
-}
-
-static int SaveDataToFile(char *file_name, int offset, int nsize,
- unsigned char data_buf[])
-{
- int device_fd = -1;
- int i = 0, tmp_ret = 0;
- char *tmp_ptr = NULL;
- char file_path[512] = { '\0' };
-
- if (data_buf == NULL) {
- LOGE("%s, data_buf is NULL!!!\n", "TV");
- return -1;
- }
-
- tmp_ret = handleDataFilePath(file_name, offset, nsize, file_path);
- if (tmp_ret < 0) {
- tmp_ptr = NULL;
- } else if (tmp_ret == 0) {
- tmp_ptr = file_name;
- } else if (tmp_ret == 1) {
- tmp_ptr = file_path;
- }
-
- if (tmp_ptr == NULL) {
- return -1;
- }
-
- device_fd = open(tmp_ptr, O_RDWR | O_SYNC);
- if (device_fd < 0) {
- LOGE("%s: open file \"%s\" error(%s).\n", "TV", file_name,
- strerror(errno));
- return -1;
- }
-
- lseek(device_fd, offset, SEEK_SET);
- write(device_fd, data_buf, nsize);
- fsync(device_fd);
-
- close(device_fd);
- device_fd = -1;
-
- return 0;
-}
-
-static int RealRWData(RWDataInfo *data_info)
-{
- int i = 0, file_off = 0;
- char file_name[256] = { '\0' };
-
- memset(file_name, '\0', 256);
- GetFilePathCFG(data_info->path_cfg_name, file_name);
-#if 0
- LOGD("%s, file_name is %s.\n", __FUNCTION__, file_name);
-#endif
- if (strlen(file_name) == 0) {
- LOGE("%s, length of file_name is 0!!!\n", "TV");
- return -2;
- }
-
- if (data_info->rw_off < 0) {
- LOGE("%s, data_info->rw_off (%d) is less than 0!!!\n", "TV",
- data_info->rw_off);
- return -1;
- }
-
- if (data_info->rw_off + data_info->rw_size > data_info->max_size) {
- LOGE(
- "%s, data_info->rw_off + data_info->rw_size (%d) is more than data_info->max_size(%d) !!!\n",
- "TV", data_info->rw_off + data_info->rw_size,
- data_info->max_size);
- return -1;
- }
-
- file_off = GetFileOffsetCFG(data_info->off_cfg_name);
- if (file_off < 0) {
- LOGE("%s, file_off (%d) is less than 0!!!\n", "TV", file_off);
- return -1;
- }
-
- file_off += data_info->rw_off;
-
- if (data_info->op_cb(file_name, file_off, data_info->rw_size,
- (unsigned char *) data_info->data_buf) < 0) {
- return -1;
- }
-
- return 0;
-}
-
-static int HandleRWData(RWDataInfo *data_info)
-{
- int i = 0, tmp_ret = 0;
- int *tmp_iptr = NULL;
- unsigned char *tmp_cptr = NULL;
- RWDataInfo tmpInfo;
-
- if (data_info == NULL) {
- return -1;
- }
-
- tmpInfo = *data_info;
-
- if (data_info->data_type == CC_DATA_TYPE_INT) {
- tmp_cptr = new unsigned char[data_info->rw_size];
- if (tmp_cptr != NULL) {
- tmpInfo.data_buf = tmp_cptr;
-
- if (tmpInfo.op_type == CC_OP_TYPE_SAVE) {
- tmp_iptr = (int *) data_info->data_buf;
- for (i = 0; i < data_info->rw_size; i++) {
- tmp_cptr[i] = tmp_iptr[i];
- }
-
- tmp_ret |= RealRWData(&tmpInfo);
- } else {
- tmp_ret |= RealRWData(&tmpInfo);
-
- tmp_iptr = (int *) data_info->data_buf;
- for (i = 0; i < data_info->rw_size; i++) {
- tmp_iptr[i] = tmp_cptr[i];
- }
- }
-
- delete tmp_cptr;
- tmp_cptr = NULL;
-
- return tmp_ret;
- }
- }
-
- return RealRWData(&tmpInfo);
-}
-
-static int GetRGBOGOFromFile(int rd_off, int rd_size,
- unsigned char data_buf[])
-{
- RWDataInfo tmpInfo;
-
- tmpInfo.op_type = CC_OP_TYPE_READ;
- tmpInfo.data_type = CC_DATA_TYPE_CHAR;
- tmpInfo.max_size = SSM_CR_RGBOGO_LEN + SSM_CR_RGBOGO_CHKSUM_LEN;
- tmpInfo.rw_off = rd_off;
- tmpInfo.rw_size = rd_size;
- tmpInfo.data_buf = data_buf;
- tmpInfo.path_cfg_name = (char *) CS_RGBOGO_FILE_PATH_CFG;
- tmpInfo.off_cfg_name = (char *) CS_RGBOGO_FILE_OFFSET_CFG;
- tmpInfo.op_cb = ReadDataFromFile;
-
- return HandleRWData(&tmpInfo);
-}
-
-static int SaveRGBOGOToFile(int wr_off, int wr_size, unsigned char data_buf[])
-{
- RWDataInfo tmpInfo;
-
- tmpInfo.op_type = CC_OP_TYPE_SAVE;
- tmpInfo.data_type = CC_DATA_TYPE_CHAR;
- tmpInfo.max_size = SSM_CR_RGBOGO_LEN + SSM_CR_RGBOGO_CHKSUM_LEN;
- tmpInfo.rw_off = wr_off;
- tmpInfo.rw_size = wr_size;
- tmpInfo.data_buf = data_buf;
- tmpInfo.path_cfg_name = (char *) CS_RGBOGO_FILE_PATH_CFG;
- tmpInfo.off_cfg_name = (char *) CS_RGBOGO_FILE_OFFSET_CFG;
- tmpInfo.op_cb = SaveDataToFile;
-
- return HandleRWData(&tmpInfo);
-}
-
-static int GetAudioNoLinePointsDataFromFile(int rd_off, int rd_size,
- unsigned char data_buf[])
-{
- RWDataInfo tmpInfo;
-
- tmpInfo.op_type = CC_OP_TYPE_READ;
- tmpInfo.data_type = CC_DATA_TYPE_CHAR;
- tmpInfo.max_size = 256;
- tmpInfo.rw_off = rd_off;
- tmpInfo.rw_size = rd_size;
- tmpInfo.data_buf = data_buf;
- tmpInfo.path_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_PATH_CFG;
- tmpInfo.off_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_OFFSET_CFG;
- tmpInfo.op_cb = ReadDataFromFile;
-
- return HandleRWData(&tmpInfo);
-}
-
-static int SaveAudioNoLinePointsDataToFile(int wr_off, int wr_size,
- unsigned char data_buf[])
-{
- RWDataInfo tmpInfo;
-
- tmpInfo.op_type = CC_OP_TYPE_SAVE;
- tmpInfo.data_type = CC_DATA_TYPE_CHAR;
- tmpInfo.max_size = 256;
- tmpInfo.rw_off = wr_off;
- tmpInfo.rw_size = wr_size;
- tmpInfo.data_buf = data_buf;
- tmpInfo.path_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_PATH_CFG;
- tmpInfo.off_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_OFFSET_CFG;
- tmpInfo.op_cb = SaveDataToFile;
-
- return HandleRWData(&tmpInfo);
-}
-
-static int GetHDCPKeyFromFile(int rd_off, int rd_size,
- unsigned char data_buf[])
-{
- RWDataInfo tmpInfo;
-
- tmpInfo.op_type = CC_OP_TYPE_READ;
- tmpInfo.data_type = CC_DATA_TYPE_CHAR;
- tmpInfo.max_size = CC_HDCP_KEY_TOTAL_SIZE;
- tmpInfo.rw_off = rd_off;
- tmpInfo.rw_size = rd_size;
- tmpInfo.data_buf = data_buf;
- tmpInfo.path_cfg_name = (char *) CS_HDCP_KEY_FILE_PATH_CFG;
- tmpInfo.off_cfg_name = (char *) CS_HDCP_KEY_FILE_OFFSET_CFG;
- tmpInfo.op_cb = ReadDataFromFile;
-
- return HandleRWData(&tmpInfo);
-}
-
-static int SaveHDCPKeyToFile(int wr_off, int wr_size,
- unsigned char data_buf[])
-{
- RWDataInfo tmpInfo;
-
- tmpInfo.op_type = CC_OP_TYPE_SAVE;
- tmpInfo.data_type = CC_DATA_TYPE_CHAR;
- tmpInfo.max_size = CC_HDCP_KEY_TOTAL_SIZE;
- tmpInfo.rw_off = wr_off;
- tmpInfo.rw_size = wr_size;
- tmpInfo.data_buf = data_buf;
- tmpInfo.path_cfg_name = (char *) CS_HDCP_KEY_FILE_PATH_CFG;
- tmpInfo.off_cfg_name = (char *) CS_HDCP_KEY_FILE_OFFSET_CFG;
- tmpInfo.op_cb = SaveDataToFile;
-
- return HandleRWData(&tmpInfo);
-}
-
-static int GetHDMIEdidFromFile(int rd_off, int rd_size, int port,
- unsigned char data_buf[])
-{
- RWDataInfo tmpInfo;
-
- tmpInfo.op_type = CC_OP_TYPE_READ;
- tmpInfo.data_type = CC_DATA_TYPE_CHAR;
- tmpInfo.max_size = SSM_HDMI_EDID_SIZE;
- tmpInfo.rw_off = rd_off;
- tmpInfo.rw_size = rd_size;
- tmpInfo.data_buf = data_buf;
- switch (port) {
- case 1:
- tmpInfo.path_cfg_name = (char *) CS_HDMI_PORT1_EDID_FILE_PATH_CFG;
- break;
- case 2:
- tmpInfo.path_cfg_name = (char *) CS_HDMI_PORT2_EDID_FILE_PATH_CFG;
- break;
- case 3:
- tmpInfo.path_cfg_name = (char *) CS_HDMI_PORT3_EDID_FILE_PATH_CFG;
- break;
- default:
- LOGE("%s, port is error, =%d\n", "TV", port);
- tmpInfo.path_cfg_name = (char *) CS_HDMI_EDID_FILE_PATH_CFG;
- break;
- }
- tmpInfo.off_cfg_name = (char *) CS_HDMI_EDID_FILE_OFFSET_CFG;
- tmpInfo.op_cb = ReadDataFromFile;
-
- return HandleRWData(&tmpInfo);
-}
-
-/**************************** end critical data op functions ****************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <cutils/properties.h>
+
+#include <netinet/ether.h>
+#include <netinet/if_ether.h>
+
+#include <netutils/ifc.h>
+#include <netutils/dhcp.h>
+
+#include "tvconfig/tvconfig.h"
+#include "CTvSettingCfg.h"
+#include "TvKeyData.h"
+
+
+static unsigned char mHDCPKeyDefHeaderBuf[CC_HDCP_KEY_HEAD_SIZE] = {
+ //40 bytes
+ 0x53, 0x4B, 0x59, 0x01, 0x00, 0x10, 0x0D, 0x15, 0x3A, 0x8E, // 000~009
+ 0x99, 0xEE, 0x2A, 0x55, 0x58, 0xEE, 0xED, 0x4B, 0xBE, 0x00, // 010~019
+ 0x74, 0xA9, 0x00, 0x10, 0x0A, 0x21, 0xE3, 0x30, 0x66, 0x34, // 020~029
+ 0xCE, 0x9C, 0xC7, 0x8B, 0x51, 0x27, 0xF9, 0x0B, 0xAD, 0x09, // 030~039
+};
+
+static unsigned char mDefHDCPKeyContentBuf[CC_HDCP_KEY_CONTENT_SIZE] = {
+ //328 bytes
+ 0x5F, 0x4D, 0xC2, 0xCA, 0xA2, 0x13, 0x06, 0x18, 0x8D, 0x34, // 000~009
+ 0x82, 0x46, 0x2D, 0xC9, 0x4B, 0xB0, 0x1C, 0xDE, 0x3D, 0x49, // 010~019
+ 0x39, 0x58, 0xEF, 0x2B, 0x68, 0x39, 0x71, 0xC9, 0x4D, 0x25, // 020~029
+ 0xE9, 0x75, 0x4D, 0xAC, 0x62, 0xF5, 0xF5, 0x87, 0xA0, 0xB2, // 030~039
+ 0x4A, 0x60, 0xD3, 0xF1, 0x09, 0x3A, 0xB2, 0x3E, 0x19, 0x4F, // 040~049
+ 0x3B, 0x1B, 0x2F, 0x85, 0x14, 0x28, 0x44, 0xFC, 0x69, 0x6F, // 050~059
+ 0x50, 0x42, 0x81, 0xBF, 0x7C, 0x2B, 0x3A, 0x17, 0x2C, 0x15, // 060~069
+ 0xE4, 0x93, 0x77, 0x74, 0xE8, 0x1F, 0x1C, 0x38, 0x54, 0x49, // 070~079
+ 0x10, 0x64, 0x5B, 0x7D, 0x90, 0x3D, 0xA0, 0xE1, 0x8B, 0x67, // 080~089
+ 0x5C, 0x19, 0xE6, 0xCA, 0x9D, 0xE9, 0x68, 0x5A, 0xB5, 0x62, // 090~099
+ 0xDF, 0xA1, 0x28, 0xBC, 0x68, 0x82, 0x9A, 0x22, 0xC4, 0xDC, // 100~109
+ 0x48, 0x85, 0x0F, 0xF1, 0x3E, 0x05, 0xDD, 0x1B, 0x2D, 0xF5, // 120~119
+ 0x49, 0x3A, 0x15, 0x29, 0xE7, 0xB6, 0x0B, 0x2A, 0x40, 0xE3, // 120~129
+ 0xB0, 0x89, 0xD5, 0x75, 0x84, 0x2E, 0x76, 0xE7, 0xBC, 0x63, // 130~139
+ 0x67, 0xE3, 0x57, 0x67, 0x86, 0x81, 0xF4, 0xD7, 0xEA, 0x4D, // 140~149
+ 0x89, 0x8E, 0x37, 0x95, 0x59, 0x1C, 0x8A, 0xCD, 0x79, 0xF8, // 150~159
+ 0x4F, 0x82, 0xF2, 0x6C, 0x7E, 0x7F, 0x79, 0x8A, 0x6B, 0x90, // 160~169
+ 0xC0, 0xAF, 0x4C, 0x8D, 0x43, 0x47, 0x1F, 0x9A, 0xF1, 0xBB, // 170~179
+ 0x88, 0x64, 0x49, 0x14, 0x50, 0xD1, 0xC3, 0xDF, 0xA6, 0x87, // 180~189
+ 0xA0, 0x15, 0x98, 0x51, 0x81, 0xF5, 0x97, 0x55, 0x10, 0x4A, // 190~199
+ 0x99, 0x30, 0x54, 0xA4, 0xFC, 0xDA, 0x0E, 0xAC, 0x6A, 0xFA, // 200~209
+ 0x90, 0xEE, 0x12, 0x70, 0x69, 0x74, 0x63, 0x46, 0x63, 0xFB, // 210~219
+ 0xE6, 0x1F, 0x72, 0xEC, 0x43, 0x5D, 0x50, 0xFF, 0x03, 0x4F, // 220~229
+ 0x05, 0x33, 0x88, 0x36, 0x93, 0xE4, 0x72, 0xD5, 0xCC, 0x34, // 230~239
+ 0x52, 0x96, 0x15, 0xCE, 0xD0, 0x32, 0x52, 0x41, 0x4F, 0xBC, // 240~249
+ 0x2D, 0xDF, 0xC5, 0xD6, 0x7F, 0xD5, 0x74, 0xCE, 0x51, 0xDC, // 250~259
+ 0x10, 0x5E, 0xF7, 0xAA, 0x4A, 0x2D, 0x20, 0x9A, 0x17, 0xDD, // 260~269
+ 0x30, 0x89, 0x71, 0x82, 0x36, 0x50, 0x09, 0x1F, 0x7C, 0xF3, // 270~279
+ 0x12, 0xE9, 0x43, 0x10, 0x5F, 0x51, 0xBF, 0xB8, 0x45, 0xA8, // 280~289
+ 0x5A, 0x8D, 0x3F, 0x77, 0xE5, 0x96, 0x73, 0x68, 0xAB, 0x73, // 290~299
+ 0xE5, 0x4C, 0xFB, 0xE5, 0x98, 0xB9, 0xAE, 0x74, 0xEB, 0x51, // 300~309
+ 0xDB, 0x91, 0x07, 0x7B, 0x66, 0x02, 0x9B, 0x79, 0x03, 0xC5, // 310~319
+ 0x34, 0x1C, 0x58, 0x13, 0x31, 0xD2, 0x4A, 0xEC, // 320~327
+};
+
+
+static int TransStringToHex(int data_cnt, char data_buf[],
+ unsigned char hex_buf[])
+{
+ int i = 0, j = 0, tmp_val = 0;
+ char tmp_buf[3] = { 0, 0, 0 };
+
+ while (i < data_cnt) {
+ tmp_val = 0;
+ tmp_buf[0] = data_buf[i];
+ tmp_buf[1] = data_buf[i + 1];
+ tmp_val = strtoul(tmp_buf, NULL, 16);
+ hex_buf[j] = tmp_val;
+ //LOGD("%s, hex_buf[%d] = 0x%x\n", __FUNCTION__, j, hex_buf[j]);
+ i += 2;
+ j += 1;
+ }
+
+ return j;
+}
+
+static int TransToHexString(int hex_cnt, char data_buf[],
+ unsigned char hex_buf[])
+{
+ int i = 0, j = 0;
+ char tmp_buf[17] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ data_buf[0] = 0;
+ for (i = 0; i < hex_cnt; i++) {
+ sprintf(tmp_buf, "%02X", (unsigned char) hex_buf[i]);
+ strcat(data_buf, tmp_buf);
+ }
+
+ return 2 * hex_cnt;
+}
+
+int ReadKeyData(const char *key_name, unsigned char data_buf[])
+{
+ FILE *dev_fp = NULL;
+ int i = 0, rd_cnt = 0;
+
+ dev_fp = fopen(CS_KEY_DATA_NAME_DEV_PATH, "w");
+ if (dev_fp == NULL) {
+ LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__,
+ CS_KEY_DATA_NAME_DEV_PATH, strerror(errno));
+ return -1;
+ }
+
+ fprintf(dev_fp, "%s", key_name);
+
+ fclose(dev_fp);
+ dev_fp = NULL;
+
+ dev_fp = fopen(CS_KEY_DATA_READ_DEV_PATH, "r");
+ if (dev_fp == NULL) {
+ LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__,
+ CS_KEY_DATA_READ_DEV_PATH, strerror(errno));
+ return -1;
+ }
+
+ fscanf(dev_fp, "%s", data_buf);
+
+ rd_cnt = strlen((char *)data_buf);
+
+ fclose(dev_fp);
+ dev_fp = NULL;
+
+ return rd_cnt;
+}
+
+int WriteKeyData(const char *key_name, int wr_size, char data_buf[])
+{
+ FILE *dev_fp = NULL;
+ int wr_cnt = 0;
+
+ dev_fp = fopen(CS_KEY_DATA_NAME_DEV_PATH, "w");
+ if (dev_fp == NULL) {
+ LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__,
+ CS_KEY_DATA_NAME_DEV_PATH, strerror(errno));
+ return -1;
+ }
+
+ fprintf(dev_fp, "%s", key_name);
+
+ fclose(dev_fp);
+ dev_fp = NULL;
+
+ dev_fp = fopen(CS_KEY_DATA_WRITE_DEV_PATH, "w");
+ if (dev_fp == NULL) {
+ LOGE("%s, open %s ERROR(%s)!!\n", __FUNCTION__,
+ CS_KEY_DATA_WRITE_DEV_PATH, strerror(errno));
+ return -1;
+ }
+
+ wr_cnt = fwrite(data_buf, 1, wr_size, dev_fp);
+
+ fclose(dev_fp);
+ dev_fp = NULL;
+
+ return wr_cnt;
+}
+
+int KeyData_GetMacAddressDataLen()
+{
+ return CC_MAC_LEN;
+}
+
+int KeyData_ReadMacAddress(unsigned char data_buf[])
+{
+ int i = 0, rd_size = 0;
+ int data_i_buf[CC_MAC_LEN] = { 0, 0, 0, 0, 0, 0 };
+ unsigned char rd_buf[128] = { 0 };
+ unsigned char tmp_buf[128] = { 0 };
+
+ memset((void *)rd_buf, 0 , 128);
+ rd_size = ReadKeyData(CS_MAC_KEY_NAME, rd_buf);
+ LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size);
+
+#if ANDROID_PLATFORM_SDK_VERSION == 19
+ memcpy((void *)tmp_buf, (void *)rd_buf, 128);
+ rd_size = TransStringToHex(rd_size, (char *)rd_buf, tmp_buf);
+#endif
+
+#if ANDROID_PLATFORM_SDK_VERSION >= 21
+ memcpy((void *)tmp_buf, (void *)rd_buf, 128);
+#endif
+
+ if (rd_size == 17) {
+ sscanf((char *) tmp_buf, "%02x:%02x:%02x:%02x:%02x:%02x",
+ &data_i_buf[0], &data_i_buf[1], &data_i_buf[2], &data_i_buf[3],
+ &data_i_buf[4], &data_i_buf[5]);
+ for (i = 0; i < CC_MAC_LEN; i++) {
+ data_buf[i] = data_i_buf[i] & 0xFF;
+ }
+
+ return KeyData_GetMacAddressDataLen();
+ }
+
+ return 0;
+}
+
+int KeyData_SaveMacAddress(unsigned char data_buf[])
+{
+ int tmp_ret = 0, wr_size = 0;
+ unsigned char hex_buf[128] = { 0 };
+ char tmp_buf[128] = { 0 };
+
+ sprintf((char *) hex_buf, "%02x:%02x:%02x:%02x:%02x:%02x", data_buf[0],
+ data_buf[1], data_buf[2], data_buf[3], data_buf[4], data_buf[5]);
+
+#if ANDROID_PLATFORM_SDK_VERSION == 19
+ memset((void *)tmp_buf, 0, 128);
+ TransToHexString(strlen((char *) hex_buf), tmp_buf, hex_buf);
+#endif
+
+#if ANDROID_PLATFORM_SDK_VERSION >= 21
+ memset((void *)tmp_buf, 0, 128);
+ memcpy(tmp_buf, (const char *)hex_buf, strlen((char *) hex_buf));
+#endif
+
+ wr_size = strlen(tmp_buf);
+ tmp_ret = WriteKeyData(CS_MAC_KEY_NAME, wr_size, tmp_buf);
+ if (tmp_ret != wr_size) {
+ return -1;
+ }
+
+ CreateMacAddressStartWorkThread();
+
+ return 0;
+}
+
+static int gSSMBarCodeLen = -1;
+int KeyData_GetBarCodeDataLen()
+{
+ const char *config_value;
+
+ if (gSSMBarCodeLen <= 0) {
+ config_value = config_get_str("TV", CS_BARCODE_LEN_CFG, "null");
+ if (strcmp(config_value, "null") == 0) {
+ gSSMBarCodeLen = 32;
+ } else {
+ gSSMBarCodeLen = strtol(config_value, NULL, 10);
+ }
+ }
+
+ return gSSMBarCodeLen;
+}
+
+int KeyData_ReadBarCode(unsigned char data_buf[])
+{
+ int rd_size = 0, tmp_len = 0;
+ unsigned char rd_buf[CC_MAX_KEY_DATA_SIZE] = { 0 };
+
+ tmp_len = KeyData_GetBarCodeDataLen();
+ rd_size = ReadKeyData(CS_BARCODE_KEY_NAME, rd_buf);
+ LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size);
+
+#if ANDROID_PLATFORM_SDK_VERSION == 19
+ unsigned char tmp_buf[CC_MAX_KEY_DATA_SIZE] = { 0 };
+
+ memcpy((void *)tmp_buf, (void *)rd_buf, CC_MAX_KEY_DATA_SIZE);
+ rd_size = TransStringToHex(rd_size, (char *)rd_buf, tmp_buf);
+
+ if (rd_size == tmp_len) {
+ memcpy(data_buf, tmp_buf, rd_size);
+ return rd_size;
+ }
+#endif
+
+#if ANDROID_PLATFORM_SDK_VERSION >= 21
+ if (rd_size == tmp_len) {
+ memcpy(data_buf, rd_buf, rd_size);
+ return rd_size;
+ }
+#endif
+
+ return 0;
+}
+
+int KeyData_SaveBarCode(unsigned char data_buf[])
+{
+ int tmp_len = 0, wr_size = 0;
+ char tmp_buf[CC_MAX_KEY_DATA_SIZE] = { 0 };
+
+ tmp_len = KeyData_GetBarCodeDataLen();
+
+#if ANDROID_PLATFORM_SDK_VERSION == 19
+ memset((void *)tmp_buf, 0, CC_MAX_KEY_DATA_SIZE);
+ TransToHexString(tmp_len, tmp_buf, data_buf);
+#endif
+
+#if ANDROID_PLATFORM_SDK_VERSION >= 21
+ memset((void *)tmp_buf, 0, CC_MAX_KEY_DATA_SIZE);
+ memcpy(tmp_buf, (const char *)data_buf, strlen((char *) data_buf));
+#endif
+
+ wr_size = strlen(tmp_buf);
+ tmp_len = WriteKeyData(CS_BARCODE_KEY_NAME, wr_size, tmp_buf);
+ if (tmp_len != wr_size) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int SSMReadHDCPKey(unsigned char hdcp_key_buf[])
+{
+ int tmp_ret = 0, rd_size = 0;
+ unsigned char rd_buf[CC_MAX_KEY_DATA_SIZE] = { 0 };
+ unsigned char tmp_buf[CC_MAX_KEY_DATA_SIZE] = { 0 };
+
+ tmp_ret = GetHDCPKeyFromFile(0, CC_HDCP_KEY_TOTAL_SIZE, hdcp_key_buf);
+ if (tmp_ret < 0) {
+ rd_size = ReadKeyData(CS_RX_HDCP_KEY_NAME, rd_buf);
+ LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size);
+
+ memcpy((void *)tmp_buf, (void *)rd_buf, CC_MAX_KEY_DATA_SIZE);
+ rd_size = TransStringToHex(rd_size, (char *)rd_buf, tmp_buf);
+
+ if (rd_size == CC_HDCP_KEY_TOTAL_SIZE) {
+ memcpy(hdcp_key_buf, tmp_buf, CC_HDCP_KEY_TOTAL_SIZE);
+ return rd_size;
+ }
+
+ return 0;
+ }
+
+ return CC_HDCP_KEY_TOTAL_SIZE;
+}
+
+
+
+int SSMSaveHDCPKey(unsigned char hdcp_key_buf[])
+{
+ int tmp_ret = 0, wr_size = 0;
+ char tmp_buf[CC_MAX_KEY_DATA_SIZE] = { 0 };
+
+ tmp_ret = SaveHDCPKeyToFile(0, CC_HDCP_KEY_TOTAL_SIZE, hdcp_key_buf);
+ if (tmp_ret < 0) {
+ memset((void *)tmp_buf, 0, CC_MAX_KEY_DATA_SIZE);
+ TransToHexString(CC_HDCP_KEY_TOTAL_SIZE, tmp_buf, hdcp_key_buf);
+
+ wr_size = strlen(tmp_buf);
+ tmp_ret = WriteKeyData(CS_RX_HDCP_KEY_NAME, wr_size, tmp_buf);
+ if (tmp_ret != wr_size) {
+ tmp_ret = -1;
+ } else {
+ tmp_ret = 0;
+ }
+ }
+
+ return tmp_ret;
+}
+
+int SSMSetHDCPKey()
+{
+
+ int i = 0;
+ unsigned char hdcp_key_buf[CC_HDCP_KEY_TOTAL_SIZE];
+
+ if (GetSSMHandleHDCPKeyEnableCFG() == 1) {
+ if (GetSSMHandleHDCPKeyDemoEnableCFG() == 1) {
+ return SSMSetDefaultHDCPKey(hdcp_key_buf);
+ } else {
+ if (SSMReadHDCPKey(hdcp_key_buf) == CC_HDCP_KEY_TOTAL_SIZE) {
+ LOGD("%s, using ssm's hdcp key.\n", __FUNCTION__);
+ return RealHandleHDCPKey(hdcp_key_buf);
+ }
+ }
+ }
+
+ return -1;
+}
+
+int SSMRefreshHDCPKey()
+{
+ int ret = -1;
+ ret = SSMSetHDCPKey();
+ system ( "/system/bin/dec" );
+ return ret;
+}
+
+int SSMGetHDCPKeyDataLen()
+{
+ return CC_HDCP_KEY_TOTAL_SIZE;
+}
+
+//hdmi edid
+int SSMSetHDMIEdid(int port)
+{
+ int i = 0;
+ unsigned char customer_hdmi_edid_buf[CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE];
+ unsigned char hdmi_edid_buf[SSM_HDMI_EDID_SIZE];
+
+ if (port < 1 && port > SSM_HDMI_PORT_MAX) {
+ LOGD("%s, hdmi port error.%d\n", __FUNCTION__, port);
+ return -1;
+ }
+
+ if (GetSSMHandleHDMIEdidByCustomerEnableCFG() == 1) {
+ if (SSMReadHDMIEdid(port, hdmi_edid_buf) == 0) {
+ LOGD("%s, using ssm's hdmi edid.\n", __FUNCTION__);
+ LOGD("%s, begin to write hdmi edid:0x%x, 0x%x, 0x%x, 0x%x.\n",
+ __FUNCTION__, hdmi_edid_buf[8], hdmi_edid_buf[9],
+ hdmi_edid_buf[10], hdmi_edid_buf[255]);
+ if ( AppendEdidPrefixCode(customer_hdmi_edid_buf, hdmi_edid_buf) == 0 )
+ return RealHandleHDMIEdid(customer_hdmi_edid_buf);
+ }
+ }
+
+ return -1;
+}
+
+int SSMReadHDMIEdid(int port, unsigned char hdmi_edid_buf[])
+{
+ int tmp_ret = 0;
+ LOGD("%s, read hdmi edid from bin file.\n", __FUNCTION__);
+ tmp_ret = GetHDMIEdidFromFile(0, SSM_HDMI_EDID_SIZE, port, hdmi_edid_buf);
+ if (tmp_ret < 0) {
+ LOGD("%s, read hdmi edid error.\n", __FUNCTION__);
+ } else {
+ LOGD("%s, 0x%x, 0x%x, 0x%x, 0x%x.\n", __FUNCTION__, hdmi_edid_buf[8],
+ hdmi_edid_buf[9], hdmi_edid_buf[10], hdmi_edid_buf[255]);
+ }
+ return tmp_ret;
+}
+
+int KeyData_SaveProjectID(int rw_val)
+{
+ int tmp_ret = 0, wr_size = 0;
+ char tmp_buf[64] = { 0 };
+
+ sprintf(tmp_buf, "%08X", rw_val);
+
+ wr_size = strlen(tmp_buf);
+ tmp_ret = WriteKeyData(CS_PROJECT_ID_KEY_NAME, wr_size, tmp_buf);
+ if (tmp_ret != wr_size) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int KeyData_ReadProjectID()
+{
+ int rd_size = 0, tmp_val = 0;
+ unsigned char tmp_buf[64] = { 0 };
+
+ rd_size = ReadKeyData(CS_PROJECT_ID_KEY_NAME, tmp_buf);
+ LOGD("%s, rd_size = %d\n", __FUNCTION__, rd_size);
+ if (rd_size == 4) {
+ tmp_val = 0;
+ tmp_val |= tmp_buf[0] << 24;
+ tmp_val |= tmp_buf[1] << 16;
+ tmp_val |= tmp_buf[2] << 8;
+ tmp_val |= tmp_buf[3] << 0;
+ }
+
+ return tmp_val;
+}
+
+int SSMSaveRGBOGOValue(int offset, int size, unsigned char data_buf[])
+{
+ return SaveRGBOGOToFile(offset, size, data_buf);
+}
+
+int SSMReadRGBOGOValue(int offset, int size, unsigned char data_buf[])
+{
+ return GetRGBOGOFromFile(offset, size, data_buf);
+}
+
+int SSMSaveAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[])
+{
+ return SaveAudioNoLinePointsDataToFile(offset, size, tmp_buf);
+}
+
+int SSMReadAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[])
+{
+ return GetAudioNoLinePointsDataFromFile(offset, size, tmp_buf);
+}
+
+/**************************** start mac address static functions ****************************/
+#define CC_ERR_THREAD_ID (0)
+
+static pthread_t mMacAddressStartWorkThreadID = CC_ERR_THREAD_ID;
+
+static volatile unsigned int mMacAddressLow = -1;
+static volatile unsigned int mMacAddressHigh = -1;
+static volatile int mMacAddressStartWorkThreadExecFlag = -1;
+static volatile int mMacAddressStartWorkThreadTurnOnFlag = -1;
+
+static pthread_mutex_t mac_address_low_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t mac_address_high_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t mac_address_exec_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t mac_address_turnon_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static int GetSSMMacAddressStartWorkEnableCFG()
+{
+ const char *config_value;
+
+ config_value = config_get_str("TV", CS_MAC_ADDRESS_STARTWRK_EN_CFG, "null");
+ if (strcmp(config_value, "null") == 0) {
+ LOGD(
+ "%s, get config is \"%s\", return 0 to not enable mac address start work.\n",
+ __FUNCTION__, config_value);
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+static unsigned int SetMacAddressLow(unsigned int low_val)
+{
+ unsigned int tmp_val;
+
+ pthread_mutex_lock(&mac_address_low_mutex);
+
+ tmp_val = mMacAddressLow;
+
+ mMacAddressLow = low_val;
+
+ pthread_mutex_unlock(&mac_address_low_mutex);
+
+ return tmp_val;
+}
+
+static unsigned int GetMacAddressLow()
+{
+ unsigned int tmp_val = 0;
+
+ pthread_mutex_lock(&mac_address_low_mutex);
+
+ tmp_val = mMacAddressLow;
+
+ pthread_mutex_unlock(&mac_address_low_mutex);
+
+ return tmp_val;
+}
+
+static unsigned int SetMacAddressHigh(unsigned int high_val)
+{
+ unsigned int tmp_val;
+
+ pthread_mutex_lock(&mac_address_high_mutex);
+
+ tmp_val = mMacAddressHigh;
+
+ mMacAddressHigh = high_val;
+
+ pthread_mutex_unlock(&mac_address_high_mutex);
+
+ return tmp_val;
+}
+
+static unsigned int GetMacAddressHigh()
+{
+ int tmp_val = 0;
+
+ pthread_mutex_lock(&mac_address_high_mutex);
+
+ tmp_val = mMacAddressHigh;
+
+ pthread_mutex_unlock(&mac_address_high_mutex);
+
+ return tmp_val;
+}
+
+static int SetMacAddressStartWorkThreadExecFlag(int tmp_flag)
+{
+ int tmp_val;
+
+ pthread_mutex_lock(&mac_address_exec_mutex);
+
+ tmp_val = mMacAddressStartWorkThreadExecFlag;
+
+ mMacAddressStartWorkThreadExecFlag = tmp_flag;
+
+ pthread_mutex_unlock(&mac_address_exec_mutex);
+
+ return tmp_val;
+}
+
+static int GetMacAddressStartWorkThreadExecFlag()
+{
+ int tmp_val = 0;
+
+ pthread_mutex_lock(&mac_address_exec_mutex);
+
+ tmp_val = mMacAddressStartWorkThreadExecFlag;
+
+ pthread_mutex_unlock(&mac_address_exec_mutex);
+
+ return tmp_val;
+}
+
+static int SetMacAddressStartWorkThreadTurnOnFlag(int tmp_flag)
+{
+ int tmp_val;
+
+ pthread_mutex_lock(&mac_address_turnon_mutex);
+
+ tmp_val = mMacAddressStartWorkThreadTurnOnFlag;
+
+ mMacAddressStartWorkThreadTurnOnFlag = tmp_flag;
+
+ pthread_mutex_unlock(&mac_address_turnon_mutex);
+
+ return tmp_val;
+}
+
+static int GetMacAddressStartWorkThreadTurnOnFlag()
+{
+ int tmp_val = 0;
+
+ pthread_mutex_lock(&mac_address_turnon_mutex);
+
+ tmp_val = mMacAddressStartWorkThreadTurnOnFlag;
+
+ pthread_mutex_unlock(&mac_address_turnon_mutex);
+
+ return tmp_val;
+}
+
+static void *SSMMacAddressStartWorkMainApp(void *data)
+{
+ unsigned int curMacAddrLow = 0, curMacAddrHigh = 0;
+ int p_status;
+ char ssm_addr_str[128];
+ const char *iname = "eth0";
+ pid_t pid;
+
+ LOGD("%s, entering...\n", __FUNCTION__);
+
+ if (GetSSMMacAddressStartWorkEnableCFG() == 0) {
+ LOGE("%s, ssm mac address start work is not enable.\n", "TV");
+ return NULL;
+ }
+
+ curMacAddrLow = GetMacAddressLow();
+ curMacAddrHigh = GetMacAddressHigh();
+
+ while (GetMacAddressStartWorkThreadTurnOnFlag() == 1) {
+ pid = fork();
+ if (pid == 0) {
+ if (execl("/system/bin/stop", "stop_eth_dhcpcd", "eth_dhcpcd", NULL)
+ < 0) {
+ _exit(-1);
+ }
+ _exit(0);
+ }
+ waitpid(pid, &p_status, 0);
+
+ ifc_init();
+
+ ifc_down(iname);
+
+ sprintf(ssm_addr_str, "%02x:%02x:%02x:%02x:%02x:%02x",
+ ((curMacAddrLow >> 0) & 0xFF), ((curMacAddrLow >> 8) & 0xFF),
+ ((curMacAddrLow >> 16) & 0xFF), ((curMacAddrLow >> 24) & 0xFF),
+ ((curMacAddrHigh >> 0) & 0xFF), ((curMacAddrHigh >> 8) & 0xFF));
+ struct ether_addr *addr = ether_aton(ssm_addr_str);
+ if (addr) {
+ ifc_set_hwaddr(iname, addr->ether_addr_octet);
+ }
+
+ ifc_up(iname);
+
+ ifc_close();
+
+ if (curMacAddrLow == GetMacAddressLow()
+ && curMacAddrHigh == GetMacAddressHigh()) {
+ break;
+ }
+
+ curMacAddrLow = GetMacAddressLow();
+ curMacAddrHigh = GetMacAddressHigh();
+ }
+
+ return NULL;
+}
+
+static void *SSMMacAddressStartWorkThreadMain(void *data)
+{
+ void *tmp_ret = NULL;
+
+ SetMacAddressStartWorkThreadExecFlag(1);
+
+ tmp_ret = SSMMacAddressStartWorkMainApp(NULL);
+
+ SetMacAddressStartWorkThreadExecFlag(0);
+
+ return tmp_ret;
+}
+
+static int KillMacAddressStartWorkThread()
+{
+ int i = 0, tmp_timeout_count = 600;
+
+ SetMacAddressStartWorkThreadTurnOnFlag(0);
+ while (1) {
+ if (GetMacAddressStartWorkThreadExecFlag() == 0) {
+ break;
+ }
+
+ if (i >= tmp_timeout_count) {
+ break;
+ }
+
+ i++;
+
+ usleep(100 * 1000);
+ }
+
+ if (i == tmp_timeout_count) {
+ LOGE(
+ "%s, we have try %d times, but the mac address start work thread's exec flag is still(%d)!!!\n",
+ "TV", tmp_timeout_count,
+ GetMacAddressStartWorkThreadExecFlag());
+ return -1;
+ }
+
+ pthread_join(mMacAddressStartWorkThreadID, NULL);
+ mMacAddressStartWorkThreadID = CC_ERR_THREAD_ID;
+
+ LOGD("%s, kill the mac address start work thread sucess.\n", __FUNCTION__);
+
+ return 0;
+}
+
+int CreateMacAddressStartWorkThread()
+{
+ unsigned int macAddrLow = 0, macAddrHigh = 0;
+ pthread_attr_t attr;
+ struct sched_param param;
+ unsigned char ssm_addr_buf[16] = { 0, 0, 0, 0, 0, 0 };
+
+ if (KeyData_ReadMacAddress(ssm_addr_buf) < 0) {
+ return -1;
+ }
+
+ macAddrLow = 0;
+ macAddrLow |= ((ssm_addr_buf[0] & 0xFF) << 0);
+ macAddrLow |= ((ssm_addr_buf[1] & 0xFF) << 8);
+ macAddrLow |= ((ssm_addr_buf[2] & 0xFF) << 16);
+ macAddrLow |= ((ssm_addr_buf[3] & 0xFF) << 24);
+
+ macAddrHigh = 0;
+ macAddrHigh |= ((ssm_addr_buf[4] & 0xFF) << 0);
+ macAddrHigh |= ((ssm_addr_buf[5] & 0xFF) << 8);
+
+ if (mMacAddressStartWorkThreadID != CC_ERR_THREAD_ID) {
+ if (GetMacAddressStartWorkThreadExecFlag() == 1) {
+ SetMacAddressLow(macAddrLow);
+ SetMacAddressHigh(macAddrHigh);
+ return 0;
+ } else {
+ KillMacAddressStartWorkThread();
+ }
+ }
+
+ SetMacAddressLow(macAddrLow);
+ SetMacAddressHigh(macAddrHigh);
+ SetMacAddressStartWorkThreadTurnOnFlag(1);
+
+ pthread_attr_init(&attr);
+ pthread_attr_setschedpolicy(&attr, SCHED_RR);
+ param.sched_priority = 20;
+ pthread_attr_setschedparam(&attr, &param);
+
+ if (pthread_create(&mMacAddressStartWorkThreadID, &attr,
+ SSMMacAddressStartWorkThreadMain, NULL) < 0) {
+ pthread_attr_destroy(&attr);
+ mMacAddressStartWorkThreadID = CC_ERR_THREAD_ID;
+ return -1;
+ }
+
+ pthread_attr_destroy(&attr);
+
+ LOGD("%s, create channel select thread sucess.\n", __FUNCTION__);
+
+ return 0;
+}
+/**************************** end mac address static functions ****************************/
+
+/**************************** start hdcp key static functions ****************************/
+int GetSSMHandleHDCPKeyEnableCFG()
+{
+ const char *config_value;
+
+ config_value = config_get_str("TV", CS_HDCP_KEY_EN_CFG, "null");
+#if 0
+ LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDCP_KEY_EN_CFG,
+ config_value);
+#endif
+ if (strcmp(config_value, "null") == 0) {
+ LOGD(
+ "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdcp key.\n",
+ __FUNCTION__, CS_HDCP_KEY_EN_CFG, config_value);
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+int GetSSMHandleHDCPKeyDemoEnableCFG()
+{
+ const char *config_value;
+
+ config_value = config_get_str("TV", CS_HDCP_KEY_DEMO_EN_CFG, "null");
+#if 0
+ LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDCP_KEY_DEMO_EN_CFG,
+ config_value);
+#endif
+ if (strcmp(config_value, "null") == 0) {
+ LOGD(
+ "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdcp key demo.\n",
+ __FUNCTION__, CS_HDCP_KEY_DEMO_EN_CFG, config_value);
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+
+int SSMSetDefaultHDCPKey(unsigned char hdcp_key_buf[])
+{
+ int i = 0;
+
+ for (i = 0; i < CC_HDCP_KEY_HEAD_SIZE; i++) {
+ hdcp_key_buf[i] = mHDCPKeyDefHeaderBuf[i];
+ }
+
+ for (i = 0; i < CC_HDCP_KEY_CONTENT_SIZE; i++) {
+ hdcp_key_buf[i + CC_HDCP_KEY_HEAD_SIZE] = mDefHDCPKeyContentBuf[i];
+ }
+
+ LOGD("%s, using default hdcp key.\n", __FUNCTION__);
+
+ return RealHandleHDCPKey(hdcp_key_buf);
+}
+
+int RealHandleHDCPKey(unsigned char hdcp_key_buf[])
+{
+ int i = 0, dev_fd = -1;
+
+ if (hdcp_key_buf == NULL) {
+ return -1;
+ }
+
+ dev_fd = open("/sys/class/hdmirx/hdmirx0/edid", O_RDWR);
+ if (dev_fd < 0) {
+ LOGE("%s, open edid file ERROR(%s)!!\n", "TV", strerror(errno));
+ return -1;
+ }
+
+ if (write(dev_fd, hdcp_key_buf, CC_HDCP_KEY_TOTAL_SIZE) < 0) {
+ close(dev_fd);
+ dev_fd = -1;
+ LOGE("%s, write edid file ERROR(%s)!!\n", "TV", strerror(errno));
+
+ return -1;
+ }
+
+ close(dev_fd);
+ dev_fd = -1;
+ return 0;
+}
+
+/**************************** end hdcp key static functions ****************************/
+
+/**************************** start hdmi edid static functions ****************************/
+int GetSSMHandleHDMIEdidByCustomerEnableCFG()
+{
+ const char *config_value;
+
+ config_value = config_get_str("TV", CS_HDMI_EDID_EN_CFG, "null");
+#if 0
+ LOGD("%s, get \"%s\" is \"%s\".\n", __FUNCTION__, CS_HDMI_EDID_EN_CFG,
+ config_value);
+#endif
+ if (strcmp(config_value, "null") == 0) {
+ LOGD(
+ "%s, get config \"%s\" is \"%s\", return 0 to not enable handle hdmi edid by customer.\n",
+ __FUNCTION__, CS_HDMI_EDID_EN_CFG, config_value);
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+int RealHandleHDMIEdid(unsigned char customer_hdmi_edid_buf[])
+{
+ int i = 0, dev_fd = -1;
+
+ if (customer_hdmi_edid_buf == NULL) {
+ return -1;
+ }
+
+ dev_fd = open("/sys/class/hdmirx/hdmirx0/edid", O_RDWR);
+ if (dev_fd < 0) {
+ LOGE("%s, open edid file ERROR(%s)!!\n", "TV", strerror(errno));
+ return -1;
+ }
+
+ if (write(dev_fd, customer_hdmi_edid_buf, CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE)
+ < 0) {
+ close(dev_fd);
+ dev_fd = -1;
+ LOGE("%s, write edid file ERROR(%s)!!\n", "TV", strerror(errno));
+
+ return -1;
+ }
+
+ close(dev_fd);
+ dev_fd = -1;
+ return 0;
+}
+
+int AppendEdidPrefixCode(unsigned char customer_hdmi_edid_buf[],
+ unsigned char hdmi_edid_buf[])
+{
+ if (customer_hdmi_edid_buf == NULL || hdmi_edid_buf == NULL) {
+ LOGE("%s, Append hdmi edid's prefixCode ERROR(%s)!!\n", "TV",
+ strerror(errno));
+ return -1;
+ }
+ memset(customer_hdmi_edid_buf, 0,
+ sizeof(char) * CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE);
+ customer_hdmi_edid_buf[0] = 'E';
+ customer_hdmi_edid_buf[1] = 'D';
+ customer_hdmi_edid_buf[2] = 'I';
+ customer_hdmi_edid_buf[3] = 'D';
+ memcpy(customer_hdmi_edid_buf + 4, hdmi_edid_buf,
+ CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE - 4);
+ /*
+ LOGD("%s, customer_hdmi_edid_buf: %c,%c,%c,%c,%x,%x,%x,%x.\n", __FUNCTION__,
+ customer_hdmi_edid_buf[0],customer_hdmi_edid_buf[1],customer_hdmi_edid_buf[2],customer_hdmi_edid_buf[3],
+ customer_hdmi_edid_buf[12],customer_hdmi_edid_buf[13],customer_hdmi_edid_buf[14],customer_hdmi_edid_buf[15]);*/
+ /*
+ LOGD("%s, customer_hdmi_edid_buf: \n", __FUNCTION__);
+ int i, j;
+ for (i = 0; i < 16; i++) {
+ LOGD("[%2d] ", i);
+ for (j = 0; j < 16; j++) {
+ LOGD("0x%02lx, ", customer_hdmi_edid_buf[4 + (i*16 + j)]);
+ }
+ LOGD("\n");
+ }*/
+ return 0;
+}
+
+/**************************** end hdmi edid static functions ****************************/
+
+/**************************** start critical data op functions ****************************/
+#define CC_OP_TYPE_READ (0)
+#define CC_OP_TYPE_SAVE (1)
+#define CC_DATA_TYPE_CHAR (0)
+#define CC_DATA_TYPE_INT (1)
+
+typedef int (*op_fun_ptr)(char *, int, int, unsigned char *);
+
+typedef struct tagRWDataInfo {
+ int op_type;
+ int data_type;
+ int max_size;
+ int rw_off;
+ int rw_size;
+ void *data_buf;
+ char *path_cfg_name;
+ char *off_cfg_name;
+ op_fun_ptr op_cb;
+} RWDataInfo;
+
+static int GetFilePathCFG(char *key_str, char path_buf[])
+{
+ int tmp_ret = 0;
+ const char *cfg_value;
+
+ path_buf[0] = '\0';
+ cfg_value = config_get_str("TV", key_str, "");
+ strcpy(path_buf, cfg_value);
+#if 0
+ LOGD("%s, get \"%s\" is \"%s\".\n", "TV", key_str, path_buf);
+#endif
+ return tmp_ret;
+}
+
+static int GetFileOffsetCFG(char *key_str)
+{
+ const char *cfg_value;
+
+ cfg_value = config_get_str("TV", key_str, "null");
+#if 0
+ LOGD("%s, get \"%s\" is \"%s\".\n", "TV", key_str, cfg_value);
+#endif
+ if (strcmp(cfg_value, "null") == 0) {
+ LOGD("%s, get config \"%s\" is \"%s\", return 0 for default.\n", "TV",
+ key_str, cfg_value);
+ return 0;
+ }
+
+ return strtol(cfg_value, NULL, 10);
+}
+
+static int handleDataFilePath(char *file_name, int offset, int nsize,
+ char file_path[])
+{
+ if (file_name == NULL) {
+ LOGE("%s, file_name is NULL!!!\n", "TV");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int ReadDataFromFile(char *file_name, int offset, int nsize,
+ unsigned char data_buf[])
+{
+ int device_fd = -1;
+ int tmp_ret = 0;
+ char *tmp_ptr = NULL;
+ char file_path[512] = { '\0' };
+
+ if (data_buf == NULL) {
+ LOGE("%s, data_buf is NULL!!!\n", "TV");
+ return -1;
+ }
+
+ tmp_ret = handleDataFilePath(file_name, offset, nsize, file_path);
+ if (tmp_ret < 0) {
+ tmp_ptr = NULL;
+ } else if (tmp_ret == 0) {
+ tmp_ptr = file_name;
+ } else if (tmp_ret == 1) {
+ tmp_ptr = file_path;
+ }
+
+ if (tmp_ptr == NULL) {
+ return -1;
+ }
+
+ device_fd = open(tmp_ptr, O_RDONLY);
+ if (device_fd < 0) {
+ LOGE("%s: open file \"%s\" error(%s).\n", "TV", file_name,
+ strerror(errno));
+ return -1;
+ }
+
+ lseek(device_fd, offset, SEEK_SET);
+ read(device_fd, data_buf, nsize);
+
+ close(device_fd);
+ device_fd = -1;
+
+ return 0;
+}
+
+static int SaveDataToFile(char *file_name, int offset, int nsize,
+ unsigned char data_buf[])
+{
+ int device_fd = -1;
+ int i = 0, tmp_ret = 0;
+ char *tmp_ptr = NULL;
+ char file_path[512] = { '\0' };
+
+ if (data_buf == NULL) {
+ LOGE("%s, data_buf is NULL!!!\n", "TV");
+ return -1;
+ }
+
+ tmp_ret = handleDataFilePath(file_name, offset, nsize, file_path);
+ if (tmp_ret < 0) {
+ tmp_ptr = NULL;
+ } else if (tmp_ret == 0) {
+ tmp_ptr = file_name;
+ } else if (tmp_ret == 1) {
+ tmp_ptr = file_path;
+ }
+
+ if (tmp_ptr == NULL) {
+ return -1;
+ }
+
+ device_fd = open(tmp_ptr, O_RDWR | O_SYNC);
+ if (device_fd < 0) {
+ LOGE("%s: open file \"%s\" error(%s).\n", "TV", file_name,
+ strerror(errno));
+ return -1;
+ }
+
+ lseek(device_fd, offset, SEEK_SET);
+ write(device_fd, data_buf, nsize);
+ fsync(device_fd);
+
+ close(device_fd);
+ device_fd = -1;
+
+ return 0;
+}
+
+static int RealRWData(RWDataInfo *data_info)
+{
+ int i = 0, file_off = 0;
+ char file_name[256] = { '\0' };
+
+ memset(file_name, '\0', 256);
+ GetFilePathCFG(data_info->path_cfg_name, file_name);
+#if 0
+ LOGD("%s, file_name is %s.\n", __FUNCTION__, file_name);
+#endif
+ if (strlen(file_name) == 0) {
+ LOGE("%s, length of file_name is 0!!!\n", "TV");
+ return -2;
+ }
+
+ if (data_info->rw_off < 0) {
+ LOGE("%s, data_info->rw_off (%d) is less than 0!!!\n", "TV",
+ data_info->rw_off);
+ return -1;
+ }
+
+ if (data_info->rw_off + data_info->rw_size > data_info->max_size) {
+ LOGE(
+ "%s, data_info->rw_off + data_info->rw_size (%d) is more than data_info->max_size(%d) !!!\n",
+ "TV", data_info->rw_off + data_info->rw_size,
+ data_info->max_size);
+ return -1;
+ }
+
+ file_off = GetFileOffsetCFG(data_info->off_cfg_name);
+ if (file_off < 0) {
+ LOGE("%s, file_off (%d) is less than 0!!!\n", "TV", file_off);
+ return -1;
+ }
+
+ file_off += data_info->rw_off;
+
+ if (data_info->op_cb(file_name, file_off, data_info->rw_size,
+ (unsigned char *) data_info->data_buf) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static int HandleRWData(RWDataInfo *data_info)
+{
+ int i = 0, tmp_ret = 0;
+ int *tmp_iptr = NULL;
+ unsigned char *tmp_cptr = NULL;
+ RWDataInfo tmpInfo;
+
+ if (data_info == NULL) {
+ return -1;
+ }
+
+ tmpInfo = *data_info;
+
+ if (data_info->data_type == CC_DATA_TYPE_INT) {
+ tmp_cptr = new unsigned char[data_info->rw_size];
+ if (tmp_cptr != NULL) {
+ tmpInfo.data_buf = tmp_cptr;
+
+ if (tmpInfo.op_type == CC_OP_TYPE_SAVE) {
+ tmp_iptr = (int *) data_info->data_buf;
+ for (i = 0; i < data_info->rw_size; i++) {
+ tmp_cptr[i] = tmp_iptr[i];
+ }
+
+ tmp_ret |= RealRWData(&tmpInfo);
+ } else {
+ tmp_ret |= RealRWData(&tmpInfo);
+
+ tmp_iptr = (int *) data_info->data_buf;
+ for (i = 0; i < data_info->rw_size; i++) {
+ tmp_iptr[i] = tmp_cptr[i];
+ }
+ }
+
+ delete tmp_cptr;
+ tmp_cptr = NULL;
+
+ return tmp_ret;
+ }
+ }
+
+ return RealRWData(&tmpInfo);
+}
+
+int GetRGBOGOFromFile(int rd_off, int rd_size,
+ unsigned char data_buf[])
+{
+ RWDataInfo tmpInfo;
+
+ tmpInfo.op_type = CC_OP_TYPE_READ;
+ tmpInfo.data_type = CC_DATA_TYPE_CHAR;
+ tmpInfo.max_size = SSM_CR_RGBOGO_LEN + SSM_CR_RGBOGO_CHKSUM_LEN;
+ tmpInfo.rw_off = rd_off;
+ tmpInfo.rw_size = rd_size;
+ tmpInfo.data_buf = data_buf;
+ tmpInfo.path_cfg_name = (char *) CS_RGBOGO_FILE_PATH_CFG;
+ tmpInfo.off_cfg_name = (char *) CS_RGBOGO_FILE_OFFSET_CFG;
+ tmpInfo.op_cb = ReadDataFromFile;
+
+ return HandleRWData(&tmpInfo);
+}
+
+int SaveRGBOGOToFile(int wr_off, int wr_size, unsigned char data_buf[])
+{
+ RWDataInfo tmpInfo;
+
+ tmpInfo.op_type = CC_OP_TYPE_SAVE;
+ tmpInfo.data_type = CC_DATA_TYPE_CHAR;
+ tmpInfo.max_size = SSM_CR_RGBOGO_LEN + SSM_CR_RGBOGO_CHKSUM_LEN;
+ tmpInfo.rw_off = wr_off;
+ tmpInfo.rw_size = wr_size;
+ tmpInfo.data_buf = data_buf;
+ tmpInfo.path_cfg_name = (char *) CS_RGBOGO_FILE_PATH_CFG;
+ tmpInfo.off_cfg_name = (char *) CS_RGBOGO_FILE_OFFSET_CFG;
+ tmpInfo.op_cb = SaveDataToFile;
+
+ return HandleRWData(&tmpInfo);
+}
+
+int GetAudioNoLinePointsDataFromFile(int rd_off, int rd_size,
+ unsigned char data_buf[])
+{
+ RWDataInfo tmpInfo;
+
+ tmpInfo.op_type = CC_OP_TYPE_READ;
+ tmpInfo.data_type = CC_DATA_TYPE_CHAR;
+ tmpInfo.max_size = 256;
+ tmpInfo.rw_off = rd_off;
+ tmpInfo.rw_size = rd_size;
+ tmpInfo.data_buf = data_buf;
+ tmpInfo.path_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_PATH_CFG;
+ tmpInfo.off_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_OFFSET_CFG;
+ tmpInfo.op_cb = ReadDataFromFile;
+
+ return HandleRWData(&tmpInfo);
+}
+
+int SaveAudioNoLinePointsDataToFile(int wr_off, int wr_size,
+ unsigned char data_buf[])
+{
+ RWDataInfo tmpInfo;
+
+ tmpInfo.op_type = CC_OP_TYPE_SAVE;
+ tmpInfo.data_type = CC_DATA_TYPE_CHAR;
+ tmpInfo.max_size = 256;
+ tmpInfo.rw_off = wr_off;
+ tmpInfo.rw_size = wr_size;
+ tmpInfo.data_buf = data_buf;
+ tmpInfo.path_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_PATH_CFG;
+ tmpInfo.off_cfg_name = (char *) CS_AUDIO_NOLINEPOINTS_FILE_OFFSET_CFG;
+ tmpInfo.op_cb = SaveDataToFile;
+
+ return HandleRWData(&tmpInfo);
+}
+
+int GetHDCPKeyFromFile(int rd_off, int rd_size,
+ unsigned char data_buf[])
+{
+ RWDataInfo tmpInfo;
+
+ tmpInfo.op_type = CC_OP_TYPE_READ;
+ tmpInfo.data_type = CC_DATA_TYPE_CHAR;
+ tmpInfo.max_size = CC_HDCP_KEY_TOTAL_SIZE;
+ tmpInfo.rw_off = rd_off;
+ tmpInfo.rw_size = rd_size;
+ tmpInfo.data_buf = data_buf;
+ tmpInfo.path_cfg_name = (char *) CS_HDCP_KEY_FILE_PATH_CFG;
+ tmpInfo.off_cfg_name = (char *) CS_HDCP_KEY_FILE_OFFSET_CFG;
+ tmpInfo.op_cb = ReadDataFromFile;
+
+ return HandleRWData(&tmpInfo);
+}
+
+int SaveHDCPKeyToFile(int wr_off, int wr_size,
+ unsigned char data_buf[])
+{
+ RWDataInfo tmpInfo;
+
+ tmpInfo.op_type = CC_OP_TYPE_SAVE;
+ tmpInfo.data_type = CC_DATA_TYPE_CHAR;
+ tmpInfo.max_size = CC_HDCP_KEY_TOTAL_SIZE;
+ tmpInfo.rw_off = wr_off;
+ tmpInfo.rw_size = wr_size;
+ tmpInfo.data_buf = data_buf;
+ tmpInfo.path_cfg_name = (char *) CS_HDCP_KEY_FILE_PATH_CFG;
+ tmpInfo.off_cfg_name = (char *) CS_HDCP_KEY_FILE_OFFSET_CFG;
+ tmpInfo.op_cb = SaveDataToFile;
+
+ return HandleRWData(&tmpInfo);
+}
+
+int GetHDMIEdidFromFile(int rd_off, int rd_size, int port,
+ unsigned char data_buf[])
+{
+ RWDataInfo tmpInfo;
+
+ tmpInfo.op_type = CC_OP_TYPE_READ;
+ tmpInfo.data_type = CC_DATA_TYPE_CHAR;
+ tmpInfo.max_size = SSM_HDMI_EDID_SIZE;
+ tmpInfo.rw_off = rd_off;
+ tmpInfo.rw_size = rd_size;
+ tmpInfo.data_buf = data_buf;
+ switch (port) {
+ case 1:
+ tmpInfo.path_cfg_name = (char *) CS_HDMI_PORT1_EDID_FILE_PATH_CFG;
+ break;
+ case 2:
+ tmpInfo.path_cfg_name = (char *) CS_HDMI_PORT2_EDID_FILE_PATH_CFG;
+ break;
+ case 3:
+ tmpInfo.path_cfg_name = (char *) CS_HDMI_PORT3_EDID_FILE_PATH_CFG;
+ break;
+ default:
+ LOGE("%s, port is error, =%d\n", "TV", port);
+ tmpInfo.path_cfg_name = (char *) CS_HDMI_EDID_FILE_PATH_CFG;
+ break;
+ }
+ tmpInfo.off_cfg_name = (char *) CS_HDMI_EDID_FILE_OFFSET_CFG;
+ tmpInfo.op_cb = ReadDataFromFile;
+
+ return HandleRWData(&tmpInfo);
+}
+
+/**************************** end critical data op functions ****************************/
diff --git a/tvapi/libtv/tvsetting/TvKeyData.h b/tvapi/libtv/tvsetting/TvKeyData.h
index aa7e514..3e4bfa4 100644
--- a/tvapi/libtv/tvsetting/TvKeyData.h
+++ b/tvapi/libtv/tvsetting/TvKeyData.h
@@ -12,6 +12,7 @@
#define SSM_HDMI_PORT_MAX (3)
#define SSM_HDMI_EDID_SIZE (256)
+#if ANDROID_PLATFORM_SDK_VERSION == 19
#define CS_KEY_DATA_NAME_DEV_PATH "/sys/class/aml_keys/aml_keys/key_name"
#define CS_KEY_DATA_READ_DEV_PATH "/sys/class/aml_keys/aml_keys/key_read"
#define CS_KEY_DATA_WRITE_DEV_PATH "/sys/class/aml_keys/aml_keys/key_write"
@@ -20,7 +21,51 @@
#define CS_BARCODE_KEY_NAME "usid"
#define CS_RX_HDCP_KEY_NAME "rxhdcp20"
#define CS_PROJECT_ID_KEY_NAME "projid"
+#endif
+
+#if ANDROID_PLATFORM_SDK_VERSION >= 21
+#define CS_KEY_DATA_NAME_DEV_PATH "/sys/class/unifykeys/name"
+#define CS_KEY_DATA_READ_DEV_PATH "/sys/class/unifykeys/read"
+#define CS_KEY_DATA_WRITE_DEV_PATH "/sys/class/unifykeys/write"
+
+#define CS_MAC_KEY_NAME "mac"
+#define CS_BARCODE_KEY_NAME "usid"
+#define CS_RX_HDCP_KEY_NAME "hdcp2_rx"
+#define CS_PROJECT_ID_KEY_NAME "projid"
+#endif
+
+#define CC_MAX_KEY_DATA_SIZE (2048)
+#define CC_MAX_FILE_PATH (256)
+
+#define CC_MAC_LEN (6)
+#define CC_HDCP_KEY_TOTAL_SIZE (368)
+#define CC_HDCP_KEY_HEAD_SIZE (40)
+#define CC_HDCP_KEY_CONTENT_SIZE (CC_HDCP_KEY_TOTAL_SIZE - CC_HDCP_KEY_HEAD_SIZE)
+
+#define CC_CUSTOMER_HDMI_EDID_TOTAL_SIZE (SSM_HDMI_EDID_SIZE + 4)
+#define CS_MAC_ADDRESS_STARTWRK_EN_CFG "ssm.macaddr.startwork.en"
+#define CS_BARCODE_LEN_CFG "ssm.barcode.len"
+
+#define CS_HDCP_KEY_EN_CFG "ssm.handle.hdcpkey.en"
+#define CS_HDCP_KEY_DEMO_EN_CFG "ssm.handle.hdcpkey.demo.en"
+#define CS_HDCP_KEY_FILE_PATH_CFG "ssm.handle.hdcpkey.file.path"
+#define CS_HDCP_KEY_FILE_OFFSET_CFG "ssm.handle.hdcpkey.file.offset"
+
+
+#define CS_HDMI_EDID_EN_CFG "ssm.handle.hdmi.edid.en"
+#define CS_HDMI_EDID_USE_CFG "ssm.handle.hdmi.edid.use"
+#define CS_HDMI_EDID_FILE_PATH_CFG "ssm.handle.hdmi.edid.file.path"
+#define CS_HDMI_PORT1_EDID_FILE_PATH_CFG "ssm.handle.hdmi.port1.edid.file.path"
+#define CS_HDMI_PORT2_EDID_FILE_PATH_CFG "ssm.handle.hdmi.port2.edid.file.path"
+#define CS_HDMI_PORT3_EDID_FILE_PATH_CFG "ssm.handle.hdmi.port3.edid.file.path"
+#define CS_HDMI_EDID_FILE_OFFSET_CFG "ssm.handle.hdmi.edid.file.offset"
+
+#define CS_RGBOGO_FILE_PATH_CFG "ssm.rgbogo.file.path"
+#define CS_RGBOGO_FILE_OFFSET_CFG "ssm.rgbogo.file.offset"
+
+#define CS_AUDIO_NOLINEPOINTS_FILE_PATH_CFG "ssm.audio.nolinepoints.file.path"
+#define CS_AUDIO_NOLINEPOINTS_FILE_OFFSET_CFG "ssm.audio.nolinepoints.file.offset"
int ReadKeyData(const char *key_name, unsigned char data_buf[]);
int WriteKeyData(const char *key_name, int wr_size, char data_buf[]);
@@ -50,6 +95,25 @@ int SSMReadRGBOGOValue(int offset, int size, unsigned char data_buf[]);
int SSMReadAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[]);
int SSMSaveAudioNoLinePoints(int offset, int size, unsigned char tmp_buf[]);
+int CreateMacAddressStartWorkThread();
+
+int GetSSMHandleHDCPKeyEnableCFG();
+int GetSSMHandleHDCPKeyDemoEnableCFG();
+int SSMSetDefaultHDCPKey(unsigned char hdcp_key_buf[]);
+int RealHandleHDCPKey(unsigned char hdcp_key_buf[]);
+int GetHDCPKeyFromFile(int rd_off, int rd_size, unsigned char data_buf[]);
+int SaveHDCPKeyToFile(int wr_off, int wr_size, unsigned char data_buf[]);
+
+int GetHDMIEdidFromFile(int rd_off, int rd_size, int port, unsigned char data_buf[]);
+int RealHandleHDMIEdid(unsigned char hdmi_edid_buf[]);
+int GetSSMHandleHDMIEdidByCustomerEnableCFG();
+int AppendEdidPrefixCode(unsigned char customer_hdmi_edid_buf[], unsigned char hdmi_edid_buf[]);
+
+int GetRGBOGOFromFile(int rd_off, int rd_size, unsigned char data_buf[]);
+int SaveRGBOGOToFile(int wr_off, int wr_size, unsigned char data_buf[]);
+
+int GetAudioNoLinePointsDataFromFile(int offset, int size, unsigned char data_buf[]);
+int SaveAudioNoLinePointsDataToFile(int offset, int size, unsigned char data_buf[]);
#ifdef __cplusplus
extern "C" {
diff --git a/tvapi/libtv/tvsetting/audio_cfg.cpp b/tvapi/libtv/tvsetting/audio_cfg.cpp
index 5607561..f19ff35 100644
--- a/tvapi/libtv/tvsetting/audio_cfg.cpp
+++ b/tvapi/libtv/tvsetting/audio_cfg.cpp
@@ -1,1853 +1,722 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <android/log.h>
-#include <cutils/properties.h>
-
-#include "../tvsetting/CTvSetting.h"
-#include "../tvconfig/tvconfig.h"
-#include "audio_cfg.h"
-
-#define LOG_TAG "audio_cfg"
-#include "CTvLog.h"
-
-#define CS_AUDIO_AMP_MASTER_NOLINE_SWITCH_CFG_NAME "audio.amp.master.noline.switch"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_CNT_CFG_NAME "audio.amp.master.noline.point.cnt"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_IND_BUF_CFG_NAME "audio.amp.master.noline.point.ind.buf"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_DEF_BUF_CFG_NAME "audio.amp.master.noline.point.data.defbuf"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_IND_DEF_BUF_CFG_NAME "audio.amp.master.noline.point.ind.defbuf"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_TV_BUF_CFG_NAME "audio.amp.master.noline.point.data.tv"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_AV_BUF_CFG_NAME "audio.amp.master.noline.point.data.av"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_COMP_BUF_CFG_NAME "audio.amp.master.noline.point.data.comp"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_HDMI_BUF_CFG_NAME "audio.amp.master.noline.point.data.hdmi"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_VGA_BUF_CFG_NAME "audio.amp.master.noline.point.data.vga"
-#define CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_MPEG_BUF_CFG_NAME "audio.amp.master.noline.point.data.mpeg"
-
-#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_SWITCH_CFG_NAME "audio.amp.supperbass.noline.switch"
-#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_CNT_CFG_NAME "audio.amp.supperbass.noline.point.cnt"
-#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_IND_BUF_CFG_NAME "audio.amp.supperbass.noline.point.ind.buf"
-#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_DATA_DEF_BUF_CFG_NAME "audio.amp.supperbass.noline.point.data.defbuf"
-#define CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_IND_DEF_BUF_CFG_NAME "audio.amp.supperbass.noline.point.ind.defbuf"
-
-#define CS_AUDIO_AMP_BALANCE_EXCHG_CFG_NAME "audio.amp.balance.exchg"
-
-#define CS_EQ_MOUDLE_DISABLE_CFG_NAME "audio.eq.module.disable"
-#define CS_EQ_USING_ANDROID_CFG_NAME "audio.eq.using.android"
-#define CS_EQ_PRESETBUF_CFG_NAME "audio.eq.presetbuf"
-#define CS_EQ_GAIN_RANGE_CFG_NAME "audio.eq.gain.range"
-#define CS_EQ_UI_GAIN_RANGE_CFG_NAME "audio.eq.uigain.range"
-#define CS_EQ_AMP_MASTER_GAIN_CFG_NAME "audio.eq.ampmaster.gain"
-#define CS_EQ_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.eq.ampsupperbass.gain"
-
-#define CS_AUDIO_AMP_MAINVOL_TV_LUTBUF_CFG_NAME "audio.amp.mainvol.tv.lutbuf"
-#define CS_AUDIO_AMP_MAINVOL_AV_LUTBUF_CFG_NAME "audio.amp.mainvol.av.lutbuf"
-#define CS_AUDIO_AMP_MAINVOL_COMP_LUTBUF_CFG_NAME "audio.amp.mainvol.comp.lutbuf"
-#define CS_AUDIO_AMP_MAINVOL_HDMI_LUTBUF_CFG_NAME "audio.amp.mainvol.hdmi.lutbuf"
-#define CS_AUDIO_AMP_MAINVOL_VGA_LUTBUF_CFG_NAME "audio.amp.mainvol.vga.lutbuf"
-#define CS_AUDIO_AMP_MAINVOL_MPEG_LUTBUF_CFG_NAME "audio.amp.mainvol.mpeg.lutbuf"
-
-#define CS_AUDIO_AMP_SUPPERBASSVOL_TV_LUTBUF_CFG_NAME "audio.amp.supbassvol.tv.lutbuf"
-#define CS_AUDIO_AMP_SUPPERBASSVOL_AV_LUTBUF_CFG_NAME "audio.amp.supbassvol.av.lutbuf"
-#define CS_AUDIO_AMP_SUPPERBASSVOL_COMP_LUTBUF_CFG_NAME "audio.amp.supbassvol.comp.lutbuf"
-#define CS_AUDIO_AMP_SUPPERBASSVOL_HDMI_LUTBUF_CFG_NAME "audio.amp.supbassvol.hdmi.lutbuf"
-#define CS_AUDIO_AMP_SUPPERBASSVOL_VGA_LUTBUF_CFG_NAME "audio.amp.supbassvol.vga.lutbuf"
-#define CS_AUDIO_AMP_SUPPERBASSVOL_MPEG_LUTBUF_CFG_NAME "audio.amp.supbassvol.mpeg.lutbuf"
-
-#define CS_SRS_MOUDLE_DISABLE_CFG_NAME "audio.srs.module.disable"
-#define CS_SRS_SOURROUND_DISABLE_CFG_NAME "audio.srs.sourround.disable"
-#define CS_SRS_TRUBASS_DISABLE_CFG_NAME "audio.srs.trubass.disable"
-#define CS_SRS_DIALOGCLARITY_DISABLE_CFG_NAME "audio.srs.dialogclarity.disable"
-#define CS_SRS_SOURROUND_GAIN_CFG_NAME "audio.srs.sourround.gain"
-#define CS_SRS_SOURROUND_AMP_MASTER_GAIN_CFG_NAME "audio.srs.sourround.ampmaster.gain"
-#define CS_SRS_SOURROUND_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.srs.sourround.ampsupperbass.gain"
-#define CS_SRS_TRUBASS_ONLY_GAIN_CFG_NAME "audio.srs.trubass.only.gain"
-#define CS_SRS_TRUBASS_ONLY_AMP_MASTER_GAIN_CFG_NAME "audio.srs.trubass.only.ampmaster.gain"
-#define CS_SRS_TRUBASS_ONLY_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.srs.trubass.only.ampsupperbass.gain"
-#define CS_SRS_DIALOGCLARITY_ONLY_GAIN_CFG_NAME "audio.srs.dialogclarity.only.gain"
-#define CS_SRS_DIALOGCLARITY_ONLY_AMP_MASTER_GAIN_CFG_NAME "audio.srs.dialogclarity.only.ampmaster.gain"
-#define CS_SRS_DIALOGCLARITY_ONLY_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.srs.dialogclarity.only.ampsupperbass.gain"
-#define CS_SRS_DIALOGCLARITY_ONLY_DEFINITION_GAIN_CFG_NAME "audio.srs.dialogclarity.only.definition.gain"
-#define CS_SRS_TRUBASS_DIALOGCLARITY_TRUBASS_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.trubass.gain"
-#define CS_SRS_TRUBASS_DIALOGCLARITY_DIALOGCLARITY_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.dialogclarity.gain"
-#define CS_SRS_TRUBASS_DIALOGCLARITY_DEFINITION_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.definition.gain"
-#define CS_SRS_TRUBASS_DIALOGCLARITY_AMP_MASTER_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.ampmaster.gain"
-#define CS_SRS_TRUBASS_DIALOGCLARITY_AMP_SUPPERBASS_GAIN_CFG_NAME "audio.srs.turbass.dialogclarity.ampsupperbass.gain"
-#define CS_SRS_SUPPERBASS_ON_TRUBASS_SPEAKER_SIZE_CFG_NAME "audio.srs.supperbasson.turbass.speakersize"
-#define CS_SRS_SUPPERBASS_OFF_TRUBASS_SPEAKER_SIZE_CFG_NAME "audio.srs.supperbassoff.turbass.speakersize"
-
-#define CS_AUDIO_DUMP_DATA_ENABLE_CFG_NAME "audio.dump.data.en"
-#define CS_KEY_MUTE_CFG_NAME "audio.mute.keymute"
-#define CS_AVOUT_INIT_MUTE_CFG_NAME "audio.avout.init.mute"
-#define CS_SUPPERBASS_MODULE_DISABLE_CFG_NAME "audio.supperbass.module.disable"
-#define CS_SUPPERBASS_SWITCH_DISABLE_CFG_NAME "audio.supperbass.switch.disable"
-#define CS_DVI_SUPPORT_ENABLE_CFG_NAME "audio.dvi.support.enable"
-#define CS_SRC_INPUT_TV_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.tv.vol"
-#define CS_SRC_INPUT_AV_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.av.vol"
-#define CS_SRC_INPUT_COMP_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.comp.vol"
-#define CS_SRC_INPUT_HDMI_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.hdmi.vol"
-#define CS_SRC_INPUT_VGA_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.vga.vol"
-#define CS_SRC_INPUT_MPEG_LINEIN_VOL_CFG_NAME "audio.srcinput.linein.mpeg.vol"
-#define CS_SRC_INPUT_TV_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.tv.vol"
-#define CS_SRC_INPUT_AV_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.av.vol"
-#define CS_SRC_INPUT_COMP_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.comp.vol"
-#define CS_SRC_INPUT_HDMI_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.hdmi.vol"
-#define CS_SRC_INPUT_VGA_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.vga.vol"
-#define CS_SRC_INPUT_MPEG_LINEOUT_VOL_CFG_NAME "audio.srcinput.lineout.mpeg.vol"
-#define CS_SRC_INPUT_MPEG_LINEOUT_VOL_CFG_NAME_OLD "audio.srcinput.lineout.vol"
-
-#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_TV_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.tv"
-#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_AV_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.av"
-#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_COMP_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.comp"
-#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_HDMI_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.hdmi"
-#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_VGA_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.vga"
-#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_MPEG_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.mpeg"
-#define CS_AMP_MAINVOL_LUTBUF_COMPENSATION_DTV_CFG_NAME "audio.amp.mainvol.lutbuf.compensation.dtv"
-
-#define CS_AUDIO_NOISE_GATE_ENABLE_CFG_NAME "audio.noise.gate.enable"
-#define CS_AUDIO_NOISE_GATE_THRESHOLD_CFG_NAME "audio.noise.gate.threshold"
-#define CS_AUDIO_NOISE_GATE_UPPER_BOUND_CFG_NAME "audio.noise.gate.upper.bound"
-
-#define CS_DISABLE_RESET_SYSTEM_FRAMESIZE_CFG_NAME "audio.reset.system.framesize.disable"
-#define CS_AUDIO_SYSTEM_FRAMESIZE_CFG_NAME "audio.reset.system.framesize"
-
-#define CS_AUDIO_ARCHITECTURE_TYPE_CFG_NAME "audio.architecture.type"
-#define CS_AUDIO_RESAMPLE_TYPE_CFG_NAME "audio.resample.type"
-
-
-#define CC_MAX_SUP_LUT_CFG_INDEX (32)
-
-static int gMasterNoLinePointsIndexBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-static int gMasterNoLinePointsDefDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-static int gMasterNoLinePointsDefIndexBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-
-static int gSupperBassNoLinePointsIndexBuffer[CC_NO_LINE_POINTS_MAX_CNT] =
-{ -1 };
-static int gSupperBassNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-static int gSupperBassNoLinePointsDefDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = {
- -1
-};
-static int gSupperBassNoLinePointsDefIndexBuffer[CC_NO_LINE_POINTS_MAX_CNT] = {
- -1
-};
-
-static int gTVMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-static int gAVMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-static int gCOMPMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-static int gHDMIMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-static int gVGAMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-static int gMPEGMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = { -1 };
-static int gHDMI4K2KMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = {
- -1
-};
-static int gUSB4K2KMasterNoLinePointsDataBuffer[CC_NO_LINE_POINTS_MAX_CNT] = {
- -1
-};
-
-static int mTVMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mAVMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mCOMPMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mHDMIMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mVGAMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mMPEGMainVolumeDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-
-static int mTVSupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mAVSupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mCOMPSupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mHDMISupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mVGASupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-static int mMPEGSupperBassDigitLutBuf_XX[CC_LUT_BUF_SIZE];
-
-static int mEQPresetValueBuf_XX[CC_EQ_PRESET_BUF_SIZE];
-static int mEQPresetDefBuf[CC_EQ_PRESET_BUF_SIZE] = {
- //
- 50, 50, 50, 50, 50, 50, // SM_STD
- 70, 60, 50, 60, 70, 50, // SM_MUSIC
- 25, 50, 70, 66, 25, 50, // SM_NEWS
- 75, 65, 50, 65, 75, 50, // SM_THEATER
-};
-
-static int GetAudioCfgData(const char *key_str, int *buf_item_count, int radix,
- int data_buf[])
-{
- int cfg_item_count = 0;
- char *token = NULL;
- const char *strDelimit = ",";
- const char *config_value;
- char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
-
- config_value = config_get_str("TV", key_str, "null");
- if (strcasecmp(config_value, "null") == 0) {
- //LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
- return -1;
- }
-
- cfg_item_count = 0;
-
- memset((void *)data_str, 0, sizeof(data_str));
- strncpy(data_str, config_value, sizeof(data_str) - 1);
- token = strtok(data_str, strDelimit);
- while (token != NULL) {
- if (cfg_item_count < *buf_item_count) {
- data_buf[cfg_item_count] = strtol(token, NULL, radix);
-
- token = strtok(NULL, strDelimit);
- cfg_item_count += 1;
- } else {
- LOGE("%s, we get data count more than desire count (%d)!!!\n",
- __FUNCTION__ , *buf_item_count);
- return -1;
- }
- }
-
- *buf_item_count = cfg_item_count;
-
- return 0;
-}
-
-static int GetAudioCfgBufferData(const char *key_str, int *bufs_count,
- int *buf_item_count, int radix, int data_buf[])
-{
- int cfg_item_count = 0, tmpTotalItemCount = 0;
- char *token = NULL;
- const char *strDelimit = ",";
- const char *config_value;
- char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
-
- config_value = config_get_str("TV", key_str, "null");
- if (strcasecmp(config_value, "null") == 0) {
- // LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
- *bufs_count = 0;
- *buf_item_count = 0;
- return -1;
- }
-
- tmpTotalItemCount = 0;
-
- memset((void *)data_str, 0, sizeof(data_str));
- strncpy(data_str, config_value, sizeof(data_str) - 1);
- token = strtok(data_str, strDelimit);
- while (token != NULL) {
- if (cfg_item_count == 0) {
- *bufs_count = strtol(token, NULL, radix);
- } else if (cfg_item_count == 1) {
- *buf_item_count = strtol(token, NULL, radix);
- } else if (cfg_item_count >= 2) {
- data_buf[tmpTotalItemCount] = strtol(token, NULL, radix);
- tmpTotalItemCount += 1;
- }
-
- token = strtok(NULL, strDelimit);
- cfg_item_count += 1;
- }
-
- if ((*bufs_count) * (*buf_item_count) != tmpTotalItemCount) {
- LOGE("%s, get item count error!!! should be %d, real is %d.\n",
- __FUNCTION__, (*bufs_count) * (*buf_item_count),
- tmpTotalItemCount);
- *bufs_count = 0;
- *buf_item_count = 0;
- return -1;
- }
-
- return 0;
-}
-
-static int GetAudioCfgSingleIntData(const char *key_str, int def_val)
-{
- const char *config_value;
-
- config_value = config_get_str("TV", key_str, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return def_val;
- }
-
- return strtol(config_value, NULL, 10);
-}
-
-template<typename T>
-static int CheckNoLinePoints(int point_cnt, T points_buf[])
-{
- int i = 0, same_cnt = 0, tmp_direct = -1, error_flag = 0;
-
- if (point_cnt <= 1) {
- LOGD("%s, point is less than 2.\n", __FUNCTION__);
- return 0;
- }
-
- for (i = 0; i < point_cnt - 1; i++) {
- if (points_buf[i] < points_buf[i + 1]) {
- if (tmp_direct == -1) {
- tmp_direct = 0;
- } else if (tmp_direct == 1) {
- LOGD("%s, check have direct error.\n", __FUNCTION__);
- return -1;
- }
- } else if (points_buf[i] > points_buf[i + 1]) {
- if (tmp_direct == -1) {
- tmp_direct = 1;
- } else if (tmp_direct == 0) {
- LOGD("%s, check have direct error.\n", __FUNCTION__);
- return -1;
- }
- } else {
- same_cnt += 1;
- }
- }
-
- if (same_cnt == i) {
- LOGD("%s, check have same error.\n", __FUNCTION__);
- return -1;
- }
-
- LOGD("%s, check no error.\n", __FUNCTION__);
- return 0;
-}
-
-int *GetAudioAmplifierNoLinePointsIndexBuffer(int lut_buf_type, int get_type)
-{
- if (lut_buf_type == CC_LUT_BUF_SUPPERBASS) {
- return GetAudioAmplifierSupperBassNoLinePointsIndexBuffer(get_type);
- }
-
- return NULL;
-}
-
-int *GetAudioAmplifierNoLinePointsDataBuffer(int lut_buf_type, int get_type)
-{
- if (lut_buf_type == CC_LUT_BUF_SUPPERBASS) {
- return GetAudioAmplifierSupperBassNoLinePointsDataBuffer(get_type);
- }
-
- return NULL;
-}
-
-int GetAudioAmplifierMasterNoLineSwitchFlag()
-{
- const char *config_value;
- config_value = config_get_str("TV",
- CS_AUDIO_AMP_MASTER_NOLINE_SWITCH_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtol(config_value, NULL, 10);
-}
-
-int GetAudioAmplifierSupperBassNoLineSwitchFlag()
-{
- const char *config_value;
- config_value = config_get_str("TV",
- CS_AUDIO_AMP_SUPPERBASS_NOLINE_SWITCH_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtol(config_value, NULL, 10);
-}
-
-int GetAudioAmplifierMasterNoLinePointsCount()
-{
- const char *config_value;
- config_value = config_get_str("TV",
- CS_AUDIO_AMP_MASTER_NOLINE_POINT_CNT_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 11;
- }
-
- return strtol(config_value, NULL, 10);
-}
-
-int GetAudioAmplifierSupperBassNoLinePointsCount()
-{
- const char *config_value;
- config_value = config_get_str("TV",
- CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_CNT_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 5;
- }
-
- return strtol(config_value, NULL, 10);
-}
-
-static int GetAudioAmplifierNoLinePointsBuffer(const char *key_str,
- int buf_item_count, int data_buf[])
-{
- int i = 0, tmp_item_count = 0;
- int tmp_buf[CC_NO_LINE_POINTS_MAX_CNT] = { 0 };
-
- // if (data_buf[0] >= 0 && data_buf[0] <= 100) {
- // LOGD("%s, we have get the index buffer.\n", "TV");
- // return 0;
- // }
-
- tmp_item_count = buf_item_count;
- if (GetAudioCfgData(key_str, &tmp_item_count, 10, tmp_buf) < 0) {
- LOGE("%s, get index buffer data error, set default.\n", __FUNCTION__);
- return -1;
- }
-
- if (tmp_item_count != buf_item_count) {
- LOGE(
- "%s, get index buffer data error(buf item count error), set default.\n",
- __FUNCTION__);
- return -1;
- }
-
- for (i = 0; i < buf_item_count; i++) {
- data_buf[i] = tmp_buf[i];
- }
-
- return 0;
-}
-
-int *GetAudioAmplifierSupperBassNoLinePointsIndexBuffer(int get_type)
-{
- int buf_item_count = 0;
-
- buf_item_count = GetAudioAmplifierSupperBassNoLinePointsCount();
- if (GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_IND_BUF_CFG_NAME,
- buf_item_count, gSupperBassNoLinePointsIndexBuffer) < 0) {
- return GetAudioAmplifierSupperBassNoLinePointsDefIndexBuffer();
- }
-
- if (CheckNoLinePoints(buf_item_count, gSupperBassNoLinePointsIndexBuffer)
- < 0) {
- return GetAudioAmplifierSupperBassNoLinePointsDefIndexBuffer();
- }
-
- return gSupperBassNoLinePointsIndexBuffer;
-}
-
-int *GetAudioAmplifierMasterNoLinePointsDataBuffer(int get_type)
-{
- int i = 0, buf_item_count = 0, tmp_offset = 0;
- int *tmpPtr = NULL;
- unsigned char tmp_buf[CC_NO_LINE_POINTS_MAX_CNT] = { 0 };
-
- buf_item_count = GetAudioAmplifierMasterNoLinePointsCount();
-
- if (get_type == CC_GET_LUT_TV) {
- tmpPtr = gTVMasterNoLinePointsDataBuffer;
- tmp_offset = get_type * buf_item_count;
- } else if (get_type == CC_GET_LUT_AV) {
- tmpPtr = gAVMasterNoLinePointsDataBuffer;
- tmp_offset = get_type * buf_item_count;
- } else if (get_type == CC_GET_LUT_COMP) {
- tmpPtr = gCOMPMasterNoLinePointsDataBuffer;
- tmp_offset = get_type * buf_item_count;
- } else if (get_type == CC_GET_LUT_HDMI) {
- tmpPtr = gHDMIMasterNoLinePointsDataBuffer;
- tmp_offset = get_type * buf_item_count;
- } else if (get_type == CC_GET_LUT_VGA) {
- tmpPtr = gVGAMasterNoLinePointsDataBuffer;
- tmp_offset = get_type * buf_item_count;
- } else if (get_type == CC_GET_LUT_MPEG) {
- tmpPtr = gMPEGMasterNoLinePointsDataBuffer;
- tmp_offset = get_type * buf_item_count;
- }
-
- if (tmpPtr != NULL && tmpPtr[0] != -1) {
- return tmpPtr;
- }
-
- if (SSMReadAudioNoLinePoints(tmp_offset, buf_item_count, tmp_buf) < 0) {
- return GetAudioAmplifierMasterNoLinePointsDefDataBuffer(get_type);
- }
-
- if (CheckNoLinePoints(buf_item_count, tmp_buf) < 0) {
- return GetAudioAmplifierMasterNoLinePointsDefDataBuffer(get_type);
- }
-
- for (i = 0; i < buf_item_count; i++) {
- tmpPtr[i] = tmp_buf[i];
- }
-
- return tmpPtr;
-}
-
-int *GetAudioAmplifierSupperBassNoLinePointsDataBuffer(int get_type)
-{
- int i = 0, buf_item_count = 0, tmp_offset = 0;
- int *tmpPtr = NULL;
- unsigned char tmp_buf[CC_NO_LINE_POINTS_MAX_CNT] = { 0 };
-
- buf_item_count = GetAudioAmplifierSupperBassNoLinePointsCount();
-
- tmpPtr = gSupperBassNoLinePointsDataBuffer;
- if (tmpPtr != NULL && tmpPtr[0] != -1) {
- return tmpPtr;
- }
-
- tmp_offset = CC_GET_TYPE_CNT * GetAudioAmplifierMasterNoLinePointsCount();
-
- if (SSMReadAudioNoLinePoints(tmp_offset, buf_item_count, tmp_buf) < 0) {
- return GetAudioAmplifierSupperBassNoLinePointsDefDataBuffer();
- }
-
- if (CheckNoLinePoints(buf_item_count, tmp_buf) < 0) {
- return GetAudioAmplifierSupperBassNoLinePointsDefDataBuffer();
- }
-
- for (i = 0; i < buf_item_count; i++) {
- tmpPtr[i] = tmp_buf[i];
- }
-
- return tmpPtr;
-}
-
-int *GetAudioAmplifierMasterNoLinePointsDefIndexBuffer()
-{
- int i = 0, buf_item_count = 0;
-
- buf_item_count = GetAudioAmplifierMasterNoLinePointsCount();
- if (GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_MASTER_NOLINE_POINT_IND_DEF_BUF_CFG_NAME,
- buf_item_count, gMasterNoLinePointsDefIndexBuffer) < 0) {
- gMasterNoLinePointsDefIndexBuffer[0] = 1;
-
- for (i = 1; i <= 10; i++) {
- gMasterNoLinePointsDefIndexBuffer[i] = i * 10;
- }
- }
-
- if (CheckNoLinePoints(buf_item_count, gMasterNoLinePointsDefIndexBuffer)
- < 0) {
- gMasterNoLinePointsDefIndexBuffer[0] = 1;
-
- for (i = 1; i <= 10; i++) {
- gMasterNoLinePointsDefIndexBuffer[i] = i * 10;
- }
- }
-
- return gMasterNoLinePointsDefIndexBuffer;
-}
-
-int *GetAudioAmplifierSupperBassNoLinePointsDefIndexBuffer()
-{
- int i = 0, buf_item_count = 0;
-
- buf_item_count = GetAudioAmplifierSupperBassNoLinePointsCount();
- if (GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_IND_DEF_BUF_CFG_NAME,
- buf_item_count, gSupperBassNoLinePointsDefIndexBuffer) < 0) {
- gSupperBassNoLinePointsDefIndexBuffer[0] = 1;
-
- for (i = 1; i <= 4; i++) {
- gSupperBassNoLinePointsDefIndexBuffer[i] = i * 25;
- }
- }
-
- if (CheckNoLinePoints(buf_item_count, gSupperBassNoLinePointsDefIndexBuffer)
- < 0) {
- gSupperBassNoLinePointsDefIndexBuffer[0] = 1;
-
- for (i = 1; i <= 4; i++) {
- gSupperBassNoLinePointsDefIndexBuffer[i] = i * 25;
- }
- }
-
- return gSupperBassNoLinePointsDefIndexBuffer;
-}
-
-int *GetAudioAmplifierMasterNoLinePointsDefDataBuffer(int buf_type)
-{
- int i = 0, buf_item_count = 0, point_buffer_flag = 0;
-
- buf_item_count = GetAudioAmplifierMasterNoLinePointsCount();
-
- switch (buf_type) {
- case CC_GET_LUT_TV:
- point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_TV_BUF_CFG_NAME,
- buf_item_count, gMasterNoLinePointsDefDataBuffer);
- break;
- case CC_GET_LUT_AV:
- point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_AV_BUF_CFG_NAME,
- buf_item_count, gMasterNoLinePointsDefDataBuffer);
- break;
- case CC_GET_LUT_COMP:
- point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_COMP_BUF_CFG_NAME,
- buf_item_count, gMasterNoLinePointsDefDataBuffer);
- break;
- case CC_GET_LUT_HDMI:
- point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_HDMI_BUF_CFG_NAME,
- buf_item_count, gMasterNoLinePointsDefDataBuffer);
- break;
- case CC_GET_LUT_VGA:
- point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_VGA_BUF_CFG_NAME,
- buf_item_count, gMasterNoLinePointsDefDataBuffer);
- break;
- case CC_GET_LUT_MPEG:
- point_buffer_flag = GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_MASTER_NOLINE_POINT_DATA_MPEG_BUF_CFG_NAME,
- buf_item_count, gMasterNoLinePointsDefDataBuffer);
- break;
- default:
- point_buffer_flag = -1;
- // LOGE("buffer type is wrong ,please check input Parameter !");
- break;
- }
-
- if (point_buffer_flag < 0) {
- for (i = 0; i < buf_item_count; i++) {
- gMasterNoLinePointsDefDataBuffer[i] = 100 + i;
- }
-
- return gMasterNoLinePointsDefDataBuffer;
- }
-
- if (CheckNoLinePoints(buf_item_count, gMasterNoLinePointsDefDataBuffer)
- < 0) {
- for (i = 0; i < buf_item_count; i++) {
- gMasterNoLinePointsDefDataBuffer[i] = 100 + i;
- }
- }
-
- return gMasterNoLinePointsDefDataBuffer;
-}
-
-int *GetAudioAmplifierSupperBassNoLinePointsDefDataBuffer()
-{
- int i = 0, buf_item_count = 0;
-
- buf_item_count = GetAudioAmplifierSupperBassNoLinePointsCount();
- if (GetAudioAmplifierNoLinePointsBuffer(
- CS_AUDIO_AMP_SUPPERBASS_NOLINE_POINT_DATA_DEF_BUF_CFG_NAME,
- buf_item_count, gSupperBassNoLinePointsDefDataBuffer) < 0) {
- for (i = 0; i < buf_item_count; i++) {
- gSupperBassNoLinePointsDefDataBuffer[i] = 100 + i;
- }
- }
-
- if (CheckNoLinePoints(buf_item_count, gSupperBassNoLinePointsDefDataBuffer)
- < 0) {
- for (i = 0; i < buf_item_count; i++) {
- gSupperBassNoLinePointsDefDataBuffer[i] = 100 + i;
- }
- }
-
- return gSupperBassNoLinePointsDefDataBuffer;
-}
-
-int GetAudioAmplifierBalanceExchangeCFG()
-{
- const char *config_value;
- config_value = config_get_str("TV", CS_AUDIO_AMP_BALANCE_EXCHG_CFG_NAME,
- "null");
- if (strcmp(config_value, "null") == 0) {
- return 0; //return 0 to disable balance exchange
- }
-
- return strtol(config_value, NULL, 10);
-}
-
-int GetAudioMainVolLutBufCFGIndexModifyEnable()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", "audio.amp.master.cfgindex.mod.en",
- "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioMainVolLutBufNameModifyUbootenvCFG()
-{
- char config_value[PROPERTY_VALUE_MAX];
-
- memset(config_value, '\0', 32);
-
- property_get("ubootenv.var.ampindex", config_value, "null");
- if (strcasecmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioMainVolLutBufNameModifyFromUbootenv()
-{
- const char *config_value;
-
- config_value = config_get_str("TV",
- "audio.amp.mainvol.lutbufname.mod.ubootenv", "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioMainVolLutBufNameModifyEnableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", "audio.amp.mainvol.lutbufname.mod.en",
- "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioMainVolLutBufNameCFG(int get_type, char name_buf[])
-{
- if (get_type == CC_GET_LUT_TV) {
- strcpy(name_buf, "audio.amp.mainvol.tv.lb.name");
- } else if (get_type == CC_GET_LUT_AV) {
- strcpy(name_buf, "audio.amp.mainvol.av.lb.name");
- } else if (get_type == CC_GET_LUT_COMP) {
- strcpy(name_buf, "audio.amp.mainvol.comp.lb.name");
- } else if (get_type == CC_GET_LUT_HDMI) {
- strcpy(name_buf, "audio.amp.mainvol.hdmi.lb.name");
- } else if (get_type == CC_GET_LUT_VGA) {
- strcpy(name_buf, "audio.amp.mainvol.vga.lb.name");
- } else if (get_type == CC_GET_LUT_MPEG) {
- strcpy(name_buf, "audio.amp.mainvol.mpeg.lb.name");
- } else if (get_type == CC_GET_LUT_HDMI_4K2K) {
- strcpy(name_buf, "audio.amp.mainvol.hdmi4k2k.lb.name");
- } else if (get_type == CC_GET_LUT_USB_4K2K) {
- strcpy(name_buf, "audio.amp.mainvol.usb4k2k.lb.name");
- } else {
- return -1;
- }
-
- return 0;
-}
-
-static int GetAudioMainVolLutBufDataByModifyName(int get_type,
- int *VolumeDigitLutBuf_XX)
-{
- int i = 0, buf_count = 0, buf_item_count = 0;
- char key_buf[128];
- const char *value_buf;
-
- memset(key_buf, '\0', 128);
-
- GetAudioMainVolLutBufNameCFG(get_type, key_buf);
-
- value_buf = config_get_str("TV", key_buf, (char *) "");
-
- if (strcmp(value_buf, "") != 0) {
- if (GetAudioCfgBufferData(value_buf, &buf_count, &buf_item_count, 10,
- VolumeDigitLutBuf_XX) == 0) {
- return 0;
- }
- }
-
- return -1;
-}
-
-int *GetAudioAmplifierMasterVolumeLUTBufferPtr(int get_type, int audio_std)
-{
- int buf_count = 0, buf_item_count = 0;
- int name_en = GetAudioMainVolLutBufNameModifyEnableCFG();
-
- if (name_en == 1) {
- if (get_type == CC_GET_LUT_TV) {
- if (GetAudioMainVolLutBufDataByModifyName(get_type,
- mTVMainVolumeDigitLutBuf_XX) == 0) {
- return mTVMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_AV) {
- if (GetAudioMainVolLutBufDataByModifyName(get_type,
- mAVMainVolumeDigitLutBuf_XX) == 0) {
- return mAVMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_COMP) {
- if (GetAudioMainVolLutBufDataByModifyName(get_type,
- mCOMPMainVolumeDigitLutBuf_XX) == 0) {
- return mCOMPMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_HDMI) {
- if (GetAudioMainVolLutBufDataByModifyName(get_type,
- mHDMIMainVolumeDigitLutBuf_XX) == 0) {
- return mHDMIMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_VGA) {
- if (GetAudioMainVolLutBufDataByModifyName(get_type,
- mVGAMainVolumeDigitLutBuf_XX) == 0) {
- return mVGAMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_MPEG) {
- if (GetAudioMainVolLutBufDataByModifyName(get_type,
- mMPEGMainVolumeDigitLutBuf_XX) == 0) {
- return mMPEGMainVolumeDigitLutBuf_XX;
- }
- }
- } else {
- if (get_type == CC_GET_LUT_TV) {
- if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_TV_LUTBUF_CFG_NAME,
- &buf_count, &buf_item_count, 10,
- mTVMainVolumeDigitLutBuf_XX) == 0) {
- return mTVMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_AV) {
- if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_AV_LUTBUF_CFG_NAME,
- &buf_count, &buf_item_count, 10,
- mAVMainVolumeDigitLutBuf_XX) == 0) {
- return mAVMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_COMP) {
- if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_COMP_LUTBUF_CFG_NAME,
- &buf_count, &buf_item_count, 10,
- mCOMPMainVolumeDigitLutBuf_XX) == 0) {
- return mCOMPMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_HDMI) {
- if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_HDMI_LUTBUF_CFG_NAME,
- &buf_count, &buf_item_count, 10,
- mHDMIMainVolumeDigitLutBuf_XX) == 0) {
- return mHDMIMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_VGA) {
- if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_VGA_LUTBUF_CFG_NAME,
- &buf_count, &buf_item_count, 10,
- mVGAMainVolumeDigitLutBuf_XX) == 0) {
- return mVGAMainVolumeDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_MPEG) {
- if (GetAudioCfgBufferData(CS_AUDIO_AMP_MAINVOL_MPEG_LUTBUF_CFG_NAME,
- &buf_count, &buf_item_count, 10,
- mMPEGMainVolumeDigitLutBuf_XX) == 0) {
- return mMPEGMainVolumeDigitLutBuf_XX;
- }
- }
- }
- return NULL;
-}
-
-int GetAudioSupperBassVolLutBufCFGIndexModifyEnable()
-{
- const char *config_value;
- config_value = config_get_str("TV", "audio.amp.supperbass.cfgindex.mod.en",
- "null");
- //LOGD("%s, get audio.amp.supperbass.cfgindex.mod.en is %s \n", "TV",
- // config_value);
-
- if (strcmp(config_value, "null") == 0) {
- // LOGD(
- // "%s, get config modify value \"%s\", return audio.amp.supperbass.cfgindex.mod.en.\n",
- // "TV", config_value);
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioSupperBassVolLutBufNameModifyEnableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV",
- "audio.amp.supbassvol.lutbufname.mod.en", "null");
- //LOGD("%s, audio.amp.supbassvol.lutbufname.mod.en is %s \n", "TV",
- // config_value);
-
- if (strcmp(config_value, "null") == 0) {
- // LOGD(
- // "%s, get config enable value \"%s\", return 0 to not enable moidfy lut buffer name.\n",
- // "TV", config_value);
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioSupperBassVolLutBufNameCFG(int get_type, char name_buf[])
-{
- if (get_type == CC_GET_LUT_TV) {
- strcpy(name_buf, "audio.amp.supbassvol.tv.lb.name");
- } else if (get_type == CC_GET_LUT_AV) {
- strcpy(name_buf, "audio.amp.supbassvol.av.lb.name");
- } else if (get_type == CC_GET_LUT_COMP) {
- strcpy(name_buf, "audio.amp.supbassvol.comp.lb.name");
- } else if (get_type == CC_GET_LUT_HDMI) {
- strcpy(name_buf, "audio.amp.supbassvol.hdmi.lb.name");
- } else if (get_type == CC_GET_LUT_VGA) {
- strcpy(name_buf, "audio.amp.supbassvol.vga.lb.name");
- } else if (get_type == CC_GET_LUT_MPEG) {
- strcpy(name_buf, "audio.amp.supbassvol.mpeg.lb.name");
- } else if (get_type == CC_GET_LUT_HDMI_4K2K) {
- strcpy(name_buf, "audio.amp.supbassvol.hdmi4k2k.lb.name");
- } else if (get_type == CC_GET_LUT_USB_4K2K) {
- strcpy(name_buf, "audio.amp.supbassvol.usb4k2k.lb.name");
- } else {
- return -1;
- }
-
- return 0;
-}
-
-static int GetAudioSupperBassByModifyName(int get_type,
- int *VolumeDigitLutBuf_XX)
-{
- int i = 0, buf_count = 0, buf_item_count = 0;
- char key_buf[128];
- const char *value_buf;
-
- memset(key_buf, '\0', 128);
-
- GetAudioSupperBassVolLutBufNameCFG(get_type, key_buf);
-
- value_buf = config_get_str("TV", key_buf, (char *) "");
- //LOGD("%s, get_type = %d, key_buf = %s, value_buf = %s \n", "TV",
- // get_type, key_buf, value_buf);
-
- if (strcmp(value_buf, "") != 0) {
- if (GetAudioCfgBufferData(value_buf, &buf_count, &buf_item_count, 10,
- VolumeDigitLutBuf_XX) == 0) {
- return 0;
- }
- }
-
- return -1;
-}
-
-int *GetAudioAmplifierSupperBassVolumeLUTBufferPtr(int get_type,
- int audio_std)
-{
- int buf_count = 0, buf_item_count = 0;
-
- int name_en = GetAudioSupperBassVolLutBufNameModifyEnableCFG();
-
- if (name_en == 1) {
- if (get_type == CC_GET_LUT_TV) {
- if (GetAudioSupperBassByModifyName(get_type,
- mTVSupperBassDigitLutBuf_XX) == 0) {
- return mTVSupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_AV) {
- if (GetAudioSupperBassByModifyName(get_type,
- mAVSupperBassDigitLutBuf_XX) == 0) {
- return mAVSupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_COMP) {
- if (GetAudioSupperBassByModifyName(get_type,
- mCOMPSupperBassDigitLutBuf_XX) == 0) {
- return mCOMPSupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_HDMI) {
- if (GetAudioSupperBassByModifyName(get_type,
- mHDMISupperBassDigitLutBuf_XX) == 0) {
- return mHDMISupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_VGA) {
- if (GetAudioSupperBassByModifyName(get_type,
- mVGASupperBassDigitLutBuf_XX) == 0) {
- return mVGASupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_MPEG) {
- if (GetAudioSupperBassByModifyName(get_type,
- mMPEGSupperBassDigitLutBuf_XX) == 0) {
- return mMPEGSupperBassDigitLutBuf_XX;
- }
- }
- } else {
- if (get_type == CC_GET_LUT_TV) {
- if (GetAudioCfgBufferData(
- CS_AUDIO_AMP_SUPPERBASSVOL_TV_LUTBUF_CFG_NAME, &buf_count,
- &buf_item_count, 10, mTVSupperBassDigitLutBuf_XX) == 0) {
- return mTVSupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_AV) {
- if (GetAudioCfgBufferData(
- CS_AUDIO_AMP_SUPPERBASSVOL_AV_LUTBUF_CFG_NAME, &buf_count,
- &buf_item_count, 10, mAVSupperBassDigitLutBuf_XX) == 0) {
- return mAVSupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_COMP) {
- if (GetAudioCfgBufferData(
- CS_AUDIO_AMP_SUPPERBASSVOL_COMP_LUTBUF_CFG_NAME, &buf_count,
- &buf_item_count, 10, mCOMPSupperBassDigitLutBuf_XX) == 0) {
- return mCOMPSupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_HDMI) {
- if (GetAudioCfgBufferData(
- CS_AUDIO_AMP_SUPPERBASSVOL_HDMI_LUTBUF_CFG_NAME, &buf_count,
- &buf_item_count, 10, mHDMISupperBassDigitLutBuf_XX) == 0) {
- return mHDMISupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_VGA) {
- if (GetAudioCfgBufferData(
- CS_AUDIO_AMP_SUPPERBASSVOL_VGA_LUTBUF_CFG_NAME, &buf_count,
- &buf_item_count, 10, mVGASupperBassDigitLutBuf_XX) == 0) {
- return mVGASupperBassDigitLutBuf_XX;
- }
- } else if (get_type == CC_GET_LUT_MPEG) {
- if (GetAudioCfgBufferData(
- CS_AUDIO_AMP_SUPPERBASSVOL_MPEG_LUTBUF_CFG_NAME, &buf_count,
- &buf_item_count, 10, mMPEGSupperBassDigitLutBuf_XX) == 0) {
- return mMPEGSupperBassDigitLutBuf_XX;
- }
- }
- }
-
- return NULL;
-}
-
-int *GetAudioEQPresetBufferPtr()
-{
- int buf_count = 0, buf_item_count = 0;
- int *tmpDataBufPtr = NULL;
-
- tmpDataBufPtr = mEQPresetValueBuf_XX;
-
- memset((void *) tmpDataBufPtr, 0, sizeof(int) * CC_EQ_PRESET_BUF_SIZE);
-
- if (GetAudioCfgBufferData(CS_EQ_PRESETBUF_CFG_NAME, &buf_count,
- &buf_item_count, 10, tmpDataBufPtr) == 0) {
- return tmpDataBufPtr;
- }
-
- return mEQPresetDefBuf;
-}
-
-int GetAudioDVISupportEnable()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_DVI_SUPPORT_ENABLE_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetTvAudioCardID(char tv_card_id_buf[])
-{
- const char *value;
- value = config_get_str("TV", "audio.tv.card.id", "null");
- //LOGD("%s, get card id is \"%s\".\n", "TV", tv_card_id_buf);
-
- strcpy(tv_card_id_buf, value);
- if (strcmp(value, "null") == 0) {
- strcpy(tv_card_id_buf, "0");
- // LOGD("%s, card id not config, we set to default \"%s\".\n",
- // "TV", "0");
- }
-
- return 0;
-}
-
-int GetTvAudioCardName(char tv_card_name_buf[])
-{
- const char *value;
- value = config_get_str("TV", "audio.tv.card.name", "null");
- //LOGD("%s, get card name is \"%s\".\n", "TV", tv_card_name_buf);
-
- strcpy(tv_card_name_buf, value);
- if (strcmp(value, "null") == 0) {
- strcpy(tv_card_name_buf, "AMLSYNO9629");
- // LOGD("%s, card name not config, we set to default \"%s\".\n",
- // "TV", "AML-M2");
- }
-
- return 0;
-}
-
-int GetTvAudioCardNeedSet()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", "audio.tv.card.needset", "null");
- //LOGD("%s, get \"%s\" is \"%s\".\n", "TV", "audio.tv.card.needset",
- // config_value);
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- if (strtoul(config_value, NULL, 10) == 0) {
- return 0;
- }
-
- return 1;
-}
-
-static int GetAudioEffectAmplifierGainCfg(const char *cfg_name,
- int def_gain_val, int max_gain_val)
-{
- int tmp_val;
- const char *config_value;
-
- config_value = config_get_str("TV", cfg_name, "null");
- //LOGD("%s, get %s is \"%s\".\n", "TV", cfg_name, config_value);
-
- if (strcmp(config_value, "null") == 0) {
- // LOGD(
- // "%s, get config \"%s\" is \"%s\", return default audio effect amplifier gain value(%d).\n",
- // "TV", cfg_name, config_value, def_gain_val);
- return def_gain_val;
- }
-
- tmp_val = strtoul(config_value, NULL, 10);
- if (tmp_val < 0 || tmp_val > max_gain_val) {
- // LOGD(
- // "%s, get config \"%s\" is error, it(%d) should between %d and %d, return default audio effect amplifier gain value(%d)\n",
- // "TV", cfg_name, tmp_val, 0, max_gain_val, def_gain_val);
- tmp_val = def_gain_val;
- }
-
- return tmp_val;
-}
-
-int GetAudioSRSModuleDisableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_SRS_MOUDLE_DISABLE_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioSRSSourroundDisableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_SRS_SOURROUND_DISABLE_CFG_NAME,
- "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioSRSTrubassDisableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_SRS_TRUBASS_DISABLE_CFG_NAME,
- "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioSRSDialogClarityDisableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_SRS_DIALOGCLARITY_DISABLE_CFG_NAME,
- "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-static int GetAudioSRSGainCfg(const char *cfg_name, int def_gain_val)
-{
- int tmp_val;
- const char *config_value;
-
- config_value = config_get_str("TV", cfg_name, "null");
- //LOGD("%s, get %s is \"%s\".\n", "TV", cfg_name, config_value);
-
- if (strcmp(config_value, "null") == 0) {
- // LOGD(
- // "%s, get config \"%s\" is \"%s\", return -1 to use default gain value.\n",
- // "TV", cfg_name, config_value);
- return -1;
- }
-
- tmp_val = strtoul(config_value, NULL, 10);
- if (tmp_val < 0 || tmp_val > 100) {
- tmp_val = def_gain_val;
- // LOGD("%s, get config \"%s\" is error, we set it to %d\n", "TV",
- // cfg_name, tmp_val);
- }
-
- return tmp_val;
-}
-
-static int GetAudioSRSAmplifierGainCfg(const char *cfg_name, int def_gain_val)
-{
- return GetAudioEffectAmplifierGainCfg(cfg_name, def_gain_val, 24);
-}
-
-static int GetAudioEQAmplifierGainCfg(const char *cfg_name, int def_gain_val)
-{
- return GetAudioEffectAmplifierGainCfg(cfg_name, def_gain_val, 24);
-}
-
-int GetAudioSRSSourroundGainCfg()
-{
- return GetAudioSRSGainCfg(CS_SRS_SOURROUND_GAIN_CFG_NAME,
- CC_SRS_SURROUND_GAIN_VAL);
-}
-
-int GetAudioSRSSourroundAmplifierMasterGainCfg()
-{
- return GetAudioSRSAmplifierGainCfg(
- CS_SRS_SOURROUND_AMP_MASTER_GAIN_CFG_NAME,
- CC_SRS_SURROUND_AMP_MASTER_GAIN_VAL);
-}
-
-int GetAudioSRSSourroundAmplifierSupperBassGainCfg()
-{
- return GetAudioSRSAmplifierGainCfg(
- CS_SRS_SOURROUND_AMP_SUPPERBASS_GAIN_CFG_NAME,
- CC_SRS_SURROUND_AMP_SUPPERBASS_GAIN_VAL);
-}
-
-int GetAudioSRSTrubassOnlyGainCfg()
-{
- return GetAudioSRSGainCfg(CS_SRS_TRUBASS_ONLY_GAIN_CFG_NAME,
- CC_SRS_TRUBASS_ONLY_GAIN_VAL);
-}
-
-int GetAudioSRSTrubassOnlyAmplifierMasterGainCfg()
-{
- return GetAudioSRSAmplifierGainCfg(
- CS_SRS_TRUBASS_ONLY_AMP_MASTER_GAIN_CFG_NAME,
- CC_SRS_TRUBASS_ONLY_AMP_MASTER_GAIN_VAL);
-}
-
-int GetAudioSRSTrubassOnlyAmplifierSupperBassGainCfg()
-{
- return GetAudioSRSAmplifierGainCfg(
- CS_SRS_TRUBASS_ONLY_AMP_SUPPERBASS_GAIN_CFG_NAME,
- CC_SRS_TRUBASS_ONLY_AMP_SUPPERBASS_GAIN_VAL);
-}
-
-int GetAudioSRSDialogClarityOnlyGainCfg()
-{
- return GetAudioSRSGainCfg(CS_SRS_DIALOGCLARITY_ONLY_GAIN_CFG_NAME,
- CC_SRS_DIALOGCLARITY_ONLY_GAIN_VAL);
-}
-
-int GetAudioSRSDialogClarityOnlyAmplifierMasterGainCfg()
-{
- return GetAudioSRSAmplifierGainCfg(
- CS_SRS_DIALOGCLARITY_ONLY_AMP_MASTER_GAIN_CFG_NAME,
- CC_SRS_DIALOGCLARITY_ONLY_AMP_MASTER_GAIN_VAL);
-}
-
-int GetAudioSRSDialogClarityOnlyAmplifierSupperBassGainCfg()
-{
- return GetAudioSRSAmplifierGainCfg(
- CS_SRS_DIALOGCLARITY_ONLY_AMP_SUPPERBASS_GAIN_CFG_NAME,
- CC_SRS_DIALOGCLARITY_ONLY_AMP_SUPPERBASS_GAIN_VAL);
-}
-
-int GetAudioSRSDialogClarityOnlyDefinitionGainCfg()
-{
- return GetAudioSRSGainCfg(
- CS_SRS_DIALOGCLARITY_ONLY_DEFINITION_GAIN_CFG_NAME,
- CC_SRS_DIALOGCLARITY_ONLY_DEFINITION_GAIN_VAL);
-}
-
-int GetAudioSRSTrubassAndDialogClarityTrubassGainCfg()
-{
- return GetAudioSRSGainCfg(
- CS_SRS_TRUBASS_DIALOGCLARITY_TRUBASS_GAIN_CFG_NAME,
- CC_SRS_TRUBASS_DIALOGCLARITY_TRUBASS_GAIN_VAL);
-}
-
-int GetAudioSRSTrubassAndDialogClarityDialogClarityGainCfg()
-{
- return GetAudioSRSGainCfg(
- CS_SRS_TRUBASS_DIALOGCLARITY_DIALOGCLARITY_GAIN_CFG_NAME,
- CC_SRS_TRUBASS_DIALOGCLARITY_DIALOGCLARITY_GAIN_VAL);
-}
-
-int GetAudioSRSTrubassAndDialogClarityDefinitionGainCfg()
-{
- return GetAudioSRSGainCfg(
- CS_SRS_TRUBASS_DIALOGCLARITY_DEFINITION_GAIN_CFG_NAME,
- CC_SRS_TRUBASS_DIALOGCLARITY_DEFINITION_GAIN_VAL);
-}
-
-int GetAudioSRSTrubassAndDialogClarityAmplifierMasterGainCfg()
-{
- return GetAudioSRSAmplifierGainCfg(
- CS_SRS_TRUBASS_DIALOGCLARITY_AMP_MASTER_GAIN_CFG_NAME,
- CC_SRS_TRUBASS_DIALOGCLARITY_AMP_MASTER_GAIN_VAL);
-}
-
-int GetAudioSRSTrubassAndDialogClarityAmplifierSupperBassGainCfg()
-{
- return GetAudioSRSAmplifierGainCfg(
- CS_SRS_TRUBASS_DIALOGCLARITY_AMP_SUPPERBASS_GAIN_CFG_NAME,
- CC_SRS_TRUBASS_DIALOGCLARITY_AMP_SUPPERBASS_GAIN_VAL);
-}
-
-int GetAudioSRSSupperBassTrubassSpeakerSizeCfg(int get_flag)
-{
- int tmp_val;
- char cfg_name[128] = { 0 };
- const char *config_value;
-
- if (get_flag == 0) {
- strcpy(cfg_name, CS_SRS_SUPPERBASS_OFF_TRUBASS_SPEAKER_SIZE_CFG_NAME);
- } else {
- strcpy(cfg_name, CS_SRS_SUPPERBASS_ON_TRUBASS_SPEAKER_SIZE_CFG_NAME);
- }
-
- config_value = config_get_str("TV", cfg_name, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return -1;
- }
-
- tmp_val = strtoul(config_value, NULL, 10);
- if (tmp_val < 0 || tmp_val > 7) {
- tmp_val = -1;
- }
-
- return tmp_val;
-}
-
-int GetAudioEQAmplifierMasterAddGainCfg()
-{
- return GetAudioEQAmplifierGainCfg(CS_EQ_AMP_MASTER_GAIN_CFG_NAME,
- CC_EQ_AMP_MASTER_GAIN_VAL);
-}
-
-int GetAudioEQAmplifierSupperBassAddGainCfg()
-{
- return GetAudioEQAmplifierGainCfg(CS_EQ_AMP_SUPPERBASS_GAIN_CFG_NAME,
- CC_EQ_AMP_SUPPERBASS_GAIN_VAL);
-}
-
-int GetAudioEqModuleDisableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_EQ_MOUDLE_DISABLE_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioEqUsingAndroidCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_EQ_USING_ANDROID_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioEQGainRangeCFG(int *min_val, int *max_val)
-{
- int i = 0, buf_item_count = 0, tmp_item_count = 0;
- int tmp_buf[16] = { 0 };
-
- buf_item_count = 2;
- tmp_item_count = buf_item_count;
- if (GetAudioCfgData(CS_EQ_GAIN_RANGE_CFG_NAME, &tmp_item_count, 10, tmp_buf)
- < 0) {
- return -1;
- }
-
- if (tmp_item_count != buf_item_count) {
- return -1;
- }
-
- *min_val = tmp_buf[0];
- *max_val = tmp_buf[1];
-
- return 0;
-}
-
-int GetAudioEQUIGainRangeCFG(int *min_val, int *max_val)
-{
- int i = 0, buf_item_count = 0, tmp_item_count = 0;
- int tmp_buf[16] = { 0 };
-
- buf_item_count = 2;
- tmp_item_count = buf_item_count;
- if (GetAudioCfgData(CS_EQ_UI_GAIN_RANGE_CFG_NAME, &tmp_item_count, 10,
- tmp_buf) < 0) {
- return -1;
- }
-
- if (tmp_item_count != buf_item_count) {
- return -1;
- }
-
- *min_val = tmp_buf[0];
- *max_val = tmp_buf[1];
-
- return 0;
-}
-
-int GetAudioDumpDataEnableFlagCfg()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_AUDIO_DUMP_DATA_ENABLE_CFG_NAME,
- "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtol(config_value, NULL, 10);
-}
-
-int GetAudioKeyMuteCfg()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_KEY_MUTE_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioAVOutInitMuteStatusCFG()
-{
- const char *config_value;
- int status = 0;
-
- config_value = config_get_str("TV", CS_AVOUT_INIT_MUTE_CFG_NAME, "null");
- LOGD("%s, get %s is \"%s\".\n", __FUNCTION__, CS_AVOUT_INIT_MUTE_CFG_NAME,
- config_value);
-
- if (strcmp(config_value, "enable") == 0) {
- status = 1;
- } else {
- status = 0;
- }
-
- return status;
-}
-
-int GetAudioSupperBassModuleDisableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_SUPPERBASS_MODULE_DISABLE_CFG_NAME,
- "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioSupperBassSwitchDisableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_SUPPERBASS_SWITCH_DISABLE_CFG_NAME,
- "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-static int GetAudioSrcInputLineInVol(const char *cfg_str, int *l_vol,
- int *r_vol)
-{
- int buf_item_count = 2;
- int data_buf[2] = { -1, -1 };
-
- if (GetAudioCfgData(cfg_str, &buf_item_count, 10, data_buf) < 0) {
- return -1;
- }
-
- if (buf_item_count < 2) {
- return -1;
- }
-
- *l_vol = data_buf[0];
- *r_vol = data_buf[1];
-
- return 0;
-}
-
-int GetAudioSrcInputTVLineInVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineInVol(CS_SRC_INPUT_TV_LINEIN_VOL_CFG_NAME, l_vol,
- r_vol);
-}
-
-int GetAudioSrcInputAVLineInVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineInVol(CS_SRC_INPUT_AV_LINEIN_VOL_CFG_NAME, l_vol,
- r_vol);
-}
-
-int GetAudioSrcInputCOMPLineInVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineInVol(CS_SRC_INPUT_COMP_LINEIN_VOL_CFG_NAME,
- l_vol, r_vol);
-}
-
-int GetAudioSrcInputHDMILineInVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineInVol(CS_SRC_INPUT_HDMI_LINEIN_VOL_CFG_NAME,
- l_vol, r_vol);
-}
-
-int GetAudioSrcInputVGALineInVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineInVol(CS_SRC_INPUT_VGA_LINEIN_VOL_CFG_NAME,
- l_vol, r_vol);
-}
-
-int GetAudioSrcInputMPEGLineInVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineInVol(CS_SRC_INPUT_MPEG_LINEIN_VOL_CFG_NAME,
- l_vol, r_vol);
-}
-
-static int GetAudioSrcInputLineOutVol(const char *cfg_str, int *l_vol,
- int *r_vol)
-{
- int buf_item_count = 2;
- int data_buf[2] = { -1, -1 };
-
- if (GetAudioCfgData(cfg_str, &buf_item_count, 10, data_buf) < 0) {
- return -1;
- }
-
- if (buf_item_count < 2) {
- return -1;
- }
-
- *l_vol = data_buf[0];
- *r_vol = data_buf[1];
-
- return 0;
-}
-
-int GetAudioSrcInputTVLineOutVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_TV_LINEOUT_VOL_CFG_NAME,
- l_vol, r_vol);
-}
-
-int GetAudioSrcInputAVLineOutVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_AV_LINEOUT_VOL_CFG_NAME,
- l_vol, r_vol);
-}
-
-int GetAudioSrcInputCOMPLineOutVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_COMP_LINEOUT_VOL_CFG_NAME,
- l_vol, r_vol);
-}
-
-int GetAudioSrcInputHDMILineOutVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_HDMI_LINEOUT_VOL_CFG_NAME,
- l_vol, r_vol);
-}
-
-int GetAudioSrcInputVGALineOutVol(int *l_vol, int *r_vol)
-{
- return GetAudioSrcInputLineOutVol(CS_SRC_INPUT_VGA_LINEOUT_VOL_CFG_NAME,
- l_vol, r_vol);
-}
-
-int GetAudioSrcInputMPEGLineOutVol(int *l_vol, int *r_vol)
-{
- int tmp_val = 0;
- const char *config_value;
-
- config_value = config_get_str("TV",
- CS_SRC_INPUT_MPEG_LINEOUT_VOL_CFG_NAME_OLD, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return GetAudioSrcInputLineOutVol(
- CS_SRC_INPUT_MPEG_LINEOUT_VOL_CFG_NAME, l_vol, r_vol);
- }
-
- tmp_val = strtol(config_value, NULL, 10);
-
- *l_vol = tmp_val;
- *r_vol = tmp_val;
-
- return 0;
-}
-
-int GetAudioWallEffectTypeCfg()
-{
- return GetAudioCfgSingleIntData("audio.walleffect.type", 0);
-}
-
-static int GetAudioMainVolumeLutBufCompensation(const char *cfg_str,
- int *cfg_flag)
-{
- const char *config_value;
-
- config_value = config_get_str("TV", cfg_str, "null");
- //LOGD("%s, get \"%s\" is \"%s\".\n", "TV", cfg_str, config_value);
-
- if (strcmp(config_value, "null") == 0) {
- if (cfg_flag != NULL) {
- *cfg_flag = 0;
- }
-
- //LOGD(
- // "%s, get config \"%s\" is \"%s\", return 0 to not compensation lut buffer.\n",
- // "TV", cfg_str, config_value);
- return 0;
- }
-
- if (cfg_flag != NULL) {
- *cfg_flag = 1;
- }
-
- return strtol(config_value, NULL, 10);
-}
-
-int GetAudioMainVolumeLutBufTVCompensation()
-{
- return GetAudioMainVolumeLutBufCompensation(
- CS_AMP_MAINVOL_LUTBUF_COMPENSATION_TV_CFG_NAME, NULL);
-}
-
-int GetAudioMainVolumeLutBufAVCompensation()
-{
- return GetAudioMainVolumeLutBufCompensation(
- CS_AMP_MAINVOL_LUTBUF_COMPENSATION_AV_CFG_NAME, NULL);
-}
-
-int GetAudioMainVolumeLutBufCOMPCompensation()
-{
- return GetAudioMainVolumeLutBufCompensation(
- CS_AMP_MAINVOL_LUTBUF_COMPENSATION_COMP_CFG_NAME, NULL);
-}
-
-int GetAudioMainVolumeLutBufHDMICompensation()
-{
- return GetAudioMainVolumeLutBufCompensation(
- CS_AMP_MAINVOL_LUTBUF_COMPENSATION_HDMI_CFG_NAME, NULL);
-}
-
-int GetAudioMainVolumeLutBufVGACompensation()
-{
- return GetAudioMainVolumeLutBufCompensation(
- CS_AMP_MAINVOL_LUTBUF_COMPENSATION_VGA_CFG_NAME, NULL);
-}
-
-int GetAudioMainVolumeLutBufMPEGCompensation()
-{
- int tmp_ret = 0, cfg_flag = 0;
-
- tmp_ret = GetAudioMainVolumeLutBufCompensation(
- CS_AMP_MAINVOL_LUTBUF_COMPENSATION_MPEG_CFG_NAME, &cfg_flag);
-
- if (cfg_flag == 0) {
- tmp_ret = GetAudioMainVolumeLutBufDTVCompensation();
- }
-
- return tmp_ret;
-}
-
-int GetAudioMainVolumeLutBufDTVCompensation()
-{
- return GetAudioMainVolumeLutBufCompensation(
- CS_AMP_MAINVOL_LUTBUF_COMPENSATION_DTV_CFG_NAME, NULL);
-}
-
-int GetAudioNoiseGateEnableCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_AUDIO_NOISE_GATE_ENABLE_CFG_NAME,
- "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-int GetAudioNoiseGateUpperBoundCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV",
- CS_AUDIO_NOISE_GATE_UPPER_BOUND_CFG_NAME, "254");
-
- return strtol(config_value, NULL, 10);
-}
-
-int GetAudioNoiseGateThresholdCFG()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", CS_AUDIO_NOISE_GATE_THRESHOLD_CFG_NAME,
- "-1");
-
- return strtol(config_value, NULL, 10);
-}
-
-int GetDisableResetSystemFrameSize()
-{
- const char *config_value;
- config_value = config_get_str("TV",
- CS_DISABLE_RESET_SYSTEM_FRAMESIZE_CFG_NAME, "null");
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
-
-static int gDisableResetSystemFrameSizeFlag = -1;
-int GetDisableReset_System_framesizeCFG(void)
-{
- if (gDisableResetSystemFrameSizeFlag == -1) {
- const char *config_value;
-
- config_value = config_get_str("TV", CS_AUDIO_SYSTEM_FRAMESIZE_CFG_NAME,
- "null");
- LOGD("%s, get %s is \"%s\".\n",
- __FUNCTION__, CS_AUDIO_SYSTEM_FRAMESIZE_CFG_NAME, config_value);
-
- if (strcmp(config_value, "disable") == 0) {
- gDisableResetSystemFrameSizeFlag = 0x55;
- } else {
- gDisableResetSystemFrameSizeFlag = 0;
- }
- }
-
- return gDisableResetSystemFrameSizeFlag;
-}
-
-int GetAudioArchitectureTypeCFG()
-{
- static int architecture_type = -1;
- const char *config_value = NULL;
-
- if (architecture_type == -1) {
- config_value = config_get_str ( "TV", CS_AUDIO_ARCHITECTURE_TYPE_CFG_NAME, "null" );
- if (strcasecmp(config_value, "null") == 0) {
- architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC;
- } else if(strcasecmp(config_value, "t866_external_dac_offboard_fbc") == 0) {
- architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC;
- } else if(strcasecmp(config_value, "t866_external_dac_offboard_customer_lib") == 0) {
- architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB;
- } else if(strcasecmp(config_value, "t866_external_dac_offboard_digital") == 0) {
- architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL;
- } else if (strcasecmp(config_value, "t866_external_dac_onboard") == 0) {
- architecture_type = CC_DAC_T866_EXTERNAL_DAC_ON_BOARD;
- } else if (strcasecmp(config_value, "t866_iternal_dac") == 0) {
- architecture_type = CC_DAC_T866_INTERNAL_DAC;
- } else if (strcasecmp(config_value, "m6c") == 0) {
- architecture_type = CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD;
- } else {
- architecture_type = CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC;
- }
- }
-
- return architecture_type;
-}
-
-static int gAudioResampleType = -1;
-int GetAudioResampleTypeCFG()
-{
- char *token = NULL;
- const char *strDelimit = ",";
- const char *config_value = NULL;
- char cfg_buf[1024];
-
- if (gAudioResampleType == -1) {
- gAudioResampleType = 0;
-
- config_value = config_get_str ( "TV", CS_AUDIO_RESAMPLE_TYPE_CFG_NAME, "null" );
- strncpy(cfg_buf, config_value, sizeof(cfg_buf));
- if (strcmp(cfg_buf, "") != 0) {
- token = strtok(cfg_buf, strDelimit);
- while (token != NULL) {
- if (strcasecmp(token, "hw") == 0) {
- gAudioResampleType |= CC_AUD_RESAMPLE_TYPE_HW;
- } else if (strcasecmp(token, "sw") == 0) {
- gAudioResampleType |= CC_AUD_RESAMPLE_TYPE_SW;
- }
-
- token = strtok(NULL, strDelimit);
- }
- } else {
- gAudioResampleType = CC_AUD_RESAMPLE_TYPE_SW; //if can't find config string, allow sw resample
- }
- }
-
- return gAudioResampleType;
-}
-
-int GetamAudioDisableFlagCFG()
-{
- static int am_audio_disable_flag = -1;
- const char *config_value = NULL;
-
- if (am_audio_disable_flag == -1) {
- config_value = config_get_str ( "TV", "audio.amaudio.disable", "null" );
- if (strcasecmp(config_value, "null") == 0 || strcasecmp(config_value, "false") == 0) {
- am_audio_disable_flag = 0;
- } else if (strcasecmp(config_value, "true") == 0) {
- am_audio_disable_flag = 1;
- } else {
- am_audio_disable_flag = 0;
- }
- }
-
- return am_audio_disable_flag;
-}
-
-int GetAudioFirstInitSetTypeCFG()
-{
- const char *config_value;
- config_value = config_get_str ( "TV", "audio.firstinitset.type", "null" );
-
- if (strcmp(config_value, "null") == 0) {
- return 0;
- }
-
- return strtoul(config_value, NULL, 10);
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <android/log.h>
+#include <cutils/properties.h>
+
+#include "../tvsetting/CTvSetting.h"
+#include "../tvconfig/tvconfig.h"
+#include "audio_cfg.h"
+
+#define LOG_TAG "audio_cfg"
+#include "CTvLog.h"
+
+static const char AudioAmpMainVolLutBaseNameTable[CC_GET_TYPE_CNT][128] = {"audio.amp.mainvol.tv.lutbuf",//0
+ "audio.amp.mainvol.av.lutbuf",//1
+ "audio.amp.mainvol.comp.lutbuf",//2
+ "audio.amp.mainvol.hdmi.lutbuf",//3
+ "audio.amp.mainvol.vga.lutbuf",//4
+ "audio.amp.mainvol.mpeg.lutbuf",//5
+ "audio.amp.mainvol.hdmi4k2k.lutbuf",//6
+ "audio.amp.mainvol.usb4k2k.lutbuf"//7
+ };
+
+static const int Default_EQGain_Table[24] = {
+ //
+ 50, 50, 50, 50, 50, 50, // SM_STD
+ 70, 60, 50, 60, 70, 50, // SM_MUSIC
+ 25, 50, 70, 66, 25, 50, // SM_NEWS
+ 75, 65, 50, 65, 75, 50, // SM_THEATER
+};
+
+static const int Default_AVoutGain_Table[9] = {
+ //PGA_IN ADC_Capture DAC_Playback
+ 11, 92, 255, // CC_AUDIO_IN_SOURCE_LINEIN
+ 11, 92, 255, //CC_AUDIO_IN_SOURCE_HDMI
+ 11, 92, 255, //CC_AUDIO_IN_SOURCE_ATV
+};
+
+int GetAudioAmpMasterNolinePointData(int get_type, const char *value_buf, int data_buf[])
+{
+ const char *config_value;
+ if (value_buf != NULL) {
+ config_value = config_get_str("TV", value_buf, "null");
+ } else {
+ switch (get_type) {
+ case CC_GET_LUT_TV: {
+ config_value = config_get_str("TV", "audio.amp.master.noline.point.data.tv", "null");
+ }
+ break;
+ case CC_GET_LUT_AV: {
+ config_value = config_get_str("TV", "audio.amp.master.noline.point.data.av", "null");
+ }
+ break;
+ case CC_GET_LUT_COMP: {
+ config_value = config_get_str("TV", "audio.amp.master.noline.point.data.comp", "null");
+ }
+ break;
+ case CC_GET_LUT_HDMI: {
+ config_value = config_get_str("TV", "audio.amp.master.noline.point.data.hdmi", "null");
+ }
+ break;
+ case CC_GET_LUT_VGA: {
+ config_value = config_get_str("TV", "audio.amp.master.noline.point.data.vga", "null");
+ }
+ break;
+ case CC_GET_LUT_MPEG: {
+ config_value = config_get_str("TV", "audio.amp.master.noline.point.data.mpeg", "null");
+ }
+ break;
+ case CC_GET_LUT_HDMI_4K2K: {
+ config_value = config_get_str("TV", "audio.amp.master.noline.point.data.hdmi4k2k", "null");
+ }
+ break;
+ case CC_GET_LUT_USB_4K2K: {
+ config_value = config_get_str("TV", "audio.amp.master.noline.point.data.usb4k2k", "null");
+ }
+ break;
+ default: {
+ config_value = "null";
+ }
+ break;
+ }
+ }
+ if (strcasecmp(config_value, "null") == 0) {
+ //LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
+ return -1;
+ }
+
+ char *pSave;
+ char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
+
+ memset((void *)data_str, 0, sizeof(data_str));
+ strncpy(data_str, config_value, sizeof(data_str) - 1);
+ char *token = strtok_r(data_str, ",", &pSave);
+ int bufferDataIndex = 0;
+ while (token != NULL) {
+ data_buf[bufferDataIndex] = strtol(token, NULL, 10);
+ bufferDataIndex ++;
+ token = strtok_r(NULL, ",", &pSave);
+ }
+
+ return 0;
+}
+
+int GetDefault_EQGain_Table(int *EqTable)
+{
+ memcpy(EqTable, Default_EQGain_Table, sizeof(Default_EQGain_Table));
+
+ return 0;
+}
+
+int GetAudioEQPresetBufferPtr(int *EqTable)
+{
+ int bufs_count = 0, buf_item_count = 0;
+ const char *config_value = config_get_str("TV", "audio.eq.presetbuf", "null");
+ if (strcasecmp(config_value, "null") == 0) {
+ return -1;
+ }
+
+ char *pSave;
+ char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
+
+ memset((void *)data_str, 0, sizeof(data_str));
+ strncpy(data_str, config_value, sizeof(data_str) - 1);
+ char *token = strtok_r(data_str, ",", &pSave);
+ int allIndex = 0, bufferDataIndex = 0;
+ while (token != NULL) {
+ if (allIndex == 0) {
+ bufs_count = strtol(token, NULL, 10);
+ } else if (allIndex == 1) {
+ buf_item_count = strtol(token, NULL, 10);
+ } else if (allIndex >= 2) {
+ EqTable[bufferDataIndex] = strtol(token, NULL, 10);
+ bufferDataIndex ++;
+ }
+
+ token = strtok_r(NULL, ",", &pSave);
+ allIndex ++;
+ }
+
+ return 0;
+}
+
+/**
+ * @param:get_type
+ * @return:data_buf
+ */
+const char *GetAudioAmpMainvolTableBaseName(int get_type)
+{
+ return AudioAmpMainVolLutBaseNameTable[get_type];
+}
+
+int GetAudioAmpMainvolBuf(const char *TableKeyName, int data_buf[])
+{
+ int bufs_count = 0, buf_item_count = 0;
+ const char *config_value;
+
+ config_value = config_get_str("TV", TableKeyName, "null");
+ if (strcasecmp(config_value, "null") == 0) {
+ return -1;
+ }
+ char *pSave;
+ char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
+ memset((void *)data_str, 0, sizeof(data_str));
+ strncpy(data_str, config_value, sizeof(data_str) - 1);
+ char *token = strtok_r(data_str, ",", &pSave);
+ int allIndex = 0, bufferDataIndex = 0;
+ while (token != NULL) {
+ if (allIndex == 0) {
+ bufs_count = strtol(token, NULL, 10);
+ } else if (allIndex == 1) {
+ buf_item_count = strtol(token, NULL, 10);
+ } else if (allIndex >= 2) {
+ data_buf[bufferDataIndex] = strtol(token, NULL, 10);
+ bufferDataIndex ++;
+ }
+ token = strtok_r(NULL, ",", &pSave);
+ allIndex ++;
+ }
+
+ return 0;
+}
+
+/**
+ * @param:get_type
+ * @return:data_buf
+ */
+int GetAudioAmpSupbassvolBuf(int get_type, int data_buf[])
+{
+ int bufs_count = 0, buf_item_count = 0;
+ const char *config_value;
+
+ switch (get_type) {
+ case CC_GET_LUT_TV: {
+ config_value = config_get_str("TV", "audio.amp.supbassvol.tv.lutbuf", "null");
+ }
+
+ break;
+ case CC_GET_LUT_AV: {
+ config_value = config_get_str("TV", "audio.amp.supbassvol.av.lutbuf", "null");
+ }
+ break;
+ case CC_GET_LUT_COMP: {
+ config_value = config_get_str("TV", "audio.amp.supbassvol.comp.lutbuf", "null");
+ }
+ break;
+ case CC_GET_LUT_HDMI: {
+ config_value = config_get_str("TV", "audio.amp.supbassvol.hdmi.lutbuf", "null");
+ }
+ break;
+ case CC_GET_LUT_VGA: {
+ config_value = config_get_str("TV", "audio.amp.supbassvol.vga.lutbuf", "null");
+ }
+
+ break;
+ case CC_GET_LUT_MPEG: {
+ config_value = config_get_str("TV", "audio.amp.supbassvol.mpeg.lutbuf", "null");
+ }
+
+ break;
+ case CC_GET_LUT_HDMI_4K2K: {
+ config_value = config_get_str("TV", "audio.amp.supbassvol.hdmi4k2k.lb.name", "null");
+ }
+
+ break;
+ case CC_GET_LUT_USB_4K2K: {
+ config_value = config_get_str("TV", "audio.amp.supbassvol.usb4k2k.lb.name", "null");
+ }
+
+ break;
+ default: {
+ config_value = "null";
+ }
+ break;
+ }
+
+ if (strcasecmp(config_value, "null") == 0) {
+ return -1;
+ }
+ char *pSave;
+ char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
+ memset((void *)data_str, 0, sizeof(data_str));
+ strncpy(data_str, config_value, sizeof(data_str) - 1);
+ char *token = strtok_r(data_str, ",", &pSave);
+ int allIndex = 0, bufferDataIndex = 0;
+ while (token != NULL) {
+ if (allIndex == 0) {
+ bufs_count = strtol(token, NULL, 10);
+ } else if (allIndex == 1) {
+ buf_item_count = strtol(token, NULL, 10);
+ } else if (allIndex >= 2) {
+ data_buf[bufferDataIndex] = strtol(token, NULL, 10);
+ bufferDataIndex ++;
+ }
+ token = strtok_r(NULL, ",", &pSave);
+ allIndex ++;
+ }
+
+ return 0;
+}
+
+int GetAudioAmplifierMasterNoLineSwitchFlag()
+{
+ const char *config_value = config_get_str("TV", "audio.amp.master.noline.switch", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtol(config_value, NULL, 10);
+}
+
+int GetAudioAmplifierSupperBassNoLineSwitchFlag()
+{
+ const char *config_value = config_get_str("TV", "audio.amp.supperbass.noline.switch", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtol(config_value, NULL, 10);
+}
+
+int GetAudioAmplifierMasterNoLinePointsCount()
+{
+ const char *config_value = config_get_str("TV", "audio.amp.master.noline.point.cnt", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 11;
+ }
+
+ return strtol(config_value, NULL, 10);
+}
+
+int GetAudioAmplifierSupperBassNoLinePointsCount()
+{
+ const char *config_value = config_get_str("TV", "audio.amp.supperbass.noline.point.cnt", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 5;
+ }
+
+ return strtol(config_value, NULL, 10);
+}
+
+int GetAudioAmplifierBalanceExchangeCFG()
+{
+ const char *config_value = config_get_str("TV", "audio.amp.balance.exchg", "null");
+
+ // if (data_buf[0] >= 0 && data_buf[0] <= 100) {
+ // LOGD("%s, we have get the index buffer.\n", "TV");
+ // return 0;
+ // }
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0; //return 0 to disable balance exchange
+ }
+
+ return strtol(config_value, NULL, 10);
+}
+
+int GetAudioMainVolLutBufCFGIndexModifyEnable()
+{
+ const char *config_value = config_get_str("TV", "audio.amp.master.cfgindex.mod.en", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+int GetAudioMainVolLutBufNameModifyUbootenvCFG()
+{
+ char config_value[PROPERTY_VALUE_MAX];
+
+ memset(config_value, '\0', 32);
+ property_get("ubootenv.var.ampindex", config_value, "null");
+
+ if (strcasecmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+
+int GetAudioMainVolLutBufNameModifyEnableCFG()
+{
+ const char *config_value = config_get_str("TV", "audio.amp.mainvol.lutbufname.mod.en", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+
+int GetAudioSupperBassVolLutBufCFGIndexModifyEnable()
+{
+ const char *config_value = config_get_str("TV", "audio.amp.supperbass.cfgindex.mod.en", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+int GetAudioSupperBassVolLutBufNameModifyEnableCFG()
+{
+ const char *config_value = config_get_str("TV", "audio.amp.supbassvol.lutbufname.mod.en", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+
+int GetAudioDVISupportEnable()
+{
+ const char *config_value = config_get_str("TV", "audio.dvi.support.enable", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+
+int GetTvAudioCardName(char tv_card_name_buf[])
+{
+ const char *value = config_get_str("TV", "audio.tv.card.name", "null");
+
+ strcpy(tv_card_name_buf, value);
+ if (strcmp(value, "null") == 0) {
+ strcpy(tv_card_name_buf, "AMLSYNO9629");
+ }
+
+ return 0;
+}
+
+int GetTvAudioCardNeedSet()
+{
+ const char *config_value = config_get_str("TV", "audio.tv.card.needset", "null");
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ if (strtoul(config_value, NULL, 10) == 0) {
+ return 0;
+ }
+
+ return 1;
+}
+
+int GetAudioEffectAmplifierGainCfg(const char *cfg_name, int def_gain_val, int max_gain_val)
+{
+ int tmp_val;
+ const char *config_value = config_get_str("TV", cfg_name, "null");
+ if (strcmp(config_value, "null") == 0) {
+ tmp_val = def_gain_val;
+ } else {
+ tmp_val = strtoul(config_value, NULL, 10);
+ if (tmp_val < 0 || tmp_val > max_gain_val) {
+ tmp_val = def_gain_val;
+ }
+ }
+ LOGD("%s = %d\n", cfg_name, tmp_val);
+ return tmp_val;
+}
+
+
+int GetAudioSRSSourroundEnableCFG()
+{
+ const char *config_value = config_get_str("TV", "audio.srs.sourround.enable", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+int GetAudioSRSGainCfg(const char *cfg_name, int def_gain_val)
+{
+ int tmp_val = 0;
+ const char *config_value = config_get_str("TV", cfg_name, "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ tmp_val = def_gain_val;
+ } else {
+ if (tmp_val < 0 || tmp_val > 100) {
+ tmp_val = def_gain_val;
+ LOGE("Error setting: %s = %d (0~100)\n", cfg_name, tmp_val);
+ }
+ tmp_val = strtoul(config_value, NULL, 10);
+ }
+ //LOGD(" %s = %d\n", cfg_name, tmp_val);
+ return tmp_val;
+}
+
+int GetAudioSRSSupperBassTrubassSpeakerSizeCfg()
+{
+ char cfg_name[128] = { 0 };
+
+ strcpy(cfg_name, "audio.srs.turbass.speakersize");
+
+ const char *config_value = config_get_str("TV", cfg_name, "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return -1;
+ }
+
+ int tmp_val = strtoul(config_value, NULL, 10);
+ if (tmp_val < 0 || tmp_val > 7) {
+ tmp_val = -1;
+ }
+
+ return tmp_val;
+}
+
+int GetAudioDumpDataEnableFlagCfg()
+{
+ const char *config_value = config_get_str("TV", "audio.dump.data.en", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtol(config_value, NULL, 10);
+}
+
+int GetAudioSupperBassSwitchDisableCFG()
+{
+ const char *config_value = config_get_str("TV", "audio.supperbass.switch.disable", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+int GetAudioWallEffectTypeCfg()
+{
+ const char *config_value = config_get_str("TV", "audio.walleffect.type", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 0;
+ }
+
+ return strtol(config_value, NULL, 10);
+}
+
+int Get2d4gHeadsetEnable()
+{
+ const char *config_value = config_get_str ( "TV", "tvin.2d4G.headset.en", "null" );
+ if (strcmp(config_value, "enable") == 1) {
+ return 1;
+ }
+
+
+ return 0;
+}
+
+const char *GetAudExtDacLibPath()
+{
+ return config_get_str("TV", "audio.external.dac.libpath", "/system/lib/libdac.so");
+}
+
+int GetKaraokAvEnable()
+{
+ const char *config_value = config_get_str("TV", "audio.switch.karaok.av.enable", "null");
+ if (strtoul(config_value, NULL, 10) == 1)
+ return 1;
+
+ return 0;
+}
+
+int GetDefaultAvOutGainBuf(int *nAvoutTable)
+{
+ memcpy(nAvoutTable, Default_AVoutGain_Table, sizeof(Default_AVoutGain_Table));
+
+ return 0;
+}
+
+int GetAvOutGainBuf_Cfg(int *nAvoutTable)
+{
+ int bufs_count = 0, buf_item_count = 0;
+ const char *config_value = config_get_str("TV", "audio.avoutgain.presetbuf", "null");
+ if (strcasecmp(config_value, "null") == 0) {
+ // LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
+ return -1;
+ }
+
+ char *pSave;
+ char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
+
+ memset((void *)data_str, 0, sizeof(data_str));
+ strncpy(data_str, config_value, sizeof(data_str) - 1);
+ char *token = strtok_r(data_str, ",", &pSave);
+ int allIndex = 0, bufferDataIndex = 0;
+ while (token != NULL) {
+ if (allIndex == 0) {
+ bufs_count = strtol(token, NULL, 10);
+ } else if (allIndex == 1) {
+ buf_item_count = strtol(token, NULL, 10);
+ } else if (allIndex >= 2) {
+ nAvoutTable[bufferDataIndex] = strtol(token, NULL, 10);
+ bufferDataIndex ++;
+ }
+
+ token = strtok_r(NULL, ",", &pSave);
+ allIndex ++;
+ }
+
+ return 0;
+}
+
+int GetADCDigitalCaptureVol_Cfg(void)
+{
+ int capture_vol = 0;
+ const char *config_value = config_get_str("TV", "audio.adc.digital.capture.vol", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return -1;
+ }
+
+ return strtoul(config_value, NULL, 10);
+}
+
+int GetAudioInternalDacPGAInGain_Cfg(void)
+{
+ const char *config_value = config_get_str("TV", "audio.internal.dac.pga_in.gain", "null");
+
+ if (strcmp(config_value, "null") == 0) {
+ return 16;
+ }
+
+ return strtol(config_value, NULL, 10);
+}
+
+int GetAudioInternalDACDigitalPlayBackVolume_Cfg(int audio_src_in_type)
+{
+ const char *config_value = NULL;
+
+ if (audio_src_in_type == 2) { // CC_AUDIO_IN_SOURCE_HDMI
+ config_value = config_get_str("TV", "audio.internal.dac.playback.volume_hdmi", "null");
+ } else if (audio_src_in_type == 0) { // CC_AUDIO_IN_SOURCE_LINEIN
+ config_value = config_get_str("TV", "audio.internal.dac.playback.volume_linein", "null");
+ } else if (audio_src_in_type == 1) { // CC_AUDIO_IN_SOURCE_ATV
+ config_value = config_get_str("TV", "audio.internal.dac.playback.volume_atv", "null");
+ }
+
+ if (strcmp(config_value, "null") == 0) {
+ return 255;
+ }
+
+ return strtol(config_value, NULL, 10);
+}
+
+int GetAudioOutputSwapStatus(tv_source_input_t source_input)
+{
+ int sw_status = 0;
+ const char *config_value = config_get_str("TV", "audio.output.swap.enable", "null");
+ if ( strcmp ( config_value, "enable" ) == 0 ) {
+ switch (source_input) {
+ case SOURCE_AV1:
+ config_value = config_get_str("TV", "audio.output.swap.av1", "null");
+ break;
+ case SOURCE_AV2:
+ config_value = config_get_str("TV", "audio.output.swap.av2", "null");
+ break;
+ case SOURCE_HDMI1:
+ config_value = config_get_str("TV", "audio.output.swap.hdmi1", "null");
+ break;
+ case SOURCE_HDMI2:
+ config_value = config_get_str("TV", "audio.output.swap.hdmi2", "null");
+ break;
+ case SOURCE_HDMI3:
+ config_value = config_get_str("TV", "audio.output.swap.hdmi3", "null");
+ break;
+ case SOURCE_TV:
+ config_value = config_get_str("TV", "audio.output.swap.tv", "null");
+ break;
+ case SOURCE_DTV:
+ config_value = config_get_str("TV", "audio.output.swap.dtv", "null");
+ break;
+ case SOURCE_MPEG:
+ config_value = config_get_str("TV", "audio.output.swap.mpeg", "null");
+ break;
+ default:
+ break;
+ }
+
+ }
+
+ sw_status = atoi ( config_value );
+ return sw_status;
+}
+
+int GetAudioArchitectureTypeCFG()
+{
+ static int architecture_type = -1;
+ const char *config_value = NULL;
+
+ config_value = config_get_str ( "TV", "audio.architecture.type", "null" );
+ if (strcasecmp(config_value, "null") == 0) {
+ architecture_type = CC_DAC_G9TV_EXTERNAL_DAC_OFF_BOARD_FBC;
+ } else if ((strcasecmp(config_value, "t866_external_dac_offboard_fbc") == 0) || (strcasecmp(config_value, "g9tv_external_dac_offboard_fbc") == 0)) {
+ architecture_type = CC_DAC_G9TV_EXTERNAL_DAC_OFF_BOARD_FBC;
+ } else if ((strcasecmp(config_value, "t866_external_dac_offboard_customer_lib") == 0) || (strcasecmp(config_value, "g9tv_external_dac_customer_lib") == 0)) {
+ architecture_type = CC_DAC_G9TV_EXTERNAL_DAC_CUSTOMER_LIB;
+ } else if ((strcasecmp(config_value, "t866_external_dac_offboard_digital") == 0) || (strcasecmp(config_value, "g9tv_external_dac_digital") == 0)) {
+ architecture_type = CC_DAC_G9TV_EXTERNAL_DAC_DIGITAL;
+ } else if ((strcasecmp(config_value, "t866_external_dac_onboard") == 0) || (strcasecmp(config_value, "g9tv_external_dac_onboard") == 0)) {
+ architecture_type = CC_DAC_G9TV_EXTERNAL_DAC_ON_BOARD;
+ } else if ((strcasecmp(config_value, "t866_iternal_dac") == 0) || (strcasecmp(config_value, "g9tv_iternal_dac") == 0)) {
+ architecture_type = CC_DAC_G9TV_INTERNAL_DAC;
+ }
+
+ return architecture_type;
+}
+
+static int gAudioResampleType = -1;
+int GetAudioResampleTypeCFG()
+{
+ char *token = NULL;
+ const char *strDelimit = ",";
+ const char *config_value = NULL;
+ char cfg_buf[1024];
+
+ if (gAudioResampleType == -1) {
+ gAudioResampleType = 0;
+
+ char *pSave;
+ config_value = config_get_str ( "TV", "audio.resample.type", "null" );
+ strncpy(cfg_buf, config_value, sizeof(cfg_buf));
+ if (strcmp(cfg_buf, "") != 0) {
+ token = strtok_r(cfg_buf, strDelimit, &pSave);
+ while (token != NULL) {
+ if (strcasecmp(token, "hw") == 0) {
+ gAudioResampleType |= CC_AUD_RESAMPLE_TYPE_HW;
+ } else if (strcasecmp(token, "sw") == 0) {
+ gAudioResampleType |= CC_AUD_RESAMPLE_TYPE_SW;
+ }
+
+ token = strtok_r(NULL, strDelimit, &pSave);
+ }
+ } else {
+ gAudioResampleType = CC_AUD_RESAMPLE_TYPE_SW; //if can't find config string, allow sw resample
+ }
+ }
+
+ return gAudioResampleType;
+}
+
diff --git a/tvapi/libtv/tvsetting/audio_cfg.h b/tvapi/libtv/tvsetting/audio_cfg.h
index 3ff82df..adbda68 100644
--- a/tvapi/libtv/tvsetting/audio_cfg.h
+++ b/tvapi/libtv/tvsetting/audio_cfg.h
@@ -1,169 +1,70 @@
-#ifndef __TV_AUDIO_CFG_H__
-#define __TV_AUDIO_CFG_H__
-
-#include "../tvconfig/tvconfig.h"
-#include "../tvutils/tvutils.h"
-
-#define CC_LUT_BUF_MASTER (0)
-#define CC_LUT_BUF_SUPPERBASS (1)
-#define CC_LUT_BUF_HEADSET (2)
-
-#define CC_LUT_BUF_SIZE (101)
-
-#define CC_EQ_PRESET_BUF_SIZE (24)
-
-#define CC_SUPPERBASS_ADD_SIZE (24)
-
-#define CC_NO_LINE_POINTS_MAX_CNT (101)
-
-#define CC_GET_LUT_TV (0)
-#define CC_GET_LUT_AV (1)
-#define CC_GET_LUT_COMP (2)
-#define CC_GET_LUT_HDMI (3)
-#define CC_GET_LUT_VGA (4)
-#define CC_GET_LUT_MPEG (5)
-#define CC_GET_LUT_HDMI_4K2K (6)
-#define CC_GET_LUT_USB_4K2K (7)
-#define CC_GET_TYPE_CNT (8)
-
-#define CC_CFG_NOLINE_CFG_SWITCH_IND (0)
-#define CC_CFG_NOLINE_CFG_IND_IND (1)
-#define CC_CFG_LUT_BUF_CFG_IND (2)
-#define CC_CFG_EQ_CFG_IND (3)
-#define CC_CFG_EQ_PRESET_BUF_IND (4)
-
-#define CC_SRS_SURROUND_GAIN_VAL (50)
-#define CC_SRS_SURROUND_AMP_MASTER_GAIN_VAL (18)
-#define CC_SRS_SURROUND_AMP_SUPPERBASS_GAIN_VAL (21)
-
-#define CC_SRS_TRUBASS_ONLY_GAIN_VAL (30)
-#define CC_SRS_TRUBASS_ONLY_AMP_MASTER_GAIN_VAL (12)
-#define CC_SRS_TRUBASS_ONLY_AMP_SUPPERBASS_GAIN_VAL (15)
-
-#define CC_SRS_DIALOGCLARITY_ONLY_GAIN_VAL (30)
-#define CC_SRS_DIALOGCLARITY_ONLY_AMP_MASTER_GAIN_VAL (12)
-#define CC_SRS_DIALOGCLARITY_ONLY_AMP_SUPPERBASS_GAIN_VAL (21)
-#define CC_SRS_DIALOGCLARITY_ONLY_DEFINITION_GAIN_VAL (20)
-
-#define CC_SRS_TRUBASS_DIALOGCLARITY_TRUBASS_GAIN_VAL (28)
-#define CC_SRS_TRUBASS_DIALOGCLARITY_DIALOGCLARITY_GAIN_VAL (20)
-#define CC_SRS_TRUBASS_DIALOGCLARITY_DEFINITION_GAIN_VAL (5)
-
-#define CC_SRS_TRUBASS_DIALOGCLARITY_AMP_MASTER_GAIN_VAL (12)
-#define CC_SRS_TRUBASS_DIALOGCLARITY_AMP_SUPPERBASS_GAIN_VAL (15)
-
-#define CC_EQ_AMP_MASTER_GAIN_VAL (0)
-#define CC_EQ_AMP_SUPPERBASS_GAIN_VAL (0)
-
-#define CC_DAC_M6C_EXTERNAL_DAC_ON_BOARD (0)
-#define CC_DAC_T866_EXTERNAL_DAC_ON_BOARD (1)
-#define CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_FBC (2)
-#define CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_CUSTOMER_LIB (3)
-#define CC_DAC_T866_EXTERNAL_DAC_OFF_BOARD_DIGITAL (4)
-#define CC_DAC_T866_INTERNAL_DAC (5)
-
-#define CC_AUD_RESAMPLE_TYPE_HW (1)
-#define CC_AUD_RESAMPLE_TYPE_SW (2)
-
-extern int *GetAudioAmplifierNoLinePointsIndexBuffer(int lut_buf_type,
- int get_type);
-extern int *GetAudioAmplifierNoLinePointsDataBuffer(int lut_buf_type,
- int get_type);
-
-extern int GetAudioAmplifierMasterNoLineSwitchFlag();
-extern int GetAudioAmplifierMasterNoLinePointsCount();
-extern int *GetAudioAmplifierMasterNoLinePointsDataBuffer(int get_type);
-extern int *GetAudioAmplifierMasterNoLinePointsIndexBuffer(int get_type);
-extern int *GetAudioAmplifierMasterNoLinePointsDefIndexBuffer();
-extern int *GetAudioAmplifierMasterNoLinePointsDefDataBuffer(int buf_type);
-
-extern int GetAudioAmplifierSupperBassNoLineSwitchFlag();
-extern int GetAudioAmplifierSupperBassNoLinePointsCount();
-extern int *GetAudioAmplifierSupperBassNoLinePointsDataBuffer(int get_type);
-extern int *GetAudioAmplifierSupperBassNoLinePointsIndexBuffer(int get_type);
-extern int *GetAudioAmplifierSupperBassNoLinePointsDefIndexBuffer();
-extern int *GetAudioAmplifierSupperBassNoLinePointsDefDataBuffer();
-
-extern int GetAudioAmplifierBalanceExchangeCFG();
-
-extern int GetAudioTrebleBassType();
-extern int *GetAudioAmplifierNoLinePointsBuffer(int get_type);
-extern int GetAudioMainVolLutBufNameModifyFromUbootenv();
-extern int GetAudioMainVolLutBufNameModifyUbootenvCFG();
-extern int GetAudioMainVolLutBufNameModifyEnableCFG();
-extern int GetAudioMainVolLutBufNameCFG(int get_type, char name_buf[]);
-extern int *GetAudioAmplifierMasterVolumeLUTBufferPtr(int get_type,
- int audio_std);
-extern int GetAudioSupperBassVolLutBufNameModifyEnableCFG();
-extern int GetAudioSupperBassVolLutBufNameCFG(int get_type, char name_buf[]);
-extern int *GetAudioAmplifierSupperBassVolumeLUTBufferPtr(int get_type,
- int audio_std);
-extern int *GetAudioEQPresetBufferPtr();
-extern int GetAudioDVISupportEnable();
-extern int GetTvAudioCardID(char tv_card_id_buf[]);
-extern int GetTvAudioCardName(char tv_card_name_buf[]);
-extern int GetTvAudioCardNeedSet();
-extern int GetAudioSRSModuleDisableCFG();
-extern int GetAudioSRSSourroundDisableCFG();
-extern int GetAudioSRSTrubassDisableCFG();
-extern int GetAudioSRSDialogClarityDisableCFG();
-extern int GetAudioSRSSourroundGainCfg();
-extern int GetAudioSRSSourroundAmplifierMasterGainCfg();
-extern int GetAudioSRSSourroundAmplifierSupperBassGainCfg();
-extern int GetAudioSRSTrubassOnlyGainCfg();
-extern int GetAudioSRSTrubassOnlyAmplifierMasterGainCfg();
-extern int GetAudioSRSTrubassOnlyAmplifierSupperBassGainCfg();
-extern int GetAudioSRSDialogClarityOnlyGainCfg();
-extern int GetAudioSRSDialogClarityOnlyAmplifierMasterGainCfg();
-extern int GetAudioSRSDialogClarityOnlyAmplifierSupperBassGainCfg();
-extern int GetAudioSRSDialogClarityOnlyDefinitionGainCfg();
-extern int GetAudioSRSTrubassAndDialogClarityTrubassGainCfg();
-extern int GetAudioSRSTrubassAndDialogClarityDialogClarityGainCfg();
-extern int GetAudioSRSTrubassAndDialogClarityDefinitionGainCfg();
-extern int GetAudioSRSTrubassAndDialogClarityAmplifierMasterGainCfg();
-extern int GetAudioSRSTrubassAndDialogClarityAmplifierSupperBassGainCfg();
-extern int GetAudioSRSSupperBassTrubassSpeakerSizeCfg(int get_flag);
-extern int GetAudioEQAmplifierMasterAddGainCfg();
-extern int GetAudioEQAmplifierSupperBassAddGainCfg();
-extern int GetAudioEqModuleDisableCFG();
-extern int GetAudioEqUsingAndroidCFG();
-extern int GetAudioEQGainRangeCFG(int *min_val, int *max_val);
-extern int GetAudioEQUIGainRangeCFG(int *min_val, int *max_val);
-
-extern int GetAudioDumpDataEnableFlagCfg();
-extern int GetAudioKeyMuteCfg();
-extern int GetAudioAVOutInitMuteStatusCFG();
-extern int GetAudioSupperBassModuleDisableCFG();
-extern int GetAudioSupperBassSwitchDisableCFG();
-extern int GetAudioSrcInputTVLineInVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputAVLineInVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputCOMPLineInVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputHDMILineInVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputVGALineInVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputMPEGLineInVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputTVLineOutVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputAVLineOutVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputCOMPLineOutVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputHDMILineOutVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputVGALineOutVol(int *l_vol, int *r_vol);
-extern int GetAudioSrcInputMPEGLineOutVol(int *l_vol, int *r_vol);
-extern int GetAudioWallEffectTypeCfg();
-extern int GetAudioMainVolumeLutBufTVCompensation();
-extern int GetAudioMainVolumeLutBufAVCompensation();
-extern int GetAudioMainVolumeLutBufCOMPCompensation();
-extern int GetAudioMainVolumeLutBufHDMICompensation();
-extern int GetAudioMainVolumeLutBufVGACompensation();
-extern int GetAudioMainVolumeLutBufMPEGCompensation();
-extern int GetAudioMainVolumeLutBufDTVCompensation();
-extern int GetAudioNoiseGateEnableCFG();
-extern int GetAudioNoiseGateUpperBoundCFG();
-extern int GetAudioNoiseGateThresholdCFG();
-extern int GetDisableResetSystemFrameSize();
-extern int GetDisableReset_System_framesizeCFG();
-
-extern int GetAudioArchitectureTypeCFG();
-extern int GetAudioResampleTypeCFG();
-extern int GetamAudioDisableFlagCFG();
-extern int GetAudioFirstInitSetTypeCFG();
-
-#endif //__TV_AUDIO_CFG_H__
+#ifndef __TV_AUDIO_CFG_H__
+#define __TV_AUDIO_CFG_H__
+
+#include "../tvconfig/tvconfig.h"
+#include "../tvutils/tvutils.h"
+
+#include "../tvin/CTvin.h"
+
+#define CC_GET_LUT_TV (0)
+#define CC_GET_LUT_AV (1)
+#define CC_GET_LUT_COMP (2)
+#define CC_GET_LUT_HDMI (3)
+#define CC_GET_LUT_VGA (4)
+#define CC_GET_LUT_MPEG (5)
+#define CC_GET_LUT_HDMI_4K2K (6)
+#define CC_GET_LUT_USB_4K2K (7)
+#define CC_GET_TYPE_CNT (8)
+
+#define CC_DAC_G9TV_EXTERNAL_DAC_ON_BOARD (1)
+#define CC_DAC_G9TV_EXTERNAL_DAC_OFF_BOARD_FBC (2)
+#define CC_DAC_G9TV_EXTERNAL_DAC_CUSTOMER_LIB (3)
+#define CC_DAC_G9TV_EXTERNAL_DAC_DIGITAL (4)
+#define CC_DAC_G9TV_INTERNAL_DAC (5)
+
+#define CC_AUD_RESAMPLE_TYPE_HW (1)
+#define CC_AUD_RESAMPLE_TYPE_SW (2)
+
+int GetAudioAmpMasterNolinePointData(int get_type, const char *value_buf, int data_buf[]);
+int GetAudioEQPresetBufferPtr(int * );
+int GetAudioAmpMainvolBuf(const char *TableKeyName, int data_buf[]);
+int GetAudioAmpSupbassvolBuf(int get_type, int data_buf[]);
+int GetAudioAmplifierMasterNoLineSwitchFlag();
+int GetAudioAmplifierMasterNoLinePointsCount();
+int GetAudioSupperBassSwitchDisableCFG();
+int GetAudioAmplifierSupperBassNoLineSwitchFlag();
+int GetAudioAmplifierSupperBassNoLinePointsCount();
+int GetAudioAmplifierBalanceExchangeCFG();
+int GetAudioMainVolLutBufNameModifyUbootenvCFG();
+int GetAudioMainVolLutBufNameModifyEnableCFG();
+int GetAudioSupperBassVolLutBufNameModifyEnableCFG();
+
+int GetAudioDVISupportEnable();
+int GetTvAudioCardName(char tv_card_name_buf[]);
+int GetTvAudioCardNeedSet();
+int GetAudioDumpDataEnableFlagCfg();
+int GetAudioWallEffectTypeCfg();
+
+//srs user setting
+int GetAudioSRSSourroundEnableCFG();
+int GetAudioSRSGainCfg(const char *cfg_name, int def_gain_val);
+int GetAudioEffectAmplifierGainCfg(const char *cfg_name, int def_gain_val, int max_gain_val);
+int GetAudioSRSSupperBassTrubassSpeakerSizeCfg();
+//tinymix control
+int Get2d4gHeadsetEnable() ;
+int GetAudioOutputSwapStatus(tv_source_input_t source_input);
+//hardware design
+int GetAudioArchitectureTypeCFG();
+const char *GetAudExtDacLibPath();
+int GetAudioResampleTypeCFG();
+int GetKaraokAvEnable();
+//audio path gain setting by user
+int GetADCDigitalCaptureVol_Cfg(void);
+int GetAudioInternalDacPGAInGain_Cfg(void);
+int GetAudioInternalDACDigitalPlayBackVolume_Cfg(int audio_src_in_type);
+const char *GetAudioAmpMainvolTableBaseName(int get_type);
+int GetDefault_EQGain_Table(int *EqTable);
+int GetDefaultAvOutGainBuf(int *nAvoutTable);
+int GetAvOutGainBuf_Cfg(int *nAvoutTable);
+
+#endif //__TV_AUDIO_CFG_H__
diff --git a/tvapi/libtv/tvutils/CCondition.h b/tvapi/libtv/tvutils/CCondition.h
index e16e49f..0505629 100644
--- a/tvapi/libtv/tvutils/CCondition.h
+++ b/tvapi/libtv/tvutils/CCondition.h
@@ -73,7 +73,7 @@ inline int CCondition::waitRelative(CMutex &mutex, long msec)
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += _sec;
ts.tv_nsec += _nsec;
- if(ts.tv_nsec > _nanoSec) {
+ if (ts.tv_nsec > _nanoSec) {
ts.tv_nsec %= _nanoSec;
ts.tv_sec++;
}
diff --git a/tvapi/libtv/tvutils/CFile.cpp b/tvapi/libtv/tvutils/CFile.cpp
index 10c725e..36a283f 100644
--- a/tvapi/libtv/tvutils/CFile.cpp
+++ b/tvapi/libtv/tvutils/CFile.cpp
@@ -1,6 +1,7 @@
#include "CFile.h"
#include "CTvLog.h"
+#include <stdlib.h>
#ifdef LOG_TAG
#undef LOG_TAG
#define LOG_TAG "CFILE"
@@ -28,12 +29,12 @@ int CFile::openFile(const char *path)
LOGD("openFile = %s", path);
if (mFd < 0) {
- if(path == NULL) {
- if(strlen(mPath) <= 0)
+ if (path == NULL) {
+ if (strlen(mPath) <= 0)
return -1;
mFd = open(mPath, O_RDWR);//读写模å¼æ‰“å¼€
- if(mFd < 0) LOGD("open file(--%s) fail", mPath);
+ if (mFd < 0) LOGD("open file(--%s) fail", mPath);
} else {
mFd = open(path, O_RDWR);//读写模å¼æ‰“å¼€
LOGD("open file(%s fd=%d) ", path, mFd);
@@ -46,7 +47,7 @@ int CFile::openFile(const char *path)
int CFile::closeFile()
{
- if(mFd > 0) {
+ if (mFd > 0) {
close(mFd);
mFd = -1;
}
@@ -56,30 +57,35 @@ int CFile::closeFile()
int CFile::writeFile(const unsigned char *pData, int uLen)
{
int ret = -1;
- if(mFd > 0)
+ if (mFd > 0)
ret = write(mFd, pData, uLen);
return ret;
}
-int CFile::readFile(const unsigned char *pBuf, int uLen)
+int CFile::readFile(void *pBuf, int uLen)
{
- return 0;
+ int ret = 0;
+ if (mFd > 0)
+ {
+ ret = read(mFd, pBuf, uLen);
+ }
+ return ret;
}
int CFile::copyTo(const char *dstPath)
{
- if(strlen(mPath) <= 0)
+ if (strlen(mPath) <= 0)
return -1;
int dstFd;
- if(mFd == -1) {
- if((mFd = open(mPath, O_RDONLY)) == -1) {
+ if (mFd == -1) {
+ if ((mFd = open(mPath, O_RDONLY)) == -1) {
LOGE("Open %s Error:%s/n", mPath, strerror(errno));
return -1;
}
}
- if((dstFd = open(dstPath, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)) == -1) {
+ if ((dstFd = open(dstPath, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)) == -1) {
LOGE("Open %s Error:%s/n", dstPath, strerror(errno));
}
@@ -87,32 +93,32 @@ int CFile::copyTo(const char *dstPath)
char buffer[BUFFER_SIZE];
char *ptr;
int ret = 0;
- while(bytes_read = read(mFd, buffer, BUFFER_SIZE)) {
+ while (bytes_read = read(mFd, buffer, BUFFER_SIZE)) {
/* 一个致命的错误å‘生了 */
- if((bytes_read == -1) && (errno != EINTR)) {
+ if ((bytes_read == -1) && (errno != EINTR)) {
ret = -1;
break;
- } else if(bytes_read > 0) {
+ } else if (bytes_read > 0) {
ptr = buffer;
- while(bytes_write = write(dstFd, ptr, bytes_read)) {
+ while (bytes_write = write(dstFd, ptr, bytes_read)) {
/* 一个致命错误å‘生了 */
- if((bytes_write == -1) && (errno != EINTR)) {
+ if ((bytes_write == -1) && (errno != EINTR)) {
ret = -1;
break;
}
/* 写完了所有读的字节 */
- else if(bytes_write == bytes_read) {
+ else if (bytes_write == bytes_read) {
ret = 0;
break;
}
/* åªå†™äº†ä¸€éƒ¨åˆ†,继续写 */
- else if(bytes_write > 0) {
+ else if (bytes_write > 0) {
ptr += bytes_write;
bytes_read -= bytes_write;
}
}
/* 写的时候å‘生的致命错误 */
- if(bytes_write == -1) {
+ if (bytes_write == -1) {
ret = -1;
break;
}
@@ -126,8 +132,8 @@ int CFile::copyTo(const char *dstPath)
int CFile::delFile(const char *path)
{
- if(strlen(path) <= 0) return -1;
- if(unlink(path) != 0) {
+ if (strlen(path) <= 0) return -1;
+ if (unlink(path) != 0) {
LOGD("delete file(%s) err=%s", path, strerror(errno));
return -1;
}
@@ -136,8 +142,8 @@ int CFile::delFile(const char *path)
int CFile::delFile()
{
- if(strlen(mPath) <= 0) return -1;
- if(unlink(mPath) != 0) {
+ if (strlen(mPath) <= 0) return -1;
+ if (unlink(mPath) != 0) {
LOGD("delete file(%s) err=%s", mPath, strerror(errno));
return -1;
}
@@ -148,14 +154,15 @@ int CFile::delFile()
int CFile::getFileAttrValue(const char *path)
{
int value;
- FILE *fp = fopen (path, "r+" );
- if ( fp == NULL ) {
- LOGE ( "Open %s error(%s)!\n", path, strerror ( errno ) );
- return -1;
+ int fd = open(path, O_RDONLY);
+ if (fd <= 0) {
+ LOGE("open (%s)ERROR!!error = -%s- \n", path, strerror ( errno ));
}
- fscanf ( fp, "%d", &value );
- fclose ( fp );
+ char s[8];
+ read(fd, s, sizeof(s));
+ close(fd);
+ value = atoi(s);
return value;
}
diff --git a/tvapi/libtv/tvutils/CFile.h b/tvapi/libtv/tvutils/CFile.h
index 0429278..65f845e 100644
--- a/tvapi/libtv/tvutils/CFile.h
+++ b/tvapi/libtv/tvutils/CFile.h
@@ -8,6 +8,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
+#include <string.h>
#include <errno.h>
#define CC_MAX_FILE_PATH_LEN (256)
@@ -22,7 +23,7 @@ public:
virtual int openFile(const char *path);
virtual int closeFile();
virtual int writeFile(const unsigned char *pData, int uLen);
- virtual int readFile(const unsigned char *pBuf, int uLen);
+ virtual int readFile(void* pBuf, int uLen);
int copyTo(const char *dstPath);
static int delFile(const char *path);
static int getFileAttrValue(const char *path);
diff --git a/tvapi/libtv/tvutils/CHdmiCecCmd.cpp b/tvapi/libtv/tvutils/CHdmiCecCmd.cpp
index 31e4442..ac108de 100644
--- a/tvapi/libtv/tvutils/CHdmiCecCmd.cpp
+++ b/tvapi/libtv/tvutils/CHdmiCecCmd.cpp
@@ -10,6 +10,6 @@ CHdmiCec::~CHdmiCec()
int CHdmiCec::readFile(unsigned char *pBuf, unsigned int uLen)
{
int ret;
- ret = read(mFd, pBuf, uLen);
+ //ret = read(mFd, pBuf, uLen);
return ret;
}
diff --git a/tvapi/libtv/tvutils/CMsgQueue.cpp b/tvapi/libtv/tvutils/CMsgQueue.cpp
index 09627b5..070c27d 100644
--- a/tvapi/libtv/tvutils/CMsgQueue.cpp
+++ b/tvapi/libtv/tvutils/CMsgQueue.cpp
@@ -1,6 +1,9 @@
#include "CMsgQueue.h"
#include <CTvLog.h>
#include <utils/Timers.h>
+
+#define LOG_TAG "CMsgQueueThread"
+
CMessage::CMessage()
{
mDelayMs = 0;
@@ -14,7 +17,6 @@ CMessage::~CMessage()
CMsgQueueThread::CMsgQueueThread()
{
-
}
CMsgQueueThread::~CMsgQueueThread()
@@ -31,13 +33,11 @@ void CMsgQueueThread::sendMsg(CMessage &msg)
{
CMutex::Autolock _l(mLockQueue);
msg.mWhenMs = getNowMs() + msg.mDelayMs;//
-
int i = 0;
- while(i < m_v_msg.size() && m_v_msg[i].mWhenMs <= msg.mWhenMs) i++;//find the index that will insert(i)
+ while (i < m_v_msg.size() && m_v_msg[i].mWhenMs <= msg.mWhenMs) i++; //find the index that will insert(i)
m_v_msg.insertAt(msg, i);//insert at index i
CMessage msg1 = m_v_msg[0];
- LOGD("sendmsg now2 = %lld i = %d", getNowMs(), i);
- LOGD("sendmsg now3 = %lld msg1 when = %lld", getNowMs(), msg1.mWhenMs);
+ LOGD("sendmsg now = %lld msg[0] when = %lld", getNowMs(), msg1.mWhenMs);
//
//if(i == 0)// is empty or new whenMS is at index 0, low all ms in list. so ,need to wakeup loop, to get new delay time.
mGetMsgCondition.signal();
@@ -54,10 +54,16 @@ void CMsgQueueThread::removeMsg(CMessage &msg)
}
}
//some msg removeed
- if(beforeSize > m_v_msg.size())
+ if (beforeSize > m_v_msg.size())
mGetMsgCondition.signal();
}
+void CMsgQueueThread::clearMsg()
+{
+ CMutex::Autolock _l(mLockQueue);
+ m_v_msg.clear();
+}
+
int CMsgQueueThread::startMsgQueue()
{
CMutex::Autolock _l(mLockQueue);
@@ -68,10 +74,9 @@ int CMsgQueueThread::startMsgQueue()
bool CMsgQueueThread::threadLoop()
{
int sleeptime = 100;//ms
-
- while(!exitPending()) { //requietexit() or requietexitWait() not call
+ while (!exitPending()) { //requietexit() or requietexitWait() not call
mLockQueue.lock();
- while(m_v_msg.size() == 0) { //msg queue is empty
+ while (m_v_msg.size() == 0) { //msg queue is empty
mGetMsgCondition.wait(mLockQueue);//first unlock,when return,lock again,so need,call unlock
}
mLockQueue.unlock();
@@ -79,7 +84,7 @@ bool CMsgQueueThread::threadLoop()
CMessage msg;
nsecs_t delayMs = 0, nowMS = 0;
do { //wait ,until , the lowest time msg's whentime is low nowtime, to go on
- if(m_v_msg.size() <= 0) {
+ if (m_v_msg.size() <= 0) {
LOGD("msg size is 0, break");
break;
}
@@ -89,7 +94,7 @@ bool CMsgQueueThread::threadLoop()
delayMs = msg.mWhenMs - getNowMs();
LOGD("threadLoop now = %lld mswhen = %lld delayMs = %lld msg type = %d", getNowMs(), msg.mWhenMs, delayMs, msg.mType);
- if(delayMs > 0) {
+ if (delayMs > 0) {
mLockQueue.lock();//get msg ,first lock.
int ret = mGetMsgCondition.waitRelative(mLockQueue, delayMs);
mLockQueue.unlock();
@@ -97,9 +102,9 @@ bool CMsgQueueThread::threadLoop()
} else {
break;
}
- } while(true); //msg[0], timeout
+ } while (true); //msg[0], timeout
- if(m_v_msg.size() > 0) {
+ if (m_v_msg.size() > 0) {
mLockQueue.lock();//
msg = m_v_msg[0];
m_v_msg.removeAt(0);
diff --git a/tvapi/libtv/tvutils/CMsgQueue.h b/tvapi/libtv/tvutils/CMsgQueue.h
index 6d085be..1234c31 100644
--- a/tvapi/libtv/tvutils/CMsgQueue.h
+++ b/tvapi/libtv/tvutils/CMsgQueue.h
@@ -17,7 +17,7 @@ public:
nsecs_t mWhenMs;//when, the msg will handle
int mType;
void *mpData;
- unsigned char mpPara[2048];
+ unsigned char mpPara[3072];
};
class CMsgQueueThread: public CThread {
@@ -27,6 +27,7 @@ public:
int startMsgQueue();
void sendMsg(CMessage &msg);
void removeMsg(CMessage &msg);
+ void clearMsg();
private:
bool threadLoop();
nsecs_t getNowMs();//get system time , MS
diff --git a/tvapi/libtv/tvutils/CSerialCommunication.h b/tvapi/libtv/tvutils/CSerialCommunication.h
index 1fcf18f..d6d6722 100644
--- a/tvapi/libtv/tvutils/CSerialCommunication.h
+++ b/tvapi/libtv/tvutils/CSerialCommunication.h
@@ -1,48 +1,48 @@
-#ifndef __TV_SERIAL_COMMUNICATION_H__
-#define __TV_SERIAL_COMMUNICATION_H__
-
-#include "CThread.h"
-#include "CSerialPort.h"
-
-#define CC_MAX_SERIAL_RD_BUF_LEN (1200)
-
-class CSerialCommunication: public CThread {
-public:
- CSerialCommunication();
- ~CSerialCommunication();
-
- int start();
- int stop();
- int OpenModule(int serial_dev_id);
- int CloseModule();
- int sendData(int data_len, unsigned char data_buf[]);
-
- class ISerialCommunicationObserver {
- public:
- ISerialCommunicationObserver() {};
- virtual ~ISerialCommunicationObserver() {};
- virtual void onSerialCommunication(int dev_id, int rd_len, unsigned char data_buf[]) {};
- };
-
- void setObserver(ISerialCommunicationObserver *pOb)
- {
- mpObserver = pOb;
- };
-
-private:
- bool threadLoop();
-
- int mState;
- ISerialCommunicationObserver *mpObserver;
- CSerialPort mSerialPort;
-
- char mFileName[CC_MAX_FILE_PATH_LEN];
- unsigned char mDataBuf[CC_MAX_SERIAL_RD_BUF_LEN];
-
- enum SerialCommunicationState {
- STATE_STOPED = 0,
- STATE_RUNNING,
- };
-};
-
-#endif //__TV_SERIAL_COMMUNICATION_H__
+#ifndef __TV_SERIAL_COMMUNICATION_H__
+#define __TV_SERIAL_COMMUNICATION_H__
+
+#include "CThread.h"
+#include "CSerialPort.h"
+
+#define CC_MAX_SERIAL_RD_BUF_LEN (1200)
+
+class CSerialCommunication: public CThread {
+public:
+ CSerialCommunication();
+ ~CSerialCommunication();
+
+ int start();
+ int stop();
+ int OpenModule(int serial_dev_id);
+ int CloseModule();
+ int sendData(int data_len, unsigned char data_buf[]);
+
+ class ISerialCommunicationObserver {
+ public:
+ ISerialCommunicationObserver() {};
+ virtual ~ISerialCommunicationObserver() {};
+ virtual void onSerialCommunication(int dev_id, int rd_len, unsigned char data_buf[]) {};
+ };
+
+ void setObserver(ISerialCommunicationObserver *pOb)
+ {
+ mpObserver = pOb;
+ };
+
+private:
+ bool threadLoop();
+
+ int mState;
+ ISerialCommunicationObserver *mpObserver;
+ CSerialPort mSerialPort;
+
+ char mFileName[CC_MAX_FILE_PATH_LEN];
+ unsigned char mDataBuf[CC_MAX_SERIAL_RD_BUF_LEN];
+
+ enum SerialCommunicationState {
+ STATE_STOPED = 0,
+ STATE_RUNNING,
+ };
+};
+
+#endif //__TV_SERIAL_COMMUNICATION_H__
diff --git a/tvapi/libtv/tvutils/CSerialPort.cpp b/tvapi/libtv/tvutils/CSerialPort.cpp
index d48869f..f8e9a57 100644
--- a/tvapi/libtv/tvutils/CSerialPort.cpp
+++ b/tvapi/libtv/tvutils/CSerialPort.cpp
@@ -96,22 +96,22 @@ int CSerialPort::set_Parity (int fd, int databits, int stopbits, int parity)
switch (parity) {
case 'n':
case 'N':
- options.c_cflag &= ~PARENB; /* Clear parity enable */
- options.c_iflag &= ~INPCK; /* Enable parity checking */
+ options.c_cflag &= ~PARENB; /* Clear parity enable */
+ options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB);
- options.c_iflag |= INPCK; /* Disnable parity checking */
+ options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
- options.c_cflag |= PARENB; /* Enable parity */
+ options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD;
- options.c_iflag |= INPCK; /* Disnable parity checking */
+ options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
- case 's': /*as no parity */
+ case 's': /*as no parity */
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
@@ -136,7 +136,7 @@ int CSerialPort::set_Parity (int fd, int databits, int stopbits, int parity)
options.c_iflag |= INPCK;
tcflush (fd, TCIFLUSH);
options.c_cc[VTIME] = 150;
- options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
+ options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
//qd to set raw mode, which is copied from web
options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
@@ -163,12 +163,12 @@ int CSerialPort::set_opt(int speed, int db, int sb, char pb, int overtime, bool
{
int i = 0;
struct termios old_cfg, new_cfg;
- if(mFd <= 0) {
+ if (mFd <= 0) {
LOGE("not open dev, when set opt");
return -1;
}
//first get it
- if(tcgetattr(mFd, &old_cfg) != 0) {
+ if (tcgetattr(mFd, &old_cfg) != 0) {
LOGE("get serial attr error mFd = %d(%s)!\n", mFd, strerror(errno));
return -1;
}
diff --git a/tvapi/libtv/tvutils/CSqlite.cpp b/tvapi/libtv/tvutils/CSqlite.cpp
index 4e95a04..87a0015 100644
--- a/tvapi/libtv/tvutils/CSqlite.cpp
+++ b/tvapi/libtv/tvutils/CSqlite.cpp
@@ -23,7 +23,7 @@ CSqlite::CSqlite()
CSqlite::~CSqlite()
{
- if(mHandle > 0) {
+ if (mHandle > 0) {
sqlite3_close(mHandle);
mHandle = NULL;
}
@@ -33,7 +33,7 @@ bool CSqlite::integrityCheck()
{
char *err;
int rval = sqlite3_exec(mHandle, "PRAGMA integrity_check;", sqlite3_exec_callback, NULL, &err);
- if(rval != SQLITE_OK) {
+ if (rval != SQLITE_OK) {
LOGD(" val = %d msg = %s!\n", rval, sqlite3_errmsg(mHandle));
return false;
} else {
@@ -65,7 +65,7 @@ int CSqlite::openDb(const char *path)
int CSqlite::closeDb()
{
int rval = 0;
- if(mHandle != NULL) {
+ if (mHandle != NULL) {
rval = sqlite3_close(mHandle);
mHandle = NULL;
}
@@ -110,7 +110,7 @@ void CSqlite::insert()
bool CSqlite::exeSql(const char *sql)
{
char *errmsg;
- if(sql == NULL) return false;
+ if (sql == NULL) return false;
if (sqlite3_exec(mHandle, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
LOGD("exeSql=: %s error=%s", sql, errmsg ? errmsg : "Unknown");
if (errmsg)
diff --git a/tvapi/libtv/tvutils/CSqlite.h b/tvapi/libtv/tvutils/CSqlite.h
index 70fc6ad..1ecbc47 100644
--- a/tvapi/libtv/tvutils/CSqlite.h
+++ b/tvapi/libtv/tvutils/CSqlite.h
@@ -76,7 +76,7 @@ public:
bool moveToFirst()
{
//LOGD("moveToFirst mRowNums = %d", mRowNums);
- if(mRowNums <= 0) return false;
+ if (mRowNums <= 0) return false;
mCurRowIndex = 0;
return true;
}
@@ -85,7 +85,7 @@ public:
bool moveToNext()
{
- if(mCurRowIndex >= mRowNums - 1)return false;
+ if (mCurRowIndex >= mRowNums - 1)return false;
mCurRowIndex++;
return true;
}
@@ -95,8 +95,8 @@ public:
int getColumnIndex(const char *columnName)
{
int index = 0;
- for(int i = 0; i < mColNums; i++) {
- if(strcmp(columnName, mData[i]) == 0)
+ for (int i = 0; i < mColNums; i++) {
+ if (strcmp(columnName, mData[i]) == 0)
return index;
index++;
}
@@ -110,14 +110,14 @@ public:
//字符串长度问题,弃用
int getString(char *str, int columnIndex)
{
- if(columnIndex >= mColNums || str == NULL) return -1;
+ if (columnIndex >= mColNums || str == NULL) return -1;
strcpy(str, mData[mColNums * (mCurRowIndex + 1) + columnIndex]);
return 0;
}
//ä¸é™é•¿åº¦,ä¾èµ–于String8
String8 getString(int columnIndex)
{
- if(columnIndex >= mColNums) return String8("");
+ if (columnIndex >= mColNums) return String8("");
return String8(mData[mColNums * (mCurRowIndex + 1) + columnIndex]);
}
diff --git a/tvapi/libtv/tvutils/CThread.cpp b/tvapi/libtv/tvutils/CThread.cpp
index 237bd4f..79326c8 100644
--- a/tvapi/libtv/tvutils/CThread.cpp
+++ b/tvapi/libtv/tvutils/CThread.cpp
@@ -105,7 +105,7 @@ void *CThread::_threadLoop(void *user)
self->mThreadExitedCondition.broadcast();
break;
}
- } while(true);
+ } while (true);
return NULL;
}
diff --git a/tvapi/libtv/tvutils/CTvInput.cpp b/tvapi/libtv/tvutils/CTvInput.cpp
index 3c88e0c..73cc265 100644
--- a/tvapi/libtv/tvutils/CTvInput.cpp
+++ b/tvapi/libtv/tvutils/CTvInput.cpp
@@ -1,4 +1,7 @@
#include "CTvInput.h"
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
#include <fcntl.h>
#include <CTvLog.h>
#include <utils/Timers.h>
@@ -7,7 +10,7 @@ CTvInput::CTvInput()
{
mKeyEventFd_IR = open(KEY_EVENT_0, O_RDWR);
mKeyEventFd = open(KEY_EVENT_1, O_RDWR);
- if(mKeyEventFd < 0 || mKeyEventFd_IR < 0) {
+ if (mKeyEventFd < 0 || mKeyEventFd_IR < 0) {
LOGD( "could not open /dev/input/event1\n ");
return ;
}
@@ -33,7 +36,7 @@ void CTvInput::sendkeyEvent(const int &type, const int &code, const int &value)
event.code = code ;
event.value = value;
ret = write(mKeyEventFd, &event, sizeof(event));
- if(ret < sizeof(event)) {
+ if (ret < sizeof(event)) {
LOGD("sendkeyEvent :write event failed, %s\n", strerror(errno));
return ;
}
@@ -49,7 +52,7 @@ void CTvInput::sendIRkeyEvent(const int &type, const int &code, const int &value
event.code = code ;
event.value = value;
ret = write(mKeyEventFd_IR, &event, sizeof(event));
- if(ret < sizeof(event)) {
+ if (ret < sizeof(event)) {
LOGD("sendIRkeyEvent :write event failed, %s\n", strerror(errno));
return ;
}
@@ -121,9 +124,9 @@ bool CTvInput::threadLoop()
{
int sleeptime = 100;//ms
- while(!exitPending()) { //requietexit() or requietexitWait() not call
+ while (!exitPending()) { //requietexit() or requietexitWait() not call
LOGD("threadLoop0 when = %lld", mWhenTimeRepeatKeyStartToSend);
- while(mRepeatKeyCode < 0 || mRepeatKeydisTime < 0) { //msg queue is empty
+ while (mRepeatKeyCode < 0 || mRepeatKeydisTime < 0) { //msg queue is empty
mLock.lock();
mSendKeyCondition.wait(mLock);//first unlock,when return,lock again,so need,call unlock
mLock.unlock();
@@ -133,18 +136,22 @@ bool CTvInput::threadLoop()
do {
disToSend = mWhenTimeRepeatKeyStartToSend - getNowMs();
LOGD("dis when = %lld", disToSend);
- if(disToSend <= 0) break;
+ if (disToSend <= 0) break;
mLock.lock();
mSendKeyCondition.waitRelative(mLock, disToSend);//first unlock,when return,lock again,so need,call unlock
mLock.unlock();
- } while(disToSend > 0); //
+ } while (disToSend > 0); //
LOGD("threadLoop2 when = %lld ", mWhenTimeRepeatKeyStartToSend);
- if(mTimeoutCount < 30) {
+ if (mTimeoutCount < 30) {
LOGD("mTimeoutCount = %d \n", mTimeoutCount);
mTimeoutCount++;
- sendkeyCode(mRepeatKeyCode);
+ if (mRepeatKeyCode == 955) {
+ sendkeyCode_Down(mRepeatKeyCode);
+ } else {
+ sendkeyCode(mRepeatKeyCode);
+ }
} else {
LOGD("mTimeoutCount = %d,so stop sending long press msg.\n", mTimeoutCount);
}
diff --git a/tvapi/libtv/tvutils/CTvInput.h b/tvapi/libtv/tvutils/CTvInput.h
index bb2bce1..c5f79ab 100644
--- a/tvapi/libtv/tvutils/CTvInput.h
+++ b/tvapi/libtv/tvutils/CTvInput.h
@@ -4,7 +4,11 @@
#
#include "CThread.h"
static const char *KEY_EVENT_0 = "/dev/input/event0";
+#ifdef ADC_USE_KEY_EVENT0
+static const char *KEY_EVENT_1 = "/dev/input/event0";
+#else
static const char *KEY_EVENT_1 = "/dev/input/event1";
+#endif
static const char *KEY_EVENT_2 = "/dev/input/event2";
class CTvInput: public CThread {
public:
diff --git a/tvapi/libtv/tvutils/serial_base.h b/tvapi/libtv/tvutils/serial_base.h
index a48939a..145ca5a 100644
--- a/tvapi/libtv/tvutils/serial_base.h
+++ b/tvapi/libtv/tvutils/serial_base.h
@@ -1,17 +1,17 @@
-#ifndef __SERIAL_BASE_H__
-#define __SERIAL_BASE_H__
-
-extern int com_a_open_dev();
-extern int com_b_open_dev();
-extern int com_a_close_dev();
-extern int com_b_close_dev();
-extern int com_a_get_dev();
-extern int com_b_get_dev();
-extern int com_a_set_opt(int speed, int db, int sb, int pb, int timeout, int raw_mode);
-extern int com_b_set_opt(int speed, int db, int sb, int pb, int timeout, int raw_mode);
-extern int com_a_write_data(const unsigned char *pData, unsigned int uLen);
-extern int com_b_write_data(const unsigned char *pData, unsigned int uLen);
-extern int com_a_read_data(char *pData, unsigned int uLen);
-extern int com_b_read_data(char *pData, unsigned int uLen);
-
-#endif//__SERIAL_BASE_H__
+#ifndef __SERIAL_BASE_H__
+#define __SERIAL_BASE_H__
+
+extern int com_a_open_dev();
+extern int com_b_open_dev();
+extern int com_a_close_dev();
+extern int com_b_close_dev();
+extern int com_a_get_dev();
+extern int com_b_get_dev();
+extern int com_a_set_opt(int speed, int db, int sb, int pb, int timeout, int raw_mode);
+extern int com_b_set_opt(int speed, int db, int sb, int pb, int timeout, int raw_mode);
+extern int com_a_write_data(const unsigned char *pData, unsigned int uLen);
+extern int com_b_write_data(const unsigned char *pData, unsigned int uLen);
+extern int com_a_read_data(char *pData, unsigned int uLen);
+extern int com_b_read_data(char *pData, unsigned int uLen);
+
+#endif//__SERIAL_BASE_H__
diff --git a/tvapi/libtv/tvutils/serial_operate.cpp b/tvapi/libtv/tvutils/serial_operate.cpp
index aaf2426..109efdd 100644
--- a/tvapi/libtv/tvutils/serial_operate.cpp
+++ b/tvapi/libtv/tvutils/serial_operate.cpp
@@ -78,7 +78,7 @@ bool CTv2d4GHeadSetDetect::threadLoop()
int HeadsetConnectState = false;
int curdeviceID = -1;
- for(int deviceID = 0; deviceID < 5; deviceID++) {
+ for (int deviceID = 0; deviceID < 5; deviceID++) {
sprintf(device, "/dev/hidraw%d", deviceID);
LOGD(" thread device =%s ", device );
if ((hidraw_fd = open(device, O_RDWR)) < 0 ) {
@@ -103,12 +103,12 @@ bool CTv2d4GHeadSetDetect::threadLoop()
}
close(hidraw_fd);
}
- if(curdeviceID == -1)
+ if (curdeviceID == -1)
return 0;
sprintf(device, "/dev/hidraw%d", curdeviceID);
LOGD(" thread device =%s ", device );
- if( (hidraw_fd = open(device, O_RDWR | O_NONBLOCK) ) < 0 ) {
+ if ( (hidraw_fd = open(device, O_RDWR | O_NONBLOCK) ) < 0 ) {
printf("cann't open path:%s!!!\n", device);
return 0;
}
@@ -123,13 +123,13 @@ bool CTv2d4GHeadSetDetect::threadLoop()
//LOGD("while 2.4G %s ", __FUNCTION__);
memset(buf, 0x0, 32);
- for(int ritem = 0; ritem < ritemcounts ; ritem++ ) {
+ for (int ritem = 0; ritem < ritemcounts ; ritem++ ) {
read_size = read(hidraw_fd, buf, 32);
//for (int i = 0; i < 32; i++)
//ALOGD("read_size %d ", read_size);
- if(debug) {
+ if (debug) {
count ++;
- if(count == 3000) {
+ if (count == 3000) {
LOGD("%02x %02x %02x %02x %02x %02x ", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
count = 0;
}
@@ -139,14 +139,14 @@ bool CTv2d4GHeadSetDetect::threadLoop()
}
checkvalue[countcheck] = buf[4] & 0x1f;
- if(countcheck == 299) {
+ if (countcheck == 299) {
int checkcountvalue = 0;
- for(int icheck = 0; icheck < countcheck ; icheck++ )
+ for (int icheck = 0; icheck < countcheck ; icheck++ )
checkcountvalue += checkvalue[icheck];
// LOGD("checkcountvalue = %d",checkcountvalue);
- if(checkcountvalue <= 5 * 4) {
- if(HeadsetConnectState == true) {
- if(debug) {
+ if (checkcountvalue <= 5 * 4) {
+ if (HeadsetConnectState == true) {
+ if (debug) {
LOGD("headset connect false");
LOGD("headset connect false");
}
@@ -155,9 +155,9 @@ bool CTv2d4GHeadSetDetect::threadLoop()
//usleep(1000 * 200);
}
HeadsetConnectState = false;
- } else if(checkcountvalue >= 200 * 4) {
- if(HeadsetConnectState == false) {
- if(debug) {
+ } else if (checkcountvalue >= 200 * 4) {
+ if (HeadsetConnectState == false) {
+ if (debug) {
LOGD("headset connect true");
LOGD("headset connect true");
}
@@ -171,31 +171,31 @@ bool CTv2d4GHeadSetDetect::threadLoop()
countcheck ++;
// bit 0: headset mic in/off; bit 1:headset on/off; bit 2: headphone on/off; bit 3: soundbar on/off ;bit 4: subwoofer on/off
- /* else if (buf[4] & 0x1f)
+ /* else if (buf[4] & 0x1f)
{
- if(HeadsetConnectState == false)
+ if (HeadsetConnectState == false)
{
- if(debug)
- {
- ALOGD("headset connect true");
- ALOGD("headset connect true");
- }
- android::TvService::getIntance()->SendDtvStats(1,0,0,0,0,0);
- //usleep(1000 * 200);
+ if (debug)
+ {
+ ALOGD("headset connect true");
+ ALOGD("headset connect true");
+ }
+ android::TvService::getIntance()->SendDtvStats(1,0,0,0,0,0);
+ //usleep(1000 * 200);
}
HeadsetConnectState = true;
}
else
{
- if(HeadsetConnectState == true)
+ if (HeadsetConnectState == true)
{
- if(debug)
- {
- ALOGD("headset connect false");
- ALOGD("headset connect false");
- }
- android::TvService::getIntance()->SendDtvStats(2,0,0,0,0,0);
- //usleep(1000 * 200);
+ if (debug)
+ {
+ ALOGD("headset connect false");
+ ALOGD("headset connect false");
+ }
+ android::TvService::getIntance()->SendDtvStats(2,0,0,0,0,0);
+ //usleep(1000 * 200);
}
HeadsetConnectState = false;
}*/
@@ -203,10 +203,10 @@ bool CTv2d4GHeadSetDetect::threadLoop()
{
//added for fbc thermal setting
tvThermal_cnt++;
- if(tvThermal_cnt == 300) { //60 sec
+ if (tvThermal_cnt == 300) { //60 sec
tvThermal_cnt = 0;
fd = open("/sys/class/thermal/thermal_zone0/temp", O_RDONLY);
- if(fd < 0) {
+ if (fd < 0) {
LOGE("ERROR: failed to open file error: %d\n", errno);
} else {
read(fd, data, sizeof(data));
diff --git a/tvapi/libtv/tvutils/serial_operate.h b/tvapi/libtv/tvutils/serial_operate.h
index 07e8a00..feb1c9a 100644
--- a/tvapi/libtv/tvutils/serial_operate.h
+++ b/tvapi/libtv/tvutils/serial_operate.h
@@ -1,36 +1,34 @@
-#ifndef __SERIAL_OPERATE_H__
-#define __SERIAL_OPERATE_H__
-#include "tvutils/CThread.h"
-
-class CTv2d4GHeadSetDetect: public CThread {
-
-public:
- CTv2d4GHeadSetDetect();
- ~CTv2d4GHeadSetDetect();
-
- int startDetect();
-
- class IHeadSetObserver {
- public:
- IHeadSetObserver()
- {
- };
- virtual ~IHeadSetObserver()
- {
- };
- virtual void onHeadSetDetect(int state, int para) {};
- virtual void onThermalDetect(int state) {};
-
- };
- void setObserver ( IHeadSetObserver *pOb )
- {
- mpObserver = pOb;
- };
-
-private:
- bool threadLoop();
- IHeadSetObserver *mpObserver;
-
-};
-
-#endif//__SERIAL_OPERATE_H__
+#ifndef __SERIAL_OPERATE_H__
+#define __SERIAL_OPERATE_H__
+#include "tvutils/CThread.h"
+
+class CTv2d4GHeadSetDetect: public CThread {
+
+public:
+ CTv2d4GHeadSetDetect();
+ ~CTv2d4GHeadSetDetect();
+
+ int startDetect();
+
+ class IHeadSetObserver {
+ public:
+ IHeadSetObserver()
+ {};
+ virtual ~IHeadSetObserver()
+ {};
+ virtual void onHeadSetDetect(int state, int para) {};
+ virtual void onThermalDetect(int state) {};
+
+ };
+ void setObserver ( IHeadSetObserver *pOb )
+ {
+ mpObserver = pOb;
+ };
+
+private:
+ bool threadLoop();
+ IHeadSetObserver *mpObserver;
+
+};
+
+#endif//__SERIAL_OPERATE_H__
diff --git a/tvapi/libtv/tvutils/tvutils.cpp b/tvapi/libtv/tvutils/tvutils.cpp
index 43a3d19..e957467 100644
--- a/tvapi/libtv/tvutils/tvutils.cpp
+++ b/tvapi/libtv/tvutils/tvutils.cpp
@@ -1,1912 +1,2019 @@
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <sys/prctl.h>
-#include <stdlib.h>
-#include <android/log.h>
-#include <cutils/android_reboot.h>
-#include "../tvconfig/tvconfig.h"
-#include "../tvsetting/CTvSetting.h"
-#include "../audio/audio_api.h"
-#include "../tv/CFbcCommunication.h"
-#include <cutils/properties.h>
-#include <dirent.h>
-using namespace android;
-
-#include "tvutils.h"
-
-#define LOG_TAG "LibTvMISC"
-#include "CTvLog.h"
-
-#define CS_I2C_1_DEV_PATH "/dev/i2c-1"
-#define CS_I2C_2_DEV_PATH "/dev/i2c-2"
-
-/* number of times a device address should be polled when not acknowledging */
-#define I2C_RETRIES 0x0701
-
-/* set timeout in units of 10 ms */
-#define I2C_TIMEOUT 0x0702
-
-/* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses
- * are NOT supported! (due to code brokenness)
- */
-
-/* Use this slave address */
-#define I2C_SLAVE 0x0703
-
-/* Use this slave address, even if it is already in use by a driver! */
-#define I2C_SLAVE_FORCE 0x0706
-
-#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 */
-
-struct i2c_msg {
- unsigned short addr; /* slave address */
- unsigned short flags;
-#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */
-#define I2C_M_WR 0x0000 /* write data, from master to slave */
-#define I2C_M_RD 0x0001 /* read data, from slave to master */
-#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */
-#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */
-#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
-#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
-#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
-
- unsigned short len; /* msg length */
- unsigned char *buf; /* pointer to msg data */
-};
-
-struct i2c_rdwr_ioctl_data {
- struct i2c_msg *msgs;
- unsigned int nmsgs;
-};
-
-static volatile int mDreamPanelResumeLastBLFlag = 0;
-static volatile int mDreamPanelDemoFlag = 0;
-
-static pthread_mutex_t dream_panel_resume_last_bl_flag_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t dream_panel_demo_flag_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t file_attr_control_flag_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-static pthread_t UserPet_ThreadId = 0;
-static unsigned char is_turnon_user_pet_thread = false;
-static unsigned char is_user_pet_thread_start = false;
-static unsigned int user_counter = 0;
-static unsigned int user_pet_terminal = 1;
-
-static int iw_duty = 0;
-
-static int Miscioctl(const char *file_path, int request, ...)
-{
- int fd = -1, tmp_ret = -1;
- int bus_status = 0;
- va_list ap;
- void *arg;
-
- if (file_path == NULL) {
- LOGE("%s, file path is NULL!!!\n", "TV");
- return -1;
- }
-
- fd = open(file_path, O_RDWR);
- if (fd < 0) {
- LOGE("%s, Open %s ERROR(%s)!!\n", "TV", file_path, strerror(errno));
- return -1;
- }
-
- va_start(ap, request);
- arg = va_arg(ap, void *);
- va_end(ap);
-
- tmp_ret = ioctl(fd, request, arg);
-
- close(fd);
- fd = -1;
-
- return tmp_ret;
-}
-
-int cfg_get_one_item(const char *key_str, const char *strDelimit, int item_index, char cfg_str[])
-{
- int cfg_item_ind = 0;
- char *token = NULL;
- const char *config_value;
- char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
-
- if (key_str == NULL) {
- LOGE("%s, key_str's pointer is NULL.\n", "TV");
- return -1;
- }
-
- if (cfg_str == NULL) {
- LOGE("%s, cfg_str's pointer is NULL.\n", "TV");
- return -1;
- }
-
- if (item_index < 0) {
- LOGE("%s, item_index can't be less than 0.\n", "TV");
- return -1;
- }
-
- config_value = config_get_str("TV", key_str, "null");
- if (strcasecmp(config_value, "null") == 0) {
- cfg_str[0] = '\0';
- LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
- return -1;
- }
-
- cfg_item_ind = 0;
-
- memset((void *)data_str, 0, sizeof(data_str));
- strncpy(data_str, config_value, sizeof(data_str) - 1);
-
- token = strtok(data_str, strDelimit);
- while (token != NULL) {
- if (cfg_item_ind == item_index) {
- strcpy(cfg_str, token);
- break;
- }
-
- token = strtok(NULL, strDelimit);
- cfg_item_ind += 1;
- }
-
- if (token == NULL) {
- cfg_str[0] = '\0';
- return -1;
- }
-
- return 0;
-}
-
-int cfg_split(char *line_data, char *strDelimit, int *item_cnt, char **item_bufs)
-{
- int i = 0, tmp_cnt = 0;
- char *token = NULL;
-
- if (line_data == NULL) {
- LOGE("%s, line_data is NULL", "TV");
- return -1;
- }
-
- if (strDelimit == NULL) {
- LOGE("%s, strDelimit is NULL", "TV");
- return -1;
- }
-
- if (item_cnt == NULL) {
- LOGE("%s, item_cnt is NULL", "TV");
- return -1;
- }
-
- if (item_bufs == NULL) {
- LOGE("%s, item_bufs is NULL", "TV");
- return -1;
- }
-
- for (i = 0; i < *item_cnt; i++) {
- item_bufs[i] = NULL;
- }
-
- token = strtok(line_data, strDelimit);
-
- while (token != NULL) {
- item_bufs[tmp_cnt] = token;
-
- token = strtok(NULL, strDelimit);
-
- tmp_cnt += 1;
- if (tmp_cnt >= *item_cnt) {
- break;
- }
- }
-
- *item_cnt = tmp_cnt;
-
- return 0;
-}
-
-int ReadADCSpecialChannelValue(int adc_channel_num)
-{
- FILE *fp = NULL;
- int rd_data = 0;
- char ch_sysfs_path[256] = { 0 };
-
- if (adc_channel_num < CC_MIN_ADC_CHANNEL_VAL || adc_channel_num > CC_MAX_ADC_CHANNEL_VAL) {
- LOGD("adc channel num must between %d and %d.", CC_MIN_ADC_CHANNEL_VAL, CC_MAX_ADC_CHANNEL_VAL);
- return 0;
- }
-
- sprintf(ch_sysfs_path, "/sys/class/saradc/saradc_ch%d", adc_channel_num);
-
- fp = fopen(ch_sysfs_path, "r");
-
- if (fp == NULL) {
- LOGE("open %s ERROR(%s)!!\n", ch_sysfs_path, strerror(errno));
- return 0;
- }
-
- fscanf(fp, "%d", &rd_data);
-
- fclose(fp);
-
- return rd_data;
-}
-
-int Tv_MiscRegs(const char *cmd)
-{
- //#ifdef BRING_UP_DEBUG
- FILE *fp = NULL;
- fp = fopen("/sys/class/register/reg", "w");
-
- if (fp != NULL && cmd != NULL) {
- fprintf(fp, "%s", cmd);
- } else {
- LOGE("Open /sys/class/register/reg ERROR(%s)!!\n", strerror(errno));
- fclose(fp);
- return -1;
- }
- fclose(fp);
- //#endif
-
- return 0;
-}
-
-int TvMisc_SetUserCounterTimeOut(int timeout)
-{
- FILE *fp;
-
- fp = fopen("/sys/devices/platform/aml_wdt/user_pet_timeout", "w");
-
- if (fp != NULL) {
- fprintf(fp, "%d", timeout);
- fclose(fp);
- } else {
- LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/user_pet_timeout ERROR(%s)!!\n", strerror(errno));
- return -1;
- }
- return 0;
-}
-
-int TvMisc_SetUserCounter(int count)
-{
- FILE *fp;
-
- fp = fopen("/sys/module/aml_wdt/parameters/user_pet", "w");
-
- if (fp != NULL) {
- fprintf(fp, "%d", count);
- fclose(fp);
- } else {
- LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/user_pet ERROR(%s)!!\n", strerror(errno));
- return -1;
- }
-
- fclose(fp);
-
- return 0;
-}
-
-int TvMisc_SetUserPetResetEnable(int enable)
-{
- FILE *fp;
-
- fp = fopen("/sys/module/aml_wdt/parameters/user_pet_reset_enable", "w");
-
- if (fp != NULL) {
- fprintf(fp, "%d", enable);
- fclose(fp);
- } else {
- LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/user_pet_reset_enable ERROR(%s)!!\n", strerror(errno));
- return -1;
- }
-
- fclose(fp);
-
- return 0;
-}
-
-int TvMisc_SetSystemPetResetEnable(int enable)
-{
- FILE *fp;
-
- fp = fopen("/sys/devices/platform/aml_wdt/reset_enable", "w");
-
- if (fp != NULL) {
- fprintf(fp, "%d", enable);
- fclose(fp);
- } else {
- LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/reset_enable ERROR(%s)!!\n", strerror(errno));
- return -1;
- }
-
- fclose(fp);
-
- return 0;
-}
-
-int TvMisc_SetSystemPetEnable(int enable)
-{
- FILE *fp;
-
- fp = fopen("/sys/devices/platform/aml_wdt/ping_enable", "w");
-
- if (fp != NULL) {
- fprintf(fp, "%d", enable);
- fclose(fp);
- } else {
- LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/ping_enable ERROR(%s)!!\n", strerror(errno));
- return -1;
- }
-
- fclose(fp);
-
- return 0;
-}
-
-int TvMisc_SetSystemPetCounterTimeOut(int timeout)
-{
- FILE *fp;
-
- fp = fopen("/sys/devices/platform/aml_wdt/wdt_timeout", "w");
-
- if (fp != NULL) {
- fprintf(fp, "%d", timeout);
- fclose(fp);
- } else {
- LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/wdt_timeout ERROR(%s)!!\n", strerror(errno));
- return -1;
- }
-
- fclose(fp);
-
- return 0;
-}
-
-#define MEMERASE _IOW('M', 2, struct erase_info_user)
-static int memerase(int fd, struct erase_info_user *erase)
-{
- return (ioctl (fd, MEMERASE, erase));
-}
-
-#define CS_ATV_SOCKET_FILE_NAME "/dev/socket/datv_sock"
-
-static int setServer(const char *fileName)
-{
- int ret = -1, sock = -1;
- struct sockaddr_un srv_addr;
-
- sock = socket(PF_UNIX, SOCK_STREAM, 0);
- if (sock < 0) {
- LOGE("%s, socket create failed (errno = %d: %s).\n", "TV", errno, strerror(errno));
- return -1;
- }
-
- //set server addr_param
- srv_addr.sun_family = AF_UNIX;
- strncpy(srv_addr.sun_path, CS_ATV_SOCKET_FILE_NAME, sizeof(srv_addr.sun_path) - 1);
- unlink(CS_ATV_SOCKET_FILE_NAME);
-
- //bind sockfd & addr
- ret = bind(sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr));
- if (ret == -1) {
- LOGE("%s, cannot bind server socket.\n", "TV");
- close(sock);
- unlink(CS_ATV_SOCKET_FILE_NAME);
- return -1;
- }
-
- //listen sockfd
- ret = listen(sock, 1);
- if (ret == -1) {
- LOGE("%s, cannot listen the client connect request.\n", "TV");
- close(sock);
- unlink(CS_ATV_SOCKET_FILE_NAME);
- return -1;
- }
-
- return sock;
-}
-
-static int acceptMessage(int listen_fd)
-{
- int ret, com_fd;
- socklen_t len;
- struct sockaddr_un clt_addr;
-
- //have connect request use accept
- len = sizeof(clt_addr);
- com_fd = accept(listen_fd, (struct sockaddr *) &clt_addr, &len);
- if (com_fd < 0) {
- LOGE("%s, cannot accept client connect request.\n", "TV");
- close(listen_fd);
- unlink(CS_ATV_SOCKET_FILE_NAME);
- return -1;
- }
-
- LOGD("%s, com_fd = %d\n", "TV", com_fd);
-
- return com_fd;
-}
-
-static int parse_socket_message(char *msg_str, int *para_cnt, int para_buf[])
-{
- int para_count = 0, set_mode = 0;
- char *token = NULL;
-
- set_mode = -1;
-
- token = strtok(msg_str, ",");
- if (token != NULL) {
- if (strcasecmp(token, "quit") == 0) {
- set_mode = 0;
- } else if (strcasecmp(token, "SetAudioVolumeCompensationVal") == 0) {
- set_mode = 1;
- } else if (strcasecmp(token, "set3dmode") == 0) {
- set_mode = 2;
- } else if (strcasecmp(token, "setdisplaymode") == 0) {
- set_mode = 3;
- }
- }
-
- if (set_mode != 1 && set_mode != 2 && set_mode != 3) {
- return set_mode;
- }
-
- para_count = 0;
-
- token = strtok(NULL, ",");
- while (token != NULL) {
- para_buf[para_count] = strtol(token, NULL, 10);
- para_count += 1;
-
- token = strtok(NULL, ",");
- }
-
- *para_cnt = para_count;
-
- return set_mode;
-}
-
-/*static void* socket_thread_entry(void *arg)
-{
- int ret = 0, listen_fd = -1, com_fd = -1, rd_len = 0;
- int para_count = 0, set_mode = 0;
- int tmp_val = 0;
- int para_buf[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
- static char recv_buf[1024];
-
- listen_fd = setServer(CS_ATV_SOCKET_FILE_NAME);
- chmod(CS_ATV_SOCKET_FILE_NAME, 0666);
- prctl(PR_SET_NAME, (unsigned long) "datv.sock.thread");
-
- if (listen_fd < 0) {
- return NULL;
- }
-
- while (1) {
- com_fd = acceptMessage(listen_fd);
-
- if (com_fd >= 0) {
- //read message from client
- memset((void *) recv_buf, 0, sizeof(recv_buf));
- rd_len = read(com_fd, recv_buf, sizeof(recv_buf));
- LOGD("%s, message from client (%d)) : %s\n", "TV", rd_len, recv_buf);
-
- set_mode = parse_socket_message(recv_buf, &para_count, para_buf);
- if (set_mode == 0) {
- LOGD("%s, receive quit message, starting to quit.\n", "TV");
- sprintf(recv_buf, "%s", "quiting now...");
- write(com_fd, recv_buf, strlen(recv_buf) + 1);
- break;
- } else if (set_mode == 1) {
- ret = -1;
-
- if (para_count == 1) {
- LOGD("%s, SetAudioVolumeCompensationVal value = %d\n", "TV", para_buf[0]);
-
- ret = SetAudioVolumeCompensationVal(para_buf[0]);
- } else if (para_count == 2) {
- LOGD("%s, SetAudioVolumeCompensationVal value = %d, type = %d\n", "TV", para_buf[0], para_buf[1]);
-
- ret = SetAudioVolumeCompensationVal(para_buf[0]);
-
- if (para_buf[1] == 1) {
- tmp_val = GetAudioMasterVolume();
- ret |= SetAudioMasterVolume(tmp_val);
- }
- }
-
- sprintf(recv_buf, "%d", ret);
- write(com_fd, recv_buf, strlen(recv_buf) + 1);
- } else if (set_mode == 2) {
- ret = -1;
-
- if (para_count == 1) {
- LOGE("%s, mode = %d ------->\n", "TV", para_buf[0]);
-
- switch (para_buf[0]) {
- case 4: //BT
- ret = Tvin_Set3DFunction(MODE3D_BT);
- break;
- case 5: //LR
- ret = Tvin_Set3DFunction(MODE3D_LR);
- break;
- case 8: //
- ret = Tvin_Set3DFunction(MODE3D_DISABLE);
- break;
- case 0:
- ret = Tvin_Set3DFunction(MODE3D_DISABLE);
- break;
- case 9: //
- ret = Tvin_Set3DFunction(MODE3D_L_3D_TO_2D);
- break;
- }
- if (ret == 0) {
- LOGE("%s, sk_hdi_av_set_3d_mode return sucess.\n", "TV");
- } else {
- LOGE("%s, sk_hdi_av_set_3d_mode return error(%d).\n", "TV", ret);
- }
- }
-
- sprintf(recv_buf, "%d", ret);
- write(com_fd, recv_buf, strlen(recv_buf) + 1);
-
- }
-
- close(com_fd);
- com_fd = -1;
- }
- }
-
- if (com_fd >= 0) {
- close(com_fd);
- com_fd = -1;
- }
-
- if (listen_fd >= 0) {
- close(listen_fd);
- listen_fd = -1;
- }
-
- unlink(CS_ATV_SOCKET_FILE_NAME);
-
- return NULL;
-}*/
-
-#if !defined(SUN_LEN)
-#define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
-#endif
-
-static int connectToServer(char *file_name)
-{
- int tmp_ret = 0, sock = -1;
- struct sockaddr_un addr;
-
- if (file_name == NULL) {
- LOGE("%s, file name is NULL\n", "TV");
- return -1;
- }
-
- sock = socket(AF_UNIX, SOCK_STREAM, 0);
- if (sock < 0) {
- LOGE("%s, socket create failed (errno = %d: %s)\n", "TV", errno, strerror(errno));
- return -1;
- }
-
- /* connect to socket; fails if file doesn't exist */
- strcpy(addr.sun_path, file_name); // max 108 bytes
- addr.sun_family = AF_UNIX;
- tmp_ret = connect(sock, (struct sockaddr *) &addr, SUN_LEN(&addr));
- if (tmp_ret < 0) {
- // ENOENT means socket file doesn't exist
- // ECONNREFUSED means socket exists but nobody is listening
- LOGE("%s, AF_UNIX connect failed for '%s': %s\n", "TV", file_name, strerror(errno));
- close(sock);
- return -1;
- }
-
- return sock;
-}
-
-static int realSendSocketMsg(char *file_name, char *msg_str, char recv_buf[])
-{
- int sock = -1, rd_len = 0;
- char tmp_buf[1024];
-
- if (file_name == NULL) {
- LOGE("%s, file name is NULL\n", "TV");
- return -1;
- }
-
- if (msg_str == NULL) {
- LOGE("%s, msg string is NULL\n", "TV");
- return -1;
- }
-
- LOGD("%s, message to server (%d)) : %s\n", "TV", strlen(msg_str), msg_str);
-
- sock = connectToServer(file_name);
-
- if (sock >= 0) {
- write(sock, msg_str, strlen(msg_str) + 1);
-
- if (recv_buf == NULL) {
- memset((void *) tmp_buf, 0, sizeof(tmp_buf));
- rd_len = read(sock, tmp_buf, sizeof(tmp_buf));
- LOGD("%s, message from server (%d)) : %s\n", "TV", rd_len, tmp_buf);
- } else {
- rd_len = read(sock, recv_buf, 1024);
- LOGD("%s, message from server (%d)) : %s\n", "TV", rd_len, recv_buf);
- }
-
- close(sock);
- sock = -1;
-
- return 0;
- }
-
- return -1;
-}
-
-int I2C_WriteNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[])
-{
- int tmp_ret = 0;
- struct i2c_rdwr_ioctl_data ctl_data;
- struct i2c_msg msg;
- unsigned char msg_buf[52];
- int device_fd = -1;
-
- memset((void *) msg_buf, 0, 52);
-
- msg_buf[0] = (unsigned char) (slave_addr >> 8);
- msg_buf[1] = (unsigned char) (slave_addr & 0x00ff);
-
- if (data_buf == NULL) {
- return -1;
- }
-
- if (len < 50) {
- memcpy((void *) &msg_buf[2], data_buf, len);
- } else {
- LOGE("I2C_WriteNbyte len(%d) > 50, error!\n", len);
- return -1;
- }
-
- msg.addr = dev_addr;
- msg.flags = I2C_M_WR;
- msg.len = 2 + len;
- msg.buf = msg_buf;
- ctl_data.nmsgs = 1;
- ctl_data.msgs = &msg;
-
- if (i2c_no == 1) {
- device_fd = open(CS_I2C_1_DEV_PATH, O_RDWR);
- if (device_fd < 0) {
- LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_1_DEV_PATH, strerror(errno));
- return -1;
- }
- } else if (i2c_no == 2) {
- device_fd = open(CS_I2C_2_DEV_PATH, O_RDWR);
- if (device_fd < 0) {
- LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_2_DEV_PATH, strerror(errno));
- return -1;
- }
- } else {
- LOGE("%s, invalid i2c no (%d).\n", "TV", i2c_no);
- return -1;
- }
-
- tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data);
-
- usleep(10 * 1000);
- if (device_fd >= 0) {
- close(device_fd);
- device_fd = -1;
- }
- return tmp_ret;
-}
-
-int I2C_ReadNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[])
-{
- int tmp_ret = 0;
- struct i2c_rdwr_ioctl_data ctl_data;
- struct i2c_msg msg;
- unsigned char msg_buf[52];
- int device_fd = -1;
-
- memset((void *) msg_buf, 0, 52);
-
- if (data_buf == NULL) {
- return -1;
- }
-
- if (len < 50) {
- memcpy((void *) &msg_buf[2], data_buf, len);
- } else {
- LOGE("I2C_WriteNbyte len(%d) > 50, error!\n", len);
- return -1;
- }
-
- msg_buf[0] = (unsigned char) (slave_addr >> 8);
- msg_buf[1] = (unsigned char) (slave_addr & 0x00ff);
- msg.addr = dev_addr;
- msg.flags = I2C_M_WR;
- msg.len = 2;
- msg.buf = msg_buf;
- ctl_data.nmsgs = 1;
- ctl_data.msgs = &msg;
-
- if (i2c_no == 1) {
- device_fd = open(CS_I2C_1_DEV_PATH, O_RDWR);
- if (device_fd < 0) {
- LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_1_DEV_PATH, strerror(errno));
- return -1;
- }
- } else if (i2c_no == 2) {
- device_fd = open(CS_I2C_2_DEV_PATH, O_RDWR);
- if (device_fd < 0) {
- LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_2_DEV_PATH, strerror(errno));
- return -1;
- }
- } else {
- LOGE("%s, invalid i2c no (%d).\n", "TV", i2c_no);
- return -1;
- }
-
- tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data);
-
- msg.addr = dev_addr;
- msg.flags |= I2C_M_RD;
- msg.len = len;
- msg.buf = data_buf;
- ctl_data.nmsgs = 1;
- ctl_data.msgs = &msg;
-
- tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data);
-
- usleep(10 * 1000);
-
- if (device_fd >= 0) {
- close(device_fd);
- device_fd = -1;
- }
- return tmp_ret;
-}
-
-int SetFileAttrValue(const char *fp, const char value[])
-{
- int fd = -1, ret = -1;
-
- pthread_mutex_lock(&file_attr_control_flag_mutex);
-
- fd = open(fp, O_RDWR);
-
- if (fd < 0) {
- LOGE("open %s ERROR(%s)!!\n", fp, strerror(errno));
- pthread_mutex_unlock(&file_attr_control_flag_mutex);
- return -1;
- }
-
- ret = write(fd, value, strlen(value));
- close(fd);
-
- pthread_mutex_unlock(&file_attr_control_flag_mutex);
- return ret;
-}
-
-int GetFileAttrIntValue(const char *fp)
-{
- int fd = -1, ret = -1;
- int temp = -1;
- char temp_str[32];
-
- memset(temp_str, 0, 32);
-
- fd = open(fp, O_RDWR);
-
- if (fd <= 0) {
- LOGE("open %s ERROR(%s)!!\n", fp, strerror(errno));
- return -1;
- }
-
- if (read(fd, temp_str, sizeof(temp_str)) > 0) {
- if (sscanf(temp_str, "%d", &temp) >= 0) {
- LOGD("%s -> get %s value =%d!\n", "TV", fp, temp);
- close(fd);
- return temp;
- } else {
- LOGE("%s -> get %s value error(%s)\n", "TV", fp, strerror(errno));
- close(fd);
- return -1;
- }
- }
-
- close(fd);
- return -1;
-}
-
-int *GetFileAttrIntValueStr(const char *fp)
-{
- int fd = -1, ret = -1;
- static int temp[4];
- char temp_str[32];
- int i = 0;
- char *p = NULL;
-
- memset(temp_str, 0, 32);
-
- fd = open(fp, O_RDWR);
-
- if (fd <= 0) {
- LOGE("open %s ERROR(%s)!!\n", fp, strerror(errno));
- return NULL;
- }
-
- if(read(fd, temp_str, sizeof(temp_str)) > 0) {
- LOGD("%s,temp_str = %s\n", "TV", temp_str);
- p = strtok(temp_str, " ");
- while(p != NULL) {
- sscanf(p, "%d", &temp[i]);
- p = strtok(NULL, " ");
- i = i + 1;
- }
- close(fd);
- return temp;
- }
-
- close(fd);
- return NULL;
-}
-
-int Get_Fixed_NonStandard(void)
-{
- return GetFileAttrIntValue("/sys/module/tvin_afe/parameters/force_nostd");
-}
-
-//0-turn off
-//1-force non-standard
-//2-force normal
-int Set_Fixed_NonStandard(int value)
-{
- int fd = -1, ret = -1;
- char set_vale[32];
- memset(set_vale, '\0', 32);
-
- sprintf(set_vale, "%d", value);
-
- fd = open("/sys/module/tvin_afe/parameters/force_nostd", O_RDWR);
-
- if (fd >= 0) {
- ret = write(fd, set_vale, strlen(set_vale));
- }
-
- if (ret <= 0) {
- LOGE("%s -> set /sys/module/tvin_afe/parameters/force_nostd error(%s)!\n", "TV", strerror(errno));
- }
-
- close(fd);
-
- return ret;
-}
-
-static void *UserPet_TreadRun(void *data)
-{
- while (is_turnon_user_pet_thread == true) {
- if (is_user_pet_thread_start == true) {
- usleep(1000 * 1000);
- if (++user_counter == 0xffffffff)
- user_counter = 1;
- TvMisc_SetUserCounter(user_counter);
- } else {
- usleep(10000 * 1000);
- }
- }
- if (user_pet_terminal == 1) {
- user_counter = 0;
- } else {
- user_counter = 1;
- }
- TvMisc_SetUserCounter(user_counter);
- return ((void *) 0);
-}
-
-static int UserPet_CreateThread(void)
-{
- int ret = 0;
- pthread_attr_t attr;
- struct sched_param param;
-
- is_turnon_user_pet_thread = true;
- is_user_pet_thread_start = true;
-
- pthread_attr_init(&attr);
- pthread_attr_setschedpolicy(&attr, SCHED_RR);
- param.sched_priority = 1;
- pthread_attr_setschedparam(&attr, &param);
- ret = pthread_create(&UserPet_ThreadId, &attr, &UserPet_TreadRun, NULL);
- pthread_attr_destroy(&attr);
- return ret;
-}
-
-static void UserPet_KillThread(void)
-{
- int i = 0, dly = 600;
- is_turnon_user_pet_thread = false;
- is_user_pet_thread_start = false;
- for (i = 0; i < 2; i++) {
- usleep(dly * 1000);
- }
- pthread_join(UserPet_ThreadId, NULL);
- UserPet_ThreadId = 0;
- LOGD("%s, done.", "TV");
-}
-
-void TvMisc_EnableWDT(bool kernelpet_disable, unsigned int userpet_enable, unsigned int kernelpet_timeout, unsigned int userpet_timeout, unsigned int userpet_reset)
-{
- TvMisc_SetSystemPetCounterTimeOut(kernelpet_timeout);
- TvMisc_SetSystemPetEnable(1);
- if (kernelpet_disable) {
- TvMisc_SetSystemPetResetEnable(0);
- } else {
- TvMisc_SetSystemPetResetEnable(1);
- }
- if (userpet_enable) {
- TvMisc_SetUserCounterTimeOut(userpet_timeout);
- TvMisc_SetUserPetResetEnable(userpet_reset);
- UserPet_CreateThread();
- } else {
- TvMisc_SetUserCounter(0);
- TvMisc_SetUserPetResetEnable(0);
- }
-}
-
-void TvMisc_DisableWDT(unsigned int userpet_enable)
-{
- if (userpet_enable) {
- user_pet_terminal = 0;
- UserPet_KillThread();
- }
-}
-
-static int get_hardware_info(char *hardware, unsigned int *revision)
-{
- char data[1024];
- int fd, n;
- char *x, *hw, *rev;
-
- fd = open("/proc/cpuinfo", O_RDONLY);
- if (fd < 0) {
- return -1;
- }
-
- n = read(fd, data, 1023);
- close(fd);
- if (n < 0) {
- return -1;
- }
-
- data[n] = 0;
-
- if (hardware != NULL) {
- hw = strstr(data, "\nHardware");
-
- if (hw) {
- x = strstr(hw, ": ");
- if (x) {
- x += 2;
- n = 0;
- while (*x && *x != '\n' && !isspace(*x)) {
- hardware[n++] = tolower(*x);
- x++;
- if (n == 31) {
- break;
- }
- }
-
- hardware[n] = 0;
- }
- }
- }
-
- if (revision != NULL) {
- rev = strstr(data, "\nRevision");
-
- if (rev) {
- x = strstr(rev, ": ");
- if (x) {
- *revision = strtoul(x + 2, 0, 16);
- }
- }
- }
-
- return 0;
-}
-
-int get_hardware_name(char *hardware)
-{
- int tmp_ret = 0;
-
- if (hardware == NULL) {
- return -1;
- }
-
- tmp_ret = get_hardware_info(hardware, NULL);
- if (tmp_ret < 0) {
- hardware[0] = '\0';
- }
-
- return 0;
-}
-
-/*---------------delete dir---------------*/
-int TvMisc_DeleteDirFiles(const char *strPath, int flag)
-{
- int status;
- char tmp[256];
- switch (flag) {
- case 0:
- sprintf(tmp, "rm -f %s", strPath);
- LOGE("%s", tmp);
- system(tmp);
- break;
- case 1:
- sprintf(tmp, "cd %s", strPath);
- LOGE("%s", tmp);
- status = system(tmp);
- if (status > 0 || status < 0)
- return -1;
- sprintf(tmp, "cd %s;rm -rf *", strPath);
- system(tmp);
- LOGE("%s", tmp);
- break;
- case 2:
- sprintf(tmp, "rm -rf %s", strPath);
- LOGE("%s", tmp);
- system(tmp);
- break;
- }
- return 0;
-}
-/*---------------delete dir end-----------*/
-
-#ifndef NELEM
-# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
-#endif
-
-
-int Tv_Utils_CheckFs(void)
-{
- FILE *f;
- char mount_dev[256];
- char mount_dir[256];
- char mount_type[256];
- char mount_opts[256];
- int mount_freq;
- int mount_passno;
- int match;
- int found_ro_fs = 0;
- int data_status = 0;
- int cache_status = 0;
- int atv_status = 0;
- int dtv_status = 0;
- int param_status = 0;
- int cool_reboot = 0;
- int recovery_reboot = 0;
-
- f = fopen("/proc/mounts", "r");
- if (! f) {
- /* If we can't read /proc/mounts, just give up */
- return 1;
- }
-
- do {
- match = fscanf(f, "%255s %255s %255s %255s %d %d\n",
- mount_dev, mount_dir, mount_type,
- mount_opts, &mount_freq, &mount_passno);
- mount_dev[255] = 0;
- mount_dir[255] = 0;
- mount_type[255] = 0;
- mount_opts[255] = 0;
- if ((match == 6) && (!strncmp(mount_dev, "/dev/block", 10))) {
- LOGD("%s, %s %s %s %s %d %d!", "TV", mount_dev, mount_dir, mount_type, mount_opts, mount_freq, mount_passno);
- if (!strncmp(mount_dir, "/param", 6)) {
- param_status |= 0x01;
- } else if (!strncmp(mount_dir, "/atv", 4)) {
- atv_status |= 0x01;
- } else if (!strncmp(mount_dir, "/dtv", 4)) {
- dtv_status |= 0x01;
- } else if (!strncmp(mount_dir, "/data", 5)) {
- data_status |= 0x01;
- } else if (!strncmp(mount_dir, "/cache", 6)) {
- cache_status |= 0x01;
- }
- if (strstr(mount_opts, "ro")) {
- found_ro_fs += 1;
- if (!strncmp(mount_dir, "/param", 6)) {
- param_status |= 0x02;
- } else if (!strncmp(mount_dir, "/atv", 4)) {
- atv_status |= 0x02;
- } else if (!strncmp(mount_dir, "/dtv", 4)) {
- dtv_status |= 0x02;
- } else if (!strncmp(mount_dir, "/data", 5)) {
- data_status |= 0x02;
- } else if (!strncmp(mount_dir, "/cache", 6)) {
- cache_status |= 0x02;
- }
- }
- }
- } while (match != EOF);
-
- fclose(f);
-
- switch (param_status) {
- case 0x03:
- LOGW("%s, param partition is read-only!", "TV");
- break;
- case 0x00:
- LOGW("%s, param partition can not be mounted!", "TV");
- break;
- default:
- break;
- }
- switch (atv_status) {
- case 0x03:
- LOGW("%s, atv partition is read-only!", "TV");
- cool_reboot = 1;
- //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
- break;
- case 0x00:
- LOGW("%s, atv partition can not be mounted!", "TV");
- recovery_reboot = 1;
- //android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
- default:
- break;
- }
- switch (dtv_status) {
- case 0x03:
- LOGW("%s, dtv partition is read-only!", "TV");
- //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
- break;
- case 0x00:
- LOGW("%s, dtv partition can not be mounted!", "TV");
- //android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
- default:
- break;
- }
- switch (data_status) {
- case 0x03:
- LOGW("%s, data partition is read-only!", "TV");
- cool_reboot = 1;
- //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
- break;
- case 0x00:
- LOGW("%s, data partition can not be mounted!", "TV");
- recovery_reboot = 1;
- //android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
- break;
- default:
- break;
- }
- switch (cache_status) {
- case 0x03:
- LOGW("%s, cache partition is read-only!", "TV");
- cool_reboot = 1;
- //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
- break;
- case 0x00:
- LOGW("%s, cache partition can not be mounted!", "TV");
- recovery_reboot = 1;
- //android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
- break;
- default:
- break;
- }
- if (cool_reboot == 1) {
- android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
- }
- if (recovery_reboot == 1) {
- android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
- }
- return found_ro_fs;
-}
-
-
-int Tv_Utils_SetFileAttrStr(const char *file_path, char val_str_buf[])
-{
- FILE *tmpfp = NULL;
-
- tmpfp = fopen(file_path, "w");
- if (tmpfp == NULL) {
- LOGE("%s, write open file %s error(%s)!!!\n", "TV", file_path, strerror(errno));
- return -1;
- }
-
- fputs(val_str_buf, tmpfp);
-
- fclose(tmpfp);
- tmpfp = NULL;
-
- return 0;
-}
-
-int Tv_Utils_GetFileAttrStr(const char *file_path, int buf_size, char val_str_buf[])
-{
- FILE *tmpfp = NULL;
-
- tmpfp = fopen(file_path, "r");
- if (tmpfp == NULL) {
- LOGE("%s, read open file %s error(%s)!!!\n", "TV", file_path, strerror(errno));
- val_str_buf[0] = '\0';
- return -1;
- }
-
- fgets(val_str_buf, buf_size, tmpfp);
-
- fclose(tmpfp);
- tmpfp = NULL;
-
- return 0;
-}
-
-
-int Tv_Utils_IsFileExist(const char *file_name)
-{
- struct stat tmp_st;
-
- return stat(file_name, &tmp_st);
-}
-
-#define CC_EDID_SIZE (256)
-#define CS_VGA_EDID_BUF_DATA_CFG_NAME "ssm.vga.edidbuf.data"
-/*
-static unsigned char customer_edid_buf[CC_EDID_SIZE + 4];
-
-static unsigned char mDefHDMIEdidBuf[CC_EDID_SIZE] = {
- //256 bytes
- 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x4d, 0x79, 0x02, 0x2c, 0x01, 0x01, 0x01, 0x01, //0x00~0x0F
- 0x01, 0x15, 0x01, 0x03, 0x80, 0x85, 0x4b, 0x78, 0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, //0x10~0x1F
- 0x12, 0x48, 0x4c, 0x21, 0x08, 0x00, 0x81, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //0x20~0x2F
- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, 0x58, 0x2c, //0x30~0x3F
- 0x45, 0x00, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, 0x01, 0x1d, 0x00, 0x72, 0x51, 0xd0, 0x1e, 0x20, //0x40~0x4F
- 0x6e, 0x28, 0x55, 0x00, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x53, //0x50~0x5F
- 0x6b, 0x79, 0x77, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x54, 0x56, 0x0a, 0x20, 0x00, 0x00, 0x00, 0xfd, //0x60~0x6F
- 0x00, 0x30, 0x3e, 0x0e, 0x46, 0x0f, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x3e, //0x70~0x7F
- 0x02, 0x03, 0x38, 0xf0, 0x53, 0x1f, 0x10, 0x14, 0x05, 0x13, 0x04, 0x20, 0x22, 0x3c, 0x3e, 0x12, //0x80~0x8F
- 0x16, 0x03, 0x07, 0x11, 0x15, 0x02, 0x06, 0x01, 0x23, 0x09, 0x07, 0x01, 0x83, 0x01, 0x00, 0x00, //0x90~0x9F
- 0x78, 0x03, 0x0c, 0x00, 0x10, 0x00, 0x88, 0x3c, 0x2f, 0xd0, 0x8a, 0x01, 0x02, 0x03, 0x04, 0x01, //0xA0~0xAF
- 0x40, 0x00, 0x7f, 0x20, 0x30, 0x70, 0x80, 0x90, 0x76, 0xe2, 0x00, 0xfb, 0x02, 0x3a, 0x80, 0xd0, //0xB0~0xBF
- 0x72, 0x38, 0x2d, 0x40, 0x10, 0x2c, 0x45, 0x80, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, 0x01, 0x1d, //0xC0~0xCF
- 0x00, 0xbc, 0x52, 0xd0, 0x1e, 0x20, 0xb8, 0x28, 0x55, 0x40, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, //0xD0~0xDF
- 0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c, 0x16, 0x20, 0x10, 0x2c, 0x25, 0x80, 0x30, 0xeb, 0x52, 0x00, //0xE0~0xEF
- 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, //0xF0~0xFF
-};
-*/
-static unsigned char mVGAEdidDataBuf[CC_EDID_SIZE];
-void monitor_info_set_date ( unsigned char *edidbuf )
-{
- char prop_value[PROPERTY_VALUE_MAX];
- char tmp[4];
- struct tm *p;
- int week = 0;
-
- memset ( prop_value, '\0', PROPERTY_VALUE_MAX );
-
- property_get ( "ro.build.date.utc", prop_value, "VERSION_ERROR" );
-
- time_t timep = atoi ( prop_value );
-
- p = localtime ( &timep );
-
- mktime ( p );
-
- strftime ( prop_value, PROPERTY_VALUE_MAX, "%W.", p );
-
- week = atoi ( prop_value );
-
- edidbuf[16] = week;
- edidbuf[17] = ( 1900 + p->tm_year ) - 1990;
-
- LOGD ( "###############%s##############", "TV" );
- LOGD ( "Week number is %d", week );
- LOGD ( "%d %02d %02d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday );
- LOGD ( "###############%s##############", "TV" );
-}
-
-
-void monitor_info_set_imagesize ( unsigned char *edidbuf )
-{
- //panel size info for edid:
- //39' : max_horizontal = 86; max_vertical = 48;
- //42' : max_horizontal = 93; max_vertical = 52;
- //47' : max_horizontal = 104; max_vertical = 60;
- //50' : max_horizontal = 110; max_vertical = 62;
- //55' : max_horizontal = 121; max_vertical = 71;
- int max_horizontal = 104; //47'
- int max_vertical = 60; //47'
-
- edidbuf[21] = max_horizontal;
- edidbuf[22] = max_vertical;
-
- LOGD ( "imagesize max_horizontal %d max_vertical %d", max_horizontal, max_vertical );
-}
-
-
-
-void monitor_info_name_init ( unsigned char *edidbuf )
-{
- int i = 0;
-
- for ( i = 90; i < 108; i++ ) {
- edidbuf[i] = 0;
- }
-
- edidbuf[93] = 252;
-}
-
-void monitor_info_set_name ( unsigned char *edidbuf )
-{
- int i = 0;
- int config_value_len;
- const char *config_value;
- unsigned char str_manufacturer_name[14];
- config_value = config_get_str ( "TV", "tvin.hdmiedid.name", "null" );
-
- if ( strcmp ( config_value, "null" ) != 0 ) {
- config_value_len = strlen ( config_value );
-
- if ( config_value_len < 13 ) {
- for ( i = 0; i < config_value_len; ++i ) {
- str_manufacturer_name[i] = config_value[i];
- }
-
- for ( i = config_value_len; i < 13; ++i ) {
- str_manufacturer_name[i] = ' ';
- }
- } else {
- for ( i = 0; i < 13; ++i ) {
- str_manufacturer_name[i] = config_value[i];
- }
- }
-
- }
-
- for ( i = 0; i < 13; i++ ) {
- edidbuf[95 + i] = str_manufacturer_name[i];
- }
-}
-
-void monitor_info_edid_checksum ( unsigned char *edidbuf )
-{
- int sum = 0, i = 0;
-
- for ( i = 0; i < 127; i++ ) {
- sum += edidbuf[i];
- }
-
- sum = ( 256 - ( sum % 256 ) ) % 256;
- edidbuf[127] = sum;
-
- LOGD ( "checksum is 0x%x,so testBuf[127] = 0x%x", sum, edidbuf[127] );
-}
-
-int reboot_sys_by_fbc_edid_info()
-{
- int ret = -1;
- int fd = -1;
- int edid_info_len = 256;
- unsigned char fbc_edid_info[edid_info_len];
- int env_different_as_cur = 0;
- char outputmode_prop_value[256];
- char lcd_reverse_prop_value[256];
-
- LOGD("get edid info from fbc!");
- memset(outputmode_prop_value, '\0', 256);
- memset(lcd_reverse_prop_value, '\0', 256);
- property_get("ubootenv.var.outputmode", outputmode_prop_value, "null" );
- property_get("ubootenv.var.lcd_reverse", lcd_reverse_prop_value, "null" );
-
- fd = open("/sys/class/amhdmitx/amhdmitx0/edid_info", O_RDWR);
- if(fd < 0) {
- LOGW("open edid node error\n");
- return -1;
- }
- ret = read(fd, fbc_edid_info, edid_info_len);
- if(ret < 0) {
- LOGW("read edid node error\n");
- return -1;
- }
-
- if((0xfb == fbc_edid_info[250]) && (0x0c == fbc_edid_info[251])) {
- LOGD("RX is FBC!");
- // set outputmode env
- ret = 0;//is Fbc
- switch(fbc_edid_info[252] & 0x0f) {
- case 0x0:
- if(0 != strcmp(outputmode_prop_value, "1080p")) {
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.outputmode", "1080p");
- }
- break;
- case 0x1:
- if(0 != strcmp(outputmode_prop_value, "4k2k60hz420")) {
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.outputmode", "4k2k60hz420");
- }
- break;
- case 0x2:
- if(0 != strcmp(outputmode_prop_value, "1366*768")) {
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.outputmode", "1366*768");
- }
- break;
- default:
- break;
- }
-
- // set RX 3D Info
- //switch((fbc_edid_info[252]>>4)&0x0f)
-
- // set lcd_reverse env
- switch(fbc_edid_info[253]) {
- case 0x0:
- if(0 != strcmp(lcd_reverse_prop_value, "0")) {
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.lcd_reverse", "0");
- }
- break;
- case 0x1:
- if(0 != strcmp(lcd_reverse_prop_value, "1")) {
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.lcd_reverse", "1");
- }
- break;
- default:
- break;
- }
- }
- close(fd);
- fd = -1;
- //ret = -1;
- if(1 == env_different_as_cur) {
- LOGW("env change , reboot system\n");
- system("reboot");
- }
- return ret;
-}
-
-int reboot_sys_by_fbc_uart_panel_info()
-{
- int ret = -1;
- char outputmode_prop_value[256];
- char lcd_reverse_prop_value[256];
- CFbcCommunication *fbc = GetSingletonFBC();
- int env_different_as_cur = 0;
- int panel_reverse = -1;
- int panel_outputmode = -1;
-
-
- char panel_model[64] = {0};
-
- if (fbc == NULL) {
- LOGE("there is no fbc!!!\n");
- return -1;
- }
-
- fbc->cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_SERIAL, panel_model);
- if(0 == panel_model[0]) {
- LOGD("device is not fbc\n");
- return -1;
- }
- LOGD("device is fbc, get panel info from fbc!\n");
- memset(outputmode_prop_value, '\0', 256);
- memset(lcd_reverse_prop_value, '\0', 256);
- property_get("ubootenv.var.outputmode", outputmode_prop_value, "null" );
- property_get("ubootenv.var.lcd_reverse", lcd_reverse_prop_value, "null" );
-
- fbc->cfbc_Get_FBC_PANEL_REVERSE(COMM_DEV_SERIAL, &panel_reverse);
- fbc->cfbc_Get_FBC_PANEL_OUTPUT(COMM_DEV_SERIAL, &panel_outputmode);
- LOGD("panel_reverse = %d, panel_outputmode = %d\n", panel_reverse, panel_outputmode);
- LOGD("panel_output prop = %s, panel reverse prop = %s\n", outputmode_prop_value, lcd_reverse_prop_value);
- switch(panel_outputmode) {
- case 0x0:
- if(0 != strcmp(outputmode_prop_value, "1080p")) {
- LOGD("panel_output changed to 1080p\n");
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.outputmode", "1080p");
- }
- break;
- case 0x1:
- if(0 != strcmp(outputmode_prop_value, "4k2k60hz420")) {
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.outputmode", "4k2k60hz420");
- }
- break;
- case 0x2:
- if(0 != strcmp(outputmode_prop_value, "1366*768")) {
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.outputmode", "1366*768");
- }
- break;
- default:
- break;
- }
-
- // set RX 3D Info
- //switch((fbc_edid_info[252]>>4)&0x0f)
-
- // set lcd_reverse env
- switch(panel_reverse) {
- case 0x0:
- if(0 != strcmp(lcd_reverse_prop_value, "0")) {
- LOGD("panel_reverse changed to 0\n");
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.lcd_reverse", "0");
- }
- break;
- case 0x1:
- if(0 != strcmp(lcd_reverse_prop_value, "1")) {
- if(0 == env_different_as_cur) {
- env_different_as_cur = 1;
- }
- property_set("ubootenv.var.lcd_reverse", "1");
- }
- break;
- default:
- break;
- }
-
- ret = -1;
- if(1 == env_different_as_cur) {
- LOGW("env change , reboot system\n");
- system("reboot");
- }
- return 0;
-}
-
-static pid_t pidof(const char *name)
-{
- DIR *dir;
- struct dirent *ent;
- char *endptr;
- char tmp_buf[512];
-
- if (!(dir = opendir("/proc"))) {
- LOGE("%s, can't open /proc", __FUNCTION__, strerror(errno));
- return -1;
- }
-
- while ((ent = readdir(dir)) != NULL) {
- /* if endptr is not a null character, the directory is not
- * entirely numeric, so ignore it */
- long lpid = strtol(ent->d_name, &endptr, 10);
- if (*endptr != '\0') {
- continue;
- }
-
- /* try to open the cmdline file */
- snprintf(tmp_buf, sizeof(tmp_buf), "/proc/%ld/cmdline", lpid);
- FILE *fp = fopen(tmp_buf, "r");
-
- if (fp) {
- if (fgets(tmp_buf, sizeof(tmp_buf), fp) != NULL) {
- /* check the first token in the file, the program name */
- char *first = strtok(tmp_buf, " ");
- if (!strcmp(first, name)) {
- fclose(fp);
- closedir(dir);
- return (pid_t) lpid;
- }
- }
- fclose(fp);
- }
- }
-
- closedir(dir);
- return -1;
-}
-
-int GetPlatformHaveFBCFlag()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", "platform.havefbc", "true");
- if (strcmp(config_value, "true") == 0) {
- return 1;
- }
-
- return 0;
-}
-
-int GetPlatformHaveDDFlag()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", "platform.havedd", "null");
- if (strcmp(config_value, "true") == 0 || strcmp(config_value, "1") == 0) {
- return 1;
- }
-
- return 0;
-}
-
-int GetPlatformProjectInfoSrc()
-{
- const char *config_value;
-
- config_value = config_get_str("TV", "platform.projectinfo.src", "null");
- if (strcmp(config_value, "null") == 0 || strcmp(config_value, "prop") == 0) {
- return 0;
- } else if (strcmp(config_value, "emmckey") == 0) {
- return 1;
- } else if (strcmp(config_value, "fbc_ver") == 0) {
- return 2;
- }
-
- return 0;
-}
-
-static unsigned int mCrc32Table[256];
-
-static void initCrc32Table()
-{
- int i, j;
- unsigned int Crc;
- for (i = 0; i < 256; i++) {
- Crc = i;
- for (j = 0; j < 8; j++) {
- if (Crc & 1)
- Crc = (Crc >> 1) ^ 0xEDB88320;
- else
- Crc >>= 1;
- }
- mCrc32Table[i] = Crc;
- }
-}
-
-unsigned int CalCRC32(unsigned int crc, const unsigned char *ptr, unsigned int buf_len)
-{
- static const unsigned int s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
- 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
- };
- unsigned int crcu32 = crc;
- if(buf_len < 0)
- return 0;
- if (!ptr) return 0;
- crcu32 = ~crcu32;
- while (buf_len--) {
- unsigned char b = *ptr++;
- crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)];
- crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)];
- }
- return ~crcu32;
-}
-
-#define CC_HEAD_CHKSUM_LEN (9)
-#define CC_VERSION_LEN (5)
-
-static int check_projectinfo_data_valid(char *data_str, int chksum_head_len, int ver_len)
-{
- int tmp_len = 0, tmp_ver = 0;
- char *endp = NULL;
- unsigned long src_chksum = 0, cal_chksum = 0;
- char tmp_buf[129] = { 0 };
-
- if (data_str != NULL) {
- tmp_len = strlen(data_str);
- if (tmp_len > chksum_head_len + ver_len) {
- cal_chksum = CalCRC32(0, (unsigned char *)(data_str + chksum_head_len), tmp_len - chksum_head_len);
- memcpy(tmp_buf, data_str, chksum_head_len);
- tmp_buf[chksum_head_len] = 0;
- src_chksum = strtoul(tmp_buf, &endp, 16);
- if (cal_chksum == src_chksum) {
- memcpy(tmp_buf, data_str + chksum_head_len, ver_len);
- if ((tmp_buf[0] == 'v' || tmp_buf[0] == 'V') && isxdigit(tmp_buf[1]) && isxdigit(tmp_buf[2]) && isxdigit(tmp_buf[3])) {
- tmp_ver = strtoul(tmp_buf + 1, &endp, 16);
- if (tmp_ver <= 0) {
- LOGD("%s, project_info data version error!!!\n", __FUNCTION__);
- return -1;
- }
- } else {
- LOGD("%s, project_info data version error!!!\n", __FUNCTION__);
- return -1;
- }
-
- return tmp_ver;
- } else {
- LOGD("%s, cal_chksum = %x\n", __FUNCTION__, (unsigned int)cal_chksum);
- LOGD("%s, src_chksum = %x\n", __FUNCTION__, (unsigned int)src_chksum);
- }
- }
-
- LOGD("%s, project_info data error!!!\n", __FUNCTION__);
- return -1;
- }
-
- LOGD("%s, project_info data is NULL!!!\n", __FUNCTION__);
- return -1;
-}
-
-static int gFBCPrjInfoRDPass = 0;
-static char gFBCPrjInfoBuf[1024] = {0};
-
-static int GetProjectInfoOriData(char data_str[])
-{
- int tmp_val = 0;
- int src_type = GetPlatformProjectInfoSrc();
-
- if (src_type == 0) {
- memset(data_str, '\0', sizeof(data_str));
- property_get("ubootenv.var.project_info", data_str, "null");
- if (strcmp(data_str, "null") == 0) {
- LOGE("%s, get project info data error!!!\n", __FUNCTION__);
- return -1;
- }
-
- return 0;
- } else if (src_type == 1) {
- return -1;
- } else if (src_type == 2) {
- int i = 0, tmp_len = 0, tmp_val = 0, item_cnt = 0;
- int tmp_rd_fail_flag = 0;
- unsigned int cal_chksum = 0;
- char sw_version[64];
- char build_time[64];
- char git_version[64];
- char git_branch[64];
- char build_name[64];
- char tmp_buf[512] = {0};
-
- CFbcCommunication *fbcIns = GetSingletonFBC();
- if (fbcIns != NULL) {
- if (gFBCPrjInfoRDPass == 0) {
- memset((void *)gFBCPrjInfoBuf, 0, sizeof(gFBCPrjInfoBuf));
- }
-
- if (gFBCPrjInfoRDPass == 1) {
- strcpy(data_str, gFBCPrjInfoBuf);
- LOGD("%s, rd once just return, data_str = %s\n", __FUNCTION__, data_str);
- return 0;
- }
-
- if (fbcIns->cfbc_Get_FBC_MAINCODE_Version(COMM_DEV_SERIAL, sw_version, build_time, git_version, git_branch, build_name) == 0) {
- if (sw_version[0] == '1' || sw_version[0] == '2') {
- strcpy(build_name, "2");
-
- strcpy(tmp_buf, "v001,fbc_");
- strcat(tmp_buf, build_name);
- strcat(tmp_buf, ",4k2k60hz420,no_rev,");
- strcat(tmp_buf, "HV550QU2-305");
- strcat(tmp_buf, ",8o8w,0,0");
- cal_chksum = CalCRC32(0, (unsigned char *)tmp_buf, strlen(tmp_buf));
- sprintf(data_str, "%08x,%s", cal_chksum, tmp_buf);
- LOGD("%s, data_str = %s\n", __FUNCTION__, data_str);
- } else {
- tmp_val = 0;
- if (fbcIns->cfbc_Get_FBC_project_id(COMM_DEV_SERIAL, &tmp_val) == 0) {
- sprintf(build_name, "fbc_%d", tmp_val);
- } else {
- tmp_rd_fail_flag = 1;
- strcpy(build_name, "fbc_0");
- LOGD("%s, get project id from fbc error!!!\n", __FUNCTION__);
- }
-
- strcpy(tmp_buf, "v001,");
- strcat(tmp_buf, build_name);
- strcat(tmp_buf, ",4k2k60hz420,no_rev,");
-
- memset(git_branch, 0, sizeof(git_branch));
- if (fbcIns->cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_SERIAL, git_branch) == 0) {
- strcat(tmp_buf, git_branch);
- } else {
- tmp_rd_fail_flag = 1;
- strcat(tmp_buf, build_name);
- LOGD("%s, get panel info from fbc error!!!\n", __FUNCTION__);
- }
-
- strcat(tmp_buf, ",8o8w,0,0");
- cal_chksum = CalCRC32(0, (unsigned char *)tmp_buf, strlen(tmp_buf));
- sprintf(data_str, "%08x,%s", cal_chksum, tmp_buf);
- LOGD("%s, data_str = %s\n", __FUNCTION__, data_str);
-
- if (tmp_rd_fail_flag == 0) {
- gFBCPrjInfoRDPass = 1;
- strcpy(gFBCPrjInfoBuf, data_str);
- }
- }
-
- return 0;
- }
-
- return -1;
- }
- }
-
- return -1;
-}
-
-int GetProjectInfo(project_info_t *proj_info_ptr)
-{
- int i = 0, tmp_ret = 0, tmp_val = 0, tmp_len = 0;
- int item_cnt = 0, handle_prj_info_data_flag = 0;
- char *token = NULL;
- const char *strDelimit = ",";
- char tmp_buf[1024] = { 0 };
- char data_str[1024] = { 0 };
-
- if (GetProjectInfoOriData(data_str) < 0) {
- return -1;
- }
-
- memset((void *)proj_info_ptr->version, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
- memset((void *)proj_info_ptr->panel_type, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
- memset((void *)proj_info_ptr->panel_outputmode, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
- memset((void *)proj_info_ptr->panel_rev, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
- memset((void *)proj_info_ptr->panel_name, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
- memset((void *)proj_info_ptr->amp_curve_name, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
-
- //check project info data is valid
- handle_prj_info_data_flag = check_projectinfo_data_valid(data_str, CC_HEAD_CHKSUM_LEN, CC_VERSION_LEN);
-
- //handle project info data
- if (handle_prj_info_data_flag > 0) {
- item_cnt = 0;
- memset((void *)tmp_buf, 0, sizeof(tmp_buf));
- strncpy(tmp_buf, data_str + CC_HEAD_CHKSUM_LEN, sizeof(tmp_buf) - 1);
- if (handle_prj_info_data_flag == 1) {
- token = strtok(tmp_buf, strDelimit);
- while (token != NULL) {
- if (item_cnt == 0) {
- strncpy(proj_info_ptr->version, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
- } else if (item_cnt == 1) {
- strncpy(proj_info_ptr->panel_type, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
- } else if (item_cnt == 2) {
- strncpy(proj_info_ptr->panel_outputmode, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
- } else if (item_cnt == 3) {
- strncpy(proj_info_ptr->panel_rev, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
- } else if (item_cnt == 4) {
- strncpy(proj_info_ptr->panel_name, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
- } else if (item_cnt == 5) {
- strncpy(proj_info_ptr->amp_curve_name, token, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
- }
-
- token = strtok(NULL, strDelimit);
- item_cnt += 1;
- }
- }
-
- return 0;
- }
-
- return -1;
-} \ No newline at end of file
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <sys/prctl.h>
+#include <stdlib.h>
+#include <android/log.h>
+#include <cutils/android_reboot.h>
+#include "../tvconfig/tvconfig.h"
+#include "../tvsetting/CTvSetting.h"
+#include <cutils/properties.h>
+#include <dirent.h>
+using namespace android;
+
+#include "tvutils.h"
+
+#define LOG_TAG "LibTvMISC"
+#include "CTvLog.h"
+
+#define CS_I2C_1_DEV_PATH "/dev/i2c-1"
+#define CS_I2C_2_DEV_PATH "/dev/i2c-2"
+
+/* number of times a device address should be polled when not acknowledging */
+#define I2C_RETRIES 0x0701
+
+/* set timeout in units of 10 ms */
+#define I2C_TIMEOUT 0x0702
+
+/* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses
+ * are NOT supported! (due to code brokenness)
+ */
+
+/* Use this slave address */
+#define I2C_SLAVE 0x0703
+
+/* Use this slave address, even if it is already in use by a driver! */
+#define I2C_SLAVE_FORCE 0x0706
+
+#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 */
+
+struct i2c_msg {
+ unsigned short addr; /* slave address */
+ unsigned short flags;
+#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */
+#define I2C_M_WR 0x0000 /* write data, from master to slave */
+#define I2C_M_RD 0x0001 /* read data, from slave to master */
+#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
+#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
+
+ unsigned short len; /* msg length */
+ unsigned char *buf; /* pointer to msg data */
+};
+
+struct i2c_rdwr_ioctl_data {
+ struct i2c_msg *msgs;
+ unsigned int nmsgs;
+};
+
+static volatile int mDreamPanelResumeLastBLFlag = 0;
+static volatile int mDreamPanelDemoFlag = 0;
+
+static pthread_mutex_t dream_panel_resume_last_bl_flag_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t dream_panel_demo_flag_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t file_attr_control_flag_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static pthread_t UserPet_ThreadId = 0;
+static unsigned char is_turnon_user_pet_thread = false;
+static unsigned char is_user_pet_thread_start = false;
+static unsigned int user_counter = 0;
+static unsigned int user_pet_terminal = 1;
+
+static int iw_duty = 0;
+
+static int Miscioctl(const char *file_path, int request, ...)
+{
+ int fd = -1, tmp_ret = -1;
+ int bus_status = 0;
+ va_list ap;
+ void *arg;
+
+ if (file_path == NULL) {
+ LOGE("%s, file path is NULL!!!\n", "TV");
+ return -1;
+ }
+
+ fd = open(file_path, O_RDWR);
+ if (fd < 0) {
+ LOGE("%s, Open %s ERROR(%s)!!\n", "TV", file_path, strerror(errno));
+ return -1;
+ }
+
+ va_start(ap, request);
+ arg = va_arg(ap, void *);
+ va_end(ap);
+
+ tmp_ret = ioctl(fd, request, arg);
+
+ close(fd);
+ fd = -1;
+
+ return tmp_ret;
+}
+
+int cfg_get_one_item(const char *key_str, const char *strDelimit, int item_index, char cfg_str[])
+{
+ int cfg_item_ind = 0;
+ char *token = NULL;
+ const char *config_value;
+ char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
+
+ if (key_str == NULL) {
+ LOGE("%s, key_str's pointer is NULL.\n", "TV");
+ return -1;
+ }
+
+ if (cfg_str == NULL) {
+ LOGE("%s, cfg_str's pointer is NULL.\n", "TV");
+ return -1;
+ }
+
+ if (item_index < 0) {
+ LOGE("%s, item_index can't be less than 0.\n", "TV");
+ return -1;
+ }
+
+ config_value = config_get_str("TV", key_str, "null");
+ if (strcasecmp(config_value, "null") == 0) {
+ cfg_str[0] = '\0';
+ LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
+ return -1;
+ }
+
+ cfg_item_ind = 0;
+
+ memset((void *)data_str, 0, sizeof(data_str));
+ strncpy(data_str, config_value, sizeof(data_str) - 1);
+
+ token = strtok(data_str, strDelimit);
+ while (token != NULL) {
+ if (cfg_item_ind == item_index) {
+ strcpy(cfg_str, token);
+ break;
+ }
+
+ token = strtok(NULL, strDelimit);
+ cfg_item_ind += 1;
+ }
+
+ if (token == NULL) {
+ cfg_str[0] = '\0';
+ return -1;
+ }
+
+ return 0;
+}
+
+int cfg_split(char *line_data, char *strDelimit, int *item_cnt, char **item_bufs)
+{
+ int i = 0, tmp_cnt = 0;
+ char *token = NULL;
+
+ if (line_data == NULL) {
+ LOGE("%s, line_data is NULL", "TV");
+ return -1;
+ }
+
+ if (strDelimit == NULL) {
+ LOGE("%s, strDelimit is NULL", "TV");
+ return -1;
+ }
+
+ if (item_cnt == NULL) {
+ LOGE("%s, item_cnt is NULL", "TV");
+ return -1;
+ }
+
+ if (item_bufs == NULL) {
+ LOGE("%s, item_bufs is NULL", "TV");
+ return -1;
+ }
+
+ for (i = 0; i < *item_cnt; i++) {
+ item_bufs[i] = NULL;
+ }
+
+ token = strtok(line_data, strDelimit);
+
+ while (token != NULL) {
+ item_bufs[tmp_cnt] = token;
+
+ token = strtok(NULL, strDelimit);
+
+ tmp_cnt += 1;
+ if (tmp_cnt >= *item_cnt) {
+ break;
+ }
+ }
+
+ *item_cnt = tmp_cnt;
+
+ return 0;
+}
+
+int ReadADCSpecialChannelValue(int adc_channel_num)
+{
+ FILE *fp = NULL;
+ int rd_data = 0;
+ char ch_sysfs_path[256] = { 0 };
+
+ if (adc_channel_num < CC_MIN_ADC_CHANNEL_VAL || adc_channel_num > CC_MAX_ADC_CHANNEL_VAL) {
+ LOGD("adc channel num must between %d and %d.", CC_MIN_ADC_CHANNEL_VAL, CC_MAX_ADC_CHANNEL_VAL);
+ return 0;
+ }
+
+ sprintf(ch_sysfs_path, "/sys/class/saradc/saradc_ch%d", adc_channel_num);
+
+ fp = fopen(ch_sysfs_path, "r");
+
+ if (fp == NULL) {
+ LOGE("open %s ERROR(%s)!!\n", ch_sysfs_path, strerror(errno));
+ return 0;
+ }
+
+ fscanf(fp, "%d", &rd_data);
+
+ fclose(fp);
+
+ return rd_data;
+}
+
+int Tv_MiscRegs(const char *cmd)
+{
+ //#ifdef BRING_UP_DEBUG
+ FILE *fp = NULL;
+ fp = fopen("/sys/class/register/reg", "w");
+
+ if (fp != NULL && cmd != NULL) {
+ fprintf(fp, "%s", cmd);
+ } else {
+ LOGE("Open /sys/class/register/reg ERROR(%s)!!\n", strerror(errno));
+ fclose(fp);
+ return -1;
+ }
+ fclose(fp);
+ //#endif
+
+ return 0;
+}
+
+int TvMisc_SetLVDSSSC(int val)
+{
+ FILE *fp;
+
+ fp = fopen("/sys/class/lcd/ss", "w");
+
+ if (fp != NULL) {
+ fprintf(fp, "%d", val);
+ fclose(fp);
+ } else {
+ LOGE("open /sys/class/lcd/ss ERROR(%s)!!\n", strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+
+int TvMisc_SetUserCounterTimeOut(int timeout)
+{
+ FILE *fp;
+
+ fp = fopen("/sys/devices/platform/aml_wdt/user_pet_timeout", "w");
+
+ if (fp != NULL) {
+ fprintf(fp, "%d", timeout);
+ fclose(fp);
+ } else {
+ LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/user_pet_timeout ERROR(%s)!!\n", strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+
+int TvMisc_SetUserCounter(int count)
+{
+ FILE *fp;
+
+ fp = fopen("/sys/module/aml_wdt/parameters/user_pet", "w");
+
+ if (fp != NULL) {
+ fprintf(fp, "%d", count);
+ fclose(fp);
+ } else {
+ LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/user_pet ERROR(%s)!!\n", strerror(errno));
+ return -1;
+ }
+
+ fclose(fp);
+
+ return 0;
+}
+
+int TvMisc_SetUserPetResetEnable(int enable)
+{
+ FILE *fp;
+
+ fp = fopen("/sys/module/aml_wdt/parameters/user_pet_reset_enable", "w");
+
+ if (fp != NULL) {
+ fprintf(fp, "%d", enable);
+ fclose(fp);
+ } else {
+ LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/user_pet_reset_enable ERROR(%s)!!\n", strerror(errno));
+ return -1;
+ }
+
+ fclose(fp);
+
+ return 0;
+}
+
+int TvMisc_SetSystemPetResetEnable(int enable)
+{
+ FILE *fp;
+
+ fp = fopen("/sys/devices/platform/aml_wdt/reset_enable", "w");
+
+ if (fp != NULL) {
+ fprintf(fp, "%d", enable);
+ fclose(fp);
+ } else {
+ LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/reset_enable ERROR(%s)!!\n", strerror(errno));
+ return -1;
+ }
+
+ fclose(fp);
+
+ return 0;
+}
+
+int TvMisc_SetSystemPetEnable(int enable)
+{
+ FILE *fp;
+
+ fp = fopen("/sys/devices/platform/aml_wdt/ping_enable", "w");
+
+ if (fp != NULL) {
+ fprintf(fp, "%d", enable);
+ fclose(fp);
+ } else {
+ LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/ping_enable ERROR(%s)!!\n", strerror(errno));
+ return -1;
+ }
+
+ fclose(fp);
+
+ return 0;
+}
+
+int TvMisc_SetSystemPetCounterTimeOut(int timeout)
+{
+ FILE *fp;
+
+ fp = fopen("/sys/devices/platform/aml_wdt/wdt_timeout", "w");
+
+ if (fp != NULL) {
+ fprintf(fp, "%d", timeout);
+ fclose(fp);
+ } else {
+ LOGE("=OSD CPP=> open /sys/devices/platform/aml_wdt/wdt_timeout ERROR(%s)!!\n", strerror(errno));
+ return -1;
+ }
+
+ fclose(fp);
+
+ return 0;
+}
+
+#define MEMERASE _IOW('M', 2, struct erase_info_user)
+static int memerase(int fd, struct erase_info_user *erase)
+{
+ return (ioctl (fd, MEMERASE, erase));
+}
+
+#define CS_ATV_SOCKET_FILE_NAME "/dev/socket/datv_sock"
+
+static int setServer(const char *fileName)
+{
+ int ret = -1, sock = -1;
+ struct sockaddr_un srv_addr;
+
+ sock = socket(PF_UNIX, SOCK_STREAM, 0);
+ if (sock < 0) {
+ LOGE("%s, socket create failed (errno = %d: %s).\n", "TV", errno, strerror(errno));
+ return -1;
+ }
+
+ //set server addr_param
+ srv_addr.sun_family = AF_UNIX;
+ strncpy(srv_addr.sun_path, CS_ATV_SOCKET_FILE_NAME, sizeof(srv_addr.sun_path) - 1);
+ unlink(CS_ATV_SOCKET_FILE_NAME);
+
+ //bind sockfd & addr
+ ret = bind(sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr));
+ if (ret == -1) {
+ LOGE("%s, cannot bind server socket.\n", "TV");
+ close(sock);
+ unlink(CS_ATV_SOCKET_FILE_NAME);
+ return -1;
+ }
+
+ //listen sockfd
+ ret = listen(sock, 1);
+ if (ret == -1) {
+ LOGE("%s, cannot listen the client connect request.\n", "TV");
+ close(sock);
+ unlink(CS_ATV_SOCKET_FILE_NAME);
+ return -1;
+ }
+
+ return sock;
+}
+
+static int acceptMessage(int listen_fd)
+{
+ int ret, com_fd;
+ socklen_t len;
+ struct sockaddr_un clt_addr;
+
+ //have connect request use accept
+ len = sizeof(clt_addr);
+ com_fd = accept(listen_fd, (struct sockaddr *) &clt_addr, &len);
+ if (com_fd < 0) {
+ LOGE("%s, cannot accept client connect request.\n", "TV");
+ close(listen_fd);
+ unlink(CS_ATV_SOCKET_FILE_NAME);
+ return -1;
+ }
+
+ LOGD("%s, com_fd = %d\n", "TV", com_fd);
+
+ return com_fd;
+}
+
+static int parse_socket_message(char *msg_str, int *para_cnt, int para_buf[])
+{
+ int para_count = 0, set_mode = 0;
+ char *token = NULL;
+
+ set_mode = -1;
+
+ token = strtok(msg_str, ",");
+ if (token != NULL) {
+ if (strcasecmp(token, "quit") == 0) {
+ set_mode = 0;
+ } else if (strcasecmp(token, "SetAudioVolumeCompensationVal") == 0) {
+ set_mode = 1;
+ } else if (strcasecmp(token, "set3dmode") == 0) {
+ set_mode = 2;
+ } else if (strcasecmp(token, "setdisplaymode") == 0) {
+ set_mode = 3;
+ }
+ }
+
+ if (set_mode != 1 && set_mode != 2 && set_mode != 3) {
+ return set_mode;
+ }
+
+ para_count = 0;
+
+ token = strtok(NULL, ",");
+ while (token != NULL) {
+ para_buf[para_count] = strtol(token, NULL, 10);
+ para_count += 1;
+
+ token = strtok(NULL, ",");
+ }
+
+ *para_cnt = para_count;
+
+ return set_mode;
+}
+
+/*static void* socket_thread_entry(void *arg)
+{
+ int ret = 0, listen_fd = -1, com_fd = -1, rd_len = 0;
+ int para_count = 0, set_mode = 0;
+ int tmp_val = 0;
+ int para_buf[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
+ static char recv_buf[1024];
+
+ listen_fd = setServer(CS_ATV_SOCKET_FILE_NAME);
+ chmod(CS_ATV_SOCKET_FILE_NAME, 0666);
+ prctl(PR_SET_NAME, (unsigned long) "datv.sock.thread");
+
+ if (listen_fd < 0) {
+ return NULL;
+ }
+
+ while (1) {
+ com_fd = acceptMessage(listen_fd);
+
+ if (com_fd >= 0) {
+ //read message from client
+ memset((void *) recv_buf, 0, sizeof(recv_buf));
+ rd_len = read(com_fd, recv_buf, sizeof(recv_buf));
+ LOGD("%s, message from client (%d)) : %s\n", "TV", rd_len, recv_buf);
+
+ set_mode = parse_socket_message(recv_buf, &para_count, para_buf);
+ if (set_mode == 0) {
+ LOGD("%s, receive quit message, starting to quit.\n", "TV");
+ sprintf(recv_buf, "%s", "quiting now...");
+ write(com_fd, recv_buf, strlen(recv_buf) + 1);
+ break;
+ } else if (set_mode == 1) {
+ ret = -1;
+
+ if (para_count == 1) {
+ LOGD("%s, SetAudioVolumeCompensationVal value = %d\n", "TV", para_buf[0]);
+
+ ret = SetAudioVolumeCompensationVal(para_buf[0]);
+ } else if (para_count == 2) {
+ LOGD("%s, SetAudioVolumeCompensationVal value = %d, type = %d\n", "TV", para_buf[0], para_buf[1]);
+
+ ret = SetAudioVolumeCompensationVal(para_buf[0]);
+
+ if (para_buf[1] == 1) {
+ tmp_val = GetAudioMasterVolume();
+ ret |= SetAudioMasterVolume(tmp_val);
+ }
+ }
+
+ sprintf(recv_buf, "%d", ret);
+ write(com_fd, recv_buf, strlen(recv_buf) + 1);
+ } else if (set_mode == 2) {
+ ret = -1;
+
+ if (para_count == 1) {
+ LOGE("%s, mode = %d ------->\n", "TV", para_buf[0]);
+
+ switch (para_buf[0]) {
+ case 4: //BT
+ ret = Tvin_Set3DFunction(MODE3D_BT);
+ break;
+ case 5: //LR
+ ret = Tvin_Set3DFunction(MODE3D_LR);
+ break;
+ case 8: //
+ ret = Tvin_Set3DFunction(MODE3D_DISABLE);
+ break;
+ case 0:
+ ret = Tvin_Set3DFunction(MODE3D_DISABLE);
+ break;
+ case 9: //
+ ret = Tvin_Set3DFunction(MODE3D_L_3D_TO_2D);
+ break;
+ }
+ if (ret == 0) {
+ LOGE("%s, sk_hdi_av_set_3d_mode return sucess.\n", "TV");
+ } else {
+ LOGE("%s, sk_hdi_av_set_3d_mode return error(%d).\n", "TV", ret);
+ }
+ }
+
+ sprintf(recv_buf, "%d", ret);
+ write(com_fd, recv_buf, strlen(recv_buf) + 1);
+
+ }
+
+ close(com_fd);
+ com_fd = -1;
+ }
+ }
+
+ if (com_fd >= 0) {
+ close(com_fd);
+ com_fd = -1;
+ }
+
+ if (listen_fd >= 0) {
+ close(listen_fd);
+ listen_fd = -1;
+ }
+
+ unlink(CS_ATV_SOCKET_FILE_NAME);
+
+ return NULL;
+}*/
+
+#if !defined(SUN_LEN)
+#define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
+#endif
+
+static int connectToServer(char *file_name)
+{
+ int tmp_ret = 0, sock = -1;
+ struct sockaddr_un addr;
+
+ if (file_name == NULL) {
+ LOGE("%s, file name is NULL\n", "TV");
+ return -1;
+ }
+
+ sock = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sock < 0) {
+ LOGE("%s, socket create failed (errno = %d: %s)\n", "TV", errno, strerror(errno));
+ return -1;
+ }
+
+ /* connect to socket; fails if file doesn't exist */
+ strcpy(addr.sun_path, file_name); // max 108 bytes
+ addr.sun_family = AF_UNIX;
+ tmp_ret = connect(sock, (struct sockaddr *) &addr, SUN_LEN(&addr));
+ if (tmp_ret < 0) {
+ // ENOENT means socket file doesn't exist
+ // ECONNREFUSED means socket exists but nobody is listening
+ LOGE("%s, AF_UNIX connect failed for '%s': %s\n", "TV", file_name, strerror(errno));
+ close(sock);
+ return -1;
+ }
+
+ return sock;
+}
+
+static int realSendSocketMsg(char *file_name, char *msg_str, char recv_buf[])
+{
+ int sock = -1, rd_len = 0;
+ char tmp_buf[1024];
+
+ if (file_name == NULL) {
+ LOGE("%s, file name is NULL\n", "TV");
+ return -1;
+ }
+
+ if (msg_str == NULL) {
+ LOGE("%s, msg string is NULL\n", "TV");
+ return -1;
+ }
+
+ LOGD("%s, message to server (%d)) : %s\n", "TV", strlen(msg_str), msg_str);
+
+ sock = connectToServer(file_name);
+
+ if (sock >= 0) {
+ write(sock, msg_str, strlen(msg_str) + 1);
+
+ if (recv_buf == NULL) {
+ memset((void *) tmp_buf, 0, sizeof(tmp_buf));
+ rd_len = read(sock, tmp_buf, sizeof(tmp_buf));
+ LOGD("%s, message from server (%d)) : %s\n", "TV", rd_len, tmp_buf);
+ } else {
+ rd_len = read(sock, recv_buf, 1024);
+ LOGD("%s, message from server (%d)) : %s\n", "TV", rd_len, recv_buf);
+ }
+
+ close(sock);
+ sock = -1;
+
+ return 0;
+ }
+
+ return -1;
+}
+
+int I2C_WriteNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[])
+{
+ int tmp_ret = 0;
+ struct i2c_rdwr_ioctl_data ctl_data;
+ struct i2c_msg msg;
+ unsigned char msg_buf[52];
+ int device_fd = -1;
+
+ memset((void *) msg_buf, 0, 52);
+
+ msg_buf[0] = (unsigned char) (slave_addr >> 8);
+ msg_buf[1] = (unsigned char) (slave_addr & 0x00ff);
+
+ if (data_buf == NULL) {
+ return -1;
+ }
+
+ if (len < 50) {
+ memcpy((void *) &msg_buf[2], data_buf, len);
+ } else {
+ LOGE("I2C_WriteNbyte len(%d) > 50, error!\n", len);
+ return -1;
+ }
+
+ msg.addr = dev_addr;
+ msg.flags = I2C_M_WR;
+ msg.len = 2 + len;
+ msg.buf = msg_buf;
+ ctl_data.nmsgs = 1;
+ ctl_data.msgs = &msg;
+
+ if (i2c_no == 1) {
+ device_fd = open(CS_I2C_1_DEV_PATH, O_RDWR);
+ if (device_fd < 0) {
+ LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_1_DEV_PATH, strerror(errno));
+ return -1;
+ }
+ } else if (i2c_no == 2) {
+ device_fd = open(CS_I2C_2_DEV_PATH, O_RDWR);
+ if (device_fd < 0) {
+ LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_2_DEV_PATH, strerror(errno));
+ return -1;
+ }
+ } else {
+ LOGE("%s, invalid i2c no (%d).\n", "TV", i2c_no);
+ return -1;
+ }
+
+ tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data);
+
+ usleep(10 * 1000);
+ if (device_fd >= 0) {
+ close(device_fd);
+ device_fd = -1;
+ }
+ return tmp_ret;
+}
+
+int I2C_ReadNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[])
+{
+ int tmp_ret = 0;
+ struct i2c_rdwr_ioctl_data ctl_data;
+ struct i2c_msg msg;
+ unsigned char msg_buf[52];
+ int device_fd = -1;
+
+ memset((void *) msg_buf, 0, 52);
+
+ if (data_buf == NULL) {
+ return -1;
+ }
+
+ if (len < 50) {
+ memcpy((void *) &msg_buf[2], data_buf, len);
+ } else {
+ LOGE("I2C_WriteNbyte len(%d) > 50, error!\n", len);
+ return -1;
+ }
+
+ msg_buf[0] = (unsigned char) (slave_addr >> 8);
+ msg_buf[1] = (unsigned char) (slave_addr & 0x00ff);
+ msg.addr = dev_addr;
+ msg.flags = I2C_M_WR;
+ msg.len = 2;
+ msg.buf = msg_buf;
+ ctl_data.nmsgs = 1;
+ ctl_data.msgs = &msg;
+
+ if (i2c_no == 1) {
+ device_fd = open(CS_I2C_1_DEV_PATH, O_RDWR);
+ if (device_fd < 0) {
+ LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_1_DEV_PATH, strerror(errno));
+ return -1;
+ }
+ } else if (i2c_no == 2) {
+ device_fd = open(CS_I2C_2_DEV_PATH, O_RDWR);
+ if (device_fd < 0) {
+ LOGE("%s, Open device file %S error: %s.\n", "TV", CS_I2C_2_DEV_PATH, strerror(errno));
+ return -1;
+ }
+ } else {
+ LOGE("%s, invalid i2c no (%d).\n", "TV", i2c_no);
+ return -1;
+ }
+
+ tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data);
+
+ msg.addr = dev_addr;
+ msg.flags |= I2C_M_RD;
+ msg.len = len;
+ msg.buf = data_buf;
+ ctl_data.nmsgs = 1;
+ ctl_data.msgs = &msg;
+
+ tmp_ret = ioctl(device_fd, I2C_RDWR, &ctl_data);
+
+ usleep(10 * 1000);
+
+ if (device_fd >= 0) {
+ close(device_fd);
+ device_fd = -1;
+ }
+ return tmp_ret;
+}
+
+int SetFileAttrValue(const char *fp, const char value[])
+{
+ int fd = -1, ret = -1;
+
+ pthread_mutex_lock(&file_attr_control_flag_mutex);
+
+ fd = open(fp, O_RDWR);
+
+ if (fd < 0) {
+ LOGE("open %s ERROR(%s)!!\n", fp, strerror(errno));
+ pthread_mutex_unlock(&file_attr_control_flag_mutex);
+ return -1;
+ }
+
+ ret = write(fd, value, strlen(value));
+ close(fd);
+
+ pthread_mutex_unlock(&file_attr_control_flag_mutex);
+ return ret;
+}
+
+int GetFileAttrIntValue(const char *fp)
+{
+ int fd = -1, ret = -1;
+ int temp = -1;
+ char temp_str[32];
+
+ memset(temp_str, 0, 32);
+
+ fd = open(fp, O_RDWR);
+
+ if (fd <= 0) {
+ LOGE("open %s ERROR(%s)!!\n", fp, strerror(errno));
+ return -1;
+ }
+
+ if (read(fd, temp_str, sizeof(temp_str)) > 0) {
+ if (sscanf(temp_str, "%d", &temp) >= 0) {
+ LOGD("%s -> get %s value =%d!\n", "TV", fp, temp);
+ close(fd);
+ return temp;
+ } else {
+ LOGE("%s -> get %s value error(%s)\n", "TV", fp, strerror(errno));
+ close(fd);
+ return -1;
+ }
+ }
+
+ close(fd);
+ return -1;
+}
+
+int *GetFileAttrIntValueStr(const char *fp)
+{
+ int fd = -1, ret = -1;
+ static int temp[4];
+ char temp_str[32];
+ int i = 0;
+ char *p = NULL;
+
+ memset(temp_str, 0, 32);
+
+ fd = open(fp, O_RDWR);
+
+ if (fd <= 0) {
+ LOGE("open %s ERROR(%s)!!\n", fp, strerror(errno));
+ return NULL;
+ }
+
+ if (read(fd, temp_str, sizeof(temp_str)) > 0) {
+ LOGD("%s,temp_str = %s\n", "TV", temp_str);
+ p = strtok(temp_str, " ");
+ while (p != NULL) {
+ sscanf(p, "%d", &temp[i]);
+ p = strtok(NULL, " ");
+ i = i + 1;
+ }
+ close(fd);
+ return temp;
+ }
+
+ close(fd);
+ return NULL;
+}
+
+int Get_Fixed_NonStandard(void)
+{
+ return GetFileAttrIntValue("/sys/module/tvin_afe/parameters/force_nostd");
+}
+
+//0-turn off
+//1-force non-standard
+//2-force normal
+int Set_Fixed_NonStandard(int value)
+{
+ int fd = -1, ret = -1;
+ char set_vale[32];
+ memset(set_vale, '\0', 32);
+
+ sprintf(set_vale, "%d", value);
+
+ fd = open("/sys/module/tvin_afe/parameters/force_nostd", O_RDWR);
+
+ if (fd >= 0) {
+ ret = write(fd, set_vale, strlen(set_vale));
+ }
+
+ if (ret <= 0) {
+ LOGE("%s -> set /sys/module/tvin_afe/parameters/force_nostd error(%s)!\n", "TV", strerror(errno));
+ }
+
+ close(fd);
+
+ return ret;
+}
+
+static void *UserPet_TreadRun(void *data)
+{
+ while (is_turnon_user_pet_thread == true) {
+ if (is_user_pet_thread_start == true) {
+ usleep(1000 * 1000);
+ if (++user_counter == 0xffffffff)
+ user_counter = 1;
+ TvMisc_SetUserCounter(user_counter);
+ } else {
+ usleep(10000 * 1000);
+ }
+ }
+ if (user_pet_terminal == 1) {
+ user_counter = 0;
+ } else {
+ user_counter = 1;
+ }
+ TvMisc_SetUserCounter(user_counter);
+ return ((void *) 0);
+}
+
+static int UserPet_CreateThread(void)
+{
+ int ret = 0;
+ pthread_attr_t attr;
+ struct sched_param param;
+
+ is_turnon_user_pet_thread = true;
+ is_user_pet_thread_start = true;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setschedpolicy(&attr, SCHED_RR);
+ param.sched_priority = 1;
+ pthread_attr_setschedparam(&attr, &param);
+ ret = pthread_create(&UserPet_ThreadId, &attr, &UserPet_TreadRun, NULL);
+ pthread_attr_destroy(&attr);
+ return ret;
+}
+
+static void UserPet_KillThread(void)
+{
+ int i = 0, dly = 600;
+ is_turnon_user_pet_thread = false;
+ is_user_pet_thread_start = false;
+ for (i = 0; i < 2; i++) {
+ usleep(dly * 1000);
+ }
+ pthread_join(UserPet_ThreadId, NULL);
+ UserPet_ThreadId = 0;
+ LOGD("%s, done.", "TV");
+}
+
+void TvMisc_EnableWDT(bool kernelpet_disable, unsigned int userpet_enable, unsigned int kernelpet_timeout, unsigned int userpet_timeout, unsigned int userpet_reset)
+{
+ TvMisc_SetSystemPetCounterTimeOut(kernelpet_timeout);
+ TvMisc_SetSystemPetEnable(1);
+ if (kernelpet_disable) {
+ TvMisc_SetSystemPetResetEnable(0);
+ } else {
+ TvMisc_SetSystemPetResetEnable(1);
+ }
+ if (userpet_enable) {
+ TvMisc_SetUserCounterTimeOut(userpet_timeout);
+ TvMisc_SetUserPetResetEnable(userpet_reset);
+ UserPet_CreateThread();
+ } else {
+ TvMisc_SetUserCounter(0);
+ TvMisc_SetUserPetResetEnable(0);
+ }
+}
+
+void TvMisc_DisableWDT(unsigned int userpet_enable)
+{
+ if (userpet_enable) {
+ user_pet_terminal = 0;
+ UserPet_KillThread();
+ }
+}
+
+static int get_hardware_info(char *hardware, unsigned int *revision)
+{
+ char data[1024];
+ int fd, n;
+ char *x, *hw, *rev;
+
+ fd = open("/proc/cpuinfo", O_RDONLY);
+ if (fd < 0) {
+ return -1;
+ }
+
+ n = read(fd, data, 1023);
+ close(fd);
+ if (n < 0) {
+ return -1;
+ }
+
+ data[n] = 0;
+
+ if (hardware != NULL) {
+ hw = strstr(data, "\nHardware");
+
+ if (hw) {
+ x = strstr(hw, ": ");
+ if (x) {
+ x += 2;
+ n = 0;
+ while (*x && *x != '\n' && !isspace(*x)) {
+ hardware[n++] = tolower(*x);
+ x++;
+ if (n == 31) {
+ break;
+ }
+ }
+
+ hardware[n] = 0;
+ }
+ }
+ }
+
+ if (revision != NULL) {
+ rev = strstr(data, "\nRevision");
+
+ if (rev) {
+ x = strstr(rev, ": ");
+ if (x) {
+ *revision = strtoul(x + 2, 0, 16);
+ }
+ }
+ }
+
+ return 0;
+}
+
+int get_hardware_name(char *hardware)
+{
+ int tmp_ret = 0;
+
+ if (hardware == NULL) {
+ return -1;
+ }
+
+ tmp_ret = get_hardware_info(hardware, NULL);
+ if (tmp_ret < 0) {
+ hardware[0] = '\0';
+ }
+
+ return 0;
+}
+
+/*---------------delete dir---------------*/
+int TvMisc_DeleteDirFiles(const char *strPath, int flag)
+{
+ int status;
+ char tmp[256];
+ switch (flag) {
+ case 0:
+ sprintf(tmp, "rm -f %s", strPath);
+ LOGE("%s", tmp);
+ system(tmp);
+ break;
+ case 1:
+ sprintf(tmp, "cd %s", strPath);
+ LOGE("%s", tmp);
+ status = system(tmp);
+ if (status > 0 || status < 0)
+ return -1;
+ sprintf(tmp, "cd %s;rm -rf *", strPath);
+ system(tmp);
+ LOGE("%s", tmp);
+ break;
+ case 2:
+ sprintf(tmp, "rm -rf %s", strPath);
+ LOGE("%s", tmp);
+ system(tmp);
+ break;
+ }
+ return 0;
+}
+/*---------------delete dir end-----------*/
+
+#ifndef NELEM
+# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
+#endif
+
+
+int Tv_Utils_CheckFs(void)
+{
+ FILE *f;
+ char mount_dev[256];
+ char mount_dir[256];
+ char mount_type[256];
+ char mount_opts[256];
+ int mount_freq;
+ int mount_passno;
+ int match;
+ int found_ro_fs = 0;
+ int data_status = 0;
+ int cache_status = 0;
+ int atv_status = 0;
+ int dtv_status = 0;
+ int param_status = 0;
+ int cool_reboot = 0;
+ int recovery_reboot = 0;
+
+ f = fopen("/proc/mounts", "r");
+ if (! f) {
+ /* If we can't read /proc/mounts, just give up */
+ return 1;
+ }
+
+ do {
+ match = fscanf(f, "%255s %255s %255s %255s %d %d\n",
+ mount_dev, mount_dir, mount_type,
+ mount_opts, &mount_freq, &mount_passno);
+ mount_dev[255] = 0;
+ mount_dir[255] = 0;
+ mount_type[255] = 0;
+ mount_opts[255] = 0;
+ if ((match == 6) && (!strncmp(mount_dev, "/dev/block", 10))) {
+ LOGD("%s, %s %s %s %s %d %d!", "TV", mount_dev, mount_dir, mount_type, mount_opts, mount_freq, mount_passno);
+ if (!strncmp(mount_dir, "/param", 6)) {
+ param_status |= 0x01;
+ } else if (!strncmp(mount_dir, "/atv", 4)) {
+ atv_status |= 0x01;
+ } else if (!strncmp(mount_dir, "/dtv", 4)) {
+ dtv_status |= 0x01;
+ } else if (!strncmp(mount_dir, "/data", 5)) {
+ data_status |= 0x01;
+ } else if (!strncmp(mount_dir, "/cache", 6)) {
+ cache_status |= 0x01;
+ }
+ if (strstr(mount_opts, "ro")) {
+ found_ro_fs += 1;
+ if (!strncmp(mount_dir, "/param", 6)) {
+ param_status |= 0x02;
+ } else if (!strncmp(mount_dir, "/atv", 4)) {
+ atv_status |= 0x02;
+ } else if (!strncmp(mount_dir, "/dtv", 4)) {
+ dtv_status |= 0x02;
+ } else if (!strncmp(mount_dir, "/data", 5)) {
+ data_status |= 0x02;
+ } else if (!strncmp(mount_dir, "/cache", 6)) {
+ cache_status |= 0x02;
+ }
+ }
+ }
+ } while (match != EOF);
+
+ fclose(f);
+
+ switch (param_status) {
+ case 0x03:
+ LOGW("%s, param partition is read-only!", "TV");
+ break;
+ case 0x00:
+ LOGW("%s, param partition can not be mounted!", "TV");
+ break;
+ default:
+ break;
+ }
+ switch (atv_status) {
+ case 0x03:
+ LOGW("%s, atv partition is read-only!", "TV");
+ cool_reboot = 1;
+ //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
+ break;
+ case 0x00:
+ LOGW("%s, atv partition can not be mounted!", "TV");
+ recovery_reboot = 1;
+ //android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
+ default:
+ break;
+ }
+ switch (dtv_status) {
+ case 0x03:
+ LOGW("%s, dtv partition is read-only!", "TV");
+ //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
+ break;
+ case 0x00:
+ LOGW("%s, dtv partition can not be mounted!", "TV");
+ //android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
+ default:
+ break;
+ }
+ switch (data_status) {
+ case 0x03:
+ LOGW("%s, data partition is read-only!", "TV");
+ cool_reboot = 1;
+ //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
+ break;
+ case 0x00:
+ LOGW("%s, data partition can not be mounted!", "TV");
+ recovery_reboot = 1;
+ //android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
+ break;
+ default:
+ break;
+ }
+ switch (cache_status) {
+ case 0x03:
+ LOGW("%s, cache partition is read-only!", "TV");
+ cool_reboot = 1;
+ //android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
+ break;
+ case 0x00:
+ LOGW("%s, cache partition can not be mounted!", "TV");
+ recovery_reboot = 1;
+ //android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
+ break;
+ default:
+ break;
+ }
+ if (cool_reboot == 1) {
+ android_reboot(ANDROID_RB_RESTART2, 0, "cool_reboot");
+ }
+ if (recovery_reboot == 1) {
+ android_reboot(ANDROID_RB_RESTART2, 0, "recovery");
+ }
+ return found_ro_fs;
+}
+
+
+int Tv_Utils_SetFileAttrStr(const char *file_path, char val_str_buf[])
+{
+ FILE *tmpfp = NULL;
+
+ tmpfp = fopen(file_path, "w");
+ if (tmpfp == NULL) {
+ LOGE("%s, write open file %s error(%s)!!!\n", "TV", file_path, strerror(errno));
+ return -1;
+ }
+
+ fputs(val_str_buf, tmpfp);
+
+ fclose(tmpfp);
+ tmpfp = NULL;
+
+ return 0;
+}
+
+int Tv_Utils_GetFileAttrStr(const char *file_path, int buf_size, char val_str_buf[])
+{
+ FILE *tmpfp = NULL;
+
+ tmpfp = fopen(file_path, "r");
+ if (tmpfp == NULL) {
+ LOGE("%s, read open file %s error(%s)!!!\n", "TV", file_path, strerror(errno));
+ val_str_buf[0] = '\0';
+ return -1;
+ }
+
+ fgets(val_str_buf, buf_size, tmpfp);
+
+ fclose(tmpfp);
+ tmpfp = NULL;
+
+ return 0;
+}
+
+
+int Tv_Utils_IsFileExist(const char *file_name)
+{
+ struct stat tmp_st;
+
+ return stat(file_name, &tmp_st);
+}
+
+#define CC_EDID_SIZE (256)
+#define CS_VGA_EDID_BUF_DATA_CFG_NAME "ssm.vga.edidbuf.data"
+/*
+static unsigned char customer_edid_buf[CC_EDID_SIZE + 4];
+
+static unsigned char mDefHDMIEdidBuf[CC_EDID_SIZE] = {
+ //256 bytes
+ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x4d, 0x79, 0x02, 0x2c, 0x01, 0x01, 0x01, 0x01, //0x00~0x0F
+ 0x01, 0x15, 0x01, 0x03, 0x80, 0x85, 0x4b, 0x78, 0x0a, 0x0d, 0xc9, 0xa0, 0x57, 0x47, 0x98, 0x27, //0x10~0x1F
+ 0x12, 0x48, 0x4c, 0x21, 0x08, 0x00, 0x81, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //0x20~0x2F
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, 0x58, 0x2c, //0x30~0x3F
+ 0x45, 0x00, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, 0x01, 0x1d, 0x00, 0x72, 0x51, 0xd0, 0x1e, 0x20, //0x40~0x4F
+ 0x6e, 0x28, 0x55, 0x00, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x53, //0x50~0x5F
+ 0x6b, 0x79, 0x77, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x54, 0x56, 0x0a, 0x20, 0x00, 0x00, 0x00, 0xfd, //0x60~0x6F
+ 0x00, 0x30, 0x3e, 0x0e, 0x46, 0x0f, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x3e, //0x70~0x7F
+ 0x02, 0x03, 0x38, 0xf0, 0x53, 0x1f, 0x10, 0x14, 0x05, 0x13, 0x04, 0x20, 0x22, 0x3c, 0x3e, 0x12, //0x80~0x8F
+ 0x16, 0x03, 0x07, 0x11, 0x15, 0x02, 0x06, 0x01, 0x23, 0x09, 0x07, 0x01, 0x83, 0x01, 0x00, 0x00, //0x90~0x9F
+ 0x78, 0x03, 0x0c, 0x00, 0x10, 0x00, 0x88, 0x3c, 0x2f, 0xd0, 0x8a, 0x01, 0x02, 0x03, 0x04, 0x01, //0xA0~0xAF
+ 0x40, 0x00, 0x7f, 0x20, 0x30, 0x70, 0x80, 0x90, 0x76, 0xe2, 0x00, 0xfb, 0x02, 0x3a, 0x80, 0xd0, //0xB0~0xBF
+ 0x72, 0x38, 0x2d, 0x40, 0x10, 0x2c, 0x45, 0x80, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, 0x01, 0x1d, //0xC0~0xCF
+ 0x00, 0xbc, 0x52, 0xd0, 0x1e, 0x20, 0xb8, 0x28, 0x55, 0x40, 0x30, 0xeb, 0x52, 0x00, 0x00, 0x1e, //0xD0~0xDF
+ 0x01, 0x1d, 0x80, 0xd0, 0x72, 0x1c, 0x16, 0x20, 0x10, 0x2c, 0x25, 0x80, 0x30, 0xeb, 0x52, 0x00, //0xE0~0xEF
+ 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, //0xF0~0xFF
+};
+*/
+static unsigned char mVGAEdidDataBuf[CC_EDID_SIZE];
+void monitor_info_set_date ( unsigned char *edidbuf )
+{
+ char prop_value[PROPERTY_VALUE_MAX];
+ char tmp[4];
+ struct tm *p;
+ int week = 0;
+
+ memset ( prop_value, '\0', PROPERTY_VALUE_MAX );
+
+ property_get ( "ro.build.date.utc", prop_value, "VERSION_ERROR" );
+
+ time_t timep = atoi ( prop_value );
+
+ p = localtime ( &timep );
+
+ mktime ( p );
+
+ strftime ( prop_value, PROPERTY_VALUE_MAX, "%W.", p );
+
+ week = atoi ( prop_value );
+
+ edidbuf[16] = week;
+ edidbuf[17] = ( 1900 + p->tm_year ) - 1990;
+
+ LOGD ( "###############%s##############", "TV" );
+ LOGD ( "Week number is %d", week );
+ LOGD ( "%d %02d %02d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday );
+ LOGD ( "###############%s##############", "TV" );
+}
+
+
+void monitor_info_set_imagesize ( unsigned char *edidbuf )
+{
+ //panel size info for edid:
+ //39' : max_horizontal = 86; max_vertical = 48;
+ //42' : max_horizontal = 93; max_vertical = 52;
+ //47' : max_horizontal = 104; max_vertical = 60;
+ //50' : max_horizontal = 110; max_vertical = 62;
+ //55' : max_horizontal = 121; max_vertical = 71;
+ int max_horizontal = 104; //47'
+ int max_vertical = 60; //47'
+
+ edidbuf[21] = max_horizontal;
+ edidbuf[22] = max_vertical;
+
+ LOGD ( "imagesize max_horizontal %d max_vertical %d", max_horizontal, max_vertical );
+}
+
+
+
+void monitor_info_name_init ( unsigned char *edidbuf )
+{
+ int i = 0;
+
+ for ( i = 90; i < 108; i++ ) {
+ edidbuf[i] = 0;
+ }
+
+ edidbuf[93] = 252;
+}
+
+void monitor_info_set_name ( unsigned char *edidbuf )
+{
+ int i = 0;
+ int config_value_len;
+ const char *config_value;
+ unsigned char str_manufacturer_name[14];
+ config_value = config_get_str ( "TV", "tvin.hdmiedid.name", "null" );
+
+ if ( strcmp ( config_value, "null" ) != 0 ) {
+ config_value_len = strlen ( config_value );
+
+ if ( config_value_len < 13 ) {
+ for ( i = 0; i < config_value_len; ++i ) {
+ str_manufacturer_name[i] = config_value[i];
+ }
+
+ for ( i = config_value_len; i < 13; ++i ) {
+ str_manufacturer_name[i] = ' ';
+ }
+ } else {
+ for ( i = 0; i < 13; ++i ) {
+ str_manufacturer_name[i] = config_value[i];
+ }
+ }
+
+ }
+
+ for ( i = 0; i < 13; i++ ) {
+ edidbuf[95 + i] = str_manufacturer_name[i];
+ }
+}
+
+void monitor_info_edid_checksum ( unsigned char *edidbuf )
+{
+ int sum = 0, i = 0;
+
+ for ( i = 0; i < 127; i++ ) {
+ sum += edidbuf[i];
+ }
+
+ sum = ( 256 - ( sum % 256 ) ) % 256;
+ edidbuf[127] = sum;
+
+ LOGD ( "checksum is 0x%x,so testBuf[127] = 0x%x", sum, edidbuf[127] );
+}
+
+int reboot_sys_by_fbc_edid_info()
+{
+ int ret = -1;
+ int fd = -1;
+ int edid_info_len = 256;
+ unsigned char fbc_edid_info[edid_info_len];
+ int env_different_as_cur = 0;
+ char outputmode_prop_value[256];
+ char lcd_reverse_prop_value[256];
+
+ LOGD("get edid info from fbc!");
+ memset(outputmode_prop_value, '\0', 256);
+ memset(lcd_reverse_prop_value, '\0', 256);
+ property_get("ubootenv.var.outputmode", outputmode_prop_value, "null" );
+ property_get("ubootenv.var.lcd_reverse", lcd_reverse_prop_value, "null" );
+
+ fd = open("/sys/class/amhdmitx/amhdmitx0/edid_info", O_RDWR);
+ if (fd < 0) {
+ LOGW("open edid node error\n");
+ return -1;
+ }
+ ret = read(fd, fbc_edid_info, edid_info_len);
+ if (ret < 0) {
+ LOGW("read edid node error\n");
+ return -1;
+ }
+
+ if ((0xfb == fbc_edid_info[250]) && (0x0c == fbc_edid_info[251])) {
+ LOGD("RX is FBC!");
+ // set outputmode env
+ ret = 0;//is Fbc
+ switch (fbc_edid_info[252] & 0x0f) {
+ case 0x0:
+ if (0 != strcmp(outputmode_prop_value, "1080p") &&
+ 0 != strcmp(outputmode_prop_value, "1080p50hz")
+ ) {
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.outputmode", "1080p");
+ }
+ break;
+ case 0x1:
+ if (0 != strcmp(outputmode_prop_value, "4k2k60hz420") &&
+ 0 != strcmp(outputmode_prop_value, "4k2k50hz420")
+ ) {
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.outputmode", "4k2k60hz420");
+ }
+ break;
+ case 0x2:
+ if (0 != strcmp(outputmode_prop_value, "1366*768")) {
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.outputmode", "1366*768");
+ }
+ break;
+ default:
+ break;
+ }
+
+ // set RX 3D Info
+ //switch((fbc_edid_info[252]>>4)&0x0f)
+
+ // set lcd_reverse env
+ switch (fbc_edid_info[253]) {
+ case 0x0:
+ if (0 != strcmp(lcd_reverse_prop_value, "0")) {
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.lcd_reverse", "0");
+ }
+ break;
+ case 0x1:
+ if (0 != strcmp(lcd_reverse_prop_value, "1")) {
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.lcd_reverse", "1");
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ close(fd);
+ fd = -1;
+ //ret = -1;
+ if (1 == env_different_as_cur) {
+ LOGW("env change , reboot system\n");
+ system("reboot");
+ }
+ return ret;
+}
+
+int reboot_sys_by_fbc_uart_panel_info(CFbcCommunication *fbc)
+{
+ int ret = -1;
+ char outputmode_prop_value[256];
+ char lcd_reverse_prop_value[256];
+ int env_different_as_cur = 0;
+ int panel_reverse = -1;
+ int panel_outputmode = -1;
+
+
+ char panel_model[64] = {0};
+
+ if (fbc == NULL) {
+ LOGE("there is no fbc!!!\n");
+ return -1;
+ }
+
+ fbc->cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_SERIAL, panel_model);
+ if (0 == panel_model[0]) {
+ LOGD("device is not fbc\n");
+ return -1;
+ }
+ LOGD("device is fbc, get panel info from fbc!\n");
+ memset(outputmode_prop_value, '\0', 256);
+ memset(lcd_reverse_prop_value, '\0', 256);
+ property_get("ubootenv.var.outputmode", outputmode_prop_value, "null" );
+ property_get("ubootenv.var.lcd_reverse", lcd_reverse_prop_value, "null" );
+
+ fbc->cfbc_Get_FBC_PANEL_REVERSE(COMM_DEV_SERIAL, &panel_reverse);
+ fbc->cfbc_Get_FBC_PANEL_OUTPUT(COMM_DEV_SERIAL, &panel_outputmode);
+ LOGD("panel_reverse = %d, panel_outputmode = %d\n", panel_reverse, panel_outputmode);
+ LOGD("panel_output prop = %s, panel reverse prop = %s\n", outputmode_prop_value, lcd_reverse_prop_value);
+ switch (panel_outputmode) {
+ case 0x0:
+ if (0 != strcmp(outputmode_prop_value, "1080p") &&
+ 0 != strcmp(outputmode_prop_value, "1080p50hz")
+ ) {
+ LOGD("panel_output changed to 1080p\n");
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.outputmode", "1080p");
+ }
+ break;
+ case 0x1:
+ if (0 != strcmp(outputmode_prop_value, "4k2k60hz420") &&
+ 0 != strcmp(outputmode_prop_value, "4k2k50hz420")
+ ) {
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.outputmode", "4k2k60hz420");
+ }
+ break;
+ case 0x2:
+ if (0 != strcmp(outputmode_prop_value, "1366*768")) {
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.outputmode", "1366*768");
+ }
+ break;
+ default:
+ break;
+ }
+
+ // set RX 3D Info
+ //switch((fbc_edid_info[252]>>4)&0x0f)
+
+ // set lcd_reverse env
+ switch (panel_reverse) {
+ case 0x0:
+ if (0 != strcmp(lcd_reverse_prop_value, "0")) {
+ LOGD("panel_reverse changed to 0\n");
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.lcd_reverse", "0");
+ }
+ break;
+ case 0x1:
+ if (0 != strcmp(lcd_reverse_prop_value, "1")) {
+ if (0 == env_different_as_cur) {
+ env_different_as_cur = 1;
+ }
+ property_set("ubootenv.var.lcd_reverse", "1");
+ }
+ break;
+ default:
+ break;
+ }
+
+ ret = -1;
+ if (1 == env_different_as_cur) {
+ LOGW("env change , reboot system\n");
+ system("reboot");
+ }
+ return 0;
+}
+
+static pid_t pidof(const char *name)
+{
+ DIR *dir;
+ struct dirent *ent;
+ char *endptr;
+ char tmp_buf[512];
+
+ if (!(dir = opendir("/proc"))) {
+ LOGE("%s, can't open /proc", __FUNCTION__, strerror(errno));
+ return -1;
+ }
+
+ while ((ent = readdir(dir)) != NULL) {
+ /* if endptr is not a null character, the directory is not
+ * entirely numeric, so ignore it */
+ long lpid = strtol(ent->d_name, &endptr, 10);
+ if (*endptr != '\0') {
+ continue;
+ }
+
+ /* try to open the cmdline file */
+ snprintf(tmp_buf, sizeof(tmp_buf), "/proc/%ld/cmdline", lpid);
+ FILE *fp = fopen(tmp_buf, "r");
+
+ if (fp) {
+ if (fgets(tmp_buf, sizeof(tmp_buf), fp) != NULL) {
+ /* check the first token in the file, the program name */
+ char *first = strtok(tmp_buf, " ");
+ if (!strcmp(first, name)) {
+ fclose(fp);
+ closedir(dir);
+ return (pid_t) lpid;
+ }
+ }
+ fclose(fp);
+ }
+ }
+
+ closedir(dir);
+ return -1;
+}
+
+
+
+int GetPlatformHaveDDFlag()
+{
+ const char *config_value;
+
+ config_value = config_get_str("TV", "platform.havedd", "null");
+ if (strcmp(config_value, "true") == 0 || strcmp(config_value, "1") == 0) {
+ return 1;
+ }
+
+ return 0;
+}
+
+int GetPlatformProjectInfoSrc()
+{
+ const char *config_value;
+
+ config_value = config_get_str("TV", "platform.projectinfo.src", "null");
+ if (strcmp(config_value, "null") == 0 || strcmp(config_value, "prop") == 0) {
+ return 0;
+ } else if (strcmp(config_value, "emmckey") == 0) {
+ return 1;
+ } else if (strcmp(config_value, "fbc_ver") == 0) {
+ return 2;
+ }
+
+ return 0;
+}
+
+static unsigned int mCrc32Table[256];
+
+static void initCrc32Table()
+{
+ int i, j;
+ unsigned int Crc;
+ for (i = 0; i < 256; i++) {
+ Crc = i;
+ for (j = 0; j < 8; j++) {
+ if (Crc & 1)
+ Crc = (Crc >> 1) ^ 0xEDB88320;
+ else
+ Crc >>= 1;
+ }
+ mCrc32Table[i] = Crc;
+ }
+}
+
+unsigned int CalCRC32(unsigned int crc, const unsigned char *ptr, unsigned int buf_len)
+{
+ static const unsigned int s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
+ 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
+ };
+ unsigned int crcu32 = crc;
+ if (buf_len < 0)
+ return 0;
+ if (!ptr) return 0;
+ crcu32 = ~crcu32;
+ while (buf_len--) {
+ unsigned char b = *ptr++;
+ crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)];
+ crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)];
+ }
+ return ~crcu32;
+}
+
+#define CC_HEAD_CHKSUM_LEN (9)
+#define CC_VERSION_LEN (5)
+
+static int check_projectinfo_data_valid(char *data_str, int chksum_head_len, int ver_len)
+{
+ int tmp_len = 0, tmp_ver = 0;
+ char *endp = NULL;
+ unsigned long src_chksum = 0, cal_chksum = 0;
+ char tmp_buf[129] = { 0 };
+
+ if (data_str != NULL) {
+ tmp_len = strlen(data_str);
+ if (tmp_len > chksum_head_len + ver_len) {
+ cal_chksum = CalCRC32(0, (unsigned char *)(data_str + chksum_head_len), tmp_len - chksum_head_len);
+ memcpy(tmp_buf, data_str, chksum_head_len);
+ tmp_buf[chksum_head_len] = 0;
+ src_chksum = strtoul(tmp_buf, &endp, 16);
+ if (cal_chksum == src_chksum) {
+ memcpy(tmp_buf, data_str + chksum_head_len, ver_len);
+ if ((tmp_buf[0] == 'v' || tmp_buf[0] == 'V') && isxdigit(tmp_buf[1]) && isxdigit(tmp_buf[2]) && isxdigit(tmp_buf[3])) {
+ tmp_ver = strtoul(tmp_buf + 1, &endp, 16);
+ if (tmp_ver <= 0) {
+ LOGD("%s, project_info data version error!!!\n", __FUNCTION__);
+ return -1;
+ }
+ } else {
+ LOGD("%s, project_info data version error!!!\n", __FUNCTION__);
+ return -1;
+ }
+
+ return tmp_ver;
+ } else {
+ LOGD("%s, cal_chksum = %x\n", __FUNCTION__, (unsigned int)cal_chksum);
+ LOGD("%s, src_chksum = %x\n", __FUNCTION__, (unsigned int)src_chksum);
+ }
+ }
+
+ LOGD("%s, project_info data error!!!\n", __FUNCTION__);
+ return -1;
+ }
+
+ LOGD("%s, project_info data is NULL!!!\n", __FUNCTION__);
+ return -1;
+}
+
+static int gFBCPrjInfoRDPass = 0;
+static char gFBCPrjInfoBuf[1024] = {0};
+
+static int GetProjectInfoOriData(char data_str[], CFbcCommunication *fbcIns)
+{
+ int tmp_val = 0;
+ int src_type = GetPlatformProjectInfoSrc();
+
+ if (src_type == 0) {
+ memset(data_str, '\0', sizeof(data_str));
+ getBootEnv("ubootenv.var.project_info", data_str, "null");
+ if (strcmp(data_str, "null") == 0) {
+ LOGE("%s, get project info data error!!!\n", __FUNCTION__);
+ return -1;
+ }
+
+ return 0;
+ } else if (src_type == 1) {
+ return -1;
+ } else if (src_type == 2) {
+ int i = 0, tmp_len = 0, tmp_val = 0, item_cnt = 0;
+ int tmp_rd_fail_flag = 0;
+ unsigned int cal_chksum = 0;
+ char sw_version[64];
+ char build_time[64];
+ char git_version[64];
+ char git_branch[64];
+ char build_name[64];
+ char tmp_buf[512] = {0};
+
+ if (fbcIns != NULL) {
+ if (gFBCPrjInfoRDPass == 0) {
+ memset((void *)gFBCPrjInfoBuf, 0, sizeof(gFBCPrjInfoBuf));
+ }
+
+ if (gFBCPrjInfoRDPass == 1) {
+ strcpy(data_str, gFBCPrjInfoBuf);
+ LOGD("%s, rd once just return, data_str = %s\n", __FUNCTION__, data_str);
+ return 0;
+ }
+
+ if (fbcIns->cfbc_Get_FBC_MAINCODE_Version(COMM_DEV_SERIAL, sw_version, build_time, git_version, git_branch, build_name) == 0) {
+ if (sw_version[0] == '1' || sw_version[0] == '2') {
+ strcpy(build_name, "2");
+
+ strcpy(tmp_buf, "v001,fbc_");
+ strcat(tmp_buf, build_name);
+ strcat(tmp_buf, ",4k2k60hz420,no_rev,");
+ strcat(tmp_buf, "HV550QU2-305");
+ strcat(tmp_buf, ",8o8w,0,0");
+ cal_chksum = CalCRC32(0, (unsigned char *)tmp_buf, strlen(tmp_buf));
+ sprintf(data_str, "%08x,%s", cal_chksum, tmp_buf);
+ LOGD("%s, data_str = %s\n", __FUNCTION__, data_str);
+ } else {
+ tmp_val = 0;
+ if (fbcIns->cfbc_Get_FBC_project_id(COMM_DEV_SERIAL, &tmp_val) == 0) {
+ sprintf(build_name, "fbc_%d", tmp_val);
+ } else {
+ tmp_rd_fail_flag = 1;
+ strcpy(build_name, "fbc_0");
+ LOGD("%s, get project id from fbc error!!!\n", __FUNCTION__);
+ }
+
+ strcpy(tmp_buf, "v001,");
+ strcat(tmp_buf, build_name);
+ strcat(tmp_buf, ",4k2k60hz420,no_rev,");
+
+ memset(git_branch, 0, sizeof(git_branch));
+ if (fbcIns->cfbc_Get_FBC_Get_PANel_INFO(COMM_DEV_SERIAL, git_branch) == 0) {
+ strcat(tmp_buf, git_branch);
+ } else {
+ tmp_rd_fail_flag = 1;
+ strcat(tmp_buf, build_name);
+ LOGD("%s, get panel info from fbc error!!!\n", __FUNCTION__);
+ }
+
+ strcat(tmp_buf, ",8o8w,0,0");
+ cal_chksum = CalCRC32(0, (unsigned char *)tmp_buf, strlen(tmp_buf));
+ sprintf(data_str, "%08x,%s", cal_chksum, tmp_buf);
+ LOGD("%s, data_str = %s\n", __FUNCTION__, data_str);
+
+ if (tmp_rd_fail_flag == 0) {
+ gFBCPrjInfoRDPass = 1;
+ strcpy(gFBCPrjInfoBuf, data_str);
+ }
+ }
+
+ return 0;
+ }
+
+ return -1;
+ }
+ }
+
+ return -1;
+}
+
+static int handle_prj_info_by_ver(int ver, int item_ind, char *item_str, project_info_t *proj_info_ptr)
+{
+ if (ver == 1) {
+ if (item_ind == 0) {
+ strncpy(proj_info_ptr->version, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ } else if (item_ind == 1) {
+ strncpy(proj_info_ptr->panel_type, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ } else if (item_ind == 2) {
+ strncpy(proj_info_ptr->panel_outputmode, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ } else if (item_ind == 3) {
+ strncpy(proj_info_ptr->panel_rev, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ } else if (item_ind == 4) {
+ strncpy(proj_info_ptr->panel_name, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ } else if (item_ind == 5) {
+ strncpy(proj_info_ptr->amp_curve_name, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ }
+ } else {
+ if (item_ind == 0) {
+ strncpy(proj_info_ptr->version, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ } else if (item_ind == 1) {
+ strncpy(proj_info_ptr->panel_type, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ } else if (item_ind == 2) {
+ strncpy(proj_info_ptr->panel_name, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ } else if (item_ind == 3) {
+ strncpy(proj_info_ptr->panel_outputmode, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ } else if (item_ind == 4) {
+ strncpy(proj_info_ptr->panel_rev, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ }else if (item_ind == 5) {
+ strncpy(proj_info_ptr->amp_curve_name, item_str, CC_PROJECT_INFO_ITEM_MAX_LEN - 1);
+ }
+ }
+
+ return 0;
+}
+
+int GetProjectInfo(project_info_t *proj_info_ptr, CFbcCommunication *fbcIns)
+{
+ int i = 0, tmp_ret = 0, tmp_val = 0, tmp_len = 0;
+ int item_cnt = 0, handle_prj_info_data_flag = 0;
+ char *token = NULL;
+ const char *strDelimit = ",";
+ char tmp_buf[1024] = { 0 };
+ char data_str[1024] = { 0 };
+
+ if (GetProjectInfoOriData(data_str, fbcIns) < 0) {
+ return -1;
+ }
+
+ memset((void *)proj_info_ptr->version, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
+ memset((void *)proj_info_ptr->panel_type, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
+ memset((void *)proj_info_ptr->panel_outputmode, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
+ memset((void *)proj_info_ptr->panel_rev, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
+ memset((void *)proj_info_ptr->panel_name, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
+ memset((void *)proj_info_ptr->amp_curve_name, 0, CC_PROJECT_INFO_ITEM_MAX_LEN);
+
+ //check project info data is valid
+ handle_prj_info_data_flag = check_projectinfo_data_valid(data_str, CC_HEAD_CHKSUM_LEN, CC_VERSION_LEN);
+
+ //handle project info data
+ if (handle_prj_info_data_flag > 0) {
+ item_cnt = 0;
+ memset((void *)tmp_buf, 0, sizeof(tmp_buf));
+ strncpy(tmp_buf, data_str + CC_HEAD_CHKSUM_LEN, sizeof(tmp_buf) - 1);
+ token = strtok(tmp_buf, strDelimit);
+ while (token != NULL) {
+ handle_prj_info_by_ver(handle_prj_info_data_flag, item_cnt, token, proj_info_ptr);
+
+ token = strtok(NULL, strDelimit);
+ item_cnt += 1;
+ }
+
+ return 0;
+ }
+
+ return -1;
+}
+
+#if ANDROID_PLATFORM_SDK_VERSION == 19
+int getBootEnv(const char* key, char* value, char* def_val) {
+ return property_get(key, value, def_val);
+}
+
+void setBootEnv(const char* key, const char* value) {
+ return property_set(key, value);
+}
+#endif
+
+#if ANDROID_PLATFORM_SDK_VERSION >= 21
+
+#include <binder/IServiceManager.h>
+#include <utils/threads.h>
+#include <systemcontrol/ISystemControlService.h>
+
+class DeathNotifier: public IBinder::DeathRecipient {
+ public:
+ DeathNotifier() {
+ }
+
+ void binderDied(const wp<IBinder>& who) {
+ ALOGW("system_control died!");
+ }
+};
+
+static sp<ISystemControlService> amSystemControlService;
+static sp<DeathNotifier> amDeathNotifier;
+static Mutex amLock;
+
+static const sp<ISystemControlService>& getSystemControlService() {
+ Mutex::Autolock _l(amLock);
+ if (amSystemControlService.get() == 0) {
+ sp<IServiceManager> sm = defaultServiceManager();
+
+ sp<IBinder> binder;
+ do {
+ binder = sm->getService(String16("system_control"));
+ if (binder != 0)
+ break;
+ ALOGW("SystemControlService not published, waiting...");
+ usleep(500000); // 0.5 s
+ } while(true);
+ if (amDeathNotifier == NULL) {
+ amDeathNotifier = new DeathNotifier();
+ }
+ binder->linkToDeath(amDeathNotifier);
+ amSystemControlService = interface_cast<ISystemControlService>(binder);
+ }
+ ALOGE_IF(amSystemControlService==0, "no System Control Service!?");
+
+ return amSystemControlService;
+}
+
+int getBootEnv(const char* key, char* value, char* def_val) {
+ const sp<ISystemControlService>& sws = getSystemControlService();
+ if (sws != 0) {
+ String16 v;
+ if (sws->getBootEnv(String16(key), v)) {
+ strcpy(value, String8(v).string());
+ return 0;
+ }
+ }
+
+ strcpy(value, def_val);
+ return -1;
+}
+
+void setBootEnv(const char* key, const char* value) {
+ const sp<ISystemControlService>& sws = getSystemControlService();
+ if (sws != 0) {
+ sws->setBootEnv(String16(key), String16(value));
+ }
+}
+#endif
diff --git a/tvapi/libtv/tvutils/tvutils.h b/tvapi/libtv/tvutils/tvutils.h
index bf22f9e..a982e1b 100644
--- a/tvapi/libtv/tvutils/tvutils.h
+++ b/tvapi/libtv/tvutils/tvutils.h
@@ -1,119 +1,103 @@
-#ifndef __TV_MISC_H__
-#define __TV_MISC_H__
-
-#define CC_MIN_ADC_CHANNEL_VAL (0)
-#define CC_MAX_ADC_CHANNEL_VAL (5)
-
-#define CC_I2C_BUS_ON (0)
-#define CC_I2C_BUS_OFF (1)
-
-#define CPQDB_DB_SIZE_ID "tv.db.size.id"
-
-struct erase_info_user {
- uint32_t start;
- uint32_t length;
-};
-
-extern int *GetFileAttrIntValueStr(const char *fp);
-extern int ReadADCSpecialChannelValue(int adc_channel_num);
-extern int Tv_MiscRegs(const char *cmd);
-
-extern int TvMisc_SetUserCounterTimeOut(int timeout);
-extern int TvMisc_SetUserCounter(int count);
-extern int TvMisc_SetUserPetResetEnable(int enable);
-extern int TvMisc_SetSystemPetResetEnable(int enable);
-extern int TvMisc_SetSystemPetEnable(int enable);
-extern int TvMisc_SetSystemPetCounter(int count);
-extern void TvMisc_EnableWDT(bool kernelpet_disable, unsigned int userpet_enable, unsigned int kernelpet_timeout, unsigned int userpet_timeout, unsigned int userpet_reset);
-extern void TvMisc_DisableWDT(unsigned int userpet_enable);
-extern int I2C_WriteNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[]);
-extern int I2C_ReadNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[]);
-extern int GetTvDBDefineSize();
-extern int SetFileAttrValue(const char *fp, const char value[]);
-extern int GetFileAttrIntValue(const char *fp);
-
-extern int Get_Fixed_NonStandard(void);
-extern int Set_Fixed_NonStandard(int value);
-
-extern int get_hardware_name(char *hardware);
-
-extern int TvMisc_DeleteDirFiles(const char *strPath, int flag);
-
-extern int cfg_get_one_item(const char *key_str, const char *strDelimit, int item_index, char cfg_str[]);
-extern int Tv_Utils_CheckFs(void);
-extern int Tv_Utils_SetFileAttrStr(const char *file_path, char val_str_buf[]);
-extern int Tv_Utils_GetFileAttrStr(const char *file_path, int buf_size, char val_str_buf[]);
-extern int Tv_Utils_IsFileExist(const char *file_name);
-extern void monitor_info_name_init ( unsigned char *edidbuf );
-extern void monitor_info_set_name ( unsigned char *edidbuf );
-extern void monitor_info_set_imagesize ( unsigned char *edidbuf );
-extern void monitor_info_edid_checksum ( unsigned char *edidbuf );
-extern int reboot_sys_by_fbc_edid_info();
-extern int reboot_sys_by_fbc_uart_panel_info();
-extern int GetPlatformHaveFBCFlag();
-extern int GetPlatformHaveDDFlag();
-
-#define CC_PROJECT_INFO_ITEM_MAX_LEN (64)
-
-typedef struct project_info_s {
- char version[CC_PROJECT_INFO_ITEM_MAX_LEN];
- char panel_type[CC_PROJECT_INFO_ITEM_MAX_LEN];
- char panel_outputmode[CC_PROJECT_INFO_ITEM_MAX_LEN];
- char panel_rev[CC_PROJECT_INFO_ITEM_MAX_LEN];
- char panel_name[CC_PROJECT_INFO_ITEM_MAX_LEN];
- char amp_curve_name[CC_PROJECT_INFO_ITEM_MAX_LEN];
-} project_info_t;
-
-extern unsigned int CalCRC32(unsigned int crc, const unsigned char *ptr, unsigned int buf_len);
-extern int GetProjectInfo(project_info_t *proj_info_ptr);
-
-//extern void SSMRewriteEdidInfo ( unsigned char *edidbuf );
-//extern int HandleEdid ( int op_type, int op_direct, unsigned char edid_buf[], unsigned char def_buf[] );
-//extern int SSMSetHdmiEdid();
-#define AML_DBG_REGS_IOC_MAGIC 'R'
-
-typedef struct aml_debug_reg_s {
- unsigned int addr;
- unsigned int val;
- unsigned char mode;
-} aml_debug_reg_t;
-
-typedef struct aml_debug_bit_s {
- unsigned int addr;
- unsigned int val;
- unsigned int start;
- unsigned int len;
-} aml_debug_bit_t;
-
-/*ioctl for reg*/
-#define AMLDBG_IOC_CBUS_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x01, struct aml_debug_reg_s)
-#define AMLDBG_IOC_CBUS_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x02, struct aml_debug_reg_s)
-#define AMLDBG_IOC_APB_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x03, struct aml_debug_reg_s)
-#define AMLDBG_IOC_APB_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x04, struct aml_debug_reg_s)
-#define AMLDBG_IOC_AXI_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x05, struct aml_debug_reg_s)
-#define AMLDBG_IOC_AXI_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x06, struct aml_debug_reg_s)
-#define AMLDBG_IOC_AHB_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x07, struct aml_debug_reg_s)
-#define AMLDBG_IOC_AHB_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x08, struct aml_debug_reg_s)
-#define AMLDBG_IOC_MPEG_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x09, struct aml_debug_reg_s)
-#define AMLDBG_IOC_MPEG_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x0a, struct aml_debug_reg_s)
-
-/*ioctl for bit*/
-#define AMLDBG_IOC_CBUS_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x21, aml_debug_bit_t)
-#define AMLDBG_IOC_CBUS_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x22, aml_debug_bit_t)
-#define AMLDBG_IOC_APB_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x23, aml_debug_bit_t)
-#define AMLDBG_IOC_APB_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x24, aml_debug_bit_t)
-#define AMLDBG_IOC_AXI_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x25, aml_debug_bit_t)
-#define AMLDBG_IOC_AXI_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x26, aml_debug_bit_t)
-#define AMLDBG_IOC_AHB_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x27, aml_debug_bit_t)
-#define AMLDBG_IOC_AHB_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x28, aml_debug_bit_t)
-#define AMLDBG_IOC_MPEG_BIT_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x29, aml_debug_bit_t)
-#define AMLDBG_IOC_MPEG_BIT_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x30, aml_debug_bit_t)
-
-/*ioctl for gamma*/
-#define AMLDBG_IOC_SGR_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0X15, int)
-#define AMLDBG_IOC_SGG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0X16, int)
-#define AMLDBG_IOC_SGB_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0X17, int)
-
-#define AMLDBG_IOC_AAPB_REG_RD _IOR(AML_DBG_REGS_IOC_MAGIC, 0x18, struct aml_debug_reg_s)
-#define AMLDBG_IOC_AAPB_REG_WR _IOW(AML_DBG_REGS_IOC_MAGIC, 0x19, struct aml_debug_reg_s)
-#endif //__TV_MISC_H__
+#ifndef __TV_MISC_H__
+#define __TV_MISC_H__
+
+#include "../tv/CFbcCommunication.h"
+#define CC_MIN_ADC_CHANNEL_VAL (0)
+#define CC_MAX_ADC_CHANNEL_VAL (5)
+
+#define CC_I2C_BUS_ON (0)
+#define CC_I2C_BUS_OFF (1)
+
+#define CPQDB_DB_SIZE_ID "tv.db.size.id"
+
+struct erase_info_user {
+ uint32_t start;
+ uint32_t length;
+};
+
+extern int *GetFileAttrIntValueStr(const char *fp);
+extern int ReadADCSpecialChannelValue(int adc_channel_num);
+extern int Tv_MiscRegs(const char *cmd);
+
+extern int TvMisc_SetLVDSSSC(int val);
+extern int TvMisc_SetUserCounterTimeOut(int timeout);
+extern int TvMisc_SetUserCounter(int count);
+extern int TvMisc_SetUserPetResetEnable(int enable);
+extern int TvMisc_SetSystemPetResetEnable(int enable);
+extern int TvMisc_SetSystemPetEnable(int enable);
+extern int TvMisc_SetSystemPetCounter(int count);
+extern void TvMisc_EnableWDT(bool kernelpet_disable, unsigned int userpet_enable, unsigned int kernelpet_timeout, unsigned int userpet_timeout, unsigned int userpet_reset);
+extern void TvMisc_DisableWDT(unsigned int userpet_enable);
+extern int I2C_WriteNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[]);
+extern int I2C_ReadNbyte(int i2c_no, int dev_addr, int slave_addr, int len, unsigned char data_buf[]);
+extern int GetTvDBDefineSize();
+extern int SetFileAttrValue(const char *fp, const char value[]);
+extern int GetFileAttrIntValue(const char *fp);
+
+extern int Get_Fixed_NonStandard(void);
+extern int Set_Fixed_NonStandard(int value);
+
+extern int get_hardware_name(char *hardware);
+
+extern int TvMisc_DeleteDirFiles(const char *strPath, int flag);
+
+extern int cfg_get_one_item(const char *key_str, const char *strDelimit, int item_index, char cfg_str[]);
+extern int Tv_Utils_CheckFs(void);
+extern int Tv_Utils_SetFileAttrStr(const char *file_path, char val_str_buf[]);
+extern int Tv_Utils_GetFileAttrStr(const char *file_path, int buf_size, char val_str_buf[]);
+extern int Tv_Utils_IsFileExist(const char *file_name);
+extern void monitor_info_name_init ( unsigned char *edidbuf );
+extern void monitor_info_set_name ( unsigned char *edidbuf );
+extern void monitor_info_set_imagesize ( unsigned char *edidbuf );
+extern void monitor_info_edid_checksum ( unsigned char *edidbuf );
+extern int reboot_sys_by_fbc_edid_info();
+extern int reboot_sys_by_fbc_uart_panel_info(CFbcCommunication *fbc = NULL);
+extern int GetPlatformHaveDDFlag();
+
+#define CC_PROJECT_INFO_ITEM_MAX_LEN (64)
+
+typedef struct project_info_s {
+ char version[CC_PROJECT_INFO_ITEM_MAX_LEN];
+ char panel_type[CC_PROJECT_INFO_ITEM_MAX_LEN];
+ char panel_outputmode[CC_PROJECT_INFO_ITEM_MAX_LEN];
+ char panel_rev[CC_PROJECT_INFO_ITEM_MAX_LEN];
+ char panel_name[CC_PROJECT_INFO_ITEM_MAX_LEN];
+ char amp_curve_name[CC_PROJECT_INFO_ITEM_MAX_LEN];
+} project_info_t;
+
+extern unsigned int CalCRC32(unsigned int crc, const unsigned char *ptr, unsigned int buf_len);
+extern int GetProjectInfo(project_info_t *proj_info_ptr, CFbcCommunication *fbcIns = NULL);
+extern int getBootEnv(const char* key, char* value, char* def_val);
+extern void setBootEnv(const char* key, const char* value);
+
+//extern void SSMRewriteEdidInfo ( unsigned char *edidbuf );
+//extern int HandleEdid ( int op_type, int op_direct, unsigned char edid_buf[], unsigned char def_buf[] );
+//extern int SSMSetHdmiEdid();
+#define AML_DBG_REGS_IOC_MAGIC 'R'
+
+typedef struct aml_debug_reg_s {
+ unsigned int addr;
+ unsigned int val;
+ unsigned char mode;
+} aml_debug_reg_t;
+
+typedef struct aml_debug_bit_s {
+ unsigned int addr;
+ unsigned int val;
+ unsigned int start;
+ unsigned int len;
+} aml_debug_bit_t;
+
+template<typename T1, typename T2>
+int ArrayCopy(T1 dst_buf[], T2 src_buf[], int copy_size)
+{
+ int i = 0;
+
+ for (i = 0; i < copy_size; i++) {
+ dst_buf[i] = src_buf[i];
+ }
+
+ return 0;
+};
+
+#endif //__TV_MISC_H__
diff --git a/tvapi/libtv/tvutils/zepoll.cpp b/tvapi/libtv/tvutils/zepoll.cpp
index 873a2dd..3cba8a6 100644
--- a/tvapi/libtv/tvutils/zepoll.cpp
+++ b/tvapi/libtv/tvutils/zepoll.cpp
@@ -3,7 +3,7 @@
Epoll::Epoll(int _max, int maxevents): max(_max),
epoll_fd(-1),
- epoll_timeout(0),
+ epoll_timeout(-1),
epoll_maxevents(maxevents),
backEvents(0)
{
diff --git a/tvapi/libtv/version/version.cpp b/tvapi/libtv/version/version.cpp
index 9a48bbd..c0d3358 100644
--- a/tvapi/libtv/version/version.cpp
+++ b/tvapi/libtv/version/version.cpp
@@ -1,94 +1,94 @@
-#include <stdio.h>
-#include <string.h>
-#include <android/log.h>
-
-#include "version.h"
-
-static char gitversionstr[256] = "N/A";
-
-static int tvservice_version_info_init(void)
-{
- static int info_is_inited = 0;
- int dirty_num = 0;
-
- if (info_is_inited > 0) {
- return 0;
- }
- info_is_inited++;
-
-#ifdef HAVE_VERSION_INFO
-
-#ifdef LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM
-#if LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM>0
- dirty_num = LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM;
-#endif
-#endif
-
-#ifdef LIBTVSERVICE_GIT_VERSION
- if (dirty_num > 0) {
- snprintf(gitversionstr, 250, "%s-with-%d-dirty-files", LIBTVSERVICE_GIT_VERSION, dirty_num);
- } else {
- snprintf(gitversionstr, 250, "%s", LIBTVSERVICE_GIT_VERSION);
- }
-#endif
-
-#endif
-
- return 0;
-}
-
-const char *tvservice_get_git_version_info(void)
-{
- tvservice_version_info_init();
- return gitversionstr;
-}
-
-const char *tvservice_get_last_chaned_time_info(void)
-{
-#ifdef HAVE_VERSION_INFO
-#ifdef LIBTVSERVICE_LAST_CHANGED
- return LIBTVSERVICE_LAST_CHANGED;
-#endif
-#endif
- return " Unknow ";
-}
-
-const char *tvservice_get_git_branch_info(void)
-{
-#ifdef HAVE_VERSION_INFO
-#ifdef LIBTVSERVICE_GIT_BRANCH
- return LIBTVSERVICE_GIT_BRANCH;
-#endif
-#endif
- return " Unknow ";
-}
-
-const char *tvservice_get_build_time_info(void)
-{
-#ifdef HAVE_VERSION_INFO
-#ifdef LIBTVSERVICE_BUILD_TIME
- return LIBTVSERVICE_BUILD_TIME;
-#endif
-#endif
- return " Unknow ";
-}
-
-const char *tvservice_get_build_name_info(void)
-{
-#ifdef HAVE_VERSION_INFO
-#ifdef LIBTVSERVICE_BUILD_NAME
- return LIBTVSERVICE_BUILD_NAME;
-#endif
-#endif
- return " Unknow ";
-}
-
-const char *tvservice_get_board_version_info(void)
-{
-#ifdef HAVE_VERSION_INFO
-#ifdef TVAPI_BOARD_VERSION
- return TVAPI_BOARD_VERSION;
-#endif
-#endif
- return " Unknow ";
-}
+#include <stdio.h>
+#include <string.h>
+#include <android/log.h>
+
+#include "version.h"
+
+static char gitversionstr[256] = "N/A";
+
+static int tvservice_version_info_init(void)
+{
+ static int info_is_inited = 0;
+ int dirty_num = 0;
+
+ if (info_is_inited > 0) {
+ return 0;
+ }
+ info_is_inited++;
+
+#ifdef HAVE_VERSION_INFO
+
+#ifdef LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM
+#if LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM>0
+ dirty_num = LIBTVSERVICE_GIT_UNCOMMIT_FILE_NUM;
+#endif
+#endif
+
+#ifdef LIBTVSERVICE_GIT_VERSION
+ if (dirty_num > 0) {
+ snprintf(gitversionstr, 250, "%s-with-%d-dirty-files", LIBTVSERVICE_GIT_VERSION, dirty_num);
+ } else {
+ snprintf(gitversionstr, 250, "%s", LIBTVSERVICE_GIT_VERSION);
+ }
+#endif
+
+#endif
+
+ return 0;
+}
+
+const char *tvservice_get_git_version_info(void)
+{
+ tvservice_version_info_init();
+ return gitversionstr;
+}
+
+const char *tvservice_get_last_chaned_time_info(void)
+{
+#ifdef HAVE_VERSION_INFO
+#ifdef LIBTVSERVICE_LAST_CHANGED
+ return LIBTVSERVICE_LAST_CHANGED;
+#endif
+#endif
+ return " Unknow ";
+}
+
+const char *tvservice_get_git_branch_info(void)
+{
+#ifdef HAVE_VERSION_INFO
+#ifdef LIBTVSERVICE_GIT_BRANCH
+ return LIBTVSERVICE_GIT_BRANCH;
+#endif
+#endif
+ return " Unknow ";
+}
+
+const char *tvservice_get_build_time_info(void)
+{
+#ifdef HAVE_VERSION_INFO
+#ifdef LIBTVSERVICE_BUILD_TIME
+ return LIBTVSERVICE_BUILD_TIME;
+#endif
+#endif
+ return " Unknow ";
+}
+
+const char *tvservice_get_build_name_info(void)
+{
+#ifdef HAVE_VERSION_INFO
+#ifdef LIBTVSERVICE_BUILD_NAME
+ return LIBTVSERVICE_BUILD_NAME;
+#endif
+#endif
+ return " Unknow ";
+}
+
+const char *tvservice_get_board_version_info(void)
+{
+#ifdef HAVE_VERSION_INFO
+#ifdef TVAPI_BOARD_VERSION
+ return TVAPI_BOARD_VERSION;
+#endif
+#endif
+ return " Unknow ";
+}
diff --git a/tvapi/libtv/version/version.h b/tvapi/libtv/version/version.h
index d09082d..e3259cb 100644
--- a/tvapi/libtv/version/version.h
+++ b/tvapi/libtv/version/version.h
@@ -1,11 +1,11 @@
-#ifndef __LIBTVSERVICE_VERSION_H__
-#define __LIBTVSERVICE_VERSION_H__
-
-extern const char *tvservice_get_git_version_info(void);
-extern const char *tvservice_get_last_chaned_time_info(void);
-extern const char *tvservice_get_git_branch_info(void);
-extern const char *tvservice_get_build_time_info(void);
-extern const char *tvservice_get_build_name_info(void);
-extern const char *tvservice_get_board_version_info(void);
-
-#endif //__LIBTVSERVICE_VERSION_H__
+#ifndef __LIBTVSERVICE_VERSION_H__
+#define __LIBTVSERVICE_VERSION_H__
+
+extern const char *tvservice_get_git_version_info(void);
+extern const char *tvservice_get_last_chaned_time_info(void);
+extern const char *tvservice_get_git_branch_info(void);
+extern const char *tvservice_get_build_time_info(void);
+extern const char *tvservice_get_build_name_info(void);
+extern const char *tvservice_get_board_version_info(void);
+
+#endif //__LIBTVSERVICE_VERSION_H__
diff --git a/tvapi/libtv/vpp/CPQdb.cpp b/tvapi/libtv/vpp/CPQdb.cpp
index 83d1bc1..4f11e7f 100644
--- a/tvapi/libtv/vpp/CPQdb.cpp
+++ b/tvapi/libtv/vpp/CPQdb.cpp
@@ -1,1648 +1,1861 @@
-/*
- * CPQdb.cpp
- *
- * Created on: 2011-12-13
- * Author: casey
- *
- * change 2015.04
- * showbo
- */
-
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include "CPQdb.h"
-#include "../tvutils/tvutils.h"
-#include "../tvutils/tvutils.h"
-
-#if (PQ_NO_ANDROID == 0)
-#include <android/log.h>
-
-#define LOG_TAG "CPQdb"
-#include "CTvLog.h"
-#endif
-
-
-#if (PQ_NO_ANDROID == 1)
-using namespace std;
-#endif
-
-//#define CPQDB_DEBUG
-
-#define BRIGHTNESS_ID 0
-#define CONTRAST_ID 1
-#define SATURATION_ID 1
-#define HUE_ID 0
-#define SHARPNESS_ID 1
-
-//static char *str_buf[256];
-
-#define ID_FIELD "TableID"
-#define NR_LEVEL_NAME "NRLevel"
-#define CM_LEVEL_NAME "CMLevel"
-#define LEVEL_NAME "Level"
-#define ADC_SETTING "ADC_Settings"
-#define CVD2_SETTING "CVD2_Settings"
-#define PORT "Port"
-#define FORMAT "Format"
-
-
-#define CC_LINE_MAX_LEN (1024)
-
-#define LOG_TAG "CPQdb"
-//#define CPQDB_DEBUG
-
-
-/*int get_pq_from_file(const char *file_name, const char *screen_size, char *key_str_buf[]) {
- FILE *fp = NULL;
- int flag = -1;
- char *str = NULL;
- char r_line_buf[CC_LINE_MAX_LEN];
-
- if (file_name == NULL || screen_size == NULL || key_str_buf == NULL) {
- return -1;
- }
-
- fp = fopen(file_name, "r");
- if (fp == NULL) {
- LOGE("%s: open file \"%s\" error(%s).\n", "TV", file_name, strerror(errno));
- return -1;
- }
-
- while (fgets(r_line_buf, CC_LINE_MAX_LEN, fp)) {
- LOGD("%s, fgets_buf = %s\n","TV", r_line_buf);
- if(NULL != strstr(r_line_buf, screen_size)){
- LOGD("%s, screen_size_buf = %s\n","TV", r_line_buf);
- str = (char*)malloc(strlen(r_line_buf));
- memset(str, 0, strlen(str));
- if(NULL != str){
- strcpy(str, r_line_buf);
- key_str_buf[0] = str;
- LOGD("%s, key_str_buf[0] = %s\n","TV", key_str_buf[0]);
- }
- flag = 0;
- break;
- }
- }
-
- if(flag != 0)
- key_str_buf[0] = NULL;
-
- fclose(fp);
- fp = NULL;
-
- return flag;
-}*/
-
-/*int getFileSizeSystemCall(char * strFileName)
-{
- struct stat temp;
- stat(strFileName, &temp);
- return temp.st_size;
-}*/
-
-CPqData::CPqData()
-{
- int i = 0, j = 0;
-
- for (i = 0; i < 15; i++) {
- pq_bri_data[i].TotalNode = 0;
- pq_bri_data[i].NodeValue = 0;
- pq_bri_data[i].IndexValue = 0;
- pq_bri_data[i].RegValue = 0;
- pq_bri_data[i].step = 0;
-
- pq_con_data[i].TotalNode = 0;
- pq_con_data[i].NodeValue = 0;
- pq_con_data[i].IndexValue = 0;
- pq_con_data[i].RegValue = 0;
- pq_con_data[i].step = 0;
-
- pq_sat_data[i].TotalNode = 0;
- pq_sat_data[i].NodeValue = 0;
- pq_sat_data[i].IndexValue = 0;
- pq_sat_data[i].RegValue = 0;
- pq_sat_data[i].step = 0;
-
- pq_hue_data[i].TotalNode = 0;
- pq_hue_data[i].NodeValue = 0;
- pq_hue_data[i].IndexValue = 0;
- pq_hue_data[i].RegValue = 0;
- pq_hue_data[i].step = 0;
- }
-
- for (i = 0; i < 10; i++) {
- pq_sharpness_reg_data[i].length = 0;
- for (j = 0; j < 50; j++) {
- pq_sharpness_reg_data[i].reg_data[j].TotalNode = 0;
- pq_sharpness_reg_data[i].reg_data[j].Value.type = 0;
- pq_sharpness_reg_data[i].reg_data[j].Value.addr = 0;
- pq_sharpness_reg_data[i].reg_data[j].Value.mask = 0;
- pq_sharpness_reg_data[i].reg_data[j].Value.val = 0;
- pq_sharpness_reg_data[i].reg_data[j].NodeValue = 0;
- pq_sharpness_reg_data[i].reg_data[j].IndexValue = 0;
- pq_sharpness_reg_data[i].reg_data[j].step = 0;
- }
- }
-}
-
-CPqData::~CPqData()
-{
-}
-
-int CPqData::openDB()
-{
- int rval;
- project_info_t tmp_info;
- char *PARAM_PQ = "/param/pq.db";
- char SYSTEM_PQ[128] = {0};
- char tmp_buf[128] = {0};
-
- strcpy(SYSTEM_PQ, "/system/etc/pq.db");
-
- if (GetProjectInfo(&tmp_info) == 0) {
- strcpy(tmp_buf, "/system/etc/");
- strcat(tmp_buf, tmp_info.panel_type);
- strcat(tmp_buf, ".db");
- if (access(tmp_buf, 0) == 0) {
- strncpy(SYSTEM_PQ, tmp_buf, sizeof(SYSTEM_PQ) - 1);
- }
- }
-
- if (access(PARAM_PQ, 0) < 0) {
- CFile file(SYSTEM_PQ);
- if (file.copyTo(PARAM_PQ) != 0) {
- LOGE("%s, copy file \"%s\" to \"%s\" error", __FUNCTION__, SYSTEM_PQ, PARAM_PQ);
- return -1;
- } else {
- LOGD("%s, copy file \"%s\" to \"%s\" ok", __FUNCTION__, SYSTEM_PQ, PARAM_PQ);
- }
- }
-
- closeDb();
- rval = openDb(PARAM_PQ);
-
- char *err;
- bool isOk = integrityCheck();
- if(!isOk) {
- CFile file ( SYSTEM_PQ );
- if ( file.copyTo ( PARAM_PQ ) != 0 ) {
- LOGE ( "%s, copy file = %s , error", __FUNCTION__, SYSTEM_PQ );
- return -1;
- } else {
- closeDb();
- rval = openDb(PARAM_PQ);
- LOGD ( "%s, copy file = %s , ok", __FUNCTION__, SYSTEM_PQ );
- }
- }
- return rval;
-}
-
-int CPqData::getRegValues(tvin_port_t source, tvin_sig_fmt_t signal, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs)
-{
- CSqlite::Cursor c_tablelist, c_reg_list;
- int iOutRet = 0;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- //first get table name
- sprintf(sqlmaster, "select TableName from GeneralCommonTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d ;",
- source, signal, mode);
- this->select(sqlmaster, c_tablelist);
- int index_am_reg = 0;
- if(c_tablelist.moveToFirst()) { //for table list
- int index_tablename = c_tablelist.getColumnIndex("TableName");
- do {
- sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s;", c_tablelist.getString(index_tablename).string());
- this->select(sqlmaster, c_reg_list);
- if(c_reg_list.moveToFirst()) { //reg list for each table
- int index_type = 0;//c_reg_list.getColumnIndex("RegType");
- int index_addr = 1;//c_reg_list.getColumnIndex("RegAddr");
- int index_mask = 2;//c_reg_list.getColumnIndex("RegMask");
- int index_val = 3;//c_reg_list.getColumnIndex("RegValue");
- do {
- regs->am_reg[index_am_reg].type = c_reg_list.getInt(index_type);
- regs->am_reg[index_am_reg].addr = c_reg_list.getInt(index_addr);
- regs->am_reg[index_am_reg].mask = c_reg_list.getInt(index_mask);
- regs->am_reg[index_am_reg].val = c_reg_list.getInt(index_val);
- index_am_reg++;
- } while(c_reg_list.moveToNext());
- }
- } while(c_tablelist.moveToNext());
- }
- //
- regs->length = index_am_reg;
- LOGD("getRegValues length = %d", regs->length);
- return index_am_reg;
-}
-
-int CPqData::getRegValuesByValue(const char *name, const char *f_name, const char *f2_name, const int val,
- const int val2, am_regs_t *regs)
-{
- CSqlite::Cursor c_reg_list;
- char sqlmaster[256];
- int rval = -1;
- //first get table name
- if((strlen(f2_name) == 0) && (val2 == 0))
- sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d;", name, f_name, val);
- else
- sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d and %s = %d;", name, f_name, val,
- f2_name, val2);
-
- rval = this->select(sqlmaster, c_reg_list);
- int count = c_reg_list.getCount();
- if(count > 512) {
- LOGD("getRegValuesByValue regs is too more, in pq.db count = %d", count);
- return -1;
- }
- int index_am_reg = 0;
- if(c_reg_list.moveToFirst()) { //reg list for each table
- int index_type = 0;//c_reg_list.getColumnIndex("RegType");
- int index_addr = 1;//c_reg_list.getColumnIndex("RegAddr");
- int index_mask = 2;//c_reg_list.getColumnIndex("RegMask");
- int index_val = 3;//c_reg_list.getColumnIndex("RegValue");
- do {
- regs->am_reg[index_am_reg].type = c_reg_list.getInt(index_type);
- regs->am_reg[index_am_reg].addr = c_reg_list.getInt(index_addr);
- regs->am_reg[index_am_reg].mask = c_reg_list.getInt(index_mask);
- regs->am_reg[index_am_reg].val = c_reg_list.getInt(index_val);
- index_am_reg++;
- } while(c_reg_list.moveToNext());
- } else rval = -1;
- //
- regs->length = index_am_reg;
- LOGD("getRegValuesByValue length = %d", regs->length);
- return rval;
-}
-
-int CPqData::getRegValuesByValue_long(const char *name, const char *f_name, const char *f2_name, const int val, const int val2, am_regs_t *regs, am_regs_t *regs_1)
-{
- CSqlite::Cursor c_reg_list;
- char sqlmaster[256];
- int rval = -1;
- //first get table name
- if((strlen(f2_name) == 0) && (val2 == 0))
- sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d;", name, f_name, val);
- else
- sprintf(sqlmaster, "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d and %s = %d;", name, f_name, val,
- f2_name, val2);
-
- rval = this->select(sqlmaster, c_reg_list);
-
- int index_am_reg = 0;
- int count = c_reg_list.getCount();
- if(count > 1024) {
- LOGD("getRegValuesByValue_long regs is too more, in pq.db count = %d", count);
- return -1;
- }
- if(c_reg_list.moveToFirst()) { //reg list for each table
- int index_type = 0;//c_reg_list.getColumnIndex("RegType");
- int index_addr = 1;//c_reg_list.getColumnIndex("RegAddr");
- int index_mask = 2;//c_reg_list.getColumnIndex("RegMask");
- int index_val = 3;//c_reg_list.getColumnIndex("RegValue");
- do {
- if(index_am_reg < 512) {
- regs->am_reg[index_am_reg].type = c_reg_list.getInt(index_type);
- regs->am_reg[index_am_reg].addr = c_reg_list.getInt(index_addr);
- regs->am_reg[index_am_reg].mask = c_reg_list.getInt(index_mask);
- regs->am_reg[index_am_reg].val = c_reg_list.getInt(index_val);
- } else if(index_am_reg >= 512 && index_am_reg < 1024) {
- regs_1->am_reg[index_am_reg - 512].type = c_reg_list.getInt(index_type);
- regs_1->am_reg[index_am_reg - 512].addr = c_reg_list.getInt(index_addr);
- regs_1->am_reg[index_am_reg - 512].mask = c_reg_list.getInt(index_mask);
- regs_1->am_reg[index_am_reg - 512].val = c_reg_list.getInt(index_val);
- } else {
- }
- index_am_reg++;
- } while(c_reg_list.moveToNext());
- } else rval = -1;
- //
- if(count < 512) {
- regs->length = index_am_reg;
- } else if(index_am_reg >= 512 && index_am_reg < 1024) {
- regs->length = 512;
- regs_1->length = index_am_reg - 512;
- }
- LOGD("getRegValuesByValue length = %d", index_am_reg);
- return rval;
-}
-int CPqData::PQ_GetBaseColorParams(vpp_color_basemode_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- int rval = -1;
- sprintf(sqlmaster, "select TableName from GeneralColormanagementTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d ;",
- source_port, sig_fmt, mode);
-
- this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- rval = getRegValuesByValue(c.getString(index_TableName), CM_LEVEL_NAME, "", (int)basemode, 0, regs);
- }
- return rval;
-}
-
-int CPqData::PQ_GetCM2Params(vpp_color_management2_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- int rval = -1;
- if(source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) {
- if(source_port != TVIN_PORT_CVBS3) {
- source_port = TVIN_PORT_CVBS1;
- }
- } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) {
- source_port = TVIN_PORT_HDMI0;
- } else if(source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) {
- source_port = TVIN_PORT_MPEG0;
- }
-
- if(sig_fmt >= TVIN_SIG_FMT_MAX) {
- sig_fmt = TVIN_SIG_FMT_NULL;
- }
-
- sprintf(sqlmaster, "select TableName from GeneralCM2Table where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d ;",
- source_port, sig_fmt, mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- rval = getRegValuesByValue(c.getString(index_TableName), CM_LEVEL_NAME, "", (int)basemode, 0, regs);
- }
- return rval;
-}
-
-int CPqData::PQ_GetNR2Params(vpp_noise_reduction2_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- int rval = -1;
-
- if(source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) {
- if(source_port != TVIN_PORT_CVBS3) {
- source_port = TVIN_PORT_CVBS1;
- }
- } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) {
- source_port = TVIN_PORT_HDMI0;
- } else if(source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) {
- source_port = TVIN_PORT_MPEG0;
- }
-
- sprintf(sqlmaster, "select TableName from GeneralNR2Table where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d ;",
- source_port, sig_fmt, mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- rval = getRegValuesByValue(c.getString(index_TableName), LEVEL_NAME, "", (int)nr_mode, 0, regs);
- }
- return rval;
-}
-
-int CPqData::PQ_GetXVYCCParams(vpp_xvycc_mode_t xvycc_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs, am_regs_t *regs_1)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- int rval = -1;
-
- if(source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) {
- if(source_port != TVIN_PORT_CVBS3) {
- source_port = TVIN_PORT_CVBS1;
- }
- } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) {
- source_port = TVIN_PORT_HDMI0;
- } else if(source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) {
- source_port = TVIN_PORT_MPEG0;
- }
-
- sprintf(sqlmaster, "select TableName from GeneralXVYCCTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d ;",
- source_port, sig_fmt, mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- rval = getRegValuesByValue_long(c.getString(index_TableName), LEVEL_NAME, "", (int)xvycc_mode, 0, regs, regs_1);
- }
- return rval;
-}
-
-int CPqData::PQ_GetMCDIParams(vpp_mcdi_mode_t mcdi_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- int rval = -1;
-
- if(source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) {
- if(source_port != TVIN_PORT_CVBS3) {
- source_port = TVIN_PORT_CVBS1;
- }
- } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) {
- source_port = TVIN_PORT_HDMI0;
- } else if(source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) {
- source_port = TVIN_PORT_MPEG0;
- }
-
- sprintf(sqlmaster, "select TableName from GeneralMCDITable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d ;",
- source_port, sig_fmt, mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- rval = getRegValuesByValue(c.getString(index_TableName), LEVEL_NAME, "", (int)mcdi_mode, 0, regs);
- }
- return rval;
-}
-
-int CPqData::PQ_GetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt,
- tcon_rgb_ogo_t *params)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
-
- int rval = -1;
-
- //default
- params->en = 1;
- params->r_pre_offset = 0;
- params->g_pre_offset = 0;
- params->b_pre_offset = 0;
- params->r_gain = 1024;
- params->g_gain = 1024;
- params->b_gain = 1024;
- params->r_post_offset = 0;
- params->g_post_offset = 0;
- params->b_post_offset = 0;
-
- sprintf(sqlmaster, "select TableName from GeneralWhiteBalanceTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d;",
- source_port, sig_fmt, trans_fmt);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- sprintf(sqlmaster, "select Enable, R_Pre_Offset, G_Pre_Offset, B_Pre_Offset, R_Gain, G_Gain, B_Gain, R_Post_Offset, G_Post_Offset, B_Post_Offset from %s where "
- "Level = %d and def = 0;", c.getString(index_TableName).string(), (int)Tempmode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- params->en = c.getInt(0);//index 0
- params->r_pre_offset = c.getInt(1);
- params->g_pre_offset = c.getInt(2);
- params->b_pre_offset = c.getInt(3);
- params->r_gain = c.getInt(4);
- params->g_gain = c.getInt(5);
- params->b_gain = c.getInt(6);
- params->r_post_offset = c.getInt(7);
- params->g_post_offset = c.getInt(8);
- params->b_post_offset = c.getInt(9);//index 9
- }
- }
- return rval;
-}
-int CPqData::PQ_SetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt,
- tcon_rgb_ogo_t params)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- char sql[512];
-
- int rval = -1;
-
- sprintf(sqlmaster, "select TableName from GeneralWhiteBalanceTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d;",
- source_port, sig_fmt, trans_fmt);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- sprintf(sql, "update %s set Enable = %d, "
- "R_Pre_Offset = %d, G_Pre_Offset = %d, B_Pre_Offset = %d, R_Gain = %d, G_Gain = %d, B_Gain = %d, "
- "R_Post_Offset = %d, G_Post_Offset = %d, B_Post_Offset = %d where Level = %d and def = 0;", c.getString(index_TableName).string(),
- params.en, params.r_pre_offset, params.g_pre_offset, params.b_pre_offset, params.r_gain, params.g_gain,
- params.b_gain, params.r_post_offset, params.g_post_offset, params.b_post_offset, Tempmode);
-
- rval = this->exeSql(sql);
- }
- return rval;
-}
-
-int CPqData::PQ_ResetAllColorTemperatureParams(void)
-{
- CSqlite::Cursor c;
- char sqlmaster[512];
-
- int rval = -1;
-
- sprintf(sqlmaster, "select distinct TableName from GeneralWhiteBalanceTable ;");
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- do { //delete
- sprintf(sqlmaster, "delete from %s where def = 0;"
- "insert into %s( Level , Enable , R_Pre_Offset, G_Pre_Offset, B_Pre_Offset, R_Gain, G_Gain, B_Gain, R_Post_Offset, G_Post_Offset, B_Post_Offset, def ) "
- "select Level, Enable, R_Pre_Offset, G_Pre_Offset, B_Pre_Offset, R_Gain, G_Gain, B_Gain, R_Post_Offset, G_Post_Offset, B_Post_Offset, 0 from %s where def = 1;",
- c.getString(index_TableName).string(), c.getString(index_TableName).string(), c.getString(index_TableName).string());
- rval = this->exeSql(sqlmaster);
- } while(c.moveToNext());
- }
- return rval;
-}
-
-int CPqData::PQ_GetDNLPParams(tvin_port_t source_port, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d,
- tvin_trans_fmt_t trans_fmt, ve_dnlp_t *params, ve_dnlp_table_t *newParams, int *dnlpFlag)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- int rval = -1;
- //default
- params->en = 0;
- params->rt = VE_DNLP_RT_0S;
- params->rl = VE_DNLP_RL_01;
- params->black = VE_DNLP_EXT_00;
- params->white = VE_DNLP_EXT_00;
-
- mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);//(status << 16)|trans_fmt;
-
- sprintf(sqlmaster, "select TableName from GeneralDNLPTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d ;",
- source_port, fmt, mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- sprintf(sqlmaster, "select value from %s ", c.getString(index_TableName).string());
-
- rval = this->select(sqlmaster, c);
- int count = c.getCount();
- if (count == 1) {
- int val;
- c.moveToFirst();
- val = c.getInt(0);//index 0
- *dnlpFlag = 0;
- params->en = (val & 0xf0000000) >> 28;
- params->rt = (ve_dnlp_rt_e)((val & 0x0f000000) >> 24);
- params->rl = (ve_dnlp_rl_e)((val & 0x00ff0000) >> 16);
- params->black = (ve_dnlp_ext_e)((val & 0x0000ff00) >> 8);
- params->white = (ve_dnlp_ext_e)((val & 0x000000ff) >> 0);
- } else if (count > 1) {
- c.moveToFirst();
- c.moveToNext();
- *dnlpFlag = 1;
- newParams->en = c.getInt(0);
- c.moveToNext();
- newParams->method = c.getInt(0);
- c.moveToNext();
- newParams->cliprate = c.getInt(0);
- c.moveToNext();
- newParams->lowrange = c.getInt(0);
- c.moveToNext();
- newParams->hghrange = c.getInt(0);
- c.moveToNext();
- newParams->lowalpha = c.getInt(0);
- c.moveToNext();
- newParams->midalpha = c.getInt(0);
- c.moveToNext();
- newParams->hghalpha = c.getInt(0);
- }
- }
- return rval;
-}
-
-int CPqData::PQ_SetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100)
-{
- return SetNonlinearMapping(TVPQ_DATA_BRIGHTNESS, source_type, osd0, osd25, osd50, osd75, osd100);
-}
-int CPqData::PQ_GetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100)
-{
- int osdvalue[5] = {0};
- int rval;
- rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_BRIGHTNESS, source_type, osdvalue);
- *osd0 = osdvalue[0];
- *osd25 = osdvalue[1];
- *osd50 = osdvalue[2];
- *osd75 = osdvalue[3];
- *osd100 = osdvalue[4];
- if(rval) {
- LOGE("PQ_GetNoLineAllBrightnessParams Error %d\n", rval);
- }
- return rval;
-
-}
-
-int CPqData::PQ_GetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params)
-{
- int val;
-
- GetNonlinearMapping(TVPQ_DATA_BRIGHTNESS, source_port, level, &val);
- *params = CaculateLevelParam(pq_bri_data, bri_nodes, val);
- return 0;
-
-}
-int CPqData::PQ_SetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params)
-{
- return 0;
-}
-
-int CPqData::PQ_SetNoLineAllContrastParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100)
-{
- return SetNonlinearMapping(TVPQ_DATA_CONTRAST, source_type, osd0, osd25, osd50, osd75, osd100);
-}
-int CPqData::PQ_GetNoLineAllContrastParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100)
-{
- int osdvalue[5] = {0};
- int rval;
- rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_CONTRAST, source_type, osdvalue);
- *osd0 = osdvalue[0];
- *osd25 = osdvalue[1];
- *osd50 = osdvalue[2];
- *osd75 = osdvalue[3];
- *osd100 = osdvalue[4];
- if(rval) {
- LOGE("PQ_GetNoLineAllContrastParams Error %d\n", rval);
- }
- return rval;
-}
-
-int CPqData::PQ_GetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params)
-{
- int val;
- GetNonlinearMapping(TVPQ_DATA_CONTRAST, source_port, level, &val);
- *params = CaculateLevelParam(pq_con_data, con_nodes, val);
- return 0;
-}
-int CPqData::PQ_SetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params)
-{
- return 0;
-}
-
-int CPqData::PQ_SetNoLineAllSaturationParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100)
-{
- return SetNonlinearMapping(TVPQ_DATA_SATURATION, source_type, osd0, osd25, osd50, osd75, osd100);
-}
-int CPqData::PQ_GetNoLineAllSaturationParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100)
-{
- int osdvalue[5] = {0};
- int rval;
- rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_SATURATION, source_type, osdvalue);
- *osd0 = osdvalue[0];
- *osd25 = osdvalue[1];
- *osd50 = osdvalue[2];
- *osd75 = osdvalue[3];
- *osd100 = osdvalue[4];
- if(rval) {
- LOGE("PQ_GetNoLineAllSaturationParams Error %d\n", rval);
- }
- return rval;
-}
-
-int CPqData::PQ_GetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params)
-{
- int val;
- GetNonlinearMapping(TVPQ_DATA_SATURATION, source_port, level, &val);
- *params = CaculateLevelParam(pq_sat_data, sat_nodes, val);
- return 0;
-}
-int CPqData::PQ_SetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params)
-{
- return 0;
-}
-
-int CPqData::PQ_SetNoLineAllHueParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100)
-{
- return SetNonlinearMapping(TVPQ_DATA_HUE, source_type, osd0, osd25, osd50, osd75, osd100);
-}
-int CPqData::PQ_GetNoLineAllHueParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100)
-{
- int osdvalue[5] = {0};
- int rval;
- rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_HUE, source_type, osdvalue);
- *osd0 = osdvalue[0];
- *osd25 = osdvalue[1];
- *osd50 = osdvalue[2];
- *osd75 = osdvalue[3];
- *osd100 = osdvalue[4];
- if(rval) {
- LOGE("PQ_GetNoLineAllHueParams Error %d\n", rval);
- }
- return rval;
-}
-
-int CPqData::PQ_GetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params)
-{
- int val;
- GetNonlinearMapping(TVPQ_DATA_HUE, source_port, level, &val);
- *params = CaculateLevelParam(pq_hue_data, hue_nodes, val);
- return 0;
-}
-int CPqData::PQ_SetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params)
-{
- return 0;
-}
-
-int CPqData::PQ_SetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100)
-{
- return SetNonlinearMapping(TVPQ_DATA_SHARPNESS, source_type, osd0, osd25, osd50, osd75, osd100);
-}
-int CPqData::PQ_GetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100)
-{
- int osdvalue[5] = {0};
- int rval;
- rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_SHARPNESS, source_type, osdvalue);
- *osd0 = osdvalue[0];
- *osd25 = osdvalue[1];
- *osd50 = osdvalue[2];
- *osd75 = osdvalue[3];
- *osd100 = osdvalue[4];
- if(rval) {
- LOGE("PQ_GetNoLineAllSharpnessParams Error %d\n", rval);
- }
- return rval;
-}
-
-int CPqData::PQ_GetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t *regs)
-{
- int val;
- GetNonlinearMapping(TVPQ_DATA_SHARPNESS, source_port, level, &val);
- LOGD("val = %d\n", val);
- *regs = CaculateLevelRegsParam(pq_sharpness_reg_data, val);
- return 0;
-}
-int CPqData::PQ_GetPLLParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs)
-{
- int ret = -1;
- int i = 0;
-
- ret = getRegValuesByValue(ADC_SETTING, PORT, FORMAT, source_port, sig_fmt, regs);
-#ifdef CPQDB_DEBUG
- if(ret == 0) {
- for(i = 0; i < regs->length; i++) {
- LOGD("%s, =================================================", "TV");
- LOGD("%s, regData.am_reg[%d].type = %d", "TV", i, regs->am_reg[i].type);
- LOGD("%s, regData.am_reg[%d].addr = %d", "TV", i, regs->am_reg[i].addr);
- LOGD("%s, regData.am_reg[%d].mask = %d", "TV", i, regs->am_reg[i].mask);
- LOGD("%s, regData.am_reg[%d].val = %d", "TV", i, regs->am_reg[i].val);
- }
- }
-#endif
- if(regs->am_reg[0].val == 0 && regs->am_reg[1].val == 0 && regs->am_reg[2].val == 0 && regs->am_reg[3].val == 0) {
- LOGE("%s,db's value is all zeros, that's not OK!!!\n", "TV");
- return -1;
- }
- return ret;
-}
-int CPqData::PQ_GetCVD2Params(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs)
-{
- int ret = -1;
- int i = 0;
- ret = getRegValuesByValue(CVD2_SETTING, PORT, FORMAT, source_port, sig_fmt, regs);
-#ifdef CPQDB_DEBUG
- if(ret == 0) {
- for(i = 0; i < regs->length; i++) {
- LOGD("%s, =================================================", "TV");
- LOGD("%s, regData.am_reg[%d].type = %d", "TV", i, regs->am_reg[i].type);
- LOGD("%s, regData.am_reg[%d].addr = %d", "TV", i, regs->am_reg[i].addr);
- LOGD("%s, regData.am_reg[%d].mask = %d", "TV", i, regs->am_reg[i].mask);
- LOGD("%s, regData.am_reg[%d].val = %d", "TV", i, regs->am_reg[i].val);
- }
- }
-#endif
- if(regs->am_reg[0].val == 0 && regs->am_reg[1].val == 0 && regs->am_reg[2].val == 0 && regs->am_reg[3].val == 0) {
- LOGE("%s,db's value is all zeros, that's not OK!!!\n", "TV");
- return -1;
- }
-
- return ret;
-}
-int CPqData::PQ_SetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t regs)
-{
- return 0;
-}
-
-int CPqData::PQ_SetNoLineAllVolumeParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100)
-{
- return SetNonlinearMapping(TVPQ_DATA_VOLUME, source_type, osd0, osd25, osd50, osd75, osd100);
-}
-int CPqData::PQ_GetNoLineAllVolumeParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100)
-{
- int osdvalue[5] = {0};
- int rval;
- rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_VOLUME, source_type, osdvalue);
- *osd0 = osdvalue[0];
- *osd25 = osdvalue[1];
- *osd50 = osdvalue[2];
- *osd75 = osdvalue[3];
- *osd100 = osdvalue[4];
- if(rval) {
- LOGE("PQ_GetNoLineAllSharpnessParams Error %d\n", rval);
- }
- return rval;
-}
-
-int CPqData::PQ_SetVolumeParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params)
-{
- return 0;
-}
-
-
-int CPqData::PQ_ResetAllNoLineParams(void)
-{
- int rval;
- char sqlmaster[256];
- char *err = NULL;
-
- sprintf(sqlmaster, "delete from NonlinearMapping; "
- "insert into NonlinearMapping(TVIN_PORT, Item_ID, Level, Value) select TVIN_PORT, Item_ID, Level, Value from NonlinearMapping_Default;");
-
- rval = this->exeSql(sqlmaster);
- return rval;
-}
-
-
-int CPqData::PQ_GetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- int rval = -1;
-
- sprintf(sqlmaster, "select TableName from GeneralNoiseReductionTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d ;",
- source_port, sig_fmt, mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- sprintf(sqlmaster, "select NRValue from %s where NRLevel = %d;" , c.getString(index_TableName).string(), (int)nr_mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- *params = c.getInt(0);
- }
- }
- return rval;
-}
-
-int CPqData::PQ_SetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params)
-{
- return 0;
-}
-
-int CPqData::PQ_GetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, vpp_display_mode_t dmode, tvin_cutwin_t *cutwin_t)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- int rval = -1;
-
- cutwin_t->hs = 0;
- cutwin_t->he = 0;
- cutwin_t->vs = 0;
- cutwin_t->ve = 0;
-
- sprintf(sqlmaster, "select Hs, He, Vs, Ve from OVERSCAN where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d ;",
- source_type, fmt, mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- cutwin_t->hs = c.getInt(0);
- cutwin_t->he = c.getInt(1);
- cutwin_t->vs = c.getInt(2);
- cutwin_t->ve = c.getInt(3);
- }
- return rval;
-}
-int CPqData::PQ_SetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, tvin_cutwin_t cutwin_t)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
- int rval = -1;
-
- sprintf(sqlmaster, "select * from OVERSCAN where TVIN_PORT = %d and TVIN_SIG_FMT = %d and TVIN_TRANS_FMT = %d;", source_type, fmt, mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- sprintf(sqlmaster, "update OVERSCAN set Hs = %d, He = %d, Vs = %d, Ve = %d where TVIN_PORT = %d and TVIN_SIG_FMT = %d and TVIN_TRANS_FMT = %d;",
- cutwin_t.hs, cutwin_t.he, cutwin_t.vs, cutwin_t.ve, source_type, fmt, mode);
- } else {
- sprintf(sqlmaster, "Insert into OVERSCAN(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, Hs, He, Vs, Ve) values(%d, %d, %d ,%d ,%d, %d, %d);",
- source_type, fmt, mode, cutwin_t.hs, cutwin_t.he, cutwin_t.vs, cutwin_t.ve);
- }
- rval = this->exeSql(sqlmaster);
-
- return rval;
-}
-
-int CPqData::PQ_ResetAllOverscanParams(void)
-{
- int rval;
- char sqlmaster[256];
-
- sprintf(sqlmaster, "delete from OVERSCAN; insert into OVERSCAN(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, hs, he, vs, ve) select TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, hs, he, vs, ve from OVERSCAN_default;");
- rval = this->exeSql(sqlmaster);
-
- return rval;
-}
-
-int CPqData::PQ_GetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
-
- int rval = -1;
-
- sprintf(sqlmaster, "select Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR from Picture_Mode where "
- "TVIN_PORT = %d and "
- "Mode = %d ;",
- source_type, pq_mode);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- params->brightness = c.getInt(0);
- params->contrast = c.getInt(1);
- params->saturation = c.getInt(2);
- params->hue = c.getInt(3);
- params->sharpness = c.getInt(4);
- params->backlight = c.getInt(5);
- params->nr = c.getInt(6);
- }
- return rval;
-}
-int CPqData::PQ_SetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params)
-{
- int rval;
- char sql[256];
-
- sprintf(sql, "update Picture_Mode set Brightness = %d, Contrast = %d, Saturation = %d, Hue = %d, Sharpness = %d, Backlight = %d, NR= %d "
- " where TVIN_PORT = %d and Mode = %d;",
- params->brightness, params->contrast, params->saturation,
- params->hue, params->sharpness, params->backlight, params->nr,
- source_type, pq_mode);
- rval = this->exeSql(sql);
- return 0;
-}
-
-int CPqData::PQ_SetPQModeParamsByName(const char *name, tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params)
-{
- int rval;
- char sql[256];
-
- sprintf(sql, "insert into %s(TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR)"
- " values(%d,%d,%d,%d,%d,%d,%d,%d,%d);", name, source_type, pq_mode, params->brightness, params->contrast, params->saturation,
- params->hue, params->sharpness, params->backlight, params->nr);
-
- rval = this->exeSql(sql);
- return 0;
-}
-
-int CPqData::PQ_ResetAllPQModeParams(void)
-{
- int rval;
- char sqlmaster[256];
-
- sprintf(sqlmaster, "delete from picture_mode; insert into picture_mode(TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR) select TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR from picture_mode_default;");
-
- rval = this->exeSql(sqlmaster);
- return rval;
-}
-
-int CPqData::PQ_GetGammaSpecialTable(int gammaValue, const char *f_name, tcon_gamma_table_t *gamma_value)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int rval = -1;
-
- sprintf(sqlmaster, "select %s from GAMMA_%d", f_name, gammaValue);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index = 0;
- do {
- gamma_value->data[index] = c.getInt(0);
- index++;
- } while(c.moveToNext());
- }
- return rval;
-}
-
-int CPqData::PQ_GetGammaTableR(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_r)
-{
- return PQ_GetGammaTable(panel_id, source_port, fmt, "Red", gamma_r);
-}
-
-int CPqData::PQ_GetGammaTableG(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_g)
-{
- return PQ_GetGammaTable(panel_id, source_port, fmt, "Green", gamma_g);
-}
-
-int CPqData::PQ_GetGammaTableB(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_b)
-{
- return PQ_GetGammaTable(panel_id, source_port, fmt, "Blue", gamma_b);
-}
-
-int CPqData::PQ_GetGammaTable(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, const char *f_name, tcon_gamma_table_t *val)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
-
- int rval = -1;
-
- sprintf(sqlmaster, "select TableName from GeneralGammaTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d;",
- source_port, fmt);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- int index_TableName = 0;//c.getColumnIndex("TableName");
- sprintf(sqlmaster, "select %s from %s;", f_name, c.getString(index_TableName).string());
-
- rval = this->select(sqlmaster, c);
- if(c.moveToFirst()) {
- int index = 0;
- do {
- val->data[index] = c.getInt(0);
- index++;
- } while(c.moveToNext());
- }
- }
- return rval;
-}
-
-
-int CPqData::PQ_GetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t *adjparam)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int rval = -1;
-
- adjparam->clk_step = 0;
- adjparam->phase = 0;
- adjparam->hpos_step = 0;
- adjparam->vpos_step = 0;
- adjparam->vga_in_clean = 0;
-
- sprintf(sqlmaster, "select Clk, Phase, HPos, VPos, Vga_in_clean from VGA_AutoParams where TVIN_SIG_FMT = %d", vga_fmt);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- adjparam->clk_step = c.getInt(0);
- adjparam->phase = c.getInt(1);
- adjparam->hpos_step = c.getInt(2);
- adjparam->vpos_step = c.getInt(3);
- adjparam->vga_in_clean = c.getInt(4);
- }
- return rval;
-}
-int CPqData::PQ_SetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t adjparam)
-{
- CSqlite::Cursor c;
- char sql[256];
- int rval = -1;
-
- sprintf(sql, "select * from VGA_AutoParams where TVIN_SIG_FMT = %d;", vga_fmt);
-
- rval = this->select(sql, c);
-
- if(c.moveToFirst()) {
- sprintf(sql, "Insert into VGA_AutoParams(TVIN_SIG_FMT, Clk, Phase, HPos, VPos, Vga_in_clean) values(%d, %d, %d ,%d ,%d, %d);",
- vga_fmt, adjparam.clk_step, adjparam.phase, adjparam.hpos_step, adjparam.vpos_step, adjparam.vga_in_clean);
- } else {
- sprintf(sql, "update VGA_AutoParams set Clk = %d, Phase = %d, HPos = %d, VPos = %d, Vga_in_clean = %d where TVIN_SIG_FMT = %d;",
- adjparam.clk_step, adjparam.phase, adjparam.hpos_step, adjparam.vpos_step, adjparam.vga_in_clean, vga_fmt);
- }
- rval = this->exeSql(sql);
- return rval;
-}
-
-int CPqData::CaculateLevelParam(tvpq_data_t *pq_data, int nodes, int level)
-{
- int i;
-
- for(i = 0; i < nodes; i++) {
- if(level < pq_data[i].IndexValue) {
- break;
- }
- }
-
- if(i == 0) {
- return pq_data[i].RegValue;
- } else if(i == nodes) {
- return pq_data[i - 1].RegValue;
- } else {
- return pq_data[i - 1].RegValue + (level - pq_data[i - 1].IndexValue) * pq_data[i - 1].step;
- }
-}
-
-am_regs_t CPqData::CaculateLevelRegsParam(tvpq_sharpness_regs_t *pq_regs, int level)
-{
- am_regs_t regs;
- int i;
-
- for(i = 0; i < sha_nodes; i++) {
- if(level < pq_regs[i].reg_data[0].IndexValue) {
- break;
- }
- }
-
- if(i == 0) {
- regs.length = pq_regs[i].length;
- for(int j = 0; j < pq_regs[i].length; j++) {
- regs.am_reg[j].type = pq_regs[i].reg_data[j].Value.type;
- regs.am_reg[j].addr = pq_regs[i].reg_data[j].Value.addr;
- regs.am_reg[j].mask = pq_regs[i].reg_data[j].Value.mask;
- regs.am_reg[j].val = pq_regs[i].reg_data[j].Value.val;
- }
-
- } else if(i == sha_nodes) {
- regs.length = pq_regs[i - 1].length;
- for(int j = 0; j < pq_regs[i - 1].length; j++) {
- regs.am_reg[j].type = pq_regs[i - 1].reg_data[j].Value.type;
- regs.am_reg[j].addr = pq_regs[i - 1].reg_data[j].Value.addr;
- regs.am_reg[j].mask = pq_regs[i - 1].reg_data[j].Value.mask;
- regs.am_reg[j].val = pq_regs[i - 1].reg_data[j].Value.val;
- }
- } else {
- regs.length = pq_regs[i - 1].length;
- for(int j = 0; j < pq_regs[i - 1].length; j++) {
- regs.am_reg[j].type = pq_regs[i - 1].reg_data[j].Value.type;
- regs.am_reg[j].addr = pq_regs[i - 1].reg_data[j].Value.addr;
- regs.am_reg[j].mask = pq_regs[i - 1].reg_data[j].Value.mask;
- regs.am_reg[j].val = pq_regs[i - 1].reg_data[j].Value.val + (level - pq_regs[i - 1].reg_data[j].IndexValue) * pq_regs[i - 1].reg_data[j].step;
- }
- }
-
- return regs;
-}
-
-
-int CPqData::GetNonlinearMapping(tvpq_data_type_t data_type, tvin_port_t source_port, int level, int *params)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int rval = -1;
-
- tv_source_input_type_t type;
- //showboz
- type = CTvin::Tvin_SourcePortToSourceInputType(source_port);//???
-
- sprintf(sqlmaster, "select Value from NonlinearMapping where "
- "TVIN_PORT = %d and "
- "Item_ID = %d and "
- "Level = %d ;",
- type, data_type, level);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- *params = c.getInt(0);
- }
- return rval;
-}
-
-int CPqData::GetNonlinearMappingByOSDFac(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int *params)
-{
- CSqlite::Cursor c;
- char sqlmaster[256];
- int rval = -1;
-
- sprintf(sqlmaster, "select Value from NonlinearMapping where "
- "TVIN_PORT = %d and "
- "Item_ID = %d and ("
- "Level = 0 or Level = 25 or Level = 50 or Level = 75 or Level = 100);",
- source_type, data_type);
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- params[0] = c.getInt(0);
- params[1] = c.getInt(1);
- params[2] = c.getInt(2);
- params[3] = c.getInt(3);
- params[4] = c.getInt(4);
- }
- return rval;
-}
-
-int CPqData::SetNonlinearMapping(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100)
-{
-
- int rval;
- char *err = NULL;
- int osdvalue[101];
- double step[4];
- char sql[256];
-
- step[0] = (osd25 - osd0) / 25.0;
- step[1] = (osd50 - osd25) / 25.0;
- step[2] = (osd75 - osd50) / 25.0;
- step[3] = (osd100 - osd75) / 25.0;
-
-
- for(int i = 0; i <= 100; i++) {
- if(i == 0) {
- osdvalue[i] = osd0;
- } else if((i > 0) && (i <= 25)) {
- osdvalue[i] = osd0 + (int)(i * step[0]);
- } else if((i > 25) && (i <= 50)) {
- osdvalue[i] = osd25 + (int)((i - 25) * step[1]);
- } else if((i > 50) && (i <= 75)) {
- osdvalue[i] = osd50 + (int)((i - 50) * step[2]);
- } else if((i > 75) && (i <= 100)) {
- osdvalue[i] = osd75 + (int)((i - 75) * step[3]);
- }
- sprintf(sql, "update NonLinearMapping set Value = %d where TVIN_PORT = %d and Item_ID = %d and Level = %d ;", osdvalue[i], source_type, data_type, i);
- if(!(this->exeSql(sql))) {
- return -1;
- }
- }
- return 0;
-}
-
-int CPqData::SetNonlinearMappingByName(const char *name, tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100)
-{
- int rval;
- char *err = NULL;
- int osdvalue[101];
- double step[4];
- char sql[256];
-
- step[0] = (osd25 - osd0) / 25.0;
- step[1] = (osd50 - osd25) / 25.0;
- step[2] = (osd75 - osd50) / 25.0;
- step[3] = (osd100 - osd75) / 25.0;
-
- for(int i = 0; i <= 100; i++) {
- if(i == 0) {
- osdvalue[i] = osd0;
- } else if((i > 0) && (i <= 25)) {
- osdvalue[i] = osd0 + (int)(i * step[0]);
- } else if((i > 25) && (i <= 50)) {
- osdvalue[i] = osd25 + (int)((i - 25) * step[1]);
- } else if((i > 50) && (i <= 75)) {
- osdvalue[i] = osd50 + (int)((i - 50) * step[2]);
- } else if((i > 75) && (i <= 100)) {
- osdvalue[i] = osd75 + (int)((i - 75) * step[3]);
- }
- memset(sql, '\0', 256);
- sprintf(sql, "insert into %s(TVIN_PORT, Item_ID, Level, Value) values(%d,%d,%d,%d);", name, source_type, data_type, i, osdvalue[i]);
- if(!(this->exeSql(sql))) {
- return -1;
- }
- }
- return 0;
-}
-
-int CPqData::LoadPQData(tvpq_data_type_t data_type, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag)
-{
- CSqlite::Cursor c;
- int rval;
- char sqlmaster[256];
- int mode = is2dOr3d;
- tvpq_data_t *pq_data = NULL;
- int *pq_nodes = NULL;
-
- switch(data_type) {
- case TVPQ_DATA_BRIGHTNESS:
- sprintf(sqlmaster, "select TableName from GeneralContrastBrightnessTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d and "
- "%s = %d;",
- source_port, sig_fmt, mode, ID_FIELD, BRIGHTNESS_ID);
- pq_data = pq_bri_data;
- pq_nodes = &bri_nodes;
- break;
- case TVPQ_DATA_CONTRAST:
- sprintf(sqlmaster, "select TableName from GeneralContrastBrightnessTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d and "
- "%s = %d;",
- source_port, sig_fmt, mode, ID_FIELD, CONTRAST_ID);
- pq_data = pq_con_data;
- pq_nodes = &con_nodes;
- break;
- case TVPQ_DATA_HUE:
- sprintf(sqlmaster, "select TableName from GeneralSaturationHueTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d and "
- "%s = %d;",
- source_port, sig_fmt, mode, ID_FIELD, HUE_ID);
- pq_data = pq_hue_data;
- pq_nodes = &hue_nodes;
- break;
- case TVPQ_DATA_SATURATION:
- sprintf(sqlmaster, "select TableName from GeneralSaturationHueTable where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d and "
- "%s = %d;",
- source_port, sig_fmt, mode, ID_FIELD, SATURATION_ID);
- pq_data = pq_sat_data;
- pq_nodes = &sat_nodes;
- break;
- case TVPQ_DATA_SHARPNESS:
- //sprintf(sqlmaster, "select TableName from GeneralSharpnessTable where "
- sprintf(sqlmaster, "select TableName from GeneralSharpnessG9Table where "
- "TVIN_PORT = %d and "
- "TVIN_SIG_FMT = %d and "
- "TVIN_TRANS_FMT = %d and "
- "%s = %d;",
- source_port, sig_fmt, mode, ID_FIELD, SHARPNESS_ID);
- pq_data = NULL;
- pq_nodes = &sha_nodes;
- break;
- default:
- break;
- }
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- switch(data_type) {
- case TVPQ_DATA_BRIGHTNESS:
- case TVPQ_DATA_CONTRAST:
- case TVPQ_DATA_HUE:
- case TVPQ_DATA_SATURATION:
- sprintf(sqlmaster, "select TotalNode, NodeNumber, IndexValue, RegValue, StepUp from %s order by NodeNumber asc;", c.getString(0).string());
- break;
- case TVPQ_DATA_SHARPNESS:
- sprintf(sqlmaster, "select TotalNode, NodeNumber, RegType, RegAddr, RegMask, IndexValue, RegValue, StepUp from %s order by NodeNumber asc;", c.getString(0).string());
- break;
- default:
- break;
- }
- }
-
- rval = this->select(sqlmaster, c);
-
- if(c.moveToFirst()) {
- if(data_type == TVPQ_DATA_SHARPNESS) {
- *pq_nodes = c.getInt(0);//TotalNode?
- int length = c.getCount() / (*pq_nodes);
- int index = 0;
- for(int i = 0; i < *pq_nodes; i++) {
- pq_sharpness_reg_data[i].length = length;
- }
- do {
- pq_sharpness_reg_data[index / length].reg_data[index % length].TotalNode = c.getInt(0);
- pq_sharpness_reg_data[index / length].reg_data[index % length].NodeValue = c.getInt(1);
- pq_sharpness_reg_data[index / length].reg_data[index % length].Value.type = c.getUInt(2);
- pq_sharpness_reg_data[index / length].reg_data[index % length].Value.addr = c.getUInt(3);
- pq_sharpness_reg_data[index / length].reg_data[index % length].Value.mask = c.getUInt(4);
- pq_sharpness_reg_data[index / length].reg_data[index % length].IndexValue = c.getInt(5);
- pq_sharpness_reg_data[index / length].reg_data[index % length].Value.val = c.getUInt(6);
- pq_sharpness_reg_data[index / length].reg_data[index % length].step = c.getF(7);
- index++;
- } while(c.moveToNext());
- } else {
- int index = 0;
- do {
- pq_data[index].TotalNode = c.getInt(0);
- pq_data[index].NodeValue = c.getInt(1);
- pq_data[index].IndexValue = c.getInt(2);
- pq_data[index].RegValue = c.getInt(3);
- pq_data[index].step = c.getF(4);
- if(flag == 1) {
- if(data_type == TVPQ_DATA_BRIGHTNESS) {
- LOGD("%s, bri pq_data[%d].RegValue = %d\n", "TV", index, pq_data[index].RegValue);
- pq_data[index].RegValue -= 64;
- LOGD("%s, bri pq_data[%d].RegValue + 64 = %d\n", "TV", index, pq_data[index].RegValue);
- } else if(data_type == TVPQ_DATA_CONTRAST) {
- LOGD("%s, con pq_data[%d].RegValue = %d\n", "TV", index, pq_data[index].RegValue);
- pq_data[index].RegValue += 64;
- LOGD("%s, con pq_data[%d].RegValue + 64 = %d\n", "TV", index, pq_data[index].RegValue);
- }
- }
- index++;
- } while(c.moveToNext());
- *pq_nodes = index;
- }
- }
-
- return rval;
-}
-
-int CPqData::LoadAllPQData(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag)
-{
- int rval = -1;
- rval = LoadPQData(TVPQ_DATA_BRIGHTNESS, source_port, sig_fmt, is2dOr3d, trans_fmt, flag);
- if(rval) {
- return rval;
- }
- rval = LoadPQData(TVPQ_DATA_CONTRAST, source_port, sig_fmt, is2dOr3d, trans_fmt, flag);
- if(rval) {
- return rval;
- }
- rval = LoadPQData(TVPQ_DATA_SATURATION, source_port, sig_fmt, is2dOr3d, trans_fmt, -1);
- if(rval) {
- return rval;
- }
- rval = LoadPQData(TVPQ_DATA_HUE, source_port, sig_fmt, is2dOr3d, trans_fmt, -1);
- if(rval) {
- return rval;
- }
- rval = LoadPQData(TVPQ_DATA_SHARPNESS, source_port, sig_fmt, is2dOr3d, trans_fmt, -1);
- if(rval) {
- return rval;
- }
- return rval;
-}
-
-typedef enum initial_type_e {
- TYPE_PMode = 0,
- TYPE_PMode_Default,
- TYPE_Nonlinear,
- TYPE_NonLinear_Default,
- TYPE_VGA_AUTO,
- TYPE_OVERSCAN,
-} initial_type_t;
-
-const char *Pmode_name[6] = {
- "Picture_Mode",
- "Picture_Mode_Default",
- "NonlinearMapping",
- "NonlinearMapping_Default",
- "VGA_AutoParams",
- "OVERSCAN"
-};
-
-void CPqData::initialTable(int type)
-{
- vpp_pq_para_t pmode_default;
-
- pmode_default.backlight = 100;
- pmode_default.brightness = 50;
- pmode_default.contrast = 50;
- pmode_default.hue = 50;
- pmode_default.nr = 0;
- pmode_default.saturation = 50;
- pmode_default.sharpness = 50;
-
-
- switch(type) {
- case TYPE_PMode:
- case TYPE_PMode_Default:
- for(int i = 0; i < 6; i++ ) {
- for(int j = 0; j < 4; j++) {
- PQ_SetPQModeParamsByName(Pmode_name[type], (tv_source_input_type_t) i, (vpp_picture_mode_t)j, &pmode_default);
- }
- }
- break;
- case TYPE_Nonlinear:
- case TYPE_NonLinear_Default:
- for(int i = 0; i < 6; i++ ) {
- for(int j = 0; j < 5; j++) {
- SetNonlinearMappingByName(Pmode_name[type], (tvpq_data_type_t) j, (tv_source_input_type_t)i, 0, (int)255 / 4.0, (int)255 * 2 / 4.0, (int)255 * 3 / 4.0, 255);
- }
- }
- break;
- case TYPE_VGA_AUTO:
- break;
- case TYPE_OVERSCAN:
- break;
- }
-}
-
-/*void CPqData::transferFixTable()
-{
- char sql[256];
- char * err = NULL;
- char ** rsltReg = NULL;
- int rval, rows, columns;
- unsigned int tvin, sig, trans;
- char tablename[256];
-
- sprintf(sql, "Select TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, TableName from GeneralSharpnessTable where TableID = 0;");
-
- rval = sqlite3_get_table(DB, sql, &rsltReg, &rows, &columns, &err);
-
- if(rval) {
- if(rsltReg != NULL) {
- sqlite3_free_table(rsltReg);
- rsltReg = NULL;
- }
- if(err != NULL) {
- sqlite3_free(err);
- err = NULL;
- }
- return;
- } else {
- for(int i=1; i<=rows; i++) {
- memset(sql,'\0',256);
-
- sscanf(rsltReg[i*columns], "%u", &tvin);
- sscanf(rsltReg[i*columns+1], "%u", &sig);
- sscanf(rsltReg[i*columns+2], "%u", &trans);
- sscanf(rsltReg[i*columns+3], "%s", tablename);
-
- sprintf(sql, "insert into GeneralCommonTable(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, TableID, TableName) values(%d,%d,%d,0,\"%s\");",
- tvin, sig, trans, tablename);
- rval = sqlite3_exec(DB, sql, NULL, NULL, &err);
- if(rval) {
- if(err != NULL) {
- sqlite3_free(err);
- err = NULL;
- }
- return;
- }
- if(err != NULL) {
- sqlite3_free(err);
- err = NULL;
- }
- }
- memset(sql,'\0',256);
- sprintf(sql, "delete from GeneralSharpnessTable where TableID = 0;");
- rval = sqlite3_exec(DB, sql, NULL, NULL, &err);
- if(rval) {
- if(err != NULL) {
- sqlite3_free(err);
- err = NULL;
- }
- return;
- }
- if(err != NULL) {
- sqlite3_free(err);
- err = NULL;
- }
- }
-}*/
-
-int CPqData::PQ_GetPhaseArray(am_phase_t *am_phase)
-{
- CSqlite::Cursor c;
- int iOutRet = 0;
- char sqlmaster[256];
- sprintf(sqlmaster, "select Phase from Phase order by Format ASC; ");
-
- this->select(sqlmaster, c);
- int nums = 0;
- am_phase->length = c.getCount();
- if(c.moveToFirst()) {
- do {
- am_phase->phase[nums] = c.getInt(0);//col index is 0[Phase]
- nums++;
- } while(c.moveToNext());
- }
- //
- return nums;
-}
-
+/*
+ * CPQdb.cpp
+ *
+ * d on: 2011-12-13
+ * Author: casey
+ *
+ * change 2015.04
+ * showbo
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <xxxconfig.h>
+#include "CPQdb.h"
+#include "../tvutils/tvutils.h"
+#include "../tvconfig/tvconfig.h"
+
+#if (PQ_NO_ANDROID == 0)
+#include <android/log.h>
+#define LOG_TAG "CPQdb"
+#include "CTvLog.h"
+#endif
+
+#if (PQ_NO_ANDROID == 1)
+using namespace std;
+#endif
+
+//#define CPQDB_DEBUG
+
+#define BRIGHTNESS_ID 0
+#define CONTRAST_ID 1
+#define SATURATION_ID 1
+#define HUE_ID 0
+#define SHARPNESS_ID 1
+
+//static char *str_buf[256];
+
+#define ID_FIELD "TableID"
+#define NR_LEVEL_NAME "NRLevel"
+#define CM_LEVEL_NAME "CMLevel"
+#define LEVEL_NAME "Level"
+#define ADC_SETTING "ADC_Settings"
+#define CVD2_SETTING "CVD2_Settings"
+#define PORT "Port"
+#define FORMAT "Format"
+
+#define CC_LINE_MAX_LEN (1024)
+
+#define LOG_TAG "CPQdb"
+//#define CPQDB_DEBUG
+
+
+/*int get_pq_from_file(const char *file_name, const char *screen_size, char *key_str_buf[]) {
+ FILE *fp = NULL;
+ int flag = -1;
+ char *str = NULL;
+ char r_line_buf[CC_LINE_MAX_LEN];
+
+ if (file_name == NULL || screen_size == NULL || key_str_buf == NULL) {
+ return -1;
+ }
+
+ fp = fopen(file_name, "r");
+ if (fp == NULL) {
+ LOGE("%s: open file \"%s\" error(%s).\n", "TV", file_name, strerror(errno));
+ return -1;
+ }
+
+ while (fgets(r_line_buf, CC_LINE_MAX_LEN, fp)) {
+ LOGD("%s, fgets_buf = %s\n","TV", r_line_buf);
+ if (NULL != strstr(r_line_buf, screen_size)) {
+ LOGD("%s, screen_size_buf = %s\n","TV", r_line_buf);
+ str = (char*)malloc(strlen(r_line_buf));
+ memset(str, 0, strlen(str));
+ if (NULL != str) {
+ strcpy(str, r_line_buf);
+ key_str_buf[0] = str;
+ LOGD("%s, key_str_buf[0] = %s\n","TV", key_str_buf[0]);
+ }
+ flag = 0;
+ break;
+ }
+ }
+
+ if (flag != 0)
+ key_str_buf[0] = NULL;
+
+ fclose(fp);
+ fp = NULL;
+
+ return flag;
+ }*/
+
+/*int getFileSizeSystemCall(char * strFileName)
+ {
+ struct stat temp;
+ stat(strFileName, &temp);
+ return temp.st_size;
+ }*/
+
+CPqData::CPqData() {
+ int i = 0, j = 0;
+
+ for (i = 0; i < 15; i++) {
+ pq_bri_data[i].TotalNode = 0;
+ pq_bri_data[i].NodeValue = 0;
+ pq_bri_data[i].IndexValue = 0;
+ pq_bri_data[i].RegValue = 0;
+ pq_bri_data[i].step = 0;
+
+ pq_con_data[i].TotalNode = 0;
+ pq_con_data[i].NodeValue = 0;
+ pq_con_data[i].IndexValue = 0;
+ pq_con_data[i].RegValue = 0;
+ pq_con_data[i].step = 0;
+
+ pq_sat_data[i].TotalNode = 0;
+ pq_sat_data[i].NodeValue = 0;
+ pq_sat_data[i].IndexValue = 0;
+ pq_sat_data[i].RegValue = 0;
+ pq_sat_data[i].step = 0;
+
+ pq_hue_data[i].TotalNode = 0;
+ pq_hue_data[i].NodeValue = 0;
+ pq_hue_data[i].IndexValue = 0;
+ pq_hue_data[i].RegValue = 0;
+ pq_hue_data[i].step = 0;
+ }
+
+ for (i = 0; i < 10; i++) {
+ pq_sharpness_reg_data[i].length = 0;
+ pq_sharpness_reg_data_1[i].length = 0;
+ for (j = 0; j < 50; j++) {
+ pq_sharpness_reg_data[i].reg_data[j].TotalNode = 0;
+ pq_sharpness_reg_data_1[i].reg_data[j].TotalNode = 0;
+ pq_sharpness_reg_data[i].reg_data[j].Value.type = 0;
+ pq_sharpness_reg_data_1[i].reg_data[j].Value.type = 0;
+ pq_sharpness_reg_data[i].reg_data[j].Value.addr = 0;
+ pq_sharpness_reg_data_1[i].reg_data[j].Value.addr = 0;
+ pq_sharpness_reg_data[i].reg_data[j].Value.mask = 0;
+ pq_sharpness_reg_data_1[i].reg_data[j].Value.mask = 0;
+ pq_sharpness_reg_data[i].reg_data[j].Value.val = 0;
+ pq_sharpness_reg_data_1[i].reg_data[j].Value.val = 0;
+ pq_sharpness_reg_data[i].reg_data[j].NodeValue = 0;
+ pq_sharpness_reg_data_1[i].reg_data[j].NodeValue = 0;
+ pq_sharpness_reg_data[i].reg_data[j].IndexValue = 0;
+ pq_sharpness_reg_data_1[i].reg_data[j].IndexValue = 0;
+ pq_sharpness_reg_data[i].reg_data[j].step = 0;
+ pq_sharpness_reg_data_1[i].reg_data[j].step = 0;
+ }
+ }
+}
+
+CPqData::~CPqData() {
+}
+
+int CPqData::openPqDB(const char *db_path) {
+ int rval;
+ project_info_t tmp_info;
+ char SYSTEM_PQ[128] = { 0 };
+ char tmp_buf[128] = { 0 };
+
+ strcpy(PQ_DB_PATH, db_path);
+ strcpy(SYSTEM_PQ, "/system/etc/pq.db");
+
+ if (GetProjectInfo(&tmp_info) == 0) {
+ strcpy(tmp_buf, "/system/etc/");
+ strcat(tmp_buf, tmp_info.panel_type);
+ strcat(tmp_buf, ".db");
+ if (access(tmp_buf, 0) == 0) {
+ strncpy(SYSTEM_PQ, tmp_buf, sizeof(SYSTEM_PQ) - 1);
+ }
+ }
+
+ LOGD("openPqDB path = %s = %s", db_path, PQ_DB_PATH);
+ if (access(PQ_DB_PATH, 0) < 0) {
+ CFile file(SYSTEM_PQ);
+ if (file.copyTo(PQ_DB_PATH) != 0) {
+ LOGE("%s, copy file \"%s\" to \"%s\" error", __FUNCTION__, SYSTEM_PQ, PQ_DB_PATH);
+ return -1;
+ } else {
+ LOGD("%s, copy file \"%s\" to \"%s\" ok", __FUNCTION__, SYSTEM_PQ, PQ_DB_PATH);
+ }
+ }
+
+ closeDb();
+ rval = openDb(PQ_DB_PATH);
+
+ char *err;
+ bool isOk = integrityCheck();
+ if (!isOk) {
+ CFile file(SYSTEM_PQ);
+ if (file.copyTo(PQ_DB_PATH) != 0) {
+ LOGE("%s, copy file = %s , error", __FUNCTION__, SYSTEM_PQ);
+ return -1;
+ } else {
+ closeDb();
+ rval = openDb(PQ_DB_PATH);
+ LOGD("%s, copy file = %s , ok", __FUNCTION__, SYSTEM_PQ);
+ }
+ }
+ return rval;
+}
+int CPqData::reopenDB()
+{
+ int rval = openDb(PQ_DB_PATH);
+ return rval;
+}
+
+int CPqData::getRegValues(const char *table_name, tvin_port_t source, tvin_sig_fmt_t signal,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs)
+{
+ CSqlite::Cursor c_tablelist, c_reg_list;
+ int index_am_reg = 0;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ if (table_name == NULL || !strlen(table_name)) {
+ LOGE("%s, table_name is null\n", __FUNCTION__);
+ return index_am_reg;
+ }
+
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select TableName from %s where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", table_name, source, signal, mode);
+ this->select(sqlmaster, c_tablelist);
+ if (c_tablelist.moveToFirst()) { //for table list
+ do {
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select RegType, RegAddr, RegMask, RegValue from %s;",
+ c_tablelist.getString(0).string());
+ this->select(sqlmaster, c_reg_list);
+
+ if (c_reg_list.moveToFirst()) { //reg list for each table
+ int index_type = 0;//c_reg_list.getColumnIndex("RegType");
+ int index_addr = 1;//c_reg_list.getColumnIndex("RegAddr");
+ int index_mask = 2;//c_reg_list.getColumnIndex("RegMask");
+ int index_val = 3;//c_reg_list.getColumnIndex("RegValue");
+ do {
+ regs->am_reg[index_am_reg].type = c_reg_list.getUInt(index_type);
+ regs->am_reg[index_am_reg].addr = c_reg_list.getUInt(index_addr);
+ regs->am_reg[index_am_reg].mask = c_reg_list.getUInt(index_mask);
+ regs->am_reg[index_am_reg].val = c_reg_list.getUInt(index_val);
+ index_am_reg++;
+ } while (c_reg_list.moveToNext());
+ }
+ } while (c_tablelist.moveToNext());
+ }
+ //
+ regs->length = index_am_reg;
+ LOGD("%s, length = %d", __FUNCTION__, regs->length);
+ return index_am_reg;
+}
+
+int CPqData::getRegValuesByValue(const char *name, const char *f_name, const char *f2_name,
+ const int val, const int val2, am_regs_t *regs) {
+ CSqlite::Cursor c_reg_list;
+ char sqlmaster[256];
+ int rval = -1;
+ //first get table name
+ if ((strlen(f2_name) == 0) && (val2 == 0))
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d;", name, f_name,
+ val);
+ else
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d and %s = %d;",
+ name, f_name, val, f2_name, val2);
+
+ rval = this->select(sqlmaster, c_reg_list);
+ int count = c_reg_list.getCount();
+ if (count > REGS_MAX_NUMBER) {
+ LOGD("%s, regs is too more, in pq.db count = %d", __FUNCTION__, count);
+ return -1;
+ }
+ int index_am_reg = 0;
+ if (c_reg_list.moveToFirst()) { //reg list for each table
+ int index_type = 0;//c_reg_list.getColumnIndex("RegType");
+ int index_addr = 1;//c_reg_list.getColumnIndex("RegAddr");
+ int index_mask = 2;//c_reg_list.getColumnIndex("RegMask");
+ int index_val = 3;//c_reg_list.getColumnIndex("RegValue");
+ do {
+ regs->am_reg[index_am_reg].type = c_reg_list.getUInt(index_type);
+ regs->am_reg[index_am_reg].addr = c_reg_list.getUInt(index_addr);
+ regs->am_reg[index_am_reg].mask = c_reg_list.getUInt(index_mask);
+ regs->am_reg[index_am_reg].val = c_reg_list.getUInt(index_val);
+ index_am_reg++;
+ } while (c_reg_list.moveToNext());
+ } else
+ rval = -1;
+ //
+ regs->length = index_am_reg;
+ LOGD("%s, length = %d", __FUNCTION__, regs->length);
+ return rval;
+}
+
+int CPqData::getRegValuesByValue_long(const char *name, const char *f_name, const char *f2_name,
+ const int val, const int val2, am_regs_t *regs, am_regs_t *regs_1) {
+ CSqlite::Cursor c_reg_list;
+ char sqlmaster[256];
+ int rval = -1;
+ //first get table name
+ if ((strlen(f2_name) == 0) && (val2 == 0))
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d;", name, f_name,
+ val);
+ else
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select RegType, RegAddr, RegMask, RegValue from %s where %s = %d and %s = %d;",
+ name, f_name, val, f2_name, val2);
+
+ rval = this->select(sqlmaster, c_reg_list);
+
+ int index_am_reg = 0;
+ int count = c_reg_list.getCount();
+ if (count > 1024) {
+ LOGD("%s, regs is too more, in pq.db count = %d", __FUNCTION__, count);
+ return -1;
+ }
+ if (c_reg_list.moveToFirst()) { //reg list for each table
+ int index_type = 0;//c_reg_list.getColumnIndex("RegType");
+ int index_addr = 1;//c_reg_list.getColumnIndex("RegAddr");
+ int index_mask = 2;//c_reg_list.getColumnIndex("RegMask");
+ int index_val = 3;//c_reg_list.getColumnIndex("RegValue");
+ do {
+ if (index_am_reg < 512) {
+ regs->am_reg[index_am_reg].type = c_reg_list.getUInt(index_type);
+ regs->am_reg[index_am_reg].addr = c_reg_list.getUInt(index_addr);
+ regs->am_reg[index_am_reg].mask = c_reg_list.getUInt(index_mask);
+ regs->am_reg[index_am_reg].val = c_reg_list.getUInt(index_val);
+ } else if (index_am_reg >= 512 && index_am_reg < 1024) {
+ regs_1->am_reg[index_am_reg - 512].type = c_reg_list.getUInt(index_type);
+ regs_1->am_reg[index_am_reg - 512].addr = c_reg_list.getUInt(index_addr);
+ regs_1->am_reg[index_am_reg - 512].mask = c_reg_list.getUInt(index_mask);
+ regs_1->am_reg[index_am_reg - 512].val = c_reg_list.getUInt(index_val);
+ } else {
+ }
+ index_am_reg++;
+ } while (c_reg_list.moveToNext());
+ } else
+ rval = -1;
+ //
+ if (count < 512) {
+ regs->length = index_am_reg;
+ } else if (index_am_reg >= 512 && index_am_reg < 1024) {
+ regs->length = 512;
+ regs_1->length = index_am_reg - 512;
+ }
+ LOGD("%s, length = %d", __FUNCTION__, index_am_reg);
+ return rval;
+}
+int CPqData::PQ_GetBaseColorParams(vpp_color_basemode_t basemode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select TableName from GeneralColormanagementTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", source_port, sig_fmt, mode);
+
+ this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ rval = getRegValuesByValue(c.getString(index_TableName), CM_LEVEL_NAME, "", (int) basemode,
+ 0, regs);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetCM2Params(vpp_color_management2_t basemode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+ if (source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) {
+ if (source_port != TVIN_PORT_CVBS3) {
+ source_port = TVIN_PORT_CVBS1;
+ }
+ } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) {
+ source_port = TVIN_PORT_HDMI0;
+ } else if (source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) {
+ source_port = TVIN_PORT_MPEG0;
+ }
+
+ if (sig_fmt >= TVIN_SIG_FMT_MAX) {
+ sig_fmt = TVIN_SIG_FMT_NULL;
+ }
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralCM2Table where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", source_port, sig_fmt, mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ rval = getRegValuesByValue(c.getString(index_TableName), CM_LEVEL_NAME, "", (int) basemode,
+ 0, regs);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetNR2Params(vpp_noise_reduction2_mode_t nr_mode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+
+ if (source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) {
+ if (source_port != TVIN_PORT_CVBS3) {
+ source_port = TVIN_PORT_CVBS1;
+ }
+ } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) {
+ source_port = TVIN_PORT_HDMI0;
+ } else if (source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) {
+ source_port = TVIN_PORT_MPEG0;
+ }
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralNR2Table where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", source_port, sig_fmt, mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ rval = getRegValuesByValue(c.getString(index_TableName), LEVEL_NAME, "", (int) nr_mode, 0,
+ regs);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetXVYCCParams(vpp_xvycc_mode_t xvycc_mode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs,
+ am_regs_t *regs_1) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+
+ if (source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) {
+ if (source_port != TVIN_PORT_CVBS3) {
+ source_port = TVIN_PORT_CVBS1;
+ }
+ } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) {
+ source_port = TVIN_PORT_HDMI0;
+ } else if (source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) {
+ source_port = TVIN_PORT_MPEG0;
+ }
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralXVYCCTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", source_port, sig_fmt, mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ rval = getRegValuesByValue_long(c.getString(index_TableName), LEVEL_NAME, "",
+ (int) xvycc_mode, 0, regs, regs_1);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetMCDIParams(vpp_mcdi_mode_t mcdi_mode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+
+ if (source_port >= TVIN_PORT_CVBS0 && source_port <= TVIN_PORT_CVBS7) {
+ if (source_port != TVIN_PORT_CVBS3) {
+ source_port = TVIN_PORT_CVBS1;
+ }
+ } else if (source_port >= TVIN_PORT_HDMI0 && source_port <= TVIN_PORT_HDMI7) {
+ source_port = TVIN_PORT_HDMI0;
+ } else if (source_port > TVIN_PORT_DTV || source_port < TVIN_PORT_NULL) {
+ source_port = TVIN_PORT_MPEG0;
+ }
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralMCDITable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", source_port, sig_fmt, mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ rval = getRegValuesByValue(c.getString(index_TableName), LEVEL_NAME, "", (int) mcdi_mode,
+ 0, regs);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetDeblockParams(vpp_deblock_mode_t deb_mode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs)
+{
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralDeblockTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", source_port, sig_fmt, is2dOr3d);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ rval = getRegValuesByValue(c.getString(0), LEVEL_NAME, "", (int)deb_mode, 0, regs);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode,
+ tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt,
+ tcon_rgb_ogo_t *params) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+
+ int rval = -1;
+
+ //default
+ params->en = 1;
+ params->r_pre_offset = 0;
+ params->g_pre_offset = 0;
+ params->b_pre_offset = 0;
+ params->r_gain = 1024;
+ params->g_gain = 1024;
+ params->b_gain = 1024;
+ params->r_post_offset = 0;
+ params->g_post_offset = 0;
+ params->b_post_offset = 0;
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralWhiteBalanceTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d;", source_port, sig_fmt, trans_fmt);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "select Enable, R_Pre_Offset, G_Pre_Offset, B_Pre_Offset, R_Gain, G_Gain, B_Gain, R_Post_Offset, G_Post_Offset, B_Post_Offset from %s where "
+ "Level = %d and def = 0;", c.getString(index_TableName).string(),
+ (int) Tempmode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ params->en = c.getInt(0);//index 0
+ params->r_pre_offset = c.getInt(1);
+ params->g_pre_offset = c.getInt(2);
+ params->b_pre_offset = c.getInt(3);
+ params->r_gain = c.getInt(4);
+ params->g_gain = c.getInt(5);
+ params->b_gain = c.getInt(6);
+ params->r_post_offset = c.getInt(7);
+ params->g_post_offset = c.getInt(8);
+ params->b_post_offset = c.getInt(9);//index 9
+ }
+ }
+ return rval;
+}
+int CPqData::PQ_SetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode,
+ tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt,
+ tcon_rgb_ogo_t params) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ char sql[512];
+
+ int rval = -1;
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralWhiteBalanceTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d;", source_port, sig_fmt, trans_fmt);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ getSqlParams(
+ __FUNCTION__,
+ sql,
+ "update %s set Enable = %d, "
+ "R_Pre_Offset = %d, G_Pre_Offset = %d, B_Pre_Offset = %d, R_Gain = %d, G_Gain = %d, B_Gain = %d, "
+ "R_Post_Offset = %d, G_Post_Offset = %d, B_Post_Offset = %d where Level = %d and def = 0;",
+ c.getString(index_TableName).string(), params.en, params.r_pre_offset,
+ params.g_pre_offset, params.b_pre_offset, params.r_gain, params.g_gain,
+ params.b_gain, params.r_post_offset, params.g_post_offset, params.b_post_offset,
+ Tempmode);
+
+ rval = this->exeSql(sql);
+ }
+ return rval;
+}
+
+int CPqData::PQ_ResetAllColorTemperatureParams(void) {
+ CSqlite::Cursor c;
+ char sqlmaster[512];
+
+ int rval = -1;
+
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select distinct TableName from GeneralWhiteBalanceTable ;");
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ do { //delete
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "delete from %s where def = 0;"
+ "insert into %s( Level , Enable , R_Pre_Offset, G_Pre_Offset, B_Pre_Offset, R_Gain, G_Gain, B_Gain, R_Post_Offset, G_Post_Offset, B_Post_Offset, def ) "
+ "select Level, Enable, R_Pre_Offset, G_Pre_Offset, B_Pre_Offset, R_Gain, G_Gain, B_Gain, R_Post_Offset, G_Post_Offset, B_Post_Offset, 0 from %s where def = 1;",
+ c.getString(index_TableName).string(), c.getString(index_TableName).string(),
+ c.getString(index_TableName).string());
+ rval = this->exeSql(sqlmaster);
+ } while (c.moveToNext());
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetDNLPParams(tvin_port_t source_port, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d,
+ tvin_trans_fmt_t trans_fmt, ve_dnlp_t *params, ve_dnlp_table_t *newParams, int *dnlpFlag) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+ //default
+ params->en = 0;
+ params->rt = VE_DNLP_RT_0S;
+ params->rl = VE_DNLP_RL_01;
+ params->black = VE_DNLP_EXT_00;
+ params->white = VE_DNLP_EXT_00;
+
+ mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);//(status << 16)|trans_fmt;
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralDNLPTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", source_port, fmt, mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ getSqlParams(__FUNCTION__, sqlmaster, "select value from %s ",
+ c.getString(index_TableName).string());
+
+ rval = this->select(sqlmaster, c);
+ int count = c.getCount();
+ if (count == 1) {
+ int val;
+ c.moveToFirst();
+ val = c.getInt(0);//index 0
+ *dnlpFlag = 0;
+ params->en = (val & 0xf0000000) >> 28;
+ params->rt = (ve_dnlp_rt_e)((val & 0x0f000000) >> 24);
+ params->rl = (ve_dnlp_rl_e)((val & 0x00ff0000) >> 16);
+ params->black = (ve_dnlp_ext_e)((val & 0x0000ff00) >> 8);
+ params->white = (ve_dnlp_ext_e)((val & 0x000000ff) >> 0);
+ } else if (count > 1) {
+ c.moveToFirst();
+ c.moveToNext();
+ *dnlpFlag = 1;
+ newParams->en = c.getInt(0);
+ c.moveToNext();
+ newParams->method = c.getInt(0);
+ c.moveToNext();
+ newParams->cliprate = c.getInt(0);
+ c.moveToNext();
+ newParams->lowrange = c.getInt(0);
+ c.moveToNext();
+ newParams->hghrange = c.getInt(0);
+ c.moveToNext();
+ newParams->lowalpha = c.getInt(0);
+ c.moveToNext();
+ newParams->midalpha = c.getInt(0);
+ c.moveToNext();
+ newParams->hghalpha = c.getInt(0);
+ c.moveToNext();
+ newParams->adj_level = c.getInt(0);
+ c.moveToNext();
+ newParams->new_adj_level = c.getInt(0);
+ c.moveToNext();
+ newParams->new_mvreflsh = c.getInt(0);
+ c.moveToNext();
+ newParams->new_gmma_rate = c.getInt(0);
+ c.moveToNext();
+ newParams->new_lowalpha = c.getInt(0);
+ c.moveToNext();
+ newParams->new_hghalpha = c.getInt(0);
+ c.moveToNext();
+ newParams->new_sbgnbnd = c.getInt(0);
+ c.moveToNext();
+ newParams->new_sendbnd = c.getInt(0);
+ c.moveToNext();
+ newParams->new_clashBgn = c.getInt(0);
+ c.moveToNext();
+ newParams->new_clashEnd = c.getInt(0);
+ c.moveToNext();
+ newParams->new_cliprate = c.getInt(0);
+ c.moveToNext();
+ newParams->new_mtdbld_rate = c.getInt(0);
+ c.moveToNext();
+ newParams->new_blkgma_rate = c.getInt(0);
+ }
+ }
+ return rval;
+}
+
+int CPqData::PQ_SetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int osd0,
+ int osd25, int osd50, int osd75, int osd100) {
+ return SetNonlinearMapping(TVPQ_DATA_BRIGHTNESS, source_type, osd0, osd25, osd50, osd75, osd100);
+}
+int CPqData::PQ_GetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int *osd0,
+ int *osd25, int *osd50, int *osd75, int *osd100) {
+ int osdvalue[5] = { 0 };
+ int rval;
+ rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_BRIGHTNESS, source_type, osdvalue);
+ *osd0 = osdvalue[0];
+ *osd25 = osdvalue[1];
+ *osd50 = osdvalue[2];
+ *osd75 = osdvalue[3];
+ *osd100 = osdvalue[4];
+ if (rval) {
+ LOGE("PQ_GetNoLineAllBrightnessParams Error %d\n", rval);
+ }
+ return rval;
+
+}
+
+int CPqData::PQ_GetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params) {
+ int val;
+
+ GetNonlinearMapping(TVPQ_DATA_BRIGHTNESS, source_port, level, &val);
+ *params = CaculateLevelParam(pq_bri_data, bri_nodes, val);
+ return 0;
+
+}
+int CPqData::PQ_SetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) {
+ return 0;
+}
+
+int CPqData::PQ_SetNoLineAllContrastParams(tv_source_input_type_t source_type, int osd0, int osd25,
+ int osd50, int osd75, int osd100) {
+ return SetNonlinearMapping(TVPQ_DATA_CONTRAST, source_type, osd0, osd25, osd50, osd75, osd100);
+}
+int CPqData::PQ_GetNoLineAllContrastParams(tv_source_input_type_t source_type, int *osd0,
+ int *osd25, int *osd50, int *osd75, int *osd100) {
+ int osdvalue[5] = { 0 };
+ int rval;
+ rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_CONTRAST, source_type, osdvalue);
+ *osd0 = osdvalue[0];
+ *osd25 = osdvalue[1];
+ *osd50 = osdvalue[2];
+ *osd75 = osdvalue[3];
+ *osd100 = osdvalue[4];
+ if (rval) {
+ LOGE("PQ_GetNoLineAllContrastParams Error %d\n", rval);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params) {
+ int val;
+ GetNonlinearMapping(TVPQ_DATA_CONTRAST, source_port, level, &val);
+ *params = CaculateLevelParam(pq_con_data, con_nodes, val);
+ return 0;
+}
+int CPqData::PQ_SetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) {
+ return 0;
+}
+
+int CPqData::PQ_SetNoLineAllSaturationParams(tv_source_input_type_t source_type, int osd0,
+ int osd25, int osd50, int osd75, int osd100) {
+ return SetNonlinearMapping(TVPQ_DATA_SATURATION, source_type, osd0, osd25, osd50, osd75, osd100);
+}
+int CPqData::PQ_GetNoLineAllSaturationParams(tv_source_input_type_t source_type, int *osd0,
+ int *osd25, int *osd50, int *osd75, int *osd100) {
+ int osdvalue[5] = { 0 };
+ int rval;
+ rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_SATURATION, source_type, osdvalue);
+ *osd0 = osdvalue[0];
+ *osd25 = osdvalue[1];
+ *osd50 = osdvalue[2];
+ *osd75 = osdvalue[3];
+ *osd100 = osdvalue[4];
+ if (rval) {
+ LOGE("PQ_GetNoLineAllSaturationParams Error %d\n", rval);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params) {
+ int val;
+ GetNonlinearMapping(TVPQ_DATA_SATURATION, source_port, level, &val);
+ *params = CaculateLevelParam(pq_sat_data, sat_nodes, val);
+ return 0;
+}
+int CPqData::PQ_SetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) {
+ return 0;
+}
+
+int CPqData::PQ_SetNoLineAllHueParams(tv_source_input_type_t source_type, int osd0, int osd25,
+ int osd50, int osd75, int osd100) {
+ return SetNonlinearMapping(TVPQ_DATA_HUE, source_type, osd0, osd25, osd50, osd75, osd100);
+}
+int CPqData::PQ_GetNoLineAllHueParams(tv_source_input_type_t source_type, int *osd0, int *osd25,
+ int *osd50, int *osd75, int *osd100) {
+ int osdvalue[5] = { 0 };
+ int rval;
+ rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_HUE, source_type, osdvalue);
+ *osd0 = osdvalue[0];
+ *osd25 = osdvalue[1];
+ *osd50 = osdvalue[2];
+ *osd75 = osdvalue[3];
+ *osd100 = osdvalue[4];
+ if (rval) {
+ LOGE("PQ_GetNoLineAllHueParams Error %d\n", rval);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params) {
+ int val;
+ GetNonlinearMapping(TVPQ_DATA_HUE, source_port, level, &val);
+ *params = CaculateLevelParam(pq_hue_data, hue_nodes, val);
+ return 0;
+}
+int CPqData::PQ_SetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) {
+ return 0;
+}
+
+int CPqData::PQ_SetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int osd0,
+ int osd25, int osd50, int osd75, int osd100) {
+ return SetNonlinearMapping(TVPQ_DATA_SHARPNESS, source_type, osd0, osd25, osd50, osd75, osd100);
+}
+int CPqData::PQ_GetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int *osd0,
+ int *osd25, int *osd50, int *osd75, int *osd100) {
+ int osdvalue[5] = { 0 };
+ int rval;
+ rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_SHARPNESS, source_type, osdvalue);
+ *osd0 = osdvalue[0];
+ *osd25 = osdvalue[1];
+ *osd50 = osdvalue[2];
+ *osd75 = osdvalue[3];
+ *osd100 = osdvalue[4];
+ if (rval) {
+ LOGE("PQ_GetNoLineAllSharpnessParams Error %d\n", rval);
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t *regs, am_regs_t *regs_l) {
+ int val;
+ GetNonlinearMapping(TVPQ_DATA_SHARPNESS, source_port, level, &val);
+ LOGD("val = %d\n", val);
+ *regs = CaculateLevelRegsParam(pq_sharpness_reg_data, val, 0);
+ if (sha_diff_flag == 6) {
+ *regs_l = CaculateLevelRegsParam(pq_sharpness_reg_data_1, val, 1);
+ }
+ return 0;
+}
+int CPqData::PQ_GetPLLParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs) {
+ int ret = -1;
+ int i = 0;
+
+ ret = getRegValuesByValue(ADC_SETTING, PORT, FORMAT, source_port, sig_fmt, regs);
+#ifdef CPQDB_DEBUG
+ if (ret == 0) {
+ for (i = 0; i < regs->length; i++) {
+ LOGD("%s, =================================================", "TV");
+ LOGD("%s, regData.am_reg[%d].type = %d", "TV", i, regs->am_reg[i].type);
+ LOGD("%s, regData.am_reg[%d].addr = %d", "TV", i, regs->am_reg[i].addr);
+ LOGD("%s, regData.am_reg[%d].mask = %d", "TV", i, regs->am_reg[i].mask);
+ LOGD("%s, regData.am_reg[%d].val = %d", "TV", i, regs->am_reg[i].val);
+ }
+ }
+#endif
+ if (regs->am_reg[0].val == 0 && regs->am_reg[1].val == 0 && regs->am_reg[2].val == 0
+ && regs->am_reg[3].val == 0) {
+ LOGE("%s,db's value is all zeros, that's not OK!!!\n", "TV");
+ return -1;
+ }
+ return ret;
+}
+int CPqData::PQ_GetCVD2Params(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs) {
+ int ret = -1;
+ int i = 0;
+ ret = getRegValuesByValue(CVD2_SETTING, PORT, FORMAT, source_port, sig_fmt, regs);
+#ifdef CPQDB_DEBUG
+ if (ret == 0) {
+ for (i = 0; i < regs->length; i++) {
+ LOGD("%s, =================================================", "TV");
+ LOGD("%s, regData.am_reg[%d].type = %d", "TV", i, regs->am_reg[i].type);
+ LOGD("%s, regData.am_reg[%d].addr = %d", "TV", i, regs->am_reg[i].addr);
+ LOGD("%s, regData.am_reg[%d].mask = %d", "TV", i, regs->am_reg[i].mask);
+ LOGD("%s, regData.am_reg[%d].val = %d", "TV", i, regs->am_reg[i].val);
+ }
+ }
+#endif
+ if (regs->am_reg[0].val == 0 && regs->am_reg[1].val == 0 && regs->am_reg[2].val == 0
+ && regs->am_reg[3].val == 0) {
+ LOGE("%s,db's value is all zeros, that's not OK!!!\n", "TV");
+ return -1;
+ }
+
+ return ret;
+}
+int CPqData::PQ_SetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t regs) {
+ return 0;
+}
+
+int CPqData::PQ_SetNoLineAllVolumeParams(tv_source_input_type_t source_type, int osd0, int osd25,
+ int osd50, int osd75, int osd100) {
+ return SetNonlinearMapping(TVPQ_DATA_VOLUME, source_type, osd0, osd25, osd50, osd75, osd100);
+}
+int CPqData::PQ_GetNoLineAllVolumeParams(tv_source_input_type_t source_type, int *osd0, int *osd25,
+ int *osd50, int *osd75, int *osd100) {
+ int osdvalue[5] = { 0 };
+ int rval;
+ rval = GetNonlinearMappingByOSDFac(TVPQ_DATA_VOLUME, source_type, osdvalue);
+ *osd0 = osdvalue[0];
+ *osd25 = osdvalue[1];
+ *osd50 = osdvalue[2];
+ *osd75 = osdvalue[3];
+ *osd100 = osdvalue[4];
+ if (rval) {
+ LOGE("PQ_GetNoLineAllSharpnessParams Error %d\n", rval);
+ }
+ return rval;
+}
+
+int CPqData::PQ_SetVolumeParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params) {
+ return 0;
+}
+
+int CPqData::PQ_ResetAllNoLineParams(void) {
+ int rval;
+ char sqlmaster[256];
+ char *err = NULL;
+
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "delete from NonlinearMapping; "
+ "insert into NonlinearMapping(TVIN_PORT, Item_ID, Level, Value) select TVIN_PORT, Item_ID, Level, Value from NonlinearMapping_Default;");
+
+ rval = this->exeSql(sqlmaster);
+ return rval;
+}
+
+int CPqData::PQ_GetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode,
+ tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d,
+ tvin_trans_fmt_t trans_fmt, int *params) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralNoiseReductionTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", source_port, sig_fmt, mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ getSqlParams(__FUNCTION__, sqlmaster, "select NRValue from %s where NRLevel = %d;",
+ c.getString(index_TableName).string(), (int) nr_mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ *params = c.getInt(0);
+ }
+ }
+ return rval;
+}
+
+int CPqData::PQ_SetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode,
+ tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d,
+ tvin_trans_fmt_t trans_fmt, int *params) {
+ return 0;
+}
+
+int CPqData::PQ_GetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, vpp_display_mode_t dmode,
+ tvin_cutwin_t *cutwin_t) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+
+ cutwin_t->hs = 0;
+ cutwin_t->he = 0;
+ cutwin_t->vs = 0;
+ cutwin_t->ve = 0;
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select Hs, He, Vs, Ve from OVERSCAN where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d ;", source_type, fmt, mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ cutwin_t->hs = c.getInt(0);
+ cutwin_t->he = c.getInt(1);
+ cutwin_t->vs = c.getInt(2);
+ cutwin_t->ve = c.getInt(3);
+ }
+ return rval;
+}
+int CPqData::PQ_SetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt,
+ is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, tvin_cutwin_t cutwin_t) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int mode = is2dOr3d;//Check2Dor3D(status, trans_fmt);
+ int rval = -1;
+
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "select * from OVERSCAN where TVIN_PORT = %d and TVIN_SIG_FMT = %d and TVIN_TRANS_FMT = %d;",
+ source_type, fmt, mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "update OVERSCAN set Hs = %d, He = %d, Vs = %d, Ve = %d where TVIN_PORT = %d and TVIN_SIG_FMT = %d and TVIN_TRANS_FMT = %d;",
+ cutwin_t.hs, cutwin_t.he, cutwin_t.vs, cutwin_t.ve, source_type, fmt, mode);
+ } else {
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "Insert into OVERSCAN(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, Hs, He, Vs, Ve) values(%d, %d, %d ,%d ,%d, %d, %d);",
+ source_type, fmt, mode, cutwin_t.hs, cutwin_t.he, cutwin_t.vs, cutwin_t.ve);
+ }
+ rval = this->exeSql(sqlmaster);
+
+ return rval;
+}
+
+int CPqData::PQ_ResetAllOverscanParams(void) {
+ int rval;
+ char sqlmaster[256];
+
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "delete from OVERSCAN; insert into OVERSCAN(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, hs, he, vs, ve) select TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, hs, he, vs, ve from OVERSCAN_default;");
+ rval = this->exeSql(sqlmaster);
+
+ return rval;
+}
+
+int CPqData::PQ_GetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode,
+ vpp_pq_para_t *params) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+
+ int rval = -1;
+
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR from Picture_Mode where "
+ "TVIN_PORT = %d and "
+ "Mode = %d ;", source_type, pq_mode);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ params->brightness = c.getInt(0);
+ params->contrast = c.getInt(1);
+ params->saturation = c.getInt(2);
+ params->hue = c.getInt(3);
+ params->sharpness = c.getInt(4);
+ params->backlight = c.getInt(5);
+ params->nr = c.getInt(6);
+ }
+ return rval;
+}
+int CPqData::PQ_SetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode,
+ vpp_pq_para_t *params) {
+ int rval;
+ char sql[256];
+
+ getSqlParams(
+ __FUNCTION__,
+ sql,
+ "update Picture_Mode set Brightness = %d, Contrast = %d, Saturation = %d, Hue = %d, Sharpness = %d, Backlight = %d, NR= %d "
+ " where TVIN_PORT = %d and Mode = %d;", params->brightness, params->contrast,
+ params->saturation, params->hue, params->sharpness, params->backlight, params->nr,
+ source_type, pq_mode);
+ rval = this->exeSql(sql);
+ return 0;
+}
+
+int CPqData::PQ_SetPQModeParamsByName(const char *name, tv_source_input_type_t source_type,
+ vpp_picture_mode_t pq_mode, vpp_pq_para_t *params) {
+ int rval;
+ char sql[256];
+
+ getSqlParams(__FUNCTION__, sql,
+ "insert into %s(TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR)"
+ " values(%d,%d,%d,%d,%d,%d,%d,%d,%d);", name, source_type, pq_mode,
+ params->brightness, params->contrast, params->saturation, params->hue,
+ params->sharpness, params->backlight, params->nr);
+
+ rval = this->exeSql(sql);
+ return 0;
+}
+
+int CPqData::PQ_ResetAllPQModeParams(void) {
+ int rval;
+ char sqlmaster[256];
+
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "delete from picture_mode; insert into picture_mode(TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR) select TVIN_PORT, Mode, Brightness, Contrast, Saturation, Hue, Sharpness, Backlight, NR from picture_mode_default;");
+
+ rval = this->exeSql(sqlmaster);
+ return rval;
+}
+
+int CPqData::PQ_GetGammaSpecialTable(int gammaValue, const char *f_name,
+ tcon_gamma_table_t *gamma_value) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int rval = -1;
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select %s from GAMMA_%d", f_name, gammaValue);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index = 0;
+ do {
+ gamma_value->data[index] = c.getInt(0);
+ index++;
+ } while (c.moveToNext());
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetGammaTableR(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt,
+ tcon_gamma_table_t *gamma_r) {
+ return PQ_GetGammaTable(panel_id, source_port, fmt, "Red", gamma_r);
+}
+
+int CPqData::PQ_GetGammaTableG(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt,
+ tcon_gamma_table_t *gamma_g) {
+ return PQ_GetGammaTable(panel_id, source_port, fmt, "Green", gamma_g);
+}
+
+int CPqData::PQ_GetGammaTableB(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt,
+ tcon_gamma_table_t *gamma_b) {
+ return PQ_GetGammaTable(panel_id, source_port, fmt, "Blue", gamma_b);
+}
+
+int CPqData::PQ_GetGammaTable(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt,
+ const char *f_name, tcon_gamma_table_t *val) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+
+ int rval = -1;
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select TableName from GeneralGammaTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d;", source_port, fmt);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ int index_TableName = 0;//c.getColumnIndex("TableName");
+ getSqlParams(__FUNCTION__, sqlmaster, "select %s from %s;", f_name,
+ c.getString(index_TableName).string());
+
+ rval = this->select(sqlmaster, c);
+ if (c.moveToFirst()) {
+ int index = 0;
+ do {
+ val->data[index] = c.getInt(0);
+ index++;
+ } while (c.moveToNext());
+ }
+ }
+ return rval;
+}
+
+int CPqData::PQ_GetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t *adjparam) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int rval = -1;
+
+ adjparam->clk_step = 0;
+ adjparam->phase = 0;
+ adjparam->hpos_step = 0;
+ adjparam->vpos_step = 0;
+ adjparam->vga_in_clean = 0;
+
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "select Clk, Phase, HPos, VPos, Vga_in_clean from VGA_AutoParams where TVIN_SIG_FMT = %d",
+ vga_fmt);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ adjparam->clk_step = c.getInt(0);
+ adjparam->phase = c.getInt(1);
+ adjparam->hpos_step = c.getInt(2);
+ adjparam->vpos_step = c.getInt(3);
+ adjparam->vga_in_clean = c.getInt(4);
+ }
+ return rval;
+}
+int CPqData::PQ_SetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t adjparam) {
+ CSqlite::Cursor c;
+ char sql[256];
+ int rval = -1;
+
+ getSqlParams(__FUNCTION__, sql, "select * from VGA_AutoParams where TVIN_SIG_FMT = %d;",
+ vga_fmt);
+
+ rval = this->select(sql, c);
+
+ if (c.moveToFirst()) {
+ getSqlParams(
+ __FUNCTION__,
+ sql,
+ "Insert into VGA_AutoParams(TVIN_SIG_FMT, Clk, Phase, HPos, VPos, Vga_in_clean) values(%d, %d, %d ,%d ,%d, %d);",
+ vga_fmt, adjparam.clk_step, adjparam.phase, adjparam.hpos_step, adjparam.vpos_step,
+ adjparam.vga_in_clean);
+ } else {
+ getSqlParams(
+ __FUNCTION__,
+ sql,
+ "update VGA_AutoParams set Clk = %d, Phase = %d, HPos = %d, VPos = %d, Vga_in_clean = %d where TVIN_SIG_FMT = %d;",
+ adjparam.clk_step, adjparam.phase, adjparam.hpos_step, adjparam.vpos_step,
+ adjparam.vga_in_clean, vga_fmt);
+ }
+ rval = this->exeSql(sql);
+ return rval;
+}
+
+int CPqData::CaculateLevelParam(tvpq_data_t *pq_data, int nodes, int level) {
+ int i;
+
+ for (i = 0; i < nodes; i++) {
+ if (level < pq_data[i].IndexValue) {
+ break;
+ }
+ }
+
+ if (i == 0) {
+ return pq_data[i].RegValue;
+ } else if (i == nodes) {
+ return pq_data[i - 1].RegValue;
+ } else {
+ return pq_data[i - 1].RegValue + (level - pq_data[i - 1].IndexValue) * pq_data[i - 1].step;
+ }
+}
+
+am_regs_t CPqData::CaculateLevelRegsParam(tvpq_sharpness_regs_t *pq_regs, int level, int flag) {
+ am_regs_t regs;
+ int i;
+ int *pq_nodes = NULL;
+ if (flag && sha_diff_flag == 6) {
+ pq_nodes = &sha_nodes_1;
+ } else {
+ pq_nodes = &sha_nodes;
+ }
+
+ for (i = 0; i < *pq_nodes; i++) {
+ if (level < pq_regs[i].reg_data[0].IndexValue) {
+ break;
+ }
+ }
+
+ if (i == 0) {
+ regs.length = pq_regs[i].length;
+ for (int j = 0; j < pq_regs[i].length; j++) {
+ regs.am_reg[j].type = pq_regs[i].reg_data[j].Value.type;
+ regs.am_reg[j].addr = pq_regs[i].reg_data[j].Value.addr;
+ regs.am_reg[j].mask = pq_regs[i].reg_data[j].Value.mask;
+ regs.am_reg[j].val = pq_regs[i].reg_data[j].Value.val;
+ }
+
+ } else if (i == *pq_nodes) {
+ regs.length = pq_regs[i - 1].length;
+ for (int j = 0; j < pq_regs[i - 1].length; j++) {
+ regs.am_reg[j].type = pq_regs[i - 1].reg_data[j].Value.type;
+ regs.am_reg[j].addr = pq_regs[i - 1].reg_data[j].Value.addr;
+ regs.am_reg[j].mask = pq_regs[i - 1].reg_data[j].Value.mask;
+ regs.am_reg[j].val = pq_regs[i - 1].reg_data[j].Value.val;
+ }
+ } else {
+ regs.length = pq_regs[i - 1].length;
+ for (int j = 0; j < pq_regs[i - 1].length; j++) {
+ regs.am_reg[j].type = pq_regs[i - 1].reg_data[j].Value.type;
+ regs.am_reg[j].addr = pq_regs[i - 1].reg_data[j].Value.addr;
+ regs.am_reg[j].mask = pq_regs[i - 1].reg_data[j].Value.mask;
+ regs.am_reg[j].val = pq_regs[i - 1].reg_data[j].Value.val + (level
+ - pq_regs[i - 1].reg_data[j].IndexValue) * pq_regs[i - 1].reg_data[j].step;
+ }
+ }
+
+ return regs;
+}
+
+int CPqData::GetNonlinearMapping(tvpq_data_type_t data_type, tvin_port_t source_port, int level,
+ int *params) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int rval = -1;
+
+ tv_source_input_type_t type;
+ //showboz
+ type = CTvin::Tvin_SourcePortToSourceInputType(source_port);//???
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select Value from NonlinearMapping where "
+ "TVIN_PORT = %d and "
+ "Item_ID = %d and "
+ "Level = %d ;", type, data_type, level);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ *params = c.getInt(0);
+ }
+ return rval;
+}
+
+int CPqData::GetNonlinearMappingByOSDFac(tvpq_data_type_t data_type,
+ tv_source_input_type_t source_type, int *params) {
+ CSqlite::Cursor c;
+ char sqlmaster[256];
+ int rval = -1;
+
+ getSqlParams(__FUNCTION__, sqlmaster, "select Value from NonlinearMapping where "
+ "TVIN_PORT = %d and "
+ "Item_ID = %d and ("
+ "Level = 0 or Level = 25 or Level = 50 or Level = 75 or Level = 100);", source_type,
+ data_type);
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ params[0] = c.getInt(0);
+ params[1] = c.getInt(1);
+ params[2] = c.getInt(2);
+ params[3] = c.getInt(3);
+ params[4] = c.getInt(4);
+ }
+ return rval;
+}
+
+int CPqData::SetNonlinearMapping(tvpq_data_type_t data_type, tv_source_input_type_t source_type,
+ int osd0, int osd25, int osd50, int osd75, int osd100) {
+
+ int rval;
+ char *err = NULL;
+ int osdvalue[101];
+ double step[4];
+ char sql[256];
+
+ step[0] = (osd25 - osd0) / 25.0;
+ step[1] = (osd50 - osd25) / 25.0;
+ step[2] = (osd75 - osd50) / 25.0;
+ step[3] = (osd100 - osd75) / 25.0;
+
+ for (int i = 0; i <= 100; i++) {
+ if (i == 0) {
+ osdvalue[i] = osd0;
+ } else if ((i > 0) && (i <= 25)) {
+ osdvalue[i] = osd0 + (int) (i * step[0]);
+ } else if ((i > 25) && (i <= 50)) {
+ osdvalue[i] = osd25 + (int) ((i - 25) * step[1]);
+ } else if ((i > 50) && (i <= 75)) {
+ osdvalue[i] = osd50 + (int) ((i - 50) * step[2]);
+ } else if ((i > 75) && (i <= 100)) {
+ osdvalue[i] = osd75 + (int) ((i - 75) * step[3]);
+ }
+ getSqlParams(
+ __FUNCTION__,
+ sql,
+ "update NonLinearMapping set Value = %d where TVIN_PORT = %d and Item_ID = %d and Level = %d ;",
+ osdvalue[i], source_type, data_type, i);
+ if (!(this->exeSql(sql))) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+int CPqData::SetNonlinearMappingByName(const char *name, tvpq_data_type_t data_type,
+ tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100) {
+ int rval;
+ char *err = NULL;
+ int osdvalue[101];
+ double step[4];
+ char sql[256];
+
+ step[0] = (osd25 - osd0) / 25.0;
+ step[1] = (osd50 - osd25) / 25.0;
+ step[2] = (osd75 - osd50) / 25.0;
+ step[3] = (osd100 - osd75) / 25.0;
+
+ for (int i = 0; i <= 100; i++) {
+ if (i == 0) {
+ osdvalue[i] = osd0;
+ } else if ((i > 0) && (i <= 25)) {
+ osdvalue[i] = osd0 + (int) (i * step[0]);
+ } else if ((i > 25) && (i <= 50)) {
+ osdvalue[i] = osd25 + (int) ((i - 25) * step[1]);
+ } else if ((i > 50) && (i <= 75)) {
+ osdvalue[i] = osd50 + (int) ((i - 50) * step[2]);
+ } else if ((i > 75) && (i <= 100)) {
+ osdvalue[i] = osd75 + (int) ((i - 75) * step[3]);
+ }
+ memset(sql, '\0', 256);
+ getSqlParams(__FUNCTION__, sql,
+ "insert into %s(TVIN_PORT, Item_ID, Level, Value) values(%d,%d,%d,%d);", name,
+ source_type, data_type, i, osdvalue[i]);
+ if (!(this->exeSql(sql))) {
+ return -1;
+ }
+ }
+ return 0;
+}
+int CPqData::getSharpnessFlag() {
+ return sha_diff_flag;
+}
+
+int CPqData::loadSharpnessData(char *sqlmaster, char *table_name) {
+ LOGD("%s, table_name: %s, sqlmaster: %s\n", __FUNCTION__, table_name, sqlmaster);
+ CSqlite::Cursor c;
+ int rval;
+ int *pq_nodes = NULL;
+ int temp_flag = 0;
+
+ if (!strncmp("Sharpness_0", table_name, 11)) {//for gxtvbb:Sharpness_0_***
+ sha_diff_flag = sha_diff_flag | 2;
+ pq_nodes = &sha_nodes;
+ temp_flag = 2;
+ } else if (!strncmp("Sharpness_1", table_name, 11)) {//for gxtvbb:Sharpness_1_***
+ sha_diff_flag = sha_diff_flag | 4;
+ pq_nodes = &sha_nodes_1;
+ temp_flag = 4;
+ } else {//for g9:Sharpness_G9_***
+ sha_diff_flag = 1;
+ pq_nodes = &sha_nodes;
+ temp_flag = 1;
+ }
+ LOGD("%s, sha_diff_flag: %d, temp_flag: %d\n", __FUNCTION__, sha_diff_flag, temp_flag);
+
+ rval = this->select(sqlmaster, c);
+ int length = 0;
+ int index = 0;
+ if ((temp_flag == 1) || (temp_flag == 2)) {
+ if (c.moveToFirst()) {
+ *pq_nodes = c.getInt(0);//TotalNode?
+ length = c.getCount() / (*pq_nodes);
+ for (int i = 0; i < *pq_nodes; i++) {
+ pq_sharpness_reg_data[i].length = length;
+ }
+ do {
+ pq_sharpness_reg_data[index / length].reg_data[index % length].TotalNode
+ = c.getInt(0);
+ pq_sharpness_reg_data[index / length].reg_data[index % length].NodeValue
+ = c.getInt(1);
+ pq_sharpness_reg_data[index / length].reg_data[index % length].Value.type
+ = c.getUInt(2);
+ pq_sharpness_reg_data[index / length].reg_data[index % length].Value.addr
+ = c.getUInt(3);
+ pq_sharpness_reg_data[index / length].reg_data[index % length].Value.mask
+ = c.getUInt(4);
+ pq_sharpness_reg_data[index / length].reg_data[index % length].IndexValue
+ = c.getInt(5);
+ pq_sharpness_reg_data[index / length].reg_data[index % length].Value.val
+ = c.getUInt(6);
+ pq_sharpness_reg_data[index / length].reg_data[index % length].step = c.getF(7);
+ index++;
+ } while (c.moveToNext());
+ }
+ } else if (temp_flag == 4) {
+ if (c.moveToFirst()) {
+ *pq_nodes = c.getInt(0);//TotalNode?
+ length = c.getCount() / (*pq_nodes);
+ for (int i = 0; i < *pq_nodes; i++) {
+ pq_sharpness_reg_data_1[i].length = length;
+ }
+ do {
+ pq_sharpness_reg_data_1[index / length].reg_data[index % length].TotalNode
+ = c.getInt(0);
+ pq_sharpness_reg_data_1[index / length].reg_data[index % length].NodeValue
+ = c.getInt(1);
+ pq_sharpness_reg_data_1[index / length].reg_data[index % length].Value.type
+ = c.getUInt(2);
+ pq_sharpness_reg_data_1[index / length].reg_data[index % length].Value.addr
+ = c.getUInt(3);
+ pq_sharpness_reg_data_1[index / length].reg_data[index % length].Value.mask
+ = c.getUInt(4);
+ pq_sharpness_reg_data_1[index / length].reg_data[index % length].IndexValue
+ = c.getInt(5);
+ pq_sharpness_reg_data_1[index / length].reg_data[index % length].Value.val
+ = c.getUInt(6);
+ pq_sharpness_reg_data_1[index / length].reg_data[index % length].step = c.getF(7);
+ index++;
+ } while (c.moveToNext());
+ }
+ }
+ return rval;
+}
+
+int CPqData::LoadPQData(tvpq_data_type_t data_type, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag) {
+ CSqlite::Cursor c;
+ int rval;
+ char sqlmaster[256];
+ char table_name[128];
+ int mode = is2dOr3d;
+ tvpq_data_t *pq_data = NULL;
+ int *pq_nodes = NULL;
+
+ switch (data_type) {
+ case TVPQ_DATA_BRIGHTNESS:
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select TableName from GeneralContrastBrightnessTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d and "
+ "%s = %d;", source_port, sig_fmt, mode, ID_FIELD, BRIGHTNESS_ID);
+ pq_data = pq_bri_data;
+ pq_nodes = &bri_nodes;
+ break;
+ case TVPQ_DATA_CONTRAST:
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select TableName from GeneralContrastBrightnessTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d and "
+ "%s = %d;", source_port, sig_fmt, mode, ID_FIELD, CONTRAST_ID);
+ pq_data = pq_con_data;
+ pq_nodes = &con_nodes;
+ break;
+ case TVPQ_DATA_HUE:
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select TableName from GeneralSaturationHueTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d and "
+ "%s = %d;", source_port, sig_fmt, mode, ID_FIELD, HUE_ID);
+ pq_data = pq_hue_data;
+ pq_nodes = &hue_nodes;
+ break;
+ case TVPQ_DATA_SATURATION:
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select TableName from GeneralSaturationHueTable where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d and "
+ "%s = %d;", source_port, sig_fmt, mode, ID_FIELD, SATURATION_ID);
+ pq_data = pq_sat_data;
+ pq_nodes = &sat_nodes;
+ break;
+ case TVPQ_DATA_SHARPNESS:
+ //sprintf(sqlmaster, "select TableName from GeneralSharpnessTable where "
+ getSqlParams(__FUNCTION__,sqlmaster,
+ "select TableName from GeneralSharpnessG9Table where "
+ "TVIN_PORT = %d and "
+ "TVIN_SIG_FMT = %d and "
+ "TVIN_TRANS_FMT = %d and "
+ "%s = %d;", source_port, sig_fmt, mode, ID_FIELD, SHARPNESS_ID);
+ pq_data = NULL;
+ pq_nodes = &sha_nodes;
+ break;
+ default:
+ break;
+ }
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ switch (data_type) {
+ case TVPQ_DATA_BRIGHTNESS:
+ case TVPQ_DATA_CONTRAST:
+ case TVPQ_DATA_HUE:
+ case TVPQ_DATA_SATURATION:
+ getSqlParams(
+ __FUNCTION__,
+ sqlmaster,
+ "select TotalNode, NodeNumber, IndexValue, RegValue, StepUp from %s order by NodeNumber asc;",
+ c.getString(0).string());
+ break;
+ case TVPQ_DATA_SHARPNESS:
+ do {
+ getSqlParams(__FUNCTION__, sqlmaster,
+ "select TotalNode, NodeNumber, RegType, RegAddr, RegMask,"
+ "IndexValue, RegValue, StepUp from %s order by NodeNumber asc;",
+ c.getString(0).string());
+ c.getString(table_name, 0);
+ rval = loadSharpnessData(sqlmaster, table_name);
+ } while (c.moveToNext());
+ return rval;
+ default:
+ break;
+ }
+ }
+
+ rval = this->select(sqlmaster, c);
+
+ if (c.moveToFirst()) {
+ if (data_type != TVPQ_DATA_SHARPNESS) {
+ int index = 0;
+ do {
+ pq_data[index].TotalNode = c.getInt(0);
+ pq_data[index].NodeValue = c.getInt(1);
+ pq_data[index].IndexValue = c.getInt(2);
+ pq_data[index].RegValue = c.getInt(3);
+ pq_data[index].step = c.getF(4);
+ if (flag == 1) {
+ if (data_type == TVPQ_DATA_BRIGHTNESS) {
+ LOGD("%s, bri pq_data[%d].RegValue = %d\n", "TV", index,
+ pq_data[index].RegValue);
+ pq_data[index].RegValue -= 64;
+ LOGD("%s, bri pq_data[%d].RegValue + 64 = %d\n", "TV", index,
+ pq_data[index].RegValue);
+ } else if (data_type == TVPQ_DATA_CONTRAST) {
+ LOGD("%s, con pq_data[%d].RegValue = %d\n", "TV", index,
+ pq_data[index].RegValue);
+ pq_data[index].RegValue += 64;
+ LOGD("%s, con pq_data[%d].RegValue + 64 = %d\n", "TV", index,
+ pq_data[index].RegValue);
+ }
+ }
+ index++;
+ } while (c.moveToNext());
+ *pq_nodes = index;
+ }
+ }
+
+ return rval;
+}
+
+int CPqData::LoadAllPQData(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d,
+ tvin_trans_fmt_t trans_fmt, int flag) {
+ int rval = -1;
+ rval = LoadPQData(TVPQ_DATA_BRIGHTNESS, source_port, sig_fmt, is2dOr3d, trans_fmt, flag);
+ if (rval) {
+ return rval;
+ }
+ rval = LoadPQData(TVPQ_DATA_CONTRAST, source_port, sig_fmt, is2dOr3d, trans_fmt, flag);
+ if (rval) {
+ return rval;
+ }
+ rval = LoadPQData(TVPQ_DATA_SATURATION, source_port, sig_fmt, is2dOr3d, trans_fmt, -1);
+ if (rval) {
+ return rval;
+ }
+ rval = LoadPQData(TVPQ_DATA_HUE, source_port, sig_fmt, is2dOr3d, trans_fmt, -1);
+ if (rval) {
+ return rval;
+ }
+ rval = LoadPQData(TVPQ_DATA_SHARPNESS, source_port, sig_fmt, is2dOr3d, trans_fmt, -1);
+ if (rval) {
+ return rval;
+ }
+ return rval;
+}
+
+typedef enum initial_type_e {
+ TYPE_PMode = 0,
+ TYPE_PMode_Default,
+ TYPE_Nonlinear,
+ TYPE_NonLinear_Default,
+ TYPE_VGA_AUTO,
+ TYPE_OVERSCAN,
+} initial_type_t;
+
+const char *Pmode_name[6] = { "Picture_Mode", "Picture_Mode_Default", "NonlinearMapping",
+ "NonlinearMapping_Default", "VGA_AutoParams", "OVERSCAN" };
+
+void CPqData::initialTable(int type) {
+ vpp_pq_para_t pmode_default;
+
+ pmode_default.backlight = 100;
+ pmode_default.brightness = 50;
+ pmode_default.contrast = 50;
+ pmode_default.hue = 50;
+ pmode_default.nr = 0;
+ pmode_default.saturation = 50;
+ pmode_default.sharpness = 50;
+
+ switch (type) {
+ case TYPE_PMode:
+ case TYPE_PMode_Default:
+ for (int i = 0; i < 6; i++) {
+ for (int j = 0; j < 4; j++) {
+ PQ_SetPQModeParamsByName(Pmode_name[type], (tv_source_input_type_t) i,
+ (vpp_picture_mode_t) j, &pmode_default);
+ }
+ }
+ break;
+ case TYPE_Nonlinear:
+ case TYPE_NonLinear_Default:
+ for (int i = 0; i < 6; i++) {
+ for (int j = 0; j < 5; j++) {
+ SetNonlinearMappingByName(Pmode_name[type], (tvpq_data_type_t) j,
+ (tv_source_input_type_t) i, 0, (int) 255 / 4.0, (int) 255 * 2 / 4.0,
+ (int) 255 * 3 / 4.0, 255);
+ }
+ }
+ break;
+ case TYPE_VGA_AUTO:
+ break;
+ case TYPE_OVERSCAN:
+ break;
+ }
+}
+
+/*
+ void CPqData::transferFixTable()
+ {
+ char sql[256];
+ char *err = NULL;
+ char **rsltReg = NULL;
+ int rval, rows, columns;
+ unsigned int tvin, sig, trans;
+ char tablename[256];
+
+ sprintf(sql, "Select TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, TableName from GeneralSharpnessTable where TableID = 0;");
+
+ rval = sqlite3_get_table(DB, sql, &rsltReg, &rows, &columns, &err);
+
+ if (rval) {
+ if (rsltReg != NULL) {
+ sqlite3_free_table(rsltReg);
+ rsltReg = NULL;
+ }
+ if (err != NULL) {
+ sqlite3_free(err);
+ err = NULL;
+ }
+ return;
+ } else {
+ for (int i = 1; i <= rows; i++) {
+ memset(sql, '\0', 256);
+
+ sscanf(rsltReg[i * columns], "%u", &tvin);
+ sscanf(rsltReg[i * columns + 1], "%u", &sig);
+ sscanf(rsltReg[i * columns + 2], "%u", &trans);
+ sscanf(rsltReg[i * columns + 3], "%s", tablename);
+
+ sprintf(sql, "insert into GeneralCommonTable(TVIN_PORT, TVIN_SIG_FMT, TVIN_TRANS_FMT, TableID, TableName) values(%d,%d,%d,0,\"%s\");",
+ tvin, sig, trans, tablename);
+ rval = sqlite3_exec(DB, sql, NULL, NULL, &err);
+ if (rval) {
+ if (err != NULL) {
+ sqlite3_free(err);
+ err = NULL;
+ }
+ return;
+ }
+ if (err != NULL) {
+ sqlite3_free(err);
+ err = NULL;
+ }
+ }
+ memset(sql, '\0', 256);
+ sprintf(sql, "delete from GeneralSharpnessTable where TableID = 0;");
+ rval = sqlite3_exec(DB, sql, NULL, NULL, &err);
+ if (rval) {
+ if (err != NULL) {
+ sqlite3_free(err);
+ err = NULL;
+ }
+ return;
+ }
+ if (err != NULL) {
+ sqlite3_free(err);
+ err = NULL;
+ }
+ }
+ }
+ */
+
+int CPqData::replacePqDb(const char *newFilePath) {
+
+ CFile::delFile( PQ_DB_PATH);
+ if (newFilePath == NULL) {
+ return 0;
+ } else {
+ LOGD("path = %s", newFilePath);
+ CFile file(newFilePath);
+ int ret = file.copyTo(PQ_DB_PATH);
+ system("sync");
+ return ret;
+ }
+}
+int CPqData::PQ_GetPhaseArray(am_phase_t *am_phase) {
+ CSqlite::Cursor c;
+ int iOutRet = 0;
+ char sqlmaster[256];
+ getSqlParams(__FUNCTION__, sqlmaster, "select Phase from Phase order by Format ASC; ");
+
+ this->select(sqlmaster, c);
+ int nums = 0;
+ am_phase->length = c.getCount();
+ if (c.moveToFirst()) {
+ do {
+ am_phase->phase[nums] = c.getInt(0);//col index is 0[Phase]
+ nums++;
+ } while (c.moveToNext());
+ }
+ //
+ return nums;
+}
+
diff --git a/tvapi/libtv/vpp/CPQdb.h b/tvapi/libtv/vpp/CPQdb.h
index 74aa5c9..972cbd7 100644
--- a/tvapi/libtv/vpp/CPQdb.h
+++ b/tvapi/libtv/vpp/CPQdb.h
@@ -1,160 +1,180 @@
-/*
- * CPQdb.h
- *
- * Created on: 2011-12-13
- * Author: casey
- */
-
-#ifndef CPQDB_H_
-#define CPQDB_H_
-
-#define PQ_NO_ANDROID 0
-
-
-#if (PQ_NO_ANDROID == 1)
-#include "sqlite3.h"
-#else
-#include "../../sqlite/dist/sqlite3.h"
-#endif
-#include "tvutils/CFile.h"
-#include "../tvin/CTvin.h"
-#include "CVpp.h"
-#include "tvutils/CSqlite.h"
-
-typedef enum tvpq_data_type_e {
- TVPQ_DATA_BRIGHTNESS,
- TVPQ_DATA_CONTRAST,
- TVPQ_DATA_SATURATION,
- TVPQ_DATA_HUE,
- TVPQ_DATA_SHARPNESS,
- TVPQ_DATA_VOLUME,
-
- TVPQ_DATA_MAX,
-} tvpq_data_type_t;
-
-typedef struct tvpq_data_s {
- int TotalNode;
- int NodeValue;
- int IndexValue;
- int RegValue;
- double step;
-} tvpq_data_t;
-
-typedef struct tvpq_sharpness_reg_s {
- int TotalNode;
- am_reg_t Value;
- int NodeValue;
- int IndexValue;
- double step;
-} tvpq_sharpness_reg_t;
-
-typedef struct tvpq_sharpness_regs_s {
- int length;
- tvpq_sharpness_reg_t reg_data[50];
-} tvpq_sharpness_regs_t;
-
-typedef struct tvpq_nonlinear_s {
- int osd0;
- int osd25;
- int osd50;
- int osd75;
- int osd100;
-} tvpq_nonlinear_t;
-
-
-class CPqData: public CSqlite {
-public:
- CPqData();
- ~CPqData();
- int PQ_GetColorDemoParams(vpp_color_demomode_t demomode, void *params);
- int PQ_GetBaseColorParams(vpp_color_basemode_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
- int PQ_GetCM2Params(vpp_color_management2_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
- int PQ_GetNR2Params(vpp_noise_reduction2_mode_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
- int PQ_GetXVYCCParams(vpp_xvycc_mode_t xvycc_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs, am_regs_t *regs_1);
- int PQ_GetMCDIParams(vpp_mcdi_mode_t mcdi_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
- int PQ_ColorTemperatureRGBogo2Params(void *params, tcon_rgb_ogo_t rgb_ogo);
- int PQ_ColorTemperatureParams2RGBogo(tcon_rgb_ogo_t *rgb_ogo, void *params);
- int PQ_GetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt,
- tcon_rgb_ogo_t *params);
- int PQ_SetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt,
- tcon_rgb_ogo_t params);
- int PQ_ResetAllColorTemperatureParams(void);
- int PQ_GetBacklightParams(tvin_port_t source_port, int level, int *params);
- int PQ_SetBacklightParams(tvin_port_t source_port, int level, int params);
- int PQ_SetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
- int PQ_GetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
- int PQ_GetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params);
- int PQ_SetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
- int PQ_SetNoLineAllContrastParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
- int PQ_GetNoLineAllContrastParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
- int PQ_GetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params);
- int PQ_SetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
- int PQ_SetNoLineAllSaturationParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
- int PQ_GetNoLineAllSaturationParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
- int PQ_GetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params);
- int PQ_SetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
- int PQ_SetNoLineAllHueParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
- int PQ_GetNoLineAllHueParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
- int PQ_GetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params);
- int PQ_SetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
- int PQ_SetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
- int PQ_GetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
- int PQ_GetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t *regs);
- int PQ_SetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t regs);
- int PQ_SetNoLineAllVolumeParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
- int PQ_GetNoLineAllVolumeParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
- int PQ_GetVolumeParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *length, int *params);
- int PQ_SetVolumeParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
- int PQ_ResetAllNoLineParams(void);
- int PQ_GetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params);
- int PQ_SetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params);
- int PQ_GetDNLPParams(tvin_port_t source_port, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, ve_dnlp_t *params, ve_dnlp_table_t *newParams, int *dnlpFlag);
- int PQ_GetBlackExtParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, ve_bext_t *params);
- int PQ_GetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, vpp_display_mode_t dmode, tvin_cutwin_t *cutwin_t);
- int PQ_SetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, tvin_cutwin_t cutwin_t);
- int PQ_ResetAllOverscanParams(void);
- int PQ_GetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params);
- int PQ_SetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params);
- int PQ_ResetAllPQModeParams(void);
- int PQ_GetGammaTableR(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_r);
- int PQ_GetGammaTableG(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_g);
- int PQ_GetGammaTableB(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_b);
- int PQ_GetGammaSpecialTable(int gammaValue, const char *f_name, tcon_gamma_table_t *gamma_r);
- int PQ_GetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t *adjparam);
- int PQ_SetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t adjparam);
- int PQ_GetPhaseArray(am_phase_t *am_phase);
- int PQ_GetPLLParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs);
- int PQ_GetCVD2Params(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs);
-
- int openDB();
- int closeDB();
- int getRegValues(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
- int getRegValuesByValue(const char *name, const char *f_name, const char *f2_name, const int val, const int val2, am_regs_t *regs);
- int getRegValuesByValue_long(const char *name, const char *f_name, const char *f2_name, const int val, const int val2, am_regs_t *regs, am_regs_t *regs_1);
- int LoadAllPQData(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag);
- void initialTable(int type);
- void transferFixTable();
-
-private:
- int CaculateLevelParam(tvpq_data_t *pq_data, int nodes, int level);
- am_regs_t CaculateLevelRegsParam(tvpq_sharpness_regs_t *pq_regs, int level);
- int GetNonlinearMapping(tvpq_data_type_t data_type, tvin_port_t source_port, int level, int *params);
- int GetNonlinearMappingByOSDFac(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int *params);
- int SetNonlinearMapping(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
- int LoadPQData(tvpq_data_type_t data_type, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag);
- int PQ_GetGammaTable(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, const char *f_name, tcon_gamma_table_t *val);
- int SetNonlinearMappingByName(const char *name, tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
- int PQ_SetPQModeParamsByName(const char *name, tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params);
-
- tvpq_data_t pq_bri_data[15];
- tvpq_data_t pq_con_data[15];
- tvpq_data_t pq_sat_data[15];
- tvpq_data_t pq_hue_data[15];
- tvpq_sharpness_regs_t pq_sharpness_reg_data[10];
- int bri_nodes;
- int con_nodes;
- int hue_nodes;
- int sat_nodes;
- int sha_nodes;
-};
-#endif
+/*
+ * CPQdb.h
+ *
+ * Created on: 2011-12-13
+ * Author: casey
+ */
+
+#ifndef CPQDB_H_
+#define CPQDB_H_
+
+#define PQ_NO_ANDROID 0
+
+
+#if (PQ_NO_ANDROID == 1)
+#include "sqlite3.h"
+#else
+#include "../../sqlite/dist/sqlite3.h"
+#endif
+#include "tvutils/CFile.h"
+#include "../tvin/CTvin.h"
+#include "CVpp.h"
+#include "tvutils/CSqlite.h"
+
+#define SQL_DEBUG 0
+#define getSqlParams(func, buffer, args...) \
+ do{\
+ sprintf(buffer, ##args);\
+ if(SQL_DEBUG){\
+ LOGD("getSqlParams for %s\n", func);\
+ LOGD("%s = %s\n",#buffer, buffer);\
+ }\
+ }while(0)
+
+
+typedef enum tvpq_data_type_e {
+ TVPQ_DATA_BRIGHTNESS,
+ TVPQ_DATA_CONTRAST,
+ TVPQ_DATA_SATURATION,
+ TVPQ_DATA_HUE,
+ TVPQ_DATA_SHARPNESS,
+ TVPQ_DATA_VOLUME,
+
+ TVPQ_DATA_MAX,
+} tvpq_data_type_t;
+
+typedef struct tvpq_data_s {
+ int TotalNode;
+ int NodeValue;
+ int IndexValue;
+ int RegValue;
+ double step;
+} tvpq_data_t;
+
+typedef struct tvpq_sharpness_reg_s {
+ int TotalNode;
+ am_reg_t Value;
+ int NodeValue;
+ int IndexValue;
+ double step;
+} tvpq_sharpness_reg_t;
+
+typedef struct tvpq_sharpness_regs_s {
+ int length;
+ tvpq_sharpness_reg_t reg_data[50];
+} tvpq_sharpness_regs_t;
+
+typedef struct tvpq_nonlinear_s {
+ int osd0;
+ int osd25;
+ int osd50;
+ int osd75;
+ int osd100;
+} tvpq_nonlinear_t;
+
+
+class CPqData: public CSqlite {
+public:
+ CPqData();
+ ~CPqData();
+ int PQ_GetColorDemoParams(vpp_color_demomode_t demomode, void *params);
+ int PQ_GetBaseColorParams(vpp_color_basemode_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
+ int PQ_GetCM2Params(vpp_color_management2_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
+ int PQ_GetNR2Params(vpp_noise_reduction2_mode_t basemode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
+ int PQ_GetXVYCCParams(vpp_xvycc_mode_t xvycc_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs, am_regs_t *regs_1);
+ int PQ_GetMCDIParams(vpp_mcdi_mode_t mcdi_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
+ int PQ_GetDeblockParams(vpp_deblock_mode_t mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
+ int PQ_ColorTemperatureRGBogo2Params(void *params, tcon_rgb_ogo_t rgb_ogo);
+ int PQ_ColorTemperatureParams2RGBogo(tcon_rgb_ogo_t *rgb_ogo, void *params);
+ int PQ_GetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt,
+ tcon_rgb_ogo_t *params);
+ int PQ_SetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt,
+ tcon_rgb_ogo_t params);
+ int PQ_ResetAllColorTemperatureParams(void);
+ int PQ_GetBacklightParams(tvin_port_t source_port, int level, int *params);
+ int PQ_SetBacklightParams(tvin_port_t source_port, int level, int params);
+ int PQ_SetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
+ int PQ_GetNoLineAllBrightnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
+ int PQ_GetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params);
+ int PQ_SetBrightnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
+ int PQ_SetNoLineAllContrastParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
+ int PQ_GetNoLineAllContrastParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
+ int PQ_GetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params);
+ int PQ_SetContrastParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
+ int PQ_SetNoLineAllSaturationParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
+ int PQ_GetNoLineAllSaturationParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
+ int PQ_GetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params);
+ int PQ_SetSaturationParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
+ int PQ_SetNoLineAllHueParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
+ int PQ_GetNoLineAllHueParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
+ int PQ_GetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int *params);
+ int PQ_SetHueParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
+ int PQ_SetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
+ int PQ_GetNoLineAllSharpnessParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
+ int PQ_GetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t *regs, am_regs_t *regs_l);
+ int PQ_SetSharpnessParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, am_regs_t regs);
+ int PQ_SetNoLineAllVolumeParams(tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
+ int PQ_GetNoLineAllVolumeParams(tv_source_input_type_t source_type, int *osd0, int *osd25, int *osd50, int *osd75, int *osd100);
+ int PQ_GetVolumeParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *length, int *params);
+ int PQ_SetVolumeParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int level, int params);
+ int PQ_ResetAllNoLineParams(void);
+ int PQ_GetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params);
+ int PQ_SetNoiseReductionParams(vpp_noise_reduction_mode_t nr_mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int *params);
+ int PQ_GetDNLPParams(tvin_port_t source_port, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, ve_dnlp_t *params, ve_dnlp_table_t *newParams, int *dnlpFlag);
+ int PQ_GetBlackExtParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, ve_bext_t *params);
+ int PQ_GetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, vpp_display_mode_t dmode, tvin_cutwin_t *cutwin_t);
+ int PQ_SetOverscanParams(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, tvin_cutwin_t cutwin_t);
+ int PQ_ResetAllOverscanParams(void);
+ int PQ_GetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params);
+ int PQ_SetPQModeParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params);
+ int PQ_ResetAllPQModeParams(void);
+ int PQ_GetGammaTableR(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_r);
+ int PQ_GetGammaTableG(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_g);
+ int PQ_GetGammaTableB(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, tcon_gamma_table_t *gamma_b);
+ int PQ_GetGammaSpecialTable(int gammaValue, const char *f_name, tcon_gamma_table_t *gamma_r);
+ int PQ_GetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t *adjparam);
+ int PQ_SetVGAAjustPara(tvin_sig_fmt_t vga_fmt, tvafe_vga_parm_t adjparam);
+ int PQ_GetPhaseArray(am_phase_t *am_phase);
+ int PQ_GetPLLParams(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs);
+ int PQ_GetCVD2Params(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, am_regs_t *regs);
+
+ int openPqDB(const char *);
+ int closeDB();
+ int reopenDB();
+ int getRegValues(const char *table_name, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, am_regs_t *regs);
+ int getRegValuesByValue(const char *name, const char *f_name, const char *f2_name, const int val, const int val2, am_regs_t *regs);
+ int getRegValuesByValue_long(const char *name, const char *f_name, const char *f2_name, const int val, const int val2, am_regs_t *regs, am_regs_t *regs_1);
+ int LoadAllPQData(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag);
+ void initialTable(int type);
+ void transferFixTable();
+ int replacePqDb(const char *newFilePath);
+ int getSharpnessFlag();
+
+private:
+ int CaculateLevelParam(tvpq_data_t *pq_data, int nodes, int level);
+ am_regs_t CaculateLevelRegsParam(tvpq_sharpness_regs_t *pq_regs, int level, int flag);
+ int GetNonlinearMapping(tvpq_data_type_t data_type, tvin_port_t source_port, int level, int *params);
+ int GetNonlinearMappingByOSDFac(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int *params);
+ int SetNonlinearMapping(tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
+ int LoadPQData(tvpq_data_type_t data_type, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is2dOr3d, tvin_trans_fmt_t trans_fmt, int flag);
+ int loadSharpnessData(char *sqlmaster, char *table_name);
+ int PQ_GetGammaTable(int panel_id, tvin_port_t source_port, tvin_sig_fmt_t fmt, const char *f_name, tcon_gamma_table_t *val);
+ int SetNonlinearMappingByName(const char *name, tvpq_data_type_t data_type, tv_source_input_type_t source_type, int osd0, int osd25, int osd50, int osd75, int osd100);
+ int PQ_SetPQModeParamsByName(const char *name, tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *params);
+
+ tvpq_data_t pq_bri_data[15];
+ tvpq_data_t pq_con_data[15];
+ tvpq_data_t pq_sat_data[15];
+ tvpq_data_t pq_hue_data[15];
+ tvpq_sharpness_regs_t pq_sharpness_reg_data[10];
+ tvpq_sharpness_regs_t pq_sharpness_reg_data_1[10];
+ int bri_nodes;
+ int con_nodes;
+ int hue_nodes;
+ int sat_nodes;
+ int sha_nodes;
+ int sha_nodes_1;
+ int sha_diff_flag;
+ char PQ_DB_PATH[256];
+};
+#endif
diff --git a/tvapi/libtv/vpp/CVpp.cpp b/tvapi/libtv/vpp/CVpp.cpp
index 78a4318..d3cfdc4 100644
--- a/tvapi/libtv/vpp/CVpp.cpp
+++ b/tvapi/libtv/vpp/CVpp.cpp
@@ -23,3689 +23,3591 @@
#undef LOG_TAG
#define LOG_TAG "CVpp"
#endif
-CVpp::CVpp()
-{
- vpp_amvideo_fd = -1;
- vpp_amvideo_3d_fd = -1;
- mpPqData = new CPqData();
+CVpp::CVpp() {
+ vpp_amvideo_fd = -1;
+ vpp_amvideo_3d_fd = -1;
+ mpPqData = new CPqData();
}
-CVpp::~CVpp()
-{
- if(mpPqData != NULL) {
- delete mpPqData;
- mpPqData = NULL;
- }
+CVpp::~CVpp() {
+ if (mpPqData != NULL) {
+ delete mpPqData;
+ mpPqData = NULL;
+ }
}
-int CVpp::Vpp_Init ( void )
-{
- if (mpPqData->openDB() ) {
- LOGW ( "%s, open pq failed!", __FUNCTION__ );
- } else {
- LOGD ( "%s, open pq success!", __FUNCTION__ );
- }
+int CVpp::Vpp_Init(const char *pq_db_path) {
+ LOGD("Vpp_Init pq_db_path = %s", pq_db_path);
+ if (mpPqData->openPqDB(pq_db_path)) {
+ LOGW("%s, open pq failed!", __FUNCTION__);
+ } else {
+ LOGD("%s, open pq success!", __FUNCTION__);
+ }
- int ret = -1;
- int backlight = 100;
- int offset_r = 0, offset_g = 0, offset_b = 0, gain_r = 1024, gain_g = 1024, gain_b = 1024;
+ int ret = -1;
+ int backlight = 100;
+ int offset_r = 0, offset_g = 0, offset_b = 0, gain_r = 1024, gain_g = 1024, gain_b = 1024;
- Vpp_GetVppConfig();
+ Vpp_GetVppConfig();
- ret = VPP_OpenModule();
- backlight = Tv_GetBacklight ( SOURCE_TYPE_TV );
+ ret = VPP_OpenModule();
+ backlight = GetBacklight(SOURCE_TYPE_TV);
- if ( mbVppCfg_backlight_init) {
- backlight = ( backlight + 100 ) * 255 / 200;
+ if (mbVppCfg_backlight_init) {
+ backlight = (backlight + 100) * 255 / 200;
- if ( backlight < 127 || backlight > 255 ) {
- backlight = 255;
- }
- }
+ if (backlight < 127 || backlight > 255) {
+ backlight = 255;
+ }
+ }
- Tv_SetBacklightWithoutSave ( backlight, SOURCE_TYPE_TV );
+ SetBacklight(backlight, SOURCE_TYPE_TV, 0);
- if ( SSMReadNonStandardValue() & 1 ) {
- Set_Fixed_NonStandard ( 0 ); //close
- } else {
- Set_Fixed_NonStandard ( 2 ); //open
- }
+ if (SSMReadNonStandardValue() & 1) {
+ Set_Fixed_NonStandard(0); //close
+ } else {
+ Set_Fixed_NonStandard(2); //open
+ }
- Tv_LoadVppSettings ( SOURCE_TYPE_MPEG, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D );
+ LoadVppSettings(SOURCE_TYPE_MPEG, TVIN_SIG_FMT_NULL, INDEX_2D, TVIN_TFMT_2D);
- return ret;
+ return ret;
}
-int CVpp::Vpp_Uninit ( void )
-{
- Vpp_ResetLastVppSettingsSourceType();
- VPP_CloseModule();
- mpPqData->closeDb();
- return 0;
+int CVpp::Vpp_Uninit(void) {
+ Vpp_ResetLastVppSettingsSourceType();
+ VPP_CloseModule();
+ mpPqData->closeDb();
+ return 0;
}
-CPqData *CVpp::getPqData()
-{
- return mpPqData;
+CPqData *CVpp::getPqData() {
+ return mpPqData;
}
-int CVpp::VPP_OpenModule ( void )
+int CVpp::doSuspend()
{
+ return mpPqData->closeDb();
+}
- if ( vpp_amvideo_fd < 0 ) {
- vpp_amvideo_fd = open ( VPP_DEV_PATH, O_RDWR );
+int CVpp::doResume()
+{
+ return mpPqData->reopenDB();
+}
+int CVpp::VPP_OpenModule(void) {
- LOGD ( "~~~open~~~##VPP_OpenModule##VPP_DEV_PATH : %s##" , VPP_DEV_PATH);
+ if (vpp_amvideo_fd < 0) {
+ vpp_amvideo_fd = open(VPP_DEV_PATH, O_RDWR);
- if ( vpp_amvideo_fd < 0 ) {
- LOGE ( "Open vpp module, error(%s)!\n", strerror ( errno ) );
- return -1;
- }
- }
+ LOGD("~~~open~~~##VPP_OpenModule##VPP_DEV_PATH : %s##", VPP_DEV_PATH);
+ if (vpp_amvideo_fd < 0) {
+ LOGE("Open vpp module, error(%s)!\n", strerror(errno));
+ return -1;
+ }
+ }
- if ( vpp_amvideo_3d_fd < 0 ) {
- vpp_amvideo_3d_fd = open ( VPP_3D_DEV_PATH, O_RDWR );
- LOGD ( "~~~open~~~##VPP_OpenModule##VPP_3D_DEV_PATH : %s##" , VPP_3D_DEV_PATH);
+ if (vpp_amvideo_3d_fd < 0) {
+ vpp_amvideo_3d_fd = open(VPP_3D_DEV_PATH, O_RDWR);
+ LOGD("~~~open~~~##VPP_OpenModule##VPP_3D_DEV_PATH : %s##", VPP_3D_DEV_PATH);
- if ( vpp_amvideo_3d_fd < 0 ) {
- LOGE ( "Open vpp 3d module, error(%s)!\n", strerror ( errno ) );
- return -1;
- }
- }
+ if (vpp_amvideo_3d_fd < 0) {
+ LOGE("Open vpp 3d module, error(%s)!\n", strerror(errno));
+ return -1;
+ }
+ }
- return vpp_amvideo_fd;
+ return vpp_amvideo_fd;
}
-int CVpp::VPP_CloseModule ( void )
-{
- if ( vpp_amvideo_fd >= 0 ) {
- close ( vpp_amvideo_fd );
- vpp_amvideo_fd = -1;
- }
+int CVpp::VPP_CloseModule(void) {
+ if (vpp_amvideo_fd >= 0) {
+ close ( vpp_amvideo_fd);
+ vpp_amvideo_fd = -1;
+ }
+ if (vpp_amvideo_3d_fd >= 0) {
+ close ( vpp_amvideo_3d_fd);
+ vpp_amvideo_3d_fd = -1;
+ }
- if ( vpp_amvideo_3d_fd >= 0 ) {
- close ( vpp_amvideo_3d_fd );
- vpp_amvideo_3d_fd = -1;
- }
+ return 0;
+}
+
+int CVpp::VPP_DeviceIOCtl(int request, ...) {
+ int tmp_ret = -1;
+ va_list ap;
+ void *arg;
+ va_start(ap, request);
+ arg = va_arg ( ap, void * );
+ va_end(ap);
+ tmp_ret = ioctl(vpp_amvideo_fd, request, arg);
+ return tmp_ret;
+}
+
+int CVpp::Vpp_LoadRegs(am_regs_t regs) {
+ LOGD("~~~VPP_DeviceIOCtl~~~##Vpp_LoadRegs##AMVECM_IOC_LOAD_REG##");
+
+ int count_retry = 20;
+ int rt = 0;
+ while (count_retry) {
+ rt = VPP_DeviceIOCtl(AMVECM_IOC_LOAD_REG, &regs);
+ if (rt < 0) {
+ LOGE("%s, error(%s), errno(%d)\n", __FUNCTION__, strerror(errno), errno);
+ if (errno == EBUSY) {
+ LOGE("%s, %s, retry...\n", __FUNCTION__, strerror(errno));
+ count_retry--;
+ continue;
+ }
+ break;
+ }
+ break;
+ }
- return 0;
+ return rt;
}
-
-int CVpp::VPP_DeviceIOCtl ( int request, ... )
-{
- int tmp_ret = -1;
- va_list ap;
- void *arg;
- va_start ( ap, request );
- arg = va_arg ( ap, void * );
- va_end ( ap );
- tmp_ret = ioctl ( vpp_amvideo_fd, request, arg );
- return tmp_ret;
+int CVpp::isPreviewWindow() {
+ char prop_value[PROPERTY_VALUE_MAX];
+ memset(prop_value, '\0', PROPERTY_VALUE_MAX);
+ property_get("tv.is.preview.window", prop_value, "false");
+ LOGD("%s, prop tv.is.preview.window is \"%s\".\n", __FUNCTION__, prop_value);
+ return (strcmp(prop_value, "true")==0) ? 1 : 0;
}
+int CVpp::LoadVppSettings(tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int val = 0, ret = -1;
+ vpp_color_temperature_mode_t temp_mode = VPP_COLOR_TEMPERATURE_MODE_STANDARD;
+ vpp_picture_mode_t pqmode = VPP_PICTURE_MODE_STANDARD;
+ vpp_display_mode_t dispmode = VPP_DISPLAY_MODE_169;
+ vpp_noise_reduction_mode_t nr_mode = VPP_NOISE_REDUCTION_MODE_MID;
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
-int CVpp::Vpp_LoadRegs ( am_regs_t regs )
-{
- int rt = VPP_DeviceIOCtl ( AMVECM_IOC_LOAD_REG, &regs );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##Vpp_LoadRegs##AMVECM_IOC_LOAD_REG##" );
+ if ((vpp_setting_last_source_type == source_type) && (vpp_setting_last_sig_fmt == sig_fmt)
+ /*&& ( vpp_setting_last_3d_status == status showbo mark)*/
+ && (vpp_setting_last_trans_fmt == trans_fmt)) {
+ return -1;
+ }
+
+ nr_mode = GetNoiseReductionMode(source_type);
+ ret |= Vpp_SetNoiseReductionMode(nr_mode, source_type, source_port, sig_fmt, is3d, trans_fmt);
+ ret |= Vpp_SetXVYCCMode(VPP_XVYCC_MODE_STANDARD, source_type, source_port, sig_fmt, is3d,
+ trans_fmt);
+ ret |= Vpp_SetMCDIMode(VPP_MCDI_MODE_STANDARD, source_type, source_port, sig_fmt, is3d,
+ trans_fmt);
+ ret |= Vpp_SetDeblockMode(VPP_DEBLOCK_MODE_MIDDLE, source_port, sig_fmt, is3d, trans_fmt);
+
+ Vpp_LoadDI(source_type, sig_fmt, is3d, trans_fmt);
+ Vpp_LoadBasicRegs(source_type, sig_fmt, is3d, trans_fmt);
+ Vpp_LoadGamma(source_type, sig_fmt);
+
+ ret |= Vpp_SetBaseColorMode(GetBaseColorMode(), source_port, sig_fmt, is3d, trans_fmt);
+
+ if (isPreviewWindow()) {
+ temp_mode = GetColorTemperature(SOURCE_TYPE_MPEG);
+ if (temp_mode == VPP_COLOR_TEMPERATURE_MODE_USER) {
+ ret |= Vpp_SetColorTemperatureUser(temp_mode, SOURCE_TYPE_MPEG);
+ } else {
+ CheckColorTemperatureParamAlldata(TVIN_PORT_HDMI0, sig_fmt, trans_fmt); // check colortmp backup data
+ ret |= Vpp_SetColorTemperature(temp_mode, SOURCE_TYPE_MPEG, source_port, sig_fmt, trans_fmt);
+ }
+ } else {
+ temp_mode = GetColorTemperature(source_type);
+ if (temp_mode == VPP_COLOR_TEMPERATURE_MODE_USER) {
+ ret |= Vpp_SetColorTemperatureUser(temp_mode, source_type);
+ } else {
+ CheckColorTemperatureParamAlldata(TVIN_PORT_HDMI0, sig_fmt, trans_fmt); // check colortmp backup data
+ ret |= Vpp_SetColorTemperature(temp_mode, source_type, source_port, sig_fmt, trans_fmt);
+ }
+ }
+
+ pqmode = GetPQMode(source_type);
+ ret |= Vpp_SetPQMode(pqmode, source_type, source_port, sig_fmt, is3d, trans_fmt);
- if ( rt < 0 ) {
- LOGE ( "Vpp_LoadRegs, error(%s)!\n", strerror ( errno ) );
- }
+ ret |= SetDNLP(source_type, source_port, sig_fmt, is3d, trans_fmt);
- return rt;
+ vpp_setting_last_source_type = source_type;
+ vpp_setting_last_sig_fmt = sig_fmt;
+ //showbo mark vpp_setting_last_3d_status = status;
+ vpp_setting_last_trans_fmt = trans_fmt;
+
+ return 0;
}
-int CVpp::Tv_LoadVppSettings ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- int val = 0, ret = -1;
- vpp_color_temperature_mode_t temp_mode = VPP_COLOR_TEMPERATURE_MODE_STANDARD;
- vpp_picture_mode_t pqmode = VPP_PICTURE_MODE_STANDARD;
- vpp_display_mode_t dispmode = VPP_DISPLAY_MODE_169;
- vpp_noise_reduction_mode_t nr_mode = VPP_NOISE_REDUCTION_MODE_MID;
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
+int CVpp::Vpp_GetVppConfig(void) {
+ const char *config_value;
+ int cfg_item_count = 0;
+ char *token = NULL;
+ const char *strDelimit = ",";
+ char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
- if ( ( vpp_setting_last_source_type == source_type )
- && ( vpp_setting_last_sig_fmt == sig_fmt )
- /*&& ( vpp_setting_last_3d_status == status showbo mark)*/
- && ( vpp_setting_last_trans_fmt == trans_fmt ) ) {
- return -1;
- }
+ config_value = config_get_str("TV", "vpp.pqmode.depend.bklight", "null");
- nr_mode = Tv_GetNoiseReductionMode ( source_type );
- ret |= Vpp_SetNoiseReductionMode ( nr_mode, source_type , source_port, sig_fmt, is3d, trans_fmt);
- ret |= Vpp_SetXVYCCMode( VPP_XVYCC_MODE_STANDARD, source_type, source_port, sig_fmt, is3d, trans_fmt );
- ret |= Vpp_SetMCDIMode( VPP_MCDI_MODE_STANDARD, source_type , source_port, sig_fmt, is3d, trans_fmt );
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_pqmode_depend_bklight = true;
+ } else {
+ mbVppCfg_pqmode_depend_bklight = false;
+ }
- Vpp_LoadBasicRegs ( source_type, sig_fmt, is3d, trans_fmt );
- Vpp_LoadGamma ( source_type, sig_fmt );
+ config_value = config_get_str("TV", "vpp.color.temp.bysource", "enable");
- ret |= Vpp_SetBaseColorMode ( Tv_GetBaseColorMode() , source_port, sig_fmt, is3d, trans_fmt);
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_colortemp_by_source = true;
+ } else {
+ mbVppCfg_colortemp_by_source = true;
+ }
- temp_mode = Tv_GetColorTemperature ( source_type );
+ config_value = config_get_str("TV", "vpp.panoroma.switch", "null");
- if ( temp_mode == VPP_COLOR_TEMPERATURE_MODE_USER ) {
- ret |= Vpp_SetColorTemperatureUser ( temp_mode, source_type );
- } else {
- CheckColorTemperatureParamAlldata(TVIN_PORT_HDMI0, sig_fmt, trans_fmt); // check colortmp backup data
- ret |= Vpp_SetColorTemperature ( temp_mode, source_type , source_port, sig_fmt, trans_fmt);
- }
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_panorama_switch = true;
+ } else {
+ mbVppCfg_panorama_switch = false;
+ }
- pqmode = Tv_GetPQMode ( source_type );
- ret |= Vpp_SetPQMode ( pqmode, source_type , source_port, sig_fmt, is3d, trans_fmt);
+ config_value = config_get_str("TV", "vpp.backlight.reverse", "null");
- ret |= Tv_SetDNLP(source_type , source_port, sig_fmt, is3d, trans_fmt);
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_backlight_reverse = true;
+ } else {
+ mbVppCfg_backlight_reverse = false;
+ }
- vpp_setting_last_source_type = source_type;
- vpp_setting_last_sig_fmt = sig_fmt;
- //showbo mark vpp_setting_last_3d_status = status;
- vpp_setting_last_trans_fmt = trans_fmt;
+ config_value = config_get_str("TV", "vpp.backlight.init", "null");
- return 0;
-}
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_backlight_init = true;
+ } else {
+ mbVppCfg_backlight_init = false;
+ }
+ config_value = config_get_str("TV", "vpp.pqwithout.hue", "null");
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_pqmode_without_hue = true;
+ } else {
+ mbVppCfg_pqmode_without_hue = false;
+ }
-int CVpp::Vpp_GetVppConfig ( void )
-{
- const char *config_value;
- int cfg_item_count = 0;
- char *token = NULL;
- const char *strDelimit = ",";
- char data_str[CC_CFG_VALUE_STR_MAX_LEN] = { 0 };
+ config_value = config_get_str("TV", "vpp.hue.reverse", "null");
+
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_hue_reverse = true;
+ } else {
+ mbVppCfg_hue_reverse = false;
+ }
- config_value = config_get_str ( "TV", "vpp.pqmode.depend.bklight", "null" );
+ config_value = config_get_str("TV", "vpp.gamma.onoff", "null");
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_pqmode_depend_bklight = true;
- } else {
- mbVppCfg_pqmode_depend_bklight = false;
- }
+ if (strcmp(config_value, "disable") == 0) {
+ mbVppCfg_gamma_onoff = true;
+ } else {
+ mbVppCfg_gamma_onoff = false;
+ }
+
+ config_value = config_get_str("TV", "vpp.whitebalance.same_param", "null");
- config_value = config_get_str ( "TV", "vpp.color.temp.bysource", "enable" );
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_whitebalance_sameparam = true;
+ } else {
+ mbVppCfg_whitebalance_sameparam = false;
+ }
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_colortemp_by_source = true;
- } else {
- mbVppCfg_colortemp_by_source = true;
- }
+ config_value = config_get_str("TV", "vpp.new.cm", "disable");
+
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_new_cm = true;
+ } else {
+ mbVppCfg_new_cm = false;
+ }
- config_value = config_get_str ( "TV", "vpp.panoroma.switch", "null" );
+ config_value = config_get_str("TV", "vpp.new.nr", "disable");
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_panorama_switch = true;
- } else {
- mbVppCfg_panorama_switch = false;
- }
+ if (strcmp(config_value, "enable") == 0) {
+ mbVppCfg_new_nr = true;
+ } else {
+ mbVppCfg_new_nr = false;
+ }
- config_value = config_get_str ( "TV", "vpp.backlight.reverse", "null" );
+ return 0;
+}
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_backlight_reverse = true;
- } else {
- mbVppCfg_backlight_reverse = false;
- }
+int CVpp::Vpp_LoadDI(tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ am_regs_t regs;
+ int ret = -1;
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
+ if (mpPqData->getRegValues("GeneralDITable", source_port, sig_fmt, is3d, trans_fmt, &regs) > 0) {
+ if (Vpp_LoadRegs(regs) < 0) {
+ LOGE("%s, Vpp_LoadRegs failed!\n", __FUNCTION__);
+ } else {
+ ret = 0;
+ }
+ } else {
+ LOGE("%s getRegValues failed!\n", "Vpp_LoadDI");
+ }
+ return ret;
+}
- config_value = config_get_str ( "TV", "vpp.backlight.init", "null" );
+int CVpp::Vpp_LoadBasicRegs(tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ am_regs_t regs;
+ int ret = -1, rangeRet = -1, formatRet = -1, enableFlag = -1;
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_backlight_init = true;
- } else {
- mbVppCfg_backlight_init = false;
- }
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
- config_value = config_get_str ( "TV", "vpp.pqwithout.hue", "null" );
+ if (mpPqData->getRegValues("GeneralCommonTable", source_port, sig_fmt, is3d, trans_fmt, &regs) > 0) {
+ if (Vpp_LoadRegs(regs) < 0) {
+ LOGE("%s, Vpp_LoadRegs failed!\n", __FUNCTION__);
+ } else {
+ ret = 0;
+ }
+ } else {
+ LOGE("%s getRegValues failed!\n", "Vpp_LoadBasicRegs");
+ }
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_pqmode_without_hue = true;
- } else {
- mbVppCfg_pqmode_without_hue = false;
- }
+ if (mpPqData->LoadAllPQData(source_port, sig_fmt, is3d, trans_fmt, enableFlag) == 0) {
+ ret = 0;
+ } else {
+ LOGE("%s, getPQData failed!\n", "Vpp_LoadBasicRegs");
+ ret = -1;
+ }
- config_value = config_get_str ( "TV", "vpp.hue.reverse", "null" );
+ return ret;
+}
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_hue_reverse = true;
- } else {
- mbVppCfg_hue_reverse = false;
- }
+int CVpp::Vpp_ResetLastVppSettingsSourceType(void) {
+ vpp_setting_last_source_type = SOURCE_TYPE_MAX;
+ vpp_setting_last_sig_fmt = TVIN_SIG_FMT_MAX;
+ //showbo mark vpp_setting_last_3d_status = STATUS3D_MAX;
+ vpp_setting_last_trans_fmt = TVIN_TFMT_3D_MAX;
+ return 0;
+}
- config_value = config_get_str ( "TV", "vpp.gamma.onoff", "null" );
+int CVpp::VPP3D_DeviceIOCtl(int request, ...) {
+ int tmp_ret = -1;
+ va_list ap;
+ void *arg;
- if ( strcmp ( config_value, "disable" ) == 0 ) {
- mbVppCfg_gamma_onoff = true;
- } else {
- mbVppCfg_gamma_onoff = false;
- }
+ if (vpp_amvideo_3d_fd >= 0) {
+ va_start(ap, request);
+ arg = va_arg ( ap, void * );
+ va_end(ap);
- config_value = config_get_str ( "TV", "vpp.whitebalance.same_param", "null" );
+ tmp_ret = ioctl(vpp_amvideo_3d_fd, request, arg);
+ return tmp_ret;
+ }
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_whitebalance_sameparam = true;
- } else {
- mbVppCfg_whitebalance_sameparam = false;
- }
+ return -1;
+}
- config_value = config_get_str ( "TV", "vpp.new.cm", "disable" );
+int CVpp::Vpp_GetPQModeValue(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode,
+ vpp_pq_para_t *pq_para) {
+ vpp_pq_para_t parms;
+ vpp_picture_mode_t real_pq_mode;
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_new_cm = true;
- } else {
- mbVppCfg_new_cm = false;
- }
+ if (pq_para == NULL) {
+ return -1;
+ }
- config_value = config_get_str ( "TV", "vpp.new.nr", "disable" );
+ if (pq_mode == VPP_PICTURE_MODE_MOVIE) {
+ real_pq_mode = VPP_PICTURE_MODE_SOFT;
+ } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) {
+ real_pq_mode = VPP_PICTURE_MODE_BRIGHT;
+ } else {
+ real_pq_mode = pq_mode;
+ }
+ if (mpPqData->PQ_GetPQModeParams(source_type, real_pq_mode, pq_para) == 0) {
+ if (mbVppCfg_pqmode_without_hue) {
+ SSMReadHue(source_type, &(pq_para->hue));
+ }
+ if (pq_mode == VPP_PICTURE_MODE_MOVIE) {
+ pq_para->brightness -= 10;
+ pq_para->contrast -= 10;
+ pq_para->saturation -= 10;
+ pq_para->sharpness -= 10;
+ } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) {
+ pq_para->brightness += 10;
+ pq_para->contrast += 10;
+ pq_para->saturation += 10;
+ pq_para->sharpness += 10;
+ } else {
+ }
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- mbVppCfg_new_nr = true;
- } else {
- mbVppCfg_new_nr = false;
- }
+ } else {
+ LOGE("%s, PQ_GetPQModeParams failed!\n", "Vpp_GetPQModeValue");
+ return -1;
+ }
- return 0;
+ return 0;
}
-int CVpp::Vpp_LoadBasicRegs ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- am_regs_t regs;
- int ret = -1, rangeRet = -1, formatRet = -1, enableFlag = -1;
+int CVpp::Vpp_SetPQParams(tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode,
+ vpp_pq_para_t pq_para, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d,
+ tvin_trans_fmt_t trans_fmt) {
+ int ret = 0, brightness = 50, contrast = 50, saturation = 50, hue = 50, sharnpess = 50;
+ am_regs_t regs, regs_l;
+ int level;
- if ( source_type == SOURCE_TYPE_HDMI ) {
- rangeRet = GetFileAttrIntValue ( "/sys/module/tvin_hdmirx/parameters/rgb_quant_range" );
- formatRet = GetFileAttrIntValue ( "/sys/module/tvin_hdmirx/parameters/cur_colorspace" );
+ if (pq_para.brightness >= 0 && pq_para.brightness <= 100) {
+ if (mpPqData->PQ_GetBrightnessParams(source_port, sig_fmt, is3d, trans_fmt,
+ pq_para.brightness, &brightness) == 0) {
+ } else {
+ LOGE("%s, PQ_GetBrightnessParams error!\n", "Vpp_SetPQParams");
+ }
- if ( rangeRet == LIMIT_RANGE && formatRet == RGB_FORMAT ) {
- enableFlag = 1;
- }
- }
+ ret |= VPP_SetVideoBrightness(brightness);
+ }
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
+ if (pq_para.contrast >= 0 && pq_para.contrast <= 100) {
+ if (mpPqData->PQ_GetContrastParams(source_port, sig_fmt, is3d, trans_fmt, pq_para.contrast,
+ &contrast) == 0) {
+ } else {
+ LOGE("%s, PQ_GetBrightnessParams error!\n", "Vpp_SetPQParams");
+ }
- if ( mpPqData->getRegValues ( source_port, sig_fmt, is3d, trans_fmt, &regs ) > 0 ) {
- if ( Vpp_LoadRegs ( regs ) < 0 ) {
- LOGE ( "%s, Vpp_LoadRegs failed!\n", __FUNCTION__ );
- } else {
- ret = 0;
- }
- } else {
- LOGE ( "%s getRegValues failed!\n", "Vpp_LoadBasicRegs" );
- }
+ ret |= VPP_SetVideoContrast(contrast);
+ }
- if (mpPqData->LoadAllPQData ( source_port, sig_fmt, is3d, trans_fmt, enableFlag ) == 0 ) {
- ret = 0;
- } else {
- LOGE ( "%s, getPQData failed!\n", "Vpp_LoadBasicRegs" );
- ret = -1;
- }
+ if (pq_para.saturation >= 0 && pq_para.saturation <= 100) {
+ if (mpPqData->PQ_GetSaturationParams(source_port, sig_fmt, is3d, trans_fmt,
+ pq_para.saturation, &saturation) == 0) {
+
+ if (mbVppCfg_hue_reverse) {
+ pq_para.hue = 100 - pq_para.hue;
+ } else {
+ pq_para.hue = pq_para.hue;
+ }
+
+ if (mpPqData->PQ_GetHueParams(source_port, sig_fmt, is3d, trans_fmt, pq_para.hue, &hue)
+ == 0) {
+ if ((source_type == SOURCE_TYPE_TV || source_type == SOURCE_TYPE_AV) && (sig_fmt
+ == TVIN_SIG_FMT_CVBS_NTSC_M || sig_fmt == TVIN_SIG_FMT_CVBS_NTSC_443)) {
+ } else {
+ hue = 0;
+ }
+ } else {
+ LOGE("%s, PQ_GetHueParams error!\n", "Vpp_SetPQParams");
+ }
+ } else {
+ LOGE("%s, PQ_GetSaturationParams error!\n", "Vpp_SetPQParams");
+ }
- return ret;
-}
+ ret |= VPP_SetVideoSaturationHue(saturation, hue);
+ }
+ if (pq_para.sharpness >= 0 && pq_para.sharpness <= 100) {
+ level = pq_para.sharpness;
+
+ if (mpPqData->PQ_GetSharpnessParams(source_port, sig_fmt, is3d, trans_fmt, level, &regs,
+ &regs_l) == 0) {
+ if (Vpp_LoadRegs(regs) < 0) {
+ LOGE("%s, load reg for sharpness0 failed!\n", __FUNCTION__);
+ }
+ if (mpPqData->getSharpnessFlag() == 6 && Vpp_LoadRegs(regs_l) < 0) {
+ LOGE("%s, load reg for sharpness1 failed!\n", __FUNCTION__);
+ }
+ } else {
+ LOGE("%s, PQ_GetSharpnessParams failed!\n", __FUNCTION__);
+ }
+ }
+ if (pq_mode == VPP_PICTURE_MODE_MOVIE) {
+ ret |= SetColorTemperature(VPP_COLOR_TEMPERATURE_MODE_WARM, source_type, 1);
+ } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) {
+ ret |= SetColorTemperature(VPP_COLOR_TEMPERATURE_MODE_COLD, source_type, 1);
+ }
-int CVpp::Vpp_ResetLastVppSettingsSourceType ( void )
-{
- vpp_setting_last_source_type = SOURCE_TYPE_MAX;
- vpp_setting_last_sig_fmt = TVIN_SIG_FMT_MAX;
- //showbo mark vpp_setting_last_3d_status = STATUS3D_MAX;
- vpp_setting_last_trans_fmt = TVIN_TFMT_3D_MAX;
- return 0;
+ return ret;
}
-int CVpp::VPP3D_DeviceIOCtl ( int request, ... )
-{
- int tmp_ret = -1;
- va_list ap;
- void *arg;
+int CVpp::Vpp_SetPQMode(vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type,
+ tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d,
+ tvin_trans_fmt_t trans_fmt) {
+ vpp_pq_para_t pq_para;
+ int ret = -1;
- if ( vpp_amvideo_3d_fd >= 0 ) {
- va_start ( ap, request );
- arg = va_arg ( ap, void * );
- va_end ( ap );
+ if (pq_mode == VPP_PICTURE_MODE_USER) {
+ ret = SSMReadBrightness(source_type, &pq_para.brightness);
+ ret = SSMReadContrast(source_type, &pq_para.contrast);
+ ret = SSMReadSaturation(source_type, &pq_para.saturation);
+ ret = SSMReadHue(source_type, &pq_para.hue);
+ ret = SSMReadSharpness(source_type, &pq_para.sharpness);
+ } /*else if (pq_mode == VPP_PICTURE_MODE_MOVIE) {
+ ret = Vpp_GetPQModeValue ( source_type, VPP_PICTURE_MODE_SOFT, &pq_para );
+ pq_para.brightness -=10;
+ pq_para.contrast -=10;
+ pq_para.saturation -=10;
+ pq_para.sharpness -=10;
+ } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) {
+ ret = Vpp_GetPQModeValue ( source_type, VPP_PICTURE_MODE_BRIGHT, &pq_para );
+ pq_para.brightness +=10;
+ pq_para.contrast +=10;
+ pq_para.saturation +=10;
+ pq_para.sharpness +=10;
+ }*/else {
+ ret = Vpp_GetPQModeValue(source_type, pq_mode, &pq_para);
+ }
- tmp_ret = ioctl ( vpp_amvideo_3d_fd, request, arg );
- return tmp_ret;
- }
+ ret |= Vpp_SetPQParams(source_type, pq_mode, pq_para, source_port, sig_fmt, is3d, trans_fmt);
- return -1;
+ return ret;
}
-int CVpp::Vpp_GetPQModeValue ( tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t *pq_para )
-{
- vpp_pq_para_t parms;
- vpp_picture_mode_t real_pq_mode;
-
- if ( pq_para == NULL ) {
- return -1;
- }
-
- if (pq_mode == VPP_PICTURE_MODE_MOVIE) {
- real_pq_mode = VPP_PICTURE_MODE_SOFT;
- } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) {
- real_pq_mode = VPP_PICTURE_MODE_BRIGHT;
- } else {
- real_pq_mode = pq_mode;
- }
- if ( mpPqData->PQ_GetPQModeParams ( source_type, real_pq_mode, pq_para ) == 0 ) {
- if ( mbVppCfg_pqmode_without_hue) {
- SSMReadHue ( source_type, & ( pq_para->hue ) );
- }
- if (pq_mode == VPP_PICTURE_MODE_MOVIE) {
- pq_para->brightness -= 10;
- pq_para->contrast -= 10;
- pq_para->saturation -= 10;
- pq_para->sharpness -= 10;
- } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) {
- pq_para->brightness += 10;
- pq_para->contrast += 10;
- pq_para->saturation += 10;
- pq_para->sharpness += 10;
- } else {}
-
- } else {
- LOGE ( "%s, PQ_GetPQModeParams failed!\n", "Vpp_GetPQModeValue" );
- return -1;
- }
-
- return 0;
-}
-
-int CVpp::Vpp_SetPQParams ( tv_source_input_type_t source_type, vpp_picture_mode_t pq_mode, vpp_pq_para_t pq_para , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt)
-{
- int ret = 0, brightness = 50, contrast = 50, saturation = 50, hue = 50, sharnpess = 50;
- am_regs_t regs;
- int level;
-
- if ( pq_para.brightness >= 0 && pq_para.brightness <= 100 ) {
- if ( mpPqData->PQ_GetBrightnessParams ( source_port, sig_fmt, is3d, trans_fmt, pq_para.brightness, &brightness ) == 0 ) {
- } else {
- LOGE ( "%s, PQ_GetBrightnessParams error!\n", "Vpp_SetPQParams" );
- }
-
- ret |= VPP_SetVideoBrightness ( brightness );
- }
-
- if ( pq_para.contrast >= 0 && pq_para.contrast <= 100 ) {
- if ( mpPqData->PQ_GetContrastParams ( source_port, sig_fmt, is3d, trans_fmt, pq_para.contrast, &contrast ) == 0 ) {
- } else {
- LOGE ( "%s, PQ_GetBrightnessParams error!\n", "Vpp_SetPQParams" );
- }
-
- ret |= VPP_SetVideoContrast ( contrast );
- }
-
- if ( pq_para.saturation >= 0 && pq_para.saturation <= 100 ) {
- if ( mpPqData->PQ_GetSaturationParams ( source_port, sig_fmt, is3d, trans_fmt, pq_para.saturation, &saturation ) == 0 ) {
-
- if ( mbVppCfg_hue_reverse) {
- pq_para.hue = 100 - pq_para.hue;
- } else {
- pq_para.hue = pq_para.hue;
- }
-
- if ( mpPqData->PQ_GetHueParams ( source_port, sig_fmt, is3d, trans_fmt, pq_para.hue, &hue ) == 0 ) {
- if ( ( source_type == SOURCE_TYPE_TV || source_type == SOURCE_TYPE_AV )
- && ( sig_fmt == TVIN_SIG_FMT_CVBS_NTSC_M || sig_fmt == TVIN_SIG_FMT_CVBS_NTSC_443 ) ) {
- } else {
- hue = 0;
- }
- } else {
- LOGE ( "%s, PQ_GetHueParams error!\n", "Vpp_SetPQParams" );
- }
- } else {
- LOGE ( "%s, PQ_GetSaturationParams error!\n", "Vpp_SetPQParams" );
- }
-
- ret |= VPP_SetVideoSaturationHue ( saturation, hue );
- }
-
- if ( pq_para.sharpness >= 0 && pq_para.sharpness <= 100) {
- level = pq_para.sharpness;
-
- if ( mpPqData->PQ_GetSharpnessParams ( source_port, sig_fmt, is3d, trans_fmt, level, &regs ) == 0 ) {
- if ( Vpp_LoadRegs ( regs ) < 0 ) {
- LOGE ( "%s, PQ_GetSharpnessParams failed!\n", "Vpp_SetPQParams" );
- }
- } else {
- LOGE ( "%s, PQ_GetSharpnessParams failed!\n", "Vpp_SetPQParams" );
- }
- }
-
- if (pq_mode == VPP_PICTURE_MODE_MOVIE) {
- ret |= Tv_SetColorTemperature(VPP_COLOR_TEMPERATURE_MODE_WARM, source_type, 1);
- } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) {
- ret |= Tv_SetColorTemperature(VPP_COLOR_TEMPERATURE_MODE_COLD, source_type, 1);
- }
-
- return ret;
-}
-
-int CVpp::Vpp_SetPQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt)
-{
- vpp_pq_para_t pq_para;
- int ret = -1;
-
- if ( pq_mode == VPP_PICTURE_MODE_USER ) {
- ret = SSMReadBrightness ( source_type, &pq_para.brightness );
- ret = SSMReadContrast ( source_type, &pq_para.contrast );
- ret = SSMReadSaturation ( source_type, &pq_para.saturation );
- ret = SSMReadHue ( source_type, &pq_para.hue );
- ret = SSMReadSharpness ( source_type, &pq_para.sharpness );
- } /*else if (pq_mode == VPP_PICTURE_MODE_MOVIE) {
- ret = Vpp_GetPQModeValue ( source_type, VPP_PICTURE_MODE_SOFT, &pq_para );
- pq_para.brightness -=10;
- pq_para.contrast -=10;
- pq_para.saturation -=10;
- pq_para.sharpness -=10;
- } else if (pq_mode == VPP_PICTURE_MODE_COLORFUL) {
- ret = Vpp_GetPQModeValue ( source_type, VPP_PICTURE_MODE_BRIGHT, &pq_para );
- pq_para.brightness +=10;
- pq_para.contrast +=10;
- pq_para.saturation +=10;
- pq_para.sharpness +=10;
- }*/ else {
- ret = Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para );
- }
-
- ret |= Vpp_SetPQParams ( source_type, pq_mode, pq_para , source_port , sig_fmt , is3d , trans_fmt );
+int CVpp::SavePQMode(vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type) {
+ vpp_pq_para_t pq_para;
+ int ret = -1;
+ int tmp_pic_mode = 0;
- return ret;
+ tmp_pic_mode = (int) pq_mode;
+ ret = SSMSavePictureMode(source_type, tmp_pic_mode);
+ return ret;
}
-int CVpp::Tv_SavePQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type )
-{
- vpp_pq_para_t pq_para;
- int ret = -1;
- int tmp_pic_mode = 0;
+int CVpp::SetPQMode(vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type,
+ tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save) {
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
+
+ if (0 == Vpp_SetPQMode(pq_mode, source_type, source_port, sig_fmt, is3d, trans_fmt)) {
+ if (is_save == 1) {
+ return SavePQMode(pq_mode, source_type);
+ } else {
+ return 0;
+ }
+ }
- tmp_pic_mode = ( int ) pq_mode;
- ret = SSMSavePictureMode ( source_type, tmp_pic_mode );
- return ret;
+ LOGE("%s, failed!", "SetPQMode");
+ return -1;
}
-int CVpp::Tv_SetPQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save )
-{
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
+vpp_picture_mode_t CVpp::GetPQMode(tv_source_input_type_t source_type) {
+ vpp_picture_mode_t data = VPP_PICTURE_MODE_STANDARD;
+ int tmp_pic_mode = 0;
+
+ SSMReadPictureMode(source_type, &tmp_pic_mode);
+ data = (vpp_picture_mode_t) tmp_pic_mode;
- if ( 0 == Vpp_SetPQMode ( pq_mode, source_type , source_port , sig_fmt , is3d , trans_fmt) ) {
- if ( is_save == 1 ) {
- return Tv_SavePQMode ( pq_mode, source_type );
- } else {
- return 0;
- }
- }
+ if (data < VPP_PICTURE_MODE_STANDARD || data >= VPP_PICTURE_MODE_MAX) {
+ data = VPP_PICTURE_MODE_STANDARD;
+ }
- LOGE ( "%s, failed!", "Tv_SetPQMode" );
- return -1;
+ return data;
}
-vpp_picture_mode_t CVpp::Tv_GetPQMode ( tv_source_input_type_t source_type )
-{
- vpp_picture_mode_t data = VPP_PICTURE_MODE_STANDARD;
- int tmp_pic_mode = 0;
+int CVpp::Vpp_SetColorDemoMode(vpp_color_demomode_t demomode) {
+ cm_regmap_t regmap;
+ unsigned long *temp_regmap;
+ int i = 0;
+ int tmp_demo_mode = 0;
+ vpp_display_mode_t displaymode = VPP_DISPLAY_MODE_MODE43;
+ switch (demomode) {
+ case VPP_COLOR_DEMO_MODE_YOFF:
+ temp_regmap = DemoColorYOffRegMap;
+ break;
- SSMReadPictureMode ( source_type, &tmp_pic_mode );
- data = ( vpp_picture_mode_t ) tmp_pic_mode;
+ case VPP_COLOR_DEMO_MODE_COFF:
+ temp_regmap = DemoColorCOffRegMap;
+ break;
- if ( data < VPP_PICTURE_MODE_STANDARD || data >= VPP_PICTURE_MODE_MAX ) {
- data = VPP_PICTURE_MODE_STANDARD;
- }
+ case VPP_COLOR_DEMO_MODE_GOFF:
+ temp_regmap = DemoColorGOffRegMap;
+ break;
- return data;
-}
+ case VPP_COLOR_DEMO_MODE_MOFF:
+ temp_regmap = DemoColorMOffRegMap;
+ break;
-int CVpp::Vpp_SetColorDemoMode ( vpp_color_demomode_t demomode )
-{
- cm_regmap_t regmap;
- unsigned long *temp_regmap;
- int i = 0;
- int tmp_demo_mode = 0;
- vpp_display_mode_t displaymode = VPP_DISPLAY_MODE_MODE43;
-
- switch ( demomode ) {
- case VPP_COLOR_DEMO_MODE_YOFF:
- temp_regmap = DemoColorYOffRegMap;
- break;
-
- case VPP_COLOR_DEMO_MODE_COFF:
- temp_regmap = DemoColorCOffRegMap;
- break;
-
- case VPP_COLOR_DEMO_MODE_GOFF:
- temp_regmap = DemoColorGOffRegMap;
- break;
-
- case VPP_COLOR_DEMO_MODE_MOFF:
- temp_regmap = DemoColorMOffRegMap;
- break;
-
- case VPP_COLOR_DEMO_MODE_ROFF:
- temp_regmap = DemoColorROffRegMap;
- break;
-
- case VPP_COLOR_DEMO_MODE_BOFF:
- temp_regmap = DemoColorBOffRegMap;
- break;
-
- case VPP_COLOR_DEMO_MODE_RGBOFF:
- temp_regmap = DemoColorRGBOffRegMap;
- break;
-
- case VPP_COLOR_DEMO_MODE_YMCOFF:
- temp_regmap = DemoColorYMCOffRegMap;
- break;
-
- case VPP_COLOR_DEMO_MODE_ALLOFF:
- temp_regmap = DemoColorALLOffRegMap;
- break;
-
- case VPP_COLOR_DEMO_MODE_ALLON:
- default:
- if ( displaymode == VPP_DISPLAY_MODE_MODE43 ) {
- temp_regmap = DemoColorSplit4_3RegMap;
- } else {
- temp_regmap = DemoColorSplitRegMap;
- }
-
- break;
- }
-
- for ( i = 0; i < CM_REG_NUM; i++ ) {
- regmap.reg[i] = temp_regmap[i];
- }
-
- if ( VPP_SetCMRegisterMap ( &regmap ) == 0 ) {
- tmp_demo_mode = demomode;
- LOGD ( "%s, demomode[%d] success.", "Vpp_SetColorDemoMode", demomode );
- return 0;
- }
-
- LOGE ( "%s, demomode[%d] failed.", "Vpp_SetColorDemoMode", demomode );
- return -1;
-}
-
-int CVpp::Vpp_SetBaseColorMode ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt)
-{
- int ret = -1;
- am_regs_t regs;
- LOGD ( "%s.\n", "Vpp_SetBaseColorMode" );
+ case VPP_COLOR_DEMO_MODE_ROFF:
+ temp_regmap = DemoColorROffRegMap;
+ break;
- if ( mbVppCfg_new_cm) {
- if ( mpPqData->PQ_GetCM2Params ( ( vpp_color_management2_t ) basemode, source_port, sig_fmt, is3d, trans_fmt, &regs ) == 0 ) {
- ret = Vpp_LoadRegs ( regs );
- } else {
- LOGE ( "PQ_GetCM2Params failed!\n" );
- }
- }
+ case VPP_COLOR_DEMO_MODE_BOFF:
+ temp_regmap = DemoColorBOffRegMap;
+ break;
- return ret;
-}
+ case VPP_COLOR_DEMO_MODE_RGBOFF:
+ temp_regmap = DemoColorRGBOffRegMap;
+ break;
-int CVpp::Vpp_SetColorTemperatureUser ( vpp_color_temperature_mode_t temp_mode, tv_source_input_type_t source_type )
-{
- tcon_rgb_ogo_t rgbogo;
- unsigned int gain_r, gain_g, gain_b;
+ case VPP_COLOR_DEMO_MODE_YMCOFF:
+ temp_regmap = DemoColorYMCOffRegMap;
+ break;
- if ( SSMReadRGBGainRStart ( 0, &gain_r ) != 0 ) {
- return -1;
- }
+ case VPP_COLOR_DEMO_MODE_ALLOFF:
+ temp_regmap = DemoColorALLOffRegMap;
+ break;
- rgbogo.r_gain = gain_r;
+ case VPP_COLOR_DEMO_MODE_ALLON:
+ default:
+ if (displaymode == VPP_DISPLAY_MODE_MODE43) {
+ temp_regmap = DemoColorSplit4_3RegMap;
+ } else {
+ temp_regmap = DemoColorSplitRegMap;
+ }
- if ( SSMReadRGBGainGStart ( 0, &gain_g ) != 0 ) {
- return -1;
- }
+ break;
+ }
- rgbogo.g_gain = gain_g;
+ for (i = 0; i < CM_REG_NUM; i++) {
+ regmap.reg[i] = temp_regmap[i];
+ }
- if ( SSMReadRGBGainBStart ( 0, &gain_b ) != 0 ) {
- return -1;
- }
+ if (VPP_SetCMRegisterMap(&regmap) == 0) {
+ tmp_demo_mode = demomode;
+ LOGD("%s, demomode[%d] success.", "Vpp_SetColorDemoMode", demomode);
+ return 0;
+ }
- rgbogo.b_gain = gain_b;
- rgbogo.r_post_offset = 0;
- rgbogo.r_pre_offset = 0;
- rgbogo.g_post_offset = 0;
- rgbogo.g_pre_offset = 0;
- rgbogo.b_post_offset = 0;
- rgbogo.b_pre_offset = 0;
+ LOGE("%s, demomode[%d] failed.", "Vpp_SetColorDemoMode", demomode);
+ return -1;
+}
- if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) {
- return 0;
- }
+int CVpp::Vpp_SetBaseColorMode(vpp_color_basemode_t basemode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ am_regs_t regs;
+ LOGD("%s.\n", "Vpp_SetBaseColorMode");
+
+ if (mbVppCfg_new_cm) {
+ if (mpPqData->PQ_GetCM2Params((vpp_color_management2_t) basemode, source_port, sig_fmt,
+ is3d, trans_fmt, &regs) == 0) {
+ ret = Vpp_LoadRegs(regs);
+ } else {
+ LOGE("PQ_GetCM2Params failed!\n");
+ }
+ }
- LOGE ( "%s, source_type_user[%d] failed.", "Vpp_SetColorTemperatureUser", source_type );
- return -1;
+ return ret;
}
-int CVpp::Vpp_SetColorTemperature ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt)
-{
- tcon_rgb_ogo_t rgbogo, rgbPreOffset;
- int ret = -1;
+int CVpp::Vpp_SetColorTemperatureUser(vpp_color_temperature_mode_t temp_mode,
+ tv_source_input_type_t source_type) {
+ tcon_rgb_ogo_t rgbogo;
+ unsigned int gain_r, gain_g, gain_b;
- if ( mbVppCfg_gamma_onoff) {
- VPP_SetGammaOnOff ( 0 );
- } else {
- VPP_SetGammaOnOff ( 1 );
- }
+ if (SSMReadRGBGainRStart(0, &gain_r) != 0) {
+ return -1;
+ }
- GetColorTemperatureParams ( Tempmode, &rgbogo );
+ rgbogo.r_gain = gain_r;
- if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) {
- return 0;
- }
+ if (SSMReadRGBGainGStart(0, &gain_g) != 0) {
+ return -1;
+ }
- LOGE ( "%s, source_type[%d] failed.", "Vpp_SetColorTemperature", source_type );
- return -1;
-}
+ rgbogo.g_gain = gain_g;
-int CVpp::Vpp_SetBrightness ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- int ret = -1;
- int params;
- int level;
+ if (SSMReadRGBGainBStart(0, &gain_b) != 0) {
+ return -1;
+ }
- if ( value >= 0 && value <= 100) {
- level = value;
- LOGD ( "%s.\n", "Vpp_SetBrightness" );
+ rgbogo.b_gain = gain_b;
+ rgbogo.r_post_offset = 0;
+ rgbogo.r_pre_offset = 0;
+ rgbogo.g_post_offset = 0;
+ rgbogo.g_pre_offset = 0;
+ rgbogo.b_post_offset = 0;
+ rgbogo.b_pre_offset = 0;
- if ( mpPqData->PQ_GetBrightnessParams ( source_port, sig_fmt, is3d, trans_fmt, level, &params ) == 0 ) {
- if ( VPP_SetVideoBrightness ( params ) == 0 ) {
- return 0;
- }
- } else {
- LOGE ( "%s, PQ_GetBrightnessParams failed!\n", "Vpp_SetBrightness" );
- }
- }
+ if (VPP_SetRGBOGO(&rgbogo) == 0) {
+ return 0;
+ }
- return ret;
+ LOGE("%s, source_type_user[%d] failed.", "Vpp_SetColorTemperatureUser", source_type);
+ return -1;
}
-int CVpp::VPP_SetVideoBrightness ( int value )
-{
- FILE *fp = NULL;
-
- fp = fopen ( "/sys/class/amvecm/brightness", "w" );
+int CVpp::Vpp_SetColorTemperature(vpp_color_temperature_mode_t Tempmode,
+ tv_source_input_type_t source_type, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ tvin_trans_fmt_t trans_fmt) {
+ tcon_rgb_ogo_t rgbogo, rgbPreOffset;
+ int ret = -1;
- LOGD ( "~~~fopen~~~##VPP_SetVideoBrightness##%s : %d ##" , "/sys/class/amvecm/brightness", value);
+ if (mbVppCfg_gamma_onoff) {
+ VPP_SetGammaOnOff(0);
+ } else {
+ VPP_SetGammaOnOff(1);
+ }
- if ( fp == NULL ) {
- LOGE ( "Open /sys/class/amvecm/brightness error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ GetColorTemperatureParams(Tempmode, &rgbogo);
- fprintf ( fp, "%d", value );
- fclose ( fp );
- fp = NULL;
+ if (VPP_SetRGBOGO(&rgbogo) == 0) {
+ return 0;
+ }
- return 0;
+ LOGE("%s, source_type[%d] failed.", "Vpp_SetColorTemperature", source_type);
+ return -1;
}
-int CVpp::Tv_SetBrightness ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save )
-{
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
-
- if ( 0 == Vpp_SetBrightness ( value, source_type, source_port, sig_fmt, is3d, trans_fmt ) ) {
- if ( is_save == 1 ) {
- return SSMSaveBrightness ( source_type, value );
- } else {
- return 0;
- }
- } else {
- LOGE ( "%s, failed!", "Tv_SetBrightness" );
- return -1;
- }
- return 0;
-}
-
-int CVpp::Tv_GetBrightness ( tv_source_input_type_t source_type )
-{
- int data = 50;
- vpp_pq_para_t pq_para;
- vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type );
+int CVpp::Vpp_SetBrightness(int value, tv_source_input_type_t source_type, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ int params;
+ int level;
+
+ if (value >= 0 && value <= 100) {
+ level = value;
+ LOGD("%s.\n", "Vpp_SetBrightness");
+
+ if (mpPqData->PQ_GetBrightnessParams(source_port, sig_fmt, is3d, trans_fmt, level, &params)
+ == 0) {
+ if (VPP_SetVideoBrightness(params) == 0) {
+ return 0;
+ }
+ } else {
+ LOGE("%s, PQ_GetBrightnessParams failed!\n", "Vpp_SetBrightness");
+ }
+ }
- if ( pq_mode == VPP_PICTURE_MODE_USER ) {
- SSMReadBrightness ( source_type, &data );
- } else {
- if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) {
- data = pq_para.brightness;
- }
- }
+ return ret;
+}
- if ( data < 0 || data > 100 ) {
- data = 50;
- }
+int CVpp::VPP_SetVideoBrightness(int value) {
+ FILE *fp = NULL;
- return data;
-}
+ fp = fopen("/sys/class/amvecm/brightness", "w");
-int CVpp::Vpp_SetContrast ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- int ret = -1;
- int params;
- int level;
+ LOGD("~~~fopen~~~##VPP_SetVideoBrightness##%s : %d ##", "/sys/class/amvecm/brightness", value);
- if ( value >= 0 && value <= 100 ) {
- level = value;
- LOGD ( "%s.\n", "Vpp_SetContrast" );
+ if (fp == NULL) {
+ LOGE("Open /sys/class/amvecm/brightness error(%s)!\n", strerror(errno));
+ return -1;
+ }
- if ( mpPqData->PQ_GetContrastParams ( source_port, sig_fmt, is3d, trans_fmt, level, &params ) == 0 ) {
- if ( VPP_SetVideoContrast ( params ) == 0 ) {
- return 0;
- }
- } else {
- LOGE ( "%s, PQ_GetContrastParams failed!\n", "Vpp_SetContrast" );
- }
- }
+ fprintf(fp, "%d", value);
+ fclose(fp);
+ fp = NULL;
- return ret;
+ return 0;
}
-int CVpp::VPP_SetVideoContrast ( int value )
-{
- FILE *fp = NULL;
+int CVpp::SetBrightness(int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt,
+ tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save) {
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
+
+ if (0 == Vpp_SetBrightness(value, source_type, source_port, sig_fmt, is3d, trans_fmt)) {
+ if (is_save == 1) {
+ return SSMSaveBrightness(source_type, value);
+ } else {
+ return 0;
+ }
+ } else {
+ LOGE("%s, failed!", "SetBrightness");
+ return -1;
+ }
+ return 0;
+}
- fp = fopen ( "/sys/class/amvecm/contrast", "w" );
- LOGD ( "~~~fopen~~~##VPP_SetVideoContrast##%s : %d ##" , "/sys/class/amvecm/contrast", value);
+int CVpp::GetBrightness(tv_source_input_type_t source_type) {
+ int data = 50;
+ vpp_pq_para_t pq_para;
+ vpp_picture_mode_t pq_mode = GetPQMode(source_type);
- if ( fp == NULL ) {
- LOGE ( "Open /sys/class/amvecm/contrast error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ if (pq_mode == VPP_PICTURE_MODE_USER) {
+ SSMReadBrightness(source_type, &data);
+ } else {
+ if (Vpp_GetPQModeValue(source_type, pq_mode, &pq_para) == 0) {
+ data = pq_para.brightness;
+ }
+ }
- fprintf ( fp, "%d", value );
- fclose ( fp );
- fp = NULL;
+ if (data < 0 || data > 100) {
+ data = 50;
+ }
- return 0;
+ return data;
}
-int CVpp::Tv_SetContrast ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save )
-{
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
+int CVpp::Vpp_SetContrast(int value, tv_source_input_type_t source_type, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ int params;
+ int level;
+
+ if (value >= 0 && value <= 100) {
+ level = value;
+ LOGD("%s.\n", "Vpp_SetContrast");
+
+ if (mpPqData->PQ_GetContrastParams(source_port, sig_fmt, is3d, trans_fmt, level, &params)
+ == 0) {
+ if (VPP_SetVideoContrast(params) == 0) {
+ return 0;
+ }
+ } else {
+ LOGE("%s, PQ_GetContrastParams failed!\n", "Vpp_SetContrast");
+ }
+ }
- if ( 0 == Vpp_SetContrast ( value, source_type, source_port, sig_fmt, is3d, trans_fmt ) ) {
- if ( is_save == 1 ) {
- return SSMSaveContrast ( source_type, value );
- } else {
- return 0;
- }
- } else {
- LOGE ( "%s, failed!", "Tv_SetContrast" );
- return -1;
- }
+ return ret;
}
-int CVpp::Tv_GetContrast ( tv_source_input_type_t source_type )
-{
- int data = 50;
- vpp_pq_para_t pq_para;
- vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type );
+int CVpp::VPP_SetVideoContrast(int value) {
+ FILE *fp = NULL;
+
+ fp = fopen("/sys/class/amvecm/contrast", "w");
+ LOGD("~~~fopen~~~##VPP_SetVideoContrast##%s : %d ##", "/sys/class/amvecm/contrast", value);
- if ( pq_mode == VPP_PICTURE_MODE_USER ) {
- SSMReadContrast ( source_type, &data );
- } else {
- if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) {
- data = pq_para.contrast;
- }
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/class/amvecm/contrast error(%s)!\n", strerror(errno));
+ return -1;
+ }
- if ( data < 0 || data > 100 ) {
- data = 50;
- }
+ fprintf(fp, "%d", value);
+ fclose(fp);
+ fp = NULL;
- return data;
+ return 0;
}
-int CVpp::Vpp_SetSaturation ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- int ret = -1;
- int params;
- int level;
- int hue = 0;
+int CVpp::SetContrast(int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt,
+ tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save) {
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
- if ( value >= 0 && value <= 100) {
- level = value;
+ if (0 == Vpp_SetContrast(value, source_type, source_port, sig_fmt, is3d, trans_fmt)) {
+ if (is_save == 1) {
+ return SSMSaveContrast(source_type, value);
+ } else {
+ return 0;
+ }
+ } else {
+ LOGE("%s, failed!", "SetContrast");
+ return -1;
+ }
+}
- if ( mpPqData->PQ_GetSaturationParams ( source_port, sig_fmt, is3d, trans_fmt, level, &params ) == 0 ) {
- if ( VPP_SetVideoSaturationHue ( params, hue ) == 0 ) {
- return 0;
- }
- } else {
- }
- }
+int CVpp::GetContrast(tv_source_input_type_t source_type) {
+ int data = 50;
+ vpp_pq_para_t pq_para;
+ vpp_picture_mode_t pq_mode = GetPQMode(source_type);
- return ret;
-}
+ if (pq_mode == VPP_PICTURE_MODE_USER) {
+ SSMReadContrast(source_type, &data);
+ } else {
+ if (Vpp_GetPQModeValue(source_type, pq_mode, &pq_para) == 0) {
+ data = pq_para.contrast;
+ }
+ }
-int CVpp::Tv_SetSaturation ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save )
-{
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
+ if (data < 0 || data > 100) {
+ data = 50;
+ }
- if ( 0 == Vpp_SetSaturation ( value, source_type, source_port, sig_fmt, is3d, trans_fmt ) ) {
- if ( is_save == 1 ) {
- return SSMSaveSaturation ( source_type, value );
- } else {
- return 0;
- }
- } else {
- LOGE ( "%s, failed!", "Tv_SetSaturation" );
- return -1;
- }
+ return data;
}
-int CVpp::Tv_GetSaturation ( tv_source_input_type_t source_type )
-{
- int data = 50;
- vpp_pq_para_t pq_para;
- vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type );
+int CVpp::Vpp_SetSaturation(int value, tv_source_input_type_t source_type, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ int params;
+ int level;
+ int hue = 0;
+
+ if (value >= 0 && value <= 100) {
+ level = value;
+
+ if (mpPqData->PQ_GetSaturationParams(source_port, sig_fmt, is3d, trans_fmt, level, &params)
+ == 0) {
+ if (VPP_SetVideoSaturationHue(params, hue) == 0) {
+ return 0;
+ }
+ } else {
+ }
+ }
- if ( pq_mode == VPP_PICTURE_MODE_USER ) {
- SSMReadSaturation ( source_type, &data );
- } else {
- if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) {
- data = pq_para.saturation;
- }
- }
+ return ret;
+}
- if ( data < 0 || data > 100 ) {
- data = 50;
- }
+int CVpp::SetSaturation(int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt,
+ tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save) {
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
- return data;
+ if (0 == Vpp_SetSaturation(value, source_type, source_port, sig_fmt, is3d, trans_fmt)) {
+ if (is_save == 1) {
+ return SSMSaveSaturation(source_type, value);
+ } else {
+ return 0;
+ }
+ } else {
+ LOGE("%s, failed!", "SetSaturation");
+ return -1;
+ }
}
-int CVpp::Vpp_SetHue ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_port_t source_port, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- int ret = -1;
- int params, saturation_params;
- int level, saturation_level;
+int CVpp::GetSaturation(tv_source_input_type_t source_type) {
+ int data = 50;
+ vpp_pq_para_t pq_para;
+ vpp_picture_mode_t pq_mode = GetPQMode(source_type);
- if ( value >= 0 && value <= 100 ) {
- if ( mbVppCfg_hue_reverse) {
- level = 100 - value;
- } else {
- level = value;
- }
+ if (pq_mode == VPP_PICTURE_MODE_USER) {
+ SSMReadSaturation(source_type, &data);
+ } else {
+ if (Vpp_GetPQModeValue(source_type, pq_mode, &pq_para) == 0) {
+ data = pq_para.saturation;
+ }
+ }
- if ( mpPqData->PQ_GetHueParams ( source_port, sig_fmt, is3d, trans_fmt, level, &params ) == 0 ) {
- saturation_level = Tv_GetSaturation ( source_type );
+ if (data < 0 || data > 100) {
+ data = 50;
+ }
- if ( mpPqData->PQ_GetSaturationParams ( source_port, sig_fmt, is3d, trans_fmt, saturation_level, &saturation_params ) == 0 ) {
- } else {
- saturation_params = -20;
- }
+ return data;
+}
- if ( VPP_SetVideoSaturationHue ( saturation_params, params ) == 0 ) {
- return 0;
- }
- } else {
- LOGE ( "PQ_GetHueParams failed!\n" );
- }
- }
+int CVpp::Vpp_SetHue(int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt,
+ tvin_port_t source_port, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ int params, saturation_params;
+ int level, saturation_level;
+
+ if (value >= 0 && value <= 100) {
+ if (mbVppCfg_hue_reverse) {
+ level = 100 - value;
+ } else {
+ level = value;
+ }
- return ret;
-}
+ if (mpPqData->PQ_GetHueParams(source_port, sig_fmt, is3d, trans_fmt, level, &params) == 0) {
+ saturation_level = GetSaturation(source_type);
-int CVpp::Tv_SetHue ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save )
-{
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
+ if (mpPqData->PQ_GetSaturationParams(source_port, sig_fmt, is3d, trans_fmt,
+ saturation_level, &saturation_params) == 0) {
+ } else {
+ saturation_params = -20;
+ }
- if ( 0 == Vpp_SetHue ( value, source_type, sig_fmt, source_port, is3d, trans_fmt ) ) {
- if ( is_save == 1 ) {
- return SSMSaveHue ( source_type, value );
- } else {
- return 0;
- }
- } else {
- LOGE ( "%s, failed!", "Tv_SetHue" );
- return -1;
- }
+ if (VPP_SetVideoSaturationHue(saturation_params, params) == 0) {
+ return 0;
+ }
+ } else {
+ LOGE("PQ_GetHueParams failed!\n");
+ }
+ }
- return 0;
+ return ret;
}
-int CVpp::Tv_GetHue ( tv_source_input_type_t source_type )
-{
- int data = 50;
- vpp_pq_para_t pq_para;
- vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type );
-
- if ( pq_mode == VPP_PICTURE_MODE_USER ) {
- SSMReadHue ( source_type, &data );
- } else {
- if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) {
- data = pq_para.hue;
- }
- }
+int CVpp::SetHue(int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt,
+ tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save) {
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
- if ( data < 0 || data > 100 ) {
- data = 50;
- }
+ if (0 == Vpp_SetHue(value, source_type, sig_fmt, source_port, is3d, trans_fmt)) {
+ if (is_save == 1) {
+ return SSMSaveHue(source_type, value);
+ } else {
+ return 0;
+ }
+ } else {
+ LOGE("%s, failed!", "SetHue");
+ return -1;
+ }
- return data;
+ return 0;
}
+int CVpp::GetHue(tv_source_input_type_t source_type) {
+ int data = 50;
+ vpp_pq_para_t pq_para;
+ vpp_picture_mode_t pq_mode = GetPQMode(source_type);
+ if (pq_mode == VPP_PICTURE_MODE_USER) {
+ SSMReadHue(source_type, &data);
+ } else {
+ if (Vpp_GetPQModeValue(source_type, pq_mode, &pq_para) == 0) {
+ data = pq_para.hue;
+ }
+ }
-int CVpp::Vpp_SetSharpness ( int value, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- int ret = -1;
- am_regs_t regs;
- int level;
+ if (data < 0 || data > 100) {
+ data = 50;
+ }
- if ( value >= 0 && value <= 100 ) {
- level = value;
+ return data;
+}
- if ( mpPqData->PQ_GetSharpnessParams ( source_port, sig_fmt, is3d, trans_fmt, level, &regs ) == 0 ) {
- if ( Vpp_LoadRegs ( regs ) < 0 ) {
- } else {
- ret = 0;
- }
- } else {
- }
- }
+int CVpp::Vpp_SetSharpness(int value, tv_source_input_type_t source_type, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ am_regs_t regs, regs_l;
+ int level;
+
+ if (value >= 0 && value <= 100) {
+ level = value;
+
+ if (mpPqData->PQ_GetSharpnessParams(source_port, sig_fmt, is3d, trans_fmt, level, &regs, &regs_l) == 0) {
+ LOGD("%s, sharpness flag:%d\n", __FUNCTION__, mpPqData->getSharpnessFlag());
+ if (mpPqData->getSharpnessFlag() == 6) {
+ if (Vpp_LoadRegs(regs) >= 0 && Vpp_LoadRegs(regs_l) >= 0)
+ ret = 0;
+ } else {
+ if (Vpp_LoadRegs(regs) >= 0)
+ ret = 0;
+ }
+ } else {
+ }
+ }
- return ret;
+ return ret;
}
-int CVpp::Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int is_enable, is_3d_type_t is3d, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, int is_save )
-{
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
+int CVpp::SetSharpness(int value, tv_source_input_type_t source_type, int is_enable,
+ is_3d_type_t is3d, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, int is_save) {
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
- if ( Vpp_SetSharpness ( value, source_type, source_port, sig_fmt, is3d, trans_fmt) < 0 ) {
- LOGE ( "%s, failed!", "Tv_SetSharpness" );
- return -1;
- }
+ if (Vpp_SetSharpness(value, source_type, source_port, sig_fmt, is3d, trans_fmt) < 0) {
+ LOGE("%s, failed!", "SetSharpness");
+ return -1;
+ }
- if ( is_save == 1 ) {
- if ( is_enable ) {
- return SSMSaveSharpness ( source_type, value );
+ if (is_save == 1) {
+ if (is_enable) {
+ return SSMSaveSharpness(source_type, value);
- }
- }
+ }
+ }
- return 0;
+ return 0;
}
-int CVpp::Tv_GetSharpness ( tv_source_input_type_t source_type )
-{
- int data = 50;
- vpp_pq_para_t pq_para;
- vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type );
+int CVpp::GetSharpness(tv_source_input_type_t source_type) {
+ int data = 50;
+ vpp_pq_para_t pq_para;
+ vpp_picture_mode_t pq_mode = GetPQMode(source_type);
- if ( pq_mode == VPP_PICTURE_MODE_USER ) {
- SSMReadSharpness ( source_type, &data );
- } else {
- if ( Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para ) == 0 ) {
- data = pq_para.sharpness;
- }
- }
+ if (pq_mode == VPP_PICTURE_MODE_USER) {
+ SSMReadSharpness(source_type, &data);
+ } else {
+ if (Vpp_GetPQModeValue(source_type, pq_mode, &pq_para) == 0) {
+ data = pq_para.sharpness;
+ }
+ }
- if ( data < 0 || data > 100 ) {
- data = 50;
- }
+ if (data < 0 || data > 100) {
+ data = 50;
+ }
- LOGD ( "%s, data[%d].", "Tv_GetSharpness", data );
- return data;
+ LOGD("%s, data[%d].", "GetSharpness", data);
+ return data;
}
-int CVpp::Tv_SetColorSpaceMode ( vpp_color_space_type_t colorSpace )
-{
- int ret = -1, fileRet = -1;
- SSMSaveColorSpaceStart ( colorSpace );
+int CVpp::SetColorSpaceMode(vpp_color_space_type_t colorSpace) {
+ int ret = -1, fileRet = -1;
+ SSMSaveColorSpaceStart(colorSpace);
- switch ( colorSpace ) {
- case VPP_COLOR_SPACE_RGB:
- //marked by haifeng
- // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1da1 0xc" );
- // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d70 0x208" );
- // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d71 0x74" );
- break;
+ switch (colorSpace) {
+ case VPP_COLOR_SPACE_RGB:
+ //marked by haifeng
+ // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1da1 0xc" );
+ // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d70 0x208" );
+ // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d71 0x74" );
+ break;
- case VPP_COLOR_SPACE_YUV:
- //marked by haifeng
- // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1da1 0xe" );
- // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d70 0x208" );
- // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d71 0x76" );
- break;
+ case VPP_COLOR_SPACE_YUV:
+ //marked by haifeng
+ // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1da1 0xe" );
+ // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d70 0x208" );
+ // SetFileAttrValue ( "/sys/class/register/reg", "wc 0x1d71 0x76" );
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
- return 0;
+ return 0;
}
-int CVpp::Vpp_SetNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- int ret = -1;
- am_regs_t regs;
-
- if ( mbVppCfg_new_nr) {
- if ( mpPqData->PQ_GetNR2Params ( ( vpp_noise_reduction2_mode_t ) nr_mode, source_port, sig_fmt, is3d, trans_fmt, &regs ) == 0 ) {
- ret = Vpp_LoadRegs ( regs );
- } else {
- LOGE ( "PQ_GetNR2Params failed!\n" );
- }
- }
+int CVpp::Vpp_SetNoiseReductionMode(vpp_noise_reduction_mode_t nr_mode,
+ tv_source_input_type_t source_type, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ am_regs_t regs;
+
+ if (mbVppCfg_new_nr) {
+ if (mpPqData->PQ_GetNR2Params((vpp_noise_reduction2_mode_t) nr_mode, source_port, sig_fmt,
+ is3d, trans_fmt, &regs) == 0) {
+ ret = Vpp_LoadRegs(regs);
+ } else {
+ LOGE("PQ_GetNR2Params failed!\n");
+ }
+ }
- return ret;
+ return ret;
}
-int CVpp::Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type )
-{
- int tmp_save_noisereduction_mode = ( int ) nr_mode;
- return SSMSaveNoiseReduction ( source_type, tmp_save_noisereduction_mode );
+int CVpp::SaveNoiseReductionMode(vpp_noise_reduction_mode_t nr_mode,
+ tv_source_input_type_t source_type) {
+ int tmp_save_noisereduction_mode = (int) nr_mode;
+ return SSMSaveNoiseReduction(source_type, tmp_save_noisereduction_mode);
}
-int CVpp::Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt, int is_save )
-{
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
- if ( 0 == Vpp_SetNoiseReductionMode ( nr_mode, source_type, source_port, sig_fmt, is3d, trans_fmt ) ) {
- if ( is_save == 1 ) {
- return Tv_SaveNoiseReductionMode ( nr_mode, source_type );
- } else {
- return 0;
- }
- }
+int CVpp::SetNoiseReductionMode(vpp_noise_reduction_mode_t nr_mode,
+ tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d,
+ tvin_trans_fmt_t trans_fmt, int is_save) {
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
+ if (0 == Vpp_SetNoiseReductionMode(nr_mode, source_type, source_port, sig_fmt, is3d, trans_fmt)) {
+ if (is_save == 1) {
+ return SaveNoiseReductionMode(nr_mode, source_type);
+ } else {
+ return 0;
+ }
+ }
- LOGE ( "%s, failed!", __FUNCTION__ );
- return -1;
+ LOGE("%s, failed!", __FUNCTION__);
+ return -1;
}
-vpp_noise_reduction_mode_t CVpp::Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type )
-{
- vpp_noise_reduction_mode_t data = VPP_NOISE_REDUCTION_MODE_MID;
- int tmp_nr_mode = 0;
+vpp_noise_reduction_mode_t CVpp::GetNoiseReductionMode(tv_source_input_type_t source_type) {
+ vpp_noise_reduction_mode_t data = VPP_NOISE_REDUCTION_MODE_MID;
+ int tmp_nr_mode = 0;
- SSMReadNoiseReduction ( source_type, &tmp_nr_mode );
- data = ( vpp_noise_reduction_mode_t ) tmp_nr_mode;
+ SSMReadNoiseReduction(source_type, &tmp_nr_mode);
+ data = (vpp_noise_reduction_mode_t) tmp_nr_mode;
- if ( data < VPP_NOISE_REDUCTION_MODE_OFF || data > VPP_NOISE_REDUCTION_MODE_AUTO ) {
- data = VPP_NOISE_REDUCTION_MODE_MID;
- }
+ if (data < VPP_NOISE_REDUCTION_MODE_OFF || data > VPP_NOISE_REDUCTION_MODE_AUTO) {
+ data = VPP_NOISE_REDUCTION_MODE_MID;
+ }
- return data;
+ return data;
}
-int CVpp::Vpp_SetXVYCCMode ( vpp_xvycc_mode_t xvycc_mode, tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- int ret = -1;
- am_regs_t regs, regs_1;
- char prop_value[PROPERTY_VALUE_MAX];
-
- memset ( prop_value, '\0', 16 );
- const char *config_value;
- config_value = config_get_str ( "TV", "vpp.xvycc.switch_control", "null" );
-
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- if ( mpPqData->PQ_GetXVYCCParams ( ( vpp_xvycc_mode_t ) xvycc_mode, source_port, sig_fmt, is3d, trans_fmt, &regs , &regs_1) == 0 ) {
- ret = Vpp_LoadRegs ( regs );
- ret |= Vpp_LoadRegs ( regs_1 );
- } else {
- LOGE ( "PQ_GetXVYCCParams failed!\n" );
- }
- } else {
- LOGE("disable xvycc!\n");
- }
- return ret;
+int CVpp::Vpp_SetXVYCCMode(vpp_xvycc_mode_t xvycc_mode, tv_source_input_type_t source_type,
+ tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d,
+ tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ am_regs_t regs, regs_1;
+ char prop_value[PROPERTY_VALUE_MAX];
+
+ memset(prop_value, '\0', 16);
+ const char *config_value;
+ config_value = config_get_str("TV", "vpp.xvycc.switch_control", "null");
+
+ if (strcmp(config_value, "enable") == 0) {
+ if (mpPqData->PQ_GetXVYCCParams((vpp_xvycc_mode_t) xvycc_mode, source_port, sig_fmt, is3d,
+ trans_fmt, &regs, &regs_1) == 0) {
+ ret = Vpp_LoadRegs(regs);
+ ret |= Vpp_LoadRegs(regs_1);
+ } else {
+ LOGE("PQ_GetXVYCCParams failed!\n");
+ }
+ } else {
+ LOGE("disable xvycc!\n");
+ }
+ return ret;
}
+int CVpp::Vpp_SetMCDIMode(vpp_mcdi_mode_t mcdi_mode, tv_source_input_type_t source_type,
+ tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d,
+ tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ am_regs_t regs;
-int CVpp::Vpp_SetMCDIMode ( vpp_mcdi_mode_t mcdi_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt)
-{
- int ret = -1;
- am_regs_t regs;
-
- if ( mpPqData->PQ_GetMCDIParams ( ( vpp_mcdi_mode_t ) mcdi_mode, source_port, sig_fmt, is3d, trans_fmt, &regs ) == 0 ) {
- ret = Vpp_LoadRegs ( regs );
- } else {
- LOGE ( "PQ_GetMCDIParams failed!\n" );
- }
- return ret;
+ if (mpPqData->PQ_GetMCDIParams((vpp_mcdi_mode_t) mcdi_mode, source_port, sig_fmt, is3d,
+ trans_fmt, &regs) == 0) {
+ ret = Vpp_LoadRegs(regs);
+ } else {
+ LOGE("%s, PQ_GetMCDIParams failed!\n", __FUNCTION__);
+ }
+ return ret;
}
-
-int CVpp::Vpp_LoadGammaDefault ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt )
+int CVpp::Vpp_SetDeblockMode(vpp_deblock_mode_t mode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt)
{
- int ret = -1;
- int panel_id = 0;
- tcon_gamma_table_t gamma_r, gamma_g, gamma_b;
-
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
+ int ret = -1;
+ am_regs_t regs;
- LOGD ( "Enter %s.\n", __FUNCTION__ );
- ret = mpPqData->PQ_GetGammaTableR ( panel_id, source_port, sig_fmt, &gamma_r );
- ret |= mpPqData->PQ_GetGammaTableG ( panel_id, source_port, sig_fmt, &gamma_g );
- ret |= mpPqData->PQ_GetGammaTableB ( panel_id, source_port, sig_fmt, &gamma_b );
+ if (mpPqData->PQ_GetDeblockParams(mode, source_port, sig_fmt, is3d, trans_fmt, &regs) == 0) {
+ ret = Vpp_LoadRegs(regs);
+ } else {
+ LOGE("%s PQ_GetDeblockParams failed!\n", __FUNCTION__);
+ }
+ return ret;
+}
- if ( ret == 0 ) {
- VPP_SetGammaTbl_R ( ( unsigned short * ) gamma_r.data );
- VPP_SetGammaTbl_G ( ( unsigned short * ) gamma_g.data );
- VPP_SetGammaTbl_B ( ( unsigned short * ) gamma_b.data );
- } else {
- LOGE ( "%s, PQ_GetGammaTable failed!", __FUNCTION__ );
- }
+int CVpp::Vpp_LoadGammaDefault(tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt) {
+ int ret = -1;
+ int panel_id = 0;
+ tcon_gamma_table_t gamma_r, gamma_g, gamma_b;
+
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType(source_type);
+
+ LOGD("Enter %s.\n", __FUNCTION__);
+ ret = mpPqData->PQ_GetGammaTableR(panel_id, source_port, sig_fmt, &gamma_r);
+ ret |= mpPqData->PQ_GetGammaTableG(panel_id, source_port, sig_fmt, &gamma_g);
+ ret |= mpPqData->PQ_GetGammaTableB(panel_id, source_port, sig_fmt, &gamma_b);
+
+ if (ret == 0) {
+ VPP_SetGammaTbl_R((unsigned short *) gamma_r.data);
+ VPP_SetGammaTbl_G((unsigned short *) gamma_g.data);
+ VPP_SetGammaTbl_B((unsigned short *) gamma_b.data);
+ } else {
+ LOGE("%s, PQ_GetGammaTable failed!", __FUNCTION__);
+ }
- return ret;
+ return ret;
}
-int CVpp::Vpp_LoadGammaSpecial ( int gammaValue )
-{
- int ret = -1;
- int panel_id = 0;
- tcon_gamma_table_t gamma_r, gamma_g, gamma_b;
-
- LOGD ( "Enter %s.\n", __FUNCTION__ );
- ret = mpPqData->PQ_GetGammaSpecialTable ( gammaValue, "Red", &gamma_r );
- ret |= mpPqData->PQ_GetGammaSpecialTable ( gammaValue, "Green", &gamma_g );
- ret |= mpPqData->PQ_GetGammaSpecialTable ( gammaValue, "Blue", &gamma_b );
-
- if ( ret == 0 ) {
- VPP_SetGammaTbl_R ( ( unsigned short * ) gamma_r.data );
- VPP_SetGammaTbl_G ( ( unsigned short * ) gamma_g.data );
- VPP_SetGammaTbl_B ( ( unsigned short * ) gamma_b.data );
- } else {
- LOGE ( "%s, PQ_GetGammaSpecialTable failed!", __FUNCTION__ );
- }
+int CVpp::Vpp_LoadGammaSpecial(int gammaValue) {
+ int ret = -1;
+ int panel_id = 0;
+ tcon_gamma_table_t gamma_r, gamma_g, gamma_b;
+
+ LOGD("Enter %s.\n", __FUNCTION__);
+ ret = mpPqData->PQ_GetGammaSpecialTable(gammaValue, "Red", &gamma_r);
+ ret |= mpPqData->PQ_GetGammaSpecialTable(gammaValue, "Green", &gamma_g);
+ ret |= mpPqData->PQ_GetGammaSpecialTable(gammaValue, "Blue", &gamma_b);
+
+ if (ret == 0) {
+ VPP_SetGammaTbl_R((unsigned short *) gamma_r.data);
+ VPP_SetGammaTbl_G((unsigned short *) gamma_g.data);
+ VPP_SetGammaTbl_B((unsigned short *) gamma_b.data);
+ } else {
+ LOGE("%s, PQ_GetGammaSpecialTable failed!", __FUNCTION__);
+ }
- return ret;
+ return ret;
}
-int CVpp::Vpp_LoadGamma ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt )
-{
- int gammaValue = 0, ret = -1;
+int CVpp::Vpp_LoadGamma(tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt) {
+ int gammaValue = 0, ret = -1;
- if ( SSMReadGammaValue ( &gammaValue ) < 0 ) {
- LOGE ( "%s, SSMReadGammaValue ERROR, So Load Default GAMMA!\n", __FUNCTION__ );
- ret = Vpp_LoadGammaDefault ( source_type, sig_fmt );
- return -1;
- }
+ if (SSMReadGammaValue(&gammaValue) < 0) {
+ LOGE("%s, SSMReadGammaValue ERROR, So Load Default GAMMA!\n", __FUNCTION__);
+ ret = Vpp_LoadGammaDefault(source_type, sig_fmt);
+ return -1;
+ }
- if ( gammaValue < -4 || gammaValue > 4 ) {
- LOGE ( "%s, Gamma Value beyond the UI's range of -4 to 4 .\n", __FUNCTION__ );
- gammaValue = 0;
- SSMSaveGammaValue ( gammaValue );
- }
+ if (gammaValue < -4 || gammaValue > 4) {
+ LOGE("%s, Gamma Value beyond the UI's range of -4 to 4 .\n", __FUNCTION__);
+ gammaValue = 0;
+ SSMSaveGammaValue(gammaValue);
+ }
- switch ( gammaValue ) {
- case 0:
- ret = Vpp_LoadGammaDefault ( source_type, sig_fmt );
- break;
+ switch (gammaValue) {
+ case 0:
+ ret = Vpp_LoadGammaDefault(source_type, sig_fmt);
+ break;
- default:
- ret = Vpp_LoadGammaSpecial ( gammaValue );
- break;
- }
+ default:
+ ret = Vpp_LoadGammaSpecial(gammaValue);
+ break;
+ }
- return ret;
+ return ret;
}
-/*int CVpp::Tv_SetGammaValue(int gammaValue)
-{
- int ret = -1;
- tvin_sig_fmt_t sig_fmt = TVIN_SIG_FMT_NULL;
- tv_source_input_type_t source_type = SOURCE_TYPE_TV;
- sig_fmt = Tvin_GetSigFormat();
- source_type = Tvin_GetSrcInputType();
- LOGD("%s, source_type = %d, sig_fmt = %d, gammaValue = %d\n", __FUNCTION__, (int)source_type,
- (int)sig_fmt, gammaValue);
- if (gammaValue >= -4 || gammaValue <= 4) {
- switch(gammaValue) {
- case 0:
- ret = Vpp_LoadGammaDefault(source_type, sig_fmt);
- break;
- default:
- ret = Vpp_LoadGammaSpecial(gammaValue);
- break;
- }
- if(0 == ret)
- ret = SSMSaveGammaValue(gammaValue);
+/*int CVpp::SetGammaValue(int gammaValue)
+ {
+ int ret = -1;
+ tvin_sig_fmt_t sig_fmt = TVIN_SIG_FMT_NULL;
+ tv_source_input_type_t source_type = SOURCE_TYPE_TV;
+ sig_fmt = Tvin_GetSigFormat();
+ source_type = Tvin_GetSrcInputType();
+ LOGD("%s, source_type = %d, sig_fmt = %d, gammaValue = %d\n", __FUNCTION__, (int)source_type,
+ (int)sig_fmt, gammaValue);
+ if (gammaValue >= -4 || gammaValue <= 4) {
+ switch (gammaValue) {
+ case 0:
+ ret = Vpp_LoadGammaDefault(source_type, sig_fmt);
+ break;
+ default:
+ ret = Vpp_LoadGammaSpecial(gammaValue);
+ break;
+ }
+ if (0 == ret)
+ ret = SSMSaveGammaValue(gammaValue);
+ }
+ return ret;
+ }*/
+
+int CVpp::GetGammaValue() {
+ int gammaValue = 0;
+
+ if (SSMReadGammaValue(&gammaValue) < 0) {
+ LOGE("%s, SSMReadGammaValue ERROR!!!\n", __FUNCTION__);
+ return -1;
}
- return ret;
-}*/
-
-int CVpp::Tv_GetGammaValue()
-{
- int gammaValue = 0;
- if ( SSMReadGammaValue ( &gammaValue ) < 0 ) {
- LOGE ( "%s, SSMReadGammaValue ERROR!!!\n", __FUNCTION__ );
- return -1;
- }
-
- return gammaValue;
+ return gammaValue;
}
-/*int CVpp::Tv_SetColorDemoMode ( vpp_color_demomode_t demomode )
-{
- tv_source_input_type_t source_type = Tvin_GetSrcInputType();
- tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
- tvin_sig_fmt_t sig_fmt = Tvin_GetSigFormat();
- is_3d_type_t is3d = Tvin_Get3DStatus();
- tvin_trans_fmt_t trans_fmt = Tvin_GetSigTransFormat();
+/*int CVpp::SetColorDemoMode ( vpp_color_demomode_t demomode )
+ {
+ tv_source_input_type_t source_type = Tvin_GetSrcInputType();
+ tvin_port_t source_port = CTvin::Tvin_GetSourcePortBySourceType ( source_type );
+ tvin_sig_fmt_t sig_fmt = Tvin_GetSigFormat();
+ is_3d_type_t is3d = Tvin_Get3DStatus();
+ tvin_trans_fmt_t trans_fmt = Tvin_GetSigTransFormat();
- return Tv_SetBaseColorMode ( VPP_COLOR_BASE_MODE_DEMO ,source_port,sig_fmt,status,trans_fmt);
-}*/
+ return SetBaseColorMode ( VPP_COLOR_BASE_MODE_DEMO ,source_port,sig_fmt,status,trans_fmt);
+ }*/
-vpp_color_demomode_t CVpp::Tv_GetColorDemoMode ( void )
-{
- vpp_color_demomode_t data = VPP_COLOR_DEMO_MODE_ALLON;
- unsigned char tmp_demo_mode = 0;
- SSMReadColorDemoMode ( &tmp_demo_mode );
- data = ( vpp_color_demomode_t ) tmp_demo_mode;
+vpp_color_demomode_t CVpp::GetColorDemoMode(void) {
+ vpp_color_demomode_t data = VPP_COLOR_DEMO_MODE_ALLON;
+ unsigned char tmp_demo_mode = 0;
+ SSMReadColorDemoMode(&tmp_demo_mode);
+ data = (vpp_color_demomode_t) tmp_demo_mode;
- if ( data < VPP_COLOR_DEMO_MODE_ALLON || data > VPP_COLOR_DEMO_MODE_ALLOFF ) {
- data = VPP_COLOR_DEMO_MODE_ALLON;
- }
+ if (data < VPP_COLOR_DEMO_MODE_ALLON || data > VPP_COLOR_DEMO_MODE_ALLOFF) {
+ data = VPP_COLOR_DEMO_MODE_ALLON;
+ }
- return data;
+ return data;
}
+int CVpp::SetBaseColorModeWithoutSave(vpp_color_basemode_t basemode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ am_regs_t regs;
+
+ if (mbVppCfg_new_cm) {
+ if (mpPqData->PQ_GetCM2Params((vpp_color_management2_t) basemode, source_port, sig_fmt,
+ is3d, trans_fmt, &regs) == 0) {
+ ret = Vpp_LoadRegs(regs);
+ } else {
+ LOGE("PQ_GetCM2Params failed!\n");
+ }
+ }
-int CVpp::Tv_SetBaseColorModeWithoutSave ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt)
-{
- int ret = -1;
- am_regs_t regs;
-
- if ( mbVppCfg_new_cm) {
- if ( mpPqData->PQ_GetCM2Params ( ( vpp_color_management2_t ) basemode, source_port, sig_fmt, is3d, trans_fmt, &regs ) == 0 ) {
- ret = Vpp_LoadRegs ( regs );
- } else {
- LOGE ( "PQ_GetCM2Params failed!\n" );
- }
- }
-
- return ret;
+ return ret;
}
-int CVpp::Tv_SaveBaseColorMode ( vpp_color_basemode_t basemode )
-{
- int ret = -1;
+int CVpp::SaveBaseColorMode(vpp_color_basemode_t basemode) {
+ int ret = -1;
- if ( basemode == VPP_COLOR_BASE_MODE_DEMO ) {
- ret = 0;
- } else {
- ret |= SSMSaveColorBaseMode ( basemode );
- }
+ if (basemode == VPP_COLOR_BASE_MODE_DEMO) {
+ ret = 0;
+ } else {
+ ret |= SSMSaveColorBaseMode(basemode);
+ }
- return ret;
+ return ret;
}
-int CVpp::Tv_SetBaseColorMode ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt)
-{
- if ( 0 == Tv_SetBaseColorModeWithoutSave ( basemode, source_port, sig_fmt, is3d, trans_fmt) ) {
- return Tv_SaveBaseColorMode ( basemode );
- } else {
- LOGE ( "Tv_SetBaseColorMode() Failed!!!" );
- return -1;
- }
- return 0;
+int CVpp::SetBaseColorMode(vpp_color_basemode_t basemode, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ if (0 == SetBaseColorModeWithoutSave(basemode, source_port, sig_fmt, is3d, trans_fmt)) {
+ return SaveBaseColorMode(basemode);
+ } else {
+ LOGE("SetBaseColorMode() Failed!!!");
+ return -1;
+ }
+ return 0;
}
-vpp_color_basemode_t CVpp::Tv_GetBaseColorMode ( void )
-{
- vpp_color_basemode_t data = VPP_COLOR_BASE_MODE_OFF;
- unsigned char tmp_base_mode = 0;
- SSMReadColorBaseMode ( &tmp_base_mode );
- data = ( vpp_color_basemode_t ) tmp_base_mode;
+vpp_color_basemode_t CVpp::GetBaseColorMode(void) {
+ vpp_color_basemode_t data = VPP_COLOR_BASE_MODE_OFF;
+ unsigned char tmp_base_mode = 0;
+ SSMReadColorBaseMode(&tmp_base_mode);
+ data = (vpp_color_basemode_t) tmp_base_mode;
- if ( data < VPP_COLOR_BASE_MODE_OFF || data >= VPP_COLOR_BASE_MODE_MAX ) {
- data = VPP_COLOR_BASE_MODE_OPTIMIZE;
- }
+ if (data < VPP_COLOR_BASE_MODE_OFF || data >= VPP_COLOR_BASE_MODE_MAX) {
+ data = VPP_COLOR_BASE_MODE_OPTIMIZE;
+ }
- return data;
+ return data;
}
-int CVpp::Tv_SetColorTempWithoutSave ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type )
-{
- tcon_rgb_ogo_t rgbogo;
- int ret = -1;
+int CVpp::SetColorTempWithoutSave(vpp_color_temperature_mode_t Tempmode,
+ tv_source_input_type_t source_type) {
+ tcon_rgb_ogo_t rgbogo;
+ int ret = -1;
- if ( mbVppCfg_whitebalance_sameparam) {
- source_type = SOURCE_TYPE_TV; //set all source share to use one group
- }
+ if (mbVppCfg_whitebalance_sameparam) {
+ source_type = SOURCE_TYPE_TV; //set all source share to use one group
+ }
- if ( mbVppCfg_gamma_onoff) {
- VPP_SetGammaOnOff ( 0 );
- } else {
- VPP_SetGammaOnOff ( 1 );
- }
+ if (mbVppCfg_gamma_onoff) {
+ VPP_SetGammaOnOff(0);
+ } else {
+ VPP_SetGammaOnOff(1);
+ }
- GetColorTemperatureParams ( Tempmode, &rgbogo );
+ GetColorTemperatureParams(Tempmode, &rgbogo);
- return VPP_SetRGBOGO ( &rgbogo );
+ return VPP_SetRGBOGO(&rgbogo);
}
-int CVpp::Tv_SaveColorTemp ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type )
-{
- int ret = -1;
- int tmp_temp_mode = 0;
- tcon_rgb_ogo_t rgbogo;
+int CVpp::SaveColorTemp(vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type) {
+ int ret = -1;
+ int tmp_temp_mode = 0;
+ tcon_rgb_ogo_t rgbogo;
- if ( mbVppCfg_whitebalance_sameparam) {
- source_type = SOURCE_TYPE_TV; //set all source share to use one group
- }
+ if (mbVppCfg_whitebalance_sameparam) {
+ source_type = SOURCE_TYPE_TV; //set all source share to use one group
+ }
- GetColorTemperatureParams ( Tempmode, &rgbogo );
+ GetColorTemperatureParams(Tempmode, &rgbogo);
- if ( Tempmode < VPP_COLOR_TEMPERATURE_MODE_USER ) {
- ret = SSMSaveRGBGainRStart ( 0, rgbogo.r_gain );
- ret |= SSMSaveRGBGainGStart ( 0, rgbogo.g_gain );
- ret |= SSMSaveRGBGainBStart ( 0, rgbogo.b_gain );
- }
+ if (Tempmode < VPP_COLOR_TEMPERATURE_MODE_USER) {
+ ret = SSMSaveRGBGainRStart(0, rgbogo.r_gain);
+ ret |= SSMSaveRGBGainGStart(0, rgbogo.g_gain);
+ ret |= SSMSaveRGBGainBStart(0, rgbogo.b_gain);
+ }
- tmp_temp_mode = ( int ) Tempmode;
+ tmp_temp_mode = (int) Tempmode;
- if ( mbVppCfg_colortemp_by_source) {
- ret |= SSMSaveColorTemperature ( ( int ) source_type, tmp_temp_mode );
- } else {
- ret |= SSMSaveColorTemperature ( 0, tmp_temp_mode );
- }
+ if (mbVppCfg_colortemp_by_source) {
+ ret |= SSMSaveColorTemperature((int) source_type, tmp_temp_mode);
+ } else {
+ ret |= SSMSaveColorTemperature(0, tmp_temp_mode);
+ }
- return ret;
+ return ret;
}
-int CVpp::Tv_SetColorTemperature ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type, int is_save )
-{
- if ( Tv_SetColorTempWithoutSave ( Tempmode, source_type ) < 0 ) {
- LOGE ( "%s, failed!", __FUNCTION__ );
- return -1;
- } else {
- if ( is_save == 1 ) {
- return Tv_SaveColorTemp ( Tempmode, source_type );
- } else {
- return 0;
- }
- }
-}
-
-vpp_color_temperature_mode_t CVpp::Tv_GetColorTemperature ( tv_source_input_type_t source_type )
-{
- vpp_color_temperature_mode_t data = VPP_COLOR_TEMPERATURE_MODE_STANDARD;
- int tmp_temp_mode = 0;
+int CVpp::SetColorTemperature(vpp_color_temperature_mode_t Tempmode,
+ tv_source_input_type_t source_type, int is_save) {
+ if (SetColorTempWithoutSave(Tempmode, source_type) < 0) {
+ LOGE("%s, failed!", __FUNCTION__);
+ return -1;
+ } else {
+ if (is_save == 1) {
+ return SaveColorTemp(Tempmode, source_type);
+ } else {
+ return 0;
+ }
+ }
+}
- if ( mbVppCfg_colortemp_by_source) {
- SSMReadColorTemperature ( ( int ) source_type, &tmp_temp_mode );
- } else {
- SSMReadColorTemperature ( 0, &tmp_temp_mode );
- }
+vpp_color_temperature_mode_t CVpp::GetColorTemperature(tv_source_input_type_t source_type) {
+ vpp_color_temperature_mode_t data = VPP_COLOR_TEMPERATURE_MODE_STANDARD;
+ int tmp_temp_mode = 0;
- data = ( vpp_color_temperature_mode_t ) tmp_temp_mode;
+ if (mbVppCfg_colortemp_by_source) {
+ SSMReadColorTemperature((int) source_type, &tmp_temp_mode);
+ } else {
+ SSMReadColorTemperature(0, &tmp_temp_mode);
+ }
- if ( data < VPP_COLOR_TEMPERATURE_MODE_STANDARD || data > VPP_COLOR_TEMPERATURE_MODE_USER ) {
- data = VPP_COLOR_TEMPERATURE_MODE_STANDARD;
- }
+ data = (vpp_color_temperature_mode_t) tmp_temp_mode;
+
+ if (data < VPP_COLOR_TEMPERATURE_MODE_STANDARD || data > VPP_COLOR_TEMPERATURE_MODE_USER) {
+ data = VPP_COLOR_TEMPERATURE_MODE_STANDARD;
+ }
- return data;
+ return data;
}
-int CVpp::VPP_SetNonLinearFactor ( int value )
-{
- FILE *fp = NULL;
+int CVpp::VPP_SetNonLinearFactor(int value) {
+ FILE *fp = NULL;
- fp = fopen ( "/sys/class/video/nonlinear_factor", "w" );
- LOGD ( "~~~fopen~~~##VPP_SetNonLinearFactor##%s : %d ##" , "/sys/class/video/nonlinear_factor", value);
+ fp = fopen("/sys/class/video/nonlinear_factor", "w");
+ LOGD("~~~fopen~~~##VPP_SetNonLinearFactor##%s : %d ##", "/sys/class/video/nonlinear_factor",
+ value);
- if ( fp == NULL ) {
- LOGE ( "Open /sys/class/video/nonlinear_factor error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/class/video/nonlinear_factor error(%s)!\n", strerror(errno));
+ return -1;
+ }
- fprintf ( fp, "%d", value );
+ fprintf(fp, "%d", value);
- fclose ( fp );
- fp = NULL;
+ fclose(fp);
+ fp = NULL;
- return 0;
+ return 0;
}
-vpp_display_mode_t CVpp::Tv_GetDisplayMode ( tv_source_input_type_t source_type )
-{
- vpp_display_mode_t data = VPP_DISPLAY_MODE_169;
- int tmp_dis_mode = 0;
+vpp_display_mode_t CVpp::GetDisplayMode(tv_source_input_type_t source_type) {
+ vpp_display_mode_t data = VPP_DISPLAY_MODE_169;
+ int tmp_dis_mode = 0;
- SSMReadDisplayMode ( source_type, &tmp_dis_mode );
- data = ( vpp_display_mode_t ) tmp_dis_mode;
+ SSMReadDisplayMode(source_type, &tmp_dis_mode);
+ data = (vpp_display_mode_t) tmp_dis_mode;
- return data;
+ return data;
}
+int CVpp::SetBacklightWithoutSave(int value, tv_source_input_type_t source_type) {
+ int backlight_value, backlight_reverse = 0;
+ int ret = -1;
+ int tmp_pic_mode = 0;
+ source_type = SOURCE_TYPE_TV;
-int CVpp::Tv_SetBacklightWithoutSave ( int value, tv_source_input_type_t source_type )
-{
- int backlight_value, backlight_reverse = 0;
- int ret = -1;
- int tmp_pic_mode = 0;
+ if (value < 0 || value > 100) {
+ value = 100;
+ }
- source_type = SOURCE_TYPE_TV;
+ if (mbVppCfg_backlight_reverse) {
+ backlight_value = (100 - value) * 255 / 100;
+ } else {
+ backlight_value = value * 255 / 100;
+ }
- if ( value < 0 || value > 100 ) {
- value = 100;
- }
+ return VPP_SetBackLightLevel(backlight_value);
+}
- if ( mbVppCfg_backlight_reverse) {
- backlight_value = ( 100 - value ) * 255 / 100;
- } else {
- backlight_value = value * 255 / 100;
- }
+int CVpp::VPP_SetBackLightLevel(int value) {
+ FILE *fp = NULL;
+ fp = fopen("/sys/class/backlight/aml-bl/brightness", "w");
+ LOGD("~~~fopen~~~##VPP_SetBackLightLevel##%s : %d ##",
+ "/sys/class/backlight/aml-bl/brightness", value);
- return VPP_SetBackLightLevel ( backlight_value );
-}
+ if (fp == NULL) {
+ LOGE("Open /sys/class/backlight/aml-bl/brightness error(%s)!\n", strerror(errno));
+ return -1;
+ }
-int CVpp::VPP_SetBackLightLevel ( int value )
-{
- FILE *fp = NULL;
- const char *config_value;
+ fprintf(fp, "%d", value);
- config_value = config_get_str ( "TV", "vpp.backlight.built_in_ctrl", "null" );
+ fclose(fp);
+ fp = NULL;
- if ( strcmp ( config_value, "enable" ) == 0 ) {
- fp = fopen ( "/sys/class/backlight/aml-bl/brightness", "w" );
- LOGD ( "~~~fopen~~~##VPP_SetBackLightLevel##%s : %d ##" , "/sys/class/backlight/aml-bl/brightness", value);
+ return 0;
+}
- if ( fp == NULL ) {
- LOGE ( "Open /sys/class/backlight/aml-bl/brightness error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+int CVpp::SetBacklight(int value, tv_source_input_type_t source_type, int is_save) {
+ static const int MIN_BACKLIGHT_VALUE = 1;
+ if (value >= MIN_BACKLIGHT_VALUE) {
+ if (SetBacklightWithoutSave(value, source_type) < 0) {
+ LOGE("%s, failed !", __FUNCTION__);
+ return -1;
+ }
- fprintf ( fp, "%d", value );
+ } else {
+ if (SetBacklightWithoutSave(MIN_BACKLIGHT_VALUE, source_type) < 0) {
+ LOGE("%s, failed !", __FUNCTION__);
+ return -1;
+ }
+ }
+ if (is_save == 1) {
+ return SaveBacklight(value, source_type);
+ } else {
+ return 0;
+ }
+}
- fclose ( fp );
- fp = NULL;
+int CVpp::GetBacklight(tv_source_input_type_t source_type) {
+ int data = 0;
+ vpp_pq_para_t pq_para;
- return 0;
- } else {
- // TODO : control the backlight through the CEC.
+ if (mbVppCfg_pqmode_depend_bklight) {
+ vpp_picture_mode_t pq_mode = GetPQMode(source_type);
- return 0;
- }
-}
+ if (pq_mode == VPP_PICTURE_MODE_USER) {
+ SSMReadBackLightVal(source_type, &data);
+ } else {
+ Vpp_GetPQModeValue(source_type, pq_mode, &pq_para);
+ data = pq_para.backlight;
+ }
+ } else {
+ source_type = SOURCE_TYPE_TV;
+ SSMReadBackLightVal(source_type, &data);
+ }
-int CVpp::Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save )
-{
- if ( Tv_SetBacklightWithoutSave ( value, source_type ) < 0 ) {
- LOGE ( "%s, failed !", __FUNCTION__ );
- return -1;
- }
+ if (data < 0 || data > 100) {
+ data = 100;
+ }
- if ( is_save == 1 ) {
- return Tv_SaveBacklight ( value, source_type );
- } else {
- return 0;
- }
+ return data;
}
-int CVpp::Tv_GetBacklight ( tv_source_input_type_t source_type )
-{
- int data = 0;
- vpp_pq_para_t pq_para;
+int CVpp::SaveBacklight(int value, tv_source_input_type_t source_type) {
+ int backlight_value, backlight_reverse = 0;
+ int ret = -1;
+ int tmp_pic_mode = 0;
- if ( mbVppCfg_pqmode_depend_bklight) {
- vpp_picture_mode_t pq_mode = Tv_GetPQMode ( source_type );
+ if (!mbVppCfg_pqmode_depend_bklight) {
+ source_type = SOURCE_TYPE_TV;
+ }
- if ( pq_mode == VPP_PICTURE_MODE_USER ) {
- SSMReadBackLightVal ( source_type, &data );
- } else {
- Vpp_GetPQModeValue ( source_type, pq_mode, &pq_para );
- data = pq_para.backlight;
- }
- } else {
- source_type = SOURCE_TYPE_TV;
- SSMReadBackLightVal ( source_type, &data );
- }
+ if (value < 0 || value > 100) {
+ value = 100;
+ }
- if ( data < 0 || data > 100 ) {
- data = 100;
- }
+ ret = SSMSaveBackLightVal(source_type, value);
- return data;
+ return ret;
}
-int CVpp::Tv_SaveBacklight ( int value, tv_source_input_type_t source_type )
-{
- int backlight_value, backlight_reverse = 0;
- int ret = -1;
- int tmp_pic_mode = 0;
+int CVpp::VPP_SetBackLight_Switch(int value) {
+ FILE *fp = NULL;
+ fp = fopen("/sys/class/backlight/aml-bl/bl_power", "w");
+ LOGD("~~~fopen~~~##VPP_SetBackLight_Switch##%s : %d ##",
+ "/sys/class/backlight/aml-bl/bl_power", value);
- if ( !mbVppCfg_pqmode_depend_bklight ) {
- source_type = SOURCE_TYPE_TV;
- }
-
- if ( value < 0 || value > 100 ) {
- value = 100;
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/class/backlight/aml-bl/bl_power error(%s)!\n", strerror(errno));
+ return -1;
+ }
- ret = SSMSaveBackLightVal ( source_type, value );
+ fprintf(fp, "%d", value);
+ fclose(fp);
+ fp = NULL;
- return ret;
+ return 0;
}
-int CVpp::Tv_SetDNLP ( tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- unsigned int dnlp_switch = 0;
+int CVpp::VPP_GetBackLight_Switch(void) {
+ FILE *fp = NULL;
+ int value;
+
+ fp = fopen("/sys/class/backlight/aml-bl/bl_power", "w");
- int ret = -1;
- int dnlpFlag = -1;
- ve_dnlp_t dnlp;
- ve_dnlp_table_t newdnlp;
+ if (fp == NULL) {
+ LOGE("Open /sys/class/backlight/aml-bl/bl_power error(%s)!\n", strerror(errno));
+ return -1;
+ }
- dnlp_switch = 1;
+ fscanf(fp, "%d", &value);
+ LOGD("~~~fopen~~~##VPP_GetBackLight_Switch##%s : %d ##",
+ "/sys/class/backlight/aml-bl/bl_power", value);
+
+ fclose(fp);
+ fp = NULL;
+ if (value < 0) {
+ return 0;
+ } else {
+ return value;
+ }
+}
+int CVpp::SetDNLP(tv_source_input_type_t source_type, tvin_port_t source_port,
+ tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ unsigned int dnlp_switch = 0;
- if ( mpPqData->PQ_GetDNLPParams ( source_port, sig_fmt, is3d, trans_fmt, &dnlp, &newdnlp, &dnlpFlag ) == 0 ) {
- newdnlp.en = dnlp_switch;
- LOGE ( "PQ_GetDNLPParams ok!\n" );
- LOGE ( "newdnlp.en:%d,newdnlp.method:%d,newdnlp.cliprate:%d,newdnlp.lowrange:%d,newdnlp.hghrange:%d,newdnlp.lowalpha:%d,newdnlp.midalpha:%d,newdnlp.hghalpha:%d\n",
- newdnlp.en, newdnlp.method, newdnlp.cliprate, newdnlp.lowrange, newdnlp.hghrange, newdnlp.lowalpha, newdnlp.midalpha, newdnlp.hghalpha);
- VPP_SetVENewDNLP ( &newdnlp );
- SetFileAttrValue ( "/sys/module/am_vecm/parameters/dnlp_en", "1" );
- ret = 1;
- } else {
- LOGE ( "mpPqData->PQ_GetDNLPParams failed!\n" );
- }
+ int ret = -1;
+ int dnlpFlag = -1;
+ ve_dnlp_t dnlp;
+ ve_dnlp_table_t newdnlp;
+
+ dnlp_switch = 1;
+
+ if (mpPqData->PQ_GetDNLPParams(source_port, sig_fmt, is3d, trans_fmt, &dnlp, &newdnlp,
+ &dnlpFlag) == 0) {
+ newdnlp.en = dnlp_switch;
+ LOGE("PQ_GetDNLPParams ok!\n");
+ LOGE(
+ "newdnlp.en:%d,newdnlp.method:%d,newdnlp.cliprate:%d,newdnlp.lowrange:%d,newdnlp.hghrange:%d,newdnlp.lowalpha:%d,newdnlp.midalpha:%d,newdnlp.hghalpha:%d\n",
+ newdnlp.en, newdnlp.method, newdnlp.cliprate, newdnlp.lowrange, newdnlp.hghrange,
+ newdnlp.lowalpha, newdnlp.midalpha, newdnlp.hghalpha);
+ if (source_type == SOURCE_TYPE_DTV) {
+ SetFileAttrValue("/sys/module/am_vecm/parameters/dnlp_en", "0");
+ } else {
+ VPP_SetVENewDNLP(&newdnlp);
+ SetFileAttrValue("/sys/module/am_vecm/parameters/dnlp_en", "1");
+ }
+ ret = 1;
+ } else {
+ LOGE("mpPqData->PQ_GetDNLPParams failed!\n");
+ }
- return ret;
+ return ret;
}
-int CVpp::VPP_SetVEDNLP ( const struct ve_dnlp_s *pDNLP )
-{
- int rt = VPP_DeviceIOCtl ( AMVECM_IOC_VE_DNLP, pDNLP );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEDNLP##AMVECM_IOC_VE_DNLP##" );
+int CVpp::VPP_SetVEDNLP(const struct ve_dnlp_s *pDNLP) {
+ int rt = VPP_DeviceIOCtl(AMVECM_IOC_VE_DNLP, pDNLP);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetVEDNLP##AMVECM_IOC_VE_DNLP##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetVEDNLP, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetVEDNLP, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetVENewDNLP ( const ve_dnlp_table_t *pDNLP )
-{
- int rt = VPP_DeviceIOCtl ( AMVECM_IOC_VE_NEW_DNLP, pDNLP );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVENewDNLP##AMVECM_IOC_VE_NEW_DNLP##" );
+int CVpp::VPP_SetVENewDNLP(const ve_dnlp_table_t *pDNLP) {
+ int rt = VPP_DeviceIOCtl(AMVECM_IOC_VE_NEW_DNLP, pDNLP);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetVENewDNLP##AMVECM_IOC_VE_NEW_DNLP##");
- if ( rt < 0 ) {
- LOGE ( "VPP_SetVENewDNLP, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("VPP_SetVENewDNLP, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::Tv_SetDnlp_OFF ( void )
-{
- if ( Vpp_SetDnlpOff() < 0 ) {
- LOGE ( "%s failed.\n", __FUNCTION__ );
- return -1;
- } else {
- LOGE ( "%s success.\n", __FUNCTION__ );
- SSMSaveDnlpStart ( 1 ); //save dnlp status to e2rom
- return 0;
- }
-}
-int CVpp::Tv_SetDnlp_ON ( void )
-{
- if ( Vpp_SetDnlpOn() < 0 ) {
- LOGE ( "%s failed.\n", __FUNCTION__ );
- return -1;
- } else {
- LOGE ( "%s success.\n", __FUNCTION__ );
- SSMSaveDnlpStart ( 0 ); //save dnlp status to e2rom
- return 0;
- }
+int CVpp::SetDnlp_OFF(void) {
+ if (Vpp_SetDnlpOff() < 0) {
+ LOGE("%s failed.\n", __FUNCTION__);
+ return -1;
+ } else {
+ LOGE("%s success.\n", __FUNCTION__);
+ SSMSaveDnlpStart(1); //save dnlp status to e2rom
+ return 0;
+ }
+}
+int CVpp::SetDnlp_ON(void) {
+ if (Vpp_SetDnlpOn() < 0) {
+ LOGE("%s failed.\n", __FUNCTION__);
+ return -1;
+ } else {
+ LOGE("%s success.\n", __FUNCTION__);
+ SSMSaveDnlpStart(0); //save dnlp status to e2rom
+ return 0;
+ }
}
-int CVpp::Vpp_SetDnlpOff ( void )
-{
- //According linux driver to modify the AMSTREAM_IOC_VE_DNLP_DIS to the AMVECM_IOC_VE_DNLP_DIS.
- //int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_DNLP_DIS);
- int rt = VPP_DeviceIOCtl ( AMVECM_IOC_VE_DNLP_DIS );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##Vpp_SetDnlpOff##AMVECM_IOC_VE_DNLP_DIS##" );
+int CVpp::Vpp_SetDnlpOff(void) {
+ //According linux driver to modify the AMSTREAM_IOC_VE_DNLP_DIS to the AMVECM_IOC_VE_DNLP_DIS.
+ //int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_DNLP_DIS);
+ int rt = VPP_DeviceIOCtl(AMVECM_IOC_VE_DNLP_DIS);
+ LOGD("~~~VPP_DeviceIOCtl~~~##Vpp_SetDnlpOff##AMVECM_IOC_VE_DNLP_DIS##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_SetDnlpOff, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_SetDnlpOff, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::Vpp_SetDnlpOn ( void )
-{
- //According linux driver to modify the AMSTREAM_IOC_VE_DNLP_DIS to the AMVECM_IOC_VE_DNLP_DIS.
- //int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_DNLP_EN);
- int rt = VPP_DeviceIOCtl ( AMVECM_IOC_VE_DNLP_EN );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##Vpp_SetDnlpOn##AMVECM_IOC_VE_DNLP_EN##" );
+int CVpp::Vpp_SetDnlpOn(void) {
+ //According linux driver to modify the AMSTREAM_IOC_VE_DNLP_DIS to the AMVECM_IOC_VE_DNLP_DIS.
+ //int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_DNLP_EN);
+ int rt = VPP_DeviceIOCtl(AMVECM_IOC_VE_DNLP_EN);
+ LOGD("~~~VPP_DeviceIOCtl~~~##Vpp_SetDnlpOn##AMVECM_IOC_VE_DNLP_EN##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_SetDnlpOn, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_SetDnlpOn, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::Tv_GetDnlp_Status()
-{
- unsigned char status = 0;
- SSMReadDnlpStart ( &status );
- LOGD ( "%s, %d.", __FUNCTION__, status );
- return status;
+int CVpp::GetDnlp_Status() {
+ unsigned char status = 0;
+ SSMReadDnlpStart(&status);
+ LOGD("%s, %d.", __FUNCTION__, status);
+ return status;
}
-int CVpp::VPP_SetRGBOGO ( const struct tcon_rgb_ogo_s *rgbogo )
-{
- int rt = VPP_DeviceIOCtl ( AMVECM_IOC_S_RGB_OGO, rgbogo );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetRGBOGO##AMVECM_IOC_S_RGB_OGO##" );
- usleep ( 50 * 1000 );
+int CVpp::VPP_SetRGBOGO(const struct tcon_rgb_ogo_s *rgbogo) {
+ int rt = VPP_DeviceIOCtl(AMVECM_IOC_S_RGB_OGO, rgbogo);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetRGBOGO##AMVECM_IOC_S_RGB_OGO##");
+ usleep(50 * 1000);
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetRGBOGO, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetRGBOGO, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_GetRGBOGO ( const struct tcon_rgb_ogo_s *rgbogo )
-{
- int rt = VPP_DeviceIOCtl ( AMVECM_IOC_G_RGB_OGO, rgbogo );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_GetRGBOGO##AMVECM_IOC_G_RGB_OGO##" );
+int CVpp::VPP_GetRGBOGO(const struct tcon_rgb_ogo_s *rgbogo) {
+ int rt = VPP_DeviceIOCtl(AMVECM_IOC_G_RGB_OGO, rgbogo);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_GetRGBOGO##AMVECM_IOC_G_RGB_OGO##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_GetRGBOGO, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_GetRGBOGO, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::Tv_SetRGBOGO_PostOffset(int rgb, int offset)
-{
- tcon_rgb_ogo_t rgbogo;
-
- if ( VPP_GetRGBOGO ( &rgbogo ) < 0 ) return -1;
- switch(rgb) {
- case 0://r
- rgbogo.r_post_offset = offset;
- break;
- case 1://g
- rgbogo.g_post_offset = offset;
- break;
- case 2://b
- rgbogo.b_post_offset = offset;
- break;
- default:
- break;
- }
- if ( VPP_SetRGBOGO ( &rgbogo ) != 0 ) return -1;
- int ret = 0;
- switch(rgb) {
- case 0:
- ret = SSMSaveRGBPostOffsetRStart ( 0, offset);
- break;
- case 1:
- ret = SSMSaveRGBPostOffsetGStart ( 0, offset);
- break;
- case 2:
- ret = SSMSaveRGBPostOffsetBStart ( 0, offset);
- break;
- default:
- break;
- }
- return ret;
-}
-
-int CVpp::Tv_SetRGBOGO_Gain(int rgb, int gain)
-{
- tcon_rgb_ogo_t rgbogo;
-
- if ( VPP_GetRGBOGO ( &rgbogo ) < 0 ) return -1;
-
- switch(rgb) {
- case 0://r
- rgbogo.r_gain = gain;
- break;
- case 1://g
- rgbogo.g_gain = gain;
- break;
- case 2://b
- rgbogo.b_gain = gain;
- break;
- default:
- break;
- }
-
- if ( VPP_SetRGBOGO ( &rgbogo ) != 0 ) return -1;
-
- int ret = 0;
- switch(rgb) {
- case 0:
- ret = SSMSaveRGBGainRStart ( 0, gain);
- break;
- case 1:
- ret = SSMSaveRGBGainGStart ( 0, gain);
- break;
- case 2:
- ret = SSMSaveRGBGainBStart ( 0, gain);
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-int CVpp::Tv_GetRGBOGO_PostOffset ( int rgb )
+int CVpp::RGBGainValueSSMToRisterMapping(int gainValue) //0~255
{
- int offset = 0;
- int ret = 0;
- switch(rgb) {
- case 0:
- ret = SSMReadRGBPostOffsetRStart ( 0, &offset ) ;
- break;
- case 1:
- ret = SSMReadRGBPostOffsetGStart ( 0, &offset ) ;
- break;
- case 2:
- ret = SSMReadRGBPostOffsetBStart ( 0, &offset ) ;
- break;
- default:
- break;
- }
-
- if ( offset < -1024 || offset > 1023 ) {
- offset = 0;
- }
-
- return offset;
-}
-
-int CVpp::Tv_GetRGBOGO_Gain ( int rgb )
-{
- unsigned int gain = 0;
-
- int ret = 0;
- switch(rgb) {
- case 0:
- ret = SSMReadRGBGainRStart ( 0, &gain ) ;
- break;
- case 1:
- ret = SSMReadRGBGainGStart ( 0, &gain ) ;
- break;
- case 2:
- ret = SSMReadRGBGainBStart ( 0, &gain ) ;
- break;
- default:
- break;
- }
-
- if ( /*gain_r < 0 || */gain > 2047 ) {
- gain = 1024;
- }
-
- return gain;
-}
-
-//RGB GAIN:0~255 <-----> 512~1536
-int CVpp::Tv_RGBGainValueSSMToRisterMapping ( int gainValue ) //0~255
-{
- int mapValue = 0;
+ int mapValue = 0;
- if ( gainValue < 0 || gainValue > 255 ) {
- mapValue = 1024;
- } else {
- if ( gainValue == 255 ) {
- mapValue = 1536;
- } else {
- mapValue = 512 + gainValue * ( 1536 - 512 ) / 256;
- }
- }
+ if (gainValue < 0 || gainValue > 255) {
+ mapValue = 1024;
+ } else {
+ if (gainValue == 255) {
+ mapValue = 1536;
+ } else {
+ mapValue = 512 + gainValue * (1536 - 512) / 256;
+ }
+ }
- return mapValue;//512~1536
+ return mapValue;//512~1536
}
//RGB OFFSET:-128~127 <-----> -512~512
-int CVpp::Tv_RGBOffsetValueSSMToRisterMapping ( int offsetValue ) //-128~127
+int CVpp::RGBOffsetValueSSMToRisterMapping(int offsetValue) //-128~127
{
- int mapValue = 0;
+ int mapValue = 0;
- if ( offsetValue < -128 || offsetValue > 127 ) {
- offsetValue = 0;
- }
+ if (offsetValue < -128 || offsetValue > 127) {
+ offsetValue = 0;
+ }
- if ( offsetValue == 127 ) {
- mapValue = 512;
- } else {
- mapValue = 1024 * offsetValue / 256;
- }
+ if (offsetValue == 127) {
+ mapValue = 512;
+ } else {
+ mapValue = 1024 * offsetValue / 256;
+ }
- return mapValue;//-512~512
+ return mapValue;//-512~512
}
-int CVpp::Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness )
-{
- int ret = -1;
- vpp_pq_para_t pq_para;
+int CVpp::FactorySetPQMode_Brightness(int source_type, int pq_mode, int brightness) {
+ int ret = -1;
+ vpp_pq_para_t pq_para;
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- pq_para.brightness = brightness;
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ pq_para.brightness = brightness;
- if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- ret = 0;
- } else {
- ret = 1;
- }
- } else {
- ret = -1;
- }
+ if (mpPqData->PQ_SetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ ret = 0;
+ } else {
+ ret = 1;
+ }
+ } else {
+ ret = -1;
+ }
- return ret;
+ return ret;
}
-int CVpp::Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode )
-{
- vpp_pq_para_t pq_para;
+int CVpp::FactoryGetPQMode_Brightness(int source_type, int pq_mode) {
+ vpp_pq_para_t pq_para;
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) {
- return -1;
- }
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) != 0) {
+ return -1;
+ }
- return pq_para.brightness;
+ return pq_para.brightness;
}
+int CVpp::FactorySetPQMode_Contrast(int source_type, int pq_mode, int contrast) {
+ int ret = -1;
+ vpp_pq_para_t pq_para;
-int CVpp::Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast )
-{
- int ret = -1;
- vpp_pq_para_t pq_para;
-
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- pq_para.contrast = contrast;
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ pq_para.contrast = contrast;
- if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- ret = 0;
- } else {
- ret = 1;
- }
- } else {
- ret = -1;
- }
+ if (mpPqData->PQ_SetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ ret = 0;
+ } else {
+ ret = 1;
+ }
+ } else {
+ ret = -1;
+ }
- return ret;
+ return ret;
}
-int CVpp::Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode )
-{
- vpp_pq_para_t pq_para;
+int CVpp::FactoryGetPQMode_Contrast(int source_type, int pq_mode) {
+ vpp_pq_para_t pq_para;
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) {
- return -1;
- }
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) != 0) {
+ return -1;
+ }
- return pq_para.contrast;
+ return pq_para.contrast;
}
-int CVpp::Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation )
-{
- int ret = -1;
- vpp_pq_para_t pq_para;
+int CVpp::FactorySetPQMode_Saturation(int source_type, int pq_mode, int saturation) {
+ int ret = -1;
+ vpp_pq_para_t pq_para;
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- pq_para.saturation = saturation;
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ pq_para.saturation = saturation;
- if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- ret = 0;
- } else {
- ret = 1;
- }
- } else {
- ret = -1;
- }
+ if (mpPqData->PQ_SetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ ret = 0;
+ } else {
+ ret = 1;
+ }
+ } else {
+ ret = -1;
+ }
- return ret;
+ return ret;
}
-int CVpp::Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode )
-{
- vpp_pq_para_t pq_para;
+int CVpp::FactoryGetPQMode_Saturation(int source_type, int pq_mode) {
+ vpp_pq_para_t pq_para;
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) {
- return -1;
- }
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) != 0) {
+ return -1;
+ }
- return pq_para.saturation;
+ return pq_para.saturation;
}
-int CVpp::Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue )
-{
- int ret = -1;
- vpp_pq_para_t pq_para;
+int CVpp::FactorySetPQMode_Hue(int source_type, int pq_mode, int hue) {
+ int ret = -1;
+ vpp_pq_para_t pq_para;
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- pq_para.hue = hue;
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ pq_para.hue = hue;
- if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- ret = 0;
- } else {
- ret = 1;
- }
- } else {
- ret = -1;
- }
+ if (mpPqData->PQ_SetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ ret = 0;
+ } else {
+ ret = 1;
+ }
+ } else {
+ ret = -1;
+ }
- return ret;
+ return ret;
}
-int CVpp::Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode )
-{
- vpp_pq_para_t pq_para;
+int CVpp::FactoryGetPQMode_Hue(int source_type, int pq_mode) {
+ vpp_pq_para_t pq_para;
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) {
- return -1;
- }
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) != 0) {
+ return -1;
+ }
- return pq_para.hue;
+ return pq_para.hue;
}
-int CVpp::Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness )
-{
- int ret = -1;
- vpp_pq_para_t pq_para;
+int CVpp::FactorySetPQMode_Sharpness(int source_type, int pq_mode, int sharpness) {
+ int ret = -1;
+ vpp_pq_para_t pq_para;
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- pq_para.sharpness = sharpness;
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ pq_para.sharpness = sharpness;
- if ( mpPqData->PQ_SetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) == 0 ) {
- ret = 0;
- } else {
- ret = 1;
- }
- } else {
- ret = -1;
- }
+ if (mpPqData->PQ_SetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) == 0) {
+ ret = 0;
+ } else {
+ ret = 1;
+ }
+ } else {
+ ret = -1;
+ }
- return ret;
+ return ret;
}
-int CVpp::Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode )
-{
- vpp_pq_para_t pq_para;
+int CVpp::FactoryGetPQMode_Sharpness(int source_type, int pq_mode) {
+ vpp_pq_para_t pq_para;
- if ( mpPqData->PQ_GetPQModeParams ( ( tv_source_input_type_t ) source_type, ( vpp_picture_mode_t ) pq_mode, &pq_para ) != 0 ) {
- return -1;
- }
+ if (mpPqData->PQ_GetPQModeParams((tv_source_input_type_t) source_type,
+ (vpp_picture_mode_t) pq_mode, &pq_para) != 0) {
+ return -1;
+ }
- return pq_para.sharpness;
+ return pq_para.sharpness;
}
-unsigned short CVpp::CalColorTemperatureParamsChecksum ( void )
-{
- unsigned char data_buf[SSM_CR_RGBOGO_LEN];
- unsigned short sum = 0;
- int cnt;
- USUC usuc;
+unsigned short CVpp::CalColorTemperatureParamsChecksum(void) {
+ unsigned char data_buf[SSM_CR_RGBOGO_LEN];
+ unsigned short sum = 0;
+ int cnt;
+ USUC usuc;
- SSMReadRGBOGOValue ( 0, SSM_CR_RGBOGO_LEN, data_buf );
+ SSMReadRGBOGOValue(0, SSM_CR_RGBOGO_LEN, data_buf);
- for ( cnt = 0; cnt < SSM_CR_RGBOGO_LEN; cnt++ ) {
- sum += data_buf[cnt];
- }
+ for (cnt = 0; cnt < SSM_CR_RGBOGO_LEN; cnt++) {
+ sum += data_buf[cnt];
+ }
- //checksum = 0xff - sum % 0xff;
+ //checksum = 0xff - sum % 0xff;
- LOGD ( "%s, sum = 0x%X.\n", __FUNCTION__, sum );
+ LOGD("%s, sum = 0x%X.\n", __FUNCTION__, sum);
- return sum;
+ return sum;
}
-int CVpp::SetColorTempParamsChecksum ( void )
-{
- int ret = 0;
- USUC usuc;
+int CVpp::SetColorTempParamsChecksum(void) {
+ int ret = 0;
+ USUC usuc;
- usuc.s = CalColorTemperatureParamsChecksum();
+ usuc.s = CalColorTemperatureParamsChecksum();
- LOGD ( "%s, sum = 0x%X.\n", __FUNCTION__, usuc.s );
+ LOGD("%s, sum = 0x%X.\n", __FUNCTION__, usuc.s);
- ret |= SSMSaveRGBOGOValue ( SSM_CR_RGBOGO_LEN, SSM_CR_RGBOGO_CHKSUM_LEN, usuc.c );
+ ret |= SSMSaveRGBOGOValue(SSM_CR_RGBOGO_LEN, SSM_CR_RGBOGO_CHKSUM_LEN, usuc.c);
- return ret;
+ return ret;
}
-unsigned short CVpp::GetColorTempParamsChecksum ( void )
-{
- USUC usuc;
+unsigned short CVpp::GetColorTempParamsChecksum(void) {
+ USUC usuc;
- SSMReadRGBOGOValue ( SSM_CR_RGBOGO_LEN, SSM_CR_RGBOGO_CHKSUM_LEN, usuc.c );
+ SSMReadRGBOGOValue(SSM_CR_RGBOGO_LEN, SSM_CR_RGBOGO_CHKSUM_LEN, usuc.c);
- LOGD ( "%s, sum = 0x%X.\n", __FUNCTION__, usuc.s );
+ LOGD("%s, sum = 0x%X.\n", __FUNCTION__, usuc.s);
- return usuc.s;
+ return usuc.s;
}
-int CVpp::CheckTempDataLable ( void )
-{
- USUC usuc;
- USUC ret;
+int CVpp::CheckTempDataLable(void) {
+ USUC usuc;
+ USUC ret;
- SSMReadRGBOGOValue ( SSM_CR_RGBOGO_LEN - 2, 2, ret.c );
+ SSMReadRGBOGOValue(SSM_CR_RGBOGO_LEN - 2, 2, ret.c);
- usuc.c[0] = 0x55;
- usuc.c[1] = 0xAA;
+ usuc.c[0] = 0x55;
+ usuc.c[1] = 0xAA;
- if ( ( usuc.c[0] == ret.c[0] ) && ( usuc.c[1] == ret.c[1] ) ) {
- LOGD ( "%s, lable ok.\n", __FUNCTION__ );
- return 1;
- } else {
- LOGD ( "%s, lable error.\n", "TV" );
- return 0;
- }
+ if ((usuc.c[0] == ret.c[0]) && (usuc.c[1] == ret.c[1])) {
+ LOGD("%s, lable ok.\n", __FUNCTION__);
+ return 1;
+ } else {
+ LOGD("%s, lable error.\n", "TV");
+ return 0;
+ }
}
-int CVpp::SetTempDataLable ( void )
-{
- USUC usuc;
- int ret = 0;
+int CVpp::SetTempDataLable(void) {
+ USUC usuc;
+ int ret = 0;
- usuc.c[0] = 0x55;
- usuc.c[1] = 0xAA;
+ usuc.c[0] = 0x55;
+ usuc.c[1] = 0xAA;
- ret = SSMSaveRGBOGOValue ( SSM_CR_RGBOGO_LEN - 2, 2, usuc.c );
+ ret = SSMSaveRGBOGOValue(SSM_CR_RGBOGO_LEN - 2, 2, usuc.c);
- return ret;
+ return ret;
}
-int CVpp::GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params )
-{
- // CheckColorTemperatureParamAlldata(source_port,sig_fmt,trans_fmt);
+int CVpp::GetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params) {
+ // CheckColorTemperatureParamAlldata(source_port,sig_fmt,trans_fmt);
- return ReadColorTemperatureParams ( Tempmode, params );
+ return ReadColorTemperatureParams(Tempmode, params);
}
-int CVpp::ReadColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params )
-{
- SUC suc;
- USUC usuc;
- int ret = 0;
+int CVpp::ReadColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params) {
+ SUC suc;
+ USUC usuc;
+ int ret = 0;
- if ( VPP_COLOR_TEMPERATURE_MODE_STANDARD == Tempmode ) { //standard
- ret |= SSMReadRGBOGOValue ( 0, 2, usuc.c );
- params->en = usuc.s;
+ if (VPP_COLOR_TEMPERATURE_MODE_STANDARD == Tempmode) { //standard
+ ret |= SSMReadRGBOGOValue(0, 2, usuc.c);
+ params->en = usuc.s;
- ret |= SSMReadRGBOGOValue ( 2, 2, suc.c );
- params->r_pre_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(2, 2, suc.c);
+ params->r_pre_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 4, 2, suc.c );
- params->g_pre_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(4, 2, suc.c);
+ params->g_pre_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 6, 2, suc.c );
- params->b_pre_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(6, 2, suc.c);
+ params->b_pre_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 8, 2, usuc.c );
- params->r_gain = usuc.s;
+ ret |= SSMReadRGBOGOValue(8, 2, usuc.c);
+ params->r_gain = usuc.s;
- ret |= SSMReadRGBOGOValue ( 10, 2, usuc.c );
- params->g_gain = usuc.s;
+ ret |= SSMReadRGBOGOValue(10, 2, usuc.c);
+ params->g_gain = usuc.s;
- ret |= SSMReadRGBOGOValue ( 12, 2, usuc.c );
- params->b_gain = usuc.s;
+ ret |= SSMReadRGBOGOValue(12, 2, usuc.c);
+ params->b_gain = usuc.s;
- ret |= SSMReadRGBOGOValue ( 14, 2, suc.c );
- params->r_post_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(14, 2, suc.c);
+ params->r_post_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 16, 2, suc.c );
- params->g_post_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(16, 2, suc.c);
+ params->g_post_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 18, 2, suc.c );
- params->b_post_offset = suc.s;
- } else if ( VPP_COLOR_TEMPERATURE_MODE_WARM == Tempmode ) { //warm
- ret |= SSMReadRGBOGOValue ( 20, 2, usuc.c );
- params->en = usuc.s;
+ ret |= SSMReadRGBOGOValue(18, 2, suc.c);
+ params->b_post_offset = suc.s;
+ } else if (VPP_COLOR_TEMPERATURE_MODE_WARM == Tempmode) { //warm
+ ret |= SSMReadRGBOGOValue(20, 2, usuc.c);
+ params->en = usuc.s;
- ret |= SSMReadRGBOGOValue ( 22, 2, suc.c );
- params->r_pre_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(22, 2, suc.c);
+ params->r_pre_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 24, 2, suc.c );
- params->g_pre_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(24, 2, suc.c);
+ params->g_pre_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 26, 2, suc.c );
- params->b_pre_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(26, 2, suc.c);
+ params->b_pre_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 28, 2, usuc.c );
- params->r_gain = usuc.s;
- ret |= SSMReadRGBOGOValue ( 30, 2, usuc.c );
- params->g_gain = usuc.s;
+ ret |= SSMReadRGBOGOValue(28, 2, usuc.c);
+ params->r_gain = usuc.s;
+ ret |= SSMReadRGBOGOValue(30, 2, usuc.c);
+ params->g_gain = usuc.s;
- ret |= SSMReadRGBOGOValue ( 32, 2, usuc.c );
- params->b_gain = usuc.s;
+ ret |= SSMReadRGBOGOValue(32, 2, usuc.c);
+ params->b_gain = usuc.s;
- ret |= SSMReadRGBOGOValue ( 34, 2, suc.c );
- params->r_post_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(34, 2, suc.c);
+ params->r_post_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 36, 2, suc.c );
- params->g_post_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(36, 2, suc.c);
+ params->g_post_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 38, 2, suc.c );
- params->b_post_offset = suc.s;
- } else if ( VPP_COLOR_TEMPERATURE_MODE_COLD == Tempmode ) { //cool
- ret |= SSMReadRGBOGOValue ( 40, 2, usuc.c );
- params->en = usuc.s;
+ ret |= SSMReadRGBOGOValue(38, 2, suc.c);
+ params->b_post_offset = suc.s;
+ } else if (VPP_COLOR_TEMPERATURE_MODE_COLD == Tempmode) { //cool
+ ret |= SSMReadRGBOGOValue(40, 2, usuc.c);
+ params->en = usuc.s;
- ret |= SSMReadRGBOGOValue ( 42, 2, suc.c );
- params->r_pre_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(42, 2, suc.c);
+ params->r_pre_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 44, 2, suc.c );
- params->g_pre_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(44, 2, suc.c);
+ params->g_pre_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 46, 2, suc.c );
- params->b_pre_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(46, 2, suc.c);
+ params->b_pre_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 48, 2, usuc.c );
- params->r_gain = usuc.s;
- ret |= SSMReadRGBOGOValue ( 50, 2, usuc.c );
- params->g_gain = usuc.s;
+ ret |= SSMReadRGBOGOValue(48, 2, usuc.c);
+ params->r_gain = usuc.s;
+ ret |= SSMReadRGBOGOValue(50, 2, usuc.c);
+ params->g_gain = usuc.s;
- ret |= SSMReadRGBOGOValue ( 52, 2, usuc.c );
- params->b_gain = usuc.s;
- ret |= SSMReadRGBOGOValue ( 54, 2, suc.c );
- params->r_post_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(52, 2, usuc.c);
+ params->b_gain = usuc.s;
+ ret |= SSMReadRGBOGOValue(54, 2, suc.c);
+ params->r_post_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 56, 2, suc.c );
- params->g_post_offset = suc.s;
+ ret |= SSMReadRGBOGOValue(56, 2, suc.c);
+ params->g_post_offset = suc.s;
- ret |= SSMReadRGBOGOValue ( 58, 2, suc.c );
- params->b_post_offset = suc.s;
- }
+ ret |= SSMReadRGBOGOValue(58, 2, suc.c);
+ params->b_post_offset = suc.s;
+ }
- LOGD ( "%s, rgain[%d], ggain[%d],bgain[%d],roffset[%d],goffset[%d],boffset[%d]\n", __FUNCTION__, params->r_gain, params->g_gain,
- params->b_gain, params->r_post_offset, params->g_post_offset, params->b_post_offset );
+ LOGD("%s, rgain[%d], ggain[%d],bgain[%d],roffset[%d],goffset[%d],boffset[%d]\n", __FUNCTION__,
+ params->r_gain, params->g_gain, params->b_gain, params->r_post_offset,
+ params->g_post_offset, params->b_post_offset);
- return ret;
+ return ret;
}
-int CVpp::SetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params )
-{
- // CheckColorTemperatureParamAlldata(source_port,sig_fmt,trans_fmt);
+int CVpp::SetColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params) {
+ // CheckColorTemperatureParamAlldata(source_port,sig_fmt,trans_fmt);
- SaveColorTemperatureParams ( Tempmode, params );
- SetColorTempParamsChecksum();
+ SaveColorTemperatureParams(Tempmode, params);
+ SetColorTempParamsChecksum();
- return 0;
+ return 0;
}
-int CVpp::SaveColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params )
-{
- SUC suc;
- USUC usuc;
- int ret = 0;
+int CVpp::SaveColorTemperatureParams(vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t params) {
+ SUC suc;
+ USUC usuc;
+ int ret = 0;
- if ( VPP_COLOR_TEMPERATURE_MODE_STANDARD == Tempmode ) { //standard
- usuc.s = params.en;
- ret |= SSMSaveRGBOGOValue ( 0, 2, usuc.c );
+ if (VPP_COLOR_TEMPERATURE_MODE_STANDARD == Tempmode) { //standard
+ usuc.s = params.en;
+ ret |= SSMSaveRGBOGOValue(0, 2, usuc.c);
- suc.s = params.r_pre_offset;
- ret |= SSMSaveRGBOGOValue ( 2, 2, suc.c );
+ suc.s = params.r_pre_offset;
+ ret |= SSMSaveRGBOGOValue(2, 2, suc.c);
- suc.s = params.g_pre_offset;
- ret |= SSMSaveRGBOGOValue ( 4, 2, suc.c );
+ suc.s = params.g_pre_offset;
+ ret |= SSMSaveRGBOGOValue(4, 2, suc.c);
- suc.s = params.b_pre_offset;
- ret |= SSMSaveRGBOGOValue ( 6, 2, suc.c );
+ suc.s = params.b_pre_offset;
+ ret |= SSMSaveRGBOGOValue(6, 2, suc.c);
- usuc.s = params.r_gain;
- ret |= SSMSaveRGBOGOValue ( 8, 2, usuc.c );
+ usuc.s = params.r_gain;
+ ret |= SSMSaveRGBOGOValue(8, 2, usuc.c);
- usuc.s = params.g_gain;
- ret |= SSMSaveRGBOGOValue ( 10, 2, usuc.c );
+ usuc.s = params.g_gain;
+ ret |= SSMSaveRGBOGOValue(10, 2, usuc.c);
- usuc.s = params.b_gain;
- ret |= SSMSaveRGBOGOValue ( 12, 2, usuc.c );
+ usuc.s = params.b_gain;
+ ret |= SSMSaveRGBOGOValue(12, 2, usuc.c);
- suc.s = params.r_post_offset;
- ret |= SSMSaveRGBOGOValue ( 14, 2, suc.c );
+ suc.s = params.r_post_offset;
+ ret |= SSMSaveRGBOGOValue(14, 2, suc.c);
- suc.s = params.g_post_offset;
- ret |= SSMSaveRGBOGOValue ( 16, 2, suc.c );
+ suc.s = params.g_post_offset;
+ ret |= SSMSaveRGBOGOValue(16, 2, suc.c);
- suc.s = params.b_post_offset;
- ret |= SSMSaveRGBOGOValue ( 18, 2, suc.c );
- } else if ( VPP_COLOR_TEMPERATURE_MODE_WARM == Tempmode ) { //warm
- usuc.s = params.en;
- ret |= SSMSaveRGBOGOValue ( 20, 2, usuc.c );
+ suc.s = params.b_post_offset;
+ ret |= SSMSaveRGBOGOValue(18, 2, suc.c);
+ } else if (VPP_COLOR_TEMPERATURE_MODE_WARM == Tempmode) { //warm
+ usuc.s = params.en;
+ ret |= SSMSaveRGBOGOValue(20, 2, usuc.c);
- suc.s = params.r_pre_offset;
- ret |= SSMSaveRGBOGOValue ( 22, 2, suc.c );
+ suc.s = params.r_pre_offset;
+ ret |= SSMSaveRGBOGOValue(22, 2, suc.c);
- suc.s = params.g_pre_offset;
- ret |= SSMSaveRGBOGOValue ( 24, 2, suc.c );
- suc.s = params.b_pre_offset;
- ret |= SSMSaveRGBOGOValue ( 26, 2, suc.c );
+ suc.s = params.g_pre_offset;
+ ret |= SSMSaveRGBOGOValue(24, 2, suc.c);
+ suc.s = params.b_pre_offset;
+ ret |= SSMSaveRGBOGOValue(26, 2, suc.c);
- usuc.s = params.r_gain;
- ret |= SSMSaveRGBOGOValue ( 28, 2, usuc.c );
+ usuc.s = params.r_gain;
+ ret |= SSMSaveRGBOGOValue(28, 2, usuc.c);
- usuc.s = params.g_gain;
- ret |= SSMSaveRGBOGOValue ( 30, 2, usuc.c );
+ usuc.s = params.g_gain;
+ ret |= SSMSaveRGBOGOValue(30, 2, usuc.c);
- usuc.s = params.b_gain;
- ret |= SSMSaveRGBOGOValue ( 32, 2, usuc.c );
+ usuc.s = params.b_gain;
+ ret |= SSMSaveRGBOGOValue(32, 2, usuc.c);
- suc.s = params.r_post_offset;
- ret |= SSMSaveRGBOGOValue ( 34, 2, suc.c );
+ suc.s = params.r_post_offset;
+ ret |= SSMSaveRGBOGOValue(34, 2, suc.c);
- suc.s = params.g_post_offset;
- ret |= SSMSaveRGBOGOValue ( 36, 2, suc.c );
+ suc.s = params.g_post_offset;
+ ret |= SSMSaveRGBOGOValue(36, 2, suc.c);
- suc.s = params.b_post_offset;
- ret |= SSMSaveRGBOGOValue ( 38, 2, suc.c );
- } else if ( VPP_COLOR_TEMPERATURE_MODE_COLD == Tempmode ) { //cool
- usuc.s = params.en;
- ret |= SSMSaveRGBOGOValue ( 40, 2, usuc.c );
+ suc.s = params.b_post_offset;
+ ret |= SSMSaveRGBOGOValue(38, 2, suc.c);
+ } else if (VPP_COLOR_TEMPERATURE_MODE_COLD == Tempmode) { //cool
+ usuc.s = params.en;
+ ret |= SSMSaveRGBOGOValue(40, 2, usuc.c);
- suc.s = params.r_pre_offset;
- ret |= SSMSaveRGBOGOValue ( 42, 2, suc.c );
+ suc.s = params.r_pre_offset;
+ ret |= SSMSaveRGBOGOValue(42, 2, suc.c);
- suc.s = params.g_pre_offset;
- ret |= SSMSaveRGBOGOValue ( 44, 2, suc.c );
+ suc.s = params.g_pre_offset;
+ ret |= SSMSaveRGBOGOValue(44, 2, suc.c);
- suc.s = params.b_pre_offset;
- ret |= SSMSaveRGBOGOValue ( 46, 2, suc.c );
+ suc.s = params.b_pre_offset;
+ ret |= SSMSaveRGBOGOValue(46, 2, suc.c);
- usuc.s = params.r_gain;
- ret |= SSMSaveRGBOGOValue ( 48, 2, usuc.c );
+ usuc.s = params.r_gain;
+ ret |= SSMSaveRGBOGOValue(48, 2, usuc.c);
- usuc.s = params.g_gain;
- ret |= SSMSaveRGBOGOValue ( 50, 2, usuc.c );
+ usuc.s = params.g_gain;
+ ret |= SSMSaveRGBOGOValue(50, 2, usuc.c);
- usuc.s = params.b_gain;
- ret |= SSMSaveRGBOGOValue ( 52, 2, usuc.c );
+ usuc.s = params.b_gain;
+ ret |= SSMSaveRGBOGOValue(52, 2, usuc.c);
- suc.s = params.r_post_offset;
- ret |= SSMSaveRGBOGOValue ( 54, 2, suc.c );
+ suc.s = params.r_post_offset;
+ ret |= SSMSaveRGBOGOValue(54, 2, suc.c);
- suc.s = params.g_post_offset;
- ret |= SSMSaveRGBOGOValue ( 56, 2, suc.c );
+ suc.s = params.g_post_offset;
+ ret |= SSMSaveRGBOGOValue(56, 2, suc.c);
- suc.s = params.b_post_offset;
- ret |= SSMSaveRGBOGOValue ( 58, 2, suc.c );
- }
+ suc.s = params.b_post_offset;
+ ret |= SSMSaveRGBOGOValue(58, 2, suc.c);
+ }
- LOGD ( "%s, rgain[%d], ggain[%d],bgain[%d],roffset[%d],goffset[%d],boffset[%d]\n", __FUNCTION__, params.r_gain, params.g_gain,
- params.b_gain, params.r_post_offset, params.g_post_offset, params.b_post_offset );
- return ret;
+ LOGD("%s, rgain[%d], ggain[%d],bgain[%d],roffset[%d],goffset[%d],boffset[%d]\n", __FUNCTION__,
+ params.r_gain, params.g_gain, params.b_gain, params.r_post_offset,
+ params.g_post_offset, params.b_post_offset);
+ return ret;
}
-int CVpp::CheckColorTemperatureParams ( void )
-{
- int i = 0;
- tcon_rgb_ogo_t rgbogo;
+int CVpp::CheckColorTemperatureParams(void) {
+ int i = 0;
+ tcon_rgb_ogo_t rgbogo;
- for ( i = 0; i < 3; i++ ) {
- ReadColorTemperatureParams ( ( vpp_color_temperature_mode_t ) i, &rgbogo );
+ for (i = 0; i < 3; i++) {
+ ReadColorTemperatureParams((vpp_color_temperature_mode_t) i, &rgbogo);
- if ( rgbogo.r_gain > 2047 || rgbogo.b_gain > 2047 || rgbogo.g_gain > 2047
- || rgbogo.r_gain < 0 || rgbogo.b_gain < 0 || rgbogo.g_gain < 0 ) {
- if ( rgbogo.r_post_offset > 1023 || rgbogo.g_post_offset > 1023 || rgbogo.b_post_offset > 1023
- || rgbogo.r_post_offset < -1024 || rgbogo.g_post_offset < -1024 || rgbogo.b_post_offset < -1024 ) {
- return 0;
- }
- }
- }
+ if (rgbogo.r_gain > 2047 || rgbogo.b_gain > 2047 || rgbogo.g_gain > 2047 || rgbogo.r_gain
+ < 0 || rgbogo.b_gain < 0 || rgbogo.g_gain < 0) {
+ if (rgbogo.r_post_offset > 1023 || rgbogo.g_post_offset > 1023 || rgbogo.b_post_offset
+ > 1023 || rgbogo.r_post_offset < -1024 || rgbogo.g_post_offset < -1024
+ || rgbogo.b_post_offset < -1024) {
+ return 0;
+ }
+ }
+ }
- return 1;
+ return 1;
}
-int CVpp::RestoeColorTemperatureParamsFromDB ( tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt )
-{
- int i = 0;
- tcon_rgb_ogo_t rgbogo;
+int CVpp::RestoeColorTemperatureParamsFromDB(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ tvin_trans_fmt_t trans_fmt) {
+ int i = 0;
+ tcon_rgb_ogo_t rgbogo;
- LOGD ( "%s, restore color temperature params from DB.\n", __FUNCTION__ );
+ LOGD("%s, restore color temperature params from DB.\n", __FUNCTION__);
- for ( i = 0; i < 3; i++ ) {
- mpPqData->PQ_GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) i, source_port, sig_fmt, trans_fmt, &rgbogo );
- SaveColorTemperatureParams ( ( vpp_color_temperature_mode_t ) i, rgbogo );
- }
+ for (i = 0; i < 3; i++) {
+ mpPqData->PQ_GetColorTemperatureParams((vpp_color_temperature_mode_t) i, source_port,
+ sig_fmt, trans_fmt, &rgbogo);
+ SaveColorTemperatureParams((vpp_color_temperature_mode_t) i, rgbogo);
+ }
- SetColorTempParamsChecksum();
+ SetColorTempParamsChecksum();
- return 0;
+ return 0;
}
-int CVpp::CheckColorTemperatureParamAlldata ( tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt )
-{
- if ( CheckTempDataLable() && ( CalColorTemperatureParamsChecksum() == GetColorTempParamsChecksum() ) ) {
- LOGD ( "%s, color temperature param lable & checksum ok.\n", __FUNCTION__ );
+int CVpp::CheckColorTemperatureParamAlldata(tvin_port_t source_port, tvin_sig_fmt_t sig_fmt,
+ tvin_trans_fmt_t trans_fmt) {
+ if (CheckTempDataLable() && (CalColorTemperatureParamsChecksum()
+ == GetColorTempParamsChecksum())) {
+ LOGD("%s, color temperature param lable & checksum ok.\n", __FUNCTION__);
- if ( CheckColorTemperatureParams() == 0 ) {
- LOGD ( "%s, color temperature params check failed.\n", __FUNCTION__ );
- RestoeColorTemperatureParamsFromDB(source_port, sig_fmt, trans_fmt);
- }
- } else {
- LOGD ( "%s, color temperature param data error.\n", __FUNCTION__ );
+ if (CheckColorTemperatureParams() == 0) {
+ LOGD("%s, color temperature params check failed.\n", __FUNCTION__);
+ RestoeColorTemperatureParamsFromDB(source_port, sig_fmt, trans_fmt);
+ }
+ } else {
+ LOGD("%s, color temperature param data error.\n", __FUNCTION__);
- SetTempDataLable();
- RestoeColorTemperatureParamsFromDB(source_port, sig_fmt, trans_fmt);
- }
+ SetTempDataLable();
+ RestoeColorTemperatureParamsFromDB(source_port, sig_fmt, trans_fmt);
+ }
- return 0;
+ return 0;
}
-int CVpp::Tv_FactorySetColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySetColorTemp_Rgain(int source_type, int colortemp_mode, int rgain) {
+ tcon_rgb_ogo_t rgbogo;
- GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo );
- rgbogo.r_gain = rgain;
- LOGD ( "%s, source_type[%d], colortemp_mode[%d], rgain[%d].", __FUNCTION__, source_type, colortemp_mode, rgain );
- rgbogo.en = 1;
+ GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo);
+ rgbogo.r_gain = rgain;
+ LOGD("%s, source_type[%d], colortemp_mode[%d], rgain[%d].", __FUNCTION__, source_type,
+ colortemp_mode, rgain);
+ rgbogo.en = 1;
- if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) {
- return 0;
- }
+ if (VPP_SetRGBOGO(&rgbogo) == 0) {
+ return 0;
+ }
- return -1;
+ return -1;
}
-int CVpp::Tv_FactorySaveColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySaveColorTemp_Rgain(int source_type, int colortemp_mode, int rgain) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- rgbogo.r_gain = rgain;
- return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo );
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ rgbogo.r_gain = rgain;
+ return SetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, rgbogo);
+ }
- LOGE ( "Tv_FactorySaveColorTemp_Rgain error!\n" );
- return -1;
+ LOGE("FactorySaveColorTemp_Rgain error!\n");
+ return -1;
}
-int CVpp::Tv_FactoryGetColorTemp_Rgain ( int source_type, int colortemp_mode )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactoryGetColorTemp_Rgain(int source_type, int colortemp_mode) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- return rgbogo.r_gain;
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ return rgbogo.r_gain;
+ }
- LOGE ( "Tv_FactoryGetColorTemp_Rgain error!\n" );
- return -1;
+ LOGE("FactoryGetColorTemp_Rgain error!\n");
+ return -1;
}
-int CVpp::Tv_FactorySetColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySetColorTemp_Ggain(int source_type, int colortemp_mode, int ggain) {
+ tcon_rgb_ogo_t rgbogo;
- GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo );
- rgbogo.g_gain = ggain;
- LOGD ( "%s, source_type[%d], colortemp_mode[%d], ggain[%d].", __FUNCTION__, source_type, colortemp_mode, ggain );
- rgbogo.en = 1;
+ GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo);
+ rgbogo.g_gain = ggain;
+ LOGD("%s, source_type[%d], colortemp_mode[%d], ggain[%d].", __FUNCTION__, source_type,
+ colortemp_mode, ggain);
+ rgbogo.en = 1;
- if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) {
- return 0;
- }
+ if (VPP_SetRGBOGO(&rgbogo) == 0) {
+ return 0;
+ }
- return -1;
+ return -1;
}
-int CVpp::Tv_FactorySaveColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySaveColorTemp_Ggain(int source_type, int colortemp_mode, int ggain) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- rgbogo.g_gain = ggain;
- return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo );
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ rgbogo.g_gain = ggain;
+ return SetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, rgbogo);
+ }
- LOGE ( "Tv_FactorySaveColorTemp_Ggain error!\n" );
- return -1;
+ LOGE("FactorySaveColorTemp_Ggain error!\n");
+ return -1;
}
-int CVpp::Tv_FactoryGetColorTemp_Ggain ( int source_type, int colortemp_mode )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactoryGetColorTemp_Ggain(int source_type, int colortemp_mode) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- return rgbogo.g_gain;
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ return rgbogo.g_gain;
+ }
- LOGE ( "Tv_FactoryGetColorTemp_Ggain error!\n" );
- return -1;
+ LOGE("FactoryGetColorTemp_Ggain error!\n");
+ return -1;
}
-int CVpp::Tv_FactorySetColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySetColorTemp_Bgain(int source_type, int colortemp_mode, int bgain) {
+ tcon_rgb_ogo_t rgbogo;
- GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo );
- rgbogo.b_gain = bgain;
- LOGD ( "%s, source_type[%d], colortemp_mode[%d], bgain[%d].", __FUNCTION__, source_type, colortemp_mode, bgain );
- rgbogo.en = 1;
+ GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo);
+ rgbogo.b_gain = bgain;
+ LOGD("%s, source_type[%d], colortemp_mode[%d], bgain[%d].", __FUNCTION__, source_type,
+ colortemp_mode, bgain);
+ rgbogo.en = 1;
- if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) {
- return 0;
- }
+ if (VPP_SetRGBOGO(&rgbogo) == 0) {
+ return 0;
+ }
- return -1;
+ return -1;
}
-int CVpp::Tv_FactorySaveColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySaveColorTemp_Bgain(int source_type, int colortemp_mode, int bgain) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- rgbogo.b_gain = bgain;
- return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo );
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ rgbogo.b_gain = bgain;
+ return SetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, rgbogo);
+ }
- LOGE ( "Tv_FactorySaveColorTemp_Bgain error!\n" );
- return -1;
+ LOGE("FactorySaveColorTemp_Bgain error!\n");
+ return -1;
}
-int CVpp::Tv_FactoryGetColorTemp_Bgain ( int source_type, int colortemp_mode )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactoryGetColorTemp_Bgain(int source_type, int colortemp_mode) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- return rgbogo.b_gain;
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ return rgbogo.b_gain;
+ }
- LOGE ( "Tv_FactoryGetColorTemp_Bgain error!\n" );
- return -1;
+ LOGE("FactoryGetColorTemp_Bgain error!\n");
+ return -1;
}
-int CVpp::Tv_FactorySetColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySetColorTemp_Roffset(int source_type, int colortemp_mode, int roffset) {
+ tcon_rgb_ogo_t rgbogo;
- GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo );
- rgbogo.r_post_offset = roffset;
- LOGD ( "%s, source_type[%d], colortemp_mode[%d], r_post_offset[%d].", __FUNCTION__, source_type, colortemp_mode, roffset );
- rgbogo.en = 1;
+ GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo);
+ rgbogo.r_post_offset = roffset;
+ LOGD("%s, source_type[%d], colortemp_mode[%d], r_post_offset[%d].", __FUNCTION__, source_type,
+ colortemp_mode, roffset);
+ rgbogo.en = 1;
- if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) {
- return 0;
- }
+ if (VPP_SetRGBOGO(&rgbogo) == 0) {
+ return 0;
+ }
- return -1;
+ return -1;
}
-int CVpp::Tv_FactorySaveColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySaveColorTemp_Roffset(int source_type, int colortemp_mode, int roffset) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- rgbogo.r_post_offset = roffset;
- return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo );
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ rgbogo.r_post_offset = roffset;
+ return SetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, rgbogo);
+ }
- LOGE ( "Tv_FactorySaveColorTemp_Roffset error!\n" );
- return -1;
+ LOGE("FactorySaveColorTemp_Roffset error!\n");
+ return -1;
}
-int CVpp::Tv_FactoryGetColorTemp_Roffset ( int source_type, int colortemp_mode )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactoryGetColorTemp_Roffset(int source_type, int colortemp_mode) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- return rgbogo.r_post_offset;
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ return rgbogo.r_post_offset;
+ }
- LOGE ( "Tv_FactoryGetColorTemp_Roffset error!\n" );
- return -1;
+ LOGE("FactoryGetColorTemp_Roffset error!\n");
+ return -1;
}
-int CVpp::Tv_FactorySetColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySetColorTemp_Goffset(int source_type, int colortemp_mode, int goffset) {
+ tcon_rgb_ogo_t rgbogo;
- GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo );
- rgbogo.g_post_offset = goffset;
- LOGD ( "%s, source_type[%d], colortemp_mode[%d], g_post_offset[%d].", __FUNCTION__, source_type, colortemp_mode, goffset );
- rgbogo.en = 1;
+ GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo);
+ rgbogo.g_post_offset = goffset;
+ LOGD("%s, source_type[%d], colortemp_mode[%d], g_post_offset[%d].", __FUNCTION__, source_type,
+ colortemp_mode, goffset);
+ rgbogo.en = 1;
- if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) {
- return 0;
- }
+ if (VPP_SetRGBOGO(&rgbogo) == 0) {
+ return 0;
+ }
- return -1;
+ return -1;
}
-int CVpp::Tv_FactorySaveColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySaveColorTemp_Goffset(int source_type, int colortemp_mode, int goffset) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- rgbogo.g_post_offset = goffset;
- return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo );
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ rgbogo.g_post_offset = goffset;
+ return SetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, rgbogo);
+ }
- LOGE ( "Tv_FactorySaveColorTemp_Goffset error!\n" );
- return -1;
+ LOGE("FactorySaveColorTemp_Goffset error!\n");
+ return -1;
}
-int CVpp::Tv_FactoryGetColorTemp_Goffset ( int source_type, int colortemp_mode )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactoryGetColorTemp_Goffset(int source_type, int colortemp_mode) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- return rgbogo.g_post_offset;
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ return rgbogo.g_post_offset;
+ }
- LOGE ( "Tv_FactoryGetColorTemp_Goffset error!\n" );
- return -1;
+ LOGE("FactoryGetColorTemp_Goffset error!\n");
+ return -1;
}
-int CVpp::Tv_FactorySetColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySetColorTemp_Boffset(int source_type, int colortemp_mode, int boffset) {
+ tcon_rgb_ogo_t rgbogo;
- GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo );
- rgbogo.b_post_offset = boffset;
- LOGD ( "%s, source_type[%d], colortemp_mode[%d], b_post_offset[%d].", __FUNCTION__, source_type, colortemp_mode, boffset );
- rgbogo.en = 1;
+ GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo);
+ rgbogo.b_post_offset = boffset;
+ LOGD("%s, source_type[%d], colortemp_mode[%d], b_post_offset[%d].", __FUNCTION__, source_type,
+ colortemp_mode, boffset);
+ rgbogo.en = 1;
- if ( VPP_SetRGBOGO ( &rgbogo ) == 0 ) {
- return 0;
- }
+ if (VPP_SetRGBOGO(&rgbogo) == 0) {
+ return 0;
+ }
- return -1;
+ return -1;
}
-int CVpp::Tv_FactorySaveColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactorySaveColorTemp_Boffset(int source_type, int colortemp_mode, int boffset) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- rgbogo.b_post_offset = boffset;
- return SetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, rgbogo );
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ rgbogo.b_post_offset = boffset;
+ return SetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, rgbogo);
+ }
- LOGE ( "Tv_FactorySaveColorTemp_Boffset error!\n" );
- return -1;
+ LOGE("FactorySaveColorTemp_Boffset error!\n");
+ return -1;
}
-int CVpp::Tv_FactoryGetColorTemp_Boffset ( int source_type, int colortemp_mode )
-{
- tcon_rgb_ogo_t rgbogo;
+int CVpp::FactoryGetColorTemp_Boffset(int source_type, int colortemp_mode) {
+ tcon_rgb_ogo_t rgbogo;
- if ( 0 == GetColorTemperatureParams ( ( vpp_color_temperature_mode_t ) colortemp_mode, &rgbogo ) ) {
- return rgbogo.b_post_offset;
- }
+ if (0 == GetColorTemperatureParams((vpp_color_temperature_mode_t) colortemp_mode, &rgbogo)) {
+ return rgbogo.b_post_offset;
+ }
- LOGE ( "Tv_FactoryGetColorTemp_Boffset error!\n" );
- return -1;
+ LOGE("FactoryGetColorTemp_Boffset error!\n");
+ return -1;
}
-int CVpp::Tv_FactoryGetTestPattern ( void )
-{
- unsigned char data = VPP_TEST_PATTERN_NONE;
- SSMReadTestPattern ( &data );
- return data;
+int CVpp::FactoryGetTestPattern(void) {
+ unsigned char data = VPP_TEST_PATTERN_NONE;
+ SSMReadTestPattern(&data);
+ return data;
}
-int CVpp::Tv_FactoryResetPQMode ( void )
-{
- mpPqData->PQ_ResetAllPQModeParams();
- return 0;
+int CVpp::FactoryResetPQMode(void) {
+ mpPqData->PQ_ResetAllPQModeParams();
+ return 0;
}
-int CVpp::Tv_FactoryResetNonlinear ( void )
-{
- mpPqData->PQ_ResetAllNoLineParams();
- return 0;
+int CVpp::FactoryResetNonlinear(void) {
+ mpPqData->PQ_ResetAllNoLineParams();
+ return 0;
}
-int CVpp::Tv_FactoryResetColorTemp ( void )
-{
- mpPqData->PQ_ResetAllColorTemperatureParams();
- return 0;
+int CVpp::FactoryResetColorTemp(void) {
+ mpPqData->PQ_ResetAllColorTemperatureParams();
+ return 0;
}
-int CVpp::Tv_FactorySetParamsDefault ( void )
-{
- Tv_FactoryResetPQMode();
- Tv_FactoryResetNonlinear();
- Tv_FactoryResetColorTemp();
- mpPqData->PQ_ResetAllOverscanParams();
- return 0;
+int CVpp::FactorySetParamsDefault(void) {
+ FactoryResetPQMode();
+ FactoryResetNonlinear();
+ FactoryResetColorTemp();
+ mpPqData->PQ_ResetAllOverscanParams();
+ return 0;
}
-int CVpp::Tv_FactorySetDDRSSC ( int step )
-{
- int ret = -1;
+int CVpp::FactorySetDDRSSC(int step) {
+ int ret = -1;
- switch ( step ) {
- case 1:
- // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac86" );
- break;
+ switch (step) {
+ case 1:
+ // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac86" );
+ break;
- case 2:
- // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac85" );
- break;
+ case 2:
+ // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac85" );
+ break;
- case 3:
- // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac75" );
- break;
+ case 3:
+ // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac75" );
+ break;
- case 4:
- // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac65" );
- break;
+ case 4:
+ // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac65" );
+ break;
- case 5:
- // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000acb3" );
- break;
+ case 5:
+ // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000acb3" );
+ break;
- case 0:
- default:
- // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac24" );
- break;
- }
+ case 0:
+ default:
+ // ret = Tv_MiscRegs ( "wc 0x14e6 0x0000ac24" );
+ break;
+ }
- if ( ret < 0 ) {
- return -1;
- }
+ if (ret < 0) {
+ return -1;
+ }
- return SSMSaveDDRSSC ( step );
+ return SSMSaveDDRSSC(step);
}
-int CVpp::Tv_FactoryGetDDRSSC ( void )
-{
- unsigned char data = 0;
- SSMReadDDRSSC ( &data );
- return data;
+int CVpp::FactoryGetDDRSSC(void) {
+ unsigned char data = 0;
+ SSMReadDDRSSC(&data);
+ return data;
}
-int CVpp::Tv_FactorySetLVDSSSC ( int step )
-{
- int ret = -1;
-
- switch ( step ) {
- case 1:
- // ret = Tv_MiscRegs ( "wc 0x109e 0x4d625012" );
- // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" );
- break;
-
- case 2:
- // ret = Tv_MiscRegs ( "wc 0x109e 0x2d425012" );
- // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" );
- break;
-
- case 3:
- // ret = Tv_MiscRegs ( "wc 0x109e 0x1d425012" );
- // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" );
- break;
-
- case 4:
- // ret = Tv_MiscRegs ( "wc 0x109e 0x0d125012" );
- // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" );
- break;
-
- case 5:
- // ret = Tv_MiscRegs ( "wc 0x109e 0x0e425012" );
- // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" );
- break;
-
- case 0:
- default:
- // ret = Tv_MiscRegs ( "wc 0x109e 0x6d625012" );
- // ret |= Tv_MiscRegs ( "wc 0x109f 0x36130" );
- break;
- }
-
- if ( ret < 0 ) {
- return -1;
- }
-
- return SSMSaveLVDSSSC ( step );
+int CVpp::SetLVDSSSC(int step) {
+ int ret = -1;
+ if (step > 4)
+ step = 4;
+ ret = TvMisc_SetLVDSSSC(step);
+ return ret;
}
+int CVpp::FactorySetLVDSSSC(int step) {
+ int ret = -1;
+ unsigned char data[2] = {0,0};
+ char cmd_tmp_1[128];
+ int value = 0, panel_idx = 0, tmp = 0;
+ const char *PanelIdx;
+ if (step > 3)
+ step = 3;
+
+ PanelIdx = config_get_str ( "TV", "get.panel.index", "0" );
+ panel_idx = strtoul(PanelIdx, NULL, 10);
+ LOGD ("%s, panel_idx = %x",__FUNCTION__, panel_idx);
+ SSMReadLVDSSSC(data);
+
+ //every 2 bits represent one panel, use 2 byte store 8 panels
+ value = (data[1]<<8)|data[0];
+ step = step&0x03;
+ panel_idx = panel_idx*2;
+ tmp = 3 << panel_idx;
+ value = (value&(~tmp)) | (step << panel_idx);
+ data[0] = value & 0xFF;
+ data[1] = (value >> 8)& 0xFF;
+ LOGD ("%s, tmp = %x, save value = %x",__FUNCTION__, tmp,value);
+
+ SetLVDSSSC(step);
+ return SSMSaveLVDSSSC(data);
+}
+
+int CVpp::FactoryGetLVDSSSC(void) {
+ unsigned char data[2] = {0,0};
+ int value = 0, panel_idx = 0;
+ const char *PanelIdx = config_get_str ( "TV", "get.panel.index", "0" );
+
+ panel_idx = strtoul(PanelIdx, NULL, 10);
+ SSMReadLVDSSSC(data);
+ value = (data[1]<<8)|data[0];
+ value = (value >> (2 * panel_idx))&0x03;
+ LOGD ("%s, panel_idx = %x, value= %d",__FUNCTION__, panel_idx, value);
+ return value;
+}
+
+noline_params_t CVpp::FactoryGetNolineParams(int type, int source_type) {
+ int ret = -1;
+ noline_params_t noline_params;
+
+ memset(&noline_params, 0, sizeof(noline_params_t));
+
+ switch (type) {
+ case NOLINE_PARAMS_TYPE_BRIGHTNESS:
+ ret = mpPqData->PQ_GetNoLineAllBrightnessParams((tv_source_input_type_t) source_type,
+ &noline_params.osd0, &noline_params.osd25, &noline_params.osd50,
+ &noline_params.osd75, &noline_params.osd100);
+
+ case NOLINE_PARAMS_TYPE_CONTRAST:
+ ret = mpPqData->PQ_GetNoLineAllContrastParams((tv_source_input_type_t) source_type,
+ &noline_params.osd0, &noline_params.osd25, &noline_params.osd50,
+ &noline_params.osd75, &noline_params.osd100);
+
+ case NOLINE_PARAMS_TYPE_SATURATION:
+ ret = mpPqData->PQ_GetNoLineAllSaturationParams((tv_source_input_type_t) source_type,
+ &noline_params.osd0, &noline_params.osd25, &noline_params.osd50,
+ &noline_params.osd75, &noline_params.osd100);
+
+ case NOLINE_PARAMS_TYPE_HUE:
+ ret = mpPqData->PQ_GetNoLineAllHueParams((tv_source_input_type_t) source_type,
+ &noline_params.osd0, &noline_params.osd25, &noline_params.osd50,
+ &noline_params.osd75, &noline_params.osd100);
+
+ case NOLINE_PARAMS_TYPE_SHARPNESS:
+ ret = mpPqData->PQ_GetNoLineAllSharpnessParams((tv_source_input_type_t) source_type,
+ &noline_params.osd0, &noline_params.osd25, &noline_params.osd50,
+ &noline_params.osd75, &noline_params.osd100);
+
+ case NOLINE_PARAMS_TYPE_VOLUME:
+ ret = mpPqData->PQ_GetNoLineAllVolumeParams((tv_source_input_type_t) source_type,
+ &noline_params.osd0, &noline_params.osd25, &noline_params.osd50,
+ &noline_params.osd75, &noline_params.osd100);
+
+ default:
+ break;
+ }
-int CVpp::Tv_FactoryGetLVDSSSC ( void )
-{
- unsigned char data = 0;
- SSMReadLVDSSSC ( &data );
- return data;
+ return noline_params;
}
-noline_params_t CVpp::Tv_FactoryGetNolineParams ( int type, int source_type )
-{
- int ret = -1;
- noline_params_t noline_params;
-
- memset ( &noline_params, 0, sizeof ( noline_params_t ) );
-
- switch ( type ) {
- case NOLINE_PARAMS_TYPE_BRIGHTNESS:
- ret = mpPqData->PQ_GetNoLineAllBrightnessParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 );
-
- case NOLINE_PARAMS_TYPE_CONTRAST:
- ret = mpPqData->PQ_GetNoLineAllContrastParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 );
-
- case NOLINE_PARAMS_TYPE_SATURATION:
- ret = mpPqData->PQ_GetNoLineAllSaturationParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 );
-
- case NOLINE_PARAMS_TYPE_HUE:
- ret = mpPqData->PQ_GetNoLineAllHueParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 );
-
- case NOLINE_PARAMS_TYPE_SHARPNESS:
- ret = mpPqData->PQ_GetNoLineAllSharpnessParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 );
-
- case NOLINE_PARAMS_TYPE_VOLUME:
- ret = mpPqData->PQ_GetNoLineAllVolumeParams ( ( tv_source_input_type_t ) source_type, &noline_params.osd0, &noline_params.osd25, &noline_params.osd50, &noline_params.osd75, &noline_params.osd100 );
+int CVpp::FactorySetNolineParams(int type, int source_type, noline_params_t noline_params) {
+ int ret = -1;
- default:
- break;
- }
+ switch (type) {
+ case NOLINE_PARAMS_TYPE_BRIGHTNESS:
+ ret = mpPqData->PQ_SetNoLineAllBrightnessParams((tv_source_input_type_t) source_type,
+ noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75,
+ noline_params.osd100);
+ break;
+
+ case NOLINE_PARAMS_TYPE_CONTRAST:
+ ret = mpPqData->PQ_SetNoLineAllContrastParams((tv_source_input_type_t) source_type,
+ noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75,
+ noline_params.osd100);
+ break;
+
+ case NOLINE_PARAMS_TYPE_SATURATION:
+ ret = mpPqData->PQ_SetNoLineAllSaturationParams((tv_source_input_type_t) source_type,
+ noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75,
+ noline_params.osd100);
+
+ case NOLINE_PARAMS_TYPE_HUE:
+ ret = mpPqData->PQ_SetNoLineAllHueParams((tv_source_input_type_t) source_type,
+ noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75,
+ noline_params.osd100);
+
+ case NOLINE_PARAMS_TYPE_SHARPNESS:
+ ret = mpPqData->PQ_SetNoLineAllSharpnessParams((tv_source_input_type_t) source_type,
+ noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75,
+ noline_params.osd100);
+
+ case NOLINE_PARAMS_TYPE_VOLUME:
+ ret = mpPqData->PQ_SetNoLineAllVolumeParams((tv_source_input_type_t) source_type,
+ noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75,
+ noline_params.osd100);
+
+ default:
+ break;
+ }
- return noline_params;
+ return ret;
}
-int CVpp::Tv_FactorySetNolineParams ( int type, int source_type, noline_params_t noline_params )
-{
- int ret = -1;
-
- switch ( type ) {
- case NOLINE_PARAMS_TYPE_BRIGHTNESS:
- ret = mpPqData->PQ_SetNoLineAllBrightnessParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 );
- break;
-
- case NOLINE_PARAMS_TYPE_CONTRAST:
- ret = mpPqData->PQ_SetNoLineAllContrastParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 );
- break;
+int CVpp::FactorySetOverscan(int source_type, int fmt, int status_3d, int trans_fmt,
+ tvin_cutwin_t cutwin_t) {
+ int ret = -1;
+ ret = mpPqData->PQ_SetOverscanParams((tv_source_input_type_t) source_type,
+ (tvin_sig_fmt_t) fmt, INDEX_2D, (tvin_trans_fmt_t) trans_fmt, cutwin_t);
- case NOLINE_PARAMS_TYPE_SATURATION:
- ret = mpPqData->PQ_SetNoLineAllSaturationParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 );
+ if (ret == 0) {
+ } else {
+ LOGE("%s, PQ_SetOverscanParams fail.\n", __FUNCTION__);
+ }
+ return ret;
+}
- case NOLINE_PARAMS_TYPE_HUE:
- ret = mpPqData->PQ_SetNoLineAllHueParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 );
+tvin_cutwin_t CVpp::FactoryGetOverscan(int source_type, int fmt, is_3d_type_t is3d, int trans_fmt) {
+ int ret = -1;
+ tvin_cutwin_t cutwin_t;
+ memset(&cutwin_t, 0, sizeof(cutwin_t));
- case NOLINE_PARAMS_TYPE_SHARPNESS:
- ret = mpPqData->PQ_SetNoLineAllSharpnessParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 );
+ if (trans_fmt < TVIN_TFMT_2D || trans_fmt > TVIN_TFMT_3D_LDGD) {
+ return cutwin_t;
+ }
- case NOLINE_PARAMS_TYPE_VOLUME:
- ret = mpPqData->PQ_SetNoLineAllVolumeParams ( ( tv_source_input_type_t ) source_type, noline_params.osd0, noline_params.osd25, noline_params.osd50, noline_params.osd75, noline_params.osd100 );
+ ret = mpPqData->PQ_GetOverscanParams((tv_source_input_type_t) source_type,
+ (tvin_sig_fmt_t) fmt, is3d, (tvin_trans_fmt_t) trans_fmt, VPP_DISPLAY_MODE_169,
+ &cutwin_t);
- default:
- break;
- }
+ if (ret == 0) {
+ } else {
+ LOGE("%s, PQ_GetOverscanParams faild.\n", __FUNCTION__);
+ }
- return ret;
+ return cutwin_t;
}
-int CVpp::Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t )
-{
- int ret = -1;
- ret = mpPqData->PQ_SetOverscanParams ( ( tv_source_input_type_t ) source_type, ( tvin_sig_fmt_t ) fmt, INDEX_2D, ( tvin_trans_fmt_t ) trans_fmt, cutwin_t );
-
- if ( ret == 0 ) {
- } else {
- LOGE ( "%s, PQ_SetOverscanParams fail.\n", __FUNCTION__ );
- }
- return ret;
+int CVpp::FactorySetBacklightPWM_Frequency(int freq) {
+ LOGD("%s,FactorySetBacklightPWM_Frequency set freq %d .\n", __FUNCTION__, freq);
+ return 1;
}
-tvin_cutwin_t CVpp::Tv_FactoryGetOverscan ( int source_type, int fmt, is_3d_type_t is3d, int trans_fmt )
-{
- int ret = -1;
- tvin_cutwin_t cutwin_t;
- memset ( &cutwin_t, 0, sizeof ( cutwin_t ) );
-
- if ( trans_fmt < TVIN_TFMT_2D || trans_fmt > TVIN_TFMT_3D_LDGD ) {
- return cutwin_t;
- }
-
- ret = mpPqData->PQ_GetOverscanParams ( ( tv_source_input_type_t ) source_type, ( tvin_sig_fmt_t ) fmt, is3d, ( tvin_trans_fmt_t ) trans_fmt, VPP_DISPLAY_MODE_169, &cutwin_t );
-
- if ( ret == 0 ) {
- } else {
- LOGE ( "%s, PQ_GetOverscanParams faild.\n", __FUNCTION__ );
- }
-
- return cutwin_t;
+int CVpp::FactoryGetBacklightPWM_Frequency(void) {
+ int freq = 50;
+ LOGD("%s,FactoryGetBacklightPWM_Frequency set freq %d .\n", "TV", freq);
+ return freq;
}
-int CVpp::Tv_FactorySetBacklightPWM_Frequency ( int freq )
-{
- LOGD("%s,Tv_FactorySetBacklightPWM_Frequency set freq %d .\n", __FUNCTION__, freq);
- return 1;
+int CVpp::FactorySetBacklight_Switch_status(int status) {
+ LOGD("%s,FactorySetBacklight_Switch_status set status %d .\n", __FUNCTION__, status);
+ return 1;
}
-int CVpp::Tv_FactoryGetBacklightPWM_Frequency ( void )
-{
- int freq = 50;
- LOGD("%s,Tv_FactoryGetBacklightPWM_Frequency set freq %d .\n", "TV", freq);
- return freq;
+int CVpp::FactoryGetBacklight_Switch_status(void) {
+ int status = 1;
+ LOGD("%s,FactoryGetBacklight_Switch_status get status %d .\n", __FUNCTION__, status);
+ return status;
}
-int CVpp::Tv_FactorySetBacklight_Switch_status ( int status )
-{
- LOGD("%s,Tv_FactorySetBacklight_Switch_status set status %d .\n", __FUNCTION__, status);
- return 1;
+int CVpp::FactorySetBacklightPWM_Duty(int duty) {
+ LOGD("%s,FactorySetBacklight_Switch_status set duty %d .\n", __FUNCTION__, duty);
+ return 1;
}
-int CVpp::Tv_FactoryGetBacklight_Switch_status ( void )
-{
- int status = 1;
- LOGD("%s,Tv_FactoryGetBacklight_Switch_status get status %d .\n", __FUNCTION__, status);
- return status;
+int CVpp::FactoryGetBacklightPWM_Duty(void) {
+ int duty = 1;
+ LOGD("%s,FactoryGetBacklight_Switch_status get duty %d .\n", __FUNCTION__, duty);
+ return duty;
}
-int CVpp::Tv_FactorySetBacklightPWM_Duty ( int duty )
-{
- LOGD("%s,Tv_FactorySetBacklight_Switch_status set duty %d .\n", __FUNCTION__, duty);
- return 1;
+int CVpp::FactorySetLVDS_ColorDepth(int depth) {
+ LOGD("%s,FactorySetLVDS_ColorDepth set depth %d .\n", "TV", depth);
+ return 1;
}
-int CVpp::Tv_FactoryGetBacklightPWM_Duty ( void )
-{
- int duty = 1;
- LOGD("%s,Tv_FactoryGetBacklight_Switch_status get duty %d .\n", __FUNCTION__, duty);
- return duty;
+int CVpp::FactoryGetLVDS_ColorDepth(void) {
+ int depth = 1;
+ LOGD("%s,FactorySetLVDS_ColorDepth get freq %d .\n", __FUNCTION__, depth);
+ return depth;
}
-int CVpp::Tv_FactorySetLVDS_ColorDepth ( int depth )
-{
- LOGD("%s,Tv_FactorySetLVDS_ColorDepth set depth %d .\n", "TV", depth);
- return 1;
+int CVpp::FactorySetLVDS_ColorDither_status(int status) {
+ LOGD("%s,FactorySetLVDS_ColorDither_status set status %d .\n", __FUNCTION__, status);
+ return 1;
}
-int CVpp::Tv_FactoryGetLVDS_ColorDepth ( void )
-{
- int depth = 1;
- LOGD("%s,Tv_FactorySetLVDS_ColorDepth get freq %d .\n", __FUNCTION__, depth);
- return depth;
+int CVpp::FactoryGetLVDS_ColorDither_status(void) {
+ int status = 1;
+ LOGD("%s,FactoryGetLVDS_ColorDither_status get status %d .\n", __FUNCTION__, status);
+ return status;
}
-int CVpp::Tv_FactorySetLVDS_ColorDither_status ( int status )
-{
- LOGD("%s,Tv_FactorySetLVDS_ColorDither_status set status %d .\n", __FUNCTION__, status);
- return 1;
+int CVpp::FactorySetLVDS_Mapping_status(int status) {
+ LOGD("%s,FactorySetLVDS_Mapping_status set status %d .\n", __FUNCTION__, status);
+ return 1;
}
-int CVpp::Tv_FactoryGetLVDS_ColorDither_status ( void )
-{
- int status = 1;
- LOGD("%s,Tv_FactoryGetLVDS_ColorDither_status get status %d .\n", __FUNCTION__, status);
- return status;
+int CVpp::FactoryGetLVDS_Mapping_status(void) {
+ int status = 1;
+ LOGD("%s,FactoryGetLVDS_Mapping_status get status %d .\n", __FUNCTION__, status);
+ return status;
}
-int CVpp::Tv_FactorySetLVDS_Mapping_status ( int status )
-{
- LOGD("%s,Tv_FactorySetLVDS_Mapping_status set status %d .\n", __FUNCTION__, status);
- return 1;
+int CVpp::FactorySetLVDS_PortSwap_status(int status) {
+ LOGD("%s,FactorySetLVDS_PortSwap_status set status %d .\n", __FUNCTION__, status);
+ return 1;
}
-int CVpp::Tv_FactoryGetLVDS_Mapping_status ( void )
-{
- int status = 1;
- LOGD("%s,Tv_FactoryGetLVDS_Mapping_status get status %d .\n", __FUNCTION__, status);
- return status;
+int CVpp::FactoryGetLVDS_PortSwap_status(void) {
+ int status = 1;
+ LOGD("%s,FactoryGetLVDS_PortSwap_status get status %d .\n", __FUNCTION__, status);
+ return status;
}
-int CVpp::Tv_FactorySetLVDS_PortSwap_status ( int status )
-{
- LOGD("%s,Tv_FactorySetLVDS_PortSwap_status set status %d .\n", __FUNCTION__, status);
- return 1;
+int CVpp::VPPSSMRestoreDefault() {
+ int i = 0, tmp_val = 0;
+ int tmp_panorama_nor = 0, tmp_panorama_full = 0;
+ int offset_r = 0, offset_g = 0, offset_b = 0, gain_r = 1024, gain_g = 1024, gain_b = 1024;
+ int8_t std_buf[6] = { 0, 0, 0, 0, 0, 0 };
+ int8_t warm_buf[6] = { 0, 0, -8, 0, 0, 0 };
+ int8_t cold_buf[6] = { -8, 0, 0, 0, 0, 0 };
+ unsigned char tmp[2] = {0, 0};
+
+ SSMSaveColorDemoMode ( VPP_COLOR_DEMO_MODE_ALLON);
+ SSMSaveColorBaseMode ( VPP_COLOR_BASE_MODE_OPTIMIZE);
+ SSMSaveRGBGainRStart(0, gain_r);
+ SSMSaveRGBGainGStart(0, gain_g);
+ SSMSaveRGBGainBStart(0, gain_b);
+ SSMSaveRGBPostOffsetRStart(0, offset_r);
+ SSMSaveRGBPostOffsetGStart(0, offset_g);
+ SSMSaveRGBPostOffsetBStart(0, offset_b);
+ SSMSaveUserNatureLightSwitch(1);
+ SSMSaveGammaValue(0);
+ SSMSaveGraphyBacklight(100);
+ SSMSaveDBCStart(0);
+ SSMSaveDnlpStart(0); //0: ON,1: OFF,default is on
+ SSMSaveAPL(30);
+ SSMSaveAPL2(30);
+ SSMSaveBD(30);
+ SSMSaveBP(30);
+
+ SSMSaveFBCELECmodeVal(11);
+ SSMSaveFBCN360BackLightVal(10);
+ SSMSaveFBCN360ColorTempVal(1); // standard colortemp
+
+ SSMSaveFBCN310ColorTempVal(0);
+ SSMSaveFBCN310LightsensorVal(0);
+ SSMSaveFBCN310Dream_PanelVal(1);
+ SSMSaveFBCN310MULT_PQVal(1);
+ SSMSaveFBCN310MEMCVal(2);
+ SSMSaveFBCN310BackLightVal(254);
+ for (i = 0; i < 6; i++) {
+ SSMSaveRGBValueStart(i + VPP_COLOR_TEMPERATURE_MODE_STANDARD * 6, std_buf[i]); //0~5
+ SSMSaveRGBValueStart(i + VPP_COLOR_TEMPERATURE_MODE_WARM * 6, warm_buf[i]); //6~11
+ SSMSaveRGBValueStart(i + VPP_COLOR_TEMPERATURE_MODE_COLD * 6, cold_buf[i]); //12~17
+ }
+
+ for (i = 0; i < SOURCE_TYPE_MAX; i++) {
+ if (i == SOURCE_TYPE_HDMI) {
+ SSMSaveColorSpaceStart ( VPP_COLOR_SPACE_AUTO);
+ }
+
+ tmp_val = VPP_COLOR_TEMPERATURE_MODE_STANDARD;
+ tmp_panorama_nor = VPP_PANORAMA_MODE_NORMAL;
+ tmp_panorama_full = VPP_PANORAMA_MODE_FULL;
+
+ if (i == SOURCE_TYPE_HDMI) {
+ SSMSavePanoramaStart(i, tmp_panorama_full);
+ } else {
+ SSMSavePanoramaStart(i, tmp_panorama_nor);
+ }
+
+ SSMSaveColorTemperature(i, tmp_val);
+ tmp_val = 50;
+ SSMSaveBrightness(i, tmp_val);
+ SSMSaveContrast(i, tmp_val);
+ SSMSaveSaturation(i, tmp_val);
+ SSMSaveHue(i, tmp_val);
+ SSMSaveSharpness(i, tmp_val);
+ tmp_val = VPP_PICTURE_MODE_STANDARD;
+ SSMSavePictureMode(i, tmp_val);
+ tmp_val = VPP_DISPLAY_MODE_169;
+ SSMSaveDisplayMode(i, tmp_val);
+ tmp_val = VPP_NOISE_REDUCTION_MODE_AUTO;
+ SSMSaveNoiseReduction(i, tmp_val);
+ tmp_val = 100;
+ SSMSaveBackLightVal(i, tmp_val);
+ }
+
+ SSMSaveDDRSSC(0);
+ SSMSaveLVDSSSC(tmp);
+ return 0;
}
-int CVpp::Tv_FactoryGetLVDS_PortSwap_status ( void )
-{
- int status = 1;
- LOGD("%s,Tv_FactoryGetLVDS_PortSwap_status get status %d .\n", __FUNCTION__, status);
- return status;
+int CVpp::VPPSSMFacRestoreDefault() {
+ return VPPSSMRestoreDefault();
}
-int CVpp::VPPSSMRestoreDefault()
-{
- int i = 0, tmp_val = 0;
- int tmp_panorama_nor = 0, tmp_panorama_full = 0;
- int offset_r = 0, offset_g = 0, offset_b = 0, gain_r = 1024, gain_g = 1024, gain_b = 1024;
- int8_t std_buf[6] = {0, 0, 0, 0, 0, 0};
- int8_t warm_buf[6] = {0, 0, -8, 0, 0, 0};
- int8_t cold_buf[6] = { -8, 0, 0, 0, 0, 0};
- SSMSaveColorDemoMode ( VPP_COLOR_DEMO_MODE_ALLON );
- SSMSaveColorBaseMode ( VPP_COLOR_BASE_MODE_OPTIMIZE );
- SSMSaveRGBGainRStart ( 0, gain_r );
- SSMSaveRGBGainGStart ( 0, gain_g );
- SSMSaveRGBGainBStart ( 0, gain_b );
- SSMSaveRGBPostOffsetRStart ( 0, offset_r );
- SSMSaveRGBPostOffsetGStart ( 0, offset_g );
- SSMSaveRGBPostOffsetBStart ( 0, offset_b );
- SSMSaveUserNatureLightSwitch ( 1 );
- SSMSaveGammaValue ( 0 );
- SSMSaveGraphyBacklight ( 100 );
- SSMSaveDBCStart ( 0 );
- SSMSaveDnlpStart ( 0 ); //0: ON,1: OFF,default is on
- SSMSaveAPL ( 30 );
- SSMSaveAPL2 ( 30 );
- SSMSaveBD ( 30 );
- SSMSaveBP ( 30 );
-
- SSMSaveFBCELECmodeVal(11);
- SSMSaveFBCN360BackLightVal(10);
- SSMSaveFBCN360ColorTempVal(1); // standard colortemp
-
- for ( i = 0; i < 6; i++ ) {
- SSMSaveRGBValueStart ( i + VPP_COLOR_TEMPERATURE_MODE_STANDARD * 6 , std_buf[i] ); //0~5
- SSMSaveRGBValueStart ( i + VPP_COLOR_TEMPERATURE_MODE_WARM * 6, warm_buf[i] ); //6~11
- SSMSaveRGBValueStart ( i + VPP_COLOR_TEMPERATURE_MODE_COLD * 6, cold_buf[i] ); //12~17
- }
-
- for ( i = 0; i < SOURCE_TYPE_MAX; i++ ) {
- if ( i == SOURCE_TYPE_HDMI ) {
- SSMSaveColorSpaceStart ( VPP_COLOR_SPACE_AUTO );
- }
-
- tmp_val = VPP_COLOR_TEMPERATURE_MODE_STANDARD;
- tmp_panorama_nor = VPP_PANORAMA_MODE_NORMAL;
- tmp_panorama_full = VPP_PANORAMA_MODE_FULL;
-
- if ( i == SOURCE_TYPE_HDMI ) {
- SSMSavePanoramaStart ( i, tmp_panorama_full );
- } else {
- SSMSavePanoramaStart ( i, tmp_panorama_nor );
- }
-
- SSMSaveColorTemperature ( i, tmp_val );
- tmp_val = 50;
- SSMSaveBrightness ( i, tmp_val );
- SSMSaveContrast ( i, tmp_val );
- SSMSaveSaturation ( i, tmp_val );
- SSMSaveHue ( i, tmp_val );
- SSMSaveSharpness ( i, tmp_val );
- tmp_val = VPP_PICTURE_MODE_STANDARD;
- SSMSavePictureMode ( i, tmp_val );
- tmp_val = VPP_DISPLAY_MODE_169;
- SSMSaveDisplayMode ( i, tmp_val );
- tmp_val = VPP_NOISE_REDUCTION_MODE_MID;
- SSMSaveNoiseReduction ( i, tmp_val );
- tmp_val = 100;
- SSMSaveBackLightVal ( i, tmp_val );
- }
-
- SSMSaveDDRSSC ( 0 );
- SSMSaveLVDSSSC ( 0 );
- return 0;
-}
-
-int CVpp::VPPSSMFacRestoreDefault()
-{
- return VPPSSMRestoreDefault();
+int CVpp::SetRGBValue(vpp_color_temperature_mode_t temp_mode, unsigned char data_buf[]) {
+ int8_t r_gain = 0, b_gain = 0, g_gain = 0, r_offset = 0, g_offset = 0, b_offset = 0;
+ int ret = -1;
+ tcon_rgb_ogo_t rgbogo;
+ rgbogo.en = 1;
+ rgbogo.r_pre_offset = 0;
+ rgbogo.g_pre_offset = 0;
+ rgbogo.b_pre_offset = 0;
+ r_gain = data_buf[0];
+ g_gain = data_buf[1];
+ b_gain = data_buf[2];
+ r_offset = data_buf[3];
+ g_offset = data_buf[4];
+ b_offset = data_buf[5];
+ int mode = (int) temp_mode;
+
+ switch (mode) {
+ case 1:
+ ret = SSMSaveRGBValueStart(0 + mode * 6, r_gain);
+ ret |= SSMSaveRGBValueStart(1 + mode * 6, g_gain);
+ ret |= SSMSaveRGBValueStart(2 + mode * 6, b_gain);
+ ret |= SSMSaveRGBValueStart(3 + mode * 6, r_offset);
+ ret |= SSMSaveRGBValueStart(4 + mode * 6, g_offset);
+ ret |= SSMSaveRGBValueStart(5 + mode * 6, b_offset);
+ break;
+
+ case 2:
+ ret = SSMSaveRGBValueStart(0 + mode * 6, r_gain);
+ ret |= SSMSaveRGBValueStart(1 + mode * 6, g_gain);
+ ret |= SSMSaveRGBValueStart(2 + mode * 6, b_gain);
+ ret |= SSMSaveRGBValueStart(3 + mode * 6, r_offset);
+ ret |= SSMSaveRGBValueStart(4 + mode * 6, g_offset);
+ ret |= SSMSaveRGBValueStart(5 + mode * 6, b_offset);
+ break;
+
+ case 0:
+ default:
+ ret = SSMSaveRGBValueStart(0, r_gain);
+ ret |= SSMSaveRGBValueStart(1, g_gain);
+ ret |= SSMSaveRGBValueStart(2, b_gain);
+ ret |= SSMSaveRGBValueStart(3, r_offset);
+ ret |= SSMSaveRGBValueStart(4, g_offset);
+ ret |= SSMSaveRGBValueStart(5, b_offset);
+ break;
+ }
+
+ if (ret == 0) {
+ rgbogo.r_gain = RGBGainValueSSMToRisterMapping(r_gain + 128);
+ rgbogo.g_gain = RGBGainValueSSMToRisterMapping(g_gain + 128);
+ rgbogo.b_gain = RGBGainValueSSMToRisterMapping(b_gain + 128);
+ rgbogo.r_post_offset = RGBOffsetValueSSMToRisterMapping(r_offset);
+ rgbogo.g_post_offset = RGBOffsetValueSSMToRisterMapping(g_offset);
+ rgbogo.b_post_offset = RGBOffsetValueSSMToRisterMapping(b_offset);
+ ret |= VPP_SetRGBOGO(&rgbogo);
+ }
+
+ return ret;
}
-int CVpp::Tv_SetRGBValue ( vpp_color_temperature_mode_t temp_mode, unsigned char data_buf[] )
-{
- int8_t r_gain = 0, b_gain = 0, g_gain = 0, r_offset = 0, g_offset = 0, b_offset = 0;
- int ret = -1;
- tcon_rgb_ogo_t rgbogo;
- rgbogo.en = 1;
- rgbogo.r_pre_offset = 0;
- rgbogo.g_pre_offset = 0;
- rgbogo.b_pre_offset = 0;
- r_gain = data_buf[0];
- g_gain = data_buf[1];
- b_gain = data_buf[2];
- r_offset = data_buf[3];
- g_offset = data_buf[4];
- b_offset = data_buf[5];
- int mode = ( int ) temp_mode;
-
- switch ( mode ) {
- case 1:
- ret = SSMSaveRGBValueStart ( 0 + mode * 6, r_gain );
- ret |= SSMSaveRGBValueStart ( 1 + mode * 6, g_gain );
- ret |= SSMSaveRGBValueStart ( 2 + mode * 6, b_gain );
- ret |= SSMSaveRGBValueStart ( 3 + mode * 6, r_offset );
- ret |= SSMSaveRGBValueStart ( 4 + mode * 6, g_offset );
- ret |= SSMSaveRGBValueStart ( 5 + mode * 6, b_offset );
- break;
-
- case 2:
- ret = SSMSaveRGBValueStart ( 0 + mode * 6, r_gain );
- ret |= SSMSaveRGBValueStart ( 1 + mode * 6, g_gain );
- ret |= SSMSaveRGBValueStart ( 2 + mode * 6, b_gain );
- ret |= SSMSaveRGBValueStart ( 3 + mode * 6, r_offset );
- ret |= SSMSaveRGBValueStart ( 4 + mode * 6, g_offset );
- ret |= SSMSaveRGBValueStart ( 5 + mode * 6, b_offset );
- break;
-
- case 0:
- default:
- ret = SSMSaveRGBValueStart ( 0, r_gain );
- ret |= SSMSaveRGBValueStart ( 1, g_gain );
- ret |= SSMSaveRGBValueStart ( 2, b_gain );
- ret |= SSMSaveRGBValueStart ( 3, r_offset );
- ret |= SSMSaveRGBValueStart ( 4, g_offset );
- ret |= SSMSaveRGBValueStart ( 5, b_offset );
- break;
- }
-
- if ( ret == 0 ) {
- rgbogo.r_gain = Tv_RGBGainValueSSMToRisterMapping ( r_gain + 128 );
- rgbogo.g_gain = Tv_RGBGainValueSSMToRisterMapping ( g_gain + 128 );
- rgbogo.b_gain = Tv_RGBGainValueSSMToRisterMapping ( b_gain + 128 );
- rgbogo.r_post_offset = Tv_RGBOffsetValueSSMToRisterMapping ( r_offset );
- rgbogo.g_post_offset = Tv_RGBOffsetValueSSMToRisterMapping ( g_offset );
- rgbogo.b_post_offset = Tv_RGBOffsetValueSSMToRisterMapping ( b_offset );
- ret |= VPP_SetRGBOGO ( &rgbogo );
- }
-
- return ret;
-}
-
-int CVpp::Tv_GetRGBValue ( vpp_color_temperature_mode_t temp_mode, tcon_rgb_ogo_t *p_rgbogo )
-{
- int8_t r_gain = 0, b_gain = 0, g_gain = 0, r_offset = 0, g_offset = 0, b_offset = 0;
- int ret = -1;
-
- p_rgbogo->en = 1;
- p_rgbogo->r_pre_offset = 0;
- p_rgbogo->g_pre_offset = 0;
- p_rgbogo->b_pre_offset = 0;
- p_rgbogo->r_gain = 0;
- p_rgbogo->g_gain = 0;
- p_rgbogo->b_gain = 0;
- p_rgbogo->r_post_offset = 0;
- p_rgbogo->g_post_offset = 0;
- p_rgbogo->b_post_offset = 0;
- int mode = ( int ) temp_mode;
-
- switch ( mode ) {
- case 1:
- ret = SSMReadRGBValueStart ( 0 + mode * 6, &r_gain );
- ret |= SSMReadRGBValueStart ( 1 + mode * 6, &g_gain );
- ret |= SSMReadRGBValueStart ( 2 + mode * 6, &b_gain );
- ret |= SSMReadRGBValueStart ( 3 + mode * 6, &r_offset );
- ret |= SSMReadRGBValueStart ( 4 + mode * 6, &g_offset );
- ret |= SSMReadRGBValueStart ( 5 + mode * 6, &b_offset );
- break;
-
- case 2:
- ret = SSMReadRGBValueStart ( 0 + mode * 6, &r_gain );
- ret |= SSMReadRGBValueStart ( 1 + mode * 6, &g_gain );
- ret |= SSMReadRGBValueStart ( 2 + mode * 6, &b_gain );
- ret |= SSMReadRGBValueStart ( 3 + mode * 6, &r_offset );
- ret |= SSMReadRGBValueStart ( 4 + mode * 6, &g_offset );
- ret |= SSMReadRGBValueStart ( 5 + mode * 6, &b_offset );
- break;
-
- case 0:
- default:
- ret = SSMReadRGBValueStart ( 0, &r_gain );
- ret |= SSMReadRGBValueStart ( 1, &g_gain );
- ret |= SSMReadRGBValueStart ( 2, &b_gain );
- ret |= SSMReadRGBValueStart ( 3, &r_offset );
- ret |= SSMReadRGBValueStart ( 4, &g_offset );
- ret |= SSMReadRGBValueStart ( 5, &b_offset );
- break;
- }
-
- p_rgbogo->r_gain = r_gain + 128; //r_gain:-128~127
- p_rgbogo->g_gain = g_gain + 128;
- p_rgbogo->b_gain = b_gain + 128;
- p_rgbogo->r_post_offset = r_offset;
- p_rgbogo->g_post_offset = g_offset;
- p_rgbogo->b_post_offset = b_offset;
-
- return ret;
+int CVpp::GetRGBValue(vpp_color_temperature_mode_t temp_mode, tcon_rgb_ogo_t *p_rgbogo) {
+ int8_t r_gain = 0, b_gain = 0, g_gain = 0, r_offset = 0, g_offset = 0, b_offset = 0;
+ int ret = -1;
+
+ p_rgbogo->en = 1;
+ p_rgbogo->r_pre_offset = 0;
+ p_rgbogo->g_pre_offset = 0;
+ p_rgbogo->b_pre_offset = 0;
+ p_rgbogo->r_gain = 0;
+ p_rgbogo->g_gain = 0;
+ p_rgbogo->b_gain = 0;
+ p_rgbogo->r_post_offset = 0;
+ p_rgbogo->g_post_offset = 0;
+ p_rgbogo->b_post_offset = 0;
+ int mode = (int) temp_mode;
+
+ switch (mode) {
+ case 1:
+ ret = SSMReadRGBValueStart(0 + mode * 6, &r_gain);
+ ret |= SSMReadRGBValueStart(1 + mode * 6, &g_gain);
+ ret |= SSMReadRGBValueStart(2 + mode * 6, &b_gain);
+ ret |= SSMReadRGBValueStart(3 + mode * 6, &r_offset);
+ ret |= SSMReadRGBValueStart(4 + mode * 6, &g_offset);
+ ret |= SSMReadRGBValueStart(5 + mode * 6, &b_offset);
+ break;
+
+ case 2:
+ ret = SSMReadRGBValueStart(0 + mode * 6, &r_gain);
+ ret |= SSMReadRGBValueStart(1 + mode * 6, &g_gain);
+ ret |= SSMReadRGBValueStart(2 + mode * 6, &b_gain);
+ ret |= SSMReadRGBValueStart(3 + mode * 6, &r_offset);
+ ret |= SSMReadRGBValueStart(4 + mode * 6, &g_offset);
+ ret |= SSMReadRGBValueStart(5 + mode * 6, &b_offset);
+ break;
+
+ case 0:
+ default:
+ ret = SSMReadRGBValueStart(0, &r_gain);
+ ret |= SSMReadRGBValueStart(1, &g_gain);
+ ret |= SSMReadRGBValueStart(2, &b_gain);
+ ret |= SSMReadRGBValueStart(3, &r_offset);
+ ret |= SSMReadRGBValueStart(4, &g_offset);
+ ret |= SSMReadRGBValueStart(5, &b_offset);
+ break;
+ }
+
+ p_rgbogo->r_gain = r_gain + 128; //r_gain:-128~127
+ p_rgbogo->g_gain = g_gain + 128;
+ p_rgbogo->b_gain = b_gain + 128;
+ p_rgbogo->r_post_offset = r_offset;
+ p_rgbogo->g_post_offset = g_offset;
+ p_rgbogo->b_post_offset = b_offset;
+
+ return ret;
}
#define PI 3.14159265358979
-void CVpp::video_set_saturation_hue ( signed char saturation, signed char hue, signed long *mab )
-{
- signed short ma = ( signed short ) ( cos ( ( float ) hue * PI / 128.0 ) * ( ( float ) saturation / 128.0 + 1.0 ) * 256.0 );
- signed short mb = ( signed short ) ( sin ( ( float ) hue * PI / 128.0 ) * ( ( float ) saturation / 128.0 + 1.0 ) * 256.0 );
-
- if ( ma > 511 ) {
- ma = 511;
- }
+void CVpp::video_set_saturation_hue(signed char saturation, signed char hue, signed long *mab) {
+ signed short ma = (signed short) (cos((float) hue * PI / 128.0) * ((float) saturation / 128.0
+ + 1.0) * 256.0);
+ signed short mb = (signed short) (sin((float) hue * PI / 128.0) * ((float) saturation / 128.0
+ + 1.0) * 256.0);
+
+ if (ma > 511) {
+ ma = 511;
+ }
- if ( ma < -512 ) {
- ma = -512;
- }
+ if (ma < -512) {
+ ma = -512;
+ }
- if ( mb > 511 ) {
- mb = 511;
- }
+ if (mb > 511) {
+ mb = 511;
+ }
- if ( mb < -512 ) {
- mb = -512;
- }
+ if (mb < -512) {
+ mb = -512;
+ }
- *mab = ( ( ma & 0x3ff ) << 16 ) | ( mb & 0x3ff );
+ *mab = ((ma & 0x3ff) << 16) | (mb & 0x3ff);
}
-void CVpp::video_get_saturation_hue ( signed char *sat, signed char *hue, signed long *mab )
-{
- signed long temp = *mab;
- signed int ma = ( signed int ) ( ( temp << 6 ) >> 22 );
- signed int mb = ( signed int ) ( ( temp << 22 ) >> 22 );
- signed int sat16 = ( signed int ) ( ( sqrt ( ( ( float ) ma * ( float ) ma + ( float ) mb * ( float ) mb ) / 65536.0 ) - 1.0 ) * 128.0 );
- signed int hue16 = ( signed int ) ( atan ( ( float ) mb / ( float ) ma ) * 128.0 / PI );
+void CVpp::video_get_saturation_hue(signed char *sat, signed char *hue, signed long *mab) {
+ signed long temp = *mab;
+ signed int ma = (signed int) ((temp << 6) >> 22);
+ signed int mb = (signed int) ((temp << 22) >> 22);
+ signed int sat16 = (signed int) ((sqrt(
+ ((float) ma * (float) ma + (float) mb * (float) mb) / 65536.0) - 1.0) * 128.0);
+ signed int hue16 = (signed int) (atan((float) mb / (float) ma) * 128.0 / PI);
- if ( sat16 > 127 ) {
- sat16 = 127;
- }
+ if (sat16 > 127) {
+ sat16 = 127;
+ }
- if ( sat16 < -128 ) {
- sat16 = -128;
- }
+ if (sat16 < -128) {
+ sat16 = -128;
+ }
- if ( hue16 > 127 ) {
- hue16 = 127;
- }
+ if (hue16 > 127) {
+ hue16 = 127;
+ }
- if ( hue16 < -128 ) {
- hue16 = -128;
- }
+ if (hue16 < -128) {
+ hue16 = -128;
+ }
- *sat = ( signed char ) sat16;
- *hue = ( signed char ) hue16;
+ *sat = (signed char) sat16;
+ *hue = (signed char) hue16;
}
-int CVpp::VPP_SetVideoSaturationHue ( int satVal, int hueVal )
-{
- FILE *fp = NULL;
- signed long temp;
+int CVpp::VPP_SetVideoSaturationHue(int satVal, int hueVal) {
+ FILE *fp = NULL;
+ signed long temp;
- fp = fopen ( "/sys/class/amvecm/saturation_hue", "w" );
- LOGD ( "~~~fopen~~~##VPP_SetVideoSaturationHue##%s : %d %d##" , "/sys/class/amvecm/saturation_hue", satVal, hueVal);
+ fp = fopen("/sys/class/amvecm/saturation_hue", "w");
+ LOGD("~~~fopen~~~##VPP_SetVideoSaturationHue##%s : %d %d##",
+ "/sys/class/amvecm/saturation_hue", satVal, hueVal);
- if ( fp == NULL ) {
- LOGE ( "Open /sys/class/amvecm/saturation_hue error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/class/amvecm/saturation_hue error(%s)!\n", strerror(errno));
+ return -1;
+ }
- video_set_saturation_hue ( satVal, hueVal, &temp );
- fprintf ( fp, "0x%lx", temp );
+ video_set_saturation_hue(satVal, hueVal, &temp);
+ fprintf(fp, "0x%lx", temp);
- fclose ( fp );
- fp = NULL;
+ fclose(fp);
+ fp = NULL;
- return 0;
+ return 0;
}
-int CVpp::VPP_SetVideoSaturation ( int saturation )
-{
- FILE *fp = NULL;
+int CVpp::VPP_SetVideoSaturation(int saturation) {
+ FILE *fp = NULL;
- fp = fopen ( "/sys/class/amvecm/saturation_hue", "w" );
- LOGD ( "~~~fopen~~~##VPP_SetVideoSaturation##%s : %d ##" , "/sys/class/amvecm/saturation_hue", saturation);
+ fp = fopen("/sys/class/amvecm/saturation_hue", "w");
+ LOGD("~~~fopen~~~##VPP_SetVideoSaturation##%s : %d ##", "/sys/class/amvecm/saturation_hue",
+ saturation);
- if ( fp == NULL ) {
- LOGE ( "Open /sys/class/amvecm/saturation_hue error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/class/amvecm/saturation_hue error(%s)!\n", strerror(errno));
+ return -1;
+ }
- fprintf ( fp, "0x%x", saturation );
+ fprintf(fp, "0x%x", saturation);
- fclose ( fp );
- fp = NULL;
+ fclose(fp);
+ fp = NULL;
- return 0;
+ return 0;
}
-int CVpp::VPP_SetVideoHue ( int hue )
-{
- FILE *fp = NULL;
+int CVpp::VPP_SetVideoHue(int hue) {
+ FILE *fp = NULL;
- fp = fopen ( "/sys/class/amvecm/saturation_hue", "w" );
- LOGD ( "~~~fopen~~~##VPP_SetVideoHue##%s : %d ##" , "/sys/class/amvecm/saturation_hue", hue);
+ fp = fopen("/sys/class/amvecm/saturation_hue", "w");
+ LOGD("~~~fopen~~~##VPP_SetVideoHue##%s : %d ##", "/sys/class/amvecm/saturation_hue", hue);
- if ( fp == NULL ) {
- LOGE ( "Open /sys/class/amvecm/saturation_hue error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/class/amvecm/saturation_hue error(%s)!\n", strerror(errno));
+ return -1;
+ }
- fprintf ( fp, "0x%x", hue );
+ fprintf(fp, "0x%x", hue);
- fclose ( fp );
- fp = NULL;
- return 0;
+ fclose(fp);
+ fp = NULL;
+ return 0;
}
-int CVpp::VPP_SetGammaTbl_R ( unsigned short red[256] )
-{
- struct tcon_gamma_table_s Redtbl;
- int rt = -1, i = 0;
+int CVpp::VPP_SetGammaTbl_R(unsigned short red[256]) {
+ struct tcon_gamma_table_s Redtbl;
+ int rt = -1, i = 0;
- for ( i = 0; i < 256; i++ ) {
- Redtbl.data[i] = red[i];
- }
+ for (i = 0; i < 256; i++) {
+ Redtbl.data[i] = red[i];
+ }
- rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_R, &Redtbl );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaTbl_R##AMVECM_IOC_GAMMA_TABLE_R##" );
+ rt = VPP_DeviceIOCtl(AMVECM_IOC_GAMMA_TABLE_R, &Redtbl);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetGammaTbl_R##AMVECM_IOC_GAMMA_TABLE_R##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetGammaTbl_R, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetGammaTbl_R, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetGammaTbl_G ( unsigned short green[256] )
-{
- struct tcon_gamma_table_s Greentbl;
- int rt = -1, i = 0;
+int CVpp::VPP_SetGammaTbl_G(unsigned short green[256]) {
+ struct tcon_gamma_table_s Greentbl;
+ int rt = -1, i = 0;
- for ( i = 0; i < 256; i++ ) {
- Greentbl.data[i] = green[i];
- }
+ for (i = 0; i < 256; i++) {
+ Greentbl.data[i] = green[i];
+ }
- rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_G, &Greentbl );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaTbl_G##AMVECM_IOC_GAMMA_TABLE_G##" );
+ rt = VPP_DeviceIOCtl(AMVECM_IOC_GAMMA_TABLE_G, &Greentbl);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetGammaTbl_G##AMVECM_IOC_GAMMA_TABLE_G##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetGammaTbl_R, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetGammaTbl_R, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetGammaTbl_B ( unsigned short blue[256] )
-{
- struct tcon_gamma_table_s Bluetbl;
- int rt = -1, i = 0;
+int CVpp::VPP_SetGammaTbl_B(unsigned short blue[256]) {
+ struct tcon_gamma_table_s Bluetbl;
+ int rt = -1, i = 0;
- for ( i = 0; i < 256; i++ ) {
- Bluetbl.data[i] = blue[i];
- }
+ for (i = 0; i < 256; i++) {
+ Bluetbl.data[i] = blue[i];
+ }
- rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_B, &Bluetbl );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaTbl_B##AMVECM_IOC_GAMMA_TABLE_B##" );
+ rt = VPP_DeviceIOCtl(AMVECM_IOC_GAMMA_TABLE_B, &Bluetbl);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetGammaTbl_B##AMVECM_IOC_GAMMA_TABLE_B##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetGammaTbl_R, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetGammaTbl_R, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetGammaOnOff ( unsigned char onoff )
-{
- int rt = -1;
+int CVpp::VPP_SetGammaOnOff(unsigned char onoff) {
+ int rt = -1;
- if ( onoff == 1 ) {
- rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_EN );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaOnOff##AMVECM_IOC_GAMMA_TABLE_EN##" );
- }
+ if (onoff == 1) {
+ rt = VPP_DeviceIOCtl(AMVECM_IOC_GAMMA_TABLE_EN);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetGammaOnOff##AMVECM_IOC_GAMMA_TABLE_EN##");
+ }
- if ( onoff == 0 ) {
- rt = VPP_DeviceIOCtl ( AMVECM_IOC_GAMMA_TABLE_DIS );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetGammaOnOff##AMVECM_IOC_GAMMA_TABLE_DIS##" );
- }
+ if (onoff == 0) {
+ rt = VPP_DeviceIOCtl(AMVECM_IOC_GAMMA_TABLE_DIS);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetGammaOnOff##AMVECM_IOC_GAMMA_TABLE_DIS##");
+ }
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetGammaOnOff, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetGammaOnOff, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetGrayPattern(int value)
-{
+int CVpp::VPP_SetGrayPattern(int value) {
- FILE *fp = NULL;
- if (value < 0) {
- value = 0;
- } else if (value > 255) {
- value = 255;
- }
- value = value << 16 | 0x8080;
+ FILE *fp = NULL;
+ if (value < 0) {
+ value = 0;
+ } else if (value > 255) {
+ value = 255;
+ }
+ value = value << 16 | 0x8080;
- fp = fopen ( "/sys/class/video/test_screen", "w" );
- LOGD ( "~~~fopen~~~##VPP_SetGrayPattern##%s : %x ##" , "/sys/class/video/test_screen", value);
+ fp = fopen("/sys/class/video/test_screen", "w");
+ LOGD("~~~fopen~~~##VPP_SetGrayPattern##%s : %x ##", "/sys/class/video/test_screen", value);
- if ( fp == NULL ) {
- LOGE ( "Open /sys/classs/video/test_screen error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/classs/video/test_screen error(%s)!\n", strerror(errno));
+ return -1;
+ }
- fprintf ( fp, "0x%x", value );
- fclose ( fp );
- fp = NULL;
+ fprintf(fp, "0x%x", value);
+ fclose(fp);
+ fp = NULL;
- return 0;
+ return 0;
}
-int CVpp::VPP_GetGrayPattern()
-{
- FILE *fp = NULL;
- int value;
- fp = fopen ( "/sys/class/video/test_screen", "r+" );
+int CVpp::VPP_GetGrayPattern() {
+ FILE *fp = NULL;
+ int value;
+ fp = fopen("/sys/class/video/test_screen", "r+");
- LOGD ( "~~~fopen~~~##VPP_GetGrayPattern##%s ##" , "/sys/class/video/test_screen");
+ LOGD("~~~fopen~~~##VPP_GetGrayPattern##%s ##", "/sys/class/video/test_screen");
- if ( fp == NULL ) {
- LOGE ( "Open /sys/class/video/test_screen error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/class/video/test_screen error(%s)!\n", strerror(errno));
+ return -1;
+ }
- fscanf ( fp, "%d", &value );
- fclose ( fp );
- fp = NULL;
- if (value < 0) {
- return 0;
- } else {
- value = value >> 16;
- if (value > 255) {
- value = 255;
- }
- return value;
- }
+ fscanf(fp, "%d", &value);
+ fclose(fp);
+ fp = NULL;
+ if (value < 0) {
+ return 0;
+ } else {
+ value = value >> 16;
+ if (value > 255) {
+ value = 255;
+ }
+ return value;
+ }
}
-int CVpp::VPP_SetVideoNoiseReduction ( int value )
-{
- FILE *fp = NULL;
+int CVpp::VPP_SplitScreenEffect(int width, int v_register) {
+ FILE *fp = fopen("/sys/class/amlogic/debug", "w");
+
+ if (fp == NULL) {
+ LOGE("Open /sys/class/amlogic/debug ERROR(%s)!!\n", strerror(errno));
+ return -1;
+ }
+ LOGD("width = %x----v_register = %x", width, v_register);
+ fprintf(fp, "w %x v %x", width, v_register);
+ fclose(fp);
+ fp = NULL;
+
+ return 0;
+}
+int CVpp::VPP_SetVideoNoiseReduction(int value) {
+ FILE *fp = NULL;
- fp = fopen ( "/sys/class/deinterlace/di0/parameters", "w" );
- LOGD ( "~~~fopen~~~##VPP_SetVideoNoiseReduction##%s : %d ##" , "/sys/class/deinterlace/di0/parameters", value);
+ fp = fopen("/sys/class/deinterlace/di0/parameters", "w");
+ LOGD("~~~fopen~~~##VPP_SetVideoNoiseReduction##%s : %d ##",
+ "/sys/class/deinterlace/di0/parameters", value);
- if ( fp == NULL ) {
- LOGE ( "Open /sys/class/deinterlace/di0/parameters ERROR(%s)!!\n", strerror ( errno ) );
- return -1;
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/class/deinterlace/di0/parameters ERROR(%s)!!\n", strerror(errno));
+ return -1;
+ }
- fprintf ( fp, "noise_reduction_level=%x", value );
- fclose ( fp );
- fp = NULL;
+ fprintf(fp, "noise_reduction_level=%x", value);
+ fclose(fp);
+ fp = NULL;
- return 0;
+ return 0;
}
-int CVpp::VPP_SetDeinterlaceMode ( int value )
-{
- FILE *fp = NULL;
+int CVpp::VPP_SetDeinterlaceMode(int value) {
+ FILE *fp = NULL;
- fp = fopen ( "/sys/module/deinterlace/parameters/deinterlace_mode", "w" );
- LOGD ( "~~~fopen~~~##VPP_SetDeinterlaceMode##%s : %d ##" , "/sys/module/deinterlace/parameters/deinterlace_mode", value);
+ fp = fopen("/sys/module/deinterlace/parameters/deinterlace_mode", "w");
+ LOGD("~~~fopen~~~##VPP_SetDeinterlaceMode##%s : %d ##",
+ "/sys/module/deinterlace/parameters/deinterlace_mode", value);
- if ( fp == NULL ) {
- LOGE ( "Open /sys/module/deinterlace/parameters/deinterlace_mode error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ if (fp == NULL) {
+ LOGE("Open /sys/module/deinterlace/parameters/deinterlace_mode error(%s)!\n",
+ strerror(errno));
+ return -1;
+ }
- fprintf ( fp, "%d", value );
+ fprintf(fp, "%d", value);
- fclose ( fp );
- fp = NULL;
+ fclose(fp);
+ fp = NULL;
- return 0;
+ return 0;
}
-int CVpp::Tv_GetHistogram_AVE ( void )
-{
- ve_hist_t hist;
- hist.sum = 0;
- hist.height = 0;
- hist.width = 0;
- hist.ave = 0;
+int CVpp::GetHistogram_AVE(void) {
+ ve_hist_t hist;
+ hist.sum = 0;
+ hist.height = 0;
+ hist.width = 0;
+ hist.ave = 0;
+
+ if (Vpp_GetAVGHistogram(&hist) == 0) {
+ LOGD("%s: %d.\n", __FUNCTION__, hist.ave);
+ } else {
+ LOGE("%s failed.\n", __FUNCTION__);
+ }
+
+ return hist.ave;
+}
- if ( Vpp_GetAVGHistogram ( &hist ) == 0 ) {
- LOGD ( "%s: %d.\n", __FUNCTION__, hist.ave );
- } else {
- LOGE ( "%s failed.\n", __FUNCTION__ );
- }
+int CVpp::Vpp_GetAVGHistogram(struct ve_hist_s *hist) {
+ //int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_G_HIST_AVG, hist);
+ int rt = VPP_DeviceIOCtl(AMVECM_IOC_G_HIST_AVG, hist);
+ LOGD("~~~VPP_DeviceIOCtl~~~##Vpp_GetAVGHistogram##AMVECM_IOC_G_HIST_AVG##");
+
+ if (rt < 0) {
+ LOGE("Vpp_GetAVGHistogram, error(%s)!\n", strerror(errno));
+ }
- return hist.ave;
+ return rt;
}
-int CVpp::Vpp_GetAVGHistogram ( struct ve_hist_s *hist )
-{
- //int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_G_HIST_AVG, hist);
- int rt = VPP_DeviceIOCtl ( AMVECM_IOC_G_HIST_AVG, hist );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##Vpp_GetAVGHistogram##AMVECM_IOC_G_HIST_AVG##" );
+int CVpp::VPP_SetVEBlackExtension(const struct ve_bext_s *pBExt) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_BEXT, pBExt);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetVEBlackExtension##AMSTREAM_IOC_VE_BEXT##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_GetAVGHistogram, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetVEBlackExtension, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
+tvin_cutwin_t CVpp::GetOverscan(tv_source_input_type_t source_type, tvin_sig_fmt_t fmt,
+ is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt) {
+ int ret = -1;
+ char tmp_buf[16];
+ tvin_cutwin_t cutwin_t;
+ memset(&cutwin_t, 0, sizeof(cutwin_t));
-int CVpp::VPP_SetVEBlackExtension ( const struct ve_bext_s *pBExt )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_BEXT, pBExt );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEBlackExtension##AMSTREAM_IOC_VE_BEXT##" );
+ if (trans_fmt < TVIN_TFMT_2D || trans_fmt > TVIN_TFMT_3D_LDGD) {
+ return cutwin_t;
+ }
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetVEBlackExtension, error(%s)!\n", strerror ( errno ) );
- }
+ vpp_display_mode_t scrmode = GetDisplayMode(source_type);
+ ret = mpPqData->PQ_GetOverscanParams(source_type, fmt, is3d, trans_fmt, scrmode, &cutwin_t);
- return rt;
+ return cutwin_t;
}
-tvin_cutwin_t CVpp::Tv_GetOverscan ( tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt )
-{
- int ret = -1;
- char tmp_buf[16];
- tvin_cutwin_t cutwin_t;
- memset ( &cutwin_t, 0, sizeof ( cutwin_t ) );
-
- if ( trans_fmt < TVIN_TFMT_2D || trans_fmt > TVIN_TFMT_3D_LDGD ) {
- return cutwin_t;
- }
-
- if (source_type == SOURCE_TYPE_DTV) {
- tmp_buf[0] = 0;
- ret = 0;
- if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 0, tmp_buf)) == 0) {
- cutwin_t.vs = strtol(tmp_buf, NULL, 10);
- }
- if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 1, tmp_buf)) == 0) {
- cutwin_t.hs = strtol(tmp_buf, NULL, 10);
- }
- if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 2, tmp_buf)) == 0) {
- cutwin_t.ve = strtol(tmp_buf, NULL, 10);
- }
- if ((ret |= cfg_get_one_item("vpp.overscan.dtv", ",", 3, tmp_buf)) == 0) {
- cutwin_t.he = strtol(tmp_buf, NULL, 10);
- }
-
- if (ret < 0) {
- cutwin_t.vs = 12;
- cutwin_t.hs = 27;
- cutwin_t.ve = 10;
- cutwin_t.he = 24;
- }
- return cutwin_t;
- }
-
- vpp_display_mode_t scrmode = Tv_GetDisplayMode ( source_type );
- ret = mpPqData->PQ_GetOverscanParams ( source_type, fmt, is3d, trans_fmt, scrmode, &cutwin_t );
-
- if ( ret != 0 ) {
- LOGW ( "%s, PQ_GetOverscanParams faild.\n", __FUNCTION__ );
-
- if ( source_type == SOURCE_TYPE_TV ) {
- if ( fmt == TVIN_SIG_FMT_CVBS_NTSC_M
- || fmt == TVIN_SIG_FMT_CVBS_NTSC_443 ) {
- cutwin_t.hs = 30;
- cutwin_t.he = 720 - 30 - 1;
- cutwin_t.vs = 2;
- cutwin_t.ve = 240 - 2 - 1;
- } else if ( fmt >= TVIN_SIG_FMT_CVBS_PAL_I && fmt <= TVIN_SIG_FMT_CVBS_SECAM ) {
- cutwin_t.hs = 32;
- cutwin_t.he = 720 - 32 - 1;
- cutwin_t.vs = 6;
- cutwin_t.ve = 288 - 8 - 1;
- }
- }
- }
-
- return cutwin_t;
-}
-
-int CVpp::VPP_SetVideoCrop ( int Voffset0, int Hoffset0, int Voffset1, int Hoffset1 )
-{
- int fd = -1;
- char set_str[32];
+int CVpp::VPP_SetVideoCrop(int Voffset0, int Hoffset0, int Voffset1, int Hoffset1) {
+ int fd = -1;
+ char set_str[32];
- fd = open ( "/sys/class/video/crop", O_RDWR );
+ fd = open("/sys/class/video/crop", O_RDWR);
- LOGD ( "~~~open~~~##VPP_SetVideoCrop##%s : %d %d %d %d##" , "/sys/class/video/crop", Voffset0, Hoffset0, Voffset1, Hoffset1);
+ LOGD("~~~open~~~##VPP_SetVideoCrop##%s : %d %d %d %d##", "/sys/class/video/crop", Voffset0,
+ Hoffset0, Voffset1, Hoffset1);
- if ( fd < 0 ) {
- LOGE ( "Open /sys/class/video/crop error(%s)!\n", strerror ( errno ) );
- return -1;
- }
+ if (fd < 0) {
+ LOGE("Open /sys/class/video/crop error(%s)!\n", strerror(errno));
+ return -1;
+ }
- memset ( set_str, 0, 32 );
- sprintf ( set_str, "%d %d %d %d", Voffset0, Hoffset0, Voffset1, Hoffset1 );
- write ( fd, set_str, strlen ( set_str ) );
- close ( fd );
+ memset(set_str, 0, 32);
+ sprintf(set_str, "%d %d %d %d", Voffset0, Hoffset0, Voffset1, Hoffset1);
+ write(fd, set_str, strlen(set_str));
+ close(fd);
- return 0;
+ return 0;
}
-int CVpp::VPP_SetVESharpness ( const struct ve_hsvs_s *pHSVS )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_HSVS, pHSVS );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVESharpness##AMSTREAM_IOC_VE_HSVS##" );
+int CVpp::VPP_SetVESharpness(const struct ve_hsvs_s *pHSVS) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_HSVS, pHSVS);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetVESharpness##AMSTREAM_IOC_VE_HSVS##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetVESharpness, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetVESharpness, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetVEChromaCoring ( const struct ve_ccor_s *pCCor )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_CCOR, pCCor );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEChromaCoring##AMSTREAM_IOC_VE_CCOR##" );
+int CVpp::VPP_SetVEChromaCoring(const struct ve_ccor_s *pCCor) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_CCOR, pCCor);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetVEChromaCoring##AMSTREAM_IOC_VE_CCOR##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetVEChromaCoring, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetVEChromaCoring, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetVEBlueEnh ( const struct ve_benh_s *pBEnh )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_BENH, pBEnh );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEBlueEnh##AMSTREAM_IOC_VE_BENH##" );
+int CVpp::VPP_SetVEBlueEnh(const struct ve_benh_s *pBEnh) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_BENH, pBEnh);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetVEBlueEnh##AMSTREAM_IOC_VE_BENH##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetVEBlueEnh, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetVEBlueEnh, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetVEDemo ( const struct ve_demo_s *pDemo )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_DEMO, pDemo );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEDemo##AMSTREAM_IOC_VE_DEMO##" );
+int CVpp::VPP_SetVEDemo(const struct ve_demo_s *pDemo) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_DEMO, pDemo);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetVEDemo##AMSTREAM_IOC_VE_DEMO##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetVEDemo, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetVEDemo, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetVERegisterMap ( const struct ve_regmap_s *pRegMap )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_REGMAP, pRegMap );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVERegisterMap##AMSTREAM_IOC_VE_REGMAP##" );
+int CVpp::VPP_SetVERegisterMap(const struct ve_regmap_s *pRegMap) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_REGMAP, pRegMap);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetVERegisterMap##AMSTREAM_IOC_VE_REGMAP##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetVERegisterMap, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetVERegisterMap, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetVEDebug ( const unsigned long long *pLData )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_VE_DEBUG, pLData );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetVEDebug##AMSTREAM_IOC_VE_DEBUG##" );
+int CVpp::VPP_SetVEDebug(const unsigned long long *pLData) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_VE_DEBUG, pLData);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetVEDebug##AMSTREAM_IOC_VE_DEBUG##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetVEDebug, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetVEDebug, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetCMRegion ( const struct cm_region_s *pRegion )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_REGION, pRegion );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMRegion##AMSTREAM_IOC_CM_REGION##" );
+int CVpp::VPP_SetCMRegion(const struct cm_region_s *pRegion) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_CM_REGION, pRegion);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetCMRegion##AMSTREAM_IOC_CM_REGION##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetCMRegion, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetCMRegion, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetCMTopLayer ( const struct cm_top_s *pTop )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_TOP, pTop );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMTopLayer##AMSTREAM_IOC_CM_TOP##" );
+int CVpp::VPP_SetCMTopLayer(const struct cm_top_s *pTop) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_CM_TOP, pTop);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetCMTopLayer##AMSTREAM_IOC_CM_TOP##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetCMTopLayer, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetCMTopLayer, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetCMDemo ( const struct cm_demo_s *pDemo )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_DEMO, pDemo );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMDemo##AMSTREAM_IOC_CM_DEMO##" );
+int CVpp::VPP_SetCMDemo(const struct cm_demo_s *pDemo) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_CM_DEMO, pDemo);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetCMDemo##AMSTREAM_IOC_CM_DEMO##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetCMDemo, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetCMDemo, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetCMRegisterMap ( struct cm_regmap_s *pRegMap )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_REGMAP, pRegMap );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMRegisterMap##AMSTREAM_IOC_CM_REGMAP##" );
+int CVpp::VPP_SetCMRegisterMap(struct cm_regmap_s *pRegMap) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_CM_REGMAP, pRegMap);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetCMRegisterMap##AMSTREAM_IOC_CM_REGMAP##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetCMRegisterMap, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetCMRegisterMap, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetCMDebug ( const unsigned long long *pLData )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_CM_DEBUG, pLData );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetCMDebug##AMSTREAM_IOC_CM_DEBUG##" );
+int CVpp::VPP_SetCMDebug(const unsigned long long *pLData) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_CM_DEBUG, pLData);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetCMDebug##AMSTREAM_IOC_CM_DEBUG##");
- if ( rt < 0 ) {
- LOGE ( "=VPP CPP=> set cm debug, error (%s)", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("=VPP CPP=> set cm debug, error (%s)", strerror(errno));
+ }
- return rt;
+ return rt;
}
-int CVpp::VPP_SetAVSyncEnable ( const unsigned int enable )
-{
- int rt = VPP_DeviceIOCtl ( AMSTREAM_IOC_SYNCENABLE, enable );
- LOGD ( "~~~VPP_DeviceIOCtl~~~##VPP_SetAVSyncEnable##AMSTREAM_IOC_SYNCENABLE##" );
+int CVpp::VPP_SetAVSyncEnable(const unsigned int enable) {
+ int rt = VPP_DeviceIOCtl(AMSTREAM_IOC_SYNCENABLE, enable);
+ LOGD("~~~VPP_DeviceIOCtl~~~##VPP_SetAVSyncEnable##AMSTREAM_IOC_SYNCENABLE##");
- if ( rt < 0 ) {
- LOGE ( "Vpp_api_SetAVSyncEnable, error(%s)!\n", strerror ( errno ) );
- }
+ if (rt < 0) {
+ LOGE("Vpp_api_SetAVSyncEnable, error(%s)!\n", strerror(errno));
+ }
- return rt;
+ return rt;
+}
+int CVpp::VPP_SetScalerPathSel(const unsigned int value) {
+ FILE *fp = NULL;
+
+ fp = fopen("/sys/class/video/video_scaler_path_sel", "w");
+ LOGD("~~~fopen~~~##VPP_SetScalerPathSel##%s : %d ##", "/sys/class/video/video_scaler_path_sel",
+ value);
+ if (fp == NULL) {
+ LOGE("Open /sys/class/video/video_scaler_path_sel error(%s)!\n", strerror(errno));
+ return -1;
+ }
+ fprintf(fp, "%d", value);
+ fclose(fp);
+ fp = NULL;
+ return 0;
}
diff --git a/tvapi/libtv/vpp/CVpp.h b/tvapi/libtv/vpp/CVpp.h
index ae57822..2131815 100644
--- a/tvapi/libtv/vpp/CVpp.h
+++ b/tvapi/libtv/vpp/CVpp.h
@@ -45,6 +45,14 @@ typedef enum is_3d_type_e {
INDEX_3D = 1,
} is_3d_type_t;
+typedef enum vpp_deblock_mode_e {
+ VPP_DEBLOCK_MODE_OFF,
+ VPP_DEBLOCK_MODE_LOW,
+ VPP_DEBLOCK_MODE_MIDDLE,
+ VPP_DEBLOCK_MODE_HIGH,
+ VPP_DEBLOCK_MODE_AUTO,
+} vpp_deblock_mode_t;
+
typedef enum vpp_panorama_mode_e {
VPP_PANORAMA_MODE_FULL,
VPP_PANORAMA_MODE_NORMAL,
@@ -206,7 +214,9 @@ class CVpp {
public:
CVpp();
~CVpp();
- int Vpp_Init ( void );
+ int doSuspend();
+ int doResume();
+ int Vpp_Init ( const char *pq_db_path );
int Vpp_Uninit ( void );
CPqData *getPqData();
int Vpp_ResetLastVppSettingsSourceType ( void );
@@ -222,124 +232,122 @@ public:
int Vpp_SetPQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
int Vpp_SetNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
int Vpp_SetXVYCCMode ( vpp_xvycc_mode_t xvycc_mode, tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
- int Vpp_SetMCDIMode ( vpp_mcdi_mode_t mcdi_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt);
+ int Vpp_SetDeblockMode(vpp_deblock_mode_t mode, tvin_port_t source_port, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt);
+ int Vpp_SetMCDIMode ( vpp_mcdi_mode_t mcdi_mode, tv_source_input_type_t source_type , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt);
int Vpp_SetZoom ( int value );
- int Vpp_LoadBasicRegs ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
+ int Vpp_LoadDI(tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt);
+ int Vpp_LoadBasicRegs ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
int VppRegisterInterface();
- int Tv_RGBGainValueSSMToRisterMapping ( int gainValue );
- int Tv_RGBOffsetValueSSMToRisterMapping ( int gainValue );
- int Tv_SetRGBValue ( vpp_color_temperature_mode_t temp_mode, unsigned char data_buf[] );
- int Tv_GetRGBValue ( vpp_color_temperature_mode_t temp_mode, tcon_rgb_ogo_t *p_rgbogo );
- int Tv_SetColorSpaceMode ( vpp_color_space_type_t colorSpace );
+ int RGBGainValueSSMToRisterMapping ( int gainValue );
+ int RGBOffsetValueSSMToRisterMapping ( int gainValue );
+ int SetRGBValue ( vpp_color_temperature_mode_t temp_mode, unsigned char data_buf[] );
+ int GetRGBValue ( vpp_color_temperature_mode_t temp_mode, tcon_rgb_ogo_t *p_rgbogo );
+ int SetColorSpaceMode ( vpp_color_space_type_t colorSpace );
//int Tv_SetGammaValue(int gammaValue);
- int Tv_GetGammaValue();
+ int GetGammaValue();
//int Tv_SetColorDemoMode ( vpp_color_demomode_t demomode );
- vpp_color_demomode_t Tv_GetColorDemoMode ( void );
-
- int Tv_SetBaseColorMode ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt);
- vpp_color_basemode_t Tv_GetBaseColorMode ( void );
- int Tv_SetBaseColorModeWithoutSave ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt);
- int Tv_SaveBaseColorMode ( vpp_color_basemode_t basemode );
- int Tv_SetColorTemperature ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type, int is_save );
- vpp_color_temperature_mode_t Tv_GetColorTemperature ( tv_source_input_type_t source_type );
- int Tv_SetColorTempWithoutSave ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type );
- int Tv_SaveColorTemp ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type );
- int Tv_SetBrightness ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
- int Tv_GetBrightness ( tv_source_input_type_t source_type );
- int Tv_SetContrast ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
- int Tv_GetContrast ( tv_source_input_type_t source_type );
- int Tv_SetSaturation ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
- int Tv_GetSaturation ( tv_source_input_type_t source_type );
- int Tv_SetHue ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
- int Tv_GetHue ( tv_source_input_type_t source_type );
- int Tv_SetSharpness ( int value, tv_source_input_type_t source_type, int is_enable, is_3d_type_t is3d, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, int is_save );
- int Tv_GetSharpness ( tv_source_input_type_t source_type );
- int Tv_SetBacklight ( int value, tv_source_input_type_t source_type, int is_save );
- int Tv_GetBacklight ( tv_source_input_type_t source_type );
- int Tv_SetBacklightWithoutSave ( int value, tv_source_input_type_t source_type );
- int Tv_SaveBacklight ( int value, tv_source_input_type_t source_type );
- int Tv_SetPQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
- vpp_picture_mode_t Tv_GetPQMode ( tv_source_input_type_t source_type );
- int Tv_SavePQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type );
- int Tv_SetDisplayMode ( vpp_display_mode_t display_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, int is_save );
- vpp_display_mode_t Tv_GetDisplayMode ( tv_source_input_type_t source_type );
- int Tv_SaveNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type );
- int Tv_SetNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt, int is_save );
- vpp_noise_reduction_mode_t Tv_GetNoiseReductionMode ( tv_source_input_type_t source_type );
- int Tv_SetRGBOGO_PostOffset(int rgb, int offset);
- int Tv_SetRGBOGO_Gain(int rgb, int gain);
- int Tv_GetRGBOGO_PostOffset ( int rgb );
- int Tv_GetRGBOGO_Gain( int rgb );
- int Tv_SetDNLP ( tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
- int Tv_LoadVppSettings ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
+ vpp_color_demomode_t GetColorDemoMode ( void );
+
+ int SetBaseColorMode ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt);
+ vpp_color_basemode_t GetBaseColorMode ( void );
+ int SetBaseColorModeWithoutSave ( vpp_color_basemode_t basemode , tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt);
+ int SaveBaseColorMode ( vpp_color_basemode_t basemode );
+ int SetColorTemperature ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type, int is_save );
+ vpp_color_temperature_mode_t GetColorTemperature ( tv_source_input_type_t source_type );
+ int SetColorTempWithoutSave ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type );
+ int SaveColorTemp ( vpp_color_temperature_mode_t Tempmode, tv_source_input_type_t source_type );
+ int SetBrightness ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
+ int GetBrightness ( tv_source_input_type_t source_type );
+ int SetContrast ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
+ int GetContrast ( tv_source_input_type_t source_type );
+ int SetSaturation ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
+ int GetSaturation ( tv_source_input_type_t source_type );
+ int SetHue ( int value, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
+ int GetHue ( tv_source_input_type_t source_type );
+ int SetSharpness ( int value, tv_source_input_type_t source_type, int is_enable, is_3d_type_t is3d, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, int is_save );
+ int GetSharpness ( tv_source_input_type_t source_type );
+ int SetBacklight ( int value, tv_source_input_type_t source_type, int is_save );
+ int GetBacklight ( tv_source_input_type_t source_type );
+ int SetBacklightWithoutSave ( int value, tv_source_input_type_t source_type );
+ int SaveBacklight ( int value, tv_source_input_type_t source_type );
+ int SetPQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, tvin_trans_fmt_t trans_fmt, is_3d_type_t is3d, int is_save );
+ vpp_picture_mode_t GetPQMode ( tv_source_input_type_t source_type );
+ int SavePQMode ( vpp_picture_mode_t pq_mode, tv_source_input_type_t source_type );
+ int SetDisplayMode ( vpp_display_mode_t display_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, int is_save );
+ vpp_display_mode_t GetDisplayMode ( tv_source_input_type_t source_type );
+ int SaveNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type );
+ int SetNoiseReductionMode ( vpp_noise_reduction_mode_t nr_mode, tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt, int is_save );
+ vpp_noise_reduction_mode_t GetNoiseReductionMode ( tv_source_input_type_t source_type );
+ int SetDNLP ( tv_source_input_type_t source_type, tvin_port_t source_port , tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
+ int LoadVppSettings ( tv_source_input_type_t source_type, tvin_sig_fmt_t sig_fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
//int Tv_SetVppParamDefault(void);
- int Tv_FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness );
- int Tv_FactoryGetPQMode_Brightness ( int source_type, int pq_mode );
- int Tv_FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast );
- int Tv_FactoryGetPQMode_Contrast ( int source_type, int pq_mode );
- int Tv_FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation );
- int Tv_FactoryGetPQMode_Saturation ( int source_type, int pq_mode );
- int Tv_FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue );
- int Tv_FactoryGetPQMode_Hue ( int source_type, int pq_mode );
- int Tv_FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness );
- int Tv_FactoryGetPQMode_Sharpness ( int source_type, int pq_mode );
- int Tv_FactorySetColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain );
- int Tv_FactorySaveColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain );
- int Tv_FactoryGetColorTemp_Rgain ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain );
- int Tv_FactorySaveColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain );
- int Tv_FactoryGetColorTemp_Ggain ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain );
- int Tv_FactorySaveColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain );
- int Tv_FactoryGetColorTemp_Bgain ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset );
- int Tv_FactorySaveColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset );
- int Tv_FactoryGetColorTemp_Roffset ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset );
- int Tv_FactorySaveColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset );
- int Tv_FactoryGetColorTemp_Goffset ( int source_type, int colortemp_mode );
- int Tv_FactorySetColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset );
- int Tv_FactorySaveColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset );
- int Tv_FactoryGetColorTemp_Boffset ( int source_type, int colortemp_mode );
+ int FactorySetPQMode_Brightness ( int source_type, int pq_mode, int brightness );
+ int FactoryGetPQMode_Brightness ( int source_type, int pq_mode );
+ int FactorySetPQMode_Contrast ( int source_type, int pq_mode, int contrast );
+ int FactoryGetPQMode_Contrast ( int source_type, int pq_mode );
+ int FactorySetPQMode_Saturation ( int source_type, int pq_mode, int saturation );
+ int FactoryGetPQMode_Saturation ( int source_type, int pq_mode );
+ int FactorySetPQMode_Hue ( int source_type, int pq_mode, int hue );
+ int FactoryGetPQMode_Hue ( int source_type, int pq_mode );
+ int FactorySetPQMode_Sharpness ( int source_type, int pq_mode, int sharpness );
+ int FactoryGetPQMode_Sharpness ( int source_type, int pq_mode );
+ int FactorySetColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain );
+ int FactorySaveColorTemp_Rgain ( int source_type, int colortemp_mode, int rgain );
+ int FactoryGetColorTemp_Rgain ( int source_type, int colortemp_mode );
+ int FactorySetColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain );
+ int FactorySaveColorTemp_Ggain ( int source_type, int colortemp_mode, int ggain );
+ int FactoryGetColorTemp_Ggain ( int source_type, int colortemp_mode );
+ int FactorySetColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain );
+ int FactorySaveColorTemp_Bgain ( int source_type, int colortemp_mode, int bgain );
+ int FactoryGetColorTemp_Bgain ( int source_type, int colortemp_mode );
+ int FactorySetColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset );
+ int FactorySaveColorTemp_Roffset ( int source_type, int colortemp_mode, int roffset );
+ int FactoryGetColorTemp_Roffset ( int source_type, int colortemp_mode );
+ int FactorySetColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset );
+ int FactorySaveColorTemp_Goffset ( int source_type, int colortemp_mode, int goffset );
+ int FactoryGetColorTemp_Goffset ( int source_type, int colortemp_mode );
+ int FactorySetColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset );
+ int FactorySaveColorTemp_Boffset ( int source_type, int colortemp_mode, int boffset );
+ int FactoryGetColorTemp_Boffset ( int source_type, int colortemp_mode );
//int Tv_FactorySaveRGBDatatoAllSrc ( int source_type, int colortemp_mode );
- int Tv_FactoryGetTestPattern ( void );
- int Tv_FactoryResetPQMode ( void );
- int TV_FactoryResetNonlinear ( void );
- int Tv_FactoryResetColorTemp ( void );
- int Tv_FactorySetParamsDefault ( void );
- int Tv_FactorySetDDRSSC ( int step );
- int Tv_FactoryGetDDRSSC();
- int Tv_FactorySetLVDSSSC ( int step );
- int Tv_FactoryGetLVDSSSC();
- int Tv_FactorySetNolineParams ( int type, int source_type, noline_params_t noline_params );
- noline_params_t Tv_FactoryGetNolineParams ( int type, int source_type );
- int Tv_FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t );
- tvin_cutwin_t Tv_FactoryGetOverscan ( int source_type, int fmt, is_3d_type_t is3d, int trans_fmt );
- int Tv_FactorySetBacklightPWM_Frequency(int freq);
- int Tv_FactoryGetBacklightPWM_Frequency ( void );
- int Tv_FactorySetBacklight_Switch_status ( int status );
- int Tv_FactoryGetBacklight_Switch_status ( void );
- int Tv_FactorySetBacklightPWM_Duty ( int duty );
- int Tv_FactoryGetBacklightPWM_Duty ( void );
- int Tv_FactorySetLVDS_ColorDepth ( int depth );
- int Tv_FactoryGetLVDS_ColorDepth ( void );
- int Tv_FactorySetLVDS_ColorDither_status ( int status );
- int Tv_FactoryGetLVDS_ColorDither_status ( void );
- int Tv_FactorySetLVDS_Mapping_status ( int status );
- int Tv_FactoryGetLVDS_Mapping_status ( void );
- int Tv_FactorySetLVDS_PortSwap_status ( int status );
- int Tv_FactoryGetLVDS_PortSwap_status ( void );
+ int FactoryGetTestPattern ( void );
+ int FactoryResetPQMode ( void );
+ int FactoryResetColorTemp ( void );
+ int FactorySetParamsDefault ( void );
+ int FactorySetDDRSSC ( int step );
+ int FactoryGetDDRSSC();
+ int FactorySetLVDSSSC ( int step );
+ int FactoryGetLVDSSSC();
+ int SetLVDSSSC(int step);
+ int FactorySetNolineParams ( int type, int source_type, noline_params_t noline_params );
+ noline_params_t FactoryGetNolineParams ( int type, int source_type );
+ int FactorySetOverscan ( int source_type, int fmt, int status_3d, int trans_fmt, tvin_cutwin_t cutwin_t );
+ tvin_cutwin_t FactoryGetOverscan ( int source_type, int fmt, is_3d_type_t is3d, int trans_fmt );
+ int FactorySetBacklightPWM_Frequency(int freq);
+ int FactoryGetBacklightPWM_Frequency ( void );
+ int FactorySetBacklight_Switch_status ( int status );
+ int FactoryGetBacklight_Switch_status ( void );
+ int FactorySetBacklightPWM_Duty ( int duty );
+ int FactoryGetBacklightPWM_Duty ( void );
+ int FactorySetLVDS_ColorDepth ( int depth );
+ int FactoryGetLVDS_ColorDepth ( void );
+ int FactorySetLVDS_ColorDither_status ( int status );
+ int FactoryGetLVDS_ColorDither_status ( void );
+ int FactorySetLVDS_Mapping_status ( int status );
+ int FactoryGetLVDS_Mapping_status ( void );
+ int FactorySetLVDS_PortSwap_status ( int status );
+ int FactoryGetLVDS_PortSwap_status ( void );
int VPPSSMRestoreDefault();
int VPPSSMFacRestoreDefault();
- int Tv_GetHistogram_AVE();
- int Tv_SetDnlp_OFF();
- int Tv_SetDnlp_ON ( void );
- int Tv_GetDnlp_Status();
+ int GetHistogram_AVE();
+ int SetDnlp_OFF();
+ int SetDnlp_ON ( void );
+ int GetDnlp_Status();
int GetColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params );
int ReadColorTemperatureParams ( vpp_color_temperature_mode_t Tempmode, tcon_rgb_ogo_t *params );
@@ -361,8 +369,8 @@ public:
int Vpp_LoadGammaDefault ( tv_source_input_type_t, tvin_sig_fmt_t );
int Vpp_LoadGammaSpecial ( int );
int Vpp_LoadGamma ( tv_source_input_type_t, tvin_sig_fmt_t );
- int Tv_FactoryResetNonlinear();
- tvin_cutwin_t Tv_GetOverscan ( tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
+ int FactoryResetNonlinear();
+ tvin_cutwin_t GetOverscan ( tv_source_input_type_t source_type, tvin_sig_fmt_t fmt, is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
static is_3d_type_t Check2Dor3D ( is_3d_type_t is3d, tvin_trans_fmt_t trans_fmt );
//api
int VPP_SetVEBlackExtension ( const struct ve_bext_s *pBExt );
@@ -370,6 +378,10 @@ public:
int VPP_SetNonLinearFactor ( int value );
int VPP_SetGrayPattern(int value);
int VPP_GetGrayPattern();
+ int VPP_SplitScreenEffect(int width, int v_register);
+ int VPP_SetBackLight_Switch ( int value );
+ int VPP_GetBackLight_Switch ( void );
+ int VPP_SetScalerPathSel (const unsigned int value);
private:
//
int VPP_OpenModule ( void );
@@ -412,6 +424,8 @@ private:
int VPP_SetVideoHue ( int );
int VPP_SetDeinterlaceMode ( int );
+ int isPreviewWindow();
+
tv_source_input_type_t vpp_setting_last_source_type;
tvin_sig_fmt_t vpp_setting_last_sig_fmt;
diff --git a/tvapi/tvtests/Android.mk b/tvapi/tvtests/Android.mk
index b9e0039..c1a791d 100644
--- a/tvapi/tvtests/Android.mk
+++ b/tvapi/tvtests/Android.mk
@@ -1,49 +1,49 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- android_tvtest.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libutils \
- libbinder \
- libtvbinder \
- libnativehelper \
- libandroid_runtime \
- liblog
-
-LOCAL_C_INCLUDES += \
- bionic/libc/include \
- $(LOCAL_PATH)/../ \
- $(LOCAL_PATH)/../android
-
-LOCAL_MODULE:= tvtest
-
-include $(BUILD_EXECUTABLE)
-
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- comm_test.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libutils \
- libbinder \
- libtvbinder \
- libnativehelper \
- libandroid_runtime \
- liblog \
- libtv
-
-LOCAL_C_INCLUDES += \
- bionic/libc/include \
- $(LOCAL_PATH)/../ \
- $(LOCAL_PATH)/../libtv\
- $(LOCAL_PATH)/../android
-
-LOCAL_MODULE:= comm_test
-
-include $(BUILD_EXECUTABLE)
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+ android_tvtest.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libutils \
+ libbinder \
+ libtvbinder \
+ libnativehelper \
+ libandroid_runtime \
+ liblog
+
+LOCAL_C_INCLUDES += \
+ bionic/libc/include \
+ $(LOCAL_PATH)/../ \
+ $(LOCAL_PATH)/../android
+
+LOCAL_MODULE:= tvtest
+
+include $(BUILD_EXECUTABLE)
+
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+ comm_test.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libutils \
+ libbinder \
+ libtvbinder \
+ libnativehelper \
+ libandroid_runtime \
+ liblog \
+ libtv
+
+LOCAL_C_INCLUDES += \
+ bionic/libc/include \
+ $(LOCAL_PATH)/../ \
+ $(LOCAL_PATH)/../libtv\
+ $(LOCAL_PATH)/../android
+
+LOCAL_MODULE:= comm_test
+
+include $(BUILD_EXECUTABLE)
diff --git a/tvapi/tvtests/android_tvtest.cpp b/tvapi/tvtests/android_tvtest.cpp
index 2a25185..26253b6 100644
--- a/tvapi/tvtests/android_tvtest.cpp
+++ b/tvapi/tvtests/android_tvtest.cpp
@@ -17,7 +17,7 @@ void usage(char *processname)
int main(int argc, char **argv)
{
- if(argc < 2)
+ if (argc < 2)
usage(argv[0]);
sp<Tv> tv = Tv::connect();
int cmd = atoi(argv[1]);
diff --git a/tvapi/tvtests/comm_test.cpp b/tvapi/tvtests/comm_test.cpp
index 79782ff..27d21b3 100644
--- a/tvapi/tvtests/comm_test.cpp
+++ b/tvapi/tvtests/comm_test.cpp
@@ -17,9 +17,9 @@ int main(int argc, char **argv)
fbc.run();
LOGD("------------------2----------------------");
- while(go) {
+ while (go) {
scanf("%d", &cmd);
- switch(cmd) {
+ switch (cmd) {
case 1:
go = 0;
fbc.closeAll();
diff --git a/tvapi/tvtests/ssm_test.cpp b/tvapi/tvtests/ssm_test.cpp
index 44b0aea..1ac0e8f 100644
--- a/tvapi/tvtests/ssm_test.cpp
+++ b/tvapi/tvtests/ssm_test.cpp
@@ -1,210 +1,210 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <android/log.h>
-
-#include "ssm_api.h"
-
-#define LOG_TAG "ssm_test"
-#include "CTvLog.h"
-
-// The follow is R/W test struct declare.
-// The size of it is 11 when it aligned with 1 Byte
-// and is 16 when it aligned with 4 Bytes.
-// You should use the 1 Byte aligned mode when R/W ssm by using struct.
-
-#if 1 // memory aligned with 1 Bytes
-typedef struct tagS_TEST_STRUCT {
- char tmp_ch0;
- char tmp_ch1;
- int tmp_val0;
- unsigned char tmp_ch2;
- unsigned char tmp_ch3;
- unsigned char tmp_ch4;
- short tmp_short0;
-} __attribute__((packed)) S_TEST_STRUCT;
-#else // memory aligned with 4 Bytes
-typedef struct tagS_TEST_STRUCT {
- char tmp_ch0;
- char tmp_ch1;
- int tmp_val0;
- unsigned char tmp_ch2;
- unsigned char tmp_ch3;
- unsigned char tmp_ch4;
- short tmp_short0;
-} S_TEST_STRUCT;
-#endif
-
-static void TestRWOneByte(int tmp_rw_offset, int tmp_w_val, unsigned char tmp_w_ch);
-static void TestRWNBytes(int tmp_rw_offset);
-static void TestRWOneStruct(int tmp_rw_offset);
-
-int main()
-{
- TestRWOneByte(0, 1, -1);
- TestRWOneByte(1, 2, -2);
- TestRWOneByte(30, 3, -3);
- TestRWOneByte(31, -1, 1);
- TestRWOneByte(32, -2, 2);
- TestRWOneByte(33, -3, 3);
-
- TestRWNBytes(31);
-
- TestRWOneStruct(0);
-}
-
-static void TestRWOneByte(int tmp_rw_offset, int tmp_w_val, unsigned char tmp_w_ch)
-{
- int tmp_r_val = 0;
- unsigned char tmp_r_ch = 0;
-
- LOGD("\n\n");
- LOGD("**************Test R/W One Byte **************\n\n");
-
- LOGD("tmp_rw_offset = %d.\n", tmp_rw_offset);
-
- SSMWriteOneByte(tmp_rw_offset, tmp_w_ch);
- SSMReadOneByte(tmp_rw_offset, &tmp_r_ch);
- LOGD("tmp_w_ch = %d, tmp_r_ch = %d.\n", tmp_w_ch, tmp_r_ch);
-
- SSMWriteOneByte(tmp_rw_offset, tmp_w_val);
- SSMReadOneByte(tmp_rw_offset, &tmp_r_val);
- LOGD("tmp_w_val = %d, tmp_r_val = %d.\n", tmp_w_val, tmp_r_val);
-}
-
-static void TestRWNBytes(int tmp_rw_offset)
-{
- int i = 0, tmp_op_buf_size = 0;
- int device_size = 0, tmp_w_page_size = 0, tmp_r_page_size = 0;
- int *tmp_op_int_w_buf = NULL, *tmp_op_int_r_buf = NULL;
- unsigned char *tmp_op_char_w_buf = NULL, *tmp_op_char_r_buf = NULL;
-
- LOGD("\n\n");
- LOGD("**************Test R/W N Bytes **************\n\n");
-
- SSMGetDeviceTotalSize(&device_size);
- SSMGetDeviceWritePageSize(&tmp_w_page_size);
- SSMGetDeviceReadPageSize(&tmp_r_page_size);
-
- if (tmp_w_page_size < tmp_r_page_size) {
- tmp_op_buf_size = tmp_w_page_size * 2 / 3;
- } else if (tmp_r_page_size < tmp_w_page_size) {
- tmp_op_buf_size = tmp_r_page_size * 2 / 3;
- } else {
- tmp_op_buf_size = tmp_w_page_size;
- }
-
- if (tmp_op_buf_size > device_size) {
- tmp_op_buf_size = device_size;
- }
-
- if (tmp_op_buf_size > 0) {
- LOGD("tmp_rw_offset = %d.\n", tmp_rw_offset);
-
- tmp_op_char_w_buf = new unsigned char[tmp_op_buf_size];
- if (tmp_op_char_w_buf != NULL) {
- tmp_op_char_r_buf = new unsigned char[tmp_op_buf_size];
- if (tmp_op_char_r_buf != NULL) {
- for (i = 0; i < tmp_op_buf_size; i++) {
- tmp_op_char_w_buf[i] = (tmp_op_buf_size / 2) - i;
- LOGD("tmp_op_char_w_buf[%d] = %d\n", i, tmp_op_char_w_buf[i]);
- }
- SSMWriteNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_char_w_buf);
-
- for (i = 0; i < tmp_op_buf_size; i++) {
- tmp_op_char_r_buf[i] = 0;
- }
- SSMReadNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_char_r_buf);
-
- for (i = 0; i < tmp_op_buf_size; i++) {
- LOGD("tmp_op_char_r_buf[%d] = %d\n", i, tmp_op_char_r_buf[i]);
- }
-
- delete tmp_op_char_r_buf;
- tmp_op_char_r_buf = NULL;
- }
-
- delete tmp_op_char_w_buf;
- tmp_op_char_w_buf = NULL;
- }
-
- tmp_op_int_w_buf = new int[tmp_op_buf_size];
- if (tmp_op_int_w_buf != NULL) {
- tmp_op_int_r_buf = new int[tmp_op_buf_size];
- if (tmp_op_int_r_buf != NULL) {
- for (i = 0; i < tmp_op_buf_size; i++) {
- tmp_op_int_w_buf[i] = (tmp_op_buf_size / 2) - i;
- LOGD("tmp_op_int_w_buf[%d] = %d\n", i, tmp_op_int_w_buf[i]);
- }
- SSMWriteNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_int_w_buf);
-
- for (i = 0; i < tmp_op_buf_size; i++) {
- tmp_op_int_r_buf[i] = 0;
- }
- SSMReadNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_int_r_buf);
-
- for (i = 0; i < tmp_op_buf_size; i++) {
- LOGD("tmp_op_int_r_buf[%d] = %d\n", i, tmp_op_int_r_buf[i]);
- }
-
- delete tmp_op_int_r_buf;
- tmp_op_int_r_buf = NULL;
- }
-
- delete tmp_op_int_w_buf;
- tmp_op_int_w_buf = NULL;
- }
- }
-}
-
-static void TestRWOneStruct(int tmp_rw_offset)
-{
- S_TEST_STRUCT TestWriteStruct, TestReadStruct;
-
- LOGD("\n\n");
- LOGD("**************Test R/W One Struct **************\n\n");
-
- LOGD("tmp_rw_offset = %d.\n", tmp_rw_offset);
-
- TestWriteStruct.tmp_ch0 = -9;
- TestWriteStruct.tmp_ch1 = -8;
- TestWriteStruct.tmp_val0 = 9;
- TestWriteStruct.tmp_ch2 = 255;
- TestWriteStruct.tmp_ch3 = 254;
- TestWriteStruct.tmp_ch4 = 250;
- TestWriteStruct.tmp_short0 = -9;
-
- SSMWriteNTypes(tmp_rw_offset, sizeof(S_TEST_STRUCT), (unsigned char *) &TestWriteStruct);
-
- LOGD("\n\n");
- LOGD("write struct length = %d.\n", sizeof(S_TEST_STRUCT));
- LOGD("TestWriteStruct.tmp_ch0 = %d.\n", TestWriteStruct.tmp_ch0);
- LOGD("TestWriteStruct.tmp_ch1 = %d.\n", TestWriteStruct.tmp_ch1);
- LOGD("TestWriteStruct.tmp_val0 = %d.\n", TestWriteStruct.tmp_val0);
- LOGD("TestWriteStruct.tmp_ch2 = %d.\n", TestWriteStruct.tmp_ch2);
- LOGD("TestWriteStruct.tmp_ch3 = %d.\n", TestWriteStruct.tmp_ch3);
- LOGD("TestWriteStruct.tmp_ch4 = %d.\n", TestWriteStruct.tmp_ch4);
- LOGD("TestWriteStruct.tmp_short0 = %d.\n", TestWriteStruct.tmp_short0);
-
- TestReadStruct.tmp_ch0 = 0;
- TestReadStruct.tmp_ch1 = 0;
- TestReadStruct.tmp_val0 = 0;
- TestReadStruct.tmp_ch2 = 0;
- TestReadStruct.tmp_ch3 = 0;
- TestWriteStruct.tmp_ch4 = 0;
- TestWriteStruct.tmp_short0 = 0;
-
- SSMReadNTypes(tmp_rw_offset, sizeof(S_TEST_STRUCT), (unsigned char *) &TestReadStruct);
-
- LOGD("\n\n");
- LOGD("read struct length = %d.\n", sizeof(S_TEST_STRUCT));
- LOGD("TestReadStruct.tmp_ch0 = %d.\n", TestReadStruct.tmp_ch0);
- LOGD("TestReadStruct.tmp_ch1 = %d.\n", TestReadStruct.tmp_ch1);
- LOGD("TestReadStruct.tmp_val0 = %d.\n", TestReadStruct.tmp_val0);
- LOGD("TestReadStruct.tmp_ch2 = %d.\n", TestReadStruct.tmp_ch2);
- LOGD("TestReadStruct.tmp_ch3 = %d.\n", TestReadStruct.tmp_ch3);
- LOGD("TestReadStruct.tmp_ch4 = %d.\n", TestReadStruct.tmp_ch4);
- LOGD("TestReadStruct.tmp_short0 = %d.\n", TestReadStruct.tmp_short0);
-}
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <android/log.h>
+
+#include "ssm_api.h"
+
+#define LOG_TAG "ssm_test"
+#include "CTvLog.h"
+
+// The follow is R/W test struct declare.
+// The size of it is 11 when it aligned with 1 Byte
+// and is 16 when it aligned with 4 Bytes.
+// You should use the 1 Byte aligned mode when R/W ssm by using struct.
+
+#if 1 // memory aligned with 1 Bytes
+typedef struct tagS_TEST_STRUCT {
+ char tmp_ch0;
+ char tmp_ch1;
+ int tmp_val0;
+ unsigned char tmp_ch2;
+ unsigned char tmp_ch3;
+ unsigned char tmp_ch4;
+ short tmp_short0;
+} __attribute__((packed)) S_TEST_STRUCT;
+#else // memory aligned with 4 Bytes
+typedef struct tagS_TEST_STRUCT {
+ char tmp_ch0;
+ char tmp_ch1;
+ int tmp_val0;
+ unsigned char tmp_ch2;
+ unsigned char tmp_ch3;
+ unsigned char tmp_ch4;
+ short tmp_short0;
+} S_TEST_STRUCT;
+#endif
+
+static void TestRWOneByte(int tmp_rw_offset, int tmp_w_val, unsigned char tmp_w_ch);
+static void TestRWNBytes(int tmp_rw_offset);
+static void TestRWOneStruct(int tmp_rw_offset);
+
+int main()
+{
+ TestRWOneByte(0, 1, -1);
+ TestRWOneByte(1, 2, -2);
+ TestRWOneByte(30, 3, -3);
+ TestRWOneByte(31, -1, 1);
+ TestRWOneByte(32, -2, 2);
+ TestRWOneByte(33, -3, 3);
+
+ TestRWNBytes(31);
+
+ TestRWOneStruct(0);
+}
+
+static void TestRWOneByte(int tmp_rw_offset, int tmp_w_val, unsigned char tmp_w_ch)
+{
+ int tmp_r_val = 0;
+ unsigned char tmp_r_ch = 0;
+
+ LOGD("\n\n");
+ LOGD("**************Test R/W One Byte **************\n\n");
+
+ LOGD("tmp_rw_offset = %d.\n", tmp_rw_offset);
+
+ SSMWriteOneByte(tmp_rw_offset, tmp_w_ch);
+ SSMReadOneByte(tmp_rw_offset, &tmp_r_ch);
+ LOGD("tmp_w_ch = %d, tmp_r_ch = %d.\n", tmp_w_ch, tmp_r_ch);
+
+ SSMWriteOneByte(tmp_rw_offset, tmp_w_val);
+ SSMReadOneByte(tmp_rw_offset, &tmp_r_val);
+ LOGD("tmp_w_val = %d, tmp_r_val = %d.\n", tmp_w_val, tmp_r_val);
+}
+
+static void TestRWNBytes(int tmp_rw_offset)
+{
+ int i = 0, tmp_op_buf_size = 0;
+ int device_size = 0, tmp_w_page_size = 0, tmp_r_page_size = 0;
+ int *tmp_op_int_w_buf = NULL, *tmp_op_int_r_buf = NULL;
+ unsigned char *tmp_op_char_w_buf = NULL, *tmp_op_char_r_buf = NULL;
+
+ LOGD("\n\n");
+ LOGD("**************Test R/W N Bytes **************\n\n");
+
+ SSMGetDeviceTotalSize(&device_size);
+ SSMGetDeviceWritePageSize(&tmp_w_page_size);
+ SSMGetDeviceReadPageSize(&tmp_r_page_size);
+
+ if (tmp_w_page_size < tmp_r_page_size) {
+ tmp_op_buf_size = tmp_w_page_size * 2 / 3;
+ } else if (tmp_r_page_size < tmp_w_page_size) {
+ tmp_op_buf_size = tmp_r_page_size * 2 / 3;
+ } else {
+ tmp_op_buf_size = tmp_w_page_size;
+ }
+
+ if (tmp_op_buf_size > device_size) {
+ tmp_op_buf_size = device_size;
+ }
+
+ if (tmp_op_buf_size > 0) {
+ LOGD("tmp_rw_offset = %d.\n", tmp_rw_offset);
+
+ tmp_op_char_w_buf = new unsigned char[tmp_op_buf_size];
+ if (tmp_op_char_w_buf != NULL) {
+ tmp_op_char_r_buf = new unsigned char[tmp_op_buf_size];
+ if (tmp_op_char_r_buf != NULL) {
+ for (i = 0; i < tmp_op_buf_size; i++) {
+ tmp_op_char_w_buf[i] = (tmp_op_buf_size / 2) - i;
+ LOGD("tmp_op_char_w_buf[%d] = %d\n", i, tmp_op_char_w_buf[i]);
+ }
+ SSMWriteNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_char_w_buf);
+
+ for (i = 0; i < tmp_op_buf_size; i++) {
+ tmp_op_char_r_buf[i] = 0;
+ }
+ SSMReadNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_char_r_buf);
+
+ for (i = 0; i < tmp_op_buf_size; i++) {
+ LOGD("tmp_op_char_r_buf[%d] = %d\n", i, tmp_op_char_r_buf[i]);
+ }
+
+ delete tmp_op_char_r_buf;
+ tmp_op_char_r_buf = NULL;
+ }
+
+ delete tmp_op_char_w_buf;
+ tmp_op_char_w_buf = NULL;
+ }
+
+ tmp_op_int_w_buf = new int[tmp_op_buf_size];
+ if (tmp_op_int_w_buf != NULL) {
+ tmp_op_int_r_buf = new int[tmp_op_buf_size];
+ if (tmp_op_int_r_buf != NULL) {
+ for (i = 0; i < tmp_op_buf_size; i++) {
+ tmp_op_int_w_buf[i] = (tmp_op_buf_size / 2) - i;
+ LOGD("tmp_op_int_w_buf[%d] = %d\n", i, tmp_op_int_w_buf[i]);
+ }
+ SSMWriteNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_int_w_buf);
+
+ for (i = 0; i < tmp_op_buf_size; i++) {
+ tmp_op_int_r_buf[i] = 0;
+ }
+ SSMReadNTypes(tmp_rw_offset, tmp_op_buf_size, tmp_op_int_r_buf);
+
+ for (i = 0; i < tmp_op_buf_size; i++) {
+ LOGD("tmp_op_int_r_buf[%d] = %d\n", i, tmp_op_int_r_buf[i]);
+ }
+
+ delete tmp_op_int_r_buf;
+ tmp_op_int_r_buf = NULL;
+ }
+
+ delete tmp_op_int_w_buf;
+ tmp_op_int_w_buf = NULL;
+ }
+ }
+}
+
+static void TestRWOneStruct(int tmp_rw_offset)
+{
+ S_TEST_STRUCT TestWriteStruct, TestReadStruct;
+
+ LOGD("\n\n");
+ LOGD("**************Test R/W One Struct **************\n\n");
+
+ LOGD("tmp_rw_offset = %d.\n", tmp_rw_offset);
+
+ TestWriteStruct.tmp_ch0 = -9;
+ TestWriteStruct.tmp_ch1 = -8;
+ TestWriteStruct.tmp_val0 = 9;
+ TestWriteStruct.tmp_ch2 = 255;
+ TestWriteStruct.tmp_ch3 = 254;
+ TestWriteStruct.tmp_ch4 = 250;
+ TestWriteStruct.tmp_short0 = -9;
+
+ SSMWriteNTypes(tmp_rw_offset, sizeof(S_TEST_STRUCT), (unsigned char *) &TestWriteStruct);
+
+ LOGD("\n\n");
+ LOGD("write struct length = %d.\n", sizeof(S_TEST_STRUCT));
+ LOGD("TestWriteStruct.tmp_ch0 = %d.\n", TestWriteStruct.tmp_ch0);
+ LOGD("TestWriteStruct.tmp_ch1 = %d.\n", TestWriteStruct.tmp_ch1);
+ LOGD("TestWriteStruct.tmp_val0 = %d.\n", TestWriteStruct.tmp_val0);
+ LOGD("TestWriteStruct.tmp_ch2 = %d.\n", TestWriteStruct.tmp_ch2);
+ LOGD("TestWriteStruct.tmp_ch3 = %d.\n", TestWriteStruct.tmp_ch3);
+ LOGD("TestWriteStruct.tmp_ch4 = %d.\n", TestWriteStruct.tmp_ch4);
+ LOGD("TestWriteStruct.tmp_short0 = %d.\n", TestWriteStruct.tmp_short0);
+
+ TestReadStruct.tmp_ch0 = 0;
+ TestReadStruct.tmp_ch1 = 0;
+ TestReadStruct.tmp_val0 = 0;
+ TestReadStruct.tmp_ch2 = 0;
+ TestReadStruct.tmp_ch3 = 0;
+ TestWriteStruct.tmp_ch4 = 0;
+ TestWriteStruct.tmp_short0 = 0;
+
+ SSMReadNTypes(tmp_rw_offset, sizeof(S_TEST_STRUCT), (unsigned char *) &TestReadStruct);
+
+ LOGD("\n\n");
+ LOGD("read struct length = %d.\n", sizeof(S_TEST_STRUCT));
+ LOGD("TestReadStruct.tmp_ch0 = %d.\n", TestReadStruct.tmp_ch0);
+ LOGD("TestReadStruct.tmp_ch1 = %d.\n", TestReadStruct.tmp_ch1);
+ LOGD("TestReadStruct.tmp_val0 = %d.\n", TestReadStruct.tmp_val0);
+ LOGD("TestReadStruct.tmp_ch2 = %d.\n", TestReadStruct.tmp_ch2);
+ LOGD("TestReadStruct.tmp_ch3 = %d.\n", TestReadStruct.tmp_ch3);
+ LOGD("TestReadStruct.tmp_ch4 = %d.\n", TestReadStruct.tmp_ch4);
+ LOGD("TestReadStruct.tmp_short0 = %d.\n", TestReadStruct.tmp_short0);
+}
diff --git a/tvapi/tvtests/tvconfig_test.cpp b/tvapi/tvtests/tvconfig_test.cpp
index 09a2b27..5bfe97f 100644
--- a/tvapi/tvtests/tvconfig_test.cpp
+++ b/tvapi/tvtests/tvconfig_test.cpp
@@ -1,427 +1,427 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <android/log.h>
-
-#include "tvconfig_core.h"
-#include "tvconfig.h"
-
-#define LOG_TAG "tvconfig_test"
-#include "CTvLog.h"
-
-static int GetAudioAmplifierBiquadsDataBuffer00(int *biquad_count, int *biquad_item_count, int biquad_data_buf[]);
-static int GetAudioAmplifierBiquadsDataBuffer01(int *biquad_count, int *biquad_item_count, int biquad_data_buf[]);
-
-static int GetTvAudioCardID(char tv_card_id_buf[]);
-static int GetTvAudioCardName(char tv_card_name_buf[]);
-
-static int ATVGetFacRestoreChanInfo(int *chan_cnt, int *item_cnt, int chan_data_buf[]);
-
-static void PrintGPIOCfgData(int cfg_info_item_count, GPIOCFGInfo cfg_info_buf[]);
-static int GetAudioAnalogAmplifierMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val);
-static int GetAudioHeadSetMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val);
-static int GetAudioAVOutMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val);
-static int GetWriteProtectGPIOCFG(char gpio_grp_str[], int *protect_gpio_addr, int *protect_on_val, int *protect_off_val);
-
-typedef struct tagTvServerInfo {
- int power_on_off_channel;
- int last_source_select;
- int system_language;
-} TvServerInfo;
-
-int main(int argc, char **argv)
-{
- int i, j;
- char key_buf[CC_CFG_KEY_STR_MAX_LEN];
- char cfg_buf[CC_CFG_VALUE_STR_MAX_LEN];
-
- config_set_log_level (CC_LOG_LEVEL_ALL);
-
- config_init((char *) "tvconfig.conf");
-
- strcpy(key_buf, "media.amplayer.enable-acodecs");
- config_get(key_buf, cfg_buf, (char *) "");
- LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
-
- strcpy(key_buf, "media.amplayer.enable-acodecs");
- strcpy(cfg_buf, "shorthoho");
- config_set(key_buf, cfg_buf);
-
- strcpy(key_buf, "media.amplayer.enable-acodecs");
- config_get(key_buf, cfg_buf, (char *) "");
- LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
-
- strcpy(key_buf, "media.amplayer.enable-acodecs");
- config_get(key_buf, cfg_buf, (char *) "");
- LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
-
- strcpy(key_buf, "media.amplayer.enable-acodecs");
- strcpy(cfg_buf, "asf,wav,aac,mp3,m4a,ape,flac,alac,hohoho");
- config_set(key_buf, cfg_buf);
-
- strcpy(key_buf, "media.amplayer.enable-acodecs");
- config_get(key_buf, cfg_buf, (char *) "");
- LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
-
- strcpy(key_buf, "shoufu.zhao.test");
- config_get(key_buf, cfg_buf, (char *) "");
- LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
-
- strcpy(key_buf, "shoufu.zhao.test");
- strcpy(cfg_buf, "test hohoho");
- config_set(key_buf, cfg_buf);
-
- strcpy(key_buf, "shoufu.zhao.test");
- config_get(key_buf, cfg_buf, (char *) "");
- LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
-
- int biquad_count = 0, biquad_item_count = 0;
- int biquad_data_buf00[128] = { 0 };
- int biquad_data_buf01[128] = { 0 };
-
- GetAudioAmplifierBiquadsDataBuffer00(&biquad_count, &biquad_item_count, biquad_data_buf00);
- for (i = 0; i < biquad_count; i++) {
- for (j = 0; j < biquad_item_count; j++) {
- LOGD("0x%x\n", biquad_data_buf00[i * biquad_item_count + j]);
- }
-
- LOGD("\n");
- }
-
- GetAudioAmplifierBiquadsDataBuffer01(&biquad_count, &biquad_item_count, biquad_data_buf01);
- for (i = 0; i < biquad_count; i++) {
- for (j = 0; j < biquad_item_count; j++) {
- LOGD("0x%x\n", biquad_data_buf01[i * biquad_item_count + j]);
- }
-
- LOGD("\n");
- }
-
- char tv_card_id_buf[64] = { 0 };
- char tv_card_name_buf[64] = { 0 };
-
- GetTvAudioCardID(tv_card_id_buf);
-
- GetTvAudioCardName(tv_card_name_buf);
-
- printf("tvservice log cfg value = %d\n", config_log_cfg_get(CC_LOG_MODULE_TVSERVICE));
- printf("vpp log cfg value = %d\n", config_log_cfg_get(CC_LOG_MODULE_VPP));
-
- int chan_cnt = 0, item_cnt = 0;
- int chan_data_buf[256] = { 0 };
-
- ATVGetFacRestoreChanInfo(&chan_cnt, &item_cnt, chan_data_buf);
-
- for (i = 0; i < chan_cnt; i++) {
- for (j = 0; j < item_cnt; j++) {
- LOGD("%d\n", chan_data_buf[i * item_cnt + j]);
- }
-
- LOGD("\n");
- }
-
- char gpio_grp_str[32] = { 0 };
- int gpio_addr, gpio_on_val;
-
- int cfg_info_item_count = 0;
- GPIOCFGInfo cfg_info_buf[64];
-
- if (cfg_get_one_gpio_data("audio.avout.mute.gpio", gpio_grp_str, &gpio_addr, &gpio_on_val) == 0) {
- cfg_info_item_count = 1;
-
- strcpy(cfg_info_buf[0].gpio_grp_str, gpio_grp_str);
- cfg_info_buf[0].gpio_addr = gpio_addr;
- cfg_info_buf[0].gpio_val = gpio_on_val;
-
- PrintGPIOCfgData(cfg_info_item_count, &cfg_info_buf[0]);
- }
-
- if (cfg_get_gpio_data("audio.avout.mute.gpio", &cfg_info_item_count, cfg_info_buf) == 0) {
- PrintGPIOCfgData(cfg_info_item_count, cfg_info_buf);
- }
-
- cfg_info_item_count = 64;
- if (cfg_get_gpio_data("audio.initaudio.gpioctl", &cfg_info_item_count, cfg_info_buf) == 0) {
- PrintGPIOCfgData(cfg_info_item_count, cfg_info_buf);
- }
-
- char tmp_buf[32] = { 0 };
- int mute_gpio_addr, mute_on_gpio_val, mute_off_gpio_val;
-
- if (GetAudioAnalogAmplifierMuteGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) {
- sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val);
- LOGD("%s, mute on write command %s\n", "GetAudioAnalogAmplifierMuteGPIOCFG", tmp_buf);
-
- sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val);
- LOGD("%s, mute off write command %s\n", "GetAudioAnalogAmplifierMuteGPIOCFG", tmp_buf);
- }
-
- if (GetAudioHeadSetMuteGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) {
- sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val);
- LOGD("%s, mute on write command %s\n", "GetAudioHeadSetMuteGPIOCFG", tmp_buf);
-
- sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val);
- LOGD("%s, mute off write command %s\n", "GetAudioHeadSetMuteGPIOCFG", tmp_buf);
- }
-
- if (GetAudioAVOutMuteGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) {
- sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val);
- LOGD("%s, mute on write command %s\n", "GetAudioAVOutMuteGPIOCFG", tmp_buf);
-
- sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val);
- LOGD("%s, mute off write command %s\n", "GetAudioAVOutMuteGPIOCFG", tmp_buf);
- }
-
- if (GetWriteProtectGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) {
- sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val);
- LOGD("%s, protect on write command %s\n", "GetWriteProtectGPIOCFG", tmp_buf);
-
- sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val);
- LOGD("%s, protect off write command %s\n", "GetWriteProtectGPIOCFG", tmp_buf);
- }
-
- tmpInfo.power_on_off_channel = 0;
- tmpInfo.last_source_select = 0;
- tmpInfo.system_language = 1;
-
- for (i = 0; i < 12; i++) {
- tmpInfo.last_source_select = i;
- }
-
- char item_buf[128] = { 0 };
-
- for (i = 0; i < 16; i++) {
- cfg_get_one_item("misc.lastselsrc.show.cfg", i, item_buf);
- LOGD("item %d = %s\n", i, item_buf);
- }
-
- config_uninit();
-
- LOGD("file(%s)'s function(%s) exiting.\n", __FILE__, "TV");
- return 0;
-}
-
-static int RealGetAudioAmplifierBiquadsDataBuffer(const char *key_str, int *biquad_count, int *biquad_item_count, int biquad_data_buf[])
-{
- int cfg_item_count = 0, tmpTotalItemCount = 0;
- char *token = NULL;
- const char *strDelimit = ",";
- char prop_value[CC_CFG_VALUE_STR_MAX_LEN];
-
- memset(prop_value, '\0', CC_CFG_VALUE_STR_MAX_LEN);
-
- config_get(key_str, prop_value, "null");
- if (strcasecmp(prop_value, "null") == 0) {
- LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
- *biquad_count = 0;
- *biquad_item_count = 0;
- return -1;
- }
-
- tmpTotalItemCount = 0;
-
- token = strtok(prop_value, strDelimit);
- while (token != NULL) {
- if (cfg_item_count == 0) {
- *biquad_count = strtoul(token, NULL, 16);
- } else if (cfg_item_count == 1) {
- *biquad_item_count = strtoul(token, NULL, 16);
- } else if (cfg_item_count >= 2) {
- biquad_data_buf[tmpTotalItemCount] = strtoul(token, NULL, 16);
- tmpTotalItemCount += 1;
- }
-
- token = strtok(NULL, strDelimit);
- cfg_item_count += 1;
- }
-
- if ((*biquad_count) * (*biquad_item_count) != tmpTotalItemCount) {
- LOGE("%s, get item count error!!! should be %d, real is %d.\n", "TV", (*biquad_count) * (*biquad_item_count), tmpTotalItemCount);
- *biquad_count = 0;
- *biquad_item_count = 0;
- return -1;
- }
-
- LOGD("%s, biquad count = %d, biquad item count = %d.\n", "TV", *biquad_count, *biquad_item_count);
-
- return 0;
-}
-
-static int GetAudioAmplifierBiquadsDataBuffer00(int *biquad_count, int *biquad_item_count, int biquad_data_buf[])
-{
- return RealGetAudioAmplifierBiquadsDataBuffer("audio.amplifier.biquad00.data", biquad_count, biquad_item_count, biquad_data_buf);
-}
-
-static int GetAudioAmplifierBiquadsDataBuffer01(int *biquad_count, int *biquad_item_count, int biquad_data_buf[])
-{
- return RealGetAudioAmplifierBiquadsDataBuffer("audio.amplifier.biquad01.data", biquad_count, biquad_item_count, biquad_data_buf);
-}
-
-static int GetTvAudioCardID(char tv_card_id_buf[])
-{
- config_get("audio.tv.card.id", tv_card_id_buf, "null");
- LOGD("%s, get card id is \"%s\".\n", "TV", tv_card_id_buf);
-
- if (strcmp(tv_card_id_buf, "null") == 0) {
- strcpy(tv_card_id_buf, "hw:AMLM2");
- LOGD("%s, card id not config, we set to default \"%s\".\n", "TV", "hw:AMLM2");
- }
-
- return 0;
-}
-
-static int GetTvAudioCardName(char tv_card_name_buf[])
-{
- config_get("audio.tv.card.name", tv_card_name_buf, "null");
- LOGD("%s, get card name is \"%s\".\n", "TV", tv_card_name_buf);
-
- if (strcmp(tv_card_name_buf, "null") == 0) {
- strcpy(tv_card_name_buf, "AML-M2");
- LOGD("%s, card name not config, we set to default \"%s\".\n", "TV", "AML-M2");
- }
-
- return 0;
-}
-
-static int ATVGetFacRestoreChanInfo(int *chan_cnt, int *item_cnt, int chan_data_buf[])
-{
- int cfg_item_count = 0, tmpTotalItemCount = 0;
- char *token = NULL;
- const char *strDelimit = ",";
- const char *key_str = "atv.fac.defchaninfo";
- char prop_value[CC_CFG_VALUE_STR_MAX_LEN];
-
- memset(prop_value, '\0', CC_CFG_VALUE_STR_MAX_LEN);
-
- config_get(key_str, prop_value, "null");
- if (strcasecmp(prop_value, "null") == 0) {
- LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
- *chan_cnt = 0;
- *item_cnt = 0;
- return -1;
- }
-
- tmpTotalItemCount = 0;
-
- token = strtok(prop_value, strDelimit);
- while (token != NULL) {
- if (cfg_item_count == 0) {
- *chan_cnt = strtoul(token, NULL, 10);
- } else if (cfg_item_count == 1) {
- *item_cnt = strtoul(token, NULL, 10);
- } else if (cfg_item_count >= 2) {
- chan_data_buf[tmpTotalItemCount] = strtoul(token, NULL, 10);
- tmpTotalItemCount += 1;
- }
-
- token = strtok(NULL, strDelimit);
- cfg_item_count += 1;
- }
-
- if ((*chan_cnt) * (*item_cnt) != tmpTotalItemCount) {
- LOGE("%s, get item count error!!! should be %d, real is %d.\n", "TV", (*chan_cnt) * (*item_cnt), tmpTotalItemCount);
- *chan_cnt = 0;
- *item_cnt = 0;
- return -1;
- }
-
- LOGD("%s, channel count = %d, channel item count = %d.\n", "TV", *chan_cnt, *item_cnt);
-
- return 0;
-}
-
-static void PrintGPIOCfgData(int cfg_info_item_count, GPIOCFGInfo cfg_info_buf[])
-{
- int i = 0;
-
- LOGD("%s, cfg_info_item_count = %d\n", "TV", cfg_info_item_count);
-
- for (i = 0; i < cfg_info_item_count; i++) {
- LOGD("%s, %s %d %d %d\n", "TV", cfg_info_buf[i].gpio_grp_str, cfg_info_buf[i].gpio_addr, cfg_info_buf[i].gpio_val, !cfg_info_buf[i].gpio_val);
- }
-
- LOGD("\n");
-}
-
-static int GetWriteProtectGPIOCFG(char gpio_grp_str[], int *protect_gpio_addr, int *protect_on_val, int *protect_off_val)
-{
- if (cfg_get_one_gpio_data("ssm.writeprotect.gpio", gpio_grp_str, protect_gpio_addr, protect_on_val) < 0) {
- return -1;
- }
-
- *protect_off_val = !(*protect_on_val);
-
- return 0;
-}
-
-#define CC_AMPLIFIER_ANALOG_MUTE_GPIO_CFG_NAME "audio.amp.analog.mute.gpio"
-#define CC_HEADSET_MUTE_GPIO_CFG_NAME "audio.headset.mute.gpio"
-#define CC_AVOUT_MUTE_GPIO_CFG_NAME "audio.avout.mute.gpio"
-
-static int GetAudioAnalogAmplifierMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val)
-{
- if (cfg_get_one_gpio_data(CC_AMPLIFIER_ANALOG_MUTE_GPIO_CFG_NAME, gpio_grp_str, mute_gpio_addr, mute_on_val) < 0) {
- return -1;
- }
-
- *mute_off_val = !(*mute_on_val);
-
- return 0;
-}
-
-static int GetAudioHeadSetMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val)
-{
- if (cfg_get_one_gpio_data(CC_HEADSET_MUTE_GPIO_CFG_NAME, gpio_grp_str, mute_gpio_addr, mute_on_val) < 0) {
- return -1;
- }
-
- *mute_off_val = !(*mute_on_val);
-
- return 0;
-}
-
-static int GetAudioAVOutMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val)
-{
- if (cfg_get_one_gpio_data(CC_AVOUT_MUTE_GPIO_CFG_NAME, gpio_grp_str, mute_gpio_addr, mute_on_val) < 0) {
- return -1;
- }
-
- //Some projects has been volume production. They may not use the newest code, so we do compatible for old config.
- //old config 69,0,1
- //new config x,69,0
-
- if (gpio_grp_str[0] != 'x' || gpio_grp_str[0] != 'b' || gpio_grp_str[0] != 'd') {
- *mute_gpio_addr = strtol(gpio_grp_str, NULL, 10);
- gpio_grp_str[0] = 'x';
- gpio_grp_str[1] = '\0';
- *mute_off_val = *mute_on_val;
- *mute_on_val = !(*mute_off_val);
- } else {
- *mute_off_val = !(*mute_on_val);
- }
-
- return 0;
-}
-
-#define PROPERTY_VALUE_MAX (92)
-
-typedef enum tvin_source_input_e {
- SOURCE_TV,
- SOURCE_AV1,
- SOURCE_AV2,
- SOURCE_YPBPR1,
- SOURCE_YPBPR2,
- SOURCE_HDMI1,
- SOURCE_HDMI2,
- SOURCE_HDMI3,
- SOURCE_VGA,
- SOURCE_MPEG,
- SOURCE_DTV,
- SOURCE_MAX,
-} tv_source_input_t;
-
-static int property_set(const char *key_value, char *prop_value)
-{
- LOGD("%s, %s = %s\n", "TV", key_value, prop_value);
- return 0;
-}
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <android/log.h>
+
+#include "tvconfig_core.h"
+#include "tvconfig.h"
+
+#define LOG_TAG "tvconfig_test"
+#include "CTvLog.h"
+
+static int GetAudioAmplifierBiquadsDataBuffer00(int *biquad_count, int *biquad_item_count, int biquad_data_buf[]);
+static int GetAudioAmplifierBiquadsDataBuffer01(int *biquad_count, int *biquad_item_count, int biquad_data_buf[]);
+
+static int GetTvAudioCardID(char tv_card_id_buf[]);
+static int GetTvAudioCardName(char tv_card_name_buf[]);
+
+static int ATVGetFacRestoreChanInfo(int *chan_cnt, int *item_cnt, int chan_data_buf[]);
+
+static void PrintGPIOCfgData(int cfg_info_item_count, GPIOCFGInfo cfg_info_buf[]);
+static int GetAudioAnalogAmplifierMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val);
+static int GetAudioHeadSetMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val);
+static int GetAudioAVOutMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val);
+static int GetWriteProtectGPIOCFG(char gpio_grp_str[], int *protect_gpio_addr, int *protect_on_val, int *protect_off_val);
+
+typedef struct tagTvServerInfo {
+ int power_on_off_channel;
+ int last_source_select;
+ int system_language;
+} TvServerInfo;
+
+int main(int argc, char **argv)
+{
+ int i, j;
+ char key_buf[CC_CFG_KEY_STR_MAX_LEN];
+ char cfg_buf[CC_CFG_VALUE_STR_MAX_LEN];
+
+ config_set_log_level (CC_LOG_LEVEL_ALL);
+
+ config_init((char *) "tvconfig.conf");
+
+ strcpy(key_buf, "media.amplayer.enable-acodecs");
+ config_get(key_buf, cfg_buf, (char *) "");
+ LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
+
+ strcpy(key_buf, "media.amplayer.enable-acodecs");
+ strcpy(cfg_buf, "shorthoho");
+ config_set(key_buf, cfg_buf);
+
+ strcpy(key_buf, "media.amplayer.enable-acodecs");
+ config_get(key_buf, cfg_buf, (char *) "");
+ LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
+
+ strcpy(key_buf, "media.amplayer.enable-acodecs");
+ config_get(key_buf, cfg_buf, (char *) "");
+ LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
+
+ strcpy(key_buf, "media.amplayer.enable-acodecs");
+ strcpy(cfg_buf, "asf,wav,aac,mp3,m4a,ape,flac,alac,hohoho");
+ config_set(key_buf, cfg_buf);
+
+ strcpy(key_buf, "media.amplayer.enable-acodecs");
+ config_get(key_buf, cfg_buf, (char *) "");
+ LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
+
+ strcpy(key_buf, "shoufu.zhao.test");
+ config_get(key_buf, cfg_buf, (char *) "");
+ LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
+
+ strcpy(key_buf, "shoufu.zhao.test");
+ strcpy(cfg_buf, "test hohoho");
+ config_set(key_buf, cfg_buf);
+
+ strcpy(key_buf, "shoufu.zhao.test");
+ config_get(key_buf, cfg_buf, (char *) "");
+ LOGD("file(%s)'s function(%s), key string \"%s\", value string \"%s\".\n", __FILE__, "TV", key_buf, cfg_buf);
+
+ int biquad_count = 0, biquad_item_count = 0;
+ int biquad_data_buf00[128] = { 0 };
+ int biquad_data_buf01[128] = { 0 };
+
+ GetAudioAmplifierBiquadsDataBuffer00(&biquad_count, &biquad_item_count, biquad_data_buf00);
+ for (i = 0; i < biquad_count; i++) {
+ for (j = 0; j < biquad_item_count; j++) {
+ LOGD("0x%x\n", biquad_data_buf00[i * biquad_item_count + j]);
+ }
+
+ LOGD("\n");
+ }
+
+ GetAudioAmplifierBiquadsDataBuffer01(&biquad_count, &biquad_item_count, biquad_data_buf01);
+ for (i = 0; i < biquad_count; i++) {
+ for (j = 0; j < biquad_item_count; j++) {
+ LOGD("0x%x\n", biquad_data_buf01[i * biquad_item_count + j]);
+ }
+
+ LOGD("\n");
+ }
+
+ char tv_card_id_buf[64] = { 0 };
+ char tv_card_name_buf[64] = { 0 };
+
+ GetTvAudioCardID(tv_card_id_buf);
+
+ GetTvAudioCardName(tv_card_name_buf);
+
+ printf("tvservice log cfg value = %d\n", config_log_cfg_get(CC_LOG_MODULE_TVSERVICE));
+ printf("vpp log cfg value = %d\n", config_log_cfg_get(CC_LOG_MODULE_VPP));
+
+ int chan_cnt = 0, item_cnt = 0;
+ int chan_data_buf[256] = { 0 };
+
+ ATVGetFacRestoreChanInfo(&chan_cnt, &item_cnt, chan_data_buf);
+
+ for (i = 0; i < chan_cnt; i++) {
+ for (j = 0; j < item_cnt; j++) {
+ LOGD("%d\n", chan_data_buf[i * item_cnt + j]);
+ }
+
+ LOGD("\n");
+ }
+
+ char gpio_grp_str[32] = { 0 };
+ int gpio_addr, gpio_on_val;
+
+ int cfg_info_item_count = 0;
+ GPIOCFGInfo cfg_info_buf[64];
+
+ if (cfg_get_one_gpio_data("audio.avout.mute.gpio", gpio_grp_str, &gpio_addr, &gpio_on_val) == 0) {
+ cfg_info_item_count = 1;
+
+ strcpy(cfg_info_buf[0].gpio_grp_str, gpio_grp_str);
+ cfg_info_buf[0].gpio_addr = gpio_addr;
+ cfg_info_buf[0].gpio_val = gpio_on_val;
+
+ PrintGPIOCfgData(cfg_info_item_count, &cfg_info_buf[0]);
+ }
+
+ if (cfg_get_gpio_data("audio.avout.mute.gpio", &cfg_info_item_count, cfg_info_buf) == 0) {
+ PrintGPIOCfgData(cfg_info_item_count, cfg_info_buf);
+ }
+
+ cfg_info_item_count = 64;
+ if (cfg_get_gpio_data("audio.initaudio.gpioctl", &cfg_info_item_count, cfg_info_buf) == 0) {
+ PrintGPIOCfgData(cfg_info_item_count, cfg_info_buf);
+ }
+
+ char tmp_buf[32] = { 0 };
+ int mute_gpio_addr, mute_on_gpio_val, mute_off_gpio_val;
+
+ if (GetAudioAnalogAmplifierMuteGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) {
+ sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val);
+ LOGD("%s, mute on write command %s\n", "GetAudioAnalogAmplifierMuteGPIOCFG", tmp_buf);
+
+ sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val);
+ LOGD("%s, mute off write command %s\n", "GetAudioAnalogAmplifierMuteGPIOCFG", tmp_buf);
+ }
+
+ if (GetAudioHeadSetMuteGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) {
+ sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val);
+ LOGD("%s, mute on write command %s\n", "GetAudioHeadSetMuteGPIOCFG", tmp_buf);
+
+ sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val);
+ LOGD("%s, mute off write command %s\n", "GetAudioHeadSetMuteGPIOCFG", tmp_buf);
+ }
+
+ if (GetAudioAVOutMuteGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) {
+ sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val);
+ LOGD("%s, mute on write command %s\n", "GetAudioAVOutMuteGPIOCFG", tmp_buf);
+
+ sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val);
+ LOGD("%s, mute off write command %s\n", "GetAudioAVOutMuteGPIOCFG", tmp_buf);
+ }
+
+ if (GetWriteProtectGPIOCFG(gpio_grp_str, &mute_gpio_addr, &mute_on_gpio_val, &mute_off_gpio_val) == 0) {
+ sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_on_gpio_val);
+ LOGD("%s, protect on write command %s\n", "GetWriteProtectGPIOCFG", tmp_buf);
+
+ sprintf(tmp_buf, "w %s %d %d", gpio_grp_str, mute_gpio_addr, mute_off_gpio_val);
+ LOGD("%s, protect off write command %s\n", "GetWriteProtectGPIOCFG", tmp_buf);
+ }
+
+ tmpInfo.power_on_off_channel = 0;
+ tmpInfo.last_source_select = 0;
+ tmpInfo.system_language = 1;
+
+ for (i = 0; i < 12; i++) {
+ tmpInfo.last_source_select = i;
+ }
+
+ char item_buf[128] = { 0 };
+
+ for (i = 0; i < 16; i++) {
+ cfg_get_one_item("misc.lastselsrc.show.cfg", i, item_buf);
+ LOGD("item %d = %s\n", i, item_buf);
+ }
+
+ config_uninit();
+
+ LOGD("file(%s)'s function(%s) exiting.\n", __FILE__, "TV");
+ return 0;
+}
+
+static int RealGetAudioAmplifierBiquadsDataBuffer(const char *key_str, int *biquad_count, int *biquad_item_count, int biquad_data_buf[])
+{
+ int cfg_item_count = 0, tmpTotalItemCount = 0;
+ char *token = NULL;
+ const char *strDelimit = ",";
+ char prop_value[CC_CFG_VALUE_STR_MAX_LEN];
+
+ memset(prop_value, '\0', CC_CFG_VALUE_STR_MAX_LEN);
+
+ config_get(key_str, prop_value, "null");
+ if (strcasecmp(prop_value, "null") == 0) {
+ LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
+ *biquad_count = 0;
+ *biquad_item_count = 0;
+ return -1;
+ }
+
+ tmpTotalItemCount = 0;
+
+ token = strtok(prop_value, strDelimit);
+ while (token != NULL) {
+ if (cfg_item_count == 0) {
+ *biquad_count = strtoul(token, NULL, 16);
+ } else if (cfg_item_count == 1) {
+ *biquad_item_count = strtoul(token, NULL, 16);
+ } else if (cfg_item_count >= 2) {
+ biquad_data_buf[tmpTotalItemCount] = strtoul(token, NULL, 16);
+ tmpTotalItemCount += 1;
+ }
+
+ token = strtok(NULL, strDelimit);
+ cfg_item_count += 1;
+ }
+
+ if ((*biquad_count) * (*biquad_item_count) != tmpTotalItemCount) {
+ LOGE("%s, get item count error!!! should be %d, real is %d.\n", "TV", (*biquad_count) * (*biquad_item_count), tmpTotalItemCount);
+ *biquad_count = 0;
+ *biquad_item_count = 0;
+ return -1;
+ }
+
+ LOGD("%s, biquad count = %d, biquad item count = %d.\n", "TV", *biquad_count, *biquad_item_count);
+
+ return 0;
+}
+
+static int GetAudioAmplifierBiquadsDataBuffer00(int *biquad_count, int *biquad_item_count, int biquad_data_buf[])
+{
+ return RealGetAudioAmplifierBiquadsDataBuffer("audio.amplifier.biquad00.data", biquad_count, biquad_item_count, biquad_data_buf);
+}
+
+static int GetAudioAmplifierBiquadsDataBuffer01(int *biquad_count, int *biquad_item_count, int biquad_data_buf[])
+{
+ return RealGetAudioAmplifierBiquadsDataBuffer("audio.amplifier.biquad01.data", biquad_count, biquad_item_count, biquad_data_buf);
+}
+
+static int GetTvAudioCardID(char tv_card_id_buf[])
+{
+ config_get("audio.tv.card.id", tv_card_id_buf, "null");
+ LOGD("%s, get card id is \"%s\".\n", "TV", tv_card_id_buf);
+
+ if (strcmp(tv_card_id_buf, "null") == 0) {
+ strcpy(tv_card_id_buf, "hw:AMLM2");
+ LOGD("%s, card id not config, we set to default \"%s\".\n", "TV", "hw:AMLM2");
+ }
+
+ return 0;
+}
+
+static int GetTvAudioCardName(char tv_card_name_buf[])
+{
+ config_get("audio.tv.card.name", tv_card_name_buf, "null");
+ LOGD("%s, get card name is \"%s\".\n", "TV", tv_card_name_buf);
+
+ if (strcmp(tv_card_name_buf, "null") == 0) {
+ strcpy(tv_card_name_buf, "AML-M2");
+ LOGD("%s, card name not config, we set to default \"%s\".\n", "TV", "AML-M2");
+ }
+
+ return 0;
+}
+
+static int ATVGetFacRestoreChanInfo(int *chan_cnt, int *item_cnt, int chan_data_buf[])
+{
+ int cfg_item_count = 0, tmpTotalItemCount = 0;
+ char *token = NULL;
+ const char *strDelimit = ",";
+ const char *key_str = "atv.fac.defchaninfo";
+ char prop_value[CC_CFG_VALUE_STR_MAX_LEN];
+
+ memset(prop_value, '\0', CC_CFG_VALUE_STR_MAX_LEN);
+
+ config_get(key_str, prop_value, "null");
+ if (strcasecmp(prop_value, "null") == 0) {
+ LOGE("%s, can't get config \"%s\"!!!\n", "TV", key_str);
+ *chan_cnt = 0;
+ *item_cnt = 0;
+ return -1;
+ }
+
+ tmpTotalItemCount = 0;
+
+ token = strtok(prop_value, strDelimit);
+ while (token != NULL) {
+ if (cfg_item_count == 0) {
+ *chan_cnt = strtoul(token, NULL, 10);
+ } else if (cfg_item_count == 1) {
+ *item_cnt = strtoul(token, NULL, 10);
+ } else if (cfg_item_count >= 2) {
+ chan_data_buf[tmpTotalItemCount] = strtoul(token, NULL, 10);
+ tmpTotalItemCount += 1;
+ }
+
+ token = strtok(NULL, strDelimit);
+ cfg_item_count += 1;
+ }
+
+ if ((*chan_cnt) * (*item_cnt) != tmpTotalItemCount) {
+ LOGE("%s, get item count error!!! should be %d, real is %d.\n", "TV", (*chan_cnt) * (*item_cnt), tmpTotalItemCount);
+ *chan_cnt = 0;
+ *item_cnt = 0;
+ return -1;
+ }
+
+ LOGD("%s, channel count = %d, channel item count = %d.\n", "TV", *chan_cnt, *item_cnt);
+
+ return 0;
+}
+
+static void PrintGPIOCfgData(int cfg_info_item_count, GPIOCFGInfo cfg_info_buf[])
+{
+ int i = 0;
+
+ LOGD("%s, cfg_info_item_count = %d\n", "TV", cfg_info_item_count);
+
+ for (i = 0; i < cfg_info_item_count; i++) {
+ LOGD("%s, %s %d %d %d\n", "TV", cfg_info_buf[i].gpio_grp_str, cfg_info_buf[i].gpio_addr, cfg_info_buf[i].gpio_val, !cfg_info_buf[i].gpio_val);
+ }
+
+ LOGD("\n");
+}
+
+static int GetWriteProtectGPIOCFG(char gpio_grp_str[], int *protect_gpio_addr, int *protect_on_val, int *protect_off_val)
+{
+ if (cfg_get_one_gpio_data("ssm.writeprotect.gpio", gpio_grp_str, protect_gpio_addr, protect_on_val) < 0) {
+ return -1;
+ }
+
+ *protect_off_val = !(*protect_on_val);
+
+ return 0;
+}
+
+#define CC_AMPLIFIER_ANALOG_MUTE_GPIO_CFG_NAME "audio.amp.analog.mute.gpio"
+#define CC_HEADSET_MUTE_GPIO_CFG_NAME "audio.headset.mute.gpio"
+#define CC_AVOUT_MUTE_GPIO_CFG_NAME "audio.avout.mute.gpio"
+
+static int GetAudioAnalogAmplifierMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val)
+{
+ if (cfg_get_one_gpio_data(CC_AMPLIFIER_ANALOG_MUTE_GPIO_CFG_NAME, gpio_grp_str, mute_gpio_addr, mute_on_val) < 0) {
+ return -1;
+ }
+
+ *mute_off_val = !(*mute_on_val);
+
+ return 0;
+}
+
+static int GetAudioHeadSetMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val)
+{
+ if (cfg_get_one_gpio_data(CC_HEADSET_MUTE_GPIO_CFG_NAME, gpio_grp_str, mute_gpio_addr, mute_on_val) < 0) {
+ return -1;
+ }
+
+ *mute_off_val = !(*mute_on_val);
+
+ return 0;
+}
+
+static int GetAudioAVOutMuteGPIOCFG(char gpio_grp_str[], int *mute_gpio_addr, int *mute_on_val, int *mute_off_val)
+{
+ if (cfg_get_one_gpio_data(CC_AVOUT_MUTE_GPIO_CFG_NAME, gpio_grp_str, mute_gpio_addr, mute_on_val) < 0) {
+ return -1;
+ }
+
+ //Some projects has been volume production. They may not use the newest code, so we do compatible for old config.
+ //old config 69,0,1
+ //new config x,69,0
+
+ if (gpio_grp_str[0] != 'x' || gpio_grp_str[0] != 'b' || gpio_grp_str[0] != 'd') {
+ *mute_gpio_addr = strtol(gpio_grp_str, NULL, 10);
+ gpio_grp_str[0] = 'x';
+ gpio_grp_str[1] = '\0';
+ *mute_off_val = *mute_on_val;
+ *mute_on_val = !(*mute_off_val);
+ } else {
+ *mute_off_val = !(*mute_on_val);
+ }
+
+ return 0;
+}
+
+#define PROPERTY_VALUE_MAX (92)
+
+typedef enum tvin_source_input_e {
+ SOURCE_TV,
+ SOURCE_AV1,
+ SOURCE_AV2,
+ SOURCE_YPBPR1,
+ SOURCE_YPBPR2,
+ SOURCE_HDMI1,
+ SOURCE_HDMI2,
+ SOURCE_HDMI3,
+ SOURCE_VGA,
+ SOURCE_MPEG,
+ SOURCE_DTV,
+ SOURCE_MAX,
+} tv_source_input_t;
+
+static int property_set(const char *key_value, char *prop_value)
+{
+ LOGD("%s, %s = %s\n", "TV", key_value, prop_value);
+ return 0;
+}