Mercurial > mplayer.hg
view libmpcodecs/vf_telecine.c @ 22771:ce6b4af46882
r22547: fix up some longer than 80 char lines , and use suggestion from Diego.
r22570: dont start newline with a space and readd subdirectory
r22718: add new audio and video codecs to libavcodec list
r22748: add png and gif encoders, how to use them with mencoder is another question
r22749: split sonic into sonic/sonicls and wma into wmav1/wmav2
r22750: add rest of lavc encoders to list (vcr1, cljr, jpegls, ffvhuff, msmpeg4v1)
r22751: gsm requires libgsm so remove it
r22752: aiff isnt there as well, TEST FIRST, THEN DOCUMENT COMPN!
r22753: ok so cljr , vcr1 and msmpegv1 dont actually work... removed
r22679: Some more details for the mga_vid section taken from drivers/README.
r22686: tdfx_vid compilation has been simplified.
r22695: Add a link to Attila's mga_vid port to Linux 2.6.x.
r22704: 'make install' now takes care of most manual installation steps for *_vid.o.
author | voroshil |
---|---|
date | Sat, 24 Mar 2007 03:08:19 +0000 |
parents | 20aca9baf5d8 |
children | a124f3abc1ec |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "config.h" #include "mp_msg.h" #include "img_format.h" #include "mp_image.h" #include "vf.h" #include "libvo/fastmemcpy.h" struct vf_priv_s { int frame; }; static inline void *my_memcpy_pic(void * dst, void * src, int bytesPerLine, int height, int dstStride, int srcStride) { int i; void *retval=dst; for(i=0; i<height; i++) { memcpy(dst, src, bytesPerLine); src+= srcStride; dst+= dstStride; } return retval; } static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts) { mp_image_t *dmpi; int ret; vf->priv->frame = (vf->priv->frame+1)%4; dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PRESERVE, mpi->width, mpi->height); ret = 0; // 0/0 1/1 2/2 2/3 3/0 switch (vf->priv->frame) { case 0: my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0], mpi->planes[0]+mpi->stride[0], mpi->w, mpi->h/2, dmpi->stride[0]*2, mpi->stride[0]*2); if (mpi->flags & MP_IMGFLAG_PLANAR) { my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1], mpi->planes[1]+mpi->stride[1], mpi->chroma_width, mpi->chroma_height/2, dmpi->stride[1]*2, mpi->stride[1]*2); my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2], mpi->planes[2]+mpi->stride[2], mpi->chroma_width, mpi->chroma_height/2, dmpi->stride[2]*2, mpi->stride[2]*2); } ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE); case 1: case 2: memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, dmpi->stride[0], mpi->stride[0]); if (mpi->flags & MP_IMGFLAG_PLANAR) { memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->chroma_width, mpi->chroma_height, dmpi->stride[1], mpi->stride[1]); memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->chroma_width, mpi->chroma_height, dmpi->stride[2], mpi->stride[2]); } return vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE) || ret; case 3: my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0], mpi->planes[0]+mpi->stride[0], mpi->w, mpi->h/2, dmpi->stride[0]*2, mpi->stride[0]*2); if (mpi->flags & MP_IMGFLAG_PLANAR) { my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1], mpi->planes[1]+mpi->stride[1], mpi->chroma_width, mpi->chroma_height/2, dmpi->stride[1]*2, mpi->stride[1]*2); my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2], mpi->planes[2]+mpi->stride[2], mpi->chroma_width, mpi->chroma_height/2, dmpi->stride[2]*2, mpi->stride[2]*2); } ret = vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE); my_memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h/2, dmpi->stride[0]*2, mpi->stride[0]*2); if (mpi->flags & MP_IMGFLAG_PLANAR) { my_memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->chroma_width, mpi->chroma_height/2, dmpi->stride[1]*2, mpi->stride[1]*2); my_memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->chroma_width, mpi->chroma_height/2, dmpi->stride[2]*2, mpi->stride[2]*2); } return ret; } return 0; } static int query_format(struct vf_instance_s* vf, unsigned int fmt) { /* FIXME - figure out which other formats work */ switch (fmt) { case IMGFMT_YV12: case IMGFMT_IYUV: case IMGFMT_I420: return vf_next_query_format(vf, fmt); } return 0; } static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt) { return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); } static void uninit(struct vf_instance_s* vf) { free(vf->priv); } static int open(vf_instance_t *vf, char* args) { //vf->config = config; vf->put_image = put_image; //vf->query_format = query_format; vf->uninit = uninit; vf->default_reqs = VFCAP_ACCEPT_STRIDE; vf->priv = calloc(1, sizeof(struct vf_priv_s)); vf->priv->frame = 1; if (args) sscanf(args, "%d", &vf->priv->frame); vf->priv->frame--; return 1; } vf_info_t vf_info_telecine = { "telecine filter", "telecine", "Rich Felker", "", open, NULL };