精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

OpenHarmony-v3.0-LTS Camera相機驅動框架(L2)解析1_初始化

系統
HarmonyOS 相機驅動框架模型對上實現相機HDI接口,對下實現相機Pipeline模型,管理相機各個硬件設備。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

說明

  • 解析源碼基于 OpenHarmony-v3.0-LTS 版本,代碼結構和部分源碼與當前維護的主線分支有差別。
  • 解析示例代碼 drivers\peripheral\camera\hal\init\demo_main.cpp

1. 簡介

HarmonyOS 相機驅動框架模型對上實現相機HDI接口,對下實現相機Pipeline模型,管理相機各個硬件設備。

各層的基本概念如下:

HDI實現層,對上實現OHOS相機標準南向接口。

框架層,對接HDI實現層的控制、流的轉發,實現數據通路的搭建、管理相機各個硬件設備等功能。

適配層,屏蔽底層芯片和OS差異,支持多平臺適配。

2. 框架圖

OpenHarmony-v3.0-LTS Camera相機驅動框架(L2)解析1_初始化-鴻蒙HarmonyOS技術社區

3. 代碼結構

  1. drivers\peripheral\camera 
  2. ├── hal 
  3. │   ├── adapter                //芯片和平臺適配層  
  4. │   ├── buffer_manager         //buffer管理 
  5. │   ├── device_manager         //設備控制接口定義 
  6. │   ├── hdi_impl               //HDI Implementation實現 
  7. │   │   ├── include 
  8. │   │   ├── src 
  9. │   │   │   ├── camera_device              //Device 
  10. │   │   │   ├── camera_host                //Host 
  11. │   │   │   ├── offline_stream_operator    //OffineStreamOperator 
  12. │   │   │   └── stream_operator            //StreamOperator 
  13. │   │   └── test 
  14. │   ├── include 
  15. │   ├── init                                //HiSpark 3516 demo 代碼 
  16. │   ├── pipeline_core                        
  17. │   │   ├── host_stream 
  18. │   │   │   ├── include 
  19. │   │   │   └── src 
  20. │   │   ├── include 
  21. │   │   ├── ipp                            //ipp 
  22. │   │   │   ├── include 
  23. │   │   │   └── src 
  24. │   │   ├── nodes                          //基礎通用node 
  25. │   │   │   ├── include 
  26. │   │   │   └── src 
  27. │   │   │       ├── dummy_node 
  28. │   │   │       ├── fork_node 
  29. │   │   │       ├── merge_node 
  30. │   │   │       ├── node_base 
  31. │   │   │       ├── sensor_node 
  32. │   │   │       ├── sink_node 
  33. │   │   │       ├── source_node 
  34. │   │   │       └── transform_node 
  35. │   │   ├── pipeline_impl                //pipeline構建實現 
  36. │   │   │   ├── include 
  37. │   │   │   └── src 
  38. │   │   │       ├── builder 
  39. │   │   │       ├── dispatcher 
  40. │   │   │       ├── parser 
  41. │   │   │       └── strategy 
  42. │   │   │           └── config 
  43. │   │   ├── src                          //PipelineCore 
  44. │   │   └── utils 
  45. ├── hal_c                                //hal層 C實現接口 
  46. │   ├── hdi_cif 
  47. │   │   ├── include 
  48. │   │   └── src 
  49. │   └── include 
  50. └── interfaces                            //Camera Host框架HDI接口 
  51.     └── include                            
  52.         ├── callback                      //框架涉及的所有callback接口 
  53.         │   ├── device 
  54.         │   ├── host 
  55.         │   └── operator 
  56.         ├── client 
  57.         └── server 

4. 源碼解析

上層demo代碼相對簡單,這里只貼出關鍵部分代碼

  1. int main(int argc, char** argv) 
  2.     RetCode rc = RC_OK; 
  3.  
  4.     auto mainDemo = std::make_shared<Hos3516Demo>(); 
  5.     rc = mainDemo->InitSensors(); 
  6.     if (rc == RC_ERROR) { 
  7.         CAMERA_LOGE("main test: mainDemo->InitSensors() error\n"); 
  8.         return -1; 
  9.     } 
  10.     rc = mainDemo->InitCameraDevice(); 
  11.     if (rc == RC_ERROR) { 
  12.         CAMERA_LOGE("main test: mainDemo->InitCameraDevice() error\n"); 
  13.         return -1; 
  14.     } 
  15.  
  16.     ...... 
  17.  
  18.     return RC_OK; 

4.1 Hos3516Demo::InitSensors()

4.1.1 上層代碼

