OSDN Git Service

MacGui: Fixed a warning.
[handbrake-jp/handbrake-jp-git.git] / macosx / Controller.mm
index 4bc0ddc..8943fbb 100644 (file)
@@ -4,17 +4,11 @@
    Homepage: <http://handbrake.fr/>.
    It may be used under the terms of the GNU General Public License. */
 
-#include "Controller.h"
-#include "a52dec/a52.h"
+#import "Controller.h"
 #import "HBOutputPanelController.h"
 #import "HBPreferencesController.h"
-/* Added to integrate scanning into HBController */
-#include <IOKit/IOKitLib.h>
-#include <IOKit/storage/IOMedia.h>
-#include <IOKit/storage/IODVDMedia.h>
-#include "HBDVDDetector.h"
-#include "dvdread/dvd_reader.h"
-#include "HBPresets.h"
+#import "HBDVDDetector.h"
+#import "HBPresets.h"
 
 #define DragDropSimplePboardType       @"MyCustomOutlineViewPboardType"
 
@@ -80,37 +74,37 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 {
     /* Init libhb with check for updates libhb style set to "0" so its ignored and lets sparkle take care of it */
     fHandle = hb_init(HB_DEBUG_ALL, 0);
-    
+
        // Set the Growl Delegate
-    [GrowlApplicationBridge setGrowlDelegate: self];    
+    [GrowlApplicationBridge setGrowlDelegate: self];
     /* Init others controllers */
     [fPictureController SetHandle: fHandle];
     [fQueueController   setHandle: fHandle];
     [fQueueController   setHBController: self];
-       
+
     fChapterTitlesDelegate = [[ChapterTitles alloc] init];
     [fChapterTable setDataSource:fChapterTitlesDelegate];
     [fChapterTable setDelegate:fChapterTitlesDelegate];
-    
+
     /* Call UpdateUI every 1/2 sec */
-    [[NSRunLoop currentRunLoop] addTimer: [NSTimer
-                                           scheduledTimerWithTimeInterval: 0.5 target: self
-                                           selector: @selector( updateUI: ) userInfo: NULL repeats: YES]
-                                 forMode: NSEventTrackingRunLoopMode];
-    
+    [[NSRunLoop currentRunLoop] addTimer:[NSTimer
+                                          scheduledTimerWithTimeInterval:0.5 target:self
+                                          selector:@selector(updateUI:) userInfo:nil repeats:YES]
+                                 forMode:NSEventTrackingRunLoopMode];
+
     // Open debug output window now if it was visible when HB was closed
     if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OutputPanelIsOpen"])
         [self showDebugOutputPanel:nil];
-    
+
     // Open queue window now if it was visible when HB was closed
     if ([[NSUserDefaults standardUserDefaults] boolForKey:@"QueueWindowIsOpen"])
         [self showQueueWindow:nil];
-    
+
        [self openMainWindow:nil];
-    
+
     /* Show Browse Sources Window ASAP */
-    [self performSelectorOnMainThread: @selector(browseSources:)
-                           withObject: NULL waitUntilDone: NO];
+    [self performSelectorOnMainThread:@selector(browseSources:)
+                           withObject:nil waitUntilDone:NO];
 }
 
 - (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication *) app
@@ -176,12 +170,12 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     /* Initialize currentScanCount so HB can use it to
                evaluate successive scans */
        currentScanCount = 0;
-       
+
     /* Init UserPresets .plist */
        [self loadPresets];
-               
+
        fRipIndicatorShown = NO;  // initially out of view in the nib
-       
+
        /* Show/Dont Show Presets drawer upon launch based
                on user preference DefaultPresetsDrawerShow*/
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultPresetsDrawerShow"] > 0)
@@ -207,36 +201,36 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     menuItem = [[fDstFormatPopUp menu] addItemWithTitle:@"OGM file" action: NULL keyEquivalent: @""];
     [menuItem setTag: HB_MUX_OGM];
     [fDstFormatPopUp selectItemAtIndex: 0];
-       
-    [self formatPopUpChanged: NULL];
-    
-       /* We enable the create chapters checkbox here since we are .mp4 */     
+
+    [self formatPopUpChanged:nil];
+
+       /* We enable the create chapters checkbox here since we are .mp4 */
        [fCreateChapterMarkers setEnabled: YES];
        if ([fDstFormatPopUp indexOfSelectedItem] == 0 && [[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultChapterMarkers"] > 0)
        {
                [fCreateChapterMarkers setState: NSOnState];
        }
-       
-       
-       
-       
+
+
+
+
     [fDstFile2Field setStringValue: [NSString stringWithFormat:
         @"%@/Desktop/Movie.mp4", NSHomeDirectory()]];
-       
+
     /* Video encoder */
     [fVidEncoderPopUp removeAllItems];
     [fVidEncoderPopUp addItemWithTitle: @"FFmpeg"];
     [fVidEncoderPopUp addItemWithTitle: @"XviD"];
-       
-    
-       
+
+
+
     /* Video quality */
     [fVidTargetSizeField setIntValue: 700];
        [fVidBitrateField    setIntValue: 1000];
-       
+
     [fVidQualityMatrix   selectCell: fVidBitrateCell];
-    [self videoMatrixChanged: NULL];
-       
+    [self videoMatrixChanged:nil];
+
     /* Video framerate */
     [fVidRatePopUp removeAllItems];
        [fVidRatePopUp addItemWithTitle: NSLocalizedString( @"Same as source", @"" )];
@@ -289,22 +283,19 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        
     /* Bottom */
     [fStatusField setStringValue: @""];
-       
+
     [self enableUI: NO];
        [self setupToolbar];
-       
-       [fPresetsActionButton setMenu:fPresetsActionMenu];
-       
+
        /* We disable the Turbo 1st pass checkbox since we are not x264 */
        [fVidTurboPassCheck setEnabled: NO];
        [fVidTurboPassCheck setState: NSOffState];
-       
-       
+
+
        /* lets get our default prefs here */
-       [self getDefaultPresets: NULL];
+       [self getDefaultPresets:nil];
        /* lets initialize the current successful scancount here to 0 */
        currentSuccessfulScanCount = 0;
-    
 }
 
 - (void) enableUI: (bool) b
@@ -350,22 +341,23 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         [controls[i] setEnabled: b];
 
     }
-       
+
        if (b) {
 
         /* if we're enabling the interface, check if the audio mixdown controls need to be enabled or not */
         /* these will have been enabled by the mass control enablement above anyway, so we're sense-checking it here */
-        [self setEnabledStateOfAudioMixdownControls: NULL];
+        [self setEnabledStateOfAudioMixdownControls:nil];
         /* we also call calculatePictureSizing here to sense check if we already have vfr selected */
-        [self calculatePictureSizing: NULL];
-       
+        [self calculatePictureSizing:nil];
+        [self shouldEnableHttpMp4CheckBox: nil];
+
        } else {
 
                [fPresetsOutlineView setEnabled: NO];
-       
+
        }
 
-    [self videoMatrixChanged: NULL];
+    [self videoMatrixChanged:nil];
     [fAdvancedOptions enableUI:b];
 }
 
