]> granicus.if.org Git - handbrake/commitdiff
MacGui: added support for NLMeans denoise. Added the HBFilters class to store the...
authorritsuka <damiog@gmail.com>
Tue, 19 Aug 2014 16:38:33 +0000 (16:38 +0000)
committerritsuka <damiog@gmail.com>
Tue, 19 Aug 2014 16:38:33 +0000 (16:38 +0000)
Removed the filter tab animations for now, they will be added back later.

git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6319 b64f7644-9d1e-0410-96f1-a4d463321fa5

17 files changed:
macosx/Controller.h
macosx/Controller.m
macosx/English.lproj/PictureSettings.xib
macosx/HBCore.m
macosx/HBFilters.h [new file with mode: 0644]
macosx/HBFilters.m [new file with mode: 0644]
macosx/HBHUDButtonCell.h [new file with mode: 0644]
macosx/HBHUDButtonCell.m [new file with mode: 0644]
macosx/HBJob.h [new file with mode: 0644]
macosx/HBJob.m [new file with mode: 0644]
macosx/HBPicture.h [new file with mode: 0644]
macosx/HBPicture.m [new file with mode: 0644]
macosx/HBVideo.h [new file with mode: 0644]
macosx/HBVideo.m [new file with mode: 0644]
macosx/HandBrake.xcodeproj/project.pbxproj
macosx/PictureController.h
macosx/PictureController.m

index 14e4ac4abb9bb1043c10cf9b5f038f52653d9a64..9ae122d21d229a0ed6cab963a598cb1fd403945a 100644 (file)
@@ -236,7 +236,6 @@ extern NSString *keyTitleTag;
 
 /* Text summaries of various settings */
 - (NSString*) pictureSettingsSummary;
-- (NSString*) pictureFiltersSummary;
 - (NSString*) muxerOptionsSummary;
 
 /* Add All titles to the queue */
index efbf6e8636f6a8ca175dafff212144a105cf242c..72cd0055cb7468194858af8ee947cac36a91ab36 100644 (file)
@@ -2511,7 +2511,7 @@ fWorkingCount = 0;
     /* Text summaries of various settings */
     [queueFileJob setObject:[NSString stringWithString:[self pictureSettingsSummary]]
                      forKey:@"PictureSettingsSummary"];
-    [queueFileJob setObject:[NSString stringWithString:[self pictureFiltersSummary]]
+    [queueFileJob setObject:fPictureController.filters.summary
                      forKey:@"PictureFiltersSummary"];
     [queueFileJob setObject:[NSString stringWithString:[self muxerOptionsSummary]]
                      forKey:@"MuxerOptionsSummary"];
@@ -2522,25 +2522,27 @@ fWorkingCount = 0;
     [queueFileJob setObject:[NSNumber numberWithInt:job->crop[1]] forKey:@"PictureBottomCrop"];
        [queueFileJob setObject:[NSNumber numberWithInt:job->crop[2]] forKey:@"PictureLeftCrop"];
        [queueFileJob setObject:[NSNumber numberWithInt:job->crop[3]] forKey:@"PictureRightCrop"];
-    
+
     /* Picture Filters */
-    [queueFileJob setObject:[NSNumber numberWithInteger:[fPictureController detelecine]] forKey:@"PictureDetelecine"];
-    [queueFileJob setObject:[fPictureController detelecineCustomString] forKey:@"PictureDetelecineCustom"];
-    
-    [queueFileJob setObject:[NSNumber numberWithInteger:[fPictureController useDecomb]] forKey:@"PictureDecombDeinterlace"];
-    [queueFileJob setObject:[NSNumber numberWithInteger:[fPictureController decomb]] forKey:@"PictureDecomb"];
-    [queueFileJob setObject:[fPictureController decombCustomString] forKey:@"PictureDecombCustom"];
-    
-    [queueFileJob setObject:[NSNumber numberWithInteger:[fPictureController deinterlace]] forKey:@"PictureDeinterlace"];
-    [queueFileJob setObject:[fPictureController deinterlaceCustomString] forKey:@"PictureDeinterlaceCustom"];
-    
-    [queueFileJob setObject:[NSNumber numberWithInteger:[fPictureController denoise]] forKey:@"PictureDenoise"];
-    [queueFileJob setObject:[fPictureController denoiseCustomString] forKey:@"PictureDenoiseCustom"];
-    
-    [queueFileJob setObject:[NSString stringWithFormat:@"%ld",(long)[fPictureController deblock]] forKey:@"PictureDeblock"];
-    
-    [queueFileJob setObject:[NSNumber numberWithInteger:[fPictureController grayscale]] forKey:@"VideoGrayScale"];
-    
+    HBFilters *filters = fPictureController.filters;
+    queueFileJob[@"PictureDetelecine"] = @(filters.detelecine);
+    queueFileJob[@"PictureDetelecineCustom"] = filters.detelecineCustomString;
+
+    queueFileJob[@"PictureDecombDeinterlace"] = @(filters.useDecomb);
+    queueFileJob[@"PictureDecomb"] = @(filters.decomb);
+    queueFileJob[@"PictureDecombCustom"] = filters.decombCustomString;
+
+    queueFileJob[@"PictureDeinterlace"] = @(filters.deinterlace);
+    queueFileJob[@"PictureDeinterlaceCustom"] = filters.deinterlaceCustomString;
+
+    queueFileJob[@"PictureDenoise"] = filters.denoise;
+    queueFileJob[@"PictureDenoisePreset"] = filters.denoisePreset;
+    queueFileJob[@"PictureDenoiseTune"] = filters.denoiseTune;
+    queueFileJob[@"PictureDenoiseCustom"] = filters.denoiseCustomString;
+
+    queueFileJob[@"PictureDeblock"] = [NSString stringWithFormat:@"%ld",(long)filters.deblock];
+    queueFileJob[@"VideoGrayScale"] = [NSString stringWithFormat:@"%ld",(long)filters.grayscale];
+
     /* Auto Passthru */
     [queueFileJob setObject:@(fAudioController.settings.allowAACPassthru) forKey: @"AudioAllowAACPass"];
     [queueFileJob setObject:@(fAudioController.settings.allowAC3Passthru) forKey: @"AudioAllowAC3Pass"];
@@ -2893,23 +2895,25 @@ fWorkingCount = 0;
     job->height  = [[queueToApply objectForKey:@"PictureHeight"]  intValue];
 
     /* Filters */
-    
+
+    HBFilters *filters = [fPictureController filters];
+
     /* We only allow *either* Decomb or Deinterlace. So check for the PictureDecombDeinterlace key. */
-    [fPictureController setUseDecomb:1];
-    [fPictureController setDecomb:0];
-    [fPictureController setDeinterlace:0];
-    if ([[queueToApply objectForKey:@"PictureDecombDeinterlace"] intValue] == 1)
+    filters.useDecomb = YES;
+    filters.decomb = 0;
+    filters.deinterlace = 0;
+    if ([queueToApply[@"PictureDecombDeinterlace"] intValue] == 1)
     {
         /* we are using decomb */
         /* Decomb */
-        if ([[queueToApply objectForKey:@"PictureDecomb"] intValue] > 0)
+        if ([queueToApply[@"PictureDecomb"] intValue] > 0)
         {
-            [fPictureController setDecomb:[[queueToApply objectForKey:@"PictureDecomb"] intValue]];
-            
+            filters.decomb = [queueToApply[@"PictureDecomb"] intValue];
+
             /* if we are using "Custom" in the decomb setting, also set the custom string*/
-            if ([[queueToApply objectForKey:@"PictureDecomb"] intValue] == 1)
+            if ([queueToApply[@"PictureDecomb"] intValue] == 1)
             {
-                [fPictureController setDecombCustomString:[queueToApply objectForKey:@"PictureDecombCustom"]];    
+                filters.decombCustomString = queueToApply[@"PictureDecombCustom"];
             }
         }
     }
@@ -2917,70 +2921,53 @@ fWorkingCount = 0;
     {
         /* We are using Deinterlace */
         /* Deinterlace */
-        if ([[queueToApply objectForKey:@"PictureDeinterlace"] intValue] > 0)
+        if ([queueToApply[@"PictureDeinterlace"] intValue] > 0)
         {
-            [fPictureController setUseDecomb:0];
-            [fPictureController setDeinterlace:[[queueToApply objectForKey:@"PictureDeinterlace"] intValue]];
+            filters.useDecomb = NO;
+            filters.deinterlace = [queueToApply[@"PictureDeinterlace"] intValue];
             /* if we are using "Custom" in the deinterlace setting, also set the custom string*/
-            if ([[queueToApply objectForKey:@"PictureDeinterlace"] intValue] == 1)
+            if ([queueToApply[@"PictureDeinterlace"] intValue] == 1)
             {
-                [fPictureController setDeinterlaceCustomString:[queueToApply objectForKey:@"PictureDeinterlaceCustom"]];    
+                filters.deinterlaceCustomString = queueToApply[@"PictureDeinterlaceCustom"];
             }
         }
     }
-    
-    
+
     /* Detelecine */
-    if ([[queueToApply objectForKey:@"PictureDetelecine"] intValue] > 0)
+    if ([queueToApply[@"PictureDetelecine"] intValue] > 0)
     {
-        [fPictureController setDetelecine:[[queueToApply objectForKey:@"PictureDetelecine"] intValue]];
+        filters.detelecine = [queueToApply[@"PictureDetelecine"] intValue];
         /* if we are using "Custom" in the detelecine setting, also set the custom string*/
-        if ([[queueToApply objectForKey:@"PictureDetelecine"] intValue] == 1)
+        if ([queueToApply[@"PictureDetelecine"] intValue] == 1)
         {
-            [fPictureController setDetelecineCustomString:[queueToApply objectForKey:@"PictureDetelecineCustom"]];    
+            filters.detelecineCustomString = queueToApply[@"PictureDetelecineCustom"];
         }
     }
     else
     {
-        [fPictureController setDetelecine:0];
+        filters.detelecine = 0;
     }
-    
+
     /* Denoise */
-    if ([[queueToApply objectForKey:@"PictureDenoise"] intValue] > 0)
-    {
-        [fPictureController setDenoise:[[queueToApply objectForKey:@"PictureDenoise"] intValue]];
-        /* if we are using "Custom" in the denoise setting, also set the custom string*/
-        if ([[queueToApply objectForKey:@"PictureDenoise"] intValue] == 1)
-        {
-            [fPictureController setDenoiseCustomString:[queueToApply objectForKey:@"PictureDenoiseCustom"]];    
-        }
-    }
-    else
-    {
-        [fPictureController setDenoise:0];
-    }   
-    
+    filters.denoise             = queueToApply[@"PictureDenoise"];
+    filters.denoisePreset       = queueToApply[@"PictureDenoisePreset"];
+    filters.denoiseTune         = queueToApply[@"PictureDenoiseTune"];
+    filters.denoiseCustomString = queueToApply[@"PictureDenoiseCustom"];
+
     /* Deblock */
-    if ([[queueToApply objectForKey:@"PictureDeblock"] intValue] == 1)
+    if ([queueToApply[@"PictureDeblock"] intValue] == 1)
     {
         /* if its a one, then its the old on/off deblock, set on to 5*/
-        [fPictureController setDeblock:5];
+        filters.deblock = 5;
     }
     else
     {
         /* use the settings intValue */
-        [fPictureController setDeblock:[[queueToApply objectForKey:@"PictureDeblock"] intValue]];
-    }
-    
-    if ([[queueToApply objectForKey:@"VideoGrayScale"] intValue] == 1)
-    {
-        [fPictureController setGrayscale:1];
-    }
-    else
-    {
-        [fPictureController setGrayscale:0];
+        filters.deblock = [queueToApply[@"PictureDeblock"] intValue];
     }
-    
+
+    filters.grayscale = [queueToApply[@"VideoGrayScale"] boolValue];
+
     /* we call SetTitle: in fPictureController so we get an instant update in the Picture Settings window */
     [fPictureController setTitle:fTitle];
     [self pictureSettingsDidChange];
@@ -3019,7 +3006,6 @@ fWorkingCount = 0;
     hb_title_t * title = (hb_title_t *) hb_list_item( list,
             (int)[fSrcTitlePopUp indexOfSelectedItem] );
     hb_job_t * job = title->job;
-    hb_filter_object_t * filter;
     /* set job->angle for libdvdnav */
     job->angle = (int)[fSrcAnglePopUp indexOfSelectedItem] + 1;
     /* Chapter selection */
@@ -3128,7 +3114,7 @@ fWorkingCount = 0;
     }
     if( one_burned )
     {
-        filter = hb_filter_init( HB_FILTER_RENDER_SUB );
+        hb_filter_object_t *filter = hb_filter_init( HB_FILTER_RENDER_SUB );
         hb_add_filter( job, filter, [[NSString stringWithFormat:@"%d:%d:%d:%d",
                                       job->crop[0], job->crop[1],
                                       job->crop[2], job->crop[3]] UTF8String] );
@@ -3194,7 +3180,7 @@ fWorkingCount = 0;
      * we put it here since its in the filters panel
      */
      
-    if ([fPictureController grayscale])
+    if ([fPictureController.filters grayscale])
     {
         job->grayscale = 1;
     }
@@ -3209,122 +3195,123 @@ fWorkingCount = 0;
     
 
        /* Detelecine */
-    filter = hb_filter_init( HB_FILTER_DETELECINE );
-    if ([fPictureController detelecine] == 1)
+    HBFilters *filters = [fPictureController filters];
+    if (filters.detelecine == 1)
     {
+        hb_filter_object_t *filter = hb_filter_init(HB_FILTER_DETELECINE);
         /* use a custom detelecine string */
-        hb_add_filter( job, filter, [[fPictureController detelecineCustomString] UTF8String] );
+        hb_add_filter(job, filter, [filters.detelecineCustomString UTF8String]);
     }
-    else if ([fPictureController detelecine] == 2)
+    else if (filters.detelecine == 2)
     {
         /* Default */
-        hb_add_filter( job, filter, NULL );
+        hb_filter_object_t *filter = hb_filter_init(HB_FILTER_DETELECINE);
+        hb_add_filter(job, filter, NULL);
     }
-    
-    
-    
-    if ([fPictureController useDecomb] == 1)
+    if (filters.useDecomb == YES)
     {
         /* Decomb */
-        filter = hb_filter_init( HB_FILTER_DECOMB );
-        if ([fPictureController decomb] == 1)
+        hb_filter_object_t *filter = hb_filter_init(HB_FILTER_DECOMB);
+        if (filters.decomb == 1)
         {
             /* use a custom decomb string */
-            hb_add_filter( job, filter, [[fPictureController decombCustomString] UTF8String] );
+            hb_add_filter(job, filter, [filters.decombCustomString UTF8String]);
         }
-        else if ([fPictureController decomb] == 2)
+        else if (filters.decomb == 2)
         {
             /* use libhb defaults */
-            hb_add_filter( job, filter, NULL );
+            hb_add_filter(job, filter, NULL);
         }
-        else if ([fPictureController decomb] == 3)
+        else if (filters.decomb == 3)
         {
             /* use old defaults (decomb fast) */
-            hb_add_filter( job, filter, "7:2:6:9:1:80" );
+            hb_add_filter(job, filter, "7:2:6:9:1:80");
         }
-        else if ([fPictureController decomb] == 4)
+        else if (filters.decomb == 4)
         {
             /* decomb 3 with bobbing enabled */
-            hb_add_filter( job, filter, "455" );
+            hb_add_filter(job, filter, "455");
         }
     }
     else
     {
         /* Deinterlace */
-        filter = hb_filter_init( HB_FILTER_DEINTERLACE );
-        if ([fPictureController deinterlace] == 1)
+        hb_filter_object_t *filter = hb_filter_init(HB_FILTER_DEINTERLACE);
+        if (filters.deinterlace == 1)
         {
             /* we add the custom string if present */
-            hb_add_filter( job, filter, [[fPictureController deinterlaceCustomString] UTF8String] );            
+            hb_add_filter(job, filter, [filters.deinterlaceCustomString UTF8String]);
         }
-        else if ([fPictureController deinterlace] == 2)
+        else if (filters.deinterlace == 2)
         {
             /* Run old deinterlacer fd by default */
-            hb_add_filter( job, filter, "0" );
+            hb_add_filter(job, filter, "0");
         }
-        else if ([fPictureController deinterlace] == 3)
+        else if (filters.deinterlace == 3)
         {
             /* Yadif mode 0 (without spatial deinterlacing) */
-            hb_add_filter( job, filter, "1" );            
+            hb_add_filter(job, filter, "1");
         }
-        else if ([fPictureController deinterlace] == 4)
+        else if (filters.deinterlace == 4)
         {
             /* Yadif (with spatial deinterlacing) */
-            hb_add_filter( job, filter, "3" );
+            hb_add_filter(job, filter, "3");
         }
-        else if ([fPictureController deinterlace] == 5)
+        else if (filters.deinterlace == 5)
         {
             /* Yadif (with spatial deinterlacing and bobbing) */
-            hb_add_filter( job, filter, "15" );
+            hb_add_filter(job, filter, "15");
         }
        }
-    
+
     /* Denoise */
-    filter = hb_filter_init( HB_FILTER_DENOISE );
-       if ([fPictureController denoise] == 1) // custom in popup
-       {
-               /* we add the custom string if present */
-        hb_add_filter( job, filter, [[fPictureController denoiseCustomString] UTF8String] );
-       }
-    else if ([fPictureController denoise] == 2) // Weak in popup
-       {
-        hb_add_filter( job, filter, "2:1:1:2:3:3" );
-       }
-       else if ([fPictureController denoise] == 3) // Medium in popup
-       {
-        hb_add_filter( job, filter, "3:2:2:2:3:3" );
-       }
-       else if ([fPictureController denoise] == 4) // Strong in popup
-       {
-        hb_add_filter( job, filter, "7:7:7:5:5:5" );
-       }
-    
-    
+    if (filters.denoise)
+    {
+        int filter_id = HB_FILTER_HQDN3D;
+        if ([filters.denoise isEqualToString:@"nlmeans"])
+            filter_id = HB_FILTER_NLMEANS;
+
+        if ([filters.denoisePreset isEqualToString:@"custom"])
+        {
+            const char *filter_str;
+            filter_str = [filters.denoiseCustomString UTF8String];
+            hb_filter_object_t *filter = hb_filter_init(filter_id);
+            hb_add_filter(job, filter, filter_str);
+        }
+        else
+        {
+            const char *filter_str, *preset, *tune;
+            preset = [filters.denoisePreset UTF8String];
+            tune = [filters.denoiseTune UTF8String];
+            filter_str = hb_generate_filter_settings(filter_id, preset, tune);
+            hb_filter_object_t *filter = hb_filter_init(filter_id);
+            hb_add_filter(job, filter, filter_str);
+        }
+    }
+
     /* Deblock  (uses pp7 default) */
     /* NOTE: even though there is a valid deblock setting of 0 for the filter, for 
      * the macgui's purposes a value of 0 actually means to not even use the filter
      * current hb_filter_deblock.settings valid ranges are from 5 - 15 
      */
-    filter = hb_filter_init( HB_FILTER_DEBLOCK );
-    if ([fPictureController deblock] != 0)
+    if (filters.deblock != 0)
     {
-        NSString *deblockStringValue = [NSString stringWithFormat: @"%ld",(long)[fPictureController deblock]];
+        hb_filter_object_t *filter = hb_filter_init( HB_FILTER_DEBLOCK );
+        NSString *deblockStringValue = [NSString stringWithFormat: @"%ld",(long)filters.deblock];
         hb_add_filter( job, filter, [deblockStringValue UTF8String] );
     }
 
     /* Add Crop/Scale filter */
-    filter = hb_filter_init( HB_FILTER_CROP_SCALE );
+    hb_filter_object_t *filter = hb_filter_init( HB_FILTER_CROP_SCALE );
     hb_add_filter( job, filter, [[NSString stringWithFormat:@"%d:%d:%d:%d:%d:%d",
                                   job->width,job->height,
                                   job->crop[0], job->crop[1],
                                   job->crop[2], job->crop[3]] UTF8String] );
 }
 
