1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/* -*- c++ -*- */
/*
* Copyright 2006 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* GNU Radio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU Radio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef INCLUDED_VIDEO_SDL_SINK_UC_H
#define INCLUDED_VIDEO_SDL_SINK_UC_H
#include <gr_sync_block.h>
#include <string>
#include <SDL.h>
/* fourcc (four character code) */
#define vid_fourcc(a,b,c,d) (((unsigned)(a)<<0) | ((unsigned)(b)<<8) | ((unsigned)(c)<<16) | ((unsigned)(d)<<24))
#define IMGFMT_YV12 vid_fourcc('Y','V','1','2') /* 12 YVU 4:2:0 */
class video_sdl_sink_uc;
typedef boost::shared_ptr<video_sdl_sink_uc> video_sdl_sink_uc_sptr;
video_sdl_sink_uc_sptr
video_sdl_make_sink_uc (double framerate,int width=640, int height=480,unsigned int format=IMGFMT_YV12,int dst_width=-1,int dst_height=-1);
/*!
* \brief video sink using SDL
*
* input signature is one, two or three streams of uchar.
* One stream: stream is grey (Y)
* two streems: first is grey (Y), second is alternating U and V
* Three streams: first is grey (Y), second is U, third is V
* Input samples must be in the range [0,255].
*/
class video_sdl_sink_uc : public gr_sync_block {
friend video_sdl_sink_uc_sptr
video_sdl_make_sink_uc (double framerate,int width, int height,unsigned int format,int dst_width,int dst_height);
int d_chunk_size;
protected:
video_sdl_sink_uc (double framerate,int width, int height,unsigned int format,
int dst_width,int dst_height);
void copy_line_pixel_interleaved(unsigned char *dst_pixels_u,unsigned char *dst_pixels_v,
const unsigned char * src_pixels,int src_width);
void copy_line_line_interleaved(unsigned char *dst_pixels_u,unsigned char *dst_pixels_v,
const unsigned char * src_pixels,int src_width);
void copy_line_single_plane(unsigned char *dst_pixels,const unsigned char * src_pixels,int src_width);
void copy_line_single_plane_dec2(unsigned char *dst_pixels,const unsigned char * src_pixels,int src_width);
int copy_plane_to_surface (int plane,int noutput_items,
const unsigned char * src_pixels);
float d_framerate;
int d_wanted_frametime_ms;
int d_width;
int d_height;
int d_dst_width;
int d_dst_height;
int d_format;
int d_current_line;
SDL_Surface *d_screen;
SDL_Overlay *d_image;
SDL_Rect d_dst_rect;
float d_avg_delay;
unsigned int d_wanted_ticks;
public:
~video_sdl_sink_uc ();
int work (int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
};
#endif /* INCLUDED_VIDEO_SDL_SINK_UC_H */
|