buffer: add option to reverse filter priority

By default, buffer negotiation favours the default property values of
the output node. Make this configurable and reverse this logic when the
output is a driver.

This makes it so that a stream connecting to a source will negotiate
with the preferences of the stream and not the source.

An example is a stream that wants 4 buffers from v4l2-source, because
v4l2-source has a default of 4 buffers, this will always result in 4
buffers, ignoring the preference of the stream.
This commit is contained in:
Wim Taymans 2022-11-04 15:22:01 +01:00
parent 503bb94645
commit 7631316186
3 changed files with 10 additions and 0 deletions

View file

@ -255,6 +255,12 @@ int pw_buffers_negotiate(struct pw_context *context, uint32_t flags,
struct port input = { innode, SPA_DIRECTION_INPUT, in_port_id };
int res;
if (flags & PW_BUFFERS_FLAG_IN_PRIORITY) {
struct port tmp = output;
output = input;
input = tmp;
}
res = param_filter(result, &input, &output, SPA_PARAM_Buffers, &b);
if (res < 0) {
pw_context_debug_port_params(context, input.node, input.direction,

View file

@ -48,6 +48,7 @@ extern "C" {
#define PW_BUFFERS_FLAG_SHARED (1<<1) /**< buffers can be shared */
#define PW_BUFFERS_FLAG_DYNAMIC (1<<2) /**< buffers have dynamic data */
#define PW_BUFFERS_FLAG_SHARED_MEM (1<<3) /**< buffers need shared memory */
#define PW_BUFFERS_FLAG_IN_PRIORITY (1<<4) /**< input parameters have priority */
struct pw_buffers {
struct pw_memblock *mem; /**< allocated buffer memory */

View file

@ -517,6 +517,9 @@ static int do_allocation(struct pw_impl_link *this)
if (output->node->remote || input->node->remote)
alloc_flags |= PW_BUFFERS_FLAG_SHARED_MEM;
if (output->node->driver)
alloc_flags |= PW_BUFFERS_FLAG_IN_PRIORITY;
/* if output port can alloc buffers, alloc skeleton buffers */
if (SPA_FLAG_IS_SET(out_flags, SPA_PORT_FLAG_CAN_ALLOC_BUFFERS)) {
SPA_FLAG_SET(alloc_flags, PW_BUFFERS_FLAG_NO_MEM);