OSDN Git Service

MacGui: add "Open Source (Specify Title)" feature
[handbrake-jp/handbrake-jp-git.git] / macosx / Controller.mm
index 2323029..79c9d6c 100644 (file)
@@ -21,14 +21,6 @@ static int FormatSettings[4][10] =
   { { HB_MUX_MP4 | HB_VCODEC_FFMPEG | HB_ACODEC_FAAC,
          HB_MUX_MP4 | HB_VCODEC_X264   | HB_ACODEC_FAAC,
          0,
-         0},
-    { HB_MUX_AVI | HB_VCODEC_FFMPEG | HB_ACODEC_LAME,
-         HB_MUX_AVI | HB_VCODEC_FFMPEG | HB_ACODEC_AC3,
-         HB_MUX_AVI | HB_VCODEC_X264   | HB_ACODEC_LAME,
-         HB_MUX_AVI | HB_VCODEC_X264   | HB_ACODEC_AC3},
-    { HB_MUX_OGM | HB_VCODEC_FFMPEG | HB_ACODEC_VORBIS,
-         HB_MUX_OGM | HB_VCODEC_FFMPEG | HB_ACODEC_LAME,
-         0,
          0 },
     { HB_MUX_MKV | HB_VCODEC_FFMPEG | HB_ACODEC_FAAC,
          HB_MUX_MKV | HB_VCODEC_FFMPEG | HB_ACODEC_AC3,
@@ -39,9 +31,16 @@ static int FormatSettings[4][10] =
          HB_MUX_MKV | HB_VCODEC_X264   | HB_ACODEC_LAME,
          HB_MUX_MKV | HB_VCODEC_X264   | HB_ACODEC_VORBIS,
          0,
+         0 },
+    { HB_MUX_AVI | HB_VCODEC_FFMPEG | HB_ACODEC_LAME,
+         HB_MUX_AVI | HB_VCODEC_FFMPEG | HB_ACODEC_AC3,
+         HB_MUX_AVI | HB_VCODEC_X264   | HB_ACODEC_LAME,
+         HB_MUX_AVI | HB_VCODEC_X264   | HB_ACODEC_AC3},
+    { HB_MUX_OGM | HB_VCODEC_FFMPEG | HB_ACODEC_VORBIS,
+         HB_MUX_OGM | HB_VCODEC_FFMPEG | HB_ACODEC_LAME,
+         0,
          0 } };
 
-
 /* We setup the toolbar values here */
 static NSString *        ToggleDrawerIdentifier             = @"Toggle Drawer Item Identifier";
 static NSString *        StartEncodingIdentifier            = @"Start Encoding Item Identifier";
@@ -62,6 +61,21 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     self = [super init];
     [HBPreferencesController registerUserDefaults];
     fHandle = NULL;
+    /* Check for check for the app support directory here as
+        * outputPanel needs it right away, as may other future methods
+        */
+    /* We declare the default NSFileManager into fileManager */
+       NSFileManager * fileManager = [NSFileManager defaultManager];
+       /* we set the files and support paths here */
+       AppSupportDirectory = @"~/Library/Application Support/HandBrake";
+    AppSupportDirectory = [AppSupportDirectory stringByExpandingTildeInPath];
+    /* We check for the app support directory for handbrake */
+       if ([fileManager fileExistsAtPath:AppSupportDirectory] == 0) 
+       {
+               // If it doesnt exist yet, we create it here 
+               [fileManager createDirectoryAtPath:AppSupportDirectory attributes:nil];
+       }
+    
     outputPanel = [[HBOutputPanelController alloc] init];
     fPictureController = [[PictureController alloc] initWithDelegate:self];
     fQueueController = [[HBQueueController alloc] init];
@@ -70,15 +84,16 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     return self;
 }
 
+
 - (void) applicationDidFinishLaunching: (NSNotification *) notification
 {
     int    build;
     char * version;
-
+    
     // Init libhb
        int debugLevel = [[NSUserDefaults standardUserDefaults] boolForKey:@"ShowVerboseOutput"] ? HB_DEBUG_ALL : HB_DEBUG_NONE;
     fHandle = hb_init(debugLevel, [[NSUserDefaults standardUserDefaults] boolForKey:@"CheckForUpdates"]);
-
+    
        // Set the Growl Delegate
     [GrowlApplicationBridge setGrowlDelegate: self];    
     /* Init others controllers */
@@ -88,40 +103,62 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        
     fChapterTitlesDelegate = [[ChapterTitles alloc] init];
     [fChapterTable setDataSource:fChapterTitlesDelegate];
-
-     /* Call UpdateUI every 1/2 sec */
+    
+    /* Call UpdateUI every 1/2 sec */
     [[NSRunLoop currentRunLoop] addTimer: [NSTimer
         scheduledTimerWithTimeInterval: 0.5 target: self
-        selector: @selector( updateUI: ) userInfo: NULL repeats: YES]
-        forMode: NSEventTrackingRunLoopMode];
-
-    if( ( build = hb_check_update( fHandle, &version ) ) > -1 )
-    {
-        /* Update available - tell the user */
-       
-        NSBeginInformationalAlertSheet( _( @"Update is available" ),
-            _( @"Go get it!" ), _( @"Discard" ), NULL, fWindow, self,
-            @selector( updateAlertDone:returnCode:contextInfo: ),
-            NULL, NULL, [NSString stringWithFormat:
-            _( @"HandBrake %s (build %d) is now available for download." ),
-            version, build] );
-        return;
-
-    }
-
+                              selector: @selector( updateUI: ) userInfo: NULL 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];
+    
+    if( ( build = hb_check_update( fHandle, &version ) ) > -1 )
+    {
+        /* Update available - tell the user */
+        
+        NSBeginInformationalAlertSheet( _( @"Update is available" ),
+                                        _( @"Go get it!" ), _( @"Discard" ), NULL, fWindow, self,
+                                        @selector( updateAlertDone:returnCode:contextInfo: ),
+                                        NULL, NULL, [NSString stringWithFormat:
+                                            _( @"HandBrake %s (build %d) is now available for download." ),
+                                            version, build] );
+        return;
+        
+    }
        
-    /* Show scan panel ASAP */
-    [self performSelectorOnMainThread: @selector(showScanPanel:)
-        withObject: NULL waitUntilDone: NO];
+    /* Show Browse Sources Window ASAP */
+    [self performSelectorOnMainThread: @selector(browseSources:)
+                           withObject: NULL waitUntilDone: NO];
+                           }
+
+- (void) updateAlertDone: (NSWindow *) sheet
+              returnCode: (int) returnCode contextInfo: (void *) contextInfo
+{
+    if( returnCode == NSAlertDefaultReturn )
+    {
+        /* Go to HandBrake homepage and exit */
+        [self openHomepage: NULL];
+        [NSApp terminate: self];
+     
+    }
+    else
+    {
+         /* Show scan panel */
+        [self performSelectorOnMainThread: @selector(showScanPanel:)
+                               withObject: NULL waitUntilDone: NO];
+        return;
+               /* Go to HandBrake homepage and exit */
+        [self openHomepage: NULL];
+        [NSApp terminate: self];
+    }
 }
 
 - (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication *) app
@@ -199,9 +236,9 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     /* Destination box*/
     [fDstFormatPopUp removeAllItems];
     [fDstFormatPopUp addItemWithTitle: _( @"MP4 file" )];
+       [fDstFormatPopUp addItemWithTitle: _( @"MKV file" )];
     [fDstFormatPopUp addItemWithTitle: _( @"AVI file" )];
     [fDstFormatPopUp addItemWithTitle: _( @"OGM file" )];
-       [fDstFormatPopUp addItemWithTitle: _( @"MKV file" )];
     [fDstFormatPopUp selectItemAtIndex: 0];
        
     [self formatPopUpChanged: NULL];
@@ -308,315 +345,82 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     
 }
 
-- (void) loadPresets {
-       /* We declare the default NSFileManager into fileManager */
-       NSFileManager * fileManager = [NSFileManager defaultManager];
-       /* we set the files and support paths here */
-       AppSupportDirectory = @"~/Library/Application Support/HandBrake";
-    AppSupportDirectory = [AppSupportDirectory stringByExpandingTildeInPath];
-    //UserPresetsFile = @"~/Library/Application Support/HandBrake/UserPresets.plist";
-    //UserPresetsFile = [UserPresetsFile stringByExpandingTildeInPath];
-       /* We check for the app support directory for handbrake */
-       if ([fileManager fileExistsAtPath:AppSupportDirectory] == 0) 
-       {
-               // If it doesnt exist yet, we create it here 
-               [fileManager createDirectoryAtPath:AppSupportDirectory attributes:nil];
-       }
-       /* We check for the presets.plist here */
-       if ([fileManager fileExistsAtPath:UserPresetsFile] == 0) 
-       {
-               [fileManager createFileAtPath:UserPresetsFile contents:nil attributes:nil];
-       }
-       UserPresetsFile = @"~/Library/Application Support/HandBrake/UserPresets.plist";
-       UserPresetsFile = [[UserPresetsFile stringByExpandingTildeInPath]retain];
-       
-       UserPresets = [[NSMutableArray alloc] initWithContentsOfFile:UserPresetsFile];
-       if (nil == UserPresets) 
-       {
-               UserPresets = [[NSMutableArray alloc] init];
-               [self addFactoryPresets:NULL];
-       }
-       
-}
-
-// ============================================================
-// NSToolbar Related Methods
-// ============================================================
-
-- (void) setupToolbar {
-    toolbar = [[[NSToolbar alloc] initWithIdentifier: @"HandBrake Toolbar"] autorelease];
-    
-    [toolbar setAllowsUserCustomization: YES];
-    [toolbar setAutosavesConfiguration: YES];
-    [toolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel];
-    
-    [toolbar setDelegate: self];
-    
-    [fWindow setToolbar: toolbar];
-}
+- (void) TranslateStrings
+{
+    [fSrcTitleField     setStringValue: _( @"Title:" )];
+    [fSrcChapterField   setStringValue: _( @"Chapters:" )];
+    [fSrcChapterToField setStringValue: _( @"to" )];
+    [fSrcDuration1Field setStringValue: _( @"Duration:" )];
 
-- (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier:
-    (NSString *) itemIdent willBeInsertedIntoToolbar:(BOOL) willBeInserted {
-    NSToolbarItem * item = [[NSToolbarItem alloc] initWithItemIdentifier: itemIdent];
-    
-    if ([itemIdent isEqualToString: ToggleDrawerIdentifier])
-    {
-        [item setLabel: @"Toggle Presets"];
-        [item setPaletteLabel: @"Toggler Presets"];
-        [item setToolTip: @"Open/Close Preset Drawer"];
-        [item setImage: [NSImage imageNamed: @"Drawer-List2"]];
-        [item setTarget: self];
-        [item setAction: @selector(toggleDrawer:)];
-        [item setAutovalidates: NO];
-    }
-    else if ([itemIdent isEqualToString: StartEncodingIdentifier])
-    {
-        [item setLabel: @"Start"];
-        [item setPaletteLabel: @"Start Encoding"];
-        [item setToolTip: @"Start Encoding"];
-        [item setImage: [NSImage imageNamed: @"Play"]];
-        [item setTarget: self];
-        [item setAction: @selector(Rip:)];
-    }
-    else if ([itemIdent isEqualToString: ShowQueueIdentifier])
-    {
-        [item setLabel: @"Show Queue"];
-        [item setPaletteLabel: @"Show Queue"];
-        [item setToolTip: @"Show Queue"];
-        [item setImage: [NSImage imageNamed: @"Brushed Window"]];
-        [item setTarget: self];
-        [item setAction: @selector(showQueueWindow:)];
-        [item setAutovalidates: NO];
-    }
-    else if ([itemIdent isEqualToString: AddToQueueIdentifier])
-    {
-        [item setLabel: @"Add to Queue"];
-        [item setPaletteLabel: @"Add to Queue"];
-        [item setToolTip: @"Add to Queue"];
-        [item setImage: [NSImage imageNamed: @"Add"]];
-        [item setTarget: self];
-        [item setAction: @selector(addToQueue:)];
-    }
-    else if ([itemIdent isEqualToString: PauseEncodingIdentifier])
-    {
-        [item setLabel: @"Pause"];
-        [item setPaletteLabel: @"Pause Encoding"];
-        [item setToolTip: @"Pause Encoding"];
-        [item setImage: [NSImage imageNamed: @"Pause"]];
-        [item setTarget: self];
-        [item setAction: @selector(Pause:)];
-    }
-    else if ([itemIdent isEqualToString: ShowActivityIdentifier]) {
-        [item setLabel: @"Activity Window"];
-        [item setPaletteLabel: @"Show Activity Window"];
-        [item setToolTip: @"Show Activity Window"];
-        [item setImage: [NSImage imageNamed: @"Terminal"]];
-        [item setTarget: self];
-        [item setAction: @selector(showDebugOutputPanel:)];
-        [item setAutovalidates: NO];
-    }
-    else if ([itemIdent isEqualToString: ChooseSourceIdentifier])
-    {
-        [item setLabel: @"Source"];
-        [item setPaletteLabel: @"Source"];
-        [item setToolTip: @"Choose Video Source"];
-        [item setImage: [NSImage imageNamed: @"Disc"]];
-        [item setTarget: self];
-        [item setAction: @selector(showScanPanel:)];
-        [item setAutovalidates: NO];
-    }
-    else
-    {
-        [item release];
-        return nil;
-    }
+    [fDstFormatField    setStringValue: _( @"Format:" )];
+    [fDstCodecsField    setStringValue: _( @"Codecs:" )];
+    [fDstFile1Field     setStringValue: _( @"File:" )];
+    [fDstBrowseButton   setTitle:       _( @"Browse" )];
 
-    return item;
+    [fVidRateField      setStringValue: _( @"Framerate (fps):" )];
+    [fVidEncoderField   setStringValue: _( @"Encoder:" )];
+    [fVidQualityField   setStringValue: _( @"Quality:" )];
 }
 
-- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar
-{
-    return [NSArray arrayWithObjects: ChooseSourceIdentifier, NSToolbarSeparatorItemIdentifier, StartEncodingIdentifier,
-        PauseEncodingIdentifier, AddToQueueIdentifier, ShowQueueIdentifier, NSToolbarFlexibleSpaceItemIdentifier, 
-               NSToolbarSpaceItemIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier, nil];
-}
 
-- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar
+- (void) enableUI: (bool) b
 {
-    return [NSArray arrayWithObjects:  StartEncodingIdentifier, PauseEncodingIdentifier, AddToQueueIdentifier,
-        ChooseSourceIdentifier, ShowQueueIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier,
-        NSToolbarCustomizeToolbarItemIdentifier, NSToolbarFlexibleSpaceItemIdentifier,
-        NSToolbarSpaceItemIdentifier, NSToolbarSeparatorItemIdentifier, nil];
-}
+    NSControl * controls[] =
+      { fSrcTitleField, fSrcTitlePopUp,
+        fSrcChapterField, fSrcChapterStartPopUp, fSrcChapterToField,
+        fSrcChapterEndPopUp, fSrcDuration1Field, fSrcDuration2Field,
+        fDstFormatField, fDstFormatPopUp, fDstCodecsField,
+        fDstCodecsPopUp, fDstFile1Field, fDstFile2Field,
+        fDstBrowseButton, fVidRateField, fVidRatePopUp,
+        fVidEncoderField, fVidEncoderPopUp, fVidQualityField,
+        fVidQualityMatrix, fVidGrayscaleCheck, fSubField, fSubPopUp,
+        fAudLang1Field, fAudLang1PopUp, fAudLang2Field, fAudLang2PopUp,
+        fAudTrack1MixLabel, fAudTrack1MixPopUp, fAudTrack2MixLabel, fAudTrack2MixPopUp,
+        fAudRateField, fAudRatePopUp, fAudBitrateField,
+        fAudBitratePopUp, fPictureButton,fQueueStatus, 
+               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,fPicSettingDeblock,fPicLabelDeblock,};
 
-- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem
-{
-    NSString * ident = [toolbarItem itemIdentifier];
-        
-    if (fHandle)
+    for( unsigned i = 0;
+         i < sizeof( controls ) / sizeof( NSControl * ); i++ )
     {
-        hb_state_t s;
-        hb_get_state2( fHandle, &s );
-        
-        if (s.state == HB_STATE_WORKING || s.state == HB_STATE_MUXING)
+        if( [[controls[i] className] isEqualToString: @"NSTextField"] )
         {
-            if ([ident isEqualToString: StartEncodingIdentifier])
+            NSTextField * tf = (NSTextField *) controls[i];
+            if( ![tf isBezeled] )
             {
-                [toolbarItem setImage: [NSImage imageNamed: @"Stop"]];
-                [toolbarItem setLabel: @"Stop"];
-                [toolbarItem setPaletteLabel: @"Stop"];
-                [toolbarItem setToolTip: @"Stop Encoding"];
-                return YES;
+                [tf setTextColor: b ? [NSColor controlTextColor] :
+                    [NSColor disabledControlTextColor]];
+                continue;
             }
-            if ([ident isEqualToString: PauseEncodingIdentifier])
-            {
-                [toolbarItem setImage: [NSImage imageNamed: @"Pause"]];
-                [toolbarItem setLabel: @"Pause"];
-                [toolbarItem setPaletteLabel: @"Pause Encoding"];
-                [toolbarItem setToolTip: @"Pause Encoding"];
-                return YES;
-            }
-            if (SuccessfulScan)
-                if ([ident isEqualToString: AddToQueueIdentifier])
-                    return YES;
-        }
-        else if (s.state == HB_STATE_PAUSED)
-        {
-            if ([ident isEqualToString: PauseEncodingIdentifier])
-            {
-                [toolbarItem setImage: [NSImage imageNamed: @"Play"]];
-                [toolbarItem setLabel: @"Resume"];
-                [toolbarItem setPaletteLabel: @"Resume Encoding"];
-                [toolbarItem setToolTip: @"Resume Encoding"];
-                return YES;
-            }
-            if ([ident isEqualToString: StartEncodingIdentifier])
-                return YES;
-            if ([ident isEqualToString: AddToQueueIdentifier])
-                return YES;
-        }
-        else if (s.state == HB_STATE_SCANNING)
-            return NO;
-        else if (s.state == HB_STATE_WORKDONE || s.state == HB_STATE_SCANDONE || SuccessfulScan)
-        {
-            if ([ident isEqualToString: StartEncodingIdentifier])
-            {
-                [toolbarItem setImage: [NSImage imageNamed: @"Play"]];
-                if (hb_count(fHandle) > 0)
-                    [toolbarItem setLabel: @"Start Queue"];
-                else
-                    [toolbarItem setLabel: @"Start"];
-                [toolbarItem setPaletteLabel: @"Start Encoding"];
-                [toolbarItem setToolTip: @"Start Encoding"];
-                return YES;
-            }
-            if ([ident isEqualToString: AddToQueueIdentifier])
-                return YES;
         }
+        [controls[i] setEnabled: b];
 
     }
-    
-    if ([ident isEqualToString: ShowQueueIdentifier])
-        return YES;
-    if ([ident isEqualToString: ToggleDrawerIdentifier])
-        return YES;
-    if ([ident isEqualToString: ChooseSourceIdentifier])
-        return YES;
-    if ([ident isEqualToString: ShowActivityIdentifier])
-        return YES;
-    
-    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]; 
-
-    return registrationDictionary; 
-} 
+       
+       if (b) {
 
-- (void) TranslateStrings
-{
-    [fSrcTitleField     setStringValue: _( @"Title:" )];
-    [fSrcChapterField   setStringValue: _( @"Chapters:" )];
-    [fSrcChapterToField setStringValue: _( @"to" )];
-    [fSrcDuration1Field setStringValue: _( @"Duration:" )];
+        /* 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];
+       
+       } else {
 
-    [fDstFormatField    setStringValue: _( @"Format:" )];
-    [fDstCodecsField    setStringValue: _( @"Codecs:" )];
-    [fDstFile1Field     setStringValue: _( @"File:" )];
-    [fDstBrowseButton   setTitle:       _( @"Browse" )];
+               [tableView setEnabled: NO];
+       
+       }
 
-    [fVidRateField      setStringValue: _( @"Framerate (fps):" )];
-    [fVidEncoderField   setStringValue: _( @"Encoder:" )];
-    [fVidQualityField   setStringValue: _( @"Quality:" )];
+    [self videoMatrixChanged: NULL];
+    [fAdvancedOptions enableUI:b];
 }
 
+
 /***********************************************************************
  * UpdateDockIcon
  ***********************************************************************
@@ -793,6 +597,9 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                 frame.origin.y -= 36;
                 [fWindow setFrame:frame display:YES animate:YES];
                 fRipIndicatorShown = YES;
+                /* We check to see if we need to warn the user that the computer will go to sleep
+                   or shut down when encoding is finished */
+                [self remindUserOfSleepOrShutdown];
             }
 
             /* Update dock icon */
@@ -800,12 +607,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                        
             // Has current job changed? That means the queue has probably changed as
                        // well so update it
-            if (fLastKnownCurrentJob != hb_current_job(fHandle))
-            {
-                fLastKnownCurrentJob = hb_current_job(fHandle);
-                [fQueueController updateQueueUI];
-            }
-            [fQueueController updateCurrentJobUI];
+            [fQueueController hblibStateChanged: s];
             
             break;
         }
@@ -829,7 +631,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             [self UpdateDockIcon: 1.0];
                        
                        // Pass along the info to HBQueueController
-            [fQueueController updateCurrentJobUI];
+            [fQueueController hblibStateChanged: s];
                        
             break;
         }
