vo_caca.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 335 行

C
335
字号
/* * MPlayer *  * Video driver for libcaca *  * by Pigeon <pigeon@pigeond.net> * * Some functions/codes/ideas are from x11 and aalib vo * * TODO: support those draw_alpha stuff? *  */#include <mplaylib.h>#include <mplaylib.h>#include <sys/stat.h>#include <mplaylib.h>#include <mplaylib.h>#include <time.h>#include <errno.h>#include "config.h"#include "video_out.h"#include "video_out_internal.h"#include "sub.h"#include "osdep/keycodes.h"#include "mp_msg.h"#include "mp_fifo.h"#include <caca.h>#ifdef CACA_API_VERSION_1  /* Include the pre-1.x compatibility header.   * Once libcaca 1.x is widespread, vo_caca should be fully   * converted to the new API. A patch exists:   * http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2006-July/044674.html   */  #include <caca0.h>#endifstatic vo_info_t info = {  "libcaca",  "caca",  "Pigeon <pigeon@pigeond.net>",  ""};LIBVO_EXTERN (caca)/* caca stuff */static struct caca_bitmap *cbitmap = NULL;/* image infos */static int image_format;static int image_width;static int image_height;static int screen_w, screen_h;/* We want 24bpp always for now */static unsigned int bpp = 24;static unsigned int depth = 3;static unsigned int rmask = 0xff0000;static unsigned int gmask = 0x00ff00;static unsigned int bmask = 0x0000ff;static unsigned int amask = 0;#define MESSAGE_SIZE 512#define MESSAGE_DURATION 5static time_t stoposd = 0;static int showosdmessage = 0;static char osdmessagetext[MESSAGE_SIZE];static char posbar[MESSAGE_SIZE];static int osdx = 0, osdy = 0;static int posbary = 2;static void osdmessage(int duration, const char *fmt, ...){    /*     * for outputting a centered string at the bottom     * of our window for a while     */    va_list ar;    char m[MESSAGE_SIZE];    va_start(ar, fmt);    vsprintf(m, fmt, ar);    va_end(ar);    strcpy(osdmessagetext, m);    showosdmessage = 1;    stoposd = time(NULL) + duration;    osdx = (screen_w - strlen (osdmessagetext)) / 2;    posbar[0] = '\0';}static void osdpercent(int duration, int min, int max, int val, const char *desc, const char *unit){    /*     * prints a bar for setting values     */    float step;    int where, i;    step = (float)screen_w / (float)(max - min);    where = (val - min) * step;    osdmessage (duration, "%s: %i%s", desc, val, unit);    posbar[0] = '|';    posbar[screen_w - 1] = '|';    for (i = 0; i < screen_w; i++)    {	if (i == where)	    posbar[i] = '#';	else	    posbar[i] = '-';    }        if (where != 0)	posbar[0] = '|';    if (where != (screen_w - 1))	posbar[screen_w - 1] = '|';    posbar[screen_w] = '\0';}static int resize (){    screen_w = caca_get_width();    screen_h = caca_get_height();    if (cbitmap)	caca_free_bitmap(cbitmap);    cbitmap = caca_create_bitmap(bpp, image_width, image_height,				depth * image_width, rmask, gmask, bmask,				amask);    if (!cbitmap)	mp_msg(MSGT_VO, MSGL_FATAL, "vo_caca: caca_create_bitmap failed!\n");    return 0;}static int config(uint32_t width, uint32_t height, uint32_t d_width,	uint32_t d_height, uint32_t flags, char *title, uint32_t format){    image_height = height;    image_width = width;    image_format = format;        showosdmessage = 0;    posbar[0] = '\0';    return resize ();}static int draw_frame(uint8_t *src[]){    caca_draw_bitmap(0, 0, screen_w, screen_h, cbitmap, src[0]);    return 0;}static int draw_slice(uint8_t *src[], int stride[], int w, int h, int x, int y){    return 0;}static void flip_page(void){    if (showosdmessage)    {	if (time(NULL) >= stoposd)	{	    showosdmessage = 0;	    if (*posbar)		posbar[0] = '\0';	} else {	    caca_putstr(osdx, osdy, osdmessagetext);	    	    if (*posbar)		caca_putstr(0, posbary, posbar);	}    }    caca_refresh();}static void check_events (void){    unsigned int cev;    if ((cev = caca_get_event(CACA_EVENT_ANY)))    {	if (cev & CACA_EVENT_RESIZE)	{	    caca_refresh();	    resize();	} else if (cev & CACA_EVENT_KEY_RELEASE)	{	    int key = (cev & 0x00ffffff);	    enum caca_feature cf;	    switch (key) {	    case 'd':	    case 'D':	      /* Toggle dithering method */	      cf = 1 + caca_get_feature(CACA_DITHERING);	      if (cf > CACA_DITHERING_MAX)		  cf = CACA_DITHERING_MIN;	      caca_set_feature(cf);	      osdmessage(MESSAGE_DURATION, "Using %s", caca_get_feature_name(cf));	      break;	    case 'a':	    case 'A':	      /* Toggle antialiasing method */	      cf = 1 + caca_get_feature(CACA_ANTIALIASING);	      if (cf > CACA_ANTIALIASING_MAX)		  cf = CACA_ANTIALIASING_MIN;	      caca_set_feature(cf);	      osdmessage(MESSAGE_DURATION, "Using %s", caca_get_feature_name(cf));	      break;	    case 'b':	    case 'B':	      /* Toggle background method */	      cf = 1 + caca_get_feature(CACA_BACKGROUND);	      if (cf > CACA_BACKGROUND_MAX)		  cf = CACA_BACKGROUND_MIN;	      caca_set_feature(cf);	      osdmessage(MESSAGE_DURATION, "Using %s", caca_get_feature_name(cf));	      break;	    case CACA_KEY_UP:	      mplayer_put_key(KEY_UP);	      break;	    case CACA_KEY_DOWN:	      mplayer_put_key(KEY_DOWN);	      break;	    case CACA_KEY_LEFT:	      mplayer_put_key(KEY_LEFT);	      break;	    case CACA_KEY_RIGHT:	      mplayer_put_key(KEY_RIGHT);	      break;	    case CACA_KEY_ESCAPE:	      mplayer_put_key(KEY_ESC);	      break;	    case CACA_KEY_PAGEUP:	      mplayer_put_key(KEY_PAGE_UP);	      break;	    case CACA_KEY_PAGEDOWN:	      mplayer_put_key(KEY_PAGE_DOWN);	      break;	    case CACA_KEY_RETURN:	      mplayer_put_key(KEY_ENTER);	      break;	    case CACA_KEY_HOME:	      mplayer_put_key(KEY_HOME);	      break;	    case CACA_KEY_END:	      mplayer_put_key(KEY_END);	      break;	    default:	      if (key <= 255)		  mplayer_put_key (key);	      break;	    }	}    }}static void uninit(void){    caca_free_bitmap(cbitmap);    cbitmap = NULL;    caca_end();}static void draw_osd(void){    if (vo_osd_progbar_type != -1)	osdpercent(MESSAGE_DURATION, 0, 255,		  vo_osd_progbar_value, sub_osd_names[vo_osd_progbar_type],		  "");}static int preinit(const char *arg){    if (arg)    {	mp_msg(MSGT_VO, MSGL_ERR, "vo_caca: Unknown subdevice: %s\n", arg);	return ENOSYS;    }    if (caca_init())    {	mp_msg(MSGT_VO, MSGL_ERR, "vo_caca: failed to initialize\n");	return ENOSYS;    }    caca_set_window_title("MPlayer");    /* Default libcaca features */    caca_set_feature(CACA_ANTIALIASING_PREFILTER);    caca_set_feature(CACA_DITHERING_RANDOM);    return 0;}static int query_format(uint32_t format){    if (format == IMGFMT_BGR24)      return VFCAP_OSD | VFCAP_CSP_SUPPORTED;    return 0;}static int control(uint32_t request, void *data, ...){    switch(request)    {    case VOCTRL_QUERY_FORMAT:      return query_format(*((uint32_t *)data));    default:      return VO_NOTIMPL;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?