1+ use std:: sync:: Arc ;
2+
13use crate :: {
2- params:: { Parameter , ParameterData , SelectOption , macros:: select_non_default_option} ,
4+ model:: { Bitrate , BitrateType , InputConstraints , InputType } ,
5+ params:: { Parameter , ParameterData , SelectOption , macros:: select_non_default_custom_value} ,
36 visitors:: CommandBuilder ,
47} ;
58
@@ -8,26 +11,54 @@ pub(crate) struct VideoBitrate;
811impl VideoBitrate {
912 pub ( crate ) const ID : & ' static str = "vbitrate" ;
1013 pub ( crate ) const NAME : & ' static str = "Video Bitrate" ;
11- const DEFAULT : & ' static str = "auto " ;
14+ const DEFAULT : & ' static str = "0 " ;
1215 const VARIANTS : [ & str ; 12 ] = [
13- "16k" , "32k" , "auto " , "64k" , "128k" , "256k" , "512k" , "1M" , "2M" , "4M" , "8M" , "16M" ,
16+ "16k" , "32k" , "0 " , "64k" , "128k" , "256k" , "512k" , "1M" , "2M" , "4M" , "8M" , "16M" ,
1417 ] ;
1518
1619 pub fn new_parameter ( ) -> Parameter {
1720 Parameter :: new (
1821 Self :: ID ,
1922 Self :: NAME ,
20- ParameterData :: Select {
23+ ParameterData :: CustomSelect {
2124 options : SelectOption :: from_slice ( & Self :: VARIANTS ) ,
2225 selected_index : 2 ,
26+ value : Self :: DEFAULT . to_owned ( ) ,
27+ constraints : InputConstraints {
28+ length : 5 ,
29+ input_type : InputType :: Bitrate ,
30+ } ,
31+ validator : Arc :: new ( Self :: validate) ,
32+ formatter : Some ( Arc :: new ( Self :: format_value) ) ,
2333 } ,
2434 )
2535 }
2636
37+ fn validate ( value : & str ) -> Result < String , & str > {
38+ if let Ok ( bitrate) = value. parse :: < Bitrate > ( )
39+ && let Bitrate ( value, unit) = & bitrate
40+ && ( * value == 0
41+ || ( ( 4 ..=9999 ) . contains ( value) && * unit == BitrateType :: K )
42+ || ( ( 1 ..=999 ) . contains ( value) && * unit == BitrateType :: M ) )
43+ {
44+ Ok ( bitrate. to_string ( ) )
45+ } else {
46+ Err ( "Invalid value. Expected a number in range 4k..999M, or 0 - auto" )
47+ }
48+ }
49+
50+ fn format_value ( value : & str ) -> String {
51+ if value == Self :: DEFAULT {
52+ "auto" . to_owned ( )
53+ } else {
54+ value. to_owned ( )
55+ }
56+ }
57+
2758 pub fn build_command ( cb : & mut CommandBuilder , data : & ParameterData ) {
28- if let Some ( option ) = select_non_default_option ! ( data) {
59+ if let Some ( value ) = select_non_default_custom_value ! ( data) {
2960 cb. args . push ( "-b:v" . into ( ) ) ;
30- cb. args . push ( option . value . clone ( ) ) ;
61+ cb. args . push ( Self :: format_value ( value ) ) ;
3162 }
3263 }
3364}
0 commit comments