@@ -839,7 +641,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                    [fStatusField setStringValue: _( @"Paused" )];
             
                        // Pass along the info to HBQueueController
-            [fQueueController updateCurrentJobUI];
+            [fQueueController hblibStateChanged: s];
 
             break;
                        
@@ -885,10 +687,8 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                                fRipIndicatorShown = NO;
                        }
                        
-            // Queue has been modified so update the UI
-                       fLastKnownCurrentJob = nil;
-            [fQueueController updateQueueUI];
-            [fQueueController updateCurrentJobUI];
+                       // Pass along the info to HBQueueController
+            [fQueueController hblibStateChanged: s];
                        
             /* Check to see if the encode state has not been cancelled
                                to determine if we should check for encode done notifications */
@@ -975,349 +775,536 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        }
 }
 
-- (IBAction) showNewScan:(id)sender
-{
-       hb_list_t  * list;
-       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 Title Found"];
-        SuccessfulScan = 0;
-       }
-       else
-       {
-     /* We increment the successful scancount here by one,
-                  which we use at the end of this function to tell the gui
-                  if this is the first successful scan since launch and whether
-                  or not we should set all settings to the defaults */
-               
-        SuccessfulScan = 1;
-        currentSuccessfulScanCount++;
-
-               [self enableUI: YES];
 
-        [toolbar validateVisibleItems];
-               
-               [fSrcTitlePopUp removeAllItems];
-               for( int i = 0; i < hb_list_count( list ); i++ )
-               {
-                       title = (hb_title_t *) hb_list_item( list, i );
-                       /*Set DVD Name at top of window*/
-                       [fSrcDVD2Field setStringValue:[NSString stringWithUTF8String: title->name]];
-                       
-                       currentSource = [NSString stringWithUTF8String: title->dvd];
-                       
-                       
-                       /* 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"])
-                       {
-                               [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                                       @"%@/%@.mp4", [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"],[NSString
-                  stringWithUTF8String: title->name]]];
-                       }
-                       else
-                       {
-                               [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                                       @"%@/Desktop/%@.mp4", NSHomeDirectory(),[NSString
-                  stringWithUTF8String: title->name]]];
-                       }
-                       
-                       
-                       if (longuestpri < title->hours*60*60 + title->minutes *60 + title->seconds)
-                       {
-                               longuestpri=title->hours*60*60 + title->minutes *60 + title->seconds;
-                               indxpri=i;
-                       }
-                       
-                       
-                       int format = [fDstFormatPopUp indexOfSelectedItem];
-                       char * ext = NULL;
-                       switch( format )
-                       {
-                               case 0:
-                                       
-                                       /*Get Default MP4 File Extension for mpeg4 (.mp4 or .m4v) from prefs*/
-                                       if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultMpegName"] > 0)
-                                       {
-                                               ext = "m4v";
-                                       }
-                                       else
-                                       {
-                                               ext = "mp4";
-                                       }
-                                       break;
-                               case 1: 
-                                       ext = "avi";
-                                       break;
-                               case 2:
-                                       ext = "ogm";
-                                       break;
-                               case 3:
-                                       ext = "mkv";
-                                       break;
-                       }
-                       
-                       
-                       NSString * string = [fDstFile2Field stringValue];
-                       /* Add/replace File Output name to the correct extension*/
-                       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]];
-                       }
-                       
-                       
-                       [fSrcTitlePopUp addItemWithTitle: [NSString
-                    stringWithFormat: @"%d - %02dh%02dm%02ds",
-                               title->index, title->hours, title->minutes,
-                               title->seconds]];
-                       
-               }
-               // Select the longuest title
-               [fSrcTitlePopUp selectItemAtIndex: indxpri];
-               [self titlePopUpChanged: NULL];
-               
-               
-               
-               [self enableUI: YES];
-               
-               /* 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 (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];
-          }
-       
-       }
-}
+#pragma mark -
+#pragma mark Toolbar
+// ============================================================
+// NSToolbar Related Methods
+// ============================================================
 
--(IBAction)showGrowlDoneNotification:(id)sender
-{
-  [GrowlApplicationBridge 
-          notifyWithTitle:@"Put down that cocktail..." 
-              description:@"your HandBrake encode is done!" 
-         notificationName:SERVICE_NAME
-                 iconData:nil 
-                 priority:0 
-                 isSticky:1 
-             clickContext:nil];
+- (void) setupToolbar {
+    toolbar = [[[NSToolbar alloc] initWithIdentifier: @"HandBrake Toolbar"] autorelease];
+    
+    [toolbar setAllowsUserCustomization: YES];
+    [toolbar setAutosavesConfiguration: YES];
+    [toolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel];
+    
+    [toolbar setDelegate: self];
+    
+    [fWindow setToolbar: toolbar];
 }
 
-- (void) enableUI: (bool) b
-{
-    NSControl * controls[] =
-      { fSrcTitleField, fSrcTitlePopUp,
-        fSrcChapterField, fSrcChapterStartPopUp, fSrcChapterToField,
-        fSrcChapterEndPopUp, fSrcDuration1Field, fSrcDuration2Field,
-        fDstFormatField, fDstFormatPopUp, fDstCodecsField,
-        fDstCodecsPopUp, fDstFile1Field, fDstFile2Field,
-        fDstBrowseButton, fVidRateField, fVidRatePopUp,
-        fVidEncoderField, fVidEncoderPopUp, fVidQualityField,
-        fVidQualityMatrix, fVidGrayscaleCheck, fSubField, fSubPopUp,
-        fAudLang1Field, fAudLang1PopUp, fAudLang2Field, fAudLang2PopUp,
-        fAudTrack1MixLabel, fAudTrack1MixPopUp, fAudTrack2MixLabel, fAudTrack2MixPopUp,
-        fAudRateField, fAudRatePopUp, fAudBitrateField,
-        fAudBitratePopUp, fPictureButton,fQueueStatus, 
-               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++ )
+- (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier:
+    (NSString *) itemIdent willBeInsertedIntoToolbar:(BOOL) willBeInserted {
+    NSToolbarItem * item = [[NSToolbarItem alloc] initWithItemIdentifier: itemIdent];
+    
+    if ([itemIdent isEqualToString: ToggleDrawerIdentifier])
     {
-        if( [[controls[i] className] isEqualToString: @"NSTextField"] )
-        {
-            NSTextField * tf = (NSTextField *) controls[i];
-            if( ![tf isBezeled] )
-            {
-                [tf setTextColor: b ? [NSColor controlTextColor] :
-                    [NSColor disabledControlTextColor]];
-                continue;
-            }
-        }
-        [controls[i] setEnabled: b];
-
+        [item setLabel: @"Toggle Presets"];
+        [item setPaletteLabel: @"Toggler Presets"];
+        [item setToolTip: @"Open/Close Preset Drawer"];
+        [item setImage: [NSImage imageNamed: @"Drawer"]];
+        [item setTarget: self];
+        [item setAction: @selector(toggleDrawer:)];
+        [item setAutovalidates: NO];
+    }
+    else if ([itemIdent isEqualToString: StartEncodingIdentifier])
+    {
+        [item setLabel: @"Start"];
+        [item setPaletteLabel: @"Start Encoding"];
+        [item setToolTip: @"Start Encoding"];
+        [item setImage: [NSImage imageNamed: @"Play"]];
+        [item setTarget: self];
+        [item setAction: @selector(Rip:)];
+    }
+    else if ([itemIdent isEqualToString: ShowQueueIdentifier])
+    {
+        [item setLabel: @"Show Queue"];
+        [item setPaletteLabel: @"Show Queue"];
+        [item setToolTip: @"Show Queue"];
+        [item setImage: [NSImage imageNamed: @"Queue"]];
+        [item setTarget: self];
+        [item setAction: @selector(showQueueWindow:)];
+        [item setAutovalidates: NO];
+    }
+    else if ([itemIdent isEqualToString: AddToQueueIdentifier])
+    {
+        [item setLabel: @"Add to Queue"];
+        [item setPaletteLabel: @"Add to Queue"];
+        [item setToolTip: @"Add to Queue"];
+        [item setImage: [NSImage imageNamed: @"AddToQueue"]];
+        [item setTarget: self];
+        [item setAction: @selector(addToQueue:)];
+    }
+    else if ([itemIdent isEqualToString: PauseEncodingIdentifier])
+    {
+        [item setLabel: @"Pause"];
+        [item setPaletteLabel: @"Pause Encoding"];
+        [item setToolTip: @"Pause Encoding"];
+        [item setImage: [NSImage imageNamed: @"Pause"]];
+        [item setTarget: self];
+        [item setAction: @selector(Pause:)];
+    }
+    else if ([itemIdent isEqualToString: ShowActivityIdentifier]) {
+        [item setLabel: @"Activity Window"];
+        [item setPaletteLabel: @"Show Activity Window"];
+        [item setToolTip: @"Show Activity Window"];
+        [item setImage: [NSImage imageNamed: @"ActivityWindow"]];
+        [item setTarget: self];
+        [item setAction: @selector(showDebugOutputPanel:)];
+        [item setAutovalidates: NO];
+    }
+    else if ([itemIdent isEqualToString: ChooseSourceIdentifier])
+    {
+        [item setLabel: @"Source"];
+        [item setPaletteLabel: @"Source"];
+        [item setToolTip: @"Choose Video Source"];
+        [item setImage: [NSImage imageNamed: @"Source"]];
+        [item setTarget: self];
+        [item setAction: @selector(browseSources:)];
+    }
+    else
+    {
+        [item release];
+        return nil;
     }
-       
-       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];
-       
-       } else {
-
-               [tableView setEnabled: NO];
-       
-       }
 
-    [self videoMatrixChanged: NULL];
-    [fAdvancedOptions enableUI:b];
+    return item;
 }
 
-- (IBAction) showScanPanel: (id) sender
+- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar
 {
-    [self enableUI: NO];
-       
-       [self browseSources:NULL];
+    return [NSArray arrayWithObjects: ChooseSourceIdentifier, NSToolbarSeparatorItemIdentifier, StartEncodingIdentifier,
+        PauseEncodingIdentifier, AddToQueueIdentifier, ShowQueueIdentifier, NSToolbarFlexibleSpaceItemIdentifier, 
+               NSToolbarSpaceItemIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier, nil];
 }
 
-- (void) browseSources: (id) sender
+- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar
 {
-    NSOpenPanel * panel;
-       
-    panel = [NSOpenPanel openPanel];
-    [panel setAllowsMultipleSelection: NO];
-    [panel setCanChooseFiles: YES];
-    [panel setCanChooseDirectories: YES ];
-    NSString * sourceDirectory;
-       if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastSourceDirectory"])
-       {
-               sourceDirectory = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastSourceDirectory"];
-       }
-       else
-       {
-               sourceDirectory = @"~/Desktop";
-               sourceDirectory = [sourceDirectory stringByExpandingTildeInPath];
-       }
-   [panel beginSheetForDirectory: sourceDirectory file: nil types: nil
-                                  modalForWindow: fWindow modalDelegate: self
-                                  didEndSelector: @selector( browseSourcesDone:returnCode:contextInfo: )
-                                         contextInfo: nil];
+    return [NSArray arrayWithObjects:  StartEncodingIdentifier, PauseEncodingIdentifier, AddToQueueIdentifier,
+        ChooseSourceIdentifier, ShowQueueIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier,
+        NSToolbarCustomizeToolbarItemIdentifier, NSToolbarFlexibleSpaceItemIdentifier,
+        NSToolbarSpaceItemIdentifier, NSToolbarSeparatorItemIdentifier, nil];
 }
 
-- (void) browseSourcesDone: (NSOpenPanel *) sheet
-                returnCode: (int) returnCode contextInfo: (void *) contextInfo
+- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem
 {
-    /* User selected a file to open */
-       if( returnCode == NSOKButton )
+    NSString * ident = [toolbarItem itemIdentifier];
+        
+    if (fHandle)
     {
-        [fSrcDVD2Field setStringValue: _( @"Opening a new source ..." )];
-               [fScanIndicator setHidden: NO];
-           [fScanIndicator setIndeterminate: YES];
-        [fScanIndicator startAnimation: nil];
-               
-               /* we set the last source directory in the prefs here */
-               NSString *sourceDirectory = [[[sheet filenames] objectAtIndex: 0] stringByDeletingLastPathComponent];
-               [[NSUserDefaults standardUserDefaults] setObject:sourceDirectory forKey:@"LastSourceDirectory"];
-               
-        NSString *path = [[sheet filenames] objectAtIndex: 0];
-        HBDVDDetector *detector = [HBDVDDetector detectorForPath:path];
-        if( [detector isVideoDVD] )
+        hb_state_t s;
+        hb_get_state2( fHandle, &s );
+        
+        if (s.state == HB_STATE_WORKING || s.state == HB_STATE_MUXING)
         {
-            // The chosen path was actually on a DVD, so use the raw block
-            // device path instead.
-            path = [detector devicePath];
+            if ([ident isEqualToString: StartEncodingIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Stop"]];
+                [toolbarItem setLabel: @"Stop"];
+                [toolbarItem setPaletteLabel: @"Stop"];
+                [toolbarItem setToolTip: @"Stop Encoding"];
+                return YES;
+            }
+            if ([ident isEqualToString: PauseEncodingIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Pause"]];
+                [toolbarItem setLabel: @"Pause"];
+                [toolbarItem setPaletteLabel: @"Pause Encoding"];
+                [toolbarItem setToolTip: @"Pause Encoding"];
+                return YES;
+            }
+            if (SuccessfulScan)
+                if ([ident isEqualToString: AddToQueueIdentifier])
+                    return YES;
         }
-               
-               hb_scan( fHandle, [path UTF8String], 0 );
-       }
-       else // User clicked Cancel in browse window
-       {
-               /* if we have a title loaded up */
-               if ([[fSrcDVD2Field stringValue] length] > 0)
-               {
-            [self enableUI: YES];
+        else if (s.state == HB_STATE_PAUSED)
+        {
+            if ([ident isEqualToString: PauseEncodingIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Play"]];
+                [toolbarItem setLabel: @"Resume"];
+                [toolbarItem setPaletteLabel: @"Resume Encoding"];
+                [toolbarItem setToolTip: @"Resume Encoding"];
+                return YES;
+            }
+            if ([ident isEqualToString: StartEncodingIdentifier])
+                return YES;
+            if ([ident isEqualToString: AddToQueueIdentifier])
+                return YES;
+        }
+        else if (s.state == HB_STATE_SCANNING)
+            return NO;
+        else if (s.state == HB_STATE_WORKDONE || s.state == HB_STATE_SCANDONE || SuccessfulScan)
+        {
+            if ([ident isEqualToString: StartEncodingIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Play"]];
+                if (hb_count(fHandle) > 0)
+                    [toolbarItem setLabel: @"Start Queue"];
+                else
+                    [toolbarItem setLabel: @"Start"];
+                [toolbarItem setPaletteLabel: @"Start Encoding"];
+                [toolbarItem setToolTip: @"Start Encoding"];
+                return YES;
+            }
+            if ([ident isEqualToString: AddToQueueIdentifier])
+                return 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;
     }
     
+    if ([ident isEqualToString: ShowQueueIdentifier])
+        return YES;
+    if ([ident isEqualToString: ToggleDrawerIdentifier])
+        return YES;
+    if ([ident isEqualToString: ChooseSourceIdentifier])
+        return YES;
+    if ([ident isEqualToString: ShowActivityIdentifier])
+        return YES;
+    
     return NO;
 }
 
-- (IBAction) videoMatrixChanged: (id) sender;
+- (BOOL) validateMenuItem: (NSMenuItem *) menuItem
 {
-    bool target, bitrate, quality;
-
-    target = bitrate = quality = false;
-    if( [fVidQualityMatrix isEnabled] )
+    SEL action = [menuItem action];
+    
+    hb_state_t s;
+    hb_get_state2( fHandle, &s );
+    
+    if (fHandle)
     {
-        switch( [fVidQualityMatrix selectedRow] )
+        if (action == @selector(addToQueue:) || action == @selector(showPicturePanel:) || action == @selector(showAddPresetPanel:))
+            return SuccessfulScan && [fWindow attachedSheet] == nil;
+        
+        if (action == @selector(browseSources:))
         {
-            case 0:
-                target = true;
-                break;
-            case 1:
-                bitrate = true;
-                break;
-            case 2:
-                quality = true;
-                break;
+            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;
+}
+
+#pragma mark -
+#pragma mark Growl
+// 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]; 
+
+    return registrationDictionary; 
+} 
+
+-(IBAction)showGrowlDoneNotification:(id)sender
+{
+  [GrowlApplicationBridge 
+            notifyWithTitle:@"Put down that cocktail..." 
+                description:@"your HandBrake encode is done!" 
+           notificationName:SERVICE_NAME
+                   iconData:nil 
+                   priority:0 
+                   isSticky:1 
+               clickContext:nil];
+}
+
+#pragma mark -
+#pragma mark Get New Source
+
+/*Opens the source browse window, called from Open Source widgets */
+- (IBAction) browseSources: (id) sender
+{
+    [self enableUI: NO];
+    NSOpenPanel * panel;
+       
+    panel = [NSOpenPanel openPanel];
+    [panel setAllowsMultipleSelection: NO];
+    [panel setCanChooseFiles: YES];
+    [panel setCanChooseDirectories: YES ];
+    NSString * sourceDirectory;
+       if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastSourceDirectory"])
+       {
+               sourceDirectory = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastSourceDirectory"];
+       }
+       else
+       {
+               sourceDirectory = @"~/Desktop";
+               sourceDirectory = [sourceDirectory stringByExpandingTildeInPath];
+       }
+    /* we open up the browse sources sheet here and call for browseSourcesDone after the sheet is closed
+        * to evaluate whether we want to specify a title, we pass the sender in the contextInfo variable
+        */
+    [panel beginSheetForDirectory: sourceDirectory file: nil types: nil
+                   modalForWindow: fWindow modalDelegate: self
+                   didEndSelector: @selector( browseSourcesDone:returnCode:contextInfo: )
+                      contextInfo: sender]; 
+}
+
+- (void) browseSourcesDone: (NSOpenPanel *) sheet
+                returnCode: (int) returnCode contextInfo: (void *) contextInfo
+{
+    /* we convert the sender content of contextInfo back into a variable called sender
+    * mostly just for consistency for evaluation later
+    */
+    id sender = (id)contextInfo;
+    /* User selected a file to open */
+       if( returnCode == NSOKButton )
+    {
+        
+        NSString *scanPath = [[sheet filenames] objectAtIndex: 0];
+        /* we order out sheet, which is the browse window as we need to open
+        * the title selection sheet right away
+        */
+        [sheet orderOut: self];
+        
+        if (sender == fOpenSourceTitleMMenu)
+        {
+            /* We put the chosen source path in the source display text field for the
+            * source title selection sheet in which the user specifies the specific title to be
+            * scanned  as well as the short source name in fSrcDsplyNameTitleScan just for display
+            * purposes in the title panel
+            */
+            /* Full Path */
+            [fScanSrcTitlePathField setStringValue: [NSString stringWithFormat:@"%@", scanPath]];
+            NSString *displayTitlescanSourceName;
+            
+            if ([[scanPath lastPathComponent] isEqualToString: @"VIDEO_TS"])
+            {
+                /* 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]];
+            }
+            else
+            {
+                /* if not the VIDEO_TS Folder, we can assume the chosen folder is the source name */
+                displayTitlescanSourceName = [NSString stringWithFormat:[scanPath lastPathComponent]];
+            }
+            /* we set the source display name in the title selection dialogue */
+            [fSrcDsplyNameTitleScan setStringValue: [NSString stringWithFormat:@"%@", displayTitlescanSourceName]];
+            /* 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];
+        }
+        else
+        {
+            /* We are just doing a standard full source scan, so we specify "0" to libhb */
+            NSString *path = [[sheet filenames] objectAtIndex: 0];
+            [self performScan:path scanTitleNum:0];   
         }
+        
     }
-    [fVidTargetSizeField  setEnabled: target];
-    [fVidBitrateField     setEnabled: bitrate];
-    [fVidQualitySlider    setEnabled: quality];
-    [fVidTwoPassCheck     setEnabled: !quality &&
-        [fVidQualityMatrix isEnabled]];
-    if( quality )
+    else // User clicked Cancel in browse window
     {
-        [fVidTwoPassCheck setState: NSOffState];
-               [fVidTurboPassCheck setHidden: YES];
-               [fVidTurboPassCheck setState: NSOffState];
+        /* if we have a title loaded up */
+        if ([[fSrcDVD2Field stringValue] length] > 0)
+        {
+            [self enableUI: YES];
+        }
+    }
+}
+    
+/* Here we open the title selection sheet where we can specify an exact title to be scanned */
+- (IBAction) showSourceTitleScanPanel: (id) sender
+{
+    /* We default the title number to be scanned to "0" which results in a full source scan, unless the
+    * user changes it
+    */
+    [fScanSrcTitleNumField setStringValue: @"0"];
+       /* Show the panel */
+       [NSApp beginSheet: fScanSrcTitlePanel modalForWindow: fWindow modalDelegate: NULL 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 */
+        [fSrcDVD2Field setStringValue: _( @"Opening a new source title ..." )];
+               [fScanIndicator setHidden: NO];
+           [fScanIndicator setIndeterminate: YES];
+        [fScanIndicator startAnimation: nil];
+               
+               /* we set the last source directory in the prefs here */
+               NSString *sourceDirectory = [[fScanSrcTitlePathField stringValue] stringByDeletingLastPathComponent];
+               [[NSUserDefaults standardUserDefaults] setObject:sourceDirectory forKey:@"LastSourceDirectory"];
+        /* We use the performScan method to actually perform the specified scan passing the path and the title
+            * to be scanned
+            */
+        [self performScan:[fScanSrcTitlePathField stringValue] scanTitleNum:[fScanSrcTitleNumField intValue]];
     }
+}
 
-    [self qualitySliderChanged: sender];
-    [self calculateBitrate: sender];
-       [self customSettingUsed: sender];
+
+/* 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
+{
+    NSString *path = scanPath;
+    HBDVDDetector *detector = [HBDVDDetector detectorForPath:path];
+    if( [detector isVideoDVD] )
+    {
+        // The chosen path was actually on a DVD, so use the raw block
+        // device path instead.
+        path = [detector devicePath];
+    }
+    /* If there is no title number passed to scan, we use "0"
+        * which causes the default behavior of a full source scan
+    */
+    if (!scanTitleNum)
+    {
+        scanTitleNum = 0;
+    }
+    hb_scan( fHandle, [path UTF8String], scanTitleNum );
 }
 
-- (IBAction) qualitySliderChanged: (id) sender
+- (IBAction) showNewScan:(id)sender
 {
-    [fVidConstantCell setTitle: [NSString stringWithFormat:
-        _( @"Constant quality: %.0f %%" ), 100.0 *
-        [fVidQualitySlider floatValue]]];
-               [self customSettingUsed: sender];
+       hb_list_t  * list;
+       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 Title Found"];
+        SuccessfulScan = NO;
+       }
+       else
+       {
+        /* We increment the successful scancount here by one,
+        which we use at the end of this function to tell the gui
+        if this is the first successful scan since launch and whether
+        or not we should set all settings to the defaults */
+               
+        currentSuccessfulScanCount++;
+        
+        [toolbar validateVisibleItems];
+               
+               [fSrcTitlePopUp removeAllItems];
+               for( int i = 0; i < hb_list_count( list ); i++ )
+               {
+                       title = (hb_title_t *) hb_list_item( list, i );
+                       
+            currentSource = [NSString stringWithUTF8String: title->name];
+            
+            /* To get the source name as well as the default output name, first we check to see if
+                the selected directory is the VIDEO_TS Directory */
+            if ([[currentSource lastPathComponent] isEqualToString: @"VIDEO_TS"])
+            {
+                /* 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*/
+                sourceDisplayName = [NSString stringWithFormat:[[[NSString stringWithUTF8String: title->dvd] stringByDeletingLastPathComponent] lastPathComponent]];
+            }
+            else
+            {
+                /* if not the VIDEO_TS Folder, we can assume the chosen folder is the source name */
+                sourceDisplayName = [NSString stringWithFormat:[currentSource lastPathComponent]];
+            }
+                       /*Set DVD Name at top of window*/
+                       [fSrcDVD2Field setStringValue:[NSString stringWithFormat: @"%@", sourceDisplayName]];
+                       
+                       /* 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"])
+                       {
+                               [fDstFile2Field setStringValue: [NSString stringWithFormat:
+                                       @"%@/%@.mp4", [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"],sourceDisplayName]];
+                       }
+                       else
+                       {
+                               [fDstFile2Field setStringValue: [NSString stringWithFormat:
+                                       @"%@/Desktop/%@.mp4", NSHomeDirectory(),sourceDisplayName]];
+                       }
+                       
+                       if (longuestpri < title->hours*60*60 + title->minutes *60 + title->seconds)
+                       {
+                               longuestpri=title->hours*60*60 + title->minutes *60 + title->seconds;
+                               indxpri=i;
+                       }
+                       
+                       [self formatPopUpChanged:NULL];
+                       
+            [fSrcTitlePopUp addItemWithTitle: [NSString
+                stringWithFormat: @"%d - %02dh%02dm%02ds",
+                title->index, title->hours, title->minutes,
+                title->seconds]];
+               }
+        
+               // Select the longuest title
+               [fSrcTitlePopUp selectItemAtIndex: indxpri];
+               [self titlePopUpChanged: NULL];
+               
+        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];
+        }
+        
+       }
 }
 
+
+#pragma mark -
+#pragma mark New Output Destination
+
 - (IBAction) browseFile: (id) sender
 {
     /* Open a panel to let the user choose and update the text field */
@@ -1338,19 +1325,36 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     }
 }
 
-- (IBAction) showPicturePanel: (id) sender
+
+#pragma mark -
+#pragma mark Main Window Control
+
+- (IBAction) openMainWindow: (id) sender
 {
-       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];
+    [fWindow  makeKeyAndOrderFront:nil];
 }
 
-- (void)pictureSettingsDidChange {
-       [self calculatePictureSizing: NULL];
+- (BOOL) windowShouldClose: (id) sender
+{
+    return YES;
+}
+
+- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
+{
+    if( !flag ) {
+        [fWindow  makeKeyAndOrderFront:nil];
+                
+        return YES;
+    }
+    
+    return NO;
 }
 
-- (void) PrepareJob
+#pragma mark -
+#pragma mark Job Handling
+
+
+- (void) prepareJob
 {
     hb_list_t  * list  = hb_get_titles( fHandle );
     hb_title_t * title = (hb_title_t *) hb_list_item( list,
@@ -1503,6 +1507,17 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                      indexOfSelectedItem]].rate;
     job->abitrate = [[fAudBitratePopUp selectedItem] tag];
     
+    /* set vfr according to the Picture Window */
+    if ([fPictureController vfr])
+    {
+    job->vfr = 1;
+    }
+    else
+    {
+    job->vfr = 0;
+    }
+    
+    /* Filters */ 
     job->filters = hb_list_init();
    
        /* Detelecine */
@@ -1554,7 +1569,13 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                hb_filter_denoise.settings = "7:7:5:5"; 
         hb_list_add( job->filters, &hb_filter_denoise );       
        }
-
+    
+    /* Deblock  (uses pp7 default) */
+    if ([fPictureController deblock])
+    {
+        hb_list_add( job->filters, &hb_filter_deblock );
+    }
+
 }
 
 
@@ -1610,7 +1631,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     // be lumped together in the UI.
     job->sequence_id = -1;
 
-    [self PrepareJob];
+    [self prepareJob];
 
     /* Destination file */
     job->file = [[fDstFile2Field stringValue] UTF8String];
@@ -1664,6 +1685,11 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         hb_subtitle_t **subtitle_tmp = job->select_subtitle;
         job->indepth_scan = 0;
 
+        /*
+         * Do not autoselect subtitles on the first pass of a two pass
+         */
+        job->select_subtitle = NULL;
+        
         job->pass = 1;
         job->sequence_id++; // for job grouping
         hb_add( fHandle, job );
@@ -1688,9 +1714,9 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        
     NSString *destinationDirectory = [[fDstFile2Field stringValue] stringByDeletingLastPathComponent];
        [[NSUserDefaults standardUserDefaults] setObject:destinationDirectory forKey:@"LastDestinationDirectory"];
-       /* Lets try to update stuff, taken from remove in the queue controller */
-       [fQueueController performSelectorOnMainThread: @selector( updateQueueUI )
-        withObject: NULL waitUntilDone: NO];
+       
+    // Notify the queue
+       [fQueueController hblibJobListChanged];
 }
 
 /* Rip: puts up an alert before ultimately calling doRip
@@ -1772,22 +1798,36 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     }
 }
 
-- (void) updateAlertDone: (NSWindow *) sheet
-    returnCode: (int) returnCode contextInfo: (void *) contextInfo
+- (void) remindUserOfSleepOrShutdown
 {
-    if( returnCode == NSAlertAlternateReturn )
-    {
-        /* Show scan panel */
-        [self performSelectorOnMainThread: @selector(showScanPanel:)
-            withObject: NULL waitUntilDone: NO];
-        return;
-    }
+       if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Put Computer To Sleep"])
+       {
+               /*Warn that computer will sleep after encoding*/
+               int reminduser;
+               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 ) 
+               {
+                       [self showPreferencesWindow:NULL];
+               }
+       } 
+       else if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Shut Down Computer"])
+       {
+               /*Warn that computer will shut down after encoding*/
+               int reminduser;
+               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 ) 
+               {
+                       [self showPreferencesWindow:NULL];
+               }
+       }
 
