OSDN Git Service

MacGui: Fixed bitrate calculation for target size.
[handbrake-jp/handbrake-jp-git.git] / macosx / Controller.mm
index 920136e..856ab21 100644 (file)
@@ -51,7 +51,6 @@ static NSString *        AddToQueueIdentifier               = @"Add to Queue Ite
 static NSString *        ShowActivityIdentifier             = @"Debug Output Item Identifier";
 static NSString *        ChooseSourceIdentifier             = @"Choose Source Item Identifier";
 
-#if JOB_GROUPS
 /**
  * Returns the number of jobs groups in the queue.
  * @param h Handle to hb_handle_t.
@@ -69,7 +68,6 @@ static int hb_group_count(hb_handle_t * h)
        }
        return count;
 }
-#endif
 
 /*******************************
  * HBController implementation *
@@ -82,7 +80,9 @@ static int hb_group_count(hb_handle_t * h)
     [HBPreferencesController registerUserDefaults];
     fHandle = NULL;
     outputPanel = [[HBOutputPanelController alloc] init];
+    fPictureController = [[PictureController alloc] initWithDelegate:self];
     fQueueController = [[HBQueueController alloc] init];
+    fAdvancedOptions = [[HBAdvancedController alloc] init];
     return self;
 }
 
@@ -104,11 +104,11 @@ static int hb_group_count(hb_handle_t * h)
     fChapterTitlesDelegate = [[ChapterTitles alloc] init];
     [fChapterTable setDataSource:fChapterTitlesDelegate];
 
-     /* Call UpdateUI every 2/10 sec */
+     /* Call UpdateUI every 1/2 sec */
     [[NSRunLoop currentRunLoop] addTimer: [NSTimer
-        scheduledTimerWithTimeInterval: 0.2 target: self
-        selector: @selector( updateUI: ) userInfo: NULL repeats: FALSE]
-        forMode: NSModalPanelRunLoopMode];
+        scheduledTimerWithTimeInterval: 0.5 target: self
+        selector: @selector( updateUI: ) userInfo: NULL repeats: YES]
+        forMode: NSEventTrackingRunLoopMode];
 
     if( ( build = hb_check_update( fHandle, &version ) ) > -1 )
     {
@@ -142,9 +142,9 @@ static int hb_group_count(hb_handle_t * h)
 - (NSApplicationTerminateReply) applicationShouldTerminate:
     (NSApplication *) app
 {
-     hb_state_t s;
+    hb_state_t s;
     hb_get_state2( fHandle, &s );
-    if ( s.state ==  HB_STATE_WORKING)    
+    if ( s.state ==  HB_STATE_WORKING )    
     {
         [self Cancel: NULL];
         return NSTerminateCancel;
@@ -163,14 +163,9 @@ static int hb_group_count(hb_handle_t * h)
 - (void) awakeFromNib
 {
     [fWindow center];
-       /* set the main menu bar so it doesnt auto enable the menu items
-          so we can manually do it with setEnabled: This should be changed
-          to use validateUserInterfaceItem: along with setAutoEnablesItems: YES
-          in the next release */
-       [fMenuBarFileMenu setAutoenablesItems: NO];
-    [fMenuBarWindowMenu setAutoenablesItems: NO];
-       [fMenuPauseEncode setEnabled: NO];
-       [self TranslateStrings];
+    [fWindow setExcludedFromWindowsMenu:YES];
+    [fAdvancedOptions setView:fAdvancedView];
+
     /* Initialize currentScanCount so HB can use it to
                evaluate successive scans */
        currentScanCount = 0;
@@ -254,26 +249,12 @@ static int hb_group_count(hb_handle_t * h)
     [fVidRatePopUp selectItemAtIndex: 0];
        
        /* Picture Settings */
-       [fPicLabelPAROutp setStringValue: @""];
        [fPicLabelPAROutputX setStringValue: @""];
        [fPicSettingPARWidth setStringValue: @""];
        [fPicSettingPARHeight setStringValue:  @""];
        
-       /*Set detelecine to Off upon launch */
-       [fPicSettingDetelecine setStringValue: @"No"];
-       [fPicSettingDenoise setStringValue: @"0"];
-       /* if Deinterlace upon launch is specified in the prefs, then set to 1 for "Fast",
-          if not, then set to 0 for none */
-       if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultDeinterlaceOn"] > 0)
-       {
-       [fPicSettingDeinterlace setStringValue: @"1"];
-       }
-       else
-       {
-       [fPicSettingDeinterlace setStringValue: @"0"];
-       }
        /* Set Auto Crop to On at launch */
-       [fPicSettingAutoCrop setStringValue: @"1"];
+    [fPictureController setAutoCrop:YES];
        
        /* Audio bitrate */
     [fAudBitratePopUp removeAllItems];
@@ -311,7 +292,7 @@ static int hb_group_count(hb_handle_t * h)
        [self getDefaultPresets: NULL];
        /* lets initialize the current successful scancount here to 0 */
        currentSuccessfulScanCount = 0;
-       
+    
 }
 
 - (void) loadPresets {
@@ -464,7 +445,7 @@ static int hb_group_count(hb_handle_t * h)
         hb_state_t s;
         hb_get_state2( fHandle, &s );
         
-        if (s.state == HB_STATE_WORKING)
+        if (s.state == HB_STATE_WORKING || s.state == HB_STATE_MUXING)
         {
             if ([ident isEqualToString: StartEncodingIdentifier])
             {
@@ -531,21 +512,80 @@ static int hb_group_count(hb_handle_t * h)
     return NO;
 }
 
+- (BOOL) validateMenuItem: (NSMenuItem *) menuItem
+{
+    SEL action = [menuItem action];
+    
+    hb_state_t s;
+    hb_get_state2( fHandle, &s );
+    
+    if (fHandle)
+    {
+        if (action == @selector(addToQueue:) || action == @selector(showPicturePanel:) || action == @selector(showAddPresetPanel:))
+            return SuccessfulScan && [fWindow attachedSheet] == nil;
+        
+        if (action == @selector(showScanPanel:))
+        {
+            if (s.state == HB_STATE_SCANNING)
+                return NO;
+            else
+                return [fWindow attachedSheet] == nil;
+        }
+        if (action == @selector(selectDefaultPreset:))
+            return [tableView selectedRow] >= 0 && [fWindow attachedSheet] == nil;
+        if (action == @selector(Pause:))
+        {
+            if (s.state == HB_STATE_WORKING)
+            {
+                if(![[menuItem title] isEqualToString:@"Pause Encoding"])
+                    [menuItem setTitle:@"Pause Encoding"];
+                return YES;
+            }
+            else if (s.state == HB_STATE_PAUSED)
+            {
+                if(![[menuItem title] isEqualToString:@"Resume Encoding"])
+                    [menuItem setTitle:@"Resume Encoding"];
+                return YES;
+            }
+            else
+                return NO;
+        }
+        if (action == @selector(Rip:))
+            if (s.state == HB_STATE_WORKING || s.state == HB_STATE_MUXING || s.state == HB_STATE_PAUSED)
+            {
+                if(![[menuItem title] isEqualToString:@"Stop Encoding"])
+                    [menuItem setTitle:@"Stop Encoding"];
+                return YES;
+            }
+            else if (SuccessfulScan)
+            {
+                if(![[menuItem title] isEqualToString:@"Start Encoding"])
+                    [menuItem setTitle:@"Start Encoding"];
+                return [fWindow attachedSheet] == nil;
+            }
+            else
+                return NO;
+        }
+    
+    return YES;
+}
+
+
 // register a test notification and make
 // it enabled by default
 #define SERVICE_NAME @"Encode Done"
 - (NSDictionary *)registrationDictionaryForGrowl 
 { 
-NSDictionary *registrationDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
-[NSArray arrayWithObjects:SERVICE_NAME,nil], GROWL_NOTIFICATIONS_ALL, 
-[NSArray arrayWithObjects:SERVICE_NAME,nil], GROWL_NOTIFICATIONS_DEFAULT, 
-nil]; 
+    NSDictionary *registrationDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
+    [NSArray arrayWithObjects:SERVICE_NAME,nil], GROWL_NOTIFICATIONS_ALL, 
+    [NSArray arrayWithObjects:SERVICE_NAME,nil], GROWL_NOTIFICATIONS_DEFAULT, 
+    nil]; 
 
-return registrationDictionary; 
+    return registrationDictionary; 
 } 
+
 - (void) TranslateStrings
 {
-    [fSrcDVD1Field      setStringValue: _( @"DVD:" )];
     [fSrcTitleField     setStringValue: _( @"Title:" )];
     [fSrcChapterField   setStringValue: _( @"Chapters:" )];
     [fSrcChapterToField setStringValue: _( @"to" )];
@@ -648,8 +688,8 @@ return registrationDictionary;
 - (void) updateUI: (NSTimer *) timer
 {
 
-hb_list_t  * list;
-list = hb_get_titles( fHandle );       
+    hb_list_t  * list;
+    list = hb_get_titles( fHandle );   
     /* check to see if there has been a new scan done
        this bypasses the constraints of HB_STATE_WORKING
        not allowing setting a newly scanned source */
@@ -666,8 +706,7 @@ list = hb_get_titles( fHandle );
                [self showNewScan: NULL];
        }
        
-       
-       
+    BOOL jobGroups = [[NSUserDefaults standardUserDefaults] boolForKey:@"QueueShowsJobsAsGroups"];
        
     hb_state_t s;
     hb_get_state( fHandle, &s );
@@ -745,10 +784,6 @@ list = hb_get_titles( fHandle );
             /* Update dock icon */
             [self UpdateDockIcon: progress_total];
                        
-                       /* Main Menu controls */
-                       [fMenuPauseEncode setTitle: @"Pause Encode"];
-                       [fMenuStartEncode setTitle: @"Cancel Encode"];
-
             // Has current job changed? That means the queue has probably changed as
                        // well so update it
             if (fLastKnownCurrentJob != hb_current_job(fHandle))
@@ -789,8 +824,6 @@ list = hb_get_titles( fHandle );
         case HB_STATE_PAUSED:
                    [fStatusField setStringValue: _( @"Paused" )];
             
-                       [fMenuPauseEncode setTitle: @"Resume Encode"];
-
                        // Pass along the info to HBQueueController
             [fQueueController updateCurrentJobUI];
 
@@ -802,32 +835,24 @@ list = hb_get_titles( fHandle );
             [fRipIndicator setIndeterminate: NO];
             [fRipIndicator setDoubleValue: 0.0];
             [toolbar validateVisibleItems];
-            
-                       /* Main Menu Controls*/
-                       [fMenuPauseEncode setTitle: @"Pause Encode"];
-                       [fMenuPauseEncode setEnabled: NO];
-                       [fMenuStartEncode setTitle: @"Start Encode"];
+
             /* Restore dock icon */
             [self UpdateDockIcon: -1.0];
 
-#if JOB_GROUPS
-            hb_job_t * job;
-            while( ( job = hb_job( fHandle, 0 ) ) && (job->sequence_id != 0) )
-                hb_rem( fHandle, job );
-                       // Start processing back up if jobs still left in queue
-                       if (hb_count(fHandle) > 0)
-                       {
-                               hb_start(fHandle);
-                               break;
-                       }
-#else
-            /* FIXME */
-            hb_job_t * job;
-            while( ( job = hb_job( fHandle, 0 ) ) )
+            if (jobGroups)
             {
-                hb_rem( fHandle, job );
+                // Delete all remaining scans of this job
+                hb_job_t * job;
+                while( ( job = hb_job( fHandle, 0 ) ) && (job->sequence_id != 0) )
+                    hb_rem( fHandle, job );
+            }
+
+            // Start processing back up if jobs still left in queue
+            if (hb_count(fHandle) > 0)
+            {
+                hb_start(fHandle);
+                break;
             }
-#endif
                        
             if (fRipIndicatorShown)
             {
@@ -916,13 +941,8 @@ list = hb_get_titles( fHandle );
         }
     }
        
-    /* Lets show the queue status
-               here in the main window*/
-#if JOB_GROUPS
-       int queue_count = hb_group_count( fHandle );
-#else
-       int queue_count = hb_count( fHandle );
-#endif
+    /* Lets show the queue status here in the main window */
+       int queue_count = jobGroups ? hb_group_count( fHandle ) : hb_count( fHandle );
        if( queue_count )
        {
                [fQueueStatus setStringValue: [NSString stringWithFormat:
@@ -933,12 +953,8 @@ list = hb_get_titles( fHandle );
        {
                [fQueueStatus setStringValue: @""];
        }
-       
-    [[NSRunLoop currentRunLoop] addTimer: [NSTimer
-        scheduledTimerWithTimeInterval: 0.5 target: self
-                                                         selector: @selector( updateUI: ) userInfo: NULL repeats: FALSE]
-                                                                forMode: NSModalPanelRunLoopMode];
 }
+
 - (IBAction) showNewScan:(id)sender
 {
        hb_list_t  * list;
@@ -952,7 +968,6 @@ list = hb_get_titles( fHandle );
        {
                /* We display a message if a valid dvd source was not chosen */
                [fSrcDVD2Field setStringValue: @"No Valid Title Found"];
-        [fMenuOpenSource setEnabled: YES];
         SuccessfulScan = 0;
        }
        else
@@ -966,12 +981,7 @@ list = hb_get_titles( fHandle );
         currentSuccessfulScanCount++;
 
                [self enableUI: YES];
-               /* Enable/Disable Menu Controls Accordingly */
-               [fMenuOpenSource setEnabled: YES];
-               [fMenuStartEncode setEnabled: YES];
-               [fMenuAddToQueue setEnabled: YES];
-               [fMenuPicturePanelShow setEnabled: YES];
-               [fMenuQueuePanelShow setEnabled: YES];
+
         [toolbar validateVisibleItems];
                
                [fSrcTitlePopUp removeAllItems];
@@ -1068,20 +1078,24 @@ list = hb_get_titles( fHandle );
                /* we record the current source name here in case the next scan is unsuccessful,
                                then we can replace the scan progress with the old name if necessary */
        sourceDisplayName = [NSString stringWithFormat:[fSrcDVD2Field stringValue]];
-       
-       /* if its the initial successful scan after awakeFromNib */
+       
+       /* if its the initial successful scan after awakeFromNib */
           if (currentSuccessfulScanCount == 1)
           {
-            [self selectDefaultPreset: NULL];
-          }  
+           [self selectDefaultPreset: NULL];
+           /* if Deinterlace upon launch is specified in the prefs, then set to 1 for "Fast",
+           if not, then set to 0 for none */
+           if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultDeinterlaceOn"] > 0)
+               [fPictureController setDeinterlace:1];
+           else
+               [fPictureController setDeinterlace:0];
+          }
+       
        }
 }
 
-
 -(IBAction)showGrowlDoneNotification:(id)sender
 {
-
-  
   [GrowlApplicationBridge 
           notifyWithTitle:@"Put down that cocktail..." 
               description:@"your HandBrake encode is done!" 
@@ -1091,10 +1105,11 @@ list = hb_get_titles( fHandle );
                  isSticky:1 
              clickContext:nil];
 }
+
 - (void) enableUI: (bool) b
 {
     NSControl * controls[] =
-      { fSrcDVD1Field, fSrcTitleField, fSrcTitlePopUp,
+      { fSrcTitleField, fSrcTitlePopUp,
         fSrcChapterField, fSrcChapterStartPopUp, fSrcChapterToField,
         fSrcChapterEndPopUp, fSrcDuration1Field, fSrcDuration2Field,
         fDstFormatField, fDstFormatPopUp, fDstCodecsField,
@@ -1106,23 +1121,13 @@ list = hb_get_titles( fHandle );
         fAudTrack1MixLabel, fAudTrack1MixPopUp, fAudTrack2MixLabel, fAudTrack2MixPopUp,
         fAudRateField, fAudRatePopUp, fAudBitrateField,
         fAudBitratePopUp, fPictureButton,fQueueStatus, 
-               fPicSrcWidth,fPicSrcHeight,fPicSettingWidth,fPicSettingHeight,
-               fPicSettingARkeep,fPicSettingDeinterlace,fPicSettingARkeepDsply,
-               fPicSettingDeinterlaceDsply,fPicLabelSettings,fPicLabelSrc,fPicLabelOutp,
-               fPicLabelAr,fPicLabelDeinter,fPicLabelSrcX,fPicLabelOutputX,
-               fPicLabelPAROutp,fPicLabelPAROutputX,fPicSettingPARWidth,fPicSettingPARHeight,
-               fPicSettingPARDsply,fPicLabelAnamorphic,tableView,fPresetsAdd,fPresetsDelete,
-               fCreateChapterMarkers,fX264optViewTitleLabel,fDisplayX264Options,fDisplayX264OptionsLabel,fX264optBframesLabel,
-               fX264optBframesPopUp,fX264optRefLabel,fX264optRefPopUp,fX264optNfpskipLabel,fX264optNfpskipSwitch,
-               fX264optNodctdcmtLabel,fX264optNodctdcmtSwitch,fX264optSubmeLabel,fX264optSubmePopUp,
-               fX264optTrellisLabel,fX264optTrellisPopUp,fX264optMixedRefsLabel,fX264optMixedRefsSwitch,
-               fX264optMotionEstLabel,fX264optMotionEstPopUp,fX264optMERangeLabel,fX264optMERangePopUp,
-               fX264optWeightBLabel,fX264optWeightBSwitch,fX264optBRDOLabel,fX264optBRDOSwitch,
-               fX264optBPyramidLabel,fX264optBPyramidSwitch,fX264optBiMELabel,fX264optBiMESwitch,
-               fX264optDirectPredLabel,fX264optDirectPredPopUp,fX264optDeblockLabel,fX264optAnalyseLabel,
-               fX264optAnalysePopUp,fX264opt8x8dctLabel,fX264opt8x8dctSwitch,fX264optCabacLabel,fX264optCabacSwitch,
-               fX264optAlphaDeblockPopUp,fX264optBetaDeblockPopUp,fVidTurboPassCheck,fDstMpgLargeFileCheck,fPicSettingAutoCropLabel,
-               fPicSettingAutoCropDsply,fPicSettingDetelecine,fPicSettingDetelecineLabel,fPicSettingDenoiseLabel,fPicSettingDenoiseDsply,fSubForcedCheck,};
+               fPicSrcWidth,fPicSrcHeight,fPicSettingWidth,fPicSettingHeight,fPicSettingARkeep,
+               fPicSettingDeinterlace,fPicLabelSettings,fPicLabelSrc,fPicLabelOutp,
+               fPicLabelAr,fPicLabelDeinterlace,fPicLabelSrcX,fPicLabelOutputX,
+               fPicLabelPAROutputX,fPicSettingPARWidth,fPicSettingPARHeight,
+               fPicSettingPAR,fPicLabelAnamorphic,tableView,fPresetsAdd,fPresetsDelete,
+               fCreateChapterMarkers,fVidTurboPassCheck,fDstMpgLargeFileCheck,fPicLabelAutoCrop,
+               fPicSettingAutoCrop,fPicSettingDetelecine,fPicLabelDetelecine,fPicLabelDenoise,fPicSettingDenoise,fSubForcedCheck,};
 
     for( unsigned i = 0;
          i < sizeof( controls ) / sizeof( NSControl * ); i++ )
@@ -1154,17 +1159,11 @@ list = hb_get_titles( fHandle );
        }
 
     [self videoMatrixChanged: NULL];
+    [fAdvancedOptions enableUI:b];
 }
 
 - (IBAction) showScanPanel: (id) sender
 {
-    /* Enable/Disable Menu Controls Accordingly */
-       [fMenuOpenSource setEnabled: NO];
-       [fMenuStartEncode setEnabled: NO];
-       [fMenuAddToQueue setEnabled: NO];
-       
-       [fMenuPicturePanelShow setEnabled: NO];
-       [fMenuQueuePanelShow setEnabled: NO];
     [self enableUI: NO];
        
        [self browseSources:NULL];
@@ -1222,33 +1221,38 @@ list = hb_get_titles( fHandle );
        }
        else // User clicked Cancel in browse window
        {
-               /* use the outlets to the main menu bar to determine what to
-                  enable and disable */
-               [fMenuOpenSource setEnabled: YES];
-        [fMenuQueuePanelShow setEnabled: YES];
                /* if we have a title loaded up */
                if ([[fSrcDVD2Field stringValue] length] > 0)
                {
-               [fMenuAddToQueue setEnabled: YES];
-               [fMenuStartEncode setEnabled: YES];
-               [fMenuPicturePanelShow setEnabled: YES];
-        [self enableUI: YES];
+            [self enableUI: YES];
         }
        }
 }
 
-
 - (IBAction) openMainWindow: (id) sender
 {
     [fWindow  makeKeyAndOrderFront:nil];
     [fWindow setReleasedWhenClosed: YES];
 }
+
 - (BOOL) windowShouldClose: (id) sender
 {
     [fWindow setReleasedWhenClosed: NO];
     return YES;
 }
 
+- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
+{
+    if( !flag ) {
+        [fWindow  makeKeyAndOrderFront:nil];
+        [fWindow setReleasedWhenClosed: YES];
+        
+        return YES;
+    }
+    
+    return NO;
+}
+
 - (IBAction) videoMatrixChanged: (id) sender;
 {
     bool target, bitrate, quality;
@@ -1311,47 +1315,19 @@ list = hb_get_titles( fHandle );
     if( returnCode == NSOKButton )
     {
         [fDstFile2Field setStringValue: [sheet filename]];
-               
     }
 }
 
 - (IBAction) showPicturePanel: (id) sender
 {
-    /* Enable/Disable Menu Controls Accordingly */
-       [fMenuOpenSource setEnabled: NO];
-       [fMenuStartEncode setEnabled: NO];
-       [fMenuAddToQueue setEnabled: NO];
-       
-       [fMenuPicturePanelShow setEnabled: NO];
-       [fMenuQueuePanelShow setEnabled: NO];
-       
        hb_list_t  * list  = hb_get_titles( fHandle );
     hb_title_t * title = (hb_title_t *) hb_list_item( list,
             [fSrcTitlePopUp indexOfSelectedItem] );
+    [fPictureController showPanelInWindow:fWindow forTitle:title];
+}
 
-    /* Resize the panel */
-    NSSize newSize;
-    newSize.width  = 246 + title->width;
-    newSize.height = 80 + title->height;
-    [fPicturePanel setContentSize: newSize];
-
-    [fPictureController SetTitle: title];
-
-    [NSApp beginSheet: fPicturePanel modalForWindow: fWindow
-        modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
-    [NSApp runModalForWindow: fPicturePanel];
-    [NSApp endSheet: fPicturePanel];
-    [fPicturePanel orderOut: self];
-       
-       /* Enable/Disable Menu Controls Accordingly */
-       [fMenuOpenSource setEnabled: YES];
-       [fMenuStartEncode setEnabled: YES];
-       [fMenuAddToQueue setEnabled: YES];
-       
-       [fMenuPicturePanelShow setEnabled: YES];
-       [fMenuQueuePanelShow setEnabled: YES];
-       
-       [self calculatePictureSizing: sender];
+- (void)pictureSettingsDidChange {
+       [self calculatePictureSizing: NULL];
 }
 
 - (void) PrepareJob
@@ -1435,12 +1411,12 @@ list = hb_get_titles( fHandle );
                        NSString *firstPassOptStringTurbo = @":ref=1:subme=1:me=dia:analyse=none:trellis=0:no-fast-pskip=0:8x8dct=0";
                        /* append the "Turbo" string variable to the existing opts string.
                        Note: the "Turbo" string must be appended, not prepended to work properly*/
-                       NSString *firstPassOptStringCombined = [[fDisplayX264Options stringValue] stringByAppendingString:firstPassOptStringTurbo];
+                       NSString *firstPassOptStringCombined = [[fAdvancedOptions optionsString] stringByAppendingString:firstPassOptStringTurbo];
                        strcpy(job->x264opts, [firstPassOptStringCombined UTF8String]);
                }
                else
                {
-                       strcpy(job->x264opts, [[fDisplayX264Options stringValue] UTF8String]);
+                       strcpy(job->x264opts, [[fAdvancedOptions optionsString] UTF8String]);
                }
                
         job->h264_13 = [fVidEncoderPopUp indexOfSelectedItem];
@@ -1507,61 +1483,53 @@ list = hb_get_titles( fHandle );
                      indexOfSelectedItem]].rate;
     job->abitrate = [[fAudBitratePopUp selectedItem] tag];
     
