Mercurial > mplayer.hg
changeset 30368:9f69fbf5cae6
Switch -vf halfpack to use only public API of libswscale.
author | reimar |
---|---|
date | Sat, 23 Jan 2010 23:50:25 +0000 |
parents | 2db4c1158df9 |
children | 8c479cb29c7a |
files | libmpcodecs/vf_halfpack.c |
diffstat | 1 files changed, 20 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpcodecs/vf_halfpack.c Sat Jan 23 19:00:09 2010 +0000 +++ b/libmpcodecs/vf_halfpack.c Sat Jan 23 23:50:25 2010 +0000 @@ -10,11 +10,14 @@ #include "img_format.h" #include "mp_image.h" #include "vf.h" +#include "vf_scale.h" -#include "libswscale/rgb2rgb.h" +#include "libswscale/swscale.h" +#include "fmt-conversion.h" struct vf_priv_s { int field; + struct SwsContext *ctx; }; #if HAVE_MMX @@ -144,6 +147,10 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts) { + const uint8_t *src[MP_MAX_PLANES] = { + mpi->planes[0] + mpi->stride[0]*vf->priv->field, + mpi->planes[1], mpi->planes[2], NULL}; + int src_stride[MP_MAX_PLANES] = {mpi->stride[0]*2, mpi->stride[1], mpi->stride[2], 0}; mp_image_t *dmpi; // hope we'll get DR buffer: @@ -154,9 +161,8 @@ switch(vf->priv->field) { case 0: case 1: - yuv422ptoyuy2(mpi->planes[0] + mpi->stride[0]*vf->priv->field, - mpi->planes[1], mpi->planes[2], dmpi->planes[0], - mpi->w, mpi->h/2, mpi->stride[0]*2, mpi->stride[1], dmpi->stride[0]); + sws_scale(vf->priv->ctx, src, src_stride, + 0, mpi->h/2, dmpi->planes, dmpi->stride); break; default: halfpack(dmpi->planes[0], mpi->planes, dmpi->stride[0], @@ -170,6 +176,15 @@ int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt) { + if (vf->priv->field < 2) { + sws_freeContext(vf->priv->ctx); + // get unscaled 422p -> yuy2 conversion + vf->priv->ctx = + sws_getContext(width, height / 2, PIX_FMT_YUV422P, + width, height / 2, PIX_FMT_YUYV422, + SWS_POINT | SWS_PRINT_INFO | get_sws_cpuflags(), + NULL, NULL, NULL); + } /* FIXME - also support UYVY output? */ return vf_next_config(vf, width, height/2, d_width, d_height, flags, IMGFMT_YUY2); } @@ -189,6 +204,7 @@ static void uninit(struct vf_instance_s* vf) { + sws_freeContext(vf->priv->ctx); free(vf->priv); }