Fix "error: too many arguments to function media_get_entity_by_name()"

Since the official v4l-utils-1.12.0 release, media_get_entity_by_name() function expects
only two arguments instead of three as in older versions thus breaking build of eglfs_kms_vsp2
backend.

Cf. https://git.linuxtv.org/v4l-utils.git/tree/utils/media-ctl/mediactl.h#n253

Fixes it by creating an overloaded wrapper function that will choose the right
version based on the signature of the media_get_entity_by_name function pointer
argument.

Fixes: QTBUG-73427
Change-Id: Idab52558b6f2f23137456c21e33ece1ef0e9aa4e
Reviewed-by: Johan Helsing <johan.helsing@qt.io>
bb10
Boubacar DIENE 2019-01-31 00:12:16 +01:00 committed by Johan Helsing
parent eb60877fe9
commit b319d14110
1 changed files with 23 additions and 2 deletions

View File

@ -273,9 +273,30 @@ bool QLinuxMediaDevice::disableLink(struct media_link *link)
return true;
}
media_entity *QLinuxMediaDevice::getEntity(const QString &name)
// Between the v4l-utils 1.10 and 1.12 releases, media_get_entity_by_name changed signature,
// i.e. breaking source compatibility. Unfortunately the v4l-utils version is not exposed
// through anything we can use through a regular ifdef so here we do a hack and create two
// overloads for a function based on the signature of the function pointer argument. This
// means that by calling safeGetEntity with media_get_entity_by_name as an argument, the
// compiler will pick the correct version.
//
// v4l-utils v1.12 and later
static struct media_entity *safeGetEntity(struct media_entity *(get_entity_by_name_fn)(struct media_device *, const char *),
struct media_device *device, const QString &name)
{
struct media_entity *entity = media_get_entity_by_name(m_mediaDevice, name.toStdString().c_str(), name.length());
return get_entity_by_name_fn(device, name.toStdString().c_str());
}
// v4l-utils v1.10 and earlier
static struct media_entity *safeGetEntity(struct media_entity *(get_entity_by_name_fn)(struct media_device *, const char *, size_t),
struct media_device *device,
const QString &name)
{
return get_entity_by_name_fn(device, name.toStdString().c_str(), name.length());
}
struct media_entity *QLinuxMediaDevice::getEntity(const QString &name)
{
struct media_entity *entity = safeGetEntity(media_get_entity_by_name, m_mediaDevice, name);
if (!entity)
qWarning() << "Failed to get media entity:" << name;