Mercurial > mplayer.hg
diff sub/eosd.h @ 32460:d80bbc5868de
Move eosd.[ch] to the sub directory.
Remove a duplicate include of eosd.h.
author | cigaes |
---|---|
date | Wed, 27 Oct 2010 17:03:26 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sub/eosd.h Wed Oct 27 17:03:26 2010 +0000 @@ -0,0 +1,204 @@ +/* + * Extended On Screen Display + * Copyright (C) 2010 Nicolas George + * + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPLAYER_EOSD_H +#define MPLAYER_EOSD_H + +#include <stdint.h> +#include "libmpcodecs/vf.h" + +enum { + EOSD_CHANGED_LAYOUT = 0x1, + EOSD_CHANGED_BITMAP = 0x2, +}; + +struct mp_eosd_settings { + int w, h; ///< screen dimensions, including black borders + int srcw, srch; ///< unscaled source dimensions + int mt, mb, ml, mr; ///< borders (top, bottom, left, right) + int unscaled; ///< EOSD objects are rendered at native resolution + int changed; ///< settings have changed since last update +}; + +struct mp_eosd_image { + struct mp_eosd_image *next; ///< Next image, or NULL + uint8_t *bitmap; ///< 1bpp stride*h alpha buffer + void *opaque; ///< Arbitrary value for the client's use + int w, h; ///< Bitmap width, height + int stride; ///< Bitmap stride + uint32_t color; ///< Bitmap color and transparency, RGBT + /// T is the complement of A (alpha=opacity). + int dst_x, dst_y; ///< Bitmap placement inside the video frame +}; + +struct mp_eosd_source { + + /** + * Linked list of images element. + * The client is responsible for initializing and maintaining this list. + * It can alter it at any time in the main MPlayer thread. + */ + struct mp_eosd_image *images; + + /** + * Pointer to the next field of the last image, or to images if the list + * is empty. + * The client is not required to handle this field, but list + * manipulation functions (see below) use it. + */ + struct mp_eosd_image **images_tail; + + /** + * Callback to update the images. Can be NULL. + */ + void (*update)(struct mp_eosd_source *, const struct mp_eosd_settings *, + double); + + /** + * Callback to uninit the source. Can be NULL. + */ + void (*uninit)(struct mp_eosd_source *); + + /** + * Changed flags of the images. + * The client must set it to a combination of EOSD_CHANGED_* whenever + * the images are altered. + * The core EOSD system resets it. + */ + int changed; + + /** + * Z-index of the images. + * Images with a higher Z-index are rendered on top. + */ + int z_index; + + /** + * Initialized flag of the source. + * Set by the source, automatically cleared when a source is added, + * removed or reinitialized. + */ + int initialized; + + struct mp_eosd_source *priv_next; +}; + +struct mp_eosd_image_list { + struct mp_eosd_source *first_source; + struct mp_eosd_source *source; + struct mp_eosd_image *image; + int changed; +}; + +/** + * Initialize the EOSD subsystem. + * + * @param vf the video filter chain where the rendering will take place. + */ +void eosd_init(vf_instance_t *vf); + +/** + * Configure the resolution for EOSD rendering. + * Should be called by the rendering engine whenever the resolution or + * settings change. + * + * @param res resolution and margins of the rendering area. + */ +void eosd_configure(struct mp_eosd_settings *res); + +/** + * Renders the EOSD elements for the current frame. + * Should be called by the rendering engine when it is about to do or + * prepare the rendering. + * + * @param[in] ts presentation timestamp of the frame. + * @param[out] images list of images to render. + * The list and list elements are only valid until any + * client alter them. + * The renderer should therefore not call anything that + * may alter the EOSD elements. + */ +void eosd_render_frame(double ts, struct mp_eosd_image_list *images); + +/** + * Shut down the EOSD subsystem and free the associated resources. + */ +void eosd_uninit(void); + +/** + * Register a source of EOSD images. + */ +void eosd_register(struct mp_eosd_source *source); + +/** + * Test whether a source has already been registered. + */ +int eosd_registered(struct mp_eosd_source *source); + +/** + * Allocate a structure for an EOSD image. + */ +struct mp_eosd_image *eosd_image_alloc(void); + +/** + * Free a previously allocated structure. + */ +void eosd_image_free(struct mp_eosd_image *image); + +/** + * Append an image to the list of images associated to a source. + * This function requires that the images_tail pointer is correctly set. + */ +void eosd_image_append(struct mp_eosd_source *source, + struct mp_eosd_image *image); + +/** + * Remove an image from the list of images associated to a source. + * The image structure is freed using eosd_image_free. + * + * @param source source where the image is. + * @param image image to remove. + * @param prev pointeur to the prev field of the previous image, + * or to source->images if this is the first image. + */ +void eosd_image_remove(struct mp_eosd_source *source, + struct mp_eosd_image *image, + struct mp_eosd_image **prev); + +/** + * Remove all images associated to a source and free the corresponding + * structures. + * This function also resets the images_tail pointer. + */ +void eosd_image_remove_all(struct mp_eosd_source *source); + +/** + * Reset the cursor of an image list and get the first image. + */ +struct mp_eosd_image *eosd_image_first(struct mp_eosd_image_list *images); + +/** + * Get the next image in an image list. + * The renderer must NOT use the next field in the image structure. + */ +struct mp_eosd_image *eosd_image_next(struct mp_eosd_image_list *images); + +#endif /* MPLAYER_EOSD_H */