vo_dfbmga.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 1,527 行 · 第 1/4 页
C
1,527 行
blit_to_screen(); blit_done = 1; vo_remove_text( sub_width, sub_height, clear_alpha ); vo_draw_text( sub_width, sub_height, draw_alpha ); if (use_spic && flipping && osd_changed) { subframe->Flip( subframe, NULL, 0 ); osd_current <<= 1; if (osd_current > osd_max) osd_current = 1; }}static voidflip_page( void ){ if (!blit_done) blit_to_screen(); if (flipping) { if (use_crtc2) c2frame->Flip( c2frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : DSFLIP_ONSYNC ); else besframe->Flip( besframe, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : DSFLIP_ONSYNC ); if (!use_spic) { osd_current <<= 1; if (osd_current > osd_max) osd_current = 1; } } blit_done = 0; current_buf = 0;}static voiduninit( void ){ release_config(); if (buffer) buffer->Release( buffer ); if (remote) remote->Release( remote ); if (keyboard) keyboard->Release( keyboard ); if (crtc2) crtc2->Release( crtc2 ); if (bes) bes->Release( bes ); if (primary) primary->Release( primary ); if (dfb) dfb->Release( dfb ); buffer = NULL; remote = NULL; keyboard = NULL; crtc2 = NULL; bes = NULL; primary = NULL; dfb = NULL;}static uint32_tget_image( mp_image_t *mpi ){ int buf = current_buf; void *dst; int pitch; if (mpi->flags & MP_IMGFLAG_READABLE && (mpi->type == MP_IMGTYPE_IPB || mpi->type == MP_IMGTYPE_IP)) { if (num_bufs < 2) return VO_FALSE; current_ip_buf ^= 1; if (mpi->type == MP_IMGTYPE_IPB && num_bufs < 3 && current_ip_buf) return VO_FALSE; buf = current_ip_buf; if (mpi->type == MP_IMGTYPE_IPB) buf++; } frame = bufs[buf]; frame->Unlock( frame ); /* Always use DSLF_READ to preserve system memory copy */ if (frame->Lock( frame, DSLF_WRITE | DSLF_READ, &dst, &pitch ) != DFB_OK) return VO_FALSE; if ((mpi->width == pitch) || (mpi->flags & (MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_ACCEPT_WIDTH))) { mpi->planes[0] = dst; mpi->width = in_width; mpi->stride[0] = pitch; if (mpi->flags & MP_IMGFLAG_PLANAR) { if (mpi->num_planes > 2) { mpi->stride[1] = mpi->stride[2] = pitch / 2; if (mpi->flags & MP_IMGFLAG_SWAPPED) { /* I420 */ mpi->planes[1] = dst + buf_height * pitch; mpi->planes[2] = mpi->planes[1] + buf_height * pitch / 4; } else { /* YV12 */ mpi->planes[2] = dst + buf_height * pitch; mpi->planes[1] = mpi->planes[2] + buf_height * pitch / 4; } } else { /* NV12/NV21 */ mpi->stride[1] = pitch; mpi->planes[1] = dst + buf_height * pitch; } } mpi->flags |= MP_IMGFLAG_DIRECT; mpi->priv = (void *) buf; current_buf = buf; return VO_TRUE; } frame->Unlock( frame ); return VO_FALSE;}static uint32_tdraw_image( mp_image_t *mpi ){ if (mpi->flags & MP_IMGFLAG_DIRECT) { current_buf = (int) mpi->priv; return VO_TRUE; } if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK) return VO_TRUE; if (mpi->flags & MP_IMGFLAG_PLANAR) return draw_slice( mpi->planes, mpi->stride, mpi->w, mpi->h, 0, 0 ); else { void *dst; int pitch; if (frame->Lock( frame, DSLF_WRITE, &dst, &pitch ) != DFB_OK) return VO_FALSE; memcpy_pic( dst, mpi->planes[0], mpi->w * (mpi->bpp / 8), mpi->h, pitch, mpi->stride[0] ); frame->Unlock( frame ); return VO_TRUE; }}static intset_equalizer( char *data, int value ){ DFBResult res; DFBColorAdjustment ca; float factor = (float) 0xffff / 200.0; ca.flags = DCAF_NONE; if (!strcasecmp( data, "brightness" )) { ca.flags |= DCAF_BRIGHTNESS; ca.brightness = value * factor + 0x8000; } if (!strcasecmp( data, "contrast" )) { ca.flags |= DCAF_CONTRAST; ca.contrast = value * factor + 0x8000; } if (!strcasecmp( data, "hue" )) { ca.flags |= DCAF_HUE; ca.hue = value * factor + 0x8000; } if (!strcasecmp( data, "saturation" )) { ca.flags |= DCAF_SATURATION; ca.saturation = value * factor + 0x8000; } /* Prefer CRTC2 over BES */ if (use_crtc2) res = crtc2->SetColorAdjustment( crtc2, &ca ); else res = bes->SetColorAdjustment( bes, &ca ); if (res != DFB_OK) return VO_FALSE; return VO_TRUE;}static intget_equalizer( char *data, int *value ){ DFBResult res; DFBColorAdjustment ca; float factor = 200.0 / (float) 0xffff; /* Prefer CRTC2 over BES */ if (use_crtc2) res = crtc2->GetColorAdjustment( crtc2, &ca ); else res = bes->GetColorAdjustment( bes, &ca ); if (res != DFB_OK) return VO_FALSE; if (!strcasecmp( data, "brightness" ) && (ca.flags & DCAF_BRIGHTNESS)) *value = (ca.brightness - 0x8000) * factor; if (!strcasecmp( data, "contrast" ) && (ca.flags & DCAF_CONTRAST)) *value = (ca.contrast - 0x8000) * factor; if (!strcasecmp( data, "hue" ) && (ca.flags & DCAF_HUE)) *value = (ca.hue - 0x8000) * factor; if (!strcasecmp( data, "saturation" ) && (ca.flags & DCAF_SATURATION)) *value = (ca.saturation - 0x8000) * factor; return VO_TRUE;}static intcontrol( uint32_t request, void *data, ... ){ switch (request) { case VOCTRL_GUISUPPORT: case VOCTRL_GUI_NOWINDOW: return VO_TRUE; case VOCTRL_QUERY_FORMAT: return query_format( *((uint32_t *) data) ); case VOCTRL_GET_IMAGE: return get_image( data ); case VOCTRL_DRAW_IMAGE: return draw_image( data ); case VOCTRL_SET_EQUALIZER: { va_list ap; int value; va_start( ap, data ); value = va_arg( ap, int ); va_end( ap ); return set_equalizer( data, value ); } case VOCTRL_GET_EQUALIZER: { va_list ap; int *value; va_start( ap, data ); value = va_arg( ap, int* ); va_end( ap ); return get_equalizer( data, value ); } } return VO_NOTIMPL;}#include "osdep/keycodes.h"static voidcheck_events( void ){ DFBInputEvent event; if (!buffer) return; if (buffer->GetEvent( buffer, DFB_EVENT( &event )) == DFB_OK) { if (event.type == DIET_KEYPRESS) { switch (event.key_symbol) { case DIKS_ESCAPE: mplayer_put_key( KEY_ESC ); break; case DIKS_PAGE_UP: mplayer_put_key( KEY_PAGE_UP ); break; case DIKS_PAGE_DOWN: mplayer_put_key( KEY_PAGE_DOWN ); break; case DIKS_CURSOR_UP: mplayer_put_key( KEY_UP ); break; case DIKS_CURSOR_DOWN: mplayer_put_key( KEY_DOWN ); break; case DIKS_CURSOR_LEFT: mplayer_put_key( KEY_LEFT ); break; case DIKS_CURSOR_RIGHT: mplayer_put_key( KEY_RIGHT ); break; case DIKS_INSERT: mplayer_put_key( KEY_INSERT ); break; case DIKS_DELETE: mplayer_put_key( KEY_DELETE ); break; case DIKS_HOME: mplayer_put_key( KEY_HOME ); break; case DIKS_END: mplayer_put_key( KEY_END ); break; case DIKS_POWER: mplayer_put_key( KEY_POWER ); break; case DIKS_MENU: mplayer_put_key( KEY_MENU ); break; case DIKS_PLAY: mplayer_put_key( KEY_PLAY ); break; case DIKS_STOP: mplayer_put_key( KEY_STOP ); break; case DIKS_PAUSE: mplayer_put_key( KEY_PAUSE ); break; case DIKS_PLAYPAUSE: mplayer_put_key( KEY_PLAYPAUSE ); break; case DIKS_FORWARD: mplayer_put_key( KEY_FORWARD ); break; case DIKS_NEXT: mplayer_put_key( KEY_NEXT ); break; case DIKS_REWIND: mplayer_put_key( KEY_REWIND ); break; case DIKS_PREVIOUS: mplayer_put_key( KEY_PREV ); break; case DIKS_VOLUME_UP: mplayer_put_key( KEY_VOLUME_UP ); break; case DIKS_VOLUME_DOWN: mplayer_put_key( KEY_VOLUME_DOWN ); break; case DIKS_MUTE: mplayer_put_key( KEY_MUTE ); break; default: mplayer_put_key( event.key_symbol ); } } } /* * empty buffer, because of repeating * keyboard repeat is faster than key handling and this causes problems during seek * temporary workabout. should be solved in the future */ buffer->Reset( buffer );}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?