📄 vo_fb.c
字号:
/********************************************** * Dawn Light Player * * vo_fb.c * * Created by kf701 * 19:58:43 03/09/08 CST * * $Id: vo_fb.c 168 2008-03-21 02:50:01Z kf701 $ **********************************************/#if ENABLE_VO_FB#include <fcntl.h>#include <sys/ioctl.h>#include <sys/mman.h>#include <asm/page.h>#include <linux/fb.h>#include "swscale.h"#include "avoutput.h"#include "avinput.h"#include "global.h"typedef struct{ char *dev; int fb; unsigned long offset; uint8_t *mem; struct fb_fix_screeninfo fixinfo; struct fb_var_screeninfo varinfo; int pixfmt; int dx, dy, dh, dw;} FBContext;static FBContext fbctx, *fbctxp = &fbctx;static AVPicture *my_pic;static int vo_fb_init(void){ if ( !(fbctxp->dev = getenv("FRAMEBUFFER")) ) fbctxp->dev = "/dev/fb0"; fbctxp->fb = open(fbctxp->dev, O_RDWR); if (fbctxp->fb < 0) { av_log(NULL, AV_LOG_ERROR, "Error opening %s: %m. Check kernel config\n", fbctxp->dev); return -1; } if (-1 == ioctl(fbctxp->fb,FBIOGET_VSCREENINFO,&(fbctxp->varinfo))) { av_log(NULL, AV_LOG_ERROR, "ioctl FBIOGET_VSCREENINFO\n"); return -1; } if (-1 == ioctl(fbctxp->fb,FBIOGET_FSCREENINFO,&(fbctxp->fixinfo))) { av_log(NULL, AV_LOG_ERROR, "ioctl FBIOGET_FSCREENINFO\n"); return -1; } /* map physics address to virtual address */ fbctxp->offset = (unsigned long)(fbctxp->fixinfo.smem_start) & (~PAGE_MASK); fbctxp->mem = (uint8_t*)mmap(NULL, fbctxp->fixinfo.smem_len + fbctxp->offset, PROT_READ | PROT_WRITE, MAP_SHARED, fbctxp->fb, 0); if (-1L == (long) fbctxp->mem) { av_log(NULL, AV_LOG_ERROR, "mmap error\n"); return -1; } if ( dlpctxp->fs ) { int t1, t2, drate; t1 = fbctxp->varinfo.xres / dlpctxp->pwidth; t2 = fbctxp->varinfo.yres / dlpctxp->pheight; drate = t1 > t2 ? t2 : t1 ; fbctxp->dw = dlpctxp->pwidth * drate; fbctxp->dh = dlpctxp->pheight * drate; } else { fbctxp->dw = dlpctxp->pwidth; fbctxp->dh = dlpctxp->pheight; } /* show at screen center */ fbctxp->dx = (fbctxp->varinfo.xres - fbctxp->dw ) / 2; fbctxp->dy = (fbctxp->varinfo.yres - fbctxp->dh ) / 2; fbctxp->mem += ( fbctxp->fixinfo.line_length * fbctxp->dy ) + ( (fbctxp->varinfo.bits_per_pixel / 8) * fbctxp->dx ); switch (fbctxp->varinfo.bits_per_pixel) { case 32: fbctxp->pixfmt = PIX_FMT_RGB32; break; case 24: fbctxp->pixfmt = PIX_FMT_RGB24; break; case 16: fbctxp->pixfmt = PIX_FMT_RGB565; break; case 15: fbctxp->pixfmt = PIX_FMT_RGB555; break; case 8: fbctxp->pixfmt = PIX_FMT_RGB8; break; } /*----------------------------------------------------------------------------- * my picture for rgb *-----------------------------------------------------------------------------*/ my_pic = av_mallocz(sizeof(AVPicture)); if ( -1 == avpicture_alloc(my_pic, fbctxp->pixfmt, fbctxp->dw, fbctxp->dh) ) { av_log(NULL, AV_LOG_ERROR, "avpicture alloc error\n"); return -1; } return 0;}static int vo_fb_uninit(void){ close(fbctxp->fb); fbctxp->fb=-1; avpicture_free(my_pic); av_free(my_pic); my_pic = NULL; return 0;}static int vo_fb_vfmt2rgb(AVPicture *dst, AVPicture *src){ static struct SwsContext *img_convert_ctx; img_convert_ctx = sws_getCachedContext(img_convert_ctx, dlpctxp->pwidth, dlpctxp->pheight, dlpctxp->pixfmt, fbctxp->dw, fbctxp->dh, fbctxp->pixfmt, SWS_BICUBIC, NULL, NULL, NULL); sws_scale(img_convert_ctx, src->data, src->linesize, 0, fbctxp->dh, dst->data, dst->linesize); return 0;}static void vo_fb_display(AVPicture *pic){ int i; uint8_t *src, *dst = fbctxp->mem; vo_fb_vfmt2rgb( my_pic, pic ); src = my_pic->data[0]; for ( i = 0; i < fbctxp->dh; i++ ) { memcpy( dst, src, fbctxp->dw * (fbctxp->varinfo.bits_per_pixel / 8) ); dst += fbctxp->fixinfo.line_length; src += my_pic->linesize[0]; }}vo_t vo_fb ={ .id = VO_ID_FB, .name = "fb", .vo_init = vo_fb_init, .vo_uninit = vo_fb_uninit, .vo_display = vo_fb_display, .vo_event_loop = NULL,};#endif /* ENABLE_VO_FB */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -