23 #include <sys/ioctl.h>
38 struct fb_var_screeninfo varinfo;
39 struct fb_fix_screeninfo fixinfo;
64 "Could not open framebuffer device '%s': %s\n",
69 if (ioctl(fbdev->
fd, FBIOGET_VSCREENINFO, &fbdev->
varinfo) < 0) {
75 if (ioctl(fbdev->
fd, FBIOGET_FSCREENINFO, &fbdev->
fixinfo) < 0) {
88 fbdev->
data = mmap(
NULL, fbdev->
fixinfo.smem_len, PROT_WRITE, MAP_SHARED, fbdev->
fd, 0);
89 if (fbdev->
data == MAP_FAILED) {
110 int video_width = codec_ctx->
width;
111 int video_height = codec_ctx->
height;
113 int src_line_size = video_width * bytes_per_pixel;
116 if (ioctl(fbdev->
fd, FBIOGET_VSCREENINFO, &fbdev->
varinfo) < 0)
122 if (fb_pix_fmt != video_pix_fmt) {
129 bytes_to_copy =
FFMIN(fbdev->
varinfo.xres, video_width) * bytes_per_pixel;
133 bytes_per_pixel * fbdev->
varinfo.xoffset +
138 if (-fbdev->
xoffset >= video_width)
140 bytes_to_copy += fbdev->
xoffset * bytes_per_pixel;
141 pin -= fbdev->
xoffset * bytes_per_pixel;
145 if (diff >= video_width)
147 bytes_to_copy -= diff * bytes_per_pixel;
149 pout += bytes_per_pixel * fbdev->
xoffset;
155 if (-fbdev->
yoffset >= video_height)
158 pin -= fbdev->
yoffset * src_line_size;
162 if (diff >= video_height)
170 for (i = 0; i < disp_height; i++) {
171 memcpy(pout, pin, bytes_to_copy);
172 pout += fbdev->
fixinfo.line_length;
173 pin += src_line_size;
192 #define OFFSET(x) offsetof(FBDevContext, x)
193 #define ENC AV_OPT_FLAG_ENCODING_PARAM
195 {
"xoffset",
"set x coordinate of top left corner",
OFFSET(xoffset),
AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX,
ENC },
196 {
"yoffset",
"set y coordinate of top left corner",
OFFSET(yoffset),
AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX,
ENC },
219 .priv_class = &fbdev_class,