summaryrefslogtreecommitdiffstats
path: root/video/mp_image.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/mp_image.c')
-rw-r--r--video/mp_image.c63
1 files changed, 22 insertions, 41 deletions
diff --git a/video/mp_image.c b/video/mp_image.c
index b9a15de409..6329e408cf 100644
--- a/video/mp_image.c
+++ b/video/mp_image.c
@@ -152,6 +152,7 @@ static void mp_image_alloc_planes(struct mp_image *mpi)
void mp_image_setfmt(struct mp_image *mpi, int out_fmt)
{
struct mp_imgfmt_desc fmt = mp_imgfmt_get_desc(out_fmt);
+ mpi->params.imgfmt = fmt.id;
mpi->fmt = fmt;
mpi->flags = fmt.flags;
mpi->imgfmt = fmt.id;
@@ -179,8 +180,9 @@ void mp_image_set_size(struct mp_image *mpi, int w, int h)
if (w >= (1 << 14) || h >= (1 << 14) || w < 0 || h < 0)
abort();
- mpi->w = mpi->display_w = w;
- mpi->h = mpi->display_h = h;
+ mpi->w = mpi->params.w = w;
+ mpi->h = mpi->params.h = h;
+ mp_image_set_display_size(mpi, mpi->w, mpi->h);
for (int n = 0; n < mpi->num_planes; n++) {
mpi->plane_w[n] = mp_chroma_div_up(mpi->w, mpi->fmt.xs[n]);
mpi->plane_h[n] = mp_chroma_div_up(mpi->h, mpi->fmt.ys[n]);
@@ -191,10 +193,22 @@ void mp_image_set_size(struct mp_image *mpi, int w, int h)
void mp_image_set_display_size(struct mp_image *mpi, int dw, int dh)
{
+ mpi->params.d_w = dw;
+ mpi->params.d_h = dh;
mpi->display_w = dw;
mpi->display_h = dh;
}
+void mp_image_set_params(struct mp_image *image,
+ const struct mp_image_params *params)
+{
+ image->params = *params;
+ // possibly reinitialize stuff
+ mp_image_setfmt(image, params->imgfmt);
+ mp_image_set_size(image, params->w, params->h);
+ mp_image_set_display_size(image, params->d_w, params->d_h);
+}
+
struct mp_image *mp_image_alloc(int imgfmt, int w, int h)
{
struct mp_image *mpi = talloc_zero(NULL, struct mp_image);
@@ -349,9 +363,9 @@ void mp_image_copy_attributes(struct mp_image *dst, struct mp_image *src)
dst->display_h = src->display_h;
}
if ((dst->flags & MP_IMGFLAG_YUV) == (src->flags & MP_IMGFLAG_YUV)) {
- dst->colorspace = src->colorspace;
- dst->levels = src->levels;
- dst->chroma_location = src->chroma_location;
+ dst->params.colorspace = src->params.colorspace;
+ dst->params.colorlevels = src->params.colorlevels;
+ dst->params.chroma_location = src->params.chroma_location;
}
if ((dst->fmt.flags & MP_IMGFLAG_PAL) && (src->fmt.flags & MP_IMGFLAG_PAL)) {
if (dst->planes[1] && src->planes[1])
@@ -446,28 +460,7 @@ bool mp_image_params_equals(const struct mp_image_params *p1,
void mp_image_params_from_image(struct mp_image_params *params,
const struct mp_image *image)
{
- // (Ideally mp_image should use mp_image_params directly instead)
- *params = (struct mp_image_params) {
- .imgfmt = image->imgfmt,
- .w = image->w,
- .h = image->h,
- .d_w = image->display_w,
- .d_h = image->display_h,
- .colorspace = image->colorspace,
- .colorlevels = image->levels,
- .chroma_location = image->chroma_location,
- };
-}
-
-void mp_image_set_params(struct mp_image *image,
- const struct mp_image_params *params)
-{
- mp_image_setfmt(image, params->imgfmt);
- mp_image_set_size(image, params->w, params->h);
- mp_image_set_display_size(image, params->d_w, params->d_h);
- image->colorspace = params->colorspace;
- image->levels = params->colorlevels;
- image->chroma_location = params->chroma_location;
+ *params = image->params;
}
// Set most image parameters, but not image format or size.
@@ -490,18 +483,6 @@ void mp_image_set_attributes(struct mp_image *image,
mp_image_set_params(image, &nparams);
}
-void mp_image_set_colorspace_details(struct mp_image *image,
- struct mp_csp_details *csp)
-{
- struct mp_image_params params;
- mp_image_params_from_image(&params, image);
- params.colorspace = csp->format;
- params.colorlevels = csp->levels_in;
- mp_image_params_guess_csp(&params);
- image->colorspace = params.colorspace;
- image->levels = params.colorlevels;
-}
-
// If details like params->colorspace/colorlevels are missing, guess them from
// the other settings. Also, even if they are set, make them consistent with
// the colorspace as implied by the pixel format.
@@ -592,8 +573,8 @@ void mp_image_copy_fields_to_av_frame(struct AVFrame *dst,
dst->repeat_pict = 1;
#if HAVE_AVFRAME_COLORSPACE
- dst->colorspace = mp_csp_to_avcol_spc(src->colorspace);
- dst->color_range = mp_csp_levels_to_avcol_range(src->levels);
+ dst->colorspace = mp_csp_to_avcol_spc(src->params.colorspace);
+ dst->color_range = mp_csp_levels_to_avcol_range(src->params.colorlevels);
#endif
}