-    /* Go to HandBrake homepage and exit */
-    [self openHomepage: NULL];
-    [NSApp terminate: self];
 }
 
+
 - (void) doRip
 {
     /* Let libhb do the job */
@@ -1799,6 +1839,15 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 
 
 
+//------------------------------------------------------------------------------------
+// Removes all jobs from the queue. Does not cancel the current processing job.
+//------------------------------------------------------------------------------------
+- (void) doDeleteQueuedJobs
+{
+    hb_job_t * job;
+    while( ( job = hb_job( fHandle, 0 ) ) )
+        hb_rem( fHandle, job );
+}
 
 //------------------------------------------------------------------------------------
 // Cancels the current job and proceeds with the next one in the queue.
@@ -1811,6 +1860,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     // remaining passes of the job and then start the queue back up if there are any
     // remaining jobs.
      
+    [fQueueController hblibWillStop];
     hb_stop( fHandle );
     fEncodeState = 2;   // don't alert at end of processing since this was a cancel
     
@@ -1840,7 +1890,10 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         
     NSBeginCriticalAlertSheet(
             alertTitle,
-            NSLocalizedString(@"Keep Encoding", nil), NSLocalizedString(@"Stop Encoding", nil), nil, docWindow, self,
+            NSLocalizedString(@"Keep Encoding", nil),
+            NSLocalizedString(@"Delete All", nil),
+            NSLocalizedString(@"Stop Encoding", nil),
+            docWindow, self,
             nil, @selector(didDimissCancelCurrentJob:returnCode:contextInfo:), nil,
             NSLocalizedString(@"Your movie will be lost if you don't continue encoding.", nil),
             [NSString stringWithUTF8String:job->title->name]);
@@ -1857,8 +1910,13 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 
 - (void) didDimissCancelCurrentJob: (NSWindow *)sheet returnCode: (int)returnCode contextInfo: (void *)contextInfo
 {
-    if (returnCode == NSAlertAlternateReturn)
+    if (returnCode == NSAlertOtherReturn)
         [self doCancelCurrentJob];
+    else if (returnCode == NSAlertAlternateReturn)
+    {
+        [self doDeleteQueuedJobs];
+        [self doCancelCurrentJob];
+    }
 }
 
 
@@ -1880,6 +1938,9 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     }
 }
 
+#pragma mark -
+#pragma mark GUI Controls Changed Methods
+
 - (IBAction) titlePopUpChanged: (id) sender
 {
     hb_list_t  * list  = hb_get_titles( fHandle );
@@ -1999,8 +2060,54 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        /* so call audioTrackPopUpChanged for both audio tracks to update the mixdown popups */
        [self audioTrackPopUpChanged: fAudLang1PopUp];
        [self audioTrackPopUpChanged: fAudLang2PopUp];
-       /* lets call tableViewSelected to make sure that any preset we have selected is enforced after a title change */
-       [self tableViewSelected:NULL];
+    
+    /* 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];
+    
+   /* lets call tableViewSelected to make sure that any preset we have selected is enforced after a title change */
+       [self tableViewSelected:NULL]; 
+       
 }
 
 - (IBAction) chapterPopUpChanged: (id) sender
@@ -2038,6 +2145,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 - (IBAction) formatPopUpChanged: (id) sender
 {
     NSString * string = [fDstFile2Field stringValue];
+    NSString * selectedCodecs = [fDstCodecsPopUp titleOfSelectedItem];
     int format = [fDstFormatPopUp indexOfSelectedItem];
     char * ext = NULL;
        /* Initially set the large file (64 bit formatting) output checkbox to hidden */
@@ -2056,10 +2164,10 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                        {
                                ext = "mp4";
                        }
-            [fDstCodecsPopUp addItemWithTitle:
-                _( @"MPEG-4 Video / AAC Audio" )];
-            [fDstCodecsPopUp addItemWithTitle:
-                _( @"AVC/H.264 Video / AAC Audio" )];
+            
+            [fDstCodecsPopUp addItemWithTitle:_( @"MPEG-4 Video / AAC Audio" )];
+            [fDstCodecsPopUp addItemWithTitle:_( @"AVC/H.264 Video / AAC Audio" )];
+            
                        /* We enable the create chapters checkbox here since we are .mp4*/
                        [fCreateChapterMarkers setEnabled: YES];
                        /* We show the Large File (64 bit formatting) checkbox since we are .mp4 
@@ -2072,82 +2180,78 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                                {
                                        /* if not enable in global preferences, we additionaly sanity check that the
                                        hidden checkbox is set to off. */
-                                       [fDstMpgLargeFileCheck setState: NSOffState];
+                    [fDstMpgLargeFileCheck setState: NSOffState];
                                }
-                               break;
-        case 1: 
+            break;
+            
+        case 1:
+            ext = "mkv";
+            [fDstCodecsPopUp addItemWithTitle:_( @"MPEG-4 Video / AAC Audio" )];
+            [fDstCodecsPopUp addItemWithTitle:_( @"MPEG-4 Video / AC-3 Audio" )];
+                       [fDstCodecsPopUp addItemWithTitle:_( @"MPEG-4 Video / MP3 Audio" )];
+                       [fDstCodecsPopUp addItemWithTitle:_( @"MPEG-4 Video / Vorbis Audio" )];
+            
+                       [fDstCodecsPopUp addItemWithTitle:_( @"AVC/H.264 Video / AAC Audio" )];
+                       [fDstCodecsPopUp addItemWithTitle:_( @"AVC/H.264 Video / AC-3 Audio" )];
+                       [fDstCodecsPopUp addItemWithTitle:_( @"AVC/H.264 Video / MP3 Audio" )];
+                       [fDstCodecsPopUp addItemWithTitle:_( @"AVC/H.264 Video / Vorbis Audio" )];
+            /* We enable the create chapters checkbox here */
+                       [fCreateChapterMarkers setEnabled: YES];
+                       break;
+            
+        case 2: 
             ext = "avi";
-            [fDstCodecsPopUp addItemWithTitle:
-                _( @"MPEG-4 Video / MP3 Audio" )];
-            [fDstCodecsPopUp addItemWithTitle:
-                _( @"MPEG-4 Video / AC-3 Audio" )];
-            [fDstCodecsPopUp addItemWithTitle:
-                _( @"AVC/H.264 Video / MP3 Audio" )];
-            [fDstCodecsPopUp addItemWithTitle:
-                _( @"AVC/H.264 Video / AC-3 Audio" )];
-                       /* We disable the create chapters checkbox here since we are NOT .mp4 
-                       and make sure it is unchecked*/
+            [fDstCodecsPopUp addItemWithTitle:_( @"MPEG-4 Video / MP3 Audio" )];
+            [fDstCodecsPopUp addItemWithTitle:_( @"MPEG-4 Video / AC-3 Audio" )];
+            [fDstCodecsPopUp addItemWithTitle:_( @"AVC/H.264 Video / MP3 Audio" )];
+            [fDstCodecsPopUp addItemWithTitle:_( @"AVC/H.264 Video / AC-3 Audio" )];
+                       /* We disable the create chapters checkbox here and make sure it is unchecked*/
                        [fCreateChapterMarkers setEnabled: NO];
                        [fCreateChapterMarkers setState: NSOffState];
                        break;
-        case 2:
+            
+        case 3:
             ext = "ogm";
