# HG changeset patch # User rfelker # Date 1062384846 0 # Node ID 012eeac10e165c31d5aa204107c297dead8ad0bb # Parent 57971d3c8beece81bcfc1cb458dfd0dcc8a3bff0 direct render frames whose fields are not in a common buffer, rather than repacking them together and exporting. slight performance boost. diff -r 57971d3c8bee -r 012eeac10e16 libmpcodecs/vf_pullup.c --- a/libmpcodecs/vf_pullup.c Mon Sep 01 01:24:33 2003 +0000 +++ b/libmpcodecs/vf_pullup.c Mon Sep 01 02:54:06 2003 +0000 @@ -93,8 +93,6 @@ mpi->flags |= MP_IMGFLAG_DIRECT; mpi->flags &= ~MP_IMGFLAG_DRAW_CALLBACK; - - //mpi->width = mpi->stride[0]; } static int put_image(struct vf_instance_s* vf, mp_image_t *mpi) @@ -133,7 +131,6 @@ p = mpi->fields & MP_IMGFIELD_TOP_FIRST ? 0 : (mpi->fields & MP_IMGFIELD_ORDERED ? 1 : 0); - //printf("p=%d\n", p); pullup_submit_field(c, b, p); pullup_submit_field(c, b, p^1); if (mpi->fields & MP_IMGFIELD_REPEAT_FIRST) @@ -158,16 +155,40 @@ } /* If the frame isn't already exportable... */ - if (!f->buffer) { - /* FIXME: DR disabled for now */ - if (0) { - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->width, mpi->height); - /* FIXME: draw into DR buffer */ - return vf_next_put_image(vf, dmpi); + 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; } - pullup_pack_frame(c, f); + /* Direct render fields into output buffer */ + p = f->parity; + my_memcpy_pic(dmpi->planes[0], f->fields[p]->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->fields[p^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->fields[p]->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->fields[p^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->fields[p]->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->fields[p^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); + return vf_next_put_image(vf, dmpi); } dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE,