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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * es_format.c : es_format_t helpers.
  3.  *****************************************************************************
  4.  * Copyright (C) 2008 the VideoLAN team
  5.  * $Id: 9f74db009c3b0bd90f7476bdb0cd3c906fe43aba $
  6.  *
  7.  * Author: Laurent Aimar <fenrir@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #ifdef HAVE_CONFIG_H
  27. # include "config.h"
  28. #endif
  29. #include <vlc_common.h>
  30. #include <vlc_es.h>
  31. /*****************************************************************************
  32.  * BinaryLog: computes the base 2 log of a binary value
  33.  *****************************************************************************
  34.  * This functions is used by MaskToShift, to get a bit index from a binary
  35.  * value.
  36.  *****************************************************************************/
  37. static int BinaryLog( uint32_t i )
  38. {
  39.     int i_log = 0;
  40.     if( i == 0 ) return -31337;
  41.     if( i & 0xffff0000 ) i_log += 16;
  42.     if( i & 0xff00ff00 ) i_log += 8;
  43.     if( i & 0xf0f0f0f0 ) i_log += 4;
  44.     if( i & 0xcccccccc ) i_log += 2;
  45.     if( i & 0xaaaaaaaa ) i_log += 1;
  46.     return i_log;
  47. }
  48. /**
  49.  * It transforms a color mask into right and left shifts
  50.  * FIXME copied from video_output.c
  51.  */
  52. static void MaskToShift( int *pi_left, int *pi_right, uint32_t i_mask )
  53. {
  54.     uint32_t i_low, i_high;            /* lower and higher bits of the mask */
  55.     if( !i_mask )
  56.     {
  57.         *pi_left = *pi_right = 0;
  58.         return;
  59.     }
  60.     /* Get bits */
  61.     i_low = i_high = i_mask;
  62.     i_low &= - (int32_t)i_low;          /* lower bit of the mask */
  63.     i_high += i_low;                    /* higher bit of the mask */
  64.     /* Transform bits into an index. Also deal with i_high overflow, which
  65.      * is faster than changing the BinaryLog code to handle 64 bit integers. */
  66.     i_low =  BinaryLog (i_low);
  67.     i_high = i_high ? BinaryLog (i_high) : 32;
  68.     /* Update pointers and return */
  69.     *pi_left =   i_low;
  70.     *pi_right = (8 - i_high + i_low);
  71. }
  72. /* */
  73. void video_format_FixRgb( video_format_t *p_fmt )
  74. {
  75.     /* FIXME find right default mask */
  76.     if( !p_fmt->i_rmask || !p_fmt->i_gmask || !p_fmt->i_bmask )
  77.     {
  78.         switch( p_fmt->i_chroma )
  79.         {
  80.         case VLC_FOURCC('R','V','1','5'):
  81.             p_fmt->i_rmask = 0x7c00;
  82.             p_fmt->i_gmask = 0x03e0;
  83.             p_fmt->i_bmask = 0x001f;
  84.             break;
  85.         case VLC_FOURCC('R','V','1','6'):
  86.             p_fmt->i_rmask = 0xf800;
  87.             p_fmt->i_gmask = 0x07e0;
  88.             p_fmt->i_bmask = 0x001f;
  89.             break;
  90.         case VLC_FOURCC('R','V','2','4'):
  91.             p_fmt->i_rmask = 0xff0000;
  92.             p_fmt->i_gmask = 0x00ff00;
  93.             p_fmt->i_bmask = 0x0000ff;
  94.             break;
  95.         case VLC_FOURCC('R','V','3','2'):
  96.             p_fmt->i_rmask = 0x00ff0000;
  97.             p_fmt->i_gmask = 0x0000ff00;
  98.             p_fmt->i_bmask = 0x000000ff;
  99.             break;
  100.         default:
  101.             return;
  102.         }
  103.     }
  104.     MaskToShift( &p_fmt->i_lrshift, &p_fmt->i_rrshift,
  105.                  p_fmt->i_rmask );
  106.     MaskToShift( &p_fmt->i_lgshift, &p_fmt->i_rgshift,
  107.                  p_fmt->i_gmask );
  108.     MaskToShift( &p_fmt->i_lbshift, &p_fmt->i_rbshift,
  109.                  p_fmt->i_bmask );
  110. }
  111. void es_format_Init( es_format_t *fmt,
  112.                      int i_cat, vlc_fourcc_t i_codec )
  113. {
  114.     fmt->i_cat                  = i_cat;
  115.     fmt->i_codec                = i_codec;
  116.     fmt->i_id                   = -1;
  117.     fmt->i_group                = 0;
  118.     fmt->i_priority             = 0;
  119.     fmt->psz_language           = NULL;
  120.     fmt->psz_description        = NULL;
  121.     fmt->i_extra_languages      = 0;
  122.     fmt->p_extra_languages      = NULL;
  123.     memset( &fmt->audio, 0, sizeof(audio_format_t) );
  124.     memset( &fmt->audio_replay_gain, 0, sizeof(audio_replay_gain_t) );
  125.     memset( &fmt->video, 0, sizeof(video_format_t) );
  126.     memset( &fmt->subs, 0, sizeof(subs_format_t) );
  127.     fmt->b_packetized           = true;
  128.     fmt->i_bitrate              = 0;
  129.     fmt->i_extra                = 0;
  130.     fmt->p_extra                = NULL;
  131. }
  132. int es_format_Copy( es_format_t *dst, const es_format_t *src )
  133. {
  134.     int i;
  135.     memcpy( dst, src, sizeof( es_format_t ) );
  136.     dst->psz_language = src->psz_language ? strdup( src->psz_language ) : NULL;
  137.     dst->psz_description = src->psz_description ? strdup( src->psz_description ) : NULL;
  138.     if( src->i_extra > 0 && dst->p_extra )
  139.     {
  140.         dst->i_extra = src->i_extra;
  141.         dst->p_extra = malloc( src->i_extra );
  142.         if(dst->p_extra)
  143.             memcpy( dst->p_extra, src->p_extra, src->i_extra );
  144.         else
  145.             dst->i_extra = 0;
  146.     }
  147.     else
  148.     {
  149.         dst->i_extra = 0;
  150.         dst->p_extra = NULL;
  151.     }
  152.     dst->subs.psz_encoding = dst->subs.psz_encoding ? strdup( src->subs.psz_encoding ) : NULL;
  153.     if( src->video.p_palette )
  154.     {
  155.         dst->video.p_palette =
  156.             (video_palette_t*)malloc( sizeof( video_palette_t ) );
  157.         if(dst->video.p_palette)
  158.         {
  159.             memcpy( dst->video.p_palette, src->video.p_palette,
  160.                 sizeof( video_palette_t ) );
  161.         }
  162.     }
  163.     if( dst->i_extra_languages && src->p_extra_languages)
  164.     {
  165.         dst->i_extra_languages = src->i_extra_languages;
  166.         dst->p_extra_languages = (extra_languages_t*)
  167.             malloc(dst->i_extra_languages * sizeof(*dst->p_extra_languages ));
  168.         if( dst->p_extra_languages )
  169.         {
  170.             for( i = 0; i < dst->i_extra_languages; i++ ) {
  171.                 if( src->p_extra_languages[i].psz_language )
  172.                     dst->p_extra_languages[i].psz_language = strdup( src->p_extra_languages[i].psz_language );
  173.                 else
  174.                     dst->p_extra_languages[i].psz_language = NULL;
  175.                 if( src->p_extra_languages[i].psz_description )
  176.                     dst->p_extra_languages[i].psz_description = strdup( src->p_extra_languages[i].psz_description );
  177.                 else
  178.                     dst->p_extra_languages[i].psz_description = NULL;
  179.             }
  180.         }
  181.         else
  182.             dst->i_extra_languages = 0;
  183.     }
  184.     else
  185.         dst->i_extra_languages = 0;
  186.     return VLC_SUCCESS;
  187. }
  188. void es_format_Clean( es_format_t *fmt )
  189. {
  190.     free( fmt->psz_language );
  191.     free( fmt->psz_description );
  192.     if( fmt->i_extra > 0 ) free( fmt->p_extra );
  193.     free( fmt->video.p_palette );
  194.     free( fmt->subs.psz_encoding );
  195.     if( fmt->i_extra_languages > 0 && fmt->p_extra_languages )
  196.     {
  197.         int i;
  198.         for( i = 0; i < fmt->i_extra_languages; i++ )
  199.         {
  200.             free( fmt->p_extra_languages[i].psz_language );
  201.             free( fmt->p_extra_languages[i].psz_description );
  202.         }
  203.         free( fmt->p_extra_languages );
  204.     }
  205.     /* es_format_Clean can be called multiple times */
  206.     memset( fmt, 0, sizeof(*fmt) );
  207. }