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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * copy.c
  3.  *****************************************************************************
  4.  * Copyright (C) 2001, 2002, 2006 the VideoLAN team
  5.  * $Id: 661e406c1458573ddf76391330bc42ae84de52ba $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Eric Petit <titer@videolan.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. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #ifdef HAVE_CONFIG_H
  28. # include "config.h"
  29. #endif
  30. #include <vlc_common.h>
  31. #include <vlc_plugin.h>
  32. #include <vlc_codec.h>
  33. #include <vlc_block.h>
  34. /*****************************************************************************
  35.  * Module descriptor
  36.  *****************************************************************************/
  37. static int  Open ( vlc_object_t * );
  38. static void Close( vlc_object_t * );
  39. vlc_module_begin ()
  40.     set_category( CAT_SOUT )
  41.     set_subcategory( SUBCAT_SOUT_PACKETIZER )
  42.     set_description( N_("Copy packetizer") )
  43.     set_capability( "packetizer", 1 )
  44.     set_callbacks( Open, Close )
  45. vlc_module_end ()
  46. /*****************************************************************************
  47.  * Local prototypes
  48.  *****************************************************************************/
  49. struct decoder_sys_t
  50. {
  51.     block_t *p_block;
  52. };
  53. static block_t *Packetize   ( decoder_t *, block_t ** );
  54. static block_t *PacketizeSub( decoder_t *, block_t ** );
  55. /*****************************************************************************
  56.  * Open: probe the packetizer and return score
  57.  *****************************************************************************
  58.  * Tries to launch a decoder and return score so that the interface is able
  59.  * to choose.
  60.  *****************************************************************************/
  61. static int Open( vlc_object_t *p_this )
  62. {
  63.     decoder_t     *p_dec = (decoder_t*)p_this;
  64.     decoder_sys_t *p_sys;
  65.     if( p_dec->fmt_in.i_cat != AUDIO_ES &&
  66.         p_dec->fmt_in.i_cat != VIDEO_ES &&
  67.         p_dec->fmt_in.i_cat != SPU_ES )
  68.     {
  69.         msg_Err( p_dec, "invalid ES type" );
  70.         return VLC_EGENERIC;
  71.     }
  72.     if( p_dec->fmt_in.i_cat == SPU_ES )
  73.         p_dec->pf_packetize = PacketizeSub;
  74.     else
  75.         p_dec->pf_packetize = Packetize;
  76.     /* Create the output format */
  77.     es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
  78.     /* Fix the value of the fourcc */
  79.     switch( p_dec->fmt_in.i_codec )
  80.     {
  81.         /* video */
  82.         case VLC_FOURCC( 'm', '4', 's', '2'):
  83.         case VLC_FOURCC( 'M', '4', 'S', '2'):
  84.         case VLC_FOURCC( 'm', 'p', '4', 's'):
  85.         case VLC_FOURCC( 'M', 'P', '4', 'S'):
  86.         case VLC_FOURCC( 'D', 'I', 'V', 'X'):
  87.         case VLC_FOURCC( 'd', 'i', 'v', 'x'):
  88.         case VLC_FOURCC( 'X', 'V', 'I', 'D'):
  89.         case VLC_FOURCC( 'X', 'v', 'i', 'D'):
  90.         case VLC_FOURCC( 'x', 'v', 'i', 'd'):
  91.         case VLC_FOURCC( 'D', 'X', '5', '0'):
  92.         case VLC_FOURCC( 0x04, 0,   0,   0):
  93.         case VLC_FOURCC( '3', 'I', 'V', '2'):
  94.             p_dec->fmt_out.i_codec = VLC_FOURCC( 'm', 'p', '4', 'v');
  95.             break;
  96.         case VLC_FOURCC( 'm', 'p', 'g', '1' ):
  97.         case VLC_FOURCC( 'm', 'p', 'g', '2' ):
  98.         case VLC_FOURCC( 'm', 'p', '1', 'v' ):
  99.         case VLC_FOURCC( 'm', 'p', '2', 'v' ):
  100.             p_dec->fmt_out.i_codec = VLC_FOURCC( 'm', 'p', 'g', 'v' );
  101.             break;
  102.         case VLC_FOURCC( 'd', 'i', 'v', '1' ):
  103.         case VLC_FOURCC( 'M', 'P', 'G', '4' ):
  104.         case VLC_FOURCC( 'm', 'p', 'g', '4' ):
  105.             p_dec->fmt_out.i_codec = VLC_FOURCC( 'D', 'I', 'V', '1' );
  106.             break;
  107.         case VLC_FOURCC( 'd', 'i', 'v', '2' ):
  108.         case VLC_FOURCC( 'M', 'P', '4', '2' ):
  109.         case VLC_FOURCC( 'm', 'p', '4', '2' ):
  110.             p_dec->fmt_out.i_codec = VLC_FOURCC( 'D', 'I', 'V', '2' );
  111.             break;
  112.         case VLC_FOURCC( 'd', 'i', 'v', '3' ):
  113.         case VLC_FOURCC( 'd', 'i', 'v', '4' ):
  114.         case VLC_FOURCC( 'D', 'I', 'V', '4' ):
  115.         case VLC_FOURCC( 'd', 'i', 'v', '5' ):
  116.         case VLC_FOURCC( 'D', 'I', 'V', '5' ):
  117.         case VLC_FOURCC( 'd', 'i', 'v', '6' ):
  118.         case VLC_FOURCC( 'D', 'I', 'V', '6' ):
  119.         case VLC_FOURCC( 'M', 'P', '4', '3' ):
  120.         case VLC_FOURCC( 'm', 'p', '4', '3' ):
  121.         case VLC_FOURCC( 'm', 'p', 'g', '3' ):
  122.         case VLC_FOURCC( 'M', 'P', 'G', '3' ):
  123.         case VLC_FOURCC( 'A', 'P', '4', '1' ):
  124.             p_dec->fmt_out.i_codec = VLC_FOURCC( 'D', 'I', 'V', '3' );
  125.             break;
  126.         case VLC_FOURCC( 'h', '2', '6', '3' ):
  127.         case VLC_FOURCC( 'U', '2', '6', '3' ):
  128.         case VLC_FOURCC( 'u', '2', '6', '3' ):
  129.             p_dec->fmt_out.i_codec = VLC_FOURCC( 'H', '2', '6', '3' );
  130.             break;
  131.         case VLC_FOURCC( 'i', '2', '6', '3' ):
  132.             p_dec->fmt_out.i_codec = VLC_FOURCC( 'I', '2', '6', '3' );
  133.             break;
  134.         case VLC_FOURCC( 'm', 'j', 'p', 'g' ):
  135.         case VLC_FOURCC( 'm', 'j', 'p', 'a' ):
  136.         case VLC_FOURCC( 'j', 'p', 'e', 'g' ):
  137.         case VLC_FOURCC( 'J', 'P', 'E', 'G' ):
  138.         case VLC_FOURCC( 'J', 'F', 'I', 'F' ):
  139.             p_dec->fmt_out.i_codec = VLC_FOURCC( 'M', 'J', 'P', 'G' );
  140.             break;
  141.         case VLC_FOURCC( 'd', 'v', 's', 'd' ):
  142.         case VLC_FOURCC( 'D', 'V', 'S', 'D' ):
  143.         case VLC_FOURCC( 'd', 'v', 'h', 'd' ):
  144.             p_dec->fmt_out.i_codec = VLC_FOURCC( 'd', 'v', 's', 'l' );
  145.             break;
  146.         /* audio */
  147.         case VLC_FOURCC( 'a', 'r', 'a', 'w' ):
  148.             switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
  149.             {
  150.                 case 1:
  151.                     p_dec->fmt_out.i_codec = VLC_FOURCC('u','8',' ',' ');
  152.                     break;
  153.                 case 2:
  154.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','l');
  155.                     break;
  156.                 case 3:
  157.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','l');
  158.                     break;
  159.                 case 4:
  160.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','l');
  161.                     break;
  162.                 default:
  163.                     msg_Err( p_dec, "unknown raw audio sample size" );
  164.                     return VLC_EGENERIC;
  165.             }
  166.             break;
  167.         case VLC_FOURCC( 't', 'w', 'o', 's' ):
  168.             switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
  169.             {
  170.                 case 1:
  171.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
  172.                     break;
  173.                 case 2:
  174.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','b');
  175.                     break;
  176.                 case 3:
  177.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','b');
  178.                     break;
  179.                 case 4:
  180.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','b');
  181.                     break;
  182.                 default:
  183.                     msg_Err( p_dec, "unknown raw audio sample size" );
  184.                     return VLC_EGENERIC;
  185.             }
  186.             break;
  187.         case VLC_FOURCC( 's', 'o', 'w', 't' ):
  188.             switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
  189.             {
  190.                 case 1:
  191.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
  192.                     break;
  193.                 case 2:
  194.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','l');
  195.                     break;
  196.                 case 3:
  197.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','l');
  198.                     break;
  199.                 case 4:
  200.                     p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','l');
  201.                     break;
  202.                 default:
  203.                     msg_Err( p_dec, "unknown raw audio sample size" );
  204.                     return VLC_EGENERIC;
  205.             }
  206.             break;
  207.     }
  208.     p_dec->p_sys = p_sys = malloc( sizeof( block_t ) );
  209.     p_sys->p_block    = NULL;
  210.     return VLC_SUCCESS;
  211. }
  212. /*****************************************************************************
  213.  * Close:
  214.  *****************************************************************************/
  215. static void Close( vlc_object_t *p_this )
  216. {
  217.     decoder_t     *p_dec = (decoder_t*)p_this;
  218.     if( p_dec->p_sys->p_block )
  219.     {
  220.         block_ChainRelease( p_dec->p_sys->p_block );
  221.     }
  222.     es_format_Clean( &p_dec->fmt_out );
  223.     free( p_dec->p_sys );
  224. }
  225. /*****************************************************************************
  226.  * Packetize: packetize an unit (here copy a complete block )
  227.  *****************************************************************************/
  228. static block_t *Packetize ( decoder_t *p_dec, block_t **pp_block )
  229. {
  230.     block_t *p_block;
  231.     block_t *p_ret = p_dec->p_sys->p_block;
  232.     if( pp_block == NULL || *pp_block == NULL )
  233.         return NULL;
  234.     if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
  235.     {
  236.         block_Release( *pp_block );
  237.         return NULL;
  238.     }
  239.     p_block = *pp_block;
  240.     *pp_block = NULL;
  241.     if( p_block->i_dts <= 0 )
  242.     {
  243.         p_block->i_dts = p_block->i_pts;
  244.     }
  245.     if( p_block->i_dts <= 0 )
  246.     {
  247.         msg_Dbg( p_dec, "need dts > 0" );
  248.         block_Release( p_block );
  249.         return NULL;
  250.     }
  251.     if( p_ret != NULL && p_block->i_pts > p_ret->i_pts )
  252.     {
  253.         p_ret->i_length = p_block->i_pts - p_ret->i_pts;
  254.     }
  255.     p_dec->p_sys->p_block = p_block;
  256.     return p_ret;
  257. }
  258. /*****************************************************************************
  259.  * PacketizeSub: packetize an unit (here copy a complete block )
  260.  *****************************************************************************/
  261. static block_t *PacketizeSub( decoder_t *p_dec, block_t **pp_block )
  262. {
  263.     block_t *p_block;
  264.     if( pp_block == NULL || *pp_block == NULL )
  265.         return NULL;
  266.     if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
  267.     {
  268.         block_Release( *pp_block );
  269.         return NULL;
  270.     }
  271.     p_block = *pp_block;
  272.     *pp_block = NULL;
  273.     if( p_block->i_dts <= 0 )
  274.     {
  275.         p_block->i_dts = p_block->i_pts;
  276.     }
  277.     if( p_block->i_dts <= 0 )
  278.     {
  279.         msg_Dbg( p_dec, "need dts > 0" );
  280.         block_Release( p_block );
  281.         return NULL;
  282.     }
  283.     return p_block;
  284. }