已合并
display和camera修复 #8558
display和camera修复 #8558
已合并
liangpenghui创建于 2月9日
共 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#include <sys/epoll.h>23#include <sys/epoll.h>
24#include <sys/ioctl.h>24#include <sys/ioctl.h>
25#include <sys/types.h>25#include <sys/types.h>
26+#include <shared_mutex>
26#include <unistd.h>27#include <unistd.h>
27#include <sys/eventfd.h>28#include <sys/eventfd.h>
28#include "v4l2_buffer.h"29#include "v4l2_buffer.h"
@@ -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()
263void HosV4L2Dev::loopBuffers()266void HosV4L2Dev::loopBuffers()
264{267{
265#ifndef V4L2_EMULATOR268#ifndef V4L2_EMULATOR
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#else273#else
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#endif281#endif
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#endif301#endif
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 
297RetCode HosV4L2Dev::CreateEpoll(int fd, const unsigned int streamNumber)309RetCode 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 {