/* HBPresets.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 "HBPresetsManager.h"
#import "HBPreset.h"
#import "HBUtilities.h"
NSString *HBPresetsChangedNotification = @"HBPresetsChangedNotification";
@interface HBPresetsManager ()
@property (nonatomic, readonly, copy) NSURL *fileURL;
/* Dictionaries for individual presets ("Devices" folder) */
- (NSDictionary *)createUniversalPreset;
- (NSDictionary *)createiPodPreset;
- (NSDictionary *)createiPhoneiPodtouchPreset;
- (NSDictionary *)createiPadPreset;
- (NSDictionary *)createAppleTVPreset;
- (NSDictionary *)createAppleTV2Preset;
- (NSDictionary *)createAppleTV3Preset;
- (NSDictionary *)createAndroidPreset;
- (NSDictionary *)createAndroidTabletPreset;
- (NSDictionary *)createW8PhonePreset;
/* Dictionaries for individual presets ("Regular" folder) */
- (NSDictionary *)createNormalPreset;
- (NSDictionary *)createHighProfilePreset;
@end
@implementation HBPresetsManager
- (instancetype)init
{
self = [super init];
if (self)
{
// Init the root of the tree, it won't never be shown in the UI
_root = [[HBPreset alloc] initWithFolderName:@"Root" builtIn:YES];
_root.delegate = self;
}
return self;
}
- (instancetype)initWithURL:(NSURL *)url
{
self = [self init];
if (self)
{
_fileURL = [url copy];
[self loadPresetsFromURL:url];
}
return self;
}
- (void)dealloc
{
[_fileURL release];
[_defaultPreset release];
[_root release];
[super dealloc];
}
- (NSIndexPath *)indexPathOfPreset:(HBPreset *)preset
{
__block NSIndexPath *retValue = nil;
// Visit the whole tree to find the index path.
[self.root enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop)
{
if ([obj isEqualTo:preset])
{
retValue = [idx retain];
*stop = YES;
}
}];
return [retValue autorelease];
}
#pragma mark - HBTreeNode delegate
- (void)nodeDidChange
{
[[NSNotificationCenter defaultCenter] postNotificationName:HBPresetsChangedNotification object:nil];
}
#pragma mark - Load/Save
- (BOOL)loadPresetsFromURL:(NSURL *)url
{
NSArray *presetsArray = [[NSArray alloc] initWithContentsOfURL:url];
for (NSDictionary *child in presetsArray)
{
[self.root.children addObject:[self loadFromDict:child]];
}
[presetsArray release];
// If the preset list contains no leaf,
// add back the built in presets.
__block BOOL leafFound = NO;
[self.root enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) {
if ([obj isLeaf])
{
leafFound = YES;
*stop = YES;
}
}];
if (!leafFound)
{
[self generateBuiltInPresets];
}
if (self.defaultPreset == nil)
{
[self selectNewDefault];
}
return YES;
}
- (BOOL)savePresetsToURL:(NSURL *)url
{
NSMutableArray *presetsArray = [[[NSMutableArray alloc] init] autorelease];
for (HBPreset *node in self.root.children)
{
[presetsArray addObject:[self convertToDict:node]];
}
return [presetsArray writeToURL:url atomically:YES];
return YES;
}
- (BOOL)savePresets
{
return [self savePresetsToURL:self.fileURL];
}
#pragma mark - NSDictionary conversions
/**
* Converts the NSDictionary to a HBPreset object,
*/
- (HBPreset *)loadFromDict:(NSDictionary *)dict
{
HBPreset *node = nil;
if ([dict[@"Folder"] boolValue])
{
node = [[[HBPreset alloc] initWithFolderName:dict[@"PresetName"]
builtIn:![dict[@"Type"] boolValue]] autorelease];
for (NSDictionary *child in dict[@"ChildrenArray"])
{
[node.children addObject:[self loadFromDict:child]];
}
}
else
{
node = [[[HBPreset alloc] initWithName:dict[@"PresetName"]
content:dict
builtIn:![dict[@"Type"] boolValue]] autorelease];
node.isDefault = [dict[@"Default"] boolValue];
if ([dict[@"Default"] boolValue])
{
self.defaultPreset = node;
}
}
node.delegate = self;
return node;
}
/**
* Converts the HBPreset and its childrens to a NSDictionary.
*/
- (NSDictionary *)convertToDict:(HBPreset *)node
{
NSMutableDictionary *output = [[NSMutableDictionary alloc] init];
[output addEntriesFromDictionary:node.content];
output[@"PresetName"] = node.name;
output[@"Folder"] = @(!node.isLeaf);
output[@"Type"] = @(!node.isBuiltIn);
output[@"Default"] = @(node.isDefault);
if (!node.isLeaf)
{
NSMutableArray *childArray = [[NSMutableArray alloc] init];
for (HBPreset *child in node.children)
{
[childArray addObject:[self convertToDict:child]];
}
output[@"ChildrenArray"] = childArray;
[childArray release];
}
return [output autorelease];
}
#pragma mark - Presets Management
- (BOOL)checkBuiltInsForUpdates
{
__block BOOL retValue = NO;
[self.root enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) {
NSDictionary *dict = [obj content];
if ([obj isBuiltIn] && [obj isLeaf])
{
if (!dict[@"PresetBuildNumber"] ||
[dict[@"PresetBuildNumber"] intValue] < [[[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"] intValue])
{
retValue = YES;
*stop = YES;
}
}
}];
return retValue;
}
- (void)addPresetFromDictionary:(NSDictionary *)preset
{
HBPreset *presetNode = [[HBPreset alloc] initWithName:preset[@"PresetName"]
content:preset
builtIn:NO];
[self.root insertObject:presetNode inChildrenAtIndex:[self.root countOfChildren]];
[presetNode release];
[self savePresets];
}
- (void)addPreset:(HBPreset *)preset
{
[self.root insertObject:preset inChildrenAtIndex:[self.root countOfChildren]];
[self savePresets];
}
- (void)deletePresetAtIndexPath:(NSIndexPath *)idx
{
HBPreset *parentNode = self.root;
// Find the preset parent array
// and delete it.
NSUInteger currIdx = 0;
NSUInteger i = 0;
for (i = 0; i < idx.length - 1; i++)
{
currIdx = [idx indexAtPosition:i];
if (parentNode.children.count > currIdx)
{
parentNode = [parentNode.children objectAtIndex:currIdx];
}
}
currIdx = [idx indexAtPosition:i];
if (parentNode.children.count > currIdx)
{
if ([[parentNode.children objectAtIndex:currIdx] isDefault])
{
[parentNode removeObjectFromChildrenAtIndex:currIdx];
// Try to select a new default preset
[self selectNewDefault];
}
else
{
[parentNode removeObjectFromChildrenAtIndex:currIdx];
}
}
}
/**
* Private method to select a new default after the default preset is deleted
* or when the built-in presets are regenerated.
*/
- (void)selectNewDefault
{
__block HBPreset *normalPreset = nil;
__block HBPreset *firstUserPreset = nil;
__block HBPreset *firstBuiltInPreset = nil;
__block BOOL defaultAlreadySetted = NO;
// Search for a possibile new default preset
// Try to use "Normal" or the first user preset.
[self.root enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) {
if ([obj isBuiltIn] && [obj isLeaf])
{
if ([[obj name] isEqualToString:@"Normal"])
{
normalPreset = obj;
}
if (firstBuiltInPreset == nil)
{
firstBuiltInPreset = obj;
}
}
else if ([obj isLeaf] && firstUserPreset == nil)
{
firstUserPreset = obj;
*stop = YES;
}
if ([obj isDefault]) {
defaultAlreadySetted = YES;
}
}];
if (defaultAlreadySetted) {
return;
}
else if (normalPreset)
{
self.defaultPreset = normalPreset;
normalPreset.isDefault = YES;
}
else if (firstUserPreset)
{
self.defaultPreset = firstUserPreset;
firstUserPreset.isDefault = YES;
}
else if (firstBuiltInPreset) {
self.defaultPreset = firstBuiltInPreset;
firstBuiltInPreset.isDefault = YES;
}
}
- (void)setDefaultPreset:(HBPreset *)defaultPreset
{
if (defaultPreset && defaultPreset.isLeaf)
{
if (_defaultPreset)
{
_defaultPreset.isDefault = NO;
[_defaultPreset autorelease];
}
defaultPreset.isDefault = YES;
_defaultPreset = [defaultPreset retain];
[self nodeDidChange];
}
}
#pragma mark - Built In Generation
- (void)loadPresetsForType:(NSString *)type fromSel:(SEL[])selArray length:(int)len
{
HBPreset *folderNode = [[HBPreset alloc] initWithFolderName:type builtIn:YES];
for (int i = 0; i < len; i++)
{
NSMutableDictionary *presetDict = [self performSelector:selArray[i]];
presetDict[@"PresetBuildNumber"] = [[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"];
HBPreset *presetNode = [[HBPreset alloc] initWithName:presetDict[@"PresetName"]
content:presetDict
builtIn:YES];
[folderNode.children addObject:presetNode];
[presetNode release];
}
[self.root insertObject:folderNode inChildrenAtIndex:0];
[folderNode release];
}
/**
* Built-in preset folders at the root of the hierarchy
*
* Re-create new built-in presets programmatically and add them to the array
*
* Note: the built-in presets will *not* sort themselves alphabetically,
* so they will appear in the order you create them.
*/
- (void)generateBuiltInPresets
{
SEL devicesPresets[] = { @selector(createUniversalPreset),
@selector(createiPodPreset),
@selector(createiPhoneiPodtouchPreset),
@selector(createiPadPreset),
@selector(createAppleTVPreset),
@selector(createAppleTV2Preset),
@selector(createAppleTV3Preset),
@selector(createAndroidPreset),
@selector(createAndroidTabletPreset),
@selector(createW8PhonePreset)
};
SEL regularPresets[] = { @selector(createNormalPreset),
@selector(createHighProfilePreset)};
[self deleteBuiltInPresets];
[self loadPresetsForType:@"Regular" fromSel:regularPresets length:2];
[self loadPresetsForType:@"Devices" fromSel:devicesPresets length:10];
// set a new Default preset
[self selectNewDefault];
[HBUtilities writeToActivityLog: "built in presets updated to build number: %d", [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] intValue]];
}
- (void)deleteBuiltInPresets
{
[self willChangeValueForKey:@"root"];
NSMutableArray *nodeToRemove = [[NSMutableArray alloc] init];
for (HBPreset *node in self.root.children)
{
if (node.isBuiltIn)
{
[nodeToRemove addObject:node];
}
}
[self.root.children removeObjectsInArray:nodeToRemove];
[nodeToRemove release];
[self didChangeValueForKey:@"root"];
}
#pragma mark -
#pragma mark Individual Preset Definitions
/* These NSDictionary definitions contain settings for one built-in preset */
- (NSMutableDictionary *)createUniversalPreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"Universal";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's settings for compatibility with all Apple devices (including the iPod 6G and later). Includes Dolby Digital audio for surround sound.";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @1;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"fast";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"baseline";
preset[@"VideoLevel"] = @"3.0";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @20.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @720;
preset[@"PictureHeight"] = @576;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"160";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Track 2 */
NSMutableDictionary *audioTrack2Array = [[NSMutableDictionary alloc] init];
audioTrack2Array[@"AudioTrack"] = @1;
audioTrack2Array[@"AudioEncoder"] = @"AC3 Passthru";
audioTrack2Array[@"AudioMixdown"] = @"None";
audioTrack2Array[@"AudioSamplerate"] = @"Auto";
audioTrack2Array[@"AudioBitrate"] = @"160";
audioTrack2Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack2Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack2Array autorelease];
[audioListArray addObject:audioTrack2Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createiPodPreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"iPod";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's settings for playback on the iPod with Video (all generations).";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @1;
/* Chapter markers */
preset[@"ChapterMarkers"] = @1;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"baseline";
preset[@"VideoLevel"] = @"1.3";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @22.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @320;
preset[@"PictureHeight"] = @240;
preset[@"PicturePAR"] = @0; //none
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @1;
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"160";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createiPhoneiPodtouchPreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"iPhone & iPod touch";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's settings for handheld iOS devices (iPhone 4, iPod touch 3G and later).";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @1;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"high";
preset[@"VideoLevel"] = @"3.1";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @22.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @960;
preset[@"PictureHeight"] = @640;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"160";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createiPadPreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"iPad";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's settings for playback on the iPad (all generations).";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @1;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"high";
preset[@"VideoLevel"] = @"3.1";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @20.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @1280;
preset[@"PictureHeight"] = @720;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"160";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createAppleTVPreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"AppleTV";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's settings for the original AppleTV. Includes Dolby Digital audio for surround sound. Also compatible with iOS devices released since 2009.";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @1;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"qpmin=4:cabac=0:ref=2:b-pyramid=none:weightb=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500";
preset[@"VideoProfile"] = @"high";
preset[@"VideoLevel"] = @"3.1";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @20.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @960;
preset[@"PictureHeight"] = @720;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"160";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Track 2 */
NSMutableDictionary *audioTrack2Array = [[NSMutableDictionary alloc] init];
audioTrack2Array[@"AudioTrack"] = @1;
audioTrack2Array[@"AudioEncoder"] = @"AC3 Passthru";
audioTrack2Array[@"AudioMixdown"] = @"None";
audioTrack2Array[@"AudioSamplerate"] = @"Auto";
audioTrack2Array[@"AudioBitrate"] = @"160";
audioTrack2Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack2Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack2Array autorelease];
[audioListArray addObject:audioTrack2Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createAppleTV2Preset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"AppleTV 2";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's settings for the second-generation AppleTV. Includes Dolby Digital audio for surround sound. NOT compatible with the original AppleTV.";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @1;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"high";
preset[@"VideoLevel"] = @"3.1";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @20.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @1280;
preset[@"PictureHeight"] = @720;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"160";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Track 2 */
NSMutableDictionary *audioTrack2Array = [[NSMutableDictionary alloc] init];
audioTrack2Array[@"AudioTrack"] = @1;
audioTrack2Array[@"AudioEncoder"] = @"AC3 Passthru";
audioTrack2Array[@"AudioMixdown"] = @"None";
audioTrack2Array[@"AudioSamplerate"] = @"Auto";
audioTrack2Array[@"AudioBitrate"] = @"160";
audioTrack2Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack2Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack2Array autorelease];
[audioListArray addObject:audioTrack2Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createAppleTV3Preset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"AppleTV 3";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's settings for the third-generation AppleTV. Includes Dolby Digital audio for surround sound. NOT compatible with the original AppleTV. May stutter on the second-generation AppleTV.";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @1;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"high";
preset[@"VideoLevel"] = @"4.0";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @20.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @1920;
preset[@"PictureHeight"] = @1080;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @3; //fast
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"160";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Track 2 */
NSMutableDictionary *audioTrack2Array = [[NSMutableDictionary alloc] init];
audioTrack2Array[@"AudioTrack"] = @1;
audioTrack2Array[@"AudioEncoder"] = @"AC3 Passthru";
audioTrack2Array[@"AudioMixdown"] = @"None";
audioTrack2Array[@"AudioSamplerate"] = @"Auto";
audioTrack2Array[@"AudioBitrate"] = @"160";
audioTrack2Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack2Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack2Array autorelease];
[audioListArray addObject:audioTrack2Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createAndroidPreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"Android";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's settings for midrange devices running Android 2.3 or later.";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @0;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"main";
preset[@"VideoLevel"] = @"3.0";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @22.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @720;
preset[@"PictureHeight"] = @576;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"128";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createAndroidTabletPreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"Android Tablet";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's preset for tablets running Android 2.3 or later.";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @0;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"main";
preset[@"VideoLevel"] = @"3.1";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @22.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @1280;
preset[@"PictureHeight"] = @720;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"128";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createW8PhonePreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"Windows Phone 8";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's preset for Windows Phone 8 devices";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @0;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"main";
preset[@"VideoLevel"] = @"3.1";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @22.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"30";
preset[@"VideoFramerateMode"] = @"pfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @1280;
preset[@"PictureHeight"] = @720;
preset[@"PicturePAR"] = @0; //None
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @1;
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"128";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createNormalPreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"Normal";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @1; //default
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's normal, default settings.";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @1;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"veryfast";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"main";
preset[@"VideoLevel"] = @"4.0";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @20.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"Same as source";
preset[@"VideoFramerateMode"] = @"vfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @0;
preset[@"PictureHeight"] = @0;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @0; //off
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"160";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
- (NSMutableDictionary *)createHighProfilePreset
{
NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
/* Preset properties (name, type: factory/user, default, folder, tooltip) */
preset[@"PresetName"] = @"High Profile";
preset[@"Type"] = @0; //factory
preset[@"Default"] = @0;
preset[@"Folder"] = @NO;
preset[@"PresetDescription"] = @"HandBrake's general-purpose preset for High Profile H.264 video.";
/* Container format and related settings */
preset[@"FileFormat"] = @"MP4 file";
preset[@"Mp4HttpOptimize"] = @0;
preset[@"Mp4iPodCompatible"] = @0;
/* Chapter markers */
preset[@"ChapterMarkers"] = @1;
/* Video encoder and advanced options */
preset[@"VideoEncoder"] = @"H.264 (x264)";
preset[@"x264Option"] = @"";
preset[@"x264UseAdvancedOptions"] = @0;
preset[@"VideoPreset"] = @"medium";
preset[@"VideoTune"] = @"";
preset[@"VideoOptionExtra"] = @"";
preset[@"VideoProfile"] = @"high";
preset[@"VideoLevel"] = @"4.1";
/* Video rate control */
preset[@"VideoAvgBitrate"] = @"2500";
preset[@"VideoTwoPass"] = @0;
preset[@"VideoTurboTwoPass"] = @0;
preset[@"VideoQualityType"] = @2; //cq
preset[@"VideoQualitySlider"] = @20.0f;
/* Video frame rate */
preset[@"VideoFramerate"] = @"Same as source";
preset[@"VideoFramerateMode"] = @"vfr";
/* Picture size */
preset[@"UsesPictureSettings"] = @1;
preset[@"PictureWidth"] = @0;
preset[@"PictureHeight"] = @0;
preset[@"PicturePAR"] = @2; //loose
preset[@"PictureModulus"] = @2;
preset[@"PictureKeepRatio"] = @0; //set to 0 for Loose (FIXME: why?)
/* Picture filters */
preset[@"UsesPictureFilters"] = @1;
preset[@"PictureDecomb"] = @2; //default
preset[@"PictureDecombCustom"] = @"";
preset[@"PictureDecombDeinterlace"] = @1; //decomb
preset[@"PictureDeinterlace"] = @0;
preset[@"PictureDeinterlaceCustom"] = @"";
preset[@"PictureDetelecine"] = @0;
preset[@"PictureDetelecineCustom"] = @"";
preset[@"PictureDenoise"] = @0;
preset[@"PictureDenoiseCustom"] = @"";
preset[@"PictureDeblock"] = @0;
preset[@"VideoGrayScale"] = @0;
/* Picture crop */
preset[@"PictureAutoCrop"] = @1;
preset[@"PictureTopCrop"] = @0;
preset[@"PictureBottomCrop"] = @0;
preset[@"PictureLeftCrop"] = @0;
preset[@"PictureRightCrop"] = @0;
/* Auto Passthru */
preset[@"AudioEncoderFallback"] = @"AC3 (ffmpeg)";
preset[@"AudioAllowAACPass"] = @1;
preset[@"AudioAllowAC3Pass"] = @1;
preset[@"AudioAllowDTSHDPass"] = @1;
preset[@"AudioAllowDTSPass"] = @1;
preset[@"AudioAllowMP3Pass"] = @1;
/* Audio track list - no need to add "None" at the end */
NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
/* Track 1 */
NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
audioTrack1Array[@"AudioTrack"] = @1;
audioTrack1Array[@"AudioEncoder"] = @"AAC (avcodec)";
audioTrack1Array[@"AudioMixdown"] = @"Dolby Pro Logic II";
audioTrack1Array[@"AudioSamplerate"] = @"Auto";
audioTrack1Array[@"AudioBitrate"] = @"160";
audioTrack1Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack1Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack1Array autorelease];
[audioListArray addObject:audioTrack1Array];
/* Track 2 */
NSMutableDictionary *audioTrack2Array = [[NSMutableDictionary alloc] init];
audioTrack2Array[@"AudioTrack"] = @1;
audioTrack2Array[@"AudioEncoder"] = @"AC3 Passthru";
audioTrack2Array[@"AudioMixdown"] = @"None";
audioTrack2Array[@"AudioSamplerate"] = @"Auto";
audioTrack2Array[@"AudioBitrate"] = @"160";
audioTrack2Array[@"AudioTrackGainSlider"] = @0.0f;
audioTrack2Array[@"AudioTrackDRCSlider"] = @0.0f;
[audioTrack2Array autorelease];
[audioListArray addObject:audioTrack2Array];
/* Add the audio track(s) to the preset's audio list */
preset[@"AudioList"] = [NSMutableArray arrayWithArray:audioListArray];
[audioListArray release];
/* Subtitles (note: currently ignored) */
preset[@"Subtitles"] = @"None";
/* Clean up and return the preset */
[preset autorelease];
return preset;
}
@end