@@ -456,32 +448,29 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 
 - (void) updateUI: (NSTimer *) timer
 {
-
     hb_list_t  * list;
-    list = hb_get_titles( fHandle );   
+    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 */
        int checkScanCount = hb_get_scancount( fHandle );
-       if (checkScanCount > currentScanCount)
+       if( checkScanCount > currentScanCount )
        {
-               
                currentScanCount = checkScanCount;
         [fScanIndicator setIndeterminate: NO];
         [fScanIndicator setDoubleValue: 0.0];
         [fScanIndicator setHidden: YES];
-               [self showNewScan: NULL];
+               [self showNewScan:nil];
        }
-       
+
     hb_state_t s;
     hb_get_state( fHandle, &s );
-       
-       
+
     switch( s.state )
     {
         case HB_STATE_IDLE:
                break;
-#define p s.param.scanning                     
+#define p s.param.scanning
         case HB_STATE_SCANNING:
                {
             [fSrcDVD2Field setStringValue: [NSString stringWithFormat:
@@ -499,7 +488,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             [fScanIndicator setIndeterminate: NO];
             [fScanIndicator setDoubleValue: 0.0];
             [fScanIndicator setHidden: YES];
-                       [self showNewScan: NULL];
+                       [self showNewScan:nil];
             [[fWindow toolbar] validateVisibleItems];
                        break;
         }
@@ -515,28 +504,29 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                                nasty but working cocoa solution */
                        /* Update text field */
                        string = [NSMutableString stringWithFormat: NSLocalizedString( @"Encoding: task %d of %d, %.2f %%", @"" ), p.job_cur, p.job_count, 100.0 * p.progress];
-            
+
                        if( p.seconds > -1 )
             {
                 [string appendFormat:
                     NSLocalizedString( @" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)", @"" ),
                     p.rate_cur, p.rate_avg, p.hours, p.minutes, p.seconds];
             }
+
             [fStatusField setStringValue: string];
-                       
+
             /* Update slider */
                        progress_total = ( p.progress + p.job_cur - 1 ) / p.job_count;
             [fRipIndicator setIndeterminate: NO];
             [fRipIndicator setDoubleValue: 100.0 * progress_total];
-                       
+
             // If progress bar hasn't been revealed at the bottom of the window, do
             // that now. This code used to be in doRip. I moved it to here to handle
             // the case where hb_start is called by HBQueueController and not from
             // HBController.
-            if (!fRipIndicatorShown)
+            if( !fRipIndicatorShown )
             {
                 NSRect frame = [fWindow frame];
-                if (frame.size.width <= 591)
+                if( frame.size.width <= 591 )
                     frame.size.width = 591;
                 frame.size.height += 36;
                 frame.origin.y -= 36;
@@ -549,47 +539,43 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 
             /* Update dock icon */
             [self UpdateDockIcon: progress_total];
-                       
+
             // Has current job changed? That means the queue has probably changed as
                        // well so update it
             [fQueueController libhbStateChanged: s];
-            
+
             break;
         }
 #undef p
-                       
+
 #define p s.param.muxing
         case HB_STATE_MUXING:
         {
-            NSMutableString * string;
-                       
             /* Update text field */
-            string = [NSMutableString stringWithFormat:
-                NSLocalizedString( @"Muxing...", @"" )];
-            [fStatusField setStringValue: string];
-                       
+            [fStatusField setStringValue: NSLocalizedString( @"Muxing...", @"" )];
+
             /* Update slider */
             [fRipIndicator setIndeterminate: YES];
             [fRipIndicator startAnimation: nil];
-                       
+
             /* Update dock icon */
             [self UpdateDockIcon: 1.0];
-                       
+
                        // Pass along the info to HBQueueController
             [fQueueController libhbStateChanged: s];
-                       
+
             break;
         }
 #undef p
-                       
+
         case HB_STATE_PAUSED:
                    [fStatusField setStringValue: NSLocalizedString( @"Paused", @"" )];
-            
+
                        // Pass along the info to HBQueueController
             [fQueueController libhbStateChanged: s];
 
             break;
-                       
+
         case HB_STATE_WORKDONE:
         {
             // HB_STATE_WORKDONE happpens as a result of libhb finishing all its jobs
@@ -609,80 +595,66 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             /* Restore dock icon */
             [self UpdateDockIcon: -1.0];
 
-            if (fRipIndicatorShown)
+            if( fRipIndicatorShown )
             {
                 NSRect frame = [fWindow frame];
-                if (frame.size.width <= 591)
+                if( frame.size.width <= 591 )
                                    frame.size.width = 591;
                 frame.size.height += -36;
                 frame.origin.y -= -36;
                 [fWindow setFrame:frame display:YES animate:YES];
                                fRipIndicatorShown = NO;
                        }
-                       
+
                        // Pass along the info to HBQueueController
             [fQueueController libhbStateChanged: s];
-                       
+
             /* Check to see if the encode state has not been cancelled
                                to determine if we should check for encode done notifications */
-                       if (fEncodeState != 2)                  {
-                               /* If Alert Window or Window and Growl has been selected */
-                               if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window"] || 
-                                       [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"])
+                       if( fEncodeState != 2 )
+            {
+                /* If Alert Window or Window and Growl has been selected */
+                               if( [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window"] ||
+                                       [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"] )
                 {
                                        /*On Screen Notification*/
                                        int status;
                                        NSBeep();
                                        status = NSRunAlertPanel(@"Put down that cocktail...",@"Your HandBrake encode is done!", @"OK", nil, nil);
                                        [NSApp requestUserAttention:NSCriticalRequest];
-                                       if ( status == NSAlertDefaultReturn ) 
-                                       {
-                                               [self enableUI: YES];
-                                       }
                 }
-                               else
-                               {
-                                       [self enableUI: YES];
-                               }
-                                  /* If sleep has been selected */ 
-            if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Put Computer To Sleep"]) 
-                { 
-               /* Sleep */ 
-               NSDictionary* errorDict; 
-               NSAppleEventDescriptor* returnDescriptor = NULL; 
-               NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource: 
-                        @"tell application \"Finder\" to sleep"]; 
-               returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; 
-               [scriptObject release]; 
-               [self enableUI: YES]; 
-                } 
-            /* If Shutdown has been selected */ 
-            if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Shut Down Computer"]) 
-                { 
-               /* Shut Down */ 
-               NSDictionary* errorDict; 
-               NSAppleEventDescriptor* returnDescriptor = NULL; 
-               NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource: 
-                        @"tell application \"Finder\" to shut down"]; 
-               returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; 
-               [scriptObject release]; 
-               [self enableUI: YES]; 
+                /* If sleep has been selected */
+                if( [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Put Computer To Sleep"] )
+                {
+                    /* Sleep */
+                    NSDictionary* errorDict;
+                    NSAppleEventDescriptor* returnDescriptor = nil;
+                    NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource:
+                            @"tell application \"Finder\" to sleep"];
+                    returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
+                    [scriptObject release];
+                }
+                /* If Shutdown has been selected */
+                if( [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Shut Down Computer"] )
+                {
+                    /* Shut Down */
+                    NSDictionary* errorDict;
+                    NSAppleEventDescriptor* returnDescriptor = nil;
+                    NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource:
+                            @"tell application \"Finder\" to shut down"];
+                    returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
+                    [scriptObject release];
                 }
-                       
             }
-                       else
-                       {
-                               [self enableUI: YES];
-                       }
             break;
         }
     }
-       
+
     /* Lets show the queue status here in the main window */
        int queue_count = [fQueueController pendingCount];
-       if( queue_count == 1)
+       if( queue_count == 1 )
                [fQueueStatus setStringValue: NSLocalizedString( @"1 encode queued", @"" ) ];
-    else if (queue_count > 1)
+    else if( queue_count > 1 )
                [fQueueStatus setStringValue: [NSString stringWithFormat: NSLocalizedString( @"%d encodes queued", @"" ), queue_count]];
        else
                [fQueueStatus setStringValue: @""];
@@ -933,6 +905,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                 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"])
@@ -948,7 +921,12 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             else
                 return NO;
         }
-    
+    }
+    if( action == @selector(setDefaultPreset:) )
+    {
+        return [fPresetsOutlineView selectedRow] != -1;
+    }
+
     return YES;
 }
 
@@ -1004,7 +982,6 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 /*Opens the source browse window, called from Open Source widgets */
 - (IBAction) browseSources: (id) sender
 {
-    [self enableUI: NO];
     NSOpenPanel * panel;
        
     panel = [NSOpenPanel openPanel];
@@ -1060,28 +1037,28 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
              * purposes in the title panel
              */
             /* Full Path */
-            [fScanSrcTitlePathField setStringValue: [NSString stringWithFormat:@"%@", scanPath]];
+            [fScanSrcTitlePathField setStringValue:scanPath];
             NSString *displayTitlescanSourceName;
-            
+
             if ([[scanPath lastPathComponent] isEqualToString: @"VIDEO_TS"])
             {
-                /* If VIDEO_TS Folder is chosen, choose its parent folder for the source display name 
+                /* If VIDEO_TS Folder is chosen, choose its parent folder for the source display name
                  we have to use the title->dvd value so we get the proper name of the volume if a physical dvd is the source*/
-                displayTitlescanSourceName = [NSString stringWithFormat:[[scanPath stringByDeletingLastPathComponent] lastPathComponent]];
+                displayTitlescanSourceName = [[scanPath stringByDeletingLastPathComponent] lastPathComponent];
             }
             else
             {
                 /* if not the VIDEO_TS Folder, we can assume the chosen folder is the source name */
-                displayTitlescanSourceName = [NSString stringWithFormat:[scanPath lastPathComponent]];
+                displayTitlescanSourceName = [scanPath lastPathComponent];
             }
             /* we set the source display name in the title selection dialogue */
-            [fSrcDsplyNameTitleScan setStringValue: [NSString stringWithFormat:@"%@", displayTitlescanSourceName]];
+            [fSrcDsplyNameTitleScan setStringValue:displayTitlescanSourceName];
             /* we set the attempted scans display name for main window to displayTitlescanSourceName*/
             browsedSourceDisplayName = [displayTitlescanSourceName retain];
-            /* We show the actual sheet where the user specifies the title to be scanned 
+            /* We show the actual sheet where the user specifies the title to be scanned
              * as we are going to do a title specific scan
              */
-            [self showSourceTitleScanPanel:NULL];
+            [self showSourceTitleScanPanel:nil];
         }
         else
         {
@@ -1098,7 +1075,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                     [self writeToActivityLog:"trying to open eyetv package"];
                     /* We're looking at an EyeTV package - try to open its enclosed
                      .mpg media file */
-                     browsedSourceDisplayName = [[NSString stringWithFormat:@"%@",[[path stringByDeletingPathExtension] lastPathComponent]] retain];
+                     browsedSourceDisplayName = [[[path stringByDeletingPathExtension] lastPathComponent] retain];
                     NSString *mpgname;
                     int n = [[path stringByAppendingString: @"/"]
                              completePathIntoString: &mpgname caseSensitive: NO
@@ -1122,45 +1099,37 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                 else if ([[path pathExtension] isEqualToString: @"dvdmedia"])
                 {
                     /* path IS a package - but dvdmedia packages can be treaded like normal directories */
-                    browsedSourceDisplayName = [[NSString stringWithFormat:@"%@",[[path stringByDeletingPathExtension] lastPathComponent]] retain];
+                    browsedSourceDisplayName = [[[path stringByDeletingPathExtension] lastPathComponent] retain];
                     [self writeToActivityLog:"trying to open dvdmedia package"];
                     [self performScan:path scanTitleNum:0];
                 }
-                else 
+                else
                 {
                     /* The package is not an eyetv package, so we do not call performScan */
                     [self writeToActivityLog:"unable to open package"];
                 }
             }
-            else // path is not a package, so we treat it as a dvd parent folder or VIDEO_TS folder 
+            else // path is not a package, so we treat it as a dvd parent folder or VIDEO_TS folder
             {
                 /* path is not a package, so we call perform scan directly on our file */
                 if ([[path lastPathComponent] isEqualToString: @"VIDEO_TS"])
                 {
                     [self writeToActivityLog:"trying to open video_ts folder (video_ts folder chosen)"];
                     /* If VIDEO_TS Folder is chosen, choose its parent folder for the source display name*/
-                    browsedSourceDisplayName = [[NSString stringWithFormat:@"%@",[[path stringByDeletingLastPathComponent] lastPathComponent]] retain];
+                    browsedSourceDisplayName = [[[path stringByDeletingLastPathComponent] lastPathComponent] retain];
                 }
                 else
                 {
                     [self writeToActivityLog:"trying to open video_ts folder (parent directory chosen)"];
                     /* if not the VIDEO_TS Folder, we can assume the chosen folder is the source name */
                     /* make sure we remove any path extension as this can also be an '.mpg' file */
-                    browsedSourceDisplayName = [[NSString stringWithFormat:@"%@",[path lastPathComponent]] retain];
+                    browsedSourceDisplayName = [[path lastPathComponent] retain];
                 }
                 [self performScan:path scanTitleNum:0];
             }
-            
-        }
-        
-    }
-    else // User clicked Cancel in browse window
-    {
-        /* if we have a title loaded up */
-        if ([[fSrcDVD2Field stringValue] length] > 0)
-        {
-            [self enableUI: YES];
+
         }
+
     }
 }
 
@@ -1172,16 +1141,14 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     */
     [fScanSrcTitleNumField setStringValue: @"0"];
        /* Show the panel */
-       [NSApp beginSheet: fScanSrcTitlePanel modalForWindow: fWindow modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
+       [NSApp beginSheet:fScanSrcTitlePanel modalForWindow:fWindow modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
 }
 
 - (IBAction) closeSourceTitleScanPanel: (id) sender
 {
     [NSApp endSheet: fScanSrcTitlePanel];
     [fScanSrcTitlePanel orderOut: self];
-    
-    
-    
+
     if(sender == fScanSrcTitleOpenButton)
     {
         /* We setup the scan status in the main window to indicate a source title scan */
@@ -1197,7 +1164,6 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     }
 }
 
-
 /* Here we actually tell hb_scan to perform the source scan, using the path to source and title number*/
 - (void) performScan:(NSString *) scanPath scanTitleNum: (int) scanTitleNum
 {
@@ -1205,13 +1171,20 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     BOOL cancelScanDecrypt = 0;
     NSString *path = scanPath;
     HBDVDDetector *detector = [HBDVDDetector detectorForPath:path];
+
+    // Notify ChapterTitles that there's no title
+    [fChapterTitlesDelegate resetWithTitle:nil];
+    [fChapterTable reloadData];
+
+    [self enableUI: NO];
+
     if( [detector isVideoDVD] )
     {
         // The chosen path was actually on a DVD, so use the raw block
         // device path instead.
         path = [detector devicePath];
         [self writeToActivityLog: "trying to open a physical dvd at: %s", [scanPath UTF8String]];
-        
+
         /* lets check for vlc here to make sure we have a dylib available to use for decrypting */
         NSString *vlcPath = @"/Applications/VLC.app";
         NSFileManager * fileManager = [NSFileManager defaultManager];
@@ -1240,21 +1213,17 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             cancelScanDecrypt = 0;
             [self writeToActivityLog: "user overrode vlc warning -trying to open physical dvd without decryption"];
             }
-            
+
         }
         else
         {
             /* VLC was found in /Applications so all is well, we can carry on using vlc's libdvdcss.dylib for decrypting if needed */
             [self writeToActivityLog: "VLC app found for decrypting physical dvd"];
         }
-        
     }
-    
-    
-    
+
     if (cancelScanDecrypt == 0)
     {
-        
         /* we actually pass the scan off to libhb here */
         /* If there is no title number passed to scan, we use "0"
          * which causes the default behavior of a full source scan
@@ -1267,19 +1236,10 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         {
             [self writeToActivityLog: "scanning specifically for title: %d", scanTitleNum];
         }
+
         hb_scan( fHandle, [path UTF8String], scanTitleNum );
-        [fSrcDVD2Field setStringValue: [NSString stringWithFormat: @"Scanning new source ..."]];
-    }
-    else
-    {
-            /* if we have a title loaded up */
-        if ([[fSrcDVD2Field stringValue] length] > 0)
-        {
-            [self enableUI: YES];
-        }
+        [fSrcDVD2Field setStringValue:@"Scanning new source ..."];
     }
-
-    
 }
 
 - (IBAction) showNewScan:(id)sender
@@ -1288,15 +1248,15 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        hb_title_t * title;
        int indxpri=0;    // Used to search the longuest title (default in combobox)
        int longuestpri=0; // Used to search the longuest title (default in combobox)
-       
+
        list = hb_get_titles( fHandle );
-       
+
        if( !hb_list_count( list ) )
        {
                /* We display a message if a valid dvd source was not chosen */
                [fSrcDVD2Field setStringValue: @"No Valid Source Found"];
         SuccessfulScan = NO;
-        
+
         // Notify ChapterTitles that there's no title
         [fChapterTitlesDelegate resetWithTitle:nil];
         [fChapterTable reloadData];
@@ -1316,13 +1276,13 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                for( int i = 0; i < hb_list_count( list ); i++ )
                {
                        title = (hb_title_t *) hb_list_item( list, i );
-                       
+
             currentSource = [NSString stringWithUTF8String: title->name];
-            
+
             /*Set DVD Name at top of window with the browsedSourceDisplayName grokked right before -performScan */
-                       [fSrcDVD2Field setStringValue: [NSString stringWithFormat: @"%@",browsedSourceDisplayName]];
-                       
-                       /* Use the dvd name in the default output field here 
+                       [fSrcDVD2Field setStringValue:browsedSourceDisplayName];
+
+                       /* Use the dvd name in the default output field here
                                May want to add code to remove blank spaces for some dvd names*/
                        /* Check to see if the last destination has been set,use if so, if not, use Desktop */
             if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"])
@@ -1351,30 +1311,23 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                 title->index, title->hours, title->minutes,
                 title->seconds]];
                }
-        
+
                // Select the longuest title
                [fSrcTitlePopUp selectItemAtIndex: indxpri];
-               [self titlePopUpChanged: NULL];
-               
+               [self titlePopUpChanged:nil];
+
         SuccessfulScan = YES;
                [self enableUI: YES];
-               
+
                /* if its the initial successful scan after awakeFromNib */
         if (currentSuccessfulScanCount == 1)
         {
-            [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];
-            }
+            [self selectDefaultPreset:nil];
+            /* initially set deinterlace to 0, will be overridden reset by the default preset anyway */
+            //[fPictureController setDeinterlace:0];
+
             /* lets set Denoise to index 0 or "None" since this is the first scan */
-            [fPictureController setDenoise:0];
+            //[fPictureController setDenoise:0];
             
             [fPictureController setInitialPictureFilters];
         }
@@ -1453,12 +1406,12 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 
 
     /* If mpeg-4, then set mpeg-4 specific options like chapters and > 4gb file sizes */
-       if ([fDstFormatPopUp indexOfSelectedItem] == 0)
+       if( [fDstFormatPopUp indexOfSelectedItem] == 0 )
        {
         /* We set the largeFileSize (64 bit formatting) variable here to allow for > 4gb files based on the format being
                mpeg4 and the checkbox being checked 
                *Note: this will break compatibility with some target devices like iPod, etc.!!!!*/
-               if ([fDstMp4LargeFileCheck state] == NSOnState)
+               if( [fDstMp4LargeFileCheck state] == NSOnState )
                {
                        job->largeFileSize = 1;
                }
@@ -1467,7 +1420,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                        job->largeFileSize = 0;
                }
         /* We set http optimized mp4 here */
-        if ([fDstMp4HttpOptFileCheck state] == NSOnState)
+        if( [fDstMp4HttpOptFileCheck state] == NSOnState && [fDstMp4HttpOptFileCheck isEnabled] )
                {
         job->mp4_optimize = 1;
         }
@@ -1476,7 +1429,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         job->mp4_optimize = 0;
         }
     }
