OSDN Git Service

MacGui: Adds a popup menu item for Hadamard-transformed exhaustive motion estimation...
[handbrake-jp/handbrake-jp-git.git] / macosx / HBAdvancedController.m
index 1c6565e..8f3f963 100644 (file)
@@ -1,7 +1,7 @@
 /* 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"
@@ -41,7 +41,7 @@
 - (void) setOptions: (NSString *)string
 {
     [fDisplayX264Options setStringValue:string];
-    [self X264AdvancedOptionsSet:NULL];
+    [self X264AdvancedOptionsSet:nil];
 }
 
 - (void) setHidden: (BOOL) hide
@@ -68,8 +68,7 @@
         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};
@@ -89,6 +88,8 @@
         [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