3 This file is part of the HandBrake source code.
4 Homepage: <http://handbrake.fr/>.
5 It may be used under the terms of the GNU General Public License. */
8 #import "HBCodingUtilities.h"
11 NSString * const HBFiltersChangedNotification = @"HBFiltersChangedNotification";
13 @interface HBFilters ()
15 @property (nonatomic, readwrite, getter=areNotificationsEnabled) BOOL notificationsEnabled;
19 @implementation HBFilters
27 _detelecineCustomString = @"";
28 _deinterlace = @"off";
29 _deinterlaceCustomString = @"";
31 _decombCustomString = @"";
33 _denoiseCustomString = @"";
34 _denoisePreset = @"medium";
35 _denoiseTune = @"none";
37 _notificationsEnabled = YES;
42 - (void)postChangedNotification
44 if (self.areNotificationsEnabled)
46 [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName:HBFiltersChangedNotification
52 #pragma mark - Setters
54 - (void)setDetelecine:(NSString *)detelecine
58 _detelecine = [detelecine copy];
64 [self postChangedNotification];
67 // Override setter to avoid nil values.
68 - (void)setDetelecineCustomString:(NSString *)detelecineCustomString
70 if (detelecineCustomString)
72 _detelecineCustomString = [detelecineCustomString copy];
76 _detelecineCustomString = @"";
79 [self postChangedNotification];
82 - (void)setDeinterlace:(NSString *)deinterlace
86 _deinterlace = [deinterlace copy];
90 _deinterlace = @"off";
92 [self postChangedNotification];
95 - (void)setDeinterlaceCustomString:(NSString *)deinterlaceCustomString
97 if (deinterlaceCustomString)
99 _deinterlaceCustomString = [deinterlaceCustomString copy];
103 _deinterlaceCustomString = @"";
106 [self postChangedNotification];
109 - (void)setDecomb:(NSString *)decomb
113 _decomb = [decomb copy];
119 [self postChangedNotification];
122 - (void)setDecombCustomString:(NSString *)decombCustomString
124 if (decombCustomString)
126 _decombCustomString = [decombCustomString copy];
130 _decombCustomString = @"";
133 [self postChangedNotification];
136 - (void)setDenoise:(NSString *)denoise
140 _denoise = [denoise copy];
147 [self postChangedNotification];
150 - (void)setDenoisePreset:(NSString *)denoisePreset
154 _denoisePreset = [denoisePreset copy];
158 _denoisePreset = @"medium";
161 [self postChangedNotification];
164 - (void)setDenoiseTune:(NSString *)denoiseTune
168 _denoiseTune = [denoiseTune copy];
172 _denoiseTune = @"none";
175 [self postChangedNotification];
178 - (void)setDenoiseCustomString:(NSString *)denoiseCustomString
180 if (denoiseCustomString)
182 _denoiseCustomString = [denoiseCustomString copy];
186 _denoiseCustomString = @"";
189 [self postChangedNotification];
192 - (void)setDeblock:(int)deblock
195 [self postChangedNotification];
198 - (void)setGrayscale:(BOOL)grayscale
200 _grayscale = grayscale;
201 [self postChangedNotification];
204 - (void)setUseDecomb:(BOOL)useDecomb
206 _useDecomb = useDecomb;
207 [self postChangedNotification];
210 + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
214 if ([key isEqualToString:@"summary"])
216 retval = [NSSet setWithObjects:@"detelecine", @"detelecineCustomString", @"useDecomb", @"deinterlace", @"deinterlaceCustomString", @"decomb", @"decombCustomString", @"denoise", @"denoisePreset", @"denoiseTune", @"denoiseCustomString", @"deblock", @"grayscale", nil];
218 if ([key isEqualToString:@"customDetelecineSelected"] ||
219 [key isEqualToString:@"customDecombSelected"] ||
220 [key isEqualToString:@"customDeinterlaceSelected"])
222 retval = [NSSet setWithObjects:@"detelecine", @"decomb", @"deinterlace", @"useDecomb", nil];
224 if ([key isEqualToString:@"denoiseTunesAvailable"] ||
225 [key isEqualToString:@"customDenoiseSelected"])
227 retval = [NSSet setWithObjects:@"denoise", @"denoisePreset", nil];
229 if ([key isEqualToString:@"denoiseEnabled"])
231 retval = [NSSet setWithObject:@"denoise"];
233 if ([key isEqualToString:@"deblockSummary"])
235 retval = [NSSet setWithObject:@"deblock"];
241 #pragma mark - NSCopying
243 - (instancetype)copyWithZone:(NSZone *)zone
245 HBFilters *copy = [[[self class] alloc] init];
249 copy->_detelecine = [_detelecine copy];
250 copy->_detelecineCustomString = [_detelecineCustomString copy];
252 copy->_deinterlace = [_deinterlace copy];
253 copy->_deinterlaceCustomString = [_deinterlaceCustomString copy];
255 copy->_decomb = [_decomb copy];
256 copy->_decombCustomString = [_decombCustomString copy];
258 copy->_denoise = [_denoise copy];
259 copy->_denoisePreset = [_denoisePreset copy];
260 copy->_denoiseTune = [_denoiseTune copy];
261 copy->_denoiseCustomString = [_denoiseCustomString copy];
263 copy->_deblock = _deblock;
264 copy->_grayscale = _grayscale;
266 copy->_useDecomb = _useDecomb;
272 #pragma mark - NSCoding
274 + (BOOL)supportsSecureCoding
279 - (void)encodeWithCoder:(NSCoder *)coder
281 [coder encodeInt:1 forKey:@"HBFiltersVersion"];
283 encodeObject(_detelecine);
284 encodeObject(_detelecineCustomString);
286 encodeObject(_deinterlace);
287 encodeObject(_deinterlaceCustomString);
289 encodeObject(_decomb);
290 encodeObject(_decombCustomString);
292 encodeObject(_denoise);
293 encodeObject(_denoisePreset);
294 encodeObject(_denoiseTune);
295 encodeObject(_denoiseCustomString);
298 encodeBool(_grayscale);
300 encodeBool(_useDecomb);
303 - (instancetype)initWithCoder:(NSCoder *)decoder
307 decodeObject(_detelecine, NSString);
308 decodeObject(_detelecineCustomString, NSString);
310 decodeObject(_deinterlace, NSString);
311 decodeObject(_deinterlaceCustomString, NSString);
313 decodeObject(_decomb, NSString);
314 decodeObject(_decombCustomString, NSString);
316 decodeObject(_denoise, NSString);
317 decodeObject(_denoisePreset, NSString);
318 decodeObject(_denoiseTune, NSString);
319 decodeObject(_denoiseCustomString, NSString);
322 decodeBool(_grayscale);
324 decodeBool(_useDecomb);
326 _notificationsEnabled = YES;
331 #pragma mark - Presets and queue
333 - (void)writeToPreset:(NSMutableDictionary *)preset
335 preset[@"PictureDecombDeinterlace"] = @(self.useDecomb);
337 preset[@"PictureDeinterlace"] = self.deinterlace;
338 preset[@"PictureDeinterlaceCustom"] = self.deinterlaceCustomString;
340 preset[@"PictureDecomb"] = self.decomb;
341 preset[@"PictureDecombCustom"] = self.decombCustomString;
343 preset[@"PictureDetelecine"] = self.detelecine;
344 preset[@"PictureDetelecineCustom"] = self.detelecineCustomString;
346 preset[@"PictureDenoiseFilter"] = self.denoise;
347 preset[@"PictureDenoisePreset"] = self.denoisePreset;
348 preset[@"PictureDenoiseTune"] = self.denoiseTune;
349 preset[@"PictureDenoiseCustom"] = self.denoiseCustomString;
351 preset[@"PictureDeblock"] = @(self.deblock);
352 preset[@"VideoGrayScale"] = @(self.grayscale);
355 - (void)applyPreset:(NSDictionary *)preset
357 self.notificationsEnabled = NO;
359 // If the preset has an objectForKey:@"UsesPictureFilters", and handle the filters here
360 if ([preset[@"UsesPictureFilters"] boolValue])
362 // We only allow *either* Decomb or Deinterlace. So check for the PictureDecombDeinterlace key.
363 self.useDecomb = [preset[@"PictureDecombDeinterlace"] boolValue];
365 self.decomb = preset[@"PictureDecomb"];
366 self.decombCustomString = preset[@"PictureDecombCustom"];
368 self.deinterlace = preset[@"PictureDeinterlace"];
369 self.deinterlaceCustomString = preset[@"PictureDeinterlaceCustom"];
372 self.detelecine = preset[@"PictureDetelecine"];
373 self.detelecineCustomString = preset[@"PictureDetelecineCustom"];
376 self.denoise = preset[@"PictureDenoiseFilter"];
377 self.denoisePreset = preset[@"PictureDenoisePreset"];
378 self.denoiseTune = preset[@"PictureDenoiseTune"];
380 self.denoiseCustomString = preset[@"PictureDenoiseCustom"];
383 if ([preset[@"PictureDeblock"] intValue] == 1)
385 // if its a one, then its the old on/off deblock, set on to 5
390 // use the settings intValue
391 self.deblock = [preset[@"PictureDeblock"] intValue];
394 self.grayscale = [preset[@"VideoGrayScale"] boolValue];
397 self.notificationsEnabled = YES;