-       if ([fDstFormatPopUp indexOfSelectedItem] == 0 || [fDstFormatPopUp indexOfSelectedItem] == 1)
+       if( [fDstFormatPopUp indexOfSelectedItem] == 0 || [fDstFormatPopUp indexOfSelectedItem] == 1 )
        {
          /* We set the chapter marker extraction here based on the format being
                mpeg4 or mkv and the checkbox being checked */
@@ -1747,20 +1700,20 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             [fDstFile2Field stringValue]] )
     {
         NSBeginCriticalAlertSheet( NSLocalizedString( @"File already exists", @"" ),
-            NSLocalizedString( @"Cancel", @"" ), NSLocalizedString( @"Overwrite", @"" ), NULL, fWindow, self,
+            NSLocalizedString( @"Cancel", @"" ), NSLocalizedString( @"Overwrite", @"" ), nil, fWindow, self,
             @selector( overwriteAddToQueueAlertDone:returnCode:contextInfo: ),
             NULL, NULL, [NSString stringWithFormat:
             NSLocalizedString( @"Do you want to overwrite %@?", @"" ),
             [fDstFile2Field stringValue]] );
         // overwriteAddToQueueAlertDone: will be called when the alert is dismissed.
     }
-    
+
     // Warn if another pending job in the queue has the same destination path
     else if ( ([fQueueController pendingJobGroupWithDestinationPath:[fDstFile2Field stringValue]] != nil)
             || ([[[fQueueController currentJobGroup] destinationPath] isEqualToString: [fDstFile2Field stringValue]]) )
     {
         NSBeginCriticalAlertSheet( NSLocalizedString( @"Another queued encode has specified the same destination.", @"" ),
-            NSLocalizedString( @"Cancel", @"" ), NSLocalizedString( @"Overwrite", @"" ), NULL, fWindow, self,
+            NSLocalizedString( @"Cancel", @"" ), NSLocalizedString( @"Overwrite", @"" ), nil, fWindow, self,
             @selector( overwriteAddToQueueAlertDone:returnCode:contextInfo: ),
             NULL, NULL, [NSString stringWithFormat:
             NSLocalizedString( @"Do you want to overwrite %@?", @"" ),
@@ -1934,17 +1887,17 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     if( [[NSFileManager defaultManager] fileExistsAtPath:[fDstFile2Field stringValue]] )
     {
         NSBeginCriticalAlertSheet( NSLocalizedString( @"File already exists", @"" ),
-            NSLocalizedString( @"Cancel", "" ), NSLocalizedString( @"Overwrite", @"" ), NULL, fWindow, self,
+            NSLocalizedString( @"Cancel", "" ), NSLocalizedString( @"Overwrite", @"" ), nil, fWindow, self,
             @selector( overWriteAlertDone:returnCode:contextInfo: ),
             NULL, NULL, [NSString stringWithFormat:
             NSLocalizedString( @"Do you want to overwrite %@?", @"" ),
             [fDstFile2Field stringValue]] );
-            
+
         // overWriteAlertDone: will be called when the alert is dismissed. It will call doRip.
     }
     else
     {
-        /* if there are no jobs in the queue, then add this one to the queue and rip 
+        /* if there are no jobs in the queue, then add this one to the queue and rip
         otherwise, just rip the queue */
         if( hb_count( fHandle ) == 0)
         {
@@ -1987,11 +1940,11 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                NSBeep();
                reminduser = NSRunAlertPanel(@"The computer will sleep after encoding is done.",@"You have selected to sleep the computer after encoding. To turn off sleeping, go to the HandBrake preferences.", @"OK", @"Preferences...", nil);
                [NSApp requestUserAttention:NSCriticalRequest];
-               if ( reminduser == NSAlertAlternateReturn ) 
+               if ( reminduser == NSAlertAlternateReturn )
                {
-                       [self showPreferencesWindow:NULL];
+                       [self showPreferencesWindow:nil];
                }
-       } 
+       }
        else if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Shut Down Computer"])
        {
                /*Warn that computer will shut down after encoding*/
@@ -1999,9 +1952,9 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                NSBeep();
                reminduser = NSRunAlertPanel(@"The computer will shut down after encoding is done.",@"You have selected to shut down the computer after encoding. To turn off shut down, go to the HandBrake preferences.", @"OK", @"Preferences...", nil);
                [NSApp requestUserAttention:NSCriticalRequest];
-               if ( reminduser == NSAlertAlternateReturn ) 
+               if ( reminduser == NSAlertAlternateReturn )
                {
-                       [self showPreferencesWindow:NULL];
+                       [self showPreferencesWindow:nil];
                }
        }
 
@@ -2087,10 +2040,6 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         [self doCancelCurrentJob];  // <- this also stops libhb
 }
 
-
-
-
-
 - (IBAction) Pause: (id) sender
 {
     hb_state_t s;
@@ -2114,15 +2063,14 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     hb_list_t  * list  = hb_get_titles( fHandle );
     hb_title_t * title = (hb_title_t*)
         hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
-               
-               
+
     /* If Auto Naming is on. We create an output filename of dvd name - title number */
-    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"] > 0)
+    if( [[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"] > 0 && ( hb_list_count( list ) > 1 ) )
        {
                [fDstFile2Field setStringValue: [NSString stringWithFormat:
                        @"%@/%@-%d.%@", [[fDstFile2Field stringValue] stringByDeletingLastPathComponent],
-                       browsedSourceDisplayName,
-                         title->index,
+                       [browsedSourceDisplayName stringByDeletingPathExtension],
+            title->index,
                        [[fDstFile2Field stringValue] pathExtension]]]; 
        }
 
@@ -2136,24 +2084,16 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         [fSrcChapterEndPopUp addItemWithTitle: [NSString
             stringWithFormat: @"%d", i + 1]];
     }
+
     [fSrcChapterStartPopUp selectItemAtIndex: 0];
     [fSrcChapterEndPopUp   selectItemAtIndex:
         hb_list_count( title->list_chapter ) - 1];
-    [self chapterPopUpChanged: NULL];
+    [self chapterPopUpChanged:nil];
 
-/* Start Get and set the initial pic size for display */
+    /* Start Get and set the initial pic size for display */
        hb_job_t * job = title->job;
-       fTitle = title; 
+       fTitle = title;
 
-       /* Pixel Ratio Setting */
-       if ([[NSUserDefaults standardUserDefaults] boolForKey:@"PixelRatio"])
-    {
-               job->pixel_ratio = 1 ;
-       }
-       else
-       {
-               job->pixel_ratio = 0 ;
-       }
        /*Set Source Size Field Here */
     [fPicSettingsSrc setStringValue: [NSString stringWithFormat: @"%d x %d", fTitle->width, fTitle->height]];
        
@@ -2189,13 +2129,13 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             subtitle->lang] action: NULL keyEquivalent: @""];
     }
     [fSubPopUp selectItemAtIndex: 0];
-       
-       [self subtitleSelectionChanged: NULL];
-    
+
+       [self subtitleSelectionChanged:nil];
+
     /* Update chapter table */
     [fChapterTitlesDelegate resetWithTitle:title];
     [fChapterTable reloadData];
-   
+
    /* Lets make sure there arent any erroneous audio tracks in the job list, so lets make sure its empty*/
     int audiotrack_count = hb_list_count(job->list_audio);
     for( int i = 0; i < audiotrack_count;i++)
@@ -2203,7 +2143,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         hb_audio_t * temp_audio = (hb_audio_t*) hb_list_item( job->list_audio, 0 );
         hb_list_rem(job->list_audio, temp_audio);
     }
-   
+
     /* Update audio popups */
     [self addAllAudioTracksToPopUp: fAudLang1PopUp];
     [self addAllAudioTracksToPopUp: fAudLang2PopUp];
@@ -2212,72 +2152,29 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     /* search for the first instance of our prefs default language for track 1, and set track 2 to "none" */
        NSString * audioSearchPrefix = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultLanguage"];
         [self selectAudioTrackInPopUp: fAudLang1PopUp searchPrefixString: audioSearchPrefix selectIndexIfNotFound: 1];
-    [self selectAudioTrackInPopUp: fAudLang2PopUp searchPrefixString: NULL selectIndexIfNotFound: 0];
-    [self selectAudioTrackInPopUp: fAudLang3PopUp searchPrefixString: NULL selectIndexIfNotFound: 0];
-    [self selectAudioTrackInPopUp: fAudLang4PopUp searchPrefixString: NULL selectIndexIfNotFound: 0];
-       
+    [self selectAudioTrackInPopUp:fAudLang2PopUp searchPrefixString:nil selectIndexIfNotFound:0];
+    [self selectAudioTrackInPopUp:fAudLang3PopUp searchPrefixString:nil selectIndexIfNotFound:0];
+    [self selectAudioTrackInPopUp:fAudLang4PopUp searchPrefixString:nil selectIndexIfNotFound:0];
+
        /* changing the title may have changed the audio channels on offer, */
        /* so call audioTrackPopUpChanged for both audio tracks to update the mixdown popups */
        [self audioTrackPopUpChanged: fAudLang1PopUp];
        [self audioTrackPopUpChanged: fAudLang2PopUp];
     [self audioTrackPopUpChanged: fAudLang3PopUp];
     [self audioTrackPopUpChanged: fAudLang4PopUp];
-    
-    /* We repopulate the Video Framerate popup and show the detected framerate along with "Same as Source"*/
-    [fVidRatePopUp removeAllItems];
-    if (fTitle->rate_base == 1126125) // 23.976 NTSC Film
-    {
-        [fVidRatePopUp addItemWithTitle: @"Same as source (23.976)"];
-    }
-    else if (fTitle->rate_base == 1080000) // 25 PAL Film/Video
-    {
-        [fVidRatePopUp addItemWithTitle: @"Same as source (25)"];
-    }
-    else if (fTitle->rate_base == 900900) // 29.97 NTSC Video
-    {
-        [fVidRatePopUp addItemWithTitle: @"Same as source (29.97)"];
-    }
-    else
-    {
-        /* if none of the common dvd source framerates is detected, just use "Same as source" */
-        [fVidRatePopUp addItemWithTitle: @"Same as source"];
-    }
-       for( int i = 0; i < hb_video_rates_count; i++ )
-    {
-        if ([[NSString stringWithCString: hb_video_rates[i].string] isEqualToString: [NSString stringWithFormat: @"%.3f",23.976]])
-               {
-                       [fVidRatePopUp addItemWithTitle:[NSString stringWithFormat: @"%@%@",
-                               [NSString stringWithCString: hb_video_rates[i].string], @" (NTSC Film)"]];
-               }
-               else if ([[NSString stringWithCString: hb_video_rates[i].string] isEqualToString: [NSString stringWithFormat: @"%d",25]])
-               {
-                       [fVidRatePopUp addItemWithTitle:[NSString stringWithFormat: @"%@%@",
-                               [NSString stringWithCString: hb_video_rates[i].string], @" (PAL Film/Video)"]];
-               }
-               else if ([[NSString stringWithCString: hb_video_rates[i].string] isEqualToString: [NSString stringWithFormat: @"%.2f",29.97]])
-               {
-                       [fVidRatePopUp addItemWithTitle:[NSString stringWithFormat: @"%@%@",
-                               [NSString stringWithCString: hb_video_rates[i].string], @" (NTSC Video)"]];
-               }
-               else
-               {
-                       [fVidRatePopUp addItemWithTitle:
-                               [NSString stringWithCString: hb_video_rates[i].string]];
-               }
-    }   
+
     [fVidRatePopUp selectItemAtIndex: 0];
-    
+
     /* we run the picture size values through calculatePictureSizing to get all picture setting        information*/
-       [self calculatePictureSizing: NULL];
-    
+       [self calculatePictureSizing:nil];
+
    /* lets call tableViewSelected to make sure that any preset we have selected is enforced after a title change */
-       [self selectPreset:NULL]; 
-       
+       [self selectPreset:nil];
 }
 
 - (IBAction) chapterPopUpChanged: (id) sender
 {
-    
+
        /* If start chapter popup is greater than end chapter popup,
        we set the end chapter popup to the same as start chapter popup */
        if ([fSrcChapterStartPopUp indexOfSelectedItem] > [fSrcChapterEndPopUp indexOfSelectedItem])
@@ -2381,91 +2278,89 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                        break;
     }
     [fVidEncoderPopUp selectItemAtIndex: 0];
