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

多媒体

开发平台:

MultiPlatform

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