1 /* view submodule for rawv
2 * Copyright (C) 2010,2011 Kirill Smelkov <kirr@navytux.spb.ru>
3 * Copyright (C) 2011 Marine Bridge and Navigation Systems (http://mns.spb.ru/)
5 * This library is free software: you can Use, Study, Modify and Redistribute
6 * it under the terms of the GNU Lesser General Public License version 2.1, or
7 * any later version. This library is distributed WITHOUT ANY WARRANTY. See
8 * COPYING.LIB file for full License terms.
21 /******** View ********/
23 View::View(int width
, int height
, bool upscale
, const char *title
)
25 fprintf(stderr
, "Viewing w: %i h: %i upscale: %i\n", width
, height
, upscale
);
27 if (SDL_InitSubSystem(SDL_INIT_VIDEO
) < 0)
28 die("SDL_INIT_VIDEO: %s", SDL_GetError());
30 display
= SDL_SetVideoMode(width
, height
, /*bpp=*/0, /*flags=*/0UL);
32 die("SDL_SetVideoMode: %s", SDL_GetError());
35 SDL_WM_SetCaption(title
, NULL
);
37 overlay
= SDL_CreateYUVOverlay(width
, height
, SDL_YUY2_OVERLAY
, display
);
39 die("SDL_CreateYUVOverlay: %s", SDL_GetError());
41 this->upscale
= upscale
;
47 SDL_FreeYUVOverlay(overlay
);
48 SDL_QuitSubSystem(SDL_INIT_VIDEO
); // XXX needed at all?
52 void View::display_frame(const Frame
*f
)
55 double tstamp
= buf
->timestamp
.tv_sec
+ 1E-6*buf
->timestamp
.tv_usec
;
57 fprintf(stderr
, "buf[%i] timestamp: %.7lf sequence: %u\n", buf
->index
, tstamp
, buf
->sequence
);
66 w
= min(f
->width
, overlay
->w
);
67 h
= min(f
->height
, overlay
->h
);
69 bt
= f
->interlace_tb_swapped
;
74 h
= (h
& ~1U) - int((1-bt
)/2);
76 /* for bt=-1, we have to start from 1, for bt=0,+1 - from 0'th line */
80 bt
= -bt
; /* account for i 0->1 move */
84 SDL_LockYUVOverlay(overlay
);
86 switch (f
->pixfmt_4cc
) {
87 case MKTAG32('Y','U','Y','V'):
88 case MKTAG32('Y','U','Y','2'):
91 overlay
->pitches
[0] == f
->bytesperline
&&
92 overlay
->w
== f
->width
&& w
== f
->width
&&
93 overlay
->h
== f
->height
&& h
== f
->height
&&
97 /* special case for w=w, h=h, fmt=fmt, stride=stride, lines=01234... -- one large memcpy */
98 memcpy(overlay
->pixels
[0], f
->start
, h
*w
* /*pixsize_yuy2*/ 2);
101 for (i
=istart
; i
<h
; ++i
) {
102 memcpy(overlay
->pixels
[0] + (i
+bt
)*overlay
->pitches
[0],
103 f
->start
+ i
*f
->bytesperline
,
104 w
* /*pixsize_yuy2*/ 2);
112 case MKTAG32('U','Y','V','Y'):
114 /* TODO optimize me through mmx */
115 for (i
=istart
; i
<h
; ++i
) {
116 __u8
*dst
= overlay
->pixels
[0] + (i
+bt
)*overlay
->pitches
[0];
117 __u8
*src
= f
->start
+ i
*f
->bytesperline
;
119 for (j
=0; j
<w
/2; j
++) {
135 case MKTAG32('Y','8','0','0'):
136 case MKTAG32('Y','8',' ',' '):
137 case MKTAG32('G','R','E','Y'):
139 for (i
=istart
; i
<h
; ++i
) {
140 __u8
*dst
= overlay
->pixels
[0] + (i
+bt
)*overlay
->pitches
[0];
141 __u8
*src
= f
->start
+ i
*f
->bytesperline
;
143 for (j
=0; j
<w
; ++j
) {
145 dst
[1] = 0x80; /* 0-level for Cb/Cr */
157 die("view: W: unsupported pixfmt 0x%08x", f
->pixfmt_4cc
);
162 SDL_UnlockYUVOverlay(overlay
);
164 /* blit overlay to its associated surface */
178 double ratio_w
= (double)overlay
->w
/ (w
? w
: 1);
179 double ratio_h
= (double)overlay
->h
/ (h
? h
: 1);
181 /* keep aspect ratio */
182 double ratio
= min(ratio_w
, ratio_h
);
188 rdst
.x
= w
* (ratio_w
- ratio
) / 2;
189 rdst
.y
= h
* (ratio_h
- ratio
) / 2;
192 SDLU_DisplayYUVOverlay(overlay
, &rsrc
, &rdst
);
196 void View::__display_frame(const Frame
*f
, void *self
)
198 ((View
*)self
)->display_frame(f
);