/***************************************************************************** * csri: common subtitle renderer interface ***************************************************************************** * Copyright (C) 2007 David Lamparter * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE ****************************************************************************/ /** \file csri.h - main CSRI (common subtitle renderer interface) include. * $Id: csri.h 45 2007-06-20 01:00:40Z equinox $ */ #ifndef _CSRI_H /** \cond */ #define _CSRI_H 20070119 /** \endcond */ #include /* ptrdiff_t */ #ifdef __cplusplus extern "C" { #endif #ifndef CSRIAPI /** CSRI API attributes. * defaults to \c extern. */ #define CSRIAPI extern #endif /** \defgroup base CSRI base API. */ /*@{*/ /** pixel format specification for frames */ enum csri_pixfmt { CSRI_F_RGBA = 0, CSRI_F_ARGB, CSRI_F_BGRA, CSRI_F_ABGR, CSRI_F_RGB_ = 0x100, CSRI_F__RGB, CSRI_F_BGR_, /**< Windows "RGB32" */ CSRI_F__BGR, CSRI_F_RGB = 0x200, CSRI_F_BGR, /**< Windows "RGB24" */ CSRI_F_AYUV = 0x1000, CSRI_F_YUVA, CSRI_F_YVUA, CSRI_F_YUY2 = 0x1100, CSRI_F_YV12A = 0x2011, /**< planar YUV 2x2 + alpha plane */ CSRI_F_YV12 = 0x2111 /**< planar YUV 2x2 */ }; #define csri_is_rgb(x) ((x) < 0x1000) #define csri_is_yuv(x) ((x) >= 0x1000) #define csri_is_yuv_planar(x) ((x) >= 0x2000) #define csri_get_yuv_planar_xred(x) (0xf & (x)) #define csri_get_yuv_planar_yred(x) (0xf & ((x) >> 4)) #define csri_is_yuv_packed(x) ((x) >= 0x1000 && (x) < 0x2000) #define csri_has_alpha(x) (((x) & 0xfff) < 0x100) /** frame/image format specification pre-fed to the renderer */ struct csri_fmt { /** format to be used */ enum csri_pixfmt pixfmt; /** image width, full frame. * * This should specify the full size of the frame. * Specifying the video sub-size (in case of added black * borders) is left to an extension. */ unsigned width; /** image height */ unsigned height; }; /** single frame to be fed to the renderer. */ struct csri_frame { /** frame format. * It is an application bug if this differs from the one * passed in struct #csri_fmt to csri_query_fmt() */ enum csri_pixfmt pixfmt; /** the frame's data. * Packed formats only use planes[0]; planar formats * have the data ordered as Y, U, V[, A]. * * Also note that the topmost line always comes first. * The Windows biHeight strange-ity is \a NOT duplicated. */ unsigned char *planes[4]; /** strides for the individual planes. * Stride means full byte offset, i.e. do \a not add * frame width */ ptrdiff_t strides[4]; }; #ifndef CSRI_OWN_HANDLES /** opaque renderer data */ typedef void csri_rend; /** opaque instance data */ typedef void csri_inst; #endif #ifdef DOXYGEN /** disable the emission of the csri_rend and csri_inst typedefs. * define this if you are in a renderer and are typedef'ing * csri_rend and csri_inst to your own structs. */ #define CSRI_OWN_HANDLES #endif /** renderer description. * \ingroup loader */ struct csri_info { /** an identifier for the renderer. * - MUST match the regular expression * \code ^[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])? \endcode * i.e. consists only of letters, numbers and underscores; * must start with a letter and doesnt have an underscore * as the last character. */ const char *name; /** an identifier to the exact version of the renderer. * most likely a version number or revision identifier. * * The helper library does a strcmp over this field in order * to order multiple instances of the same renderer. Use * higher-byte-value strings for newer renderers. */ const char *specific; /** a nice name to be presented to the user */ const char *longname; /** the renderer's author */ const char *author; /** a copyright string. Copyright (c) 2042 by Mr. Nice Guy */ const char *copyright; }; /** data of extension-dependent type. * The field to be used MUST be specified in the extension where it is used. */ union csri_vardata { long lval; double dval; const char *utf8val; void *otherval; }; /** extension identifier. * This follows reverse DNS syntax, i.e.: * \code root.branch.leaf \endcode * you can either reverse a registered domain name, e.g. * \code com.microsoft.csri.usegdiplus \endcode * or ask the CSRI maintainers to assign a namespace to you. * * currently registered namespaces are: * * \code * csri.* - official extensions * asa.* - custom extensions of the asa renderer * \endcode */ typedef const char *csri_ext_id; /** script loading parameters. * each flag MUST have an associated extension, which can be queried * with csri_query_ext(). If the open flag constitutes an extension on its * sole own, csri_query_ext() can return a meaningless non-NULL value for * it. * * The data field used must be specified. * * An extension can have multiple flags. In that case, the flags should have * the extension name as common prefix, separated with a dot. * * A renderer MUST ignore unknown open flags. It MUST NOT return an error * just because it does not support a particular flag. */ struct csri_openflag { /** flag name */ csri_ext_id name; /** flag data argument */ union csri_vardata data; /** link to next flag */ struct csri_openflag *next; }; /** load a script from a file. * \param renderer the handle to the renderer * \param filename the path to the file to be loaded. \n * The filename should be encoded as UTF-8. Windows renderers are * expected to convert it to UTF-16 and use the Unicode Windows API * functions. * \param flags a linked list of open flags. \n * The caller manages memory allocation, i.e. static allocation is OK. * \return the renderer instance handle, or NULL on error. */ CSRIAPI csri_inst *csri_open_file(csri_rend *renderer, const char *filename, struct csri_openflag *flags); /** load a script from memory. * \param renderer the handle to the renderer * \param data pointer to the first data byte. \n * The caller manages memory allocation and should free the data after * calling csri_open_mem(). If the renderer needs to keep the data, it * must copy it. \n * The renderer is not allowed to write to the data. * \param length length, in bytes, of the data * \param flags see csri_open_file() * \return the render instance handle, or NULL on error. */ CSRIAPI csri_inst *csri_open_mem(csri_rend *renderer, const void *data, size_t length, struct csri_openflag *flags); /** close a renderer instance. * \param inst the instance handle. */ CSRIAPI void csri_close(csri_inst *inst); /** query / set the image format and size. * \param inst the renderer instance handle * \param fmt the format and image size to be used * \return 0 if the format was successfully set, * any other value in case of error. */ CSRIAPI int csri_request_fmt(csri_inst *inst, const struct csri_fmt *fmt); /** render a single frame * \param inst the renderer instance handle * \param frame frame data to render to * \param time associated timestamp of the frame */ CSRIAPI void csri_render(csri_inst *inst, struct csri_frame *frame, double time); /** query for an extension. * \param rend the renderer handle * \param extname the extension's identifier * \return NULL if the extension is not supported, * a pointer to extension-specific data otherwise * * The data pointed to by the return value does not neccessarily need to * have any meaning; An extension that does not need to return data * can return a pointer to whatever it wants, as long as that pointer is * not NULL. * * In the usual case, the pointer is supposed to point to a struct with * function pointers and other information as needed. */ CSRIAPI void *csri_query_ext(csri_rend *rend, csri_ext_id extname); /*@}*/ /** \defgroup loader CSRI loader API. * * These functions locate renderers based on given parameters. * * Renderers must implement these functions as well. * * They are used by the library to grab renderer information * from a shared object; and also this way a single renderer * can be linked directly into an appliaction. */ /*@{*/ /** get renderer information * \param rend the renderer handle * \return information about the renderer, or NULL in case the renderer * encountered an internal error. */ CSRIAPI struct csri_info *csri_renderer_info(csri_rend *rend); /** try to load a given renderer * \param name the name of the renderer, as in csri_info.name * \param specific the specific version of the renderer, * as in csri_info.specific;\n * alternatively NULL if any version of the renderer is ok. * \return a handle to the renderer if it was successfully loaded, * NULL otherwise. */ CSRIAPI csri_rend *csri_renderer_byname(const char *name, const char *specific); /** try to find an implementation of the given extensions. * \param next number of extensions pointed to by ext * \param ext array of extensions to search for * \return a handle to a renderer supporting ALL of the * extensions, NULL if none was found. */ CSRIAPI csri_rend *csri_renderer_byext(unsigned n_ext, csri_ext_id *ext); /** get the default (highest priority) renderer * \return a handle to the default renderer, or NULL if * no renderer is installed. * * Together with csri_renderer_next(), this can be used * to enumerate all installed renderers. */ CSRIAPI csri_rend *csri_renderer_default(); /** get the next lower priority renderer * \param prev the current renderer * \return the renderer with the next lower priority than * the one named in prev, or NULL if prev is the last * renderer installed. */ CSRIAPI csri_rend *csri_renderer_next(csri_rend *prev); /*@}*/ #ifdef __cplusplus } #endif #endif /* _CSRI_H */