-            [fDstCodecsPopUp addItemWithTitle:
-                _( @"MPEG-4 Video / Vorbis Audio" )];
-            [fDstCodecsPopUp addItemWithTitle:
-                _( @"MPEG-4 Video / MP3 Audio" )];
-            /* We disable the create chapters checkbox here since we are NOT .mp4 
-                       and make sure it is unchecked*/
+            [fDstCodecsPopUp addItemWithTitle:_( @"MPEG-4 Video / Vorbis Audio" )];
+            [fDstCodecsPopUp addItemWithTitle:_( @"MPEG-4 Video / MP3 Audio" )];
+            /* We disable the create chapters checkbox here and make sure it is unchecked*/
                        [fCreateChapterMarkers setEnabled: NO];
                        [fCreateChapterMarkers setState: NSOffState];
                        break;
-               case 3:
-            ext = "mkv";
-            [fDstCodecsPopUp addItemWithTitle:
-                _( @"MPEG-4 Video / AAC Audio" )];
-                               [fDstCodecsPopUp addItemWithTitle:
-                _( @"MPEG-4 Video / AC-3 Audio" )];
-                       [fDstCodecsPopUp addItemWithTitle:
-                _( @"MPEG-4 Video / MP3 Audio" )];
-                       [fDstCodecsPopUp addItemWithTitle:
-                _( @"MPEG-4 Video / Vorbis Audio" )];
-            
-                       [fDstCodecsPopUp addItemWithTitle:
-                _( @"AVC/H.264 Video / AAC Audio" )];
-                       [fDstCodecsPopUp addItemWithTitle:
-                _( @"AVC/H.264 Video / AC-3 Audio" )];
-                       [fDstCodecsPopUp addItemWithTitle:
-                _( @"AVC/H.264 Video / MP3 Audio" )];
-                       [fDstCodecsPopUp addItemWithTitle:
-                _( @"AVC/H.264 Video / Vorbis Audio" )];
-            /* We enable the create chapters checkbox here since */
-                       [fCreateChapterMarkers setEnabled: YES];
-                       break;
     }
-    [self codecsPopUpChanged: NULL];
-
-    /* Add/replace to the correct extension */
-    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 ) {
+        [fDstCodecsPopUp selectItemWithTitle:selectedCodecs];
+        
+        /* Add/replace to the correct extension */
+        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 ( [fDstCodecsPopUp selectedItem] == NULL )
+        {
+            [fDstCodecsPopUp selectItemAtIndex:0];
+            [self codecsPopUpChanged: NULL];
+            
+            /* 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 */
+            [self audioTrackPopUpChanged: fAudLang1PopUp];
+            [self audioTrackPopUpChanged: fAudLang2PopUp];
+            /* 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*/
+        }
     }
-
-       /* 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 */
-       [self audioTrackPopUpChanged: fAudLang1PopUp];
-       [self audioTrackPopUpChanged: fAudLang2PopUp];
-       /* 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*/
+    
        [self customSettingUsed: sender];       
-       
 }
 
 - (IBAction) codecsPopUpChanged: (id) sender
@@ -2226,6 +2330,28 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        [self twoPassCheckboxChanged: sender];
 }
 
+/* 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)
+       {
+               /* Deselect the currently selected Preset if there is one*/
+               [tableView deselectRow:[tableView selectedRow]];
+               [[fPresetsActionMenu itemAtIndex:0] setEnabled: NO];
+               /* Change UI to show "Custom" settings are being used */
+               [fPresetSelectedDisplay setStringValue: @"Custom"];
+               
+               curUserPresetChosenNum = nil;
+       }
+
+}
+
+
+#pragma mark -
+#pragma mark - Video
+
 - (IBAction) twoPassCheckboxChanged: (id) sender
 {
        /* check to see if x264 is chosen */
@@ -2266,361 +2392,76 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     /* We call method method to change UI to reflect whether a preset is used or not*/
        [self customSettingUsed: sender];
 }
-
-- (IBAction) setEnabledStateOfAudioMixdownControls: (id) sender
-{
-
-    /* enable/disable the mixdown text and popupbutton for audio track 1 */
-    [fAudTrack1MixPopUp setEnabled: ([fAudLang1PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack1MixLabel setTextColor: ([fAudLang1PopUp indexOfSelectedItem] == 0) ?
-        [NSColor disabledControlTextColor] : [NSColor controlTextColor]];
-
-    /* enable/disable the mixdown text and popupbutton for audio track 2 */
-    [fAudTrack2MixPopUp setEnabled: ([fAudLang2PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack2MixLabel setTextColor: ([fAudLang2PopUp indexOfSelectedItem] == 0) ?
-        [NSColor disabledControlTextColor] : [NSColor controlTextColor]];
-
-}
-
-- (IBAction) addAllAudioTracksToPopUp: (id) sender
+- (IBAction) videoMatrixChanged: (id) sender;
 {
+    bool target, bitrate, quality;
 
-    hb_list_t  * list  = hb_get_titles( fHandle );
-    hb_title_t * title = (hb_title_t*)
-        hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
-
-       hb_audio_t * audio;
-
-    [sender removeAllItems];
-    [sender addItemWithTitle: _( @"None" )];
-    for( int i = 0; i < hb_list_count( title->list_audio ); i++ )
+    target = bitrate = quality = false;
+    if( [fVidQualityMatrix isEnabled] )
     {
-        audio = (hb_audio_t *) hb_list_item( title->list_audio, i );
-        [[sender menu] addItemWithTitle:
-            [NSString stringWithCString: audio->lang]
-            action: NULL keyEquivalent: @""];
-    }
-    [sender selectItemAtIndex: 0];
-
-}
-
-- (IBAction) selectAudioTrackInPopUp: (id) sender searchPrefixString: (NSString *) searchPrefixString selectIndexIfNotFound: (int) selectIndexIfNotFound
-{
-
-    /* this method can be used to find a language, or a language-and-source-format combination, by passing in the appropriate string */
-    /* 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) 
-       {
-
-        for( int i = 0; i < [sender numberOfItems]; i++ )
+        switch( [fVidQualityMatrix selectedRow] )
         {
-            /* Try to find the desired search string */
-            if ([[[sender itemAtIndex: i] title] hasPrefix:searchPrefixString])
-            {
-                [sender selectItemAtIndex: i];
-                return;
-            }
+            case 0:
+                target = true;
+                break;
+            case 1:
+                bitrate = true;
+                break;
+            case 2:
+                quality = true;
+                break;
         }
-        /* couldn't find the string, so select the requested "search string not found" item */
-        /* index of 0 means select the "none" item */
-        /* index of 1 means select the first audio track */
-        [sender selectItemAtIndex: selectIndexIfNotFound];
-       }
-    else
+    }
+    [fVidTargetSizeField  setEnabled: target];
+    [fVidBitrateField     setEnabled: bitrate];
+    [fVidQualitySlider    setEnabled: quality];
+    [fVidTwoPassCheck     setEnabled: !quality &&
+        [fVidQualityMatrix isEnabled]];
+    if( quality )
     {
-        /* if no search string is provided, then select the selectIndexIfNotFound item */
-        [sender selectItemAtIndex: selectIndexIfNotFound];
+        [fVidTwoPassCheck setState: NSOffState];
+               [fVidTurboPassCheck setHidden: YES];
+               [fVidTurboPassCheck setState: NSOffState];
     }
 
+    [self qualitySliderChanged: sender];
+    [self calculateBitrate: sender];
+       [self customSettingUsed: sender];
 }
 
-- (IBAction) audioTrackPopUpChanged: (id) sender
+- (IBAction) qualitySliderChanged: (id) sender
 {
-    /* utility function to call audioTrackPopUpChanged without passing in a mixdown-to-use */
-    [self audioTrackPopUpChanged: sender mixdownToUse: 0];
+    [fVidConstantCell setTitle: [NSString stringWithFormat:
+        _( @"Constant quality: %.0f %%" ), 100.0 *
+        [fVidQualitySlider floatValue]]];
+               [self customSettingUsed: sender];
 }
 
-- (IBAction) audioTrackPopUpChanged: (id) sender mixdownToUse: (int) mixdownToUse
+- (void) controlTextDidChange: (NSNotification *) notification
 {
+    [self calculateBitrate: NULL];
+}
 
-    /* make sure we have a selected title before continuing */
-    if (fTitle == NULL) return;
+- (IBAction) calculateBitrate: (id) sender
+{
+    if( !fHandle || [fVidQualityMatrix selectedRow] != 0 || !SuccessfulScan )
+    {
+        return;
+    }
 
-    /* find out if audio track 1 or 2 was changed - this is passed to us in the tag of the sender */
-    /* the sender will have been either fAudLang1PopUp (tag = 0) or fAudLang2PopUp (tag = 1) */
-    int thisAudio = [sender tag];
+    hb_list_t  * list  = hb_get_titles( fHandle );
+    hb_title_t * title = (hb_title_t *) hb_list_item( list,
+            [fSrcTitlePopUp indexOfSelectedItem] );
+    hb_job_t * job = title->job;
 
-    /* get the index of the selected audio */
-    int thisAudioIndex = [sender indexOfSelectedItem] - 1;
+    [self prepareJob];
 
-    /* Handbrake can't currently cope with ripping the same source track twice */
-    /* So, if this audio is also selected in the other audio track popup, set that popup's selection to "none" */
-    /* get a reference to the two audio track popups */
-    NSPopUpButton * thisAudioPopUp  = (thisAudio == 1 ? fAudLang2PopUp : fAudLang1PopUp);
-    NSPopUpButton * otherAudioPopUp = (thisAudio == 1 ? fAudLang1PopUp : fAudLang2PopUp);
-    /* if the same track is selected in the other audio popup, then select "none" in that popup */
-    /* unless, of course, both are selected as "none!" */
-    if ([thisAudioPopUp indexOfSelectedItem] != 0 && [thisAudioPopUp indexOfSelectedItem] == [otherAudioPopUp indexOfSelectedItem]) {
-        [otherAudioPopUp selectItemAtIndex: 0];
-        [self audioTrackPopUpChanged: otherAudioPopUp];
-    }
+    [fVidBitrateField setIntValue: hb_calc_bitrate( job,
+            [fVidTargetSizeField intValue] )];
+}
 
-    /* pointer for the hb_audio_s struct we will use later on */
-    hb_audio_t * audio;
-
-    /* find out what the currently-selected output audio codec is */
-    int format = [fDstFormatPopUp indexOfSelectedItem];
-    int codecs = [fDstCodecsPopUp indexOfSelectedItem];
-    int acodec = FormatSettings[format][codecs] & HB_ACODEC_MASK;
-
-    /* pointer to this track's mixdown NSPopUpButton */
-    NSTextField   * mixdownTextField;
-    NSPopUpButton * mixdownPopUp;
-
-    /* find our mixdown NSTextField and NSPopUpButton */
-    if (thisAudio == 0)
-    {
-        mixdownTextField = fAudTrack1MixLabel;
-        mixdownPopUp = fAudTrack1MixPopUp;
-    }
-    else
-    {
-        mixdownTextField = fAudTrack2MixLabel;
-        mixdownPopUp = fAudTrack2MixPopUp;
-    }
-
-    /* delete the previous audio mixdown options */
-    [mixdownPopUp removeAllItems];
-
-    /* check if the audio mixdown controls need their enabled state changing */
-    [self setEnabledStateOfAudioMixdownControls: NULL];
-
-    if (thisAudioIndex != -1)
-    {
-
-        /* get the audio */
-        audio = (hb_audio_t *) hb_list_item( fTitle->list_audio, thisAudioIndex );
-        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 */
-            /* audioCodecsSupportMono and audioCodecsSupport6Ch are the same for now,
-               but this may change in the future, so they are separated for flexibility */
-            int audioCodecsSupportMono = ((audio->codec == HB_ACODEC_AC3 ||
-                audio->codec == HB_ACODEC_DCA) && acodec == HB_ACODEC_FAAC);
-            int audioCodecsSupport6Ch =  ((audio->codec == HB_ACODEC_AC3 ||
-                audio->codec == HB_ACODEC_DCA) && acodec == HB_ACODEC_FAAC);
-
-            /* check for AC-3 passthru */
-            if (audio->codec == HB_ACODEC_AC3 && acodec == HB_ACODEC_AC3)
-            {
-                    [[mixdownPopUp menu] addItemWithTitle:
-                        [NSString stringWithCString: "AC3 Passthru"]
-                        action: NULL keyEquivalent: @""];
-            }
-            else
-            {
-
-                /* add the appropriate audio mixdown menuitems to the popupbutton */
-                /* in each case, we set the new menuitem's tag to be the amixdown value for that mixdown,
-                   so that we can reference the mixdown later */
-
-                /* keep a track of the min and max mixdowns we used, so we can select the best match later */
-                int minMixdownUsed = 0;
-                int maxMixdownUsed = 0;
-                
-                /* get the input channel layout without any lfe channels */
-                int layout = audio->input_channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
-
-                /* do we want to add a mono option? */
-                if (audioCodecsSupportMono == 1) {
-                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                        [NSString stringWithCString: hb_audio_mixdowns[0].human_readable_name]
-                        action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[0].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[0].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[0].amixdown);
-                }
-
-                /* do we want to add a stereo option? */
-                /* offer stereo if we have a mono source and non-mono-supporting codecs, as otherwise we won't have a mixdown at all */
-                /* also offer stereo if we have a stereo-or-better source */
-                if ((layout == HB_INPUT_CH_LAYOUT_MONO && audioCodecsSupportMono == 0) || layout >= HB_INPUT_CH_LAYOUT_STEREO) {
-                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                        [NSString stringWithCString: hb_audio_mixdowns[1].human_readable_name]
-                        action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[1].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[1].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[1].amixdown);
-                }
-
-                /* do we want to add a dolby surround (DPL1) option? */
-                if (layout == HB_INPUT_CH_LAYOUT_3F1R || layout == HB_INPUT_CH_LAYOUT_3F2R || layout == HB_INPUT_CH_LAYOUT_DOLBY) {
-                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                        [NSString stringWithCString: hb_audio_mixdowns[2].human_readable_name]
-                        action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[2].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[2].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[2].amixdown);
-                }
-
-                /* do we want to add a dolby pro logic 2 (DPL2) option? */
-                if (layout == HB_INPUT_CH_LAYOUT_3F2R) {
-                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                        [NSString stringWithCString: hb_audio_mixdowns[3].human_readable_name]
-                        action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[3].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[3].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[3].amixdown);
-                }
-
-                /* do we want to add a 6-channel discrete option? */
-                if (audioCodecsSupport6Ch == 1 && layout == HB_INPUT_CH_LAYOUT_3F2R && (audio->input_channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE)) {
-                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                        [NSString stringWithCString: hb_audio_mixdowns[4].human_readable_name]
-                        action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[4].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[4].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[4].amixdown);
-                }
-
-                /* auto-select the best mixdown based on our saved mixdown preference */
-                
-                /* for now, this is hard-coded to a "best" mixdown of HB_AMIXDOWN_DOLBYPLII */
-                /* ultimately this should be a prefs option */
-                int useMixdown;
-                
-                /* if we passed in a mixdown to use - in order to load a preset - then try and use it */
-                if (mixdownToUse > 0)
-                {
-                    useMixdown = mixdownToUse;
-                }
-                else
-                {
-                    useMixdown = HB_AMIXDOWN_DOLBYPLII;
-                }
-                
-                /* if useMixdown > maxMixdownUsed, then use maxMixdownUsed */
-                if (useMixdown > maxMixdownUsed) useMixdown = maxMixdownUsed;
-
-                /* if useMixdown < minMixdownUsed, then use minMixdownUsed */
-                if (useMixdown < minMixdownUsed) useMixdown = minMixdownUsed;
-
-                /* select the (possibly-amended) preferred mixdown */
-                [mixdownPopUp selectItemWithTag: useMixdown];
-                               
-                               /* lets call the audioTrackMixdownChanged method here to determine appropriate bitrates, etc. */
-                [self audioTrackMixdownChanged: NULL];
-            }
-
-        }
-        
-    }
-
-       /* see if the new audio track choice will change the bitrate we need */
-    [self calculateBitrate: sender];   
-
-}
-- (IBAction) audioTrackMixdownChanged: (id) sender
-{
-
-    /* find out what the currently-selected output audio codec is */
-    int format = [fDstFormatPopUp indexOfSelectedItem];
-    int codecs = [fDstCodecsPopUp indexOfSelectedItem];
-    int acodec = FormatSettings[format][codecs] & HB_ACODEC_MASK;
-    
-    /* storage variable for the min and max bitrate allowed for this codec */
-    int minbitrate;
-    int maxbitrate;
-    
-    switch( acodec )
-    {
-        case HB_ACODEC_FAAC:
-            /* check if we have a 6ch discrete conversion in either audio track */
-            if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)
-            {
-                /* FAAC is happy using our min bitrate of 32 kbps, even for 6ch */
-                minbitrate = 32;
-                /* If either mixdown popup includes 6-channel discrete, then allow up to 384 kbps */
-                maxbitrate = 384;
-                break;
-            }
-            else
-            {
-                /* FAAC is happy using our min bitrate of 32 kbps for stereo or mono */
-                minbitrate = 32;
-                /* FAAC won't honour anything more than 160 for stereo, so let's not offer it */
-                /* note: haven't dealt with mono separately here, FAAC will just use the max it can */
-                maxbitrate = 160;
-                break;
-            }
-
-        case HB_ACODEC_LAME:
-            /* Lame is happy using our min bitrate of 32 kbps */
-            minbitrate = 32;
-            /* Lame won't encode if the bitrate is higher than 320 kbps */
-            maxbitrate = 320;
-            break;
-
-        case HB_ACODEC_VORBIS:
-            /* Vorbis causes a crash if we use a bitrate below 48 kbps */
-            minbitrate = 48;
-            /* Vorbis can cope with 384 kbps quite happily, even for stereo */
-            maxbitrate = 384;
-            break;
-
-        default:
-            /* AC3 passthru disables the bitrate dropdown anyway, so we might as well just use the min and max bitrate */
-            minbitrate = 32;
-            maxbitrate = 384;
-        
-    }
-
-    [fAudBitratePopUp removeAllItems];
-
-    for( int i = 0; i < hb_audio_bitrates_count; i++ )
-    {
-        if (hb_audio_bitrates[i].rate >= minbitrate && hb_audio_bitrates[i].rate <= maxbitrate)
-        {
-            /* add a new menuitem for this bitrate */
-            id<NSMenuItem> menuItem = [[fAudBitratePopUp menu] addItemWithTitle:
-                [NSString stringWithCString: hb_audio_bitrates[i].string]
-                action: NULL keyEquivalent: @""];
-            /* set its tag to be the actual bitrate as an integer, so we can retrieve it later */
-            [menuItem setTag: hb_audio_bitrates[i].rate];
-        }
-    }
-
-    /* select the default bitrate (but use 384 for 6-ch AAC) */
-    if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)
-    {
-        [fAudBitratePopUp selectItemWithTag: 384];
-    }
-    else
-    {
-        [fAudBitratePopUp selectItemWithTag: hb_audio_bitrates[hb_audio_bitrates_default].rate];
-    }
-
-}
-
-- (IBAction) subtitleSelectionChanged: (id) sender
-{
-       if ([fSubPopUp indexOfSelectedItem] == 0)
-       {
-        [fSubForcedCheck setState: NSOffState];
-        [fSubForcedCheck setEnabled: NO];      
-       }
-       else
-       {
-        [fSubForcedCheck setEnabled: YES];     
-       }
-       
-}
+#pragma mark -
+#pragma mark - Picture
 
 /* lets set the picture size back to the max from right after title scan
    Lets use an IBAction here as down the road we could always use a checkbox
@@ -2647,6 +2488,13 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                                [self customSettingUsed: sender];
 }
 
+/**
+ * Registers changes made in the Picture Settings Window.
+ */
+
+- (void)pictureSettingsDidChange {
+       [self calculatePictureSizing: NULL];
+}
 
 /* Get and Display Current Pic Settings in main window */
 - (IBAction) calculatePictureSizing: (id) sender
