@@ -98,8 +98,8 @@ impl Default for AppSrcConfig {
9898 max_buffers : 8 ,
9999 max_bytes : 0 ,
100100 max_time_ns : 0 ,
101- block : true ,
102- leaky : gst_app:: AppLeakyType :: None ,
101+ block : false ,
102+ leaky : gst_app:: AppLeakyType :: Downstream ,
103103 }
104104 }
105105}
@@ -240,19 +240,23 @@ fn output_pipeline_create(
240240 . and_then ( |e| e. downcast :: < gst_app:: AppSrc > ( ) . ok ( ) )
241241 . ok_or_else ( || gst:: glib:: Error :: new ( gst:: CoreError :: Failed , "appsrc not found" ) ) ?;
242242
243+ apply_appsrc_config ( & appsrc, appsrc_cfg) ;
244+
245+ Ok ( ( pipeline, appsrc) )
246+ }
247+
248+ fn apply_appsrc_config ( appsrc : & gst_app:: AppSrc , cfg : AppSrcConfig ) {
243249 appsrc. set_property ( "is-live" , true ) ;
244250 appsrc. set_property ( "format" , gst:: Format :: Time ) ;
245251 appsrc. set_property ( "stream-type" , gst_app:: AppStreamType :: Stream ) ;
246- appsrc. set_property ( "block" , appsrc_cfg . block ) ;
247- appsrc. set_property ( "max-buffers" , appsrc_cfg . max_buffers ) ;
248- appsrc. set_property ( "max-bytes" , appsrc_cfg . max_bytes ) ;
252+ appsrc. set_property ( "block" , cfg . block ) ;
253+ appsrc. set_property ( "max-buffers" , cfg . max_buffers ) ;
254+ appsrc. set_property ( "max-bytes" , cfg . max_bytes ) ;
249255 appsrc. set_property (
250256 "max-time" ,
251- gst:: ClockTime :: from_nseconds ( appsrc_cfg . max_time_ns ) ,
257+ gst:: ClockTime :: from_nseconds ( cfg . max_time_ns ) ,
252258 ) ;
253- appsrc. set_property ( "leaky-type" , appsrc_cfg. leaky ) ;
254-
255- Ok ( ( pipeline, appsrc) )
259+ appsrc. set_property ( "leaky-type" , cfg. leaky ) ;
256260}
257261
258262#[ derive( Clone ) ]
@@ -595,6 +599,70 @@ fn flush_appsrc(appsrc: &gst_app::AppSrc) {
595599 }
596600}
597601
602+ #[ cfg( test) ]
603+ mod tests {
604+ use super :: * ;
605+ use gst:: prelude:: * ;
606+
607+ #[ test]
608+ fn appsrc_config_applies_properties ( ) {
609+ gst:: init ( ) . unwrap ( ) ;
610+ let appsrc = gst:: ElementFactory :: make ( "appsrc" )
611+ . build ( )
612+ . unwrap ( )
613+ . downcast :: < gst_app:: AppSrc > ( )
614+ . unwrap ( ) ;
615+ let cfg = AppSrcConfig {
616+ max_buffers : 5 ,
617+ max_bytes : 1234 ,
618+ max_time_ns : 5678 ,
619+ block : false ,
620+ leaky : gst_app:: AppLeakyType :: Downstream ,
621+ } ;
622+ apply_appsrc_config ( & appsrc, cfg) ;
623+
624+ assert_eq ! ( appsrc. property:: <bool >( "block" ) , cfg. block) ;
625+ assert_eq ! ( appsrc. property:: <u64 >( "max-buffers" ) , cfg. max_buffers) ;
626+ assert_eq ! ( appsrc. property:: <u64 >( "max-bytes" ) , cfg. max_bytes) ;
627+ assert_eq ! ( appsrc. property:: <u64 >( "max-time" ) , cfg. max_time_ns) ;
628+ assert_eq ! ( appsrc. property:: <gst_app:: AppLeakyType >( "leaky-type" ) , cfg. leaky) ;
629+ }
630+
631+ #[ test]
632+ fn appsrc_flush_allows_stop ( ) {
633+ gst:: init ( ) . unwrap ( ) ;
634+ let pipeline = gst:: parse:: launch (
635+ "appsrc name=appsrc is-live=true format=time stream-type=stream ! fakesink sync=false" ,
636+ )
637+ . unwrap ( )
638+ . downcast :: < gst:: Pipeline > ( )
639+ . unwrap ( ) ;
640+ let appsrc = pipeline
641+ . by_name ( "appsrc" )
642+ . and_then ( |e| e. downcast :: < gst_app:: AppSrc > ( ) . ok ( ) )
643+ . unwrap ( ) ;
644+
645+ let cfg = AppSrcConfig {
646+ max_buffers : 2 ,
647+ max_bytes : 0 ,
648+ max_time_ns : 0 ,
649+ block : false ,
650+ leaky : gst_app:: AppLeakyType :: Downstream ,
651+ } ;
652+ apply_appsrc_config ( & appsrc, cfg) ;
653+
654+ pipeline. set_state ( gst:: State :: Playing ) . unwrap ( ) ;
655+ let buffer = gst:: Buffer :: from_slice ( vec ! [ 0u8 ; 1 ] ) ;
656+ let _ = appsrc. push_buffer ( buffer) ;
657+ flush_appsrc ( & appsrc) ;
658+
659+ pipeline. set_state ( gst:: State :: Null ) . unwrap ( ) ;
660+ let ( res, state, _) = pipeline. state ( gst:: ClockTime :: from_seconds ( 2 ) ) ;
661+ assert ! ( res. is_ok( ) ) ;
662+ assert_eq ! ( state, gst:: State :: Null ) ;
663+ }
664+ }
665+
598666fn main ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
599667 if let Err ( err) = gst:: init ( ) {
600668 return Err ( Box :: new ( err) ) ;
0 commit comments