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 */