-    
+
     [self audioAddAudioTrackCodecs: fAudTrack1CodecPopUp];
     [self audioAddAudioTrackCodecs: fAudTrack2CodecPopUp];
     [self audioAddAudioTrackCodecs: fAudTrack3CodecPopUp];
     [self audioAddAudioTrackCodecs: fAudTrack4CodecPopUp];
-    
-    /* FIX ME: we need to restore changing the file extension as pwer */
-    
-    if( [string characterAtIndex: [string length] - 4] == '.' )
-        {
-            [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                                             @"%@.%s", [string substringToIndex: [string length] - 4],
-                                             ext]];
-        }
-        else
-        {
-            [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                                             @"%@.%s", string, ext]];
-        }
-        
-    if ( SuccessfulScan ) 
+
+    if( format == 0 )
+        [self autoSetM4vExtension: sender];
+    else
+        [fDstFile2Field setStringValue: [NSString stringWithFormat:@"%@.%s", [string stringByDeletingPathExtension], ext]];
+
+    if( SuccessfulScan )
     {
         /* Add/replace to the correct extension */
         [self audioTrackPopUpChanged: fAudLang1PopUp];
         [self audioTrackPopUpChanged: fAudLang2PopUp];
         [self audioTrackPopUpChanged: fAudLang3PopUp];
         [self audioTrackPopUpChanged: fAudLang4PopUp];
-        
-        if ( [fVidEncoderPopUp selectedItem] == NULL )
+
+        if( [fVidEncoderPopUp selectedItem] == nil )
         {
-            
+
             [fVidEncoderPopUp selectItemAtIndex:0];
-            [self videoEncoderPopUpChanged: NULL];
-            
+            [self videoEncoderPopUpChanged:nil];
+
             /* changing the format may mean that we can / can't offer mono or 6ch, */
             /* so call audioTrackPopUpChanged for both audio tracks to update the mixdown popups */
-            
-            
-            
+
             /* We call the method to properly enable/disable turbo 2 pass */
             [self twoPassCheckboxChanged: sender];
             /* We call method method to change UI to reflect whether a preset is used or not*/
         }
     }
