vlc_filter.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:11k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * vlc_filter.h: filter related structures and functions
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2008 the VideoLAN team
  5.  * $Id: a7404a74cee114d1ee4363977e7e5de4dc47ec0e $
  6.  *
  7.  * Authors: Gildas Bazin <gbazin@videolan.org>
  8.  *          Antoine Cellerier <dionoea at videolan dot org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #ifndef VLC_FILTER_H
  25. #define VLC_FILTER_H 1
  26. #include <vlc_es.h>
  27. /**
  28.  * file
  29.  * This file defines the structure and types used by video and audio filters
  30.  */
  31. typedef struct filter_owner_sys_t filter_owner_sys_t;
  32. /** Structure describing a filter
  33.  * @warning BIG FAT WARNING : the code relies on the first 4 members of
  34.  * filter_t and decoder_t to be the same, so if you have anything to add,
  35.  * do it at the end of the structure.
  36.  */
  37. struct filter_t
  38. {
  39.     VLC_COMMON_MEMBERS
  40.     /* Module properties */
  41.     module_t *          p_module;
  42.     filter_sys_t *      p_sys;
  43.     /* Input format */
  44.     es_format_t         fmt_in;
  45.     /* Output format of filter */
  46.     es_format_t         fmt_out;
  47.     bool                b_allow_fmt_out_change;
  48.     /* Filter configuration */
  49.     config_chain_t *    p_cfg;
  50.     picture_t *         ( * pf_video_filter ) ( filter_t *, picture_t * );
  51.     block_t *           ( * pf_audio_filter ) ( filter_t *, block_t * );
  52.     void                ( * pf_video_blend )  ( filter_t *,
  53.                                                 picture_t *, picture_t *,
  54.                                                 int, int, int );
  55.     subpicture_t *      ( *pf_sub_filter ) ( filter_t *, mtime_t );
  56.     int                 ( *pf_render_text ) ( filter_t *, subpicture_region_t *,
  57.                                               subpicture_region_t * );
  58.     int                 ( *pf_render_html ) ( filter_t *, subpicture_region_t *,
  59.                                               subpicture_region_t * );
  60.     /*
  61.      * Buffers allocation
  62.      */
  63.     /* Audio output callbacks */
  64.     block_t *       ( * pf_audio_buffer_new) ( filter_t *, int );
  65.     /* Video output callbacks */
  66.     picture_t     * ( * pf_vout_buffer_new) ( filter_t * );
  67.     void            ( * pf_vout_buffer_del) ( filter_t *, picture_t * );
  68.     /* void            ( * pf_picture_link)    ( picture_t * );
  69.     void            ( * pf_picture_unlink)  ( picture_t * ); */
  70.     /* SPU output callbacks */
  71.     subpicture_t *  ( * pf_sub_buffer_new) ( filter_t * );
  72.     void            ( * pf_sub_buffer_del) ( filter_t *, subpicture_t * );
  73.     /* Private structure for the owner of the decoder */
  74.     filter_owner_sys_t *p_owner;
  75. };
  76. /**
  77.  * This function will return a new picture usable by p_filter as an output
  78.  * buffer. You have to release it using filter_DeletePicture or by returning
  79.  * it to the caller as a pf_video_filter return value.
  80.  * Provided for convenience.
  81.  *
  82.  * param p_filter filter_t object
  83.  * return new picture on success or NULL on failure
  84.  */
  85. static inline picture_t *filter_NewPicture( filter_t *p_filter )
  86. {
  87.     picture_t *p_picture = p_filter->pf_vout_buffer_new( p_filter );
  88.     if( !p_picture )
  89.         msg_Warn( p_filter, "can't get output picture" );
  90.     return p_picture;
  91. }
  92. /**
  93.  * This function will release a picture create by filter_NewPicture.
  94.  * Provided for convenience.
  95.  *
  96.  * param p_filter filter_t object
  97.  * param p_picture picture to be deleted
  98.  */
  99. static inline void filter_DeletePicture( filter_t *p_filter, picture_t *p_picture )
  100. {
  101.     p_filter->pf_vout_buffer_del( p_filter, p_picture );
  102. }
  103. /**
  104.  * This function will return a new subpicture usable by p_filter as an output
  105.  * buffer. You have to release it using filter_DeleteSubpicture or by returning
  106.  * it to the caller as a pf_sub_filter return value.
  107.  * Provided for convenience.
  108.  *
  109.  * param p_filter filter_t object
  110.  * return new subpicture
  111.  */
  112. static inline subpicture_t *filter_NewSubpicture( filter_t *p_filter )
  113. {
  114.     subpicture_t *p_subpicture = p_filter->pf_sub_buffer_new( p_filter );
  115.     if( !p_subpicture )
  116.         msg_Warn( p_filter, "can't get output subpicture" );
  117.     return p_subpicture;
  118. }
  119. /**
  120.  * This function will release a subpicture create by filter_NewSubicture.
  121.  * Provided for convenience.
  122.  *
  123.  * param p_filter filter_t object
  124.  * param p_subpicture to be released
  125.  */
  126. static inline void filter_DeleteSubpicture( filter_t *p_filter, subpicture_t *p_subpicture )
  127. {
  128.     p_filter->pf_sub_buffer_del( p_filter, p_subpicture );
  129. }
  130. /**
  131.  * This function will return a new audio buffer usable by p_filter as an
  132.  * output buffer. You have to release it using block_Release or by returning
  133.  * it to the caller as a pf_audio_filter return value.
  134.  * Provided for convenience.
  135.  *
  136.  * param p_filter filter_t object
  137.  * param i_size size of audio buffer requested
  138.  * return block to be used as audio output buffer
  139.  */
  140. static inline block_t *filter_NewAudioBuffer( filter_t *p_filter, int i_size )
  141. {
  142.     block_t *p_block = p_filter->pf_audio_buffer_new( p_filter, i_size );
  143.     if( !p_block )
  144.         msg_Warn( p_filter, "can't get output block" );
  145.     return p_block;
  146. }
  147. /**
  148.  * Create a picture_t *(*)( filter_t *, picture_t * ) compatible wrapper
  149.  * using a void (*)( filter_t *, picture_t *, picture_t * ) function
  150.  *
  151.  * Currently used by the chroma video filters
  152.  */
  153. #define VIDEO_FILTER_WRAPPER( name )                                    
  154.     static picture_t *name ## _Filter ( filter_t *p_filter,             
  155.                                         picture_t *p_pic )              
  156.     {                                                                   
  157.         picture_t *p_outpic = filter_NewPicture( p_filter );            
  158.         if( p_outpic )                                                  
  159.         {                                                               
  160.             name( p_filter, p_pic, p_outpic );                          
  161.             picture_CopyProperties( p_outpic, p_pic );                  
  162.         }                                                               
  163.         picture_Release( p_pic );                                       
  164.         return p_outpic;                                                
  165.     }
  166. /**
  167.  * Filter chain management API
  168.  * The filter chain management API is used to dynamically construct filters
  169.  * and add them in a chain.
  170.  */
  171. typedef struct filter_chain_t filter_chain_t;
  172. /**
  173.  * Create new filter chain
  174.  *
  175.  * param p_object pointer to a vlc object
  176.  * param psz_capability vlc capability of filters in filter chain
  177.  * param b_allow_format_fmt_change allow changing of fmt
  178.  * param pf_buffer_allocation_init callback function to initialize buffer allocations
  179.  * param pf_buffer_allocation_clear callback function to clear buffer allocation initialization
  180.  * param p_buffer_allocation_data pointer to private allocation data
  181.  * return pointer to a filter chain
  182.  */
  183. VLC_EXPORT( filter_chain_t *, __filter_chain_New, ( vlc_object_t *, const char *, bool, int (*)( filter_t *, void * ), void (*)( filter_t * ), void *  ) );
  184. #define filter_chain_New( a, b, c, d, e, f ) __filter_chain_New( VLC_OBJECT( a ), b, c, d, e, f )
  185. /**
  186.  * Delete filter chain will delete all filters in the chain and free all
  187.  * allocated data. The pointer to the filter chain is then no longer valid.
  188.  *
  189.  * param p_chain pointer to filter chain
  190.  */
  191. VLC_EXPORT( void, filter_chain_Delete, ( filter_chain_t * ) );
  192. /**
  193.  * Reset filter chain will delete all filters in the chain and
  194.  * reset p_fmt_in and p_fmt_out to the new values.
  195.  *
  196.  * param p_chain pointer to filter chain
  197.  * param p_fmt_in new fmt_in params
  198.  * param p_fmt_out new fmt_out params
  199.  */
  200. VLC_EXPORT( void, filter_chain_Reset, ( filter_chain_t *, const es_format_t *, const es_format_t * ) );
  201. /**
  202.  * Append filter to the end of the chain.
  203.  *
  204.  * param p_chain pointer to filter chain
  205.  * param psz_name name of filter
  206.  * param p_cfg
  207.  * param p_fmt_in input es_format_t
  208.  * param p_fmt_out output es_format_t
  209.  * return pointer to filter chain
  210.  */
  211. VLC_EXPORT( filter_t *, filter_chain_AppendFilter, ( filter_chain_t *, const char *, config_chain_t *, const es_format_t *, const es_format_t * ) );
  212. /**
  213.  * Append new filter to filter chain from string.
  214.  *
  215.  * param p_chain pointer to filter chain
  216.  * param psz_string string of filters
  217.  * return 0 for success
  218.  */
  219. VLC_EXPORT( int, filter_chain_AppendFromString, ( filter_chain_t *, const char * ) );
  220. /**
  221.  * Delete filter from filter chain. This function also releases the filter
  222.  * object and unloads the filter modules. The pointer to p_filter is no
  223.  * longer valid after this function successfully returns.
  224.  *
  225.  * param p_chain pointer to filter chain
  226.  * param p_filter pointer to filter object
  227.  * return VLC_SUCCESS on succes, else VLC_EGENERIC
  228.  */
  229. VLC_EXPORT( int, filter_chain_DeleteFilter, ( filter_chain_t *, filter_t * ) );
  230. /**
  231.  * Get filter by name of position in the filter chain.
  232.  *
  233.  * param p_chain pointer to filter chain
  234.  * param i_position position of filter in filter chain
  235.  * param psz_name name of filter to get
  236.  * return filter object based on position or name provided
  237.  */
  238. VLC_EXPORT( filter_t *, filter_chain_GetFilter, ( filter_chain_t *, int, const char * ) );
  239. /**
  240.  * Get the number of filters in the filter chain.
  241.  *
  242.  * param p_chain pointer to filter chain
  243.  * return number of filters in this filter chain
  244.  */
  245. VLC_EXPORT( int, filter_chain_GetLength, ( filter_chain_t * ) );
  246. /**
  247.  * Get last p_fmt_out in the chain.
  248.  *
  249.  * param p_chain pointer to filter chain
  250.  * return last p_fmt (es_format_t) of this filter chain
  251.  */
  252. VLC_EXPORT( const es_format_t *, filter_chain_GetFmtOut, ( filter_chain_t * ) );
  253. /**
  254.  * Apply the filter chain to a video picture.
  255.  *
  256.  * param p_chain pointer to filter chain
  257.  * param p_picture picture to apply filters on
  258.  * return modified picture after applying all video filters
  259.  */
  260. VLC_EXPORT( picture_t *, filter_chain_VideoFilter, ( filter_chain_t *, picture_t * ) );
  261. /**
  262.  * Apply the filter chain to a audio block.
  263.  *
  264.  * param p_chain pointer to filter chain
  265.  * param p_block audio frame to apply filters on
  266.  * return modified audio frame after applying all audio filters
  267.  */
  268. VLC_EXPORT( block_t *, filter_chain_AudioFilter, ( filter_chain_t *, block_t * ) );
  269. /**
  270.  * Apply filter chain to subpictures.
  271.  *
  272.  * param p_chain pointer to filter chain
  273.  * param display_date of subpictures
  274.  */
  275. VLC_EXPORT( void, filter_chain_SubFilter, ( filter_chain_t *, mtime_t ) );
  276. #endif /* _VLC_FILTER_H */