-
 #pragma mark -
 #pragma mark Job Handling
 
-
 - (void) prepareJob
 {
     
@@ -3784,26 +3771,30 @@ fWorkingCount = 0;
         }
     }
     /* Denoise */
-    filter = hb_filter_init( HB_FILTER_DENOISE );
-       if ([[queueToApply objectForKey:@"PictureDenoise"] intValue] == 1) // Custom in popup
-       {
-               /* we add the custom string if present */
-        hb_add_filter( job, filter, [[queueToApply objectForKey:@"PictureDenoiseCustom"] UTF8String] );        
-       }
-    else if ([[queueToApply objectForKey:@"PictureDenoise"] intValue] == 2) // Weak in popup
-       {
-        hb_add_filter( job, filter, "2:1:1:2:3:3" );   
-       }
-       else if ([[queueToApply objectForKey:@"PictureDenoise"] intValue] == 3) // Medium in popup
-       {
-        hb_add_filter( job, filter, "3:2:2:2:3:3" );   
-       }
-       else if ([[queueToApply objectForKey:@"PictureDenoise"] intValue] == 4) // Strong in popup
-       {
-        hb_add_filter( job, filter, "7:7:7:5:5:5" );   
-       }
-    
-    
+    if (![queueToApply[@"PictureDenoise"] isEqualToString:@"off"])
+    {
+        int filter_id = HB_FILTER_HQDN3D;
+        if ([queueToApply[@"PictureDenoise"] isEqualToString:@"nlmeans"])
+            filter_id = HB_FILTER_NLMEANS;
+
+        if ([queueToApply[@"PictureDenoisePreset"] isEqualToString:@"custom"])
+        {
+            const char *filter_str;
+            filter_str = [queueToApply[@"PictureDenoiseCustom"] UTF8String];
+            filter = hb_filter_init(filter_id);
+            hb_add_filter(job, filter, filter_str);
+        }
+        else
+        {
+            const char *filter_str, *preset, *tune;
+            preset = [queueToApply[@"PictureDenoisePreset"] UTF8String];
+            tune = [queueToApply[@"PictureDenoiseTune"] UTF8String];
+            filter_str = hb_generate_filter_settings(filter_id, preset, tune);
+            filter = hb_filter_init(filter_id);
+            hb_add_filter(job, filter, filter_str);
+        }
+    }
+
     /* Deblock  (uses pp7 default) */
     /* NOTE: even though there is a valid deblock setting of 0 for the filter, for 
      * the macgui's purposes a value of 0 actually means to not even use the filter
@@ -4610,7 +4601,7 @@ the user is using "Custom" settings by determining the sender*/
 {
     // align picture settings and video filters in the UI using tabs
     fVideoController.pictureSettingsField = [self pictureSettingsSummary];
-    fVideoController.pictureFiltersField = [self pictureFiltersSummary];
+    fVideoController.pictureFiltersField = fPictureController.filters.summary;
 
     /* Store storage resolution for unparse */
     if (fTitle)
@@ -4644,128 +4635,6 @@ the user is using "Custom" settings by determining the sender*/
     return [NSString stringWithString:summary];
 }
 
-- (NSString*) pictureFiltersSummary
-{
-    NSMutableString *summary = [NSMutableString stringWithString:@""];
-    if (fPictureController)
-    {
-        /* Detelecine */
-        switch ([fPictureController detelecine])
-        {
-            case 1:
-                [summary appendFormat:@" - Detelecine (%@)",
-                 [fPictureController detelecineCustomString]];
-                break;
-                
-            case 2:
-                [summary appendString:@" - Detelecine (Default)"];
-                break;
-                
-            default:
-                break;
-        }
-        
-        if ([fPictureController useDecomb] == 1)
-        {
-            /* Decomb */
-            switch ([fPictureController decomb])
-            {
-                case 1:
-                    [summary appendFormat:@" - Decomb (%@)",
-                     [fPictureController decombCustomString]];
-                    break;
-                    
-                case 2:
-                    [summary appendString:@" - Decomb (Default)"];
-                    break;
-                    
-                case 3:
-                    [summary appendString:@" - Decomb (Fast)"];
-                    break;
-                    
-                case 4:
-                    [summary appendString:@" - Decomb (Bob)"];
-                    break;
-                    
-                default:
-                    break;
-            }
-        }
-        else
-        {
-            /* Deinterlace */
-            switch ([fPictureController deinterlace])
-            {
-                case 1:
-                    [summary appendFormat:@" - Deinterlace (%@)",
-                     [fPictureController deinterlaceCustomString]];
-                    break;
-                    
-                case 2:
-                    [summary appendString:@" - Deinterlace (Fast)"];
-                    break;
-                    
-                case 3:
-                    [summary appendString:@" - Deinterlace (Slow)"];
-                    break;
-                    
-                case 4:
-                    [summary appendString:@" - Deinterlace (Slower)"];
-                    break;
-                    
-                case 5:
-                    [summary appendString:@" - Deinterlace (Bob)"];
-                    break;
-                    
-                default:
-                    break;
-            }
-        }
-        
-        /* Deblock */
-        if ([fPictureController deblock] > 0)
-        {
-            [summary appendFormat:@" - Deblock (%ld)",
-             (long)[fPictureController deblock]];
-        }
-        
-        /* Denoise */
-        switch ([fPictureController denoise])
-        {
-            case 1:
-                [summary appendFormat:@" - Denoise (%@)",
-                 [fPictureController denoiseCustomString]];
-                break;
-                
-            case 2:
-                [summary appendString:@" - Denoise (Weak)"];
-                break;
-                
-            case 3:
-                [summary appendString:@" - Denoise (Medium)"];
-                break;
-                
-            case 4:
-                [summary appendString:@" - Denoise (Strong)"];
-                break;
-                
-            default:
-                break;
-        }
-        
-        /* Grayscale */
-        if ([fPictureController grayscale]) 
-        {
-            [summary appendString:@" - Grayscale"];
-        }
-    }
-    if ([summary hasPrefix:@" - "])
-    {
-        [summary deleteCharactersInRange:NSMakeRange(0, 3)];
-    }
-    return [NSString stringWithString:summary];
-}
-
 - (NSString*) muxerOptionsSummary
 {
     NSMutableString *summary = [NSMutableString stringWithString:@""];
@@ -5038,98 +4907,7 @@ the user is using "Custom" settings by determining the sender*/
         job->anamorphic.par_width = par_width;
         job->anamorphic.par_height = par_height;
 
-        /* If the preset has an objectForKey:@"UsesPictureFilters", and handle the filters here */
-        if ([chosenPreset objectForKey:@"UsesPictureFilters"] && [[chosenPreset objectForKey:@"UsesPictureFilters"]  intValue] > 0)
-        {
-            /* Filters */
-            
-            /* We only allow *either* Decomb or Deinterlace. So check for the PictureDecombDeinterlace key. */
-            [fPictureController setUseDecomb:1];
-            [fPictureController setDecomb:0];
-            [fPictureController setDeinterlace:0];
-            if ([[chosenPreset objectForKey:@"PictureDecombDeinterlace"] intValue] == 1)
-            {
-                /* we are using decomb */
-                /* Decomb */
-                if ([[chosenPreset objectForKey:@"PictureDecomb"] intValue] > 0)
-                {
-                    [fPictureController setDecomb:[[chosenPreset objectForKey:@"PictureDecomb"] intValue]];
-                    
-                    /* if we are using "Custom" in the decomb setting, also set the custom string*/
-                    if ([[chosenPreset objectForKey:@"PictureDecomb"] intValue] == 1)
-                    {
-                        [fPictureController setDecombCustomString:[chosenPreset objectForKey:@"PictureDecombCustom"]];    
-                    }
-                }
-             }
-            else
-            {
-                /* We are using Deinterlace */
-                /* Deinterlace */
-                if ([[chosenPreset objectForKey:@"PictureDeinterlace"] intValue] > 0)
-                {
-                    [fPictureController setUseDecomb:0];
-                    [fPictureController setDeinterlace:[[chosenPreset objectForKey:@"PictureDeinterlace"] intValue]];
-                    /* if we are using "Custom" in the deinterlace setting, also set the custom string*/
-                    if ([[chosenPreset objectForKey:@"PictureDeinterlace"] intValue] == 1)
-                    {
-                        [fPictureController setDeinterlaceCustomString:[chosenPreset objectForKey:@"PictureDeinterlaceCustom"]];    
-                    }
-                }
-            }
-            
-            
-            /* Detelecine */
-            if ([[chosenPreset objectForKey:@"PictureDetelecine"] intValue] > 0)
-            {
-                [fPictureController setDetelecine:[[chosenPreset objectForKey:@"PictureDetelecine"] intValue]];
-                /* if we are using "Custom" in the detelecine setting, also set the custom string*/
-                if ([[chosenPreset objectForKey:@"PictureDetelecine"] intValue] == 1)
-                {
-                    [fPictureController setDetelecineCustomString:[chosenPreset objectForKey:@"PictureDetelecineCustom"]];    
-                }
-            }
-            else
-            {
-                [fPictureController setDetelecine:0];
-            }
-            
-            /* Denoise */
-            if ([[chosenPreset objectForKey:@"PictureDenoise"] intValue] > 0)
-            {
-                [fPictureController setDenoise:[[chosenPreset objectForKey:@"PictureDenoise"] intValue]];
-                /* if we are using "Custom" in the denoise setting, also set the custom string*/
-                if ([[chosenPreset objectForKey:@"PictureDenoise"] intValue] == 1)
-                {
-                    [fPictureController setDenoiseCustomString:[chosenPreset objectForKey:@"PictureDenoiseCustom"]];    
-                }
-            }
-            else
-            {
-                [fPictureController setDenoise:0];
-            }   
-            
-            /* Deblock */
-            if ([[chosenPreset objectForKey:@"PictureDeblock"] intValue] == 1)
-            {
-                /* if its a one, then its the old on/off deblock, set on to 5*/
-                [fPictureController setDeblock:5];
-            }
-            else
-            {
-                /* use the settings intValue */
-                [fPictureController setDeblock:[[chosenPreset objectForKey:@"PictureDeblock"] intValue]];
-            }
-            
-            if ([[chosenPreset objectForKey:@"VideoGrayScale"] intValue] == 1)
-            {
-                [fPictureController setGrayscale:1];
-            }
-            else
-            {
-                [fPictureController setGrayscale:0];
-            }
-        }
+        [fPictureController.filters applySettingsFromPreset:chosenPreset];
     }
     /* we call SetTitle: in fPictureController so we get an instant update in the Picture Settings window */
     [fPictureController setTitle:fTitle];
@@ -5300,17 +5078,7 @@ the user is using "Custom" settings by determining the sender*/
     [preset setObject:[NSNumber numberWithInt:job->crop[3]] forKey:@"PictureRightCrop"];
     
     /* Picture Filters */
-    [preset setObject:[NSNumber numberWithInteger:[fPictureController useDecomb]] forKey:@"PictureDecombDeinterlace"];
-    [preset setObject:[NSNumber numberWithInteger:[fPictureController deinterlace]] forKey:@"PictureDeinterlace"];
-    [preset setObject:[fPictureController deinterlaceCustomString] forKey:@"PictureDeinterlaceCustom"];
-    [preset setObject:[NSNumber numberWithInteger:[fPictureController detelecine]] forKey:@"PictureDetelecine"];
-    [preset setObject:[fPictureController detelecineCustomString] forKey:@"PictureDetelecineCustom"];
-    [preset setObject:[NSNumber numberWithInteger:[fPictureController denoise]] forKey:@"PictureDenoise"];
-    [preset setObject:[fPictureController denoiseCustomString] forKey:@"PictureDenoiseCustom"];
-    [preset setObject:[NSNumber numberWithInteger:[fPictureController deblock]] forKey:@"PictureDeblock"];
-    [preset setObject:[NSNumber numberWithInteger:[fPictureController decomb]] forKey:@"PictureDecomb"];
-    [preset setObject:[fPictureController decombCustomString] forKey:@"PictureDecombCustom"];
-    [preset setObject:[NSNumber numberWithInteger:[fPictureController grayscale]] forKey:@"VideoGrayScale"];
+    [fPictureController.filters prepareFiltersForPreset:preset];
 
     /* Audio */
     [fAudioController.settings prepareAudioForPreset:preset];
index 691d37b2f688a9f2ef7a05e93ea70e084124dbab..70313f0934fe2cf86efc1408547e61b1a4c28aa5 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13F7" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13F14" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
     <dependencies>
         <deployment version="1060" defaultVersion="1090" identifier="macosx"/>
         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
                 <outlet property="fCropTopStepper" destination="12" id="61"/>
                 <outlet property="fDeblockBox" destination="421" id="434"/>
                 <outlet property="fDeblockField" destination="291" id="372"/>