-    /* TODO: Filter settings */
-    if( job->filters )
-    {
-        hb_list_close( &job->filters );
-    }
     job->filters = hb_list_init();
    
        /* Detelecine */
-   if ([[fPicSettingDetelecine stringValue] isEqualToString: @"Yes"])
-   {
-   hb_list_add( job->filters, &hb_filter_detelecine );
-   }
+    if ([fPictureController detelecine])
+    {
+        hb_list_add( job->filters, &hb_filter_detelecine );
+    }
    
-   /* Deinterlace */
-   if( job->deinterlace == 1)
-    {        
-        if ([fPicSettingDeinterlace intValue] == 1)
-        {
-            /* Run old deinterlacer by default */
-            hb_filter_deinterlace.settings = "-1"; 
-            hb_list_add( job->filters, &hb_filter_deinterlace );
-        }
-        if ([fPicSettingDeinterlace intValue] == 2)
-        {
-            /* Yadif mode 0 (1-pass with spatial deinterlacing.) */
-            hb_filter_deinterlace.settings = "0"; 
-            hb_list_add( job->filters, &hb_filter_deinterlace );            
-        }
-        if ([fPicSettingDeinterlace intValue] == 3)
-        {
-            /* Yadif (1-pass w/o spatial deinterlacing) and Mcdeint */
-            hb_filter_deinterlace.settings = "2:-1:1"; 
-            hb_list_add( job->filters, &hb_filter_deinterlace );            
-        }
-        if ([fPicSettingDeinterlace intValue] == 4)
-        {
-            /* Yadif (2-pass w/ spatial deinterlacing) and Mcdeint*/
-            hb_filter_deinterlace.settings = "1:-1:1"; 
-            hb_list_add( job->filters, &hb_filter_deinterlace );            
-        }
+    /* Deinterlace */
+    if ([fPictureController deinterlace] == 1)
+    {
+        /* Run old deinterlacer by default */
+        hb_filter_deinterlace.settings = "-1"; 
+        hb_list_add( job->filters, &hb_filter_deinterlace );
+    }
+    else if ([fPictureController deinterlace] == 2)
+    {
+        /* Yadif mode 0 (1-pass with spatial deinterlacing.) */
+        hb_filter_deinterlace.settings = "0"; 
+        hb_list_add( job->filters, &hb_filter_deinterlace );            
+    }
+    else if ([fPictureController deinterlace] == 3)
+    {
+        /* Yadif (1-pass w/o spatial deinterlacing) and Mcdeint */
+        hb_filter_deinterlace.settings = "2:-1:1"; 
+        hb_list_add( job->filters, &hb_filter_deinterlace );            
+    }
+    else if ([fPictureController deinterlace] == 4)
+    {
+        /* Yadif (2-pass w/ spatial deinterlacing) and Mcdeint*/
+        hb_filter_deinterlace.settings = "1:-1:1"; 
+        hb_list_add( job->filters, &hb_filter_deinterlace );            
     }
        
        /* Denoise */
        
-       if ([fPicSettingDenoise intValue] == 1) // Weak in popup
+       if ([fPictureController denoise] == 1) // Weak in popup
        {
                hb_filter_denoise.settings = "2:1:2:3"; 
         hb_list_add( job->filters, &hb_filter_denoise );       
        }
-       else if ([fPicSettingDenoise intValue] == 2) // Medium in popup
+       else if ([fPictureController denoise] == 2) // Medium in popup
        {
                hb_filter_denoise.settings = "3:2:2:3"; 
         hb_list_add( job->filters, &hb_filter_denoise );       
        }
-       else if ([fPicSettingDenoise intValue] == 3) // Strong in popup
+       else if ([fPictureController denoise] == 3) // Strong in popup
        {
                hb_filter_denoise.settings = "7:7:5:5"; 
         hb_list_add( job->filters, &hb_filter_denoise );       
@@ -1588,11 +1556,9 @@ list = hb_get_titles( fHandle );
                                                                                                                  [fSrcTitlePopUp indexOfSelectedItem] );
                hb_job_t * job = title->job;
                
-#if JOB_GROUPS
-               // Assign a sequence number, starting at zero, to each job added so they can
-               // be lumped together in the UI.
-               job->sequence_id = -1;
-#endif
+        // Assign a sequence number, starting at zero, to each job added so they can
+        // be lumped together in the UI.
+        job->sequence_id = -1;
                
                [self PrepareJob];
                
@@ -1631,9 +1597,7 @@ list = hb_get_titles( fHandle );
                     /*
                      * Add the pre-scan job
                      */
-#if JOB_GROUPS
-                                       job->sequence_id++;
-#endif
+                                       job->sequence_id++; // for job grouping
                     hb_add( fHandle, job );
 
                     job->x264opts = x264opts_tmp;
@@ -1651,26 +1615,21 @@ list = hb_get_titles( fHandle );
 
                if( [fVidTwoPassCheck state] == NSOnState )
                {
-                        hb_subtitle_t **subtitle_tmp = job->select_subtitle;
-
-                        job->select_subtitle = NULL;
-
-                        job->subtitle_scan = 0;
+            hb_subtitle_t **subtitle_tmp = job->select_subtitle;
+            job->select_subtitle = NULL;
+            job->subtitle_scan = 0;
 
                        job->pass = 1;
-#if JOB_GROUPS
-                       job->sequence_id++;
-#endif
+                       job->sequence_id++; // for job grouping
                        hb_add( fHandle, job );
-#if JOB_GROUPS
-                       job->sequence_id++;
-#endif
+            
                        job->pass = 2;
+                       job->sequence_id++; // for job grouping
                        
                        job->x264opts = (char *)calloc(1024, 1); /* Fixme, this just leaks */  
-                       strcpy(job->x264opts, [[fDisplayX264Options stringValue] UTF8String]);
+                       strcpy(job->x264opts, [[fAdvancedOptions optionsString] UTF8String]);
 
-                        job->select_subtitle = subtitle_tmp;
+            job->select_subtitle = subtitle_tmp;
 
                        hb_add( fHandle, job );
                }
@@ -1678,9 +1637,7 @@ list = hb_get_titles( fHandle );
                {
                         job->subtitle_scan = 0;
                        job->pass = 0;
-#if JOB_GROUPS
-                       job->sequence_id++;
-#endif
+                       job->sequence_id++; // for job grouping
                        hb_add( fHandle, job );
                }
        
@@ -1770,8 +1727,6 @@ list = hb_get_titles( fHandle );
     hb_start( fHandle );
        /*set the fEncodeState State */
        fEncodeState = 1;
-
-       [fMenuPauseEncode setEnabled: YES];
 }
 
 - (IBAction) Cancel: (id) sender
