X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_picture.h;h=5c481f285ff24e405fa9f217aa5e0ebcc23b9428;hb=cbcf6bbdc8bd8c793ad95dacb2290fe13d302c24;hp=ae7c84a6d9bbad2fc17c72e61f8c1eeb3edc89dc;hpb=359b5a0effa9e29bc7269a78eb29ec254506313b;p=vlc diff --git a/include/vlc_picture.h b/include/vlc_picture.h index ae7c84a6d9..5c481f285f 100644 --- a/include/vlc_picture.h +++ b/include/vlc_picture.h @@ -1,26 +1,26 @@ /***************************************************************************** * vlc_picture.h: picture definitions ***************************************************************************** - * Copyright (C) 1999 - 2009 the VideoLAN team + * Copyright (C) 1999 - 2009 VLC authors and VideoLAN * $Id$ * * Authors: Vincent Seguin * Samuel Hocevar * Olivier Aubert * - * This program 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 + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program 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. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #ifndef VLC_PICTURE_H @@ -32,6 +32,7 @@ */ #include +#include /** Description of a planar graphic field */ typedef struct plane_t @@ -56,18 +57,14 @@ typedef struct plane_t */ #define PICTURE_PLANE_MAX (VOUT_MAX_PLANES) + /** * A private definition to help overloading picture release */ -typedef struct picture_release_sys_t picture_release_sys_t; +typedef struct picture_gc_sys_t picture_gc_sys_t; /** * Video picture - * - * Any picture destined to be displayed by a video output thread should be - * stored in this structure from it's creation to it's effective display. - * Picture type and flags should only be modified by the output thread. Note - * that an empty picture MUST have its flags set to 0. */ struct picture_t { @@ -76,27 +73,14 @@ struct picture_t */ video_frame_format_t format; - /** Picture data - data can always be freely modified, but p_data may - * NEVER be modified. A direct buffer can be handled as the plugin - * wishes, it can even swap p_pixels buffers. */ - uint8_t *p_data; void *p_data_orig; /**< pointer before memalign */ plane_t p[PICTURE_PLANE_MAX]; /**< description of the planes */ int i_planes; /**< number of allocated planes */ - /** \name Type and flags - * Should NOT be modified except by the vout thread - * @{*/ - int i_status; /**< picture flags */ - int i_type; /**< is picture a direct buffer ? */ - bool b_slow; /**< is picture in slow memory ? */ - /**@}*/ - /** \name Picture management properties * These properties can be modified using the video output thread API, * but should never be written directly */ /**@{*/ - unsigned i_refcount; /**< link reference counter */ mtime_t date; /**< display date */ bool b_force; /**@}*/ @@ -106,24 +90,24 @@ struct picture_t * @{ */ bool b_progressive; /**< is it a progressive frame ? */ - unsigned int i_nb_fields; /**< # of displayed fields */ bool b_top_field_first; /**< which field is first */ - uint8_t *p_q; /**< quantification table */ + unsigned int i_nb_fields; /**< # of displayed fields */ + int8_t *p_q; /**< quantification table */ int i_qstride; /**< quantification stride */ int i_qtype; /**< quantification style */ /**@}*/ - /* Some vouts require the picture to be locked before it can be modified */ - int (* pf_lock) ( vout_thread_t *, picture_t * ); - int (* pf_unlock) ( vout_thread_t *, picture_t * ); - /** Private data - the video output plugin might want to put stuff here to * keep track of the picture */ picture_sys_t * p_sys; /** This way the picture_Release can be overloaded */ - void (*pf_release)( picture_t * ); - picture_release_sys_t *p_release_sys; + struct + { + vlc_atomic_t refcount; + void (*pf_destroy)( picture_t * ); + picture_gc_sys_t *p_sys; + } gc; /** Next picture in a FIFO a pictures */ struct picture_t *p_next; @@ -135,15 +119,15 @@ struct picture_t * with picture_Hold and picture_Release. This default management will release * p_sys, p_q, p_data_orig fields if non NULL. */ -VLC_EXPORT( picture_t *, picture_New, ( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_aspect ) ); +VLC_API picture_t * picture_New( vlc_fourcc_t i_chroma, int i_width, int i_height, int i_sar_num, int i_sar_den ) VLC_USED; /** * This function will create a new picture using the given format. * - * When possible, it is prefered to use this function over picture_New + * When possible, it is preferred to use this function over picture_New * as more information about the format is kept. */ -VLC_EXPORT( picture_t *, picture_NewFromFormat, ( const video_format_t *p_fmt ) ); +VLC_API picture_t * picture_NewFromFormat( const video_format_t *p_fmt ) VLC_USED; /** * Resource for a picture. @@ -169,16 +153,7 @@ typedef struct * * If the resource is NULL then a plain picture_NewFromFormat is returned. */ -VLC_EXPORT( picture_t *, picture_NewFromResource, ( const video_format_t *, const picture_resource_t * ) ); - -/** - * This function will force the destruction a picture. - * The value of the picture reference count should be 0 before entering this - * function. - * Unless used for reimplementing pf_release, you should not use this - * function but picture_Release. - */ -VLC_EXPORT( void, picture_Delete, ( picture_t * ) ); +VLC_API picture_t * picture_NewFromResource( const video_format_t *, const picture_resource_t * ) VLC_USED; /** * This function will increase the picture reference count. @@ -186,22 +161,13 @@ VLC_EXPORT( void, picture_Delete, ( picture_t * ) ); * * It returns the given picture for convenience. */ -static inline picture_t *picture_Hold( picture_t *p_picture ) -{ - if( p_picture->pf_release ) - p_picture->i_refcount++; - return p_picture; -} +VLC_API picture_t *picture_Hold( picture_t *p_picture ); + /** * This function will release a picture. * It will not have any effect on picture obtained from vout */ -static inline void picture_Release( picture_t *p_picture ) -{ - /* FIXME why do we let pf_release handle the i_refcount ? */ - if( p_picture->pf_release ) - p_picture->pf_release( p_picture ); -} +VLC_API void picture_Release( picture_t *p_picture ); /** * This function will return true if you are not the only owner of the @@ -209,50 +175,26 @@ static inline void picture_Release( picture_t *p_picture ) * * It is only valid if it is created using picture_New. */ -static inline bool picture_IsReferenced( picture_t *p_picture ) -{ - return p_picture->i_refcount > 1; -} - -/** - * Cleanup quantization matrix data and set to 0 - */ -static inline void picture_CleanupQuant( picture_t *p_pic ) -{ - free( p_pic->p_q ); - p_pic->p_q = NULL; - p_pic->i_qstride = 0; - p_pic->i_qtype = 0; -} +VLC_API bool picture_IsReferenced( picture_t *p_picture ); /** * This function will copy all picture dynamic properties. */ -static inline void picture_CopyProperties( picture_t *p_dst, const picture_t *p_src ) -{ - p_dst->date = p_src->date; - p_dst->b_force = p_src->b_force; - - p_dst->b_progressive = p_src->b_progressive; - p_dst->i_nb_fields = p_src->i_nb_fields; - p_dst->b_top_field_first = p_src->b_top_field_first; - - /* FIXME: copy ->p_q and ->p_qstride */ -} +VLC_API void picture_CopyProperties( picture_t *p_dst, const picture_t *p_src ); /** - * This function will reset a picture informations (properties and quantizers). - * It is sometimes usefull for reusing pictures (like from a pool). + * This function will reset a picture information (properties and quantizers). + * It is sometimes useful for reusing pictures (like from a pool). */ -VLC_EXPORT( void, picture_Reset, ( picture_t * ) ); +VLC_API void picture_Reset( picture_t * ); /** * This function will copy the picture pixels. * You can safely copy between pictures that do not have the same size, * only the compatible(smaller) part will be copied. */ -VLC_EXPORT( void, picture_CopyPixels, ( picture_t *p_dst, const picture_t *p_src ) ); -VLC_EXPORT( void, plane_CopyPixels, ( plane_t *p_dst, const plane_t *p_src ) ); +VLC_API void picture_CopyPixels( picture_t *p_dst, const picture_t *p_src ); +VLC_API void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src ); /** * This function will copy both picture dynamic properties and pixels. @@ -263,11 +205,7 @@ VLC_EXPORT( void, plane_CopyPixels, ( plane_t *p_dst, const plane_t *p_src ) ); * \param p_dst pointer to the destination picture. * \param p_src pointer to the source picture. */ -static inline void picture_Copy( picture_t *p_dst, const picture_t *p_src ) -{ - picture_CopyPixels( p_dst, p_src ); - picture_CopyProperties( p_dst, p_src ); -} +VLC_API void picture_Copy( picture_t *p_dst, const picture_t *p_src ); /** * This function will export a picture to an encoded bitstream. @@ -278,10 +216,14 @@ static inline void picture_Copy( picture_t *p_dst, const picture_t *p_src ) * picture before encoding. * * i_override_width/height allow to override the width and/or the height of the - * picture to be encoded. If at most one of them is > 0 then the picture aspect - * ratio will be kept. + * picture to be encoded: + * - if strictly lower than 0, the original dimension will be used. + * - if equal to 0, it will be deduced from the other dimension which must be + * different to 0. + * - if strictly higher than 0, it will override the dimension. + * If at most one of them is > 0 then the picture aspect ratio will be kept. */ -VLC_EXPORT( int, picture_Export, ( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt, picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width, int i_override_height ) ); +VLC_API int picture_Export( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt, picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width, int i_override_height ); /** * This function will setup all fields of a picture_t without allocating any @@ -292,33 +234,27 @@ VLC_EXPORT( int, picture_Export, ( vlc_object_t *p_obj, block_t **pp_image, vide * It will return VLC_EGENERIC if the core does not understand the requested * format. * - * It can be usefull to get the properties of planes. + * It can be useful to get the properties of planes. + */ +VLC_API int picture_Setup( picture_t *, vlc_fourcc_t i_chroma, int i_width, int i_height, int i_sar_num, int i_sar_den ); + + +/** + * This function will blend a given subpicture onto a picture. + * + * The subpicture and all its region must: + * - be absolute. + * - not be ephemere. + * - not have the fade flag. + * - contains only picture (no text rendering). */ -VLC_EXPORT( int, picture_Setup, ( picture_t *, vlc_fourcc_t i_chroma, int i_width, int i_height, int i_aspect ) ); +VLC_API void picture_BlendSubpicture( picture_t *, filter_t *p_blend, subpicture_t * ); + /***************************************************************************** * Flags used to describe the status of a picture *****************************************************************************/ -/* Picture type - * FIXME are the values meaningfull ? */ -enum -{ - EMPTY_PICTURE = 0, /* empty buffer */ - MEMORY_PICTURE = 100, /* heap-allocated buffer */ - DIRECT_PICTURE = 200, /* direct buffer */ -}; - -/* Picture status */ -enum -{ - FREE_PICTURE, /* free and not allocated */ - RESERVED_PICTURE, /* allocated and reserved */ - READY_PICTURE, /* ready for display */ - DISPLAYED_PICTURE, /* been displayed but is linked */ - DESTROYED_PICTURE, /* allocated but no more used */ -}; - /* Quantification type */ enum {