You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jianglk.darker 7ee447c011
v811_spc009_project
4 months ago
..
common/support v811_spc009_project 4 months ago
custom v811_spc009_project 4 months ago
include v811_spc009_project 4 months ago
scripts v811_spc009_project 4 months ago
Android.bp v811_spc009_project 4 months ago
readme.txt v811_spc009_project 4 months ago

readme.txt

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

1. TVMW目录为TV中间件实现代码,代码目录:
    vendor/mwvendor/modules/tvmw
    ├── adapter
    │   ├── tv_instruct.h
    │   └── tv_cus_instruct.h  //编译客制化目录时会将custom/customer_reference/instruct/tv_cus_instruct.h复制至此
    ├── api
    │   ├── cplusplus             //C++ API 编译客制化目录时会将custom/customer_reference/cppapi复制至此
    │   └── java                  //Java API 编译客制化目录时会将custom/customer_reference/java复制至此
    ├── common
    ├── custom                    //客制化相关代码、 公版mwvendor ini文件和客户ini文件
    │   ├── customer_reference    // 客户项目定制化代码参考;
    │   ├── mwvendor              // huanglong公版定制化代码;
    │   └── xxx                   // 客户参考customer_reference添加客户自己的项目定制化目录和代码;
    ├── debug
    │   ├── aqdebug
    │   └── tvdebug
    ├── external                  //git库不track此目录此目录编译时创建将custom目录下的mwvendor或custom_reference目录下的差异化实现的代码
    │                               即不包括客制化的C++或Java接口复制到本目录编译入libimtvservice.so动态库
    ├── framework                 //framework层主要用于封装或集成各驱动模块的UAPI接口和数据结构供logic层调用
    ├── include
    ├── logic                     //logic层主要包含了module_api、player、picture、audio、system等业务逻辑
    │                                 module_api目录为logic层封装给C++、Java API调用的模块接口封装层
    ├── scripts
    └── tvservice
    │
    └── cfg.mak                   // 定义TVMW_CUSTOM选择客户机型编译目录.
   注: tvmw/cfg.mak中TVMW_CUSTOM选择客户机型编译目录,如:
       TVMW_CUSTOM := custom/mwvendor             //编译 公版代码 + custom/mwvendor 目录代码;
       TVMW_CUSTOM := custom/customer_reference   //编译 公版代码 + custom/customer_reference 目录代码;
       TVMW_CUSTOM := custom/xxxx                 //编译 公版代码 + custom/xxxx 目录代码.

2.客户修适配TV中间件规则
     1>. 客户客制化代码全部放在custom/customer_reference目录下客户不要直接修改huanglong公版的所有文件
     2>. 客户所有实现代码可都在客制化目录custom/customer_reference下实现编译时会将客制化目录下对应代码文件复制至公版相应目录下并编译进行相应动态库
     3>. 客户版本升级可直接拷贝项目定制化目录而不用关心huanglong发布版本修改具体内容方便维护和升级
     4>. 如果客户确实存在客制化目录下无法实现的功能请反馈给huanglong TVMW部门;
     5>. 客制化详细可参考发布包中"TVMW3.0 客制化 开发指南 .pdf"文档.

2. 定制化参考customer_reference目录介绍:
  customer_reference:
     ├── source    :  客户功能实现目录,可多个cpp和h文件,可多个目录,文件名无要求;
     ├── include    客户功能实现头文件,也可为空,直接放在source目录中;
     ├── cppapi     C++接口客户功能添加,文件名为CusEx.cpp/CusEx.h/ICusEx.h,文件名不要修改,如客户使用JAVA接口,不需要C++接口,可不需要此目录;
     ├── java       客户功能JAVA接口实现,文件名为CusExImpl.java/CusEx.java,不要修改;
     ├── instruct   客户功能invoke指令ID定义,文件为tv_cus_intruct.h,不要修改;
     └── ini        客户项目ini文件,可参考huanglong公版tvmw\custom\mwvendor\ini下对应ini文件再修改与硬件或数据库默认值相关的定制化配置.
     注:
     1>. 如客户扩展功能使用JAVA接口,不需要C++接口,可不需要cppapi目录, java代码直接invoke方式调用实现;
         参考CusExImpl.java中cus_set_xxx实现"MwtvManager.getInstance().excuteCommandSet(CMD_ID_EX_CUS_SET_XXX, val)".
     2>. 如客户扩展功能需C++接口cppapi、instruct目录下文件名不要修改,可在对应TODO部分添加客户功能实现代码;
     3>. 每次版本升级,注意对比huanglong公版tvmw\custom\mwvendor\ini下对应ini文件同步升级.

