vosub_vidix.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 747 行 · 第 1/2 页
C
747 行
/* * vosub_vidix.c * * Copyright (C) Nick Kurshev <nickols_k@mail.ru> - 2002 * Copyright (C) Alex Beregszaszi * * You can redistribute this file under terms and conditions * of GNU General Public licence v2. * * This file contains vidix interface to any mplayer's VO plugin. * (Partly based on vesa_lvo.c from mplayer's package) */#include <inttypes.h>#include <mplaylib.h>#include <fcntl.h>#ifndef __MINGW32__#include <sys/ioctl.h>#include <sys/mman.h>#endif#include <mplaylib.h>#include <mplaylib.h>#include <mplaylib.h>#include <errno.h>#include "config.h"#include "mp_msg.h"#include "help_mp.h"#include "vosub_vidix.h"#include "vidix/vidixlib.h"#include "fastmemcpy.h"#include "osd.h"#include "video_out.h"#include "sub.h"#include "libmpcodecs/vfcap.h"#include "libmpcodecs/mp_image.h"#define NUM_FRAMES VID_PLAY_MAXFRAMES /* Temporary: driver will overwrite it */static VDL_HANDLE vidix_handler = NULL;static uint8_t *vidix_mem = NULL;static uint8_t next_frame;static unsigned image_Bpp,image_height,image_width,src_format,forced_fourcc=0;static int video_on=0;static vidix_capability_t vidix_cap;static vidix_playback_t vidix_play;static vidix_fourcc_t vidix_fourcc;static vo_functions_t * vo_server;static vidix_yuv_t dstrides;/*static uint32_t (*server_control)(uint32_t request, void *data, ...);*/#undef memcpy#define memcpy uc_memcpyint vidix_start(void){ int err; if((err=vdlPlaybackOn(vidix_handler))!=0) { mp_msg(MSGT_VO,MSGL_ERR, MSGTR_LIBVO_SUB_VIDIX_CantStartPlayback,strerror(err)); return -1; } video_on=1; return 0;}int vidix_stop(void){ int err; if((err=vdlPlaybackOff(vidix_handler))!=0) { mp_msg(MSGT_VO,MSGL_ERR, MSGTR_LIBVO_SUB_VIDIX_CantStopPlayback,strerror(err)); return -1; } video_on=0; return 0;}void vidix_term( void ){ if( mp_msg_test(MSGT_VO,MSGL_DBG2) ) { mp_msg(MSGT_VO,MSGL_DBG2, "vosub_vidix: vidix_term() was called\n"); } vidix_stop(); vdlClose(vidix_handler);// ((vo_functions_t *)vo_server)->control=server_control;}static uint32_t vidix_draw_slice_420(uint8_t *image[], int stride[], int w,int h,int x,int y){ uint8_t *src; uint8_t *dest; int i; /* Plane Y */ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; dest += dstrides.y*y + x; src = image[0]; for(i=0;i<h;i++){ memcpy(dest,src,w); src+=stride[0]; dest += dstrides.y; } if (vidix_play.flags & VID_PLAY_INTERLEAVED_UV) { int hi,wi; uint8_t *src2; dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v; dest += dstrides.y*y/2 + x; // <- is this correct ? h/=2; w/=2; src = image[1]; src2 = image[2]; for(hi = 0; hi < h; hi++) { for(wi = 0; wi < w; wi++) { dest[2*wi+0] = src[wi]; dest[2*wi+1] = src2[wi]; } dest += dstrides.y; src += stride[1]; src2+= stride[2]; } } else { /* Plane V */ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v; dest += dstrides.v*y/4 + x; src = image[1]; for(i=0;i<h/2;i++){ memcpy(dest,src,w/2); src+=stride[1]; dest+=dstrides.v/2; } /* Plane U */ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.u; dest += dstrides.u*y/4 + x; src = image[2]; for(i=0;i<h/2;i++){ memcpy(dest,src,w/2); src+=stride[2]; dest += dstrides.u/2; } return 0; } return -1;}static uint32_t vidix_draw_slice_410(uint8_t *image[], int stride[], int w,int h,int x,int y){ uint8_t *src; uint8_t *dest; int i; /* Plane Y */ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; dest += dstrides.y*y + x; src = image[0]; for(i=0;i<h;i++){ memcpy(dest,src,w); src+=stride[0]; dest += dstrides.y; } if (vidix_play.flags & VID_PLAY_INTERLEAVED_UV) { mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_SUB_VIDIX_InterleavedUvForYuv410pNotSupported); } else { /* Plane V */ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.v; dest += dstrides.v*y/8 + x; src = image[1]; for(i=0;i<h/4;i++){ memcpy(dest,src,w/4); src+=stride[1]; dest+=dstrides.v/4; } /* Plane U */ dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.u; dest += dstrides.u*y/8 + x; src = image[2]; for(i=0;i<h/4;i++){ memcpy(dest,src,w/4); src+=stride[2]; dest += dstrides.u/4; } return 0; } return -1;}static uint32_t vidix_draw_slice_410_fast(uint8_t *image[], int stride[], int w, int h, int x, int y){ uint8_t *src; uint8_t *dest; dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; dest += dstrides.y*y + x; src = image[0]; memcpy(dest, src, dstrides.y*h*9/8); return 0;}static uint32_t vidix_draw_slice_400(uint8_t *image[], int stride[], int w,int h,int x,int y){ uint8_t *src; uint8_t *dest; int i; dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; dest += dstrides.y*y + x; src = image[0]; for(i=0;i<h;i++){ memcpy(dest,src,w); src+=stride[0]; dest += dstrides.y; } return 0;}static uint32_t vidix_draw_slice_packed(uint8_t *image[], int stride[], int w,int h,int x,int y){ uint8_t *src; uint8_t *dest; int i; dest = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; dest += dstrides.y*y + x; src = image[0]; for(i=0;i<h;i++){ memcpy(dest,src,w*image_Bpp); src+=stride[0]; dest += dstrides.y; } return 0;}uint32_t vidix_draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y){ mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_SUB_VIDIX_DummyVidixdrawsliceWasCalled); return -1;}static uint32_t vidix_draw_image(mp_image_t *mpi){ if( mp_msg_test(MSGT_VO,MSGL_DBG2) ) { mp_msg(MSGT_VO,MSGL_DBG2, "vosub_vidix: vidix_draw_image() was called\n"); } // if -dr or -slices then do nothing: if(mpi->flags&(MP_IMGFLAG_DIRECT|MP_IMGFLAG_DRAW_CALLBACK)) return VO_TRUE; vo_server->draw_slice(mpi->planes,mpi->stride, vidix_play.src.w,vidix_play.src.h,vidix_play.src.x,vidix_play.src.y); return VO_TRUE;}uint32_t vidix_draw_frame(uint8_t *image[]){ mp_msg(MSGT_VO,MSGL_WARN, MSGTR_LIBVO_SUB_VIDIX_DummyVidixdrawframeWasCalled); return -1;}void vidix_flip_page(void){ if( mp_msg_test(MSGT_VO,MSGL_DBG2) ) { mp_msg(MSGT_VO,MSGL_DBG2, "vosub_vidix: vidix_flip_page() was called\n"); } if(vo_doublebuffering) { vdlPlaybackFrameSelect(vidix_handler,next_frame); next_frame=(next_frame+1)%vidix_play.num_frames; } }static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){ uint32_t apitch,bespitch; void *lvo_mem; lvo_mem = vidix_mem + vidix_play.offsets[next_frame] + vidix_play.offset.y; apitch = vidix_play.dest.pitch.y-1; switch(vidix_play.fourcc){ case IMGFMT_YV12: case IMGFMT_IYUV: case IMGFMT_I420: case IMGFMT_YVU9: case IMGFMT_IF09: case IMGFMT_Y8: case IMGFMT_Y800: bespitch = (vidix_play.src.w + apitch) & (~apitch); vo_draw_alpha_yv12(w,h,src,srca,stride,lvo_mem+bespitch*y0+x0,bespitch); break; case IMGFMT_YUY2: bespitch = (vidix_play.src.w*2 + apitch) & (~apitch); vo_draw_alpha_yuy2(w,h,src,srca,stride,lvo_mem+bespitch*y0+2*x0,bespitch); break; case IMGFMT_UYVY: bespitch = (vidix_play.src.w*2 + apitch) & (~apitch); vo_draw_alpha_yuy2(w,h,src,srca,stride,lvo_mem+bespitch*y0+2*x0+1,bespitch); break; case IMGFMT_RGB32: case IMGFMT_BGR32: bespitch = (vidix_play.src.w*4 + apitch) & (~apitch); vo_draw_alpha_rgb32(w,h,src,srca,stride,lvo_mem+y0*bespitch+4*x0,bespitch); break; case IMGFMT_RGB24: case IMGFMT_BGR24: bespitch = (vidix_play.src.w*3 + apitch) & (~apitch); vo_draw_alpha_rgb24(w,h,src,srca,stride,lvo_mem+y0*bespitch+3*x0,bespitch); break; case IMGFMT_RGB16: case IMGFMT_BGR16: bespitch = (vidix_play.src.w*2 + apitch) & (~apitch); vo_draw_alpha_rgb16(w,h,src,srca,stride,lvo_mem+y0*bespitch+2*x0,bespitch); break; case IMGFMT_RGB15: case IMGFMT_BGR15: bespitch = (vidix_play.src.w*2 + apitch) & (~apitch); vo_draw_alpha_rgb15(w,h,src,srca,stride,lvo_mem+y0*bespitch+2*x0,bespitch); break; default: return; }}void vidix_draw_osd(void){ if( mp_msg_test(MSGT_VO,MSGL_DBG2) ) { mp_msg(MSGT_VO,MSGL_DBG2, "vosub_vidix: vidix_draw_osd() was called\n"); } /* TODO: hw support */ vo_draw_text(vidix_play.src.w,vidix_play.src.h,draw_alpha);}uint32_t vidix_query_fourcc(uint32_t format){ if( mp_msg_test(MSGT_VO,MSGL_DBG2) ) { mp_msg(MSGT_VO,MSGL_DBG2, "vosub_vidix: query_format was called: %x (%s)\n",format,vo_format_name(format)); } vidix_fourcc.fourcc = format; vdlQueryFourcc(vidix_handler,&vidix_fourcc); if (vidix_fourcc.depth == VID_DEPTH_NONE) return 0; return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_HWSCALE_UP|VFCAP_HWSCALE_DOWN|VFCAP_OSD|VFCAP_ACCEPT_STRIDE;}int vidix_grkey_support(void){ return(vidix_fourcc.flags & VID_CAP_COLORKEY);}int vidix_grkey_get(vidix_grkey_t *gr_key){ return(vdlGetGrKeys(vidix_handler, gr_key));}int vidix_grkey_set(const vidix_grkey_t *gr_key){ return(vdlSetGrKeys(vidix_handler, gr_key));}static int vidix_get_video_eq(vidix_video_eq_t *info){ if(!video_on) return EPERM; return vdlPlaybackGetEq(vidix_handler, info);}static int vidix_set_video_eq(const vidix_video_eq_t *info){ if(!video_on) return EPERM; return vdlPlaybackSetEq(vidix_handler, info);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?