IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android CameraServer:Disconnect -> 正文阅读

[移动开发]Android CameraServer:Disconnect

Camera2ClientBase::disconnect()
->detachDevice()

Camera2ClientBase

close/disconnect/detachDevice的关系???
Camera3Device::disconnectImpl()
CameraDeviceClient::detachDevice()
Camera2ClientBase::detachDevice()

Camera3Device里HalInterface链接到如下:
hardware/interfaces/camera/device/3.4/default/CameraDeviceSession.cpp

template <typename TClientBase>                                      
Camera2ClientBase<TClientBase>::~Camera2ClientBase() {                                      
    ATRACE_CALL();                                      
                                      
    TClientBase::mDestructionStarted = true;                                      
                                      
    disconnect();                                                                                                                                                                                           
                                      
    ALOGI("Closed Camera %s. Client was: %s (PID %d, UID %u)",                                      
            TClientBase::mCameraIdStr.string(),                                      
            String8(TClientBase::mClientPackageName).string(),                                      
            mInitialClientPid, TClientBase::mClientUid);                                      
}   
status_t Camera3Device::waitUntilDrained() {                                                                                                                                                                
    ATRACE_CALL();                                                                                                                                                                                          
    Mutex::Autolock il(mInterfaceLock);                                                                                                                                                                     
    nsecs_t maxExpectedDuration = getExpectedInFlightDuration();                                                                                                                                            
    Mutex::Autolock l(mLock);                                                                                                                                                                               
                                                                                                                                                                                                            
    return waitUntilDrainedLocked(maxExpectedDuration);                                                                                                                                                     
}                                                                                                                                                                                                           
                                                                                                                                                                                                            
status_t Camera3Device::waitUntilDrainedLocked(nsecs_t maxExpectedDuration) {                                                                                                                               
    switch (mStatus) {                                                                                                                                                                                      
        case STATUS_UNINITIALIZED:                                                                                                                                                                          
        case STATUS_UNCONFIGURED:                                                                                                                                                                           
            ALOGV("%s: Already idle", __FUNCTION__);                                                                                                                                                        
            return OK;                                                                                                                                                                                      
        case STATUS_CONFIGURED:                                                                                                                                                                             
            // To avoid race conditions, check with tracker to be sure                                                                                                                                      
        case STATUS_ERROR:                                                                                                                                                                                  
        case STATUS_ACTIVE:                                                                                                                                                                                 
            // Need to verify shut down                                                                                                                                                                     
            break;                                                                                                                                                                                          
        default:                                                                                                                                                                                            
            SET_ERR_L("Unexpected status: %d",mStatus);                                                                                                                                                     
            return INVALID_OPERATION;                                                                                                                                                                       
    }                                                                                                                                                                                                       
    ALOGV("%s: Camera %s: Waiting until idle (%" PRIi64 "ns)", __FUNCTION__, mId.string(),                                                                                                                  
            maxExpectedDuration);                                                                                                                                                                           
    status_t res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);                                                                                                                         
    if (res != OK) {                                                                                                                                                                                        
        SET_ERR_L("Error waiting for HAL to drain: %s (%d)", strerror(-res),                                                                                                                                
                res);                                                                                                                                                                                       
    }                                                                                                                                                                                                       
    return res;                                                                                                                                                                                             
}           
libcameraservice/device3/Camera3Device.cpp

void CameraDeviceClient::detachDevice() {                                                                                                                                                                   
    if (mDevice == 0) return;                                                                                                                                                                               
                                                                                                                                                                                                            
    ALOGV("Camera %s: Stopping processors", mCameraIdStr.string());                                                                                                                                         
                                                                                                                                                                                                            
    mFrameProcessor->removeListener(FRAME_PROCESSOR_LISTENER_MIN_ID,                                                                                                                                        
                                    FRAME_PROCESSOR_LISTENER_MAX_ID,                                                                                                                                        
                                    /*listener*/this);                                                                                                                                                      
    mFrameProcessor->requestExit();                                                                                                                                                                         
    ALOGV("Camera %s: Waiting for threads", mCameraIdStr.string());                                                                                                                                         
    mFrameProcessor->join();                                                                                                                                                                                
    ALOGV("Camera %s: Disconnecting device", mCameraIdStr.string());                                                                                                                                        
                                                                                                                                                                                                            
    // WORKAROUND: HAL refuses to disconnect while there's streams in flight                                                                                                                                
    {                                                                                                                                                                                                       
        int64_t lastFrameNumber;                                                                                                                                                                            
        status_t code;                                                                                                                                                                                      
        if ((code = mDevice->flush(&lastFrameNumber)) != OK) {                                                                                                                                              
            ALOGE("%s: flush failed with code 0x%x", __FUNCTION__, code);                                                                                                                                   
        }                                                                                                                                                                                                   
                                                                                                                                                                                                            
        if ((code = mDevice->waitUntilDrained()) != OK) {                                                                                                                                                   
            ALOGE("%s: waitUntilDrained failed with code 0x%x", __FUNCTION__,                                                                                                                               
                  code);                                                                                                                                                                                    
        }                                                                                                                                                                                                   
    }                                                                                                                                                                                                       
                                                                                                                                                                                                            
    for (size_t i = 0; i < mCompositeStreamMap.size(); i++) {                                                                                                                                               
        auto ret = mCompositeStreamMap.valueAt(i)->deleteInternalStreams();                                                                                                                                 
        if (ret != OK) {                                                                                                                                                                                    
            ALOGE("%s: Failed removing composite stream  %s (%d)", __FUNCTION__,                                                                                                                            
                    strerror(-ret), ret);                                                                                                                                                                   
        }                                                                                                                                                                                                   
    }                                                                                                                                                                                                       
    mCompositeStreamMap.clear();                                                                                                                                                                            
                                                                                                                                                                                                            
    Camera2ClientBase::detachDevice();                                                                                                                                                                      
}                                                                                                                                                                                                           
                                                                                                                                                                                                            
libcameraservice/api2/CameraDeviceClient.cpp
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:30:31  更:2021-08-17 15:30:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/30 22:35:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码