@@ -1812,7 +1767,7 @@ list = hb_get_titles( fHandle );
 {
     hb_list_t  * list  = hb_get_titles( fHandle );
     hb_title_t * title = (hb_title_t*)
-        hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
+    hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
                
                
     /* If Auto Naming is on. We create an output filename of dvd name - title number */
@@ -1846,17 +1801,16 @@ list = hb_get_titles( fHandle );
        /* Turn Deinterlace on/off depending on the preference */
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultDeinterlaceOn"] > 0)
        {
-               job->deinterlace = 1;
+               [fPictureController setDeinterlace:1];
        }
        else
        {
-               job->deinterlace = 0;
+               [fPictureController setDeinterlace:0];
        }
        
        /* Pixel Ratio Setting */
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"PixelRatio"])
     {
-
                job->pixel_ratio = 1 ;
        }
        else
@@ -1870,8 +1824,8 @@ list = hb_get_titles( fHandle );
                                                         @"%d", fTitle->height]];
                                                         
        /* Set Auto Crop to on upon selecting a new title */
-       [fPicSettingAutoCrop setStringValue: @"1"];
-                                                        
+    [fPictureController setAutoCrop:YES];
+    
        /* We get the originial output picture width and height and put them
        in variables for use with some presets later on */
        PicOrigOutputWidth = job->width;