上層獲取HDI層的ICameraHost:設備管理接口,并設置Host層的回調。

  1. constexpr const char *DEMO_SERVICE_NAME = "camera_service"
  2.  
  3. RetCode Hos3516Demo::InitSensors() 
  4.     int rc = 0; 
  5.  
  6.     CAMERA_LOGD("demo test: InitSensors enter"); 
  7.  
  8.     if (demoCameraHost_ != nullptr) { 
  9.         return RC_OK; 
  10.     } 
  11.  
  12.     demoCameraHost_ = ICameraHost::Get(DEMO_SERVICE_NAME); 
  13.     if (demoCameraHost_ == nullptr) { 
  14.         CAMERA_LOGE("demo test: ICameraHost::Get error"); 
  15.         return RC_ERROR; 
  16.     } 
  17.  
  18.     hostCallback_ = new CameraHostCallback(); 
  19.     rc = demoCameraHost_->SetCallback(hostCallback_); 
  20.     if (rc != Camera::NO_ERROR) { 
  21.         CAMERA_LOGE("demo test: demoCameraHost_->SetCallback(hostCallback_) error"); 
  22.         return RC_ERROR; 
  23.     } 
  24.  
  25.     CAMERA_LOGD("demo test: InitSensors exit"); 
  26.  
  27.     return RC_OK; 

4.1.2 時序圖

OpenHarmony-v3.0-LTS Camera相機驅動框架(L2)解析1_初始化-鴻蒙HarmonyOS技術社區

CameraHostProxy 提供上層調用的代理接口。

CameraHostStub 提供對應代理接口的HDI層的 ‘樁’。

CameraHostImpl 是接口層的具體實現。

Proxy-Stub 負責上下接口參數的數據轉換等工作。

4.1.3 ICameraHost::Get(const char *serviceName)

從ServiceManager中取出CameraHostProxy。并返回ICameraHost接口類指針

  1. //drivers\peripheral\camera\interfaces\include\client\camera_host_proxy.cpp 
  2. sptr<ICameraHost> ICameraHost::Get(const char *serviceName) 
  3.     do { 
  4.         using namespace OHOS::HDI::ServiceManager::V1_0; 
  5.         auto servMgr = IServiceManager::Get(); 
  6.         if (servMgr == nullptr) { 
  7.             HDF_LOGE("%s: IServiceManager failed!", __func__); 
  8.             break; 
  9.         } 
  10.  
  11.         auto remote = servMgr->GetService(serviceName); 
  12.         if (remote != nullptr) { 
  13.             sptr<CameraHostProxy> hostSptr = iface_cast<CameraHostProxy>(remote); 
  14.             return hostSptr; 
  15.         } 
  16.         HDF_LOGE("%s: GetService failed! serviceName = %s", __func__, serviceName); 
  17.     } while(false); 
  18.  
  19.     HDF_LOGE("%s: get %s failed!", __func__, serviceName); 
  20.     return nullptr; 

4.1.4 CameraHostProxy::SetCallback(const OHOS::sptr &callback)

ICameraHostCallback 回調接口類定義了下面兩個回調接口,在CameraHostCallback類中具體實現并通過IPC通訊最終設置到CameraHostImpl

  1. virtual void OnCameraStatus(const std::string &cameraId, CameraStatus status) = 0; 
  2. virtual void OnFlashlightStatus(const std::string &cameraId, FlashlightStatus status) = 0; 

 client::host_proxy發起IPC —> server::host_service_stub

注意 這里有個坑! 通常 SendRequest() 和 OnRemoteRequest() 是一對。sendRequest()在client::XXX_proxy調用,OnRemoteRequest() 在server::XXX_stub調用。但是CamereaHost 的OnRemoteRequest是由 HDF中的 HdfCameraService來接收 通過Dispatch接口再調用具體的CameraHostStub!!