-                <outlet property="fDeblockSlider" destination="292" id="371"/>
                 <outlet property="fDecombBox" destination="315" id="364"/>
+                <outlet property="fDecombCustomTextField" destination="316" id="VbO-pu-4GQ"/>
                 <outlet property="fDecombDeinterlaceBox" destination="287" id="360"/>
-                <outlet property="fDecombDeinterlaceSlider" destination="313" id="361"/>
-                <outlet property="fDecombPopUp" destination="318" id="362"/>
                 <outlet property="fDeinterlaceBox" destination="314" id="365"/>
-                <outlet property="fDeinterlacePopUp" destination="328" id="366"/>
                 <outlet property="fDenoiseBox" destination="288" id="368"/>
-                <outlet property="fDenoisePopUp" destination="300" id="369"/>
+                <outlet property="fDenoiseCustomField" destination="302" id="OGp-PW-gBH"/>
+                <outlet property="fDenoiseCustomLabel" destination="301" id="gyb-ha-nT2"/>
+                <outlet property="fDenoiseCustomTextField" destination="302" id="ocm-va-TCv"/>
+                <outlet property="fDenoisePreset" destination="ZSz-Vu-qC0" id="ksD-JU-hU9"/>
+                <outlet property="fDenoisePresetPopUp" destination="2F0-KY-tOC" id="qWR-VK-SxC"/>
+                <outlet property="fDenoisePresetPopup" destination="2F0-KY-tOC" id="viA-Tt-qd7"/>
+                <outlet property="fDenoiseTuneLabel" destination="gpP-sp-Lev" id="Q7g-G7-JZZ"/>
+                <outlet property="fDenoiseTunePopUp" destination="Upd-5E-OpR" id="5UN-Gt-l11"/>
                 <outlet property="fDetelecineBox" destination="286" id="356"/>
-                <outlet property="fDetelecinePopUp" destination="345" id="358"/>
                 <outlet property="fDisplayWidthField" destination="396" id="407"/>
                 <outlet property="fDisplayWidthLabel" destination="402" id="526"/>
-                <outlet property="fGrayscaleCheck" destination="293" id="373"/>
                 <outlet property="fHeightField" destination="43" id="66"/>
                 <outlet property="fHeightStepper" destination="46" id="67"/>
                 <outlet property="fModulusLabel" destination="390" id="532"/>
         </customObject>
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
         <customObject id="-3" userLabel="Application"/>
-        <window title="Picture Settings" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="5" userLabel="PicturePanel" customClass="NSPanel">
+        <window title="Picture Settings" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="PictureSizing" animationBehavior="default" id="5" userLabel="PicturePanel" customClass="NSPanel">
             <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" utility="YES" HUD="YES"/>
             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
-            <rect key="contentRect" x="63" y="414" width="635" height="394"/>
+            <rect key="contentRect" x="63" y="414" width="635" height="252"/>
             <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
             <view key="contentView" id="6">
-                <rect key="frame" x="0.0" y="0.0" width="635" height="394"/>
+                <rect key="frame" x="0.0" y="0.0" width="635" height="252"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <userGuides>
                     <userLayoutGuide affinity="minY"/>
-                    <userLayoutGuide location="125" affinity="minX"/>
+                    <userLayoutGuide location="101" affinity="minX"/>
                 </userGuides>
                 <subviews>
                     <textField verticalHuggingPriority="750" id="262">
                         </textFieldCell>
                     </textField>
                     <tabView controlSize="mini" initialItem="282" id="281">
-                        <rect key="frame" x="-12" y="18" width="658" height="358"/>
+                        <rect key="frame" x="-12" y="18" width="658" height="216"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <font key="font" metaFont="miniSystem"/>
                         <tabViewItems>
                             <tabViewItem label="Size" identifier="1" id="282">
                                 <view key="view" id="285">
-                                    <rect key="frame" x="10" y="19" width="638" height="326"/>
+                                    <rect key="frame" x="10" y="19" width="638" height="184"/>
                                     <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                     <subviews>
                                         <box title="Box" borderType="none" titlePosition="noTitle" id="436">
-                                            <rect key="frame" x="14" y="191" width="358" height="126"/>
+                                            <rect key="frame" x="14" y="49" width="358" height="126"/>
                                             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                             <view key="contentView">
                                                 <rect key="frame" x="0.0" y="0.0" width="358" height="126"/>
                                                     <stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" id="44">
                                                         <rect key="frame" x="143" y="103" width="15" height="22"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                                                        <stepperCell key="cell" controlSize="small" continuous="YES" alignment="left" increment="16" minValue="64" maxValue="59" doubleValue="64" id="169">
+                                                        <stepperCell key="cell" controlSize="small" continuous="YES" alignment="left" increment="16" minValue="64" maxValue="59" doubleValue="59" id="169">
                                                             <font key="font" metaFont="smallSystem"/>
                                                         </stepperCell>
                                                         <connections>
                                                     <stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" id="46">
                                                         <rect key="frame" x="143" y="78" width="15" height="22"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-                                                        <stepperCell key="cell" controlSize="small" continuous="YES" alignment="left" increment="16" minValue="64" maxValue="59" doubleValue="59" id="171">
+                                                        <stepperCell key="cell" controlSize="small" continuous="YES" alignment="left" increment="16" minValue="64" maxValue="59" doubleValue="64" id="171">
                                                             <font key="font" metaFont="smallSystem"/>
                                                         </stepperCell>
                                                         <connections>
                                             <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                                         </box>
                                         <box borderType="none" titlePosition="noTitle" id="7">
-                                            <rect key="frame" x="374" y="191" width="254" height="126"/>
+                                            <rect key="frame" x="374" y="49" width="254" height="126"/>
                                             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                             <view key="contentView">
                                                 <rect key="frame" x="0.0" y="0.0" width="254" height="126"/>
                                                         </stepperCell>
                                                     </stepper>
                                                     <matrix verticalHuggingPriority="750" allowsEmptySelection="NO" autosizesCells="NO" id="16">
-                                                        <rect key="frame" x="64" y="97" width="20" height="24"/>
+                                                        <rect key="frame" x="64" y="92" width="81" height="31"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                                                        <size key="cellSize" width="20" height="11"/>
-                                                        <size key="intercellSpacing" width="4" height="2"/>
-                                                        <buttonCell key="prototype" type="radio" title="Radio" imagePosition="left" alignment="left" controlSize="mini" inset="2" id="178">
+                                                        <size key="cellSize" width="81" height="14"/>
+                                                        <size key="intercellSpacing" width="2" height="3"/>
+                                                        <buttonCell key="prototype" type="radio" title="Radio" imagePosition="left" alignment="left" controlSize="mini" inset="2" id="178" customClass="HBHUDButtonCell">
                                                             <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                                             <font key="font" metaFont="miniSystem"/>
                                                         </buttonCell>
                                                         <cells>
                                                             <column>
-                                                                <buttonCell type="radio" title="Automatic" imagePosition="left" alignment="left" controlSize="mini" state="on" inset="2" id="17">
+                                                                <buttonCell type="radio" title="Automatic" imagePosition="left" alignment="left" controlSize="mini" state="on" inset="2" id="17" customClass="HBHUDButtonCell">
                                                                     <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                                                     <font key="font" metaFont="miniSystem"/>
                                                                 </buttonCell>
-                                                                <buttonCell type="radio" title="Custom:" imagePosition="left" alignment="left" controlSize="mini" inset="2" id="18">
+                                                                <buttonCell type="radio" title="Custom:" imagePosition="left" alignment="left" controlSize="mini" inset="2" id="18" customClass="HBHUDButtonCell">
                                                                     <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                                                     <font key="font" metaFont="miniSystem"/>
                                                                 </buttonCell>
                                                             </connections>
                                                         </stepperCell>
                                                     </stepper>
-                                                    <textField verticalHuggingPriority="750" id="250">
-                                                        <rect key="frame" x="80" y="111" width="68" height="11"/>
-                                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                        <textFieldCell key="cell" controlSize="mini" sendsActionOnEndEditing="YES" alignment="left" title="Automatic" id="251">
-                                                            <font key="font" metaFont="miniSystem"/>
-                                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
-                                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                                                        </textFieldCell>
-                                                    </textField>
-                                                    <textField verticalHuggingPriority="750" id="252">
-                                                        <rect key="frame" x="80" y="97" width="68" height="11"/>
-                                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                        <textFieldCell key="cell" controlSize="mini" sendsActionOnEndEditing="YES" alignment="left" title="Custom" id="253">
-                                                            <font key="font" metaFont="miniSystem"/>
-                                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
-                                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                                                        </textFieldCell>
-                                                    </textField>
                                                     <textField verticalHuggingPriority="750" id="382">
                                                         <rect key="frame" x="3" y="107" width="59" height="17"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                             </tabViewItem>
                             <tabViewItem label="Filters" identifier="2" id="283">
                                 <view key="view" id="284">
-                                    <rect key="frame" x="10" y="19" width="638" height="326"/>
+                                    <rect key="frame" x="10" y="19" width="638" height="184"/>
                                     <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                     <subviews>
-                                        <box autoresizesSubviews="NO" title="Box" borderType="line" titlePosition="noTitle" id="286">
-                                            <rect key="frame" x="37" y="257" width="232" height="67"/>
+                                        <box autoresizesSubviews="NO" title="Box" borderType="bezel" titlePosition="noTitle" id="286">
+                                            <rect key="frame" x="11" y="113" width="232" height="66"/>
                                             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                             <view key="contentView">
-                                                <rect key="frame" x="1" y="1" width="230" height="65"/>
+                                                <rect key="frame" x="3" y="3" width="226" height="60"/>
                                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                                 <subviews>
                                                     <textField verticalHuggingPriority="750" id="346">
-                                                        <rect key="frame" x="19" y="38" width="64" height="14"/>
+                                                        <rect key="frame" x="19" y="36" width="64" height="14"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Detelecine:" id="347">
                                                             <font key="font" metaFont="smallSystem"/>
                                                         </textFieldCell>
                                                     </textField>
                                                     <textField verticalHuggingPriority="750" id="344">
-                                                        <rect key="frame" x="34" y="15" width="49" height="14"/>
+                                                        <rect key="frame" x="34" y="13" width="49" height="14"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Custom:" id="353">
                                                             <font key="font" metaFont="smallSystem"/>
                                                             <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                                                             <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                                         </textFieldCell>
+                                                        <connections>
+                                                            <binding destination="-2" name="hidden" keyPath="self.filters.detelecine" id="GeL-Hh-N04">
+                                                                <dictionary key="options">
+                                                                    <string key="NSValueTransformerName">HBCustomFilterTransformer</string>
+                                                                </dictionary>
+                                                            </binding>
+                                                        </connections>
                                                     </textField>
                                                     <popUpButton verticalHuggingPriority="750" id="345">
-                                                        <rect key="frame" x="88" y="37" width="110" height="15"/>
+                                                        <rect key="frame" x="87" y="35" width="110" height="15"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                        <popUpButtonCell key="cell" type="push" title="Item1" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="350" id="348">
+                                                        <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="348">
                                                             <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
                                                             <font key="font" metaFont="miniSystem"/>
-                                                            <menu key="menu" title="OtherViews" id="349">
-                                                                <items>
-                                                                    <menuItem title="Item1" state="on" id="350"/>
-                                                                    <menuItem title="Item2" id="351"/>
-                                                                    <menuItem title="Item3" id="352"/>
-                                                                </items>
-                                                            </menu>
+                                                            <menu key="menu" title="OtherViews" id="349"/>
                                                         </popUpButtonCell>
                                                         <connections>
-                                                            <action selector="FilterSettingsChanged:" target="-2" id="374"/>
+                                                            <binding destination="-2" name="selectedIndex" keyPath="self.filters.detelecine" previousBinding="pGd-yk-F9V" id="nJ6-iy-GiP"/>
+                                                            <binding destination="-2" name="content" keyPath="self.filters.detelecineSettings" id="pGd-yk-F9V"/>
                                                         </connections>
                                                     </popUpButton>
                                                     <textField verticalHuggingPriority="750" id="343">
-                                                        <rect key="frame" x="89" y="14" width="108" height="16"/>
+                                                        <rect key="frame" x="88" y="12" width="108" height="16"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <textFieldCell key="cell" controlSize="mini" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="354">
                                                             <font key="font" metaFont="miniSystem"/>
                                                             <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                         </textFieldCell>
                                                         <connections>
-                                                            <action selector="FilterSettingsChanged:" target="-2" id="ApX-0E-8GE"/>
-                                                            <binding destination="-2" name="value" keyPath="self.detelecineCustomString" id="pxi-vJ-hxS"/>
+                                                            <binding destination="-2" name="hidden" keyPath="self.filters.detelecine" id="BLn-QV-lw8">
+                                                                <dictionary key="options">
+                                                                    <string key="NSValueTransformerName">HBCustomFilterTransformer</string>
+                                                                </dictionary>
+                                                            </binding>
+                                                            <binding destination="-2" name="value" keyPath="self.filters.detelecineCustomString" id="gSO-TA-w8P">
+                                                                <dictionary key="options">
+                                                                    <bool key="NSContinuouslyUpdatesValue" value="YES"/>
+                                                                </dictionary>
+                                                            </binding>
                                                         </connections>
                                                     </textField>
                                                 </subviews>
                                             <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
                                             <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                                         </box>
-                                        <box titlePosition="aboveBottom" id="287">
-                                            <rect key="frame" x="37" y="150" width="232" height="105"/>
+                                        <box borderType="bezel" titlePosition="aboveBottom" id="287">
+                                            <rect key="frame" x="11" y="4" width="232" height="107"/>
                                             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                             <view key="contentView">
-                                                <rect key="frame" x="2" y="18" width="228" height="85"/>
+                                                <rect key="frame" x="3" y="19" width="226" height="85"/>
                                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                                 <subviews>
-                                                    <slider verticalHuggingPriority="750" id="313">
-                                                        <rect key="frame" x="59" y="58" width="37" height="16"/>
+                                                    <matrix verticalHuggingPriority="750" allowsEmptySelection="NO" id="kSA-Hn-6ya">
+                                                        <rect key="frame" x="88" y="43" width="83" height="32"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                        <sliderCell key="cell" controlSize="small" state="on" alignment="left" maxValue="1" doubleValue="0.5" tickMarkPosition="above" allowsTickMarkValuesOnly="YES" sliderType="linear" id="340">
-                                                            <font key="font" metaFont="smallSystem"/>
-                                                        </sliderCell>
+                                                        <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                        <size key="cellSize" width="83" height="15"/>
+                                                        <size key="intercellSpacing" width="4" height="2"/>
+                                                        <buttonCell key="prototype" type="radio" title="Radio" imagePosition="left" alignment="left" inset="2" id="m9e-GO-6R2" customClass="HBHUDButtonCell">
+                                                            <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                                            <font key="font" metaFont="system"/>
+                                                        </buttonCell>
+                                                        <cells>
+                                                            <column>
+                                                                <buttonCell type="radio" title="Deinterlace" imagePosition="left" alignment="left" controlSize="small" state="on" tag="1" inset="2" id="UmU-23-PdR" customClass="HBHUDButtonCell">
+                                                                    <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                                                    <font key="font" metaFont="smallSystem"/>
+                                                                </buttonCell>
+                                                                <buttonCell type="radio" title="Decomb" imagePosition="left" alignment="left" controlSize="small" inset="2" id="N0e-d0-RLj" customClass="HBHUDButtonCell">
+                                                                    <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                                                    <font key="font" metaFont="smallSystem"/>
+                                                                </buttonCell>
+                                                            </column>
+                                                        </cells>
                                                         <connections>
-                                                            <action selector="modeDecombDeinterlaceSliderChanged:" target="-2" id="381"/>
+                                                            <binding destination="-2" name="selectedIndex" keyPath="self.filters.useDecomb" id="FHi-fu-YUi"/>
                                                         </connections>
