2013-03-12 17:00:09 -04:00
/*
2013-03-29 07:20:09 -04:00
Copyright ( C ) 2010 , 2013 Paul Davis
2013-03-12 17:00:09 -04:00
Author : Robin Gareus < robin @ gareus . org >
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include <cstdio>
# include <string>
# include <sstream>
# include <iomanip>
# include <unistd.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <sigc++/bind.h>
2015-10-05 16:10:58 -04:00
# include "pbd/gstdio_compat.h"
2013-07-15 14:29:00 -04:00
2013-03-12 17:00:09 -04:00
# include "pbd/error.h"
# include "pbd/convert.h"
# include "gtkmm2ext/utils.h"
# include "ardour/session_directory.h"
# include "ardour/profile.h"
# include "ardour/template_utils.h"
# include "ardour/session.h"
# include "ardour_ui.h"
# include "gui_thread.h"
# include "opts.h"
# include "transcode_video_dialog.h"
# include "utils_videotl.h"
2016-07-14 14:44:52 -04:00
# include "pbd/i18n.h"
2013-03-12 17:00:09 -04:00
using namespace Gtk ;
using namespace std ;
using namespace PBD ;
using namespace ARDOUR ;
2013-08-03 10:54:57 -04:00
using namespace VideoUtils ;
2013-03-12 17:00:09 -04:00
TranscodeVideoDialog : : TranscodeVideoDialog ( Session * s , std : : string infile )
: ArdourDialog ( _ ( " Transcode/Import Video File " ) )
, infn ( infile )
, path_label ( _ ( " Output File: " ) , Gtk : : ALIGN_LEFT )
, browse_button ( _ ( " Browse " ) )
2013-03-29 07:20:09 -04:00
, transcode_button ( _ ( " OK " ) )
2013-03-12 17:00:09 -04:00
, abort_button ( _ ( " Abort " ) )
, progress_label ( )
, aspect_checkbox ( _ ( " Height = " ) )
, height_adjustment ( 128 , 0 , 1920 , 1 , 16 , 0 )
, height_spinner ( height_adjustment )
2015-09-20 12:37:39 -04:00
, ltc_detect ( _ ( " Extract LTC from audio and align video " ) )
2013-03-12 17:00:09 -04:00
, bitrate_checkbox ( _ ( " Manual Override " ) )
2013-03-29 07:20:09 -04:00
, bitrate_adjustment ( 2000 , 500 , 10000 , 10 , 100 , 0 )
2013-03-12 17:00:09 -04:00
, bitrate_spinner ( bitrate_adjustment )
# if 1 /* tentative debug mode */
2013-07-23 14:24:23 -04:00
, debug_checkbox ( _ ( " Debug Mode: Print ffmpeg command and output to stdout. " ) )
2013-03-12 17:00:09 -04:00
# endif
{
set_session ( s ) ;
transcoder = new TranscodeFfmpeg ( infile ) ;
audiofile = " " ;
pending_audio_extract = false ;
2013-03-29 07:20:09 -04:00
aborted = false ;
2013-03-12 17:00:09 -04:00
set_name ( " TranscodeVideoDialog " ) ;
set_modal ( true ) ;
set_skip_taskbar_hint ( true ) ;
set_resizable ( false ) ;
Gtk : : Label * l ;
vbox = manage ( new VBox ) ;
VBox * options_box = manage ( new VBox ) ;
HBox * path_hbox = manage ( new HBox ) ;
int w = 0 , h = 0 ;
m_aspect = 4.0 / 3.0 ;
2013-07-14 10:34:49 -04:00
TranscodeFfmpeg : : FFAudioStreams as ; as . clear ( ) ;
2013-03-12 17:00:09 -04:00
path_hbox - > pack_start ( path_label , false , false , 3 ) ;
path_hbox - > pack_start ( path_entry , true , true , 3 ) ;
path_hbox - > pack_start ( browse_button , false , false , 3 ) ;
path_entry . set_width_chars ( 38 ) ;
height_spinner . set_sensitive ( false ) ;
bitrate_spinner . set_sensitive ( false ) ;
2013-03-28 08:41:36 -04:00
std : : string dstdir = video_dest_dir ( _session - > session_directory ( ) . video_path ( ) , video_get_docroot ( Config ) ) ;
2013-03-12 17:00:09 -04:00
std : : string dstfn = video_dest_file ( dstdir , infile ) ;
path_entry . set_text ( dstfn ) ;
2013-03-30 11:50:22 -04:00
l = manage ( new Label ( _ ( " <b>File Information</b> " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
2013-03-12 17:00:09 -04:00
l - > set_use_markup ( ) ;
options_box - > pack_start ( * l , false , true , 4 ) ;
2013-03-29 07:20:09 -04:00
bool ffok = false ;
2013-03-12 17:00:09 -04:00
if ( ! transcoder - > ffexec_ok ( ) ) {
2015-12-22 10:43:26 -05:00
l = manage ( new Label ( _ ( " ffmpeg installation was not found. Video Import is not possible. See the Log window for more information. " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
2013-03-12 17:00:09 -04:00
l - > set_line_wrap ( ) ;
options_box - > pack_start ( * l , false , true , 4 ) ;
aspect_checkbox . set_sensitive ( false ) ;
bitrate_checkbox . set_sensitive ( false ) ;
}
else if ( ! transcoder - > probe_ok ( ) ) {
2013-03-27 11:04:56 -04:00
l = manage ( new Label ( string_compose ( _ ( " File-info can not be read. Most likely '%1' is not a valid video-file or an unsupported video codec or format. " ) , infn ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
2013-03-12 17:00:09 -04:00
options_box - > pack_start ( * l , false , true , 4 ) ;
aspect_checkbox . set_sensitive ( false ) ;
bitrate_checkbox . set_sensitive ( false ) ;
} else {
w = transcoder - > get_width ( ) ;
h = transcoder - > get_height ( ) ;
as = transcoder - > get_audio ( ) ;
m_aspect = transcoder - > get_aspect ( ) ;
2015-07-10 17:46:35 -04:00
if ( w > 0 & & h > 0 & & transcoder - > get_fps ( ) > 0 & & transcoder - > get_duration ( ) > 0 ) {
ffok = true ;
}
2013-03-12 17:00:09 -04:00
Table * t = manage ( new Table ( 4 , 2 ) ) ;
t - > set_spacings ( 4 ) ;
options_box - > pack_start ( * t , true , true , 4 ) ;
l = manage ( new Label ( _ ( " FPS: " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 0 , 1 , 0 , 1 ) ;
l = manage ( new Label ( _ ( " Duration: " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 2 , 3 , 0 , 1 ) ;
l = manage ( new Label ( _ ( " Codec: " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 0 , 1 , 1 , 2 ) ;
l = manage ( new Label ( _ ( " Geometry: " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 2 , 3 , 1 , 2 ) ;
std : : ostringstream osstream ;
osstream < < transcoder - > get_fps ( ) ;
l = manage ( new Label ( osstream . str ( ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 1 , 2 , 0 , 1 ) ;
osstream . str ( " " ) ;
osstream < < w < < " x " < < h ;
l = manage ( new Label ( osstream . str ( ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 3 , 4 , 1 , 2 ) ;
osstream . str ( " " ) ;
2013-03-13 20:38:21 -04:00
if ( transcoder - > get_duration ( ) = = 0 | | transcoder - > get_fps ( ) = = 0 ) {
2013-03-12 17:00:09 -04:00
osstream < < _ ( " ?? " ) ;
} else {
2013-03-13 20:38:21 -04:00
unsigned long sec = transcoder - > get_duration ( ) / transcoder - > get_fps ( ) ;
2013-03-12 17:00:09 -04:00
osstream < < setfill ( ' 0 ' ) < < setw ( 2 ) ;
osstream < < ( sec / 3600 ) < < " : " ;
osstream < < setfill ( ' 0 ' ) < < setw ( 2 ) ;
osstream < < ( ( sec / 60 ) % 60 ) < < " : " ;
osstream < < setfill ( ' 0 ' ) < < setw ( 2 ) ;
osstream < < ( sec % 60 ) < < " : " ;
osstream < < setfill ( ' 0 ' ) < < setw ( 2 ) ;
osstream < < ( transcoder - > get_duration ( ) % ( int ) floor ( transcoder - > get_fps ( ) ) ) ;
}
l = manage ( new Label ( osstream . str ( ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 3 , 4 , 0 , 1 ) ;
osstream . str ( " " ) ;
osstream < < transcoder - > get_codec ( ) ;
l = manage ( new Label ( osstream . str ( ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 1 , 2 , 1 , 2 ) ;
}
2013-03-30 11:50:22 -04:00
l = manage ( new Label ( _ ( " <b>Import Settings</b> " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
2013-03-12 17:00:09 -04:00
l - > set_use_markup ( ) ;
options_box - > pack_start ( * l , false , true , 4 ) ;
2015-07-10 17:46:35 -04:00
if ( ffok ) {
2015-11-29 14:17:11 -05:00
video_combo . append_text ( _ ( " Reference from Current Location (Previously Transcoded Files Only) " ) ) ;
2013-03-29 07:20:09 -04:00
video_combo . append_text ( _ ( " Import/Transcode Video to Session " ) ) ;
video_combo . set_active ( 1 ) ;
2015-07-10 17:46:35 -04:00
if ( as . size ( ) > 0 ) {
video_combo . append_text ( _ ( " Do Not Import Video (Audio Import Only) " ) ) ;
audio_combo . set_sensitive ( true ) ;
} else {
audio_combo . set_sensitive ( false ) ;
}
video_combo . set_sensitive ( true ) ;
transcode_button . set_sensitive ( true ) ;
path_entry . set_sensitive ( true ) ;
browse_button . set_sensitive ( true ) ;
} else if ( as . size ( ) > 0 ) {
video_combo . append_text ( _ ( " Do Not Import Video (Audio Import Only) " ) ) ;
video_combo . set_active ( 0 ) ;
path_entry . set_text ( " " ) ;
video_combo . set_sensitive ( false ) ;
audio_combo . set_sensitive ( true ) ;
transcode_button . set_sensitive ( true ) ;
path_entry . set_sensitive ( false ) ;
browse_button . set_sensitive ( false ) ;
2014-03-19 13:12:16 -04:00
} else {
2015-07-10 17:46:35 -04:00
video_combo . append_text ( _ ( " Do Not Import Video " ) ) ;
2014-03-19 13:12:16 -04:00
video_combo . set_active ( 0 ) ;
2015-07-10 17:46:35 -04:00
path_entry . set_text ( " " ) ;
2013-03-29 07:20:09 -04:00
video_combo . set_sensitive ( false ) ;
audio_combo . set_sensitive ( false ) ;
2015-07-10 17:46:35 -04:00
transcode_button . set_sensitive ( false ) ;
path_entry . set_sensitive ( false ) ;
browse_button . set_sensitive ( false ) ;
2014-03-19 13:12:16 -04:00
}
2013-03-29 07:20:09 -04:00
options_box - > pack_start ( video_combo , false , false , 4 ) ;
2015-09-20 12:37:39 -04:00
Table * t = manage ( new Table ( 4 , 4 ) ) ;
2013-03-12 17:00:09 -04:00
t - > set_spacings ( 4 ) ;
options_box - > pack_start ( * t , true , true , 4 ) ;
l = manage ( new Label ( _ ( " Scale Video: Width = " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 0 , 1 , 0 , 1 ) ;
t - > attach ( scale_combo , 1 , 2 , 0 , 1 ) ;
t - > attach ( aspect_checkbox , 2 , 3 , 0 , 1 ) ;
t - > attach ( height_spinner , 3 , 4 , 0 , 1 ) ;
scale_combo . append_text ( _ ( " Original Width " ) ) ;
if ( w > 1920 ) { scale_combo . append_text ( " 1920 (hd1080) " ) ; }
if ( w > 1408 ) { scale_combo . append_text ( " 1408 (16cif) " ) ; }
if ( w > 1280 ) { scale_combo . append_text ( " 1280 (sxga, hd720) " ) ; }
if ( w > 1024 ) { scale_combo . append_text ( " 1024 (xga) " ) ; }
if ( w > 852 ) { scale_combo . append_text ( " 852 (hd480) " ) ; }
if ( w > 768 ) { scale_combo . append_text ( " 768 (PAL) " ) ; }
if ( w > 720 ) { scale_combo . append_text ( " 720 (PAL) " ) ; }
if ( w > 640 ) { scale_combo . append_text ( " 640 (vga, ega) " ) ; }
if ( w > 352 ) { scale_combo . append_text ( " 352 (cif) " ) ; }
if ( w > 320 ) { scale_combo . append_text ( " 320 (cga, qvga) " ) ; }
if ( w > 176 ) { scale_combo . append_text ( " 176 (qcif) " ) ; }
scale_combo . set_active ( 0 ) ;
height_spinner . set_value ( h ) ;
l = manage ( new Label ( _ ( " Bitrate (KBit/s): " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 0 , 1 , 1 , 2 ) ;
t - > attach ( bitrate_checkbox , 2 , 3 , 1 , 2 ) ;
t - > attach ( bitrate_spinner , 3 , 4 , 1 , 2 ) ;
l = manage ( new Label ( _ ( " Extract Audio: " ) , Gtk : : ALIGN_LEFT , Gtk : : ALIGN_CENTER , false ) ) ;
t - > attach ( * l , 0 , 1 , 2 , 3 ) ;
t - > attach ( audio_combo , 1 , 4 , 2 , 3 ) ;
2015-09-20 12:37:39 -04:00
t - > attach ( ltc_detect , 1 , 4 , 3 , 4 ) ;
2014-03-19 12:34:45 -04:00
if ( as . size ( ) = = 0 ) {
2014-03-19 13:12:16 -04:00
audio_combo . append_text ( _ ( " No Audio Track Present " ) ) ;
2014-03-19 12:34:45 -04:00
audio_combo . set_sensitive ( false ) ;
} else {
2014-03-19 13:12:16 -04:00
audio_combo . append_text ( _ ( " Do Not Extract Audio " ) ) ;
2013-07-14 10:34:49 -04:00
for ( TranscodeFfmpeg : : FFAudioStreams : : iterator it = as . begin ( ) ; it < as . end ( ) ; + + it ) {
2013-03-12 17:00:09 -04:00
audio_combo . append_text ( ( * it ) . name ) ;
}
}
audio_combo . set_active ( 0 ) ;
2015-09-20 12:37:39 -04:00
ltc_detect . set_sensitive ( false ) ;
2013-03-12 17:00:09 -04:00
# if 1 /* tentative debug mode */
options_box - > pack_start ( debug_checkbox , false , true , 4 ) ;
# endif
vbox - > pack_start ( * path_hbox , false , false ) ;
vbox - > pack_start ( * options_box , false , true ) ;
get_vbox ( ) - > set_spacing ( 4 ) ;
get_vbox ( ) - > pack_start ( * vbox , false , false ) ;
progress_box = manage ( new VBox ) ;
2017-02-27 10:49:00 -05:00
progress_box - > set_spacing ( 6 ) ;
2013-03-12 17:00:09 -04:00
progress_box - > pack_start ( progress_label , false , false ) ;
progress_box - > pack_start ( pbar , false , false ) ;
progress_box - > pack_start ( abort_button , false , false ) ;
get_vbox ( ) - > pack_start ( * progress_box , false , false ) ;
browse_button . signal_clicked ( ) . connect ( sigc : : mem_fun ( * this , & TranscodeVideoDialog : : open_browse_dialog ) ) ;
transcode_button . signal_clicked ( ) . connect ( sigc : : mem_fun ( * this , & TranscodeVideoDialog : : launch_transcode ) ) ;
abort_button . signal_clicked ( ) . connect ( sigc : : mem_fun ( * this , & TranscodeVideoDialog : : abort_clicked ) ) ;
2013-03-29 07:20:09 -04:00
video_combo . signal_changed ( ) . connect ( sigc : : mem_fun ( * this , & TranscodeVideoDialog : : video_combo_changed ) ) ;
2013-03-12 17:00:09 -04:00
audio_combo . signal_changed ( ) . connect ( sigc : : mem_fun ( * this , & TranscodeVideoDialog : : audio_combo_changed ) ) ;
scale_combo . signal_changed ( ) . connect ( sigc : : mem_fun ( * this , & TranscodeVideoDialog : : scale_combo_changed ) ) ;
aspect_checkbox . signal_toggled ( ) . connect ( sigc : : mem_fun ( * this , & TranscodeVideoDialog : : aspect_checkbox_toggled ) ) ;
height_spinner . signal_changed ( ) . connect ( sigc : : mem_fun ( * this , & TranscodeVideoDialog : : update_bitrate ) ) ;
bitrate_checkbox . signal_toggled ( ) . connect ( sigc : : mem_fun ( * this , & TranscodeVideoDialog : : bitrate_checkbox_toggled ) ) ;
update_bitrate ( ) ;
cancel_button = add_button ( Stock : : CANCEL , RESPONSE_CANCEL ) ;
get_action_area ( ) - > pack_start ( transcode_button , false , false ) ;
show_all_children ( ) ;
progress_box - > hide ( ) ;
}
TranscodeVideoDialog : : ~ TranscodeVideoDialog ( )
{
delete transcoder ;
}
void
TranscodeVideoDialog : : on_show ( )
{
Dialog : : on_show ( ) ;
}
void
TranscodeVideoDialog : : abort_clicked ( )
{
aborted = true ;
transcoder - > cancel ( ) ;
}
void
TranscodeVideoDialog : : update_progress ( framecnt_t c , framecnt_t a )
{
if ( a = = 0 | | c > a ) {
pbar . set_pulse_step ( .5 ) ;
pbar . pulse ( ) ;
return ;
}
pbar . set_fraction ( ( double ) c / ( double ) a ) ;
}
void
TranscodeVideoDialog : : finished ( )
{
if ( aborted ) {
2013-07-15 14:29:00 -04:00
: : g_unlink ( path_entry . get_text ( ) . c_str ( ) ) ;
2013-03-12 17:00:09 -04:00
if ( ! audiofile . empty ( ) ) {
2013-07-15 14:29:00 -04:00
: : g_unlink ( audiofile . c_str ( ) ) ;
2013-03-12 17:00:09 -04:00
}
Gtk : : Dialog : : response ( RESPONSE_CANCEL ) ;
} else {
2013-03-29 07:20:09 -04:00
if ( pending_audio_extract ) {
2013-03-12 17:00:09 -04:00
StartNextStage ( ) ;
} else {
Gtk : : Dialog : : response ( RESPONSE_ACCEPT ) ;
}
}
}
void
2013-03-29 07:20:09 -04:00
TranscodeVideoDialog : : launch_audioonly ( )
2013-03-12 17:00:09 -04:00
{
if ( audio_combo . get_active_row_number ( ) = = 0 ) {
2013-03-29 07:20:09 -04:00
finished ( ) ;
return ;
2013-03-12 17:00:09 -04:00
}
dialog_progress_mode ( ) ;
# if 1 /* tentative debug mode */
if ( debug_checkbox . get_active ( ) ) {
transcoder - > set_debug ( true ) ;
}
# endif
transcoder - > Progress . connect ( * this , invalidator ( * this ) , boost : : bind ( & TranscodeVideoDialog : : update_progress , this , _1 , _2 ) , gui_context ( ) ) ;
transcoder - > Finished . connect ( * this , invalidator ( * this ) , boost : : bind ( & TranscodeVideoDialog : : finished , this ) , gui_context ( ) ) ;
launch_extract ( ) ;
}
void
TranscodeVideoDialog : : launch_extract ( )
{
2013-03-29 07:20:09 -04:00
audiofile = path_entry . get_text ( ) + " .wav " ; /* TODO: mktemp */
2013-03-12 17:00:09 -04:00
int audio_stream ;
pending_audio_extract = false ;
aborted = false ;
audio_stream = audio_combo . get_active_row_number ( ) - 1 ;
progress_label . set_text ( _ ( " Extracting Audio.. " ) ) ;
if ( ! transcoder - > extract_audio ( audiofile , _session - > nominal_frame_rate ( ) , audio_stream ) ) {
ARDOUR_UI : : instance ( ) - > popup_error ( _ ( " Audio Extraction Failed. " ) ) ;
audiofile = " " ;
Gtk : : Dialog : : response ( RESPONSE_CANCEL ) ;
return ;
}
}
void
TranscodeVideoDialog : : dialog_progress_mode ( )
{
vbox - > hide ( ) ;
cancel_button - > hide ( ) ;
transcode_button . hide ( ) ;
pbar . set_size_request ( 300 , - 1 ) ;
progress_box - > show ( ) ;
}
void
TranscodeVideoDialog : : launch_transcode ( )
{
2014-03-19 13:12:16 -04:00
if ( video_combo . get_active_row_number ( ) ! = 1 ) {
2013-03-29 07:20:09 -04:00
launch_audioonly ( ) ;
return ;
}
2013-03-12 17:00:09 -04:00
std : : string outfn = path_entry . get_text ( ) ;
2015-11-01 15:00:05 -05:00
if ( ! confirm_video_outfn ( * this , outfn , video_get_docroot ( Config ) ) ) return ;
2013-03-12 17:00:09 -04:00
progress_label . set_text ( _ ( " Transcoding Video.. " ) ) ;
dialog_progress_mode ( ) ;
# if 1 /* tentative debug mode */
if ( debug_checkbox . get_active ( ) ) {
transcoder - > set_debug ( true ) ;
}
# endif
aborted = false ;
if ( audio_combo . get_active_row_number ( ) ! = 0 ) {
pending_audio_extract = true ;
StartNextStage . connect ( * this , invalidator ( * this ) , boost : : bind ( & TranscodeVideoDialog : : launch_extract , this ) , gui_context ( ) ) ;
}
int scale_width , scale_height , bitrate ;
if ( scale_combo . get_active_row_number ( ) = = 0 ) {
scale_width = 0 ;
} else {
2013-06-08 03:03:26 -04:00
scale_width = atoi ( scale_combo . get_active_text ( ) ) ;
2013-03-12 17:00:09 -04:00
}
if ( ! aspect_checkbox . get_active ( ) ) {
scale_height = 0 ;
} else {
scale_height = ( int ) floor ( height_spinner . get_value ( ) ) ;
}
if ( bitrate_checkbox . get_active ( ) ) {
bitrate = ( int ) floor ( bitrate_spinner . get_value ( ) ) ;
} else {
bitrate = 0 ;
}
transcoder - > Progress . connect ( * this , invalidator ( * this ) , boost : : bind ( & TranscodeVideoDialog : : update_progress , this , _1 , _2 ) , gui_context ( ) ) ;
transcoder - > Finished . connect ( * this , invalidator ( * this ) , boost : : bind ( & TranscodeVideoDialog : : finished , this ) , gui_context ( ) ) ;
if ( ! transcoder - > transcode ( outfn , scale_width , scale_height , bitrate ) ) {
ARDOUR_UI : : instance ( ) - > popup_error ( _ ( " Transcoding Failed. " ) ) ;
Gtk : : Dialog : : response ( RESPONSE_CANCEL ) ;
return ;
}
}
void
2013-03-29 07:20:09 -04:00
TranscodeVideoDialog : : video_combo_changed ( )
2013-03-12 17:00:09 -04:00
{
2014-03-19 13:12:16 -04:00
const int i = video_combo . get_active_row_number ( ) ;
if ( i ! = 1 ) {
2013-03-29 07:20:09 -04:00
scale_combo . set_sensitive ( false ) ;
aspect_checkbox . set_sensitive ( false ) ;
height_spinner . set_sensitive ( false ) ;
bitrate_checkbox . set_sensitive ( false ) ;
bitrate_spinner . set_sensitive ( false ) ;
2013-03-12 17:00:09 -04:00
} else {
2013-03-29 07:20:09 -04:00
scale_combo . set_sensitive ( true ) ;
aspect_checkbox . set_sensitive ( true ) ;
height_spinner . set_sensitive ( true ) ;
bitrate_checkbox . set_sensitive ( true ) ;
bitrate_spinner . set_sensitive ( true ) ;
2013-03-12 17:00:09 -04:00
}
2014-03-19 13:12:16 -04:00
if ( i = = 2 & & audio_combo . get_active_row_number ( ) = = 0 ) {
audio_combo . set_active ( 1 ) ;
2015-09-20 12:37:39 -04:00
} else {
//update LTC option sensitivity
audio_combo_changed ( ) ;
2014-03-19 13:12:16 -04:00
}
2013-03-12 17:00:09 -04:00
}
2013-03-29 07:20:09 -04:00
void
TranscodeVideoDialog : : audio_combo_changed ( )
{
2014-03-19 13:12:16 -04:00
if ( video_combo . get_active_row_number ( ) = = 2
& & audio_combo . get_active_row_number ( ) = = 0 )
{
audio_combo . set_active ( 1 ) ;
2015-09-20 12:37:39 -04:00
ltc_detect . set_sensitive ( false ) ;
ltc_detect . set_active ( false ) ;
}
if ( video_combo . get_active_row_number ( ) ! = 2
& & audio_combo . get_active_row_number ( ) > 0 )
{
ltc_detect . set_sensitive ( true ) ;
} else {
ltc_detect . set_sensitive ( false ) ;
ltc_detect . set_active ( false ) ;
2014-03-19 13:12:16 -04:00
}
2013-03-29 07:20:09 -04:00
}
2013-03-12 17:00:09 -04:00
void
TranscodeVideoDialog : : scale_combo_changed ( )
{
if ( ! aspect_checkbox . get_active ( ) ) {
int h ;
if ( scale_combo . get_active_row_number ( ) = = 0 ) {
h = transcoder - > get_height ( ) ;
} else {
2013-06-08 03:03:26 -04:00
h = floor ( atof ( scale_combo . get_active_text ( ) ) / m_aspect ) ;
2013-03-12 17:00:09 -04:00
}
height_spinner . set_value ( h ) ;
}
2013-03-29 07:20:09 -04:00
update_bitrate ( ) ;
2013-03-12 17:00:09 -04:00
}
void
TranscodeVideoDialog : : aspect_checkbox_toggled ( )
{
height_spinner . set_sensitive ( aspect_checkbox . get_active ( ) ) ;
scale_combo_changed ( ) ;
}
void
TranscodeVideoDialog : : bitrate_checkbox_toggled ( )
{
bitrate_spinner . set_sensitive ( bitrate_checkbox . get_active ( ) ) ;
if ( ! bitrate_checkbox . get_active ( ) ) {
update_bitrate ( ) ;
}
}
void
TranscodeVideoDialog : : update_bitrate ( )
{
double br = .7 ; /* avg quality - bits per pixel */
if ( bitrate_checkbox . get_active ( ) | | ! transcoder - > probe_ok ( ) ) { return ; }
br * = transcoder - > get_fps ( ) ;
br * = height_spinner . get_value ( ) ;
2013-03-29 07:20:09 -04:00
2013-03-12 17:00:09 -04:00
if ( scale_combo . get_active_row_number ( ) = = 0 ) {
2013-03-29 07:20:09 -04:00
br * = transcoder - > get_width ( ) ;
2013-03-12 17:00:09 -04:00
} else {
2013-06-08 03:03:26 -04:00
br * = atof ( scale_combo . get_active_text ( ) ) ;
2013-03-12 17:00:09 -04:00
}
2013-03-29 07:20:09 -04:00
if ( br ! = 0 ) {
bitrate_spinner . set_value ( floor ( br / 10000.0 ) * 10 ) ;
}
2013-03-12 17:00:09 -04:00
}
void
TranscodeVideoDialog : : open_browse_dialog ( )
{
Gtk : : FileChooserDialog dialog ( _ ( " Save Transcoded Video File " ) , Gtk : : FILE_CHOOSER_ACTION_SAVE ) ;
dialog . set_filename ( path_entry . get_text ( ) ) ;
dialog . add_button ( Gtk : : Stock : : CANCEL , Gtk : : RESPONSE_CANCEL ) ;
dialog . add_button ( Gtk : : Stock : : OK , Gtk : : RESPONSE_OK ) ;
int result = dialog . run ( ) ;
if ( result = = Gtk : : RESPONSE_OK ) {
std : : string filename = dialog . get_filename ( ) ;
if ( filename . length ( ) ) {
path_entry . set_text ( filename ) ;
}
}
}
2013-03-29 07:20:09 -04:00
enum VtlTranscodeOption
TranscodeVideoDialog : : import_option ( ) {
int i = video_combo . get_active_row_number ( ) ;
return static_cast < VtlTranscodeOption > ( i ) ;
}