-    
-    /* Lets check to see if we want to auto set the .m4v extension for mp4 */
-    [self autoSetM4vExtension: sender];
-       [self customSettingUsed: sender];       
+       [self customSettingUsed: sender];
 }
 
+- (IBAction) autoSetM4vExtension: (id) sender
+{
+    if ( [fDstFormatPopUp indexOfSelectedItem] )
+        return;
 
+    NSString * extension = @"mp4";
 
-    /* if MP4 format and [fDstCodecsPopUp indexOfSelectedItem] > 1 we know that the audio is going to be
-         * either aac + ac3 passthru, or just ac3 passthru so we need to make sure the output file extension is m4v
-         * otherwise Quicktime will not play it at all */
-- (IBAction) autoSetM4vExtension: (id) sender
+    if( [[fAudTrack1CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 || [[fAudTrack2CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 ||
+                                                        [[fAudTrack3CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 ||
+                                                        [[fAudTrack4CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 ||
+                                                        [fCreateChapterMarkers state] == NSOnState ||
+                                                        [[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultMpegName"] > 0 )
+    {
+        extension = @"m4v";
+    }
+
+    if( [extension isEqualTo: [[fDstFile2Field stringValue] pathExtension]] )
+        return;
+    else
+        [fDstFile2Field setStringValue: [NSString stringWithFormat:@"%@.%@",
+                                    [[fDstFile2Field stringValue] stringByDeletingPathExtension], extension]];
+}
+
+- (void) shouldEnableHttpMp4CheckBox: (id) sender
 {
-        /*FIX ME: for this to work, we will now have to iterate through the audio list to see if ac3 in an mp4 is chosen 
-        * for now just comment it out.
-        */
-        /*
-        if ([fDstFormatPopUp indexOfSelectedItem] == 0 && [fDstCodecsPopUp indexOfSelectedItem] > 1)
-        {
-            NSString *newpath = [[[fDstFile2Field stringValue] stringByDeletingPathExtension] stringByAppendingPathExtension: @"m4v"];
-            [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                                             @"%@", newpath]];
-        }
-        */
+    if( [[fAudTrack1CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 || [[fAudTrack2CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 ||
+                                                        [[fAudTrack3CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 ||
+                                                        [[fAudTrack4CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 )
+        [fDstMp4HttpOptFileCheck setEnabled: NO];
+    else
+        [fDstMp4HttpOptFileCheck setEnabled: YES];
 }
+        
 /* Method to determine if we should change the UI
 To reflect whether or not a Preset is being used or if
 the user is using "Custom" settings by determining the sender*/
 - (IBAction) customSettingUsed: (id) sender
 {
-       if ([sender stringValue] != NULL)
+       if ([sender stringValue])
        {
                /* Deselect the currently selected Preset if there is one*/
                [fPresetsOutlineView deselectRow:[fPresetsOutlineView selectedRow]];
-               [[fPresetsActionMenu itemAtIndex:0] setEnabled: NO];
                /* Change UI to show "Custom" settings are being used */
                [fPresetSelectedDisplay setStringValue: @"Custom"];
-               
+
                curUserPresetChosenNum = nil;
        }
-
 }
 
 
@@ -2599,7 +2494,7 @@ the user is using "Custom" settings by determining the sender*/
 
 - (void) controlTextDidChange: (NSNotification *) notification
 {
-    [self calculateBitrate: NULL];
+    [self calculateBitrate:nil];
 }
 
 - (IBAction) calculateBitrate: (id) sender
@@ -2653,7 +2548,7 @@ the user is using "Custom" settings by determining the sender*/
  */
 
 - (void)pictureSettingsDidChange {
-       [self calculatePictureSizing: NULL];
+       [self calculatePictureSizing:nil];
 }
 
 /* Get and Display Current Pic Settings in main window */
@@ -2679,18 +2574,18 @@ the user is using "Custom" settings by determining the sender*/
         hb_set_anamorphic_size(job, &output_width, &output_height, &output_par_width, &output_par_height);
         int display_width;
         display_width = output_width * output_par_width / output_par_height;
-        
+
         [fPicSettingsOutp setStringValue: [NSString stringWithFormat:@"%d x %d", output_width, output_height]];
         [fPicSettingsAnamorphic setStringValue: [NSString stringWithFormat:@"%d x %d Loose", display_width, output_height]];
-        
+
         fTitle->job->keep_ratio = 0;
     }
        else
        {
-        [fPicSettingsAnamorphic setStringValue: [NSString stringWithFormat:@"Off"]];
+        [fPicSettingsAnamorphic setStringValue:@"Off"];
        }
-    
-       /* Set ON/Off values for the deinterlace/keep aspect ratio according to boolean */      
+
+       /* Set ON/Off values for the deinterlace/keep aspect ratio according to boolean */
        if (fTitle->job->keep_ratio > 0)
        {
                [fPicSettingARkeep setStringValue: @"On"];
@@ -2715,14 +2610,13 @@ the user is using "Custom" settings by determining the sender*/
        }
        else if ([fPictureController decomb] == 1)
        {
-               [fPicSettingDecomb setStringValue: @"4:10:15:9:10:35:9"];
+               [fPicSettingDecomb setStringValue: @"1:2:6:9:80:16:16"];
        }
     else if ([fPictureController decomb] == 2)
     {
-    [fPicSettingDecomb setStringValue: [[NSUserDefaults standardUserDefaults] valueForKey:@"DecombCustomString"]];
-    ///[[NSUserDefaults standardUserDefaults] valueForKey:@"DecombCustomString"]
+        [fPicSettingDecomb setStringValue:[[NSUserDefaults standardUserDefaults] stringForKey:@"DecombCustomString"]];
     }
-    
+
     /* VFR (Variable Frame Rate) */
     if ([fPictureController vfr]) {
         /* We change the string of the fps popup to warn that vfr is on Framerate (FPS): */
@@ -3015,8 +2909,8 @@ the user is using "Custom" settings by determining the sender*/
     /* e.g. to find the first French track, pass in an NSString * of "Francais" */
     /* e.g. to find the first English 5.1 AC3 track, pass in an NSString * of "English (AC3) (5.1 ch)" */
     /* if no matching track is found, then selectIndexIfNotFound is used to choose which track to select instead */
-    
-       if (searchPrefixString != NULL) 
+
+       if (searchPrefixString)
        {
 
         for( int i = 0; i < [sender numberOfItems]; i++ )
@@ -3214,32 +3108,32 @@ the user is using "Custom" settings by determining the sender*/
         sampleratePopUp = fAudTrack4RatePopUp;
         bitratePopUp = fAudTrack4BitratePopUp;
     }
-    
+
     /* get the index of the selected audio Track*/
     int thisAudioIndex = [sender indexOfSelectedItem] - 1;
-    
+
     /* pointer for the hb_audio_s struct we will use later on */
     hb_audio_config_t * audio;
-    
+
     int acodec;
     /* check if the audio mixdown controls need their enabled state changing */
-    [self setEnabledStateOfAudioMixdownControls: NULL];
-    
+    [self setEnabledStateOfAudioMixdownControls:nil];
+
     if (thisAudioIndex != -1)
     {
-        
+
         /* get the audio */
         audio = (hb_audio_config_t *) hb_list_audio_config_item( fTitle->list_audio, thisAudioIndex );// Should "fTitle" be title and be setup ?
-        
+
         /* actually manipulate the proper mixdowns here */
         /* delete the previous audio mixdown options */
         [mixdownPopUp removeAllItems];
-        
+
         acodec = [[audiocodecPopUp selectedItem] tag];
-        
+
         if (audio != NULL)
         {
-            
+
             /* find out if our selected output audio codec supports mono and / or 6ch */
             /* we also check for an input codec of AC3 or DCA,
              as they are the only libraries able to do the mixdown to mono / conversion to 6-ch */
@@ -3396,8 +3290,13 @@ the user is using "Custom" settings by determining the sender*/
         }
     
     }
-
+    if( [fDstFormatPopUp indexOfSelectedItem] == 0 )
+    {
+        [self autoSetM4vExtension: sender];
+        [self shouldEnableHttpMp4CheckBox: sender];
+    }
 }
+
 - (IBAction) audioTrackMixdownChanged: (id) sender
 {
     
@@ -3833,9 +3732,9 @@ if (item == nil)
         /* initialize the tooltip contents variable */
         NSString *loc_tip;
         /* if there is a description for the preset, we show it in the tooltip */
-        if ([item valueForKey:@"PresetDescription"])
+        if ([item objectForKey:@"PresetDescription"])
         {
-            loc_tip = [NSString stringWithFormat: @"%@",[item valueForKey:@"PresetDescription"]];
+            loc_tip = [item objectForKey:@"PresetDescription"];
             return (loc_tip);
         }
         else
@@ -3951,107 +3850,107 @@ if (item == nil)
 
 - (IBAction)selectPreset:(id)sender
 {
-    
+
     if ([fPresetsOutlineView selectedRow] >= 0)
     {
         chosenPreset = [fPresetsOutlineView itemAtRow:[fPresetsOutlineView selectedRow]];
         /* we set the preset display field in main window here */
-        [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PresetName"]]];
+        [fPresetSelectedDisplay setStringValue:[chosenPreset objectForKey:@"PresetName"]];
         if ([[chosenPreset objectForKey:@"Default"] intValue] == 1)
         {
-            [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@ (Default)",[chosenPreset valueForKey:@"PresetName"]]];
+            [fPresetSelectedDisplay setStringValue:[NSString stringWithFormat:@"%@ (Default)", [chosenPreset objectForKey:@"PresetName"]]];
         }
         else
         {
-            [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PresetName"]]];
+            [fPresetSelectedDisplay setStringValue:[chosenPreset objectForKey:@"PresetName"]];
         }
         /* File Format */
-        [fDstFormatPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"FileFormat"]]];
-        [self formatPopUpChanged: NULL];
-        
+        [fDstFormatPopUp selectItemWithTitle:[chosenPreset objectForKey:@"FileFormat"]];
+        [self formatPopUpChanged:nil];
+
         /* Chapter Markers*/
         [fCreateChapterMarkers setState:[[chosenPreset objectForKey:@"ChapterMarkers"] intValue]];
         /* Allow Mpeg4 64 bit formatting +4GB file sizes */
         [fDstMp4LargeFileCheck setState:[[chosenPreset objectForKey:@"Mp4LargeFile"] intValue]];
         /* Mux mp4 with http optimization */
         [fDstMp4HttpOptFileCheck setState:[[chosenPreset objectForKey:@"Mp4HttpOptimize"] intValue]];
-        
+
         /* Video encoder */
         /* We set the advanced opt string here if applicable*/
-        [fAdvancedOptions setOptions: [NSString stringWithFormat:[chosenPreset valueForKey:@"x264Option"]]];
+        [fAdvancedOptions setOptions:[chosenPreset objectForKey:@"x264Option"]];
         /* We use a conditional to account for the new x264 encoder dropdown as well as presets made using legacy x264 settings*/
-        if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]] isEqualToString: @"x264 (h.264 Main)"] || 
-            [[NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]] isEqualToString: @"x264 (h.264 iPod)"] || 
-            [[NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]] isEqualToString: @"x264"])
+        if ([[chosenPreset objectForKey:@"VideoEncoder"] isEqualToString:@"x264 (h.264 Main)"] ||
+            [[chosenPreset objectForKey:@"VideoEncoder"] isEqualToString:@"x264 (h.264 iPod)"] ||
+            [[chosenPreset objectForKey:@"VideoEncoder"] isEqualToString:@"x264"])
         {
-            [fVidEncoderPopUp selectItemWithTitle: [NSString stringWithFormat:@"H.264 (x264)"]];
+            [fVidEncoderPopUp selectItemWithTitle:@"H.264 (x264)"];
             /* special case for legacy preset to check the new fDstMp4HttpOptFileCheck checkbox to set the ipod atom */
-            if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]] isEqualToString: @"x264 (h.264 iPod)"])
+            if ([[chosenPreset objectForKey:@"VideoEncoder"] isEqualToString:@"x264 (h.264 iPod)"])
             {
                 [fDstMp4iPodFileCheck setState:NSOnState];
                 /* We also need to add "level=30:" to the advanced opts string to set the correct level for the iPod when
                  encountering a legacy preset as it used to be handled separately from the opt string*/
-                [fAdvancedOptions setOptions: [NSString stringWithFormat:[@"level=30:" stringByAppendingString:[fAdvancedOptions optionsString]]]];
+                [fAdvancedOptions setOptions:[@"level=30:" stringByAppendingString:[fAdvancedOptions optionsString]]];
             }
             else
             {
                 [fDstMp4iPodFileCheck setState:NSOffState];
             }
         }
-        else if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]] isEqualToString: @"FFmpeg"])
+        else if ([[chosenPreset objectForKey:@"VideoEncoder"] isEqualToString:@"FFmpeg"])
         {
-            [fVidEncoderPopUp selectItemWithTitle: [NSString stringWithFormat:@"MPEG-4 (FFmpeg)"]];
+            [fVidEncoderPopUp selectItemWithTitle:@"MPEG-4 (FFmpeg)"];
         }
-        else if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]] isEqualToString: @"XviD"])
+        else if ([[chosenPreset objectForKey:@"VideoEncoder"] isEqualToString:@"XviD"])
         {
-            [fVidEncoderPopUp selectItemWithTitle: [NSString stringWithFormat:@"MPEG-4 (XviD)"]];
+            [fVidEncoderPopUp selectItemWithTitle:@"MPEG-4 (XviD)"];
         }
         else
         {
-            [fVidEncoderPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]]];
+            [fVidEncoderPopUp selectItemWithTitle:[chosenPreset objectForKey:@"VideoEncoder"]];
         }
-        
+
         /* Lets run through the following functions to get variables set there */
-        [self videoEncoderPopUpChanged: NULL];
+        [self videoEncoderPopUpChanged:nil];
         /* Set the state of ipod compatible with Mp4iPodCompatible. Only for x264*/
         [fDstMp4iPodFileCheck setState:[[chosenPreset objectForKey:@"Mp4iPodCompatible"] intValue]];
-        [self calculateBitrate: NULL];
-        
+        [self calculateBitrate:nil];
+
         /* Video quality */
         [fVidQualityMatrix selectCellAtRow:[[chosenPreset objectForKey:@"VideoQualityType"] intValue] column:0];
-        
-        [fVidTargetSizeField setStringValue: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoTargetSize"]]];
-        [fVidBitrateField setStringValue: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoAvgBitrate"]]];
-        [fVidQualitySlider setFloatValue: [[chosenPreset valueForKey:@"VideoQualitySlider"] floatValue]];
-        
-        [self videoMatrixChanged: NULL];
-        
+
+        [fVidTargetSizeField setStringValue:[chosenPreset objectForKey:@"VideoTargetSize"]];
+        [fVidBitrateField setStringValue:[chosenPreset objectForKey:@"VideoAvgBitrate"]];
+        [fVidQualitySlider setFloatValue:[[chosenPreset objectForKey:@"VideoQualitySlider"] floatValue]];
+
+        [self videoMatrixChanged:nil];
+
         /* Video framerate */
         /* For video preset video framerate, we want to make sure that Same as source does not conflict with the
          detected framerate in the fVidRatePopUp so we use index 0*/
-        if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"VideoFramerate"]] isEqualToString: @"Same as source"])
+        if ([[chosenPreset objectForKey:@"VideoFramerate"] isEqualToString:@"Same as source"])
         {
             [fVidRatePopUp selectItemAtIndex: 0];
         }
         else
         {
-            [fVidRatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoFramerate"]]];
+            [fVidRatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"VideoFramerate"]];
         }
