FFmpeg
sdl2.c
Go to the documentation of this file.
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 
29 #include "libavutil/avstring.h"
30 #include "libavutil/imgutils.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/parseutils.h"
33 #include "libavutil/pixdesc.h"
34 #include "libavutil/time.h"
35 #include "avdevice.h"
36 #include "libavformat/mux.h"
37 
38 typedef struct {
39  AVClass *class;
40  SDL_Window *window;
41  SDL_Renderer *renderer;
42  char *window_title;
43  int window_width, window_height; /**< size of the window */
44  int window_x, window_y; /**< position of the window */
48 
49  SDL_Texture *texture;
51  SDL_Rect texture_rect;
52 
53  int inited;
54 } SDLContext;
55 
56 static const struct sdl_texture_format_entry {
59  /*
60  * Not implemented in FFmpeg, but leaving here for completeness.
61  * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ARGB4444 },
62  * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_RGBA4444 },
63  * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ABGR4444 },
64  * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_BGRA4444 },
65  * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ARGB1555 },
66  * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_RGBA5551 },
67  * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ABGR1555 },
68  * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_BGRA5551 },
69  * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ARGB2101010 },
70  */
71  { AV_PIX_FMT_RGB8, SDL_PIXELFORMAT_RGB332 },
72  { AV_PIX_FMT_RGB444, SDL_PIXELFORMAT_RGB444 },
73  { AV_PIX_FMT_RGB555, SDL_PIXELFORMAT_RGB555 },
74  { AV_PIX_FMT_BGR555, SDL_PIXELFORMAT_BGR555 },
75  { AV_PIX_FMT_RGB565, SDL_PIXELFORMAT_RGB565 },
76  { AV_PIX_FMT_BGR565, SDL_PIXELFORMAT_BGR565 },
77  { AV_PIX_FMT_RGB24, SDL_PIXELFORMAT_RGB24 },
78  { AV_PIX_FMT_BGR24, SDL_PIXELFORMAT_BGR24 },
79  { AV_PIX_FMT_0RGB32, SDL_PIXELFORMAT_RGB888 },
80  { AV_PIX_FMT_0BGR32, SDL_PIXELFORMAT_BGR888 },
81 #if HAVE_BIGENDIAN
82  { AV_PIX_FMT_RGB0, SDL_PIXELFORMAT_RGBX8888 },
83  { AV_PIX_FMT_BGR0, SDL_PIXELFORMAT_BGRX8888 },
84 #else
85  { AV_PIX_FMT_0BGR, SDL_PIXELFORMAT_RGBX8888 },
86  { AV_PIX_FMT_0RGB, SDL_PIXELFORMAT_BGRX8888 },
87 #endif
88  { AV_PIX_FMT_RGB32, SDL_PIXELFORMAT_ARGB8888 },
89  { AV_PIX_FMT_RGB32_1, SDL_PIXELFORMAT_RGBA8888 },
90  { AV_PIX_FMT_BGR32, SDL_PIXELFORMAT_ABGR8888 },
91  { AV_PIX_FMT_BGR32_1, SDL_PIXELFORMAT_BGRA8888 },
92  { AV_PIX_FMT_YUV420P, SDL_PIXELFORMAT_IYUV },
93  { AV_PIX_FMT_YUYV422, SDL_PIXELFORMAT_YUY2 },
94  { AV_PIX_FMT_UYVY422, SDL_PIXELFORMAT_UYVY },
95  { AV_PIX_FMT_NONE, 0 },
96 };
97 
99 {
100  AVRational sar, dar; /* sample and display aspect ratios */
101  SDLContext *sdl = s->priv_data;
102  AVStream *st = s->streams[0];
103  AVCodecParameters *codecpar = st->codecpar;
104  SDL_Rect *texture_rect = &sdl->texture_rect;
105 
106  /* compute texture width and height from the codec context information */
107  sar = st->sample_aspect_ratio.num ? st->sample_aspect_ratio : (AVRational){ 1, 1 };
108  dar = av_mul_q(sar, (AVRational){ codecpar->width, codecpar->height });
109 
110  /* we suppose the screen has a 1/1 sample aspect ratio */
111  if (sdl->window_width && sdl->window_height) {
112  /* fit in the window */
113  if (av_cmp_q(dar, (AVRational){ sdl->window_width, sdl->window_height }) > 0) {
114  /* fit in width */
115  texture_rect->w = sdl->window_width;
116  texture_rect->h = av_rescale(texture_rect->w, dar.den, dar.num);
117  } else {
118  /* fit in height */
119  texture_rect->h = sdl->window_height;
120  texture_rect->w = av_rescale(texture_rect->h, dar.num, dar.den);
121  }
122  } else {
123  if (sar.num > sar.den) {
124  texture_rect->w = codecpar->width;
125  texture_rect->h = av_rescale(texture_rect->w, dar.den, dar.num);
126  } else {
127  texture_rect->h = codecpar->height;
128  texture_rect->w = av_rescale(texture_rect->h, dar.num, dar.den);
129  }
130  sdl->window_width = texture_rect->w;
131  sdl->window_height = texture_rect->h;
132  }
133 
134  texture_rect->x = (sdl->window_width - texture_rect->w) / 2;
135  texture_rect->y = (sdl->window_height - texture_rect->h) / 2;
136 }
137 
139 {
140  SDLContext *sdl = s->priv_data;
141 
142  if (sdl->texture)
143  SDL_DestroyTexture(sdl->texture);
144  sdl->texture = NULL;
145 
146  if (sdl->renderer)
147  SDL_DestroyRenderer(sdl->renderer);
148  sdl->renderer = NULL;
149 
150  if (sdl->window)
151  SDL_DestroyWindow(sdl->window);
152  sdl->window = NULL;
153 
154  if (!sdl->inited)
155  SDL_Quit();
156 
157  return 0;
158 }
159 
161 {
162  SDLContext *sdl = s->priv_data;
163  AVStream *st = s->streams[0];
164  AVCodecParameters *codecpar = st->codecpar;
165  int i, ret = 0;
166  int flags = 0;
167 
168  if (!sdl->window_title)
169  sdl->window_title = av_strdup(s->url);
170 
171  if (SDL_WasInit(SDL_INIT_VIDEO)) {
173  "SDL video subsystem was already inited, you could have multiple SDL outputs. This may cause unknown behaviour.\n");
174  sdl->inited = 1;
175  }
176 
177  if ( s->nb_streams > 1
178  || codecpar->codec_type != AVMEDIA_TYPE_VIDEO
179  || codecpar->codec_id != AV_CODEC_ID_RAWVIDEO) {
180  av_log(s, AV_LOG_ERROR, "Only supports one rawvideo stream\n");
181  goto fail;
182  }
183 
184  for (i = 0; sdl_texture_format_map[i].format != AV_PIX_FMT_NONE; i++) {
185  if (sdl_texture_format_map[i].format == codecpar->format) {
187  break;
188  }
189  }
190 
191  if (!sdl->texture_fmt) {
193  "Unsupported pixel format '%s'.\n",
194  av_get_pix_fmt_name(codecpar->format));
195  goto fail;
196  }
197 
198  /* resize texture to width and height from the codec context information */
199  flags = SDL_WINDOW_HIDDEN |
200  (sdl->window_fullscreen ? SDL_WINDOW_FULLSCREEN : 0) |
201  (sdl->window_borderless ? SDL_WINDOW_BORDERLESS : SDL_WINDOW_RESIZABLE);
202 
203  /* initialization */
204  if (!sdl->inited){
205  if (SDL_Init(SDL_INIT_VIDEO) != 0) {
206  av_log(s, AV_LOG_ERROR, "Unable to initialize SDL: %s\n", SDL_GetError());
207  goto fail;
208  }
209  }
210 
212 
213  if (SDL_CreateWindowAndRenderer(sdl->window_width, sdl->window_height,
214  flags, &sdl->window, &sdl->renderer) != 0){
215  av_log(sdl, AV_LOG_ERROR, "Couldn't create window and renderer: %s\n", SDL_GetError());
216  goto fail;
217  }
218 
219  SDL_SetWindowTitle(sdl->window, sdl->window_title);
220  SDL_SetWindowPosition(sdl->window, sdl->window_x, sdl->window_y);
221  SDL_ShowWindow(sdl->window);
222 
223  sdl->texture = SDL_CreateTexture(sdl->renderer, sdl->texture_fmt, SDL_TEXTUREACCESS_STREAMING,
224  codecpar->width, codecpar->height);
225 
226  if (!sdl->texture) {
227  av_log(sdl, AV_LOG_ERROR, "Unable to set create mode: %s\n", SDL_GetError());
228  goto fail;
229  }
230 
231  av_log(s, AV_LOG_VERBOSE, "w:%d h:%d fmt:%s -> w:%d h:%d\n",
232  codecpar->width, codecpar->height, av_get_pix_fmt_name(codecpar->format),
233  sdl->window_width, sdl->window_height);
234 
235  sdl->inited = 1;
236 
237  return 0;
238 fail:
240  return ret;
241 }
242 
244 {
245  int ret, quit = 0;
246  SDLContext *sdl = s->priv_data;
247  AVCodecParameters *codecpar = s->streams[0]->codecpar;
248  uint8_t *data[4];
249  int linesize[4];
250 
251  SDL_Event event;
252  if (SDL_PollEvent(&event)){
253  switch (event.type) {
254  case SDL_KEYDOWN:
255  switch (event.key.keysym.sym) {
256  case SDLK_ESCAPE:
257  case SDLK_q:
258  quit = 1;
259  break;
260  default:
261  break;
262  }
263  break;
264  case SDL_QUIT:
265  quit = 1;
266  break;
267  case SDL_WINDOWEVENT:
268  switch(event.window.event){
269  case SDL_WINDOWEVENT_RESIZED:
270  case SDL_WINDOWEVENT_SIZE_CHANGED:
271  sdl->window_width = event.window.data1;
272  sdl->window_height = event.window.data2;
274  break;
275  default:
276  break;
277  }
278  break;
279  default:
280  break;
281  }
282  }
283 
284  if (quit && sdl->enable_quit_action) {
286  return AVERROR(EIO);
287  }
288 
289  av_image_fill_arrays(data, linesize, pkt->data, codecpar->format, codecpar->width, codecpar->height, 1);
290  switch (sdl->texture_fmt) {
291  /* case SDL_PIXELFORMAT_ARGB4444:
292  * case SDL_PIXELFORMAT_RGBA4444:
293  * case SDL_PIXELFORMAT_ABGR4444:
294  * case SDL_PIXELFORMAT_BGRA4444:
295  * case SDL_PIXELFORMAT_ARGB1555:
296  * case SDL_PIXELFORMAT_RGBA5551:
297  * case SDL_PIXELFORMAT_ABGR1555:
298  * case SDL_PIXELFORMAT_BGRA5551:
299  * case SDL_PIXELFORMAT_ARGB2101010:
300  */
301  case SDL_PIXELFORMAT_IYUV:
302  case SDL_PIXELFORMAT_YUY2:
303  case SDL_PIXELFORMAT_UYVY:
304  ret = SDL_UpdateYUVTexture(sdl->texture, NULL,
305  data[0], linesize[0],
306  data[1], linesize[1],
307  data[2], linesize[2]);
308  break;
309  case SDL_PIXELFORMAT_RGB332:
310  case SDL_PIXELFORMAT_RGB444:
311  case SDL_PIXELFORMAT_RGB555:
312  case SDL_PIXELFORMAT_BGR555:
313  case SDL_PIXELFORMAT_RGB565:
314  case SDL_PIXELFORMAT_BGR565:
315  case SDL_PIXELFORMAT_RGB24:
316  case SDL_PIXELFORMAT_BGR24:
317  case SDL_PIXELFORMAT_RGB888:
318  case SDL_PIXELFORMAT_RGBX8888:
319  case SDL_PIXELFORMAT_BGR888:
320  case SDL_PIXELFORMAT_BGRX8888:
321  case SDL_PIXELFORMAT_ARGB8888:
322  case SDL_PIXELFORMAT_RGBA8888:
323  case SDL_PIXELFORMAT_ABGR8888:
324  case SDL_PIXELFORMAT_BGRA8888:
325  ret = SDL_UpdateTexture(sdl->texture, NULL, data[0], linesize[0]);
326  break;
327  default:
328  av_log(NULL, AV_LOG_FATAL, "Unsupported pixel format\n");
329  ret = -1;
330  break;
331  }
332  SDL_RenderClear(sdl->renderer);
333  SDL_RenderCopy(sdl->renderer, sdl->texture, NULL, &sdl->texture_rect);
334  SDL_RenderPresent(sdl->renderer);
335  return ret;
336 }
337 
338 #define OFFSET(x) offsetof(SDLContext,x)
339 
340 static const AVOption options[] = {
341  { "window_title", "set SDL window title", OFFSET(window_title), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
342  { "window_size", "set SDL window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
343  { "window_x", "set SDL window x position", OFFSET(window_x), AV_OPT_TYPE_INT, { .i64 = SDL_WINDOWPOS_CENTERED }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
344  { "window_y", "set SDL window y position", OFFSET(window_y), AV_OPT_TYPE_INT, { .i64 = SDL_WINDOWPOS_CENTERED }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
345  { "window_fullscreen", "set SDL window fullscreen", OFFSET(window_fullscreen), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
346  { "window_borderless", "set SDL window border off", OFFSET(window_borderless), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
347  { "window_enable_quit", "set if quit action is available", OFFSET(enable_quit_action), AV_OPT_TYPE_INT, {.i64=1}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
348  { NULL },
349 };
350 
351 static const AVClass sdl2_class = {
352  .class_name = "sdl2 outdev",
353  .item_name = av_default_item_name,
354  .option = options,
355  .version = LIBAVUTIL_VERSION_INT,
357 };
358 
360  .p.name = "sdl,sdl2",
361  .p.long_name = NULL_IF_CONFIG_SMALL("SDL2 output device"),
362  .priv_data_size = sizeof(SDLContext),
363  .p.audio_codec = AV_CODEC_ID_NONE,
364  .p.video_codec = AV_CODEC_ID_RAWVIDEO,
365  .write_header = sdl2_write_header,
366  .write_packet = sdl2_write_packet,
367  .write_trailer = sdl2_write_trailer,
369  .p.priv_class = &sdl2_class,
370 };
sdl_texture_format_entry::texture_fmt
int texture_fmt
Definition: sdl2.c:57
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
SDLContext
Definition: sdl2.c:38
AVOutputFormat::name
const char * name
Definition: avformat.h:511
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
SDLContext::window_height
int window_height
size of the window
Definition: sdl2.c:43
AV_PIX_FMT_BGR32
#define AV_PIX_FMT_BGR32
Definition: pixfmt.h:443
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
AVFMT_VARIABLE_FPS
#define AVFMT_VARIABLE_FPS
Format allows variable fps.
Definition: avformat.h:483
sdl_texture_format_map
static const struct sdl_texture_format_entry sdl_texture_format_map[]
AVFMT_NOTIMESTAMPS
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition: avformat.h:480
AV_CODEC_ID_RAWVIDEO
@ AV_CODEC_ID_RAWVIDEO
Definition: codec_id.h:65
SDLContext::texture_rect
SDL_Rect texture_rect
Definition: sdl2.c:51
pixdesc.h
SDLContext::window_x
int window_x
Definition: sdl2.c:44
AVPacket::data
uint8_t * data
Definition: packet.h:491
AVOption
AVOption.
Definition: opt.h:251
SDLContext::window_y
int window_y
position of the window
Definition: sdl2.c:44
data
const char data[16]
Definition: mxf.c:148
AV_PIX_FMT_RGB32_1
#define AV_PIX_FMT_RGB32_1
Definition: pixfmt.h:442
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:69
sdl2_class
static const AVClass sdl2_class
Definition: sdl2.c:351
FFOutputFormat::p
AVOutputFormat p
The public AVOutputFormat.
Definition: mux.h:36
SDLContext::window_fullscreen
int window_fullscreen
Definition: sdl2.c:45
sdl_texture_format_entry
Definition: sdl2.c:56
SDLContext::window
SDL_Window * window
Definition: sdl2.c:40
fail
#define fail()
Definition: checkasm.h:138
AVRational::num
int num
Numerator.
Definition: rational.h:59
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_OPT_FLAG_ENCODING_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
Definition: opt.h:281
format
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
AV_PIX_FMT_0BGR32
#define AV_PIX_FMT_0BGR32
Definition: pixfmt.h:446
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:121
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
AV_PIX_FMT_BGR32_1
#define AV_PIX_FMT_BGR32_1
Definition: pixfmt.h:444
window_title
static const char * window_title
Definition: ffplay.c:309
AVFormatContext
Format I/O context.
Definition: avformat.h:1115
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:864
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
AV_PIX_FMT_YUYV422
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
Definition: pixfmt.h:67
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AV_OPT_TYPE_IMAGE_SIZE
@ AV_OPT_TYPE_IMAGE_SIZE
offset must point to two consecutive integers
Definition: opt.h:235
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
parseutils.h
AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT
@ AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT
Definition: log.h:40
SDLContext::window_borderless
int window_borderless
Definition: sdl2.c:46
FFOutputFormat
Definition: mux.h:32
AV_PIX_FMT_RGB8
@ AV_PIX_FMT_RGB8
packed RGB 3:3:2, 8bpp, (msb)2R 3G 3B(lsb)
Definition: pixfmt.h:86
AV_PIX_FMT_BGR0
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
Definition: pixfmt.h:258
time.h
SDLContext::enable_quit_action
int enable_quit_action
Definition: sdl2.c:47
ff_sdl2_muxer
const FFOutputFormat ff_sdl2_muxer
Definition: sdl2.c:359
SDLContext::window_title
char * window_title
Definition: sdl2.c:42
SDLContext::texture
SDL_Texture * texture
Definition: sdl2.c:49
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:68
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:106
av_image_fill_arrays
int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4], const uint8_t *src, enum AVPixelFormat pix_fmt, int width, int height, int align)
Setup the data pointers and linesizes based on the specified image parameters and the provided array.
Definition: imgutils.c:446
AV_PIX_FMT_BGR555
#define AV_PIX_FMT_BGR555
Definition: pixfmt.h:461
AVFMT_NOFILE
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:469
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:919
avdevice.h
compute_texture_rect
static void compute_texture_rect(AVFormatContext *s)
Definition: sdl2.c:98
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:441
AV_PIX_FMT_RGB0
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
Definition: pixfmt.h:256
SDLContext::window_width
int window_width
Definition: sdl2.c:43
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
AVCodecParameters::height
int height
Definition: codec_par.h:122
options
static const AVOption options[]
Definition: sdl2.c:340
AV_PIX_FMT_RGB555
#define AV_PIX_FMT_RGB555
Definition: pixfmt.h:456
AV_PIX_FMT_BGR565
#define AV_PIX_FMT_BGR565
Definition: pixfmt.h:460
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
sdl_texture_format_entry::format
enum AVPixelFormat format
Definition: sdl2.c:57
OFFSET
#define OFFSET(x)
Definition: sdl2.c:338
AV_PIX_FMT_RGB565
#define AV_PIX_FMT_RGB565
Definition: pixfmt.h:455
av_cmp_q
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
Definition: rational.h:89
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:841
AV_LOG_FATAL
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:174
SDLContext::inited
int inited
Definition: sdl2.c:53
AV_PIX_FMT_0BGR
@ AV_PIX_FMT_0BGR
packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
Definition: pixfmt.h:257
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
AV_PIX_FMT_0RGB32
#define AV_PIX_FMT_0RGB32
Definition: pixfmt.h:445
SDLContext::renderer
SDL_Renderer * renderer
Definition: sdl2.c:41
AV_PIX_FMT_UYVY422
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
Definition: pixfmt.h:81
AVRational::den
int den
Denominator.
Definition: rational.h:60
sdl2_write_header
static int sdl2_write_header(AVFormatContext *s)
Definition: sdl2.c:160
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:270
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AVCodecParameters::format
int format
Definition: codec_par.h:79
sdl2_write_trailer
static int sdl2_write_trailer(AVFormatContext *s)
Definition: sdl2.c:138
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:468
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:244
imgutils.h
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:474
AV_PIX_FMT_0RGB
@ AV_PIX_FMT_0RGB
packed RGB 8:8:8, 32bpp, XRGBXRGB... X=unused/undefined
Definition: pixfmt.h:255
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
SDLContext::texture_fmt
int texture_fmt
Definition: sdl2.c:50
sdl2_write_packet
static int sdl2_write_packet(AVFormatContext *s, AVPacket *pkt)
Definition: sdl2.c:243
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:229
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:2884
mux.h
AV_PIX_FMT_RGB444
#define AV_PIX_FMT_RGB444
Definition: pixfmt.h:457