chroma.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:7k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * chroma.c: chroma conversion using ffmpeg library
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2001 VideoLAN
  5.  * $Id: chroma.c 8593 2004-08-30 19:24:55Z gbazin $
  6.  *
  7.  * Authors: Gildas Bazin <gbazin@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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <vlc/vlc.h>
  27. #include <vlc/vout.h>
  28. /* ffmpeg header */
  29. #ifdef HAVE_FFMPEG_AVCODEC_H
  30. #   include <ffmpeg/avcodec.h>
  31. #else
  32. #   include <avcodec.h>
  33. #endif
  34. #include "ffmpeg.h"
  35. void E_(InitLibavcodec) ( vlc_object_t *p_object );
  36. static void ChromaConversion( vout_thread_t *, picture_t *, picture_t * );
  37. /*****************************************************************************
  38.  * chroma_sys_t: chroma method descriptor
  39.  *****************************************************************************
  40.  * This structure is part of the chroma transformation descriptor, it
  41.  * describes the chroma plugin specific properties.
  42.  *****************************************************************************/
  43. struct chroma_sys_t
  44. {
  45.     int i_src_vlc_chroma;
  46.     int i_src_ffmpeg_chroma;
  47.     int i_dst_vlc_chroma;
  48.     int i_dst_ffmpeg_chroma;
  49.     AVPicture tmp_pic;
  50.     ImgReSampleContext *p_rsc;
  51. };
  52. /*****************************************************************************
  53.  * OpenChroma: allocate a chroma function
  54.  *****************************************************************************
  55.  * This function allocates and initializes a chroma function
  56.  *****************************************************************************/
  57. int E_(OpenChroma)( vlc_object_t *p_this )
  58. {
  59.     vout_thread_t *p_vout = (vout_thread_t *)p_this;
  60.     int i_ffmpeg_chroma[2], i_vlc_chroma[2], i;
  61.     /*
  62.      * Check the source chroma first, then the destination chroma
  63.      */
  64.     i_vlc_chroma[0] = p_vout->render.i_chroma;
  65.     i_vlc_chroma[1] = p_vout->output.i_chroma;
  66.     for( i = 0; i < 2; i++ )
  67.     {
  68.         i_ffmpeg_chroma[i] = E_(GetFfmpegChroma)( i_vlc_chroma[i] );
  69.         if( i_ffmpeg_chroma[i] < 0 ) return VLC_EGENERIC;
  70.     }
  71.     p_vout->chroma.pf_convert = ChromaConversion;
  72.     p_vout->chroma.p_sys = malloc( sizeof( chroma_sys_t ) );
  73.     if( p_vout->chroma.p_sys == NULL )
  74.     {
  75.         return VLC_EGENERIC;
  76.     }
  77.     p_vout->chroma.p_sys->i_src_vlc_chroma = p_vout->render.i_chroma;
  78.     p_vout->chroma.p_sys->i_dst_vlc_chroma = p_vout->output.i_chroma;
  79.     p_vout->chroma.p_sys->i_src_ffmpeg_chroma = i_ffmpeg_chroma[0];
  80.     p_vout->chroma.p_sys->i_dst_ffmpeg_chroma = i_ffmpeg_chroma[1];
  81.     if( ( p_vout->render.i_height != p_vout->output.i_height ||
  82.           p_vout->render.i_width != p_vout->output.i_width ) &&
  83.         ( p_vout->chroma.p_sys->i_dst_vlc_chroma == VLC_FOURCC('I','4','2','0')  ||
  84.           p_vout->chroma.p_sys->i_dst_vlc_chroma == VLC_FOURCC('Y','V','1','2') ))
  85.         
  86.     {
  87.         msg_Dbg( p_vout, "preparing to resample picture" );
  88.         p_vout->chroma.p_sys->p_rsc =
  89.             img_resample_init( p_vout->output.i_width, p_vout->output.i_height,
  90.                                p_vout->render.i_width, p_vout->render.i_height );
  91.         avpicture_alloc( &p_vout->chroma.p_sys->tmp_pic,
  92.                          p_vout->chroma.p_sys->i_dst_ffmpeg_chroma,
  93.                          p_vout->render.i_width, p_vout->render.i_height );
  94.     }
  95.     else
  96.     {
  97.         msg_Dbg( p_vout, "no resampling" );
  98.         p_vout->chroma.p_sys->p_rsc = NULL;
  99.     }
  100.     /* libavcodec needs to be initialized for some chroma conversions */
  101.     E_(InitLibavcodec)(p_this);
  102.     return VLC_SUCCESS;
  103. }
  104. /*****************************************************************************
  105.  * ChromaConversion: actual chroma conversion function
  106.  *****************************************************************************/
  107. static void ChromaConversion( vout_thread_t *p_vout,
  108.                               picture_t *p_src, picture_t *p_dest )
  109. {
  110.     AVPicture src_pic;
  111.     AVPicture dest_pic;
  112.     int i;
  113.     /* Prepare the AVPictures for converion */
  114.     for( i = 0; i < p_src->i_planes; i++ )
  115.     {
  116.         src_pic.data[i] = p_src->p[i].p_pixels;
  117.         src_pic.linesize[i] = p_src->p[i].i_pitch;
  118.     }
  119.     for( i = 0; i < p_dest->i_planes; i++ )
  120.     {
  121.         dest_pic.data[i] = p_dest->p[i].p_pixels;
  122.         dest_pic.linesize[i] = p_dest->p[i].i_pitch;
  123.     }
  124.     /* Special cases */
  125.     if( p_vout->chroma.p_sys->i_src_vlc_chroma == VLC_FOURCC('Y','V','1','2') ||
  126.         p_vout->chroma.p_sys->i_src_vlc_chroma == VLC_FOURCC('Y','V','U','9') )
  127.     {
  128.         /* Invert U and V */
  129.         src_pic.data[1] = p_src->p[2].p_pixels;
  130.         src_pic.data[2] = p_src->p[1].p_pixels;
  131.     }
  132.     if( p_vout->chroma.p_sys->i_dst_vlc_chroma == VLC_FOURCC('Y','V','1','2') ||
  133.         p_vout->chroma.p_sys->i_dst_vlc_chroma == VLC_FOURCC('Y','V','U','9') )
  134.     {
  135.         /* Invert U and V */
  136.         dest_pic.data[1] = p_dest->p[2].p_pixels;
  137.         dest_pic.data[2] = p_dest->p[1].p_pixels;
  138.     }
  139.     if( p_vout->chroma.p_sys->i_src_ffmpeg_chroma == PIX_FMT_RGB24 )
  140.         if( p_vout->render.i_bmask == 0x00ff0000 )
  141.             p_vout->chroma.p_sys->i_src_ffmpeg_chroma = PIX_FMT_BGR24;
  142.     if( p_vout->chroma.p_sys->p_rsc )
  143.     {
  144.         img_convert( &p_vout->chroma.p_sys->tmp_pic,
  145.                      p_vout->chroma.p_sys->i_dst_ffmpeg_chroma,
  146.                      &src_pic, p_vout->chroma.p_sys->i_src_ffmpeg_chroma,
  147.                      p_vout->render.i_width, p_vout->render.i_height );
  148.         img_resample( p_vout->chroma.p_sys->p_rsc, &dest_pic,
  149.                       &p_vout->chroma.p_sys->tmp_pic );
  150.     }
  151.     else
  152.     {
  153.         img_convert( &dest_pic, p_vout->chroma.p_sys->i_dst_ffmpeg_chroma,
  154.                      &src_pic, p_vout->chroma.p_sys->i_src_ffmpeg_chroma,
  155.                      p_vout->render.i_width, p_vout->render.i_height );
  156.     }
  157. }
  158. /*****************************************************************************
  159.  * CloseChroma: free the chroma function
  160.  *****************************************************************************
  161.  * This function frees the previously allocated chroma function
  162.  *****************************************************************************/
  163. void E_(CloseChroma)( vlc_object_t *p_this )
  164. {
  165.     vout_thread_t *p_vout = (vout_thread_t *)p_this;
  166.     if( p_vout->chroma.p_sys->p_rsc )
  167.     {
  168.         img_resample_close( p_vout->chroma.p_sys->p_rsc );
  169.         avpicture_free( &p_vout->chroma.p_sys->tmp_pic );
  170.     }
  171.     free( p_vout->chroma.p_sys );
  172. }