summaryrefslogtreecommitdiffstats
path: root/gtk/src
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/src')
-rw-r--r--gtk/src/ghb.ui1460
-rw-r--r--gtk/src/hb-backend.c83
-rw-r--r--gtk/src/values.c11
-rw-r--r--gtk/src/widgetdeps.c2
-rw-r--r--gtk/src/x264handler.c164
5 files changed, 974 insertions, 746 deletions
diff --git a/gtk/src/ghb.ui b/gtk/src/ghb.ui
index 9f9df58ae..db1590f3b 100644
--- a/gtk/src/ghb.ui
+++ b/gtk/src/ghb.ui
@@ -139,7 +139,7 @@
</object>
<object class="GtkAdjustment" id="adjustment8">
<property name="upper">16</property>
- <property name="lower">0</property>
+ <property name="lower">1</property>
<property name="page_increment">1</property>
<property name="step_increment">1</property>
<property name="page_size">0</property>
@@ -170,7 +170,7 @@
<property name="page_size">0</property>
</object>
<object class="GtkAdjustment" id="adjustment22">
- <property name="upper">1</property>
+ <property name="upper">2</property>
<property name="lower">0</property>
<property name="page_increment">0.5</property>
<property name="step_increment">0.1</property>
@@ -265,6 +265,14 @@
<property name="page_size">0</property>
<property name="value">0</property>
</object>
+ <object class="GtkAdjustment" id="adjustment34">
+ <property name="upper">1</property>
+ <property name="lower">0</property>
+ <property name="page_increment">0.5</property>
+ <property name="step_increment">0.1</property>
+ <property name="page_size">0</property>
+ <property name="value">1</property>
+ </object>
<object class="GtkAdjustment" id="preview_progress_adj">
<property name="upper">100</property>
<property name="lower">0</property>
@@ -860,7 +868,7 @@
<child>
<object class="GtkComboBox" id="PtoPType">
<property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Format to mux encoded tracks to.</property>
+ <property name="tooltip-text" translatable="yes">Range of title to encode. Can be chapters, seconds, or frames.</property>
<signal handler="ptop_widget_changed_cb" name="changed"/>
</object>
<packing>
@@ -878,8 +886,8 @@
<signal handler="start_point_changed_cb" name="value_changed"/>
</object>
<packing>
- <property name="expand">False</property>
- <property name="position">1</property>
+ <property name="expand">False</property>
+ <property name="position">1</property>
</packing>
</child>
<child>
@@ -888,8 +896,8 @@
<property name="label" translatable="yes">through</property>
</object>
<packing>
- <property name="expand">False</property>
- <property name="position">2</property>
+ <property name="expand">False</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
@@ -902,8 +910,8 @@
<signal handler="end_point_changed_cb" name="value_changed"/>
</object>
<packing>
- <property name="expand">False</property>
- <property name="position">3</property>
+ <property name="expand">False</property>
+ <property name="position">3</property>
</packing>
</child>
<child>
@@ -1184,7 +1192,7 @@
<property name="orientation">vertical</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="spacing">14</property>
+ <property name="spacing">14</property>
<child>
<object class="GtkFrame" id="frame5">
<property name="visible">True</property>
@@ -2597,852 +2605,894 @@ For source audio that has a wide dynamic range (very loud and very soft sequence
</packing>
</child>
<child>
- <object class="GtkHBox" id="x264_tab">
+ <object class="GtkVBox" id="x264_tab">
+ <property name="orientation">vertical</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="spacing">2</property>
<child>
- <object class="GtkVBox" id="vbox21">
- <property name="orientation">vertical</property>
+ <object class="GtkHBox" id="hbox73">
<property name="visible">True</property>
- <property name="spacing">10</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="spacing">2</property>
<child>
- <object class="GtkFrame" id="frame9">
+ <object class="GtkVBox" id="vbox21">
+ <property name="orientation">vertical</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
<child>
- <object class="GtkAlignment" id="alignment25">
+ <object class="GtkFrame" id="frame10">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="top_padding">6</property>
- <property name="left_padding">12</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkVBox" id="vbox22">
- <property name="orientation">vertical</property>
+ <object class="GtkAlignment" id="alignment26">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="top_padding">6</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">2</property>
<child>
- <object class="GtkHBox" id="hbox31">
+ <object class="GtkTable" id="table6">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="spacing">4</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="column-spacing">4</property>
+ <property name="row-spacing">2</property>
<child>
<object class="GtkLabel" id="label49">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Number:</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Reference Frames:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
</object>
<packing>
- <property name="expand">False</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
</packing>
</child>
<child>
- <object class="GtkSpinButton" id="x264_refs">
+ <object class="GtkAlignment" id="alignment41">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Selects the number of reference frames that can be used. Slows down encoding. Good typical values are 3 to 5. Animation can benefit from more (8 to 10).</property>
- <property name="adjustment">adjustment8</property>
- <signal handler="x264_widget_changed_cb" name="value_changed"/>
+ <property name="xalign">0</property>
+ <child>
+ <object class="GtkSpinButton" id="x264_refs">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Sane values are ~1-6. The more you add, the better the compression, but the slower the encode. Cel animation tends to benefit from more reference frames a lot more than film content. Note that many hardware devices have limitations on the number of supported reference frames, so if you're encoding for a handheld or standalone player, don't touch this unless you're absolutely sure you know what you're doing!</property>
+ <property name="adjustment">adjustment8</property>
+ <signal handler="x264_widget_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ </packing>
+ </child>
</object>
<packing>
- <property name="expand">False</property>
- <property name="position">1</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
</packing>
</child>
- </object>
- </child>
- <child>
- <object class="GtkCheckButton" id="x264_mixed_refs">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">This option allows x264 to have greater control over reference frames. Improves quality, but slows down encoding. </property>
- <property name="label" translatable="yes">Mixed References</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="x264_widget_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label50">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">&lt;b&gt;Reference Frames&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="padding">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="frame10">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkAlignment" id="alignment26">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="top_padding">6</property>
- <property name="bottom_padding">2</property>
- <property name="left_padding">12</property>
- <property name="right_padding">2</property>
- <child>
- <object class="GtkTable" id="table6">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="column-spacing">4</property>
- <property name="row-spacing">2</property>
- <child>
- <object class="GtkLabel" id="label51">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Number:</property>
- </object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment38">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
<child>
- <object class="GtkSpinButton" id="x264_bframes">
+ <object class="GtkLabel" id="label51">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">B-Frames cost little in speed, unless you are using b-adapt=2 (optimal). So you generally want to choose a high value. 16 isn't unreasonable.</property>
- <property name="adjustment">adjustment9</property>
- <signal handler="x264_widget_changed_cb" name="value_changed"/>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Maximum B-Frames:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
</object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ </packing>
</child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label52">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Direct Prediction:</property>
- </object>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment39">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
<child>
- <object class="GtkComboBox" id="x264_direct">
+ <object class="GtkAlignment" id="alignment38">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Set prediction mode for 'direct' motion vectors. This option improves compression efficiency.</property>
- <signal handler="x264_widget_changed_cb" name="changed"/>
+ <property name="xalign">0</property>
+ <child>
+ <object class="GtkSpinButton" id="x264_bframes">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Sane values are ~2-5. This specifies the maximum number of sequential B-frames that the encoder can use. Large numbers generally won't help significantly unless Adaptive B-frames is set to Optimal. Cel-animated source material and B-pyramid also significantly increase the usefulness of larger values. Baseline profile, as required for iPods and similar devices, requires B-frames to be set to 0 (off).</property>
+ <property name="adjustment">adjustment9</property>
+ <signal handler="x264_widget_changed_cb" name="value_changed"/>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
</child>
- </object>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label84">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Adaptive B-Frames:</property>
- </object>
- <packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment40">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
<child>
- <object class="GtkComboBox" id="x264_b_adapt">
+ <object class="GtkLabel" id="label50">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-markup" translatable="yes">This setting controls how x264 decides between
-placing a P or B-frame.
-&lt;small&gt;
-Off - Pick B-frames always
-Fast - Speed slightly increases with higher B-frames setting
-Optimal - Speed significantly decreases with higher B-frames setting
-&lt;/small&gt;
-This option can improve compression efficiency. Use 'Optimal' if you can afford the time.</property>
- <signal handler="x264_widget_changed_cb" name="changed"/>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Pyramidal B-Frames:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
</object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="x264_bpyramid">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">B-pyramid improves compression by creating a pyramidal structure (hence the name) of B-frames, allowing B-frames to reference each other to improve compression. Requires Max B-frames greater than 1; optimal adaptive B-frames is strongly recommended for full compression benefit.</property>
+ <signal handler="x264_widget_changed_cb" name="changed"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label40">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Weighted P-Frames:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="x264_weighted_pframes">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Performs extra analysis to decide upon weighting parameters for each frame. This improves overall compression slightly and improves the quality of fades greatly. Baseline profile, as required for iPods and similar devices, requires weighted P-frame prediction to be disabled. Note that some devices and players, even those that support Main Profile, may have problems with Weighted P-frame prediction: the Apple TV is completely incompatible with it, for example.</property>
+ <signal handler="x264_widget_changed_cb" name="changed"/>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="x264_8x8dct">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">The 8x8 transform is the single most useful feature of x264 in terms of compression-per-speed. It improves compression by at least 5% at a very small speed cost and may provide an unusually high visual quality benefit compared to its compression gain. However, it requires High Profile, which many devices may not support.</property>
+ <property name="label" translatable="yes">8x8 Transform</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="x264_widget_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="x264_cabac">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">After the encoder has done its work, it has a bunch of data that needs to be compressed losslessly, similar to ZIP or RAR. H.264 provides two options for this: CAVLC and CABAC. CABAC decodes a lot slower but compresses significantly better (10-30%), especially at lower bitrates. If you're looking to minimize CPU requirements for video playback, disable this option. Baseline profile, as required for iPods and similar devices, requires CABAC to be disabled.</property>
+ <property name="label" translatable="yes">CABAC Entropy Encoding</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="x264_widget_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">2</property>
+ </packing>
</child>
</object>
- <packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="x264_bpyramid">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Allows B-Frames to be used as references for other B-Frames. Improves encoding efficiency with little speed penalty</property>
- <property name="label" translatable="yes">Pyramidal B-Frames</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="x264_widget_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="x_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="x264_weighted_bframes">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Turn on weighted prediction for B-Frames. Improves compression efficiency and has little speed penalty. </property>
- <property name="label" translatable="yes">Weighted B-Frames</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="x264_widget_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- </packing>
</child>
</object>
</child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label53">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">&lt;b&gt;B-Frames&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="frame11">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkAlignment" id="alignment29">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="top_padding">6</property>
- <property name="bottom_padding">2</property>
- <property name="left_padding">12</property>
- <property name="right_padding">2</property>
- <child>
- <object class="GtkScrolledWindow" id="scrolledwindow6">
+ <child type="label">
+ <object class="GtkLabel" id="label53">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">etched-in</property>
- <child>
- <object class="GtkTextView" id="x264Option">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip-text" translatable="yes">Your selected options will appear here.
-You can edit these and add additional options.
-
-Default values will not be shown. The defaults are:
-ref=3:mixed-refs=1:bframes=3:direct=spatial:b-pyramid=0:
-weightb=1:me=hex:merange=16:subme=7:analyse=some:8x8dct=1:
-deblock=0,0:trellis=1:psy-rd=1,0:no-fast-pskip=0:
-no-dct-decimate=0:cabac=1</property>
- <property name="wrap_mode">GTK_WRAP_CHAR</property>
- <property name="accepts_tab">False</property>
- <signal handler="x264_focus_out_cb" name="focus_out_event"/>
- </object>
- </child>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">&lt;small&gt;&lt;b&gt;Encoding Features&lt;/b&gt;&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
</object>
</child>
</object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label54">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">&lt;b&gt;Manual Options String&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
<property name="expand">True</property>
- <property name="padding">2</property>
- <property name="position">2</property>
</packing>
</child>
- </object>
- <packing>
- <property name="expand">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkVSeparator" id="vseparator1">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox25">
- <property name="orientation">vertical</property>
- <property name="visible">True</property>
- <property name="spacing">10</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <object class="GtkFrame" id="frame12">
+ <object class="GtkVBox" id="vbox25">
+ <property name="orientation">vertical</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
<child>
- <object class="GtkAlignment" id="alignment30">
+ <object class="GtkFrame" id="frame12">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="top_padding">6</property>
- <property name="bottom_padding">2</property>
- <property name="left_padding">12</property>
- <property name="right_padding">2</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkTable" id="table5">
+ <object class="GtkHBox" id="hbox84">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="row-spacing">2</property>
- <property name="column-spacing">4</property>
- <child>
- <object class="GtkLabel" id="label55">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Method: </property>
- </object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- </packing>
- </child>
+
<child>
- <object class="GtkAlignment" id="alignment31">
+ <object class="GtkAlignment" id="alignment30">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
+ <property name="top_padding">6</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">2</property>
<child>
- <object class="GtkComboBox" id="x264_me">
+ <object class="GtkTable" id="table5">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">This sets the search pattern x264 uses when estimating motion. Uneven Multi-Hexagonal provides some benefit over Hex with a modest hit in speed. Exhaustive and Hadamard Exhaustive are very slow and generally not useful for everyday encoding.</property>
- <signal handler="x264_me_changed_cb" name="changed"/>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="row-spacing">2</property>
+ <property name="column-spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label55">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Motion Est. Method:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="x264_me">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Controls the motion estimation method. Motion estimation is how the encoder estimates how each block of pixels in a frame has moved. A better motion search method improves compression at the cost of speed.
+
+Diamond: performs an extremely fast and simple search using a diamond pattern.
+
+Hexagon: performs a somewhat more effective but slightly slower search using a hexagon pattern.
+
+Uneven Multi-Hex: performs a very wide search using a variety of patterns, more accurately capturing complex motion.
+
+Exhaustive: performs a "dumb" search of every pixel in a wide area. Significantly slower for only a small compression gain.
+
+Transformed Exhaustive: Like exhaustive, but makes even more accurate decisions. Accordingly, somewhat slower, also for only a small improvement.</property>
+ <signal handler="x264_me_changed_cb" name="changed"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label58">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Subpel ME &amp;amp; Mode:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="x264_subme">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-markup" translatable="yes">This setting controls both subpixel-precision motion estimation and mode decision methods.
+
+Subpixel motion estimation is used for refining motion estimates beyond mere pixel accuracy, improving compression.
+
+Mode decision is the method used to choose how to encode each block of the frame: a very important decision.
+
+SAD is the fastest method, followed by SATD, RD, RD refinement, and the slowest, QPRD.
+
+6 or higher is strongly recommended: Psy-RD, a very powerful psy optimization that helps retain detail, requires RD.
+
+10, the most powerful and slowest option, requires trellis=2.</property>
+ <signal handler="x264_widget_changed_cb" name="changed"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label57">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Motion Est. Range:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="x264_merange">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">This is the distance x264 searches from its best guess at the motion of a block in order to try to find its actual motion. The default is fine for most content, but extremely high motion video, especially at HD resolutions, may benefit from higher ranges, albeit at a high speed cost.</property>
+ <property name="adjustment">adjustment10</property>
+ <signal handler="x264_widget_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label52">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Adaptive Direct Mode:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment39">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <child>
+ <object class="GtkComboBox" id="x264_direct">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">H.264 allows for two different prediction modes, spatial and temporal, in B-frames.
+
+Spatial, the default, is almost always better, but temporal is sometimes useful too.
+
+x264 can, at the cost of a small amount of speed (and accordingly for a small compression gain), adaptively select which is better for each particular frame.</property>
+ <signal handler="x264_widget_changed_cb" name="changed"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label84">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Adaptive B-Frames:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment40">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <child>
+ <object class="GtkComboBox" id="x264_b_adapt">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-markup" translatable="yes">x264 has a variety of algorithms to decide when to use B-frames and how many to use.
+
+Fast mode takes roughly the same amount of time no matter how many B-frames you specify. However, while fast, its decisions are often suboptimal.
+
+Optimal mode gets slower as the maximum number of B-Frames increases, but makes much more accurate decisions, especially when used with B-pyramid.</property>
+ <signal handler="x264_widget_changed_cb" name="changed"/>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
</object>
</child>
</object>
<packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label57">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Range: </property>
- </object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkAlignment" id="alignment32">
+ <object class="GtkAlignment" id="alignment31">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
+ <property name="top_padding">6</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">2</property>
<child>
- <object class="GtkSpinButton" id="x264_merange">
+ <object class="GtkTable" id="table3">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">The radius, in pixels, x264 should use for motion estimation searches. Higher values can be useful on HiDef or high-motion footage.</property>
- <property name="adjustment">adjustment10</property>
- <signal handler="x264_widget_changed_cb" name="value_changed"/>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="row-spacing">2</property>
+ <property name="column-spacing">4</property>
+ <child>
+ <object class="GtkLabel" id="label59">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Partitions:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="x264_analyse">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Mode decision picks from a variety of options to make its decision: this option chooses what options those are. Fewer partitions to check means faster encoding, at the cost of worse decisions, since the best option might have been one that was turned off.</property>
+ <signal handler="x264_widget_changed_cb" name="changed"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label62">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Trellis:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="x264_trellis">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Trellis fine-tunes the rounding of transform coefficients to squeeze out 3-5% more compression at the cost of some speed. "Always" uses trellis not only during the main encoding process, but also during analysis, which improves compression even more, albeit at great speed cost. Trellis costs more speed at higher bitrates and requires CABAC.</property>
+ <signal handler="x264_widget_changed_cb" name="changed"/>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
</object>
</child>
</object>
<packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label58">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Subpixel Method:</property>
- </object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
+ <property name="position">1</property>
</packing>
</child>
+ </object>
+ <packing>
+ </packing>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label60">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">&lt;small&gt;&lt;b&gt;Analysis&lt;/b&gt;&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame13">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment35">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="top_padding">6</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">2</property>
<child>
- <object class="GtkAlignment" id="alignment33">
+ <object class="GtkVBox" id="vbox27">
+ <property name="orientation">vertical</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="xscale">0.05000000074505806</property>
<child>
- <object class="GtkComboBox" id="x264_subme">
+ <object class="GtkTable" id="table9">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-markup" translatable="yes">Determines how motion estimation decisions are made. Higher numbers provide greater compression efficiency and are slower.
-&lt;small&gt;
-1 - QPel SAD 1 iteration
-2 - QPel SATD 2 iterations
-3 - HPel on MB then QPel
-4 - Always QPel
-5 - Multi QPel + bime
-6 - RD on I/P frames
-7 - RD on all frames
-8 - RD refinement on I/P frames
-9 - RD refinement on all frames
-10 - QP-RD (requires trellis=2 and aq-mode > 0) &lt;/small&gt;</property>
- <signal handler="x264_widget_changed_cb" name="changed"/>
- </object>
- </child>
- </object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label59">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Analysis:</property>
- </object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox38">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <child>
- <object class="GtkAlignment" id="alignment37">
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
<child>
- <object class="GtkComboBox" id="x264_analyse">
+ <object class="GtkLabel" id="label73">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Determines which macroblock partitions are analyzed.
-"Some" is recommended. "All" is slow and generally not useful.</property>
- <signal handler="x264_widget_changed_cb" name="changed"/>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Adaptive Quantization Strength:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="x264_aq_strength">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Adaptive quantization controls how the encoder distributes bits across the frame. Higher values take more bits away from edges and complex areas to improve areas with finer detail.</property>
+ <property name="adjustment">adjustment34</property>
+ <property name="restrict_to_fill_level">False</property>
+ <property name="value_pos">GTK_POS_RIGHT</property>
+ <signal handler="x264_widget_changed_cb" name="value_changed"/>
</object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label82">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Psychovisual Rate Distortion:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="x264_psy_rd">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Psychovisual rate-distortion optimization takes advantage of the characteristics of human vision to dramatically improve apparent detail and sharpness. The effect can be made weaker or stronger by adjusting the strength. Being an RD algorithm, it requires mode decision to be at least "6".</property>
+ <property name="adjustment">adjustment22</property>
+ <property name="restrict_to_fill_level">False</property>
+ <property name="value_pos">GTK_POS_RIGHT</property>
+ <signal handler="x264_widget_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label83">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Psychovisual Trellis:&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHScale" id="x264_psy_trell">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Psychovisual trellis is an experimental algorithm to further improve sharpness and detail retention beyond what Psychovisual RD does. Recommended values are around 0.2, though higher values may help for very grainy video or lower bitrate encodes. Not recommended for cel animation and other sharp-edged graphics.</property>
+ <property name="adjustment">adjustment23</property>
+ <property name="restrict_to_fill_level">False</property>
+ <property name="value_pos">GTK_POS_RIGHT</property>
+ <signal handler="x264_widget_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
</child>
</object>
<packing>
- <property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkAlignment" id="alignment34">
+ <object class="GtkHBox" id="hbox39">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="xscale">0</property>
<child>
- <object class="GtkCheckButton" id="x264_8x8dct">
+ <object class="GtkLabel" id="label61">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Deblocking: </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="x264_deblock_alpha">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-markup" translatable="yes">H.264 has a built-in deblocking filter that smooths out blocking artifacts after decoding each frame. This not only improves visual quality, but also helps compression significantly. The deblocking filter takes a lot of CPU power, so if you're looking to minimize CPU requirements for video playback, disable it.
+
+The deblocking filter has two adjustable parameters, "strength" (Alpha) and "threshold" (Beta). The former controls how strong (or weak) the deblocker is, while the latter controls how many (or few) edges it applies to. Lower values mean less deblocking, higher values mean more deblocking. The default is 0 (normal strength) for both parameters.</property>
+ <property name="adjustment">adjustment11</property>
+ <signal handler="x264_widget_changed_cb" name="value_changed"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="x264_deblock_beta">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Enables the intelligent adaptive use of 8x8 transforms in I-frames. Improves coding efficiency.</property>
- <property name="label" translatable="yes">8x8dct</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="x264_widget_changed_cb" name="toggled"/>
+ <property name="tooltip-markup" translatable="yes">H.264 has a built-in deblocking filter that smooths out blocking artifacts after decoding each frame. This not only improves visual quality, but also helps compression significantly. The deblocking filter takes a lot of CPU power, so if you're looking to minimize CPU requirements for video playback, disable it.
+
+The deblocking filter has two adjustable parameters, "strength" (Alpha) and "threshold" (Beta). The former controls how strong (or weak) the deblocker is, while the latter controls how many (or few) edges it applies to. Lower values mean less deblocking, higher values mean more deblocking. The default is 0 (normal strength) for both parameters.</property>
+ <property name="adjustment">adjustment12</property>
+ <signal handler="x264_widget_changed_cb" name="value_changed"/>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
</child>
+ <child>
+ <object class="GtkCheckButton" id="x264_no_dct_decimate">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">x264 normally zeroes out nearly-empty data blocks to save bits to be better used for some other purpose in the video. However, this can sometimes have slight negative effects on retention of subtle grain and dither. Don't touch this unless you're having banding issues or other such cases where you are having trouble keeping fine noise.</property>
+ <property name="label" translatable="yes">No DCT Decimate</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <signal handler="x264_widget_changed_cb" name="toggled"/>
+ </object>
+ <packing>
+ <property name="padding">20</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- </packing>
</child>
</object>
</child>
+ <child type="label">
+ <object class="GtkLabel" id="label63">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">&lt;small&gt;&lt;b&gt;Psychovisual&lt;/b&gt;&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
</object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label60">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">&lt;b&gt;Motion Estimation&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
- <property name="expand">False</property>
- <property name="padding">2</property>
+ <property name="expand">True</property>
+ <property name="position">2</property>
</packing>
</child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox85">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="spacing">2</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame11">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkFrame" id="frame13">
+ <object class="GtkAlignment" id="alignment29">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="top_padding">6</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">2</property>
<child>
- <object class="GtkAlignment" id="alignment35">
+ <object class="GtkScrolledWindow" id="scrolledwindow6">
+ <property name="height_request">40</property>
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="top_padding">6</property>
- <property name="bottom_padding">2</property>
- <property name="left_padding">12</property>
- <property name="right_padding">2</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">etched-in</property>
<child>
- <object class="GtkVBox" id="vbox27">
- <property name="orientation">vertical</property>
+ <object class="GtkTextView" id="x264Option">
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="spacing">2</property>
- <child>
- <object class="GtkHBox" id="hbox39">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <child>
- <object class="GtkLabel" id="label61">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Deblocking: </property>
- </object>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="x264_deblock_alpha">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-markup" translatable="yes">Controls the loop filter which is part of the H.264 standard.
-
-&lt;b&gt;Alpha:&lt;/b&gt; determines the strength of the deblocking action. Higher values will produce stronger 'blurring'.</property>
- <property name="adjustment">adjustment11</property>
- <signal handler="x264_widget_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="x264_deblock_beta">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-markup" translatable="yes">Controls the loop filter which is part of the H.264 standard.
+ <property name="can_focus">True</property>
+ <property name="tooltip-text" translatable="yes">Your selected options will appear here.
+You can edit these and add additional options.
-&lt;b&gt;Beta:&lt;/b&gt; determines when something is a block. Higher values increase sensitivity and will flag more blocks.</property>
- <property name="adjustment">adjustment12</property>
- <signal handler="x264_widget_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkHBox" id="hbox40">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <child>
- <object class="GtkLabel" id="label62">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Trellis: </property>
- </object>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="x264_trellis">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Trellis fine-tunes how bitrate is doled out, so it can reduce file size/bitrate or increase quality. "All" forces it to be used more often than "Final Macro Block".</property>
- <signal handler="x264_widget_changed_cb" name="changed"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="x264_no_fast_pskip">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">This can help with blocking on solid colors like blue skies, but it also slows down the encode.</property>
- <property name="label" translatable="yes">No Fast P-Skip</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="x264_widget_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="x264_no_dct_decimate">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Disables coefficient thresholding on P-frames. Only use this with constant quality encoding. It increases quality but also bitrate/file size.</property>
- <property name="label" translatable="yes">No DCT Decimate</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="x264_widget_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="x264_cabac">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Context Adaptive Binary Arithmetic Coding. Improves compression efficiency at the expense of playback/decoding efficiency. Use CABAC unless your decoder really sucks.</property>
- <property name="label" translatable="yes">CABAC Entropy Encoding</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <signal handler="x264_widget_changed_cb" name="toggled"/>
- </object>
- <packing>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkTable" id="table9">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="visible">True</property>
- <child>
- <object class="GtkLabel" id="label82">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Psychovisual Rate Distortion: </property>
- </object>
- <packing>
- <property name="x_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkHScale" id="x264_psy_rd">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Sets the strength of Psy-RDO.
-Requires subme >= 6.</property>
- <property name="adjustment">adjustment22</property>
- <property name="restrict_to_fill_level">False</property>
- <property name="value_pos">GTK_POS_RIGHT</property>
- <signal handler="x264_widget_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label83">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Psychovisual Trellis: </property>
- </object>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <object class="GtkHScale" id="x264_psy_trell">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="tooltip-text" translatable="yes">Sets the strength of Psy-Trellis.
-Requires subme >= 6 and trellis >= 1.</property>
- <property name="adjustment">adjustment23</property>
- <property name="restrict_to_fill_level">False</property>
- <property name="value_pos">GTK_POS_RIGHT</property>
- <signal handler="x264_widget_changed_cb" name="value_changed"/>
- </object>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">5</property>
- </packing>
- </child>
+Default values will not be shown. The defaults are:
+ref=3:bframes=3:b-adapt=fast:direct=spatial:
+b-pyramid=normal:weightp=2:me=hex:merange=16:
+subme=7:partitions=p8x8,b8x8,i8x8,i4x4:8x8dct=1:
+deblock=0,0:trellis=1:psy-rd=1,0:aq-strength=1.0:
+no-fast-pskip=0:no-dct-decimate=0:cabac=1</property>
+ <property name="wrap_mode">GTK_WRAP_CHAR</property>
+ <property name="accepts_tab">False</property>
+ <signal handler="x264_focus_out_cb" name="focus_out_event"/>
</object>
</child>
</object>
</child>
- <child type="label">
- <object class="GtkLabel" id="label63">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">&lt;b&gt;Miscellaneous&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- </child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label54">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">&lt;small&gt;&lt;b&gt;Current x264 Advanced Option String&lt;/b&gt;&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
</child>
</object>
<packing>
- <property name="expand">True</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">2</property>
<property name="position">2</property>
</packing>
</child>
</object>
+ <packing>
+ </packing>
</child>
<child type="tab">
<object class="GtkLabel" id="x264_tab_label">
@@ -5754,7 +5804,7 @@ Encoders are most effecient when the video dimensions are aligned to some specif
<object class="GtkEntry" id="PictureDenoiseCustom">
<property name="width_chars">8</property>
<property name="tooltip-text" translatable="yes">Custom denoise filter string format
- SpatialLuma:SpatialChroma:TemporalLuma:TemporalChroma</property>
+ SpatialLuma:SpatialChroma:TemporalLuma:TemporalChroma</property>
<signal name="changed" handler="setting_widget_changed_cb"/>
</object>
<packing>
@@ -5829,7 +5879,7 @@ Encoders are most effecient when the video dimensions are aligned to some specif
<object class="GtkEntry" id="PictureDetelecineCustom">
<property name="width_chars">8</property>
<property name="tooltip-text" translatable="yes">Custom detelecine filter string format
- JunkLeft:JunkRight:JunkTop:JunkBottom:StrictBreaks:MetricPlane:Parity</property>
+ JunkLeft:JunkRight:JunkTop:JunkBottom:StrictBreaks:MetricPlane:Parity</property>
<signal name="changed" handler="setting_widget_changed_cb"/>
</object>
<packing>
@@ -5914,7 +5964,7 @@ The classic deinterlace filter is applied to all frames. Frames that are not int
<object class="GtkEntry" id="PictureDecombCustom">
<property name="width_chars">8</property>
<property name="tooltip-text" translatable="yes">Custom decomb filter string format
- Mode:SpatialMetric:MotionThresh:SpatialThresh:BlockThresh:BlockWidth:BlockHeight:MagnitudeThres:VarianceThres:LaplacianThresh:DilationThresh:ErosionThresh:NoiseThresh:MaxSearchDistance:PostProcessing:Parity</property>
+ Mode:SpatialMetric:MotionThresh:SpatialThresh:BlockThresh:BlockWidth:BlockHeight:MagnitudeThres:VarianceThres:LaplacianThresh:DilationThresh:ErosionThresh:NoiseThresh:MaxSearchDistance:PostProcessing:Parity</property>
<signal name="changed" handler="setting_widget_changed_cb"/>
</object>
<packing>
@@ -5958,7 +6008,7 @@ The classic deinterlace filter is applied to all frames. Frames that are not int
<object class="GtkEntry" id="PictureDeinterlaceCustom">
<property name="width_chars">8</property>
<property name="tooltip-text" translatable="yes">Custom deinterlace filter string format
- YadifMode:YadifParity:McdintMode:McdeintQp</property>
+ YadifMode:YadifParity:McdintMode:McdeintQp</property>
<signal name="changed" handler="setting_widget_changed_cb"/>
</object>
<packing>
diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c
index e4cd7dd37..19ae7d819 100644
--- a/gtk/src/hb-backend.c
+++ b/gtk/src/hb-backend.c
@@ -287,6 +287,30 @@ combo_opts_t badapt_opts =
d_badapt_opts
};
+static options_map_t d_bpyramid_opts[] =
+{
+ {"Off", "none", 0, "none"},
+ {"Strict", "strict", 1, "strict"},
+ {"Normal", "normal", 2, "normal"},
+};
+combo_opts_t bpyramid_opts =
+{
+ sizeof(d_bpyramid_opts)/sizeof(options_map_t),
+ d_bpyramid_opts
+};
+
+static options_map_t d_weightp_opts[] =
+{
+ {"Off", "0", 0, "0"},
+ {"Blind", "1", 1, "1"},
+ {"Smart", "2", 2, "2"},
+};
+combo_opts_t weightp_opts =
+{
+ sizeof(d_weightp_opts)/sizeof(options_map_t),
+ d_weightp_opts
+};
+
static options_map_t d_me_opts[] =
{
{"Diamond", "dia", 0, "dia"},
@@ -303,16 +327,17 @@ combo_opts_t me_opts =
static options_map_t d_subme_opts[] =
{
- {"1", "1", 1, "1"},
- {"2", "2", 2, "2"},
- {"3", "3", 3, "3"},
- {"4", "4", 4, "4"},
- {"5", "5", 5, "5"},
- {"6", "6", 6, "6"},
- {"7", "7", 7, "7"},
- {"8", "8", 8, "8"},
- {"9", "9", 9, "9"},
- {"10", "10", 10, "10"},
+ {"0: SAD, no subpel", "0", 0, "0"},
+ {"1: SAD, qpel", "1", 1, "1"},
+ {"2: SATD, qpel", "2", 2, "2"},
+ {"3: SATD: multi-qpel", "3", 3, "3"},
+ {"4: SATD, qpel on all", "4", 4, "4"},
+ {"5: SATD, multi-qpel on all", "5", 5, "5"},
+ {"6: RD in I/P-frames", "6", 6, "6"},
+ {"7: RD in all frames", "7", 7, "7"},
+ {"8: RD refine in I/P-frames", "8", 8, "8"},
+ {"9: RD refine in all frames", "9", 9, "9"},
+ {"10: QPRD in all frames", "10", 10, "10"},
};
combo_opts_t subme_opts =
{
@@ -322,10 +347,11 @@ combo_opts_t subme_opts =
static options_map_t d_analyse_opts[] =
{
- {"Some", "some", 0, "some"},
+ {"Most", "p8x8,b8x8,i8x8,i4x4", 0, "p8x8,b8x8,i8x8,i4x4"},
{"None", "none", 1, "none"},
- {"All", "all", 2, "all"},
- {"Custom", "custom", 3, "all"},
+ {"Some", "i4x4,i8x8", 2, "i4x4,i8x8"},
+ {"All", "all", 3, "all"},
+ {"Custom", "custom", 4, "all"},
};
combo_opts_t analyse_opts =
{
@@ -335,9 +361,9 @@ combo_opts_t analyse_opts =
static options_map_t d_trellis_opts[] =
{
- {"Disabled", "0", 0, "0"},
- {"Final Macro Block", "1", 1, "1"},
- {"Always", "2", 2, "2"},
+ {"Off", "0", 0, "0"},
+ {"Encode only", "1", 1, "1"},
+ {"Always", "2", 2, "2"},
};
combo_opts_t trellis_opts =
{
@@ -388,6 +414,8 @@ combo_name_map_t combo_name_map[] =
{"AudioEncoder", &acodec_opts},
{"x264_direct", &direct_opts},
{"x264_b_adapt", &badapt_opts},
+ {"x264_bpyramid", &bpyramid_opts},
+ {"x264_weighted_pframes", &weightp_opts},
{"x264_me", &me_opts},
{"x264_subme", &subme_opts},
{"x264_analyse", &analyse_opts},
@@ -1527,7 +1555,7 @@ ghb_grey_combo_options(GtkBuilder *builder)
container = ghb_lookup_combo_int("FileFormat", gval);
ghb_value_free(gval);
- grey_combo_box_item(builder, "x264_analyse", 3, TRUE);
+ grey_combo_box_item(builder, "x264_analyse", 4, TRUE);
grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_FAAC, FALSE);
grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_LAME, FALSE);
grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_VORBIS, FALSE);
@@ -2285,7 +2313,7 @@ ghb_find_audio_track(
gint ii;
gint count = 0;
gint track = -1;
- gint max_chan = 0;
+ gint max_chan;
gboolean *used = NULL;
gboolean *passthru_used;
gint try_acodec;
@@ -2304,6 +2332,7 @@ ghb_find_audio_track(
if (count > 10) count = 10;
// Try to find an item that matches the preferred language and
// the passthru codec type
+ max_chan = 0;
passthru = (acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA)) != 0;
if (passthru)
{
@@ -2390,8 +2419,6 @@ ghb_find_audio_track(
{
for (ii = 0; ii < count; ii++)
{
- gint channels;
-
audio = (hb_audio_config_t*)hb_list_audio_config_item(
title->list_audio, ii );
passthru_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & audio->in.codec;
@@ -2438,6 +2465,8 @@ ghb_find_audio_track(
audio = (hb_audio_config_t*)hb_list_audio_config_item(
title->list_audio, ii );
passthru_acodec = (HB_ACODEC_AC3 | HB_ACODEC_DCA) & audio->in.codec;
+ channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
+ audio->in.channel_layout);
if (passthru_acodec && passthru)
{
passthru_used = get_track_used(passthru_acodec, track_indices, count);
@@ -2816,12 +2845,14 @@ ghb_update_ui_combo_box(
generic_opts_set(ud->builder, "PictureDenoise", &denoise_opts);
generic_opts_set(ud->builder, "VideoEncoder", &vcodec_opts);
small_opts_set(ud->builder, "AudioEncoder", &acodec_opts);
- generic_opts_set(ud->builder, "x264_direct", &direct_opts);
- generic_opts_set(ud->builder, "x264_b_adapt", &badapt_opts);
- generic_opts_set(ud->builder, "x264_me", &me_opts);
- generic_opts_set(ud->builder, "x264_subme", &subme_opts);
- generic_opts_set(ud->builder, "x264_analyse", &analyse_opts);
- generic_opts_set(ud->builder, "x264_trellis", &trellis_opts);
+ small_opts_set(ud->builder, "x264_direct", &direct_opts);
+ small_opts_set(ud->builder, "x264_b_adapt", &badapt_opts);
+ small_opts_set(ud->builder, "x264_bpyramid", &bpyramid_opts);
+ small_opts_set(ud->builder, "x264_weighted_pframes", &weightp_opts);
+ small_opts_set(ud->builder, "x264_me", &me_opts);
+ small_opts_set(ud->builder, "x264_subme", &subme_opts);
+ small_opts_set(ud->builder, "x264_analyse", &analyse_opts);
+ small_opts_set(ud->builder, "x264_trellis", &trellis_opts);
}
else
{
diff --git a/gtk/src/values.c b/gtk/src/values.c
index 17319a582..5800a008e 100644
--- a/gtk/src/values.c
+++ b/gtk/src/values.c
@@ -753,6 +753,15 @@ xform_string_double(const GValue *sval, GValue *dval)
}
static void
+xform_double_string(const GValue *dval, GValue *sval)
+{
+ gchar *str;
+ double val = g_value_get_double(dval);
+ str = g_strdup_printf("%g", val);
+ g_value_take_string(sval, str);
+}
+
+static void
xform_boolean_double(const GValue *bval, GValue *dval)
{
gboolean b = g_value_get_boolean(bval);
@@ -771,4 +780,6 @@ ghb_register_transforms()
xform_string_double);
g_value_register_transform_func(G_TYPE_BOOLEAN, G_TYPE_DOUBLE,
xform_boolean_double);
+ g_value_register_transform_func(G_TYPE_DOUBLE, G_TYPE_STRING,
+ xform_double_string);
}
diff --git a/gtk/src/widgetdeps.c b/gtk/src/widgetdeps.c
index eeb400708..8d6b03290 100644
--- a/gtk/src/widgetdeps.c
+++ b/gtk/src/widgetdeps.c
@@ -62,11 +62,9 @@ static dependency_t dep_map[] =
{"AudioEncoderActual", "AudioMixdown", "ac3|dts", TRUE, FALSE},
{"AudioEncoderActual", "AudioTrackDRCSlider", "ac3|dts", TRUE, FALSE},
{"AudioEncoderActual", "drc_label", "ac3|dts", TRUE, FALSE},
- {"x264_bframes", "x264_weighted_bframes", "0", TRUE, FALSE},
{"x264_bframes", "x264_bpyramid", "<2", TRUE, FALSE},
{"x264_bframes", "x264_direct", "0", TRUE, FALSE},
{"x264_bframes", "x264_b_adapt", "0", TRUE, FALSE},
- {"x264_refs", "x264_mixed_refs", "<2", TRUE, FALSE},
{"x264_cabac", "x264_trellis", "TRUE", FALSE, FALSE},
{"x264_subme", "x264_psy_rd", "<6", TRUE, FALSE},
{"x264_subme", "x264_psy_trell", "<6", TRUE, FALSE},
diff --git a/gtk/src/x264handler.c b/gtk/src/x264handler.c
index 61adaa0b0..2368801a6 100644
--- a/gtk/src/x264handler.c
+++ b/gtk/src/x264handler.c
@@ -126,37 +126,88 @@ enum
X264_OPT_DEBLOCK,
X264_OPT_PSY,
X264_OPT_INT,
+ X264_OPT_DOUBLE,
X264_OPT_COMBO,
X264_OPT_BOOL,
+ X264_OPT_TRANS,
};
+typedef struct
+{
+ gchar *x264_val;
+ char *ui_val;
+} trans_entry_t;
+
+typedef struct
+{
+ gint count;
+ gint x264_type;
+ gint ui_type;
+ trans_entry_t *map;
+} trans_table_t;
+
+static gchar *
+trans_x264_val(trans_table_t *trans, char *val)
+{
+ int ii;
+
+ if (val == NULL)
+ return NULL;
+ for (ii = 0; ii < trans->count; ii++)
+ {
+ if (strcmp(val, trans->map[ii].x264_val) == 0)
+ {
+ return trans->map[ii].ui_val;
+ }
+ }
+ return NULL;
+}
+
+static gchar *
+trans_ui_val(trans_table_t *trans, char *val)
+{
+ int ii;
+
+ if (val == NULL)
+ return NULL;
+ for (ii = 0; ii < trans->count; ii++)
+ {
+ if (strcmp(val, trans->map[ii].ui_val) == 0)
+ {
+ return trans->map[ii].x264_val;
+ }
+ }
+ return NULL;
+}
+
struct x264_opt_map_s
{
gchar **opt_syns;
gchar *name;
gchar *def_val;
gint type;
+ trans_table_t *translation;
gboolean found;
};
static gchar *x264_ref_syns[] = {"ref", "frameref", NULL};
-static gchar *x264_mixed_syns[] = {"mixed-refs", "mixed_refs", NULL};
static gchar *x264_bframes_syns[] = {"bframes", NULL};
static gchar *x264_badapt_syns[] = {"b-adapt", "b_adapt", NULL};
static gchar *x264_direct_syns[] =
{"direct", "direct-pred", "direct_pred", NULL};
-static gchar *x264_weightb_syns[] = {"weightb", "weight-b", "weight_b", NULL};
+static gchar *x264_weightp_syns[] = {"weightp", NULL};
static gchar *x264_bpyramid_syns[] = {"b-pyramid", "b_pyramid", NULL};
static gchar *x264_me_syns[] = {"me", NULL};
static gchar *x264_merange_syns[] = {"merange", "me-range", "me_range", NULL};
static gchar *x264_subme_syns[] = {"subme", "subq", NULL};
static gchar *x264_aqmode_syns[] = {"aq-mode", NULL};
-static gchar *x264_analyse_syns[] = {"analyse", "partitions", NULL};
+static gchar *x264_analyse_syns[] = {"partitions", "analyse", NULL};
static gchar *x264_8x8dct_syns[] = {"8x8dct", NULL};
static gchar *x264_deblock_syns[] = {"deblock", "filter", NULL};
static gchar *x264_trellis_syns[] = {"trellis", NULL};
static gchar *x264_pskip_syns[] = {"no-fast-pskip", "no_fast_pskip", NULL};
static gchar *x264_psy_syns[] = {"psy-rd", "psy_rd", NULL};
+static gchar *x264_aq_strength_syns[] = {"aq-strength", "aq_strength", NULL};
static gchar *x264_mbtree_syns[] = {"mbtree", NULL};
static gchar *x264_decimate_syns[] =
{"no-dct-decimate", "no_dct_decimate", NULL};
@@ -177,17 +228,16 @@ find_syn_match(const gchar *opt, gchar **syns)
struct x264_opt_map_s x264_opt_map[] =
{
{x264_ref_syns, "x264_refs", "3", X264_OPT_INT},
- {x264_mixed_syns, "x264_mixed_refs", "1", X264_OPT_BOOL},
{x264_bframes_syns, "x264_bframes", "3", X264_OPT_INT},
{x264_direct_syns, "x264_direct", "spatial", X264_OPT_COMBO},
{x264_badapt_syns, "x264_b_adapt", "1", X264_OPT_COMBO},
- {x264_weightb_syns, "x264_weighted_bframes", "1", X264_OPT_BOOL},
- {x264_bpyramid_syns, "x264_bpyramid", "0", X264_OPT_BOOL},
+ {x264_weightp_syns, "x264_weighted_pframes", "2", X264_OPT_COMBO},
+ {x264_bpyramid_syns, "x264_bpyramid", "normal", X264_OPT_COMBO},
{x264_me_syns, "x264_me", "hex", X264_OPT_COMBO},
{x264_merange_syns, "x264_merange", "16", X264_OPT_INT},
{x264_subme_syns, "x264_subme", "7", X264_OPT_COMBO},
{x264_aqmode_syns, "x264_aqmode", "1", X264_OPT_INT_NONE},
- {x264_analyse_syns, "x264_analyse", "some", X264_OPT_COMBO},
+ {x264_analyse_syns, "x264_analyse", "p8x8,b8x8,i8x8,i4x4", X264_OPT_COMBO},
{x264_8x8dct_syns, "x264_8x8dct", "1", X264_OPT_BOOL},
{x264_deblock_syns, "x264_deblock_alpha", "0,0", X264_OPT_DEBLOCK},
{x264_deblock_syns, "x264_deblock_beta", "0,0", X264_OPT_DEBLOCK},
@@ -195,6 +245,7 @@ struct x264_opt_map_s x264_opt_map[] =
{x264_pskip_syns, "x264_no_fast_pskip", "0", X264_OPT_BOOL},
{x264_decimate_syns, "x264_no_dct_decimate", "0", X264_OPT_BOOL},
{x264_cabac_syns, "x264_cabac", "1", X264_OPT_BOOL},
+ {x264_aq_strength_syns, "x264_aq_strength", "1", X264_OPT_DOUBLE},
{x264_psy_syns, "x264_psy_rd", "1,0", X264_OPT_PSY},
{x264_psy_syns, "x264_psy_trell", "1,0", X264_OPT_PSY},
{x264_mbtree_syns, "x264_mbtree", "1", X264_OPT_BOOL_NONE},
@@ -216,6 +267,16 @@ x264_opt_get_default(const gchar *opt)
}
static void
+x264_update_double(signal_user_data_t *ud, const gchar *name, const gchar *val)
+{
+ gdouble dval;
+
+ if (val == NULL) return;
+ dval = g_strtod (val, NULL);
+ ghb_ui_update(ud, name, ghb_double_value(dval));
+}
+
+static void
x264_update_int(signal_user_data_t *ud, const gchar *name, const gchar *val)
{
gint ival;
@@ -399,6 +460,31 @@ x264_update_psy(signal_user_data_t *ud, const gchar *xval)
ghb_ui_update(ud, "x264_psy_trell", ghb_double_value(trell_value));
}
+static void do_update(signal_user_data_t *ud, char *name, gint type, char *val)
+{
+ switch(type)
+ {
+ case X264_OPT_INT:
+ x264_update_int(ud, name, val);
+ break;
+ case X264_OPT_DOUBLE:
+ x264_update_double(ud, name, val);
+ break;
+ case X264_OPT_BOOL:
+ x264_update_bool(ud, name, val);
+ break;
+ case X264_OPT_COMBO:
+ x264_update_combo(ud, name, val);
+ break;
+ case X264_OPT_BOOL_NONE:
+ x264_update_bool_setting(ud, name, val);
+ break;
+ case X264_OPT_INT_NONE:
+ x264_update_int_setting(ud, name, val);
+ break;
+ }
+}
+
void
ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
{
@@ -430,6 +516,9 @@ ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
case X264_OPT_INT:
x264_update_int(ud, x264_opt_map[jj].name, val);
break;
+ case X264_OPT_DOUBLE:
+ x264_update_double(ud, x264_opt_map[jj].name, val);
+ break;
case X264_OPT_BOOL:
x264_update_bool(ud, x264_opt_map[jj].name, val);
break;
@@ -452,6 +541,21 @@ ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
case X264_OPT_INT_NONE:
x264_update_int_setting(ud, x264_opt_map[jj].name, val);
break;
+ case X264_OPT_TRANS:
+ if (x264_opt_map[jj].translation == NULL)
+ break;
+ val = trans_x264_val(x264_opt_map[jj].translation, val);
+ if (val != NULL)
+ {
+ do_update(ud, x264_opt_map[jj].name,
+ x264_opt_map[jj].translation->ui_type, val);
+ // TODO un-grey the ui control
+ }
+ else
+ {
+ // TODO grey out the ui control
+ }
+ break;
}
break;
}
@@ -469,6 +573,9 @@ ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
case X264_OPT_INT:
x264_update_int(ud, x264_opt_map[jj].name, val);
break;
+ case X264_OPT_DOUBLE:
+ x264_update_double(ud, x264_opt_map[jj].name, val);
+ break;
case X264_OPT_BOOL:
x264_update_bool(ud, x264_opt_map[jj].name, val);
break;
@@ -487,6 +594,21 @@ ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
case X264_OPT_INT_NONE:
x264_update_int_setting(ud, x264_opt_map[jj].name, val);
break;
+ case X264_OPT_TRANS:
+ if (x264_opt_map[jj].translation == NULL)
+ break;
+ val = g_strdup(trans_x264_val(x264_opt_map[jj].translation, val));
+ if (val != NULL)
+ {
+ do_update(ud, x264_opt_map[jj].name,
+ x264_opt_map[jj].translation->ui_type, val);
+ // TODO un-grey the ui control
+ }
+ else
+ {
+ // TODO grey out the ui control
+ }
+ break;
}
x264_opt_map[jj].found = TRUE;
g_free(val);
@@ -527,6 +649,7 @@ x264_opt_update(signal_user_data_t *ud, GtkWidget *widget)
gchar **opt_syns = NULL;
const gchar *def_val = NULL;
gint type;
+ trans_table_t *trans;
for (jj = 0; jj < X264_OPT_MAP_SIZE; jj++)
{
@@ -536,6 +659,7 @@ x264_opt_update(signal_user_data_t *ud, GtkWidget *widget)
opt_syns = x264_opt_map[jj].opt_syns;
def_val = x264_opt_map[jj].def_val;
type = x264_opt_map[jj].type;
+ trans = x264_opt_map[jj].translation;
break;
}
}
@@ -589,6 +713,16 @@ x264_opt_update(signal_user_data_t *ud, GtkWidget *widget)
}
ghb_value_free(gval);
}
+ if (type == X264_OPT_TRANS)
+ {
+ gchar *tmp;
+ tmp = g_strdup(trans_ui_val(trans, val));
+ if (tmp)
+ {
+ g_free(val);
+ val = tmp;
+ }
+ }
if (strcmp(def_val, val) != 0)
{
g_string_append_printf(x264opts, "%s=%s:", opt_syns[syn], val);
@@ -626,6 +760,16 @@ x264_opt_update(signal_user_data_t *ud, GtkWidget *widget)
}
ghb_value_free(gval);
}
+ if (type == X264_OPT_TRANS)
+ {
+ gchar *tmp;
+ tmp = g_strdup(trans_ui_val(trans, val));
+ if (tmp)
+ {
+ g_free(val);
+ val = tmp;
+ }
+ }
if (strcmp(def_val, val) != 0)
{
g_string_append_printf(x264opts, "%s=%s:", opt_syns[0], val);
@@ -852,15 +996,9 @@ sanitize_x264opts(signal_user_data_t *ud, const gchar *options)
split[psy] = g_strdup_printf("psy-rd=%g,0", psy_rd);
}
}
- gint refs = ghb_settings_get_int(ud->settings, "x264_refs");
- if (refs <= 1)
- {
- x264_remove_opt(split, x264_mixed_syns);
- }
gint bframes = ghb_settings_get_int(ud->settings, "x264_bframes");
if (bframes == 0)
{
- x264_remove_opt(split, x264_weightb_syns);
x264_remove_opt(split, x264_direct_syns);
x264_remove_opt(split, x264_badapt_syns);
}