-        
+
         /* GrayScale */
         [fVidGrayscaleCheck setState:[[chosenPreset objectForKey:@"VideoGrayScale"] intValue]];
-        
+
         /* 2 Pass Encoding */
         [fVidTwoPassCheck setState:[[chosenPreset objectForKey:@"VideoTwoPass"] intValue]];
-        [self twoPassCheckboxChanged: NULL];
+        [self twoPassCheckboxChanged:nil];
         /* Turbo 1st pass for 2 Pass Encoding */
         [fVidTurboPassCheck setState:[[chosenPreset objectForKey:@"VideoTurboTwoPass"] intValue]];
-        
+
         /*Audio*/
-        if ([chosenPreset valueForKey:@"FileCodecs"])
+        if ([chosenPreset objectForKey:@"FileCodecs"])
         {
             /* We need to handle the audio codec popup by determining what was chosen from the deprecated Codecs PopUp for past presets*/
-            if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]] isEqualToString: @"AVC/H.264 Video / AAC + AC3 Audio"])
+            if ([[chosenPreset objectForKey:@"FileCodecs"] isEqualToString: @"AVC/H.264 Video / AAC + AC3 Audio"])
             {
                 /* We need to address setting languages etc. here in the new multi track audio panel */
                 /* Track One set here */
@@ -4069,8 +3968,8 @@ if (item == nil)
                 [fAudTrack2CodecPopUp selectItemWithTitle: @"AC3 Passthru"];
                 [self audioTrackPopUpChanged: fAudTrack2CodecPopUp];
             }
