Advertisement
Guest User

4ffmpeg_7.10

a guest
Nov 12th, 2014
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 53.29 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # work in python3.4
  5.  
  6. from gi.repository import Gtk, GObject, Vte
  7. from gi.repository import GLib
  8. import os
  9. import sys, subprocess, shlex, re
  10. from subprocess import call
  11. import math
  12.                
  13. class reuse_init(object):
  14.  
  15.  
  16.         def make_label(self, text):
  17.                 label = Gtk.Label(text)
  18.                 label.set_use_underline(True)
  19.                 label.set_alignment(1.0, 0.5)
  20.                 label.show()
  21.                 return label
  22.  
  23.         def make_slider_and_spinner(self, init, min, max, step, page, digits):
  24.                 controls = {'adj':Gtk.Adjustment(init, min, max, step, page), 'slider':Gtk.HScale(), 'spinner':Gtk.SpinButton()}
  25.                 controls['slider'].set_adjustment(controls['adj'])
  26.                 controls['slider'].set_draw_value(False)
  27.                 controls['spinner'].set_adjustment(controls['adj'])
  28.                 controls['spinner'].set_digits(digits)
  29.                 controls['slider'].show()
  30.                 controls['spinner'].show()
  31.                 return controls
  32.        
  33.         def make_frame_ag(self, f_shadow_type, f_label, alig_pad, gri_row_sp, gri_colu_sp, gri_homog):
  34.                 controls =  {'frame':Gtk.Frame(), 'ali':Gtk.Alignment(), 'grid':Gtk.Grid()}
  35.                 controls['frame'].set_shadow_type(f_shadow_type) # 3 GTK_SHADOW_ETCHED_IN , 1 GTK_SHADOW_IN
  36.                 controls['frame'].set_label(f_label)
  37.                 controls['ali'].set_padding(alig_pad, alig_pad, alig_pad, alig_pad)
  38.                 controls['frame'].add(controls['ali'])
  39.                 controls['grid'].set_row_spacing(gri_row_sp)
  40.                 controls['grid'].set_column_spacing(gri_colu_sp)
  41.                 controls['grid'].set_column_homogeneous(gri_homog) # True
  42.                 controls['ali'].add(controls['grid'])
  43.                 controls['frame'].show()
  44.                 controls['ali'].show()
  45.                 controls['grid'].show()
  46.                 return controls
  47.        
  48.         def make_spinbut(self, init, min, max, step, page, digits, numeric):
  49.                 controls = {'adj':Gtk.Adjustment(init, min, max, step, page), 'spinner':Gtk.SpinButton()}
  50.                 controls['spinner'].set_adjustment(controls['adj'])
  51.                 controls['spinner'].set_digits(digits)
  52.                 controls['spinner'].set_numeric(numeric)
  53.                 controls['spinner'].show()
  54.                 return controls
  55.        
  56.         def make_combobox(self, *vals):
  57.                 controls = {'list':Gtk.ListStore(str), 'cbox':Gtk.ComboBox(), 'cellr':Gtk.CellRendererText()}
  58.                 for i, v in enumerate(vals):
  59.                         controls['list'].append([v])
  60.                 controls['cbox'].set_model(controls['list'])      
  61.                 controls['cbox'].pack_start(controls['cellr'], True)
  62.                 controls['cbox'].add_attribute(controls['cellr'], "text", 0)
  63.                 controls['cbox'].set_active(0)
  64.                 controls['cbox'].show()
  65.                 return controls
  66.        
  67.         def hms2sec(self, hms):
  68.                 result = 0
  69.                 listin = hms.split(':')
  70.                 listin.reverse()
  71.                 for i in range(len(listin)):
  72.                         if listin[i].isdigit():
  73.                                 if i == 0:
  74.                                         mult = 1
  75.                                 if i == 1:
  76.                                         mult = 60
  77.                                 if i == 2:
  78.                                         mult = 3600
  79.                                 result = result + (int(listin[i])*mult)            
  80.                 return result
  81.              
  82.         def adj_change(self, adjustment, value, lower, upper , step_increment, page_increment):
  83.                 adjustment.set_value(value)
  84.                 adjustment.set_lower(lower)
  85.                 adjustment.set_upper(upper)
  86.                 adjustment.set_step_increment(step_increment)
  87.                 adjustment.set_page_increment(page_increment)
  88.                 #adjustment.set_page_size(page_size)
  89.        
  90.        
  91.        
  92. class ProgrammaGTK(reuse_init):
  93.        
  94.  
  95.         def __init__(self):
  96.                
  97.                 self.window =  Gtk.Window(type=Gtk.WindowType.TOPLEVEL)
  98.                 self.window.connect("destroy", self.on_window_destroy)
  99.                 self.window.set_title("4FFmpeg")
  100.                 self.window.set_position(1) # 1 center, 0 none,
  101.                 self.window.set_border_width(3)
  102.                 self.window.set_default_size(500,-1)
  103.                 #----------------------------------
  104.                
  105.                 #page1 stuff ------------------------------------------
  106.                
  107.                 # page1 VBox -------------------------
  108.                 self.vbox1 = Gtk.VBox()
  109.                 self.vbox1.set_spacing(2)
  110.                
  111.                 # map --------------------------------------
  112.                 self.make_map()        
  113.                 # add map frame
  114.                 self.vbox1.pack_start(self.f_map['frame'], 1, 0, 0)
  115.                
  116.                 #time cut ------------------------------------
  117.                 self.make_time_cut()
  118.                 # add time frame
  119.                 self.vbox1.pack_start(self.f_time['frame'], 1, 0, 0)
  120.                
  121.                 # deinterlace -----------------------
  122.                 self.make_deinterlace()
  123.                 # add deinterlace frame
  124.                 self.vbox1.pack_start(self.f_deint['frame'], 1, 0, 0)
  125.                
  126.                 # crop ----------------------------------------
  127.                 self.make_crop()        
  128.                 # add crop frame -------------------
  129.                 self.vbox1.pack_start(self.frame_crop['frame'], 1, 0, 0)
  130.        
  131.                 # scale ------------------------------
  132.                 self.make_scale()
  133.                 # add scale frame------------------
  134.                 self.vbox1.pack_start(self.frame_scale['frame'], 1, 0, 0)
  135.  
  136.                 # denoise ----------------------------
  137.                 self.make_denoise()
  138.                 # add denoise frame------------------------
  139.                 self.vbox1.pack_start(self.frame_dn['frame'], 1, 0, 0)
  140.                
  141.                 #test-------------------
  142.                 #self.f_test = self.make_frame_ag(3, "TEST" , 6, 8, 8, True)
  143.                 #self.label_test = Gtk.Label("TEST")
  144.                 #self.f_test['grid'].attach(self.label_test, 0, 0, 1, 1)
  145.  
  146.                 #self.vbox1.pack_start(self.f_test['frame'], 1, 0, 0)
  147.                 #-------------------------------------
  148.                
  149.                 # page 1 output------------------------
  150.                 self.frame_out = self.make_frame_ag(3, '  FFmpeg video filter string (select and copy):  ' , 12, 8, 8, True)
  151.                 self.labelout = Gtk.Label("")
  152.                 self.labelout.set_selectable(1)
  153.                 self.frame_out['grid'].attach(self.labelout, 0, 0, 1 ,1)
  154.                 # add output frame ---------------------
  155.                 self.vbox1.pack_start(self.frame_out['frame'], 1, 0, 0)
  156.                
  157.                 # end page1 stuff
  158.                
  159.                
  160.                 # page2 stuff ------------------------------------------
  161.                
  162.                 # page2 VBox -------------------------
  163.                 self.vbox_pg2 = Gtk.VBox()
  164.                 self.vbox_pg2.set_spacing(2)
  165.                
  166.                 #volumedetect ------------------------------------
  167.                 self.make_volume_det()
  168.                 # add volumedetect frame        
  169.                 self.vbox_pg2.pack_start(self.f_volume_det['frame'], 1, 0, 0)
  170.                
  171.                
  172.                 # end page2 stuff
  173.                
  174.                 # page 3 stuff -----------------------------------------
  175.                
  176.                 # page3 VBox -------------------------
  177.                 self.vbox_pg3 = Gtk.VBox()
  178.                 self.vbox_pg3.set_spacing(2)
  179.                
  180.                 # audio codec -------------------
  181.                 self.make_audio_codec()
  182.                 #add frame audio codec
  183.                 self.vbox_pg3.pack_start(self.f_3acodec['frame'], 1, 0, 0)
  184.                
  185.                 # video codec -------------------
  186.                 self.make_video_codec()
  187.                 #add frame video codec
  188.                 self.vbox_pg3.pack_start(self.f_3vcodec['frame'], 1, 0, 0)
  189.                
  190.                 # other options ----------------
  191.                 self.make_other_opts()
  192.                 #add frame other options
  193.                 self.vbox_pg3.pack_start(self.f3_oth['frame'], 1, 0, 0)
  194.                
  195.                 # page3 output ---------------------
  196.                 self.f3_out = self.make_frame_ag(3, "  730 command  " , 6, 8, 8, True)
  197.                 self.f3_out_label = Gtk.Label("")
  198.                 self.f3_out['grid'].attach(self.f3_out_label, 0, 0, 1, 1)
  199.                 # add frame page3 output
  200.                 self.vbox_pg3.pack_start(self.f3_out['frame'], 1, 0, 0)
  201.                
  202.                 # run 730 ---------------------------------
  203.                 self.make_run_730()
  204.                 # add frame run 730
  205.                 self.vbox_pg3.pack_start(self.f3_run['frame'], 1, 0, 0)
  206.                
  207.                
  208.                 #---------------------------------------------------
  209.                 # main vbox
  210.                 self.main_vbox = Gtk.VBox()
  211.                
  212.                 # notebook      
  213.                 self.notebook = Gtk.Notebook()
  214.                 self.notebook.set_tab_pos(0)  #GTK_POS_LEFT
  215.                 self.notebook.set_show_border (False)
  216.                 self.main_vbox.pack_start(self.notebook, 1, 0, 0)
  217.                
  218.                 #page 1
  219.                 self.tab1label = Gtk.Label("Video filters")
  220.                 self.page1_ali = Gtk.Alignment()
  221.                 self.page1_ali.set_padding(0, 6, 6, 6)
  222.                 self.page1_ali.add(self.vbox1)
  223.                 self.notebook.append_page(self.page1_ali, self.tab1label)
  224.                
  225.                 #page 2
  226.                 self.tab2label = Gtk.Label("Audio")
  227.                 self.page2_ali = Gtk.Alignment()
  228.                 self.page2_ali.set_padding(0, 6, 6, 6)
  229.                 self.page2_ali.add(self.vbox_pg2)
  230.                 self.notebook.append_page(self.page2_ali, self.tab2label)
  231.                
  232.                 #page 3
  233.                 self.tab3label = Gtk.Label("730")
  234.                 self.page3_ali = Gtk.Alignment()
  235.                 self.page3_ali.set_padding(0, 6, 6, 6)
  236.                 self.page3_ali.add(self.vbox_pg3)
  237.                 self.notebook.append_page(self.page3_ali, self.tab3label)
  238.                
  239.                 #---------------------------------------------------
  240.                
  241.                 # low part buttons and term --------------------------
  242.                 self.make_low_part()
  243.                 # add low part-----------------
  244.                 self.main_vbox.pack_start(self.gridterm, 1, 1, 0)
  245.                
  246.                 #---------------------------------------------------------
  247.                 self.window.add (self.main_vbox)
  248.                 #---------------------------------
  249.                 self.window.show_all()
  250.                
  251.                 # inizializza variabili
  252.                 self.final_vf_str = ""
  253.                 self.final_af_str = ""
  254.                 self.deint_str = ""
  255.                 self.crop_str = ""
  256.                 self.scalestr = ""
  257.                 self.dn_str = ""
  258.                 self.filter_test_str = ""
  259.                 self.video_width = "0"
  260.                 self.video_height = "0"
  261.                 self.add_1_1 = True
  262.                 self.maps_str = ""
  263.                 self.time_final_srt = ""
  264.                 self.final_codec_str = "-aaq -crf 21"
  265.                 self.final_other_str = ""
  266.                 self.a_copy = 0
  267.                 self.v_copy = 0
  268.                 self.make_p3_out_command()
  269.                
  270.         def make_deinterlace(self):
  271.                 self.f_deint = self.make_frame_ag(3, "" , 6, 8, 8, True)
  272.                 self.checkdeint = Gtk.CheckButton("deinterlace")
  273.                 self.checkdeint.connect("toggled", self.on_deint_clicked)
  274.                 self.f_deint['grid'].attach(self.checkdeint, 0, 0, 1, 1)
  275.                
  276.                 self.box_deint = self.make_combobox(
  277.                   "yadif",
  278.                   "postprocessing linear blend"
  279.                   )
  280.                 self.f_deint['grid'].attach(self.box_deint['cbox'], 1, 0, 1, 1)
  281.                 self.box_deint['cbox'].connect("changed", self.on_deint_clicked)
  282.        
  283.         def make_map(self):
  284.                 self.f_map = self.make_frame_ag(3, "" , 6, 8, 8, True)
  285.                 #
  286.                 self.check_map = Gtk.CheckButton("map")
  287.                 self.check_map.connect("toggled", self.on_map_clicked) # toggled or activate (enter)
  288.                 self.f_map['grid'].attach(self.check_map, 0, 0, 1, 1)
  289.                 #
  290.                 self.mapstream_label = self.make_label("streams: ")
  291.                 self.f_map['grid'].attach(self.mapstream_label, 1, 0, 1, 1)
  292.                 #
  293.                 self.entry_map = Gtk.Entry()
  294.                 self.entry_map.set_tooltip_text("use 0:0  or  0:0,0:1,0:2")
  295.                 self.entry_map.connect("changed", self.on_map_clicked)
  296.                 self.f_map['grid'].attach(self.entry_map, 2, 0, 1, 1)
  297.                 #
  298.                 self.map_label = Gtk.Label("")
  299.                 self.f_map['grid'].attach(self.map_label, 3, 0, 1, 1)
  300.        
  301.         def make_time_cut(self):
  302.                 self.f_time = self.make_frame_ag(3, "" , 6, 8, 8, True)
  303.                 #
  304.                 self.check_time = Gtk.CheckButton("time")
  305.                 self.check_time.connect("toggled", self.on_time_clicked) # toggled or activate (enter)
  306.                 self.f_time['grid'].attach(self.check_time, 0, 0, 1, 1)
  307.                 #
  308.                 self.label_time_in = self.make_label("from: ")
  309.                 self.f_time['grid'].attach(self.label_time_in, 1, 0, 1, 1)
  310.                 self.entry_timein = Gtk.Entry()
  311.                 self.entry_timein.set_tooltip_text("use: 30 or 00:00:30")
  312.                 self.entry_timein.connect("changed", self.on_time_clicked)
  313.                 self.f_time['grid'].attach(self.entry_timein, 2, 0, 1, 1)
  314.                
  315.                 self.label_time_out = self.make_label("to: ")
  316.                 self.f_time['grid'].attach(self.label_time_out, 3, 0, 1, 1)
  317.                 self.entry_timeout = Gtk.Entry()
  318.                 self.entry_timeout.set_tooltip_text("use: 30 or 00:00:30")
  319.                 self.entry_timeout.connect("changed", self.on_time_clicked)
  320.                 self.f_time['grid'].attach(self.entry_timeout, 4, 0, 1, 1)
  321.                 #self.label_time_cmd = Gtk.Label("")
  322.                 #self.f_time['grid'].attach(self.label_time_cmd, 0, 1, 1, 1)
  323.        
  324.         def make_scale(self):
  325.                 self.frame_scale = self.make_frame_ag(3, '  scale  ' , 6, 8, 8, True)
  326.                 # ------------------------------
  327.                 self.box1 = self.make_combobox(
  328.                   "None",
  329.                   "W",
  330.                   "H"
  331.                   )
  332.                 self.frame_scale['grid'].attach(self.box1['cbox'], 0, 0, 1, 1)
  333.                 self.box1['cbox'].connect("changed", self.on_scale_clicked)
  334.                 #------------------------------------
  335.                 self.box2 = self.make_combobox(
  336.                   "16/9",
  337.                   "4/3"
  338.                   )
  339.                 self.frame_scale['grid'].attach(self.box2['cbox'], 0, 1, 1, 1)
  340.                 self.box2['cbox'].connect("changed", self.on_scale_clicked)
  341.                 #-----------------------------------------
  342.                 self.size_spinner = self.make_slider_and_spinner(720, 200, 2000, 1, 10, 0)
  343.                 self.frame_scale['grid'].attach(self.size_spinner['slider'], 1, 0, 1, 1)
  344.                 self.frame_scale['grid'].attach(self.size_spinner['spinner'], 2, 0, 1, 1)
  345.                 self.size_spinner['slider'].set_size_request(150,-1)
  346.                 self.size_spinner['adj'].set_value(720.001) #mettere decimali se no non si vede
  347.                 self.size_spinner['adj'].connect("value-changed", self.on_scale_clicked)
  348.                 #-------------------------------------------------------
  349.                 self.check = Gtk.CheckButton("lanczos")
  350.                 self.check.connect("toggled", self.on_scale_clicked)
  351.                 self.frame_scale['grid'].attach(self.check, 2, 1, 1, 1)
  352.                
  353.         def make_crop(self):
  354.                 self.frame_crop = self.make_frame_ag(3, '' , 6, 2, 0, True)
  355.                 # -------
  356.                 self.checkcr = Gtk.CheckButton("crop")
  357.                 self.checkcr.connect("toggled", self.on_crop_clicked)
  358.                 self.frame_crop['grid'].attach(self.checkcr, 0, 0, 1, 1)
  359.                 #----------
  360.                 self.butcrode = Gtk.Button(label="Crop detect")
  361.                 self.butcrode.connect("clicked", self.on_butcrode_clicked)
  362.                 self.frame_crop['grid'].attach(self.butcrode, 0, 1, 1, 1)
  363.                 #-----------
  364.                 self.labelcropinw = self.make_label("input W: ")
  365.                 self.frame_crop['grid'].attach(self.labelcropinw, 1, 0, 1, 1)
  366.                 self.labelcropinh = self.make_label("input H: ")
  367.                 self.frame_crop['grid'].attach(self.labelcropinh, 1, 1, 1, 1)
  368.                 #
  369.                 self.spincw = self.make_spinbut(640 , 100 , 1920 , 10 , 1 , 0, True )
  370.                 self.spincw["adj"].connect("value-changed", self.on_crop_clicked)
  371.                 self.frame_crop['grid'].attach(self.spincw["spinner"], 2, 0, 1, 1)
  372.                 #
  373.                 self.spinch = self.make_spinbut(480 , 100 , 1280 , 10 , 1 , 0, True )
  374.                 self.spinch["adj"].connect("value-changed", self.on_crop_clicked)
  375.                 self.frame_crop['grid'].attach(self.spinch["spinner"], 2, 1, 1, 1)
  376.                 #
  377.                
  378.                 self.labelcroptop = self.make_label("crop Top: ")
  379.                 self.frame_crop['grid'].attach(self.labelcroptop, 3, 0, 1, 1)
  380.                 self.labelcropbot = self.make_label("crop Bottom: ")
  381.                 self.frame_crop['grid'].attach(self.labelcropbot, 3, 1, 1, 1)
  382.                 #
  383.                
  384.                 self.spinct = self.make_spinbut(0 , 0 , 600 , 1 , 10 , 0, True )
  385.                 self.spinct["adj"].connect("value-changed", self.on_crop_clicked)
  386.                 self.frame_crop['grid'].attach(self.spinct["spinner"], 4, 0, 1, 1)
  387.                 #
  388.                 self.spincb = self.make_spinbut(0 , 0 , 600 , 1 , 10 , 0, True )
  389.                 self.spincb["adj"].connect("value-changed", self.on_crop_clicked)
  390.                 self.frame_crop['grid'].attach(self.spincb["spinner"], 4, 1, 1, 1)
  391.                 #
  392.                
  393.                 self.labelcroplef = self.make_label("crop Left: ")
  394.                 self.frame_crop['grid'].attach(self.labelcroplef, 5, 0, 1, 1)
  395.                 self.labelcroprig = self.make_label("crop Right: ")
  396.                 self.frame_crop['grid'].attach(self.labelcroprig, 5, 1, 1, 1)
  397.                 #
  398.                 self.spincl = self.make_spinbut(0 , 0 , 600 , 1 , 10 , 0, True )
  399.                 self.spincl["adj"].connect("value-changed", self.on_crop_clicked)
  400.                 self.frame_crop['grid'].attach(self.spincl["spinner"], 6, 0, 1, 1)
  401.                 #
  402.                 self.spincr = self.make_spinbut(0 , 0 , 600 , 1 , 10 , 0, True )
  403.                 self.spincr["adj"].connect("value-changed", self.on_crop_clicked)
  404.                 self.frame_crop['grid'].attach(self.spincr["spinner"], 6, 1, 1, 1)
  405.                
  406.                
  407.         def make_denoise(self):
  408.                 self.frame_dn = self.make_frame_ag(3, '' , 6, 8, 8, True)
  409.                 # ----------------------
  410.                 self.checkdn = Gtk.CheckButton("denoise")
  411.                 self.checkdn.connect("toggled", self.on_dn_clicked)
  412.                 self.frame_dn['grid'].attach(self.checkdn, 0, 0, 1, 1)
  413.                 # -------------------------
  414.                 self.labeldn = Gtk.Label("hqdn3d:")
  415.                 self.labeldn.set_alignment(1.0, 0.5)
  416.                 self.frame_dn['grid'].attach(self.labeldn, 1, 0, 1, 1)
  417.                 #----------------------------------------
  418.                 self.spindn = self.make_spinbut(4 , 2 , 8 , 1 , 10 , 0, True )
  419.                 self.spindn["adj"].connect("value-changed", self.on_dn_clicked)
  420.                 self.frame_dn['grid'].attach(self.spindn["spinner"], 2, 0, 1, 1)
  421.                
  422.         def make_low_part(self):
  423.                 # grid
  424.                 self.gridterm = Gtk.Grid()
  425.                 self.gridterm.set_row_spacing(2)
  426.                 self.gridterm.set_column_spacing(2)
  427.                 self.gridterm.set_column_homogeneous(True) # True
  428.                 # filechooserbutton
  429.                 self.filechooserbutton = Gtk.FileChooserButton(title="FileChooserButton")
  430.                 #
  431.                 #self.filechooserbutton.set_action(2) # 0 open file, 1 save file, 2 select folder, 3 create folder
  432.                 #
  433.                 self.filechooserbutton.connect("file-set", self.file_changed)  
  434.                 # terminal
  435.                 self.terminal     = Vte.Terminal()
  436.                 self.terminal.fork_command_full(
  437.                         Vte.PtyFlags.DEFAULT, #default is fine
  438.                         os.getcwd(), #where to start the command?   os.environ['HOME']
  439.                         ["/bin/sh"], #where is the emulator?
  440.                         [], #it's ok to leave this list empty
  441.                         GLib.SpawnFlags.DO_NOT_REAP_CHILD,
  442.                         None, #at least None is required
  443.                         None,
  444.                         )
  445.                 self.scroller = Gtk.ScrolledWindow()
  446.                 self.scroller.set_hexpand(True)
  447.                 self.scroller.set_vexpand(True)
  448.                 self.scroller.add(self.terminal)
  449.                 self.scroller.set_min_content_height(90)
  450.                 #self.gridterm.attach(self.scroller, 0, 1, 6, 1)
  451.                 #ff command button
  452.                 self.butplay = Gtk.Button(label="FFplay")
  453.                 self.butplay.connect("clicked", self.on_butplay_clicked)
  454.                 self.butplay.set_sensitive(False)
  455.                 self.butprobe = Gtk.Button(label="FFprobe")
  456.                 self.butprobe.connect("clicked", self.on_butprobe_clicked)
  457.                 self.butprobe.set_sensitive(False)
  458.                 #self.butcrode = Gtk.Button(label="Crop detect")
  459.                 #self.butcrode.connect("clicked", self.on_butcrode_clicked)
  460.                 self.butcrode.set_sensitive(False)
  461.                 self.buttest = Gtk.Button(label="Test")
  462.                 self.buttest.connect("clicked", self.on_buttest_clicked)
  463.                 self.buttest.set_sensitive(False)
  464.                 self.buttestspl = Gtk.Button(label="Test split")
  465.                 self.buttestspl.connect("clicked", self.on_buttestspl_clicked)
  466.                 self.buttestspl.set_sensitive(False)
  467.                
  468.                 self.gridterm.attach(self.filechooserbutton, 0, 0, 1, 1)
  469.                 self.gridterm.attach(self.butprobe, 1, 0, 1, 1)
  470.                 self.gridterm.attach(self.butplay, 2, 0, 1, 1)
  471.                 #self.gridterm.attach(self.butcrode, 3, 0, 1, 1)
  472.                 self.gridterm.attach(self.buttest, 3, 0, 1, 1)
  473.                 self.gridterm.attach(self.buttestspl, 4, 0, 1, 1)
  474.                
  475.                 self.gridterm.attach(self.scroller, 0, 1, 5, 1)
  476.  
  477.         def make_volume_det(self):
  478.                 self.f_volume_det = self.make_frame_ag(3, "" , 6, 8, 8, True)
  479.                 #
  480.                 self.but_volume_det = Gtk.Button(label="Volume detect")
  481.                 self.but_volume_det.connect("clicked", self.on_but_volume_det_clicked)
  482.                 self.but_volume_det.set_sensitive(False)
  483.                 self.f_volume_det['grid'].attach(self.but_volume_det, 0, 0, 1, 1)
  484.                 #
  485.                 self.label_maxvol = Gtk.Label("")
  486.                 self.f_volume_det['grid'].attach(self.label_maxvol, 2, 0, 1, 1)
  487.                 self.label_meanvol = Gtk.Label("")
  488.                 self.f_volume_det['grid'].attach(self.label_meanvol, 3, 0, 1, 1)
  489.                 #
  490.                 self.check_vol = Gtk.CheckButton("volume")
  491.                 self.check_vol.connect("toggled", self.on_volume_clicked)
  492.                 self.f_volume_det['grid'].attach(self.check_vol, 0, 1, 1, 1)
  493.                 #
  494.                 self.label_db = self.make_label("dB: ")
  495.                 self.f_volume_det['grid'].attach(self.label_db, 1, 1, 1, 1)
  496.                 self.spin_db = self.make_spinbut(0 , -6 , 20 , 0.1 , 1 , 2, True )
  497.                 self.spin_db["adj"].connect("value-changed", self.on_volume_clicked)
  498.                 self.f_volume_det['grid'].attach(self.spin_db["spinner"], 2, 1, 1, 1)
  499.                 self.label_ratio = self.make_label("ratio: ")
  500.                 self.f_volume_det['grid'].attach(self.label_ratio, 3, 1, 1, 1)
  501.                 self.label_ratio_val = Gtk.Label("")
  502.                 self.f_volume_det['grid'].attach(self.label_ratio_val, 4, 1, 1, 1)
  503.  
  504.        
  505.         def make_audio_codec(self):
  506.                 self.f_3acodec = self.make_frame_ag(3, "  audio codec  " , 6, 8, 8, True)
  507.                 #
  508.                 self.box_ac = self.make_combobox(
  509.                   "libfaac quality (def. 100)",
  510.                   "aacplus (64 Kb/s)",
  511.                   "aacplus (32 Kb/s)",
  512.                   "no audio",
  513.                   "audio copy"
  514.                   )
  515.                 self.f_3acodec['grid'].attach(self.box_ac['cbox'], 0, 0, 1, 1)
  516.                 self.box_ac['cbox'].connect("changed", self.on_codec_audio_changed)
  517.                 #
  518.                 self.spin_ac = self.make_spinbut(100 , 80 , 160 , 10 , 1 , 0, True )
  519.                 self.spin_ac["adj"].connect("value-changed", self.on_codec_clicked)
  520.                 self.f_3acodec['grid'].attach(self.spin_ac["spinner"], 1, 0, 1, 1)
  521.                 #
  522.                 self.f3ac_label_out = Gtk.Label("-aaq")
  523.                 self.f_3acodec['grid'].attach(self.f3ac_label_out, 2, 0, 1, 1)
  524.        
  525.         def make_video_codec(self):
  526.                 self.f_3vcodec = self.make_frame_ag(3, "  video codec  " , 6, 8, 8, True)
  527.                 self.box_vcodec = self.make_combobox(
  528.                   "libx264",
  529.                   "video copy"
  530.                   )
  531.                 self.f_3vcodec['grid'].attach(self.box_vcodec['cbox'], 0, 0, 1, 1)
  532.                 self.box_vcodec['cbox'].connect("changed", self.on_codec_video_changed)
  533.                 #
  534.                 self.box_vrc = self.make_combobox(
  535.                   "crf",
  536.                   "bitrate kb/s"
  537.                   )
  538.                 self.f_3vcodec['grid'].attach(self.box_vrc['cbox'], 1, 0, 1, 1)
  539.                 self.box_vrc['cbox'].connect("changed", self.on_codec_vrc_changed)
  540.                 #
  541.                 self.spin_vc = self.make_spinbut(21.3 , 15 , 40 , 0.1 , 1 , 1, True )
  542.                 self.spin_vc["adj"].connect("value-changed", self.on_codec_clicked)
  543.                 self.f_3vcodec['grid'].attach(self.spin_vc["spinner"], 2, 0, 1, 1)
  544.                 #
  545.                 self.f3v_label_out = Gtk.Label("-crf 21.3")
  546.                 self.f_3vcodec['grid'].attach(self.f3v_label_out, 3, 0, 1, 1)
  547.        
  548.         def make_other_opts(self):
  549.                 self.f3_oth = self.make_frame_ag(3, "  other options  " , 6, 8, 8, True)
  550.                 #
  551.                 self.check_2pass = Gtk.CheckButton("2 pass")
  552.                 self.check_2pass.connect("toggled", self.on_f3_other_clicked)
  553.                 self.f3_oth['grid'].attach(self.check_2pass, 0, 0, 1, 1)
  554.                 self.check_2pass.set_sensitive(False)
  555.                 #
  556.                 self.check_nometa = Gtk.CheckButton("no metatag")
  557.                 self.check_nometa.connect("toggled", self.on_f3_other_clicked)
  558.                 self.f3_oth['grid'].attach(self.check_nometa, 1, 0, 1, 1)
  559.                 #
  560.                 self.check_cpu = Gtk.CheckButton("cpu 3")
  561.                 self.check_cpu.connect("toggled", self.on_f3_other_clicked)
  562.                 self.f3_oth['grid'].attach(self.check_cpu, 2, 0, 1, 1)
  563.                 #
  564.                 self.check_debug = Gtk.CheckButton("debug")
  565.                 self.check_debug.connect("toggled", self.on_f3_other_clicked)
  566.                 self.f3_oth['grid'].attach(self.check_debug, 3, 0, 1, 1)
  567.                
  568.         def make_run_730(self):
  569.                 self.f3_run = self.make_frame_ag(3, "  execute in terminal  " , 6, 8, 8, True)
  570.                 #
  571.                 self.but_f3_run = Gtk.Button(label="RUN")
  572.                 self.but_f3_run.connect("clicked", self.on_but_f3_run_clicked)
  573.                 self.but_f3_run.set_sensitive(False)
  574.                 self.f3_run['grid'].attach(self.but_f3_run, 0, 0, 1, 1)
  575.                 #
  576.                 self.f3_run_file = Gtk.Label("no input file")
  577.                 self.f3_run['grid'].attach(self.f3_run_file, 0, 1, 1, 1)
  578.                 #
  579.                 self.f3_dur_file = Gtk.Label("")
  580.                 self.f3_run['grid'].attach(self.f3_dur_file, 0, 2, 1, 1)
  581.                
  582.         # signal handlers -----------------------------------------------
  583.         def on_window_destroy(self, *args):
  584.                 Gtk.main_quit(*args)
  585.        
  586.         def on_scale_clicked(self, button):
  587.                 if (self.box1['cbox'].get_active() != 0):
  588.                         self.calcola_scale()
  589.                 else:
  590.                         self.scalestr = ""
  591.                         self.outfilter()
  592.                  
  593.         def on_deint_clicked(self, button):
  594.                 self.deint_str = ""
  595.                 if self.checkdeint.get_active():
  596.                         deint_val = self.box_deint['cbox'].get_active()
  597.                         if (deint_val == 0):
  598.                                 self.deint_str = "yadif"
  599.                         elif (deint_val == 1):
  600.                                 self.deint_str = "pp=lb"
  601.                 self.outfilter()
  602.                        
  603.         def on_dn_clicked(self, button):
  604.                 self.dn_str = ""
  605.                 if self.checkdn.get_active():
  606.                         dn_val = int( self.spindn['adj'].get_value() )
  607.                         self.dn_str = "hqdn3d=" + str(dn_val)
  608.                 self.outfilter()
  609.                    
  610.         def on_crop_clicked(self, button):
  611.                 ok = 0
  612.                 self.crop_str = ""
  613.                 if self.checkcr.get_active():
  614.                         ok = 1
  615.                 if ok:
  616.                         inW = int(self.spincw['adj'].get_value())
  617.                         inH = int(self.spinch['adj'].get_value())
  618.                         crT = int(self.spinct['adj'].get_value())
  619.                         crB = int(self.spincb['adj'].get_value())
  620.                         crL = int(self.spincl['adj'].get_value())
  621.                         crR = int(self.spincr['adj'].get_value())      
  622.                         finW = inW - crL - crR
  623.                         finH = inH - crT - crB
  624.                         if ( (finW < 100) or (finH < 100) ):
  625.                                 self.crop_str = (" ** invalid crop ** ")
  626.                         else:
  627.                                 self.crop_str = "crop=" + str(finW) + ":" \
  628.                                  + str(finH) + ":" \
  629.                                  + str(crL)  + ":" \
  630.                                  + str(crT)
  631.                 if (self.box2['cbox'].get_active() != 2):
  632.                         self.outfilter()
  633.                 else:
  634.                         self.on_scale_clicked(button)
  635.                
  636.         def file_changed(self, filechooserbutton):              
  637.                 if self.filechooserbutton.get_filename():
  638.                         self.butplay.set_sensitive(True)
  639.                         self.butprobe.set_sensitive(True)
  640.                         self.butcrode.set_sensitive(True)
  641.                         self.spinct['adj'].set_value(0)
  642.                         self.spincb['adj'].set_value(0)
  643.                         self.spincl['adj'].set_value(0)
  644.                         self.spincr['adj'].set_value(0)
  645.                         self.buttest.set_sensitive(True)
  646.                         self.buttestspl.set_sensitive(True)
  647.                         self.but_volume_det.set_sensitive(True)
  648.                         self.but_volume_det.set_label("Volume detect")
  649.                         self.label_meanvol.set_label("")
  650.                         self.label_maxvol.set_label("")
  651.                         self.spin_db["adj"].set_value(0)
  652.                         self.but_f3_run.set_sensitive(True)
  653.                         #
  654.                         self.command = "clear" + "\n"
  655.                         length = len(self.command)
  656.                         self.terminal.feed_child(self.command, length)
  657.                         # need ffprobe
  658.                         filename = self.filechooserbutton.get_filename()
  659.                         self.f3_run_file.set_label(filename)
  660.                         cmnd = ['ffprobe', '-show_format', '-show_streams', '-pretty', '-loglevel', 'quiet', filename]
  661.                         p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  662.                         out, err =  p.communicate()
  663.                         out = out.decode() # python3
  664.                         for line in out.split('\n'):
  665.                                 line = line.strip()
  666.                                 if line.startswith('width='):
  667.                                         s = line
  668.                                         width = s.split('width=', 1)
  669.                                         #print "Video pixel width is: %s" % width[1]
  670.                                         self.video_width = width[1]
  671.                                         self.spincw['adj'].set_value(float(self.video_width)) #mettere decimali se no non si vede
  672.                                         self.spincw['spinner'].set_sensitive(False)
  673.                                 elif line.startswith('height='):
  674.                                         s = line
  675.                                         height = s.split('height=', 1)
  676.                                         #print "Video pixel height is: %s" % height[1]
  677.                                         self.video_height = height[1]    
  678.                                         self.spinch['adj'].set_value(float(self.video_height)) #mettere decimali se no non si vede
  679.                                         self.spinch['spinner'].set_sensitive(False)
  680.                                         if self.add_1_1:
  681.                                                 self.box2['list'].append(["as input"])
  682.                                         self.add_1_1 = False
  683.                                 elif line.startswith('duration='):
  684.                                         s = line
  685.                                         duration = s.split('duration=', 1)
  686.                                         dur = duration[1].split('.')
  687.                                         self.f3_dur_file.set_label(dur[0])
  688.              
  689.         def on_butplay_clicked(self, button):
  690.                 self.command = "ffplay \"" + self.filechooserbutton.get_filename() + "\"" +"\n"
  691.                 length = len(self.command)
  692.                 self.terminal.feed_child(self.command, length)
  693.                
  694.         def on_butprobe_clicked(self, button):
  695.                 self.command = "ffprobe \"" + self.filechooserbutton.get_filename() + "\""  + " 2>&1 | grep 'Input\|Duration\|Stream'" + "\n"
  696.                 length = len(self.command)
  697.                 self.terminal.feed_child(self.command, length)    
  698.                
  699.         def on_butcrode_clicked(self, button):
  700.                 # need ffmpeg
  701.                 self.butcrode.set_sensitive(False)
  702.                 filename = self.filechooserbutton.get_filename()
  703.                 #cmnd = ['ffplay' , '-vf', 'cropdetect', '-autoexit' ,'-ss', '60' , '-t' , '1',  filename]
  704.                 cmnd = "ffmpeg -i " + "\"" + filename + "\"" + " -ss 60 -t 1 -vf cropdetect -f null - 2>&1 | awk \'/crop/ { print $NF }\' | tail -1"
  705.                 p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
  706.                 out, err =  p.communicate()
  707.                 out = out.decode()
  708.                 for line in out.split('\n'):
  709.                         line = line.strip()
  710.                         if "crop=" in line:  
  711.                                 aa = line.split('crop=', 1)
  712.                                 aaa = aa[1]
  713.                                 listdata = aaa.split(':')
  714.                                 w = listdata[0]
  715.                                 h = listdata[1]
  716.                                 offx = listdata[2]
  717.                                 offy = listdata[3]
  718.                                 ctop = int(offy)
  719.                                 cbot = int(self.video_height) - int(offy) -int(h)
  720.                                 cleft = int(offx)
  721.                                 cright = int(self.video_width) - int(offx) -int(w)
  722.                                 self.spinct['adj'].set_value(float(ctop))
  723.                                 self.spincb['adj'].set_value(float(cbot))
  724.                                 self.spincl['adj'].set_value(float(cleft))
  725.                                 self.spincr['adj'].set_value(float(cright))  
  726.                                 break
  727.                 self.butcrode.set_sensitive(True)
  728.                
  729.         def on_buttest_clicked(self, button):
  730.                 # -map preview: only with none -vf option  
  731.                 if (self.maps_str == ""):
  732.                         self.command = "ffplay \"" + self.filechooserbutton.get_filename() + "\" " \
  733.                          + " " + self.time_final_srt + " " \
  734.                          + "-vf "  + self.filter_test_str + "\n"
  735.                 else:
  736.                         self.command = "ffmpeg -i \"" + self.filechooserbutton.get_filename() + "\" " \
  737.                          + self.maps_str  + " " + self.time_final_srt + " "
  738.                         if (self.filter_test_str != ""):
  739.                                 self.command = self.command + " -vf "  + self.filter_test_str
  740.                         self.command = self.command +  " -c copy -f matroska - | ffplay -" + "\n"
  741.                 length = len(self.command)
  742.                 self.terminal.feed_child(self.command, length)
  743.                
  744.         def on_buttestspl_clicked(self, button):
  745.                 self.command = "ffplay \"" + self.filechooserbutton.get_filename() + "\" " \
  746.                   + " " + self.time_final_srt + " " \
  747.                   + " -vf \"split[a][b]; [a]pad=iw:(ih*2)+4:color=888888 [src]; [b]" \
  748.                   + self.filter_test_str + " [filt]; [src][filt]overlay=((main_w - w)/2):main_h/2\"" + "\n"
  749.                 length = len(self.command)
  750.                 self.terminal.feed_child(self.command, length)
  751.        
  752.         def on_but_volume_det_clicked(self, button):
  753.                 #self.but_volume_det.set_label("Wait")
  754.                 self.but_volume_det.set_sensitive(False)        
  755.                 filename = self.filechooserbutton.get_filename()        
  756.                 cmnd = "ffmpeg -i " + "\"" + filename + "\" " + " -vn -af volumedetect -f null /dev/null 2>&1 | grep \'mean_volume\\|max_volume\'"              
  757.                 p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
  758.                 out, err =  p.communicate()
  759.                 out = out.decode()
  760.                 for line in out.split('\n'):
  761.                         line = line.strip()
  762.                         if "mean_volume:" in line:  
  763.                                 aa = line.split('mean_volume:', 1)
  764.                                 mea_vol_det = aa[1]
  765.                                 self.label_meanvol.set_label("Mean vol: " + mea_vol_det)
  766.                         if "max_volume:" in line:  
  767.                                 aa = line.split('max_volume:', 1)
  768.                                 max_vol_det = aa[1]
  769.                                 self.label_maxvol.set_label("Max vol: " + max_vol_det)
  770.                 self.but_volume_det.set_label("volume detected")
  771.        
  772.         def on_volume_clicked(self, button):
  773.                 self.label_ratio_val.set_label("")
  774.                 self.final_af_str = ""
  775.                 db = self.spin_db["adj"].get_value()
  776.                 if (db != 0.00):
  777.                         ratio = math.pow(10, (db/20.0))
  778.                         ratio = float("{0:.3f}".format(ratio))    
  779.                         self.label_ratio_val.set_label(str(ratio))
  780.                         self.final_af_str = "-af volume=" + str(ratio)
  781.                 self.make_p3_out_command()
  782.        
  783.         def on_map_clicked(self, button):
  784.                 self.map_label.set_label("")
  785.                 self.maps_str = ""
  786.                 if self.check_map.get_active():
  787.                         map_in = self.entry_map.get_chars(0, -1)
  788.                         if (map_in != ""):
  789.                                 map_l = map_in.split(",")
  790.                                 for i in range(len(map_l)):
  791.                                         if self.maps_str == "":
  792.                                                 self.maps_str = self.maps_str + "-map " + map_l[i]
  793.                                         else:
  794.                                                 self.maps_str = self.maps_str + " -map " + map_l[i]
  795.                                 self.map_label.set_label(self.maps_str)
  796.                 self.outfilter()
  797.                 self.make_p3_out_command()
  798.                
  799.         def on_time_clicked(self, button):
  800.                 self.time_final_srt = ""
  801.                        
  802.                 if self.check_time.get_active():
  803.                         timein = 0
  804.                         timeout = 0
  805.                         timedur = 0
  806.                         timein_ent = self.entry_timein.get_chars(0, -1)
  807.                         if (timein_ent != ""):
  808.                                 if timein_ent.isdigit():
  809.                                         timein = int(timein_ent)        
  810.                                 else:  
  811.                                         timein = self.hms2sec(timein_ent)
  812.                         timeout_ent = self.entry_timeout.get_chars(0, -1)
  813.                         if (timeout_ent != ""):
  814.                                 if timeout_ent.isdigit():
  815.                                         timeout = int(timeout_ent)
  816.                                         timedur = timeout - timein
  817.                                 else:  
  818.                                         timeout = self.hms2sec(timeout_ent)
  819.                                         timedur = timeout - timein
  820.                         if (timein != 0):
  821.                                 self.time_final_srt = self.time_final_srt + " -ss " + str(timein)  
  822.                         if (timedur != 0):
  823.                                 self.time_final_srt = self.time_final_srt + " -t " + str(timedur)    
  824.                 self.outfilter()
  825.                 self.make_p3_out_command()
  826.        
  827.         def on_codec_audio_changed(self, button):
  828.                 a_cod = self.box_ac['cbox'].get_active()
  829.                 if (a_cod == 0): # aaq
  830.                         self.spin_ac['spinner'].set_sensitive(True)
  831.                         self.spin_ac['adj'].set_value(100.0)
  832.                 else:
  833.                         self.spin_ac['spinner'].set_sensitive(False)
  834.                 self.on_codec_clicked(button)
  835.        
  836.         def on_codec_video_changed(self, button):
  837.                 self.on_codec_clicked(button)
  838.        
  839.         def on_codec_vrc_changed(self, button):
  840.                 self.video_rc = self.box_vrc['cbox'].get_active() #0 crf, 1 kb/s
  841.                 if (self.video_rc == 0):
  842.                         self.adj_change(self.spin_vc['adj'], 21.3, 15, 40, 0.1, 1)
  843.                         self.spin_vc['adj'].set_value(21.3)
  844.                         self.check_2pass.set_active(False)
  845.                         self.check_2pass.set_sensitive(False)
  846.                 elif (self.video_rc == 1):
  847.                         self.adj_change(self.spin_vc['adj'], 730, 300, 4000, 10, 100)
  848.                         self.spin_vc['adj'].set_value(730.0)
  849.                         self.check_2pass.set_sensitive(True)
  850.        
  851.         def on_codec_clicked(self, button):
  852.                 self.a_copy = 0
  853.                 self.v_copy = 0
  854.                 self.final_codec_str = ""
  855.                 audio_codec = self.box_ac['cbox'].get_active() # 0 aaq. 1 a64 , 2 a32 , 3 audio none
  856.                 if (audio_codec == 0):
  857.                         audio_codec_str = "-aaq"
  858.                         quality_faac = self.spin_ac['adj'].get_value()
  859.                         if (quality_faac != 100):
  860.                                 audio_codec_str = audio_codec_str + " " + str(int(quality_faac))
  861.                 elif (audio_codec == 1):
  862.                         audio_codec_str = "-a64"
  863.                 elif (audio_codec == 2):
  864.                         audio_codec_str = "-a32"
  865.                 elif (audio_codec == 3):
  866.                         audio_codec_str = "-an"
  867.                 elif (audio_codec == 4):
  868.                         audio_codec_str = "-acopy"
  869.                         self.a_copy = 1
  870.                 self.f3ac_label_out.set_label(audio_codec_str)
  871.                 #
  872.                 self.pg2_str = audio_codec_str
  873.                 # video
  874.                 video_codec = self.box_vcodec['cbox'].get_active() #0 x264, 1 -vcopy
  875.                 if (video_codec == 1):
  876.                         video_codec_str = "-vcopy"
  877.                         self.v_copy = 1
  878.                         self.box_vrc['cbox'].set_sensitive(False)
  879.                         self.spin_vc['spinner'].set_sensitive(False)
  880.                 else:
  881.                         self.box_vrc['cbox'].set_sensitive(True)
  882.                         self.spin_vc['spinner'].set_sensitive(True)
  883.                         self.video_rc = self.box_vrc['cbox'].get_active() #0 crf, 1 kb/s
  884.                         if (self.video_rc == 0):        
  885.                                 video_codec_str = "-crf " + str(self.spin_vc['adj'].get_value())
  886.                         elif (self.video_rc == 1):
  887.                                 video_codec_str = "-b " + str(int(self.spin_vc['adj'].get_value()))
  888.                
  889.                 self.f3v_label_out.set_label(video_codec_str)    
  890.                 self.final_codec_str = audio_codec_str + " " + video_codec_str
  891.                 self.make_p3_out_command()
  892.        
  893.         def on_f3_other_clicked(self, button):
  894.                 self.final_other_str = ""
  895.                 if self.check_nometa.get_active():
  896.                         self.final_other_str = "-nometa"
  897.                 if self.check_2pass.get_active():
  898.                         if (self.final_other_str == ""):
  899.                                 self.final_other_str = "" + "-pass 2"
  900.                         else:
  901.                                 self.final_other_str = self.final_other_str + " " + "-pass 2"
  902.                 if self.check_cpu.get_active():
  903.                         if (self.final_other_str == ""):
  904.                                 self.final_other_str = "-cpu 3"
  905.                         else:
  906.                                 self.final_other_str = self.final_other_str + " " + "-cpu 3"
  907.                 if self.check_debug.get_active():
  908.                         if (self.final_other_str == ""):
  909.                                 self.final_other_str = "debug"
  910.                         else:
  911.                                 self.final_other_str = self.final_other_str + " " + "debug"
  912.                 self.make_p3_out_command()
  913.                
  914.         def on_but_f3_run_clicked(self, button):
  915.                 self.command = "/home/mc/730-ffmpeg-tool-2 \"" \
  916.                   + self.filechooserbutton.get_filename() + "\" " \
  917.                   + self.p3_command + "\n"
  918.                 length = len(self.command)
  919.                 self.terminal.feed_child(self.command, length)
  920.         # 730-ffmpeg-tool-2 = personal cli utility for ffmpeg
  921.                
  922.         # -------------------------------------    
  923.         def calcola_scale(self):
  924.                 self.scalestr = ""
  925.                 numero = self.size_spinner['adj'].get_value()
  926.                 numero = int(numero/4)*4
  927.                 dar = self.box2['cbox'].get_active()
  928.                 lato = self.box1['cbox'].get_active()          
  929.                 if (dar == 1): # 4/3
  930.                         if (lato == 1):
  931.                                 n2 = numero/4*3
  932.                         else:
  933.                                 n2 = numero/3*4
  934.                         setdar = ",setdar=4/3,setsar=1/1"
  935.                 elif (dar == 0): # 16/9
  936.                         if (lato == 1):
  937.                                 n2 = numero/16*9
  938.                         else:
  939.                                 n2 = numero/9*16
  940.                         setdar = ",setdar=16/9,setsar=1/1"      
  941.                 elif (dar == 2): #1/1 same as input  
  942.                         w = int(self.video_width)
  943.                         h = int(self.video_height)
  944.                         if self.checkcr.get_active():
  945.                                 crT = int(self.spinct['adj'].get_value())
  946.                                 crB = int(self.spincb['adj'].get_value())
  947.                                 crL = int(self.spincl['adj'].get_value())
  948.                                 crR = int(self.spincr['adj'].get_value())
  949.                                 h = h - crT - crB
  950.                                 w = w - crL - crR
  951.                         if (lato == 1): # h                
  952.                                 n2 = (float(h)/(w/float(numero)))  
  953.                         else:
  954.                                 n2 = (float(w)/(h/float(numero)))
  955.                         setdar = ""
  956.                 n2 = int(n2/4)*4                    
  957.                 self.scalestr = "scale="
  958.                 if (lato == 1):
  959.                         self.scalestr = self.scalestr + str(numero) + ":" + str(n2)
  960.                 else:
  961.                         self.scalestr = self.scalestr + str(n2) + ":" + str(numero)                  
  962.                 lanc = self.check.get_active()  
  963.                 if lanc:
  964.                         self.scalestr = self.scalestr + ":flags=lanczos" + setdar  
  965.                 else:
  966.                         self.scalestr = self.scalestr + setdar
  967.                 self.outfilter()
  968.                      
  969.         def outfilter(self):
  970.                 final_str = ""
  971.                 if (self.deint_str != ""):
  972.                         final_str = final_str + self.deint_str    
  973.                 if (self.crop_str != ""):
  974.                         if (final_str == ""):
  975.                                 final_str = final_str + self.crop_str
  976.                         else:
  977.                                         final_str = final_str + "," + self.crop_str
  978.                 if (self.scalestr != ""):
  979.                         if (final_str == ""):
  980.                                 final_str = final_str + self.scalestr
  981.                         else:
  982.                                 final_str = final_str + "," + self.scalestr
  983.                 if (self.dn_str != ""):
  984.                         if (final_str == ""):
  985.                                 final_str = final_str + self.dn_str
  986.                         else:
  987.                                 final_str = final_str + "," + self.dn_str              
  988.                 self.filter_test_str = final_str
  989.                
  990.                 if (final_str != ""):
  991.                         self.final_vf_str = "-vf " + final_str
  992.                 else:
  993.                         self.final_vf_str = ""
  994.                
  995.                 label_str = ""          
  996.                 if (self.maps_str != ""):
  997.                         label_str = label_str + self.maps_str + " "  
  998.                 if (self.time_final_srt != ""):
  999.                         label_str = label_str + self.time_final_srt + " "
  1000.                 if (self.final_vf_str != ""):
  1001.                         label_str = label_str + self.final_vf_str
  1002.                    
  1003.                 self.labelout.set_text(label_str)
  1004.                 self.make_p3_out_command()
  1005.        
  1006.         def make_p3_out_command(self):
  1007.                 pass
  1008.                 self.p3_command = ""
  1009.                 self.f3_out_label.set_label("")
  1010.                 if (self.maps_str != ""):
  1011.                         self.p3_command = self.maps_str + " "  
  1012.                 if (self.time_final_srt != ""):
  1013.                         self.p3_command = self.p3_command + self.time_final_srt + " "
  1014.                 if ( (self.final_vf_str != "") and (self.v_copy == 0) ): # check -vcopy
  1015.                         self.p3_command = self.p3_command + self.final_vf_str + " "
  1016.                 if ( (self.final_af_str != "") and (self.a_copy == 0) ):  # check -acopy
  1017.                         self.p3_command = self.p3_command + self.final_af_str + " "
  1018.                 if (self.final_codec_str != ""):
  1019.                         self.p3_command = self.p3_command + self.final_codec_str + " "
  1020.                 if (self.final_other_str != ""):
  1021.                         self.p3_command = self.p3_command + self.final_other_str + " "
  1022.                 self.f3_out_label.set_label(self.p3_command)
  1023.                
  1024.         def main(self):
  1025.                 Gtk.main()
  1026.  
  1027.                
  1028.        
  1029.  
  1030. if __name__ == "__main__":
  1031.         hwg = ProgrammaGTK()
  1032.         Gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement