Merge lp:~gaschler/kazam/kazam into lp:kazam/unstable

Proposed by Andre Gaschler
Status: Needs review
Proposed branch: lp:~gaschler/kazam/kazam
Merge into: lp:kazam/unstable
Diff against target: 196 lines (+80/-4)
5 files modified
data/ui/preferences.ui (+27/-0)
kazam/backend/config.py (+1/-0)
kazam/backend/gstreamer.py (+12/-4)
kazam/backend/prefs.py (+4/-0)
kazam/frontend/preferences.py (+36/-0)
To merge this branch: bzr merge lp:~gaschler/kazam/kazam
Reviewer Review Type Date Requested Status
Kazam Team Pending
Review via email: mp+265969@code.launchpad.net

Description of the change

This patch adds an additional combobox to modify the h264 encoder quality in the preferences menu.
I needed this feature to record screencasts at high quality and high frame rate, without generating overly large files from lossless compression.

To post a comment you must log in.

Unmerged revisions

472. By Andre Gaschler

combobox for h264 video quality

471. By Andre Gaschler

add combobox for video quality in preferences

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'data/ui/preferences.ui'
2--- data/ui/preferences.ui 2015-04-05 06:12:50 +0000
3+++ data/ui/preferences.ui 2015-07-27 13:57:16 +0000
4@@ -362,6 +362,33 @@
5 <property name="height">1</property>
6 </packing>
7 </child>
8+ <child>
9+ <object class="GtkLabel" id="label_quality">
10+ <property name="visible">True</property>
11+ <property name="can_focus">False</property>
12+ <property name="xalign">1</property>
13+ <property name="label" translatable="yes">H264 Quality:</property>
14+ </object>
15+ <packing>
16+ <property name="left_attach">0</property>
17+ <property name="top_attach">2</property>
18+ <property name="width">1</property>
19+ <property name="height">1</property>
20+ </packing>
21+ </child>
22+ <child>
23+ <object class="GtkComboBox" id="combobox_quality">
24+ <property name="visible">True</property>
25+ <property name="can_focus">False</property>
26+ <signal name="changed" handler="cb_codec_quality_changed" swapped="no"/>
27+ </object>
28+ <packing>
29+ <property name="left_attach">1</property>
30+ <property name="top_attach">2</property>
31+ <property name="width">1</property>
32+ <property name="height">1</property>
33+ </packing>
34+ </child>
35 </object>
36 <packing>
37 <property name="expand">False</property>
38
39=== modified file 'kazam/backend/config.py'
40--- kazam/backend/config.py 2015-04-04 14:25:19 +0000
41+++ kazam/backend/config.py 2015-07-27 13:57:16 +0000
42@@ -38,6 +38,7 @@
43 "audio2_source": "0",
44 "audio2_volume": "0",
45 "codec": "0",
46+ "codec_quality": "1",
47 "counter": "5",
48 "capture_cursor": "True",
49 "capture_speakers": "False",
50
51=== modified file 'kazam/backend/gstreamer.py'
52--- kazam/backend/gstreamer.py 2015-04-04 14:25:19 +0000
53+++ kazam/backend/gstreamer.py 2015-07-27 13:57:16 +0000
54@@ -242,10 +242,13 @@
55 self.video_convert_caps = Gst.caps_from_string("video/x-raw, format=(string)I420")
56 self.f_video_convert_caps = Gst.ElementFactory.make("capsfilter", "vid_convert_caps")
57 self.f_video_convert_caps.set_property("caps", self.video_convert_caps)
58-
59- self.video_bitrate = 5800
60 self.video_enc = Gst.ElementFactory.make(CODEC_LIST[CODEC_H264][1], "video_encoder")
61- self.video_enc.set_property("bitrate", self.video_bitrate)
62+ if prefs.codec_quality == 0:
63+ self.video_enc.set_property("quantizer", 35)
64+ elif prefs.codec_quality == 0:
65+ self.video_enc.set_property("quantizer", 15)
66+ else:
67+ self.video_enc.set_property("quantizer", 5)
68 self.video_enc.set_property("key-int-max", 30)
69 self.video_enc.set_property("bframes", 0)
70 self.video_enc.set_property("byte-stream", False)
71@@ -284,7 +287,12 @@
72 elif prefs.codec == CODEC_H264:
73 self.video_enc.set_property("speed-preset", "ultrafast")
74 self.video_enc.set_property("pass", 4)
75- self.video_enc.set_property("quantizer", 15)
76+ if prefs.codec_quality == 0:
77+ self.video_enc.set_property("quantizer", 35)
78+ elif prefs.codec_quality == 0:
79+ self.video_enc.set_property("quantizer", 15)
80+ else:
81+ self.video_enc.set_property("quantizer", 5)
82 #
83 # x264enc supports maximum of four cores
84 #
85
86=== modified file 'kazam/backend/prefs.py'
87--- kazam/backend/prefs.py 2015-04-04 14:25:19 +0000
88+++ kazam/backend/prefs.py 2015-07-27 13:57:16 +0000
89@@ -87,6 +87,7 @@
90 # Capture related stuff
91 #
92 self.codec = None
93+ self.codec_quality = 1
94 self.pa_q = None
95 self.framerate = 15
96 self.autosave_video = False
97@@ -305,6 +306,8 @@
98 self.logger.debug("Setting RAW as default codec.")
99 else:
100 self.codec = int(self.config.get("main", "codec"))
101+
102+ self.codec_quality = int(self.config.get("main", "codec_quality"))
103
104 def save_config(self):
105 self.config.set("main", "capture_cursor", self.capture_cursor)
106@@ -335,6 +338,7 @@
107 self.config.set("main", "countdown_splash", self.countdown_splash)
108 self.config.set("main", "counter", self.countdown_timer)
109 self.config.set("main", "codec", self.codec)
110+ self.config.set("main", "codec_quality", self.codec_quality)
111 self.config.set("main", "framerate", self.framerate)
112 self.config.set("main", "autosave_video", self.autosave_video)
113 self.config.set("main", "autosave_video_dir", self.autosave_video_dir)
114
115=== modified file 'kazam/frontend/preferences.py'
116--- kazam/frontend/preferences.py 2015-04-05 06:12:50 +0000
117+++ kazam/frontend/preferences.py 2015-07-27 13:57:16 +0000
118@@ -61,6 +61,7 @@
119 logger.debug("Unable to get name for '%s'" % w)
120
121 codec_renderer = Gtk.CellRendererText()
122+ codec_quality_renderer = Gtk.CellRendererText()
123
124 audio_renderer = Gtk.CellRendererText()
125 audio_renderer.props.ellipsize = Pango.EllipsizeMode.END
126@@ -70,6 +71,9 @@
127
128 self.combobox_codec.pack_start(codec_renderer, True)
129 self.combobox_codec.add_attribute(codec_renderer, "text", 1)
130+
131+ self.combobox_quality.pack_start(codec_quality_renderer, True)
132+ self.combobox_quality.add_attribute(codec_quality_renderer, "text", 1)
133
134 self.combobox_audio.pack_start(audio_renderer, True)
135 self.combobox_audio.add_attribute(audio_renderer, "text", 0)
136@@ -83,6 +87,13 @@
137 self.filechooser_video.set_current_folder(prefs.video_dest)
138
139 self.populate_codecs()
140+ self.populate_codec_qualities()
141+ if prefs.codec == CODEC_H264:
142+ self.combobox_quality.set_sensitive(True)
143+ self.label_quality.set_sensitive(True)
144+ else:
145+ self.combobox_quality.set_sensitive(False)
146+ self.label_quality.set_sensitive(False)
147 if prefs.sound:
148 self.populate_audio_sources()
149 self.populate_shutter_sounds()
150@@ -128,6 +139,16 @@
151 self.combobox_codec.set_model(codec_model)
152 self.combobox_codec.set_row_separator_func(self.is_separator, None)
153
154+ def populate_codec_qualities(self):
155+ #old_model = self.quality_codec.get_model()
156+ #old_model = None
157+ quality_model = Gtk.ListStore(int, str)
158+ quality_model.append([0, "low (minimum file size)"])
159+ quality_model.append([1, "normal"])
160+ quality_model.append([2, "high"])
161+ self.combobox_quality.set_model(quality_model)
162+ self.combobox_quality.set_row_separator_func(self.is_separator, None)
163+
164 def populate_audio_sources(self):
165 speaker_source_model = Gtk.ListStore(str, int)
166 mic_source_model = Gtk.ListStore(str, int)
167@@ -250,6 +271,8 @@
168 codec_iter = codec_model.get_iter(cnt)
169 self.combobox_codec.set_active_iter(codec_iter)
170 prefs.codec = codec_model.get_value(codec_iter, 0)
171+
172+ self.combobox_quality.set_active(prefs.codec_quality)
173
174 #
175 # General callbacks
176@@ -345,7 +368,20 @@
177 model = widget.get_model()
178 c_iter = model.get_iter(i)
179 prefs.codec = model.get_value(c_iter, 0)
180+ if prefs.codec == CODEC_H264:
181+ self.combobox_quality.set_sensitive(True)
182+ self.label_quality.set_sensitive(True)
183+ else:
184+ self.combobox_quality.set_sensitive(False)
185+ self.label_quality.set_sensitive(False)
186 logger.debug('Codec selected: {0} - {1}'.format(get_codec(prefs.codec)[2], prefs.codec))
187+
188+ def cb_codec_quality_changed(self, widget):
189+ i = widget.get_active()
190+ model = widget.get_model()
191+ c_iter = model.get_iter(i)
192+ prefs.codec_quality = model.get_value(c_iter, 0)
193+ logger.debug('Quality selected: {0}'.format(prefs.codec_quality))
194
195 def cb_switch_autosave_video(self, widget, user_data):
196 prefs.autosave_video = widget.get_active()

Subscribers

People subscribed via source and target branches