All pastes #742571 Raw Edit

Unnamed

public diff v1 · immutable
·published 2007-10-19 17:13 UTC
rendered paste body
Index: macosx/PictureController.mm===================================================================--- macosx/PictureController.mm	(revision 1031)+++ macosx/PictureController.mm	(working copy)@@ -116,8 +116,22 @@      	/* Set deinterlaces level according to the integer in the main window */ 	[fDeinterlacePopUp selectItemAtIndex: fPictureFilterSettings.deinterlace];--	[fPARCheck setState:(job->pixel_ratio ? NSOnState : NSOffState)];+    +     /* we set the anamorphic checkbox according to the prefs+     * job->pixel_ratio values can be as follows:+     * 0 = No Anamorphic+     * 1 = "Strict" Anamorphic (Handbrake's original anamorphic implementation+     * 2 = "Loose" Anamorphic (implementation which allows for 640 xxxx anamorphic)+     */+    if (job->pixel_ratio > 0)+    {+    /* must be either 1(strict) or 2 (loose) anamorphic*/+	[fPARCheck setState:NSOnState];+    }+    else+    {+    [fPARCheck setState:NSOffState];+    }     /* We initially set the previous state of keep ar to on */     keepAspectRatioPreviousState = 1; 	if (!autoCrop)@@ -149,8 +163,6 @@ 	/* Set denoises level according to the integer in the main window */ 	[fDenoisePopUp selectItemAtIndex: fPictureFilterSettings.denoise]; 	-    MaxOutputWidth = job->width;-	MaxOutputHeight = job->height;     fPicture = 0;      [self SettingsChanged: nil];@@ -197,25 +209,52 @@         height: ( fTitle->height + 2 )]; 	 	/* Set the Output Display below the Preview Picture*/-	int titlewidth = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3]; 	int arpwidth = fTitle->job->pixel_aspect_width; 	int arpheight = fTitle->job->pixel_aspect_height;-	int displayparwidth = titlewidth * arpwidth / arpheight;+	int displayparwidth = croppedWidth * arpwidth / arpheight; 	int displayparheight = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1];      NSSize displaySize = NSMakeSize( (float)fTitle->width, (float)fTitle->height );-    if( fTitle->job->pixel_ratio == 1 )+    if( fTitle->job->pixel_ratio > 0)     {-        [fInfoField setStringValue:[NSString stringWithFormat:-                            @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d",-                            fTitle->width, fTitle->height, titlewidth,-                            displayparheight, displayparwidth, displayparheight]];-        displaySize.width *= ((float)arpwidth) / ((float)arpheight);+        if (fTitle->job->pixel_ratio == 1) // strict anamorphic+        {+            [fInfoField setStringValue:[NSString stringWithFormat:+                                                         @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d",+                fTitle->width, fTitle->height, croppedWidth,+                displayparheight, displayparwidth, displayparheight]];+            displaySize.width *= ((float)arpwidth) / ((float)arpheight);+        }+        else // Loose Anamorphic+        {+            /* Not real sure if this is applicable to the gui */+            +            +            /* The film AR is the source's display width / cropped source height.+            The output display width is the output height * film AR.+            The output PAR is the output display width / output storage width. */+            //fTitle->job->pixel_aspect_width = fTitle->job->height * source_display_width / croppedHeight;+            //fTitle->job->pixel_aspect_height = fTitle->job->width;+            +            +            //displayparwidth = croppedWidth * arpwidth / arpheight;+            //displayparheight = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1];+            +            [fInfoField setStringValue:[NSString stringWithFormat:+                                                         @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d",+                croppedWidth, croppedHeight, fTitle->job->width,+                fTitle->job->height, sourceDisplayWidth, fTitle->job->height]];+       +            +            displaySize.width *= ((float)arpwidth) / ((float)arpheight);+            ++        }     }     else     {     [fInfoField setStringValue: [NSString stringWithFormat:-        @"Source: %dx%d, Output: %dx%d", fTitle->width, fTitle->height,+        @"Source: %dx%d, Output: %dx%d", croppedWidth, croppedHeight,         fTitle->job->width, fTitle->job->height]];     } @@ -242,54 +281,239 @@     [fPrevButton setEnabled: ( fPicture > 0 )];     [fNextButton setEnabled: ( fPicture < 9 )]; }- - (IBAction) SettingsChanged: (id) sender {     hb_job_t * job = fTitle->job;-    -	if( [fPARCheck state] == NSOnState )-	{-        [fWidthStepper      setIntValue: MaxOutputWidth];-        [fWidthField        setIntValue: MaxOutputWidth];++job->width       = [fWidthStepper  intValue];+job->height      = [fHeightStepper intValue];++/* We set the job->crop values here as they are needed for proper par calculation below */+    if( autoCrop )+    {+        memcpy( job->crop, fTitle->crop, 4 * sizeof( int ) );+    }+    else+    {+        job->crop[0] = [fCropTopStepper    intValue];+        job->crop[1] = [fCropBottomStepper intValue];+        job->crop[2] = [fCropLeftStepper   intValue];+        job->crop[3] = [fCropRightStepper  intValue];+    }+/* we set the variables to keep the math easier */+maxOutputWidth = job->width;+maxOutputHeight = job->height;+croppedWidth = fTitle->width - job->crop[2] - job->crop[3] ;+croppedHeight = fTitle->height - job->crop[0] - job->crop[1] ;+storageAspect = croppedWidth * 10000 / croppedHeight;    +if( [fPARCheck state] == NSOnState )+{+/* if the sender is the Anamorphic checkbox, record the state+        of KeepAspect Ratio so it can be reset if Anamorphic is unchecked again */+    if (sender == fPARCheck)+    {+        keepAspectRatioPreviousState = [fRatioCheck state];+    }+++    /* check to see if we are using strict anamorphic, or loose anamorphic in the prefs */+    if ( [[NSUserDefaults standardUserDefaults] boolForKey:@"UseStrictAnamorphic"] > 0)+    {+        /* We are using strict anamorphic */+        job->pixel_ratio = 1;+        [fWidthStepper      setIntValue: maxOutputWidth];+        [fWidthField        setIntValue: maxOutputWidth];                  /* This will show correct anamorphic height values, but             show distorted preview picture ratio */-        [fHeightStepper      setIntValue: fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]];-        [fHeightField        setIntValue: fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]];--        /* if the sender is the Anamorphic checkbox, record the state-           of KeepAspect Ratio so it can be reset if Anamorphic is unchecked again */-        if (sender == fPARCheck)-        {-        keepAspectRatioPreviousState = [fRatioCheck state];-        }-        [fRatioCheck setState:NSOffState];-        [fRatioCheck setEnabled: NO];+        [fHeightStepper      setIntValue: croppedHeight];+        [fHeightField        setIntValue: croppedHeight];         +        +                 [fWidthStepper setEnabled: NO];         [fWidthField setEnabled: NO];-        [fHeightStepper setEnabled: NO];-        [fHeightField setEnabled: NO];              }-    else-	{+    else // we use loose anamorphic+    {+        job->pixel_ratio = 2;+        +        [fRatioCheck setState:NSOffState];+        [fRatioCheck setEnabled: NO];+                 [fWidthStepper setEnabled: YES];         [fWidthField setEnabled: YES];-        [fHeightStepper setEnabled: YES];-        [fHeightField setEnabled: YES];-        [fRatioCheck setEnabled: YES];-        /* if the sender is the Anamorphic checkbox, we return the-           keep AR checkbox to its previous state */-        if (sender == fPARCheck)+        +        /* we have to set the new values appropriately */+        /* first, we handle width */+        if (job->maxWidth && (job->maxWidth < job->width))         {-        [fRatioCheck setState:keepAspectRatioPreviousState];+            job->width = job->maxWidth;         }+        /* now, we handle height */+        if (job->maxHeight && (job->maxHeight < (job->width / storageAspect * 10000)))+        {+            job->height = job->maxHeight;+        }+        else+        {+            job->height = job->width * 10000 / storageAspect;+        }         -	}-	-    job->width       = [fWidthStepper  intValue];-    job->height      = [fHeightStepper intValue];+        +        /* Time to get picture dimensions that divide cleanly.+            These variables will store temporary dimensions as we iterate. */+        /* This is taken from hb.c and reworked to provide proper user feedback */+        int i, w, h, mod; +        /* for our purposes, we will just use mod 16, but leave the code in here+            * in case we want to be able to specify modulus (like mod 8) in the gui+        * down the road+            */+        /* In case the user specified a modulus, use it */+        //if (job->modulus)+        //{+        //   mod = job->modulus;+        //}+        //else+        //{+        mod = 16; +            //}+            +        /* Iterate through multiples of mod to find one close to job->width. */+        for( i = 1;; i++ )+        {+            w = mod * i;+            +            if (w < job->width)+            {+                if ( ( job->width - w ) <= ( mod / 2 ) )+                    /* We'll take a width that's+                    smaller, but close enough. */+                    break;+            }+            if (w == job->width)+                /* Mod 16 dimensions, how nice! */+                break;+            if( w > job->width )+            {+                if ( ( w - job->width ) < (mod/2) )+                    /* We'll take a width that's bigger, if we have to. */+                    break;+            }+        }+        job->width  = mod * (i);+        /* Now do the same for a mod-friendly value near job->height. */+        for( i = 1;; i++)+        {+            h = i * mod;+            +            if (h < job->height)+            {+                if ( ( job->height - h ) <= ( mod / 2 ))+                    /* Go with a smaller height,+                    if it's close enough.    */+                    break;+            }+            if (h == job->height)+                /* Mod 16 dimensions, how nice! */+                break;+            +            if ( h > job->height)+            {+                if ( ( h - job->height ) < ( mod / 2 ))+                    /* Use a taller height if necessary */+                    break;+            }+        }+        job->height = mod  * (i);+        +        if (croppedWidth <= 706)+        {+            /* Handle ITU PARs */+            if (fTitle->height == 480)+            {+                /* It's NTSC */+                if (fTitle->aspect == 16)+                {+                    /* It's widescreen */+                    job->pixel_aspect_width = 40;+                    job->pixel_aspect_height = 33;+                }+                else+                {+                    /* It's 4:3 */+                    job->pixel_aspect_width = 10;+                    job->pixel_aspect_height = 11;+                }+            }+            else if (fTitle->height == 576)+            {+                /* It's PAL */+                if(fTitle->aspect == 16)+                {+                    /* It's widescreen */+                    job->pixel_aspect_width = 16;+                    job->pixel_aspect_height = 11;+                }+                else+                {+                    /* It's 4:3 */+                    job->pixel_aspect_width = 12;+                    job->pixel_aspect_height = 11;+                }+            }+        }+        +        /* Figure out what dimensions the source would display at. */+        sourceDisplayWidth = croppedWidth * ((float)job->pixel_aspect_width / (float)job->pixel_aspect_height) ;+        +        /* The film AR is the source's display width / cropped source height.+            The output display width is the output height * film AR.+            The output PAR is the output display width / output storage width. */+        job->pixel_aspect_width = job->height * sourceDisplayWidth / croppedHeight;+        job->pixel_aspect_height = job->width;+        +        /* While x264 is smart enough to reduce fractions on its own, libavcodec+            needs some help with the math, so lose superfluous factors.            */+        hb_reduce( &job->pixel_aspect_width, &job->pixel_aspect_height,+                   job->pixel_aspect_width, job->pixel_aspect_height ); +        +        /* Okay, since we are using loose anamorphic, +            lets set the steppers and fields as per our job values here*/+        //[fWidthStepper      setIntValue: job->width];+        //[fWidthField        setIntValue: job->width];+        +    }+    +    [fRatioCheck setState:NSOffState];+    [fRatioCheck setEnabled: NO];+    +    [fHeightStepper setEnabled: NO];+    [fHeightField setEnabled: NO];+    +    +    +}+else // We arent using anamorphic at all.+{++/* if the sender is the Anamorphic checkbox, we return the+        keep AR checkbox to its previous state */+    if (sender == fPARCheck)+    {+        [fRatioCheck setState:keepAspectRatioPreviousState];+    }+    job->pixel_ratio = 0;+    [fWidthStepper setEnabled: YES];+    [fWidthField setEnabled: YES];+    [fHeightStepper setEnabled: YES];+    [fHeightField setEnabled: YES];+    [fRatioCheck setEnabled: YES];+}++    +         job->keep_ratio  = ( [fRatioCheck state] == NSOnState );      	fPictureFilterSettings.deinterlace = [fDeinterlacePopUp indexOfSelectedItem];@@ -306,7 +530,6 @@     }     fPictureFilterSettings.denoise     = [fDenoisePopUp indexOfSelectedItem];     fPictureFilterSettings.detelecine  = [fDetelecineCheck state];-	job->pixel_ratio = ( [fPARCheck state] == NSOnState );      autoCrop = ( [fCropMatrix selectedRow] == 0 );     [fCropTopStepper    setEnabled: !autoCrop];@@ -314,18 +537,8 @@     [fCropLeftStepper   setEnabled: !autoCrop];     [fCropRightStepper  setEnabled: !autoCrop]; -    if( autoCrop )-    {-        memcpy( job->crop, fTitle->crop, 4 * sizeof( int ) );-    }-    else-    {-        job->crop[0] = [fCropTopStepper    intValue];-        job->crop[1] = [fCropBottomStepper intValue];-        job->crop[2] = [fCropLeftStepper   intValue];-        job->crop[3] = [fCropRightStepper  intValue];-    } +     if( job->keep_ratio )     {         if( sender == fWidthStepper || sender == fRatioCheck ||@@ -365,7 +578,7 @@        crashing hb_get_preview. In fact, just for kicks        lets getting previews at a min limit of 32, since        no human can see any meaningful detail below that */-    if (job->width >= 64 && job->height >= 64)+    if (job->width >= 64 || job->height >= 64)     {         [self Display: HB_ANIMATE_NONE];     }Index: macosx/Controller.mm===================================================================--- macosx/Controller.mm	(revision 1031)+++ macosx/Controller.mm	(working copy)@@ -2714,7 +2714,7 @@ 	[fPicSettingWidth setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->width]]; 	[fPicSettingHeight setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->height]]; 		-	if (fTitle->job->pixel_ratio == 1)+	if (fTitle->job->pixel_ratio > 0) 	{         int titlewidth = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3];         int arpwidth = fTitle->job->pixel_aspect_width;@@ -2728,7 +2728,7 @@         [fPicSettingPARWidth setStringValue: [NSString stringWithFormat:@"%d", displayparwidth]];         [fPicSettingPARHeight setStringValue: [NSString stringWithFormat:@"%d", displayparheight]];         -        fTitle->job->keep_ratio = 0;+        //fTitle->job->keep_ratio = 0; 	} 	else 	{Index: macosx/English.lproj/Preferences.nib/info.nib===================================================================--- macosx/English.lproj/Preferences.nib/info.nib	(revision 1031)+++ macosx/English.lproj/Preferences.nib/info.nib	(working copy)@@ -7,9 +7,9 @@ 	<key>IBEditorPositions</key> 	<dict> 		<key>233</key>-		<string>480 459 520 251 0 0 1440 878 </string>+		<string>460 484 520 251 0 0 1440 878 </string> 		<key>234</key>-		<string>480 510 520 150 0 0 1440 878 </string>+		<string>41 635 520 170 0 0 1440 878 </string> 		<key>235</key> 		<string>480 522 520 125 0 0 1440 878 </string> 		<key>236</key>@@ -19,7 +19,7 @@ 	<string>446.1</string> 	<key>IBOpenObjects</key> 	<array>-		<integer>233</integer>+		<integer>234</integer> 	</array> 	<key>IBSystem Version</key> 	<string>8R2218</string>Index: macosx/English.lproj/Preferences.nib/keyedobjects.nib===================================================================Cannot display: file marked as a binary type.svn:mime-type = application/octet-streamIndex: macosx/PictureController.h===================================================================--- macosx/PictureController.h	(revision 1031)+++ macosx/PictureController.h	(working copy)@@ -48,8 +48,12 @@     IBOutlet NSButton        * fNextButton;     IBOutlet NSTextField     * fInfoField; 	-    int     MaxOutputWidth;-    int     MaxOutputHeight;+    int     maxOutputWidth;+    int     maxOutputHeight;+    int     croppedWidth;+    int     croppedHeight;+    int     storageAspect;+    int     sourceDisplayWidth;     BOOL    autoCrop;          /* used to track the previous state of the keep aspect