summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--macosx/Controller.h1
-rw-r--r--macosx/Controller.m158
2 files changed, 87 insertions, 72 deletions
diff --git a/macosx/Controller.h b/macosx/Controller.h
index 86576bebd..76e8e690f 100644
--- a/macosx/Controller.h
+++ b/macosx/Controller.h
@@ -78,6 +78,7 @@ BOOL fIsDragging;
IBOutlet NSTextField * fDisplayX264PresetsAdditonalOptionsLabel;
// Text Field to show the expanded opts from unparse()
IBOutlet NSTextField * fDisplayX264PresetsUnparseTextField;
+ char * fX264PresetsUnparsedUTF8String;
/* Advanced options tab */
HBAdvancedController * fAdvancedOptions;
diff --git a/macosx/Controller.m b/macosx/Controller.m
index 553426895..0c39ca906 100644
--- a/macosx/Controller.m
+++ b/macosx/Controller.m
@@ -114,6 +114,12 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It
[self updateDockIcon:-1.0 withETA:@""];
+ /*
+ * initialize fX264PresetsUnparsedUTF8String as early as possible
+ * avoids an invalid free
+ */
+ fX264PresetsUnparsedUTF8String = NULL;
+
return self;
}
@@ -2903,11 +2909,11 @@ fWorkingCount = 0;
*/
if (job->indepth_scan == 1)
{
- char *x264_preset_tmp = strdup(job->x264_preset);
- char *x264_tune_tmp = strdup(job->x264_tune);
- char *x264_encopts_tmp = strdup(job->advanced_opts);
- char *h264_profile_tmp = strdup(job->x264_profile);
- char *h264_level_tmp = strdup(job->h264_level);
+ char *x264_preset_tmp = strdup(job->x264_preset);
+ char *x264_tune_tmp = strdup(job->x264_tune);
+ char *advanced_opts_tmp = strdup(job->advanced_opts);
+ char *h264_profile_tmp = strdup(job->x264_profile);
+ char *h264_level_tmp = strdup(job->h264_level);
/*
* When subtitle scan is enabled do a fast pre-scan job
* which will determine which subtitles to enable, if any.
@@ -2928,12 +2934,12 @@ fWorkingCount = 0;
*/
hb_job_set_x264_preset (job, x264_preset_tmp);
hb_job_set_x264_tune (job, x264_tune_tmp);
- hb_job_set_advanced_opts(job, x264_encopts_tmp);
+ hb_job_set_advanced_opts(job, advanced_opts_tmp);
hb_job_set_x264_profile (job, h264_profile_tmp);
hb_job_set_x264_level (job, h264_level_tmp);
free(x264_preset_tmp);
free(x264_tune_tmp);
- free(x264_encopts_tmp);
+ free(advanced_opts_tmp);
free(h264_profile_tmp);
free(h264_level_tmp);
}
@@ -3295,22 +3301,22 @@ fWorkingCount = 0;
if( job->vcodec == HB_VCODEC_X264 )
{
/* advanced x264 options */
- NSString *x264Tune = @"";
- const char *x264_preset = NULL;
- const char *x264_tune = NULL;
- const char *x264_encopts = NULL;
- const char *h264_profile = NULL;
- const char *h264_level = NULL;
+ NSString *x264Tune = @"";
+ const char *x264_preset = NULL;
+ const char *x264_tune = NULL;
+ const char *advanced_opts = NULL;
+ const char *h264_profile = NULL;
+ const char *h264_level = NULL;
if ([fx264UseAdvancedOptionsCheck state])
{
// we are using the advanced panel
- x264_encopts = [[fAdvancedOptions optionsString] UTF8String];
+ advanced_opts = [[fAdvancedOptions optionsString] UTF8String];
}
else
{
// we are using the x264 system
- x264_preset = [[fX264PresetSelectedTextField stringValue] UTF8String];
- x264_encopts = [[fDisplayX264PresetsAdditonalOptionsTextField stringValue] UTF8String];
+ x264_preset = [[fX264PresetSelectedTextField stringValue] UTF8String];
+ advanced_opts = [[fDisplayX264PresetsAdditonalOptionsTextField stringValue] UTF8String];
if ([fX264TunePopUp indexOfSelectedItem] != 0)
{
x264Tune = [x264Tune stringByAppendingString: [fX264TunePopUp titleOfSelectedItem]];
@@ -3333,12 +3339,12 @@ fWorkingCount = 0;
}
if ([fX264LevelPopUp indexOfSelectedItem] != 0)
{
- h264_level = [[fX264ProfilePopUp titleOfSelectedItem] UTF8String];
+ h264_level = [[fX264LevelPopUp titleOfSelectedItem] UTF8String];
}
}
hb_job_set_x264_preset (job, x264_preset);
hb_job_set_x264_tune (job, x264_tune);
- hb_job_set_advanced_opts(job, x264_encopts);
+ hb_job_set_advanced_opts(job, advanced_opts);
hb_job_set_x264_profile (job, h264_profile);
hb_job_set_x264_level (job, h264_level);
}
@@ -3834,21 +3840,21 @@ bool one_burned = FALSE;
}
/* Here we pass the advanced x264 options to libhb */
- const char *x264_preset = NULL;
- const char *x264_tune = NULL;
- const char *x264_encopts = NULL;
- const char *h264_profile = NULL;
- const char *h264_level = NULL;
+ const char *x264_preset = NULL;
+ const char *x264_tune = NULL;
+ const char *advanced_opts = NULL;
+ const char *h264_profile = NULL;
+ const char *h264_level = NULL;
if ([[queueToApply objectForKey:@"x264UseAdvancedOptions"] intValue])
{
// we are using the advanced panel
- x264_encopts = [[queueToApply objectForKey:@"x264Option"] UTF8String];
+ advanced_opts = [[queueToApply objectForKey:@"x264Option"] UTF8String];
}
else
{
// we are using the x264 system
- x264_preset = [[queueToApply objectForKey:@"x264Preset"] UTF8String];
- x264_encopts = [[queueToApply objectForKey:@"x264OptionExtra"] UTF8String];
+ x264_preset = [[queueToApply objectForKey:@"x264Preset"] UTF8String];
+ advanced_opts = [[queueToApply objectForKey:@"x264OptionExtra"] UTF8String];
if ([[queueToApply objectForKey:@"x264Tune"] length])
{
x264_tune = [[queueToApply objectForKey:@"x264Tune"] UTF8String];
@@ -3864,7 +3870,7 @@ bool one_burned = FALSE;
}
hb_job_set_x264_preset (job, x264_preset);
hb_job_set_x264_tune (job, x264_tune);
- hb_job_set_advanced_opts(job, x264_encopts);
+ hb_job_set_advanced_opts(job, advanced_opts);
hb_job_set_x264_profile (job, h264_profile);
hb_job_set_x264_level (job, h264_level);
}
@@ -5447,62 +5453,70 @@ the user is using "Custom" settings by determining the sender*/
*/
- (IBAction) x264PresetsChangedDisplayExpandedOptions: (id) sender
-{
-
- // first we clear whatever is in fDisplayX264PresetsUnparseTextField
- [fDisplayX264PresetsUnparseTextField setStringValue:@""];
-
- // try to get our unparse from the widgets
-
- /* char * hb_x264_param_unparse(const char *x264_preset,
- const char *x264_tune,
- const char *x264_encopts,
- const char *x264_profile,
- const char *h264_level,
- int width,
- int height);
+{
+ int width, height;
+ /* API reference:
+ *
+ * char * hb_x264_param_unparse(const char *x264_preset,
+ * const char *x264_tune,
+ * const char *x264_encopts,
+ * const char *x264_profile,
+ * const char *h264_level,
+ * int width, int height);
*/
-
- /* We need to create a wrapper to take care of appending fastdecode to tune if Fast Decode is checked */
- NSString * preset = [fX264PresetSelectedTextField stringValue];
- NSString * tune = [fX264TunePopUp titleOfSelectedItem];
- NSString * profile = [fX264ProfilePopUp titleOfSelectedItem];
- NSString * level = [fX264LevelPopUp titleOfSelectedItem];
- //Parse out default labels from the popups
- if ([fX264TunePopUp indexOfSelectedItem] == 0)
+ NSString *x264Tune = @"";
+ const char *x264_preset = [[fX264PresetSelectedTextField stringValue] UTF8String];;
+ const char *x264_tune = NULL;
+ const char *advanced_opts = [[fDisplayX264PresetsAdditonalOptionsTextField stringValue] UTF8String];
+ const char *h264_profile = NULL;
+ const char *h264_level = NULL;
+ int unparse_width, unparse_height;
+ // prepare the tune, profile and level
+ if ([fX264TunePopUp indexOfSelectedItem] != 0)
{
- if ([fX264FastDecodeCheck state] == NSOnState)
- {
- tune = @"fastdecode";
- }
- else
- {
- tune = NULL;
- }
+ x264Tune = [x264Tune stringByAppendingString: [fX264TunePopUp titleOfSelectedItem]];
}
- else
+ if ([fX264FastDecodeCheck state])
{
- if ([fX264FastDecodeCheck state] == NSOnState)
+ if ([x264Tune length])
{
- tune = [tune stringByAppendingString:@",fastdecode"];
+ x264Tune = [x264Tune stringByAppendingString: @","];
}
+ x264Tune = [x264Tune stringByAppendingString: @"fastdecode"];
}
-
- if ([fX264ProfilePopUp indexOfSelectedItem] == 0)
+ if ([x264Tune length])
{
- profile = NULL;
+ // we can't upparse "none" as libhb doesn't handle it
+ x264_tune = [x264Tune UTF8String];
}
-
- if ([fX264LevelPopUp indexOfSelectedItem] == 0)
+ if ([fX264ProfilePopUp indexOfSelectedItem] != 0)
{
- level = NULL;
+ // we can't upparse "auto" as libhb doesn't handle it
+ h264_profile = [[fX264ProfilePopUp titleOfSelectedItem] UTF8String];
}
-
- /* note we feed hb_x264_param_unparse for now bogus width and height value as per Rodeo, here we use 1280 x 720 */
- char *unparsed_string = hb_x264_param_unparse([[fX264PresetSelectedTextField stringValue] UTF8String], [tune UTF8String], [[fDisplayX264PresetsAdditonalOptionsTextField stringValue] UTF8String], [profile UTF8String], [level UTF8String], 1280, 720);
-
- [fDisplayX264PresetsUnparseTextField setStringValue: [NSString stringWithFormat:@"x264 Unparse: %s", unparsed_string]];
-
+ if ([fX264LevelPopUp indexOfSelectedItem] != 0)
+ {
+ // we can't upparse "auto" as libhb doesn't handle it
+ h264_level = [[fX264LevelPopUp titleOfSelectedItem] UTF8String];
+ }
+ // prepare the width and height (FIXME)
+ unparse_width = 1280;
+ unparse_height = 720;
+ // if the previous unparsed string is non-NULL, free it
+ if (fX264PresetsUnparsedUTF8String != NULL)
+ {
+ free(fX264PresetsUnparsedUTF8String);
+ }
+ // now, unparse
+ fX264PresetsUnparsedUTF8String = hb_x264_param_unparse(x264_preset,
+ x264_tune,
+ advanced_opts,
+ h264_profile,
+ h264_level,
+ unparse_width,
+ unparse_height);
+ // update the text field
+ [fDisplayX264PresetsUnparseTextField setStringValue: [NSString stringWithFormat:@"x264 Unparse: %s", fX264PresetsUnparsedUTF8String]];
}
#pragma mark -