⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tvi_bsdbt848.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    (C)2002 Charles R. Henrich (henrich@msu.edu)    *BSD (hopefully, requires working driver!) BrookTree capture support.    Still in (active) development!	v1.1	Mar 13 2002   Fully functional, need to move ring buffer to						  the kernel driver.     v1.0    Feb 19 2002   First Release, need to add support for changing                            audio parameters.*/#include "config.h"#define RINGSIZE 8#define FRAGSIZE 4096 /* (2^12 see SETFRAGSIZE below) */#define TRUE  (1==1)#define FALSE (1==0)#define PAL_WIDTH  768#define PAL_HEIGHT 576#define PAL_FPS    25#define NTSC_WIDTH  640#define NTSC_HEIGHT 480#define NTSC_FPS    29.97#include <mplaylib.h>#include <mplaylib.h>#include <mplaylib.h>#include <fcntl.h>#include <sys/types.h>#include <sys/mman.h>#include <sys/filio.h>#include <sys/time.h>#include <signal.h>#include <mplaylib.h>#include <sys/param.h>#ifdef USE_SUN_AUDIO#include <sys/audioio.h>#endif#ifdef IOCTL_METEOR_H_NAME#include IOCTL_METEOR_H_NAME#endif#ifdef IOCTL_BT848_H_NAME#include IOCTL_BT848_H_NAME#endif#ifdef HAVE_SYS_SOUNDCARD_H#include <sys/soundcard.h>#else#ifdef HAVE_SOUNDCARD_H#include <soundcard.h>#else#include <machine/soundcard.h>#endif#endif#include "libaf/af_format.h"#include "libmpcodecs/img_format.h"#include "tv.h"#include "help_mp.h"#include "mp_msg.h"static tvi_handle_t *tvi_init_bsdbt848(tv_param_t* tv_param);/* information about this file */tvi_info_t tvi_info_bsdbt848 = {    tvi_init_bsdbt848,    "Brooktree848 Support",    "bsdbt848",    "Charles Henrich",    "in development"};#undef memcpy#define memcpy uc_memcpytypedef struct {    int dirty;    double timestamp;    char *buf;} RBFRAME;/* private data's */typedef struct {/* Audio */    char *dspdev;    int dspready;    int dspfd;    int dspsamplesize;    int dspstereo;    int dspspeed;    int dspfmt;    int dspframesize;    int dsprate;    long long dspbytesread;/* Video */    char *btdev;    int videoready;    int btfd;    int source;    float maxfps;    float fps;    int iformat;    int maxheight;    int maxwidth;    struct meteor_geomet geom;    struct meteor_capframe capframe;/* Frame Buffer */    int framebufsize;    float timestamp;    int curpaintframe;    int curbufframe;    unsigned char *livebuf;    RBFRAME framebuf[RINGSIZE];/* Inputs */    int input;/* Tuner */    char *tunerdev;    int tunerfd;    int tunerready;    u_long tunerfreq;    struct bktr_chnlset cset;/* Other */    int immediatemode;    double starttime;    tv_param_t *tv_param;} priv_t;#include "tvi_def.h"static priv_t *G_private=NULL;static int getinput(int innumber);static void processframe(int signal){struct timeval curtime;if(G_private->immediatemode == TRUE) return;gettimeofday(&curtime, NULL);if(G_private->framebuf[G_private->curpaintframe].dirty == TRUE)    {    memcpy(G_private->framebuf[G_private->curpaintframe].buf,             G_private->livebuf, G_private->framebufsize);    G_private->framebuf[G_private->curpaintframe].dirty = FALSE;    G_private->framebuf[G_private->curpaintframe].timestamp =             curtime.tv_sec + curtime.tv_usec*.000001;    G_private->curpaintframe++;    if(G_private->curpaintframe >= RINGSIZE) G_private->curpaintframe = 0;    }return;}/* handler creator - entry point ! */static tvi_handle_t *tvi_init_bsdbt848(tv_param_t* tv_param){    char* sep ;    tvi_handle_t* tvh;    priv_t* priv;    tvh=new_handle();    if(!tvh)        return NULL;    priv=(priv_t*)tvh->priv;    /*     if user needs to specify both /dev/bktr<n> and /dev/tuner<n>    it can do this with "-tv device=/dev/bktr1,/dev/tuner1"    */    /* set video device name */    if (!tv_param->device){        priv->btdev = strdup("/dev/bktr0");        priv->tunerdev = strdup("/dev/tuner0");    }else{        sep = strchr(tv_param->device,',');        priv->btdev = strdup(tv_param->device);        if(sep){            // tuner device is also passed            priv->tunerdev = strdup(sep+1);            priv->btdev[sep - tv_param->device] = 0;        }else{            priv->tunerdev = strdup("/dev/tuner0");        }    }    /* set audio device name */    if (!tv_param->adevice)#ifdef USE_SUN_AUDIO        priv->dspdev = strdup("/dev/sound");#else        priv->dspdev = strdup("/dev/dsp");#endif    else        priv->dspdev = strdup(tv_param->adevice);    priv->tv_param=tv_param;    return tvh;}static int control(priv_t *priv, int cmd, void *arg){    switch(cmd)    {/* Tuner Controls */    case TVI_CONTROL_IS_TUNER:        if(priv->tunerready == FALSE) return TVI_CONTROL_FALSE;        return(TVI_CONTROL_TRUE);    case TVI_CONTROL_TUN_GET_FREQ:        {        if(ioctl(priv->tunerfd, TVTUNER_GETFREQ, &priv->tunerfreq) < 0)            {            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848IoctlFailed, "TVTUNER_GETFREQ", strerror(errno));            return(TVI_CONTROL_FALSE);            }        *(int *)arg = priv->tunerfreq;        return(TVI_CONTROL_TRUE);        }        case TVI_CONTROL_TUN_SET_FREQ:        {        priv->tunerfreq = *(int *)arg;        if(ioctl(priv->tunerfd, TVTUNER_SETFREQ, &priv->tunerfreq) < 0)             {            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848IoctlFailed, "TVTUNER_SETFREQ", strerror(errno));            return(0);            }        return(TVI_CONTROL_TRUE);                }    case TVI_CONTROL_TUN_GET_SIGNAL:        {        int status;        if(ioctl(priv->tunerfd, TVTUNER_GETSTATUS, &status) < 0)            {            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848IoctlFailed, "GETSTATUS", strerror(errno));            return(0);            }        *(int*)arg=(status & 0x02)? 100 : 0;        return (TVI_CONTROL_TRUE);        }    case TVI_CONTROL_TUN_GET_TUNER:    case TVI_CONTROL_TUN_SET_TUNER:/* Inputs */    case TVI_CONTROL_SPC_GET_INPUT:        {        if(ioctl(priv->btfd, METEORGINPUT, &priv->input) < 0)            {            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848IoctlFailed, "METEORGINPUT", strerror(errno));            return(TVI_CONTROL_FALSE);            }        *(int *)arg = priv->input;        return(TVI_CONTROL_TRUE);        }        case TVI_CONTROL_SPC_SET_INPUT:        {        priv->input = getinput(*(int *)arg);        if(ioctl(priv->btfd, METEORSINPUT, &priv->input) < 0)             {            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848IoctlFailed, "METEORSINPUT", strerror(errno));            return(0);            }        return(TVI_CONTROL_TRUE);                }/* Audio Controls */    case TVI_CONTROL_IS_AUDIO:        if(priv->dspready == FALSE) return TVI_CONTROL_FALSE;        return(TVI_CONTROL_TRUE);    case TVI_CONTROL_AUD_GET_FORMAT:        {        *(int *)arg = AF_FORMAT_S16_LE;        return(TVI_CONTROL_TRUE);        }    case TVI_CONTROL_AUD_GET_CHANNELS:        {        *(int *)arg = 2;        return(TVI_CONTROL_TRUE);        }    case TVI_CONTROL_AUD_SET_SAMPLERATE:        {        int dspspeed = *(int *)arg;           if(ioctl(priv->dspfd, SNDCTL_DSP_SPEED, &dspspeed) == -1)             {            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848InvalidAudioRate, strerror(errno));            return(TVI_CONTROL_FALSE);            }        priv->dspspeed = dspspeed;        priv->dspframesize = priv->dspspeed*priv->dspsamplesize/8/                                priv->fps * (priv->dspstereo+1);        priv->dsprate = priv->dspspeed * priv->dspsamplesize/8*                                (priv->dspstereo+1);        return(TVI_CONTROL_TRUE);        }    case TVI_CONTROL_AUD_GET_SAMPLERATE:        {        *(int *)arg = priv->dspspeed;        return(TVI_CONTROL_TRUE);        }    case TVI_CONTROL_AUD_GET_SAMPLESIZE:        {        *(int *)arg = priv->dspsamplesize/8;        return(TVI_CONTROL_TRUE);        }/* Video Controls */    case TVI_CONTROL_IS_VIDEO:        if(priv->videoready == FALSE) return TVI_CONTROL_FALSE;        return(TVI_CONTROL_TRUE);    case TVI_CONTROL_TUN_SET_NORM:        {        int req_mode = *(int *)arg;	u_short tmp_fps;        priv->iformat = METEOR_FMT_AUTOMODE;        if(req_mode == TV_NORM_PAL)             {            priv->iformat = METEOR_FMT_PAL;            priv->maxheight = PAL_HEIGHT;            priv->maxwidth = PAL_WIDTH;            priv->maxfps = PAL_FPS;            priv->fps = PAL_FPS;            if(priv->fps > priv->maxfps) priv->fps = priv->maxfps;            if(priv->geom.rows > priv->maxheight)                 {                priv->geom.rows = priv->maxheight;                }            if(priv->geom.columns > priv->maxwidth)                 {                priv->geom.columns = priv->maxwidth;                }            }        if(req_mode == TV_NORM_NTSC)             {            priv->iformat = METEOR_FMT_NTSC;            priv->maxheight = NTSC_HEIGHT;            priv->maxwidth = NTSC_WIDTH;            priv->maxfps = NTSC_FPS;            priv->fps = NTSC_FPS;            priv->dspframesize = priv->dspspeed*priv->dspsamplesize/8/                                 priv->fps * (priv->dspstereo+1);            priv->dsprate = priv->dspspeed * priv->dspsamplesize/8 *                                (priv->dspstereo+1);            if(priv->fps > priv->maxfps) priv->fps = priv->maxfps;            if(priv->geom.rows > priv->maxheight)                 {                priv->geom.rows = priv->maxheight;                }            if(priv->geom.columns > priv->maxwidth)                 {                priv->geom.columns = priv->maxwidth;                }            }        if(req_mode == TV_NORM_SECAM) priv->iformat = METEOR_FMT_SECAM;        if(ioctl(priv->btfd, METEORSFMT, &priv->iformat) < 0)             {            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848IoctlFailed, "METEORSFMT", strerror(errno));            return(TVI_CONTROL_FALSE);            }            if(ioctl(priv->btfd, METEORSETGEO, &priv->geom) < 0)             {            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848IoctlFailed, "METEORSETGEO", strerror(errno));            return(0);            }	tmp_fps = priv->fps;        if(ioctl(priv->btfd, METEORSFPS, &tmp_fps) < 0)             {            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848IoctlFailed, "METEORSFPS", strerror(errno));            return(0);            }#ifdef BT848_SAUDIO	if(priv->tunerready == TRUE &&	    ioctl(priv->tunerfd, BT848_SAUDIO, &priv->tv_param->audio_id) < 0)	    {           mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TV_Bt848IoctlFailed, "BT848_SAUDIO", strerror(errno));	    }#endif        return(TVI_CONTROL_TRUE);        }        case TVI_CONTROL_VID_GET_FORMAT:        *(int *)arg = IMGFMT_UYVY;        return(TVI_CONTROL_TRUE);    case TVI_CONTROL_VID_SET_FORMAT:        {        int req_fmt = *(int *)arg;        if(req_fmt != IMGFMT_UYVY) return(TVI_CONTROL_FALSE);        return(TVI_CONTROL_TRUE);

⌨️ 快捷键说明

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