@@ -2693,8 +2541,25 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     else {
         [fPicSettingDetelecine setStringValue: @"No"];
     }
-
-       /* Deinterlace */
+    
+    /* VFR (Variable Frame Rate) */
+    if ([fPictureController vfr]) {
+        /* vfr has to set the framerate to 29.97 (ntsc video)
+        and disable the framerate popup */
+        [fVidRatePopUp selectItemAtIndex: 8];
+        [fVidRatePopUp setEnabled: NO];
+        /* We change the string of the fps popup to warn that vfr is on Framerate (FPS): */
+        [fVidRateField setStringValue: @"Framerate (VFR On):"];  
+        
+    }
+    else {
+        /* vfr is off, make sure the framerate popup is enabled */
+        [fVidRatePopUp setEnabled: YES];
+        /* and make sure the label for framerate is set to its default */  
+        [fVidRateField setStringValue: @"Framerate (FPS):"];
+    }
+
+       /* Deinterlace */
        if ([fPictureController deinterlace] == 0)
        {
                [fPicSettingDeinterlace setStringValue: @"Off"];
@@ -2732,6 +2597,14 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        {
                [fPicSettingDenoise setStringValue: @"Strong"];
        }
+
+    /* Deblock */
+    if ([fPictureController deblock]) {
+        [fPicSettingDeblock setStringValue: @"Yes"];
+    }
+    else {
+        [fPicSettingDeblock setStringValue: @"No"];
+    }
        
        if (fTitle->job->pixel_ratio > 0)
        {
@@ -2750,1040 +2623,1395 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        {
                [fPicSettingAutoCrop setStringValue: @"Auto"];
        }       
-       /* check video framerate and turn off detelecine if necessary */
-       if (fTitle->rate_base == 1126125 || [[fVidRatePopUp titleOfSelectedItem] isEqualToString: @"23.976 (NTSC Film)"])
-       {
-               [fPictureController setDetelecine:0];
-       }
-       
        
-       
-       /* below will trigger the preset, if selected, to be
-       changed to "Custom". Lets comment out for now until
-       we figure out a way to determine if the picture values
-       changed modify the preset values */     
-       //[self customSettingUsed: sender];
+
 }
 
-- (IBAction) calculateBitrate: (id) sender
+
+#pragma mark -
+#pragma mark - Audio and Subtitles
+
+- (IBAction) setEnabledStateOfAudioMixdownControls: (id) sender
+{
+
+    /* enable/disable the mixdown text and popupbutton for audio track 1 */
+    [fAudTrack1MixPopUp setEnabled: ([fAudLang1PopUp indexOfSelectedItem] == 0) ? NO : YES];
+    [fAudTrack1MixLabel setTextColor: ([fAudLang1PopUp indexOfSelectedItem] == 0) ?
+        [NSColor disabledControlTextColor] : [NSColor controlTextColor]];
+
+    /* enable/disable the mixdown text and popupbutton for audio track 2 */
+    [fAudTrack2MixPopUp setEnabled: ([fAudLang2PopUp indexOfSelectedItem] == 0) ? NO : YES];
+    [fAudTrack2MixLabel setTextColor: ([fAudLang2PopUp indexOfSelectedItem] == 0) ?
+        [NSColor disabledControlTextColor] : [NSColor controlTextColor]];
+
+}
+
+- (IBAction) addAllAudioTracksToPopUp: (id) sender
 {
-    if( !fHandle || [fVidQualityMatrix selectedRow] != 0 || !SuccessfulScan )
-    {
-        return;
-    }
 
     hb_list_t  * list  = hb_get_titles( fHandle );
-    hb_title_t * title = (hb_title_t *) hb_list_item( list,
-            [fSrcTitlePopUp indexOfSelectedItem] );
-    hb_job_t * job = title->job;
+    hb_title_t * title = (hb_title_t*)
+        hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
 
-    [self PrepareJob];
+       hb_audio_t * audio;
+
+    [sender removeAllItems];
+    [sender addItemWithTitle: _( @"None" )];
+    for( int i = 0; i < hb_list_count( title->list_audio ); i++ )
+    {
+        audio = (hb_audio_t *) hb_list_item( title->list_audio, i );
+        [[sender menu] addItemWithTitle:
+            [NSString stringWithCString: audio->lang]
+            action: NULL keyEquivalent: @""];
+    }
+    [sender selectItemAtIndex: 0];
 
-    [fVidBitrateField setIntValue: hb_calc_bitrate( job,
-            [fVidTargetSizeField intValue] )];
 }
 
-/* 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
+- (IBAction) selectAudioTrackInPopUp: (id) sender searchPrefixString: (NSString *) searchPrefixString selectIndexIfNotFound: (int) selectIndexIfNotFound
 {
-       if ([sender stringValue] != NULL)
+
+    /* this method can be used to find a language, or a language-and-source-format combination, by passing in the appropriate string */
+    /* 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) 
        {
-               /* Deselect the currently selected Preset if there is one*/
-               [tableView deselectRow:[tableView selectedRow]];
-               [[fPresetsActionMenu itemAtIndex:0] setEnabled: NO];
-               /* Change UI to show "Custom" settings are being used */
-               [fPresetSelectedDisplay setStringValue: @"Custom"];
-               
-               curUserPresetChosenNum = nil;
+
+        for( int i = 0; i < [sender numberOfItems]; i++ )
+        {
+            /* Try to find the desired search string */
+            if ([[[sender itemAtIndex: i] title] hasPrefix:searchPrefixString])
+            {
+                [sender selectItemAtIndex: i];
+                return;
+            }
+        }
+        /* couldn't find the string, so select the requested "search string not found" item */
+        /* index of 0 means select the "none" item */
+        /* index of 1 means select the first audio track */
+        [sender selectItemAtIndex: selectIndexIfNotFound];
        }
+    else
+    {
+        /* if no search string is provided, then select the selectIndexIfNotFound item */
+        [sender selectItemAtIndex: selectIndexIfNotFound];
+    }
 
 }
 
-   /* We use this method to recreate new, updated factory
-   presets */
-- (IBAction)addFactoryPresets:(id)sender
+- (IBAction) audioTrackPopUpChanged: (id) sender
 {
-    /* First, we delete any existing built in presets */
-    [self deleteFactoryPresets: sender];
-    /* Then, we re-create new built in presets programmatically CreateIpodOnlyPreset*/
-    [UserPresets addObject:[self createNormalPreset]];
-    [UserPresets addObject:[self createClassicPreset]];
-    [UserPresets addObject:[self createQuickTimePreset]];
-       [UserPresets addObject:[self createIpodLowPreset]];
-       [UserPresets addObject:[self createIpodHighPreset]];
-       [UserPresets addObject:[self createAppleTVPreset]];
-    [UserPresets addObject:[self createiPhonePreset]];
-       [UserPresets addObject:[self createPSThreePreset]];
-       [UserPresets addObject:[self createPSPPreset]];
-       [UserPresets addObject:[self createFilmPreset]];
-    [UserPresets addObject:[self createTelevisionPreset]];
-    [UserPresets addObject:[self createAnimationPreset]];
-    [UserPresets addObject:[self createBedlamPreset]];
-    [UserPresets addObject:[self createDeuxSixQuatrePreset]];
-    [UserPresets addObject:[self createBrokePreset]];
-    [UserPresets addObject:[self createBlindPreset]];
-    [UserPresets addObject:[self createCRFPreset]];
-    
-    [self addPreset];
+    /* utility function to call audioTrackPopUpChanged without passing in a mixdown-to-use */
+    [self audioTrackPopUpChanged: sender mixdownToUse: 0];
 }
-- (IBAction)deleteFactoryPresets:(id)sender
+
+- (IBAction) audioTrackPopUpChanged: (id) sender mixdownToUse: (int) mixdownToUse
 {
-    //int status;
-    NSEnumerator *enumerator = [UserPresets objectEnumerator];
-       id tempObject;
-    
-       //NSNumber *index;
-    NSMutableArray *tempArray;
 
+    /* make sure we have a selected title before continuing */
+    if (fTitle == NULL) return;
 
-        tempArray = [NSMutableArray array];
-        /* we look here to see if the preset is we move on to the next one */
-        while ( tempObject = [enumerator nextObject] )  
-               {
-                       /* if the preset is "Factory" then we put it in the array of
-                       presets to delete */
-                       if ([[tempObject objectForKey:@"Type"] intValue] == 0)
-                       {
-                               [tempArray addObject:tempObject];
-                       }
-        }
-        
-        [UserPresets removeObjectsInArray:tempArray];
-        [tableView reloadData];
-        [self savePreset];   
+    /* find out if audio track 1 or 2 was changed - this is passed to us in the tag of the sender */
+    /* the sender will have been either fAudLang1PopUp (tag = 0) or fAudLang2PopUp (tag = 1) */
+    int thisAudio = [sender tag];
 
-}
+    /* get the index of the selected audio */
+    int thisAudioIndex = [sender indexOfSelectedItem] - 1;
 
-- (IBAction) showAddPresetPanel: (id) sender
-{
-    /* Deselect the currently selected Preset if there is one*/
-    [tableView deselectRow:[tableView selectedRow]];
+    /* Handbrake can't currently cope with ripping the same source track twice */
+    /* So, if this audio is also selected in the other audio track popup, set that popup's selection to "none" */
+    /* get a reference to the two audio track popups */
+    NSPopUpButton * thisAudioPopUp  = (thisAudio == 1 ? fAudLang2PopUp : fAudLang1PopUp);
+    NSPopUpButton * otherAudioPopUp = (thisAudio == 1 ? fAudLang1PopUp : fAudLang2PopUp);
+    /* if the same track is selected in the other audio popup, then select "none" in that popup */
+    /* unless, of course, both are selected as "none!" */
+    if ([thisAudioPopUp indexOfSelectedItem] != 0 && [thisAudioPopUp indexOfSelectedItem] == [otherAudioPopUp indexOfSelectedItem]) {
+        [otherAudioPopUp selectItemAtIndex: 0];
+        [self audioTrackPopUpChanged: otherAudioPopUp];
+    }
 
-    /* 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*/
-       [fPresetNewName setStringValue: @""];
-       [fPresetNewDesc setStringValue: @""];
-       /* Show the panel */
-       [NSApp beginSheet: fAddPresetPanel modalForWindow: fWindow modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
-}
+    /* pointer for the hb_audio_s struct we will use later on */
+    hb_audio_t * audio;
 
-- (IBAction) closeAddPresetPanel: (id) sender
-{
-    [NSApp endSheet: fAddPresetPanel];
-    [fAddPresetPanel orderOut: self];
-}
+    /* find out what the currently-selected output audio codec is */
+    int format = [fDstFormatPopUp indexOfSelectedItem];
+    int codecs = [fDstCodecsPopUp indexOfSelectedItem];
+    int acodec = FormatSettings[format][codecs] & HB_ACODEC_MASK;
 
-- (IBAction)addUserPreset:(id)sender
-{
-    if (![[fPresetNewName stringValue] length])
-            NSRunAlertPanel(@"Warning!", @"You need to insert a name for the preset.", @"OK", nil , nil);
+    /* pointer to this track's mixdown NSPopUpButton */
+    NSTextField   * mixdownTextField;
+    NSPopUpButton * mixdownPopUp;
+
+    /* find our mixdown NSTextField and NSPopUpButton */
+    if (thisAudio == 0)
+    {
+        mixdownTextField = fAudTrack1MixLabel;
+        mixdownPopUp = fAudTrack1MixPopUp;
+    }
     else
     {
-        /* Here we create a custom user preset */
-        [UserPresets addObject:[self createPreset]];
-        [self addPreset];
-        
-        [self closeAddPresetPanel:NULL];
+        mixdownTextField = fAudTrack2MixLabel;
+        mixdownPopUp = fAudTrack2MixPopUp;
     }
-}
-- (void)addPreset
-{
 
-       
-       /* We Sort the Presets By Factory or Custom */
-       NSSortDescriptor * presetTypeDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"Type" 
-                                                    ascending:YES] autorelease];
-       /* We Sort the Presets Alphabetically by name */
-       NSSortDescriptor * presetNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"PresetName" 
-                                                    ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease];
-       NSArray *sortDescriptors=[NSArray arrayWithObjects:presetTypeDescriptor,presetNameDescriptor,nil];
-       NSArray *sortedArray=[UserPresets sortedArrayUsingDescriptors:sortDescriptors];
-       [UserPresets setArray:sortedArray];
-       
-       
-       /* We Reload the New Table data for presets */
-    [tableView reloadData];
-   /* We save all of the preset data here */
-    [self savePreset];
-}
+    /* delete the previous audio mixdown options */
+    [mixdownPopUp removeAllItems];
 
-- (IBAction)insertPreset:(id)sender
-{
-    int index = [tableView selectedRow];
-    [UserPresets insertObject:[self createPreset] atIndex:index];
-    [tableView reloadData];
-    [self savePreset];
-}
+    /* check if the audio mixdown controls need their enabled state changing */
+    [self setEnabledStateOfAudioMixdownControls: NULL];
 
-- (NSDictionary *)createPreset
-{
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:[fPresetNewName stringValue] forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:[fPresetNewPicSettingsPopUp indexOfSelectedItem]] forKey:@"UsesPictureSettings"];
-       /* Get New Preset Description from the field in the AddPresetPanel*/
-       [preset setObject:[fPresetNewDesc stringValue] forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:[fDstFormatPopUp titleOfSelectedItem] forKey:@"FileFormat"];
-       /* Chapter Markers fCreateChapterMarkers*/
-       [preset setObject:[NSNumber numberWithInt:[fCreateChapterMarkers state]] forKey:@"ChapterMarkers"];
-       /* Allow Mpeg4 64 bit formatting +4GB file sizes */
-       [preset setObject:[NSNumber numberWithInt:[fDstMpgLargeFileCheck state]] forKey:@"Mp4LargeFile"];
-       /* Codecs */
-       [preset setObject:[fDstCodecsPopUp titleOfSelectedItem] forKey:@"FileCodecs"];
-       /* 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 */
-       [preset setObject:[fVidRatePopUp titleOfSelectedItem] forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:[fVidGrayscaleCheck state]] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"];
-       /* Turbo 2 pass Encoding fVidTurboPassCheck*/
-       [preset setObject:[NSNumber numberWithInt:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"];
-       /*Picture Settings*/
-       hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [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:[fPictureController deinterlace]] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:fTitle->job->pixel_ratio] forKey:@"PicturePAR"];
-       [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:[fPictureController autoCrop]] forKey:@"PictureAutoCrop"];
-
-       [preset setObject:[NSNumber numberWithInt:job->crop[0]] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:job->crop[1]] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:job->crop[2]] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:job->crop[3]] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:[fAudRatePopUp titleOfSelectedItem] forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:[fAudBitratePopUp titleOfSelectedItem] forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:[fSubPopUp titleOfSelectedItem] forKey:@"Subtitles"];
-       
-
-    [preset autorelease];
-    return preset;
+    if (thisAudioIndex != -1)
+    {
 
-}
+        /* get the audio */
+        audio = (hb_audio_t *) hb_list_item( fTitle->list_audio, thisAudioIndex );
+        if (audio != NULL)
+        {
 
-- (NSDictionary *)createIpodLowPreset
-{
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"iPod Low-Rez" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's low resolution settings for the iPod. Optimized for great playback on the iPod screen, with smaller file size." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"700" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
-       
-       /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:320] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
+            /* 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 */
+            /* audioCodecsSupportMono and audioCodecsSupport6Ch are the same for now,
+               but this may change in the future, so they are separated for flexibility */
+            int audioCodecsSupportMono = ((audio->codec == HB_ACODEC_AC3 ||
+                audio->codec == HB_ACODEC_DCA) && acodec == HB_ACODEC_FAAC);
+            int audioCodecsSupport6Ch =  ((audio->codec == HB_ACODEC_AC3 ||
+                audio->codec == HB_ACODEC_DCA) && (acodec == HB_ACODEC_FAAC ||
+                acodec == HB_ACODEC_VORBIS));
 
-    [preset autorelease];
-    return preset;
+            /* check for AC-3 passthru */
+            if (audio->codec == HB_ACODEC_AC3 && acodec == HB_ACODEC_AC3)
+            {
+                    [[mixdownPopUp menu] addItemWithTitle:
+                        [NSString stringWithCString: "AC3 Passthru"]
+                        action: NULL keyEquivalent: @""];
+            }
+            else
+            {
 
-}
+                /* add the appropriate audio mixdown menuitems to the popupbutton */
+                /* in each case, we set the new menuitem's tag to be the amixdown value for that mixdown,
+                   so that we can reference the mixdown later */
 
+                /* keep a track of the min and max mixdowns we used, so we can select the best match later */
+                int minMixdownUsed = 0;
+                int maxMixdownUsed = 0;
+                
+                /* get the input channel layout without any lfe channels */
+                int layout = audio->input_channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
 
-- (NSDictionary *)createIpodHighPreset
-{
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"iPod High-Rez" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's high resolution settings for the iPod. Good video quality, great for viewing on a TV using your iPod" forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1500" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
-       
-       /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:640] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
+                /* do we want to add a mono option? */
+                if (audioCodecsSupportMono == 1) {
+                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
+                        [NSString stringWithCString: hb_audio_mixdowns[0].human_readable_name]
+                        action: NULL keyEquivalent: @""];
+                    [menuItem setTag: hb_audio_mixdowns[0].amixdown];
+                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[0].amixdown;
+                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[0].amixdown);
+                }
 
-    [preset autorelease];
-    return preset;
+                /* do we want to add a stereo option? */
+                /* offer stereo if we have a mono source and non-mono-supporting codecs, as otherwise we won't have a mixdown at all */
+                /* also offer stereo if we have a stereo-or-better source */
+                if ((layout == HB_INPUT_CH_LAYOUT_MONO && audioCodecsSupportMono == 0) || layout >= HB_INPUT_CH_LAYOUT_STEREO) {
+                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
+                        [NSString stringWithCString: hb_audio_mixdowns[1].human_readable_name]
+                        action: NULL keyEquivalent: @""];
+                    [menuItem setTag: hb_audio_mixdowns[1].amixdown];
+                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[1].amixdown;
+                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[1].amixdown);
+                }
 
-}
+                /* do we want to add a dolby surround (DPL1) option? */
+                if (layout == HB_INPUT_CH_LAYOUT_3F1R || layout == HB_INPUT_CH_LAYOUT_3F2R || layout == HB_INPUT_CH_LAYOUT_DOLBY) {
+                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
+                        [NSString stringWithCString: hb_audio_mixdowns[2].human_readable_name]
+                        action: NULL keyEquivalent: @""];
+                    [menuItem setTag: hb_audio_mixdowns[2].amixdown];
+                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[2].amixdown;
+                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[2].amixdown);
+                }
 
-- (NSDictionary *)createAppleTVPreset
-{
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"AppleTV" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for the AppleTV. Provides a good balance between quality and file size, and optimizes performance." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-       /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String (We can use this to tweak the appleTV output)*/
-       [preset setObject:@"bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:trellis=2:cabac=0" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
-       
-       /*Picture Settings*/
-       /* For AppleTV we only want to retain UsesMaxPictureSettings
-       which depend on the source dvd picture settings, so we don't
-       record the current dvd's picture info since it will vary from
-       source to source*/
-       //hb_job_t * job = fTitle->job;
-       //hb_job_t * job = title->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
+                /* do we want to add a dolby pro logic 2 (DPL2) option? */
+                if (layout == HB_INPUT_CH_LAYOUT_3F2R) {
+                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
+                        [NSString stringWithCString: hb_audio_mixdowns[3].human_readable_name]
+                        action: NULL keyEquivalent: @""];
+                    [menuItem setTag: hb_audio_mixdowns[3].amixdown];
+                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[3].amixdown;
+                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[3].amixdown);
+                }
 
