Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # work in python3.4
- from gi.repository import Gtk, GObject, Vte
- from gi.repository import GLib
- import os
- import sys, subprocess, shlex, re
- from subprocess import call
- import math
- class reuse_init(object):
- def make_label(self, text):
- label = Gtk.Label(text)
- label.set_use_underline(True)
- label.set_alignment(1.0, 0.5)
- label.show()
- return label
- def make_slider_and_spinner(self, init, min, max, step, page, digits):
- controls = {'adj':Gtk.Adjustment(init, min, max, step, page), 'slider':Gtk.HScale(), 'spinner':Gtk.SpinButton()}
- controls['slider'].set_adjustment(controls['adj'])
- controls['slider'].set_draw_value(False)
- controls['spinner'].set_adjustment(controls['adj'])
- controls['spinner'].set_digits(digits)
- controls['slider'].show()
- controls['spinner'].show()
- return controls
- def make_frame_ag(self, f_shadow_type, f_label, alig_pad, gri_row_sp, gri_colu_sp, gri_homog):
- controls = {'frame':Gtk.Frame(), 'ali':Gtk.Alignment(), 'grid':Gtk.Grid()}
- controls['frame'].set_shadow_type(f_shadow_type) # 3 GTK_SHADOW_ETCHED_IN , 1 GTK_SHADOW_IN
- controls['frame'].set_label(f_label)
- controls['ali'].set_padding(alig_pad, alig_pad, alig_pad, alig_pad)
- controls['frame'].add(controls['ali'])
- controls['grid'].set_row_spacing(gri_row_sp)
- controls['grid'].set_column_spacing(gri_colu_sp)
- controls['grid'].set_column_homogeneous(gri_homog) # True
- controls['ali'].add(controls['grid'])
- controls['frame'].show()
- controls['ali'].show()
- controls['grid'].show()
- return controls
- def make_spinbut(self, init, min, max, step, page, digits, numeric):
- controls = {'adj':Gtk.Adjustment(init, min, max, step, page), 'spinner':Gtk.SpinButton()}
- controls['spinner'].set_adjustment(controls['adj'])
- controls['spinner'].set_digits(digits)
- controls['spinner'].set_numeric(numeric)
- controls['spinner'].show()
- return controls
- def make_combobox(self, *vals):
- controls = {'list':Gtk.ListStore(str), 'cbox':Gtk.ComboBox(), 'cellr':Gtk.CellRendererText()}
- for i, v in enumerate(vals):
- controls['list'].append([v])
- controls['cbox'].set_model(controls['list'])
- controls['cbox'].pack_start(controls['cellr'], True)
- controls['cbox'].add_attribute(controls['cellr'], "text", 0)
- controls['cbox'].set_active(0)
- controls['cbox'].show()
- return controls
- def hms2sec(self, hms):
- result = 0
- listin = hms.split(':')
- listin.reverse()
- for i in range(len(listin)):
- if listin[i].isdigit():
- if i == 0:
- mult = 1
- if i == 1:
- mult = 60
- if i == 2:
- mult = 3600
- result = result + (int(listin[i])*mult)
- return result
- def adj_change(self, adjustment, value, lower, upper , step_increment, page_increment):
- adjustment.set_value(value)
- adjustment.set_lower(lower)
- adjustment.set_upper(upper)
- adjustment.set_step_increment(step_increment)
- adjustment.set_page_increment(page_increment)
- #adjustment.set_page_size(page_size)
- class ProgrammaGTK(reuse_init):
- def __init__(self):
- self.window = Gtk.Window(type=Gtk.WindowType.TOPLEVEL)
- self.window.connect("destroy", self.on_window_destroy)
- self.window.set_title("4FFmpeg")
- self.window.set_position(1) # 1 center, 0 none,
- self.window.set_border_width(3)
- self.window.set_default_size(500,-1)
- #----------------------------------
- #page1 stuff ------------------------------------------
- # page1 VBox -------------------------
- self.vbox1 = Gtk.VBox()
- self.vbox1.set_spacing(2)
- # map --------------------------------------
- self.make_map()
- # add map frame
- self.vbox1.pack_start(self.f_map['frame'], 1, 0, 0)
- #time cut ------------------------------------
- self.make_time_cut()
- # add time frame
- self.vbox1.pack_start(self.f_time['frame'], 1, 0, 0)
- # deinterlace -----------------------
- self.make_deinterlace()
- # add deinterlace frame
- self.vbox1.pack_start(self.f_deint['frame'], 1, 0, 0)
- # crop ----------------------------------------
- self.make_crop()
- # add crop frame -------------------
- self.vbox1.pack_start(self.frame_crop['frame'], 1, 0, 0)
- # scale ------------------------------
- self.make_scale()
- # add scale frame------------------
- self.vbox1.pack_start(self.frame_scale['frame'], 1, 0, 0)
- # denoise ----------------------------
- self.make_denoise()
- # add denoise frame------------------------
- self.vbox1.pack_start(self.frame_dn['frame'], 1, 0, 0)
- #test-------------------
- #self.f_test = self.make_frame_ag(3, "TEST" , 6, 8, 8, True)
- #self.label_test = Gtk.Label("TEST")
- #self.f_test['grid'].attach(self.label_test, 0, 0, 1, 1)
- #self.vbox1.pack_start(self.f_test['frame'], 1, 0, 0)
- #-------------------------------------
- # page 1 output------------------------
- self.frame_out = self.make_frame_ag(3, ' FFmpeg video filter string (select and copy): ' , 12, 8, 8, True)
- self.labelout = Gtk.Label("")
- self.labelout.set_selectable(1)
- self.frame_out['grid'].attach(self.labelout, 0, 0, 1 ,1)
- # add output frame ---------------------
- self.vbox1.pack_start(self.frame_out['frame'], 1, 0, 0)
- # end page1 stuff
- # page2 stuff ------------------------------------------
- # page2 VBox -------------------------
- self.vbox_pg2 = Gtk.VBox()
- self.vbox_pg2.set_spacing(2)
- #volumedetect ------------------------------------
- self.make_volume_det()
- # add volumedetect frame
- self.vbox_pg2.pack_start(self.f_volume_det['frame'], 1, 0, 0)
- # end page2 stuff
- # page 3 stuff -----------------------------------------
- # page3 VBox -------------------------
- self.vbox_pg3 = Gtk.VBox()
- self.vbox_pg3.set_spacing(2)
- # audio codec -------------------
- self.make_audio_codec()
- #add frame audio codec
- self.vbox_pg3.pack_start(self.f_3acodec['frame'], 1, 0, 0)
- # video codec -------------------
- self.make_video_codec()
- #add frame video codec
- self.vbox_pg3.pack_start(self.f_3vcodec['frame'], 1, 0, 0)
- # other options ----------------
- self.make_other_opts()
- #add frame other options
- self.vbox_pg3.pack_start(self.f3_oth['frame'], 1, 0, 0)
- # page3 output ---------------------
- self.f3_out = self.make_frame_ag(3, " 730 command " , 6, 8, 8, True)
- self.f3_out_label = Gtk.Label("")
- self.f3_out['grid'].attach(self.f3_out_label, 0, 0, 1, 1)
- # add frame page3 output
- self.vbox_pg3.pack_start(self.f3_out['frame'], 1, 0, 0)
- # run 730 ---------------------------------
- self.make_run_730()
- # add frame run 730
- self.vbox_pg3.pack_start(self.f3_run['frame'], 1, 0, 0)
- #---------------------------------------------------
- # main vbox
- self.main_vbox = Gtk.VBox()
- # notebook
- self.notebook = Gtk.Notebook()
- self.notebook.set_tab_pos(0) #GTK_POS_LEFT
- self.notebook.set_show_border (False)
- self.main_vbox.pack_start(self.notebook, 1, 0, 0)
- #page 1
- self.tab1label = Gtk.Label("Video filters")
- self.page1_ali = Gtk.Alignment()
- self.page1_ali.set_padding(0, 6, 6, 6)
- self.page1_ali.add(self.vbox1)
- self.notebook.append_page(self.page1_ali, self.tab1label)
- #page 2
- self.tab2label = Gtk.Label("Audio")
- self.page2_ali = Gtk.Alignment()
- self.page2_ali.set_padding(0, 6, 6, 6)
- self.page2_ali.add(self.vbox_pg2)
- self.notebook.append_page(self.page2_ali, self.tab2label)
- #page 3
- self.tab3label = Gtk.Label("730")
- self.page3_ali = Gtk.Alignment()
- self.page3_ali.set_padding(0, 6, 6, 6)
- self.page3_ali.add(self.vbox_pg3)
- self.notebook.append_page(self.page3_ali, self.tab3label)
- #---------------------------------------------------
- # low part buttons and term --------------------------
- self.make_low_part()
- # add low part-----------------
- self.main_vbox.pack_start(self.gridterm, 1, 1, 0)
- #---------------------------------------------------------
- self.window.add (self.main_vbox)
- #---------------------------------
- self.window.show_all()
- # inizializza variabili
- self.final_vf_str = ""
- self.final_af_str = ""
- self.deint_str = ""
- self.crop_str = ""
- self.scalestr = ""
- self.dn_str = ""
- self.filter_test_str = ""
- self.video_width = "0"
- self.video_height = "0"
- self.add_1_1 = True
- self.maps_str = ""
- self.time_final_srt = ""
- self.final_codec_str = "-aaq -crf 21"
- self.final_other_str = ""
- self.a_copy = 0
- self.v_copy = 0
- self.make_p3_out_command()
- def make_deinterlace(self):
- self.f_deint = self.make_frame_ag(3, "" , 6, 8, 8, True)
- self.checkdeint = Gtk.CheckButton("deinterlace")
- self.checkdeint.connect("toggled", self.on_deint_clicked)
- self.f_deint['grid'].attach(self.checkdeint, 0, 0, 1, 1)
- self.box_deint = self.make_combobox(
- "yadif",
- "postprocessing linear blend"
- )
- self.f_deint['grid'].attach(self.box_deint['cbox'], 1, 0, 1, 1)
- self.box_deint['cbox'].connect("changed", self.on_deint_clicked)
- def make_map(self):
- self.f_map = self.make_frame_ag(3, "" , 6, 8, 8, True)
- #
- self.check_map = Gtk.CheckButton("map")
- self.check_map.connect("toggled", self.on_map_clicked) # toggled or activate (enter)
- self.f_map['grid'].attach(self.check_map, 0, 0, 1, 1)
- #
- self.mapstream_label = self.make_label("streams: ")
- self.f_map['grid'].attach(self.mapstream_label, 1, 0, 1, 1)
- #
- self.entry_map = Gtk.Entry()
- self.entry_map.set_tooltip_text("use 0:0 or 0:0,0:1,0:2")
- self.entry_map.connect("changed", self.on_map_clicked)
- self.f_map['grid'].attach(self.entry_map, 2, 0, 1, 1)
- #
- self.map_label = Gtk.Label("")
- self.f_map['grid'].attach(self.map_label, 3, 0, 1, 1)
- def make_time_cut(self):
- self.f_time = self.make_frame_ag(3, "" , 6, 8, 8, True)
- #
- self.check_time = Gtk.CheckButton("time")
- self.check_time.connect("toggled", self.on_time_clicked) # toggled or activate (enter)
- self.f_time['grid'].attach(self.check_time, 0, 0, 1, 1)
- #
- self.label_time_in = self.make_label("from: ")
- self.f_time['grid'].attach(self.label_time_in, 1, 0, 1, 1)
- self.entry_timein = Gtk.Entry()
- self.entry_timein.set_tooltip_text("use: 30 or 00:00:30")
- self.entry_timein.connect("changed", self.on_time_clicked)
- self.f_time['grid'].attach(self.entry_timein, 2, 0, 1, 1)
- self.label_time_out = self.make_label("to: ")
- self.f_time['grid'].attach(self.label_time_out, 3, 0, 1, 1)
- self.entry_timeout = Gtk.Entry()
- self.entry_timeout.set_tooltip_text("use: 30 or 00:00:30")
- self.entry_timeout.connect("changed", self.on_time_clicked)
- self.f_time['grid'].attach(self.entry_timeout, 4, 0, 1, 1)
- #self.label_time_cmd = Gtk.Label("")
- #self.f_time['grid'].attach(self.label_time_cmd, 0, 1, 1, 1)
- def make_scale(self):
- self.frame_scale = self.make_frame_ag(3, ' scale ' , 6, 8, 8, True)
- # ------------------------------
- self.box1 = self.make_combobox(
- "None",
- "W",
- "H"
- )
- self.frame_scale['grid'].attach(self.box1['cbox'], 0, 0, 1, 1)
- self.box1['cbox'].connect("changed", self.on_scale_clicked)
- #------------------------------------
- self.box2 = self.make_combobox(
- "16/9",
- "4/3"
- )
- self.frame_scale['grid'].attach(self.box2['cbox'], 0, 1, 1, 1)
- self.box2['cbox'].connect("changed", self.on_scale_clicked)
- #-----------------------------------------
- self.size_spinner = self.make_slider_and_spinner(720, 200, 2000, 1, 10, 0)
- self.frame_scale['grid'].attach(self.size_spinner['slider'], 1, 0, 1, 1)
- self.frame_scale['grid'].attach(self.size_spinner['spinner'], 2, 0, 1, 1)
- self.size_spinner['slider'].set_size_request(150,-1)
- self.size_spinner['adj'].set_value(720.001) #mettere decimali se no non si vede
- self.size_spinner['adj'].connect("value-changed", self.on_scale_clicked)
- #-------------------------------------------------------
- self.check = Gtk.CheckButton("lanczos")
- self.check.connect("toggled", self.on_scale_clicked)
- self.frame_scale['grid'].attach(self.check, 2, 1, 1, 1)
- def make_crop(self):
- self.frame_crop = self.make_frame_ag(3, '' , 6, 2, 0, True)
- # -------
- self.checkcr = Gtk.CheckButton("crop")
- self.checkcr.connect("toggled", self.on_crop_clicked)
- self.frame_crop['grid'].attach(self.checkcr, 0, 0, 1, 1)
- #----------
- self.butcrode = Gtk.Button(label="Crop detect")
- self.butcrode.connect("clicked", self.on_butcrode_clicked)
- self.frame_crop['grid'].attach(self.butcrode, 0, 1, 1, 1)
- #-----------
- self.labelcropinw = self.make_label("input W: ")
- self.frame_crop['grid'].attach(self.labelcropinw, 1, 0, 1, 1)
- self.labelcropinh = self.make_label("input H: ")
- self.frame_crop['grid'].attach(self.labelcropinh, 1, 1, 1, 1)
- #
- self.spincw = self.make_spinbut(640 , 100 , 1920 , 10 , 1 , 0, True )
- self.spincw["adj"].connect("value-changed", self.on_crop_clicked)
- self.frame_crop['grid'].attach(self.spincw["spinner"], 2, 0, 1, 1)
- #
- self.spinch = self.make_spinbut(480 , 100 , 1280 , 10 , 1 , 0, True )
- self.spinch["adj"].connect("value-changed", self.on_crop_clicked)
- self.frame_crop['grid'].attach(self.spinch["spinner"], 2, 1, 1, 1)
- #
- self.labelcroptop = self.make_label("crop Top: ")
- self.frame_crop['grid'].attach(self.labelcroptop, 3, 0, 1, 1)
- self.labelcropbot = self.make_label("crop Bottom: ")
- self.frame_crop['grid'].attach(self.labelcropbot, 3, 1, 1, 1)
- #
- self.spinct = self.make_spinbut(0 , 0 , 600 , 1 , 10 , 0, True )
- self.spinct["adj"].connect("value-changed", self.on_crop_clicked)
- self.frame_crop['grid'].attach(self.spinct["spinner"], 4, 0, 1, 1)
- #
- self.spincb = self.make_spinbut(0 , 0 , 600 , 1 , 10 , 0, True )
- self.spincb["adj"].connect("value-changed", self.on_crop_clicked)
- self.frame_crop['grid'].attach(self.spincb["spinner"], 4, 1, 1, 1)
- #
- self.labelcroplef = self.make_label("crop Left: ")
- self.frame_crop['grid'].attach(self.labelcroplef, 5, 0, 1, 1)
- self.labelcroprig = self.make_label("crop Right: ")
- self.frame_crop['grid'].attach(self.labelcroprig, 5, 1, 1, 1)
- #
- self.spincl = self.make_spinbut(0 , 0 , 600 , 1 , 10 , 0, True )
- self.spincl["adj"].connect("value-changed", self.on_crop_clicked)
- self.frame_crop['grid'].attach(self.spincl["spinner"], 6, 0, 1, 1)
- #
- self.spincr = self.make_spinbut(0 , 0 , 600 , 1 , 10 , 0, True )
- self.spincr["adj"].connect("value-changed", self.on_crop_clicked)
- self.frame_crop['grid'].attach(self.spincr["spinner"], 6, 1, 1, 1)
- def make_denoise(self):
- self.frame_dn = self.make_frame_ag(3, '' , 6, 8, 8, True)
- # ----------------------
- self.checkdn = Gtk.CheckButton("denoise")
- self.checkdn.connect("toggled", self.on_dn_clicked)
- self.frame_dn['grid'].attach(self.checkdn, 0, 0, 1, 1)
- # -------------------------
- self.labeldn = Gtk.Label("hqdn3d:")
- self.labeldn.set_alignment(1.0, 0.5)
- self.frame_dn['grid'].attach(self.labeldn, 1, 0, 1, 1)
- #----------------------------------------
- self.spindn = self.make_spinbut(4 , 2 , 8 , 1 , 10 , 0, True )
- self.spindn["adj"].connect("value-changed", self.on_dn_clicked)
- self.frame_dn['grid'].attach(self.spindn["spinner"], 2, 0, 1, 1)
- def make_low_part(self):
- # grid
- self.gridterm = Gtk.Grid()
- self.gridterm.set_row_spacing(2)
- self.gridterm.set_column_spacing(2)
- self.gridterm.set_column_homogeneous(True) # True
- # filechooserbutton
- self.filechooserbutton = Gtk.FileChooserButton(title="FileChooserButton")
- #
- #self.filechooserbutton.set_action(2) # 0 open file, 1 save file, 2 select folder, 3 create folder
- #
- self.filechooserbutton.connect("file-set", self.file_changed)
- # terminal
- self.terminal = Vte.Terminal()
- self.terminal.fork_command_full(
- Vte.PtyFlags.DEFAULT, #default is fine
- os.getcwd(), #where to start the command? os.environ['HOME']
- ["/bin/sh"], #where is the emulator?
- [], #it's ok to leave this list empty
- GLib.SpawnFlags.DO_NOT_REAP_CHILD,
- None, #at least None is required
- None,
- )
- self.scroller = Gtk.ScrolledWindow()
- self.scroller.set_hexpand(True)
- self.scroller.set_vexpand(True)
- self.scroller.add(self.terminal)
- self.scroller.set_min_content_height(90)
- #self.gridterm.attach(self.scroller, 0, 1, 6, 1)
- #ff command button
- self.butplay = Gtk.Button(label="FFplay")
- self.butplay.connect("clicked", self.on_butplay_clicked)
- self.butplay.set_sensitive(False)
- self.butprobe = Gtk.Button(label="FFprobe")
- self.butprobe.connect("clicked", self.on_butprobe_clicked)
- self.butprobe.set_sensitive(False)
- #self.butcrode = Gtk.Button(label="Crop detect")
- #self.butcrode.connect("clicked", self.on_butcrode_clicked)
- self.butcrode.set_sensitive(False)
- self.buttest = Gtk.Button(label="Test")
- self.buttest.connect("clicked", self.on_buttest_clicked)
- self.buttest.set_sensitive(False)
- self.buttestspl = Gtk.Button(label="Test split")
- self.buttestspl.connect("clicked", self.on_buttestspl_clicked)
- self.buttestspl.set_sensitive(False)
- self.gridterm.attach(self.filechooserbutton, 0, 0, 1, 1)
- self.gridterm.attach(self.butprobe, 1, 0, 1, 1)
- self.gridterm.attach(self.butplay, 2, 0, 1, 1)
- #self.gridterm.attach(self.butcrode, 3, 0, 1, 1)
- self.gridterm.attach(self.buttest, 3, 0, 1, 1)
- self.gridterm.attach(self.buttestspl, 4, 0, 1, 1)
- self.gridterm.attach(self.scroller, 0, 1, 5, 1)
- def make_volume_det(self):
- self.f_volume_det = self.make_frame_ag(3, "" , 6, 8, 8, True)
- #
- self.but_volume_det = Gtk.Button(label="Volume detect")
- self.but_volume_det.connect("clicked", self.on_but_volume_det_clicked)
- self.but_volume_det.set_sensitive(False)
- self.f_volume_det['grid'].attach(self.but_volume_det, 0, 0, 1, 1)
- #
- self.label_maxvol = Gtk.Label("")
- self.f_volume_det['grid'].attach(self.label_maxvol, 2, 0, 1, 1)
- self.label_meanvol = Gtk.Label("")
- self.f_volume_det['grid'].attach(self.label_meanvol, 3, 0, 1, 1)
- #
- self.check_vol = Gtk.CheckButton("volume")
- self.check_vol.connect("toggled", self.on_volume_clicked)
- self.f_volume_det['grid'].attach(self.check_vol, 0, 1, 1, 1)
- #
- self.label_db = self.make_label("dB: ")
- self.f_volume_det['grid'].attach(self.label_db, 1, 1, 1, 1)
- self.spin_db = self.make_spinbut(0 , -6 , 20 , 0.1 , 1 , 2, True )
- self.spin_db["adj"].connect("value-changed", self.on_volume_clicked)
- self.f_volume_det['grid'].attach(self.spin_db["spinner"], 2, 1, 1, 1)
- self.label_ratio = self.make_label("ratio: ")
- self.f_volume_det['grid'].attach(self.label_ratio, 3, 1, 1, 1)
- self.label_ratio_val = Gtk.Label("")
- self.f_volume_det['grid'].attach(self.label_ratio_val, 4, 1, 1, 1)
- def make_audio_codec(self):
- self.f_3acodec = self.make_frame_ag(3, " audio codec " , 6, 8, 8, True)
- #
- self.box_ac = self.make_combobox(
- "libfaac quality (def. 100)",
- "aacplus (64 Kb/s)",
- "aacplus (32 Kb/s)",
- "no audio",
- "audio copy"
- )
- self.f_3acodec['grid'].attach(self.box_ac['cbox'], 0, 0, 1, 1)
- self.box_ac['cbox'].connect("changed", self.on_codec_audio_changed)
- #
- self.spin_ac = self.make_spinbut(100 , 80 , 160 , 10 , 1 , 0, True )
- self.spin_ac["adj"].connect("value-changed", self.on_codec_clicked)
- self.f_3acodec['grid'].attach(self.spin_ac["spinner"], 1, 0, 1, 1)
- #
- self.f3ac_label_out = Gtk.Label("-aaq")
- self.f_3acodec['grid'].attach(self.f3ac_label_out, 2, 0, 1, 1)
- def make_video_codec(self):
- self.f_3vcodec = self.make_frame_ag(3, " video codec " , 6, 8, 8, True)
- self.box_vcodec = self.make_combobox(
- "libx264",
- "video copy"
- )
- self.f_3vcodec['grid'].attach(self.box_vcodec['cbox'], 0, 0, 1, 1)
- self.box_vcodec['cbox'].connect("changed", self.on_codec_video_changed)
- #
- self.box_vrc = self.make_combobox(
- "crf",
- "bitrate kb/s"
- )
- self.f_3vcodec['grid'].attach(self.box_vrc['cbox'], 1, 0, 1, 1)
- self.box_vrc['cbox'].connect("changed", self.on_codec_vrc_changed)
- #
- self.spin_vc = self.make_spinbut(21.3 , 15 , 40 , 0.1 , 1 , 1, True )
- self.spin_vc["adj"].connect("value-changed", self.on_codec_clicked)
- self.f_3vcodec['grid'].attach(self.spin_vc["spinner"], 2, 0, 1, 1)
- #
- self.f3v_label_out = Gtk.Label("-crf 21.3")
- self.f_3vcodec['grid'].attach(self.f3v_label_out, 3, 0, 1, 1)
- def make_other_opts(self):
- self.f3_oth = self.make_frame_ag(3, " other options " , 6, 8, 8, True)
- #
- self.check_2pass = Gtk.CheckButton("2 pass")
- self.check_2pass.connect("toggled", self.on_f3_other_clicked)
- self.f3_oth['grid'].attach(self.check_2pass, 0, 0, 1, 1)
- self.check_2pass.set_sensitive(False)
- #
- self.check_nometa = Gtk.CheckButton("no metatag")
- self.check_nometa.connect("toggled", self.on_f3_other_clicked)
- self.f3_oth['grid'].attach(self.check_nometa, 1, 0, 1, 1)
- #
- self.check_cpu = Gtk.CheckButton("cpu 3")
- self.check_cpu.connect("toggled", self.on_f3_other_clicked)
- self.f3_oth['grid'].attach(self.check_cpu, 2, 0, 1, 1)
- #
- self.check_debug = Gtk.CheckButton("debug")
- self.check_debug.connect("toggled", self.on_f3_other_clicked)
- self.f3_oth['grid'].attach(self.check_debug, 3, 0, 1, 1)
- def make_run_730(self):
- self.f3_run = self.make_frame_ag(3, " execute in terminal " , 6, 8, 8, True)
- #
- self.but_f3_run = Gtk.Button(label="RUN")
- self.but_f3_run.connect("clicked", self.on_but_f3_run_clicked)
- self.but_f3_run.set_sensitive(False)
- self.f3_run['grid'].attach(self.but_f3_run, 0, 0, 1, 1)
- #
- self.f3_run_file = Gtk.Label("no input file")
- self.f3_run['grid'].attach(self.f3_run_file, 0, 1, 1, 1)
- #
- self.f3_dur_file = Gtk.Label("")
- self.f3_run['grid'].attach(self.f3_dur_file, 0, 2, 1, 1)
- # signal handlers -----------------------------------------------
- def on_window_destroy(self, *args):
- Gtk.main_quit(*args)
- def on_scale_clicked(self, button):
- if (self.box1['cbox'].get_active() != 0):
- self.calcola_scale()
- else:
- self.scalestr = ""
- self.outfilter()
- def on_deint_clicked(self, button):
- self.deint_str = ""
- if self.checkdeint.get_active():
- deint_val = self.box_deint['cbox'].get_active()
- if (deint_val == 0):
- self.deint_str = "yadif"
- elif (deint_val == 1):
- self.deint_str = "pp=lb"
- self.outfilter()
- def on_dn_clicked(self, button):
- self.dn_str = ""
- if self.checkdn.get_active():
- dn_val = int( self.spindn['adj'].get_value() )
- self.dn_str = "hqdn3d=" + str(dn_val)
- self.outfilter()
- def on_crop_clicked(self, button):
- ok = 0
- self.crop_str = ""
- if self.checkcr.get_active():
- ok = 1
- if ok:
- inW = int(self.spincw['adj'].get_value())
- inH = int(self.spinch['adj'].get_value())
- crT = int(self.spinct['adj'].get_value())
- crB = int(self.spincb['adj'].get_value())
- crL = int(self.spincl['adj'].get_value())
- crR = int(self.spincr['adj'].get_value())
- finW = inW - crL - crR
- finH = inH - crT - crB
- if ( (finW < 100) or (finH < 100) ):
- self.crop_str = (" ** invalid crop ** ")
- else:
- self.crop_str = "crop=" + str(finW) + ":" \
- + str(finH) + ":" \
- + str(crL) + ":" \
- + str(crT)
- if (self.box2['cbox'].get_active() != 2):
- self.outfilter()
- else:
- self.on_scale_clicked(button)
- def file_changed(self, filechooserbutton):
- if self.filechooserbutton.get_filename():
- self.butplay.set_sensitive(True)
- self.butprobe.set_sensitive(True)
- self.butcrode.set_sensitive(True)
- self.spinct['adj'].set_value(0)
- self.spincb['adj'].set_value(0)
- self.spincl['adj'].set_value(0)
- self.spincr['adj'].set_value(0)
- self.buttest.set_sensitive(True)
- self.buttestspl.set_sensitive(True)
- self.but_volume_det.set_sensitive(True)
- self.but_volume_det.set_label("Volume detect")
- self.label_meanvol.set_label("")
- self.label_maxvol.set_label("")
- self.spin_db["adj"].set_value(0)
- self.but_f3_run.set_sensitive(True)
- #
- self.command = "clear" + "\n"
- length = len(self.command)
- self.terminal.feed_child(self.command, length)
- # need ffprobe
- filename = self.filechooserbutton.get_filename()
- self.f3_run_file.set_label(filename)
- cmnd = ['ffprobe', '-show_format', '-show_streams', '-pretty', '-loglevel', 'quiet', filename]
- p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- out, err = p.communicate()
- out = out.decode() # python3
- for line in out.split('\n'):
- line = line.strip()
- if line.startswith('width='):
- s = line
- width = s.split('width=', 1)
- #print "Video pixel width is: %s" % width[1]
- self.video_width = width[1]
- self.spincw['adj'].set_value(float(self.video_width)) #mettere decimali se no non si vede
- self.spincw['spinner'].set_sensitive(False)
- elif line.startswith('height='):
- s = line
- height = s.split('height=', 1)
- #print "Video pixel height is: %s" % height[1]
- self.video_height = height[1]
- self.spinch['adj'].set_value(float(self.video_height)) #mettere decimali se no non si vede
- self.spinch['spinner'].set_sensitive(False)
- if self.add_1_1:
- self.box2['list'].append(["as input"])
- self.add_1_1 = False
- elif line.startswith('duration='):
- s = line
- duration = s.split('duration=', 1)
- dur = duration[1].split('.')
- self.f3_dur_file.set_label(dur[0])
- def on_butplay_clicked(self, button):
- self.command = "ffplay \"" + self.filechooserbutton.get_filename() + "\"" +"\n"
- length = len(self.command)
- self.terminal.feed_child(self.command, length)
- def on_butprobe_clicked(self, button):
- self.command = "ffprobe \"" + self.filechooserbutton.get_filename() + "\"" + " 2>&1 | grep 'Input\|Duration\|Stream'" + "\n"
- length = len(self.command)
- self.terminal.feed_child(self.command, length)
- def on_butcrode_clicked(self, button):
- # need ffmpeg
- self.butcrode.set_sensitive(False)
- filename = self.filechooserbutton.get_filename()
- #cmnd = ['ffplay' , '-vf', 'cropdetect', '-autoexit' ,'-ss', '60' , '-t' , '1', filename]
- cmnd = "ffmpeg -i " + "\"" + filename + "\"" + " -ss 60 -t 1 -vf cropdetect -f null - 2>&1 | awk \'/crop/ { print $NF }\' | tail -1"
- p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
- out, err = p.communicate()
- out = out.decode()
- for line in out.split('\n'):
- line = line.strip()
- if "crop=" in line:
- aa = line.split('crop=', 1)
- aaa = aa[1]
- listdata = aaa.split(':')
- w = listdata[0]
- h = listdata[1]
- offx = listdata[2]
- offy = listdata[3]
- ctop = int(offy)
- cbot = int(self.video_height) - int(offy) -int(h)
- cleft = int(offx)
- cright = int(self.video_width) - int(offx) -int(w)
- self.spinct['adj'].set_value(float(ctop))
- self.spincb['adj'].set_value(float(cbot))
- self.spincl['adj'].set_value(float(cleft))
- self.spincr['adj'].set_value(float(cright))
- break
- self.butcrode.set_sensitive(True)
- def on_buttest_clicked(self, button):
- # -map preview: only with none -vf option
- if (self.maps_str == ""):
- self.command = "ffplay \"" + self.filechooserbutton.get_filename() + "\" " \
- + " " + self.time_final_srt + " " \
- + "-vf " + self.filter_test_str + "\n"
- else:
- self.command = "ffmpeg -i \"" + self.filechooserbutton.get_filename() + "\" " \
- + self.maps_str + " " + self.time_final_srt + " "
- if (self.filter_test_str != ""):
- self.command = self.command + " -vf " + self.filter_test_str
- self.command = self.command + " -c copy -f matroska - | ffplay -" + "\n"
- length = len(self.command)
- self.terminal.feed_child(self.command, length)
- def on_buttestspl_clicked(self, button):
- self.command = "ffplay \"" + self.filechooserbutton.get_filename() + "\" " \
- + " " + self.time_final_srt + " " \
- + " -vf \"split[a][b]; [a]pad=iw:(ih*2)+4:color=888888 [src]; [b]" \
- + self.filter_test_str + " [filt]; [src][filt]overlay=((main_w - w)/2):main_h/2\"" + "\n"
- length = len(self.command)
- self.terminal.feed_child(self.command, length)
- def on_but_volume_det_clicked(self, button):
- #self.but_volume_det.set_label("Wait")
- self.but_volume_det.set_sensitive(False)
- filename = self.filechooserbutton.get_filename()
- cmnd = "ffmpeg -i " + "\"" + filename + "\" " + " -vn -af volumedetect -f null /dev/null 2>&1 | grep \'mean_volume\\|max_volume\'"
- p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
- out, err = p.communicate()
- out = out.decode()
- for line in out.split('\n'):
- line = line.strip()
- if "mean_volume:" in line:
- aa = line.split('mean_volume:', 1)
- mea_vol_det = aa[1]
- self.label_meanvol.set_label("Mean vol: " + mea_vol_det)
- if "max_volume:" in line:
- aa = line.split('max_volume:', 1)
- max_vol_det = aa[1]
- self.label_maxvol.set_label("Max vol: " + max_vol_det)
- self.but_volume_det.set_label("volume detected")
- def on_volume_clicked(self, button):
- self.label_ratio_val.set_label("")
- self.final_af_str = ""
- db = self.spin_db["adj"].get_value()
- if (db != 0.00):
- ratio = math.pow(10, (db/20.0))
- ratio = float("{0:.3f}".format(ratio))
- self.label_ratio_val.set_label(str(ratio))
- self.final_af_str = "-af volume=" + str(ratio)
- self.make_p3_out_command()
- def on_map_clicked(self, button):
- self.map_label.set_label("")
- self.maps_str = ""
- if self.check_map.get_active():
- map_in = self.entry_map.get_chars(0, -1)
- if (map_in != ""):
- map_l = map_in.split(",")
- for i in range(len(map_l)):
- if self.maps_str == "":
- self.maps_str = self.maps_str + "-map " + map_l[i]
- else:
- self.maps_str = self.maps_str + " -map " + map_l[i]
- self.map_label.set_label(self.maps_str)
- self.outfilter()
- self.make_p3_out_command()
- def on_time_clicked(self, button):
- self.time_final_srt = ""
- if self.check_time.get_active():
- timein = 0
- timeout = 0
- timedur = 0
- timein_ent = self.entry_timein.get_chars(0, -1)
- if (timein_ent != ""):
- if timein_ent.isdigit():
- timein = int(timein_ent)
- else:
- timein = self.hms2sec(timein_ent)
- timeout_ent = self.entry_timeout.get_chars(0, -1)
- if (timeout_ent != ""):
- if timeout_ent.isdigit():
- timeout = int(timeout_ent)
- timedur = timeout - timein
- else:
- timeout = self.hms2sec(timeout_ent)
- timedur = timeout - timein
- if (timein != 0):
- self.time_final_srt = self.time_final_srt + " -ss " + str(timein)
- if (timedur != 0):
- self.time_final_srt = self.time_final_srt + " -t " + str(timedur)
- self.outfilter()
- self.make_p3_out_command()
- def on_codec_audio_changed(self, button):
- a_cod = self.box_ac['cbox'].get_active()
- if (a_cod == 0): # aaq
- self.spin_ac['spinner'].set_sensitive(True)
- self.spin_ac['adj'].set_value(100.0)
- else:
- self.spin_ac['spinner'].set_sensitive(False)
- self.on_codec_clicked(button)
- def on_codec_video_changed(self, button):
- self.on_codec_clicked(button)
- def on_codec_vrc_changed(self, button):
- self.video_rc = self.box_vrc['cbox'].get_active() #0 crf, 1 kb/s
- if (self.video_rc == 0):
- self.adj_change(self.spin_vc['adj'], 21.3, 15, 40, 0.1, 1)
- self.spin_vc['adj'].set_value(21.3)
- self.check_2pass.set_active(False)
- self.check_2pass.set_sensitive(False)
- elif (self.video_rc == 1):
- self.adj_change(self.spin_vc['adj'], 730, 300, 4000, 10, 100)
- self.spin_vc['adj'].set_value(730.0)
- self.check_2pass.set_sensitive(True)
- def on_codec_clicked(self, button):
- self.a_copy = 0
- self.v_copy = 0
- self.final_codec_str = ""
- audio_codec = self.box_ac['cbox'].get_active() # 0 aaq. 1 a64 , 2 a32 , 3 audio none
- if (audio_codec == 0):
- audio_codec_str = "-aaq"
- quality_faac = self.spin_ac['adj'].get_value()
- if (quality_faac != 100):
- audio_codec_str = audio_codec_str + " " + str(int(quality_faac))
- elif (audio_codec == 1):
- audio_codec_str = "-a64"
- elif (audio_codec == 2):
- audio_codec_str = "-a32"
- elif (audio_codec == 3):
- audio_codec_str = "-an"
- elif (audio_codec == 4):
- audio_codec_str = "-acopy"
- self.a_copy = 1
- self.f3ac_label_out.set_label(audio_codec_str)
- #
- self.pg2_str = audio_codec_str
- # video
- video_codec = self.box_vcodec['cbox'].get_active() #0 x264, 1 -vcopy
- if (video_codec == 1):
- video_codec_str = "-vcopy"
- self.v_copy = 1
- self.box_vrc['cbox'].set_sensitive(False)
- self.spin_vc['spinner'].set_sensitive(False)
- else:
- self.box_vrc['cbox'].set_sensitive(True)
- self.spin_vc['spinner'].set_sensitive(True)
- self.video_rc = self.box_vrc['cbox'].get_active() #0 crf, 1 kb/s
- if (self.video_rc == 0):
- video_codec_str = "-crf " + str(self.spin_vc['adj'].get_value())
- elif (self.video_rc == 1):
- video_codec_str = "-b " + str(int(self.spin_vc['adj'].get_value()))
- self.f3v_label_out.set_label(video_codec_str)
- self.final_codec_str = audio_codec_str + " " + video_codec_str
- self.make_p3_out_command()
- def on_f3_other_clicked(self, button):
- self.final_other_str = ""
- if self.check_nometa.get_active():
- self.final_other_str = "-nometa"
- if self.check_2pass.get_active():
- if (self.final_other_str == ""):
- self.final_other_str = "" + "-pass 2"
- else:
- self.final_other_str = self.final_other_str + " " + "-pass 2"
- if self.check_cpu.get_active():
- if (self.final_other_str == ""):
- self.final_other_str = "-cpu 3"
- else:
- self.final_other_str = self.final_other_str + " " + "-cpu 3"
- if self.check_debug.get_active():
- if (self.final_other_str == ""):
- self.final_other_str = "debug"
- else:
- self.final_other_str = self.final_other_str + " " + "debug"
- self.make_p3_out_command()
- def on_but_f3_run_clicked(self, button):
- self.command = "/home/mc/730-ffmpeg-tool-2 \"" \
- + self.filechooserbutton.get_filename() + "\" " \
- + self.p3_command + "\n"
- length = len(self.command)
- self.terminal.feed_child(self.command, length)
- # 730-ffmpeg-tool-2 = personal cli utility for ffmpeg
- # -------------------------------------
- def calcola_scale(self):
- self.scalestr = ""
- numero = self.size_spinner['adj'].get_value()
- numero = int(numero/4)*4
- dar = self.box2['cbox'].get_active()
- lato = self.box1['cbox'].get_active()
- if (dar == 1): # 4/3
- if (lato == 1):
- n2 = numero/4*3
- else:
- n2 = numero/3*4
- setdar = ",setdar=4/3,setsar=1/1"
- elif (dar == 0): # 16/9
- if (lato == 1):
- n2 = numero/16*9
- else:
- n2 = numero/9*16
- setdar = ",setdar=16/9,setsar=1/1"
- elif (dar == 2): #1/1 same as input
- w = int(self.video_width)
- h = int(self.video_height)
- if self.checkcr.get_active():
- crT = int(self.spinct['adj'].get_value())
- crB = int(self.spincb['adj'].get_value())
- crL = int(self.spincl['adj'].get_value())
- crR = int(self.spincr['adj'].get_value())
- h = h - crT - crB
- w = w - crL - crR
- if (lato == 1): # h
- n2 = (float(h)/(w/float(numero)))
- else:
- n2 = (float(w)/(h/float(numero)))
- setdar = ""
- n2 = int(n2/4)*4
- self.scalestr = "scale="
- if (lato == 1):
- self.scalestr = self.scalestr + str(numero) + ":" + str(n2)
- else:
- self.scalestr = self.scalestr + str(n2) + ":" + str(numero)
- lanc = self.check.get_active()
- if lanc:
- self.scalestr = self.scalestr + ":flags=lanczos" + setdar
- else:
- self.scalestr = self.scalestr + setdar
- self.outfilter()
- def outfilter(self):
- final_str = ""
- if (self.deint_str != ""):
- final_str = final_str + self.deint_str
- if (self.crop_str != ""):
- if (final_str == ""):
- final_str = final_str + self.crop_str
- else:
- final_str = final_str + "," + self.crop_str
- if (self.scalestr != ""):
- if (final_str == ""):
- final_str = final_str + self.scalestr
- else:
- final_str = final_str + "," + self.scalestr
- if (self.dn_str != ""):
- if (final_str == ""):
- final_str = final_str + self.dn_str
- else:
- final_str = final_str + "," + self.dn_str
- self.filter_test_str = final_str
- if (final_str != ""):
- self.final_vf_str = "-vf " + final_str
- else:
- self.final_vf_str = ""
- label_str = ""
- if (self.maps_str != ""):
- label_str = label_str + self.maps_str + " "
- if (self.time_final_srt != ""):
- label_str = label_str + self.time_final_srt + " "
- if (self.final_vf_str != ""):
- label_str = label_str + self.final_vf_str
- self.labelout.set_text(label_str)
- self.make_p3_out_command()
- def make_p3_out_command(self):
- pass
- self.p3_command = ""
- self.f3_out_label.set_label("")
- if (self.maps_str != ""):
- self.p3_command = self.maps_str + " "
- if (self.time_final_srt != ""):
- self.p3_command = self.p3_command + self.time_final_srt + " "
- if ( (self.final_vf_str != "") and (self.v_copy == 0) ): # check -vcopy
- self.p3_command = self.p3_command + self.final_vf_str + " "
- if ( (self.final_af_str != "") and (self.a_copy == 0) ): # check -acopy
- self.p3_command = self.p3_command + self.final_af_str + " "
- if (self.final_codec_str != ""):
- self.p3_command = self.p3_command + self.final_codec_str + " "
- if (self.final_other_str != ""):
- self.p3_command = self.p3_command + self.final_other_str + " "
- self.f3_out_label.set_label(self.p3_command)
- def main(self):
- Gtk.main()
- if __name__ == "__main__":
- hwg = ProgrammaGTK()
- Gtk.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement