亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bttv-vbi.c

?? 這是一個市場上常見電視卡的驅動程序源代碼
?? C
字號:
/*
    bttv - Bt848 frame grabber driver
    vbi interface
    
    (c) 2002 Gerd Knorr <kraxel@bytesex.org>
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <linux/module.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/kdev_t.h>
#include <asm/io.h>
#include "bttvp.h"

#define VBI_DEFLINES 16
#define VBI_MAXLINES 32

static unsigned int vbibufs = 4;
static unsigned int vbi_debug = 0;

MODULE_PARM(vbibufs,"i");
MODULE_PARM_DESC(vbibufs,"number of vbi buffers, range 2-32, default 4");
MODULE_PARM(vbi_debug,"i");
MODULE_PARM_DESC(vbi_debug,"vbi code debug messages, default is 0 (no)");

#ifdef dprintk
# undef dprintk
#endif
#define dprintk(fmt, arg...)	if (vbi_debug) \
	printk(KERN_DEBUG "bttv%d/vbi: " fmt, btv->c.nr , ## arg)

/* ----------------------------------------------------------------------- */
/* vbi risc code + mm                                                      */

static int
vbi_buffer_risc(struct bttv *btv, struct bttv_buffer *buf, int lines)
{
	int bpl = 2048;

	bttv_risc_packed(btv, &buf->top, buf->vb.dma.sglist,
			 0, bpl-4, 4, lines);
	bttv_risc_packed(btv, &buf->bottom, buf->vb.dma.sglist,
			 lines * bpl, bpl-4, 4, lines);
	return 0;
}

static int vbi_buffer_setup(struct file *file,
			    unsigned int *count, unsigned int *size)
{
	struct bttv_fh *fh = file->private_data;
	struct bttv *btv = fh->btv;

	if (0 == *count)
		*count = vbibufs;
	*size = fh->lines * 2 * 2048;
	dprintk("setup: lines=%d\n",fh->lines);
	return 0;
}

static int vbi_buffer_prepare(struct file *file, struct videobuf_buffer *vb,
			      enum v4l2_field field)
{
	struct bttv_fh *fh = file->private_data;
	struct bttv *btv = fh->btv;
	struct bttv_buffer *buf = (struct bttv_buffer*)vb;
	int rc;
	
	buf->vb.size = fh->lines * 2 * 2048;
	if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
		return -EINVAL;

	if (STATE_NEEDS_INIT == buf->vb.state) {
		if (0 != (rc = videobuf_iolock(btv->c.pci, &buf->vb, NULL)))
			goto fail;
		if (0 != (rc = vbi_buffer_risc(btv,buf,fh->lines)))
			goto fail;
	}
	buf->vb.state = STATE_PREPARED;
	buf->vb.field = field;
	dprintk("buf prepare %p: top=%p bottom=%p field=%s\n",
		vb, &buf->top, &buf->bottom,
		v4l2_field_names[buf->vb.field]);
	return 0;

 fail:
	bttv_dma_free(btv,buf);
	return rc;
}

static void
vbi_buffer_queue(struct file *file, struct videobuf_buffer *vb)
{
	struct bttv_fh *fh = file->private_data;
	struct bttv *btv = fh->btv;
	struct bttv_buffer *buf = (struct bttv_buffer*)vb;
	
	dprintk("queue %p\n",vb);
	buf->vb.state = STATE_QUEUED;
	list_add_tail(&buf->vb.queue,&btv->vcapture);
	bttv_set_dma(btv,0x0c,1);
}

static void vbi_buffer_release(struct file *file, struct videobuf_buffer *vb)
{
	struct bttv_fh *fh = file->private_data;
	struct bttv *btv = fh->btv;
	struct bttv_buffer *buf = (struct bttv_buffer*)vb;
	
	dprintk("free %p\n",vb);
	bttv_dma_free(fh->btv,buf);
}

struct videobuf_queue_ops bttv_vbi_qops = {
	.buf_setup    = vbi_buffer_setup,
	.buf_prepare  = vbi_buffer_prepare,
	.buf_queue    = vbi_buffer_queue,
	.buf_release  = vbi_buffer_release,
};

/* ----------------------------------------------------------------------- */

void bttv_vbi_setlines(struct bttv_fh *fh, struct bttv *btv, int lines)
{
	int vdelay;

	if (lines < 1)
		lines = 1;
	if (lines > VBI_MAXLINES)
		lines = VBI_MAXLINES;
	fh->lines = lines;

	vdelay = btread(BT848_E_VDELAY_LO);
	if (vdelay < lines*2) {
		vdelay = lines*2;
		btwrite(vdelay,BT848_E_VDELAY_LO);
		btwrite(vdelay,BT848_O_VDELAY_LO);
	}
}