@@ -1943,7 +1897,6 @@ list = hb_get_titles( fHandle );
     }
 
                
-       
        hb_list_t  * list  = hb_get_titles( fHandle );
     hb_title_t * title = (hb_title_t *)
         hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
@@ -2085,9 +2038,8 @@ list = hb_get_titles( fHandle );
 {
     int format = [fDstFormatPopUp indexOfSelectedItem];
     int codecs = [fDstCodecsPopUp indexOfSelectedItem];
-       [fX264optView setHidden: YES];
-       [fX264optViewTitleLabel setStringValue: @"Only Used With The x264 (H.264) Codec"];
-
+       
+    [fAdvancedOptions setHidden:YES];
 
     /* Update the encoder popup*/
     if( ( FormatSettings[format][codecs] & HB_VCODEC_X264 ) )
@@ -2097,12 +2049,9 @@ list = hb_get_titles( fHandle );
                [fVidEncoderPopUp addItemWithTitle: @"x264 (h.264 Main)"];
                [fVidEncoderPopUp addItemWithTitle: @"x264 (h.264 iPod)"];
                [fVidEncoderPopUp selectItemAtIndex: 0];
-        [fX264optView setHidden: NO];
-               [fX264optViewTitleLabel setStringValue: @""];
-
-
-               
+        [fAdvancedOptions setHidden:NO];
     }
+    
     else if( ( FormatSettings[format][codecs] & HB_VCODEC_FFMPEG ) )
     {
         /* H.264 -> MPEG-4 */
@@ -2195,10 +2144,10 @@ list = hb_get_titles( fHandle );
 
 - (IBAction ) videoFrameRateChanged: (id) sender
 {
-/* We call method method to calculatePictureSizing to error check detelecine*/
-[self calculatePictureSizing: sender];
+    /* We call method method to calculatePictureSizing to error check detelecine*/
+    [self calculatePictureSizing: sender];
 
-/* We call method method to change UI to reflect whether a preset is used or not*/
+    /* We call method method to change UI to reflect whether a preset is used or not*/
        [self customSettingUsed: sender];
 }
 
@@ -2547,12 +2496,12 @@ list = hb_get_titles( fHandle );
 {
        if ([fSubPopUp indexOfSelectedItem] == 0)
        {
-       [fSubForcedCheck setState: NSOffState];
-       [fSubForcedCheck setEnabled: NO];       
+        [fSubForcedCheck setState: NSOffState];
+        [fSubForcedCheck setEnabled: NO];      
        }
        else
        {
-       [fSubForcedCheck setEnabled: YES];      
+        [fSubForcedCheck setEnabled: YES];     
        }
        
 }
@@ -2569,8 +2518,7 @@ list = hb_get_titles( fHandle );
        in TitlePopUpChanged */
        job->width = PicOrigOutputWidth;
        job->height = PicOrigOutputHeight;
-    [fPicSettingAutoCrop setStringValue: [NSString stringWithFormat:
-               @"%d", 1]];
+    [fPictureController setAutoCrop:YES];
        /* Here we use the auto crop values determined right after scan */
        job->crop[0] = AutoCropTop;
        job->crop[1] = AutoCropBottom;
@@ -2587,125 +2535,109 @@ list = hb_get_titles( fHandle );
 /* Get and Display Current Pic Settings in main window */
 - (IBAction) calculatePictureSizing: (id) sender
 {
-       
-
-       [fPicSettingWidth setStringValue: [NSString stringWithFormat:
-               @"%d", fTitle->job->width]];
-       [fPicSettingHeight setStringValue: [NSString stringWithFormat:
-               @"%d", fTitle->job->height]];
-       [fPicSettingARkeep setStringValue: [NSString stringWithFormat:
-               @"%d", fTitle->job->keep_ratio]];                
-       //[fPicSettingDeinterlace setStringValue: [NSString stringWithFormat:
-       //      @"%d", fTitle->job->deinterlace]];
-       [fPicSettingPAR setStringValue: [NSString stringWithFormat:
-               @"%d", fTitle->job->pixel_ratio]];
+       [fPicSettingWidth setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->width]];
+       [fPicSettingHeight setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->height]];
                
        if (fTitle->job->pixel_ratio == 1)
        {
-       int titlewidth = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3];
-       int arpwidth = fTitle->job->pixel_aspect_width;
-       int arpheight = fTitle->job->pixel_aspect_height;
-       int displayparwidth = titlewidth * arpwidth / arpheight;
-       int displayparheight = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1];
-       [fPicSettingWidth setStringValue: [NSString stringWithFormat:
-               @"%d", titlewidth]];
-       [fPicSettingHeight setStringValue: [NSString stringWithFormat:
-               @"%d", displayparheight]];
-       [fPicLabelPAROutp setStringValue: @"Anamorphic Output:"];
-       [fPicLabelPAROutputX setStringValue: @"x"];
-    [fPicSettingPARWidth setStringValue: [NSString stringWithFormat:
-        @"%d", displayparwidth]];
-       [fPicSettingPARHeight setStringValue: [NSString stringWithFormat:
-        @"%d", displayparheight]];
-
-       fTitle->job->keep_ratio = 0;
-       }
-       else
-       {
-       [fPicLabelPAROutp setStringValue: @""];
-       [fPicLabelPAROutputX setStringValue: @""];
-       [fPicSettingPARWidth setStringValue: @""];
-       [fPicSettingPARHeight setStringValue:  @""];
-       }
-       if ([fPicSettingDeinterlace intValue] == 0)
-       {
-       fTitle->job->deinterlace = 0;
+        int titlewidth = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3];
+        int arpwidth = fTitle->job->pixel_aspect_width;
+        int arpheight = fTitle->job->pixel_aspect_height;
+        int displayparwidth = titlewidth * arpwidth / arpheight;
+        int displayparheight = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1];
+        
+        [fPicSettingWidth setStringValue: [NSString stringWithFormat:@"%d", titlewidth]];
+        [fPicSettingHeight setStringValue: [NSString stringWithFormat:@"%d", displayparheight]];
+        [fPicLabelPAROutputX setStringValue: @"x"];
+        [fPicSettingPARWidth setStringValue: [NSString stringWithFormat:@"%d", displayparwidth]];
+        [fPicSettingPARHeight setStringValue: [NSString stringWithFormat:@"%d", displayparheight]];
+        
+        fTitle->job->keep_ratio = 0;
        }
        else
        {
-       fTitle->job->deinterlace = 1;
+        [fPicLabelPAROutputX setStringValue: @""];
+        [fPicSettingPARWidth setStringValue: @""];
+        [fPicSettingPARHeight setStringValue:  @""];
        }
-               
                                
        /* Set ON/Off values for the deinterlace/keep aspect ratio according to boolean */      
        if (fTitle->job->keep_ratio > 0)
        {
-               [fPicSettingARkeepDsply setStringValue: @"On"];
+               [fPicSettingARkeep setStringValue: @"On"];
        }
        else
        {
-               [fPicSettingARkeepDsply setStringValue: @"Off"];
+               [fPicSettingARkeep setStringValue: @"Off"];
        }       
+    /* Detelecine */
+    if ([fPictureController detelecine]) {
+        [fPicSettingDetelecine setStringValue: @"Yes"];
+    }
+    else {
+        [fPicSettingDetelecine setStringValue: @"No"];
+    }
+
        /* Deinterlace */
-       if ([fPicSettingDeinterlace intValue] == 0)
+       if ([fPictureController deinterlace] == 0)
        {
-               [fPicSettingDeinterlaceDsply setStringValue: @"Off"];
+               [fPicSettingDeinterlace setStringValue: @"Off"];
        }
-       else if ([fPicSettingDeinterlace intValue] == 1)
+       else if ([fPictureController deinterlace] == 1)
        {
-               [fPicSettingDeinterlaceDsply setStringValue: @"Fast"];
+               [fPicSettingDeinterlace setStringValue: @"Fast"];
        }
-       else if ([fPicSettingDeinterlace intValue] == 2)
+       else if ([fPictureController deinterlace] == 2)
        {
-               [fPicSettingDeinterlaceDsply setStringValue: @"Slow"];
+               [fPicSettingDeinterlace setStringValue: @"Slow"];
        }
-       else if ([fPicSettingDeinterlace intValue] == 3)
+       else if ([fPictureController deinterlace] == 3)
        {
-               [fPicSettingDeinterlaceDsply setStringValue: @"Slower"];
+               [fPicSettingDeinterlace setStringValue: @"Slower"];
        }