-                                                    </slider>
-                                                    <textField verticalHuggingPriority="750" id="312">
-                                                        <rect key="frame" x="1" y="57" width="56" height="17"/>
-                                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                        <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Decomb" id="341">
-                                                            <font key="font" metaFont="smallSystem"/>
-                                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
-                                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                                                        </textFieldCell>
-                                                    </textField>
-                                                    <textField verticalHuggingPriority="750" id="311">
-                                                        <rect key="frame" x="97" y="56" width="89" height="17"/>
-                                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                        <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Deinterlace" id="342">
-                                                            <font key="font" metaFont="smallSystem"/>
-                                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
-                                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                                                        </textFieldCell>
-                                                    </textField>
-                                                    <box autoresizesSubviews="NO" title="Box" boxType="custom" borderType="none" titlePosition="noTitle" id="315">
-                                                        <rect key="frame" x="14" y="-14" width="198" height="70"/>
+                                                    </matrix>
+                                                    <box autoresizesSubviews="NO" title="Box" borderType="none" titlePosition="noTitle" id="315" userLabel="Decomb Box">
+                                                        <rect key="frame" x="11" y="-11" width="207" height="62"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <view key="contentView">
-                                                            <rect key="frame" x="0.0" y="0.0" width="198" height="70"/>
+                                                            <rect key="frame" x="0.0" y="0.0" width="207" height="62"/>
                                                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                                             <subviews>
                                                                 <textField verticalHuggingPriority="750" id="319">
-                                                                    <rect key="frame" x="14" y="40" width="52" height="14"/>
+                                                                    <rect key="frame" x="20" y="35" width="52" height="14"/>
                                                                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                                     <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Decomb:" id="320">
                                                                         <font key="font" metaFont="smallSystem"/>
                                                                     </textFieldCell>
                                                                 </textField>
                                                                 <textField verticalHuggingPriority="750" id="317">
-                                                                    <rect key="frame" x="17" y="17" width="49" height="14"/>
+                                                                    <rect key="frame" x="23" y="11" width="49" height="14"/>
                                                                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                                     <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Custom:" id="326">
                                                                         <font key="font" metaFont="smallSystem"/>
                                                                         <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                                                                         <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                                                     </textFieldCell>
+                                                                    <connections>
+                                                                        <binding destination="-2" name="hidden" keyPath="self.filters.decomb" id="SgL-u6-Y9a">
+                                                                            <dictionary key="options">
+                                                                                <string key="NSValueTransformerName">HBCustomFilterTransformer</string>
+                                                                            </dictionary>
+                                                                        </binding>
+                                                                    </connections>
                                                                 </textField>
                                                                 <popUpButton verticalHuggingPriority="750" id="318">
-                                                                    <rect key="frame" x="73" y="39" width="110" height="15"/>
+                                                                    <rect key="frame" x="76" y="34" width="111" height="15"/>
                                                                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                                    <popUpButtonCell key="cell" type="push" title="Item1" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="323" id="321">
+                                                                    <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="321">
                                                                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
                                                                         <font key="font" metaFont="miniSystem"/>
-                                                                        <menu key="menu" title="OtherViews" id="322">
-                                                                            <items>
-                                                                                <menuItem title="Item1" state="on" id="323"/>
-                                                                                <menuItem title="Item2" id="324"/>
-                                                                                <menuItem title="Item3" id="325"/>
-                                                                            </items>
-                                                                        </menu>
+                                                                        <menu key="menu" title="OtherViews" id="322"/>
                                                                     </popUpButtonCell>
                                                                     <connections>
-                                                                        <action selector="FilterSettingsChanged:" target="-2" id="375"/>
+                                                                        <binding destination="-2" name="selectedIndex" keyPath="self.filters.decomb" previousBinding="Rky-63-XUy" id="0LF-hS-iFS"/>
+                                                                        <binding destination="-2" name="contentValues" keyPath="self.filters.decombSettings" id="Rky-63-XUy"/>
                                                                     </connections>
                                                                 </popUpButton>
                                                                 <textField verticalHuggingPriority="750" id="316">
-                                                                    <rect key="frame" x="74" y="16" width="108" height="16"/>
+                                                                    <rect key="frame" x="77" y="10" width="108" height="16"/>
                                                                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                                     <textFieldCell key="cell" controlSize="mini" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="327">
                                                                         <font key="font" metaFont="miniSystem"/>
                                                                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                                     </textFieldCell>
                                                                     <connections>
-                                                                        <action selector="FilterSettingsChanged:" target="-2" id="cQu-1x-zhN"/>
-                                                                        <binding destination="-2" name="value" keyPath="self.decombCustomString" id="4lc-Rt-V0u">
+                                                                        <binding destination="-2" name="hidden" keyPath="self.filters.decomb" id="akE-8W-aND">
+                                                                            <dictionary key="options">
+                                                                                <string key="NSValueTransformerName">HBCustomFilterTransformer</string>
+                                                                            </dictionary>
+                                                                        </binding>
+                                                                        <binding destination="-2" name="value" keyPath="self.filters.decombCustomString" id="y3W-Df-Jgn">
                                                                             <dictionary key="options">
                                                                                 <bool key="NSContinuouslyUpdatesValue" value="YES"/>
                                                                             </dictionary>
                                                         <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
                                                         <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                                                     </box>
-                                                    <box autoresizesSubviews="NO" title="Box" borderType="none" titlePosition="noTitle" id="314">
-                                                        <rect key="frame" x="-6" y="-13" width="222" height="66"/>
+                                                    <box autoresizesSubviews="NO" title="Box" borderType="none" titlePosition="noTitle" id="314" userLabel="Deinterlace Box">
+                                                        <rect key="frame" x="11" y="-11" width="207" height="62"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <view key="contentView">
-                                                            <rect key="frame" x="0.0" y="0.0" width="222" height="66"/>
+                                                            <rect key="frame" x="0.0" y="0.0" width="207" height="62"/>
                                                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                                             <subviews>
                                                                 <textField verticalHuggingPriority="750" id="331">
-                                                                    <rect key="frame" x="17" y="39" width="68" height="14"/>
+                                                                    <rect key="frame" x="4" y="35" width="68" height="14"/>
                                                                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                                     <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Deinterlace:" id="332">
                                                                         <font key="font" metaFont="smallSystem"/>
                                                                     </textFieldCell>
                                                                 </textField>
                                                                 <textField verticalHuggingPriority="750" id="330">
-                                                                    <rect key="frame" x="37" y="16" width="49" height="14"/>
+                                                                    <rect key="frame" x="23" y="11" width="49" height="14"/>
                                                                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                                     <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Custom:" id="333">
                                                                         <font key="font" metaFont="smallSystem"/>
                                                                         <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                                                                         <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                                                     </textFieldCell>
+                                                                    <connections>
+                                                                        <binding destination="-2" name="hidden" keyPath="self.filters.deinterlace" id="rIM-KR-bUf">
+                                                                            <dictionary key="options">
+                                                                                <string key="NSValueTransformerName">HBCustomFilterTransformer</string>
+                                                                            </dictionary>
+                                                                        </binding>
+                                                                    </connections>
                                                                 </textField>
                                                                 <popUpButton verticalHuggingPriority="750" id="328">
-                                                                    <rect key="frame" x="93" y="38" width="110" height="15"/>
+                                                                    <rect key="frame" x="77" y="34" width="111" height="15"/>
                                                                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                                    <popUpButtonCell key="cell" type="push" title="Item1" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="337" id="335">
+                                                                    <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="335">
                                                                         <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
                                                                         <font key="font" metaFont="miniSystem"/>
-                                                                        <menu key="menu" title="OtherViews" id="336">
-                                                                            <items>
-                                                                                <menuItem title="Item1" state="on" id="337"/>
-                                                                                <menuItem title="Item2" id="338"/>
-                                                                                <menuItem title="Item3" id="339"/>
-                                                                            </items>
-                                                                        </menu>
+                                                                        <menu key="menu" title="OtherViews" id="336"/>
                                                                     </popUpButtonCell>
                                                                     <connections>
-                                                                        <action selector="FilterSettingsChanged:" target="-2" id="377"/>
+                                                                        <binding destination="-2" name="selectedIndex" keyPath="self.filters.deinterlace" previousBinding="hol-Lh-FVF" id="5jK-2w-2Fq"/>
+                                                                        <binding destination="-2" name="contentValues" keyPath="self.filters.deinterlaceSettings" id="hol-Lh-FVF"/>
                                                                     </connections>
                                                                 </popUpButton>
                                                                 <textField verticalHuggingPriority="750" id="329">
-                                                                    <rect key="frame" x="95" y="15" width="108" height="16"/>
+                                                                    <rect key="frame" x="77" y="10" width="108" height="16"/>
                                                                     <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                                     <textFieldCell key="cell" controlSize="mini" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="334">
                                                                         <font key="font" metaFont="miniSystem"/>
                                                                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                                     </textFieldCell>
                                                                     <connections>
-                                                                        <action selector="FilterSettingsChanged:" target="-2" id="54Z-kr-6oa"/>
-                                                                        <binding destination="-2" name="value" keyPath="self.deinterlaceCustomString" id="eu9-Ar-QY2">
+                                                                        <binding destination="-2" name="hidden" keyPath="self.filters.deinterlace" id="7f6-Fd-pfo">
+                                                                            <dictionary key="options">
+                                                                                <string key="NSValueTransformerName">HBCustomFilterTransformer</string>
+                                                                            </dictionary>
+                                                                        </binding>
+                                                                        <binding destination="-2" name="value" keyPath="self.filters.deinterlaceCustomString" id="aSX-hF-LBO">
                                                                             <dictionary key="options">
                                                                                 <bool key="NSContinuouslyUpdatesValue" value="YES"/>
                                                                             </dictionary>
                                             <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
                                             <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                                         </box>
-                                        <box autoresizesSubviews="NO" title="Box" borderType="line" titlePosition="noTitle" id="288">
-                                            <rect key="frame" x="37" y="82" width="232" height="66"/>
+                                        <box autoresizesSubviews="NO" title="Box" borderType="bezel" titlePosition="noTitle" id="288">
+                                            <rect key="frame" x="245" y="4" width="232" height="107"/>
                                             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                             <view key="contentView">
-                                                <rect key="frame" x="1" y="1" width="230" height="64"/>
+                                                <rect key="frame" x="3" y="3" width="226" height="101"/>
                                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                                 <subviews>
                                                     <textField verticalHuggingPriority="750" id="299">
-                                                        <rect key="frame" x="33" y="38" width="50" height="14"/>
+                                                        <rect key="frame" x="32" y="73" width="50" height="14"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Denoise:" id="310">
                                                             <font key="font" metaFont="smallSystem"/>
                                                             <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                                         </textFieldCell>
                                                     </textField>
-                                                    <textField verticalHuggingPriority="750" id="301">
-                                                        <rect key="frame" x="34" y="15" width="49" height="14"/>
+                                                    <popUpButton toolTip="Denoise filtering reduces or removes the appearance of noise and grain." verticalHuggingPriority="750" id="300">
+                                                        <rect key="frame" x="86" y="73" width="110" height="15"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                        <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Custom:" id="304">
+                                                        <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="305">
+                                                            <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
+                                                            <font key="font" metaFont="miniSystem"/>
+                                                            <menu key="menu" title="OtherViews" id="306"/>
+                                                        </popUpButtonCell>
+                                                        <connections>
+                                                            <binding destination="-2" name="selectedValue" keyPath="self.filters.denoise" previousBinding="mkS-wD-luU" id="1LQ-5U-xih">
+                                                                <dictionary key="options">
+                                                                    <string key="NSValueTransformerName">HBDenoiseTransformer</string>
+                                                                </dictionary>
+                                                            </binding>
+                                                            <binding destination="-2" name="contentValues" keyPath="self.filters.denoiseTypes" id="mkS-wD-luU"/>
+                                                        </connections>
+                                                    </popUpButton>
+                                                    <textField verticalHuggingPriority="750" id="ZSz-Vu-qC0">
+                                                        <rect key="frame" x="42" y="50" width="40" height="14"/>
+                                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                                                        <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Preset:" id="CBk-r9-aJb">
                                                             <font key="font" metaFont="smallSystem"/>
                                                             <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                                                             <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                                         </textFieldCell>
                                                     </textField>
-                                                    <popUpButton verticalHuggingPriority="750" id="300">
-                                                        <rect key="frame" x="88" y="37" width="110" height="15"/>
+                                                    <popUpButton verticalHuggingPriority="750" id="2F0-KY-tOC">
+                                                        <rect key="frame" x="86" y="50" width="110" height="15"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                                        <popUpButtonCell key="cell" type="push" title="Item1" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="309" id="305">
+                                                        <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="nMP-H2-vMe">
                                                             <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
                                                             <font key="font" metaFont="miniSystem"/>
-                                                            <menu key="menu" title="OtherViews" id="306">
-                                                                <items>
-                                                                    <menuItem title="Item1" state="on" id="309"/>
-                                                                    <menuItem title="Item2" id="308"/>
-                                                                    <menuItem title="Item3" id="307"/>
-                                                                </items>
-                                                            </menu>
+                                                            <menu key="menu" title="OtherViews" id="Mxi-ZP-xzf"/>
                                                         </popUpButtonCell>
                                                         <connections>
-                                                            <action selector="FilterSettingsChanged:" target="-2" id="378"/>
+                                                            <binding destination="-2" name="selectedValue" keyPath="self.filters.denoisePreset" previousBinding="Lju-Js-fav" id="8HL-Js-eww">
+                                                                <dictionary key="options">
+                                                                    <string key="NSValueTransformerName">HBDenoisePresetTransformer</string>
+                                                                </dictionary>
+                                                            </binding>
+                                                            <binding destination="-2" name="contentValues" keyPath="self.filters.denoisePresets" id="Lju-Js-fav"/>
                                                         </connections>
                                                     </popUpButton>
+                                                    <textField verticalHuggingPriority="750" id="gpP-sp-Lev">
+                                                        <rect key="frame" x="48" y="28" width="34" height="14"/>
+                                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                                                        <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Tune:" id="BqI-14-fzH">
+                                                            <font key="font" metaFont="smallSystem"/>
+                                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                        </textFieldCell>
+                                                    </textField>
+                                                    <popUpButton verticalHuggingPriority="750" id="Upd-5E-OpR">
+                                                        <rect key="frame" x="86" y="28" width="110" height="15"/>
+                                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                                                        <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="mini" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="lPq-MO-3Oz">
+                                                            <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
+                                                            <font key="font" metaFont="miniSystem"/>
+                                                            <menu key="menu" title="OtherViews" id="NiL-SO-Fbj"/>
+                                                        </popUpButtonCell>
+                                                        <connections>
+                                                            <binding destination="-2" name="selectedValue" keyPath="self.filters.denoiseTune" previousBinding="nST-CD-SjR" id="wvC-Ag-WKc">
+                                                                <dictionary key="options">
+                                                                    <string key="NSValueTransformerName">HBDenoiseTuneTransformer</string>
+                                                                </dictionary>
+                                                            </binding>
+                                                            <binding destination="-2" name="contentValues" keyPath="self.filters.denoiseTunes" id="nST-CD-SjR"/>
+                                                        </connections>
+                                                    </popUpButton>
+                                                    <textField verticalHuggingPriority="750" id="301">
+                                                        <rect key="frame" x="33" y="27" width="49" height="14"/>
+                                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                                                        <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Custom:" id="304">
+                                                            <font key="font" metaFont="smallSystem"/>
+                                                            <color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                                                            <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                                                        </textFieldCell>
+                                                    </textField>
                                                     <textField verticalHuggingPriority="750" id="302">
-                                                        <rect key="frame" x="89" y="14" width="108" height="16"/>
+                                                        <rect key="frame" x="87" y="26" width="108" height="16"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <textFieldCell key="cell" controlSize="mini" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="303">
                                                             <font key="font" metaFont="miniSystem"/>
                                                             <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                         </textFieldCell>
                                                         <connections>
-                                                            <action selector="FilterSettingsChanged:" target="-2" id="em7-cp-nCV"/>
-                                                            <binding destination="-2" name="value" keyPath="self.denoiseCustomString" id="9bk-dZ-FOv">
+                                                            <binding destination="-2" name="value" keyPath="self.filters.denoiseCustomString" id="cUD-QA-8K3">
                                                                 <dictionary key="options">
                                                                     <bool key="NSContinuouslyUpdatesValue" value="YES"/>
                                                                 </dictionary>
                                             <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
                                             <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                                         </box>
-                                        <box autoresizesSubviews="NO" title="Box" borderType="line" titlePosition="noTitle" id="421">
-                                            <rect key="frame" x="37" y="20" width="232" height="60"/>
+                                        <box autoresizesSubviews="NO" title="Box" borderType="bezel" titlePosition="noTitle" id="421">
+                                            <rect key="frame" x="245" y="113" width="232" height="66"/>
                                             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                             <view key="contentView">
-                                                <rect key="frame" x="1" y="1" width="230" height="58"/>
+                                                <rect key="frame" x="3" y="3" width="226" height="60"/>
                                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                                 <subviews>
                                                     <textField verticalHuggingPriority="750" id="289">
