Ensure we prefer video/x-raw over image/jpeg for the viewfinder
Continuation of https://gitlab.gnome.org/GNOME/Incubator/snapshot/-/issues/48#note_1736567
Apparently it's common that frame rates for image/jpeg
are reported higher than the devices can reliably provide - e.g. the sensor can only archive them if there's a lot of light. video/x-raw
apparently gets reported more pessimistic/realistic and is arguably more optimal for the viewfinder any way (as we don't have to decode it first).
Thus I'd like to suggest we always prefer video/x-raw
if available, using image/jpeg
strictly as a fallback.
Example data
flatpak run --command=sh org.gnome.Snapshot
[📦 org.gnome.Snapshot ~]$ gst-device-monitor-1.0 Video/Source
Probing devices...
Device found:
name : Front Camera (V4L2)
class : Video/Source
caps : image/jpeg, width=1600, height=1200, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
image/jpeg, width=1280, height=800, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
image/jpeg, width=1280, height=720, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
image/jpeg, width=800, height=600, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
image/jpeg, width=640, height=480, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
image/jpeg, width=320, height=240, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
image/jpeg, width=160, height=120, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
video/x-raw, format=YUY2, width=1600, height=1200, framerate=5/1
video/x-raw, format=YUY2, width=640, height=480, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
video/x-raw, format=YUY2, width=320, height=240, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
video/x-raw, format=YUY2, width=160, height=120, framerate={ (fraction)30/1, (fraction)25/1, (fraction)20/1, (fraction)15/1, (fraction)10/1, (fraction)5/1 }
properties:
api.v4l2.cap.bus_info = usb-0000:00:14.0-5
api.v4l2.cap.capabilities = 84a00001
api.v4l2.cap.card = Front Camera: Front Camera
api.v4l2.cap.device-caps = 04200001
api.v4l2.cap.driver = uvcvideo
api.v4l2.cap.version = 6.3.0
api.v4l2.path = /dev/video0
device.api = v4l2
device.id = 40
device.product.id = 0x636
device.vendor.id = 0x0c4
factory.name = api.v4l2.source
media.class = Video/Source
node.description = Front Camera (V4L2)
node.name = v4l2_input.pci-0000_00_14.0-usb-0_5_1.0
node.nick = Front Camera
node.pause-on-idle = false
object.path = v4l2:/dev/video0
priority.session = 1000
factory.id = 10
client.id = 34
clock.quantum-limit = 8192
media.role = Camera
node.driver = true
object.id = 43
object.serial = 43
gst-launch-1.0 pipewiresrc target-object=43 ! ...