-            else if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]] isEqualToString: @"MPEG-4 Video / AAC Audio"] ||
-                     [[NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]] isEqualToString: @"AVC/H.264 Video / AAC Audio"])
+            else if ([[chosenPreset objectForKey:@"FileCodecs"] isEqualToString:@"MPEG-4 Video / AAC Audio"] ||
+                     [[chosenPreset objectForKey:@"FileCodecs"] isEqualToString:@"AVC/H.264 Video / AAC Audio"])
             {
                 if ([fAudLang1PopUp indexOfSelectedItem] > 0)
                 {
@@ -4093,8 +3992,8 @@ if (item == nil)
                     [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
                 }
             }
-            else if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]] isEqualToString: @"MPEG-4 Video / AC-3 Audio"] ||
-                     [[NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]] isEqualToString: @"AVC/H.264 Video / AC-3 Audio"])
+            else if ([[chosenPreset objectForKey:@"FileCodecs"] isEqualToString:@"MPEG-4 Video / AC-3 Audio"] ||
+                     [[chosenPreset objectForKey:@"FileCodecs"] isEqualToString:@"AVC/H.264 Video / AC-3 Audio"])
             {
                 if ([fAudLang1PopUp indexOfSelectedItem] > 0)
                 {
@@ -4117,8 +4016,8 @@ if (item == nil)
                     [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
                 }
             }
-            else if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]] isEqualToString: @"MPEG-4 Video / MP3 Audio"] ||
-                     [[NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]] isEqualToString: @"AVC/H.264 Video / MP3 Audio"])
+            else if ([[chosenPreset objectForKey:@"FileCodecs"] isEqualToString:@"MPEG-4 Video / MP3 Audio"] ||
+                     [[chosenPreset objectForKey:@"FileCodecs"] isEqualToString:@"AVC/H.264 Video / MP3 Audio"])
             {
                 if ([fAudLang1PopUp indexOfSelectedItem] > 0)
                 {
@@ -4141,7 +4040,7 @@ if (item == nil)
                     [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
                 }
             }
-            else if ([[NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]] isEqualToString: @"MPEG-4 Video / Vorbis Audio"])
+            else if ([[chosenPreset objectForKey:@"FileCodecs"] isEqualToString:@"MPEG-4 Video / Vorbis Audio"])
             {
                 if ([fAudLang1PopUp indexOfSelectedItem] > 0)
                 {
@@ -4164,127 +4063,196 @@ if (item == nil)
                     [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
                 }
             }
-            /* We detect here if we have the old audio sample rate and if so we apply samplerate and bitrate to the existing four tracks if chosen 
+            /* We detect here if we have the old audio sample rate and if so we apply samplerate and bitrate to the existing four tracks if chosen
             * UNLESS the CodecPopUp is AC3 in which case the preset values are ignored in favor of rates set in audioTrackMixdownChanged*/
-            if ([chosenPreset valueForKey:@"AudioSampleRate"])
+            if ([chosenPreset objectForKey:@"AudioSampleRate"])
             {
                 if ([fAudLang1PopUp indexOfSelectedItem] > 0 && [fAudTrack1CodecPopUp titleOfSelectedItem] != @"AC3 Passthru")
                 {
-                    [fAudTrack1RatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioSampleRate"]]];
-                    [fAudTrack1BitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioBitRate"]]];
+                    [fAudTrack1RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"AudioSampleRate"]];
+                    [fAudTrack1BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"AudioBitRate"]];
                 }
                 if ([fAudLang2PopUp indexOfSelectedItem] > 0 && [fAudTrack2CodecPopUp titleOfSelectedItem] != @"AC3 Passthru")
                 {
-                    [fAudTrack2RatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioSampleRate"]]];
-                    [fAudTrack2BitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioBitRate"]]];
+                    [fAudTrack2RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"AudioSampleRate"]];
+                    [fAudTrack2BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"AudioBitRate"]];
                 }
                 if ([fAudLang3PopUp indexOfSelectedItem] > 0 && [fAudTrack3CodecPopUp titleOfSelectedItem] != @"AC3 Passthru")
                 {
-                    [fAudTrack3RatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioSampleRate"]]];
-                    [fAudTrack3BitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioBitRate"]]];
+                    [fAudTrack3RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"AudioSampleRate"]];
+                    [fAudTrack3BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"AudioBitRate"]];
                 }
                 if ([fAudLang4PopUp indexOfSelectedItem] > 0 && [fAudTrack4CodecPopUp titleOfSelectedItem] != @"AC3 Passthru")
                 {
-                    [fAudTrack4RatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioSampleRate"]]];
-                    [fAudTrack4BitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioBitRate"]]];
+                    [fAudTrack4RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"AudioSampleRate"]];
+                    [fAudTrack4BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"AudioBitRate"]];
                 }
             }
             /* We detect here if we have the old DRC Slider and if so we apply it to the existing four tracks if chosen */
-            if ([chosenPreset valueForKey:@"AudioDRCSlider"])
+            if ([chosenPreset objectForKey:@"AudioDRCSlider"])
             {
                 if ([fAudLang1PopUp indexOfSelectedItem] > 0)
                 {
-                    [fAudTrack1DrcSlider setFloatValue: [[chosenPreset valueForKey:@"AudioDRCSlider"] floatValue]];
+                    [fAudTrack1DrcSlider setFloatValue:[[chosenPreset objectForKey:@"AudioDRCSlider"] floatValue]];
                     [self audioDRCSliderChanged: fAudTrack1DrcSlider];
                 }
                 if ([fAudLang2PopUp indexOfSelectedItem] > 0)
                 {
-                    [fAudTrack2DrcSlider setFloatValue: [[chosenPreset valueForKey:@"AudioDRCSlider"] floatValue]];
+                    [fAudTrack2DrcSlider setFloatValue:[[chosenPreset objectForKey:@"AudioDRCSlider"] floatValue]];
                     [self audioDRCSliderChanged: fAudTrack2DrcSlider];
                 }
                 if ([fAudLang3PopUp indexOfSelectedItem] > 0)
                 {
-                    [fAudTrack3DrcSlider setFloatValue: [[chosenPreset valueForKey:@"AudioDRCSlider"] floatValue]];
+                    [fAudTrack3DrcSlider setFloatValue:[[chosenPreset objectForKey:@"AudioDRCSlider"] floatValue]];
                     [self audioDRCSliderChanged: fAudTrack3DrcSlider];
                 }
                 if ([fAudLang4PopUp indexOfSelectedItem] > 0)
                 {
-                    [fAudTrack4DrcSlider setFloatValue: [[chosenPreset valueForKey:@"AudioDRCSlider"] floatValue]];
+                    [fAudTrack4DrcSlider setFloatValue:[[chosenPreset objectForKey:@"AudioDRCSlider"] floatValue]];
                     [self audioDRCSliderChanged: fAudTrack4DrcSlider];
                 }
             }
         }
         else // since there was no codecs key in the preset we know we can use new multi-audio track presets
         {
-            if ([chosenPreset valueForKey:@"Audio1Track"] > 0)
+            if ([chosenPreset objectForKey:@"Audio1Track"] > 0)
             {
                 if ([fAudLang1PopUp indexOfSelectedItem] == 0)
                 {
                     [fAudLang1PopUp selectItemAtIndex: 1];
-                    [self audioTrackPopUpChanged: fAudLang1PopUp];
                 }
-                [fAudTrack1CodecPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio1Encoder"]]];
+                [self audioTrackPopUpChanged: fAudLang1PopUp];
+                [fAudTrack1CodecPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio1Encoder"]];
                 [self audioTrackPopUpChanged: fAudTrack1CodecPopUp];
-                [fAudTrack1MixPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio1Mixdown"]]];
-                [fAudTrack1RatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio1Samplerate"]]];
-                [fAudTrack1BitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio1Bitrate"]]];
-                [fAudTrack1DrcSlider setFloatValue: [[chosenPreset valueForKey:@"Audio1TrackDRCSlider"] floatValue]];
+                [fAudTrack1MixPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio1Mixdown"]];
+                /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
+                 * mixdown*/
+                if  ([fAudTrack1MixPopUp selectedItem] == nil)
+                {
+                    [self audioTrackPopUpChanged: fAudTrack1CodecPopUp];
+                }
+                [fAudTrack1RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio1Samplerate"]];
+                /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
+                if (![[chosenPreset objectForKey:@"Audio1Encoder"] isEqualToString:@"AC3 Passthru"])
+                {
+                    [fAudTrack1BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio1Bitrate"]];
+                }
+                [fAudTrack1DrcSlider setFloatValue:[[chosenPreset objectForKey:@"Audio1TrackDRCSlider"] floatValue]];
                 [self audioDRCSliderChanged: fAudTrack1DrcSlider];
             }
-            if ([chosenPreset valueForKey:@"Audio2Track"] > 0)
+            if ([chosenPreset objectForKey:@"Audio2Track"] > 0)
             {
                 if ([fAudLang2PopUp indexOfSelectedItem] == 0)
                 {
                     [fAudLang2PopUp selectItemAtIndex: 1];
-                    [self audioTrackPopUpChanged: fAudLang2PopUp];
                 }
-                [fAudTrack2CodecPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio2Encoder"]]];
+                [self audioTrackPopUpChanged: fAudLang2PopUp];
+                [fAudTrack2CodecPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio2Encoder"]];
                 [self audioTrackPopUpChanged: fAudTrack2CodecPopUp];
-                [fAudTrack2MixPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio2Mixdown"]]];
-                [fAudTrack2RatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio2Samplerate"]]];
-                [fAudTrack2BitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio2Bitrate"]]];
-                [fAudTrack2DrcSlider setFloatValue: [[chosenPreset valueForKey:@"Audio2TrackDRCSlider"] floatValue]];
+                [fAudTrack2MixPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio2Mixdown"]];
+                /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
+                 * mixdown*/
+                if  ([fAudTrack2MixPopUp selectedItem] == nil)
+                {
+                    [self audioTrackPopUpChanged: fAudTrack2CodecPopUp];
+                }
+                [fAudTrack2RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio2Samplerate"]];
+                /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
+                if (![[chosenPreset objectForKey:@"Audio2Encoder"] isEqualToString:@"AC3 Passthru"])
+                {
+                    [fAudTrack2BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio2Bitrate"]];
+                }
+                [fAudTrack2DrcSlider setFloatValue:[[chosenPreset objectForKey:@"Audio2TrackDRCSlider"] floatValue]];
                 [self audioDRCSliderChanged: fAudTrack2DrcSlider];
             }
-            if ([chosenPreset valueForKey:@"Audio3Track"] > 0)
+            if ([chosenPreset objectForKey:@"Audio3Track"] > 0)
             {
                 if ([fAudLang3PopUp indexOfSelectedItem] == 0)
                 {
                     [fAudLang3PopUp selectItemAtIndex: 1];
-                    [self audioTrackPopUpChanged: fAudLang3PopUp];
                 }
-                [fAudTrack3CodecPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio3Encoder"]]];
+                [self audioTrackPopUpChanged: fAudLang3PopUp];
+                [fAudTrack3CodecPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio3Encoder"]];
                 [self audioTrackPopUpChanged: fAudTrack3CodecPopUp];
-                [fAudTrack3MixPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio3Mixdown"]]];
-                [fAudTrack3RatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio3Samplerate"]]];
-                [fAudTrack3BitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio3Bitrate"]]];
-                [fAudTrack3DrcSlider setFloatValue: [[chosenPreset valueForKey:@"Audio3TrackDRCSlider"] floatValue]];
+                [fAudTrack3MixPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio3Mixdown"]];
+                /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
+                 * mixdown*/
+                if  ([fAudTrack3MixPopUp selectedItem] == nil)
+                {
+                    [self audioTrackPopUpChanged: fAudTrack3CodecPopUp];
+                }
+                [fAudTrack3RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio3Samplerate"]];
+                /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
+                if (![[chosenPreset objectForKey:@"Audio3Encoder"] isEqualToString: @"AC3 Passthru"])
+                {
+                    [fAudTrack3BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio3Bitrate"]];
+                }
+                [fAudTrack3DrcSlider setFloatValue:[[chosenPreset objectForKey:@"Audio3TrackDRCSlider"] floatValue]];
                 [self audioDRCSliderChanged: fAudTrack3DrcSlider];
             }
-            if ([chosenPreset valueForKey:@"Audio4Track"] > 0)
+            if ([chosenPreset objectForKey:@"Audio4Track"] > 0)
             {
                 if ([fAudLang4PopUp indexOfSelectedItem] == 0)
                 {
                     [fAudLang4PopUp selectItemAtIndex: 1];
-                    [self audioTrackPopUpChanged: fAudLang4PopUp];
                 }
-                [fAudTrack4CodecPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio4Encoder"]]];
+                [self audioTrackPopUpChanged: fAudLang4PopUp];
+                [fAudTrack4CodecPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio4Encoder"]];
                 [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
-                [fAudTrack4MixPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio4Mixdown"]]];
-                [fAudTrack4RatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio4Samplerate"]]];
-                [fAudTrack4BitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Audio4Bitrate"]]];
-                [fAudTrack4DrcSlider setFloatValue: [[chosenPreset valueForKey:@"Audio4TrackDRCSlider"] floatValue]];
+                [fAudTrack4MixPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio4Mixdown"]];
+                /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
+                 * mixdown*/
+                if  ([fAudTrack4MixPopUp selectedItem] == nil)
+                {
+                    [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
+                }
+                [fAudTrack4RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio4Samplerate"]];
+                /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
+                if (![[chosenPreset objectForKey:@"Audio4Encoder"] isEqualToString:@"AC3 Passthru"])
+                {
+                    [fAudTrack4BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio4Bitrate"]];
+                }
+                [fAudTrack4DrcSlider setFloatValue:[[chosenPreset objectForKey:@"Audio4TrackDRCSlider"] floatValue]];
                 [self audioDRCSliderChanged: fAudTrack4DrcSlider];
             }
-            
-            
+
+
         }
-        
+
+        /* We now cleanup any extra audio tracks that may be previously set if we need to, we do it here so we don't have to
+         * duplicate any code for legacy presets.*/
+        /* First we handle the legacy Codecs crazy AVC/H.264 Video / AAC + AC3 Audio atv hybrid */
+        if ([chosenPreset objectForKey:@"FileCodecs"] && [[chosenPreset objectForKey:@"FileCodecs"] isEqualToString:@"AVC/H.264 Video / AAC + AC3 Audio"])
+        {
+            [fAudLang3PopUp selectItemAtIndex: 0];
+            [self audioTrackPopUpChanged: fAudLang3PopUp];
+            [fAudLang4PopUp selectItemAtIndex: 0];
+            [self audioTrackPopUpChanged: fAudLang4PopUp];
+        }
+        else
+        {
+            if (![chosenPreset objectForKey:@"Audio2Track"] || [chosenPreset objectForKey:@"Audio2Track"] == 0)
+            {
+                [fAudLang2PopUp selectItemAtIndex: 0];
+                [self audioTrackPopUpChanged: fAudLang2PopUp];
+            }
+            if (![chosenPreset objectForKey:@"Audio3Track"] || [chosenPreset objectForKey:@"Audio3Track"] > 0)
+            {
+                [fAudLang3PopUp selectItemAtIndex: 0];
+                [self audioTrackPopUpChanged: fAudLang3PopUp];
+            }
+            if (![chosenPreset objectForKey:@"Audio4Track"] || [chosenPreset objectForKey:@"Audio4Track"] > 0)
+            {
+                [fAudLang4PopUp selectItemAtIndex: 0];
+                [self audioTrackPopUpChanged: fAudLang4PopUp];
+            }
+        }
+
         /*Subtitles*/
-        [fSubPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Subtitles"]]];
+        [fSubPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Subtitles"]];
         /* Forced Subtitles */
         [fSubForcedCheck setState:[[chosenPreset objectForKey:@"SubtitlesForced"] intValue]];
-           
+
         /* Picture Settings */
         /* Note: objectForKey:@"UsesPictureSettings" now refers to picture size, this encompasses:
          * height, width, keep ar, anamorphic and crop settings.
@@ -4302,7 +4270,7 @@ if (item == nil)
             if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] == 2 || [[chosenPreset objectForKey:@"UsesMaxPictureSettings"]  intValue] == 1)
             {
                 /* Use Max Picture settings for whatever the dvd is.*/
-                [self revertPictureSizeToMax: NULL];
+                [self revertPictureSizeToMax:nil];
                 job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
                 if (job->keep_ratio == 1)
                 {
@@ -4429,13 +4397,13 @@ if (item == nil)
                     {
                         [fPictureController setDeblock:0];
                     }
-                    
-                    [self calculatePictureSizing: NULL];
+
+                   [self calculatePictureSizing:nil];
                 }
-                
+
             }
-            
-            
+
+
         }
         /* If the preset has an objectForKey:@"UsesPictureFilters", then we know it is a newer style filters preset
          * and handle the filters here depending on whether or not the preset specifies applying the filter.
@@ -4507,10 +4475,9 @@ if (item == nil)
             else
             {
                 [fPictureController setDecomb:0];
-            }             
+            }
         }
-        [self calculatePictureSizing: NULL];
-        [[fPresetsActionMenu itemAtIndex:0] setEnabled: YES];
+        [self calculatePictureSizing:nil];
     }
 }
 
@@ -4525,16 +4492,16 @@ if (item == nil)
     UserPresetsFile = @"~/Library/Application Support/HandBrake/UserPresets.plist";
        UserPresetsFile = [[UserPresetsFile stringByExpandingTildeInPath]retain];
     /* We check for the presets.plist */
-       if ([fileManager fileExistsAtPath:UserPresetsFile] == 0) 
+       if ([fileManager fileExistsAtPath:UserPresetsFile] == 0)
        {
                [fileManager createFileAtPath:UserPresetsFile contents:nil attributes:nil];
        }
-               
+
        UserPresets = [[NSMutableArray alloc] initWithContentsOfFile:UserPresetsFile];
-       if (nil == UserPresets) 
+       if (nil == UserPresets)
        {
                UserPresets = [[NSMutableArray alloc] init];
-               [self addFactoryPresets:NULL];
+               [self addFactoryPresets:nil];
        }
        [fPresetsOutlineView reloadData];
 }
@@ -4557,7 +4524,7 @@ if (item == nil)
        [fPresetNewName setStringValue: @""];
        [fPresetNewDesc setStringValue: @""];
        /* Show the panel */
-       [NSApp beginSheet: fAddPresetPanel modalForWindow: fWindow modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
+       [NSApp beginSheet:fAddPresetPanel modalForWindow:fWindow modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
 }
 
 - (IBAction) closeAddPresetPanel: (id) sender
@@ -4575,8 +4542,8 @@ if (item == nil)
         /* Here we create a custom user preset */
         [UserPresets addObject:[self createPreset]];
         [self addPreset];
-        
-        [self closeAddPresetPanel:NULL];
+
+        [self closeAddPresetPanel:nil];
     }
 }
 - (void)addPreset
@@ -4645,22 +4612,22 @@ if (item == nil)
     [preset setObject:[NSNumber numberWithInt:[fDstMp4HttpOptFileCheck state]] forKey:@"Mp4HttpOptimize"];
     /* Add iPod uuid atom */
     [preset setObject:[NSNumber numberWithInt:[fDstMp4iPodFileCheck state]] forKey:@"Mp4iPodCompatible"];
-    
+
     /* Codecs */
        /* Video encoder */
        [preset setObject:[fVidEncoderPopUp titleOfSelectedItem] forKey:@"VideoEncoder"];
        /* x264 Option String */
        [preset setObject:[fAdvancedOptions optionsString] forKey:@"x264Option"];
-       
+
        [preset setObject:[NSNumber numberWithInt:[fVidQualityMatrix selectedRow]] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
        [preset setObject:[fVidBitrateField stringValue] forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
+
        /* Video framerate */
     if ([fVidRatePopUp indexOfSelectedItem] == 0) // Same as source is selected
        {
-    [preset setObject:[NSString stringWithFormat: @"Same as source"] forKey:@"VideoFramerate"];
+        [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
     }
     else // we can record the actual titleOfSelectedItem
     {
@@ -4754,7 +4721,7 @@ if (item == nil)
 {
     [UserPresets writeToFile:UserPresetsFile atomically:YES];
        /* We get the default preset in case it changed */
-       [self getDefaultPresets: NULL];
+       [self getDefaultPresets:nil];
 
 }
 
@@ -4853,12 +4820,12 @@ if (item == nil)
        if (presetUserDefault)
        {
        [fPresetsOutlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:presetUserDefault] byExtendingSelection:NO];
-       [self selectPreset:NULL];
+       [self selectPreset:nil];
        }
        else if (presetHbDefault) //else we use the built in default presetHbDefault
        {
        [fPresetsOutlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:presetHbDefault] byExtendingSelection:NO];
-       [self selectPreset:NULL];
+       [self selectPreset:nil];
        }
 }