-                                                        <rect key="frame" x="30" y="32" width="51" height="14"/>
+                                                        <rect key="frame" x="30" y="36" width="51" height="14"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Deblock:" id="298">
                                                             <font key="font" metaFont="smallSystem"/>
                                                         </textFieldCell>
                                                     </textField>
                                                     <textField verticalHuggingPriority="750" id="290">
-                                                        <rect key="frame" x="24" y="9" width="58" height="14"/>
+                                                        <rect key="frame" x="24" y="13" width="58" height="14"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Grayscale:" id="297">
                                                             <font key="font" metaFont="smallSystem"/>
                                                         </textFieldCell>
                                                     </textField>
                                                     <textField verticalHuggingPriority="750" id="291">
-                                                        <rect key="frame" x="79" y="31" width="31" height="14"/>
+                                                        <rect key="frame" x="79" y="35" width="31" height="14"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="center" title="Off" id="296">
                                                             <font key="font" metaFont="smallSystem"/>
                                                         </textFieldCell>
                                                     </textField>
                                                     <slider verticalHuggingPriority="750" id="292">
-                                                        <rect key="frame" x="108" y="30" width="104" height="16"/>
+                                                        <rect key="frame" x="108" y="34" width="104" height="16"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <sliderCell key="cell" controlSize="mini" continuous="YES" state="on" alignment="left" minValue="4" maxValue="15" doubleValue="4" tickMarkPosition="below" numberOfTickMarks="12" allowsTickMarkValuesOnly="YES" sliderType="linear" id="295">
                                                             <font key="font" metaFont="miniSystem"/>
                                                         </sliderCell>
                                                         <connections>
-                                                            <action selector="deblockSliderChanged:" target="-2" id="379"/>
+                                                            <binding destination="-2" name="value" keyPath="self.filters.deblock" id="QYG-e5-NYq"/>
                                                         </connections>
                                                     </slider>
                                                     <button id="293">
-                                                        <rect key="frame" x="84" y="7" width="19" height="18"/>
+                                                        <rect key="frame" x="84" y="11" width="19" height="18"/>
                                                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                                         <buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" inset="2" id="294">
                                                             <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                                             <font key="font" metaFont="smallSystem"/>
                                                         </buttonCell>
                                                         <connections>
-                                                            <action selector="FilterSettingsChanged:" target="-2" id="380"/>
+                                                            <binding destination="-2" name="value" keyPath="self.filters.grayscale" id="CyF-w9-sk3"/>
                                                         </connections>
                                                     </button>
                                                 </subviews>
                         </connections>
                     </tabView>
                     <button verticalHuggingPriority="750" id="270">
-                        <rect key="frame" x="15" y="370" width="57" height="16"/>
+                        <rect key="frame" x="15" y="228" width="64" height="16"/>
                         <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                         <buttonCell key="cell" type="push" title="Preview" bezelStyle="rounded" alignment="center" controlSize="mini" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="271">
                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                     </button>
                 </subviews>
             </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="hby-dR-NFK"/>
+            </connections>
         </window>
     </objects>
 </document>
index 40377605166bf6f064a43d6ec7d842075c2dc89c..0702d5d8e820f1ca1db501167e1041f8b96ea4ba 100644 (file)
@@ -83,13 +83,13 @@ NSString *HBCoreMuxingNotification = @"HBCoreMuxingNotification";
     if (hb_handle)
         return NO;
 
-    state = HBStateIdle;    
+    state = HBStateIdle;
 
     hb_handle = hb_init(debugMode ? HB_DEBUG_ALL : HB_DEBUG_NONE, checkForUpdates);
     if (!hb_handle)
         return NO;
 
