diff options
author | jbrjake <[email protected]> | 2008-10-18 21:31:22 +0000 |
---|---|---|
committer | jbrjake <[email protected]> | 2008-10-18 21:31:22 +0000 |
commit | d991c11bd90af5dbc04d543ab881c05be34aecfc (patch) | |
tree | 58a06c74e9f8fc2ffc825beefc32fda73b37e37e /libhb | |
parent | 6c7593e540de0847c2cb0771f545b0bcf0e7d34b (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
Diffstat (limited to 'libhb')
-rw-r--r-- | libhb/common.h | 2 | ||||
-rw-r--r-- | libhb/hb.c | 72 |
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; |