@@ -8,7 +8,6 @@ use std::ptr::NonNull;
88use std:: rc:: Rc ;
99use std:: time:: Duration ;
1010
11- use smithay:: backend:: renderer:: ExportMem ;
1211use anyhow:: { ensure} ;
1312use anyhow:: Context as _;
1413use calloop:: timer:: { TimeoutAction , Timer } ;
@@ -17,6 +16,7 @@ use pipewire::context::ContextRc;
1716use pipewire:: core:: { CoreRc , PW_ID_CORE } ;
1817use pipewire:: main_loop:: MainLoopRc ;
1918use pipewire:: properties:: PropertiesBox ;
19+ use smithay:: backend:: renderer:: ExportMem ;
2020use pipewire:: spa:: buffer:: DataType ;
2121use pipewire:: spa:: param:: format:: { FormatProperties , MediaSubtype , MediaType } ;
2222use pipewire:: spa:: param:: format_utils:: parse_format;
@@ -232,12 +232,13 @@ fn make_video_params(
232232 }
233233}
234234
235- fn make_video_params_for_initial_negotiation (
235+ /// this function return an extra Vec<u8> to avoid extra allocation when building Pod
236+ fn make_video_params_for_initial_negotiation_with_extra_buffer (
236237 possible_modifiers : & FormatSet ,
237238 size : Size < u32 , Physical > ,
238239 refresh : u32 ,
239240 alpha : bool ,
240- ) -> Vec < pod:: Object > {
241+ ) -> Vec < ( pod:: Object , Vec < u8 > ) > {
241242 let f = |alpha| {
242243 let video_formats = if alpha {
243244 vec ! [ VideoFormat :: BGRA ]
@@ -259,34 +260,28 @@ fn make_video_params_for_initial_negotiation(
259260 trace ! ( "offering: {modifiers:?}" ) ;
260261
261262 if modifiers. len ( ) == 0 {
262- vec ! [ make_video_params(
263- & video_formats,
264- & vec![ ] ,
265- size,
266- refresh,
267- false ,
268- ) ]
263+ vec ! [
264+ ( make_video_params( & video_formats, & vec![ ] , size, refresh, false ) , Vec :: new( ) ) ,
265+ ]
269266 } else {
270267 vec ! [
271- make_video_params( & video_formats, & modifiers, size, refresh, false ) ,
272- make_video_params( & video_formats, & vec![ ] , size, refresh, false ) ,
268+ ( make_video_params( & video_formats, & modifiers, size, refresh, false ) , Vec :: new ( ) ) ,
269+ ( make_video_params( & video_formats, & vec![ ] , size, refresh, false ) , Vec :: new ( ) ) ,
273270 ]
274271 }
275272 } ;
276- let pod_objects = if alpha {
273+ let pod_objects_with_extra_buffer = if alpha {
277274 [ f ( true ) , f ( false ) ] . concat ( )
278275 } else {
279276 f ( false )
280277 } ;
281- pod_objects
278+ pod_objects_with_extra_buffer
282279}
283280
284281macro_rules! make_video_params_for_initial_negotiation_macro {
285282 ( $params: ident, $formats: expr, $size: expr, $refresh: expr, $alpha: expr) => {
286- let $params = make_video_params_for_initial_negotiation( $formats, $size, $refresh, $alpha) ;
287- let mut obj_with_buffer: Vec <( & pod:: Object , Vec <u8 >) > =
288- $params. iter( ) . map( |obj| ( obj, Vec :: new( ) ) ) . collect( ) ;
289- let $params: Vec <_> = obj_with_buffer
283+ let mut $params = make_video_params_for_initial_negotiation_with_extra_buffer( $formats, $size, $refresh, $alpha) ;
284+ let $params: Vec <_> = $params
290285 . iter_mut( )
291286 . map( |( obj, buf) | make_pod( buf, ( * obj) . clone( ) ) )
292287 . collect( ) ;
0 commit comments