libcamera/monitors: rebase libcamera monitor into a bunch of hooks
This commit is contained in:

committed by
George Kiagiadakis

parent
6596d71c4f
commit
bb0e15e631
53
src/scripts/monitors/libcamera/create-device.lua
Normal file
53
src/scripts/monitors/libcamera/create-device.lua
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
-- WirePlumber
|
||||||
|
--
|
||||||
|
-- Copyright © 2023 Collabora Ltd.
|
||||||
|
-- @author Ashok Sidipotu <ashok.sidipotu@collabora.com>
|
||||||
|
--
|
||||||
|
-- SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
local cutils = require ("common-utils")
|
||||||
|
|
||||||
|
log = Log.open_topic ("s-monitors-libcam")
|
||||||
|
|
||||||
|
function createLibcamNode (parent, id, type, factory, properties)
|
||||||
|
source = source or Plugin.find ("standard-event-source")
|
||||||
|
|
||||||
|
local e = source:call ("create-event", "create-libcam-device-node",
|
||||||
|
parent, properties)
|
||||||
|
e:set_data ("factory", factory)
|
||||||
|
e:set_data ("node-sub-id", id)
|
||||||
|
|
||||||
|
EventDispatcher.push_event (e)
|
||||||
|
end
|
||||||
|
|
||||||
|
SimpleEventHook {
|
||||||
|
name = "monitor/libcam/create-device",
|
||||||
|
after = "monitor/libcam/name-device",
|
||||||
|
interests = {
|
||||||
|
EventInterest {
|
||||||
|
Constraint { "event.type", "=", "create-libcam-device" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
execute = function(event)
|
||||||
|
local properties = event:get_data ("device-properties")
|
||||||
|
local factory = event:get_data ("factory")
|
||||||
|
local parent = event:get_subject ()
|
||||||
|
local id = event:get_data ("device-sub-id")
|
||||||
|
|
||||||
|
-- apply properties from rules defined in JSON .conf file
|
||||||
|
cutils.evaluateRulesApplyProperties (properties, "monitor.libcamera.rules")
|
||||||
|
if properties ["device.disabled"] then
|
||||||
|
log:warning ("lib cam device " .. properties ["device.name"] .. " disabled")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local device = SpaDevice (factory, properties)
|
||||||
|
|
||||||
|
if device then
|
||||||
|
device:connect ("create-object", createLibcamNode)
|
||||||
|
device:activate (Feature.SpaDevice.ENABLED | Feature.Proxy.BOUND)
|
||||||
|
parent:store_managed_object (id, device)
|
||||||
|
else
|
||||||
|
log:warning ("Failed to create '" .. factory .. "' device")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}:register ()
|
37
src/scripts/monitors/libcamera/create-node.lua
Normal file
37
src/scripts/monitors/libcamera/create-node.lua
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
-- WirePlumber
|
||||||
|
--
|
||||||
|
-- Copyright © 2023 Collabora Ltd.
|
||||||
|
-- @author Ashok Sidipotu <ashok.sidipotu@collabora.com>
|
||||||
|
--
|
||||||
|
-- SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
local cutils = require ("common-utils")
|
||||||
|
local mutils = require ("monitor-utils")
|
||||||
|
|
||||||
|
log = Log.open_topic ("s-monitors-libcam")
|
||||||
|
|
||||||
|
SimpleEventHook {
|
||||||
|
name = "monitor/libcam/create-node",
|
||||||
|
after = "monitor/libcam/name-node",
|
||||||
|
interests = {
|
||||||
|
EventInterest {
|
||||||
|
Constraint { "event.type", "=", "create-libcam-device-node" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
execute = function(event)
|
||||||
|
local properties = event:get_data ("node-properties")
|
||||||
|
local parent = event:get_subject ()
|
||||||
|
local id = event:get_data ("node-sub-id")
|
||||||
|
|
||||||
|
-- apply properties from rules defined in JSON .conf file
|
||||||
|
cutils.evaluateRulesApplyProperties (properties, "monitor.libcamera.rules")
|
||||||
|
if properties["node.disabled"] then
|
||||||
|
log:warning ("lib cam device node" .. properties["device.name"] .. " disabled")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- create the node
|
||||||
|
local node = Node ("spa-node-factory", properties)
|
||||||
|
node:activate (Feature.Proxy.BOUND)
|
||||||
|
parent:store_managed_object (id, node)
|
||||||
|
end
|
||||||
|
}:register ()
|
32
src/scripts/monitors/libcamera/enumerate-device.lua
Normal file
32
src/scripts/monitors/libcamera/enumerate-device.lua
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
-- WirePlumber
|
||||||
|
--
|
||||||
|
-- Copyright © 2023 Collabora Ltd.
|
||||||
|
-- @author Ashok Sidipotu <ashok.sidipotu@collabora.com>
|
||||||
|
--
|
||||||
|
-- SPDX-License-Identifier: MIT
|
||||||
|
log = Log.open_topic ("s-monitors-libcam")
|
||||||
|
|
||||||
|
local defaults = {}
|
||||||
|
defaults.properties = Json.Object {}
|
||||||
|
|
||||||
|
local config = {}
|
||||||
|
config.properties = Conf.get_section (
|
||||||
|
"monitor.libcamera.properties", defaults.properties):parse ()
|
||||||
|
|
||||||
|
function createCamDevice (parent, id, type, factory, properties)
|
||||||
|
source = source or Plugin.find ("standard-event-source")
|
||||||
|
|
||||||
|
local e = source:call ("create-event", "create-libcam-device", parent, properties)
|
||||||
|
e:set_data ("factory", factory)
|
||||||
|
e:set_data ("device-sub-id", id)
|
||||||
|
|
||||||
|
EventDispatcher.push_event (e)
|
||||||
|
end
|
||||||
|
|
||||||
|
monitor = SpaDevice ("api.libcamera.enum.manager", config.properties)
|
||||||
|
if monitor then
|
||||||
|
monitor:connect ("create-object", createCamDevice)
|
||||||
|
monitor:activate (Feature.SpaDevice.ENABLED)
|
||||||
|
else
|
||||||
|
log:notice ("PipeWire's libcamera SPA missing or broken. libcamera not supported.")
|
||||||
|
end
|
49
src/scripts/monitors/libcamera/name-device.lua
Normal file
49
src/scripts/monitors/libcamera/name-device.lua
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
-- WirePlumber
|
||||||
|
--
|
||||||
|
-- Copyright © 2023 Collabora Ltd.
|
||||||
|
-- @author Ashok Sidipotu <ashok.sidipotu@collabora.com>
|
||||||
|
--
|
||||||
|
-- SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
local mutils = require ("monitor-utils")
|
||||||
|
|
||||||
|
log = Log.open_topic ("s-monitors-libcam")
|
||||||
|
|
||||||
|
SimpleEventHook {
|
||||||
|
name = "monitor/libcam/name-device",
|
||||||
|
interests = {
|
||||||
|
EventInterest {
|
||||||
|
Constraint { "event.type", "=", "create-libcam-device" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
execute = function(event)
|
||||||
|
local properties = event:get_properties ()
|
||||||
|
local parent = event:get_subject ()
|
||||||
|
local id = event:get_data ("device-sub-id")
|
||||||
|
|
||||||
|
local name = "libcamera_device." ..
|
||||||
|
(properties["device.name"] or
|
||||||
|
properties["device.bus-id"] or
|
||||||
|
properties["device.bus-path"] or
|
||||||
|
tostring (id)):gsub ("([^%w_%-%.])", "_")
|
||||||
|
|
||||||
|
properties["device.name"] = name
|
||||||
|
|
||||||
|
-- deduplicate devices with the same name
|
||||||
|
for counter = 2, 99, 1 do
|
||||||
|
if mutils.findDuplicate (parent, id, "device.name", properties["node.name"]) then
|
||||||
|
properties["device.name"] = name .. "." .. counter
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- ensure the device has a description
|
||||||
|
properties["device.description"] =
|
||||||
|
properties["device.description"]
|
||||||
|
or properties["device.product.name"]
|
||||||
|
or "Unknown device"
|
||||||
|
|
||||||
|
event:set_data ("device-properties", properties)
|
||||||
|
end
|
||||||
|
}:register ()
|
89
src/scripts/monitors/libcamera/name-node.lua
Normal file
89
src/scripts/monitors/libcamera/name-node.lua
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
-- WirePlumber
|
||||||
|
--
|
||||||
|
-- Copyright © 2023 Collabora Ltd.
|
||||||
|
-- @author Ashok Sidipotu <ashok.sidipotu@collabora.com>
|
||||||
|
--
|
||||||
|
-- SPDX-License-Identifier: MIT
|
||||||
|
local mutils = require ("monitor-utils")
|
||||||
|
|
||||||
|
log = Log.open_topic ("s-monitors-libcam")
|
||||||
|
|
||||||
|
SimpleEventHook {
|
||||||
|
name = "monitor/libcam/name-node",
|
||||||
|
interests = {
|
||||||
|
EventInterest {
|
||||||
|
Constraint { "event.type", "=", "create-libcam-device-node" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
execute = function(event)
|
||||||
|
local properties = event:get_properties ()
|
||||||
|
local parent = event:get_subject ()
|
||||||
|
local dev_props = parent.properties
|
||||||
|
local factory = event:get_data ("factory")
|
||||||
|
local id = event:get_data ("node-sub-id")
|
||||||
|
local location = properties ["api.libcamera.location"]
|
||||||
|
|
||||||
|
-- set the device id and spa factory name; REQUIRED, do not change
|
||||||
|
properties ["device.id"] = parent ["bound-id"]
|
||||||
|
properties ["factory.name"] = factory
|
||||||
|
|
||||||
|
-- set the default pause-on-idle setting
|
||||||
|
properties ["node.pause-on-idle"] = false
|
||||||
|
|
||||||
|
-- set the node name
|
||||||
|
local name =
|
||||||
|
(factory:find ("sink") and "libcamera_output") or
|
||||||
|
(factory:find ("source") and "libcamera_input" or factory)
|
||||||
|
.. "." ..
|
||||||
|
(dev_props ["device.name"]:gsub ("^libcamera_device%.(.+)", "%1") or
|
||||||
|
dev_props ["device.name"] or
|
||||||
|
dev_props ["device.nick"] or
|
||||||
|
dev_props ["device.alias"] or
|
||||||
|
"libcamera-device")
|
||||||
|
-- sanitize name
|
||||||
|
name = name:gsub ("([^%w_%-%.])", "_")
|
||||||
|
|
||||||
|
properties ["node.name"] = name
|
||||||
|
|
||||||
|
-- deduplicate nodes with the same name
|
||||||
|
for counter = 2, 99, 1 do
|
||||||
|
if mutils.findDuplicate (parent, id, "node.name", properties ["node.name"]) then
|
||||||
|
properties ["node.name"] = name .. "." .. counter
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- set the node description
|
||||||
|
local desc = dev_props ["device.description"] or "libcamera-device"
|
||||||
|
if location == "front" then
|
||||||
|
desc = I18n.gettext ("Built-in Front Camera")
|
||||||
|
elseif location == "back" then
|
||||||
|
desc = I18n.gettext ("Built-in Back Camera")
|
||||||
|
end
|
||||||
|
-- sanitize description, replace ':' with ' '
|
||||||
|
properties ["node.description"] = desc:gsub ("(:)", " ")
|
||||||
|
|
||||||
|
-- set the node nick
|
||||||
|
local nick = properties ["node.nick"] or
|
||||||
|
dev_props ["device.product.name"] or
|
||||||
|
dev_props ["device.description"] or
|
||||||
|
dev_props ["device.nick"]
|
||||||
|
properties ["node.nick"] = nick:gsub ("(:)", " ")
|
||||||
|
|
||||||
|
-- set priority
|
||||||
|
if not properties ["priority.session"] then
|
||||||
|
local priority = 700
|
||||||
|
if location == "external" then
|
||||||
|
priority = priority + 150
|
||||||
|
elseif location == "front" then
|
||||||
|
priority = priority + 100
|
||||||
|
elseif location == "back" then
|
||||||
|
priority = priority + 50
|
||||||
|
end
|
||||||
|
properties ["priority.session"] = priority
|
||||||
|
end
|
||||||
|
|
||||||
|
event:set_data ("node-properties", properties)
|
||||||
|
end
|
||||||
|
}:register ()
|
Reference in New Issue
Block a user