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

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

?? ivtv-yuv.c

?? trident tm5600的linux驅動
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*    yuv support    Copyright (C) 2007  Ian Armstrong <ian@iarmst.demon.co.uk>    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "ivtv-driver.h"#include "ivtv-udma.h"#include "ivtv-yuv.h"/* YUV buffer offsets */const u32 yuv_offset[IVTV_YUV_BUFFERS] = {	0x001a8600,	0x00240400,	0x002d8200,	0x00370000,	0x00029000,	0x000C0E00,	0x006B0400,	0x00748200};static int ivtv_yuv_prep_user_dma(struct ivtv *itv, struct ivtv_user_dma *dma,				  struct ivtv_dma_frame *args){	struct ivtv_dma_page_info y_dma;	struct ivtv_dma_page_info uv_dma;	struct yuv_playback_info *yi = &itv->yuv_info;	u8 frame = yi->draw_frame;	struct yuv_frame_info *f = &yi->new_frame_info[frame];	int i;	int y_pages, uv_pages;	unsigned long y_buffer_offset, uv_buffer_offset;	int y_decode_height, uv_decode_height, y_size;	y_buffer_offset = IVTV_DECODER_OFFSET + yuv_offset[frame];	uv_buffer_offset = y_buffer_offset + IVTV_YUV_BUFFER_UV_OFFSET;	y_decode_height = uv_decode_height = f->src_h + f->src_y;	if (f->offset_y)		y_buffer_offset += 720 * 16;	if (y_decode_height & 15)		y_decode_height = (y_decode_height + 16) & ~15;	if (uv_decode_height & 31)		uv_decode_height = (uv_decode_height + 32) & ~31;	y_size = 720 * y_decode_height;	/* Still in USE */	if (dma->SG_length || dma->page_count) {		IVTV_DEBUG_WARN		    ("prep_user_dma: SG_length %d page_count %d still full?\n",		     dma->SG_length, dma->page_count);		return -EBUSY;	}	ivtv_udma_get_page_info (&y_dma, (unsigned long)args->y_source, 720 * y_decode_height);	ivtv_udma_get_page_info (&uv_dma, (unsigned long)args->uv_source, 360 * uv_decode_height);	/* Get user pages for DMA Xfer */	down_read(&current->mm->mmap_sem);	y_pages = get_user_pages(current, current->mm, y_dma.uaddr, y_dma.page_count, 0, 1, &dma->map[0], NULL);	uv_pages = get_user_pages(current, current->mm, uv_dma.uaddr, uv_dma.page_count, 0, 1, &dma->map[y_pages], NULL);	up_read(&current->mm->mmap_sem);	dma->page_count = y_dma.page_count + uv_dma.page_count;	if (y_pages + uv_pages != dma->page_count) {		IVTV_DEBUG_WARN		    ("failed to map user pages, returned %d instead of %d\n",		     y_pages + uv_pages, dma->page_count);		for (i = 0; i < dma->page_count; i++) {			put_page(dma->map[i]);		}		dma->page_count = 0;		return -EINVAL;	}	/* Fill & map SG List */	if (ivtv_udma_fill_sg_list (dma, &uv_dma, ivtv_udma_fill_sg_list (dma, &y_dma, 0)) < 0) {		IVTV_DEBUG_WARN("could not allocate bounce buffers for highmem userspace buffers\n");		for (i = 0; i < dma->page_count; i++) {			put_page(dma->map[i]);		}		dma->page_count = 0;		return -ENOMEM;	}	dma->SG_length = pci_map_sg(itv->dev, dma->SGlist, dma->page_count, PCI_DMA_TODEVICE);	/* Fill SG Array with new values */	ivtv_udma_fill_sg_array(dma, y_buffer_offset, uv_buffer_offset, y_size);	/* If we've offset the y plane, ensure top area is blanked */	if (f->offset_y && yi->blanking_dmaptr) {		dma->SGarray[dma->SG_length].size = cpu_to_le32(720*16);		dma->SGarray[dma->SG_length].src = cpu_to_le32(yi->blanking_dmaptr);		dma->SGarray[dma->SG_length].dst = cpu_to_le32(IVTV_DECODER_OFFSET + yuv_offset[frame]);		dma->SG_length++;	}	/* Tag SG Array with Interrupt Bit */	dma->SGarray[dma->SG_length - 1].size |= cpu_to_le32(0x80000000);	ivtv_udma_sync_for_device(itv);	return 0;}/* We rely on a table held in the firmware - Quick check. */int ivtv_yuv_filter_check(struct ivtv *itv){	int i, y, uv;	for (i = 0, y = 16, uv = 4; i < 16; i++, y += 24, uv += 12) {		if ((read_dec(IVTV_YUV_HORIZONTAL_FILTER_OFFSET + y) != i << 16) ||		    (read_dec(IVTV_YUV_VERTICAL_FILTER_OFFSET + uv) != i << 16)) {			IVTV_WARN ("YUV filter table not found in firmware.\n");			return -1;		}	}	return 0;}static void ivtv_yuv_filter(struct ivtv *itv, int h_filter, int v_filter_1, int v_filter_2){	u32 i, line;	/* If any filter is -1, then don't update it */	if (h_filter > -1) {		if (h_filter > 4)			h_filter = 4;		i = IVTV_YUV_HORIZONTAL_FILTER_OFFSET + (h_filter * 384);		for (line = 0; line < 16; line++) {			write_reg(read_dec(i), 0x02804);			write_reg(read_dec(i), 0x0281c);			i += 4;			write_reg(read_dec(i), 0x02808);			write_reg(read_dec(i), 0x02820);			i += 4;			write_reg(read_dec(i), 0x0280c);			write_reg(read_dec(i), 0x02824);			i += 4;			write_reg(read_dec(i), 0x02810);			write_reg(read_dec(i), 0x02828);			i += 4;			write_reg(read_dec(i), 0x02814);			write_reg(read_dec(i), 0x0282c);			i += 8;			write_reg(0, 0x02818);			write_reg(0, 0x02830);		}		IVTV_DEBUG_YUV("h_filter -> %d\n", h_filter);	}	if (v_filter_1 > -1) {		if (v_filter_1 > 4)			v_filter_1 = 4;		i = IVTV_YUV_VERTICAL_FILTER_OFFSET + (v_filter_1 * 192);		for (line = 0; line < 16; line++) {			write_reg(read_dec(i), 0x02900);			i += 4;			write_reg(read_dec(i), 0x02904);			i += 8;			write_reg(0, 0x02908);		}		IVTV_DEBUG_YUV("v_filter_1 -> %d\n", v_filter_1);	}	if (v_filter_2 > -1) {		if (v_filter_2 > 4)			v_filter_2 = 4;		i = IVTV_YUV_VERTICAL_FILTER_OFFSET + (v_filter_2 * 192);		for (line = 0; line < 16; line++) {			write_reg(read_dec(i), 0x0290c);			i += 4;			write_reg(read_dec(i), 0x02910);			i += 8;			write_reg(0, 0x02914);		}		IVTV_DEBUG_YUV("v_filter_2 -> %d\n", v_filter_2);	}}static void ivtv_yuv_handle_horizontal(struct ivtv *itv, struct yuv_frame_info *f){	struct yuv_playback_info *yi = &itv->yuv_info;	u32 reg_2834, reg_2838, reg_283c;	u32 reg_2844, reg_2854, reg_285c;	u32 reg_2864, reg_2874, reg_2890;	u32 reg_2870, reg_2870_base, reg_2870_offset;	int x_cutoff;	int h_filter;	u32 master_width;	IVTV_DEBUG_WARN	    ("Adjust to width %d src_w %d dst_w %d src_x %d dst_x %d\n",	     f->tru_w, f->src_w, f->dst_w, f->src_x, f->dst_x);	/* How wide is the src image */	x_cutoff = f->src_w + f->src_x;	/* Set the display width */	reg_2834 = f->dst_w;	reg_2838 = reg_2834;	/* Set the display position */	reg_2890 = f->dst_x;	/* Index into the image horizontally */	reg_2870 = 0;	/* 2870 is normally fudged to align video coords with osd coords.	   If running full screen, it causes an unwanted left shift	   Remove the fudge if we almost fill the screen.	   Gradually adjust the offset to avoid the video 'snapping'	   left/right if it gets dragged through this region.	   Only do this if osd is full width. */	if (f->vis_w == 720) {		if ((f->tru_x - f->pan_x > -1) && (f->tru_x - f->pan_x <= 40) && (f->dst_w >= 680))			reg_2870 = 10 - (f->tru_x - f->pan_x) / 4;		else if ((f->tru_x - f->pan_x < 0) && (f->tru_x - f->pan_x >= -20) && (f->dst_w >= 660))			reg_2870 = (10 + (f->tru_x - f->pan_x) / 2);		if (f->dst_w >= f->src_w)			reg_2870 = reg_2870 << 16 | reg_2870;		else			reg_2870 = ((reg_2870 & ~1) << 15) | (reg_2870 & ~1);	}	if (f->dst_w < f->src_w)		reg_2870 = 0x000d000e - reg_2870;	else		reg_2870 = 0x0012000e - reg_2870;	/* We're also using 2870 to shift the image left (src_x & negative dst_x) */	reg_2870_offset = (f->src_x * ((f->dst_w << 21) / f->src_w)) >> 19;	if (f->dst_w >= f->src_w) {		x_cutoff &= ~1;		master_width = (f->src_w * 0x00200000) / (f->dst_w);		if (master_width * f->dst_w != f->src_w * 0x00200000)			master_width++;		reg_2834 = (reg_2834 << 16) | x_cutoff;		reg_2838 = (reg_2838 << 16) | x_cutoff;		reg_283c = master_width >> 2;		reg_2844 = master_width >> 2;		reg_2854 = master_width;		reg_285c = master_width >> 1;		reg_2864 = master_width >> 1;		/* We also need to factor in the scaling		   (src_w - dst_w) / (src_w / 4) */		if (f->dst_w > f->src_w)			reg_2870_base = ((f->dst_w - f->src_w)<<16) / (f->src_w <<14);		else			reg_2870_base = 0;		reg_2870 += (((reg_2870_offset << 14) & 0xFFFF0000) | reg_2870_offset >> 2) + (reg_2870_base << 17 | reg_2870_base);		reg_2874 = 0;	} else if (f->dst_w < f->src_w / 2) {		master_width = (f->src_w * 0x00080000) / f->dst_w;		if (master_width * f->dst_w != f->src_w * 0x00080000)			master_width++;		reg_2834 = (reg_2834 << 16) | x_cutoff;		reg_2838 = (reg_2838 << 16) | x_cutoff;		reg_283c = master_width >> 2;		reg_2844 = master_width >> 1;		reg_2854 = master_width;		reg_285c = master_width >> 1;		reg_2864 = master_width >> 1;		reg_2870 += ((reg_2870_offset << 15) & 0xFFFF0000) | reg_2870_offset;		reg_2870 += (5 - (((f->src_w + f->src_w / 2) - 1) / f->dst_w)) << 16;		reg_2874 = 0x00000012;	} else {		master_width = (f->src_w * 0x00100000) / f->dst_w;		if (master_width * f->dst_w != f->src_w * 0x00100000)			master_width++;		reg_2834 = (reg_2834 << 16) | x_cutoff;		reg_2838 = (reg_2838 << 16) | x_cutoff;		reg_283c = master_width >> 2;		reg_2844 = master_width >> 1;		reg_2854 = master_width;		reg_285c = master_width >> 1;		reg_2864 = master_width >> 1;		reg_2870 += ((reg_2870_offset << 14) & 0xFFFF0000) | reg_2870_offset >> 1;		reg_2870 += (5 - (((f->src_w * 3) - 1) / f->dst_w)) << 16;		reg_2874 = 0x00000001;	}	/* Select the horizontal filter */	if (f->src_w == f->dst_w) {		/* An exact size match uses filter 0 */		h_filter = 0;	} else {		/* Figure out which filter to use */		h_filter = ((f->src_w << 16) / f->dst_w) >> 15;		h_filter = (h_filter >> 1) + (h_filter & 1);		/* Only an exact size match can use filter 0 */		h_filter += !h_filter;	}	write_reg(reg_2834, 0x02834);	write_reg(reg_2838, 0x02838);	IVTV_DEBUG_YUV("Update reg 0x2834 %08x->%08x 0x2838 %08x->%08x\n",		       yi->reg_2834, reg_2834, yi->reg_2838, reg_2838);	write_reg(reg_283c, 0x0283c);	write_reg(reg_2844, 0x02844);	IVTV_DEBUG_YUV("Update reg 0x283c %08x->%08x 0x2844 %08x->%08x\n",		       yi->reg_283c, reg_283c, yi->reg_2844, reg_2844);	write_reg(0x00080514, 0x02840);	write_reg(0x00100514, 0x02848);	IVTV_DEBUG_YUV("Update reg 0x2840 %08x->%08x 0x2848 %08x->%08x\n",		       yi->reg_2840, 0x00080514, yi->reg_2848, 0x00100514);	write_reg(reg_2854, 0x02854);	IVTV_DEBUG_YUV("Update reg 0x2854 %08x->%08x \n",		       yi->reg_2854, reg_2854);	write_reg(reg_285c, 0x0285c);	write_reg(reg_2864, 0x02864);	IVTV_DEBUG_YUV("Update reg 0x285c %08x->%08x 0x2864 %08x->%08x\n",		       yi->reg_285c, reg_285c, yi->reg_2864, reg_2864);	write_reg(reg_2874, 0x02874);	IVTV_DEBUG_YUV("Update reg 0x2874 %08x->%08x\n",		       yi->reg_2874, reg_2874);	write_reg(reg_2870, 0x02870);	IVTV_DEBUG_YUV("Update reg 0x2870 %08x->%08x\n",		       yi->reg_2870, reg_2870);	write_reg(reg_2890, 0x02890);	IVTV_DEBUG_YUV("Update reg 0x2890 %08x->%08x\n",		       yi->reg_2890, reg_2890);	/* Only update the filter if we really need to */	if (h_filter != yi->h_filter) {		ivtv_yuv_filter(itv, h_filter, -1, -1);		yi->h_filter = h_filter;	}}static void ivtv_yuv_handle_vertical(struct ivtv *itv, struct yuv_frame_info *f){	struct yuv_playback_info *yi = &itv->yuv_info;	u32 master_height;	u32 reg_2918, reg_291c, reg_2920, reg_2928;	u32 reg_2930, reg_2934, reg_293c;	u32 reg_2940, reg_2944, reg_294c;	u32 reg_2950, reg_2954, reg_2958, reg_295c;	u32 reg_2960, reg_2964, reg_2968, reg_296c;	u32 reg_289c;	u32 src_major_y, src_minor_y;	u32 src_major_uv, src_minor_uv;	u32 reg_2964_base, reg_2968_base;	int v_filter_1, v_filter_2;	IVTV_DEBUG_WARN	    ("Adjust to height %d src_h %d dst_h %d src_y %d dst_y %d\n",	     f->tru_h, f->src_h, f->dst_h, f->src_y, f->dst_y);	/* What scaling mode is being used... */	IVTV_DEBUG_YUV("Scaling mode Y: %s\n",		       f->interlaced_y ? "Interlaced" : "Progressive");	IVTV_DEBUG_YUV("Scaling mode UV: %s\n",		       f->interlaced_uv ? "Interlaced" : "Progressive");	/* What is the source video being treated as... */	IVTV_DEBUG_WARN("Source video: %s\n",			f->interlaced ? "Interlaced" : "Progressive");	/* We offset into the image using two different index methods, so split	   the y source coord into two parts. */	if (f->src_y < 8) {		src_minor_uv = f->src_y;		src_major_uv = 0;	} else {		src_minor_uv = 8;		src_major_uv = f->src_y - 8;	}	src_minor_y = src_minor_uv;	src_major_y = src_major_uv;	if (f->offset_y)		src_minor_y += 16;	if (f->interlaced_y)		reg_2918 = (f->dst_h << 16) | (f->src_h + src_minor_y);	else		reg_2918 = (f->dst_h << 16) | ((f->src_h + src_minor_y) << 1);	if (f->interlaced_uv)		reg_291c = (f->dst_h << 16) | ((f->src_h + src_minor_uv) >> 1);	else		reg_291c = (f->dst_h << 16) | (f->src_h + src_minor_uv);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产乱码字幕精品高清av| 亚洲欧美另类久久久精品2019| 欧美又粗又大又爽| www.欧美日韩| 色综合久久综合| 色激情天天射综合网| 日本高清不卡在线观看| 欧美午夜片在线看| 7878成人国产在线观看| 精品国产人成亚洲区| 精品久久久久久亚洲综合网| 久久奇米777| 亚洲免费观看高清在线观看| 亚洲国产三级在线| 久久99久久99精品免视看婷婷| 国产精品中文欧美| 色综合夜色一区| 欧美一区二区在线免费播放| 久久蜜臀精品av| 综合精品久久久| 日韩激情一二三区| 国产福利精品一区| 欧美日精品一区视频| 日韩精品一区二区三区蜜臀| 中文文精品字幕一区二区| 一区二区理论电影在线观看| 视频一区免费在线观看| 国产精品12区| 欧美性xxxxxx少妇| 久久精品欧美日韩| 亚洲在线一区二区三区| 国产精品一区久久久久| 欧美怡红院视频| 欧美国产精品中文字幕| 日本免费在线视频不卡一不卡二| 国产91丝袜在线观看| 欧美一级国产精品| 伊人性伊人情综合网| 国产一区不卡视频| 91精品国产综合久久久久| 中文字幕乱码亚洲精品一区| 午夜亚洲福利老司机| 91蝌蚪porny九色| 国产午夜精品一区二区三区视频 | 欧美一级日韩免费不卡| 中文字幕乱码日本亚洲一区二区| 日韩精品五月天| 波多野结衣中文字幕一区| 精品久久久久久久一区二区蜜臀| 一区二区三区在线免费视频| 粉嫩嫩av羞羞动漫久久久| 日韩欧美成人一区| 午夜精品久久久久| 在线免费视频一区二区| ...xxx性欧美| 国产99久久久国产精品免费看 | 成人免费毛片片v| 欧美一级高清片| 一区二区三区欧美日| av电影一区二区| 国产日韩欧美综合在线| 狠狠色丁香婷综合久久| 精品伦理精品一区| 日本午夜一区二区| 欧美一卡二卡三卡四卡| 天天做天天摸天天爽国产一区| 欧美做爰猛烈大尺度电影无法无天| 中文字幕乱码日本亚洲一区二区| 国产精品一区二区91| xvideos.蜜桃一区二区| 精品一区二区三区香蕉蜜桃 | 亚洲综合视频在线| 色综合激情五月| 亚洲一区免费观看| 欧美高清视频一二三区| 青娱乐精品视频在线| 日韩一区二区在线播放| 伦理电影国产精品| 久久久久久久电影| 国产91丝袜在线18| 亚洲欧美在线视频观看| 在线观看中文字幕不卡| 亚洲成人av在线电影| 欧美一区二区大片| 精品系列免费在线观看| 国产日韩欧美电影| av爱爱亚洲一区| 亚洲午夜在线电影| 欧美一区二区视频免费观看| 久久99精品国产.久久久久| 欧美激情一区在线观看| 91久久精品网| 免费成人在线视频观看| 欧美国产日韩亚洲一区| 欧美色图一区二区三区| 精品在线免费视频| 亚洲女子a中天字幕| 在线综合亚洲欧美在线视频| 国产精品18久久久久| 亚洲一区影音先锋| 国产调教视频一区| 欧美视频一区二区三区在线观看| 麻豆国产91在线播放| 1区2区3区精品视频| 欧美日韩免费一区二区三区视频| 久久99久久99| 一级中文字幕一区二区| 欧美精品一区二区高清在线观看| 成人av免费在线播放| 免费在线看一区| 亚洲免费在线观看| 久久色.com| 91精品午夜视频| 色88888久久久久久影院野外| 美国精品在线观看| 一区二区理论电影在线观看| 久久精品一区二区三区不卡 | 六月丁香婷婷色狠狠久久| 国产精品久久影院| 精品福利二区三区| 欧美日韩国产综合一区二区| 成人免费三级在线| 国产在线国偷精品产拍免费yy | 日韩精品一区二区三区swag | 成人免费看片app下载| 日韩中文字幕亚洲一区二区va在线 | 成人黄色一级视频| 久久国产人妖系列| 天堂一区二区在线| 亚洲综合色视频| 国产精品国产三级国产普通话蜜臀| 日韩情涩欧美日韩视频| 欧美日韩性生活| 欧美亚洲高清一区二区三区不卡| 成人一区二区三区| 国产精品综合av一区二区国产馆| 青椒成人免费视频| 亚洲一区二区视频在线观看| 国产精品久久福利| 日本一区二区免费在线| 久久嫩草精品久久久精品| 欧美mv日韩mv| 欧美电影免费观看高清完整版在线观看| 在线观看日韩电影| 91麻豆免费看| 色综合久久综合网97色综合| 99国内精品久久| 99国产一区二区三精品乱码| 成人激情开心网| av午夜一区麻豆| 91老师国产黑色丝袜在线| 日本高清无吗v一区| 在线观看国产91| 欧美老女人在线| 日韩欧美美女一区二区三区| 欧美成人性战久久| 亚洲精品一区二区精华| 久久久久久97三级| 中文字幕一区二区日韩精品绯色| 久久久久久久久一| 国产精品嫩草影院com| 国产人成亚洲第一网站在线播放| 国产日韩视频一区二区三区| 国产精品进线69影院| 亚洲人成精品久久久久久| 亚洲制服欧美中文字幕中文字幕| 日韩国产欧美一区二区三区| 免费成人在线观看| 国产成人在线视频免费播放| 成人开心网精品视频| 色噜噜狠狠色综合中国| 91精品麻豆日日躁夜夜躁| 久久亚洲捆绑美女| 国产精品久久国产精麻豆99网站| 一区二区三区久久| 亚洲成av人片一区二区梦乃| 免费观看久久久4p| 成人国产电影网| 欧美无人高清视频在线观看| 欧美大片在线观看一区| 中文字幕不卡在线播放| 亚洲国产人成综合网站| 国内精品嫩模私拍在线| 97久久久精品综合88久久| 日韩亚洲欧美高清| 1000精品久久久久久久久| 青娱乐精品在线视频| 99久久伊人网影院| 91.com在线观看| 亚洲欧洲无码一区二区三区| 日本aⅴ亚洲精品中文乱码| 成人免费视频视频| 精品国产第一区二区三区观看体验| 伊人色综合久久天天| 久久电影网电视剧免费观看| 在线精品视频免费观看| 国产午夜精品一区二区三区四区| 亚洲1区2区3区4区| 91视频国产观看| 久久久久久久久久电影|