-       else if ([fPicSettingDeinterlace intValue] == 4)
+       else if ([fPictureController deinterlace] ==4)
        {
-               [fPicSettingDeinterlaceDsply setStringValue: @"Slowest"];
+               [fPicSettingDeinterlace setStringValue: @"Slowest"];
        }
        /* Denoise */
-       if ([fPicSettingDenoise intValue] == 0)
+       if ([fPictureController denoise] == 0)
        {
-               [fPicSettingDenoiseDsply setStringValue: @"Off"];
+               [fPicSettingDenoise setStringValue: @"Off"];
        }
-       else if ([fPicSettingDenoise intValue] == 1)
+       else if ([fPictureController denoise] == 1)
        {
-               [fPicSettingDenoiseDsply setStringValue: @"Weak"];
+               [fPicSettingDenoise setStringValue: @"Weak"];
        }
-       else if ([fPicSettingDenoise intValue] == 2)
+       else if ([fPictureController denoise] == 2)
        {
-               [fPicSettingDenoiseDsply setStringValue: @"Medium"];
+               [fPicSettingDenoise setStringValue: @"Medium"];
        }
-       else if ([fPicSettingDenoise intValue] == 3)
+       else if ([fPictureController denoise] == 3)
        {
-               [fPicSettingDenoiseDsply setStringValue: @"Strong"];
+               [fPicSettingDenoise setStringValue: @"Strong"];
        }
        
        if (fTitle->job->pixel_ratio > 0)
        {
-               [fPicSettingPARDsply setStringValue: @""];
+               [fPicSettingPAR setStringValue: @""];
        }
        else
        {
-               [fPicSettingPARDsply setStringValue: @"Off"];
+               [fPicSettingPAR setStringValue: @"Off"];
        }
        /* Set the display field for crop as per boolean */
-       if ([[fPicSettingAutoCrop stringValue] isEqualToString: @"0"])
+       if (![fPictureController autoCrop])
        {
-           [fPicSettingAutoCropDsply setStringValue: @"Custom"];
+           [fPicSettingAutoCrop setStringValue: @"Custom"];
        }
        else
        {
-               [fPicSettingAutoCropDsply setStringValue: @"Auto"];
+               [fPicSettingAutoCrop setStringValue: @"Auto"];
        }       
        /* check video framerate and turn off detelecine if necessary */
        if (fTitle->rate_base == 1126125 || [[fVidRatePopUp titleOfSelectedItem] isEqualToString: @"23.976 (NTSC Film)"])
        {
-               [fPicSettingDetelecine setStringValue: @"No"];
+               [fPictureController setDetelecine:0];
        }
        
        
@@ -2734,7 +2666,7 @@ list = hb_get_titles( fHandle );
     [fVidBitrateField setIntValue: hb_calc_bitrate( job,
             [fVidTargetSizeField intValue] )];
                        
-                       
+    [self customSettingUsed:sender];
 }
 
 /* Method to determine if we should change the UI
@@ -2751,970 +2683,10 @@ the user is using "Custom" settings by determining the sender*/
                [fPresetSelectedDisplay setStringValue: @"Custom"];
                
                curUserPresetChosenNum = nil;
-
-               
        }
 
 }
 