2. 客户中间件功能实现参考customer_reference/source/tv_cus_set.cpp中init代码部分:
    static td_s32 init(IDispatch * dispatch)
    {
        LOGI("customer cus module init");

    #if 1 //数据库客制化,创建新数据库,添加数据节点,参考tv_cus_dat.cpp中实现
        cus_db_init();
    #endif

    #if 1 //公版已存在数据库数据定义,但格式与客户不一样,客户定制私有数据查询和更新
        MW_DBO_CB_S sDboCallBack;
        sDboCallBack.pfnDbUpdateCb = cus_db_update_cb;
        sDboCallBack.pfnDbQueryCb  = cus_db_query_cb;
        sDboCallBack.pfnDbQueryManyCb = cus_db_query_many_cb;
        MwDBOFact::getDBO()->registerOpCb(&sDboCallBack);
    #endif

    #if 1 //图像模式设置,除公版已经定义的图像模式中各项设置外,客户有私有数据设置
        MW_CUS_PICMODE_CB pfnCusPicModeCb = cus_picturemode_additional;
        MwPicture::instance()->registerCusPicModeCB(pfnCusPicModeCb);
    #endif

    #if 1 //声音模式设置,除公版已经定义的声音模式中各项设置外,客户有私有数据设置
        MW_CUS_SOUNDMODE_CB pfnCusSoundModeCb = cus_soundmode_additional;
        MwAudio::instance()->registerCusSoundModeCB(pfnCusSoundModeCb);
    #endif

        td_u32 i;
    #if 1 //定制添加invoke指令调用功能实现,客户需封装C++或JAVA接口
        for (i = 0; i < sizeof(g_astCusAddModuleLocalAtomicInfo)/sizeof(LocalAtomicInfo); i++)
        {
            dispatch->insertInterface(g_astCusAddModuleLocalAtomicInfo[i].id, g_astCusAddModuleLocalAtomicInfo[i].pfn);
        }
    #endif

    #if 1 //定制替换公版已经定义的invoke指令调用功能实现
        for (i = 0; i < sizeof(g_astCusRepalceModuleLocalAtomicInfo)/sizeof(LocalAtomicInfo); i++)
        {
            dispatch->replaceInterface(g_astCusRepalceModuleLocalAtomicInfo[i].id, g_astCusRepalceModuleLocalAtomicInfo[i].pfn);
        }
    #endif

    #if 1 //控制驱动pq模块客户化功能回调,例如替换invoke指令功能SetBackLight,此处替换MW内部所有非invoke调用背光设置实现
        MW_PQCTRL_CB_S stPqCtrlCb;
        memset(&stPqCtrlCb, 0, sizeof(MW_PQCTRL_CB_S));
        stPqCtrlCb.pfnSetBackLightCb = cus_SetBackLight;
        stPqCtrlCb.pfnSetDemoCb = cus_SetDemo;
        //stPqCtrlCb.pfnGetBackLightCb = cus_GetBackLight;
        MwPQCtrl::instance()->registerOpCb(&stPqCtrlCb);
    #endif

    #if 1 //客户定制EDID和HDCP KEY
        cus_get_hdcp_key(&g_stCusHdcpEdid);
        cus_get_edid(&g_stCusHdcpEdid);
        MwVideoPlay::updateHdcpEdid(&g_stCusHdcpEdid);
    #endif

    #if 1 //客户定制比例模式的overscan裁剪和输出窗口计算算法
        MW_CONFIG_CALLBACK_S stAspectCb;
        stAspectCb.enConfigType = MW_DISPLAY_CONFIG_ASPECT;
        stAspectCb.unCfgCallback.stAspectCb.pfnAspectCropCb = cus_aspect_crop_cb;
        stAspectCb.unCfgCallback.stAspectCb.pfnAspectDispCb = cus_aspect_disp_cb;
        MwVideoPlay::registerCfgCb(&stAspectCb);
    #endif

    #if 1 //保存TVMW音频参数到EMMC裸分区/EEPROM/文件系统中文件,用于不能从MW数据库设置音频参数场景
        MW_CONFIG_SND_CALLBACK_S stConfigCb;
        stConfigCb.enConfigType = MW_SOUND_CONFIG_PRECIVOL;
        stConfigCb.unCfgCallback.stPreciVolCb.pfnPreciVolCb = cus_precivol_cb;
        MwAudioPlay::registerCfgCb(&stConfigCb);

        stConfigCb.enConfigType = MW_SOUND_CONFIG_PRESCALE;
        stConfigCb.unCfgCallback.stPrescaleCb.pfnPrescaleCb = cus_prescale_cb;
        MwAudioPlay::registerCfgCb(&stConfigCb);
    #endif

    #if 1 //注册回调在端子各种播放场景下(creat/destroy/start/stop/设置音频和PQ参数)定制客户设置
        MwSourceManager::instance()->registerListener(new cusTvListener);
    #endif

        //TODO: 其它客户化设置 start
        //  例如 1. 客户重新刷新数据库数据为客户私有数据;
        //       2. 客户新功放初始化控制;
        //       ......
        //
        //      其它客户化设置 end

        return TD_SUCCESS;
    }

    注 : 客户需要定制化某部分功能,可打开"#if 1",并修改对应功能实现(参考TODO:部分),如不需要,请 "#if 0"屏蔽此扩展功能.