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