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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * beos.cpp: Screen capture module.
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 the VideoLAN team
  5.  * $Id: 165250c9c301dc59741e1456decda7db7c354281 $
  6.  *
  7.  * Authors: Eric Petit <titer@m0k.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. #ifdef HAVE_CONFIG_H
  24. # include "config.h"
  25. #endif
  26. #include <vlc_common.h>
  27. #include <Screen.h>
  28. #include <Bitmap.h>
  29. extern "C"
  30. {
  31. #include "screen.h"
  32. struct screen_data_t
  33. {
  34.     BScreen * p_screen;
  35.     BBitmap * p_bitmap;
  36. };
  37. int screen_InitCapture( demux_t *p_demux )
  38. {
  39.     demux_sys_t   *p_sys = p_demux->p_sys;
  40.     screen_data_t *p_data;
  41.     BRect          rect;
  42.     int            i_chroma;
  43.     int            i_bits_per_pixel;
  44.     p_sys->p_data = p_data =
  45.         (screen_data_t *)malloc( sizeof( screen_data_t ) );
  46.     p_data->p_screen = new BScreen();
  47.     rect = p_data->p_screen->Frame();
  48.     p_data->p_bitmap = new BBitmap( rect, p_data->p_screen->ColorSpace() );
  49.     switch( p_data->p_screen->ColorSpace() )
  50.     {
  51.         case B_RGB32:
  52.             i_chroma = VLC_FOURCC('R','V','3','2');
  53.             i_bits_per_pixel = 32;
  54.             break;
  55.         case B_RGB16:
  56.             i_chroma = VLC_FOURCC('R','V','1','6');
  57.             i_bits_per_pixel = 16;
  58.             break;
  59.         default:
  60.             msg_Err( p_demux, "screen depth %i unsupported",
  61.                      p_data->p_screen->ColorSpace() );
  62.             delete p_data->p_bitmap;
  63.             delete p_data->p_screen;
  64.             free( p_data );
  65.             return VLC_EGENERIC;
  66.     }
  67.     es_format_Init( &p_sys->fmt, VIDEO_ES, i_chroma );
  68.     p_sys->fmt.video.i_width  = (int)rect.Width();
  69.     p_sys->fmt.video.i_height = (int)rect.Height();
  70.     p_sys->fmt.video.i_bits_per_pixel = i_bits_per_pixel;
  71.     return VLC_SUCCESS;
  72. }
  73. int screen_CloseCapture( demux_t *p_demux )
  74. {
  75.     demux_sys_t   *p_sys  = p_demux->p_sys;
  76.     screen_data_t *p_data = p_sys->p_data;
  77.     delete p_data->p_bitmap;
  78.     delete p_data->p_screen;
  79.     free( p_data );
  80.     return VLC_SUCCESS;
  81. }
  82. block_t *screen_Capture( demux_t *p_demux )
  83. {
  84.     demux_sys_t   *p_sys  = p_demux->p_sys;
  85.     screen_data_t *p_data = p_sys->p_data;
  86.     block_t       *p_block;
  87.     p_block = block_New( p_demux, p_sys->fmt.video.i_width *
  88.                          p_sys->fmt.video.i_height *
  89.                          p_sys->fmt.video.i_bits_per_pixel / 8 );
  90.     p_data->p_screen->ReadBitmap( p_data->p_bitmap );
  91.     for( unsigned i = 0; i < p_sys->fmt.video.i_height; i++ )
  92.     {
  93.         memcpy( p_block->p_buffer + i * p_sys->fmt.video.i_width *
  94.                     p_sys->fmt.video.i_bits_per_pixel / 8,
  95.                 (uint8_t *) p_data->p_bitmap->Bits() +
  96.                     i * p_data->p_bitmap->BytesPerRow(),
  97.                 p_sys->fmt.video.i_width *
  98.                     p_sys->fmt.video.i_bits_per_pixel / 8 );
  99.     }
  100.     return p_block;
  101. }
  102. } /* extern "C" */