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 + -
显示快捷键?