-- (IBAction) X264AdvancedOptionsSet: (id) sender
-{
-    /*Set opt widget values here*/
-    
-    /*B-Frames fX264optBframesPopUp*/
-    int i;
-    [fX264optBframesPopUp removeAllItems];
-    [fX264optBframesPopUp addItemWithTitle:@"Default (0)"];
-    for (i=0; i<17;i++)
-    {
-        [fX264optBframesPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
-    
-    /*Reference Frames fX264optRefPopUp*/
-    [fX264optRefPopUp removeAllItems];
-    [fX264optRefPopUp addItemWithTitle:@"Default (1)"];
-    for (i=0; i<17;i++)
-    {
-        [fX264optRefPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
-    
-    /*No Fast P-Skip fX264optNfpskipSwitch BOOLEAN*/
-    [fX264optNfpskipSwitch setState:0];
-    
-    /*No Dict Decimate fX264optNodctdcmtSwitch BOOLEAN*/
-    [fX264optNodctdcmtSwitch setState:0];    
-
-    /*Sub Me fX264optSubmePopUp*/
-    [fX264optSubmePopUp removeAllItems];
-    [fX264optSubmePopUp addItemWithTitle:@"Default (4)"];
-    for (i=0; i<8;i++)
-    {
-        [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
-    
-    /*Trellis fX264optTrellisPopUp*/
-    [fX264optTrellisPopUp removeAllItems];
-    [fX264optTrellisPopUp addItemWithTitle:@"Default (0)"];
-    for (i=0; i<3;i++)
-    {
-        [fX264optTrellisPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
-    
-    /*Mixed-references fX264optMixedRefsSwitch BOOLEAN*/
-    [fX264optMixedRefsSwitch setState:0];
-    
-    /*Motion Estimation fX264optMotionEstPopUp*/
-    [fX264optMotionEstPopUp removeAllItems];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Default (Hexagon)"];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Diamond"];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Hexagon"];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Uneven Multi-Hexagon"];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Exhaustive"];
-    
-    /*Motion Estimation range fX264optMERangePopUp*/
-    [fX264optMERangePopUp removeAllItems];
-    [fX264optMERangePopUp addItemWithTitle:@"Default (16)"];
-    for (i=4; i<65;i++)
-    {
-        [fX264optMERangePopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
-    
-    /*Weighted B-Frame Prediction fX264optWeightBSwitch BOOLEAN*/
-    [fX264optWeightBSwitch setState:0];
-    
-    /*B-Frame Rate Distortion Optimization fX264optBRDOSwitch BOOLEAN*/
-    [fX264optBRDOSwitch setState:0];
-    
-    /*B-frame Pyramids fX264optBPyramidSwitch BOOLEAN*/
-    [fX264optBPyramidSwitch setState:0];
-    
-    /*Bidirectional Motion Estimation Refinement fX264optBiMESwitch BOOLEAN*/
-    [fX264optBiMESwitch setState:0];
-    
-    /*Direct B-Frame Prediction Mode fX264optDirectPredPopUp*/
-    [fX264optDirectPredPopUp removeAllItems];
-    [fX264optDirectPredPopUp addItemWithTitle:@"Default (Spatial)"];
-    [fX264optDirectPredPopUp addItemWithTitle:@"None"];
-    [fX264optDirectPredPopUp addItemWithTitle:@"Spatial"];
-    [fX264optDirectPredPopUp addItemWithTitle:@"Temporal"];
-    [fX264optDirectPredPopUp addItemWithTitle:@"Automatic"];
-    
-    /*Alpha Deblock*/
-    [fX264optAlphaDeblockPopUp removeAllItems];
-    [fX264optAlphaDeblockPopUp addItemWithTitle:@"Default (0)"];
-    for (i=-6; i<7;i++)
-    {
-        [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];
-    
-    /* CABAC fX264opCabacSwitch */
-    [fX264optCabacSwitch setState:1];
-
-    /* Standardize the option string */
-    [self X264AdvancedOptionsStandardizeOptString: NULL];
-    /* Set Current GUI Settings based on newly standardized string */
-    [self X264AdvancedOptionsSetCurrentSettings: NULL];
-}
-
-- (IBAction) X264AdvancedOptionsStandardizeOptString: (id) sender
-{
-    /* Set widgets depending on the opt string in field */
-    NSString * thisOpt; // The separated option such as "bframes=3"
-    NSString * optName = @""; // The option name such as "bframes"
-    NSString * optValue = @"";// The option value such as "3"
-    NSString * changedOptString = @"";
-    NSArray *currentOptsArray;
-
-    /*First, we get an opt string to process */
-    NSString *currentOptString = [fDisplayX264Options stringValue];
-
-    /*verify there is an opt string to process */
-    NSRange currentOptRange = [currentOptString rangeOfString:@"="];
-    if (currentOptRange.location != NSNotFound)
-    {
-        /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
-        currentOptsArray = [currentOptString componentsSeparatedByString:@":"];
-
-        /*iterate through the array and get <opts> and <values*/
-        //NSEnumerator * enumerator = [currentOptsArray objectEnumerator];
-        int loopcounter;
-        int currentOptsArrayCount = [currentOptsArray count];
-        for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
-        {
-            thisOpt = [currentOptsArray objectAtIndex:loopcounter];
-            
-            NSRange splitOptRange = [thisOpt rangeOfString:@"="];
-            if (splitOptRange.location != NSNotFound)
-            {
-                optName = [thisOpt substringToIndex:splitOptRange.location];
-                optValue = [thisOpt substringFromIndex:splitOptRange.location + 1];
-                
-                /* Standardize the names here depending on whats in the string */
-                optName = [self X264AdvancedOptionsStandardizeOptNames:optName];
-                thisOpt = [NSString stringWithFormat:@"%@=%@",optName,optValue];       
-            }
-            else // No value given so we use a default of "1"
-            {
-                optName = thisOpt;
-                /* Standardize the names here depending on whats in the string */
-                optName = [self X264AdvancedOptionsStandardizeOptNames:optName];
-                thisOpt = [NSString stringWithFormat:@"%@=%d",optName,1];
-            }
-            
-            /* Construct New String for opts here */
-            if ([thisOpt isEqualToString:@""])
-            {
-                changedOptString = [NSString stringWithFormat:@"%@%@",changedOptString,thisOpt];
-            }
-            else
-            {
-                if ([changedOptString isEqualToString:@""])
-                {
-                    changedOptString = [NSString stringWithFormat:@"%@",thisOpt];
-                }
-                else
-                {
-                    changedOptString = [NSString stringWithFormat:@"%@:%@",changedOptString,thisOpt];
-                }
-            }
-        }
-    }
-    
-    /* Change the option string to reflect the new standardized option string */
-    [fDisplayX264Options setStringValue:[NSString stringWithFormat:changedOptString]];
-}
-
-- (NSString *) X264AdvancedOptionsStandardizeOptNames:(NSString *) cleanOptNameString
-{
-    if ([cleanOptNameString isEqualToString:@"ref"] || [cleanOptNameString isEqualToString:@"frameref"])
-    {
-        cleanOptNameString = @"ref";
-    }
-    
-    /*No Fast PSkip nofast_pskip*/
-    if ([cleanOptNameString isEqualToString:@"no-fast-pskip"] || [cleanOptNameString isEqualToString:@"no_fast_pskip"] || [cleanOptNameString isEqualToString:@"nofast_pskip"])
-    {
-        cleanOptNameString = @"no-fast-pskip";
-    }
-    
-    /*No Dict Decimate*/
-    if ([cleanOptNameString isEqualToString:@"no-dct-decimate"] || [cleanOptNameString isEqualToString:@"no_dct_decimate"] || [cleanOptNameString isEqualToString:@"nodct_decimate"])
-    {
-        cleanOptNameString = @"no-dct-decimate";
-    }
-    
-    /*Subme*/
-    if ([cleanOptNameString isEqualToString:@"subme"])
-    {
-        cleanOptNameString = @"subq";
-    }
-    
-    /*ME Range*/
-    if ([cleanOptNameString isEqualToString:@"me-range"] || [cleanOptNameString isEqualToString:@"me_range"])
-        cleanOptNameString = @"merange";
-    
-    /*WeightB*/
-    if ([cleanOptNameString isEqualToString:@"weight-b"] || [cleanOptNameString isEqualToString:@"weight_b"])
-    {
-        cleanOptNameString = @"weightb";
-    }
-    
-    /*BRDO*/
-    if ([cleanOptNameString isEqualToString:@"b-rdo"] || [cleanOptNameString isEqualToString:@"b_rdo"])
-    {
-        cleanOptNameString = @"brdo";
-    }
-    
-    /*B Pyramid*/
-    if ([cleanOptNameString isEqualToString:@"b_pyramid"])
-    {
-        cleanOptNameString = @"b-pyramid";
-    }
-    
-    /*Direct Prediction*/
-    if ([cleanOptNameString isEqualToString:@"direct-pred"] || [cleanOptNameString isEqualToString:@"direct_pred"])
-    {
-        cleanOptNameString = @"direct";
-    }
-    
-    /*Deblocking*/
-    if ([cleanOptNameString isEqualToString:@"filter"])
-    {
-        cleanOptNameString = @"deblock";
-    }
-
-    /*Analysis*/
-    if ([cleanOptNameString isEqualToString:@"partitions"])
-    {
-        cleanOptNameString = @"analyse";
-    }
-
-        
-    return cleanOptNameString; 
-}
-
-- (IBAction) X264AdvancedOptionsSetCurrentSettings: (id) sender
-{
-    /* Set widgets depending on the opt string in field */
-    NSString * thisOpt; // The separated option such as "bframes=3"
-    NSString * optName = @""; // The option name such as "bframes"
-    NSString * optValue = @"";// The option value such as "3"
-    NSArray *currentOptsArray;
-    
-    /*First, we get an opt string to process */
-    //NSString *currentOptString = @"bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:no-dct-decimate=1:trellis=2";
-    NSString *currentOptString = [fDisplayX264Options stringValue];
-    
-    /*verify there is an opt string to process */
-    NSRange currentOptRange = [currentOptString rangeOfString:@"="];
-    if (currentOptRange.location != NSNotFound)
-    {
-        /* lets clean the opt string here to standardize any names*/
-        /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
-        currentOptsArray = [currentOptString componentsSeparatedByString:@":"];
-        
-        /*iterate through the array and get <opts> and <values*/
-        //NSEnumerator * enumerator = [currentOptsArray objectEnumerator];
-        int loopcounter;
-        int currentOptsArrayCount = [currentOptsArray count];
-        
-        /*iterate through the array and get <opts> and <values*/
-        for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
-        {
-            thisOpt = [currentOptsArray objectAtIndex:loopcounter];
-            NSRange splitOptRange = [thisOpt rangeOfString:@"="];
-            
-            if (splitOptRange.location != NSNotFound)
-            {
-                optName = [thisOpt substringToIndex:splitOptRange.location];
-                optValue = [thisOpt substringFromIndex:splitOptRange.location + 1];
-           
-                /*Run through the available widgets for x264 opts and set them, as you add widgets, 
-                they need to be added here. This should be moved to its own method probably*/
-           
-                /*bframes NSPopUpButton*/
-                if ([optName isEqualToString:@"bframes"])
-                {
-                    [fX264optBframesPopUp selectItemAtIndex:[optValue intValue]+1];
-                }
-                /*ref NSPopUpButton*/
-                if ([optName isEqualToString:@"ref"])
-                {
-                   [fX264optRefPopUp selectItemAtIndex:[optValue intValue]+1];
-                }
-                /*No Fast PSkip NSPopUpButton*/
-                if ([optName isEqualToString:@"no-fast-pskip"])
-                {
-                    [fX264optNfpskipSwitch setState:[optValue intValue]];
-                }
-                /*No Dict Decimate NSPopUpButton*/
-                if ([optName isEqualToString:@"no-dct-decimate"])
-                {
-                    [fX264optNodctdcmtSwitch setState:[optValue intValue]];
-                }
-                /*Sub Me NSPopUpButton*/
-                if ([optName isEqualToString:@"subq"])
-                {
-                    [fX264optSubmePopUp selectItemAtIndex:[optValue intValue]+1];
-                }
-                /*Trellis NSPopUpButton*/
-                if ([optName isEqualToString:@"trellis"])
-                {
-                    [fX264optTrellisPopUp selectItemAtIndex:[optValue intValue]+1];
-                }
-                /*Mixed Refs NSButton*/
-                if ([optName isEqualToString:@"mixed-refs"])
-                {
-                    [fX264optMixedRefsSwitch setState:[optValue intValue]];
-                }
-                /*Motion Estimation NSPopUpButton*/
-                if ([optName isEqualToString:@"me"])
-                {
-                    if ([optValue isEqualToString:@"dia"])
-                        [fX264optMotionEstPopUp selectItemAtIndex:1];
-                    else if ([optValue isEqualToString:@"hex"])
-                        [fX264optMotionEstPopUp selectItemAtIndex:2];
-                    else if ([optValue isEqualToString:@"umh"])
-                        [fX264optMotionEstPopUp selectItemAtIndex:3];
-                    else if ([optValue isEqualToString:@"esa"])
-                        [fX264optMotionEstPopUp selectItemAtIndex:4];                        
-                }
-                /*ME Range NSPopUpButton*/
-                if ([optName isEqualToString:@"merange"])
-                {
-                    [fX264optMERangePopUp selectItemAtIndex:[optValue intValue]-3];
-                }
-                /*Weighted B-Frames NSPopUpButton*/
-                if ([optName isEqualToString:@"weightb"])
-                {
-                    [fX264optWeightBSwitch setState:[optValue intValue]];
-                }
-                /*BRDO NSPopUpButton*/
-                if ([optName isEqualToString:@"brdo"])
-                {
-                    [fX264optBRDOSwitch setState:[optValue intValue]];
-                }
-                /*B Pyramid NSPopUpButton*/
-                if ([optName isEqualToString:@"b-pyramid"])
-                {
-                    [fX264optBPyramidSwitch setState:[optValue intValue]];
-                }
-                /*Bidirectional Motion Estimation Refinement NSPopUpButton*/
-                if ([optName isEqualToString:@"bime"])
-                {
-                    [fX264optBiMESwitch setState:[optValue intValue]];
-                }
-                /*Direct B-frame Prediction NSPopUpButton*/
-                if ([optName isEqualToString:@"direct"])
-                {
-                    if ([optValue isEqualToString:@"none"])
-                        [fX264optDirectPredPopUp selectItemAtIndex:1];
-                    else if ([optValue isEqualToString:@"spatial"])
-                        [fX264optDirectPredPopUp selectItemAtIndex:2];
-                    else if ([optValue isEqualToString:@"temporal"])
-                        [fX264optDirectPredPopUp selectItemAtIndex:3];
-                    else if ([optValue isEqualToString:@"auto"])
-                        [fX264optDirectPredPopUp selectItemAtIndex:4];                        
-                }
-                /*Deblocking NSPopUpButtons*/
-                if ([optName isEqualToString:@"deblock"])
-                {
-                    NSString * alphaDeblock = @"";
-                    NSString * betaDeblock = @"";
-                
-                    NSRange splitDeblock = [optValue rangeOfString:@","];
-                    alphaDeblock = [optValue substringToIndex:splitDeblock.location];
-                    betaDeblock = [optValue substringFromIndex:splitDeblock.location + 1];
-                    
-                    if ([alphaDeblock isEqualToString:@"0"] && [betaDeblock isEqualToString:@"0"])
-                    {
-                        [fX264optAlphaDeblockPopUp selectItemAtIndex:0];                        
-                        [fX264optBetaDeblockPopUp selectItemAtIndex:0];                               
-                    }
-                    else
-                    {
-                        if (![alphaDeblock isEqualToString:@"0"])
-                        {
-                            [fX264optAlphaDeblockPopUp selectItemAtIndex:[alphaDeblock intValue]+7];
-                        }
-                        else
-                        {
-                            [fX264optAlphaDeblockPopUp selectItemAtIndex:7];                        
-                        }
-                        
-                        if (![betaDeblock isEqualToString:@"0"])
-                        {
-                            [fX264optBetaDeblockPopUp selectItemAtIndex:[betaDeblock intValue]+7];
-                        }
-                        else
-                        {
-                            [fX264optBetaDeblockPopUp selectItemAtIndex:7];                        
-                        }
-                    }
-                }
-                /* Analysis NSPopUpButton */
-                if ([optName isEqualToString:@"analyse"])
-                {
-                    if ([optValue isEqualToString:@"p8x8,b8x8,i8x8,i4x4"])
-                    {
-                        [fX264optAnalysePopUp selectItemAtIndex:0];
-                    }
-                    if ([optValue isEqualToString:@"none"])
-                    {
-                        [fX264optAnalysePopUp selectItemAtIndex:1];
-                    }
-                    if ([optValue isEqualToString:@"all"])
-                    {
-                        [fX264optAnalysePopUp selectItemAtIndex:2];
-                    }
-                }
-                /* 8x8 DCT NSButton */
-                if ([optName isEqualToString:@"8x8dct"])
-                {
-                    [fX264opt8x8dctSwitch setState:[optValue intValue]];
-                }
-                /* CABAC NSButton */
-                if ([optName isEqualToString:@"cabac"])
-                {
-                    [fX264optCabacSwitch setState:[optValue intValue]];
-                }                                                                 
-            }
-        }
-    }
-}
-
-- (IBAction) X264AdvancedOptionsChanged: (id) sender
-{
-    /*Determine which outlet is being used and set optName to process accordingly */
-    NSString * optNameToChange = @""; // The option name such as "bframes"
-
-    if (sender == fX264optBframesPopUp)
-    {
-        optNameToChange = @"bframes";
-    }
-    if (sender == fX264optRefPopUp)
-    {
-        optNameToChange = @"ref";
-    }
-    if (sender == fX264optNfpskipSwitch)
-    {
-        optNameToChange = @"no-fast-pskip";
-    }
-    if (sender == fX264optNodctdcmtSwitch)
-    {
-        optNameToChange = @"no-dct-decimate";
-    }
-    if (sender == fX264optSubmePopUp)
-    {
-        optNameToChange = @"subq";
-    }
-    if (sender == fX264optTrellisPopUp)
-    {
-        optNameToChange = @"trellis";
-    }
-    if (sender == fX264optMixedRefsSwitch)
-    {
-        optNameToChange = @"mixed-refs";
-    }
-    if (sender == fX264optMotionEstPopUp)
-    {
-        optNameToChange = @"me";
-    }
-    if (sender == fX264optMERangePopUp)
-    {
-        optNameToChange = @"merange";
-    }
-    if (sender == fX264optWeightBSwitch)
-    {
-        optNameToChange = @"weightb";
-    }
-    if (sender == fX264optBRDOSwitch)
-    {
-        optNameToChange = @"brdo";
-    }
-    if (sender == fX264optBPyramidSwitch)
-    {
-        optNameToChange = @"b-pyramid";
-    }
-    if (sender == fX264optBiMESwitch)
-    {
-        optNameToChange = @"bime";
-    }
-    if (sender == fX264optDirectPredPopUp)
-    {
-        optNameToChange = @"direct";
-    }
-    if (sender == fX264optAlphaDeblockPopUp)
-    {
-        optNameToChange = @"deblock";
-    }
-    if (sender == fX264optBetaDeblockPopUp)
-    {
-        optNameToChange = @"deblock";
-    }        
-    if (sender == fX264optAnalysePopUp)
-    {
-        optNameToChange = @"analyse";
-    }
-    if (sender == fX264opt8x8dctSwitch)
-    {
-        optNameToChange = @"8x8dct";
-    }
-    if (sender == fX264optCabacSwitch)
-    {
-        optNameToChange = @"cabac";
-    }
-    
-    /* Set widgets depending on the opt string in field */
-    NSString * thisOpt; // The separated option such as "bframes=3"
-    NSString * optName = @""; // The option name such as "bframes"
-    NSString * optValue = @"";// The option value such as "3"
-    NSArray *currentOptsArray;
-
-    /*First, we get an opt string to process */
-    //EXAMPLE: NSString *currentOptString = @"bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:no-dct-decimate=1:trellis=2";
-    NSString *currentOptString = [fDisplayX264Options stringValue];
-
-    /*verify there is an occurrence of the opt specified by the sender to change */
-    /*take care of any multi-value opt names here. This is extremely kludgy, but test for functionality
-    and worry about pretty later */
-       
-       /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after
-       the first character of the opt string (hence the ":") */
-       NSString *checkOptNameToChange = [NSString stringWithFormat:@":%@=",optNameToChange];
-    NSRange currentOptRange = [currentOptString rangeOfString:checkOptNameToChange];
-       /*Then we create a pattern to check for "<beginning of line>"optNameToChange"=" to modify the option to
-       see if the name falls at the beginning of the line, where we would not have the ":" as a pattern to test against*/
-       NSString *checkOptNameToChangeBeginning = [NSString stringWithFormat:@"%@=",optNameToChange];
-    NSRange currentOptRangeBeginning = [currentOptString rangeOfString:checkOptNameToChangeBeginning];
-    if (currentOptRange.location != NSNotFound || currentOptRangeBeginning.location == 0)
-    {
-        /* Create new empty opt string*/
-        NSString *changedOptString = @"";
-
-        /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
-        currentOptsArray = [currentOptString componentsSeparatedByString:@":"];
-
-        /*iterate through the array and get <opts> and <values*/
-        int loopcounter;
-        int currentOptsArrayCount = [currentOptsArray count];
-        for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
-        {
-            thisOpt = [currentOptsArray objectAtIndex:loopcounter];
-            NSRange splitOptRange = [thisOpt rangeOfString:@"="];
-
-            if (splitOptRange.location != NSNotFound)
-            {
-                optName = [thisOpt substringToIndex:splitOptRange.location];
-                optValue = [thisOpt substringFromIndex:splitOptRange.location + 1];
-                
-                /*Run through the available widgets for x264 opts and set them, as you add widgets, 
-                they need to be added here. This should be moved to its own method probably*/
-                
-                /*If the optNameToChange is found, appropriately change the value or delete it if
-                "Unspecified" is set.*/
-                if ([optName isEqualToString:optNameToChange])
-                {
-                    if ([optNameToChange isEqualToString:@"deblock"])
-                    {
-                        if ((([fX264optAlphaDeblockPopUp indexOfSelectedItem] == 0) || ([fX264optAlphaDeblockPopUp indexOfSelectedItem] == 7)) && (([fX264optBetaDeblockPopUp indexOfSelectedItem] == 0) || ([fX264optBetaDeblockPopUp indexOfSelectedItem] == 7)))
-                        {
-                            thisOpt = @"";                                
-                        }
-                        else
-                        {
-                            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"] )
-                    {
-                        if ([sender state] == 0)
-                        {
-                            thisOpt = @"";
-                        }
-                        else
-                        {
-                            thisOpt = [NSString stringWithFormat:@"%@=%d",optName,1];
-                        }
-                    }
-                    else if ([optNameToChange isEqualToString:@"cabac"])
-                    {
-                        if ([sender state] == 1)
-                        {
-                            thisOpt = @"";
-                        }
-                        else
-                        {
-                            thisOpt = [NSString stringWithFormat:@"%@=%d",optName,0];
-                        }
-                    }                                        
-                    else if (([sender indexOfSelectedItem] == 0) && (sender != fX264optAlphaDeblockPopUp) && (sender != fX264optBetaDeblockPopUp) ) // means that "unspecified" is chosen, lets then remove it from the string
-                    {
-                        thisOpt = @"";
-                    }
-                    else if ([optNameToChange isEqualToString:@"me"])
-                    {
-                        switch ([sender indexOfSelectedItem])
-                        {   
-                            case 1:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"dia"];
-                               break;
-                            case 2:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"hex"];
-                               break;
-                            case 3:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"umh"];
-                               break;
-                            case 4:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"esa"];
-                               break;
-                            
-                            default:
-                                break;
-                        }
-                    }
-                    else if ([optNameToChange isEqualToString:@"direct"])
-                    {
-                        switch ([sender indexOfSelectedItem])
-                        {   
-                            case 1:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"none"];
-                               break;
-                            case 2:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"spatial"];
-                               break;
-                            case 3:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"temporal"];
-                               break;
-                            case 4:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"auto"];
-                               break;
-                            
-                            default:
-                                break;
-                        }
-                    }
-                    else if ([optNameToChange isEqualToString:@"analyse"])
-                    {
-                        switch ([sender indexOfSelectedItem])
-                        {   
-                            case 1:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"none"];
-                               break;
-                            case 2:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"all"];
-                               break;
-                            
-                            default:
-                                break;
-                        }
-                    }
-                    else if ([optNameToChange isEqualToString:@"merange"])
-                    {
-                        thisOpt = [NSString stringWithFormat:@"%@=%d",optName,[sender indexOfSelectedItem]+3];
-                    }
-                    else // we have a valid value to change, so change it
-                    {
-                        thisOpt = [NSString stringWithFormat:@"%@=%d",optName,[sender indexOfSelectedItem]-1];
-                    }
-                }
-            }
-
-            /* Construct New String for opts here */
-            if ([thisOpt isEqualToString:@""])
-            {
-                changedOptString = [NSString stringWithFormat:@"%@%@",changedOptString,thisOpt];
-            }
-            else
-            {
-                if ([changedOptString isEqualToString:@""])
-                {
-                    changedOptString = [NSString stringWithFormat:@"%@",thisOpt];
-                }
-                else
-                {
-                    changedOptString = [NSString stringWithFormat:@"%@:%@",changedOptString,thisOpt];
-                }
-            }
-        }
-
-        /* Change the option string to reflect the new mod settings */
-        [fDisplayX264Options setStringValue:[NSString stringWithFormat:changedOptString]];     
-    }
-    else // if none exists, add it to the string
-    {
-        if ([[fDisplayX264Options stringValue] isEqualToString: @""])
-        {
-            if ([optNameToChange isEqualToString:@"me"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"dia"]]];
-                        break;
-               
-                    case 2:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"hex"]]];
-                        break;
-               
-                   case 3:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"umh"]]];
-                        break;
-               
-                   case 4:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"esa"]]];
-                        break;
-                   
-                   default:
-                        break;
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"direct"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"none"]]];
-                        break;
-               
-                    case 2:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"spatial"]]];
-                        break;
-               
-                   case 3:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"temporal"]]];
-                        break;
-               
-                   case 4:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"auto"]]];
-                        break;
-                   
-                   default:
-                        break;
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"analyse"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"none"]]];
-                        break;
-               
-                    case 2:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"all"]]];
-                        break;
-                   
-                   default:
-                        break;
-                }
-            }
-
-            else if ([optNameToChange isEqualToString:@"merange"])
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                    [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender indexOfSelectedItem]+3]]];
-            }
-            else if ([optNameToChange isEqualToString:@"deblock"])
-            {
-                [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"] )            {
-                if ([sender state] == 0)
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@""]];                    
-                }
-                else
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                        [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender state]]]];
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"cabac"])
-            {
-                if ([sender state] == 1)
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@""]];                                        
-                }
-                else
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                        [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender state]]]];                    
-                }
-            }            
-            else
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                    [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender indexOfSelectedItem]-1]]];
-            }
-        }
-        else
-        {
-            if ([optNameToChange isEqualToString:@"me"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"dia"]]];
-                         break;
-
-                    case 2:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"hex"]]];
-                         break;
-
-                    case 3:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"umh"]]];
-                         break;
-
-                    case 4:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"esa"]]];
-                         break;
-
-                    default:
-                         break;
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"direct"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"none"]]];
-                         break;
-
-                    case 2:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"spatial"]]];
-                         break;
-
-                    case 3:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"temporal"]]];
-                         break;
-
-                    case 4:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"auto"]]];
-                         break;
-
-                    default:
-                         break;
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"analyse"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"none"]]];
-                         break;
-
-                    case 2:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"all"]]];
-                         break;
-
-                    default:
-                         break;
-                }
-            }
-
-            else if ([optNameToChange isEqualToString:@"merange"])
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]], 
-                    [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender indexOfSelectedItem]+3]]];
-            }
-            else if ([optNameToChange isEqualToString:@"deblock"])
-            {
-                [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"] )
-            {
-                if ([sender state] == 0)
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]]]];                    
-                }
-                else
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]], 
-                        [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender state]]]];                
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"cabac"])
-            {
-                if ([sender state] == 1)
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]]]];                    
-                }
-                else
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]], 
-                        [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender state]]]];
-                }
-            }
-            else
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]], 
-                    [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender indexOfSelectedItem]-1]]];
-            }
-        }
-    }
-
-    /* We now need to reset the opt widgets since we changed some stuff */             
-    [self X264AdvancedOptionsSet:NULL];                
-}
-
-
    /* We use this method to recreate new, updated factory
    presets */
 - (IBAction)addFactoryPresets:(id)sender