-    [preset autorelease];
-    return preset;
+                /* do we want to add a 6-channel discrete option? */
+                if (audioCodecsSupport6Ch == 1 && layout == HB_INPUT_CH_LAYOUT_3F2R && (audio->input_channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE)) {
+                    id<NSMenuItem> menuItem = [[mixdownPopUp menu] addItemWithTitle:
+                        [NSString stringWithCString: hb_audio_mixdowns[4].human_readable_name]
+                        action: NULL keyEquivalent: @""];
+                    [menuItem setTag: hb_audio_mixdowns[4].amixdown];
+                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[4].amixdown;
+                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[4].amixdown);
+                }
 
-}
+                /* auto-select the best mixdown based on our saved mixdown preference */
+                
+                /* for now, this is hard-coded to a "best" mixdown of HB_AMIXDOWN_DOLBYPLII */
+                /* ultimately this should be a prefs option */
+                int useMixdown;
+                
+                /* if we passed in a mixdown to use - in order to load a preset - then try and use it */
+                if (mixdownToUse > 0)
+                {
+                    useMixdown = mixdownToUse;
+                }
+                else
+                {
+                    useMixdown = HB_AMIXDOWN_DOLBYPLII;
+                }
+                
+                /* if useMixdown > maxMixdownUsed, then use maxMixdownUsed */
+                if (useMixdown > maxMixdownUsed) useMixdown = maxMixdownUsed;
 
-- (NSDictionary *)createPSThreePreset
-{
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"PS3" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for the Sony PlayStation 3." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-       /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String (We can use this to tweak the appleTV output)*/
-       [preset setObject:@"level=41:subme=5:me=umh" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
-       
-       /*Picture Settings*/
-       /* For PS3 we only want to retain UsesMaxPictureSettings
-       which depend on the source dvd picture settings, so we don't
-       record the current dvd's picture info since it will vary from
-       source to source*/
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
+                /* if useMixdown < minMixdownUsed, then use minMixdownUsed */
+                if (useMixdown < minMixdownUsed) useMixdown = minMixdownUsed;
 
-    [preset autorelease];
-    return preset;
+                /* select the (possibly-amended) preferred mixdown */
+                [mixdownPopUp selectItemWithTag: useMixdown];
+                               
+                               /* lets call the audioTrackMixdownChanged method here to determine appropriate bitrates, etc. */
+                [self audioTrackMixdownChanged: NULL];
+            }
 
-}
-- (NSDictionary *)createPSPPreset
-{
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"PSP" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for the Sony PlayStation Portable." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-       /* Codecs */
-       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
-       /* x264 Option String (We can use this to tweak the appleTV output)*/
-       [preset setObject:@"" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1024" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
-       
-       /*Picture Settings*/
-       /* For PS3 we only want to retain UsesMaxPictureSettings
-       which depend on the source dvd picture settings, so we don't
-       record the current dvd's picture info since it will vary from
-       source to source*/
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:@"368" forKey:@"PictureWidth"];
-       [preset setObject:@"208" forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"128" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
+        }
+        
+    }
 
-    [preset autorelease];
-    return preset;
+       /* see if the new audio track choice will change the bitrate we need */
+    [self calculateBitrate: sender];   
 
 }
-
-- (NSDictionary *)createNormalPreset
+- (IBAction) audioTrackMixdownChanged: (id) sender
 {
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Normal" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's normal, default settings." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"ref=2:bframes=2:subme=5:me=umh" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1500" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
-       
-       /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
 
-    [preset autorelease];
-    return preset;
+    /* find out what the currently-selected output audio codec is */
+    int format = [fDstFormatPopUp indexOfSelectedItem];
+    int codecs = [fDstCodecsPopUp indexOfSelectedItem];
+    int acodec = FormatSettings[format][codecs] & HB_ACODEC_MASK;
+    
+    /* storage variable for the min and max bitrate allowed for this codec */
+    int minbitrate;
+    int maxbitrate;
+    
+    switch( acodec )
+    {
+        case HB_ACODEC_FAAC:
+            /* check if we have a 6ch discrete conversion in either audio track */
+            if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)
+            {
+                /* FAAC is happy using our min bitrate of 32 kbps, even for 6ch */
+                minbitrate = 32;
+                /* If either mixdown popup includes 6-channel discrete, then allow up to 384 kbps */
+                maxbitrate = 384;
+                break;
+            }
+            else
+            {
+                /* FAAC is happy using our min bitrate of 32 kbps for stereo or mono */
+                minbitrate = 32;
+                /* FAAC won't honour anything more than 160 for stereo, so let's not offer it */
+                /* note: haven't dealt with mono separately here, FAAC will just use the max it can */
+                maxbitrate = 160;
+                break;
+            }
+
+        case HB_ACODEC_LAME:
+            /* Lame is happy using our min bitrate of 32 kbps */
+            minbitrate = 32;
+            /* Lame won't encode if the bitrate is higher than 320 kbps */
+            maxbitrate = 320;
+            break;
+
+        case HB_ACODEC_VORBIS:
+        if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)
+            {
+                /* Vorbis causes a crash if we use a bitrate below 192 kbps with 6 channel */
+                minbitrate = 192;
+                /* If either mixdown popup includes 6-channel discrete, then allow up to 384 kbps */
+                maxbitrate = 384;
+                break;
+            }
+            else
+            {
+            /* Vorbis causes a crash if we use a bitrate below 48 kbps */
+            minbitrate = 48;
+            /* Vorbis can cope with 384 kbps quite happily, even for stereo */
+            maxbitrate = 384;
+            break;
+            }
+
+        default:
+            /* AC3 passthru disables the bitrate dropdown anyway, so we might as well just use the min and max bitrate */
+            minbitrate = 32;
+            maxbitrate = 384;
+        
+    }
+
+    [fAudBitratePopUp removeAllItems];
+
+    for( int i = 0; i < hb_audio_bitrates_count; i++ )
+    {
+        if (hb_audio_bitrates[i].rate >= minbitrate && hb_audio_bitrates[i].rate <= maxbitrate)
+        {
+            /* add a new menuitem for this bitrate */
+            id<NSMenuItem> menuItem = [[fAudBitratePopUp menu] addItemWithTitle:
+                [NSString stringWithCString: hb_audio_bitrates[i].string]
+                action: NULL keyEquivalent: @""];
+            /* set its tag to be the actual bitrate as an integer, so we can retrieve it later */
+            [menuItem setTag: hb_audio_bitrates[i].rate];
+        }
+    }
+
+    /* select the default bitrate (but use 384 for 6-ch AAC) */
+    if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH || [[fAudTrack2MixPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)
+    {
+        [fAudBitratePopUp selectItemWithTag: 384];
+    }
+    else
+    {
+        [fAudBitratePopUp selectItemWithTag: hb_audio_bitrates[hb_audio_bitrates_default].rate];
+    }
 
 }
 
-- (NSDictionary *)createClassicPreset
+- (IBAction) subtitleSelectionChanged: (id) sender
 {
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Classic" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's traditional, faster, lower-quality settings." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:0] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1000" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
-       
-       /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
+       if ([fSubPopUp indexOfSelectedItem] == 0)
+       {
+        [fSubForcedCheck setState: NSOffState];
+        [fSubForcedCheck setEnabled: NO];      
+       }
+       else
+       {
+        [fSubForcedCheck setEnabled: YES];     
+       }
        
+}
+
+
 
-    [preset autorelease];
-    return preset;
 
+#pragma mark -
+#pragma mark Open New Windows
+
+- (IBAction) openHomepage: (id) sender
+{
+    [[NSWorkspace sharedWorkspace] openURL: [NSURL
+        URLWithString:@"http://handbrake.m0k.org/"]];
 }
 
-- (NSDictionary *)createFilmPreset
+- (IBAction) openForums: (id) sender
 {
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Film" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's preset for feature films." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MKV file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:no-fast-pskip" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
-       
-       /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
-
-    [preset autorelease];
-    return preset;
-
+    [[NSWorkspace sharedWorkspace] openURL: [NSURL
+        URLWithString:@"http://handbrake.m0k.org/forum/"]];
 }
-
-- (NSDictionary *)createTelevisionPreset
+- (IBAction) openUserGuide: (id) sender
 {
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Television" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for video from television." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MKV file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"ref=3:mixed-refs:bframes=6:bime:weightb:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1300" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
-       
-       /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
-
-    [preset autorelease];
-    return preset;
-
+    [[NSWorkspace sharedWorkspace] openURL: [NSURL
+        URLWithString:@"http://handbrake.m0k.org/trac/wiki/HandBrakeGuide"]];
 }
 
-- (NSDictionary *)createAnimationPreset
+/**
+ * Shows debug output window.
+ */
+- (IBAction)showDebugOutputPanel:(id)sender
 {
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Animation" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for cartoons, anime, and CGI." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MKV file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"ref=5:mixed-refs:bframes=6:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=5:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip:filter=2,2" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1000" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
-       
-       /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
+    [outputPanel showOutputPanel:sender];
+}
 
-    [preset autorelease];
-    return preset;
+/**
+ * Shows preferences window.
+ */
+- (IBAction) showPreferencesWindow: (id) sender
+{
+    NSWindow * window = [fPreferencesController window];
+    if (![window isVisible])
+        [window center];
 
+    [window makeKeyAndOrderFront: nil];
 }
 
-- (NSDictionary *)createQuickTimePreset
+/**
+ * Shows queue window.
+ */
+- (IBAction) showQueueWindow:(id)sender
 {
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
-       /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"QuickTime" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
-       /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
-       /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's high quality settings for use with QuickTime. It can be slow, so use it when the Normal preset doesn't look good enough." forKey:@"PresetDescription"];
-       /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
-       /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
-       /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:me=umh:subme=5:analyse=all:8x8dct:trellis=1:no-fast-pskip" forKey:@"x264Option"];
-       /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
-       
-       /* Video framerate */
-       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
-       /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
-       /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
-       
-       /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
-       /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
-       /* Set crop settings here */
-       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
-       
-       /*Audio*/
-       /* Audio Sample Rate*/
-       [preset setObject:@"48" forKey:@"AudioSampleRate"];
-       /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
-       /* Subtitles*/
-       [preset setObject:@"None" forKey:@"Subtitles"];
-       
+    [fQueueController showQueueWindow:sender];
+}
 
-    [preset autorelease];
-    return preset;
 
+- (IBAction) toggleDrawer:(id)sender {
+    [fPresetDrawer toggle:self];
 }
 
