From 31283b442713147dc5edb5135cb6dbcbb95635e8 Mon Sep 17 00:00:00 2001 From: ritsuka Date: Tue, 15 Jul 2014 18:30:51 +0000 Subject: MacGUI: Refactored the controller code for the video/audio/subtitles/chapters view: Added a xib file and a NSViewController subclass for each tab of the main HandBrake window. Each view controller now to responds to the HBContainerChangedNotification and HBTitleChangedNotification notifications instead of using a custom way to notify changes. Converted the modified .xibs to the Xcode 5.1 format. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6231 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- macosx/ChapterTitles.h | 32 - macosx/ChapterTitles.m | 138 - macosx/Controller.h | 166 +- macosx/Controller.m | 1829 +--- macosx/English.lproj/AdvancedView.xib | 4794 ++------- macosx/English.lproj/Audio.xib | 409 + macosx/English.lproj/ChaptersTitles.xib | 124 + macosx/English.lproj/InfoPlist.strings | Bin 90 -> 47 bytes macosx/English.lproj/MainMenu.xib | 14678 +++------------------------ macosx/English.lproj/Subtitles.xib | 171 + macosx/English.lproj/Video.xib | 416 + macosx/HBAdvancedController.h | 12 +- macosx/HBAdvancedController.m | 26 +- macosx/HBAudioController.h | 32 +- macosx/HBAudioController.m | 96 +- macosx/HBChapterTitlesController.h | 29 + macosx/HBChapterTitlesController.m | 313 + macosx/HBSubtitles.h | 58 - macosx/HBSubtitles.m | 863 -- macosx/HBSubtitlesController.h | 21 + macosx/HBSubtitlesController.m | 928 ++ macosx/HBVideoController.h | 51 + macosx/HBVideoController.m | 1339 +++ macosx/HandBrake.xcodeproj/project.pbxproj | 136 +- 24 files changed, 6121 insertions(+), 20540 deletions(-) delete mode 100644 macosx/ChapterTitles.h delete mode 100644 macosx/ChapterTitles.m create mode 100644 macosx/English.lproj/Audio.xib create mode 100644 macosx/English.lproj/ChaptersTitles.xib create mode 100644 macosx/English.lproj/Subtitles.xib create mode 100644 macosx/English.lproj/Video.xib create mode 100644 macosx/HBChapterTitlesController.h create mode 100644 macosx/HBChapterTitlesController.m delete mode 100644 macosx/HBSubtitles.h delete mode 100644 macosx/HBSubtitles.m create mode 100644 macosx/HBSubtitlesController.h create mode 100644 macosx/HBSubtitlesController.m create mode 100644 macosx/HBVideoController.h create mode 100644 macosx/HBVideoController.m diff --git a/macosx/ChapterTitles.h b/macosx/ChapterTitles.h deleted file mode 100644 index 26e86ce97..000000000 --- a/macosx/ChapterTitles.h +++ /dev/null @@ -1,32 +0,0 @@ -/* ChapterTitles.h $ - - This file is part of the HandBrake source code. - Homepage: . - It may be used under the terms of the GNU General Public License. */ - -#include -#include "hb.h" - -@interface ChapterTitles : NSObject { - hb_title_t *fTitle; - NSMutableArray *fChapterTitlesArray; -} - -// Trigger a refresh of data -- (void)resetWithTitle:(hb_title_t *)title; - -// Get the list of chapter titles -- (NSArray*)chapterTitlesArray; - -// Table View Delegates -- (NSUInteger)numberOfRowsInTableView:(NSTableView *)aTableView; - -- (id)tableView:(NSTableView *)aTableView - objectValueForTableColumn:(NSTableColumn *)aTableColumn - row:(NSInteger)rowIndex; - -- (void)tableView:(NSTableView *)aTableView - setObjectValue:(id)anObject - forTableColumn:(NSTableColumn *)aTableColumn - row:(NSInteger)rowIndex; -@end diff --git a/macosx/ChapterTitles.m b/macosx/ChapterTitles.m deleted file mode 100644 index 3bef60c44..000000000 --- a/macosx/ChapterTitles.m +++ /dev/null @@ -1,138 +0,0 @@ -/* ChapterTitles.m $ - - This file is part of the HandBrake source code. - Homepage: . - It may be used under the terms of the GNU General Public License. */ - -#include "ChapterTitles.h" -#include "hb.h" - -@implementation ChapterTitles -- (id)init -{ - self = [super init]; - if (self != nil) - { - fTitle = NULL; - fChapterTitlesArray = [[[NSMutableArray alloc] init] retain]; - } - return self; -} - -- (void)dealloc -{ - [fChapterTitlesArray release]; - [super dealloc]; -} - -- (void)resetWithTitle:(hb_title_t *)title -{ - fTitle = title; - [fChapterTitlesArray removeAllObjects]; - - if (fTitle == NULL) - return; - - for (int i = 0; i < hb_list_count(fTitle->job->list_chapter); i++) - { - hb_chapter_t *chapter = hb_list_item(fTitle->job->list_chapter, i); - if (chapter != NULL) - { - if (chapter->title != NULL) - { - [fChapterTitlesArray addObject:[NSString - stringWithFormat:@"%s", - chapter->title]]; - } - else - { - [fChapterTitlesArray addObject:[NSString - stringWithFormat:@"Chapter %d", - i + 1]]; - } - } - } -} - -- (NSArray*)chapterTitlesArray -{ - return [NSArray arrayWithArray:fChapterTitlesArray]; -} - -- (NSUInteger)numberOfRowsInTableView:(NSTableView *)aTableView -{ - if (fTitle == NULL) - { - return 0; - } - else - { - return [fChapterTitlesArray count]; - } -} - -- (void)tableView:(NSTableView *)aTableView - setObjectValue:(id)anObject - forTableColumn:(NSTableColumn *)aTableColumn - row:(NSInteger)rowIndex -{ - if (aTableColumn != nil && [[aTableColumn identifier] intValue] == 2 && - fTitle != NULL) - { - [fChapterTitlesArray replaceObjectAtIndex:rowIndex - withObject:[NSString - stringWithString:anObject]]; - } -} - -- (id)tableView:(NSTableView *)aTableView - objectValueForTableColumn:(NSTableColumn *)aTableColumn - row:(NSInteger)rowIndex -{ - if ([[aTableColumn identifier] intValue] == 1) - { - return [NSString stringWithFormat:@"%ld", rowIndex + 1]; - } - else if (fTitle != NULL) - { - return [NSString stringWithString:[fChapterTitlesArray - objectAtIndex:rowIndex]]; - } - return @"__DATA ERROR__"; -} - -/* Method to edit the next chapter when the user presses Return. We have to use -a timer to avoid interfering with the chain of events that handles the edit. */ -- (void)controlTextDidEndEditing: (NSNotification *) notification -{ - NSTableView *chapterTable = [notification object]; - NSInteger column = [chapterTable editedColumn]; - NSInteger row = [chapterTable editedRow]; - NSInteger textMovement; - - // Edit the cell in the next row, same column - row++; - textMovement = [[[notification userInfo] objectForKey:@"NSTextMovement"] integerValue]; - if( textMovement == NSReturnTextMovement && row < [chapterTable numberOfRows] ) - { - NSArray *info = [NSArray arrayWithObjects:chapterTable, - [NSNumber numberWithInteger:column], [NSNumber numberWithInteger:row], nil]; - /* The delay is unimportant; editNextRow: won't be called until the responder - chain finishes because the event loop containing the timer is on this thread */ - [self performSelector:@selector(editNextRow:) withObject:info afterDelay:0.0]; - } -} - -- (void)editNextRow: (id) objects -{ - NSTableView *chapterTable = [objects objectAtIndex:0]; - NSInteger column = [[objects objectAtIndex:1] integerValue]; - NSInteger row = [[objects objectAtIndex:2] integerValue]; - - if( row >= 0 && row < [chapterTable numberOfRows] ) - { - [chapterTable selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO]; - [chapterTable editColumn:column row:row withEvent:nil select:YES]; - } -} -@end diff --git a/macosx/Controller.h b/macosx/Controller.h index dc36ccc27..816c77cfd 100644 --- a/macosx/Controller.h +++ b/macosx/Controller.h @@ -9,15 +9,19 @@ #include "hb.h" -#import "ChapterTitles.h" -#import "HBSubtitles.h" #import "PictureController.h" #import "HBPreviewController.h" + #import "HBQueueController.h" + +#import "HBVideoController.h" +#import "HBAudioController.h" +#import "HBSubtitlesController.h" #import "HBAdvancedController.h" +#import "HBChapterTitlesController.h" + #import "HBPreferencesController.h" #import "HBPresets.h" -#import "HBAudioController.h" extern NSString *HBContainerChangedNotification; extern NSString *keyContainerTag; @@ -41,6 +45,22 @@ BOOL fIsDragging; NSImage * fApplicationIcon; IBOutlet NSWindow * fWindow; + /* Video view controller */ + HBVideoController * fVideoController; + IBOutlet NSView * fVideoView; + + /* Subtitles view controller */ + HBSubtitlesController * fSubtitlesViewController; + IBOutlet NSView * fSubtitlesView; + + /* Audio view controller */ + HBAudioController * fAudioController; + IBOutlet NSView * fAudioView; + + /* Chapters view controller */ + HBChapterTitlesController * fChapterTitlesController; + IBOutlet NSView * fChaptersTitlesView; + /* Main Menu Outlets */ NSMenuItem * fOpenSourceTitleMMenu; @@ -52,36 +72,12 @@ BOOL fIsDragging; IBOutlet NSButton * fScanSrcTitleCancelButton; IBOutlet NSButton * fScanSrcTitleOpenButton; - /* Picture Settings */ HBPictureController * fPictureController; /* Picture Preview */ HBPreviewController * fPreviewController; - /* x264 Presets Box */ - NSArray * fX264PresetNames; - NSUInteger fX264MediumPresetIndex; - IBOutlet NSButton * fX264UseAdvancedOptionsCheck; - IBOutlet NSBox * fX264PresetsBox; - IBOutlet NSSlider * fX264PresetsSlider; - IBOutlet NSTextField * fX264PresetSliderLabel; - IBOutlet NSTextField * fX264PresetSelectedTextField; - IBOutlet NSPopUpButton * fX264TunePopUp; - IBOutlet NSTextField * fX264TunePopUpLabel; - IBOutlet NSPopUpButton * fX264ProfilePopUp; - IBOutlet NSTextField * fX264ProfilePopUpLabel; - IBOutlet NSPopUpButton * fX264LevelPopUp; - IBOutlet NSTextField * fX264LevelPopUpLabel; - IBOutlet NSButton * fX264FastDecodeCheck; - IBOutlet NSTextField * fDisplayX264PresetsAdditonalOptionsTextField; - IBOutlet NSTextField * fDisplayX264PresetsAdditonalOptionsLabel; - // Text Field to show the expanded opts from unparse() - IBOutlet NSTextField * fDisplayX264PresetsUnparseTextField; - char * fX264PresetsUnparsedUTF8String; - NSUInteger fX264PresetsHeightForUnparse; - NSUInteger fX264PresetsWidthForUnparse; - /* Advanced options tab */ HBAdvancedController * fAdvancedOptions; IBOutlet NSBox * fAdvancedView; @@ -118,7 +114,6 @@ BOOL fIsDragging; IBOutlet NSTextField * fSrcFrameStartEncodingField; IBOutlet NSTextField * fSrcFrameEndEncodingField; - IBOutlet NSTextField * fSrcChapterField; IBOutlet NSPopUpButton * fSrcChapterStartPopUp; IBOutlet NSTextField * fSrcChapterToField; IBOutlet NSPopUpButton * fSrcChapterEndPopUp; @@ -141,73 +136,13 @@ BOOL fIsDragging; IBOutlet NSButton * fDstMp4HttpOptFileCheck; // Creates iPod compatible mp4's (add ipod uuid atom) IBOutlet NSButton * fDstMp4iPodFileCheck; - - /* Video box */ - - /* Framerate */ - /* Radio Button Framerate Controls */ - IBOutlet NSMatrix * fFramerateMatrix; - IBOutlet NSButtonCell * fFramerateVfrPfrCell; - IBOutlet NSButtonCell * fFramerateCfrCell; - - /* Video Encoder */ - IBOutlet NSTextField * fVidRateField; - IBOutlet NSPopUpButton * fVidRatePopUp; - IBOutlet NSTextField * fVidEncoderField; - IBOutlet NSPopUpButton * fVidEncoderPopUp; - IBOutlet NSTextField * fVidQualityField; - IBOutlet NSTextField * fVidQualityRFLabel; - IBOutlet NSTextField * fVidQualityRFField; - IBOutlet NSMatrix * fVidQualityMatrix; - IBOutlet NSButtonCell * fVidBitrateCell; - IBOutlet NSTextField * fVidBitrateField; - IBOutlet NSButtonCell * fVidConstantCell; - IBOutlet NSSlider * fVidQualitySlider; - IBOutlet NSButton * fVidTwoPassCheck; - IBOutlet NSButton * fVidTurboPassCheck; - - /* Status read out fields for picture settings and video filters */ - IBOutlet NSTextField * fPictureSettingsField; - IBOutlet NSTextField * fPictureFiltersField; - + /* Picture variables */ - int PicOrigOutputWidth; - int PicOrigOutputHeight; int AutoCropTop; int AutoCropBottom; int AutoCropLeft; int AutoCropRight; - /* Subtitles box */ - IBOutlet NSTextField * fSubField; - IBOutlet NSPopUpButton * fSubPopUp; - IBOutlet NSButton * fSubForcedCheck; - - - IBOutlet NSTableView * fSubtitlesTable; - HBSubtitles * fSubtitlesDelegate; - IBOutlet NSButton * fBrowseSrtFileButton; - - /* New Audio box */ - IBOutlet HBAudioController * fAudioDelegate; - - /* New Audio Auto Passthru box */ - IBOutlet NSBox * fAudioAutoPassthruBox; - IBOutlet NSButton * fAudioAllowAACPassCheck; - IBOutlet NSButton * fAudioAllowAC3PassCheck; - IBOutlet NSButton * fAudioAllowDTSHDPassCheck; - IBOutlet NSButton * fAudioAllowDTSPassCheck; - IBOutlet NSButton * fAudioAllowMP3PassCheck; - IBOutlet NSPopUpButton * fAudioFallbackPopUp; - - - /* Chapters box */ - IBOutlet NSButton * fCreateChapterMarkers; - IBOutlet NSTableView * fChapterTable; - IBOutlet NSButton * fLoadChaptersButton; - IBOutlet NSButton * fSaveChaptersButton; - IBOutlet NSTableColumn * fChapterTableNameColumn; - ChapterTitles * fChapterTitlesDelegate; - + /* Bottom */ IBOutlet NSTextField * fStatusField; IBOutlet NSProgressIndicator * fRipIndicator; @@ -251,7 +186,6 @@ BOOL fIsDragging; IBOutlet HBPresetsOutlineView * fPresetsOutlineView; IBOutlet NSButton * fPresetsAdd; IBOutlet NSButton * fPresetsDelete; - IBOutlet NSPopUpButton * fPresetsActionButton; hb_handle_t * fHandle; @@ -304,11 +238,7 @@ BOOL fIsDragging; - (IBAction) cancelScanning:(id)sender; - (void) updateUI: (NSTimer*) timer; -- (void) enableUI: (bool) enable; -- (IBAction) setupX264PresetsWidgets: (id) sender; -- (void) enableX264Widgets: (bool) enable; -- (IBAction) updateX264Widgets: (id) sender; -- (IBAction) x264PresetsChangedDisplayExpandedOptions: (id) sender; +- (void) enableUI: (BOOL) enable; - (IBAction) encodeStartStopPopUpChanged: (id) sender; @@ -320,28 +250,16 @@ BOOL fIsDragging; - (IBAction) formatPopUpChanged: (id) sender; -- (IBAction) videoEncoderPopUpChanged: (id) sender; - (IBAction) autoSetM4vExtension: (id) sender; -- (IBAction) twoPassCheckboxChanged: (id) sender; -- (IBAction) videoFrameRateChanged: (id) sender; + - (void) prepareJob; - (IBAction) browseFile: (id) sender; - (void) browseFileDone: (NSSavePanel *) sheet returnCode: (int) returnCode contextInfo: (void *) contextInfo; -- (IBAction) videoMatrixChanged: (id) sender; - -- (IBAction) qualitySliderChanged: (id) sender; -- (void) setupQualitySlider; - -- (IBAction) browseImportSrtFile: (id) sender; -- (void) browseImportSrtFileDone: (NSSavePanel *) sheet - returnCode: (int) returnCode contextInfo: (void *) contextInfo; - - (IBAction) showPicturePanel: (id) sender; - (IBAction) showPreviewWindow: (id) sender; - (void)pictureSettingsDidChange; -- (IBAction) calculatePictureSizing: (id) sender; - (IBAction) openMainWindow: (id) sender; /* Text summaries of various settings */ @@ -395,9 +313,6 @@ BOOL fIsDragging; - (void) doCancelCurrentJobAndStop; - (IBAction) Pause: (id) sender; -- (IBAction) calculateBitrate: (id) sender; -- (void) controlTextDidChange: (NSNotification *) notification; - - (IBAction) openHomepage: (id) sender; - (IBAction) openForums: (id) sender; - (IBAction) openUserGuide: (id) sender; @@ -443,8 +358,6 @@ BOOL fIsDragging; - (IBAction) closeAddPresetPanel: (id) sender; - (NSDictionary *)createPreset; -- (IBAction) revertPictureSizeToMax:(id)sender; - - (IBAction)setDefaultPreset:(id)sender; - (IBAction)selectDefaultPreset:(id)sender; - (void) savePreset; @@ -471,17 +384,7 @@ BOOL fIsDragging; - (int) hbInstances; -// Chapter files methods -- (IBAction) browseForChapterFile: (id) sender; -- (void) browseForChapterFileDone: (NSOpenPanel *) sheet - returnCode: (int) returnCode contextInfo: (void *) contextInfo; - -- (IBAction) browseForChapterFileSave: (id) sender; -- (void) browseForChapterFileSaveDone: (NSSavePanel *) sheet - returnCode: (int) returnCode contextInfo: (void *) contextInfo; - + (unsigned int) maximumNumberOfAllowedAudioTracks; -- (IBAction) addAllAudioTracks: (id) sender; // Drag & Drop methods - (void)openFiles:(NSArray*)filenames; @@ -491,19 +394,4 @@ BOOL fIsDragging; - (void) updateDockIcon:(double)progress withETA:(NSString*)etaStr; -// x264 system methods -- (NSString*) x264Preset; -- (NSString*) x264Tune; -- (NSString*) x264OptionExtra; -- (NSString*) h264Profile; -- (NSString*) h264Level; -- (void) setX264Preset: (NSString*) x264Preset; -- (void) setX264Tune: (NSString*) x264Tune; -- (void) setX264OptionExtra: (NSString*) x264OptionExtra; -- (void) setH264Profile: (NSString*) h264Profile; -- (void) setH264Level: (NSString*) h264Level; -- (IBAction) x264PresetsSliderChanged: (id) sender; - - @end - diff --git a/macosx/Controller.m b/macosx/Controller.m index 2986047e8..d86b855cd 100644 --- a/macosx/Controller.m +++ b/macosx/Controller.m @@ -96,7 +96,6 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It outputPanel = [[HBOutputPanelController alloc] init]; fPictureController = [[HBPictureController alloc] init]; fQueueController = [[HBQueueController alloc] init]; - fAdvancedOptions = [[HBAdvancedController alloc] init]; /* we init the HBPresets class which currently is only used * for updating built in presets, may move more functionality * there in the future @@ -125,13 +124,7 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It [iv addSubview:timeField]; [self updateDockIcon:-1.0 withETA:@""]; - - /* - * initialize fX264PresetsUnparsedUTF8String as early as possible - * avoids an invalid free - */ - fX264PresetsUnparsedUTF8String = NULL; - + return self; } @@ -162,7 +155,7 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It // The goal of this check is to know if the application was running before the drag & drop // if fSubtitlesDelegate is set, then applicationDidFinishLaunching was called - if (fSubtitlesDelegate) + if (fSubtitlesViewController) { // Handbrake was already running when the user dropped the file(s) // So we get unstack the first one and launch the scan @@ -216,19 +209,51 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It [fQueueController setHandle: fQueueEncodeLibhb]; [fQueueController setHBController: self]; - fChapterTitlesDelegate = [[ChapterTitles alloc] init]; - [fChapterTable setDataSource:fChapterTitlesDelegate]; - [fChapterTable setDelegate:fChapterTitlesDelegate]; - - /* setup the subtitles delegate and connections to table */ - fSubtitlesDelegate = [[HBSubtitles alloc] init]; - [fSubtitlesTable setDataSource:fSubtitlesDelegate]; - [fSubtitlesTable setDelegate:fSubtitlesDelegate]; - [fSubtitlesTable setRowHeight:25.0]; - - /* setup the audio controller */ - [fAudioDelegate setHBController: self]; + // Set up the chapters title view + fChapterTitlesController = [[HBChapterTitlesController alloc] init]; + [fChaptersTitlesView addSubview: [fChapterTitlesController view]]; + + // make sure we automatically resize the controller's view to the current window size + [[fChapterTitlesController view] setFrame: [fChaptersTitlesView bounds]]; + [[fChapterTitlesController view] setAutoresizingMask:( NSViewWidthSizable | NSViewHeightSizable )]; + + // setup the subtitles view + fSubtitlesViewController = [[HBSubtitlesController alloc] init]; + [fSubtitlesView addSubview: [fSubtitlesViewController view]]; + + // make sure we automatically resize the controller's view to the current window size + [[fSubtitlesViewController view] setFrame: [fSubtitlesView bounds]]; + [[fSubtitlesViewController view] setAutoresizingMask:( NSViewWidthSizable | NSViewHeightSizable )]; + + // setup the audio controller + fAudioController = [[HBAudioController alloc] init]; + [fAudioController setHBController: self]; + [fAudioView addSubview: [fAudioController view]]; + + // make sure we automatically resize the controller's view to the current window size + [[fAudioController view] setFrame: [fAudioView bounds]]; + [[fAudioController view] setAutoresizingMask:( NSViewWidthSizable | NSViewHeightSizable )]; + + // setup the advanced view controller + fAdvancedOptions = [[HBAdvancedController alloc] init]; + [fAdvancedView addSubview: [fAdvancedOptions view]]; + + // make sure we automatically resize the controller's view to the current window size + [[fAudioController view] setFrame: [fAudioView bounds]]; + [[fAudioController view] setAutoresizingMask:( NSViewWidthSizable | NSViewHeightSizable )]; + + // setup the video view controller + fVideoController = [[HBVideoController alloc] init]; + fVideoController.fAdvancedOptions = fAdvancedOptions; + fVideoController.fHBController = self; + [fVideoView addSubview: [fVideoController view]]; + + // make sure we automatically resize the controller's view to the current window size + [[fVideoController view] setFrame: [fVideoView bounds]]; + [[fVideoController view] setAutoresizingMask:( NSViewWidthSizable | NSViewHeightSizable )]; + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(autoSetM4vExtension:) name: HBMixdownChangedNotification object: nil]; + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateMp4Checkboxes:) name: HBVideoEncoderChangedNotification object: nil]; [fPresetsOutlineView setAutosaveName:@"Presets View"]; [fPresetsOutlineView setAutosaveExpandedItems:YES]; @@ -267,9 +292,8 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It } } - - - + + [self enableUI: NO]; /* Call UpdateUI every 1/2 sec */ [[NSRunLoop currentRunLoop] addTimer:[NSTimer @@ -605,9 +629,7 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It { [fWindow center]; [fWindow setExcludedFromWindowsMenu:NO]; - - [fAdvancedOptions setView:fAdvancedView]; - + /* lets setup our presets drawer for drag and drop here */ [fPresetsOutlineView registerForDraggedTypes: [NSArray arrayWithObject:DragDropSimplePboardType] ]; [fPresetsOutlineView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES]; @@ -644,7 +666,7 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It if( [[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultPresetsDrawerShow"] > 0 ) { [fPresetDrawer setDelegate:self]; - NSSize drawerSize = NSSizeFromString( [[NSUserDefaults standardUserDefaults] + NSSize drawerSize = NSSizeFromString( [[NSUserDefaults standardUserDefaults] stringForKey:@"Drawer Size"] ); if( drawerSize.width ) [fPresetDrawer setContentSize: drawerSize]; @@ -683,84 +705,18 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It [fDstFormatPopUp selectItemAtIndex:0]; [self formatPopUpChanged:nil]; - // enable/disable chapter markers as necessary - if ([fCreateChapterMarkers isEnabled] && - [[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultChapterMarkers"]) - { - [fCreateChapterMarkers setState:NSOnState]; - } - else - { - [fCreateChapterMarkers setState:NSOffState]; - } - [fDstFile2Field setStringValue:[NSString stringWithFormat:@"%@/Desktop/Movie.mp4", NSHomeDirectory()]]; - - /* Video encoder */ - [fVidEncoderPopUp removeAllItems]; - [fVidEncoderPopUp addItemWithTitle: @"FFmpeg"]; - - /* setup our x264 presets widgets - this only needs to be done once */ - [self setupX264PresetsWidgets: nil]; - - /* Video quality */ - [fVidBitrateField setIntValue: 1000]; - [fVidQualityMatrix selectCell: fVidBitrateCell]; - [self videoMatrixChanged:nil]; - - /* Video framerate */ - [fVidRatePopUp removeAllItems]; - menuItem = [[fVidRatePopUp menu] addItemWithTitle:@"Same as source" - action:nil - keyEquivalent:@""]; - [menuItem setTag:hb_video_framerate_get_from_name("Same as source")]; - for (const hb_rate_t *video_framerate = hb_video_framerate_get_next(NULL); - video_framerate != NULL; - video_framerate = hb_video_framerate_get_next(video_framerate)) - { - NSString *itemTitle; - if (!strcmp(video_framerate->name, "23.976")) - { - itemTitle = @"23.976 (NTSC Film)"; - } - else if (!strcmp(video_framerate->name, "25")) - { - itemTitle = @"25 (PAL Film/Video)"; - } - else if (!strcmp(video_framerate->name, "29.97")) - { - itemTitle = @"29.97 (NTSC Video)"; - } - else - { - itemTitle = [NSString stringWithUTF8String:video_framerate->name]; - } - menuItem = [[fVidRatePopUp menu] addItemWithTitle:itemTitle - action:nil - keyEquivalent:@""]; - [menuItem setTag:video_framerate->rate]; - } - [fVidRatePopUp selectItemAtIndex:0]; - + /* Set Auto Crop to On at launch */ [fPictureController setAutoCrop:YES]; /* Bottom */ [fStatusField setStringValue: @""]; - [self enableUI: NO]; [self setupToolbar]; - - /* We disable the Turbo 1st pass checkbox since we are not x264 */ - [fVidTurboPassCheck setEnabled: NO]; - [fVidTurboPassCheck setState: NSOffState]; - - /* Auto Passthru advanced options box */ - [fAudioAutoPassthruBox setHidden:NO]; - - + /* lets get our default prefs here */ [self getDefaultPresets:nil]; /* lets initialize the current successful scancount here to 0 */ @@ -770,25 +726,20 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It [fWindow registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; } -- (void) enableUI: (bool) b +- (void) enableUI: (BOOL) b { NSControl * controls[] = { fSrcTitleField, fSrcTitlePopUp, - fSrcChapterField, fSrcChapterStartPopUp, fSrcChapterToField, + fSrcChapterStartPopUp, fSrcChapterToField, fSrcChapterEndPopUp, fSrcDuration1Field, fSrcDuration2Field, fDstFormatField, fDstFormatPopUp, fDstFile1Field, fDstFile2Field, - fDstBrowseButton, fVidRateField, fVidRatePopUp, fVidEncoderField, - fVidEncoderPopUp, fVidQualityField, fVidQualityMatrix, - fPictureSettingsField, fPictureFiltersField, - fSubField, fSubPopUp, fPresetsAdd, fPresetsDelete, fSrcAngleLabel, - fSrcAnglePopUp, fCreateChapterMarkers, fVidTurboPassCheck, - fDstMp4LargeFileCheck, fSubForcedCheck, fPresetsOutlineView, - fDstMp4HttpOptFileCheck, fDstMp4iPodFileCheck, fVidQualityRFField, - fVidQualityRFLabel, fEncodeStartStopPopUp, fSrcTimeStartEncodingField, + fDstBrowseButton, fPresetsAdd, fPresetsDelete, fSrcAngleLabel, + fSrcAnglePopUp, fDstMp4LargeFileCheck, fPresetsOutlineView, + fDstMp4HttpOptFileCheck, fDstMp4iPodFileCheck, + fEncodeStartStopPopUp, fSrcTimeStartEncodingField, fSrcTimeEndEncodingField, fSrcFrameStartEncodingField, - fSrcFrameEndEncodingField, fLoadChaptersButton, fSaveChaptersButton, - fFramerateMatrix, + fSrcFrameEndEncodingField, }; for (unsigned i = 0; i < (sizeof(controls) / sizeof(NSControl*)); i++) @@ -810,16 +761,18 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It if (b) { - /* we also call calculatePictureSizing here to sense check if we already have vfr selected */ - [self calculatePictureSizing:nil]; + /* we also call calculatePictureSizing here to sense check if we already have vfr selected ??? */ + [self pictureSettingsDidChange]; } else { [fPresetsOutlineView setEnabled: NO]; } - - [self videoMatrixChanged:nil]; - [self enableX264Widgets:b]; + + [fVideoController enableUI:b]; + [fChapterTitlesController enableUI:b]; + [fSubtitlesViewController enableUI:b]; + [fAudioController enableUI:b]; } @@ -1240,17 +1193,6 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It [self getQueueStats]; - /* Update the visibility of the Auto Passthru advanced options box */ - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"ShowAdvancedOptsForAutoPassthru"] == YES) - { - [fAudioAutoPassthruBox setHidden:NO]; - } - else - { - [fAudioAutoPassthruBox setHidden:YES]; - } - - // Finally after all UI updates, we look for a next dragDropItem to scan // fWillScan will signal that a scan will be launched, so we need to wait // the next idle cycle after the scan @@ -1935,18 +1877,10 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It BOOL cancelScanDecrypt = 0; NSString *path = scanPath; HBDVDDetector *detector = [HBDVDDetector detectorForPath:path]; - - // Notify ChapterTitles that there's no title - [fChapterTitlesDelegate resetWithTitle:nil]; - [fChapterTable reloadData]; - - // Notify Subtitles that there's no title - [fSubtitlesDelegate resetWithTitle:nil]; - [fSubtitlesTable reloadData]; [fPictureController setTitle:NULL]; - // Notify anyone interested (audio controller) that there's no title + // Notify anyone interested (audio/subtitles/chapters controller) that there's no title [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: HBTitleChangedNotification object: self @@ -2072,19 +2006,11 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It /* We display a message if a valid dvd source was not chosen */ [fSrcDVD2Field setStringValue: @"No Valid Source Found"]; SuccessfulScan = NO; - - // Notify ChapterTitles that there's no title - [fSubtitlesDelegate resetWithTitle:nil]; - [fSubtitlesTable reloadData]; - - // Notify Subtitles that there's no title - [fChapterTitlesDelegate resetWithTitle:nil]; - [fChapterTable reloadData]; // Notify PictureController that there's no title [fPictureController setTitle:NULL]; - // Notify anyone interested (audio controller) that there's no title + // Notify anyone interested (video/audio/subtitles/chapters controller) that there's no title [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: HBTitleChangedNotification object: self @@ -2646,14 +2572,14 @@ fWorkingCount = 0; } else { - [queueFileJob setObject:[NSNumber numberWithInteger:[fCreateChapterMarkers state]] forKey:@"ChapterMarkers"]; + [queueFileJob setObject:@(fChapterTitlesController.createChapterMarkers) forKey:@"ChapterMarkers"]; } /* We need to get the list of chapter names to put into an array and store * in our queue, so they can be reapplied in prepareJob when this queue * item comes up if Chapter Markers is set to on. */ - [queueFileJob setObject:[fChapterTitlesDelegate chapterTitlesArray] forKey:@"ChapterNames"]; + [queueFileJob setObject:fChapterTitlesController.chapterTitlesArray forKey:@"ChapterNames"]; /* Allow Mpeg4 64 bit formatting +4GB file sizes */ [queueFileJob setObject:[NSNumber numberWithInteger:[fDstMp4LargeFileCheck state]] forKey:@"Mp4LargeFile"]; @@ -2664,58 +2590,8 @@ fWorkingCount = 0; /* Codecs */ /* Video encoder */ - [queueFileJob setObject:[fVidEncoderPopUp titleOfSelectedItem] forKey:@"VideoEncoder"]; - - /* x264 advanced options */ - if ([fX264UseAdvancedOptionsCheck state]) - { - // we are using the advanced panel - [queueFileJob setObject:[NSNumber numberWithInt:1] forKey: @"x264UseAdvancedOptions"]; - [queueFileJob setObject:[fAdvancedOptions optionsString] forKey:@"x264Option"]; - } - else - { - // we are using the x264 preset system - [queueFileJob setObject:[NSNumber numberWithInt:0] forKey: @"x264UseAdvancedOptions"]; - [queueFileJob setObject:[self x264Preset] forKey: @"x264Preset"]; - [queueFileJob setObject:[self x264Tune] forKey: @"x264Tune"]; - [queueFileJob setObject:[self x264OptionExtra] forKey: @"x264OptionExtra"]; - [queueFileJob setObject:[self h264Profile] forKey: @"h264Profile"]; - [queueFileJob setObject:[self h264Level] forKey: @"h264Level"]; - } - - /* FFmpeg (lavc) Option String */ - [queueFileJob setObject:[fAdvancedOptions optionsStringLavc] forKey:@"lavcOption"]; + [fVideoController prepareVideoForQueueFileJob:queueFileJob]; - [queueFileJob setObject:[NSNumber numberWithInteger:[[fVidQualityMatrix selectedCell] tag] + 1] forKey:@"VideoQualityType"]; - [queueFileJob setObject:[fVidBitrateField stringValue] forKey:@"VideoAvgBitrate"]; - [queueFileJob setObject:[NSNumber numberWithFloat:[fVidQualityRFField floatValue]] forKey:@"VideoQualitySlider"]; - /* Framerate */ - [queueFileJob setObject:[fVidRatePopUp titleOfSelectedItem] forKey:@"VideoFramerate"]; - /* Frame Rate Mode */ - if ([fFramerateMatrix selectedRow] == 1) // if selected we are cfr regardless of the frame rate popup - { - [queueFileJob setObject:@"cfr" forKey:@"VideoFramerateMode"]; - } - else - { - if ([fVidRatePopUp indexOfSelectedItem] == 0) // Same as source frame rate - { - [queueFileJob setObject:@"vfr" forKey:@"VideoFramerateMode"]; - } - else - { - [queueFileJob setObject:@"pfr" forKey:@"VideoFramerateMode"]; - } - - } - - - /* 2 Pass Encoding */ - [queueFileJob setObject:[NSNumber numberWithInteger:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"]; - /* Turbo 2 pass Encoding fVidTurboPassCheck*/ - [queueFileJob setObject:[NSNumber numberWithInteger:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"]; - /* Picture Sizing */ /* Use Max Picture settings for whatever the dvd is.*/ [queueFileJob setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"]; @@ -2761,21 +2637,21 @@ fWorkingCount = 0; [queueFileJob setObject:[NSNumber numberWithInteger:[fPictureController grayscale]] forKey:@"VideoGrayScale"]; /* Auto Passthru */ - [queueFileJob setObject:[NSNumber numberWithInteger:[fAudioAllowAACPassCheck state]] forKey: @"AudioAllowAACPass"]; - [queueFileJob setObject:[NSNumber numberWithInteger:[fAudioAllowAC3PassCheck state]] forKey: @"AudioAllowAC3Pass"]; - [queueFileJob setObject:[NSNumber numberWithInteger:[fAudioAllowDTSHDPassCheck state]] forKey: @"AudioAllowDTSHDPass"]; - [queueFileJob setObject:[NSNumber numberWithInteger:[fAudioAllowDTSPassCheck state]] forKey: @"AudioAllowDTSPass"]; - [queueFileJob setObject:[NSNumber numberWithInteger:[fAudioAllowMP3PassCheck state]] forKey: @"AudioAllowMP3Pass"]; + [queueFileJob setObject:@(fAudioController.allowAACPassCheck) forKey: @"AudioAllowAACPass"]; + [queueFileJob setObject:@(fAudioController.allowAC3PassCheck) forKey: @"AudioAllowAC3Pass"]; + [queueFileJob setObject:@(fAudioController.allowDTSHDPassCheck) forKey: @"AudioAllowDTSHDPass"]; + [queueFileJob setObject:@(fAudioController.allowDTSPassCheck) forKey: @"AudioAllowDTSPass"]; + [queueFileJob setObject:@(fAudioController.allowMP3PassCheck) forKey: @"AudioAllowMP3Pass"]; // just in case we need it for display purposes - [queueFileJob setObject:[fAudioFallbackPopUp titleOfSelectedItem] forKey: @"AudioEncoderFallback"]; + [queueFileJob setObject:fAudioController.audioEncoderFallback forKey: @"AudioEncoderFallback"]; // actual fallback encoder - [queueFileJob setObject:[NSNumber numberWithInteger:[[fAudioFallbackPopUp selectedItem] tag]] forKey: @"JobAudioEncoderFallback"]; + [queueFileJob setObject:@(fAudioController.audioEncoderFallbackTag) forKey: @"JobAudioEncoderFallback"]; /* Audio */ - [fAudioDelegate prepareAudioForQueueFileJob: queueFileJob]; + [fAudioController prepareAudioForQueueFileJob: queueFileJob]; /* Subtitles */ - NSMutableArray *subtitlesArray = [[NSMutableArray alloc] initWithArray:[fSubtitlesDelegate getSubtitleArray] copyItems:YES]; + NSMutableArray *subtitlesArray = [[NSMutableArray alloc] initWithArray:[fSubtitlesViewController subtitleArray] copyItems:YES]; [queueFileJob setObject:[NSArray arrayWithArray: subtitlesArray] forKey:@"SubtitleList"]; [subtitlesArray autorelease]; @@ -2789,11 +2665,7 @@ fWorkingCount = 0; [queueFileJob setObject:[NSNumber numberWithInteger:[[fDstFormatPopUp selectedItem] tag]] forKey:@"JobFileFormatMux"]; /* Codecs */ - /* Video encoder */ - [queueFileJob setObject:[NSNumber numberWithInteger:[[fVidEncoderPopUp selectedItem] tag]] forKey:@"JobVideoEncoderVcodec"]; - /* Framerate */ - [queueFileJob setObject:[NSNumber numberWithInteger:[fVidRatePopUp indexOfSelectedItem]] forKey:@"JobIndexVideoFramerate"]; [queueFileJob setObject:[NSNumber numberWithInt:title->rate] forKey:@"JobVrate"]; [queueFileJob setObject:[NSNumber numberWithInt:title->rate_base] forKey:@"JobVrateBase"]; @@ -3051,127 +2923,35 @@ fWorkingCount = 0; [self formatPopUpChanged:nil]; /* Chapter Markers*/ - [fCreateChapterMarkers setState:[[queueToApply objectForKey:@"ChapterMarkers"] intValue]]; + fChapterTitlesController.createChapterMarkers = [[queueToApply objectForKey:@"ChapterMarkers"] boolValue]; + [fChapterTitlesController addChaptersFromQueue:[queueToApply objectForKey:@"ChapterNames"]]; + /* Allow Mpeg4 64 bit formatting +4GB file sizes */ [fDstMp4LargeFileCheck setState:[[queueToApply objectForKey:@"Mp4LargeFile"] intValue]]; /* Mux mp4 with http optimization */ [fDstMp4HttpOptFileCheck setState:[[queueToApply objectForKey:@"Mp4HttpOptimize"] intValue]]; - - /* video encoder */ - [fVidEncoderPopUp selectItemWithTitle:[queueToApply objectForKey:@"VideoEncoder"]]; - [fAdvancedOptions setLavcOptions: [queueToApply objectForKey:@"lavcOption"]]; - /* advanced x264 options */ - if ([[queueToApply objectForKey:@"x264UseAdvancedOptions"] intValue]) - { - // we are using the advanced panel - [fAdvancedOptions setOptions:[queueToApply objectForKey:@"x264Option"]]; - // preset does not use the x264 preset system, reset the widgets - [self setX264Preset: nil]; - [self setX264Tune: nil]; - [self setX264OptionExtra:[queueToApply objectForKey:@"x264Option"]]; - [self setH264Profile: nil]; - [self setH264Level: nil]; - // enable the advanced panel and update the widgets - [fX264UseAdvancedOptionsCheck setState:NSOnState]; - [self updateX264Widgets:nil]; - } - else - { - // we are using the x264 preset system - [self setX264Preset: [queueToApply objectForKey:@"x264Preset"]]; - [self setX264Tune: [queueToApply objectForKey:@"x264Tune"]]; - [self setX264OptionExtra:[queueToApply objectForKey:@"x264OptionExtra"]]; - [self setH264Profile: [queueToApply objectForKey:@"h264Profile"]]; - [self setH264Level: [queueToApply objectForKey:@"h264Level"]]; - // preset does not use the advanced panel, reset it - [fAdvancedOptions setOptions:@""]; - // disable the advanced panel and update the widgets - [fX264UseAdvancedOptionsCheck setState:NSOffState]; - [self updateX264Widgets:nil]; - } - - /* Lets run through the following functions to get variables set there */ - [self videoEncoderPopUpChanged:nil]; + /* Set the state of ipod compatible with Mp4iPodCompatible. Only for x264*/ [fDstMp4iPodFileCheck setState:[[queueToApply objectForKey:@"Mp4iPodCompatible"] intValue]]; - [self calculateBitrate:nil]; - - /* Video quality */ - [fVidQualityMatrix selectCellAtRow:[[queueToApply objectForKey:@"VideoQualityType"] intValue] column:0]; - - [fVidBitrateField setStringValue:[queueToApply objectForKey:@"VideoAvgBitrate"]]; - - int direction; - float minValue, maxValue, granularity; - hb_video_quality_get_limits((int)[[fVidEncoderPopUp selectedItem] tag], - &minValue, &maxValue, &granularity, &direction); - if (!direction) - { - [fVidQualitySlider setFloatValue:[[queueToApply objectForKey:@"VideoQualitySlider"] floatValue]]; - } - else - { - /* - * Since ffmpeg and x264 use an "inverted" slider (lower values - * indicate a higher quality) we invert the value on the slider - */ - [fVidQualitySlider setFloatValue:([fVidQualitySlider minValue] + - [fVidQualitySlider maxValue] - - [[queueToApply objectForKey:@"VideoQualitySlider"] floatValue])]; - } - - [self videoMatrixChanged:nil]; - - /* Video framerate */ - if ([[queueToApply objectForKey:@"VideoFramerate"] isEqualToString:@"Same as source"]) - { - /* Now set the Video Frame Rate Mode to either vfr or cfr according to the preset */ - if ([[queueToApply objectForKey:@"VideoFramerateMode"] isEqualToString:@"vfr"]) - { - [fFramerateMatrix selectCellAtRow:0 column:0]; // we want vfr - } - else - { - [fFramerateMatrix selectCellAtRow:1 column:0]; // we want cfr - } - } - else - { - /* Now set the Video Frame Rate Mode to either pfr or cfr according to the preset */ - if ([[queueToApply objectForKey:@"VideoFramerateMode"] isEqualToString:@"pfr"]) - { - [fFramerateMatrix selectCellAtRow:0 column:0]; // we want pfr - } - else - { - [fFramerateMatrix selectCellAtRow:1 column:0]; // we want cfr - } - } - [fVidRatePopUp selectItemWithTitle:[queueToApply objectForKey:@"VideoFramerate"]]; - [self videoFrameRateChanged:nil]; - - /* 2 Pass Encoding */ - [fVidTwoPassCheck setState:[[queueToApply objectForKey:@"VideoTwoPass"] intValue]]; - [self twoPassCheckboxChanged:nil]; - /* Turbo 1st pass for 2 Pass Encoding */ - [fVidTurboPassCheck setState:[[queueToApply objectForKey:@"VideoTurboTwoPass"] intValue]]; - + + /* video encoder */ + [fVideoController applyVideoSettingsFromQueue:queueToApply]; + /* Auto Passthru */ - [fAudioAllowAACPassCheck setState:[[queueToApply objectForKey:@"AudioAllowAACPass"] intValue]]; - [fAudioAllowAC3PassCheck setState:[[queueToApply objectForKey:@"AudioAllowAC3Pass"] intValue]]; - [fAudioAllowDTSHDPassCheck setState:[[queueToApply objectForKey:@"AudioAllowDTSHDPass"] intValue]]; - [fAudioAllowDTSPassCheck setState:[[queueToApply objectForKey:@"AudioAllowDTSPass"] intValue]]; - [fAudioAllowMP3PassCheck setState:[[queueToApply objectForKey:@"AudioAllowMP3Pass"] intValue]]; - [fAudioFallbackPopUp selectItemWithTitle:[queueToApply objectForKey:@"AudioEncoderFallback"]]; - + fAudioController.allowAACPassCheck = [[queueToApply objectForKey:@"AudioAllowAACPass"] boolValue]; + fAudioController.allowAC3PassCheck = [[queueToApply objectForKey:@"AudioAllowAC3Pass"] boolValue]; + fAudioController.allowDTSHDPassCheck = [[queueToApply objectForKey:@"AudioAllowDTSHDPass"] boolValue]; + fAudioController.allowDTSPassCheck = [[queueToApply objectForKey:@"AudioAllowDTSPass"] boolValue]; + fAudioController.allowMP3PassCheck = [[queueToApply objectForKey:@"AudioAllowMP3Pass"] boolValue]; + fAudioController.audioEncoderFallback = [queueToApply objectForKey:@"AudioEncoderFallback"]; + /* Audio */ /* Now lets add our new tracks to the audio list here */ - [fAudioDelegate addTracksFromQueue: queueToApply]; + [fAudioController addTracksFromQueue: queueToApply]; - /*Subtitles*/ - /* Crashy crashy right now, working on it */ - [fSubtitlesDelegate setNewSubtitles:[queueToApply objectForKey:@"SubtitleList"]]; - [fSubtitlesTable reloadData]; + /* Subtitles */ + [fSubtitlesViewController addTracksFromQueue:[queueToApply objectForKey:@"SubtitleList"]]; + /* Picture Settings */ /* If Cropping is set to custom, then recall all four crop values from @@ -3296,7 +3076,7 @@ fWorkingCount = 0; /* we call SetTitle: in fPictureController so we get an instant update in the Picture Settings window */ [fPictureController setTitle:fTitle]; - [self calculatePictureSizing:nil]; + [self pictureSettingsDidChange]; /* somehow we need to figure out a way to tie the queue item to a preset if it used one */ //[queueFileJob setObject:[fPresetSelectedDisplay stringValue] forKey:@"PresetName"]; @@ -3350,115 +3130,12 @@ fWorkingCount = 0; /* Format (Muxer) and Video Encoder */ job->mux = (int)[[fDstFormatPopUp selectedItem] tag]; - job->vcodec = (int)[[fVidEncoderPopUp selectedItem] tag]; - job->fastfirstpass = 0; - - job->chapter_markers = 0; - - if (job->vcodec == HB_VCODEC_X264) - { - /* advanced x264 options */ - NSString *tmpString; - // translate zero-length strings to NULL for libhb - const char *encoder_preset = NULL; - const char *encoder_tune = NULL; - const char *encoder_options = NULL; - const char *encoder_profile = NULL; - const char *encoder_level = NULL; - if ([fX264UseAdvancedOptionsCheck state]) - { - // we are using the advanced panel - if ([(tmpString = [fAdvancedOptions optionsString]) length]) - { - encoder_options = [tmpString UTF8String]; - } - } - else - { - // we are using the x264 preset system - if ([(tmpString = [self x264Tune]) length]) - { - encoder_tune = [tmpString UTF8String]; - } - if ([(tmpString = [self x264OptionExtra]) length]) - { - encoder_options = [tmpString UTF8String]; - } - if ([(tmpString = [self h264Profile]) length]) - { - encoder_profile = [tmpString UTF8String]; - } - if ([(tmpString = [self h264Level]) length]) - { - encoder_level = [tmpString UTF8String]; - } - encoder_preset = [[self x264Preset] UTF8String]; - } - hb_job_set_encoder_preset (job, encoder_preset); - hb_job_set_encoder_tune (job, encoder_tune); - hb_job_set_encoder_options(job, encoder_options); - hb_job_set_encoder_profile(job, encoder_profile); - hb_job_set_encoder_level (job, encoder_level); - } - else if (job->vcodec & HB_VCODEC_FFMPEG_MASK) - { - hb_job_set_encoder_options(job, - [[fAdvancedOptions optionsStringLavc] - UTF8String]); - } - - /* Video settings */ - int fps_mode, fps_num, fps_den; - if( [fVidRatePopUp indexOfSelectedItem] > 0 ) - { - /* a specific framerate has been chosen */ - fps_num = 27000000; - fps_den = (int)[[fVidRatePopUp selectedItem] tag]; - if ([fFramerateMatrix selectedRow] == 1) - { - // CFR - fps_mode = 1; - } - else - { - // PFR - fps_mode = 2; - } - } - else - { - /* same as source */ - fps_num = title->rate; - fps_den = title->rate_base; - if ([fFramerateMatrix selectedRow] == 1) - { - // CFR - fps_mode = 1; - } - else - { - // VFR - fps_mode = 0; - } - } - switch( [[fVidQualityMatrix selectedCell] tag] ) - { - case 0: - /* ABR */ - job->vquality = -1.0; - job->vbitrate = [fVidBitrateField intValue]; - break; - case 1: - /* Constant Quality */ - job->vquality = [fVidQualityRFField floatValue]; - job->vbitrate = 0; - break; - } + /* Video Encoder */ + [fVideoController prepareVideoForJobPreview:job andTitle:title]; /* Subtitle settings */ - NSMutableArray *subtitlesArray = [[NSMutableArray alloc] initWithArray:[fSubtitlesDelegate getSubtitleArray] copyItems:YES]; - + NSMutableArray *subtitlesArray = [[NSMutableArray alloc] initWithArray:fSubtitlesViewController.subtitleArray copyItems:YES]; int subtitle; int force; @@ -3602,30 +3279,30 @@ bool one_burned = FALSE; /* Auto Passthru */ job->acodec_copy_mask = 0; - if ([fAudioAllowAACPassCheck state] == NSOnState) + if (fAudioController.allowAACPassCheck) { job->acodec_copy_mask |= HB_ACODEC_FFAAC; } - if ([fAudioAllowAC3PassCheck state] == NSOnState) + if (fAudioController.allowAC3PassCheck) { job->acodec_copy_mask |= HB_ACODEC_AC3; } - if ([fAudioAllowDTSHDPassCheck state] == NSOnState) + if (fAudioController.allowDTSHDPassCheck) { job->acodec_copy_mask |= HB_ACODEC_DCA_HD; } - if ([fAudioAllowDTSPassCheck state] == NSOnState) + if (fAudioController.allowDTSPassCheck) { job->acodec_copy_mask |= HB_ACODEC_DCA; } - if ([fAudioAllowMP3PassCheck state] == NSOnState) + if (fAudioController.allowMP3PassCheck) { job->acodec_copy_mask |= HB_ACODEC_MP3; } - job->acodec_fallback = (int)[[fAudioFallbackPopUp selectedItem] tag]; + job->acodec_fallback = (int)fAudioController.audioEncoderFallbackTag; /* Audio tracks and mixdowns */ - [fAudioDelegate prepareAudioForJob: job]; + [fAudioController prepareAudioForJobPreview: job]; @@ -3759,11 +3436,6 @@ bool one_burned = FALSE; job->width,job->height, job->crop[0], job->crop[1], job->crop[2], job->crop[3]] UTF8String] ); - - /* Add framerate shaping filter */ - filter = hb_filter_init(HB_FILTER_VFR); - hb_add_filter(job, filter, [[NSString stringWithFormat:@"%d:%d:%d", - fps_mode, fps_num, fps_den] UTF8String]); } @@ -3967,7 +3639,7 @@ bool one_burned = FALSE; { /* a specific framerate has been chosen */ fps_num = 27000000; - fps_den = (int)[[fVidRatePopUp itemAtIndex:[[queueToApply objectForKey:@"JobIndexVideoFramerate"] intValue]] tag]; + fps_den = (int)[[queueToApply objectForKey:@"JobIndexVideoFramerate"] intValue]; if ([[queueToApply objectForKey:@"VideoFramerateMode"] isEqualToString:@"cfr"]) { // CFR @@ -4323,7 +3995,7 @@ bool one_burned = FALSE; hb_add_filter(job, filter, [[NSString stringWithFormat:@"%d:%d:%d", fps_mode, fps_num, fps_den] UTF8String]); -[self writeToActivityLog: "prepareJob exiting"]; + [self writeToActivityLog: "prepareJob exiting"]; } @@ -4745,9 +4417,9 @@ bool one_burned = FALSE; NSString *fileName = [HBUtilities automaticNameForSource:[browsedSourceDisplayName stringByDeletingPathExtension] title: title->index chapters:NSMakeRange([fSrcChapterStartPopUp indexOfSelectedItem] + 1, [fSrcChapterEndPopUp indexOfSelectedItem] + 1) - quality:[[fVidQualityMatrix selectedCell] tag] ? [fVidQualityRFField stringValue] : nil - bitrate:![[fVidQualityMatrix selectedCell] tag] ? [fVidBitrateField stringValue] : nil - videoCodec:(int)[[fVidEncoderPopUp selectedItem] tag]]; + quality:fVideoController.selectedQualityType ? fVideoController.selectedQuality : 0 + bitrate:!fVideoController.selectedQualityType ? fVideoController.selectedBitrate : 0 + videoCodec:fVideoController.selectedCodec]; // Swap the old one with the new one [fDstFile2Field setStringValue: [NSString stringWithFormat:@"%@/%@.%@", @@ -4830,30 +4502,18 @@ bool one_burned = FALSE; /* We get the originial output picture width and height and put them in variables for use with some presets later on */ - PicOrigOutputWidth = title->width; - PicOrigOutputHeight = title->height; AutoCropTop = title->crop[0]; AutoCropBottom = title->crop[1]; AutoCropLeft = title->crop[2]; AutoCropRight = title->crop[3]; - /* Update Subtitle Table */ - [fSubtitlesDelegate resetWithTitle:title]; - [fSubtitlesTable reloadData]; - - - /* Update chapter table */ - [fChapterTitlesDelegate resetWithTitle:title]; - [fChapterTable reloadData]; - - /* Update audio table */ + /* Update the others views */ [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: HBTitleChangedNotification object: self userInfo: [NSDictionary dictionaryWithObjectsAndKeys: [NSData dataWithBytesNoCopy: &fTitle length: sizeof(fTitle) freeWhenDone: NO], keyTitleTag, nil]]]; - [fVidRatePopUp selectItemAtIndex: 0]; /* If Auto Naming is on. We create an output filename of dvd name - title number */ if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"]) @@ -4942,9 +4602,7 @@ bool one_burned = FALSE; [fSrcDuration2Field setStringValue: [NSString stringWithFormat: @"%02lld:%02lld:%02lld", duration / 3600, ( duration / 60 ) % 60, duration % 60]]; - - //[self calculateBitrate: sender]; - + /* We're changing the chapter range - we may need to flip the m4v/mp4 extension */ if ([[fDstFormatPopUp selectedItem] tag] & HB_MUX_MASK_MP4) { @@ -4965,9 +4623,6 @@ bool one_burned = FALSE; [fSrcDuration2Field setStringValue: [NSString stringWithFormat: @"%02d:%02d:%02d", duration / 3600, ( duration / 60 ) % 60, duration % 60]]; - - //[self calculateBitrate: sender]; - } - (IBAction) startEndFrameValueChanged: (id) sender @@ -4980,87 +4635,20 @@ bool one_burned = FALSE; [fSrcDuration2Field setStringValue: [NSString stringWithFormat: @"%02d:%02d:%02d", duration / 3600, ( duration / 60 ) % 60, duration % 60]]; - - //[self calculateBitrate: sender]; } - - (IBAction) formatPopUpChanged: (id) sender { NSString *string = [fDstFile2Field stringValue]; int videoContainer = (int)[[fDstFormatPopUp selectedItem] tag]; const char *ext = NULL; - NSMenuItem *menuItem; + /* Initially set the large file (64 bit formatting) output checkbox to hidden */ [fDstMp4LargeFileCheck setHidden:YES]; [fDstMp4HttpOptFileCheck setHidden:YES]; [fDstMp4iPodFileCheck setHidden:YES]; - - /* Update the Video Codec Popup */ - /* lets get the tag of the currently selected item first so we might reset it later */ - int selectedVidEncoderTag = (int)[[fVidEncoderPopUp selectedItem] tag]; - - /* Note: we now store the video encoder int values from common.c in the tags of each popup for easy retrieval later */ - [fVidEncoderPopUp removeAllItems]; - for (const hb_encoder_t *video_encoder = hb_video_encoder_get_next(NULL); - video_encoder != NULL; - video_encoder = hb_video_encoder_get_next(video_encoder)) - { - if (video_encoder->muxers & videoContainer) - { - menuItem = [[fVidEncoderPopUp menu] addItemWithTitle:[NSString stringWithUTF8String:video_encoder->name] - action:nil - keyEquivalent:@""]; - [menuItem setTag:video_encoder->codec]; - } - } - - /* - * item 0 will be selected by default - * deselect it so that we can detect whether the video encoder has changed - */ - [fVidEncoderPopUp selectItem:nil]; - if (selectedVidEncoderTag) - { - // if we have a tag for previously selected encoder, try to select it - // if this fails, [fVidEncoderPopUp selectedItem] will be nil - // we'll handle that scenario further down - [fVidEncoderPopUp selectItemWithTag:selectedVidEncoderTag]; - } - - /* Update the Auto Passtgru Fallback Codec Popup */ - /* lets get the tag of the currently selected item first so we might reset it later */ - int selectedAutoPassthruFallbackEncoderTag = (int)[[fAudioFallbackPopUp selectedItem] tag]; - - [fAudioFallbackPopUp removeAllItems]; - for (const hb_encoder_t *audio_encoder = hb_audio_encoder_get_next(NULL); - audio_encoder != NULL; - audio_encoder = hb_audio_encoder_get_next(audio_encoder)) - { - if ((audio_encoder->codec & HB_ACODEC_PASS_FLAG) == 0 && - (audio_encoder->muxers & videoContainer)) - { - menuItem = [[fAudioFallbackPopUp menu] addItemWithTitle:[NSString stringWithUTF8String:audio_encoder->name] - action:nil - keyEquivalent:@""]; - [menuItem setTag:audio_encoder->codec]; - } - } - - /* if we have a previously selected auto passthru fallback encoder tag, then try to select it */ - if (selectedAutoPassthruFallbackEncoderTag) - { - selectedAutoPassthruFallbackEncoderTag = [fAudioFallbackPopUp selectItemWithTag:selectedAutoPassthruFallbackEncoderTag]; - } - /* if we had no previous fallback selected OR if selection failed - * select the default fallback encoder (AC3) */ - if (!selectedAutoPassthruFallbackEncoderTag) - { - [fAudioFallbackPopUp selectItemWithTag:HB_ACODEC_AC3]; - } - + // enable chapter markers and hide muxer-specific options - [fCreateChapterMarkers setEnabled:YES]; [fDstMp4LargeFileCheck setHidden:YES]; [fDstMp4HttpOptFileCheck setHidden:YES]; [fDstMp4iPodFileCheck setHidden:YES]; @@ -5085,11 +4673,7 @@ bool one_burned = FALSE; { [self autoSetM4vExtension:sender]; } - - /* tell fSubtitlesDelegate we have a new video container */ - [fSubtitlesDelegate containerChanged:videoContainer]; - [fSubtitlesTable reloadData]; - + /* post a notification for any interested observers to indicate that our video container has changed */ [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName:HBContainerChangedNotification @@ -5098,28 +4682,19 @@ bool one_burned = FALSE; [NSNumber numberWithInt:videoContainer], keyContainerTag, nil]]]; - if (SuccessfulScan) - { - if ([fVidEncoderPopUp selectedItem] == nil) - { - /* this means the above call to selectItemWithTag failed */ - [fVidEncoderPopUp selectItemAtIndex:0]; - [self videoEncoderPopUpChanged:nil]; - } - } [self customSettingUsed:sender]; } -- (IBAction) autoSetM4vExtension: (id) sender +- (void) autoSetM4vExtension:(NSNotification *)notification { if (!([[fDstFormatPopUp selectedItem] tag] & HB_MUX_MASK_MP4)) return; NSString * extension = @"mp4"; - BOOL anyCodecAC3 = [fAudioDelegate anyCodecMatches: HB_ACODEC_AC3] || [fAudioDelegate anyCodecMatches: HB_ACODEC_AC3_PASS]; + BOOL anyCodecAC3 = [fAudioController anyCodecMatches: HB_ACODEC_AC3] || [fAudioController anyCodecMatches: HB_ACODEC_AC3_PASS]; /* Chapter markers are enabled if the checkbox is ticked and we are doing p2p or we have > 1 chapter */ - BOOL chapterMarkers = ([fCreateChapterMarkers state] == NSOnState) && + BOOL chapterMarkers = (fChapterTitlesController.createChapterMarkers) && ([fEncodeStartStopPopUp indexOfSelectedItem] != 0 || [fSrcChapterStartPopUp indexOfSelectedItem] < [fSrcChapterEndPopUp indexOfSelectedItem]); @@ -5137,68 +4712,13 @@ bool one_burned = FALSE; [[fDstFile2Field stringValue] stringByDeletingPathExtension], extension]]; } -/* 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]) - { - /* Deselect the currently selected Preset if there is one*/ - [fPresetsOutlineView deselectRow:[fPresetsOutlineView selectedRow]]; - /* Change UI to show "Custom" settings are being used */ - [fPresetSelectedDisplay setStringValue: @"Custom"]; - } -[self calculateBitrate:nil]; -} - - -#pragma mark - -#pragma mark - Video - -- (IBAction) videoEncoderPopUpChanged: (id) sender +- (void)updateMp4Checkboxes:(NSNotification *)notification { - /* if no valid encoder is selected, use the first one */ - if ([fVidEncoderPopUp selectedItem] == nil) - { - [fVidEncoderPopUp selectItemAtIndex:0]; - } - - int videoEncoder = (int)[[fVidEncoderPopUp selectedItem] tag]; - - [fAdvancedOptions setHidden:YES]; - /* If we are using x264 then show the x264 advanced panel and the x264 presets box */ - if (videoEncoder == HB_VCODEC_X264) - { - [fAdvancedOptions setHidden:NO]; - - // show the x264 presets box - [fX264PresetsBox setHidden:NO]; - - [self autoSetM4vExtension: sender]; - } - else // we are FFmpeg (lavc) or Theora - { - [fAdvancedOptions setHidden:YES]; - [fX264PresetsBox setHidden:YES]; - - // We Are Lavc - if ([[fVidEncoderPopUp selectedItem] tag] & HB_VCODEC_FFMPEG_MASK) - { - [fAdvancedOptions setLavcOptsEnabled:YES]; - } - else /// We are Theora - { - [fAdvancedOptions setLavcOptsEnabled:NO]; - } - } - - - if (videoEncoder != HB_VCODEC_X264) + if (fVideoController.selectedCodec != HB_VCODEC_X264) { /* We set the iPod atom checkbox to disabled and uncheck it as its only for x264 in the mp4 * container. Format is taken care of in formatPopUpChanged method by hiding and unchecking - * anything other than MP4. */ + * anything other than MP4. */ [fDstMp4iPodFileCheck setEnabled: NO]; [fDstMp4iPodFileCheck setState: NSOffState]; } @@ -5206,197 +4726,20 @@ the user is using "Custom" settings by determining the sender*/ { [fDstMp4iPodFileCheck setEnabled: YES]; } - [self setupQualitySlider]; - [self calculatePictureSizing: sender]; - [self twoPassCheckboxChanged: sender]; } - -- (IBAction) twoPassCheckboxChanged: (id) 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 { - /* check to see if x264 is chosen */ - if([[fVidEncoderPopUp selectedItem] tag] == HB_VCODEC_X264) - { - if( [fVidTwoPassCheck state] == NSOnState) - { - [fVidTurboPassCheck setHidden: NO]; - } - else - { - [fVidTurboPassCheck setHidden: YES]; - [fVidTurboPassCheck setState: NSOffState]; - } - /* Make sure Two Pass is checked if Turbo is checked */ - if( [fVidTurboPassCheck state] == NSOnState) - { - [fVidTwoPassCheck setState: NSOnState]; - } - } - else + if ([sender stringValue]) { - [fVidTurboPassCheck setHidden: YES]; - [fVidTurboPassCheck setState: NSOffState]; + /* Deselect the currently selected Preset if there is one*/ + [fPresetsOutlineView deselectRow:[fPresetsOutlineView selectedRow]]; + /* Change UI to show "Custom" settings are being used */ + [fPresetSelectedDisplay setStringValue: @"Custom"]; } - - /* We call method method to change UI to reflect whether a preset is used or not*/ - [self customSettingUsed: sender]; -} - -- (IBAction ) videoFrameRateChanged: (id) sender -{ - /* if no valid framerate is selected, use "Same as source" */ - if ([fVidRatePopUp selectedItem] == nil) - { - [fVidRatePopUp selectItemAtIndex:0]; - } - - /* Hide and set the PFR Checkbox to OFF if we are set to Same as Source */ - /* Depending on whether or not Same as source is selected modify the title for - * fFramerateVfrPfrCell*/ - if ([fVidRatePopUp indexOfSelectedItem] == 0) // We are Same as Source - { - [fFramerateVfrPfrCell setTitle:@"Variable Framerate"]; - } - else - { - [fFramerateVfrPfrCell setTitle:@"Peak Framerate (VFR)"]; - - - } - - /* We call method method to calculatePictureSizing to error check detelecine*/ - [self calculatePictureSizing: sender]; - - /* We call method method to change UI to reflect whether a preset is used or not*/ - [self customSettingUsed: sender]; -} - -- (IBAction) videoMatrixChanged: (id) sender; -{ - /* We use the selectedCell: tag of the fVidQualityMatrix instead of selectedRow - * so that the order of the video controls can be switched around. - * Constant quality is 1 and Average bitrate is 0 for reference. */ - bool bitrate, quality; - bitrate = quality = false; - if( [fVidQualityMatrix isEnabled] ) - { - switch( [[fVidQualityMatrix selectedCell] tag] ) - { - case 0: - bitrate = true; - break; - case 1: - quality = true; - break; - } - } - - [fVidBitrateField setEnabled: bitrate]; - [fVidQualitySlider setEnabled: quality]; - [fVidQualityRFField setEnabled: quality]; - [fVidQualityRFLabel 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]; -} - -/* Use this method to setup the quality slider for cq/rf values depending on - * the video encoder selected. - */ -- (void) setupQualitySlider -{ - /* - * Get the current slider maxValue to check for a change in slider scale - * later so that we can choose a new similar value on the new slider scale - */ - float previousMaxValue = [fVidQualitySlider maxValue]; - float previousPercentOfSliderScale = ([fVidQualitySlider floatValue] / - ([fVidQualitySlider maxValue] - - [fVidQualitySlider minValue] + 1)); - [fVidQualityRFLabel setStringValue:[NSString stringWithFormat:@"%s", - hb_video_quality_get_name((int)[[fVidEncoderPopUp - selectedItem] tag])]]; - int direction; - float minValue, maxValue, granularity; - hb_video_quality_get_limits((int)[[fVidEncoderPopUp selectedItem] tag], - &minValue, &maxValue, &granularity, &direction); - if (granularity < 1.0f) - { - /* - * Encoders that allow fractional CQ values often have a low granularity - * which makes the slider hard to use, so use a value from preferences. - */ - granularity = [[NSUserDefaults standardUserDefaults] - floatForKey:@"x264CqSliderFractional"]; - } - [fVidQualitySlider setMinValue:minValue]; - [fVidQualitySlider setMaxValue:maxValue]; - [fVidQualitySlider setNumberOfTickMarks:((maxValue - minValue) * - (1.0f / granularity)) + 1]; - - /* check to see if we have changed slider scales */ - if (previousMaxValue != maxValue) - { - /* - * if so, convert the old setting to the new scale as close as possible - * based on percentages - */ - [fVidQualitySlider setFloatValue:((maxValue - minValue + 1.) * - (previousPercentOfSliderScale))]; - } - - [self qualitySliderChanged:nil]; -} - -- (IBAction) qualitySliderChanged: (id) sender -{ - /* - * Our constant quality slider is in a range based - * on each encoders qp/rf values. The range depends - * on the encoder. Also, the range is inverse of quality - * for all of the encoders *except* for theora - * (ie. as the "quality" goes up, the cq or rf value - * actually goes down). Since the IB sliders always set - * their max value at the right end of the slider, we - * will calculate the inverse, so as the slider floatValue - * goes up, we will show the inverse in the rf field - * so, the floatValue at the right for x264 would be 51 - * and our rf field needs to show 0 and vice versa. - */ - int direction; - float minValue, maxValue, granularity; - float inverseValue = ([fVidQualitySlider minValue] + - [fVidQualitySlider maxValue] - - [fVidQualitySlider floatValue]); - hb_video_quality_get_limits((int)[[fVidEncoderPopUp selectedItem] tag], - &minValue, &maxValue, &granularity, &direction); - if (!direction) - { - [fVidQualityRFField setStringValue:[NSString stringWithFormat:@"%.2f", - [fVidQualitySlider floatValue]]]; - } - else - { - [fVidQualityRFField setStringValue:[NSString stringWithFormat:@"%.2f", - inverseValue]]; - } - /* Show a warning if x264 and rf 0 which is lossless */ - if ([[fVidEncoderPopUp selectedItem] tag] == HB_VCODEC_X264 && inverseValue == 0.0) - { - [fVidQualityRFField setStringValue:[NSString stringWithFormat:@"%.2f (Warning: Lossless)", - inverseValue]]; - } - - [self customSettingUsed: sender]; /* If Auto Naming is on it might need to be update if it includes the quality token */ if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"]) @@ -5405,436 +4748,27 @@ the user is using "Custom" settings by determining the sender*/ } } - -- (void) controlTextDidChange: (NSNotification *) notification -{ - [self calculateBitrate:nil]; -} - -- (IBAction) calculateBitrate: (id) sender -{ - if( !fHandle || ![fVidQualityMatrix selectedRow] || !SuccessfulScan ) - { - return; - } - - hb_list_t * list = hb_get_titles( fHandle ); - hb_title_t * title = (hb_title_t *) hb_list_item( list, - (int)[fSrcTitlePopUp indexOfSelectedItem] ); - hb_job_t * job = title->job; - /* For hb_calc_bitrate in addition to the Target Size in MB out of the - * Target Size Field, we also need the job info for the Muxer, the Chapters - * as well as all of the audio track info. - * This used to be accomplished by simply calling prepareJob here, however - * since the resilient queue sets the queue array values instead of the job - * values directly, we duplicate the old prepareJob code here for the variables - * needed - */ - job->chapter_start = (int)[fSrcChapterStartPopUp indexOfSelectedItem] + 1; - job->chapter_end = (int)[fSrcChapterEndPopUp indexOfSelectedItem] + 1; - job->mux = (int)[[fDstFormatPopUp selectedItem] tag]; - - /* Audio goes here */ - [fAudioDelegate prepareAudioForJob: job]; - - // Updates bitrate in the file name - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"]) - { - [self updateFileName]; - } -} - -#pragma mark - -#pragma mark - Video x264 Presets - -- (IBAction) setupX264PresetsWidgets: (id) sender -{ - NSUInteger i; - // populate the preset system widgets via hb_video_encoder_get_* functions. - // store x264 preset names - const char* const *x264_presets = hb_video_encoder_get_presets(HB_VCODEC_X264); - NSMutableArray *tmp_array = [[NSMutableArray alloc] init]; - for (i = 0; x264_presets[i] != NULL; i++) - { - [tmp_array addObject:[NSString stringWithUTF8String:x264_presets[i]]]; - if (!strcasecmp(x264_presets[i], "medium")) - { - fX264MediumPresetIndex = i; - } - } - fX264PresetNames = [[NSArray alloc] initWithArray:tmp_array]; - [tmp_array release]; - // setup the x264 preset slider - [fX264PresetsSlider setMinValue:0]; - [fX264PresetsSlider setMaxValue:[fX264PresetNames count]-1]; - [fX264PresetsSlider setNumberOfTickMarks:[fX264PresetNames count]]; - [fX264PresetsSlider setIntegerValue:fX264MediumPresetIndex]; - [fX264PresetsSlider setTickMarkPosition:NSTickMarkAbove]; - [fX264PresetsSlider setAllowsTickMarkValuesOnly:YES]; - [self x264PresetsSliderChanged: sender]; - // setup the x264 tune popup - [fX264TunePopUp removeAllItems]; - [fX264TunePopUp addItemWithTitle: @"none"]; - const char* const *x264_tunes = hb_video_encoder_get_tunes(HB_VCODEC_X264); - for (int i = 0; x264_tunes[i] != NULL; i++) - { - // we filter out "fastdecode" as we have a dedicated checkbox for it - if (strcasecmp(x264_tunes[i], "fastdecode") != 0) - { - [fX264TunePopUp addItemWithTitle: [NSString stringWithUTF8String:x264_tunes[i]]]; - } - } - // the fastdecode checkbox is off by default - [fX264FastDecodeCheck setState: NSOffState]; - // setup the h264 profile popup - [fX264ProfilePopUp removeAllItems]; - const char* const *h264_profiles = hb_video_encoder_get_profiles(HB_VCODEC_X264); - for (int i = 0; h264_profiles[i] != NULL; i++) - { - [fX264ProfilePopUp addItemWithTitle: [NSString stringWithUTF8String:h264_profiles[i]]]; - } - // setup the h264 level popup - [fX264LevelPopUp removeAllItems]; - const char* const *h264_levels = hb_video_encoder_get_levels(HB_VCODEC_X264); - for (int i = 0; h264_levels[i] != NULL; i++) - { - [fX264LevelPopUp addItemWithTitle: [NSString stringWithUTF8String:h264_levels[i]]]; - } - // clear the additional x264 options - [fDisplayX264PresetsAdditonalOptionsTextField setStringValue:@""]; -} - -- (void) enableX264Widgets: (bool) enable -{ - NSControl *controls[] = - { - fX264PresetsSlider, fX264PresetSliderLabel, fX264PresetSelectedTextField, - fX264TunePopUp, fX264TunePopUpLabel, fX264FastDecodeCheck, - fDisplayX264PresetsAdditonalOptionsTextField, fDisplayX264PresetsAdditonalOptionsLabel, - fX264ProfilePopUp, fX264ProfilePopUpLabel, - fX264LevelPopUp, fX264LevelPopUpLabel, - fDisplayX264PresetsUnparseTextField, - }; - - // check whether the x264 preset system and the advanced panel should be enabled - BOOL enable_x264_controls = (enable && [fX264UseAdvancedOptionsCheck state] == NSOffState); - BOOL enable_advanced_panel = (enable && [fX264UseAdvancedOptionsCheck state] == NSOnState); - - // enable/disable the checkbox and advanced panel - [fX264UseAdvancedOptionsCheck setEnabled:enable]; - [fAdvancedOptions enableUI:enable_advanced_panel]; - - // enable/disable the x264 preset system controls - 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:(enable_x264_controls ? - [NSColor controlTextColor] : - [NSColor disabledControlTextColor])]; - continue; - } - } - [controls[i] setEnabled:enable_x264_controls]; - } -} - -- (IBAction) updateX264Widgets: (id) sender -{ - if ([fX264UseAdvancedOptionsCheck state] == NSOnState) - { - /* - * we are using or switching to the advanced panel - * - * if triggered by selectPreset or applyQueueSettingToMainWindow, - * the options string will have been specified explicitly - leave it. - * - * if triggered by the advanced panel on/off checkbox, set the options - * string to the value of the unparsed x264 preset system string. - */ - if (sender == fX264UseAdvancedOptionsCheck) - { - if (fX264PresetsUnparsedUTF8String != NULL) - { - [fAdvancedOptions setOptions: - [NSString stringWithUTF8String:fX264PresetsUnparsedUTF8String]]; - } - else - { - [fAdvancedOptions setOptions:@""]; - } - } - } - // enable/disable, populate and update the various widgets - [self enableX264Widgets: YES]; - [self x264PresetsSliderChanged:nil]; - [fAdvancedOptions X264AdvancedOptionsSet: nil]; -} - -#pragma mark - -#pragma mark x264 preset system - -- (NSString*) x264Preset -{ - return (NSString*)[fX264PresetNames objectAtIndex:[fX264PresetsSlider intValue]]; -} - -- (NSString*) x264Tune -{ - NSString *x264Tune = @""; - if ([fX264TunePopUp indexOfSelectedItem]) - { - x264Tune = [x264Tune stringByAppendingString: - [fX264TunePopUp titleOfSelectedItem]]; - } - if ([fX264FastDecodeCheck state]) - { - if ([x264Tune length]) - { - x264Tune = [x264Tune stringByAppendingString: @","]; - } - x264Tune = [x264Tune stringByAppendingString: @"fastdecode"]; - } - return x264Tune; -} - -- (NSString*) x264OptionExtra -{ - return [fDisplayX264PresetsAdditonalOptionsTextField stringValue]; -} - -- (NSString*) h264Profile -{ - if ([fX264ProfilePopUp indexOfSelectedItem]) - { - return [fX264ProfilePopUp titleOfSelectedItem]; - } - return @""; -} - -- (NSString*) h264Level -{ - if ([fX264LevelPopUp indexOfSelectedItem]) - { - return [fX264LevelPopUp titleOfSelectedItem]; - } - return @""; -} - -- (void) setX264Preset: (NSString*)x264Preset -{ - if (x264Preset) - { - NSString *name; - NSEnumerator *enumerator = [fX264PresetNames objectEnumerator]; - while ((name = (NSString *)[enumerator nextObject])) - { - if ([name isEqualToString:x264Preset]) - { - [fX264PresetsSlider setIntegerValue: - [fX264PresetNames indexOfObject:name]]; - return; - } - } - } - [fX264PresetsSlider setIntegerValue:fX264MediumPresetIndex]; -} - -- (void) setX264Tune: (NSString*)x264Tune -{ - if (!x264Tune) - { - [fX264TunePopUp selectItemAtIndex:0]; - [fX264FastDecodeCheck setState:NSOffState]; - return; - } - // handle fastdecode - if ([x264Tune rangeOfString:@"fastdecode"].location != NSNotFound) - { - [fX264FastDecodeCheck setState:NSOnState]; - } - else - { - [fX264FastDecodeCheck setState:NSOffState]; - } - // filter out fastdecode - x264Tune = [x264Tune stringByReplacingOccurrencesOfString:@"," - withString:@""]; - x264Tune = [x264Tune stringByReplacingOccurrencesOfString:@"fastdecode" - withString:@""]; - // set the tune - [fX264TunePopUp selectItemWithTitle:x264Tune]; - // fallback - if ([fX264TunePopUp indexOfSelectedItem] == -1) - { - [fX264TunePopUp selectItemAtIndex:0]; - } -} - -- (void) setX264OptionExtra: (NSString*)x264OptionExtra -{ - if (!x264OptionExtra) - { - [fDisplayX264PresetsAdditonalOptionsTextField setStringValue:@""]; - return; - } - [fDisplayX264PresetsAdditonalOptionsTextField setStringValue:x264OptionExtra]; -} - -- (void) setH264Profile: (NSString*)h264Profile -{ - if (!h264Profile) - { - [fX264ProfilePopUp selectItemAtIndex:0]; - return; - } - // set the profile - [fX264ProfilePopUp selectItemWithTitle:h264Profile]; - // fallback - if ([fX264ProfilePopUp indexOfSelectedItem] == -1) - { - [fX264ProfilePopUp selectItemAtIndex:0]; - } -} - -- (void) setH264Level: (NSString*)h264Level -{ - if (!h264Level) - { - [fX264LevelPopUp selectItemAtIndex:0]; - return; - } - // set the level - [fX264LevelPopUp selectItemWithTitle:h264Level]; - // fallback - if ([fX264LevelPopUp indexOfSelectedItem] == -1) - { - [fX264LevelPopUp selectItemAtIndex:0]; - } -} - - -- (IBAction) x264PresetsSliderChanged: (id) sender -{ - // we assume the preset names and slider were setup properly - [fX264PresetSelectedTextField setStringValue: [self x264Preset]]; - [self x264PresetsChangedDisplayExpandedOptions:nil]; - -} - -/* This is called everytime a x264 widget in the video tab is changed to - display the expanded options in a text field via outlet fDisplayX264PresetsUnparseTextField - */ -- (IBAction) x264PresetsChangedDisplayExpandedOptions: (id) sender - -{ - /* API reference: - * - * char * hb_x264_param_unparse(const char *x264_preset, - * const char *x264_tune, - * const char *x264_encopts, - * const char *h264_profile, - * const char *h264_level, - * int width, int height); - */ - NSString *tmpString; - const char *x264_preset = [[self x264Preset] UTF8String]; - const char *x264_tune = NULL; - const char *advanced_opts = NULL; - const char *h264_profile = NULL; - const char *h264_level = NULL; - int width = 1; - int height = 1; - // prepare the tune, advanced options, profile and level - if ([(tmpString = [self x264Tune]) length]) - { - x264_tune = [tmpString UTF8String]; - } - if ([(tmpString = [self x264OptionExtra]) length]) - { - advanced_opts = [tmpString UTF8String]; - } - if ([(tmpString = [self h264Profile]) length]) - { - h264_profile = [tmpString UTF8String]; - } - if ([(tmpString = [self h264Level]) length]) - { - h264_level = [tmpString UTF8String]; - } - // width and height must be non-zero - if (fX264PresetsWidthForUnparse && fX264PresetsHeightForUnparse) - { - width = (int)fX264PresetsWidthForUnparse; - height = (int)fX264PresetsHeightForUnparse; - } - // free the previous unparsed string - free(fX264PresetsUnparsedUTF8String); - // now, unparse - fX264PresetsUnparsedUTF8String = hb_x264_param_unparse(x264_preset, - x264_tune, - advanced_opts, - h264_profile, - h264_level, - width, height); - // update the text field - if (fX264PresetsUnparsedUTF8String != NULL) - { - [fDisplayX264PresetsUnparseTextField setStringValue: - [NSString stringWithFormat:@"x264 Unparse: %s", - fX264PresetsUnparsedUTF8String]]; - } - else - { - [fDisplayX264PresetsUnparseTextField setStringValue:@"x264 Unparse:"]; - } -} - #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; - /* Here we apply the title source and height */ - job->width = fTitle->width; - job->height = fTitle->height; - - [self calculatePictureSizing: sender]; - /* We call 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:nil]; -} - -/* Get and Display Current Pic Settings in main window */ -- (IBAction) calculatePictureSizing: (id) sender { // align picture settings and video filters in the UI using tabs - [fPictureSettingsField setStringValue:[NSString stringWithFormat:@"Picture Settings: \t %@", - [self pictureSettingsSummary]]]; - [fPictureFiltersField setStringValue:[NSString stringWithFormat:@"Picture Filters: \t\t %@", - [self pictureFiltersSummary]]]; - + fVideoController.pictureSettingsField = [self pictureSettingsSummary]; + fVideoController.pictureFiltersField = [self pictureFiltersSummary]; + /* Store storage resolution for unparse */ - fX264PresetsWidthForUnparse = fTitle->job->width; - fX264PresetsHeightForUnparse = fTitle->job->height; - // width or height may have changed, unparse - [self x264PresetsChangedDisplayExpandedOptions:nil]; + if (fTitle) + { + fVideoController.fX264PresetsWidthForUnparse = fTitle->job->width; + fVideoController.fX264PresetsHeightForUnparse = fTitle->job->height; + // width or height may have changed, unparse + [fVideoController x264PresetsChangedDisplayExpandedOptions:nil]; + } } #pragma mark - @@ -6009,62 +4943,6 @@ the user is using "Custom" settings by determining the sender*/ return [NSString stringWithString:summary]; } -#pragma mark - -#pragma mark - Audio and Subtitles - - -// This causes all audio tracks from the title to be used based on the current preset -- (IBAction) addAllAudioTracks: (id) sender - -{ - [fAudioDelegate addAllTracksFromPreset:[self selectedPreset]]; - return; -} - -- (IBAction) browseImportSrtFile: (id) sender -{ - NSOpenPanel *panel; - - panel = [NSOpenPanel openPanel]; - [panel setAllowsMultipleSelection: NO]; - [panel setCanChooseFiles: YES]; - [panel setCanChooseDirectories: NO ]; - - NSURL *sourceDirectory; - if ([[NSUserDefaults standardUserDefaults] URLForKey:@"LastSrtImportDirectoryURL"]) - { - sourceDirectory = [[NSUserDefaults standardUserDefaults] URLForKey:@"LastSrtImportDirectoryURL"]; - } - else - { - sourceDirectory = [[NSURL fileURLWithPath:NSHomeDirectory()] URLByAppendingPathComponent:@"Desktop"]; - } - - /* we open up the browse srt sheet here and call for browseImportSrtFileDone after the sheet is closed */ - NSArray *fileTypes = [NSArray arrayWithObjects:@"plist", @"srt", nil]; - [panel setDirectoryURL:sourceDirectory]; - [panel setAllowedFileTypes:fileTypes]; - [panel beginSheetModalForWindow:fWindow completionHandler:^(NSInteger result) { - [self browseImportSrtFileDone:panel returnCode:(int)result contextInfo:sender]; - }]; -} - -- (void) browseImportSrtFileDone: (NSOpenPanel *) sheet - returnCode: (int) returnCode contextInfo: (void *) contextInfo -{ - if( returnCode == NSOKButton ) - { - NSURL *importSrtFileURL = [sheet URL]; - NSURL *importSrtDirectory = [importSrtFileURL URLByDeletingLastPathComponent]; - [[NSUserDefaults standardUserDefaults] setURL:importSrtDirectory forKey:@"LastSrtImportDirectoryURL"]; - - /* now pass the string off to fSubtitlesDelegate to add the srt file to the dropdown */ - [fSubtitlesDelegate createSubtitleSrtTrack:importSrtFileURL]; - - [fSubtitlesTable reloadData]; - } -} - #pragma mark - #pragma mark Open New Windows @@ -6462,7 +5340,6 @@ return YES; hb_job_t * job = fTitle->job; // for mapping names via libhb - int intValue; const char *strValue; chosenPreset = [self selectedPreset]; [fPresetSelectedDisplay setStringValue:[chosenPreset objectForKey:@"PresetName"]]; @@ -6483,7 +5360,7 @@ return YES; [self formatPopUpChanged:nil]; /* Chapter Markers*/ - [fCreateChapterMarkers setState:[[chosenPreset objectForKey:@"ChapterMarkers"] intValue]]; + fChapterTitlesController.createChapterMarkers = [[chosenPreset objectForKey:@"ChapterMarkers"] boolValue]; /* check to see if we have only one chapter */ [self chapterPopUpChanged:nil]; @@ -6493,59 +5370,8 @@ return YES; [fDstMp4HttpOptFileCheck setState:[[chosenPreset objectForKey:@"Mp4HttpOptimize"] intValue]]; /* Video encoder */ - /* map legacy encoder names via libhb */ - strValue = hb_video_encoder_sanitize_name([[chosenPreset objectForKey:@"VideoEncoder"] UTF8String]); - [fVidEncoderPopUp selectItemWithTitle:[NSString stringWithFormat:@"%s", strValue]]; - [self videoEncoderPopUpChanged:nil]; - - if ([[fVidEncoderPopUp selectedItem] tag] == HB_VCODEC_X264) - { - if (![chosenPreset objectForKey:@"x264UseAdvancedOptions"] || - [[chosenPreset objectForKey:@"x264UseAdvancedOptions"] intValue]) - { - /* - * x264UseAdvancedOptions is not set (legacy preset) - * or set to 1 (enabled), so we use the old advanced panel - */ - if ([chosenPreset objectForKey:@"x264Option"]) - { - /* we set the advanced options string here if applicable */ - [fAdvancedOptions setOptions: [chosenPreset objectForKey:@"x264Option"]]; - [self setX264OptionExtra:[chosenPreset objectForKey:@"x264Option"]]; - } - else - { - [fAdvancedOptions setOptions: @""]; - [self setX264OptionExtra:nil]; - } - /* preset does not use the x264 preset system, reset the widgets */ - [self setX264Preset: nil]; - [self setX264Tune: nil]; - [self setH264Profile:nil]; - [self setH264Level: nil]; - /* we enable the advanced panel and update the widgets */ - [fX264UseAdvancedOptionsCheck setState:NSOnState]; - [self updateX264Widgets:nil]; - } - else - { - /* - * x264UseAdvancedOptions is set to 0 (disabled), - * so we use the x264 preset system - */ - [self setX264Preset: [chosenPreset objectForKey:@"x264Preset"]]; - [self setX264Tune: [chosenPreset objectForKey:@"x264Tune"]]; - [self setX264OptionExtra:[chosenPreset objectForKey:@"x264OptionExtra"]]; - [self setH264Profile: [chosenPreset objectForKey:@"h264Profile"]]; - [self setH264Level: [chosenPreset objectForKey:@"h264Level"]]; - /* preset does not use the advanced panel, reset it */ - [fAdvancedOptions setOptions:@""]; - /* we disable the advanced panel and update the widgets */ - [fX264UseAdvancedOptionsCheck setState:NSOffState]; - [self updateX264Widgets:nil]; - } - } - + [fVideoController applySettingsFromPreset:chosenPreset]; + if ([chosenPreset objectForKey:@"lavcOption"]) { [fAdvancedOptions setLavcOptions:[chosenPreset objectForKey:@"lavcOption"]]; @@ -6559,145 +5385,73 @@ return YES; //[self videoEncoderPopUpChanged:nil]; /* Set the state of ipod compatible with Mp4iPodCompatible. Only for x264*/ [fDstMp4iPodFileCheck setState:[[chosenPreset objectForKey:@"Mp4iPodCompatible"] intValue]]; - [self calculateBitrate:nil]; - - /* Video quality */ - - int qualityType = [[chosenPreset objectForKey:@"VideoQualityType"] intValue] - 1; - /* Note since the removal of Target Size encoding, the possible values for VideoQuality type are 0 - 1. - * Therefore any preset that uses the old 2 for Constant Quality would now use 1 since there is one less index - * for the fVidQualityMatrix. It should also be noted that any preset that used the deprecated Target Size - * setting of 0 would set us to 0 or ABR since ABR is now tagged 0. Fortunately this does not affect any built-in - * presets since they all use Constant Quality or Average Bitrate.*/ - if (qualityType == -1) - { - qualityType = 0; - } - [fVidQualityMatrix selectCellWithTag:qualityType]; - [fVidBitrateField setStringValue:[chosenPreset objectForKey:@"VideoAvgBitrate"]]; - - int direction; - float minValue, maxValue, granularity; - hb_video_quality_get_limits((int)[[fVidEncoderPopUp selectedItem] tag], - &minValue, &maxValue, &granularity, &direction); - if (!direction) - { - [fVidQualitySlider setFloatValue:[[chosenPreset objectForKey:@"VideoQualitySlider"] floatValue]]; - } - else - { - /* - * Since ffmpeg and x264 use an "inverted" slider (lower values - * indicate a higher quality) we invert the value on the slider - */ - [fVidQualitySlider setFloatValue:([fVidQualitySlider minValue] + - [fVidQualitySlider maxValue] - - [[chosenPreset objectForKey:@"VideoQualitySlider"] floatValue])]; - } - - [self videoMatrixChanged:nil]; - - /* Video framerate */ - if ([[chosenPreset objectForKey:@"VideoFramerate"] isEqualToString:@"Same as source"]) - { - /* Now set the Video Frame Rate Mode to either vfr or cfr according to the preset */ - if (![chosenPreset objectForKey:@"VideoFramerateMode"] || - [[chosenPreset objectForKey:@"VideoFramerateMode"] isEqualToString:@"vfr"]) - { - [fFramerateMatrix selectCellAtRow:0 column:0]; // we want vfr - } - else - { - [fFramerateMatrix selectCellAtRow:1 column:0]; // we want cfr - } - } - else - { - /* Now set the Video Frame Rate Mode to either pfr or cfr according to the preset */ - if ([[chosenPreset objectForKey:@"VideoFramerateMode"] isEqualToString:@"pfr"] || - [[chosenPreset objectForKey:@"VideoFrameratePFR"] intValue] == 1) - { - [fFramerateMatrix selectCellAtRow:0 column:0]; // we want pfr - } - else - { - [fFramerateMatrix selectCellAtRow:1 column:0]; // we want cfr - } - } - /* map legacy names via libhb */ - intValue = hb_video_framerate_get_from_name([[chosenPreset objectForKey:@"VideoFramerate"] UTF8String]); - [fVidRatePopUp selectItemWithTag:intValue]; - [self videoFrameRateChanged:nil]; - - /* 2 Pass Encoding */ - [fVidTwoPassCheck setState:[[chosenPreset objectForKey:@"VideoTwoPass"] intValue]]; - [self twoPassCheckboxChanged:nil]; + /* Video quality */ - /* Turbo 1st pass for 2 Pass Encoding */ - [fVidTurboPassCheck setState:[[chosenPreset objectForKey:@"VideoTurboTwoPass"] intValue]]; /* Auto Passthru: if the preset has Auto Passthru fields, use them. * Otherwise assume every passthru is allowed and the fallback is AC3 */ + id tempObject; if ((tempObject = [chosenPreset objectForKey:@"AudioAllowAACPass"]) != nil) { - [fAudioAllowAACPassCheck setState:[tempObject intValue]]; + fAudioController.allowAACPassCheck = [tempObject boolValue]; } else { - [fAudioAllowAACPassCheck setState:NSOnState]; + fAudioController.allowAACPassCheck = YES; } if ((tempObject = [chosenPreset objectForKey:@"AudioAllowAC3Pass"]) != nil) { - [fAudioAllowAC3PassCheck setState:[tempObject intValue]]; + fAudioController.allowAC3PassCheck = [tempObject boolValue]; } else { - [fAudioAllowAC3PassCheck setState:NSOnState]; + fAudioController.allowAC3PassCheck = YES; } if ((tempObject = [chosenPreset objectForKey:@"AudioAllowDTSHDPass"]) != nil) { - [fAudioAllowDTSHDPassCheck setState:[tempObject intValue]]; + fAudioController.allowDTSHDPassCheck = [tempObject boolValue]; } else { - [fAudioAllowDTSHDPassCheck setState:NSOnState]; + fAudioController.allowDTSHDPassCheck = YES; } if ((tempObject = [chosenPreset objectForKey:@"AudioAllowDTSPass"]) != nil) { - [fAudioAllowDTSPassCheck setState:[tempObject intValue]]; + fAudioController.allowDTSPassCheck= [tempObject boolValue]; } else { - [fAudioAllowDTSPassCheck setState:NSOnState]; + fAudioController.allowDTSPassCheck = YES; } if ((tempObject = [chosenPreset objectForKey:@"AudioAllowMP3Pass"]) != nil) { - [fAudioAllowMP3PassCheck setState:[tempObject intValue]]; + fAudioController.allowMP3PassCheck = [tempObject boolValue]; } else { - [fAudioAllowMP3PassCheck setState:NSOnState]; + fAudioController.allowAACPassCheck = YES; } if ((tempObject = [chosenPreset objectForKey:@"AudioEncoderFallback"]) != nil) { - /* map legacy encoder names via libhb */ + // map legacy encoder names via libhb strValue = hb_audio_encoder_sanitize_name([tempObject UTF8String]); - [fAudioFallbackPopUp selectItemWithTitle:[NSString stringWithFormat:@"%s", strValue]]; + fAudioController.audioEncoderFallback = [NSString stringWithFormat:@"%s", strValue]; } else { - [fAudioFallbackPopUp selectItemWithTag:HB_ACODEC_AC3]; + fAudioController.audioEncoderFallbackTag = HB_ACODEC_AC3; } /* Audio */ - [fAudioDelegate addTracksFromPreset: chosenPreset]; + [fAudioController addTracksFromPreset: chosenPreset]; /*Subtitles*/ - [fSubPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Subtitles"]]; + // To be fixed in the automatic subtitles changes + //[fSubPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Subtitles"]]; /* Forced Subtitles */ - [fSubForcedCheck setState:[[chosenPreset objectForKey:@"SubtitlesForced"] intValue]]; + //[fSubForcedCheck setState:[[chosenPreset objectForKey:@"SubtitlesForced"] intValue]]; /* Picture Settings */ /* Note: objectForKey:@"UsesPictureSettings" refers to picture size, which encompasses: @@ -6898,7 +5652,7 @@ return YES; } /* we call SetTitle: in fPictureController so we get an instant update in the Picture Settings window */ [fPictureController setTitle:fTitle]; - [self calculatePictureSizing:nil]; + [self pictureSettingsDidChange]; } @@ -7127,7 +5881,7 @@ return YES; /* File Format */ [preset setObject:[fDstFormatPopUp titleOfSelectedItem] forKey:@"FileFormat"]; /* Chapter Markers fCreateChapterMarkers*/ - [preset setObject:[NSNumber numberWithInteger:[fCreateChapterMarkers state]] forKey:@"ChapterMarkers"]; + [preset setObject:@(fChapterTitlesController.createChapterMarkers) forKey:@"ChapterMarkers"]; /* Allow Mpeg4 64 bit formatting +4GB file sizes */ [preset setObject:[NSNumber numberWithInteger:[fDstMp4LargeFileCheck state]] forKey:@"Mp4LargeFile"]; /* Mux mp4 with http optimization */ @@ -7137,81 +5891,8 @@ return YES; /* Codecs */ /* Video encoder */ - [preset setObject:[fVidEncoderPopUp titleOfSelectedItem] forKey:@"VideoEncoder"]; - /* x264 Options, this will either be advanced panel or the video tabs x264 presets panel with modded option string */ - - if ([fX264UseAdvancedOptionsCheck state] == NSOnState) - { - /* use the old advanced panel */ - [preset setObject:[NSNumber numberWithInt:1] forKey:@"x264UseAdvancedOptions"]; - [preset setObject:[fAdvancedOptions optionsString] forKey:@"x264Option"]; - } - else - { - /* use the x264 preset system */ - [preset setObject:[NSNumber numberWithInt:0] forKey:@"x264UseAdvancedOptions"]; - [preset setObject:[self x264Preset] forKey:@"x264Preset"]; - [preset setObject:[self x264Tune] forKey:@"x264Tune"]; - [preset setObject:[self x264OptionExtra] forKey:@"x264OptionExtra"]; - [preset setObject:[self h264Profile] forKey:@"h264Profile"]; - [preset setObject:[self h264Level] forKey:@"h264Level"]; - /* - * bonus: set the unparsed options to make the preset compatible - * with old HB versions - */ - if (fX264PresetsUnparsedUTF8String != NULL) - { - [preset setObject:[NSString stringWithUTF8String:fX264PresetsUnparsedUTF8String] - forKey:@"x264Option"]; - } - else - { - [preset setObject:@"" forKey:@"x264Option"]; - } - } - - /* FFmpeg (lavc) Option String */ - [preset setObject:[fAdvancedOptions optionsStringLavc] forKey:@"lavcOption"]; - - /* though there are actually only 0 - 1 types available in the ui we need to map to the old 0 - 2 - * set of indexes from when we had 0 == Target , 1 == Abr and 2 == Constant Quality for presets - * to take care of any legacy presets. */ - [preset setObject:[NSNumber numberWithInteger:[[fVidQualityMatrix selectedCell] tag] +1 ] forKey:@"VideoQualityType"]; - [preset setObject:[fVidBitrateField stringValue] forKey:@"VideoAvgBitrate"]; - [preset setObject:[NSNumber numberWithFloat:[fVidQualityRFField floatValue]] forKey:@"VideoQualitySlider"]; - - /* Video framerate and framerate mode */ - if ([fFramerateMatrix selectedRow] == 1) - { - [preset setObject:@"cfr" forKey:@"VideoFramerateMode"]; - } - if ([fVidRatePopUp indexOfSelectedItem] == 0) // Same as source is selected - { - [preset setObject:@"Same as source" forKey:@"VideoFramerate"]; - - if ([fFramerateMatrix selectedRow] == 0) - { - [preset setObject:@"vfr" forKey:@"VideoFramerateMode"]; - } - } - else // translate the rate (selected item's tag) to the official libhb name - { - [preset setObject:[NSString stringWithFormat:@"%s", - hb_video_framerate_get_name((int)[[fVidRatePopUp selectedItem] tag])] - forKey:@"VideoFramerate"]; - - if ([fFramerateMatrix selectedRow] == 0) - { - [preset setObject:@"pfr" forKey:@"VideoFramerateMode"]; - } - } - + [fVideoController prepareVideoForPreset:preset]; - - /* 2 Pass Encoding */ - [preset setObject:[NSNumber numberWithInteger:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"]; - /* Turbo 2 pass Encoding fVidTurboPassCheck*/ - [preset setObject:[NSNumber numberWithInteger:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"]; /*Picture Settings*/ hb_job_t * job = fTitle->job; @@ -7242,18 +5923,18 @@ return YES; [preset setObject:[NSNumber numberWithInteger:[fPictureController decomb]] forKey:@"PictureDecomb"]; [preset setObject:[fPictureController decombCustomString] forKey:@"PictureDecombCustom"]; [preset setObject:[NSNumber numberWithInteger:[fPictureController grayscale]] forKey:@"VideoGrayScale"]; - + /* Auto Pasthru */ - [preset setObject:[NSNumber numberWithInteger:[fAudioAllowAACPassCheck state]] forKey: @"AudioAllowAACPass"]; - [preset setObject:[NSNumber numberWithInteger:[fAudioAllowAC3PassCheck state]] forKey: @"AudioAllowAC3Pass"]; - [preset setObject:[NSNumber numberWithInteger:[fAudioAllowDTSHDPassCheck state]] forKey: @"AudioAllowDTSHDPass"]; - [preset setObject:[NSNumber numberWithInteger:[fAudioAllowDTSPassCheck state]] forKey: @"AudioAllowDTSPass"]; - [preset setObject:[NSNumber numberWithInteger:[fAudioAllowMP3PassCheck state]] forKey: @"AudioAllowMP3Pass"]; - [preset setObject:[fAudioFallbackPopUp titleOfSelectedItem] forKey: @"AudioEncoderFallback"]; - + [preset setObject:@(fAudioController.allowAACPassCheck) forKey: @"AudioAllowAACPass"]; + [preset setObject:@(fAudioController.allowAC3PassCheck) forKey: @"AudioAllowAC3Pass"]; + [preset setObject:@(fAudioController.allowDTSHDPassCheck) forKey: @"AudioAllowDTSHDPass"]; + [preset setObject:@(fAudioController.allowDTSPassCheck) forKey: @"AudioAllowDTSPass"]; + [preset setObject:@(fAudioController.allowMP3PassCheck) forKey: @"AudioAllowMP3Pass"]; + [preset setObject:fAudioController.audioEncoderFallback forKey: @"AudioEncoderFallback"]; + /* Audio */ NSMutableArray *audioListArray = [[NSMutableArray alloc] init]; - [fAudioDelegate prepareAudioForPreset: audioListArray]; + [fAudioController prepareAudioForPreset: audioListArray]; [preset setObject:[NSMutableArray arrayWithArray: audioListArray] forKey:@"AudioList"]; @@ -7731,155 +6412,6 @@ return YES; } -#pragma mark - -#pragma mark Chapter Files Import / Export - -- (IBAction) browseForChapterFile: (id) sender -{ - /* Open a panel to let the user choose the file */ - NSOpenPanel * panel = [NSOpenPanel openPanel]; - /* We get the current file name and path from the destination field here */ - NSString* sourceDirectory = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"]; - NSArray* fileTypes = [NSArray arrayWithObjects:@"csv",nil]; - [panel setDirectoryURL:[NSURL fileURLWithPath:sourceDirectory]]; - [panel setAllowedFileTypes:fileTypes]; - [panel beginSheetModalForWindow:fWindow completionHandler:^(NSInteger result) { - [self browseForChapterFileDone:panel returnCode:(int)result contextInfo:sender]; - }]; -} - -- (void) browseForChapterFileDone: (NSOpenPanel *) sheet - returnCode: (int) returnCode contextInfo: (void *) contextInfo -{ - NSArray *chaptersArray = nil; /* temp array for chapters */ - NSMutableArray *chaptersMutableArray = nil; /* temp array for chapters */ - NSString *chapterName = nil; /* temp string from file */ - NSInteger chapters, i; - - if( returnCode == NSOKButton ) /* if they click OK */ - { - chapterName = [[NSString alloc] initWithContentsOfURL:[sheet URL] encoding:NSUTF8StringEncoding error:NULL]; - chaptersArray = [chapterName componentsSeparatedByString:@"\n"]; - [chapterName release]; - chaptersMutableArray = [[chaptersArray mutableCopy] autorelease]; - chapters = [fChapterTitlesDelegate numberOfRowsInTableView:fChapterTable]; - if ([chaptersMutableArray count] > 0) - { - /* if last item is empty remove it */ - if ([[chaptersMutableArray objectAtIndex:[chaptersArray count]-1] length] == 0) - { - [chaptersMutableArray removeLastObject]; - } - } - /* if chapters in table is not equal to array count */ - if ((unsigned int) chapters != [chaptersMutableArray count]) - { - [sheet close]; - [[NSAlert alertWithMessageText:NSLocalizedString(@"Unable to load chapter file", @"Unable to load chapter file") - defaultButton:NSLocalizedString(@"OK", @"OK") - alternateButton:NULL - otherButton:NULL - informativeTextWithFormat:NSLocalizedString(@"%d chapters expected, %d chapters found in %@", @"%d chapters expected, %d chapters found in %@"), - chapters, [chaptersMutableArray count], [[sheet URL] lastPathComponent]] runModal]; - return; - } - /* otherwise, go ahead and populate table with array */ - for (i=0; i 5) - { - /* avoid a segfault */ - /* Get the Range.location of the first comma in the line and then put everything after that into chapterTitle */ - NSRange firstCommaRange = [[chaptersMutableArray objectAtIndex:i] rangeOfString:@","]; - NSString *chapterTitle = [[chaptersMutableArray objectAtIndex:i] substringFromIndex:firstCommaRange.location + 1]; - /* Since we store our chapterTitle commas as "\," for the cli, we now need to remove the escaping "\" from the title */ - chapterTitle = [chapterTitle stringByReplacingOccurrencesOfString:@"\\," withString:@","]; - [fChapterTitlesDelegate tableView:fChapterTable - setObjectValue:chapterTitle - forTableColumn:fChapterTableNameColumn - row:i]; - } - else - { - [sheet close]; - [[NSAlert alertWithMessageText:NSLocalizedString(@"Unable to load chapter file", @"Unable to load chapter file") - defaultButton:NSLocalizedString(@"OK", @"OK") - alternateButton:NULL - otherButton:NULL - informativeTextWithFormat:NSLocalizedString(@"%@ was not formatted as expected.", @"%@ was not formatted as expected."), [[sheet URL] lastPathComponent]] runModal]; - [fChapterTable reloadData]; - return; - } - } - [fChapterTable reloadData]; - } -} - -- (IBAction) browseForChapterFileSave: (id) sender -{ - NSSavePanel *panel = [NSSavePanel savePanel]; - /* Open a panel to let the user save to a file */ - [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"csv",nil]]; - NSString* destinationDirectory = [[fDstFile2Field stringValue] stringByDeletingLastPathComponent]; - [panel setDirectoryURL:[NSURL fileURLWithPath:destinationDirectory]]; - [panel setNameFieldStringValue:[[[fDstFile2Field stringValue] lastPathComponent] stringByDeletingPathExtension]]; - [panel beginSheetModalForWindow:fWindow completionHandler:^(NSInteger result) { - [self browseForChapterFileSaveDone:panel returnCode:(int)result contextInfo:sender]; - }]; -} - -- (void) browseForChapterFileSaveDone: (NSSavePanel *) sheet - returnCode: (int) returnCode contextInfo: (void *) contextInfo -{ - NSString *chapterName; /* pointer for string for later file-writing */ - NSString *chapterTitle; - NSError *saveError = nil; - NSInteger chapters, i; /* ints for the number of chapters in the table and the loop */ - - if( returnCode == NSOKButton ) /* if they clicked OK */ - { - chapters = [fChapterTitlesDelegate numberOfRowsInTableView:fChapterTable]; - chapterName = [NSString string]; - for (i=0; i - - - 1050 - 11C74 - 1938 - 1138.23 - 567.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 1938 - - - YES - NSPopUpButton - NSMenuItem - NSMenu - NSTextFieldCell - NSButtonCell - NSButton - NSSlider - NSSliderCell - NSCustomView - NSCustomObject - NSPopUpButtonCell - NSTextField - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - HBAdvancedController - - - FirstResponder - - - NSApplication - - - - 256 - - YES - - - 268 - {{298, 275}, {61, 14}} - - - - YES - - 68288064 - 272630784 - Analysis - - LucidaGrande-Bold - 11 - 16 - - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - - - - 268 - {{1, 275}, {66, 14}} - - - - YES - - 68288064 - 272630784 - Encoding - - - - - - - - - 268 - {{1, 128}, {91, 14}} - - - - YES - - 68288064 - 272630784 - Psychovisual - - - - - - - - - 256 - {{124, 151}, {97, 15}} - - - - YES - - -2076049856 - 264704 - - LucidaGrande - 9 - 3614 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{333, 107}, {116, 16}} - - - - YES - - 67239424 - 71434240 - Adaptive Quantization: - - LucidaGrande - 10 - 2843 - - - - - - - - - 268 - {{454, 105}, {146, 16}} - - - - YES - - -2079981824 - 262144 - - - - 1 - 0.0 - 0.0 - 0.0 - 11 - 0 - YES - NO - - - - - 256 - {{18, 170}, {102, 16}} - - - - YES - - 67239424 - 71434240 - Weighted P-Frames: - - - - - - - - - 256 - {{122, 172}, {22, 16}} - - - - YES - - 67239424 - 131072 - - - LucidaGrande - 11 - 3100 - - - 1211912703 - 2 - - NSSwitch - - - - 200 - 25 - - - - - 256 - {{124, 256}, {97, 15}} - - - - YES - - -2076049856 - 264192 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{26, 254}, {94, 16}} - - - - YES - - 67239424 - 71434240 - Reference Frames: - - - - - - - - - 256 - {{15, 233}, {105, 16}} - - - - YES - - 67239424 - 71303168 - Maximum B-Frames: - - - - - - - - - 256 - {{349, 254}, {100, 16}} - - - - YES - - 67239424 - 71303168 - Adaptive B-Frames: - - - - - - - - - 256 - {{124, 235}, {97, 15}} - - - - YES - - -2076049856 - 264704 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{453, 256}, {149, 15}} - - - - YES - - -2076049856 - 264704 - - - 109199615 - 1 - - LucidaGrande - 9 - 16 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{453, 193}, {149, 15}} - - - - YES - - -2076049856 - 264192 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{720, 233}, {37, 16}} - - - - YES - - 67239424 - 71303168 - Trellis: - - - - - - - - - 256 - {{17, 107}, {103, 16}} - - - - YES - - 67239424 - 71303168 - No DCT Decimation: - - - - - - - - - 256 - {{4, 0}, {882, 34}} - - - YES - - -1805517311 - 272760832 - - - - YES - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 6 - System - textColor - - - - - - - 256 - {{453, 214}, {149, 15}} - - - - YES - - -2076049856 - 264704 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{314, 212}, {135, 16}} - - - - YES - - 67239424 - 71303168 - Motion Estimation Method: - - - - - - - - - 256 - {{320, 170}, {129, 16}} - - - - YES - - 67239424 - 71434240 - Motion Estimation Range: - - - - - - - - - 256 - {{453, 172}, {149, 15}} - - - - YES - - -2076049856 - 264704 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{298, 191}, {151, 16}} - - - - YES - - 67239424 - 71434240 - Subpixel ME & Mode Decision: - - - - - - - - - 256 - {{15, 149}, {105, 16}} - - - - YES - - 67239424 - 71434240 - Pyramidal B-Frames: - - - - - - - - - 256 - {{304, 86}, {145, 16}} - - - - YES - - 67239424 - 71434240 - Psychovisual Rate Distortion: - - - - - - - - - 256 - {{337, 233}, {112, 16}} - - - - YES - - 67239424 - 71303168 - Adaptive Direct Mode: - - - - - - - - - 256 - {{453, 235}, {149, 15}} - - - - YES - - -2076049856 - 264704 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{1, 42}, {221, 17}} - - - - YES - - 67239424 - 272629760 - Current x264 Advanced Option String: - - - - - - - - - 256 - {{758, 109}, {130, 15}} - - - - YES - - -2076049856 - 263680 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{758, 88}, {130, 15}} - - - - YES - - -2076049856 - 263680 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{695, 107}, {62, 16}} - - - - YES - - 67239424 - 71303168 - Deblocking: - - - - - - - - - 256 - {{122, 109}, {22, 16}} - - - - YES - - 67239424 - 131072 - - - - 1211912703 - 2 - - - - 200 - 25 - - - - - 256 - {{758, 235}, {130, 15}} - - - - YES - - -2076049856 - 264192 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{758, 256}, {130, 15}} - - - - YES - - -2076049856 - 264704 - - - 109199615 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - - - - 256 - {{674, 254}, {83, 16}} - - - - YES - - 67239424 - 71434240 - Partition Types: - - - - - - - - - 256 - {{122, 193}, {22, 16}} - - - - YES - - 67239424 - 131072 - - - - 1211912703 - 2 - - - - 200 - 25 - - - - - 256 - {{40, 191}, {80, 16}} - - - - YES - - 67239424 - 71434240 - 8x8 Transform: - - - - - - - - - 256 - {{122, 214}, {22, 16}} - - - - YES - - 67239424 - 131072 - - - - 1211912703 - 2 - - - - 200 - 25 - - - - - 256 - {{1, 212}, {119, 16}} - - - - YES - - 67239424 - 71565312 - CABAC Entropy Coding: - - - - - - - - - 268 - {{454, 84}, {146, 16}} - - - - YES - - -2079981824 - 262144 - - - - 1 - 0.0 - 1 - 0.0 - 11 - 0 - YES - NO - - - - - 256 - {{347, 65}, {102, 16}} - - - - YES - - 67239424 - 71434240 - Psychovisual Trellis: - - - - - - - - - 268 - {{454, 63}, {146, 16}} - - - - YES - - -2079981824 - 262144 - - - - 1 - 0.0 - 0.0 - 0.0 - 11 - 0 - YES - NO - - - - {906, 290} - - - - NSView - NSResponder - - - - 256 - - YES - - - 256 - {{199, 137}, {509, 17}} - - - YES - - 67239424 - 138412032 - HandBrake Does Not Support Advanced Theora Options - - - - - - - - - 256 - {{1, 42}, {888, 17}} - - - - YES - - 67239424 - 272629760 - Current FFmpeg Advanced Option String: - - - - - - - - - 256 - {{4, 0}, {882, 34}} - - - YES - - -1805517311 - 272760832 - - - - YES - - - - - - {906, 290} - - - - - NSView - - NSResponder - - - - - YES - - - fDisplayX264Options - - - - 191 - - - - fDisplayX264OptionsLabel - - - - 192 - - - - X264AdvancedOptionsSet: - - - - 193 - - - - fX264optView - - - - 194 - - - - fX264opt8x8dctSwitch - - - - 195 - - - - fX264opt8x8dctLabel - - - - 196 - - - - fX264optAlphaDeblockPopUp - - - - 197 - - - - fX264optBetaDeblockPopUp - - - - 198 - - - - fX264optAnalyseLabel - - - - 199 - - - - fX264optAnalysePopUp - - - - 200 - - - - fX264optBframesPopUp - - - - 201 - - - - fX264optBframesLabel - - - - 202 - - - - fX264optBPyramidLabel - - - - 206 - - - - fX264optCabacSwitch - - - - 209 - - - - fX264optCabacLabel - - - - 210 - - - - fX264optDeblockLabel - - - - 211 - - - - fX264optDirectPredPopUp - - - - 212 - - - - fX264optDirectPredLabel - - - - 213 - - - - fX264optMERangePopUp - - - - 218 - - - - fX264optMERangeLabel - - - - 219 - - - - fX264optMotionEstPopUp - - - - 220 - - - - fX264optMotionEstLabel - - - - 221 - - - - fX264optNodctdcmtLabel - - - - 224 - - - - fX264optNodctdcmtSwitch - - - - 225 - - - - fX264optRefPopUp - - - - 226 - - - - fX264optRefLabel - - - - 227 - - - - fX264optSubmePopUp - - - - 228 - - - - fX264optSubmeLabel - - - - 229 - - - - fX264optTrellisPopUp - - - - 230 - - - - fX264optTrellisLabel - - - - 231 - - - - X264AdvancedOptionsChanged: - - - - 235 - - - - X264AdvancedOptionsChanged: - - - - 237 - - - - X264AdvancedOptionsChanged: - - - - 238 - - - - X264AdvancedOptionsChanged: - - - - 243 - - - - X264AdvancedOptionsChanged: - - - - 244 - - - - X264AdvancedOptionsChanged: - - - - 245 - - - - X264AdvancedOptionsChanged: - - - - 246 - - - - X264AdvancedOptionsChanged: - - - - 247 - - - - X264AdvancedOptionsChanged: - - - - 248 - - - - X264AdvancedOptionsChanged: - - - - 249 - - - - X264AdvancedOptionsChanged: - - - - 250 - - - - X264AdvancedOptionsChanged: - - - - 252 - - - - X264AdvancedOptionsChanged: - - - - 253 - - - - fEmptyView - - - - 256 - - - - fX264optPsyRDLabel - - - - 386 - - - - fX264optPsyRDSlider - - - - 387 - - - - fX264optPsyTrellisLabel - - - - 392 - - - - fX264optPsyTrellisSlider - - - - 393 - - - - X264AdvancedOptionsChanged: - - - - 394 - - - - X264AdvancedOptionsChanged: - - - - 395 - - - - fX264optBAdaptLabel - - - - 404 - - - - fX264optBAdaptPopUp - - - - 405 - - - - X264AdvancedOptionsChanged: - - - - 406 - - - - X264AdvancedOptionsChanged: - - - - 411 - - - - fX264optWeightPLabel - - - - 413 - - - - fX264optWeightPSwitch - - - - 414 - - - - X264AdvancedOptionsChanged: - - - - 424 - - - - fX264optAqSlider - - - - 425 - - - - fX264optAqLabel - - - - 426 - - - - X264AdvancedOptionsChanged: - - - - 433 - - - - fX264optBPyramidPopUp - - - - 434 - - - - X264AdvancedOptionsSet: - - - - 452 - - - - fDisplayLavcOptions - - - - 455 - - - - fDisplayLavcOptionsLabel - - - - 456 - - - - fDisplayTheoraOptionsLabel - - - - 459 - - - - - YES - - 0 - - YES - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 5 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x264 - - - 6 - - - YES - - - - - - 11 - - - YES - - - - - - 12 - - - YES - - - - - - 13 - - - YES - - - - - - 18 - - - YES - - - - - - 23 - - - YES - - - - - - 24 - - - YES - - - - - - 30 - - - YES - - - - - - 32 - - - YES - - - - - - 37 - - - YES - - - - - - 38 - - - YES - - - - - - 39 - - - YES - - - - - - 44 - - - YES - - - - - - 46 - - - YES - - - - - - 49 - - - YES - - - - - - 50 - - - YES - - - - - - 56 - - - YES - - - - - - 61 - - - YES - - - - - - 66 - - - YES - - - - - - 73 - - - YES - - - - - - 74 - - - YES - - - - - - 81 - - - YES - - - - - - 86 - - - YES - - - - - - 87 - - - YES - - - - - - 88 - - - YES - - - - - - 89 - - - YES - - - - - - 90 - - - YES - - - - - - 254 - - - YES - - - - - - empty - - - 342 - - - YES - - - - - - 343 - - - - - 344 - - - - - 345 - - - YES - - - - - - 346 - - - YES - - - - - - 347 - - - - - 348 - - - - - 350 - - - - - 352 - - - YES - - - - - - 353 - - - - - 354 - - - - - 355 - - - YES - - - - - - 356 - - - - - 358 - - - - - 361 - - - - - 362 - - - YES - - - - - - 364 - - - YES - - - - - - 365 - - - YES - - - - - - 366 - - - - - 373 - - - - - 374 - - - YES - - - - - - 375 - - - YES - - - - - - 376 - - - - - 377 - - - - - 378 - - - - - 379 - - - - - 380 - - - - - 7 - - - YES - - - - - - - - 10 - - - - - 9 - - - - - 8 - - - - - 14 - - - YES - - - - - - - - 17 - - - - - 16 - - - - - 15 - - - - - 19 - - - YES - - - - - - - - 22 - - - - - 21 - - - - - 20 - - - - - 33 - - - YES - - - - - - - - 36 - - - - - 35 - - - - - 34 - - - - - 40 - - - YES - - - - - - - - 43 - - - - - 42 - - - - - 41 - - - - - 51 - - - YES - - - - - - - - 54 - - - - - 53 - - - - - 52 - - - - - 57 - - - YES - - - - - - - - 60 - - - - - 59 - - - - - 58 - - - - - 62 - - - YES - - - - - - - - 65 - - - - - 64 - - - - - 63 - - - - - 75 - - - YES - - - - - - - - 78 - - - - - 77 - - - - - 76 - - - - - 82 - - - YES - - - - - - - - 85 - - - - - 84 - - - - - 83 - - - - - 382 - - - YES - - - - - - 383 - - - - - 384 - - - YES - - - - - - 385 - - - - - 388 - - - YES - - - - - - 389 - - - YES - - - - - - 390 - - - - - 391 - - - - - 396 - - - YES - - - - - - 397 - - - - - 398 - - - YES - - - - - - 399 - - - YES - - - - - - 400 - - - YES - - - - - - - - 401 - - - - - 402 - - - - - 403 - - - - - 407 - - - YES - - - - - - 408 - - - YES - - - - - - 409 - - - - - 410 - - - - - 420 - - - YES - - - - - - 421 - - - YES - - - - - - 422 - - - - - 423 - - - - - 55 - - - YES - - - - - - 363 - - - - - 427 - - - YES - - - - - - 428 - - - YES - - - - - - 429 - - - YES - - - - - - - - 430 - - - - - 431 - - - - - 432 - - - - - 438 - - - YES - - - - - - 439 - - - - - 440 - - - YES - - - - - - 441 - - - - - 442 - - - YES - - - - - - 443 - - - - - 450 - - - YES - - - - - - 451 - - - - - 453 - - - YES - - - - - - 454 - - - - - 457 - - - YES - - - - - - 458 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 10.IBPluginDependency - 11.IBAttributePlaceholdersKey - 11.IBPluginDependency - 12.IBAttributePlaceholdersKey - 12.IBPluginDependency - 13.IBAttributePlaceholdersKey - 13.IBPluginDependency - 14.IBPluginDependency - 15.IBPluginDependency - 16.IBPluginDependency - 17.IBPluginDependency - 18.IBAttributePlaceholdersKey - 18.IBPluginDependency - 19.IBPluginDependency - 20.IBPluginDependency - 21.IBPluginDependency - 22.IBPluginDependency - 23.IBAttributePlaceholdersKey - 23.IBPluginDependency - 24.IBAttributePlaceholdersKey - 24.IBPluginDependency - 254.IBPluginDependency - 30.IBPluginDependency - 32.IBAttributePlaceholdersKey - 32.IBPluginDependency - 33.IBPluginDependency - 34.IBPluginDependency - 342.IBPluginDependency - 343.IBPluginDependency - 344.IBPluginDependency - 345.IBPluginDependency - 346.IBPluginDependency - 347.IBPluginDependency - 348.IBPluginDependency - 35.IBPluginDependency - 350.IBPluginDependency - 352.IBPluginDependency - 353.IBPluginDependency - 354.IBPluginDependency - 355.IBPluginDependency - 356.IBPluginDependency - 358.IBPluginDependency - 36.IBPluginDependency - 361.IBPluginDependency - 362.IBPluginDependency - 363.IBPluginDependency - 364.IBPluginDependency - 365.IBPluginDependency - 366.IBPluginDependency - 37.IBAttributePlaceholdersKey - 37.IBPluginDependency - 373.IBPluginDependency - 374.IBPluginDependency - 375.IBPluginDependency - 376.IBPluginDependency - 377.IBPluginDependency - 378.IBPluginDependency - 379.IBPluginDependency - 38.IBAttributePlaceholdersKey - 38.IBPluginDependency - 380.IBPluginDependency - 382.IBAttributePlaceholdersKey - 382.IBPluginDependency - 383.IBPluginDependency - 384.IBPluginDependency - 385.IBPluginDependency - 388.IBAttributePlaceholdersKey - 388.IBPluginDependency - 389.IBPluginDependency - 39.IBAttributePlaceholdersKey - 39.IBPluginDependency - 390.IBPluginDependency - 391.IBPluginDependency - 396.IBAttributePlaceholdersKey - 396.IBPluginDependency - 397.IBPluginDependency - 398.IBAttributePlaceholdersKey - 398.IBPluginDependency - 399.IBPluginDependency - 40.IBPluginDependency - 400.IBPluginDependency - 401.IBPluginDependency - 402.IBPluginDependency - 403.IBPluginDependency - 407.IBAttributePlaceholdersKey - 407.IBPluginDependency - 408.IBAttributePlaceholdersKey - 408.IBPluginDependency - 409.IBPluginDependency - 41.IBPluginDependency - 410.IBPluginDependency - 42.IBPluginDependency - 420.IBPluginDependency - 421.IBAttributePlaceholdersKey - 421.IBPluginDependency - 422.IBPluginDependency - 423.IBPluginDependency - 427.IBAttributePlaceholdersKey - 427.IBPluginDependency - 428.IBPluginDependency - 429.IBPluginDependency - 43.IBPluginDependency - 430.IBPluginDependency - 431.IBPluginDependency - 432.IBPluginDependency - 438.IBPluginDependency - 439.IBPluginDependency - 44.IBAttributePlaceholdersKey - 44.IBPluginDependency - 440.IBPluginDependency - 441.IBPluginDependency - 442.IBPluginDependency - 443.IBPluginDependency - 450.IBPluginDependency - 451.IBPluginDependency - 453.IBPluginDependency - 454.IBPluginDependency - 457.IBPluginDependency - 458.IBPluginDependency - 46.IBAttributePlaceholdersKey - 46.IBPluginDependency - 49.IBAttributePlaceholdersKey - 49.IBPluginDependency - 5.IBPluginDependency - 50.IBAttributePlaceholdersKey - 50.IBPluginDependency - 51.IBPluginDependency - 52.IBPluginDependency - 53.IBPluginDependency - 54.IBPluginDependency - 55.IBPluginDependency - 56.IBAttributePlaceholdersKey - 56.IBPluginDependency - 57.IBPluginDependency - 58.IBPluginDependency - 59.IBPluginDependency - 6.IBAttributePlaceholdersKey - 6.IBPluginDependency - 60.IBPluginDependency - 61.IBAttributePlaceholdersKey - 61.IBPluginDependency - 62.IBPluginDependency - 63.IBPluginDependency - 64.IBPluginDependency - 65.IBPluginDependency - 66.IBAttributePlaceholdersKey - 66.IBPluginDependency - 7.IBPluginDependency - 73.IBAttributePlaceholdersKey - 73.IBPluginDependency - 74.IBAttributePlaceholdersKey - 74.IBPluginDependency - 75.IBPluginDependency - 76.IBPluginDependency - 77.IBPluginDependency - 78.IBPluginDependency - 8.IBPluginDependency - 81.IBAttributePlaceholdersKey - 81.IBPluginDependency - 82.IBPluginDependency - 83.IBPluginDependency - 84.IBPluginDependency - 85.IBPluginDependency - 86.IBAttributePlaceholdersKey - 86.IBPluginDependency - 87.IBAttributePlaceholdersKey - 87.IBPluginDependency - 88.IBAttributePlaceholdersKey - 88.IBPluginDependency - 89.IBAttributePlaceholdersKey - 89.IBPluginDependency - 9.IBPluginDependency - 90.IBAttributePlaceholdersKey - 90.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - YES - - - - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - - - - - YES - - - - - 459 - - - - YES - - HBAdvancedController - NSObject - - YES - - YES - X264AdvancedOptionsAnimate: - X264AdvancedOptionsChanged: - X264AdvancedOptionsSet: - X264AdvancedOptionsSetCurrentSettings: - X264AdvancedOptionsStandardizeOptString: - - - YES - id - id - id - id - id - - - - YES - - YES - X264AdvancedOptionsAnimate: - X264AdvancedOptionsChanged: - X264AdvancedOptionsSet: - X264AdvancedOptionsSetCurrentSettings: - X264AdvancedOptionsStandardizeOptString: - - - YES - - X264AdvancedOptionsAnimate: - id - - - X264AdvancedOptionsChanged: - id - - - X264AdvancedOptionsSet: - id - - - X264AdvancedOptionsSetCurrentSettings: - id - - - X264AdvancedOptionsStandardizeOptString: - id - - - - - YES - - YES - fDisplayLavcOptions - fDisplayLavcOptionsLabel - fDisplayTheoraOptionsLabel - fDisplayX264Options - fDisplayX264OptionsLabel - fEmptyView - fX264opt8x8dctLabel - fX264opt8x8dctSwitch - fX264optAlphaDeblockPopUp - fX264optAnalyseLabel - fX264optAnalysePopUp - fX264optAqLabel - fX264optAqSlider - fX264optBAdaptLabel - fX264optBAdaptPopUp - fX264optBPyramidLabel - fX264optBPyramidPopUp - fX264optBetaDeblockPopUp - fX264optBframesLabel - fX264optBframesPopUp - fX264optCabacLabel - fX264optCabacSwitch - fX264optDeblockLabel - fX264optDirectPredLabel - fX264optDirectPredPopUp - fX264optMERangeLabel - fX264optMERangePopUp - fX264optMotionEstLabel - fX264optMotionEstPopUp - fX264optNodctdcmtLabel - fX264optNodctdcmtSwitch - fX264optPsyRDLabel - fX264optPsyRDSlider - fX264optPsyTrellisLabel - fX264optPsyTrellisSlider - fX264optRefLabel - fX264optRefPopUp - fX264optSubmeLabel - fX264optSubmePopUp - fX264optTrellisLabel - fX264optTrellisPopUp - fX264optView - fX264optViewTitleLabel - fX264optWeightPLabel - fX264optWeightPSwitch - - - YES - NSTextField - NSTextField - NSTextField - NSTextField - NSTextField - NSView - NSTextField - NSButton - NSPopUpButton - NSTextField - NSPopUpButton - NSTextField - NSSlider - NSTextField - NSPopUpButton - NSTextField - NSPopUpButton - NSPopUpButton - NSTextField - NSPopUpButton - NSTextField - NSButton - NSTextField - NSTextField - NSPopUpButton - NSTextField - NSPopUpButton - NSTextField - NSPopUpButton - NSTextField - NSButton - NSTextField - NSSlider - NSTextField - NSSlider - NSTextField - NSPopUpButton - NSTextField - NSPopUpButton - NSTextField - NSPopUpButton - NSView - NSTextField - NSTextField - NSButton - - - - YES - - YES - fDisplayLavcOptions - fDisplayLavcOptionsLabel - fDisplayTheoraOptionsLabel - fDisplayX264Options - fDisplayX264OptionsLabel - fEmptyView - fX264opt8x8dctLabel - fX264opt8x8dctSwitch - fX264optAlphaDeblockPopUp - fX264optAnalyseLabel - fX264optAnalysePopUp - fX264optAqLabel - fX264optAqSlider - fX264optBAdaptLabel - fX264optBAdaptPopUp - fX264optBPyramidLabel - fX264optBPyramidPopUp - fX264optBetaDeblockPopUp - fX264optBframesLabel - fX264optBframesPopUp - fX264optCabacLabel - fX264optCabacSwitch - fX264optDeblockLabel - fX264optDirectPredLabel - fX264optDirectPredPopUp - fX264optMERangeLabel - fX264optMERangePopUp - fX264optMotionEstLabel - fX264optMotionEstPopUp - fX264optNodctdcmtLabel - fX264optNodctdcmtSwitch - fX264optPsyRDLabel - fX264optPsyRDSlider - fX264optPsyTrellisLabel - fX264optPsyTrellisSlider - fX264optRefLabel - fX264optRefPopUp - fX264optSubmeLabel - fX264optSubmePopUp - fX264optTrellisLabel - fX264optTrellisPopUp - fX264optView - fX264optViewTitleLabel - fX264optWeightPLabel - fX264optWeightPSwitch - - - YES - - fDisplayLavcOptions - NSTextField - - - fDisplayLavcOptionsLabel - NSTextField - - - fDisplayTheoraOptionsLabel - NSTextField - - - fDisplayX264Options - NSTextField - - - fDisplayX264OptionsLabel - NSTextField - - - fEmptyView - NSView - - - fX264opt8x8dctLabel - NSTextField - - - fX264opt8x8dctSwitch - NSButton - - - fX264optAlphaDeblockPopUp - NSPopUpButton - - - fX264optAnalyseLabel - NSTextField - - - fX264optAnalysePopUp - NSPopUpButton - - - fX264optAqLabel - NSTextField - - - fX264optAqSlider - NSSlider - - - fX264optBAdaptLabel - NSTextField - - - fX264optBAdaptPopUp - NSPopUpButton - - - fX264optBPyramidLabel - NSTextField - - - fX264optBPyramidPopUp - NSPopUpButton - - - fX264optBetaDeblockPopUp - NSPopUpButton - - - fX264optBframesLabel - NSTextField - - - fX264optBframesPopUp - NSPopUpButton - - - fX264optCabacLabel - NSTextField - - - fX264optCabacSwitch - NSButton - - - fX264optDeblockLabel - NSTextField - - - fX264optDirectPredLabel - NSTextField - - - fX264optDirectPredPopUp - NSPopUpButton - - - fX264optMERangeLabel - NSTextField - - - fX264optMERangePopUp - NSPopUpButton - - - fX264optMotionEstLabel - NSTextField - - - fX264optMotionEstPopUp - NSPopUpButton - - - fX264optNodctdcmtLabel - NSTextField - - - fX264optNodctdcmtSwitch - NSButton - - - fX264optPsyRDLabel - NSTextField - - - fX264optPsyRDSlider - NSSlider - - - fX264optPsyTrellisLabel - NSTextField - - - fX264optPsyTrellisSlider - NSSlider - - - fX264optRefLabel - NSTextField - - - fX264optRefPopUp - NSPopUpButton - - - fX264optSubmeLabel - NSTextField - - - fX264optSubmePopUp - NSPopUpButton - - - fX264optTrellisLabel - NSTextField - - - fX264optTrellisPopUp - NSPopUpButton - - - fX264optView - NSView - - - fX264optViewTitleLabel - NSTextField - - - fX264optWeightPLabel - NSTextField - - - fX264optWeightPSwitch - NSButton - - - - - IBProjectSource - ./Classes/HBAdvancedController.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - YES - - YES - NSMenuCheckmark - NSMenuMixedState - - - YES - {9, 8} - {7, 2} - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macosx/English.lproj/Audio.xib b/macosx/English.lproj/Audio.xib new file mode 100644 index 000000000..0f293b92b --- /dev/null +++ b/macosx/English.lproj/Audio.xib @@ -0,0 +1,409 @@ + + + + + + + + + + + + + + + + + + + + + keyAudioTrackName + + + + + + + + tracks + tracks.keyAudioTrackName + track + enabled + mixdownEnabled + drc + codecs + codecs.keyAudioCodecName + codec + mixdowns + mixdowns.keyAudioMixdownName + mixdown + sampleRates + sampleRates.keyAudioSampleRateName + sampleRate + bitRates + bitRates.keyAudioBitrateName + bitRate + DRCEnabled + gain + PassThruEnabled + PassThruDisabled + bitrateEnabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSNegateBoolean + + + + + + + + + diff --git a/macosx/English.lproj/ChaptersTitles.xib b/macosx/English.lproj/ChaptersTitles.xib new file mode 100644 index 000000000..2a3792b58 --- /dev/null +++ b/macosx/English.lproj/ChaptersTitles.xib @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macosx/English.lproj/InfoPlist.strings b/macosx/English.lproj/InfoPlist.strings index f1eb09da3..2d92facd6 100644 Binary files a/macosx/English.lproj/InfoPlist.strings and b/macosx/English.lproj/InfoPlist.strings differ diff --git a/macosx/English.lproj/MainMenu.xib b/macosx/English.lproj/MainMenu.xib index 1d3601fe8..aba2bb16c 100644 --- a/macosx/English.lproj/MainMenu.xib +++ b/macosx/English.lproj/MainMenu.xib @@ -1,13405 +1,1273 @@ - - - - 1050 - 12D78 - 3084 - 1187.37 - 626.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 3084 - - - YES - NSArrayController - NSBox - NSButton - NSButtonCell - NSCustomObject - NSCustomView - NSDrawer - NSImageCell - NSImageView - NSMatrix - NSMenu - NSMenuItem - NSNumberFormatter - NSOutlineView - NSPopUpButton - NSPopUpButtonCell - NSProgressIndicator - NSScrollView - NSScroller - NSSlider - NSSliderCell - NSTabView - NSTabViewItem - NSTableColumn - NSTableHeaderView - NSTableView - NSTextField - NSTextFieldCell - NSUserDefaultsController - NSView - NSWindowTemplate - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - - NSApplication - - - - FirstResponder - - - NSApplication - - - 4103 - 2 - {{41, 572}, {959, 558}} - 1886912512 - HandBrake - NSWindow - - View - - - {213, 107} - - - 256 - - YES - - - 264 - {{18, 2}, {711, 28}} - - - - YES - - 67108864 - 4325376 - RE8gTk9UIFRSQU5TTEFURSBUSElTIE5JQiBGSUxFLAo - - LucidaGrande - 11 - 3100 - - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - NO - - - - 1288 - {{18, -26}, {930, 20}} - - - - 16396 - 100 - - - - 264 - {{13, 28}, {940, 343}} - - - - - YES - - 1 - - - 256 - - YES - - - 256 - {{14, 247}, {94, 19}} - - - - YES - - 67108864 - 4194304 - Video Quality: - - - - - - NO - - - - 256 - {{170, 209}, {84, 19}} - - - - YES - - -1804599231 - 4326400 - - - - YES - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 6 - System - textColor - - - - NO - - - - 256 - {{281, 229}, {622, 16}} - - - - YES - - 67371264 - 262144 - - - - - LucidaGrande - 9 - 3614 - - - 51 - 0.0 - 19 - 0.0 - 205 - 1 - YES - NO - - NO - - - - 256 - {{16, 20}, {892, 14}} - - - - YES - - 67108864 - 4194304 - Picture Settings: - - - - - - NO - - - - 256 - {{192, 231}, {65, 14}} - - - - YES - - 67108864 - -2143158272 - - - - - YES - - YES - allowsFloats - formatterBehavior - lenient - locale - negativeInfinitySymbol - nilSymbol - numberStyle - positiveInfinitySymbol - - - YES - - - - - - - -∞ - - - +∞ - - - #,##0.### - #,##0.### - - - - - - - - NaN - - YES - - YES - - - - - - 0 - 0 - YES - NO - 1 - AAAAAAAAAAAAAAAAAAAAAA - - - - 3 - YES - YES - YES - - . - , - YES - NO - YES - - - - - - NO - - - - 256 - {{167, 231}, {28, 14}} - - - - YES - - 67108864 - 4325376 - RF: - - - - - - NO - - - - 256 - {{16, 4}, {892, 14}} - - - - YES - - 67108864 - 4194304 - Picture Filters: - - - - - - NO - - - - 256 - {{372, 272}, {158, 22}} - - - - YES - - -2076180416 - 132096 - - - 109199360 - 1 - - - - - - 400 - 75 - - - - - 1048576 - 2147483647 - 1 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - 3 - YES - YES - 1 - - NO - - - - 256 - {{279, 209}, {124, 18}} - - - - YES - - 67108864 - 131072 - 2-pass encoding - - - 1211912448 - 2 - - NSSwitch - - - - 200 - 25 - - NO - - - - 256 - {{416, 210}, {107, 16}} - - - - YES - - 67108864 - 131072 - Turbo first pass - - - 1211912448 - 2 - - NSImage - NSSwitch - - - - - 200 - 25 - - NO - - - - 256 - {{98, 272}, {149, 22}} - - - - YES - - -2076180416 - 132096 - - - 109199360 - 1 - - - - - - 400 - 75 - - - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - 3 - YES - YES - 1 - - NO - - - - 256 - {{278, 274}, {92, 17}} - - - - YES - - 67108864 - 71303168 - Framerate (FPS): - - - - - - NO - - - - 256 - {{14, 274}, {79, 17}} - - - - YES - - 67108864 - 4194304 - Video Codec: - - - - - - NO - - - - 268 - {{17, 209}, {145, 38}} - - - - YES - NO - 2 - 1 - - YES - - -2080374784 - 131072 - Constant Quality - - - 1 - 1211912448 - 0 - - NSRadioButton - - - - 200 - 25 - - - 67108864 - 131072 - Average Bitrate (kbps): - - - 1211912448 - 0 - - 549453824 - {18, 18} - - YES - - YES - - - - TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw -IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ -29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 -dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA -AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG -AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ -0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ -7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ -5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ -3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD -AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns -AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ -6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ -/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ -///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl -YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA -AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD -AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu -AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB -AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw -cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA -AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA -BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA -AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA -AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 -cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD -AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH -SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF -hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 -vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt -7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq -Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo -aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e -n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX -2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW -FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O -Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 -ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt -rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA -AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA -AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl -A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq -DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU -HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 -MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v -UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ -eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj -rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn -5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh -AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK -CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY -GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 -MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S -UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 -d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV -pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK -0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// -AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw -BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA -FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H -LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh -Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ -h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp -svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb -1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX -8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE -AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg -QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA - - - - - - 3 - MCAwAA - - - - 400 - 75 - - - {145, 18} - {4, 2} - 1151868928 - NSActionCell - - 67108864 - 0 - Radio - - LucidaGrande - 13 - 1044 - - 1211912448 - 0 - - 549453824 - {18, 18} - - YES - - YES - - - - TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw -IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ -29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 -dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA -AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG -AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ -0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ -7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ -5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ -3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD -AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns -AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ -6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ -/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ -///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl -YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA -AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD -AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu -AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB -AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - - - - - - - 400 - 75 - - - - - - - - - 268 - {{540, 255}, {157, 38}} - - - - YES - NO - 2 - 1 - - YES - - -2080374784 - 131072 - Variable Framerate - - - 1 - 1211912448 - 0 - - - - 200 - 25 - - - 67108864 - 131072 - Constant Framerate - - - 1211912448 - 0 - - 549453824 - {18, 18} - - YES - - YES - - - - TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw -IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ -29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 -dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA -AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG -AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ -0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ -7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ -5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ -3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD -AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns -AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ -6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ -/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ -///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl -YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA -AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD -AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu -AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB -AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw -cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA -AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA -BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA -AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA -AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 -cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD -AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH -SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF -hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 -vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt -7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq -Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo -aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e -n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX -2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW -FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O -Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 -ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt -rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA -AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA -AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl -A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq -DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU -HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 -MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v -UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ -eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj -rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn -5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh -AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK -CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY -GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 -MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S -UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 -d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV -pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK -0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// -AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw -BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA -FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H -LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh -Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ -h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp -svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb -1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX -8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE -AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg -QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA - - - - - - - - 400 - 75 - - - {157, 18} - {4, 2} - 1151868928 - NSActionCell - - 67108864 - 0 - Radio - - 1211912448 - 0 - - 549453824 - {18, 18} - - YES - - YES - - - - TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw -IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ -29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 -dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA -AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG -AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ -0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ -7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ -5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ -3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD -AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns -AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ -6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ -/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ -///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl -YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA -AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD -AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu -AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB -AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - - - - - - - 400 - 75 - - - - - - - - - 12 - - YES - - - 274 - - YES - - - 268 - {{243, 105}, {629, 16}} - - - - _NS:779 - YES - - -2080112384 - 262144 - - _NS:779 - - 5 - 0.0 - 0.0 - 0.0 - 2 - 1 - YES - NO - - NO - - - - 256 - {{15, 107}, {79, 13}} - - - - YES - - 67108864 - 71303168 - x264 Preset: - - - - - - NO - - - - 256 - {{15, 86}, {79, 13}} - - - - YES - - 67108864 - 71303168 - x264 Tune: - - - - - - NO - - - - 256 - {{15, 65}, {79, 13}} - - - - YES - - 67108864 - 71303168 - H.264 Profile: - - - - - - NO - - - - 256 - {{15, 43}, {79, 13}} - - - - YES - - 67108864 - 71303168 - H.264 Level: - - - - - - NO - - - - 268 - {{98, 84}, {126, 15}} - - - - _NS:868 - YES - - -2076180416 - 264192 - - _NS:868 - - 109199360 - 129 - - - 400 - 75 - - - Item 1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - Item 2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item 3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - 3 - YES - YES - 1 - - NO - - - - 268 - {{98, 63}, {126, 15}} - - - - _NS:868 - YES - - -2076180416 - 264192 - - _NS:868 - - 109199360 - 129 - - - 400 - 75 - - - Item 1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - Item 2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item 3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - 3 - YES - YES - 1 - - NO - - - - 268 - {{98, 41}, {126, 15}} - - - - _NS:868 - YES - - -2076180416 - 264192 - - _NS:868 - - 109199360 - 129 - - - 400 - 75 - - - Item 1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - Item 2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item 3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - 3 - YES - YES - 1 - - NO - - - - 268 - {{240, 84}, {108, 18}} - - - - _NS:771 - YES - - 67108864 - 131072 - Fast Decode - - _NS:771 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 256 - {{240, 65}, {110, 13}} - - - - YES - - 67108864 - 71303168 - Additional Options: - - - - - - NO - - - - 268 - {{355, 43}, {517, 36}} - - - - _NS:354 - {250, 750} - YES - - -1805647871 - 272760832 - - - _NS:354 - - YES - - - - NO - - - - 256 - {{96, 107}, {129, 13}} - - - - YES - - 67108864 - 4194304 - - - - - - - NO - - - - 268 - {{20, 127}, {209, 18}} - - - - _NS:771 - YES - - 67108864 - 131072 - Use x264 Advanced Options Panel - - _NS:771 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 256 - {{12, 6}, {863, 29}} - - - - YES - - 67108864 - 4194304 - x264 Unparse: - - - - - - NO - - - {{1, 1}, {890, 155}} - - - - _NS:21 - - - {{14, 46}, {892, 157}} - - - - _NS:18 - {0, 0} - - 67108864 - 0 - x264 Presets - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 1 - 0 - 0 - NO - - - {{10, 25}, {920, 305}} - - - - - Video - - - - - 2 - - - 256 - - YES - - - 256 - - YES - - - 268 - - YES - - - 2304 - - YES - - - 256 - {884, 236} - - - YES - NO - YES - - - 256 - {884, 17} - - - - - - - -2147483392 - {{-26, 0}, {16, 17}} - - - - - YES - - track - 323 - 40 - 1000 - - 75497536 - 2048 - Track - - - 3 - MC4zMzMzMzI5OQA - - - 6 - System - headerTextColor - - - - - -2076180416 - 133120 - - - -2038284288 - 129 - - LucidaGrande - 11 - 16 - - - - 400 - 75 - - - Pop Up - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - 3 - YES - YES - 1 - - 3 - YES - - - - codec - 141 - 10 - 3.4028229999999999e+38 - - 75497536 - 2048 - Codec - - - 6 - System - headerColor - - - - - - -2076180416 - 133120 - - - -2038284288 - 129 - - - - 400 - 75 - - - Pop Up - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - 3 - YES - YES - 1 - - 3 - YES - YES - - - - mixdown - 129 - 10 - 3.4028229999999999e+38 - - 75497536 - 2048 - Mixdown - - - - - - -2076180416 - 133120 - - - -2038284288 - 129 - - - - 400 - 75 - - - Pop Up - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - 3 - YES - YES - 1 - - 3 - YES - YES - - - - samplerate - 73 - 10 - 3.4028229999999999e+38 - - 75497536 - 2048 - Samplerate - - - - - - -2076180416 - 133120 - - - -2038284288 - 129 - - - - 400 - 75 - - - Pop Up - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - 3 - YES - YES - 1 - - 3 - YES - YES - - - - bitrate - 72 - 10 - 3.4028229999999999e+38 - - 75497536 - 2048 - Bitrate - - - - - - -2076180416 - 133120 - - - -2038284288 - 129 - - - - 400 - 75 - - - Pop Up - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - 3 - YES - YES - 1 - - 3 - YES - YES - - - - gain - 32 - 10 - 3.4028234663852886e+38 - - 75497536 - 134219776 - Gain - - - - - - -2080112384 - 131072 - - - 16 - -5 - 0.0 - 0.0 - 21 - 1 - YES - NO - 1 - - 3 - YES - YES - - - - gainText - 25 - 10 - 3.4028234663852886e+38 - - 75497536 - 2048 - - - - - - - 337641536 - 133120 - Text Cell - - - - 6 - System - controlBackgroundColor - - - - - 3 - YES - YES - - - - drc - 35 - 10 - 3.4028229999999999e+38 - - 75497536 - 134219776 - DRC - - - - - - -2080112384 - 131072 - - - 4 - 0.0 - 0.0 - 0.0 - 16 - 0 - YES - NO - 1 - - 3 - YES - YES - - - - drctext - 27 - 10 - 3.4028229999999999e+38 - - 75497536 - 2048 - - - - - - - 337641536 - 272761856 - Text - - - - - - 3 - YES - - - - 3 - 2 - - - 6 - System - gridColor - - 3 - MC41AA - - - 25 - 1379926016 - - - 4 - 15 - 0 - NO - 0 - 1 - - - {{1, 17}, {884, 236}} - - - - - 4 - - - - -2147483392 - {{-100, -100}, {15, 206}} - - - NO - - _doScroller: - 37 - 0.19473679999999999 - - - - -2147483392 - {{-100, -100}, {685, 15}} - - - NO - 1 - - _doScroller: - 0.57142859999999995 - - - - 2304 - - YES - - - {{1, 0}, {884, 17}} - - - - - 4 - - - - {{17, 17}, {886, 254}} - - - 133650 - - - - - QSAAAEEgAABB2AAAQdgAAA - 0.25 - 4 - 1 - - - - 268 - {{16, 282}, {116, 16}} - - - YES - - 67108864 - 134479872 - Add All Tracks - - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 12 - - YES - - - 274 - - YES - - - 268 - {{85, 8}, {41, 18}} - - - _NS:771 - YES - - -2080374784 - 262144 - MP3 - - _NS:771 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{130, 8}, {47, 18}} - - - _NS:771 - YES - - -2080374784 - 262144 - AAC - - _NS:771 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{179, 8}, {47, 18}} - - - _NS:771 - YES - - -2080374784 - 262144 - AC3 - - _NS:771 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{226, 8}, {48, 18}} - - - _NS:771 - YES - - -2080374784 - 262144 - DTS - - _NS:771 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{271, 8}, {58, 18}} - - - _NS:771 - YES - - -2080374784 - 262144 - DTS-HD - - _NS:771 - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{442, 8}, {100, 15}} - - - _NS:868 - YES - - -2076180416 - 264192 - - _NS:868 - - 109199360 - 129 - - - 400 - 75 - - - AC3 (ffmpeg) - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - Item 2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item 3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - - 1 - YES - YES - 2 - - NO - - - - 264 - {{2, -7}, {78, 28}} - - - YES - - 67108864 - 71565312 - Auto Passthru: - - - - - - NO - - - - 264 - {{354, 7}, {86, 14}} - - - YES - - 67108864 - 71565312 - Passthru Fallback: - - - - - - NO - - - {{1, 1}, {552, 29}} - - - _NS:21 - - - {{349, 275}, {554, 31}} - - - _NS:18 - {0, 0} - - 67108864 - 0 - Auto Passthru - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 1 - 0 - 0 - NO - - - {{0, -3}, {920, 305}} - - - - - {{10, 25}, {920, 305}} - - - Audio - - - - - 3 - - - 256 - - YES - - - 268 - - YES - - - 2304 - - YES - - - 256 - {884, 241} - - YES - NO - YES - - - 256 - {884, 17} - - - - - - -2147483392 - {{-26, 0}, {16, 17}} - - - - YES - - track - 323 - 40 - 1000 - - 75497536 - 2048 - Track - - - 3 - MC4zMzMzMzI5OQA - - - - - -2076180416 - 264192 - - - 100679680 - 129 - - - 400 - 75 - - - Pop Up - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - YES - YES - 2 - - 3 - YES - - - - forced - 75 - 10 - 3.4028229999999999e+38 - - 75497536 - 134219776 - Forced Only - - - - - - 67108864 - 131072 - Check - - - 1215582464 - 130 - - - - - 200 - 25 - - 3 - YES - YES - - - - burned - 65 - 10 - 3.4028229999999999e+38 - - 75497536 - 134219776 - Burned In - - - - - - 67108864 - 131072 - Check - - - 1215582464 - 130 - - - - - 200 - 25 - - 3 - YES - YES - - - - default - 77 - 10 - 3.4028229999999999e+38 - - 75497536 - 134219776 - Default - - - - - - 67108864 - 131072 - Check - - - 1215582464 - 130 - - - - - 200 - 25 - - 3 - YES - YES - - - - srt_lang - 148 - 10 - 3.4028229999999999e+38 - - 75497536 - 2048 - Srt Language - - - - - - -2076180416 - 133120 - - - 100679680 - 129 - - - 400 - 75 - - - Pop Up - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - 3 - YES - YES - 1 - - 3 - YES - YES - - - - srt_charcode - 104 - 10 - 3.4028229999999999e+38 - - 75497536 - 2048 - Srt Char Code - - - - - - -2076180416 - 133120 - - - 100679680 - 129 - - - 400 - 75 - - - Pop Up - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - 3 - YES - YES - 1 - - 3 - YES - YES - - - - srt_offset - 71 - 10 - 3.4028229999999999e+38 - - 75497536 - 2048 - Srt Offset - - - - - - 337641536 - 272630784 - Text - - - - - - 3 - YES - YES - - - - 3 - 2 - - - 17 - 1379926016 - - - 4 - 15 - 0 - NO - 0 - 1 - - - {{1, 17}, {884, 241}} - - - - - 4 - - - - -2147483392 - {{-100, -100}, {15, 206}} - - NO - - _doScroller: - 37 - 0.19473679999999999 - - - - -2147483392 - {{-100, -100}, {685, 15}} - - NO - 1 - - _doScroller: - 0.57142859999999995 - - - - 2304 - - YES - - - {{1, 0}, {884, 17}} - - - - - 4 - - - - {{17, 17}, {886, 259}} - - - 133650 - - - - - QSAAAEEgAABBmAAAQZgAAA - 0.25 - 4 - 1 - - - - 268 - {{16, 283}, {116, 16}} - - YES - - 67108864 - 134479872 - Add External SRT ... - - - -2038284288 - 129 - - - 200 - 25 - - NO - - - {{10, 25}, {920, 305}} - - Subtitles - - - - - 5 - - - 256 - - YES - - - 256 - - YES - - - 274 - {907, 290} - - - - {{7, 8}, {907, 290}} - - - {0, 0} - - 67108864 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxAA - - - - 0 - 3 - 0 - NO - - - {{10, 25}, {920, 305}} - - - Advanced - - - - - 4 - - - 256 - - YES - - - 256 - - YES - - - 2304 - - YES - - - 256 - {869, 242} - - - YES - NO - YES - - - 256 - {869, 17} - - - - - - - 256 - {{870, 0}, {16, 17}} - - - - - YES - - 1 - 91 - 40 - 1000 - - 75497536 - 2048 - Chapter - - - 3 - MC4zMzMzMzI5OQA - - - - - 337641536 - 2048 - Text Cell - - - - - - 3 - YES - - - - 2 - 772 - 77.217290000000006 - 1000 - - 75497536 - 2048 - Chapter Title - - - - - - 337641536 - 2048 - Text Cell - - - - - - 3 - YES - YES - - - - 3 - 2 - - - 17 - -700448768 - - - 4 - 15 - 0 - YES - 0 - 1 - - - {{1, 17}, {869, 242}} - - - - - 4 - - - - 256 - {{870, 17}, {15, 242}} - - NO - - _doScroller: - 0.9736842 - - - - -2147483392 - {{-100, -100}, {488, 15}} - - - NO - 1 - - _doScroller: - 0.99047620000000003 - - - - 2304 - - YES - - - {{1, 0}, {869, 17}} - - - - - 4 - - - - {{17, 17}, {886, 260}} - - - 133138 - - - - - AAAAAAAAAABBmAAAQZgAAA - 0.25 - 4 - 1 - - - - 256 - {{14, 283}, {151, 16}} - - - YES - - 67108864 - 131072 - Create chapter markers - - - 1211912448 - 2 - - - - 200 - 25 - - NO - - - - 268 - {{187, 283}, {107, 16}} - - YES - - 67108864 - 134479872 - Import Chapters ... - - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{307, 283}, {106, 16}} - - YES - - 67108864 - 134479872 - Export Chapters ... - - - -2038284288 - 129 - - - 200 - 25 - - NO - - - {{10, 25}, {920, 305}} - - - Chapters - - - - - - - 134217728 - YES - YES - - YES - - - - - - 268 - {{20, 530}, {45, 14}} - - - - YES - - 67108864 - 4325376 - Source: - - LucidaGrande-Bold - 11 - 3357 - - - - - - NO - - - - 264 - {{17, 501}, {35, 14}} - - - - YES - - 67108864 - 71303168 - Title: - - - - - - NO - - - - 264 - {{55, 501}, {323, 15}} - - - - YES - - -2076180416 - 263168 - - - 109199360 - 1 - - LucidaGrande - 9 - 16 - - - - - - 400 - 75 - - - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - 3 - YES - YES - 1 - - NO - - - - 264 - {{483, 500}, {77, 15}} - - - - YES - - -2076180416 - 263168 - - - 109199360 - 1 - - - - - - 400 - 75 - - YES - - - OtherViews - - - YES - - - -1 - 3 - YES - YES - 1 - - NO - - - - 264 - {{385, 498}, {46, 17}} - - - - YES - - 67108864 - 71303168 - Angle: - - - - - - NO - - - - 264 - {{433, 500}, {41, 15}} - - - - YES - - -2076180416 - 263168 - - - 109199360 - 1 - - - - - - 400 - 75 - - - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - 3 - YES - YES - 1 - - NO - - - - 264 - {{5, 444}, {47, 17}} - - - - YES - - 67108864 - 71303168 - File: - - - - - - NO - - - - 264 - {{751, 501}, {57, 14}} - - - - YES - - 67108864 - 71303168 - Duration: - - - - - - NO - - - - 264 - {{808, 501}, {79, 14}} - - - - YES - - 67108864 - 4194304 - - - - - 1 - MC43NjYzMDQzNyAtMCAwIDAAA - - - - NO - - - - 264 - {{20, 476}, {70, 14}} - - - - YES - - 67108864 - 4325376 - Destination - - - - - - NO - - - - 264 - {{76, 388}, {177, 22}} - - - - YES - - -2076180416 - 132096 - - - 109199360 - 1 - - - - - - 400 - 75 - - - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - 3 - YES - YES - 1 - - NO - - - - 264 - {{755, 440}, {90, 28}} - - - - YES - - 67108864 - 134348800 - Browse… - - - -2038284288 - 1 - - - - - - 200 - 25 - - NO - - - - 264 - {{98, 480}, {842, 5}} - - - - {0, 0} - - 67108864 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxAA - - - 3 - 2 - 0 - NO - - - - 264 - {{70, 530}, {309, 14}} - - - - YES - - 69206081 - 4327936 - - - - - 1 - MSAxIDEAA - - - - NO - - - - 264 - {{56, 445}, {684, 19}} - - - - YES - - -1804599231 - 4326400 - - - - YES - - - - NO - - - - 264 - {{571, 485}, {54, 16}} - - - - YES - - -1804599231 - 71566336 - - - - YES - - - - NO - - - - 264 - {{628, 485}, {54, 16}} - - - - YES - - -1804599231 - 71566336 - - - - YES - - - - NO - - - - 264 - {{686, 485}, {54, 16}} - - - - YES - - -1804599231 - 4457472 - - - - YES - - - - NO - - - - 264 - {{748, 485}, {54, 16}} - - - - YES - - -1804599231 - 4457472 - - - - YES - - - - NO - - - - 264 - {{20, 420}, {96, 14}} - - - - YES - - 67108864 - 4325376 - Output Settings: - - - - - - NO - - - - 264 - {{294, 424}, {646, 5}} - - - - {0, 0} - - 67108864 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxAA - - - 3 - 2 - 0 - NO - - - - 264 - {{124, 420}, {162, 14}} - - - - YES - - 67108864 - 272629760 - - - - - - - NO - - - - 264 - {{731, 15}, {218, 14}} - - - - YES - - 67108864 - 71434240 - - - - - - - NO - - - - 264 - {{21, 393}, {53, 14}} - - - - YES - - 67108864 - 71303168 - Format: - - - - - - NO - - - - 268 - {{386, 533}, {554, 5}} - - - - {0, 0} - - 67108864 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxAA - - - 3 - 2 - 0 - NO - - - - -2147483380 - {{385, 532}, {562, 12}} - - - - 16648 - 100 - - - - 264 - {{399, 391}, {141, 18}} - - - - YES - - 67108864 - 131072 - Web optimized - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 264 - {{283, 391}, {102, 18}} - - - - YES - - 67108864 - 131072 - Large file size - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 264 - {{541, 391}, {141, 18}} - - - - YES - - 67108864 - 131072 - iPod 5G support - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 264 - {{627, 500}, {56, 15}} - - - - YES - - 67108864 - 138412032 - through - - - - - - NO - - - - 264 - {{570, 500}, {57, 15}} - - - - YES - - -2076180416 - 263168 - - - 109199360 - 1 - - - - - - 400 - 75 - - - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - 3 - YES - YES - 1 - - NO - - - - 264 - {{685, 500}, {57, 15}} - - - - YES - - -2076180416 - 263168 - - - 109199360 - 1 - - - - - - 400 - 75 - - - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - 3 - YES - YES - 1 - - NO - - - {959, 558} - - - - - {{0, 0}, {1920, 1178}} - {213, 129} - {10000000000000, 10000000000000} - YES - - - MainMenu - - YES - - - HandBrake - - 1048576 - 2147483647 - - - submenuAction: - - HandBrake - - YES - - - About HandBrake - - 2147483647 - - - - - - Check for Updates… - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences... - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide HandBrake - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit HandBrake - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - - File - - - YES - - - Open Source… - o - 1048576 - 2147483647 - - - - - - Open Source (Title Specific) ... - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Add To Queue - b - 1048576 - 2147483647 - - - - - - Add All Titles To Queue ... - b - 1048576 - 2147483647 - - - - - - Start Encoding - s - 1048576 - 2147483647 - - - - - - Pause Encoding - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - - Edit - - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Paste and Match Style - V - 1572864 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - - Find - - - YES - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1048576 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling - - 1048576 - 2147483647 - - - submenuAction: - - Spelling - - YES - - - Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling as You Type - - 1048576 - 2147483647 - - - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - YES - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Presets - - 1048576 - 2147483647 - - - submenuAction: - - Presets - - YES - - - Update Built-in Presets - - 1048576 - 2147483647 - - - - - - Delete Built-in Presets - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - New Preset ... - n - 1048576 - 2147483647 - - - - - - Export ... - - 2147483647 - - - - - - Import ... - - 2147483647 - - - - - - Select Default Preset - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - - Window - - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - HandBrake - 1 - 1048576 - 2147483647 - - - - - - Queue - 2 - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Presets Drawer - t - 1048576 - 2147483647 - - - - - - Picture Settings - P - 1048576 - 2147483647 - - - - - - Preview Window - - 2147483647 - - - - - - Activity Window - D - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 1048576 - 2147483647 - - - submenuAction: - - Help - - YES - - - HandBrake User Guide - ? - 1048576 - 2147483647 - - - - - - HandBrake Homepage - - 1048576 - 2147483647 - - - - - - HandBrake Forums - - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - 3 - 2 - {{57, 765}, {300, 233}} - 1886912512 - - Panel - - NSPanel - - View - - - {213, 107} - - - 256 - - YES - - - 256 - - YES - - YES - Apple PDF pasteboard type - Apple PICT pasteboard type - Apple PNG pasteboard type - NSFilenamesPboardType - NeXT Encapsulated PostScript v1.2 pasteboard type - NeXT TIFF v4.0 pasteboard type - - - {{83, 82}, {134, 134}} - - YES - - 134217728 - 33554432 - - NSImage - HandBrake.icns - - 0 - 0 - 0 - NO - - NO - YES - - - - 256 - {{202, 12}, {84, 32}} - - YES - - 67108864 - 137887744 - Ahuh ! - - - -2038284288 - 1 - - Helvetica - 13 - 16 - - - DQ - 200 - 25 - - NO - - - - 256 - {{82, 60}, {134, 17}} - - YES - - 67108864 - 138412032 - Rip done ! - - - - - - NO - - - {300, 233} - - {{0, 0}, {1920, 1178}} - {213, 129} - {10000000000000, 10000000000000} - YES - - - - {240, 550} - {100, 50} - {280, 550} - 2 - 0.0 - 15 - - - - - - 256 - - YES - - - 274 - - YES - - - 2304 - - YES - - - 256 - {247, 506} - - YES - NO - YES - - - 256 - {{184, 0}, {16, 17}} - - - YES - - PresetName - 244 - 40 - 1000 - - 75497536 - 2048 - Presets - - - 3 - MC4zMzMzMzI5OQA - - - - - 337641536 - 2048 - Text Cell - - - - - - 1 - YES - YES - - - PresetName - YES - compare: - - - - 3 - 2 - - - 14 - 314572800 - - - 4 - 15 - 0 - YES - 0 - 1 - 12 - - - {{1, 1}, {247, 506}} - - - - - 4 - - - - 256 - {{248, 1}, {11, 506}} - - NO - 256 - - _doScroller: - 0.99770119999999995 - - - - -2147483392 - {{-100, -100}, {183, 15}} - - NO - 1 - - _doScroller: - 0.99456520000000004 - - - {{4, 31}, {260, 508}} - - - 133138 - - - - QSAAAEEgAABBgAAAQYAAAA - 0.25 - 4 - 1 - - - - 292 - {{27, 1}, {24, 23}} - - YES - - 67108864 - 0 - - - LucidaGrande-Bold - 13 - 2072 - - - -2030804992 - 34 - - NSImage - NSRemoveTemplate - - - - 400 - 75 - - NO - - - - 292 - {{4, 1}, {24, 23}} - - YES - - -2080374784 - 134217728 - - - - -2032902144 - 34 - - NSImage - NSAddTemplate - - - - 400 - 75 - - NO - - - - 292 - {{59, 1}, {33, 23}} - - YES - - 71303232 - 2048 - - - -2031075328 - 162 - - - 400 - 75 - - - YES - - - 1048576 - 2147483647 - 1 - - NSImage - NSActionTemplate - - - - _popUpItemAction: - - - YES - - Presets Action Menu - - YES - - - - Make Default - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Update Built-in Presets - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - YES - 1 - YES - YES - 2 - - NO - - - {270, 550} - NSView - NSResponder - - - 1 - 2 - {{421, 536}, {338, 318}} - 1886912512 - Create A New Preset - NSPanel - - View - - - {338, 232} - - - 256 - - YES - - - 289 - {{239, 12}, {85, 32}} - - YES - - 67108864 - 134217728 - Add - - - -2038284288 - 1 - - LucidaGrande - 13 - 16 - - - DQ - 200 - 25 - - NO - - - - 289 - {{155, 12}, {84, 32}} - - YES - - 67108864 - 134217728 - Cancel - - - -2038284288 - 1 - - - Gw - 200 - 25 - - NO - - - - 266 - {{20, 264}, {298, 19}} - - YES - - -1804599231 - 272761856 - - - - YES - - - - NO - - - - 266 - {{128, 193}, {193, 22}} - - YES - - -2076180416 - 133120 - - - 109199360 - 1 - - - - - - 400 - 75 - - - Item1 - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - - OtherViews - - - YES - - - - Item2 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - Item3 - - 1048576 - 2147483647 - - - _popUpItemAction: - - - - - 3 - YES - YES - 1 - - NO - - - - 268 - {{17, 286}, {114, 17}} - - YES - - 67108864 - 272760832 - UHJlc2V0IE5hbWU6Cg - - - - - - NO - - - - 268 - {{17, 217}, {91, 14}} - - YES - - 67108864 - 272760832 - Picture Settings: - - - - - - NO - - - - 268 - {{17, 100}, {114, 14}} - - YES - - 67108864 - 272760832 - Description: - - - - - - NO - - - - 274 - {{20, 51}, {298, 41}} - - YES - - -1805647871 - 272760832 - - - - YES - - - - NO - - - - 268 - {{27, 195}, {99, 14}} - - YES - - 67108864 - 71434240 - Use Picture Size: - - - - - - NO - - - - 268 - {{128, 142}, {24, 18}} - - YES - - -2080374784 - 131072 - - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - -2147483380 - {{17, 240}, {303, 18}} - - YES - - 67108864 - 131072 - Preset Folder ( if checked disregard below ) - - - 1211912448 - 2 - - - - - 200 - 25 - - NO - - - - 268 - {{113, 220}, {205, 5}} - - {0, 0} - - 67108864 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxAA - - - 3 - 2 - 0 - NO - - - - 268 - {{12, 120}, {298, 5}} - - {0, 0} - - 67108864 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxAA - - - 3 - 2 - 0 - NO - - - - 268 - {{17, 144}, {109, 15}} - - YES - - 67108864 - 71434240 - Use Picture Filters: - - - - - - NO - - - - 12 - - YES - - - 274 - - YES - - - 266 - {{11, 10}, {52, 16}} - - YES - - -1804599231 - 71566336 - - - - YES - - - - NO - - - - 268 - {{61, 10}, {29, 15}} - - YES - - 67108864 - 138543104 - X - - - - - - NO - - - - 266 - {{90, 10}, {52, 16}} - - YES - - -1804599231 - 4457472 - - - - YES - - - - NO - - - {155, 32} - - - - {{128, 163}, {155, 32}} - - {0, 0} - - 67108864 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 0 - 0 - 0 - NO - - - {338, 318} - - {{0, 0}, {1920, 1178}} - {338, 254} - {10000000000000, 10000000000000} - YES - - - 1 - 2 - {{302, 989}, {392, 144}} - 1886912512 - SourceTitlePanel - - NSPanel - - - View - - - {213, 107} - - - 256 - - YES - - - 256 - {{96, 45}, {279, 38}} - - YES - - 67108864 - 272629760 - Source Path Here - - - - - - NO - - - - 256 - {{155, 106}, {26, 14}} - - YES - - 67108864 - 272629760 - for - - - - - - NO - - - - 256 - {{17, 106}, {104, 15}} - - YES - - 67108864 - 71303168 - Scan title number - - - - - - NO - - - - 256 - {{126, 105}, {24, 19}} - - YES - - -1804599231 - 138544128 - 0 - - - YES - - - - NO - - - - 256 - {{15, 13}, {80, 28}} - - YES - - 67108864 - 134348800 - Cancel - - - -2038284288 - 1 - - - - - - 200 - 25 - - NO - - - - 256 - {{290, 13}, {87, 28}} - - YES - - 67108864 - 134348800 - Open Title - - - -2038284288 - 1 - - - DQ - 200 - 25 - - NO - - - - 256 - {{17, 83}, {455, 19}} - - YES - - 67108864 - 4194304 - Note: (entering 0 or leaving blank will result in a full source scan) - - - - - - NO - - - - 256 - {{17, 69}, {77, 14}} - - YES - - 67108864 - 272629760 - Source Path: - - - - - - NO - - - - 256 - {{177, 106}, {198, 14}} - - YES - - 67108864 - 272629760 - Small System Font Text - - - - - - NO - - - {392, 144} - - {{0, 0}, {1920, 1178}} - {213, 129} - {10000000000000, 10000000000000} - YES - - - HBController - - - SUUpdater - - - HBAudioController - - - - YES - keyAudioTrackName - - YES - - YES - YES - YES - YES - YES - - - - YES - tracks - tracks.keyAudioTrackName - track - enabled - mixdownEnabled - drc - codecs - codecs.keyAudioCodecName - codec - mixdowns - mixdowns.keyAudioMixdownName - mixdown - sampleRates - sampleRates.keyAudioSampleRateName - sampleRate - bitRates - bitRates.keyAudioBitrateName - bitRate - DRCEnabled - gain - PassThruEnabled - PassThruDisabled - bitrateEnabled - - YES - - YES - YES - YES - - - YES - - - - 256 - {125, 1} - - - - 256 - {125, 1} - - - - - YES - - - terminate: - - - - 139 - - - - delegate - - - - 247 - - - - hide: - - - - 972 - - - - hideOtherApplications: - - - - 975 - - - - arrangeInFront: - - - - 1194 - - - - performMiniaturize: - - - - 1195 - - - - performFindPanelAction: - - - - 1823 - - - - startSpeaking: - - - - 1824 - - - - toggleContinuousSpellChecking: - - - - 1825 - - - - undo: - - - - 1826 - - - - stopSpeaking: - - - - 1827 - - - - performFindPanelAction: - - - - 1828 - - - - redo: - - - - 1829 - - - - performFindPanelAction: - - - - 1830 - - - - cut: - - - - 1831 - - - - paste: - - - - 1832 - - - - pasteAsPlainText: - - - - 1833 - - - - selectAll: - - - - 1834 - - - - performFindPanelAction: - - - - 1835 - - - - copy: - - - - 1836 - - - - checkSpelling: - - - - 1837 - - - - centerSelectionInVisibleArea: - - - - 1838 - - - - showGuessPanel: - - - - 1839 - - - - delete: - - - - 1840 - - - - performClose: - - - - 2509 - - - - unhideAllApplications: - - - - 5281 - - - - delegate - - - - 433 - - - - fWindow - - - - 350 - - - - fStatusField - - - - 1238 - - - - fRipIndicator - - - - 1374 - - - - openHomepage: - - - - 1434 - - - - openForums: - - - - 1435 - - - - titlePopUpChanged: - - - - 1567 - - - - fSrcChapterStartPopUp - - - - 1568 - - - - fSrcChapterEndPopUp - - - - 1569 - - - - fDstBrowseButton - - - - 1578 - - - - browseFile: - - - - 1579 - - - - fDstFormatField - - - - 1583 - - - - fDstFormatPopUp - - - - 1584 - - - - fDstFile2Field - - - - 1585 - - - - fSrcDuration1Field - - - - 1589 - - - - fSrcDuration2Field - - - - 1590 - - - - fSrcDVD2Field - - - - 1591 - - - - fSrcTitleField - - - - 1592 - - - - fSrcTitlePopUp - - - - 1593 - - - - fDstFile1Field - - - - 1596 - - - - fVidBitrateField - - - - 1599 - - - - fVidEncoderPopUp - - - - 1602 - - - - fVidQualityField - - - - 1604 - - - - fVidQualitySlider - - - - 1606 - - - - fVidRateField - - - - 1607 - - - - fVidRatePopUp - - - - 1608 - - - - fVidTwoPassCheck - - - - 1611 - - - - formatPopUpChanged: - - - - 1614 - - - - chapterPopUpChanged: - - - - 1615 - - - - chapterPopUpChanged: - - - - 1616 - - - - qualitySliderChanged: - - - - 1617 - - - - fAddPresetPanel - - - - 1869 - - - - fPresetNewName - - - - 1875 - - - - closeAddPresetPanel: - - - - 1878 - - - - fPresetSelectedDisplay - - - - 1883 - - - - fPresetDrawer - - - - 1889 - - - - addUserPreset: - - - - 1907 - - - - addFactoryPresets: - - - - 1952 - - - - deleteFactoryPresets: - - - - 1953 - - - - showAddPresetPanel: - - - - 1956 - - - - openUserGuide: - - - - 1986 - - - - fCreateChapterMarkers - - - - 2004 - - - - fChapterTable - - - - 2005 - - - - fQueueStatus - - - - 2007 - - - - fPresetNewPicSettingsPopUp - - - - 2013 - - - - showDebugOutputPanel: - - - - 2296 - - - - fVidTurboPassCheck - - - - 2362 - - - - twoPassCheckboxChanged: - - - - 2363 - - - - customSettingUsed: - - - - 2366 - - - - customSettingUsed: - - - - 2367 - - - - openMainWindow: - - - - 2369 - - - - selectDefaultPreset: - - - - 2422 - - - - showQueueWindow: - - - - 2446 - - - - addToQueue: - - - - 2447 - - - - Rip: - - - - 2448 - - - - videoFrameRateChanged: - - - - 2462 - - - - showPicturePanel: - - - - 2493 - - - - Pause: - - - - 2496 - - - - fAdvancedView - - - - 2516 - - - - showPreferencesWindow: - - - - 2517 - - - - fPresetNewDesc - - - - 2674 - - - - customSettingUsed: - - - - 2691 - - - - fOpenSourceTitleMMenu - - - - 2700 - - - - fScanSrcTitlePathField - - - - 2709 - - - - fScanSrcTitleNumField - - - - 2710 - - - - fScanSrcTitleCancelButton - - - - 2711 - - - - fScanSrcTitleOpenButton - - - - 2712 - - - - fScanSrcTitlePanel - - - - 2713 - - - - closeSourceTitleScanPanel: - - - - 2714 - - - - closeSourceTitleScanPanel: - - - - 2715 - - - - browseSources: - - - - 2717 - - - - browseSources: - - - - 2718 - - - - fSrcDsplyNameTitleScan - - - - 2721 - - - - fPresetNewPicFiltersCheck - - - - 2841 - - - - fScanIndicator - - - - 3204 - - - - fPresetsOutlineView - - - - 4187 - - - - selectPreset: - - - - 4312 - - - - fPresetsDelete - - - - 4319 - - - - deletePreset: - - - - 4321 - - - - fPresetsAdd - - - - 4324 - - - - showAddPresetPanel: - - - - 4325 - - - - fDstMp4LargeFileCheck - - - - 4578 - - - - fDstMp4HttpOptFileCheck - - - - 4581 - - - - fDstMp4iPodFileCheck - - - - 4969 - - - - customSettingUsed: - - - - 4970 - - - - customSettingUsed: - - - - 4971 - - - - videoEncoderPopUpChanged: - - - - 5075 - - - - setDefaultPreset: - - - - 5138 - - - - addFactoryPresets: - - - - 5139 - - - - autoSetM4vExtension: - - - - 5152 - - - - fPresetNewFolderCheck - - - - 5155 - - - - fVidEncoderField - - - - 5156 - - - - showPreviewWindow: - - - - 5158 - - - - fPictureSettingsField - - - - 5169 - - - - fPictureFiltersField - - - - 5173 - - - - fVidQualityRFField - - - - 5176 - - - - fVidQualityRFLabel - - - - 5179 - - - - fSrcAngleLabel - - - - 5186 - - - - browseExportPresetFile: - - - - 5191 - - - - browseImportPresetFile: - - - - 5193 - - - - fSubtitlesTable - - - - 5214 - - - - showAboutPanel: - - - - 5245 - - - - fBrowseSrtFileButton - - - - 5248 - - - - browseImportSrtFile: - - - - 5249 - - - - fSrcTimeStartEncodingField - - - - 5507 - - - - fSrcTimeEndEncodingField - - - - 5508 - - - - encodeStartStopPopUpChanged: - - - - 5520 - - - - fSrcFrameStartEncodingField - - - - 5525 - - - - fSrcFrameEndEncodingField - - - - 5526 - - - - fEncodeStartStopPopUp - - - - 5527 - - - - startEndSecValueChanged: - - - - 5528 - - - - startEndSecValueChanged: - - - - 5529 - - - - startEndFrameValueChanged: - - - - 5530 - - - - startEndFrameValueChanged: - - - - 5531 - - - - fSrcChapterToField - - - - 5532 - - - - fSrcAnglePopUp - - - - 5533 - - - - browseForChapterFile: - - - - 5538 - - - - browseForChapterFileSave: - - - - 5539 - - - - fLoadChaptersButton - - - - 5540 - - - - fSaveChaptersButton - - - - 5541 - - - - fChapterTableNameColumn - - - - 5544 - - - - fPresetNewPicWidth - - - - 5668 - - - - fPresetNewPicHeight - - - - 5669 - - - - fPresetNewPicWidthHeightBox - - - - 5671 - - - - addPresetPicDropdownChanged: - - - - 5672 - - - - fAudioDelegate - - - - 5675 - - - - addAllAudioTracks: - - - - 5709 - - - - fVidQualityMatrix - - - - 5812 - - - - fVidBitrateCell - - - - 5813 - - - - fVidConstantCell - - - - 5814 - - - - videoMatrixChanged: - - - - 5815 - - - - videoMatrixChanged: - - - - 5816 - - - - videoMatrixChanged: - - - - 5824 - - - - videoMatrixChanged: - - - - 5825 - - - - fFramerateMatrix - - - - 5826 - - - - fFramerateVfrPfrCell - - - - 5827 - - - - fFramerateCfrCell - - - - 5828 - - - - addAllTitlesToQueue: - - - - 5899 - - - - fAudioAllowMP3PassCheck - - - - 5925 - - - - fAudioAllowAACPassCheck - - - - 5926 - - - - fAudioAllowAC3PassCheck - - - - 5927 - - - - fAudioAllowDTSPassCheck - - - - 5928 - - - - fAudioAllowDTSHDPassCheck - - - - 5929 - - - - fAudioFallbackPopUp - - - - 5930 - - - - fAudioAutoPassthruBox - - - - 5931 - - - - fX264PresetsBox - - - - 5973 - - - - fX264TunePopUp - - - - 5974 - - - - fX264ProfilePopUp - - - - 5975 - - - - fX264LevelPopUp - - - - 5976 - - - - fX264FastDecodeCheck - - - - 5977 - - - - fDisplayX264PresetsAdditonalOptionsTextField - - - - 5979 - - - - fX264PresetsSlider - - - - 5980 - - - - fX264PresetSelectedTextField - - - - 5983 - - - - x264PresetsSliderChanged: - - - - 5984 - - - - fX264PresetSliderLabel - - - - 5985 - - - - fX264TunePopUpLabel - - - - 5986 - - - - fX264ProfilePopUpLabel - - - - 5987 - - - - fX264LevelPopUpLabel - - - - 5988 - - - - fDisplayX264PresetsAdditonalOptionsLabel - - - - 5989 - - - - fX264UseAdvancedOptionsCheck - - - - 5994 - - - - updateX264Widgets: - - - - 5995 - - - - fDisplayX264PresetsUnparseTextField - - - - 5998 - - - - x264PresetsChangedDisplayExpandedOptions: - - - - 5999 - - - - x264PresetsChangedDisplayExpandedOptions: - - - - 6000 - - - - x264PresetsChangedDisplayExpandedOptions: - - - - 6001 - - - - x264PresetsChangedDisplayExpandedOptions: - - - - 6002 - - - - x264PresetsChangedDisplayExpandedOptions: - - - - 6003 - - - - fScanHorizontalLine - - - - 6004 - - - - parentWindow - - - - 1842 - - - - contentView - - - - 1844 - - - - toggle: - - - - 1885 - - - - dataSource - - - - 4188 - - - - delegate - - - - 4189 - - - - checkForUpdates: - - - - 4966 - - - - contentArray: audioArray - - - - - - contentArray: audioArray - contentArray - audioArray - 2 - - - 5679 - - - - enabled: hasValidPresetSelected - - - - - - enabled: hasValidPresetSelected - enabled - hasValidPresetSelected - 2 - - - 5711 - - - - value: arrangedObjects.drc - - - - - - value: arrangedObjects.drc - value - arrangedObjects.drc - - NSCreatesSortDescriptor - - - 2 - - - 5791 - - - - enabled: arrangedObjects.DRCEnabled - - - - - - enabled: arrangedObjects.DRCEnabled - enabled - arrangedObjects.DRCEnabled - 2 - - - 5793 - - - - value: arrangedObjects.drc - - - - - - value: arrangedObjects.drc - value - arrangedObjects.drc - - YES - - YES - NSCreatesSortDescriptor - NSValidatesImmediately - - - YES - - - - - 2 - - - 5790 - - - - enabled: arrangedObjects.DRCEnabled - - - - - - enabled: arrangedObjects.DRCEnabled - enabled - arrangedObjects.DRCEnabled - 2 - - - 5792 - - - - content: arrangedObjects.bitRates - - - - - - content: arrangedObjects.bitRates - content - arrangedObjects.bitRates - 2 - - - 5766 - - - - contentValues: arrangedObjects.bitRates.keyAudioBitrateName - - - - - - contentValues: arrangedObjects.bitRates.keyAudioBitrateName - contentValues - arrangedObjects.bitRates.keyAudioBitrateName - - 2 - - - 5768 - - - - selectedObject: arrangedObjects.bitRate - - - - - - selectedObject: arrangedObjects.bitRate - selectedObject - arrangedObjects.bitRate - - NSCreatesSortDescriptor - - - - 2 - - - 5789 - - - - enabled: arrangedObjects.bitrateEnabled - - - - - - enabled: arrangedObjects.bitrateEnabled - enabled - arrangedObjects.bitrateEnabled - 2 - - - 5903 - - - - content: arrangedObjects.sampleRates - - - - - - content: arrangedObjects.sampleRates - content - arrangedObjects.sampleRates - 2 - - - 5760 - - - - contentValues: arrangedObjects.sampleRates.keyAudioSampleRateName - - - - - - contentValues: arrangedObjects.sampleRates.keyAudioSampleRateName - contentValues - arrangedObjects.sampleRates.keyAudioSampleRateName - - 2 - - - 5762 - - - - enabled: arrangedObjects.mixdownEnabled - - - - - - enabled: arrangedObjects.mixdownEnabled - enabled - arrangedObjects.mixdownEnabled - 2 - - - 5778 - - - - selectedObject: arrangedObjects.sampleRate - - - - - - selectedObject: arrangedObjects.sampleRate - selectedObject - arrangedObjects.sampleRate - - NSCreatesSortDescriptor - - - - 2 - - - 5788 - - - - content: arrangedObjects.mixdowns - - - - - - content: arrangedObjects.mixdowns - content - arrangedObjects.mixdowns - 2 - - - 5754 - - - - contentValues: arrangedObjects.mixdowns.keyAudioMixdownName - - - - - - contentValues: arrangedObjects.mixdowns.keyAudioMixdownName - contentValues - arrangedObjects.mixdowns.keyAudioMixdownName - - 2 - - - 5756 - - - - selectedObject: arrangedObjects.mixdown - - - - - - selectedObject: arrangedObjects.mixdown - selectedObject - arrangedObjects.mixdown - - NSCreatesSortDescriptor - - - - 2 - - - 5787 - - - - enabled: arrangedObjects.mixdownEnabled - - - - - - enabled: arrangedObjects.mixdownEnabled - enabled - arrangedObjects.mixdownEnabled - 2 - - - 5901 - - - - content: arrangedObjects.codecs - - - - - - content: arrangedObjects.codecs - content - arrangedObjects.codecs - 2 - - - 5747 - - - - contentValues: arrangedObjects.codecs.keyAudioCodecName - - - - - - contentValues: arrangedObjects.codecs.keyAudioCodecName - contentValues - arrangedObjects.codecs.keyAudioCodecName - - 2 - - - 5749 - - - - enabled: arrangedObjects.enabled - - - - - - enabled: arrangedObjects.enabled - enabled - arrangedObjects.enabled - 2 - - - 5774 - - - - selectedObject: arrangedObjects.codec - - - - - - selectedObject: arrangedObjects.codec - selectedObject - arrangedObjects.codec - - NSCreatesSortDescriptor - - - - 2 - - - 5786 - - - - content: arrangedObjects - - - - - - content: arrangedObjects - content - arrangedObjects - 2 - - - 5886 - - - - contentValues: arrangedObjects.keyAudioTrackName - - - - - - contentValues: arrangedObjects.keyAudioTrackName - contentValues - arrangedObjects.keyAudioTrackName - - 2 - - - 5891 - - - - selectedObject: arrangedObjects.track - - - - - - selectedObject: arrangedObjects.track - selectedObject - arrangedObjects.track - - NSCreatesSortDescriptor - - - - 2 - - - 5892 - - - - value: arrangedObjects.gain - - - - - - value: arrangedObjects.gain - value - arrangedObjects.gain - - YES - - YES - NSCreatesSortDescriptor - NSValidatesImmediately - - - YES - - - - - 2 - - - 5877 - - - - enabled: arrangedObjects.PassThruDisabled - - - - - - enabled: arrangedObjects.PassThruDisabled - enabled - arrangedObjects.PassThruDisabled - 2 - - - 5878 - - - - value: arrangedObjects.gain - - - - - - value: arrangedObjects.gain - value - arrangedObjects.gain - 2 - - - 5875 - - - - enabled: arrangedObjects.PassThruDisabled - - - - - - enabled: arrangedObjects.PassThruDisabled - enabled - arrangedObjects.PassThruDisabled - - NSRaisesForNotApplicableKeys - - - 2 - - - 5876 - - - - contentArray: masterTrackArray - - - - - - contentArray: masterTrackArray - contentArray - masterTrackArray - 2 - - - 5882 - - - - - YES - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 21 - - - YES - - - - MainWindow - - - 2 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1123 - - - YES - - - - - - 1373 - - - - - 1474 - - - YES - - - - - - - - - - 1475 - - - YES - - - - - - 1476 - - - YES - - - - - - 1477 - - - YES - - - - - - 1478 - - - YES - - - - - - - - - - - - - - - - - - - - - 1499 - - - YES - - - - - - 1505 - - - YES - - - - - - 1506 - - - YES - - - - - - 1507 - - - YES - - - - - - 1508 - - - YES - - - - - - 1509 - - - YES - - - - - - 1512 - - - YES - - - - - - 1515 - - - YES - - - - - - 2361 - - - YES - - - - - - 1989 - - - YES - - - - - - 1990 - - - YES - - - - - - - - - 1999 - - - YES - - - - - - - - - 2000 - - - YES - - - - - - - 2001 - - - YES - - - - - - 2002 - - - YES - - - - - - 2003 - - - YES - - - - - - 2015 - - - YES - - - - - - 2016 - - - YES - - - - - - 2513 - - - YES - - - - - 1538 - - - YES - - - - - - 1539 - - - YES - - - - - - 1540 - - - YES - - - - - - 1541 - - - YES - - - - - - 1545 - - - YES - - - - - - 1548 - - - YES - - - - - - 1552 - - - YES - - - - - - 1553 - - - YES - - - - - - 1554 - - - YES - - - - - - 1555 - - - YES - - - - - - 1556 - - - YES - - - - - - 1557 - - - YES - - - - - - 1561 - - - YES - - - - - - 1562 - - - YES - - - - - - 1623 - - - YES - - - - - 1627 - - - YES - - - - - - 1628 - - - YES - - - - - 1882 - - - YES - - - - - - 2006 - - - YES - - - - - - 2364 - - - YES - - - - - - 3203 - - - - - 3205 - - - - - 4579 - - - YES - - - - - - 29 - - - YES - - - - - - - - - MainMenu - - - 56 - - - YES - - - - - - 57 - - - YES - - - - - - - - - - - - - - - 58 - - - - - 136 - - - - - 196 - - - - - 970 - - - - - 971 - - - - - 973 - - - - - 1445 - - - - - 1900 - - - - - 1189 - - - YES - - - - - - 1192 - - - YES - - - - - - - - - - - - - - - 1190 - - - - - 1191 - - - - - 1193 - - - - - 1884 - - - - - 2295 - - - - - 2368 - - - - - 2445 - - - - - 2488 - - - - - 2519 - - - - - 1200 - - - YES - - - - - - 1209 - - - YES - - - - - - - - - - - - - - 1198 - - - - - 2443 - - - - - 2444 - - - - - 2494 - - - - - 2507 - - - - - 2508 - - - - - 2518 - - - - - 2698 - - - - - 1431 - - - YES - - - - - - 1429 - - - YES - - - - - - - - 1432 - - - - - 1433 - - - - - 1985 - - - - - 1795 - - - YES - - - - - - 1796 - - - YES - - - - - - - - - - - - - - - - - - 1797 - - - - - 1798 - - - - - 1799 - - - - - 1800 - - - - - 1801 - - - - - 1802 - - - YES - - - - - - 1803 - - - YES - - - - - - - - - - 1804 - - - - - 1805 - - - - - 1806 - - - - - 1807 - - - - - 1808 - - - - - 1809 - - - - - 1810 - - - YES - - - - - - 1811 - - - YES - - - - - - - - 1812 - - - - - 1813 - - - - - 1814 - - - - - 1815 - - - - - 1816 - - - - - 1817 - - - YES - - - - - - 1818 - - - YES - - - - - - - 1819 - - - - - 1820 - - - - - 1821 - - - - - 1822 - - - - - 1948 - - - YES - - - - - - 1949 - - - YES - - - - - - - - - - - - 1950 - - - - - 1951 - - - - - 1954 - - - - - 1955 - - - - - 2421 - - - - - 240 - - - HBController - - - 434 - - - YES - - - - DonePanel - - - 435 - - - YES - - - - - - - - 436 - - - YES - - - - - - 437 - - - YES - - - - - - 438 - - - YES - - - - - - 1841 - - - PresetsDrawer - - - 1843 - - - YES - - - - - - - PresetsView - - - 4179 - - - YES - - - - - - - - 4182 - - - YES - - - - - - 4183 - - - YES - - - - - - 4186 - - - - - 4317 - - - YES - - - - - - 4322 - - - YES - - - - - - 1867 - - - YES - - - - AddPresetPanel - - - 1868 - - - YES - - - - - - - - - - - - - - - - - - - - 1870 - - - YES - - - - - - 1871 - - - YES - - - - - - 1872 - - - YES - - - - - - 2008 - - - YES - - - - - - 2670 - - - YES - - - - - - 2671 - - - YES - - - - - - 2672 - - - YES - - - - - - 2673 - - - YES - - - - - - 2833 - - - YES - - - - - - 2837 - - - YES - - - - - - 2839 - - - - - 2840 - - - - - 2957 - - - YES - - - - - - 2701 - - - YES - - - - SourceTitlePanel - - - 2702 - - - YES - - - - - - - - - - - - - - 2703 - - - YES - - - - - - 2704 - - - YES - - - - - - 2705 - - - YES - - - - - - 2706 - - - YES - - - - - - 2707 - - - YES - - - - - - 2708 - - - YES - - - - - - 2716 - - - YES - - - - - - 2719 - - - YES - - - - - - 2720 - - - YES - - - - - - 4846 - - - - - 4872 - - - - - 4874 - - - - - 4875 - - - - - 4876 - - - - - 4877 - - - - - 4878 - - - YES - - - - - - 4879 - - - YES - - - - - - 4880 - - - - - 4892 - - - - - 4904 - - - - - 4905 - - - - - 4906 - - - - - 4907 - - - - - 4908 - - - YES - - - - - - 4910 - - - YES - - - - - - 4911 - - - YES - - - - - - 4913 - - - - - 4914 - - - - - 4915 - - - - - 4916 - - - - - 4917 - - - - - 4918 - - - YES - - - - - - 4919 - - - - - 4920 - - - - - 4923 - - - - - 4924 - - - - - 4925 - - - - - 4926 - - - - - 4927 - - - - - 4928 - - - - - 4929 - - - - - 4930 - - - - - 4932 - - - - - 4933 - - - - - 4934 - - - - - 4935 - - - - - 4936 - - - - - 4937 - - - YES - - - - - - 4938 - - - - - 4939 - - - - - 4940 - - - - - 4941 - - - - - 4942 - - - - - 4943 - - - - - 4944 - - - - - 4945 - - - - - 4946 - - - - - 4947 - - - - - 4948 - - - - - 4949 - - - - - 4950 - - - - - 4951 - - - - - 4952 - - - - - 4953 - - - - - 4955 - - - - - 4956 - - - - - 1510 - - - YES - - - - - - 1511 - - - - - 1513 - - - YES - - - - - - 1514 - - - - - 1542 - - - YES - - - - - - 1543 - - - - - 1546 - - - YES - - - - - - 1547 - - - - - 1549 - - - YES - - - - - - 1550 - - - - - 1558 - - - YES - - - - - - 1559 - - - - - 2009 - - - YES - - - - - - - - 2012 - - - - - 2011 - - - - - 2010 - - - - - 4957 - - - - - 4958 - - - - - 4959 - - - - - 4960 - - - - - 4961 - - - - - 4963 - - - - - 4964 - - - - - 4967 - - - YES - - - - - - 4968 - - - - - 5130 - - - YES - - - - - - 5131 - - - YES - - - - - - 5132 - - - YES - - - - - - - - 5133 - - - - - 5134 - - - - - 5135 - - - - - 5153 - - - YES - - - - - - 5154 - - - - - 5157 - - - - - 5167 - - - YES - - - - - - 5168 - - - - - 5171 - - - YES - - - - - - 5172 - - - - - 5174 - - - YES - - - - - - 5175 - - - YES - - - - - - 5177 - - - YES - - - - - - 5178 - - - - - 5180 - - - YES - - - - - - 5181 - - - YES - - - - - - 5182 - - - YES - - - - - - 5183 - - - YES - - - - - - 5184 - - - - - 5185 - - - - - 5188 - - - - - 5192 - - - - - 5194 - - - YES - - - - - - 5195 - - - YES - - - - - - - 5196 - - - YES - - - - - - - - - 5197 - - - - - 5198 - - - - - 5199 - - - YES - - - - - - - - - - - - 5201 - - - YES - - - - - - 5215 - - - YES - - - - - - 5217 - - - YES - - - - - - 5219 - - - YES - - - - - - 5225 - - - YES - - - - - - 5226 - - - YES - - - - - - 5227 - - - - - 5232 - - - - - 5233 - - - - - 5234 - - - - - 5244 - - - - - 5246 - - - YES - - - - - - 5247 - - - - - 5250 - - - YES - - - - - - 5252 - - - YES - - - - - - 5254 - - - YES - - - - - - 5268 - - - YES - - - - - - 5269 - - - YES - - - - - - 5270 - - - - - 5271 - - - YES - - - - - - 5272 - - - YES - - - - - - 5273 - - - - - 5278 - - - - - 5279 - - - - - 5280 - - - - - 5491 - - - YES - - - - - - 5492 - - - - - 5493 - - - YES - - - - - - 5494 - - - - - 5505 - - - YES - - - - - - 5506 - - - - - 5513 - - - YES - - - - - - 5514 - - - YES - - - - - - 5515 - - - YES - - - - - 5521 - - - YES - - - - - - 5522 - - - - - 5523 - - - YES - - - - - - 5524 - - - - - 5534 - - - YES - - - - - - 5535 - - - - - 5536 - - - YES - - - - - - 5537 - - - - - 5670 - - - YES - - - - - - - - 5549 - - - YES - - - - - - 5550 - - - - - 5553 - - - YES - - - - - - 5554 - - - - - 5551 - - - YES - - - - - - 5552 - - - - - 5673 - - - Audio Controller - - - 5674 - - - Audios - - - 5676 - - - - - 5680 - - - YES - - - - - - - - 5681 - - - YES - - - - - - 5682 - - - YES - - - - - - - - - 5683 - - - - - 5684 - - - YES - - - - - - - - - - - - - - 5685 - - - - - 5686 - - - - - 5687 - - - YES - - - - - - 5688 - - - YES - - - - - - 5689 - - - YES - - - - - - 5690 - - - YES - - - - - - 5691 - - - YES - - - - - - 5692 - - - YES - - - - - - 5693 - - - YES - - - - - - 5694 - - - YES - - - - - - 5695 - - - YES - - - - - - 5696 - - - - - 5706 - - - - - 5707 - - - - - 5712 - - - YES - - - - - - 5713 - - - YES - - - - - - 5714 - - - - - 5715 - - - YES - - - - - - 5716 - - - YES - - - - - - 5717 - - - - - 5718 - - - YES - - - - - - 5719 - - - YES - - - - - - 5720 - - - - - 5721 - - - YES - - - - - - 5722 - - - YES - - - - - - 5723 - - - - - 5724 - - - - - 5808 - - - YES - - - - - - - - 5809 - - - - - 5810 - - - - - 5811 - - - - - 5820 - - - YES - - - - - - - - 5821 - - - - - 5822 - - - - - 5823 - - - - - 5871 - - - YES - - - - - - 5872 - - - YES - - - - - - 5873 - - - - - 5874 - - - - - 5879 - - - Audio Inputs - - - 5897 - - - - - 1624 - - - - - 1629 - - - - - 5920 - - - YES - - - - - - - - - - - - - 5904 - - - YES - - - - - - 5905 - - - - - 5906 - - - YES - - - - - - 5907 - - - - - 5908 - - - YES - - - - - - 5909 - - - - - 5910 - - - YES - - - - - - 5911 - - - - - 5912 - - - YES - - - - - - 5913 - - - - - 5914 - - - YES - - - - - - 5915 - - - YES - - - - - - 5916 - - - YES - - - - - - - - 5919 - - - - - 5918 - - - - - 5917 - - - - - 5921 - - - YES - - - - - - 5922 - - - - - 5923 - - - YES - - - - - - 5924 - - - - - 5934 - - - YES - - - - - - - - - - - - - - - - - - - 5932 - - - YES - - - - - - 5933 - - - - - 5937 - - - YES - - - - - - 5938 - - - - - 5939 - - - YES - - - - - - 5940 - - - - - 5941 - - - YES - - - - - - 5942 - - - - - 5943 - - - YES - - - - - - 5944 - - - - - 5945 - - - YES - - - - - - 5946 - - - YES - - - - - - 5947 - - - YES - - - - - - - - 5948 - - - - - 5949 - - - - - 5950 - - - - - 5951 - - - YES - - - - - - 5952 - - - YES - - - - - - 5953 - - - YES - - - - - - - - 5954 - - - - - 5955 - - - - - 5956 - - - - - 5957 - - - YES - - - - - - 5958 - - - YES - - - - - - 5959 - - - YES - - - - - - - - 5960 - - - - - 5961 - - - - - 5962 - - - - - 5963 - - - YES - - - - - - 5964 - - - - - 5967 - - - YES - - - - - - 5968 - - - - - 5971 - - - YES - - - - - - 5972 - - - - - 5981 - - - YES - - - - - - 5982 - - - - - 5992 - - - YES - - - - - - 5993 - - - - - 5996 - - - YES - - - - - - 5997 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 1123.IBPluginDependency - 1189.IBPluginDependency - 1190.IBPluginDependency - 1191.IBPluginDependency - 1192.IBPluginDependency - 1193.IBPluginDependency - 1198.IBPluginDependency - 1200.IBPluginDependency - 1209.IBPluginDependency - 136.IBPluginDependency - 1373.IBPluginDependency - 1429.IBPluginDependency - 1431.IBPluginDependency - 1432.IBPluginDependency - 1433.IBPluginDependency - 1445.IBPluginDependency - 1474.IBAttributePlaceholdersKey - 1474.IBPluginDependency - 1475.IBPluginDependency - 1476.IBPluginDependency - 1477.IBPluginDependency - 1478.IBPluginDependency - 1499.IBPluginDependency - 1505.IBPluginDependency - 1506.IBPluginDependency - 1507.IBPluginDependency - 1508.IBPluginDependency - 1509.IBPluginDependency - 1510.IBPluginDependency - 1511.IBPluginDependency - 1512.IBPluginDependency - 1513.IBPluginDependency - 1514.IBPluginDependency - 1515.IBPluginDependency - 1538.IBPluginDependency - 1539.IBPluginDependency - 1540.IBPluginDependency - 1541.IBPluginDependency - 1542.IBPluginDependency - 1543.IBPluginDependency - 1545.IBPluginDependency - 1546.IBPluginDependency - 1547.IBPluginDependency - 1548.IBPluginDependency - 1549.IBPluginDependency - 1550.IBPluginDependency - 1552.IBPluginDependency - 1553.IBPluginDependency - 1554.IBPluginDependency - 1555.IBPluginDependency - 1556.IBPluginDependency - 1557.IBPluginDependency - 1558.IBPluginDependency - 1559.IBPluginDependency - 1561.IBPluginDependency - 1562.IBPluginDependency - 1623.IBPluginDependency - 1624.IBPluginDependency - 1627.IBPluginDependency - 1628.IBPluginDependency - 1629.IBPluginDependency - 1795.IBPluginDependency - 1796.IBPluginDependency - 1797.IBPluginDependency - 1798.IBPluginDependency - 1799.IBPluginDependency - 1800.IBPluginDependency - 1801.IBPluginDependency - 1802.IBPluginDependency - 1803.IBPluginDependency - 1804.IBPluginDependency - 1805.IBPluginDependency - 1806.IBPluginDependency - 1807.IBPluginDependency - 1808.IBPluginDependency - 1809.IBPluginDependency - 1810.IBPluginDependency - 1811.IBPluginDependency - 1812.IBPluginDependency - 1813.IBPluginDependency - 1814.IBPluginDependency - 1815.IBPluginDependency - 1816.IBPluginDependency - 1817.IBPluginDependency - 1818.IBPluginDependency - 1819.IBPluginDependency - 1820.IBPluginDependency - 1821.IBPluginDependency - 1822.IBPluginDependency - 1841.IBPluginDependency - 1843.IBPluginDependency - 1867.IBPluginDependency - 1867.IBWindowTemplateEditedContentRect - 1868.IBPluginDependency - 1870.IBPluginDependency - 1871.IBPluginDependency - 1872.IBPluginDependency - 1882.IBPluginDependency - 1884.IBPluginDependency - 1900.IBPluginDependency - 1948.IBPluginDependency - 1949.IBPluginDependency - 1950.IBPluginDependency - 1951.IBPluginDependency - 1954.IBPluginDependency - 1955.IBPluginDependency - 196.IBPluginDependency - 1985.IBPluginDependency - 1989.IBPluginDependency - 1990.IBPluginDependency - 1999.IBPluginDependency - 2.IBPluginDependency - 2000.IBPluginDependency - 2001.IBPluginDependency - 2002.IBPluginDependency - 2003.IBPluginDependency - 2006.IBPluginDependency - 2008.IBPluginDependency - 2009.IBPluginDependency - 2010.IBPluginDependency - 2011.IBPluginDependency - 2012.IBPluginDependency - 2015.IBPluginDependency - 2016.IBPluginDependency - 21.IBPluginDependency - 21.IBWindowTemplateEditedContentRect - 2295.IBPluginDependency - 2361.IBPluginDependency - 2364.IBAttributePlaceholdersKey - 2364.IBPluginDependency - 2368.IBPluginDependency - 240.IBPluginDependency - 2421.IBPluginDependency - 2443.IBPluginDependency - 2444.IBPluginDependency - 2445.IBPluginDependency - 2488.IBPluginDependency - 2494.IBPluginDependency - 2507.IBPluginDependency - 2508.IBPluginDependency - 2513.IBPluginDependency - 2518.IBPluginDependency - 2519.IBPluginDependency - 2670.IBPluginDependency - 2671.IBPluginDependency - 2672.IBPluginDependency - 2673.IBPluginDependency - 2698.IBPluginDependency - 2701.IBPluginDependency - 2701.IBWindowTemplateEditedContentRect - 2702.IBPluginDependency - 2703.IBPluginDependency - 2704.IBPluginDependency - 2705.IBPluginDependency - 2706.IBPluginDependency - 2707.IBPluginDependency - 2708.IBPluginDependency - 2716.IBPluginDependency - 2719.IBPluginDependency - 2720.IBPluginDependency - 2833.IBPluginDependency - 2837.IBPluginDependency - 2839.IBPluginDependency - 2840.IBPluginDependency - 29.IBPluginDependency - 2957.IBPluginDependency - 3203.IBPluginDependency - 3205.IBPluginDependency - 4179.IBPluginDependency - 4182.CustomClassName - 4182.IBPluginDependency - 4183.IBPluginDependency - 4186.IBPluginDependency - 4317.IBPluginDependency - 4322.IBPluginDependency - 434.IBPluginDependency - 434.IBWindowTemplateEditedContentRect - 435.IBPluginDependency - 436.IBPluginDependency - 437.IBPluginDependency - 438.IBPluginDependency - 4579.IBAttributePlaceholdersKey - 4579.IBPluginDependency - 4846.IBPluginDependency - 4872.IBPluginDependency - 4874.IBPluginDependency - 4875.IBPluginDependency - 4876.IBPluginDependency - 4877.IBPluginDependency - 4878.IBPluginDependency - 4879.IBPluginDependency - 4880.IBPluginDependency - 4892.IBPluginDependency - 4904.IBPluginDependency - 4905.IBPluginDependency - 4906.IBPluginDependency - 4907.IBPluginDependency - 4908.IBPluginDependency - 4910.IBPluginDependency - 4911.IBPluginDependency - 4913.IBPluginDependency - 4914.IBPluginDependency - 4915.IBPluginDependency - 4916.IBPluginDependency - 4917.IBPluginDependency - 4918.IBPluginDependency - 4919.IBPluginDependency - 4920.IBPluginDependency - 4923.IBPluginDependency - 4924.IBPluginDependency - 4925.IBPluginDependency - 4926.IBPluginDependency - 4927.IBPluginDependency - 4928.IBPluginDependency - 4929.IBPluginDependency - 4930.IBPluginDependency - 4932.IBPluginDependency - 4933.IBPluginDependency - 4934.IBPluginDependency - 4935.IBPluginDependency - 4936.IBPluginDependency - 4937.IBPluginDependency - 4938.IBPluginDependency - 4939.IBPluginDependency - 4940.IBPluginDependency - 4941.IBPluginDependency - 4942.IBPluginDependency - 4943.IBPluginDependency - 4944.IBPluginDependency - 4945.IBPluginDependency - 4946.IBPluginDependency - 4947.IBPluginDependency - 4948.IBPluginDependency - 4949.IBPluginDependency - 4950.IBPluginDependency - 4951.IBPluginDependency - 4952.IBPluginDependency - 4953.IBPluginDependency - 4955.IBPluginDependency - 4955.IBShouldRemoveOnLegacySave - 4956.IBPluginDependency - 4956.IBShouldRemoveOnLegacySave - 4957.IBPluginDependency - 4957.IBShouldRemoveOnLegacySave - 4958.IBPluginDependency - 4958.IBShouldRemoveOnLegacySave - 4959.IBPluginDependency - 4959.IBShouldRemoveOnLegacySave - 4960.IBPluginDependency - 4960.IBShouldRemoveOnLegacySave - 4961.IBPluginDependency - 4961.IBShouldRemoveOnLegacySave - 4963.IBPluginDependency - 4964.IBPluginDependency - 4967.IBAttributePlaceholdersKey - 4967.IBPluginDependency - 4968.IBPluginDependency - 5130.IBPluginDependency - 5131.IBPluginDependency - 5132.IBPluginDependency - 5133.IBPluginDependency - 5134.IBPluginDependency - 5135.IBPluginDependency - 5153.IBPluginDependency - 5154.IBPluginDependency - 5157.IBPluginDependency - 5167.IBPluginDependency - 5168.IBPluginDependency - 5171.IBPluginDependency - 5172.IBPluginDependency - 5174.IBPluginDependency - 5175.IBPluginDependency - 5177.IBPluginDependency - 5178.IBPluginDependency - 5180.IBPluginDependency - 5181.IBPluginDependency - 5182.IBPluginDependency - 5183.IBPluginDependency - 5184.IBPluginDependency - 5185.IBPluginDependency - 5188.IBPluginDependency - 5192.IBPluginDependency - 5194.IBPluginDependency - 5195.IBPluginDependency - 5196.IBPluginDependency - 5197.IBPluginDependency - 5198.IBPluginDependency - 5199.IBPluginDependency - 5201.IBPluginDependency - 5215.IBPluginDependency - 5217.IBPluginDependency - 5219.IBPluginDependency - 5225.IBPluginDependency - 5226.IBPluginDependency - 5227.IBPluginDependency - 5232.IBPluginDependency - 5233.IBPluginDependency - 5234.IBPluginDependency - 5244.IBPluginDependency - 5246.IBPluginDependency - 5247.IBPluginDependency - 5250.IBPluginDependency - 5252.IBPluginDependency - 5254.IBPluginDependency - 5268.IBPluginDependency - 5269.IBPluginDependency - 5270.IBPluginDependency - 5271.IBPluginDependency - 5272.IBPluginDependency - 5273.IBPluginDependency - 5278.IBPluginDependency - 5279.IBNumberFormatterBehaviorMetadataKey - 5279.IBNumberFormatterLocalizesFormatMetadataKey - 5279.IBPluginDependency - 5280.IBPluginDependency - 5491.IBPluginDependency - 5492.IBPluginDependency - 5493.IBPluginDependency - 5494.IBPluginDependency - 5505.IBPluginDependency - 5506.IBPluginDependency - 5513.IBPluginDependency - 5514.IBPluginDependency - 5515.IBPluginDependency - 5521.IBPluginDependency - 5522.IBPluginDependency - 5523.IBPluginDependency - 5524.IBPluginDependency - 5534.IBPluginDependency - 5535.IBPluginDependency - 5536.IBPluginDependency - 5537.IBPluginDependency - 5549.IBPluginDependency - 5550.IBPluginDependency - 5551.IBPluginDependency - 5552.IBPluginDependency - 5553.IBPluginDependency - 5554.IBPluginDependency - 56.IBPluginDependency - 5670.IBPluginDependency - 5673.IBPluginDependency - 5674.IBPluginDependency - 5676.IBPluginDependency - 5680.IBPluginDependency - 5681.IBPluginDependency - 5682.IBPluginDependency - 5683.IBPluginDependency - 5684.IBPluginDependency - 5685.IBPluginDependency - 5686.IBPluginDependency - 5687.IBPluginDependency - 5688.IBPluginDependency - 5689.IBPluginDependency - 5690.IBPluginDependency - 5691.IBPluginDependency - 5692.IBPluginDependency - 5693.IBPluginDependency - 5694.IBPluginDependency - 5695.IBPluginDependency - 5696.IBPluginDependency - 57.IBPluginDependency - 5706.IBPluginDependency - 5707.IBPluginDependency - 5712.IBPluginDependency - 5713.IBPluginDependency - 5714.IBPluginDependency - 5715.IBPluginDependency - 5716.IBPluginDependency - 5717.IBPluginDependency - 5718.IBPluginDependency - 5719.IBPluginDependency - 5720.IBPluginDependency - 5721.IBPluginDependency - 5722.IBPluginDependency - 5723.IBPluginDependency - 5724.IBPluginDependency - 58.IBPluginDependency - 5808.IBPluginDependency - 5809.IBPluginDependency - 5810.IBPluginDependency - 5811.IBPluginDependency - 5820.IBPluginDependency - 5821.IBPluginDependency - 5822.IBPluginDependency - 5823.IBPluginDependency - 5871.IBPluginDependency - 5872.IBPluginDependency - 5873.IBPluginDependency - 5874.IBPluginDependency - 5879.IBPluginDependency - 5897.IBPluginDependency - 5904.IBPluginDependency - 5905.IBPluginDependency - 5906.IBPluginDependency - 5907.IBPluginDependency - 5908.IBPluginDependency - 5909.IBPluginDependency - 5910.IBPluginDependency - 5911.IBPluginDependency - 5912.IBPluginDependency - 5913.IBPluginDependency - 5914.IBPluginDependency - 5915.IBPluginDependency - 5916.IBPluginDependency - 5917.IBPluginDependency - 5918.IBPluginDependency - 5919.IBPluginDependency - 5920.IBPluginDependency - 5921.IBPluginDependency - 5922.IBPluginDependency - 5923.IBPluginDependency - 5924.IBPluginDependency - 5932.IBPluginDependency - 5933.IBPluginDependency - 5934.IBPluginDependency - 5937.IBPluginDependency - 5938.IBPluginDependency - 5939.IBPluginDependency - 5940.IBPluginDependency - 5941.IBPluginDependency - 5942.IBPluginDependency - 5943.IBPluginDependency - 5944.IBPluginDependency - 5945.IBPluginDependency - 5946.IBPluginDependency - 5947.IBPluginDependency - 5948.IBPluginDependency - 5949.IBPluginDependency - 5950.IBPluginDependency - 5951.IBPluginDependency - 5952.IBPluginDependency - 5953.IBPluginDependency - 5954.IBPluginDependency - 5955.IBPluginDependency - 5956.IBPluginDependency - 5957.IBPluginDependency - 5958.IBPluginDependency - 5959.IBPluginDependency - 5960.IBPluginDependency - 5961.IBPluginDependency - 5962.IBPluginDependency - 5963.IBPluginDependency - 5964.IBPluginDependency - 5967.IBPluginDependency - 5968.IBPluginDependency - 5971.IBPluginDependency - 5972.IBPluginDependency - 5981.IBPluginDependency - 5982.IBPluginDependency - 5992.IBPluginDependency - 5993.IBPluginDependency - 5996.IBPluginDependency - 5997.IBPluginDependency - 970.IBPluginDependency - 971.IBPluginDependency - 973.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - InitialTabViewItem - - InitialTabViewItem - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{329, 373}, {338, 318}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{132, 289}, {959, 558}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Caution: This option will likely break device compatiblity with all but the AppleTV Take 2. Checking this box enables a 64 bit mp4 file which can be over 4 GB. - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{72, 712}, {392, 144}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - HBPresetsOutlineView - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{57, 766}, {300, 233}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - This rearranges the header of the MP4 file to optimize it for streaming across the web. - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - This option adds an atom to the MP4 file which allows older iPods (5th Generation classic style) to play the file. - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - - - - - YES - - - - - 6004 - - - - YES - - HBAudioController - NSObject - - IBProjectSource - ./Classes/HBAudioController.h - - - - HBController - NSObject - - YES - - YES - Cancel: - Pause: - Rip: - addAllAudioTracks: - addAllTitlesToQueue: - addFactoryPresets: - addPresetPicDropdownChanged: - addToQueue: - addUserPreset: - applyQueueSettingsToMainWindow: - autoSetM4vExtension: - browseExportPresetFile: - browseFile: - browseForChapterFile: - browseForChapterFileSave: - browseImportPresetFile: - browseImportSrtFile: - browseSources: - calculateBitrate: - calculatePictureSizing: - cancelScanning: - chapterPopUpChanged: - closeAddPresetPanel: - closeSourceTitleScanPanel: - customSettingUsed: - deleteFactoryPresets: - deletePreset: - encodeStartStopPopUpChanged: - formatPopUpChanged: - getDefaultPresets: - insertPreset: - openForums: - openHomepage: - openMainWindow: - openUserGuide: - qualitySliderChanged: - revertPictureSizeToMax: - selectDefaultPreset: - selectPreset: - setDefaultPreset: - showAboutPanel: - showAddPresetPanel: - showDebugOutputPanel: - showNewScan: - showPicturePanel: - showPreferencesWindow: - showPreviewWindow: - showQueueWindow: - showSourceTitleScanPanel: - startEndFrameValueChanged: - startEndSecValueChanged: - titlePopUpChanged: - twoPassCheckboxChanged: - updateX264Widgets: - videoEncoderPopUpChanged: - videoFrameRateChanged: - videoMatrixChanged: - x264PresetsChangedDisplayExpandedOptions: - x264PresetsSliderChanged: - - - YES - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - id - - - - YES - - YES - Cancel: - Pause: - Rip: - addAllAudioTracks: - addAllTitlesToQueue: - addFactoryPresets: - addPresetPicDropdownChanged: - addToQueue: - addUserPreset: - applyQueueSettingsToMainWindow: - autoSetM4vExtension: - browseExportPresetFile: - browseFile: - browseForChapterFile: - browseForChapterFileSave: - browseImportPresetFile: - browseImportSrtFile: - browseSources: - calculateBitrate: - calculatePictureSizing: - cancelScanning: - chapterPopUpChanged: - closeAddPresetPanel: - closeSourceTitleScanPanel: - customSettingUsed: - deleteFactoryPresets: - deletePreset: - encodeStartStopPopUpChanged: - formatPopUpChanged: - getDefaultPresets: - insertPreset: - openForums: - openHomepage: - openMainWindow: - openUserGuide: - qualitySliderChanged: - revertPictureSizeToMax: - selectDefaultPreset: - selectPreset: - setDefaultPreset: - showAboutPanel: - showAddPresetPanel: - showDebugOutputPanel: - showNewScan: - showPicturePanel: - showPreferencesWindow: - showPreviewWindow: - showQueueWindow: - showSourceTitleScanPanel: - startEndFrameValueChanged: - startEndSecValueChanged: - titlePopUpChanged: - twoPassCheckboxChanged: - updateX264Widgets: - videoEncoderPopUpChanged: - videoFrameRateChanged: - videoMatrixChanged: - x264PresetsChangedDisplayExpandedOptions: - x264PresetsSliderChanged: - - - YES - - Cancel: - id - - - Pause: - id - - - Rip: - id - - - addAllAudioTracks: - id - - - addAllTitlesToQueue: - id - - - addFactoryPresets: - id - - - addPresetPicDropdownChanged: - id - - - addToQueue: - id - - - addUserPreset: - id - - - applyQueueSettingsToMainWindow: - id - - - autoSetM4vExtension: - id - - - browseExportPresetFile: - id - - - browseFile: - id - - - browseForChapterFile: - id - - - browseForChapterFileSave: - id - - - browseImportPresetFile: - id - - - browseImportSrtFile: - id - - - browseSources: - id - - - calculateBitrate: - id - - - calculatePictureSizing: - id - - - cancelScanning: - id - - - chapterPopUpChanged: - id - - - closeAddPresetPanel: - id - - - closeSourceTitleScanPanel: - id - - - customSettingUsed: - id - - - deleteFactoryPresets: - id - - - deletePreset: - id - - - encodeStartStopPopUpChanged: - id - - - formatPopUpChanged: - id - - - getDefaultPresets: - id - - - insertPreset: - id - - - openForums: - id - - - openHomepage: - id - - - openMainWindow: - id - - - openUserGuide: - id - - - qualitySliderChanged: - id - - - revertPictureSizeToMax: - id - - - selectDefaultPreset: - id - - - selectPreset: - id - - - setDefaultPreset: - id - - - showAboutPanel: - id - - - showAddPresetPanel: - id - - - showDebugOutputPanel: - id - - - showNewScan: - id - - - showPicturePanel: - id - - - showPreferencesWindow: - id - - - showPreviewWindow: - id - - - showQueueWindow: - id - - - showSourceTitleScanPanel: - id - - - startEndFrameValueChanged: - id - - - startEndSecValueChanged: - id - - - titlePopUpChanged: - id - - - twoPassCheckboxChanged: - id - - - updateX264Widgets: - id - - - videoEncoderPopUpChanged: - id - - - videoFrameRateChanged: - id - - - videoMatrixChanged: - id - - - x264PresetsChangedDisplayExpandedOptions: - id - - - x264PresetsSliderChanged: - id - - - - - YES - - YES - fAddPresetPanel - fAdvancedView - fAudioAllowAACPassCheck - fAudioAllowAC3PassCheck - fAudioAllowDTSHDPassCheck - fAudioAllowDTSPassCheck - fAudioAllowMP3PassCheck - fAudioAutoPassthruBox - fAudioDelegate - fAudioFallbackPopUp - fBrowseSrtFileButton - fChapterTable - fChapterTableNameColumn - fCreateChapterMarkers - fDisplayX264PresetsAdditonalOptionsLabel - fDisplayX264PresetsAdditonalOptionsTextField - fDisplayX264PresetsUnparseTextField - fDstBrowseButton - fDstFile1Field - fDstFile2Field - fDstFormatField - fDstFormatPopUp - fDstMp4HttpOptFileCheck - fDstMp4LargeFileCheck - fDstMp4iPodFileCheck - fEncodeStartStopPopUp - fFramerateCfrCell - fFramerateMatrix - fFramerateVfrPfrCell - fLoadChaptersButton - fPictureSettingsField - fPresetDrawer - fPresetNewDesc - fPresetNewFolderCheck - fPresetNewName - fPresetNewPicFiltersCheck - fPresetNewPicHeight - fPresetNewPicSettingsPopUp - fPresetNewPicWidth - fPresetNewPicWidthHeightBox - fPresetSelectedDisplay - fPresetsActionButton - fPresetsAdd - fPresetsDelete - fPresetsOutlineView - fQueueStatus - fRipIndicator - fSaveChaptersButton - fScanHorizontalLine - fScanIndicator - fScanSrcTitleCancelButton - fScanSrcTitleNumField - fScanSrcTitleOpenButton - fScanSrcTitlePanel - fScanSrcTitlePathField - fSrcAngleLabel - fSrcAnglePopUp - fSrcChapterEndPopUp - fSrcChapterField - fSrcChapterStartPopUp - fSrcChapterToField - fSrcDVD2Field - fSrcDsplyNameTitleScan - fSrcDuration1Field - fSrcDuration2Field - fSrcFrameEndEncodingField - fSrcFrameStartEncodingField - fSrcTimeEndEncodingField - fSrcTimeStartEncodingField - fSrcTitleField - fSrcTitlePopUp - fStatusField - fSubField - fSubForcedCheck - fSubPopUp - fSubtitlesTable - fVidBitrateCell - fVidBitrateField - fVidConstantCell - fVidEncoderField - fVidEncoderPopUp - fVidQualityField - fVidQualityMatrix - fVidQualityRFField - fVidQualityRFLabel - fVidQualitySlider - fVidRateField - fVidRatePopUp - fVidTurboPassCheck - fVidTwoPassCheck - fPictureFiltersField - fWindow - fX264FastDecodeCheck - fX264LevelPopUp - fX264LevelPopUpLabel - fX264PresetSelectedTextField - fX264PresetSliderLabel - fX264PresetsBox - fX264PresetsSlider - fX264ProfilePopUp - fX264ProfilePopUpLabel - fX264TunePopUp - fX264TunePopUpLabel - fX264UseAdvancedOptionsCheck - - - YES - NSPanel - NSBox - NSButton - NSButton - NSButton - NSButton - NSButton - NSBox - HBAudioController - NSPopUpButton - NSButton - NSTableView - NSTableColumn - NSButton - NSTextField - NSTextField - NSTextField - NSButton - NSTextField - NSTextField - NSTextField - NSPopUpButton - NSButton - NSButton - NSButton - NSPopUpButton - NSButtonCell - NSMatrix - NSButtonCell - NSButton - NSTextField - NSDrawer - NSTextField - NSButton - NSTextField - NSButton - NSTextField - NSPopUpButton - NSTextField - NSBox - NSTextField - NSPopUpButton - NSButton - NSButton - HBPresetsOutlineView - NSTextField - NSProgressIndicator - NSButton - NSBox - NSProgressIndicator - NSButton - NSTextField - NSButton - NSPanel - NSTextField - NSTextField - NSPopUpButton - NSPopUpButton - NSTextField - NSPopUpButton - NSTextField - NSTextField - NSTextField - NSTextField - NSTextField - NSTextField - NSTextField - NSTextField - NSTextField - NSTextField - NSPopUpButton - NSTextField - NSTextField - NSButton - NSPopUpButton - NSTableView - NSButtonCell - NSTextField - NSButtonCell - NSTextField - NSPopUpButton - NSTextField - NSMatrix - NSTextField - NSTextField - NSSlider - NSTextField - NSPopUpButton - NSButton - NSButton - NSTextField - NSWindow - NSButton - NSPopUpButton - NSTextField - NSTextField - NSTextField - NSBox - NSSlider - NSPopUpButton - NSTextField - NSPopUpButton - NSTextField - NSButton - - - - YES - - YES - fAddPresetPanel - fAdvancedView - fAudioAllowAACPassCheck - fAudioAllowAC3PassCheck - fAudioAllowDTSHDPassCheck - fAudioAllowDTSPassCheck - fAudioAllowMP3PassCheck - fAudioAutoPassthruBox - fAudioDelegate - fAudioFallbackPopUp - fBrowseSrtFileButton - fChapterTable - fChapterTableNameColumn - fCreateChapterMarkers - fDisplayX264PresetsAdditonalOptionsLabel - fDisplayX264PresetsAdditonalOptionsTextField - fDisplayX264PresetsUnparseTextField - fDstBrowseButton - fDstFile1Field - fDstFile2Field - fDstFormatField - fDstFormatPopUp - fDstMp4HttpOptFileCheck - fDstMp4LargeFileCheck - fDstMp4iPodFileCheck - fEncodeStartStopPopUp - fFramerateCfrCell - fFramerateMatrix - fFramerateVfrPfrCell - fLoadChaptersButton - fPictureSettingsField - fPresetDrawer - fPresetNewDesc - fPresetNewFolderCheck - fPresetNewName - fPresetNewPicFiltersCheck - fPresetNewPicHeight - fPresetNewPicSettingsPopUp - fPresetNewPicWidth - fPresetNewPicWidthHeightBox - fPresetSelectedDisplay - fPresetsActionButton - fPresetsAdd - fPresetsDelete - fPresetsOutlineView - fQueueStatus - fRipIndicator - fSaveChaptersButton - fScanHorizontalLine - fScanIndicator - fScanSrcTitleCancelButton - fScanSrcTitleNumField - fScanSrcTitleOpenButton - fScanSrcTitlePanel - fScanSrcTitlePathField - fSrcAngleLabel - fSrcAnglePopUp - fSrcChapterEndPopUp - fSrcChapterField - fSrcChapterStartPopUp - fSrcChapterToField - fSrcDVD2Field - fSrcDsplyNameTitleScan - fSrcDuration1Field - fSrcDuration2Field - fSrcFrameEndEncodingField - fSrcFrameStartEncodingField - fSrcTimeEndEncodingField - fSrcTimeStartEncodingField - fSrcTitleField - fSrcTitlePopUp - fStatusField - fSubField - fSubForcedCheck - fSubPopUp - fSubtitlesTable - fVidBitrateCell - fVidBitrateField - fVidConstantCell - fVidEncoderField - fVidEncoderPopUp - fVidQualityField - fVidQualityMatrix - fVidQualityRFField - fVidQualityRFLabel - fVidQualitySlider - fVidRateField - fVidRatePopUp - fVidTurboPassCheck - fVidTwoPassCheck - fPictureFiltersField - fWindow - fX264FastDecodeCheck - fX264LevelPopUp - fX264LevelPopUpLabel - fX264PresetSelectedTextField - fX264PresetSliderLabel - fX264PresetsBox - fX264PresetsSlider - fX264ProfilePopUp - fX264ProfilePopUpLabel - fX264TunePopUp - fX264TunePopUpLabel - fX264UseAdvancedOptionsCheck - - - YES - - fAddPresetPanel - NSPanel - - - fAdvancedView - NSBox - - - fAudioAllowAACPassCheck - NSButton - - - fAudioAllowAC3PassCheck - NSButton - - - fAudioAllowDTSHDPassCheck - NSButton - - - fAudioAllowDTSPassCheck - NSButton - - - fAudioAllowMP3PassCheck - NSButton - - - fAudioAutoPassthruBox - NSBox - - - fAudioDelegate - HBAudioController - - - fAudioFallbackPopUp - NSPopUpButton - - - fBrowseSrtFileButton - NSButton - - - fChapterTable - NSTableView - - - fChapterTableNameColumn - NSTableColumn - - - fCreateChapterMarkers - NSButton - - - fDisplayX264PresetsAdditonalOptionsLabel - NSTextField - - - fDisplayX264PresetsAdditonalOptionsTextField - NSTextField - - - fDisplayX264PresetsUnparseTextField - NSTextField - - - fDstBrowseButton - NSButton - - - fDstFile1Field - NSTextField - - - fDstFile2Field - NSTextField - - - fDstFormatField - NSTextField - - - fDstFormatPopUp - NSPopUpButton - - - fDstMp4HttpOptFileCheck - NSButton - - - fDstMp4LargeFileCheck - NSButton - - - fDstMp4iPodFileCheck - NSButton - - - fEncodeStartStopPopUp - NSPopUpButton - - - fFramerateCfrCell - NSButtonCell - - - fFramerateMatrix - NSMatrix - - - fFramerateVfrPfrCell - NSButtonCell - - - fLoadChaptersButton - NSButton - - - fPictureSettingsField - NSTextField - - - fPresetDrawer - NSDrawer - - - fPresetNewDesc - NSTextField - - - fPresetNewFolderCheck - NSButton - - - fPresetNewName - NSTextField - - - fPresetNewPicFiltersCheck - NSButton - - - fPresetNewPicHeight - NSTextField - - - fPresetNewPicSettingsPopUp - NSPopUpButton - - - fPresetNewPicWidth - NSTextField - - - fPresetNewPicWidthHeightBox - NSBox - - - fPresetSelectedDisplay - NSTextField - - - fPresetsActionButton - NSPopUpButton - - - fPresetsAdd - NSButton - - - fPresetsDelete - NSButton - - - fPresetsOutlineView - HBPresetsOutlineView - - - fQueueStatus - NSTextField - - - fRipIndicator - NSProgressIndicator - - - fSaveChaptersButton - NSButton - - - fScanHorizontalLine - NSBox - - - fScanIndicator - NSProgressIndicator - - - fScanSrcTitleCancelButton - NSButton - - - fScanSrcTitleNumField - NSTextField - - - fScanSrcTitleOpenButton - NSButton - - - fScanSrcTitlePanel - NSPanel - - - fScanSrcTitlePathField - NSTextField - - - fSrcAngleLabel - NSTextField - - - fSrcAnglePopUp - NSPopUpButton - - - fSrcChapterEndPopUp - NSPopUpButton - - - fSrcChapterField - NSTextField - - - fSrcChapterStartPopUp - NSPopUpButton - - - fSrcChapterToField - NSTextField - - - fSrcDVD2Field - NSTextField - - - fSrcDsplyNameTitleScan - NSTextField - - - fSrcDuration1Field - NSTextField - - - fSrcDuration2Field - NSTextField - - - fSrcFrameEndEncodingField - NSTextField - - - fSrcFrameStartEncodingField - NSTextField - - - fSrcTimeEndEncodingField - NSTextField - - - fSrcTimeStartEncodingField - NSTextField - - - fSrcTitleField - NSTextField - - - fSrcTitlePopUp - NSPopUpButton - - - fStatusField - NSTextField - - - fSubField - NSTextField - - - fSubForcedCheck - NSButton - - - fSubPopUp - NSPopUpButton - - - fSubtitlesTable - NSTableView - - - fVidBitrateCell - NSButtonCell - - - fVidBitrateField - NSTextField - - - fVidConstantCell - NSButtonCell - - - fVidEncoderField - NSTextField - - - fVidEncoderPopUp - NSPopUpButton - - - fVidQualityField - NSTextField - - - fVidQualityMatrix - NSMatrix - - - fVidQualityRFField - NSTextField - - - fVidQualityRFLabel - NSTextField - - - fVidQualitySlider - NSSlider - - - fVidRateField - NSTextField - - - fVidRatePopUp - NSPopUpButton - - - fVidTurboPassCheck - NSButton - - - fVidTwoPassCheck - NSButton - - - fPictureFiltersField - NSTextField - - - fWindow - NSWindow - - - fX264FastDecodeCheck - NSButton - - - fX264LevelPopUp - NSPopUpButton - - - fX264LevelPopUpLabel - NSTextField - - - fX264PresetSelectedTextField - NSTextField - - - fX264PresetSliderLabel - NSTextField - - - fX264PresetsBox - NSBox - - - fX264PresetsSlider - NSSlider - - - fX264ProfilePopUp - NSPopUpButton - - - fX264ProfilePopUpLabel - NSTextField - - - fX264TunePopUp - NSPopUpButton - - - fX264TunePopUpLabel - NSTextField - - - fX264UseAdvancedOptionsCheck - NSButton - - - - - IBProjectSource - ./Classes/HBController.h - - - - HBPresetsOutlineView - NSOutlineView - - IBProjectSource - ./Classes/HBPresetsOutlineView.h - - - - SUUpdater - NSObject - - checkForUpdates: - id - - - checkForUpdates: - - checkForUpdates: - id - - - - delegate - id - - - delegate - - delegate - id - - - - IBProjectSource - ./Classes/SUUpdater.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - YES - - YES - HandBrake.icns - NSActionTemplate - NSAddTemplate - NSMenuCheckmark - NSMenuMixedState - NSRemoveTemplate - NSSwitch - - - YES - {128, 128} - {15, 15} - {8, 8} - {11, 11} - {10, 3} - {8, 8} - {15, 15} - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DO NOT TRANSLATE THIS NIB FILE, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Preset Name: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macosx/English.lproj/Subtitles.xib b/macosx/English.lproj/Subtitles.xib new file mode 100644 index 000000000..924881f80 --- /dev/null +++ b/macosx/English.lproj/Subtitles.xib @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macosx/English.lproj/Video.xib b/macosx/English.lproj/Video.xib new file mode 100644 index 000000000..0e1b8afff --- /dev/null +++ b/macosx/English.lproj/Video.xib @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macosx/HBAdvancedController.h b/macosx/HBAdvancedController.h index 3845df911..cf077b448 100644 --- a/macosx/HBAdvancedController.h +++ b/macosx/HBAdvancedController.h @@ -6,13 +6,16 @@ #import -@interface HBAdvancedController : NSObject +/** + * HBAdvancedController + */ +@interface HBAdvancedController : NSViewController { /* Advanced Tab for opts fX264optView*/ - NSBox * fOptionsBox; + IBOutlet NSBox * fOptionsBox; IBOutlet NSView * fX264optView; - IBOutlet NSView * fEmptyView; + IBOutlet NSView * fFFmpegView; IBOutlet NSTextField * fX264optViewTitleLabel; IBOutlet NSTextField * fDisplayX264OptionsLabel; IBOutlet NSTextField * fDisplayX264Options; @@ -61,8 +64,7 @@ } // x264 Advanced Panel Methods -- (void) setView: (NSBox *) box; -- (BOOL) loadMyNibFile; + - (NSString *) optionsString; - (NSString *) optionsStringLavc; - (void) setOptions: (NSString *)string; diff --git a/macosx/HBAdvancedController.m b/macosx/HBAdvancedController.m index 18ccfe152..0900c010e 100644 --- a/macosx/HBAdvancedController.m +++ b/macosx/HBAdvancedController.m @@ -8,31 +8,21 @@ @implementation HBAdvancedController -- (id)init +- (instancetype)init { - if( self = [super init] ) + self = [super initWithNibName:@"AdvancedView" bundle:nil]; + if (self) { - [self loadMyNibFile]; + } return self; } -- (void) setView: (NSBox *) box -{ - fOptionsBox = box; - [fOptionsBox setContentView:fX264optView]; -} - -- (BOOL) loadMyNibFile +- (void)loadView { - if(![NSBundle loadNibNamed:@"AdvancedView" owner:self]) - { - NSLog(@"Warning! Could not load myNib file.\n"); - return NO; - } - - return YES; + [super loadView]; + [self setHidden:NO]; } - (NSString *) optionsString @@ -60,7 +50,7 @@ { if(hide) { - [fOptionsBox setContentView:fEmptyView]; + [fOptionsBox setContentView:fFFmpegView]; } else { diff --git a/macosx/HBAudioController.h b/macosx/HBAudioController.h index c35f5dac9..959bdc63a 100644 --- a/macosx/HBAudioController.h +++ b/macosx/HBAudioController.h @@ -19,29 +19,35 @@ extern NSString *HBMixdownChangedNotification; @class HBAudio; -@interface HBAudioController : NSObject - -{ - id myController; - NSMutableArray * audioArray; // the configured audio information - NSArray * masterTrackArray; // the master list of audio tracks from the title - NSDictionary * noneTrack; // this represents no audio track selection - NSNumber * videoContainerTag; // initially is the default HB_MUX_MP4 -} +/** + * HBAudioController + * + * Responds to HBContainerChangedNotification and HBTitleChangedNotification notifications. + */ +@interface HBAudioController : NSViewController @property (nonatomic, readonly, retain) NSArray *masterTrackArray; @property (nonatomic, readonly) NSDictionary *noneTrack; -@property (nonatomic, retain) NSNumber *videoContainerTag; +@property(nonatomic, readwrite) BOOL allowAACPassCheck; +@property(nonatomic, readwrite) BOOL allowAC3PassCheck; +@property(nonatomic, readwrite) BOOL allowDTSHDPassCheck; +@property(nonatomic, readwrite) BOOL allowDTSPassCheck; +@property(nonatomic, readwrite) BOOL allowMP3PassCheck; + +@property(nonatomic, readwrite, assign) NSString *audioEncoderFallback; +@property(nonatomic, readwrite) NSInteger audioEncoderFallbackTag; + +- (void) enableUI: (BOOL) b; - (void) setHBController: (id) aController; + - (void) prepareAudioForQueueFileJob: (NSMutableDictionary *) aDict; -- (void) prepareAudioForJob: (hb_job_t *) aJob; +- (void) prepareAudioForJobPreview: (hb_job_t *) aJob; - (void) prepareAudioForPreset: (NSMutableArray *) anArray; - (void) addTracksFromQueue: (NSMutableDictionary *) aQueue; - (void) addTracksFromPreset: (NSMutableDictionary *) aPreset; -- (void) addAllTracksFromPreset: (NSMutableDictionary *) aPreset; + - (BOOL) anyCodecMatches: (int) aCodecValue; -- (void) addNewAudioTrack; - (void) settingTrackToNone: (HBAudio *) newNoneTrack; - (void) switchingTrackFromNone: (HBAudio *) noLongerNoneTrack; diff --git a/macosx/HBAudioController.m b/macosx/HBAudioController.m index d65c01a65..98026c770 100644 --- a/macosx/HBAudioController.m +++ b/macosx/HBAudioController.m @@ -20,9 +20,27 @@ NSString *keyAudioInputChannelLayout = @"keyAudioInputChannelLayout"; NSString *HBMixdownChangedNotification = @"HBMixdownChangedNotification"; -@interface HBAudioController () +@interface HBAudioController () { + /* New Audio Auto Passthru box */ + IBOutlet NSBox * fAudioAutoPassthruBox; + IBOutlet NSPopUpButton * fAudioFallbackPopUp; + + IBOutlet NSTableView * fTableView; + IBOutlet NSButton * fAddAllTracksButton; + + id myController; + NSMutableArray * audioArray; // the configured audio information + NSArray * masterTrackArray; // the master list of audio tracks from the title + NSDictionary * noneTrack; // this represents no audio track selection + NSNumber * videoContainerTag; // initially is the default HB_MUX_MP4 +} @property (nonatomic, readwrite, retain) NSArray *masterTrackArray; +@property (nonatomic, retain) NSNumber *videoContainerTag; + +- (void) addAllTracksFromPreset: (NSMutableDictionary *) aPreset; +- (IBAction) addAllAudioTracks: (id) sender; +- (void) addNewAudioTrack; @end // interface HBAudioController @@ -36,10 +54,30 @@ NSString *HBMixdownChangedNotification = @"HBMixdownChangedNotification"; @synthesize noneTrack; @synthesize videoContainerTag; -- (id) init +- (NSString *)audioEncoderFallback +{ + return [[fAudioFallbackPopUp selectedItem] title]; +} +- (void)setAudioEncoderFallback:(NSString *)string { - if (self = [super init]) + [fAudioFallbackPopUp selectItemWithTitle:string]; +} + +- (NSInteger)audioEncoderFallbackTag +{ + return [[fAudioFallbackPopUp selectedItem] tag]; +} + +- (void)setAudioEncoderFallbackTag:(NSInteger)tag +{ + [fAudioFallbackPopUp selectItemWithTag:tag]; +} + +- (instancetype)init +{ + self = [super initWithNibName:@"Audio" bundle:nil]; + if (self) { [self setVideoContainerTag: [NSNumber numberWithInt: HB_MUX_MP4]]; audioArray = [[NSMutableArray alloc] init]; @@ -78,6 +116,20 @@ NSString *HBMixdownChangedNotification = @"HBMixdownChangedNotification"; } } + +- (IBAction) addAllAudioTracks: (id) sender +{ + [self addAllTracksFromPreset:[myController selectedPreset]]; + return; +} + +- (void)enableUI:(BOOL)b +{ + [fTableView setEnabled:b]; + [fAddAllTracksButton setEnabled:b]; + [fAudioFallbackPopUp setEnabled:b]; +} + #pragma mark - #pragma mark HBController Support @@ -134,7 +186,7 @@ NSString *HBMixdownChangedNotification = @"HBMixdownChangedNotification"; } } -- (void) prepareAudioForJob: (hb_job_t *) aJob +- (void) prepareAudioForJobPreview: (hb_job_t *) aJob { unsigned int i; @@ -577,6 +629,38 @@ NSString *HBMixdownChangedNotification = @"HBMixdownChangedNotification"; { [audioObject setVideoContainerTag: [self videoContainerTag]]; } + + /* Update the Auto Passthru Fallback Codec Popup */ + /* lets get the tag of the currently selected item first so we might reset it later */ + + int selectedAutoPassthruFallbackEncoderTag = (int)[[fAudioFallbackPopUp selectedItem] tag]; + + [fAudioFallbackPopUp removeAllItems]; + for (const hb_encoder_t *audio_encoder = hb_audio_encoder_get_next(NULL); + audio_encoder != NULL; + audio_encoder = hb_audio_encoder_get_next(audio_encoder)) + { + if ((audio_encoder->codec & HB_ACODEC_PASS_FLAG) == 0 && + (audio_encoder->muxers & [[self videoContainerTag] integerValue])) + { + NSMenuItem *menuItem = [[fAudioFallbackPopUp menu] addItemWithTitle:[NSString stringWithUTF8String:audio_encoder->name] + action:nil + keyEquivalent:@""]; + [menuItem setTag:audio_encoder->codec]; + } + } + + /* if we have a previously selected auto passthru fallback encoder tag, then try to select it */ + if (selectedAutoPassthruFallbackEncoderTag) + { + selectedAutoPassthruFallbackEncoderTag = [fAudioFallbackPopUp selectItemWithTag:selectedAutoPassthruFallbackEncoderTag]; + } + /* if we had no previous fallback selected OR if selection failed + * select the default fallback encoder (AC3) */ + if (!selectedAutoPassthruFallbackEncoderTag) + { + [fAudioFallbackPopUp selectItemWithTag:HB_ACODEC_AC3]; + } } - (void) titleChanged: (NSNotification *) aNotification @@ -617,6 +701,10 @@ NSString *HBMixdownChangedNotification = @"HBMixdownChangedNotification"; } self.masterTrackArray = newTrackArray; } + else + { + self.masterTrackArray = nil; + } // Reinitialize the configured list of audio tracks [self _clearAudioArray]; diff --git a/macosx/HBChapterTitlesController.h b/macosx/HBChapterTitlesController.h new file mode 100644 index 000000000..f56fd367b --- /dev/null +++ b/macosx/HBChapterTitlesController.h @@ -0,0 +1,29 @@ +/* ChapterTitles.h $ + + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + +#include + +/** + * HBChapterTitlesController + * Responds to HBTitleChangedNotification notifications. + */ +@interface HBChapterTitlesController : NSViewController + +- (void)enableUI:(BOOL)b; +- (void)addChaptersFromQueue:(NSMutableArray *)newChaptersArray; + +/** + * Enable/disable chapters markers + */ +@property (readwrite, nonatomic) BOOL createChapterMarkers; + +/** + * Get the list of chapter titles + */ +@property (readonly, nonatomic) NSArray *chapterTitlesArray; + + +@end diff --git a/macosx/HBChapterTitlesController.m b/macosx/HBChapterTitlesController.m new file mode 100644 index 000000000..c4f6a6583 --- /dev/null +++ b/macosx/HBChapterTitlesController.m @@ -0,0 +1,313 @@ +/* ChapterTitles.m $ + + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + +#import "HBChapterTitlesController.h" +#import "Controller.h" +#include "hb.h" + +@interface HBChapterTitlesController () +{ + NSMutableArray *fChapterTitlesArray; + + IBOutlet NSTableView * fChapterTable; + IBOutlet NSButton * fLoadChaptersButton; + IBOutlet NSButton * fSaveChaptersButton; + IBOutlet NSButton * fCreateChaptersMarkers; + IBOutlet NSTableColumn * fChapterTableNameColumn; +} + +@end + +@implementation HBChapterTitlesController + +- (instancetype)init +{ + self = [super initWithNibName:@"ChaptersTitles" bundle:nil]; + if (self) + { + fChapterTitlesArray = [[[NSMutableArray alloc] init] retain]; + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(titleChanged:) name: HBTitleChangedNotification object: nil]; + } + return self; +} + +- (void)dealloc +{ + [fChapterTitlesArray release]; + [super dealloc]; +} + +- (void)titleChanged:(NSNotification *)aNotification +{ + NSDictionary *notDict = [aNotification userInfo]; + NSData *theData = [notDict objectForKey: keyTitleTag]; + hb_title_t *title = NULL; + + [theData getBytes: &title length: sizeof(title)]; + + [fChapterTitlesArray removeAllObjects]; + + if (title) + { + for (int i = 0; i < hb_list_count(title->job->list_chapter); i++) + { + hb_chapter_t *chapter = hb_list_item(title->job->list_chapter, i); + if (chapter != NULL) + { + if (chapter->title != NULL) + { + [fChapterTitlesArray addObject:[NSString + stringWithFormat:@"%s", + chapter->title]]; + } + else + { + [fChapterTitlesArray addObject:[NSString + stringWithFormat:@"Chapter %d", + i + 1]]; + } + } + } + } + + [fChapterTable reloadData]; +} + +- (void)addChaptersFromQueue:(NSMutableArray *)newChaptersArray +{ + [fChapterTitlesArray removeAllObjects]; + [fChapterTitlesArray addObjectsFromArray:newChaptersArray]; + [fChapterTable reloadData]; +} + +- (void)enableUI:(BOOL)b +{ + [fCreateChaptersMarkers setEnabled:b]; + [fChapterTable setEnabled:b]; + [fLoadChaptersButton setEnabled:b]; + [fSaveChaptersButton setEnabled:b]; +} + +- (NSArray *)chapterTitlesArray +{ + return [NSArray arrayWithArray:fChapterTitlesArray]; +} + +- (IBAction)createChapterMarkersChanged:(id)sender +{ + [[NSNotificationCenter defaultCenter] postNotificationName:HBMixdownChangedNotification object:self]; +} + +- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView +{ + return [fChapterTitlesArray count]; +} + +- (void)tableView:(NSTableView *)aTableView + setObjectValue:(id)anObject + forTableColumn:(NSTableColumn *)aTableColumn + row:(NSInteger)rowIndex +{ + if (aTableColumn != nil && [[aTableColumn identifier] intValue] == 2) + { + [fChapterTitlesArray replaceObjectAtIndex:rowIndex + withObject:[NSString + stringWithString:anObject]]; + } +} + +- (id)tableView:(NSTableView *)aTableView + objectValueForTableColumn:(NSTableColumn *)aTableColumn + row:(NSInteger)rowIndex +{ + if ([[aTableColumn identifier] intValue] == 1) + { + return [NSString stringWithFormat:@"%ld", rowIndex + 1]; + } + else + { + return [NSString stringWithString:[fChapterTitlesArray + objectAtIndex:rowIndex]]; + } + return @"__DATA ERROR__"; +} + +/* Method to edit the next chapter when the user presses Return. We have to use +a timer to avoid interfering with the chain of events that handles the edit. */ +- (void)controlTextDidEndEditing: (NSNotification *) notification +{ + NSTableView *chapterTable = [notification object]; + NSInteger column = [chapterTable editedColumn]; + NSInteger row = [chapterTable editedRow]; + NSInteger textMovement; + + // Edit the cell in the next row, same column + row++; + textMovement = [[[notification userInfo] objectForKey:@"NSTextMovement"] integerValue]; + if( textMovement == NSReturnTextMovement && row < [chapterTable numberOfRows] ) + { + NSArray *info = [NSArray arrayWithObjects:chapterTable, + [NSNumber numberWithInteger:column], [NSNumber numberWithInteger:row], nil]; + /* The delay is unimportant; editNextRow: won't be called until the responder + chain finishes because the event loop containing the timer is on this thread */ + [self performSelector:@selector(editNextRow:) withObject:info afterDelay:0.0]; + } +} + +- (void)editNextRow: (id) objects +{ + NSTableView *chapterTable = [objects objectAtIndex:0]; + NSInteger column = [[objects objectAtIndex:1] integerValue]; + NSInteger row = [[objects objectAtIndex:2] integerValue]; + + if( row >= 0 && row < [chapterTable numberOfRows] ) + { + [chapterTable selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO]; + [chapterTable editColumn:column row:row withEvent:nil select:YES]; + } +} + +#pragma mark - +#pragma mark Chapter Files Import / Export + +- (IBAction) browseForChapterFile: (id) sender +{ + /* We get the current file name and path from the destination field here */ + NSString *sourceDirectory = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"]; + + /* Open a panel to let the user choose the file */ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setDirectoryURL:[NSURL fileURLWithPath:sourceDirectory]]; + [panel setAllowedFileTypes:@[@"csv"]]; + + [panel beginSheetModalForWindow:[[self view] window] completionHandler:^(NSInteger result) { + NSArray *chaptersArray = nil; /* temp array for chapters */ + NSMutableArray *chaptersMutableArray = nil; /* temp array for chapters */ + NSString *chapterName = nil; /* temp string from file */ + NSInteger chapters, i; + + if (result == NSOKButton) /* if they click OK */ + { + chapterName = [[NSString alloc] initWithContentsOfURL:[panel URL] encoding:NSUTF8StringEncoding error:NULL]; + chaptersArray = [chapterName componentsSeparatedByString:@"\n"]; + [chapterName release]; + chaptersMutableArray = [[chaptersArray mutableCopy] autorelease]; + chapters = [self numberOfRowsInTableView:fChapterTable]; + if ([chaptersMutableArray count] > 0) + { + /* if last item is empty remove it */ + if ([[chaptersMutableArray objectAtIndex:[chaptersArray count]-1] length] == 0) + { + [chaptersMutableArray removeLastObject]; + } + } + /* if chapters in table is not equal to array count */ + if ((unsigned int) chapters != [chaptersMutableArray count]) + { + [panel close]; + [[NSAlert alertWithMessageText:NSLocalizedString(@"Unable to load chapter file", @"Unable to load chapter file") + defaultButton:NSLocalizedString(@"OK", @"OK") + alternateButton:NULL + otherButton:NULL + informativeTextWithFormat:NSLocalizedString(@"%d chapters expected, %d chapters found in %@", @"%d chapters expected, %d chapters found in %@"), + chapters, [chaptersMutableArray count], [[panel URL] lastPathComponent]] runModal]; + return; + } + /* otherwise, go ahead and populate table with array */ + for (i=0; i 5) + { + /* avoid a segfault */ + /* Get the Range.location of the first comma in the line and then put everything after that into chapterTitle */ + NSRange firstCommaRange = [[chaptersMutableArray objectAtIndex:i] rangeOfString:@","]; + NSString *chapterTitle = [[chaptersMutableArray objectAtIndex:i] substringFromIndex:firstCommaRange.location + 1]; + /* Since we store our chapterTitle commas as "\," for the cli, we now need to remove the escaping "\" from the title */ + chapterTitle = [chapterTitle stringByReplacingOccurrencesOfString:@"\\," withString:@","]; + [self tableView:fChapterTable + setObjectValue:chapterTitle + forTableColumn:fChapterTableNameColumn + row:i]; + } + else + { + [panel close]; + [[NSAlert alertWithMessageText:NSLocalizedString(@"Unable to load chapter file", @"Unable to load chapter file") + defaultButton:NSLocalizedString(@"OK", @"OK") + alternateButton:NULL + otherButton:NULL + informativeTextWithFormat:NSLocalizedString(@"%@ was not formatted as expected.", @"%@ was not formatted as expected."), [[panel URL] lastPathComponent]] runModal]; + [fChapterTable reloadData]; + return; + } + } + [fChapterTable reloadData]; + } + }]; +} + +- (IBAction) browseForChapterFileSave: (id) sender +{ + NSString *destinationDirectory = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"]; + + /* Open a panel to let the user save to a file */ + NSSavePanel *panel = [NSSavePanel savePanel]; + [panel setAllowedFileTypes:@[@"csv"]]; + [panel setDirectoryURL:[NSURL fileURLWithPath:destinationDirectory]]; + //[panel setNameFieldStringValue:[[[fDstFile2Field stringValue] lastPathComponent] stringByDeletingPathExtension]]; + + [panel beginSheetModalForWindow:[[self view] window] completionHandler:^(NSInteger result) { + NSString *chapterName; /* pointer for string for later file-writing */ + NSString *chapterTitle; + NSError *saveError = nil; + NSInteger chapters, i; /* ints for the number of chapters in the table and the loop */ + + if( result == NSOKButton ) /* if they clicked OK */ + { + chapters = [self numberOfRowsInTableView:fChapterTable]; + chapterName = [NSString string]; + for (i=0; i. - It may be used under the terms of the GNU General Public License. */ - -#import -#include "hb.h" - - - - -@interface HBSubtitles : NSObject { -hb_title_t *fTitle; - -NSMutableArray *subtitleArray; // contains the output subtitle track info -NSMutableArray *subtitleSourceArray;// contains the source subtitle track info -NSString *foreignAudioSearchTrackName; -NSMutableArray *languagesArray; // array of languages taken from lang.c -NSInteger languagesArrayDefIndex; -NSMutableArray *charCodeArray; // array of character codes -int charCodeArrayDefIndex; -int container; - -} - -// Trigger a refresh of data -- (void)resetWithTitle:(hb_title_t *)title; - -// Create new subtitle track -- (void)addSubtitleTrack; -- (NSDictionary *)createSubtitleTrack; -- (NSMutableArray*) getSubtitleArray; -// Add an srt file -- (void)createSubtitleSrtTrack:(NSURL *)fileURL; - -- (void)containerChanged:(int) newContainer; - -- (void)setNewSubtitles:(NSMutableArray*) newSubtitleArray; - -// Table View Delegates -- (NSUInteger)numberOfRowsInTableView:(NSTableView *)aTableView; - -- (id)tableView:(NSTableView *)aTableView - objectValueForTableColumn:(NSTableColumn *)aTableColumn - row:(NSInteger)rowIndex; - -- (void)tableView:(NSTableView *)aTableView - setObjectValue:(id)anObject - forTableColumn:(NSTableColumn *)aTableColumn - row:(NSInteger)rowIndex; - -- (void)tableView:(NSTableView *)aTableView - willDisplayCell:(id)aCell - forTableColumn:(NSTableColumn *)aTableColumn - row:(NSInteger)rowIndex; - -@end diff --git a/macosx/HBSubtitles.m b/macosx/HBSubtitles.m deleted file mode 100644 index d8474ac09..000000000 --- a/macosx/HBSubtitles.m +++ /dev/null @@ -1,863 +0,0 @@ -/* $Id: HBSubtitles.m,v 1.35 2005/08/01 14:29:50 titer Exp $ - - This file is part of the HandBrake source code. - Homepage: . - It may be used under the terms of the GNU General Public License. */ - -#import "HBSubtitles.h" -#include "lang.h" -#include "hb.h" - -@implementation HBSubtitles -- (id)init -{ - - if( self = [super init] ) - { - fTitle = NULL; - - /* setup our array of languages */ - const iso639_lang_t *lang; - languagesArray = [[NSMutableArray alloc] init]; - for (lang = lang_get_next(NULL); lang != NULL; lang = lang_get_next(lang)) - { - [languagesArray addObject:[NSArray arrayWithObjects: - [NSString stringWithUTF8String:lang->eng_name], - [NSString stringWithUTF8String:lang->iso639_2], - nil]]; - if (!strcasecmp(lang->eng_name, "English")) - { - languagesArrayDefIndex = [languagesArray count] - 1; - } - } - - /* populate the charCodeArray */ - charCodeArray = [[NSMutableArray alloc] init]; - [charCodeArray addObject:@"ANSI_X3.4-1968"]; - [charCodeArray addObject:@"ANSI_X3.4-1986"]; - [charCodeArray addObject:@"ANSI_X3.4"]; - [charCodeArray addObject:@"ANSI_X3.110-1983"]; - [charCodeArray addObject:@"ANSI_X3.110"]; - [charCodeArray addObject:@"ASCII"]; - [charCodeArray addObject:@"ECMA-114"]; - [charCodeArray addObject:@"ECMA-118"]; - [charCodeArray addObject:@"ECMA-128"]; - [charCodeArray addObject:@"ECMA-CYRILLIC"]; - [charCodeArray addObject:@"IEC_P27-1"]; - [charCodeArray addObject:@"ISO-8859-1"]; - [charCodeArray addObject:@"ISO-8859-2"]; - [charCodeArray addObject:@"ISO-8859-3"]; - [charCodeArray addObject:@"ISO-8859-4"]; - [charCodeArray addObject:@"ISO-8859-5"]; - [charCodeArray addObject:@"ISO-8859-6"]; - [charCodeArray addObject:@"ISO-8859-7"]; - [charCodeArray addObject:@"ISO-8859-8"]; - [charCodeArray addObject:@"ISO-8859-9"]; - [charCodeArray addObject:@"ISO-8859-9E"]; - [charCodeArray addObject:@"ISO-8859-10"]; - [charCodeArray addObject:@"ISO-8859-11"]; - [charCodeArray addObject:@"ISO-8859-13"]; - [charCodeArray addObject:@"ISO-8859-14"]; - [charCodeArray addObject:@"ISO-8859-15"]; - [charCodeArray addObject:@"ISO-8859-16"]; - [charCodeArray addObject:@"UTF-7"]; - [charCodeArray addObject:@"UTF-8"]; - [charCodeArray addObject:@"UTF-16"]; - [charCodeArray addObject:@"UTF-16LE"]; - [charCodeArray addObject:@"UTF-16BE"]; - [charCodeArray addObject:@"UTF-32"]; - [charCodeArray addObject:@"UTF-32LE"]; - [charCodeArray addObject:@"UTF-32BE"]; - - charCodeArrayDefIndex = 11; - } - - return self; -} - - -- (void)resetWithTitle:(hb_title_t *)title -{ - if (!title) - { - return; - } - fTitle = title; - - /* reset the subtitle source array */ - if (subtitleSourceArray) - { - [subtitleSourceArray release]; - } - subtitleSourceArray = [[NSMutableArray alloc] init]; - - /* now populate the array with the source subtitle track info */ - int i; - hb_subtitle_t *subtitle; - NSMutableArray *forcedSourceNamesArray = [[NSMutableArray alloc] init]; - for (i = 0; i < hb_list_count(fTitle->list_subtitle); i++) - { - subtitle = (hb_subtitle_t*)hb_list_item(fTitle->list_subtitle, i); - - /* Human-readable representation of subtitle->source */ - NSString *bitmapOrText = subtitle->format == PICTURESUB ? @"Bitmap" : @"Text"; - NSString *subSourceName = [NSString stringWithUTF8String:hb_subsource_name(subtitle->source)]; - /* if the subtitle track can be forced, add its source name to the array */ - if (hb_subtitle_can_force(subtitle->source) && - [forcedSourceNamesArray containsObject:subSourceName] == NO) - { - [forcedSourceNamesArray addObject:subSourceName]; - } - - /* create a dictionary of source subtitle information to store in our array */ - NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init]; - /* Subtitle Source track name */ - [newSubtitleSourceTrack setObject:[NSString stringWithFormat:@"%d - %@ - (%@) (%@)", - i, [NSString stringWithUTF8String:subtitle->lang], - bitmapOrText,subSourceName] - forKey:@"sourceTrackName"]; - /* Subtitle Source track number, type and features */ - [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:i] forKey:@"sourceTrackNum"]; - [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:subtitle->source] forKey:@"sourceTrackType"]; - [subtitleSourceArray addObject:newSubtitleSourceTrack]; - [newSubtitleSourceTrack autorelease]; - } - - /* now set the name of the Foreign Audio Search track */ - if ([forcedSourceNamesArray count]) - { - [forcedSourceNamesArray sortUsingComparator:^(id obj1, id obj2) - { - return [((NSString*)obj1) compare:((NSString*)obj2)]; - }]; - NSString *tempString; - NSString *tempList = @""; - NSEnumerator *enumerator = [forcedSourceNamesArray objectEnumerator]; - while (tempString = (NSString*)[enumerator nextObject]) - { - if ([tempList length]) - { - tempList = [tempList stringByAppendingString:@", "]; - } - tempList = [tempList stringByAppendingString:tempString]; - } - [foreignAudioSearchTrackName release]; - foreignAudioSearchTrackName = [[NSString stringWithFormat:@"Foreign Audio Search - (Bitmap) (%@)", tempList] - retain]; - } - else - { - [foreignAudioSearchTrackName release]; - foreignAudioSearchTrackName = @"Foreign Audio Search - (Bitmap)"; - } - [forcedSourceNamesArray release]; - - /* reset the subtitle output array */ - if (subtitleArray) - { - [subtitleArray release]; - } - subtitleArray = [[NSMutableArray alloc] init]; - [self addSubtitleTrack]; -} - -#pragma mark - -#pragma mark Create new Subtitles - -- (void)addSubtitleTrack -{ - [subtitleArray addObject:[self createSubtitleTrack]]; -} - -/* Creates a new subtitle track and stores it in an NSMutableDictionary */ -- (NSDictionary *)createSubtitleTrack -{ - NSMutableDictionary *newSubtitleTrack = [[NSMutableDictionary alloc] init]; - /* Subtitle Source track popup index */ - [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackNum"]; - /* Subtitle Source track popup language */ - [newSubtitleTrack setObject:@"None" forKey:@"subtitleSourceTrackName"]; - /* Subtitle track forced state */ - [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"]; - /* Subtitle track burned state */ - [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; - /* Subtitle track default state */ - [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; - - [newSubtitleTrack autorelease]; - return newSubtitleTrack; -} - -- (void)createSubtitleSrtTrack:(NSURL *)fileURL -{ - /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */ - NSString *displayname = [fileURL lastPathComponent];// grok an appropriate display name from the srt subtitle */ - /* create a dictionary of source subtitle information to store in our array */ - NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init]; - /* Subtitle Source track popup index */ - [newSubtitleSourceTrack setObject:[NSNumber numberWithInteger:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"]; - /* Subtitle Source track name */ - [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"]; - /* Subtitle Source track type (VobSub, Srt, etc.) */ - [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"sourceTrackType"]; - [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"subtitleSourceTrackType"]; - /* Subtitle Source file path */ - [newSubtitleSourceTrack setObject:[fileURL path] forKey:@"sourceSrtFilePath"]; - - [subtitleSourceArray addObject:newSubtitleSourceTrack]; - [newSubtitleSourceTrack autorelease]; - - /* Now create a new srt subtitle dictionary assuming the user wants to add it to their list - * Note: the subtitle array always has last entry for "None", so we need to replace its - * position in the array and tack a "None" track back on the end of the list */ - [subtitleArray removeObjectAtIndex:[subtitleArray count] - 1]; - - - NSMutableDictionary *newSubtitleSrtTrack = [[NSMutableDictionary alloc] init]; - /* Subtitle Source track popup index */ - if ([subtitleArray count] == 0) // we now have an empty array so this will be our first track - { - [newSubtitleSrtTrack setObject:[NSNumber numberWithInteger:[subtitleSourceArray count] + 1] forKey:@"subtitleSourceTrackNum"]; - } - else - { - [newSubtitleSrtTrack setObject:[NSNumber numberWithInteger:[subtitleSourceArray count]] forKey:@"subtitleSourceTrackNum"]; - } - - [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"sourceTrackType"]; - [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"subtitleSourceTrackType"]; - /* Subtitle Source track popup language */ - [newSubtitleSrtTrack setObject:displayname forKey:@"subtitleSourceTrackName"]; - /* Subtitle track forced state */ - [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"]; - /* Subtitle track burned state */ - [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; - /* Subtitle track default state */ - [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; - - /* now the srt only info, Language, Chart Code and offset */ - [newSubtitleSrtTrack setObject:[fileURL path] forKey:@"subtitleSourceSrtFilePath"]; - [newSubtitleSrtTrack setObject:[NSNumber numberWithInteger:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"]; - [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"]; - [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"]; - - [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"]; - [newSubtitleSrtTrack setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"]; - - [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackSrtOffset"]; - - - [subtitleArray addObject:newSubtitleSrtTrack]; - [newSubtitleSrtTrack release]; - - /* now add back the none track to the end of the array */ - [self addSubtitleTrack]; - - -} - -/* used to return the current subtitleArray to controller.m */ -- (NSMutableArray*) getSubtitleArray -{ - return subtitleArray; -} - -- (void)containerChanged:(int) newContainer -{ - container = newContainer; -} - -- (void)setNewSubtitles:(NSMutableArray*) newSubtitleArray -{ - /* Note: we need to look for external subtitles so it can be added to the source array track. - * Remember the source container subs are already loaded with resetTitle which is already called - * so any external sub sources need to be added to our source subs here - */ - - int i = 0; - NSEnumerator *enumerator = [newSubtitleArray objectEnumerator]; - id tempObject; - while ( tempObject = [enumerator nextObject] ) - { - /* We have an srt track */ - if ([[tempObject objectForKey:@"subtitleSourceTrackType"] intValue] == SRTSUB) - { - NSString *filePath = [tempObject objectForKey:@"subtitleSourceSrtFilePath"]; - /* Start replicate the add new srt code above */ - /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */ - NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */ - /* create a dictionary of source subtitle information to store in our array */ - NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init]; - /* Subtitle Source track popup index */ - [newSubtitleSourceTrack setObject:[NSNumber numberWithInteger:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"]; - /* Subtitle Source track name */ - [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"]; - /* Subtitle Source track type (VobSub, Srt, etc.) */ - [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"sourceTrackType"]; - [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"subtitleSourceTrackType"]; - /* Subtitle Source file path */ - [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"]; - - [subtitleSourceArray addObject:newSubtitleSourceTrack]; - [newSubtitleSourceTrack autorelease]; - /* END replicate the add new srt code above */ - } - i++; - } - - - /*Set the subtitleArray to the newSubtitleArray */ - [subtitleArray setArray:newSubtitleArray]; -} - -#pragma mark - -#pragma mark Subtitle Table Delegate Methods -/* Table View delegate methods */ -/* Returns the number of tracks displayed - * NOTE: we return one more than the actual number of tracks - * specified as we always keep one track set to "None" which is ignored - * for setting up tracks, but is used to add tracks. - */ -- (NSUInteger)numberOfRowsInTableView:(NSTableView *)aTableView -{ - if( fTitle == NULL || ![subtitleArray count]) - { - return 0; - } - else - { - return [subtitleArray count]; - } -} - -/* Used to tell the Table view which information is to be displayed per item */ -- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex -{ - NSString *cellEntry = @"__DATA ERROR__"; - - /* we setup whats displayed given the column identifier */ - if ([[aTableColumn identifier] isEqualToString:@"track"]) - { - /* 'track' is a popup of all available source subtitle tracks for the given title */ - NSPopUpButtonCell *cellTrackPopup = [[NSPopUpButtonCell alloc] init]; - [cellTrackPopup autorelease]; - /* Set the Popups properties */ - [cellTrackPopup setControlSize:NSSmallControlSize]; - [cellTrackPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; - - - /* Add our initial "None" track which we use to add source tracks or remove tracks. - * "None" is always index 0. - */ - [[cellTrackPopup menu] addItemWithTitle: @"None" action: NULL keyEquivalent: @""]; - - /* Foreign Audio Search (index 1 in the popup) is only available for the first track */ - if (rowIndex == 0) - { - // TODO: hide the track when no force-able subtitles are present in the source - [[cellTrackPopup menu] addItemWithTitle:foreignAudioSearchTrackName - action:NULL - keyEquivalent:@""]; - } - - int i; - for(i = 0; i < [subtitleSourceArray count]; i++ ) - { - [[cellTrackPopup menu] addItemWithTitle: [[subtitleSourceArray objectAtIndex:i] objectForKey: @"sourceTrackName"] action: NULL keyEquivalent: @""]; - } - - - [aTableColumn setDataCell:cellTrackPopup]; - - } - else if ([[aTableColumn identifier] isEqualToString:@"forced"]) - { - /* 'forced' is a checkbox to determine if a given source track is only to be forced */ - NSButtonCell *cellForcedCheckBox = [[NSButtonCell alloc] init]; - [cellForcedCheckBox autorelease]; - [cellForcedCheckBox setButtonType:NSSwitchButton]; - [cellForcedCheckBox setImagePosition:NSImageOnly]; - [cellForcedCheckBox setAllowsMixedState:NO]; - [aTableColumn setDataCell:cellForcedCheckBox]; - - } - else if ([[aTableColumn identifier] isEqualToString:@"burned"]) - { - /* 'burned' is a checkbox to determine if a given source track is only to be burned */ - NSButtonCell *cellBurnedCheckBox = [[NSButtonCell alloc] init]; - [cellBurnedCheckBox autorelease]; - [cellBurnedCheckBox setButtonType:NSSwitchButton]; - [cellBurnedCheckBox setImagePosition:NSImageOnly]; - [cellBurnedCheckBox setAllowsMixedState:NO]; - [aTableColumn setDataCell:cellBurnedCheckBox]; - } - else if ([[aTableColumn identifier] isEqualToString:@"default"]) - { - NSButtonCell *cellDefaultCheckBox = [[NSButtonCell alloc] init]; - [cellDefaultCheckBox autorelease]; - [cellDefaultCheckBox setButtonType:NSSwitchButton]; - [cellDefaultCheckBox setImagePosition:NSImageOnly]; - [cellDefaultCheckBox setAllowsMixedState:NO]; - [aTableColumn setDataCell:cellDefaultCheckBox]; - } - /* These next three columns only apply to srt's. they are disabled for source subs */ - else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"]) - { - /* 'srt_lang' is a popup of commonly used languages to be matched to the source srt file */ - NSPopUpButtonCell *cellSrtLangPopup = [[NSPopUpButtonCell alloc] init]; - [cellSrtLangPopup autorelease]; - /* Set the Popups properties */ - [cellSrtLangPopup setControlSize:NSSmallControlSize]; - [cellSrtLangPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; - /* list our languages as per the languagesArray */ - int i; - for(i = 0; i < [languagesArray count]; i++ ) - { - [[cellSrtLangPopup menu] addItemWithTitle: [[languagesArray objectAtIndex:i] objectAtIndex:0] action: NULL keyEquivalent: @""]; - } - [aTableColumn setDataCell:cellSrtLangPopup]; - } - else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"]) - { - /* 'srt_charcode' is a popup of commonly used character codes to be matched to the source srt file */ - NSPopUpButtonCell *cellSrtCharCodePopup = [[NSPopUpButtonCell alloc] init]; - [cellSrtCharCodePopup autorelease]; - /* Set the Popups properties */ - [cellSrtCharCodePopup setControlSize:NSSmallControlSize]; - [cellSrtCharCodePopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; - /* list our character codes, as per charCodeArray */ - - int i; - for(i = 0; i < [charCodeArray count]; i++ ) - { - [[cellSrtCharCodePopup menu] addItemWithTitle: [charCodeArray objectAtIndex:i] action: NULL keyEquivalent: @""]; - } - [aTableColumn setDataCell:cellSrtCharCodePopup]; - - } - else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"]) - { - if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"]) - { - cellEntry = [NSString stringWithFormat:@"%d",[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"] intValue]]; - } - else - { - cellEntry = [NSString stringWithFormat:@"%d",0]; - } - } - else - { - cellEntry = nil; - } - - return cellEntry; -} - -/* Called whenever a widget in the table is edited or changed, we use it to record the change in the controlling array - * including removing and adding new tracks via the "None" ("track" index of 0) */ -- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex -{ - - if ([[aTableColumn identifier] isEqualToString:@"track"]) - { - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleSourceTrackNum"]; - /* Set the array to track if we are vobsub (picture sub) */ - if ([anObject intValue] != 0) - { - /* The first row has an additional track (Foreign Audio Search) */ - int sourceSubtitleIndex = [anObject intValue] - 1 - (rowIndex == 0); - - if(rowIndex == 0 && [anObject intValue] == 1) - { - /* - * we are foreign lang search, which is inherently bitmap - * - * since it can be either VOBSUB or PGS and the latter can't be - * passed through to MP4, we need to know whether there are any - * PGS tracks in the source - otherwise we can just set the - * source track type to VOBSUB - */ - int subtitleTrackType = VOBSUB; - if ([foreignAudioSearchTrackName rangeOfString: - [NSString stringWithUTF8String: - hb_subsource_name(PGSSUB)]].location != NSNotFound) - { - subtitleTrackType = PGSSUB; - } - // now set the track type - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:subtitleTrackType] forKey:@"subtitleSourceTrackType"]; - // foreign lang search is most useful when combined w/Forced Only - make it default - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackForced"]; - } - /* check to see if we are an srt, in which case set our file path and source track type kvp's*/ - else if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] intValue] == SRTSUB) - { - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:SRTSUB] - forKey:@"subtitleSourceTrackType"]; - [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] - forKey:@"subtitleSourceSrtFilePath"]; - } - else - { - [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] - forKey:@"subtitleSourceTrackType"]; - } - - if (!hb_subtitle_can_burn([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue])) - { - /* the source track cannot be burned in, so uncheck the widget */ - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; - } - - if (!hb_subtitle_can_force([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue])) - { - /* the source track does not support forced flags, so uncheck the widget */ - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"]; - } - } - } - else if ([[aTableColumn identifier] isEqualToString:@"forced"]) - { - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackForced"]; - } - else if ([[aTableColumn identifier] isEqualToString:@"burned"]) - { - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"]; - if([anObject intValue] == 1) - { - /* Burned In and Default are mutually exclusive */ - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; - } - /* now we need to make sure no other tracks are set to burned if we have set burned */ - if ([anObject intValue] == 1) - { - int i = 0; - NSEnumerator *enumerator = [subtitleArray objectEnumerator]; - id tempObject; - while ( tempObject = [enumerator nextObject] ) - { - if (i != rowIndex ) - { - [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; - } - i++; - } - } - } - else if ([[aTableColumn identifier] isEqualToString:@"default"]) - { - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"]; - if([anObject intValue] == 1) - { - /* Burned In and Default are mutually exclusive */ - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; - } - /* now we need to make sure no other tracks are set to default */ - if ([anObject intValue] == 1) - { - int i = 0; - NSEnumerator *enumerator = [subtitleArray objectEnumerator]; - id tempObject; - while ( tempObject = [enumerator nextObject] ) - { - if (i != rowIndex) - { - [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; - } - i++; - } - } - - } - /* These next three columns only apply to srt's. they are disabled for source subs */ - else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"]) - { - - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtLanguageIndex"]; - [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"]; - [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"]; - - } - else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"]) - { - /* charCodeArray */ - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtCharCodeIndex"]; - [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:[anObject intValue]] forKey:@"subtitleTrackSrtCharCode"]; - } - else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"]) - { - [[subtitleArray objectAtIndex:rowIndex] setObject:anObject forKey:@"subtitleTrackSrtOffset"]; - } - - - /* now lets do a bit of logic to add / remove tracks as necessary via the "None" track (index 0) */ - if ([[aTableColumn identifier] isEqualToString:@"track"]) - { - - /* Since currently no quicktime based playback devices support soft vobsubs in mp4, we make sure "burned in" is specified - * by default to avoid massive confusion and anarchy. However we also want to guard against multiple burned in subtitle tracks - * as libhb would ignore all but the first one anyway. Plus it would probably be stupid. - */ - if ((container & HB_MUX_MASK_MP4) && ([anObject intValue] != 0)) - { - if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue] == VOBSUB) - { - /* lets see if there are currently any burned in subs specified */ - NSEnumerator *enumerator = [subtitleArray objectEnumerator]; - id tempObject; - BOOL subtrackBurnedInFound = NO; - while ( tempObject = [enumerator nextObject] ) - { - if ([[tempObject objectForKey:@"subtitleTrackBurned"] intValue] == 1) - { - subtrackBurnedInFound = YES; - } - } - /* if we have no current vobsub set to burn it in ... burn it in by default */ - if (!subtrackBurnedInFound) - { - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"]; - /* Burned In and Default are mutually exclusive */ - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; - } - } - } - - /* We use the track popup index number (presumes index 0 is "None" which is ignored and only used to remove tracks if need be) - * to determine whether to 1 modify an existing track, 2. add a new empty "None" track or 3. remove an existing track. - */ - - if ([anObject intValue] != 0 && rowIndex == [subtitleArray count] - 1) // if we have a last track which != "None" - { - /* add a new empty None track */ - [self addSubtitleTrack]; - - } - else if ([anObject intValue] == 0 && rowIndex != ([subtitleArray count] -1))// if this track is set to "None" and not the last track displayed - { - /* we know the user chose to remove this track by setting it to None, so remove it from the array */ - /* However,if this is the first track we have to reset the selected index of the next track by + 1, since it will now become - * the first track, which has to account for the extra "Foreign Language Search" index. */ - if (rowIndex == 0 && [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue] != 0) - { - /* get the index of the selection in row one (which is track two) */ - int trackOneSelectedIndex = [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue]; - /* increment the index of the subtitle menu item by one, to account for Foreign Language Search which is unique to the first track */ - [[subtitleArray objectAtIndex: 1] setObject:[NSNumber numberWithInt:trackOneSelectedIndex + 1] forKey:@"subtitleSourceTrackNum"]; - } - /* now that we have made the adjustment for track one (index 0) go ahead and delete the track */ - [subtitleArray removeObjectAtIndex: rowIndex]; - } - - - - } - - [aTableView reloadData]; -} - - -/* Gives fine grained control over the final drawing of the widget, including widget status via the controlling array */ -- (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex -{ - /* we setup whats displayed given the column identifier */ - if ([[aTableColumn identifier] isEqualToString:@"track"]) - { - /* Set the index of the recorded source track here */ - [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue]]; - /* now that we have actually selected our track, we can grok the titleOfSelectedItem for that track */ - [[subtitleArray objectAtIndex:rowIndex] setObject:[[aTableColumn dataCellForRow:rowIndex] titleOfSelectedItem] forKey:@"subtitleSourceTrackName"]; - - } - else - { - - [aCell setAlignment:NSCenterTextAlignment]; - /* If the Track is None, we disable the other cells as None is an empty track */ - if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0) - { - [aCell setState:0]; - [aCell setEnabled:NO]; - } - else - { - /* Since we have a valid track, we go ahead and enable the rest of the widgets and set them according to the controlling array */ - [aCell setEnabled:YES]; - } - - if ([[aTableColumn identifier] isEqualToString:@"forced"]) - { - [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackForced"] intValue]]; - /* Disable the "Forced Only" checkbox if a) the track is "None" or b) the subtitle track doesn't support forced flags */ - if (![[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] || - !hb_subtitle_can_force([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue])) - { - [aCell setEnabled:NO]; - } - else - { - [aCell setEnabled:YES]; - } - } - else if ([[aTableColumn identifier] isEqualToString:@"burned"]) - { - [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackBurned"] intValue]]; - /* - * Disable the "Burned In" checkbox if: - * a) the track is "None" OR - * b) the subtitle track can't be burned in OR - * c) the subtitle track can't be passed through (e.g. PGS w/MP4) - */ - int subtitleTrackType = [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue]; - if (![[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] || - !hb_subtitle_can_burn(subtitleTrackType) || !hb_subtitle_can_pass(subtitleTrackType, container)) - { - [aCell setEnabled:NO]; - } - else - { - [aCell setEnabled:YES]; - } - } - else if ([[aTableColumn identifier] isEqualToString:@"default"]) - { - /* - * Disable the "Default" checkbox if: - * a) the track is "None" OR - * b) the subtitle track can't be passed through (e.g. PGS w/MP4) - */ - if (![[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] || - !hb_subtitle_can_pass([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue], container)) - { - [aCell setState:NSOffState]; - [aCell setEnabled:NO]; - } - else - { - [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackDefault"] intValue]]; - [aCell setEnabled:YES]; - } - } - /* These next three columns only apply to srt's. they are disabled for source subs */ - else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"]) - { - /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/ - if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue] == SRTSUB) - { - [aCell setEnabled:YES]; - if([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"]) - { - [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"] intValue]]; - } - else - { - [aCell selectItemAtIndex:languagesArrayDefIndex]; // English - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInteger:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"]; - [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"]; - [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"]; - - } - } - else - { - [aCell setEnabled:NO]; - } - } - else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"]) - { - /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/ - if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue] == SRTSUB) - { - [aCell setEnabled:YES]; - if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"]) - { - [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"] intValue]]; - } - else - { - [aCell selectItemAtIndex:charCodeArrayDefIndex]; // ISO-8859-1 - [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"]; - [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"]; - } - } - else - { - [aCell setEnabled:NO]; - } - } - else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"]) - { - if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue] == SRTSUB) - { - [aCell setEnabled:YES]; - } - else - { - [aCell setEnabled:NO]; - } - } - - /* - * Let's check whether any subtitles in the list cannot be passed through. - * Set the first of any such subtitles to burned-in, remove the others. - */ - id tempObject; - int subtitleTrackType; - BOOL convertToBurnInUsed = NO; - NSMutableArray *tracksToDelete = [[NSMutableArray alloc] init]; - NSEnumerator *enumerator = [subtitleArray objectEnumerator]; - /* convert any non-None incompatible tracks to burn-in or remove them */ - while ((tempObject = [enumerator nextObject]) && - [tempObject objectForKey:@"subtitleSourceTrackType"]) - { - subtitleTrackType = [[tempObject objectForKey:@"subtitleSourceTrackType"] intValue]; - if (!hb_subtitle_can_pass(subtitleTrackType, container)) - { - if (convertToBurnInUsed == NO) - { - /* we haven't set any track to burned-in yet, so we can */ - [tempObject setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"]; - convertToBurnInUsed = YES; //remove any additional tracks - } - else - { - /* we already have a burned-in track, we must remove others */ - [tracksToDelete addObject:tempObject]; - } - } - } - /* if we converted a track to burned-in, unset it for tracks that support passthru */ - if (convertToBurnInUsed == YES) - { - enumerator = [subtitleArray objectEnumerator]; - while ((tempObject = [enumerator nextObject]) && - [tempObject objectForKey:@"subtitleSourceTrackType"]) - { - subtitleTrackType = [[tempObject objectForKey:@"subtitleSourceTrackType"] intValue]; - if (hb_subtitle_can_pass(subtitleTrackType, container)) - { - [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; - } - } - } - /* this is where the actual removal takes place */ - if ([tracksToDelete count] > 0) - { - [subtitleArray removeObjectsInArray:tracksToDelete]; - [aTableView reloadData]; - /* this must be called after reloadData so as to not block the UI */ - [[NSAlert alertWithMessageText:@"Subtitle tack(s) removed" - defaultButton:@"OK" - alternateButton:nil - otherButton:nil - informativeTextWithFormat:@"%lu subtitle %@ could neither be converted to burn-in nor passed through", - (unsigned long)[tracksToDelete count], - [tracksToDelete count] > 1 ? @"tracks" : @"track"] runModal]; - } - [tracksToDelete release]; - } -} - - -@end diff --git a/macosx/HBSubtitlesController.h b/macosx/HBSubtitlesController.h new file mode 100644 index 000000000..66428bf39 --- /dev/null +++ b/macosx/HBSubtitlesController.h @@ -0,0 +1,21 @@ +/* $Id: HBSubtitles.h + + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + +#import + +/** + * HBSubtitlesController + * Responds to HBContainerChangedNotification and HBTitleChangedNotification notifications. + */ +@interface HBSubtitlesController : NSViewController + +- (void)enableUI:(BOOL)b; +- (void)addTracksFromQueue:(NSMutableArray *)newSubtitleArray; + +// Get the list of subtitles tracks +@property (readonly, nonatomic) NSArray *subtitleArray; + +@end diff --git a/macosx/HBSubtitlesController.m b/macosx/HBSubtitlesController.m new file mode 100644 index 000000000..43bed5034 --- /dev/null +++ b/macosx/HBSubtitlesController.m @@ -0,0 +1,928 @@ +/* $Id: HBSubtitles.m + + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + +#import "HBSubtitlesController.h" +#import "Controller.h" +#include "hb.h" +#include "lang.h" + +@interface HBSubtitlesController () +{ + NSMutableArray *subtitleArray; // contains the output subtitle track info + NSMutableArray *subtitleSourceArray;// contains the source subtitle track info + NSString *foreignAudioSearchTrackName; + NSMutableArray *languagesArray; // array of languages taken from lang.c + NSInteger languagesArrayDefIndex; + NSMutableArray *charCodeArray; // array of character codes + int charCodeArrayDefIndex; + int container; +} + +@property (assign) IBOutlet NSButton *fBrowseSrtFileButton; +@property (assign) IBOutlet NSTableView *fTableView; + +@end + +@implementation HBSubtitlesController + +- (instancetype)init +{ + self = [super initWithNibName:@"Subtitles" bundle:nil]; + if (self) + { + /* setup our array of languages */ + const iso639_lang_t *lang; + languagesArray = [[NSMutableArray alloc] init]; + for (lang = lang_get_next(NULL); lang != NULL; lang = lang_get_next(lang)) + { + [languagesArray addObject:[NSArray arrayWithObjects: + [NSString stringWithUTF8String:lang->eng_name], + [NSString stringWithUTF8String:lang->iso639_2], + nil]]; + if (!strcasecmp(lang->eng_name, "English")) + { + languagesArrayDefIndex = [languagesArray count] - 1; + } + } + + /* populate the charCodeArray */ + charCodeArray = [[NSMutableArray alloc] init]; + [charCodeArray addObject:@"ANSI_X3.4-1968"]; + [charCodeArray addObject:@"ANSI_X3.4-1986"]; + [charCodeArray addObject:@"ANSI_X3.4"]; + [charCodeArray addObject:@"ANSI_X3.110-1983"]; + [charCodeArray addObject:@"ANSI_X3.110"]; + [charCodeArray addObject:@"ASCII"]; + [charCodeArray addObject:@"ECMA-114"]; + [charCodeArray addObject:@"ECMA-118"]; + [charCodeArray addObject:@"ECMA-128"]; + [charCodeArray addObject:@"ECMA-CYRILLIC"]; + [charCodeArray addObject:@"IEC_P27-1"]; + [charCodeArray addObject:@"ISO-8859-1"]; + [charCodeArray addObject:@"ISO-8859-2"]; + [charCodeArray addObject:@"ISO-8859-3"]; + [charCodeArray addObject:@"ISO-8859-4"]; + [charCodeArray addObject:@"ISO-8859-5"]; + [charCodeArray addObject:@"ISO-8859-6"]; + [charCodeArray addObject:@"ISO-8859-7"]; + [charCodeArray addObject:@"ISO-8859-8"]; + [charCodeArray addObject:@"ISO-8859-9"]; + [charCodeArray addObject:@"ISO-8859-9E"]; + [charCodeArray addObject:@"ISO-8859-10"]; + [charCodeArray addObject:@"ISO-8859-11"]; + [charCodeArray addObject:@"ISO-8859-13"]; + [charCodeArray addObject:@"ISO-8859-14"]; + [charCodeArray addObject:@"ISO-8859-15"]; + [charCodeArray addObject:@"ISO-8859-16"]; + [charCodeArray addObject:@"UTF-7"]; + [charCodeArray addObject:@"UTF-8"]; + [charCodeArray addObject:@"UTF-16"]; + [charCodeArray addObject:@"UTF-16LE"]; + [charCodeArray addObject:@"UTF-16BE"]; + [charCodeArray addObject:@"UTF-32"]; + [charCodeArray addObject:@"UTF-32LE"]; + [charCodeArray addObject:@"UTF-32BE"]; + + charCodeArrayDefIndex = 11; + + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(containerChanged:) name: HBContainerChangedNotification object: nil]; + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(titleChanged:) name: HBTitleChangedNotification object: nil]; + } + + return self; +} + +- (void)titleChanged:(NSNotification *)aNotification +{ + NSDictionary *notDict = [aNotification userInfo]; + NSData *theData = [notDict objectForKey: keyTitleTag]; + hb_title_t *title = NULL; + + [theData getBytes: &title length: sizeof(title)]; + if (title) + { + /* reset the subtitle source array */ + if (subtitleSourceArray) + { + [subtitleSourceArray release]; + } + subtitleSourceArray = [[NSMutableArray alloc] init]; + + /* now populate the array with the source subtitle track info */ + int i; + hb_subtitle_t *subtitle; + NSMutableArray *forcedSourceNamesArray = [[NSMutableArray alloc] init]; + for (i = 0; i < hb_list_count(title->list_subtitle); i++) + { + subtitle = (hb_subtitle_t*)hb_list_item(title->list_subtitle, i); + + /* Human-readable representation of subtitle->source */ + NSString *bitmapOrText = subtitle->format == PICTURESUB ? @"Bitmap" : @"Text"; + NSString *subSourceName = [NSString stringWithUTF8String:hb_subsource_name(subtitle->source)]; + /* if the subtitle track can be forced, add its source name to the array */ + if (hb_subtitle_can_force(subtitle->source) && + [forcedSourceNamesArray containsObject:subSourceName] == NO) + { + [forcedSourceNamesArray addObject:subSourceName]; + } + + /* create a dictionary of source subtitle information to store in our array */ + NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init]; + /* Subtitle Source track name */ + [newSubtitleSourceTrack setObject:[NSString stringWithFormat:@"%d - %@ - (%@) (%@)", + i, [NSString stringWithUTF8String:subtitle->lang], + bitmapOrText,subSourceName] + forKey:@"sourceTrackName"]; + /* Subtitle Source track number, type and features */ + [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:i] forKey:@"sourceTrackNum"]; + [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:subtitle->source] forKey:@"sourceTrackType"]; + [subtitleSourceArray addObject:newSubtitleSourceTrack]; + [newSubtitleSourceTrack autorelease]; + } + + /* now set the name of the Foreign Audio Search track */ + if ([forcedSourceNamesArray count]) + { + [forcedSourceNamesArray sortUsingComparator:^(id obj1, id obj2) + { + return [((NSString*)obj1) compare:((NSString*)obj2)]; + }]; + NSString *tempString; + NSString *tempList = @""; + NSEnumerator *enumerator = [forcedSourceNamesArray objectEnumerator]; + while (tempString = (NSString*)[enumerator nextObject]) + { + if ([tempList length]) + { + tempList = [tempList stringByAppendingString:@", "]; + } + tempList = [tempList stringByAppendingString:tempString]; + } + [foreignAudioSearchTrackName release]; + foreignAudioSearchTrackName = [[NSString stringWithFormat:@"Foreign Audio Search - (Bitmap) (%@)", tempList] + retain]; + } + else + { + [foreignAudioSearchTrackName release]; + foreignAudioSearchTrackName = @"Foreign Audio Search - (Bitmap)"; + } + [forcedSourceNamesArray release]; + + /* reset the subtitle output array */ + if (subtitleArray) + { + [subtitleArray release]; + } + subtitleArray = [[NSMutableArray alloc] init]; + [self addSubtitleTrack]; + } + else + { + [subtitleArray removeAllObjects]; + [subtitleSourceArray removeAllObjects]; + } + + [self.fTableView reloadData]; +} + +- (void)enableUI:(BOOL)b +{ + [self.fBrowseSrtFileButton setEnabled:b]; + [self.fTableView setEnabled:b]; +} + +#pragma mark - +#pragma mark Create new Subtitles + +- (void)addSubtitleTrack +{ + [subtitleArray addObject:[self createSubtitleTrack]]; +} + +/* Creates a new subtitle track and stores it in an NSMutableDictionary */ +- (NSDictionary *)createSubtitleTrack +{ + NSMutableDictionary *newSubtitleTrack = [[NSMutableDictionary alloc] init]; + /* Subtitle Source track popup index */ + [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackNum"]; + /* Subtitle Source track popup language */ + [newSubtitleTrack setObject:@"None" forKey:@"subtitleSourceTrackName"]; + /* Subtitle track forced state */ + [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"]; + /* Subtitle track burned state */ + [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; + /* Subtitle track default state */ + [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; + + [newSubtitleTrack autorelease]; + return newSubtitleTrack; +} + +- (void)createSubtitleSrtTrack:(NSURL *)fileURL +{ + /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */ + NSString *displayname = [fileURL lastPathComponent];// grok an appropriate display name from the srt subtitle */ + /* create a dictionary of source subtitle information to store in our array */ + NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init]; + /* Subtitle Source track popup index */ + [newSubtitleSourceTrack setObject:[NSNumber numberWithInteger:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"]; + /* Subtitle Source track name */ + [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"]; + /* Subtitle Source track type (VobSub, Srt, etc.) */ + [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"sourceTrackType"]; + [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"subtitleSourceTrackType"]; + /* Subtitle Source file path */ + [newSubtitleSourceTrack setObject:[fileURL path] forKey:@"sourceSrtFilePath"]; + + [subtitleSourceArray addObject:newSubtitleSourceTrack]; + [newSubtitleSourceTrack autorelease]; + + /* Now create a new srt subtitle dictionary assuming the user wants to add it to their list + * Note: the subtitle array always has last entry for "None", so we need to replace its + * position in the array and tack a "None" track back on the end of the list */ + [subtitleArray removeObjectAtIndex:[subtitleArray count] - 1]; + + + NSMutableDictionary *newSubtitleSrtTrack = [[NSMutableDictionary alloc] init]; + /* Subtitle Source track popup index */ + if ([subtitleArray count] == 0) // we now have an empty array so this will be our first track + { + [newSubtitleSrtTrack setObject:[NSNumber numberWithInteger:[subtitleSourceArray count] + 1] forKey:@"subtitleSourceTrackNum"]; + } + else + { + [newSubtitleSrtTrack setObject:[NSNumber numberWithInteger:[subtitleSourceArray count]] forKey:@"subtitleSourceTrackNum"]; + } + + [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"sourceTrackType"]; + [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"subtitleSourceTrackType"]; + /* Subtitle Source track popup language */ + [newSubtitleSrtTrack setObject:displayname forKey:@"subtitleSourceTrackName"]; + /* Subtitle track forced state */ + [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"]; + /* Subtitle track burned state */ + [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; + /* Subtitle track default state */ + [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; + + /* now the srt only info, Language, Chart Code and offset */ + [newSubtitleSrtTrack setObject:[fileURL path] forKey:@"subtitleSourceSrtFilePath"]; + [newSubtitleSrtTrack setObject:[NSNumber numberWithInteger:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"]; + [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"]; + [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"]; + + [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"]; + [newSubtitleSrtTrack setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"]; + + [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackSrtOffset"]; + + + [subtitleArray addObject:newSubtitleSrtTrack]; + [newSubtitleSrtTrack release]; + + /* now add back the none track to the end of the array */ + [self addSubtitleTrack]; +} + +/* used to return the current subtitleArray to controller.m */ +- (NSMutableArray *) subtitleArray +{ + return subtitleArray; +} + +// This gets called whenever the video container changes. +- (void) containerChanged: (NSNotification *) aNotification + +{ + NSDictionary *notDict = [aNotification userInfo]; + + container = [[notDict objectForKey: keyContainerTag] intValue]; + [self.fTableView reloadData]; +} + +- (void)addTracksFromQueue:(NSMutableArray *)newSubtitleArray +{ + /* Note: we need to look for external subtitles so it can be added to the source array track. + * Remember the source container subs are already loaded with resetTitle which is already called + * so any external sub sources need to be added to our source subs here + */ + + int i = 0; + for ( id tempObject in newSubtitleArray ) + { + /* We have an srt track */ + if ([[tempObject objectForKey:@"subtitleSourceTrackType"] intValue] == SRTSUB) + { + NSString *filePath = [tempObject objectForKey:@"subtitleSourceSrtFilePath"]; + /* Start replicate the add new srt code above */ + /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */ + NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */ + /* create a dictionary of source subtitle information to store in our array */ + NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init]; + /* Subtitle Source track popup index */ + [newSubtitleSourceTrack setObject:[NSNumber numberWithInteger:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"]; + /* Subtitle Source track name */ + [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"]; + /* Subtitle Source track type (VobSub, Srt, etc.) */ + [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"sourceTrackType"]; + [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:SRTSUB] forKey:@"subtitleSourceTrackType"]; + /* Subtitle Source file path */ + [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"]; + + [subtitleSourceArray addObject:newSubtitleSourceTrack]; + [newSubtitleSourceTrack autorelease]; + /* END replicate the add new srt code above */ + } + i++; + } + + /*Set the subtitleArray to the newSubtitleArray */ + [subtitleArray setArray:newSubtitleArray]; + [self.fTableView reloadData]; +} + +#pragma mark - Srt import + +- (IBAction)browseImportSrtFile:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setAllowsMultipleSelection:NO]; + [panel setCanChooseFiles:YES]; + [panel setCanChooseDirectories:NO]; + + NSURL *sourceDirectory; + if ([[NSUserDefaults standardUserDefaults] URLForKey:@"LastSrtImportDirectoryURL"]) + { + sourceDirectory = [[NSUserDefaults standardUserDefaults] URLForKey:@"LastSrtImportDirectoryURL"]; + } + else + { + sourceDirectory = [[NSURL fileURLWithPath:NSHomeDirectory()] URLByAppendingPathComponent:@"Desktop"]; + } + + /* we open up the browse srt sheet here and call for browseImportSrtFileDone after the sheet is closed */ + NSArray *fileTypes = [NSArray arrayWithObjects:@"plist", @"srt", nil]; + [panel setDirectoryURL:sourceDirectory]; + [panel setAllowedFileTypes:fileTypes]; + [panel beginSheetModalForWindow:[[self view] window] completionHandler:^(NSInteger result) { + if (result == NSOKButton) + { + NSURL *importSrtFileURL = [panel URL]; + NSURL *importSrtDirectory = [importSrtFileURL URLByDeletingLastPathComponent]; + [[NSUserDefaults standardUserDefaults] setURL:importSrtDirectory forKey:@"LastSrtImportDirectoryURL"]; + + /* now pass the string off to fSubtitlesDelegate to add the srt file to the dropdown */ + [self createSubtitleSrtTrack:importSrtFileURL]; + + [self.fTableView reloadData]; + } + }]; +} + +#pragma mark - +#pragma mark Subtitle Table Delegate Methods +/* Table View delegate methods */ +/* Returns the number of tracks displayed + * NOTE: we return one more than the actual number of tracks + * specified as we always keep one track set to "None" which is ignored + * for setting up tracks, but is used to add tracks. + */ +- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView +{ + return [subtitleArray count]; +} + +/* Used to tell the Table view which information is to be displayed per item */ +- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex +{ + NSString *cellEntry = @"__DATA ERROR__"; + + /* we setup whats displayed given the column identifier */ + if ([[aTableColumn identifier] isEqualToString:@"track"]) + { + /* 'track' is a popup of all available source subtitle tracks for the given title */ + NSPopUpButtonCell *cellTrackPopup = [[NSPopUpButtonCell alloc] init]; + [cellTrackPopup autorelease]; + /* Set the Popups properties */ + [cellTrackPopup setControlSize:NSSmallControlSize]; + [cellTrackPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; + + + /* Add our initial "None" track which we use to add source tracks or remove tracks. + * "None" is always index 0. + */ + [[cellTrackPopup menu] addItemWithTitle: @"None" action: NULL keyEquivalent: @""]; + + /* Foreign Audio Search (index 1 in the popup) is only available for the first track */ + if (rowIndex == 0) + { + // TODO: hide the track when no force-able subtitles are present in the source + [[cellTrackPopup menu] addItemWithTitle:foreignAudioSearchTrackName + action:NULL + keyEquivalent:@""]; + } + + int i; + for(i = 0; i < [subtitleSourceArray count]; i++ ) + { + [[cellTrackPopup menu] addItemWithTitle: [[subtitleSourceArray objectAtIndex:i] objectForKey: @"sourceTrackName"] action: NULL keyEquivalent: @""]; + } + + + [aTableColumn setDataCell:cellTrackPopup]; + + } + else if ([[aTableColumn identifier] isEqualToString:@"forced"]) + { + /* 'forced' is a checkbox to determine if a given source track is only to be forced */ + NSButtonCell *cellForcedCheckBox = [[NSButtonCell alloc] init]; + [cellForcedCheckBox autorelease]; + [cellForcedCheckBox setButtonType:NSSwitchButton]; + [cellForcedCheckBox setImagePosition:NSImageOnly]; + [cellForcedCheckBox setAllowsMixedState:NO]; + [aTableColumn setDataCell:cellForcedCheckBox]; + + } + else if ([[aTableColumn identifier] isEqualToString:@"burned"]) + { + /* 'burned' is a checkbox to determine if a given source track is only to be burned */ + NSButtonCell *cellBurnedCheckBox = [[NSButtonCell alloc] init]; + [cellBurnedCheckBox autorelease]; + [cellBurnedCheckBox setButtonType:NSSwitchButton]; + [cellBurnedCheckBox setImagePosition:NSImageOnly]; + [cellBurnedCheckBox setAllowsMixedState:NO]; + [aTableColumn setDataCell:cellBurnedCheckBox]; + } + else if ([[aTableColumn identifier] isEqualToString:@"default"]) + { + NSButtonCell *cellDefaultCheckBox = [[NSButtonCell alloc] init]; + [cellDefaultCheckBox autorelease]; + [cellDefaultCheckBox setButtonType:NSSwitchButton]; + [cellDefaultCheckBox setImagePosition:NSImageOnly]; + [cellDefaultCheckBox setAllowsMixedState:NO]; + [aTableColumn setDataCell:cellDefaultCheckBox]; + } + /* These next three columns only apply to srt's. they are disabled for source subs */ + else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"]) + { + /* 'srt_lang' is a popup of commonly used languages to be matched to the source srt file */ + NSPopUpButtonCell *cellSrtLangPopup = [[NSPopUpButtonCell alloc] init]; + [cellSrtLangPopup autorelease]; + /* Set the Popups properties */ + [cellSrtLangPopup setControlSize:NSSmallControlSize]; + [cellSrtLangPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; + /* list our languages as per the languagesArray */ + int i; + for(i = 0; i < [languagesArray count]; i++ ) + { + [[cellSrtLangPopup menu] addItemWithTitle: [[languagesArray objectAtIndex:i] objectAtIndex:0] action: NULL keyEquivalent: @""]; + } + [aTableColumn setDataCell:cellSrtLangPopup]; + } + else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"]) + { + /* 'srt_charcode' is a popup of commonly used character codes to be matched to the source srt file */ + NSPopUpButtonCell *cellSrtCharCodePopup = [[NSPopUpButtonCell alloc] init]; + [cellSrtCharCodePopup autorelease]; + /* Set the Popups properties */ + [cellSrtCharCodePopup setControlSize:NSSmallControlSize]; + [cellSrtCharCodePopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; + /* list our character codes, as per charCodeArray */ + + int i; + for(i = 0; i < [charCodeArray count]; i++ ) + { + [[cellSrtCharCodePopup menu] addItemWithTitle: [charCodeArray objectAtIndex:i] action: NULL keyEquivalent: @""]; + } + [aTableColumn setDataCell:cellSrtCharCodePopup]; + + } + else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"]) + { + if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"]) + { + cellEntry = [NSString stringWithFormat:@"%d",[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"] intValue]]; + } + else + { + cellEntry = [NSString stringWithFormat:@"%d",0]; + } + } + else + { + cellEntry = nil; + } + + return cellEntry; +} + +/* Called whenever a widget in the table is edited or changed, we use it to record the change in the controlling array + * including removing and adding new tracks via the "None" ("track" index of 0) */ +- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex +{ + + if ([[aTableColumn identifier] isEqualToString:@"track"]) + { + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleSourceTrackNum"]; + /* Set the array to track if we are vobsub (picture sub) */ + if ([anObject intValue] != 0) + { + /* The first row has an additional track (Foreign Audio Search) */ + int sourceSubtitleIndex = [anObject intValue] - 1 - (rowIndex == 0); + + if(rowIndex == 0 && [anObject intValue] == 1) + { + /* + * we are foreign lang search, which is inherently bitmap + * + * since it can be either VOBSUB or PGS and the latter can't be + * passed through to MP4, we need to know whether there are any + * PGS tracks in the source - otherwise we can just set the + * source track type to VOBSUB + */ + int subtitleTrackType = VOBSUB; + if ([foreignAudioSearchTrackName rangeOfString: + [NSString stringWithUTF8String: + hb_subsource_name(PGSSUB)]].location != NSNotFound) + { + subtitleTrackType = PGSSUB; + } + // now set the track type + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:subtitleTrackType] forKey:@"subtitleSourceTrackType"]; + // foreign lang search is most useful when combined w/Forced Only - make it default + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackForced"]; + } + /* check to see if we are an srt, in which case set our file path and source track type kvp's*/ + else if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] intValue] == SRTSUB) + { + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:SRTSUB] + forKey:@"subtitleSourceTrackType"]; + [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] + forKey:@"subtitleSourceSrtFilePath"]; + } + else + { + [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] + forKey:@"subtitleSourceTrackType"]; + } + + if (!hb_subtitle_can_burn([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue])) + { + /* the source track cannot be burned in, so uncheck the widget */ + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; + } + + if (!hb_subtitle_can_force([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue])) + { + /* the source track does not support forced flags, so uncheck the widget */ + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"]; + } + } + } + else if ([[aTableColumn identifier] isEqualToString:@"forced"]) + { + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackForced"]; + } + else if ([[aTableColumn identifier] isEqualToString:@"burned"]) + { + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"]; + if([anObject intValue] == 1) + { + /* Burned In and Default are mutually exclusive */ + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; + } + /* now we need to make sure no other tracks are set to burned if we have set burned */ + if ([anObject intValue] == 1) + { + int i = 0; + NSEnumerator *enumerator = [subtitleArray objectEnumerator]; + id tempObject; + while ( tempObject = [enumerator nextObject] ) + { + if (i != rowIndex ) + { + [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; + } + i++; + } + } + } + else if ([[aTableColumn identifier] isEqualToString:@"default"]) + { + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"]; + if([anObject intValue] == 1) + { + /* Burned In and Default are mutually exclusive */ + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; + } + /* now we need to make sure no other tracks are set to default */ + if ([anObject intValue] == 1) + { + int i = 0; + NSEnumerator *enumerator = [subtitleArray objectEnumerator]; + id tempObject; + while ( tempObject = [enumerator nextObject] ) + { + if (i != rowIndex) + { + [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; + } + i++; + } + } + + } + /* These next three columns only apply to srt's. they are disabled for source subs */ + else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"]) + { + + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtLanguageIndex"]; + [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"]; + [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"]; + + } + else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"]) + { + /* charCodeArray */ + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtCharCodeIndex"]; + [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:[anObject intValue]] forKey:@"subtitleTrackSrtCharCode"]; + } + else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"]) + { + [[subtitleArray objectAtIndex:rowIndex] setObject:anObject forKey:@"subtitleTrackSrtOffset"]; + } + + + /* now lets do a bit of logic to add / remove tracks as necessary via the "None" track (index 0) */ + if ([[aTableColumn identifier] isEqualToString:@"track"]) + { + + /* Since currently no quicktime based playback devices support soft vobsubs in mp4, we make sure "burned in" is specified + * by default to avoid massive confusion and anarchy. However we also want to guard against multiple burned in subtitle tracks + * as libhb would ignore all but the first one anyway. Plus it would probably be stupid. + */ + if ((container & HB_MUX_MASK_MP4) && ([anObject intValue] != 0)) + { + if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue] == VOBSUB) + { + /* lets see if there are currently any burned in subs specified */ + NSEnumerator *enumerator = [subtitleArray objectEnumerator]; + id tempObject; + BOOL subtrackBurnedInFound = NO; + while ( tempObject = [enumerator nextObject] ) + { + if ([[tempObject objectForKey:@"subtitleTrackBurned"] intValue] == 1) + { + subtrackBurnedInFound = YES; + } + } + /* if we have no current vobsub set to burn it in ... burn it in by default */ + if (!subtrackBurnedInFound) + { + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"]; + /* Burned In and Default are mutually exclusive */ + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"]; + } + } + } + + /* We use the track popup index number (presumes index 0 is "None" which is ignored and only used to remove tracks if need be) + * to determine whether to 1 modify an existing track, 2. add a new empty "None" track or 3. remove an existing track. + */ + + if ([anObject intValue] != 0 && rowIndex == [subtitleArray count] - 1) // if we have a last track which != "None" + { + /* add a new empty None track */ + [self addSubtitleTrack]; + + } + else if ([anObject intValue] == 0 && rowIndex != ([subtitleArray count] -1))// if this track is set to "None" and not the last track displayed + { + /* we know the user chose to remove this track by setting it to None, so remove it from the array */ + /* However,if this is the first track we have to reset the selected index of the next track by + 1, since it will now become + * the first track, which has to account for the extra "Foreign Language Search" index. */ + if (rowIndex == 0 && [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue] != 0) + { + /* get the index of the selection in row one (which is track two) */ + int trackOneSelectedIndex = [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue]; + /* increment the index of the subtitle menu item by one, to account for Foreign Language Search which is unique to the first track */ + [[subtitleArray objectAtIndex: 1] setObject:[NSNumber numberWithInt:trackOneSelectedIndex + 1] forKey:@"subtitleSourceTrackNum"]; + } + /* now that we have made the adjustment for track one (index 0) go ahead and delete the track */ + [subtitleArray removeObjectAtIndex: rowIndex]; + } + + + + } + + [aTableView reloadData]; +} + + +/* Gives fine grained control over the final drawing of the widget, including widget status via the controlling array */ +- (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex +{ + /* we setup whats displayed given the column identifier */ + if ([[aTableColumn identifier] isEqualToString:@"track"]) + { + /* Set the index of the recorded source track here */ + [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue]]; + /* now that we have actually selected our track, we can grok the titleOfSelectedItem for that track */ + [[subtitleArray objectAtIndex:rowIndex] setObject:[[aTableColumn dataCellForRow:rowIndex] titleOfSelectedItem] forKey:@"subtitleSourceTrackName"]; + + } + else + { + + [aCell setAlignment:NSCenterTextAlignment]; + /* If the Track is None, we disable the other cells as None is an empty track */ + if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0) + { + [aCell setState:0]; + [aCell setEnabled:NO]; + } + else + { + /* Since we have a valid track, we go ahead and enable the rest of the widgets and set them according to the controlling array */ + [aCell setEnabled:YES]; + } + + if ([[aTableColumn identifier] isEqualToString:@"forced"]) + { + [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackForced"] intValue]]; + /* Disable the "Forced Only" checkbox if a) the track is "None" or b) the subtitle track doesn't support forced flags */ + if (![[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] || + !hb_subtitle_can_force([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue])) + { + [aCell setEnabled:NO]; + } + else + { + [aCell setEnabled:YES]; + } + } + else if ([[aTableColumn identifier] isEqualToString:@"burned"]) + { + [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackBurned"] intValue]]; + /* + * Disable the "Burned In" checkbox if: + * a) the track is "None" OR + * b) the subtitle track can't be burned in OR + * c) the subtitle track can't be passed through (e.g. PGS w/MP4) + */ + int subtitleTrackType = [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue]; + if (![[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] || + !hb_subtitle_can_burn(subtitleTrackType) || !hb_subtitle_can_pass(subtitleTrackType, container)) + { + [aCell setEnabled:NO]; + } + else + { + [aCell setEnabled:YES]; + } + } + else if ([[aTableColumn identifier] isEqualToString:@"default"]) + { + /* + * Disable the "Default" checkbox if: + * a) the track is "None" OR + * b) the subtitle track can't be passed through (e.g. PGS w/MP4) + */ + if (![[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] || + !hb_subtitle_can_pass([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue], container)) + { + [aCell setState:NSOffState]; + [aCell setEnabled:NO]; + } + else + { + [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackDefault"] intValue]]; + [aCell setEnabled:YES]; + } + } + /* These next three columns only apply to srt's. they are disabled for source subs */ + else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"]) + { + /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/ + if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue] == SRTSUB) + { + [aCell setEnabled:YES]; + if([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"]) + { + [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"] intValue]]; + } + else + { + [aCell selectItemAtIndex:languagesArrayDefIndex]; // English + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInteger:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"]; + [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"]; + [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"]; + + } + } + else + { + [aCell setEnabled:NO]; + } + } + else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"]) + { + /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/ + if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue] == SRTSUB) + { + [aCell setEnabled:YES]; + if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"]) + { + [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"] intValue]]; + } + else + { + [aCell selectItemAtIndex:charCodeArrayDefIndex]; // ISO-8859-1 + [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"]; + [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"]; + } + } + else + { + [aCell setEnabled:NO]; + } + } + else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"]) + { + if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] intValue] == SRTSUB) + { + [aCell setEnabled:YES]; + } + else + { + [aCell setEnabled:NO]; + } + } + + /* + * Let's check whether any subtitles in the list cannot be passed through. + * Set the first of any such subtitles to burned-in, remove the others. + */ + id tempObject; + int subtitleTrackType; + BOOL convertToBurnInUsed = NO; + NSMutableArray *tracksToDelete = [[NSMutableArray alloc] init]; + NSEnumerator *enumerator = [subtitleArray objectEnumerator]; + /* convert any non-None incompatible tracks to burn-in or remove them */ + while ((tempObject = [enumerator nextObject]) && + [tempObject objectForKey:@"subtitleSourceTrackType"]) + { + subtitleTrackType = [[tempObject objectForKey:@"subtitleSourceTrackType"] intValue]; + if (!hb_subtitle_can_pass(subtitleTrackType, container)) + { + if (convertToBurnInUsed == NO) + { + /* we haven't set any track to burned-in yet, so we can */ + [tempObject setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"]; + convertToBurnInUsed = YES; //remove any additional tracks + } + else + { + /* we already have a burned-in track, we must remove others */ + [tracksToDelete addObject:tempObject]; + } + } + } + /* if we converted a track to burned-in, unset it for tracks that support passthru */ + if (convertToBurnInUsed == YES) + { + enumerator = [subtitleArray objectEnumerator]; + while ((tempObject = [enumerator nextObject]) && + [tempObject objectForKey:@"subtitleSourceTrackType"]) + { + subtitleTrackType = [[tempObject objectForKey:@"subtitleSourceTrackType"] intValue]; + if (hb_subtitle_can_pass(subtitleTrackType, container)) + { + [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"]; + } + } + } + /* this is where the actual removal takes place */ + if ([tracksToDelete count] > 0) + { + [subtitleArray removeObjectsInArray:tracksToDelete]; + [aTableView reloadData]; + /* this must be called after reloadData so as to not block the UI */ + [[NSAlert alertWithMessageText:@"Subtitle tack(s) removed" + defaultButton:@"OK" + alternateButton:nil + otherButton:nil + informativeTextWithFormat:@"%lu subtitle %@ could neither be converted to burn-in nor passed through", + (unsigned long)[tracksToDelete count], + [tracksToDelete count] > 1 ? @"tracks" : @"track"] runModal]; + } + [tracksToDelete release]; + } +} + +@end diff --git a/macosx/HBVideoController.h b/macosx/HBVideoController.h new file mode 100644 index 000000000..75a65f292 --- /dev/null +++ b/macosx/HBVideoController.h @@ -0,0 +1,51 @@ +/* HBVideoController.h $ + + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + +#import +#include "hb.h" + +@class HBController; +@class HBAdvancedController; + +extern NSString *HBVideoEncoderChangedNotification; + +/** + * HBVideoController + * + * Responds to HBContainerChangedNotification and HBTitleChangedNotification notifications. + */ +@interface HBVideoController : NSViewController + +- (void)enableUI:(BOOL)b; + +// Methods to apply the settings to the controller +- (void)applyVideoSettingsFromQueue:(NSDictionary *)queueToApply; +- (void)applySettingsFromPreset:(NSDictionary *)preset; + +// Methods to get back the controller settings +- (void)prepareVideoForQueueFileJob:(NSMutableDictionary *)queueFileJob; +- (void)prepareVideoForJobPreview:(hb_job_t *)job andTitle:(hb_title_t *)title; +- (void)prepareVideoForPreset:(NSMutableDictionary *)preset; + +- (IBAction)x264PresetsChangedDisplayExpandedOptions:(id)sender; + +@property (nonatomic, copy, readwrite) NSString *pictureSettingsField; +@property (nonatomic, copy, readwrite) NSString *pictureFiltersField; + +// Property exposed for the auto name function +@property (nonatomic, readonly) int selectedCodec; +@property (nonatomic, readonly) int selectedQualityType; +@property (nonatomic, readonly) NSString *selectedBitrate; +@property (nonatomic, readonly) NSString *selectedQuality; + +// Property updates when the video size changes +@property (nonatomic, readwrite) NSUInteger fX264PresetsWidthForUnparse; +@property (nonatomic, readwrite) NSUInteger fX264PresetsHeightForUnparse; + +@property (nonatomic, retain, readwrite) HBController *fHBController; +@property (nonatomic, retain, readwrite) HBAdvancedController *fAdvancedOptions; + +@end diff --git a/macosx/HBVideoController.m b/macosx/HBVideoController.m new file mode 100644 index 000000000..e602e3f8d --- /dev/null +++ b/macosx/HBVideoController.m @@ -0,0 +1,1339 @@ +/* HBVideoController.m $ + + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + +#import "HBVideoController.h" + +#include "hb.h" + +#import "Controller.h" +#import "HBAdvancedController.h" + +NSString *HBVideoEncoderChangedNotification = @"HBVideoEncoderChangedNotification"; + +@interface HBVideoController () { + /* Framerate */ + /* Radio Button Framerate Controls */ + IBOutlet NSMatrix * fFramerateMatrix; + IBOutlet NSButtonCell * fFramerateVfrPfrCell; + IBOutlet NSButtonCell * fFramerateCfrCell; + + /* Video Encoder */ + IBOutlet NSTextField * fVidRateField; + IBOutlet NSPopUpButton * fVidRatePopUp; + IBOutlet NSTextField * fVidEncoderField; + IBOutlet NSPopUpButton * fVidEncoderPopUp; + IBOutlet NSTextField * fVidQualityField; + IBOutlet NSTextField * fVidQualityRFLabel; + IBOutlet NSTextField * fVidQualityRFField; + IBOutlet NSMatrix * fVidQualityMatrix; + IBOutlet NSButtonCell * fVidBitrateCell; + IBOutlet NSTextField * fVidBitrateField; + IBOutlet NSButtonCell * fVidConstantCell; + IBOutlet NSSlider * fVidQualitySlider; + IBOutlet NSButton * fVidTwoPassCheck; + IBOutlet NSButton * fVidTurboPassCheck; + + /* Status read out fields for picture settings and video filters */ + IBOutlet NSTextField * fPictureSettingsField; + IBOutlet NSTextField * fPictureFiltersField; + + /* x264 Presets Box */ + NSArray * fX264PresetNames; + NSUInteger fX264MediumPresetIndex; + IBOutlet NSButton * fX264UseAdvancedOptionsCheck; + IBOutlet NSBox * fX264PresetsBox; + IBOutlet NSSlider * fX264PresetsSlider; + IBOutlet NSTextField * fX264PresetSliderLabel; + IBOutlet NSTextField * fX264PresetSelectedTextField; + IBOutlet NSPopUpButton * fX264TunePopUp; + IBOutlet NSTextField * fX264TunePopUpLabel; + IBOutlet NSPopUpButton * fX264ProfilePopUp; + IBOutlet NSTextField * fX264ProfilePopUpLabel; + IBOutlet NSPopUpButton * fX264LevelPopUp; + IBOutlet NSTextField * fX264LevelPopUpLabel; + IBOutlet NSButton * fX264FastDecodeCheck; + IBOutlet NSTextField * fDisplayX264PresetsAdditonalOptionsTextField; + IBOutlet NSTextField * fDisplayX264PresetsAdditonalOptionsLabel; + // Text Field to show the expanded opts from unparse() + IBOutlet NSTextField * fDisplayX264PresetsUnparseTextField; + char * fX264PresetsUnparsedUTF8String; + NSUInteger _fX264PresetsHeightForUnparse; + NSUInteger _fX264PresetsWidthForUnparse; +} + +@end + +@implementation HBVideoController + +@synthesize fX264PresetsHeightForUnparse = _fX264PresetsHeightForUnparse; +@synthesize fX264PresetsWidthForUnparse = _fX264PresetsWidthForUnparse; + +- (void)setPictureSettingsField:(NSString *)string +{ + if (string) + { + [_pictureSettingsField autorelease]; + _pictureSettingsField = [[NSString stringWithFormat:@"Picture Settings: %@", string] retain]; + } +} + +- (void)setPictureFiltersField:(NSString *)string +{ + if (string) + { + [_pictureFiltersField autorelease]; + _pictureFiltersField = [[NSString stringWithFormat:@"Picture Filters: %@", string] retain]; + } +} + +- (int)selectedCodec +{ + return (int)[[fVidEncoderPopUp selectedItem] tag]; +} + +- (int)selectedQualityType +{ + return (int)[[fVidQualityMatrix selectedCell] tag]; +} + +- (NSString *)selectedBitrate +{ + return [fVidBitrateField stringValue]; +} + +- (NSString *)selectedQuality +{ + return [fVidQualityRFField stringValue]; +} + + +- (instancetype)init +{ + self = [super initWithNibName:@"Video" bundle:nil]; + if (self) + { + /* + * initialize fX264PresetsUnparsedUTF8String as early as possible + * avoids an invalid free + */ + fX264PresetsUnparsedUTF8String = NULL; + _pictureFiltersField = @"Pictures Filters:"; + _pictureSettingsField = @"Pictures Settings:"; + + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + + /* register that we are interested in changes made to the video container */ + [center addObserver:self selector: @selector(containerChanged:) name:HBContainerChangedNotification object:nil]; + [center addObserver:self selector: @selector(titleChanged:) name:HBTitleChangedNotification object:nil]; + } + + return self; +} + +- (void)loadView { + [super loadView]; + + /* Video encoder */ + [fVidEncoderPopUp removeAllItems]; + [fVidEncoderPopUp addItemWithTitle: @"FFmpeg"]; + + /* setup our x264 presets widgets - this only needs to be done once */ + [self setupX264PresetsWidgets]; + + /* Video quality */ + [fVidBitrateField setIntValue: 1000]; + [fVidQualityMatrix selectCell: fVidBitrateCell]; + [self videoMatrixChanged:nil]; + + /* Video framerate */ + [fVidRatePopUp removeAllItems]; + NSMenuItem *menuItem = [[fVidRatePopUp menu] addItemWithTitle:@"Same as source" + action:nil + keyEquivalent:@""]; + [menuItem setTag:hb_video_framerate_get_from_name("Same as source")]; + for (const hb_rate_t *video_framerate = hb_video_framerate_get_next(NULL); + video_framerate != NULL; + video_framerate = hb_video_framerate_get_next(video_framerate)) + { + NSString *itemTitle; + if (!strcmp(video_framerate->name, "23.976")) + { + itemTitle = @"23.976 (NTSC Film)"; + } + else if (!strcmp(video_framerate->name, "25")) + { + itemTitle = @"25 (PAL Film/Video)"; + } + else if (!strcmp(video_framerate->name, "29.97")) + { + itemTitle = @"29.97 (NTSC Video)"; + } + else + { + itemTitle = [NSString stringWithUTF8String:video_framerate->name]; + } + menuItem = [[fVidRatePopUp menu] addItemWithTitle:itemTitle + action:nil + keyEquivalent:@""]; + [menuItem setTag:video_framerate->rate]; + } + [fVidRatePopUp selectItemAtIndex:0]; + + /* We disable the Turbo 1st pass checkbox since we are not x264 */ + [fVidTurboPassCheck setEnabled: NO]; + [fVidTurboPassCheck setState: NSOffState]; +} + +- (void)enableUI:(BOOL)b { + NSControl *controls[] = + { + fFramerateMatrix, + fVidRateField, + fVidRatePopUp, + fVidEncoderField, + fVidEncoderPopUp, + fVidQualityField, + fVidQualityRFLabel, + fVidQualityRFField, + fVidQualityMatrix, + fVidBitrateField, + fVidQualitySlider, + fVidTwoPassCheck, + fVidTurboPassCheck, + fPictureSettingsField, + fPictureFiltersField + }; + + 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]; + } + + [self videoMatrixChanged:nil]; + [self enableX264Widgets:b]; +} + +- (void)containerChanged:(NSNotification *)aNotification +{ + NSDictionary *notDict = [aNotification userInfo]; + + int videoContainer = [[notDict objectForKey: keyContainerTag] intValue]; + + /* lets get the tag of the currently selected item first so we might reset it later */ + int selectedVidEncoderTag = (int)[[fVidEncoderPopUp selectedItem] tag]; + + /* Note: we now store the video encoder int values from common.c in the tags of each popup for easy retrieval later */ + [fVidEncoderPopUp removeAllItems]; + for (const hb_encoder_t *video_encoder = hb_video_encoder_get_next(NULL); + video_encoder != NULL; + video_encoder = hb_video_encoder_get_next(video_encoder)) + { + if (video_encoder->muxers & videoContainer) + { + NSMenuItem *menuItem = [[fVidEncoderPopUp menu] addItemWithTitle:[NSString stringWithUTF8String:video_encoder->name] + action:nil + keyEquivalent:@""]; + [menuItem setTag:video_encoder->codec]; + } + } + + /* + * item 0 will be selected by default + * deselect it so that we can detect whether the video encoder has changed + */ + [fVidEncoderPopUp selectItem:nil]; + if (selectedVidEncoderTag) + { + // if we have a tag for previously selected encoder, try to select it + // if this fails, [fVidEncoderPopUp selectedItem] will be nil + // we'll handle that scenario further down + [fVidEncoderPopUp selectItemWithTag:selectedVidEncoderTag]; + } + + if ([fVidEncoderPopUp selectedItem] == nil) + { + /* this means the above call to selectItemWithTag failed */ + [fVidEncoderPopUp selectItemAtIndex:0]; + [self videoEncoderPopUpChanged:nil]; + } +} + +- (void)titleChanged:(NSNotification *)aNotification +{ + [fVidRatePopUp selectItemAtIndex: 0]; +} + +#pragma mark - apply settings + +- (void)applyVideoSettingsFromQueue:(NSDictionary *)queueToApply +{ + /* video encoder */ + [fVidEncoderPopUp selectItemWithTitle:[queueToApply objectForKey:@"VideoEncoder"]]; + [self.fAdvancedOptions setLavcOptions: [queueToApply objectForKey:@"lavcOption"]]; + /* advanced x264 options */ + if ([[queueToApply objectForKey:@"x264UseAdvancedOptions"] intValue]) + { + // we are using the advanced panel + [self.fAdvancedOptions setOptions:[queueToApply objectForKey:@"x264Option"]]; + // preset does not use the x264 preset system, reset the widgets + [self setX264Preset: nil]; + [self setX264Tune: nil]; + [self setX264OptionExtra:[queueToApply objectForKey:@"x264Option"]]; + [self setH264Profile: nil]; + [self setH264Level: nil]; + // enable the advanced panel and update the widgets + [fX264UseAdvancedOptionsCheck setState:NSOnState]; + [self updateX264Widgets:nil]; + } + else + { + // we are using the x264 preset system + [self setX264Preset: [queueToApply objectForKey:@"x264Preset"]]; + [self setX264Tune: [queueToApply objectForKey:@"x264Tune"]]; + [self setX264OptionExtra:[queueToApply objectForKey:@"x264OptionExtra"]]; + [self setH264Profile: [queueToApply objectForKey:@"h264Profile"]]; + [self setH264Level: [queueToApply objectForKey:@"h264Level"]]; + // preset does not use the advanced panel, reset it + [self.fAdvancedOptions setOptions:@""]; + // disable the advanced panel and update the widgets + [fX264UseAdvancedOptionsCheck setState:NSOffState]; + [self updateX264Widgets:nil]; + } + + /* Lets run through the following functions to get variables set there */ + [self videoEncoderPopUpChanged:nil]; + + /* Video quality */ + [fVidQualityMatrix selectCellAtRow:[[queueToApply objectForKey:@"VideoQualityType"] intValue] column:0]; + + [fVidBitrateField setStringValue:[queueToApply objectForKey:@"VideoAvgBitrate"]]; + + int direction; + float minValue, maxValue, granularity; + hb_video_quality_get_limits((int)[[fVidEncoderPopUp selectedItem] tag], + &minValue, &maxValue, &granularity, &direction); + if (!direction) + { + [fVidQualitySlider setFloatValue:[[queueToApply objectForKey:@"VideoQualitySlider"] floatValue]]; + } + else + { + /* + * Since ffmpeg and x264 use an "inverted" slider (lower values + * indicate a higher quality) we invert the value on the slider + */ + [fVidQualitySlider setFloatValue:([fVidQualitySlider minValue] + + [fVidQualitySlider maxValue] - + [[queueToApply objectForKey:@"VideoQualitySlider"] floatValue])]; + } + + [self videoMatrixChanged:nil]; + + /* Video framerate */ + if ([[queueToApply objectForKey:@"VideoFramerate"] isEqualToString:@"Same as source"]) + { + /* Now set the Video Frame Rate Mode to either vfr or cfr according to the preset */ + if ([[queueToApply objectForKey:@"VideoFramerateMode"] isEqualToString:@"vfr"]) + { + [fFramerateMatrix selectCellAtRow:0 column:0]; // we want vfr + } + else + { + [fFramerateMatrix selectCellAtRow:1 column:0]; // we want cfr + } + } + else + { + /* Now set the Video Frame Rate Mode to either pfr or cfr according to the preset */ + if ([[queueToApply objectForKey:@"VideoFramerateMode"] isEqualToString:@"pfr"]) + { + [fFramerateMatrix selectCellAtRow:0 column:0]; // we want pfr + } + else + { + [fFramerateMatrix selectCellAtRow:1 column:0]; // we want cfr + } + } + [fVidRatePopUp selectItemWithTitle:[queueToApply objectForKey:@"VideoFramerate"]]; + [self videoFrameRateChanged:nil]; + + /* 2 Pass Encoding */ + [fVidTwoPassCheck setState:[[queueToApply objectForKey:@"VideoTwoPass"] intValue]]; + [self twoPassCheckboxChanged:nil]; + /* Turbo 1st pass for 2 Pass Encoding */ + [fVidTurboPassCheck setState:[[queueToApply objectForKey:@"VideoTurboTwoPass"] intValue]]; +} + +- (void)applySettingsFromPreset:(NSDictionary *)preset +{ + /* map legacy encoder names via libhb */ + const char *strValue = hb_video_encoder_sanitize_name([[preset objectForKey:@"VideoEncoder"] UTF8String]); + [fVidEncoderPopUp selectItemWithTitle:[NSString stringWithFormat:@"%s", strValue]]; + [self videoEncoderPopUpChanged:nil]; + + if ([[fVidEncoderPopUp selectedItem] tag] == HB_VCODEC_X264) + { + if (![preset objectForKey:@"x264UseAdvancedOptions"] || + [[preset objectForKey:@"x264UseAdvancedOptions"] intValue]) + { + /* + * x264UseAdvancedOptions is not set (legacy preset) + * or set to 1 (enabled), so we use the old advanced panel + */ + if ([preset objectForKey:@"x264Option"]) + { + /* we set the advanced options string here if applicable */ + [self.fAdvancedOptions setOptions:[preset objectForKey:@"x264Option"]]; + [self setX264OptionExtra:[preset objectForKey:@"x264Option"]]; + } + else + { + [self.fAdvancedOptions setOptions: @""]; + [self setX264OptionExtra:nil]; + } + /* preset does not use the x264 preset system, reset the widgets */ + [self setX264Preset: nil]; + [self setX264Tune: nil]; + [self setH264Profile:nil]; + [self setH264Level: nil]; + /* we enable the advanced panel and update the widgets */ + [fX264UseAdvancedOptionsCheck setState:NSOnState]; + [self updateX264Widgets:nil]; + } + else + { + /* + * x264UseAdvancedOptions is set to 0 (disabled), + * so we use the x264 preset system + */ + [self setX264Preset: [preset objectForKey:@"x264Preset"]]; + [self setX264Tune: [preset objectForKey:@"x264Tune"]]; + [self setX264OptionExtra:[preset objectForKey:@"x264OptionExtra"]]; + [self setH264Profile: [preset objectForKey:@"h264Profile"]]; + [self setH264Level: [preset objectForKey:@"h264Level"]]; + /* preset does not use the advanced panel, reset it */ + [self.fAdvancedOptions setOptions:@""]; + /* we disable the advanced panel and update the widgets */ + [fX264UseAdvancedOptionsCheck setState:NSOffState]; + [self updateX264Widgets:nil]; + } + } + + int qualityType = [[preset objectForKey:@"VideoQualityType"] intValue] - 1; + /* Note since the removal of Target Size encoding, the possible values for VideoQuality type are 0 - 1. + * Therefore any preset that uses the old 2 for Constant Quality would now use 1 since there is one less index + * for the fVidQualityMatrix. It should also be noted that any preset that used the deprecated Target Size + * setting of 0 would set us to 0 or ABR since ABR is now tagged 0. Fortunately this does not affect any built-in + * presets since they all use Constant Quality or Average Bitrate.*/ + if (qualityType == -1) + { + qualityType = 0; + } + [fVidQualityMatrix selectCellWithTag:qualityType]; + + [fVidBitrateField setStringValue:[preset objectForKey:@"VideoAvgBitrate"]]; + + int direction; + float minValue, maxValue, granularity; + hb_video_quality_get_limits((int)[[fVidEncoderPopUp selectedItem] tag], + &minValue, &maxValue, &granularity, &direction); + if (!direction) + { + [fVidQualitySlider setFloatValue:[[preset objectForKey:@"VideoQualitySlider"] floatValue]]; + } + else + { + /* + * Since ffmpeg and x264 use an "inverted" slider (lower values + * indicate a higher quality) we invert the value on the slider + */ + [fVidQualitySlider setFloatValue:([fVidQualitySlider minValue] + + [fVidQualitySlider maxValue] - + [[preset objectForKey:@"VideoQualitySlider"] floatValue])]; + } + + [self videoMatrixChanged:nil]; + + /* Video framerate */ + if ([[preset objectForKey:@"VideoFramerate"] isEqualToString:@"Same as source"]) + { + /* Now set the Video Frame Rate Mode to either vfr or cfr according to the preset */ + if (![preset objectForKey:@"VideoFramerateMode"] || + [[preset objectForKey:@"VideoFramerateMode"] isEqualToString:@"vfr"]) + { + [fFramerateMatrix selectCellAtRow:0 column:0]; // we want vfr + } + else + { + [fFramerateMatrix selectCellAtRow:1 column:0]; // we want cfr + } + } + else + { + /* Now set the Video Frame Rate Mode to either pfr or cfr according to the preset */ + if ([[preset objectForKey:@"VideoFramerateMode"] isEqualToString:@"pfr"] || + [[preset objectForKey:@"VideoFrameratePFR"] intValue] == 1) + { + [fFramerateMatrix selectCellAtRow:0 column:0]; // we want pfr + } + else + { + [fFramerateMatrix selectCellAtRow:1 column:0]; // we want cfr + } + } + /* map legacy names via libhb */ + int intValue = hb_video_framerate_get_from_name([[preset objectForKey:@"VideoFramerate"] UTF8String]); + [fVidRatePopUp selectItemWithTag:intValue]; + [self videoFrameRateChanged:nil]; + + /* 2 Pass Encoding */ + [fVidTwoPassCheck setState:[[preset objectForKey:@"VideoTwoPass"] intValue]]; + [self twoPassCheckboxChanged:nil]; + + /* Turbo 1st pass for 2 Pass Encoding */ + [fVidTurboPassCheck setState:[[preset objectForKey:@"VideoTurboTwoPass"] intValue]]; +} + +- (void)prepareVideoForQueueFileJob:(NSMutableDictionary *)queueFileJob +{ + [queueFileJob setObject:[fVidEncoderPopUp titleOfSelectedItem] forKey:@"VideoEncoder"]; + + /* x264 advanced options */ + if ([fX264UseAdvancedOptionsCheck state]) + { + // we are using the advanced panel + [queueFileJob setObject:[NSNumber numberWithInt:1] forKey: @"x264UseAdvancedOptions"]; + [queueFileJob setObject:[self.fAdvancedOptions optionsString] forKey:@"x264Option"]; + } + else + { + // we are using the x264 preset system + [queueFileJob setObject:[NSNumber numberWithInt:0] forKey: @"x264UseAdvancedOptions"]; + [queueFileJob setObject:[self x264Preset] forKey: @"x264Preset"]; + [queueFileJob setObject:[self x264Tune] forKey: @"x264Tune"]; + [queueFileJob setObject:[self x264OptionExtra] forKey: @"x264OptionExtra"]; + [queueFileJob setObject:[self h264Profile] forKey: @"h264Profile"]; + [queueFileJob setObject:[self h264Level] forKey: @"h264Level"]; + } + + /* FFmpeg (lavc) Option String */ + [queueFileJob setObject:[self.fAdvancedOptions optionsStringLavc] forKey:@"lavcOption"]; + + [queueFileJob setObject:[NSNumber numberWithInteger:[[fVidQualityMatrix selectedCell] tag] + 1] forKey:@"VideoQualityType"]; + [queueFileJob setObject:[fVidBitrateField stringValue] forKey:@"VideoAvgBitrate"]; + [queueFileJob setObject:[NSNumber numberWithFloat:[fVidQualityRFField floatValue]] forKey:@"VideoQualitySlider"]; + /* Framerate */ + [queueFileJob setObject:[fVidRatePopUp titleOfSelectedItem] forKey:@"VideoFramerate"]; + /* Frame Rate Mode */ + if ([fFramerateMatrix selectedRow] == 1) // if selected we are cfr regardless of the frame rate popup + { + [queueFileJob setObject:@"cfr" forKey:@"VideoFramerateMode"]; + } + else + { + if ([fVidRatePopUp indexOfSelectedItem] == 0) // Same as source frame rate + { + [queueFileJob setObject:@"vfr" forKey:@"VideoFramerateMode"]; + } + else + { + [queueFileJob setObject:@"pfr" forKey:@"VideoFramerateMode"]; + } + + } + + /* 2 Pass Encoding */ + [queueFileJob setObject:[NSNumber numberWithInteger:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"]; + /* Turbo 2 pass Encoding fVidTurboPassCheck*/ + [queueFileJob setObject:[NSNumber numberWithInteger:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"]; + + /* Video encoder */ + [queueFileJob setObject:[NSNumber numberWithInteger:[[fVidEncoderPopUp selectedItem] tag]] forKey:@"JobVideoEncoderVcodec"]; + + /* Framerate */ + [queueFileJob setObject:[NSNumber numberWithInteger:[[fVidRatePopUp selectedItem] tag]] forKey:@"JobIndexVideoFramerate"]; +} + +- (void)prepareVideoForJobPreview:(hb_job_t *)job andTitle:(hb_title_t *)title +{ + job->vcodec = (int)[[fVidEncoderPopUp selectedItem] tag]; + job->fastfirstpass = 0; + + job->chapter_markers = 0; + + if (job->vcodec == HB_VCODEC_X264) + { + /* advanced x264 options */ + NSString *tmpString; + // translate zero-length strings to NULL for libhb + const char *encoder_preset = NULL; + const char *encoder_tune = NULL; + const char *encoder_options = NULL; + const char *encoder_profile = NULL; + const char *encoder_level = NULL; + if ([fX264UseAdvancedOptionsCheck state]) + { + // we are using the advanced panel + if ([(tmpString = [self.fAdvancedOptions optionsString]) length]) + { + encoder_options = [tmpString UTF8String]; + } + } + else + { + // we are using the x264 preset system + if ([(tmpString = [self x264Tune]) length]) + { + encoder_tune = [tmpString UTF8String]; + } + if ([(tmpString = [self x264OptionExtra]) length]) + { + encoder_options = [tmpString UTF8String]; + } + if ([(tmpString = [self h264Profile]) length]) + { + encoder_profile = [tmpString UTF8String]; + } + if ([(tmpString = [self h264Level]) length]) + { + encoder_level = [tmpString UTF8String]; + } + encoder_preset = [[self x264Preset] UTF8String]; + } + hb_job_set_encoder_preset (job, encoder_preset); + hb_job_set_encoder_tune (job, encoder_tune); + hb_job_set_encoder_options(job, encoder_options); + hb_job_set_encoder_profile(job, encoder_profile); + hb_job_set_encoder_level (job, encoder_level); + } + else if (job->vcodec & HB_VCODEC_FFMPEG_MASK) + { + hb_job_set_encoder_options(job, + [[self.fAdvancedOptions optionsStringLavc] + UTF8String]); + } + + /* Video settings */ + int fps_mode, fps_num, fps_den; + if( [fVidRatePopUp indexOfSelectedItem] > 0 ) + { + /* a specific framerate has been chosen */ + fps_num = 27000000; + fps_den = (int)[[fVidRatePopUp selectedItem] tag]; + if ([fFramerateMatrix selectedRow] == 1) + { + // CFR + fps_mode = 1; + } + else + { + // PFR + fps_mode = 2; + } + } + else + { + /* same as source */ + fps_num = title->rate; + fps_den = title->rate_base; + if ([fFramerateMatrix selectedRow] == 1) + { + // CFR + fps_mode = 1; + } + else + { + // VFR + fps_mode = 0; + } + } + + switch( [[fVidQualityMatrix selectedCell] tag] ) + { + case 0: + /* ABR */ + job->vquality = -1.0; + job->vbitrate = [fVidBitrateField intValue]; + break; + case 1: + /* Constant Quality */ + job->vquality = [fVidQualityRFField floatValue]; + job->vbitrate = 0; + break; + } + + /* Add framerate shaping filter */ + hb_filter_object_t *filter = hb_filter_init(HB_FILTER_VFR); + hb_add_filter(job, filter, [[NSString stringWithFormat:@"%d:%d:%d", + fps_mode, fps_num, fps_den] UTF8String]); +} + +- (void)prepareVideoForPreset:(NSMutableDictionary *)preset +{ + [preset setObject:[fVidEncoderPopUp titleOfSelectedItem] forKey:@"VideoEncoder"]; + /* x264 Options, this will either be advanced panel or the video tabs x264 presets panel with modded option string */ + + if ([fX264UseAdvancedOptionsCheck state] == NSOnState) + { + /* use the old advanced panel */ + [preset setObject:[NSNumber numberWithInt:1] forKey:@"x264UseAdvancedOptions"]; + [preset setObject:[self.fAdvancedOptions optionsString] forKey:@"x264Option"]; + } + else + { + /* use the x264 preset system */ + [preset setObject:[NSNumber numberWithInt:0] forKey:@"x264UseAdvancedOptions"]; + [preset setObject:[self x264Preset] forKey:@"x264Preset"]; + [preset setObject:[self x264Tune] forKey:@"x264Tune"]; + [preset setObject:[self x264OptionExtra] forKey:@"x264OptionExtra"]; + [preset setObject:[self h264Profile] forKey:@"h264Profile"]; + [preset setObject:[self h264Level] forKey:@"h264Level"]; + /* + * bonus: set the unparsed options to make the preset compatible + * with old HB versions + */ + if (fX264PresetsUnparsedUTF8String != NULL) + { + [preset setObject:[NSString stringWithUTF8String:fX264PresetsUnparsedUTF8String] + forKey:@"x264Option"]; + } + else + { + [preset setObject:@"" forKey:@"x264Option"]; + } + } + + /* FFmpeg (lavc) Option String */ + [preset setObject:[self.fAdvancedOptions optionsStringLavc] forKey:@"lavcOption"]; + + /* though there are actually only 0 - 1 types available in the ui we need to map to the old 0 - 2 + * set of indexes from when we had 0 == Target , 1 == Abr and 2 == Constant Quality for presets + * to take care of any legacy presets. */ + [preset setObject:[NSNumber numberWithInteger:[[fVidQualityMatrix selectedCell] tag] +1 ] forKey:@"VideoQualityType"]; + [preset setObject:[fVidBitrateField stringValue] forKey:@"VideoAvgBitrate"]; + [preset setObject:[NSNumber numberWithFloat:[fVidQualityRFField floatValue]] forKey:@"VideoQualitySlider"]; + + /* Video framerate and framerate mode */ + if ([fFramerateMatrix selectedRow] == 1) + { + [preset setObject:@"cfr" forKey:@"VideoFramerateMode"]; + } + if ([fVidRatePopUp indexOfSelectedItem] == 0) // Same as source is selected + { + [preset setObject:@"Same as source" forKey:@"VideoFramerate"]; + + if ([fFramerateMatrix selectedRow] == 0) + { + [preset setObject:@"vfr" forKey:@"VideoFramerateMode"]; + } + } + else // translate the rate (selected item's tag) to the official libhb name + { + [preset setObject:[NSString stringWithFormat:@"%s", + hb_video_framerate_get_name((int)[[fVidRatePopUp selectedItem] tag])] + forKey:@"VideoFramerate"]; + + if ([fFramerateMatrix selectedRow] == 0) + { + [preset setObject:@"pfr" forKey:@"VideoFramerateMode"]; + } + } + + + + /* 2 Pass Encoding */ + [preset setObject:[NSNumber numberWithInteger:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"]; + /* Turbo 2 pass Encoding fVidTurboPassCheck*/ + [preset setObject:[NSNumber numberWithInteger:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"]; +} + +#pragma mark - Video + +- (IBAction) videoEncoderPopUpChanged: (id) sender +{ + /* if no valid encoder is selected, use the first one */ + if ([fVidEncoderPopUp selectedItem] == nil) + { + [fVidEncoderPopUp selectItemAtIndex:0]; + } + + int videoEncoder = (int)[[fVidEncoderPopUp selectedItem] tag]; + + [self.fAdvancedOptions setHidden:YES]; + /* If we are using x264 then show the x264 advanced panel and the x264 presets box */ + if (videoEncoder == HB_VCODEC_X264) + { + [self.fAdvancedOptions setHidden:NO]; + + // show the x264 presets box + [fX264PresetsBox setHidden:NO]; + } + else // we are FFmpeg (lavc) or Theora + { + [self.fAdvancedOptions setHidden:YES]; + [fX264PresetsBox setHidden:YES]; + + // We Are Lavc + if ([[fVidEncoderPopUp selectedItem] tag] & HB_VCODEC_FFMPEG_MASK) + { + [self.fAdvancedOptions setLavcOptsEnabled:YES]; + } + else /// We are Theora + { + [self.fAdvancedOptions setLavcOptsEnabled:NO]; + } + } + + [[NSNotificationCenter defaultCenter] postNotificationName:HBVideoEncoderChangedNotification object:self]; + + [self setupQualitySlider]; + [self twoPassCheckboxChanged: sender]; +} + + +- (IBAction) twoPassCheckboxChanged: (id) sender +{ + /* check to see if x264 is chosen */ + if([[fVidEncoderPopUp selectedItem] tag] == HB_VCODEC_X264) + { + if( [fVidTwoPassCheck state] == NSOnState) + { + [fVidTurboPassCheck setHidden: NO]; + } + else + { + [fVidTurboPassCheck setHidden: YES]; + [fVidTurboPassCheck setState: NSOffState]; + } + /* Make sure Two Pass is checked if Turbo is checked */ + if( [fVidTurboPassCheck state] == NSOnState) + { + [fVidTwoPassCheck setState: NSOnState]; + } + } + else + { + [fVidTurboPassCheck setHidden: YES]; + [fVidTurboPassCheck setState: NSOffState]; + } + + /* We call method method to change UI to reflect whether a preset is used or not*/ + [self.fHBController customSettingUsed: sender]; +} + +- (IBAction ) videoFrameRateChanged: (id) sender +{ + /* if no valid framerate is selected, use "Same as source" */ + if ([fVidRatePopUp selectedItem] == nil) + { + [fVidRatePopUp selectItemAtIndex:0]; + } + + /* Hide and set the PFR Checkbox to OFF if we are set to Same as Source */ + /* Depending on whether or not Same as source is selected modify the title for + * fFramerateVfrPfrCell*/ + if ([fVidRatePopUp indexOfSelectedItem] == 0) // We are Same as Source + { + [fFramerateVfrPfrCell setTitle:@"Variable Framerate"]; + } + else + { + [fFramerateVfrPfrCell setTitle:@"Peak Framerate (VFR)"]; + + + } + + /* We call method method to change UI to reflect whether a preset is used or not*/ + [self.fHBController customSettingUsed: sender]; +} + +- (IBAction) videoMatrixChanged: (id) sender; +{ + /* We use the selectedCell: tag of the fVidQualityMatrix instead of selectedRow + * so that the order of the video controls can be switched around. + * Constant quality is 1 and Average bitrate is 0 for reference. */ + bool bitrate, quality; + bitrate = quality = false; + if( [fVidQualityMatrix isEnabled] ) + { + switch( [[fVidQualityMatrix selectedCell] tag] ) + { + case 0: + bitrate = true; + break; + case 1: + quality = true; + break; + } + } + + [fVidBitrateField setEnabled: bitrate]; + [fVidQualitySlider setEnabled: quality]; + [fVidQualityRFField setEnabled: quality]; + [fVidQualityRFLabel setEnabled: quality]; + [fVidTwoPassCheck setEnabled: !quality && + [fVidQualityMatrix isEnabled]]; + if( quality ) + { + [fVidTwoPassCheck setState: NSOffState]; + [fVidTurboPassCheck setHidden: YES]; + [fVidTurboPassCheck setState: NSOffState]; + } + + [self qualitySliderChanged: sender]; + [self.fHBController customSettingUsed: sender]; +} + +/* Use this method to setup the quality slider for cq/rf values depending on + * the video encoder selected. + */ +- (void) setupQualitySlider +{ + /* + * Get the current slider maxValue to check for a change in slider scale + * later so that we can choose a new similar value on the new slider scale + */ + float previousMaxValue = [fVidQualitySlider maxValue]; + float previousPercentOfSliderScale = ([fVidQualitySlider floatValue] / + ([fVidQualitySlider maxValue] - + [fVidQualitySlider minValue] + 1)); + [fVidQualityRFLabel setStringValue:[NSString stringWithFormat:@"%s", + hb_video_quality_get_name((int)[[fVidEncoderPopUp + selectedItem] tag])]]; + int direction; + float minValue, maxValue, granularity; + hb_video_quality_get_limits((int)[[fVidEncoderPopUp selectedItem] tag], + &minValue, &maxValue, &granularity, &direction); + if (granularity < 1.0f) + { + /* + * Encoders that allow fractional CQ values often have a low granularity + * which makes the slider hard to use, so use a value from preferences. + */ + granularity = [[NSUserDefaults standardUserDefaults] + floatForKey:@"x264CqSliderFractional"]; + } + [fVidQualitySlider setMinValue:minValue]; + [fVidQualitySlider setMaxValue:maxValue]; + [fVidQualitySlider setNumberOfTickMarks:((maxValue - minValue) * + (1.0f / granularity)) + 1]; + + /* check to see if we have changed slider scales */ + if (previousMaxValue != maxValue) + { + /* + * if so, convert the old setting to the new scale as close as possible + * based on percentages + */ + [fVidQualitySlider setFloatValue:((maxValue - minValue + 1.) * + (previousPercentOfSliderScale))]; + } + + [self qualitySliderChanged:nil]; +} + +- (IBAction) qualitySliderChanged: (id) sender +{ + /* + * Our constant quality slider is in a range based + * on each encoders qp/rf values. The range depends + * on the encoder. Also, the range is inverse of quality + * for all of the encoders *except* for theora + * (ie. as the "quality" goes up, the cq or rf value + * actually goes down). Since the IB sliders always set + * their max value at the right end of the slider, we + * will calculate the inverse, so as the slider floatValue + * goes up, we will show the inverse in the rf field + * so, the floatValue at the right for x264 would be 51 + * and our rf field needs to show 0 and vice versa. + */ + int direction; + float minValue, maxValue, granularity; + float inverseValue = ([fVidQualitySlider minValue] + + [fVidQualitySlider maxValue] - + [fVidQualitySlider floatValue]); + hb_video_quality_get_limits((int)[[fVidEncoderPopUp selectedItem] tag], + &minValue, &maxValue, &granularity, &direction); + if (!direction) + { + [fVidQualityRFField setStringValue:[NSString stringWithFormat:@"%.2f", + [fVidQualitySlider floatValue]]]; + } + else + { + [fVidQualityRFField setStringValue:[NSString stringWithFormat:@"%.2f", + inverseValue]]; + } + /* Show a warning if x264 and rf 0 which is lossless */ + if ([[fVidEncoderPopUp selectedItem] tag] == HB_VCODEC_X264 && inverseValue == 0.0) + { + [fVidQualityRFField setStringValue:[NSString stringWithFormat:@"%.2f (Warning: Lossless)", + inverseValue]]; + } + + [self.fHBController customSettingUsed: sender]; +} + +#pragma mark - Video x264 Presets + +- (void) setupX264PresetsWidgets +{ + NSUInteger i; + // populate the preset system widgets via hb_video_encoder_get_* functions. + // store x264 preset names + const char* const *x264_presets = hb_video_encoder_get_presets(HB_VCODEC_X264); + NSMutableArray *tmp_array = [[NSMutableArray alloc] init]; + for (i = 0; x264_presets[i] != NULL; i++) + { + [tmp_array addObject:[NSString stringWithUTF8String:x264_presets[i]]]; + if (!strcasecmp(x264_presets[i], "medium")) + { + fX264MediumPresetIndex = i; + } + } + fX264PresetNames = [[NSArray alloc] initWithArray:tmp_array]; + [tmp_array release]; + // setup the x264 preset slider + [fX264PresetsSlider setMinValue:0]; + [fX264PresetsSlider setMaxValue:[fX264PresetNames count]-1]; + [fX264PresetsSlider setNumberOfTickMarks:[fX264PresetNames count]]; + [fX264PresetsSlider setIntegerValue:fX264MediumPresetIndex]; + [fX264PresetsSlider setTickMarkPosition:NSTickMarkAbove]; + [fX264PresetsSlider setAllowsTickMarkValuesOnly:YES]; + [self x264PresetsSliderChanged: nil]; + // setup the x264 tune popup + [fX264TunePopUp removeAllItems]; + [fX264TunePopUp addItemWithTitle: @"none"]; + const char* const *x264_tunes = hb_video_encoder_get_tunes(HB_VCODEC_X264); + for (int i = 0; x264_tunes[i] != NULL; i++) + { + // we filter out "fastdecode" as we have a dedicated checkbox for it + if (strcasecmp(x264_tunes[i], "fastdecode") != 0) + { + [fX264TunePopUp addItemWithTitle: [NSString stringWithUTF8String:x264_tunes[i]]]; + } + } + // the fastdecode checkbox is off by default + [fX264FastDecodeCheck setState: NSOffState]; + // setup the h264 profile popup + [fX264ProfilePopUp removeAllItems]; + const char* const *h264_profiles = hb_video_encoder_get_profiles(HB_VCODEC_X264); + for (int i = 0; h264_profiles[i] != NULL; i++) + { + [fX264ProfilePopUp addItemWithTitle: [NSString stringWithUTF8String:h264_profiles[i]]]; + } + // setup the h264 level popup + [fX264LevelPopUp removeAllItems]; + const char* const *h264_levels = hb_video_encoder_get_levels(HB_VCODEC_X264); + for (int i = 0; h264_levels[i] != NULL; i++) + { + [fX264LevelPopUp addItemWithTitle: [NSString stringWithUTF8String:h264_levels[i]]]; + } + // clear the additional x264 options + [fDisplayX264PresetsAdditonalOptionsTextField setStringValue:@""]; +} + +- (void) enableX264Widgets: (bool) enable +{ + NSControl *controls[] = + { + fX264PresetsSlider, fX264PresetSliderLabel, fX264PresetSelectedTextField, + fX264TunePopUp, fX264TunePopUpLabel, fX264FastDecodeCheck, + fDisplayX264PresetsAdditonalOptionsTextField, fDisplayX264PresetsAdditonalOptionsLabel, + fX264ProfilePopUp, fX264ProfilePopUpLabel, + fX264LevelPopUp, fX264LevelPopUpLabel, + fDisplayX264PresetsUnparseTextField, + }; + + // check whether the x264 preset system and the advanced panel should be enabled + BOOL enable_x264_controls = (enable && [fX264UseAdvancedOptionsCheck state] == NSOffState); + BOOL enable_advanced_panel = (enable && [fX264UseAdvancedOptionsCheck state] == NSOnState); + + // enable/disable the checkbox and advanced panel + [fX264UseAdvancedOptionsCheck setEnabled:enable]; + [self.fAdvancedOptions enableUI:enable_advanced_panel]; + + // enable/disable the x264 preset system controls + 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:(enable_x264_controls ? + [NSColor controlTextColor] : + [NSColor disabledControlTextColor])]; + continue; + } + } + [controls[i] setEnabled:enable_x264_controls]; + } +} + +- (IBAction) updateX264Widgets: (id) sender +{ + if ([fX264UseAdvancedOptionsCheck state] == NSOnState) + { + /* + * we are using or switching to the advanced panel + * + * if triggered by selectPreset or applyQueueSettingToMainWindow, + * the options string will have been specified explicitly - leave it. + * + * if triggered by the advanced panel on/off checkbox, set the options + * string to the value of the unparsed x264 preset system string. + */ + if (sender == fX264UseAdvancedOptionsCheck) + { + if (fX264PresetsUnparsedUTF8String != NULL) + { + [self.fAdvancedOptions setOptions: + [NSString stringWithUTF8String:fX264PresetsUnparsedUTF8String]]; + } + else + { + [self.fAdvancedOptions setOptions:@""]; + } + } + } + // enable/disable, populate and update the various widgets + [self enableX264Widgets: YES]; + [self x264PresetsSliderChanged:nil]; + [self.fAdvancedOptions X264AdvancedOptionsSet: nil]; +} + +#pragma mark - +#pragma mark x264 preset system + +- (NSString *) x264Preset +{ + return (NSString *)[fX264PresetNames objectAtIndex:[fX264PresetsSlider intValue]]; +} + +- (NSString *) x264Tune +{ + NSString *x264Tune = @""; + if ([fX264TunePopUp indexOfSelectedItem]) + { + x264Tune = [x264Tune stringByAppendingString: + [fX264TunePopUp titleOfSelectedItem]]; + } + if ([fX264FastDecodeCheck state]) + { + if ([x264Tune length]) + { + x264Tune = [x264Tune stringByAppendingString: @","]; + } + x264Tune = [x264Tune stringByAppendingString: @"fastdecode"]; + } + return x264Tune; +} + +- (NSString*) x264OptionExtra +{ + return [fDisplayX264PresetsAdditonalOptionsTextField stringValue]; +} + +- (NSString*) h264Profile +{ + if ([fX264ProfilePopUp indexOfSelectedItem]) + { + return [fX264ProfilePopUp titleOfSelectedItem]; + } + return @""; +} + +- (NSString*) h264Level +{ + if ([fX264LevelPopUp indexOfSelectedItem]) + { + return [fX264LevelPopUp titleOfSelectedItem]; + } + return @""; +} + +- (void) setX264Preset: (NSString*)x264Preset +{ + if (x264Preset) + { + NSString *name; + NSEnumerator *enumerator = [fX264PresetNames objectEnumerator]; + while ((name = (NSString *)[enumerator nextObject])) + { + if ([name isEqualToString:x264Preset]) + { + [fX264PresetsSlider setIntegerValue: + [fX264PresetNames indexOfObject:name]]; + return; + } + } + } + [fX264PresetsSlider setIntegerValue:fX264MediumPresetIndex]; +} + +- (void) setX264Tune: (NSString*)x264Tune +{ + if (!x264Tune) + { + [fX264TunePopUp selectItemAtIndex:0]; + [fX264FastDecodeCheck setState:NSOffState]; + return; + } + // handle fastdecode + if ([x264Tune rangeOfString:@"fastdecode"].location != NSNotFound) + { + [fX264FastDecodeCheck setState:NSOnState]; + } + else + { + [fX264FastDecodeCheck setState:NSOffState]; + } + // filter out fastdecode + x264Tune = [x264Tune stringByReplacingOccurrencesOfString:@"," + withString:@""]; + x264Tune = [x264Tune stringByReplacingOccurrencesOfString:@"fastdecode" + withString:@""]; + // set the tune + [fX264TunePopUp selectItemWithTitle:x264Tune]; + // fallback + if ([fX264TunePopUp indexOfSelectedItem] == -1) + { + [fX264TunePopUp selectItemAtIndex:0]; + } +} + +- (void) setX264OptionExtra: (NSString*)x264OptionExtra +{ + if (!x264OptionExtra) + { + [fDisplayX264PresetsAdditonalOptionsTextField setStringValue:@""]; + return; + } + [fDisplayX264PresetsAdditonalOptionsTextField setStringValue:x264OptionExtra]; +} + +- (void) setH264Profile: (NSString*)h264Profile +{ + if (!h264Profile) + { + [fX264ProfilePopUp selectItemAtIndex:0]; + return; + } + // set the profile + [fX264ProfilePopUp selectItemWithTitle:h264Profile]; + // fallback + if ([fX264ProfilePopUp indexOfSelectedItem] == -1) + { + [fX264ProfilePopUp selectItemAtIndex:0]; + } +} + +- (void) setH264Level: (NSString*)h264Level +{ + if (!h264Level) + { + [fX264LevelPopUp selectItemAtIndex:0]; + return; + } + // set the level + [fX264LevelPopUp selectItemWithTitle:h264Level]; + // fallback + if ([fX264LevelPopUp indexOfSelectedItem] == -1) + { + [fX264LevelPopUp selectItemAtIndex:0]; + } +} + + +- (IBAction) x264PresetsSliderChanged: (id) sender +{ + // we assume the preset names and slider were setup properly + [fX264PresetSelectedTextField setStringValue: [self x264Preset]]; + [self x264PresetsChangedDisplayExpandedOptions:nil]; + +} + +/* This is called everytime a x264 widget in the video tab is changed to + display the expanded options in a text field via outlet fDisplayX264PresetsUnparseTextField + */ +- (IBAction) x264PresetsChangedDisplayExpandedOptions: (id) sender + +{ + /* API reference: + * + * char * hb_x264_param_unparse(const char *x264_preset, + * const char *x264_tune, + * const char *x264_encopts, + * const char *h264_profile, + * const char *h264_level, + * int width, int height); + */ + NSString *tmpString; + const char *x264_preset = [[self x264Preset] UTF8String]; + const char *x264_tune = NULL; + const char *advanced_opts = NULL; + const char *h264_profile = NULL; + const char *h264_level = NULL; + int width = 1; + int height = 1; + // prepare the tune, advanced options, profile and level + if ([(tmpString = [self x264Tune]) length]) + { + x264_tune = [tmpString UTF8String]; + } + if ([(tmpString = [self x264OptionExtra]) length]) + { + advanced_opts = [tmpString UTF8String]; + } + if ([(tmpString = [self h264Profile]) length]) + { + h264_profile = [tmpString UTF8String]; + } + if ([(tmpString = [self h264Level]) length]) + { + h264_level = [tmpString UTF8String]; + } + // width and height must be non-zero + if (_fX264PresetsWidthForUnparse && _fX264PresetsHeightForUnparse) + { + width = (int)_fX264PresetsWidthForUnparse; + height = (int)_fX264PresetsHeightForUnparse; + } + // free the previous unparsed string + free(fX264PresetsUnparsedUTF8String); + // now, unparse + fX264PresetsUnparsedUTF8String = hb_x264_param_unparse(x264_preset, + x264_tune, + advanced_opts, + h264_profile, + h264_level, + width, height); + // update the text field + if (fX264PresetsUnparsedUTF8String != NULL) + { + [fDisplayX264PresetsUnparseTextField setStringValue: + [NSString stringWithFormat:@"x264 Unparse: %s", + fX264PresetsUnparsedUTF8String]]; + } + else + { + [fDisplayX264PresetsUnparseTextField setStringValue:@"x264 Unparse:"]; + } +} + +@end diff --git a/macosx/HandBrake.xcodeproj/project.pbxproj b/macosx/HandBrake.xcodeproj/project.pbxproj index ae1819181..92538e317 100644 --- a/macosx/HandBrake.xcodeproj/project.pbxproj +++ b/macosx/HandBrake.xcodeproj/project.pbxproj @@ -21,7 +21,6 @@ 273F208914ADBE3B0021BE6D /* fakexcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 273F208514ADBE3B0021BE6D /* fakexcode.cpp */; }; 273F208A14ADBE3B0021BE6D /* parsecsv.c in Sources */ = {isa = PBXBuildFile; fileRef = 273F208614ADBE3B0021BE6D /* parsecsv.c */; }; 273F208B14ADBE3B0021BE6D /* test.c in Sources */ = {isa = PBXBuildFile; fileRef = 273F208814ADBE3B0021BE6D /* test.c */; }; - 273F20AB14ADBE670021BE6D /* ChapterTitles.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F208D14ADBE670021BE6D /* ChapterTitles.m */; }; 273F20AC14ADBE670021BE6D /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F208F14ADBE670021BE6D /* Controller.m */; }; 273F20AD14ADBE670021BE6D /* HBAdvancedController.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F209014ADBE670021BE6D /* HBAdvancedController.m */; }; 273F20AE14ADBE670021BE6D /* HBAudio.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F209214ADBE670021BE6D /* HBAudio.m */; }; @@ -34,7 +33,6 @@ 273F20B614ADBE670021BE6D /* HBPresets.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F20A214ADBE670021BE6D /* HBPresets.m */; }; 273F20B714ADBE670021BE6D /* HBPreviewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F20A414ADBE670021BE6D /* HBPreviewController.m */; }; 273F20B814ADBE670021BE6D /* HBQueueController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 273F20A614ADBE670021BE6D /* HBQueueController.mm */; }; - 273F20B914ADBE670021BE6D /* HBSubtitles.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F20A814ADBE670021BE6D /* HBSubtitles.m */; }; 273F20BA14ADBE670021BE6D /* PictureController.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F20AA14ADBE670021BE6D /* PictureController.m */; }; 273F20BE14ADC09F0021BE6D /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 273F20BD14ADC09F0021BE6D /* main.mm */; }; 273F20C314ADC4AE0021BE6D /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 273F202914ADB8D60021BE6D /* libiconv.dylib */; }; @@ -118,13 +116,20 @@ 27D6C77314B102DA00B785E4 /* libxml2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C74014B102DA00B785E4 /* libxml2.a */; }; 3490BCB41614CF8D002A5AD7 /* HandBrake.icns in Resources */ = {isa = PBXBuildFile; fileRef = 3490BCB31614CF8D002A5AD7 /* HandBrake.icns */; }; 46AB433515F98A2B009C0961 /* DockTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 46AB433415F98A2B009C0961 /* DockTextField.m */; }; - A9CEA52B196EA2B5000D966E /* HBUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = A9CEA52A196EA2B5000D966E /* HBUtilities.m */; }; + A91726E7197291BC00D1AFEF /* HBChapterTitlesController.m in Sources */ = {isa = PBXBuildFile; fileRef = A91726E6197291BC00D1AFEF /* HBChapterTitlesController.m */; }; + A93E0ED31972957000FD67FB /* HBVideoController.m in Sources */ = {isa = PBXBuildFile; fileRef = A93E0ED11972957000FD67FB /* HBVideoController.m */; }; + A93E0ED71972958C00FD67FB /* Video.xib in Resources */ = {isa = PBXBuildFile; fileRef = A93E0ED51972958C00FD67FB /* Video.xib */; }; + A9935213196F38A70069C6B7 /* ChaptersTitles.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9935211196F38A70069C6B7 /* ChaptersTitles.xib */; }; + A9AA447A1970664A00D7DEFC /* HBUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = A9AA44791970664A00D7DEFC /* HBUtilities.m */; }; A9D1E41718262364002F6424 /* HBPreviewGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D1E41618262364002F6424 /* HBPreviewGenerator.m */; }; + A9DC6C52196F04F6002AE6B4 /* HBSubtitlesController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9DC6C50196F04F6002AE6B4 /* HBSubtitlesController.m */; }; + A9DC6C56196F0517002AE6B4 /* Subtitles.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9DC6C54196F0517002AE6B4 /* Subtitles.xib */; }; A9E1467B16BC2ABD00C307BC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9E1467A16BC2ABD00C307BC /* QuartzCore.framework */; }; A9E1468016BC2AD800C307BC /* next-p.pdf in Resources */ = {isa = PBXBuildFile; fileRef = A9E1467C16BC2AD800C307BC /* next-p.pdf */; }; A9E1468116BC2AD800C307BC /* pause-p.pdf in Resources */ = {isa = PBXBuildFile; fileRef = A9E1467D16BC2AD800C307BC /* pause-p.pdf */; }; A9E1468216BC2AD800C307BC /* play-p.pdf in Resources */ = {isa = PBXBuildFile; fileRef = A9E1467E16BC2AD800C307BC /* play-p.pdf */; }; A9E1468316BC2AD800C307BC /* prev-p.pdf in Resources */ = {isa = PBXBuildFile; fileRef = A9E1467F16BC2AD800C307BC /* prev-p.pdf */; }; + A9F2EB6F196F12C800066546 /* Audio.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9F2EB6D196F12C800066546 /* Audio.xib */; }; D2BCB10916F5152C0084604C /* activity.png in Resources */ = {isa = PBXBuildFile; fileRef = D2BCB0F616F515230084604C /* activity.png */; }; D2BCB10A16F5152C0084604C /* activity@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D2BCB0F716F515230084604C /* activity@2x.png */; }; D2BCB10B16F5152C0084604C /* addqueue.png in Resources */ = {isa = PBXBuildFile; fileRef = D2BCB0F816F515240084604C /* addqueue.png */; }; @@ -216,8 +221,6 @@ 273F208614ADBE3B0021BE6D /* parsecsv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parsecsv.c; sourceTree = ""; }; 273F208714ADBE3B0021BE6D /* parsecsv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parsecsv.h; sourceTree = ""; }; 273F208814ADBE3B0021BE6D /* test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = test.c; sourceTree = ""; }; - 273F208C14ADBE670021BE6D /* ChapterTitles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChapterTitles.h; sourceTree = ""; }; - 273F208D14ADBE670021BE6D /* ChapterTitles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChapterTitles.m; sourceTree = ""; }; 273F208E14ADBE670021BE6D /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; 273F208F14ADBE670021BE6D /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; 273F209014ADBE670021BE6D /* HBAdvancedController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBAdvancedController.m; sourceTree = ""; }; @@ -239,10 +242,7 @@ 273F20A214ADBE670021BE6D /* HBPresets.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBPresets.m; sourceTree = ""; }; 273F20A314ADBE670021BE6D /* HBPreviewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPreviewController.h; sourceTree = ""; }; 273F20A414ADBE670021BE6D /* HBPreviewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBPreviewController.m; sourceTree = ""; }; - 273F20A514ADBE670021BE6D /* HBQueueController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBQueueController.h; sourceTree = ""; }; - 273F20A614ADBE670021BE6D /* HBQueueController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = HBQueueController.mm; sourceTree = ""; }; - 273F20A714ADBE670021BE6D /* HBSubtitles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBSubtitles.h; sourceTree = ""; }; - 273F20A814ADBE670021BE6D /* HBSubtitles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBSubtitles.m; sourceTree = ""; }; + 273F20A614ADBE670021BE6D /* HBQueueController.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.objc; fileEncoding = 4; path = HBQueueController.mm; sourceTree = ""; }; 273F20A914ADBE670021BE6D /* PictureController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PictureController.h; sourceTree = ""; }; 273F20AA14ADBE670021BE6D /* PictureController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PictureController.m; sourceTree = ""; }; 273F20BD14ADC09F0021BE6D /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; @@ -271,7 +271,7 @@ 273F214214ADCBF80021BE6D /* RevealHighlightPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RevealHighlightPressed.png; sourceTree = ""; }; 273F214314ADCBF80021BE6D /* RevealPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RevealPressed.png; sourceTree = ""; }; 273F217B14ADDDA10021BE6D /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = AdvancedView.xib; sourceTree = ""; }; - 273F217D14ADDDA10021BE6D /* English */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = English; path = InfoPlist.strings; sourceTree = ""; }; + 273F217D14ADDDA10021BE6D /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = InfoPlist.strings; sourceTree = ""; }; 273F217F14ADDDA10021BE6D /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = MainMenu.xib; sourceTree = ""; }; 273F218114ADDDA10021BE6D /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = OutputPanel.xib; sourceTree = ""; }; 273F218314ADDDA10021BE6D /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = PicturePreview.xib; sourceTree = ""; }; @@ -310,18 +310,29 @@ 27D6C73F14B102DA00B785E4 /* libx264.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libx264.a; path = external/contrib/lib/libx264.a; sourceTree = BUILT_PRODUCTS_DIR; }; 27D6C74014B102DA00B785E4 /* libxml2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libxml2.a; path = external/contrib/lib/libxml2.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3490BCB31614CF8D002A5AD7 /* HandBrake.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = HandBrake.icns; sourceTree = ""; }; - 34FF2FC014EEC363004C2400 /* HBAdvancedController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAdvancedController.h; sourceTree = ""; }; 46AB433315F98A2B009C0961 /* DockTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DockTextField.h; sourceTree = ""; }; 46AB433415F98A2B009C0961 /* DockTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DockTextField.m; sourceTree = ""; }; - A9CEA529196EA2B5000D966E /* HBUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBUtilities.h; sourceTree = ""; }; - A9CEA52A196EA2B5000D966E /* HBUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBUtilities.m; sourceTree = ""; }; - A9D1E41518262364002F6424 /* HBPreviewGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPreviewGenerator.h; sourceTree = ""; }; + A91726E5197291BC00D1AFEF /* HBChapterTitlesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBChapterTitlesController.h; sourceTree = ""; }; + A91726E6197291BC00D1AFEF /* HBChapterTitlesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBChapterTitlesController.m; sourceTree = ""; }; + A93E0ED01972957000FD67FB /* HBVideoController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBVideoController.h; sourceTree = ""; }; + A93E0ED11972957000FD67FB /* HBVideoController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBVideoController.m; sourceTree = ""; }; + A93E0ED61972958C00FD67FB /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Video.xib; sourceTree = ""; }; + A9935212196F38A70069C6B7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = ChaptersTitles.xib; sourceTree = ""; }; + A9AA44781970664A00D7DEFC /* HBUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBUtilities.h; sourceTree = ""; }; + A9AA44791970664A00D7DEFC /* HBUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBUtilities.m; sourceTree = ""; }; + A9AA447B1970724D00D7DEFC /* HBAdvancedController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBAdvancedController.h; sourceTree = ""; }; + A9AA447C1970726500D7DEFC /* HBQueueController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBQueueController.h; sourceTree = ""; }; + A9AA447D1970729300D7DEFC /* HBPreviewGenerator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBPreviewGenerator.h; sourceTree = ""; }; A9D1E41618262364002F6424 /* HBPreviewGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBPreviewGenerator.m; sourceTree = ""; }; + A9DC6C4F196F04F6002AE6B4 /* HBSubtitlesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBSubtitlesController.h; sourceTree = SOURCE_ROOT; }; + A9DC6C50196F04F6002AE6B4 /* HBSubtitlesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBSubtitlesController.m; sourceTree = SOURCE_ROOT; }; + A9DC6C55196F0517002AE6B4 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Subtitles.xib; sourceTree = ""; }; A9E1467A16BC2ABD00C307BC /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = /System/Library/Frameworks/QuartzCore.framework; sourceTree = ""; }; A9E1467C16BC2AD800C307BC /* next-p.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "next-p.pdf"; sourceTree = ""; }; A9E1467D16BC2AD800C307BC /* pause-p.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "pause-p.pdf"; sourceTree = ""; }; A9E1467E16BC2AD800C307BC /* play-p.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "play-p.pdf"; sourceTree = ""; }; A9E1467F16BC2AD800C307BC /* prev-p.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "prev-p.pdf"; sourceTree = ""; }; + A9F2EB6E196F12C800066546 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Audio.xib; sourceTree = ""; }; D2BCB0F616F515230084604C /* activity.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = activity.png; sourceTree = ""; }; D2BCB0F716F515230084604C /* activity@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "activity@2x.png"; sourceTree = ""; }; D2BCB0F816F515240084604C /* addqueue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = addqueue.png; sourceTree = ""; }; @@ -531,42 +542,44 @@ 273F204114ADBC210021BE6D /* HandBrake */ = { isa = PBXGroup; children = ( - 273F208C14ADBE670021BE6D /* ChapterTitles.h */, - 273F208D14ADBE670021BE6D /* ChapterTitles.m */, 273F208E14ADBE670021BE6D /* Controller.h */, 273F208F14ADBE670021BE6D /* Controller.m */, - A9CEA529196EA2B5000D966E /* HBUtilities.h */, - A9CEA52A196EA2B5000D966E /* HBUtilities.m */, - 46AB433315F98A2B009C0961 /* DockTextField.h */, - 46AB433415F98A2B009C0961 /* DockTextField.m */, - 34FF2FC014EEC363004C2400 /* HBAdvancedController.h */, - 273F209014ADBE670021BE6D /* HBAdvancedController.m */, + A9AA447C1970726500D7DEFC /* HBQueueController.h */, + 273F20A614ADBE670021BE6D /* HBQueueController.mm */, + 273F209F14ADBE670021BE6D /* HBPreferencesController.h */, + 273F20A014ADBE670021BE6D /* HBPreferencesController.m */, + A93E0ED01972957000FD67FB /* HBVideoController.h */, + A93E0ED11972957000FD67FB /* HBVideoController.m */, 273F209114ADBE670021BE6D /* HBAudio.h */, 273F209214ADBE670021BE6D /* HBAudio.m */, + A9AA447B1970724D00D7DEFC /* HBAdvancedController.h */, + 273F209014ADBE670021BE6D /* HBAdvancedController.m */, 273F209314ADBE670021BE6D /* HBAudioController.h */, 273F209414ADBE670021BE6D /* HBAudioController.m */, + A9DC6C4F196F04F6002AE6B4 /* HBSubtitlesController.h */, + A9DC6C50196F04F6002AE6B4 /* HBSubtitlesController.m */, + A91726E5197291BC00D1AFEF /* HBChapterTitlesController.h */, + A91726E6197291BC00D1AFEF /* HBChapterTitlesController.m */, + 273F20A914ADBE670021BE6D /* PictureController.h */, + 273F20AA14ADBE670021BE6D /* PictureController.m */, + 273F20A314ADBE670021BE6D /* HBPreviewController.h */, + 273F20A414ADBE670021BE6D /* HBPreviewController.m */, + A9AA447D1970729300D7DEFC /* HBPreviewGenerator.h */, + A9D1E41618262364002F6424 /* HBPreviewGenerator.m */, + 273F20A114ADBE670021BE6D /* HBPresets.h */, + 273F20A214ADBE670021BE6D /* HBPresets.m */, + A9AA44781970664A00D7DEFC /* HBUtilities.h */, + A9AA44791970664A00D7DEFC /* HBUtilities.m */, 273F209714ADBE670021BE6D /* HBDVDDetector.h */, 273F209814ADBE670021BE6D /* HBDVDDetector.m */, + 46AB433315F98A2B009C0961 /* DockTextField.h */, + 46AB433415F98A2B009C0961 /* DockTextField.m */, 273F209914ADBE670021BE6D /* HBImageAndTextCell.h */, 273F209A14ADBE670021BE6D /* HBImageAndTextCell.m */, 273F209B14ADBE670021BE6D /* HBOutputPanelController.h */, 273F209C14ADBE670021BE6D /* HBOutputPanelController.m */, 273F209D14ADBE670021BE6D /* HBOutputRedirect.h */, 273F209E14ADBE670021BE6D /* HBOutputRedirect.m */, - 273F209F14ADBE670021BE6D /* HBPreferencesController.h */, - 273F20A014ADBE670021BE6D /* HBPreferencesController.m */, - 273F20A114ADBE670021BE6D /* HBPresets.h */, - 273F20A214ADBE670021BE6D /* HBPresets.m */, - 273F20A314ADBE670021BE6D /* HBPreviewController.h */, - 273F20A414ADBE670021BE6D /* HBPreviewController.m */, - A9D1E41518262364002F6424 /* HBPreviewGenerator.h */, - A9D1E41618262364002F6424 /* HBPreviewGenerator.m */, - 273F20A514ADBE670021BE6D /* HBQueueController.h */, - 273F20A614ADBE670021BE6D /* HBQueueController.mm */, - 273F20A714ADBE670021BE6D /* HBSubtitles.h */, - 273F20A814ADBE670021BE6D /* HBSubtitles.m */, - 273F20A914ADBE670021BE6D /* PictureController.h */, - 273F20AA14ADBE670021BE6D /* PictureController.m */, 273F20BD14ADC09F0021BE6D /* main.mm */, ); name = HandBrake; @@ -652,9 +665,13 @@ 273F217914ADDDA10021BE6D /* English.lproj */ = { isa = PBXGroup; children = ( - 273F217A14ADDDA10021BE6D /* AdvancedView.xib */, 273F217C14ADDDA10021BE6D /* InfoPlist.strings */, 273F217E14ADDDA10021BE6D /* MainMenu.xib */, + A93E0ED51972958C00FD67FB /* Video.xib */, + A9F2EB6D196F12C800066546 /* Audio.xib */, + A9DC6C54196F0517002AE6B4 /* Subtitles.xib */, + 273F217A14ADDDA10021BE6D /* AdvancedView.xib */, + A9935211196F38A70069C6B7 /* ChaptersTitles.xib */, 273F218014ADDDA10021BE6D /* OutputPanel.xib */, 273F218214ADDDA10021BE6D /* PicturePreview.xib */, 273F218414ADDDA10021BE6D /* PictureSettings.xib */, @@ -780,7 +797,7 @@ 273F1FE014AD9DA40021BE6D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0510; }; buildConfigurationList = 273F1FE314AD9DA40021BE6D /* Build configuration list for PBXProject "HandBrake" */; compatibilityVersion = "Xcode 3.2"; @@ -811,6 +828,7 @@ 273F214D14ADCBF80021BE6D /* DeleteHighlight.png in Resources */, 273F214E14ADCBF80021BE6D /* DeleteHighlightPressed.png in Resources */, 273F214F14ADCBF80021BE6D /* DeletePressed.png in Resources */, + A9F2EB6F196F12C800066546 /* Audio.xib in Resources */, 273F215114ADCBF80021BE6D /* EncodeCanceled.png in Resources */, 273F215214ADCBF80021BE6D /* EncodeComplete.png in Resources */, 273F215314ADCBF80021BE6D /* EncodeWorking0.png in Resources */, @@ -852,12 +870,15 @@ D2BCB11116F5152C0084604C /* encode.png in Resources */, D2BCB11216F5152C0084604C /* encode@2x.png in Resources */, D2BCB11316F5152C0084604C /* pauseencode.png in Resources */, + A9DC6C56196F0517002AE6B4 /* Subtitles.xib in Resources */, D2BCB11416F5152C0084604C /* pauseencode@2x.png in Resources */, D2BCB11516F5152C0084604C /* picturesettings.png in Resources */, + A93E0ED71972958C00FD67FB /* Video.xib in Resources */, D2BCB11616F5152C0084604C /* picturesettings@2x.png in Resources */, D2BCB11716F5152C0084604C /* presets.png in Resources */, D2BCB11816F5152C0084604C /* presets@2x.png in Resources */, D2BCB11916F5152C0084604C /* preview.png in Resources */, + A9935213196F38A70069C6B7 /* ChaptersTitles.xib in Resources */, D2BCB11A16F5152C0084604C /* preview@2x.png in Resources */, D2BCB11B16F5152C0084604C /* settings@2x.png in Resources */, D2BCB12316F5154E0084604C /* settings.png in Resources */, @@ -887,8 +908,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A9CEA52B196EA2B5000D966E /* HBUtilities.m in Sources */, - 273F20AB14ADBE670021BE6D /* ChapterTitles.m in Sources */, + A9AA447A1970664A00D7DEFC /* HBUtilities.m in Sources */, 273F20AC14ADBE670021BE6D /* Controller.m in Sources */, 273F20AD14ADBE670021BE6D /* HBAdvancedController.m in Sources */, 273F20AE14ADBE670021BE6D /* HBAudio.m in Sources */, @@ -898,13 +918,15 @@ 273F20B314ADBE670021BE6D /* HBOutputPanelController.m in Sources */, 273F20B414ADBE670021BE6D /* HBOutputRedirect.m in Sources */, 273F20B514ADBE670021BE6D /* HBPreferencesController.m in Sources */, + A9DC6C52196F04F6002AE6B4 /* HBSubtitlesController.m in Sources */, + A93E0ED31972957000FD67FB /* HBVideoController.m in Sources */, 273F20B614ADBE670021BE6D /* HBPresets.m in Sources */, 273F20B714ADBE670021BE6D /* HBPreviewController.m in Sources */, A9D1E41718262364002F6424 /* HBPreviewGenerator.m in Sources */, 273F20B814ADBE670021BE6D /* HBQueueController.mm in Sources */, - 273F20B914ADBE670021BE6D /* HBSubtitles.m in Sources */, 273F20BA14ADBE670021BE6D /* PictureController.m in Sources */, 273F20BE14ADC09F0021BE6D /* main.mm in Sources */, + A91726E7197291BC00D1AFEF /* HBChapterTitlesController.m in Sources */, 46AB433515F98A2B009C0961 /* DockTextField.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -989,6 +1011,38 @@ name = Queue.xib; sourceTree = ""; }; + A93E0ED51972958C00FD67FB /* Video.xib */ = { + isa = PBXVariantGroup; + children = ( + A93E0ED61972958C00FD67FB /* English */, + ); + name = Video.xib; + sourceTree = ""; + }; + A9935211196F38A70069C6B7 /* ChaptersTitles.xib */ = { + isa = PBXVariantGroup; + children = ( + A9935212196F38A70069C6B7 /* English */, + ); + name = ChaptersTitles.xib; + sourceTree = ""; + }; + A9DC6C54196F0517002AE6B4 /* Subtitles.xib */ = { + isa = PBXVariantGroup; + children = ( + A9DC6C55196F0517002AE6B4 /* English */, + ); + name = Subtitles.xib; + sourceTree = ""; + }; + A9F2EB6D196F12C800066546 /* Audio.xib */ = { + isa = PBXVariantGroup; + children = ( + A9F2EB6E196F12C800066546 /* English */, + ); + name = Audio.xib; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ -- cgit v1.2.3