mirror of https://github.com/HandBrake/HandBrake
libhb: rotate the dovi l5 offsets when there is a rotate filter
This commit is contained in:
parent
73d1a38c10
commit
3dfa611fb7
63
libhb/rpu.c
63
libhb/rpu.c
|
|
@ -18,6 +18,9 @@ struct hb_filter_private_s
|
|||
{
|
||||
int mode;
|
||||
|
||||
int angle;
|
||||
int hflip;
|
||||
|
||||
double scale_factor_x;
|
||||
double scale_factor_y;
|
||||
|
||||
|
|
@ -48,7 +51,9 @@ static int rpu_work(hb_filter_object_t *filter,
|
|||
static void rpu_close(hb_filter_object_t *filter);
|
||||
|
||||
static const char rpu_template[] =
|
||||
"mode=^"HB_INT_REG"$:scale-factor-x=^"HB_FLOAT_REG"$:scale-factor-y=^"HB_FLOAT_REG"$:"
|
||||
"mode=^"HB_INT_REG"$:"
|
||||
"angle=^(0|90|180|270)$:hflip=^"HB_BOOL_REG"$:"
|
||||
"scale-factor-x=^"HB_FLOAT_REG"$:scale-factor-y=^"HB_FLOAT_REG"$:"
|
||||
"crop-top=^"HB_INT_REG"$:crop-bottom=^"HB_INT_REG"$:"
|
||||
"crop-left=^"HB_INT_REG"$:crop-right=^"HB_INT_REG"$:"
|
||||
"pad-top=^"HB_INT_REG"$:pad-bottom=^"HB_INT_REG"$:"
|
||||
|
|
@ -81,6 +86,7 @@ static int rpu_init(hb_filter_object_t *filter,
|
|||
pv->input = *init;
|
||||
|
||||
int mode = RPU_MODE_UPDATE_ACTIVE_AREA | RPU_MODE_EMIT_UNSPECT_62_NAL;
|
||||
int angle = 0, hflip = 0;
|
||||
double scale_factor_x = 1, scale_factor_y = 1;
|
||||
int crop_top = 0, crop_bottom = 0, crop_left = 0, crop_right = 0;
|
||||
int pad_top = 0, pad_bottom = 0, pad_left = 0, pad_right = 0;
|
||||
|
|
@ -90,6 +96,9 @@ static int rpu_init(hb_filter_object_t *filter,
|
|||
hb_dict_t *dict = filter->settings;
|
||||
hb_dict_extract_int(&mode, dict, "mode");
|
||||
|
||||
hb_dict_extract_int(&angle, dict, "angle");
|
||||
hb_dict_extract_int(&hflip, dict, "hflip");
|
||||
|
||||
hb_dict_extract_double(&scale_factor_x, dict, "scale-factor-x");
|
||||
hb_dict_extract_double(&scale_factor_y, dict, "scale-factor-y");
|
||||
|
||||
|
|
@ -106,6 +115,9 @@ static int rpu_init(hb_filter_object_t *filter,
|
|||
|
||||
pv->mode = mode;
|
||||
|
||||
pv->angle = angle;
|
||||
pv->hflip = hflip;
|
||||
|
||||
pv->scale_factor_x = scale_factor_x;
|
||||
pv->scale_factor_y = scale_factor_y;
|
||||
|
||||
|
|
@ -244,9 +256,7 @@ static int rpu_work(hb_filter_object_t *filter,
|
|||
|
||||
if (pv->mode & RPU_MODE_UPDATE_ACTIVE_AREA)
|
||||
{
|
||||
uint16_t left_offset = 0, right_offset = 0;
|
||||
uint16_t top_offset = 0, bottom_offset = 0;
|
||||
|
||||
hb_geometry_crop_t geo = {0};
|
||||
const DoviVdrDmData *vdr_dm_data = dovi_rpu_get_vdr_dm_data(rpu_in);
|
||||
|
||||
if (vdr_dm_data)
|
||||
|
|
@ -254,36 +264,41 @@ static int rpu_work(hb_filter_object_t *filter,
|
|||
const DoviExtMetadataBlockLevel5 *level5 = vdr_dm_data->dm_data.level5;
|
||||
if (level5)
|
||||
{
|
||||
left_offset = level5->active_area_left_offset;
|
||||
right_offset = level5->active_area_right_offset;
|
||||
top_offset = level5->active_area_top_offset;
|
||||
bottom_offset = level5->active_area_bottom_offset;
|
||||
geo.crop[0] = level5->active_area_top_offset;
|
||||
geo.crop[1] = level5->active_area_bottom_offset;
|
||||
geo.crop[2] = level5->active_area_left_offset;
|
||||
geo.crop[3] = level5->active_area_right_offset;
|
||||
}
|
||||
}
|
||||
|
||||
if (pv->angle || pv->hflip)
|
||||
{
|
||||
hb_rotate_geometry(&geo, &geo, pv->angle, pv->hflip);
|
||||
}
|
||||
|
||||
// First subtract the crop values
|
||||
left_offset -= left_offset > pv->crop_left ? pv->crop_left : left_offset;
|
||||
right_offset -= right_offset > pv->crop_right ? pv->crop_right : right_offset;
|
||||
top_offset -= top_offset > pv->crop_top ? pv->crop_right : top_offset;
|
||||
bottom_offset -= bottom_offset > pv->crop_bottom ? pv->crop_bottom : bottom_offset;
|
||||
geo.crop[0] -= geo.crop[0] > pv->crop_top ? pv->crop_top : geo.crop[0];
|
||||
geo.crop[1] -= geo.crop[1] > pv->crop_bottom ? pv->crop_bottom : geo.crop[1];
|
||||
geo.crop[2] -= geo.crop[2] > pv->crop_left ? pv->crop_left : geo.crop[2];
|
||||
geo.crop[3] -= geo.crop[3] > pv->crop_right ? pv->crop_right : geo.crop[3];
|
||||
|
||||
// Then rescale
|
||||
left_offset = (double)left_offset / pv->scale_factor_x;
|
||||
right_offset = (double)right_offset / pv->scale_factor_x;
|
||||
top_offset = (double)top_offset / pv->scale_factor_y;
|
||||
bottom_offset = (double)bottom_offset / pv->scale_factor_y;
|
||||
geo.crop[0] = (double)geo.crop[0] / pv->scale_factor_y;
|
||||
geo.crop[1] = (double)geo.crop[1] / pv->scale_factor_y;
|
||||
geo.crop[2] = (double)geo.crop[2] / pv->scale_factor_x;
|
||||
geo.crop[3] = (double)geo.crop[3] / pv->scale_factor_x;
|
||||
|
||||
// At last add pad values
|
||||
left_offset += pv->pad_left;
|
||||
right_offset += pv->pad_right;
|
||||
top_offset += pv->pad_top;
|
||||
bottom_offset += pv->pad_bottom;
|
||||
geo.crop[0] += pv->pad_top;
|
||||
geo.crop[1] += pv->pad_bottom;
|
||||
geo.crop[2] += pv->pad_left;
|
||||
geo.crop[3] += pv->pad_right;
|
||||
|
||||
dovi_rpu_set_active_area_offsets(rpu_in,
|
||||
left_offset,
|
||||
right_offset,
|
||||
top_offset,
|
||||
bottom_offset);
|
||||
geo.crop[2],
|
||||
geo.crop[3],
|
||||
geo.crop[0],
|
||||
geo.crop[1]);
|
||||
|
||||
if (vdr_dm_data)
|
||||
{
|
||||
|
|
|
|||
32
libhb/work.c
32
libhb/work.c
|
|
@ -1611,16 +1611,36 @@ static void sanitize_dynamic_hdr_metadata_passthru(hb_job_t *job)
|
|||
}
|
||||
}
|
||||
|
||||
int angle = 0, hflip = 0;
|
||||
double scale_factor_x = 1, scale_factor_y = 1;
|
||||
int crop_top = 0, crop_bottom = 0, crop_left = 0, crop_right = 0;
|
||||
int pad_top = 0, pad_bottom = 0, pad_left = 0, pad_right = 0;
|
||||
|
||||
hb_filter_object_t *filter = hb_filter_find(list, HB_FILTER_CROP_SCALE);
|
||||
hb_filter_object_t *filter = hb_filter_find(list, HB_FILTER_ROTATE);
|
||||
if (filter != NULL)
|
||||
{
|
||||
hb_dict_t *settings = filter->settings;
|
||||
if (settings != NULL)
|
||||
{
|
||||
angle = hb_dict_get_int(settings, "angle");
|
||||
hflip = hb_dict_get_int(settings, "hflip");
|
||||
}
|
||||
}
|
||||
|
||||
filter = hb_filter_find(list, HB_FILTER_CROP_SCALE);
|
||||
if (filter != NULL)
|
||||
{
|
||||
hb_dict_t *settings = filter->settings;
|
||||
if (settings != NULL)
|
||||
{
|
||||
hb_geometry_crop_t title_geo = {0};
|
||||
title_geo.geometry = job->title->geometry;
|
||||
|
||||
if (angle || hflip)
|
||||
{
|
||||
hb_rotate_geometry(&title_geo, &title_geo, angle, hflip);
|
||||
}
|
||||
|
||||
int width = hb_dict_get_int(settings, "width");
|
||||
int height = hb_dict_get_int(settings, "height");
|
||||
crop_top = hb_dict_get_int(settings, "crop-top");
|
||||
|
|
@ -1628,8 +1648,8 @@ static void sanitize_dynamic_hdr_metadata_passthru(hb_job_t *job)
|
|||
crop_left = hb_dict_get_int(settings, "crop-left");
|
||||
crop_right = hb_dict_get_int(settings, "crop-right");
|
||||
|
||||
scale_factor_x = (float)(job->title->geometry.width - crop_right - crop_left) / width;
|
||||
scale_factor_y = (float)(job->title->geometry.height - crop_top - crop_bottom) / height;
|
||||
scale_factor_x = (float)(title_geo.geometry.width - crop_right - crop_left) / width;
|
||||
scale_factor_y = (float)(title_geo.geometry.height - crop_top - crop_bottom) / height;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1647,10 +1667,12 @@ static void sanitize_dynamic_hdr_metadata_passthru(hb_job_t *job)
|
|||
}
|
||||
|
||||
filter = hb_filter_init(HB_FILTER_RPU);
|
||||
char *settings = hb_strdup_printf("mode=%d:scale-factor-x=%f:scale-factor-y=%f:"
|
||||
char *settings = hb_strdup_printf("mode=%d:angle=%d:hflip=%d:"
|
||||
"scale-factor-x=%f:scale-factor-y=%f:"
|
||||
"crop-top=%d:crop-bottom=%d:crop-left=%d:crop-right=%d:"
|
||||
"pad-top=%d:pad-bottom=%d:pad-left=%d:pad-right=%d",
|
||||
mode, scale_factor_x, scale_factor_y,
|
||||
mode, angle, hflip,
|
||||
scale_factor_x, scale_factor_y,
|
||||
crop_top, crop_bottom, crop_left, crop_right,
|
||||
pad_top, pad_bottom, pad_left, pad_right);
|
||||
hb_add_filter(job, filter, settings);
|
||||
|
|
|
|||
Loading…
Reference in New Issue