@@ -3773,46 +2745,40 @@ the user is using "Custom" settings by determining the sender*/
 - (IBAction) showAddPresetPanel: (id) sender
 {
     /* Deselect the currently selected Preset if there is one*/
-               [tableView deselectRow:[tableView selectedRow]];
+    [tableView deselectRow:[tableView selectedRow]];
 
-       /* Populate the preset picture settings popup here */
-       [fPresetNewPicSettingsPopUp removeAllItems];
-       [fPresetNewPicSettingsPopUp addItemWithTitle:@"None"];
-       [fPresetNewPicSettingsPopUp addItemWithTitle:@"Current"];
-       [fPresetNewPicSettingsPopUp addItemWithTitle:@"Source Maximum (post source scan)"];
-       [fPresetNewPicSettingsPopUp selectItemAtIndex: 0];      
+    /* Populate the preset picture settings popup here */
+    [fPresetNewPicSettingsPopUp removeAllItems];
+    [fPresetNewPicSettingsPopUp addItemWithTitle:@"None"];
+    [fPresetNewPicSettingsPopUp addItemWithTitle:@"Current"];
+    [fPresetNewPicSettingsPopUp addItemWithTitle:@"Source Maximum (post source scan)"];
+    [fPresetNewPicSettingsPopUp selectItemAtIndex: 0]; 
        
-               /* Erase info from the input fields fPresetNewDesc*/
+    /* Erase info from the input fields fPresetNewDesc*/
        [fPresetNewName setStringValue: @""];
        [fPresetNewDesc setStringValue: @""];
        /* Show the panel */
-       [NSApp beginSheet: fAddPresetPanel modalForWindow: fWindow
-        modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
-    [NSApp runModalForWindow: fAddPresetPanel];
-    [NSApp endSheet: fAddPresetPanel];
-    [fAddPresetPanel orderOut: self];
-       
-       
+       [NSApp beginSheet: fAddPresetPanel modalForWindow: fWindow modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
 }
+
 - (IBAction) closeAddPresetPanel: (id) sender
 {
-       [NSApp stopModal];
+    [NSApp endSheet: fAddPresetPanel];
+    [fAddPresetPanel orderOut: self];
 }
 
-
 - (IBAction)addUserPreset:(id)sender
 {
-
-    /* Here we create a custom user preset */
-       [UserPresets addObject:[self createPreset]];
-       /* Erase info from the input fields */
-       [fPresetNewName setStringValue: @""];
-       [fPresetNewDesc setStringValue: @""];
-       /* We stop the modal window for the new preset */
-       [NSApp stopModal];
-    [self addPreset];
-       
-
+    if (![[fPresetNewName stringValue] length])
+            NSRunAlertPanel(@"Warning!", @"You need to insert a name for the preset.", @"OK", nil , nil);
+    else
+    {
+        /* Here we create a custom user preset */
+        [UserPresets addObject:[self createPreset]];
+        [self addPreset];
+        
+        [self closeAddPresetPanel:NULL];
+    }
 }
 - (void)addPreset
 {
@@ -3867,7 +2833,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Video encoder */
        [preset setObject:[fVidEncoderPopUp titleOfSelectedItem] forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:[fDisplayX264Options stringValue] forKey:@"x264Option"];
+       [preset setObject:[fAdvancedOptions optionsString] forKey:@"x264Option"];
        
        [preset setObject:[NSNumber numberWithInt:[fVidQualityMatrix selectedRow]] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
@@ -3890,13 +2856,13 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:fTitle->job->width] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:fTitle->job->height] forKey:@"PictureHeight"];
        [preset setObject:[NSNumber numberWithInt:fTitle->job->keep_ratio] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:[fPicSettingDeinterlace intValue]] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:[fPictureController deinterlace]] forKey:@"PictureDeinterlace"];
        [preset setObject:[NSNumber numberWithInt:fTitle->job->pixel_ratio] forKey:@"PicturePAR"];
