{"object_kind":"push","event_name":"push","before":"f03a55d7f57af10eae34bf47dcebfdfbeb66d31f","after":"acea30afaaa0022f9ea134ce876cea12b1b1bcf0","ref":"refs/heads/master","ref_protected":true,"checkout_sha":"acea30afaaa0022f9ea134ce876cea12b1b1bcf0","message":null,"user_id":3060,"user_name":"Wim Taymans","user_username":"wtaymans","user_email":"","user_avatar":"https://secure.gravatar.com/avatar/1ca1bed246cb9b95b7ead6d6be96bb09f0c112953140c8bb38b41aedf4465270?s=80&d=identicon","project_id":4753,"project":{"id":4753,"name":"pipewire","description":"Multimedia processing graphs","web_url":"https://gitlab.freedesktop.org/pipewire/pipewire","avatar_url":"https://gitlab.freedesktop.org/uploads/-/system/project/avatar/4753/pipewire.png","git_ssh_url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","git_http_url":"https://gitlab.freedesktop.org/pipewire/pipewire.git","namespace":"PipeWire","visibility_level":20,"path_with_namespace":"pipewire/pipewire","default_branch":"master","ci_config_path":"","homepage":"https://gitlab.freedesktop.org/pipewire/pipewire","url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","ssh_url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","http_url":"https://gitlab.freedesktop.org/pipewire/pipewire.git"},"commits":[{"id":"c4309f0eb5667f15c6c98a3ab19ea2c6f45afa3e","message":"gst: clamp a fraction that does not fit a GstFraction\n\nA SPA fraction is a pair of uint32; a GstFraction is a pair of gint. The\nconversion passed the values on unchecked, so a denominator above INT32_MAX\narrived as a negative number, gst_caps_set_simple() decided the range started\nafter it ended, and dropped it - taking the whole framerate field out of the\ncaps with it.\n\nIt is reachable from an ordinary driver, not only from a contrived one. A V4L2\nsource that reports a long maximum frame interval inverts into a small framerate\nwhose denominator is that interval's numerator. v4l2loopback uses UINT32_MAX\nthere, and so does the in-tree mgb4 capture driver, where\n0xFFFFFFFF / MGB4_HW_FREQ is an unremarkable \"slowest frame\" of 34 seconds.\n\nMeasured on v4l2loopback with no producer attached, which advertises\n\"Continuous 0.001s - 4294967295.000s\":\n\n GStreamer CRITICALs framerate in the device caps\n before 77 absent\n after 0 [ 1/2147483647, 1000/1 ]\n\nReduce the fraction first, which is exact and enough for mgb4 - the gcd is 5, so\n125000000/4294967295 becomes 25000000/858993459 - and scale only when that still\ndoes not fit, which is v4l2loopback's irreducible 1/UINT32_MAX. Do not let a\nvery small rate round down to 0/1, which is how GStreamer spells a variable\nframe rate.\n\nSigned-off-by: Viorel Cernateanu \n","title":"gst: clamp a fraction that does not fit a GstFraction","timestamp":"2026-08-22T21:09:44+03:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/c4309f0eb5667f15c6c98a3ab19ea2c6f45afa3e","author":{"name":"Viorel Cernateanu","email":"vrilutza@gmail.com"},"added":[],"modified":["src/gst/gstpipewireformat.c"],"removed":[]},{"id":"acea30afaaa0022f9ea134ce876cea12b1b1bcf0","message":"gst: keep the value a source prefers when converting a choice to caps\n\nA SPA choice carries a preferred value in values[0] and the bounds after it. The\nconversion to GStreamer caps keeps the bounds and drops the preference, and\ngst_caps_fixate() resolves a range to its minimum, so anything that fixates the\ncaps of a PipeWire device lands at the bottom of every range the source offers.\n\nThis is not the negotiation path: gst_pipewire_src_negotiate() does not fixate,\nit hands the caps to pw_stream_connect() as a filter and the server picks. It is\nthe caps a GstDeviceMonitor reports for a device, built in\ngstpipewiredeviceprovider.c, which is what an application looks at when it asks\nwhat a camera can do.\n\nMeasured on a vivid source advertising 16x16 - 16384x8640 with a native 720x576,\narms interleaved:\n\n structures fixating the device caps gives\n without this patch 82 16x16\n with this patch 82 720x576\n\nKeep the preferred value as the first entry of a list with the range behind it,\n\n width = { 1296, [ 320, 1296 ] }\n\nrather than prepending a copy of the caps with the value set. Both fixate to the\npreferred value and both leave a consumer with a preference of its own free to\npick from the range, but the copy doubles the structure count per property - 82\nto 164 for the frame size alone - so it cannot be done for more than one.\n\nThat is what makes it general: the same two helpers are used from\nhandle_int_prop(), handle_rect_prop() and handle_fraction_prop(), which all\ndropped values[0] the same way. A source advertising a framerate range was read\nat its lowest frame rate for exactly the same reason.\n\nThis sits on top of the clamping in the previous commit: the helper it adds hands\nthe same uint32 pair to a gint API, so without it a source whose frame interval\nrange does not fit would still lose its framerate entirely.\n\nSigned-off-by: Viorel Cernateanu \n","title":"gst: keep the value a source prefers when converting a choice to caps","timestamp":"2026-08-22T21:09:56+03:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/acea30afaaa0022f9ea134ce876cea12b1b1bcf0","author":{"name":"Viorel Cernateanu","email":"vrilutza@gmail.com"},"added":[],"modified":["src/gst/gstpipewireformat.c"],"removed":[]}],"total_commits_count":2,"push_options":{},"repository":{"name":"pipewire","url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","description":"Multimedia processing graphs","homepage":"https://gitlab.freedesktop.org/pipewire/pipewire","git_http_url":"https://gitlab.freedesktop.org/pipewire/pipewire.git","git_ssh_url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","visibility_level":20}}