summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/test.c64
1 files changed, 63 insertions, 1 deletions
diff --git a/test/test.c b/test/test.c
index ff94c1c5b..c91b59b30 100644
--- a/test/test.c
+++ b/test/test.c
@@ -95,6 +95,7 @@ static int subtitle_scan = 0;
static int width = 0;
static int height = 0;
static int crop[4] = { -1,-1,-1,-1 };
+static int loose_crop = -1;
static int vrate = 0;
static float vquality = -1.0;
static int vbitrate = 0;
@@ -504,6 +505,52 @@ static int cmp_lang( char * lang, const char * code )
return 0;
}
+static void apply_loose_crop(int total, int * v1, int * v2, int mod, int max)
+{
+ /* number of extra pixels which must be cropped to reach next modulus */
+ int add = (total - *v1 - *v2) % mod;
+
+ if (add)
+ {
+ /* number of pixels which must be uncropped to reach previous modulus */
+ int sub = mod - add;
+
+ /* less than maximum (or can't reduce), increase the crop size */
+ if (add <= max || sub > (*v1 + *v2))
+ {
+ int add1 = add / 2;
+ if ((*v1 + add1) & 1) // avoid odd crop if possible
+ ++add1;
+ int add2 = (add - add1);
+
+ *v1 += add1;
+ *v2 += add2;
+ }
+
+ /* more than maximum, reduce the crop size instead */
+ else
+ {
+ int sub1 = sub / 2;
+ if (sub1 > *v1)
+ sub1 = *v1;
+ else if ((*v1 - sub1) & 1) // avoid odd crop if possible
+ ++sub1;
+
+ int sub2 = sub - sub1;
+ if (sub2 > *v2)
+ {
+ sub1 += (sub2 - *v2);
+ if ((*v1 - sub1) & 1) // avoid odd crop if possible
+ ++sub1;
+ sub2 = sub - sub1;
+ }
+
+ *v1 -= sub1;
+ *v2 -= sub2;
+ }
+ }
+}
+
static int HandleEvents( hb_handle_t * h )
{
hb_state_t s;
@@ -1270,6 +1317,13 @@ static int HandleEvents( hb_handle_t * h )
memcpy( job->crop, crop, 4 * sizeof( int ) );
}
+ if( loose_crop >= 0 )
+ {
+ int mod = modulus > 0 ? modulus : 16;
+ apply_loose_crop(title->height, &job->crop[0], &job->crop[1], mod, loose_crop);
+ apply_loose_crop(title->width, &job->crop[2], &job->crop[3], mod, loose_crop);
+ }
+
job->deinterlace = deinterlace;
job->grayscale = grayscale;
@@ -2663,6 +2717,9 @@ static void ShowHelp()
" -w, --width <number> Set picture width\n"
" -l, --height <number> Set picture height\n"
" --crop <T:B:L:R> Set cropping values (default: autocrop)\n"
+ " --loose-crop Always crop to a multiple of the modulus\n"
+ " <#> Specifies the maximum number of extra pixels\n"
+ " which may be cropped (default: 15)\n"
" -Y, --maxHeight <#> Set maximum height\n"
" -X, --maxWidth <#> Set maximum width\n"
" --strict-anamorphic Store pixel aspect ratio in video stream\n"
@@ -2916,7 +2973,8 @@ static int ParseOptions( int argc, char ** argv )
#define AUDIO_GAIN 279
#define ALLOWED_AUDIO_COPY 280
#define AUDIO_FALLBACK 281
-
+ #define LOOSE_CROP 282
+
for( ;; )
{
static struct option long_options[] =
@@ -2976,6 +3034,7 @@ static int ParseOptions( int argc, char ** argv )
{ "width", required_argument, NULL, 'w' },
{ "height", required_argument, NULL, 'l' },
{ "crop", required_argument, NULL, 'n' },
+ { "loose-crop", optional_argument, NULL, LOOSE_CROP },
{ "vb", required_argument, NULL, 'b' },
{ "quality", required_argument, NULL, 'q' },
@@ -3346,6 +3405,9 @@ static int ParseOptions( int argc, char ** argv )
}
break;
}
+ case LOOSE_CROP:
+ loose_crop = optarg ? atoi(optarg) : 15;
+ break;
case 'r':
{
int i;