X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=macosx%2FController.mm;h=79c9d6c94977fe861a97f6f0d848d0baf31f5568;hb=ba2fb816048acfd20d9da4dd0eeb5a59bdd0b3cc;hp=4d18e97861513baa941e743b9f7239be90ef63a5;hpb=d9cfe8126a9a98023a9318eeee90dbcfebc54157;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/macosx/Controller.mm b/macosx/Controller.mm index 4d18e978..79c9d6c9 100644 --- a/macosx/Controller.mm +++ b/macosx/Controller.mm @@ -61,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]; @@ -69,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 */ @@ -87,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 @@ -307,261 +345,663 @@ 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]; +- (void) TranslateStrings +{ + [fSrcTitleField setStringValue: _( @"Title:" )]; + [fSrcChapterField setStringValue: _( @"Chapters:" )]; + [fSrcChapterToField setStringValue: _( @"to" )]; + [fSrcDuration1Field setStringValue: _( @"Duration:" )]; + + [fDstFormatField setStringValue: _( @"Format:" )]; + [fDstCodecsField setStringValue: _( @"Codecs:" )]; + [fDstFile1Field setStringValue: _( @"File:" )]; + [fDstBrowseButton setTitle: _( @"Browse" )]; + + [fVidRateField setStringValue: _( @"Framerate (fps):" )]; + [fVidEncoderField setStringValue: _( @"Encoder:" )]; + [fVidQualityField setStringValue: _( @"Quality:" )]; +} + + +- (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,fPicSettingDeblock,fPicLabelDeblock,}; + + for( unsigned i = 0; + i < sizeof( controls ) / sizeof( NSControl * ); i++ ) + { + 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]; + + } - UserPresets = [[NSMutableArray alloc] initWithContentsOfFile:UserPresetsFile]; - if (nil == UserPresets) - { - UserPresets = [[NSMutableArray alloc] init]; - [self addFactoryPresets:NULL]; - } + 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 { -// ============================================================ -// NSToolbar Related Methods -// ============================================================ + [tableView setEnabled: NO]; + + } -- (void) setupToolbar { - toolbar = [[[NSToolbar alloc] initWithIdentifier: @"HandBrake Toolbar"] autorelease]; - - [toolbar setAllowsUserCustomization: YES]; - [toolbar setAutosavesConfiguration: YES]; - [toolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel]; - - [toolbar setDelegate: self]; - - [fWindow setToolbar: toolbar]; + [self videoMatrixChanged: NULL]; + [fAdvancedOptions enableUI:b]; } -- (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier: - (NSString *) itemIdent willBeInsertedIntoToolbar:(BOOL) willBeInserted { - NSToolbarItem * item = [[NSToolbarItem alloc] initWithItemIdentifier: itemIdent]; - - if ([itemIdent isEqualToString: ToggleDrawerIdentifier]) + +/*********************************************************************** + * UpdateDockIcon + *********************************************************************** + * Shows a progression bar on the dock icon, filled according to + * 'progress' (0.0 <= progress <= 1.0). + * Called with progress < 0.0 or progress > 1.0, restores the original + * icon. + **********************************************************************/ +- (void) UpdateDockIcon: (float) progress +{ + NSImage * icon; + NSData * tiff; + NSBitmapImageRep * bmp; + uint32_t * pen; + uint32_t black = htonl( 0x000000FF ); + uint32_t red = htonl( 0xFF0000FF ); + uint32_t white = htonl( 0xFFFFFFFF ); + int row_start, row_end; + int i, j; + + /* Get application original icon */ + icon = [NSImage imageNamed: @"NSApplicationIcon"]; + + if( progress < 0.0 || progress > 1.0 ) { - [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]; + [NSApp setApplicationIconImage: icon]; + return; } - else if ([itemIdent isEqualToString: StartEncodingIdentifier]) + + /* Get it in a raw bitmap form */ + tiff = [icon TIFFRepresentationUsingCompression: + NSTIFFCompressionNone factor: 1.0]; + bmp = [NSBitmapImageRep imageRepWithData: tiff]; + + /* Draw the progression bar */ + /* It's pretty simple (ugly?) now, but I'm no designer */ + + row_start = 3 * (int) [bmp size].height / 4; + row_end = 7 * (int) [bmp size].height / 8; + + for( i = row_start; i < row_start + 2; i++ ) { - [item setLabel: @"Start"]; - [item setPaletteLabel: @"Start Encoding"]; - [item setToolTip: @"Start Encoding"]; - [item setImage: [NSImage imageNamed: @"Play"]]; - [item setTarget: self]; - [item setAction: @selector(Rip:)]; + pen = (uint32_t *) ( [bmp bitmapData] + i * [bmp bytesPerRow] ); + for( j = 0; j < (int) [bmp size].width; j++ ) + { + pen[j] = black; + } } - else if ([itemIdent isEqualToString: ShowQueueIdentifier]) + for( i = row_start + 2; i < row_end - 2; i++ ) { - [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]; + pen = (uint32_t *) ( [bmp bitmapData] + i * [bmp bytesPerRow] ); + pen[0] = black; + pen[1] = black; + for( j = 2; j < (int) [bmp size].width - 2; j++ ) + { + if( j < 2 + (int) ( ( [bmp size].width - 4.0 ) * progress ) ) + { + pen[j] = red; + } + else + { + pen[j] = white; + } + } + pen[j] = black; + pen[j+1] = black; } - else if ([itemIdent isEqualToString: AddToQueueIdentifier]) + for( i = row_end - 2; i < row_end; i++ ) { - [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(showScanPanel:)]; - } - else - { - [item release]; - return nil; + pen = (uint32_t *) ( [bmp bitmapData] + i * [bmp bytesPerRow] ); + for( j = 0; j < (int) [bmp size].width; j++ ) + { + pen[j] = black; + } } - return item; + /* Now update the dock icon */ + tiff = [bmp TIFFRepresentationUsingCompression: + NSTIFFCompressionNone factor: 1.0]; + icon = [[NSImage alloc] initWithData: tiff]; + [NSApp setApplicationIconImage: icon]; + [icon release]; } -- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar +- (void) updateUI: (NSTimer *) timer { - return [NSArray arrayWithObjects: ChooseSourceIdentifier, NSToolbarSeparatorItemIdentifier, StartEncodingIdentifier, - PauseEncodingIdentifier, AddToQueueIdentifier, ShowQueueIdentifier, NSToolbarFlexibleSpaceItemIdentifier, - NSToolbarSpaceItemIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier, nil]; -} -- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar -{ - return [NSArray arrayWithObjects: StartEncodingIdentifier, PauseEncodingIdentifier, AddToQueueIdentifier, - ChooseSourceIdentifier, ShowQueueIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier, - NSToolbarCustomizeToolbarItemIdentifier, NSToolbarFlexibleSpaceItemIdentifier, - NSToolbarSpaceItemIdentifier, NSToolbarSeparatorItemIdentifier, nil]; -} + hb_list_t * list; + list = hb_get_titles( fHandle ); + /* check to see if there has been a new scan done + this bypasses the constraints of HB_STATE_WORKING + not allowing setting a newly scanned source */ + int checkScanCount = hb_get_scancount( fHandle ); + if (checkScanCount > currentScanCount) + { + + currentScanCount = checkScanCount; + //[fScanController Cancel: NULL]; + [fScanIndicator setIndeterminate: NO]; + [fScanIndicator setDoubleValue: 0.0]; + [fScanIndicator setHidden: YES]; -- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem -{ - NSString * ident = [toolbarItem itemIdentifier]; - - if (fHandle) + [self showNewScan: NULL]; + } + + hb_state_t s; + hb_get_state( fHandle, &s ); + + + switch( s.state ) { - hb_state_t s; - hb_get_state2( fHandle, &s ); - - if (s.state == HB_STATE_WORKING || s.state == HB_STATE_MUXING) + case HB_STATE_IDLE: + break; +#define p s.param.scanning + case HB_STATE_SCANNING: + { + [fSrcDVD2Field setStringValue: [NSString stringWithFormat: + _( @"Scanning title %d of %d..." ), + p.title_cur, p.title_count]]; + [fScanIndicator setIndeterminate: NO]; + [fScanIndicator setDoubleValue: 100.0 * ( p.title_cur - 1 ) / + p.title_count]; + break; + } +#undef p + +#define p s.param.scandone + case HB_STATE_SCANDONE: { - if ([ident isEqualToString: StartEncodingIdentifier]) + + [fScanIndicator setIndeterminate: NO]; + [fScanIndicator setDoubleValue: 0.0]; + [fScanIndicator setHidden: YES]; + [self showNewScan: NULL]; + [toolbar validateVisibleItems]; + break; + } +#undef p + +#define p s.param.working + case HB_STATE_WORKING: + { + float progress_total; + NSMutableString * string; + /* Currently, p.job_cur and p.job_count get screwed up when adding + jobs during encoding, if they cannot be fixed in libhb, will implement a + nasty but working cocoa solution */ + /* Update text field */ + string = [NSMutableString stringWithFormat: _( @"Encoding: task %d of %d, %.2f %%" ), p.job_cur, p.job_count, 100.0 * p.progress]; + + if( p.seconds > -1 ) { - [toolbarItem setImage: [NSImage imageNamed: @"Stop"]]; - [toolbarItem setLabel: @"Stop"]; - [toolbarItem setPaletteLabel: @"Stop"]; - [toolbarItem setToolTip: @"Stop Encoding"]; - return YES; + [string appendFormat: + _( @" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)" ), + p.rate_cur, p.rate_avg, p.hours, p.minutes, p.seconds]; } - if ([ident isEqualToString: PauseEncodingIdentifier]) + [fStatusField setStringValue: string]; + + /* Update slider */ + progress_total = ( p.progress + p.job_cur - 1 ) / p.job_count; + [fRipIndicator setIndeterminate: NO]; + [fRipIndicator setDoubleValue: 100.0 * progress_total]; + + // If progress bar hasn't been revealed at the bottom of the window, do + // that now. This code used to be in doRip. I moved it to here to handle + // the case where hb_start is called by HBQueueController and not from + // HBController. + if (!fRipIndicatorShown) { - [toolbarItem setImage: [NSImage imageNamed: @"Pause"]]; - [toolbarItem setLabel: @"Pause"]; - [toolbarItem setPaletteLabel: @"Pause Encoding"]; - [toolbarItem setToolTip: @"Pause Encoding"]; - return YES; + NSRect frame = [fWindow frame]; + if (frame.size.width <= 591) + frame.size.width = 591; + frame.size.height += 36; + frame.origin.y -= 36; + [fWindow setFrame:frame display:YES animate:YES]; + fRipIndicatorShown = 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]; } - if (SuccessfulScan) - if ([ident isEqualToString: AddToQueueIdentifier]) - return YES; + + /* Update dock icon */ + [self UpdateDockIcon: progress_total]; + + // Has current job changed? That means the queue has probably changed as + // well so update it + [fQueueController hblibStateChanged: s]; + + break; } - else if (s.state == HB_STATE_PAUSED) +#undef p + +#define p s.param.muxing + case HB_STATE_MUXING: { - 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; + NSMutableString * string; + + /* Update text field */ + string = [NSMutableString stringWithFormat: + _( @"Muxing..." )]; + [fStatusField setStringValue: string]; + + /* Update slider */ + [fRipIndicator setIndeterminate: YES]; + [fRipIndicator startAnimation: nil]; + + /* Update dock icon */ + [self UpdateDockIcon: 1.0]; + + // Pass along the info to HBQueueController + [fQueueController hblibStateChanged: s]; + + break; } - else if (s.state == HB_STATE_SCANNING) - return NO; - else if (s.state == HB_STATE_WORKDONE || s.state == HB_STATE_SCANDONE || SuccessfulScan) +#undef p + + case HB_STATE_PAUSED: + [fStatusField setStringValue: _( @"Paused" )]; + + // Pass along the info to HBQueueController + [fQueueController hblibStateChanged: s]; + + break; + + case HB_STATE_WORKDONE: { - if ([ident isEqualToString: StartEncodingIdentifier]) + // HB_STATE_WORKDONE happpens as a result of hblib finishing all its jobs + // or someone calling hb_stop. In the latter case, hb_stop does not clear + // out the remaining passes/jobs in the queue. We'll do that here. + + // Delete all remaining scans of this job, ie, delete whole encodes. + hb_job_t * job; + while( ( job = hb_job( fHandle, 0 ) ) && (job->sequence_id != 0) ) + hb_rem( fHandle, job ); + + // Start processing back up if jobs still left in queue + if (hb_count(fHandle) > 0) { - [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; + hb_start(fHandle); + fEncodeState = 1; + // Validate the toolbar (hack). The toolbar will usually get autovalidated + // before we had the chance to restart the queue, hence it will now be in + // the wrong state. + [toolbar validateVisibleItems]; + break; } - if ([ident isEqualToString: AddToQueueIdentifier]) - 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; + [fStatusField setStringValue: _( @"Done." )]; + [fRipIndicator setIndeterminate: NO]; + [fRipIndicator setDoubleValue: 0.0]; + [toolbar validateVisibleItems]; + + /* Restore dock icon */ + [self UpdateDockIcon: -1.0]; + + if (fRipIndicatorShown) + { + NSRect frame = [fWindow frame]; + if (frame.size.width <= 591) + frame.size.width = 591; + frame.size.height += -36; + frame.origin.y -= -36; + [fWindow setFrame:frame display:YES animate:YES]; + fRipIndicatorShown = NO; + } + + // Pass along the info to HBQueueController + [fQueueController hblibStateChanged: s]; + + /* Check to see if the encode state has not been cancelled + to determine if we should check for encode done notifications */ + if (fEncodeState != 2) { + /* If Growl Notification or Window and Growl has been selected */ + if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Growl Notification"] || + [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"]) + { + /*Growl Notification*/ + [self showGrowlDoneNotification: NULL]; + } + /* If Alert Window or Window and Growl has been selected */ + if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window"] || + [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"]) + { + /*On Screen Notification*/ + int status; + NSBeep(); + status = NSRunAlertPanel(@"Put down that cocktail...",@"Your HandBrake encode is done!", @"OK", nil, nil); + [NSApp requestUserAttention:NSCriticalRequest]; + if ( status == NSAlertDefaultReturn ) + { + [self enableUI: YES]; + } + } + else + { + [self enableUI: YES]; + } + /* If sleep has been selected */ + if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Put Computer To Sleep"]) + { + /* Sleep */ + NSDictionary* errorDict; + NSAppleEventDescriptor* returnDescriptor = NULL; + NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource: + @"tell application \"Finder\" to sleep"]; + returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; + [scriptObject release]; + [self enableUI: YES]; + } + /* If Shutdown has been selected */ + if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Shut Down Computer"]) + { + /* Shut Down */ + NSDictionary* errorDict; + NSAppleEventDescriptor* returnDescriptor = NULL; + NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource: + @"tell application \"Finder\" to shut down"]; + returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; + [scriptObject release]; + [self enableUI: YES]; + } + + // MetaX insertion via AppleScript + if([[NSUserDefaults standardUserDefaults] boolForKey: @"sendToMetaX"] == YES) + { + NSAppleScript *myScript = [[NSAppleScript alloc] initWithSource: [NSString stringWithFormat: @"%@%@%@", @"tell application \"MetaX\" to open (POSIX file \"", [fDstFile2Field stringValue], @"\")"]]; + [myScript executeAndReturnError: nil]; + [myScript release]; + } + + + } + else + { + [self enableUI: YES]; + } + break; + } + } + + /* Lets show the queue status here in the main window */ + int queue_count = hb_count( fHandle ); + if( queue_count ) + { + [fQueueStatus setStringValue: [NSString stringWithFormat: + @"%d pass%s in the queue", + queue_count, ( queue_count > 1 ) ? "es" : ""]]; + } + else + { + [fQueueStatus setStringValue: @""]; + } } -- (BOOL) validateMenuItem: (NSMenuItem *) menuItem -{ - SEL action = [menuItem action]; + +#pragma mark - +#pragma mark Toolbar +// ============================================================ +// NSToolbar Related Methods +// ============================================================ + +- (void) setupToolbar { + toolbar = [[[NSToolbar alloc] initWithIdentifier: @"HandBrake Toolbar"] autorelease]; - hb_state_t s; - hb_get_state2( fHandle, &s ); + [toolbar setAllowsUserCustomization: YES]; + [toolbar setAutosavesConfiguration: YES]; + [toolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel]; + + [toolbar setDelegate: self]; + + [fWindow setToolbar: toolbar]; +} + +- (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"]]; + [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; + } + + return item; +} + +- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar +{ + return [NSArray arrayWithObjects: ChooseSourceIdentifier, NSToolbarSeparatorItemIdentifier, StartEncodingIdentifier, + PauseEncodingIdentifier, AddToQueueIdentifier, ShowQueueIdentifier, NSToolbarFlexibleSpaceItemIdentifier, + NSToolbarSpaceItemIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier, nil]; +} + +- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar +{ + return [NSArray arrayWithObjects: StartEncodingIdentifier, PauseEncodingIdentifier, AddToQueueIdentifier, + ChooseSourceIdentifier, ShowQueueIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier, + NSToolbarCustomizeToolbarItemIdentifier, NSToolbarFlexibleSpaceItemIdentifier, + NSToolbarSpaceItemIdentifier, NSToolbarSeparatorItemIdentifier, nil]; +} + +- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem +{ + NSString * ident = [toolbarItem itemIdentifier]; + if (fHandle) { - if (action == @selector(addToQueue:) || action == @selector(showPicturePanel:) || action == @selector(showAddPresetPanel:)) - return SuccessfulScan && [fWindow attachedSheet] == nil; + hb_state_t s; + hb_get_state2( fHandle, &s ); - 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 || s.state == HB_STATE_MUXING) { - if (s.state == HB_STATE_WORKING) + if ([ident isEqualToString: StartEncodingIdentifier]) { - if(![[menuItem title] isEqualToString:@"Pause Encoding"]) - [menuItem setTitle:@"Pause Encoding"]; + [toolbarItem setImage: [NSImage imageNamed: @"Stop"]]; + [toolbarItem setLabel: @"Stop"]; + [toolbarItem setPaletteLabel: @"Stop"]; + [toolbarItem setToolTip: @"Stop Encoding"]; return YES; } - else if (s.state == HB_STATE_PAUSED) + if ([ident isEqualToString: PauseEncodingIdentifier]) { - if(![[menuItem title] isEqualToString:@"Resume Encoding"]) - [menuItem setTitle:@"Resume Encoding"]; + [toolbarItem setImage: [NSImage imageNamed: @"Pause"]]; + [toolbarItem setLabel: @"Pause"]; + [toolbarItem setPaletteLabel: @"Pause Encoding"]; + [toolbarItem setToolTip: @"Pause Encoding"]; return YES; } - else + 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; + } + + } + + 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(browseSources:)) + { + 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:)) @@ -584,7 +1024,8 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It return YES; } - +#pragma mark - +#pragma mark Growl // register a test notification and make // it enabled by default #define SERVICE_NAME @"Encode Done" @@ -598,617 +1039,295 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It return registrationDictionary; } -- (void) TranslateStrings +-(IBAction)showGrowlDoneNotification:(id)sender { - [fSrcTitleField setStringValue: _( @"Title:" )]; - [fSrcChapterField setStringValue: _( @"Chapters:" )]; - [fSrcChapterToField setStringValue: _( @"to" )]; - [fSrcDuration1Field setStringValue: _( @"Duration:" )]; + [GrowlApplicationBridge + notifyWithTitle:@"Put down that cocktail..." + description:@"your HandBrake encode is done!" + notificationName:SERVICE_NAME + iconData:nil + priority:0 + isSticky:1 + clickContext:nil]; +} - [fDstFormatField setStringValue: _( @"Format:" )]; - [fDstCodecsField setStringValue: _( @"Codecs:" )]; - [fDstFile1Field setStringValue: _( @"File:" )]; - [fDstBrowseButton setTitle: _( @"Browse" )]; +#pragma mark - +#pragma mark Get New Source - [fVidRateField setStringValue: _( @"Framerate (fps):" )]; - [fVidEncoderField setStringValue: _( @"Encoder:" )]; - [fVidQualityField setStringValue: _( @"Quality:" )]; +/*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]; } -/*********************************************************************** - * UpdateDockIcon - *********************************************************************** - * Shows a progression bar on the dock icon, filled according to - * 'progress' (0.0 <= progress <= 1.0). - * Called with progress < 0.0 or progress > 1.0, restores the original - * icon. - **********************************************************************/ -- (void) UpdateDockIcon: (float) progress +- (void) browseSourcesDone: (NSOpenPanel *) sheet + returnCode: (int) returnCode contextInfo: (void *) contextInfo { - NSImage * icon; - NSData * tiff; - NSBitmapImageRep * bmp; - uint32_t * pen; - uint32_t black = htonl( 0x000000FF ); - uint32_t red = htonl( 0xFF0000FF ); - uint32_t white = htonl( 0xFFFFFFFF ); - int row_start, row_end; - int i, j; - - /* Get application original icon */ - icon = [NSImage imageNamed: @"NSApplicationIcon"]; - - if( progress < 0.0 || progress > 1.0 ) - { - [NSApp setApplicationIconImage: icon]; - return; - } - - /* Get it in a raw bitmap form */ - tiff = [icon TIFFRepresentationUsingCompression: - NSTIFFCompressionNone factor: 1.0]; - bmp = [NSBitmapImageRep imageRepWithData: tiff]; - - /* Draw the progression bar */ - /* It's pretty simple (ugly?) now, but I'm no designer */ - - row_start = 3 * (int) [bmp size].height / 4; - row_end = 7 * (int) [bmp size].height / 8; - - for( i = row_start; i < row_start + 2; i++ ) - { - pen = (uint32_t *) ( [bmp bitmapData] + i * [bmp bytesPerRow] ); - for( j = 0; j < (int) [bmp size].width; j++ ) - { - pen[j] = black; - } - } - for( i = row_start + 2; i < row_end - 2; i++ ) + /* 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 ) { - pen = (uint32_t *) ( [bmp bitmapData] + i * [bmp bytesPerRow] ); - pen[0] = black; - pen[1] = black; - for( j = 2; j < (int) [bmp size].width - 2; j++ ) + + 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) { - if( j < 2 + (int) ( ( [bmp size].width - 4.0 ) * progress ) ) + /* 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"]) { - pen[j] = red; + /* 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 { - pen[j] = white; + /* 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]; } - pen[j] = black; - pen[j+1] = black; + 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]; + } + } - for( i = row_end - 2; i < row_end; i++ ) + else // User clicked Cancel in browse window { - pen = (uint32_t *) ( [bmp bitmapData] + i * [bmp bytesPerRow] ); - for( j = 0; j < (int) [bmp size].width; j++ ) + /* if we have a title loaded up */ + if ([[fSrcDVD2Field stringValue] length] > 0) { - pen[j] = black; + [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]; +} - /* Now update the dock icon */ - tiff = [bmp TIFFRepresentationUsingCompression: - NSTIFFCompressionNone factor: 1.0]; - icon = [[NSImage alloc] initWithData: tiff]; - [NSApp setApplicationIconImage: icon]; - [icon release]; +- (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]]; + } } -- (void) updateUI: (NSTimer *) timer + +/* 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 ); +} - hb_list_t * list; - list = hb_get_titles( fHandle ); - /* check to see if there has been a new scan done - this bypasses the constraints of HB_STATE_WORKING - not allowing setting a newly scanned source */ - int checkScanCount = hb_get_scancount( fHandle ); - if (checkScanCount > currentScanCount) +- (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 = 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 */ - currentScanCount = checkScanCount; - //[fScanController Cancel: NULL]; - [fScanIndicator setIndeterminate: NO]; - [fScanIndicator setDoubleValue: 0.0]; - [fScanIndicator setHidden: YES]; - - [self showNewScan: NULL]; - } - - hb_state_t s; - hb_get_state( fHandle, &s ); - - - switch( s.state ) - { - case HB_STATE_IDLE: - break; -#define p s.param.scanning - case HB_STATE_SCANNING: + currentSuccessfulScanCount++; + + [toolbar validateVisibleItems]; + + [fSrcTitlePopUp removeAllItems]; + for( int i = 0; i < hb_list_count( list ); i++ ) { - [fSrcDVD2Field setStringValue: [NSString stringWithFormat: - _( @"Scanning title %d of %d..." ), - p.title_cur, p.title_count]]; - [fScanIndicator setIndeterminate: NO]; - [fScanIndicator setDoubleValue: 100.0 * ( p.title_cur - 1 ) / - p.title_count]; - break; - } -#undef p - -#define p s.param.scandone - case HB_STATE_SCANDONE: - { - - [fScanIndicator setIndeterminate: NO]; - [fScanIndicator setDoubleValue: 0.0]; - [fScanIndicator setHidden: YES]; - [self showNewScan: NULL]; - [toolbar validateVisibleItems]; - break; - } -#undef p + title = (hb_title_t *) hb_list_item( list, i ); -#define p s.param.working - case HB_STATE_WORKING: - { - float progress_total; - NSMutableString * string; - /* Currently, p.job_cur and p.job_count get screwed up when adding - jobs during encoding, if they cannot be fixed in libhb, will implement a - nasty but working cocoa solution */ - /* Update text field */ - string = [NSMutableString stringWithFormat: _( @"Encoding: task %d of %d, %.2f %%" ), p.job_cur, p.job_count, 100.0 * p.progress]; + currentSource = [NSString stringWithUTF8String: title->name]; - if( p.seconds > -1 ) - { - [string appendFormat: - _( @" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)" ), - p.rate_cur, p.rate_avg, p.hours, p.minutes, p.seconds]; - } - [fStatusField setStringValue: string]; - - /* Update slider */ - progress_total = ( p.progress + p.job_cur - 1 ) / p.job_count; - [fRipIndicator setIndeterminate: NO]; - [fRipIndicator setDoubleValue: 100.0 * progress_total]; - - // If progress bar hasn't been revealed at the bottom of the window, do - // that now. This code used to be in doRip. I moved it to here to handle - // the case where hb_start is called by HBQueueController and not from - // HBController. - if (!fRipIndicatorShown) + /* 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"]) { - NSRect frame = [fWindow frame]; - if (frame.size.width <= 591) - frame.size.width = 591; - frame.size.height += 36; - frame.origin.y -= 36; - [fWindow setFrame:frame display:YES animate:YES]; - fRipIndicatorShown = 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]; + /* 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]]; } - - /* Update dock icon */ - [self UpdateDockIcon: progress_total]; - - // Has current job changed? That means the queue has probably changed as - // well so update it - if (fLastKnownCurrentJob != hb_current_job(fHandle)) + else { - fLastKnownCurrentJob = hb_current_job(fHandle); - [fQueueController updateQueueUI]; + /* if not the VIDEO_TS Folder, we can assume the chosen folder is the source name */ + sourceDisplayName = [NSString stringWithFormat:[currentSource lastPathComponent]]; } - [fQueueController updateCurrentJobUI]; - - break; - } -#undef p - -#define p s.param.muxing - case HB_STATE_MUXING: - { - NSMutableString * string; - - /* Update text field */ - string = [NSMutableString stringWithFormat: - _( @"Muxing..." )]; - [fStatusField setStringValue: string]; + /*Set DVD Name at top of window*/ + [fSrcDVD2Field setStringValue:[NSString stringWithFormat: @"%@", sourceDisplayName]]; - /* Update slider */ - [fRipIndicator setIndeterminate: YES]; - [fRipIndicator startAnimation: nil]; + /* 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]]; + } - /* Update dock icon */ - [self UpdateDockIcon: 1.0]; + if (longuestpri < title->hours*60*60 + title->minutes *60 + title->seconds) + { + longuestpri=title->hours*60*60 + title->minutes *60 + title->seconds; + indxpri=i; + } - // Pass along the info to HBQueueController - [fQueueController updateCurrentJobUI]; + [self formatPopUpChanged:NULL]; - break; + [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]; } -#undef p - - case HB_STATE_PAUSED: - [fStatusField setStringValue: _( @"Paused" )]; - - // Pass along the info to HBQueueController - [fQueueController updateCurrentJobUI]; + + } +} - break; - - case HB_STATE_WORKDONE: - { - // HB_STATE_WORKDONE happpens as a result of hblib finishing all its jobs - // or someone calling hb_stop. In the latter case, hb_stop does not clear - // out the remaining passes/jobs in the queue. We'll do that here. - - // Delete all remaining scans of this job, ie, delete whole encodes. - hb_job_t * job; - while( ( job = hb_job( fHandle, 0 ) ) && (job->sequence_id != 0) ) - hb_rem( fHandle, job ); - // Start processing back up if jobs still left in queue - if (hb_count(fHandle) > 0) - { - hb_start(fHandle); - fEncodeState = 1; - // Validate the toolbar (hack). The toolbar will usually get autovalidated - // before we had the chance to restart the queue, hence it will now be in - // the wrong state. - [toolbar validateVisibleItems]; - break; - } +#pragma mark - +#pragma mark New Output Destination - [fStatusField setStringValue: _( @"Done." )]; - [fRipIndicator setIndeterminate: NO]; - [fRipIndicator setDoubleValue: 0.0]; - [toolbar validateVisibleItems]; +- (IBAction) browseFile: (id) sender +{ + /* Open a panel to let the user choose and update the text field */ + NSSavePanel * panel = [NSSavePanel savePanel]; + /* We get the current file name and path from the destination field here */ + [panel beginSheetForDirectory: [[fDstFile2Field stringValue] stringByDeletingLastPathComponent] file: [[fDstFile2Field stringValue] lastPathComponent] + modalForWindow: fWindow modalDelegate: self + didEndSelector: @selector( browseFileDone:returnCode:contextInfo: ) + contextInfo: NULL]; +} - /* Restore dock icon */ - [self UpdateDockIcon: -1.0]; +- (void) browseFileDone: (NSSavePanel *) sheet + returnCode: (int) returnCode contextInfo: (void *) contextInfo +{ + if( returnCode == NSOKButton ) + { + [fDstFile2Field setStringValue: [sheet filename]]; + } +} - if (fRipIndicatorShown) - { - NSRect frame = [fWindow frame]; - if (frame.size.width <= 591) - frame.size.width = 591; - frame.size.height += -36; - frame.origin.y -= -36; - [fWindow setFrame:frame display:YES animate:YES]; - fRipIndicatorShown = NO; - } - - // Queue has been modified so update the UI - fLastKnownCurrentJob = nil; - [fQueueController updateQueueUI]; - [fQueueController updateCurrentJobUI]; - - /* Check to see if the encode state has not been cancelled - to determine if we should check for encode done notifications */ - if (fEncodeState != 2) { - /* If Growl Notification or Window and Growl has been selected */ - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Growl Notification"] || - [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"]) - { - /*Growl Notification*/ - [self showGrowlDoneNotification: NULL]; - } - /* If Alert Window or Window and Growl has been selected */ - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window"] || - [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"]) - { - /*On Screen Notification*/ - int status; - NSBeep(); - status = NSRunAlertPanel(@"Put down that cocktail...",@"Your HandBrake encode is done!", @"OK", nil, nil); - [NSApp requestUserAttention:NSCriticalRequest]; - if ( status == NSAlertDefaultReturn ) - { - [self enableUI: YES]; - } - } - else - { - [self enableUI: YES]; - } - /* If sleep has been selected */ - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Put Computer To Sleep"]) - { - /* Sleep */ - NSDictionary* errorDict; - NSAppleEventDescriptor* returnDescriptor = NULL; - NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource: - @"tell application \"Finder\" to sleep"]; - returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; - [scriptObject release]; - [self enableUI: YES]; - } - /* If Shutdown has been selected */ - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Shut Down Computer"]) - { - /* Shut Down */ - NSDictionary* errorDict; - NSAppleEventDescriptor* returnDescriptor = NULL; - NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource: - @"tell application \"Finder\" to shut down"]; - returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; - [scriptObject release]; - [self enableUI: YES]; - } - - // MetaX insertion via AppleScript - if([[NSUserDefaults standardUserDefaults] boolForKey: @"sendToMetaX"] == YES) - { - NSAppleScript *myScript = [[NSAppleScript alloc] initWithSource: [NSString stringWithFormat: @"%@%@%@", @"tell application \"MetaX\" to open (POSIX file \"", [fDstFile2Field stringValue], @"\")"]]; - [myScript executeAndReturnError: nil]; - [myScript release]; - } - - - } - else - { - [self enableUI: YES]; - } - break; - } - } - - /* Lets show the queue status here in the main window */ - int queue_count = hb_count( fHandle ); - if( queue_count ) - { - [fQueueStatus setStringValue: [NSString stringWithFormat: - @"%d pass%s in the queue", - queue_count, ( queue_count > 1 ) ? "es" : ""]]; - } - else - { - [fQueueStatus setStringValue: @""]; - } -} - -- (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 = 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->dvd]; - - /* 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 */ - sourceDisplayName = [NSString stringWithFormat:[[currentSource 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]; - } - - } -} - --(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) 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++ ) - { - 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]; - - } - - 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]; -} - -- (IBAction) showScanPanel: (id) sender -{ - [self enableUI: NO]; - [self browseSources:NULL]; -} - -- (void) browseSources: (id) sender -{ - 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]; -} -- (void) browseSourcesDone: (NSOpenPanel *) sheet - returnCode: (int) returnCode contextInfo: (void *) contextInfo -{ - /* User selected a file to open */ - if( returnCode == NSOKButton ) - { - [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] ) - { - // The chosen path was actually on a DVD, so use the raw block - // device path instead. - path = [detector devicePath]; - } - - 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]; - } - } -} +#pragma mark - +#pragma mark Main Window Control - (IBAction) openMainWindow: (id) sender { @@ -1231,90 +1350,17 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It return NO; } -- (IBAction) videoMatrixChanged: (id) sender; +#pragma mark - +#pragma mark Job Handling + + +- (void) prepareJob { - bool target, bitrate, quality; - - target = bitrate = quality = false; - if( [fVidQualityMatrix isEnabled] ) - { - switch( [fVidQualityMatrix selectedRow] ) - { - case 0: - target = true; - break; - case 1: - bitrate = true; - break; - case 2: - quality = true; - break; - } - } - [fVidTargetSizeField setEnabled: target]; - [fVidBitrateField setEnabled: bitrate]; - [fVidQualitySlider setEnabled: quality]; - [fVidTwoPassCheck setEnabled: !quality && - [fVidQualityMatrix isEnabled]]; - if( quality ) - { - [fVidTwoPassCheck setState: NSOffState]; - [fVidTurboPassCheck setHidden: YES]; - [fVidTurboPassCheck setState: NSOffState]; - } - - [self qualitySliderChanged: sender]; - [self calculateBitrate: sender]; - [self customSettingUsed: sender]; -} - -- (IBAction) qualitySliderChanged: (id) sender -{ - [fVidConstantCell setTitle: [NSString stringWithFormat: - _( @"Constant quality: %.0f %%" ), 100.0 * - [fVidQualitySlider floatValue]]]; - [self customSettingUsed: sender]; -} - -- (IBAction) browseFile: (id) sender -{ - /* Open a panel to let the user choose and update the text field */ - NSSavePanel * panel = [NSSavePanel savePanel]; - /* We get the current file name and path from the destination field here */ - [panel beginSheetForDirectory: [[fDstFile2Field stringValue] stringByDeletingLastPathComponent] file: [[fDstFile2Field stringValue] lastPathComponent] - modalForWindow: fWindow modalDelegate: self - didEndSelector: @selector( browseFileDone:returnCode:contextInfo: ) - contextInfo: NULL]; -} - -- (void) browseFileDone: (NSSavePanel *) sheet - returnCode: (int) returnCode contextInfo: (void *) contextInfo -{ - if( returnCode == NSOKButton ) - { - [fDstFile2Field setStringValue: [sheet filename]]; - } -} - -- (IBAction) showPicturePanel: (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]; -} - -- (void)pictureSettingsDidChange { - [self calculatePictureSizing: NULL]; -} - -- (void) PrepareJob -{ - 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; - //int i; + 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; + //int i; /* Chapter selection */ job->chapter_start = [fSrcChapterStartPopUp indexOfSelectedItem] + 1; @@ -1461,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 */ @@ -1512,6 +1569,12 @@ 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 ); + } } @@ -1568,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]; @@ -1622,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 ); @@ -1646,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 @@ -1730,22 +1798,6 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It } } -- (void) updateAlertDone: (NSWindow *) sheet - returnCode: (int) returnCode contextInfo: (void *) contextInfo -{ - if( returnCode == NSAlertAlternateReturn ) - { - /* Show scan panel */ - [self performSelectorOnMainThread: @selector(showScanPanel:) - withObject: NULL waitUntilDone: NO]; - return; - } - - /* Go to HandBrake homepage and exit */ - [self openHomepage: NULL]; - [NSApp terminate: self]; -} - - (void) remindUserOfSleepOrShutdown { if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Put Computer To Sleep"]) @@ -1808,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 @@ -1885,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 ); @@ -2004,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 @@ -2228,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 */ @@ -2268,92 +2392,330 @@ 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; - - /* 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]; +- (IBAction) calculateBitrate: (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; + + [self prepareJob]; + + [fVidBitrateField setIntValue: hb_calc_bitrate( job, + [fVidTargetSizeField intValue] )]; +} + +#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 + in the gui to easily take the user back to max. Remember, the compiler + resolves IBActions down to -(void) during compile anyway */ +- (IBAction) revertPictureSizeToMax: (id) sender +{ + hb_job_t * job = fTitle->job; + /* We use the output picture width and height + as calculated from libhb right after title is set + in TitlePopUpChanged */ + job->width = PicOrigOutputWidth; + job->height = PicOrigOutputHeight; + [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: sender]; + /* We call method method to change UI to reflect whether a preset is used or not*/ + [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 +{ + [fPicSettingWidth setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->width]]; + [fPicSettingHeight setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->height]]; + + if (fTitle->job->pixel_ratio == 1) + { + int titlewidth = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3]; + int arpwidth = fTitle->job->pixel_aspect_width; + int arpheight = fTitle->job->pixel_aspect_height; + int displayparwidth = titlewidth * arpwidth / arpheight; + int displayparheight = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]; + + [fPicSettingWidth setStringValue: [NSString stringWithFormat:@"%d", titlewidth]]; + [fPicSettingHeight setStringValue: [NSString stringWithFormat:@"%d", displayparheight]]; + [fPicLabelPAROutputX setStringValue: @"x"]; + [fPicSettingPARWidth setStringValue: [NSString stringWithFormat:@"%d", displayparwidth]]; + [fPicSettingPARHeight setStringValue: [NSString stringWithFormat:@"%d", displayparheight]]; + + fTitle->job->keep_ratio = 0; + } + else + { + [fPicLabelPAROutputX setStringValue: @""]; + [fPicSettingPARWidth setStringValue: @""]; + [fPicSettingPARHeight setStringValue: @""]; + } + + /* Set ON/Off values for the deinterlace/keep aspect ratio according to boolean */ + if (fTitle->job->keep_ratio > 0) + { + [fPicSettingARkeep setStringValue: @"On"]; + } + else + { + [fPicSettingARkeep setStringValue: @"Off"]; + } + /* Detelecine */ + if ([fPictureController detelecine]) { + [fPicSettingDetelecine setStringValue: @"Yes"]; + } + else { + [fPicSettingDetelecine setStringValue: @"No"]; + } + + /* 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"]; + } + else if ([fPictureController deinterlace] == 1) + { + [fPicSettingDeinterlace setStringValue: @"Fast"]; + } + else if ([fPictureController deinterlace] == 2) + { + [fPicSettingDeinterlace setStringValue: @"Slow"]; + } + else if ([fPictureController deinterlace] == 3) + { + [fPicSettingDeinterlace setStringValue: @"Slower"]; + } + else if ([fPictureController deinterlace] ==4) + { + [fPicSettingDeinterlace setStringValue: @"Slowest"]; + } + /* Denoise */ + if ([fPictureController denoise] == 0) + { + [fPicSettingDenoise setStringValue: @"Off"]; + } + else if ([fPictureController denoise] == 1) + { + [fPicSettingDenoise setStringValue: @"Weak"]; + } + else if ([fPictureController denoise] == 2) + { + [fPicSettingDenoise setStringValue: @"Medium"]; + } + else if ([fPictureController denoise] == 3) + { + [fPicSettingDenoise setStringValue: @"Strong"]; + } + + /* Deblock */ + if ([fPictureController deblock]) { + [fPicSettingDeblock setStringValue: @"Yes"]; + } + else { + [fPicSettingDeblock setStringValue: @"No"]; + } + + if (fTitle->job->pixel_ratio > 0) + { + [fPicSettingPAR setStringValue: @""]; + } + else + { + [fPicSettingPAR setStringValue: @"Off"]; + } + /* Set the display field for crop as per boolean */ + if (![fPictureController autoCrop]) + { + [fPicSettingAutoCrop setStringValue: @"Custom"]; + } + else + { + [fPicSettingAutoCrop setStringValue: @"Auto"]; + } + + +} + + +#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 +{ + + 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++ ) + { + 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++ ) + { + /* 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]; + } + +} + +- (IBAction) audioTrackPopUpChanged: (id) sender +{ + /* utility function to call audioTrackPopUpChanged without passing in a mixdown-to-use */ + [self audioTrackPopUpChanged: sender mixdownToUse: 0]; +} + +- (IBAction) audioTrackPopUpChanged: (id) sender mixdownToUse: (int) mixdownToUse +{ + + /* make sure we have a selected title before continuing */ + if (fTitle == NULL) 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]; /* get the index of the selected audio */ int thisAudioIndex = [sender indexOfSelectedItem] - 1; @@ -2636,721 +2998,539 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It } -/* 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 - in the gui to easily take the user back to max. Remember, the compiler - resolves IBActions down to -(void) during compile anyway */ -- (IBAction) revertPictureSizeToMax: (id) sender -{ - hb_job_t * job = fTitle->job; - /* We use the output picture width and height - as calculated from libhb right after title is set - in TitlePopUpChanged */ - job->width = PicOrigOutputWidth; - job->height = PicOrigOutputHeight; - [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: sender]; - /* We call method method to change UI to reflect whether a preset is used or not*/ - [self customSettingUsed: sender]; -} -/* Get and Display Current Pic Settings in main window */ -- (IBAction) calculatePictureSizing: (id) sender -{ - [fPicSettingWidth setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->width]]; - [fPicSettingHeight setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->height]]; - - if (fTitle->job->pixel_ratio == 1) - { - int titlewidth = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3]; - int arpwidth = fTitle->job->pixel_aspect_width; - int arpheight = fTitle->job->pixel_aspect_height; - int displayparwidth = titlewidth * arpwidth / arpheight; - int displayparheight = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]; - - [fPicSettingWidth setStringValue: [NSString stringWithFormat:@"%d", titlewidth]]; - [fPicSettingHeight setStringValue: [NSString stringWithFormat:@"%d", displayparheight]]; - [fPicLabelPAROutputX setStringValue: @"x"]; - [fPicSettingPARWidth setStringValue: [NSString stringWithFormat:@"%d", displayparwidth]]; - [fPicSettingPARHeight setStringValue: [NSString stringWithFormat:@"%d", displayparheight]]; - - fTitle->job->keep_ratio = 0; - } - else - { - [fPicLabelPAROutputX setStringValue: @""]; - [fPicSettingPARWidth setStringValue: @""]; - [fPicSettingPARHeight setStringValue: @""]; - } - - /* Set ON/Off values for the deinterlace/keep aspect ratio according to boolean */ - if (fTitle->job->keep_ratio > 0) - { - [fPicSettingARkeep setStringValue: @"On"]; - } - else - { - [fPicSettingARkeep setStringValue: @"Off"]; - } - /* Detelecine */ - if ([fPictureController detelecine]) { - [fPicSettingDetelecine setStringValue: @"Yes"]; - } - else { - [fPicSettingDetelecine setStringValue: @"No"]; - } - /* Deinterlace */ - if ([fPictureController deinterlace] == 0) - { - [fPicSettingDeinterlace setStringValue: @"Off"]; - } - else if ([fPictureController deinterlace] == 1) - { - [fPicSettingDeinterlace setStringValue: @"Fast"]; - } - else if ([fPictureController deinterlace] == 2) - { - [fPicSettingDeinterlace setStringValue: @"Slow"]; - } - else if ([fPictureController deinterlace] == 3) - { - [fPicSettingDeinterlace setStringValue: @"Slower"]; - } - else if ([fPictureController deinterlace] ==4) - { - [fPicSettingDeinterlace setStringValue: @"Slowest"]; - } - /* Denoise */ - if ([fPictureController denoise] == 0) - { - [fPicSettingDenoise setStringValue: @"Off"]; - } - else if ([fPictureController denoise] == 1) - { - [fPicSettingDenoise setStringValue: @"Weak"]; - } - else if ([fPictureController denoise] == 2) - { - [fPicSettingDenoise setStringValue: @"Medium"]; - } - else if ([fPictureController denoise] == 3) - { - [fPicSettingDenoise setStringValue: @"Strong"]; - } - - if (fTitle->job->pixel_ratio > 0) - { - [fPicSettingPAR setStringValue: @""]; - } - else - { - [fPicSettingPAR setStringValue: @"Off"]; - } - /* Set the display field for crop as per boolean */ - if (![fPictureController autoCrop]) - { - [fPicSettingAutoCrop setStringValue: @"Custom"]; - } - else - { - [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]; -} +#pragma mark - +#pragma mark Open New Windows -- (IBAction) calculateBitrate: (id) sender +- (IBAction) openHomepage: (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; - - [self PrepareJob]; - - [fVidBitrateField setIntValue: hb_calc_bitrate( job, - [fVidTargetSizeField intValue] )]; + [[NSWorkspace sharedWorkspace] openURL: [NSURL + URLWithString:@"http://handbrake.m0k.org/"]]; } -/* 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) openForums: (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; - } - + [[NSWorkspace sharedWorkspace] openURL: [NSURL + URLWithString:@"http://handbrake.m0k.org/forum/"]]; } - - /* We use this method to recreate new, updated factory - presets */ -- (IBAction)addFactoryPresets:(id)sender +- (IBAction) openUserGuide: (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]; + [[NSWorkspace sharedWorkspace] openURL: [NSURL + URLWithString:@"http://handbrake.m0k.org/trac/wiki/HandBrakeGuide"]]; } -- (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]; +/** + * Shows debug output window. + */ +- (IBAction)showDebugOutputPanel:(id)sender +{ + [outputPanel showOutputPanel:sender]; } -- (IBAction) showAddPresetPanel: (id) sender +/** + * Shows preferences window. + */ +- (IBAction) showPreferencesWindow: (id) sender { - /* Deselect the currently selected Preset if there is one*/ - [tableView deselectRow:[tableView selectedRow]]; + NSWindow * window = [fPreferencesController window]; + if (![window isVisible]) + [window center]; - /* 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]; + [window makeKeyAndOrderFront: nil]; } -- (IBAction) closeAddPresetPanel: (id) sender +/** + * Shows queue window. + */ +- (IBAction) showQueueWindow:(id)sender { - [NSApp endSheet: fAddPresetPanel]; - [fAddPresetPanel orderOut: self]; + [fQueueController showQueueWindow:sender]; } -- (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]; +- (IBAction) toggleDrawer:(id)sender { + [fPresetDrawer toggle:self]; } -- (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; - -} +/** + * Shows Picture Settings Window. + */ -- (NSDictionary *)createIpodLowPreset +- (IBAction) showPicturePanel: (id) sender { - 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; - + 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 -- (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 +- (IBAction)tableViewSelected:(id)sender { - 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"]; + /* 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]]; + } - /*Audio*/ - /* Audio Sample Rate*/ - [preset setObject:@"48" forKey:@"AudioSampleRate"]; - /* Audio Bitrate Rate*/ - [preset setObject:@"160" forKey:@"AudioBitRate"]; - /* Subtitles*/ - [preset setObject:@"None" forKey:@"Subtitles"]; + [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); - [preset autorelease]; - return preset; +} +- (id)tableView:(NSTableView *)aTableView + objectValueForTableColumn:(NSTableColumn *)aTableColumn + row:(int)rowIndex +{ +id theRecord, theValue; + + theRecord = [UserPresets objectAtIndex:rowIndex]; + theValue = [theRecord objectForKey:[aTableColumn identifier]]; + return theValue; } -- (NSDictionary *)createPSThreePreset +// 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 { - 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"]; + 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]; + } - /* 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"]; +} + + +- (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]; - /*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"]; + /* 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 +{ + - /*Audio*/ - /* Audio Sample Rate*/ - [preset setObject:@"48" forKey:@"AudioSampleRate"]; - /* Audio Bitrate Rate*/ - [preset setObject:@"160" forKey:@"AudioBitRate"]; - /* Subtitles*/ - [preset setObject:@"None" forKey:@"Subtitles"]; + /* 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]; +} - [preset autorelease]; - return preset; - +- (IBAction)insertPreset:(id)sender +{ + int index = [tableView selectedRow]; + [UserPresets insertObject:[self createPreset] atIndex:index]; + [tableView reloadData]; + [self savePreset]; } -- (NSDictionary *)createPSPPreset + +- (NSDictionary *)createPreset { 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"]; + [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: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"]; + [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:@"MP4 file" forKey:@"FileFormat"]; - /* Chapter Markers*/ - [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"]; + [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:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"]; + [preset setObject:[fDstCodecsPopUp titleOfSelectedItem] 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:[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:@"1024" forKey:@"VideoAvgBitrate"]; + [preset setObject:[fVidBitrateField stringValue] forKey:@"VideoAvgBitrate"]; [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"]; /* Video framerate */ - [preset setObject:@"Same as source" forKey:@"VideoFramerate"]; + 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:0] forKey:@"VideoGrayScale"]; + [preset setObject:[NSNumber numberWithInt:[fVidGrayscaleCheck state]] forKey:@"VideoGrayScale"]; /* 2 Pass Encoding */ - [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"]; - + [preset setObject:[NSNumber numberWithInt:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"]; + /* Turbo 2 pass Encoding fVidTurboPassCheck*/ + [preset setObject:[NSNumber numberWithInt:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"]; /*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*/ + 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:@"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"]; + [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: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"]; + [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:@"48" forKey:@"AudioSampleRate"]; + [preset setObject:[fAudRatePopUp titleOfSelectedItem] forKey:@"AudioSampleRate"]; /* Audio Bitrate Rate*/ - [preset setObject:@"128" forKey:@"AudioBitRate"]; + [preset setObject:[fAudBitratePopUp titleOfSelectedItem] forKey:@"AudioBitRate"]; /* Subtitles*/ - [preset setObject:@"None" forKey:@"Subtitles"]; + [preset setObject:[fSubPopUp titleOfSelectedItem] forKey:@"Subtitles"]; [preset autorelease]; @@ -3358,148 +3538,181 @@ the user is using "Custom" settings by determining the sender*/ } -- (NSDictionary *)createNormalPreset +- (void)savePreset { - 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"]; + [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]; +} - [preset autorelease]; - return preset; - +- (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]; + } } -- (NSDictionary *)createClassicPreset + +#pragma mark - +#pragma mark Manage Built In Presets + + +- (IBAction)deleteFactoryPresets:(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"]; - + //int status; + NSEnumerator *enumerator = [UserPresets objectEnumerator]; + id tempObject; + + //NSNumber *index; + NSMutableArray *tempArray; - [preset autorelease]; - return preset; + + 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]; } -- (NSDictionary *)createFilmPreset + /* 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:@"Film" forKey:@"PresetName"]; + [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*/ @@ -3507,21 +3720,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 feature films." forKey:@"PresetDescription"]; + [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:@"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"]; + [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"]; /* Video encoder */ - [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"]; + [preset setObject:@"x264 (h.264 iPod)" 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"]; + [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:@"2000" forKey:@"VideoAvgBitrate"]; + [preset setObject:@"700" forKey:@"VideoAvgBitrate"]; [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"]; /* Video framerate */ @@ -3529,20 +3742,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: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 */ /* Use Max Picture settings for whatever the dvd is.*/ - [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"]; + [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"]; [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"]; - [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"]; + [preset setObject:[NSNumber numberWithInt:320] 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"]; @@ -3564,11 +3776,12 @@ the user is using "Custom" settings by determining the sender*/ } -- (NSDictionary *)createTelevisionPreset + +- (NSDictionary *)createIpodHighPreset { NSMutableDictionary *preset = [[NSMutableDictionary alloc] init]; /* Get the New Preset Name from the field in the AddPresetPanel */ - [preset setObject:@"Television" forKey:@"PresetName"]; + [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*/ @@ -3576,21 +3789,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 settings for video from television." forKey:@"PresetDescription"]; + [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:@"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 / AAC Audio" forKey:@"FileCodecs"]; /* Video encoder */ - [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"]; + [preset setObject:@"x264 (h.264 iPod)" 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"]; + [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:@"1300" forKey:@"VideoAvgBitrate"]; + [preset setObject:@"1500" forKey:@"VideoAvgBitrate"]; [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"]; /* Video framerate */ @@ -3598,22 +3811,21 @@ 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 */ /* 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:@"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:1] forKey:@"PictureDeinterlace"]; + [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"]; @@ -3633,33 +3845,33 @@ the user is using "Custom" settings by determining the sender*/ } -- (NSDictionary *)createAnimationPreset +- (NSDictionary *)createAppleTVPreset { 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:@"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:1] forKey:@"UsesPictureSettings"]; + [preset setObject:[NSNumber numberWithInt:2] 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"]; + [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:@"MKV file" forKey:@"FileFormat"]; + [preset setObject:@"MP4 file" forKey:@"FileFormat"]; /* Chapter Markers*/ [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"]; - /* Codecs */ + /* 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"]; + /* 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:@"1000" forKey:@"VideoAvgBitrate"]; + [preset setObject:@"2500" forKey:@"VideoAvgBitrate"]; [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"]; /* Video framerate */ @@ -3667,19 +3879,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:1] forKey:@"VideoTwoPass"]; - [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"]; + [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: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: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 */ @@ -3702,33 +3917,33 @@ the user is using "Custom" settings by determining the sender*/ } -- (NSDictionary *)createQuickTimePreset +- (NSDictionary *)createPSThreePreset { 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:@"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:1] forKey:@"UsesPictureSettings"]; + [preset setObject:[NSNumber numberWithInt:2] 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"]; + [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:[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 */ - [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"]; + /* 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:@"2000" forKey:@"VideoAvgBitrate"]; + [preset setObject:@"2500" forKey:@"VideoAvgBitrate"]; [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"]; /* Video framerate */ @@ -3736,15 +3951,15 @@ 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"]; @@ -3770,34 +3985,33 @@ the user is using "Custom" settings by determining the sender*/ return preset; } - -- (NSDictionary *)createBedlamPreset +- (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 */ @@ -3805,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"]; @@ -3830,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"]; @@ -3840,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*/ @@ -3860,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 */ @@ -3874,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"]; @@ -3898,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"]; @@ -3908,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*/ @@ -3920,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 */ @@ -3942,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; @@ -3953,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"]; @@ -3977,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*/ @@ -3989,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 */ @@ -4018,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"]; @@ -4036,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"]; @@ -4046,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*/ @@ -4058,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 */ @@ -4080,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 */ @@ -4105,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"]; @@ -4115,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*/ @@ -4127,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; @@ -4161,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 */ @@ -4184,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. - */ -- (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