1 /*
2 * Copyright (c) 2016 Josh de Kock
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /**
22 * @file
23 * libSDL2 output device
24 */
25
26 #include <SDL.h>
27 #include <SDL_thread.h>
28
37
44 int window_x,
window_y;
/**< position of the window */
48
52
56
60 /*
61 * Not implemented in FFmpeg, but leaving here for completeness.
62 * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ARGB4444 },
63 * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_RGBA4444 },
64 * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ABGR4444 },
65 * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_BGRA4444 },
66 * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ARGB1555 },
67 * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_RGBA5551 },
68 * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ABGR1555 },
69 * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_BGRA5551 },
70 * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ARGB2101010 },
71 */
82 #if HAVE_BIGENDIAN
85 #else
88 #endif
97 };
98
100 {
101 AVRational sar, dar;
/* sample and display aspect ratios */
106
107 /* compute texture width and height from the codec context information */
110
111 /* we suppose the screen has a 1/1 sample aspect ratio */
113 /* fit in the window */
115 /* fit in width */
118 } else {
119 /* fit in height */
122 }
123 } else {
125 texture_rect->w = codecpar->
width;
127 } else {
128 texture_rect->h = codecpar->
height;
130 }
133 }
134
135 texture_rect->x = (sdl->
window_width - texture_rect->w) / 2;
136 texture_rect->y = (sdl->
window_height - texture_rect->h) / 2;
137 }
138
140 {
142
144 SDL_DestroyTexture(sdl->
texture);
146
150
152 SDL_DestroyWindow(sdl->
window);
154
156 SDL_Quit();
157
158 return 0;
159 }
160
162 {
168
171 "The sdl output device is deprecated due to being fundamentally incompatible with libavformat API. "
172 "For monitoring purposes in ffmpeg you can output to a file or use pipes and a video player.\n"
173 "Example: ffmpeg -i INPUT -f nut -c:v rawvideo - | ffplay -\n"
174 );
176 }
177
180
181 if (SDL_WasInit(SDL_INIT_VIDEO)) {
183 "SDL video subsystem was already inited, you could have multiple SDL outputs. This may cause unknown behaviour.\n");
185 }
186
187 if (
s->nb_streams > 1
192 }
193
197 break;
198 }
199 }
200
203 "Unsupported pixel format '%s'.\n",
206 }
207
208 /* resize texture to width and height from the codec context information */
209 flags = SDL_WINDOW_HIDDEN |
212
213 /* initialization */
215 if (SDL_Init(SDL_INIT_VIDEO) != 0) {
218 }
219 }
220
222
225 av_log(sdl,
AV_LOG_ERROR,
"Couldn't create window and renderer: %s\n", SDL_GetError());
227 }
228
231 SDL_ShowWindow(sdl->
window);
232
235
239 }
240
244
246
247 return 0;
251 }
252
254 {
259 int linesize[4];
260
261 SDL_Event event;
262 if (SDL_PollEvent(&event)){
263 switch (event.type) {
264 case SDL_KEYDOWN:
265 switch (event.key.keysym.sym) {
266 case SDLK_ESCAPE:
267 case SDLK_q:
268 quit = 1;
269 break;
270 default:
271 break;
272 }
273 break;
274 case SDL_QUIT:
275 quit = 1;
276 break;
277 case SDL_WINDOWEVENT:
278 switch(event.window.event){
279 case SDL_WINDOWEVENT_RESIZED:
280 case SDL_WINDOWEVENT_SIZE_CHANGED:
284 break;
285 default:
286 break;
287 }
288 break;
289 default:
290 break;
291 }
292 }
293
297 }
298
301 /* case SDL_PIXELFORMAT_ARGB4444:
302 * case SDL_PIXELFORMAT_RGBA4444:
303 * case SDL_PIXELFORMAT_ABGR4444:
304 * case SDL_PIXELFORMAT_BGRA4444:
305 * case SDL_PIXELFORMAT_ARGB1555:
306 * case SDL_PIXELFORMAT_RGBA5551:
307 * case SDL_PIXELFORMAT_ABGR1555:
308 * case SDL_PIXELFORMAT_BGRA5551:
309 * case SDL_PIXELFORMAT_ARGB2101010:
310 */
311 case SDL_PIXELFORMAT_IYUV:
312 case SDL_PIXELFORMAT_YUY2:
313 case SDL_PIXELFORMAT_UYVY:
315 data[0], linesize[0],
316 data[1], linesize[1],
317 data[2], linesize[2]);
318 break;
319 case SDL_PIXELFORMAT_RGB332:
320 case SDL_PIXELFORMAT_RGB444:
321 case SDL_PIXELFORMAT_RGB555:
322 case SDL_PIXELFORMAT_BGR555:
323 case SDL_PIXELFORMAT_RGB565:
324 case SDL_PIXELFORMAT_BGR565:
325 case SDL_PIXELFORMAT_RGB24:
326 case SDL_PIXELFORMAT_BGR24:
327 case SDL_PIXELFORMAT_RGB888:
328 case SDL_PIXELFORMAT_RGBX8888:
329 case SDL_PIXELFORMAT_BGR888:
330 case SDL_PIXELFORMAT_BGRX8888:
331 case SDL_PIXELFORMAT_ARGB8888:
332 case SDL_PIXELFORMAT_RGBA8888:
333 case SDL_PIXELFORMAT_ABGR8888:
334 case SDL_PIXELFORMAT_BGRA8888:
336 break;
337 default:
340 break;
341 }
346 }
347
348 #define OFFSET(x) offsetof(SDLContext,x)
349
359 };
360
367 };
368
370 .
p.
name =
"sdl,sdl2",
380 };