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