test: libtest: buffer_source: Close video device right after allocation

There's no need to keep the video device open after allocating buffers,
as V4L2 supports buffer orphaning and the exported buffers will still be
usable. Close the device right after allocation to avoid the need for
delayed cleanups.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2020-03-14 16:18:08 +02:00
parent aaf1ce50f9
commit 556e03fea7
2 changed files with 9 additions and 16 deletions

View file

@ -8,26 +8,18 @@
#include "buffer_source.h" #include "buffer_source.h"
#include <iostream> #include <iostream>
#include <memory>
#include "device_enumerator.h" #include "device_enumerator.h"
#include "test.h" #include "test.h"
BufferSource::BufferSource() BufferSource::BufferSource()
: video_(nullptr)
{ {
} }
BufferSource::~BufferSource() BufferSource::~BufferSource()
{ {
if (video_) {
video_->releaseBuffers();
video_->close();
}
delete video_;
video_ = nullptr;
if (media_) if (media_)
media_->release(); media_->release();
} }
@ -58,37 +50,39 @@ int BufferSource::allocate(const StreamConfiguration &config)
return TestSkip; return TestSkip;
} }
video_ = V4L2VideoDevice::fromEntityName(media_.get(), videoDeviceName); std::unique_ptr<V4L2VideoDevice> video{ V4L2VideoDevice::fromEntityName(media_.get(), videoDeviceName) };
if (!video_) { if (!video) {
std::cout << "Failed to get video device from entity " std::cout << "Failed to get video device from entity "
<< videoDeviceName << std::endl; << videoDeviceName << std::endl;
return TestFail; return TestFail;
} }
if (video_->open()) { if (video->open()) {
std::cout << "Unable to open " << videoDeviceName << std::endl; std::cout << "Unable to open " << videoDeviceName << std::endl;
return TestFail; return TestFail;
} }
/* Configure the format. */ /* Configure the format. */
V4L2DeviceFormat format; V4L2DeviceFormat format;
if (video_->getFormat(&format)) { if (video->getFormat(&format)) {
std::cout << "Failed to get format on output device" << std::endl; std::cout << "Failed to get format on output device" << std::endl;
return TestFail; return TestFail;
} }
format.size = config.size; format.size = config.size;
format.fourcc = V4L2VideoDevice::toV4L2Fourcc(config.pixelFormat, false); format.fourcc = V4L2VideoDevice::toV4L2Fourcc(config.pixelFormat, false);
if (video_->setFormat(&format)) { if (video->setFormat(&format)) {
std::cout << "Failed to set format on output device" << std::endl; std::cout << "Failed to set format on output device" << std::endl;
return TestFail; return TestFail;
} }
if (video_->exportBuffers(config.bufferCount, &buffers_) < 0) { if (video->exportBuffers(config.bufferCount, &buffers_) < 0) {
std::cout << "Failed to export buffers" << std::endl; std::cout << "Failed to export buffers" << std::endl;
return TestFail; return TestFail;
} }
video->close();
return TestPass; return TestPass;
} }

View file

@ -25,7 +25,6 @@ public:
private: private:
std::shared_ptr<MediaDevice> media_; std::shared_ptr<MediaDevice> media_;
V4L2VideoDevice *video_;
std::vector<std::unique_ptr<FrameBuffer>> buffers_; std::vector<std::unique_ptr<FrameBuffer>> buffers_;
}; };