--- Jason Tackaberry <[EMAIL PROTECTED]> escreveu:
> De: Jason Tackaberry <[EMAIL PROTECTED]>
> Para: [EMAIL PROTECTED]
> Data: 20 Oct 2003 00:55:14 -0400
> Assunto: [MPlayer-dev-eng]
> [PATCH] vf_bmovl2 - rewrite of vf_bmovl - Extra Tasty Crispy
> version
>
> I have been working with the bmovl filter over the past few days and
> have come across a few limitations. For example, I wanted to be able
> to
> animate an overlaid image, but the design of bmovl made it very
> difficult to be modified for this task.
>
> So I've worked up a new version of bmovl that has several design
> differences. The original bmovl uses a single bitmap which has the
> same
> dimensions of the video. This modified version can have up to 10
> separate bitmaps of varying sizes and they are overlaid at arbitrary
> coordinates.
>
> Another feature of bmovl2 is the introduction of ATOM/ENDATOM
> commands,
> which specify a list of operations to be executed in between frames.
> For example, suppose you want to move an image and adjust its alpha
> level. With bmovl, this would take 2 frames because only one command
> is
> evaluated per frame. With bmovl2, you just send this to the fifo:
>
> ATOM
> MOVE 0 100 200
> ALPHA 0 200
> ENDATOM
>
> This would move the image with id 0 to coords 100,200 and set the
> alpha
> level for that image to 100 before the next frame is drawn. As you
> can
> see, it wouldn't be very difficult to have a nice animated menu that
> slides in from off screen and fades in as it's moving. Or if you're
> transitioning menus, as the new menu slides in, it could push the old
> menu off the screen as it fades out (by using a second image id). In
> fact, I've already done this and it looks and works great.
>
> bmovl2 can also be updated while mplayer is paused. This was an
> important requirement for me, and I bet freevo will benefit from it
> as
> well. Additionally, only one bmovl2 filter can be instantiated --
> this
> was a design decision because I wanted the overlay images to survive
> a
> loadfile command. While this is contrary to mplayer's filter design
> (the ability to chain filters), in practice I strongly doubt it will
> be
> a problem and there are good reasons to only allow one instance.
>
> There is a bit of documentation at the top of vf_bmovl2.c, but I've
> not
> yet patched the man page because I wasn't sure if this has a chance
> of
> being accepted. If there's interest, I'll update the man pages. I
> will
> also submit a test program similar to the original bmovl-test.
>
> I made some modifications in mplayer.c that affect timing (to make
> updating more responsive while paused) and I might not have a full
> appreciation of the impact of those changes. They strike me as
> benign,
> but they would benefit from more eyeballs.
>
> So I submit this patch for your review and comments. Consider it a
> first draft. :)
>
> Cheers,
> Jason.
>
> --
> Jason Tackaberry :: [EMAIL PROTECTED] :: 705-949-2301 x330
> Academic Computing Support Specialist
> Information Technology Services
> Algoma University College :: www.auc.ca
> > --- main.current/libmpcodecs/vf_bmovl2.c 1969-12-31
> 19:00:00.000000000 -0500
> +++ main/libmpcodecs/vf_bmovl2.c 2003-10-20 00:30:26.000000000 -0400
> @@ -0,0 +1,521 @@
> +/* vf_bmovl2.c - BitMap OVerLay videofilter for MPlayer - Take 2
> + *
> + * (C) 2003 Jason Tackaberry <[EMAIL PROTECTED]>
> + * Large portions of code taken from vf_bmovl.c which is
> + * (C) 2002 Per Wigren <[EMAIL PROTECTED]>
> + * Licenced under the GNU General Public License
> + *
> + * Use MPlayer as a framebuffer to read bitmaps and commands from a
> FIFO
> + * and display them in the window.
> + *
> + *
> + * You can store up to 10 (or NUM_IMAGES) images where each image is
>
> + * referenced by an integer id. Then you can perform operations on
> these
> + * images, like moving, adjusting alpha, toggling visibility, etc.
> + *
> + * This filter takes one argument: the filename of the fifo from
> which
> + * to read commands. e.g. -vf bmovl2=/tmp/mplayer.fifo
> + *
> + * Commands are:
> + *
> + * RAWIMG id format w h reset
> + * - Stores an image in the given id. format can be any
> combination of
> + * either RGBA or RGB. For example, these are all valid
> formats: RGBA,
> + * RBGA, ARGB, ABGR, RGB, GBR, etc. w and h are the width and
> height of
> + * the image. reset specifies whether or not to reset the
> other data
> + * associated with this image id: x, y coordinates, alpha
> level,
> + * visibility, and z-index. If reset is 1, these values are
> reset,
> + * otherwise they are left alone.
> + * - This command is followed by w*h*bpp bytes of data. If
> format is a
> + * combination of letters RGB, then bpp is 3; if format is a
> combination
> + * of RGBA, bpp is 4.
> + *
> + * VISIBLE id visibility
> + * - Sets visibility of the specified image referenced by id.
> visibility is
> + * 0 to hide, or 1 to show.
> + *
> + * MOVE id x y
> + * - Move the image with id to coordinates x, y
> + *
> + * ALPHA id alpha
> + * - Sets the transparency of the image to alpha, where 0 <=
> alpha <= 255, 0
> + * being fully transparent and 255 being fully opaque. This
> value is
> + * multiplied with the alpha channel of each individual pixel
> in the
> + * image. So if a pixel has an alpha of 100 and the image has
> an alpha
> + * of 128 (as set by this command), the resulting pixel will
> have an
> + * alpha of 50.
> + *
> + * ZINDEX id zindex
> + * - Sets the z-index (layer) of the specified image. The
> z-index is an
> + * arbitrary integer. The lower the z-index the closer to the
> background
> + * (i.e. movie) the image is displayed.
> + *
> + * ATOM
> + * - Indicate the operations that follow until an ENDATOM command
> is
> + * reached are atomic -- that is, they will be all be evaluated
> before
> + * the next frame is drawn. This allows you to, for example,
> movie
> + * an image to a new position and change its alpha channel in
> between
> + * frames.
> + *
> + * ENDATOM
> + * - End the list of operations and render the frame (or more
> accurately,
> + * pass control to the next video filter).
> + *
> + */
> +
> +#ifndef HAVE_NO_POSIX_SELECT
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <unistd.h>
> +#include <errno.h>
> +#include <sys/stat.h>
> +#include <sys/types.h>
> +#include <sys/time.h>
> +#include <fcntl.h>
> +#include "mp_image.h"
> +#include "vf.h"
> +#include "img_format.h"
> +#include "../config.h"
> +
> +#include "../mp_msg.h"
> +#include "../libvo/fastmemcpy.h"
> +#include "../libvo/video_out.h"
> +#include "../input/input.h"
> +
> +#define NUM_IMAGES 10
> +#define FALSE 0
> +#define TRUE !FALSE
> +
> +#define rgb2y(R,G,B) ( (( 263*R + 516*G + 100*B) >> 10) + 16 )
> +#define rgb2u(R,G,B) ( ((-152*R - 298*G + 450*B) >> 10) + 128 )
> +#define rgb2v(R,G,B) ( (( 450*R - 376*G - 73*B) >> 10) + 128 )
> +
> +#define CMD_RAWIMG 0x100
> +#define CMD_ALPHA 0x101
> +#define CMD_VISIBLE 0x102
> +#define CMD_MOVE 0x103
> +#define CMD_ZINDEX 0x104
> +
> +struct vf_priv_s {
> + struct {
> + unsigned char *y, *u, *v, *a;
> + int left, top, w, h, zindex, alpha, visible;
> + } images[NUM_IMAGES];
> + int img_order[NUM_IMAGES];
> + int stream_fd;
> + int mpi_width, mpi_height;
> +};
> +
> +vf_instance_t* vf_bmovl2 = NULL;
> +mp_image_t* pause_mpi = NULL;
> +
> +static int pause_state;
> +static struct vf_priv_s *vf_bmovl2_priv;
> +static int cmd_filter(mp_cmd_t* cmd, int paused, struct vf_priv_s
> *priv);
> +static int put_image(struct vf_instance_s* vf, mp_image_t* mpi);
> +
>
> +inline static void copy_mpi(mp_image_t *dmpi, mp_image_t *mpi)
> +{
> + if (mpi->flags&MP_IMGFLAG_PLANAR) {
> + memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h,
> dmpi->stride[0],mpi->stride[0]);
> + 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]);
> + } else {
> + memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w*(dmpi->bpp/8),
> mpi->h, dmpi->stride[0], mpi->stride[0]);
> + }
> +}
> +
>
> +void vf_bmovl2_pause_update(vo_functions_t *video_out)
> +{
> + if (vf_bmovl2 && put_image(vf_bmovl2, pause_mpi))
> + video_out->flip_page();
> +}
> +
> +
> +static int
> +query_format(struct vf_instance_s* vf, unsigned int fmt)
> +{
> + if (fmt == IMGFMT_YV12)
> + return VFCAP_CSP_SUPPORTED;
> + 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)
> +{
> + if (!vf_bmovl2) {
> + int i;
> + // Default image order (all z-indexes are 0)
> + for (i = 0; i < NUM_IMAGES; i++)
> + vf->priv->img_order[i] = i;
> + memset(vf->priv->images, 0, sizeof(vf->priv->images));
> + }
> + vf->priv->mpi_width = width;
> + vf->priv->mpi_height = height;
> + vf_bmovl2 = vf;
> + return vf_next_config(vf, width, height, d_width, d_height, flags,
> outfmt);
> +}
> +
> +inline static int
> +check_fifo(int fd)
> +{
> + struct timeval tv;
> + fd_set fdset;
> +
> + FD_ZERO(&fdset);
> + FD_SET(fd, &fdset);
> + tv.tv_sec = tv.tv_usec = 0;
> + return select(fd + 1, &fdset, NULL, NULL, &tv);
> +}
> +
> +
> +inline static int
> +read_cmd(int fd, char *cmd, char *args)
> +{
> + char *p = cmd, *start = cmd, maxlen = 20;
> + *args = 0;
> + while (read(fd, p, 1)) {
> + if (*p == ' ' && start == cmd) {
> + *p = 0;
> + p = start = args;
> + maxlen = 100;
> + }
> + else if (*p == '\n' || p - start > maxlen) { *p = 0; return TRUE;
> }
> + else p++;
> + }
> + return FALSE;
> +}
> +
> +inline static int
> +handle_commands(struct vf_priv_s* priv)
> +{
> + int is_atomic = FALSE, res, command;
> + char cmd[20], args[100];
> + unsigned char *buffer = NULL;
> +
> + do {
> + res = check_fifo(priv->stream_fd);
> + if (res == 0) {
> + if (is_atomic)
> + usleep(10000);
> + else
> + return FALSE;
> + } else if(res < 0) {
> + mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl2: Error %d in fifo:
> %s\n\n", errno, strerror(errno));
> + return FALSE;
> + }
> +
> + // If we're here it means there's a command in the fifo
> + if(!read_cmd(priv->stream_fd, cmd, args)) {
> + mp_msg(MSGT_VFILTER, MSGL_ERR, "\nvf_bmovl: Error reading
> commands: %s\n\n", strerror(errno));
> + return FALSE;
> + }
> +
> + command = 0;
> + if (strncmp(cmd, "RAWIMG", 6) == 0) command = CMD_RAWIMG;
> + if (strncmp(cmd, "ALPHA", 5) == 0) command = CMD_ALPHA;
> + if (strncmp(cmd, "VISIBLE", 7) == 0) command = CMD_VISIBLE;
> + if (strncmp(cmd, "MOVE", 4) == 0) command = CMD_MOVE;
> + if (strncmp(cmd, "ZINDEX", 6) == 0) command = CMD_ZINDEX;
> + if (strncmp(cmd, "ATOM", 4) == 0) is_atomic = TRUE;
> + if (strncmp(cmd, "ENDATOM", 7) == 0) break;
> +
> + switch (command) {
> +
> + case CMD_ZINDEX: { // ZINDEX img_id zindex
> + int id, zindex, i, j;
> + sscanf(args, "%d %d", &id, &zindex);
> + if (id < 0 || id > 20) {
> + mp_msg(MSGT_VFILTER, MSGL_ERR, "\nvf_bmovl2:
> CMD_ALPHA: image
> id out of range (%d)\n", id);
> + break;
> + }
> + priv->images[id].zindex = zindex;
> +
> + // Figure out which order we blit the images based on
> zindex
> + for (i = 0; i < NUM_IMAGES - 1; i++) {
> + int pos = i;
> + for (j = i + 1; j < NUM_IMAGES; j++)
> + if
> (priv->images[priv->img_order[j]].zindex <
> +
> priv->images[priv->img_order[pos]].zindex)
> + pos = j;
> + if (pos != i) {
> + int tmp = priv->img_order[i];
> + priv->img_order[i] =
> priv->img_order[pos];
> + priv->img_order[pos] = tmp;
> + }
> + }
> + break;
> + }
> +
> + case CMD_MOVE: { // MOVE img_id x y
> + int id, x, y;
> + sscanf(args, "%d %d %d", &id, &x, &y);
> + if (id < 0 || id > 20) {
> + mp_msg(MSGT_VFILTER, MSGL_ERR, "\nvf_bmovl2:
> CMD_ALPHA: image
> id out of range (%d)\n", id);
> + break;
> + }
> + priv->images[id].left = x;
> + priv->images[id].top = y;
> + break;
> + }
> +
> + case CMD_ALPHA: { // ALPHA img_id alpha
> + int id, alpha;
> + sscanf(args, "%d %d", &id, &alpha);
> + if (id < 0 || id > 20) {
> + mp_msg(MSGT_VFILTER, MSGL_ERR, "\nvf_bmovl2:
> CMD_ALPHA: image
> id out of range (%d)\n", id);
> + break;
> + }
> + priv->images[id].alpha = alpha;
> + break;
> + }
> +
> + case CMD_VISIBLE: { // VISIBLE img_id flag
> + int id, visible;
> + sscanf(args, "%d %d", &id, &visible);
> + if (id < 0 || id > 20) {
> + mp_msg(MSGT_VFILTER, MSGL_ERR, "\nvf_bmovl2:
> CMD_VISIBL: image
> id out of range (%d)\n", id);
> + break;
> + }
> + priv->images[id].visible = visible;
> + break;
> + }
> +
> + case CMD_RAWIMG: { // RAWIMG img_id format w h reset
> + char format[5], *imgbuf;
> + int id, w = 0, h = 0, reset = 0, bpp, i,
> + r_pos, g_pos, b_pos, a_pos;
> +
> + sscanf(args, "%d %s %d %d %d", &id, &format, &w, &h,
> &reset);
> + if (id < 0 || id > 20) {
> + mp_msg(MSGT_VFILTER, MSGL_ERR, "\nvf_bmovl2:
> CMD_RAWIMG: image
> id out of range (%d)\n", id);
> + break;
> + }
> + bpp = strlen(format);
> + if (bpp != 3 && bpp != 4) {
> + mp_msg(MSGT_VFILTER, MSGL_ERR, "\nvf_bmovl2:
> CMD_RAWIMG:
> invalid image format\n");
> + break;
> + }
> + imgbuf = malloc(w * h * bpp);
> + if(!imgbuf) {
> + mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl2:
> CMD_RAWIMG:
> couldn't allocate temp buffer (%d bytes)\n", w * h * bpp);
> + break;
> + }
> + int bytes = read(priv->stream_fd, imgbuf, w * h * bpp);
> + if (bytes != w * h * bpp) {
> + mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl2:
> CMD_RAWIMG: image
> too short\n");
> + free(imgbuf);
> + break;
> + }
> +
> + for (i = 0; i < bpp; i++) {
> + switch (format[i]) {
> + case 'R': r_pos = i; break;
> + case 'G': g_pos = i; break;
> + case 'B': b_pos = i; break;
> + case 'A': a_pos = i; break;
> + }
> + }
> +
> + // Free memory of an existing image
> + if (priv->images[id].y) {
> + free(priv->images[id].y);
> + free(priv->images[id].u);
> + free(priv->images[id].v);
> + free(priv->images[id].a);
> + }
> + // Allocate memory for new image
> + priv->images[id].y = malloc(w * h);
> + priv->images[id].u = malloc(w * h / 4);
> + priv->images[id].v = malloc(w * h / 4);
> + priv->images[id].a = malloc(w * h);
> + priv->images[id].w = w;
> + priv->images[id].h = h;
> +
> + // Convert the image to YUV
> + int buf_x, buf_y;
> + for (buf_y = 0; buf_y < h; buf_y++) {
> + for (buf_x = 0; buf_x < w * bpp; buf_x += bpp)
> {
> + int buf_pos = (buf_y * w * bpp) +
> buf_x,
> + img_pos = (buf_y * w) + (buf_x /
> bpp);
> + unsigned char r = imgbuf[buf_pos +
> r_pos],
> + g = imgbuf[buf_pos +
> g_pos],
> + b = imgbuf[buf_pos +
> b_pos],
> + a = (bpp == 4) ?
> imgbuf[buf_pos + a_pos] : 0xFF;
> +
> + priv->images[id].y[img_pos] =
> rgb2y(r, g, b);
> + priv->images[id].a[img_pos] = a;
> +
> + if((buf_y % 2) && ((buf_x / bpp) % 2))
> {
> + img_pos = ((buf_y / 2) * (w /
> 2)) + (buf_x / bpp / 2);
> + priv->images[id].u[img_pos] =
> rgb2u(r, g, b);
> + priv->images[id].v[img_pos] =
> rgb2v(r, g, b);
> + }
> + }
> + }
> + if (reset) {
> + priv->images[id].visible = TRUE;
> + priv->images[id].alpha = 255;
> + priv->images[id].left = priv->images[id].top =
> 0;
> + priv->images[id].zindex = 0;
> + }
> + free(imgbuf);
> + break;
> + }
> + }
> + } while (is_atomic);
> +}
> +
> +
> +static int
> +put_image(struct vf_instance_s* vf, mp_image_t* mpi)
> +{
> + mp_image_t *dmpi;
> + int img_id, i, ypos, xpos, top, left;
> + float alpha_mod;
> +
> + if (pause_state == 1) {
> + pause_state = 2;
> + pause_mpi = vf_get_image(vf, mpi->imgfmt, MP_IMGTYPE_IP,
> + MP_IMGFLAG_ACCEPT_STRIDE |
> MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
> + mpi->w, mpi->h);
> + copy_mpi(pause_mpi, mpi);
> + mpi = pause_mpi;
> + }
> +
> + dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_TEMP,
> + MP_IMGFLAG_ACCEPT_STRIDE |
> MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
> + mpi->w, mpi->h);
> +
> + copy_mpi(dmpi, mpi);
> + if (!handle_commands(vf->priv) && pause_state != 0)
> + return 0;
> +
> + for (i = 0; i < NUM_IMAGES; i++) {
> + img_id = vf->priv->img_order[i];
> + if (vf->priv->images[img_id].visible == FALSE)
> + continue;
> + // Don't bother if the image isn't even on screen
> + if (vf->priv->images[img_id].top >= vf->priv->mpi_height ||
> + vf->priv->images[img_id].left >= vf->priv->mpi_width ||
> + vf->priv->images[img_id].left + vf->priv->images[img_id].w < 0
> ||
> + vf->priv->images[img_id].top + vf->priv->images[img_id].h < 0)
> + continue;
> +
> + top = vf->priv->images[img_id].top;
> + left = vf->priv->images[img_id].left;
> + alpha_mod = vf->priv->images[img_id].alpha / 255.0;
> + for(ypos = 0; ypos < vf->priv->images[img_id].h; ypos++) {
> + if (ypos + top >= vf->priv->mpi_height) break;
> + if (ypos + top < 0) continue;
> + for (xpos = 0; xpos < vf->priv->images[img_id].w; xpos++) {
> + int img_pos, alpha, mpi_pos;
> +
> + if (xpos + left >= vf->priv->mpi_width) break;
> + if (xpos + left < 0) continue;
> +
> + if (ypos + top >= vf->priv->mpi_height || xpos + left
> >=
> vf->priv->mpi_width ||
> + ypos + top < 0 || xpos + left < 0)
> + continue;
> +
> + img_pos = ypos * (vf->priv->images[img_id].w) + xpos;
> + alpha = vf->priv->images[img_id].a[img_pos];
> + if (vf->priv->images[img_id].alpha != 255)
> + alpha *= alpha_mod;
> +
> + if (alpha == 0)
> + continue;
> + mpi_pos = (ypos + top) * dmpi->stride[0] + (xpos +
> left);
> +
> + if (alpha == 255) {
> + dmpi->planes[0][mpi_pos] =
> vf->priv->images[img_id].y[img_pos];
> + if ((ypos % 2) && (xpos % 2)) {
> + img_pos = (ypos / 2) *
> (vf->priv->images[img_id].w/2) + (xpos
> / 2);
> + mpi_pos = ((ypos + top) / 2) *
> dmpi->stride[1] + ((xpos +
> left) / 2);
> + dmpi->planes[1][mpi_pos] =
> vf->priv->images[img_id].u[img_pos];
> + dmpi->planes[2][mpi_pos] =
> vf->priv->images[img_id].v[img_pos];
> + }
> + } else {
> + dmpi->planes[0][mpi_pos] =
> + ((255 - alpha) *
> (int)dmpi->planes[0][mpi_pos] +
> + alpha *
> (int)vf->priv->images[img_id].y[img_pos]) >> 8;
> +
> + if ((ypos % 2) && (xpos % 2)) {
> + img_pos = (ypos / 2) *
> (vf->priv->images[img_id].w / 2) +
> (xpos / 2);
> + mpi_pos = ((ypos + top) / 2) *
> dmpi->stride[1] + ((xpos +
> left) / 2);
> + dmpi->planes[1][mpi_pos] =
> + ((255 - alpha) *
> (int)dmpi->planes[1][mpi_pos] +
> + alpha *
> (int)vf->priv->images[img_id].u[img_pos]) >> 8;
> +
> + dmpi->planes[2][mpi_pos] =
> + ((255 - alpha) *
> (int)dmpi->planes[2][mpi_pos] +
> + alpha *
> (int)vf->priv->images[img_id].v[img_pos]) >> 8;
> + }
> + }
> + } // for xpos
> + } // for ypos
> + }
> + return vf_next_put_image(vf, dmpi);
> +}
> +
> +static int
> +vf_open(vf_instance_t* vf, char* args)
> +{
> + char filename[1000];
> +
> + vf->config = config;
> + vf->put_image = put_image;
> + vf->query_format = query_format;
> + vf->uninit = NULL; // persistent
> +
> + if (vf_bmovl2_priv) {
> + vf->priv = vf_bmovl2_priv;
> + }
> + else {
> + vf->priv = vf_bmovl2_priv = malloc(sizeof(struct vf_priv_s));
> + if(!args || sscanf(args, "%s", filename) < 1 ) {
> + mp_msg(MSGT_VFILTER, MSGL_ERR, "vf_bmovl2: missing fifo
> filename
> argument.\n");
> + return FALSE;
> + }
> + vf->priv->stream_fd = open(filename, O_RDWR);
> + if (vf->priv->stream_fd < 0)
> + mp_msg(MSGT_VFILTER, MSGL_WARN, "vf_bmovl: Error! Couldn't open
> FIFO %s: %s\n", filename, strerror(errno));
> + mp_input_add_cmd_filter((mp_input_cmd_filter)cmd_filter,
> vf->priv);
> + }
> + pause_state = 0;
> + return TRUE;
> +}
> +
> +static int cmd_filter(mp_cmd_t* cmd, int paused, struct vf_priv_s *
> priv) {
> + switch(cmd->id) {
> + case MP_CMD_PAUSE:
> + if (pause_state == 2)
> + pause_state = 0;
> + else
> + pause_state = 1;
> + break;
> + default:
> + pause_state = 0;
> + break;
> + }
> + return 0;
> +}
> +
> +
> +
> +vf_info_t vf_info_bmovl2 = {
> + "Read bitmaps from a FIFO and display them in window",
> + "bmovl2",
> + "Jason Tackaberry",
> + "",
> + vf_open,
> + NULL
> +};
> +
> +#endif
> +// vim: ts=3
> --- main.current/mplayer.c 2003-10-19 23:39:48.000000000 -0400
> +++ main/mplayer.c 2003-10-20 00:26:57.000000000 -0400
> @@ -332,6 +332,9 @@
> static char* menu_root = "main";
> #endif
>
> +#ifndef HAVE_NO_POSIX_SELECT
> +extern void vf_bmovl2_pause_update(vo_functions_t*);
> +#endif
>
> #ifdef HAVE_RTC
> static int nortc;
> @@ -2415,7 +2418,7 @@
> if (audio_out && sh_audio)
> audio_out->pause(); // pause audio, keep data if possible
>
> - while( (cmd = mp_input_get_cmd(20,1)) == NULL) {
> + while( (cmd = mp_input_get_cmd(0,1)) == NULL) {
> if(sh_video && video_out && vo_config_count)
> video_out->check_events();
> #ifdef HAVE_NEW_GUI
> if(use_gui){
> @@ -2428,7 +2431,10 @@
> if(vf_menu)
> vf_menu_pause_update(vf_menu);
> #endif
> - usec_sleep(20000);
> +#ifndef HAVE_NO_POSIX_SELECT
> + vf_bmovl2_pause_update(video_out);
> +#endif
> + usec_sleep(10000);
> }
> mp_cmd_free(cmd);
> osd_function=OSD_PLAY;
> --- main.current/libmpcodecs/vf.c 2003-10-19 23:39:51.000000000 -0400
> +++ main/libmpcodecs/vf.c 2003-10-19 23:42:04.000000000 -0400
> @@ -23,6 +23,7 @@
> extern vf_info_t vf_info_rectangle;
> #ifndef HAVE_NO_POSIX_SELECT
> extern vf_info_t vf_info_bmovl;
> +extern vf_info_t vf_info_bmovl2;
> #endif
> extern vf_info_t vf_info_crop;
> extern vf_info_t vf_info_expand;
> @@ -81,6 +82,7 @@
> &vf_info_rectangle,
> #ifndef HAVE_NO_POSIX_SELECT
> &vf_info_bmovl,
> + &vf_info_bmovl2,
> #endif
> &vf_info_crop,
> &vf_info_expand,
> --- main.current/libmpcodecs/Makefile 2003-10-19 23:39:51.000000000
> -0400
> +++ main/libmpcodecs/Makefile 2003-10-19 23:42:04.000000000 -0400
> @@ -14,7 +14,7 @@
> VIDEO_SRCS_OPT=vd_realvid.c vd_ffmpeg.c vd_dshow.c vd_dmo.c vd_vfw.c
> vd_vfwex.c vd_odivx.c vd_divx4.c vd_xanim.c vd_xvid.c vd_libdv.c
> vd_qtvideo.c vd_theora.c
> VIDEO_SRCS=dec_video.c vd.c $(VIDEO_SRCS_NAT) $(VIDEO_SRCS_LIB)
> $(VIDEO_SRCS_OPT)
>
> -VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_pp.c vf_scale.c
> vf_format.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c vf_rotate.c vf_mirror.c
> vf_palette.c vf_lavc.c vf_dvbscale.c vf_cropdetect.c vf_test.c
> vf_noise.c vf_yvu9.c vf_rectangle.c vf_lavcdeint.c vf_eq.c vf_eq2.c
> vf_halfpack.c vf_dint.c vf_1bpp.c vf_bmovl.c vf_2xsai.c vf_unsharp.c
> vf_swapuv.c vf_il.c vf_boxblur.c vf_sab.c vf_smartblur.c
> vf_perspective.c vf_down3dright.c vf_field.c vf_denoise3d.c
> vf_hqdn3d.c vf_detc.c vf_telecine.c vf_tfields.c vf_ivtc.c
> vf_ilpack.c vf_dsize.c vf_decimate.c vf_softpulldown.c
> vf_tinterlace.c vf_pullup.c pullup.c vf_framestep.c vf_tile.c
> vf_delogo.c
> +VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_pp.c vf_scale.c
> vf_format.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c vf_rotate.c vf_mirror.c
> vf_palette.c vf_lavc.c vf_dvbscale.c vf_cropdetect.c vf_test.c
> vf_noise.c vf_yvu9.c vf_rectangle.c vf_lavcdeint.c vf_eq.c vf_eq2.c
> vf_halfpack.c vf_dint.c vf_1bpp.c vf_bmovl.c vf_bmovl2.c vf_2xsai.c
> vf_unsharp.c vf_swapuv.c vf_il.c vf_boxblur.c vf_sab.c vf_smartblur.c
> vf_perspective.c vf_down3dright.c vf_field.c vf_denoise3d.c
> vf_hqdn3d.c vf_detc.c vf_telecine.c vf_tfields.c vf_ivtc.c
> vf_ilpack.c vf_dsize.c vf_decimate.c vf_softpulldown.c
> vf_tinterlace.c vf_pullup.c pullup.c vf_framestep.c vf_tile.c
> vf_delogo.c
> ENCODER_SRCS=ve.c ve_divx4.c ve_lavc.c ve_vfw.c ve_rawrgb.c
> ve_libdv.c ve_xvid.c ve_qtvideo.c ve_nuv.c
>
> NATIVE_SRCS=native/RTjpegN.c native/cinepak.c native/fli.c
> native/minilzo.c native/msvidc.c native/nuppelvideo.c native/qtrle.c
> native/qtrpza.c native/qtsmc.c native/roqav.c native/xa_gsm.c
> native/decode144.c native/decode288.c
> > _______________________________________________
> MPlayer-dev-eng mailing list
> [EMAIL PROTECTED]
> http://mplayerhq.hu/mailman/listinfo/mplayer-dev-eng
>
Yahoo! Mail - o melhor webmail do Brasil
http://mail.yahoo.com.br
-------------------------------------------------------
This SF.net email sponsored by: Enterprise Linux Forum Conference & Expo
The Event For Linux Datacenter Solutions & Strategies in The Enterprise
Linux in the Boardroom; in the Front Office; & in the Server Room
http://www.enterpriselinuxforum.com
_______________________________________________
Freevo-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/freevo-devel