/* HBAdvancedController
This file is part of the HandBrake source code.
- Homepage: <http://handbrake.m0k.org/>.
+ Homepage: <http://handbrake.fr/>.
It may be used under the terms of the GNU General Public License. */
#import "HBAdvancedController.h"
- (void) setOptions: (NSString *)string
{
[fDisplayX264Options setStringValue:string];
- [self X264AdvancedOptionsSet:NULL];
+ [self X264AdvancedOptionsSet:nil];
}
- (void) setHidden: (BOOL) hide
fX264optNodctdcmtLabel,fX264optNodctdcmtSwitch,fX264optSubmeLabel,fX264optSubmePopUp,
fX264optTrellisLabel,fX264optTrellisPopUp,fX264optMixedRefsLabel,fX264optMixedRefsSwitch,
fX264optMotionEstLabel,fX264optMotionEstPopUp,fX264optMERangeLabel,fX264optMERangePopUp,
- fX264optWeightBLabel,fX264optWeightBSwitch,fX264optBRDOLabel,fX264optBRDOSwitch,
- fX264optBPyramidLabel,fX264optBPyramidSwitch,fX264optBiMELabel,fX264optBiMESwitch,
+ fX264optWeightBLabel,fX264optWeightBSwitch, fX264optBPyramidLabel,fX264optBPyramidSwitch,
fX264optDirectPredLabel,fX264optDirectPredPopUp,fX264optDeblockLabel,fX264optAnalyseLabel,
fX264optAnalysePopUp,fX264opt8x8dctLabel,fX264opt8x8dctSwitch,fX264optCabacLabel,fX264optCabacSwitch,
fX264optAlphaDeblockPopUp,fX264optBetaDeblockPopUp};
[controls[i] setEnabled: b];
}
+
+ [fX264optView setWantsLayer:YES];
}
- (void)dealloc
/*Sub Me fX264optSubmePopUp*/
[fX264optSubmePopUp removeAllItems];
- [fX264optSubmePopUp addItemWithTitle:@"Default (4)"];
- for (i=0; i<8;i++)
+ [fX264optSubmePopUp addItemWithTitle:@"Default (6)"];
+ for (i=0; i<10;i++)
{
[fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
}
{
[fX264optTrellisPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
}
+ [fX264optTrellisPopUp setWantsLayer:YES];
/*Mixed-references fX264optMixedRefsSwitch BOOLEAN*/
[fX264optMixedRefsSwitch setState:0];
+ [fX264optMixedRefsSwitch setWantsLayer:YES];
/*Motion Estimation fX264optMotionEstPopUp*/
[fX264optMotionEstPopUp removeAllItems];
[fX264optMotionEstPopUp addItemWithTitle:@"Hexagon"];
[fX264optMotionEstPopUp addItemWithTitle:@"Uneven Multi-Hexagon"];
[fX264optMotionEstPopUp addItemWithTitle:@"Exhaustive"];
+ [fX264optMotionEstPopUp addItemWithTitle:@"Transformed Exhaustive"];
/*Motion Estimation range fX264optMERangePopUp*/
[fX264optMERangePopUp removeAllItems];
/*Weighted B-Frame Prediction fX264optWeightBSwitch BOOLEAN*/
[fX264optWeightBSwitch setState:0];
-
- /*B-Frame Rate Distortion Optimization fX264optBRDOSwitch BOOLEAN*/
- [fX264optBRDOSwitch setState:0];
+ [fX264optWeightBSwitch setWantsLayer:YES];
/*B-frame Pyramids fX264optBPyramidSwitch BOOLEAN*/
[fX264optBPyramidSwitch setState:0];
-
- /*Bidirectional Motion Estimation Refinement fX264optBiMESwitch BOOLEAN*/
- [fX264optBiMESwitch setState:0];
+ [fX264optBPyramidSwitch setWantsLayer:YES];
/*Direct B-Frame Prediction Mode fX264optDirectPredPopUp*/
[fX264optDirectPredPopUp removeAllItems];
[fX264optDirectPredPopUp addItemWithTitle:@"Spatial"];
[fX264optDirectPredPopUp addItemWithTitle:@"Temporal"];
[fX264optDirectPredPopUp addItemWithTitle:@"Automatic"];
+ [fX264optDirectPredPopUp setWantsLayer:YES];
/*Alpha Deblock*/
[fX264optAlphaDeblockPopUp removeAllItems];
{
[fX264optAlphaDeblockPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
}
-
+
/*Beta Deblock*/
[fX264optBetaDeblockPopUp removeAllItems];
[fX264optBetaDeblockPopUp addItemWithTitle:@"Default (0)"];
for (i=-6; i<7;i++)
{
[fX264optBetaDeblockPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
- }
-
+ }
+
/* Analysis fX264optAnalysePopUp */
[fX264optAnalysePopUp removeAllItems];
[fX264optAnalysePopUp addItemWithTitle:@"Default (some)"]; /* 0=default */
[fX264optAnalysePopUp addItemWithTitle:[NSString stringWithFormat:@"None"]]; /* 1=none */
[fX264optAnalysePopUp addItemWithTitle:[NSString stringWithFormat:@"All"]]; /* 2=all */
-
+
/* 8x8 DCT fX264op8x8dctSwitch */
[fX264opt8x8dctSwitch setState:0];
-
+ [fX264opt8x8dctSwitch setWantsLayer:YES];
+
/* CABAC fX264opCabacSwitch */
[fX264optCabacSwitch setState:1];
-
+
/* Standardize the option string */
- [self X264AdvancedOptionsStandardizeOptString: NULL];
+ [self X264AdvancedOptionsStandardizeOptString:nil];
/* Set Current GUI Settings based on newly standardized string */
- [self X264AdvancedOptionsSetCurrentSettings: NULL];
+ [self X264AdvancedOptionsSetCurrentSettings:nil];
+
+ /* Fade out options that don't apply */
+ [self X264AdvancedOptionsAnimate: sender];
}
/**
cleanOptNameString = @"weightb";
}
- /*BRDO*/
- if ([cleanOptNameString isEqualToString:@"b-rdo"] || [cleanOptNameString isEqualToString:@"b_rdo"])
- {
- cleanOptNameString = @"brdo";
- }
-
/*B Pyramid*/
if ([cleanOptNameString isEqualToString:@"b_pyramid"])
{
}
/**
+ * Fades options in and out depending on whether they're available..
+ */
+- (IBAction) X264AdvancedOptionsAnimate: (id) sender
+{
+ /* Lots of situations to cover.
+ - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
+ - CABAC (when 0 turn off trellis)
+ - analysis (if none, turn off 8x8dct)
+ - refs (under 2, disable mixed-refs)
+ */
+
+ if ( [fX264optBframesPopUp indexOfSelectedItem ] < 2)
+ {
+ /* If the b-frame widget is at 0 or 1, the user has chosen
+ not to use b-frames at all. So disable the options
+ that can only be used when b-frames are enabled. */
+ [[fX264optWeightBSwitch animator] setHidden:YES];
+ [[fX264optWeightBLabel animator] setHidden:YES];
+ if ( [fX264optWeightBSwitch state] == 1 && sender != fX264optWeightBSwitch && sender != fX264optBPyramidSwitch && sender != fX264optDirectPredPopUp)
+ [fX264optWeightBSwitch performClick:self];
+
+ [[fX264optBPyramidSwitch animator] setHidden:YES];
+ [[fX264optBPyramidLabel animator] setHidden:YES];
+ if ( [fX264optBPyramidSwitch state] == 1 && sender != fX264optWeightBSwitch && sender != fX264optBPyramidSwitch && sender != fX264optDirectPredPopUp)
+ [fX264optBPyramidSwitch performClick:self];
+
+ [[fX264optDirectPredPopUp animator] setHidden:YES];
+ [[fX264optDirectPredLabel animator] setHidden:YES];
+ if ( [fX264optDirectPredPopUp indexOfSelectedItem] > 0 && sender != fX264optWeightBSwitch && sender != fX264optBPyramidSwitch && sender != fX264optDirectPredPopUp)
+ {
+ [fX264optDirectPredPopUp selectItemAtIndex: 0];
+ [[fX264optDirectPredPopUp cell] performClick:self];
+
+ }
+ }
+ else if ( [fX264optBframesPopUp indexOfSelectedItem ] == 2)
+ {
+ /* Only 1 b-frame? Disable b-pyramid. */
+ [[fX264optBPyramidSwitch animator] setHidden:YES];
+ [[fX264optBPyramidLabel animator] setHidden:YES];
+ if ( [fX264optBPyramidSwitch state] == 1 && sender != fX264optBPyramidSwitch)
+ [fX264optBPyramidSwitch performClick:self];
+
+ [[fX264optWeightBSwitch animator] setHidden:NO];
+ [[fX264optWeightBLabel animator] setHidden:NO];
+
+ [[fX264optDirectPredPopUp animator] setHidden:NO];
+ [[fX264optDirectPredLabel animator] setHidden:NO];
+ }
+ else
+ {
+ [[fX264optWeightBSwitch animator] setHidden:NO];
+ [[fX264optWeightBLabel animator] setHidden:NO];
+
+ [[fX264optBPyramidSwitch animator] setHidden:NO];
+ [[fX264optBPyramidLabel animator] setHidden:NO];
+
+ [[fX264optDirectPredPopUp animator] setHidden:NO];
+ [[fX264optDirectPredLabel animator] setHidden:NO];
+ }
+
+ if ( [fX264optCabacSwitch state] == false)
+ {
+ /* Without CABAC entropy coding, trellis doesn't run. */
+
+ [[fX264optTrellisPopUp animator] setHidden:YES];
+ [[fX264optTrellisLabel animator] setHidden:YES];
+ [fX264optTrellisPopUp selectItemAtIndex:0];
+ if (sender != fX264optTrellisPopUp)
+ [[fX264optTrellisPopUp cell] performClick:self];
+ }
+ else
+ {
+ [[fX264optTrellisPopUp animator] setHidden:NO];
+ [[fX264optTrellisLabel animator] setHidden:NO];
+ }
+
+ if ( [fX264optAnalysePopUp indexOfSelectedItem] == 1)
+ {
+ /* No analysis? Disable 8x8dct */
+ [[fX264opt8x8dctSwitch animator] setHidden:YES];
+ [[fX264opt8x8dctLabel animator] setHidden:YES];
+ if ( [fX264opt8x8dctSwitch state] == 1 && sender != fX264opt8x8dctSwitch )
+ [fX264opt8x8dctSwitch performClick:self];
+ }
+ else
+ {
+ [[fX264opt8x8dctSwitch animator] setHidden:NO];
+ [[fX264opt8x8dctLabel animator] setHidden:NO];
+ }
+
+ if ( [fX264optRefPopUp indexOfSelectedItem] < 3)
+ {
+ /* Only do mixed-refs when there are at least 2 refs to mix. */
+ [[fX264optMixedRefsSwitch animator] setHidden:YES];
+ [[fX264optMixedRefsLabel animator] setHidden:YES];
+ if ( [fX264optMixedRefsSwitch state] == 1 && sender != fX264optMixedRefsSwitch )
+ [fX264optMixedRefsSwitch performClick:self];
+ }
+ else
+ {
+ [[fX264optMixedRefsSwitch animator] setHidden:NO];
+ [[fX264optMixedRefsLabel animator] setHidden:NO];
+ }
+}
+
+/**
* Resets the GUI widgets to the contents of the option string.
*/
- (IBAction) X264AdvancedOptionsSetCurrentSettings: (id) sender
else if ([optValue isEqualToString:@"umh"])
[fX264optMotionEstPopUp selectItemAtIndex:3];
else if ([optValue isEqualToString:@"esa"])
- [fX264optMotionEstPopUp selectItemAtIndex:4];
+ [fX264optMotionEstPopUp selectItemAtIndex:4];
+ else if ([optValue isEqualToString:@"tesa"])
+ [fX264optMotionEstPopUp selectItemAtIndex:5];
}
/*ME Range NSPopUpButton*/
if ([optName isEqualToString:@"merange"])
{
[fX264optWeightBSwitch setState:[optValue intValue]];
}
- /*BRDO NSButton*/
- if ([optName isEqualToString:@"brdo"])
- {
- [fX264optBRDOSwitch setState:[optValue intValue]];
- }
/*B Pyramid NSPButton*/
if ([optName isEqualToString:@"b-pyramid"])
{
[fX264optBPyramidSwitch setState:[optValue intValue]];
}
- /*Bidirectional Motion Estimation Refinement NSButton*/
- if ([optName isEqualToString:@"bime"])
- {
- [fX264optBiMESwitch setState:[optValue intValue]];
- }
/*Direct B-frame Prediction NSPopUpButton*/
if ([optName isEqualToString:@"direct"])
{
{
optNameToChange = @"weightb";
}
- if (sender == fX264optBRDOSwitch)
- {
- optNameToChange = @"brdo";
- }
if (sender == fX264optBPyramidSwitch)
{
optNameToChange = @"b-pyramid";
}
- if (sender == fX264optBiMESwitch)
- {
- optNameToChange = @"bime";
- }
if (sender == fX264optDirectPredPopUp)
{
optNameToChange = @"direct";
thisOpt = [NSString stringWithFormat:@"%@=%d,%d",optName, ([fX264optAlphaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optAlphaDeblockPopUp indexOfSelectedItem]-7 : 0,([fX264optBetaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optBetaDeblockPopUp indexOfSelectedItem]-7 : 0];
}
}
- else if /*Boolean Switches*/ ([optNameToChange isEqualToString:@"mixed-refs"] || [optNameToChange isEqualToString:@"weightb"] || [optNameToChange isEqualToString:@"brdo"] || [optNameToChange isEqualToString:@"bime"] || [optNameToChange isEqualToString:@"b-pyramid"] || [optNameToChange isEqualToString:@"no-fast-pskip"] || [optNameToChange isEqualToString:@"no-dct-decimate"] || [optNameToChange isEqualToString:@"8x8dct"] )
+ else if /*Boolean Switches*/ ([optNameToChange isEqualToString:@"mixed-refs"] || [optNameToChange isEqualToString:@"weightb"] || [optNameToChange isEqualToString:@"b-pyramid"] || [optNameToChange isEqualToString:@"no-fast-pskip"] || [optNameToChange isEqualToString:@"no-dct-decimate"] || [optNameToChange isEqualToString:@"8x8dct"] )
{
/* Here is where we take care of the boolean options that work overtly:
no-dct-decimate being on means no-dct-decimate=1, etc. Some options
case 4:
thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"esa"];
break;
-
+
+ case 5:
+ thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"tesa"];
+
default:
break;
}
[fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@",
[NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"esa"]]];
break;
-
+
+ case 5:
+ [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@",
+ [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"tesa"]]];
+ break;
+
default:
break;
}
If only one filter is at 0, both need to be overtly specified. */
[fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d,%d", ([fX264optAlphaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optAlphaDeblockPopUp indexOfSelectedItem]-7 : 0, ([fX264optBetaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optBetaDeblockPopUp indexOfSelectedItem]-7 : 0]]];
}
- else if /*Boolean Switches*/ ([optNameToChange isEqualToString:@"mixed-refs"] || [optNameToChange isEqualToString:@"weightb"] || [optNameToChange isEqualToString:@"brdo"] || [optNameToChange isEqualToString:@"bime"] || [optNameToChange isEqualToString:@"b-pyramid"] || [optNameToChange isEqualToString:@"no-fast-pskip"] || [optNameToChange isEqualToString:@"no-dct-decimate"] || [optNameToChange isEqualToString:@"8x8dct"] )
+ else if /*Boolean Switches*/ ([optNameToChange isEqualToString:@"mixed-refs"] || [optNameToChange isEqualToString:@"weightb"] || [optNameToChange isEqualToString:@"b-pyramid"] || [optNameToChange isEqualToString:@"no-fast-pskip"] || [optNameToChange isEqualToString:@"no-dct-decimate"] || [optNameToChange isEqualToString:@"8x8dct"] )
{
/* This covers all the boolean options that need to be specified only when true. */
if ([sender state] == 0)
[NSString stringWithFormat:[fDisplayX264Options stringValue]],
[NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"esa"]]];
break;
+
+ case 5:
+ [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@",
+ [NSString stringWithFormat:[fDisplayX264Options stringValue]],
+ [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"tesa"]]];
+ break;
default:
break;
just a little more fun, values start at -6 instead of at zero. */
[fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", [NSString stringWithFormat:[fDisplayX264Options stringValue]], [NSString stringWithFormat:optNameToChange], [NSString stringWithFormat:@"%d,%d", ([fX264optAlphaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optAlphaDeblockPopUp indexOfSelectedItem]-7 : 0, ([fX264optBetaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optBetaDeblockPopUp indexOfSelectedItem]-7 : 0]]];
}
- else if /*Boolean Switches*/ ([optNameToChange isEqualToString:@"mixed-refs"] || [optNameToChange isEqualToString:@"weightb"] || [optNameToChange isEqualToString:@"brdo"] || [optNameToChange isEqualToString:@"bime"] || [optNameToChange isEqualToString:@"b-pyramid"] || [optNameToChange isEqualToString:@"no-fast-pskip"] || [optNameToChange isEqualToString:@"no-dct-decimate"] || [optNameToChange isEqualToString:@"8x8dct"] )
+ else if /*Boolean Switches*/ ([optNameToChange isEqualToString:@"mixed-refs"] || [optNameToChange isEqualToString:@"weightb"] || [optNameToChange isEqualToString:@"b-pyramid"] || [optNameToChange isEqualToString:@"no-fast-pskip"] || [optNameToChange isEqualToString:@"no-dct-decimate"] || [optNameToChange isEqualToString:@"8x8dct"] )
{
/* Covers all the normal booleans, that only need to be included in the string when they're true. */
if ([sender state] == 0)
}
/* We now need to reset the opt widgets since we changed some stuff */
- [self X264AdvancedOptionsSet:NULL];
+ [self X264AdvancedOptionsSet:sender];
}
@end