diff options
Diffstat (limited to 'video/filter/vf_pullup.c')
-rw-r--r-- | video/filter/vf_pullup.c | 134 |
1 files changed, 40 insertions, 94 deletions
diff --git a/video/filter/vf_pullup.c b/video/filter/vf_pullup.c index acac407429..84bc64b1cf 100644 --- a/video/filter/vf_pullup.c +++ b/video/filter/vf_pullup.c @@ -75,55 +75,25 @@ static void init_pullup(struct vf_instance *vf, mp_image_t *mpi) vf->priv->qbuf = malloc(c->w[3]); } - -#if 0 -static void get_image(struct vf_instance *vf, mp_image_t *mpi) -{ - struct pullup_context *c = vf->priv->ctx; - struct pullup_buffer *b; - - if (mpi->type == MP_IMGTYPE_STATIC) return; - - if (!vf->priv->init) init_pullup(vf, mpi); - - b = pullup_get_buffer(c, 2); - if (!b) return; /* shouldn't happen... */ - - mpi->priv = b; - - mpi->planes[0] = b->planes[0]; - mpi->planes[1] = b->planes[1]; - mpi->planes[2] = b->planes[2]; - mpi->stride[0] = c->stride[0]; - mpi->stride[1] = c->stride[1]; - mpi->stride[2] = c->stride[2]; - - mpi->flags |= MP_IMGFLAG_DIRECT; -} -#endif - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) +static struct mp_image *filter(struct vf_instance *vf, struct mp_image *mpi) { struct pullup_context *c = vf->priv->ctx; struct pullup_buffer *b; struct pullup_frame *f; - mp_image_t *dmpi; - int ret; int p; int i; + double pts = mpi->pts; + struct mp_image *dmpi = NULL; if (!vf->priv->init) init_pullup(vf, mpi); - if (mpi->flags & MP_IMGFLAG_DIRECT) { - b = mpi->priv; - mpi->priv = 0; - } else { + if (1) { b = pullup_get_buffer(c, 2); if (!b) { mp_msg(MSGT_VFILTER,MSGL_ERR,"Could not get buffer from pullup!\n"); f = pullup_get_frame(c); pullup_release_frame(f); - return 0; + goto skip; } memcpy_pic(b->planes[0], mpi->planes[0], mpi->w, mpi->h, c->stride[0], mpi->stride[0]); @@ -174,21 +144,23 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) /* Fake yes for first few frames (buffer depth) to keep from * breaking A/V sync with G1's bad architecture... */ - if (!f) return vf->priv->fakecount ? (--vf->priv->fakecount,1) : 0; + //if (!f) return vf->priv->fakecount ? (--vf->priv->fakecount,1) : 0; + if (!f) + goto skip; if (f->length < 2) { pullup_release_frame(f); f = pullup_get_frame(c); - if (!f) return 0; + if (!f) goto skip; if (f->length < 2) { pullup_release_frame(f); if (!(mpi->fields & MP_IMGFIELD_REPEAT_FIRST)) - return 0; + goto skip; f = pullup_get_frame(c); - if (!f) return 0; + if (!f) goto skip; if (f->length < 2) { pullup_release_frame(f); - return 0; + goto skip; } } } @@ -210,66 +182,42 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) } #endif - /* If the frame isn't already exportable... */ - while (!f->buffer) { - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->width, mpi->height); - /* FIXME: Is it ok to discard dmpi if it's not direct? */ - if (!(dmpi->flags & MP_IMGFLAG_DIRECT)) { - pullup_pack_frame(c, f); - break; - } - /* Direct render fields into output buffer */ - my_memcpy_pic(dmpi->planes[0], f->ofields[0]->planes[0], - mpi->w, mpi->h/2, dmpi->stride[0]*2, c->stride[0]*2); - my_memcpy_pic(dmpi->planes[0] + dmpi->stride[0], - f->ofields[1]->planes[0] + c->stride[0], - mpi->w, mpi->h/2, dmpi->stride[0]*2, c->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1], f->ofields[0]->planes[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, c->stride[1]*2); - my_memcpy_pic(dmpi->planes[1] + dmpi->stride[1], - f->ofields[1]->planes[1] + c->stride[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, c->stride[1]*2); - my_memcpy_pic(dmpi->planes[2], f->ofields[0]->planes[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, c->stride[2]*2); - my_memcpy_pic(dmpi->planes[2] + dmpi->stride[2], - f->ofields[1]->planes[2] + c->stride[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, c->stride[2]*2); - } - pullup_release_frame(f); - if (mpi->qscale) { - dmpi->qscale = vf->priv->qbuf; - dmpi->qstride = mpi->qstride; - dmpi->qscale_type = mpi->qscale_type; - } - return vf_next_put_image(vf, dmpi, f->pts); - } - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->width, mpi->height); + /* If the frame isn't already exportable... */ + if (!f->buffer) + pullup_pack_frame(c, f); + + // NOTE: the copy could probably be avoided by changing or using the + // pullup internal buffer management. But right now just do the + // safe thing and always copy. Code outside the filter might + // hold a buffer reference even if the filter chain is destroyed. + dmpi = vf_alloc_out_image(vf); + mp_image_copy_attributes(dmpi, mpi); + + struct mp_image data = *dmpi; - dmpi->planes[0] = f->buffer->planes[0]; - dmpi->planes[1] = f->buffer->planes[1]; - dmpi->planes[2] = f->buffer->planes[2]; + data.planes[0] = f->buffer->planes[0]; + data.planes[1] = f->buffer->planes[1]; + data.planes[2] = f->buffer->planes[2]; - dmpi->stride[0] = c->stride[0]; - dmpi->stride[1] = c->stride[1]; - dmpi->stride[2] = c->stride[2]; + data.stride[0] = c->stride[0]; + data.stride[1] = c->stride[1]; + data.stride[2] = c->stride[2]; + mp_image_copy(dmpi, &data); + + dmpi->pts = f->pts; + + // Warning: entirely bogus memory management of qscale if (mpi->qscale) { dmpi->qscale = vf->priv->qbuf; dmpi->qstride = mpi->qstride; dmpi->qscale_type = mpi->qscale_type; } - ret = vf_next_put_image(vf, dmpi, f->pts); pullup_release_frame(f); - return ret; + +skip: + talloc_free(mpi); + return dmpi; } static int query_format(struct vf_instance *vf, unsigned int fmt) @@ -302,12 +250,10 @@ static int vf_open(vf_instance_t *vf, char *args) { struct vf_priv_s *p; struct pullup_context *c; - //vf->get_image = get_image; - vf->put_image = put_image; + vf->filter = filter; vf->config = config; vf->query_format = query_format; vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; vf->priv = p = calloc(1, sizeof(struct vf_priv_s)); p->ctx = c = pullup_alloc_context(); p->fakecount = 1; |