summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhb/common.h1
-rw-r--r--libhb/hb.c18
-rw-r--r--libhb/work.c12
-rw-r--r--test/test.c23
4 files changed, 29 insertions, 25 deletions
diff --git a/libhb/common.h b/libhb/common.h
index f677d8bb5..e6d056628 100644
--- a/libhb/common.h
+++ b/libhb/common.h
@@ -181,6 +181,7 @@ struct hb_job_s
int par_height;
int dar_width;
int dar_height;
+ int keep_display_aspect;
} anamorphic;
int maxWidth;
diff --git a/libhb/hb.c b/libhb/hb.c
index c65cc5872..23119023e 100644
--- a/libhb/hb.c
+++ b/libhb/hb.c
@@ -801,11 +801,19 @@ void hb_set_anamorphic_size( hb_job_t * job,
this is an output PAR, to correct a source, and it should not be assumed
that it properly creates a display aspect ratio when applied to the source,
which could easily be stored in a different resolution. */
-
- int output_display_width = width * (double)pixel_aspect_width /
- (double)pixel_aspect_height;
- pixel_aspect_width = output_display_width;
- pixel_aspect_height = width;
+ if( job->anamorphic.keep_display_aspect )
+ {
+ /* We can ignore the possibility of a PAR change */
+ pixel_aspect_width = height * ( (double)source_display_width / (double)cropped_height );
+ pixel_aspect_height = width;
+ }
+ else
+ {
+ int output_display_width = width * (double)pixel_aspect_width /
+ (double)pixel_aspect_height;
+ pixel_aspect_width = output_display_width;
+ pixel_aspect_height = width;
+ }
}
/* Back to caller */
diff --git a/libhb/work.c b/libhb/work.c
index e99feaa8c..53d9e27c7 100644
--- a/libhb/work.c
+++ b/libhb/work.c
@@ -205,9 +205,21 @@ void hb_display_job_info( hb_job_t * job )
if( job->anamorphic.mode )
{
hb_log( " + %s anamorphic", job->anamorphic.mode == 1 ? "strict" : job->anamorphic.mode == 2? "loose" : "custom" );
+ if( job->anamorphic.mode == 3 && job->anamorphic.keep_display_aspect )
+ {
+ hb_log( " + keeping source display aspect ratio");
+ }
+ if( job->anamorphic.modulus != 16 )
+ {
+ hb_log( " + modulus: %i", job->anamorphic.modulus );
+ }
hb_log( " + storage dimensions: %d * %d -> %d * %d, crop %d/%d/%d/%d",
title->width, title->height, job->width, job->height,
job->crop[0], job->crop[1], job->crop[2], job->crop[3] );
+ if( job->anamorphic.itu_par )
+ {
+ hb_log( " + using ITU pixel aspect ratio values");
+ }
hb_log( " + pixel aspect ratio: %i / %i", job->anamorphic.par_width, job->anamorphic.par_height );
hb_log( " + display dimensions: %.0f * %i",
(float)( job->width * job->anamorphic.par_width / job->anamorphic.par_height ), job->height );
diff --git a/test/test.c b/test/test.c
index d956966e8..94404d2cc 100644
--- a/test/test.c
+++ b/test/test.c
@@ -1105,6 +1105,8 @@ static int HandleEvents( hb_handle_t * h )
if( keep_display_aspect )
{
+ job->anamorphic.keep_display_aspect = 1;
+
/* First, what *is* the display aspect? */
int cropped_width = title->width - job->crop[2] - job->crop[3];
int cropped_height = title->height - job->crop[0] - job->crop[1];
@@ -1114,8 +1116,7 @@ static int HandleEvents( hb_handle_t * h )
asked for ITU values instead. */
float source_display_width = (float)cropped_width *
(float)title->pixel_aspect_width / (float)title->pixel_aspect_height;
- float display_aspect = source_display_width / cropped_height;
-
+ float display_aspect = source_display_width / (float)cropped_height;
/* When keeping display aspect, we have to rank some values
by priority in order to consistently handle situations
when more than one might be specified by default.
@@ -1134,24 +1135,6 @@ static int HandleEvents( hb_handle_t * h )
/* We scale the height to the new display width */
height = (int)( (double)display_width / display_aspect );
}
- else if( width )
- {
- /* We assume the source height minus cropping, round
- to a mod-friendly number, figure out the proper
- display width at that height, and adjust the PAR
- to create that display width from the new source width. */
- int temp_height;
- temp_height = title->height - job->crop[0] - job->crop[1];
- int temp_modulus;
- if( modulus )
- temp_modulus = modulus;
- else
- temp_modulus = 16;
-
- temp_height = MULTIPLE_MOD( temp_height, temp_modulus );
- job->anamorphic.par_width = (int)( (double)temp_height * display_aspect );
- job->anamorphic.par_height = width;
- }
}
if( display_width )