-       [preset setObject:[fPicSettingDetelecine stringValue] forKey:@"PictureDetelecine"];
-       [preset setObject:[NSNumber numberWithInt:[fPicSettingDenoise intValue]] forKey:@"PictureDenoise"]; 
+       [preset setObject:[NSNumber numberWithInt:[fPictureController detelecine]] forKey:@"PictureDetelecine"];
+       [preset setObject:[NSNumber numberWithInt:[fPictureController denoise]] forKey:@"PictureDenoise"]; 
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:[fPicSettingAutoCrop intValue]] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:[fPictureController autoCrop]] forKey:@"PictureAutoCrop"];
 
        [preset setObject:[NSNumber numberWithInt:job->crop[0]] forKey:@"PictureTopCrop"];
     [preset setObject:[NSNumber numberWithInt:job->crop[1]] forKey:@"PictureBottomCrop"];
@@ -5224,9 +4190,7 @@ the user is using "Custom" settings by determining the sender*/
                        
                        /* We can show the preset options here in the gui if we want to
                                so we check to see it the user has specified it in the prefs */
-                       [fDisplayX264Options setStringValue: [NSString stringWithFormat:[chosenPreset valueForKey:@"x264Option"]]];
-                       
-                       [self X264AdvancedOptionsSet:NULL];
+                       [fAdvancedOptions setOptions: [NSString stringWithFormat:[chosenPreset valueForKey:@"x264Option"]]];
                        
                        /* Lets run through the following functions to get variables set there */
                        [self encoderPopUpChanged: NULL];
@@ -5300,22 +4264,21 @@ the user is using "Custom" settings by determining the sender*/
                                                }
                                        }
                                        job->pixel_ratio = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
-                                       [fPicSettingDeinterlace setStringValue: [NSString stringWithFormat: @"%d",[[chosenPreset objectForKey:@"PictureDeinterlace"]  intValue]]];
+                    [fPictureController setDeinterlace:[[chosenPreset objectForKey:@"PictureDeinterlace"] intValue]];
                                        
                                        if ([chosenPreset objectForKey:@"PictureDetelecine"])
                                        {
-                                       [fPicSettingDetelecine setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PictureDetelecine"]]];
+                        [fPictureController setDetelecine:[[chosenPreset objectForKey:@"PictureDetelecine"] intValue]];
                                        }
                                        if ([chosenPreset objectForKey:@"PictureDenoise"])
                                        {
-                                       [fPicSettingDenoise setStringValue: [NSString stringWithFormat: @"%d",[[chosenPreset objectForKey:@"PictureDenoise"]  intValue]]];
+                        [fPictureController setDenoise:[[chosenPreset objectForKey:@"PictureDenoise"] intValue]];
                                        }
                                        /* If Cropping is set to custom, then recall all four crop values from
                                                when the preset was created and apply them */
                                        if ([[chosenPreset objectForKey:@"PictureAutoCrop"]  intValue] == 0)
                                        {
-                                               [fPicSettingAutoCrop setStringValue: [NSString stringWithFormat:
-                                                       @"%d", 0]];
+                        [fPictureController setAutoCrop:NO];
                                                
                                                /* Here we use the custom crop values saved at the time the preset was saved */
                                                job->crop[0] = [[chosenPreset objectForKey:@"PictureTopCrop"]  intValue];
@@ -5326,9 +4289,8 @@ the user is using "Custom" settings by determining the sender*/
                                        }
                                        else /* if auto crop has been saved in preset, set to auto and use post scan auto crop */
                                        {
-                                               [fPicSettingAutoCrop setStringValue: [NSString stringWithFormat:
-                                                       @"%d", 1]];
-                                               /* Here we use the auto crop values determined right after scan */
+                        [fPictureController setAutoCrop:YES];
+                        /* Here we use the auto crop values determined right after scan */
                                                job->crop[0] = AutoCropTop;
                                                job->crop[1] = AutoCropBottom;
                                                job->crop[2] = AutoCropLeft;
@@ -5419,12 +4381,12 @@ show the built in presets in a blue font. */
      /* if there is a description for the preset, we show it in the tooltip */
         if ([[UserPresets objectAtIndex:rowIndex] valueForKey:@"PresetDescription"])
         {
-        loc_tip = [NSString stringWithFormat: @"%@",[[UserPresets objectAtIndex:rowIndex] valueForKey:@"PresetDescription"]];
-        return (loc_tip);
+        loc_tip = [NSString stringWithFormat: @"%@",[[UserPresets objectAtIndex:rowIndex] valueForKey:@"PresetDescription"]];
+        return (loc_tip);
         }
         else
         {
-        loc_tip = @"No description available";
+        loc_tip = @"No description available";
         }
         return (loc_tip);
 
@@ -5466,7 +4428,6 @@ id theRecord, theValue;
     [self savePreset];
 }
 
-
 - (void)savePreset
 {
     [UserPresets writeToFile:UserPresetsFile atomically:YES];
@@ -5475,8 +4436,6 @@ id theRecord, theValue;
 
 }
 
-
-
 - (void) controlTextDidBeginEditing: (NSNotification *) notification
 {
     [self calculateBitrate: NULL];