libcamera: media_device: Only read device information in populate()

There is no reason to reread the MEDIA_IOC_DEVICE_INFO information every
time the media device is opened. Move it populate() where it will be
read once together the other information about the media device.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Niklas Söderlund 2019-04-14 00:37:47 +02:00
parent 5868d73e77
commit ef30be09eb

View file

@ -126,18 +126,11 @@ bool MediaDevice::acquire()
*/ */
/** /**
* \brief Open a media device and retrieve device information * \brief Open the media device
*
* Before populating the media graph or performing any operation that interact
* with the device node associated with the media device, the device node must
* be opened.
*
* This function also retrieves media device information from the device node,
* which can be queried through driver().
*
* If the device is already open the function returns -EBUSY.
* *
* \return 0 on success or a negative error code otherwise * \return 0 on success or a negative error code otherwise
* \retval -EBUSY Media device already open
* \sa close()
*/ */
int MediaDevice::open() int MediaDevice::open()
{ {
@ -156,20 +149,6 @@ int MediaDevice::open()
} }
fd_ = ret; fd_ = ret;
struct media_device_info info = { };
ret = ioctl(fd_, MEDIA_IOC_DEVICE_INFO, &info);
if (ret) {
ret = -errno;
LOG(MediaDevice, Error)
<< "Failed to get media device info "
<< ": " << strerror(-ret);
return ret;
}
driver_ = info.driver;
model_ = info.model;
version_ = info.media_version;
return 0; return 0;
} }
@ -196,12 +175,13 @@ void MediaDevice::close()
} }
/** /**
* \brief Populate the media graph with media objects * \brief Populate the MediaDevice with device information and media objects
* *
* This function enumerates all media objects in the media device graph and * This function retrieves the media device information and enumerates all
* creates their MediaObject representations. All entities, pads and links are * media objects in the media device graph and creates their MediaObject
* stored as MediaEntity, MediaPad and MediaLink respectively, with cross- * representations. All entities, pads and links are stored as MediaEntity,
* references between objects. Interfaces are not processed. * MediaPad and MediaLink respectively, with cross-references between objects.
* Interfaces are not processed.
* *
* Entities are stored in a separate list in the MediaDevice to ease lookup, * Entities are stored in a separate list in the MediaDevice to ease lookup,
* while pads are accessible from the entity they belong to and links from the * while pads are accessible from the entity they belong to and links from the
@ -225,6 +205,19 @@ int MediaDevice::populate()
if (ret) if (ret)
return ret; return ret;
struct media_device_info info = {};
ret = ioctl(fd_, MEDIA_IOC_DEVICE_INFO, &info);
if (ret) {
ret = -errno;
LOG(MediaDevice, Error)
<< "Failed to get media device info " << strerror(-ret);
goto done;
}
driver_ = info.driver;
model_ = info.model;
version_ = info.media_version;
/* /*
* Keep calling G_TOPOLOGY until the version number stays stable. * Keep calling G_TOPOLOGY until the version number stays stable.
*/ */