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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * invmem_decoder.c: memory video driver for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2008 the VideoLAN team
  5.  * $Id: c1371b749368a1478c3244ffc02512887832fbe2 $
  6.  *
  7.  * Authors: Robert Paciorek <robert@opcode.eu.org> <http://opcode.eu.org/bercik>
  8.  * based on:
  9.  *  - vmem video output module (Gildas Bazin <gbazin@videolan.org>)
  10.  *  - png video decodec module (Sam Hocevar <sam@zoy.org>)
  11.  *
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2 of the License, or
  15.  * (at your option) any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  * GNU General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU General Public License
  23.  * along with this program; if not, write to the Free Software
  24.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  25.  *****************************************************************************/
  26. /*****************************************************************************
  27.  * Preamble
  28.  *****************************************************************************/
  29. #ifdef HAVE_CONFIG_H
  30. # include "config.h"
  31. #endif
  32. #include <vlc_common.h>
  33. #include <vlc_plugin.h>
  34. #include <vlc_codec.h>
  35. #include <vlc_image.h>
  36. #include <vlc_filter.h>
  37. /*****************************************************************************
  38.  * Local prototypes
  39.  *****************************************************************************/
  40. static int  OpenDecoder   ( vlc_object_t * );
  41. static void CloseDecoder  ( vlc_object_t * );
  42. static picture_t *DecodeBlock  ( decoder_t *, block_t ** );
  43. /*****************************************************************************
  44.  * Module descriptor
  45.  *****************************************************************************/
  46. #define T_WIDTH N_( "Width" )
  47. #define LT_WIDTH N_( "Video memory buffer width." )
  48. #define T_HEIGHT N_( "Height" )
  49. #define LT_HEIGHT N_( "Video memory buffer height." )
  50. #define T_LOCK N_( "Lock function" )
  51. #define LT_LOCK N_( "Address of the locking callback function. This " 
  52.                     "function must return a valid memory address for use " 
  53.                     "by the video renderer." )
  54. #define T_UNLOCK N_( "Unlock function" )
  55. #define LT_UNLOCK N_( "Address of the unlocking callback function" )
  56. #define T_DATA N_( "Callback data" )
  57. #define LT_DATA N_( "Data for the locking and unlocking functions" )
  58. #define INVMEM_HELP N_( "This module make possible making video stream from raw-image " 
  59.                         "generating (to memory) from rendering program uses libvlc. " 
  60.                         "To use this module from libvlc set --codec to invmem, "
  61.                         "set all --invmem-* options in vlc_argv an use " 
  62.                         "libvlc_media_new(libvlc, "fake://", &ex);. " 
  63.                         "Besides is simillar to vmem video output module." )
  64. vlc_module_begin()
  65.     set_category( CAT_INPUT )
  66.     set_subcategory( SUBCAT_INPUT_VCODEC )
  67.     set_shortname( N_("Memory video decoder") )
  68.     set_description( N_("Memory video decoder") )
  69.     set_help( INVMEM_HELP )
  70.     set_capability( "decoder", 50 )
  71.     set_callbacks( OpenDecoder, CloseDecoder )
  72.     add_shortcut( "invmem" )
  73.     add_integer( "invmem-width", 0, NULL, T_WIDTH, LT_WIDTH, false )
  74.     add_integer( "invmem-height", 0, NULL, T_HEIGHT, LT_HEIGHT, false )
  75.     add_string( "invmem-lock", "0", NULL, T_LOCK, LT_LOCK, true )
  76.     add_string( "invmem-unlock", "0", NULL, T_UNLOCK, LT_UNLOCK, true )
  77.     add_string( "invmem-data", "0", NULL, T_DATA, LT_DATA, true )
  78. vlc_module_end()
  79. struct decoder_sys_t
  80. {
  81.     void * (*pf_lock) (void *);
  82.     void (*pf_unlock) (void *);
  83.     void *p_data;
  84.     int i_width;
  85.     int i_height;
  86.     int i_pitch;
  87.     picture_t *p_pic;
  88. };
  89. /*****************************************************************************
  90.  * OpenDecoder: probe the decoder and return score
  91.  *****************************************************************************/
  92. static int OpenDecoder( vlc_object_t *p_this )
  93. {
  94.     decoder_t *p_dec = (decoder_t*)p_this;
  95.     decoder_sys_t *p_sys;
  96.     char *psz_tmp;
  97.     if( p_dec->fmt_in.i_codec != VLC_FOURCC('f','a','k','e'))
  98.     {
  99.         return VLC_EGENERIC;
  100.     }
  101.     /* Allocate the memory needed to store the decoder's structure */
  102.     if( ( p_dec->p_sys = p_sys = malloc(sizeof(decoder_sys_t)) ) == NULL )
  103.         return VLC_ENOMEM;
  104.     // get parametrs
  105.     p_sys->i_width = var_CreateGetInteger( p_this, "invmem-width" );
  106.     p_sys->i_height = var_CreateGetInteger( p_this, "invmem-height" );
  107.     if( p_sys->i_width == 0 || p_sys->i_height == 0 )
  108.     {
  109.         msg_Err( p_dec, "--invmem-width and --invmem-height must be > 0" );
  110.         free( p_sys );
  111.         return VLC_EGENERIC;
  112.     }
  113.     psz_tmp = var_CreateGetString( p_dec, "invmem-lock" );
  114.     p_sys->pf_lock = (void * (*) (void *))(intptr_t)atoll( psz_tmp );
  115.     free( psz_tmp );
  116.     psz_tmp = var_CreateGetString( p_dec, "invmem-unlock" );
  117.     p_sys->pf_unlock = (void (*) (void *))(intptr_t)atoll( psz_tmp );
  118.     free( psz_tmp );
  119.     psz_tmp = var_CreateGetString( p_dec, "invmem-data" );
  120.     p_sys->p_data = (void *)(intptr_t)atoll( psz_tmp );
  121.     free( psz_tmp );
  122.     if( !p_sys->pf_lock || !p_sys->pf_unlock )
  123.     {
  124.         msg_Err( p_dec, "Invalid lock or unlock callbacks" );
  125.         free( p_sys );
  126.         return VLC_EGENERIC;
  127.     }
  128.     /* Set output properties */
  129.     //p_dec->fmt_out.i_codec = VLC_FOURCC('R','G','B','A');
  130.     p_dec->fmt_out.i_codec = VLC_FOURCC('R','V','2','4');
  131.     p_dec->fmt_out.video.i_width = p_dec->p_sys->i_width;
  132.     p_dec->fmt_out.video.i_height = p_dec->p_sys->i_height;
  133.     p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR * p_dec->p_sys->i_width / p_dec->p_sys->i_height;
  134.     p_dec->fmt_out.video.i_rmask = 0xff0000;
  135.     p_dec->fmt_out.video.i_gmask = 0x00ff00;
  136.     p_dec->fmt_out.video.i_bmask = 0x0000ff;
  137.     p_dec->fmt_out.i_cat = VIDEO_ES;
  138.     p_sys->i_pitch = p_sys->i_width*3 + p_sys->i_width%4;
  139.     p_sys->p_pic = NULL;
  140.     /* Set callbacks */
  141.     p_dec->pf_decode_video = DecodeBlock;
  142.     return VLC_SUCCESS;
  143. }
  144. /****************************************************************************
  145.  * DecodeBlock: the whole thing
  146.  ****************************************************************************
  147.  * This function must be fed with a complete compressed frame.
  148.  ****************************************************************************/
  149. static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
  150. {
  151.     decoder_sys_t *p_sys = p_dec->p_sys;
  152.     block_t *p_block;
  153.     if( !pp_block || !*pp_block ) return NULL;
  154.     p_block = *pp_block;
  155.     // create new picture
  156.     if( p_sys->p_pic != NULL )
  157.         picture_Release( p_sys->p_pic );
  158.     p_sys->p_pic = decoder_NewPicture( p_dec );
  159.     p_sys->p_pic->b_force = true;
  160.     p_sys->p_pic->p->i_pitch = p_dec->p_sys->i_pitch;
  161.     p_sys->p_pic->date = p_block->i_pts > 0 ? p_block->i_pts : p_block->i_dts;
  162.     // lock input and copy to picture
  163.     p_sys->p_pic->p->p_pixels = p_sys->pf_lock( p_dec->p_sys->p_data );
  164.     // unlock input
  165.     p_sys->pf_unlock( p_dec->p_sys->p_data );
  166.     block_Release( *pp_block ); *pp_block = NULL;
  167.     return p_sys->p_pic;
  168. }
  169. /*****************************************************************************
  170.  * CloseDecoder: invmem decoder destruction
  171.  *****************************************************************************/
  172. static void CloseDecoder( vlc_object_t *p_this )
  173. {
  174.     decoder_t *p_dec = (decoder_t *)p_this;
  175.     decoder_sys_t *p_sys = p_dec->p_sys;
  176.     if( p_sys->p_pic != NULL )
  177.         picture_Release( p_sys->p_pic );
  178.     free( p_sys );
  179. }