All pastes #742568 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-10-19 17:11 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-stream
Index: 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