這里的proxy和stub 的cmdID 宏定義名字不一樣,不太利于代碼閱讀。

  1. //drivers\peripheral\camera\interfaces\include\client\camera_host_proxy.cpp 
  2. CamRetCode CameraHostProxy::SetCallback(const OHOS::sptr<ICameraHostCallback> &callback) 
  3.     ...... 
  4.  
  5.     int32_t ret = Remote()->SendRequest(CMD_CAMERA_HOST_REMOTE_SET_CALLBACK, data, reply, option); 
  6.  
  7.     ...... 
  8.  
  9.     return static_cast<CamRetCode>(reply.ReadInt32()); 
  1. //drivers\peripheral\camera\interfaces\include\server\camera_host_service_stub.cpp 
  2. int32_t CameraHostStub::CameraHostStubSetCallback( 
  3.     MessageParcel &data, MessageParcel &reply, MessageOption &option
  4.     bool flag = data.ReadBool(); 
  5.     sptr<ICameraHostCallback> hostCallback = nullptr; 
  6.     if (flag) { 
  7.         sptr<IRemoteObject> remoteObj = data.ReadRemoteObject(); 
  8.         hostCallback = OHOS::iface_cast<ICameraHostCallback>(remoteObj); 
  9.     } 
  10.     CamRetCode ret = cameraHost_->SetCallback(hostCallback); 
  11.     if (!reply.WriteInt32(static_cast<int32_t>(ret))) { 
  12.         HDF_LOGE("%s: write retcode failed", __func__); 
  13.         return HDF_FAILURE; 
  14.     } 
  15.  
  16.     return HDF_SUCCESS; 

 最終調用到HDI 接口層的camera_host 完成callback的設置。

  1. //drivers\peripheral\camera\hal\hdi_impl\src\camera_host\camera_host_impl.cpp 
  2. /** 
  3.  * @brief 設置Host回調函數 
  4.  * 
  5.  * @param callback Host回調函數 
  6.  * @return CamRetCode 
  7.  */ 
  8. CamRetCode CameraHostImpl::SetCallback(const OHOS::sptr<ICameraHostCallback> &callback) 
  9.     DFX_LOCAL_HITRACE_BEGIN; 
  10.  
  11.     if (callback == nullptr) { 
  12.         CAMERA_LOGW("host callback is null."); 
  13.         return INVALID_ARGUMENT; 
  14.     } 
  15.  
  16.     cameraHostCallback_ = callback; 
  17.  
  18.     DFX_LOCAL_HITRACE_END; 
  19.     return NO_ERROR; 

4.2 Hos3516Demo::InitCameraDevice()

4.2.1 上層代碼

獲取CameraIds 、獲取默認前置的攝像頭設備的ability、創建CameraDeviceCallbak 并OpenCamera

  1. RetCode Hos3516Demo::InitCameraDevice() 
  2.     int rc = 0; 
  3.  
  4.     CAMERA_LOGD("demo test: InitCameraDevice enter"); 
  5.  
  6.     if (demoCameraHost_ == nullptr) { 
  7.         CAMERA_LOGE("demo test: InitCameraDevice demoCameraHost_ == nullptr"); 
  8.         return RC_ERROR; 
  9.     } 
  10.  
  11.     (void)demoCameraHost_->GetCameraIds(cameraIds_); 
  12.     if (cameraIds_.empty()) { 
  13.         return RC_ERROR; 
  14.     } 
  15.     const std::string cameraId = cameraIds_.front(); 
  16.     demoCameraHost_->GetCameraAbility(cameraId, ability_); 
  17.  
  18.     sptr<CameraDeviceCallback> callback = new CameraDeviceCallback(); 
  19.     rc = demoCameraHost_->OpenCamera(cameraIds_.front(), callback, demoCameraDevice_); 
  20.     if (rc != Camera::NO_ERROR || demoCameraDevice_ == nullptr) { 
  21.         CAMERA_LOGE("demo test: InitCameraDevice OpenCamera failed"); 
  22.         return RC_ERROR; 
  23.     } 
  24.  
  25.     CAMERA_LOGD("demo test: InitCameraDevice exit"); 
  26.  
  27.     return RC_OK; 

4.2.2 時序圖

OpenHarmony-v3.0-LTS Camera相機驅動框架(L2)解析1_初始化-鴻蒙HarmonyOS技術社區

4.2.3 GetCameraIds()和GetCameraAblilty()

先來看下兩個簡單的設備信息獲取接口。

獲取系統配置中的cameraIds和CameraAbility

IPC 的過程和setcallback一樣 此處 略去 IPC相關代碼和時序圖

直接看實現CameraHostImpl::GetCameraIds() 和 CameraHostImpl::GetCameraAbility(),調用了CameraHostConfig::GetCameraIds()和CameraHostConfig::GetCameraAbility()

  1. 、、drivers\peripheral\camera\hal\hdi_impl\src\camera_host\camera_host_impl.cpp 
  2. /** 
  3.  * @brief 獲取當前可用的Camera設備列表 
  4.  * 
  5.  * @param ids 返回的當前可用的設備列表 
  6.  */ 
  7. CamRetCode CameraHostImpl::GetCameraIds(std::vector<std::string> &cameraIds) 
  8.     DFX_LOCAL_HITRACE_BEGIN; 
  9.  
  10.     CameraHostConfig *config = CameraHostConfig::GetInstance(); 
  11.     if (config == nullptr) { 
  12.         return INVALID_ARGUMENT; 
  13.     } 
  14.     RetCode rc = config->GetCameraIds(cameraIds); 
  15.     if (rc != RC_OK) { 
  16.         return INVALID_ARGUMENT; 
  17.     } 
  18.  
  19.     DFX_LOCAL_HITRACE_END; 
  20.     return NO_ERROR; 
  21. /** 
  22.  * @brief 獲取Camera的能力集 
  23.  * 
  24.  * @param cameraId 要獲取的Camera設備id 
  25.  * @param ability Camera設備的能力集 
  26.  * @return CamRetCode 
  27.  * @see CameraAbility 
  28.  */ 
  29. CamRetCode CameraHostImpl::GetCameraAbility(const std::string &cameraId, 
  30.     std::shared_ptr<CameraAbility> &ability) 
  31.     DFX_LOCAL_HITRACE_BEGIN; 
  32.     CameraHostConfig *config = CameraHostConfig::GetInstance(); 
  33.     if (config == nullptr) { 
  34.         return INVALID_ARGUMENT; 
  35.     } 
  36.     RetCode rc = config->GetCameraAbility(cameraId, ability); 
  37.     if (rc != RC_OK) { 
  38.         return INVALID_ARGUMENT; 
  39.     } 
  40.     DFX_LOCAL_HITRACE_END; 
  41.     return NO_ERROR; 

CameraHostConfig負責從camera_host_config.hcb文件讀出設備驅動信息。

  1. //drivers\peripheral\camera\hal\hdi_impl\src\camera_host\camera_host_config.cpp 
  2. RetCode CameraHostConfig::ReadConfigFile() 
  3.     std::unique_ptr<HcsDeal> hcsDeal = std::make_unique<HcsDeal>(CONFIG_PATH_NAME); 
  4.     if (hcsDeal == nullptr) { 
  5.         CAMERA_LOGE("make HcsDeal failed. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str()); 
  6.         return RC_ERROR; 
  7.     } 
  8.  
  9.     RetCode rc = hcsDeal->Init(); 
  10.     if (rc != RC_OK) { 
  11.         CAMERA_LOGE("hcs deal init failed. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str()); 
  12.         return rc; 
  13.     } 
  14.  
  15.     rc = hcsDeal->GetCameraId(cameraIdMap_); 
  16.     if (rc != RC_OK || cameraIdMap_.empty()) { 
  17.         CAMERA_LOGE("config camera id not found. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str()); 
  18.         return rc; 
  19.     } 
  20.  
  21.     rc = hcsDeal->GetMetadata(cameraAbilityMap_); 
  22.     if (rc != RC_OK || cameraAbilityMap_.empty()) { 
  23.         CAMERA_LOGE("config camera ability not found. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str()); 
  24.         return rc; 
  25.     } 
  26.  
  27.     return RC_OK; 
  28. RetCode CameraHostConfig::GetCameraIds(std::vector<std::string> &cameraIds) 
  29.     auto itr = cameraAbilityMap_.begin(); 
  30.     for (; itr != cameraAbilityMap_.end(); itr++) { 
  31.         cameraIds.push_back(itr->first); 
  32.     } 
  33.  
  34.     return RC_OK; 
  35. RetCode CameraHostConfig::GetCameraAbility( 
  36.     const std::string &cameraId, std::shared_ptr<CameraAbility> &ability) 
  37.     auto itr = cameraAbilityMap_.find(cameraId); 
  38.     if (itr != cameraAbilityMap_.end()) { 
  39.         ability = itr->second
  40.         return RC_OK; 
  41.     } 
  42.  
  43.     return RC_ERROR; 

hcb文件是由hcs文件通過build_hcs.py工具生成的具體生成的相關代碼在驅動芯片適配的BUILD.gn中

  1. //drivers/peripheral/camera/hal/adapter/chipset/hispark_taurus/BUILD.gn 
  2. action("build_camera_host_config") { 
  3.   script = "$hdf_framework_path/tools/hc-gen/build_hcs.py" 
  4.   sources = [ rebase_path( 
  5.           "//vendor/hisilicon/Hi3516DV300/hdf_config/uhdf/camera/hal/mpp/hispark_taurus/hdi_impl/camera_host_config.hcs") ] 
  6.   outputs = [ "$target_gen_dir/hdi_impl/camera_host_config.hcb" ] 
  7.   args = [ 
  8.     "-o"
  9.     rebase_path(outputs[0]), 
  10.     sources[0], 
  11.   ] 
  12.  
  13. ohos_prebuilt_etc("camera_host_config.hcb") { 
  14.   deps = [ ":build_camera_host_config" ] 
  15.   hcs_outputs = get_target_outputs(":build_camera_host_config"
  16.   source = hcs_outputs[0] 
  17.   relative_install_dir = "hdfconfig" 
  18.   subsystem_name = "hdf" 
  19.   part_name = "hdf" 
  1. //vendor/hisilicon/Hi3516DV300/hdf_config/uhdf/camera/hal/mpp/hispark_taurus/hdi_impl/camera_host_config.hcs 
  2. root { 
  3.     module="sample"
  4.     camera_host_config { 
  5.         match_attr = "camera_host_interface"
  6.         .... 
  7.         ability_01 :: ability { 
  8.             logicCameraId = "lcam001"
  9.             physicsCameraIds = [ 
  10.                 "CAMERA_FIRST"
  11.                 "CAMERA_SECOND" 
  12.             ]; 
  13.             metadata { 
  14.                 aeAvailableAntiBandingModes = [ 
  15.                     "OHOS_CAMERA_AE_ANTIBANDING_MODE_OFF" 
  16.                 ]; 
  17.             ...... 

4.2.4 OpenCamera()

先簡單說下callback。

這里會先創建一個CameraDeviceCallback設備回調 作為Camera設備的回調接口。CameraDeviceCallback的接口類定義在

  1. //drivers\peripheral\camera\interfaces\include\icamera_device_callback.h 
  2. virtual void OnError(ErrorType type, int32_t errorCode) = 0; 
  3. virtual void OnResult(uint64_t timestamp, const std::shared_ptr<CameraStandard::CameraMetadata> &result) = 0; 

開始OpenCamera()。還是通過一次ipc 最后到HDI的camera_host

CameraHostImpl::OpenCamera 先從cameraDeviceMap_中查找cameraId對應的CameraDeviceImpl,然后通過CameraDeviceImpl設置device的callback.

再通過cameraId從CameraHostConfig查出對應的phyCameraIds,在調用CameraPowerUp接口完成上電.

最后把CameraDevice的status set true.

至此上層的相機初始化就完成了。

  1. /** 
  2.  * @brief 打開Camera設備 
  3.  * 
  4.  * @param cameraId 要打開的Camera設備id 
  5.  * @param callback Camera設備的回調函數 
  6.  * @param camera 返回的Camera設備接口 
  7.  * @return CamRetCode 
  8.  * @see ICameraDeviceCallback 
  9.  * @see ICameraDevice 
  10.  */ 
  11. CamRetCode CameraHostImpl::OpenCamera(const std::string &cameraId, 
  12.     const OHOS::sptr<ICameraDeviceCallback> &callback, 
  13.     OHOS::sptr<ICameraDevice> &device) 
  14.     CAMERA_LOGD("OpenCamera entry"); 
  15.     DFX_LOCAL_HITRACE_BEGIN; 
  16.      
  17.     //這里說明參數callback必須設置!!! 
  18.     if (CameraIdInvalid(cameraId) != RC_OK || callback == nullptr) { 
  19.         CAMERA_LOGW("open camera id is empty or callback is null."); 
  20.         return INVALID_ARGUMENT; 
  21.     } 
  22.  
  23.     auto itr = cameraDeviceMap_.find(cameraId); 
  24.     if (itr == cameraDeviceMap_.end()) { 
  25.         CAMERA_LOGE("camera device not found."); 
  26.         return INSUFFICIENT_RESOURCES; 
  27.     } 
  28.     CAMERA_LOGD("OpenCamera cameraId find success."); 
  29.  
  30.     std::shared_ptr<CameraDeviceImpl> cameraDevice = 
  31.         std::static_pointer_cast<CameraDeviceImpl>(itr->second); 
  32.     if (cameraDevice == nullptr) { 
  33.         CAMERA_LOGE("camera device is null."); 
  34.         return INSUFFICIENT_RESOURCES; 
  35.     } 
  36.  
  37.     CamRetCode ret = cameraDevice->SetCallback(callback); 
  38.     if (ret != NO_ERROR) { 
  39.         CAMERA_LOGW("set camera device callback faild."); 
  40.         return ret; 
  41.     } 
  42.  
  43.     CameraHostConfig *config = CameraHostConfig::GetInstance(); 
  44.     if (config == nullptr) { 
  45.         return INVALID_ARGUMENT; 
  46.     } 
  47.     std::vector<std::string> phyCameraIds; 
  48.     RetCode rc = config->GetPhysicCameraIds(cameraId, phyCameraIds); 
  49.     if (rc != RC_OK) { 
  50.         CAMERA_LOGE("get physic cameraId failed."); 
  51.         return DEVICE_ERROR; 
  52.     } 
  53.  
  54.     if (CameraPowerUp(cameraId, phyCameraIds) != RC_OK) { 
  55.         CAMERA_LOGE("camera powerup failed."); 
  56.         CameraPowerDown(phyCameraIds); 
  57.         return DEVICE_ERROR; 
  58.     } 
  59.  
  60.     auto sptrDevice = deviceBackup_.find(cameraId); 
  61.     if (sptrDevice == deviceBackup_.end()) { 
  62.         deviceBackup_[cameraId] = cameraDevice.get(); 
  63.     } 
  64.     device = deviceBackup_[cameraId]; 
  65.  
  66.     cameraDevice->SetStatus(true); 
  67.     CAMERA_LOGD("open camera success."); 
  68.     DFX_LOCAL_HITRACE_END; 
  69.     return NO_ERROR; 

5 這里留下了兩個問題

cameraDeviceMap_中的值什么時候設置的?

CameraPowerUp() 如何完成上電的功能?

將在下一章節進行解析

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2022-02-14 13:52:04

OpenHarmor系統鴻蒙

2022-02-25 15:33:45

圖像采集鴻蒙Camera相機

2022-02-08 15:07:45

OpenHarmor鴻蒙操作系統

2022-02-17 16:47:40

OpenharmonIPC通信鴻蒙

2022-06-22 09:14:23

事件打點HiSysEvent

2022-02-21 15:38:57

Openharmon操作系統鴻蒙

2022-04-21 11:26:31

鴻蒙操作系統

2023-02-13 15:54:49

2022-03-28 15:40:34

harmony鴻蒙操作系統

2022-07-14 19:03:33

IPC服務鴻蒙

2023-02-28 15:49:09

鴻蒙應用開發

2022-07-04 16:41:16

IPC通信HiTrace

2011-06-17 15:29:44

C#對象初始化器集合初始化器

2021-10-20 19:14:30

緩存CacheCPU

2021-10-11 08:51:05

Linux console Linux 系統

2022-04-01 15:18:04

HarmonyHDF 驅動鴻蒙

2023-01-31 09:12:16

CPU芯片緩存

2023-10-10 15:33:55

機器學習相似性度量

2010-02-06 14:40:50

C++初始化和賦值

2022-04-06 11:27:05

harmonyeTS 開發NAPI開發
點贊
收藏

51CTO技術棧公眾號

亚洲精品少妇| 137大胆人体在线观看| 欧美成人有码| 日韩禁在线播放| 99热成人精品热久久66| 91精彩在线视频| 成人性生交大片免费看中文网站| 庆余年2免费日韩剧观看大牛| 啪啪一区二区三区| 国产精品久av福利在线观看| 色激情天天射综合网| 国产一二三四五| 国产资源在线观看| 国产精品99久久久久久久vr| 热99精品只有里视频精品| 国产一二三区精品| 欧美偷拍自拍| 亚洲福利在线播放| 日日干日日操日日射| 涩涩网在线视频| 亚洲精品久久7777| 亚洲电影一二三区| 神马电影在线观看| 国产成人av电影在线观看| 国产精品视频免费观看www| 国产精久久久久久| 亚洲第一偷拍| 在线观看成人黄色| 波多野结衣av在线免费观看| 国产一区二区三区免费观看在线| 色94色欧美sute亚洲线路二 | 亚洲三级在线观看视频| 亚洲一级少妇| 亚洲成人免费av| 久久久无码中文字幕久...| 国产福利在线观看| 97久久超碰精品国产| 91在线观看网站| 91亚洲精品国偷拍自产在线观看 | 国产精品久久久久9999| 日产精品久久久久| 欧美破处大片在线视频| www.日韩av.com| 精品手机在线视频| 欧美亚洲国产激情| 国产亚洲人成网站在线观看| 亚洲精品乱码久久久久久不卡 | 精品国产一区二区三区麻豆小说 | 日韩在线视频免费观看| 一级黄色性视频| 国产精品一区2区3区| 精品香蕉一区二区三区| 特级特黄刘亦菲aaa级| 亚洲经典视频| 日韩精品一区二区三区视频在线观看| 亚洲理论中文字幕| 成人av在线播放| 欧美一区二区视频在线观看2022| 色天使在线观看| 欧美成a人片免费观看久久五月天| 在线视频国内自拍亚洲视频| 国产视频一区二区三区在线播放 | 都市激情一区| 欧美激情一区二区三区四区| 色综合666| 成人av毛片| 国产精品福利一区二区三区| 在线免费一区| 黄污视频在线观看| 偷窥国产亚洲免费视频| 国产亚洲精品网站| 三级在线免费观看| 国产一区二区视频免费观看| 久草热8精品视频在线观看| 成人精品在线视频| www.看毛片| av在线综合网| 免费毛片一区二区三区久久久| 日韩av高清在线| 亚洲国产成人在线| 亚洲视频在线二区| 日本在线观看大片免费视频| 亚洲午夜精品在线| 无码人妻精品一区二区三区在线| 原纱央莉成人av片| 欧美影院午夜播放| 国产又粗又猛大又黄又爽| 天堂va欧美ⅴa亚洲va一国产| 日韩欧美亚洲另类制服综合在线| 日本一卡二卡在线| 欧美中文一区二区| 久久精品中文字幕免费mv| 久久午夜无码鲁丝片午夜精品| 亚洲高清激情| 国产精品视频免费观看www| 午夜美女福利视频| 久久久欧美精品sm网站| 色香蕉在线观看| 97超碰在线免费| 欧美伊人精品成人久久综合97| 三级av免费看| 亚洲三级网页| 久久99精品久久久久久噜噜 | av网页在线观看| 黑丝美女一区二区| 欧美人成在线视频| 亚洲欧美另类在线视频| 国产成人在线视频网站| 欧美日韩亚洲一区二区三区在线观看| 日本三级在线播放完整版| 午夜精品久久久久久久蜜桃app| 欧美精品aaaa| 久久99精品久久久久久欧洲站| 中文字幕亚洲色图| 亚洲第一精品在线观看| 韩国女主播成人在线观看| 久久一区免费| bl在线肉h视频大尺度| 欧美久久久久中文字幕| 国产精品密蕾丝袜| 在线视频观看日韩| 91九色在线观看| 国产女人在线观看| 黄色精品在线看| 国产成人精品综合久久久久99| 精品盗摄女厕tp美女嘘嘘| 久久久久久美女| 国产精品嫩草影院桃色| 国产蜜臀av在线一区二区三区| 日本手机在线视频| 精品一区二区三区中文字幕| 中文字幕不卡在线视频极品| 国产成人无码精品亚洲| 国产成人小视频| 麻豆视频传媒入口| 欧美一级做a| 永久免费精品影视网站| 中文字幕一区在线播放| www.亚洲激情.com| 老子影院午夜伦不卡大全| 精品国产亚洲一区二区三区大结局| 亚洲性视频网站| 中文字幕高清在线免费播放| 91美女在线观看| 黄色一级视频片| 另类在线视频| 国内精品免费午夜毛片| 丰满人妻一区二区三区免费视频 | 国产精品久久久影院| 中文字幕日本一区| 久久亚洲私人国产精品va| 国产又粗又猛视频免费| 国产精品久久久久久福利一牛影视 | 91极品视觉盛宴| 久久久久亚洲av成人无码电影| 欧美中文日韩| 欧洲视频一区二区三区| 日韩国产激情| 在线电影av不卡网址| 中文字幕日韩国产| 国产精品免费久久| 91日韩精品视频| 你懂的网址国产 欧美| 91嫩草视频在线观看| av在线资源| 亚洲乱码国产乱码精品精| 无码一区二区三区在线观看| 国产精品日日摸夜夜摸av| www.com黄色片| 9191国语精品高清在线| 99久久精品久久久久久ai换脸| 在线视频中文字幕第一页| 精品剧情在线观看| 国内精品福利视频| 国产农村妇女毛片精品久久麻豆 | 亚洲av中文无码乱人伦在线视色| 久久九九久久九九| av噜噜在线观看| 激情一区二区| 欧美日韩天天操| 成人污污www网站免费丝瓜| 久久人人爽人人爽人人片av高请| 天堂在线视频网站| 日本韩国欧美三级| 亚洲av无码一区二区三区在线| 国产白丝精品91爽爽久久| 国模无码视频一区二区三区| 欧美日韩中字| 99久久无色码| 日韩久久一区二区三区| 精品国产欧美一区二区五十路| 成人av无码一区二区三区| 欧美色图在线视频| 欧美黑人性猛交xxx| 91麻豆国产精品久久| 日韩av.com| 国产欧美在线| 蜜臀在线免费观看| 精品国产123区| eeuss一区二区三区| 成人在线爆射| 久久久久九九九九| 3p视频在线观看| 日韩av在线看| 国产免费视频一区二区三区| 欧美日韩一区二区三区在线免费观看| 亚洲一二三精品| av男人天堂一区| www.五月天色| 久久精品首页| 99久久免费观看| 成人无号精品一区二区三区| 成人一区二区三区四区| 久久免费影院| 欧洲精品久久久| 91色在线看| 欧美猛少妇色xxxxx| 国产福利小视频在线观看| 亚洲国产成人爱av在线播放| 91精品国自产| 在线观看亚洲a| 日本三级免费网站| 手机在线理论片| 欧美精品在线视频观看| 黄色片在线看| 日韩av中文字幕在线| 亚洲精品国产精品国| 欧美日韩国产在线播放网站| 国产精品久免费的黄网站| 亚洲地区一二三色| 欧美丰满艳妇bbwbbw| 亚洲人亚洲人成电影网站色| 高清国产在线观看| 国产亚洲欧美激情| 99久久人妻无码精品系列| 99久久免费视频.com| 亚洲午夜久久久久久久久| 国产精品亚洲人在线观看| 国产成人在线综合| 久久99精品久久久久久久久久久久| 不卡影院一区二区| 久久精品在线| 黑森林福利视频导航| 日韩亚洲国产精品| 免费看日本毛片| 亚洲九九精品| 久久无码高潮喷水| 久久亚洲综合| 日韩中文字幕免费在线| 久久精品午夜| 国产高潮免费视频| 麻豆久久一区二区| 国产成年人视频网站| 麻豆国产91在线播放| 日韩av在线中文| 国产在线视视频有精品| 久久久精品高清| 国产精品538一区二区在线| 欧美日韩一区二区区| 国产**成人网毛片九色 | 久久久精品91| 亚洲高清久久久| 免费观看成人毛片| 色先锋aa成人| 一卡二卡三卡在线观看| 日韩午夜三级在线| 国产 日韩 欧美 精品| 日韩电视剧免费观看网站| 你懂的好爽在线观看| 中文字幕国内精品| av中文字幕在线观看| 欧美激情免费在线| 在线看的毛片| 国产精品一区二区三| 电影中文字幕一区二区| 成人在线视频电影| 性欧美xxxx免费岛国不卡电影| 欧美精品一区三区在线观看| 欧美系列电影免费观看| 日韩视频一二三| 136国产福利精品导航网址| 免费观看成人在线视频| 国产一区二区免费视频| 亚洲av人人澡人人爽人人夜夜| 久久久久综合网| 久久精品在线观看视频| 亚洲电影第三页| 中文字幕1区2区3区| 欧美一级艳片视频免费观看| 天堂网av在线播放| 中文字幕亚洲欧美日韩在线不卡| www视频在线看| 欧美亚洲国产视频| 宅男噜噜噜66国产精品免费| 九九九九精品| 亚欧美无遮挡hd高清在线视频 | 欧美高清性xxxxhd | 国产欧美一区二区三区鸳鸯浴| 福利视频第一页| 欧美日韩一区二区三区| 99久久精品国产一区二区成人| 日韩精品欧美国产精品忘忧草| 欧美激情视频在线播放| 97香蕉超级碰碰久久免费的优势| 黄页免费欧美| 鲁丝一区二区三区免费| 一本到12不卡视频在线dvd| www黄色av| 国产成人在线电影| 99久久久无码国产精品不卡| 亚洲a一区二区| 精品人妻一区二区三区四区不卡| 国产亚洲欧美aaaa| zzzwww在线看片免费| 成人精品在线观看| 成人一区二区| av免费在线播放网站| 国产精品一卡二卡在线观看| 亚洲精品国产精品国自产网站| 亚洲国产精品自拍| 国产美女裸体无遮挡免费视频| 亚洲视频999| 男人av在线播放| 亚洲自拍偷拍色图| 欧美激情电影| 国产精品乱码久久久久| 97久久精品人人做人人爽50路| 天天操天天操天天操天天操天天操| 欧美性极品少妇| 欧美新色视频| 91福利视频网| 久久精品色综合| 免费一级特黄毛片| 高清国产午夜精品久久久久久| 欧美色视频一区二区三区在线观看 | 中文字幕剧情在线观看一区| 丝袜美腿高跟呻吟高潮一区| 国产精品第七页| 欧美日韩亚洲激情| av女名字大全列表| 992tv成人免费视频| 国产一区二区三区不卡av| 国产传媒久久久| 成人在线视频首页| 国产精品1234区| 亚洲国产精品女人久久久| h片在线观看下载| 九九久久99| 中文欧美日韩| 中文字幕一区二区三区人妻| 精品久久中文字幕久久av| 日韩性xxxx| 青青草原一区二区| 成人久久一区| 成年网站免费在线观看| 亚洲欧美怡红院| www.亚洲天堂.com| 7m精品福利视频导航| 亚洲美女久久| youjizzxxxx18| 中文子幕无线码一区tr | 欧美成人bangbros| 黄视频在线免费看| 噜噜噜噜噜久久久久久91| 快she精品国产999| 少妇愉情理伦三级| 欧美一卡2卡3卡4卡| 特级毛片在线| 蜜桃传媒视频麻豆一区 | 高清中文字幕一区二区三区| 国产精品九九久久久久久久| 91亚洲成人| 国产性猛交96| 欧美性猛交xxxx黑人| 超碰在线国产| 999视频在线免费观看| 一区二区毛片| 成年人看的免费视频| 欧美一区二区三区系列电影| www.超碰在线| 亚洲自拍偷拍二区| 成人自拍视频在线观看| 无码人妻熟妇av又粗又大| 久久亚洲精品中文字幕冲田杏梨| 国内精品偷拍| 性生活免费在线观看| 亚洲亚洲人成综合网络| 国产日本在线视频| 97欧洲一区二区精品免费| 欧美亚洲自偷自偷| 国产中文av在线| 日韩成人在线视频| 日韩成人综合网| 亚洲午夜精品久久久久久人妖| 日本一区二区成人| 日韩一区免费视频| 国产综合福利在线| 午夜亚洲影视| 五月婷婷一区二区| 一区二区三区www|