2 * Copyright (c) 2011 Stefano Sabatini
3 * Copyright (c) 2009 Giliard B. de Freitas <giliarde@gmail.com>
4 * Copyright (C) 2002 Gunnar Monell <gmo@linux.nu>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include <sys/ioctl.h>
27 #include "fbdev_common.h"
28 #include "libavutil/common.h"
31 struct rgb_pixfmt_map_entry
{
33 int red_offset
, green_offset
, blue_offset
, alpha_offset
;
34 enum AVPixelFormat pixfmt
;
37 static const struct rgb_pixfmt_map_entry rgb_pixfmt_map
[] = {
38 // bpp, red_offset, green_offset, blue_offset, alpha_offset, pixfmt
39 { 32, 0, 8, 16, 24, AV_PIX_FMT_RGBA
},
40 { 32, 16, 8, 0, 24, AV_PIX_FMT_BGRA
},
41 { 32, 8, 16, 24, 0, AV_PIX_FMT_ARGB
},
42 { 32, 3, 2, 8, 0, AV_PIX_FMT_ABGR
},
43 { 24, 0, 8, 16, 0, AV_PIX_FMT_RGB24
},
44 { 24, 16, 8, 0, 0, AV_PIX_FMT_BGR24
},
45 { 16, 11, 5, 0, 16, AV_PIX_FMT_RGB565
},
48 enum AVPixelFormat
ff_get_pixfmt_from_fb_varinfo(struct fb_var_screeninfo
*varinfo
)
52 for (i
= 0; i
< FF_ARRAY_ELEMS(rgb_pixfmt_map
); i
++) {
53 const struct rgb_pixfmt_map_entry
*entry
= &rgb_pixfmt_map
[i
];
54 if (entry
->bits_per_pixel
== varinfo
->bits_per_pixel
&&
55 entry
->red_offset
== varinfo
->red
.offset
&&
56 entry
->green_offset
== varinfo
->green
.offset
&&
57 entry
->blue_offset
== varinfo
->blue
.offset
)
61 return AV_PIX_FMT_NONE
;
64 const char* ff_fbdev_default_device()
66 const char *dev
= getenv("FRAMEBUFFER");
72 int ff_fbdev_get_device_list(AVDeviceInfoList
*device_list
)
74 struct fb_var_screeninfo varinfo
;
75 struct fb_fix_screeninfo fixinfo
;
77 AVDeviceInfo
*device
= NULL
;
79 const char *default_device
= ff_fbdev_default_device();
82 return AVERROR(EINVAL
);
84 for (i
= 0; i
<= 31; i
++) {
85 snprintf(device_file
, sizeof(device_file
), "/dev/fb%d", i
);
87 if ((fd
= avpriv_open(device_file
, O_RDWR
)) < 0) {
88 int err
= AVERROR(errno
);
89 if (err
!= AVERROR(ENOENT
))
90 av_log(NULL
, AV_LOG_ERROR
, "Could not open framebuffer device '%s': %s\n",
91 device_file
, av_err2str(err
));
94 if (ioctl(fd
, FBIOGET_VSCREENINFO
, &varinfo
) == -1)
96 if (ioctl(fd
, FBIOGET_FSCREENINFO
, &fixinfo
) == -1)
99 device
= av_mallocz(sizeof(AVDeviceInfo
));
101 ret
= AVERROR(ENOMEM
);
104 device
->device_name
= av_strdup(device_file
);
105 device
->device_description
= av_strdup(fixinfo
.id
);
106 if (!device
->device_name
|| !device
->device_description
) {
107 ret
= AVERROR(ENOMEM
);
111 if ((ret
= av_dynarray_add_nofree(&device_list
->devices
,
112 &device_list
->nb_devices
, device
)) < 0)
115 if (default_device
&& !strcmp(device
->device_name
, default_device
)) {
116 device_list
->default_device
= device_list
->nb_devices
- 1;
117 default_device
= NULL
;
124 av_freep(&device
->device_name
);
125 av_freep(&device
->device_description
);