summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjbrjake <[email protected]>2008-10-18 21:31:22 +0000
committerjbrjake <[email protected]>2008-10-18 21:31:22 +0000
commitd991c11bd90af5dbc04d543ab881c05be34aecfc (patch)
tree58a06c74e9f8fc2ffc825beefc32fda73b37e37e
parent6c7593e540de0847c2cb0771f545b0bcf0e7d34b (diff)
Makes sure loose anamorphic respects max width and height settings, and removes a bunch of code by repurposing MULTIPLE_MOD() (thanks j45!).
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@1843 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/common.h2
-rw-r--r--libhb/hb.c72
2 files changed, 12 insertions, 62 deletions
diff --git a/libhb/common.h b/libhb/common.h
index 47f5503a0..5c89430d3 100644
--- a/libhb/common.h
+++ b/libhb/common.h
@@ -27,7 +27,7 @@
#define EVEN( a ) ( (a) + ( (a) & 1 ) )
#define MULTIPLE_16( a ) ( 16 * ( ( (a) + 8 ) / 16 ) )
-#define MULTIPLE_MOD( a, b ) ( b * ( ( (a) + (b / 2) ) / b ) )
+#define MULTIPLE_MOD( a, b ) ( b * ( ( (a) + (b / 2) - 1) / b ) )
#define HB_DVD_READ_BUFFER_SIZE 2048
diff --git a/libhb/hb.c b/libhb/hb.c
index 06b489306..fa52320ad 100644
--- a/libhb/hb.c
+++ b/libhb/hb.c
@@ -566,7 +566,7 @@ void hb_set_anamorphic_size( hb_job_t * job,
int cropped_height = title->height - job->crop[0] - job->crop[1] ;
double storage_aspect = (double)cropped_width / (double)cropped_height;
int width = job->width;
- int height; // Gets set later, ignore user value
+ int height; // Gets set later, ignore user job->height value
int mod = job->modulus;
double aspect = title->aspect;
@@ -580,22 +580,11 @@ void hb_set_anamorphic_size( hb_job_t * job,
*/
if ( job->maxWidth && (job->maxWidth < job->width) )
- width = job->maxWidth;
+ width = job->maxWidth;
height = (double)width / storage_aspect;
if ( job->maxHeight && (job->maxHeight < height) )
- {
height = job->maxHeight;
- }
- else
- {
- height = (double)width / storage_aspect;
- }
-
-
- /* Time to get picture dimensions that divide cleanly.
- These variables will store temporary dimensions as we iterate. */
- int i, w, h;
/* In case the user specified a modulus, use it */
if (job->modulus)
@@ -603,55 +592,16 @@ void hb_set_anamorphic_size( hb_job_t * job,
else
mod = 16;
- /* Iterate through multiples of mod to find one close to job->width. */
- for( i = 1;; i++ )
- {
- w = mod * i;
-
- if (w < width)
- {
- if ( ( width - w ) <= ( mod / 2 ) )
- /* We'll take a width that's
- smaller, but close enough. */
- break;
- }
- if (w == width)
- /* Mod 16 dimensions, how nice! */
- break;
- if( w > width )
- {
- if ( ( w - width ) < (mod/2) )
- /* We'll take a width that's bigger, if we have to. */
- break;
- }
- }
- width = mod * (i);
-
- /* Now do the same for a mod-friendly value near job->height. */
- for( i = 1;; i++)
- {
- h = i * mod;
-
- if (h < height)
- {
- if ( ( height - h ) <= ( mod / 2 ))
- /* Go with a smaller height,
- if it's close enough. */
- break;
- }
- if (h == height)
- /* Mod 16 dimensions, how nice! */
- break;
-
- if ( h > height)
- {
- if ( ( h - height ) < ( mod / 2 ))
- /* Use a taller height if necessary */
- break;
- }
- }
- height = mod * (i);
+ /* Time to get picture dimensions that divide cleanly.*/
+ width = MULTIPLE_MOD( width, mod);
+ height = MULTIPLE_MOD( height, mod);
+ /* Verify these new dimensions don't violate max height and width settings */
+ if ( job->maxWidth && (job->maxWidth < job->width) )
+ width = job->maxWidth;
+ if ( job->maxHeight && (job->maxHeight < height) )
+ height = job->maxHeight;
+
int pixel_aspect_width = job->pixel_aspect_width;
int pixel_aspect_height = job->pixel_aspect_height;