-    updateTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2
+    updateTimer = [[NSTimer scheduledTimerWithTimeInterval:0.5
                                                     target:self
                                                   selector:@selector(stateUpdateTimer:) 
                                                   userInfo:NULL 
@@ -109,7 +109,7 @@ NSString *HBCoreMuxingNotification = @"HBCoreMuxingNotification";
     NSAssert(hb_handle, @"[HBCore close] libhb is not open");
     if (!hb_handle)
         return NO;
-        
+
     [updateTimer invalidate];
     [updateTimer release];
     updateTimer = nil;
diff --git a/macosx/HBFilters.h b/macosx/HBFilters.h
new file mode 100644 (file)
index 0000000..eaafef1
--- /dev/null
@@ -0,0 +1,74 @@
+/*  HBFilters.h $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+#import <Foundation/Foundation.h>
+
+/**
+ *  Filters settings.
+ */
+@interface HBFilters : NSObject
+
+- (void)prepareFiltersForPreset:(NSMutableDictionary *)preset;
+- (void)applySettingsFromPreset:(NSDictionary *)preset;
+
+@property (nonatomic, readwrite) NSInteger detelecine;
+@property (nonatomic, readwrite, copy) NSString *detelecineCustomString;
+
+@property (nonatomic, readwrite) NSInteger deinterlace;
+@property (nonatomic, readwrite, copy) NSString *deinterlaceCustomString;
+
+@property (nonatomic, readwrite) NSInteger decomb;
+@property (nonatomic, readwrite, copy) NSString *decombCustomString;
+
+@property (nonatomic, readwrite, copy) NSString *denoise;
+@property (nonatomic, readwrite, copy) NSString *denoisePreset;
+@property (nonatomic, readwrite, copy) NSString *denoiseTune;
+@property (nonatomic, readwrite, copy) NSString *denoiseCustomString;
+
+@property (nonatomic, readwrite) NSInteger deblock;
+@property (nonatomic, readwrite) BOOL grayscale;
+
+@property (nonatomic, readwrite) BOOL useDecomb;
+
+/**
+ *  A textual summary of the filters settings.
+ */
+@property (nonatomic, readonly) NSString *summary;
+
+/**
+ *  Getters to get the possible values for the filters.
+ */
++ (NSDictionary *)denoisePresetDict;
++ (NSDictionary *)nlmeansTunesDict;
++ (NSDictionary *)denoiseTypesDict;
+
+@property (nonatomic, readonly) NSArray *detelecineSettings;
+@property (nonatomic, readonly) NSArray *deinterlaceSettings;
+@property (nonatomic, readonly) NSArray *decombSettings;
+
+@property (nonatomic, readonly) NSArray *denoiseTypes;
+@property (nonatomic, readonly) NSArray *denoisePresets;
+@property (nonatomic, readonly) NSArray *denoiseTunes;
+
+@end
+
+/**
+ *  A collection of NSValueTransformer to map between localized UI values
+ *  and the internals values.
+ */
+
+@interface HBGenericDictionaryTransformer : NSValueTransformer
+@property (nonatomic, retain) NSDictionary *dict;
+@end
+
+@interface HBDenoisePresetTransformer : HBGenericDictionaryTransformer
+@end
+
+@interface HBDenoiseTuneTransformer : HBGenericDictionaryTransformer
+@end
+
+@interface HBDenoiseTransformer : HBGenericDictionaryTransformer
+@end
\ No newline at end of file
diff --git a/macosx/HBFilters.m b/macosx/HBFilters.m
new file mode 100644 (file)
index 0000000..7a00004
--- /dev/null
@@ -0,0 +1,453 @@
+/*  HBFilters.m $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+#import "HBFilters.h"
+
+@implementation HBGenericDictionaryTransformer
+
++ (Class)transformedValueClass
+{
+    return [NSString class];
+}
+
+- (id)transformedValue:(id)value
+{
+    return [[self.dict allKeysForObject:value] firstObject];
+}
+
++ (BOOL)allowsReverseTransformation
+{
+    return YES;
+}
+
+- (id)reverseTransformedValue:(id)value
+{
+    return [self.dict valueForKey:value];
+}
+
+@end
+
+@implementation HBDenoisePresetTransformer
+
+- (instancetype)init
+{
+    if (self = [super init])
+        self.dict = [HBFilters denoisePresetDict];
+
+    return self;
+}
+
+@end
+
+@implementation HBDenoiseTuneTransformer
+
+- (instancetype)init
+{
+    if (self = [super init])
+        self.dict = [HBFilters nlmeansTunesDict];
+
+    return self;
+}
+
+@end
+
+@implementation HBDenoiseTransformer
+
+- (instancetype)init
+{
+    if (self = [super init])
+        self.dict = [HBFilters denoiseTypesDict];
+
+    return self;
+}
+
+@end
+
+static NSDictionary *_denoiseTypesDict;
+static NSDictionary *_denoisePresetsDict;
+static NSDictionary *_nlmeansTunesDict;
+
+@implementation HBFilters
+
++ (void)initialize
+{
+    if (self == [HBFilters class]) {
+        _denoiseTypesDict = [@{NSLocalizedString(@"Off", nil):      @"off",
+                               NSLocalizedString(@"NLMeans", nil):  @"nlmeans",
+                               NSLocalizedString(@"HQDN3D", nil):   @"hqdn3d"} retain];
+
+        _denoisePresetsDict = [@{NSLocalizedString(@"Custom", nil):     @"none",
+                                 NSLocalizedString(@"Ultralight", nil): @"ultralight",
+                                 NSLocalizedString(@"Light", nil):      @"light",
+                                 NSLocalizedString(@"Medium", nil) :    @"medium",
+                                 NSLocalizedString(@"Strong", nil) :    @"strong"} retain];
+
+        _nlmeansTunesDict = [@{NSLocalizedString(@"None", nil):         @"none",
+                               NSLocalizedString(@"Film", nil):         @"film",
+                               NSLocalizedString(@"Grain", nil):        @"grain",
+                               NSLocalizedString(@"High Motion", nil):  @"highmotion",
+                               NSLocalizedString(@"Animation", nil) :   @"animation"} retain];
+    }
+}
+
+- (instancetype)init
+{
+    self = [super init];
+    if (self)
+    {
+        _detelecineCustomString = @"";
+        _deinterlaceCustomString = @"";
+        _decombCustomString = @"";
+        _denoise = @"off";
+        _denoiseCustomString = @"";
+        _denoisePreset = @"medium";
+        _denoiseTune = @"none";
+    }
+    return self;
+}
+
+- (void)prepareFiltersForPreset:(NSMutableDictionary *)preset
+{
+    preset[@"PictureDecombDeinterlace"] = self.useDecomb;
+
+    preset[@"PictureDeinterlace"] = @(self.deinterlace);
+    preset[@"PictureDeinterlaceCustom"] = self.deinterlaceCustomString;
+
+    preset[@"PictureDecomb"] = @(self.decomb);
+    preset[@"PictureDecombCustom"] = self.decombCustomString;
+
+    preset[@"PictureDetelecine"] = @(self.detelecine);
+    preset[@"PictureDetelecineCustom"] = self.detelecineCustomString;
+
+    preset[@"PictureDenoiseFilter"] = self.denoise;
+    preset[@"PictureDenoisePreset"] = self.denoisePreset;
+    preset[@"PictureDenoiseTune"] = self.denoiseTune;
+    preset[@"PictureDenoiseCustom"] = self.denoiseCustomString;
+
+    preset[@"PictureDeblock"] = @(self.deblock);
+    preset[@"VideoGrayScale"] = @(self.grayscale);
+}
+
+- (void)applySettingsFromPreset:(NSDictionary *)preset
+{
+    /* If the preset has an objectForKey:@"UsesPictureFilters", and handle the filters here */
+    if (preset[@"UsesPictureFilters"] && [preset[@"UsesPictureFilters"]  intValue] > 0)
+    {
+        /* We only allow *either* Decomb or Deinterlace. So check for the PictureDecombDeinterlace key. */
+        self.useDecomb = 1;
+        self.decomb = 0;
+        self.deinterlace = 0;
+        if ([preset[@"PictureDecombDeinterlace"] intValue] == 1)
+        {
+            /* we are using decomb */
+            /* Decomb */
+            if ([preset[@"PictureDecomb"] intValue] > 0)
+            {
+                self.decomb = [preset[@"PictureDecomb"] intValue];
+
+                /* if we are using "Custom" in the decomb setting, also set the custom string*/
+                if ([preset[@"PictureDecomb"] intValue] == 1)
+                {
+                    self.decombCustomString = preset[@"PictureDecombCustom"];
+                }
+            }
+        }
+        else
+        {
+            /* We are using Deinterlace */
+            /* Deinterlace */
+            if ([preset[@"PictureDeinterlace"] intValue] > 0)
+            {
+                self.useDecomb = 0;
+                self.deinterlace = [preset[@"PictureDeinterlace"] intValue];
+                /* if we are using "Custom" in the deinterlace setting, also set the custom string*/
+                if ([preset[@"PictureDeinterlace"] intValue] == 1)
+                {
+                    self.deinterlaceCustomString = preset[@"PictureDeinterlaceCustom"];
+                }
+            }
+        }
+
+        /* Detelecine */
+        if ([preset[@"PictureDetelecine"] intValue] > 0)
+        {
+            self.detelecine = [preset[@"PictureDetelecine"] intValue];
+            /* if we are using "Custom" in the detelecine setting, also set the custom string*/
+            if ([preset[@"PictureDetelecine"] intValue] == 1)
+            {
+                self.detelecineCustomString = preset[@"PictureDetelecineCustom"];
+            }
+        }
+        else
+        {
+            self.detelecine = 0;
+        }
+
+        /* Denoise */
+        if (preset[@"PictureDenoise"])
+        {
+            // Old preset denoise format, try to map it to the new one
+            if ([preset[@"PictureDenoise"] intValue] > 0)
+            {
+                self.denoise = @"hqdn3d";
+                /* if we are using "Custom" in the denoise setting, also set the custom string*/
+                if ([preset[@"PictureDenoise"] intValue] == 1)
+                {
+                    self.denoisePreset = @"custom";
+                    self.denoiseCustomString = preset[@"PictureDenoiseCustom"];
+                }
+                switch ([preset[@"PictureDenoise"] intValue]) {
+                    case 2:
+                        self.denoisePreset = @"light";
+                        break;
+                    case 3:
+                        self.denoisePreset = @"medium";
+                        break;
+                    case 4:
+                        self.denoisePreset = @"strong";
+                        break;
+                    default:
+                        self.denoisePreset = @"medium";
+                        break;
+                }
+            }
+            else
+            {
+                self.denoise = @"off";
+            }
+        }
+        else
+        {
+            // New format, read the values directly
+            self.denoise = preset[@"PictureDenoiseFilter"];
+            self.denoisePreset = preset[@"PictureDenoisePreset"];
+            self.denoiseTune = preset[@"PictureDenoiseTune"];
+            self.denoiseCustomString = preset[@"PictureDenoiseCustom"];
+        }
+
+        /* Deblock */
+        if ([preset[@"PictureDeblock"] intValue] == 1)
+        {
+            /* if its a one, then its the old on/off deblock, set on to 5*/
+            self.deblock = 5;
+        }
+        else
+        {
+            /* use the settings intValue */
+            self.deblock = [preset[@"PictureDeblock"] intValue];
+        }
+
+        self.grayscale = [preset[@"VideoGrayScale"] intValue];
+    }
+}
+
+- (NSString *)summary
+{
+    NSMutableString *summary = [NSMutableString string];
+
+    /* Detelecine */
+    switch (self.detelecine)
+    {
+        case 1:
+            [summary appendFormat:@" - Detelecine (%@)", self.detelecineCustomString];
+            break;
+
+        case 2:
+            [summary appendString:@" - Detelecine (Default)"];
+            break;
+
+        default:
+            break;
+    }
+
+    if (self.useDecomb)
+    {
+        /* Decomb */
+        switch (self.decomb)
+        {
+            case 1:
+                [summary appendFormat:@" - Decomb (%@)", self.decombCustomString];
+                break;
+
+            case 2:
+                [summary appendString:@" - Decomb (Default)"];
+                break;
+
+            case 3:
+                [summary appendString:@" - Decomb (Fast)"];
+                break;
+
+            case 4:
+                [summary appendString:@" - Decomb (Bob)"];
+                break;
+
+            default:
+                break;
+        }
+    }
+    else
+    {
+        /* Deinterlace */
+        switch (self.deinterlace)
+        {
+            case 1:
+                [summary appendFormat:@" - Deinterlace (%@)", self.deinterlaceCustomString];
+                break;
+
+            case 2:
+                [summary appendString:@" - Deinterlace (Fast)"];
+                break;
+
+            case 3:
+                [summary appendString:@" - Deinterlace (Slow)"];
+                break;
+
+            case 4:
+                [summary appendString:@" - Deinterlace (Slower)"];
+                break;
+
+            case 5:
+                [summary appendString:@" - Deinterlace (Bob)"];
+                break;
+
+            default:
+                break;
+        }
+    }
+
+    /* Deblock */
+    if (self.deblock > 0)
+    {
+        [summary appendFormat:@" - Deblock (%ld)", self.deblock];
+    }
+
+    /* Denoise */
+    if (![self.denoise isEqualToString:@"off"])
+    {
+        [summary appendFormat:@" - Denoise (%@", [[_denoiseTypesDict allKeysForObject:self.denoise] firstObject]];
+        if (![self.denoisePreset isEqualToString:@"none"])
+        {
+            [summary appendFormat:@", %@", [[_denoisePresetsDict allKeysForObject:self.denoisePreset] firstObject]];
+
+            if ([self.denoise isEqualToString:@"nlmeans"])
+            {
+                [summary appendFormat:@", %@", [[_nlmeansTunesDict allKeysForObject:self.denoiseTune] firstObject]];
+            }
+        }
+        else
+        {
+            [summary appendFormat:@", %@", self.denoiseCustomString];
+        }
+
+        [summary appendString:@")"];
+
+    }
+
+    /* Grayscale */
+    if (self.grayscale)
+    {
+        [summary appendString:@" - Grayscale"];
+    }
+
+    if ([summary hasPrefix:@" - "])
+    {
+        [summary deleteCharactersInRange:NSMakeRange(0, 3)];
+    }
+
+    return [NSString stringWithString:summary];
+}
+
+// Override setter to avoid nil values.
+- (void)setDetelecineCustomString:(NSString *)detelecineCustomString
+{
+    [_detelecineCustomString autorelease];
+
+    if (detelecineCustomString)
+    {
+        _detelecineCustomString = [detelecineCustomString copy];
+    }
+    else
+    {
+        _detelecineCustomString = @"";
+    }
+}
+
+- (void)setDeinterlaceCustomString:(NSString *)deinterlaceCustomString
+{
+    [_deinterlaceCustomString autorelease];
+
+    if (deinterlaceCustomString)
+    {
+        _deinterlaceCustomString = [deinterlaceCustomString copy];
+    }
+    else
+    {
+        _deinterlaceCustomString = @"";
+    }
+}
+
+- (void)setDenoiseCustomString:(NSString *)denoiseCustomString
+{
+    [_denoiseCustomString autorelease];
+
+    if (denoiseCustomString)
+    {
+        _denoiseCustomString = [denoiseCustomString copy];
+    }
+    else
+    {
+        _denoiseCustomString = @"";
+    }
+}
+
+#pragma mark - Valid values
+
++ (NSDictionary *)denoisePresetDict
+{
+    return _denoisePresetsDict;
+}
+
++ (NSDictionary *)nlmeansTunesDict
+{
+    return _nlmeansTunesDict;
+}
+
++ (NSDictionary *)denoiseTypesDict
+{
+    return _denoiseTypesDict;
+}
+
+- (NSArray *)detelecineSettings
+{
+    return @[@"Off", @"Custom", @"Default"];
+}
+
+- (NSArray *)decombSettings
+{
+    return @[@"Off", @"Custom", @"Default", @"Fast", @"Bob"];
+}
+
+- (NSArray *)deinterlaceSettings
+{
+    return @[@"Off", @"Custom", @"Fast", @"Slow", @"Slower", @"Bob"];
+}
+
+- (NSArray *)denoiseTypes
+{
+    return @[@"Off", @"NLMeans", @"HQDN3D"];
+}
+
+- (NSArray *)denoisePresets
+{
+    return @[@"Custom", @"Ultralight", @"Light", @"Medium", @"Strong"];
+}
+
+- (NSArray *)denoiseTunes
+{
+    return @[@"None", @"Film", @"Grain", @"High Motion", @"Animation"];
+}
+
+@end
diff --git a/macosx/HBHUDButtonCell.h b/macosx/HBHUDButtonCell.h
new file mode 100644 (file)
index 0000000..1596d1b
--- /dev/null
@@ -0,0 +1,17 @@
+//
+//  HBHUDButtonCell.h
+//  HandBrake
+//
+//  Created by Damiano Galassi on 17/08/14.
+//
+//
+
+#import <Cocoa/Cocoa.h>
+
+/**
+ *  A subclass of NSButtonCell that draws the cell title
+ *  in white.
+ */
+@interface HBHUDButtonCell : NSButtonCell
+
+@end
diff --git a/macosx/HBHUDButtonCell.m b/macosx/HBHUDButtonCell.m
new file mode 100644 (file)
index 0000000..8f6228f
--- /dev/null
@@ -0,0 +1,22 @@
+//
+//  HBHUDButtonCell.m
+//  HandBrake
+//
+//  Created by Damiano Galassi on 17/08/14.
+//
+//
+
+#import "HBHUDButtonCell.h"
+
+@implementation HBHUDButtonCell
+
+- (NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:(NSView *)controlView
+{
+    NSAttributedString *attrLabel = [[[NSAttributedString alloc] initWithString:[title string]
+                                                                    attributes:@{ NSFontAttributeName:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:self.controlSize]],
+                                                                                  NSForegroundColorAttributeName: [NSColor whiteColor]}] autorelease];
+
+    return [super drawTitle:attrLabel withFrame:frame inView:controlView];
+}
+
+@end
diff --git a/macosx/HBJob.h b/macosx/HBJob.h
new file mode 100644 (file)
index 0000000..3521d46
--- /dev/null
@@ -0,0 +1,56 @@
+/*  HBJob.h $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+#import <Foundation/Foundation.h>
+
+#include "hb.h"
+
+@class HBPreset;
+
+@class HBVideo;
+@class HBPicture;
+@class HBFilters;
+
+@class HBAudioSettings;
+@class HBSubtitlesSettings;
+
+/**
+ * HBJob
+ */
+@interface HBJob : NSObject <NSCoding, NSCopying>
+
+- (instancetype)initWithTitle:(hb_title_t *)title url:(NSURL *)fileURL andPreset:(HBPreset *)preset;
+
+// libhb
+@property (nonatomic, readonly) hb_title_t *title;
+@property (nonatomic, readonly) NSURL *fileURL;
+
+// Old job format
+@property (nonatomic, readwrite, retain) NSDictionary *jobDict;
+@property (nonatomic, readonly) NSAttributedString *jobDescription;
+
+// Job settings
+
+@property (nonatomic, readwrite) int fileFormat;
+
+@property (nonatomic, readwrite) BOOL mp4LargeFile;
+@property (nonatomic, readwrite) BOOL mp4HttpOptimize;
+@property (nonatomic, readwrite) BOOL mp4iPodCompatible;
+
+@property (nonatomic, readonly) HBVideo *video;
+@property (nonatomic, readonly) HBPicture *picture;
+@property (nonatomic, readonly) HBFilters *filters;
+
+// Defaults settings
+@property (nonatomic, readonly) HBAudioSettings *audioSettings;
+@property (nonatomic, readonly) HBSubtitlesSettings *subtitlesSettings;
+
+// File resources
+@property (nonatomic, readonly) NSMutableArray *audioTracks;
+@property (nonatomic, readonly) NSMutableArray *subtitlesTracks;
+@property (nonatomic, readonly) NSMutableArray *chapters;
+
+@end
diff --git a/macosx/HBJob.m b/macosx/HBJob.m
new file mode 100644 (file)
index 0000000..78e6a31
--- /dev/null
@@ -0,0 +1,191 @@
+/*  HBJob.m $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+#import "HBJob.h"
+#import "HBAudioSettings.h"
+#import "HBSubtitlesSettings.h"
+#import "HBPreset.h"
+
+#include "lang.h"
+
+extern NSString *keyAudioTrackIndex;
+extern NSString *keyAudioTrackName;
+extern NSString *keyAudioInputBitrate;
+extern NSString *keyAudioInputSampleRate;
+extern NSString *keyAudioInputCodec;
+extern NSString *keyAudioInputCodecParam;
+extern NSString *keyAudioInputChannelLayout;
+extern NSString *keyAudioTrackLanguageIsoCode;
+
+extern NSString *keySubTrackName;
+extern NSString *keySubTrackIndex;
+extern NSString *keySubTrackLanguage;
+extern NSString *keySubTrackLanguageIsoCode;
+extern NSString *keySubTrackType;
+
+extern NSString *keySubTrackForced;
+extern NSString *keySubTrackBurned;
+extern NSString *keySubTrackDefault;
+
+extern NSString *keySubTrackSrtOffset;
+extern NSString *keySubTrackSrtFilePath;
+extern NSString *keySubTrackSrtCharCode;
+
+@implementation HBJob
+
+- (instancetype)initWithTitle:(hb_title_t *)title url:(NSURL *)fileURL andPreset:(HBPreset *)preset
+{
+    self = [super init];
+    if (self) {
+        _title = title;
+        _fileURL = [fileURL copy];
+
+        _audioTracks = [[NSMutableArray alloc] init];
+        _subtitlesTracks = [[NSMutableArray alloc] init];
+        _chapters = [[NSMutableArray alloc] init];
+
+        _audioSettings = [[HBAudioSettings alloc] init];
+        _subtitlesSettings = [[HBSubtitlesSettings alloc] init];
+
+        [self loadAudioTracks];
+        [self loadSubtitlesTracks];
+        [self loadChapters];
+    }
+    return self;
+}
+
+- (void)applyPreset:(HBPreset *)preset
+{
+    [self.audioSettings applySettingsFromPreset:preset.content];
+    [self.subtitlesSettings applySettingsFromPreset:preset.content];
+}
+
+#pragma mark - initialization
+
+- (void)loadAudioTracks
+{
+    hb_audio_config_t *audio;
+    hb_list_t *list = self.title->list_audio;
+    int count = hb_list_count(list);
+
+    // Initialize the audio list of available audio tracks from this title
+    for (int i = 0; i < count; i++)
+    {
+        audio = (hb_audio_config_t *) hb_list_audio_config_item(list, i);
+        [self.audioTracks addObject: @{keyAudioTrackIndex: @(i + 1),
+                                       keyAudioTrackName: [NSString stringWithFormat: @"%d: %s", i, audio->lang.description],
+                                       keyAudioInputBitrate: @(audio->in.bitrate / 1000),
+                                       keyAudioInputSampleRate: @(audio->in.samplerate),
+                                       keyAudioInputCodec: [NSNumber numberWithUnsignedInteger: audio->in.codec],
+                                       keyAudioInputCodecParam: [NSNumber numberWithUnsignedInteger: audio->in.codec_param],
+                                       keyAudioInputChannelLayout: @(audio->in.channel_layout),
+                                       keyAudioTrackLanguageIsoCode: @(audio->lang.iso639_2)}];
+    }
+}
+
+- (void)loadSubtitlesTracks
+{
+    hb_subtitle_t *subtitle;
+    hb_list_t *list = self.title->list_audio;
+    int count = hb_list_count(list);
+
+    NSMutableArray *forcedSourceNamesArray = [[NSMutableArray alloc] init];
+    //NSString *foreignAudioSearchTrackName = nil;
+
+    for (int i = 0; i < count; i++)
+    {
+        subtitle = (hb_subtitle_t *)hb_list_item(self.title->list_subtitle, i);
+
+        /* Human-readable representation of subtitle->source */
+        NSString *bitmapOrText  = subtitle->format == PICTURESUB ? @"Bitmap" : @"Text";
+        NSString *subSourceName = @(hb_subsource_name(subtitle->source));
+
+        /* if the subtitle track can be forced, add its source name to the array */
+        if (hb_subtitle_can_force(subtitle->source) && [forcedSourceNamesArray containsObject:subSourceName] == NO)
+        {
+            [forcedSourceNamesArray addObject:subSourceName];
+        }
+
+        // Use the native language name if available
+        iso639_lang_t *language = lang_for_code2(subtitle->iso639_2);
+        NSString *nativeLanguage = strlen(language->native_name) ? @(language->native_name) : @(language->eng_name);
+
+        /* create a dictionary of source subtitle information to store in our array */
+        [self.subtitlesTracks addObject:@{keySubTrackName: [NSString stringWithFormat:@"%d: %@ (%@) (%@)", i, nativeLanguage, bitmapOrText, subSourceName],
+                                          keySubTrackIndex: @(i),
+                                          keySubTrackType: @(subtitle->source),
+                                          keySubTrackLanguage: nativeLanguage,
+                                          keySubTrackLanguageIsoCode: @(subtitle->iso639_2)}];
+    }
+
+    /* now set the name of the Foreign Audio Search track */
+    if ([forcedSourceNamesArray count])
+    {
+        [forcedSourceNamesArray sortUsingComparator:^(id obj1, id obj2)
+         {
+             return [((NSString *)obj1) compare:((NSString *)obj2)];
+         }];
+
+        NSString *tempList = @"";
+        for (NSString *tempString in forcedSourceNamesArray)
+        {
+            if ([tempList length])
+            {
+                tempList = [tempList stringByAppendingString:@", "];
+            }
+            tempList = [tempList stringByAppendingString:tempString];
+        }
+        //foreignAudioSearchTrackName = [NSString stringWithFormat:@"Foreign Audio Search (Bitmap) (%@)", tempList];
+    }
+    else
+    {
+        //foreignAudioSearchTrackName = @"Foreign Audio Search (Bitmap)";
+    }
+    [forcedSourceNamesArray release];
+}
+
+- (void)loadChapters
+{
+    for (int i = 0; i < hb_list_count(self.title->job->list_chapter); i++)
+    {
+        hb_chapter_t *chapter = hb_list_item(self.title->job->list_chapter, i);
+        if (chapter != NULL)
+        {
+            if (chapter->title != NULL)
+            {
+                [self.chapters addObject:[NSString
+                                                stringWithFormat:@"%s",
+                                                chapter->title]];
+            }
+            else
+            {
+                [self.chapters addObject:[NSString
+                                                stringWithFormat:@"Chapter %d",
+                                                i + 1]];
+            }
+        }
+    }
+}
+
+#pragma mark - NSCoding
+
+- (void)encodeWithCoder:(NSCoder *)coder
+{
+}
+
+- (id)initWithCoder:(NSCoder *)decoder
+{
+    return nil;
+}
+
+#pragma mark - NSCopying
+
+- (instancetype)copyWithZone:(NSZone *)zone
+{
+    return nil;
+}
+
+@end
diff --git a/macosx/HBPicture.h b/macosx/HBPicture.h
new file mode 100644 (file)
index 0000000..4366d3e
--- /dev/null
@@ -0,0 +1,30 @@
+//
+//  HBPicture.h
+//  HandBrake
+//
+//  Created by Damiano Galassi on 12/08/14.
+//
+//
+
+#import <Foundation/Foundation.h>
+
+@interface HBPicture : NSObject
+
+/*
+ width
+ height
+
+ autocrop
+ crop[]
+ anamorphic {
+ mode
+ keepDisplayAspect
+ par_width
+ par_height
+ dar_width
+ dar_height
+ }
+ modulus
+ */
+
+@end
diff --git a/macosx/HBPicture.m b/macosx/HBPicture.m
new file mode 100644 (file)
index 0000000..bdbd2a6
--- /dev/null
@@ -0,0 +1,13 @@
+//
+//  HBPicture.m
+//  HandBrake
+//
+//  Created by Damiano Galassi on 12/08/14.
+//
+//
+
+#import "HBPicture.h"
+
+@implementation HBPicture
+
+@end
diff --git a/macosx/HBVideo.h b/macosx/HBVideo.h
new file mode 100644 (file)
index 0000000..3c17482
--- /dev/null
@@ -0,0 +1,34 @@
+//
+//  HBVideo.h
+//  HandBrake
+//
+//  Created by Damiano Galassi on 12/08/14.
+//
+//
+
+#import <Foundation/Foundation.h>
+
+@interface HBVideo : NSObject
+
+/*
+ videoEncoder
+ videoEncoderTag
+
+ qualityType
+ avgBitrate
+ quality
+
+ frameRate
+ frameRateTag
+ frameRateMode
+
+ fastFirstPass
+ twoPass
+ turboTwoPass
+
+ encoderOptions {
+ x264
+ lav
+ }*/
+
+@end
diff --git a/macosx/HBVideo.m b/macosx/HBVideo.m
new file mode 100644 (file)
index 0000000..ce662fb
--- /dev/null
@@ -0,0 +1,13 @@
+//
+//  HBVideo.m
+//  HandBrake
+//
+//  Created by Damiano Galassi on 12/08/14.
+//
+//
+
+#import "HBVideo.h"
+
+@implementation HBVideo
+
+@end
index c92c026eb573befa2a3309368ea790c4fa93e906..f7a6fc85175ec2d0458bb662ddd1bc5edc3f75a6 100644 (file)
                A932E273198834130047D13E /* HBAudioSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = A932E272198834130047D13E /* HBAudioSettings.m */; };
                A93E0ED31972957000FD67FB /* HBVideoController.m in Sources */ = {isa = PBXBuildFile; fileRef = A93E0ED11972957000FD67FB /* HBVideoController.m */; };
                A93E0ED71972958C00FD67FB /* Video.xib in Resources */ = {isa = PBXBuildFile; fileRef = A93E0ED51972958C00FD67FB /* Video.xib */; };