void bttv_vbi_try_fmt(struct bttv_fh *fh, struct v4l2_format *f)
{
	const struct bttv_tvnorm *tvnorm;
	u32 start0,start1;
	s32 count0,count1,count;

	tvnorm = &bttv_tvnorms[fh->btv->tvnorm];
	f->type = V4L2_BUF_TYPE_VBI_CAPTURE;
	f->fmt.vbi.sampling_rate    = tvnorm->Fsc;
	f->fmt.vbi.samples_per_line = 2048;
	f->fmt.vbi.sample_format    = V4L2_PIX_FMT_GREY;
	f->fmt.vbi.offset           = 244;
	f->fmt.vbi.flags            = 0;
	switch (fh->btv->tvnorm) {
	case 1: /* NTSC */
		start0 = 10;
		start1 = 273;
		break;
	case 0: /* PAL */
	case 2: /* SECAM */
	default:
		start0 = 7;
		start1 = 319;
	}

	count0 = (f->fmt.vbi.start[0] + f->fmt.vbi.count[0]) - start0;
	count1 = (f->fmt.vbi.start[1] + f->fmt.vbi.count[1]) - start1;
	count  = max(count0,count1);
	if (count > VBI_MAXLINES)
		count = VBI_MAXLINES;
	if (count < 1)
		count = 1;

	f->fmt.vbi.start[0] = start0;
	f->fmt.vbi.start[1] = start1;
	f->fmt.vbi.count[0] = count;
	f->fmt.vbi.count[1] = count;
}

void bttv_vbi_get_fmt(struct bttv_fh *fh, struct v4l2_format *f)
{
	const struct bttv_tvnorm *tvnorm;

	tvnorm = &bttv_tvnorms[fh->btv->tvnorm];
	memset(f,0,sizeof(*f));
	f->type = V4L2_BUF_TYPE_VBI_CAPTURE;
	f->fmt.vbi.sampling_rate    = tvnorm->Fsc;
	f->fmt.vbi.samples_per_line = 2048;
	f->fmt.vbi.sample_format    = V4L2_PIX_FMT_GREY;
	f->fmt.vbi.offset           = 244;
	f->fmt.vbi.count[0]         = fh->lines;
	f->fmt.vbi.count[1]         = fh->lines;
	f->fmt.vbi.flags            = 0;
	switch (fh->btv->tvnorm) {
	case 1: /* NTSC */
		f->fmt.vbi.start[0] = 10;
		f->fmt.vbi.start[1] = 273;
		break;
	case 0: /* PAL */
	case 2: /* SECAM */
	default:
		f->fmt.vbi.start[0] = 7;
		f->fmt.vbi.start[1] = 319;
	}
}

