已合并
display和camera修复 #8558
liangpenghui创建于 2月9日
display和camera修复 #8558
已合并
共 5 个文件变更+45-20
| @@ -27,6 +27,7 @@ | |||
| 27 | "samgr", | 27 | "samgr", |
| 28 | "init", | 28 | "init", |
| 29 | "ipc", | 29 | "ipc", |
| 30 | + "drivers_tools", | ||
| 30 | "drivers_interface_camera", | 31 | "drivers_interface_camera", |
| 31 | "graphic_surface", | 32 | "graphic_surface", |
| 32 | "c_utils", | 33 | "c_utils", |
| @@ -23,6 +23,7 @@ | |||
| 23 | 23 | ||
| 24 | 24 | ||
| 25 | 25 | ||
| 26 | + | ||
| 26 | 27 | ||
| 27 | 28 | ||
| 28 | 29 | ||
| @@ -123,7 +124,7 @@ private: | |||
| 123 | int epollFd_ = 0; | 124 | int epollFd_ = 0; |
| 124 | std::vector<epoll_event> epollEvent_; | 125 | std::vector<epoll_event> epollEvent_; |
| 125 | std::mutex epollLock_; | 126 | std::mutex epollLock_; |
| 126 | - std::mutex streamLock_; | 127 | + std::shared_mutex streamLock_; |
| 127 | 128 | ||
| 128 | std::shared_ptr<HosV4L2Buffers> myBuffers_ = nullptr; | 129 | std::shared_ptr<HosV4L2Buffers> myBuffers_ = nullptr; |
| 129 | std::shared_ptr<HosV4L2Streams> myStreams_ = nullptr; | 130 | std::shared_ptr<HosV4L2Streams> myStreams_ = nullptr; |
| @@ -242,7 +242,10 @@ void HosV4L2Dev::dequeueBuffers() | |||
| 242 | RetCode rc; | 242 | RetCode rc; |
| 243 | struct epoll_event events[MAXSTREAMCOUNT]; | 243 | struct epoll_event events[MAXSTREAMCOUNT]; |
| 244 | nfds = epoll_wait(epollFd_, events, MAXSTREAMCOUNT, -1); | 244 | nfds = epoll_wait(epollFd_, events, MAXSTREAMCOUNT, -1); |
| 245 | - CAMERA_LOGI("loopBuffers: epoll_wait rc = %{public}d streamNumber_ == %{public}d\n", nfds, streamNumber_); | 245 | + { |
| 246 | + std::shared_lock<std::shared_mutex> lock(streamLock_); | ||
| 247 | + CAMERA_LOGI("loopBuffers: epoll_wait rc = %{public}d streamNumber_ == %{public}d\n", nfds, streamNumber_); | ||
| 248 | + } | ||
| 246 | 249 | ||
| 247 | for (int n = 0; nfds > 0; ++n, --nfds) { | 250 | for (int n = 0; nfds > 0; ++n, --nfds) { |
| 248 | if ((events[n].events & EPOLLIN) && (events[n].data.fd != eventFd_)) { | 251 | if ((events[n].events & EPOLLIN) && (events[n].data.fd != eventFd_)) { |
| @@ -263,18 +266,24 @@ void HosV4L2Dev::dequeueBuffers() | |||
| 263 | void HosV4L2Dev::loopBuffers() | 266 | void HosV4L2Dev::loopBuffers() |
| 264 | { | 267 | { |
| 265 | 268 | ||
| 266 | - CAMERA_LOGI("!!! loopBuffers enter, streamNumber_=%{public}d\n", streamNumber_); | 269 | + { |
| 270 | + std::shared_lock<std::shared_mutex> lock(streamLock_); | ||
| 271 | + CAMERA_LOGI("!!! loopBuffers enter, streamNumber_=%{public}d\n", streamNumber_); | ||
| 272 | + } | ||
| 267 | 273 | ||
| 268 | int rc; | 274 | int rc; |
| 269 | int fd = deviceFd_; | 275 | int fd = deviceFd_; |
| 270 | 276 | ||
| 271 | - CAMERA_LOGI("!!! loopBuffers enter, streamNumber_=%{public}d, fd = %d", streamNumber_, fd); | 277 | + { |
| 278 | + std::shared_lock<std::shared_mutex> lock(streamLock_); | ||
| 279 | + CAMERA_LOGI("!!! loopBuffers enter, streamNumber_=%{public}d, fd = %d", streamNumber_, fd); | ||
| 280 | + } | ||
| 272 | 281 | ||
| 273 | prctl(PR_SET_NAME, "v4l2_loopbuffer"); | 282 | prctl(PR_SET_NAME, "v4l2_loopbuffer"); |
| 274 | 283 | ||
| 275 | while (true) { | 284 | while (true) { |
| 276 | { | 285 | { |
| 277 | - std::lock_guard<std::mutex> l(streamLock_); | 286 | + std::shared_lock<std::shared_mutex> lock(streamLock_); |
| 278 | if (streamNumber_ <= 0) { | 287 | if (streamNumber_ <= 0) { |
| 279 | break; | 288 | break; |
| 280 | } | 289 | } |
| @@ -291,7 +300,10 @@ void HosV4L2Dev::loopBuffers() | |||
| 291 | usleep(SleepTimeUs); | 300 | usleep(SleepTimeUs); |
| 292 | 301 | ||
| 293 | } | 302 | } |
| 294 | - CAMERA_LOGI("!!! loopBuffers exit, streamNumber_=%{public}d\n", streamNumber_); | 303 | + { |
| 304 | + std::shared_lock<std::shared_mutex> lock(streamLock_); | ||
| 305 | + CAMERA_LOGI("!!! loopBuffers exit, streamNumber_=%{public}d\n", streamNumber_); | ||
| 306 | + } | ||
| 295 | } | 307 | } |
| 296 | 308 | ||
| 297 | RetCode HosV4L2Dev::CreateEpoll(int fd, const unsigned int streamNumber) | 309 | RetCode HosV4L2Dev::CreateEpoll(int fd, const unsigned int streamNumber) |
| @@ -390,20 +402,26 @@ RetCode HosV4L2Dev::StartStream(const std::string& cameraID) | |||
| 390 | return RC_ERROR; | 402 | return RC_ERROR; |
| 391 | } | 403 | } |
| 392 | 404 | ||
| 393 | - rc = CreateEpoll(fd, streamNumber_); | 405 | + { |
| 406 | + std::shared_lock<std::shared_mutex> lock(streamLock_); | ||
| 407 | + rc = CreateEpoll(fd, streamNumber_); | ||
| 408 | + } | ||
| 394 | if (rc == RC_ERROR) { | 409 | if (rc == RC_ERROR) { |
| 395 | CAMERA_LOGE("StartStream: CreateEpoll error\n"); | 410 | CAMERA_LOGE("StartStream: CreateEpoll error\n"); |
| 396 | return RC_ERROR; | 411 | return RC_ERROR; |
| 397 | } | 412 | } |
| 398 | 413 | ||
| 399 | - if (streamNumber_ == 0) { | 414 | + { |
| 400 | - streamNumber_++; | 415 | + std::unique_lock<std::shared_mutex> lock(streamLock_); |
| 401 | - CAMERA_LOGI("go start thread loopBuffers, streamNumber_=%{public}d\n", streamNumber_); | 416 | + if (streamNumber_ == 0) { |
| 402 | - streamThread_ = new (std::nothrow) std::thread([this] {this->loopBuffers();}); | 417 | + streamNumber_++; |
| 403 | - if (streamThread_ == nullptr) { | 418 | + CAMERA_LOGI("go start thread loopBuffers, streamNumber_=%{public}d\n", streamNumber_); |
| 404 | - CAMERA_LOGE("V4L2 StartStream start thread failed\n"); | 419 | + streamThread_ = new (std::nothrow) std::thread([this] {this->loopBuffers();}); |
| 405 | - streamNumber_--; | 420 | + if (streamThread_ == nullptr) { |
| 406 | - return RC_ERROR; | 421 | + CAMERA_LOGE("V4L2 StartStream start thread failed\n"); |
| 422 | + streamNumber_--; | ||
| 423 | + return RC_ERROR; | ||
| 424 | + } | ||
| 407 | } | 425 | } |
| 408 | } | 426 | } |
| 409 | CAMERA_LOGI("StartStream out, cameraID = %{public}s\n", cameraID.c_str()); | 427 | CAMERA_LOGI("StartStream out, cameraID = %{public}s\n", cameraID.c_str()); |
| @@ -426,7 +444,7 @@ RetCode HosV4L2Dev::StopStream(const std::string& cameraID) | |||
| 426 | 444 | ||
| 427 | unsigned int streamNum = 0; | 445 | unsigned int streamNum = 0; |
| 428 | { | 446 | { |
| 429 | - std::lock_guard<std::mutex> l(streamLock_); | 447 | + std::unique_lock<std::shared_mutex> lock(streamLock_); |
| 430 | streamNum = --streamNumber_; | 448 | streamNum = --streamNumber_; |
| 431 | CAMERA_LOGI("HosV4L2Dev::StopStream streamNumber_ = %{public}d\n", streamNumber_); | 449 | CAMERA_LOGI("HosV4L2Dev::StopStream streamNumber_ = %{public}d\n", streamNumber_); |
| 432 | } | 450 | } |
| @@ -450,7 +468,7 @@ RetCode HosV4L2Dev::StopStream(const std::string& cameraID) | |||
| 450 | 468 | ||
| 451 | EraseEpoll(fd); | 469 | EraseEpoll(fd); |
| 452 | { | 470 | { |
| 453 | - std::lock_guard<std::mutex> l(streamLock_); | 471 | + std::shared_lock<std::shared_mutex> lock(streamLock_); |
| 454 | if (streamNumber_ == 0) { | 472 | if (streamNumber_ == 0) { |
| 455 | close(epollFd_); | 473 | close(epollFd_); |
| 456 | delete streamThread_; | 474 | delete streamThread_; |
| @@ -55,9 +55,9 @@ ohos_shared_library("display_composer_vdi_impl_default") { | |||
| 55 | ] | 55 | ] |
| 56 | external_deps = [ | 56 | external_deps = [ |
| 57 | "c_utils:utils", | 57 | "c_utils:utils", |
| 58 | - "drivers_interface_display:libdisplay_buffer_stub_1.0", | 58 | + "drivers_interface_display:libdisplay_buffer_stub_1.2", |
| 59 | "drivers_interface_display:libdisplay_composer_hdi_impl_1.2", | 59 | "drivers_interface_display:libdisplay_composer_hdi_impl_1.2", |
| 60 | - "drivers_interface_display:libdisplay_composer_stub_1.0", | 60 | + "drivers_interface_display:libdisplay_composer_stub_1.3", |
| 61 | "graphic_surface:buffer_handle", | 61 | "graphic_surface:buffer_handle", |
| 62 | "hdf_core:libhdf_utils", | 62 | "hdf_core:libhdf_utils", |
| 63 | "hilog:libhilog", | 63 | "hilog:libhilog", |
| @@ -298,8 +298,13 @@ bool DrmConnector::HandleHotplug(IdMapPtr<DrmEncoder> &encoders, | |||
| 298 | DISPLAY_LOGE("drm atomic alloc failed errno %{public}d", errno)); | 298 | DISPLAY_LOGE("drm atomic alloc failed errno %{public}d", errno)); |
| 299 | 299 | ||
| 300 | drmModeConnectorPtr c = drmModeGetConnector(drmFd, mId); | 300 | drmModeConnectorPtr c = drmModeGetConnector(drmFd, mId); |
| 301 | - DISPLAY_CHK_RETURN((c == nullptr), false, DISPLAY_LOGE("can not get connector")); | 301 | + if (c == nullptr) { |
| 302 | + DISPLAY_LOGE("can not get connector"); | ||
| 303 | + drmModeAtomicFree(pset); | ||
| 304 | + return false; | ||
| 305 | + } | ||
| 302 | if (mConnectState == c->connection) { | 306 | if (mConnectState == c->connection) { |
| 307 | + drmModeAtomicFree(pset); | ||
| 303 | drmModeFreeConnector(c); | 308 | drmModeFreeConnector(c); |
| 304 | return false; | 309 | return false; |
| 305 | } else { | 310 | } else { |