-- (NSDictionary *)createBedlamPreset
+/**
+ * Shows Picture Settings Window.
+ */
+
+- (IBAction) showPicturePanel: (id) sender
 {
-    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       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];
+}
+
+#pragma mark -
+#pragma mark Preset Table View Methods
+
+- (IBAction)tableViewSelected:(id)sender
+{
+    /* Since we cannot disable the presets tableView in terms of clickability
+          we will use the enabled state of the add presets button to determine whether
+          or not clicking on a preset will do anything */
+       if ([fPresetsAdd isEnabled])
+       {
+               if ([tableView selectedRow] >= 0)
+               {       
+                       /* we get the chosen preset from the UserPresets array */
+                       chosenPreset = [UserPresets objectAtIndex:[tableView selectedRow]];
+                       curUserPresetChosenNum = [sender selectedRow];
+                       /* we set the preset display field in main window here */
+                       [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PresetName"]]];
+                       if ([[chosenPreset objectForKey:@"Default"] intValue] == 1)
+                       {
+                               [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@ (Default)",[chosenPreset valueForKey:@"PresetName"]]];
+                       }
+                       else
+                       {
+                               [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PresetName"]]];
+                       }
+                       /* File Format */
+                       [fDstFormatPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"FileFormat"]]];
+                       [self formatPopUpChanged: NULL];
+                       
+                       /* Chapter Markers*/
+                       [fCreateChapterMarkers setState:[[chosenPreset objectForKey:@"ChapterMarkers"] intValue]];
+                       /* Allow Mpeg4 64 bit formatting +4GB file sizes */
+                       [fDstMpgLargeFileCheck setState:[[chosenPreset objectForKey:@"Mp4LargeFile"] intValue]];
+                       /* Codecs */
+                       [fDstCodecsPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]]];
+                       [self codecsPopUpChanged: NULL];
+                       /* Video encoder */
+                       [fVidEncoderPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]]];
+                       
+                       /* 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 */
+                       [fAdvancedOptions setOptions: [NSString stringWithFormat:[chosenPreset valueForKey:@"x264Option"]]];
+                       
+                       /* Lets run through the following functions to get variables set there */
+                       [self encoderPopUpChanged: NULL];
+                       
+                       [self calculateBitrate: NULL];
+                       
+                       /* 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];
+                       
+                       /* 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"])
+            {
+                [fVidRatePopUp selectItemAtIndex: 0];
+            }
+            else
+            {
+                [fVidRatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoFramerate"]]];
+            }
+                       
+                       /* GrayScale */
+                       [fVidGrayscaleCheck setState:[[chosenPreset objectForKey:@"VideoGrayScale"] intValue]];
+                       
+                       /* 2 Pass Encoding */
+                       [fVidTwoPassCheck setState:[[chosenPreset objectForKey:@"VideoTwoPass"] intValue]];
+                       [self twoPassCheckboxChanged: NULL];
+                       /* Turbo 1st pass for 2 Pass Encoding */
+                       [fVidTurboPassCheck setState:[[chosenPreset objectForKey:@"VideoTurboTwoPass"] intValue]];
+                       
+                       /*Audio*/
+                       
+                       /* Audio Sample Rate*/
+                       [fAudRatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioSampleRate"]]];
+                       /* Audio Bitrate Rate*/
+                       [fAudBitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioBitRate"]]];
+                       /*Subtitles*/
+                       [fSubPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Subtitles"]]];
+                       
+                       /* Picture Settings */
+                       /* Look to see if we apply these here in objectForKey:@"UsesPictureSettings"] */
+                       if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] > 0)
+                       {
+                               hb_job_t * job = fTitle->job;
+                               /* Check to see if we should use the max picture setting for the current title*/
+                               if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] == 2 || [[chosenPreset objectForKey:@"UsesMaxPictureSettings"]  intValue] == 1)
+                               {
+                                       /* Use Max Picture settings for whatever the dvd is.*/
+                                       [self revertPictureSizeToMax: NULL];
+                                       job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
+                                       if (job->keep_ratio == 1)
+                                       {
+                                               hb_fix_aspect( job, HB_KEEP_WIDTH );
+                                               if( job->height > fTitle->height )
+                                               {
+                                                       job->height = fTitle->height;
+                                                       hb_fix_aspect( job, HB_KEEP_HEIGHT );
+                                               }
+                                       }
+                                       job->pixel_ratio = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
+                               }
+                               else // Apply picture settings that were in effect at the time the preset was saved
+                               {
+                                       job->width = [[chosenPreset objectForKey:@"PictureWidth"]  intValue];
+                                       job->height = [[chosenPreset objectForKey:@"PictureHeight"]  intValue];
+                                       job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
+                                       if (job->keep_ratio == 1)
+                                       {
+                                               hb_fix_aspect( job, HB_KEEP_WIDTH );
+                                               if( job->height > fTitle->height )
+                                               {
+                                                       job->height = fTitle->height;
+                                                       hb_fix_aspect( job, HB_KEEP_HEIGHT );
+                                               }
+                                       }
+                                       job->pixel_ratio = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
+                    
+                    /* Filters */
+                    [fPictureController setDeinterlace:[[chosenPreset objectForKey:@"PictureDeinterlace"] intValue]];
+                                       
+                                       if ([chosenPreset objectForKey:@"PictureDetelecine"])
+                                       {
+                        [fPictureController setDetelecine:[[chosenPreset objectForKey:@"PictureDetelecine"] intValue]];
+                                       }
+                                       if ([chosenPreset objectForKey:@"PictureDenoise"])
+                                       {
+                        [fPictureController setDenoise:[[chosenPreset objectForKey:@"PictureDenoise"] intValue]];
+                                       }
+                    if ([chosenPreset objectForKey:@"PictureDeblock"])
+                                       {
+                        [fPictureController setDeblock:[[chosenPreset objectForKey:@"PictureDeblock"] 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)
+                                       {
+                        [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];
+                                               job->crop[1] = [[chosenPreset objectForKey:@"PictureBottomCrop"]  intValue];
+                                               job->crop[2] = [[chosenPreset objectForKey:@"PictureLeftCrop"]  intValue];
+                                               job->crop[3] = [[chosenPreset objectForKey:@"PictureRightCrop"]  intValue];
+                                               
+                                       }
+                                       else /* if auto crop has been saved in preset, set to auto and use post scan auto crop */
+                                       {
+                        [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;
+                                               job->crop[3] = AutoCropRight;
+                                               
+                                       }
+                               }
+                               [self calculatePictureSizing: NULL]; 
+                       }
+                       
+                       
+                       [[fPresetsActionMenu itemAtIndex:0] setEnabled: YES];
+                       }
+}
+}
+
+
+
+- (int)numberOfRowsInTableView:(NSTableView *)aTableView
+{
+    return [UserPresets count];
+}
+
+/* we use this to determine display characteristics for
+each table cell based on content currently only used to
+show the built in presets in a blue font. */
+- (void)tableView:(NSTableView *)aTableView
+ willDisplayCell:(id)aCell 
+ forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
+{
+    NSDictionary *userPresetDict = [UserPresets objectAtIndex:rowIndex];
+       NSFont *txtFont;
+       NSColor *fontColor;
+       NSColor *shadowColor;
+       txtFont = [NSFont systemFontOfSize: [NSFont smallSystemFontSize]];
+       /* First, we check to see if its a selected row, if so, we use white since its highlighted in blue */
+       if ([[aTableView selectedRowIndexes] containsIndex:rowIndex] && ([tableView editedRow] != rowIndex))
+       {
+               
+               fontColor = [NSColor whiteColor];
+               shadowColor = [NSColor colorWithDeviceRed:(127.0/255.0) green:(140.0/255.0) blue:(160.0/255.0) alpha:1.0];
+       }
+       else
+       {
+               /* We set the properties of unselected rows */
+               /* if built-in preset (defined by "type" == 0) we use a blue font */
+               if ([[userPresetDict objectForKey:@"Type"] intValue] == 0)
+               {
+                       fontColor = [NSColor blueColor];
+               }
+               else // User created preset, use a black font
+               {
+                       fontColor = [NSColor blackColor];
+               }
+               shadowColor = nil;
+       }
+       /* We check to see if this is the HB default, if so, color it appropriately */
+       if (!presetUserDefault && presetHbDefault && rowIndex == presetHbDefault)
+       {
+       txtFont = [NSFont boldSystemFontOfSize: [NSFont smallSystemFontSize]];
+       }
+       /* We check to see if this is the User Specified default, if so, color it appropriately */
+       if (presetUserDefault && rowIndex == presetUserDefault)
+       {
+       txtFont = [NSFont boldSystemFontOfSize: [NSFont smallSystemFontSize]];
+       }
+       
+       [aCell setTextColor:fontColor];
+       [aCell setFont:txtFont];
+       /* this shadow stuff (like mail app) for some reason looks crappy, commented out
+       temporarily in case we want to resurrect it */
+       /*
+       NSShadow *shadow = [[NSShadow alloc] init];
+       NSSize shadowOffset = { width: 1.0, height: -1.5};
+       [shadow setShadowOffset:shadowOffset];
+       [shadow setShadowColor:shadowColor];
+       [shadow set];
+       */
+       
+}
+/* Method to display tooltip with the description for each preset, if available */
+- (NSString *)tableView:(NSTableView *)aTableView toolTipForCell:(NSCell *)aCell 
+                   rect:(NSRectPointer)aRect tableColumn:(NSTableColumn *)aTableColumn
+                    row:(int)rowIndex mouseLocation:(NSPoint)aPos
+{
+     /* initialize the tooltip contents variable */
+        NSString *loc_tip;
+     /* 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);
+        }
+        else
+        {
+        loc_tip = @"No description available";
+        }
+        return (loc_tip);
+
+}
+
+- (id)tableView:(NSTableView *)aTableView
+      objectValueForTableColumn:(NSTableColumn *)aTableColumn
+      row:(int)rowIndex
+{
+id theRecord, theValue;
+    
+    theRecord = [UserPresets objectAtIndex:rowIndex];
+    theValue = [theRecord objectForKey:[aTableColumn identifier]];
+    return theValue;
+}
+
+// NSTableDataSource method that we implement to edit values directly in the table...
+- (void)tableView:(NSTableView *)aTableView
+        setObjectValue:(id)anObject
+        forTableColumn:(NSTableColumn *)aTableColumn
+        row:(int)rowIndex
+{
+    id theRecord;
+    
+    theRecord = [UserPresets objectAtIndex:rowIndex];
+    [theRecord setObject:anObject forKey:@"PresetName"];
+    /* We Sort the Presets By Factory or Custom */
+       NSSortDescriptor * presetTypeDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"Type" 
+                                                    ascending:YES] autorelease];
+               /* We Sort the Presets Alphabetically by name */
+       NSSortDescriptor * presetNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"PresetName" 
+                                                    ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease];
+       NSArray *sortDescriptors=[NSArray arrayWithObjects:presetTypeDescriptor,presetNameDescriptor,nil];
+    NSArray *sortedArray=[UserPresets sortedArrayUsingDescriptors:sortDescriptors];
+       [UserPresets setArray:sortedArray];
+       /* We Reload the New Table data for presets */
+    [tableView reloadData];
+   /* We save all of the preset data here */
+    [self savePreset];
+}
+
+
+
+
+#pragma mark -
+#pragma mark Manage Presets
+
+- (void) loadPresets {
+       /* We declare the default NSFileManager into fileManager */
+       NSFileManager * fileManager = [NSFileManager defaultManager];
+       /*We define the location of the user presets file */
+    UserPresetsFile = @"~/Library/Application Support/HandBrake/UserPresets.plist";
+       UserPresetsFile = [[UserPresetsFile stringByExpandingTildeInPath]retain];
+    /* We check for the presets.plist */
+       if ([fileManager fileExistsAtPath:UserPresetsFile] == 0) 
+       {
+               [fileManager createFileAtPath:UserPresetsFile contents:nil attributes:nil];
+       }
+               
+       UserPresets = [[NSMutableArray alloc] initWithContentsOfFile:UserPresetsFile];
+       if (nil == UserPresets) 
+       {
+               UserPresets = [[NSMutableArray alloc] init];
+               [self addFactoryPresets:NULL];
+       }
+       
+}
+
+
+- (IBAction) showAddPresetPanel: (id) sender
+{
+    /* Deselect the currently selected Preset if there is one*/
+    [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]; 
+       
+    /* 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];
+}
+
+- (IBAction) closeAddPresetPanel: (id) sender
+{
+    [NSApp endSheet: fAddPresetPanel];
+    [fAddPresetPanel orderOut: self];
+}
+
+- (IBAction)addUserPreset:(id)sender
+{
+    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
+{
+
+       
+       /* We Sort the Presets By Factory or Custom */
+       NSSortDescriptor * presetTypeDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"Type" 
+                                                    ascending:YES] autorelease];
+       /* We Sort the Presets Alphabetically by name */
+       NSSortDescriptor * presetNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"PresetName" 
+                                                    ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease];
+       NSArray *sortDescriptors=[NSArray arrayWithObjects:presetTypeDescriptor,presetNameDescriptor,nil];
+       NSArray *sortedArray=[UserPresets sortedArrayUsingDescriptors:sortDescriptors];
+       [UserPresets setArray:sortedArray];
+       
+       
+       /* We Reload the New Table data for presets */
+    [tableView reloadData];
+   /* We save all of the preset data here */
+    [self savePreset];
+}
+
+- (IBAction)insertPreset:(id)sender
+{
+    int index = [tableView selectedRow];
+    [UserPresets insertObject:[self createPreset] atIndex:index];
+    [tableView reloadData];
+    [self savePreset];
+}
+
+- (NSDictionary *)createPreset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:[fPresetNewName stringValue] forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:[fPresetNewPicSettingsPopUp indexOfSelectedItem]] forKey:@"UsesPictureSettings"];
+       /* Get New Preset Description from the field in the AddPresetPanel*/
+       [preset setObject:[fPresetNewDesc stringValue] forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:[fDstFormatPopUp titleOfSelectedItem] forKey:@"FileFormat"];
+       /* Chapter Markers fCreateChapterMarkers*/
+       [preset setObject:[NSNumber numberWithInt:[fCreateChapterMarkers state]] forKey:@"ChapterMarkers"];
+       /* Allow Mpeg4 64 bit formatting +4GB file sizes */
+       [preset setObject:[NSNumber numberWithInt:[fDstMpgLargeFileCheck state]] forKey:@"Mp4LargeFile"];
+       /* Codecs */
+       [preset setObject:[fDstCodecsPopUp titleOfSelectedItem] forKey:@"FileCodecs"];
+       /* 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"];
+    }
+    else // we can record the actual titleOfSelectedItem
+    {
+    [preset setObject:[fVidRatePopUp titleOfSelectedItem] forKey:@"VideoFramerate"];
+    }
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:[fVidGrayscaleCheck state]] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"];
+       /* Turbo 2 pass Encoding fVidTurboPassCheck*/
+       [preset setObject:[NSNumber numberWithInt:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"];
+       /*Picture Settings*/
+       hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [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:[fPictureController deinterlace]] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:fTitle->job->pixel_ratio] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:[fPictureController detelecine]] forKey:@"PictureDetelecine"];
+       [preset setObject:[NSNumber numberWithInt:[fPictureController denoise]] forKey:@"PictureDenoise"];
+    [preset setObject:[NSNumber numberWithInt:[fPictureController deblock]] forKey:@"PictureDeblock"];
+    
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [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"];
+       [preset setObject:[NSNumber numberWithInt:job->crop[2]] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:job->crop[3]] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:[fAudRatePopUp titleOfSelectedItem] forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:[fAudBitratePopUp titleOfSelectedItem] forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:[fSubPopUp titleOfSelectedItem] forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
+
+}
+
+- (void)savePreset
+{
+    [UserPresets writeToFile:UserPresetsFile atomically:YES];
+       /* We get the default preset in case it changed */
+       [self getDefaultPresets: NULL];
+
+}
+
+- (IBAction)deletePreset:(id)sender
+{
+    int status;
+    NSEnumerator *enumerator;
+    NSNumber *index;
+    NSMutableArray *tempArray;
+    id tempObject;
+    
+    if ( [tableView numberOfSelectedRows] == 0 )
+        return;
+    /* Alert user before deleting preset */
+       /* Comment out for now, tie to user pref eventually */
+
+    //NSBeep();
+    status = NSRunAlertPanel(@"Warning!", @"Are you sure that you want to delete the selected preset?", @"OK", @"Cancel", nil);
+    
+    if ( status == NSAlertDefaultReturn ) {
+        enumerator = [tableView selectedRowEnumerator];
+        tempArray = [NSMutableArray array];
+        
+        while ( (index = [enumerator nextObject]) ) {
+            tempObject = [UserPresets objectAtIndex:[index intValue]];
+            [tempArray addObject:tempObject];
+        }
+        
+        [UserPresets removeObjectsInArray:tempArray];
+        [tableView reloadData];
+        [self savePreset];   
+    }
+}
+
+#pragma mark -
+#pragma mark Manage Default Preset
+
+- (IBAction)getDefaultPresets:(id)sender
+{
+       int i = 0;
+    NSEnumerator *enumerator = [UserPresets objectEnumerator];
+       id tempObject;
+       while (tempObject = [enumerator nextObject])
+       {
+               NSDictionary *thisPresetDict = tempObject;
+               if ([[thisPresetDict objectForKey:@"Default"] intValue] == 1) // 1 is HB default
+               {
+                       presetHbDefault = i;    
+               }
+               if ([[thisPresetDict objectForKey:@"Default"] intValue] == 2) // 2 is User specified default
+               {
+                       presetUserDefault = i;  
+               }
+               i++;
+       }
+}
+
+- (IBAction)setDefaultPreset:(id)sender
+{
+    int i = 0;
+    NSEnumerator *enumerator = [UserPresets objectEnumerator];
+       id tempObject;
+       /* First make sure the old user specified default preset is removed */
+       while (tempObject = [enumerator nextObject])
+       {
+               /* make sure we are not removing the default HB preset */
+               if ([[[UserPresets objectAtIndex:i] objectForKey:@"Default"] intValue] != 1) // 1 is HB default
+               {
+                       [[UserPresets objectAtIndex:i] setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+               }
+               i++;
+       }
+       /* Second, go ahead and set the appropriate user specfied preset */
+       /* we get the chosen preset from the UserPresets array */
+       if ([[[UserPresets objectAtIndex:[tableView selectedRow]] objectForKey:@"Default"] intValue] != 1) // 1 is HB default
+       {
+               [[UserPresets objectAtIndex:[tableView selectedRow]] setObject:[NSNumber numberWithInt:2] forKey:@"Default"];
+       }
+       presetUserDefault = [tableView selectedRow];
+       
+       /* We save all of the preset data here */
+    [self savePreset];
+       /* We Reload the New Table data for presets */
+    [tableView reloadData];
+}
+
+- (IBAction)selectDefaultPreset:(id)sender
+{
+       /* if there is a user specified default, we use it */
+       if (presetUserDefault)
+       {
+       [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:presetUserDefault] byExtendingSelection:NO];
+       [self tableViewSelected:NULL];
+       }
+       else if (presetHbDefault) //else we use the built in default presetHbDefault
+       {
+       [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:presetHbDefault] byExtendingSelection:NO];
+       [self tableViewSelected:NULL];
+       }
+}
+
+
+#pragma mark -
+#pragma mark Manage Built In Presets
+
+
+- (IBAction)deleteFactoryPresets:(id)sender
+{
+    //int status;
+    NSEnumerator *enumerator = [UserPresets objectEnumerator];
+       id tempObject;
+    
+       //NSNumber *index;
+    NSMutableArray *tempArray;
+
+
+        tempArray = [NSMutableArray array];
+        /* we look here to see if the preset is we move on to the next one */
+        while ( tempObject = [enumerator nextObject] )  
+               {
+                       /* if the preset is "Factory" then we put it in the array of
+                       presets to delete */
+                       if ([[tempObject objectForKey:@"Type"] intValue] == 0)
+                       {
+                               [tempArray addObject:tempObject];
+                       }
+        }
+        
+        [UserPresets removeObjectsInArray:tempArray];
+        [tableView reloadData];
+        [self savePreset];   
+
+}
+
+   /* We use this method to recreate new, updated factory
+   presets */
+- (IBAction)addFactoryPresets:(id)sender
+{
+    /* First, we delete any existing built in presets */
+    [self deleteFactoryPresets: sender];
+    /* Then, we re-create new built in presets programmatically CreateIpodOnlyPreset*/
+    [UserPresets addObject:[self createNormalPreset]];
+    [UserPresets addObject:[self createClassicPreset]];
+    [UserPresets addObject:[self createQuickTimePreset]];
+       [UserPresets addObject:[self createIpodLowPreset]];
+       [UserPresets addObject:[self createIpodHighPreset]];
+       [UserPresets addObject:[self createAppleTVPreset]];
+    [UserPresets addObject:[self createiPhonePreset]];
+       [UserPresets addObject:[self createPSThreePreset]];
+       [UserPresets addObject:[self createPSPPreset]];
+       [UserPresets addObject:[self createFilmPreset]];
+    [UserPresets addObject:[self createTelevisionPreset]];
+    [UserPresets addObject:[self createAnimationPreset]];
+    [UserPresets addObject:[self createBedlamPreset]];
+    [UserPresets addObject:[self createDeuxSixQuatrePreset]];
+    [UserPresets addObject:[self createBrokePreset]];
+    [UserPresets addObject:[self createBlindPreset]];
+    [UserPresets addObject:[self createCRFPreset]];
+    
+    [self addPreset];
+}
+
+#pragma mark -
+#pragma mark Built In Preset Definitions
+/* These NSDictionary Buit In Preset definitions contain all of the settings for one built in preset */
+- (NSDictionary *)createIpodLowPreset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"iPod Low-Rez" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's low resolution settings for the iPod. Optimized for great playback on the iPod screen, with smaller file size." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"700" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:320] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
+
+}
+
+
+- (NSDictionary *)createIpodHighPreset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"iPod High-Rez" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's high resolution settings for the iPod. Good video quality, great for viewing on a TV using your iPod" forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"1500" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:640] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
+
+}
+
+- (NSDictionary *)createAppleTVPreset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"AppleTV" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's settings for the AppleTV. Provides a good balance between quality and file size, and optimizes performance." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+       /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String (We can use this to tweak the appleTV output)*/
+       [preset setObject:@"bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:trellis=2:cabac=0" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
+       /*Picture Settings*/
+       /* For AppleTV we only want to retain UsesMaxPictureSettings
+       which depend on the source dvd picture settings, so we don't
+       record the current dvd's picture info since it will vary from
+       source to source*/
+       //hb_job_t * job = fTitle->job;
+       //hb_job_t * job = title->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
+
+}
+
+- (NSDictionary *)createPSThreePreset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"PS3" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's settings for the Sony PlayStation 3." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:0] forKey:@"ChapterMarkers"];
+       /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String (We can use this to tweak the appleTV output)*/
+       [preset setObject:@"level=41:subme=5:me=umh" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
+       /*Picture Settings*/
+       /* For PS3 we only want to retain UsesMaxPictureSettings
+       which depend on the source dvd picture settings, so we don't
+       record the current dvd's picture info since it will vary from
+       source to source*/
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
+
+}
+- (NSDictionary *)createPSPPreset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Bedlam" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+    [preset setObject:@"PSP" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings maxed out for slowest encoding and highest quality. Use at your own risk. So slow it's not just insane...it's a trip to the looney bin." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's settings for the Sony PlayStation Portable." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MKV file" forKey:@"FileFormat"];
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
+       /* Codecs */
+       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"ref=16:mixed-refs:bframes=6:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:me-range=64:analyse=all:8x8dct:trellis=2:no-fast-pskip:no-dct-decimate:filter=-2,-1" forKey:@"x264Option"];
+       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
+       /* x264 Option String (We can use this to tweak the appleTV output)*/
+       [preset setObject:@"" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1800" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1024" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -3791,22 +4019,23 @@ the user is using "Custom" settings by determining the sender*/
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
        
        /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
+       /* For PS3 we only want to retain UsesMaxPictureSettings
+       which depend on the source dvd picture settings, so we don't
+       record the current dvd's picture info since it will vary from
+       source to source*/
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:@"368" forKey:@"PictureWidth"];
+       [preset setObject:@"208" forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
@@ -3816,7 +4045,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Audio Sample Rate*/
        [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       [preset setObject:@"128" forKey:@"AudioBitRate"];
        /* Subtitles*/
        [preset setObject:@"None" forKey:@"Subtitles"];
        
@@ -3826,19 +4055,19 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)createiPhonePreset
+- (NSDictionary *)createNormalPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"iPhone" forKey:@"PresetName"];
+    [preset setObject:@"Normal" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"Default"];
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for the iPhone." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's normal, default settings." forKey:@"PresetDescription"];
        /* File Format */
     [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
@@ -3846,13 +4075,13 @@ the user is using "Custom" settings by determining the sender*/
     /* Codecs */
        [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"cabac=0:ref=1:analyse=all:me=umh:subme=6:no-fast-pskip=1:trellis=1" forKey:@"x264Option"];
+       [preset setObject:@"ref=2:bframes=2:subme=5:me=umh" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"960" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1500" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -3860,21 +4089,22 @@ the user is using "Custom" settings by determining the sender*/
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
        /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:480] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
@@ -3884,7 +4114,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Audio Sample Rate*/
        [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:@"128" forKey:@"AudioBitRate"];
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
        /* Subtitles*/
        [preset setObject:@"None" forKey:@"Subtitles"];
        
@@ -3894,11 +4124,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)createDeuxSixQuatrePreset
+- (NSDictionary *)createClassicPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Deux Six Quatre" forKey:@"PresetName"];
+    [preset setObject:@"Classic" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -3906,21 +4136,21 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's preset for true high profile x264 quality. A good balance of quality and speed, based on community standards found in the wild. This preset will give you a much better sense of x264's capabilities than vanilla main profile." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's traditional, faster, lower-quality settings." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MKV file" forKey:@"FileFormat"];
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+        [preset setObject:[NSNumber numberWithInt:0] forKey:@"ChapterMarkers"];
     /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
+       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"ref=5:mixed-refs:bframes=3:bime:weightb:b-rdo:b-pyramid:me=umh:subme=7:trellis=1:analyse=all:8x8dct:no-fast-pskip" forKey:@"x264Option"];
+       [preset setObject:@"" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1600" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1000" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -3928,8 +4158,7 @@ the user is using "Custom" settings by determining the sender*/
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
@@ -3939,9 +4168,9 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
@@ -3963,11 +4192,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)createBrokePreset
+- (NSDictionary *)createFilmPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Broke" forKey:@"PresetName"];
+    [preset setObject:@"Film" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -3975,21 +4204,21 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's preset for people without a lot of money to waste on hard drives. Tries to maximize quality for burning to CDs, so you can party like it's 1999." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's preset for feature films." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+    [preset setObject:@"MKV file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
     /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
        /* Video encoder */
        [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"ref=3:mixed-refs:bframes=6:bime:weightb:b-rdo:b-pyramid:direct=auto:me=umh:subme=6:trellis=1:analyse=all:8x8dct:no-fast-pskip" forKey:@"x264Option"];
+       [preset setObject:@"ref=3:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:no-fast-pskip" forKey:@"x264Option"];
        /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoQualityType"];
-       [preset setObject:@"695" forKey:@"VideoTargetSize"];
-       [preset setObject:@"1600" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"1800" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -4004,13 +4233,13 @@ the user is using "Custom" settings by determining the sender*/
        //hb_job_t * job = fTitle->job;
        /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:640] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
@@ -4022,7 +4251,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Audio Sample Rate*/
        [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:@"128" forKey:@"AudioBitRate"];
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
        /* Subtitles*/
        [preset setObject:@"None" forKey:@"Subtitles"];
        
@@ -4032,11 +4261,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)createBlindPreset
+- (NSDictionary *)createTelevisionPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Blind" forKey:@"PresetName"];
+    [preset setObject:@"Television" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -4044,21 +4273,21 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's preset for impatient people who don't care about picture quality." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's settings for video from television." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+    [preset setObject:@"MKV file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
     /* Codecs */
-       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"" forKey:@"x264Option"];
+       [preset setObject:@"ref=3:mixed-refs:bframes=16:bime:weightb:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"512" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1300" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -4066,19 +4295,19 @@ the user is using "Custom" settings by determining the sender*/
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTurboTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
        /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:512] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureDeinterlace"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
@@ -4091,7 +4320,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Audio Sample Rate*/
        [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:@"128" forKey:@"AudioBitRate"];
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
        /* Subtitles*/
        [preset setObject:@"None" forKey:@"Subtitles"];
        
@@ -4101,11 +4330,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)createCRFPreset
+- (NSDictionary *)createAnimationPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"Constant Quality Rate" forKey:@"PresetName"];
+    [preset setObject:@"Animation" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -4113,30 +4342,30 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's preset for consistently excellent quality in one pass, with the downside of entirely unpredictable file sizes and bitrates." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's settings for cartoons, anime, and CGI." forKey:@"PresetDescription"];
        /* File Format */
     [preset setObject:@"MKV file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
     /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
        [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"ref=3:mixed-refs:bframes=3:b-pyramid:b-rdo:bime:weightb:filter=-2,-1:subme=6:trellis=1:analyse=all:8x8dct:me=umh" forKey:@"x264Option"];
+       [preset setObject:@"ref=5:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=5:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip:filter=2,2" forKey:@"x264Option"];
        /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:0.6471] forKey:@"VideoQualitySlider"];
