libhb: rotate the dovi l5 offsets when there is a rotate filter

This commit is contained in:
Damiano Galassi 2025-02-10 14:00:48 +01:00
parent 73d1a38c10
commit 3dfa611fb7
No known key found for this signature in database
GPG Key ID: 5452E231DFDBCA11
2 changed files with 66 additions and 29 deletions

View File

@ -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)
{

View File

@ -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);