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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * rv32.c: conversion plugin to RV32 format.
  3.  *****************************************************************************
  4.  * Copyright (C) 2005 the VideoLAN team
  5.  * $Id: 68ef70f3469d67506a9aa072c80ac18991656e7a $
  6.  *
  7.  * Author: Cyril Deguet <asmax@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_plugin.h>
  31. #include <vlc_vout.h>
  32. #include "vlc_filter.h"
  33. /*****************************************************************************
  34.  * filter_sys_t : filter descriptor
  35.  *****************************************************************************/
  36. struct filter_sys_t
  37. {
  38.     es_format_t fmt_in;
  39.     es_format_t fmt_out;
  40. };
  41. /****************************************************************************
  42.  * Local prototypes
  43.  ****************************************************************************/
  44. static int  OpenFilter ( vlc_object_t * );
  45. static void CloseFilter( vlc_object_t * );
  46. static picture_t *Filter( filter_t *, picture_t * );
  47. /*****************************************************************************
  48.  * Module descriptor
  49.  *****************************************************************************/
  50. vlc_module_begin ()
  51.     set_description( N_("RV32 conversion filter") )
  52.     set_capability( "video filter2", 1 )
  53.     set_callbacks( OpenFilter, CloseFilter )
  54. vlc_module_end ()
  55. /*****************************************************************************
  56.  * OpenFilter: probe the filter and return score
  57.  *****************************************************************************/
  58. static int OpenFilter( vlc_object_t *p_this )
  59. {
  60.     filter_t *p_filter = (filter_t*)p_this;
  61.     filter_sys_t *p_sys;
  62.     /* XXX Only support RV24 -> RV32 conversion */
  63.     if( p_filter->fmt_in.video.i_chroma != VLC_FOURCC('R','V','2','4') ||
  64.         (p_filter->fmt_out.video.i_chroma != VLC_FOURCC('R', 'V', '3', '2') &&
  65.         p_filter->fmt_out.video.i_chroma != VLC_FOURCC('R', 'G', 'B', 'A')) )
  66.     {
  67.         return VLC_EGENERIC;
  68.     }
  69.     if( p_filter->fmt_in.video.i_width != p_filter->fmt_out.video.i_width
  70.      || p_filter->fmt_in.video.i_height != p_filter->fmt_out.video.i_height )
  71.         return -1;
  72.     /* Allocate the memory needed to store the decoder's structure */
  73.     if( ( p_filter->p_sys = p_sys =
  74.           (filter_sys_t *)malloc(sizeof(filter_sys_t)) ) == NULL )
  75.         return VLC_ENOMEM;
  76.     p_filter->pf_video_filter = Filter;
  77.     return VLC_SUCCESS;
  78. }
  79. /*****************************************************************************
  80.  * CloseFilter: clean up the filter
  81.  *****************************************************************************/
  82. static void CloseFilter( vlc_object_t *p_this )
  83. {
  84.     filter_t *p_filter = (filter_t*)p_this;
  85.     filter_sys_t *p_sys = p_filter->p_sys;
  86.     free( p_sys );
  87. }
  88. /****************************************************************************
  89.  * Filter: the whole thing
  90.  ****************************************************************************/
  91. static picture_t *Filter( filter_t *p_filter, picture_t *p_pic )
  92. {
  93.     picture_t *p_pic_dst;
  94.     int i_plane, i;
  95.     unsigned int j;
  96.     /* Request output picture */
  97.     p_pic_dst = filter_NewPicture( p_filter );
  98.     if( !p_pic_dst )
  99.     {
  100.         picture_Release( p_pic );
  101.         return NULL;
  102.     }
  103.     /* Convert RV24 to RV32 */
  104.     for( i_plane = 0; i_plane < p_pic_dst->i_planes; i_plane++ )
  105.     {
  106.         uint8_t *p_src = p_pic->p[i_plane].p_pixels;
  107.         uint8_t *p_dst = p_pic_dst->p[i_plane].p_pixels;
  108.         unsigned int i_width = p_filter->fmt_out.video.i_width;
  109.         for( i = 0; i < p_pic_dst->p[i_plane].i_lines; i++ )
  110.         {
  111.             for( j = 0; j < i_width; j++ )
  112.             {
  113.                 *(p_dst++) = p_src[2];
  114.                 *(p_dst++) = p_src[1];
  115.                 *(p_dst++) = p_src[0];
  116.                 *(p_dst++) = 0xff;  /* Alpha */
  117.                 p_src += 3;
  118.             }
  119.             p_src += p_pic->p[i_plane].i_pitch - 3 * i_width;
  120.             p_dst += p_pic_dst->p[i_plane].i_pitch - 4 * i_width;
  121.         }
  122.     }
  123.     picture_CopyProperties( p_pic_dst, p_pic );
  124.     picture_Release( p_pic );
  125.     return p_pic_dst;
  126. }