Browse Source

linux-capture: Add fallback for PipeWire < 0.3.40

Proper DMA-BUF format and modifier negotiation is possible with PipeWire
0.3.40. This commit adds checks for older versions and allows to build
against them.

These are classified as follows:
* PipeWire server older than 0.3.24: Restrict to SHM only
* PipeWire server between 0.3.24 (incl.) and 0.3.40: Announce modifiers
  along with the old method. On failed import drop all modifiers.
* PipeWire server 0.3.40 and newer: Announce modifiers along with the
  old method. On failed import drop only a single modifier.
columbarius 4 years ago
parent
commit
13693bd199
1 changed files with 13 additions and 2 deletions
  1. 13 2
      plugins/linux-capture/pipewire.c

+ 13 - 2
plugins/linux-capture/pipewire.c

@@ -446,9 +446,11 @@ static bool build_format_params(obs_pipewire_data *obs_pw,
 		return false;
 		return false;
 	}
 	}
 
 
+	if (!check_pw_version(&obs_pw->server_version, 0, 3, 33))
+		goto build_shm;
+
 	for (size_t i = 0; i < obs_pw->format_info.num; i++) {
 	for (size_t i = 0; i < obs_pw->format_info.num; i++) {
-		if (obs_pw->format_info.array[i].modifiers.num == 0 ||
-		    !check_pw_version(&obs_pw->server_version, 0, 3, 33)) {
+		if (obs_pw->format_info.array[i].modifiers.num == 0) {
 			continue;
 			continue;
 		}
 		}
 		params[params_count++] = build_format(
 		params[params_count++] = build_format(
@@ -457,6 +459,8 @@ static bool build_format_params(obs_pipewire_data *obs_pw,
 			obs_pw->format_info.array[i].modifiers.array,
 			obs_pw->format_info.array[i].modifiers.array,
 			obs_pw->format_info.array[i].modifiers.num);
 			obs_pw->format_info.array[i].modifiers.num);
 	}
 	}
+
+build_shm:
 	for (size_t i = 0; i < obs_pw->format_info.num; i++) {
 	for (size_t i = 0; i < obs_pw->format_info.num; i++) {
 		params[params_count++] = build_format(
 		params[params_count++] = build_format(
 			pod_builder, &obs_pw->video_info,
 			pod_builder, &obs_pw->video_info,
@@ -554,6 +558,13 @@ static void remove_modifier_from_format(obs_pipewire_data *obs_pw,
 		if (obs_pw->format_info.array[i].spa_format != spa_format)
 		if (obs_pw->format_info.array[i].spa_format != spa_format)
 			continue;
 			continue;
 
 
+		if (!check_pw_version(&obs_pw->server_version, 0, 3, 40)) {
+			da_erase_range(
+				obs_pw->format_info.array[i].modifiers, 0,
+				obs_pw->format_info.array[i].modifiers.num - 1);
+			continue;
+		}
+
 		int idx = da_find(obs_pw->format_info.array[i].modifiers,
 		int idx = da_find(obs_pw->format_info.array[i].modifiers,
 				  &modifier, 0);
 				  &modifier, 0);
 		while (idx != -1) {
 		while (idx != -1) {