/* ----------------------------------------------------------------------- */
/*
 * Local variables:
 * c-basic-offset: 8
 * End:
 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩亚洲欧美综合| 欧美视频日韩视频| 国产一区二区不卡在线| 天堂久久久久va久久久久| 亚洲香蕉伊在人在线观| 一级特黄大欧美久久久| 亚洲综合成人在线视频| 亚洲va韩国va欧美va精品| 日韩二区三区四区| 麻豆视频一区二区| 国产一区二区三区电影在线观看 | 国产成人精品亚洲日本在线桃色| 亚洲另类一区二区| 欧美国产在线观看| 日精品一区二区三区| 亚洲天天做日日做天天谢日日欢| 91丨九色porny丨蝌蚪| 国产午夜精品一区二区三区嫩草| 色噜噜狠狠成人中文综合| 在线日韩一区二区| 欧美日韩精品三区| 久久久久久97三级| 中文字幕一区二区不卡| 一卡二卡三卡日韩欧美| 免费久久99精品国产| 国产乱色国产精品免费视频| 99久久精品国产导航| 欧美久久久久中文字幕| 2021国产精品久久精品| 亚洲欧美激情在线| 麻豆国产一区二区| 99久久夜色精品国产网站| 欧美日韩免费电影| 国产欧美一区二区精品秋霞影院| 国产精品乱子久久久久| 日韩av中文字幕一区二区三区| 国产精品资源站在线| 91小宝寻花一区二区三区| 欧美精三区欧美精三区| 国产视频一区二区在线| 亚洲777理论| 国产黄色成人av| 欧美性极品少妇| 欧美国产一区视频在线观看| 日韩中文字幕一区二区三区| 国产成人综合在线播放| 欧美精品九九99久久| 国产精品全国免费观看高清| 亚洲成av人**亚洲成av**| 高清免费成人av| 精品福利一二区| 日韩av中文在线观看| 色婷婷综合激情| 国产精品免费观看视频| 久久er精品视频| 欧美挠脚心视频网站| 亚洲三级在线看| 成人一区二区三区| 久久一日本道色综合| 奇米精品一区二区三区在线观看| 在线观看www91| 自拍av一区二区三区| 成人免费观看av| 国产亚洲欧美日韩在线一区| 奇米一区二区三区| 欧美久久久久免费| 五月天久久比比资源色| 色偷偷成人一区二区三区91 | 国产黄色精品网站| 日韩欧美中文字幕精品| 天天综合日日夜夜精品| 欧美性大战xxxxx久久久| 亚洲精品国产第一综合99久久| 国产成人av福利| 日韩精品一区二区三区三区免费| 丝袜亚洲另类欧美综合| 欧美色图天堂网| 婷婷中文字幕一区三区| 欧美欧美欧美欧美首页| 青青草国产精品97视觉盛宴| 日韩视频一区二区三区 | 中文字幕一区视频| 99久久夜色精品国产网站| 中文字幕一区二区三区视频| fc2成人免费人成在线观看播放 | 日日夜夜免费精品| 欧美人与z0zoxxxx视频| 人妖欧美一区二区| 久久精品视频免费| 成人精品免费视频| 亚洲一区二区欧美日韩 | 久久亚洲精品小早川怜子| 久久99精品久久久久久国产越南 | 亚洲大片一区二区三区| 欧美日韩国产一级片| 免费视频最近日韩| 中文字幕乱码日本亚洲一区二区 | 波多野结衣欧美| 一区二区免费在线| 日韩三级视频在线观看| 国产传媒日韩欧美成人| 亚洲一区二区偷拍精品| 欧美日韩在线免费视频| 精品无码三级在线观看视频| 欧美激情中文不卡| 欧美美女一区二区三区| 国产美女娇喘av呻吟久久| 亚洲欧美日韩久久| 欧美大黄免费观看| 91捆绑美女网站| 老司机午夜精品| 最新高清无码专区| 欧美成人伊人久久综合网| 成人18视频日本| 麻豆91在线播放| 亚洲美女在线一区| 久久综合九色欧美综合狠狠| 在线亚洲高清视频| 国产激情偷乱视频一区二区三区| 夜夜嗨av一区二区三区| 国产亚洲一区字幕| 在线播放视频一区| 91理论电影在线观看| 国产乱码精品一区二区三 | 国内外精品视频| 亚洲综合激情另类小说区| 国产人妖乱国产精品人妖| 欧美日韩高清不卡| 91天堂素人约啪| 国产大陆亚洲精品国产| 日本成人中文字幕| 亚洲综合精品久久| 亚洲免费观看在线视频| 国产欧美一区二区三区沐欲| 日韩欧美二区三区| 在线不卡中文字幕| 色综合天天狠狠| av在线不卡网| 成人午夜私人影院| 国产在线一区观看| 韩国一区二区三区| 蜜桃免费网站一区二区三区| 亚洲国产一区二区视频| 亚洲欧美日韩国产另类专区| 国产精品久久久久三级| 国产视频一区不卡| 久久久久久久精| www国产成人| 精品国产91洋老外米糕| 日韩精品一区二区在线| xfplay精品久久| 久久精品人人做| 久久精品一二三| 国产精品丝袜在线| 国产精品伦理一区二区| 中文字幕在线不卡一区 | 欧亚洲嫩模精品一区三区| av动漫一区二区| 97久久精品人人澡人人爽| 91香蕉视频在线| 欧美日韩高清一区二区不卡 | www.色综合.com| 99久久久国产精品免费蜜臀| 色综合天天狠狠| 欧美日韩精品三区| 欧美精品 日韩| 欧美本精品男人aⅴ天堂| 久久久影视传媒| 综合久久久久久| 亚洲午夜电影在线观看| 日本不卡高清视频| 精品一区二区在线播放| 国产69精品久久99不卡| 91在线视频播放地址| 欧美日韩一区中文字幕| 日韩一区二区影院| 国产亚洲一区二区三区在线观看| 国产精品久久久久桃色tv| 亚洲国产aⅴ天堂久久| 国产永久精品大片wwwapp| 国产精品99久久久久久久女警| 成人在线视频一区二区| 欧美在线视频全部完| 精品少妇一区二区| 亚洲另类春色国产| 奇米777欧美一区二区| 成人国产电影网| 欧美一级片免费看| 中文字幕一区二区三中文字幕| 亚洲aⅴ怡春院| 99免费精品在线观看| 51精品秘密在线观看| 国产精品久久三| 免费人成黄页网站在线一区二区| 国产成a人亚洲精| 91精品国产综合久久蜜臀| 国产精品五月天| 麻豆国产欧美一区二区三区| 在线这里只有精品| 久久精品人人做|