diff options
Diffstat (limited to 'libmpcodecs')
-rw-r--r-- | libmpcodecs/sws_utils.c | 24 | ||||
-rw-r--r-- | libmpcodecs/sws_utils.h | 3 |
2 files changed, 27 insertions, 0 deletions
diff --git a/libmpcodecs/sws_utils.c b/libmpcodecs/sws_utils.c index 438db4a13a..65b079dd84 100644 --- a/libmpcodecs/sws_utils.c +++ b/libmpcodecs/sws_utils.c @@ -131,4 +131,28 @@ struct SwsContext *sws_getContextFromCmdLine_hq(int srcW, int srcH, SWS_ACCURATE_RND | SWS_BITEXACT); } +void mp_image_swscale(struct mp_image *dst, + const struct mp_image *src, + struct mp_csp_details *csp, + int my_sws_flags) +{ + enum PixelFormat dfmt, sfmt; + dfmt = imgfmt2pixfmt(dst->imgfmt); + sfmt = imgfmt2pixfmt(src->imgfmt); + if (src->imgfmt == IMGFMT_RGB8 || src->imgfmt == IMGFMT_BGR8) + sfmt = PIX_FMT_PAL8; + + struct SwsContext *sws = + sws_getContext(src->w, src->h, sfmt, dst->w, dst->h, dfmt, + my_sws_flags, NULL, NULL, NULL); + struct mp_csp_details mycsp = MP_CSP_DETAILS_DEFAULTS; + if (csp) + mycsp = *csp; + mp_sws_set_colorspace(sws, &mycsp); + sws_scale(sws, (const unsigned char *const *) src->planes, src->stride, + 0, src->h, + dst->planes, dst->stride); + sws_freeContext(sws); +} + // vim: ts=4 sw=4 et tw=80 diff --git a/libmpcodecs/sws_utils.h b/libmpcodecs/sws_utils.h index a8dc970d08..b2c55eb407 100644 --- a/libmpcodecs/sws_utils.h +++ b/libmpcodecs/sws_utils.h @@ -22,6 +22,9 @@ struct SwsContext *sws_getContextFromCmdLine_hq(int srcW, int srcH, int dstFormat); int mp_sws_set_colorspace(struct SwsContext *sws, struct mp_csp_details *csp); +void mp_image_swscale(struct mp_image *dst, const struct mp_image *src, + struct mp_csp_details *csp, int my_sws_flags); + #endif /* MP_SWS_UTILS_H */ // vim: ts=4 sw=4 et tw=80 |