From 765b68f9714c776b0afe57a077194d2afb000d59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= Date: Fri, 25 Aug 2023 19:10:34 +0200 Subject: [PATCH] mp_image: add image crop rect to mp_image_params --- video/mp_image.c | 25 ++++++++++++++++++++++--- video/mp_image.h | 2 ++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/video/mp_image.c b/video/mp_image.c index c55b205ec0..f04854586e 100644 --- a/video/mp_image.c +++ b/video/mp_image.c @@ -726,12 +726,26 @@ void mp_image_vflip(struct mp_image *img) } } +bool mp_image_crop_valid(const struct mp_image_params *p) +{ + return p->crop.x1 > p->crop.x0 && p->crop.y1 > p->crop.y0 && + p->crop.x0 >= 0 && p->crop.y0 >= 0 && + p->crop.x1 <= p->w && p->crop.y1 <= p->h; +} + // Display size derived from image size and pixel aspect ratio. void mp_image_params_get_dsize(const struct mp_image_params *p, int *d_w, int *d_h) { - *d_w = p->w; - *d_h = p->h; + if (mp_image_crop_valid(p)) + { + *d_w = mp_rect_w(p->crop); + *d_h = mp_rect_h(p->crop); + } else { + *d_w = p->w; + *d_h = p->h; + } + if (p->p_w > p->p_h && p->p_h >= 1) *d_w = MPCLAMP(*d_w * (int64_t)p->p_w / p->p_h, 1, INT_MAX); if (p->p_h > p->p_w && p->p_w >= 1) @@ -765,6 +779,10 @@ char *mp_image_params_to_str_buf(char *b, size_t bs, mp_snprintf_cat(b, bs, " SP=%f", p->color.sig_peak); mp_snprintf_cat(b, bs, " CL=%s", m_opt_choice_str(mp_chroma_names, p->chroma_location)); + if (mp_image_crop_valid(p)) { + mp_snprintf_cat(b, bs, " crop=%dx%d+%d+%d", mp_rect_w(p->crop), + mp_rect_h(p->crop), p->crop.x0, p->crop.y0); + } if (p->rotate) mp_snprintf_cat(b, bs, " rot=%d", p->rotate); if (p->stereo3d > 0) { @@ -820,7 +838,8 @@ bool mp_image_params_equal(const struct mp_image_params *p1, p1->chroma_location == p2->chroma_location && p1->rotate == p2->rotate && p1->stereo3d == p2->stereo3d && - p1->alpha == p2->alpha; + p1->alpha == p2->alpha && + mp_rect_equals(&p1->crop, &p2->crop); } // Set most image parameters, but not image format or size. diff --git a/video/mp_image.h b/video/mp_image.h index 98dd666412..5c4f7186e3 100644 --- a/video/mp_image.h +++ b/video/mp_image.h @@ -52,6 +52,7 @@ struct mp_image_params { int rotate; enum mp_stereo3d_mode stereo3d; // image is encoded with this mode enum mp_alpha_type alpha; // usually auto; only set if explicitly known + struct mp_rect crop; // crop applied on image }; /* Memory management: @@ -169,6 +170,7 @@ char *mp_image_params_to_str_buf(char *b, size_t bs, const struct mp_image_params *p); #define mp_image_params_to_str(p) mp_image_params_to_str_buf((char[256]){0}, 256, p) +bool mp_image_crop_valid(const struct mp_image_params *p); bool mp_image_params_valid(const struct mp_image_params *p); bool mp_image_params_equal(const struct mp_image_params *p1, const struct mp_image_params *p2);