+               A9523937199A6AAE00588AEF /* HBFilters.m in Sources */ = {isa = PBXBuildFile; fileRef = A9523936199A6AAE00588AEF /* HBFilters.m */; };
                A98C29C41977B10600AF5DED /* HBLanguagesSelection.m in Sources */ = {isa = PBXBuildFile; fileRef = A98C29C31977B10600AF5DED /* HBLanguagesSelection.m */; };
                A9935213196F38A70069C6B7 /* ChaptersTitles.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9935211196F38A70069C6B7 /* ChaptersTitles.xib */; };
                A9AA447A1970664A00D7DEFC /* HBUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = A9AA44791970664A00D7DEFC /* HBUtilities.m */; };
+               A9BB0F2719A0ECE40079F1C1 /* HBHUDButtonCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A9BB0F2619A0ECE40079F1C1 /* HBHUDButtonCell.m */; };
                A9C0DB85197E7B0000DF55B3 /* SubtitlesDefaults.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9C0DB83197E7B0000DF55B3 /* SubtitlesDefaults.xib */; };
                A9CF25F11990D62C0023F727 /* Presets.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9CF25EF1990D62C0023F727 /* Presets.xib */; };
                A9CF25F41990D64E0023F727 /* HBPreset.m in Sources */ = {isa = PBXBuildFile; fileRef = A9CF25F31990D64E0023F727 /* HBPreset.m */; };
                A93E0ED01972957000FD67FB /* HBVideoController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBVideoController.h; sourceTree = "<group>"; };
                A93E0ED11972957000FD67FB /* HBVideoController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBVideoController.m; sourceTree = "<group>"; };
                A93E0ED61972958C00FD67FB /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Video.xib; sourceTree = "<group>"; };
+               A9523935199A6AAE00588AEF /* HBFilters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBFilters.h; sourceTree = "<group>"; };
+               A9523936199A6AAE00588AEF /* HBFilters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBFilters.m; sourceTree = "<group>"; };
                A98C29C21977B10600AF5DED /* HBLanguagesSelection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBLanguagesSelection.h; sourceTree = "<group>"; };
                A98C29C31977B10600AF5DED /* HBLanguagesSelection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBLanguagesSelection.m; sourceTree = "<group>"; };
                A9935212196F38A70069C6B7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = ChaptersTitles.xib; sourceTree = "<group>"; };
                A9AA447C1970726500D7DEFC /* HBQueueController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBQueueController.h; sourceTree = "<group>"; };
                A9AA447D1970729300D7DEFC /* HBPreviewGenerator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBPreviewGenerator.h; sourceTree = "<group>"; };
                A9B34D74197696FE00871B7D /* DiskArbitration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiskArbitration.framework; path = System/Library/Frameworks/DiskArbitration.framework; sourceTree = SDKROOT; };
+               A9BB0F2519A0ECE40079F1C1 /* HBHUDButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBHUDButtonCell.h; sourceTree = "<group>"; };
+               A9BB0F2619A0ECE40079F1C1 /* HBHUDButtonCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBHUDButtonCell.m; sourceTree = "<group>"; };
                A9C0DB84197E7B0000DF55B3 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = SubtitlesDefaults.xib; sourceTree = "<group>"; };
                A9CF25F01990D62C0023F727 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Presets.xib; sourceTree = "<group>"; };
                A9CF25F21990D64E0023F727 /* HBPreset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPreset.h; sourceTree = "<group>"; };
                        children = (
                                A9B34D6F197683FE00871B7D /* Controllers */,
                                A98C29C51977C00000AF5DED /* Model */,
+                               A952392E199A647F00588AEF /* Presets */,
                                A9AA447D1970729300D7DEFC /* HBPreviewGenerator.h */,
                                A9D1E41618262364002F6424 /* HBPreviewGenerator.m */,
                                A9AA44781970664A00D7DEFC /* HBUtilities.h */,
                                273F209814ADBE670021BE6D /* HBDVDDetector.m */,
                                273F209D14ADBE670021BE6D /* HBOutputRedirect.h */,
                                273F209E14ADBE670021BE6D /* HBOutputRedirect.m */,
+                               A98C29C21977B10600AF5DED /* HBLanguagesSelection.h */,
+                               A98C29C31977B10600AF5DED /* HBLanguagesSelection.m */,
                                A9B34D711976844500871B7D /* UI Views */,
                                273F20BD14ADC09F0021BE6D /* main.mm */,
                        );
                        name = "Audio Defaults";
                        sourceTree = "<group>";
                };
-               A98C29C51977C00000AF5DED /* Model */ = {
+               A952392E199A647F00588AEF /* Presets */ = {
                        isa = PBXGroup;
                        children = (
                                273F20A114ADBE670021BE6D /* HBPresetsManager.h */,
                                A9CF25F31990D64E0023F727 /* HBPreset.m */,
                                A9D488A31996270300E9B1BA /* HBTreeNode.h */,
                                A9D488A41996270300E9B1BA /* HBTreeNode.m */,
+                       );
+                       name = Presets;
+                       sourceTree = "<group>";
+               };
+               A98C29C51977C00000AF5DED /* Model */ = {
+                       isa = PBXGroup;
+                       children = (
                                A932E271198834130047D13E /* HBAudioSettings.h */,
                                A932E272198834130047D13E /* HBAudioSettings.m */,
                                A9F4728B1976BAA70009EC65 /* HBSubtitlesSettings.h */,
                                A9F4728C1976BAA70009EC65 /* HBSubtitlesSettings.m */,
+                               273F209114ADBE670021BE6D /* HBAudio.h */,
+                               273F209214ADBE670021BE6D /* HBAudio.m */,
                                A90A0CAD1988D57200DA65CE /* HBAudioTrackPreset.h */,
                                A90A0CAE1988D57200DA65CE /* HBAudioTrackPreset.m */,
-                               A98C29C21977B10600AF5DED /* HBLanguagesSelection.h */,
-                               A98C29C31977B10600AF5DED /* HBLanguagesSelection.m */,
+                               A9523935199A6AAE00588AEF /* HBFilters.h */,
+                               A9523936199A6AAE00588AEF /* HBFilters.m */,
                        );
                        name = Model;
                        sourceTree = "<group>";
                                A93E0ED11972957000FD67FB /* HBVideoController.m */,
                                A9AA447B1970724D00D7DEFC /* HBAdvancedController.h */,
                                273F209014ADBE670021BE6D /* HBAdvancedController.m */,
-                               273F209114ADBE670021BE6D /* HBAudio.h */,
-                               273F209214ADBE670021BE6D /* HBAudio.m */,
                                273F209314ADBE670021BE6D /* HBAudioController.h */,
                                273F209414ADBE670021BE6D /* HBAudioController.m */,
                                A932E270198833960047D13E /* Audio Defaults */,
                                46AB433415F98A2B009C0961 /* DockTextField.m */,
                                273F209914ADBE670021BE6D /* HBImageAndTextCell.h */,
                                273F209A14ADBE670021BE6D /* HBImageAndTextCell.m */,
+                               A9BB0F2519A0ECE40079F1C1 /* HBHUDButtonCell.h */,
+                               A9BB0F2619A0ECE40079F1C1 /* HBHUDButtonCell.m */,
                        );
                        name = "UI Views";
                        sourceTree = "<group>";
                        buildActionMask = 2147483647;
                        files = (
                                A98C29C41977B10600AF5DED /* HBLanguagesSelection.m in Sources */,
+                               A9BB0F2719A0ECE40079F1C1 /* HBHUDButtonCell.m in Sources */,
                                A932E273198834130047D13E /* HBAudioSettings.m in Sources */,
+                               A9523937199A6AAE00588AEF /* HBFilters.m in Sources */,
                                A9AA447A1970664A00D7DEFC /* HBUtilities.m in Sources */,
                                273F20AC14ADBE670021BE6D /* Controller.m in Sources */,
                                273F20AD14ADBE670021BE6D /* HBAdvancedController.m in Sources */,
index 23c8ed16994931713d0dfb3fc3e68b07f2bebe60..777868efb99f3e09caf1dfa59a3768564439657a 100644 (file)
@@ -5,6 +5,7 @@
    It may be used under the terms of the GNU General Public License. */
 
 #import <Cocoa/Cocoa.h>
+#import "HBFilters.h"
 #include "hb.h"
 
 @protocol HBPictureControllerDelegate <NSObject>
 
 @interface HBPictureController : NSWindowController <NSWindowDelegate>
 
-@property (nonatomic, readwrite) NSInteger detelecine;
-@property (nonatomic, readwrite, copy) NSString *detelecineCustomString;
-
-@property (nonatomic, readwrite) NSInteger deinterlace;
-@property (nonatomic, readwrite, copy) NSString *deinterlaceCustomString;
-
-@property (nonatomic, readwrite) NSInteger decomb;
-@property (nonatomic, readwrite, copy) NSString *decombCustomString;
-
-@property (nonatomic, readwrite) NSInteger denoise;
-@property (nonatomic, readwrite, copy) NSString *denoiseCustomString;
-
-@property (nonatomic, readwrite) NSInteger deblock;
-@property (nonatomic, readwrite) NSInteger grayscale;
-
+@property (nonatomic, readwrite, retain) HBFilters *filters;
 @property (nonatomic, readwrite) BOOL autoCrop;
-@property (nonatomic, readwrite) NSInteger useDecomb;
 
 @property (nonatomic, readwrite, assign) id <HBPictureControllerDelegate> delegate;
 
index 7b8d88722ee38bdea32695dfe5b9dd6cadaf2621..901bb5fe2a686adf3d037a820e13d392afc5741e 100644 (file)
@@ -8,6 +8,33 @@
 #import "PictureController.h"
 #import "HBPreviewController.h"
 
+@interface HBCustomFilterTransformer : NSValueTransformer
+@end
+
+@implementation HBCustomFilterTransformer
+
++ (Class)transformedValueClass
+{
+    return [NSNumber class];
+}
+
+- (id)transformedValue:(id)value
+{
+    if ([value intValue] == 1)
+        return @NO;
+    else
+        return @YES;
+}
+
++ (BOOL)allowsReverseTransformation
+{
+    return NO;
+}
+
+@end
+
+static void *HBPictureControllerContext = &HBPictureControllerContext;
+
 @interface HBPictureController ()
 {
     hb_title_t               * fTitle;
 
     /* Video Filters */
     IBOutlet NSBox           * fDetelecineBox;
-    IBOutlet NSPopUpButton   * fDetelecinePopUp;
-
     IBOutlet NSBox           * fDecombDeinterlaceBox;
-    IBOutlet NSSlider        * fDecombDeinterlaceSlider;
-
     IBOutlet NSBox           * fDecombBox;
-    IBOutlet NSPopUpButton   * fDecombPopUp;
-
     IBOutlet NSBox           * fDeinterlaceBox;
-    IBOutlet NSPopUpButton   * fDeinterlacePopUp;
 
-    IBOutlet NSBox           * fDenoiseBox;
-    IBOutlet NSPopUpButton   * fDenoisePopUp;
-
-    IBOutlet NSBox           * fDeblockBox; // also holds the grayscale box
     IBOutlet NSTextField     * fDeblockField;
-    IBOutlet NSSlider        * fDeblockSlider;
 
-    IBOutlet NSButton        * fGrayscaleCheck;
+    IBOutlet NSTextField    *fDenoisePreset;
+    IBOutlet NSPopUpButton  *fDenoisePresetPopUp;
+    IBOutlet NSTextField    *fDenoiseTuneLabel;
+    IBOutlet NSPopUpButton  *fDenoiseTunePopUp;
+    IBOutlet NSTextField    *fDenoiseCustomLabel;
+    IBOutlet NSTextField    *fDenoiseCustomField;
 }
 
-- (void) tabView: (NSTabView *) tabView didSelectTabViewItem: (NSTabViewItem *) tabViewItem;
-
-- (void) resizeInspectorForTab: (id) sender;
-
-- (void) adjustSizingDisplay:(id) sender;
-- (void) adjustFilterDisplay: (id) sender;
-
-- (void) reloadStillPreview;
-
-/* Internal Actions */
-- (IBAction) settingsChanged: (id) sender;
-- (IBAction) FilterSettingsChanged: (id) sender;
-- (IBAction) modeDecombDeinterlaceSliderChanged: (id) sender;
-- (IBAction) deblockSliderChanged: (id) sender;
-
 @end
 
 @implementation HBPictureController
 
-- (id) init
+- (instancetype)init
 {
        if (self = [super initWithWindowNibName:@"PictureSettings"])
        {
+        _filters = [[HBFilters alloc] init];
+
         // NSWindowController likes to lazily load its window. However since
         // this controller tries to set all sorts of outlets before the window
         // is displayed, we need it to load immediately. The correct way to do
         // go away.
         [self window];
 
-        _detelecineCustomString = @"";
-        _deinterlaceCustomString = @"";
-        _decombCustomString = @"";
-        _denoiseCustomString = @"";
+        // Add the observers for the filters values
+        NSArray *observerdKeyPaths = @[@"filters.detelecine", @"filters.detelecineCustomString",
+                                       @"filters.deinterlace", @"filters.deinterlaceCustomString",
+                                       @"filters.decomb", @"filters.decombCustomString",
+                                       @"filters.denoise", @"filters.denoisePreset",
+                                       @"filters.denoiseTune", @"filters.denoiseCustomString",
+                                       @"filters.deblock", @"filters.grayscale", @"filters.useDecomb"];
+        for (NSString *keyPath in observerdKeyPaths)
+        {
+            [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionInitial context:HBPictureControllerContext];
+        }
 
         fPreviewController = [[HBPreviewController alloc] init];
     }
        return self;
 }
 
-- (void) awakeFromNib
+- (void) dealloc
 {
-    [[self window] setDelegate:self];
+    NSArray *observerdKeyPaths = @[@"filters.detelecine", @"filters.detelecineCustomString",
+                                   @"filters.deinterlace", @"filters.deinterlaceCustomString",
+                                   @"filters.decomb", @"filters.decombCustomString",
+                                   @"filters.denoise", @"filters.denoisePreset",
+                                   @"filters.denoiseTune", @"filters.denoiseCustomString",
+                                   @"filters.deblock", @"filters.grayscale", @"filters.useDecomb"];
+    @try {
+        for (NSString *keyPath in observerdKeyPaths)
+        {
+            [self removeObserver:self forKeyPath:keyPath];
+        }
 
-    if( ![[self window] setFrameUsingName:@"PictureSizing"] )
-        [[self window] center];
+    } @catch (NSException * __unused exception) {}
 
-    [self setWindowFrameAutosaveName:@"PictureSizing"];
+    [_filters release];
+    [fPreviewController release];
+    [super dealloc];
+}
+
+- (void)windowDidLoad
+{
     [[self window] setExcludedFromWindowsMenu:YES];
 
     /* Populate the user interface */
     [fWidthStepper  setValueWraps: NO];
-    [fWidthStepper  setIncrement: 16];
-    [fWidthStepper  setMinValue: 64];
     [fHeightStepper setValueWraps: NO];
-    [fHeightStepper setIncrement: 16];
-    [fHeightStepper setMinValue: 64];
 
     [fCropTopStepper    setIncrement: 2];
     [fCropTopStepper    setMinValue:  0];
     [fModulusPopUp removeAllItems];
     [fModulusPopUp addItemsWithTitles:@[@"16", @"8", @"4", @"2"]];
 
-    /* we use a popup to show the detelecine settings */
-    [fDetelecinePopUp removeAllItems];
-    [fDetelecinePopUp addItemsWithTitles:@[@"Off", @"Custom", @"Default"]];
-    [fDetelecinePopUp selectItemAtIndex: self.detelecine];
-
-    /* we use a popup to show the decomb settings */
-       [fDecombPopUp removeAllItems];
-    [fDecombPopUp addItemsWithTitles:@[@"Off", @"Custom", @"Default", @"Fast", @"Bob"]];
-    [self modeDecombDeinterlaceSliderChanged:nil];
-    [fDecombPopUp selectItemAtIndex: self.decomb];
-
-    /* we use a popup to show the deinterlace settings */
-       [fDeinterlacePopUp removeAllItems];
-    [fDeinterlacePopUp addItemsWithTitles:@[@"Off", @"Custom", @"Fast", @"Slow", @"Slower", @"Bob"]];
-    [fDeinterlacePopUp selectItemAtIndex: self.deinterlace];
-
-    /* we use a popup to show the denoise settings */
-       [fDenoisePopUp removeAllItems];
-    [fDenoisePopUp addItemsWithTitles:@[@"Off", @"Custom", @"Weak", @"Medium", @"Strong"]];
-    [fDenoisePopUp selectItemAtIndex: self.denoise];
+    [self resizeInspectorForTab:nil];
+    [self adjustSizingDisplay:nil];
 }
 
 - (void) setHandle: (hb_handle_t *) handle
                                  job->anamorphic.par_height;
     [fDisplayWidthField setIntValue: display_width];
 
+    [fPreviewController setTitle:title];
 
-    /* Set filters widgets according to the filters struct */
-    [fDetelecinePopUp selectItemAtIndex:self.detelecine];
-    [fDecombPopUp selectItemAtIndex:self.decomb];
-    [fDeinterlacePopUp selectItemAtIndex: self.deinterlace];
-    [fDenoisePopUp selectItemAtIndex: self.denoise];
-    [fDeblockSlider setFloatValue:self.deblock];
-    [fGrayscaleCheck setState:self.grayscale];
+    [self settingsChanged:nil];
+}
 
-    [self deblockSliderChanged: nil];
+#pragma mark - KVO
 
-    [fPreviewController setTitle:title];
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
+{
+    if (context == HBPictureControllerContext)
+    {
+        // We use KVO to update the panel
+        // and notify the main controller of the changes
+        // in the filters settings.
+        if ([keyPath isEqualToString:@"filters.useDecomb"])
+        {
+            if (self.filters.useDecomb)
+            {
+                [fDecombBox setHidden:NO];
+                [fDeinterlaceBox setHidden:YES];
+            }
+            else
+            {
+                [fDecombBox setHidden:YES];
+                [fDeinterlaceBox setHidden:NO];
+            }
+        }
+        else if ([keyPath isEqualToString:@"filters.deblock"])
+        {
+            // The minimum deblock value is 5,
+            // set it to 0 if the value is
+            // less than 4.
+            if (self.filters.deblock == 4)
+            {
+                [fDeblockField setStringValue: @"Off"];
+                self.filters.deblock = 0;
+            }
+            else if (self.filters.deblock > 4)
+            {
+                [fDeblockField setStringValue:[NSString stringWithFormat: @"%.0ld", (long)self.filters.deblock]];
+            }
+        }
+        else if ([keyPath isEqualToString:@"filters.deinterlace"] || [keyPath isEqualToString:@"filters.decomb"])
+        {
+            // Might need to update the preview images with
+            // the new deinterlace/decomb setting.
+            if ((self.filters.deinterlace && !self.filters.useDecomb) ||
+                (self.filters.decomb && self.filters.useDecomb))
+            {
+                fPreviewController.deinterlacePreview = YES;
+            }
+            else
+            {
+                fPreviewController.deinterlacePreview = NO;
+            }
+            [fPreviewController reload];
+        }
+        else if ([keyPath isEqualToString:@"filters.denoise"] || [keyPath isEqualToString:@"filters.denoisePreset"])
+        {
+            [self validateDenoiseUI];
+        }
 
-    [self FilterSettingsChanged:nil];
-    [self settingsChanged:nil];
+        // If one of the filters properties changes
+        // update the UI in the main window
+        if ([keyPath hasPrefix:@"filters"])
+        {
+            [self.delegate pictureSettingsDidChange];
+        }
+    }
+    else
+    {
+        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
+    }
+}
+
+/**
+ *  Validates the denoise UI items,
+ *  disables/enables the right ones.
+ */
+- (void)validateDenoiseUI
+{
+    if ([self.filters.denoise isEqualToString:@"off"])
+    {
+        NSArray *uiElements = @[fDenoisePreset, fDenoisePresetPopUp,
+                                fDenoiseTuneLabel, fDenoiseTunePopUp,
+                                fDenoiseCustomLabel, fDenoiseCustomField];
+        for (NSView *view in uiElements)
+            [view setHidden:YES];
+    }
+    else
+    {
+        NSArray *uiElements = @[fDenoisePreset, fDenoisePresetPopUp];
+        for (NSView *view in uiElements)
+            [view setHidden:NO];
+
+        if ([self.filters.denoisePreset isEqualToString:@"none"])
+        {
+            [fDenoiseTuneLabel setHidden:YES];
+            [fDenoiseTunePopUp setHidden:YES];
+            [fDenoiseCustomLabel setHidden:NO];
+            [fDenoiseCustomField setHidden:NO];
+        }
+        else if ([self.filters.denoise isEqualToString:@"hqdn3d"])
+        {
+            [fDenoiseTuneLabel setHidden:YES];
+            [fDenoiseTunePopUp setHidden:YES];
+            [fDenoiseCustomLabel setHidden:YES];
+            [fDenoiseCustomField setHidden:YES];
+        }
+        else
+        {
+            [fDenoiseTuneLabel setHidden:NO];
+            [fDenoiseTunePopUp setHidden:NO];
+            [fDenoiseCustomLabel setHidden:YES];
+            [fDenoiseCustomField setHidden:YES];
+        }
+    }
 }
 
 #pragma mark -
     /* we are 1 which is Filters*/
     if ([fSizeFilterView indexOfTabViewItem: [fSizeFilterView selectedTabViewItem]] == 1)
     {
-        frame.size.width = 314;
+        frame.size.width = 484;
         /* we glean the height from the size of the boxes plus the extra window space
          * needed for non boxed display
          */
-        frame.size.height = 110.0 + [fDetelecineBox frame].size.height + [fDecombDeinterlaceBox frame].size.height + [fDenoiseBox frame].size.height + [fDeblockBox frame].size.height;
+        frame.size.height = 100.0 + [fDetelecineBox frame].size.height + [fDecombDeinterlaceBox frame].size.height;
         /* Hide the size readout at the bottom as the vertical inspector is not wide enough */
-        [fSizeInfoField setHidden:YES];
     }
     else // we are Tab index 0 which is size
     {
         frame.size.width = 30.0 + [fPictureSizeBox frame].size.width + [fPictureCropBox frame].size.width;
         frame.size.height = [fPictureSizeBox frame].size.height + 90;
         /* hide the size summary field at the bottom */
-        [fSizeInfoField setHidden:NO];
     }
     /* get delta's for the change in window size */
     CGFloat deltaX = frame.size.width - [[self window] frame].size.width;
     [self resizeInspectorForTab:nil];
 }
 
