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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * chroma.c: libavutil <-> libvlc conversion routines
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2008 the VideoLAN team
  5.  * $Id: 6913a427a67b6bfc34b4030d4e7f271c653398e4 $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Gildas Bazin <gbazin@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 021100301, USA.
  23.  *****************************************************************************/
  24. #ifdef HAVE_CONFIG_H
  25. # include <config.h>
  26. #endif
  27. #include <vlc_common.h>
  28. #include <vlc_codec.h>
  29. #ifdef HAVE_LIBAVCODEC_AVCODEC_H
  30. #   include <libavcodec/avcodec.h>
  31. #elif defined(HAVE_FFMPEG_AVCODEC_H)
  32. #   include <ffmpeg/avcodec.h>
  33. #else
  34. #   include <avcodec.h>
  35. #endif
  36. #include "avcodec.h"
  37. /*****************************************************************************
  38.  * Chroma fourcc -> ffmpeg_id mapping
  39.  *****************************************************************************/
  40. #if defined(WORDS_BIGENDIAN)
  41. #   define VLC_RGB_ES( fcc, leid, beid ) 
  42.     { fcc, beid, 0, 0, 0 },
  43. #else
  44. #   define VLC_RGB_ES( fcc, leid, beid ) 
  45.     { fcc, leid, 0, 0, 0 },
  46. #endif
  47. #define VLC_RGB( fcc, leid, beid, rmask, gmask, bmask ) 
  48.     { fcc, leid, rmask, gmask, bmask }, 
  49.     { fcc, beid, bmask, gmask, rmask }, 
  50.     VLC_RGB_ES( fcc, leid, beid )
  51. static const struct
  52. {
  53.     vlc_fourcc_t  i_chroma;
  54.     int           i_chroma_id;
  55.     uint32_t      i_rmask;
  56.     uint32_t      i_gmask;
  57.     uint32_t      i_bmask;
  58. } chroma_table[] =
  59. {
  60.     /* Planar YUV formats */
  61.     {VLC_FOURCC('I','4','4','4'), PIX_FMT_YUV444P, 0, 0, 0 },
  62.     {VLC_FOURCC('J','4','4','4'), PIX_FMT_YUVJ444P, 0, 0, 0 },
  63. #if LIBAVUTIL_VERSION_INT >= ((49<<16)+(5<<8)+0)
  64.     {VLC_FOURCC('I','4','4','0'), PIX_FMT_YUV440P, 0, 0, 0 },
  65.     {VLC_FOURCC('J','4','4','0'), PIX_FMT_YUVJ440P, 0, 0, 0 },
  66. #endif
  67.     {VLC_FOURCC('I','4','2','2'), PIX_FMT_YUV422P, 0, 0, 0 },
  68.     {VLC_FOURCC('J','4','2','2'), PIX_FMT_YUVJ422P, 0, 0, 0 },
  69.     {VLC_FOURCC('I','4','2','0'), PIX_FMT_YUV420P, 0, 0, 0 },
  70.     {VLC_FOURCC('Y','V','1','2'), PIX_FMT_YUV420P, 0, 0, 0 },
  71.     {VLC_FOURCC('I','Y','U','V'), PIX_FMT_YUV420P, 0, 0, 0 },
  72.     {VLC_FOURCC('J','4','2','0'), PIX_FMT_YUVJ420P, 0, 0, 0 },
  73.     {VLC_FOURCC('I','4','1','1'), PIX_FMT_YUV411P, 0, 0, 0 },
  74.     {VLC_FOURCC('I','4','1','0'), PIX_FMT_YUV410P, 0, 0, 0 },
  75.     {VLC_FOURCC('Y','V','U','9'), PIX_FMT_YUV410P, 0, 0, 0 },
  76.     {VLC_FOURCC('N','V','1','2'), PIX_FMT_NV12, 0, 0, 0 },
  77.     {VLC_FOURCC('N','V','2','1'), PIX_FMT_NV21, 0, 0, 0 },
  78.     /* Packed YUV formats */
  79.     {VLC_FOURCC('Y','U','Y','2'), PIX_FMT_YUYV422, 0, 0, 0 },
  80.     {VLC_FOURCC('Y','U','Y','V'), PIX_FMT_YUYV422, 0, 0, 0 },
  81.     {VLC_FOURCC('U','Y','V','Y'), PIX_FMT_UYVY422, 0, 0, 0 },
  82.     {VLC_FOURCC('Y','4','1','1'), PIX_FMT_UYYVYY411, 0, 0, 0 },
  83.     /* Packed RGB formats */
  84.     VLC_RGB( VLC_FOURCC('R','G','B','4'), PIX_FMT_RGB4, PIX_FMT_BGR4, 0x10, 0x06, 0x01 )
  85.     VLC_RGB( VLC_FOURCC('R','G','B','8'), PIX_FMT_RGB8, PIX_FMT_BGR8, 0xC0, 0x38, 0x07 )
  86.     VLC_RGB( VLC_FOURCC('R','V','1','5'), PIX_FMT_BGR555, PIX_FMT_RGB555, 0x7c00, 0x03e0, 0x001f )
  87.     VLC_RGB( VLC_FOURCC('R','V','1','6'), PIX_FMT_BGR565, PIX_FMT_RGB565, 0xf800, 0x07e0, 0x001f )
  88.     VLC_RGB( VLC_FOURCC('R','V','2','4'), PIX_FMT_BGR24, PIX_FMT_RGB24, 0xff0000, 0x00ff00, 0x0000ff )
  89.     VLC_RGB( VLC_FOURCC('R','V','3','2'), PIX_FMT_RGB32, PIX_FMT_BGR32, 0x00ff0000, 0x0000ff00, 0x000000ff )
  90.     VLC_RGB( VLC_FOURCC('R','V','3','2'), PIX_FMT_RGB32_1, PIX_FMT_BGR32_1, 0xff000000, 0x00ff0000, 0x0000ff00 )
  91. #if defined(PIX_FMT_RGBA)
  92.     {VLC_FOURCC('R','G','B','A'), PIX_FMT_RGBA, 0xff000000, 0x00ff0000, 0x0000ff00},
  93. #endif
  94.     {VLC_FOURCC('G','R','E','Y'), PIX_FMT_GRAY8, 0, 0, 0},
  95.      /* Paletized RGB */
  96.     {VLC_FOURCC('R','G','B','P'), PIX_FMT_PAL8, 0, 0, 0},
  97.     { 0, 0, 0, 0, 0 }
  98. };
  99. int TestFfmpegChroma( const int i_ffmpeg_id, const vlc_fourcc_t i_vlc_fourcc )
  100. {
  101.     for( int i = 0; chroma_table[i].i_chroma != 0; i++ )
  102.     {
  103.         if( chroma_table[i].i_chroma == i_vlc_fourcc || chroma_table[i].i_chroma_id == i_ffmpeg_id )
  104.             return VLC_SUCCESS;
  105.     }
  106.     return VLC_EGENERIC;
  107. }
  108. /* FIXME special case the RGB formats */
  109. int GetFfmpegChroma( int *i_ffmpeg_chroma, const video_format_t fmt )
  110. {
  111.     for( int i = 0; chroma_table[i].i_chroma != 0; i++ )
  112.     {
  113.         if( chroma_table[i].i_chroma == fmt.i_chroma )
  114.         {
  115.             if( chroma_table[i].i_rmask == fmt.i_rmask &&
  116.                 chroma_table[i].i_gmask == fmt.i_gmask &&
  117.                 chroma_table[i].i_bmask == fmt.i_bmask )
  118.             {
  119.                 *i_ffmpeg_chroma = chroma_table[i].i_chroma_id;
  120.                 return VLC_SUCCESS;
  121.             }
  122.         }
  123.     }
  124.     return VLC_EGENERIC;
  125. }
  126. int GetVlcChroma( video_format_t *fmt, const int i_ffmpeg_chroma )
  127. {
  128.     /* TODO FIXME for rgb format we HAVE to set rgb mask/shift */
  129.     for( int i = 0; chroma_table[i].i_chroma != 0; i++ )
  130.     {
  131.         if( chroma_table[i].i_chroma_id == i_ffmpeg_chroma )
  132.         {
  133.             fmt->i_rmask = chroma_table[i].i_rmask;
  134.             fmt->i_gmask = chroma_table[i].i_gmask;
  135.             fmt->i_bmask = chroma_table[i].i_bmask;
  136.             fmt->i_chroma = chroma_table[i].i_chroma;
  137.             return VLC_SUCCESS;
  138.         }
  139.     }
  140.     return VLC_EGENERIC;
  141. }