Mercurial > mplayer.hg
view libmpcodecs/vf_flip.c @ 7743:a280cc3087ea
All right: The patch adresses two issues which I found, when I analyzed
the input from some DVDs with known subtitle-dropouts:
1. The packet-size at the beginning of the packet, which is used to
check, whether we got all fragments, is sometimes one byte too long. It
seems to be always padded to an even number, while the actual size can
be odd.
2. The original algorythm used to assemble the fragments relies on the
timestamps to check, whether a new packet begins. This has proven to be
unrelieable on some disks. So instead, I use the timestamp only to
check, whether it's been too long (defined as 0,01sec) since the last
fragment, which is probably indicating a broken packet, and normaly
starting a new packet when the last one has been finished.
patch by Christof Buergi <christof@buergi.lugs.ch>
author | arpi |
---|---|
date | Tue, 15 Oct 2002 00:47:17 +0000 |
parents | a894e99c1e51 |
children | 62d00d1c624e |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "../config.h" #include "../mp_msg.h" #include "mp_image.h" #include "vf.h" #include "../libvo/fastmemcpy.h" struct vf_priv_s { mp_image_t *dmpi; }; //===========================================================================// static int config(struct vf_instance_s* vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt){ flags&=~8; // remove the FLIP flag return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); } static void get_image(struct vf_instance_s* vf, mp_image_t *mpi){ if(mpi->flags&MP_IMGFLAG_ACCEPT_STRIDE){ // try full DR ! vf->priv->dmpi=vf_get_image(vf->next,mpi->imgfmt, mpi->type, mpi->flags, mpi->width, mpi->height); // set up mpi as a upside-down image of dmpi: mpi->planes[0]=vf->priv->dmpi->planes[0]+ vf->priv->dmpi->stride[0]*(vf->priv->dmpi->height-1); mpi->stride[0]=-vf->priv->dmpi->stride[0]; if(mpi->flags&MP_IMGFLAG_PLANAR){ mpi->planes[1]=vf->priv->dmpi->planes[1]+ vf->priv->dmpi->stride[1]*((vf->priv->dmpi->height>>mpi->chroma_y_shift)-1); mpi->stride[1]=-vf->priv->dmpi->stride[1]; mpi->planes[2]=vf->priv->dmpi->planes[2]+ vf->priv->dmpi->stride[2]*((vf->priv->dmpi->height>>mpi->chroma_y_shift)-1); mpi->stride[2]=-vf->priv->dmpi->stride[2]; } mpi->flags|=MP_IMGFLAG_DIRECT; } } static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ if(mpi->flags&MP_IMGFLAG_DIRECT){ // we've used DR, so we're ready... return vf_next_put_image(vf,vf->priv->dmpi); } vf->priv->dmpi=vf_get_image(vf->next,mpi->imgfmt, MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE, mpi->width, mpi->height); // set up mpi as a upside-down image of dmpi: vf->priv->dmpi->planes[0]=mpi->planes[0]+ mpi->stride[0]*(mpi->height-1); vf->priv->dmpi->stride[0]=-mpi->stride[0]; if(vf->priv->dmpi->flags&MP_IMGFLAG_PLANAR){ vf->priv->dmpi->planes[1]=mpi->planes[1]+ mpi->stride[1]*((mpi->height>>mpi->chroma_y_shift)-1); vf->priv->dmpi->stride[1]=-mpi->stride[1]; vf->priv->dmpi->planes[2]=mpi->planes[2]+ mpi->stride[2]*((mpi->height>>mpi->chroma_y_shift)-1); vf->priv->dmpi->stride[2]=-mpi->stride[2]; } else vf->priv->dmpi->planes[1]=mpi->planes[1]; // passthru bgr8 palette!!! return vf_next_put_image(vf,vf->priv->dmpi); } //===========================================================================// static int open(vf_instance_t *vf, char* args){ vf->config=config; vf->get_image=get_image; vf->put_image=put_image; vf->default_reqs=VFCAP_ACCEPT_STRIDE; vf->priv=malloc(sizeof(struct vf_priv_s)); return 1; } vf_info_t vf_info_flip = { "flip image upside-down", "flip", "A'rpi", "", open }; //===========================================================================//