-- (void) adjustFilterDisplay: (id) sender
-{
-    NSBox *filterBox = nil;
-    if (sender == fDetelecinePopUp)
-    {
-        filterBox = fDetelecineBox;
-    }
-
-    if (sender == fDecombDeinterlaceSlider)
-    {
-        if ([fDecombDeinterlaceSlider floatValue] == 0.0)
-        {
-            filterBox = fDecombBox;
-        }
-        else
-        {
-            filterBox = fDeinterlaceBox;
-        }
-    }
-
-    if (sender == fDecombPopUp)
-    {
-        filterBox = fDecombBox;
-    }
-
-    if (sender == fDeinterlacePopUp)
-    {
-        filterBox = fDeinterlaceBox;
-    }
-
-    if (sender == fDenoisePopUp)
-    {
-        filterBox = fDenoiseBox;
-    }
-
-    NSSize currentSize = [filterBox frame].size;
-    NSRect boxFrame = [filterBox frame];
-
-    if ([[sender titleOfSelectedItem]  isEqualToString: @"Custom"])
-    {
-        currentSize.height = 60;
-    }
-    else
-    {
-        currentSize.height = 36;
-    }
-
-    /* Check to see if we have changed the size from current */
-    if (currentSize.height != [filterBox frame].size.height)
-    {
-        /* We are changing the size of the box, so recalc the origin */
-        NSPoint boxOrigin = [filterBox frame].origin;
-        /* We get the deltaY here for how much we are expanding/contracting the box vertically */
-        CGFloat deltaYBoxShift = currentSize.height - [filterBox frame].size.height;
-        boxOrigin.y -= deltaYBoxShift;
-
-        boxFrame.size.height = currentSize.height;
-        boxFrame.origin.y = boxOrigin.y;
-        [filterBox setFrame:boxFrame];
-
-        if (filterBox == fDecombBox || filterBox == fDeinterlaceBox)
-        {
-            /* fDecombDeinterlaceBox*/
-            NSSize decombDeinterlaceBoxSize = [fDecombDeinterlaceBox frame].size;
-            NSPoint decombDeinterlaceBoxOrigin = [fDecombDeinterlaceBox frame].origin;
-
-            if ([fDeinterlaceBox isHidden] == YES)
-            {
-                decombDeinterlaceBoxSize.height = [fDecombBox frame].size.height + 50;
-            }
-            else
-            {
-                decombDeinterlaceBoxSize.height = [fDeinterlaceBox frame].size.height + 50;
-            }
-            /* get delta's for the change in window size */
-
-            CGFloat deltaYdecombDeinterlace = decombDeinterlaceBoxSize.height - [fDecombDeinterlaceBox frame].size.height;
-
-            deltaYBoxShift = deltaYdecombDeinterlace;
-
-            decombDeinterlaceBoxOrigin.y -= deltaYdecombDeinterlace;
-
-            [fDecombDeinterlaceBox setFrameSize:decombDeinterlaceBoxSize];
-            [fDecombDeinterlaceBox setFrameOrigin:decombDeinterlaceBoxOrigin];
-        }
-
-        /* now we must reset the origin of each box below the adjusted box*/
-        NSPoint decombDeintOrigin = [fDecombDeinterlaceBox frame].origin;
-        NSPoint denoiseOrigin = [fDenoiseBox frame].origin;
-        NSPoint deblockOrigin = [fDeblockBox frame].origin;
-        if (sender == fDetelecinePopUp)
-        {
-            decombDeintOrigin.y -= deltaYBoxShift;
-            [fDecombDeinterlaceBox setFrameOrigin:decombDeintOrigin];
-
-            denoiseOrigin.y -= deltaYBoxShift;
-            [fDenoiseBox setFrameOrigin:denoiseOrigin];
-
-            deblockOrigin.y -= deltaYBoxShift;
-            [fDeblockBox setFrameOrigin:deblockOrigin];
-        }
-        if (sender == fDecombPopUp || sender == fDeinterlacePopUp)
-        {
-            denoiseOrigin.y -= deltaYBoxShift;
-            [fDenoiseBox setFrameOrigin:denoiseOrigin];
-
-            deblockOrigin.y -= deltaYBoxShift;
-            [fDeblockBox setFrameOrigin:deblockOrigin];
-        }
-
-        if (sender == fDenoisePopUp)
-        {
-            deblockOrigin.y -= deltaYBoxShift;
-            [fDeblockBox setFrameOrigin:deblockOrigin];
-        }
-
-        /* now we call to resize the entire inspector window */
-        [self resizeInspectorForTab:nil];
-    }
-}
-
 - (NSString *) pictureSizeInfoString
 {
     return [fSizeInfoField stringValue];
 }
 
-- (void) reloadStillPreview
-{
-    [fPreviewController reload];
-}
-
 #pragma mark -
 
 /**
         [[self window] setLevel:NSFloatingWindowLevel];
     }
 
-    [self adjustFilterDisplay:nil];
+    [self resizeInspectorForTab:nil];
     [self adjustSizingDisplay:nil];
 }
 
     [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"PictureSizeWindowIsOpen"];
 }
 
-- (BOOL) windowShouldClose: (id) sender
-{
-    return YES;
-}
-
 /**
  * This method is used to detect clicking on a tab in fSizeFilterView
  */
     [self resizeInspectorForTab:nil];
 }
 
-- (void) dealloc
-{
-    [fPreviewController release];
-    [super dealloc];
-}
-
-#pragma mark -
-#pragma mark Interface Update Logic
+#pragma mark - Picture Update Logic
 
 - (IBAction) settingsChanged: (id) sender
 {
      */
     if (job->width >= 64 && job->height >= 64)
     {
-        [self reloadStillPreview];
+        [fPreviewController reload];
     }
 
     /* we get the sizing info to display from fPreviewController */
     }
 }
 
-- (IBAction) modeDecombDeinterlaceSliderChanged: (id) sender
-{
-    /* since its a tickless slider, we have to  make sure we are on or off */
-    if ([fDecombDeinterlaceSlider floatValue] < 0.50)
-    {
-        [fDecombDeinterlaceSlider setFloatValue:0.0];
-    }
-    else
-    {
-        [fDecombDeinterlaceSlider setFloatValue:1.0];
-    }
-
-    /* Decomb selected*/
-    if ([fDecombDeinterlaceSlider floatValue] == 0.0)
-    {
-        [fDecombBox setHidden:NO];
-        [fDeinterlaceBox setHidden:YES];
-        self.decomb = [fDecombPopUp indexOfSelectedItem];
-        _useDecomb = 1;
-        self.deinterlace = 0;
-        [fDecombPopUp selectItemAtIndex:self.decomb];
-        [self adjustFilterDisplay:fDecombPopUp];
-    }
-    else
-    {
-        [fDecombBox setHidden:YES];
-        [fDeinterlaceBox setHidden:NO];
-        _useDecomb = 0;
-        self.decomb = 0;
-        [fDeinterlacePopUp selectItemAtIndex: self.deinterlace];
-        [self adjustFilterDisplay:fDeinterlacePopUp];
-    }
-
-    [self FilterSettingsChanged: fDecombDeinterlaceSlider];
-}
-
-
-- (IBAction) FilterSettingsChanged: (id) sender
-{
-    if (!fTitle)
-        return;
-
-    self.detelecine  = [fDetelecinePopUp indexOfSelectedItem];
-    [self adjustFilterDisplay:fDetelecinePopUp];
-
-    self.decomb = [fDecombPopUp indexOfSelectedItem];
-    [self adjustFilterDisplay:fDecombPopUp];
-
-    self.deinterlace = [fDeinterlacePopUp indexOfSelectedItem];
-    [self adjustFilterDisplay:fDeinterlacePopUp];
-
-    self.denoise = [fDenoisePopUp indexOfSelectedItem];
-    [self adjustFilterDisplay:fDenoisePopUp];
-
-    if ([[fDeblockField stringValue] isEqualToString:@"Off"])
-    {
-        self.deblock  = 0;
-    }
-    else
-    {
-        self.deblock  = [fDeblockField intValue];
-    }
-
-    // Tell PreviewController whether it should deinterlace
-    // the previews or not
-    if ((self.deinterlace && !self.useDecomb) ||
-        (self.decomb && self.useDecomb))
-    {
-        fPreviewController.deinterlacePreview = YES;
-    }
-    else
-    {
-        fPreviewController.deinterlacePreview = NO;
-    }
-
-    self.grayscale = [fGrayscaleCheck state];
-
-    if (sender != nil)
-    {
-        [self.delegate pictureSettingsDidChange];
-        [self reloadStillPreview];
-    }
-}
-
-- (IBAction) deblockSliderChanged: (id) sender
-{
-    if ([fDeblockSlider floatValue] == 4.0)
-    {
-        [fDeblockField setStringValue: @"Off"];
-    }
-    else
-    {
-        [fDeblockField setStringValue: [NSString stringWithFormat: @"%.0f", [fDeblockSlider floatValue]]];
-    }
-       [self FilterSettingsChanged: sender];
-}
-
-#pragma mark -
-
-- (void) setUseDecomb: (NSInteger) setting
-{
-    _useDecomb = setting;
-    if (self.useDecomb == 1)
-    {
-        [fDecombDeinterlaceSlider setFloatValue:0.0];
-    }
-    else
-    {
-        [fDecombDeinterlaceSlider setFloatValue:1.0];
-    }
-    
-    [self modeDecombDeinterlaceSliderChanged:nil];
-}
-
 @end