@@ -38,6 +38,8 @@ package export::ffmpeg;
3838 sub init_ffmpeg {
3939 my $self = shift ;
4040 my $audioonly = (shift or 0);
41+ # Temp var
42+ my $data ;
4143 # Make sure we have ffmpeg
4244 my $ffmpeg = find_program(' ffmpeg' )
4345 or push @{$self -> {' errors' }}, ' You need ffmpeg to use this exporter.' ;
@@ -46,7 +48,7 @@ package export::ffmpeg;
4648 or push @{$self -> {' errors' }}, ' You need yuvdenoise (part of mjpegtools) to use this exporter.' ;
4749 # Check the yuvdenoise version
4850 if (!defined $self -> {' denoise_vmaj' }) {
49- my $data = ` cat /dev/null | yuvdenoise 2>&1` ;
51+ $data = ` cat /dev/null | yuvdenoise 2>&1` ;
5052 if ($data =~ m / yuvdenoise version (\d +(?:\.\d +)?)(\.\d +)?/ i ) {
5153 $self -> {' denoise_vmaj' } = $1 ;
5254 $self -> {' denoise_vmin' } = $2 ;
@@ -84,8 +86,16 @@ package export::ffmpeg;
8486 }
8587 # Audio only?
8688 $self -> {' audioonly' } = $audioonly ;
89+ # Load the parameter version?
90+ $data = ` ffmpeg -h 2>&1` ;
91+ if ($data =~ / bit_rate_tolerance/ ) {
92+ $self -> {' ffmpeg_param_vers' } = 0;
93+ }
94+ else {
95+ $self -> {' ffmpeg_param_vers' } = 1;
96+ }
8797 # Gather the supported codecs
88- my $data = ` $ffmpeg -formats 2>&1` ;
98+ $data = ` $ffmpeg -formats 2>&1` ;
8999 my ($formats ) = $data =~ / (?:^|\n\s *)File\s formats:\s *\n (.+?\n )\s *\n /s ;
90100 my ($codecs ) = $data =~ / (?:^|\n\s *)Codecs:\s *\n (.+?\n )\s *\n /s ;
91101 if ($formats ) {
@@ -114,6 +124,44 @@ package export::ffmpeg;
114124 || $self -> {' formats' }{$codec } && $self -> {' formats' }{$codec } =~ / ^.E/ ) ? 1 : 0;
115125 }
116126
127+ # ffmpeg keeps changing their parameter names... so we work around it.
128+ sub param {
129+ my $self = shift ;
130+ my $param = lc (shift );
131+ my $value = shift ;
132+ # Which version?
133+ if ($self -> {' ffmpeg_param_vers' } == 1) {
134+ return param_pair(' ac' , $value ) if ($param eq ' channels' );
135+ return param_pair(' ar' , $value ) if ($param eq ' sample_rate' );
136+ return param_pair(' b' , $value * 1024) if ($param eq ' bit_rate' );
137+ return param_pair(' b_qfactor' , $value ) if ($param eq ' b_quant_factor' );
138+ return param_pair(' b_qoffset' , $value ) if ($param eq ' b_quant_offset' );
139+ return param_pair(' bf' , $value ) if ($param eq ' max_b_frames' );
140+ return param_pair(' bt' , $value * 1024) if ($param eq ' bit_rate_tolerance' );
141+ return param_pair(' bufsize' , $value ) if ($param eq ' rc_buffer_size' );
142+ return param_pair(' bug' , $value ) if ($param eq ' bugs' );
143+ return param_pair(' error' , $value ) if ($param eq ' error_rate' );
144+ return param_pair(' g' , $value ) if ($param eq ' gop_size' );
145+ return param_pair(' i_qfactor' , $value ) if ($param eq ' i_quant_factor' );
146+ return param_pair(' i_qoffset' , $value ) if ($param eq ' i_quant_offset' );
147+ return param_pair(' maxrate' , $value ) if ($param eq ' rc_max_rate' );
148+ return param_pair(' mblmax' , $value ) if ($param eq ' mb_lmax' );
149+ return param_pair(' mblmin' , $value ) if ($param eq ' mb_lmin' );
150+ return param_pair(' mepc' , $value ) if ($param eq ' me_penalty_compensation' );
151+ return param_pair(' minrate' , $value ) if ($param eq ' rc_min_rate' );
152+ return param_pair(' qcomp' , $value ) if ($param eq ' qcompress' );
153+ return param_pair(' qdiff' , $value ) if ($param eq ' max_qdiff' );
154+ return param_pair(' qsquish' , $value ) if ($param eq ' rc_qsquish' );
155+ return param_pair(' rc_init_cplx' , $value ) if ($param eq ' rc_initial_cplx' );
156+ return param_pair(' skip_exp' , $value ) if ($param eq ' frame_skip_exp' );
157+ return param_pair(' skip_factor' , $value ) if ($param eq ' frame_skip_factor' );
158+ return param_pair(' skip_threshold' , $value ) if ($param eq ' frame_skip_threshold' );
159+ return param_pair(' threads' , $value ) if ($param eq ' thread_count' );
160+ }
161+ # Unknown, just return the parameter
162+ return param_pair($param , $value );
163+ }
164+
117165# Load default settings
118166 sub load_defaults {
119167 my $self = shift ;
0 commit comments