+       [preset setObject:@"1000" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
        [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTurboTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
@@ -4147,7 +4376,7 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureDeinterlace"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
@@ -4170,439 +4399,490 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-
-- (IBAction)deletePreset:(id)sender
-{
-    int status;
-    NSEnumerator *enumerator;
-    NSNumber *index;
-    NSMutableArray *tempArray;
-    id tempObject;
-    
-    if ( [tableView numberOfSelectedRows] == 0 )
-        return;
-    /* Alert user before deleting preset */
-       /* Comment out for now, tie to user pref eventually */
-
-    //NSBeep();
-    status = NSRunAlertPanel(@"Warning!", @"Are you sure that you want to delete the selected preset?", @"OK", @"Cancel", nil);
-    
-    if ( status == NSAlertDefaultReturn ) {
-        enumerator = [tableView selectedRowEnumerator];
-        tempArray = [NSMutableArray array];
-        
-        while ( (index = [enumerator nextObject]) ) {
-            tempObject = [UserPresets objectAtIndex:[index intValue]];
-            [tempArray addObject:tempObject];
-        }
-        
-        [UserPresets removeObjectsInArray:tempArray];
-        [tableView reloadData];
-        [self savePreset];   
-    }
-}
-
-- (IBAction)getDefaultPresets:(id)sender
-{
-       int i = 0;
-    NSEnumerator *enumerator = [UserPresets objectEnumerator];
-       id tempObject;
-       while (tempObject = [enumerator nextObject])
-       {
-               NSDictionary *thisPresetDict = tempObject;
-               if ([[thisPresetDict objectForKey:@"Default"] intValue] == 1) // 1 is HB default
-               {
-                       presetHbDefault = i;    
-               }
-               if ([[thisPresetDict objectForKey:@"Default"] intValue] == 2) // 2 is User specified default
-               {
-                       presetUserDefault = i;  
-               }
-               i++;
-       }
-}
-
-- (IBAction)setDefaultPreset:(id)sender
+- (NSDictionary *)createQuickTimePreset
 {
-    int i = 0;
-    NSEnumerator *enumerator = [UserPresets objectEnumerator];
-       id tempObject;
-       /* First make sure the old user specified default preset is removed */
-       while (tempObject = [enumerator nextObject])
-       {
-               /* make sure we are not removing the default HB preset */
-               if ([[[UserPresets objectAtIndex:i] objectForKey:@"Default"] intValue] != 1) // 1 is HB default
-               {
-                       [[UserPresets objectAtIndex:i] setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
-               }
-               i++;
-       }
-       /* Second, go ahead and set the appropriate user specfied preset */
-       /* we get the chosen preset from the UserPresets array */
-       if ([[[UserPresets objectAtIndex:[tableView selectedRow]] objectForKey:@"Default"] intValue] != 1) // 1 is HB default
-       {
-               [[UserPresets objectAtIndex:[tableView selectedRow]] setObject:[NSNumber numberWithInt:2] forKey:@"Default"];
-       }
-       presetUserDefault = [tableView selectedRow];
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"QuickTime" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's high quality settings for use with QuickTime. It can be slow, so use it when the Normal preset doesn't look good enough." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:me=umh:subme=5:analyse=all:trellis=1:no-fast-pskip" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
        
-       /* We save all of the preset data here */
-    [self savePreset];
-       /* We Reload the New Table data for presets */
-    [tableView reloadData];
-}
 
-- (IBAction)selectDefaultPreset:(id)sender
-{
-       /* if there is a user specified default, we use it */
-       if (presetUserDefault)
-       {
-       [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:presetUserDefault] byExtendingSelection:NO];
-       [self tableViewSelected:NULL];
-       }
-       else if (presetHbDefault) //else we use the built in default presetHbDefault
-       {
-       [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:presetHbDefault] byExtendingSelection:NO];
-       [self tableViewSelected:NULL];
-       }
+    [preset autorelease];
+    return preset;
+
 }
 
-- (IBAction)tableViewSelected:(id)sender
+- (NSDictionary *)createBedlamPreset
 {
-    /* Since we cannot disable the presets tableView in terms of clickability
-          we will use the enabled state of the add presets button to determine whether
-          or not clicking on a preset will do anything */
-       if ([fPresetsAdd isEnabled])
-       {
-               if ([tableView selectedRow] >= 0)
-               {       
-                       /* we get the chosen preset from the UserPresets array */
-                       chosenPreset = [UserPresets objectAtIndex:[tableView selectedRow]];
-                       curUserPresetChosenNum = [sender selectedRow];
-                       /* we set the preset display field in main window here */
-                       [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PresetName"]]];
-                       if ([[chosenPreset objectForKey:@"Default"] intValue] == 1)
-                       {
-                               [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@ (Default)",[chosenPreset valueForKey:@"PresetName"]]];
-                       }
-                       else
-                       {
-                               [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PresetName"]]];
-                       }
-                       /* File Format */
-                       [fDstFormatPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"FileFormat"]]];
-                       [self formatPopUpChanged: NULL];
-                       
-                       /* Chapter Markers*/
-                       [fCreateChapterMarkers setState:[[chosenPreset objectForKey:@"ChapterMarkers"] intValue]];
-                       /* Allow Mpeg4 64 bit formatting +4GB file sizes */
-                       [fDstMpgLargeFileCheck setState:[[chosenPreset objectForKey:@"Mp4LargeFile"] intValue]];
-                       /* Codecs */
-                       [fDstCodecsPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]]];
-                       [self codecsPopUpChanged: NULL];
-                       /* Video encoder */
-                       [fVidEncoderPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]]];
-                       
-                       /* 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 */
-                       [fAdvancedOptions setOptions: [NSString stringWithFormat:[chosenPreset valueForKey:@"x264Option"]]];
-                       
-                       /* Lets run through the following functions to get variables set there */
-                       [self encoderPopUpChanged: NULL];
-                       
-                       [self calculateBitrate: NULL];
-                       
-                       /* 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];
-                       
-                       /* Video framerate */
-                       [fVidRatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoFramerate"]]];
-                       
-                       /* GrayScale */
-                       [fVidGrayscaleCheck setState:[[chosenPreset objectForKey:@"VideoGrayScale"] intValue]];
-                       
-                       /* 2 Pass Encoding */
-                       [fVidTwoPassCheck setState:[[chosenPreset objectForKey:@"VideoTwoPass"] intValue]];
-                       [self twoPassCheckboxChanged: NULL];
-                       /* Turbo 1st pass for 2 Pass Encoding */
-                       [fVidTurboPassCheck setState:[[chosenPreset objectForKey:@"VideoTurboTwoPass"] intValue]];
-                       
-                       /*Audio*/
-                       
-                       /* Audio Sample Rate*/
-                       [fAudRatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioSampleRate"]]];
-                       /* Audio Bitrate Rate*/
-                       [fAudBitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioBitRate"]]];
-                       /*Subtitles*/
-                       [fSubPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Subtitles"]]];
-                       
-                       /* Picture Settings */
-                       /* Look to see if we apply these here in objectForKey:@"UsesPictureSettings"] */
-                       if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] > 0)
-                       {
-                               hb_job_t * job = fTitle->job;
-                               /* Check to see if we should use the max picture setting for the current title*/
-                               if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] == 2 || [[chosenPreset objectForKey:@"UsesMaxPictureSettings"]  intValue] == 1)
-                               {
-                                       /* Use Max Picture settings for whatever the dvd is.*/
-                                       [self revertPictureSizeToMax: NULL];
-                                       job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
-                                       if (job->keep_ratio == 1)
-                                       {
-                                               hb_fix_aspect( job, HB_KEEP_WIDTH );
-                                               if( job->height > fTitle->height )
-                                               {
-                                                       job->height = fTitle->height;
-                                                       hb_fix_aspect( job, HB_KEEP_HEIGHT );
-                                               }
-                                       }
-                                       job->pixel_ratio = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
-                               }
-                               else // Apply picture settings that were in effect at the time the preset was saved
-                               {
-                                       job->width = [[chosenPreset objectForKey:@"PictureWidth"]  intValue];
-                                       job->height = [[chosenPreset objectForKey:@"PictureHeight"]  intValue];
-                                       job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
-                                       if (job->keep_ratio == 1)
-                                       {
-                                               hb_fix_aspect( job, HB_KEEP_WIDTH );
-                                               if( job->height > fTitle->height )
-                                               {
-                                                       job->height = fTitle->height;
-                                                       hb_fix_aspect( job, HB_KEEP_HEIGHT );
-                                               }
-                                       }
-                                       job->pixel_ratio = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
-                    [fPictureController setDeinterlace:[[chosenPreset objectForKey:@"PictureDeinterlace"] intValue]];
-                                       
-                                       if ([chosenPreset objectForKey:@"PictureDetelecine"])
-                                       {
-                        [fPictureController setDetelecine:[[chosenPreset objectForKey:@"PictureDetelecine"] intValue]];
-                                       }
-                                       if ([chosenPreset objectForKey:@"PictureDenoise"])
-                                       {
-                        [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)
-                                       {
-                        [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];
-                                               job->crop[1] = [[chosenPreset objectForKey:@"PictureBottomCrop"]  intValue];
-                                               job->crop[2] = [[chosenPreset objectForKey:@"PictureLeftCrop"]  intValue];
-                                               job->crop[3] = [[chosenPreset objectForKey:@"PictureRightCrop"]  intValue];
-                                               
-                                       }
-                                       else /* if auto crop has been saved in preset, set to auto and use post scan auto crop */
-                                       {
-                        [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;
-                                               job->crop[3] = AutoCropRight;
-                                               
-                                       }
-                               }
-                               [self calculatePictureSizing: NULL]; 
-                       }
-                       
-                       
-                       [[fPresetsActionMenu itemAtIndex:0] setEnabled: YES];
-                       }
-}
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"Bedlam" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's settings maxed out for slowest encoding and highest quality. Use at your own risk. So slow it's not just insane...it's a trip to the looney bin." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MKV file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"ref=16:mixed-refs:bframes=16:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:me-range=64:analyse=all:8x8dct:trellis=2:no-fast-pskip:no-dct-decimate:filter=-2,-1" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"1800" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
+
 }
 
+- (NSDictionary *)createiPhonePreset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"iPhone / iPod Touch" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's settings for the iPhone." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"cabac=0:ref=1:analyse=all:me=umh:subme=6:no-fast-pskip=1:trellis=1" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"960" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:480] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"128" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
 
+}
 
-- (int)numberOfRowsInTableView:(NSTableView *)aTableView
+- (NSDictionary *)createDeuxSixQuatrePreset
 {
-    return [UserPresets count];
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"Deux Six Quatre" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's preset for true high profile x264 quality. A good balance of quality and speed, based on community standards found in the wild. This preset will give you a much better sense of x264's capabilities than vanilla main profile." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MKV file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"ref=5:mixed-refs:bframes=3:bime:weightb:b-rdo:b-pyramid:me=umh:subme=7:trellis=1:analyse=all:8x8dct:no-fast-pskip" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"1600" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
+
 }
 
-/* we use this to determine display characteristics for
-each table cell based on content currently only used to
-show the built in presets in a blue font. */
-- (void)tableView:(NSTableView *)aTableView
- willDisplayCell:(id)aCell 
- forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
+- (NSDictionary *)createBrokePreset
 {
-    NSDictionary *userPresetDict = [UserPresets objectAtIndex:rowIndex];
-       NSFont *txtFont;
-       NSColor *fontColor;
-       NSColor *shadowColor;
-       txtFont = [NSFont systemFontOfSize: [NSFont smallSystemFontSize]];
-       /* First, we check to see if its a selected row, if so, we use white since its highlighted in blue */
-       if ([[aTableView selectedRowIndexes] containsIndex:rowIndex] && ([tableView editedRow] != rowIndex))
-       {
-               
-               fontColor = [NSColor whiteColor];
-               shadowColor = [NSColor colorWithDeviceRed:(127.0/255.0) green:(140.0/255.0) blue:(160.0/255.0) alpha:1.0];
-       }
-       else
-       {
-               /* We set the properties of unselected rows */
-               /* if built-in preset (defined by "type" == 0) we use a blue font */
-               if ([[userPresetDict objectForKey:@"Type"] intValue] == 0)
-               {
-                       fontColor = [NSColor blueColor];
-               }
-               else // User created preset, use a black font
-               {
-                       fontColor = [NSColor blackColor];
-               }
-               shadowColor = nil;
-       }
-       /* We check to see if this is the HB default, if so, color it appropriately */
-       if (!presetUserDefault && presetHbDefault && rowIndex == presetHbDefault)
-       {
-       txtFont = [NSFont boldSystemFontOfSize: [NSFont smallSystemFontSize]];
-       }
-       /* We check to see if this is the User Specified default, if so, color it appropriately */
-       if (presetUserDefault && rowIndex == presetUserDefault)
-       {
-       txtFont = [NSFont boldSystemFontOfSize: [NSFont smallSystemFontSize]];
-       }
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"Broke" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's preset for people without a lot of money to waste on hard drives. Tries to maximize quality for burning to CDs, so you can party like it's 1999." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"ref=3:mixed-refs:bframes=16:bime:weightb:b-rdo:b-pyramid:direct=auto:me=umh:subme=6:trellis=1:analyse=all:8x8dct:no-fast-pskip" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoQualityType"];
+       [preset setObject:@"695" forKey:@"VideoTargetSize"];
+       [preset setObject:@"1600" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:640] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
        
-       [aCell setTextColor:fontColor];
-       [aCell setFont:txtFont];
-       /* this shadow stuff (like mail app) for some reason looks crappy, commented out
-       temporarily in case we want to resurrect it */
-       /*
-       NSShadow *shadow = [[NSShadow alloc] init];
-       NSSize shadowOffset = { width: 1.0, height: -1.5};
-       [shadow setShadowOffset:shadowOffset];
-       [shadow setShadowColor:shadowColor];
-       [shadow set];
-       */
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"128" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
        
-}
-/* Method to display tooltip with the description for each preset, if available */
-- (NSString *)tableView:(NSTableView *)aTableView toolTipForCell:(NSCell *)aCell 
-                   rect:(NSRectPointer)aRect tableColumn:(NSTableColumn *)aTableColumn
-                    row:(int)rowIndex mouseLocation:(NSPoint)aPos
-{
-     /* initialize the tooltip contents variable */
-        NSString *loc_tip;
-     /* 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);
-        }
-        else
-        {
-        loc_tip = @"No description available";
-        }
-        return (loc_tip);
-
-}
 
-- (id)tableView:(NSTableView *)aTableView
-      objectValueForTableColumn:(NSTableColumn *)aTableColumn
-      row:(int)rowIndex
-{
-id theRecord, theValue;
-    
-    theRecord = [UserPresets objectAtIndex:rowIndex];
-    theValue = [theRecord objectForKey:[aTableColumn identifier]];
-    return theValue;
-}
+    [preset autorelease];
+    return preset;
 
-// NSTableDataSource method that we implement to edit values directly in the table...
-- (void)tableView:(NSTableView *)aTableView
-        setObjectValue:(id)anObject
-        forTableColumn:(NSTableColumn *)aTableColumn
-        row:(int)rowIndex
-{
-    id theRecord;
-    
-    theRecord = [UserPresets objectAtIndex:rowIndex];
-    [theRecord setObject:anObject forKey:@"PresetName"];
-    /* We Sort the Presets By Factory or Custom */
-       NSSortDescriptor * presetTypeDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"Type" 
-                                                    ascending:YES] autorelease];
-               /* We Sort the Presets Alphabetically by name */
-       NSSortDescriptor * presetNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"PresetName" 
-                                                    ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease];
-       NSArray *sortDescriptors=[NSArray arrayWithObjects:presetTypeDescriptor,presetNameDescriptor,nil];
-    NSArray *sortedArray=[UserPresets sortedArrayUsingDescriptors:sortDescriptors];
-       [UserPresets setArray:sortedArray];
-       /* We Reload the New Table data for presets */
-    [tableView reloadData];
-   /* We save all of the preset data here */
-    [self savePreset];
 }
 
-- (void)savePreset
+- (NSDictionary *)createBlindPreset
 {
-    [UserPresets writeToFile:UserPresetsFile atomically:YES];
-       /* We get the default preset in case it changed */
-       [self getDefaultPresets: NULL];
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"Blind" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's preset for impatient people who don't care about picture quality." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"512" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTurboTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:512] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"128" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
 
-}
+    [preset autorelease];
+    return preset;
 
-- (void) controlTextDidChange: (NSNotification *) notification
-{
-    [self calculateBitrate: NULL];
 }
 
-- (IBAction) openHomepage: (id) sender
+- (NSDictionary *)createCRFPreset
 {
-    [[NSWorkspace sharedWorkspace] openURL: [NSURL
-        URLWithString:@"http://handbrake.m0k.org/"]];
-}
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"Constant Quality Rate" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's preset for consistently excellent quality in one pass, with the downside of entirely unpredictable file sizes and bitrates." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MKV file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"ref=3:mixed-refs:bframes=3:b-pyramid:b-rdo:bime:weightb:filter=-2,-1:subme=6:trellis=1:analyse=all:8x8dct:me=umh" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:0.6471] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTurboTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
 
-- (IBAction) openForums: (id) sender
-{
-    [[NSWorkspace sharedWorkspace] openURL: [NSURL
-        URLWithString:@"http://handbrake.m0k.org/forum/"]];
-}
-- (IBAction) openUserGuide: (id) sender
-{
-    [[NSWorkspace sharedWorkspace] openURL: [NSURL
-        URLWithString:@"http://handbrake.m0k.org/trac/wiki/HandBrakeGuide"]];
-}
+    [preset autorelease];
+    return preset;
 
-/**
- * Shows debug output window.
- */
-- (IBAction)showDebugOutputPanel:(id)sender
-{
-    [outputPanel showOutputPanel:sender];
 }
 
-/**
- * Shows preferences window modally.
- */
-- (IBAction) showPreferencesWindow: (id) sender
-{
-    NSWindow * window = [fPreferencesController window];
-    if (![window isVisible])
-        [window center];
-
-    [window makeKeyAndOrderFront: nil];
-}
 
-/**
- * Shows queue window.
- */
-- (IBAction) showQueueWindow:(id)sender
-{
-    [fQueueController showQueueWindow:sender];
-}
 
 
-- (IBAction) toggleDrawer:(id)sender {
-    [fPresetDrawer toggle:self];
-}
 
 @end